ねこみみすと工房 👋
最近の興味範囲は 自作PC・自作キーボード・3Dプリンタ(SnakeOilXY-3S/VORON V0.739/VORON VT.496/QIDI PLUS 4)と艦これ。
刷新前のコンテンツは Hello あたりを参照すれば辿れます。
現コンテンツ 上の search / archives / categories / tags あたりを参照のこと 古いコンテンツ 2017年あたりまでのWeb日記 古いえろ小説 連絡先 bluesky https://bsky.app/profile/nekomimist.org Fedibird https://fedibird.com/@nekomimist misskey.io https://misskey.io/@nekomimist X(Twitter) https://x.com/nekomimist github http://github.com/nekomimist
メモの取り方の話 思考のメモなどを取る時、昔々はhowmで書いていて、ある時からorgで書くようになって、最近はdenoteをorgフォーマットで使っている。いずれの形式でも1メモ1ファイルになるので、メモが大量になると管理が大変になる。 howmは自前の検索機構でよいが、orgにした時はdeftを使っていた。deftの仕様はたいへんよいのだが、ピュアEmacs Lispなので、ファイル数が増えるとむちゃくちゃgcが走ってとても反応が悪くなる。 で、xeft で、2023年の1月から検索にxeftを使っている。これはバックエンドにXapianを使っていて、高速な検索がウリである。正規表現が使えないためmigemoが使えないという欠点はあるが、migemoがないと日本語の検索ができないdeftと違って、日本語を直接入力できるのでそこまで困らない。 ……のだが、xeftは一覧表示がそっけない上に、あまりカスタマイズの余地もなく、そこにちょっと不満がある。deftに慣れていたので、ファイルの最終更新日付も一緒に出したいのだ。 で、確認すると、タイトルを抜き出すための関数は登録できるようになっていたので、下記のようなファイル名の前に日付をつけるような関数を作ってxeft-title-functionに設定してみた。 ;; 一覧にファイルの最終更新日時を入れる (defun my/xeft-title-and-date (file) "Return the title of FILE with its last modification date." (let ((last-mod-date (format-time-string "%Y-%m-%d " (nth 5 (file-attributes file))))) (re-search-forward (rx "#+TITLE:" (* whitespace)) nil t) (let ((bol (point)) title) (end-of-line) (setq title (buffer-substring-no-properties bol (point))) (if (eq title "") (concat last-mod-date (file-name-base file)) (concat last-mod-date title))))) (setopt xeft-title-function #'my/xeft-title-and-date) これでファイル名の前に日付が出るようになった。 あと、検索画面でexcerptが出るのはいいが、2.7行分も出る上にそこにdenoteのfront matterやらorgのoptionsやらが含まれてしまって邪魔臭い1。行数を減らしてかつ不要な情報は出さないようにしたいなと思って、元のxeft–file-excerptをちょっと書きかえて、advice-addでoverrideしてみた。 (defun my/xeft--file-excerpt (file search-phrase) "Return an excerpt for FILE. Return (TITLE EXCERPT FILE). FILE should be an absolute path. SEARCH-PHRASE is the search phrase the user typed." (let ((excerpt-len (floor (* 0.7 (1- (window-width))))) (last-search-term (car (last (split-string search-phrase)))) title excerpt) (with-current-buffer (xeft--work-buffer) (widen) (erase-buffer) (setq buffer-undo-list t) (insert-file-contents file nil nil nil t) (goto-char (point-min)) (setq title (funcall xeft-title-function file)) (narrow-to-region (point) (point-max)) ;; denoteのfront matterとorgのoptions/startupの最後の行の ;; 次の行からexcerptに入るようにする (when (string-equal (file-name-extension file) "org") (let ((case-fold-search t) (options "\\(OPTIONS\\|STARTUP\\|DATE\\|IDENTIFIER\\|FILETAGS\\)")) (goto-char (point-max)) (when (re-search-backward (concat "^#\\+" options ":.*$") nil t) (forward-line) (narrow-to-region (point) (point-max))))) ;; Grab excerpt (setq excerpt (string-trim (replace-regexp-in-string "[[:space:]]+" " " (if (and last-search-term (search-forward last-search-term nil t)) (buffer-substring-no-properties (max (- (point) (/ excerpt-len 2)) (point-min)) (min (+ (point) (/ excerpt-len 2)) (point-max))) (buffer-substring-no-properties (point) (min (+ (point) excerpt-len) (point-max))))))) ;; Return result (list title excerpt file)))) (advice-add 'xeft--file-excerpt :override #'my/xeft--file-excerpt) 適当なわりに自分の用途ではそれらしくは動いているので、まあよし。 ...
avyでmigemoりたいのに…… Qiitaのavyならなんでもできるを読んで、「そういえばavyって真剣に試してみたことないなあ」と思い、 書いてある通りにやってみたらわりとよい感じだった。 だが、日本語が多い局面だとavyで飛べない事が多い。こういう時はmigemoが使いたくなる。で、調べてみると avy-migemoがあるのだが、どうもissueなど見ていると最近はメンテされてない様子。 別にそんな凝ったことをしたいわけじゃないんだよ、ということで再度調べると avy で migemo る (avy-migemo を使わずに)が見つかる。これこそ欲しかったものだ。そのままいただこう。 ……しかしavy-goto-migemo-timerを実行して何か1文字入力するとout of range(だったと思う)が出てうまく動かなかった。 原因 migemo-get-patternが、入力長さがmigemo-isearch-min-length未満の時に""を返すのが原因である。私の設定だとmigemo-isearch-min-lengthが2なので、1文字入れると""を食らってavy–read-candidatesがエラーを返すのである。 じゃあこの時だけ1にしてあげようと、avy-goto-migemo-timerの中のletでmigemo-isearch-min-lengthを1にしてみると、だいたい問題ないのだが、ふとcを入力すると"too long ほげほげ"1とか言われしまって幸せになれなかった。2 そもそも、本来のmigemoの動作だってmigemo-isearch-min-lengthが未満の時は、引数をそのまま返したほうが幸せになるんじゃないの?とふとと思ったので、下記のようなadviceを入れて対策とした。 (defun my/migemo-get-pattern-advice (func word) (let ((ret (funcall func word))) (if (string-equal ret "") word ret))) (advice-add 'migemo-get-pattern :around #'my/migemo-get-pattern-advice) migemo-isearchとavy-goto-migemo-char以外の用途で何か副作用があるかもしれないが、まあ、そう悪い挙動にはならない気もする。 1 何が出たのかメモってなかった。 2 そもそも1文字の時にmigemoが動いてもいらんものがひっかかってあまり嬉しくなかったからmigemo-isearch-min-lengthを1にしているわけで、まあ当然といえば当然である。
はじめに Emacsの起動高速化については、とても定評がある記事がある。 Emacsの起動時間を""詰める"" Emacsを世界最速級で起動する方法 これを参考にすれば誰でも起動速度を"詰める"ことはできるはずで、あまり俺ごときが追加で書くような 話はないのだが、自分なりのメモを残しておこうと思う。 leaf.elとpackage.elでの起動高速化を目指す 本件はleafでパッケージ設定を書き、パッケージ管理をpackage.elにまかせつつ高速化する話で、 実のところ最速を狙う手法ではない。まあ最速じゃなくてきっと意味はあるよね……ということで。 遅延初期化 通常Emacsでの遅延初期化は、他の.elを読んだら評価する(with-eval-after-load)や、 書かれた関数・変数が使われたら呼ぶ(autoload)に頼ることになるのだが、 package.elを使いつつemacs-init-timeを100ms未満にしようとするなら、もう一歩踏み込む必要がある。 遅延実行 まず、Emacsを起動した後、あまり使わないパッケージの初期化が全部終わってなくてもエディットは 始めていいはずだ。よって、よくある例と同様にEmacs起動後に遅延評価させるようにする。 ;; after-init-hookで順次登録された関数を実行する (defvar my/delayed-configs nil) (defvar my/delayed-config-timer nil) (defvar my/delayed-config-done nil) (eval-and-compile (defconst my/prio-low 1) (defconst my/prio-normal 10) (defconst my/prio-urgent 100)) (defun my/add-to-delayed-configs (priority config) "Add CONFIG with PRIORITY to delayed configs." (if my/delayed-config-done (condition-case err (eval config) (error (message "my/delayed-config exection error: %s" err))) (push (cons priority config) my/delayed-configs) ;; sort the configs by priority (setq my/delayed-configs (sort my/delayed-configs (lambda (a b) (> (car a) (car b))))))) (defun my/execute-config (config) "Execute a single delayed CONFIG safely." (let ((inhibit-message t)) (condition-case err (eval config) (error (message "my/delayed-config execution error: %s" err))))) (defun my/execute-delayed-configs () "Execute delayed configs using timer for urgent priority and idle timer for others." (if my/delayed-configs (let* ((config-pair (pop my/delayed-configs)) (priority (car config-pair)) (config (cdr config-pair))) (if (>= priority my/prio-urgent) ;; For urgent priority, use run-with-timer (run-with-timer 0.1 nil (lambda () (my/execute-config config) (my/execute-delayed-configs))) ;; For normal and low priority, use run-with-idle-timer (run-with-idle-timer (if (>= priority my/prio-normal) 0.5 1.0) nil (lambda () (my/execute-config config) (my/execute-delayed-configs))))) (setq my/delayed-config-done t))) (add-hook 'after-init-hook 'my/execute-delayed-configs) (defmacro with-delayed-startup-exec (priority &rest body) "Execute BODY after init with delay, according to PRIORITY." (declare (indent 1)) `(my/add-to-delayed-configs ,priority ',(cons 'progn body))) priorityをつけたので先例より実装がちょっとだけ大きくなったが、見ての通り大した事はしてない。 ...
自作キーボード これが2022年末ということは、ほぼ1年進捗なしということになる。 ネジ用のスペースのなさがつらかったが、まあなんとか完成。ちょっと使ってみてキー配置に問題なさそうなら基板を作ろうかな pic.twitter.com/dbhMtvyk9j — いずみたすく (@nekomimist) December 10, 2022 2023/1に当時最新のqmkに合わせて自分のキーボードのソースを書きかえたりしたけれど、それも1年前なので、また追随しなければいけないが、qmk側の都合による変更であって、自分のキーボードの機能が不足しているわけではないので、どうもやる気が出ない。 2024年は2つくらいキーボードのネタがある。 nekonos1の改版 上のpostはSU120で作ったものだが、同じレイアウトで自分に設計した基板に変えたい。Adafruit KB2040が2つ手元にあるのでこれを使う。まあ、あまりピン配置はPro Microと変わらんので、Pro Microでも作れるようにはする。 3Dプリンタケースと合わせて設計したいので、やる事が多くてやる元気がでるかどうかは不明。 nekonote1 昔te96で作った nekonote0の改版。18x16ピッチを18x17ピッチに変える。BLE Micro Proで作るくらいな感じで。 薄さと丈夫さを兼ねそろえたいと思うとケースは悩ましいが、基板サンドイッチ構造でいいのかも。 3Dプリンタ KP3S 1.0をSnakeOilXY-3Sに改造した。 これが、 VORON 0.1を作ってからほぼ使ってない、わりと素に近いKP3S 1.0。のんびりSnakeOilXY-3Sにしていく予定 pic.twitter.com/A8RBoa29Dc — いずみたすく (@nekomimist) January 28, 2023 こうなった。 SnakeOilXY-3S、もうちょい調整はいるけど動くようにはなったな pic.twitter.com/SLrjZQ0fVJ — いずみたすく (@nekomimist) September 9, 2023 カッコいいし、安定度も高く満足度は高い。 VORON 0.1 VORON 0.1はSherpa Miniの部品破損トラブルがあったのを直したのみ。 構成がシンプルなのでExtruderまわりの断線とパーツ破断以外はほぼトラブらないよい子。 さらに調べると今までももよく割れてたShelpa miniのIdler armの根本がまた割れてた。なんとかしたいなこれ…… — いずみたすく (@nekomimist) September 20, 2023 VORON Trident 2022年末にCAN toolheadてそこに由来するトラブルは1年間特に発生しなかった。 ...
起動速度のこと init.elの初期化処理で時間がかかる事は起動後にやるようにした。 参考文書は定番とも言える下記2点。 Emacs の起動時間を""詰める"" Emacsを世界最速級で起動する方法 (defvar my/delayed-configs nil) (defvar my/delayed-config-timer nil) (eval-and-compile (defconst my/prio-low 1) (defconst my/prio-normal 10) (defconst my/prio-urgent 100)) (defun my/add-to-delayed-configs (priority config) "Add CONFIG with PRIORITY to delayed configs." (push (cons priority config) my/delayed-configs) ;; sort the configs by priority (setq my/delayed-configs (sort my/delayed-configs (lambda (a b) (> (car a) (car b)))))) (defun my/start-delayed-configs () "Execute `my/delayed-configs` list using a timer. Start a timer to run each config in the list with a default interval of 10ms. The timer runs until all configs are executed, then it stops. Customize interval with `my/delayed-config-interval`. Delayed configs can impact your Emacs environment." (setq my/delayed-config-timer (run-with-timer 0.0 0.01 ; start after 0ms with 10ms interval (lambda () (let ((inhibit-message t)) ;; if there is a config, execute it (if-let (config (cdr (pop my/delayed-configs))) (eval config) ;; if there is no config, cancel the timer (cancel-timer my/delayed-config-timer))))))) (add-hook 'after-init-hook 'my/start-delayed-configs) こんなのを書いて、 ...
FreeBSDのファイルサーバを停止して、Synology DS923+に変更 Core i7 8700K+メモリ32GB+HDD9台(3TB×5+4TB×4)のFreeBSDマシン、HDDを大容量に移行するのも面倒だし、PC的には限界だったのでかわりにSynology DS923+HDD3台(20TB×3)を購入した。 長い間FreeBSDマシンが自宅で稼動していたので、無くなるのは寂しくもある。まあ、あまり活用もできていなかったのでしょうがない。 メインデスクトップPCの段階的な構成変更 いろいろあった。 Stable Diffusion webuiによるAI描画にハマる。 VRAM 8GBのRTX3070だとLoRA学習が厳しい事もあり、VRAM 12GBのRTX4070Tiと電源を買う。 WindowsのGPUとして使った上で、CUDAで利用するとメモリのフラグメントでよくエラーになった。生成やLoRA作成が止まるだけでなく、Windows表示そのものが死んだりもするので実につらい。 RTX3070+RTX4070Tiの2枚指しにして、RTX3070をWindows画面用に専念させたら快適😄 ASRock X570 Steel Legendの制限により、RTX3070+RTX4070Tiの2枚指しにすると、10GbEのフル帯域を出せるPCIeスロットが余らなくて、LANの性能がかなり落ちた メインPCをRyzen 7950X3D + ASUS ProArt X670E-CREATOR WIFI + 96GB RAM(48GB DDR5×2)に変更。10GbEがオンボードなのでソケットに余裕ができてラッキー❤️ しかしスロット配置の問題で、X570 Steel Legendの時よりケース下側のGPUスペースがつらくなり、ケーブルと干渉してファンが回らなくなったりした。 イラついてCUDA用のマシンを旧メインPCパーツ(Ryzen 5900X + X570 Steel Legend WiFi ax + 96GB RAM(32GB×2+16GB×2)を利用して独立させた。OSはUbuntu Server 22.04。ケースと電源は新調した(Fractal Design Meshify 2とCORSAIR RM850e)。 Ubuntu 22.04でTehuti TN4010B0の10GbEを動かすのに苦労した。 Kernel標準ではなく、かつ正式公開されているソースは最新カーネルではコンパイルできない。 コンパイルできるようメンテしている人のgithubをいくつか見て対策したら、DKMSでちゃんと動くものをコンパイルできるようになった。 しかし安定せず、メモリ使用量が増えた局面でメモリ破壊っぽいKernel Panicがしばしば発生した。 Kernel標準で対応しているAQC107の10GbEを買った。Panicは出なくなった。 結果、1台のメインPCが2台のPCに分割された。 before. AMD Ryzen 5900X + ASRock X570 Steel Legend WiFi ax + 64GB RAM(32GB DDR4×2) + RTX3070 After. ...
とりあえずHugoでサイトを作りなおしてみた。 以前はてなブログで書いていた記事が、blogsyncのおかげで全てmarkdownの形で手元にあったので、 ざっとpythonスクリプトで最低限の変換をかけて取り込んでみた。 でも、画像がはてブロのままなのはイマイチだし、下手するとgoogle photoのままだったりしたの で、ちょっと手動で整えたりもしてみた。 別記事へのリンクにブログカード入れたいけど、自分でshortcodeでなんとかしないといけない(?) ようなので、で、とりあえずは後まわし。あとは古いWeb日記なども残した。 URLは変わってないはずので、以前の記事への参照も問題ないはず。 これで、ndiary時代並に気軽に書けるようなった気がする。はてブロは面倒だったから。 hugo serverでローカルで確認できるのはありがたいし、ついでにhugoはむちゃくちゃ速いのでよし。
以前のこの話の続き。 SU120版のちょっとした不満点 アクリルのトップ・ボトム両プレートを作って使用感よくなったため、Ergo Dashを予備役にまわしてnekonos0を楽しく使っていたのだが、いくつか不満点があった。 キースイッチが外れやすい MX互換キーは1.5mm厚のプレートに対して爪がひっかかるようになっている。しかしアクリルキャスト材は2mmからなので爪がひっかからない。今まで作ったことがあるHelixやErgo Dashもアクリルプレートだが1、これらはソケットではなく基板にスイッチを半田づけする構造なので、大きな問題は生じなかった。 しかし、Kailhソケットでスイッチを固定するSU120で作られたnekonos0では、アクリルプレートにキースイッチの爪がひっかかっていないため、キーキャップを変えようとするとスイッチも必ず抜ける。これは、次の問題との組み合わせによってたいへんストレスになった。 親指まわりのキーとプレートの位置関係の問題 そもそもトッププレートはnekonos1用に設計したものを手直ししただけなので、SU120のビスケットを適当に現物合わせしたnekonos0用の親指まわりとは微妙に位置が合っていない。ビスケットを調整してなんとかスイッチが嵌るようにはしているのだが、位置合わせがシビアである。 それで何が起こるかというと、キースイッチの端子がKailhソケットを捉えそこねて曲がってしまうのである。実につらい。 前述の問題が原因でキースイッチが外れやすく、この問題が原因でキースイッチが嵌めづらい。これはキーキャップを試行錯誤する過程において非常につらい。 Pro Micro下のプレート形状がいまいち nekonos0のボトムプレートのPro Microのあるあたりが横に広くてスマートさが足りない。nekonos0のボトムプレートはnekonos1のPCBと同じ形状なので、つまりはnekonos1の基板形状が悪い。 ここは目に入りやすいところなので最初気になった。まあすぐに慣れたのでそこまで致命的ではないかも。 アンダーグローがいまいち nekonos0はボトムプレートをクリア赤アクリルにした。これはこれでわりとカッコいいのだが、せっかくアンダーグロー用のLEDテープをつけても赤にしか見えない上に暗くて映えなかった。 下を赤くしたいならば、赤のアクリルではなく、クリアアクリルに赤いアンダーグローでいいのではないか。 折角基板設計したのに作らないなんてとんでもない 最大の不満はこれで、nekonos1の基板は99%設計終わっていたし、プレートも90%設計が終わっていたのである。これを作らないなんて組み込みエンジニアとしては耐えられない。 nekonos1を作ることにした というわけでnekonos1は上記の課題を解消する目的で、実際に基板を起こすことにした。そのため、nekonos0の完成後に下記の部分に手を入れた。 Pro Microのあたりをすっきりさせる プレートをPCBプレートにしてキースイッチを抜けづらくする 2 ボトムはクリアのアクリルで作る 回路と基板設計 KiCadを利用した。ほぼ全面的にfoostan氏の自作キーボード設計入門の3章の記述通りにやった。KiCadのバージョンがたぶん違うのと、undergrow用のLEDテープのfootprintにちょっと悩んだくらいだろうか。 まずEeschemaで回路図を書く。泥くさいところは全部Pro Microに任せているおかげで、単純なキーマトリックス回路そのものであり悩むことはない。エンジニアならサルレベルでも書けるに違いない。 あとは個々の部品にフットプリントを設定して、PCBnewでフットプリントを望む形に配置した。概ね前述のfoostan氏の本の通りにやって概ね問題なかった。 キースイッチの配置はPCBnewで完結させるのは難しそうだったので下記手順で行った。 Keyboaed Layout EditorのRaw DataをPlate & Case Builderに食わせてSVGを出力する。 このSVGをInkscapeで開いて基板外形を書き込んでからSVG3とDXFにセーブする。 このDXFをKiCadのPCBnewでEdge.Cutsにimportする。原点は気合で合わせる。 キースイッチのフットプリントをimportした絵に合わせて配置する。 Edge.Cutsからキーボード穴を消す。 もっといい手があったかもしれない。 あとは気合で配置と配線をしていけばOK。Freeroutingによる自動配線はあまり美しくなかったので、Pro Microまわりの一部を残して手で配線した後にのみ利用した。ちなみにこれはこれで十分な配線スペースがないとFreeroutingがギブアップするので注意が必要だろう。 トッププレート PCBプレートなのでこれもPCBnewで作る。 先程作った基板外形+キー穴のSVGをトッププレートの形に整形する。nekonos1はPro Micro部分だけ高さが違うので切り離す必要がある。まあ、しかし、特に難しい事はない。Pro Micro分のデザインを2種類考えてたのでPro Micro部のカバーが2コあるくらいか? Pro Micro部にロゴが欲しかったので、これはAffinity DesignerでSVGを作って、InkscapeでDXFにしてフットプリントを登録してトッププレートにはりつけた。 ロゴは金にしたかったけど、それだけのために高いENIG(金メッキ)にする気はなかったので、HASL(有鉛半田レベラー)の結果として銀っぽい色になった。 このへんの処理はサリチル酸さんのブログ記事やe3w2qさんのブログ記事を少し参考にした。 ボトムプレート アクリルプレートなのでPCBnewではなくInkscapeを使う。といっても、メインPCBの時に作った基板外形+キー穴のSVGからキー穴を削ってネジ穴を追加するだけでOK。今回はついでにPro Micro部カバーのPCBの上に載せるパーツも入れた。 遊舎工房さんとか、工房Emerge+さんに依頼するなら、それぞれのルールに合わせてデータを作る必要があるが、今回は基板といっしょにElecrowに製造依頼する予定だったので、本当に線で描いただけで終わった。 Elecrowに製造依頼する メイン基板とトッププレートのデータはPCBnewでガーバーデータを生成した。これもfoostan氏の本のほぼその通りにやったはずだが、一部ググったかもしれない。 ボトムプレートはSVGデータと寸法説明用のPDFを同梱してZIPにまとめるだけでOK。あとはElecrowのアカウントを作り、さきほどの3点のZIPをそれぞれ基板製造の見積りページとアクリルカットの見積りページから入力してカートに入れて、注文しておしまい。支払いはPayPalが使える。 1日ほどでin productionにステータスが変わり、1週間後くらいに「発送した」というメールが基板とアクリルプレートの写真と共に届いた。その後2日くらいで荷物が到着した。 ...
以前の記事の続きである。 さて、ないなら作ればいいじゃない、ということで自分でキーボードを作ってみることにした。 いきなり基板を起こすのではなく、まずはe3w2q氏のSU120でプロトタイプを作ってみることにした。 レイアウトを作る まずKeyboard Layout Editorでレイアウトを作る。 手持ちのキーキャップのサイズを眺めつつ1試行錯誤した結果、最終案はこんなレイアウトになった。 SU120で基板を作る じゃあSU120を入手だ! ということで、SU120のドキュメントを眺める。……まあElecrowあたりで作ってもらってもいいのだが、Kailhソケットやダイオードその他も必要なので、そのあたりがセットになっているTALP KEYBOARDさんの分割キーボードセットを買った。 キースイッチはGateron Brownにした。ただソケットはKailhなのでキースイッチもKailhのほうがいいのかもしれない。PCBマウント(5本足)のKailhスイッチあまり売ってないけど……。 で、問題はM1.4のビスとナットで入手性が悪い。今回はAmazonで買った。 ビスはこれ。 ナットはこれ。 ただ、ナットは中国からの直送で時間がかかったので、最初からAliExpressで買ったほうがよかったかもしれない。後述するが、プレートをつけるためにm2のスペーサーを揃えるのにAliExpressは使ったからだ。 TALP KEYBOADDのキットのナットと上記ナットは二面幅2.5mmなので問題ないのだが、あとで楽天で買った二面幅3mmのナットはGateronスイッチと干渉してスイッチを削る羽目になったので、ナットのサイズに注意したほうがいいだろう。 SU120とビスとナットが揃ったら、あとはレイアウトに合わせて切ってビスケットで繋ぐだけ。 配線はSU120の作例120 Key Split Ortholinear Keyboardのドキュメント通りにやればそう悩まずに済むだろう。 とりあえず右手側だけ仮配置。一部ダイオードの実装面を変えないとダメそう #SU120 pic.twitter.com/3ktG4coV68 — いずみたすく (@nekomimist) October 17, 2020 Pro Microまわり以外の配線等が終わったので仮組み。手持ちのR4の1.75Uのキーが足りなかったので、一部キーの位置を修正した。こういう修正が気軽にできるのは #SU120 のいい所だろうな pic.twitter.com/ZWM9BrWEax — いずみたすく (@nekomimist) October 24, 2020 キーキャップはMT3 susuwatariを使うのだが、ここでR4の1.75Uのキーの余剰が一個もなく、当初レイアウトは実現できないに気付いてENTERに当たるキーを1.5Uに変更したが、それ以外は当初レイアウトそのままである。 左手分も仮組み。こちらは予定通りの配置。右の横長キー2つが両方1.5Uになった以上、左の横長キーも全部1.5Uのほうがよいのかも……キーキャップないけど pic.twitter.com/Vy05X2LorH — いずみたすく (@nekomimist) October 24, 2020 配線むちゃくちゃ間違えたりもしたけど、動くようにはなったのでしばらく使ってみよう #SU120 pic.twitter.com/1gwTaiT67y — いずみたすく (@nekomimist) October 26, 2020 親指まわりと左小指まわりをいろいろ試行した結果、現状の姿はこれ #自作キーボード #SU120 pic.twitter.com/jvAFrBVgiW — いずみたすく (@nekomimist) October 31, 2020 使ってみて、親指まわりの角度と左手小指まわりが微妙だったので、最終的なレイアウトはこれとした。 ファームを作る 前述の120 Key Split Ortholinear Keyboardを元にやればOKだろう。 ...