yhara.jp

フィード

記事のアイキャッチ画像
yhara配列(2025) - 30%キーボードを実用する
yhara.jp
これはキーボード #2 Advent Calendar 2025 - Adventarの記事です。9日目がまだ空いていたのでお邪魔しました。前日の記事はkiyokaさんによる親指Ctrlの話でした。私もEmacsで小指を痛めたことがあります(懐かしい)。翌日の記事はt-miyajimaさんによるPuszleの紹介でした。4段目の下にさらに一段あるのは面白いですね。ケースもすごい。てか工房もすごい。30%キーボードを実用する今年はDetour、acai、littolと40%未満のキーボードを使う年でした。特にlittolは29キーとすごく小さいですが、工夫の結果、いくらかのタイプミスはあるものの仕事で普通に使えるくらいになりました。本記事ではそのキーマップを紹介しようと思います。↑littol。かわいいね↑acai。見た目重視で最下段に6uスペースバーを選んだため、打鍵難易度が上昇↑detour。最下段が充実しており、35%キーボード入門に最適Ctrl, Shift30%キーボードで最初に考えないといけないのが「ShiftとCtrlどこに置く問題」です。私はプログラマーなのでこの2つは押しやすい位置にいてほしい。かつ、ノートパソコンのキーボードや40%キーボードのときの配列と行き来したときに大きな違和感がないことが望ましい。ということで採用したのがこれです。AキーをCtrl、ZキーをShiftと兼用する。qmk firmwareでいうMod-Tapというやつですね。40%のときと比べると少し右にずれているだけなので、これが意外に押しやすいんです。というか慣れるとむしろ40%のキーが遠く感じられるくらい。これだけだとCtrl-AやShift-Zを押すことができないため、右端にも兼用キーを用意しています。左右対称なので覚えやすい。ちなみにベースレイヤーにセミコロンが置いてあるのは、AZIKでよく使うためです。AZIKはいいぞ。数字レイヤFキー長押しで、右手側がテンキーになります。40%キーボードのときは横一列に並べてたんですが、30%だと押しづらいため、テンキー配列に変更しました。ファンクションキーも同様の配列でレイヤを用意し、Qキーに割り当てています(たまにしか使ってないですが)。移動レイヤスペースキーを長押しすると、カーソルキーなどを入力できます。40%のときは左右に
11日前
記事のアイキャッチ画像
Hello Worldが動かなくなった
yhara.jp
これは言語実装 - Qiita Advent Calendar 2025 - Qiitaの16日目の記事です。私はShiikaというRuby風文法の静的型付け言語を作っているのですが、今年はずっと非同期処理の対応をしていて大きな話題(新機能とか)がないため、日々のデバッグの様子を紹介しようと思います。現象開発中のブランチで、いつのまにかputs "Hello"が動かなくなっていました。$ ./a.outthread '<unnamed>' (43953217) panicked at lib/shiika_ffi/src/core_class/string.rs:43:17:null pointer dereference in SkString::value() - value field is nullどうやら出力すべきデータがnullになっているようです。ところで上記ではコマンド名がa.outになってますよね?これだけで実はやっかいなバグだとわかります。なぜか。バグの種類Shiikaのバグはたいていの場合、「コンパイラが落ちる」という形で現れます。ShiikaコンパイラはRustで書いているので、この場合デバッグはdbg!マクロとかで普通にやればいいだけです。ところが、たまに「実行ファイルの生成までは成功するが、それを実行すると落ちる」というパターンがあります。こうなると途端に取れる手段が限られてきます。ライブラリ部分にdbgを入れるまず簡単にできるのは、ライブラリ関数にデバッグプリントを入れることです。Shiikaの組み込みメソッドの一部はRustで実装しているので、その部分に限りdbg!が使えます。試しにやってみましょう。 --- a/lib/shiika_ffi/src/core_class/string.rs +++ b/lib/shiika_ffi/src/core_class/string.rs @@ -50,4 +50,13 @@ impl SkString { pub fn as_str(&self) -> &str { std::str::from_utf8(self.value()).unwrap() } + + pub fn inspect(&self) { + unsafe { + dbg!(self.0); + dbg!((*self
11日前
記事のアイキャッチ画像
Advent Incremental感想
yhara.jp
この記事は放置ゲー・インクリメンタルゲーム Advent Calendar 2025 - Adventarの14日目の記事です。クリッカーゲームに脳を焼かれた人間による布教記事|たのんこちらの記事で知ったAdvent Incrementalをプレイしました。ちょうど12月ですし。Advent Incrementalとはクリスマスをモチーフにしたインクリメンタルゲームです。第1日から第24日までの24ステージに分かれていて、12/1から始めて1日1ステージずつ攻略するのがいちばん良いと思うのですが、今回は「時間に追われながらプレイすることになったら嫌だな…」と思ったので、クリスマスを待たずに巻きでプレイすることにしました。デフォルトだと当日になるまでステージが解禁されないんですが、OptionsのIgnore dateを設定することで先に進めるようになります。良かったところ1ステージ目はよくあるシンプルなインクリメンタルゲームなんですが、24個もステージがあるということで、凝った見た目やギミックのやつもいくつかあって良かったです。あのバーがびよんびよんするやつ楽しかったなあ。アップグレードで止めやすくなるのもいい。DayをWrappingするくだりは、過去のステージを再利用する形になっていて、tomerunさんが9日の記事で書かれていた初期要素が無意味になる問題がある程度ケアされているなあと思いました。ただあんまり過去をふり返る必要があると、見るところが多すぎて大変になったり、アップグレードが追加されたのを見逃したりしやすいんですよね。そのあたりもなかなか良いバランスだったんじゃないでしょうか。最後に、終盤のFactoryの様子を貼って終わりにしたいと思います。まだまだ詰められそうだけど、そこまでは要求されなかったですね。
12日前
記事のアイキャッチ画像
今年プレイしたincremental game
yhara.jp
勢いで放置ゲー・インクリメンタルゲーム Advent Calendar 2025 - Adventarというのを立てたので、今年の振り返りをします。Your ChronicleSteam:Your Chronicleお盆くらいから始めましたが、マジで全然終わる気配がないです。それでいて周回ごとに少しずつ変化があるんで飽きてない。難易度調整力がすごい。このジャンルとしては、しっかりしたストーリーがあるのも(そうでないやつばっかりやってる人間としては)新鮮で良かったです。来年もやるつもりです。詳しい進捗はプレイログの方に書いてるんで省略します。EvolveEvolve私の愛してやまないブラウザゲー、Evolve incremental。僕以外にやってるプレイヤーを見たことがないんですが、なんと今年になって公式翻訳に日本語が追加されました。(ということで少なくとも日本にもう1人はプレイヤーがいるはず) いままで英語オンリーはな〜という理由で後回しにしていた方も、この機会にぜひプレイしてほしいです。内容は「進化」というタイトル通り、何もない原始の惑星の生命のスープに宿ったあなたが生命へと進化し、文明を築き、築いた文明を作っては壊し作っては壊し…というゲームです。もう3年以上やってるんですがまだ味がします。Idle Game 1Idle Game 1 - Google Play のアプリ‎Idle Game 1アプリ - App Storeまだこのブログで紹介したことないんですが、実はやってましたという一本。まずスクショを見てほしいんですが:どうでしょうかこの人を選ぶ感じ。ストーリーとかは無いに等しくて、ただただ数字を増やす喜びだけがそこにあります。最高。ゲームとしても、そろそろクリアか〜と思ったとこまでが実はチュートリアルだったりしてなかなか面白いです。ただまあ延々とランダム当たり待ちをする忍耐ゲーなので、がっつりやるというよりはときどき起動して少しずつ進捗するのがいいかも。スマホゲーだし。起動速いし。あ、一個だけ重要な問題点を挙げると、このゲームログイン不要な代わりにデータ引き継ぎの仕組みがありません。機種変後はまた最初からプレイするしかない、という漢気仕様です。スマホを新調する予定がある人は買い替えが終わってから始めたほうがいいかもしれません。Idle Planet M
22日前
記事のアイキャッチ画像
yhara配列(2024)
yhara.jp
yhara配列(2024)は、私が2024年時点で使っていた40%キーボード向けキー配列である。概要Ergodox EZに始まり、Let's Splitなどを経由し、徐々にこの形に固まっていった。ベースレイヤー基本はQWERTY。Aの左は、CtrlとEscを兼用している(単押しでEsc、長押しでCtrl)。QMK FirmwareではMT (Mod-Tap)という機能で実現できる。Lの右にはセミコロンを置いている。これはAZIKのため。数字レイヤー数字とファンクションキーを横一列に置いている。数字は最上段ではなく、一段下に置く。ファンクションキーよりも使用頻度は高いから、ホームポジションに近いほうがいいでしょう?記号レイヤーErgodox EZ時代から少しずつ煮詰めてきたもの。「この記号はなんとなくここっぽい」みたいな感覚で決めた。括弧類は右中指・薬指で押せるよう統一した。画像に入れ忘れてるけど、Nのところが"、Mのところが+。プログラマーなので、すべての半角記号が打てるようにしてある。カーソルレイヤーHJKLでカーソル移動。Home, Endもこのレイヤーで入力できるようにしている。一部環境だとCtrl-a, eで代用できるけど、例えばWindowsだと通用しなかったりするので、環境によらず同じキーが使えるとストレスフリー。日本語入力切り替え数字レイヤーと記号レイヤーの切り替えキーを短押しすると日本語入力のオン・オフになる。
1ヶ月前
記事のアイキャッチ画像
Idle Planet Minerにドはまりしていた
yhara.jp
Idle Planet Minerが一段落したのでプチ攻略を書く。Idle Planet Minerとはスマホ向けの放置/incrementalゲーム。宇宙で鉱石を掘り、アイテムを作成して、銀河全体の価値を上げていき、いいところで売却してアップグレートを得る。その繰り返し。単純だけどいろいろ良くできてて楽しかった。やめた理由プラチナリーグまで到達し、ゲーム進行がだいぶ緩やかになってきたからYour Chronicleを始めたのでそれどこでなくなった一番やってたときのスケジュール土日にPvPイベントがあるので、毎回参加するPvPではあるが攻撃とかはないので、淡々とプレイするだけ。ときどき順位を見て上がってると嬉しい週に2回Challengeモードをやる最大24時間でどれだけスコアを稼げるかというモード。報酬がおいしい終了後3日間のクールタイムがあるが、12時間以内で切り上げることで週に2回プレイできる上記のPvPと同時にはできない土曜の昼~月曜の昼くらいでPvPをやり、終わったらChallengeを開始。月曜夜に切り上げて金曜夜くらいまで継続。金曜夜に2回目のChallengeを開始。というのが効率がよい、と気づいたのは公式Discordを見てからで、それまではPvPはあんまり参加してなかった。システムが分かってきてからでもよいと思う。逆に、モチベが高くて効率を最大化したいなら月~金の間に何度か売却を挟むほうがよいのかもしれない(あんまり分かってない)。翻訳について日本語も選べるが、「Smelt」(精錬する)が「ワカサギ」になってる箇所があったりして変だったので英語でプレイしてた。情報ソース海外Wiki https://idle-planet-miner.fandom.com/wiki/ItemDiscord (ゲーム内ヘルプから飛べる)課金このゲームが気に入って少し課金してもいいかと思ったなら、まずは広告を外すオプションを買うのがいい。広告がなくなるだけでなく、デイリーボーナスがもらえるようになる。あとはイベント期間中だけ強化が入るやつとかいろいろあるけど、永続するやつが何個かあったと思うので、先にそっちをチェックしよう。
4ヶ月前
記事のアイキャッチ画像
A Solitaire Mystery 簡易解説&攻略&プレイログ
yhara.jp
『A Solitaire Mystery』の簡易解説とプレイログです。主にバージョン1.5.6あたりで書いていますA Solitaire MysteryとはあのBABA IS YOUの作者による変形ソリティア集。その前の変形倉庫番集みたいなやつはできる気がしなくてスルーしてたんですが、ソリティアならできるかも…?ということでチャレンジ。ルールはまだ英語版しかないですが、翻訳してくれた方がいるので参考にどうぞ。TAP SOLITAIRE公式難易度:★★★ 体感難易度:★★+ 重ねられる条件:降順(スート関係なし)カードを「タップ」して土台にできるソリティア。BABA IS YOUのキャラがあしらわれたかわいいカードですね。「B」はBABAのB、「K」はKEKEのKみたいにキャラ名がついたカードが通常のエースなので、まずはこれを右のゴールエリアに置くことを目指そう。BABATAIRE公式難易度:★★★★ 体感難易度:★★+ 重ねられる条件:降順(スート関係なし)『BABA IS YOU』と合体したソリティア。これも4キャラがスートになっているが、「IS」のようなルールカードもあり、例えば「BABA IS KEKE」を縦に作るとBABA(スート)がKEKE(スート)として扱われるように変化する。IS ON SAME:同じスートなら数字関係なく積めるようになる。IS ANY SUIT:スート関係なく積めるようになる。IS OPPOSITE:数字が逆になる(10が1になるなど)IS +5:数字が+5される(10以上は1に戻る)同じスートはまとめて持てるので、ON SAMEがとにかく強かった。ELDRITCH INVASION公式難易度:★★ 体感難易度:★★ 重ねられる条件:折り返しあり、同スート不可モンスターを倒すソリティア。ゴールエリアはなく、全てのモンスターを倒しきれればクリア。枠が紫なのがモンスターカードで、開いた瞬間に襲ってくる。モンスターの右に2枚のカードを置き、合計が一致すると倒すことができる。つまりエースは1ダメージしか与えられない…と思いきや、エースに限りスートが一致すると特攻ダメージ(7点)が出る。カード枚数的に最低1回は特攻を出さないとクリアできないらしい。ソリティアに夢中になっていると、戦闘枠が埋まっているのにモンスターを開けてしまい食べられてしまいそ
5ヶ月前
記事のアイキャッチ画像
ObsidianとLogseqのオーバーレイで、日誌をうまく扱う
yhara.jp
ObsidianとLogseqはどちらもローカルMarkdownファイルを扱うツールなので、実は一つのリポジトリをObsidianとLogseqで同時管理することができる。同時管理?なぜそんなことをしたいかというと、僕の場合はこういう事情だ。家ではメモの管理にObsidianを使っている。仕事でも仕事メモの管理にObsidianを使っている。仕事用PCでも、家庭メモを編集したい場合がある。Obsidianを2個起動すると操作がわずらわしい(というかそもそもできるのかも知らん)ということで、仕事用PCで家庭メモを編集するときだけLogseqを使っている。やり方は簡単で、単にLogseqを起動してObsidianの保存フォルダを開くだけ。日誌これでだいたいいいのだが、デイリーのメモの管理だけ少し工夫が必要だった。ObsidianもLogseqも、日次のメモファイルを自動で作るような機能がある。が、普通にやるとそれぞれ別の場所にファイルを作ってしまうので、できれば統一したい。これに関してはLogseqの方が設定が貧弱なので、必然的にLogseq側に合わせることになる。まず、Logseq→設定→カスタム設定(config.ednを編集)で、一番最後の}の前に :journal/page-title-format "yyyy-MM-dd" :journal/file-name-format "yyyy-MM-dd" を入れる。次にObsidian側で、設定→Daily notes→New file locationをjournalsにする。これでどちらのツールで日誌を作ってもjournals/2025-01-01.mdのようなファイル名になるはず。
6ヶ月前
記事のアイキャッチ画像
vimの環境を見直した
yhara.jp
久しぶりにvimプラグインをいろいろ見直してみた。パッケージマネージャVundleからJetPackに移行。Vundleに特に不満があったわけではなく、たまには新しいのも試してみるかの精神。JetPackは、プラグインのインストール時のUIの見栄えがよい。とりあえず当面使ってみる。起動画面Startifyを入れた。起動時に、最近開いていたファイルの一覧から選べるのが便利。実は起動画面だけでなく、セッションを./Session.vimに自動で保存するという機能がある。前はそのために別のプラグインを入れていたがこれに移行。Jetpack 'mhinz/vim-startify' let g:startify_change_to_dir = 0 " カレントディレクトリを変えてほしくないのでオフ let g:startify_session_autoload = 1 let g:startify_session_persistence = 1ファイルオープンCtrlPからfzf.vimに移行。外部コマンドを必要とするかわりに速い。コマンドも実はjunegunn/fzfを入れれば入るのでそんなに面倒はない。コマンド名が:Buffersみたいに名前空間が付いてないのが気に入らない、と思ったが設定で付けることもできるようになってて、さすが。現在は:FzfBuffersみたいな名前で使っている。ファイル一覧は.gitignoreを適用したかったので、rgコマンド(ripgrep)を起動するようカスタマイズした。Jetpack 'junegunn/fzf', { 'do': { -> fzf#install() } }Jetpack 'junegunn/fzf.vim' let g:fzf_vim = {} let g:fzf_vim.command_prefix = 'Fzf' nnoremap <Space>u :FzfFilesWithIgnore<CR> command! -bang FzfFilesWithIgnore \ call fzf#run({'source': "rg --files", \ 'sink': 'edit', \ 'window': { 'width': 0.92, 'height': 0.7 } \ })コンパイラの起動前はquickrunを使っ
8ヶ月前
記事のアイキャッチ画像
RubyKaigi 2025 松山に参加しました
yhara.jp
今年も会社の支援のもとRubyKaigi 2025に参加してきました。今年はTRICK 2025の審査員ということでスピーカーTシャツでした。今回は過去一の投稿数で、選ばれた方もそうでなかった方も、ご応募ほんとうにありがとうございました。最後にちょろっと言いましたけど実はもう一個応募した作品があったんですよね。けっこう評判よかったんですけど、よく見たらサイズ規定をオーバーしてたという…。次こそは余裕をもって作業にとりかかるぞ(って毎回言ってる気がする)。セッションスライドは https://scrapbox.io/ruby-jp/RubyKaigi_2025 にまとまっています。Make Parsers Compatible Using Automata Learning - RubyKaigi 2025系の外側から中身のオートマトンを推測する話。そんな技術があるんだ。最初にSummaryがある構成、すごく良いと思った。 - 図にするとprismとlramaで全然違うのがわかって面白い。(でも同値である可能性も一応ある…のかな?)The Evolution of the CRuby Build System - RubyKaigi 2025CRubyのビルドシステム(./configureとか)について。現状はだいぶ複雑だと思うんで、まとめてあるだけで偉業というやつ。Shakeの話は出なかったけど、Haskell製のビルドシステムらしい。へえ。どのへんに影響を受けてるのかな?次回の発表も楽しみ。Continuation is to be continued - RubyKaigi 2025聞けなかったやつ。callccは利用率から考えると正直いつ消されてもおかしくないと思ってるんだけど(例えば動かなくなったタイミングで)、shift/resetとして蘇ったら熱い。Goodbye fat gem 2025 - RubyKaigi 2025gem作者が各プラットフォーム向けのバイナリをビルドしたりセキュリティパッチを反映するのは大変だが、このままでいいのか?という問題提起。うーんたしかに。nokogiriはインストールが簡単でいいんですけど、例えばlibxml2に脆弱性が見つかるたびにnokogiri作者が頑張らないといけないんですよね。これを、gemspecで「apt
8ヶ月前