デスク環境を更新した

10月になっても半袖で十分というのはどうなんだ、と思いつつ、でもようやく涼しくなるようになってきました。 リモートワークでも生活でもずーっと使っているデスク環境を更新したので、その話を書こうかと思います。 <!–more–> 元々のデスク環境 さて、そもそも以前のデスクはどんな感じだったのかというと。 こんな感じでした.これは実際にデスク周りを変更する直前なのでディスプレイとかは電源切ってます。 このデスクのスペックとデスクの上にあったものとして、 デスク( 幅160cm x 奥行60cm x 高さ70cm ) ディスプレイ2枚 27inch デスクトップスピーカー キーボード トラックボール コントローラー2個 PS5 ちょっとした物いれ がありました。PS5は右のディスプレイの影になってますね。左端にちょこっと見えてる台みたいなやつは、デスクトップPCのキャリアです。 前の構成の課題 このデスクは前の部屋でも使っていたものを持ってきたやつですが、新しい部屋で使ううちに色々課題が生まれてきました。 左側のデッドスペースが気になる デスクトップを入れているキャリアは、その上部空間がまるごと無駄になってます ゲームのコントローラーをしまう場所が無い 別にいいんですが、いつまでも剥き出しというのも・・・ というかこのデスクは仕事でも使うので、これはこれでどうなん?という 上下のスペースが活用できていない デスクの幅が160cmあるので、特に右側とかは上部に隙間がないという感じになってます。 これらの課題をどうしようかな、と考えてみました。 デスクの幅が広すぎるので、もうちょっと狭くしても問題ない 逆に、奥行がもうちょっとあってもよいかな、という考えにもなりました iPadが置いてある辺に、通常はノートPCが置いてあるので、若干奥行が微妙だったりします 右にあるディスプレイをPC台の上に持っていく 地震があったりするとちょっと怖いですが、エルゴトロンを信じて サイドデスク的なもので上下のスペースを活用する PS5とかをデスクの上に載せないで、別に載せる感じで 後、デスクはまだリモートワークが続きそうでもある & 生活のほぼすべてがこの周辺なので、立ちながらとかできるように、電動昇降デスクを検討しました。 劇的After さて、とりあえず更新してみました。 ジャーン。ちなみにこれはまだ配置を調整している最中なので、現在はもうちょっと調整されてます。 更新ポイントは以下のような感じです。 憧れの電動昇降デスクにした サブデスクを導入した ディスプレイの配置を変更した スピーカーの位置を調整した 電動昇降デスクとサブデスクは↓にしました。サブデスクというかメタルラックなんですけど、ちょうどいいやつがこれくらいしかなかったんです。 デスクは、調べてみるとFlexiSpotを利用している・・・というのがかなり多かったので、最初はそれを検討してました。しかし、それらの記事をよく読むと、半分くらいが FlexiSpotから提供を受けている ということがわかりました。 これはマーケティングの一環として行われていることだとは思いますので、それ自体はよいのですが、実際それ以外のレビューを見ていると、サポートとかに課題がありそうだった & とてもいいお値段がするので、ちょっとどうしようかなぁ・・・、となってしまいました。 結局は、同等の機能があって一応国内メーカーである 山善 製のものを選択しました。 デスク全部合わせても椅子より安いんですけどね ちなみに電動昇降デスクは、大人二人で1時間〜1時間半くらいかかる、ということでしたが、実際に大人一人でやってみたところ、始めたのを若干後悔するくらい時間がかかりました。腰をやらなくてよかったです。 で、どうなの? まだ移行してから1日しか経過していませんが、左にあるマイクスタンドさえなんとかなれば・・・という感じです。現状ここ以外に置けないのですが、ここにあると左側のディスプレイがちょっと見えないんだけど・・・となってしまってます。 ...

October 9, 2021 · derui

filebaseのrealtime databaseでテストする

もう9月も末で、涼しくなってきたなぁと思ったらいきなり暑くなったりと、季節があっちこっちいきますね。これも温暖化の影響でしょうか。 今回も小ネタで、最近やったfirebaseのrealtime databaseでローカルのテストをやる方法をサラッと書いてみます <!–more–> Realtime databaseをローカルで動かす Realtime databaseのテスト手法にはいくつかあると思いますが、基本的にはローカルで動作するemulatorを利用します。 https://firebase.google.com/docs/emulator-suite?authuser=0 β版とはいえ、かなりしっかりできている印象で、少なくともローカルでテストするレベルであれば必要十分です。さすがに実Databaseに比べると、レイテンシーがなさすぎて(そりゃそうだ)、実際にpublishして動かしたときに アレ? ってなる可能性もありますが。 さて、このemulatorですが、firebaseコマンドで初期化するときに選択しているか、configで追加したら、後は以下のコマンドを叩くだけで起動します。 $ npx firebase emulators:start デフォルトでは localhost:4000 で起動し、 localhost:9000 とかでrealtime databaseが起動します。この状態でも、databaseには繋げることができるので、やろうと思えばテストを書けます。 emulators:start の問題 しかし、emulators:startにはいくつか問題があります。 そのなかでも大きな問題は、 backgroundでの起動ができない & テストに同期して落とすとかできない という点です。まぁそりゃそうなんですが。 emulators:exec を使おう そんなときに役立つのが、 emulators:exec というコマンドです。このコマンドは、引数で渡されたコマンドを実行する前後でemulatorのstart/stopをきちんとやってくれる、one-pathなemulatorの起動を提供してくれます。 なので、 $ npx firebase emulators:start npm run test のように書けば、テストが開始する前にemulatorが立ち上がって、テストが終了するとemulatorが終了します。 また、引数に渡したコマンドがwatchとかであれば、watchを C-c とかで落とすまでずっと立ち上がりっぱなしになるので、ずっとテストしてられます。 realtime databaseを使うIntegration test こんな塩梅のボイラープレートを書く必要があります。RulesTestEnvironmentは、 @firebase/rules-unit-testing で提供されている便利ツールです。firebaseと結合したテストを書く場合はこれを使っておくのがよさげかと思います。 let database: any; let testEnv: RulesTestEnvironment; beforeAll(async () => { testEnv = await initializeTestEnvironment({ projectId: "demo-project-1234", database: { host: "localhost", port: 9000, }, }); database = testEnv.authenticatedContext("alice").database(); }); afterAll(async () => { testEnv.cleanup(); }); afterEach(async () => { await testEnv.clearDatabase(); }); 若干の課題 多分私の書いてるソースがどっかおかしいんだと思いますが、実行されるタイミングとか順番によっては、うまくデータが初期化されていなかったりなんだりします。これは原因を探っているところではありますが、基本的にはかなりの速度で動作してくれるので、ある程度の数のテストがあっても問題はなさそうです。 ...

September 27, 2021 · derui

completion-category-overridesで使う値を取得する

今回は超小ネタです。 <!–more–> 最近はEmacs上でのcompletionとして、orderlessなどの標準のcompletion-readなどに則ったものを利用してます。Emacsの標準補完は、実はかなり柔軟性に富んでいて、様々なカスタマイズが可能になっています。 completion-readのカスタマイズでは、 completion-category-overrides という変数で、completion-readによるマッチング方法を categoryごとに 変更することができます。 このcategory、 completion-metadata という関数で取得できるmetadataから取得することができます。 (completion-metadata-get (completion-metadata "" table nil) 'category) このtableとは、(私の理解だと)completion-readの第二引数として渡す関数です。この関数は、第3引数としてactionを取り、このactionに 'metadata というシンボルが渡された場合は、metadataを返す必要があります。 completion-metadata-getはこれらのmetadataから、特定の情報を取得するものです。なので、あるパッケージの補完をカスタマイズしたいときは、これを調べればカスタマイズできます。 ・・・が、場合によってはcompletion-readの呼び出しでlambdaを利用していて、 completion-metadata が使えないケースがあります。 実際、org-roam-node-findではlambdaで渡されており、categoryを知るためには結局その中身まで見る必要がありました そういう場合は、しかたがないのでパッケージの中を completion-read で検索してみると大体見付かります。 そんな場合もあるんだよ、というメモでした。

September 4, 2021 · derui

Recoil.jsを使ってアプリケーションを作ってみた

涼しかったのも終わり、相変わらずの厳しい残暑が戻ってきてしまいました。日が出ていないのに36℃とか勘弁して欲しいですほんと。 今回は、ひょんなことからガッと作ったアプリケーションで、Recoil.jsを使ってみたのでその話をしようかと思います。 <!–more–> 作ったもの これです。といってもまだ若干イケていないところがあるので、画面とかはないですが。 https://github.com/derui/simple-planning-poker 複数人で一つのゲームを開催できる 全員がカードを選択したらその平均値を表示できる 表示し終わったら次のゲームを直ぐに開始できる カードの選択、show downなどはリアルタイムで同期されます。 今日時点で9daysなので、大体1週間ちょっと(平日の夜 + 土日の日中)ですね。 なんで作ったん? チームではスクラムっぽいことをやっていて、そのなかで見積もり手法としてプランニングポーカーを利用しています。 で、最初はアナログな手法でやっていたのですが、リモートが長く続くこともあり、 https://planningpokeronline.com/ というサイトを利用するようになっていました。 で、↑のサイトを使っていたときに、チームの中から(自分が言い出したかもしれん)、 これってFirebaseを使えば割と簡単に出来るんじゃない? という話が出ました。 そういえば、Firebaseって使ったことねーなー。 と思ったので、じゃあやってみんべ、と作ってみました。 state管理ライブラリの選定 さて、今回はガッと作ろうと決めていたので、フロントは慣れている React.js + TypeScriptを使うことにしました。react-routerとかも使ってます。が、あんまりまともに使ったことがないのでreact-routerはいつも迷いどころ・・・。 ただ、state管理として Redux を使うかどうか・・・というのはちょっと迷っていました。いくらガッと作ると言っても、趣味プログラミングならばちょっとは冒険してみたいところ。 と調べていたら、 Recoil.js という新しめのstate管理ライブラリを見つけました。 A state management library for React と謳っていることもあり、完全にReact専用です。なんといってもHookを前提にしているので、Reactじゃないとそもそも動作しません。Reduxは別にReactに閉じるものでもないことを考えると、汎用性があるわけではないなーとは思ったんですが、まぁ使ってみるか、とやってみました。 Recoilの基本 基本的なものは、公式サイトを見るのが一番わかりやすいと思うんですが、簡単に紹介します。 Recoilの基本は、 atom と selector の二つの概念です。といっても、 atom = state で、 selector = atomから情報を取得したり加工して情報を返す という区別があります。 const textState = atom({ key: 'textState', // ユニークなID。atom/selector全部を通じてユニークでなければならない default: '', // デフォルトの値 }); const quotedText = selector({ key: 'quotedText', // ユニークなID。atom/selector全部を通じてユニークでなければならない get: ({get}) => { const text = get(textState); return '"' + text '"'; } }); みたいな感じです(例が思いつかなかった)。recoilは、selector/atomの間にデータフローを作成し、atomが更新された場合はそのatomを利用しているselectorを更新する、という形になっているようです。 ...

August 26, 2021 · derui

Rustで超簡単なツールを作ってみた

気付いたら8月です。猛暑というか酷暑というかですが、台風が来てくれると多少熱が持っていかれるので、多少は過ごしやすくなってくれるといいんですが。 少しは別のこともやらんとなぁ、ということで、久し振りにRustを使ってちゃんとしたツールというのを作ってみました。 <!–more–> 何を作ったのか https://github.com/derui/org-roam-protocol-installer こんなのを作りました。今、個人なナレッジの蓄積としてorg-roamを利用しています。org-modeには、org-protocolという、外部からorg-modeに対してcaptureを行わせることができる仕組みが存在しています。 org-roamにはこれを独自に拡張した、org-roam-protocolというものがあります。これを利用すると、webページとかをお手軽にorg-roamにcaptureする・・・ということができます。 が、リンク先のドキュメントを見てもらえばわかるのですが、ファイルを作ったりなんだりと、別段複雑ではないものの、多少手順が必要だったりして、これはこれでなぁ・・・みたいなことを考えました。特にmacOSがめんどくさい。 ということで、じゃあこれをインストールするだけのツールを作ればいいんでない?ということを思いつき、ついでにRustの勉強(実際には以前使っていたので復習)がてら、Rustで作ってみることにした、という次第です。 使ったcrate Cargo.tomlを見たらわかりますが、今回はきちんと?crateを利用しました。 clap CLIのフレームワーク。サブコマンドの定義とか色々可能 dirs HOMEとか特殊なディレクトリとかにアクセスするため tempfile 一時ファイルを適切に作成するため ソースは見てないけど、挙動的にdropすると削除されるようになってる quick-xml 高速な低レベルXMLライブラリ。Info.plistの編集で使ってます 常日頃OCamlをよく利用している側としては、一つの処理に対して色々なcrateがあってすげーなぁ、と思うと同時に、どれを選んだらいいのかわからない問題も起きがちだなぁ、というのはやっぱりありますね。 苦労した点 私はmacOSを個人では保有していないので、macOSでのインストール作業をどう自動化するか?を結構悩みました。 Script EditorをApplescriptで起動して保存させる・・・? ApplescriptをApplicationとして保存しなければならないのですが、そのためにはScript Editorしか使えなさそうに見えた そもそもApplescriptで↑ができる・・・? とか考えましたが、最終的には osacompile というコマンドの存在を知り、これでええやんってことになりました。このあたり、独自形式を突っ走るmacOSがめんどくさいですね・・・。 所有権とかは苦労していないの? Rustでよく言われる所有権とかborrow checkerですが、そこまで苦労はしませんでした。というか、普通にプログラムを作っていったら、一つの中で書きこみと読みこみを同時にやる、とか基本的にそこまでしないはずなので。 ライフタイムとかを考え始める = structにオブジェクトを含めるようになると、めんどくさくなるのが目に見えてますが、今回はそこまで必要なかったというのもあります どちらかというと、 File::open と File::create の違い(Cとか他の言語だと、大抵はopenに引数を付けてwriteとかappendとかにする)とか、traitを渡すためにはどうすればいいか、とかの方がよほど苦労しました・・・。 エラーメッセージが大分親切になっているので、そこまで困らなくなったように思います。 あらためてRustでよいなと思った点 Testが統合されている Rustはtest用のモジュールを、それぞれのモジュールに含めることができるので、かなり細かいテストまで作成できる、という点はやはりよい点ではあります。 ただ、これには負の点もあって、内部実装を細かくテストしすぎると、リファクタリングとかがめんどくさくなります(private methodをテストするのと同様のことができてしまうので)。 ポインタの心配がない Null dereferenceとかの心配が無いのはよいです。まぁ、その代わりにmutとかborrow checkerとかを確認しなければならない、ということでもあるんですが。 CとかC++とかで生ポインタを触る場合は、super powerを手にしているのと同じようなものなので、注意しなければならない、というのを思い返させてくれますね。 crateが豊富 上でも書きましたが、直近のえらい盛り上がりに比例して、crate数がものすごいことになっています。当然ながらそうなると玉石混交にもなるんですが、やりたいことに対してcrateが見つかるというのは気楽です。 OCamlとかだと、下手したら存在しないから自分で書く羽目になる、とか、メンテナンスが進んでいないやつしかない・・・とかにもなりえます。最近は少なくなってきましたが。 targetを変更してビルドしやすい OCamlでは結構めんどくさいので、これはうらやましい点ですね。まぁ、前提や設計された時代背景がそもそも違うので、単純に比較するとそれはそれで無知をさらけ出すことになりますが・・・。 解決できていない点 Linuxでは動作を確認できているんですが、macOSにおいては、Gatekeeperを突破する方法がいまいちわからず、ダウンロードしたものをそのまま利用することができない状態です。 正当な手段は、Apple Developer IDを取得してきちんと署名する、ということだと思うんですが・・・。 高い Macを保有していないし、macOS向けになにをするわけでもないのに年間$99も払えません プロセスが複雑になる とかなので、基本的には色んなところで配布されているCLIを参考にしてバイパスできるようにしようと思います。 ツールを作ることでの学習 久し振りに簡単なツールを作りきりましたが、やはり簡単でもいいので作りきるということは、個人的に進歩するなぁ、という実感があります。 ...

August 7, 2021 · derui

あえてAZIKの拡張を無効化するという選択肢

今週はワクチン接種とwelcomeランチで、とてつもなく久し振りに何日か連続で部屋のある地域から出ました。すっかりリモートに順応してはいますが、やっぱりリアルで会話すると、人間は五感で会話しているんだなぁ、ってのがよくわかります。 以前AZIK + SKKを利用している、という記事を書きましたが、今回はちょっとそれから色々アップデートをかましたので、それについて書きます。 <!–more–> AZIK + SKKの問題 大分AZIK自体には慣れたのですが、あんまり一貫性のない拡張は利用せず、必要最低限の拡張だけを利用するようにしています(覚えられないとも言う)。 しかし、やはりSKKと利用していると色々な問題があり・・・。 SKKの標準で利用するキーとバッティングする sticky keyとの相性がよろしくない これは後述します SKKを利用していない環境のAZIKと少しずつ異なっているので、体を合わせるのが結構大変 この中でも、sticky keyが色々問題がありました。なのでちょっとそれに対して深掘ります。 SKKのsticky keyで利用されるキー さて、SKKの実装には大抵sticky shiftを実現するためにsticky keyを定義できるようになっています。 少なくとも、私が利用しているddskkとAquaSKKには存在しています これをどのように設定しているのか?を調べてみると、以下のような感じが多そうでした。 セミコロン 変換・無変換キー F + Jなどの同時押し このうち、私が試したことがあるのはセミコロンと変換・無変換キーです。同時押しは、かな入力であればよいと思いますが、SKKで要求される頻度でそれを行うと、まず間違いなく打鍵数がとても増えてしまいます。 変換・無変換キーと親指Enter/SandS 私の利用しているキーボードは、今も変わらず crkbd ですが、このような系統ではEnter/Spaceを親指に割り当てたうえで、レイヤーの切り替えも親指で行うのが大勢となっています。それに加えて、SandSを長いこと利用しているので、それも設定しています。また、日本語・英数の切り替えも親指です。そうすると、親指が担当する機能というのは・・・ レイヤー切り替え Enter Space SandS(実際にはSandEnterも設定してます) Alt/Command 日本語・英数切り替え ・・・というくらいまで拡張されています。普通のUSやJISキーボードであればSpaceとかAltしかないと思いますが、このキーボードでは親指がかなり酷使されます。よく、親指はタフな指なので〜みたいな言説がありますが、実際には親指は支持するための指であり、タフでありますが運動性は高くありません。また、支持が目的であるため、キーボードにおいては他の指と力の入れかたが異なります。そのため、親指に機能を割り当てすぎると、今度は親指の負担が大きくなりすぎる、という問題になります。 ちょうど、無変換にsticky keyを設定してしばらく運用してみたのですが、親指があまりに動きすぎるため、手もブレるし痛みもでやすい、ということがわかったため、これは却下しています。 SandSでやればいいんじゃないの? SandSを設定しているからsticky keyは使っていない、というのも見ましたが、これはあくまで一般的なキーボードを利用しているケースです。↑にあるように、親指に多数の機能が割り当てられているときに、SKKの頻度でSandSをやってしまうと、これまた親指の酷使になります。 じゃあどうするのか ここでの問題は、AZIKにおいては促音「っ」を入力するためにセミコロンが潰されている、という点にあります。 AZIKでは「っ」の入力は常に「;」キーを使います。「あっ、ピカッ」などという入力がとても楽になります。 http://hp.vector.co.jp/authors/VA002116/azik/azikinfo.htm さて、実際に色々文章を入力していると、このような文章を入力する機会はかなり少ないです。正直、このくらいなら xtu で入力しても問題ない・・・。AZIKでは、これで潰した元々の促音入力である tt kk pp ss などに拡張が割り振られています。しかし、これらの拡張は利用頻度を考えると相当少なく、かつ促音を単独キーで入力するときと、結果として打鍵数は同一です。 そこで、以下のようにしてみました。 セミコロンはsticky keyにするので、AZIKの定義から削除 tt ss kk pp などの拡張を削除 結果としては大分シンプルですが、AZIKそのものよりもローマ字入力との互換性が向上したのと、セミコロンというsticky keyに最適な場所を利用できるため、体感的な効率としてはかなり改善しています。そもそもddskk上のAZIKはオリジナルと変わっているので、むしろ拡張しない側にもっていくのは簡単でした。 ddskkだとこんな感じで設定できます。 ...

July 11, 2021 · derui

swayでwindowのタイトルを出したい

7月も半ばに差し掛かりつつありますね。今年はオリンピックのために4連休なので、このタイミングで小旅行に行く予定です。 今回も大分ライトな話題で、swayに今利用しているアプリケーションのタイトルを出したいという話です。 <!–more–> swayとswaybar swayには、swaybarという最上部にあるbarを表示するためのアプリケーションが付属しています。これはi3にあるi3barとほぼ同様の機能を提供しています。 ・・・が、このswaybarには一つ不足している機能があり、 アプリケーションのタイトルを表示する という機能が無いのです。 https://manpages.debian.org/experimental/sway/sway-bar.5.en.html 個人的に、 https://github.com/takaxp/org-onit を利用して時間を計測するようなワークフローになっているため、タイトルが出ていると非常に助かります。 モードラインに出せば?という意見もあると思いますが、モードラインはすでに色々な情報で一杯なので、これ以上増やしてもなー、というのがあります swaybarの代替探し swaybarの代替としては、自前でスクリプトを書くというのもありますが、代替もあります。 その中で一番使われている(と思う)のが、waybarです。 https://github.com/Alexays/Waybar swayのみならず、wlrootをベースとしたcompositerで利用できるようになってます。 こいつだと、タイトル以外にも、色々と表示させることができますし、カスタマイズ性もかなり高いです。というわけで、これを使ってみることにしました。 waybarのカスタマイズ さて、waybarには二つの設定ファイルがあります。一つはwaybar自体の挙動 = 表示する位置やモジュールの種類、位置や設定を設定するためのJSON、そしてスタイリングをするためのCSS、という設定ファイルがあります。 { "layer": "top", "modules-left": ["sway/workspaces", "sway/mode"], "modules-center": ["sway/window"], "modules-right": ["temperature", "memory", "clock"], "sway/window": { "max-length": 50 }, "memory": { "interval": 10, "format": "{used:0.1f}GiB/{total:0.1f}GiB" }, "clock": { "interval": 5, "format-alt": "{:%4Y/%2m/%2d %H:%M:%2S}" }, "temperature": { "hwmon-path": "/sys/class/hwmon/hwmon1/temp1_input", "critical-threshold": 80, "format": "{temperatureC}°C" } } 設定ファイルはこんな感じにしています。temperatureのところは個々人で違いますが、私の場合はCPUの全体的な温度となっています。これ以外にもGPUの温度を出したりもできるはずです。 CSSですが、これはかなり巨大なので、 https://github.com/derui/dotfiles/blob/master/waybar.style.css を参照してもらった方がよいかと・・・。ちなみに、変更点としてはbar全体の高さやフォントの設定くらいです。 カスタマイズしていきましょう せっかくlinuxやswayを利用しているのであれば、かなり自分の好みに合わせて変更していくことができます。これはMac/Windowsにはない利点です。当然ながらそのためには色々調べたりしないといけないですが、その結果として自分のやりやすいようにできていけば、それはそれでよいんではないでしょうか。 ちなみに私は結構デフォルトで満足してしまう(最近はデフォルトでも十分なケースが多い)方ですが、やりづらい場所はできるだけ改善していきたいなぁ、と思ってます。

July 7, 2021 · derui

Emacsでの補完とかを脱ivy/selectrumした

久々(約4年振り)に眼鏡を新調しました。といっても注文して決済しただけで、まだ受け取っていないのですが。 さて、今回はEmacsの補完をivyから完全に切り替えたのでその話を書こうと思います。とはいえかなりライトなお話ですが。 <!–more–> 補完インターフェースの遍歴 なんだかんだ、Emacs(Meadow含め)を使いつづけて早1x年が経過してますが、その間に補完インターフェースはその時々のトレンドに乗ってきました。 Anything Helm Ivy Ivy + posframeもやったりしました selectrum どちらかというと個人的にはこだわりはないので、そのときどきで一番勢いがあるものに乗っかることで楽をしている感じですね。 今回の変更先 ついこの間まではivyからselectrum + consultとなっていましたが、以下の記事を見て、ご他聞に漏れずverticoに変更することにしました。仕事でもそうですが、標準に乗っかるって大事ですね。 https://blog.tomoya.dev/posts/a-new-wave-has-arrived-at-emacs/ selectrumからverticoへの変更 さて、実際に乗り換えたのはインターフェースだけなので、selectrumからverticoへの移行のみが焦点となりました。 ・・・が、そもそもほとんどカスタマイズが不要な状態で(唯一やっていたのはmini-frameくらい)利用していたので、正直ほとんど変更することもなかったです 実際に設定中でもたったこんだけです。 (leaf vertico :straight t :custom ;; 最大20件まで表示するように (vertico-count . 20) :config (vertico-mode)) 個人的には、Interfaceとかはあんまりいじりすぎないようにしています。よほど色がどぎついとかそういうのは弄りますけど。 mini-frameを利用しないようにした理由 さて、selectrumを利用していたとき、ivy-posframeを利用していたのと同じ感じで利用できれば、ということでemacs-mini-frameを利用していました。 しかし、これはこれで結構難点がありました。 現在の視点に関わらず、常に一定の場所に表示される ivy-posframeとかだと、カーソルのそばとかに表示できたりします 配色の問題だが、borderlessなので一瞬境目を見失う といったものが日々利用する上でだんだんストレスになっていました。固定位置なのであれば、正直minibufferを見るのと変わらんやん・・・ということもあり、verticoへの移行を期に削除しています。 migemoるようにした 今回、orderlessとverticoを導入したことで、emacsの補完システム(実はかなり充実している)を利用する形で、結構お手軽に変更できるようになっています。 https://nyoho.jp/diary/?date=20210615 こちらの記事を参考、というかほぼ丸パクリさせていただいて(多少アレンジはしてます)、無事consultでもmigemoることに成功しました。最近はorg-roamでメモを取るようにしているので、ファイル名とかを日本語検索するのが億劫になっていたところだったので・・・。ちなみにmigemoは自作のmigemocamlを利用しています。 そういえば、単独でdictを生成できるようにしたのに、まったく記事を書いていないので、これについては後程記事にしようと思います。 軽快・快適な補完生活を 現在、Emacsのpgtkブランチを利用することで、 Wayland native + native compileな環境を利用できるようになり、かなりEmacs上が快適になっています。これだけ快適になると、さらにVSCodeとかに移行するモチベーションが無くなるのが困ったところですね。 とはいえ、快適な補完は現代的な生活における必需品だと思います。Spacemacsとかではなく、vanillaのEmacsを利用している方は、是非これらのパッケージを利用してみることをお勧めします。快適ですよ。

June 19, 2021 · derui

Linuxで音楽を聞く時に使っているもの

大分前に購入していたけど、ほとんどやっていなかったshapez.ioというゲームを久し振りにやったら、ずっと黙々とやってしまいました。これは時間が溶ける系統や・・・。 さて、今回もライトな話題で、Linuxでの音楽鑑賞をどうやっているか、について書いてみようと思います。 <!–more–> GUI or CUI まず、Linuxでのプレイヤーとしては、CUIベースかGUIベースか、に大別されます。 CUIベース mplayer mpv GUIベース smplayer celluloid VLC …など CUIベースであるmplayer/mpvは、他のplayerのバックエンドとして利用されている(smplayerやcelluloidといったものは、mplayer/mpvのフロントエンドです)ので、実際には本当にインターフェースがCUIなのかGUIベースなのか、という違い程度だと思います。 Spotifyとかは? 私は基本的にオールドタイプなので、ストリーミング(有料会員ならオフラインにダウンロードとかできるらしいですが)で聞く、というのは基本的にやってません。購入した楽曲は手元に置いておきたい、という感じですね・・・。 Youtubeとかで見つけても、その後には楽曲をあらためて別サイトで購入したりするのが私にとっては一般的です。 楽曲の保存 基本的に全ての楽曲はNASに保存しています。ちなみに使っているNASは二代目で、以下を使っています。 https://www.synology.com/ja-jp/products/DS218 これに、WesternDegitalのNASむけHDDを組み合わせて利用しています。 LinuxとはNFSで接続できるので、まー特に問題ありません。Windowsとの相互運用も問題ないので、普通にWindows機とのファイルのやりとりにも利用しています。 何を利用しているのか 私は上記に書いたプレイヤー全部を利用したことがありますが、現状は以下のような形に落ち着いています。 音楽をディレクトリごととかで再生する mpv 動画や、頻繁にシークする音楽ファイルを再生する celluloid プレイリストを見たい celluloid mpvでもシークはできるんですが、どうしても視覚的に直感的ではないため、シークが頻繁におこなわれるものとしてはcelluloidを利用しています。あと、動画とかを一気に見たりする場合は、プレイリストとして常に表示できるGUIの方が便利です。 まぁ、最近は動画についてはストリーミングでしか見ていないので、ほとんどcelluloidは使っていないのですが・・・。 なぜCUIを利用するのか 私が思うCUIの楽さ加減としては、 tmuxとかのターミナルマルチプレクサと併用すれば、裏で流しっ放しにできる ディレクトリ内を一括で入れたりするのが簡単 ファイル数が多すぎると、コマンドラインの最大長を超える可能性もありますが GUIが無いのでとても軽い という点です。私の環境ではWMとしてswayを利用しているので、GUIを起動するとどうしても邪魔になりやすい、というのがあります。 floating windowは、場所をずらしたり調整したり、後邪魔になったときに避けないといけないので、あんまり利用してません。 他の人はどうやってるんだろう 最近はもう基本的にストリーミングサービスを利用している、という方が大半だとは思います。私は今でも専用のメディアプレイヤーにmp3なりを突っ込んで聞いている、という人なので、基本的にはオフラインで聞けることを優先しています。 ストリーミングを利用している人の場合、基本的にはそのサービスのクライアントを利用するんだと思いますが、それって無駄に重いし邪魔じゃない?という思いもあります。機会があれば聞いてみようかなー、と思います。(私の周辺はみんなオールドタイプなので)

June 13, 2021 · derui

org-roamでjournalを書いてみている

気付けば今年ももうそろそろ半分が終わろうとしている、という恐怖の事態。なんか毎年言っている気がしますが。年々早くなっている気がしますな。 今回はライトな話題で、org-roamでjournalを書くようにしてみている話です。 <!–more–> org-roamとは まずパッケージの紹介ですが、 org-roam というパッケージがあります。これは、Roam Researchというサービスをorgに移植したものです。 Roam Researchというサービスは、 Zettelkasten Method というメモの方法論を基に実装されたようで、色々なメモを有機的に結合することで、知識の整理や発想を促す・・・という感じのもののようです。 org-roamはローカルでだけ動作するので、特にサーバーとか不要で、orgファイルさえ共有できれば、どこでも利用できるというのが強みですね。 ただし、検索速度とかを向上させるために、sqlite3を利用しているのと、グラフを作成するのにgraphizを利用しているので、それらが利用できるプラットフォームである必要があります。 最近のメモとかは基本的にすべてorg-roamに書き溜めるようにしています、が、リンクをするのがめんどくさいなど、いくつか課題がありますが・・・ org-roamのjournaling機能 org-roamは、org-modeよろしく非常に多彩な機能が含まれていますが、その中に dailies という機能があります。 https://www.orgroam.com/manual.html#Daily_002dnotes org-journalほどは機能があるわけではないけど、必要最低限の機能はあって、かつroamと統合されている・・・というようなのが特徴です。 今の私の設定はこんな感じになってます。 (leaf org-roam :after org :straight t :if (and (file-exists-p my:org-roam-directory)) :custom ((org-roam-db-update-method . 'immediate) (org-roam-db-location . my:org-roam-db-location) (org-roam-directory . my:org-roam-directory) (org-roam-index-file . my:org-roam-index-file) ;; dailiesを保存するdirectory (org-roam-dailies-directory . my:org-roam-dailies-directory) (org-roam-capture-templates . '(("d" "default" plain (function org-roam--capture-get-point) "%?" :file-name "%(format-time-string \"%Y-%m-%d--%H-%M-%SZ--${slug}\" (current-time) t)" :head "#+title: ${title}\n- tags :: " :unnarrowed t))) ;; dailiesのcapture (org-roam-dailies-capture-templates . '(("d" "default" entry #'org-roam--capture-get-point "* %<%H:%M>\n%?" :file-name "daily/%<%Y-%m-%d>" :head "#+title: %<%Y-%m-%d>\n" :olp ("Journal"))))) :bind ((:org-mode-map :package org ("C-c r" . org-roam-insert))) :hook (after-init-hook . org-roam-mode)) この設定だと、captureを起動すると、 ...

June 5, 2021 · derui