posted on 2025-03-18 10:56:32
Caveman2ではapp.lisp内でlackのbuilderを使ってappを生成してそれに対してclackupを動かすという流れになっている。
このbuilderで
(:session
:store (make-dbi-store :connector (lambda ()
(apply #'dbi:connect
(your-package-name.db:connection-settings)))))
とするとRDBMSにセッション情報を保存できるようになる。
(:session
:store (make-dbi-store :connector (lambda ()
(apply #'dbi:connect
(your-package-name.db:connection-settings)))
:disconnector #'dbi:disconnect)
:state (make-cookie-state
:httponly t
:cookie-key "session" ;; default value is lack.session
:samesite :strict
:secure t
:expires 1800))
make-cookie-stateの箇所は必要が無いが使い方のメモとして残しておく。
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のサスペンド機能が無効化されます.
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)
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時点の物であり,環境差もあるので動作を保証しない.
cp /usr/share/shim/BOOTX64.EFI /boot/efi/EFI/gentoo/ && cp /usr/share/shim/mmx64.efi /boot/efi/EFIT/gentoo/
efibootmgr -c -d /dev/nvme0n1 -p 1 -L "shim" -l "\EFI\gentoo\BOOTX64.EFI"
dオプションはEFIパーティションのあるデバイスをpオプションにはパーティションナンバーを入れる.
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ファイルのパスに置き換えて実行.
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で登録し直す必要があるだろう(回避策があるかもしれないが調べるの面倒なので).
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プロジェクトを作る方法ぐらいはここに自分用にメモして忘れた時に読む用にというのがこの記事の目的です.
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内のをコピペしただけですので,単純にそっちからコピーしてきても良いです.
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内のをコピペしただけですので,単純にそっちからコピーしてきても良いです.
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に上記内容を記述.
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に変換されます.
<!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>
でいいです.
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の該当箇所を書き換えてしまった方が早いですが.
私がlackに出していたPRがマージされたので現在のバージョンであれば,
(:session
:state (make-cookie-state
:samesite :lax))
の様にキーワードで渡してsamesiteキーワードに渡してやればSet-CookieにSameSite=Laxが追加されます.
何も指定しなければNoneになります.
Strictにするには:strictキーワードをどうぞ.
caveman2 projectのproject-name.asdの:depends-on内で"lack.middleware.session"かそれをインポートしているライブラリを指定する必要があるということを書いておくのを忘れていました.
上記の"lack.middleware.session"ではなく"lack-middleware-session"でした.
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周りさっぱり分かりません.
posted on 2020-10-27 23:55:02
解決方法を調べてみるとネットで転がっているのはbcdeditを使うものばかりですが,私の環境では上手くいきませんでした.
まぁ要するにvirtioドライバを読み込むようにすれば良いのでWindowsが入っているストレージはSATA等の正常に起動できるやつに戻しておいて,
ブートに関係ないセカンドストレージとして適当にvirtioなストレージを追加して普通にブートするだけでbcdeditで解決する例と同じことができます.
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社のサイトから最新版をダウンロードしてインストールすればう良いようです.
ボイロのインストールに失敗した後にやるとその旨のダイアログが出ますが強行すればいけます.
posted on 2020-08-28 22:42:08
特にこれといったことはないのだが,RustはNightly依存のライブラリにちょくちょく遭遇するのでstable運用したい時に困るなぁとかKotlinで簡単なAndroidアプリを作ってみたがAPI周りに苦しんだりJavaで書かれたサンプルばかりに遭遇するので面倒とかいう感想だけです.つらみ.