[{"body":"","link":"https://blog-lampetty-net.web.app/categories/automation/","section":"categories","tags":null,"title":"Automation"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/automation/","section":"tags","tags":null,"title":"Automation"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/","section":"categories","tags":null,"title":"Categories"},{"body":"毎朝息子に朝ごはんを作っているのだけど、レパートリーが少ないため3日間同じメニューになってしまったりするので、最近はメモアプリに何を食べたか記録してなるべく違うものになるように工夫していた。でで、スマホからメモアプリを起動して入力するのが面倒だったので、ショートカットアプリで音声入力でメモアプリに残すように半自動化してみたという話。\n具体的には「ぼうやの朝ごはん」というノートに以下のようにテキストが追記されていくイメージ。\n04/27月: 夜ご飯のおかずの残り 04/28火: 食パンと目玉焼き 04/29水: ツナサンド ... 完成したショートカットのイメージ ショートカットの設定手順 iOSのショートカットアプリはできることが豊富であるがゆえに、必要な処理を探すのがわかりづらいと感じたので具体的な手順を書いておく。ちなみにiOS 26での手順なのでバージョンが違うと若干異なるかもしれない。\nショートカットアプリを起動 右上の+ボタンで新規ショートカットを作成 スクリプティングを選択して、テキストを音声入力を選択 アクションを検索 -\u0026gt; スクリプティング -\u0026gt; 日付をフォーマットを選択 そのままだと「音声入力されたテキスト」を書式設定することになってしまっているので、「音声入力されたテキスト」をタップして「変数を消去」し、「現在の日付」をかわりに設定する アクションを検索 -\u0026gt; スクリプティング -\u0026gt; 「テキスト」を選択 「変数を選択」の部分から上2つの入力を組み合わせて「 フォーマット済みの日付: 音声入力されたテキスト」を入力するように設定する アクションを検索 -\u0026gt; 「メモ」アプリを選択 -\u0026gt; 「メモに追加」を選択 追記したい先のメモを選択(自分のケースでは「ぼうやの朝ごはん」) ショートカットの起動 毎回ショートカットアプリを開いて作成したショートカットを起動するの面倒なので、自分はウィジェットで起動できるようにしている。あとはSiriを起動して「ぼうやの朝ごはん」と言うとショートカットを起動してくれる。\nSiri経由は、最初のうちはなぜかカレンダーから「ぼうやの朝ごはん」を探そうとして「そんなものはありません」と言われていたのだけど、ウィジェットに登録した後からちゃんと認識してくれるようになった 🤔\n実際使ってみて 音声認識の精度が心配だったのだけど、朝ごはんの内容ぐらいであれば音声が誤認識されることはなく特に問題なく運用できている。より難しいテキストを入力する場合はOpenAIなどのAPIとScriptableを使えば良いと思われる。\n初めてiOSショートカットで複雑なフローを組んでみたけど、これ単体でかなり高度なことができそうなので他にも音声入力系で自動化を頑張ってみたい\n","link":"https://blog-lampetty-net.web.app/posts/add-text-to-apple-notes-with-voice-input/","section":"posts","tags":["Automation"],"title":"iOSのショートカットで朝ごはんの内容を音声でメモアプリに記録する"},{"body":"","link":"https://blog-lampetty-net.web.app/","section":"","tags":null,"title":"oinume journal"},{"body":"","link":"https://blog-lampetty-net.web.app/posts/","section":"posts","tags":null,"title":"Posts"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/","section":"tags","tags":null,"title":"Tags"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/bash/","section":"categories","tags":null,"title":"Bash"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/bash/","section":"tags","tags":null,"title":"Bash"},{"body":"最近Bashを起動する速度がどんどん遅くなっているなと感じたので、Claude Codeに高速化を依頼した。\nパフォーマンスの可視化 まず手始めに、Bash起動時に何に時間がかかっているのかをわかるようにしてもらった(PR)。\n以下のようにBASH_PROFILE_PROFILING=1 bash -lで起動することで、以下のようにどこに時間がかかっているかが計測可能になる。\nBASH_PROFILE_PROFILING=1 bash -l [profile] 1 ms (+ 1 ms) prompt/history [profile] 48 ms (+ 47 ms) brew --prefix [profile] 49 ms (+ 1 ms) .bash_local [profile] 118 ms (+ 69 ms) bash-completion [profile] 1361 ms (+1243 ms) bash-it [profile] 1401 ms (+ 40 ms) fzf [profile] 1402 ms (+ 1 ms) bash-powerline [profile] 1403 ms (+ 1 ms) tmuxinator [profile] 1404 ms (+ 1 ms) completion (git) [profile] 1410 ms (+ 6 ms) google-cloud-sdk [profile] 1505 ms (+ 95 ms) rbenv [profile] 1516 ms (+ 11 ms) JDK (java_home) [profile] 1917 ms (+ 401 ms) nvm [profile] 1947 ms (+ 30 ms) mise [profile] 1970 ms (+ 23 ms) wtp [profile] 1980 ms (+ 10 ms) direnv [profile] 1981 ms (+ 1 ms) nvm bash_completion [profile] 1982 ms (+ 1 ms) ===== TOTAL ===== 高速化 とりあえず bash-it が遅すぎるのでこれを読み込まないようにした。これだけど 1243ms 速くなり、体感的にもかなり快適になった。\n次に遅いのがnvm関連。ちょうどmiseに移行しようと思っていたので、移行を済ませてnvmを読み込まないようにした。これで400ms速くなった。\n同様にrbenvもmiseに移行して消せるので削除。\nまとめ そんなこんなで色々削って起動時間が 1982ms -\u0026gt; 273ms になり爆速になりましたとさ\n","link":"https://blog-lampetty-net.web.app/posts/optimizing-bash-startup/","section":"posts","tags":["Bash"],"title":"Bashの起動を高速化した"},{"body":"スマホのSIMをMVNOのmineoに切り替えて1年以上が経って、かなり満足しているのでここにその良さを書いておく。mineoの前は、新規契約はストップしているOCNモバイルONEを使っていた。\nmineoに切り替えた理由 新規契約をストップしていることから、OCNモバイルONEには将来性がなさそう mineoは以前も契約していたことがあり、速度制限がある状態でも1.5Mbps(当時は1Mbpsだったかも?)の速度が出ることは知っていた 価格的には日本通信も候補に上がったけど、DoCoMoではなくauの回線を使いたかったのでmineoに決めた 自分のユースケース 週3,4は通勤しているので主にその隙間時間で以下をやっている。mineoに切り替えてからは月に30GBぐらいのギガを使っている。\nストリーミングで音楽を聴く YouTubeを見る 移動中にテザリングでPC作業をする Podcastを聴く SNSを見る Kindleなどで本を読む mineoにしてどうだったか OCNモバイルONEは10GB / 月の容量しかなかったので通勤中にYouTubeを観ることは不可能だったけど、mineoにしてからは移動中に動画を見れるようになったので生活が大きく変わった。Netflixも見たいものがあれば事前にダウンロードする必要があったけど、これもストリーミングで再生できるようになったので便利になった。\nまた、速度制限がある状態でもテザリングでなんとか作業できるため、移動中にやれることの幅が広がったように思う。\nさらに、2026年3月から速度制限状態でも最大で1.5 -\u0026gt; 3Mbps出るようになり1、より快適になった。自分は 15GB / 月のプランを契約しているけど、速度制限がある状態でもほとんど用が済んでしまうため、ギガが毎月半分以上使い切れていないという状態になっている。\nというわけで よほど改悪されない限りは、ずっとmineoでいこうと思うほどに快適です。\nちょうどいい使い放題オプション「パケット放題 3Mbps」の正式リリースについて｜mineoユーザーサポート↩ ","link":"https://blog-lampetty-net.web.app/posts/mineo-1-year/","section":"posts","tags":["日記"],"title":"mineoに乗り換えて1年経った"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/%E6%97%A5%E8%A8%98/","section":"categories","tags":null,"title":"日記"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/%E6%97%A5%E8%A8%98/","section":"tags","tags":null,"title":"日記"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/claude/","section":"categories","tags":null,"title":"Claude"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/claude/","section":"tags","tags":null,"title":"Claude"},{"body":"背景 会社のPCと個人PCでClaude Codeを使っているのだけど、\n会社PCではAPI Keyによる従量課金方式 個人PCはサブスクのProプラン となっている。permissionsの設定などで秘伝のタレ化している ~/.claude/settings.json は共通化して管理したいが、会社PCの ~/.claude/settings.json にはAPIキーやその他会社環境固有の環境変数を定義する必要があるため、会社PCと個人PCで発生する差分をどうにかしたい。\nまとめ macOSの場合は、PC固有の設定を /Library/Application\\ Support/ClaudeCode/managed-settings.json に保存する 共通の設定は dotfiles リポジトリ内で settings.json を管理 このやり方でうまいこと差分を吸収できたよ、というただそれだけの記事。\n参考リンク: Claude Code settings - Claude Code Docs\n","link":"https://blog-lampetty-net.web.app/posts/managing-claude-code-settings/","section":"posts","tags":["Claude"],"title":"Claude Codeの設定の差分を吸収するsettings.jsonの管理方法"},{"body":"「こんなアプリがほしい」と思ってExpoで作ってみたものを実機にインストールして使ってみたかった。調べたらApple Developer Programのお布施を払わなくてもインストールする方法があったのでメモ。\n必要なもの Xcode https://developer.apple.com/xcode/resources/ からダウンロードしておく cocoapods (Homebrewとかでインストールしておく) iPhoneをmacに接続しておく 手順 expoはexpo prebuildコマンドでネイティブのコードを生成できるので、これを使ってXcodeでアプリを実機にインストールする。\nnpx expo prebuild 次にこの投稿に書いてある設定をする\nなお、上の投稿では6.で以下のように書かれているが、\nBuild bundle with npx expo export:embed --entry-file=\u0026#39;node_modules/expo/AppEntry.js\u0026#39; --bundle-output=\u0026#39;./ios/main.jsbundle\u0026#39; --dev=false --platform=\u0026#39;ios\u0026#39; 自分の場合は以下のように--entry-fileを修正する必要があった。\nnpx expo export:embed --entry-file=\u0026#39;node_modules/expo-router/entry.js\u0026#39; --bundle-output=\u0026#39;./ios/main.jsbundle\u0026#39; --dev=false --platform=\u0026#39;ios\u0026#39; あと依存ライブラリがインストールされずにビルドに失敗していたので、以下を実行する必要があるかもしれない\ncd ios pod install ","link":"https://blog-lampetty-net.web.app/posts/deploy-ios-app-without-adp/","section":"posts","tags":["ReactNative"],"title":"Apple Developer Programに加入せずにReact Native(expo)でiOSアプリを実機にインストール"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/reactnative/","section":"categories","tags":null,"title":"ReactNative"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/reactnative/","section":"tags","tags":null,"title":"ReactNative"},{"body":"マシン＆OS メインPCはmacOS VPSではUbuntu アプリ Browser: ChromeたまにSafari IDE: IntelliJ IDEA Editor: VScode。コードを書くときはIntelliJで、ちょっとしたテキストの編集をする際はVScode Terminal: iTerm + tmux + fzf tmuxがちゃんと動くならGhosttyに乗り換えたいかも fzf, tmuxは10年以上使ってる気がする Shell: Bash 昔はZsh使っていたがカスタマイズが面倒になってBashにした Coding Agent: Claude Code, たまにCodex。去年はCursorを使っていたが最近は使ってない Launcher: Raycast タスク管理: Reminder パスワード管理: 1Password その他: Homerow, Giphy メモアプリ 去年はObsidianを使ってみたが、あまり馴染まずで結局macOSのメモアプリ＋Notionに戻った。Notionはスマホからの編集が絶望的にやりにくいので、一時的にメモアプリに書いて、長期で保存する必要があるメモをNotionに入れるスタイル。Notionのデータベースは情報を整理するのには向いているので、長期記憶のデータベースとして活用している\nHot Key Raycastを使って以下のHot keyを割り当てている。どこかに書いておかないと忘れて使わなくなるものがあるのでメモ\nCtrl + Cmd + c: クリップボード履歴 Ctrl + Cmd + s: 開いているウィンドウ一覧 Ctrl + 5: Homerow起動 Ctrl + Cmd + 1: (Chrome上のみ)1Password起動 ","link":"https://blog-lampetty-net.web.app/posts/work-environment-202601/","section":"posts","tags":["日記"],"title":"2026年1月時点での作業環境"},{"body":"時間が無さすぎて完全に振り返りを忘れていた😇\n2025年は仕事以外にいくつか新しいことを始められた良い年であった。\n音楽 2025年に行ったライブは2025年振り返り(ライブ編) - oinume journalにまとめた。2024年よりもライブに行った回数が増えたのは良いこと。\n新しいバンドを好きになるということは特になかったけど、2025年後半からSaosinの曲を再び聴くことが多くなった。このバンドはボーカルが変わったり脱退したりでなかなか安定しなかったバンドではあるけど、2016年から初代ボーカルのアンソニーが復帰して活動を再開していたらしく、さらに2024年には2代目のコーブ・リバーにバトンタッチしていてツアーも積極的にやるようになったらしい。ただ、なぜか日本には来ることができないようで、今年か来年に海外で観てみたいなぁと思っている。\n放送大学 昨今の地球温暖化についてもう少し深く学びたい気持ちと学割で色々と安く買えることを目的に入学。単位をたくさん取って卒業する気はないので、半期に気になる科目を履修して緩く学習するという感じにしている。というか、履修しなくてもWebで全ての授業動画が見れるので、「Audibleより質の高い学習サブスク」という位置付けで続けている。そんなわけで2024年に始めたAudibleは解約してしまった。\nYouTube 前年にスマホのキャリアをOCN MobileからMineoに変更して、速度制限がかかっている状態でも1.5Mbps出るようになり、常時YouTubeを見れるようになった。これが功を奏して、色々なバンドのライブ動画をいつでもどこでも見れるようになったし、また教育系のコンテンツもよく見るようになった。油断してると時間泥棒になってしまう側面はあるけど、今のところ自分にとってはプラスになっている気がする。主に以下のコンテンツをよく見てる。\n音楽：ライブ動画だったり「〜を弾いてみた」系のコンテンツ 医療：https://www.youtube.com/watch?v=6Sqfr2us9tsのような専門医が語る系 政治：特定の政党の代表が話している公式の動画など 政治切り抜き系の動画は恣意的な内容かつ2次情報なのでみない あとは放送大学の学割でYouTube Premiumが安く加入できるので(1280円 -\u0026gt; 780円)、広告なしで快適に視聴できている。\nベース ずっとベースをやりたいと思っていて、年末の休みの間に勢いで買ってしまった。手が小さいのでバッカスのWJB-Miniというモデルにした。メルカリShopsで欲しい色が6000円引きで売っていたので即決。ベース本体だけではなくて色々機材も購入したので別の記事で詳細を書きたいけど、YouTubeの音源に合わせてベースをあわせて弾くことが簡単にできて楽しい。テープやCDに合わせて練習していた頃に比べると本当にいい時代になった。\nバッカス BACCHUS WJB-Mini DLPB ミニエレキベース バッカス BACCHUS WJB-Mini DLPB ミニエレキベース\nBacchus バッカス Amazon\n仕事 担当していたサービスがクローズになってしまい、かなりやる気をなくしている。色々と思うところはあるけどネガティブな内容になるため自重\n2026年に向けて 今年はサマソニが25周年なので今年こそ行きたい 引き続き健康には気をつける 趣味プロダクトをVibe Codingで頑張る このブログをはてなブログから移行する ","link":"https://blog-lampetty-net.web.app/posts/2025-and-2026/","section":"posts","tags":["日記"],"title":"2025年の振り返りと2026年"},{"body":"今年は合計12本のライブに行った。去年は9本だったので少し増えている...!\n2/18 ROTTENGRAFFTY x Dragon Ash - Blown in the Reborn Tour 2025 2/23 MIXTURE INSTITUTE PABLO with friends 4/16 STATE CHAMPS x The BONEZ 4/17 The Ravens GHOST NOTES TOUR 6/6 Nothing’s Carved in stone x Dragon Ash - Hand In Hand Tour 2025 at Gorilla Hall Osaka 9/22 I-SCREAM NIGHT FINAL 9/25 Muse Japan Tour at K-Arena 10/13 LOUD PARK 2025 11/6 The BONEZ - I'm Not Your King Tour at KT Zepp Yokohama 11/19 The Theory of SCIENCE at Zepp Shinjuku 11/25 The Ravens x Dragon Ash at Nagoya Bottom Line 12/11 The Ravens x 10-FEET LIVE TOUR 共鳴夜光 at Shibuya O-West 一番印象に残ったのはやっぱり11/25のRavensとDragon Ashの対バン。SHANKが体調不良により偶発的に発生したこの対バン、3日前ぐらいに発表されて当日チケットが取れたので🚅に飛び乗って日帰りでいざ名古屋へ！\nまさかこんな対バンを見れる日が来るとは…！ pic.twitter.com/GOD57ns574\n— oinume (@oinume) 2025年11月25日\nDragon Ashのセトリも普段と違う仕様でAmploudやDrugs can't ~ をやったり大盤振る舞いで本当に行ってよかった。ダイブするKjをTSUYOSHIが助けに行くシーンもあってほっこりした。Ravens、実は今年の4月まではそんなに好きじゃなかったんだけど、今年は合計4回ライブを見に行って、見るたびにオーディエンスとの一体感が増していてライブバンドとしての力強さを感じた1年でした。\nあとは8年ぶりのMuse！はスタンディングではなく席ありのホールだったけど、ショーとしての完成度が高くてやっぱMuseだなぁと。Stockholm Syndromeをやってくれなかったのは「なぜ？？？」と思ったけど、次回来日に期待かなぁ\n来年はサマソニ25周年ということで3日間やるらしいのでぜひ行きたいな。\n","link":"https://blog-lampetty-net.web.app/posts/lives-in-2025/","section":"posts","tags":["日記"],"title":"2025年振り返り(ライブ編)"},{"body":"Claude Code GitHub Actionsを使っていて、自分は以下のような2種類のタスクを依頼することが多い。\n実装計画を立ててもらう 実装をしてもらう Claude Codeであれば実装計画はOpusを使って、実装タスクはSonnetを使うみたいな使い分けが簡単にできるのにClaude Code GitHub Actionsではデフォルトだとそれができなかったのでちょっとやってみた。\n具体的には、以下のようなclaude.ymlのWorkflowファイルを追加して、GitHub Issueなどのコメントで @claude このタスクの実装計画を Opus で立てて とコメント内にopus, sonnet, haiku のキーワードを含めることで指定したモデルでClaudeが動くようになる。\nやっていることは単純で、メッセージ内にopusなどのキーワードをgrepで引っ掛けてmodelを決めているだけ。注意点としてはgrep '\\bopus\\b'で検索しているため、「このタスクをopusでお願い」ではマッチしないようになっている。かわりに「このタスクを opus でお願い」のようにopusの前後にスペースを入れる必要がある。\nそんなわけでClaude Code GitHub Actionsからもモデルが指定できるようになりタスクが捗るようになった(気がする)\nclaude.yml\nname: claude-code on: issue_comment: types: [created] pull_request_review_comment: types: [created] issues: types: [opened, assigned] pull_request_review: types: [submitted] jobs: claude: if: | (github.event_name == \u0026#39;issue_comment\u0026#39; \u0026amp;\u0026amp; contains(github.event.comment.body, \u0026#39;@claude\u0026#39;)) || (github.event_name == \u0026#39;pull_request_review_comment\u0026#39; \u0026amp;\u0026amp; contains(github.event.comment.body, \u0026#39;@claude\u0026#39;)) || (github.event_name == \u0026#39;pull_request_review\u0026#39; \u0026amp;\u0026amp; contains(github.event.review.body, \u0026#39;@claude\u0026#39;)) || (github.event_name == \u0026#39;issues\u0026#39; \u0026amp;\u0026amp; (contains(github.event.issue.body, \u0026#39;@claude\u0026#39;) || contains(github.event.issue.title, \u0026#39;@claude\u0026#39;))) runs-on: ubuntu-latest permissions: contents: read pull-requests: read issues: read id-token: write actions: read # Required for Claude to read CI results on PRs steps: - uses: actions/checkout@v5 with: fetch-depth: 1 # Extract model from comment/issue body - name: Determine Claude Model id: determine-claude-model run: | # Get the comment/issue body based on event type if [ \u0026#34;${{ github.event_name }}\u0026#34; = \u0026#34;issue_comment\u0026#34; ]; then BODY=$(cat \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; ${{ github.event.comment.body }} EOF ) elif [ \u0026#34;${{ github.event_name }}\u0026#34; = \u0026#34;pull_request_review_comment\u0026#34; ]; then BODY=$(cat \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; ${{ github.event.comment.body }} EOF ) elif [ \u0026#34;${{ github.event_name }}\u0026#34; = \u0026#34;pull_request_review\u0026#34; ]; then BODY=$(cat \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; ${{ github.event.review.body }} EOF ) elif [ \u0026#34;${{ github.event_name }}\u0026#34; = \u0026#34;issues\u0026#34; ]; then BODY=$(cat \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; ${{ github.event.issue.body }} EOF ) fi # Convert to lowercase for case-insensitive matching BODY_LOWER=$(echo \u0026#34;$BODY\u0026#34; | tr \u0026#39;[:upper:]\u0026#39; \u0026#39;[:lower:]\u0026#39;) # Determine model based on keywords if echo \u0026#34;$BODY_LOWER\u0026#34; | grep -q \u0026#39;\\bopus\\b\u0026#39;; then MODEL=\u0026#34;claude-opus-4-1\u0026#34; elif echo \u0026#34;$BODY_LOWER\u0026#34; | grep -q \u0026#39;\\bhaiku\\b\u0026#39;; then MODEL=\u0026#34;claude-haiku-4-5\u0026#34; else # Default to sonnet (including when \u0026#39;sonnet\u0026#39; keyword is present) MODEL=\u0026#34;claude-sonnet-4-5\u0026#34; fi echo \u0026#34;model=$MODEL\u0026#34; \u0026gt;\u0026gt; $GITHUB_OUTPUT echo \u0026#34;Selected model: $MODEL\u0026#34; - name: Run Claude Code id: run-claude-code uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} # This is an optional setting that allows Claude to read CI results on PRs additional_permissions: | actions: read allowed_bots: \u0026#34;claude-bot,claude\u0026#34; claude_args: | --model ${{ steps.determine-claude-model.outputs.model }} --allowedTools \u0026#34;Agent\u0026#34; (必要に応じてMCPなどを設定) ","link":"https://blog-lampetty-net.web.app/posts/claude-code-github-actions-model/","section":"posts","tags":["GitHub Actions","Claude"],"title":"Claude Code GitHub Actionsでモデルを指定する"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/github-actions/","section":"categories","tags":null,"title":"GitHub Actions"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/github-actions/","section":"tags","tags":null,"title":"GitHub Actions"},{"body":"放送大学に入学して約4ヶ月が経ったので、入学後に知った制度を書いておく(学割についてはたくさん情報があるけど、制度についての情報が少ないので)\nちなみに自分はきちんと単位を取って卒業する気はあまりなく、以下の2つの理由で入学した意識の低い学生です。\n気象学など気になる授業の動画を見たかった 学割で色々安くなる 0. 全ての授業の動画が見れる 元々知ってはいたのだけど、大学院含めて全ての授業の動画が見れるのがすごい。YouTubeに上がっている動画を見る方がわかりやすいものもあるけど、これだけ多様な分野の動画が全て見れるというのはすごいと思う。\n1. 大学のメールがGmail (制度ではないけど完全に意外だったので書いておく)放送大学に入学すると \u0026lt;学生番号\u0026gt;@campus.ouj.ac.jp というメールアドレスが発行されるのだけど、これが実はGmail(Google Workspace)になっている。なので普段Gmail使っている自分にとってはとてもありがたかった。\n2. 単位を落としても次の半期に無料で再試験が受けられる 放送大学では試験期間が決まっておりその間にWebから試験を受けるのだが、自分は運悪く風邪を引いてしまって試験が受けられず不合格になってしまった。そんな怠惰な人間のために再試験という制度があり、次の半期に無料で再試験が受けられるという神な制度。ちなみに放送大学は科目を履修すると1万2000円費用がかかるが、再試験の場合は履修が不要なので費用がかからない\n再試験について\n本学の学生の多くが有職者であることから、仕事の都合により受験の機会を逸したり、やむを得ず受験準備に必要な時間が取れなかった学生の利便を図るため、新規に科目登録した学期において、単位を修得出来なかった場合は、次の学期に学籍がある場合に限り（休学中の場合を除く）、次学期に再試験を受験できます（再試験に係る授業料等はかかりません）。\n単位の認定基準（学部） | 放送大学 – BS放送・ネットで学ぶ通信制大学\n3. 再入学時に以前に履修した単位を引き継げる 放送大学は最大で10年間在籍でき、その間に卒業できなかったとしても再入学すれば以前履修した単位をそのまま引き継げるらしい。また、再入学するときの入学金が25%割引になる。つまり入学金＋履修選択した授業料を支払っていれば無限に在籍できるということ...! 自分のような1年に4単位ぐらいしか履修しないような堕落した生徒にとってこれはありがたい制度である。\n放送大学は、卒業後や選科履修生、科目履修生で在学期間満了後でも再度入学ができます。修得済単位は全科履修生に入学時に卒業要件として認定されますので、卒業後に他コースに再入学をし、再度卒業を目指すこともできます。（全コースを卒業すること等により「名誉学生」の称号が付与されることもあります。）また選科履修生、科目履修生として再びご入学することもできます。\n過去3年以内に教養学部に在籍していた方は入学料の25%割引が適用されます。 全科履修生･･･24,000円⇒18,000円 選科履修生･･･9,000円⇒6,750円 科目履修生･･･7,000円⇒5,250円\n継続入学・再入学について | 放送大学\n最後に 放送大学はいいぞ！\n","link":"https://blog-lampetty-net.web.app/posts/unknown-ouj-system/","section":"posts","tags":["日記"],"title":"放送大学入学後に知った制度"},{"body":"このポストがなぜかやたらバズっていたので、調子に乗って自分がよく使っているghコマンドのサブコマンドを書いてみる。\ngh pr checks --watch でCIの状況をコマンドで確認できるの便利\n— oinume (@oinume) August 16, 2025\ngh pr view -w Usage\ngh pr view [\u0026lt;number\u0026gt; | \u0026lt;url\u0026gt; | \u0026lt;branch\u0026gt;] [flags] 該当のpull requestをブラウザで開くために使っている。自分は何かとブラウザ上で作業することが多いのでかなり多用してる。\n-w を省略するとターミナル上でPRの内容が表示される。 引数の\u0026lt;number\u0026gt;などを省略するとカレントブランチのpull requestになる gh pr checks --watch Usage\ngh pr checks [\u0026lt;number\u0026gt; | \u0026lt;url\u0026gt; | \u0026lt;branch\u0026gt;] [flags] カレントブランチのpull requestのchecks(CI)の状況を確認するのに使ってる。\ngh pr checks --watch -i 3 のように-iでリフレッシュする間隔を秒数で指定できる。デフォルトは10秒 gh pr checks --json=name,state のように指定すると以下のようにJSON形式で出力できる [ { \u0026#34;name\u0026#34;: \u0026#34;triage\u0026#34;, \u0026#34;state\u0026#34;: \u0026#34;SUCCESS\u0026#34; }, { \u0026#34;name\u0026#34;: \u0026#34;lint\u0026#34;, \u0026#34;state\u0026#34;: \u0026#34;SUCCESS\u0026#34; }, { \u0026#34;name\u0026#34;: \u0026#34;test\u0026#34;, \u0026#34;state\u0026#34;: \u0026#34;SUCCESS\u0026#34; } ] gh pr checkout Usage\ngh pr checkout [\u0026lt;number\u0026gt; | \u0026lt;url\u0026gt; | \u0026lt;branch\u0026gt;] [flags] 主に他の人のpull requestのコードを自分のPC上でcheckoutしたい時に使う。\ngh pr create Usage\ngh pr create [flags] カレントブランチにコミットがある場合、gh pr create -w を実行するとコミットをpushしてpull request をopenする画面をブラウザで開いてくれる。(コメントで教えてもらってから重宝してます)\nfzf との組み合わせ fzfと組み合わせて以下のようなfunctionを定義している。\n# fghpr - list pull requests with search query, then open selected pull-request with browser # Use like `fghpr -A \u0026#39;@me\u0026#39; -s closed` fghpr() { gh pr list \u0026#34;$@\u0026#34; --json number,title -q \u0026#39;.[] | \u0026#34;\\(.number) \\(.title)\u0026#34;\u0026#39; \\ | fzf --delimiter=\u0026#39; \u0026#39; --with-nth=2.. \\ | awk \u0026#39;{print $1}\u0026#39; \\ | xargs -I {} gh pr view -w {} } 例えば fghpr -A '@me' -s closed で自分が過去にマージ or クローズしたPRをターミナル上に一覧表示して、Fuzzy検索しつつ選択したものをブラウザで開くことができる。\nClaude Code あとはClaude Codeと共に使うと色々便利らしいです。\nこうんな感じで便利で使えるよって教えてくれる人がたくさんいて良いインターネッツだ。ありがとうございます。 https://t.co/WSNd4Pe5UI\n— V (@voluntas) August 14, 2025\n","link":"https://blog-lampetty-net.web.app/posts/gh-command-use-cases/","section":"posts","tags":["GitHub"],"title":"ghコマンドでよく使ってるヤツ"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/github/","section":"categories","tags":null,"title":"GitHub"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/github/","section":"tags","tags":null,"title":"GitHub"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/development/","section":"categories","tags":null,"title":"Development"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/development/","section":"tags","tags":null,"title":"Development"},{"body":"表題の通り、技術スタックがほぼ同じプロダクト群のリポジトリを1つのMonorepoにまとめてみたという雑な記録。\n元々は以下のようなPolyrepo構造になっていた。\nproduct-a (repository) backend web product-b (repository) backend native web これを以下のような構成に移行した。\nproducts (repository) apps product-a backend web product-b backend native web 大まかには以下のような流れで移行する。\n移行元のリポジトリで移行用ブランチを作成する 移行先のリポジトリで移行用ブランチを作成し、1.の移行用ブランチをmergeする では実際に移行してみよう。product-aのリポジトリで以下のコマンドを実行する。\nmkdir -p apps/product-a git checkout -b monorepo git mv -k * apps/product-a/ # -k is used to ignore the error that it can\u0026#39;t move the projects directory git mv -k .* apps/product-a/ # .* to move .gitignore and other dot files 次に移行先のproductsリポジトリで以下のコマンドを実行する。\ngit remote add -f product-a https://github.com/\u0026lt;owner\u0026gt;/product-a.git git checkout -b import-product-a git merge product-a/monorepo --allow-unrelated-histories これで products リポジトリの import-product-aというブランチにproduct-aリポジトリのファイルが追加されているので、pull-requestを作るなどしてこのブランチをmainブランチにマージすればOK\n# on main branch git merge import-product-a これを移行したいプロダクトの数だけ繰り返せばOKである。なお、.github/workflows などリポジトリ直下にないといけないディレクトリはMonorepoに取り込んだ後に手動でファイルを移動する必要があるので気をつけること。\nというわけで私はこれで素敵なMonorepo lifeを送れるようになりました。おしまい。\n改訂2版 わかばちゃんと学ぶ Git使い方入門 改訂2版 わかばちゃんと学ぶ Git使い方入門\n作者:湊川あい,DQNEO シーアンドアール研究所 Amazon\n","link":"https://blog-lampetty-net.web.app/posts/migrate-polyrepo-to-monorepo/","section":"posts","tags":["Development"],"title":"複数のプロダクトのリポジトリをMonorepoに移行する"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/raycast/","section":"categories","tags":null,"title":"Raycast"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/raycast/","section":"tags","tags":null,"title":"Raycast"},{"body":"RaycastにはScript Commandsという機能があり、ずっとずっと気になっていたのでGW中に重い腰を上げて試してみた。最近会社の人にRaycastをオススメすることが多くなってきたのだけれども、「Raycast歴1年以上経つのにScript Commandsも使ったことないの？」みたいに後ろ指差されないようにするためにも...\nScript Commandsとは？ 簡単にいうとCUIのコマンドをRaycastから呼び出せるというただそれだけのものっぽい。「っぽい」というのは単純に自分がちゃんと調べてないだけです。はいテキトーですいません。\nなにを作るか？ Hello Worldを出力するだけのScript Commandsを作っても仕方がないので、よく自分でやっている単純作業を自動化するスクリプトを考えてみた。結果として生まれたのは、以下のような beforeの文字列をafterに整形するだけのスクリプトである。なんでこんなものが必要かというと、スプレッドシートからIDなどのリストをコピーしてSQLのWHERE句のINに指定する、ということをよくやっているから。\nbefore\naaa bbb ccc after\n\u0026#39;aaa\u0026#39;, \u0026#39;bbb\u0026#39;, \u0026#39;ccc\u0026#39;, Script Commandsの登録方法 めちゃくちゃ簡単なのでこのページを見てもらうのが良いと思う。テキストで手順を書くと以下の4ステップしかない。\nRaycastを起動する Create Script Commandと入力する 必要な情報を入力する スクリプトにコマンドを記述する ちなみに上で書いたScript Commandのスクリプトは以下のような感じである。\n#!/bin/bash # Required parameters: # @raycast.schemaVersion 1 # @raycast.title single-quote-with-trailing-comma # @raycast.mode fullOutput # Optional parameters: # @raycast.icon 🤖 # @raycast.needsConfirmation true # Documentation: # @raycast.description single-quote-with-trailing-comma # @raycast.author oinume # @raycast.authorURL https://github.com/oinume pbpaste | perl -pe \u0026#34;s/.*/\u0026#39;\\$\u0026amp;\u0026#39;,/\u0026#34; 作成したScript Commandを呼び出す あとはRaycastから作成したsingle-quote-with-trailing-commaを呼び出すだけである。以下の動画ではsingle-quote-with-trailing-commaによって生成された出力をクリップボードにコピーしている。\n最後に一言 というわけで駆け足でScript Commandsについて説明した。Apple Scriptを使って特定のSlack Channelを開くということもできるらしいので夢は広がりそうである。Raycast、本当によくできていてこれがあるおかげでmacOSから離れられない。次はExtensionの作成にチャレンジしてみたい。\n","link":"https://blog-lampetty-net.web.app/posts/raycast-script-commands/","section":"posts","tags":["Raycast"],"title":"RaycastのScript Commandsを試してみた"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/graphql/","section":"categories","tags":null,"title":"GraphQL"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/graphql/","section":"tags","tags":null,"title":"GraphQL"},{"body":"Vite + Apollo Client + GraphQL Codegenの組み合わせでgraphql-codegenを実行すると、gql関数を以下のようにimportするためにエラーが出る。\nimport { gql } from \u0026#39;@apollo/client\u0026#39;; [vite] Named export \u0026#39;gql\u0026#39; not found. The requested module \u0026#39;@apollo/client\u0026#39; is a CommonJS module, which may not support all module.exports as named exports. CommonJS modules can always be imported via the default export, for example using: import pkg from \u0026#39;@apollo/client\u0026#39;; const {gql} = pkg; 解決方法としては graphql-codegenの設定ファイルにgqlImportの設定を追加して再度コード生成する。\nconst config: CodegenConfig = { ... generates: { ... \u0026#34;.\u0026#34;: { config: { gqlImport: \u0026#34;@apollo/client/core#gql\u0026#34;, }, }, }, そうすると import { gql } from '@apollo/client/core'; が生成されるのでビルドエラーが回避できた 🎉\n","link":"https://blog-lampetty-net.web.app/posts/avoid-gql-not-found/","section":"posts","tags":["GraphQL"],"title":"GraphQL Codegenで自動生成されたファイルでNamed export 'gql' not foundのビルドエラーを回避する"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/hasura/","section":"categories","tags":null,"title":"Hasura"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/hasura/","section":"tags","tags":null,"title":"Hasura"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/postgresql/","section":"categories","tags":null,"title":"PostgreSQL"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/postgresql/","section":"tags","tags":null,"title":"PostgreSQL"},{"body":"2024年にRFC 9562としてUUID v7が標準化された。今までは主キーにUUID v4を使っていたけど、時間軸でソートできるUUID v7を使いたいと思ったのでメモ。\n簡単に書くとPostgreSQLでUUID v7形式のUUIDを生成するには以下を行えば実現できる。\nPostgreSQLにはUUID型が標準装備されているのでこれを使用する postgres-uuid-generate-v7にあるUUID v7を生成するFUNCTIONを定義する カラムを \u0026quot;id\u0026quot; uuid NOT NULL DEFAULT uuid_generate_v7() のように定義する 上記を踏まえてHasura consoleでUUID v7のFUNCTIONを定義して使えるようにするには、\nconsoleからであればDATAタブのSQLを選択 エディター部分にpostgres-uuid-generate-v7リポジトリのuuid_generate_v7.sqlの中身をそのままコピペ This is a migration にチェックを入れてMigration nameに適当な名前をつける をやれば良い(以下スクショ参照)\n","link":"https://blog-lampetty-net.web.app/posts/define-uuid-v7-function-in-hasura/","section":"posts","tags":["Hasura","PostgreSQL"],"title":"PostgreSQL + HasuraでUUID v7を生成できるようにする"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/intellij-idea/","section":"categories","tags":null,"title":"IntelliJ IDEA"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/intellij-idea/","section":"tags","tags":null,"title":"IntelliJ IDEA"},{"body":"コードを書くためのエディタとして、IntelliJ IDEAとVSCode(Cursor)を併用して使っている。そのため、この2つのエディタのショートカットキーを同じように設定したい。IntelliJ IDEA Keybindingsを過去に使ったのだが、自分が想定してないキーも変更されてしまって使いづらいと感じたので、自分でキーバインドをカスタマイズすることにした。\nちなみにここで紹介する技はもちろんIntelliJ IDEAのみではなく、GoLand, PHPStorm, PyCharm, WebStormなどでもできる。\n1. IntelliJ IDEAでよく使っている機能とショートカットキーを調べる まず、IntelliJで自分がよく使っているキーを把握するために、Help -\u0026gt; My ProductivityでProductivity Guideを開く。そうすると以下のような画面が出るので、Usedの列でソートして使用頻度の高い機能名とショートカットキーを調べておく。\n2. VSCode側の機能名を調べる 次に、1.で調べた機能名に対するVSCodeの機能名をChatGPTなどの生成AIを使って調べる。プロンプトは以下のような感じ。\n以下のIntelliJ IDEAの機能名に対するVSCodeの機能名(英語)を教えてください。 * Search Everywhere * Go to declaration * Go to Implementation(s) (以下略) www.perplexity.ai\n3. VSCodeのKeybindingを変更する コマンドパレットからOpen Keyboard Shortcutsを開き、2.で調べた機能名に合致するCommandを調べて、IntelliJ IDEAと同じショートカットキーを登録する。生成されるkeybindings.jsonはこんな感じ。このファイルはmacOSだと ~/Library/Application Support/Code/User/keybindings.jsonに保存されているので、このファイルをGitHubなどでバージョン管理しておくと良い。\n// Place your key bindings in this file to override the defaults [ { \u0026#34;key\u0026#34;: \u0026#34;ctrl+d\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;-workbench.action.debug.run\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;debuggersAvailable \u0026amp;\u0026amp; !inDebugMode \u0026amp;\u0026amp; !terminalFocus\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;cmd+b\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;editor.action.revealDefinition\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasDefinitionProvider \u0026amp;\u0026amp; editorTextFocus\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;f12\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;-editor.action.revealDefinition\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasDefinitionProvider \u0026amp;\u0026amp; editorTextFocus\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;alt+cmd+b\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;editor.action.goToImplementation\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasImplementationProvider \u0026amp;\u0026amp; editorTextFocus\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;cmd+f12\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;-editor.action.goToImplementation\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasImplementationProvider \u0026amp;\u0026amp; editorTextFocus\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;cmd+r\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;editor.action.startFindReplaceAction\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorFocus || editorIsOpen\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;alt+cmd+f\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;-editor.action.startFindReplaceAction\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorFocus || editorIsOpen\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;shift+f6\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;editor.action.rename\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasRenameProvider \u0026amp;\u0026amp; editorTextFocus \u0026amp;\u0026amp; !editorReadonly\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;f2\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;-editor.action.rename\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasRenameProvider \u0026amp;\u0026amp; editorTextFocus \u0026amp;\u0026amp; !editorReadonly\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;f1\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;editor.action.showDefinitionPreviewHover\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;ctrl+alt+h\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;references-view.showCallHierarchy\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasCallHierarchyProvider\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;shift+alt+h\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;-references-view.showCallHierarchy\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasCallHierarchyProvider\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;alt+f7\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;references-view.findReferences\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasReferenceProvider\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;shift+alt+f12\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;-references-view.findReferences\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorHasReferenceProvider\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;f2\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;editor.action.marker.next\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorFocus\u0026#34; }, { \u0026#34;key\u0026#34;: \u0026#34;alt+f8\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;-editor.action.marker.next\u0026#34;, \u0026#34;when\u0026#34;: \u0026#34;editorFocus\u0026#34; } ] ここまで書いて、こんな回りくどいことをしなくとも、1.で調べた機能名とショートカットキーからVSCodeのkeybindings.json(キーバインドの設定ファイル)を生成AIに生成してもらえばいいことに気づいたw\n","link":"https://blog-lampetty-net.web.app/posts/keymap-of-intellij-and-vscode/","section":"posts","tags":["VSCode","IntelliJ IDEA"],"title":"IntelliJ IDEAでよく使うショートカットキーをVSCodeでも使えるようにする"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/vscode/","section":"categories","tags":null,"title":"VSCode"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/vscode/","section":"tags","tags":null,"title":"VSCode"},{"body":"最近Cursorを使い始めているのだけど、ガッツリコードを書きたい時はIntelliJに頼ることもまだ多い。なので、Cursorでユーザータスクを定義して、Cmd + Shift + p でコマンドパレットを開いて Tasks: Run Task でIntelliJでそのファイルを開けるようにした。\nTasks: Open User Tasks で以下のタスクの定義を記述する。(macOSの場合、このファイルは ~/Library/Application Support/Cursor/User/tasks.json に保存される)\n{ \u0026#34;version\u0026#34;: \u0026#34;2.0.0\u0026#34;, \u0026#34;tasks\u0026#34;: [ { \u0026#34;label\u0026#34;: \u0026#34;Open Current File with IntelliJ IDEA\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;command\u0026#34;: \u0026#34;idea\u0026#34;, \u0026#34;args\u0026#34;: [ \u0026#34;${file}\u0026#34; ], \u0026#34;group\u0026#34;: { \u0026#34;kind\u0026#34;: \u0026#34;build\u0026#34;, \u0026#34;isDefault\u0026#34;: true }, \u0026#34;problemMatcher\u0026#34;: [] } ] } 参考: https://code.visualstudio.com/docs/editor/tasks\nここからアフィリエイト広告\n改訂新版 Visual Studio Code実践ガイド —— 定番コードエディタを使い倒すテクニック 改訂新版 Visual Studio Code実践ガイド —— 定番コードエディタを使い倒すテクニック\n作者:森下 篤 技術評論社 Amazon\n","link":"https://blog-lampetty-net.web.app/posts/open-cursor-current-file-with-intellij/","section":"posts","tags":["VSCode"],"title":"Cursorで開いているファイルをIntelliJ IDEAで開く"},{"body":"年末年始はハワイに行っていたので全く正月感がない感じで過ごしてしまった。1年の振り返りをしたり新年の抱負を書いたりしてもどうせ達成できないし、徒然なるままに生きたい人間なのだけれども、暇なので雑に振り返りと今年への意気込みをアウトプットしておく。\nライブ 2024年は合計9本のライブに行った。ハイライトは5年ぶりにサマソニに行ってManeskinが好きになったこと。あとはThe Bonez x Dragon AshのStraigh Upが、久しぶりにライブで酸欠になるぐらい激しくて久しぶりにライブで死を感じた。ずっとミクスチャーをやっている2つのバンドが対バンするとこんなにエネルギーが湧き出てくるのかというぐらいの熱気だった。12/30の追加公演ではPABLOも参戦してPTPの曲もやったようで本当に本当に行きたかった...!\nStraight Up Tour Extra🔥\nat Zepp Haneda\nphoto by @YSZ_PHOTO #StraightUp#DragonAsh#TheBONEZ pic.twitter.com/LGO1sL1Z03\n— DA＿OFFICIAL (@Dragon_Ash) December 31, 2024\nあと12月にKORNのライブがオーストラリアであって行こうかどうかとても悩んだけど金銭的な理由で断念した。来年こそは日本に来てくれないかなと祈っている。\n(以下は今年に参戦したライブとフェスの一覧)\n1/21: マサラーフェース2024 3/17: PUNK SPRING 2024 3/31: Dragon Ash x SHANK 4/6: The Ravens 7/18: TMC at CLUB CITTA 8/7: SUMMER SONIC 11/10: The BONEZ x Dragon Ash Straight Up Tour 11/30: ビクターロック祭り2024 12/8: REDLINE ALL THE FINAL 仕事 特筆することはないけど、生成AIのおかげでコードを書くモチベーションが激減したので、自分で手を動かすような機会が減った。つまりMTGと目の前の課題をひたすらやっつけることをしている。「BackendなんてHasura使えばいいんでないの？」と思っている人間なので、Backendの開発に楽しみが見い出せなくなっている。\n事業ドメイン的には楽しい領域なので、ビジネス的に成長していればそれでよし。\nその他 今年からAudible始めたので読書が捗った Audibleと併せてウォーキングを始めたので体重が2.5kg減った 2025年に向けて 今年は趣味プロダクトで作りたいアプリがあるので、なんとしても今年中に完成してリリースしたい。ライブは10回は行きたいけど行けるかなぁ。2024年は勉強会にほとんど参加せず技術的なことに興味を失いつつあるので、今年はもう少し参加したい。サマソニは観たいバンドがなくても行くべきだと昨年痛感したので、今年も行きたい。\nそんな感じで今年もゆるふわに生きます。\n","link":"https://blog-lampetty-net.web.app/posts/2024-and-2025/","section":"posts","tags":["日記"],"title":"2024年の振り返りと2025年"},{"body":"あまりものを買わない主義なのだけど、ささやかながら買ってよかったものを。(Amazonのリンクはアフィリエイトが入ってる)\n[ニューバランス] インソール サポーティブリバウンドインソール 1年以上履いていたニューバランスのスニーカーのインソールがボロボロになったのでこれに入れ替えてみた。そしたらなんとびっくり、クッション効果が凄くて歩くのが大変快適になりQoLが爆上がりした。2000円弱の投資でここまで快適になるのならとてもコスパ良いと思う。なんだかんだでスニーカーは毎日履くものだし。とにかく快適すぎるので他のニューバランスのスニーカーも全部このインソールに替えた。デフォルトでこれを搭載してほしい\n[ニューバランス] インソール サポーティブリバウンドインソール (RCP280 / LAM35689) 中敷き インサート LAM35689 GR(新) medium [ニューバランス] インソール サポーティブリバウンドインソール (RCP280 / LAM35689) 中敷き インサート LAM35689 GR(新) medium\nnew balance(ニューバランス) Amazon\nAnker 511 Charger (Nano 3, 30W) (充電器 USB-C) 常にPCを持ち歩いているため充電器も持ち運ぶ必要があり購入。元々は65Wのもの(150g)を持ち歩いていたのだけど、こっちは40gと超軽量なので買い換えた。100g減るだけでも持ち運び時の腰への負担が減るのでQoLが上がった。\nAnker 511 Charger (Nano 3, 30W) (充電器 USB-C)【USB PD 対応/PSE技術基準適合/PPS規格対応】MacBook Windows PC iPad iPhone Galaxy Android スマートフォン ノートPC 各種 その他機器対応 (ホワイト) Anker 511 Charger (Nano 3, 30W) (充電器 USB-C)【USB PD 対応/PSE技術基準適合/PPS規格対応】MacBook Windows PC iPad iPhone Galaxy Android スマートフォン ノートPC 各種 その他機器対応 (ホワイト)\nAnker Amazon\nタニタ 体重計 体組成計 スマホ連動 50g単位 バックライト BC-332L WH ホワイト 元々はAnkerの体重計を使っていたのだけど、たまに1kg単位でズレることがあり信憑性に疑問を持ったので安心安定のタニタのものを購入。スマホと連動する機能はAnkerの方が便利だったけどまぁよし。\nタニタ 体重計 体組成計 スマホ連動 50g単位 バックライト BC-332L WH ホワイト 子供の成長を見守る タニタ 体重計 体組成計 スマホ連動 50g単位 バックライト BC-332L WH ホワイト 子供の成長を見守る\nタニタ(Tanita) Amazon\n[ヘリーハンセン] スカンザライトジャケット SCANDZA LIGHT JKT ユニセックス 風を通さないので、中にフリースを着れば東京の冬はこのアウターで乗り切れる。あまりにも気に入ったので同じものをもう一つ購入した。\n[ヘリーハンセン] ジャケット 撥水 防水 防風 防寒 透湿 保温 スカンザライトジャケット SCANDZA LIGHT JKT ユニセックス HOE12272 ブラックブラック S [ヘリーハンセン] ジャケット 撥水 防水 防風 防寒 透湿 保温 スカンザライトジャケット SCANDZA LIGHT JKT ユニセックス HOE12272 ブラックブラック S\nHELLY HANSEN(ヘリーハンセン) Amazon\nLogicool Signature M750LGR ワイヤレスマウス クロールがなめらかでホイール音も静か。2台のPCにBluetooth接続できるのが便利\nLogicool Signature M750LGR ワイヤレスマウス ラージ グラファイト Bluetooth Logi Bolt Unifying非対応 windows mac iPad Android Chrome OS スクロールホイール 無線マウス 静音マウス M750 国内正規品 Logicool Signature M750LGR ワイヤレスマウス ラージ グラファイト Bluetooth Logi Bolt Unifying非対応 windows mac iPad Android Chrome OS スクロールホイール 無線マウス 静音マウス M750 国内正規品\nLogicool(ロジクール) Amazon\n","link":"https://blog-lampetty-net.web.app/posts/good-items-in-2024/","section":"posts","tags":["日記"],"title":"2024年に買ってよかったもの"},{"body":"最近ドコモ回線があまりにも詰まったり繋がらなかったりすることが多くてどうにも我慢できなくなったことと、たまたまmineoがキャンペーンをやっていてコストダウンできそうなので勢いでmineoに乗り換えた。後悔は全くしていない。\n数ヶ月前まではドコモ回線がつながりにくいこと以外はOCNは特に不満もなく、Musicカウントフリーオプションの存在もあり3年ほど使っていた。ただ、最近は新規契約を停止していてirumoという改悪されたMVNOに軸足を移す流れがあるのと、その影響でOCNモバイルONE自体がもう改善されないリビングデッド状態になっていたので、緩く乗り換え先を探していた。\nmineoにしようと思ったのは\n1.5Mbpsなら使い放題のオプションがある ドコモ以外の回線も選べる という点で、実際乗り換えてみてよかったと思った。それ以外にも通話系のオプションが充実してたり、ギガを永遠に貯められるオプションなどユニークなオプションがあっていいなと思う。\n","link":"https://blog-lampetty-net.web.app/posts/ocn-to-mineo/","section":"posts","tags":["日記"],"title":"OCNモバイルONEからmineoにMNPした"},{"body":"AmazonでAudibleが3ヶ月無料キャンペーンをやっていたので試しに使ってみたところ、かなり自分のツボに刺さったので良いポイントをまとめてみた。\n自分的にAudibleが刺さったポイント 「本を読みたいけど時間がない...」というのが、Audibleに出会う前の自分だった。いや、正確には「読書したいけどスマホのKindleで読んでいると気付いたら他のことをしている」というのが実態だった。Audibleであれば、ウォーキング中や通勤時間などのスキマ時間に「耳」から本の内容をインプットできるので、「気付いたらスマホで違うことをしていた」ということが起きにくい。そのため、Audibleで本を聴くようになってから圧倒的に読書習慣が根付いた。\n豊富なコンテンツ 詳しくは Audibleのサイト を見てもらうとして、対象の書籍の幅の多さに驚く。たとえば小説であれば、「三体」「プロジェクトヘイルメアリー」などヒットしたものは大体あるイメージ。ビジネス書も「イシューからはじめよ」「コンサル一年目が学ぶこと」などそれなりのラインナップがある。\nもともと自分はウォーキング中にはPodcastを聴いていたのだけど、あまり興味のあるPodcastもなく惰性で聴いていた。Audibleであれば書籍が対象なので得られる情報の質がPodcastに比べて高いし、密度が濃いと感じる。\nなお、Audibleは本の内容を人間が読み上げているため、小説だと「その声じゃないんだよなぁ」と思うこともあるがこれはしょうがない。\nAudibleアプリのクオリティが高い Audibleアプリは、単純にただのAudiobookよりさらに良い体験を提供していると思っている。具体的には、再生速度が0.05刻みで細かく調節できるのと、クリップ＆メモ機能が便利だ。\nクリップ機能は、読まれている本の位置を保存する機能でいわゆるしおりみたいなもの。クリップしておいた場所に後からジャンプできるのと、そのクリップに対して自分用のメモを保存することができる。メモをする場合は自動で再生が止まるようになっているのも気が利いていて良い。\n月1500円で聴き放題 中には別途お金を払う必要がある本もあるが、大体のものは1500円で聴けるので、聴いてみて「これはイマイチだな」と思ったらやめればいいし、逆に気に入ったら書籍を購入するのも良い。本屋での立ち読み感覚で色々聴くことができるのがグッド。\n目にやさしい Audibleを再生している間はなるべくスマホは見ないで外界を見るようにしている。本を読んでいるとどうしても目が疲れてしまう問題があるけど、Audibleではスマホさえ見なければ目は疲れない。\nイマイチな点 再生速度を2倍にするなどして速度を上げることでカバーできるが、書籍を読む速読に比べると遅いという問題はある。あと上で書いたように小説はナレーターの声が自分のイメージと違うことが多いので、Audibleで聴くには向かないかもしれない。\nまとめ 「Amazonから金でももらっているのか？」というような記事になってしまったけど、Audibleは自分の読書週間を大幅に改善してくれたプロダクトなのでオススメ記事を勢いで書いた。以前Audibleを試して「コンテンツが少ない」と思って使わなくなった人ももう1回見てみるといいかも。\n","link":"https://blog-lampetty-net.web.app/posts/audible/","section":"posts","tags":["日記"],"title":"Audibleにハマったのでオススメする記事"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/go/","section":"categories","tags":null,"title":"Go"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/go/","section":"tags","tags":null,"title":"Go"},{"body":"大規模なコードベースでリファクタリングを省エネ化するためにcodemodを最近調べていて、軽く試行錯誤したのでそのメモ。\nやりたいこと 例えば以下のようなTable Driven TestなコードをBEFOREからAFTERに書き換えたい。コード量が多いため人間がやるのは現実的ではなく、codemodで機械的に書き換えたい。\nBEFORE\npackage main import ( \u0026#34;slices\u0026#34; \u0026#34;testing\u0026#34; ) func TestContains(t *testing.T) { type args struct { ss []string s string } tests := []struct { name string args args want bool }{ { name: \u0026#34;empty: false\u0026#34;, args: args{[]string{}, \u0026#34;\u0026#34;}, want: false, }, { name: \u0026#34;found: true\u0026#34;, args: args{[]string{\u0026#34;a\u0026#34;, \u0026#34;b\u0026#34;, \u0026#34;c\u0026#34;}, \u0026#34;b\u0026#34;}, want: true, }, { name: \u0026#34;not found: false\u0026#34;, args: args{[]string{\u0026#34;a\u0026#34;, \u0026#34;b\u0026#34;}, \u0026#34;c\u0026#34;}, want: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := contains(tt.args.ss, tt.args.s); got != tt.want { t.Errorf(\u0026#34;contains(): want=%v, got=%v\u0026#34;, got, tt.want) } }) } } func contains(ss []string, s string) bool { return slices.Contains(ss, s) } AFTER\nfunc TestContains(t *testing.T) { type args struct { ss []string s string } tests := map[string]struct { args args want bool }{ \u0026#34;empty: false\u0026#34;: { args: args{[]string{}, \u0026#34;\u0026#34;}, want: false, }, } ... } DIFF\n--- a/tools_eg/table_driven_test.go +++ b/tools_eg/table_driven_test.go @@ -10,29 +10,25 @@ func TestContains(t *testing.T) { ss []string s string } - tests := []struct { - name string + tests := map[string]struct { args args want bool }{ - { - name: \u0026#34;empty: false\u0026#34;, + \u0026#34;empty: false\u0026#34;: { args: args{[]string{}, \u0026#34;\u0026#34;}, want: false, }, - { - name: \u0026#34;found: true\u0026#34;, + \u0026#34;found: true\u0026#34;: { args: args{[]string{\u0026#34;a\u0026#34;, \u0026#34;b\u0026#34;, \u0026#34;c\u0026#34;}, \u0026#34;b\u0026#34;}, want: true, }, - { - name: \u0026#34;not found: false\u0026#34;, + \u0026#34;not found: false\u0026#34;: { args: args{[]string{\u0026#34;a\u0026#34;, \u0026#34;b\u0026#34;}, \u0026#34;c\u0026#34;}, want: false, }, } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { + for name, tt := range tests { + t.Run(name, func(t *testing.T) { if got := contains(tt.args.ss, tt.args.s); got != tt.want { t.Errorf(\u0026#34;contains(): want=%v, got=%v\u0026#34;, got, tt.want) } 試したこと eg egというのは golang.org/x/tools 配下で提供されているコード書き換えのコマンドのこと(link)。例えば以下のようにdeprecatedな ioutil.ReadAll を呼び出している箇所をtemplateのGoコードを用いて io.ReadAll に書き換えることができる。\nhttp_get.go\npackage main import ( \u0026#34;fmt\u0026#34; \u0026#34;io/ioutil\u0026#34; //nolint:staticcheck \u0026#34;net/http\u0026#34; ) func main() { resp, err := http.DefaultClient.Get(\u0026#34;https://github.com/golang/go\u0026#34;) if err != nil { panic(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Println(string(body)) } http_get.template\npackage main import ( \u0026#34;io\u0026#34; \u0026#34;io/ioutil\u0026#34; ) func before(r io.Reader) ([]byte, error) { return ioutil.ReadAll(r) } func after(r io.Reader) ([]byte, error) { return io.ReadAll(r) } egを使って書き換える\n$ eg -t http_get.template -w http_get.go ただ、egでは先ほどのようなTable Driven Testの struct -\u0026gt; map[string]struct にするのは eg: map[string]struct{} is not a safe replacement for struct{name string} のエラーでできなかった(ref)。\nなので、次に紹介するast-grepを試してみた。\nast-grep ast-grepは様々な言語に対応した、ASTベースでコードの検索、Linterの作成、コード書き換えを行えるコマンドラインツールである。YAMLファイルによる独自のルールを定義することによって、かなり複雑なパターンマッチングを行うことができる。\nASTツリーを表示しながらパターンにマッチした部分をハイライトするPlaygroundも用意されているので、AST初心者でも試行錯誤すればルールが定義できそうな雰囲気を感じる。自分はまだ使いこなせてないので、とりあえず紹介だけ。\nこれを使えばおそらく先ほどのTable Driven Testのコードは書き換えられそうな気がする。\nその他のツール TypeScriptだとts-morphというものがあり、これのGo版が欲しい...!!! Codemodというコード書き換えのためのSaaSがある。内部的にはast-grepなどを呼び出すっぽい 最後に とりあえずast-grepで試行錯誤して上手くいったらまた記事を書きます。\n","link":"https://blog-lampetty-net.web.app/posts/codemod-in-go/","section":"posts","tags":["Go"],"title":"Go言語でcodemod"},{"body":"Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.\nHeadings The following HTML \u0026lt;h1\u0026gt;—\u0026lt;h6\u0026gt; elements represent six levels of section headings. \u0026lt;h1\u0026gt; is the highest section level while \u0026lt;h6\u0026gt; is the lowest.\nH1 H2 H3 H4 H5 H6 Paragraph Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.\nItatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.\nImages Syntax ![Alt text](./full/or/relative/path/of/image) Output Blockquotes The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a footer or cite element, and optionally with in-line changes such as annotations and abbreviations.\nBlockquote without attribution Syntax \u0026gt; Tiam, ad mint andaepu dandae nostion secatur sequo quae. \u0026gt; **Note** that you can use _Markdown syntax_ within a blockquote. Output Tiam, ad mint andaepu dandae nostion secatur sequo quae.\nNote that you can use Markdown syntax within a blockquote.\nBlockquote with attribution Syntax \u0026gt; Don\u0026#39;t communicate by sharing memory, share memory by communicating.\u0026lt;br\u0026gt; \u0026gt; — \u0026lt;cite\u0026gt;Rob Pike[^1]\u0026lt;/cite\u0026gt; Output Don't communicate by sharing memory, share memory by communicating.\n— Rob Pike1\nTables Syntax | Italics | Bold | Code | | --------- | -------- | ------ | | _italics_ | **bold** | `code` | Output Italics Bold Code italics bold code Code Blocks Syntax we can use 3 backticks ``` in new line and write snippet and close with 3 backticks on new line and to highlight language specific syntax, write one word of language name after first 3 backticks, for eg. html, javascript, css, markdown, typescript, txt, bash\n```html \u0026lt;!doctype html\u0026gt; \u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;utf-8\u0026#34; /\u0026gt; \u0026lt;title\u0026gt;Example HTML5 Document\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;p\u0026gt;Test\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; ``` Output \u0026lt;!doctype html\u0026gt; \u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;utf-8\u0026#34; /\u0026gt; \u0026lt;title\u0026gt;Example HTML5 Document\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;p\u0026gt;Test\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; List Types Ordered List Syntax 1. First item 2. Second item 3. Third item Output First item Second item Third item Unordered List Syntax - List item - Another item - And another item Output List item Another item And another item Nested list Syntax - Fruit - Apple - Orange - Banana - Dairy - Milk - Cheese Output Fruit Apple Orange Banana Dairy Milk Cheese Other Elements — abbr, sub, sup, kbd, mark Syntax \u0026lt;abbr title=\u0026#34;Graphics Interchange Format\u0026#34;\u0026gt;GIF\u0026lt;/abbr\u0026gt; is a bitmap image format. H\u0026lt;sub\u0026gt;2\u0026lt;/sub\u0026gt;O X\u0026lt;sup\u0026gt;n\u0026lt;/sup\u0026gt; + Y\u0026lt;sup\u0026gt;n\u0026lt;/sup\u0026gt; = Z\u0026lt;sup\u0026gt;n\u0026lt;/sup\u0026gt; Press \u0026lt;kbd\u0026gt;CTRL\u0026lt;/kbd\u0026gt; + \u0026lt;kbd\u0026gt;ALT\u0026lt;/kbd\u0026gt; + \u0026lt;kbd\u0026gt;Delete\u0026lt;/kbd\u0026gt; to end the session. Most \u0026lt;mark\u0026gt;salamanders\u0026lt;/mark\u0026gt; are nocturnal, and hunt for insects, worms, and other small creatures. Output GIF is a bitmap image format.\nH2O\nXn + Yn = Zn\nPress CTRL + ALT + Delete to end the session.\nMost salamanders are nocturnal, and hunt for insects, worms, and other small creatures.\nThe above quote is excerpted from Rob Pike's talk during Gopherfest, November 18, 2015.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","link":"https://blog-lampetty-net.web.app/posts/markdown-style-guide/","section":"posts","tags":null,"title":"Markdown Style Guide"},{"body":"Raycastを使い始めて1年経ったので、どういうことに使っているかを振り返ってみる。去年書いた AlfredからRaycastに移行した - oinume journal の記事から少し使い方が変わっているところもあるのでメモがてら。\n基本的な使い方 Ctrl + QをRaycast起動のショートカットとして割り当てている。Pro版は使っていないのでAI機能などは使ったことがない。 ブラウザのブックマーク検索など、よく使うけどHotKeyを割り当てるほどでもないRaycastコマンドはbmのようにAliasを設定している。 Ctrl + QでRaycastを起動してbmと入力するとブックマークの検索ができるので楽ちん アプリケーションランチャー機能 アプリケーションを起動するときのランチャーとして使っている。よく使うアプリにはHot Key(ショートカット)を割り当ててる。\nClipboard History クリップボードの履歴を溜めておいて、後から検索してペーストできる機能。Ctrl + Cmd + CをHotKeyとして割り当てて瞬時に起動できるようにしている。\n絵文字検索 正確にはSearch Emoji \u0026amp; Symbolsという機能。これが地味に便利な機能で、こんな感じで英語で絵文字を検索して選択するとクリップボードにコピーされるのですぐにペーストできる。\nスクリーンショットの検索＆クリップボードへのコピー＆SlackやGitHubへ貼り付け これも便利な機能で、以下のような流れで使うのだけど、スクショを貼り付けるのがキーボード操作だけでできるようになる。\nスクリーンショットを撮った後にRaycastを起動 screenshotで検索して機能を起動して、スクショをサムネイルで検索して選択 するとクリップボードにスクショがコピーされるので、SlackやGitHubなどにペーストするとスクショが貼り付けられる。 ブラウザのブックマーク検索 正式名称はSearch Browser Bookmarks。ブラウザのブックマークを検索することができる。SafariとChromeがある場合は、Cmd + KでSelect Browsersを選ぶと対象のブラウザを選択することができる(Safari, Chromeの両方を対象にすることも可能)。\n開いているウィンドウの検索・切り替え 正式名称はSwitch Windows。今開いているウィンドウをfuzzy検索できる。自分はIntelliJ IDEAを使っていてたくさんウィンドウを開いているので、これで検索してウィンドウを切り替えることが多い。Ctrl + Cmd + SをHotKeyとして割り当てている。\nChromeの履歴検索 「あの閉じてしまったタブをもう1回開きたいなぁ」という時に意外と重宝するのがChromeの履歴検索である。Chrome Extensionをインストールすると使えるようになる。\n使わなくなった機能 最初便利だなと思っていたけど使わなくなった機能もある。\nQuicklink: ブラウザのブックマークで十分だと感じた カレンダー連携(My Schedule): ChromeでGoogleカレンダーを固定タブで開いているのでRaycastから飛べなくてもいいかなと思った。あと、MacのカレンダーとGoogle Calendarを連携するのが嫌になったというのもある。 Raycastの使いこなせていない機能 Raycast便利に使っているけど、Script CommandsやExtensionを作れるほどのレベルにはなっていないので、今年はそれらに挑戦してみたい。\n","link":"https://blog-lampetty-net.web.app/posts/raycast-one-year-later/","section":"posts","tags":["Raycast"],"title":"Raycastを使い始めて1年経った"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/dokku/","section":"categories","tags":null,"title":"Dokku"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/dokku/","section":"tags","tags":null,"title":"Dokku"},{"body":"VPS上にDokkuを構築したので、そこにHasuraを動かしてみるテスト。Hasuraとは簡単に言うとPostgreSQLのテーブルスキーマからGraphQLサーバーを構築してくれるミドルウェア。\n前提として、Dokkuはすでに構築済みとする。(自分の場合はUbuntu 22.04 上にDokku 0.32.3を構築済み)\n手順 まずは最初にhasuraという名前のアプリケーションを作成する\n$ dokku apps:create hasura 次に、HasuraのためのPostgreSQL databaseを建てる。\n$ dokku postgres:create hasura-db Waiting for container to be ready Creating container database Securing connection to database =====\u0026gt; Postgres container created: hasura-db =====\u0026gt; hasura-db postgres service information Config dir: /var/lib/dokku/services/postgres/hasura-db/data Config options: Data dir: /var/lib/dokku/services/postgres/hasura-db/data Dsn: postgres://postgres:\u0026lt;redacted\u0026gt;@dokku-postgres-hasura-db:5432/hasura_db Exposed ports: - Id: 272a6f8b722310887317b3d7e10821ed3cfcc88dae7911945c10590be338c09c Internal ip: 172.17.0.4 Initial network: Links: - Post create network: Post start network: Service root: /var/lib/dokku/services/postgres/hasura-db Status: running Version: postgres:15.4 上で構築したhasura-dbをhasuraアプリケーションにリンクする。ただし、この時点ではまだhasuraはアプリケーションの設定がされていないのでApp image (dokku/hasura:latest) not foundのエラーが出るけどOK。\n$ dokku postgres:link hasura-db hasura -----\u0026gt; Setting config vars DATABASE_URL: postgres://postgres:\u0026lt;redacted\u0026gt;@dokku-postgres-hasura-db:5432/hasura_db -----\u0026gt; Restarting app hasura ! App image (dokku/hasura:latest) not found 次にhasura向けの環境変数を設定する。HASURA_GRAPHQL_DATABASE_URLで指定するDSNは上のコマンドで得られたDATABASE_URLをコピーしてくる。また、your_admin_secretはパスワードみたいなものなので、ランダム文字列にするのが良い。\n$ dokku config:set hasura \\ HASURA_GRAPHQL_DATABASE_URL=\u0026#34;postgres://postgres:\u0026lt;redacted\u0026gt;@dokku-postgres-hasura-db:5432/hasura_db\u0026#34; \\ HASURA_GRAPHQL_ADMIN_SECRET=\u0026#34;your_admin_secret\u0026#34; \\ HASURA_GRAPHQL_ENABLE_CONSOLE=\u0026#34;true\u0026#34; \\ HASURA_GRAPHQL_SERVER_PORT=5000 次にhasuraアプリケーションのためのdocker imageをpullしてくる。\n$ docker pull hasura/graphql-engine:v2.36.1 FAIL 上のコマンドを実行するユーザーがdockerグループに所属していないと権限がなくてpullできないので、自分の場合はdokkuユーザーになってpullした。\n$ sudo su - dokku $ docker pull hasura/graphql-engine:v2.36.1 そして最後に dokku git:from-imageコマンドでhasuraアプリケーションにpullしてきたimageを指定してアプリケーションとしてデプロイする。\n$ dokku git:from-image hasura hasura/graphql-engine:v2.36.1 これで http://hasura.\u0026lt;your_dokku_domain\u0026gt;/ のURLにアクセスするとHasura Consoleが表示されるはず。もしエラー画面が出ている場合は、/var/log/nginx/hasura-error.log を見てみると何かヒントがあるかもしれない。\nハマった点 Dokku上のコンテナのlisten portはデフォルトだと5000になるということを知らずに、環境変数HASURA_GRAPHQL_SERVER_PORTを指定していなかったため、Hasuraはデフォルトの8080でlistenしていてDokkuのNginxからDocker containerへのproxyがうまくできていなかった。\nそのため\nWe're sorry, but something went wrong. If you are the application owner check the logs for more information.\nのエラーがずっと出ていたけど(スクショ)、解決方法がなかなかググっても出てこずにハマった。\nDokkuのPort Managementのドキュメントに書いてはあるのだが、正直そんなの知らんわって思った。でもおかげでDokkuのport mappingの仕組みが理解できたので良かったけど。\n成功したら... 以下のような画面が出るので、HASURA_GRAPHQL_ADMIN_SECRETの環境変数で指定したシークレットを入力するとめでたくHasuraのConsoleが見れるようになる。\n※この記事を書き終わってHasura on Dokkuの構築自体に満足してしまい、肝心のアプリケーションの作成はまだできていない。\nDocker実践ガイド 第3版 impress top gearシリーズ Docker実践ガイド 第3版 impress top gearシリーズ\n作者:古賀政純 インプレス Amazon\n","link":"https://blog-lampetty-net.web.app/posts/hasura-on-dokku/","section":"posts","tags":["Hasura","Dokku"],"title":"HasuraをDokku上で動かす"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/git/","section":"categories","tags":null,"title":"Git"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/git/","section":"tags","tags":null,"title":"Git"},{"body":"最近以下のような記事を目にすることがあり、ちょうど自分もsquash mergeの環境でひとつ問題を抱えていたので、その話を自分のメモ代わりに書きたくなった。\nGit の Squash マージをやめた話 - Mobile Factory Tech Blog squash and mergeしか使ってないけど全く困ってない – Jun Mukai's blog 問題とは、上にある記事のcascading PRsの話で、feature1 -\u0026gt; feature2 というようにbranchを派生して作った場合に、feature1 をmainにマージした後に作業ブランチを feature2 にして git rebase main すると、必ずコンフリクトが発生するので悩んでいた、ということ。\n解決策としては、以下にあるようにgit rebase --onto main \u0026lt;last commit on feature1\u0026gt; \u0026lt;feature2 branch\u0026gt; をすればいい\nstackoverflow.com\nもしくはJun Mukai's blogに書いてあるような以下の方法でもいいのかもしれない。そういえば git rebase --skip って使ったことなかったな。\nPR1に由来するコンフリクトは自分にとっては自明だし、ほとんどの場合にはgit rebase –skipするだけだ。\n【改訂新版】Gitポケットリファレンス 【改訂新版】Gitポケットリファレンス\n作者:岡本 隆史,武田 健太郎,相良 幸範 技術評論社 Amazon\n","link":"https://blog-lampetty-net.web.app/posts/resolve-squash-merge-conflict/","section":"posts","tags":["Git"],"title":"squash mergeの環境でCascading PRsでコンフリクトした時"},{"body":"VPS上にDokkuというものをインストールして、Dokku上でHello WorldするRailsアプリを動かすまでのメモ。\nWhy Dokku? DokkuのWebサイトに書いてあるように、Dokkuはオープンソース版のHerokuという立ち位置のソフトウェア。かれこれ7年ぐらいHerokuを使い続けていてとても便利だと思っているのだけど、アプリケーションを1つ動かすのに$5かかるようになってしまった。昨今の円安で750円ぐらいかかるし、アプリを複数作るとなるとそれなりにお金がかかるので、VPSでDokkuを動かしその上でアプリケーションを稼働させるようにしたいと思った。\nまた、WebARENA IndigoのVPSだと、2vCPUでメモリ2GBで税込814円 / 月という安さなので、これを使うとかなりコスト抑えられそうだなと思ったからだった。\nインストール 以下の環境にDokku 0.32.3をインストールする。\nWebARENA IndigoのVPS(4vCPU, MEM 4GB, SSD 80GB) OS: Ubuntu 22.04 インストール自体はDokkuのドキュメントの通り、aptを使ってインストールすれば特にハマることはないはず。\nSSHの公開鍵の登録 アプリケーションのデプロイ時にgit push dokku ...とやる場合、sshの公開鍵が登録されていないと失敗するので、以下のコマンドで登録しておく。\n$ echo \u0026#39;CONTENTS_OF_ID_RSA_PUB_FILE\u0026#39; | sudo dokku ssh-keys:add admin ドメインの設定 インターネット上にDokkuを使ってアプリケーションを公開するためには、当然ながらドメインが必要なので用意しておく。自分は dokku.lampetty.net をベースドメインにして、これのサブドメインでアプリケーションを公開していくつもりなので、必要な設定をした。\nまず、 domains:report コマンドで現状のドメインを確認する。\n$ dokku domains:report --global =====\u0026gt; Global domains information Domains global enabled: true Domains global vhosts: i-xxxxxxxxx Domains global vhostsはデフォルトではホストマシンのホスト名になっているので、これを以下のコマンドで変更する。\ndokku domains:set-global dokku.lampetty.net 次に、dokku.lampetty.net サブドメインがこのVPSのIPアドレスになるようにDNSレコードを定義する。Aレコードの方は別になくてもいいけど、IPとのマッピングは1箇所にしたいのでこうしている。\ndokku.lampetty.net A \u0026lt;VPSのIP\u0026gt; *.dokku.lampetty.net CNAME dokku.lampetty.net digコマンドでDNSレコードを確認して、以下のように返ってくればOK。\n$ dig example.dokku.lampetty.net example.dokku.lampetty.net. 300 IN CNAME dokku.lampetty.net. これでドメインの設定は完了したので、サンプルアプリケーションをデプロイする。\nアプリケーションのデプロイ サンプルアプリケーションのデプロイはドキュメント通りにやって、最後にgit remote add dokku ...のところだけ、自分の環境に合わせて以下のようにやった。\n$ cd ruby-getting-started $ git remote add dokku dokku@dokku.lampetty.net:ruby-getting-started $ git push dokku main 動作確認 http://ruby-getting-started.dokku.lampetty.net/ にアクセスして、以下の画面が表示されればアプリケーションがデプロイされている。(ruby-getting-started 以降のドメインは先ほど設定したドメイン)\nあとはアプリケーションを https でアクセスできるようにする対応なども必要だけど、いったんこれでVPS上にアプリケーションをデプロイできるようになりましたとさ。\nプログラマのためのDocker教科書 第2版 インフラの基礎知識\u0026コードによる環境構築の自動化 プログラマのためのDocker教科書 第2版 インフラの基礎知識\u0026amp;コードによる環境構築の自動化\n作者:WINGSプロジェクト 阿佐 志保 翔泳社 Amazon\n","link":"https://blog-lampetty-net.web.app/posts/install-dokku-on-vps/","section":"posts","tags":["Dokku"],"title":"VPSにDokkuをインストールする"},{"body":"最近、新しい猫を我が家に迎え入れた。名前は「しろ」。保護猫で年齢は5~6歳。岡山で多頭飼育の崩壊後ゴミ屋敷となった民家から保護された。その後、地元の預かりボランティアのお宅では他の猫と折り合いが悪く、ほぼケージ生活となったため、他に猫のいない家庭に譲渡したいということで東京に移動してきたところで、我が家で迎え入れることになった。\nウチに来て間もない頃のしろ\nしろの話をする前に、このブログやTwitterにも登場していたししまるの話をしなければ、と思っている。ししまるは昨年の12月に虹の橋を渡ってしまった。昨年の夏から肺炎の症状があり投薬などで治療を続けていたが、(おそらく)間質性肺炎という難治性の病気で治ることなく他界してしまった。自分にとってはペットを飼うことが初めてで、当然その死に立ち会うのも初めてだったのでとてつもなく悲しかった。3ヶ月間は毎日ししまるの写真や動画を見ては泣いてしまうという状態が続いていたし、今でも病気で辛そうだったししまるのことを思い出すと泣いてしまう。\nししまる\nその悲しさに一区切りつけられたのは、今年の4月に近所のお寺でペットの合同供養祭に参加したことだと思う。ペットを亡くした飼い主たちがお寺に集まり、お坊さんが供養のお経を唱えて線香をあげるという葬儀。人間と同じように葬儀を行うことで気持ちも少し整理された気がして、その後から「また猫を迎え入れる？」という話を妻とするようになった。そんな中で妻が保護猫のサイトで見つけたのがしろだった。色が白いところや雰囲気がなんとなくししまるに似ている...! ということで、本物を見に行ったところ、体重6.5kgの大きさがししまるっぽく、とてもビビりだけど人懐っこいということで、譲渡の申請＋トライアルで2週間ほどわが家に来てもらうことになった。\nうちに来た当初はずっと机の下に隠れていたけど、2,3日で家の中を探検するようになり、息子含めた全員になでなでをお願いするぐらい懐いていった。ししまるは息子にはあまり甘えなかったので、息子もとても嬉しかったらしい。\nただ、ここで一つ問題が発生。ししまるの時は全然問題なかったのに、妻と息子の猫アレルギーが発動して、薬を飲まないとアレルギーの症状が抑えられず、「これだと迎え入れるのは厳しいかも」という状況になっていた。ひとまずトライアルを延長して、猫のアレルゲンを減らすキャットフードを試したり、体をまめにふく＆ブラッシングしたりして、なんとか薬を飲まなくても大丈夫な状態にまでなった。一緒に生活していると慣れてきてアレルギーがおさまったりすることもあるそうで、何が効いたのかはいまでもよくわかってないけど、問題が解決したので一旦良しとしている。\nというわけで、無事に9月にしろを正式に迎え入れることができて、また家に猫がいる生活が始まった。白猫のため、黒いシャツを着ているとしろの抜け毛が目立ってしまい頻繁にコロコロをかけないといけないあの生活がまた戻ってきたと思うと、面倒くさいながらちょっとニヤニヤしてしまう。ししまるは家に知らない人がきても興味を持って挨拶していたりしたけど、しろはビビりで引きこもってしまうところなど、さまざまな違いを発見できて面白い。\nししまる、今まで本当に本当にありがとう。しろ、これからよろしくね。\n","link":"https://blog-lampetty-net.web.app/posts/shishimaru-and-shiro/","section":"posts","tags":["日記"],"title":"ししまるとしろ"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/auth0/","section":"categories","tags":null,"title":"Auth0"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/auth0/","section":"tags","tags":null,"title":"Auth0"},{"body":"Next.js + Auth0で認証機能を実装しようとして、nextjs-auth0をセットアップしつつ、このドキュメント通りにやっていたら、AUTH0_ISSUER_BASE_URL の設定を間違えていて以下のエラーが出ていた。\nLoginHandlerError: Login handler failed. CAUSE: Discovery requests failing for http://localhost:3000, expected 200 OK, got: 404 Not Found 上のauth0のドキュメントでは AUTH0_ISSUER_BASE_URL='https://{yourDomain}' との記述だったので、http://localhost:3000を指定したのだけど、どうやらこれはhttps://YOUR_AUTH0_DOMAIN.auth0.comを記述するのが正しいらしい。というわけでAuth0の該当アプリケーションのページからDomainの部分をコピーしてきてhttps://oinume.us.auth0.comのように指定すればOK。というかnextjs-auth0にはそのように記載されていたのではじめからこっちを読んでおけばよかった...\n","link":"https://blog-lampetty-net.web.app/posts/nextjs-auth0-resolve-login-handler-failed/","section":"posts","tags":["Auth0"],"title":"Next.js + Auth0でLogin handler failedのエラーを解消する"},{"body":"モチベーション 趣味で開発しているプロダクトのためにVPSを立てていて、Ansibleで各種ミドルウェアの設定をしているんだけど、VirtualBoxのApple Silicon への対応が微妙なのでmultipassを使ってVMを立てる＋Ansible Playbookを流してセットアップするということをやってみたのでそのメモ。\nmultipassでVMを立ち上げる まず初めにssh用の秘密鍵と公開鍵を生成する。multipassでVMを立ち上げるときはデフォルトでSSH用の鍵を生成してくれるけど、Ansibleでsshするときの鍵を作っておく。\nssh-keygen -t rsa -b 4096 -C multipass -f multipass 次に、以下のようなcloud-init.ymlを作成する。\nusers: - default - name: multipass sudo: ALL=(ALL) NOPASSWD:ALL ssh_authorized_keys: - \u0026#34;ssh-rsa \u0026lt;上で生成した公開鍵\u0026gt;\u0026#34; multipass launchでVMを立ち上げる時に、--cloud-init オプションで先ほどのcloud-init.ymlを指定する。これを行うことでmultipassユーザーの authorized_keys に上で作成したSSHの公開鍵がセットされる。\nmultipass launch -n vps -c=1 -m=1G -d=5G --cloud-init=cloud-init.yml 次にVMのIPアドレスを確認する。\nmultipass info vps Name: vps State: Running IPv4: 192.168.64.13 Release: Ubuntu 22.04.2 LTS Image hash: f6b5b3a980f2 (Ubuntu 22.04 LTS) CPU(s): 1 Load: 0.20 0.11 0.04 Disk usage: 1.4GiB out of 4.7GiB Memory usage: 151.3MiB out of 962.5MiB Mounts: -- Ansibleのinventoryファイルを以下のようにする。\n[local] default ansible_host=\u0026lt;上で調べたIP\u0026gt; ansible_port=22 ansible_user=\u0026#39;multipass\u0026#39; ansible_ssh_private_key_file=\u0026#39;multipass\u0026#39; 最後にansible-playbookを実行する。\nANSIBLE_SSH_ARGS=\u0026#39;-o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s\u0026#39; ansible-playbook --inventory-file=ansible/inventory/multipass --timeout=30 -v -D ./ansible/hoge.yml multipassのコマンドメモ multipass transfer : VMからファイルをコピーする or ホストからVMにファイルをコピーする multipass shell : VM内にシェルでログインする 新しいLinuxの教科書 新しいLinuxの教科書\n作者:三宅 英明,大角 祐介 SBクリエイティブ Amazon\n","link":"https://blog-lampetty-net.web.app/posts/multipass/","section":"posts","tags":["Ubuntu"],"title":"multipassでAnsibleの動作確認用のVMを作る"},{"body":"","link":"https://blog-lampetty-net.web.app/categories/ubuntu/","section":"categories","tags":null,"title":"Ubuntu"},{"body":"","link":"https://blog-lampetty-net.web.app/tags/ubuntu/","section":"tags","tags":null,"title":"Ubuntu"},{"body":"自分の備忘録としてのやってみた系の話。OpenAIが提供するモデルを使って文字起こしをするC++実装のwhisper.cppを試してみた。\n環境 Apple M1 MacBook Air 2020 (Memory 16GB)\nuname -a Darwin hogehoge.local 22.3.0 Darwin Kernel Version 22.3.0: Mon Jan 30 20:39:35 PST 2023; root:xnu-8792.81.3~2/RELEASE_ARM64_T8103 x86_64 whisper.cppのビルド 以下のコマンドを実行してビルドする。\ngit clone https://github.com/ggerganov/whisper.cpp.git cd whisper.cpp make ビルドが成功すると、カレントディレクトリに main という名前のバイナリが出来上がる。\nモデルのダウンロード 次にモデルのダウンロードをしておく。\n./models/download-ggml-model.sh large 文字起こしする音声ファイルのwavファイルを用意 whisper.cppはwavファイルしか受け付けないので、ffmpegで動画ファイルをwavにする。 ちょうど手元に会社で公開している勉強会の動画があったので、これを使ってみる あと長いので最初の2分間だけを抽出。 ffmpeg -i ~/Downloads/2023-02-13.mp4 -ar 16000 -to 120 2023-02-13.wav whisper.cppで文字起こし 先ほど出力したwavファイルからwhisper.cppを使って文字起こしする。\n./main -m models/ggml-large.bin -f 2023-02-13.wav -l auto 注意点\n-m でダウンロードしたモデルファイルを使う。largeだと精度が高い -l auto を指定しないと日本語の文字起こししてくれないので指定する。もしくは-l jaでもOK 文字起こしの結果。ちなみに2分の音声ファイルを文字起こしするのに82秒ぐらいかかっている。\n[00:00:00.000 --\u0026gt; 00:00:01.000] お願いします [00:00:01.000 --\u0026gt; 00:00:02.000] お願いします [00:00:02.000 --\u0026gt; 00:00:11.120] はい 本日 Dpエンジニアリングまで 第60回始めていきたいと思います [00:00:11.120 --\u0026gt; 00:00:12.120] お願いします [00:00:12.120 --\u0026gt; 00:00:13.120] お願いします [00:00:13.120 --\u0026gt; 00:00:14.120] お願いします [00:00:14.120 --\u0026gt; 00:00:21.840] 今日は React 18かな 18から新しく 出たディファードバリューっていう [00:00:21.840 --\u0026gt; 00:00:28.440] やつの紹介ですね もともとデバウンス とかスロットルみたいな感じで [00:00:28.440 --\u0026gt; 00:00:33.840] 各種ライブラリーが似たような やつやってたんですけど そうじゃ [00:00:33.840 --\u0026gt; 00:00:38.800] なくて結構UIのアップデートで 最適化したやつが出ましたよっていう [00:00:38.800 --\u0026gt; 00:00:44.320] ので もともとデバウンスっていう 本当はスロットルも出したかったん [00:00:44.320 --\u0026gt; 00:00:49.200] ですけど React 18でスロットルのやつ がバグっていてとあるライブラリー [00:00:49.200 --\u0026gt; 00:00:54.000] でパッてデモが用意できなかったん ですけど 一応デバウンスだけ紹介 [00:00:54.000 --\u0026gt; 00:01:04.120] しておくと 18入力した後に時間差 で18入力されるという 今これ1秒 [00:01:04.120 --\u0026gt; 00:01:09.680] かな 1秒ってやってるので 最後に 入力した後1秒後に値が更新される [00:01:09.680 --\u0026gt; 00:01:15.400] ってやつですね 連続で入力してる 間はデバウンスバリューは変わん [00:01:15.400 --\u0026gt; 00:01:20.840] ないけれど 止めてから1秒すると デバウンスバリューは変わる これ [00:01:20.840 --\u0026gt; 00:01:27.120] 何使いたいかっていうと インクリメンタル サーチとか オリジンのところを [00:01:27.120 --\u0026gt; 00:01:31.600] 見てもらうと 一文字変わるごとに サーチ検索API叩きまくってると [00:01:31.600 --\u0026gt; 00:01:38.320] 重すぎるし 重すぎるので デバウンス みたいにユーザーの操作が終わった [00:01:38.320 --\u0026gt; 00:01:44.560] 後にAPI一回叩くみたいな感じで やってあげるっていう スロットル [00:01:44.560 --\u0026gt; 00:01:50.280] の場合は1秒ごとに発火される っていうイメージなので 例えば [00:01:50.280 --\u0026gt; 00:01:55.240] デバウンスバリューはこれ 最後 操作終わるまではデバウンスバリュー [00:01:55.240 --\u0026gt; 00:02:00.040] 更新されないですけど スロットル だった場合は1秒ごとに発火されて 最後に会社の勉強会の宣伝 ドクターズプライムでは、DP Engineering Mondayという名前で毎週勉強会をやってます。月に1回、社外向けに開催したものをYouTubeで配信しているので、よかったらチャンネル登録してください。技術スタックはReact, TypeScript, ChakraUI, Go, GCP, Hasura, PostgreSQLなので、その周辺の話が多いです。\nwww.youtube.com\n","link":"https://blog-lampetty-net.web.app/posts/try-whisper-cpp/","section":"posts","tags":["日記"],"title":"whisper.cppで文字起こしをやってみた"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2023/10/","section":"archives","tags":null,"title":"2023年10月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2023/12/","section":"archives","tags":null,"title":"2023年12月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2023/03/","section":"archives","tags":null,"title":"2023年3月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2023/04/","section":"archives","tags":null,"title":"2023年4月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2023/05/","section":"archives","tags":null,"title":"2023年5月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2023/09/","section":"archives","tags":null,"title":"2023年9月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2023/","section":"archives","tags":null,"title":"2023年の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2024/11/","section":"archives","tags":null,"title":"2024年11月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2024/01/","section":"archives","tags":null,"title":"2024年1月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2024/06/","section":"archives","tags":null,"title":"2024年6月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2024/08/","section":"archives","tags":null,"title":"2024年8月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2024/09/","section":"archives","tags":null,"title":"2024年9月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2024/","section":"archives","tags":null,"title":"2024年の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/10/","section":"archives","tags":null,"title":"2025年10月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/12/","section":"archives","tags":null,"title":"2025年12月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/01/","section":"archives","tags":null,"title":"2025年1月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/02/","section":"archives","tags":null,"title":"2025年2月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/03/","section":"archives","tags":null,"title":"2025年3月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/04/","section":"archives","tags":null,"title":"2025年4月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/05/","section":"archives","tags":null,"title":"2025年5月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/07/","section":"archives","tags":null,"title":"2025年7月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/08/","section":"archives","tags":null,"title":"2025年8月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2025/","section":"archives","tags":null,"title":"2025年の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2026/01/","section":"archives","tags":null,"title":"2026年1月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2026/02/","section":"archives","tags":null,"title":"2026年2月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2026/03/","section":"archives","tags":null,"title":"2026年3月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2026/04/","section":"archives","tags":null,"title":"2026年4月の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/2026/","section":"archives","tags":null,"title":"2026年の記事"},{"body":"","link":"https://blog-lampetty-net.web.app/archives/","section":"archives","tags":null,"title":"Archives"}]