ちゃっくのメモ帳

ちゃっくがメモしときたいことをメモしとくよ

PAST3を受験したんだよっ

この記事は解説ではなくただの感想です。

結果

A~Mを解いて88点で上級。
どのくらいのレートだとどのくらいの点数になるか分かっていないので良いのか悪いのかわからず...

全体の感想

普段コンテストにあんまりでないのにPASTが無料と聞いて飛びついてみた。乞食精神旺盛ですねとか言われたら泣いちゃうかもしれない。

社会人にとって5時間を用意するのはかなりハードルが高い。
今回は金曜日の就業後にやった。8時間労働のあと5時間プログラミングするのはかなり疲れる。そのため、2時間くらい過ぎたあたりからは自分との戦いになる(自分との戦いって言いたいだけです)。
土日にやったほうが良さそうだけど1日潰す覚悟が必要でなかなか気分が乗らなかった。(TOEICとかIPAの試験とか1日潰すつもりで受けるのでそのくらいの気持ちで受けるべきものなのかもしれない)。

解いた範囲の感想。
全体的に実装重視の気がした(異常にバグらせまくったのでそんな気がしただけかもしれない)。AtcoderよりICPC国内予選のA~Cあたりのほうが問題のイメージが近い気がしたけど、そんなこと言ってる人みかけないので気のせいかもしれない。
WAに対してペナルティが無いのでそのあたりはすごくやりやすい(サブミットデバッグをするな)。

この試験は40点ラインで初級と書いてある。しかし、40点に達するためには前からだとFまで解く必要がある。Fまで解き切るのに「オーバーフロー」「2次元配列(文字列型の1次元配列)」「グラフを持つ」「回文」(レイヤーが違うものを並べてSorry)などのハードルがある。このハードルは地味に最初の称号を手に入れるハードルとしては高い気がした。
コンテスト中にC問題とE問題でバグらせたときには「おいおい、まじかよ。自分は初級にもなれないのか。。。」って気持ちになったし、D問題の実装で地味に詰まったりした。

問題は全体的に好きだった。(Mまでは)天才的発想を要求してこないし、基礎はしっかり出来てますかみたいな感じが好きだなぁと思った。

各問題について

A問題

とくになし。

B問題

「現時点で」を読み落として詰まる。

C問題

AR^{N-1}を求めるだけ。
ただし、オーバーフローに注意する必要がある。long longを使ったらWAしたので、Pythonに逃げた。後からunsigned long longにしたら通った。

C問題で高速累乗が必要になるのはびっくり。

追記
高速累乗いらないっぽいです。たしかに2^nでもnが30程度でlargeになるか。
https://twitter.com/rian_tkb/status/1269331562304159745?s=19

D問題

問題の意味を理解するのに時間がかかりすぎる。
個人的には「入力例1を見てください」がなんか....

E問題

とくになし。

F問題

とくになし。

G問題

6方向の意味を考えて警戒した。普通4か8方向でしょ....
BFSをすれば良いが、負の座標もあるので実装で添字に下駄を履かせる必要がある。

個人的には、アルゴリズム検定なんだからC問題とこの問題は逆じゃないかという気もしなくもない。(アルゴリズムの解釈にもよるけど....)

H問題

Tが偶数で距離に0.5が出てくるので思考停止で距離2倍、Tを1/2倍した。
結果的にはしなくても良かった気がする。

DPはすぐ思いつくし、DPの遷移もすぐに思いついたけど「地点Lで行動が終了する」ではなく「地点Lを通過すればよい」ので、地味に実装がめんどくさくなった。
とりあえずdp[i]をiで行動が終了する最短時刻を求めたあと、各iに対してdp[i]から1回の行動で通過できる場所とその場所までの時間を計算した。

I問題

とくになし。

J問題

僕は今日夕食に寿司を食べました。(自慢)

セグメント木と二分探索で解いた。
頭が壊れてaを-aにしてRange Maximum Queryにした。よく考えたらRange Minimum Queryでいい。何をしたかったんだ...

実はLISになるというのを後から知った。そう言われたらそうですね。頭がよろしいことで...

K問題

問題としてはとくになし。
最初UnionFindを使おうとしたのでUnion Findっぽく親の番号を保存した。
ただし、地面に振れてる箱は親を「地面の番号」を符号反転したものにした。
これもUnion Findの実装としてどこかでされてましたね。

L問題

これも問題としてはアルゴリズムという感じではないと思ったけど実装が大変になった。
ただ、制約のa<=2を見落とさないように注意する。
最初かなり複雑な実装をしてWAを出した。
実装が複雑化しすぎたのでlinked listで書き直した。

M問題

K<=min(N-1,16)に気がつくと解ける。
TSPなので制約に特徴があるか、問題に特徴があるかのどちらか。

愚直にbitDPしたらWA。
これは、「到着した集合」だけじゃなくて、その集合に到着するときの最短コストのときに「最後にどこの街にいる可能性があるか」を持つ必要がある。
なのでdp[i][j]を「すでに到達した街の集合」と「最後に到達した街」を状態としてその状態への最短コストを持てば良い。

N問題 O問題

読んでいない....

MacでHHKB(日本語配列)のキー設定

Macを新しく手に入れるたびにHHKB Professiona JPとのキー設定で1日潰してたりするのでいい加減メモしておく。
デフォルトの機能だけで思うように設定出来なかったので、Krabiner-elementsを使用する。思うようにというのは、普段使っているUbuntuと同じ感じで使いたいくらいの気持ち。Macに詳しくないし、払って詳しくなる予定も無いので、このポエムよりもいい方法を知っていたら是非教えてほしい。

結論から言うと次のような設定に落ち着いている

  • Macの設定
    • キーボードの入力ソースの日本語の「¥キーで入力される文字」を\(バックスラッシュ)に変更する
  • Karabinerの設定
    • international4 -> かなキー
    • international5 -> 英数キー
    • left_control -> left_command
    • left_command -> left_control
  • iTermsの設定
    • control -> Left Command
    • left command -> control

以下経緯

まず、日本語入力のオンオフをスペースキーの左右の変換/無変換キーで行いたい。
これはKarabinerを使ってinternational4をかなキーに、international5を英数キーに変更している。

また、デフォルトの設定だとバックスラッシュ(\)が入力できず、¥が入力される。これはプログラミングをする上で致命的なので変更する。設定>キーボード>入力ソース>日本語から¥キーで入力される文字を¥から\に変更する。Google日本語入力ならメニューバーの環境設定から変更できる。

次に、ControlとCommandを入れ替えたい。ここでControlというのはAキーの左にあるキー。Commandはスペースキーの2,3個左にあるキーである(Macのキーボードでは英数キーの左のキー、HHKB Professional JPではAltの左のキー)。
このCommandが左下の妙に押しにくい位置にある。そのため、デフォルトのまま使うとCommand+Fで検索だったりCommand+C,Vでコピーペーストをするときに不便。これをControlと入れ替えたりしていく。
これはKarabinerを使って、left_controlをleft_commandに、left_commandをleft_controlに変更する。

しかし、このままではコマンドライン上でCtrl+*系の入力が上手く行かなくて苦しい。
例えば、Ctrl+CやCtrl+Zでシグナルを送信したり、tmuxやvimでCtrl+<キー>にコマンドを割り当てている場合などCtrl+*系の入力は高頻度で使用するため、最下段の左の方にあるキーを使うのは大きなストレスになる。
とりあえず暫定的な解決方法としてはコマンドラインをiTermのみで使用すると仮定しiTermの設定でcontrolキーとcommandキーを入れ替える。この入れ替えにより、Karabinerによる入れ替えと合わせてcontrolキーとcommandキーの配置は元通り(キーボードに印字されている通り)になるはずである。
設定はiTerm > Preferences > Keysで、Remap ModifiersでRemap control(^)を Left Commandに、 Remap left command keyをControlに変更する。



これまでの設定で今の所意図している動作になっている。しかし、iTermあたりで2回入れ替えて元に戻すとかやっていたりして本当に大丈夫か?と不安になったりする。
また、コマンドラインはiTermからのみ使用すると仮定しているけど、デフォルトのターミナルや、IntelliJのターミナルとかVSCodeのターミナルとか使う時は不便になりそう。


誰かこの辺りを上手く設定している人がいたら是非教えてほしい。

2019年振り返り

今年も年末がやってきてしまったので2019年を振り返っておく。
振り返る方法

  • Twitterを漁る
  • カレンダーを見る

1月

DDCC本戦に行っていたらしい。
調べた感じだと3社くらい面接予定日になっている。
確か就活してるときに「この日とこの日とこの日は大丈夫です」みたいな日にちの開け方してたので候補のどれが実際に行った日なのか覚えてない....
この就活の予定管理(衝突するとめんどい)が地味に大変だったのでいい感じの解決方法ほしかった。

Twitter漁ってたら就活飯が出てきた

2月

構想発表をした。
日経のご飯だけ食べる枠には行ったらしい。(懇親ガチ勢かよ)
予定表見る限り面接とか電話面接とかを2社くらいやってるっぽい。
初めてのスノボを経験したら尾てい骨がめっちゃ痛くなったの思い出した。

3月

この月は面接を1回やっただけっぽい。多分、3月で就活を終了している。
PPLに行ったのは覚えているんだが、食べたご飯のことしかツイートしていないっぽくて謎。
函館旅行に行った形跡がある。

先輩に「社会まで残り○日(時間)」とかリプを送っているっぽいんだがこいつ人間か?


4月

艦これのリアルイベントで八景島に行ったことしか覚えてない
Twitter検索してもそれくらいしかないので多分なにもしていない

5月

予定表みてもTCOの時間くらいしか書き込まれてないし、多分何もしていない。
Kotlinコンテストにも出てるっぽいけど「C++なら通るんだがTLEする...」みたいなことしてた記憶しかない。

6月

調べても予定表にTCO Round2としか書かれていないので多分何もしていない。
JetsonNanoで遊んでるツイートをしている。
SIGEMBにshortpaperとポスターを出した記憶があるんだが予定表にない。幻か?
ICFPCに参加した記録がある。(なんか割と破滅して辛かった記憶がある)

7月

痔の手術をした。できれば二度とやりたくないね。
scrapbox.io

8月

REBLSの原稿締切があったので割と論文書いたり実験したりしてばっかだったはず。
手術の後はしばらく安静にするように医者にも言われていたので、家でおとなしくしていた。

9月

新潟旅行をした。上善水如の酒造がめちゃくちゃ楽しかったのでまた行きたい。

Amazon Barに行った。割と安くいろんな酒が飲めてめちゃくちゃ最高だった。
また開催してほしい。

ラボの合宿に行った。技術書展の締切があったので大体徹夜していた。この時は3か4徹くらいしてたけど何故か意識ははっきりしていてすごかった。(自画自賛


技術書展で競合解析の本を@SugerHighさんと書いたので出した。最終的には120冊くらい売れたらしい。

10月

内定式に行ったはずだが、あんまり覚えていない。

SPLASH2019でAtheneに行った。5ユーロで花を買ったりパルテノン神殿を見に行ったりもした。


アテネ、ご飯がかなり美味しくて楽しかった。


11月

虚無しかしていない。
予定表をみると、VimConfに行ったりLINE DevDayに行ったりしていた形跡がある。

12月

修論?まだ早い。

まとめ

うーん。。。なんか割と何もしていないように見える月があるなぁ....
研究くらいはしていたのだろうか(あんまりしてた記憶がない)

IQ1アドベントカレンダーについて

メリークリスマス?
これはIQ1 Advent Calendar 25日目の記事です。
adventar.org

adventar.org


えっと....実は25日目の記事、完全に忘れていて、何もかけてなかったんです。
技術的な記事は1日目に投稿してしまったので25日目はポエムしたかったんですが....

いや、実は修論から逃げ回っていてなんか今月はIQ1AdCを振り返ってたりしてました。。。
改めて読んでいたりしたので、メモ。

IQ1AdC 2017
IQ1AdC、なんで始めたか完全に忘れました。いや、実は多分ICPCの参加期を書くついでに作ったくらいのクソ適当なノリだったと思う....
IQが1 Advent Calendar 2017 - Adventar
なんだかんだ25日全部埋まってました。
IQ1って何書いてるんって思って調べてたら半分ぐらい技術的な記事なんですが、ちゃんとIQ1をしてください。
ちなみに、2017のかもめさんのIQ1の謝罪奉行は3年続けても僕の中で面白さトップです。多分、これまで読んだブログの面白さランキングでもトップクラスだと思う。
なんかkoturnさんの記事の最後に「ちゃっくさんの金で肉が食べたい!」って書いてあるんだけどこれ何....
らりおのIQ1を支える技術に出てくる"迂闊に Enter 押してファイル上書き奴"はちゃんと設定しておきましょう。(今年僕はこれをやっておらずやらかしたなぁというのを思い出しました)

IQ1AdC 2018
IQ1AdCが2枚になって何故か2枚とも埋まってるんだがバグか?
IQ1AdC2018を振り返っていたらaiyaさんがTime scriptについて書いてたりして、あれ、この頃からやってたんだ~って気持ちになったりした。
ちなみにこの年のIQ1AdCの16日目の英語ツール.mdって記事はめちゃくちゃ有用で、英語の論文書くときとかかなり使えたので多分各位forkしておいたほうがいいと思う。
りあんの記事を見てたら予定に1/10卒論第1稿締切って書いてあって鬱になった。(修士の締め切りは学部より早いんですよ。どうなっちゃうの僕の修論)


今年IQ1AdC 2019
2枚目も合わせて現在多分29名くらいで合計33つの記事が投稿されました.
皆さん参加ありがとうございます!!
いや、今気がついたんですが、らりおの「修論?まだ早い」が「存在者の皆様、今日も存在してますか?」になってる。
今年は修論とかあるしやめとこうかなって思ってたけど修論?まだ早い。


来年IQ1AdC 2020
やりたいんですが、始まらなかったら僕が社会の闇に飲みこまれたと思ってください。
社会たのしみ~~~
いや、その前に修論....?まだ早い。いや、もう遅い?

IQ1とOCamlとFirst-classモジュール

はじめに

この記事はIQ1アドベントカレンダー2019の1日目の記事です。
adventar.org

IQ1アドベントカレンダーは今年で3年目です。
なんでこんな意味不明なアドベントカレンダーが3年も続けられてるんですかね!?
登録してくださった方々ありがとうございます。

「IQ1をせずにクリスマスを迎える人を生んじゃってもいいんですか!」
登録していない方々は2枚目を用意したので是非登録してください。

IQ1アドベントカレンダーはその名の通り(?)、何でもありのアドベントカレンダーです。僕は去年はご飯について書いたり、卒業するときにやったことについて書いたりしてました。一昨年はアルゴリズムについて書いたりしてるっぽいですね。真面目な記事、ネタ記事、どちらも大歓迎です。

さて、今年の1日目のネタを何にするか。
できるだけ後ろのハードルを上げないいい感じの記事を書きたいですね。最初は、今年のIQ1の活動について振り返ろうかと思ったのですが、25日目には今年のIQ1アドベントカレンダーの総評を書こうと思っているので1日目を活動記にすると僕の2つの記事の雰囲気が被っちゃうかなぁと思い、プログラミングに関する記事でも書くことにしました。

IQ1の修論を支える言語

本題です。この記事ではIQ1の人間が修論のためにどんな言語を選び、その言語を使う上でどこで躓いたかを記します。
よい解決方法を知っている人は助けてーー。

ある日、IQ1の人間が修論のためにプログラミングをしようと思いました。
色々あってOCamlを使うことにしました。(端折りすぎやろ)

OCaml、書いてみると結構良い言語に思えます。代数的データ型とパターンマッチもありますし、まぁまぁ速度も出ますし、まぁまぁ書きやすいです。
多分、手続き型プログラミングに慣れた人が関数型言語を使ってみたいと思ったときに、OCamlを使ってみるという選択は比較的ストレスも少ないのではないかと思います。

しかし、使いやすい言語といっても書いてる/勉強していると困るポイントというのは存在します。こういうポイントを無視して盲目的に特定の言語を推してる人は警戒したほうが良いと思っています。そういう人はIQ1の可能性があります。(僕はIQが1なので盲目的に意味不明的なことを言っていても許されます。)
使っていると、「これができてほしい」と思うことは多々あります。OCamlを使っていて感じた、そういう「これができてほしい」の1つを紹介します。

OCamlには(もっというとおそらくML系の言語では)、Functor(ファンクタ)という機能があります。
(ここでのMLはMachine Learningを指しません。Meta-Languageの方です。Machine Learningに関する記事が読みたかったらIQ1AdC2018にはいくつかそのような記事が存在しています
IQ1 Advent Calendar 2018 - Adventar )

このファンクタというのはモジュールをパラメータとして受け取り、モジュールを生成する関数です。
(モジュール関数とか言われたりするっぽい?)

おそらく馴染みの無い方は「は?何言ってんだこのIQ1は?」と思ったりすると思うので例としてSetモジュールを見てみましょう。これは集合を表すモジュールです。

まず整数集合を表すモジュールを生成し、使用していく簡単な例を見ていきましょう。

module IntSet = Set.Make(Int);;

let _ = 
  let set = IntSet.of_list [1;2;3;4] in
  let sum = IntSet.fold (fun x acc -> x + acc) set 0 in
  print_int sum (* 10 *)    

これで整数集合を表すモジュールIntSetを作ることができます。
ここで、Set.Makeがファンクタです。
確かにSet.MakeはパラメータIntを引き受けてSet.Make(Int)というモジュールを生成しています。そして生成されたモジュールにはIntSetという名前が付けられています。

では、同様に文字列集合のStringSetも定義したとしましょう。

module IntSet = Set.Make(Int);;
module StringSet = Set.Make(String);;

そして、Set.Makeを用いて生成された任意のモジュール(IntSet,StringSet,...)の中身を出力する関数print_setを作りたいとします。

let print_set (set:Set.S) (printer : 'a -> unit) : unit = ...
  Set.S.iter set printer

ダメです。

これは、関数の引数のtype constraintsには型が必要で、シグネチャ(Set.S)やファンクタ、モジュールを指定することができません。
(話は逸れますが、type constraintsってtype restrictionと違うのでしょうか? OCamlでtype constraintsって言ってるだけ?)
では、関数を多相にすることを考えてみましょう。

let print_set (set : 'b) (printer : 'a -> unit) : unit = ...
  'b.iter set printer

これは上手く行くように見えますが、実際は上手く行きません.

では、locally abstract typeを使うことを考えてみましょう。

let print_set (type s) (set : s) (printer: 'a -> unit) : unit = 
  s.iter ...

これもダメです。
なぜならset : sとなっている部分のsにはsetがIntSetモジュールの値ならば型はIntSet.tになります。そのためs.iterはIntSet.t.iterとなってしまいます。
しかし、iterを持っているのはIntSetモジュールであり、IntSet.t型ではありません。

これでダメだと割と心が折れてきますね。
ここで出てくるのがFirst-class moduleという機能です。
これはモジュールを値として扱うことでモジュールを引数に取る関数を定義したり、モジュールを変数として扱うことができる機能です。

OCamlの普通のモジュールはFirst-classではありません。そのため、普通のモジュールからFirst classなモジュールに変換したり、First classなモジュールから普通のモジュールへ変換したりする必要があります。
では、このFirst classモジュールを使ってどのようにprint_setを実装していくかを見ていきます。

結論から言うとこれでいけます

let print_set (type s t) m (set :t) (p : s -> unit) : unit=
  let module M = (val m : Set.S with type elt = s and type t = t) in
  M.iter p set

これがしていることは、First-classモジュールmを引数と渡して、関数の中でmを一般のモジュールMに戻しています。

これを使うと、次のようなコードが書けるようになります。

let _ () =
  let set = IntSet.of_list [1;2;3;4;5] in
  print_set (module IntSet) set print_int;
  let set2 = StringSet.of_list ["abc"; "def"; "xyz"] in
  print_set (module StringSet) set2 print_string;

print_setの第一引数はFirst-classモジュールです。そこで、モジュールIntSetを(module IntSet)としてFirst-classモジュールに変換して引数に渡します。
そうするとprint_set関数は(val m)でFirst-classモジュールを一般モジュールにもどしMという名前に束縛します。
このようにすればモジュールMは引数として渡されたFirst-classモジュールmの一般的なモジュールとなるのでM.iter等を使うことが出来ます。
このようにFirst-classモジュール(第一級モジュール)を使用すればSetファンクタから生成された任意のモジュールを受け取り、モジュールに含まれる関数を定義するような関数を定義することができます。

因みに、上のprint_setはmの型が(module Set.S with type ...)なので省略して次のように書くことができます

let print_set (type s t) (module S : Set.S with type elt = s and type t = t) (set : t) (p : s -> unit) : unit =
  S.iter p set

こうしてみると、OCamlのファンクタというのは微妙に使いづらい気がしてしまいます。
モジュールをパラメータとして受け取らないとモジュールが定義できず、型をとれないの
そもそもSetを多相で実装してくれていれば.....(実際BatteriesライブラリにはPSetという多相Setがあるらしいです)

これ、C++だったら多分次のような感じで簡単に書けるはずです。
OCamlでもこの辺り、いい手段がほしいです。
(もちろん違う言語の違う機能を比べてもしょうがないのですが...)

template<typename T>
void print_set(const std::set<T>& s, std::function<void(int)> p){
    for(auto& e : s) p(e);
}

int main(){
    std::set<int> st{1,2,3,4};
    std::function<void(int)> f = [](int i){ std::cout << i; };
    print_set(st,f);
}

さいごに

OCamlのModule周り、実はかなり分かっていない。
雰囲気でOCamlを書いている。多分ちゃんと勉強したほうが良いんだけど....
僕はまだこの辺り上手く扱えないので、ちゃんと扱うのは荷が重い。


明日はrian_tkbがなんか書くらしいので期待するか

技術同人を書くのにRe:VIEWを使った話

技術書典7に出す同人誌を書くときの執筆環境の選択についての記録。
まず、最初に思いついたのがTexTexで執筆することの問題点として想定されたのはスタイルの変更が難しいことだった。
印刷所に納品する上で、どのような注意点があるのかは知らなかったがTexでスタイル変更が必要になったら辛いなぁと思ったりしていた。
次に思いついたのがRe:VIEWRe:VIEWは最近話題になってる(電子)書籍執筆システム。
独自の文法で文章を記述して、CSSでスタイルを修正できるくらいの認識だった。

特に理由はないが、話題になってるし使ってみようかなぁくらいの軽い気持ちでRe:VIEWを選択した。

最初はRe:VIEWの(公式の?)Dockerを使うことにした。
とりあえず動かしてみるとPDFを出力する場合はCSSでスタイルを変更できないらしい。
(最初はCSSの記述に応じてTexのスタイルを定義するコードを吐くのだと思っていたけど違いそう。多分。)
PDFを出力したときのスタイルが上下左右にT字のマークが入ってあまり好きではなかったので変更したいが、Texでスタイルを弄るのも嫌だったので別の方法を探すことにした。

aiyaさんがRe:VIEWで書いていたのを思い出したので相談したらreview-css-typesettingというものを教えてもらった。
これはVivliostyleというものを使うことで,CSSでスタイルを定義してブラウザ上ではPDFっぽく見えるなにかが表示される。
ブラウザの印刷機能を使ってPDFに変換してあげれば良い。
調べるとreview-and-css-typesettingのほうがあたらしそうだったのでこちらを使った。
github.com

これは確かに便利だった。
特に新しくコマンドを定義するのもCSSで書けるのがよい。
ただ、いくつか問題にぶつかった。
例えば、listnumを使用したときだけキャプションが上に来るとか、表紙を入れて上手く表示できないとか....
多分前者はrubyの拡張とかで上手くやればいいし、後者は印刷所に出す時は表紙は別でいい(これは後からしった)ので実は問題ではない。

ただ、この問題にぶつかったのが締め切りの前日とかでかなり焦っていたので、別のRe:VIEWの執筆環境を使うことにした。

次にRe:VIEWのStarterキットを使用した。
config.ymlを書かなくて良いので便利だった記憶があるが、何か問題が起きた。(何が問題だったか正直忘れてしまったけど、ページ番号を大扉を1ページ目にできないとかそんなんだった気がする)

結局、締切当日に大扉を1ページ目にできない問題を解決できていなかった。
最終的にはTechBoosterさんのC89-FirstStepReVIEW-v2を使用した。
github.com
これは、日光企画さんに出したことがあるという記述をみたのでこれを使うことにした。
原稿は書き上がっているので、移行のコストは殆ど無かった。

正直締切ギリギリだったので日光企画さんに出したことがあることが分かっているのは安心感がつよい。
Re:VIEWに詳しくないので、細かい調整を指定されたりしても直す時間は無かっただろうし....

これを使った感じだと、唯一設定方法がわからなかったのが「本文を何ページ目から始める」かの設定ができなかったくらい。正直これは時間が無いなら諦めてもいいという判断をしたのでTechBoosterさんのリポジトリを使わせてもらった。

感想

Re:VIEW、最近流行っていると噂を聞いたので使ってみた。便利だと感じたのはRubyで拡張を書けるのとCSSでスタイルを書けるのが便利。ただ、PDFを直接生成しようとすると結局スタイルをCSSでは書けなくてTexで書く必要があるので、Vivliostyleとか使ってるreview-css-and-typesettngとか使ってブラウザで表示したものをPDFにするのが良さそう。


まぁ、後はまだTexほど知見がたまっていないのがちょっと辛い。何かをしようと思ったときにTexだとぐぐると大体なんとかなったり、周りに解決方法を提示できる人がいるので安心感がある。

【宣伝】技術書典7 「す04D」で技術同人を出します

技術書典7「す04D」で技術同人を出します。
内容の紹介をします。
サークル:バイナリイーターから
"Datarace Detection Algorithm and Implementation"という名前の同人誌です。

↓こんな感じの本になる予定です

f:id:chakku000:20190921190425j:plain
表紙

f:id:chakku000:20190921192456j:plain
目次

本の内容は大まかに2つです。
1つは「データ競合」の検出アルゴリズムについてです。
データ競合というのは並列プログラミングで発生する並列バグの1つです。
本書ではデータ競合とはなにか、どういう影響を及ぼすかという話から、デバッガがデータ競合を検出するアルゴリズムの1つを紹介します。

もう1つは「動的解析ツールの実装方法」についてです。
もう少し簡単にいうと、デバッガの中身と作り方について解説しています。
動的解析ツールは中に仮想マシンを持っていることが多く、本書ではこの仮想マシンが中で何をやっているかについても記述しています。
デバッガの中の仮想マシンの動作について記述している資料は日本語では(僕が知る限り)あまり多くありません。
仮想マシンについて、今より少し正しいイメージを持つための入門として本書が役に立つかと思っています。
また、更に前半で説明したデータ競合の検出器を実際に実装する上でフレームワークをどのように使用すればいいかを具体的なコードを載せながら説明します。


初めての同人活動ですが、できるだけ誰にでもわかるようにデータ競合とデバッガのもつ仮想マシンについて解説したつもりです。
是非、「す04D」にきて"Datarace Detection Algorithm and Implementation"を手にとってみてくれると嬉しいです。


@chakku_000