JavaScriptとRailsで違う!==と===の意味

ReactとRailsを使って仕事をしているのですが、たまにどっちだ?となる瞬間があるので自分用にメモしておきます!

結論

Javascriptでは、

== : ゆるい比較
=== : 厳密な比較

Rubyでは、

== : 厳密な比較
=== : ゆるい比較

厳密な比較をすることが多いので、そちらだけ覚えておけばいいんでしょうね

参考

qiita.com

techracho.bpsinc.jp

RailsのScopeの隠れた仕様

最近、Railsを勉強している中で初めて知って驚いたScopeの仕様を紹介します

Railsを使いこなしている方なら常識なのかもしれませんが

私は知らなかった...

Scopeの隠れた仕様!

私が驚いたScopeの仕様

それはなんと、Scopeの条件に一致しない場合は、allメソッドで返してくれるということ!

Railsの公式には、

条件文を評価した結果がfalseになった場合であっても、スコープは常にActiveRecord::Relationオブジェクトを返します。クラスメソッドの場合はnilを返すので、この点において振る舞いが異なります。

とは書いてありましたが、allメソッドで返してくれるとは知りませんでした

railsguides.jp

Scopeの基礎的な使い方

ちなみに、Scopeについて簡単に説明すると

Modelによく使うクエリを名前をつけて定義しておくことができます

これがscopeというものです

これによって、同じ条件のクエリをこのScopeを使うことで修正しやすくなったり、

Controller側が膨らみすぎることを防いだりできます

先ほどのRailsガイドの例を参考にすると、以下のように書くことでScopeを宣言できます

class Article < ApplicationRecord
  scope :published, -> { where(published: true) }
end

以下の記事が基礎から詳しく書いてあり分かりやすかったです!

pikawaka.com

個人的に思ったscopeの注意点

Scopeを使わないで普通にwhereなどを使った場合、見つからないときは空のActiveRecord::Relationが返ってきます

しかし、Scoopの場合はActiveRecord::Relationという点は同じですがallメソッドが働いて全データを取ってきます

このことが頭に入っていれば問題ないですが、結果が違うのでどっちを使っているをしっかりと理解して使うことが大事だということです

また、見つけた記事ですがモデルの外でチェインするのもテストやメンテナンス性が低くなるため、できるだけモデル内であらかじめチェインしておいてControllerなどで使うと良いそうです↓

techracho.bpsinc.jp

最後に

私自身最近知ったことなのと、元々Scopeを使いこなせてはいなかったのでにわかですが、

今後使えるところでどんどん使ってより良いコードを書いていきたいなと思った次第です!

「ドラゴンクエストモンスターズ テリーのワンダーランドRETRO」でRTAに挑戦

年末に「テリワン」がtwitterでトレンドに入っていた

「テリワン」といえば、1998年にGBで発売された「ドラゴンクエストモンスターズ テリーのワンダーランド

昔にプレイした記憶があり、個人的に結構好きなゲームです

なぜトレンド入り?

なぜ、今トレンドになっているのか追ってみるとRTA in Japan Winter 2022というイベントでが開催され、「ドラゴンクエストモンスターズ テリーのワンダーランドRETRO」でRTAに挑戦しているらしい

ちなみにRTAとはReal Time Attackの略で、どれだけ早くゲームをクリアできるかを競う競技

私自身RTAという存在は知っていましたが、RTA in Japanというイベントの存在は年末の話題で最近初めて知りました

実際の映像

以下は年末に行われていたテリワンのRTA in Japanの映像です

www.youtube.com

昔プレイした時はどれくらいの時間でクリアしたかは覚えていません、少なくとも30時間くらいはかかった気がしており、1時間でクリアしているのは超早い

自分でもやってみた!

懐かしさもあり自分でもテリワンのRTAをやっていみたいと思いたち、先日早速Switch版の「ドラゴンクエストモンスターズ テリーのワンダーランドRETRO」を購入してやってみました

どうやって行うかは、水沢さんという方がまとめてくれています↓

docs.google.com

やってみた結果

結果としては、7時間くらいでクリアできました!

金策と最後の星降り大会で結構苦戦し時間がかかりましたが、昔普通にプレイしてクリアしていた頃に比べれば絶対に早い!

慣れれば半分くらいの時間でできそう!

最後に

今年は色々なことに挑戦したいと思っており、初めてのRTAに挑戦してみました

普通にプレイするのとは、また違った感じで面白かったです!

dockerでの環境構築で「no space left on device」と怒られた時の対処法

いつも通りdocker-composeでコンテナを立ち上げようとした時、「no space left on device」というエラーが発生

そのエラーの対処法になります

前提

対処法

1. dockerのコンテナやイメージの削除

エラーの内容的にデバイスのスペースが無いとのことなので、まずは使っていないコンテナやイメージを削除すれば良いのではと予想立てて進めました

dockerのコンテナやイメージの削除については以下の記事を参考に行いました

qiita.com

ちなみにコマンドは、以下を使用しました

# コンテナ一覧を確認(停止しているものも含めて)
$ docker ps -a

# コンテナの削除
$ docker rm [コンテナID]

# イメージ一覧を確認
$ docker images

# イメージの削除
$ docker rmi [イメージID]

また、noneとなっているimageもいくつかあり、そちらは以下の記事を参考に削除を行いました

qiita.com

ちなみにコマンドは、以下を使用しました

$ docker image prune

2. 解決しないのでDockerのDisk images sizeを確認

予想に反して解決しなかったので、今度はDocker自体の使えるスペースが足りて無いのではと予想してDocker DesktopのダッシュボードからDisk images sizeを確認

ちなみに、確認方法はDocker Desktopを開いて

Settings > Resources > Docker image size

で確認できます

確認した結果、作成可能なimagesが16GBに対し、使用容量が16GBでした

spaceが無いと怒られるわけです

ということで、Disk images sizeを24GBに増量

エラーが出なくなり、無事解決しました!

DBから取得したデータを最後の要素以外ランダムにしたい

DBから取得したデータの最後の要素以外ランダムにすることが以前あり、少し悩んだので忘れないようにメモ

前提

  • 使っている言語はRuby on Rails
  • 問題に紐づく解答がseedで挿入されており最後の解答が「わからない」
  • やりたいことは「わからない」以外の解答をランダムにしてフロント側に返したい

どうやったか?

方法はこんな感じ

  1. 問題に紐づく解答データの取得
  2. 1で取得した最後の要素を取得
  3. 1のデータの最後の1個前までをランダムにして返却用の変数に入れる
  4. 3の返却用の変数に2で取得した最後のデータをpushする

ソースは以下

question = Question.find(params[:id])
all_answer = question.answers
last_answer = all_answer.last
random_answer = all_answer[0..(all_answer.length - 2)].sort_by{rand}
random_answer.push(last_answer)

作ってみて

あらかじめ最後の要素だけ別の変数に入れておいて最後に追加するようにしました。

最後の要素以外をランダムにしたかったのでsort_byする際に最後の要素以外を指定したのですが、length-2はあまりスマートではない気がしています。。

良い方法ありましたら、コメント等で教えてもらえるとありがたいです。

Macbookで画像の大きさを小さくする方法

アイコンの画像を設定しようとしてアップロードできる画像の大きさより大きくて失敗することがあったりします

ただ急に言われると、どうやるんだっけかなと調べ直したりすることがあるのでメモしておきます

ただし、Macbookでの方法になります

Macbookで画像の大きさを小さくする方法

1. 画像をプレビューで開く

画像をダブルクリックすればデフォルトで、プレビューにて開きます

2. マークアップツールバーを表示

上部にある検索バーの左にあるペンのマークをクリックし、マークアップツールバーを表示する

3. 表示されたマークアップツールバーの中央あたりにある長方形みたいなマークを押す

4. そうすると以下のようなダイアログが表示されます

5. 幅や高さの値を小さくすることで大きさを小さくできます

超簡単にできました!!

参考

support.apple.com

ローカルでDockerを使ってRails 7.0 + MySQL 8.0の立ち上げ

今回やりたいこと

  • ローカルでRailsのお試し用アプリを作成したい
    • Railsはこの記事作成時の最新版7.0.4を採用
    • また、Rails 7.0以上ではrubyのバージョンは3.0以上が望ましいとのことで最新の安定版の3.1を採用
    • MySQLは8.0を採用
  • Dockerを使いたい
  • Githubを使って管理

!!!注意!!!

ローカルで動かしてみて今のところ問題が出ていないだけで足りない部分もあるかもしれません。かなり最低限しか書いていないと思うので

動かしていく中で追加や修正が必要そうな部分があり次第適宜修正しますが、間違っている点などありましたら、お手数ですがコメント等でそっと教えてていただけたらと思います

私の環境

Macbook OS: Monterey 12.6.1

Docker: 20.10.21

Docker Compose: 2.12.2

前準備

  1. GitHubで管理したいのでGitHubのサイトからリポジトリを作成
  2. ローカルにリポジトリをクローン(自分の場合はGithub Desktopを使用しました)
  3. ここまででGitHubでの管理の準備が完了

DockerでRailsの立ち上げまで

1. コンソールでクローンしてきたリポジトリまで移動

2. 立ち上げに必要なファイルを作成

コンソールでファイル作成のコマンドを実行

$ touch {docker-compose.yml,Dockerfile,Gemfile,Gemfile.lock}

※ ちなみに、ファイルの間にスペース空けるとエラーになるので注意

3. Dockerfileの作成

# まずベース・イメージを指定
FROM ruby:3.1

# mysqlのためにdefault-mysql-clientをインストール
RUN apt-get update && apt-get install -y default-mysql-client

# 作業ディレクトリの作成&指定
WORKDIR /app
# GemfileとGemfile.lockを作業ディレクトリにコピー
COPY Gemfile Gemfile.lock /app

# gemのインストール
RUN bundle install
# カレントディレクトリのファイルを作業ディレクトリにコピー
COPY . /app

# Rails起動コマンド
CMD ["rails", "server", "-b", "0.0.0.0"]

ちなみに

ちなみにdefault-mysql-clientを無しにするとdocker exec -it rails_app bin/rails dbconsoleを行った際に以下のエラーが出ました

Couldn't find database client: mysql, mysql5. Check your $PATH and try again.

4. Gemfileの作成

今回はRails 7.0.4を使用するので、そのバージョンを指定

source 'https://rubygems.org'
gem 'rails', '7.0.4'

5. docker-compose.ymlの作成

version: '3'
services:
  db:
    # コンテナ名は任意で
    container_name: rails_app_db
    # 使いたいmysqlのバージョンを指定。今回は8.0を使用
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"
    volumes:
      - ./tmp/db:/var/lib/mysql

  app:
    # コンテナ名は任意で
    container_name: rails_app
    build: .
    command: bash -c "bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db

6. Railsプロジェクトの立ち上げ

コンソールでRailsの立ち上げとdocker-composeのビルドのコマンドを実行

$ docker-compose run app rails new . --force --no-deps --database=mysql
$ docker-compose build

--force 既存のGemfileを上書き

--no-deps リンクしたサービスを起動しない

--database=mysql DBにmysqlを指定

7. config/database.ymlにDBの設定を追加

・・・省略
development:
  <<: *default
  database: app_development
  # ここから
  host: db
  username: root
  password: password
  # ここまで
・・・省略
test:
  <<: *default
  database: app_test
  # ここから
  host: db
  username: root
  password: password
  # ここまで
・・・省略

8. DBの作成

コンソールでDB作成のコマンドを実行

$ docker-compose run app rails db:create

9. Dockerイメージの起動

コンソールでdocker composeを立ち上げる

$ docker-compose up

11. 無事作成完了

ブラウザでhttp://localhost:3000/にアクセス

参考ページ

最後に

ローカルでRailsアプリの立ち上げまで完了しました

次は、勉強がてら稼働時間を管理するWebアプリを作ってみる予定です!