フィヨルドブートキャンプを(11ヶ月前に)卒業したこと、楽しいことをすること

フィヨルドブートキャンプ Part 2 Advent Calendar 2021 - Adventar」4日目の記事です。

2021年1月にフィヨルドブートキャンプというプログラミングスクールを卒業しました。2021年1月から永和システムマネジメントという会社で働いており、スクールを卒業して就職してから11ヶ月経ちました。卒業エントリにしては時間が経っているのですが、時間が経ったから見えてくることもあるかなと思うのでこれまでのことと、これからのことをつらつらと書いていきます。

フィヨルドブートキャンプとは

フィヨルドブートキャンプとは、

プログラマーとして就職を目指せるだけのスキルを身につけることを目標としたオンラインプログラミングスクールです。就職を目指せるスキルを弊社では「現場の人間にとって、戦力になるプログラマー」としています。

というプログラミングスクールです。主にRailsエンジニアとなれるような学習サポートを行っています。

私は以前SIerCOBOLアセンブラで書かれたプログラムの保守をしていました。その会社は技術的な知識より業務知識のほうが重視される環境でした。仕事をしているうちに技術的なことを知るのが楽しくなってきたので転職したくなり、転職できるだけのスキルを身につけるためにフィヨルドブートキャンプの門を叩きました。

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

フィヨルドブートキャンプでは、基本的にカリキュラムの最後にある「自作Webサービスを作る」を終えたときに卒業になります。*1 私は少し例外で、自作Webサービスを作らないまま卒業してしまったのですが…それは2022年の目標にしようと思っています。

カリキュラムは 学習内容 | FJORD BOOT CAMP(フィヨルドブートキャンプ) に載っています。この課題1つ1つをプラクティスと呼ぶのですが、プラクティスを一通りやることで最終課題である「自作Webサービスを作る」ができるような順番になっています。

ということで卒業すると自作Webサービスを自分で作れるだけの技術力が身につくようになっていますが、その過程をどう進めるかは個人の自由です。プラクティスの終了条件を満たせば良しとしてどんどん進むこともできますし、自分の理解度に合わせてじっくりと進めることもできます。私は後者の方で、分からない・疑問に思ったところは時間がかかっても脇道に逸れてもなるべく理解しながら進めるようにしました。

フィヨルドブートキャンプを卒業して、当初の目標だった「転職できるだけのスキルを身につける」「技術力を重視する会社に転職する」は達成できたと思っています。加えてOSSにコントリビューションするとか、フィヨルドブートキャンプ在籍中から取り組んでいたことが繋がって卒業後にRubyKaigiに登壇するなど、入る前に思っていたよりいろいろなことを経験できました。

卒業したらどうなりたい?

フィヨルドブートキャンプを卒業と言っても、卒業して出来るようになっていることや、どんなプログラマーになりたいと思うかは人それぞれみんな違います。「自作Webサービスを作れるくらいの技術力が身につく」はほとんどの人に共通していますが、それ以外は同じ人はいません。

私はフィヨルドブートキャンプでプラクティスを取り組むうちに、自分は好きなことや気になることをつきつめるのが一番楽しいんだなと気づきました。また得意・不得意な分野も分かってきました。タスクを素早く仕上げるのは苦手です。また、なぜこう動くか分からず分からないことが気になっている状態でコードを書いていると具合が悪くなってきます。バグ探し、なぜこのコードはこう動くのかを調べること、コードの品質に気を配ることは得意な方です。また、私はOSSにコントリビューションできるとうれしいです。自分が使っているソフトウェアが誰かが作ったものであること、好きなソフトウェアがよりよくなるお手伝いができると喜びがあります。

就職に向けて自分を振り返るときに、自分は何がきっかけでフィヨルドブートキャンプに入って、これからどんなことがしたいだろうということを考えました。それはここに書きなぐってあるのですが、なぜエンジニアになろうと思ったのか? - :wq その中でやっぱり技術好きだなーと思って、そういった気持ちを持っている人が多そうな永和システムマネジメントに入りたいと思ったのでした。その印象は入社しても変わらず、よかったなぁとしみじみ感じているところです。

出会いを大事にする

今では文字コードが好きで RubyKaigi で文字コードの話を延々とするような私ですが、1年ほど前まで別に好きでもなんでもなく興味がある分野の1つでしかありませんでした。きっかけは、たまたまフィヨルドブートキャンプ内で文字コードの話を見かけて、自分の知っている範囲での文字コードまとめを日報に書いたことでした。書いた勢いでその日のフィヨルドブートキャンプ内の雑談タイムに参加して、たまたま igaiga, udzura がいたので「こんな認識で合ってますか?」というのを見てもらってその流れで家族の絵文字という面白い特徴を持った絵文字があることを教えてもらい、へぇ〜と思って家族の絵文字をirbに入力したらクラッシュしました。これがすべての始まりでした。

クラッシュする理由は全然分からなかったものの、クラッシュするのはよくないよなと思って osyo に教えてもらいつつ頑張って英語で Reline に issue を立てました。せっかく自分で遭遇したバグだから自分で直したいな〜と思いコードを眺めていましたが、Reline のコードは難しくて全然わかりませんでした。うーんと思っていたら Toyama.rb で Reline の作者の aycabta に Reline の基本的な構造を教えてもらう機会があり、自分でチャレンジすることにしました。文字コードの基礎がわからんとどうしようもないなと思って「プログラマのための文字コード技術入門」を読んでみたり必死で print デバッグしたりしてました。最終的には「1文字前の情報があれば修正できそうだが、1文字前の情報がどこにあるのかわからん」までは自力でたどり着いたのですが、修正までは行けず結局修正方法は aycabta に教えてもらいました。それでも自分の PR がマージされたときは感無量でした。それがきっかけで、 Reline と irb にはとても思い入れがあり、これからも手伝っていきたいと思っています。

OSS にコントリビュートできたといっても特別ななにかをしていたわけではなく、普段のプログラミング学習中にたまたま見つけた不具合にエイッと勇気を出して issue を立てたことと、Ruby が好きな人たちとのつながりのおかげできっかけや後押しをもらって、その勢いに乗ったら自分ひとりでもいろいろできるようになってきたと思っています。不具合も人間も出会いを大事にしてやっていくと、面白いことが起きるものだなぁと思います。

これからどうしたい?

自分の楽しいと感じること、自分の内なる声が「こっちが面白そう!」という方に向かっていきたいなと思っています。そうやっていると日々の人生がイキイキしてきますし、自分自身を信用している感じがして気持ちがいいです。

もう少し具体的な話でいうと、アジャイルな開発をいい感じにすすめていくことや、端末プログラミング(つまりReline)、Unicodeに興味があります。それ以外にも、お絵かきとか、フランス語とか、英語とか、焚き火に興味があって趣味でじわじわと取り組んでいます。来年は Rust も書いてみたいし、お仕事で使う JavaScriptCSSAWS とももっと仲良くなりたいです。OSS 活動も継続的にやっていきたい。やりたいことがたくさんあってとっ散らかっているのですが、ある程度継続できたら、楽しくないことはそのうちやらなくなってくるので自然にまかせておけばいいかなぁと思っています。楽しいことをしていると人生楽しいのでおすすめです。楽しくは感じられないがやらなければならないことは、そもそもなんで楽しくないのかを考えたほうがいいんだろうなと思います。

終わりに

シン・ゴジラという映画である人が書き置きを残しているのですが、その言葉が好きなので引用して終わりにしたいと思います。

私は好きにした、君らも好きにしろ

*1:正確には review ready な状態になると卒業扱いになる

RubyKaigi Takeout 2021 に登壇します

RubyKaigi Takeout 2021 に『Dive into Encoding』というタイトルで登壇します。

私の登壇は3日目である 2021-09-11 (土) の 11:00 - 11:25 です。

rubykaigi.org

自作文字コードを作ってローカルのRubyにビルドして遊んだ話をします。文字コードの基礎からRuby文字コードの取り扱い・実装まで潜っていきます。

RubyのStringやEncodingが好きな方、文字コードの実装が気になる方はぜひ遊びにきてください。

Gemのバージョンを比較する

文字列で比較するとうまく比較できない。

'1.0.9' < '1.0.10'
# => false

Gem::Version を使うと文字列のまま比較できる。

また、 prebeta などの文字が入っていても正しく比較できる。

require 'rubygems'
Gem::Version.new('1.0.9') < Gem::Version.new('1.0.10')
# => true

# pre とか beta とか入ってても比較できる
Gem::Version.new('1.0.0pre1') < Gem::Version.new('1.0.0')
# => true

class Gem::Version (Ruby 3.0.0 リファレンスマニュアル)

ファイルパスを指定して irb と reline を起動したい

はじめに

私は irb をよく使うので、せっかくなら常に最新版を使ってバグを見つけたいなと思いました。 irbrelinegit clone しておおむね master に追従しているので、ファイルパスを指定して irb を起動することにしました。

ruby -I <path>

Ruby 起動時に -I オプションをつけると、探索先を追加で指定することができます。 追加された探索先は $: で確認できます。

i.rb

puts $:

-I オプションをつけずに実行してみます。

~/sandbox
❯ ruby i.rb             
/usr/local/Cellar/rbenv/1.1.2/rbenv.d/exec/gem-rehash
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby/3.0.0
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby/3.0.0/x86_64-darwin18
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby/3.0.0
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby/3.0.0/x86_64-darwin18
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/3.0.0
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/3.0.0/x86_64-darwin18

-I オプションをつけて実行してみます。

❯ ruby -I ~/sandbox i.rb
/Users/mi/sandbox
/usr/local/Cellar/rbenv/1.1.2/rbenv.d/exec/gem-rehash
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby/3.0.0
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby/3.0.0/x86_64-darwin18
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby/3.0.0
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby/3.0.0/x86_64-darwin18
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/3.0.0
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/3.0.0/x86_64-darwin18

指定したパスが探索先に増えました!

注意点

複数のパスを指定する場合は複数の -I オプションを付ける必要があるようです。

~/sandbox
❯ ruby -I ~/sandbox ~/sandbox/ruby i.rb
ruby: Is a directory -- /Users/mi/sandbox/ruby (LoadError)

~/sandbox
❯ ruby -I ~/sandbox -I ~/sandbox/ruby i.rb
/Users/mi/sandbox
/Users/mi/sandbox/ruby
/usr/local/Cellar/rbenv/1.1.2/rbenv.d/exec/gem-rehash
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby/3.0.0
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby/3.0.0/x86_64-darwin18
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby/3.0.0
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby/3.0.0/x86_64-darwin18
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/3.0.0
/Users/mi/.rbenv/versions/3.0.0/lib/ruby/3.0.0/x86_64-darwin18

rbenv のバージョンを指定する

環境変数 RBENV_VERSION でバージョンを指定することができます。

~/sandbox
❯ RBENV_VERSION=2.7.2 ruby -v                                                                                                                            
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin18]

~/sandbox
❯ RBENV_VERSION=3.0.0 ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin18]

irb をファイルパス指定で起動する

irb/exe/irb から起動できます。

コマンド

RBENV_VERSION でバージョンを固定し、-I オプションで探索先を追加し、irb/exe/irbirb を起動するコマンドです。

$ RBENV_VERSION=3.0.0 ruby -I /Users/mi/ghq/github.com/ruby/reline/lib -I /Users/mi/ghq/github.com/ruby/irb/lib /Users/mi/ghq/github.com/ruby/irb/exe/irb

実際に使ってみました。最新版の irbreline を参照できていることがわかりました。

$ RBENV_VERSION=3.0.0 ruby -I /Users/mi/ghq/github.com/ruby/reline/lib -I /Users/mi/ghq/github.com/ruby/irb/lib /Users/mi/ghq/github.com/ruby/irb/exe/irb
irb(main):001:0> irb_info
=> 
Ruby version: 3.0.0
IRB version: irb 1.3.1 (2021-01-12)
InputMethod: ReidlineInputMethod with Reline 0.2.1 and /Users/mi/.inputrc
.irbrc path: /Users/mi/.irbrc

irb(main):002:0> Reline::VERSION
=> "0.2.1"
irb(main):003:0> $:
=> 
["/Users/mi/ghq/github.com/ruby/reline/lib",
 "/Users/mi/ghq/github.com/ruby/irb/lib",
 "/usr/local/Cellar/rbenv/1.1.2/rbenv.d/exec/gem-rehash",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/byebug-11.1.3/lib",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/extensions/x86_64-darwin-18/3.0.0/byebug-11.1.3",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/coderay-1.1.3/lib",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/method_source-1.0.0/lib",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/pry-0.13.1/lib",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/pry-byebug-3.9.0/lib",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby/3.0.0",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby/3.0.0/x86_64-darwin18",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/site_ruby",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby/3.0.0",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby/3.0.0/x86_64-darwin18",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/vendor_ruby",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/3.0.0",
 "/Users/mi/.rbenv/versions/3.0.0/lib/ruby/3.0.0/x86_64-darwin18"]

gem installしたgemのパスを知りたい

gemのインストール場所は、$ gem environment の出力結果の INSTALLATION DIRECTORY で分かる。

❯ gem environment  
RubyGems Environment:
  - RUBYGEMS VERSION: 3.2.3
  - RUBY VERSION: 3.0.0 (2020-12-25 patchlevel 0) [x86_64-darwin19]
  - INSTALLATION DIRECTORY: /Users/mi/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0
  - USER INSTALLATION DIRECTORY: /Users/mi/.gem/ruby/3.0.0
  - RUBY EXECUTABLE: /Users/mi/.rbenv/versions/3.0.0/bin/ruby
  - GIT EXECUTABLE: /usr/local/bin/git
  - EXECUTABLE DIRECTORY: /Users/mi/.rbenv/versions/3.0.0/bin
  - SPEC CACHE DIRECTORY: /Users/mi/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /Users/mi/.rbenv/versions/3.0.0/etc
  - RUBYGEMS PLATFORMS:
     - ruby
     - x86_64-darwin-19
  - GEM PATHS:
     - /Users/mi/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0
     - /Users/mi/.gem/ruby/3.0.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /Users/mi/.rbenv/versions/3.0.0/bin
     - /usr/local/Cellar/rbenv/1.1.2/libexec
     - /Users/mi/.rbenv/plugins/ruby-build/bin
     - /usr/local/Cellar/vim/8.2.1600/bin
     - /Users/mi/.rbenv/shims
     - /Users/mi/.rbenv/bin
     - /usr/local/bin
     - /usr/bin
     - /bin
     - /usr/sbin
     - /sbin

$ gem environment gemdir でも分かる

/Users/mi/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0

URI#escape と URI#unescape は Ruby 3.0.0 から削除された

タイトルの通り、 URI.escapeURI.unescapeRuby 3.0.0 から削除されました。長い間非推奨となっていましたが、ついに 3.0.0 で削除されました。

代わりに ERB::Util.#url_encode , CGI.escape , URI.encode_www_form , WEBrick::HTTPUtils.#escape_form , WEBrick::HTTPUtils.#escape などの使用を検討してください。

削除のPRはこちら。

github.com

URI.encode_www_form はこちら。

docs.ruby-lang.org

はじめての自作キーボードを作る(2)遊舎工房でmeishi2ビルド編

はじめに

この記事は2020年ふりかえりアドベントカレンダー 15日目です。書いているのは12月18日です。昨日の記事は はじめての自作キーボードを作る(1)情報収集編 - いまブログです。

あらすじ

自作キーボードのさわり心地を確かめることと、meishi2キットを作るために遊舎工房に向かいました。

遊舎工房

秋葉原にある自作キーボード専門店です。

yushakobo.jp

自作キーボードグッズがものすごくたくさんあります!!魅力的なキーボードやグッズが多くて店内じっくり見てると時間がすごい勢いで飛んでいきます。

店内の様子はこの動画がとても参考になります。

www.youtube.com

meishi2 キットを作る

meishi2 キットを購入するときに、キースイッチとキーキャップを自由に選ぶことが出来ます。

店舗にはキーテスターがあり、様々なキースイッチで好きなだけ試し打ちができます。 また、展示されている自作キーボードキットで打ち心地を試すことも出来ます。

キースイッチについてはこちらの記事がとても参考になりました。

メカニカルキースイッチの好みの話 - 自作キーボード温泉街の歩き方

色々押してみて、これらのスイッチでmeishi2を組んでみることにしました。

  • Gateron milky black
    • 展示されていた Corne Cherry で使われていてしっくりきたので試してみました。
  • Kalih box brown
    • 茶軸を試してみたかったので。
  • Gateron silent red
    • 赤軸・静音も1つ試してみたかったので。
  • Kalih speed silver
    • 最大限軽くするとどうなるのか試してみたかったので。

というかんじで選びました。

キーキャップはバラ売りしているものを買いました。

実際に作ってみる

meishi2 キーボードを購入し、店員さんに工作机を使いたいことを伝えます。2020年現在は2時間で500円で、はんだなどの消耗品も利用できます。

自作キーボードは作者の方がビルドガイドを作ってくれているため、そちらを見ながら作業します。

meishi2 キットは初心者にも分かりやすいよう丁寧に解説してくれているので大体これを見ながら作業できます。

biacco42.hatenablog.com

はんだ付けはなんとかできましたが、ProMicroへの書き込みがうまくいかずハマりました。

原因は2つあり、1つはProMicroが奥までしっかり刺さっていなかったこと、もう1つは書き込みがなぜかうまくいかなかったことでした。リセットボタン何回押してもハンダ温め直してもうまくいかず悩んでいましたが、店員さんにRSTとGNDをピンセットでショートしてもらって書き込みができるようになりました。

QMKファームウェアの書き込みができない – 遊舎工房サポートサイト

完成

f:id:imaizumimr:20201219040326j:plain

出来ました!2時間以内に終わって良かったです。

できあがるとしみじみと眺めてしまいます。これを作ったんだなぁ…と。あと押すのが楽しくて連打してしまいますね。

このあと作った勢いで Corne Cherry と 遊舎工房のはんだ付けセットと、Gateron milky blackと、適当なキーキャップを購入して作成意欲を高めていきました。

つづく