100人の前でLTしました。 Kaigi on Rails _2021_ new

Kaigi on Railsのプレイベントで「Rubyコミュニティのすゝめ」というLTをしました。
本編で語りきれなかった話も含めてブログで供養します

登壇のきっかけ

ある日のFukuoka.rbにて大倉さんが、「プレイベントでLTあるんですけど、まだ枠が余ってるんですよね〜」と言っていたのがきっかけでした。
「LTしたいな」という気持ちと「コミュニティいいぞ」という話はしたいとちょうど思っていたのでその場で申し込みを完了。

タイトルに至った背景

Rubyコミュニティに参加し始めて1年半経って、僕は「OSSへの興味」や「Rubyの内部のしくみ」に興味を持ったり、Railsだけでない部分に視野が広がったり、知り合いも増えたりと自分にとってプラスな事が多くなりました。
そこで一人でも多く参加する人が増えたらいいな、と思い今回のLTに至りました。

本編の内容

speakerdeck.com

本編ではオンラインの今だからこそ「参加のハードルが低い」という話や「技術の話はわかんなくても聞くだけでもいいよ」という話をしました。

本編で語りきれなかったこと

5分に入りきれなかった話を書いていきます。

自分がコミュニティに参加するようになったきっかけ

Fukuoka.rb(下心あり)

僕もRubyコミュニティに参加し始めるまでは就活をしながら、書籍やRailsチュートリアルを中心にポートフォリオづくりを進めていました。
福岡で働きたいと思っていたので、就活の情報収集のためにFukuoka.rbに参加した意図が強かったです。
福岡で働いてるエンジニアもいらっしゃるので働き方や企業の雰囲気を掴むことができました。
今では、毎週水曜の夜の作業時間として、家族以外とコミュニケーションを取る重要な時間として活用しています。

リンク: Fukuoka.rb (毎週水曜日開催)

西日暮里.rb

ruby-jpの#regional_rbチャンネルに流れてきたのがきっかけでした。
自分は西日暮里の隣に住んでいたので、こんなマイナーな駅にもRubyコミュニテイあるのかと思って勇気を出して参加してみました。
20:00 ~ 23:00 でやっていて、前半2時間はもくもく形式、後半は懇親会で技術の話をしています。懇親会ではエラーを見てもらったこともあります。

リンク: 西日暮里.rb (だいたい毎月第4月曜日開催)

asakusa.rb

asakusa.rbは2ヶ月ほど前から参加し始めました。
Ruby界隈で有名な方が多く、参加するのを躊躇していたのですが、Fukuoka.rbで知り合った方や西日暮里.rbで知り合った方もいたのでたまに参加しています。
Rubyのコアな話を聞くことができます。

リンク: asakusa.rb

初めて参加するならどのコミュニティ??

すべてのコミュニティに参加したわけではないので、僕が参加したことのあるコミュニティを例に挙げています。
探す際は、地域.rbカレンダー を活用してください。

まずはお近く・働きたい場所のコミュニテイ

まずは自分が住んでいる県や地域のコミュニテイが良いかと思います。
あるいは、自分が働きたいと思っている企業から近いコミュニティがオススメです

話すのが苦手な人はもくもく形式がおすすめ

Fukuoka.rb

Fukuoka.rbはもくもく&雑談形式でやっています。
話さなくても大丈夫ですし、地縁がなくても誰でも大歓迎です。

西日暮里.rb

西日暮里.rbは5人ほどの少人数でもくもく&懇親会形式でやっています。
もくもく会はチャットでのコミュニケーションなので喋りが苦手な人やオンラインでのコミュニケーションが苦手な方はぜひ。

モブプログラミングをやってみたい

mitaka.rb

mitaka.rbではモブプログラミング形式でRailsアプリケーションを作成しています。
GitHubを用いた開発の練習にもなりますし、基礎からみんなでやっていくのでRailsの経験が浅い人でも大丈夫です。

技術に関するインプットをしたい

  • 銀座Rails
    • RubyRailsに関する発表/登壇がメイン。喋る必要がないので勉強会の雰囲気を知りたい人や情報をインプットしたい人向け
  • omotesando.rb
    • LTメイン。銀座Railsと同じく情報のインプットしたい人むけ

コミュニティ活動を通じた今後の目標

僕が参加しているコミュニティは作業時間が取れるところが多いので、コミュニティを活用した目標を定めておこうと思います。

  • 2021年内にOSSにコントリビュートする
  • Rubyがどうやって動いているか学ぶ

おわりに

コミュニティ自体が合う、合わないはあると思うので合わなかったら別のコミュニティに行くでも参加しないでもいいと思っています。 自分に合うところを探してもらいながら楽しめる方が増えるといいなと思っています。

感想

100人の前での発表はとても緊張しましたが、良い経験になりました。 Kaigi on Railsチームの皆さん、大倉さん、ありがとうございました!

Kaigi on Rails本編

kaigionrails.doorkeeper.jp

フィヨルドブートキャンプで2回目のLTをしました

フィヨルドブートキャンプというオンラインスクールで学習をしています。
その中で定期的に行われている「初めてのLT会 vol.9」というLT会に登壇しました。

初めてのLT会とは?

現役受講生の有志によって不定期に開催されているイベントです。 イベントで登壇してみたいけど、ちょっと初めは失敗するかもしれないとか、色々不安があるもの。だったら、失敗して OK なイベントを自分たちで開催してしまおう、ということで始まった企画です。

いきなり、外部のコミュニティで登壇するのはすごく勇気のいることなので一旦クローズドなコミュニティで登壇してみようぜ、という趣旨のもと定期的に開催されています。
今回は「しくじりから学んだこと」というテーマでした

どんな内容の発表だったか

「wakaranの解像度を上げるために」というタイトルで発表しました。
フィヨルドでは「分からないこと」を「wakaran」と表現する事があり、「解像度」を「ゴールまでの道筋」と例えて発表を行いました。
自分の伝えたい事は、適当に情報をかいつまみながら実装するんではなく、事前にタスクをリストアップして見通しをよくしてから取り掛かりましょうという事でした。

speakerdeck.com

発表の準備で大変だったこと

3月にfukuoka.rbで初LTをして以降、LT欲が高まっていました。
Kaigi on Railsプレイベントで発表した内容 は少し前から話したいなという内容だったのですが、今回発表したものは当日まで話すことが決まらず、準備に時間が取られてしまいました。

感想

LTをやって、参加して思ったことがひとつ。
LTをやるなら参加者の多くに意味のある内容でないといけない、と考えがちだけど「自分もこういう経験あるな」とか「みんなも困ったことあるんだ」という気づきを得られるだけでもいいなと思いました。

【読書メモ】Rubyのしくみ 第1章

Ruby のしくみという本を読んでいます。せっかくなので章ごとにまとめ的にメモを公開していきます。

なぜ読もうと思ったのか?

普段からRubyを触っていますが、ふとした時に RubyはC 言語で書かれているのに、コンパイルが不要なのはなぜだろう? 」 という疑問を持つようになりました。

この疑問を解決するためにRuby の内部で何が起こっているんだろう、という事を知りたくて読み始めました。

自分読みたいと思っている章

1, 2, 3, 4, 5, 9, 12章を読む。理由は2点。 目次を見て、これらの章を読めば自分の疑問は解決できるだろうと思っています。

  1. 図書館から借りているため、時間的制約がある (執筆時点で残り1週間で返却しないといけない)
  2. 全部読んで理解するには知識が足りないと思っている

事前知識

この本だけでも十分に理解できるとは思いますが、自分は以下の資料を読みました

第1章メモ

字句解析については、理解できましたが構文解析は難しくてまだまだ難しかったです。

字句解析

本書を読むまでは、一つの単語のまとまりごとに解釈・実行しているんだろうなーという理解でした。
しかし、1字ずつ解析をしていて、それがトークン列に変換されていることは知りませんでした。

Ripperを使って字句解析の雰囲気を味わう

Ripperライブラリ を使うことでRubyコードがどうやって字句解析をやっているかコンソールに出力することができる。

require 'ripper'

code = <<STR
10.times do |n|
  puts n
end
STR
puts code
pp Ripper.lex(code)

実行結果

[[[1, 0], :on_int, "10", END],
 [[1, 2], :on_period, ".", DOT],
 [[1, 3], :on_ident, "times", ARG],
 [[1, 8], :on_sp, " ", ARG],
 [[1, 9], :on_kw, "do", BEG],
 [[1, 11], :on_sp, " ", BEG],
 [[1, 12], :on_op, "|", BEG|LABEL],
 [[1, 13], :on_ident, "n", ARG],
 [[1, 14], :on_op, "|", BEG|LABEL],
 [[1, 15], :on_ignored_nl, "\n", BEG|LABEL],
 [[2, 0], :on_sp, "  ", BEG|LABEL],
 [[2, 2], :on_ident, "puts", CMDARG],
 [[2, 6], :on_sp, " ", CMDARG],
 [[2, 7], :on_ident, "n", END|LABEL],
 [[2, 8], :on_nl, "\n", BEG],
 [[3, 0], :on_kw, "end", END],
 [[3, 3], :on_nl, "\n", BEG]]

シンボルで渡されているのがトークンの種類、最後に書いてあるのがトークンの状態を表しています。
本の中では、どうやって実行結果のようになるのかが詳しく書かれていました。

構文解析

  • 構文解析では、字句解析変換されたトークン列をRuby がわかる文やフレーズにグループ化している
  • RubyはBisonというパーサジェネレータを使っている

    • Bisonはトークン列を処理するために使われているわけではない
  • Bison はパーサジェネレータではあるが、直接字句解析には構文解析には関わっていない

    • Rubyのビルド時(Rubyインストール時)にパーサコード (parse.c)を生成している
    • このパーサコードが字句解析によって変換されたトークン列を解析している

最終的に

構文解析では、最終的に抽象構文木(AST)と呼ばれるデータ構造へと変換される。 本にはこの過程が詳しく書かれていたが、10%くらいしか理解できなかった

引用元の明記

本記事は、以下に示す書籍を参考に執筆しました。

www.ohmsha.co.jp

著者名: Pat Shaughnessy
訳者名: 島田浩二・角谷信太郎共訳
書名: Rubyのしくみ Ruby Under a Microscope
出版社: オーム社開発局
出版年: 2014年

フィヨルドブートキャンプでの学習時間が1000時間を越えました

学習時間が1000時間を超えた

f:id:Aseiide:20211003170330p:plain

現在、フィヨルドブートキャンプというオンラインスクールで学習をしています。
その学習時間が1000時間を越えたので、振り返りとしてまとめて行きます。
ちなみに、カリキュラム は公開されていますので興味のある方はそちらも参照してください。

学習状況のふりかえり

4月末から学習を開始しました。
学習時間: 1025時間 経過日数: 154日(4月末~10月1日)
書いた日報の数: 128個
現在取り掛かっているプラクティス: Vue.JS
ラクティスの進捗: 72/86個( 完了したプラクティスの個数/プラクティスの総数)。約83%の進捗

学習を始めたときは6 ヶ月で卒業できるという想定でしたが、まだまだ時間がかかりそうです。
多くのプラクティスにメンターさんのレビューがあり、プラクティスをやる時間に加えてレビュー対応があります。
レビューに関してはGitHubのプルリクエストがメインになっています。*1

技術的に学んだこと

難しかった、記憶に残ったプラクティスについて何が大変だったか書いていきます。

sshの基本を理解する

自分で借りたサーバーにsshで接続しよう、というもの。
知識や仕組みを頭の中でわかったつもりでも、実際サーバーにsshで接続しようとするところが難しかった。

Ruby】ボウリングの計算プログラム

Rubyでボウリングのスコアを計算するプログラムを作る課題。
Atcoder をやっていたので多少は慣れていたけど、入り組んだロジックを書いたことが初めてだったり、コマンドライン引数の扱いについて学習しました。

Ruby】lsコマンドを作る

LinuxコマンドlsRubyで書いてみよう、という課題。
File クラスの扱いや細かい要件を満たすためにかなり苦労しました。

データベース設計

Twitterの主な機能に関してER 図を作る、という課題。
書籍を読んで学習をしたものの、エンティティの抽出やそれぞれのエンティティの関係を見出すのが難しかったです。

Railsでユーザーフォローを作る

与えられたアプリケーションに関してフォロー機能を導入する、という課題。
事前にデータベースを設計して実装したものの、フォローとフォロワーの関係で混乱してしまい、非常に苦労しました。

Railsでコメント機能を導入する

コメント機能を導入する、という課題。
ポリモーフィック関連や応用的なルーティングについて学習しました。

オブジェクト指向プログラミング

ついにオブジェクト指向Rubyを書いてみよう、という課題。
チェリー本の7 章を参考にしながら、自分でクラスを作ってボウリングプログラムとlsコマンドのプログラムを書いていきました。

番外編: 輪読会の主催

フィヨルドブートキャンプでは、受講生が自主的に輪読会を開催しています。
自分も輪読会の主催をしました。読んだ本は、 「オブジェクト指向でなぜつくるのか」でした。
一人で読んでいたら挫折していたので、2ヶ月間全8回、受講生10名ほどと読み切ることができました。

フィヨルドブートキャンプ以外での活動・出来事

フィヨルド外での活動としては主に、以下のような事をしました。

  • Fukuoka.rb

    • 毎週水曜日21からやっている勉強会。1 年ほど前からできるだけ参加するようにしていて、現役のエンジニアの方と交流できる良い機会になっています。
  • 西日暮里.rb

    • 月イチ開催の勉強会。こちらも1 年ほど前から参加していますが、少人数で技術の話を聞いています。
  • asakusa.rb

    • 著名な方が多い、ということで参加してこなかったのですがRubyKaigi が行われたタイミングで参加してみました。
  • mitaka.rb

    • モブプロ形式でRailsアプリケーションを作っています。とても楽しい。
  • ISUCON11に出場

    • ブログ にも書いていますので、そちらに譲ります。

どうやって学習を習慣化するか

1日に約7時間は学習をしている計算になるので、どうやって学習を習慣化したのか書いていきます。

  • 学習時間を計測する

    • asanaと時間追跡ツールを使って自分がどれだけ学習できているのか認識する
  • 1週間ごとに何個プラクティスを提出できたか振り返る

    • 学習時間をもとに、何個のプラクティスを提出できたか振り返る
  • 計測した学習時間をもとに、削れる時間があったら潰す

    • 自分はスマホをつい見てしまいがちだったのでポモドーロ・テクニックを導入するとともに、スマホの電源を切るようにしました。

自己管理の必要性

フィヨルドブートキャンプでの学習には自己管理が必須です。 プラクティスの提出物に関するレビューはあるものの、メンタル面の管理は自分でする必要があります。*2

成長を実感していること

独学でもRailsやGit などの周辺知識を学習しましたが、カリキュラムとして体系立ててあるので独学の時よりも成長できていると感じることが多いです。

  • 実装の前にタスクを分けて実装する力
  • Linux, webサーバーの知識
  • Rubyでプログラム書く力
  • Ruby on Railsでのアプリケーション開発の基本
  • メンターのレビューによってコードの品質が高くなっている

これから

残りのプラクティスは「Vue.JS」「チーム開発」「自作サービス」です。
チーム開発と自作サービスは大変なことが予想されるので、これまで培ってきた知識をもとにやっていきたいです。
これまで個人開発しかしたことがないので、チーム開発はとても楽しみです。

就活に関して

福岡を拠点にしている会社がいいな、と思っています。福岡市がとても住みやすそうということ、個人的な事情で両親と近い方がいいので福岡の会社で働きたいなと思っています。

*1:データベース設計の課題など、提出物がコードでないものはブートキャンプのシステム上で提出します。それにもメンターさんのレビューがあります。

*2:日報があり、そこにわからないことや辛いと感じている事を書くとメンターさんがアドバイスをくれます。また、最近はメンターとの1on1の機会も設けられ、相談しやすい環境ができつつあります。

ISUCON11に出場したら意外と楽しめた

ISUCON11に初めて出場した

この度、ISUCON11に初めて参加しました。
まだエンジニアとして業務に就いていない(プログラミングスクールで学習中)のですが、出てみたら楽しかったので忘れないうちに記録を残しておきます。

ISUCONとは?

お題となるWebサービスを、決められたレギュレーションの中で限界まで高速化を図るチューニングバトル。

チーム構成

Fukuoka.rbで知り合った@ebiflyyyyyyyyさんと出場しました。
ふたりとも初出場でした。 軽く役割分担をして臨みました。

  • @aseiide(筆者)

    • Ruby, Railsの経験あり
    • アプリケーションとnginxまわりを担当
    • ベンチを回す
  • @ebiflyyyyyyyy

    • 技術屋さん
    • インフラの経験あり
    • インフラ、DBまわりを担当

結果

Rubyで臨み、最終スコアは3504ポイント、順位は408位となりました。
初期ベンチが2800ポイントだったのであまりスコアを伸ばすことができませんでした。
再起動試験に失敗して0ではなかったので一応、事前に立てていた目標はクリアすることができました。

スコア推移

競技終了後ポータルにアクセスできなくなることを知らなかったので残しておいたメモを参考にしています。
2859 -> 3081 -> 3400 -> 4200 -> 5922 -> 2400 -> 2800 -> 3600

MySQLのチューニングをしたおかげで一時、4200ポイント、5900ポイントまで上昇しました。

事前準備(過去問練習)

練習をしたのは大会の2週間前です。 ISUCON9が良いぞ、と教えてもらったので9を解きました。
本当に何も知らない状態だったので、レギュレーションとマニュアルをもとに環境を立ち上げるところからやっていきました。
結局、この日はドキュメントをもとにアプリケーションを立ち上げて数回ベンチマークを回すという事しかできませんでした。

この日は各自で事前にツールの入れ方や、手順をまとめておこうという事にして解散しました。

当日

ご時世もありましたが、お互い初出場ということもあったのでコワーキングスペースに集まってやりました。 結果的に、ペアプロ的な形で進んでいきました。

10:00 競技開始

~11:00 当日マニュアル・レギュレーションの読み合わせ 音読しながら読み合わせをしました。わからない部分も結構ありました。

~11:30 マニュアルに沿ってEC2インスタンスの立ち上げとサーバーへのSSHを確立

~11:40 環境チェックを完了し、無事アプリケーションの立ち上げに成功!

~12:00 初期ベンチを回してみる

~13:00 アプリケーションマニュアルを読み合わせて、初期設定をgithubにpush

~16:00 アプリケーションを触ってみて機能の確認や、先人たちの知恵をググりながらnginxのログをみて設定を変えるなど

~17:00 netdataが動いたのでどこに負荷がかかってるのかを確認。pumaとMySQLボトルネックがありそうなことを発見

~競技終了 DBの読み込みせっていやnginxの設定を適切に変える

役割が完全に分かれていたので同じサーバにアクセスしながら作業をして終了、となりました。

おわりに・感想

冒頭にも述べましたが、楽しくISUCONを終えることができました。参加する以前は「何もできなかった」と落ち込むと想定していましたので自分でも意外です。
結局、明確なボトルネックを発見し改善するという本来の競技までたどりつけませんでした。
しかし、ちょっと修正を加えたことによるスコアの上昇や下降によって方向性が見えかけたところで終わってしまい、まだまだ勉強が足りんなと実感しているところです。

次回に活かす事

競技後、いろんな方のブログを読んでいました。 「勉強不足」をもっと細かくすると以下のようになるので、来年までに勉強したいです。

データベース設計について学んだ事

データベース設計ふりかえり

ブートキャンプのデータベース設計の課題でかなり時間がかかったので振り返りとして記録しておこうと思います。
フィヨルドブートキャンプ受講生の方はネタバレ注意

課題の内容

Twitterの主な機能をもとにER図を作成するという内容

対象の機能
- ユーザを表示する
- ツイートする
- ツイートに返信する
- リツイートする(引用リツイートも)
- フォローする
- フォロー一覧を表示する
- フォロワー一覧を表示する
- リストにユーザーを追加する
- リスト一覧を表示する

最初の提出物と最終の提出物

最初の提出物

ざっと資料を読んで適当に作ったER図

最終の提出物

学んだ事

リプライについて

  • 1個のツイートに対して複数のリプライがあるという関係
  • リプライもすべて「ツイート」
  • Repliesテーブルに切り出し、FKとしてtweet_idをもたせる事にしました

RT/引用RTについて

  • RTも引用RTもまた「ツイート」
  • フラグを導入して判別
  • フラグが0のときRTされていない、グラグが1の時、RTされている

フォロー/フォロワーの関係

  • 自己参照している
  • Relationshipという中間テーブル

ユーザーとリストの関係

  • ユーザーはリストを複数持っている
  • リストはユーザーを複数持っている
  • 多対多の関係になっている
  • Users_Listsという中間テーブルを作って1対多の関係になるようにする

参考

FJORD BOOT CAMP 週報 #2 20210508 - 20210514

TL;DR

ls コマンドに苦しんだ一週間だった。
「ls コマンドを自作しよう」というプラクティスなのだが、使ったことのなかった Fileクラス や 出力の仕方が分からず、一週間まるまる取り組んでいた。

ラクティス完了率: 46%

20210508

  • [Linux]ssh の基本を理解する
    • VPS サーバを借りて ssh 接続できるように設定する
  • [Ruby]ボウリング問題を提出
  • [Ruby]ls コマンド
    • タスクを分解する
  • Atcoder200 に参加

20210509

  • [Ruby]ボウリング問題の修正
    • レビューをもらっていたのでそれを元に修正。

20210510

  • [Ruby]ls コマンド
    • Fileクラスを調べながら仮の実装をしていく

20210511

  • [Ruby]ls コマンド
    • 仮実装したものを詰めていく。分からなすぎて辛いという状態だったので「何が・どう分かっていないのか」「何が必要なのか」明確に切り分ける

20210512

  • [Ruby]ls コマンド
    • オプションなし -aオプション -rオプション の実装を完了

20210513

  • [Ruby]ls コマンド
    • -lオプション の実装に取り掛かる

20210514

  • [Ruby]ls コマンド
    • -lオプションの実装を完了