Eat, Play, Nap and Code

食とあそびと昼寝とプログラミング学習

英語を学ぶ楽しみ

ボロい会社の話

5年ほど前、当時通っていた歯医者の近くに、年季の入った建材会社がありました。 虫歯治療をしていたので、1.5ヶ月ほど週1でその会社の前を通っていたのですが、通るたびに「ボロい会社だな」くらいにしか思ったことがありませんでした。 それから1年後、今度はマウスピースを作りに同じ歯医者に通い始めました。

同じ道を通って同じ建材会社の前を通ったとき、あることに気づきました。この会社、なんかボロいなあと思ってたけど外壁がパレットだ…!!

f:id:eatplaynap329:20210926082307p:plain

(↑を一面に並べて針金で固定していた)

1年前もおそらくパレット外壁だったのだと思うのですが、当時の自分はパレットというものを知りませんでした。 1年間商社で働き、輸入業務に携わる中でパレットが身近になり、実際のパレットを意外な場所で見ても、「あ、あれだ!」と思えるようになったのだと思います。

変なエピソードでスタートしてすみません。自分は英語を勉強するのが趣味なのですが、英語を勉強していると、こういう驚きに日常の中で頻繁に出会えるから楽しくて仕方ないという話をしようと思います。

ドラァグレースの話

私は日本だとNetflixで見られるリアリティショー、ル・ポールのドラァグレースが大好きです。 全米から集まったドラァグクイーンがAmerica's Next Drag Superstarの称号と賞金をかけて戦うコンペティション番組で、昨年頭には日本でも公演を行う世界的人気の番組です(私も行った)。

クリエイティビティとアナキズムに満ちたメイクやファッション、ダンスや歌などのパフォーマンス、「これが私」「私最高」という自信満々のアティテュードなど大好きな要素はたくさんあるのですが、個人的に1番好きなのはドラァグカルチャー独特の言葉遣いです。

私は結構真面目に英語を勉強してきたので、日常的な内容の映像作品だったら字幕なしでも7割くらい理解できます。 ですが、ドラァグレースのS1を初めて見たときは、日本語字幕なしでは文字通りひとことも理解できませんでいた。

文法も使う単語もアクセントも、英語なのに全然わからん…でも楽しいから見る!とS1からS6までを見続けていたら、Netflixの字幕がバグって日本語字幕が途切れるようになってしまいました。

仕方ないので字幕なしで見るはめになったのですが、いつの間にか全部分かるようになってる自分に気づきました…!!

バグったとき見ていたのはちょうどランウェイの品評のシーンで、ランウェイシーンはドラァグレースの中でも1番下品な言葉遊び・スラング・派生文化への言及が多く、英語の難易度はめちゃくちゃ高いと思います。でも言葉が分かるようになると1番面白いと思うようになりました。これがチャクラが開くってやつ??

ドラァグレースは日本ではまだマイナーな存在ですが、アメリカではエミー賞常連のメインストリームな番組なので、ドラァグカルチャーの英語が分かるようになると、実は結構他の場面でも日常的に使われていることに気づきます。

具体的に言うと自分はカーディ・Bの英語とかが聞き取れるようになり、インスタライブで景気よくやっている姿を楽しめるようになりました(アメリカ人の若者の英語、クィアカルチャーとヒップホップカルチャーに対する理解は不可欠な気がする)。 Sashay shante panther on the runway!

やっとプログラミングの話

このエントリを書くことになったきっかけは、最近私が参加しているThe Art of Readable Codeの輪読会がめちゃくちゃ楽しいのに、私からパワハラオーラが出ているせいか英語という点にハードルが高く感じられる人が多いのか、誘ってもなかなか人が集まらない・せっかく来ても居着いてくれないためです😭

あなた英語が得意だから楽しいんでしょうと思っている方がいたら、私は「日本語で読めるのと同じくらいのレベルの英語だったら読める」だけなので、普通にプログラミングに関する文章は、英語が得意ではない方と同じくらい難しいです。

なので、輪読会中も分からない単語たくさんありますし、読んでみて文意が取れずDeepLにかけることもしばしばあります。

ただ、実は自分でも『リーダブルコード』日本語版の輪読会を主催していて、並行して日本語版も読んでいるんですが、英語版を読んでいるときの方があきらかに楽しいです。

なんでかなと考えてみると、プログラミング学習をしてると、知らない言葉や知らない概念に毎日のように遭遇します。多くの場合は英語で、その概念について詳しく調べようとすると、更に新しく耳慣れない英語の概念が出てきて、敗北感と大量のタブに日々打ちのめされています。

プログラミングの文脈でなんとな〜〜く理解した気分になっている言葉も、きちんと腹落ちしているわけではなく、「こういう用途で使う」と覚えているに過ぎないので、モヤモヤしつつ使っているものばかりです。

そんな中、輪読会でわからない言葉を丁寧に拾いながら英文を読んでいると、ぼんやりとした理解に言葉という明確な形が与えられる感覚があります。

例えば、The Art Of Readable Codeの中に、下記のような一節があります。

Attach important details to variable names — for example, append _ms to a variable whose value is in milliseconds or prepend raw_ to an unprocessed variable that needs escaping.

Boswell, Dustin; Foucher, Trevor. The Art of Readable Code (p.42). O'Reilly Media.

私はappendとprependという言葉の意味が分からなかったので辞書で調べ、appendは「後ろに付ける」、prependは「前に付ける」という意味だと知りました。 日常的に使う言葉じゃないし覚えられるかは微妙だなと思っていたところ、RubyのArrayクラスに同名のメソッドがあると教えてもらい、メソッド名通りの動きをするのですげ〜!と感動し、その場で覚えてしまいました。

こういうふうに知識が増えると世界の解像度が上がり、今までとは全く別のものに興味を持てたり、同じものを見ていても別の面を見出すことができるから楽しいんだと思います。

なんか全くとりとめのない文章になってしまったので、もうちょっとは役に立つかも知れない過去に書いた自分の英語学習についての記事を最後に置いておきます。

scrapbox.io

Rails Girls Gathering Japan 2021でLT登壇しました

はじめに

こんにちは。2021年8月28日(土)にオンライン上で行われたRails Girls Gathering Japan 2021でLT登壇をしたので、登壇の感想についてまとめようと思います。

発表内容については下記のブログにまとめました!

eatplaynap329.hatenablog.jp

もくじ

登壇を決めたきっかけ

7月の終わり頃、所属するフィヨルドブートキャンプのアドバイザーの@June29さんと、ランチ会という形でお話をする機会をいただきました(自分は1on1は緊張すると思って一緒に付いてきてくれる2人を誘って4人でお話しました)。

その中で、JuneさんがYouTubeをアップし続けるモチベーションについて伺ってみたところ、「老後見返したらめちゃくちゃ面白いコンテンツになっているはず」と言う、説得力がありつつ変化球な回答をいただき衝撃を受けました。

その翌日、前日の衝撃冷めやらぬまま、自分も老後のためのコンテンツ作らねば…!と、その時募集中だったRails GirlsのLT登壇に勢いで申し込んでいたというのが経緯になります。

準備について

話す内容

最初は技術的な話をしようと思い、何かをRubyで作って作る過程や機能について発表しようと考えていました。

実は先日紹介したDiscord BotはLT発表用に作ったものでしたが、ブログにまとめたら完全に満足してしまい、わざわざ語り直す必要性を感じなくなってしまいました。

eatplaynap329.hatenablog.jp

また、私自身はDiscord Botやdiscordrbの専門家ではないので、語れることはかなり限られています。 100知っていることについて1話すのと、1しか知らないことについて1話すのでは全然面白みが違うだろうなと思い、もっと情熱を持って語れることを題材にする方がいいと考えなおしました。

そこで、Rails Girlsってどういったイベントなんだろう、という基本に立ち返り想定視聴者を考えました。

私がプログラミングの学習を始めたのはコロナ禍以後なので、Rails Girlsのオンサイトのイベントに参加したことはなく、イベントの理念を理解できているか自信がなかったため、Rails Girls Japanの江森真由美さんのインタビューを読みました。

codezine.jp

女性のなかには技術やITへの苦手意識を強く持っている人がいます。これは育った環境の影響もあります。苦手意識を克服するには、まずは女性コミュニティで敷居を下げ、成功体験してもらう必要があると思います。

江森さんの仰っていることは、今までの人生で私自身も感じてきましたし、Waffleでの活動を通じて日々考えていることだったので、何らかの理由でunderrepresentedな立場に置かれつつプログラミングに興味を持つ人向けに、普段考えていることややってることを話してみようと思い、LTの枠組みを考えはじめました。

発表資料づくり

LT登壇に申し込んだ時点から、輪読会のことを話すことは決めていたので、自分の経験より普遍的な話にできないかなとあれこれ話の構造から考えまくりました。

結果的にこれはよくなくて、何日も無駄にしてしまいました!

具体的なエピソードをどんどん書き出して、話の構成をあれこれ組み立て、結論を見出していくのが1番近道だなと思いました。

このような進め方って、地図を持たずに知らない道を歩くような怖さがありますが、今後LTを作る際には最初から完璧なものを作っていこうと思わず、荒削りなプロトタイプを洗練させていく方法を取ろうと思います。

発表練習

前回LTをした際は通し練習を15~20回もしていたらしいです😳

人生初のLTだったから粗相のないように気を張っていたんですが、発表の録画を輪読会仲間でおなじみのいっしー (id:isshi-hasegawa)さんに見てもらったところ「発表としては問題ないけど、トミーさんのよさは出ていない」という感想をいただきました…!ほぼ毎日喋ってる人に言われると納得度がやばい。

いっしーさんがLTされたときは、台本なしでスライドを見ながら即興で話していたらしいです。

isshi-hasegawa.hatenablog.com

めちゃくちゃグルーヴ感のある素晴らしい発表だったので、私も真似しよ…!とやってみたら、何度読んでもしどろもどろで聞き苦しくダラダラ話してしまうため、一旦これは自分には無理だと諦めました。

LTに対する私のスタンスは「時間厳守」なので、5分をきっちり守ることだけをとりあえず目標にして、余裕があればフリースタイルにも挑戦しようと考え直しました。

リハーサル

最初通し練習をしたときは8分で、練習しながらどんどん削っていって発表前日には5分20秒まで縮めることができました。 あと20秒(できれば30秒)削りたいな〜と思って練習してみるものの、何度やっても20秒前後オーバーしてしまいました。

前回のフィヨルドでのLT同様、別に20秒オーバーしたからと言ってその場で切られるわけではないことは知っていたんですが、5分という形式が決まっている以上オーバーするのは自分の趣味に反するので頭を悩ませていました。

そこで、輪読会メンバーで暇のある人に声をかけて発表を聞いてもらい、意見をもらうことにしました。

通しで聞いてもらった直後は皆「これ以上削るところはなさそう」という感想だったのですが、スライドと原稿を細かく見てもらうと無駄なところが浮き彫りになってきて、「輪読会やDiscordそのものについては説明なしでも誰にでも通じるでしょ」と言われ、わざわざ説明しなくても自明のことについては削除する方向で検討を始めていました。

そんな中、実際にRails Girlsにプログラミング未経験の状態で参加されたことのあるぺろ(id:mosshu0703) さんが、「大多数の人には通じるかも知れないけど、過去の私みたいな全くの未経験の人もRails Girlsには来るから、そういう人を置き去りにしないようにしてほしい」と仰ってくださり、とても深い感銘を受けました。

自分が満足できる発表をすることも大事だけど、それ以上にRails Girlsというイベントの目的も忘れないようにしなくちゃと気付かされた瞬間でした。

その他の皆の意見を参考にしつつ、それまで自分の体験をただ列挙しているだけの発表だったのですが、「何かを主催したいけど勇気が出ない人」を励ますような視点に変えて、発表当日の朝に原稿とスライドを書き換えました。 練習してみたら5分を若干切るくらいになったので、これで行くことにしました。

本番当日

準備

Zoomの背景をきれいに映すために100均で緑色のフェルトを2枚買ってクローゼットに貼りました。 微妙に長さが足りなくて右上の方は壁が映ってましたが、まあ細かいことはいいでしょう。

あとは以前Juneさんとのランチ会用にSUZURIで作ったTシャツを着ておきました。 ランチ会当日には届かなかったので、この機会にお披露目できてよかったです。

suzuri.jp

11時に登壇者向けの画面共有のリハーサル時間が設けられていて、参加しました。 Zoomで画面共有をしたことが1回しかないのでかなり緊張しましたが、運営のみなさんがとても優しくて「まあちょっとモタモタしてもいいか」と思えたので、ありがたかったです。

発表

私は5人のLT登壇者のうち4番目で、かなり緊張してしまい他の方の発表は聞いているものの全然頭に入ってこない状態でした。 前回のフィヨルドのLT同様、iPhoneMacを同期してiPhoneからスライドを動かす方式でやったので、何度もスライドが開けるか確認していました。 あとiPhoneでやる場合、本番中はTwitterの通知は切っておくのがおすすめです!

いざ自分の発表の番になったら、そこまで緊張せずに話すことができました。 着てるTシャツが位置的に見えないのはリハーサルのときに知っていたので、立ちあがって見せてみました。(これはTシャツを自慢したいというより、私がこのTシャツを着てることを知ってる人向けのサービス)

原稿を当日に書き直したため、思いがけず即興で話さなくてはいけない箇所もあり、結果的にいっしーさんのアドバイス通りにできたかなと思います。

本番を終えた感想

楽しかったー!!録画は公開されないので老後見る機会はないかもしれないけど、とてもいい思い出になりました!

前日のリハーサルを聞いてくれたいっしーさんが「スライドもプレゼンも前日より進化していて驚いた」と仰ってくれたり、Saki (id:Saki-Htr)さんが1月の自分のLTを覚えていて成長に気づいてくださったのもめちゃくちゃ嬉しかったです!こう見ると圧倒的成長…💪😤🔥

5月末に輪読会を始めて、7月にランチ会とTシャツ作りをして、8月はBotを作ってLTの準備をしていたので、このLTが今年の夏の集大成になった気がします。

コロナ禍2年目で、友達にも会えないし旅行にも行けないし将来も見えないし、いま置かれている状況に絶望することもあるんですが、やっぱり何かしら行動して自分の人生を良い方に変えていく努力はやめないようにしようと改めて思いました。何か行動してるからこんな状況でも最高の夏になったので!

Rails Girls Gathering Japan 2021の運営の皆様、登壇者の皆様、視聴者の皆様、楽しい時間を本当にありがとうございました〜〜!!!

輪読会を主催してみよう

f:id:eatplaynap329:20210830115451j:plain

はじめに

こんにちは。昨日のRails Girls Gathering Japan 2021でLT登壇したので、話した内容についてまとめようと思います。スライドはこちら。

speakerdeck.com

もくじ

輪読会について

現在私は所属するフィヨルドブートキャンプで輪読会を主催しています。

読んでいる本は『プロを目指す人のためのRuby入門』通称チェリー本です。

5月25日に開始したので、約3ヶ月経読んでいることになります。開催場所はブートキャンプのDiscordサーバー上の音声チャットを使っています。

開催時間は平日毎朝9時から1時間で、予習なしでその場で40分読みつつモブプロし、残りの時間で感想を言うという形で行っています。

主催するって不安

私は輪読会を主催していいことばかりだったんですが、いざ自分が主催するとなると責任もあるし、不安だと思われる方も少なくないんじゃないかと思います。

そこで、イベント主催に興味があるけど、勇気が出ないという方がちょっと勇気を出せるような話を出来たら良いなと思っています。

不安その1: 友達がいないから人が集まらない

フィヨルドブートキャンプはいまは完全オンラインのスクールなので、私自身気軽に話せる相手は輪読会前には1人もいませんでした。 輪読会をしたいけど友達がいないから無理だと思っていたときもありましたが、これは勘違いで、実際は輪読会をスタートさせて初めて友達ができました。

1人友達ができると、あとはその人を誘って地域Rubyなどの外部のコミュニティにも参加しやすくもなりますし、芋づる式に知り合いは増えていくと実感しています。

なので、いま友達がいなくても自分で輪読会を主催すれば絶対できます!

不安その2: 自分の時間が奪われる、時間の無駄では?

主催すると、どうしても決めなくちゃいけないことや雑事が出てくるので、限られた時間を捻出して学習にあてている人にとっては、時間の無駄に感じるかもと思います。

ただ、個人的には学習面でも時間面でも無駄どころかプラスになることばかりでした。

私の場合主催者として輪読会をもっと便利にしたくてRubyでDiscord Botを初めて作るという経験をしました。 Botを作ってみて、作りたいものを自分の手で作れて、プログラミングって本当に楽しいなと思い、この時点で学習面でめちゃくちゃプラスになっています。

eatplaynap329.hatenablog.jp

以前ブログでも書いたとおり、このBotは輪読会メンバーのやなぎさんが機能追加のプルリクを送ってくれていて、私が最初に開発したものより、より使いやすくなっています。

この経験から、自分の時間を奪われるのでは?という問いに対する私の答えは、主催者に付き合って参加メンバーが割いてくれる労力や時間も多く、得られるものがとても大きいので主催者側にもメリットしかないということです。

不安その3: リーダーシップないから無理

私自身、リーダーになった経験は輪読会の主催まで、1度もありませんでした。

もともとかなりネガティブな性格で、リーダーになった経験も全くないので、最初の頃は何でも悪い方にばかり考えてしまい、精神的に追い詰められていたときもありました。

ですが、自分のネガティブな性格のおかげで、輪読会をよりよくしようとPDCAを回す工夫がたくさん生まれました。Botもそのひとつです。

リーダーシップって一枚岩ではなくて、多種多様なものだと思っています。別に物語に出てくるリーダーみたいな人じゃなくても、リーダーになることを受け入れた時点でリーダーシップの資格は十分なはずです。

おわりに

輪読会の主催を通じて得た学びをまとめると、何かを主催に必要なのは勢いで、結果はあとからついてくるということです。

もちろん必ずしも結果がついてくるかはわからないけど、人生はやりたいことをやる場所なので、細かい失敗は気に病まずに挑戦してみるのがいいと思ってます。

そして、自分のいまいる場所をより良くしたいと思ったら、やっぱり自分が行動するしかないとも思います。私自身、輪読会の主催という行動を通じて、フィヨルドブートキャンプという居場所がより居心地よくなりました。

自分が楽しくやってるのが伝わったのか、実は今週から受講生の@Paru871さんが主催した新しいRubyの本の輪読会もスタートしています。

ぜひ、ご興味を持った方は、フィヨルドブートキャンプに参加し、輪読会に参加し、そしていつかご自身で輪読会を主催してみてほしいなと思います💪

フィヨルドブートキャンプは主体的にやりたいことがある人を応援してくれる環境なので、勢いでやってみるときっといいことがたくさんあると思います!

Discordで音声チャンネル内のユーザーをランダムで指名するBotを作った

f:id:eatplaynap329:20210818083151p:plain

はじめに

こんにちは。ここ2週間ほど週報をサボってしまったんですが、この間はフィヨルドブートキャンプのプラクティスを一時中断しDiscord Botを作っていました。 先週頭に完成し、自分のサーバーとフィヨルドのサーバーに導入してもらい使えるようになったので、bot作りについて軽くまとめてみようかと思います。

もくじ

どんなbot

Discordの音声チャンネルにミュート解除状態で参加している参加者をランダムで指名するbotです。 コマンド!youで1人が指名できます。!you 4のように引数を渡すと引数分の人数が指名できます。 リポジトリは↓

github.com

コードの中身

discordrbというgemを使ってRubyで書きました。 最初は単純な条件分岐で書いていたんですが、有識者リファクタリングしてもらい、今動かしているコードはガード節で書き換えたものになります。

# frozen_string_literal: true

require 'dotenv/load'
require 'discordrb'

bot = Discordrb::Commands::CommandBot.new token: (ENV['TOKEN']).to_s, prefix: '!'

bot.command(:you) do |event, number|
  channel = event.user.voice_channel
  return event.send_message('ボイスチャンネルに入ってからコマンドを実行してください') if channel.nil?
  return event.send_message('ミュートを解除してください') if channel.users.all?(&:self_muted?)

  number = number&.to_i || 1
  return event.send_message('選択人数は正の整数を入れてください') unless number > 0

  unmuted_users = channel.users.reject(&:self_muted?)
  user_names = unmuted_users.map(&:name)
  chosen_users = user_names.sample(number)

  event.send_message chosen_users.join(", ")
end

bot.run

最初に作るDiscordrb::Commands::CommandBotインスタンスがどういう情報を持ってるかが分かると、その後のコードはドキュメントを熟読しなくてもそんなに苦労せずに書けるかなと思います。 私はこのbotを作りはじめて、ようやくbinding.irbを使ってインスタンスの中身を見ることができるようになってきました…。

なんのために作ったか

毎朝Discord上で輪読会を開催しているのですが、毎回司会1名、ドライバー1名、感想の発表者4人を決めるという作業があります。

bot導入前は、共有のHackMD上の、司会・ドライバー・感想発表を決めるRubyのコードの中に参加者が各々自分の名前を入力してもらい、前回の担当者がターミナルからirbを起動し、コードを実行して決めていました。

具体的に言うと↓を司会、ドライバー、発表者分繰り返す感じ。

irb(main):001:0> %w[hirono yamamori otomo matsunaga makihara].sample
=> "matsunaga"

この決め方には下記のような問題がありました。

  1. 毎回書きこむのが面倒
  2. 絶対誰かが書き忘れる
  3. 前回のコードをコピペするとその場にいない人も当たる
  4. 毎回irbを起動するのが面倒
  5. HackMDの中身がごちゃごちゃする

輪読会が週1くらいの頻度だったら我慢していたのだと思うのですが、平日毎日やっているため、些細なことながらフラストレーションが溜まっていて、なんとかできないかな〜と思ってました。

そんな中、フィヨルドブートキャンプのミートアップにて卒業生のmisosoupさんが、自作サービスでDiscord botを作ったという卒業発表をされているのを聞き、「そうか、Discord上にいる人から選ぶbotを作ればいいのか〜!」と閃き、その翌々日から作り始め大体1週間で完成しました。

大変だったこと

Discord APIの仕様を知ることと、discordrbのドキュメントを読むのがとても大変でした。

さらにdiscordrb人口が少ないため、サンプルコードやStackOverflowでの回答がほとんど見つからなかったのが辛かったです。 あと、スクールのカリキュラム外のことをやっているため、うまく行ってないとき孤独感も強く感じやすいなと思いました。 自分の場合は気持ちが暗くなって何も手につかなくなってしまったため、オンラインカウンセリングを受けたりしてました。受けてすごく気が楽になったので、これから先のプラクティスでも上手に活用していきたいなと思います。

ありがたかったこと

discordrb人口が少なく、抱えている問題を誰に聞けば解決できるのか分からないのが辛かった中、色んな方が手助けしてくれたのがありがたかったです。 特に、Botを公開したその日に、yana_gi (id:yana_g) さんが引数で人数を指定できる機能追加のPR、メンターのu1tnkさんがコード全体のリファクタリングのPRを送ってくださったのがすごく嬉しかったです。

正解は自分で見つけていくしかないんだけど、相手がdiscordrbの専門家かどうかとか、bot作りの経験があるかとか、100%の答えを持っているかどうかに関わらず色んな人に相談してよかったなって思います。

何より毎朝の輪読会で使ってもらえてるのが嬉しく、bot導入前よりずっと便利になったと自分でも思うので、苦労した甲斐があったな〜と思ってます。

これからのこと

このbotの機能拡張案はいろいろ出ていて、人から言われたものをざっとあげると↓のような感じです。

  • 指名対象からbotを除外したい
  • ただの名前の出力ではなく@でメンションされるようにしたい
  • Discordの登録名ではなくニックネームで表示したい
  • helpコマンドが欲しい
  • 何回も指名したいとき複数回コマンドを打つのが面倒なので絵文字の反応とかでコマンドが実行されるようにしたい

現状なくてめちゃくちゃ困ってる機能というわけではないので、また情熱が戻ってきたらやろうかな〜って感じです。

あとdiscord.pyは国内外で活発な活動をしているようなので、次作りたいbotができたら、Pythonを勉強してdiscord.pyで書いてもいいかなと思ってます。

最後に、Bot作りに関わってくださった方、興味を持ってくださった方、本当にありがとうございました!!

Bot作りで参考にしたURL一覧

公式情報

Discord bot作りの大体の流れを把握

GitHub経由でHerokuにデプロイする

秘密情報を環境変数に入れる

コマンドで動くbotにする

Heroku上で動かす

作りたいbotのイメージ作りに参考にした例