String#gsub で選択子 | を使う時に注意したいこと

#sub #gsub する際に正規表現の選択子 (|) を使うことができるが、このチェックは正規表現ベースではなく、文字列ベースで 1 文字ずつイテレートしながら行われる*1
ので、意識せず | を使っていると思わぬところでハマりそう。

# "abc" を /a/ /ab/ /bc/ のパターンを使ってマッチさせたい場合

# /ab/ がなければ話は簡単
"abc".gsub(/bc|a/, "")
=> ""

# パターンとしては /bc/ が先にあるが、
# 文字列をベースにチェックしていくので"a" と/ab/ が先にマッチする
"abc".gsub(/bc|ab|a/, "")
# => "c"

# 先にマッチさせたいパターンを単独で先にマッチさせると期待通りの挙動となる
"abc".gsub(/bc/, "").gsub(/ab|a/, "")
# => ""

先読み & 後読みでなんとか書けそうな気はするけど、その辺はまだよくわからない…

*1:動作的にそうだったけどコードベースで確認したわけではないです

じぶん Release Notes (ver 0.35.11)

makicamel(Ver 0.35.11)がリリースされました。
更新内容は以下のとおりです。

まとめ

かなりバタバタしていましたが、転職して(バタバタはするけど)環境も落ち着き、開発や勉強に力を注げるようになりました。
また外出自粛に少し慣れ、生活上コントローラブルなことが増えて、自分のルーチンを意識的に整えるようになりました。

仕事関連

  • 転職した🎉(5月1日付)
    • 関わってくださった全ての方に全身全霊で感謝しています
    • 転職エントリは半年経った頃に書く予定
  • 転職前の仕事としては Rails アプリの機能追加で施策決め〜実装までやって楽しかった

イベント関連

  • Ruby 3 さみっと 最高だった!!!
    • 特に Samuel さんの Fiber の話にわくわくした
  • あとはほぼ個人的に続けている輪読会のみ
    • 継続できておりとても楽しいのがありがたい🙏
    • 週次開催でも前回の内容結構忘れているのでさらっと復習するようにした、よい
  • 勉強会の開催が著しく減ったけど個人的に会いたい人と飲む回数が増えたのは嬉しい

開発・勉強関連

  • vim に入門した
    • とりあえず他人様の vimrc を適当に拝借しているフェーズ
  • 数学ガール を読み始めて、数学がとても身近になった
    • 今年は数学を勉強する年(n 度目)
  • AtCoder を始めた(月末)
    • コンテストではなく、1日1問クイズを解く感覚
      仕事の時よりも時間をかけてるりまや内部実装を読んだり試したりできとてもよい

その他

  • フルリモートでずっと家にいるので家が日増しに快適になっている
  • 英語聞く + 運動習慣が定着した(各 20〜30分 / 日くらい)
  • 朝型生活が定着した(21時寝5時起きくらい)
    • リモート解除になり、イベントに参加するようになったらどうかという懸念はある
    • その時はその時でなんとかしていこう
  • 日常のタスク管理に Getting Things Done を取り入れた
    • 厳密ではなくゆるっとやってるけどとりあえずよい感じ
  • 自分の関心領域として、必要そうな範囲を網羅的に勉強するのが苦手ということに気づいた
    目的からドリルダウンするタイプ。 yugui さんの言葉が胸に刺さる
    「目的」が広義 / 狭義という違いな気がする。おっしゃる通り遠回りなこと多いので意識を変えてゆきたい

    yugui「標準添付ライブラリ全部じゃなくても、組み込みライブラリは読みましょうよ。やっぱり言語をやるにあたって、コアライブラリを読まないと、知らないがために無駄な苦労することってありますから」
    開発コアメンバが語るRubyの今とこれから(後編) - @IT

  • 基礎について物思った
    @youchan さんと飲んでいる時に比較的メジャーなとある技術記事を一緒に読んだのだけど、「誰が決めたの?」「これはおかしくない?」という指摘が多々あり、本質的に正しいんだっけ?好ましいんだっけ?というのを振り返る思考習慣をつけたいと思うなどした
    その意味でも「本質」を知らなければ判断しようがないので、基礎大事と思うなど…

ごはん系

  • 森彦のコーヒー豆。マイルドブレンドが想像以上に甘くて香り高くて好み真ん中どストライク
  • リモート飲みのお供としてつまみを作るおかげで自炊がはかどっている
    • 新じゃがのコンフィを作ったら甘くて美味くて最高だった
      サラダ油:水を1:1くらい(水はなくても良さそうに思う)でとろ火で1.5〜2時間芋を揚げて塩を振るだけ、とろ火なので油がはねずコンロが汚れないのも良かった

読書

読了

途中

KPT

K

  • 転職した🎉
  • 英語を聞く + 運動習慣の定着
  • GTD の導入
  • 各行動や習慣をアップデートした(勉強会の前に復習するとか)

P

  • 転職活動でなんだかんだバタバタしていた
  • あまりまとまって勉強・開発する時間が取れていなかった

T

  • 本を読むぞ!!
  • ルーチンが整ってきたり、行動を丁寧にした(その分時間がかかる)りしたので
    時間の使い方の見直しをしたい

今年の目標

  • 継続的なOSS活動
  • 自ライブラリのメンテ
  • 数学
  • 20分以上の登壇
  • 運動をする

じぶん Release Notes (ver 0.35.10)

makicamel(Ver 0.35.10)がリリースされました。
更新内容は以下のとおりです。

まとめ

プライベートでコードを書いたりインプットしたりがすごく少なかった月だったけど、
昨今の状況の中でメンタルを健全に保つためによい行動習慣を取り入れた月でもあったので、
4 月はもっとよくなっていくでしょう💪

仕事関連

  • 新しい機能をひとつ作り、のびのび書いて後でレビューでボコボコにされて楽しかった
    • 去年リファクタリング:Ruby エディションで読んだ サンドイッチメソッド を初めて作り、ちゃんと成長してるんだねえ…と感じた
  • erb を久しぶりに書いて、フォームタグ・フォームタグヘルパーや accepts_nested_attributes_for に入門した
  • eager_load 何回調べてもむずい

イベント関連

  • Kaigi on Rails で話したいネタを思いついたのでちゃんと調べて準備したい
  • neko314 とプログラミングの基礎読書会を続けている
  • nappan23 とプログラマの数学読書会を始めた
    • 数学は楽しいって教えてくれるような本で、やっていてとても楽しい

開発関連

  • 事情があり何もしていなかった😥
    • やっていく気持ちが高まってきたのでやっていく

その他

  • 机を DIY した
    • 適当な材料で適当に DIY することはたまにしていたけど、ちゃんと作るのは初めて
    • 色々下手なところはあるけどそれも味と思える
      • ネジ回しはほんとうに下手すぎるので今度調べる
    • また作りたい、塗装楽しい
  • 熱を出して予定をキャンセルし、悲しかったし申し訳なかったけど、人が優しくて泣けた
  • リモート飲み会を 2 回してめちゃくちゃ楽しかった
    • おつまみを作るとさらにテンションがあがる
  • 夜になると気持ちがめいるので時間のサイクルが前倒しになり、完全に朝型になってきた
  • 朝に 5 分の運動と 20〜30 分くらいの英語を聞く習慣がついた
    • 運動はダイエット。写真を撮って誤魔化せないようにしているがこの方法がよい

ごはん系

  • Hachi のレトルトカレー(辛口)がヒット。
    ヤラピノ入と書かれていて旨い辛さだなと思っていたら、ヤラピノ = ハラペーニョと知って成程感ある
  • 猫廼舎さんのサビネコ。
    苦味が強くざらっとしているのだけどやわらかい不思議な美味さ

読書

読了

途中

KPT

K

  • トラブルがあったけど、友人のありがたさ、人のあたたかさを再認識した
  • 英語学習をはじめた
  • 毎朝の短い運動をはじめた
  • 机の DIY ができた
  • 朝型になったことで時間を前よりも建設的に使えるようになった
  • 日光を浴びることの大事さに気づいたので意識的に浴びている

P

  • トラブルがありコードを書いたり勉強したりする時間がおおいに減った

T

  • プライベートでコードを書く
  • 英語学習を続ける
  • 運動を続ける

今年の目標

  • 継続的なOSS活動
  • 自ライブラリのメンテ
  • 数学
  • 20分以上の登壇
  • 運動をする

じぶん Release Notes (ver 0.35.9)

makicamel(Ver 0.35.9)がリリースされました。
更新内容は以下のとおりです。

仕事関連

  • 正規表現ひたすら書いた、簡単なものなら書けるようになった
    • 最多・最短マッチに関してちゃんと理解したい
  • Elasticsearch のマッピングやテンプレートに多少詳しくなる
  • Painless に泣かされた(Java の関数を利用できることもう少し大声でアピールしてほしい)
  • Python を少し読み書きできるようになる

イベント関連

開発関連

  • 大江戸に関連して math_parser という gem を作っている
    • まったく進めていないのでやる

イベント

  • 大江戸Ruby会議08 に登壇しました
  • 所要で実家に帰省、将来について家族で話し合うなど

ごはん系

読書

読了

  • Ruby でつくる Ruby
    初心者目線で構文解析について解説してくれたり、手を動かしながら理解できたり、Ruby と他の言語との違いを書いてくれたりでほんとうに楽しい本

途中

KPT

K

  • 大江戸で登壇させて頂いたのが最高に楽しかった
  • til は毎日ではないものの、結構続いている
  • お散歩習慣を始めた。毎日ではないものの3日に2回くらいは続いている

P

  • 大江戸以降燃え尽き症候群的に非生産的な日を過ごしていた
  • 今回こそは全力で楽しむために早く資料あげるぞ!!と思っていたのに間に合わず、結局前日・前々日はほぼ寝れなくて体調がぼこぼこだった…

T

  • 勉強習慣を取り戻す
  • MathParser を完成に近づける
    • そもそも完成の定義もしないと
  • お散歩習慣を続けたい
  • 振り返りは週次でやる
    • 月次でやると忘れている
  • 正規表現最多最短マッチに関してまとめる

今年の目標

  • 継続的なOSS活動
  • 自ライブラリのメンテ
  • 数学
  • 20分以上の登壇
  • 運動をする

じぶん Release Notes (ver 0.35.8)

今年は継続的に物事を続けたいと思っているので「じぶんRelease Notes」を真似してみる。
じぶんRelease Notes is 何、という辺りについてはこの記事がわかりやすい。
あまり時間をかけたくないので、毎週土曜日朝にかんたんに振り返って月末or月頭の土曜にリリースする、という形式をとる。

第1週 1〜5日

  • 実家で年越し
    • 父と片道20分くらい歩いて初日の出を見に行く(母は自転車で)
    • 毎年帰省時はたくさん勉強するぞ、と思うけど毎年あまりできないけど、
      今年は「今朝は本読む」「昼から勉強する」「明日朝は勉強会(リモート)やる」と宣言→実行するスタイルで例年よりはできた
  • 幼馴染2人とひたすら喋る・歩く・喋る会

第2週 6〜12日

  • Omotesando.rbでコードの読み方についてのLTをした(10分)
    • みんな読み方悩んでるんだな、という印象
    • 「わからない」ことに対して開き直れたころから悩まなくなって気がする
  • LTする前・前々日あたりでがっと作る習慣になっていたけど、体調がボコボコになるのでよくない
  • 大江戸Ruby会議での登壇が決まってしまった
    • めちゃくちゃ楽しみ
    • めちゃくちゃがんばる
  • お正月の課題図書「検索エンジンはなぜ見つけるのか」読了

第3週13〜19日

  • 銀座Railsでhsbtさんの話を聞く
    • とってもいい話
    • 継続is大事
    • 今年は継続してやっていきたい
  • 懇親会について物想う
    • 勉強会苦手だったんだけど、初対面で声をかけられて、この勉強会も行こうよ!って誘われて勉強会・懇親会が楽しくなったという話を聞く。超いい話
    • 自分もよちがやの懇親会がなかったら今はないと思う
  • サジェストの改修一段落した!
    • 課題は山積みだけど、とりあえずすごくよくなった
    • 抜本的な改善もやりたいけれども
    • 検索の話もっと知りたい

第4週20〜25日

  • Elasticsearchの勉強と現状の問題調査
    • 辞書とシノニムすごくおもしろい
    • Sudachiすごい、導入してみたい
  • 体調の悪い週で大江戸Ruby会議の準備あまり進まない
    • 「そんなときもあるよ」と思えるようになった、えらい
    • 🐱さんにおすすめされてRubyでつくるRubyを読み始める。とても楽しい

第5週26〜31日

  • 週末Tama.rbとNerima.rbとZenshin.webがあってすごく充実してた、楽しかった
    • 友人に不安を相談したら「軸があるからだいじょうぶ」というアドバイスをもらう
    • TokyoGirls.rbのとき、大場さんにも「むやみに不安がらず、好きなことに力を注いでいい」というアドバイスを頂いた
  • tilを何気なく始める
    • 読んだ本や調べたコマンドのまとめ方をどうしようか迷っていたから丁度良かった
    • とくに調べたコマンドは覚えられなくて何度も調べるのでほんとうに丁度良い
    • カンファレンスの聴講メモとか(最近あまり取らないが)まとめていきたい
    • GitHubに目に見えて草が生えていく
  • 事情でAWSのIAM周りの調査
    • 何もわからないけど、何もわからないなりに少し概要を知れたの良かった
    • ベンチャーは守備範囲の広さがつらみでもあり強みでもあるなと思う

KPT

K

  • 新年最初LTした
  • 大江戸Ruby会議の登壇きまった…!
  • tilよい
  • 検索少しだけわかるようになってきた

P

  • 大江戸Ruby会議の準備が思っていたほど進められていない、がんばる

T

  • tilはよい習慣なので続けてゆきたい
  • 生活リズムが少し整いつつあるけど勉強会に行ったりすると崩れるのでなんとかしたいな
  • 可処分時間の使い方を一度見直したい
  • 「Release Notes」になっていないので見直し
    • 「T」というよりも「来月」というほうがわかりやすい。。。のか。。。?
    • 「来月」でいうと大江戸

読了

  • 検索エンジンはなぜ見つけるのか
    • トークナイズ・インデキシングがよくわかった
    • 人にあわせる辺りはもう一度読みたい

読み途中

  • プログラミングの基礎
  • Elasticsearch実践ガイド
  • RubyでつくるRuby

今年の目標

  • 継続的なOSS活動
  • 自ライブラリのメンテ
  • 数学
  • 20分以上の登壇
  • 運動をする

週次振り返りすると記事が長くなるかつリリースノートになっていないので、その辺は来月見直す。

2019年ふりかえり

やったこと・あったことの羅列

1月

  • よちがや.rbに参加。この時がZenshin.webやTama.rbや今のコミュニティ参加のきっかけになったので大変感謝している
  • 転職(to前職)することを決めて、何度かカジュアル面談

2月

  • Zenshin.webの徳丸本輪読会でだいたい週次で発表。準備大変だったけど、最近の事情やRailsの場合を調べて発表するの楽しかった
  • 確かこの頃初めてテストを導入し、テストコードを書いた(テストのない会社だった)
  • 転職(to前職)が正式に決定

3月

  • 大きなイベント目白押しだった月
    • TokyoGirls.rb vol.1はようさんとたくさんお話させて頂いて人生初IssueのきっかけになったりOSS Gateの参加のきっかけになったりとても印象的なイベント
    • よちよちは伊藤さんがいらして、近道はない、泥臭く頑張れとおっしゃっていたのが印象的で勇気づけられた
  • できる限り毎日ブログを書こう、とアウトプット頑張っていた月
    • アウトプットは客観的になれるので新しい勉強とアウトプットは特に相性がいい
  • Flutter勉強し始め。初めてのネイティブで、フロントの経験もなかったのでStateの概念が全くわからず目を白黒させていた
    • 一瞬ReactNativeも勉強したけど使用技術がFlutterに変更になったので見送り

4月

  • RubyKaigi初参加!!ヒーロー・アイドルに強烈に憧れる。「このひとたちがRuby作ってるんだ!!」感
  • OSSGate初参加。OSSの見方がすごく変わる
  • 転職(1回目)
  • Flutterをやる日々。何もわからないまま命令的(非宣言的)に書いていた。。。ひどく申し訳ない
    • チームの誰も知見のない状態での新しい技術の始め方は今後機会があればもうちょっと考えたい

5月

  • Dartのライブラリを公開した🎉
  • 仕事(Flutter)を頑張っていたと思う
    • Ruby, Railsのコミュニティに参加できず悲しかった
  • TamaRubyKaigiのCFP採択された!!

6月

  • 気軽な一言きっかけで「Linuxのしくみ」輪読会を週次で始める
  • Ruby本体のコードを読むけど何もわからない(わからなすぎてCFPの内容若干後悔していた)

7月

  • TamaRubyKaigi登壇(10min)。RubyDate#>>を読んであれこれ。初めてのオフィシャルな場での登壇、楽しかった!
    • C難しかったけど自信になった
    • 実装が気になったときにいつでも読みに行けるようになった、しかもRubyの実装楽しい
  • OSS活動に関するLT(5min)、Flutter(Provider)に関するLT(5min)もした
    • ただ技術の紹介をするだけの発表は勉強になるけどあまり楽しくなくて、それより「何を」「どのように」に興味があるんだなと自己理解をするなどした
  • 怒り駆動リファクタリングの日々
  • Linuxのしくみ輪読会継続

8月

  • ビルコン初参加!前夜祭楽しかったし、しんぺいさんやなるせさんのセッションが実に現実的ですごく勉強になった
    • とくに設計に興味があったし余計興味が湧いた
  • 仕事でRails触れるようになって嬉しかった
    • Vueの勉強を少々。Flutterに触れていたことでState管理に理解が深まってよかったという印象
  • 続・怒り駆動リファクタリングの日々。色んな方に愚痴を聞いて頂いた:bow::bow::cry:
  • 高校生(高専生)が会社のインターンに来てメンター的なことをやったり
  • Linuxのしくみ輪読会完了

9月

  • 転職活動開始。何人かの方に相談したけれど、中でもけんさんにお世話になって本当に頭があがらない。多謝
  • リファクタリング:Rubyエディション輪読会開始

10月

  • 転職活動本格化。現弊社の合宿に特別参加させて頂いたりもした
  • StripeのAPIと戦う日々
  • 9割以上リモートで働いていた。違うコワーキングに行ったりも楽しかった
  • TokyoGirls.rb CFP提出、採択された!!
  • リファクタリング:Rubyエディション輪読会継続

11月

  • 転職(to現職)決定、引越し決定、実行
    • 予定が早まったので引越しはかなりバタバタだった
    • 5年くらい住んでいてとても好きな家・町だったのでとても寂しかった
  • FlutterMeetupでExtensionについてのLT(5min)した。楽しみにしていた機能でとっても楽しかった
    • monoさんにご指摘頂いた点修正しなければ。。
  • 平成.rb初参加、楽しかった
  • 東京Ruby忘年会でどみにおんさんにCSや数学の本をおすすめして頂いたのでYATTEIKI
  • リファクタリング:Rubyエディション輪読会継続

12月

  • 転職(2回目)。キャッチアップでバタバタする
  • 仕事でElasticsearchと検索の勉強を始める。検索の世界、激熱
  • 平成Ruby会議参加、若い人もベテランたちも熱くて胸がいっぱいになる
  • TokyoGirls.rb vol.2で登壇(15min)。よい反応を頂けたり、vol.1の時と比べて自分の成長を感じられて嬉しかった
  • Ruby2.7リリースパーティ参加
  • リファクタリング:Rubyエディション輪読会継続
  • プログラミングの基礎輪読会をはじめる

読んだ本(読了)

  • 徳丸本
  • Linuxのしくみ
  • Web制作者のためのCSS設計の教科書
  • Flutter入門

読んでいる本

所感

  • 読み終わった本が少なすぎる
    • 読み終わる仕組みづくりをしたい
  • Linuxのしくみは勉強したけど、振り返ってみるとあまり覚えていないな
    • ただ低レイヤーに関して抵抗がなくなった
    • 「OOM Killer」って聞いたときにウッとなるか否かの違いみたいな
    • ファイルシステムシステムコールとか、なんとなくイメージできるか否かは大きいと思う(たぶん)
  • Elasticsearchと検索は2019年最後の熱い出会い
  • Flutterはあまり深くできなかったけど、フロントを触れてよかった
    • 新しい技術を学ぶ時「なんとかなるでしょ」って気持ちになるようになったのも大きかった
    • Dartのライブラリちゃんとメンテしたい
  • OSS活動はもっとやりたい
  • どこにいってもRubyに帰ってくる感ある
  • リファクタリング:Rubyエディションやプログラミングの基礎を読んでいて、「コードの意図」というものを考えるようになった。今までどう書くかばかりに目が向いていたけど、ようやく基礎を学んでいるなあという感
  • ご縁に恵まれた年だった。ほんとうにありがたい
  • もう数年は転職したくない

来年

  • 勉強
    • 検索
    • 設計
    • Rubyのしくみを読みたい
    • RubyKaigiまでに英語…
  • OSS
    • Railsにコントリビュートしたい
    • 自ライブラリをメンテしたい
    • Extensionライブラリ作りたい
  • 個人開発したい
    • ずっと考えてるネイティブアプリ作りたい
    • Rubyやってる会社さん(会場貸しできる)アプリつくりたい
  • 読みたい本(上述した本は除く、ほんとうはもっとある)
    • Rubyのしくみ
    • はじめて学ぶソフトウェアのテスト技法
    • レガシーコードからの脱却
    • コンピュータ、どうやってつくったんですか?
    • レガシーコード改善ガイド
    • プリンシプル オブ プログラミング
    • なっとく!アルゴリズム
  • 登壇
    • 続けていきたい
    • 20分以上の登壇やってみたい
  • 運動
    • 会社と家が至近距離になって全く体力を使わないので運動する仕組みを作りたい

振り返ると来年も振りかえれるのでよさそう。 2020年のテーマ設定したいな。

Dartで同じオブジェクトであるかの確認をする

Dartでシングルトンのクラスを見ている時に、インスタンスが同じオブジェクトであるかどうかを確認してみたくなりました。
Rubyだと、obj1.equal?(obj2)でチェックができます。

'Ruby'.equal? 'Ruby'
# => false

もしくは、オブジェクトIDを取得してみてもいいですね。
(実行ごとに結果は変わります)

'Ruby'.object_id
# => 70314180894460
'Ruby'.object_id
# => 70314180920120

Dartではidenticalというメソッドで比較できます。

class Person {
  String name;
  Person(this.name);
}

void main () {
  final alice = Person('Alice');
  print(identical(alice, Person('Alice')));
  // => false
}

ただ、Dartでは==演算子の比較でオブジェクトが等しいかどうかを見ているそうです。
以前は===演算子もあったけれど、なくなったよう。

final alice = Person('Alice');
print(alice == Person('Alice'));
// => false

intクラスの==に、デフォルトの挙動と、overrideする際の注意点が記載してありました

(雰囲気訳)
全てのオブジェクトはデフォルトでthisotherが同じオブジェクトの時にtrueを返します。
==をoverrideすることで、classに異なる等値関係を指定できます。overrideしたメソッドは等値関係を示していなければなりません。

ただし、クラスによっては挙動が違うようで、String文字コードの並びが一致しているかどうかを見ているようです。

print('Amelie' == 'Amelie');
// => true

print('Am\xe9lie');     // => Amélie
print('Ame\u{301}lie'); // => Amélie
print('Am\xe9lie' == 'Ame\u{301}lie');
// => false

逆に、違うオブジェクトでも値が同じだったら同じとみなす、というpackageを作っている人もいました。
これも便利そう!

medium.com

言語によってオブジェクトの比較の仕様が違って面白いですね。
以上、Dartのオブジェクトの比較でした!