ボクのお仕事 10 ヵ条

(1)アウトプットを最小に、アウトカムを最大に

  • 利用者にとって重要なのは「そのプロダクトで自分の問題を解決できるか?」であり、どんなテクノロジーで実現されているかは重要ではない
  • コードは書けば書くほどメンテコストが上がる(テスト項目増、ライブラリのバージョンアップ時の足かせ、etc...)
  • ステークホルダーの求める通りではなく、利用者を知り、理解し、最小限の実装で最大限の価値を生める方法を模索する

(2)リードタイムにフォーカスする

  • 利用者に機能を届けるスピード技術的負債トレードオフを考える
  • 利用者に届くのが 1 日後と 1 週間後で大きく違いを感じてもらえるのか?
  • 感じてもらえるのであれば、技術的負債を抱えてでも 1 日後のリリースを目指すべき
  • 感じてもらえないのであれば、技術的負債を抱えない状態で 1 週間後のリリースを目指すべき(自分の経験上では、こちらであることが多い)

(3)急がない

  • 実装/テスト/仕様決め/人とのコミュニケーション/etc... すべて急がない
  • 50 % のスピードでこなすイメージ
  • 100 % に近いスピードでこなそうとすると抜け漏れが発生しやすくなるし、対人だとその人にプレッシャーをかけてしまう
  • その状態が続くと相手と信頼関係を築くのが難しくなってしまう
  • 代わりに、極端に言えば 50 % のスピードでも他の人の 100 % のスピードと同じくらいになるように知識/知見/技術力を高めておき、いろんなことを早く決断できるようにしておく

(4)視野を広く、視座を行き来する

  • 誰に届けたい機能なのか、誰が届けたい機能なのか、自分たちにできること/できないこと、など視座を行き来する(基本的に誰がの部分は仕様設計者、デザイナー、CSなど、複数名いることが多い)
  • 利用者として、何が期待値となり、どういう操作に誘導され、何を体験するのか、という視野を広く持つ
  • サービス提供者として、どうやって利用者の期待値をつくり、どういう操作に誘導し、どのように価値を感じてもらうのか、という視野を広く持つ

(5)モチベーションを切り離す  

  • モチベーションは付加価値というスタンス
  • モチベーションがゼロ:いい仕事ができる
  • モチベーションが MAX:めちゃくちゃいい仕事ができる

(6)レガシーコードを受け入れる

  • 別チーム/別会社の実装を引き継いで開発を進めたり、プロジェクトに途中から参画することはよくある
  • そのときに「実装がレガシー」「参照している gem が古い」ということもよくある
  • セキュリティ FIX とかは別だけど、そういう場合に無理にキレイなコードに書き換えようとしない、かつ機能追加時もなるべく既存のコードと足並みを揃える
  • コードの書き換え(リファクタ)で効果を上げるためには量が大事だと思っていて、たとえば全体の 5 % を書き換えただけでは逆にメンテコストが上がる(複数の書きっぷりを把握する必要が出てくる)ので、全体の 80 % 以上に手を入れられるリソースと覚悟を持てた時に初めて手を入れる
  • 来たるチャンスのために自分だったらこうするという観点を持ち続けておく(どこかにメモしておければ良し)

 

(7)レビューにはより一層時間をかける

  • レビューは要件や実装、アウトカムを深堀りするチャンス!
  • しっかり時間をかけて自分の学びの場とする
  • レビュー観点
    • 期待通りのもの(利用者への価値)が実装できているか?・・・(1)アウトプットを最小に、アウトカムを最大に、(4)視野を広く、視座を行き来する
    • アウトプットは最小化できているか?・・・(1)アウトプットを最小に、アウトカムを最大に
    • 既存コードとの足並みは揃っているか?・・・(6)レガシーコードを受け入れる
    • 綺麗なコード/無理のない実装となっているか?・・・(4)視野を広く、視座を行き来する、(6)レガシーコードを受け入れる
    • 他の機能との統一感はあるか?・・・(4)視野を広く、視座を行き来する
    • 既存機能をスポイルしてないか?・・・(4)視野を広く、視座を行き来する
    • 1 週間後の自分、1 ヶ月後の自分が理解できるか?

(8)失敗から学ぶのではなく、成功から学ぶ

  • 失敗から学べるのは次から失敗しない方法であり、成功する方法ではない
  • 成功する方法は成功からしか学べない(自転車に乗る方法は自転車に乗れてからじゃないと分からない、と似てる)
  • 「成功とは?」から考え、絶対に成功する方法を模索する

 

(9)未来の自分に向けてドキュメントを書く

  • どんなプロジェクトも複雑性を持っているし、それをすべて把握するのは大変なこと
  • かつ、人は忘れゆくものでもあるので、未来の自分へのメッセージとして経緯や判断基準、調査したことなどをドキュメントとして残しておく
  • コードも変わりゆくものなので、必要以上に信じて「コードを読めば分かる」で片付けない(その当時は「コード読めばわかるだろう」と思っていても、周辺に実装が追加されて 1 年後にはよく分からなくなってしまった、というのはよくある話)

(10)あっても無くてもいいものは無い方がいい

  • 「あっても無くてもいいよ」という機能が必要になることはほとんどなく、「とりあえず実装しておくか」としておくとデッドコードとなってしまうケースが多い
  • 安易に実装せず、周辺を深堀りして本当に必要があるのか否かを確認、必要がなければ実装しないようにする
  • YAGNI、KISS、ジャストインタイム、つくりすぎのムダ

さいごに

エンジニアという仕事柄、新しい言語とかフレームワークとか変わりゆくものばかりに目がいってしまいがちですが、たまには変わらないものを見つめてみるのも良いかもしれません

株式会社ハートレイルズを退職します

6 月末で株式会社ハートレイルズを退職し、7 月より新天地へ移ることになりました。

現在は有休消化という名の元、新天地への準備やこれまでやってきたことの棚卸しに追われています。

愛媛にUターンするためにハートレイルズへ入社

9 年前、祖父の近くに居たいという願いを叶えるべく愛媛へのUターンを考えていたときにハートレイルズに出会いました。

当時は「リモートワーク」という言葉すら存在していなかった(?)というくらいリモートワークの黎明期で、ほとんど選択肢の無い中での出会いだったことを覚えています(実際、私のブログの中でも「リモート勤務」と呼んでいました)

 

その頃の会社には関東圏のスタッフしかおらず、私は愛媛という遠隔地で働きたいというのが希望だったので書類選考で落ちるだろうなと思っていたところ、興味を持ってもらってなんとか入社に漕ぎ着けたのは懐かしい思い出です。

 

ogin-s57.hatenadiary.org

エンジニアをやめてたかもしれない

私の地元は愛媛でもかなり田舎の方で IT の仕事は皆無でしたが、ハートレイルズのおかげで IT 業界を去ることなく愛媛での生活基盤を築くことができました。

もしこのときハートレイルズという会社が存在していなければ、私は別の職業に転職していたかもしれないですし、それはそれで楽しんでたかもしれないけど、とにかくエンジニアで在り続けられたのは 9 年前のあの時点で会社があったおかげであるのは間違いありません。

感謝してもしきれないですね。

転職のはじまり

ある日、昔から繋がりのあるエージェントから

 

「紹介したい会社があります」
「カジュアル面談でも OK です」

 

という連絡をもらいました。

 

はじめは全然転職する気はなくて、ただ「紹介したい会社」の印象が良かったので話だけでも聞いてみようかなとカジュアル面談を設定してもらいました。

カジュアル面談を通しての印象もとても良く、先方も私に対して興味を持ってもらったんですが「今は転職の意思はないので」ということで、その時点で選考に進むのはお断りしました。

このときは、まだまだ現職で貢献していこうと考えていました。

エージェントから「もっとお互いを知ってみれば?」と勧められる

それからしばらくして、転職意思の無かった私にエージェントから

  • 私は先方に好印象、先方も私に好印象
  • お互いが好印象なのに歩み寄らないのは勿体無いのでは
  • 今後の選考を「お互いを知る場」として考えてみてはどうか
  • 内定後に断ってしまっても大丈夫ですよ

という趣旨のお話をいただきました。

 

当初は「転職の意思も無いし内定をもらっても断ってしまうのは抵抗がある」と感じていたんですが、確かに印象はとても良かったので、もう少し深く知ってみてから考えようかなと思い直しました。

選考、そして内定

その後、2 度の選考を通して無事内定をいただきました。

この 2 度の選考がとても印象的で

 

「人」を大事にしているし、これからもそうしていく

 

ということがすごく伝わってきて、一気に惹き込まれて行きました。

これまでも色々なプロジェクトに関わってきましたが、その中で印象に残ってるのって

 

「〇〇という革新的なプロダクトを世の中にリリースした」

 

じゃなくて

 

「あのチームで働けて楽しかったなぁ」

 

ということばかりなんですよね。

逆に言うと「チームはボロボロだけどすごいプロダクトを生み出せて楽しかったなぁ」なんて思ったことは 1 度もなくて、やっぱり「人」「チーム」ということが私の中で大きな部分を占めているんだなと実感しています。

この辺は人によって違うかもしれないですけど。

 

私は「プロダクトにはチームがそのまま表現される」と考えていて、たとえば信頼関係の構築されていない仲の悪い人たちで構成されたチームで運用されてるプロダクトは、なんだか全体感が無くてギスギスしてて使いづらいように思ったり、逆に信頼し合っている仲の良い人たちで運用されてるものは全体に統一感があってちょっとしたところに優しさを感じたり、そういうことが実際あると思っています。

もちろんプロダクトがどんな価値を提供するものなのかとかそれを実現する技術力が無いと、というそもそも論はあるんですが、土台はそうあって欲しいと常々思っています(まずはチームの関係性という土台が強く大きく広がっている上にそういったそもそも論が乗っかるイメージ)

 

根本的な考え方で同調したというのが、一番大きな決め手になりました。

ハートレイルズへの感謝

ハートレイルズではパートナーやクライアント含め、多くの仲間に出会い、刺激を受け、助け合い、切磋琢磨してきました。

 

意志を持って何かをやりたいと表明すると、必ず背中を押してくれる環境がそこにはありましたし、その環境があったからこそ自分を成長させていけたのだと確信しています。

 

長い間一緒に働けて最&高でした。

さいごにひと言

正直 9 年間も勤めると色んな感情が芽生えてしまって、とてもひと言では表現できないんですが・・・ハートレイルズという会社が世の中に存在してくれていたことで、少なくとも 1 名(+その家族)の人生を確実に豊かにしてくれました。

 

ありがとうございました!

ゆるふわ.rb in 大洲 〜Rails 5 の新機能を探せ!〜 を開催しました

4/23(土) にゆるふわ.rb を開催しました。
今回は Rails 5 の新機能についてみなさんとワイガヤしました。
ゆるふわ.rb in 大洲 〜Rails 5 の新機能を探せ!〜 - ゆるふわ.rb | Doorkeeper

だらっとスタート

いつも通りのウェルカムドリンク(あおさの味噌汁)を振る舞いながら、なんとなく揃ったかな〜というタイミングでスタート。遠くは香川から(小林さん、ありがとう!)10人弱のみなさんにお集まりいただきました。


Rails 5 の新機能のご紹介

ひと通り自己紹介を済ませた後、わたしから Rails 5 の新機能を紹介させていただきました。新機能はたくさんあるんですが、開発者視点で便利になった点や気をつけないといけない点にフォーカスを当てて紹介させていただきました。

  1. development 環境でのキャッシュ ON/OFF が簡単になりました
  2. belongs_to のデフォルトが required: true になりました
  3. routes に検索オプションが導入されました
  4. redirect_to :back が非推奨になりました
  5. migration ファイルの記述が変更されました
  6. ネストされたパラメータのフィルタリングが可能になりました
  7. left_outer_join が導入されました

スライドはこちら:What's new in Rails 5

みんなで Rails 5 を丸裸に!?

続いてみんなで Rails 5 の新機能をググる合戦を行いました。ActionCable や API などの機能についてや、tubrbolinks が書き換えられることについて「どの世界でも同じようにがんばってんだな」という熟練の感想まで、様々な意見をもらいました。

調査結果をみんなに共有

そしてみんなで投票し合って票を集めた方に景品を・・・と当初は考えていたんですが、せっかく調べてもらったものに順位をつけるというのもなんだかなぁと思って、急遽景品はじゃんけん大会で授与することにしました。投票するより盛り上がりましたよ(笑)


泉さんが「カワイシ醤油」と「おおさ」をゲット(めっちゃジャンケン強いw)「骨まで食べれるまるとっとあじ(しお味)」を柳さんが、「骨まで食べれるまるとっとあじ(みりん味)」を加藤さんがゲットしました。(ホントはその写真も貼りたかったんだけどピンとがボケすぎてて・・・とりあえず1番ピンとが合ってる「あおさ」をゲットした泉さんだけ貼っておきます(笑)

盛りだくさんのお魚でおもてなし

ここまでで Rails 5 の話は終了(笑)ここからはビアバッシュ形式でお酒を酌み交わしながら色んな話をしました。もちろん美味しいお魚付きです。

カンパチとねぎとろ

定番の鯛(相変わらず弾力がすごかった!)

カツオのたたき(にんにくポン酢でいただきました)

サービスでもらったシメサバ

鯛の白子。初めて(?)食べたけどめっちゃ美味かった

さいごに

今回もたくさんのみなさんに集まっていただいて楽しく勉強会を開催することができました。一部の方にはご連絡していたのですが、実は5月末に関東圏への引っ越しを考えていて、今回の開催がたぶん最後になります。

こうやってラフに語り合える場というのを実現したくて作ったコミュニティだったので、最後までそういう会として実現できたことを嬉しく思いますし、それはやっぱり参加者のみなさんの遊び心というか、楽しみたいという想いに支えられてこのコミュニティがあったなと実感しています。

これまでに参加いただいたみなさんに感謝しつつ、そしてまたどこかこうやってラフに語り合える場での再会を楽しみにしつつ、お別れとしたいと思います。

今回ご参加いただいたみなさん、そしてこれまでゆるふわ.rb に関わっていただいたみなさん、ありがとうございました。また飲みませう。

ゆるふわ.rb in 大洲 〜作ってみよう Slack bot〜 を開催しました

1/30(土) にゆるふわ.rb を開催しました。
今回は Slack をテーマに、Ruby から Slack へ投稿する方法をレクチャーした後、実際に参加者のみなさんに bot を作成してもらいました。
ゆるふわ.rb in 大洲 〜作ってみよう Slack bot〜 - ゆるふわ.rb | Doorkeeper

ウェルカムドリンクで和む

まず初めに定番のウェルカムドリンク、あおさの味噌汁でみなさんの体と場の雰囲気を温めさせてもらいました。今回はいつもと違って麦味噌にしたんですが、それはそれで美味しかったようです。

そしてナカジさんがつい最近お誕生日を迎えたということで、あおさをプレゼントさせていただきました。ぜひご自宅の味噌汁に加えてみてください!

Slack へ投稿する方法をレクチャー

次にわたしから Slack へ投稿する方法をレクチャーさせていただきました。
投稿する方法はいくつかあるんですが、今回は Incoming WebHook という Slack の Custom Integration を利用して投稿する方法をとりました。
これは Slack 側でフック用の URL を発行し、その URL にリクエストを投入すると所定のチャネルへ投稿されるというものになります。(Incoming WebHook の設定ページ

また、 WebHook URL へリクエストを投入するのに slack-notifier という gem を利用しました。
これを利用すると ↓ のような感じでシンプルに実装できます。

require 'slack-notifier'

WEBHOOK_URL = 'https://hooks.slack.com/services/....'  # 発行した URL
CHANNEL  = '#yurufuwarb' # 投稿するチャネル
USERNAME = 'yurufuwan'   # 投稿するユーザー名

notifier = Slack::Notifier.new(WEBHOOK_URL, channel: CHANNEL, username: USERNAME)
notifier.ping 'Hello World'

さて、これでもう投稿できるようになったのでレクチャーはここで終えても良かったんですが、もう一歩踏み込んで bot っぽいことをしてみました。

次に利用したのは Slash Commands という Custom Integration です。
Slack には / で始まるコマンドが多数用意されているんですが、自分用に新しくコマンドを定義できるのがこちらの機構になります。(Slash Commoands の設定ページ

Slash Commands では新しく追加したコマンドを打った際に別のエンドポイントへリクエストを投入することができます。今回はそれを利用して、/yurufuwa というコマンドを作成、それをとある Web アプリへ送信、受け取ったアプリが Slack へ指定されたメッセージを投稿する、ということをやってみました。

これは以前話題になった ChatOps に利用できると思います。
これまでだと hubot をチャットに参加させてメッセージを監視、所定のメッセージで所定の動作をさせるというのが一般的でしたが、hubot の作成には Node.js の知識が必要ですし、他には API キーを発行・指定してあげたりなど、ものすごく大変なわけでは無いですが少し面倒に感じてしまう部分は拭いきれませんでした。

それが Slash Commands を利用すると Web アプリのエンドポイントを用意するだけで良いので、自分の好きな言語で実装できるし、Slack 用の設定は不要なため、大分敷居が下がるのではないかと思います。
これから ChatOps を実現しようと思っている方は選択肢の1つとして Slash Commands を一考してみてはいかがでしょうか?


お刺身をつつきながら Slack bot を作ってみる

次はみなさんお待ちかねのビアバッシュです。みんなで飲み食いしながら bot を作成したり仕事感を交わしあったり楽しい時間を過ごしました。

今回は鯛と太刀魚のお刺身をご用意、しゃぶしゃぶにしても絶品でした。

ほどよくお腹が満たされたところで bot 作りに。

途中で寒くなってストーブを着けるよとするもなかなか着けられないという一幕も(笑)

チェックアウト

楽しい時間はあっと言う間に過ぎるもので気がつけばチェックアウトの時間に。最後にみんなで片付けをして「来た時よりも美しく」して会場を後にしました。

今回はテーマ選びも良かったようで、実際に Slack へ投稿できると「お、できた!!」のような小さな成功体験が積めて、参加者のみなさんにも楽しんでいただけたようです。
また、いつものゆるふわ.rb らしくテーマ一辺倒ではなく、仕事のこととか業界のこと、将来のことなど色々話せたのが良かったと思います。
こうやって色んな立場の人で集まって話すことで、自分とは違う視点の意見も聞けるし、それが新たな気づきを促したり刺激になったりして、自身の成長につながっていくものだと改めて感じました。

これからもそういう場を提供できるコミュニティの1つとしてゆるふわ.rb を運営していければと思います。
参加いただいたみなさん、ありがとうございました。

ゆるふわ.rb in 大洲 〜ここがスゴイよ RubyMine!〜 を開催しました

7/4(土) にゆるふわ.rb を開催しました。
今回のテーマは RubyMine で、普段わたしがよく使う機能やショートカットを説明した後に参加者のみなさんと共に IDE(とその他雑多なことについて)語り合いました。
ゆるふわ.rb in 大洲 〜ここがスゴイよ RubyMine!〜 - ゆるふわ.rb | Doorkeeper

看板がリニューアル!

今回から施設の担当者が変わったのを受けて、勉強会会場の看板も新しく生まれ変わりました。(ようやく正しい表記になりました!)


以前はこんな感じ。一箇所間違ってるんですが分かりますかね...?

※「ゆるふわ」じゃなく「ふるふわ」になっていたのです。。。

ウェルカムドリンクと自己紹介

ゆるふわ.rb のウェルカムドリンクと言えば・・・そう、あおさの味噌汁です。今回わたしも久しぶりに作って食したんですが美味しかったですね。参加者のみなさんにもウケがよかったです。

ウェルカムドリンクを味わいながら、参加者のみなさんに簡単な自己紹介と普段使っている開発環境についてお話してもらいました。
RubyMine の利用者はわたしともう一人だけでしたが、その分多様性が広がって良かったかなと思います。

ここがスゴイよ RubyMine!

次にわたしが普段使っている機能やショートカットをライブで実践しながら説明していきました。説明した機能やショートカットは ↓↓ です。

説明した機能

  • Debug(デバッガの使い方)
  • Show History(ローカル)
  • Show History(Git)
  • Annotate(Git)
  • Refactor
  • Column Selection Mode

説明したショートカット

  • cmd + shift + A(アクションやオプションを呼び出せる。神コマンド!)
  • cmd + shift + o(指定のファイルへ飛べる。インクリメンタルサーチ。)
  • cmd + fn + f12(ファイル内の変数やメソッドに飛べる。インクリメンタルサーチ。)
  • cmd + L(指定行へ飛べる。)
  • cmd + 9(ローカルの変更一覧を見れる。)
  • cmd + d(リモートとの差分を見れる。ダイアログ上での編集も可能。)
  • cmd + option + ←(戻る)
  • cmd + option + →(進む)
  • cmd + control + ↑(controller、model、view、helper、spec 間を行き来できる。)

この中で一番おぉぉとなったのは Annotate でした。この機能は git blame の結果を GUI 上で見れるというもので、たとえば「この処理はいつ/どんな経緯で入ったんだっけ???」とかを調べたいときに重宝します。


ビアバッシュ

次にメイン(?)のビアバッシュに入りました。今回は胸焼けしそうなくらい大量の鯛とカンパチを用意しました。半分はしゃぶしゃぶでも良かったかも。。。

いろんな開発環境の話やプログラムの話や筋トレの話(?)などをしながら楽しく飲み食いしました。技術な話もその他の話もお酒と共に味わいながら終始楽しい雰囲気で進みました。お酒の途中にはさむ味噌汁も絶品でした。

チェックアウト

最後にみんなで片付けをして、ゴミ1つ残さず会場を後にしました。

今回は前回開催から半年以上空いてしまっていたので、ゆるふわ.rb のことを忘れられてしまっていないか若干不安もあったのですが、変わらず多くの方々に来ていただいてとても嬉しく思いました。
これからはもう少し定期的に開催していって、今回のように楽しく話せる場を提供していければと思います。
参加いただいたみなさん、ありがとうございました。

祖父を見送りました

先日祖父が亡くなりました。
弱々しくはありましたが亡くなる5時間前まで会話できていたので「急だったな」とは思いますが、その表情は普段寝ている時の表情そのものだったので、なんとなく苦しまずに逝ってくれたのかなと少し安心する気持ちもありました。
地元に戻ってきて約2年、享年96歳、正直どれだけ孝行できたのかは疑問ですが、長生きして孝行する時間をたくさん作ってくれてありがとうと言いたいですね。

祖父のサポートのためにリモートワーカーに

私は生後半年で母親を亡くし、物心つく頃から祖父が母親代わりとなって育ててくれました。
その祖父をサポートするためにリモートの道に進んだのでした。

7月から愛媛でリモート勤務になります。 - ITエンジニアとして生きる

当初はリモート特有のコミュニケーション方法に困惑したり、新しい環境での仕事の進め方に慣れなかったりと色々苦労しました。
ただ自分は祖父をサポートするために帰ってきたわけで、自分の仕事すらうまくやれないようだとそんなことできないし、弱音なんて吐いていられなかったんですね。
苦しい時期を乗り越えられたのは、もちろん仕事に対する責任感とか向上心とかもありますが、一番はそういった想いがあったからだと思います。
祖父の存在が色んなものを越えさせてくれたんだと思います。

リモートという働き方を選んで良かった

生前、平日にもかかわらず、祖父をかかりつけの病院へ連れて行ったり、銀行やスーパーに一緒に行ったりなど、日々の生活のサポートを少なからずやってきました。
これはリモートという働き方を選んだことによって実現できたものだと考えています。
もしどこかの会社に出社していたとすると、その度に中抜けするのも難しい(心苦しい)と思いますし、まずその会社が家の近所かどうかということも関係してきて、なかなかこのような形のサポートは実現しづらかったのではないかと思います。

リモートワークでは成果を出すことを大前提に、基本的に時間の制約は外されます。
極端なことを言えば1日2時間の作業でも成果が伴えば OK だということです。
短い時間で成果を出して余った時間で祖父をサポート、それが私の実践してきたことでした。

(ただ勘違いしてはいけないのは、成果が大前提ということは、例えば1日20時間働いても成果が伴わなければ NG だということです。実際リモートを始めた頃は色々不慣れな部分があって、毎日12時間くらいやってましたが、それでも全然成果を出すことはできませんでした。まずは自分の能力を高めて短い時間で成果を出せるようにすることが大事で、それができるようになると時間に囚われることなく行動できるようになるのがリモートワークの利点だと思います。)

人生とはつくづく分からないもの

祖父は体調を崩してから入院、その後ショートステイで施設に入所してそこで息を引き取りました。
次に本入所する施設も決まっていましたし、まだまだ先の予定も立てていて祖父とはもう少し一緒の時間を過ごせると思っていたんですがね・・・ホント人生は予定通りにいかないものです。

予定通りにいかないからこそ思うのは「人生はいつ終わるかわからない。だから自分のやりたいようにやるのが1番」ということです。
2年半前は愛媛に帰ってくることもリモートで仕事をすることも全く考えてなかった自分、色んなことがあって今こうしてブログを書いている自分、全く違い過ぎてホント不思議ですが、こういう道を選んで少しだけ祖父に寄り添うことができて、満足はしていませんが納得感ある日々を送ることができたと思っています。

自分のやりたいようにやるということは色んな面でエネルギーがいるかもしれませんが、その苦労を考えて行動しないよりも、行動を起こした方が「やり残した感」が無くていいんじゃないかなと思います。
断言はできないけど、その苦労の先にはきっと何か得るものがあるんじゃないかと思います、たとえそれがうまくいかなくても。
これからもそういう指針で行動していければと考えています。

さいごに

大切な2人へメッセージを贈って終わりにしたいと思います。



祖父へ

だいぶ食も細くなっていた中、最後にたくさん食べてくれたのは僕の下手くそな腕でさばいたカワハギの刺身でしたね。
すごく嬉しかったし、これからちょっとずつ食欲も回復していって、まだもう少し一緒の時間を過ごせると思っていました。
残念な気持ちもありますが、安らかに逝ってくれたであろう表情を見て天寿を全うしたのだと思いました。

もう下手くそな腕で魚をさばかなくていいのかと思うと寂しいです。
もう仕事の合間をみてお見舞いに行かなくていいのかと思うと寂しいです。
もう娘の動画を見せた後の笑顔が見れないかと思うと寂しいです。

色んな寂しい想いを抱くくらい愛情を注いでくれてありがとう。
もう少しあなたの余韻に浸りながらやっていこうと思います。
いつかまた会いましょう。



妻へ

僕の決断を尊重してくれて、祖父が体調を崩してからもそちらを優先させてくれて、理解あるあなたに感謝します。
まだ娘も小さく、色んな部分で負担をかけたと思いますが、それを感じさせなかったあなたに感謝します。
あなたがいなければきっとたくさんのことを後悔していたことでしょう。
あなたのおかげで祖父に少しだけ幸せな人生を歩ませる手助けができました。
ありがとう。これからもよろしくね。

ゆるふわ.rb in 大洲 〜やってみようスクレイピング〜 を開催しました

11/2(日) にゆるふわ.rb を開催しました。
今回のテーマは「スクレイピング」で、説明を兼ねた私のライブコーディング後に参加者のみなさんにも実際に手を動かしてもらいました。
ゆるふわ.rb in 大洲 〜やってみようスクレイピング〜 - ゆるふわ.rb | Doorkeeper

まずは自己紹介から

はじめに参加者のみなさんに簡単に自己紹介してもらいました。
今回初めて来られた方もいて、まだまだゆるふわ.rb の多様性も広げていけるな〜という可能性を感じました。
また、意外だったのは「スクレイピング」というテーマに惹かれて来ましたという方が複数人いたことで、面白くて参加したくなるようなテーマをこれからも考えていきたいと思いました。

スクレイピングの説明&ライブコーディング

次に私から参加者のみなさんへ、簡単にスクレイピングの説明をしてライブコーディングに入りました。
ライブコーディングは irb で、まずは open-uri を使ってサイトの情報を取得してみました。
open-uri は Kernel.open を再定義してくれるもので、open("http://xxx") という形式でサイト情報を取得できるようにしてくれます。(スクレイピング対象はHeartRails のサイトにしました。)

irb> require 'open-uri'
irb> url = "http://www.heartrails.com"
irb> hr = open(url)
irb> hr.each_line do |l|
irb>   p l
irb> end

このコードを実行すると、対象サイトの HTML が出力されます。(スクレイピングの入り口ですね)
次に「ではタイトルを取ってみましょう」ということでコーディングしてみました。

irb> require 'open-uri'
irb> url = "http://www.heartrails.com"
irb> hr = open(url)
irb> hr.each_line do |l|
irb>   if l.include?("<title>")
irb>     start_index = l.index("<title>") + "<title>".length
irb>     end_index = l.index("</title>")
irb>     p l[start_index...end_index]
irb>   end
irb> end
# => "HeartRails | ハートレイルズ | ザ・ウェブサービス・カンパニー"

<title> ディレクティブで検索して、見つかったらその中身のデータを出力するようなプログラムになっています。
まぁこれでも OK なんですが、ちょっと <title> の中身を取るところの処理が長いですね。。。

そこで次は nokogiri を使ってもっと簡単にしてみました。
nokogiri は HTML/XML パーサーで、Nokogiri::HTML(open("http://xxx/")) という形式でサイト情報をパースしてくれます。

irb> require 'nokogiri'
irb> hr = open(url)
irb> noko_hr = Nokogiri::HTML(hr)
irb> noko_hr.methods.grep /title/
# => [:title, :title=]

irb> noko_hr.title
# =>"HeartRails | ハートレイルズ | ザ・ウェブサービス・カンパニー"

nokogiri を利用するとすでにタイトル部分はパースされているため、noko_hr.title とするだけでタイトルが取得できます。
利用しない場合に比べるとずいぶんシンプルなプログラムになりました。

スクレイピングしながらビアバッシュ

続いて参加者のみなさんにスクレイピングにチャレンジしてもらいました。
やってもらったのは HeartRails のサイト内の Services のリンク(<a href=...> の部分)とサービス名を表示するというもの。

みなさんあまりおしゃべりもせず結構真剣に挑戦されていました。
その光景を見て「ゆるふわ.rb っぽく無いな〜」と思って笑ってしまいました(笑)

今回は参加いただいた越智さんのつながりで、ボノ株式会社さんと Skype でつないで交流を深めるという新しい試みも実践しました。
残念ながら Skype では刺身は送れないので、しっかり見せびらかしながら食しましたよ(笑)
ボノ株式会社|Bono Inc.

今回の交流ですっかり仲良しになりました

ちょっと写真では分かりづらいんですが、後ろに写っているオフィスは倉庫を DIY したそうです!
次はキッチンを導入予定らしく、もしキッチンが出来たら出張ゆるふわ.rb で魚のさばき方勉強会リターンズなんてのをさせてもらったら面白いかも?なんて勝手に思ってたりします(笑)

見せびらかしたアジ刺し、タイ刺し、ふぐしゃぶ

まとめ

今回久しぶりにゆるふわ.rb を開催しましたが、何人もの方にこうやって田舎まで足を運んでもらえることは本当にありがたいなと改めて思いました。
これからもこういう人とのつながりを大事にしつつ、面白いテーマでみんなでワイワイ ruby を楽しめる場を提供していけたらと思います。
参加いただいたみなさん、ありがとうございました。