WSLでWindowsのファイルシステム内をマウントするとWineがコケる

WSLでWineを使う時はちゃんとWSL用にファイルシステムを初期化した仮想ドライブでやろうね

カテゴリー: IT | コメントする

WSL2のUbuntu 22.04 LTSにWineがインストールできない

$ sudo apt install --install-recommends winehq-stable
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 winehq-stable : Depends: wine-stable (= 9.0.0.0~jammy-1)
E: Unable to correct problems, you have held broken packages.

んでwinehq-stable : Depends: wine-stable (= 9.0.0.0~jammy-1)とかいうからじゃあsudo apt install wine-stableしてやろうじゃんとかすると、

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 libgphoto2-6:i386 : Depends: libgd3:i386 (>= 2.1.0~alpha~) but it is not installable

公式ドキュメントに従ってんのにこれ
で良く見ると公式のFAQにUbuntuではよくあることと記載がある
https://gitlab.winehq.org/wine/wine/-/wikis/FAQ#how-do-i-solve-dependency-errors-when-trying-to-install-wine

ざっくり訳

ubuntuだとあるパケの64bit版と32bit版(パケ名が~:i386になってるやつ)を同時に入れようとした場合、両方同じパッケージじゃないといけない決まりがあるよ
んで例えば公式リポに上がってるライブラリがアーキテクチャ毎にバージョン違ったりすると、片方入れたら自動でもう片方がアンインストールされたりするよ
PPAとかでよく起こるやつだけど、これが起きたらリポ設定弄って適切なパッケージが入るようにしてね

で上の例だと更にlibgd3:i386が入らんとか言われてるわけだが、実際にこれを入れようとすると勝手にlibgd3の64bit版がアンインストールされる。
それぞれのパケがどこからどう入るようになってるか調べると、

$ apt policy libgd3
libgd3:
  Installed: (none)
  Candidate: 2.3.3-12+ubuntu22.04.1+deb.sury.org+1
  Version table:
     2.3.3-12+ubuntu22.04.1+deb.sury.org+1 500
        500 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy/main amd64 Packages
     2.3.0-2ubuntu2 500
        500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages

$ apt policy libgd3:i386
libgd3:i386:
  Installed: 2.3.3-6+ubuntu22.04.1+deb.sury.org+1
  Candidate: 2.3.3-6+ubuntu22.04.1+deb.sury.org+1
  Version table:
 *** 2.3.3-6+ubuntu22.04.1+deb.sury.org+1 500
        500 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy/main i386 Packages
        100 /var/lib/dpkg/status
     2.3.0-2ubuntu2 500
        500 http://archive.ubuntu.com/ubuntu jammy/main i386 Packages

つまり64bitが2.3.3-12…で32bitが2.3.3-6…だからどっちか一方しか入らんよと。
恐らく理想はバージョンのあってる最新版のリポを入れる事なんだろうけど、めんどいので第二候補の2.3.0-2ubuntu2とやらを入れてしまう。

sudo apt install libgd3=2.3.0-2ubuntu2 libgd3:i386=2.3.0-2ubuntu2

したらあとはsudo apt install –install-recommends winehq-◯◯叩き直して勝ち。

カテゴリー: IT | コメントする

3線改造式AOM5024で本格バイノーラルマイクを作ろう with 3Dプリンタ

美耳・改

https://github.com/DrRoot-github/bimimi-5024

続きを読む

カテゴリー: 電子工作, 音響関係 | コメントする

Typescript + Sequelizeをちゃんと動かすには

typescriptでSequelizeを使う

概要

TypescriptにおけるORMの選択肢は俺の知る限り3つメジャーなものがある。
typeorm、Prisma、Sequelizeである。
何れも試した結果、一番マシなものはSequelizeという結論に達した。
軽く触れておくと、2023年11月現在、typeormには設定一つでデッドロックを起こして即死させる致命的なバグがあり、一回プロダクションでやらかしてえらい目にあった。
一方機能面で非常に優れているPrismaだが、何故かsqliteのmemoryモードが使えないという仕様があり、テストが非常に書きにくいという問題がある。
というわけで消去法的に選んだSequelizeだが、これもこれで中々問題があり、まともにCRUD操作ができるようになるまで苦労したので動くまでの記録を示す。

前提

今回試した環境は以下。

  • typescript 4.9.4
  • electron 22.0.0
  • vite 4.0.3
  • sequelize 6.33.0
  • sequelize-typescript 2.1.5
    electron-vue-viteライブラリでボイラープレートを生成しており、この他にもelectronなのでvueとか使ってレンダラープロセスを書いているが割愛。
    本体のsequelizeはjavascriptベースのライブラリであり、typescript向けのラッパーとしてsequelize-typescriptを用いている。
    この「sequelizeはなまじ古くてtsに対する対応が甘め」という欠点をラッパーライブラリでゴリ押しているのが2023年現在の現状である。tsの公式対応がアナウンスされている7系はまだalphaだ。

結論

ts-configのcompilerOptionsに"useDefineForClassFields": falseを追加する。
これはts 3.7から導入された機能で、現在ではデフォルトがtrueになっている。
これをしないとどうなるかというと、sequelizeでgetしてきたオブジェクトの中身がgetterの動的な注入を阻害してundefinedになる。
具体的に言うとこんなコード↓を書いても通らないということだ。

const res = await User.create({name: "testit"});
expect(res.name).toBe("testit");

思うこと

ts碌なORMが無い
sequelize 7系はよ
TypeORMは開発がやる気なくて駄目だ
あんなもんをNestJSは公式で推すなバカ

追記
色々試した結果体外Sequelizeもゴミだった
Typeormがマシとか思いもよらんかった

カテゴリー: IT | コメントする

CCFOLIAのカスタムCSSを書いた

https://github.com/DrRoot-github/ccfolia-css

あとでドキュメントもっとかく
ちなみに頼まれて作ったものなので俺は全くCCFOLIAを使っていない なんだそれは

カテゴリー: IT | コメントする

ロックマンエグゼ6 改造カードシミュレーターをつくってみた

gaiyou

エグゼ6の改造カードをがちゃがちゃ出来る

https://drroot-github.github.io/mmbn6-modcards/

こんごのかだい

保存と復帰みたいなのはできるようにしたい
バグがあったらこの記事にコメントよろしく
ナビカスシミュもつくりたい

リポジトリ
https://github.com/DrRoot-github/mmbn6-modcards
一番手っ取り早いのはPR出すこと

カテゴリー: IT | 8件のコメント

壊れたアケコンを修理してみた!

アケコンのレバーが効かなくなったので、レバー単体で交換してみました。
今回はそのレポート記事になります!

交換に用いるのはこちらのレバー。4000円とお高いですが、クリアなボールがかっこいい!
file

アケコンを分解してレバーをつけかえていくのですが、若干異なる規格に沿っているので一度お互い分解しないと取り付けができません。
分解中にネジがナメてしまったので、ネジ外し(1700円)と電動ドリル(6500円)を急遽発注。
file


分解したら機械油のついた部品が弾け飛んでホコリまみれになり元に戻らなくなる


不燃ゴミ

file

総評
4000円で買ったものをそのまま燃えないゴミにすると辛い
本来いらなかった余計な出費が2万近くなった
二度とやらない
カス

カテゴリー: 雑記 | コメントする

yarn devみたいなノリでts-node + watchを実現するには

英語が読める?じゃあこれ読んで終わりな!
https://stackoverflow.com/questions/58187115/typescript-paths-not-working-in-an-express-project

(っ◞‸◟c)

何が問題なのか

expressみたいな鯖をnode + tsとかで自前で環境入れていくと、vue-cliでやってくれるようなdevコマンド一発でホットリロードつきビルドが標準で出来ない。
でnodemon使って自前でそのあたりのスクリプト書くんだけど微妙にnodemonのドキュメントが不親切で情報がとっちらかってるのでまとめておく。

結論

devDepenciesにnodemon, ts-node, tsconfig-pathsを追加して、プロジェクトのルートにnodemon.jsonを作成する。
tsconfig-pathsはtsconfigでpathsを使わない(インポート時のパスを@/とかから始められるエイリアス的なやつ)ならいらないけどあると便利だよ
jsonの中身はこんな感じ

{
  "ignore": [
    "**/*.test.ts",
    "**/*.spec.ts",
    ".git",
    "node_modules"
  ],
  "watch": [
    "src"
  ],
  "exec": "node -r tsconfig-paths/register -r ts-node/register ./src/index.ts",
  "ext": "ts, js"
}

あとはpackage.json内のscriptで"dev":"yarn nodemon"とでも書いておけばよろし。

余談

nodemonは何処にも書いてないんだがどうも標準でts-nodeを使ってくれるらしく、前述のパスの問題が気にならないなら
yarn nodemon src/index.tsとかで一発らしいよ。びっくりだね。ドキュメント書いとけ。

カテゴリー: IT | コメントする

しばいぬAPI

https://drroot.page/wp/wp-content/uploads/2022/09/shibes.html

https://shibe.online/
しばいぬAPIのクライアントページを作成した。
公式サイトでも出来る事だが、ボタン一つで更新をかけられるようになっている。

カテゴリー: IT | コメントする

Youtubeの配信チャットを取得する(全体チャット編)

https://drroot.page/wp/?p=227
この記事でアプリケーション(Node.js)からブラウザのフリして配信のチャットを引っこ抜くコードを紹介したが、正規表現でContinuationを引っこ抜く処理に抜けがあり、上位チャットしか取ってこれてない状態だった。
というわけで上位でなく全体のコメント向けContinuationを取得するコードも書いた。以下でcontinuation keyがstringとして得られる。

// videoId=配信ページとかのURL末尾のID
const res = await axios.get('https://www.youtube.com/live_chat', {
  headers: "user-agent":
      "Mozilla/5.0 (Windows NT 6.3; Win64; x64) " +
      "AppleWebKit/537.36 (KHTML, like Gecko) " +
      "Chrome/86.0.4240.111 Safari/537.36",
  params: { v: videoId }
});

const html: string = res.data;
const matchedCtn = html.matchAll(
  /"reloadContinuationData":.*?"continuation":"(.+?)"/g
);
const matchedCtnList = [...matchedCtn];

// matched = Regex結果の集合 一個の結果が更に配列でマッチ結果を持つ
// Youtubeの場合matched[0]が上位チャット、matched[1]が全体チャットの筈
const continuation = matchedCtnList[1][1];
カテゴリー: IT | コメントする