Eat, Play, Nap and Code

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

lsコマンド課題の振り返り

はじめに

所属するフィヨルドブートキャンプの課題に、Rubymacのlsコマンドを作るというものがあります。 この課題は受講生の中でも難関と言われていて、Ruby学習したての頃は、lsコマンド…を作る…とは??という感じで、自分に出来る気が全くしませんでした。

25日にやっとrubocopのOKが出て、最初の提出が出来た(まだ課題の合格したわけではないです)ので、学んだことを時系列順でまとめてみようかと思います。 自分のようにlsコマンドの課題に恐れを抱いているフィヨルドブートキャンプ受講生に読んでもらえたら嬉しいです。

もくじ

かかった時間

取り組んだ期間: 2020年2月5日〜2020年2月25日(内3日休憩)

総学習時間: 56時間

目安は30時間なので、最初の提出までに2倍近くかかってしまったようです😅

無駄な日もなかなか多いんですが、初学者には寄り道も必要なんだろうな〜と思っています。

時系列

2/5(金)

やったこと

リーダブルコードを読んでいた。 親知らずを抜いてつらかったらしく、lsコマンドに関する学習はほとんどしていない。

考えたこと

名前つけるの難しすぎる。

2/6(土)

やったこと

Fileクラスのるりまを眺めるが、何も思い浮かばない。 シバンだけ書く。

考えたこと

飼ってる猫が暴れていてやる気を吸い取られていたみたい。

2/7(日)

やったこと

『たのしいRuby』のFileクラス、Dirクラスの説明を読む。 るりまがよく分からないときはこの本を読んで使いたいメソッドの概要を掴むようにしていた。

たのしいRuby 第6版

たのしいRuby 第6版

考えたこと

朝起きれなくて落ち込んでいたみたい。 受講生の方から「活動時間ではなく内容に目を向けたほうがいいのでは」とアドバイスをいただき、気を取り直す。

2/8(月)

やったこと

今いるディレクトリに格納されたファイル名を取得させることができた。 本家のlsコマンドのレイアウトについて、ファイル名の長さを変えながら試した。

考えたこと

本家lsコマンドのレイアウトはCSSのFlexboxに似ていると思った。 暴れていた猫がおとなしくなった。

2/9(火)

やったこと

21時の質問タイムで画面共有しながら質問をして、3列に表示させるメソッドを教えていただいた。 その後も自分で調べながらコードを改良して、 下記のような出力ができるところまでいった。

🍣🍰🥝🍓./ls.rb
Applications Library bin
Desktop Movies fjordbootcamp
Documents Music ls.rb
Downloads Pictures test
Exercism Public tomiyama.fjord.lt.key

考えたこと

ボウリングのスコア計算プログラムに合格できたのと、メンターのりほやんさんに「lsコマンドは難しいけど脱落する人は何故かいないから大丈夫」と言っていただき、自信がついてきた! この日質問していなかったらもっと時間がかかっていたと思うので、人に助けを求めるのは大事だ。

2/10(水)

やったこと

3列に分けたファイル名の幅のバイト数が8の倍数になっているということが分かったので、考えてコードを書いてみた。 下記のように表示させることができた。

🍣🍰🥝🍓./ls.rb
Applications             Library                  bin                     
Desktop                  Movies                   fjordbootcamp           
Documents                Music                    ls.rb                   
Downloads                Pictures                 test                    
Exercism                 Public                   tomiyama.fjord.lt.key

考えたこと

とても好調。 みんなバックグラウンドが違うので、私が4ヶ月かけて学んだことを最初から知ってる人もいるし、人と比べて進捗がどうとか考えるの無駄だな〜と思っていたみたい。 うまく行っているとポジティブな言葉も出てくる。

2/11(木)

やったこと

昨日のコードは偶然が重なり、見た目上整った出力をしているだけだと判明し修正。オプションなしのlsコマンドは完成させられた。

maxの使い方について勘違いしていて、文字列に対しmaxで取得できるのは、配列の中の最長の文字列ではなく、辞書的に1番最後になる文字列だと学んだ。↓ではbanana🍌が最長だけど、maxを使うとlemon🍋が取得される。

fruits = ["apple","banana","lemon"]
fruits.max #=> "lemon"
fruits.max_by { |fruit| fruit.size } # => "banana"

考えたこと

考えるべき変数名がとても多いので、動くものを作ることに注力しすぎて、変数名まで気が回らないと思った。

2/12(金)

やったこと

3つある必須オプション(-a-r-l)の中で、-a-rは簡単に実装できそうだったので挑戦してみてできた。 ついでにメソッドに切り出す作業にも挑戦したいのでメソッドを考えてみたが、実装には至らず。

考えたこと

optparseを使ってオプションを受け取れるようになったものの、正直どう書けばいいのかよく分からない…😅

2/13(土)

やったこと

-lオプションに挑戦。使えそうなメソッドを調べてみたり、universatoさんの記事、lsコマンドで表示されるファイルのモード(drwxr-xr-x) 〜RubyのFile::Stat#modeとは〜を読んだりした。

考えたこと

何も思いつかず、だんご屋のことを考えていた。

2/14(日)

やったこと

昨日読んだ記事のFile::Statが何なのかよくわからないので、いろいろ出力して試してみていた。

考えたこと

-lオプションに入って以降、思ったように進まなくなり、だんだん焦り始めてきた。

2/15(月)

やったこと

数字で格納されてるの情報を文字情報に変換、とか難しいことはとりあえず置いておいて、File::Statで取ってきたファイル情報から必要な情報を取り出し横に並べる、という作業をまず実装してみた。

コードは汚いものの、イメージをつけられたのでよかった。

🍣🍰🥝🍓./ls.test.rb
directory 16832 4 501 20 128 2019-09-22 22:22:44 +0900 Applications
directory 16832 5 501 20 160 2021-02-14 03:10:43 +0900 Desktop
directory 16832 8 501 20 256 2020-12-16 23:22:19 +0900 Documents
directory 16832 13 501 20 416 2021-02-08 13:15:52 +0900 Downloads
directory 16877 3 501 20 96 2021-01-09 10:45:37 +0900 Exercism
directory 16832 78 501 20 2496 2021-01-02 10:43:37 +0900 Library
directory 16832 4 501 20 128 2020-03-28 16:56:30 +0900 Movies
directory 16832 7 501 20 224 2020-03-28 16:56:30 +0900 Music
directory 16832 7 501 20 224 2021-01-18 21:27:53 +0900 Pictures
directory 16877 4 501 20 128 2018-12-28 19:00:47 +0900 Public
file 33188 1 501 20 0 2021-02-11 13:53:38 +0900 all_the_good_girls_go_to_hell
directory 16877 6 501 20 192 2021-02-04 16:09:28 +0900 bin
directory 16877 7 501 20 224 2021-01-19 00:11:01 +0900 fjordbootcamp
file 33252 1 501 20 1314 2021-02-15 21:14:54 +0900 ls.test.rb
directory 16877 30 501 20 960 2021-02-15 20:03:35 +0900 test

考えたこと

翌日が夜の質問タイムなので、-lオプションに関する疑問をまとめてみようと前向きになる。

2/16(火)

やったこと

質問タイムに参加。String#.slice(-n,m)で、文字列に対して、後ろからn番目のを起点にm個の文字を取ってくることができることを学ぶ。

"eatplaynap".slice(-3,3) #=> "nap"
"10380".slice(-3,3) #=> "380"

上を日報に書いたら、String#[]を使う方法を教えていただいた。

パーミッションが文字変換できるようになったので、見た目は目標にとても近づいた。

🍣🍰🥝🍓./ls.test.rb -l
drwx------ 4 tomiyamamiyuki staff 128 9 22 2019 Applications
drwx------ 5 tomiyamamiyuki staff 160 2 14 2021 Desktop
drwx------ 8 tomiyamamiyuki staff 256 12 16 2020 Documents
drwx------ 13 tomiyamamiyuki staff 416 2 8 2021 Downloads
drwxr-xr-x 3 tomiyamamiyuki staff 96 1 9 2021 Exercism
drwx------ 78 tomiyamamiyuki staff 2496 1 2 2021 Library
drwx------ 4 tomiyamamiyuki staff 128 3 28 2020 Movies
drwx------ 7 tomiyamamiyuki staff 224 3 28 2020 Music
drwx------ 7 tomiyamamiyuki staff 224 1 18 2021 Pictures
drwxr-xr-x 4 tomiyamamiyuki staff 128 12 28 2018 Public
-rw-r--r-- 1 tomiyamamiyuki staff 0 2 11 2021 all_the_good_girls_go_to_hell
drwxr-xr-x 6 tomiyamamiyuki staff 192 2 4 2021 bin
drwxr-xr-x 7 tomiyamamiyuki staff 224 1 19 2021 fjordbootcamp
-rwxr--r-- 1 tomiyamamiyuki staff 2079 2 16 2021 ls.test.rb
drwxr-xr-x 30 tomiyamamiyuki staff 960 2 15 2021 test

考えたこと

受講生の方々が教えてくれるのがありがたい。自分もいつかそうなりたい。

2/17(水)

やったこと

タイムスタンプで年が出てたり時間が出てたりする箇所の仕様を知るためにman lsする。

If the modification time of the file is more than 6 months in the past or future, then the year of the last modification is displayed in place of the hour and minute fields.

あまりにめんどくさそうで絶望し、レイアウトを決め打ちで整えるのだけやった。

drwx------  4 tomiyamamiyuki  staff   128  9 22 2019 Applications
drwx------  5 tomiyamamiyuki  staff   160  2 14 2021 Desktop
drwx------  8 tomiyamamiyuki  staff   256 12 16 2020 Documents
drwx------ 13 tomiyamamiyuki  staff   416  2 17 2021 Downloads
drwxr-xr-x  3 tomiyamamiyuki  staff    96  1  9 2021 Exercism
drwx------ 78 tomiyamamiyuki  staff  2496  1  2 2021 Library
drwx------  4 tomiyamamiyuki  staff   128  3 28 2020 Movies
drwx------  7 tomiyamamiyuki  staff   224  3 28 2020 Music
drwx------  7 tomiyamamiyuki  staff   224  1 18 2021 Pictures
drwxr-xr-x  4 tomiyamamiyuki  staff   128 12 28 2018 Public
-rw-r--r--  1 tomiyamamiyuki  staff     0  2 11 2021 all_the_good_girls_go_to_hell
drwxr-xr-x  6 tomiyamamiyuki  staff   192  2  4 2021 bin
drwxr-xr-x  7 tomiyamamiyuki  staff   224  1 19 2021 fjordbootcamp
-rwxr--r--  1 tomiyamamiyuki  staff  2907  2 17 2021 ls.test.rb
drwxr-xr-x 30 tomiyamamiyuki  staff   960  2 15 2021 test
-rw-r--r--  1 tomiyamamiyuki  staff     0  2 17 2021 test2
-rw-r--r--  1 tomiyamamiyuki  staff     0  2 17 2021 test3

考えたこと

コマンドを作り始める前に、manするべきだった。

2/18(木)

やったこと

rubocopは通していないものの、全体を通して動くものはできた!

考えたこと

totalの表示やレイアウトの整えがまだ残っているが、かるくリファクタリングしてrubocopにOK貰えば明日提出しよう。

2/19(金)

やったこと

totalを表示させたが、rubocopが通らず泣く。 メソッド化したいけど何も思いつかない。一方、レイアウトは課題の必須要件ではないことに気づき、確認のためにQ&Aに投稿する。

考えたこと

rubocopが通らないことで、一気に自分のコードに対する自信がなくなってしまった。

2/20(土)〜2/22(月)

やったこと

用事があって学習時間がとれないため、しばらく休む。 『リーダブルコード』の続きを読んだりしたが、花粉症に苦しみほとんど集中できず。

考えたこと

休んでいると不安になるので、やはり完全に休むべきではない。就職するまで遠出は断ろう。

2/23(火)

やったこと

21時質問タイムにほぼラジオ参加。オブジェクト指向版のlsコマンドに関する質問がを聞く。

考えたこと

メソッド化にもう一度取り組んでみようと考える。 プラクティスの合格からは遠のくかもしれないが、足らない知識をつけようという気持ちになる。

2/24(水)

やったこと

コードを一気に書き換えるのではなく、簡単なメソッドを作って試しながら、少しずつメソッド化に挑戦する。 rubocopに怒られていた箇所はクリアできた。

考えたこと

できることが増えるにつれ、自分に対する期待感からかハードルを上げすぎてしまうようで、辛い気持ちになりがちだと気づく。 Rubyの28歳の誕生日。同い年なので28年間に思いを馳せる。

2/25(木)

やったこと

メソッド化してもrubocopに怒られる。 ハッシュテーブルによる分岐数削減をようやく学び、なんとか満足していただく。

(この日なぜか参考にしようとしていた駒形さんのブログが開けずにちょっと困った)

考えたこと

やっと提出できる!全然良いコードではないけど、一応頑張ったのでレビューのたたき台レベルにはできた。

学んだこと(技術以外)

火曜の21時の質問タイムで、メンターさんや受講生の皆さんにアドバイスをいただけるのが心の支えになり課題をすすめることができました。 中でも、りほやんさんに「lsコマンドはカレンダーのプログラムを書ければ書ける」と仰っていただけたことで、自分に自信が出てきて難しくても諦めずに取り組むことができたと思います。

反省点としては、自分に対する自信が出てきたことの弊害で、課題提出までのハードルを上げすぎてしまったことです。 課題提出の条件には、rubocopを通すとありますが、気にせず一旦提出してもよかったかなと思います(メンターさんからも、「rubocopが通らないくらいならその旨を書いて一旦提出してOK」だと言われました)。

スケジュールを決めてやるのが良かったかもしれません。1週間がんばってできなければ質問する、一旦提出しちゃう、困ってると叫ぶなど。

自分ならできる!と、今の自分はまだまだだから誰か助けて!をうまく使い分けられると良いなと思います。 今後は気をつけてみよう😄