[{"content":"","date":"23 June 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"23 June 2026","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"今まで開発環境は Ubuntu を使ってたんだけど違うディストロを使ってみたい欲が湧いてきて調べてたら Omarchy が気になった。\nRuby on Rails の開発者である DHH が作ったディストロビューションで、Arch Linux + Hyprland をベースに予め開発用のソフトウェア群がインストールされてる。\n前から Arch Linux は気になってたけどインストールが難しそうだなぁと思っていたけど、Omarchy だとあっさりインストールできた。インストール完了した時にインストールにかかった時間が表示されて面白いと思った。正確な時間は忘れたけど20分もかからなかったと思う。\n日本語表示 # Mozc を使っていく。\nsudo yay -S --noconfirm --needed fcitx5-im fcitx5-mozc でツールをインストールして、\nfcitx5-configtool で設定を行う。\nInput Methodのタブで Mozc をCurrent Input Methodに登録する。Global OptionsタブのEnumerate Input Method Forwardでホットキーを登録することができる。私はAlt+`にしている。\nzsh # ログインシェルはbashになってるのでzshに変更する。とはいえすごく凝った設定をしているわけではない。zshはインストールされてないのでインストールから。\nsudo pacman -S zsh which zsh chsh # which zsh で表示されたパスを指定する # 再起動する neovim # デフォルトではLazyVimが有効になっている。高機能過ぎて使いこなせないので自分でセットアップした。 ついでにdotfilesを管理するためのツールchezmoiも使ってみる。\ntakuchalle/dotfiles-chezmoi Manage dotfiles by chezmoi Lua 0 0 育てていく。\n感想 # 使い始めて1,2週間経つけどすごい体験がいい。\nHyperland で初めてタイル型のウィンドウマネージャを初めて使ったけどヌルヌル動いて気持ちがいい。気持ちがいいだけじゃなくてウィンドウの操作がキーボードで完結する。慣れるまで間違えてウィンドウ閉じちゃったりあわあわしたけど、慣れてしまえば快適そのもの。\nデスクトップにWindowsとデュアルブートする形でインストールしたけど、気にったので古くなったIntel MacBook にもインストールした。MacBook の方は閉じたときのサスペンドの処理が微妙で復帰できないことがあるけど、起動が爆速なので作業終わったらシャットダウンする運用で全然問題ない。\nもうUbuntuに戻れない。\n","date":"23 June 2026","externalUrl":null,"permalink":"/posts/diary/install-omarchy/","section":"Posts","summary":"","title":"Omarchy をインストールした","type":"posts"},{"content":"","date":"23 June 2026","externalUrl":null,"permalink":"/tags/pc/","section":"Tags","summary":"","title":"PC","type":"tags"},{"content":"","date":"23 June 2026","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"23 June 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"23 June 2026","externalUrl":null,"permalink":"/","section":"takuchalle.blog","summary":"","title":"takuchalle.blog","type":"page"},{"content":"","date":"23 June 2026","externalUrl":null,"permalink":"/categories/%E6%97%A5%E8%A8%98/","section":"Categories","summary":"","title":"日記","type":"categories"},{"content":"","date":"9 June 2023","externalUrl":null,"permalink":"/tags/zig/","section":"Tags","summary":"","title":"Zig","type":"tags"},{"content":"どうも、たくチャレ(@takuchalle)です。\nzigでf32の配列データをファイルに書き出す方法がパッと分からなかったので、メモです。\nwriteAllの引数は[]u8なので、[]f32を渡せません。 なのでキャスト、もしくは変換を行う必要があります。\n標準ライブラリのstd.mem.bytesAsValueを使うと変換することができます。\nvar writer = /// ファイルオープン処理 var data: []f32 = /// データ作る try writer.writeAll(std.mem.bytesAsValue(data)); 実装を見ると、ポインタのキャストをしていそうです。\n","date":"9 June 2023","externalUrl":null,"permalink":"/posts/programming/zig/zig-write-f32-data-to-file/","section":"Posts","summary":"","title":"zig で []f32のデータをファイルに出力する方法","type":"posts"},{"content":"","date":"9 June 2023","externalUrl":null,"permalink":"/categories/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/","section":"Categories","summary":"","title":"プログラミング","type":"categories"},{"content":"どうも、たくチャレ(@takuchalle)です。\n簡単なスクリプトをzigで書いてみた時に、@embedfileが便利だったので紹介です。\n環境 # $ zig version 0.11.0-dev.3380+7e0a02ee2 ドキュメントはこちらです。\n基本的なファイル読み込み # 以下のコードはこちらの記事からの引用ですが、こんな感じでちょっとファイルを読みたいだけなのに記述するコードが多いです。\nconst std = @import(\u0026#34;std\u0026#34;); pub fn main() !void { const stdout = std.io.getStdOut().writer(); const file_name = \u0026#34;xxxx\u0026#34;; const file = try std.fs.cwd().openFile(fileName, .{}); defer file.close(); const file_size = try file.getEndPos(); try stdout.print(\u0026#34;file size: {d}\\n\u0026#34;, .{file_size}); var reader = std.io.bufferedReader(file.reader()); var instream = reader.reader(); const allocator = std.heap. page_allocator; const contents = try instream.readAllAlloc(allocator, file_size); defer allocator.free(contents); try stdout.print(\u0026#34;read file value: {c}\\n\u0026#34;, .{contents}); } @embedfile を使う # 同様のことを@embedFileを使って行います。\nconst std = @import(\u0026#34;std\u0026#34;); pub fn main() !void { const stdout = std.io.getStdOut().writer(); const inputFile = @embedFile(\u0026#34;xxxx\u0026#34;); try stdout.print(\u0026#34;file size: {d}\\n\u0026#34;, .{inputFile.len}); try stdout.print(\u0026#34;read file value: {s}\\n\u0026#34;, .{inputFile}); } @embedFileに指定したファイルをコンパイル時に読み込んで配列に格納してくれるので、ファイル操作のエラー処理などを実行時に行う必要がなくなります。\nコンパイル時にファイルがないとコンパイルエラーになりますが、ちょっとしたスクリプトやテストコードでは@embedFileで十分なケースが多いかと思います。\n","date":"6 June 2023","externalUrl":null,"permalink":"/posts/programming/zig/zig-embedfile/","section":"Posts","summary":"","title":"zig でファイル読み込みは@embedfileが便利","type":"posts"},{"content":"どうも、たくチャレ(@takuchalle)です。\n前から気になっていたMINISFORUMのUM773 liteがセールになっていたのでポチってしまいました。\nAmazonの商品ページはこちら(セールはもう終わりました)\nマウスと比べると一回り大きい程度なので非常にコンパクトです。\n昔は家にCentOSで自宅サーバーを設置したりしてましたが、最近ではクラウドのサービスを利用することが増えてきました。 しかし、手元にLinuxの開発機も持ちたいなと徐々に思い始めて、今回買ってUbuntuをインストールしました。\nWindowsもあったら便利かなということでデュアルブートしてみました。\nデュアルブート # 今回はWindowsとUbuntuで物理的にドライブを分けました。家に余っていたCrucial SSD 500GB MX500を増設して、ここにUbuntuをインストールしました。 7mm以下のSSDなら増設できるようです。UM773にSSDと接続するケーブルとマウントするネジが同根されているので、プラスドライバーだけあれば簡単に増設できます。\nUbuntuのインストール方法は特筆する必要もないくらい簡単でした。今回ドライブを分けましたが、同じドライブでパーティションを分けたインストールも簡単そうでした。\nなぜUbuntuか # インストールしたらすぐに使えるからです。GentooとかArchLinuxとか使いこなすとかっこいいけど、欲しかったのはLinuxの開発機なのでインストールが簡単ですぐに使い始められるUbuntuにしました。\nバージョンは23.04にしました。カーネルが6.2なのでRustも使えます。\n久々にdotfilesを整理したり、いろいろ楽しみたいと思います。\n","date":"25 May 2023","externalUrl":null,"permalink":"/posts/diary/ubuntu-dualboot-on-um773/","section":"Posts","summary":"","title":"MINISFORUMのUM773にデュアルブートでUbuntuをインストールした","type":"posts"},{"content":"","date":"25 May 2023","externalUrl":null,"permalink":"/tags/ubuntu/","section":"Tags","summary":"","title":"Ubuntu","type":"tags"},{"content":"どうも、たくチャレ(@takuchalle)です。\n今、フーリエの冒険を読んでいて微分積分についてもう少し詳しく知りたかったので、難しい数式はまったくわかりませんが、微分積分を教えてください！を読んでみました。\n著者のたくみさんは教育系YouTuberで、数学や物理の動画を公開しています。解説がわかりやすいのでよく見ています。\n感想 # フーリエの冒険にも微分積分の説明があります。この説明は非常にわかりやすくて、もっと早く知っておくべきでした。 高校の時はあまり本質を理解せずに公式だけ覚えてテストを乗り切った記憶があります。\nもっと詳しく知りたいと思って本書を買ったのですが、フーリエの冒険での説明以上の解説はなかったので、ちょっと期待はずれでした。\nしかし、微分積分の理解を始める最初の一歩としては非常にわかりやすくて、フーリエの冒険を読む前だったら感動したと思います。\n微分積分を勉強し始めて、学校の説明じゃよくわからん！って人は読んでみたらいいと思います。1時間くらいでサクっと読める分量なので、気軽に読み始められます。\n次はニュートン式 超図解 最強に面白い!! 微分積分を読んでみようと思います。\n","date":"19 July 2022","externalUrl":null,"permalink":"/posts/book/takumi-bibunsekibun/","section":"Posts","summary":"","title":"「難しい数式はまったくわかりませんが、微分積分を教えてください！」を読んだ","type":"posts"},{"content":"","date":"19 July 2022","externalUrl":null,"permalink":"/tags/%E6%95%B0%E5%AD%A6/","section":"Tags","summary":"","title":"数学","type":"tags"},{"content":"","date":"19 July 2022","externalUrl":null,"permalink":"/categories/%E8%AA%AD%E6%9B%B8/","section":"Categories","summary":"","title":"読書","type":"categories"},{"content":"","date":"21 February 2022","externalUrl":null,"permalink":"/tags/flutter/","section":"Tags","summary":"","title":"Flutter","type":"tags"},{"content":"どうも、たくチャレ(@takuchalle)です。\nFlutterで作ってるアプリの多言語対応した時のメモです。 多言語対応といっても今は日本語しかサポートしていません。例え1言語しかサポートしなくてもソースコードに直値があるのは気持ち悪いので、この対応を行うことでソースコードがスッキリすると思います。\n公式サイトに詳しく記載されているので、英語に抵抗がない方・詳しく見たい方はこちらを参照してください。\n多言語対応方法 # flutter_localizationsをインストールする # Flutterはデフォルトでは英語しかサポートしていないので、flutter_localizationsパッケージをインストールことで他の言語をサポートすることができます。 サポートされている言語はこちらで確認できます。\npubspec.yamlに記載します。\ndependencies: flutter: sdk: flutter flutter_localizations: # 追加 sdk: flutter # 追加 インストールすると下記のようにMaterialAppのlocalizationsDelegatesとsupportedLocalesを指定します。\nimport \u0026#39;package:flutter_localizations/flutter_localizations.dart\u0026#39;; return const MaterialApp( title: \u0026#39;サンプル\u0026#39;, localizationsDelegates: [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: [ Locale(\u0026#39;ja\u0026#39;, \u0026#39;\u0026#39;), // 日本語追加 Locale(\u0026#39;en\u0026#39;, \u0026#39;\u0026#39;), // 英語追加 ], home: MyHomePage(), ); Widgetのbuildメソッド内でMaterialLocalizations.of(context)でMaterialLocalizationsにアクセスできるので、\nText(MaterialLocalizations.of(context).cancelButtonLabel) と記述すると日本語の場合キャンセル、英語の場合Cancelと表示されます。1\nWidgetでよく使われる単語はMaterialLocalizationsに定義されているので自分で用意する必要はありません。 こちらにすべて定義されているので、一度見てみることをオススメします。命名ルールも参考になるかと思います。\nintlをインストール # ここから自分で定義した単語や文章を使用する準備をします。\n大まかな流れは以下のようになります。\nパッケージをインストールする .arb拡張子の定義ファイルを用意する .dartに変換する MaterialAppに追加する Widgetから参照する まずいつもどおりpubspec.yamlにintlを追加します。\ndependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter intl: # 追加 更にflutterセクションにgenerate: trueも追加します。 これでビルド時に.arbから.dartに変換してくれます。\nflutter: generate: true 次に変換するための定義ファイルを作成します。 ルートディレクトリにl10n.yamlファイルを作成し、以下のように書きます。\narb-dir: lib/l10n # .arb を配置する任意のディレクトリ template-arb-file: app_ja.arb # 日本語を定義するファイル output-localization-file: app_localizations.dart # 変換後のファイル名 lib/l10n/app_ja.arbの中身を書いていきます。\n{ \u0026#34;helloWorld\u0026#34;: \u0026#34;こんにちわ、世界\u0026#34;, \u0026#34;@helloWorld\u0026#34;: { \u0026#34;description\u0026#34;: \u0026#34;生まれたてのプログラマの最初の挨拶です\u0026#34; } } VSCode を使用しているなら、Flutter Intlというプラグインで.arbファイルの色付けとかしてくれるので便利です。\n今後言語を増やしていきたい場合は、app_ja.arbのjaの部分を言語コードにして定義ファイルを書いていけば良いです。\nここまでの準備ができたらアプリをビルドします。すると${FLUTTER_PROJECT}/.dart_tool/flutter_gen/gen_l10nに.arbから変換されたapp_localizations.dartが生成されているはずです。\n生成されたファイルはflutter_gen/gen_l10n/app_localizations.dartで参照できるのでインポートして、AppLocalizations.delegateをlocalizationsDelegatesに指定します。 ひとまとめにしたコードがこちらです。\nimport \u0026#39;package:flutter_localizations/flutter_localizations.dart\u0026#39;; import \u0026#39;package:flutter_gen/gen_l10n/app_localizations.dart\u0026#39;; return const MaterialApp( title: \u0026#39;サンプル\u0026#39;, localizationsDelegates: [ AppLocalizations.delegate, // 追加 GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: [ Locale(\u0026#39;ja\u0026#39;, \u0026#39;\u0026#39;), // 日本語追加 ], home: MyHomePage(), ); 最後にWidget内で以下のように参照して表示できれば完成です。\nText(AppLocalizations.of(context)!.helloWorld); MaterialAppは以下のように書くこともできます。これらは自動生成されるので、新規の言語の.arbファイルを追加するだけで、ソースコードは修正せずに新規の言語に対応できます。\nconst MaterialApp( title: \u0026#39;サンプル\u0026#39;, localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, ); もう少し短く書けるといいが…\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"21 February 2022","externalUrl":null,"permalink":"/posts/programming/flutter/internationalization/","section":"Posts","summary":"","title":"Flutter の多言語対応","type":"posts"},{"content":"どうも、たくチャレ(@takuchalle)です。\n久々に Flutter プロジェクトを作成したので、まず最初に行ったことを紹介します。\nVS Code にスニペットを導入 # 前はAndroid Studioを使っていたのですが、重かったので今回はVS Codeを使ってみることにしました。\nAwesome Flutter Snippets Flutter Riverpod Snippets ひとまず上記の2つのプラグインを入れてみました。 今のところ困ってませんが、必要に応じて自分でスニペットは追加していこうと思っています。1\nリンターの設定 # リンターはオススメの書き方や良くない書き方を教えてくれるツールです。人間いくら気をつけてもミスをするので、機械的にチェックしてもらうのが良いと思います。\n前は自分で設定をしないといけなかったけど、バージョン2.5からプロジェクト作成時に設定してくれるようになったのですね。\nflutter_lintsというルールがデフォルトで指定されています。 analysis_options.yamlのrulesセクションに自分の好きなルールを追加できますが、ひとまずデフォルトを使ってみます。\nルールは以下のサイトにすべて載ってますが、数がめちゃめちゃ多いです。 style flutterのタグがついているルールは先程のflutter_lintsに入っているので、それ以外を見ると良いと思います。\nCI の整備 # GitHub Actionsでビルドとテストは設定しました。 自動デプロイとかはもうちょっとアプリが形になってからでいいかなと思ってます。\nやり方は検索すればたくさん出てくるので、ここでは特に書きません。\n多言語 # 多言語対応する予定はなくても、コードにベタ書きはイヤだったので公式のドキュメントを参考にやりました。\nこれも前はもっと面倒だった気がしますが、楽になりましたね。 私が対応した時のメモも貼っておきます。\n\u0026quot; \u0026gt;}}\nパッと見た感じVS Code のスニペットってめちゃめちゃ書きにくそう\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"21 February 2022","externalUrl":null,"permalink":"/posts/programming/flutter/after-creating-project/","section":"Posts","summary":"","title":"Flutter でプロジェクトを作成してまず行ったこと","type":"posts"},{"content":"","date":"13 January 2022","externalUrl":null,"permalink":"/tags/github/","section":"Tags","summary":"","title":"GitHub","type":"tags"},{"content":"どうも、たくチャレ(@takuchalle)です。\n毎回 GitHub のアクセストークンをペーストするのが面倒なので、保存方法を調べてみました。\n確認環境 # Ubuntu 20.04.3 LTS git 2.25.1 平文で保存 # 一番簡単な方法は平文で保存する方法です。\ngit config --global credential.helper store 個人の PC など自分しか触らない環境であれば平文でも良いかもしれませんが、少し不安です。 できれば暗号化したほうがいいと思います。\nlibsecret で暗号化して保存 # libsecretを使って暗号化します。 以前はlibgnome-keyringが使われていたらしいですが、こちらは非推奨になりlibsecretを使うことが推奨されています。\nsudo apt install libsecret-1-0 libsecret-1-dev sudo make --directory=/usr/share/doc/git/contrib/credential/libsecret aptでインストールしたあとにビルドが必要です。ビルドできない場合はbuild-essentialも入れる必要があるかもしれません。\nsudo apt install build-essential ビルドが成功すれば、下記コマンドで設定します。\ngit config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret 設定した後一回目はアクセストークンを入れる必要がありますが、二回目以降は保存されたアクセストークンが自動で使われます。\n","date":"13 January 2022","externalUrl":null,"permalink":"/posts/programming/git/secure-store-token/","section":"Posts","summary":"","title":"Ubuntu で GitHub アクセストークンを保存する方法","type":"posts"},{"content":"どうも、たくチャレ(@takuchalle)です。\n組み込みで Rust をやっていく。 pic.twitter.com/Z06a6D4MiV\n\u0026mdash; たくチャレ (@takuchalle) August 17, 2021 基礎から学ぶ 組み込みRustを読みました。\n本書はWio Terminalというマイコンボードを対象に組み込みRustを学べるという、日本でも稀有な本になっています。Rustで組み込みをやってみたい人は一度読んでみることをオススメします。\n現在絶賛0歳児の子育て中で「がっつりマイコンボードを触って試す」ということが難しいので、一通り読んだ段階での感想となります。ご了承ください。\nまずとても良かった点は、embeded-halクレートをベースとしたアーキテクチャを分かりやすく解説してくれている点です。 この俯瞰図があれば他のマイコンボードのcrateを見ていくのに道標になりそうです。\n組み込みソフトウェアで一番シンドいのは、回路図やデータシートを読み解いていく部分だと思うので、そこをお膳立てしてくれてるのはありがたいです。 一方で本書を読んで他のマイコンボードを触ってみようと思った時に回路図やデータシートを見て絶望するのではないか。回路図やデータシートが間違えてることもありますし…1 ハードウェアってソフトウェアと違って設定が間違えててもエラー出力されずにただただ何も起きないもしくは壊れるのでデバッグが難しい…ひたすら回路図とレジスタ設定をにらめっこするのは本当につらい。\nRustの文法に関しては最初に解説してくれるので、Rust初心者でも問題ないです。基本的な文法・所有権・ライフタイム・パッケージなど一通り学べます。 組み込みソフトウェアの経験がなくても、Wio Terminalのペリフェラルについてそれぞれ最低限の部分は解説をしてくれるので安心です。\n個人的には型状態プログラミング2みたいな組み込み向け特化したRustテクニックみたいなのがもしあれば知りたかったですね。 The Embedded Rust Bookに書いてあるのかもしれませんが、あまり読めてません…\nあと、ハードウェアはほぼembedded-halが隠蔽されているので、ゴリゴリベアメタルを触りたいって人は物足りないかと思います。 そんな人はatsamd-halみたいなembedded-halトレイトの実装側をやっていくといいんじゃないでしょうか。3\n最後に正誤表のリンクを貼っておきます。\n余談ですが、本書の表紙の質感を娘が気に入ったのか、ずっと触ってるのでシワシワになってしまいました。\nWio Terminal でも加速度センサの回路図のピンのアドレスが間違えてますね\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n型状態プログラミングについてちょっと調べました。こちら\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n私も実装側の方が興味ありです\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"26 August 2021","externalUrl":null,"permalink":"/posts/book/embedded-rust-from-basics/","section":"Posts","summary":"","title":"「基礎から学ぶ 組み込みRust」を読んだ","type":"posts"},{"content":"","date":"26 August 2021","externalUrl":null,"permalink":"/tags/rust/","section":"Tags","summary":"","title":"Rust","type":"tags"},{"content":"","date":"23 August 2021","externalUrl":null,"permalink":"/tags/vim/","section":"Tags","summary":"","title":"Vim","type":"tags"},{"content":"どうも、たくチャレ(@takuchalle)です。\nvimを使い始めてしばらく経ち、ちょっとづつ慣れてきました。 もっとテンポよくプログラミングしたくなったので、スニペットプラグインを導入してみることにしました。\nまず参考にしたサイトは「スニペットプラグインについて 2020 年版」です。\n条件 # いくつかスニペットプラグインがあるので、自分が必要とする条件を挙げてみました。\n他に依存がない デフォルトのスニペットが豊富 LSP と親和性が高い まず他のツールに依存がない方がトラブルも少ないし、インストールの手間もなくて良いです。プラグインによってはPythonやcocフレームワークに依存しているプラグインがあるので、候補から外しました。\nデフォルトのスニペットが豊富だと自分で色々書かなくて済むので良いですね。\nLSPのプラグインvim-lspを使ってるので、それと競合しない、むしろ親和性があると導入しやすいです。\nvim-vsnip # いくつかの条件に合致したのがvim-vsnipでした。\nVSCodeのスニペットとの互換性を重視して設計されたスニペットプラグインです。\nVim scriptで記述されているので、他に依存はありません。VSCodeのスニペットと互換性があるので、すでにスニペットが豊富です。ただ、スニペット形式がJSONなので自作のスニペットを作成するときは面倒くさそうです。しかし、そんな頻繁にスニペットを作ることはないのでこのデメリットはそこまで気になりませんでした。さらにLSPと同じインターフェイスでスニペットが使えるので完璧です。\n導入方法 # vim-plugを使っているので、次のようにしました。\nPlug \u0026#39;hrsh7th/vim-vsnip\u0026#39; \u0026#34; プラグイン本体 Plug \u0026#39;hrsh7th/vim-vsnip-integ\u0026#39; \u0026#34; LSP 連携 Plug \u0026#39;rafamadriz/friendly-snippets\u0026#39; \u0026#34; 大量のスニペット郡 プラグインに入ってるスニペットでは少ないので、rafamadriz/friendly-snippetsもインストールします。ここに大量のスニペットが入っています。\nひとまずこの構成でやっていきたいと思います。\n","date":"23 August 2021","externalUrl":null,"permalink":"/posts/programming/vim/use-snippets/","section":"Posts","summary":"","title":"Vim のスニペットプラグインを使い始めた","type":"posts"},{"content":" 本ブログのコンテンツに関して # 本ブログの発言は個人の見解であり、所属する組織の公式見解ではありません。\n個人情報に関して # Google Adsense # 当サイトでは、第三者配信の広告サービス「Googleアドセンス」を利用しています。 このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 『Cookie』(氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。 またGoogleアドセンスに関して、このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、 「広告 – ポリシーと規約 – Google」をご参照ください。\nGoogle アナリティクス # 当サイトではアクセス解析のためにGoogle アナリティクスを使用しております。\nデータ収集のためにCookieを使用します。\nデータが収集、処理される仕組みについては、ユーザーが Google パートナーのサイトやアプリを使用する際の Google によるデータ使用をご覧ください。\nAmazon.co.jpアソシエイト # 当サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。\n第三者がコンテンツおよび宣伝を提供し、訪問者から直接情報を収集し、訪問者のブラウザにクッキーを設定したりこれを認識したりする場合があります。\n","date":"20 August 2021","externalUrl":null,"permalink":"/privacy/","section":"takuchalle.blog","summary":"","title":"プライバシーポリシー","type":"page"},{"content":"どうも、たくチャレ(@takuchalle)です。\n今「基礎から学ぶ 組み込み Rust」を読んでます。 そのなかで型状態プログラミング(Typestate Programming)が気になったので、少し深堀りしてみました。\n型状態プログラミング(Typestate Programming)とは # The Embedded Rust Book(日本語版1)によると\nThe concept of typestates describes the encoding of information about the current state of an object into the type of that object.\nと書いてあります。\n「現在のオブジェクトの状態をオブジェクトの型にエンコードする」みたいな意味だと私は理解しました。\n具体例 # The Embedded Rust Bookの最初の例では、Builder Patternが紹介されています。FooBuilderが未設定状態で、Fooが設定済み状態として表現されています。いきなりFooを作成することはできず、FooBuilder経由で適切に初期化してからでないとFooを取得できないようになっています。それをRustの強力な型付けによってコンパイル時に保証してくれます。\nこのシンプルな例でもなんとなくは分かるのですが、もう少し実践的なPeripherals as State Machineの例を詳しく見ていきたいと思います。\nシンプルなGPIOでも有効/無効や入力/出力などいろいろな状態を持ちます。 マイコンのペリフェラルを一種のステートマシンとして扱い、型状態プログラミングを適用していきます。\n具体的なコードはDesign Contractsから抜粋していきます。全体像を見たい場合はDesign Contractsを確認してください。\nまずGpioConfigを定義します。\n/// GPIO interface struct GpioConfig\u0026lt;ENABLED, DIRECTION, MODE\u0026gt; { /// GPIO Configuration structure generated by svd2rust periph: GPIO_CONFIG, enabled: ENABLED, direction: DIRECTION, mode: MODE, } struct Disabled; struct Enabled; struct Output; struct Input; struct PulledLow; struct PulledHigh; struct HighZ; struct DontCare; この時に有効無効をENABLED、入出力をDIRECTION、モードをMODEとしてジェネリクスで定義します。 そして状態を表す構造体を定義します。メンバがない構造体なのでサイズが0で実行ファイルには残らずコンパイル時のマーカとして使います。\nこうしておくことで型状態プログラミングを実現することができ、Rustの強力な片付けを享受することができます。\n次にGPIOを有効化して出力に変更するメソッドを見てみましょう。\nimpl\u0026lt;EN, DIR, IN_MODE\u0026gt; GpioConfig\u0026lt;EN, DIR, IN_MODE\u0026gt; { pub fn into_enabled_output(self) -\u0026gt; GpioConfig\u0026lt;Enabled, Output, DontCare\u0026gt; { self.periph.modify(|_r, w| { w.enable.enabled() .direction.output() .input_mode.set_high() }); GpioConfig { periph: self.periph, enabled: Enabled, direction: Output, mode: DontCare, } } } 返り値の型がGpioConfig\u0026lt;Enabled, Output, DontCare\u0026gt;になってることがわかると思います。 self.periph.modifyで実際のハードウェアの設定を変更して、新しく遷移した状態GpioConfig\u0026lt;Enabled, Output, DontCare\u0026gt;になっています。\n引数が\u0026amp;selfではなく、selfになってることがポイントかなと思っています。selfを消費しつつ新しい状態として返すことで、GPIOのインスタンスがプログラム中に一つしか存在することができないので余計なバグを生む心配がなくなります。\n最後に実際に出力を行う部分を見てみます。\nimpl GpioConfig\u0026lt;Enabled, Output, DontCare\u0026gt; { pub fn set_bit(\u0026amp;mut self, set_high: bool) { self.periph.modify(|_r, w| w.output_mode.set_bit(set_high)); } } GpioConfig\u0026lt;Enabled, Output, DontCare\u0026gt;に対してメソッドを定義しているので、それ以外の状態では出力が行えないようになっています。 つまり「GPIOが入力の設定になっているのに出力しちゃって正しく動かない」みたいなしょうもないバグは絶対に起きないことが保証されます。Rust最高ですね。\nC/C++では出力行う時に状態をチェックして出力する、みたいなコードになるかと思います。\nvoid set_bit(GPIO *gpio, int set_high) { if(gpio-\u0026gt;state != STATE_OUTPUT)\treturn; // 出力 } 型状態プログラミングを適用することでコンパイル時に状態をチェックできるので、実行時の状態チェックのオーバーヘッドが不要になります。ゼロコスト抽象化と呼ばれていますね。\nめちゃめちゃわかりやすい画像をツイッターで見つけたので、貼っておきます。\nRust愛を感じました😀\nもし、最終的に普及の説得も兼ねているのなら、図で説明した方がいいですよ。俯瞰して分からないものは聞かないし、興味も持ってくれないんですよねぇ…\n所有権周りも、unsafeだらけになる未来しか見えないなぁ…\n結局は、良いプログラムを書く姿勢が一番重要なのでしょうかね pic.twitter.com/VzYenhHqE9\n\u0026mdash; nodamushi (@nodamushi) February 3, 2019 まさにこれがRustを使うメリットの一つをわかりやすく表現していますね。\n終わりに # 基礎から学ぶ 組み込み Rustに出てきた型状態プログラミングについてちょっと調べてみました。 Rustの強力な型付けやゼロコスト抽象化の特徴を効果的に利用した手法で、個人的にはすごく感動しました。特にプロセッサの性能やメモリサイズが限られている組み込みに非常に有用な手法だと感じました。 もちろん組み込み以外でも使える汎用的な手法だと思うので使える場面があればどんどん使っていきたいと思います。\n基礎から学ぶ組み込み Rust の著者が日本語訳してくれてるじゃないですか。ありがたや…\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"19 August 2021","externalUrl":null,"permalink":"/posts/programming/rust/about-typestate-programming/","section":"Posts","summary":"","title":"型状態プログラミングについて調べてみた","type":"posts"},{"content":"","date":"19 August 2021","externalUrl":null,"permalink":"/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"","date":"19 August 2021","externalUrl":null,"permalink":"/tags/netlify/","section":"Tags","summary":"","title":"Netlify","type":"tags"},{"content":"どうも、たくチャレ(@takuchalle)です。\n最近ブログ書いてなかったので、テンションを上げるためにブログのデザインを変えようと思いました。 しかし、古いブログ のデザインを変えようと思ったら簡単にできそうになかったので、これを機に新しいブログに移行しました。\nブログは例のごとくHugoを使ってます。デプロイ先は手軽にNetlifyにしました。\nまだプログラマになることは諦めてないので頑張っていきたいと思います。\n","date":"19 August 2021","externalUrl":null,"permalink":"/posts/diary/create-new-blog/","section":"Posts","summary":"","title":"新しいブログに移行しました","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]