hiro_env

モダンな技術スタックを扱う会社のエンジニアになるまでの学習記録

『プロを目指す人のためのRuby入門』の感想(短め)

良かったこと

  • Rubyの基礎的知識、基礎的機能の知見を一通り(?)得ることができた

学んだこと

  • 他の言語とは異なる連想配列の書き方、シンボルの意味や使い方
  • ブロックの存在やProcオブジェクトについて
  • ブロックの後に続けてメソッドをチェーンできるなど、特殊な書き方
  • return を書かなくても最後の値が返り値になる


などなど様々..

難しかったこと

  • Ruby特有の書き方をすんなり理解できるようにすること(例えば例外処理がraise rescueのように他言語とは全く異なる単語を使うことや、上記の学んだことに記載の項目など)

コードの実践での感想

実務ではC#JavaScriptを使用しておりメソッド名にlowerCamelCaseを使うことが多いため、snake_caseを使うというのは最初意識しないとできませんでした。
また、メソッド名の最後の?やsetterメソッドの=も最初は戸惑いました。その辺りはコードをたくさん書いていくことで慣れていきたいです。

ただこの本を読み終えたことで著者である伊藤さんがおっしゃっていた「インデックス」を頭の中にある程度作ることができたのではないかと感じています。
今後もRailsなどを学びながらもまた本書に何度か立ち返り、そして今より経験を積んでから、いずれ再度通して読み返してみたいと思います。

Ruby optparseの使い方(基礎)

optparseとは

optparseはrubyスクリプトファイルを実行する際に、Unix系OSのようにオプションを指定することができるようにするRubyのライブラリです。

公式

docs.ruby-lang.org

使い方

Rubyに組み込まれている標準ライブラリのため、gemをインストールする必要はありません。
require 'optparse' で使用することができます。

基礎構文:

require 'optparse'

opt = OptionParser.new
opt.on('-オプション名 ヘルプの際に表示されるパラメータの内容', オプションに渡すパラメータの型, 'オプションの説明') do |渡されるパラメータ|
  行う処理
end
opt.parse!

opt = OptionParser.newインスタンス化を行いopt変数に格納します。
opt.on()の引数の中でオプションの設定を行い、do~endのブロックの中で実際にオプションで渡されるパラメータを使う処理を書きます。
最後にopt変数のparse!メソッドを使い、解析を行います。

解析とは

Rubyスクリプト言語のため、実行した際に処理が行われます。
Rubyが実行される際、ARGVというグローバル配列に実行時のオプションが配列で記録されます。

例(-mで月を指定できるようにするカレンダーのスクリプトのオプションの場合):

require 'optparse'

# オプションがなければ現在の月を指定する
options = { month: Date.today.month }

# calendar.rb内のオプションの処理 (-m で指定された月をoptions[:month]に代入する)
opt = OptionParser.new
opt.on('-m Month', Integer, '1~12の数字で月を指定してください') { |month| options[:month] = month }
opt.parse!


# 実行する際 (コードの中ではなくターミナルなどのCLIから実行)
ruby calendar.rb -m 8 

この例文を実行する際には、ARGVに["-m", "8"]が格納されます。
解析とは、ARGV配列からオプションを読み取り、処理を実行することを指します。

.parse!は自動でARGVの配列が渡るようになっていますが、
あえて冗長に書くなら.parse!(ARGV)のようにこの配列を引数に渡すこともできます。

このようにruby ファイル名 -m 8 を実行した際、インスタンス化したオプションの設定が入っているopt変数を最後にparse!で解析することで、オプションの機能を実現しています。

補足

  • ARGVにはString型で全てのオプション、及びそのパラメータが格納されていますが、パラメータはopt.onで指定した型に自動的に変換されます。
    指定しない場合、デフォルトのStringとして文字列で受け取ります。(処理の際必要に応じて型変換が必要になります)

  • オプション名以外は全て省略することもできます。

  • オプションにパラメータを指定しない場合、ブロックパラメータはtrueかfalseになります。

RailsアプリをDocker環境で構築する

手順

以下を行います。

  1. Gemfile / Dockerfile / docker-compose.ymlを作成する。
  2. コンテナを立ち上げて中に入り、rails newを実行してプロジェクトを作成する。
  3. rails db:createでPostgreSQLにデータベースを作成する。
  4. rails sでサーバーを起動する。

※ 今回バージョンは特に気にせず、コードに記述したものを使います。

後にdocker-compose.ymlのwebのvolumesセクションに記載する通り、そのディレクトリとコンテナ内のrails-appディレクトリをマウントして繋いで ローカルで開発を進めコンテナで実行しているアプリケーションにブラウザから接続できるようにしていきます。

ローカルPCでの準備

まず、プロジェクトのディレクトリを作成しそこに移動します。

必要なファイルを作成します。

Gemfileを作成する

source 'https://rubygems.org'
gem 'rails', '~>5.2'

Dockerfileを作成する

FROM ruby:2.5
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn
WORKDIR /rails-app
COPY Gemfile /rails-app
RUN bundle install

docker-compose.ymlを作成する

version: '3'

volumes:
  db-data:

services:
  web:
    build: .
    # イメージ名に指定したい名前を記載
    image: rails-blog:latest
    ports:
      - '3000:3000'
    volumes:
      - '.:/rails-app'
    environment:
      - DATABASE_PASSWORD=postgres
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

  db:
    image: postgres:12
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - POSTGRES_PASSWORD=postgres

必要なファイルの作成が終わったら、docker-compose up -dでコンテナを立ち上げましょう。 -dはデタッチモードにするオプションで、コンテナをバックグラウンドで実行してくれます。

docker-compose ps -aでコンテナの状態を確認し、SERVICEという項目にあるwebとdbがそれぞれdocker-compose.ymlのservicesセクションで設定した名前です。
どちらもUpになっていれば、docker-compose exec -it web bashというコマンドでコンテナの中に入ります。
そこで、Railsのプロジェクトを作成しましょう。 rails new . --force --database=postgresql --skip-git 完了後にlsを実行して、Railsプロジェクトのファイルやディレクトリが生成されていたら成功です。

ここまでくれば、ホストとコンテナをマウントしているため、一度exitでコンテナから出て好きなエディタを用いて作業を行っても大丈夫です。 データベースの接続情報を設定するため、config/database.ymlを編集します。

default: &default
  adapter: postgresql
  encoding: unicode
# ここから追加
  host: db
  user: postgres
  port: 5432
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
# ここまで
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

最後に、データベースを作成します。 一度exitした場合はもう一度コンテナに入り、以下のコマンドを実行します。

rails db:create

これができたら、あとはサーバーを起動するだけです。

rails s -b 0.0.0.0

ブラウザでlocalhost:3000へ接続して確認します。 RailsYay! You’re on Rails!というページが表示されたでしょうか。


DBの活用

作成したデータベースに、マイグレーションでテーブルを作成して簡単な機能を作ります。
サーバーを起動している場合はCtrl + Cで停止し、コンテナで以下のコマンドを実行します。

rails g scaffold example name:string price:integer

これでマイグレーションに必要なファイルが作成されたので、rails db:migrateを実行します。

最後に、localhost:3000/examples に接続してExampleを登録、編集、削除することができるページが作成されていれば成功です。


これで簡易的なコンテナでのRails環境構築は終わりです。
お疲れ様でした。

Happiness Chain Euforia 1か月目の振り返り

Happiness Chain Euforia

Happiness Chainというスクールの新しく始まったEuforiaというコースで12月1日より0期生として学ばせていただいております。
その活動の一環として、これから毎月月末に記録を残していきますが、今月は12月ということで少し早いですが記事を投稿します。

ということで、今月の自分の振り返りと感想を記載します。

良かったこと

  • 勉強する習慣がついた
    • 入会前は毎朝毎晩に勉強する習慣がなかったが、時間を記録することやカリキュラムにある単元を理解して先に進むという目標、 また毎日のタスクを宣言や週間進捗報告会などの取り組みがあるため自然と習慣が付いてきた。
  • 朝早起きし始めた
    • 夜中に起きて勉強するより、毎日コンスタントに朝早く起きて勉強する方が続けやすいことに気が付き、以前より早寝早起きをするようになった。

悪かったこと

  • 運動する時間が少ない
    • 学習と直接的には関係ないが、机に向かう時間が増えたため運動をしたいと思いつつ、まだ完全に習慣づけられていない。
  • まだまだ無駄な時間が多い
    • 仕事の時間は仕方がないが、他にも建設的ではないことに使っている時間がまだまだある。

改善すること(ネクストアクション)

  • 休憩・作業のメリハリをつける
    • 休むことは必要だと思うので、必要な時間だけあらかじめ決めておいてその時間にちゃんとリフレッシュをし、無駄な時間を減らして学習や作業をする時間をより増やす。
  • 運動習慣をつける
    • 運動することは健康にもストレス解消にも効果的であるし、学習にも良い影響があると思うので朝に運動をする。

来月の目標

  • 今月より学習時間を増やす
  • ロードマップと呼ばれるカリキュラムを自分で立てた予定通りに進める
  • 運動の習慣化

GitHub Pagesの使い方

GitHub Pages とは

  • GitHub Pagesは、作成したページを簡単に公開できるサービスです。
  • 無料のホスティングサービスのため、アカウントがあれば誰でもページを公開できます。

GitHub Pagesの使い方

  1. GitHubアカウントを作成: まず、GitHubのウェブサイトにアクセスしてアカウントを作成します。

  2. 新しいリポジトリを作成: 「New repository」をクリックして新しいリポジトリを作ります。

  3. コンテンツを追加: リポジトリソースコードや画像などのコンテンツを追加します。(作成したHTMLやCSS, JSをブラウザ上で追加、もしくはローカルからプッシュします。)

  4. GitHub Pagesを有効にする: リポジトリの設定(Settings)に移動し、画像の真ん中より下にある「Pages」セクションへ移動します。

    Pagesの場所を示す画像
    Pagesの場所

  5. ブランチを選択する:公開したいブランチを選択し、saveボタンを押下します。

    ブランチの選択とsaveができるGitHub PagesのSettings画面の画像
    ブランチの選択、saveボタン

  6. サイトを公開: 数十秒から数分でウェブサイトが公開されます。URLは公開後に設定ページをリロードすると上部に表示されます。

  7. URLにアクセス: 表示されたURLにアクセスして、作成されたページが公開されていたら成功です。

うまく表示されなかったり、ファイルやフォルダ名が表示されてしまったりする場合、URLにページまでのパス(/ディレクトリ名)を追加してみてください。

Vimの操作について

Vimの基本的な操作についての備忘録記事です。
内容はvimtutorを参考にしています。(実践ということでVimを使って記載)

個人的な話ですが、

  • 忘れないように身につくまでは週に何回かvimtutorをやる
  • VSCにプラグインを入れて使う

以上の2つを実践していきます。

モードについて

vimには4つのモードがある。

ノーマルモード

Vimを開いた時のデフォルトのモード コピー、ペースト、削除が簡単に実行できる。

主な操作

コマンド コマンドの意味
k 上の行に移動
j 下の行に移動
l 右に移動
h 左に移動
yy 1行yank
dd 1行delete(切取)
dw 1単語切取
d + (数字) + w 数字分の単語を切取
d + (数字) + b 数字分の単語を逆方向に切取
p 次の行にput
P 前の行にput
c c+wや$で指定範囲の編集(change)
gg 一番上の行に移動
G 一番下の行に移動
数字+G 指定した行数に移動
0 その行の先頭まで移動
$ 行末まで移動
数字+l/h 指定した文字数分左右に移動
数字+w(以下数字なく単体でも使用可) 指定した単語をスキップして次の単語の最初の文字に移動
数字+e 指定した数の単語の最後の文字に移動
数字+b 指定した単語分逆方向にスキップして単語の最初の文字に移動
数字+ge 指定した単語分逆方向に移動して単語の最後の文字に移動

※補足
yyやddは2ddのように頭に数字をつけることでその行数分実行できる。また、$は行末までを意味する。

下記aの先頭で3wを実行するとaaa bbb cccをスキップしてdの先頭まで、3eを実行するとcの最後の文字までカーソルを移動する。
aの最後にカーソルを合わせて3eとするとdの最後になるが、これはvimが空白で単語を認識しており、カーソルがある場所(その場所は除く)から数えて3つ目の単語の最後の文字がdになるからである。
一方でaの最後で3wを実行してもdの先頭に移動する。これは前述の通り単語がスペース区切りで認識されているため、自身を除いて(次の文字から)3つ分のスペースをスキップしながら3つ目の単語の先頭を指すという挙動をしているためである。

[aaa bbb ccc ddd]

インサートモード

文字列を入力できるモード 実際に文字を入力する際はこのモードを使う。 ノーマルモードでiやaを押すことで移行でき、ノーマルモードに戻るにはEscを押す。

主な操作

コマンド コマンドの意味
i カーソルの前からインサート(insert)
a カーソルの後からインサート(append)
o 次の行からインサート(open a new line)

ビジュアルモード

視覚的にテキストの選択を行うことができ、指定した範囲に対して操作を行うことができる。 ノーマルモードでvを押すことで起動でき、Escでノーマルモードに戻る。

コマンドラインモード

ファイルの保存や終了を実行することができる。 ノーマルモードで:を押すことでコマンドを入力することができる。

主な操作

コマンド コマンドの意味
:w セーブする(wirte)
:q vimを終了する
:wq! 強制的にセーブして終了
:set number 行数を表示する
:数字 指定した行数まで移動(normalの数字+Gと同じ)

※ !で強制的に実行、複数のコマンドも組み合わせて使える。

基礎的なLinuxコマンドの備忘録

  • cd
  • pwd
  • ls
  • mkdir
  • rmdir
  • cat
  • less
  • tail
  • touch
  • rm
  • mv
  • cp
  • ln
  • find
  • chmod
  • chown
  • ps
  • kill

以上のコマンドについて、順番に使い方を記述していきます。

cd

change directoryの略
ディレクトリを移動する。

絶対パス相対パスが使える。宛先を指定しない場合はcd ~と同じくホームディレクトリに戻る。
また、cd - で直前にいたディレクトリに戻ることもできる。

例:cd - / cd .. / cd somedir

pwd

print working directoryの略
現在いるディレクトリを表示する。

ls

listの略
今のディレクトリ配下にあるディレクトリやファイルを一覧表示する。

主なオプションとして、-a (隠しファイルやディレクトリも表示), -l (long format のl 詳細情報を表示する) 等がある。

mkdir

make directoryの略
ディレクトリを作成する。

例:mkdir somedir

rmdir

remove directoryの略
ディレクトリを削除する。

例:rmdir somedir

cat

concatnateの略
ファイルの中身を表示する。

  • 本来は英語の「連結する」という意味通り複数のファイルを繋げることを目的に作られた。
    例:cat file1.txt file2.txt > combined.txt

less

長いファイルを1画面で収まる範囲で区切って表示する。

  • -Nオプションで行数を表示してくれる。
  • 次の画面に進むにはFowardのf(もしくはSpaceキーでも可)を、前に戻るにはBackのbを押せば良いので覚えやすい。
  • 半分進むにはDownのd、半分戻るにはUpのuという操作も可能。
  • gで最初の行に移動、Gで最後の行に移動する。
  • 数字+gで指定した行へ移動する。

例:less filename

tail

ファイルの最後の10行を表示する。

  • -nをつけると、表示する行数を変更できる。(tail -n 20 file.txt)
  • -fをつけると、ファイルが更新されている場合リアルタイムで追加されたデータを表示してくれる。
  • -vでファイル名を表示する。
  • -c(charactersの略)で表示する文字数(正確にはバイト数)を指定できる。

例:tail filename

touch

ファイルを作成する。

  • 元々ファイルのタイムスタンプを更新するためのコマンドだが、指定したファイルが存在しない場合はそれを作成する。

例:touch example.txt

rm

removeの略
ファイルを削除する。

  • -r, または--recursiveオプションをつけることでディレクトリとその中のファイルも再帰的に削除できる。
  • -fはforceの略で強制的に実行する。

例1:rm filename
例2:rm -rf dirname
(強制的に削除されるため実行時は注意)

mv

moveの略
ファイルを移動する / ファイル名を変更する。

例1:mv filename filename2
例2:mv filename ./somedir

cp

copyの略

ファイルをコピーする。
例:cp filename ./somedir/copiedfile

ln

linkの略
ハードリンクを作成する。

  • ハードリンクとはファイルの実態と同じ参照先(inode番号)を持つ。
    ハードリンクを作成しておけば、リンク元のファイルを削除してしまったとしてもハードリンクが残っていればファイル自体は消えない。

  • オプションで-sをつけるとシンボリックリンクを作成する。
    シンボリックリンクはハードリンクと異なりファイルのパスとファイル名が記録されたショートカットのようなもので、
    ファイルの場所や名前を変えると機能しない「壊れたリンク」となる。

*例:ln -s ./basefile ./somedir/linkfile

find

ファルを検索する。

find [path] [options]のように使う。
例:find . -type f -name "*.txt"

  • -typeは検索する対象の種別を指定できる。(f = ファイルのみ、d = ディレクトリのみ等)
  • -nameは名前を検索する。

chmod

change modeの略
ファイルに対する操作の権限を変更する。

例:chmod 766 file.txt

  • 766はそれぞれファイル所有者(user)、グループ(group)、その他(others)の権限を指定しており、 読み取り = 4 , 書取り = 2 , 実行 = 1 の数字の組み合わせで決まる。 (7の場合全て可能、6の場合は実行以外可能)

  • また、それぞれ個別にも設定を加えることができ、その場合は「誰に」「何を」付与するのかという順番で以下のようなコマンドになる。なお、権限はread, write, executionの略である r,w,x を指定する。
    例:chmod u+x file.txt (userに実行権限を付与) / chmod o-x file.txt (othersから実行権限を剥奪) / chmod ugo+r file.txt (u,g,o全てに読み取り権限を付与)

  • -Rをつけてディレクトリを指定すると、再帰的にディレクトリの中身のファイルの権限を全て変更できる。
    例:chmod -R 766 .

権限の詳細はls -lで確認することができる。

chown

change ownerの略 ファイルやディレクトリの所有者とグループを変更する。

-Rで指定したディレクトリ配下すべてのファイルとサブディレクトリに適用できる。

例:chown user:group filename

ps

process statusの略 OS上で起動しているプロセスを表示する。

主なオプションに-e (everything)や-f (full) があり、それぞれ「全てのプロセスを表示」「詳細を表示」するために使われる。

kill

プロセスを終了する。

プロセスの指定にはpsコマンドで表示されるPIDを用いる。
-9というオプションで強制終了させることができる。

例:kill -9 PID