どうあがいても接続できなくて困った。

どうやらなんか Google Chrome が USB デバイスをかたっぱしからオープンする挙動をしているようで、busy 状態になっているようだった。libusb 関係のなにかなのかもしれない。

EOS Utility 3@(null): AppleUSBHostUserClient::openGated: failed to open Canon Digital Camera@01100000: provider is already opened for exclusive access by pid 602, Google Chrome

Console.app で検索かけていたら以上のエラーログが見れたので原因がわかったけど、わかりにくすぎる

ptpcamerad も変な挙動をしていてカメラが繋がらなくなる。強制的に終了しても起動してくるのでやっかい

EOS Utility 3@(null): AppleUSBHostUserClient::openGated: failed to open IOUSBHostInterface@0: provider is already opened for exclusive access by pid 17290, ptpcamerad

止めた。

sudo launchctl unload /System/Library/LaunchAgents/com.apple.ptpcamerad.plist
sudo launchctl disable gui/501/com.apple.ptpcamerad

ref

  1. トップ
  2. tech
  3. macOS の EOS Utility 「カメラとUSB接続できませんでした」

たびたび transix の IPv4 のポート制限(1024)にひっかかって、そのたびにAFTRを切り替えていたけど、ふと思いついてトンネルを2つ貼って、ロードバランスして2048上限になるようにしてみた。

これでまだ上限あたるようだとほんとにお手上げなんだけど、なんかもっといい方法ないんかな~

ip route default gateway tunnel 1 gateway tunnel 2
tunnel select 1
 tunnel encapsulation ipip
 tunnel endpoint address 2404:8e00::feed:100
 ip tunnel mtu 1460
 ip tunnel secure filter in 1020 1030 2000
 ip tunnel secure filter out 1010 1011 1012 1013 1014 1015 3000 dynamic 100 101
 102 103 104 105 106 107
 ip tunnel tcp mss limit auto
 tunnel enable 1
tunnel select 2
 tunnel encapsulation ipip
 tunnel endpoint address 2404:8e00::feed:101
 ip tunnel mtu 1460
 ip tunnel secure filter in 1020 1030 2000
 ip tunnel secure filter out 1010 1011 1012 1013 1014 1015 3000 dynamic 100 101
 102 103 104 105 106 107
 ip tunnel tcp mss limit auto
 tunnel enable 2

RTX1200 は「ポートセービングIPマスカレード」とよばれるのはできないらしい。ルーター自体あたらしくして、有効にできたらもうちょっと余裕でるかもだけど、ポートセービングIPマスカレードもTCPにしか適用されないので、どれぐらい効果あるものなのかよくわからない。

  1. トップ
  2. tech
  3. transix AFTR のロードバランス

UPF

UPF は衣類に使われる。UPF50 の意味は紫外線の影響を1/50にするという意味

なので紫外線遮蔽率に換算できる (1 - 1/UPF)

UPF 50の場合、(1 - 1/50) = 98%

SPF / PA

SPF は UV-B、PA は UV-A に対する指標ということになっている。

SPFとPAは基本的にはなんと人体実験によって測定されている。
(一応分光による評価するシステムもあるらしい
https://www.jasco.co.jp/jpn/technique/applicationdata/UV/130-UV-0041.html )

SPF値は、その値を示す日焼け止め化粧品を塗って紫外線を浴びた場合に、何も塗らなかった時と同程度に赤い日焼け(サンバーン、紅斑)を起こすまでにかかる時間の倍率を示しています。例えば、SPF25の日焼け止めクリームを塗ると、素肌と同程度の紅斑を起こすには25倍の時間がかかることを意味しています。

一方PA値は、黒い日焼け(サンタン)を対象としており、何も塗らなかった時と同程度のサンタンを起こす時間の倍率の数値がPA≦2ならばPA、PA=4~8ならばPA++と記号で格付けされます。

これらSPF値やPA値の評価方法は、ISO-24442やISO-24444を元に日本化粧品工業連合会で規定されており、1cm2当たりに2mgまたは2µLの試料を被験者の皮膚に塗布して人工太陽灯による照射を行い、塗布した場所としない場所の最小紅化時間を測定します。しかし、この試験は研究開発段階で行うにはコストがかかり、被験者の個人差も現れます。

PA+ : PPD値が2以上4未満
PA++ : PPD値が4以上8未満
PA+++ : PPD値が8以上16未満
PA++++ : PPD値が16以上

PAは一度PPD値という数値から変換されて謎の指標になる。PPDとSPFの数値の意味はUPFと同じように影響を1/nにするということなので、波長ごとの遮蔽率とみることができる(はず)

たとえば

  • SPF50
  • PA+++

なら SPF50 = UV-B を 98%カット、PA+++ = UV-A を 88%~94% カット という換算が一応できる (はず?)

  1. トップ
  2. tech
  3. 紫外線遮蔽率とUPFとSPF、PA

ねこみみ演算子で検索するとものすごい古いエントリがヒットしてなおかつ内容がネコ演算子に関係するものではないという問題がある。

今思いだそうとしても、ねこみみ演算子ってなんだっけ?と思ったので記録しとく

ネコ演算子

そもそもねこみみ演算子というのは(たぶん)なくて、ネコ演算子のことだと思う。

Perl6 の ^..^ オペレータのことを Neko Operator と呼んでいたという記録が2005年8月

範囲演算子
末尾を含まない「..^」(Rubyの「...」)、先頭を含まない「^..」、 先頭と末尾を含まない「^..^」。Damianはこれを「Neko operator」と呼んでいた。 2ちゃんかっつーの。

https://matz.rubyist.net/20050803.html#p02

Perl6 は Raku と名前をかえてリリースされたけどネコ演算子は現存している Raku Operators

  1. トップ
  2. tech
  3. ネコ演算子 (ねこみみ演算子) とは

追記: 今はショート動画をPCからアップロードした場合、モバイルの編集画面からショート動画のサムネイルを設定できるようになっている。
このため、いちいちモバイルYouTubeを使ってアップロードする必要ない

以下のようにすれば良い。タイムコードが入っている動画ファイルはYouTubeアプリでは開けないらしい (Google Photos などでは普通に開ける)

ffmpeg -i '/mnt/c/Users/cho45/Desktop/doremi.mp4' -c:a copy -c:v copy -write_tmcd 0 '/mnt/c/Users/cho45/Desktop/doremi-removed-tmcd.mp4'

なんでPCからアップロードしないの?


PCからショート動画をアップロードする場合、なぜかサムネイルを指定できないという大きな欠点がある。なのでサムネイルが適切に設定されない場合、モバイル版の YouTube アプリを使ってアップロードする必要がある。

他の方法は?

Google Photos では開けるので、Google Photos で開いて、コントラストを1だけ変更したりなんでもいいのでちょっと編集して「コピーを保存」すれば YouTube で開ける動画にはなる。うまくはいくけど再エンコード走るのでだるい。

参考

日本語ではどうしても解決せず「android youtube unable to preview」で解決

ref.

  1. トップ
  2. tech
  3. DaVinci Resolve で作成した動画を Android YouTube でアップロードしようとすると「動画をプレビューできません」となる

症状としては

  • ファイル転送 / Android Auto モードで USB 接続し
  • Windows Explorer からコピーしたいデバイスのフォルダを開き
  • ほとんどのファイルのコピーは成功するが (jpg や txt など)
  • mp4 ファイルだけ転送することができない
  • エラーの表示などはまったくないが Explorer からエラー音はなる
  • 転送できないファイルを .txt に拡張子をかえると、コピーダイアログまでは出るようになるが、やはりコピーはできない

どうあがいても無理。MTP など他のモードでも無理。Android のファイル転送モードはやたら遅くて、なんか変な制御がかかっているんだろうけど、挙動がおかしすぎるのでできるだけ使わないほうが良い……

他の解決方法: Google クイック共有 / Quick Share / 旧ニアバイシェア

たぶん代替としてはこれが一番簡単かつ最速
https://support.google.com/android/answer/9286773?hl=ja

他の解決方法: Google Drive 経由

次点で間違いなく解決はできるがめんどくさい + Google Drive に保存する必要がなくても、一時的に保存する必要がある

  1. トップ
  2. tech
  3. Android と USB 接続したとき、どうあがいても一部のファイルを転送できない

基本的に毎回 (嫌々だけど) バリウムじゃなくて胃カメラ・上部内視鏡を選択していて、かつ2021年からは鎮静剤も使うようにお願いしている。健康診断自体は会社でうけてるやつだけど、内視鏡+鎮静剤でオプション代が15000円ぐらいの課金アイテムになってる。

鎮静剤をお願いしはじめてからはじめて、やってる途中 (喉を通過したあと) に若干意識が覚醒して、そのときのことを曖昧ながら覚えているという状況になった。いつもやってる医師と違うので、鎮静剤の量とか手技の精度とかでそうなったのかもしれない。

というかミダゾラム (ドルミカム 4.5mg と書いてあった) という鎮静剤を使っているみたいだけど、この薬は効いている間の記憶がかなり飛ぶらしい。なので今までも覚えていないだけで辛かったのかもしれない。その瞬間辛くても辛い記憶が飛ぶというのは素晴しいことなのだな。我々は記憶の中の辛さに生きているのだ。

とりあえず、今回は若干つらかった記憶が残っている。けど、無鎮静でやったときの辛さとは比べものにならないのでやはり鎮静剤ありを選ぶと思う。結果は去年より綺麗だった。なんでかはよくわからない。

あとの検査はなんかオマケって感じ。

肺活量検査が2回目で「前回数値より良いです!」と言われたけど、あれはなんかやりかたを理解するのに何回かやらないとダメなんだと思う。

全然日記書いてないことに気付いた。毎日なんかしらやってはいるけど、どうも書くモチベがかなり失われている。

面白いと思っていた人たちはいろんなSNSに散らばったり、あるいはポジショントークしかしなくなったり、あるいは……って感じで、自動的に入ってくるおもしろ情報というのがなかなか、なくなってしまった。インプットが減ってアウトプットも減ってるのだろうか? そもそもテイカーおじか???

今はフィードをつかってブログ見てる人なんてほとんどいないんじゃないか?

サブテク入りたい

だいぶ前にゆの in languageとかいうのをやってたなと思い返していたけど、ほとんど当時のリソースにアクセスできず何があったのかわからくなっていた。なんかゆるく知らん人同士で流行った楽しさがあったけど、そういうのって今はないなと思う。

テクいこと

技術的にどうこうっていうのも、最近ぱっとしない。ディープラーニングも最近はなんかやりたいことがなくてやってない。画像生成も夏にやるには罪悪感があってあまりやってない。

まったく趣味コード書いてないかというとそういうわけではない。配信用のペライチHTML+JSでOBS操作して喜んだりはしてる。自分が喜ぶすごく小さいツールを作るのはあいかわらず楽しいと感じる。

仕事はなんか、、、、

ウェブ系のITエンジニアはたいしたスキルセットもないのに恵まれすぎ、という話をみて、そうですねと思う。そして恵まれてても、うまくそれをこなせない自分というのが厳しい。なんか昨今のITエンジニアみんな優等生だもんな~ 居場所ないのあたりまえだわ~ 今の勤め先の採用過程を今やったら通らないだろう。そういう意味ではもはや既得権益おじといえる。

しばらく仕事で K8S さわってて、4割ぐらいはK8Sと和解してるけど、6割ぐらいは馴染んでない。コンテナとも8割ぐらいしか和解できてない。個人的に使うことがない技術スタックに強い興味が持てない。とかいいつつ、うまいことコンテナまわり整備したり、GitHub Actions でリリースプロセスいい感じにしたりとか、そういうの いじってるのは楽しいんだよな。

動画

だいぶ前から YouTube にチマチマ動画あげたりはしてるけど、マスにリーチしようがないコンテンツしか思いつかないし、動画作るというのが自分にとってはあまりに大変すぎて続いてはいなかった。

ただ最近、なんとなく上げたショート動画が急に400万再生ぐらいされたのをきっかけにして、また動画を作ってみてる。

いろいろ動画の作りかたを変えてやってみてる。自分にとって楽かつ、動画にして意味があるみたいな方法があればいいんだけど

  • スライド作って話すだけ
    • Pros 比較的慣れた形式なので楽 (うまくできるとはいってない)
    • Cons 喋るの下手で動画としてつまらない
  • 素材録りながら喋る
    • Pros 動画としては見栄えする
    • Cons セッティング大変。録るのも大変。なんか生でもないのに緊張してしまう
  • とりあえず録画しておく。アフレコでなんとかする
    • Pros ↑ よりは楽
    • Cons セッティングは大変
  • 素材+音声合成
    • Pros アフレコもプレスコも楽。キモい声を聞きながら編集しなくていい。基本的に耳に慣れてて聞きとりやすい。ずんだもん可愛い
    • Cons 量産型動画にしかみえない

ギター

とにかく基礎練習だけは毎日やってて、証拠残しと思ってこれはYouTubeで配信を残してる。ぜんぜん上達している感じがしなくて、ミスが減らない。前まで練習してた曲もちょっと練習しないだけで忘れていくし身になっているものがないように感じてつらい。

motemen さんの ターミナルの作業中ディレクトリにOSの「ファイルを開く」からもアクセスしたい を見ていいなと思ったので自分もやってみた。ただ、WSL 内で動く tmux の作業ディレクトリを Windows 側に同期したいので、若干ややこしいことをすることになる。

以下のように wsl-update-cwds をつくる。

#!/usr/bin/env ruby

is_wsl = ENV.has_key?('WSLENV')
if !is_wsl
    exit 0
end

# PWSH = '/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe'
PWSH = '/mnt/c/Program Files/PowerShell/7/pwsh.exe'

dirs = `tmux list-windows -F '\#{pane_current_path}'`.split("\n").uniq

command = <<~CMD
$WshShell = New-Object -COMObject WScript.Shell
function Create-Shortcut($targetPath, $shortcutPath) {
	$Shortcut = $WshShell.CreateShortcut($shortcutPath)
	$Shortcut.TargetPath = $targetPath
	$Shortcut.Save()
}

Remove-Item -Path $env:USERPROFILE/cwds/*.lnk
CMD
dirs.each do |dir|
    basename =  File.basename(dir)
    win_path = `wslpath -aw '#{dir}'`.chomp
    command << "Create-Shortcut '#{win_path}' $env:USERPROFILE/cwds/#{basename}.lnk\n"
end

# Since pwsh takes a bit of time to start up, run it asynchronously using spawn.
pid = spawn(PWSH, '-NoProfile', '-NoLogo', '-Command', command)
  1. tmux から作業ディレクトリをひっぱってくる
  2. wslpath コマンドで Windows 側のパスに変換する
  3. ↑の情報から PowerShell のコードを生成し、pwsh でショートカットとして生成する

なんでショートカットなのか? というと Junction だと UNC パスにリンクを貼れず、Symlink だと管理者権限が必要になって嫌なので、ほかに方法がない。

あとは zsh の chpwd フックで実行させる。WSLENV 環境変数を見て、存在しないなら実行しないように

chpwd () {
	if [[ -n "${WSLENV+x}" ]]; then
		# in WSL
		$HOME/dotfiles/bin/wsl-update-cwds
	fi
}
  1. トップ
  2. tech
  3. (zsh/tmux/WSL) ターミナルの作業中ディレクトリにOSの「ファイルを開く」からもアクセスしたい

外で保管しているクロスバイクのタイヤが、だいぶ劣化してしまって不安なので交換した。バーテープも同時に交換

パナレーサー クリンチャー タイヤ [700×25C] クローザープラス F725-CLSP-W-2P ホワイト (ロードバイク クロスバイク/ロードレース 通勤 ツーリング用) 簡易包装2本入り 白ライン - パナレーサー(Panaracer)

パナレーサー(Panaracer)

3.0 / 5.0

チューブは交換しなくてもいいかと思ったけど、タイヤに貼りついてしまってとれなかった。無理にとって再利用もこわいので予備のものに交換した。

一応バックアップ

sudo parted -l
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 107GB
Sector size (logical/physical): 512B/512B                                                                                                                                                                                                                                     Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name              Flags                                                                                                                                                                                                        1      1049kB  51.5GB  51.5GB  ext4            Linux filesystem
 2      51.5GB  53.7GB  2145MB  linux-swap(v1)  Linux swap
 3      53.7GB  107GB   53.7GB  ext4            Linux filesystem


Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  982M     0  982M   0% /dev
tmpfs          tmpfs     200M   24M  177M  12% /run
/dev/vda1      ext4       48G   18G   28G  40% /
tmpfs          tmpfs    1000M     0 1000M   0% /dev/shm
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs          tmpfs    1000M     0 1000M   0% /sys/fs/cgroup
/dev/vda3      ext4       50G   17G   31G  36% /data
tmpfs          tmpfs     200M     0  200M   0% /run/user/1000

cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/vda1 during installation
UUID=bec2c6ce-a9f5-4ebf-a264-065bcd55f2d4 /               ext4    errors=remount-ro 0       1
# swap was on /dev/vda5 during installation
UUID=8efef618-8831-4075-aae1-1d95730b25e8 none            swap    sw              0       0
UUID=f1304b76-c52f-41c5-9770-f8fadcf2f2d8 /data  ext4  defaults 0 2


 swapon -s
Filename                                Type            Size    Used    Priority
/dev/vda2                               partition       2095100 2094876 -1


sudo blkid
/dev/vda3: UUID="f1304b76-c52f-41c5-9770-f8fadcf2f2d8" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="0b483f43-b168-4a48-bc64-13428db0f42b"
/dev/vda2: UUID="8efef618-8831-4075-aae1-1d95730b25e8" TYPE="swap" PARTLABEL="Linux swap" PARTUUID="707f15c7-5c40-4501-949c-218fd115e7d9"
/dev/vda1: UUID="bec2c6ce-a9f5-4ebf-a264-065bcd55f2d4" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="dae9a827-082d-4aad-9438-f2da8cc6f62c"
ssh cho45@stfuawsc.com -C -t 'sudo dump -0u -f - /dev/vda1' > sakura-dev-vda1.dump
ssh cho45@stfuawsc.com -C -t 'sudo dump -0u -f - /dev/vda3' > sakura-dev-vda3.dump

upgrade後

h2o の再ビルド再インストール (libc の更新による)
perl 関係

  • DBD::mysql
  • cpanm install Crypt::OpenSSL::Random

rabitmq-server
mqtt proxy として使ってるが、再インストールして設定しなおした。

  1. トップ
  2. tech
  3. Ubuntu LTS 16 → 18 → 20

こうする

async function loadAsImage(svg) {
	return new Promise((resolve, reject) => {
		const svgXml = new XMLSerializer().serializeToString(svg);

		const blob = new Blob([svgXml], { type: 'image/svg+xml' });
		const url = URL.createObjectURL(blob);

		const img = new Image();
		img.onload = () => {
			URL.revokeObjectURL(url);
			resolve(img);
		};
		img.onerror = (e) => {
			URL.revokeObjectURL(url);
			reject(e);
		};
		img.src = url;
		console.log(url);
	});
}

const img = await loadAsImage(svg);
ctx.drawImage(img, 0, 0);

ポイント

XMLSerializer を使っているところ。svg.outerHTML だと HTML 的に解釈された svg なので、xmlns が入らず、単体の SVG としては正しくないものになっている。

ただ、ブラウザ自体は HTML の svg が xmlns を持っていることは知っているため、XMLSerializer を使うことで正しい svg にできる。

  1. トップ
  2. tech
  3. HTML5 の svg 要素 を canvas に描く方法