kubo39's blog

ただの雑記です。

D言語で一ヶ月前を表すとき

日付の扱いは忘れそうなのでメモ。 一ヶ月前を表す場合、可能であれば前月の同日同時刻を表し、前月に同日が存在しない場合は差分を計算して付け足す。 import std.datetime; import std.stdio; void main() { auto currTime = Clock.currTime(UTC()); write…

D言語のprecise(正確な) GC

(追記: 編集あり) 実は結構前に保守的なGCから正確なGCになって いた いなかった。仕組みはマーク・アンド・スィープで変わらないが性能は大幅に向上が期待できそう。 github.com これによって、 メモリ確保時 allocatorの使い分けによる効率的なメモリ管理…

OpenSUSEを試してみてる

デスクトップ環境として最新のLeap使ってみてる。 感想としては、 IM(Mozx <-> US)の切り替えがめちゃくちゃ遅い。普通にタイピングに支障が出るレベル。 方向関係なく、「hankakuzenkaku」で切り替えると遅く、「hankakuzenkaku+Shift」だと気にならない程…

プロセス起動でposix_spawnとかvforkとかを使うはなし

posix_spawn/vfork/clone(CLONE_VFORK) はメモリを共有するので速い. 速いが、親子でメモリを共有するので危険である. それでも速いのでプロセス起動で気をつけて使っている言語があり、どういう実装をしているか調べた. 前提 fork-exec間はasync-singal-saf…

D言語の八進数リテラルの特殊扱い

D言語はかつて八進数リテラルを定義していたが、現在は仕様上Invalidとなっており std.conv.octal を使うようにエラーメッセージが出現する。 (dmd-2.081.1)$ cat octal.d void main() { auto _ = 010; } (dmd-2.081.1)$ dmd octal.d octal.d(3): Error: oct…

D言語の静的配列のちょっとかわった挙動

以下のコードの振る舞いはちょっと変わった感じをうけるかもしれない。 int[2] ARR = [5]; void main() { // int[2] arr = [5]; // Error: mismatched array lengths, 2 and 1 assert(ARR == [5, 0]); } この場合、D言語の静的配列はグローバルに宣言した場…

DMDにContributeした

D言語の数値まわりの字句解析のはなし - kubo39's blog これがほっといてもなおってなかったので、自分で報告して修正した。 github.com DMDのビルドははやくて快適だけど、フルテスト回すとそこそこ時間がかかる。 追記 今きづいたけどエラーメッセージにSu…

採用面接で聞きたい55の質問

自分ひとりで考えたわけではない(というかほとんどそうではない)が、採用面接で質問したいことを一覧でまとめてみた。 リスク管理はしていますか, 破滅的なリスクを無視してしまうことを避けるためになにかしていますか? どうやって成果の判断をするのです…

std.parallelismざっくり

D言語で並列処理を扱うためのライブラリとして、標準ライブラリにstd.parallelismがある。 これはstd.algorithmやstd.rangeを使うのとほとんど同じような感じで処理が書ける。 以下の処理はOSスレッドによって並列に実行される。 デフォルトのワーカースレッ…

「Is Parallel Programming Hard, And, If So, What Can You Do About It?」のSpinLockのPromelaのコードを書き直してみた

TLで「Is Parallel Programming Hard, And, If So, What Can You Do About It?」 https://www.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html という本がおもしろそう、というのがまわってきた。 こういう本には珍しく形式検証を扱って…

SpinlockのExponential Backoff実装について

SpinLockのExponential Backoffアルゴルズムの実装を少し調べた. ParkingLot (WebKit,C++) https://webkit.org/blog/6161/locking-in-webkit/ という素晴らしいブログ記事で spinning という節で触れている. どうやら JikesRVM というJVM実装に由来するよう…

DockerとD言語のイメージ

そろそろDockerをまじめにやらないといけなくなってきた。D言語は飾りです。 まずは試す 準公式?のDockerイメージがあるのでpullしてくる。 $ docker pull dlanguage/dmd (...) README にあるとおりに試す、ファイル名だけかえて hello.d というファイルを…

DCDのめも

多くの言語と同じようにD言語にもコード補完ツールがあり、DCDという。 コード補完ツールは基本の仕組みはほぼほぼ同じなのだが、それなりに個性があったりする。 例えばコンパイラがライブラリとしてパーサを提供していてそれを使っているもの(Rustのracer…

Dで生成したバイナリ自身のシンボルをみる

完全ではないが、モジュール情報や関数名や型情報などは .symtab をみればとれる。もう少しまじめにsections_elf_shared.dを読めば意味のあるものになるかもしれません。 import core.demangle; import std.algorithm : map; import std.file : thisExePath;…

D言語の数値まわりの字句解析のはなし

仕様はここにある https://dlang.org/spec/lex.html#Integer これをみると、 0b_ はBinaryIntegerとして表現可能なリテラルとなる。 import std.stdio; void main() { writeln("0b_: ", 0b_); writeln("0b________: ", 0b________); // _ がいくつあってもよ…

社内勉強会でD言語とマイコンのはなしを発表した

スライド Q&A 組込みでDを使うメリットがあまりなかった、Rustのほうが筋がいいのでは? たしかにそうなんですよね Cのライブラリを使わなかったのはなぜ? プリプロセッサマクロがふんだんに使われているので、どうせなら全部自前で実装したほうがはやかっ…

emacsのD言語設定をひさしぶりにいじった

emacs 25.1.1でd-modeを使おうとするとなんかエラーが出てたので今までjava-modeを使っていたが、d-mode.elをM-x byte-recompile-fileすると動くようになったので、ついでにD言語設定をえいやっとやってしまった。 大した設定はしていなくて、 auto-complete…

LDCのsanitizeオプション

LDCはバックエンドがLLVMであるので、sanitizerの機能が一部使える。 一応 address, fuzzer, memory, thread とあるけれど、手元のLDC 1.4.0でまともに使うことができたのはThreadSanitizerのみであった。 AddressSanitizer asan/outofbounds.d void main() …

SSDのはなし

ざっくり。基本的にSSDの特性はNANDの特性で、そこをファームのコントローラーがどのくらいサポートするかで製品の質が決まる。 寿命 NANDの寿命 - よく言われるのが書き換え回数 SLCだと約10万回 書き換え回数 = イレース回数 ブロック単位で行われる(Linux…

静岡旅行

サッカー観戦ついでに一泊二日で静岡に行った。 1日目 はい。 pic.twitter.com/S20zkLrsT3— くそでかいイリエワニがみたい! (@shitsyndrome) 2017年9月23日 シンカンセンスゴクタカイアイス pic.twitter.com/ZXI8ZT7RQ5— くそでかいイリエワニがみたい! (…

Rustでバイナリなライブラリ

最近いじるときにどっかに情報まとめとくといいかな、と思い。他にもあれば是非教えてください。 gimli-rs/gimli - DWARFを扱うためのライブラリ。DWARFってだいたいでかいのでlazy, zero-copyで扱いやすいのは期待してる。 m4b/goblin - ELF/Mach-O/pe 形式…

dfmtのnightly binaryを作成するレポジトリを作った

レポジトリは これ 作成手順を残しておく。 とりあえずtravis gemの力を借りる。ここで二段階認証を行うのだが、やけに失敗した。 このタイミングでapi_keyが作られている。 $ gem install travis $ travis setup releases -r kubo39/dfmt-bin あとはtagつき…

binutilsでどういうオプション使うの?というはなし

manみて適切なの使えば?というはなしなんだろうけど、まあとっかかりとかあるし。 objdump だいたい -Cd(S) もしくは -Cdr(S)をつかってる気がする。Dだと -C dlang とかつける。でもわりとその場その場で変えてるような気もする。 nm -f はポータブルじゃ…

リンカのメモリコマンド

ld

大半のリンカスクリプトでは、リンク先のようにメモリコマンドに (rwx) のように記述されている。(stm32のやつとか) リンカのメモリコマンドの仕様は以下のようになっている。 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/ht…

LDCでのvolatileのはなし

LDCはpragmaを利用してLLVMのコード生成時にvolatileLoad/volatileStoreのハンドリングをしてる。 ここではvolatileLoadの呼び出し/コード生成までみていく。 core.bitopモジュールは、LDCコンパイラを使うときは特に指定しなくても pragma(LDC_intrinsic, “…

D言語をプロダクションに使うには、ということを考える

D言語のコードを社のレポジトリにpushした。(まだmasterにmergeされていないので、先走り気味かもしれない) D言語を使った理由は使いたかったというのもあるが、今回のケースでは 使う箇所が部分的(言語はわりとなんでもいいところ) 標準でjsonを扱うための…

Rustのconst_fnがそれほど使い勝手がよくなさそうだという話

現状ではnightlyでしか使えないが、Rustは部分的にコンパイル時に関数評価を定数畳み込みする const_fn という機能がある。 https://doc.rust-lang.org/beta/unstable-book/language-features/const-fn.html そこでコンパイル時にバイト列を比較するコードを…

Faster command line tool in Crystal?

http://dlang.org/blog/2017/05/24/faster-command-line-tools-in-d/ https://nim-lang.org/blog/2017/05/25/faster-command-line-tools-in-nim.html https://users.rust-lang.org/t/faster-command-line-tools-in-d-rust/10992/14 こんな感じで巷ではやって…

Rustのlockとスコープのはなし

こういうコードを書くと当然deadlockする。 use std::sync::{Mutex, Arc}; use std::thread; fn main() { let mut lock = Arc::new(Mutex::new(false)); let mut cloned_lock = lock.clone(); let th = thread::spawn(move|| { loop { let mut quit = cloned…

D言語のfizzbuzz

FizzBuzzでD言語っぽいコードってどんな感じだろう、みたいな話があったので。 ふつうに実行時に書くならこんな感じだろうか。 import std.algorithm; import std.conv : to; import std.range; import std.stdio; void main() { 1.iota(16) .map!(a => (! (…