eityansメモ

eityansメモ

ゆるくやっていきます

記事一覧RSS

group_by を group + array_agg で高速化する(PostgreSQL)

こういうパフォーマンス改善もあるよメモ


ユーザーと記事があり、ユーザーは記事をお気に入りできる。お気に入りには種類がある。お気に入りの種類ごとに記事のidの配列を取得するような処理を考える。

1{
2  "like_name_1" => [1,2,3,4],
3  "like_name_2" => [5,6,7,8],
4}

最終的にはこんな感じのデータを取りたい

group_by を使う

1Like
2  .where(user_id: user.id)
3  .select(:name, :post_id)
4  .group_by(&:name)
5  .transform_values { |v| v.pluck(:post_id) }

group_byでDBの結果を取得しtransform_values以降をRailsで処理することになる。数が多い場合はパフォーマンスが気になる

group + array_aggを使う

集約関数のarray_aggを使う

NULLも含めてすべての入力値を収集して配列に格納します。

1Like
2  .where(user_id: user.id)
3  .group(:name)
4  .select(:name, "array_agg(post_id) as post_ids")
5  .to_h{ |g| [g.name, g.post_ids] }

こうすることでgroupの処理をDB側に寄せることができる。ただし、可読性の低下や、PostgreSQLに依存した実装になってしまうためそのあたりのデメリットは考慮すること。


ちなみにMySQLの場合はGROUP_CONCATが使えそう

RenderのServicesをStarterプランからFreeプランに移して節約する

Render上で動いている個人開発アプリがある。地味に利用されているが、そこまでバズっているわけでもない。

ServicesをStarterプランで毎月$7払っていたが、少しもったいない気がしたので、思い切ってStarterからFreeプランにダウングレードした。

Render側ではプランを変更するだけでできる。

問題はFreeプランの制約である。15分アクセスがないと落とされてしまうため、その後の起動が遅くなってしまう。

Spinning down after 15 minutes of inactivity

監視ツールであるUptimeRobotを使い、死活管理をしつつ定期的なリクエストを実現した。これで少しお金が浮いた✌('ω')

Cline使ってみたメモ

深夜に「AIエージェントをちゃんと使ったことがないな」とふと思ったので試してみたメモ。


Clineとは

  • Cline Bot Inc.社が開発

  • CLIとエディターを使用できるAIアシスタント

  • なんかもういろいろやってくれる

  • AIプロバイダーと共に使う

導入

Clineの導入

  1. 拡張機能を入れる

  2. AIプロバイダーを選択する(色々あるけど今回は安いDeepseekを選択)
    1. (データの扱いはどうなんだという話がありますが、今回は個人開発のレベルなのであまり気にしないことにしました。)

  3. プロバイダーのAPIキーを設定する

トークンの購入

DeepseekでAPIを呼び出すのにお金がかかるので、トークンを買った。お試しで$2。

購入した以上のコストが掛からないのは安心。

使ってみる

シンプルなhtml + cssのページの改修を依頼。身内の思い出を時系列で並べている単純なhtmlがあり、基本的に同じようなタグ構造が並んでいるもの。

対話型で作業が進む。小さく作業の方針を確認して、それに同意したら作業を進めるようなプロセスを繰り返す。作業中、エディタでコードが生成されていくところが未来感あってテンション上がる。

まずはAIくんに、良い感じにしたいんだけどどうすればいい?と聞いてみた。「中身をjsonに切り出し、ビルドスクリプトを作って静的ファイルを生成する仕組みを作る」のはどうでしょう?と提案、試しにお願いしてみると少し大げさすぎるものが出来上がった。

何回か対話を行い、最終的に「中身だけをjsonに切り出して、JavaScriptでjsonを読み込んでそこからDOMを生成する」方式に決定。

なんだかんだ対話を1時間ぐらいしていたが、最終的にやりたいことができて大満足。コストは$0.17

感想

  • シンプルに便利

  • やりたいけどめんどくさいみたいな作業をとりあえずお願いするのに向いているかも

  • 一部指示から外れたhtmlがあり、それをjsonに落としこめなかった(無視した)ところがあったので、出てきたものをチェックするのは人間の仕事だなと

  • トークンの関係なのか、60個ぐらいの置き換えをするのに複数回に分けて作業をしていた。もしかしたらもっとうまいテクニックがあるのかも知れない?

  • 個人開発だからのびのびとトライできたけど、これらを業務で使うとなると慎重になる気持ちもわかる。積極的に使いますと意思決定ができる組織って改めてすごいなと思う。

  • AIプロバイダーやモデルの選択がたくさんありすぎて、逆に困ってしまう。高いモデルも今度ためしてみるか..?

深夜テンションで始めたことだけど学びが多かった。今後も使っていきたい。

インプラントの手術を受けたメモ

前歯のインプラントの手術をした。複数回手術を行う。せっかくなので記録を残す。


骨を足す手術(0回目)

2023年の9月に実施。お値段は19万円。インプラントの基本的な流れとして、骨にインプラントを埋め込むためのボルトをいれる手術を行い、その後にインプラントをいれる手術を行う。自分の場合は骨がとても薄く、まずその骨を増やす手術から行った。

手術を行ったが結果あまり骨がくっつかず、最終的に今のお医者さんを紹介してもらった。(なので0回目にしている)この人の手術が一番痛かったし、術後の出血がえげつなかった。今思うと、無駄とまでは言わないけど最適解ではなかったのかもなーと思っている。(そもそも、インプラントをどこで受けるべきかがわからなすぎ問題がある。)

骨を足す手術(1回目)

2024年の10月に実施。お値段は37万円。

手術をする前に全身麻酔オプションの案内を受けた。全身麻酔すると完全に寝ている間に終わってしまうらしく、せっかくの手術体験を逃す気がしたので全身麻酔なしにした。医者に「強いっすねw」って言われた。

前回は動物の骨を使ったらしく、(いろいろな選択肢があるらしい)その結果骨がくっつかなかったのではという見解。今回は自分の骨を使って骨を増やすことに。

右下の顎から骨を採取し、その骨を前歯の土台となる骨に追加した。手術自体は部分麻酔もしてもらい快適(?)だった。術後の話で言うと、出血が一切なかった。名医すごい。前歯の腫れもひどかったが、採取源のあごの腫れのほうが長引いたししんどかった記憶。


ここまでは記憶を元に書いているためかなりざっくりしているが、ここからは詳細に記録していきたいと思う。

骨を足す手術(2回目)

2025年の4月に実施。お値段は44万円。

前回の手術で骨は増えているものの、インプラントの土台を埋められるかどうかは開けてみないと判断できないとのこと。1回目と同じ手術を行い、行けそうなら土台を埋めちゃう作戦らしい。

今回削るのは左下の顎。天気がとても良かった。

手術を行う前に血圧などの測定を行う。医者に「手術の場でここまで安定している人は初めてみました」と言われる。ポーカーで謎のメンタルがついているのかもしれない。

今回も全身麻酔はやらないが、部分麻酔は行う。強い麻酔のようで、麻酔した直後に心臓がバクバクする。そういうものらしい。こんな即効性のある薬がこの世に存在すること自体が面白くなる。

手術自体はやることがないし、麻酔も効いているのでただ横になっているだけ。麻酔が効いているとはいえ、振動や匂い、血の味などは全然感じるので、「今切られているんだな」とか、「めっちゃ顎の骨削られている」とか、そういうのをダイレクトに感じる。これは確かに苦手な人は全身麻酔したほうが良いかも。

手術中はまじでやることがない。口を開ける、大きく開ける、舌をどかすぐらいしかオプションがないし、大部分は口を開けるためのつっかえ棒が入っていたので本当にやることがなかった。手術中に何度か寝てた。医者に「さすが。ありがたい。」と言われた。

やることがなさすぎて、どうでもいいことをひたすら考えていた。これまでの人生を振り返ったり、ちょっとした走馬灯のような感じもした。久しく会っていない人に会いたくなった。

手術自体は3時間半ぐらいかかった。

手術後はちょっと腫れているくらい。術後の説明を受け、ヘロヘロになりながら帰る。まだ麻酔はきいているが、痛くなりそうな予感がある。麻酔で感覚がないのと、唇が張っているため口を閉じにくい。マスクをしてマスクの中で口を開けながら帰宅した。

帰宅後は基本的に横になっていた。

タブレットスタンドBluetoothリモコンを使って、寝ながらコンテンツを享受していた。

食事はビーフシチューを食べた。


術後翌日

出血はなし。ただ全身がだるいので基本だらだら過ごした。YouTubeを見て過ごした。

食べたもの:プリン、ビーフシチュー、Oikos

2日後

出血なし。全身のだるさもなくなった。腫れはひどい。普通に仕事ができた。リモートワークありがたい。

痛み止めはまだ飲んでいる。切れて来るとじわじわと痛みが来る。痛み止めを飲むと治る。

食べたもの:ビーフシチュー、ドライフルーツ、ドーナツ、鍋、ヨーグルト

3日後

出血なし。だるさなし。腫れはピーク過ぎたかも?

痛み止めは継続して飲んでいる。6時間に一回は飲んでいる。

上唇の腫れが引いてきたので初めて裏側を見た。血餅と言われる白いぶよぶよができていた。

そうめんはなんとか食べられたが、炭酸はしみる

4,5日後

腫れはかなり治まってきた。ただ下顎の方が固くて動きにくい感じがする。顔を動かすと痛い。

喋ったり笑うととても痛い。引きつってしまう。

食事もずっと右側だけを使っている。

しばらく家を出ていないのでボルダリングが鈍ってしまうのではないかと心配。

6日後

上側の腫れはほぼ治まった。下顎はまだ動かすと痛いし、ブラッシングも避けている。

痛み止めもまだ飲むが、一日2,3回ぐらいに頻度は下がってきた。

12日ぶりにボルダリングをした。当然いろいろ弱くなっていた。

7日後

奥歯の方を抜糸。奥歯が膿んでいるので抗生物質追加。

前歯のブラッシングは柔らかいブラシで解禁された。

食事も比較的自由に食べられるようになった。

奥歯は痛むので痛み止めはまだ飲む。

8日後

痛み止めはまだ飲む。上唇裏の歯茎が少し裂けている気がするけど、血も出ていないので様子見。

(腫れが引くまでは以降更新する予定)

「ボール」を溜めないように仕事をしよう

タイトルで言いたいことは言った。


完全リモートワークの生活をしている。自分以外のメンバーがどんなふうに働いているのか一切わからないが、「ボール」がどこに溜まっているのかはGitHubやSlackのやり取りを見ていればなんとなくわかる。

ここで言う「ボール」は、そのタスクを進めるためにアクションする人を指す。コードレビューを例にすれば、レビュー依頼を受けたら、レビュアーが「ボール」を持つし、レビュアーがレビューしていくつかコメントをしたら、今度はレビュイーが「ボール」を持つ。

誰かが「ボール」を抱えてしまうと、そのタスクはそれ以上進むことはない。

仕事が進まないときというのは、たいてい誰かが(自分かもしれない)「ボール」を抱えていることが多い。

そして、人間なので「ボール」を抱え込んでしまうことは一定ある。

なぜ「ボール」が溜まるか

「ボール」が溜まりやすい理由の種類は大きく二つある。組織の問題と個人の問題である。組織の構造上「ボール」が溜まりやすくなることはあり、それはそれで解決すべき問題だが、ここでは個人の範囲で述べる。

「ボール」の量は自分がコントロールしにくい部分だ。なので「ボール」が溜まっている状況自体は大きな問題ではないが、それらをどう対処するかは個人で差が出る部分だ。

2,3分で対応できそうなレビュー修正を数日寝かせているような状況を見たことがある。これだと終わる仕事も終わらない。完全リモートなので、なぜそういう状況になっているのか原因を把握することが難しい。完全リモートの良くないところの一つだ。

マインドセットの問題がありそうだ。ここからは想像も含めて「ボール」が溜まる理由を書いている。

  • タスクが多すぎて優先度の判断すらできなくなっている

    • これはかなりやばい

    • 自分がこうなっていると思ったら助けを呼ぼう。

    • 誰かがこうなっていたらすぐに助けよう。

  • 忙しいことに対する謎の幸福感

    • うまく言語化できないが、そういう感情はある

  • やることがある安心感

    • やることがない状態を恐れるあまり、仕事を手放したくない人もいる。

    • 適度にタスクを追加で与えると、過去の「ボール」を手放してくれる傾向にある。

  • 意図的にボールを抱え、自身の存在感を上げる

    • 恐ろしい話だが、かつてそういう人と働いたことがある。歪んだ生存戦略である。

    • 似たようなものとして、属人的な知識を溜め込む人もいる。

    • ただし、ボールを抱えている人を安直にそういう人だと判断してはいけない

  • ボールを抱え込むことで生じる問題を理解していない(意識していない)

    • 意外とこういう人は多い。以下そういう人に向けて問題点と、対処法を書く。

「ボール」を溜めるとどんな問題が発生するか

  • 仕事が進まない

    • シンプルにこれ。「ボール」を溜めている間は決して仕事が進むことはない

  • 仕事の効率が落ちる

    • 自分も相手も仕事の効率が落ちる。

    • 「ボール」を溜めている期間に記憶が失われ、再びその仕事に取り掛かかるときに思い出すコストが余計にかかる

    • 相手にも同じ状況が発生する。相手の仕事の効率を下げている。

  • 精神衛生上よくない

    • やらなきゃいけないことを抱えている状態はつらい。確定申告の時期は憂鬱だ。

    • 「ボール」を投げた方も気になる状態が続く。

「ボール」を溜めないために何ができるか

  • 自分が「ボール」を抱えているかどうか知る

    • 「ボール」の有無を聞かれてパッと答えられない場合はきっと「ボール」を抱えている

  • 「ボール」を管理する手段を作る

    • TODOリストが一番シンプルだが、手段は何でも良い。

  • すぐ返せるものは最優先で返す

    • 考えることが減る

    • 自分はなにかの作業をしている途中でも、すぐに返せる場合はすぐに返すようにしている。短期的には効率が下がるが、長期的なメリットのほうが大きい。何に集中すべきか明確になる。

    • 100%の返答が厳しい場合でも、一次回答がすぐにできるならそれはすぐに行う。状況によってはそれで十分で、「ボール」が消えることもある。

    • なお、雑な中身で返すのはよくない。余計なやりとりが増えるきっかけになる。

  • すぐに返せない場合は、「すぐに返せない」とすぐに返す

    • これができない人は多い。もちろん「ボール」は抱えている状態なので、TODOリストなどの管理に追加する。

    • 合わせていつ返せそうか伝えられるとなお良い

  • 他に適任がいるかどうか探す

    • 丸投げにならないように注意

  • 常に「ボール」を優先的に返す意識を持つ

    • 定期的にTODOリストを見る。対応する。

    • 究極は意識の問題になる。

「ボール」を返すことに集中しすぎて、自分の仕事が進まないのでは?

ボールを返すことに全力を注ぐとそうなる場合もある。何事も極端なのはよくない。ただ、多くの人は「ボール」を抱える側に偏っている傾向があるので、それを少しでも解消できればと思っている。自分の「ボール」を意識するところから初めてみるのはどうだろうか?

最後に、この「ボール」に対する意識は人によって異なる。相手に過度な期待を押し付けないように注意すること。気になることがある場合は対話による提案をしよう。

前のページページ 1 / 11次のページ