Recent Content

Ubuntu 23.04 Lunar LobsterでHDMIサウンド出力が動画を再生する度に遅延する現象について

posted on 2023-08-30 18:22:22

UbuntuでHDMIサウンド出力をすると遅延する現象自体は前のバージョンでも有り,デフォルトでalsaのサスペンド機能が有効になっていて,次の動画を再生すると復帰処理によって冒頭部分が聞けない問題がありました.

勿論音が鳴ってからシークして冒頭に戻せば良いのですが面倒ですしストレスです.
Ubuntu 23.04では/etc/wireplumber/main.lua.d/50-alsa-config.lua
["session.suspend-timeout-seconds"]箇所のコメントアウトを解除して値を0にしましょう.
["session.suspend-timeout-seconds"] = 0,
/etc/wireplumberはUbuntuではデフォルトで存在せず,手動で生成する必要が有ります.
/usr/share/wireplumberディレクトリをコピーして使うのが楽です.尚現在ユーザーのみの場合は~/.config/下にwireplumberディレクトリを作っても良いです.
同様に/etc/pipewireも/usr/share/pipewireディレクトリをコピーして作っておくのも良いんじゃないかと思います.~/.config下でも良いのは同じです.

できたら
systemctl restart pipewire pipewire-pulse wireplumber --user
するか,PCを再起動すればalsaのサスペンド機能が無効化されます.

Caveman2で明示的なセッションIDの更新とセッション終了方法についてのメモ

posted on 2021-07-09 22:30:43

ログインログアウト機能を実装する際,ログイン時にセッションIDの変更とログアウト時にセッションを終了させる処理を入れることがセッションハイジャックへの対策の一つであるが,方法がドキュメントには載っていない.
なので適当に検索してみたらhttp://diary.wshito.com/comp/lisp/clack/lack-middleware-session/#sec-example3が引っかかった.
lackを直接使ってる場合の方法ではあるが,役に立った.
envにある:lack.session.optionsにある値を見ているらしい.
とはいえ記事の例はあくまでもlackを直接使っている場合の物でCaveman2からenvを操作する方法がわからない.
どうしたらいいかとCaveman2のソースを読んでみたら,caveman.lispでlack.requestからrequest-envをインポートしているのがわかった.
これはlack/src/requst.lispにあり,構造体requestにあるenvスロットのアクセサーだ.このスロットというのはメンバ変数の様なものだ.
Common Lispでは構造体のスロットへのアクセスは"(構造体名-スロット名 インスタンス)"という形で行う.
ともかくこのenvが前述した記事で使っているenvでは? と当たりをつけて試してみたらそうだった.
尚インスタンスは"*request*"としてningleからインポート&エクスポートされているので,
(setf (getf (getf (request-env *request*) :lack.session.options) :change-id) t)
とすればセッションIDの更新ができた.
change-idをexpireにすればセッションの終了ができる.
(setf (getf (getf (request-env *request*) :lack.session.options) :expire) t)

インストール済みのGentooをセキュアブートで起動できるように設定した時のメモ

posted on 2021-07-03 09:42:56

前提条件としてセキュアブートをオフにしてインストールしたGentooかつ,ブートローダーにGRUB2をinitにsystemdを採用し尚且つsys-boot/shim,app-crypt/sbsigntools,sys-boot/efibootmgrをインストール済みの状態であることを想定している.
GRUBインストール時のオプションは
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --modules="tpm" --disable-shim-lock
を想定.これについてはこちらを参照.しておかないとブート時にエラーが出る.UEFIでTPMを有効しないといけないかは検証していない(多分要る気はする).
セキュアブートとTPMの有効方法はマザーボードごとに違ったりするのでここでは触れない.
またここに書かれていることは2021-07-03時点の物であり,環境差もあるので動作を保証しない.

setup shim

cp /usr/share/shim/BOOTX64.EFI /boot/efi/EFI/gentoo/ && cp /usr/share/shim/mmx64.efi /boot/efi/EFIT/gentoo/

EFIに登録する

efibootmgr -c -d /dev/nvme0n1 -p 1 -L "shim" -l "\EFI\gentoo\BOOTX64.EFI"

dオプションはEFIパーティションのあるデバイスをpオプションにはパーティションナンバーを入れる.

Sign to kernel and grub

opensslを使う.
参考URL:https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#shim
openssl req -newkey rsa:4096 -nodes -keyout MOK.key -new -x509 -sha256 -subj "/CN= My Key /" -out MOK.crt
daysオプションで有効期限を設定した方が良いかと思ったが煩わしいのでやめた.

openssl x509 -outform DER -in MOK.crt -out MOK.cer
このcerファイルは/boot/efi/EFI/gentoo/に放り込んでおく.
セキュアブートで起動した時に証明書が無いとmmx64.efiが起動し,keyを指定してenrollしろと言われるのでMOK.cerを置いた場所を指定する必要があるのでよしなにして.

sbsign --key MOK.key --cert MOK.crt --output vmlinuz-path vmlinuz-path
vmlinuz-pathのところを/boot/下にある署名したいvmlinuzファイルのパスに置き換えて実行.

Example:

sbsign --key MOK.key --cert MOK.crt --output /boot/efi/EFI/gentoo/grubx64.efi /boot/efi/EFI/gentoo/grubx64.efi

以上.
UEFIに戻ってセキュアブートを有効にして,shimラベルのやつをブートに指定すればmmx64.efiが起動して証明書を指定するように言われるのでそれをして再起動すればブートできるだろう.

追記

カーネルやGRUBをアップデートする度に署名する必要がある.
またgrub-mkconfigで設定をアップデートする際にEFIが書き換えられて手動定義したラベルが消えるっぽいのでefibootmgrで登録し直す必要があるだろう(回避策があるかもしれないが調べるの面倒なので).

参考文献

Fableプロジェクトを1から手動で作る方法的な私的メモ

posted on 2021-05-29 11:26:48

FableはF#コードをJavaScriptに変換してくれるやつです.
サンプルを試すだけならhttps://github.com/fable-compiler/fable3-samplesをgit cloneしてよしなにすれば良いのですが,自プロジェクトだと1から用意したくなります.なりますよね?

公式チュートリアルだとテンプレートをインポートさせてdotnet newで簡単にできるようにする方法が紹介されていますが,この記事執筆時点では公式が用意しているテンプレートですとFable3に対応していないという注意書きも書かれています.

仕方ないので手動で用意するかってなりました.まぁ私が知らないだけでもっとスマートなやり方がある気がしますが.

dotnet sdkとnodejsのインストールはmustなので割愛します.

上記のサンプルにありますbrowserサンプルを参考にしているので適宜参照します.

webpack.config.jsの中身とかはそこからの流用です.

それと間違っていることを書いてしまっている可能性があるのでここに書いてあることは参考程度に留めておくのがいいです.

一番良いのは公式のドキュメントやサンプルをチェックしていって試行錯誤していくことですが,ただそれだと私の様なアホだとサンプルコード読んでお終いとなりがちなので(私だけかもしれないが)自分でFableプロジェクトを作る方法ぐらいはここに自分用にメモして忘れた時に読む用にというのがこの記事の目的です.

Process

  • Step 1: Create Project Directory
    適当にmkdirでproject dirを作りましょう.

  • Step 2: Create package.json
    project dir内でnpm initなりyarn initなりでpackage.jsonを作成しておきます.

  • Step 3: Install dependencies webpack
    npmなら--save-dev,yarnなら-dをつけて,webpack,webpack-cli,webpack-dev-serverをインストールしておきます.

  • Step 4: Write Script in package.json

"scripts": {
    "postinstall": "dotnet tool restore",
    "start": "dotnet fable watch src --run webpack serve"
}

をpackage.json内に記述してください.
上記のはfable3-samples/browser内のをコピペしただけですので,単純にそっちからコピーしてきても良いです.

  • Step 5: Create webpack.config.js
    webpack.config.jsをproject dir内で作成し,
var path = require("path")
module.exports = {
    mode: "development",
    entry: "./src/App.fs.js",
    output: {
        path: path.join(__dirname, "./public"),
        filename: "bundle.js",
    },
    devServer: {
        contentBase: "./public",
        port: 8080,
    }
}

をwebpack.config.js内に記述します.
上記のはfable3-samples/browser内のをコピペしただけですので,単純にそっちからコピーしてきても良いです.

  • Step 6: Install Fable command
dotnet new tool-manifest # if you are setting up this repo
dotnet tool install --local Fable --version 3.2.1

以上をproject dir内で行うと.configディレクトリとその中にdotnet-tools.jsonが作られます.
これでscriptを動かすために必要なコマンドが揃いました.

  • Step 7: Create src directory
    今まで書いてきた設定ファイルに沿ったdir nameにします.
    つまりproject dirでmkdir srcします.
    次からはこのsrcディレクトリ内で作業します

  • Step 8: Create App.fsproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="App.fs" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Fable.Browser.Dom" Version="2.4.4" />
    <PackageReference Include="Fable.Core" Version="3.2.7" />
  </ItemGroup>

</Project>

App.fsprojに上記内容を記述.

  • Step 9: Create App.fs
module App
open Fable.Core.JsInterop

let window = Browser.Dom.window

let mutable hOne : Browser.Types.HTMLElement = unbox window.document.getElementById "title"
hOne.innerText <- "Replaced on Fable"

上記を記述.
このファイルがjsに変換されます.

  • Step 10: Set public files
    project dirに戻り,mkdir publicして,中にindex.htmlを用意します.
    index.htmlの中身は
<!doctype html>
<html>
<head>
  <title>Fable</title>
  <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="shortcut icon" href="fable.ico" />
</head>
<body>
    <h1 id="title">Test</h1>
    <script src="bundle.js"></script>
</body>
</html>

でいいです.

  • Step 11: Run
    再びproject dirに戻り,npm run startなりyarn startなりすれば動くと思います.

Caveman2でcookieのkeyとexpiresを変更する方法

posted on 2021-04-19 23:47:20

Caveman2でセッションを有効するには,app.lispにあるbuilderマクロで:sessionを書けばいいことはREADMEに書かれているのでそこは問題無いのですが,cookieのexpiresやセッション名となっているcookieキーの変更方法は書かれておらずソースを読む必要がありました.

https://github.com/fukamachi/lack/blob/master/src/builder.lispを読むとlackのミドルウェアか判別して実行する展開する箇所があります. :sessionを渡すとlack.middleware.sessionを実行するということなので,
https://github.com/fukamachi/lack/blob/master/src/middleware/session.lispを読むとstateキーのデフォルトとしてmake-cookie-stateを使っているのわかります.

app.lisp内で:lack.middleware.session.state.cookieをインポートして,builder内で
(:session :state (make-cookie-state :httponly t :cookie-key "myapp.session" :expires 1800)) すればset-cookieの値が変わっているはずです.

このcookie-stateは構造体でありhttps://github.com/fukamachi/lack/blob/master/src/middleware/session/state/cookie.lispで定義されています.

「cookieを生成した現在時刻+make-cookie-stateのexpiresキーで渡した秒数」が最終的なexpiresになるのでこの例だと30分有効ということになります.

個人的にはsamesiteを入れたいのですが入り組んでいて私ではわかりづらく難航しています.

まぁ元のlackの該当箇所を書き換えてしまった方が早いですが.

追記(2021-05-07)

私がlackに出していたPRがマージされたので現在のバージョンであれば,
(:session :state (make-cookie-state :samesite :lax)) の様にキーワードで渡してsamesiteキーワードに渡してやればSet-CookieにSameSite=Laxが追加されます.
何も指定しなければNoneになります.
Strictにするには:strictキーワードをどうぞ.

追記(2021/05/07 16:50 JST)

caveman2 projectのproject-name.asdの:depends-on内で"lack.middleware.session"かそれをインポートしているライブラリを指定する必要があるということを書いておくのを忘れていました.

追記修正(2021/06/16 JST)

上記の"lack.middleware.session"ではなく"lack-middleware-session"でした.

Tidalを試しにインストールした際に躓いた点

posted on 2020-11-03 10:11:15

TidalCyclesはライブコーディングで作曲等ができるというものですが,インストールが若干面倒です. SuperColiderとかDirtのインストールは躓く要素が無いので省きます.

Tidalはwikiに書かれている方法だと導入方法がcabal install tidalですがWindows環境でどうもこれが上手く行きません.GHCIでインポートしようにも見つからないという旨のエラーが出ます.

https://github.com/tidalcycles/tidal-chocolatey/issues/3を参照するとcabal v1-install tidalすると動くらしくて実際に私の環境ではこっちで動作しました.

Windows上でのHaskell周りさっぱり分かりません.

Windows10 20H2 on KVMでvirtioを後から使う際にINACCESSIBLE_BOOT_DEVICEに遭遇した

posted on 2020-10-27 23:55:02

解決方法を調べてみるとネットで転がっているのはbcdeditを使うものばかりですが,私の環境では上手くいきませんでした.
まぁ要するにvirtioドライバを読み込むようにすれば良いのでWindowsが入っているストレージはSATA等の正常に起動できるやつに戻しておいて,
ブートに関係ないセカンドストレージとして適当にvirtioなストレージを追加して普通にブートするだけでbcdeditで解決する例と同じことができます.

VOICEROIDの旧製品のインストール時のブルスク回避方法

posted on 2020-09-04 08:15:05

現行(2010-09-04時点)のWindows10ですとVOICEROID EXで認証に使われているHASPが少なくとも昔私買ったDVD版だと古くてhardlock.sysがクラッシュしてブルスクします.
AIのFAQhttps://www.ai-j.jp/qa/q6/を見るとThales社のサイトから最新版をダウンロードしてインストールすればう良いようです.
ボイロのインストールに失敗した後にやるとその旨のダイアログが出ますが強行すればいけます.

最近はKotlinやRustをちょくちょくやってるというお話

posted on 2020-08-28 22:42:08

特にこれといったことはないのだが,RustはNightly依存のライブラリにちょくちょく遭遇するのでstable運用したい時に困るなぁとかKotlinで簡単なAndroidアプリを作ってみたがAPI周りに苦しんだりJavaで書かれたサンプルばかりに遭遇するので面倒とかいう感想だけです.つらみ.

Gaming PCを組んでみて

posted on 2020-08-15 11:53:19

長い間iMac mid 2011 21.5incをメインで使いつづけていたのですが、macOSはHigh Sierraまでしか使えずスペックも流石に辛く、PCを新調することしました。
最初はBTOにしようかと考えていたのですが、最終税抜価格に10%の消費税かかるのはエゲつなさを感じましたし、電源などのパーツでどのメーカーのを使っているのかとか考えると納得はできず、結局自作です。
一度もやったことないので工具とか揃えたので予想よりは高くついたのですがまぁまぁ楽しかったです。
電源はちゃんとしたメーカーのを使わないと気が気じゃないので。

Ryzen3600x + Radeon 5700XT(Sapphire Nitro+) + nvme m2 SSDは想像以上に快適でさいこーってなってます。いやまぁiMac mid 2011からの移行ならどれでもそうだろうと言われそうですがそうですねはい。


Unless otherwise credited all material Creative Commons License by madosuki