IT's not Rocket Science!

プログラミング難しいけど頑張ろうね!

フィヨルドブートキャンプに入会して100日が経ちました

こんにちは、ひろきです。

12月にフィヨルドブートキャンプに入会し、先週100日を迎えたので現在感じていることを書いていきます。 入会して2ヶ月の時にも記事を書いているので、こちらも良かったらどうぞ。

hiroblogdesu.hatenablog.com

100日間連続で何かを続けるというのも珍しいと思っていて、Duolingoを100日続けたことも記事に書いています。 せっかくなので、リンク貼っておきます。

hiroblogdesu.hatenablog.com

フィヨルドブートキャンプ(以下、FBC)では勉強した日に日報を書く(してなくてもOK)のですが、学習できない日があっても日報だけは毎日続けています。

タイトルに[#100]と入れているので、入会して何日目かがわかりやすいからです。(途中で日にち被って間違えたけど) あとは、たまに見返したりするのでその時に色々思い出せるからです。

この記事は、2/16に2ヶ月の記事を書いているので、そこからの心境の変化等がメインになりそうです。

結論を先に言っておきます。

FBCに入ってよかった!

大きな山を越えて学習が楽しい!

個人的な大きな山、です。

当時、私は「リバーシのプログラムの修正」というプラクティスに行き詰まっていました。

プログラムを見た瞬間、知らないコードがたくさんあって何から手をつけていいかわからなかったからです。「いきなり難易度あがりすぎじゃない⁉️」って思いながら病んでました。笑

名著チェリー本を読んだ前提のプラクティスで、「読んでいないからだ」と思い、同時進行をしていましたが、それでも、「わからん!」ってなってました。

言い訳させてもらえるとしたら、海外から帰国し、バタバタしていても学習しないといけない気持ち、でも全然わからなくてモヤモヤしている気持ちでモチベーションが低かったというのがあります。

実際は、「当たり前のことをする」ということから逃げていただけで泥臭くチャレンジしてみたら意外とサクッと終わらせることができました。

そのあたりから、「あんなに難しかった課題をできるようになったんだから、自信もって良くない⁉️」のメンタルでガンガン先に進んでいます。

今は、山場と言われているlsコマンドを作りながら、データベースの学習をしています。初めてすぎて意味わからないところもありますが、知識が入ってくると楽しい気分になります。

逆に今後これを使って色々やるんだなと思うと不安にもなりますが。笑

沼るのは日常茶飯事

ちょっと誇張表現かもしれませんが、「わからん!」ってなるのは日常茶飯事です。 しょっちゅう詰まるので、最近はそこまで気にならなくなりました。

必死に謎を解くことに集中してしまうので、「質問する」ことも忘れてしまいます。これは本当に悪い癖だなと思っています。

ただ、2ヶ月の時よりも、質問に対するメンタルの壁は低くなっている気がします。 提出物で小さい修正があった時も、前までは、「ごめんなさいごめんなさい許してください」くらい重く考えてましたが、今は、「やってしまった、、ごめんなさい」くらいの落ち込みで済んでます。(メンターさんの時間を奪ってしまっているのが申し訳ないの意) なので、もう無理!ってなったら、質問すると思います。

正直、ChatGPTにはたくさん質問しています。鵜呑みには基本的にしてないです。間違っている可能性も高いと思っているので。自分の知らない知識を教えてもらったら、使いたくないとも思えるようになりました。

さらに、一次情報を読んでからChatGPTに解説してもらったり、ブログを読んだりして理解をした後、もう一度、一次情報を読んで理解を深めるようになりました。

これは確実にFBCにいたから身についたことかと思います。

というのも、日報に参考文献として載せるのに公式リファレンスを載せたいからっていうのもありますが、一次情報が理解できれば、他の参考サイトが不要になるからです。 でも、まだそのレベルに達していないので、理解できるように色々巡回しています。

まだ、参考にするブログ等の信頼性を確かめる癖はついていないですが、一次情報の重要性は身体に染みついた気がします。

オフラインのご飯会に参加した!

オフラインのイベントがちょいちょいあります。ちょうど100日+1日目(惜しい)にイベントがあったので、参加しました。

すごく楽しい会で、みなさん優しすぎて驚きました。 また次のイベントも絶対に参加したいです。

FBCは自学自走タイプのスクールなので、孤独感だったりモチベーションの維持が難しかもしれません。 私がお会いした方が同じプラクティスに挑戦していたので、お話も盛り上がりました。 他の方も、卒業間近の先輩や、実際にITで働いている方たちだったので、知らないことやアドバイスもいただけて、勉強になりました。

それだけでなく、仕事と関係のない仲間ができるのって嬉しいです。FBCを終えた後も、繋がりがあったりするみたいなので、そう言うのって嬉しいですよね。大切にしたいです。

終わりに

ざっと思いつくのはこの3つかなと思います。

あと小さいことで言うと、これでもかってくらい技術書を読みます。少しずつ難易度も上がってきているので、少々の不安はありますがじっくりやっていきたいです。

FBCにこれから入ろう!と言う方の励みになれたら幸いですし、私も1年弱は現役生だと思うので(理想)、ご一緒できたら共に頑張りましょう!

Rubyでボウリングのスコア計算プログラムを作ったメモ。後編

こんにちは、ひろきです。

前回は、スコアの入力をしたら、それを数値に変換して配列に格納するところまでやりました。

↑書いてて、投球数が奇数になってました。次で直ります。

やりたいこと

  • ターミナルでスコアを入力して、それを格納する
  • Xのような表記を数値に変換する
  • その数値をフレームとして分ける
  • ストライクやスペアの計算を実装する

その数値をフレームとして分ける

ボウリングでは、1ターンに最大2ボールを投げることができます。 例外として、10レーンでは2投までに10本倒すと3投目に挑戦できるボーナスがつきます。

なので、このフレームを配列で作っていきます。

Enumerable#each_slice (Ruby 3.3 リファレンスマニュアル)

frames = []

から初めて、前編で使ったコードを使用してもいいですし、 または

frames = #フレームを作るコード

でもいいと思います。

その場合、each_slice(2)は配列を返さないので、配列に変換しないといけません。

これで、ようやく計算までのベースを作ることができました。

ストライクやスペアの計算を実装する

よく考えたら、いきなりこの計算をするのではなくて、まずは全てを足し算できるようにしないとダメですね。

足し算の式を作る

まず、点数を表示する変数が欲しいので、

point = 0

を定義します。 point+=を使用して足し算をしていきます。

point += frames[0].sum

で1フレームの合計をポイントに入れられます。

しかし、これだと毎回フレーム数を指定しないといけないのでめちゃめちゃ面倒くさいです。

そこで、繰り返しです。 1フレームの合計を足す、2フレームの合計を足したいです。 eachで1つずつ足し算はできます。 とりあえず、eachで進めてみましょう。

次にストライクとスペアを順に実装します。

ストライクとスペア

ストライクは[10,0]でスペアは[2,8]のような2投目が10になることです。 ストライクを取ると、次のフレームの合計を足します。さらに2回連続ストライクだったら、3回目の投球の1投目まで足されます。

例: [10,0],[10,0],[3,7]→10+10+3+ 23

となると、足し算にストライクの次のフレームを足したいので、「次のフレーム」を指定する必要があります。 先ほどのeachだと、それはできなそうので(できたとしても、私にはできない)、繰り返しのリファレンスから配列の番号を指定できるメソッドがないか探します。

module Enumerable (Ruby 3.3 リファレンスマニュアル)

このメソッドを使います。

要素とそのインデックスをブロックに渡して繰り返します。 Enumerable#each_with_index (Ruby 3.3 リファレンスマニュアル)

さらに

あるまとまったデータから個々のものを取り出すのに便利なeachの働きに、さらに加えて同時に取り出した順序の番号を取り出せるのがeach_with_indexです。より便利なeachとして覚えておくとよいでしょう。

Rubyのeachでindexを取得する:each_with_index | UX MILK

これで、フレーム数の指定ができるようになります。

ストライクだったら10点、次のフレームの合計を足す。 ストライク、ストライクだったら、さらに次のフレームの1投目を足す。

ストライク([10,0])だったら、
10点と(+)次のフレームの合計(frame.sum)を足す(+=)。
ストライク、ストライク(frames[index + 1] == [10, 0])だったら(if)、
さらに次のフレーム(frames[index + 2])の1投目(frames[index + 2][0])を足す(+=)。

こんな感じです。

配列を[0][1]のように指定すれば、どの投球か指定できます。

同様に、スペアでも同じことをします。 省略します。

そして、最後に9本以下の合計を足すと、ポイント計算ができるようになります。

当時、私がわからず悩んだところが、each_with_index do |frame, index|frameです。 これはfのような文字でも大丈夫で、frameを使った結果、なぜframesframeを使い分けるのか悩みました。 冷静に考えれば、framesは配列全体を表し、frameは取り出した配列の1つを表しているとわかります。 なので、コードを書いてエラーが起きたときは、それに気をつけてください。

さて、もう少しで完成です。

10フレーム目

厄介ポイントです。

10フレーム目は最大3投投げられます。

やれそうなこととして

  • 3投の配列を作る
  • 12フレームまで作ってそれを使う

が考えられます。ただ、ストライクをすると、自動的に[10,0]となるため、3投配列を作るのは現実的ではありません。 後者でやります。

条件分岐は上から評価していくため、可能性の低いものを上に持ってきた方が良いです。 上記でやったようにifを足して、10フレーム目の条件を満たしてみてください。

繰り返しの終了

最後に計算を終わらせるべき時が来ます。 入力した際に、必要以上のフレーム数があっても繰り返してしまうので、とめる必要があります。 ループを抜け出すものをどこかに挟んで、不要な計算を止めましょう。

制御構造 (Ruby 3.3 リファレンスマニュアル)

最後はputs pointで終了です。

最後に

最後の方をはしょってしまったのは、コードを書いてしまう気がしたからです。 当時、ブロッックの部分が理解できていなかったり、pを使ったりして、何がどうできていないか確認するのにたくさん使ったを思い出しました。

後半上手く書けた気がしないので、気分転換でリライトできたらと思います。

Rubyでボウリングのスコア計算プログラムを作ったメモ。前編

こんにちは、ひろきです。

フィヨルドブートキャンプのプラクティスにボウリングのスコア計算プログラムがあります。 ボウリングスコアのプログラムというと、当初、全然コードが書けなくて、身内にボウリングのルールの話をしたら、「普通、人生でこんなにボウリングのこと考えないよ。面白いね。」と言われたことを思い出します。

ネタバレ防止のためコードはあまり書きません。

作りたいもの

  • ボウリングの旧ルールの計算プログラム
  • ターミナルで実行したら計算結果が出力される

条件

  • 入力は6,3,9,0,0,3,8,2,7,3,X,9,1,8,0,X,6,4,5このようにする。
  • ,投球の区切り
  • 0-10 : 何本倒したか
  • X: ストライク
  • ストライクの場合は2投目は表記しない。

おそらく、私たちがボウリング場で使っているのが旧ルールです。 ルールがわからない場合は、ググってください。

やりたいこと

  • ターミナルでスコアを入力して、それを格納する
  • Xのような表記を数値に変換する
  • その数値をフレームとして分ける
  • ストライクやスペアの計算を実装する

ざっとこんな感じです。

フィヨルドブートキャンプでは新ルールの方のコードが書いてあるので、そこにあるものは載せます。

ターミナルでスコアを入力して、それを格納する

カレンダーの記事ではoptparseを使いましたが、今回は別の方法です。

ARGVを使います。

Object::ARGV (Ruby 3.3 リファレンスマニュアル)

Rubyスクリプトとはfile.rbのようなファイル名のことです。その引数を文字列の配列にします。

score = ARGV[0]
p score

これで、ruby bowl.rb 1,2,3で出力すると

"1,2,3"

で返ります。

一方で、ruby bowl.rb 1 2 3と空白で出力すると

"1"

が返ります。 1,2,3は1つの文字列として認識しているため、上の結果となります。

これで、ターミナルの引数を格納できました。

1つずつの要素にする

今は、引数がそのまま1つの要素になっているので、, を取り除いて配列にします。

[0]で文字列を出力しているので、String#splitのsplit(',')を使って,で区切って分割します。(ちなみに、 [0]がない場合、配列となるので、splitは使えません。)

String#split (Ruby 3.3 リファレンスマニュアル)

split('')は、,も配列に含みます。

score = "1,2,3"
score.split('') # => ["1", ",", "2", ",", "3"]

Xのような表記を数値に変換する

ストライクを取った場合、Xを入力していますが自動的に10にはなりません。 新しい配列を作って、X100を出力するようにします。 先ほど出来上がった配列に繰り返し処理行って、Xが来たら、10と0を返す、式を考えます。

繰り返しeachと、来たらifで行います。

<<で配列に追加ができます。 Array#<< (Ruby 3.3 リファレンスマニュアル)

shots = []
scores.each do |s|
  if s == 'X'
    shots << 10
    shots << 0
  else
    shots << s.to_i
  end
end

配列になんらかの処理を加えて配列で返す場合、mapメソッドを使用して表すこともできます。

【Ruby】eachとmapの違い #Ruby - Qiita

私の完成作品は上記の記事でいう悪い例でした。笑

今回の場合は、配列の中に配列を返すので、それを1つの配列にする必要があります。

class Array (Ruby 3.3 リファレンスマニュアル)からそれができそうなメソッドを探します。

Enumerable#collect_concat (Ruby 3.3 リファレンスマニュアル)を使って、ifの中を配列にします。もっというと、このifも1行で表せます。 ?:でできますので、チャレンジしてみてください。

一番下にあります。

演算子式 (Ruby 3.3 リファレンスマニュアル)

一旦ここまで

思った以上に長くなってしまったので、今回はこの辺で。

ラクティスの時に取り組んでいた時と違い知識がついていて、嬉しかったです。 これからもマイペースにがんばります。

【フランス語】Duolingoを100日継続したので、経緯と結果を話します。

こんにちは、ひろきです。

語学学習アプリ、Duolingoでフランス語学習が100日経過したので、そのことについて話します。

過去にワーキングホリデーでカナダのモントリオールに1年間、住んでいたことがありました。

実は、カナダは公用語が2つあります。それは、英語とフランス語です。ただ、フランス語が使われているのはモントリオールがあるケベック州だけです。歴史的なことは本題とずれますので、調べていただけたらと思います。

モントリオール - Wikipedia

私のフランス語レベル

95%初心者です。

数字を10まで言えませんし、外国人旅行者が日本語を話すくらいの挨拶しかできません。 ただ、2019年に帰国した際に、文法書を軽く途中まで読んだので、大学生の第二外国語よりできないレベルです。

なぜフランス語を再開したか

2つ理由があります。

モントリオールを再訪した

・フランス語ができるとカナダ移住に有利

です。

モントリオールを再訪した

2023年の1年間、バンクーバーに滞在していました。帰国前に旅行でモントリオールに行きました。

モントリオール第一言語はフランス語です。もちろん、英語でも生活ができますが、フランス語ができると喜ばれます。 関西の人に関西弁で話す外国人がいたら嬉しいのと似ていますね。

その時に、やっぱりモントリオールが好きだと再認識し、いつかここに住めたらいいなと思ったからです。(今は欲はないですが…)

あとは英語以外にも話せる言語が欲しいと言うのもあります。

フランス語ができると移住に有利

これは確かDuolingoを始めた後にカナダ政府が発表したことなのですが、ある一定のフランス語能力を証明できると、就労ビザがおりやすくなるからです。

海外に移住を考える時に一番の壁になるのが、ビザ問題です。 「カナダにまた住みたい!」と思った時に、可能性を高めておきたい。と考え、「フランス語レベル1よりも3の方が良いよな」と考え、アプリをインストールしました。

そこから100日が経過しました。

フランス語レベルは上がった?

結果から言うと、やる前より語彙が増えた程度です。 英語を通過してから、フランス語をやるとなんだこの言語ってなるんですけど、その理由が色々あります。

・名詞に性がある

・動詞が主語によって変化する

初心者レベルだとここがスーパー難関です。

名詞に性がある

スペイン語やフランス語って男性名詞・女性名詞あるから難しいよね!」

と言われることが多いです。私も学習する前はこんなの覚えられなくない?無理じゃない?と思ったのですが、Duolingoのいいところは、同じ単語が何日も連続して出てくると言う点です。

例えば、gareは駅なんですけど、Duolingo上で私は駅に100回くらい行ってます。大体は、そこにleかlaの冠詞が出てきますので、毎回選ばされます。(男性か女性か選ぶ)

答えは女性名詞なので、la gareになります。

100回駅に行く間に、最低50回はla gareを解答させられてきたので嫌でも覚えます。

単語帳で[女]みたいに書かれても覚えられないので、苦痛なく覚えることができるのは強みかと思います。

1つ言えるのは、効率はめちゃくちゃ悪いと思います。笑

動詞が主語によって変化する

英語でも変化はあります。ただ、せいぜい時制での変化か、三単現くらいだと思うんですよね。 I、You、Weの動詞は同じですが(Be動詞を除く)、フランス語は違います。

私はまだフランス語の時制を学んでいないのでわからないのですが、主語が変わるだけで、変化の仕方が意味わからんくらい変わります。 IとYouでも違いますし、Weでも変わります。

ジャンプのキャラが強くなる時に見た目が変わるくらいスペルが変わります。 それを覚えるモチベーションがなくて、昔、学習をやめたところはあります。

ですが、Duolingoは基本は選択問題なので、間違えを繰り返してるとあることに気づきます。

「主語によって変化の特徴があるんじゃない?」

これって、もしかしたら本にも法則が書いてあるかもしれないんですけど、自分で気づくことによって記憶に定着しやすいんですよね。

偉そうなことを言いながら、英語でいうhaveの動詞の選択を2ヶ月くらいやっていますが、学習意欲が最低なので、今でも普通に間違えます

なので、「100日の割にぜんぜんできてないじゃん!」ってなりますが、それでいいんです。

それでも続けられるんです。それはなぜか。

1日の学習時間は約3分

Duolingoのシステム的に、1レッスンをクリアすると「学習しました!」という記録をつけてくれて、日数が足されます。 普通に解答していくと、3分くらいでクリアできます。

1日の内たった3分を費やすだけで、「100日勉強しました!」って言ってくれるし、自分自身も「100日達成したぜ!」と思えるのって、めちゃくちゃ嬉しいと思うんですよね。

ゴールの設定も特にしていないし、「1日1レッスンだけやる」を目標にしているので、続けることができます。

目標設定は低く

低い目標設定は継続の近道だと思っています。

「最低これだけはやる」を「一番最低レベルのこと」に設定します。 例えば、片付けが苦手な人が「部屋をきれいにする!」と決めると、大抵、きれいにできません。 なので、私は「毎日、ゴミを1つ捨てる」くらい下げます。

あと、「こういう状態のレベルになる(例えば、フランス語ペラペラ)」もしません。 それはかなり高次元な目標なので、めちゃくちゃ頑張ろうと思えることじゃないと達成するのはかなり困難だからです。

「毎日、ゴミを1つ捨てる」みたいな小さい目標で頑張っていると、気分が乗る日が出てきます。 その時にちょっと多くゴミを捨てたり、物を動かしたりします。

私はもともと、高い目標を立ててそれを達成しようとして、できない!と言うことが何度もありました。 なので、必須なこと以外は、ハードルの高さをアリさんでも超えられるものにします。

フランス語も頑張れないことの1つです。

人生に必須なことではないからです。でも、できたらいいなと思ったので、とりあえず、「1日3分1レッスンだけやる。できる時はやりたいだけやる」にしています。

やめなければいつか達成できる

目標を達成した人に共通していることは「やめなかった」です。

なので、他人からしたら意味のないことでも、小さな小さな塵を積み上げていけば、亀がウサギとのレースに勝つような結果になると信じてます。

体調とかもあるので、できなくなることもあると思いますが、ひとまずは100日続けられたので、今後も無理しない程度に続けられたらいいなと思います。

英語関係の記事も書こうと思っているので、更新の通知を@hirokiejでしますので、フォローしていただけたらと思います。

Rubyでカレンダーを作ったメモ。後編

こんにちは、ひろきです。

フィヨルドブートキャンプではネタバレは基本載せてはいけない方針だったので、今回の記事は軽めです。 コードはほとんど書いていません。

前回は、ここまで表示できるようになりました。

やりたいこと

  • 日を改行させる
  • 1週間目の日の場所を合わせる
  • 年月を指定してカレンダーを表示する

日を改行させる

現在のコードでは日にちが横一線になっているので、改行させたいです。 「曜日と連携」のような技があるのかわからないですが、ないと思うので、土曜日を表示したら改行できるようにしたいです。

ここでまた、便利なメソッドがないか探してみましょう。

class Date (Ruby 3.3 リファレンスマニュアル)

saturday?の?はそうだったらtrue、違ったらfalseを返します。

なので、そうだったら改行、違ったら改行をしないようにコードを書いていきます。

こうなりました。あとは、日付毎の間隔と1週間目の位置を正すだけです。

1週間目の日の場所を合わせる

先述した通り、曜日と日付を連携させるようなメソッドは知らないですsし、あるかもわからないので、そこに1日が置かれるようにしないといけません。 日曜日は0日分、月曜日は1日分…のように空白を作れたら最高です。 そこで、このメソッドが使えそうです。

Date#wday (Ruby 3.3 リファレンスマニュアル)

wdayは、日曜日から土曜日までを0-6で返します。 この数値を利用して空白を作ります。これで、初日の日付と曜日が合いました。
しかし、1、2週の配置が合いません。

右寄せにできるメソッドがあります。

String#rjust (Ruby 3.3 リファレンスマニュアル)

文字列で使えるメソッドで、文字列よりも小さい数字を()に入れると、反映されません。

年月部分がずれているので、直します。 centerメソッドを使いましょう。 String#center (Ruby 3.3 リファレンスマニュアル)

例えば、center(10)にした場合、全体で10字分だった場合の真ん中に寄せてくれます。 それに合わせて数値を入力してください。 これで、カレンダーの見た目になりました。

最後は、ターミナルで年月を指定して表示する方法です。

年月を指定してカレンダーを表示する

optparse

できるようになること。

コマンドラインで引数を入力する
②引数がコマンドライン引数としてスクリプトに渡される
③ARGV(配列)を実行すると、配列の出力を得ることができる

リファレンス
library optparse (Ruby 3.3 リファレンスマニュアル)

以下のブログを参考にしました。

optparseの使い方 #Ruby - Qiita
Rubyのoptparseについて掘り下げてみる - あきろぐ

これを使って、-yと-mのコマンドを作ります。
これで年月を指定して作れるはずです。

もしかしたら、今月のカレンダーが表示され続けているかもしれません。

その場合は、yearとmonthの定義が正しくできていません。today.yearのように定義していると、永遠に今の年月が出続けます。yearとmonthを指定した数値で使えるように定義してください。

ここで注意です。もし、年月を指定しなかったら、今月のカレンダーが表示されないといけません。 ということは、定義が2つになります。どちらかを表示できるメソッドが必要になります。

完成!

だいぶざっくりになってしまいましたが、これでカレンダーが完成したのではないでしょうか?

カレンダー完成図

今回は、

cal.rb

で表示できるようになるようにはしていません。
書き直してみて良い復習になりました。実際、あまりよくわからず使っていたコードもあったので、調べる良い機会になりました。

この課題をクリアした後、合格した方のコードを見れるのですが、正解はその人の数だけありました。 他の方のコードをみて勉強になるレベルまで達したかわかりませんが、合格した時よりも、今、この記事を書いている時の方が理解が深くなっているので、定期的にコードを見るというのも大事なのだと感じました。

Rubyでカレンダーを作ったメモ。前編

フィヨルドブートキャンプのRubyのプラクティスで初めて作ったものが、FizzBuzz問題でした。 その次がカレンダー作成でした。

日報に、学んだことを書いていますが、個人的にそれをまとめたいので、記事にしていきます。 完全にネタバレなので、学習中の方、参考にする方は注意して読んでください。

カンニング防止として、コードは少なめにしてあります。

作りたいもの

  • ターミナルでcalと打った時に表示されるカレンダーの形。
  • ターミナルで./cal.rb -y 1998 -m 2のように入力したら、1998年2月のカレンダーが表示されるようにする。

下の画像はすでに完成したものを表示しています。

当日の色の反転はしません。

やりたいこと

  • 日付や時間を出せるようにして日付を操る
  • 1ヶ月分の日にちを出せるようにする
  • 西暦と月、曜日を表示する
  • 日を改行させる
  • 1週間目の日の場所を合わせる

日付や時間を出せるようにして日付を操る

Dateクラスを利用する。

class Date (Ruby 3.3 リファレンスマニュアル)

一次情報であるリファレンスマニュアルをできる限り読みましょう。私は、読み方がわからなかったので、リファレンスを避けていました。そして、遠回りした結果、結局、読まざるを得なくなりました。笑

いずれ必要になりますので、「読んでも難しい!」という方は、伊藤淳一さんが素晴らしいものを書いてくださっているので、Rubyの公式リファレンスが読めるようになる本を読んで勉強するのがおすすめです。 読んでよかった!

以下、日にちの表示の仕方です。

require 'date' # Dateクラスを読み込める

today = Date.today # 執筆日であるDate: 2024-02-25が返ってくる

# dateを使って、今の年月を表示できる
year = today.year
month = today.month

昨日を出力したい場合、

# 1を引く
p yesterday = Date.today-1 # => Date: 2024-02-24

# 今日を起点にすれば数字を変えて○日後、前が出せる
p Date.today+4 # 4日後
p Date.today-3 # 3日前

月を跨いでも、対応します。

1ヶ月分の日にちを出せるようにする

日にちの出し方がわかったので、カレンダーに近づくため、1ヶ月単位である約30日間を出したいです。 しかし、今日は毎日変わるので、加減法で月初と月末は出せません。 そこで、Ruby で月末、月初を取得 - Just do ITを参考にしました。

月初と月末、そして、配列で月初から月末まで表示できるようになりました。

eachのリファレンスArray#each (Ruby 3.3 リファレンスマニュアル)

配列のリファレンスclass Array (Ruby 3.3 リファレンスマニュアル)

日にちだけが必要なのに、西暦と月が出てしまうので、.dayにして日にちのみの出力にします。

(first_day..last_day).each do |date|
 puts date.day
end

putsとprint

putsで出力すると、

1
2
3
# 以下略

改行されてしまいます。 一方、printで出力すると

1234567891011121314151617181920212223242526272829

改行されません。

曜日毎に整えられた日にち表示は後に回します。

西暦と月、曜日を表示する

西暦と月

このように月と西暦を出したいです。 Date#strftime (Ruby 3.3 リファレンスマニュアル) を使いました。

first_day.strftime() 

のように使います。

todayでも大丈夫ですね。

日本語のカレンダーだとこうならないみたい。

"#{}”

を使うのが良さそうです。

私のMacbookだと英語表記なので上でやります。

曜日

次は、曜日の表示です。 ここの部分は変化しないので、手入力でもいいとは思いますが、メソッドを見つけたので、使いました。

class Date - Documentation for Ruby 3.3

Date::ABBR_DAYNAMESはSunのような3字での曜日の省略を配列として持っています。 やりたいことは、2字なのでいじります。 ちなみに言葉の意味としては、abbreviationの省略と曜日です。

配列の全ての要素に処理をして新しい配列を作るmapメソッドを使います。

Date::ABBR_DAYNAMES.map { |day| day[0, 2] }.join(' ') # =>Su Mo Tu We Th Fr Sa

joinメソッドで配列の間にスペースを入れました。

これで、西暦・月・曜日の表示ができました。

長くなったので、ここまでにします。 次はカレンダーのような見た目にしていく方法です。

フィヨルドブートキャンプに入会して2ヶ月が経ちました

フィヨルドブートキャンプ(以下FBC)に入会してから2ヶ月が経ちました。

2ヶ月前の私が想像した2ヶ月後の姿とは少し違いますが、明らかに知識が増えているのでOKです!

初めての記事は「FBCに入会して○日後」みたいなものと決めていました。

私自身、受講者の方のブログを読み漁って心の準備をしました。

なので、これから入会を考えている方の背中を押せたらと考えています。

結論から先に言いますと、

「入会してよかった!」

です。

フィヨルドブートキャンプ(@fjordbootcamp)さん / X

以下、その理由を綴っていきます。

「自分でもやっていけるのか不安」という理由で読んでいる方も多いと思うので、前半は今まで入会してから感じていること、後半にFBCが向いていないタイプの人」を独断と偏見で書かせてください。

まず私について

プログラミング未経験。

Progateは入会の1年前にサクッとやりました。

なので、「なんかこれ見たことある!」レベルでのスタートです。

FBCについて

いろんな方のブログを読み漁った結果、ここに辿り着いていると思うので、私の主観です。

分けて話します。

  • 知ったのは友人の紹介
  • 卒業生のWebサービスがすごい
  • わからない時はハンター試験を受けている気分になる
  • コミュニティが充実している
  • FBCに向いていない人(独断と偏見)

知ったのは友人の紹介

FBCを知ったきっかけはプログラマー8年選手の友人が教えてくれたからです。

彼は卒業生ではありませんが「見た感じカリキュラムちゃんとしてる」って言ってました。

それ以降は「やり切ればあとは何とかなる。」しか言ってきません。

その言葉があるから頑張れてる部分があります。

高校時代の友人というのもありますが、餅は餅屋なので信頼できると思いました。

困っていることをたまに聞くのですが、それ以降は、「これは卒業できれば大丈夫だわ」って言ってました。

プログラマーとはこんなものなのだろうな〜という視点で以下書いています。

卒業生のWebサービスがすごい

最近まで、外国に住んでいた関係で時差があり、コミュニティに参加できていなかったので詳しくないのですが、定期的にミートアップが開催されていて、卒業式もあります。

そこで、卒業生のWebサービスが紹介されているのですが、これが本当にすごい!(語彙力)

「こんなすごいものを作れるようになるのか…!」というワクワクと「ここに辿り着くのにどれだけかかるのだろうか…」というビクビクを同時に味わえます!

ちなみに、友人にそのWebサービスを教えてあげたら「想像以上にレベルが高くて驚いた」って言ってました。

私自身も何かサービスが作れるようになれたらと思うとワクワクが止まりません。

そのレベルに達すことができるように今は地道に頑張ります。

ただ、「受講生の3割しか卒業しない」とよくブログで読みました。

後述しますが、個人的に「かなり難しい」です。

受験勉強で勉強の仕方はそれなりに会得してきたつもりですが、そういうのとは全然違いました。

全く関係ないですが、卒業したときにもらえるTシャツがめっちゃ欲しいのでそれもモチベーションになっています。

わからない時はハンター試験を受けている気分になる

漫画ハンターハンターのハンター試験で、作中では誰も知らない料理、「寿司」を作らないといけない試験があるのですが、それに似ていると思ったからです。

どうしたらいいのか分からない状態です。

ただ、フィヨルドブートキャンプのカリキュラムはしっかりしているので、今まで学んだきたことを活用すれば、当然、寿司(提出物)は作れます。 ヒントも用意してくれています。

それでも、私は右も左も分からないような感覚に陥ります。

これはプログラマーとして就職できたときに陥るようなことを、今ここで体験させてもらっているのだと思っています。

仮になんの知識もないままプログラマー就職ができたとして、そこで「向いてない」と分かった場合、我慢し続けるのも精神的にきついと思うので、ありがたいです。

ハンター試験みたいに難しい(個人の感想です)ですが、先に進んだときの喜びは計り知れないので、私は楽しいです。

アドバイスは取りにいくもの

多くの方のブログに「質問する力がつく」とあったかもしれません。

間違いないと思います。

私は過去の経験から、質問するのが苦手なので、まだあまりできていません。

ただ、上記したようにプラクティスが難しいので、質問することを前提に作られている気がします。

質問せずに卒業するということは多分あり得ないんだと思います。

私は調べて調べてわからなくて、一度病んだ後にもう1回調べて、とやっていますが、さっさと質問したほうがいいですし、メンターさんもそうおっしゃてくれました。

質問の仕方がおかしかったら、その旨を伝えてくれますし、そのアドバイスに沿った記事のURLも貼ってくれます。

質問に対して全力でコメントをしてくれます。

ちなみに、メンターの方はもちろん、受講生の方も皆さん本当に優しいです。

入会前に私が読んだブログ記事に、「メンターさんが厳しい」のようなものがありましたが、怒られることに敏感な私でさえ「優しい」と感じます。

なので、今後は「困ったらすぐに質問するんだ!」とワクワクするように気持ちを切り替えました。

質問恐怖症克服するぞー!

コミュニティが充実している

これも他の方のブログにあったかもしれませんが、コミュニティが充実しています。

HP内にもいろいろあるのですが、カジュアルなことはDiscord内で行われています。

私の今後の目標は質問のほかに、「Discordを使いこなす」があります。

オフラインのイベントも定期的に開催されていてそれに参加したくてうずうずしています。

こんなことを書いていますが、私は家にこもってゲームするのが大好きな人間です。

優しい方達の集まりならば、そこまで緊張しないと思っています。

FBCに向いていない人(独断と偏見)

ここまで読んでいただければなんとなく分かるかもしれませんが、受け身な人には向いていません。

予備校では、先生がわかりやすく授業をしてくれますが、そもそもFBCには授業はないので、基本的に分からないことは最初は自分で調べないといけません。

それでも分からなかったら、何がどう分からないかを聞きに行かないといけないので、正直、かなり心身ともに労力を使うと思います。

ただ、それはプログラマーになった時に必須の能力だからで、FBCはそこまで想定してカリキュラムが作られているのだと思います。

プログラミングだけでなく、プログラマーとしてのあり方も学べるので擬似的にプログラマーになったら、みたいなものも学べるのかな、なんて思いました。

終わりに

まあまだ始めて60日で半分も進んでいないので、大したことは言えませんが、かなり難しいと思います。

早く卒業したい!!と思っていると痛い目を見るかもしれません。

進み具合は人それぞれなので、あなたに合ったやり方で学習していくのが良いと思います。

もしも、FBC内や卒業後!?で関わることがありましたらその時はどうぞよろしくお願いいたします。