わいえむねっと

Contents
Categories
Calendar
2026/11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Monthly Archives
~2000/01
Recent Entries
RSS1.0
Templates
Information
Processed: 0.050 sec
Chashed: -
2026/08/22 Sat
胆のう摘出の手術をしてから二か月が経過。
術後の状態確認で MRI を撮ってくる。
結果は特に問題なし。

あと、今回の MRI でも膵臓には何も写りませんでした。
過去に診断された IPMN はなかったことになった。

先生「他に何か気になることはありますか」
なや「腎臓で石が見つかっていたのが気になってるくらいですかね」
先生「(写真をスクロール)あーこれですね。これが下に落ちると…」
なや「めちゃくちゃ痛いやつですね」
先生「そう、めちゃくちゃ痛いやつww」

不意に「痛いやつ」って差し込まれてツボに入ったのか、先生爆笑してた。 スーパーの弁当コーナーでなんにしよと眺めてたら、店員さんに案内されてきたお婆さんが鮭ハラス飯を買っていき、うまそうだなと思ったので自分も購入。

帰ってから気付いたけど、これ二人前だな? 今日はかよちゃん。

土砂降りだったけど、雨雲レーダーを見た感じ2時間もすれば通り過ぎそう。
飲んでいるうちに上がるだろ。
足元びしょ濡れになるだろうから、靴下は脱いでサンダルで出掛ける。


かよちゃん - 下総中山/居酒屋 | 食べログ
https://tabelog.co​m/chiba/A1202/A120202/12020652/





いつものように栄川を二合。
惣菜の盛り合わせ。




お次は木戸泉を二合。
今日は いかの丸干しがあったぞ。



女将さんが以前勤めていたスーパーの店長さんが今も昼営業に来てくれているって話は前に聞いていたけど、いつも定食と惣菜盛り合わせを食べながらビールに日本酒三合を飲んでいると聞いてびびる。
その量飲んで仕事戻ってるの。 雨はすっかり上がった。予定通り。
今日は雨上がりのにおいがしないなと思いつつ、江戸川沿いを歩く。



またサンダルで10km超歩いてる。


今日も元気。
2026/08/21 Fri
冷凍庫のロックアイスがでかいかたまりになってた。
一回溶けたなこれ。
開けっ放しになってたか?

前に買い替えたのが2009年なので、そろそろ故障してもおかしくはないんだよな。 歯医者20回目。
仮歯無限ループ。
2026/08/20 Thu
朝東京ばな奈。
2026/08/19 Wed
昨日と打って変わって忙しい。
2026/08/18 Tue
暇すぎて業務と関係ないコードずっと読んでる。
2026/08/17 Mon
朝自販機でお茶を買ったらSuicaの残額が15円。 LINE公式からメッセージがきててなんだろと思ったら、

いつもLINEをご利用いただき、誠にありがとうございます。

FacebookアカウントによるLINEログイン機能のサポートは、2024年1月に終了しました。それに伴い、現在ご利用中のログイン方法では、ご利用いただけなくなります。

現在のLINEアカウントを引き続き利用するには、2026年12月31日までに電話番号を登録してください。

期日までに電話番号を登録されない場合、お客様のFacebook連携IDは削除され、LINEアカウントがご利用いただけなくなります。アカウントに紐づく情報やアイテムを継続してご利用いただくためには、必ず2026年12月31日までに電話番号の登録を完了してください。

Facebook連携を使って電話番号登録を回避して複数アカウントつくっていたのがついに無効になった。
2026/08/16 Sun

TweetVault③

前回

TweetVault①
TweetVault②

絞り込み機能の拡張

標準だと「テキストボックスに入力した単一ワード」+「一覧から選択した単一タグ」の絞り込みにしか対応していないので、複数条件で絞り込めるようにしたい。

  • 複数ワードの絞り込みに対応
  • テキストボックスに「#xxx」の形式で入力した場合にタグとして絞り込む。複数指定可。一覧で選択したタグとAND。
  • テキストボックスに「-#xxx」の形式で入力した場合にタグを含まないものに絞り込む。複数指定可。

backend/internal/services/bookmark_service.go(前回からの差分)
@@ -7,2 +7,3 @@
     "strconv"
+    "strings"
 
@@ -196,2 +197,7 @@
 
+    type Tag struct {
+        Name string `json:"name"`
+    }
+    var tags []Tag
+
     query := s.db.Model(&models.BookmarkView{})
@@ -205,3 +211,3 @@
     } else if tag != "" {
-        query = query.Where("tags_json::jsonb @> ?", fmt.Sprintf(`[{"name":"%s"}]`, tag))
+        tags = append(tags, Tag{Name: tag})
     }
@@ -210,4 +216,20 @@
     if search != "" {
-        query = query.Where("full_text ILIKE ? OR name ILIKE ? OR screen_name ILIKE ?",
-            "%"+search+"%", "%"+search+"%", "%"+search+"%")
+        words := strings.Fields(search)
+        for _, word := range words {
+            if strings.HasPrefix(word, "#") {
+                tags = append(tags, Tag{Name: strings.TrimPrefix(word, "#")})
+            } else if strings.HasPrefix(word, "-#") {
+                query = query.Not("tags_json::jsonb @> ?", fmt.Sprintf(`[{"name":"%s"}]`, strings.TrimPrefix(word, "-#")))
+            } else {
+                query = query.Where("full_text ILIKE ? OR name ILIKE ? OR screen_name ILIKE ?",
+                "%"+word+"%", "%"+word+"%", "%"+word+"%")
+            }
+        }
+    }
+    if len(tags) != 0 {
+        jsonData, err := json.Marshal(tags)
+        if err != nil {
+            return nil, 0, err
+        }
+        query = query.Where("tags_json::jsonb @> ?", jsonData)
     }
冷凍揚げナスで味噌汁。
2026/08/15 Sat


手術してから走れていなかったけど久しぶりに。

前日の雨で路面は悪く、ところどころ水浸しの状態。
カニも道路に迷い込んでた。
迷いガニオーバーラン。




サンダルで10km歩き回ってるおじさん。
2026/08/14 Fri
ブックマーク2500件の整理完了。 整理していた中で「元十徳の店員さんがやっている店」というのが発掘されて、そういえばブックマークしてたっけと思い出す。



調べてみると、こちらの店のオープンは2012年。
自分が十徳に初めて行ったのは2014年なので自分が知っている店員さんではないか。
まぁせっかくなので行ってみようと一路中野坂上。



中野坂上に着いてみたところ既視感。
このときだ。

泥酔してスマホを紛失した翌朝、受け取りにいったのが中野坂上でした。。 お店は地上に出てすぐ。


居酒屋 じゃんだら - 中野坂上/居酒屋 | 食べログ
https://tabelog.co​m/tokyo/A1319/A131903/13149071/





ブックマークしていた記事だと日本酒をいろいろ扱っていそうだったけど見当たらず。
松竹梅 豪快を注文。

静岡おでん。
大根にすじぼこ。




松竹梅をもう一杯。
変わり種でモッツァレラ巾着。



立呑や じゃんだら(@janndara.nakanosakaue) • Instagram写真と動画
https://www.instag​ram.com/janndara.n​akanosakau​e/

居酒屋 じゃんだら(@izakaya_jandara) • Instagram写真と動画
https://www.instag​ram.com/izakaya_ja​ndara/

後で調べたら、インスタのアカウントが2つあり、下がリニューアル後のもの。
リニューアル前は日本酒をいろいろ扱っていたようだけど、変わってしまったのかな。 さくっと上がって次へ。
路地入ってすぐのところにL字カウンターのみの店があったのでネットで調べてみたけど情報が見つからず。
店名は福ちゃん。
新しい店というわけでもなさそうなんだけど。




店の外に貼ってあるメニューを見た感じ高いってわけでもないので入ってみる。





新宿 清酒。
アテに油揚げの納豆はさみ焼きを頼んだけどなかったので焼きさば。




福 純米吟醸。



入店時は自分一人だったけど、飲んでいるうちに一人二人とお姉さま方が。
ここも2杯でさくっと上がる。 移動して十徳へ。







壁のメニューから寿福絹子。
店員さんから「飲み方は?」と聞かれて一瞬「?」となったけど、これ焼酎か。日本酒じゃなかった。
まぁいいかとロックで注文。

アテにバクダン納豆。
さっき食べ損ねた納豆フラストレーションを解消。

続けて水鏡無私もロックで。




最後は日本酒で〆る。遊穂。
2026/08/13 Thu
コードブロックがある時にスマホからだと意図した表示になっていなかったのをずっと放置していたけどようやっと修正。

…したんだけど、手持ちのスマホで反映されず。
キャッシュのせいか。
仕方ないので、cssのリンクにクエリパラメータを付与。

これいい加減なんとかならんのかね。

TweetVault②

前回

TweetVault

アクセス改善

バックエンドへのアクセスが localhost になっていたのをポートフォワードで捻じ曲げていたけど、ポートフォワードなしで動くようにしたい。

frontend/src/lib/api.ts に下記コードがあり、.env に NEXT_PUBLIC_API_URL を定義してやればいいのねと思ったけどダメ。

const API_BASE_URL = (process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8080') + '/api';

それならと、この定義を直接書き換えてみたけどダメ。は?

調べてみると、frontend/.next/server/app/page.js で API_BASE_URL が設定されていた。
で、そこの元はどこだと探すと docker-compose.yml。

  frontend:
    environment:
      - NEXT_PUBLIC_API_URL=http://localhost:8080

ここを仮想環境のアドレスに書き換えて解決。


データ反映の改善

タグを付与した後、しばらくしないと反映されないのをどうにかしたい。

調べた感じ、
  • DBには即時反映されている
  • APIを直接叩いてみると、単体取得では即時反映されているのに、ページ取得では即時反映されていない

なんでページ取得だと即時反映されないんだと思いながらDBの構造を眺めていたところ、マテリアライズドビューが目に入る。
マテリアライズドビュー経由かどうかの差異かこれ。
確認したら、5分おきの更新になっていた。

以下の対処で解決。
  • マテリアライズドビューと同じ内容のビューを別名で定義
  • 新規ビューから取得するよう向き先を変更

backend/internal/models/materialized_view.go
@@ -31,3 +31,3 @@
 func (BookmarkView) TableName() string {
-    return "bookmark_views"
+    return "bookmark_views_normal"
 }


未整理ブックマークの表示

タグを付与していないデータだけを表示したい。

ダミーのタグを作成し、絞り込み条件でそのタグを指定された場合はタグのないデータを抽出するよう対応。

backend/internal/services/bookmark_service.go
@@ -202,3 +202,5 @@
     // Apply tag filter if provided
-    if tag != "" {
+    if tag == "untagged" {
+        query = query.Where("tags_json::jsonb = ?", "[]")
+    } else if tag != "" {
         query = query.Where("tags_json::jsonb @> ?", fmt.Sprintf(`[{"name":"%s"}]`, tag))



これなんでマテリアライズドビュー使ってるんだろと思っていたけど、「1件の投稿に紐づくn件の情報(メディア、タグ)を JSON 変換、1カラムとして取得」とかしてるからか。
変換のオーバーヘッドを減らすためなんだな。

コードは簡潔になってるけど、トレードオフで犠牲してるものがでかすぎない?w 今、瞬断したな?