Subscribed unsubscribe Subscribe Subscribe

ろじかるんるんものがたり

病人が特に何も書かない。無駄だからだ。

お休み

体調崩し続けてご飯もろくに食べられない状態が続くと精神的にも弱るので良くない(挨拶)

もう一週間弱横になり続ける生活が続いてます。各位、誠に申し訳ございません…

病人なので常に体調は一定悪いとはいえ、起きられなくなる程の状態が三日以上続くのはいくらなんでもおかしい奴です。色々考えた末、気温差なのでは…?と思いクーラーを導入したら回復し始めた感じ…がするんですが、たまたまの可能性もあるので、もう少しだけ休みます。具体的にはひたすら横になるだけなんですけど。本当に退屈で辛い。

これまでも同じようなケースがあったんですが、さすがに五月なんかにはなかった。なんですかね、一時的に日中だけ暑い日が続きでもしたんですかね。気圧は兎も角、気温はあまりチェックしてないので分からない。今後はチェックするようにしよう。いや五月ですよ五月、梅雨入りすらしてない。今日とか予報見る限りはもうクーラーいらないのでは、という感じなんですが。でも切ってまた悪化しても困る。嗚呼電気代…

こんな調子で、既にこれ書ける程度には元気ですが、油断してまた体調崩すみたいなことをこれまで何度もやってるし、医者にも(原因わからんけど)安めといわれたので、しっかり休む、といっても現実的な話、あと一日二日で元気にならないと、今月の稼働時間がまたやばくなってしまう。本当に稼働時間が足りなくてまずい。今月は GW あったからせめて 50…目標…四時間の勤務を 12 日もすればいいだけのことが何故できないのか。

正直ここ色々ガタが来てる感じはします。考えない、考えない。

いくら契約上問題ないとはいえ、ろくに働けてないし、申し訳ないし、今のお仕事はもう契約切らせてもらってまた療養に…とか真面目に考えてたんですが、現金な物で、ある程度回復した今はあーー恥ずかしい情けないという気持ちでのたうち回りそう(実際にのたうち回ったら足辺りが攣りそう)な次第です。七年も病人やってる人間の精神が強いわけないだろうがコノヤロー。真面目に普通の人間ならとっくに自殺してると思うんですけどどうなんですかね。

病気だけではなくて、病人特有の体の弱さにも気を付けないといけないとわかってはいても、これは本当に難しいです。頭が回るだけ痴呆とかよりはましだろうけど。

書くこと書いたので横になります。そういえばこれアンドロイド君からもかけるんだっけ…いやかけるのはもう使ってないぶろがーくんのほうだっけ…まあいいか。

といった具合で生き恥絶賛垂れ流し中です。それでも頑張れる範囲で頑張れるように、今はちゃんと休まないと、というわけで横になります。ただ生きるだけが厳しくても、厳しくない方がおかしいのだと考えればよいだけの事なんだなあ。

Remove all ads

近況

先月は何とか 30 時間は稼働できたようで、いや 30 時間って少なすぎるんですけど、まあ兎に角体調が悪い。これでも先々月よりましというのが怖い。

最近は兎に角体調悪いことが多く色々できてなくて、横になってこの前(といっても二か月程前か)始めた FGO 触ったり、アニメみたり、hulu でドラマ見たり、ぼんやり何もせずに横になったり(これが一番多い)みたいに過ごしてることが多い。良くない。グラブルAndroid からだとまともに遊べないので遊べない。iPhone では快適らしいけれど、スマホ RPG とは…

病気のせいにしてばかりで、何もせず横になったりみたいなことでいいのかいやよくないという気持ちと、病気なんだから横になってて当然じゃん何いってるんだ、というかなんで病人が働いてるんだという気持ちが日々戦っています。

そんな感じです。でも真面目に最近体調悪い日が露骨に多くて、薬もいよいよ本格的に効かなくなってきてるしきついなあという感じです…20 * 3 の 60 時間は安定稼働したいんですけど…30 ってその半分じゃん…今日もアラーム 10 時にセットしてて止めた記憶はあるけれど、低気圧で完全に無理になって気づいたら 16 時回ってた。死にたい。

迷惑ばかりかけています。生かして頂いてありがとうございます。情けない。

Remove all ads

わがまま

自明なことなんだけれど、もうずっとわがままばかり言っている。

まず仕事からして、ボクのわがままである。部分就労の許可も出ていない。良くなる傾向もない。病状から言えば大人しくしとけという話である。

祖父の病状が悪化したりなくなったりというのもあったけれど、そもそも実家へ帰れという話もある。はっきりいって、一人でまともに生活できる状態ではない(日が多い、体調良い日は人並みだと思う)

この前の Lycee フェスタも当たり前だけどわがまま。おかげで今週は今日何とか外出予定済ませた以外は何も仕事できていない。

そうでなくとも前回のお仕事同様、仕事請けて二か月くらい経った辺りから、気持ちに体がついてこなくなることはわかっていたのに、まあダメダメである。

他にもまあいくらでも思いつく。一々書いてるとキリがない。

そんな調子で世間様に迷惑ばかりかけている。生きてれば大なり小なり迷惑はかけるものだけれど、ボクは控えめにいってもかけすぎている。

どうにかしたいんだけれど、どうにかできるんだったらとっくにどうにかなってるだろうし、まあどうしようもない。横になってると悪いことばかり考えていけない。

Remove all ads

東京リセフェスタ参加記録と雪の話

このブログにしては珍しく、TCG の大会参加したよという記事です。

Lycee overture の公式大会、東京のリセフェスタに参加してきました。

宙雪でした。ちなみに宙雪の使用者は一名、自分だけだったそうです。当たり前だよなあ?旧 Lycee のメインデッキが雪だったので、どうしても雪を使いたかっただけ、それだけです。勝ちに行くなら日使ってたと思うんですが、旧 Lycee の頃から勝つことより自分の好きな色のデッキでなんとか頑張ることに価値を見出すタイプだったので…日全盛期に雪でぎりぎり止めきって勝ったとかあったなあ懐かしい…

いきなり雪的に絶望的な話。攻めとしては dmg4 とテンポアド、守りとしては 2 ハンド AP 3 ブロッカーが大切という環境に対して、雪単では全く勝ちの目が見えませんでした。旧 Lycee に比べて除去のハンドが重くなってる上に、テンポアドを取れる、相手のテンポアドを削げるカードがない。「荊軻」なんて抜くことすら考えましたが、AP3 なので DP2 のアタッカーに合わせても良い、DMG2 とはいえ殴れる、当然除去もできる、ということで結局採用しました…が、ようは器用貧乏ということでしかないよなあ、と当日になって気づきました。優秀なドローソース追加されるか、コストからタップが消えでもしない限りは現環境ではただただ遅いとしかいいようがない。でも抜いたら本当に雪使う意味がなくなるね???

最初は混色が作りやすい花と合わせて花雪を作っていましたが、いかんせんデッキパワーが足りない。というか花単のほうが安定して強い。花のコンセプトに対して、雪が特にプラスにならないんですね。除去で穴開けて 5 点通ったよーわーいみたい悠長なことやってられる環境じゃないし。

最終的に、フェスタ二日前に宙雪とかいう気の狂った混色に走りました。宙も雪も今のカードプールだと混色には向かない色です。当然のごとく不戦勝覗いて全敗したんですが、コンセプトは貫けたのでよし。一戦目は、相手がラストターンハンドゼロ枚からのトップディスティニードロー「アーラシュ」のサポート効果追加一点で詰められてなければ勝ってたし…あれは悔しかったなあ。四戦目(だったっけ)も、事故って即投了したんですが、その後空いた時間でやったフリーでは普通に勝てたし…気の狂ったデッキでも、コンセプト通り動くことができれば一定強いという、当たり前の話なんですが。

ということで使ったデッキ。レシピは公式に提出したのがあったので雑にリンクで済ます。コンセプトは「ヴラドおじさんの打点を通し続ける、通らなかったら能力で対面飛ばして代わりに清姫に五点出してもらう」です。理想としてはヴラド清姫並べて毎ターン 8 点、できたら 10 点。まだ調整の余地はあるんですが、正直コンセプト通り理想通り動けてやっと勝負できる、程度のデッキパワーなのでもう調整もしないと思います。次の公認大会何ででようかな…体調的に出られるか怪しいけど…

SR マシュは採用していません。代わり(?)に R マシュが採用されています。理由は簡単で、日も宙も止められない、止めきれないからです。日は合わせたところで盤面を動き回るので、後ろから埋めるような動きしないと、半端に守るのでは意味が全くない。宙は除去が間に合わない。殴り合い宇宙です。

どうせ止められないなら、打点レースを遅延させるほうが筋が良いだろうと考えました。考えましたというか、昼食以外全勝の誰かさん(誰だろうね!)に言われて、確かに~となったので採用しました。毎ターン受けるダメージが 1 下がるのは旧 Lycee プレイヤーなら分かってもらえると思うのですが、特に今のような殴り合い宇宙環境だと大きいです。いきなりマシュ出すわけには行きませんが、出すべきタイミングで出せれば、1, 2 ターン分はゲームが伸びます。伸びた分だけ、除去を打てる可能性、宙のオダステアタッカーで後ろスタートで相手テンポ削いでオダステパンチ、等をできるチャンスがでてきます。相手が宙だと遅延してもあんまり意味ないんですが、どうせ日だらけだろうと思っていたので。蓋を開けたら割とそうでもなかったのでびっくりしました。

同じ DMG を下げる能力持ちだと、宙に「ダビデ」がいるんですが、タップに宙 2 点は重すぎます。タップだけなら採用したなあ。でもタップだけで 2 点減らせるって強すぎるか…

「実力行使」は不採用です。AP4 とテンポアドがものをいう環境で、除去のためにハンドを抱えて…なんてことはできません、こっちも初手からもアタッカー可能な限り並べます。ドローソースもないので当然除去打てるほどハンドに余裕ができることなんて、単色でも中々ないのに、混色でコスト足りるわけがありません。ので不採用。

一方「ガンド」は採用で、これは軽くて割と打てるというのと、ヴラドおじさんの対面に出てくるのが基本的に 2 ハンド AP3 の AP ブロッカーだからです。清姫が出ていればワンチャン 5 + 5 の 10 点出すぞオラーという…決まれば強いですよ、決まればね。早々決まらないけど。

ヴラドおじさんと言えば、弱点の DP2 を補う宙の「カルデア戦闘服」ですが、混色にしていることで雪の「宝具解放」も採用の目が出てきます。ヴラドおじさんが「宝具解放」で SP3 になると、清姫をサポートすることで AP 6 までもっていけます。5 と 6 は花相手だとかなり違うので大きいです。DP で真面目に守ってこない花以外の色にはあまり意味ないけれど…あと、なんだかんだ雪の DMG4 アタッカーの「アルトリアオルタ」も DP2 で同じ弱点を抱えています。ということでアイテムはどちらも採用。試しに両方 4 積みで回したら、当たり前ですが、サーヴァントが出ない事故が起きることが分かったので、コストバランス見ながら適当に減らしました。

DMG2 DP2 アタッカーは各色にいるのですが当然対策されていて、ガンド抱えてツーハンドこいやーとか思ってたら、日の 3 ハンド AP 4「メアリー・リード」をいきなりおかれて、うへーってなったり(混色ってばれてたので、ヴラドの能力打たれない可能性そこそこあるので普通にあり)、そうでなくても「割り箸」とか…あと大会参加賞の「フランシス・ドレイク」がヤバイ。ドレイクは二種類とも大概な性能してます。ネロも二種類とも大概な性能してるし、日は化け物が多すぎる…

これ以上だらだら書いても仕方ない気がするので、とっとと結論出してしめます。

結論、現環境では雪に勝ちの目ほぼないと思います。以上です。

以下蛇足。入賞者の方も何人か壇上でいわれていましたが、Lycee が復活してくれたことが兎に角嬉しいです。病人なのに無理してフェスタでたおかげで、月曜火曜と死んでて(今も体中が痛い…)明日も多分死んでるので、社会人としては完全にダメなんですが、出られてよかったです。大好きだった TCG が復活したのに最初の大型大会に出ない手はない…とはいえ…えー、お客様各位、本当にすいません…いやほんとシステムパクってシャドバみたいな感じでどこかが出さないかなーと思ってた矢先の復活だったのでもうね本当にうれし(略)

追記:もうちょっとフェスの中身に触れよう。

自分の記録とかまあどうでもいいし、折角見てたので決勝の話。

日単のらじおさん対宙単のふうげつさん。このマッチアップだと基本的には日単有利なんですが(というか今、日単に有利取れるデッキが日単みたいな状態だと思う)、どの色をメタるかで割と変わってきます。軽めの日単対ヴラドメインじゃない宙単だと、割と宙単有利だと思う。初手ヘラクレス出せるといいですねコストきついけど。

結論からいうと、らじおさんは普通に玉藻の前を採用していました。宙単に対しての日単は、ヴラドが濃いかどうかで変わると思うんですが、基本的には、環境に除去ないし(バウンスはあるけど)ファッティにはファッティ理論で玉藻の前採用が正義な気がします。即カルデアスでバウンスされて泣くこともあるでしょうが…

まず、じゃんけんはふうげつさんが勝ち。テンポアド命な今の環境では、先行が取れるかどうかは本当に大事です。ずっしり構えて後ろから埋めつつオダステで攻める回し方する宙単の場合も、さすがに日相手だと先行がいいんじゃないかな…

続いてマリガン。手元見えなかったけれど手札良くなかったらしく、らじおさん、ふうげつさん二人ともマリガン。

先行のふうげつさんのハンドがかなり厳しい感じに(ふうげつさん側から見てました)。先行 1 ドローも振るわず辛うじて二体展開の苦しい初手。これに対して、後攻のらじおさんが SR ネロ、P ネロ、玉藻の前という、役満みたいな返し。見てる側ですらうわあという感じだったので、ふうげつさんの絶望度合は凄まじかったと思う。

盤面を動き回る三体が殴って殴って 9 点を通し続け、時にはネロが下がって一列止め(宙は SP が基本的に 0 なのでサポートで突破できない)…いや本当に、ネロどうかしてますね。ドレイクとネロはおかしい。なんで相手ターンにまで自在に動きまわってるんだよほんと。

らじおさんは初手以降、ハンドをチャンプブロックくらいにしか使わず、つめろの場面もしっかりネロでつめて勝ち。正直、さすがに一方的すぎて、決勝卓でこれは辛いなあ…という感じのゲームでした。らじおさんの初手がマリガン後と 2 ドロー含めて本当に役満だったので、仕方ないんですが。

ドロップはしなかったんですが、途中不戦勝したときに覗いた上位卓も、日単が矢張り多くて日単強いなーという感じでした。日単に有利取れる可能性あるの宙単くらいだと思うんですが、日単は日単で宙単をメタった構築にできるし、仮に日単ミラー想定して組んでても宙単に不利かといわれるとそこまで…だと思うし、日単ヤバイなあ…と改めて思わされる決勝戦でした。

ScalaMatsuri 2017 に参加しました

しました。感想とかそういう感じの記事になります、遅くなりましたすいません。

色々あってそもそも CFP 応募してなかったんですが、結局二日目のアンカンファレンスで発表させてもらいました。

アンカンファレンスは、一日目にまず話したいことを適当に大きめの付箋紙に書いてホワイトボードにはり、聞きたい人たちが付箋にマーカーを付けて、マーカーが多いのを二日目にやる、という感じなのですが、たくさんマーカー頂けたのでこれは頑張らないといけないぞという感じで、大変でした。

タイトルは "What is Composability in Scala" で、発表スライドは以下に。兎に角時間がなかったので、口頭で補足しまくる感じの作りになってしまいました、スライドだけ見てもよくわからないと思います。

slides.com

Scala のオブジェクトシステム使えば ML 系のモジュールプログラミングができるよ、知らず知らずのうちにモジュールプログラミングをやっているんですよ、Haskell だけでなく ML からも学べるところはあるのでやっていきましょう、みたいな話でした。

実際 ML のモジュールを使ったプログラミングというのはプログラムの Modularity を向上させる上でとてもよく、なんで皆 OCaml じゃなくて Haskell から入門しちゃうのかなあといつも思う。

思えば self-type annotation について ScalaMatsuri で話すのは二度目な気がします。この言語機能はとても有用な割に、いまいち正しく使われていないというか、そもそもあんまり使われていない、と思う。

実装継承は is-a 関係でないし、実装詳細が外部に見えてしまう、ので所有(aggregation)を使いましょう、DI しましょう、みたいなことが古くから OOP 界隈では言われてきているわけですが、Scala の self-type annotation は、これに対する言語としての一つの回答になっていると思います。

あと、self-type annotation は最終的に具象化されるタイミングで、要求しているものが実装されていればよいのに対し、コンストラクタ DI とかだと、クラス A を要求するクラス B を要求するクラス C を要求するクラス D …みたいなので wiring が大変冗長になる。なので DI 「コンテナ」(DI と DI コンテナを混同する人が多いので強調しておきます)使おう、となるわけですが、DI コンテナは強力な反面、適切に使わないと、逆に依存関係スパゲッティができあがりがち。DI コンテナを使っていたつもりが DI コンテナに使われていた、みたいな…現在進行形で請けているお仕事のコードがそんな感じで、どうしたものかという心持ちなのですが。

abstract method(member) でいいじゃないか、という声もあるかと思います。それはそうです、自分だってなんでもかんでも self-type annotation にはしません。目安として、abstract member が 3 つを超えたら、基本的には別 trait に分けていいと思います。他の評価軸としては、自明に妥当な名前をつけられるなら別 trait に分けていいと思います。

self-type annotation のメリットは他にもあります。例えばメソッド定義 A、A のための抽象メソッド宣言 B、メソッド定義 C、C のための抽象メソッド宣言 D…みたいに、抽象メソッドが具象メソッドに埋もれてしまっていると、何を実装すればいいのかぱっと見でわからなくなってしまう。抽象メソッドをまとめてクラス定義の一番上や一番下にまとめるという手もありますが、self-type annotation なら要求されている型を見ればすぐにわかる。命名がしっかりしていれば要求されている型の定義を見なくてもコードが読める。適切なモジュールの切り分けと命名による可読性の向上ですね。

最近の IDE は賢いですから、定義がまだないものを列挙しといて、なんなら中身空っぽでメソッド定義書いといて、みたいなことがサクッとできるわけですが、IDE で常にコード読むわけではないので。

あとは実装「だけ」を継承する記法、というか言語機能があればなあと思うんですが…mixin して instantiation したオブジェクトは、そのままだと型推論で mixin の情報全部残るので(A with B with C みたいになっちゃう)、基本的には型注釈をちゃんとつけてあげるわけですが、object とかはそういうわけにもいかない。package object で val わざわざ使ってやるしかない。大変だるい。

発表内容にもありますが、(abstract) type member の存在も非常に大きいですね。話すと長くなるので略。

あとは first class module が自明に実現できているのが地味に大きいのではないかと思います。逆説的に、ScalaOOP で当たり前にできていることが、実は ML 系では難しいということになるので、なかなか面白いですね。first class module 実現するために必要な型チェッカの修正が大変らしいので、仕方ないけれど。

他には、自分の発表の一つ前の発表 "Poor man's type classes revisited" で色々と補足させて頂きました。Haskell の型クラスがどういう風にコンパイラに解釈されて翻訳されるか、みたいな話をしました。Haskell は thunk を使って評価していくので、型クラスの辞書のようなよく評価されるものはパラメタの頭にあるといいので、パラメタの頭に辞書を持ってくるわけですね…とか書いても、当日あの場にいた人間にしか伝わらないか。この話は終わり。

というわけで ScalaMatsuri お疲れ様でした。まずは今年も問題なくカンファレンスを実現、成功してくれた運営の皆さんに感謝。でも寿司バー瞬殺だったのは次回改善して欲しいですスシウオーウオースシ。次に、チケットを譲って頂いた、侍スポンサーの Dazzle 様にも感謝。今契約中のお客様です。



チケットを譲って頂いたということで、ここからは社の宣伝をしたいと思います。

Dazzle 様はウェッブサイトにもありますが、(自社製品としては)VR をやっていく感じの会社です。前述のウェッブサイト見てもらうのが早いので、詳細は略。

個人事業主の自分が何をやらせてもらっているかというと、ざっくりといえばコンサルに相当するようなことをやらせて頂いている、と思います。コードレベルで、ここはこうしたほうがいいんじゃないでしょうかと突っ込んだり、設計レベルで文句…もといアドバイスをしたり、自分でコードを書くこともあります。こういうの欲しいけど作るの難しいよね〜→ヨッシャ任せんしゃいみたいな。ただの便利屋な気もします。今はリリース前なので、進捗に影響出ても悪いし、レビューやツッコミはほどほどに、リリースに関係ない作業を細々とやっています…例えばこれ書いたり…仕事の範疇…だと思う…

うちのブログ見てる人は大体知ってそうですが、自分は結構面倒で重い症候群を患っている病人なので、一日に四時間程度が稼働時間の限界です。基本的に在宅じゃないと厳しく、出向なんてすれば着く頃には体力をかなり削られる、といった始末です。この前なんて社に出るだけ出て半分くらい寝てました。我ながら酷い…そんな感じで、色々融通を効かせてもらって、なんとか働けています。これは自分に限ったことでなく、社員さんにも基本在宅の方とか、たまに在宅作業する人とか、普通にいます。

所謂「自由な社風」が実現されていると思います。「自由な社風」を謳う会社の多くの、許容する働き方の狭きことといったら本当にもう…Dazzle 様はその点、働き方に関して融通がかなり利くと思います。自分だけでなく、社員さんも自由な感じです。勿論普通に働いている人もいます、というかそっちが多数派な気はする。一方で、コアタイムさえ出ればええねん〜みたいな感じでやっていく人もいますし、前述した通り今日は集中したいので在宅で〜みたいなこともあり。本当に自由です。あと、変わっていることというと、一日八時間じゃなくて七時間です、珍しい。といったような自由な社風を実現する一方で、無法地帯化したりということはなく、ちゃんと注意されるべきことはされますし、守られるべきことも守られるよう各位ちゃんとしています。良いことだと思います。

もう少し規模の小さいスタートアップとかなら、このくらい自由なところは他にもありますが、大きいところで実現されている所はあまり知らないです。

ファシリティは…紅茶党には厳しいです。コーヒーメーカーしかない。辛い。あと人が増えてきて机が足りなくなり、ついに基本的に在宅の自分の席はなくなってしまいました。かなしー。他にも色々書けるといいのですが、基本在宅なので正直あまり詳しくないです。

ScalaMatsuri の侍スポンサーになるくらいなので、Scala を業務で採用していますし、Scala が書ける人材を募集している、はず、です、多分。正直にいって、Scala native がいない状況なので、Scala native な社員さんが欲しくてたまらないんだろうなあ、という感じです。Scala を業務で書きたい人は是非。native くらいのレベルの人が入ったら、自分も多分楽になるし…!自分がお仕事させてもらうことになったのも、現場に Scala native がいないから、というのが一番だと思います。正直これは〜〜?と思うコードは、レビューしてるとそこそこ出てきます。腕の見せ所ですね、出来てるかは兎も角。Scala 関連のことから、プログラミング一般に言えることまで、色々です。あと C++ とか MSVC のビルド設定とかもやっている気がする。自分の業務がなんなのかわからなくなってきた。

Scala 以外だと Javascript(node.js) だとか色々。求人サイトなりを見てもらう方が早いと思うので省略。

ところで、書いていて思ったけれど、Scala native って何をもってして native といえるんだろう…言語機能 8 割知っていて 6 割使いこなせて有名どころのライブラリ一通り触ってれば native か…?まあ良いか、兎に角 Scala 書ける!Scala 書きたい!という人は是非ご一考を。今ならボクが業務でマサカリ投げます!(嬉しくない)

Wantedly にも求人出してるそうですが、Wantedly へのリンクは宗教上の理由で貼れません。ぐぐったら出てくると思うのでそれで。Wantedly 以外の求人サイトにも求人は出ていると思います。Facebook もあるはず…

追記:ファシリティについて、お茶が知らぬ間に増えたそうです。求人に関してはコーポレートサイトが最新とのこと

とある社が矢張りなくなってしまうことが決まってしまった。

経緯を知ってしまっているし、関係者を大体知っているので、色々思うところはあるんだけれど、兎に角残念というのが一番。

仕事を取ってくるっていうのは本当に大変なことなんだな、というのを個人事業主になってから少しは分かった…と思う。自分の場合、病気を患っているという点で、普通よりはるかに厳しいというのはあるんだけれど。
まで書いた時点で、去年やってた案件は、なくなる社にいた人からの紹介だったことに気づき、また大変複雑な気分になった。
その点、ボクが体壊した当時いた社は、今でも何か普通にあるし、やっぱ産総研とずぶいと強いですね。ボクが体壊す必要なかったよな。いや今更社に怒ってるわけではなく単なる事実として…

兎に角色々な気持ちがあり、こうして記事を書こうと筆をとった(キーボードです)のだけれど、とても残念ですということと、お疲れ様ですということと、ボクにお仕事を紹介してくれる各位や、ボクの拙い営業に応えてくれる皆様に感謝するしかない…自分のことで精一杯だ。というか自分の事が今できてるのかといわれたら、怪しい。

うーん、うーん…仕方ないよなあ…頑張ろう…本当に残念だ。

今請けてる案件とは別に動いてる話があって、それがもう少し具体的な形になった時に、自分一人ではさすがにできない話なので、都合があえばお仕事を回させて貰おうかなとか考えていた矢先だったので、そういう意味でも辛い。

すごく当たり前なんですが、どんなに優秀な(一般的な社に比べれば優秀だと思う)人材のいる社でも、仕事を取ってくる、ないし仕事を発生させる人間がいて、初めて社は生きていけるのだという事実は、なんというか、なんですかね、こう…この先の身の振り方とか…当然考えてはいますが…辛いなあと…(普通の人間だってエンジニアとして働き続けるのは大変なのに、病人の自分が 10 年後もエンジニアできてるなんて思ってないです、できてるかもしれない程度、普通に実家帰ってあとはただの病人として余生を過ごすことになるかもしれない)

全然纏まらないな、お疲れさまでした。

Remove all ads

Rust は何が新しくないのか

disclaimer

追記で注意書き足すのはどうなんでしょうね。ということで追記です。

  • 別にギョムでガンガン書いてるとかではないです。
  • ノミコンの方も含めてドキュメント全部読んだ、API 一通り眺めた、型推論というかリージョン推論部分の概要眺めた、関連する論文読んだ、言語触った、程度の人間が書いてます。
  • 正しくない、不正確な部分もあると思います。
  • 雑です、すいません。

TL;DR 的には、C++ 置き換えるための言語として作られたので当然 C++ にあった概念引き継いでますよみたいな話です。

以下追記前の元の全文。

以下の記事が結構人気と聞きました。

Rustは何が新しいのか(基本的な言語機能の紹介) - いもす研 (imos laboratory)

ここでは、記事中の「新しくない」部分を historical な話を交えて説明する形で何か書きたいと思います。

記事を否定するようなものではないです。寧ろよくまとまっていると思うのですが、綺麗にまとまりすぎていて「分かっている人にしか分からない」部分があるかな、と思い、筆を(キーボードーですけど)取った次第です。対象読者は GC のある言語でしかコードを書いたことが無い人、なのかな。

「Rust のプログラミング言語としての立ち位置」補足

元記事では、言語の今と未来について書かれていますが、ここでは昔話をしましょう。

Mozilla は様々なプロダクトを過去 C++ で実装してきました。巨大なプロダクトが多く、開発には自作の静的解析ツールが利用されていました。

しかし、問題が起きます。静的解析ツールが利用していた C++ をパースするライブラリがバージョンアップされず、C++11 辺りから使えなくなってしまいました。そも、以前から作者はもうメンテナンスしておらず、Mozilla が確かメンテナンスをしていたんだったっけ…ここ嘘かも。

Mozilla(の開発チームの一部)は、言語処理系のプラグインとして静的解析ツールを実装できないか、と考えました。結果、生まれたのが gcc compiler plugin とコンパイラプラグイン Dehydra です。が、gcc の AST(抽象構文木)は、ツールを作るには位置情報等があまりにも不足していました。少し話がそれますが diagnostic を大切なものとして設計された clang の AST は、その辺りかなり配慮のある設計がされています。また、gcc の mangling のタイミングが安定しておらず、コンパイラプラグインにわたってくるタイミングで何故かシンボルが mangling されていたりいなかったり、といったバグもありました。そもそもコンパイラプラグインなんて想定せず開発されていたのでバグともなかなか言いづらいのですが。

自分が見ていた範囲では、上述のようなことを Mozilla は行っていました。clang もコンパイラプラグインの仕組みを持っていたのですが、Mozilla は「代替言語を作る」道を選びます。それは勿論 C++ を捨てることを意味します。

結果として誕生したのが Rust です(Cyclone の話は割愛します)。大規模 C++ プロダクトのコードを置き換えられるような言語でなければいけませんでした。そして、Rust は十分にそれを果たせているように思います。

「スマートポインタが生まれるまで」補足

C++ には GC が存在しません。少なくとも今は。生のアドレス値をポインタ型を使って扱うことができます。逆にいうと、GC がやってくれる「ゴミ捨て」を(GC には compaction 等の仕事もありますが割愛)自分でしなければならない、ということです。GC のない言語を利用したことがない人には想像がなかなかつかないと思うのですが、常にリソースの管理をしながら本来の処理も記述しなければいけない、というのはかなり大変です。

大変ですから、その仕事を楽にしようと仕組みが作られます。元記事で言及されている unique_ptr 以前から、C++ にはスマートポインタが存在しました。様々なライブラリが独自に色々作ったりしていましたが、標準ライブラリからは auto_ptr が提供されていました。これは、Rust に同じく(Copy trait の話は割愛)代入演算子が move となるようなポインタ、のように振舞うクラスでした。しかし、代入演算子が通常はコピーとして使われていた当時、auto_ptr の semantics には多くの開発者が混乱させられました。結果として auto_ptr は「使うな」と言われてしまいました。使うなと言われてはしまいましたけれど、この頃から move semantics は(標準ライブラリレベルで)存在したわけですね。

言語サポートが入ったのは、元記事にある通り C++11 ですが、それ以前から Boost ライブラリ等でもスマートポインタやスレッド(スレッドは所有者が一人でなければならないリソースなので、move が必要です)に対する move のサポートはありました。また、lifetime(寿命)の概念についても Boost scoped_ptr や shared_ptr の頃からライブラリレベルで示されていました。認知度は…兎も角…

「Rust の言語機能」補足

どの機能も、何かしらの既存の言語に存在するものですが、C++ にはなくて辛かった、みたいな機能ですね。一応書いておくと、generics と template は似ているようで全く異なる言語機能です。

結局何が新しくないのか

lifetime や move semantics は C++ に元より存在する概念でした。そも、言語のサポートのあるなしに関わらず、raw pointer を扱う言語であれば、意識しないといけないものです。皆さんも C でこんなコードを書いた経験があるのではないでしょうか。

struct string {
  char *ptr;
  void (*free_fn)(char *ptr);
};
void free_string(char* ptr) { free(ptr); } // malloc などで生成された char* のための開放関数。
void do_nothing(char*) { ; } // リテラルなどで生成された寿命を持たない、もしくは寿命がスタックに管理されている char* のための何もしない解放関数。

デストラクタによる自動解放こそないものの、これはまさしく C++ のスマートポインタにおける custom deleter ですね。結局言語サポートがあるかないかだけで、C だろうが C++ だろうが同じことをやるわけです。ちなみに、このような複数の lifetime を同時に扱う仕組みは、Rust もちゃんとサポートしています。Cow trait だっけ、違ったらすいません。

長くなりましたが、つまり新しくないのは、lifetime や move semantics の概念です。C++11 以降も加えると、move semantics の言語サポートも新しいものではありません。

結局何が新しいのか

消去法で残ったの出すだけです。新しいのは lifetime と linearity の言語サポートです。

Rust では変数の寿命をコンパイラがチェックしてくれます。それは参照も同じです。C++ の参照はごく稀に「この参照触ってる間に死んだりしないよな…」と心配になることがあります。ownership を意識してコードを書いていれば大丈夫なんですが、外部ライブラリとか使ってると信用できませんからね…Rust の借用は、lifetime がコンパイラに管理されている参照です。参照が生きていることはコンパイラが保証してくれるので、安全に利用することができます。

また linearity、雑にいうと変数が一回しか使われてないかどうか、触っちゃいけないもの触ってないか、もチェックされます。これで死んだオブジェクトを触ってアチャーという事故も静的に検出し、防ぐことができるようになります。

Rust の新しい部分は、結局の所メモリなどのリソースを管理する上で、C++ で足りなかった、あって欲しいなと皆が思っていたものと言ってしまっていいでしょう。

C, C++ の話多すぎてわからないんですが

Rust は最初に書いた通り、MozillaC++ で書かれた巨大プロダクトのコードを置き換えられる言語でなければいけませんでした。C++C++ なりに色々頑張っていたので、Rust はそこから良いもの(lifetime, move semantics)を取り出し、足りない部分(lifetime と linearity)を補いました。のでどうしても C++ の話を出さざるを得ません…というかぶっちゃけ Rust って C, C++ 使いがやったーという気持ちになる言語だと思うので、そうでない人に良さ伝えるの、無理ですねこれ(諦念)。

一応諦めずに説明頑張ってみよう。GC のある言語でも、不要になったらこのメソッド読んでね、というようなメソッドを持つクラスはあります。あれを適切なタイミングで呼ぶの、自明なようで大変ですよね。不要になったと思ったら別スレッドでまだ使われていたとか、そういううっかりをやったことがある人はそれなりにいるんじゃないでしょうか。そういったことを常にやらないといけないのが C, C++ で(C++ は頑張ってますが)、それを全力でサポートして、危険なコードにめっしてくれるのが Rust、でどうでしょうか。やっぱり駄目か。

で、全力でサポートしてくれるので、リソース管理を GC に任せっきりで生きてきた人が Rust を書くと、大抵変なコードができあがるわけですが…まあ当然ですよね…

まとめ

話が散漫としすぎたのでまとめます。

  • Rust の lifetime の概念や move semantics の言語サポートは C++ 等で以前よりあった、特別新しいものではない。
  • Rust の lifetime や linearity の言語サポートは(研究用の言語とか除けば)新しいものである。
  • Rust の motivation に C++ が絡むので、C++ 知らないと Rust の嬉しさを真に理解するのは難しい。
    • C++ での lifetime の概念や move semantics の言語サポートですら難しいのに、それにまだ言語サポートが増えるんだから当然のこと。でも、安全なコードを書くためには必要で、(C++ を書いていた)皆が望んでいたもの。

うーんやっぱり Rust の良さ、新しさを C, C++ を書いてこなかった人たちに説明するのって難しいですね…雑におわります。

追記:みんなが望んでいたものとか書いてるけれど世の中にはスマポ使わない派とか free しない派もいるので多様性です。