叙述トリックにハマった、24歳梅雨明け

もうやんカレー旨かった。

殺戮にいたる病を読み終えた。衝撃のラストってやつ。最後に近づくにつれ、心の中でえーーーーーがこだましてた。笑

「カエルの楽園」を読み終えた。公な場でカエルの楽園に対する書評を連ねると右翼が黙ってなさそうだから控える。選挙間際になるとなぜかメディア(特に朝日)で過度に首相の取り組みに対して批判を煽る報道が増えている理由が少しわかった。

今週は「暇と退屈の倫理学」を読み進める。まだ50P程しかみていないが、ここ2年くらいぼんやりと考えていたことを少し代弁してくれている。

人生のペアプロをしてくれる哲学本?楽しみ。

 

 

 

sakilaを活用したSQLの練習

テーブル設計も載っている。

MySQL :: Sakila Sample Database :: 5 Structure

使用していくデータをインポートしてくる。

sakila sample databaseというものを使うみたい。

URLへアクセスして、example databasesにあるsakila sample databaseをダウンロード

MySQL :: Other MySQL Documentation

ダウンロードしたSQLファイルをデータベースに入れていく

How do I import an SQL file using the command line in MySQL?

ここまでやって気づいたけど、簡単にsakilaのデータベース環境を整えられるリポジトリを発見した。

https://github.com/tadatakuho/mysql-docker

READMEにある通り、下記の3ステップで環境を整えることができる


$ git clone git@github.com:tadatakuho/mysql-docker.git

$ cd mysql-docker

$ docker-compose up -d

dockerを立ち上げたら、docker内のmysqlへ潜り込んでいく

root@d69b65147102:/# mysql -u root -proot

Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 10
Server version: 8.0.29 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
+--------------------+
5 rows in set (0.07 sec)

mysql> use sakila;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

usage guideへアクセスして、使い方を学んでいく。

MySQL :: Sakila Sample Database :: 6 Usage Examples

サンプル数が少ないので、キータの記事を参考にして、練習問題にチャレンジする。

SakilaとしたいSQLのお勉強-1 - Qiita

課題1を解いてみる

「nickさんの出演している映画」

必要なテーブルは三つ

Actor, FilmActor, Film

  1. まずは、欲しい情報の名詞を探す。

今回は「映画」

  1. first_nameかlast_nameがnickという名のActorを探すことになる。
  2. 先ほどActorから取得したidと一致するactor_idを持つFilmActorを探す。
  3. そのFilmActorテーブル内にあるfilm_idを取得する。
  4. そして、取得したFilmActorテーブル内のfilm_idと一致するidを持つFilmを取得する。

恐らく、テーブルを全て連結させてからデータを取得した方が無駄なクエリーは走らないはず。

だから、三つをくっつけてからwhereで取得する方法を探していく

三つ連結させる方法

Table1, Table2, Table3という三つのテーブルがあるとする。

それぞれをtable1を起点に、共通する部分のみの値を取得したいときは、下記の様にInner Joinを使う。

SELECT * FROM table1 
INNER JOIN table2 ON table1.id = table2.id 
INNER JOIN table3 ON table1.id = table3.id;

nymemo

Visual Representation of SQL Joins

クエリーに落とし込んでみる。

  1. SELECT * FROM Film f
  2. INNER JOIN FilmActor fa ON fa.actor_id = (SELECT id FROM Actor a where a.first_name = ‘nick’ or a.last_name = ‘nick’)
  3. INNER JOIN f ON f.film_id = fa.id

楽しい

配列展開 ハッシュ展開

Ruby 配列展開 *Array - Qiita

Ruby と ECMAScript の配列展開の挙動の違い

知っておきたいrubyの書き方

nilや””を検知する書き方、配列操作のシンプルな書き方が載っている。

Ruby on Railsの現場でよく見る書き方【実例あり】 - Qiita

差をつけるRuby - Qiita

Ruby on Railsでの良い書き方について - Qiita

テンプレートを探す

render ‘new’がどのようにして対応するテンプレートを探しているのかが分からなかった。

ActionViewのrenderメソッドの裏側が書いてある。

Railsのテンプレートレンダリングを分解調査する#1探索編(翻訳)|TechRacho by BPS株式会社

gemをrequire falseにする理由

bundlerによってgem自体はアプリにインストールされる。

アプリケーション内で複数回使用しないのであれば、gem 'simplecov', require: falseのように、後ろにfalseと使う。

使用したい場合は、明示的にファイル内でrequire ‘gem名’とする必要がある。

https://stackoverflow.com/questions/4800721/ruby-what-does-require-false-in-gemfile-mean#:~:text=You use %3Arequire %3D> false,as with gem install whenever .

git grep ’探したい文字列’

git grep の後に探したいメソッド名などを付ける。正規表現を使って絞り込みをすることもできる。

$ git grep hello
app/javascript/packs/hello_typescript.ts:// Run this example by adding <%= javascript_pack_tag 'hello_typescript' %> to the head of your layout file,
config/locales/en.yml:#     I18n.t 'hello'
config/locales/en.yml:#     <%= t('hello') %>
config/locales/en.yml:  hello: "Hello world"
lib/api/v2/qiita_api_client.rb:          user_id = get_user_id('subaru-hello')['id']

grepコマンドの詳細まとめました【Linuxコマンド集】

sendと_send_

sendメソッドとは

レシーバーが持っているメソッドを、文字列(またはシンボル)で指定して呼び出すことができる。

Object#send (Ruby 3.1 リファレンスマニュアル)

class Foo
  def bar?
    true
  end

  def send(*args)
    false
  end
end

foo = Foo.new
foo.send(:bar?)
# => false
foo.__send__(:bar?)
# => true

sendとの使い分け

sendは様々なクラスで使い回されているため、sendの本来の挙動を使用したい場合に_send_を使用する。

定数と変数のようなイメージ?sendはすでに他のクラスで上書き(メタプロ)されている可能性があって、_send_は上書きされない。

Ruby send vs send