おさとの雑記帳

日々の学習のアウトプットに使っていきます!

説明変数を使おう

結論

  • 説明変数を用いると可読性が増す

説明変数とは?

式を表す変数のこと。

式の意味を説明してくれるような変数名にするため、説明変数と呼ぶ。

使う理由

コードの見通しが良くなるため。

具体例

users = [
  {
    name: "太郎",
    hobbies: [
      "baseball", "shogi",
    ],
  },
  {
    name: "次郎",
    hobbies: [
      "soccer", "igo",
    ],
  },
]

users.each do |user|
  if user[:hobbies][1].upcase == "IGO"
    puts "#{user[:name]}ってヒカルの碁知ってる?"
  end
end

こんなコードがある時に、user[:hobbies][1] が何を指してるのか分かりにくいですよね。

例えば以下のようにしてみるとどうでしょう。

users = ... # 略

users.each do |user|
  indoor_hobby = user[:hobbies][1].upcase! # ここを追加
  if indoor_hobby == "IGO"                              # ここを修正
    puts "#{user[:name]}ってヒカルの碁知ってる?"
  end
end

一行増えますが、ifの条件においてシンボルやインデックスでよび出していた箇所が説明変数で定義されたことにより、見通しが良くなりました。

まとめ

  • 分量より読みやすさを大切にするために、説明変数を使う

参考

devcontainerでRubyの実行環境作ってみた

結論

  • rbenvなどなしにRubyの開発環境を作ることができた

目標

  • VS Code + Remote ContainerでRubyの開発環境を用意する

やったこと

基本的には以下のリポジトリを参考にさせていただきました。 github.com

用意したのは

.devcontainer
├── Dockerfile
├── devcontainer.json
└── docker-compose.yml

です。

それぞれ見ていきましょう。

Dockerfile

Dockerfile とはイメージを作成するための手順が記されたものです。

FROM ruby:3.1.2 

RUN gem install rufo 

# Set locale as ja_JP.UTF-8
RUN apt-get update \
  && apt-get install -y locales vim\
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
RUN sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen \
  && locale-gen
ENV LANG ja_JP.UTF-8
  • FROM:親イメージの呼び出し
  • RUN:現在のイメージよりも上にある新しいレイヤでコマンドを実行し、結果をコミットする
  • ENV:環境変数を設定
  • apt-get:パッケージの操作、管理を行うコマンド
  • sed:文字列の置換処理などを行うLinuxコマンド

一行ずつ見ていきます

FROM ruby:3.1.2

Rubyのversion 3.1.2のイメージを呼び出します。

RUN gem install rufo

フォーマッターであるrufoをインストールします。

RUN apt-get update \ 
  && apt-get install -y locales vim \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

APTライブラリのインデックスを更新し、localesとvimをインストール、アーカイブファイルを削除、最後にキャッシュファイルを削除しています。

RUN sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen \
  && locale-gen

locale.gen の ja_JP.UTF-8 をコメントインし、locale_genを実行しています。

ENV LANG ja_JP.UTF-8

環境変数に、LANG = ja_JP.UTF-8を設定しています。

これで Dockerfile にイメージを作成するための必要な手順を記し終えました!

次にdevcontainer.jsonを見ていきましょう。

devcontainer.json

devcontainer.json はコンテナ周りの環境やVS Codeの設定を記述するためのファイルです。

{
  "name": "Ruby",
  "dockerComposeFile": "docker-compose.yml",
  "service": "ruby",
  "workspaceFolder": "/workspace",
  "settings": {
    "ruby.format": "rufo",
    "ruby.useLanguageServer": true
  },
  "extensions": [
    "rebornix.Ruby",
    "redhat.vscode-yaml",
    "kaiwood.endwise",
    "VisualStudioExptTeam.vscodeintellicode"
  ]
}

各キーのざっくりとした説明です。

  • name:dev containerの表示名
  • dockerComposeFile:参照するdocker-composeファイルのパスを指定
  • service:docker-composeで起動するコンテナの名前
  • workspaceFolder:指定しないとターミナルでrootになってしまう
  • settings:VS Codeで適用する諸設定
  • extensions:buildした時に入ってほしいVS Codeの拡張を記述

extensionsにはRubyで開発する際に最低限必要なものを入れてるつもりですが、こういうのもあれば、というのがあればぜひコメントください 🙆‍♂️

最後にdocker-compose.ymlを見ていきましょう

docker-compose.yml

docker-compose.yml は起動したいコンテナ群の情報を記述します。

version: '3'

services:
  ruby:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    volumes:
      - ..:/workspace:cached
      - bundle-volume:/usr/local/bundle
    command: sleep infinity
volumes:
  bundle-volume: null

今回はrubyというコンテナのみ起動していますね!

(command: sleep infinity はなくてもいけると思ったのですが、エラー吐きますね、、調査して追記するかもしれません 🙇‍♂️)

まとめ

  • VS Code + dev container の組み合わせで個々人の環境に依存しない開発環境が作成できた

おまけ

こちらがRubyの開発環境をdev containerで作ったものになります!

ぜひご活用ください!

フィードバックもお待ちしております 💪

参照

『頭を「からっぽ」にするレッスン』読んでみた

結論

  • 好きな時に、マインドフルネスな状態になることを目指せそう

はじめに

何か調べている時に、どこからともなく別の思考が流れてくること、ありませんか?私はよくあります。

Rubyの勉強をしていたはずなのに、「AWSとHerokuそれぞれのメリット・デメリットってなんだろ」「他にやるべきことなんだったっけ?」「Slack来てないかな」「ご飯どうしよ」などなど。何かを調べながら、別のことを考えている、といった状態です。

もちろんそれぞれについて、同時に深く思考できてるわけもなく、ただただ生産性が下がっているように感じます。

こんな状況を変えるべく、本書を手に取りました。

瞑想とマインドフルネス

頭がからっぽな状態 = マインドフルネスという状態と言えそうです。

マインドフルネスな状態になるためには瞑想という手段を用いる必要があります。

恥ずかしながらマインドフルネスと瞑想は同義であると捉えていましたが、実際は意味合いが異るようです。

  • マインドフルネス:気を逸らさずに、「今、ここ」に存在することを意味し、心を落ち着け、一切のこだわりも予断も捨て自然な状態を保つこと。
  • 瞑想:今この瞬間をじかに体験すること。古今東西、あらゆる瞑想は基本的には集中と自己理解のいずれか、あるいは両方を軸にしている。

瞑想の目的は、意識をトレーニングし、自身の考え方とその理由を理解し、その過程を客観的に把握することです。

瞑想をしていると、いつの間にか雑多な思考が現れています。これを押さえつけようとせず、一歩引いて客観的に「思考が現れている」ことを認識し、また内部に意識を向けることが重要です。

実際にやってみての感想

詳しいやり方の説明は本書に任せたいと思います。

実際にやってみて、いかに自分の意識が散っているか、そして抑え込もうとしているかがわかりました。

湧き上がってくる思考を悪とせず、自然なものとして認め、また自分の内部に意識を戻すことで、同時に思考していたものを減らせることを感じました。

まとめ

  • 瞑想とマインドフルネスの違いがわかった
  • さまざまな思考が湧き上がったときの自身の対処の悪さがわかった
  • 瞑想によって、湧き上がってくる思考を受け入れられ、一つの思考に集中する(マインドフルネスな状態になる)ことができそう

Railsの練習帳を読んでみた

このブログ初の記事になります!

igaigaさんの Railsの練習帳を読んで得た知見をアウトプットしていきます。

結論

  • 規約から外れた関連付けにおいて双方向関連付けを行う場合、inverse_of の設定が必要になる。

双方向関連付け

関連付けにおいて、規約から外れた名前を使う時には、双方向関連付けを自動認識してくれません。

例えば以下のような関連のコードにおいては、双方向関連付けを自動で認識してくれます。

class User < ApplicationRecord
  has_many :books
end

class Book < ApplicationRecord
  belongs_to :user
end

しかし、以下のようなコードだと双方向関連付けが自動では認識されません。

class User < ApplicationRecord
  has_many :books
end

class Book < ApplicationRecord
  belongs_to :author, foreign_key: "user_id", class_name: "User"
end

一見うまく動作しそうですよね 👀

確認してみましょう。

user = User.first
book = user.books.first

user.name #=> "hoge"
book.author.name #=> "hoge"

user.name = "fuga"
user.name #=> "fuga"
book.author.name #=> "hoge"

このように、user.namebook.author.name の実行結果が違います。

これが 規約から外れ、双方向関連付けが自動で認識されなかった ということです。

では一体どのように解決したらいいのでしょうか。

inverse_of を使う

手動で双方向関連付けを設定する必要があるのですが、これは inverse_of を両者に設定することで解決できます。

(ちなみに inverse は「逆」という意味だそうです。)

実際に使い方を見てみましょう。

class User < ApplicationRecord
  has_many :books, inverse_of: :author #inverse_of に続けて関連名を記述する
end

class Book < ApplicationRecord
  belongs_to :author, foreign_key: "user_id", class_name: "User", inverse_of: :books
end

これで双方向関連付けを設定することができました!

双方向関連付けを行うと、

  • 関連付けに起因するバグ
  • 余分なクエリ発行

を防ぐことにつながります。

まとめ

  • 規約から外れた関連付けの場合に双方向関連付けを行うには、inverse_of をつける

参考資料

初めての記事で至らぬところも多々あると思いますが、これからもこのブログを通して学んだことのアウトプットをしていきたいと思います!

ご拝読ありがとうございました 💪