It's okay to be weird

Takayuki Nagatomi's blog

『Eloquent Ruby』でRubyistになるための文化を吸収できた気がする

『Eloquent Ruby』というRuss OlsenによるRubyについての本を読みました。

Amazon | Eloquent Ruby (Addison-Wesley Professional Ruby Series) | Olsen, Russ | Ruby

僕の所属するSmartHRではRubyをメインのバックエンド言語としており、もっとRubyについて知りたかったのと、redditなどでおすすめの本としてよく挙がっていたというのが読むに至った動機です。
2011年出版の本であり、ターゲットRubyバージョンは1.9と古いですが、今でも十分に役立つことが多く書いてありました。

著者のRuss Olsenは他にDesign Patterns in Rubyなども書いています。

Amazon | Design Patterns in Ruby (Addison-Wesley Professional Ruby Series) | Olsen, Russ | Ruby

本の構成

構成としては、以下の通りです:

  • PART I: The Basics
  • PART II: Classes, Modules, and Blocks
  • PART III: Metaprogramming
  • PART IV: Pulling It All Together

PART Iでは、Rubyの基本的な書き方や、制御構造、コレクション、文字列、正規表現、シンボル、オブジェクト、ダック・タイピング、テストについて書かれています。

PART IIでは、クラスについて、演算子のオーバーライドや特異メソッドの使い方。また、モジュールについて、名前空間としての使い方と、ミックスインとしての使い方。そして、ブロックについて、イテレートでの使い方と、「execute around」での使い方と、あとで実行するための使い方について書かれています。

PART IIIでは、メタプログラミング的なところで、フックについて。また、method_missingについて、柔軟なエラーハンドリングに使う場合と、委譲に使う場合と、柔軟なAPIを作る場合について。そして、モンキーパッチや、自身やサブクラスを変更するクラスの作成方法について書かれています。

PART IVでは、内部DSLや外部DSLの作り方、Gemの作り方、Ruby実装について書かれています。

各章は、それぞれのトピックについて、全体を通してドキュメントを扱うプログラムをメインにコードも交えて説明し、In the Wildというコーナーで、RailsなどのgemやRubyビルトインコードでその章で紹介したトピックが実際にどのように使われているかを書き、Staying Out of Troubleというコーナーでトラブルを避けるためのtipsを紹介し、最後にWrapping Upというコーナーでまとめるという構成になっています。

感想

良いRubyプログラムを書くにはどうすればいいかということから始まり、privateなメソッドも send を使えば呼ぶことができたり、クラスがオープンであることなど、プログラマーが責任を負うことを重視しているといった、Rubyの哲学まで知れた気がしてとても良い本でした。
前書きで、Rubyを使いこなすには言語の構文といった基礎だけでなく、文化を吸収することが大事ということが書かれていました。この本を読むことで、Rubyの文化を知り、Rubyを使いこなすにあたってどのような姿勢で取り組めばいいかが少しつかめたような気がします。
あとは、In the Wildというコーナーが特に面白かったです。魔法のように使わせてもらっているgemやRuby自体も、当たり前だけど1つ1つあの手この手を使って人の手で書かれているのだなぁと再認識しました。

今後も必要な時に参照して、良いRubyのコードを書く一助になってくれる気がしています。良い本でした。

子育てをしながらのスキルアップに対する焦りと向き合うために決めたこと

僕は昨年1月に結婚した妻と、昨年7月に生まれた子どもの3人で暮らしている。

子育てが始まると時間が無くなるとはよく言うものの、本当にそうだというのを、子が1歳を過ぎた今も痛いほど実感している。
平日は仕事と家事をこなしたあとは疲れで何もやる気が起こらないし、休日は買い物やら子どもの世話やらであっという間に終わっていく。

時間が無くなることで、自分の中で特に問題になったのが、スキルアップを満足にできていないという焦りが生まれてくることだ。
休日に家族の相手をしていても、「あ〜あれもこれもまだまだ覚えることがたくさんあるのにやばいなぁ」とかそんな考えが頭を支配したまま過ごしてしまったりする。

しかし、これって学習ができていないことを家族のせいにしていないかということに気がついた。
そもそも独身時代に学習に打ち込めていたかというと怪しい気がする。
こんな心理状態になっているのは自分にとっても家族にとっても何も良くないと思った。

そこで、家族と過ごす時間は目の前の家族と全力で向き合う時間にし、学習は独りになれる時間だけに集中して行うことにしようと決めた。
平日朝、妻子を送り出してからリモートワークの始業時間まで1時間ある。そこを学習時間にする。
今は疲れで始業まで二度寝してしまったりしているので、まずは運動などで体力をつけて疲れに打ち勝てるようにし、その時間を学習に充てる。
スキルアップに天井はないのだから、無限に時間があったとて、それでも足りないと思うのが心情だろう。継続すれば毎日1時間でも、やがては積み上がっていく。それで十分じゃないか。

子育てというたいへんな幸せを過ごす中で、スキルアップとどう向き合うかは難しいところだけど、僕はこのように、学習する時間はここだけというのを決めて、それだけできれば十分というように、考えることを減らすことにした。
子育てもスキルアップも丁度良く楽しく頑張っていけたらと思う。

『Atomic Habits』を読んで運動の習慣を身につけられそうな気分になった

僕は妻と1歳の子と3人で暮らしています。
子育てをしながら毎日を生きていると、疲れて機嫌が良くない状態になってしまったり、仕事以外のことをやる余裕がなくなったりということが続いてしまいます。
これは体力が無いことも一つの要因ではないかと、体力をつけるために運動をしなければと思いつつ、運動をするための体力がなくて、いつまでも体力がつかないという悪循環に陥ってしまっています。

そんな自分を変えたくて、運動習慣をどうにかして身につけたいと、習慣に関する本として度々名前が挙がっていた『Atomic Habits』(邦題: 『ジェームズ・クリアー式 複利で伸びる1つの習慣』)を読んでみたのでした。

www.amazon.co.jp

本の紹介

この本では、まずどんな人になろうとするのかが大事と語られています。例えば、読書をすることではなく、読書家になることが目標、マラソンを走ることではなく、ランナーになることが目標といった具合です。
そして、習慣によってあなたは習慣そのものになるのだと言っています。

また、習慣には4つのステップがあると言っています。

  1. きっかけ (Cue)
  2. 欲求 (Craving)
  3. 反応 (Response)
  4. 報酬 (Reward)

なんかよく似たものを見たことがあるなぁと思ったら、Courseraの『Learning How to Learn』で知った習慣の4つの要素でした。こちらはCue(きっかけ)、Routine(決まりごと)、Reward(報酬)、Belief(確信)とされていてちょっと違いますね。

blog.okweird.net

それはさておき、さらに、良い習慣を作るための4つの法則を紹介しています。

  1. 分かりやすくする (Make It Obvious)
  2. 魅力的にする (Make It Attractive)
  3. 簡単にする (Make It Easy)
  4. 満足感のあるものにする (Make It Satisfying)

具体的な適用方法の例を順に紹介します。

分かりやすくするための1例として、「いつ、どこで、〜をする」といったように決めておくことがあります。
魅力的にするための1例として、やりたい(want to)行動を、しなければならない(need to)、つまり習慣化したい行動に結びつけることがあります。
簡単にするための1例として、2分ルールという、とりあえず2分だけやるといったルールに従うことがあります。
満足感のあるものにするための1例として、即時の報酬を自分に与えるようにすることがあります。

基本的には、この習慣の4ステップと、4つの法則について、様々な実験のデータなどを根拠として説明していく本です。
どこかで聞いたことのある話も多分にありつつ、習慣を身につけられそうな気分にはさせてくれました。

本を読んで実践していく

ただ、頭で理解しただけじゃだめだと思い、じゃぁ運動習慣を身につけるためにどうやっていく?というのを考えてみました。

まず、何を習慣化させるかというところですが、Fit Boxing 2をやっていこうと思います。酷暑の中、室外で運動するのは厳しく、家の中でなら費用もかからず、すぐ習慣化を始められそうな気がするからです。

次に、4つの法則に基づいて行動設定をしてみます。

「分かりやすくする」ために、朝、妻子を見送ったら、帰ってきてすぐ始めることにします。
「魅力的にする」ために、運動をして初めて、学習をしていいことにします(学習がwant toって自分ながら偉いなと思いつつ)。
「簡単にする」ために、ゲームのおすすめ1セッション時間である38分より短く、28分から始めます。また、毎日とは言わず、まずは週3日からスタートします。
「満足感のあるものにする」ために、エクササイズが終わったら、報酬としてお気に入りの味のプロテインをゴクッと飲むことにします。そのあとのシャワーも報酬に入れてしまいます。

ここまで書いて、最初から目標を高く持ちがちだったので、特に「簡単にする」ことで、なんだか続けていけるような気がしてきました。

まとめ

この本では冒頭で、重要なのはゴールの設定ではなくシステムであると言っています。
システムは設定したつもりになれたので、家族の幸せのためにも、あとは朝に拳を振っている姿を続けていこうと思います。

ブログをはてなブログに戻しました

Astroで個人サイト( https://okweird.net/ )を構築していたのですが、dependabotでバージョンを上げるのがちょっと面倒になってきたので、サイトはHTMLとCSSだけで書いて(滅多に更新しないのでこれで良さそう)、ブログは前に使っていたはてなブログに戻しました。

これを機にもうちょいブログを書いていけたらと思っています。
よろしくお願いします。

近況 - SmartHR入社とか

ここのところブログをあまり書けてなかったので近況でも書いてみる。

GMOペパボ退社

2019年9月から約3年半所属したGMOペパボを退社した。

30代半ばにして正社員経験がなく技術的な経験も浅かった僕を雇ってくれた、とても懐の深い会社だと思う。
ホスティングという広く深い世界で、様々な技術や知識を得ることができた。
ペパボで大切にしている3つのことのうち、特に「みんなと仲良くすること」という点について実践できたように思う。なぜか鹿児島のメンバーと特に仲良くさせてもらったりもした。
ペパボのエンジニアは皆レベルが高く、エンジニアとしても人としてもロールモデルと言えるような人に出会えたのもとても大きかった。

3年半、本当に充実していた。ペパボが今後の自分の中での基準になっていくことだろうと思う。

SmartHR入社

色々と考えた上で転職活動した結果、縁があって2023年4月にSmartHRに入社した。

オリエンテーションがとても充実していて、色んなグループの色んな背景や活動を頭にインプットすることができ、会社がどうやって動いているのかを初めから知ることができた。
開発面ではスクラムが取り入れらており、僕はアジャイルから未経験なので、色々と本を読んだりして、そのキャッチアップを行っている。
クロスファンクショナルが推進されていることもあり(クロスファンクショナルという言葉の定義が今も自分の中でフワッとしてはいるものの)、フロントエンドを触ってみたりもしている。

40歳も遠くない今、これから数年のがんばりが今後のキャリアに大きく影響するだろうと思うところもあり、しっかりやっていこうと考えている。

妻が復職、子が保育園入園

SmartHR入社と同じ4月から妻が復職し、子が保育園に入園した。

妻の出社が早いため、夫婦とも6時に起きて、妻が準備をする間、朝ご飯を作ったりといった朝の生活に変わった。
子は早速、保育園で風邪をもらってきて家族みんなに感染ったり、突発性発疹が出て治ったかと思いきやまた別の発疹が出たりと洗礼を浴びた。

なかなか学習の時間が取れない生活なので、工夫していく必要がありそうというのを感じている。

これから

今後はひとまず、仕事で使っているRuby、Ruby on Rails、React、Next.jsといった技術に熟達したい。 チュートリアルを読みつつ、サンドボックス的なWebアプリケーションを自作して、手を動かしながら覚えていきたいと思っている。

一方で、今年の抱負などでもずっとやりたいと言っている数学は、残念ではあるがしばらくやれなさそう。
単純に時間がない。色々やりたいけど子育てしている以上、選択の必要がある。

というわけで、家族との時間を大事にしつつ、研鑽を小さくコツコツ重ねていきたい。

単一NotionページをScrapboxページ用テキストに変換するNode.jsツール、notion2sbを作った

最近はGoのCLIツールを作ったり学んだりするのが一番楽しいと思う今日この頃なのですが、ふとNode.jsとTypeScriptでもCLIツールを作れないかと思い立ちました。

何かネタはないかな〜と思っているうち、そういえばScrapboxもNotionもよく使うのだけど、Scrapbox→Notionの記事などはあっても、逆のNotion→Scrapboxのものはあまり無いなぁと気づいたのでした。

そこで出来たのがnpmパッケージとして公開した、notion2sbというツールです。

何をするツール?

名前はpastakさんのmd2sbにならっています。
md2sbはMarkdownをScrapboxテキストにエンコードするツールですが、md2sbがMarkdown→Scrapboxなら、notion2sbはNotion→Scrapboxというわけです。

そして、実際のところ、名前だけでなく、ほとんどの処理をmd2sbに委譲しています。
どういうことかというと、READMEにも書いていますが、notion2sbがやっているのは、NotionからMarkdownとしてエクスポートされた単一ファイルを、md2sb互換のものに変換し、md2sbにそれを渡しているというものです。
具体的には、Notionの数式記法などは、そのままmd2sbに渡すとエンコードされないため、notion2sbにて事前変換を行っています。

それに加えて、ページ中の画像を抽出し、shokaiさんのgyazo-apiを利用してGyazoにアップロードし、画像リンクをGyazoのURLに置換するということも行っています。
そのおかげで、Notionのページに貼ってあった画像を、そのまま変換されたScrapboxのページでも表示することが可能となります。

この通り、やっていることとしてはそんなに大きくないツールです。実際、行数としても100行程度です。

何を学べたか

このツールの作成を通じて、何を学べたか書いてみます。

  • 慣れないTypeScriptを、WebStormに怒られつつ、型を付けながら書いて学ぶことが出来た。
  • Node.jsでのCLIツールの作り方の初歩を覚えた。
  • tsconfig.jsonなどを調整し、モジュールを、古いものも含めて、互換性を保ちながらインポートする方法を学んだ。
  • npmパッケージの公開の仕方が分かった(やってみるとめちゃ簡単!)。
  • NotionやScrapboxのテキスト形式をより知ることが出来た。
  • Gyazo APIの挙動を知ることが出来た。

けっこう学べましたね。こんな小さなツールでも、実際に手を動かすと色々なことが学べるという良い例かもしれません。

今後どうしたいか

さて、この小さなツールですが、まだまだ未完成なので、次のようなことをやっていきたいです。

  • md2sb互換のMarkdownに変換しきれていない部分も多い(リストなどのブロックが空ブロックを挟まずに連続していると乱れる、など)ため、改善したい。
  • 複数ページ変換機能
    • 単一ページにしか対応していないため、ゴソッと複数ページをバルクで変換する機能も追加したい。具体的には、インポートしやすいようにScrapbox用のJSONファイルに変換することになりそう。
    • 変換したページへのリンクを維持したまま繋げられるようにする。
    • 複数ページを変換する際に、ページ名が被った時の処理を考える。

まとめ

というわけで、notion2sbの紹介と、その作成を通じて思ったことを書いてみました。

アイデアを形にするまで、それほど時間はかかりませんでしたが、洗練度を上げることにこそプログラミングの本質があるのかもしれないという意味で言えば、まだまだ未完成なものだと思います。

機会があれば、改善を重ねていきたいです。

2023年抱負 - 家族第一に、数学と機械学習をやる

子と過ごす初正月、家族に囲まれてとても幸せに満ちていたなーと思いつつ、恒例の年初抱負を書いてみる。

技術

機械学習

昨年はMidjourneyやChatGPTが世に出たりすることで、AIが飛躍的な進歩を遂げた年だったように思う。
流れに置いていかれて、その辺りの領域をブラックボックスにしたままでは、自身のキャリアとしても、技術の利用者としても危険だと思い、今年は機械学習を真剣にやっていくことにした。

去年の抱負から言い続けていることではあるが、今年は本気度を上げて取り組んでいきたい。

数学

そのためにも、まずは数学をやる。

僕は高校を1年で中退していて、20代半ばで受けた高等学校卒業程度認定試験も英語だけ受験して取得した。そのため、まずは高校数学からと思っている。Long long journeyではあるがやっていきたい。

手始めに長岡の教科書をやり終えるところから(今は数学IIの途中)。
AIの第一人者であるAndrew Ng先生が関わるMathematics for Machine Learning and Data Science Specializationという、まさに自分のためのようなコースが1月にリリースされるようなので、それもやっていきたい。

家族

今は何よりも家族の幸せを優先にしたいと思っている。去年、子が生まれたことで、ますますその思いが強くなった。
今年の4月には妻が仕事に復帰し、子が保育園に入る予定なので、できる限り家事を協力的にやっていく。
学習にかけられる時間は少なくなるだろうから、技術は流行りのあれこれに手を出すのではなく、ファンダメンタルなものをやっていくことになるかもしれない。

まとめ

今年はこんな感じになりそうだろうか。やる事としては、かなり絞った形となる。

去年もやる事は最小限にと書いていたが、その方針は変わらないだろう。
家族の幸せを第一に、毎日の小さな喜びを大事にしながら、楽しく過ごせていけたらいいなと思っている。