<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on oinume journal</title>
    <link>https://blog-lampetty-net.web.app/posts/</link>
    <description>Recent content in Posts on oinume journal</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Thu, 30 Apr 2026 09:00:00 +0900</lastBuildDate><atom:link href="https://blog-lampetty-net.web.app/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>iOSのショートカットで朝ごはんの内容を音声でメモアプリに記録する</title>
      <link>https://blog-lampetty-net.web.app/posts/add-text-to-apple-notes-with-voice-input/</link>
      <pubDate>Thu, 30 Apr 2026 09:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/add-text-to-apple-notes-with-voice-input/</guid>
      <description>
        
          
            &lt;p&gt;毎朝息子に朝ごはんを作っているのだけど、レパートリーが少ないため3日間同じメニューになってしまったりするので、最近はメモアプリに何を食べたか記録してなるべく違うものになるように工夫していた。でで、スマホからメモアプリを起動して入力するのが面倒だったので、ショートカットアプリで音声入力でメモアプリに残すように半自動化してみたという話。&lt;/p&gt;
&lt;p&gt;具体的には「ぼうやの朝ごはん」というノートに以下のようにテキストが追記されていくイメージ。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;04/27月: 夜ご飯のおかずの残り
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;04/28火: 食パンと目玉焼き
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;04/29水: ツナサンド
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;完成したショートカットのイメージ&#34;&gt;完成したショートカットのイメージ&lt;/h2&gt;
&lt;h2 id=&#34;ショートカットの設定手順&#34;&gt;ショートカットの設定手順&lt;/h2&gt;
&lt;p&gt;iOSのショートカットアプリはできることが豊富であるがゆえに、必要な処理を探すのがわかりづらいと感じたので具体的な手順を書いておく。ちなみにiOS 26での手順なのでバージョンが違うと若干異なるかもしれない。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ショートカットアプリを起動&lt;/li&gt;
&lt;li&gt;右上の&lt;code&gt;+&lt;/code&gt;ボタンで新規ショートカットを作成&lt;/li&gt;
&lt;li&gt;スクリプティングを選択して、テキストを音声入力を選択&lt;/li&gt;
&lt;li&gt;アクションを検索 -&amp;gt; スクリプティング -&amp;gt; 日付をフォーマットを選択&lt;/li&gt;
&lt;li&gt;そのままだと「音声入力されたテキスト」を書式設定することになってしまっているので、「音声入力されたテキスト」をタップして「変数を消去」し、「現在の日付」をかわりに設定する&lt;/li&gt;
&lt;li&gt;アクションを検索 -&amp;gt; スクリプティング -&amp;gt; 「テキスト」を選択&lt;/li&gt;
&lt;li&gt;「変数を選択」の部分から上2つの入力を組み合わせて「 &lt;code&gt;フォーマット済みの日付&lt;/code&gt;: &lt;code&gt;音声入力されたテキスト&lt;/code&gt;」を入力するように設定する&lt;/li&gt;
&lt;li&gt;アクションを検索 -&amp;gt; 「メモ」アプリを選択 -&amp;gt; 「メモに追加」を選択&lt;/li&gt;
&lt;li&gt;追記したい先のメモを選択(自分のケースでは「ぼうやの朝ごはん」)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;ショートカットの起動&#34;&gt;ショートカットの起動&lt;/h2&gt;
&lt;p&gt;毎回ショートカットアプリを開いて作成したショートカットを起動するの面倒なので、自分はウィジェットで起動できるようにしている。あとはSiriを起動して「ぼうやの朝ごはん」と言うとショートカットを起動してくれる。&lt;/p&gt;
&lt;p&gt;Siri経由は、最初のうちはなぜかカレンダーから「ぼうやの朝ごはん」を探そうとして「そんなものはありません」と言われていたのだけど、ウィジェットに登録した後からちゃんと認識してくれるようになった 🤔&lt;/p&gt;
&lt;h2 id=&#34;実際使ってみて&#34;&gt;実際使ってみて&lt;/h2&gt;
&lt;p&gt;音声認識の精度が心配だったのだけど、朝ごはんの内容ぐらいであれば音声が誤認識されることはなく特に問題なく運用できている。より難しいテキストを入力する場合はOpenAIなどのAPIと&lt;a href=&#34;https://scriptable.app/&#34;&gt;Scriptable&lt;/a&gt;を使えば良いと思われる。&lt;/p&gt;
&lt;p&gt;初めてiOSショートカットで複雑なフローを組んでみたけど、これ単体でかなり高度なことができそうなので他にも音声入力系で自動化を頑張ってみたい&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Bashの起動を高速化した</title>
      <link>https://blog-lampetty-net.web.app/posts/optimizing-bash-startup/</link>
      <pubDate>Mon, 16 Mar 2026 08:30:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/optimizing-bash-startup/</guid>
      <description>
        
          
            &lt;p&gt;最近Bashを起動する速度がどんどん遅くなっているなと感じたので、Claude Codeに高速化を依頼した。&lt;/p&gt;
&lt;h2 id=&#34;パフォーマンスの可視化&#34;&gt;パフォーマンスの可視化&lt;/h2&gt;
&lt;p&gt;まず手始めに、Bash起動時に何に時間がかかっているのかをわかるようにしてもらった(&lt;a href=&#34;https://github.com/oinume/dotfiles/pull/13&#34;&gt;PR&lt;/a&gt;)。&lt;/p&gt;
&lt;p&gt;以下のように&lt;code&gt;BASH_PROFILE_PROFILING=1 bash -l&lt;/code&gt;で起動することで、以下のようにどこに時間がかかっているかが計測可能になる。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;BASH_PROFILE_PROFILING&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; bash -l
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;      &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; prompt/history
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;     &lt;span class=&#34;m&#34;&gt;48&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;47&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; brew --prefix
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;     &lt;span class=&#34;m&#34;&gt;49&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; .bash_local
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;118&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;69&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; bash-completion
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1361&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+1243 ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; bash-it
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1401&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;40&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; fzf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1402&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; bash-powerline
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1403&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; tmuxinator
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1404&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; completion &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;git&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1410&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; google-cloud-sdk
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1505&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;95&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; rbenv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1516&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;11&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; JDK &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;java_home&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1917&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+ &lt;span class=&#34;m&#34;&gt;401&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; nvm
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1947&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; mise
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1970&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;23&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; wtp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1980&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; direnv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1981&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; nvm bash_completion
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1982&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;TOTAL&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;高速化&#34;&gt;高速化&lt;/h2&gt;
&lt;p&gt;とりあえず &lt;a href=&#34;https://github.com/Bash-it/bash-it&#34;&gt;bash-it&lt;/a&gt; が遅すぎるのでこれを読み込まないようにした。これだけど 1243ms 速くなり、体感的にもかなり快適になった。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>mineoに乗り換えて1年経った</title>
      <link>https://blog-lampetty-net.web.app/posts/mineo-1-year/</link>
      <pubDate>Sun, 01 Mar 2026 10:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/mineo-1-year/</guid>
      <description>
        
          
            &lt;p&gt;スマホのSIMをMVNOのmineoに切り替えて1年以上が経って、かなり満足しているのでここにその良さを書いておく。mineoの前は、新規契約はストップしている&lt;a href=&#34;https://service.ocn.ne.jp/mobile/&#34;&gt;OCNモバイルONE&lt;/a&gt;を使っていた。&lt;/p&gt;
&lt;h2 id=&#34;mineoに切り替えた理由&#34;&gt;mineoに切り替えた理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;新規契約をストップしていることから、OCNモバイルONEには将来性がなさそう&lt;/li&gt;
&lt;li&gt;mineoは以前も契約していたことがあり、速度制限がある状態でも1.5Mbps(当時は1Mbpsだったかも?)の速度が出ることは知っていた&lt;/li&gt;
&lt;li&gt;価格的には日本通信も候補に上がったけど、DoCoMoではなくauの回線を使いたかったのでmineoに決めた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;自分のユースケース&#34;&gt;自分のユースケース&lt;/h2&gt;
&lt;p&gt;週3,4は通勤しているので主にその隙間時間で以下をやっている。mineoに切り替えてからは月に30GBぐらいのギガを使っている。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ストリーミングで音楽を聴く&lt;/li&gt;
&lt;li&gt;YouTubeを見る&lt;/li&gt;
&lt;li&gt;移動中にテザリングでPC作業をする&lt;/li&gt;
&lt;li&gt;Podcastを聴く&lt;/li&gt;
&lt;li&gt;SNSを見る&lt;/li&gt;
&lt;li&gt;Kindleなどで本を読む&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;mineoにしてどうだったか&#34;&gt;mineoにしてどうだったか&lt;/h2&gt;
&lt;p&gt;OCNモバイルONEは10GB / 月の容量しかなかったので通勤中にYouTubeを観ることは不可能だったけど、mineoにしてからは移動中に動画を見れるようになったので生活が大きく変わった。Netflixも見たいものがあれば事前にダウンロードする必要があったけど、これもストリーミングで再生できるようになったので便利になった。&lt;/p&gt;
&lt;p&gt;また、速度制限がある状態でもテザリングでなんとか作業できるため、移動中にやれることの幅が広がったように思う。&lt;/p&gt;
&lt;p&gt;さらに、2026年3月から速度制限状態でも最大で1.5 -&amp;gt; 3Mbps出るようになり&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;、より快適になった。自分は 15GB / 月のプランを契約しているけど、速度制限がある状態でもほとんど用が済んでしまうため、ギガが毎月半分以上使い切れていないという状態になっている。&lt;/p&gt;
&lt;h2 id=&#34;というわけで&#34;&gt;というわけで&lt;/h2&gt;
&lt;p&gt;よほど改悪されない限りは、ずっとmineoでいこうと思うほどに快適です。&lt;/p&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://support.mineo.jp/news/1810/&#34;&gt;ちょうどいい使い放題オプション「パケット放題 3Mbps」の正式リリースについて｜mineoユーザーサポート&lt;/a&gt;&lt;a href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Claude Codeの設定の差分を吸収するsettings.jsonの管理方法</title>
      <link>https://blog-lampetty-net.web.app/posts/managing-claude-code-settings/</link>
      <pubDate>Sun, 15 Feb 2026 00:05:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/managing-claude-code-settings/</guid>
      <description>
        
          
            &lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;会社のPCと個人PCでClaude Codeを使っているのだけど、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会社PCではAPI Keyによる従量課金方式&lt;/li&gt;
&lt;li&gt;個人PCはサブスクのProプラン&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;となっている。permissionsの設定などで秘伝のタレ化している ~/.claude/settings.json は共通化して管理したいが、会社PCの ~/.claude/settings.json にはAPIキーやその他会社環境固有の環境変数を定義する必要があるため、会社PCと個人PCで発生する差分をどうにかしたい。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;macOSの場合は、PC固有の設定を &lt;code&gt;/Library/Application\ Support/ClaudeCode/managed-settings.json&lt;/code&gt; に保存する&lt;/li&gt;
&lt;li&gt;共通の設定は &lt;a href=&#34;https://github.com/oinume/dotfiles&#34;&gt;dotfiles&lt;/a&gt; リポジトリ内で settings.json を管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このやり方でうまいこと差分を吸収できたよ、というただそれだけの記事。&lt;/p&gt;
&lt;p&gt;参考リンク: &lt;a href=&#34;https://code.claude.com/docs/en/settings#available-scopes&#34;&gt;Claude Code settings - Claude Code Docs&lt;/a&gt;&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Apple Developer Programに加入せずにReact Native(expo)でiOSアプリを実機にインストール</title>
      <link>https://blog-lampetty-net.web.app/posts/deploy-ios-app-without-adp/</link>
      <pubDate>Sat, 14 Feb 2026 09:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/deploy-ios-app-without-adp/</guid>
      <description>
        
          
            &lt;p&gt;「こんなアプリがほしい」と思ってExpoで作ってみたものを実機にインストールして使ってみたかった。調べたらApple Developer Programのお布施を払わなくてもインストールする方法があったのでメモ。&lt;/p&gt;
&lt;h3 id=&#34;必要なもの&#34;&gt;必要なもの&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Xcode
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.apple.com/xcode/resources/&#34;&gt;https://developer.apple.com/xcode/resources/&lt;/a&gt; からダウンロードしておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cocoapods (Homebrewとかでインストールしておく)&lt;/li&gt;
&lt;li&gt;iPhoneをmacに接続しておく&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;手順&#34;&gt;手順&lt;/h3&gt;
&lt;p&gt;expoは&lt;a href=&#34;https://docs.expo.dev/workflow/continuous-native-generation/&#34;&gt;expo prebuild&lt;/a&gt;コマンドでネイティブのコードを生成できるので、これを使ってXcodeでアプリを実機にインストールする。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx expo prebuild
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に&lt;a href=&#34;https://github.com/expo/expo/discussions/27489#discussioncomment-8707035&#34;&gt;この投稿&lt;/a&gt;に書いてある設定をする&lt;/p&gt;
&lt;p&gt;なお、上の投稿では6.で以下のように書かれているが、&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Build&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bundle&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;npx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;expo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;node_modules/expo/AppEntry.js&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;./ios/main.jsbundle&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;ios&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自分の場合は以下のように&lt;code&gt;--entry-file&lt;/code&gt;を修正する必要があった。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;npx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;expo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;node_modules/expo-router/entry.js&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;./ios/main.jsbundle&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;ios&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あと依存ライブラリがインストールされずにビルドに失敗していたので、以下を実行する必要があるかもしれない&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cd ios
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pod install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>2026年1月時点での作業環境</title>
      <link>https://blog-lampetty-net.web.app/posts/work-environment-202601/</link>
      <pubDate>Mon, 26 Jan 2026 09:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/work-environment-202601/</guid>
      <description>
        
          
            &lt;h2 id=&#34;マシンos&#34;&gt;マシン＆OS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;メインPCはmacOS&lt;/li&gt;
&lt;li&gt;VPSではUbuntu&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;アプリ&#34;&gt;アプリ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Browser: ChromeたまにSafari&lt;/li&gt;
&lt;li&gt;IDE: IntelliJ IDEA&lt;/li&gt;
&lt;li&gt;Editor: VScode。コードを書くときはIntelliJで、ちょっとしたテキストの編集をする際はVScode&lt;/li&gt;
&lt;li&gt;Terminal: iTerm + tmux + fzf
&lt;ul&gt;
&lt;li&gt;tmuxがちゃんと動くならGhosttyに乗り換えたいかも&lt;/li&gt;
&lt;li&gt;fzf, tmuxは10年以上使ってる気がする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Shell: Bash
&lt;ul&gt;
&lt;li&gt;昔はZsh使っていたがカスタマイズが面倒になってBashにした&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Coding Agent: Claude Code, たまにCodex。去年はCursorを使っていたが最近は使ってない&lt;/li&gt;
&lt;li&gt;Launcher: Raycast&lt;/li&gt;
&lt;li&gt;タスク管理: Reminder&lt;/li&gt;
&lt;li&gt;パスワード管理: 1Password&lt;/li&gt;
&lt;li&gt;その他: Homerow, Giphy&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;メモアプリ&#34;&gt;メモアプリ&lt;/h2&gt;
&lt;p&gt;去年はObsidianを使ってみたが、あまり馴染まずで結局macOSのメモアプリ＋Notionに戻った。Notionはスマホからの編集が絶望的にやりにくいので、一時的にメモアプリに書いて、長期で保存する必要があるメモをNotionに入れるスタイル。Notionのデータベースは情報を整理するのには向いているので、長期記憶のデータベースとして活用している&lt;/p&gt;
&lt;h2 id=&#34;hot-key&#34;&gt;Hot Key&lt;/h2&gt;
&lt;p&gt;Raycastを使って以下のHot keyを割り当てている。どこかに書いておかないと忘れて使わなくなるものがあるのでメモ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + Cmd + c: クリップボード履歴&lt;/li&gt;
&lt;li&gt;Ctrl + Cmd + s: 開いているウィンドウ一覧&lt;/li&gt;
&lt;li&gt;Ctrl + 5: Homerow起動&lt;/li&gt;
&lt;li&gt;Ctrl + Cmd + 1: (Chrome上のみ)1Password起動&lt;/li&gt;
&lt;/ul&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>2025年の振り返りと2026年</title>
      <link>https://blog-lampetty-net.web.app/posts/2025-and-2026/</link>
      <pubDate>Tue, 20 Jan 2026 09:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/2025-and-2026/</guid>
      <description>
        
          
            &lt;p&gt;時間が無さすぎて完全に振り返りを忘れていた😇&lt;/p&gt;
&lt;p&gt;2025年は仕事以外にいくつか新しいことを始められた良い年であった。&lt;/p&gt;
&lt;h2 id=&#34;音楽&#34;&gt;音楽&lt;/h2&gt;
&lt;p&gt;2025年に行ったライブは&lt;a href=&#34;https://journal.lampetty.net/entry/lives-in-2025&#34;&gt;2025年振り返り(ライブ編) - oinume journal&lt;/a&gt;にまとめた。2024年よりもライブに行った回数が増えたのは良いこと。&lt;/p&gt;
&lt;p&gt;新しいバンドを好きになるということは特になかったけど、2025年後半からSaosinの曲を再び聴くことが多くなった。このバンドはボーカルが変わったり脱退したりでなかなか安定しなかったバンドではあるけど、2016年から初代ボーカルのアンソニーが復帰して活動を再開していたらしく、さらに2024年には2代目のコーブ・リバーにバトンタッチしていてツアーも積極的にやるようになったらしい。ただ、なぜか日本には来ることができないようで、今年か来年に海外で観てみたいなぁと思っている。&lt;/p&gt;
&lt;h2 id=&#34;放送大学&#34;&gt;放送大学&lt;/h2&gt;
&lt;p&gt;昨今の地球温暖化についてもう少し深く学びたい気持ちと学割で色々と安く買えることを目的に入学。単位をたくさん取って卒業する気はないので、半期に気になる科目を履修して緩く学習するという感じにしている。というか、履修しなくてもWebで全ての授業動画が見れるので、「Audibleより質の高い学習サブスク」という位置付けで続けている。そんなわけで2024年に始めたAudibleは解約してしまった。&lt;/p&gt;
&lt;h2 id=&#34;youtube&#34;&gt;YouTube&lt;/h2&gt;
&lt;p&gt;前年にスマホのキャリアをOCN MobileからMineoに変更して、速度制限がかかっている状態でも1.5Mbps出るようになり、常時YouTubeを見れるようになった。これが功を奏して、色々なバンドのライブ動画をいつでもどこでも見れるようになったし、また教育系のコンテンツもよく見るようになった。油断してると時間泥棒になってしまう側面はあるけど、今のところ自分にとってはプラスになっている気がする。主に以下のコンテンツをよく見てる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;音楽：ライブ動画だったり「〜を弾いてみた」系のコンテンツ&lt;/li&gt;
&lt;li&gt;医療：&lt;a href=&#34;https://www.youtube.com/watch?v=6Sqfr2us9ts&#34;&gt;https://www.youtube.com/watch?v=6Sqfr2us9ts&lt;/a&gt;のような専門医が語る系&lt;/li&gt;
&lt;li&gt;政治：特定の政党の代表が話している公式の動画など
&lt;ul&gt;
&lt;li&gt;政治切り抜き系の動画は恣意的な内容かつ2次情報なのでみない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あとは放送大学の学割でYouTube Premiumが安く加入できるので(1280円 -&amp;gt; 780円)、広告なしで快適に視聴できている。&lt;/p&gt;
&lt;h2 id=&#34;ベース&#34;&gt;ベース&lt;/h2&gt;
&lt;p&gt;ずっとベースをやりたいと思っていて、年末の休みの間に勢いで買ってしまった。手が小さいのでバッカスのWJB-Miniというモデルにした。メルカリShopsで欲しい色が6000円引きで売っていたので即決。ベース本体だけではなくて色々機材も購入したので別の記事で詳細を書きたいけど、YouTubeの音源に合わせてベースをあわせて弾くことが簡単にできて楽しい。テープやCDに合わせて練習していた頃に比べると本当にいい時代になった。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07W47MMJ4?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;figure&gt;
  &lt;picture&gt;

    
      
        
        
        
        
        
        
    &lt;img
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;
      alt=&#34;バッカス BACCHUS WJB-Mini DLPB ミニエレキベース&#34;
      
        class=&#34;image_figure image_external image_processed&#34;
        width=&#34;500&#34;
        height=&#34;500&#34;
        src=&#34;https://blog-lampetty-net.web.app/41mSOr6L58S._SL500__11039398359510645952.jpg&#34;
      
      
        title=&#34;バッカス BACCHUS WJB-Mini DLPB ミニエレキベース&#34;
      
    /&gt;

    &lt;figcaption class=&#34;caption_figure caption_external&#34;&gt;バッカス BACCHUS WJB-Mini DLPB ミニエレキベース&lt;/figcaption&gt;&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07W47MMJ4?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;バッカス BACCHUS WJB-Mini DLPB ミニエレキベース&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bacchus バッカス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07W47MMJ4?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;仕事&#34;&gt;仕事&lt;/h2&gt;
&lt;p&gt;担当していたサービスがクローズになってしまい、かなりやる気をなくしている。色々と思うところはあるけどネガティブな内容になるため自重&lt;/p&gt;
&lt;h2 id=&#34;2026年に向けて&#34;&gt;2026年に向けて&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今年はサマソニが25周年なので今年こそ行きたい&lt;/li&gt;
&lt;li&gt;引き続き健康には気をつける&lt;/li&gt;
&lt;li&gt;趣味プロダクトをVibe Codingで頑張る&lt;/li&gt;
&lt;li&gt;このブログをはてなブログから移行する&lt;/li&gt;
&lt;/ul&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>2025年振り返り(ライブ編)</title>
      <link>https://blog-lampetty-net.web.app/posts/lives-in-2025/</link>
      <pubDate>Tue, 30 Dec 2025 19:08:25 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/lives-in-2025/</guid>
      <description>
        
          
            &lt;p&gt;今年は合計12本のライブに行った。去年は9本だったので少し増えている...!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2/18 ROTTENGRAFFTY x Dragon Ash - Blown in the Reborn Tour 2025&lt;/li&gt;
&lt;li&gt;2/23 MIXTURE INSTITUTE PABLO with friends&lt;/li&gt;
&lt;li&gt;4/16 STATE CHAMPS x The BONEZ&lt;/li&gt;
&lt;li&gt;4/17 The Ravens GHOST NOTES TOUR&lt;/li&gt;
&lt;li&gt;6/6 Nothing’s Carved in stone x Dragon Ash - Hand In Hand Tour 2025 at Gorilla Hall Osaka&lt;/li&gt;
&lt;li&gt;9/22 I-SCREAM NIGHT FINAL&lt;/li&gt;
&lt;li&gt;9/25 Muse Japan Tour at K-Arena&lt;/li&gt;
&lt;li&gt;10/13 LOUD PARK 2025&lt;/li&gt;
&lt;li&gt;11/6 The BONEZ - I&#39;m Not Your King Tour at KT Zepp Yokohama&lt;/li&gt;
&lt;li&gt;11/19 The Theory of SCIENCE at Zepp Shinjuku&lt;/li&gt;
&lt;li&gt;11/25 The Ravens x Dragon Ash at Nagoya Bottom Line&lt;/li&gt;
&lt;li&gt;12/11 The Ravens x 10-FEET LIVE TOUR 共鳴夜光 at Shibuya O-West&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一番印象に残ったのはやっぱり11/25のRavensとDragon Ashの対バン。SHANKが体調不良により偶発的に発生したこの対バン、3日前ぐらいに発表されて当日チケットが取れたので🚅に飛び乗って日帰りでいざ名古屋へ！&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Claude Code GitHub Actionsでモデルを指定する</title>
      <link>https://blog-lampetty-net.web.app/posts/claude-code-github-actions-model/</link>
      <pubDate>Fri, 31 Oct 2025 08:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/claude-code-github-actions-model/</guid>
      <description>
        
          
            &lt;p&gt;&lt;a href=&#34;https://docs.claude.com/en/docs/claude-code/github-actions&#34;&gt;Claude Code GitHub Actions&lt;/a&gt;を使っていて、自分は以下のような2種類のタスクを依頼することが多い。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実装計画を立ててもらう&lt;/li&gt;
&lt;li&gt;実装をしてもらう&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Claude Codeであれば実装計画は&lt;code&gt;Opus&lt;/code&gt;を使って、実装タスクは&lt;code&gt;Sonnet&lt;/code&gt;を使うみたいな使い分けが簡単にできるのにClaude Code GitHub Actionsではデフォルトだとそれができなかったのでちょっとやってみた。&lt;/p&gt;
&lt;p&gt;具体的には、以下のようなclaude.ymlのWorkflowファイルを追加して、GitHub Issueなどのコメントで &lt;code&gt;@claude このタスクの実装計画を Opus で立てて&lt;/code&gt; とコメント内に&lt;code&gt;opus&lt;/code&gt;, &lt;code&gt;sonnet&lt;/code&gt;, &lt;code&gt;haiku&lt;/code&gt; のキーワードを含めることで指定したモデルでClaudeが動くようになる。&lt;/p&gt;
&lt;p&gt;やっていることは単純で、メッセージ内に&lt;code&gt;opus&lt;/code&gt;などのキーワードをgrepで引っ掛けてmodelを決めているだけ。注意点としては&lt;code&gt;grep &#39;\bopus\b&#39;&lt;/code&gt;で検索しているため、「このタスクをopusでお願い」ではマッチしないようになっている。かわりに「このタスクを opus でお願い」のようにopusの前後にスペースを入れる必要がある。&lt;/p&gt;
&lt;p&gt;そんなわけでClaude Code GitHub Actionsからもモデルが指定できるようになりタスクが捗るようになった(気がする)&lt;/p&gt;
&lt;p&gt;claude.yml&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;name: claude-code
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;on:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  issue_comment:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types: [created]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  pull_request_review_comment:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types: [created]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  issues:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types: [opened, assigned]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  pull_request_review:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types: [submitted]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;jobs:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  claude:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    if: |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      (github.event_name == &amp;#39;issue_comment&amp;#39; &amp;amp;&amp;amp; contains(github.event.comment.body, &amp;#39;@claude&amp;#39;)) ||
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      (github.event_name == &amp;#39;pull_request_review_comment&amp;#39; &amp;amp;&amp;amp; contains(github.event.comment.body, &amp;#39;@claude&amp;#39;)) ||
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      (github.event_name == &amp;#39;pull_request_review&amp;#39; &amp;amp;&amp;amp; contains(github.event.review.body, &amp;#39;@claude&amp;#39;)) ||
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      (github.event_name == &amp;#39;issues&amp;#39; &amp;amp;&amp;amp; (contains(github.event.issue.body, &amp;#39;@claude&amp;#39;) || contains(github.event.issue.title, &amp;#39;@claude&amp;#39;)))
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    runs-on: ubuntu-latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    permissions:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      contents: read
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      pull-requests: read
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      issues: read
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      id-token: write
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      actions: read # Required for Claude to read CI results on PRs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    steps:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - uses: actions/checkout@v5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        with:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          fetch-depth: 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      # Extract model from comment/issue body
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - name: Determine Claude Model
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        id: determine-claude-model
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        run: |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          # Get the comment/issue body based on event type
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          if [ &amp;#34;${{ github.event_name }}&amp;#34; = &amp;#34;issue_comment&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            BODY=$(cat &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ${{ github.event.comment.body }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          EOF
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          )
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          elif [ &amp;#34;${{ github.event_name }}&amp;#34; = &amp;#34;pull_request_review_comment&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            BODY=$(cat &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ${{ github.event.comment.body }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          EOF
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          )
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          elif [ &amp;#34;${{ github.event_name }}&amp;#34; = &amp;#34;pull_request_review&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            BODY=$(cat &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ${{ github.event.review.body }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          EOF
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          )
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          elif [ &amp;#34;${{ github.event_name }}&amp;#34; = &amp;#34;issues&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            BODY=$(cat &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ${{ github.event.issue.body }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          EOF
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          )
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          fi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          # Convert to lowercase for case-insensitive matching
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          BODY_LOWER=$(echo &amp;#34;$BODY&amp;#34; | tr &amp;#39;[:upper:]&amp;#39; &amp;#39;[:lower:]&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          # Determine model based on keywords
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          if echo &amp;#34;$BODY_LOWER&amp;#34; | grep -q &amp;#39;\bopus\b&amp;#39;; then
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            MODEL=&amp;#34;claude-opus-4-1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          elif echo &amp;#34;$BODY_LOWER&amp;#34; | grep -q &amp;#39;\bhaiku\b&amp;#39;; then
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            MODEL=&amp;#34;claude-haiku-4-5&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          else
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            # Default to sonnet (including when &amp;#39;sonnet&amp;#39; keyword is present)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            MODEL=&amp;#34;claude-sonnet-4-5&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          fi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          echo &amp;#34;model=$MODEL&amp;#34; &amp;gt;&amp;gt; $GITHUB_OUTPUT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          echo &amp;#34;Selected model: $MODEL&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - name: Run Claude Code
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        id: run-claude-code
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        uses: anthropics/claude-code-action@v1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        with:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          # This is an optional setting that allows Claude to read CI results on PRs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          additional_permissions: |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            actions: read
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          allowed_bots: &amp;#34;claude-bot,claude&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          claude_args: |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            --model ${{ steps.determine-claude-model.outputs.model }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            --allowedTools &amp;#34;Agent&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           (必要に応じてMCPなどを設定)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>放送大学入学後に知った制度</title>
      <link>https://blog-lampetty-net.web.app/posts/unknown-ouj-system/</link>
      <pubDate>Mon, 25 Aug 2025 08:30:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/unknown-ouj-system/</guid>
      <description>
        
          
            &lt;p&gt;放送大学に入学して約4ヶ月が経ったので、入学後に知った制度を書いておく(学割についてはたくさん情報があるけど、制度についての情報が少ないので)&lt;/p&gt;
&lt;p&gt;ちなみに自分はきちんと単位を取って卒業する気はあまりなく、以下の2つの理由で入学した意識の低い学生です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;気象学など気になる授業の動画を見たかった&lt;/li&gt;
&lt;li&gt;学割で色々安くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;0-全ての授業の動画が見れる&#34;&gt;0. 全ての授業の動画が見れる&lt;/h2&gt;
&lt;p&gt;元々知ってはいたのだけど、大学院含めて全ての授業の動画が見れるのがすごい。YouTubeに上がっている動画を見る方がわかりやすいものもあるけど、&lt;a href=&#34;https://www.ouj.ac.jp/kamoku/kyouyou/C/&#34;&gt;これだけ多様な分野&lt;/a&gt;の動画が全て見れるというのはすごいと思う。&lt;/p&gt;
&lt;h2 id=&#34;1-大学のメールがgmail&#34;&gt;1. 大学のメールがGmail&lt;/h2&gt;
&lt;p&gt;(制度ではないけど完全に意外だったので書いておく)放送大学に入学すると &lt;code&gt;&amp;lt;学生番号&amp;gt;@campus.ouj.ac.jp&lt;/code&gt; というメールアドレスが発行されるのだけど、これが実はGmail(Google Workspace)になっている。なので普段Gmail使っている自分にとってはとてもありがたかった。&lt;/p&gt;
&lt;h2 id=&#34;2-単位を落としても次の半期に無料で再試験が受けられる&#34;&gt;2. 単位を落としても次の半期に無料で再試験が受けられる&lt;/h2&gt;
&lt;p&gt;放送大学では試験期間が決まっておりその間にWebから試験を受けるのだが、自分は運悪く風邪を引いてしまって試験が受けられず不合格になってしまった。そんな怠惰な人間のために再試験という制度があり、次の半期に無料で再試験が受けられるという神な制度。ちなみに放送大学は科目を履修すると1万2000円費用がかかるが、再試験の場合は履修が不要なので費用がかからない&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;再試験について&lt;/p&gt;
&lt;p&gt;本学の学生の多くが有職者であることから、仕事の都合により受験の機会を逸したり、やむを得ず受験準備に必要な時間が取れなかった学生の利便を図るため、新規に科目登録した学期において、単位を修得出来なかった場合は、次の学期に学籍がある場合に限り（休学中の場合を除く）、次学期に再試験を受験できます（再試験に係る授業料等はかかりません）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ouj.ac.jp/gakubu/about/tani-nintei/&#34;&gt;単位の認定基準（学部） | 放送大学 – BS放送・ネットで学ぶ通信制大学&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;3-再入学時に以前に履修した単位を引き継げる&#34;&gt;3. 再入学時に以前に履修した単位を引き継げる&lt;/h2&gt;
&lt;p&gt;放送大学は最大で10年間在籍でき、その間に卒業できなかったとしても再入学すれば以前履修した単位をそのまま引き継げるらしい。また、再入学するときの入学金が25%割引になる。つまり入学金＋履修選択した授業料を支払っていれば無限に在籍できるということ...! 自分のような1年に4単位ぐらいしか履修しないような堕落した生徒にとってこれはありがたい制度である。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;放送大学は、卒業後や選科履修生、科目履修生で在学期間満了後でも再度入学ができます。修得済単位は全科履修生に入学時に卒業要件として認定されますので、卒業後に他コースに再入学をし、再度卒業を目指すこともできます。（全コースを卒業すること等により「名誉学生」の称号が付与されることもあります。）また選科履修生、科目履修生として再びご入学することもできます。&lt;/p&gt;
&lt;p&gt;過去3年以内に教養学部に在籍していた方は入学料の25%割引が適用されます。 全科履修生･･･24,000円⇒18,000円 選科履修生･･･9,000円⇒6,750円 科目履修生･･･7,000円⇒5,250円&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ouj.ac.jp/about/readmission/&#34;&gt;継続入学・再入学について | 放送大学&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;放送大学はいいぞ！&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>ghコマンドでよく使ってるヤツ</title>
      <link>https://blog-lampetty-net.web.app/posts/gh-command-use-cases/</link>
      <pubDate>Sun, 17 Aug 2025 17:47:28 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/gh-command-use-cases/</guid>
      <description>
        
          
            &lt;p&gt;このポストがなぜかやたらバズっていたので、調子に乗って自分がよく使っているghコマンドのサブコマンドを書いてみる。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;gh pr checks --watch でCIの状況をコマンドで確認できるの便利&lt;/p&gt;
&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1956692727648645225?ref_src=twsrc%5Etfw&#34;&gt;August 16, 2025&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;gh-pr-view--w&#34;&gt;gh pr view -w&lt;/h2&gt;
&lt;p&gt;Usage&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh pr view &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&amp;lt;number&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;url&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;branch&amp;gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;flags&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;該当のpull requestをブラウザで開くために使っている。自分は何かとブラウザ上で作業することが多いのでかなり多用してる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-w&lt;/code&gt; を省略するとターミナル上でPRの内容が表示される。&lt;/li&gt;
&lt;li&gt;引数の&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;などを省略するとカレントブランチのpull requestになる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;gh-pr-checks---watch&#34;&gt;gh pr checks --watch&lt;/h2&gt;
&lt;p&gt;Usage&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; gh pr checks &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&amp;lt;number&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;url&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;branch&amp;gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;flags&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;カレントブランチのpull requestのchecks(CI)の状況を確認するのに使ってる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gh pr checks --watch -i 3&lt;/code&gt; のように&lt;code&gt;-i&lt;/code&gt;でリフレッシュする間隔を秒数で指定できる。デフォルトは10秒&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gh pr checks --json=name,state&lt;/code&gt; のように指定すると以下のようにJSON形式で出力できる&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;name&amp;#34;: &amp;#34;triage&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;state&amp;#34;: &amp;#34;SUCCESS&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;name&amp;#34;: &amp;#34;lint&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;state&amp;#34;: &amp;#34;SUCCESS&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;name&amp;#34;: &amp;#34;test&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;state&amp;#34;: &amp;#34;SUCCESS&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;gh-pr-checkout&#34;&gt;gh pr checkout&lt;/h2&gt;
&lt;p&gt;Usage&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>複数のプロダクトのリポジトリをMonorepoに移行する</title>
      <link>https://blog-lampetty-net.web.app/posts/migrate-polyrepo-to-monorepo/</link>
      <pubDate>Tue, 22 Jul 2025 08:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/migrate-polyrepo-to-monorepo/</guid>
      <description>
        
          
            &lt;p&gt;表題の通り、技術スタックがほぼ同じプロダクト群のリポジトリを1つのMonorepoにまとめてみたという雑な記録。&lt;/p&gt;
&lt;p&gt;元々は以下のようなPolyrepo構造になっていた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;product-a (repository)
&lt;ul&gt;
&lt;li&gt;backend&lt;/li&gt;
&lt;li&gt;web&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;product-b (repository)
&lt;ul&gt;
&lt;li&gt;backend&lt;/li&gt;
&lt;li&gt;native&lt;/li&gt;
&lt;li&gt;web&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これを以下のような構成に移行した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;products (repository)
&lt;ul&gt;
&lt;li&gt;apps
&lt;ul&gt;
&lt;li&gt;product-a
&lt;ul&gt;
&lt;li&gt;backend&lt;/li&gt;
&lt;li&gt;web&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;product-b
&lt;ul&gt;
&lt;li&gt;backend&lt;/li&gt;
&lt;li&gt;native&lt;/li&gt;
&lt;li&gt;web&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大まかには以下のような流れで移行する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;移行元のリポジトリで移行用ブランチを作成する&lt;/li&gt;
&lt;li&gt;移行先のリポジトリで移行用ブランチを作成し、1.の移行用ブランチをmergeする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;では実際に移行してみよう。&lt;code&gt;product-a&lt;/code&gt;のリポジトリで以下のコマンドを実行する。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p apps/product-a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b monorepo
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git mv -k * apps/product-a/  # -k is used to ignore the error that it can&amp;#39;t move the projects directory
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git mv -k .* apps/product-a/  # .* to move .gitignore and other dot files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に移行先の&lt;code&gt;products&lt;/code&gt;リポジトリで以下のコマンドを実行する。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote add -f product-a https://github.com/&amp;lt;owner&amp;gt;/product-a.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b import-product-a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git merge product-a/monorepo --allow-unrelated-histories
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで products リポジトリの &lt;code&gt;import-product-a&lt;/code&gt;というブランチにproduct-aリポジトリのファイルが追加されているので、pull-requestを作るなどしてこのブランチをmainブランチにマージすればOK&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>RaycastのScript Commandsを試してみた</title>
      <link>https://blog-lampetty-net.web.app/posts/raycast-script-commands/</link>
      <pubDate>Wed, 07 May 2025 08:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/raycast-script-commands/</guid>
      <description>
        
          
            &lt;p&gt;Raycastには&lt;a href=&#34;https://manual.raycast.com/script-commands&#34;&gt;Script Commands&lt;/a&gt;という機能があり、ずっとずっと気になっていたのでGW中に重い腰を上げて試してみた。最近会社の人にRaycastをオススメすることが多くなってきたのだけれども、「Raycast歴1年以上経つのにScript Commandsも使ったことないの？」みたいに後ろ指差されないようにするためにも...&lt;/p&gt;
&lt;h2 id=&#34;script-commandsとは&#34;&gt;Script Commandsとは？&lt;/h2&gt;
&lt;p&gt;簡単にいうとCUIのコマンドをRaycastから呼び出せるというただそれだけのものっぽい。「っぽい」というのは単純に自分がちゃんと調べてないだけです。はいテキトーですいません。&lt;/p&gt;
&lt;h2 id=&#34;なにを作るか&#34;&gt;なにを作るか？&lt;/h2&gt;
&lt;p&gt;Hello Worldを出力するだけのScript Commandsを作っても仕方がないので、よく自分でやっている単純作業を自動化するスクリプトを考えてみた。結果として生まれたのは、以下のような beforeの文字列をafterに整形するだけのスクリプトである。なんでこんなものが必要かというと、スプレッドシートからIDなどのリストをコピーしてSQLのWHERE句のINに指定する、ということをよくやっているから。&lt;/p&gt;
&lt;p&gt;before&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aaa
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bbb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ccc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;after&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39;aaa&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39;bbb&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39;ccc&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;script-commandsの登録方法&#34;&gt;Script Commandsの登録方法&lt;/h2&gt;
&lt;p&gt;めちゃくちゃ簡単なので&lt;a href=&#34;https://github.com/raycast/script-commands&#34;&gt;このページ&lt;/a&gt;を見てもらうのが良いと思う。テキストで手順を書くと以下の4ステップしかない。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Raycastを起動する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Create Script Command&lt;/code&gt;と入力する&lt;/li&gt;
&lt;li&gt;必要な情報を入力する&lt;/li&gt;
&lt;li&gt;スクリプトにコマンドを記述する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ちなみに上で書いたScript Commandのスクリプトは以下のような感じである。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Required parameters:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.schemaVersion 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.title single-quote-with-trailing-comma&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.mode fullOutput&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Optional parameters:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.icon 🤖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.needsConfirmation true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Documentation:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.description single-quote-with-trailing-comma&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.author oinume&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.authorURL https://github.com/oinume&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pbpaste &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; perl -pe &lt;span class=&#34;s2&#34;&gt;&amp;#34;s/.*/&amp;#39;\$&amp;amp;&amp;#39;,/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;作成したscript-commandを呼び出す&#34;&gt;作成したScript Commandを呼び出す&lt;/h2&gt;
&lt;p&gt;あとはRaycastから作成した&lt;code&gt;single-quote-with-trailing-comma&lt;/code&gt;を呼び出すだけである。以下の動画ではsingle-quote-with-trailing-commaによって生成された出力をクリップボードにコピーしている。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>GraphQL Codegenで自動生成されたファイルでNamed export &#39;gql&#39; not foundのビルドエラーを回避する</title>
      <link>https://blog-lampetty-net.web.app/posts/avoid-gql-not-found/</link>
      <pubDate>Thu, 10 Apr 2025 08:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/avoid-gql-not-found/</guid>
      <description>
        
          
            &lt;p&gt;Vite + Apollo Client + GraphQL Codegenの組み合わせでgraphql-codegenを実行すると、&lt;code&gt;gql&lt;/code&gt;関数を以下のようにimportするためにエラーが出る。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import { gql } from &amp;#39;@apollo/client&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vite&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Named&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;gql&amp;#39;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;The&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requested&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;@apollo/client&amp;#39;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CommonJS&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;which&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;may&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;support&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;all&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exports&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;named&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exports&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;CommonJS&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;modules&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;can&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;be&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;imported&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;via&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;example&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;using&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pkg&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;@apollo/client&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gql&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pkg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解決方法としては graphql-codegenの設定ファイルに&lt;a href=&#34;https://the-guild.dev/graphql/codegen/plugins/typescript/typescript-apollo-next#gqlimport&#34;&gt;gqlImport&lt;/a&gt;の設定を追加して再度コード生成する。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;CodegenConfig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;generates&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;gqlImport&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;@apollo/client/core#gql&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そうすると &lt;code&gt;import { gql } from &#39;@apollo/client/core&#39;;&lt;/code&gt; が生成されるのでビルドエラーが回避できた 🎉&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>PostgreSQL &#43; HasuraでUUID v7を生成できるようにする</title>
      <link>https://blog-lampetty-net.web.app/posts/define-uuid-v7-function-in-hasura/</link>
      <pubDate>Sat, 01 Mar 2025 12:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/define-uuid-v7-function-in-hasura/</guid>
      <description>
        
          
            &lt;p&gt;2024年に&lt;a href=&#34;https://datatracker.ietf.org/doc/rfc9562/&#34;&gt;RFC 9562&lt;/a&gt;としてUUID v7が標準化された。今までは主キーにUUID v4を使っていたけど、時間軸でソートできるUUID v7を使いたいと思ったのでメモ。&lt;/p&gt;
&lt;p&gt;簡単に書くとPostgreSQLでUUID v7形式のUUIDを生成するには以下を行えば実現できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PostgreSQLには&lt;a href=&#34;https://www.postgresql.org/docs/current/datatype-uuid.html&#34;&gt;UUID型&lt;/a&gt;が標準装備されているのでこれを使用する&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Betterment/postgresql-uuid-generate-v7&#34;&gt;postgres-uuid-generate-v7&lt;/a&gt;にあるUUID v7を生成するFUNCTIONを定義する&lt;/li&gt;
&lt;li&gt;カラムを &lt;code&gt;&amp;quot;id&amp;quot; uuid NOT NULL DEFAULT uuid_generate_v7()&lt;/code&gt; のように定義する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記を踏まえてHasura consoleでUUID v7のFUNCTIONを定義して使えるようにするには、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;consoleからであれば&lt;code&gt;DATA&lt;/code&gt;タブの&lt;code&gt;SQL&lt;/code&gt;を選択&lt;/li&gt;
&lt;li&gt;エディター部分にpostgres-uuid-generate-v7リポジトリの&lt;code&gt;uuid_generate_v7.sql&lt;/code&gt;の中身をそのままコピペ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;This is a migration&lt;/code&gt; にチェックを入れてMigration nameに適当な名前をつける&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;をやれば良い(以下スクショ参照)&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>IntelliJ IDEAでよく使うショートカットキーをVSCodeでも使えるようにする</title>
      <link>https://blog-lampetty-net.web.app/posts/keymap-of-intellij-and-vscode/</link>
      <pubDate>Fri, 21 Feb 2025 08:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/keymap-of-intellij-and-vscode/</guid>
      <description>
        
          
            &lt;p&gt;コードを書くためのエディタとして、IntelliJ IDEAとVSCode(Cursor)を併用して使っている。そのため、この2つのエディタのショートカットキーを同じように設定したい。&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=k--kato.intellij-idea-keybindings&#34;&gt;IntelliJ IDEA Keybindings&lt;/a&gt;を過去に使ったのだが、自分が想定してないキーも変更されてしまって使いづらいと感じたので、自分でキーバインドをカスタマイズすることにした。&lt;/p&gt;
&lt;p&gt;ちなみにここで紹介する技はもちろんIntelliJ IDEAのみではなく、GoLand, PHPStorm, PyCharm, WebStormなどでもできる。&lt;/p&gt;
&lt;h2 id=&#34;1-intellij-ideaでよく使っている機能とショートカットキーを調べる&#34;&gt;1. IntelliJ IDEAでよく使っている機能とショートカットキーを調べる&lt;/h2&gt;
&lt;p&gt;まず、IntelliJで自分がよく使っているキーを把握するために、Help -&amp;gt; My Productivityで&lt;code&gt;Productivity Guide&lt;/code&gt;を開く。そうすると以下のような画面が出るので、&lt;code&gt;Used&lt;/code&gt;の列でソートして使用頻度の高い機能名とショートカットキーを調べておく。&lt;/p&gt;
&lt;h2 id=&#34;2-vscode側の機能名を調べる&#34;&gt;2. VSCode側の機能名を調べる&lt;/h2&gt;
&lt;p&gt;次に、1.で調べた機能名に対するVSCodeの機能名をChatGPTなどの生成AIを使って調べる。プロンプトは以下のような感じ。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;以下のIntelliJ IDEAの機能名に対するVSCodeの機能名(英語)を教えてください。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Search Everywhere
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Go to declaration
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Go to Implementation(s)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;(以下略)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://www.perplexity.ai/search/yi-xia-nointellij-ideanoji-nen-90JBt.p0QZ2kE_P7w0M_Dw&#34;&gt;www.perplexity.ai&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;3-vscodeのkeybindingを変更する&#34;&gt;3. VSCodeのKeybindingを変更する&lt;/h2&gt;
&lt;p&gt;コマンドパレットから&lt;code&gt;Open Keyboard Shortcuts&lt;/code&gt;を開き、2.で調べた機能名に合致するCommandを調べて、IntelliJ IDEAと同じショートカットキーを登録する。生成されるkeybindings.jsonはこんな感じ。このファイルはmacOSだと &lt;code&gt;~/Library/Application Support/Code/User/keybindings.json&lt;/code&gt;に保存されているので、このファイルをGitHubなどでバージョン管理しておくと良い。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;// Place your key bindings in this file to override the defaults
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;ctrl+d&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-workbench.action.debug.run&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;debuggersAvailable &amp;amp;&amp;amp; !inDebugMode &amp;amp;&amp;amp; !terminalFocus&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;cmd+b&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.revealDefinition&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasDefinitionProvider &amp;amp;&amp;amp; editorTextFocus&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;f12&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.revealDefinition&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasDefinitionProvider &amp;amp;&amp;amp; editorTextFocus&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;alt+cmd+b&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.goToImplementation&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasImplementationProvider &amp;amp;&amp;amp; editorTextFocus&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;cmd+f12&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.goToImplementation&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasImplementationProvider &amp;amp;&amp;amp; editorTextFocus&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;cmd+r&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.startFindReplaceAction&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorFocus || editorIsOpen&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;alt+cmd+f&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.startFindReplaceAction&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorFocus || editorIsOpen&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;shift+f6&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.rename&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasRenameProvider &amp;amp;&amp;amp; editorTextFocus &amp;amp;&amp;amp; !editorReadonly&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;f2&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.rename&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasRenameProvider &amp;amp;&amp;amp; editorTextFocus &amp;amp;&amp;amp; !editorReadonly&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;f1&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.showDefinitionPreviewHover&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;ctrl+alt+h&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;references-view.showCallHierarchy&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasCallHierarchyProvider&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;shift+alt+h&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-references-view.showCallHierarchy&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasCallHierarchyProvider&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;alt+f7&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;references-view.findReferences&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasReferenceProvider&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;shift+alt+f12&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-references-view.findReferences&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasReferenceProvider&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;f2&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.marker.next&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorFocus&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;alt+f8&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.marker.next&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorFocus&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここまで書いて、こんな回りくどいことをしなくとも、1.で調べた機能名とショートカットキーからVSCodeのkeybindings.json(キーバインドの設定ファイル)を生成AIに生成してもらえばいいことに気づいたw&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Cursorで開いているファイルをIntelliJ IDEAで開く</title>
      <link>https://blog-lampetty-net.web.app/posts/open-cursor-current-file-with-intellij/</link>
      <pubDate>Thu, 13 Feb 2025 18:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/open-cursor-current-file-with-intellij/</guid>
      <description>
        
          
            &lt;p&gt;最近Cursorを使い始めているのだけど、ガッツリコードを書きたい時はIntelliJに頼ることもまだ多い。なので、Cursorでユーザータスクを定義して、Cmd + Shift + p でコマンドパレットを開いて &lt;code&gt;Tasks: Run Task&lt;/code&gt; でIntelliJでそのファイルを開けるようにした。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Tasks: Open User Tasks&lt;/code&gt; で以下のタスクの定義を記述する。(macOSの場合、このファイルは &lt;code&gt;~/Library/Application Support/Cursor/User/tasks.json&lt;/code&gt; に保存される)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;version&amp;#34;: &amp;#34;2.0.0&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;tasks&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;label&amp;#34;: &amp;#34;Open Current File with IntelliJ IDEA&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;shell&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;command&amp;#34;: &amp;#34;idea&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;args&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &amp;#34;${file}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;group&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &amp;#34;kind&amp;#34;: &amp;#34;build&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &amp;#34;isDefault&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &amp;#34;problemMatcher&amp;#34;: []
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考: &lt;a href=&#34;https://code.visualstudio.com/docs/editor/tasks&#34;&gt;https://code.visualstudio.com/docs/editor/tasks&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ここからアフィリエイト広告&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0CRV56KVH?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;figure&gt;
  &lt;picture&gt;

    
      
        
        
        
        
        
        
    &lt;img
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;
      alt=&#34;改訂新版 Visual Studio Code実践ガイド —— 定番コードエディタを使い倒すテクニック&#34;
      
        class=&#34;image_figure image_external image_processed&#34;
        width=&#34;352&#34;
        height=&#34;500&#34;
        src=&#34;https://blog-lampetty-net.web.app/41-9rw&amp;#43;zpHL._SL500__13727496644039520558.jpg&#34;
      
      
        title=&#34;改訂新版 Visual Studio Code実践ガイド —— 定番コードエディタを使い倒すテクニック&#34;
      
    /&gt;

    &lt;figcaption class=&#34;caption_figure caption_external&#34;&gt;改訂新版 Visual Studio Code実践ガイド —— 定番コードエディタを使い倒すテクニック&lt;/figcaption&gt;&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>2024年の振り返りと2025年</title>
      <link>https://blog-lampetty-net.web.app/posts/2024-and-2025/</link>
      <pubDate>Sat, 04 Jan 2025 11:33:07 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/2024-and-2025/</guid>
      <description>
        
          
            &lt;p&gt;年末年始はハワイに行っていたので全く正月感がない感じで過ごしてしまった。1年の振り返りをしたり新年の抱負を書いたりしてもどうせ達成できないし、徒然なるままに生きたい人間なのだけれども、暇なので雑に振り返りと今年への意気込みをアウトプットしておく。&lt;/p&gt;
&lt;h2 id=&#34;ライブ&#34;&gt;ライブ&lt;/h2&gt;
&lt;p&gt;2024年は合計9本のライブに行った。ハイライトは5年ぶりにサマソニに行ってManeskinが好きになったこと。あとはThe Bonez x Dragon AshのStraigh Upが、久しぶりにライブで酸欠になるぐらい激しくて久しぶりにライブで死を感じた。ずっとミクスチャーをやっている2つのバンドが対バンするとこんなにエネルギーが湧き出てくるのかというぐらいの熱気だった。12/30の追加公演ではPABLOも参戦してPTPの曲もやったようで本当に本当に行きたかった...!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Straight Up Tour Extra🔥&lt;br&gt;
at Zepp Haneda&lt;/p&gt;
&lt;p&gt;photo by &lt;a href=&#34;https://twitter.com/YSZ_PHOTO?ref_src=twsrc%5Etfw&#34;&gt;@YSZ_PHOTO&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/StraightUp?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#StraightUp&lt;/a&gt;&lt;a href=&#34;https://twitter.com/hashtag/DragonAsh?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#DragonAsh&lt;/a&gt;&lt;a href=&#34;https://twitter.com/hashtag/TheBONEZ?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#TheBONEZ&lt;/a&gt; &lt;a href=&#34;https://t.co/LGO1sL1Z03&#34;&gt;pic.twitter.com/LGO1sL1Z03&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— DA＿OFFICIAL (@Dragon_Ash) &lt;a href=&#34;https://twitter.com/Dragon_Ash/status/1874042558579695970?ref_src=twsrc%5Etfw&#34;&gt;December 31, 2024&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;あと12月にKORNのライブがオーストラリアであって行こうかどうかとても悩んだけど金銭的な理由で断念した。来年こそは日本に来てくれないかなと祈っている。&lt;/p&gt;
&lt;p&gt;(以下は今年に参戦したライブとフェスの一覧)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1/21: マサラーフェース2024&lt;/li&gt;
&lt;li&gt;3/17: PUNK SPRING 2024&lt;/li&gt;
&lt;li&gt;3/31: Dragon Ash x SHANK&lt;/li&gt;
&lt;li&gt;4/6: The Ravens&lt;/li&gt;
&lt;li&gt;7/18: TMC at CLUB CITTA&lt;/li&gt;
&lt;li&gt;8/7: SUMMER SONIC&lt;/li&gt;
&lt;li&gt;11/10: The BONEZ x Dragon Ash Straight Up Tour&lt;/li&gt;
&lt;li&gt;11/30: ビクターロック祭り2024&lt;/li&gt;
&lt;li&gt;12/8: REDLINE ALL THE FINAL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;仕事&#34;&gt;仕事&lt;/h2&gt;
&lt;p&gt;特筆することはないけど、生成AIのおかげでコードを書くモチベーションが激減したので、自分で手を動かすような機会が減った。つまりMTGと目の前の課題をひたすらやっつけることをしている。「BackendなんてHasura使えばいいんでないの？」と思っている人間なので、Backendの開発に楽しみが見い出せなくなっている。&lt;/p&gt;
&lt;p&gt;事業ドメイン的には楽しい領域なので、ビジネス的に成長していればそれでよし。&lt;/p&gt;
&lt;h2 id=&#34;その他&#34;&gt;その他&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今年からAudible始めたので読書が捗った&lt;/li&gt;
&lt;li&gt;Audibleと併せてウォーキングを始めたので体重が2.5kg減った&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2025年に向けて&#34;&gt;2025年に向けて&lt;/h2&gt;
&lt;p&gt;今年は趣味プロダクトで作りたいアプリがあるので、なんとしても今年中に完成してリリースしたい。ライブは10回は行きたいけど行けるかなぁ。2024年は勉強会にほとんど参加せず技術的なことに興味を失いつつあるので、今年はもう少し参加したい。サマソニは観たいバンドがなくても行くべきだと昨年痛感したので、今年も行きたい。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>2024年に買ってよかったもの</title>
      <link>https://blog-lampetty-net.web.app/posts/good-items-in-2024/</link>
      <pubDate>Sat, 04 Jan 2025 10:59:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/good-items-in-2024/</guid>
      <description>
        
          
            &lt;p&gt;あまりものを買わない主義なのだけど、ささやかながら買ってよかったものを。(Amazonのリンクはアフィリエイトが入ってる)&lt;/p&gt;
&lt;h2 id=&#34;ニューバランス-インソール-サポーティブリバウンドインソール&#34;&gt;[ニューバランス] インソール サポーティブリバウンドインソール&lt;/h2&gt;
&lt;p&gt;1年以上履いていたニューバランスのスニーカーのインソールがボロボロになったのでこれに入れ替えてみた。そしたらなんとびっくり、クッション効果が凄くて歩くのが大変快適になりQoLが爆上がりした。2000円弱の投資でここまで快適になるのならとてもコスパ良いと思う。なんだかんだでスニーカーは毎日履くものだし。とにかく快適すぎるので他のニューバランスのスニーカーも全部このインソールに替えた。デフォルトでこれを搭載してほしい&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09Z99DMYN?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;figure&gt;
  &lt;picture&gt;

    
      
        
        
        
        
        
        
    &lt;img
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;
      alt=&#34;[ニューバランス] インソール サポーティブリバウンドインソール (RCP280 / LAM35689) 中敷き インサート LAM35689 GR(新) medium&#34;
      
        class=&#34;image_figure image_external image_processed&#34;
        width=&#34;500&#34;
        height=&#34;500&#34;
        src=&#34;https://blog-lampetty-net.web.app/416C9Bl4lyL._SL500__7019612520032948035.jpg&#34;
      
      
        title=&#34;[ニューバランス] インソール サポーティブリバウンドインソール (RCP280 / LAM35689) 中敷き インサート LAM35689 GR(新) medium&#34;
      
    /&gt;

    &lt;figcaption class=&#34;caption_figure caption_external&#34;&gt;[ニューバランス] インソール サポーティブリバウンドインソール (RCP280 / LAM35689) 中敷き インサート LAM35689 GR(新) medium&lt;/figcaption&gt;&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09Z99DMYN?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;[ニューバランス] インソール サポーティブリバウンドインソール (RCP280 / LAM35689) 中敷き インサート LAM35689 GR(新) medium&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;new balance(ニューバランス)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09Z99DMYN?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;anker-511-charger-nano-3-30w-充電器-usb-c&#34;&gt;Anker 511 Charger (Nano 3, 30W) (充電器 USB-C)&lt;/h2&gt;
&lt;p&gt;常にPCを持ち歩いているため充電器も持ち運ぶ必要があり購入。元々は65Wのもの(150g)を持ち歩いていたのだけど、こっちは40gと超軽量なので買い換えた。100g減るだけでも持ち運び時の腰への負担が減るのでQoLが上がった。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0B2QR8HN9?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;figure&gt;
  &lt;picture&gt;

    
      
        
        
        
        
        
        
    &lt;img
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;
      alt=&#34;Anker 511 Charger (Nano 3, 30W) (充電器 USB-C)【USB PD 対応/PSE技術基準適合/PPS規格対応】MacBook Windows PC iPad iPhone Galaxy Android スマートフォン ノートPC 各種 その他機器対応 (ホワイト)&#34;
      
        class=&#34;image_figure image_external image_processed&#34;
        width=&#34;400&#34;
        height=&#34;500&#34;
        src=&#34;https://blog-lampetty-net.web.app/31V3jY6sgqL._SL500__12145101310356914912.jpg&#34;
      
      
        title=&#34;Anker 511 Charger (Nano 3, 30W) (充電器 USB-C)【USB PD 対応/PSE技術基準適合/PPS規格対応】MacBook Windows PC iPad iPhone Galaxy Android スマートフォン ノートPC 各種 その他機器対応 (ホワイト)&#34;
      
    /&gt;

    &lt;figcaption class=&#34;caption_figure caption_external&#34;&gt;Anker 511 Charger (Nano 3, 30W) (充電器 USB-C)【USB PD 対応/PSE技術基準適合/PPS規格対応】MacBook Windows PC iPad iPhone Galaxy Android スマートフォン ノートPC 各種 その他機器対応 (ホワイト)&lt;/figcaption&gt;&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>OCNモバイルONEからmineoにMNPした</title>
      <link>https://blog-lampetty-net.web.app/posts/ocn-to-mineo/</link>
      <pubDate>Sat, 30 Nov 2024 16:25:29 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/ocn-to-mineo/</guid>
      <description>
        
          
            &lt;p&gt;最近ドコモ回線があまりにも詰まったり繋がらなかったりすることが多くてどうにも我慢できなくなったことと、たまたまmineoがキャンペーンをやっていてコストダウンできそうなので勢いでmineoに乗り換えた。後悔は全くしていない。&lt;/p&gt;
&lt;p&gt;数ヶ月前まではドコモ回線がつながりにくいこと以外はOCNは特に不満もなく、Musicカウントフリーオプションの存在もあり3年ほど使っていた。ただ、最近は新規契約を停止していてirumoという改悪されたMVNOに軸足を移す流れがあるのと、その影響でOCNモバイルONE自体がもう改善されないリビングデッド状態になっていたので、緩く乗り換え先を探していた。&lt;/p&gt;
&lt;p&gt;mineoにしようと思ったのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.5Mbpsなら使い放題のオプションがある&lt;/li&gt;
&lt;li&gt;ドコモ以外の回線も選べる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という点で、実際乗り換えてみてよかったと思った。それ以外にも通話系のオプションが充実してたり、ギガを永遠に貯められるオプションなどユニークなオプションがあっていいなと思う。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Audibleにハマったのでオススメする記事</title>
      <link>https://blog-lampetty-net.web.app/posts/audible/</link>
      <pubDate>Tue, 17 Sep 2024 08:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/audible/</guid>
      <description>
        
          
            &lt;p&gt;AmazonでAudibleが3ヶ月無料キャンペーンをやっていたので試しに使ってみたところ、かなり自分のツボに刺さったので良いポイントをまとめてみた。&lt;/p&gt;
&lt;h2 id=&#34;自分的にaudibleが刺さったポイント&#34;&gt;自分的にAudibleが刺さったポイント&lt;/h2&gt;
&lt;p&gt;「本を読みたいけど時間がない...」というのが、Audibleに出会う前の自分だった。いや、正確には「読書したいけどスマホのKindleで読んでいると気付いたら他のことをしている」というのが実態だった。Audibleであれば、ウォーキング中や通勤時間などのスキマ時間に「耳」から本の内容をインプットできるので、「気付いたらスマホで違うことをしていた」ということが起きにくい。そのため、Audibleで本を聴くようになってから圧倒的に読書習慣が根付いた。&lt;/p&gt;
&lt;h2 id=&#34;豊富なコンテンツ&#34;&gt;豊富なコンテンツ&lt;/h2&gt;
&lt;p&gt;詳しくは &lt;a href=&#34;https://www.audible.co.jp/&#34;&gt;Audibleのサイト&lt;/a&gt; を見てもらうとして、対象の書籍の幅の多さに驚く。たとえば小説であれば、「三体」「プロジェクトヘイルメアリー」などヒットしたものは大体あるイメージ。ビジネス書も「イシューからはじめよ」「コンサル一年目が学ぶこと」などそれなりのラインナップがある。&lt;/p&gt;
&lt;p&gt;もともと自分はウォーキング中にはPodcastを聴いていたのだけど、あまり興味のあるPodcastもなく惰性で聴いていた。Audibleであれば書籍が対象なので得られる情報の質がPodcastに比べて高いし、密度が濃いと感じる。&lt;/p&gt;
&lt;p&gt;なお、Audibleは本の内容を人間が読み上げているため、小説だと「その声じゃないんだよなぁ」と思うこともあるがこれはしょうがない。&lt;/p&gt;
&lt;h2 id=&#34;audibleアプリのクオリティが高い&#34;&gt;Audibleアプリのクオリティが高い&lt;/h2&gt;
&lt;p&gt;Audibleアプリは、単純にただのAudiobookよりさらに良い体験を提供していると思っている。具体的には、再生速度が0.05刻みで細かく調節できるのと、クリップ＆メモ機能が便利だ。&lt;/p&gt;
&lt;p&gt;クリップ機能は、読まれている本の位置を保存する機能でいわゆるしおりみたいなもの。クリップしておいた場所に後からジャンプできるのと、そのクリップに対して自分用のメモを保存することができる。メモをする場合は自動で再生が止まるようになっているのも気が利いていて良い。&lt;/p&gt;
&lt;h2 id=&#34;月1500円で聴き放題&#34;&gt;月1500円で聴き放題&lt;/h2&gt;
&lt;p&gt;中には別途お金を払う必要がある本もあるが、大体のものは1500円で聴けるので、聴いてみて「これはイマイチだな」と思ったらやめればいいし、逆に気に入ったら書籍を購入するのも良い。本屋での立ち読み感覚で色々聴くことができるのがグッド。&lt;/p&gt;
&lt;h2 id=&#34;目にやさしい&#34;&gt;目にやさしい&lt;/h2&gt;
&lt;p&gt;Audibleを再生している間はなるべくスマホは見ないで外界を見るようにしている。本を読んでいるとどうしても目が疲れてしまう問題があるけど、Audibleではスマホさえ見なければ目は疲れない。&lt;/p&gt;
&lt;h2 id=&#34;イマイチな点&#34;&gt;イマイチな点&lt;/h2&gt;
&lt;p&gt;再生速度を2倍にするなどして速度を上げることでカバーできるが、書籍を読む速読に比べると遅いという問題はある。あと上で書いたように小説はナレーターの声が自分のイメージと違うことが多いので、Audibleで聴くには向かないかもしれない。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;「Amazonから金でももらっているのか？」というような記事になってしまったけど、Audibleは自分の読書週間を大幅に改善してくれたプロダクトなのでオススメ記事を勢いで書いた。以前Audibleを試して「コンテンツが少ない」と思って使わなくなった人ももう1回見てみるといいかも。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Go言語でcodemod</title>
      <link>https://blog-lampetty-net.web.app/posts/codemod-in-go/</link>
      <pubDate>Tue, 13 Aug 2024 08:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/codemod-in-go/</guid>
      <description>
        
          
            &lt;p&gt;大規模なコードベースでリファクタリングを省エネ化するためにcodemodを最近調べていて、軽く試行錯誤したのでそのメモ。&lt;/p&gt;
&lt;h2 id=&#34;やりたいこと&#34;&gt;やりたいこと&lt;/h2&gt;
&lt;p&gt;例えば以下のようなTable Driven TestなコードをBEFOREからAFTERに書き換えたい。コード量が多いため人間がやるのは現実的ではなく、codemodで機械的に書き換えたい。&lt;/p&gt;
&lt;p&gt;BEFORE&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;slices&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;testing&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestContains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;bool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;empty: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;found: true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;not found: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;contains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;want&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;contains(): want=%v, got=%v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;contains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;slices&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Contains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;AFTER&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestContains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;bool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;empty: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DIFF&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Markdown Style Guide</title>
      <link>https://blog-lampetty-net.web.app/posts/markdown-style-guide/</link>
      <pubDate>Wed, 19 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/markdown-style-guide/</guid>
      <description>
        
          
            &lt;p&gt;Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.&lt;/p&gt;
&lt;h2 id=&#34;headings&#34;&gt;Headings&lt;/h2&gt;
&lt;p&gt;The following HTML &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;—&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; elements represent six levels of section headings. &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; is the highest section level while &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; is the lowest.&lt;/p&gt;
&lt;h1 id=&#34;h1&#34;&gt;H1&lt;/h1&gt;
&lt;h2 id=&#34;h2&#34;&gt;H2&lt;/h2&gt;
&lt;h3 id=&#34;h3&#34;&gt;H3&lt;/h3&gt;
&lt;h4 id=&#34;h4&#34;&gt;H4&lt;/h4&gt;
&lt;h5 id=&#34;h5&#34;&gt;H5&lt;/h5&gt;
&lt;h6 id=&#34;h6&#34;&gt;H6&lt;/h6&gt;
&lt;h2 id=&#34;paragraph&#34;&gt;Paragraph&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Raycastを使い始めて1年経った</title>
      <link>https://blog-lampetty-net.web.app/posts/raycast-one-year-later/</link>
      <pubDate>Mon, 08 Jan 2024 08:30:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/raycast-one-year-later/</guid>
      <description>
        
          
            &lt;p&gt;Raycastを使い始めて1年経ったので、どういうことに使っているかを振り返ってみる。去年書いた &lt;a href=&#34;https://journal.lampetty.net/entry/alfred-to-raycast&#34;&gt;AlfredからRaycastに移行した - oinume journal&lt;/a&gt; の記事から少し使い方が変わっているところもあるのでメモがてら。&lt;/p&gt;
&lt;h2 id=&#34;基本的な使い方&#34;&gt;基本的な使い方&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Q&lt;/code&gt;をRaycast起動のショートカットとして割り当てている。Pro版は使っていないのでAI機能などは使ったことがない。&lt;/li&gt;
&lt;li&gt;ブラウザのブックマーク検索など、よく使うけどHotKeyを割り当てるほどでもないRaycastコマンドは&lt;code&gt;bm&lt;/code&gt;のようにAliasを設定している。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Q&lt;/code&gt;でRaycastを起動して&lt;code&gt;bm&lt;/code&gt;と入力するとブックマークの検索ができるので楽ちん&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;アプリケーションランチャー機能&#34;&gt;アプリケーションランチャー機能&lt;/h2&gt;
&lt;p&gt;アプリケーションを起動するときのランチャーとして使っている。よく使うアプリにはHot Key(ショートカット)を割り当ててる。&lt;/p&gt;
&lt;h2 id=&#34;clipboard-history&#34;&gt;Clipboard History&lt;/h2&gt;
&lt;p&gt;クリップボードの履歴を溜めておいて、後から検索してペーストできる機能。&lt;code&gt;Ctrl + Cmd + C&lt;/code&gt;をHotKeyとして割り当てて瞬時に起動できるようにしている。&lt;/p&gt;
&lt;h2 id=&#34;絵文字検索&#34;&gt;絵文字検索&lt;/h2&gt;
&lt;p&gt;正確にはSearch Emoji &amp;amp; Symbolsという機能。これが地味に便利な機能で、こんな感じで英語で絵文字を検索して選択するとクリップボードにコピーされるのですぐにペーストできる。&lt;/p&gt;
&lt;h2 id=&#34;スクリーンショットの検索クリップボードへのコピーslackやgithubへ貼り付け&#34;&gt;スクリーンショットの検索＆クリップボードへのコピー＆SlackやGitHubへ貼り付け&lt;/h2&gt;
&lt;p&gt;これも便利な機能で、以下のような流れで使うのだけど、スクショを貼り付けるのがキーボード操作だけでできるようになる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スクリーンショットを撮った後にRaycastを起動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;screenshot&lt;/code&gt;で検索して機能を起動して、スクショをサムネイルで検索して選択&lt;/li&gt;
&lt;li&gt;するとクリップボードにスクショがコピーされるので、SlackやGitHubなどにペーストするとスクショが貼り付けられる。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ブラウザのブックマーク検索&#34;&gt;ブラウザのブックマーク検索&lt;/h2&gt;
&lt;p&gt;正式名称はSearch Browser Bookmarks。ブラウザのブックマークを検索することができる。SafariとChromeがある場合は、Cmd + Kで&lt;code&gt;Select Browsers&lt;/code&gt;を選ぶと対象のブラウザを選択することができる(Safari, Chromeの両方を対象にすることも可能)。&lt;/p&gt;
&lt;h2 id=&#34;開いているウィンドウの検索切り替え&#34;&gt;開いているウィンドウの検索・切り替え&lt;/h2&gt;
&lt;p&gt;正式名称はSwitch Windows。今開いているウィンドウをfuzzy検索できる。自分はIntelliJ IDEAを使っていてたくさんウィンドウを開いているので、これで検索してウィンドウを切り替えることが多い。&lt;code&gt;Ctrl + Cmd + S&lt;/code&gt;をHotKeyとして割り当てている。&lt;/p&gt;
&lt;h2 id=&#34;chromeの履歴検索&#34;&gt;Chromeの履歴検索&lt;/h2&gt;
&lt;p&gt;「あの閉じてしまったタブをもう1回開きたいなぁ」という時に意外と重宝するのがChromeの履歴検索である。&lt;a href=&#34;https://www.raycast.com/Codely/google-chrome&#34;&gt;Chrome Extension&lt;/a&gt;をインストールすると使えるようになる。&lt;/p&gt;
&lt;h2 id=&#34;使わなくなった機能&#34;&gt;使わなくなった機能&lt;/h2&gt;
&lt;p&gt;最初便利だなと思っていたけど使わなくなった機能もある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quicklink: ブラウザのブックマークで十分だと感じた&lt;/li&gt;
&lt;li&gt;カレンダー連携(My Schedule): ChromeでGoogleカレンダーを固定タブで開いているのでRaycastから飛べなくてもいいかなと思った。あと、MacのカレンダーとGoogle Calendarを連携するのが嫌になったというのもある。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;raycastの使いこなせていない機能&#34;&gt;Raycastの使いこなせていない機能&lt;/h2&gt;
&lt;p&gt;Raycast便利に使っているけど、Script CommandsやExtensionを作れるほどのレベルにはなっていないので、今年はそれらに挑戦してみたい。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>HasuraをDokku上で動かす</title>
      <link>https://blog-lampetty-net.web.app/posts/hasura-on-dokku/</link>
      <pubDate>Sat, 30 Dec 2023 15:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/hasura-on-dokku/</guid>
      <description>
        
          
            &lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/install-dokku-on-vps&#34;&gt;VPS上にDokkuを構築した&lt;/a&gt;ので、そこに&lt;a href=&#34;https://hasura.io/&#34;&gt;Hasura&lt;/a&gt;を動かしてみるテスト。Hasuraとは簡単に言うとPostgreSQLのテーブルスキーマからGraphQLサーバーを構築してくれるミドルウェア。&lt;/p&gt;
&lt;p&gt;前提として、Dokkuはすでに構築済みとする。(自分の場合はUbuntu 22.04 上にDokku 0.32.3を構築済み)&lt;/p&gt;
&lt;h2 id=&#34;手順&#34;&gt;手順&lt;/h2&gt;
&lt;p&gt;まずは最初に&lt;code&gt;hasura&lt;/code&gt;という名前のアプリケーションを作成する&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dokku apps:create hasura
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、HasuraのためのPostgreSQL databaseを建てる。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dokku postgres:create hasura-db
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Waiting &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; container to be ready
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Creating container database
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Securing connection to &lt;span class=&#34;nv&#34;&gt;database&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt;&amp;gt; Postgres container created: hasura-db
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt;&amp;gt; hasura-db postgres service information
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Config dir:          /var/lib/dokku/services/postgres/hasura-db/data
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Config options:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Data dir:            /var/lib/dokku/services/postgres/hasura-db/data
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Dsn:                 postgres://postgres:&amp;lt;redacted&amp;gt;@dokku-postgres-hasura-db:5432/hasura_db
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Exposed ports:       -
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Id:                  272a6f8b722310887317b3d7e10821ed3cfcc88dae7911945c10590be338c09c
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Internal ip:         172.17.0.4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Initial network:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Links:               -
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Post create network:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Post start network:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Service root:        /var/lib/dokku/services/postgres/hasura-db
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Status:              running
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Version:             postgres:15.4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上で構築したhasura-dbをhasuraアプリケーションにリンクする。ただし、この時点ではまだ&lt;code&gt;hasura&lt;/code&gt;はアプリケーションの設定がされていないので&lt;code&gt;App image (dokku/hasura:latest) not found&lt;/code&gt;のエラーが出るけどOK。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>squash mergeの環境でCascading PRsでコンフリクトした時</title>
      <link>https://blog-lampetty-net.web.app/posts/resolve-squash-merge-conflict/</link>
      <pubDate>Mon, 04 Dec 2023 09:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/resolve-squash-merge-conflict/</guid>
      <description>
        
          
            &lt;p&gt;最近以下のような記事を目にすることがあり、ちょうど自分もsquash mergeの環境でひとつ問題を抱えていたので、その話を自分のメモ代わりに書きたくなった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://tech.mobilefactory.jp/entry/2023/11/29/160000&#34;&gt;Git の Squash マージをやめた話 - Mobile Factory Tech Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wp.jmuk.org/2023/11/30/squash-and-merge%E3%81%97%E3%81%8B%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%84%E3%81%91%E3%81%A9%E5%85%A8%E3%81%8F%E5%9B%B0%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%84/&#34;&gt;squash and mergeしか使ってないけど全く困ってない – Jun Mukai&#39;s blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;問題とは、上にある記事の&lt;code&gt;cascading PRs&lt;/code&gt;の話で、feature1 -&amp;gt; feature2 というようにbranchを派生して作った場合に、feature1 をmainにマージした後に作業ブランチを feature2 にして git rebase main すると、必ずコンフリクトが発生するので悩んでいた、ということ。&lt;/p&gt;
&lt;p&gt;解決策としては、以下にあるように&lt;code&gt;git rebase --onto main &amp;lt;last commit on feature1&amp;gt; &amp;lt;feature2 branch&amp;gt;&lt;/code&gt; をすればいい&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/questions/68229841/avoiding-conflicts-in-git-when-merging-a-squashed-commit-from-main-into-feature&#34;&gt;stackoverflow.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;もしくは&lt;a href=&#34;https://wp.jmuk.org/2023/11/30/squash-and-merge%e3%81%97%e3%81%8b%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%aa%e3%81%84%e3%81%91%e3%81%a9%e5%85%a8%e3%81%8f%e5%9b%b0%e3%81%a3%e3%81%a6%e3%81%aa%e3%81%84/&#34;&gt;Jun Mukai&#39;s blog&lt;/a&gt;に書いてあるような以下の方法でもいいのかもしれない。そういえば &lt;code&gt;git rebase --skip&lt;/code&gt; って使ったことなかったな。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PR1に由来するコンフリクトは自分にとっては自明だし、ほとんどの場合にはgit rebase –skipするだけだ。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4774185930?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;figure&gt;
  &lt;picture&gt;

    
      
        
        
        
        
        
        
    &lt;img
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;
      alt=&#34;【改訂新版】Gitポケットリファレンス&#34;
      
        class=&#34;image_figure image_external image_processed&#34;
        width=&#34;340&#34;
        height=&#34;500&#34;
        src=&#34;https://blog-lampetty-net.web.app/516gEDDGmoL._SL500__3171132879597626707.jpg&#34;
      
      
        title=&#34;【改訂新版】Gitポケットリファレンス&#34;
      
    /&gt;

    &lt;figcaption class=&#34;caption_figure caption_external&#34;&gt;【改訂新版】Gitポケットリファレンス&lt;/figcaption&gt;&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4774185930?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;【改訂新版】Gitポケットリファレンス&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;作者:&lt;a href=&#34;https://d.hatena.ne.jp/keyword/%B2%AC%CB%DC%20%CE%B4%BB%CB&#34;&gt;岡本 隆史&lt;/a&gt;,&lt;a href=&#34;https://d.hatena.ne.jp/keyword/%C9%F0%C5%C4%20%B7%F2%C2%C0%CF%BA&#34;&gt;武田 健太郎&lt;/a&gt;,&lt;a href=&#34;https://d.hatena.ne.jp/keyword/%C1%EA%CE%C9%20%B9%AC%C8%CF&#34;&gt;相良 幸範&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;技術評論社&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4774185930?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>VPSにDokkuをインストールする</title>
      <link>https://blog-lampetty-net.web.app/posts/install-dokku-on-vps/</link>
      <pubDate>Sat, 07 Oct 2023 20:10:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/install-dokku-on-vps/</guid>
      <description>
        
          
            &lt;p&gt;VPS上に&lt;a href=&#34;https://dokku.com/&#34;&gt;Dokku&lt;/a&gt;というものをインストールして、Dokku上でHello WorldするRailsアプリを動かすまでのメモ。&lt;/p&gt;
&lt;h2 id=&#34;why-dokku&#34;&gt;Why Dokku?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://dokku.com/&#34;&gt;DokkuのWebサイト&lt;/a&gt;に書いてあるように、Dokkuはオープンソース版のHerokuという立ち位置のソフトウェア。かれこれ7年ぐらいHerokuを使い続けていてとても便利だと思っているのだけど、アプリケーションを1つ動かすのに$5かかるようになってしまった。昨今の円安で750円ぐらいかかるし、アプリを複数作るとなるとそれなりにお金がかかるので、VPSでDokkuを動かしその上でアプリケーションを稼働させるようにしたいと思った。&lt;/p&gt;
&lt;p&gt;また、&lt;a href=&#34;https://web.arena.ne.jp/indigo/&#34;&gt;WebARENA Indigo&lt;/a&gt;のVPSだと、2vCPUでメモリ2GBで税込814円 / 月という安さなので、これを使うとかなりコスト抑えられそうだなと思ったからだった。&lt;/p&gt;
&lt;h2 id=&#34;インストール&#34;&gt;インストール&lt;/h2&gt;
&lt;p&gt;以下の環境にDokku 0.32.3をインストールする。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WebARENA IndigoのVPS(4vCPU, MEM 4GB, SSD 80GB)&lt;/li&gt;
&lt;li&gt;OS: Ubuntu 22.04&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;インストール自体は&lt;a href=&#34;https://dokku.com/docs/getting-started/install/debian/&#34;&gt;Dokkuのドキュメント&lt;/a&gt;の通り、aptを使ってインストールすれば特にハマることはないはず。&lt;/p&gt;
&lt;h2 id=&#34;sshの公開鍵の登録&#34;&gt;SSHの公開鍵の登録&lt;/h2&gt;
&lt;p&gt;アプリケーションのデプロイ時に&lt;code&gt;git push dokku ...&lt;/code&gt;とやる場合、sshの公開鍵が登録されていないと失敗するので、以下のコマンドで登録しておく。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ echo &amp;#39;CONTENTS_OF_ID_RSA_PUB_FILE&amp;#39; | sudo dokku ssh-keys:add admin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ドメインの設定&#34;&gt;ドメインの設定&lt;/h2&gt;
&lt;p&gt;インターネット上にDokkuを使ってアプリケーションを公開するためには、当然ながらドメインが必要なので用意しておく。自分は dokku.lampetty.net をベースドメインにして、これのサブドメインでアプリケーションを公開していくつもりなので、必要な設定をした。&lt;/p&gt;
&lt;p&gt;まず、 &lt;code&gt;domains:report&lt;/code&gt; コマンドで現状のドメインを確認する。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dokku domains:report --global
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt;&amp;gt; Global domains information
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Domains global enabled:        &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Domains global vhosts:         i-xxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Domains global vhosts&lt;/code&gt;はデフォルトではホストマシンのホスト名になっているので、これを以下のコマンドで変更する。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dokku domains:set-global dokku.lampetty.net
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、&lt;code&gt;dokku.lampetty.net&lt;/code&gt; サブドメインがこのVPSのIPアドレスになるようにDNSレコードを定義する。Aレコードの方は別になくてもいいけど、IPとのマッピングは1箇所にしたいのでこうしている。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dokku.lampetty.net A &amp;lt;VPSのIP&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*.dokku.lampetty.net CNAME dokku.lampetty.net
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;digコマンドでDNSレコードを確認して、以下のように返ってくればOK。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>ししまるとしろ</title>
      <link>https://blog-lampetty-net.web.app/posts/shishimaru-and-shiro/</link>
      <pubDate>Sat, 30 Sep 2023 20:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/shishimaru-and-shiro/</guid>
      <description>
        
          
            &lt;p&gt;最近、新しい猫を我が家に迎え入れた。名前は「しろ」。保護猫で年齢は5~6歳。岡山で多頭飼育の崩壊後ゴミ屋敷となった民家から保護された。その後、地元の預かりボランティアのお宅では他の猫と折り合いが悪く、ほぼケージ生活となったため、他に猫のいない家庭に譲渡したいということで東京に移動してきたところで、我が家で迎え入れることになった。&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;picture&gt;

    
      
        
        
        
        
        
        
    &lt;img
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;
      alt=&#34;&#34;
      
        class=&#34;image_figure image_external image_processed&#34;
        width=&#34;1200&#34;
        height=&#34;1035&#34;
        src=&#34;https://blog-lampetty-net.web.app/20230930160943_13933703127750002406.jpg&#34;
      
      
    /&gt;

    &lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;ウチに来て間もない頃のしろ&lt;/p&gt;
&lt;p&gt;しろの話をする前に、このブログやTwitterにも登場していたししまるの話をしなければ、と思っている。ししまるは昨年の12月に虹の橋を渡ってしまった。昨年の夏から肺炎の症状があり投薬などで治療を続けていたが、(おそらく)間質性肺炎という難治性の病気で治ることなく他界してしまった。自分にとってはペットを飼うことが初めてで、当然その死に立ち会うのも初めてだったのでとてつもなく悲しかった。3ヶ月間は毎日ししまるの写真や動画を見ては泣いてしまうという状態が続いていたし、今でも病気で辛そうだったししまるのことを思い出すと泣いてしまう。&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;picture&gt;

    
      
        
        
        
        
        
        
    &lt;img
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;
      alt=&#34;&#34;
      
        class=&#34;image_figure image_external image_processed&#34;
        width=&#34;1200&#34;
        height=&#34;1198&#34;
        src=&#34;https://blog-lampetty-net.web.app/20230930163317_10785404057518471689.jpg&#34;
      
      
    /&gt;

    &lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;ししまる&lt;/p&gt;
&lt;p&gt;その悲しさに一区切りつけられたのは、今年の4月に近所のお寺でペットの合同供養祭に参加したことだと思う。ペットを亡くした飼い主たちがお寺に集まり、お坊さんが供養のお経を唱えて線香をあげるという葬儀。人間と同じように葬儀を行うことで気持ちも少し整理された気がして、その後から「また猫を迎え入れる？」という話を妻とするようになった。そんな中で妻が保護猫のサイトで見つけたのがしろだった。色が白いところや雰囲気がなんとなくししまるに似ている...! ということで、本物を見に行ったところ、体重6.5kgの大きさがししまるっぽく、とてもビビりだけど人懐っこいということで、譲渡の申請＋トライアルで2週間ほどわが家に来てもらうことになった。&lt;/p&gt;
&lt;p&gt;うちに来た当初はずっと机の下に隠れていたけど、2,3日で家の中を探検するようになり、息子含めた全員になでなでをお願いするぐらい懐いていった。ししまるは息子にはあまり甘えなかったので、息子もとても嬉しかったらしい。&lt;/p&gt;
&lt;p&gt;ただ、ここで一つ問題が発生。ししまるの時は全然問題なかったのに、妻と息子の猫アレルギーが発動して、薬を飲まないとアレルギーの症状が抑えられず、「これだと迎え入れるのは厳しいかも」という状況になっていた。ひとまずトライアルを延長して、猫のアレルゲンを減らすキャットフードを試したり、体をまめにふく＆ブラッシングしたりして、なんとか薬を飲まなくても大丈夫な状態にまでなった。一緒に生活していると慣れてきてアレルギーがおさまったりすることもあるそうで、何が効いたのかはいまでもよくわかってないけど、問題が解決したので一旦良しとしている。&lt;/p&gt;
&lt;p&gt;というわけで、無事に9月にしろを正式に迎え入れることができて、また家に猫がいる生活が始まった。白猫のため、黒いシャツを着ているとしろの抜け毛が目立ってしまい頻繁にコロコロをかけないといけないあの生活がまた戻ってきたと思うと、面倒くさいながらちょっとニヤニヤしてしまう。ししまるは家に知らない人がきても興味を持って挨拶していたりしたけど、しろはビビりで引きこもってしまうところなど、さまざまな違いを発見できて面白い。&lt;/p&gt;
&lt;p&gt;ししまる、今まで本当に本当にありがとう。しろ、これからよろしくね。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>Next.js &#43; Auth0でLogin handler failedのエラーを解消する</title>
      <link>https://blog-lampetty-net.web.app/posts/nextjs-auth0-resolve-login-handler-failed/</link>
      <pubDate>Tue, 02 May 2023 08:30:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/nextjs-auth0-resolve-login-handler-failed/</guid>
      <description>
        
          
            &lt;p&gt;Next.js + Auth0で認証機能を実装しようとして、&lt;a href=&#34;https://www.npmjs.com/package/@auth0/nextjs-auth0&#34;&gt;nextjs-auth0&lt;/a&gt;をセットアップしつつ、&lt;a href=&#34;https://auth0.com/docs/quickstart/webapp/nextjs/01-login&#34;&gt;このドキュメント&lt;/a&gt;通りにやっていたら、&lt;code&gt;AUTH0_ISSUER_BASE_URL&lt;/code&gt; の設定を間違えていて以下のエラーが出ていた。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;LoginHandlerError: Login handler failed. CAUSE: Discovery requests failing for http://localhost:3000, expected 200 OK, got: 404 Not Found
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上のauth0のドキュメントでは &lt;code&gt;AUTH0_ISSUER_BASE_URL=&#39;https://{yourDomain}&#39;&lt;/code&gt; との記述だったので、&lt;a href=&#34;http://localhost:3000&#34;&gt;http://localhost:3000&lt;/a&gt;を指定したのだけど、どうやらこれは&lt;code&gt;https://YOUR_AUTH0_DOMAIN.auth0.com&lt;/code&gt;を記述するのが正しいらしい。というわけでAuth0の該当アプリケーションのページから&lt;code&gt;Domain&lt;/code&gt;の部分をコピーしてきて&lt;code&gt;https://oinume.us.auth0.com&lt;/code&gt;のように指定すればOK。というか&lt;a href=&#34;https://www.npmjs.com/package/@auth0/nextjs-auth0&#34;&gt;nextjs-auth0&lt;/a&gt;にはそのように記載されていたのではじめからこっちを読んでおけばよかった...&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>multipassでAnsibleの動作確認用のVMを作る</title>
      <link>https://blog-lampetty-net.web.app/posts/multipass/</link>
      <pubDate>Wed, 12 Apr 2023 09:00:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/multipass/</guid>
      <description>
        
          
            &lt;h2 id=&#34;モチベーション&#34;&gt;モチベーション&lt;/h2&gt;
&lt;p&gt;趣味で開発しているプロダクトのためにVPSを立てていて、Ansibleで各種ミドルウェアの設定をしているんだけど、VirtualBoxのApple Silicon への対応が微妙なのでmultipassを使ってVMを立てる＋Ansible Playbookを流してセットアップするということをやってみたのでそのメモ。&lt;/p&gt;
&lt;h2 id=&#34;multipassでvmを立ち上げる&#34;&gt;multipassでVMを立ち上げる&lt;/h2&gt;
&lt;p&gt;まず初めにssh用の秘密鍵と公開鍵を生成する。multipassでVMを立ち上げるときはデフォルトでSSH用の鍵を生成してくれるけど、Ansibleでsshするときの鍵を作っておく。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-keygen -t rsa -b &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; -C multipass -f multipass
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、以下のようなcloud-init.ymlを作成する。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;users:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - default
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - name: multipass
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    sudo: ALL=(ALL) NOPASSWD:ALL
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ssh_authorized_keys:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - &amp;#34;ssh-rsa &amp;lt;上で生成した公開鍵&amp;gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;multipass launchでVMを立ち上げる時に、&lt;code&gt;--cloud-init&lt;/code&gt; オプションで先ほどのcloud-init.ymlを指定する。これを行うことでmultipassユーザーの authorized_keys に上で作成したSSHの公開鍵がセットされる。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;multipass launch -n vps -c=1 -m=1G -d=5G --cloud-init=cloud-init.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次にVMのIPアドレスを確認する。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;multipass info vps
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Name:           vps
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;State:          Running
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;IPv4:           192.168.64.13
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Release:        Ubuntu 22.04.2 LTS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Image hash:     f6b5b3a980f2 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Ubuntu 22.04 LTS&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CPU&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:         &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Load:           0.20 0.11 0.04
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Disk usage:     1.4GiB out of 4.7GiB
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Memory usage:   151.3MiB out of 962.5MiB
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Mounts:         --
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ansibleのinventoryファイルを以下のようにする。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
    <item>
      <title>whisper.cppで文字起こしをやってみた</title>
      <link>https://blog-lampetty-net.web.app/posts/try-whisper-cpp/</link>
      <pubDate>Wed, 15 Mar 2023 08:30:00 +0900</pubDate>
      
      <guid>https://blog-lampetty-net.web.app/posts/try-whisper-cpp/</guid>
      <description>
        
          
            &lt;p&gt;自分の備忘録としてのやってみた系の話。OpenAIが提供するモデルを使って文字起こしをするC++実装の&lt;a href=&#34;https://github.com/ggerganov/whisper.cpp&#34;&gt;whisper.cpp&lt;/a&gt;を試してみた。&lt;/p&gt;
&lt;h2 id=&#34;環境&#34;&gt;環境&lt;/h2&gt;
&lt;p&gt;Apple M1 MacBook Air 2020 (Memory 16GB)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uname -a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Darwin hogehoge.local 22.3.0 Darwin Kernel Version 22.3.0: Mon Jan &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; 20:39:35 PST 2023&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; root:xnu-8792.81.3~2/RELEASE_ARM64_T8103 x86_64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;whispercppのビルド&#34;&gt;whisper.cppのビルド&lt;/h2&gt;
&lt;p&gt;以下のコマンドを実行してビルドする。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/ggerganov/whisper.cpp.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; whisper.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ビルドが成功すると、カレントディレクトリに main という名前のバイナリが出来上がる。&lt;/p&gt;
&lt;h2 id=&#34;モデルのダウンロード&#34;&gt;モデルのダウンロード&lt;/h2&gt;
&lt;p&gt;次にモデルのダウンロードをしておく。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;models&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ggml&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;large&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;文字起こしする音声ファイルのwavファイルを用意&#34;&gt;文字起こしする音声ファイルのwavファイルを用意&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;whisper.cppはwavファイルしか受け付けないので、ffmpegで動画ファイルをwavにする。&lt;/li&gt;
&lt;li&gt;ちょうど手元に会社で公開している&lt;a href=&#34;https://www.youtube.com/watch?v=k30W2Wz6GQw&#34;&gt;勉強会の動画&lt;/a&gt;があったので、これを使ってみる&lt;/li&gt;
&lt;li&gt;あと長いので最初の2分間だけを抽出。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ffmpeg&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;~/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Downloads&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2023&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;02&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;13.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mp4&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ar&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;120&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2023&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;02&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;13.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wav&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;whispercppで文字起こし&#34;&gt;whisper.cppで文字起こし&lt;/h2&gt;
&lt;p&gt;先ほど出力したwavファイルからwhisper.cppを使って文字起こしする。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./main -m models/ggml-large.bin -f 2023-02-13.wav -l auto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt; でダウンロードしたモデルファイルを使う。&lt;code&gt;large&lt;/code&gt;だと精度が高い&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-l auto&lt;/code&gt; を指定しないと日本語の文字起こししてくれないので指定する。もしくは&lt;code&gt;-l ja&lt;/code&gt;でもOK&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文字起こしの結果。ちなみに2分の音声ファイルを文字起こしするのに82秒ぐらいかかっている。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:00.000 --&amp;gt; 00:00:01.000]  お願いします
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:01.000 --&amp;gt; 00:00:02.000]  お願いします
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:02.000 --&amp;gt; 00:00:11.120]  はい 本日 Dpエンジニアリングまで 第60回始めていきたいと思います
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:11.120 --&amp;gt; 00:00:12.120]  お願いします
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:12.120 --&amp;gt; 00:00:13.120]  お願いします
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:13.120 --&amp;gt; 00:00:14.120]  お願いします
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:14.120 --&amp;gt; 00:00:21.840]  今日は React 18かな 18から新しく 出たディファードバリューっていう
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:21.840 --&amp;gt; 00:00:28.440]  やつの紹介ですね もともとデバウンス とかスロットルみたいな感じで
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:28.440 --&amp;gt; 00:00:33.840]  各種ライブラリーが似たような やつやってたんですけど そうじゃ
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:33.840 --&amp;gt; 00:00:38.800]  なくて結構UIのアップデートで 最適化したやつが出ましたよっていう
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:38.800 --&amp;gt; 00:00:44.320]  ので もともとデバウンスっていう 本当はスロットルも出したかったん
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:44.320 --&amp;gt; 00:00:49.200]  ですけど React 18でスロットルのやつ がバグっていてとあるライブラリー
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:49.200 --&amp;gt; 00:00:54.000]  でパッてデモが用意できなかったん ですけど 一応デバウンスだけ紹介
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:54.000 --&amp;gt; 00:01:04.120]  しておくと 18入力した後に時間差 で18入力されるという 今これ1秒
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:04.120 --&amp;gt; 00:01:09.680]  かな 1秒ってやってるので 最後に 入力した後1秒後に値が更新される
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:09.680 --&amp;gt; 00:01:15.400]  ってやつですね 連続で入力してる 間はデバウンスバリューは変わん
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:15.400 --&amp;gt; 00:01:20.840]  ないけれど 止めてから1秒すると デバウンスバリューは変わる これ
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:20.840 --&amp;gt; 00:01:27.120]  何使いたいかっていうと インクリメンタル サーチとか オリジンのところを
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:27.120 --&amp;gt; 00:01:31.600]  見てもらうと 一文字変わるごとに サーチ検索API叩きまくってると
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:31.600 --&amp;gt; 00:01:38.320]  重すぎるし 重すぎるので デバウンス みたいにユーザーの操作が終わった
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:38.320 --&amp;gt; 00:01:44.560]  後にAPI一回叩くみたいな感じで やってあげるっていう スロットル
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:44.560 --&amp;gt; 00:01:50.280]  の場合は1秒ごとに発火される っていうイメージなので 例えば
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:50.280 --&amp;gt; 00:01:55.240]  デバウンスバリューはこれ 最後 操作終わるまではデバウンスバリュー
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:55.240 --&amp;gt; 00:02:00.040]  更新されないですけど スロットル だった場合は1秒ごとに発火されて
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;最後に会社の勉強会の宣伝&#34;&gt;最後に会社の勉強会の宣伝&lt;/h2&gt;
&lt;p&gt;ドクターズプライムでは、DP Engineering Mondayという名前で毎週勉強会をやってます。月に1回、社外向けに開催したものをYouTubeで配信しているので、よかったらチャンネル登録してください。技術スタックはReact, TypeScript, ChakraUI, Go, GCP, Hasura, PostgreSQLなので、その周辺の話が多いです。&lt;/p&gt;
          
          
        
      </description>
    </item>
    
  </channel>
</rss>