kubo39's blog

ただの雑記です。

いまさらマンデルブロー集合を書くので、なるべく型安全っぽくを意識した

プログラミングRustをちらちら読んでいたら並列化の例としてあったので、いまさらマンデルブロー集合を実装した。 元のコードがRustなのでなるべく型安全な感じに書いてみたつもり。 他の言語でfind相当のものがcountUntilという名前で、findは別の操作を行…

zshを自前でビルドして使う

zsh

zshにパッチあてて使ってるんだけど、ビルド方法とか一応メモしておく。 zshのビルドは楽にできる、まあ今回の作業では必要なかったのだけれど。 $ apt install -y yodl # 依存ライブラリ, あとPerlとかも必要 $ ./Util/preconfig $ ./configure $ make パッ…

jailingをD言語にポーティング、やってみた!

kazuho/jailing をD言語に置き換えてみました。 これです。 目的 実用的にはLinuxであればどの環境でもPerl5が入っていることは期待できるし外部依存もないので特に意義はないです。 あくまで学習目的というやつです。コードサイズも小さいし、いいかなって…

ベイルート・ロンドン・リバプール旅行記

3/25~4/2でベイルート(レバノン)、ロンドン・リバプール(イギリス)旅行に行っていたので雑に記録を残しておく ベイルート 直行便がないのでフランクフルト経由。フランクフルトのラウンジで食べたパン・ソーセージとビールがこの旅で一番うまかった可能性が…

けものフレンズ2を総括する

人にはそれぞれの感想がある、これは自分のために整理するくらいの意味合い よかったところ ゴマちゃんことゴマすりクソバードがいいキャラだった フレンズのキャラデザがよかった ゴマすりクソバードとバンドウイルカがかわいかった ごまちゃんやチーターの…

argc = 0 でプロセスを動かす

DMDのコード内ではargcが0な環境を想定してコードが書かれているが、そういう環境は存在するのだろうか。 調べてみるとわりとすぐにstackoverflowがみつかった。 c - executing a process with argc=0 - Stack Overflow posix_spawnを使えばできるようなので…

Isabelleちょっとやってます、という近況報告?

ここ最近Isabelleを触っている。 Coqと比べると日本語の資料が少ないのでつらい。 とりあえずいろいろわからないことが出てきたので並べてみる。 2以上の自然数を扱うと簡約できない 例としてmap関数を定義する。 fun map :: "('a \<Rightarrow> 'b) \<Rightarrow> 'a list \<Rightarrow> 'b list</rightarrow></rightarrow></rightarrow>…

小ネタ: safe functionとcast function of null

おなじみ(?), safe functionを考えてみようの会です. 突然ですが, 以下のコードは合法でしょうか? void main() @safe { (cast(void function() @safe) null)(); } 結果はおおかた予想がつくとは思いますが、Segmentation Faultになります。 (dmd-2.084.0)$ …

scope parameter storage class と in parameter storage class

(2019/02/07; いくつか追記したのでそちらのほうもみてください) 現在の最新版コンパイラ(DMD 2.084.0)だと, このコードはSEGVで落ちてしまう. auto foo(scope void delegate() @safe dg) @safe { return dg; } auto bar(void delegate() @safe dg) @safe …

DMDでprofileオプションを使ったときだけスタックオーバーフローする不思議なバグの調査

なんかおもしろいコンパイラのバグに遭遇したのでめも。 もともとはpeggedを使ったプロジェクトで dub build --build=profile でビルドしたバイナリを実行するとSEGVに遭遇するんだけど・・・、という問題だった。 とりあえずgdbにかけてみると >>> bt 10 #0…

C言語のmainでめちゃくちゃできる、ってネタみたけど別にDでもできるよな。 main is usually a function はでないけど。 extern (C) void main() pure nothrow @nogc { asm pure nothrow @nogc { naked; db 0x31; db 0xC0; // xor EAX, EAX; db 0xFF; db 0xC…

druntimeのcore.syncについて

いろいろいけてないよな。 Mutexの実装がデフォルトでre-entrant 不定な振る舞いよりはデッドロックが早期にわかるほうが100倍マシだから 条件変数およびセマフォのタイムアウトつきwaitがmonotonicなclockじゃなくシステムクロック なので、システムの時刻…

ErupteDを使ってDからVulkan触ろうと思ったけどできなかった話

最近しょうもない記事ばっかり書いてるけど、無職だとこうやってメリハリつけないとだめかなーと思っての行為なので許容して。 DでVulkanさわろうとおもうと https://github.com/ParticlePeter/ErupteD というライブラリが一番スターついてるっぽいのでこれ…

LDC向けのSIMDライブラリを作っているけど、いろいろつらい

x86intrin 勉強がてらにLDCでx86intrinsicっぽくSIMDを書けるライブラリを書いてみている。まだまだ全然途中なので使わないでください。 github.com _m128iとかじゃなくてそのままbyte16とかを直接 _mm_XXX の引数にとったりするようにしてるけど、将来的に…

perfを使ってD言語のプロファイリング結果をみる

まず手元の /proc/sys/kernel/perf_event_paranoid を確認する。Ubuntuとかだと最弱設定になってるので変えとく。 $ cat /proc/sys/kernel/perf_event_paranoid 3 $ sudo sh -c 'echo 1 > /proc/sys/kernel/perf_event_paranoid' 普通に perf record にかけ…

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________); // _ がいくつあってもよ…