花粉症で頭が痛い

午前のミーティングを終えて出社のために外に出ると、昨日の雨模様とは一転して春めいた陽気に包まれていた。空気の質感、顔を刺す陽光、アスファルトや街路樹から立ち昇る匂いが昨日までと一変し、海馬の奥の方を刺激する。

これは春が来たということでいいのだろうか?そう期待して天気サイトを見ると、既に寒冷前線が本州を通過している。明日からまた冷え込むらしい、残念。

 

春と言えば節目の季節だ。出会いだの別れだのなんだのかんだの言われているから俺もそんな気分になってきたが、社会人になってしまえば春に節目もクソもない。強いて言えば期末なので忙しくなるが、俺がいる会社は5月が期始めなのでまだ2ヶ月残っている。あとは健康診断くらいか?

会社が新卒採用を表向きしていないので、後輩がゾロゾロ入ることもない。新卒入社が一人いるけどインターン歴が長くて俺より古株だし、そもそも今年新卒というと俺の一つ上の代だ。

一体俺の春はどこに行ってしまったんだろう。

 

電車に乗り込むと空調が稼働しており、程よく涼しい風が周期的に顔にかかる。

車内の人々は比較的薄着だ。厚い上着を脇に抱えて、いつかの春に作ったプレイリストを再生する。中学を卒業した時のことを思い出した。

今年も花粉症がしんどい。

 

iPhone15を買った

iPhone15を買った。買わざるを得なかった。

iPhone15が発表された時、俺はAppleイベントをリアタイで見ていた。Lightningをやめますと言うのに1時間以上かけるような連中にサステナビリティの説教をされたくないと思ったが、俺はiPhone以外の選択肢をほぼ考えていなかったので買うことにした。

iPhoneは高い高いと言われているが、Appleがやっている24ヶ月乗り換えの分割払いプランを利用すれば2/3の値段で購入できる。2年で8万と言われたら妥当な気がするので俺はこのプランで申し込むことにした。

結果から言えばこれには失敗した。このプランを利用するにはペイディが必要で、俺はペイディが提示する要件を満たす本人確認書類を持ち合わせていなかった。免許もなければマイナンバーカードもない。俺は俺なのに俺であることを証明できない。認証的アイデンティティクライシスに陥っている。

仕方がないのでマイナンバーカードの交付申請を行ったが、まあまあ時間がかかるらしいことがわかった。勘弁してくれ。

それでも、その時に使っていたスマホが生きている間はまだ良かった。画面にヒビが入った後も幾度となく地面に落とし続けた結果、画面の右下のほとんどが見えなくなってしまった。f:id:kantarow:20231019022937j:image

漫画も小説もツイートも読めないなら文鎮と変わらない。みんはやをやったら画面右端の選択肢が見えない。仕事で外部に送るメッセージの推敲もできない。不便極まりない。

週末には相模原から豊洲まで歩く地獄イベントに参加予定だ。26時間の道中をやり過ごすための必須アイテムがこれでは話にならない。可及的速やかに端末を調達する必要がある。

仕方がないので24ヶ月払いでiPhone15を購入した。24ヶ月乗り換えを利用することはできなかったが、行ってないジムを解約すれば収支はむしろプラスなのでよしとした。ジム解約のきっかけをありがとう。

配達は週末に間に合うか微妙なところだったので受け取りを選択した。銀座のストアがオフィスから歩いてすぐのところなのでそこを選択し、出社前に寄って回収することにした。

ストアには多種多様、と言っても大体同じような見た目をしていて大きいか小さいかの違いしかない板たちが並んでいた。こういうガジェットに心惹かれなくなってきていることを自覚しながら受け取りの窓口を探す。どうやら地下に受け取り部屋があるらしかった。

店内奥の階段を降りるとスタッフが出迎えた。事前にApple Walletに登録したQRコードを読み取り、唯一の身分証であるパスポートを提示する。スタッフがバックヤードに引っ込んで、しばらく経つとブツを持って出てきた。

この辺りのオペレーションは洗練されていてかなり受け取りやすかった。気楽で助かる。

その後オフィスで仕事をした後有楽町のビッカメでゴリラガラスを購入し帰宅。自宅で貼り付けを行った。

ゴリラガラスは以前も使っていたが、簡易的な貼り付けキットがあったのを記憶している。今回も同様のものを期待したが、期待を上回りかなりしっかりした貼り付けキットが出てきた。包装なのかキットなのか分からないプラスチック片に翻弄されながらようやく手順を把握すると、その間違えようのなさに感心した。ミスる余地がほとんどない。おかげで綺麗に貼ることができた。

さて、肝心の使用感だが、今のところよく分からない。iOS17がデフォで入っているので前の端末より便利に感じるが、単に俺がアプデをサボっていただけなのでこの端末特有のアドバンテージではない。画面が割れてないのが嬉しいがこれについては言うまでもない。

敢えて言うなら、iPhone14から搭載されたdynamic islandの体験が結構いいという点だろうか。ノッチ部分をオシャレに使うのがすごい。

f:id:kantarow:20231020020424j:image

まあでも、俺はガジェオタじゃないので全然分からない。シンプルに身辺の品を新調しただけの話だ。あと俺はガジェオタが嫌いなのでこれを読んで絡んできたガジェオタは全員ブロックする。

以上です

MySQLのデッドロックを直そう

はじめに

俺がプログラミングが下手なせいかデッドロックがたまに起きる。対処法としてよくあるのがリトライしようとかロック順序を揃えようとかだが、どうしても後手に回ってしまうのが実情だ。

そこで事後的にどうにかする機会がたまに発生するのだが、リトライではなく根本的な直し方を解説する。

直し方

簡潔に説明すると以下の通りだ

  1. show engine innodb statusを出してデッドロック発生箇所を突き止める
  2. 手元でクエリを発行しながらdata_locksテーブルを眺め、機序を突き止める
  3. クエリを直す

簡単だね

SHOW ENGINE INNODB STATUS

この記事に確認方法が書かれている。

MySQL(InnoDB)でのDeadLock調査 - Qiita

直近で発生したデッドロックがどのトランザクションによるものかが分かる。ここで対処法が明確にわかる場合もあればそうでない場合もある。分からなければ後続のdata_locksを見る方法を推奨する

data_locks

MySQL :: MySQL 8.0 リファレンスマニュアル :: 27.12.13.1 data_locks テーブル

data_locksテーブルにはトランザクションによるロック状況が記録されている。適当にクエリを投げつつ、途中でdata_locksの中身を確認すれば、どこで何がどのようにロックされているかが分かる。

show engine~でもざっくり何が起こっているかは分かるが、もっと詳しく見たいだとか、ロックの種類に慣れ親しんでいないため自分の推論に不安があるとかの場合、これを見るのが確実。

MySQLのロックに関するドキュメントを読み込んでこれを見れば、どのようにデッドロックが起きているか言葉で説明できるようになるはずだ。あとはうまい具合にデッドロックが起きないように修正すればOK

デッドロックを直した時の話

最後にエピソードを一つ。MySQLでテーブルを結合してSELECT FOR UPDATEすると、結合先のテーブルまでロックされてしまう。Railsの一括読み込みのインターフェイスを利用しつつロックを取ったところこの罠を踏み、結合先のレコードをロックしたことによるデッドロックが発生した。

この時はshow engine~してもよく分からず(だってそこがロックされるなんて思わなかったんだもん)、data_locksを見て初めてJOIN先のロックが悪さをしていることに気がついた。FOR UPDATEだと排他ロックがかかるが、この時は共有ロックであればデッドロックが起こらない状況だったので、そうすることで済んだ。ロックの種類による競合の仕方とかも把握しておくと良い。

また小技として、JOIN先をロックしたくなければサブクエリを利用するといい方法がある。外側でSELECT FOR UPDATEしていても、サブクエリで参照されるテーブルにはロックがかからないことを利用している。

innodbでサブクエリを使ったときの FOR UPDATE のロックの範囲 - ngyukiの日記

中退した話

いろいろあって茨城高専を中退した話です

入学まで

中学生時代にプログラミングに興味を持ち、地元から少し離れているが県内にある茨城高専を受験した。
当時は高専の校風に憧れていて、工学オタクと過ごす学生生活に期待を抱いた。そのため高専以外の選択肢をあまり考えていなかった。
希望していた専攻へのチケット(茨城高専では専攻への配属は三年からで、基本的に成績が良い方から優先的に選ぶことができる。これを受験時に先に選べる仕組みがあったためそれを使った)と共に合格した。
実家があるつくばから高専があるひたちなかへのアクセスはあまりよくない上に早起きに自信がなかったため寮を選択した。

学生生活(~2年)

一年生の頃はロボット部に所属していた。回路班でコード書いたり基板を削ったりするのは楽しかったが、そういった活動に熱が入ったおかげで成績は徐々に落ちていった。それでも最初の頃は結構よかったことを記憶している。
ロボコンが終わって二年生になると今度は技術系のアルバイトを始めて(といっても開発業務ではなかった)、金が入るようになったので遠くに出かけるようになった。東京でやってる展示会や技術系イベント、高専カンファレンスなどにも行った。ハッカソンなどのイベントにもちょくちょく出ていた。
二年生の年末に開発のバイトを始めた。ここで割ともらえるお金が増えたので一人暮らしを始めることにした。かねてより寮が合わないと感じていたのが大きな理由だった。

コロナ、ひとり暮らし、留年

春休みが始まるタイミングで学校の近くで一人暮らしを始めた。それはもうわっくわくだったが、その後コロナウィルスが流行する。
遠隔授業の間は登校の必要がなかったので、家でひたすらバイトのコードを書いてゲームをしていた。
最初はそれなりに楽しかったが、学業の方はおろそかになる一方だった。もともと課題の管理が苦手でほぼテスト点で切り抜けていたが、遠隔授業では課題の分量がでかい。課題の提出をもって出席とする科目などは致命的だったが、なんだかんだで救済措置はあったのでそれで乗り切った。
夏休みが終わって、確か一か月ほど経ったくらいで対面授業が開始された。
コロナ禍でたるんだ生活力では徒歩10分の登校も困難で、ひたすら遅刻していた結果、年度末には単位を取るには出席が足りない教科がいくつか出てきた。
あまり大きな声では言えないが、それでもいくつかの教科の担当教員は救済措置を講じてくれた。しかしある科目だけはそれが許されず(本来それが正しい)、留年を余儀なくされた。

留年生活

留年後最初の登校は結構緊張したが、知り合いがいたのと、親切な人が多かったので大いに助かった。
起きれない俺のために毎朝モーニングコールをしてくれるやつもいた。本当にありがとう。
最初は結構前向きに頑張っていたと思うが、それもなかなか続かず、また遅刻続きの生活がはじまった。
また金策にも困り始めた。一年やっていた有給のインターンが終わり、知り合いのつてで始めたバイト先が一か月で潰れた。九月ごろだったと記憶している。このタイミングで収入が途絶え、一方で浪費癖が直らず、親に仕送りを頼みつつWantedlyでバイト先を探し始めた。結果いい感じのところが見つかり、都内だったのでお願いしてリモートでインターン生として参加させてもらった。

二度目の三年生は出席もやばかったが、成績の方がもっとやばかった。
課題を全く出さないことに加え、テストに臨む態度も昨年よりよほど不真面目であったため、最終的に5教科くらい落ちていたと思う。その中には体育もあった。
結局年度末には進級は難しそうだということになっていた。このタイミングで春休みのコミットについてインターン先から聞かれたので、学校をやめるかもしれないのでその時はフルコミしますということを伝えた。
その日のうちに親に退学の意思を伝え、次の日には担任にも同じことを言った。特に反対はされなかった。
あまりにもスムーズに話が進んだので、今の上司は驚いていた。

退学までにやったこと

高専を三年次まで履修すると大学受験が可能になる。これはおそらく高卒認定を取るのと同じような効力を持つのだと思う。
一方学歴の方は中卒になる。まあ履歴書などには高専三年次修了後退学、くらいは書いていいのかもしれないが。
なので当然休学からの大学受験も選択肢に入ってくる。ちなみに俺の場合は色々あって休学の選択はしないことにしていた(退学するからということでいろいろ面倒見てもらった面があったので)。

しかしその時の俺は三年次修了すら難しい状況だった。
そのような場合にも一応どうにかする方法がある。三年次修了せずに退学する場合、どうやら足りていない単位について再受験が可能なようだ。「高卒相当の学力を有する」という保証を土産に持たせてくれるらしい。
俺の中ではそのまま中退して、欲しくなったら高卒認定でも取ろうと考えていたが、担任にその旨を伝えると上記の方法を提示してくれた。
結果的にその方法は取らず、やっすい頭を下げて課題を出すなどして修了したのだが(退学すると決めたからできたことだった)、一応このような方法もある。学校によるかもしれないので学則など確認してほしい。

そうして無事(?)に高卒相当の学力を有すると認められた俺は悠々と退学。そこに住み続ける必要がなくなった1Kのねぐらに帰り、日がな一日コードを書く生活が始まった。

反省

まず出席はするべきである。出席をするのに必要なのは気力であり、気力を生むのは前向きな心持ちだ。としか言いようがないくらい気持ちの問題で学校に行けてなかった。
多少欠席が続いたくらいでは留年しない場合もあるので、あまり気に病まず前向きにやるべきだった。
また俺は教員に相談すると安心する人間だったらしいとうのが最後の方に分かった。自分の進級の可否を握ってる人間に腹の内をさらすとだいぶ楽になる。そうでなくても親身に聞いてくれるいい先生だった。もっと早くから定期的に相談すればよかったと後から思った。

あといきなり退学というのも結果的になんの不利益にもならなかったがやめた方がいいと思う。休学という選択肢もあるし、進級 or 退学という極端な状況は避けるべきだった。
ちなみに退学後は学生身分を失った状態でしばらくフリーターをやっていたので、親に就職をせかされていた。休学ならそんなことも起こらないだろう。

その後

ITエンジニアとして就職してかなり大丈夫になっています
朝は未だに起きれません

(終)

不定記 2022/12/13

卓上のライトが届いた

f:id:kantarow:20221214024543j:image

読書用に、柔らかめの暖色で机をちょうど照らしてくれるライトを探していた。

Amazonで検索すると怪しい日本語しか出てこないのでかなり迷ったが、5,000円くらいの本品を購入。

わりと凝ったもので、タッチ操作できたり、リモコンがついたりする。タイマーもあるので寝る時の照明にも使えそう

オマケで気付いたことだが、部屋を暗くしてこのライトをつけると、ディスプレイの光で目が痛くならない上に机上しか見えないので集中力が保ちやすい。

とにかく情報のノイズに弱いタチなのに部屋を片付けられないという難儀な人間はとりあえず部屋を暗くしてディスプレイ周りだけ照らしてみると良いかもしれない。

つば付きの帽子をかぶって机の左右に板を立てるなどの方法も考えていたが、光のコントロールで案外どうにかなりそうなのはうれしい。

 

友達が勝手に俺のステッカーを作っていたことが判明した。

f:id:kantarow:20221214025057j:image

五日間もそのことを黙っていたのが一番すごい。俺ならすぐに言っちゃう。

 

12月も真ん中に差し掛かるということで、去年の暮れのことを思い出していた。

当時は学校やめるかやめないかみたいな時期だったのかな?そこまで考えていなかったような気もする。やめると決断した瞬間のことはしっかり覚えているが、それ以前は退学なんてあまり現実味がなく、いざとなればそういうこともあるだろという程度に考えていた。

今なら結果オーライと言えるが、衝動でその決断をして次の日には周囲の了解を得ていたのって危う過ぎる。

Railsのアクションごとの権限管理

current_userでログイン中のUserを取れるとする。
Userはrole的なものを持っており、この値によってアクションへのアクセスの可否を決定したい。

たとえばこんな感じ

class User
  enum role: { general: 0, admin: 1, guest: 2 }
end

ApplicationControllerにサブクラスから利用するクラスメソッドを定義する

class ApplicationController < ActionController::Base
  def self.require_permission(permitted_roles, options = {})
    before_action lambda {
      return if permitted_roles.include?(current_user.role)

      render 'errors/forbidden', status: 403
    }, **options
  end
end

サブクラスからはこう使う

PostsController < ApplicationController
  require_permission %w[general admin], only: %i[new create edit update]
  # 以下略
end

before_actionで使えるオプションは使えるので、いつものノリでアクションを指定できるのが嬉しい。

【Rails】Ransackで日付検索

Ransackのイニシャライザ(config/initializers/ransack.rb)にpredicateを追加する。
名前は適当

Ransack.configure do |config|
  config.add_predicate 'in_all_day',
                  arel_predicate: 'between',
                  formatter: proc { |time| time.all_day }
end
= search_form_for @q, url: some_url do |f|
  = f.date_field :created_at_in_all_day, include_blank: true

lt_eqとかでやると二つの日付から絞り込まなきゃいけなかったり、指定した日付が含まれなかったりして困るけど、これで解決した