タグ

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

  • rayonの真価は分割統治にアリ | κeenのHappy Hacκing Blog

    κeenです。やや釣りっぽいタイトルですがRustのデータ並列ライブラリのrayonについて。イテレータを並列に計算できるだけでなくjoinで自分で並列処理を書くこともできるんだよという記事です。 rayonとpar_iter rayonはRustのデータ並列ライブラリです。あの化学繊維のレーヨンです。Thread(糸)にちなんだ名前なんですかね。 rayonで一番良く使われるのはpar_iterでしょう。このように使えます。 use rayon::prelude::*; let vec = vec![1, 2, 3, 4, 5, 6]; // _par_iter でデータ並列計算 let max = vec.par_iter().max(); assert_eq!(max, Some(6)); このようにほぼRustのイテレータを置き換える形で使えます。 その反面、イテレータらしい処理で

    rayonの真価は分割統治にアリ | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2018/04/17
  • cargo asmでRustのメモリ周り最適化をチェック | κeenのHappy Hacκing Blog

    κeenです。 RustはたとえばBoxを使っていても必ずしもヒープにアロケートされる訳ではないなど、メモリの扱いを多少最適化してるらしいです。 しかし何がどう最適化されるのかは実際にコードを書いてみて実験しないとわからないことが多いので実験してみます。 rust 1.25.0です。 cargo asm 実験の前にツールを紹介します。cargo asmです。 クレートの関数名を指定するとディスアセンブルしてくれます。 たとえば

    cargo asmでRustのメモリ周り最適化をチェック | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2018/04/06
  • オブジェクト指向言語と関数型言語 | κeenのHappy Hacκing Blog

    === # 手続き的(自然言語) ------------------------- 入力: `array` - 配列, `n` - 配列の長さ 出力: `array`の要素の合計 1. `sum = 0`, `i=0` とする 2. もし`i` が`n`未満なら4へ飛ぶ 3. 7へ飛ぶ 4. `sum`に`array`の`i`番目を足したものを`sum`に代入 5. `i`をインクリメント 6. 2へ飛ぶ 7. `sum`を返す === # 手続き的(C言語) ---------------- ``` c int procedual_sum(const int array[], size_t n) { int sum = 0; for(size_t i = 0; i < n; i++) { sum += array[i]; } return sum; } ``` === # OOP的発想

    hikazoh
    hikazoh 2018/03/19
  • マクロクラブ Rust支部 | κeenのHappy Hacκing Blog

    マクロ・クラブのルール マクロを書くな それがパターンをカプセル化する唯一の方法ならば、マクロを書け 例外: 同等の関数に比べて、 呼び出し側が楽になるならば、マクロを書いても構わない κeenです。レーシックを受けようとしたら角膜が薄くて手術拒否されました。予定が狂って時間が空いたのでブログを書きます。 冒頭のルールはプログラミングClojureに出てくるマクロの書き方の指南です。 Rustのマクロって色々できるんだよという記事を書くにあたってマクロに一日の長があるLispの知見を引用されていただきました。 ルールにあるとおり、マクロは関数と違ってRustの第一級オブジェクトでないので扱いづらいですし体がコピーされるのでコードサイズも膨らんでしまいます。 よく考えながら使いましょう。とはいってもRustの構文はLispに比べると複雑ですし型やパターンマッチなどLispに存在しない構文要

    マクロクラブ Rust支部 | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2018/02/19
  • Hello, RocksDB | κeenのHappy Hacκing Blog

    κeenです。進捗ダメです。最近全然コード書いてないのでたまには手を動かすかということでRocksDBにHello Worldしてみます。 RocksDBとは RocksDBはアプリケーション組み込み向けに作られた永続化KVSです。 主に高速性、SSDなどの高速なストレージに合わせたアーキテクチャ、アプリケーションとの親和性、基操作の他マージなどの高度なオペレーションを特徴としているようです。 FacebookのDBエンジニアリングチームが作っていて、MyRocksなんかのバックエンドに使われています。 GoogleのLevelDBを下敷きに作られている模様。 私が知ったきっかけはやはりMySQL互換プロトコルを喋る分散DBのTiDBがバックエンドに使っているからでした。 Hello, RocksDB いくら新しいとはいえ、ただのKVSなので使い方はそんなの難しくないはず。とりあえず使っ

    Hello, RocksDB | κeenのHappy Hacκing Blog
  • 「イミュータブル」って多義的だよね | κeenのHappy Hacκing Blog

    κeenです。「XX言語はデフォルトイミュータブルだ」とか「この機能を使うとイミュータブルになる」とかのもの、よく混乱が見受けられますよね。 ユーザの勘違いもありますし言語毎に指しているものが違ったりするので整理してみます シャドーイング イミュータブルなはずなのに変数が上書きできてしまう、あれ?というやつです。 以下のようなClojureのコードを考えます。 馴れてないと(どちらかというと束縛と代入を一緒くたにする言語に毒されてると)「xに2回代入しようとしてるからエラーになるか2回目は無視されて1のままのはず」と考えてしまいます。 しかし実際の実行結果はエラーにはならず、 1 2 と更新されています。 これは先述のとおり束縛と(再)代入を混同していると起きる勘違いです。 (def x 2)はもともとあったxという変数を上書きしているわけではなく、xとは別の新しい変数xを作っているだけで

    「イミュータブル」って多義的だよね | κeenのHappy Hacκing Blog
  • Rustに何が欲しいだろう | κeenのHappy Hacκing Blog

    κeenです。New Year’s Rust: A Call for Community Blogpostsの一環のつもりです。 恐らく英語の記事が望まれてるんだろうなと思いつつも試しに日から声を上げてみます。 私はRustは1.0前後の頃から触っていて、ドキュメントの翻訳をしたりここ1年くらいはIdein Inc.での業務でも使っています。 1年ほど使ってみて何が足りないか考えてみます。 言語 Associated HKT 当は一般のHKTがあると便利ですがひとまずはAssociatedなものが欲しいです。RFCでいうとこれです Generic associated types (associated type constructors) 。 欲しい状況は1つにはRFCと似たようなものなので割愛します。 GeneralなHigher Kinded Typesが欲しいのはtransac

    Rustに何が欲しいだろう | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2018/01/06
  • 2018年注目していきたい技術 | κeenのHappy Hacκing Blog

    κeenです。毎年恒例です。個人的に注目していきたい技術と飛び込んでみたい技術を書いていきます。 あくまで個人的な内容なので悪しからず。 Swagger (OpenAPI Specifitation) YAMLで書いたREST APIの仕様からドキュメント、クライアントコード、サーバコードのテンプレートを生成するツール。 ネットワーク経由でなんらかのプロトコルを喋るとき、仕様とクライアントとサーバで独立してしまうとそれぞれで齟齬が出る。 プロトコルの詳細以外コードはどれも似たようなものになる訳だし自動生成できると望ましい。 仕様からクライアントとサーバのテンプレートが出てくる感じ。 一応「コードが仕様だ」みたいなものはいっぱいあるしサーバコードから生成も考えられる。 けどサーバが出来上がるまでクライアントが生成できないのはいただけないし何より言語に依存してしまう。 言語非依存に書けるのはや

    2018年注目していきたい技術 | κeenのHappy Hacκing Blog
  • Rustのバイナリが大きい理由 | κeenのHappy Hacκing Blog

    κeenです。方々で言われる話ですがRustコンパイラの吐くバイナリはそこそこ大きいです。 この理由を自分で納得してなかったので追います。 様々な理由からnightlyを使います。 初期 $ cat hello.rs fn main() { println!("Hello, World"); } $ rustc +nightly hello.rs $ ls -l hello -rwxr-xr-x 1 kim kim 5049344 12月 18 23:30 allocator 5MBくらいあります。等価なCのコード(gccでオプションなし)が8.2Kだったのでかなり大きいですね 最適化 cargo --releaseと同じく-Copt-level=3を付けましょう。-Copt-level=sの方が小さくなりますが普段やらないので。 $ rustc +nightly -Copt-level=

    Rustのバイナリが大きい理由 | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2017/12/19
  • diesel小ネタ集 | κeenのHappy Hacκing Blog

    κeenです。これはRust Advent Calendar 2017の記事です。 RustORM、クエリビルダ、マイグレーションツールのdieselについて。 dieselについては公式チュートリアルを読めばだいたい使い始められるのですが、それだけでは足りないのでいくつか持ちネタを書きます。 diesel-1.0.0-beta1での情報です。 table! マクロ チュートリアルにはinfer_schema!を使ったDSLの自動生成が書かれてますが、table!マクロを使って自分で書くこともできます。 table! { posts { id -> Integer, Title -> Text, body -> Text, published -> Bool } } このときの型はdieselで定義されているSQL型を書きます。 このSQL型は特定のDBMにあるものも用意されていて、例え

    diesel小ネタ集 | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2017/12/18
  • WebAssemblyでGC | κeenのHappy Hacκing Blog

    κeenです。この記事はWebAssembly Advent Calendar 2017 8日目の記事です。WebAssemblyでガーベジコレクションする話。 2017-12-08: ページサイズに関する誤りを訂正しました。その他加筆。 はじめてWebAssemblyを聞いたとき、「ブラウザでアセンブラが動くのか、よし、コンパイラを作ろう」と思ったかと思います。 私もそのうちの一人で去年頃こんなコンパイラを作り始めました。 しかしご覧のように進捗芳しくありません。 進捗が悪い理由の1つにGCがあります。最初はGCをCかRustで書いてemscriptenを通すつもりでしたがemscriptenを通したコードはどうにも扱いづらく、すぐに断念しました。 今でこそRustwasm32-unknown-unknownのターゲットがありますが当時はemscriptenしか選択肢がありませんでした

    WebAssemblyでGC | κeenのHappy Hacκing Blog
  • 雰囲気でシェルを使っている人のためのシェル入門 | κeenのHappy Hacκing Blog

    κeenです。雰囲気でシェルを使ってる人が多いとのことだったので少しばかり込み入った知識を。 あと一応POSIX準拠かどうかも気にしながらやっていきます。 基礎知識編 シェルの種類 まず、POSIXにシェルが定義されています。 これに最低限の機能で準拠しているものをPOSIXシェルと呼ぶことにします。いわゆる/bin/shです。具体的な実装はbsh、ash、dashあたりでしょうか。 最低限の機能以上に色々拡張されているシェルを拡張POSIXシェルと呼ぶことにします。具体的な実装はbash、zsh、kshなどでしょうか。 ここでは触れませんがPOSIX準拠でないシェルも存在してcshやtcshなどのシェルがあります。あと確か最近話題のfishも違ったような。 さて、1つ問題になるのは普段使いのコマンドラインはおおむね拡張POSIXシェルでしょうが、サーバで使うシェルやデプロイスクリプトで呼

    雰囲気でシェルを使っている人のためのシェル入門 | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2017/10/30
  • Rustで高速な標準出力 | κeenのHappy Hacκing Blog

    κeenです。Rustで何も考えずに標準出力に吐いてると遅いよねーって話です。 今回、標準出力に「yes」と1000万回出力するアプリケーションを書いてみたいと思います。 println! まあ、最初に思いつくのはこれでしょうか。

    Rustで高速な標準出力 | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2017/10/07
  • Rust風にデザインパターン23種 | κeenのHappy Hacκing Blog

    κeenです。 GoFのデザインパターンは有名ですが、言語機能によっては単純化できたりあるいは不要だったりするのでRust風に書き換えたらどうなるか試してみます。 発端はこのツイート。 デザインパターン、古いJavaの機能の足りなさのワークアラウンド的なテクニックも含まれてるからあまり宜しくないんだよね。enumやクロージャで十分なのもいくつかある。 Rustで写経、デザインパターン23種 - Qiitahttps://t.co/MhpS3Z2OlF — κeen (@blackenedgold) 2017年5月5日 一応誤解のないように説明しておくと、該当のQiitaの記事に不満がある訳ではなくてGoFのデザインパターンついての言及です。 リンク先のコードで十分な時にはここでは流すのでリンク先も同時に参照下さい。 また、比較しやすいようにサンプルコードはリンク先のものに則って書きます。

    Rust風にデザインパターン23種 | κeenのHappy Hacκing Blog
  • Rustのトランザクション抽象化ライブラリ作った | κeenのHappy Hacκing Blog

    κeenです。最近KeenS/transaction-rs: The transaction abstraction library and its executors for rustというライブラリをリリースしたのでそれについて。 モチベーション Rustでドメインロジックを書いていると以下のようなコードが出てきました。 (実際はもうちょっと複雑ですが質ではないので簡略化します) struct GroupPgDao(r2d2::Pool<ConnectionManager<PgConnection>>); impl GroupPgDao { fn get_conn(&self) -> &PgConnection { /*... */ } fn delete_user(&self, user: &User, group: &Group) -> Result<()> { let cn =

    Rustのトランザクション抽象化ライブラリ作った | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2017/06/25
  • Rustでエラーが出てないのにファイルに書き出せないときは | κeenのHappy Hacκing Blog

    κeenです。随分前から書こうと思いつつ先送りになっていた小ネタです。 例えばカレントディレクトリにあるsome_file.txtに適当なデータを書き込もうとして、以下のようなコードを書いたとします。 use std::fs::File; use std::io::prelude::*; use std::io::BufWriter; fn main() { let file = File::open("some_file.txt").unwrap(); let mut w = BufWriter::new(file); // unwrapを呼んで書き込みエラーを検知 write!(w, "hello").unwrap(); }

    Rustでエラーが出てないのにファイルに書き出せないときは | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2017/06/25
  • ジェネリクス勉強会補足 | κeenのHappy Hacκing Blog

    κeenです。日ジェネリクス勉強会で発表したのですがいくつか拾いきれないコメントがあったのでここでお返事書きます 発表スライドはこちら ジェネリクスの実装はポインタ方式とテンプレート方式だけじゃないよ もちろんです。 基的な手法を大別しただけで、私の発表中にもポインタ方式でも最適化がありえるとの指摘がありましたし、ジェネリクス勉強会中でも.NETの実装の話も出てました。 勉強会全体を見ているならここで私がフォローするまでもないかと思いますが、念のため拾っておきます。 クロージャの件が分からない クロージャの型は関数型じゃないの? 無名関数は関数に名前がないだけで型はあるんじゃないの? なんで(Iteratorのmapとかの)返り値に関数型がでてくるの Rustの挙動を知らないとちょっと分かりづらかったですね。それとあとで見返したら私も発表中一箇所嘘いってました。 詳しいことをコード例を

    ジェネリクス勉強会補足 | κeenのHappy Hacκing Blog
    hikazoh
    hikazoh 2017/06/25
    [Rust]
  • メモリとスタックとヒープとプログラミング言語 | κeenのHappy Hacκing Blog

    κeenです。 今回の話は別にRustに限ったものではないのですが、よくRustを始めたばかりの人がスタックとヒープが分からないと言っているのをみかけるので少しメモリの話をしますね。 厳密な話というよりは雰囲気を掴んで欲しいという感じです。 メモリは配列 プログラム(プロセス)のメモリには実行するプログラム(機械語)やグローバル変数/定数、関数の引数やローカル変数、その他プログラムで使うデータ領域などを置きます。 プロセスに割り当てられるメモリというのは、1つの巨大なのっぺらな配列みたいなものです。サイズも決まってます。64bit OSなら2^64 byteです。 0 2^64 +--------------- ----+ | | | | | ~~ | | +--------------- ----+ これは仮想的なメモリなので実際の物理メモリに2^64 byteの配列がドンと確保される訳

    メモリとスタックとヒープとプログラミング言語 | κeenのHappy Hacκing Blog
  • 1