タグ

ブックマーク / keens.github.io (19)

  • 変わる状態を型で表わす | κeenのHappy Hacκing Blog

    κeenです。 プログラムで扱うものに状態、操作によって変わるものってありますよね。それを扱うのは普通なら難儀するのですが、Rustだと上手く扱う方法があるよって話です。 質的には同じ話を Rustで強めに型をつけるPart 2: Type Level State Machine | κeenのHappy Hacκing Blogでもしてるんですが、具体例で趣味に走ってしまったのでもうちょっと分かりやすい例を挙げます。 例にVecのsortをとってみましょう。 // vはsortされていない let mut v = [4, -5, 1, -3, 2]; v.sort(); // vはsortされている assert_eq!(v, [-5, -3, 1, 2, 4]); sort はメモリ効率の観点からin-placeなメソッド、つまり self を受け取って () を返す関数です。つまり

    mkusaka
    mkusaka 2025/11/13
    Rustで状態遷移を型で表す方法を解説。Array<T, Unsorted/Sorted>やPhantomDataでsort/shuffleを制約。
  • moldを使うとRustのビルドが速くなる | κeenのHappy Hacκing Blog

    このエントリはRust Advent Calendarの2日目の記事です。 空いてる日を埋める担当のκeenです。2日目が空いてたので遡って記事を投稿します。 最近v1.0.0がリリースされたリンカ、moldを使うとビルドが高速化するよというお話です。 Rustのビルド、特にインクリメンタルビルドにおいてはRustコンパイラの速さと同じくらいリンカの速度がコンパイル時間に影響します。 この最後のバイナリを作る時間は意外と効いてきます。 具体例としてActix Webにあるexample、 basic をインクリメンタルビルドする例をみてみましょう。 この basic はたった42行の小さなアプリケーションです。 ただし、依存に Actix Webという巨大なライブラリを使っているので最終的なバイナリには非常に多くのコードが含まれます。フレームワークを使ってアプリケーションを開発してるときに

    moldを使うとRustのビルドが速くなる | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2022/09/17
  • Rustのコードチェックを強力にする3つのツール | κeenのHappy Hacκing Blog

    κeenです。 Rustaceanのみなさんは普段書いてるRustのコードを検証するのに cargo check や cargo test などのツールを使っているかと思いますが、それらを強力にするツールの miri 、 MIRAI 、 kani をそれぞれ紹介します。 Rustにはいくつかコードの正しさや行儀のよさを検査する方法がありますね。 cargo check や cargo test 、 あるいはビルドしたバイナリを走らせて検証したり色々手を尽くしているでしょう。 ですがこれらだけだとあらゆる種類のバグを拾いきれる訳ではないのもみなさん承知の通りだと思います。 既存の方法だと手が回らない所があるので他のアプローチでコードを検証してくれるツールがあると嬉しいですよね。 そういったツールを3つ紹介します。 先に注意しておくと、これらのツールはまだ成熟しきってはおらず使いづらい点、使い

    Rustのコードチェックを強力にする3つのツール | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2022/06/20
  • RustのHashMapはentryが便利 | κeenのHappy Hacκing Blog

    κeenです。個人的によく設計したなと思っているRustのEntry APIについて紹介します。 標準ライブラリのHashMapの操作を無駄なく書きたい人におすすめ。 Entry APIとは HashMap のEntry APIというのは私が勝手に呼んでる名前ですが、 HashMap::entry を起点にして使えるメソッド群のことを指しています。 これは「HashMap に に対応する値があればそれにXXし、なければYYする」をするときに使います。 例えば HashMap<String, Vec<String>> にキーに対応する値(Vec<String>)があれば新たな文字列をpushし、なければ空 Vec を作って新たに文字列をpushするという操作をしてみましょう。 素直に HashMap::get_mut とパターンマッチを使って書くとこうなりますね。 // 準備 let mut

    RustのHashMapはentryが便利 | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2022/05/22
  • Rustでバイト列を扱う時のtips | κeenのHappy Hacκing Blog

    このエントリはRust その2 Advent Calendar 2016 - Qiita2日目の記事です。 Rustはシステムプログラミング言語なのでバイト列をあれこれしたいことがあると思います。その時にイテレータでバイト列を舐める以外にも色々方法があるなと気付いたので。 Read と Write 私には割と衝撃だったのですが&[u8]や&mut [u8]、Vec<u8>は直接ReadやWriteのインスタンスになってます。 例えばReadならこういう風に使えます。 let mut bytes: &[u8] = &[1, 2, 3, 4, 5, 6]; let mut buf = [0;3]; bytes.read_exact(&mut buf).unwrap(); println!("read: {:?}, rest: {:?}", buf, bytes); read: [1, 2, 3

    Rustでバイト列を扱う時のtips | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2022/05/21
  • RustのErrorとFailureのベンチマーク見たことある? | κeenのHappy Hacκing Blog

    κeenです。最近ちょくちょく標準ライブラリの Error とfailureライブラリの Fail が比べられる(というより Fail を推奨する)のが増えてきたようです。 個人的にちょっと気になってる点があって、みんなそれを抜きに議論してるようなので少しお話します。 タイトルにあるとおり、ベンチマークの話なのでいきなりですがベンチマークを使いましょう。 Box<dyn Error> を作るコストと failureライブラリの Error を作るコストを比べます。 何故 Fail ではなくfailureの Error かというと Fail は少し込み入ったベストプラクティスがあり、コードが長くなるからです。 ベンチマーク的にはベストプラクティスを使った Fail とfailureの Error は変わらないと思います。ベストプラクティスについては以下を参照して下さい。 rust のエラーラ

    RustのErrorとFailureのベンチマーク見たことある? | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2022/05/08
  • eBPFでDockerの--passwordで入力したパスワードを盗む | κeenのHappy Hacκing Blog

    κeenです。以前の記事の続きで、 /proc を監視するのではなくeBPFで取得してみます。ついでにRustのコードをeBPFで動かせるライブラリのayaも使ってみます。 以前の記事では /proc 以下の監視をビジーループで回すという力技で新しく作られたプロセスを補足していました。これだとCPU使用率が上がって美しくありませんし、何より原理的には見逃しもありえてしまいます。そこでカーネルの機能を使って全てのプロセスの作成を監視して低CPU使用率かつ捕捉率100%の実装を目指します。 eBPFとは? なんかLinuxカーネルでユーザの書いたコード動かせるやつです。私は説明できるほど詳しくないので適当にググって下さい。 1つやっかいな点として、独自のバイナリを動かすのでカーネル内で動かすコードはコンパイラがeBPFに対応したものでないといけません。また、カーネル内で動かすコードをユーザラン

    eBPFでDockerの--passwordで入力したパスワードを盗む | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2022/01/04
  • Rustのturbofishを理解する | κeenのHappy Hacκing Blog

    このエントリはRustその3 Advent Calendar 20193日目に飛び入り参加しているエントリです。 Rustの型パラメータ指定の構文、通称ターボフィッシュ(turbofish)について。 Rustでジェネリクス関数は以下のように関数名に続いて <パラメータ名> で指定しますよね?

    Rustのturbofishを理解する | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2021/01/30
  • プログラミング言語の未来はどうなるか | κeenのHappy Hacκing Blog

    κeenです。最近JEITAのソフトウェアエンジニアリング技術ワークショップ2020に参加したんですが、そこで五十嵐先生、柴田さん、Matzとパネルティスカッションをしました。その議論が面白かったので個人的に話を広げようと思います。 年末年始休暇に書き始めたんですが体調を崩したりと色々あって執筆に時間がかかってしまいました。 時間を置いて文章を書き足していったので継ぎ接ぎ感のある文体になってるかもしれませんがご容赦下さい。 というのを踏まえて以下をお読み下さい。 いくつか議題があったのですが、ここで拾うのは一番最後の「プログラミング言語の未来はどうなるか」という話題です。 アーカイブが1月末まで残るようです。もうあと数日しかありませんが間に合うかたはご覧下さい。 そのとき各人の回答を要約すると以下でした。 五十嵐先生:DSLを簡単に作れる言語というのが重要。それとプログラム検証、プログラム

    プログラミング言語の未来はどうなるか | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2021/01/27
  • Idrisで依存型を使った定理証明入門 | κeenのHappy Hacκing Blog

    このエントリはIdris Advent Calendar 2020の19日目の記事です。 次はmock_beginnerさんでIdrisとはじめる型駆動開発です。 κeenです。今回はこのAdvent Calendarの山場の1つ、定理証明について解説しようと思います。 依存型で証明ができる原理 カリー=ハワード同型対応といって、プログラムのと論理学の定理には対応関係があることが知られています。 これはすなわち、我々が普段プログラムを書いているときは同時に論理学の命題を証明していることでもある、ということです。 そんな大それたことしてないよーと思うかもしれませんが、それもそのはず。 普通のプログラムではあまり面白い命題を表現できないので、わざわざ証明というほどでもないからです。 しかしIdrisには依存型があります。 依存型があると型の表現力が上がるので対応する論理学の命題の表現力が上がり

    Idrisで依存型を使った定理証明入門 | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2021/01/02
  • Rustで小さなツールを作ってみる(後編) | κeenのHappy Hacκing Blog

    この記事はRust Advent Calendar 2015 2日目の記事です。 前 Rustで小さなツールを作ってみる(前編) 次 Cargoの使い方 κeenです。昨日の記事で作りかけだったIRCの生ログのDBへのインポートの続きです。今日はDBへのインポートをやります。 とはいってもRustDBを扱った経験がないので探り探りです。 要件 今回は簡単なのでORMは要らない気がしますが、サンプルということでORMも使いましょう。さらに、サンプルということでクエリビルダも使いましょう。 …と思ったのですが中々良いライブラリがありませんでした。ドキュメントもろくにないまま放置されてるdeuteriumと開発途中でまだpostgresしかサポートされていないrustorm/codegentaくらいしかないようです。うぅ。 最近話題になったdieselもまだ若すぎるようです。 ということでシン

    Rustで小さなツールを作ってみる(後編) | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2020/02/21
  • Rustで小さなツールを作ってみる(前編) | κeenのHappy Hacκing Blog

    この記事はRust Advent Calendar 2015 1日目の記事です。 次 Rustで小さなツールを作ってみる(後編) κeenです。Rust Advent Calendar初日ということで軽い話から。 小さなツールって何だよって感じですが手元にIRCの生ログが大量にあるのでそれをDBにインポートしてみましょう。 あまりRustに向いた仕事じゃなさそうですが手始めとして。 前編でログのパースを、後編でDBへのインポートをやります。 IRCの生ログはtiarraが吐いたものです。 #emacs@freenodeのようにチャネル名@サーバ名のディレクトリに入っていて、ファイル名はYYYY-mm-dd.txtで、 13:43:24 <#emacs@freenode:codingquark> Such key generation, much wow. 13:43:59 ! Vejeta

    Rustで小さなツールを作ってみる(前編) | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2020/02/21
  • ウワサのVeronaを眺めてみる | κeenのHappy Hacκing Blog

    κeenです。 先日、Microsoft Research (MSR)からVeronaという言語が公開されました。 マイクロソフト、Rustベースのセキュアなプログラミング言語を探求中 - ZDNet Japan マイクロソフト、「Rust」に基づくプログラミング言語プロジェクト「Project Verona」がGitHubに - ZDNet Japan これを見た人達の反応が様々で(婉曲表現)面白いな(婉曲表現)ーと思いました。 最近は企業や大きな団体の作った言語がメインストリームで使われることも増えたことから、来の目的以上に期待を背負ってしまった感じがします。 プログラミング言語は思ったよりも気軽に作られているものです。 例えばGoogleの開発したohmuという言語はほとんど誰も知りませんよね。 そういうもんです。 以下には私がドキュメントとかコードとか読んだ感想を書きます。 主に

    ウワサのVeronaを眺めてみる | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2020/01/26
  • Idris入門: 数当てゲーム | κeenのHappy Hacκing Blog

    κeenです。 Idrisの入門記事ってあまりないなと思ったので少し書いてみます。 私は別にIdrisに詳しいわけではないので間違っているかもしれないことに注意してください。 Idris は依存型を持つ汎用プログラミング言語で、Haskellっぽい文法や機能を持ちます。 依存型を持っていてかつ汎用のプログラミング言語というのがめずらしいのでその手の文脈ではだいたい名前が上がります。 Idrisの型システムはものすごく雑にいうと型がプログラム可能です。型を書く位置に関数を書いたり逆に型を値としてプログラムに渡したり出来ます。 これらの機能を使って型を詳細に書けるので正しい入力しか受け付けないぜ!みたいなことが書けます。 ところでIdrisに入門しようとすると難解な記事が多いのが現状です。 Idrisの関連記事はどうしても依存型に目が行ってしまうので普通のプログラミング言語としての紹介が中々見

    Idris入門: 数当てゲーム | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2020/01/18
  • Bind Addressの意味がようやく分かった | κeenのHappy Hacκing Blog

    κeenです。小ネタを。サーバを立ち上げる時に指定するBind Addressについてよく分かっていなかったのがようやく分かるようになったのでそれについて。 Bind Addressはサーバ(特にHTTPサーバ)を立ち上げる時によく指定することになりますが、Usageを見ても「バインドするアドレスを指定する」などとトートジーめいたことしか書いてありませんでした。 実際に使ってみても127.0.0.1を指定すればローカルホストから、0.0.0.0を指定すれば外部からでも参照出来るな、くらいの認識しかありませんでした。 意味も分からず使っていると気持ち悪いもので、2つの疑問が湧いてきます。 0.0.0.0と127.0.0.1は正確に何を意味するのか 127.0.0.1と0.0.0.0以外のアドレスを指定するのはどのようなケースか もちろん、127.0.0.1がlocalhostを指すことは知っ

    Bind Addressの意味がようやく分かった | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2020/01/17
  • 手続き型脳で型推論を実装してみた | κeenのHappy Hacκing Blog

    このエントリは型 Advent Calendar 2019 - Qiita 2日目に遡って投稿しているエントリです。 担当に遅刻した訳ではなくて空いてたので前から詰めて投稿しただけです。 κeenです。世の中に型推論アルゴリズムは色々知られていると思いますが、それを一切無視して型推論を実装してみたので報告します。 型推論の基的理解 式に型変数を割り当てて、既に分かっている型から制約条件をつけてその制約の連立方程式を解けばいいです。 例えば以下のようなSMLの式を考えましょう。

    手続き型脳で型推論を実装してみた | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2019/12/31
  • 「実践Rust入門」を書いたよ | κeenのHappy Hacκing Blog

    κeenです。実践Rust入門 言語仕様から開発手法まで(技術評論社)を書いた(3人で共著)のでどういうなのか解説します。 5/8発売です。電子版もありますよ。Gihyo Digital PublishingだとPDFが手に入るので人気らしいです。 See Also 書籍『実践Rust入門』の詳細な目次です 目指したもの Rustの入門書といえば公式ドキュメントのThe Book、TRPLなどと呼ばれるThe Rust Programming Languageやその有志による和訳が一番に挙がるでしょう。 それ以外にもオライリーよりProgramming Rustやその和訳版も出ています。 どちらもRustについてよく書かれており、書の購入を検討されている方は上記2冊との違いが気になるかと思います。 書の大きな特徴は以下の2点です。 Rust 2018 Editionに対応している 実

    「実践Rust入門」を書いたよ | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2019/12/31
  • Rustのモジュールの使い方 2018 Edition版 | κeenのHappy Hacκing Blog

    このエントリーはRust Advent Calendar 20187日目の記事です。 κeenです。Rust 2018が来ましたね。最近業も副業(?)も大詰めで中々時間がとれずAdvent Calendarに遅刻してしまいました。 それはさておき、私はRustのモジュールの使い方を過去に書きました。 この記事は中々好評だったようですが、状況が変わりまして2018 Editionでモジュールが大幅に変更され、分かりやすくなりました。 巷に2018での変更点は多く喧伝されていますが2015との差分ばかりで、今からモジュールシステムを学ぶ方はまず複雑な2015を理解してから差分を読んで、簡単な2018を理解しないといけなくなっています。 そこで2018からはじめて学習する方向けにモジュールシステムの解説をしようと思います。 とりあえずサンプルプロジェクトを作ります。 $ cargo new m

    Rustのモジュールの使い方 2018 Edition版 | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2019/12/31
  • Rustのパッケージをcrates.ioに登録する | κeenのHappy Hacκing Blog

    κeenです。技術の話題を書くのは久し振りですね。今日初めてRustのパッケージのセントラルレポジトリ、crates.ioにパッケージを登録したのでその流れを共有します。 登録したいパッケージを用意する file_loggeを作りました。 しばらく前に(Advent Calendar向けに)それっぽく動くところまで作って放置してたやつですね。これを整形していきます。 (任意)ドキュメントを生成する Rustには素晴しき cargo doc があります。 $ cargo doc --no-deps でドキュメントを生成しましょう。ドキュメントを書いてないならこちらを見ながら書きましょう(すいません、私の奴は全然書いてないです…)。 target/doc 以下に生成されたドキュメントがあるので適当に gh-pages ブランチに放り込みましょう。 尚、--no-deps オプションがないと依存

    Rustのパッケージをcrates.ioに登録する | κeenのHappy Hacκing Blog
    mkusaka
    mkusaka 2019/12/31
  • 1