siroemk’s blog

フィヨルドブートキャンプで学んでいます(2020/11〜)

Rubyで点字メーカープログラムを書いた

f:id:siroemk:20211210144921p:plain

この記事はRubyプログラミング問題にチャレンジ! -改訂版・チェリー本発売記念-のカレンダーの10日目の記事です。

qiita.com

フィヨルドブートキャンプで学習中のsiroです!ちょうどフィヨルドブートキャンプでRubyの課題を終えたとこだったので点字メーカープログラムにも挑戦してみます💪 

目次

こちらが作ったプログラムです

こちらがプルリクのリンクです。

https://github.com/JunichiIto/tenji-maker-challenge/pull/18

今回のアドベントカレンダーで指定されていた、点字プログラムの仕様通りに作りました。

  • ✅ 対応しているもの
    • あいうえお、かきくけこ、(省略)、やゆよ、らりるれろ、わ、ん
  • 🙅‍♀️ 対応していないもの
    • を、促音、濁音、長音、半濁音、拗音・拗半濁音など
    • 異常系の入力

テストもパスしています。

f:id:siroemk:20211210162723p:plain

1. 仕様を確認する

ここからは点字プログラムを作るにあたって、調べたことを書いていきます。まずは点字の規則や点字メーカープログラムの仕様を確認します。

点字について知る

ロジックを考える前に点字について調べました。点字は縦3点が2列並んだ6点を1マスとして文字を表します。

f:id:siroemk:20211210161526p:plain

この1マスで表すことができるのは63通り*1です。日本語の場合、濁音や半濁音を考慮すると63パターンを超えてしまい、1マスでは表現することができません。そのため、濁音などは2マスで表現します。 今回のプログラムは濁濁音や半濁音を考慮せずに、主に五十音に対応するので、1マスで表現することを前提に作りました。

いくつかの点字の資料を読む限り、点字の世界では6つの点を以下の並びの数字で表すようです。

f:id:siroemk:20211210144620p:plain

例えば、「"あ"は1の点、"か"は1と6の点」と表現します。

f:id:siroemk:20211210144921p:plain

この数字は点字の世界では共通する表現のようなので、プログラム上でこの数字を活用したいと思いました。

また、点字には母音(AIUEO)は1,2,4のどれかの点になり、子音(KSTNHMR)は5,3,6の点になります。

f:id:siroemk:20211210161603p:plain

例えば、"か(KA)"の場合、Aは1の点、Kは6の点なので、それを組み合わせて、1と6の点で「か」という文字を表します。

f:id:siroemk:20211210161649p:plain

以上のことを踏まえて、今回のプログラムで関係ありそうな点字の規則は、

  • 規則1: 母音(AIUEO)は1、2、4の点で表す
  • 規則2: 子音 + 母音の組み合わせ(KAなど)は、子音の点(3、5、6)と母音の点(1、2、4)を組み合わせることで点字を作る
  • 規則3: YA YU YO WA N だけ例外

こんな感じかなと読み解きました。

点字の詳細はこちらのページから確認しました。

点字メーカープログラムの入出力を確認する

今回のプログラムは以下のように入出力します。

tenji_maker = TenjiMaker.new
puts tenji_maker.to_tenji('A HI RU')
#=> o- o- oo
#   -- o- -o
#   -- oo --

見ての通りですが、

  • TenjiMakerクラスのto_tenjiメソッドに文字列を引数として渡してputsすると、点字が出力される
  • 点字の凸をoで表す
  • to_tenjiメソッドの引数には平仮名ではなく、ローマ字(訓令式)を渡す
  • 複数の文字を引数として渡す場合、文字の間を半角スペースで区切って渡す
  • 複数の文字を引数として渡された場合、点字は1マス(縦3点が2列)の間を半角スペースで区切って出力する

このようなことが言えると思います。

2. ロジックを考える

仕様や点字について確認が終わったので、ロジックを考えます。

どうやって与えられた文字列を点字にするか

点字の数字から点字の文字列を作ろうと考えました。

例えば、「A HI RU」という文字列の場合、Aは1の点、HI は1, 2, 3, 6の点、RUは1, 4, 5の点で表せます。この数字からまずは点字用の文字列('o-----')を作り、それを出力用に体裁を整える作戦でいこうと考えました。

まず、文字から点字の数字を得なくてはいけません。

そこで、

  • 母音と子音と特定の文字(YA YU YO WA N)は定数にする
  • KAなどの"子音+母音"で作る文字列は定数から数字を組み合わせて作る

という方法で文字から数字にすることにしました。

文字から数字を得ることができたので、次はその数字を利用して点字の文字列(character)を作ります。

# HI のcharacterを作ってみる。HI は 1, 2, 3, 6の点

numbers = [1, 2, 3, 6]
puts build_character(numbers)

def build_character(numbers)
  default_characters = ['-', '-', '-', '-', '-', '-']
  numbers.each { |number| default_characters[number - 1] = 'o' }
  default_characters.join
end

# 結果 > 'ooo--o'

これで数字から'ooo--o'というcharacterを作ることができました。ただ、この時点では'123456'という並びになっています。

このプログラムの出力は'123456'という並びではなく、

14
25
36

という並びにしなくてはいけません。

そこで、このようなbuild_rowを作って、[1列目, 2列目, 3列目]という配列を作ります。

def build_row(character)
   first_row = character[0] + character[3]
   second_row = character[1] + character[4]
   third_row = character[2] + character[5]
   [first_row, second_row, third_row]
end

p build_row('ooo--o')
# => ["o-", "o-", "oo"]

良さそう...!!

でも、これが複数文字になると

# ["A", "HI", "RU"]
#点字の数字に変換して
[[1], [1, 2, 3, 6], [1, 4, 5]]

#点字characterに変換して
["o-----", "ooo--o", "o--oo-"]

# [first_row, second_row, third_row]という配列に変換して
[["o-", "--", "--"], ["o-", "o-", "oo"], ["oo", "-o", "--"]]
# あれ...
# [[1行目, 2行目, 3行目],..]となっている

複数文字を出力するときは1行目を出力して改行し、2行目を出力して改行し、3行目を出力することになります。今のままだと文字ごとに行が分かれてしまっているので、表示がくずれてしまいます。

そこで[[1行目, 2行目, 3行目],..]ではなく[[1行目], [2行目], [3行目]]という配列にしたいと考えました。

Rubyにはtransposeという行と列の入れ換えるメソッドがあるので、こちらを使って表示列の配列に変換しました。

Array#transpose (Ruby 3.0.0 リファレンスマニュアル)

# [[1行目, 2行目, 3行目],..]になっている
array = ["o-", "--", "--"], ["o-", "o-", "oo"], ["oo", "-o", "--"]
p array.transpose

# => [["o-", "o-", "oo"], ["--", "o-", "-o"], ["--", "oo", "--"]]
# [[1行目], [2行目], [3行目]]になっている

この配列に半角スペースを入れたり、改行させたりして完成です🎉 

クラスを作る上で、少し動きを変えたりしているところもありますが、大まかな流れはこんな感じで作りました。

クラスの構成

今回は3つのクラスで構成しました。

  • TenjiMaker
  • TenjiFormatter
  • TenjiCharacter

TenjiCharacterクラスで文字を'ooo--o'に変換するところを、TenjiFormatterクラスではTenjiCharacterクラスで作った文字列'ooo--o'を出力用に整える仕事をしています。

工夫したところ

工夫したところは、文字列を作るクラスと体裁を整えるクラスで分けたところです。分けたことで出力の体裁に変更があったときに修正がしやすいのではと思いました。

懸念しているところ

今回のプログラムだと問題ないのですが、濁音などの機能追加をする場合、1文字で1マス使う文字と1文字で2マス使う文字が現れるので、ロジックの中で多重配列になり扱いにくいのでは...と思っています。

本当は2マス使う文字も「ここを直せばすぐできます!ほらわかりやすいでしょ!」みたいなコードにしたかったのですが、そこまで辿り着けませんでした。

3. 作り終えて

伊藤さんへメッセージ

チェリー本2版の発売おめでとうございます🎉

チェリー本にはいつもお世話になっています。早速2版を読んでみましたが、初心者が躓きやすいところや勘違いしやすいところに丁寧に解説が付いていて、さらにパワーアップしているなと感じました。1版と2版を読み比べるのが楽しいです!笑

これからもお世話になります!

さいごに

実はここまでつらつら書いてますが、数日前まで、他の方のコードと自分のコードを見比べて「自分が書いたしょぼいコードを世に出して良いのだろうか...」みたいな気持ちになっていました。

そんなことをフィヨルドブートキャンプの分報や日報などでボソボソ呟いていたら、ワラワラと人が集まってきて「動くコードを書いて記事を公開するだけでエラい」「挑戦しただけで100点」と励ましていただきました。ありがとうございました。なんとか公開できて一安心です。

アドベントカレンダーに登録したときは "かっこいいロジックを書いて自信満々で公開する予定" だったので、あまり自信がなく悔しさ全開なんですが、他の方の知識や技を取り入れて、いつか強いプログラマーになりたいです。精進します。

参考

プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plus)

全視情協:点字とは - 点字のしくみ

点字を数学的に読み取る

*1:6つの点で単純に表せるのは64通りだが、全ての点で凸がないパターンは視覚障害者にとっては文字として読み取ることできないので63通りになる

Rails Girls Gathering Japan 2021のスタッフをやってみた

この記事は Rails Girls Japan Advent Calendar 2021 の3日目の記事です。昨日は@okuramasafumiさんの「Rails Girls Gathering Japan 2021で登壇しました」でした。

qiita.com

今日は今年の8月に開催されたRails Girls Gathering Japan 2021にスタッフとして参加した話を書いていこうと思います...!!

  • Rails Girls Gathering Japan 2021のスタッフ
  • フィヨルドブートキャンプで学習中
  • 1歳と5歳の子供がいます
  • 普段の仕事:電話やメールでお問い合わせ対応などをやっています
  • サッカーをよく観ています

スタッフをやるきっかけ

Rails Girls Gathering JapanはRails Girlsのオンラインイベントです。昨年の12月に1回目が開催され、今年8月に2回目のRails Girls Gathering Japan 2021 が開催されました。

実はRails Girlsのイベントに参加したのは、昨年12月のRails Girls Gathering Japanが初めてでした。と言うより、このイベントに参加するまで半年ほど1人でRubyRailsの学習をしていたので、こういった技術コミュニティに参加すること自体が初めてでした。

1回目のGatheringに参加してみて、私と同じように初学者が沢山いることに嬉しかったですし、「Rails Girlsのコミュニティが好きだ」「Rails Girlsで良い方向に変わった」と言う話を聞いて温かいコミュニティだな、もっと参加したいなと思ったのを覚えています。

そして、ちょうど今年の5月に「今年のRails Girls Gathering Japanのスタッフを募集しているよ」と言う話を聞いて、今がチャンスだ!と参加することにしました。

スタッフをやる上で不安だったこと

意気揚々とやってみたいと言ってみたものの、スタッフをやる上で不安だったこともありました。

  • スタッフって何をやるの?
  • 私でもできる仕事はあるの?
  • 当日に子供が体調不良になって参加できなくなったらどうしよう…
  • そもそもRails Girlsに参加したことないけど大丈夫?

など不安はあったので、開始前にスタッフのcobachieさんを紹介いただき、不安に思っていることを相談しました。(cobachieさんありがとうございます...!!)

スタッフをやってみたいけど家庭の事情ですぐに対応できないかも...とお伝えしたところ、「家庭や仕事などその他の大切なことに影響が出ない無理しない範囲でやっていこう、という前提でやっているよ」と言っていただき、不安もなくなりました。

実際にやってみてどうだったか

イベント当日を迎えるまでは、月に1~2回オンラインMTGを行い、それぞれのお仕事や役割を決めたり、進捗報告をしていました。attsumiさんが作ってくれたデザインを見てワイワイしたり、毎度とても楽しかったです。

そして、私が割り振られていた仕事も、「もし急に家庭の事情などで参加できなかったらこうしようね」と事前に決めていただいていたので安心しましたし、私としても早めに動いたり、動けなくなった時のために作業進捗はslackで報告するなど事前に動くことができたので良かったなと思います。そういった細かいところまで配慮いただき、助かりました。

開催当日にも「siroさんが嫌じゃなかったらお子さんと一緒にオープニングやってもいいからね」と言っていただき、嬉しかったです...!!(実際は子供たちはお出かけしていたので1人でやりました。子連れオープニングも楽しかったかも!?)

Rails Girls Gathering Japan 2021 当日

イベントではオープニングとタイムキーパーを担当したのですが、緊張していてあまり覚えていません。笑 イベントが終わってからTwitterで盛り上がっているのを見て嬉しかったですし、参加者も100人を超えて、準備してきて良かったな思いました。懇親会も楽しかったですね!!

Rails Girlsへの思い

今後は是非オフラインのRails Girlsにも参加したいと思っています。Rails Girlsでは託児所を用意しているところもあるようです。私のように参加してみたいけど、子供がいるから参加しにくいと思っている人も、是非一緒に参加できたらなと思っています。一緒に参加してください..!!

スタッフを終えて

この前のブログにも書いたのですが、スタッフを通して、母業をやっていても意外とできる、という自信がついた気がします。今後もどんどんチャレンジしていきたいですし、チャレンジする人を応援したいなと思っています。

Rails Girls Gathering Japan 2021に参加していただいた皆さん、 スタッフのemorimaさん、cobachieさん、yadaitaさん、neutralさん、attsumiさん!! ありがとうございました〜!!

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

フィヨルドブートキャンプで学んだことや思ったことを毎月まとめています。

今年の夏に夫の転勤で北海道から兵庫に引っ越したこともあり、バタバタだったのですが、落ち着いてきたので3ヶ月ぶりに書いてみます。

目次

今月やったこと(7〜9月)

3ヶ月間でRuby on Railsのプラクティスを進めました。

  • Rails の基本を理解する
  • Railsi18n を理解する
  • kaminari を使ってページング処理を実装する
  • devise を使ってユーザー認証を実装する
  • ActiveStorage で画像アップロードを実装する
  • Railsでユーザーフォローを作る
  • コメントを付けられるようにする

(10ヶ月の学習時間 合計730時間 86個のプラクティスのうち53個DONE!!)

ブートキャンプに入る前にRailsチュートリアルをやっていたのですが、その時はMVCなど理解できず、難しかった。でも、このプラクティスを通してRailsの最低限は理解できるようになった気がします。 

というか、このプラクティスが始まる前まで「ユーザーフォローの機能やユーザー認証なんてできるのか?」と思っていたので、自分が書いたコードで動いた時は感動しました。

github.com

ここ3ヶ月の心境の変化

自分のペースで進めるようになった

ちょうど引っ越しが決まる前まで7ヶ月ほど日報を途切れさせずに、毎日書いていました。

毎日日報を書いていると言うと、とても凄いことのように聞こえますが、この毎日書いている日報を1日でもやめてしまうと自分の気持ちがプツッと途切れて、エンジニアになれないんじゃないかみたいな怖さがあったんですよね。

日報を書いていない日はどんなに子供達の寝かしつけが遅くなろうと起きてきて作業していました。

でも、段々と日報を書くことが目的になってしまって、忙しい日は簡単な日報だけ書いて、ちょっと罪悪感が残る...みたいな悪循環になっていました。

ちょうどその時に引っ越しがあって、ネット環境がなかったり、移動なんかでPCを触れない日が出てきて、そこで初めて適度に休む方が効率が上がるということに気づきました。

そして、たとえ途中で数日間休んだとしても、自分の気持ちがプツッと切れることはなかったんだなと安心したのもあります。

ちょうどこの前のLT会のShugoさんの発表がそんな内容だったので貼っておきます。無理して進めるより、時には休みながら自分のペースで進めることを重視していきたいです。

speakerdeck.com

あと、他の人の進捗などは気にしていない方だと思っていたのですが、気付かぬうちに「あー、誰々さん、この前まで同じところやってたのにめっちゃ先まで進んでるー」みたいなことを思っていることにも気づきました。

意外と気にしていましたね。

でも、ここ数ヶ月で「私は私のペースで進んでいくぞ!」という気持ちが強くなったので、他の人の進捗はあまり気にならなくなりました。

最近は「おお!誰々さん、この前まで同じところやってたのに、めっちゃ先まで進んでるやん!すご〜!今度教えてもらお〜」みたいな気持ちに変化してきました。

分からないことやエラーが怖くなくなった

最近は「分からないこと」にも耐性がついてきている気がします。

以前までは「ここもここも分からんー。進まんー。ガーン」みたいな気持ちが正直ありました。

でも、ブートキャンプのプラクティスで、何度となく『分からない壁』を乗り越えてきたので、最近は「はいはい、出ました!分からんやつ!でも調べたら絶対分かると思う!」みたいな根拠のない自信がついてきました。

ただ、質問するタイミングは遅いので(もうちょっと調べたらできそう...と思って粘ってしまう)そこはもうちょっと時間を決めて、サクッと質問しないと...と思っています。

エラーに関しても、「エラーが出てくれるだけありがたい、ヒントありがとう!」と思うようになってきました。

イベントスタッフやオーガナイザーをやることで自信がついた

8月にはRails Girls Gathering Japan 2021のスタッフを、そして先週10月頭にはブートキャンプでLT会のオーガナイザー(主催者)をやりました。

この2つのイベントのスタッフ業を通して、いろんなところで褒めていただいたので、とても自信がつきました。

私は子供2人いるのですが、子供を産んでから、母としてこうあるべきとか、全力で家事育児をやるべきみたいな固定概念がいつの間にかできていて、その概念のせいで「仕事が大好きだけど子育てのためにほどほどにしよう」とか、「エンジニアやりたいけど、育児があるから諦める」という気持ちになっていました。子供が産まれてから「自分がやりたいこと」へのストッパーをかけていたなと最近感じています。

でも、2人目の産休中に「もっと自分がやりたいことをやっていきたい」と思い、独学で学習をしたり、フィヨルドブートキャンプに入りました。

そこでイベントのスタッフなどに挑戦する機会をもらい、「母業をやっていても、意外とできる」という自信がついてきました。家族も協力してくれていてとても助かっています。

今はやったことないことにどんどん挑戦していきたいという気持ちが強いです。

今月やること

この3ヶ月間、プラクティスの進捗はスローペースですが、代わりに得たものが多かったです。

今月は『自動テスト』と『オブジェクト指向プログラミング』まで進められたらいいかなと思っています。

今月もゆるーくやっていきます!

過去の記事

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

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

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

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

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

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

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

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

フィヨルドブートキャンプで学んだことや思ったことを毎月まとめています。

目次

今月やったこと(6月)

先月、このような簡単なメモアプリをSinatraで作りました。 メモの作成や編集、削除などができるシンプルなアプリです。メモのデータはファイルに保存しています。

f:id:siroemk:20210607162609g:plain

今月はこのメモアプリのデータ保存先に手を加えました。 データの保存先をファイルからDBに変更しています。

github.com

先月の記事はこちら

DBアクセスのライブラリにはpgを使用しています。

pgの使い方をいまいち分かっていない状態で、「なんかカッコいいからデータアクセス用のMemoクラスを先に作っちゃお〜」と進めていると、案の定エラーが出てかなり時間を溶かしました。(結局最初から書き直した)

初めからカッコいいコードを書こうとするのではなく、汚くてもまずは動くコードを書いてからリファクタリングしていこうと誓った。

思っていたより時間がかかりましたが、無事OK出たので良かったです。7ヶ月で550時間ほど学習し、プラクティスの進捗60%です。

輪読会に参加するようになった

フィヨルドブートキャンプでは現役生主体で輪読会をいくつか開催しています。

その中でも『プロを目指す人のためのRuby入門』(通称チェリー本)の輪読会にたまに参加しています。(ラジオ参加ですが)

一人で読むとサラーっと流してしまうようなところでも、みんなで読むと新しい意見や疑問点が出てきて、聞いているだけでも勉強になります。

チェリー本の著者の伊藤さんはフィヨルドブートキャンプのメンターなので、分からないことをすぐ聞けるのがいいですね。

チェリー本の輪読会は平日朝9時からやっているので1日の生活リズムもできて良さそう。

何より「輪読会仲間がいるから今日もちょっとやってみるか〜」という気持ちになり、継続するキッカケになる気がします。

点と点が繋がってきて楽しくなる

フィヨルドブートキャンプに入って7ヶ月経ち、少しずつ分かることが増えてきた気がします。

入った頃は

  • HTTPのメソッドって何?
  • DBって何?
  • Gitってどうやって操作するの?
  • Rubyって?るりまの読み方が分からん...

と知らない単語だらけで未知の世界でした。それぞれがどう繋がるのかも分からない。

独学の頃にRailsチュートリアルをやっていたのですが、「defって何だろう...」「routesってよく分からん...」というように、何が何だか分からないまま進めていました。

フィヨルドブートキャンプではRailsに触れる前に、HTMLやCSSSQLLinuxRuby、HTTP、Gitなどを学習するので、分かることが少しずつ増えてきて点と点が繋がっていく実感があります。

今まで全く分からなかったRailsを使いこなせるかも!?とワクワクしています。プログラミングって楽しいな〜!

Rails Girls Gathering Japan 2021のスタッフとして参加することになりました

8月28日にオンラインで開催される「Rails Girls Gathering Japan 2021」のスタッフとして参加することになりました。

去年の12月にRails Girls Gatheringに参加してみて、技術的なことを学べるのははもちろん、「RubyRailsのことが好きだ」という人たちが集まっていて温かいコミュニティだな〜と思っていました。

まだまだスタッフとして力になれているか微妙ですが、どんどん盛り上げていきたいです!

キーノートもLTもセッションも、とても楽しみです。

LTの発表者も募集しているので良かったら応募してみてください〜!

railsgirls-japan.doorkeeper.jp

7月も頑張るぞ〜。

過去の記事

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

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

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

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

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

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

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

フィヨルドブートキャンプで学んだことや思ったことを毎月まとめています。

目次

今月やったこと(5月)

Sinatraでメモアプリを作った

Sinatraでこのような簡単なメモアプリを作りました。

f:id:siroemk:20210607162609g:plain

メモの登録や削除、編集ができます。

課題の条件で「データ保存先はDBではなく、ファイルへ保存する」という指定があったので、メモが追加されるたびにJSONファイルに書き込むような構成にしました。

久しぶりにCSSやHTMLも触りました。

github.com

Sinatraのアプリ作成で学んだこと

フィヨルドブートキャンプの受講生の方へ。Sinatraラクティスのネタバレあるかもです。

1. 登録されたメモにIDを振る

メモを編集したり、削除するときに「どのメモか」判断するためにIDが必要です。

このID付与方法に悩みました。

初めに思いついたのが、「メモが登録されるたびに、dataディレクトリにJSONファイルを作るようにし、ディレクトリ内のファイル数をカウントして、+1した数字をIDにする」でした。

でも、これだとファイルを削除した時にIDが一意ではなくなってしまうので却下...。また、全く同時に作成された場合も一意で無くなってしまう。

そこで、SecureRandom.uuidを使って、ランダムな文字列を生成し、その文字列をIDとして使うことにしました。

docs.ruby-lang.org

2. DateTimeクラスではなく、Timeクラスを

SecureRandom.uuidを使うと、一意のIDを付与することはできるけど、連番のIDではないので、登録した順に表示させることができない...

ということで、メモの登録時間をDateTimeクラスでとることに。

しかーし、DateTimeクラスは非推奨になっている...とのことで、Timeクラスに置き換えました。

DateTime は deprecated とされているため、 Timeを使うことを推奨します。

docs.ruby-lang.org

3. XSS対策としてメモ保存時にhtmlをエスケープするような処理を書いていた

XSS対策としてRack::Utilsのescape_htmlを使いました。 Sinatraではhelpersに定義しておくとどこからでも呼び出せるので、helpersにhメソッドを定義しました。

#app.rb

helpers do
  def h(text)
    Rack::Utils.escape_html(text)
  end
end

そして、初めは「保存時にエスケープするようなコード」を書いていました。

# app.rb
# 省略

post '/memos' do
  memo = { "id" => SecureRandom.uuid, "title" => h(params[:title]) , "content"=> h(params[:content]), "time" => @time }
 # 省略(JSONファイルにmemoの内容を書き込むようなコード)
end

でも、このままだとユーザが入力した値を加工して保存することになってしまう。

メンターさんから「場合によってリッチテキストエディタなど、タグをそのまま表示したいってケースもあるので、エスケープの処理は保存時ではなく表示時にやるのが良いよ。」とアドバイスをいただき、viewsの方でエスケープするように書き換えました。

4. CSSでfooterを固定する

f:id:siroemk:20210607154807p:plain ちょっと分かりにくいですけど、コンテンツの中身が少ない時にfooterが上に来てしまう状態でした。画面サイズに合わせてfooterが下にくっつくようにしたい。

フィヨルドの町田さんに「flexbox使ったら簡単ですよ」と教えていただき、試してみることに。

動きを試したcodepen

flexboxで「横幅の片方が固定・片方が可変」というパターンを実装できるので、それを応用してfooterを固定し中身のコンテンツを可変にしました。

5. 空ディレクトリはGit管理できない 

「よし!できたぞ〜!」とGitでaddしようとしたところ、ファイル保存用の空ディレクトリがaddできない...

「このディレクトリがないとエラー出るし...postのところにコードを書き足す?dataディレクトリがなければ、新しく作るように条件を追加するのか...」と分報でつぶやいていたら、アドバイザーさんから.gitkeepなるものを教えていただきました。

空のディレクトリをGit管理したい場合は、ディレクトリ内に.gitkeepという空ファイルをあげておく。

この作戦でaddできるようになりました。

メモアプリを作った感想

初めてSinatraを触ったのですが、動きがシンプルで使いやすかったです。SinatraREADMEを読みながら、手元でコードを動かしてみると理解しやすかったです。

フィヨルドブートキャンプに入る前にRailsチュートリアルやprogateのRailsをやっていたので、スーッと頭に入ってきました。もっと複雑なアプリを作りたいので、引き続き続けていきたいです。

来月やること(6月)

6月は、このメモアプリのデータ保存先をJSONファイルからDBに変更します。

今月もガシガシやっていきたい気持ちはあるのですが、家庭の事情で遠方に引越しすることになりバタバタなので、ゆっくりやっていきます。

娘たちの保育園が無事決まりますように。

過去の記事

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

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

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

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

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

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

フィヨルドブートキャンプで学んだことや思ったことを毎月まとめています。

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

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

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

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

目次

今月やったこと(4月)

  • SQLを学んだ
  • 「達人に学ぶDB設計」を読んだ
  • 「楽々ERDレッスン」を読んだ
  • DB設計について学んでER図を描けるようになった
  • ブートキャンプ内のLT会に参加した

今月は70時間ほど学習していました。

データベース設計は難しい

今月はDB設計を中心に学習を進めました。 DB設計の本は概念的な説明が多く、専門用語ばかりで、理解するのにかなり体力を使いました。

その都度、質問したり本を読んだりしていますが、正直まだ理解できていないところが多いです。

NULLはよろしくないのか

たくさん分からないところはあったのですが、一番分からなかったのがNULLについて。

DB設計の本やブログ記事などで「DBにはnullを極力使わない」という表現がありました。

おそらく

  • 可能な限りNULLを使わない
  • しかし、場合によってはNULLを完全に禁止してしまうと不都合が出ることもあるので、NULLが許容される場面もある

ということなのかなと思います。(違うかも)

私のような初学者の場合、知識がないので「NULLが許容される場面」がいまいちしっくり来ませんでした...

DB設計は慣れが必要なようなので、多くのDBを見たり、より多くのエンジニアの意見を聞くことで「ここはNULLを許容しても良いだろう」と丁度良い塩梅が分かってくるのかなと思っています。

5ヶ月でどれくらい進んでいるの

嬉しいことに「フィヨルドブートキャンプに入る前にこのブログを参考にしました!」と言ってくれた方がいらっしゃいました。

そんな方のためにも(?)5ヶ月間でどれだけ進むのか、調べてみました。

f:id:siroemk:20210507110231p:plain

470時間ほど学習して50%ほどのプラクティスを完了しています。

「5ヶ月毎日学習しているのにまだ半分か」という気持ちもあれば、「もう半分学習したのに分からないことだらけだ...沼だ...」という気持ちもあります。

フィヨルドブートキャンプの学習時間は900時間弱と公式サイトに書かれていますが、私の場合、もう少しかかりそうです。

f:id:siroemk:20210507110601p:plain

周りの方を見ていても1000時間を超えてる方もいらっしゃいますし、これから入会される方は1000時間以上かかることを見越して時間やお金の準備をすると良いかも...

(フィヨルドブートキャンプ内でも1000時間かかるのは大変すぎる&卒業のハードルが高いのでは...という問題があり、もうちょっと短くできないか検討、改善されているようです、多分)

仕事と育児とプログラミング学習はハードだ

そして、実は先月まで育休だったのですが、今月から仕事再開しました。

0歳と4歳の子供がいて、1日7時間働きながら家事や子供の面倒を見るのは本当に大変です。隙間時間で学習しています。

以前のように学習時間を取れないことに焦ってしまいますが、今のところ解決する術はないので、身体を壊さない&挫折しないことを目標にゆっくりと進めていきたいです。

来月やること(5月)

5月はSinatraを使ってメモアプリを作っていきます。

こう書いている私はSinatraのことを1ミリも分かっていません。笑

来月は「メモアプリ作ったぞ!」とブログを書きたいですね!

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

フィヨルドブートキャンプで学んだことや思ったことを毎月まとめています。

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

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

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

目次

今月やったこと(3月)

  • Rubyでlsコマンドを作った
  • Rubyでwcコマンドを作った
  • HTTPとCookieを理解した
  • telnetで遊んだ
  • nginx で VirtualHost を使って複数のドメインのサイトを作った
  • nginx で SSL対応サイトを作った
  • 競プロをやっていた

こうやって書き出すとたくさんのことをやっていますね。今月も100時間くらいやっていました。

lsコマンドに辿り着いた

フィヨルドブートキャンプと言えば(?)、lsコマンド作成の課題が大きな壁だと思います。

フィヨルドブートキャンプに入る前に「lsコマンドというものを作るらしい...lsコマンドって何...」と調べていました。当時は全く分からなかった。

lsコマンドの課題に辿り着いたことが感慨深かったです。

大きな問題を小さく分解する

lsコマンドのプラクティスに「大きな課題は小さく分解しよう」と助言があるのですが、これが一番大事なことだなと思いました。

私は鉄腕DASHが好きで毎週見ているのですが、この番組では反射炉を作っています。

いきなり反射炉を作ろうとするのは難しいけど、

  • 反射炉とは何か調べる
  • どんな作りになっている?
  • レンガを作るにはどんな土を使う?
  • レンガを組あげるには?
  • レンガでアーチを作るには?

というように、大きな問題を小さく分解して作っていきます。

「今から反射炉を作ってください」と言われると途方にくれそうですが、「レンガ作りに適した土を探してください」と言われるとまだできそうな気がしますよね。

lsコマンド作りも同じように、まず、lsコマンドの動きを確認して、どのクラスやメソッドが使えそうか、考えました。

この作戦のおかげであまり詰まることもなく、楽しかったです。

分報が楽しい

フィヨルドブートキャンプのコミュニケーションツールがslackからDiscordに変わりました。そこで分報チャンネルを作ってワイワイしています。

分報とは「今何をやっている、何に困っている、お腹すいた」などTwitterのように簡単にメモするものです。 自分専用の分報チャンネルを作って色々呟いてます。

f:id:siroemk:20210402155102p:plain

他の人が何を考えているのか、どこで困っているのかなど、目に見えてわかるので参考になるし、気楽に呟いたことに対して助言をもらったりできるので最高ですね。

何より、「分報チャンネルがあったらいいかも」という意見が出たその日のうちに、みんなが分報を始めたのが最高だった。

良いと思ったものはどんどん試していく姿勢が良いな〜と思っています。

(分報も、もっと良い何かが出てきたらそちらに移り変わるかもしれない。)

来月やること(4月)

4月はデータベース設計をやっていきます。

専門用語が多くて、既に理解に苦しんでおりますが、新しい知識が増えていくのは純粋に楽しいので、どんどんやっていくぞ〜!