プログラミング漫遊記

思ったことや、勉強したことをつらつらと。

6月のふりかえり。TOEIC受けた編。

7月も半ばだというのに書くのを失念していた。思い出しながら書いてみる。

学習と生活の記録。いわゆる日記。

先月はこちら。

haruguchi-yuma.hatenablog.com

6月は特に大きなイベントなどはなく、粛々と学習を進めていたイメージ。多分。おそらく。きっと。

おしごと

相変わらずRubyを書いてます。RailsというよりはRubyを書いてる気がする。 先月もいってたかもしれないけど、クラスの設計についてあれこれ考えることが多い。インスタンス変数をどこで初期化するか、そもそも導出可能にしておくか、メモ化してインスタンス変数に詰めておくか。メソッドの粒度はどのくらいにするか。クラスメソッドの方が使い勝手がいいか。そんなことを今月も考えていた。

テストの構造化の難しさにも少し悩んでいて、どうやったらスッキリするのかなとかを考えていた。

パッと答えが出るものでもないので、チームメンバーと議論しながら進めている。

プロジェクトではメンバーの増減などがあり寂しさとともに、気を引き締めないといけないと思ってた。

日常

  • レビューしていたJS Primerの献本が届いて嬉しかった
  • TAPLtsという勉強会に参加し始めた
  • 友達の家に行って、赤ちゃんに遊んでもらった
  • TOEIC初めて受けた
  • TOEICの受験日間違って前日に会場入りする熱心さを見せつけた
  • TokyuRuby会議にプロポーザル出した
  • Kokura.rbに参加
  • 毎日の散歩のノルマが6250歩になって(250歩up)健康的になった
  • 月2回ほど体調が悪い日があった

記憶がなくてこれくらいしか思い出せない。

TAPLts勉強会に参加

PADAoneさんのツイートで知った勉強会。

型システム入門という書籍(訳者にRubyではお馴染みの遠藤さんがいる!?)の勉強会に参加。 これはプログラミングの知識だけでなく、数学的な知識も必要で到底一人では読み切れそうにないので参加することにした。

学習会の雰囲気がとてもよく、自分も勉強会するときに真似したいなと思う部分がたくさんあった。

一例をあげると、難しい文章があったときに 「ちょっとここじっくり味わいますか」みたいな表現がたくさん出てきて、難しいものへの向き合い方が真摯だなぁと思う。

TOEIC

人生で初めて英語の試験を受けた。なぜかカレンダーに間違った日付が登録されていて、前日入りしてしまった。 会場は龍谷大学。最寄りの駅から大学まではバスが出ている。そのバスに乗った時点で3人しか乗車しなかったので怪しいと思っていたんだよな。 会場についてから気づくというボケをやらかす。

あと、単語帳を持っていったと思ってたら間違えて将棋の3手詰めハンドブックを持っていってしまったのも我ながら芸術点が高いと思う。

翌日の本番はちゃんと単語帳を持っていった。

TokyuRuby会議

RubyKaigi 2023でノベルティとして配布したRubyメソッドかるた関連でプロポーザルを出した。(そして通った!🙌) 個人的に年初に年3回LTという目標を掲げていたのでちょうどよかった。あと1回で達成する。

町田さんがデザインした肉が良い感じ!

学習

今月はダラダラ本を読んでいた。ダラダラ読む本ほど最高なものはない。時間を気にせずゆっくりと味わう。

  • 研鑽Rubyプログラミング (β final) 読了
  • 初めて学ぶオートマトンと言語理論 読了
  • なるほどUNIXプロセス 読了
  • 型システム入門
  • UNIXという考え方
  • 数学ガールの秘密ノート 数を作ろう
  • サバイバルTypeScirpt(Web)
  • ガラムマサラさんとMaedaさんと Ruby の Enumerableにあるメソッドを再実装する遊びをしていた(もちろんrefinements使った)

6月の最初くらいに研鑽Rubyを読み終わった。本当はRubyKaigiまでに読み終わるつもりだったがそうは問屋が卸さない。 自分の経験値に応じて景色が変わりそうな本だったので定期的に読むのが面白そうだと感じた。

はじめて学ぶオートマトンと言語理論

最初にこの本を読んでよかったなぁという感想。図が豊富で難しい数式も出てこない。練習問題が豊富(あんまりやってないが)という3点で初学者にもおすすめできそう。

後半は言語理論のお話で、自由文脈文法がチューリング機械と同等の能力を持っているだとか、前半にやった抽象機械とそれぞれの文法の互換性について丁寧に解説されていてよかった。

なるほどUNIXプロセス

読むのは2,3回目。ページ数が100ページちょっとで非常に読みやすい。文体も語りかけるような文体でプロセスって何?という状態からでも非常に理解しやすかった。Rubyで動かせるのが何よりも良くて、実際に手を動かしながら理解を進めていった。

仕事でも並列処理するかどうかの検討があって、parallel gemの話が上がったときにプロセスをforkしてゴニョゴニョしてるという話についていけたのがタイムリーでよかった。

Enumerableのメソッドを再実装

フィヨルドブートキャンプ時代の友達とモブプロしながら遊んでた。

ルールは以下の通り - eachメソッドを作る(my_eachと名付けた) - 作ったmy_eachメソッドを使って実装する - できるだけ忠実に再現する(引数を与えなかったときに返すEnumeratorなどもできたら再現する)

こんな感じで遊びながら作ったのでメソッドの理解が深まった気がする。

AtCoder

引き続きコンテストに参加中。 C問題の茶diffを解き終わったので7月はD問題の茶diffを解いていく。

7月に向けて

7月はTOEICの結果が返ってくるので(返ってきたので)英語の勉強を本格的に始める。 オートマトンの書籍を複数冊読んで地盤を固める。 計算機科学の基礎を身につけたらどこに向かっていくのが自然なのか考える。

5月のふりかえり。毎日6000歩編。

学習と生活の記録。いわゆる日記。

先月はこちら。

haruguchi-yuma.hatenablog.com

5月は大きなイベント(RubyKaigi)などがあって、前後で結構行動が違うかも。

おしごと

RubyKaigi前後で変わらずやってるのはコードを書くこと(それはそう)。 Template Method パターンで設計したコードをリファクタリングする作業をしていてレビューを通して勉強になることがたくさんあった気がする。たとえば、メソッド呼び出しで何度も同じデータを生成しているときはインスタンス変数でメモ化するだとか、知ってはいるけど自分が実践的にできてないようなことが補強されたイメージ。

あとは、リファクタリングするときテストのありがたさを(改めて)実感した。細かくテストを回しながらクラスの構造を変えていく。ふとした時にテストが落ちる。大体はしょうもないミスなんだけど、それに気づくのって結構難しい気がしていて、テストがあるとおおよその当たりがつく。デバッグのスピードが上がって、安心してリファクタリングを進めることができる。

どれも頭では理解していたけど、身に染みた。

RubyKaigi前はスポンサー業をしていた。あと、仕事でちょっとしょうもないやらかし(事務的なこと)をしてへこんでいたりした。

RubyKaigi後はプロジェクトのメンバーの入れ替わりがあったりして、寂しかったり。

日常

  • RubyKaigi 2023に参加した
  • ジムに行って筋肉を育て始めた(再開)
  • 毎日6000歩目標に歩いた
  • サボテンが赤い花を咲かせた
  • るりま初コントリビュート
  • 毒展にいった
  • 勢いでTOEICに申し込んだ
  • 大阪Ruby会議のstaffに応募した
  • Kyoto.rb, Kokura.rbなどに参加
  • 晩御飯は大体サラダ食べてた
  • スプラトゥーンが新シーズンになる前にS+まで上げておいた
  • ハイラル城は入城していない
  • 道でおじいさんを助けた

RubyKaigiについてはこの記事にいろいろ書いた。

haruguchi-yuma.hatenablog.com

道でおじいさんを助けた

家の前で散歩をしていたらおじいさんが「警察署に行きたいんですけど」と尋ねてきた。 僕の家から警察署までは歩いて1時間くらいかかる。てんで方向が違っているので一緒に歩いて連れて行ってあげることにした。

一緒に歩きながら話を聞いているとおじいさんは朝、警察署から落とし物があって取りに来てほしいとの連絡が入って、京都から自転車で滋賀まで来たらしい 。なんと20kmくらい。汗だくになりながらナビも持たずに来ていたので不憫に思い一緒に行くことにした。警察署の前で別れて僕は家まで帰ったのだけど、おじいさんは無事家に着いたのだろうか。

毎日6000歩

健康のため最近毎日6000歩を目標に歩いている。大体合計1時間くらい。 朝昼夕方のうち30分 ✖️ 2セットくらい

上述のように散歩に出かけると高確率で誰かに話しかけられる。

毒展とTeamLabのボタニカルガーデンに行った。

大阪の長居でやっていたのでふらっと遊びに行った。 思ってたよりもいろんなものが毒だった。

www.dokuten.jp

学習

今月は書籍をあまり読み進められなかった。原因としてはRubyKaigiやそのアフターイベント的なものにたくさん参加していて夜の学習時間が短かったことが挙げられる。でも、まぁそれはそれで良いと思っている。本を読み切ることがゴールではないので。

4月から引き続き読んでいる書籍は以下の通り

  • 研鑽Rubyプログラミング (β final)
  • プログラミングの基礎

『研鑽Rubyプログラミング』に関しては II部まで読み進めた。

パフォーマンスチューニングするときは推測するな、計測せよ(意訳)という言葉が染みた。

『プログラミングの基礎』は土日だけ読み進めているので亀の歩みで進んでいる。

出てきた再帰関数を全てRubyで書き直してみたり、しているのでこれまた時間がかかっている。まだ半分いってない。 ただ、お陰で再帰関数に親しみを持てた。

新しく読み始めた本もちらほら

はじめて学ぶオートマトンと言語理論

RubyKaigi に参加して、ReDos攻撃の話はパーサーの話に興味を持った。とっかかりとしてどちらもオートマトンの話があるように思ったので、勉強している。 まだ、前半部分だけどオートマトンの例が具体的でわかりやすいと感じた。おそらく厳密な説明用りもイメージしやすさを優先していて、物足りない人もいるのかもしれないが、初学者の自分にとってはちょうどいい粒度で書かれていて嬉しい(今のところは)。

今は「空動作をもつ非決定性有限オートマトン」を「非決定性有限オートマトン」に変換し、それを今度は「決定性有限オートマトン」に変換するというのをやっている。あとは有限性オートマトンの等価性とは何か?みたいなやつ。これが結構数学っぽくて面白い。大学の授業を思い出す。

サバイバルTypeScript(Web)

TSを最近書いてないのでリハビリがてらに読んでいる。ちょっと前まではまだ執筆されていないセクションが多いなぁと思っていたのに、いつの間にかどんどん増えていって充実している。参考文献なんかも豊富なのでリンク辿って行って学習しようと思う。

AtCoder

5月からまたコンテストに参加し始めた。 頑張って今年中に緑を目指す。今はC問題茶diffの過去問埋めを頑張っていて1日1~3問解いているのでざっくり見積もって50~60問ほどは解いたと思う。

直近5回のコンテストは4/5でCまで解けているので一定の成果が出てるのではないだろうか。

ただ過去問を解いた感じだと解説見ずに解けるのは5割りという感じなので安定して8割を目指したい。

英語学習

6月末人生初のにTOEICを受けるので簡単な文法書と単語帳で学習している。といってもあんまり時間は取れておらず、1日ちょっとずつやってる感じ。本格的に学習するのはテスト受けた後に分析してからにしようと思うが、そもそもTOEICってどんな形式のテストなのか?そんなことから知らないので調べておきたい。

6月に向けて

5月はTypeScriptかLinuxについてやっていきたい気持ち。 あとはRubyKaigi楽しむ。

と先月は言っていた。Linuxまで行けてないので6月中に手を出せるといいなぁと思う。 あとは散歩の歩数をどんどん上げていきたい!!

RubyKaigi 2023 に行った

長野県松本市 まつもと市民芸術館で5/11 ~ 5/13まで開催された RubyKaigi 2023に行ってきたので感想を書いておきたい。

僕自身はRubyKaigiの現地参加は去年に引き続き2回目になる。去年は1割程度しか理解できなかったので去年より理解できるといいなーと思いながら参加した。

なお、会期中の出張費(宿泊費や交通費)に関しては所属先の永和システムマネジメントにご負担していただいています。ありがとうございます。

事前

RubyKaigiのスポンサーだったので社の企画の会議に参加したり、Rubyメソッドかるたの作成などをしていた。他にはぼっち回避のためにKyoto.rbに参加したり、RubyKaigiで出てくるであろう単語をおさらいしたりした。(YJITとかASTとか)

あと直接的な関係はないけど、研鑽Rubyのβ finalを7章ほど読んでおいた。(本当は全部読んでおきたかった)

Day 0

午前中は仕事して午後から松本に向かった。新幹線で名古屋まで出て、特急しなので松本へ。 新幹線の中でAtCoderをしていたら気持ち悪く成ったので特急しなのでは大人しくしていた。

この日はKeebKaigiなるものをやっていてキーボード好きが松本に集っていた。僕はキーボードには興味がないため参加しなかったのだけど、後からいろんな人に面白かったよと聞いて、動画を見たらこれまた面白い。「トリのAaronさんの動画は絶対見るべき」という話で見始めたのだけど、気づいたら全編見返していた。

https://www.youtube.com/watch?v=Lk3-5ceJz4Y

自分が普段使うキーボードに興味があるかと言われればそんなになんだけど、こうやって何か面白そうなことをしている人には興味がある。真剣にふざけている人はかっこいい。(もちろんふざけてない真剣も然り)

来年も開催されるなら行ってみたいなぁと思った。

Day1

これ以降は特に印象に残ったトークだけ感想を書いていくことにします。去年はトークは全部見た(もちろん裏番組は無理だけど)のだけど、今年は1,2個逃しちゃった。

The future vision of Ruby Parser

この日一番印象に残っていたトーク。金子さんのパーサーの話。 いや、正直難しくてところどころ理解できなかったけど、なんだか聞いた後会場がすごい熱気を帯びていたことを覚えている。

自分はメモをとりながら聞いていて、わからないところはキーワードだけでもメモっておいた。

パーサーとは何かから始まって、Rubyで解かなければいけない問題3つ(Usaiblity, Maintainerbility, Universal Parser)と初心者にもわかりやすいように全体地図が見えるように発表されていたのが印象的だった。

Rubyには4つのdoがあって、、、みたいな話をmatzがしていて柔軟性の点を評価していたのに対して、金子さんは「これはひどい」という話をしていたのが個人的には面白かった。視点が変わればなんとやらw

パーサーに少し興味が出てきたのでここらへんを読んで勉強していきたいと思った。 https://i.loveruby.net/ja/rhg/book/yacc.html

Bison id dead.

Make Regexp#match much faster

正規表現でReDos対策をした話。比較的馴染みがあって(ほんとか?)わかりやすかった。

Ruby正規表現はパワフル。それゆえの問題がマッチング時間の指数関数的爆発問題。 その爆発的な時間を利用した攻撃ReDosを対策した時の話をされていた。

結果、線形時間でマッチングできるように成っていてグラフが直線になっていてすごかった。

正規表現エンジンをRubyでかければいいなぁ」という今後の展望を話されていたけど、これがどういう意味なのかはよくわかってない。わかってないけど、ちょっとワクワクした。

線形時間かどうかを判定するlinear_time?メソッドも便利そうだから覚えておきたい。 https://bugs.ruby-lang.org/issues/19194

UTF-8 is coming to mruby/c

今泉さんのStirngのお話。舞台はMRI(CRuby)ではなく、mruby/c。

この発表を聞くまでmruby/c と mrubyが違うことすら知らなかったぜ😅

文字コードに知見がなく今までなんとなく使ってきた文字列だけどUTF-8を実装していないだけでちゃんと文字が数えられなかったりインデックスが取れなかったりすることがわかった。

内容はソースコードがあるのでとてもイメージしやくString初心者でも理解しやすかった。 いつも思ってるけど、今泉さんはStringの話になるととても楽しそうに話すのが印象的(String以外が楽しくなさそうという話ではない)でこの楽しそうな雰囲気が人を惹きつけるのだろうなと思った。C会場での発表は立ち見がが現れるほどの大盛況だった。

String#trが多機能という話は深く頷いた。AtCoderでちょっとトリッキーな使い方するときにtrメソッドを使うけどいつも忘れてるりまみている気がする。 普段は使わないかな。変換したいだけだとgsubとかに落ち着く。

Power up your REPL life with types

katakata_irbの話。

メソッドチェーンした時はif分での分岐にもコード補完が正しく追随してくれるという話。凄すぎる。なんか、全体的にさらっとお話されていたけど、ものすごく大変なんじゃないかなと思ったりした。

デモに見とれてメモ取るの忘れてたので詳細な内容を全然覚えていないのが悔やまれる。どうやって実現してるんだろ。あとで見返したい。

普段からREPLにはお世話になっていて、irbはnodeとかdenoとかのREPLと比べてもとっても使いやすいと思っている。これがirbで使えるようになったら嬉しいなぁ。

LT

弊社から送った銅鑼が大活躍していた。 どの発表も時間の短さから勢いがあってRuby 30周年のLTとかの雰囲気を思い出した。

BINGOの話が印象に残っている。

Day2

Implementing "++" operator, stepping into parse.y

塩井さんの発表。

Rubyにインクリメント演算子++を実装する話。話というか物語で細かい部分(パーサーの話)がわからなくても楽しめる内容でした。

succメソッド使ったり+=と使ったりと色々試行錯誤してくのが面白かった。

Ruby++はもはやRubyではないので新しい名前が必要 → Ruby++

というオチが最高でいずれRuby#とかくるのかな。

この発表も普段から楽しそうに実装してるんだろうなというのが透けて見える良い発表でした。自分も何か手を動かさないとなと刺激をいただいた。

The Resurrection of the Fast Parallel Test Runner

koicさんの並列テストの話。

冒頭からロックな感じでRubocopの人と思われるのもなんなので違う話題でプロポーザル出したとのことだった。守備範囲が広くてすごい。

テストの高速化。お金で殴れたらそれが一番いいけど、そうでもないのが現場なのだろう。とても心に染みる。並列化をうまくやるしかない。

並列って言葉だけだとわかりにくいけど、スライドに図がたくさんあって、ワーカーが余っちゃうところとか理解しやすかった。働いていないワーカーをいかに減らすか。最初の方で出てきたコマンドrpsec -pで遅いテスト出せるの知らなかったので使ってみたい。

難しいところも多々あったけど、何回か発表見返せば理解できそうな感じだった。

Day3

Ruby Committers and The World

このトークがちょっと悔しくて、別の意味で印象に残っている。

去年はnumbered parameterで一つ目のブロックパラメーターにitを使うのはどうか?みたいな提案で周囲を巻き込んで議論していたのがとても面白くて印象に残っている。今年はなんで悔しい思いをしたのかというと全編デフォルトが英語だったからだ。英語がわからなさすぎて面白いんだろうなーという雰囲気だけしか味わえなかった。それでもところどころの話は字幕をみながら頑張ったのでこと後急激に疲れが出たのを覚えている。

Load gem from browser

Ruby WASMでいろんなgem を loadしたいというお話。

Day3から疲れ果ててメモを取るのを諦めたので記憶が怪しい。 ただこの話は去年のアドベントカレンダーで読んだことがあって、その続編だとわかって感動した。

https://qiita.com/ledsun/items/3f8ba1ee2699d546c18c

細かい話は覚えてないのだけど、WASMちょっと夢が広がるなぁと思った。

全編を通して

トークが中心なのはスポンサー巡りとかがあまりできなかったからだ。それでもクックパッドさんの冷蔵庫とかHelpfeelさんのハックスペースは印象に残っている。ハックスペースは居心地良さそうで、いつかここでモブプロ会とかしたいなぁ。

自分は1つのことにしか集中できない癖があって、トークもそれ以外も楽しんでいる人が羨ましかったりする。Twitterに投稿するのも結構集中がギリギリだったりする。来年はここらへあたり柔軟に楽しめるようになるといいなぁ。(でもトークが一番聞きたいのでここの集中力は落としたくない)

普段Rubyistとの交流がない自分にしては、会期中にたくさんのRubyistにも出会った(当社比)。フィヨルドブートキャンプ生で卒業してからアイコンだけ知ってる人などいろんな人が声をかけてくださってありがたい。他にも、たまに顔を出す程度の付き合いの人とも挨拶したり談笑したりできてよかった。来年を楽しむために今年はいろんなコミュニティに顔を出せたらと思っている。

Kaigi Effect

英語頑張りたい欲が最高潮に達した。会社で英語勉強したいと宣言していたらkasumi8ponが「TOEICの申し込み明日までですよ」と教えてくれた。ので、「えいや!」で申し込んだ。その時の様子。

学生時代は5教科で一番苦手だったのが英語で、こやつのせいで行きたい大学も色々変更せざるを得なかったわけだけど、その苦手意識と訣別する日が来たようだ。時間がかかるので焦らず取り組んでいく。

他にもKaigi Effectはある。Rubyメソッドかるたのメソッドの説明の校正中に Math.#sqrtが引数0を取った時の説明が不足していることに気づいたのでるりまに初PRを送って無事マージされた。

github.com

RubyKaigi 2023も自分の中では全力で楽しんだ。来年はもっと楽しめると思う。

オーガナイザー、スタッフ、スピーカー、スポンサー含めRubyKaigiに関わったすべてのRubyistに感謝します。

4月のふりかえり。コーヒーは程々に編。

学習と生活の記録。簡単に言えば日記みたいなもの。

先月までは半プライベートな別の媒体で振り返りを書いていたけど別に隠すものでもないので、はてなブログに書いていくことにした。逆に技術的なことは、ZennとかQiitaとかに書いて言ったほうがいいのかもなとか思ってる。

おしごと

今月はRubyメソッドかるたの告知ができたのがでかい。 2月くらいから?(あれ1月だったかな?)コツコツやってきたものが形になって世の中に告知できるというのは喜びもひとしおだ。細かい話は会社の開発者ブログで書くかもなので、ここではこれくらいにしておく。

blog.agile.esm.co.jp

技術的なことでは、初めてOpenAPIで仕様書の作成を行った。

https://swagger.io/specification/

JSONもしくはYAML形式でインターフェースを定義することで、ツールを使えばデータの不整合などに気づけるようになるみたい。

そのほかは、仕事の仕方を変えてみた。というと、なんか大袈裟な感じがするが仕事中に飲むコーヒーの量を変えてみた。社内で行われる月1回の集まりの時に「コーヒー飲み過ぎ出るんですよねー」という話をしたら他の人は午前と午後1杯ずつ飲んで、それ以外はお茶か水で済ましている人が多かった。なので同じように午前と午後に1杯ずつ飲むようにしたらお腹が痛くなることが減った気がする。気がするだけかもなのでしばらく続けていく。

日常

  • 大徳寺で精進料理食べた(京都)
  • Kyoto.rbに行ってきた(2回目)
  • 技術書以外の本を読むようにした
  • 週1でコメダ珈琲に通い出した
  • ジムはあんまり通ってない
  • PADAoneさんと話した
  • レタスの賞味期限が2回ほど切れた
  • 晩御飯の何作るか困ったら大体親子丼作ってた

Kyoto.rb

kyoto.rbはRubyKaigi2023でボッチにならないという目的のために行った。 仕事終わりに京阪電車乗っていったのだけど、見事に反対方面の電車に乗ってしまって、生きる力が日々なくなっていっている。つらい。 本編はLT会という名目だったがゆるーい感じでRubyKaigi情報を知れて楽しかった。

春眠暁を覚えず

あまりにも朝が気持ち良すぎて起きれない問題が自分の中で勃発している。春とは言わず年中だけど。

9時くらいに起きて9時半に仕事をするというのが板についてきたが、その場合ゴミ出しが間に合わない。そして、できれば朝はもう少し早く起きて学習に使いたい。

そんなこんなで朝早起き大作戦を決行した。自分の性格からして毎日気合いで起きるというのは土台無理な話。なので週1回だけ早起きする。普通に早起きするのは無理。なのでご褒美を設定する。

ということで毎週1回早起きしてコメダ珈琲にいって技術書以外の読書をすることにした。勉強したいんやなかったのかい。

これが功を奏し、今月は『ゴリラ裁判の日』と『限りある時間の使い方』という本を読むことができた。 しばらく続けていく。

技術的な会話

Zennの記事イベントループとプロミスチェーンで学ぶJavaScriptの非同期処理typoのpatchをひたすら送っていた縁でPADAoneさんとお話しする機会があった。どんなことに興味があって、どんなことをしていきたいのかなど技術的な話をできて楽しかった。

フィヨルドブートキャンプ以外の人との繋がりって社内以外だと少ないのでありがたい。

学習

アルゴリズムとデータ構造

先月に引き続き『アルゴリズムとデータ構造』を読んでいた。通称「けんちょん本」 なんとなく曖昧だったUnion-Findを書けるようにしたり、挿入ソートやマージソートクイックソートなどをRubyで書き直して理解を進めた。

ある程度読み終わったのでC問題埋めを引き続き頑張っていこうと思う。

研鑽Rubyプログラミング

β版のfinalが出た時点で読み直している。 なんとなくRubyKaigi 2023までに読み終われたいいなぁなんて思ってるが果たして。

前回読んだ時にはメタプロっぽい書き方がたくさん出てきて、一回で理解できないなと思っていたが、今回の読み直しでは今のところすっと理解できるようになってきた。

自分でライブラリを作って保守するなどの経験がないので、こういう書き方もあるのかぁというなんとなくぼんやりと捉えることにしておく。

プログラミングの基礎

前に7割くらい読んでたので今回は読了目的で読み直し。OCamlを使ってダイクストラの最短経路問題を解きながらプログラミングの基礎を習得するというコンセプトの本。会社の先輩にお薦めしてもらって読み始めた。2回目なのでいい感じの理解度。

AWS Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

AWSなんにもわからないので、0 を 1くらいにはしておこうと読み始めた。7割くらい読んだけどまぁなんとなく概要はわかった。気がする。ような。

AtCoder

けんちょん本をやっていた関係でC問題は解けていないが、モチベーションが上がってきたので茶色diffのC問題埋めを頑張る。5月からはコンテストにも参加する。

5月に向けて

5月はTypeScriptかLinuxについてやっていきたい気持ち。 あとはRubyKaigi楽しむ。

【AtCoder】入茶のちゃちゃちゃ

AtCoder Beginner Contest 290でめでたく入茶したので色変記事というものを書いてみます。

最初に断っておくと、ものすごい人のものすごい入茶記事ではなく、平凡な感じの記事ですのであしからず!!

自己紹介

  • haruguchi
  • 社会人
  • 使用言語 Ruby
  • 2022年の8月頃から本格的にコンテストに参加し始める

雑感

ABCのA問題とB問題を取りこぼしなく速く解けるようになったら茶色になったという感じで、特別難しいアルゴリズムは覚えてないです。 ただ、最近やたらグラフの問題は出るのでDFS(深さ優先探索), BFS(幅優先探索), UnionFindあたりは勉強しました。(忘れました)

RubyでA,B問題解く場合はEnumerableモジュールと仲良くなるのが一番大切で、やってくうちにいろんな便利メソッドと友達になれたのがよかったです。(tallyメソッド最高)

「数学できないとダメでしょうか?」ということをよく聞かれるのですが、できた方が得だなぁという印象です。ただし、AやB問題で求められる数学の知識はそんなになくて、中学数学全般と高校数学の数A分野あたりが役に立ちました。計算量が厳しい問題は少ないので、別の方法で愚直にコードを書けば問題ないのかなと思っています。

そのほかは、解説を数式で理解できるのが一番の強みだと思いました。たまに数式見ても理解できない時は解説放送見てますが、、

やったこと

やったことは単純でABCの過去問をやる。これだけです。

  1. 楽しんでやる
  2. プログラミングコンテストAtCoder入門
  3. ABCのB埋め

楽しんでやる

メンタル的な部分。楽しんでやれるように参加の仕方を考えました。

もともと、通っていたプログラミングスクール内(フィヨルドブートキャンプ)でモブプロをやりたくて、その題材に丁度良かったのがAtCoder ABCでした。 週1回モブプロ会を開催してA, B問題を解いてるうちに楽しいなーと思ったのが源流なので、この気持ちを大事にしながら参加しています。

haruguchi-yuma.hatenablog.com

昨年8月にWebエンジニアとして就職(転職)したばっかりで、まだまだ業務知識や周辺知識をキャッチアップしていく必要がありました。なので、時間の使い方として、AtCoderに全部のリソースを使うということはできませんでした。1日数問、問題を解くというスタンスで勉強しています。

プログラミングコンテスト AtCoder入門

8月頃、まずこれからやりました。

競プロで有名なけんちょんさんが著者で、ABCのA~Dあたりを対象に書かれています。 A ~ D で必要なアルゴリズムに一通り触れるという意味でとても勉強になりました。サンプルコードがPythonというのもありがたいポイントでRubyかJSしかわからない自分でもなんとなくの雰囲気でRubyに変換しながら理解できたのも大きなポイント。

Difficulty 600以上は飛ばしてやったので、もう1周どこかでやり直したい!

ABCのB埋め

定石ですね。ABC50から現在の問題までは全部解きました。

今年1月から1ヶ月間集中して、B問題を埋めていきました。仕事を終えたあと1時間程度で1日3~4問解いています。 「速く、正確に」解くということを目標にしたので20分で4問を目標にしていました。

残りの時間は解説を読んだり、他の方の回答を見て2,3パターンで実装できるように心がけました。

現在はC問題を埋めている最中です。

その他

鉄則本もやったんですが、難しくて到底全部は出来ず。わかるところだけのつまみ食い状態でした。緑になるためにまたチャレンジしたいです。

Kokura.rbで『問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本』を読んだのも楽しかったです。

こんな感じでやってます

<Acheivement> AC 555!!!

Acheivement
<Pie Charts>

B問題は大体解いた

AtCoder Pie Charts

<Difficulty Pies>

ほとんど灰色の問題しか解いてません!

Difficulty Pies

今後について

AtCoder界隈のコミュニティに入って入ってみたいなぁという思いがあります。バチャというものをみんなでやってる気がしてて、バチャって何かよくわかってないんですよね、笑

それが気になってます。

色に関しては緑までは絶対に目指そうと思っていますが、緑になったら次は水色、、、とかとか言ってそうで怖い。

2022年にしたこと

2022年ももうすぐ終わるとのことなので、この年の瀬ブームに乗っかって2022年の総括をしておかねば。年末なので比較的ふざけたポエミーな記事になります。

フィヨルドブートキャンプ卒業した

4月にフィヨルドブートキャンプを卒業した。このブログでほぼ毎回出てくる名前なので、よく読んでくれている殊勝な方はご存知だと思う。自分にとってプログラミングの基礎を教えてもらっただけでなく、わからないに立ち向かう姿勢を教えてもらったスクールだ。いい意味で随分と泣かされた。まずね、普通に卒業できない*1。自主休会中も含めたら2年半は在学していた。月額3万円と良心的なスクールなので

3 万 × 12 ヶ月/年 * 2.5年 = ...

おっと、計算はやめておこう。

卒業したから、偉そうな顔で1つだけアドバイスをするとしたら以下の2つになる。

  • (落ち込むくらい)他人と比べない
  • 友人を作る

こうは書いたが、他人と比べないのは個人的には無理だと思っている。比べるよね。普通に。ちょっとぐらい比べながら(致命傷は避けながら)傷つきながら「なにくそー!」根性で頑張った方がいいのかもしれない。ただ、比べてるのは自分で落ち込んでるのも自分なので敵は自分だと自覚する必要がありそう。

友人を作るはほんとにやった方がいい。すごくおすすめ。たとえ、進捗が1ヶ月進まなくなるとしても友達、知り合い、声馴染みの受講生を1人でも作っておくことで離脱率がグッと下がると思う。

今は良い意味で切磋琢磨する友達ができて、働いている今でもよく交流するのでかけがえのない友人と出会えてよかった。

転職した

8月からプログラマーとして働いた。

楽しいか?と問われればもちろん楽しいと答える。だけど、今は仕事することに一生懸命で100%楽しめてるか?と聞かれればそうじゃない感じ。余裕はない状態。そんなことも含めて楽しいっちゃ楽しい。

余裕のなさは自分ならこれくらいはできるだろうという期待値が高いことにあると思う。前職のステータスを全部捨てて未知の領域(IT)に入った。自分でいうのはなんだけど、教員としては結構優秀でいろんな方に認めていただいていた。そういったプライドとか自負が自分の中にあって、同じ基準で仕事をしてしまっている、けどできてないとというのが、余裕のなさとして現れている気がする。

経験上ここら辺のチューニングは1年くらいあれば修正できると思っているので心配はしていない。

悲壮感はない。わからないことも含めて楽しい。

RubyKaigi 2022に参加した

社のご支援承り、RubyKaigi2022に参加した。初めてのオフラインイベント参加。開催地が三重県の津市で家から近かったこともあって、車での日帰りツアーを敢行した。いろんな人に対して、「ほんとに存在するんだ」という感動と、去年オンラインで参加した時よりも話がわかる(わかると言っても2割程度)という感動があって、行った甲斐があった。

来年は長野県松本で開催される。ぜひオフラインでの参加をしたい。

勝手にモブプロを開催した

「勝手にモブプロ」ってなんなの?というのは以下のエントリに説明を譲ることにするが、簡単に説明するとこれは今年立ち上げたAtCoderの問題をモブプロでワイワイいいながら解いていく遊び。(不定期)

haruguchi-yuma.hatenablog.com

今年、2月3日に初めて開催してから31回も開催できた。ひとりぼっちになることもなく31回も開催できたのは、これもひとえに「勝手にモブプロ」をブログに書いてくださったり、宣伝してくださる人のおかげだと思う(@hiromisugie, garammasala29などなど) 。ありがとうございます。今度あったら何かあげたい。物で釣りたい。胡麻もすりたい。

TypeScriptの輪読会を主催した

@Maedaと共にフィヨルドブートキャンプ内でプロを目指す人のためのTypeScript入門の輪読会を主催した。いわゆる共同開催というやつだ。 役割分担はこう。

  • Hack.mdの用意 → @Maeda
  • 当日の開催告知 → @Maeda
  • その他諸々の雑事 → @Maeda
  • 賑やかし → 私

ほぼ何もやってない。主催するってなんだろうね。圧倒的感謝。 現在6章まで読んでいる。興味ある方はぜひ。

AtCoderのコンテストに参加した

10月くらいからコンスタントに参加することにした。 まずは茶色を目指したい。

自転車買った

ここからはプログラミングに関係ないプライベートな話。プライベートの話でこれが一番最初に出てくるのがなんかやばそう。

引きこもりの運動不足解消に自転車を買った。社内でもプライベートでもこの話をすると「何買ったんですか(ロードバイクかな?クロスバイクかな?)」 みたいなことになるのだけど、2万円くらいのただのママチャリを買った。いや、ただではないな!なんと、6速変速機つき!ダイナモライトではなくて勝手に光やつ!すごい!

大学時代は変速機なしのダイナモ付きママチャリでビワイチ*2をしていたのでそれを思えば大幅なパワーアップをしている。就職したてでお金がなかったわけではない。

ジムに行き始めた

前述の通り自転車を買った。買ったけど、、、買ったのは11月ということもあって、とても寒い。人類は寒いと自転車に乗らない。その問題を解決すべく12月からジムに通い始めた。金にものを言わせて健康を買うスタイルを選んだ。健康のために始めたけど、ついでにまっちょになりたい。黒光り筋肉まっちょ。

気になる人は続報を待て!

スプラトゥーンをした

普段あんまりゲームはしないのだけど、スプラトゥーンは1の頃からやっている。9月に3作目が出たので当然買った。必要な出費。これのせいでママチャリになったわけではない。

自宅のよわよわ回線ではなぜか通信エラーを頻繁に起こしてしまうのでバンカラマッチではなくサーモンランばっかりやっている。12月現在バンカラマッチはB-だった(そろそろやるか)。サーモンランは最高500までいった。カンスト頑張ろうとするたびに時間を蝕んでしまうので、11月はサーモンラン禁止令を発動したが12月にまたぼちぼちやってる。来年もやる。

電子レンジが爆発した

12月。深夜、学習のお供に焼きおにぎりをチン*3していたら、突如電子レンジが光り出した。

「ビビビビビビ!」という異音と共に電子レンジ内でちっちゃく爆発した。

びっくりしすぎて、すごいスピードで逃げてしまった。あまりにも突然すぎたので次からは前もって言っておいてほしい。

しばらく電子レンジが使えないという日が続いたが、電子レンジはあまりにも偉大だった。 気づいたら昼ごはんに冷凍唐揚げを皿に持っていたし、冷めたコーヒーを温め直そうと電子レンジを何回も開けてしまった。

18歳の時に一人暮らしをするのでリサイクルショップで3000円で購入した電子レンジ。今32歳なので14年 + α 使ってることになる。流石に寿命だ。今までありがとう。

最後に

2022年も楽しくプログラミングできました。関わってくれた方々ありがとうございます。 2023年にやりたいことは別途書こうと思います。来年もよろしくです。

*1:卒業はできる。できた。

*2:琵琶湖を1周する。エクストリームな修行。ドMがする遊び。

*3:電子レンジで温めること。死語ではないはず。

学びながら遊ぶ、Rubyの楽しみ方(オープンクラスで遊ぶ)

現在12月24日です。明日はRubyにとってすごくおめでたい日ということと、アドベントカレンダー part2が空いていたのでこっそり記事を書いてみたいと思います。

travel_to Time.zone.local(2022, 12 05, 00, 00, 00)

この記事は Rubyのカレンダー Advent Calendar 2022 - Qiitaのpart2 5日目の記事です。

qiita.com

テーマ

初学者なりにこんな風にRubyで(を)楽しんでいるぜ!という一例をお伝えできたらと思っています。

フィヨルドブートキャンプ*1在学中、下記の構文を見てどういう仕組みで動いているのか非常に不思議に思いました。

['a', 'b', 'c'].map(&:upcase)
=> ["A", "B", "C"]

そこでこの構文の仕組みを学習してみようと思って、いろいろ遊んだので紹介したいと思います。 こういうふうに遊びながら学ぶのが私なりのRubyの楽しみ方です!という記事です。

仕組み

ざっくりとした説明は以下の通りです

  1. メソッド呼び出しにおいて、引数の先頭に&がついている場合は、暗黙的にto_procメソッドが呼び出される。
  2. symbolにはto_procメソッドがあり、メソッド内部でproc化され任意のタイミングで呼び出される

オレオレmapメソッドをArrayクラスに定義するとわかりやすいと思って、オープンクラスを使って車輪の再発明をしてみました。

using (Module.new do
  refine Array do
    def oreore_map(&block)
       return to_enum(:map) unless block_given?

      result = []
      each do |obj|
        result << yield(obj)
      end
      result
    end
  end
end)

['a', 'b', 'c'].oreore_map(&:upcase)
=> ["A", "B", "C"]

メソッド定義の中にデバッガを入れてblock.classとしてみたり、いろいろ試すことで挙動を理解することができました。

遊ぶ

to_procが呼び出されることによってprocオブジェクトに変換されているのであれば、to_procが定義されているものであれば何でも渡すことができるのかな?という疑問が湧いてきたので、いろいろ実験してみました。こういう実験が面白いです。

hashにはto_procというメソッドが定義されているようでした。 https://docs.ruby-lang.org/ja/latest/method/Hash/i/to_proc.html

なるほどkeyからvalueへの変換が簡単にできるんですね。

hash = { a: 100, b: 200, c: 300 }
%i(a b c).map(&hash)
=> [100, 200, 300]

Methodクラスにもto_procメソッドが定義されているようです。 https://docs.ruby-lang.org/ja/latest/class/Method.html

method = 123.method(:*)
[1, 2, 3].map(&method)
=> [123, 246, 369]

さらに遊ぶ

いろいろ実験してto_procに応じることができるオブジェクトを&と一緒に渡すことができる。ということがわかりました。 さらにこんな衝動に駆られます。

「シンボルじゃなくて、文字列を渡したい!!!!」

ここまでの実験でto_procメソッドさえ定義したらうまくいけるのではないか?という自信がついていたので(&文字列)を渡せるようにしてみました。 注意: Error処理はしてません

using(Module.new do
    refine String 
      def to_proc
        Proc.new do |*args, $block|
          args.shift.send(self, *args, &block)
        end
      end
    end
end)

'upcase'.to_proc.call('aaa')
=> "AAA"

['a', 'b', 'c'].map(&'upcase')
=> ["A", "B", "C"]

文字列を渡してもうまく動くようになりました!!!

まとめ

このように遊びながら学ぶことでRubyと仲良くなっていく感覚があり、自分なりの楽しみ方になっているので同じ初学者の方などの参考になれば嬉しいです。

travel_back

Ruby.3.2のリリースが楽しみです。(関係者の方ありがとうございます:bow:) Happy Holidays!!

*1:Rubyなどを学べるプログラミングスクール