tawara's blog

雑記。個人の見解です。

IN述語を使うと OR をたくさん並べなくてよい

SQLのお話。あるカラムの複数の値をSELECTしたい。

愚直に書くとこうなる。

mysql> SELECT id, title, author FROM books WHERE id = 1 or id = 2;
+----+-----------------------------------------------+--------------------------------+
| id | title                                         | author                         |
+----+-----------------------------------------------+--------------------------------+
|  1 | みみずくは黄昏に飛びたつ                      | 川上 未映子/村上 春樹          |
|  2 | 村上春樹翻訳(ほとんど)全仕事                | 村上春樹                       |
+----+-----------------------------------------------+--------------------------------+
2 rows in set (0.00 sec)

指定する値が増える数だけ OR が増えていく。めんどう。そういうときに IN述語が使える。

mysql> SELECT id, title, author FROM books WHERE id in (1, 2);
+----+-----------------------------------------------+--------------------------------+
| id | title                                         | author                         |
+----+-----------------------------------------------+--------------------------------+
|  1 | みみずくは黄昏に飛びたつ                      | 川上 未映子/村上 春樹          |
|  2 | 村上春樹翻訳(ほとんど)全仕事                | 村上春樹                       |
+----+-----------------------------------------------+--------------------------------+
2 rows in set (0.00 sec)

便利だ。

参考 書きのpp210

(了)

体調崩し気味は運動不足のせいかも

ここ一週間くらい体調を崩し気味だ。体がだるく、視神経から来るやんわりとした頭痛、ちょっと込み入った会話で頭がついていかない、などなどの症状があった。自律神経失調症なのかもしれない。

で、隔週で通っている整体の施術者に相談してみたら、「運動してます?」と言われた。ランニングとかはしてないけど、必要最低限の運動はしてるだろうと思っていたが、最近はほぼ家から出ていないことに気づいた。近くのコンビニに行くくらいだ。自重トレも一切してない。足踏みマシーンもホコリをかぶっている。最近というか半年くらいそんな生活をしている。これは結構ヤバいのではなかろうか。

ということで運動習慣をつけようと思う。毎日できることがいい、と施術者の方は元気な体で元気に言っていた。朝に有酸素運動をするのが大事です。散歩とか。散歩かー。散歩を取り入れよう。雨だったら部屋で足踏みマシーンを使うことにしよう。ほんとに体がヤワになっている。ジムに通うことも検討せねばなるまい。

健康に対する投資の優先順位が低いことに改めて気づいた。隔週で行く整体くらいだ。健康は幸福の土台なので、メンテナンスに投資していきたい。もう若くはないのだ、と認識せねば。

(了)

小室直樹『危機の構造』を読んだ

書店で小室直樹の名前を見つけて懐かしいなと思って手にとった。大学の図書館で何冊か読んだ。しかしあまり上品なカバーとは言えない色だ。

概要

副題にあるとおり、日本社会崩壊のモデルが書かれている。1982年の本が復刊されている。中身は論文集で、それらはもう少し前に執筆されている。よって高度経済成長の後期に書かれていることになる。いけいけどんどんだった社会の構造を深く見つめる著者は、このまま社会組織などの諸要素の在り方と他要素との関係性を改善しないかぎり、日本は崩壊すると警告している。解説にもあるとおり、日本はその後「失われた30年」を迎えてしまった。

概要は橋爪大三郎の解説を読めばわかる(pp278)。次のとおり。

  1. 戦前の日本社会と戦後社会は、同型で、連続的である
  2. その特徴は、機能集団が共同体になることである
  3. 共同体は、内部/外部の二重道徳をもち、共同体の存続を絶対化する
  4. 2,3から、機能集団は合理的に行動できなくなり、破滅的な結果をもたらす
  5. 共同体となった機能集団の成員は、深刻なアノミーに陥り、回復できない

戦後に農村共同体が解体し、個人はその代わりに企業に拠り所を見つけた。そして企業は共同体となった。共同体で評価されるには共同体の要請に答えることであり、共同体外部では良しとされていない規範でも関係なく働く(モーレツ社員とか?)。それゆえ外部にとっては破滅的な結果になる可能性がある(公害や戦争)。共同体の要請に答えるために構成員は組織に染まるため、権力に対して無批判になり、アノミー状態となる。そしてこの構造は変わらず拡大し続ける。このままでは日本社会が崩壊するだろう。その対策のためには社会科学的な思考を各人が身につける必要がある。文章に要約すればこんな感じ。

感想

40年も前の話だけれど、現在の社会を分析する枠組みとしては使えるだろう。上記の5つの命題の歴史的検証と、5つの命題は現在どこまで当てはまるのか、について批判的に検討してみたいと思った。例えば共同体はSNSの登場で強まったのか弱まったのか?企業はいまだ共同体となり得ているのか?などなど。大学時代に社会学の分析道具をしっかり身につけておけばよかったと反省した。論理は明晰だが、たまに具体例にピンと来ないことがあった。40年前の本なので仕方がないのだけれど。社会関係の構造を理解する社会学の面白さに改めて気づいた。新書とかまた読もう。

(了)

presence メソッドを知った

PRレビューで最近よく見るメソッドがある。それが presence メソッド。

どんなメソッドかというと、英語で見事に説明されている。

Returns the receiver if it's present otherwise returns nil

むしろコードを見るほうがわかりやすいかもしれない。自身に対してpresent? をしている。

  def presence
    self if present?
  end

つまり、レシーバー(オブジェクト)が存在するならばレシーバー(オブジェクト)を返し、なかったらnilを返す。

例えば、こんなふうに present? を使ってあるコードがある。元ネタはGithub

rails/blank.rb at 8015c2c2cf5c8718449677570f372ceb01318a32 · rails/rails · GitHub

regionの変数を確定する際に、stateがあればstateを、そうでなければ、countryがあればcountry を、もしそうでなければ 'US' を入れる処理になっている。

state   = params[:state]   if params[:state].present?
country = params[:country] if params[:country].present?
region  = state || country || 'US'

presence メソッドを利用すると上記は一行で書ける。便利。

region = params[:state].presence || params[:country].presence || 'US'

三項演算子や if文を1行で短くすることができそう。

(了)

テストをたくさん書いて体感したこと

仕事でテストをたくさん書いた。Railsのプロダクトなので、Rspecを使っている。一機能の主要部分をまるっと書いたら、得るものがあったので、メモとして残しておこう。

仕様に詳しくなれた

まずテストを書く上で、何が正しい状態なのかを知る必要があるので、とにかく仕様についての知識を集めた。ビジネス側のテキスト資料や動画資料が残っていたので、それでざっくり概要を把握できた。資料が残っていることはありがたい。またQAの方がテストした際に、テストのやり方の資料を残してくれていたので、それも参考にした。こうやって画面でデータを作ればいいのか、などを把握することができた。ただ開発に関してはローカル環境での開発方法の資料はあるものの、どんなクラスが登場人物で何をしているのかがあまり体系的にまとめられていなかった。そこで、コードを追いながら、どのようなタイミングでどのようなデータが作成されるのか、それらがいつ呼び出されてどのように機能しているのか、をデバッグしながら把握した。ビジネス側でやりたいことを、どのようにコードで表現しているのか、について詳しくなることができた。大変だった。

コードを追う力がついた、と思う

コードを眺めていても処理を把握できないので、デバッグしながら把握した。地道な作業だったけど、コードを追う体力のようなものがついた気がする。ひとつずつ、ちょっとずつ把握するしかない、という境地で時間をかけて理解した(ただそれでももちろん理解できていないところもある)。何を保存しているのか、についてより鋭く意識するようになった。至極当たり前のことのようだけれど、とにかくそう思った。すべてのコードが同じ重要度を持っていると思い込んでいた様に思える。結局、どのタイミングでどのようなデータを保存しているのか、をまず把握しなければならないのだと強く思った。

テストが書きやすいコードを書こうと思った

ひとつのメソッドでいろいろな処理をしている場合、単体テストを書くのに苦労した。メソッドをシンプルにすれば、その分テストがしやすくなるという気づきを得た。ただ単純にシンプルにすればいいのか、という点に関してはきっと議論がありそうなので、今後勉強するつもりだ。ただ、テストが書きやすいコードを書こう、と強く思えたことは単純に望ましい収穫だと思う。テスト好き。

テストの書き方について詳しくなれた

例えばあるメソッドのなかで、別のメソッドを呼んでいる場合、その別のメソッドが呼ばれているかどうかをテストする、という方法をはじめて知った。社内にはRspecについて詳しい人がいて気軽に相談するなかで教えてもらった。spyというもの*1。他には、letで変数を定義するときに、do - endで囲ってブロックを利用して記述できるなど。新しいことを知れてよかった。

テストがある安心感を得られた

今後、自分でテストを書いた箇所で、機能修正するチケットを割り当てられている。たくさん書いたコードで、そのチケットの不具合を検知することができた。うれしい!あとは不具合を修正してテストがグリーンになるように修正すればいい。そしてその修正による影響範囲は、すでにテストが書かれているので、安心してコード変更に取り組める。精神衛生上とても良い。目の前の修正に集中することができる。

テストに興味を持ちはじめた

テストを書くことの効用を感じることができた。とても感じた。なので、もっと開発フローにテストを効果的に取り組みたい。テストに関する知識も整理していきたい。何をテストすべきなのか、など。「品質」についても考えを深めることができそうだ。設計を検討したり、バックログリファインメントでの議論にも新たな観点から意見を出せるようになるかもしれない。というような心持ちでいたら、こういう記事に出会った。とても良かった。ので、記事内で言及されてる SoftwareDesign 2022/3 を買った。勉強するぞー。

bufferings.hatenablog.com

(了)

自分との約束が崩れると生活が崩れる傾向があるかもしれない

先週は雨続きのせいだったのか体調を少し崩した。30歳を越えてから体力が衰えてきたのかもしれない。あまり運動もしてないし。ちょっと元気がなくなり、布団に横になりだらだらとスマホを見ている時間が多かった。

毎日やること、一週間のうちにやることを、決めている。毎日やることとしては、文体模写・ストレッチ・日記などがあり、一週間でやることとして技術本の読書・ブログ記事を3本書く、などだ。で、ちょっと元気がなくなると、そのようないつもの自分との約束あるいは習慣が崩れてしまう。元気がないのであれば仕方ない、と割り切れればいいのだけれど、約束を破るような気持ちになってしまう性分だ。そうなると約束を守れない自分に嫌気がさして、ただでさえ少ない元気がじわじわと削られていく。悪循環になっている。柔軟性が欠けていると言われれば、たしかにそうだけれど、そんなに単純に割り切ることができない。面倒な性格だと思う。先週は日記をほぼ一日も書くことができなかった。事細かに書くようなものでもないのにだ。

性格をすぐに変えることは難しいので、約束(習慣)を守るためのハードルを下げることにした。たとえば日記を毎日notionに書いていたのだけれど、日記そのものを書く前に、まず当日分の日記フォーマットをコピーして今日の日付をつける作業が発生している。こいつが地味に面倒だ。なので、一週間分事前に日記フォーマットを用意しておく運用に今日から切り替えた。これでスマホでささっと書くことができる。ブログ記事も着手してしまえば、なんとか書けそうなので、朝の始業前に15分とりあえず時間を確保した。これで就業後に途中から書くことができれば執筆完了までできそうだ。

小さいけれど自分との約束を守ることは、生活に推進力が出る。なのでそのハードルを下げる。こんなふうな小さいけれど大事な生活の課題に対して取り組むことができた良い週末だった。このための平日の不調だったと思いたい。

ただこの習慣が自分の暫定的な目標につながっているのか、という点が最近気になっているので近いうちに習慣それ自体をチューニングしたい。目標を決めることが先になるかもだけれど。

(了)

今村昌弘『魔眼の匣の殺人』を読んだ

最近雨続きだったせいか体調を崩してしまっていたので、気分転換に読書をした。頭と心があまり疲れないようなエンタメ小説がないかと街の小さな本屋を物色していると本書が目に止まった。『屍人荘の殺人』で一気に有名になった作者の二作目だ。デビュー作も読んだことがある。ミステリ界隈は詳しくないけれど、超常現象を前提にしたミステリが特徴のように見える。一作目はバイオテロ、そして本作は予言が前提になっている。橋が焼け落ち、「匣」に留まることになった約10名は、4人死ぬだろう、という予言のもとで殺人事件に巻き込まれる。予言を前提にした人間の心理描写や行動に着目して楽しく読み進めることができた。重ねられた謎が名探偵に鮮やかに解決されるのはやはり気持ちがいい。殺人事件は無事解決される。その上で読者が見過ごした重大な謎も浮き彫りにしてしっかりと解決される。素直に読んで、素直に騙される、というのが僕のミステリの読み方だ。この人物描写は不可解だ、ご都合主義だ、なんて野暮なことは考えない。しばし現実を忘れることができてよかった。ということで次もミステリを読んでいる。

(了)