ReactとRailsを使って仕事をしているのですが、たまにどっちだ?となる瞬間があるので自分用にメモしておきます!
結論
Javascriptでは、
== : ゆるい比較 === : 厳密な比較
Rubyでは、
== : 厳密な比較 === : ゆるい比較
厳密な比較をすることが多いので、そちらだけ覚えておけばいいんでしょうね
ReactとRailsを使って仕事をしているのですが、たまにどっちだ?となる瞬間があるので自分用にメモしておきます!
Javascriptでは、
== : ゆるい比較 === : 厳密な比較
Rubyでは、
== : 厳密な比較 === : ゆるい比較
厳密な比較をすることが多いので、そちらだけ覚えておけばいいんでしょうね
最近、Railsを勉強している中で初めて知って驚いたScopeの仕様を紹介します
Railsを使いこなしている方なら常識なのかもしれませんが
私は知らなかった...
私が驚いたScopeの仕様
それはなんと、Scopeの条件に一致しない場合は、allメソッドで返してくれるということ!
Railsの公式には、
条件文を評価した結果がfalseになった場合であっても、スコープは常にActiveRecord::Relationオブジェクトを返します。クラスメソッドの場合はnilを返すので、この点において振る舞いが異なります。
とは書いてありましたが、allメソッドで返してくれるとは知りませんでした
ちなみに、Scopeについて簡単に説明すると
Modelによく使うクエリを名前をつけて定義しておくことができます
これがscopeというものです
これによって、同じ条件のクエリをこのScopeを使うことで修正しやすくなったり、
Controller側が膨らみすぎることを防いだりできます
先ほどのRailsガイドの例を参考にすると、以下のように書くことでScopeを宣言できます
class Article < ApplicationRecord scope :published, -> { where(published: true) } end
以下の記事が基礎から詳しく書いてあり分かりやすかったです!
Scopeを使わないで普通にwhereなどを使った場合、見つからないときは空のActiveRecord::Relationが返ってきます
しかし、Scoopの場合はActiveRecord::Relationという点は同じですがallメソッドが働いて全データを取ってきます
このことが頭に入っていれば問題ないですが、結果が違うのでどっちを使っているをしっかりと理解して使うことが大事だということです
また、見つけた記事ですがモデルの外でチェインするのもテストやメンテナンス性が低くなるため、できるだけモデル内であらかじめチェインしておいてControllerなどで使うと良いそうです↓
私自身最近知ったことなのと、元々Scopeを使いこなせてはいなかったのでにわかですが、
今後使えるところでどんどん使ってより良いコードを書いていきたいなと思った次第です!
年末に「テリワン」がtwitterでトレンドに入っていた
「テリワン」といえば、1998年にGBで発売された「ドラゴンクエストモンスターズ テリーのワンダーランド」
昔にプレイした記憶があり、個人的に結構好きなゲームです
なぜ、今トレンドになっているのか追ってみるとRTA in Japan Winter 2022というイベントでが開催され、「ドラゴンクエストモンスターズ テリーのワンダーランドRETRO」でRTAに挑戦しているらしい
ちなみにRTAとはReal Time Attackの略で、どれだけ早くゲームをクリアできるかを競う競技
私自身RTAという存在は知っていましたが、RTA in Japanというイベントの存在は年末の話題で最近初めて知りました
以下は年末に行われていたテリワンのRTA in Japanの映像です
昔プレイした時はどれくらいの時間でクリアしたかは覚えていません、少なくとも30時間くらいはかかった気がしており、1時間でクリアしているのは超早い
懐かしさもあり自分でもテリワンのRTAをやっていみたいと思いたち、先日早速Switch版の「ドラゴンクエストモンスターズ テリーのワンダーランドRETRO」を購入してやってみました
どうやって行うかは、水沢さんという方がまとめてくれています↓
結果としては、7時間くらいでクリアできました!
年末のRIJに影響されて、水沢さんがあげてるチャート頼りに懐かしのテリワンのRTAやってみたけど7時間もかからずにクリアできた...
— ちかみち (@tchkmch) 2023年1月3日
昔結構クリアするの時間かかったのに😭
金策と星降りの大会が結構苦戦したな
金策と最後の星降り大会で結構苦戦し時間がかかりましたが、昔普通にプレイしてクリアしていた頃に比べれば絶対に早い!
慣れれば半分くらいの時間でできそう!
今年は色々なことに挑戦したいと思っており、初めてのRTAに挑戦してみました
普通にプレイするのとは、また違った感じで面白かったです!
いつも通りdocker-composeでコンテナを立ち上げようとした時、「no space left on device」というエラーが発生
そのエラーの対処法になります
エラーの内容的にデバイスのスペースが無いとのことなので、まずは使っていないコンテナやイメージを削除すれば良いのではと予想立てて進めました
dockerのコンテナやイメージの削除については以下の記事を参考に行いました
ちなみにコマンドは、以下を使用しました
# コンテナ一覧を確認(停止しているものも含めて) $ docker ps -a # コンテナの削除 $ docker rm [コンテナID] # イメージ一覧を確認 $ docker images # イメージの削除 $ docker rmi [イメージID]
また、noneとなっているimageもいくつかあり、そちらは以下の記事を参考に削除を行いました
ちなみにコマンドは、以下を使用しました
$ docker image prune
予想に反して解決しなかったので、今度はDocker自体の使えるスペースが足りて無いのではと予想してDocker DesktopのダッシュボードからDisk images sizeを確認
ちなみに、確認方法はDocker Desktopを開いて
Settings > Resources > Docker image size
で確認できます
確認した結果、作成可能なimagesが16GBに対し、使用容量が16GBでした
spaceが無いと怒られるわけです
ということで、Disk images sizeを24GBに増量
エラーが出なくなり、無事解決しました!
DBから取得したデータの最後の要素以外ランダムにすることが以前あり、少し悩んだので忘れないようにメモ
方法はこんな感じ
ソースは以下
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 OS: Monterey 12.6.1
Docker: 20.10.21
Docker Compose: 2.12.2
コンソールでファイル作成のコマンドを実行
$ touch {docker-compose.yml,Dockerfile,Gemfile,Gemfile.lock}
※ ちなみに、ファイルの間にスペース空けるとエラーになるので注意
# まずベース・イメージを指定 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.
今回はRails 7.0.4を使用するので、そのバージョンを指定
source 'https://rubygems.org' gem 'rails', '7.0.4'
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
コンソールで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を指定
・・・省略 development: <<: *default database: app_development # ここから host: db username: root password: password # ここまで ・・・省略 test: <<: *default database: app_test # ここから host: db username: root password: password # ここまで ・・・省略
コンソールでDB作成のコマンドを実行
$ docker-compose run app rails db:create
コンソールでdocker composeを立ち上げる
$ docker-compose up
ブラウザでhttp://localhost:3000/にアクセス
ローカルでRailsアプリの立ち上げまで完了しました
次は、勉強がてら稼働時間を管理するWebアプリを作ってみる予定です!