rust

RustでUnix Domain Socketを扱う方法

"rust domain socket"とかで検索するといろいろ引っかかるけどいかんせんライブラリの更新が早くて情報が古かったりするのでここに現状を書きます(この文章もすぐに古くなるかもしれないので後から読む人は注意してください..) 基本 std::os::unix::net 元…

Rustのasync/awaitを使ったecho serverの実装

rust 1.39でasync/await構文が安定化されます. 巷で話題の機能ですが,asycn/await何も分からん...ということで話題に乗り遅れないためにasync/awaitを利用してecho serverを実装してみます. OSはLinuxが対象です.ソースはここにあります. echo server a…

rustのIteratorの実装

関連するトレイト Iterator libcore/iter/traits/itetarot.rs pub trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>; ... } イテレータの関数のためのトレイト next()さえ実装すれば,あとはデフォルト定義が存在 IntoIterator libcore/iter/trait</self::item>…

rustのArcについてその2

前回 以下で利用したplaygroundのリンク スライスからのArcの作成 Arcのソースをみていて気づきましたが,impl<T: Clone> From<&[T]> for Arc<[T]>などが実装されており,CopyあるいはCloneが実装されているスライスからArcを作成することができます.(RCも同様です)</t:>…

rustのMutexの内部構造

前回に引き続き,今度はMutexの話です. Raph Levien氏の図を引用すると,Mutexは以下のような構造になっています. Raph Levien, Copyright 2017 Google Inc., released under Creative Commons BY また,データ構造としては以下のように定義されています(…

rustのArcの内部構造

rustのスマートポインタの構成については,Raph Levien氏の以下の図が参考になります. Rust container cheat sheet 今回はここで特にArcについて見ていきたいと思います. Arcは以下のように定義されています(一部抜粋). pub struct Arc<T: ?Sized> { ptr: NonNull<ArcInner<T>></arcinner<t></t:>…

Ownership is theft? TockのTakeCellについて

tockというrust製の組み込み向けOSがあります. このtockの作成者らが2015年にOwnership is Theft: Experiences Building an Embedded OS in Rust (PLOS 2015)という論文を発表しました.そこでは著者がtockを開発する上で嵌ったownershipに関する問題と,そ…

cBPFプログラムをLLVM IRに変換する

最近Linuxでいろいろと大活躍のBPF (Berkeley Packet Filter)には主に2種類あって,一番最初に提唱されlibpcapなどで利用されるcBPF (classic BPF)と,主にLinux内で現在利用されている,cBPFをベースに拡張したeBPF (extended BPF)があります. cBPFのプロ…

nomによるnumpyデータのパース

nom nomはrust製のパーサコンビネーターライブラリです. 個人的にはno_stdでの動作をサポートしてる点が嬉しいです. 今回勉強のためにnomでnumpyのファイル(のヘッダ)をパースしてみます. numpyのフォーマット 今回は以下のようにして作成したデータを…

[rust]ZST/DSTによるflexible array memberの実現

flexible array memberとは ZSTを使う方法 DSTを使う方法 flexible array memberとは flexible array memberとはずばり,C言語で以下のようなサイズ定義を持たない構造体メンバのことです(C99から標準). struct X{ size_t len; char value[]; } この構造…

rustで動的にバッファを確保する方法

Boxを使う Vecを使う std::heap::Allocを使う placement-in を使う mallocを使う 1. Boxを使う rustで動的にメモリを確保する方法といってまず思いつくのはBoxを使う方法だと思います.例えば,以下のようにすれば長さ1000のu8のバッファを確保できます. le…

rustをnostdで使う

nostdとは rustは他の多くの言語と同様,標準ライブラリ(std)が同包されており,通常はそれを使ってプログラミングをおこないます.しかしながら,stdの多くの機能はOSの機能を利用しているため,OSそのものを開発したいとか,あるいはOSが存在しない環境で…

rustのGUIライブラリconrodの使い方

所用でrustのGUIライブラリについて調べる機会がありました.特にこれといったGUIライブラリはまだないような気がします. 普段自分がネイティブなGUIアプリケーションを作成する場合はQtを使います.rustからQtを呼び出すのはいくつか試みがあって,disasse…

rustでCで書いた関数を呼ぶ / Cからrustで書いた関数を呼ぶ

rustからCの関数を呼ぶ方法(あるいは,その逆)は公式のドキュメント (https://doc.rust-lang.org/book/ffi.html)に書いてあるのでそれを読めばいいんで すが,自分で書いたCの関数を呼ぶ方法について直接は書いてないのでここに簡単に まとめてみます. ru…