<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://mssp160.netlify.app/feed.xml" rel="self" type="application/atom+xml" /><link href="https://mssp160.netlify.app/" rel="alternate" type="text/html" /><updated>2026-03-26T11:45:05+09:00</updated><id>https://mssp160.netlify.app/feed.xml</id><title type="html">MSSP</title><subtitle>misosoupによるブログです。</subtitle><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><entry><title type="html">デモ</title><link href="https://mssp160.netlify.app/2026-03/d2/" rel="alternate" type="text/html" title="デモ" /><published>2026-03-26T00:00:00+09:00</published><updated>2026-03-26T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2026-03/d2</id><content type="html" xml:base="https://mssp160.netlify.app/2026-03/d2/"><![CDATA[<p>毎週国会議事堂前に行かなきゃいけなくて疲れるんよ。
<!--more--></p>

<p>昨日も国会議事堂前の反戦デモに行ってきた。
まだめまいも治ってないって言った側から、それでも行かなきゃいけないクソ情勢になってきてしまったのでしょうがない。
職場では誰も話題にしてなくて、あたかも世界は平和であるようなのだが、私もその世界の住人のふりをしながら、昼休みにせっせとカッパとペンライトを買って、コンビニ印刷でプラカードを作る。
退勤して電車に乗って駅に着くと、前を歩いていた人たちがスッと鞄からカッパを取り出して身に纏い出す。
階段を上がったら人が溢れ、力強い声が響き渡って、そこに現実がある。
一人じゃない、と思う。</p>

<p>昨日は二万人を超える人があの場にいた。
あの場所以外にも、日本中の都道府県で集まる人がいた。
デモに意味はあるのか？と思う人がいると思うけど、私はめちゃくちゃ意味があると思っている。
今回助けられた憲法９条は、まさにデモによって守られてきた。</p>

<p>私は人混みの中に突入してしまうとめまいがひどくなってパニックになるので、すごく端っこの方でじっと立っている。
あまり大きな声も出さない。
でもここに人がいるということに意味があるから、それでいいんだよ。
どうかな。家で悶々としているなら、ちょっと寄ってのぞいて行ってみては？
戦争反対の意思を示すことは誰でも気軽にやっていいことだ。</p>

<hr />

<p>仕事という平和世界では、みんなAIの活用法の話題で持ちきりのようだ。
取り残されないように、早く使いこなせるようになければならない。
でもその技術は、今まさに効率的に殺していい人間を選別することに使われている。
私の元の専門に寄せると、ものすごい電力を消費して環境負荷を高めてもいる。
AI技術は他にもたくさんの社会問題と関わっている。
結局社会は技術によって良くなってきたじゃん？大丈夫っしょ？という考えには私は到底賛同できない。
AIを使うなといいたいわけではない。
そういう問題を認識して、時には声を上げながら使っていくのが大人としての、または技術に関わるものの端くれとしての責任なのかなと思っている。</p>

<p>とはいえ、私はあんまりエンジニアという仕事に対して人生とか自己実現とか特に何も賭けてないので、少し視野が広く持てているのかもしれない。
変な人としてたまに変な視点を差し込んでいけたらいいなと思っている。
もしかしたら近くに同じようなことを思ってる人がいて、私のような存在に少し安心してくれるかもしれないしね。</p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="近況" /><summary type="html"><![CDATA[毎週国会議事堂前に行かなきゃいけなくて疲れるんよ。]]></summary></entry><entry><title type="html">近況だよ</title><link href="https://mssp160.netlify.app/2026-03/d1/" rel="alternate" type="text/html" title="近況だよ" /><published>2026-03-19T00:00:00+09:00</published><updated>2026-03-19T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2026-03/d1</id><content type="html" xml:base="https://mssp160.netlify.app/2026-03/d1/"><![CDATA[<p>しばらく更新していなかった。
<!--more--></p>

<p>最後に更新した記事には、めっちゃ具合が悪い旨書いてある。
めまいがひどくて外も歩けないということなんだけど、これは治ったのかというと、あんまり治ってない。
ただ、発生した当初よりはだいぶ良くなってはいる。
ずっと心療内科の薬を使っていたんだけど、最近は漢方を飲んでいる。
普通の病院でもらうサラサラしたエキス剤ではなくて、原料を切り刻んで長時間煮出して飲むやつ。
これを飲むようになってやっと少し安定するようになった。
でも今もお酒は飲まないようにしてるし、人や物が多いところと暑いところはめまいが出やすい。
体力も落ちてるし疲れやすいので夜の外出はほとんどしない。
逆に昼はよく歩くようにしている。
しかし、外出しても体調が不安定なので付き合わせるのも悪くて友人と出かけたりすることはなくなった。</p>

<p>最近は仕事に支障が出ることはほとんどなくなった。
時短勤務とかも何度も考えたんだけど、結局やらなかった。
会社に何度か相談したんだけど、色々説明されて、どうする？って選択を委ねられるともう相談するのが精一杯だったので、その上で判断する気力がなくて、結局そのままでいいです。ってことで来てしまった感じがある。
話してる分にはペラペラ話すので、あまり調子が悪くは見えないかもしれないけど、そこには表出しない苦しさがあるのだということは、そのような状態になったことがない人には理解が難しいかもしれない。
本当に頭が動かなくて、報酬分の仕事ができていないということの不安を相談したつもりだったけれど、実力がないことのコンプレックスとして受け取られてしまったな…ということもあった。
難しいね。(ちなみに私はエンジニアという職業に関してはそのようなコンプレックスを抱くことはほぼない。自分がすごくできるというわけでは全くなくて、ただ単に仕事に対する姿勢の問題だと思う)</p>

<p>たまにずっと治らないことにすごく悲しくなったりする。
薬はものすごく高い。
本当はやりたい習い事や行きたい場所があるけどまだ難しい。
もしかしたら一生付き合うしかないかもしれない。
ホイホイ旅行に行っている人を見ると悔しくてたまらなくなったりもする。
でも仕方がないからやれる範囲でやっていくしかないなーって感じ。
もし同じような人を見かけたら自分の経験では理解の及ばない苦しさの存在を少し想像してみてくれるとうれしい。
私もそのようにしたい。</p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="近況" /><summary type="html"><![CDATA[しばらく更新していなかった。]]></summary></entry><entry><title type="html">ずっと具合が悪い</title><link href="https://mssp160.netlify.app/2023-11/d1/" rel="alternate" type="text/html" title="ずっと具合が悪い" /><published>2023-11-24T00:00:00+09:00</published><updated>2023-11-24T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2023-11/d1</id><content type="html" xml:base="https://mssp160.netlify.app/2023-11/d1/"><![CDATA[<p>今年の冬は体調を崩すまいとしていたが、夏に盛大に体調を崩した。
<!--more--></p>

<p>毎年冬に半年ほど具合が悪くなるというのがもう数年続いていた。
今年こそは少しはマシにしたいと思い、比較的体調が安定する夏の間に色々できることはやろうと思っていた。近くのジムにも通い始め、電車に乗るのではなく自転車で移動するようにしたりして体を動かすようにしていた。</p>

<p>生理による体調の不安定も軽減しておきたかった。
一時期血栓ができやすくなり普通の低容量ピルが使えなくなっていたが、血栓リスクのないピルもあるようだったので試してみようとした。
多分これがいけなかったのだと思う。
薬が合わずに二週間ほどで飲むのをやめた。
やめてから程なくしてだるさが続くようになった。
この時はあまり気がついていなかったが外に出るとめまいがして気分が悪くなるようになっていた。</p>

<p>また精神的なものかと思い病院にも行った。
気がついたら全く仕事に集中できなくなっており、数日間休みをとった。
寝る時に急に気分が悪くなり飛び起きる日が続いた。
怖くなって実家に連絡をとりしばらくそちらで寝泊まりすることにした。
周りに人がいると少し安心し、数日の休みでとりあえず仕事に復帰した。
少し体調が良くなったみたいだねと言われることもあったが、特に良くなっていたわけではなかった。</p>

<p>ずっとめまいがした。
この辺でおそらく自律神経がいかれたのだと思ったので、この目眩は脳貧血によるものでありそうということがわかった。
外を歩くことができない、風呂で体を温めてもだめ、満腹になるほど食べてはダメ、寝ようとすると気持ち悪くなることもある、たいていは座っておとなしくしていれば大丈夫だったがひどい時はただ座って話しているだけでも気分が悪かった。
元々ひどかったが輪をかけて首や肩のこりがひどかった。</p>

<p>いろいろな病院に行って検査をしたけど結局どこも悪くなかった。
何をしたら良くなるのかもよくわからなかった。
それでも暑さが和らぐにつれて少しずつよくなり、毎日少しずつ散歩する距離を伸ばした。
仕事は何度も長期で休もうか時短勤務のような形にしようか迷ったが結局なぁなぁになったまま続けていた。
自分がいつもよりもパフォーマンスが出ていないこともわかっていたし、周りにフォローしてもらうのも申し訳ない気持ちがどんどん募っていったが、この状態を正確に他人に共有することはなかなか難しいことのようだった。</p>

<p>初めに体調を崩したのは8月。11月初めにはだいぶよくなって自分のマンションに帰ってきていたが、次の週に急に寒くなりまた体調が逆戻りした。
今このへん。
という感じです。</p>

<p>自律神経のバランスを崩したこと、ありますか。
外を少し歩くだけで気持ちが悪くなってどこにもいけないこと、それがいつまで続くかわからないことにはなかなかに絶望しました。
ただ、何年か前に妹が同じような症状になっており、2年ほどかけてほぼ完治したと聞いたので少しだけ前向きになれました。
今は調子が良い時は電車にも乗れるし、商業施設に買い物に行くこともできるが、でもあまり長時間は厳しいし、調子が悪い時は特に夕方や夜に何もしていなくても気持ちが悪くて不安が強くなる、そういう波をくり返しています。
症状はある程度薬で抑えることはできますが、あまり何度も飲んでいい薬ではない。
お酒も飲めないし、飲み会やカンファレンスなど全くいけないし、勉強どころではなく、本も読んでない。何も話すことはない。少し長く外を歩けたら、それがうれしい。</p>

<p>仕事は続けていくしかないから、できるだけ見放されないようにしたい。
ご迷惑をかけている皆様、申し訳ありません。</p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="近況" /><summary type="html"><![CDATA[今年の冬は体調を崩すまいとしていたが、夏に盛大に体調を崩した。]]></summary></entry><entry><title type="html">長い冬の終わり</title><link href="https://mssp160.netlify.app/2023-04/d1/" rel="alternate" type="text/html" title="長い冬の終わり" /><published>2023-04-05T00:00:00+09:00</published><updated>2023-04-05T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2023-04/d1</id><content type="html" xml:base="https://mssp160.netlify.app/2023-04/d1/"><![CDATA[<p>やっと春になりましたね。この二ヶ月間私は毎日をやり過ごすことに必死になっていました。
<!--more--></p>

<p>一月の試験が終わって間も無く、大学が春休みの間は何をしようかなと考えていた矢先に、また動悸がはじまりました。引っ越しで環境を変えた甲斐なく、今年も冬季うつのような状態になってしまったということです。</p>

<p>第一には気持ちが不安定になるのですが、それに加えて熱もないのに寒気がするほど体が冷えてだるくて動けなくなったり、体が冷えるのですぐ膀胱炎になったり、自炊をするのも億劫な上、食欲は増すので食費が激増したりします。</p>

<p>仕方がないので少し落ち着いた時にまた病院を探して、行って、もらった薬を飲んで出勤（概念）し、仕事してました。仕事はなんとかできるけど、それ以外にできることはほぼありません。当然勉強することもままならない、というか、何かしなければと思って悪化することを一番避けたいので、例年のごとく私は全てを放棄しました。何もしなくても百点。</p>

<p>しかし、私は気になっていたことがありました。前期の授業で出てきた「エニグマ」のことです。第二次世界大戦でドイツが用いた最強の暗号…戦後何十年も秘匿されたその暗号を打ち破った事実…それに関わった数学者の運命…。教科書にはサラッと紹介されていただけだけど、こんなのあまりにも気になりすぎますよね。また、今期の授業ではRSA暗号の計算方法まで知って新しい驚きがあったので、大学の休み中は何かしら暗号について調べたいなと思っていました。</p>

<p>初めは技術書も読もうと思っていたのですが、無理だったので映画から入って少しずつ本を読みました。</p>

<ul>
  <li><a href="http://imitationgame.gaga.ne.jp/">イミテーション・ゲーム/エニグマと天才数学者の秘密</a>
    <ul>
      <li>脚色は多いのだと思いますが、すごく良くできていて楽しめました。</li>
      <li>普段あまり映画を見ないので、同性愛・発達障害・女性差別の問題などを意識的にかつ上手く組み込まれていて感心してしまいました。</li>
    </ul>
  </li>
  <li><a href="https://www.keisoshobo.co.jp/book/b190613.html">エニグマ アラン・チューリング伝</a>
    <ul>
      <li>チューリングのパーソナリティについて興味を持ったので映画の原作でもある本作を読みました。といいつつ、下世話な人間なので本当は初恋の話もっと聞かせて？って思って読みました。</li>
      <li>めちゃくちゃが長くて読みにくいので上巻で一回ギブアップしましたが、多分彼の人生のことを知りたいのならこの本が一番詳しいのだと思います。</li>
    </ul>
  </li>
  <li><a href="https://www.nttpub.co.jp/search/books/detail/100002290">チューリング 情報時代のパイオニア</a>
    <ul>
      <li>上記の方を上巻でギブアップしてしまったので、こちらも読みました。コンパクトにまとまっていて読みやすかった。</li>
    </ul>
  </li>
  <li><a href="https://www.shinchosha.co.jp/book/215972/">暗号解読</a>
    <ul>
      <li>こんなに面白い本があるのになんで誰も教えてくれなかったんですか？</li>
      <li>RSA暗号成立の歴史についても書かれていて、RSA暗号使っている人（≒全人類）読むべきでは？と思うくらい楽しめました。</li>
      <li>1章の女王メアリーの暗号についてはちょうどつい最近<a href="https://www.gizmodo.jp/2023/02/coded-letters-mary-queen-scots-decrypted.html">ニュース</a>が出ていてこれも面白かったです。</li>
    </ul>
  </li>
</ul>

<p>見ての通り、二ヶ月の間、私はチューリングの追っかけを楽しんでいたというわけです。読書を通して、いつかブレッチリー・パークへも行ってみたいと思うようになりました。また、エニグマについての本にもチラチラと出てきますが、暗号の解読にはたくさんの女性たちも関わっていた史実があり、<a href="https://www.msz.co.jp/book/detail/09019/">コード・ガールズ 日独の暗号を解き明かした女性たち</a>も読みたいと思っています。</p>

<p>読書自体も楽しめたのですが、大学の授業をきっかけに興味を広げて楽しめている、ということ自体にも嬉しさを感じました。昔大学生だった頃は学校のお勉強の延長線だと思い込んでいた節があって、あまりこういう楽しみ方をしなかったような記憶があります。大人になってから大学行くの、良いですね。</p>

<p>また、チューリングのことを調べていたら<a href="https://www.youtube.com/watch?v=NCdI_HZd6xQ&amp;list=PL0GEQcnC7e3b_IK_88YnaJdHbA1Meyfbv">ゆるコンピューター科学ラジオ</a>なるyoutubeにたどり着きました。今年のうつ期間は、このチャンネルとその姉妹番組である<a href="https://www.youtube.com/@yurugengo">ゆる言語学ラジオ</a>に救われたと言っても過言です。何もできない多くの時間はこれらのチャンネルを聴きながらマイクラして過ごしました。普段は音声コンテンツが好きで、youtubeは全く見ないので、音声だけでも聴けるようにしてくださっていたのが幸いでした。いい時代だ。</p>

<p>しんどいうつ期間でしたが、楽しみを見つけられてよかったです。しかしそろそろいい加減Webの勉強しないといけないのでまたぼちぼちやっていこうかなと思っています。</p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="近況" /><summary type="html"><![CDATA[やっと春になりましたね。この二ヶ月間私は毎日をやり過ごすことに必死になっていました。]]></summary></entry><entry><title type="html">引っ越しました</title><link href="https://mssp160.netlify.app/2023-01/d1/" rel="alternate" type="text/html" title="引っ越しました" /><published>2023-01-03T00:00:00+09:00</published><updated>2023-01-03T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2023-01/d1</id><content type="html" xml:base="https://mssp160.netlify.app/2023-01/d1/"><![CDATA[<p>関東圏内某所に引っ越しました。
<!--more--></p>

<p>何回書いても自分のブログを読み返すとなんでこんなテンションで書いたんだろう…って気持ち悪くなります。
何か人に見られるということで必要以上に気張ってしまうのかもしれないですね。
素直でポジティブでエモくないといけない、という空気を勝手に過剰に感じて気にしてしまうのかもしれないです。
人は別にそうでなくても生きていけます。淡々と書いていきたい。</p>

<p>先月に四国某所から関東某所に引っ越しをしました。
四国には特に縁もゆかりもなく、家賃が安いので前職を辞めてからもなんとなく住み続けていたのですが、対面で人と話す機会が激減して一年以上。精神的にも調子が良くない状態が続き、友人たちに相談したのをきっかけに、関東に戻ることにしました。
親しい人たちが偶然近くに住んでいたのでその間くらいに住むことにしました。
興味がなかった町ですが、私の好きな商店街が適度に栄えていて意外に住み心地は良さそうです。
今のところ楽しくやっています。</p>

<p>精神的に調子が良くないと言えば、エンジニア関連で持っていたTwitterアカウントも消してしまいました。
色々と試行錯誤？してみたのですが、もともとプライベートで多用していたツールなので、仕事とプライベートが地続きになってしまうのがどうしてもストレスになり、やめることにしました。
連絡用に残しておいてもいいかなと思ったのですが、アカウントがあること自体がダメみたいです。
特に私に用がある人もあまりいないと思いますが、連絡手段はメールかDiscordなどでお願いします。
最近コミュニティにあまり行かなくなってしまったのは、そういうのとは別で、完全に朝型になり夜集中力を保つのがつらくなってきたからです。
ちょっとバランス考えたいです。</p>

<p>去年は年明けから初めて案件に入り、一年間バタバタしながらなんとかやってきた感じなんですけども、個人的にはあまり何かがすごくできるようになったな、という感覚がなくて、今年はもっと良いコードをかけるようになっていきたいなぁと思っています。
でもそのために具体的にどうしていったらいいか、というのは人に相談しても明確な答えが返ってくることが少なく…
手始めに11月にRuby Goldを取得してみました。これは本当に勉強してよかったなと思っています。
試験があるとある程度まとまった知識を無理やり頭に入れることになるので、手始めにっていうのも間違ってなかった気がします。
今後も自分なりに考えて、体力ないのでちょっとずつですが、RubyやRailsに関する知識を得る時間をとっていきたいです。
これは特にRubyやRailsのコードの書き方を学びたい、というか、RubyやRailsでコードの書き方を学びたいという感じなのかなと思っています。
幸にも今、複数の言語に同時に触れる環境にいるので、言語特有の良い書き方だ、と思っていたことは別にそうでないということも勉強させてもらっているのかもしれないなと思います。</p>

<p>去年は後半に、思ったよりJavaScript方面でたくさんキャッチアップしなければいけないことがあって、割とそっちに時間を割いていました。
弊社のエンジニアが新しいことをやるときはとりあえず５冊とか本を買って全部読む、みたいなことを言っていたので、そのとき私も、どの本がいいとかもう考えるのめんどくさいから全部読めばいいや、と思って目についたもの全部買って必要そうなところだけ全部ざっと目を通す、ということをしました。結局、知識というものは何度も違う方向から同じ知識を入れることで定着していくというものだと思っているので、あぁこれでいいんだなと思いました。
放送大学でも別々の授業で何度も何度も同じ領域についての話題が繰り返し出てくるようになっているので、自然とそういうことをやっているんだなと思います。</p>

<p>まずは年明け1月に大学の試験があります。器用でないのでほぼ一ヶ月くらいは引越しのことしか考えておらず、何もしていなかったので、間に合うか心配です。せっかく自分でお金を払っているんだからもっとじっくり向き合いたいと思うのに結局こんなことになってしまう…。
でも引っ越したことによって今年はより良い環境で仕事も勉強も進めていけるのだろうなと期待しています。
今年もよろしくお願いします。</p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="近況" /><summary type="html"><![CDATA[関東圏内某所に引っ越しました。]]></summary></entry><entry><title type="html">放送大学に入学しました</title><link href="https://mssp160.netlify.app/2022-08/d1/" rel="alternate" type="text/html" title="放送大学に入学しました" /><published>2022-08-02T00:00:00+09:00</published><updated>2022-08-02T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2022-08/d1</id><content type="html" xml:base="https://mssp160.netlify.app/2022-08/d1/"><![CDATA[<p>まだ手続き中だけど。来期から放送大学情報コースに入学することにしました。
<!--more--></p>

<p>前期から科目履修生としてお試しで授業を取っていたりしてたんだけど、割と自分にあってるなと思ったので。</p>

<h2 id="なんで放送大学なのか">なんで放送大学なのか。</h2>

<p>去年の10月、晴れてエンジニアとして就職できたので、これから長くこの仕事を続けていく上でプログラムを書くっていうだけじゃなくて広く基礎的な知識を身につけたいなっていうのは思っていまして。でも一人で本探して読んで…っていうのは大変じゃないですか。基本情報とかもなんか浅く広くで面白くないから寝ちゃうし。だからなんかいい方法ないかなって探してました。</p>

<p>それと、私は課題があって手を動かしたり問題あって解いたりするほうが頭に入るので、本読むとかだけだと嫌になって勉強習慣が絶えるなって思って。本当はまだ基本的な知識よりプログラムの書き方とか勉強したほうがいい段階だと思うんだけど、とにかく勉強やめちゃうほうが怖い。</p>

<p>ということで色々探してたんですが、放送大学は別に今期で何単位取らなきゃいけないとか、取らないと留年とかないので自分のペースで好きな科目を取れるのがいいんですよ。初めは取る科目を少なめにして仕事に慣れてきたら増やすとか、今期は今やってる仕事に関係のありそうな科目をとるとか、調整できるんでこれはいいなーと思って。</p>

<p>あと、私は普通に大学がすきなんですね、多分。取れるなら学位もほしいし。情報コース以外の科目も面白そうで目移りしちゃう。アカデミア苦手って人もいそうだけど、体系的に学べてクオリティも高いし、何勉強したらいいかわからなくてあれこれ手を出すより普通にいい選択だと思うんですよ。スクール否定することないじゃんってのと同じで。</p>

<p>注意なのは放送大学でとれるのはどのコースでも教養の学士なんですよね。でも、学位授与機構っていうのがあって、必要単位あれば申請すると規定の学位をくれるシステムがあり、それを使ってがんばれば情報工学の学位も取得できそうです。詳しくは参考リンクの記事を。そこまで目指したいなー。</p>

<h2 id="実際どう">実際どう？</h2>

<p>前期は科目履修生（半年だけ在籍できる）のお試しで、</p>
<ul>
  <li>情報学へのとびら</li>
  <li>情報ネットワーク</li>
  <li>初歩からの数学</li>
  <li>演習初歩からの数学</li>
</ul>

<p>の４つ取ってみました。や、４つっていっても結構ボリュームあった。就職したばっかだし。ちょっとナメてた。</p>

<p>情報学へのとびらは情報学とはなんぞやなオムニバス授業、情報ネットワークはほぼマスタリングTCP/IP、初歩からの数学は高校数学ざっくり復習って感じです。普通に見いやすいし、内容も充実していて、いっこいっこ授業を消化していくっていうのは結構勉強のペースを掴みやすくてよかったです（深夜2時までレポート書いてたのに…？）。</p>

<p>情報ネットワークの授業はマスタリングTCP/IPより基本的なところをかなり丁寧にやってくれていたので、その後復習として本を読んだけど読みやすかった。多分いきなり読んでたら途中でやめてたと思いますね。よかったね！久しぶりに一冊通して読めて！</p>

<p>来期は計算の科学と手引き、Webのしくみと応用、情報セキュリティ概論の三科目を受講しようかなーと思っております。今の所仕事にできるだけ近そうなところの科目でって感じで選んでるんですけど、データサイエンスとか自然言語処理とかの授業も充実してるみたいなので、ゆくゆくはそういう科目を取って知識をつけたいんですよー。職場でそういうお仕事をしている人もいるので。話わかるようになりたい。あと統計。私、生態学やってた割に統計をあんまりやってなくて恥ずかしいのでこの期にちゃんとできるようになりたいんです。今だからこそあの時より興味を持ってやれるってこともあるよね。分子系統学を理解してえな。</p>

<h2 id="参考リンク">参考リンク</h2>

<p>参考にさせてもらった記事！</p>

<p><a href="https://wbspry.hatenablog.com/entry/2021/02/24/111912">文系パパエンジニアが放送大学等でコンピュータサイエンス・数学を学んで理系学士を取りに行く話</a><br />
<a href="https://note.com/lumpsucker/n/n2d3992a93feb">文系出身の若手SIer社員が放送大学で情報学を勉強してレベル上げした話</a></p>

<p>授業の内容！</p>

<p><a href="https://note.com/lumpsucker/n/n2a9ee74956dc">放送大学マイルストーン(‘22)</a><br />
<a href="https://www.ouj.ac.jp/kamoku/kyouyou/C/kiban_kiban/">放送大学シラバス</a></p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="放送大学" /><summary type="html"><![CDATA[まだ手続き中だけど。来期から放送大学情報コースに入学することにしました。]]></summary></entry><entry><title type="html">DiscordBotFの修正：ユーザー情報を自動更新する</title><link href="https://mssp160.netlify.app/2021-08/d1/" rel="alternate" type="text/html" title="DiscordBotFの修正：ユーザー情報を自動更新する" /><published>2021-08-13T00:00:00+09:00</published><updated>2021-08-13T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2021-08/d1</id><content type="html" xml:base="https://mssp160.netlify.app/2021-08/d1/"><![CDATA[<p>先日卒業課題でつくったDiscordの連携サービス、「Discord Bot F」のフィヨルドブートキャンプ のサーバーでの運用が開始されました。やっぱり実際に利用してくださると嬉しいですね。
<!--more--></p>

<p>他の受講生の方もBot作りに挑戦してみてくれる方が出てきて、良い流れのような気がしています。プラクティスだけだとどうしてもずっと勉強という感じで実際自分が使いたいものを作って楽しむ機会ってあまりなくなってしまうのですが、Discord botは実際にサーバーのメンバーに使ってもらえて達成感もあるしちょうど良いのかもしれないですね。</p>

<p>ただ、やっぱりRubyでDiscord APIを扱う情報がかなり少ないのが大変なところなのかなと思いました。私もはじめの理解に結構時間かかりましたし、あまり時間に余裕がない方には勧めにくいかもしれません。お手軽感はないかもしれないですけど、何もわからないところから一生懸命ドキュメントを読んだりしたことは、すごく良い勉強になったなーと私は思っています。</p>

<p>さて、私の作ったサービスも早速ミスや改善した方がよいことが出てくるもので、最近その修正をしたのでそれも記事に残しておこうと思います。</p>

<h2 id="discordで変更したユーザー情報を反映させる">Discordで変更したユーザー情報を反映させる</h2>

<p>これ、必要だろうなと思いつつ実装してなくて（え）、やっぱり不具合出たので即修正しました。すいません。</p>

<p>Discordのサーバーから取得しているユーザー情報は今のところ、ユーザーネーム、#以降の４桁の数字（discriminator）、アイコン画像のurl、なんですけども、これらをDsicord上で変更してもサービス上ではそれが反映されるようになっていなかったために画像が非表示になってしまったりしました。</p>

<p>メンバー情報が変更された時のイベントを取得できるので、そのイベントが発生した時にこれらの情報が更新されていたら変更する、というコードを追加しました。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">DiscordBot</span>
  <span class="k">def</span> <span class="nf">initialize</span>
    <span class="vi">@bot</span> <span class="o">=</span> <span class="no">Discordrb</span><span class="o">::</span><span class="no">Bot</span><span class="p">.</span><span class="nf">new</span> <span class="ss">token: </span><span class="no">ENV</span><span class="p">[</span><span class="s1">'DISCORD_BOT_TOKEN'</span><span class="p">]</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">start</span>
    <span class="n">settings</span>
    <span class="vi">@bot</span><span class="p">.</span><span class="nf">run</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">settings</span>
    <span class="c1"># banや脱退などサーバーからメンバーがいなくなったらそのユーザーを消去</span>
    <span class="vi">@bot</span><span class="p">.</span><span class="nf">member_leave</span> <span class="k">do</span> <span class="o">|</span><span class="n">event</span><span class="o">|</span>
      <span class="n">user_id</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">user</span><span class="p">.</span><span class="nf">id</span>
      <span class="n">user</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">find_by</span><span class="p">(</span><span class="ss">uid: </span><span class="n">user_id</span><span class="p">)</span>
      <span class="n">user</span><span class="o">&amp;</span><span class="p">.</span><span class="nf">destroy</span>
    <span class="k">end</span>

    <span class="c1"># メンバーのusername, discriminator, avatarの更新を反映する</span>
    <span class="vi">@bot</span><span class="p">.</span><span class="nf">member_update</span> <span class="k">do</span> <span class="o">|</span><span class="n">event</span><span class="o">|</span>
      <span class="n">uid</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">user</span><span class="p">.</span><span class="nf">id</span>
      <span class="n">updated_member</span> <span class="o">=</span> <span class="no">JSON</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="no">Discordrb</span><span class="o">::</span><span class="no">API</span><span class="o">::</span><span class="no">User</span><span class="p">.</span><span class="nf">resolve</span><span class="p">(</span><span class="s2">"Bot </span><span class="si">#{</span><span class="no">ENV</span><span class="p">[</span><span class="s1">'DISCORD_BOT_TOKEN'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="n">uid</span><span class="p">))</span>

      <span class="nb">name</span> <span class="o">=</span> <span class="n">updated_member</span><span class="p">[</span><span class="s1">'username'</span><span class="p">]</span>
      <span class="n">discriminator</span> <span class="o">=</span> <span class="n">updated_member</span><span class="p">[</span><span class="s1">'discriminator'</span><span class="p">]</span>
      <span class="n">avatar</span> <span class="o">=</span> <span class="n">avatar_url</span><span class="p">(</span><span class="n">uid</span><span class="p">,</span> <span class="n">updated_member</span><span class="p">[</span><span class="s1">'avatar'</span><span class="p">],</span> <span class="n">discriminator</span><span class="p">)</span>

      <span class="n">user</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">find_by</span><span class="p">(</span><span class="ss">uid: </span><span class="n">uid</span><span class="p">)</span>
      <span class="k">if</span> <span class="n">user</span>
        <span class="n">user</span><span class="p">.</span><span class="nf">update!</span><span class="p">(</span><span class="ss">name: </span><span class="nb">name</span><span class="p">)</span> <span class="k">if</span> <span class="n">user</span><span class="p">.</span><span class="nf">name</span> <span class="o">!=</span> <span class="nb">name</span>
        <span class="n">user</span><span class="p">.</span><span class="nf">update!</span><span class="p">(</span><span class="ss">avatar: </span><span class="n">avatar</span><span class="p">)</span> <span class="k">if</span> <span class="n">user</span><span class="p">.</span><span class="nf">avatar</span> <span class="o">!=</span> <span class="n">avatar</span>
        <span class="n">user</span><span class="p">.</span><span class="nf">update!</span><span class="p">(</span><span class="ss">discriminator: </span><span class="n">discriminator</span><span class="p">)</span> <span class="k">if</span> <span class="n">user</span><span class="p">.</span><span class="nf">discriminator</span> <span class="o">!=</span> <span class="n">discriminator</span>
      <span class="k">end</span>
    <span class="k">end</span>
  <span class="k">end</span>

  <span class="kp">private</span>

  <span class="k">def</span> <span class="nf">avatar_url</span><span class="p">(</span><span class="n">uid</span><span class="p">,</span> <span class="n">avatar_id</span><span class="p">,</span> <span class="n">discriminator</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">avatar_id</span>
      <span class="no">Discordrb</span><span class="o">::</span><span class="no">API</span><span class="o">::</span><span class="no">User</span><span class="p">.</span><span class="nf">avatar_url</span><span class="p">(</span><span class="n">uid</span><span class="p">,</span> <span class="n">avatar_id</span><span class="p">)</span>
    <span class="k">else</span>
      <span class="no">Discordrb</span><span class="o">::</span><span class="no">API</span><span class="o">::</span><span class="no">User</span><span class="p">.</span><span class="nf">default_avatar</span><span class="p">(</span><span class="n">discriminator</span><span class="p">)</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p>ついでにクラスの構成もちょっと変えてます。<code class="language-plaintext highlighter-rouge">member_update</code>でメンバー情報の変更イベントを取得できるんですけど、eventに入ってくるユーザー情報は変更前のものだったので、そこで取得したユーザーIDからもう一度ユーザー情報を取得して、変更があったものを更新するようにしてます。</p>

<p>ユーザーアイコンの情報（avatar）はidだけが取れるのでそこから<code class="language-plaintext highlighter-rouge">Discordrb::API::User.avatar_url(uid, avatar_id)</code>でurlを作っています。また、Discord上のアイコン画像が未設定、つまりavatarがnilの場合はDiscordのデフォルト画像urlが取得できるメソッドがあったのでそれでurlを作るようにしました。discriminatorで色が決まってたんですね。</p>

<p><code class="language-plaintext highlighter-rouge">member_update</code>って<a href="https://discord.com/developers/docs/topics/gateway#guild-member-update">ドキュメント</a>に<code class="language-plaintext highlighter-rouge">Sent when a guild member is updated. This will also fire when the user object of a guild member changes.</code>とあるけど、どの情報の更新まで入るのかなぁ。</p>

<h2 id="discordでアイコン画像を未設定の場合の修正">Discordでアイコン画像を未設定の場合の修正</h2>

<p>上の修正をしててDiscordのデフォルトアイコンurl、取れるんじゃんって気が付いたんですね。私はDiscordのアイコンが未設定の場合は用意したデフォルト画像が表示されるように書いていました。ですが、それも<a href="https://github.com/adaoraul/omniauth-discord">omniauth-discord</a>の挙動をちゃんと確認していなくて、思うような挙動にならないコードになっていたので修正しました。</p>

<p>元々、アイコン画像のurlは<code class="language-plaintext highlighter-rouge">avatar = auth_hash[:info][:image]</code>で取得していました。この<code class="language-plaintext highlighter-rouge">image</code>がアイコン画像が未設定だったらnilになると思っていたのですが、無効なurlができるような仕様になっていました。</p>

<p>そこで、<code class="language-plaintext highlighter-rouge">avatar = auth_hash[:extra][:raw_info][:avatar]</code>でavatarのidを取得して先ほどのようにurlを作るようにしました（以下のコードの部分）。こちらだとアイコン画像が未登録の時はnilが入ってくるのでうまくいきます。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">def</span> <span class="nf">avatar_url</span><span class="p">(</span><span class="n">uid</span><span class="p">,</span> <span class="n">avatar_id</span><span class="p">,</span> <span class="n">discriminator</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">avatar_id</span>
      <span class="no">Discordrb</span><span class="o">::</span><span class="no">API</span><span class="o">::</span><span class="no">User</span><span class="p">.</span><span class="nf">avatar_url</span><span class="p">(</span><span class="n">uid</span><span class="p">,</span> <span class="n">avatar_id</span><span class="p">)</span>
    <span class="k">else</span>
      <span class="no">Discordrb</span><span class="o">::</span><span class="no">API</span><span class="o">::</span><span class="no">User</span><span class="p">.</span><span class="nf">default_avatar</span><span class="p">(</span><span class="n">discriminator</span><span class="p">)</span>
    <span class="k">end</span>
  <span class="k">end</span>
</code></pre></div></div>

<p>この変更でDiscordのデフォルト画像を利用するようになり、こちらで用意したデフォルト画像を使わなくなったので、環境変数<code class="language-plaintext highlighter-rouge">IMAGE_URL_HOST</code>を設定する必要がなくなりました。</p>

<p>このomniauth-discordの挙動はちょっとおかしいのでは？と思ったら<a href="https://github.com/adaoraul/omniauth-discord/issues/29">issueがたっているようですね</a>。対応はされてないけど…。</p>

<p>今後もなにか不具合や、Discord APIの勘違い等ありましたら報告してくださると嬉しいです。</p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="FJORDBOOTCAMP" /><category term="RAILS" /><category term="DISCORD" /><summary type="html"><![CDATA[先日卒業課題でつくったDiscordの連携サービス、「Discord Bot F」のフィヨルドブートキャンプ のサーバーでの運用が開始されました。やっぱり実際に利用してくださると嬉しいですね。]]></summary></entry><entry><title type="html">RailsとDiscord APIでサーバーのメンバーを紹介してくれるサービスを作りました</title><link href="https://mssp160.netlify.app/2021-07/d1/" rel="alternate" type="text/html" title="RailsとDiscord APIでサーバーのメンバーを紹介してくれるサービスを作りました" /><published>2021-07-13T00:00:00+09:00</published><updated>2021-07-13T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2021-07/d1</id><content type="html" xml:base="https://mssp160.netlify.app/2021-07/d1/"><![CDATA[<p>私は去年の９月からフィヨルドブートキャンプというスクールでプログラミングの勉強をしており、最終課題でDiscord Botを使った連携サービスを作成しました。本記事ではその紹介をしたいと思います。
<!--more--></p>

<h2 id="経緯">経緯</h2>

<p>フィヨルドブートキャンプは現在完全にフルリモートでスクールが運営されおり、メンターや生徒同士のコミュニケーション手段としてDiscordを利用しています。</p>

<p>新しく入ってきてくれる受講生が増えていく中で、オンラインで積極的にコミュニケーションをとっていくきっかけがなかなか掴めないな、という人もいると思います。サーバー内でコミュニケーションのきっかけになるBotがあると良いなという声があったので、最終課題として作ることにしました。</p>

<p>具体的には、サービス上に色々な質問を用意しておいて、サーバーのメンバーに好きな質問に答えてもらい、その回答をBotがDiscordに自動投稿するというようなものです。</p>

<h2 id="構成">構成</h2>
<p>簡単に構成をかくとこんな感じです。githubのリポジトリはこちら↓</p>

<p><a href="https://github.com/misosoup160/discord-bot-f">https://github.com/misosoup160/discord-bot-f</a></p>

<p><img src="/assets/images/discordbotf-1.png" alt="discordbotf" /></p>

<h2 id="主な機能">主な機能</h2>

<h3 id="指定したサーバーのメンバーのみがログインできる">指定したサーバーのメンバーのみがログインできる</h3>
<p>今回はフィヨルドブートキャンプというプログラミングスクールで使うということに特化した方が面白くなっていきそうだなと思ったので、利用者は特定のサーバーに限定するような仕様にして、フィヨルドブートキャンプ専用サービスとして作りました。</p>

<p><img src="/assets/images/discordbotf-login.png" alt="login画面" /></p>

<h3 id="サーバーのメンバーは答えたい質問を選んで回答を入力する">サーバーのメンバーは答えたい質問を選んで回答を入力する</h3>
<p>ユーザーは、SKIPボタンで答えたい質問を選んで、それに対する回答を入力できます。</p>

<p><img src="/assets/images/discordbotf-answer.png" alt="質問に答える画面" /></p>

<h3 id="回答はdiscordの指定したチャンネルに毎日投稿される">回答はDiscordの指定したチャンネルに毎日投稿される</h3>
<p>Botによって毎日指定したチャンネルにランダムに選ばれた回答が投稿されます。
サービスへのリンクとランダムに一つ選ばれた質問が例として同時に送信されます。
チャンネルと一度に送る回答の数は環境変数で指定し、投稿時間はHeroku Schedulerで設定しています。</p>

<p><img src="/assets/images/discordbotf-message.png" alt="メッセージ画面" /></p>

<h3 id="自分の回答と過去に投稿されたメンバーの回答を見れる">自分の回答と過去に投稿されたメンバーの回答を見れる</h3>
<p>過去の回答は、自分以外のものはDiscordに投稿済みのもののみ、自分のものは未投稿も含め確認することができます。未投稿の回答は編集削除ができます。</p>

<p><img src="/assets/images/discordbotf-answerlist.png" alt="回答一覧画面" /></p>

<h3 id="管理者は質問の登録編集削除ができます">管理者は質問の登録・編集・削除ができます</h3>
<p>サーバーの管理人（サーバーを作った人）は、サービスの管理者として登録されます。管理者は、任意のユーザーを管理者にすることができます。また、質問の登録・編集・削除ができます。</p>

<p><img src="/assets/images/discordbotf-questions.png" alt="質問一覧画面" /></p>

<h3 id="サーバーから去ったメンバーは自動的にサービスから削除される">サーバーから去ったメンバーは自動的にサービスから削除される</h3>
<p>退会するなどでDiscord側のサーバーからいなくなった場合は、こちらのサービス側からもそのユーザーが自動削除されるようになっています。</p>

<h2 id="discord-apiについて">Discord APIについて</h2>

<p>DiscordのBotや連携サービスをrubyやrailsで書いてる例が少ない気がしており、今回のサービスを作成するにあたって一番苦労したところでもあるので、Discord APIを利用した部分について少し詳しく書いておこうと思います。まだまだ初学者なので情報あやしいところあったらぜひコメントください。今回はWebhookは利用していないので、そちらの話は省略します。</p>

<h3 id="概要">概要</h3>

<p>Discord APIには大きく分けて二つのレイヤーがあって、一つはHTTPリクエストを送ってレスポンスとしてDiscordサーバーの情報が返ってくるもの（HTTP API）、もう一つは、リアルタイムのイベントに対して反応できるWebSocketベースの接続で、例えばキーワードを含む発言をするとBotが反応してくれたりするような機能の実装に利用できるものです（Gateway API）。</p>

<p>HTTP APIの方でどんな情報が取れるのかはDiscordの<a href="https://discord.com/developers/docs/intro">Developer Potalから見れるドキュメント</a>のResourcesのところ、WebSocketベースのGateway APIでどんなイベントをキャッチできて、どんなオブジェクトが返ってくるのかはTopicsのGatewayのところあたりを見ていくのかなと思います。必要に応じて、Botに権限を持たせないといけないものもあります。</p>

<p>Discord APIにはそれぞれの言語でいい感じに書けるようにしたラッパーが<a href="https://discord.com/developers/docs/topics/community-resources#libraries">各種</a>あります。rubyは<a href="https://github.com/shardlab/discordrb">Discordrb</a>というgemがあるのでそれを使っています。<a href="https://www.rubydoc.info/gems/discordrb/">こちら</a>のドキュメントをDiscordのドキュメントと照らし合わせながら見て書いていきました。</p>

<p>APIを使うにはまずBotを作ってサーバーに招待しないといけないですがここはいろいろなサイトで紹介されていると思うので省略します〜。</p>

<h3 id="実装">実装</h3>

<p>今回Discord関連でやりたかった実装は以下の４つ。</p>

<ol>
  <li>Discord認証でログインする</li>
  <li>ログインするときその人がサーバーのオーナーかどうか知りたい</li>
  <li>ログインするときにサーバー以外の人をログインさせない</li>
  <li>Discordサーバーにメッセージを自動投稿する</li>
  <li>サーバーから去ったユーザーをサービス側からも削除する</li>
</ol>

<p>2〜4はHTTP API、5はGatway APIを利用しています。</p>

<h3 id="ログインするときその人がサーバーのオーナーかどうか知りたい">ログインするときその人がサーバーのオーナーかどうか知りたい</h3>
<ul>
  <li><a href="https://discord.com/developers/docs/resources/guild#get-guild">Discordドキュメント</a><br /></li>
  <li><a href="https://www.rubydoc.info/gems/discordrb/Discordrb/API/Server#resolve-class_method">Discordrbドキュメント</a></li>
</ul>

<p>オーナー（owner）というのはDiscordの用語でサーバーを作った人（管理人）のことです。この人だけとりあえずサービスの管理者としたかったために、ログイン時にオーナーかどうか確認するようにしました。</p>

<p>HTTP APIで取得できるサーバー情報の中に<code class="language-plaintext highlighter-rouge">owner_id</code>という項目があります。これがオーナーのユーザーIDです。Discord認証でログインさせるときに取得できるuidがこれと一致すればその人がオーナー。</p>

<p>DiscordのサーバーはDiscordrbだとserverだけど、Discordのドキュメントだとguild（ギルド）です。たまに用語が違うのでややこしい。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">guild_info</span> <span class="o">=</span> <span class="no">Discordrb</span><span class="o">::</span><span class="no">API</span><span class="o">::</span><span class="no">Server</span><span class="p">.</span><span class="nf">resolve</span><span class="p">(</span><span class="s2">"Bot </span><span class="si">#{</span><span class="no">ENV</span><span class="p">[</span><span class="s1">'DISCORD_BOT_TOKEN'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="no">ENV</span><span class="p">[</span><span class="s1">'DISCORD_SERVER_ID'</span><span class="p">])</span>
<span class="n">owner_id</span> <span class="o">=</span> <span class="no">JSON</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="n">guild_info</span><span class="p">)[</span><span class="s1">'owner_id'</span><span class="p">]</span>
</code></pre></div></div>

<h3 id="ログインするときにサーバー以外の人をログインさせない">ログインするときにサーバー以外の人をログインさせない</h3>
<ul>
  <li><a href="https://discord.com/developers/docs/resources/guild#get-guild-member">Discordドキュメント</a></li>
  <li><a href="https://www.rubydoc.info/gems/discordrb/Discordrb/API/Server#resolve_member-class_method">Discordrbドキュメント</a></li>
</ul>

<p>これはどういう方法でできるかなーと考えた結果、Discord認証でログインさせるときに取得できるuid（ユーザーID）を利用して、そのIDを持つユーザー情報を取得するリクエストを送り、それが成功するかどうかでそのサーバーにいるユーザーかどうか確かめる、という方法で実装しました。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Discordrb</span><span class="o">::</span><span class="no">API</span><span class="o">::</span><span class="no">Server</span><span class="p">.</span><span class="nf">resolve_member</span><span class="p">(</span><span class="s2">"Bot </span><span class="si">#{</span><span class="no">ENV</span><span class="p">[</span><span class="s1">'DISCORD_BOT_TOKEN'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="no">ENV</span><span class="p">[</span><span class="s1">'DISCORD_SERVER_ID'</span><span class="p">],</span> <span class="n">uid</span><span class="p">)</span>
</code></pre></div></div>

<p>これを認証のコードの間に書いておいてリクエストが失敗するとエラーでログインできなくしました。</p>

<h3 id="discordサーバーにメッセージを自動投稿する">Discordサーバーにメッセージを自動投稿する</h3>
<ul>
  <li><a href="https://discord.com/developers/docs/resources/channel#create-message">Discordドキュメント</a></li>
  <li><a href="https://www.rubydoc.info/gems/discordrb/Discordrb/API/Channel#create_message-class_method">Discordrbドキュメント</a></li>
</ul>

<p>みんなが質問に回答してくれたものをサーバーに送りたい。今回はHTTP APIの方で実装しました。ドキュメントにあるようにBotを作成するときにPermissionsのSendMessagesを許可しておかないといけません。</p>

<p>まずどんな感じのメッセージを送るか考える。</p>

<p>こんなふうに埋め込み（embed）を使ってみたかったので、こちらの<a href="https://leovoel.github.io/embed-visualizer/">embed visualizer</a>を使ってとりあえず構成を考えました。</p>

<p><img src="/assets/images/discordbotf-2.png" alt="discordbotf" /></p>

<p>それをrake taskにします。例えばこんな感じ…？実際中身はもっと長くなったのでモデル以下にファイルを作ってそこにコードを移しています。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">namespace</span> <span class="ss">:discord_bot</span> <span class="k">do</span>
  <span class="n">desc</span> <span class="s1">'send message to discord guild'</span>
  <span class="n">task</span> <span class="ss">send_messages: :environment</span> <span class="k">do</span>
    <span class="no">Discordrb</span><span class="o">::</span><span class="no">API</span><span class="o">::</span><span class="no">Channel</span><span class="p">.</span><span class="nf">create_message</span><span class="p">(</span>
      <span class="s2">"Bot </span><span class="si">#{</span><span class="no">ENV</span><span class="p">[</span><span class="s1">'DISCORD_BOT_TOKEN'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
      <span class="no">ENV</span><span class="p">[</span><span class="s1">'DISCORD_CHANNEL_ID'</span><span class="p">],</span>
      <span class="s1">'こんにちは！こちらは毎日サーバーのメンバーのことを紹介するBotです！'</span><span class="p">,</span>
      <span class="kp">false</span><span class="p">,</span>
      <span class="p">{</span>
      	<span class="ss">title: </span><span class="s1">'好きな寿司ネタはなんですか？'</span><span class="p">,</span>
      	<span class="ss">description: </span><span class="s1">'質問に回答するにはここにアクセスしてね。'</span>
    	<span class="p">}</span>
    <span class="p">)</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p>メッセージを毎日同じ時間にDiscordに送信したいので、このタスクをHeroku Schedulerに登録しました。</p>

<h3 id="サーバーから去ったユーザーをサービス側からも削除する">サーバーから去ったユーザーをサービス側からも削除する</h3>
<ul>
  <li><a href="https://discord.com/developers/docs/topics/gateway#guild-member-remove">Discordドキュメント</a></li>
  <li><a href="https://www.rubydoc.info/gems/discordrb/Discordrb/EventContainer#member_leave-instance_method">Discordrbドキュメント</a></li>
</ul>

<p>これはGatway APIの方を利用して、メンバーがサーバーから去るイベント（脱退、追放、BAN）をハンドルしています。</p>

<p>このようにメンバーの変更イベントを監視するタイプのものは、デフォルトでは制限がかかかるようになっているらしいので、Botを登録する画面にあるSERVER MEMBERS INTENTをONにしていないと利用できない…はずです。多分（この辺ちょっと理解があやしい）。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">bot</span> <span class="o">=</span> <span class="no">Discordrb</span><span class="o">::</span><span class="no">Bot</span><span class="p">.</span><span class="nf">new</span> <span class="ss">token: </span><span class="no">ENV</span><span class="p">[</span><span class="s1">'DISCORD_BOT_TOKEN'</span><span class="p">]</span>
  <span class="n">bot</span><span class="p">.</span><span class="nf">member_leave</span> <span class="k">do</span> <span class="o">|</span><span class="n">event</span><span class="o">|</span>
    <span class="n">user_id</span> <span class="o">=</span> <span class="n">event</span><span class="p">.</span><span class="nf">user</span><span class="p">.</span><span class="nf">id</span>
    <span class="n">user</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">find_by</span><span class="p">(</span><span class="ss">uid: </span><span class="n">user_id</span><span class="p">)</span>
    <span class="n">user</span><span class="o">&amp;</span><span class="p">.</span><span class="nf">destroy</span>
  <span class="k">end</span>
<span class="n">bot</span><span class="p">.</span><span class="nf">run</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">bot.run</code>でBotが起動されますが、サーバーのメンバーが去るイベントを常に監視するためにずっと起動状態（Discordの画面でいうとオンライン状態）にしといてあげないといけない。そのために、これをrake taskにして、Procfileという名前のファイルを作り、そこに適当なプロセス名とこのタスクのコマンドを書いておきます。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bot: rails discord_bot:start
</code></pre></div></div>

<p>デプロイしたらHerokuのDynosにこのプロセスが表示されるのでONにしてあげるとBotが起動します。</p>

<p><img src="/assets/images/discordbotf-3.png" alt="discordbotf" /></p>

<p>ただ、Herokuの無料枠で使ってるので30分間サービスにアクセスがないとスリープしてしまい、Botもオフライン状態になってしまうようなのでHeroku Schedulerで10分毎に叩き起こすようにしています。</p>

<p>Discord APIを使ったところはこんな感じでやりました〜。</p>

<h2 id="苦労したところ">苦労したところ</h2>

<p>Discord BotはpythonかJavaScriptで作っている記事が多いのかなと思います。rubyでDiscord Botを作っている例が検索してもあまり出てこないし、Discord APIを理解して、何がどういうふうにできるから、アプリの仕様をどうしたらいいか？と考えるところで結構時間がかかったなーと思います。RailsとBotを別スレッドで同時に立ち上げておくみたいなところが一番分かってなかったかもしれない。また、API関連のテストを書くところでかなり助けてもらいました。難しかったー。</p>

<h2 id="楽しかったところ">楽しかったところ</h2>

<p>実際にフィヨルドブートキャンプで欲しい！という声が多かったものを作ったので、ちゃんと完成させれば実際にこのコミュニティの人たちに使ってもらえるんだというのは、自分にとってはモチベーションになったと思います。</p>

<p>実際仕様を考えるところは、メンターの方を利用者としてヒアリングして、検討しながら進めていたのですが、それも面白い経験でした。今回はその側面はそんなに大きくなかったかもですが、やっぱり問題や需要に対してどういう対処ができるのか、というのを考えていくのは自分が楽しいと思ってる部分なんだなぁと思います。</p>

<p>あとは、フィヨルドブートキャンプのプラクティスで、最小限の機能に限ってつくる、小さいサイクルで回していく、というアジャイルやスクラムの考え方についても勉強していたので、それをなんとなく意識して進めていけたのも良かったかなと思います。はじめにAPIについて調べて仕様を考えるのに２週間くらい、そのあと一気に完成までに必要なissueを登録して見通しを立て、初めの一週間で大まかな画面を全て作り、次の一週間で抜けているところを埋めていき、三週目で完成度を上げていく、という感じで進めました。Discord APIのことがわかってくるといろいろ他にも機能をつけたくなってくるんですが、そこは堪えてとりあえずみんながちゃんと使える状態のものを一度完成させようと思ってカリカリ書きました。</p>

<h2 id="今後">今後</h2>

<p>やってみたいなという機能としては、一度に投稿する回答の数やチャンネルをコマンドなどで変更できるようにするとか。Discordサーバー側でついているロールの変更もリアルタイムで取得できるようなので、ロールを取得、記録してそれを用いて管理者権限を変えたり質問を分けて管理したりなどできても面白いかなと思っています。</p>

<p>また、フィヨルドブートキャンプの中でもまだ他にDiscordに欲しいなという機能がちらほらあるように思うので、これを機会にDiscord Botや連携サービスが色々作られていくと楽しいなと思っています。</p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="FJORDBOOTCAMP" /><category term="RAILS" /><category term="DISCORD" /><summary type="html"><![CDATA[私は去年の９月からフィヨルドブートキャンプというスクールでプログラミングの勉強をしており、最終課題でDiscord Botを使った連携サービスを作成しました。本記事ではその紹介をしたいと思います。]]></summary></entry><entry><title type="html">acts-as-taggable-onについて</title><link href="https://mssp160.netlify.app/2021-05/d1/" rel="alternate" type="text/html" title="acts-as-taggable-onについて" /><published>2021-05-12T00:00:00+09:00</published><updated>2021-05-12T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2021-05/d1</id><content type="html" xml:base="https://mssp160.netlify.app/2021-05/d1/"><![CDATA[<p>私は今フィヨルドブートキャンプでチーム開発のプラクティスをやっているのですが、そこでは実際みんなが使っている<a href="https://github.com/fjordllc/bootcamp">ブートキャンプのアプリ</a>の開発に参加します。
<!--more--></p>

<p>ブートキャンプアプリは<a href="https://github.com/mbleigh/acts-as-taggable-on/issues/719#issuecomment-172490087">acts-as-taggable-on</a>というgemを使っていて、私が担当したissueではそのgemが絡むことが多かったので、ちょっと困ったところや調べたところをメモしておこうと思います。</p>

<h2 id="taggins_countについて">taggins_countについて</h2>

<h3 id="fixtureで設定したタグの数がテーブルに入らない">fixtureで設定したタグの数がテーブルに入らない</h3>

<p>gemの導入方法とかはさておき、とりあえずこのgemを入れると、taggingsとtagsの二つのテーブルができます。tagsテーブルの方はid、name、taggings_countの３つのカラムがあって、そのタグが登録されている数がtaggings_countに入っている。はずです。</p>

<table>
  <thead>
    <tr>
      <th>tagsテーブル</th>
      <th>taggingsテーブル</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>id</td>
      <td>id</td>
    </tr>
    <tr>
      <td>name（タグの名前）</td>
      <td>tag_id（タグのid）</td>
    </tr>
    <tr>
      <td>taggings_count（そのタグが登録されている数）</td>
      <td>tag_type（モデル名）</td>
    </tr>
    <tr>
      <td> </td>
      <td>taggable_id（登録されているもののid）</td>
    </tr>
    <tr>
      <td> </td>
      <td>tagger_type</td>
    </tr>
    <tr>
      <td> </td>
      <td>tagger_id</td>
    </tr>
    <tr>
      <td> </td>
      <td>context</td>
    </tr>
    <tr>
      <td> </td>
      <td>create_at</td>
    </tr>
  </tbody>
</table>

<p>だけど、初めてリポジトリクローンして立ち上げて開いたら画面上ではタグがあるのに、テーブルでは全てのタグのカウントがゼロになっていてえ？？？ってなってしばらく悩んでしまいました。</p>

<p>fixtureで登録されているタグのカウント数はテーブルのtaggings_countには反映されないです。（これは先人に教えてもらった）</p>

<p>でも手動？で登録すればちゃんと反映されるので本番の方では大丈夫です。数はちゃんと入ってます。ただ、ちょっと問題がある。</p>

<h3 id="別モデルで登録したタグと数が混ざる">別モデルで登録したタグと数が混ざる</h3>

<p>タグは複数のモデルで付けられます。ただし、別々のモデルで同じ名前のタグを登録した場合taggings_countのカウントが混ざる。「猫」とタグ付けされた人が３人いて、「猫」とタグ付けされた記事が２本あったら、tagsテーブルでは「猫」のカウントが５となるだけで、gemのメソッドを使ってもこれを分けて取ることができません。</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">ActsAsTaggableOn</span><span class="o">::</span><span class="no">Tag</span><span class="p">.</span><span class="nf">most_used</span>
<span class="no">ActsAsTaggableOn</span><span class="o">::</span><span class="no">Tag</span><span class="p">.</span><span class="nf">least_used</span>
</code></pre></div></div>

<p>例えばこれはタグの中で登録数が多いもしくは少ない順にタグを取得できるメソッドですが、この数も全モデルでの数になるので、ユーザーが登録しているタグの中で数が一番多いタグが欲しい、といった場合は使えない。多分どのメソッドもこれは考慮されていないと思われます。</p>

<p>じゃあどうやって取得するの？ということで、これはgemのissueにも上がっているようです。（これも先人に教えてもらった）</p>

<p><a href="https://github.com/mbleigh/acts-as-taggable-on/issues/719#issuecomment-172490087">https://github.com/mbleigh/acts-as-taggable-on/issues/719#issuecomment-172490087</a></p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">ActsAsTaggableOn</span><span class="o">::</span><span class="no">Tag</span>
            <span class="p">.</span><span class="nf">joins</span><span class="p">(</span><span class="ss">:taggings</span><span class="p">)</span>
            <span class="p">.</span><span class="nf">select</span><span class="p">(</span><span class="s1">'tags.id, tags.name, COUNT(taggings.id) as count'</span><span class="p">)</span>
            <span class="p">.</span><span class="nf">group</span><span class="p">(</span><span class="s1">'tags.id, tags.name, tags.taggings_count'</span><span class="p">)</span>
            <span class="p">.</span><span class="nf">where</span><span class="p">(</span><span class="ss">taggings: </span><span class="p">{</span> <span class="ss">taggable_type: </span><span class="s1">'User'</span><span class="p">})</span>
</code></pre></div></div>

<p>taggable_typeはモデルの名前が入っているので、taggingsテーブルを連結してそれで絞り込めば数が取れるということですね。bootcampのコードもこれをアレンジして使っています。このgemのメソッドでどういうSQLが発行されているのかはチェックしたほうがいい感じだと思われる。</p>

<p>余談だけど、こうやって取得したタグの数だけ欲しくて、<code class="language-plaintext highlighter-rouge">.pluck(:count)</code>ってやったらできなくて、<code class="language-plaintext highlighter-rouge">.pluck('COUNT(taggings.id) as count')</code>か、<code class="language-plaintext highlighter-rouge">.map(&amp;:count)</code>でやるしかなかった。pluckは元々あるカラムしかカラム名指定することができないんですね〜。</p>

<h2 id="tag_listについて">tag_listについて</h2>

<h3 id="tag_listのattributeがnilになる">tag_listのattributeがnilになる</h3>

<p>READMEにもあるとおり、タグはこんな感じで<code class="language-plaintext highlighter-rouge">tag_list</code>に配列として登録されるんですが、</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="vi">@user</span><span class="p">.</span><span class="nf">tag_list</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="s2">"awesome"</span><span class="p">)</span>   <span class="c1"># add a single tag. alias for &lt;&lt;</span>
<span class="vi">@user</span><span class="p">.</span><span class="nf">tag_list</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="s2">"awesome"</span><span class="p">)</span> <span class="c1"># remove a single tag</span>
<span class="vi">@user</span><span class="p">.</span><span class="nf">save</span> <span class="c1"># save to persist tag_list</span>
<span class="vi">@user</span><span class="p">.</span><span class="nf">tag_list</span> <span class="c1"># =&gt; ["awesome"]</span>
</code></pre></div></div>

<p>コンソールでユーザーの中身を見るとtagは登録されていてもいなくても常にnilになっています。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#&lt;User id: 1234, name: "yamada", tag_list: nil&gt;
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">user.tag_list?</code>はいつもfalseです。
それをやりたかったところは、私は<code class="language-plaintext highlighter-rouge">user.tag_list.empty?</code>ていう形で書きました。
これもissueが上がっていました。バージョンアップしてもそのままな気がする…。</p>

<p><a href="https://github.com/mbleigh/acts-as-taggable-on/issues/1024">https://github.com/mbleigh/acts-as-taggable-on/issues/1024</a></p>

<h3 id="n1問題">N+1問題</h3>

<p>ユーザーを全部取得してユーザーごとに登録しているタグを表示したいなーなどと思った時</p>

<p><code class="language-plaintext highlighter-rouge">controller</code></p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">index</span>
   <span class="vi">@users</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">all</span>
<span class="k">end</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">view</code></p>
<div class="language-erb highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;%</span> <span class="vi">@users</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">user</span><span class="o">|</span> <span class="cp">%&gt;</span>
    タグ：<span class="cp">&lt;%=</span> <span class="n">user</span><span class="p">.</span><span class="nf">tag_list</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span> <span class="cp">%&gt;</span>
<span class="cp">&lt;%</span> <span class="k">end</span> <span class="cp">%&gt;</span>
</code></pre></div></div>

<p>こうやって書くとですね、毎回２回ずつSQL発行されててN+1問題が発生しています。</p>

<p>bootcampではbulletを入れているのでN+1問題が発生しているとメッセージが表示されて、この場合taggingsをincludeしてね！という表示がでます。ただ、tagginsをincludeするとこの警告は消えるんですけど、確認すると実はまだ毎回１回ずつSQLが発行されていました。</p>

<p><a href="https://github.com/mbleigh/acts-as-taggable-on/issues/91#issuecomment-168273770">https://github.com/mbleigh/acts-as-taggable-on/issues/91#issuecomment-168273770</a></p>

<p>これもissueに上がっていて、tagsをincludeしてmapでtagの名前だけ取るのだ、という解決策があるみたいです。</p>

<p>上のを修正するとこんな感じ。</p>

<p><code class="language-plaintext highlighter-rouge">controller</code></p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">index</span>
   <span class="vi">@users</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">all</span><span class="p">.</span><span class="nf">preload</span><span class="p">(</span><span class="ss">:tags</span><span class="p">)</span>
<span class="k">end</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">view</code></p>

<div class="language-erb highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;%</span> <span class="vi">@users</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">user</span><span class="o">|</span> <span class="cp">%&gt;</span>
    タグ：<span class="cp">&lt;%=</span> <span class="n">user</span><span class="p">.</span><span class="nf">tags</span><span class="p">.</span><span class="nf">pluck</span><span class="p">(</span><span class="ss">:name</span><span class="p">).</span><span class="nf">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span> <span class="cp">%&gt;</span>
<span class="cp">&lt;%</span> <span class="k">end</span> <span class="cp">%&gt;</span>
</code></pre></div></div>

<p>他の<a href="https://madogiwa0124.hatenablog.com/entry/2018/04/22/185625">記事</a>を参考にpreloadとpluckを使っています。bootcampのアプリでは今のところ私が担当した部分だけこれで書いてみています。パフォーマンスが結構変わるなら全部書き直したほうがいいのかなぁ。</p>

<p>includeではなくpreloadとeager_loadを使用する方がいいのかなという参考記事は<a href="https://qiita.com/ryosuketter/items/097556841ec8e1b2940f">こちら</a>とか。</p>

<p>これもSQL確認しといた方がいいよ〜、て感じでしょうか。</p>

<p>個人的には、tagsやtaggingsテーブルへのデーターの登録が全部gemの中で行われているので、それをgemのメソッドを使わないでアレンジしないといけない時に、どこのモデルやコントローラーに書くのがいいのかっていうのがちょっと悩みました。いろいろ勉強になりました。</p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="FJORDBOOTCAMP" /><category term="RAILS" /><summary type="html"><![CDATA[私は今フィヨルドブートキャンプでチーム開発のプラクティスをやっているのですが、そこでは実際みんなが使っているブートキャンプのアプリの開発に参加します。]]></summary></entry><entry><title type="html">最近の進捗</title><link href="https://mssp160.netlify.app/2021-04/d1/" rel="alternate" type="text/html" title="最近の進捗" /><published>2021-04-29T00:00:00+09:00</published><updated>2021-04-29T00:00:00+09:00</updated><id>https://mssp160.netlify.app/2021-04/d1</id><content type="html" xml:base="https://mssp160.netlify.app/2021-04/d1/"><![CDATA[<p>全くブログは書いていなかったのですが、フィヨルドブートキャンプで元気に勉強していました。こんにちは。
<!--more--></p>
<h3 id="勉強したこと">勉強したこと</h3>

<p>前に進捗を書いた12月からしばらく体調を崩していた時もあったのですが、最近やっと最終課題に差し掛かりました。書き並べてみるとすごく長くなってしまいましたね。現在はシステム開発の後半で、webサービス作成も徐々に準備し始めているところです。</p>

<p>システム開発は実際に自分たちが利用しているブートキャンプのシステムの開発に携わるのですが、課題をひとつづつ解決していくのが結構楽しいです。今までは深く調べてみたいけどわからないことも多くて見通しが悪いのでとりあえず進めてみよう、と思って進めてきたところがあるのですが、課題を解決しながら気になったところを時間をかけて調べたり復習したりして知識がつながっていくと嬉しいです。まだ全然足りないなぁ、もっと勉強したいなぁと思います。</p>

<p>でもそろそろ就職活動のことも考えないとね。私は勉強の方が気が楽なので、どうしてもこれずっとやってたいなーと思ってしまいます。</p>

<ul>
  <li>HTML、CSS</li>
  <li>Linux</li>
  <li>Ruby</li>
  <li>HTTP</li>
  <li>Nginx</li>
  <li>データベース</li>
  <li>Git、GitHub</li>
  <li>Webアプリケーションについて</li>
  <li>Ruby on Rails
    <ul>
      <li>i18n</li>
      <li>kaminari</li>
      <li>deviseを使ってユーザー認証</li>
      <li>omniauthでGitHub認証</li>
      <li>ActiveStorage</li>
      <li>ユーザーフォロー機能</li>
      <li>コメント機能</li>
    </ul>
  </li>
  <li>自動テスト
    <ul>
      <li>minitest</li>
    </ul>
  </li>
  <li>オブジェクト指向プログラミング</li>
  <li>Javascript
    <ul>
      <li>非同期処理やnpmをつくるなど</li>
    </ul>
  </li>
  <li>Vue.js
    <ul>
      <li>Vue CLIでメモアプリ</li>
    </ul>
  </li>
  <li><strong>システム開発</strong>
    <ul>
      <li><strong>スクラム開発でブートキャンプのアプリの開発に参加する</strong></li>
    </ul>
  </li>
  <li>Webサービス作成</li>
</ul>

<h3 id="その他のこと">その他のこと</h3>

<p>フィヨルドブートキャンプは最近チャットツールがSlackからDiscordに移行して、そこで分報を書くことがはじまったりしました。それによって受講生同士もそうですが、卒業生やメンターさんなどとの距離もまた近くなった気がしますし、ボイスチャンネルに入っている人数がわかるようになって、質問タイムなどを利用するハードルが下がった人もいるんじゃないかなーと思います。</p>

<p>メンターさんたちがオンラインでもコミュニケーションをとりやすくなるような手段を色々考えてくださっているので、自立した学習環境がありながらも、サポートも手厚い、より良い感じの方向に進んでるんじゃないでしょうか。</p>

<p>最近パーフェクトRuby on Railsの輪読会にも参加するようになりました。多分みんなが言っていることだと思うんですが、人と一緒に読むと自分が知らない知識が得られてすごく勉強になるなぁと思います。最後の方のプラクティスがjavascriptなのでちょっと様子見てしまってたんですが、もっと前から参加しても良かったかも。</p>

<p>輪読会もそうですし、雑談のボイスチャンネルでお話ししたりする機会もあって、最近突然人と話す時間が増えたなぁと思います。ずっと静かにひとりでひきこもって勉強していたのですが、これから就職活動もしなければいけないので、人と話す機会を増やしてちょっと慣れとかないとなーと思っています。Rubyのコミュニティとかにもちょこちょこ参加するようにしたいです。</p>

<p>最近はそんな感じでしたー。</p>]]></content><author><name>みそしる</name><email>hotmisosoup160@gmail.com</email></author><category term="FJORDBOOTCAMP" /><summary type="html"><![CDATA[全くブログは書いていなかったのですが、フィヨルドブートキャンプで元気に勉強していました。こんにちは。]]></summary></entry></feed>