IT's not Rocket Science!

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

【フランス語】Duolingoを300日継続しちゃったので、成果と感想を書きます

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

語学学習アプリ、Duolingoでフランス語学習が300日経過しちゃったので、成果や感想とか書いていきます。

Duolingo300日目
「しちゃった」と言うのは、まさか続くとは思わなかったからです。

200日を通り越して300日の記録ですが100と200であまり違いを感じなかったので書きませんでした。

私がなぜフランス語を学習しているかという理由は100日を達成した時の記事で書いています。 hiroblogdesu.hatenablog.com

結果的に、モチベーションはあまり変わらず、連続記録を消したくない、と言う意地でやっている部分も少なからずあります。
成果としては、全然できるようになっていないけど、なんか知っていることがたくさん増えたような気がする。(気がする)です。

意識レベルとやってきたこと

Duolingoの学習量は利用者によってまちまちだと思いますが、私は最低限の1レッスン(約2-3分)だけを毎日続けました。
100日の時は、「できる時はやりたいだけやる」と書きましたが、そう言う時があってもあえてやりませんでした。経験値のランキングが上がったのに下がるのが悲しいからです。
基本的には朝の電車に乗る前の3分間、または寝起きに済ませます。

外で学習することが多いのでSpeakingセクションはほとんどできていません。

ゲームで言うところのエンジョイ勢でログインボーナスをもらうために開いているに近いです。
「やらないよりやった方がいいよね」くらいの気持ちで続けています。

どれだけレベルアップしたの?

Duolingoのスコアによると、12らしいです。

You are currently learning content aligned with the early A1 level of CERF. In real life means you can ask and answer simple quetions.

「あなたは今CEFRの初期A1レベルの内容を学んでいます。実生活では、簡単な質問を尋ねたり答えたりすることができます。」

Duolingo English Testを読んだら、最高が160で最低値は10でした。笑

英語でA1というと英検3級程度らしいので、初期A1は中1レベルよりも低いのかな?という感覚です。
中1の2学期くらいのレベルかなーなんて思っています。

実際、英単語で言うところのlive, makeが問題に出てくるので本当にその程度です。
新しい単語もこの200日でたくさん出会いました。
記事を書いている今は317日目なのですが、初日から出会った単語数は356のようです。

文法に関しては時制にはほど遠く、単数複数、男性女性の選択問題をひたすら選んでいます。
最近は、代名詞が出てきました。

Duolingoはこんな文法があります!と教わってから問題を解くわけではないので、初見さんが多くてたくさん間違えています
モチベーションが最低限なので覚えようと言う気持ちもほぼなく、最近はレッスンクリアができないことも増えました。
ただ、何度も同じ問題を解き続けているので、やっていく内に覚えていきます。

やる気のある人が毎日30分とか続けていたら、もしかしたらA1の終わりまたは初期A2のようなより高いレベルにまで到達しているのかもしれません。1日3分だとようやく1学期が終わったくらいの量をこなしたくらいなんだと思います。

目指すは初期A2レベル

フランス語で簡単な意思疎通ができるようになりたいです。
肌感覚でしかないのですが、A2ほどのレベルがあればそれくらいのレベルなのかなと思っています。

私は英語圏に住んでいたことがあり、英語環境で働いたこともあります。ただ、英語レベルとしてはあまり高くなく、ネイティブに囲まれたら苦笑いで乗り切る程度です。

試験を受けたことがないので、断言はできないのですがB2くらいの英語力があるのかな?と思うようにしています。(強気)
その経験から、テンポよく会話をするにはB1レベルが必要だと思っていて、簡単な受け答えであるなら、初期A2までいけたら目標のレベルなのかなーなんて思います。
英検で言うと準2級ですし、今の学習量だと達成するのにあと2年くらいかかりそうなので、まったりやっていきたいです。

今後の学習スタイルについて

現在はフィヨルドブートキャンプでプログラミングの学習をしているので、それを最優先にやっていきますが、卒業したら気分転換に学ぶのもありかなと思っています。
文法がわからないとレッスンも先に進めないので、前回紹介したネットでもかなりおすすめされていた、すごくフランクに文法を解説してくれるフラ語入門、わかりやすいにもホドがある!を読もうと思います。

ずいぶん前に半分ほど読んだのですが、とっつきにくい文法をめちゃめちゃ噛み砕いて教えてくれてすごくよかったです。おすすめ!

フランス語は単語をつなげて発音したり、単語が変化しまくったり大変ですが、いつかフランス語を話す自分を夢見て、がんばるぞー!

初めての人のためのgit add -pの使い方

こんにちは、ひろきです。 現在、フィヨルドブートキャンプ(FBC)で学習をしております。
本記事では、git add -pの使い方を説明していきます。

上記の通り、私は学習中の初心者なので間違いがあるかもしれません。
その際は、コメントしていただけると幸いです。

git add -pに出会った経緯

課題に集中しすぎて、よくコミットを忘れてしまいます。

そして、初心者がコードをGitHubにプッシュする際、

git add.  

git commit -m "メッセージ"

git push origin my-branch

のコンボしかしないと思います。(偏見)

コードレビューをいただいた後の修正も、いくつかの修正を済ませた後にコミット忘れに気づき、まとめてコミットをしていました。
例えば、「〇〇できるようにし、◇◇するようにしました。」 みたいな感じです。

こういう時、コミットを分けるために、わざわざコードを戻すのも手間がかかりますし面倒です。一番はいじって元に直せなくなった時です。怖いです。

そういった悩みをFBCのメンターの方に相談をしたら、git add -pを教えてもらいました。

「そんな便利なものがあるのか!」とgit add -pで検索しましたが、簡単に記事が出てきませんでした。
必要になったら調べようと窓を閉じたのですが、すぐに必要になったので、使い方を説明してくれているサイトを探しました。笑

結果的に、一番わかりやすかったのがYouTubeだったので、その動画を参考に使ってみました。 それが以下の動画です。

Git / 知らない人に伝えたい git add -p の便利さ(初心者向け) - YouTube

この動画を見ればしっかりと理解できるので、本記事ではまとめてコミットしてしまう方向けの簡単な使い方のみを紹介していきます。

git add -pは何ができる?

簡単に言うと、addしたいファイルの「行を選択してステージングエリアに追加することができる機能」です。

git add -hで見てみましょう。

-p, --patch           select hunks interactively

patchは「更新・修正」で、hunkは「塊」ですがIT的には微妙に違いそうです。後述します。 interactivelyは「双方向の、対話式の」です。
「対話式に塊を選ぶ」でなんとなくわかる方もいらっしゃるかもですが、以下にhunkのITでの定義を説明してる方がいたので、紹介しておきます。

When comparing two files, diff finds sequences of lines common to both files, interspersed with groups of differing lines called hunks. In the context of git (and diff), what is a "hunk" - Stack Overflow

「2つのファイルを比較するとき、diffは両方のファイルに共通する行の並びを見つけ、異なる行のグループを 'hunk' と呼ばれる塊として配置します。」

2つのファイルとは編集前と編集後のファイル。

group (of differing lines) called hunks = hunkと呼ばれるgroup

hunkはgroupと同じような意味を持つ言葉ってことですね。 groupとの違いは()の中の「異なる行の」という、より具体的な塊ということになります。

つまり、「対話式に2つのファイルの異なる行の塊を選ぶ」という意味となります。

では実際に使ってみましょう。

実際にgit add -pを使います

以下のファイルを作成して、git add -pを入力します。

<h1>タイトル</h1>

<p>git add -pを使うぞー!</p>

そうすると、このように表示されます。

index e69de29..f65c6d3 100644
--- a/app/views/hoge.html
+++ b/app/views/hoge.html
@@ -0,0 +1,3 @@
+<h1>タイトル</h1>
+
+<p>git add -pを使うぞー!</p>
(1/1) Stage this hunk [y,n,q,a,d,e,?]? 

+の部分がファイルの変更部分で、ステージに追加されようとしている部分です。

そして、求められていることは[y,n,q,a,d,e,?]を選択することです。
対話式にaddをするので、このコマンドはその時選択されているコードによって変化します。

?を入力すればヘルプで解説してくれます。
わからなくなったら?で聞きましょう。

今回は、よく使いそうなもののみ説明します。

hunk = 上記にある+部分とします。

  • y:このhunkをステージに追加
  • n:このhunkをステージに追加しない
  • s:このhunkを分割してさらに小さく分ける
  • q:git add -pを終了
  • e:このhunkを手動で編集

ynはステージに追加したい部分を選択するためのコマンドです。
入力すると、その選択に応じて処理が行われ、選択された部分がステージされます。
一方で、「範囲が広すぎる!」となった場合、使えるのがseです。

質問にsがあれば、より細かいステージへの候補が現れます。
sがない場合、eを使って手動で編集しなければなりません。
vimを使って編集していきます。

今回は+<p>git add -pを使うぞー!</p>の部分だけをステージしたいとします。
e を選択すると以下を編集することになるので、

+<h1>タイトル</h1>
+
+<p>git add -pを使うぞー!</p>

不要部分を削除してください。

+<p>git add -pを使うぞー!</p>

これで保存して終了すると、 3行目だけステージされます。

確認してみます。

❯ git diff --cached
diff --git a/app/views/hoge.html b/app/views/hoge.html
index e69de29..e4ee79f 100644
--- a/app/views/sample.html
+++ b/app/views/sample.html
@@ -0,0 +1 @@
+<p>git add -pを使うぞー!</p>

ステージに追加されました。

終わりに

コミットをこまめに行えば、git add -pを使わずに済みますが、とても便利な機能なので覚えておいて損はないと思います。

また、git add -pを教えてもらった際に、コミットメッセージから先に書くと言うテクニックもご教授いただきました。 参考→ コードより先にコミットメッセージを書く - tebiki-techblog

FBCではタスクばらしを推奨しており、タスクを見ながら進めていても、私はコミットを忘れてしまいます。
しかし、タスクをそのままコミットメッセージに置き換えてみると、コミットをすると言う意識が自然と残り、コミット忘れを防ぐことができました。

「コミットメッセージを先に書く」と言う方法は目から鱗で、私にはとても効果的でした!
コミット忘れによるgit add -pの頻度を減らすためにも、皆さんもぜひ試してみて欲しいです。

フィヨルドブートキャンプに入会して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日続けられたので、今後も無理しない程度に続けられたらいいなと思います。

[追記]
300日の記事はこちら。 hiroblogdesu.hatenablog.com

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

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

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