FJORD BOOT CAMP 週報 #1 20210430 - 20210507

はじめに

現在, フィヨルドブートキャンプにてエンジニアになるべく学習中です。 広告を打っていないので, 外側からだと実際にカリキュラムでどんな事を学ぶのか週報という形で書いていきます。日報をベースに拾っていきます。

カリキュラムはこちらです。

2021-04-30

  • [Ruby]FizzBuzz 問題
    • よくある FizzBuzz 問題。何度か書いたことがあったので難なく提出。
  • [Ruby]カレンダーのプログラム
    • Linuxcal コマンドと同様の動きのものを Ruby で実装する、というプラクティス。リファレンスや他の人の日報を参考にしながら実装していった。コマンドライン上でオプションを受ける実装とか知らないことが多かった。

2021-05-01

  • [Ruby]カレンダーのプログラム
    • 昨日の続き。デバッグをしながら実装完了。GitHub の PullRequest をつくって提出。
  • [Ruby]rubygems の基本を理解する
    • 改めて gem ってなんだっけ?を理解
  • [Ruby]Bundler の基本を理解する
    • gem と Bundler って何が違うんだっけ? を学習

2021-05-02

  • [Ruby]カレンダーのプログラム
    • メンターさんからレビューをもらったのでそれを基にコードを修正し再提出

2021-05-03

  • [Ruby]rubocop の使い方を知る
    • フィヨルドブートキャンプ用にカスタマイズされた rubocop をインストール。レビュー前に rubocop を通してコードを整えてからの提出が必要となる。今まで個人でやっており我流で書いていたので変な癖が直りそう。
  • [Ruby]Ruby 中級
    • チェリー本をもとに、Ruby への内容を深める。

2021-05-04

  • [Ruby]Ruby 中級
    • チェリー本の続き。これまで学習してこなかった部分を重点的に学習する。

2021-05-05

  • [Ruby]Ruby 中級
  • [Ruby]ボウリングのスコア計算プログラム
    • Ruby でボウリングのスコアを計算するプログラムを実装するというもの。アルゴリズムをどうコードに落とし込むかが試された。

2021-05-06

  • [Ruby]ボウリングのスコア計算プログラム
    • 昨日の続き。詰まったので、どういう実装が必要なのか改めて書き出しそれをもとに調べながら実装していって提出。

完了したプラクティスと進捗

基本的には、コードはレビューがあるので提出しただけでは完了にはならない。

  • FizzBuzz 問題
  • カレンダーのプログラム
  • rubygems の基本を理解する
  • Bundler を理解する
  • rubocop の使い方知る
  • Ruby 中級

ひとこと

  • 現役エンジニアからのコードレビューがもらえる

    • メンターさんは現役のエンジニア。しかも超すごい人たちです。カリキュラム初期でGit,GitHubについて学習し、コードの提出物に関してはプルリクエストがベースです。就業前からコードレビューという経験を積めるのは良いですね。(他のスクールがどういう形なのかは存じ上げませんが)
  • 月3万円で質問し放題な環境!

    • なんでも質問!というわけにはいきませんが、自分でできるところまでやってみたところで質問をすると、メンターさんがいい感じにヒントをくれます。

フィヨルドブートキャンプは「教えて精神」の人はキツイかもしれません。ある程度自分で自発的に「助けて!わからん」と言える人じゃないとプラクティスムズすぎ、、、ってなるかも。

【格安SIM】UQ mobile からmineoに乗り換えた

SIM を mineo に乗り換えたので簡単に記録に残しておきます。

なぜ UQ mobile を契約していたのか

  • 自宅回線のサブの役割
    →モバイル回線で面接時に接続の不安があったから
  • 安定した通信品質と速度が必要だった
    →ラインモバイルを使っていた時に遅くて使えなかった経験があったから

なぜ mineo に乗り換えたのか

  • 料金が安い →キャンペーンによって月額 ¥330(3 ヶ月間)運用できる
    amazon で販売しているエントリーパッケージを使えば、SIMカード発行手数料¥440 + ¥330 * 3ヶ月 で運用できます
  • 外出が減って混雑時にモバイル回線を使うことがほとんどなくなった
    →ほとんど自宅で作業するので高速な回線が要らなくなりました

契約するならamazonエントリーパッケージを買ってから契約するのがおすすめです。

まとめ:mineo 結構良いぞ

夕方と夜に速度を測定してみましたが、下り 50Mbps、上り 15Mbps くらい出ています。 もっと遅いと思っていたので結構よいですね。 5GB 以下で足りる人には十分ありな選択肢です!

mineo気になった方はこちら↓からどうぞ。

https://mineo.jp/syokai/?jrp=syokai&kyb=Y3V0C0V4E4

自作のwebアプリケーション「ROASTERS MAP」を公開しました

アプリ概要

こちらから見ることが出来ます
ROASTERS MAP という Ruby on Rails を使った web アプリケーションを公開しました。
このアプリでは、自身がお住まいの近くの自家焙煎のコーヒーショップをマップ上で 閲覧することが出来ます。
※現在は、福岡市と東京都の店舗を表示しています

使用している技術

実装で大変だったこと

住所を入力してマップ上に表示する機能

f:id:Aseiide:20210427152401g:plain

このアプリでは、管理者画面から「店舗名」と「住所」を入力してユーザー側の画面のマップに表示する事ができます。
内部的には、

住所→緯度経度に変換→データベースに保存→viewでデータを取り出す→viewのマップ上にピンを表示

という流れなのですが、保存したデータを取り出してviewに表示するという実装に時間がかかりました。

RSpec を使ってテストを書いたこと

テストも今回初めて書きました。
RSpec の書き方や、FactoryBot を使った書き方などなど非常に多く学ぶ事ができました。
わかりやすいテストコードの書き方や、テストを書くことで実装を見直したり追加したり、テストコードの重要性を認識しました。

データベースを使ったアプリケーションの実装

これまでデータベースを使ったことがなく、今回始めて Postgres を使いました。
Rails は Active Record で簡単にデータベースとやり取りができるので詰まる事なく使うことができました。

今後実装予定の機能

  • 管理者ログイン機能の実装
  • 実在しない住所を入力した時に、保存できないようにする
  • ピンをクリックしたら名前などの詳細情報を表示する

アプリケーションのリンク/GitHub

github.com

収益化してないけどYouTubeで小遣いが入ってきた

YouTubeすごい!」という話をしたいと思います。

僕のチャンネル

コーヒーとガジェットを語るチャンネルを持っています。
住環境が変わったので最近更新できてないけど、また撮れるようになったら更新していきたい。
動画編集は写真の延長で割と好きです。

Ide 【週末珈琲クリエイター】 - YouTube

収益化はしていない

YouTubeの収益化ラインが登録者:1000人、総再生時間:4000時間なので到底及んでいません

最も再生回数の多い動画

再生回数が一番多いのはこの動画。
現時点で4.2万回で、自分でも驚いている。
ただ、ニッチだけど気になってる人が多いだろうなとは思っていたので非常にありがたい。

【楽天アンリミット】【検証】固定回線の代わりに使えるのか!?4ヶ月実際に使ったレビュー※概要欄追記あり - YouTube

amazon楽天アフィリエイトで約1万円入ってきた

楽天の動画には、紹介コードを載せていてそれ経由で8000ポイント入ってきた。
楽天ポイントで、技術書とコーヒーを買わせていただきました。
コーヒースケールの動画にamazonアフィリエイトを張っていて、それ経由で¥1000くらい入ってきた

結論:YouTubeすごい

小遣いが入ってきたのも、僕の努力というよりYouTubeというプラットフォームの強さだなと感じました。
楽天モバイルの動画が4万再生いったのも、YouTubeアルゴリズムのおかげで、その結果ポイントが入ってきた。
ここ2~3年でYouTubeが盛り上がってるけど、想像以上でした。

Fukuoka.rb 200回 LT大会 で初登壇をした

昨日の fukuoka.rb にて初めて「遅延評価勉強法を使って Rails チュートリアルをやってみた」というテーマで LT をしてきました。
準備から本番まで学びが多かったです。
スライド資料

登壇のきっかけ

僕は fukuoka.rb と 西日暮里.rb という Ruby コミュニティに参加して 1 年ほどが経過しました。
そんな時に fukuoka.rb が 200 回を記念して LT 会をやる、ということで「せっかくなら」と思い、登壇の申し込みをしました。
コミュニティに貢献したいという気持ちも大きかったです。

LT の準備

テーマフリーで、時間だけ 5 分という制約がありました。
LT 慣れしていないのでだいたい、スライド枚数 = 時間 * 2 で作るようにしています。
僕はこういう手順で LT 用のスライドを作っていきました。

  1. テーマを決める
  2. 伝えたいことを明確にする
  3. 話したい内容を箇条書きする
  4. 3 の内容をすべて入れたスライドをつくる
  5. 削れる部分は削って、収めたいスライド枚数に修正
  6. スピーカーノート(喋る内容)を書く
  7. 練習 ← 初めての登壇であれば練習したほうがいいよとアドバイスを頂いた

こうしてみると、手順が結構多いですね。4~5 時間かかりました。
もっとこうしたらいい、とか手順とかあるのかな。

本番

本番はあっという間でした。喋ってる間は、頭が真っ白になってスライドとスピーカーノートに夢中でした。

GoogleSlide の発表者モードについて

慣れてないせいですが、登壇直前になってうまく使えず、スライドとスピーカーノートが見えたまま登壇してしまいました。
次は keynote か、別の方法でスライドを作ってみようと思います。

オンライン LT の違和感

部屋に一人なので、自分の LT 中、「本当に聞いてる人いるのかな」という不安や違和感は感じていました。
ですが、youtube でのコメントやハッシュタグを追ってみると皆さんの温かいコメントで話してよかったなと感じることができました。
コメントをいただいたみなさん、ありがとうございました!!

登壇者のLT

どのLTも非常に興味深かったです。Rubyを学び始めて1年半ほど経って、以前は5%も理解できていないものが50%くらいは理解できるようになっていまいした。

個人的に刺さったLT

振り返り

伝えたい内容があまり明確にできてなかったかもしれません。
「ただの勉強法の紹介」みたいになってしまい、反省が残ります。

さいごに

司会/運営の id:udzura さんをはじめ、ご参加いただいた皆さん本当にありがとうございました。

Rubyで数を扱うクラスについて調べてみた。Float, to_f, BigDecimal, Rational

競プロをやる過程で小数の扱いがあったので深堀りしてみました。
to_fメソッドをデカい小数で扱うときに丸め誤差が出てしまった。

きっかけとなった事例

f:id:Aseiide:20210321180017p:plain
ABC196

僕が最初に提出したコードは以下

x = gets.chomp.to_f
s = x.floor
puts s.to_i

# サンプルを試す
x = 84939825309432908832902189.9092309409809091329
# => 84939825309432916635287552 # 数値が丸まっているため正解できない

RubyのFloatクラスについて

浮動小数点数のクラス。Float の実装は C 言語の double で、その精度は環境に依存します。
一般にはせいぜい15桁です。詳しくは多くのシステムで採用されている浮動小数点標準規格、IEEE (Institute of Electrical and Electronics Engineers: 米国電気電子技術者協会) 754 を参照してください。リファレンスより引用

つまり、15桁までは浮動小数点として扱うことができ、16桁以上になると IEEE754 規格に従って数値が変換される。
以下ではあるところから桁数が増えてるにも関わらず、数値が変換されていることがわかる。

f:id:Aseiide:20210321183258p:plain
to_fの挙動

また、メソッドto_fはIntegrでもStringでも使える。

Integer#to_f

self を浮動小数点数(Float)に変換します。
self が Float の範囲に収まらない場合、Float::INFINITY を返します。リファレンスより引用

String#to_f

文字列を 10 進数表現と解釈して、浮動小数点数 Float に変換します。
浮動小数点数とみなせなくなるところまでを変換対象とします。変換対象が空文字列であれば 0.0 を返します。リファレンスより引用

浮動小数点とは

聞いたことあるけどなんだっけ。ってやつだったので改めて学習した。
数字を「仮数」「基数」「指数」で表す小数のこと。

https://wa3.i-3-i.info/word14959.html

任意の精度で10進数で表現された浮動小数点を扱えるBigDecimalについて

小数について調べていくうちにBigDecimalというライブラリがあることを知った。

BigDecimalについて

BigDecimalを使うと桁数の多い小数でもきちんと扱える。
※Stringとして渡す必要があることに注意。

bigdecimal浮動小数点数演算ライブラリです。任意の精度で 10 進表現された浮動小数点数を扱えます。リファレンスより引用

require "BigDecimal"

p BigDecimal("123.1234567890123456789") # => 0.1231234567890123456789e3

どういうときにBigDecimalを使うのか

Floatで扱える範囲を超えるかどうか というのが基準になりそうな気がします。

金額の計算ではBigDecimalを使うのが良いみたいです

[Ruby]消費税計算にはBigDecimalを使いましょう - Qiita

冒頭の問題をBigDecimalを使って解いてみた

require 'bigdecimal'
 
x = gets.chomp # stringでxに格納
s = BigDecimal(x).floor # BigDecimalで浮動小数として扱って、小数点以下を切り捨て
puts s

# サンプルを試す
x = 84939825309432908832902189.9092309409809091329
# => 84939825309432908832902189

おまけ(自戒)

調べていくうちにコードを改善し、最終的には to_fBigDecimal も使わず、 to_i でかいけつできた。
脳死で.to_fやBigDecimalとするのではなく、to_iなども含めて適切なコードを使っていきたい。

番外編(追記)

Fukuoka.rb でお世話になっている @udzuraさんよりコメントを頂きました。
せっかくなのでRationalクラスについて追記していきます。

Rationalクラス

知らないクラスでした。
競プロは知らないものに出会える良い機会だなと思っています。

有理数を扱うクラスです。
「1/3」のような有理数を扱う事ができます。Integer や Float と同様に Rational.new ではなく、 Kernel.#Rational を使用して Rational オブジェクトを作成します。リファレンスより引用

example.rb
Rational(1, 3)       # => (1/3)
Rational('1/3')      # => (1/3)
Rational('0.33')     # => (33/100)
Rational.new(1, 3)   # => NoMethodError

Turbolinksについて

Railsを扱っているときによく聞くけど、わかっていなかったので概要を調べてみた。

結論

Webアプリケーションの読み込みを高速にするライブラリ

しくみ(超簡単)

現在のページの <title><body>を遷移先のページの <title><body>と入れ替えることで実現しています。

特徴

公式GitHubより

- 自動的にナビゲーションを最適化。リンクのアノテーションや、ページのどの部分を変更するかを指定する必要はありません。
- サーバーサイドの協力も必要ありません。部分的なページの断片やJSONではなく、完全なHTMLページで応答します。
- ウェブを尊重します。戻る」ボタンや「再読み込み」ボタンは、期待通りに動作します。検索エンジンに配慮した設計。
- モバイルアプリケーションのサポート。iOS および Android 用のアダプタにより、ネイティブのナビゲーションコントロールを使用したハイブリッドアプリケーションを構築できます。
(DeepLにて翻訳)

最後に

公式GitHub

日本語での解説はこれがわかりやすかった

『Turbolinks』って、なんぞ? - ryotaku's Tech Blog