タグ

Rustに関するhikazohのブックマーク (43)

  • https://www.rustforbeginners.com/

    https://www.rustforbeginners.com/
    hikazoh
    hikazoh 2019/01/24
  • Rust 1.26 新機能まとめ - 0x90

    サイトを結合したのをおいておきます。 今更ですがRust 1.26が5/10にリリースされました。新機能をおさらいしましょう。今回は相当に大きい変更がたくさん入っています。公式はここです。 impl Trait impl Traitは最大の変更のひとつでしょう。ざっくりいうと、型名のようにimpl Traitを使えます。 use std::fmt::Debug; fn hoge(a: impl Debug) { println!("{:?}", a); } fn fuga() -> impl Debug { 1 } 引数のトレイト境界を指定する使い方の場合、従来のジェネリクスとの棲み分けをどうするべきなのかはすこし気になります。まあ、簡単な場合であればおそらくimpl Traitを使うようになるんでしょう。ただ、微妙にトリッキーなのは、こういう場合がコンパイルエラーになることです。 tr

    Rust 1.26 新機能まとめ - 0x90
    hikazoh
    hikazoh 2018/06/06
  • rustc、cargo、rustup、rustfmtなどのインストール - DRYな備忘録

    前回のエントリでは横着してbrew install rustとしたけど、それだといろいろ無いっぽいので、toolchain一式入るように入れ直す。 まずはお掃除 % brew uninstall rust 無いことを確認。 % which rustc % which cargo 公式ドキュメントに従ってインストール www.rust-lang.org % curl https://sh.rustup.rs -sSf | sh 以下、その出力全文 info: downloading installer Welcome to Rust! This will download and install the official compiler for the Rust programming language, and its package manager, Cargo. It will ad

    rustc、cargo、rustup、rustfmtなどのインストール - DRYな備忘録
    hikazoh
    hikazoh 2018/06/05
  • 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
  • RustとPostgreSQLで色々な型をやりとりしてみた(postgres 0.17対応) - Qiita

    最新版 RustとPostgreSQLで色々な型をやりとりしてみた(NUMERIC対応) 目的 RustでPostgreSQLの型をやりとりしてみたという記事ですが、postgresの0.17からだいぶかわったので、修正してみました。 以前の比べて、配列、Option型のサポートが入り、関連するcrateが新しくなりました。 以前の記事もまだ0.14系が現役だと思いますので、残しておきます。 プログラム [package] name = "pg" version = "0.1.0" edition = "2018" [dependencies] bit-vec = "^0.6" chrono = "^0.4" eui48 = "^0.4" geo-types = "^0.4" r2d2_postgres = "^0.16" serde_json = "^1.0" uuid = { vers

    RustとPostgreSQLで色々な型をやりとりしてみた(postgres 0.17対応) - Qiita
  • Rustのパニック機構 - 簡潔なQ

    概要: Rustのパニック機構は異常終了の処理を安全に行うためにある。この動作を詳しくみていく。 パニックとは何か Rustには2つの異なる例外処理機構があります。 発生源 対処方法 例 パニック プログラミングエラー 原則として捕捉しない assert!() 境界外参照 Result 例外的な入力 必要に応じて捕捉 I/Oエラー (File::read) パースエラー (str::parse) パニックとResultの関係についてはTRPL第2版第9章、未定義動作とパニックの関係についてはRustonomiconのUnwindingの章などが参考になります。 パニックを想定した安全性 Rustではたとえパニック状態でも未定義動作だけは絶対に避ける必要があります。そのため以下の関数は不健全 (unsound)です。 use std::ptr; // この関数はRustではunsound (

    Rustのパニック機構 - 簡潔なQ
    hikazoh
    hikazoh 2018/03/08
  • Rustの関数ポインタの落とし穴 - 簡潔なQ

    概要: Rustの関数ポインタの落とし穴について その1: 関数ポインタはクロージャとは異なる これはC/C++に慣れている人には当たり前ですが、関数ポインタ型 (fn()) とクロージャ型 (Fn()) には重大な違いがあります。それは、関数ポインタは環境をキャプチャーしないということです。大雑把にいうと、 関数ポインタは、ある機械語コードのアドレス クロージャは、関数ポインタと、キャプチャーした環境の対 なので、関数ポインタは、ひとつのプログラムにつき原則として有限個しかないのに対し、クロージャは、キャプチャーする環境によって無限にたくさんのクロージャを作ることができます。例えば、 fn main() { let closures = [3, 7, 1, 5, 8, 9, 2].iter().map(|&i| { move |j| i + j }).collect::<Vec<_>>(

    Rustの関数ポインタの落とし穴 - 簡潔なQ
    hikazoh
    hikazoh 2018/03/08
  • マクロクラブ 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
  • メモ: Common LispからRust/Goを呼び出す

  • tokuhirom's blog

    rust のベンチマーク取る時は `cargo build --release` しなくてはならない [package] name = "hello_world" version = "0.1.0" authors = ["Your Name <[email protected]>"] [dependencies] futures = "0.1.14" hyper = "0.11" で extern crate hyper; extern crate futures; use futures::future::Future; use hyper::header::ContentLength; use hyper::server::{Http, Request, Response, Service}; struct HelloWorld; const PHRASE: &'static str

    hikazoh
    hikazoh 2018/01/13
  • 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
  • 勝手にevalしない言語をRustで作ったら意外なものになった - 色の輪

    概要 この記事は言語実装Advent Calendar 2017 25日目用として書かれたものです。 Advent Calendar初参加です。迷っていたら25日が空いていたので、思い切って飛び込んでみました。 でもよく見たら、なんだかテーマは高度なことばかり。 私はそのようなことは全然書けるような実力はありませんので、できることだけをやりました。こわい。すいません。 ソースコード Epiqsという名前です。たらい関数とfibonacciは動いてますよー。 READMEは古い記述がたくさん残ってるので直したいよー。 github.com 動機 たくさんある。なんだか思いの丈がまとまっていないが、そのまま書く。 ちなみに私は「ポエム」という表現を使うのは好まない。 書いていて気づいたが、言語実装というよりは言語「設計」という趣である。 コンスセル大好き Lisp系言語が好きなのだが、最近、ど

    勝手にevalしない言語をRustで作ったら意外なものになった - 色の輪
    hikazoh
    hikazoh 2017/12/29
  • 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
  • Rocket - A Rust game running on WASM

    Two weeks ago, Alex Crichton’s PR adding a target for WebAssembly to the Rust compiler was merged. There are many differences between this target and the Emscripten one, but the important one for me is that it doesn’t depend on external stuff like the Emscripten SDK (which IIRC used to be a pain to get working on Windows, but seems to be better now). After seeing the examples on hellorust.com, I t

  • Unixコマンド”yes”についてのちょっとした話 | POSTD

    知っているUnixのコマンドで一番シンプルなものは何ですか? 例えば echo という、stdoutに文字列を出力し true を返す – すなわち常に0の終了コードで終了するシンプルなコマンドがあります。 シンプルな、と言えば yes もそうでしょう。引数なしで実行すると、改行されたyが無限に出力され続けます。

    Unixコマンド”yes”についてのちょっとした話 | POSTD
    hikazoh
    hikazoh 2017/11/20
  • RustでOption値やResult値を上手に扱う - Qiita

    この記事の概要 Option<T> 型や Result<T, E> 型の戻り値を、match 式で判別している以下のようなコードを、 fn double_arg(mut argv: env::Args) -> Result<i32, String> { match argv.nth(1) { None => Err("数字を1つ指定してください。".to_owned()), Some(arg1) => { match arg1.parse::<i32>() { Ok(n) => Ok(2 * n), Err(err) => Err(err.to_string()), } } } }

    RustでOption値やResult値を上手に扱う - Qiita
    hikazoh
    hikazoh 2017/11/16