追記

野良犬日記 2.1

RDF/RSS
この日記の検索

最近のツッコミ:


2025-08-15 (Fri) [長年日記]

_ [android]compileSdk is deprecated

Android Studio を更新したら build.gradle の compileSdk が deprecated って言われたから、「じゃあ消せばいいのかな」と思ったがそうでもなくて

 compileSdk 36

 compileSdk = 36

にすればいいみたい

Not targeting the latest versions of Android; compatibility modes apply.

 targetSdk 35

はまた別で、

 Target SDK attribute is not targeting latest version

って言われるけど、言われるまま 36 にすると今度は 「Tools の Android SDK Upgrade Assistant を使わずに targetSdk だけ変えましたね?」と叱られる

しかし SDK Upgrade Assistant にはまだ 36 へのアップグレード経路がない

だから現時点では 35 で放っておくのが正解みたい


2025-03-03 (Mon) [長年日記]

_ [mac] Karabiner-Elements でトラックボールも便利に

Karabiner-Elements で button5 を

  • クリックは button1 クリック
  • 長押しはシフト長押し

にする設定はこんな感じになりそう

 {
   "description": "button5 to button1 or shift",
   "manipulators": [
       {
           "from": {
               "modifiers": { "optional": ["any"] },
               "pointing_button": "button5"
           },
           "parameters": {
               "basic.to_delayed_action_delay_milliseconds": 100,
               "basic.to_if_held_down_threshold_milliseconds": 100
           },
           "to": { "key_code": "right_shift" },
           "to_after_key_up": [
               { "sticky_modifier": { "right_shift": "off" } },
               {
                   "set_variable": {
                       "name": "shift",
                       "value": false
                   }
               }
           ],
           "to_delayed_action": {
               "to_if_canceled": {
                   "conditions": [
                       {
                           "name": "shift",
                           "type": "variable_unless",
                           "value": true
                       }
                   ],
                   "pointing_button": "button1"
               },
               "to_if_invoked": {
                   "conditions": [
                       {
                           "name": "shift",
                           "type": "variable_unless",
                           "value": true
                       }
                   ],
                   "pointing_button": "button1"
               }
           },
           "to_if_held_down": [
               { "sticky_modifier": { "right_shift": "on" } },
               {
                   "set_variable": {
                       "name": "shift",
                       "value": true
                   }
               }
           ],
           "type": "basic"
       }
   ]
 }

ダブルクリックをしない人は to_if_canceled が不要

Karabiner 自体にも mouse_motion_to_scroll というのがあるけど、動作がモッサリ? カクカク? しているので私は DragScroll という別のアプリを使っている


2025-02-24 (Mon) [長年日記]

_ [android]AndroidSKK をストアに置いたら

クラッシュのスタックトレースがちゃんと届くので便利

だけど、どういう経路でそこがその値になるの!? って思うから対症療法しかできないときも多い


2025-01-13 (Mon) [長年日記]

_ [srv] ささやいてました

  • Apple Silicon を入手して whisper.cpp の examples/stream色々やっていた
    • どの程度の性能が必要なのか心配していたが……
      • Mac mini M4 16GB なら余裕すぎ
        • whisper を動かしていてもいなくても非常に省電力なので、他の用途でも、つけっぱなしで動かすときには結局 N100 とかを買うより電力や静音の面で良いという場合も多そう
      • Macbook Air M2 8GB でも、一番重いはずの v3 (非 turbo) で 10秒の音声を 1秒ぐらいで扱えるから stream でガンガンまわすことができる
    • Mac mini を家に置いたまま WebSocket でブラウザの getUserMedia から音声を受け取 (って ffmpeg で Float32 の PCM に変換す) るサーバを Deno で書いてたら、Deno のバグ に引っかかったぽくて、静かに止まってしまうので、Python で書いた
      • シェルでは nc | ffmpeg | stream ってパイプでつなぐだけって感じだけど、Python 等でやると少しコツが必要だと感じた
        • きっともっとシンプルにできるんだろうなぁ
      • whisper は sample rate が 16000 だけど、ブラウザの音質はそれに合わせるより、まず 48000 とかで取得して流すほうが良いみたい
      • 16000 だと認識精度が落ちるほどになった
    • whisper はリトルエンディアンの Float32 (4 バイト) PCM が必要なんだけど、ネットワーク越しとかパイプ越しでやっているうちに 1〜3 バイトずれることがあっても whisper は認識してくれているような気がする
      • tee したデータファイルを見てみると接続のたびにズレてるけど、whisper は普通に日本語の結果を出してくれてる (もしかすると一瞬戸惑ってからだったかもしれない)
      • だから 4 の倍数にすることをそれほど気にしなくてもいいのかも

今回は Windows PC が相次いで故障したので失敗したくなくて、 安く確実に whisper を使えるだろうということで M4 Mac mini にしたけど、 Ryzen とかでも VRAM を設定して普通に使えたりするんだろうか

  • whisper は音量にはとても寛容
    • 音割れしても小声でも認識精度はそれほど落ちない
    • だから無音の区間でも幻聴で「おやすみ」とか「ご静聴ありがとう」とか言い出す
      • そこをどうするかについて決定打はないみたい
      • VAD を使って、いい感じの区間だけ取り出すのがひとまずの最善と考えられているんだろうとは思う

_ [srv] 認識結果を手作業で直しつつ難聴の人に見せたいと思った

  • クラウドに出したくない会話内容とかネット環境の悪い場所とかのために HedgeDoc も検討したけど、パッチを当てるのが難しいのでやめて Rustpad にした
    • Rustpad のクライアントは手抜きで書いたのでそれほど複雑にならなかったけど、(WebSocket で現在の文書の内容や長さを一発確認する API がないみたいだから) 毎回普通の http で GET するとかいうダサいことをしていて人に見せたくない
    • History の operations で変更をぜんぶ追えばいいんだろうけど、それも面倒だし……
  • Google Docs は JSON でドバーッと返してくれるのはいいけど、テキストを取るだけでもダルい
   doc = google.service.documents().get(documentId=DOCUMENT_ID).execute()
   bodyContent = doc["body"]["content"]
   return reduce(
       lambda a, b: a + (b["textRun"]["content"] if "textRun" in b else ""),
       bodyContent[index]["paragraph"]["elements"],
       "",
   )

🙄段落ひとつ取り出すだけでも content の paragraph の element の textRun の content を連結しなきゃいけないの?

_ [js][srv] もう IPv4 でサーバ立てるのも面倒なので、noip.com に AAAA を登録してみようと思った

  • A が消せないのね
  • HTML の JS から扱うなら、DNS API で AAAA だけ取るなどして対応
   await fetch(
     "https://dns.google/resolve?name=example.com&type=AAAA"
   ).then((response) => {
     return response.json();
   }).then((json) => {
     return json.Answer[0].data;

_ [js] そういえば copilot とかは便利

  • Zed で有効にして編集してたら、上記の後半は勝手に出してくれた
  • Answer[0].data のためにぐぐる必要はもうない
    • ウソも多いけど、かなりいい感じに空気を読んでくれて気持ちいい
    • 「pyaudio でマイクから音声を拾って websocket で送るには?」みたいな質問もだいたい答えてくれる
    • 今どきの実装じゃなかったり、要らないことをしていたりとかポンコツなこともあるけど、自分でゼロからやるよりはずっと早い

2024-05-28 (Tue) [長年日記]

_ バンポ電話対応

スマホ買いかえ等の関係で自宅のネットも固定電話も会社を変えてみた。

ネットのほうはフレッツからドコモ光にしたけど、いつ変わったか分からない感じ。ホームゲートウェイを接続しておけばいい。(朝9時までにHGWを用意しておくよう言われていたが、その前から新しいISPにはPPPOEで接続できていたようだ)

固定電話のほうは、ひかり電話の番号へ午前中に電話してくれと言われていたので、ネットのほうの工事がおそらく終わったのだろうと思える時間 (朝10時すぎ) になってから電話をかけた。

それまでのドコモ関係の電話はまさにプロの電話受付といった感じで丁寧で分かりやすかったので今回もそうだろうと思っていたところ、度肝を抜かれた。

「あー、どしたの?」

「番号は?」

「これね、バンポだから開通したあとまた電話してね」

いかにも現場のおじさんといった感じの人が、ぶっきらぼうに業界用語を使いまくるのだ。こちらは

「バンポって何ですか」

「番号が下りてくるってどういう意味ですか」

と、ぜんぶ聞き返さなくてはいけない。

けっきょく、一回目の電話でホームゲートウェイに「ひかり電話」を開通してもらって、(HGW の「ひかり電話」LED が光ってから) その後もう一度電話して電話番号を移してもらうということのようだった。

今はスマホもあるから何かを間違えて電話が不通になってしまっても別経路で対応できるわけだけど、要らない書類をたくさん送ってくる割に最後の大切な段階について説明が雑だったのはちょっとこわかった。


2002|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|10|11|12|
2011|02|04|05|06|07|08|09|10|11|12|
2012|01|03|04|05|06|09|11|12|
2013|02|03|09|10|11|
2014|02|03|04|06|09|
2015|11|
2016|01|04|09|10|
2017|04|05|07|
2018|04|08|12|
2019|07|08|10|
2020|04|05|06|07|08|
2021|01|02|07|
2022|05|06|07|08|10|
2023|06|10|11|12|
2024|01|02|03|05|
2025|01|02|03|08|