サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
都知事選
ryochack.hatenablog.com
ThinkPad X220のキーボードが好きだ。 ThinkPad A285を買ったが、やはりX220のキーボードを打ちたくなる。 ただX220は今となっては、解像度は低いし、802.11 acやBluetooth 4以降に対応していないし、手元にあるCore i5モデルだとUSB3.0もついてないし、そして重い。 そこでX220に以下の改造を施して延命させることにする。 改造項目 マザーボード換装: Core i5マザーボードからCore i7-2640Mマザーボードに交換 Full HDディスプレイ換装 Intel 9260NGW (Wi-Fi IEEE802.11ac + Bluetooth 5) 換装 USB PD充電 それぞれの記事のリンクを以下に貼っていく。 ryochack.hatenablog.com ryochack.hatenablog.com ryochack.hat
#[cfg(...)] Attribute Rustでは #[cfg(...)] アトリビュートを使うことによって、OSやCPUに応じた条件コンパイルを行うことができる。 Conditional Compilation cfgは複数条件指定可能(OR, AND, NOT) #[cfg(any(unix, windows))] #[cfg(all(unix, target_pointer_width = "32"))] #[cfg(not(foo))] Attributes - The Rust Reference 例えば、次のように書くことでコンパイルターゲットのOSに応じたhello()をビルドし、呼び出すことができる。 #[cfg(target_os = "windows")] fn hello() { println!("Hello, I'm Windows!"); } #[cfg(
この記事ではRustのビルドシステムであるCargoを使って、Cのコードをビルドし、それをRustのコードから呼び出す方法について紹介します。 ※記事作成時のRustのバージョンはrustc 1.33.0です。 この記事で取り扱うRustの知識とクレートは次の通りです。 build.rs Build Scripts - The Cargo Book Specifying Dependencies - The Cargo Book Cargo.toml Cargo Workspaces - The Rust Programming Language クレート cc bindgen libc また、この記事に載っているソースコードは全て次のリポジトリに置いてあります。 ryochack/rust-ffi-c-tutorial 事前準備 cargo-editというCargo.tomlへのクレート
Rustの構造体のメモリレイアウトについてのメモ。 Rustで次のような構造体を定義したときに、構造体のメモリレイアウトはどうなるか? struct Layout { b1: u8, s1: u16, b2: u8, w1: u32, b3: u8, w2: u32, s2: u16, s3: u16, } 検証時のRustのバージョンは次の通り。 stable-x86_64-unknown-linux-gnu rustc 1.24.1 (d3ae9a9e0 2018-02-27) TL;DR 先に結論を書く。 アトリビュート指定によって構造体のメモリレイアウトとサイズは以下のように変化する。 デフォルト 構造体サイズ20Byte repr(C)アトリビュート指定 構造体サイズ24Byte repr(packed)アトリビュート指定 構造体サイズ17Byte 以下に確認の過程を残しておく。
systemd環境下においては、従来(systemd無しの環境)のコアダンプ解析とは勝手が違ってくる。 コアダンプを有効にする ulimitコマンドでcore file sizeが0になっていないことを確認する。 $ ulimit -a -t: cpu time (seconds) unlimited -f: file size (blocks) unlimited -d: data seg size (kbytes) unlimited -s: stack size (kbytes) 8192 -c: core file size (blocks) unlimited -m: resident set size (kbytes) unlimited -u: processes 63401 -n: file descriptors 1024 -l: locked-in-memory siz
x86_64-unknown-linux-gnuのホスト環境上で、CHIP向けのバイナリをRustでクロスコンパイルすることを目的とする。 概要 rustup target add ${target_triple} でターゲットのツールチェインを追加 ターゲットのリンカをインストール Cargoのconfigファイルにターゲット用のリンカ設定を記述 cargo build --target ${target_triple} でクロスコンパイル実行 ※Rustのツールチェイン管理を行ってくれるツールのrustupはこちらを参考にインストール済みとする。 環境 ホストのシステム情報。 $ uname -a Linux hostname 4.13.7-1-ARCH #1 SMP PREEMPT Sat Oct 14 20:13:26 CEST 2017 x86_64 GNU/Linux $ ru
以下のコードはコンパイルが通らない。 package main func main() { const array = [...]int {1,2,3,4,5} } コンパイルエラー。 const initializer must be constan Goでは、配列やスライスは全てランタイム中に生成される。 それに対して、定数はコンパイル時に生成される。 そのため、配列を定数として宣言することはできないらしい。 参考 how declare constant array? - golang-nuts declare const array of floats - stackoverflow
2014.6.14追記 途中MakeContainer()/MakeContainerOneLine()がごちゃごちゃになっていたのを修正 golangでは、ヒープに置かれるデータの初期化方法によって内部の挙動が若干異なるみたい。 (環境はx86_64、go version 1.2.2) 違いが出たのは以下のコード。 構造体containerをヒープに確保してポインタ型の戻り値を返す関数を、3つの方法で定義している。 // alloc_overhead.go package main type container struct { v [64]byte } func MakeContainer() *container { c := container{} return &c } func MakeContainerOneLine() *container { return &contai
simhというエミュレータ上でUNIX V6を動かせるとのことで試してみた。 simhエミュレータのインストール http://simh.trailing-edge.com/がsimhの開発プロジェクト。 debian系なら apt-get で楽ちんインストール。 $ sudo apt-get install simh simh用のUNIX V6キットをダウンロード http://simh.trailing-edge.com/software.htmlからPDP-11 UNIX V6キットをダウンロードする。 $ wget http://simh.trailing-edge.com/kits/uv6swre.zip $ unzip uv6swre.zip simhでUNIX V6を動かす 起動の前にPDP-11用の設定ファイルを作る。名前はなんでもいいけど、pdp11.rcにした。 set
Go言語でコマンドラインオプションを扱う - そこはかとなく書くよん。 に触発されたので、flagパッケージについて自分で使ってみてハマったところを書いておく。 コマンドラインオプションの略称を登録する flag.IntVar()などのXxxVar()を使う。 これで -boolでも-bでも同じ変数にフラグの結果が反映されるようになる。 $ go run flag_shorthand.go -bool -int 100 -string hoge bool flag = true int flag = 100 string flag = hoge $ go run flag_shorthand.go -b -i 100 -s hoge bool flag = true int flag = 100 string flag = hoge コマンドラインオプションを最後まで解析する flag.P
Goではgoroutineを使うことで並行処理をとても簡単に実行できるが、複数goroutineとの同期が難しい。 そこで、複数走らせたgoroutineのメッセージを用いた同期方法について考えてみた。 以下のように、複数のチャネルからのメッセージを受信する必要がある時、どうやって各goroutineからのメッセージを、同時に、最後まで、受信すればいいか? func f(msg string, n int) chan string { ch := make(chan string) go func() { for i:=0; i<n; i++ { ch <- msg + " please!" } close(ch) }() return ch } func main() { ch1 := f("beer", 4) ch2 := f("juice", 2) ch3 := f("water",
2013.10.14 追記 @kazuho さんからご指摘いただきました! mmapのほうがreadより速いという迷信について - kazuhoのメモ置き場 - 長いタイトル…。 こないだ書いたgorepっていう検索ツール、もうちょっと速くしたいなと思ってファイル読み込みの部分をmmap()で置き換える検討中。(ちょっぱやのagもmmap()を使っている) mmap()での高速化確認用にCとGoで簡単なコード書いて実験していたら、以下のことがわかった。 ファイル読み込みをmmap()に置き換えると高速化が望めそう Goのコンパイラの最適化はなかなか優秀で、CのGCCビルドよりも速くなることがありそう LLVM-Clangは半端じゃない 処理速度比較の準備 比較用に書いたのは、open()/read()と、open()/mmap()、そしてfopen()/fread()を行うCとGoのコード
標準出力のディスクリプタを取得して、それが端末を参照しているかどうかを判定する。 使いどころは端末に出力する時と、ファイルにリダイレクト出力する時とで表示の仕方を変えたいとき。 例えば、以下のページの方法でターミナルの文字をカラーにできる。 C言語でターミナルで表示される文字をカラー表示させる だけど、これをファイルにリダイレクト出力するとエスケープシーケンスまで記録されてしまい、非常に見づらくなる。 そこで、標準出力がどこに出力されるかを判定し、カラーのON/OFFを切り替える処理を入れるようにしたい。 出力先が端末かどうかの判定は、Cだとこう書く。 #include <stdio.h> #include <unistd.h> int main() { int fd = fileno(stdout); int isTerminal = isatty(fd); printf("fd=%d,
ディレクトリ名やらファイル名やらGrep検索やらを一緒くたに正規表現で検索する"gorep"っていうツール書いた。 https://github.com/ryochack/gorep 以下のコマンドを打ち込むと、カレントディレクトリ以下から再帰的にgo..pにマッチするディレクトリ、ファイル、テキストファイルの文字列を表示する。 $ gorep -g go..p . -gをつけるとgrep検索が有効になる。 Windowsで気軽に検索できるツールが欲しいってのがモチベーションだったけど、まだWindowsで動作検証していないっていう体たらく。 参考 https://github.com/YoshikiShibata/utg Java テキストファイルかどうかを判別する -プロプログラマ - Pro Programmer - Go言語でディレクトリ名からファイル情報一覧を取得する
パタヘネ本の7章(マルチコアとマルチプロセッサとクラスタ)に以下のような(ちょっと違うけど)図が載っていたので、Goの並行処理を使って100,000個の数の和を求めてみた。 最初の図とはちょっと違って、実際の制御はこんな感じ。 値が2つ揃ったら、加算を行うgoroutineを生成する。 goroutineからは、channelを通して合計が送信される。 全ての数を足し切るまでこれを繰り返す。(足す順番は気にしない) 足す数は0〜99,999までの等差数列。 time.Sleep(1 * time.Millisecond)は、後々の単純総和コードとの比較のために、擬似的に処理を重くしているつもり。(足し算だけだと処理が軽すぎて並行処理にした方が遅かった…) 下は単純に総和を求めるコード。 実行結果 $ time go run sum_goroutine.go 704982704 go run
このページを最初にブックマークしてみませんか?
『ryochack.blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く