<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://kazuki-ma.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://kazuki-ma.github.io/" rel="alternate" type="text/html" /><updated>2026-04-27T00:44:19+00:00</updated><id>https://kazuki-ma.github.io/feed.xml</id><title type="html">Kazuki MATSUDA</title><entry><title type="html">ClickHouse Local を利用して Claude 利用を詳細分析する</title><link href="https://kazuki-ma.github.io/clickhouse/claude/analytics/2025/09/09/clickhouse-local-claude.html" rel="alternate" type="text/html" title="ClickHouse Local を利用して Claude 利用を詳細分析する" /><published>2025-09-09T00:00:00+00:00</published><updated>2025-09-09T00:00:00+00:00</updated><id>https://kazuki-ma.github.io/clickhouse/claude/analytics/2025/09/09/clickhouse-local-claude</id><content type="html" xml:base="https://kazuki-ma.github.io/clickhouse/claude/analytics/2025/09/09/clickhouse-local-claude.html"><![CDATA[<h2 id="はじめに">はじめに</h2>

<p>Claude Code を使い始めて数ヶ月、気がつけば大量の会話ログが溜まっていました。<code class="language-plaintext highlighter-rouge">ccusage</code> コマンドで基本的な使用状況は確認できますが、もっと詳細な分析がしたい。そこで ClickHouse Local を使って、Claude の使用ログを分析するスクリプトを作成しました。</p>

<h2 id="claude-code-のログ構造">Claude Code のログ構造</h2>

<p>Claude Code は <code class="language-plaintext highlighter-rouge">~/.claude/projects/</code> ディレクトリ以下に、プロジェクトごとに JSONL（JSON Lines）形式でログを保存しています：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/.claude/projects/
├── project-name-1/
│   ├── session-uuid-1.jsonl
│   ├── session-uuid-2.jsonl
│   └── ...
└── project-name-2/
    └── ...
</code></pre></div></div>

<p>各 JSONL ファイルには、セッションごとのメッセージ、ツール使用状況、タイムスタンプなどが記録されています。</p>

<h2 id="clickhouse-local-とは">ClickHouse Local とは</h2>

<p>ClickHouse Local は、ClickHouse データベースのスタンドアロン版で、サーバーを起動することなくローカルファイルに対して SQL クエリを実行できます。特に JSON、CSV、Parquet などの構造化データの分析に優れています。</p>

<h3 id="インストール">インストール</h3>

<p>macOS の場合：</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>clickhouse
</code></pre></div></div>

<h2 id="分析スクリプト">分析スクリプト</h2>

<p>作成した分析スクリプトは <a href="/2025-09-09_clickhouse-local-claude/claude-usage-analyzer.sh"><code class="language-plaintext highlighter-rouge">claude-usage-analyzer.sh</code></a> に置いています。10種類の異なる観点から Claude の使用状況を分析します。</p>

<h2 id="実行結果の例">実行結果の例</h2>

<h3 id="1-メッセージタイプの分布">1. メッセージタイプの分布</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┏━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ type      ┃ count ┃ distribution                                       ┃
┡━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ assistant │ 14361 │ ██████████████████████████████████████████████████ │
│ user      │ 11101 │ ██████████████████████████████████████████████████ │
│ system    │  3197 │ ███████████████▉                                   │
│ summary   │   600 │ ███                                                │
└───────────┴───────┴────────────────────────────────────────────────────┘
</code></pre></div></div>

<h3 id="2-時間帯別アクティビティ">2. 時間帯別アクティビティ</h3>

<p>早朝（5-7時）と昼（11-12時）、夕方（15-16時）にピークがあることがわかります：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┏━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ hour ┃ activity ┃ pattern                                  ┃
┡━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│    5 │     3053 │ ████████████████████████████████████████ │
│    7 │     1974 │ ███████████████████████████████████████▍ │
│   11 │     1990 │ ███████████████████████████████████████▊ │
└──────┴──────────┴──────────────────────────────────────────┘
</code></pre></div></div>

<h3 id="3-プロジェクト別アクティビティ">3. プロジェクト別アクティビティ</h3>

<p>最も活発なプロジェクトとブランチの組み合わせを確認できます：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┏━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ project                 ┃ branch    ┃ messages ┃ assistant_msgs ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ artemis/lunar-gateway   │ main      │     4811 │           2798 │
│ apollo/command-module   │ HEAD      │     4770 │           2151 │
│ apollo/lunar-lander     │ HEAD      │     3408 │           1732 │
└─────────────────────────┴───────────┴──────────┴────────────────┘
</code></pre></div></div>

<h2 id="分析から得られた知見">分析から得られた知見</h2>

<ol>
  <li><strong>使用パターン</strong>: 早朝と昼間に集中的に使用している</li>
  <li><strong>プロジェクト分布</strong>: 特定のプロジェクトに使用が集中している</li>
  <li><strong>セッション長</strong>: 最長セッションは1,731メッセージ、27時間以上継続</li>
  <li><strong>週末 vs 平日</strong>: 意外にも週末と平日で使用量に大きな差がない</li>
</ol>

<h2 id="まとめ">まとめ</h2>

<p>ClickHouse Local を使うことで、複雑な集計処理を SQL で簡潔に記述でき、大量のログファイルも高速に処理できました。Claude Code のようなツールの使用状況を定量的に把握することで、自分の開発パターンを客観的に理解できます。</p>

<p>このスクリプトは GitHub で公開していますので、ぜひご自身の Claude 使用状況の分析にお役立てください。</p>

<h2 id="参考リンク">参考リンク</h2>

<ul>
  <li><a href="https://clickhouse.com/docs/en/operations/utilities/clickhouse-local">ClickHouse Local Documentation</a></li>
  <li><a href="https://claude.ai/code">Claude Code</a></li>
  <li><a href="https://www.npmjs.com/package/ccusage">ccusage - Claude Code Usage Reporter</a></li>
</ul>]]></content><author><name></name></author><category term="ClickHouse" /><category term="Claude" /><category term="Analytics" /><category term="clickhouse" /><category term="claude" /><category term="data-analysis" /><category term="shell-script" /><summary type="html"><![CDATA[はじめに]]></summary></entry><entry><title type="html">トレードオフなど無い - 神話に対する自分なりの経験</title><link href="https://kazuki-ma.github.io/Myth_of_Tradeoff" rel="alternate" type="text/html" title="トレードオフなど無い - 神話に対する自分なりの経験" /><published>2025-01-31T00:00:00+00:00</published><updated>2025-01-31T00:00:00+00:00</updated><id>https://kazuki-ma.github.io/Myth_of_Tradeoff</id><content type="html" xml:base="https://kazuki-ma.github.io/Myth_of_Tradeoff"><![CDATA[<h1 id="トレードオフなど無い">トレードオフなど無い</h1>

<p>『<a href="https://www.oreilly.co.jp//books/9784814400317/">ソフトウェア設計のトレードオフと誤り―プログラミングの際により良い選択をするには</a>』という本があると思います。</p>

<p>いやでも冒頭から嘘です。この本は読んでません。</p>

<p>でも、この本のタイトルを見て、トレードオフという言葉を思い出しました。</p>

<p>トレードオフとは、何かを選択する際に、何かを犠牲にすることです。
ソフトウェアエンジニアリングに限らず、日々色んな場面でトレードオフを選択していると思います。</p>

<p>トレードオフについて意識しない（トレードオフが無いと思っている）ということは、何も犠牲にしていないのではなく、何もメリットを選択しなかったということです。</p>

<p>例）<strong>我々が</strong> MySQL を使っているのは何故だろう？（どんなトレードオフがあるだろう？） MySQL なんていうド直球の RDB を利用しているのはただ単に『我々がイケテナイ』からで、状況が許せばもっと別の Storage を利用すべきなんだろうか？ (TiDB?) その場合何が便利になって何が不便になるだろう？（全てが改善するんだろうか？） <br />
= <strong>MySQL の</strong> Characteristic は何だろう？ つまり、<strong>MySQL は</strong>設計の中で何を犠牲にして何を得たのだろう？</p>

<h2 id="most-review-awards-の受賞に関して---もう現場をあがっている人がやるもの">Most Review Awards の受賞に関して - もう現場をあがっている人がやるもの？</h2>

<p>こういう前書きはさておき、先日会社の忘年会で Most Review Awards という賞を頂きました。GitHub 上でのコードレビュー（正確にはコメントの数？ Approve の数？）が一番多かったからという事らしい。</p>

<p>去年に引き続き2年連続受賞です。ありがとうございます。
ちなみに Most Commit Awards というものはなかった、、、（という話しに続きます。）</p>

<p>去年（2023年12月）の2次会での出来事ですが</p>

<blockquote>
  <p>Matsuda さんって、他の方のコードレビューむっちゃされてるというこでしたけど、自分でコード書きたいとかって思わないんですか？</p>
</blockquote>

<p>みたいなことを言われました。</p>

<p>部署的に遠い方だったので、コードを『書く』という意味の現場からは遠いところにいる、なんか偉い人だと思われたらしい。頂いたお言葉自体は別にそこが趣旨では無くて、お祝いのコメントだったのですが（ありがとうございます）、今回はこの部分にフォーカスしてみたいと思います。</p>

<p>前提にあるのは、Engineer のキャリアとして、ある程度のところまで行くと『コードレビューをするのか』『自分でコードを書くのか』選ばないといけない。みたいな所かなと思います。</p>

<p>いやまぁそもそも Most Review とか、そういう賞を出すこと自体が、コードを書くこととコードをレビューすることをトレードオフにしているような気します。普段はコードを『書く』ことが貢献だと思われているし目立ちがちだけど、普段見えないところでのコードレビューの方が重要なので光を当てよう、的な。</p>

<p>言い換えると、Management としてはコードレビューをすることが重要だということは承知で、でもメンバーにはその意識が無いかもしれないので、そういう賞を出すことで意識を高めよう、とか。</p>

<p>でもこの文章はメンバーの（同僚の）方向きです。いやただのポエムだけど。</p>

<h2 id="トレードオフなど無い-1">トレードオフなど無い</h2>

<p>コードレビューをすることとコードを書くことはトレードオフではない、というのがそもそもの自分の考えです。</p>

<p>『そうはいっても時間は有限だし、トレードオフがなかったらキャリアパス（Manager v.s. Individual Contributor）問題とか無いでしょ』みたいな話しもあるかもしれません。</p>

<h3 id="individual-の意味は他の人とコミュニケーションをせずにという意味では無い">Individual の意味は、『他の人とコミュニケーションをせずに』という意味では無い</h3>

<p>IC 憧れますよね。格好いいし。『まねーじゃー』というちょっと古くさい言葉には無い、何かがある。でも、IC になるためにはコードレビューをすることが必要です。</p>

<p>IC はあたかも“<strong>個人で孤高</strong> に黙々とコードを書いている”ようなイメージを持たれがちですが、実際にはまったく違います。Individual という言葉は「他者とコミュニケーションをしない」という意味ではなく、むしろ <strong>“自分の専門性を軸に、技術的な価値を周りに提供することが主たる役割である”</strong> ことを指します。言い換えると、<strong>誰かに頼らず（自律して）</strong> に専門性を発揮できる人、ということです。</p>

<p>こう聞いて、やっぱり一人で黙々とコードを書いているのが IC としてのあるべき姿だと思われたら、それは誤解です。『自律して専門性を発揮する』という部分が重要であって、誰と・どの様にというのは重要ではありません。</p>

<p>自律した専門性があれば、コードを書いても良いし、コードレビューをしても良いです。どちらも自分の専門性を発揮するための手段です。</p>

<p>自分は Individual のふんわりしたイメージを、『技術にふりまわされないようになる』ぐらいのイメージで捉えています。それは自分の思ったとおりに技術が動く、ということではなく、技術がどう動くかを理解して、それに対してどう対応するかを自分で決める、ということです。</p>

<p>Managerは極端に言えば会社の中での正解なので周りの活動を強制できます（売上が上がるかどうかはさておき）。しかし IC や Software Engineering はトランジスタや物理法則の奴隷です。トランジスタがどう動くかは自分で決められません。技術を学び対等に技術と向き合うと Individual になれます。</p>

<h3 id="コードレビューをすることはコードを書くこととトレードオフではない">コードレビューをすることは、コードを書くこととトレードオフではない</h3>

<h3 id="書いていない事それでも疲れたりやりたくないと思うことはあるでもそれはトレードオフではない">書いていない事：それでも疲れたり、やりたくないと思うことはある。でも、それはトレードオフではない</h3>

<ul>
  <li>一部のコードをレビューするのは疲れます。それはそう。疲れている理由が自分の『孤高な IC の幻想』であればそれは誤解ですが、相手（の書いたコード）にあるならばそういったコードレビューからは距離をおきましょう。</li>
  <li>専門性も教育効果もなにも無いコードレビューは、ただの時間の無駄です。それはキャリアや技術的なトレードオフを求められているのではなく、ただの無駄あるいは控えめに言ってもお金を稼ぐためのトレードオフ（ストレス/時間 v.s. お金）です。</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[トレードオフなど無い]]></summary></entry><entry><title type="html">Kotlin Inline Class And Jackson</title><link href="https://kazuki-ma.github.io/2020/09/12/kotlin-inline-class-and-jackson.html" rel="alternate" type="text/html" title="Kotlin Inline Class And Jackson" /><published>2020-09-12T00:00:00+00:00</published><updated>2020-09-12T00:00:00+00:00</updated><id>https://kazuki-ma.github.io/2020/09/12/kotlin-inline-class-and-jackson</id><content type="html" xml:base="https://kazuki-ma.github.io/2020/09/12/kotlin-inline-class-and-jackson.html"><![CDATA[<hr />
<p>title: Kotlin’s inline class and jackson.
permalink: kotlin-inline-class-and-jackson
—</p>

<h1 id="kotlin-の-inline-class-を-jackson-で綺麗に扱う">Kotlin の inline class を jackson で綺麗に扱う。</h1>

<h2 id="kotlininlineclassmodulekt">KotlinInlineClassModule.kt</h2>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">annotation</span> <span class="kd">class</span> <span class="nc">EnableInlineClassDeserialize</span>

<span class="k">private</span> <span class="kd">class</span> <span class="nc">InlineClassDeserializer</span><span class="p">(</span>
    <span class="n">rawClass</span><span class="p">:</span> <span class="nc">Class</span><span class="p">&lt;</span><span class="err">*</span><span class="p">&gt;</span>
<span class="p">)</span> <span class="p">:</span> <span class="nc">JsonDeserializer</span><span class="p">&lt;</span><span class="nc">Any</span><span class="p">&gt;()</span> <span class="p">{</span>
    <span class="k">private</span> <span class="kd">val</span> <span class="py">const</span> <span class="p">=</span> <span class="n">rawClass</span><span class="p">.</span><span class="n">kotlin</span><span class="p">.</span><span class="n">primaryConstructor</span><span class="p">.</span><span class="nf">apply</span> <span class="p">{</span> <span class="k">this</span><span class="o">!!</span><span class="p">.</span><span class="n">isAccessible</span> <span class="p">=</span> <span class="k">true</span> <span class="p">}</span><span class="o">!!</span>
    <span class="k">private</span> <span class="kd">val</span> <span class="py">getter</span><span class="p">:</span> <span class="p">(</span><span class="nc">JsonParser</span><span class="p">)</span> <span class="p">-&gt;</span> <span class="nc">Any</span> <span class="p">=</span> <span class="k">when</span> <span class="p">(</span><span class="k">const</span><span class="p">.</span><span class="n">parameters</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">type</span><span class="p">)</span> <span class="p">{</span>
        <span class="nc">Boolean</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="nf">createType</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nc">JsonParser</span><span class="o">::</span><span class="n">getValueAsBoolean</span>
        <span class="nc">Int</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="nf">createType</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nc">JsonParser</span><span class="o">::</span><span class="n">getValueAsInt</span>
        <span class="nc">Long</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="nf">createType</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nc">JsonParser</span><span class="o">::</span><span class="n">getValueAsLong</span>
        <span class="nc">Float</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="nf">createType</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nc">JsonParser</span><span class="o">::</span><span class="n">getFloatValue</span>
        <span class="nc">Double</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="nf">createType</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nc">JsonParser</span><span class="o">::</span><span class="n">getValueAsDouble</span>
        <span class="k">else</span> <span class="p">-&gt;</span> <span class="nc">JsonParser</span><span class="o">::</span><span class="n">getValueAsString</span>
    <span class="p">}</span>

    <span class="k">override</span> <span class="k">fun</span> <span class="nf">deserialize</span><span class="p">(</span><span class="n">p</span><span class="p">:</span> <span class="nc">JsonParser</span><span class="p">,</span> <span class="n">ctxt</span><span class="p">:</span> <span class="nc">DeserializationContext</span><span class="p">):</span> <span class="nc">Any</span> <span class="p">{</span>
        <span class="k">return</span> <span class="k">const</span><span class="p">.</span><span class="nf">call</span><span class="p">(</span><span class="nf">getter</span><span class="p">(</span><span class="n">p</span><span class="p">))</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">private</span> <span class="kd">class</span> <span class="nc">InlineClassKeySerializer</span><span class="p">(</span>
    <span class="n">rawClass</span><span class="p">:</span> <span class="nc">Class</span><span class="p">&lt;</span><span class="err">*</span><span class="p">&gt;</span>
<span class="p">)</span> <span class="p">:</span> <span class="nc">KeyDeserializer</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">private</span> <span class="kd">val</span> <span class="py">const</span> <span class="p">=</span> <span class="n">rawClass</span><span class="p">.</span><span class="n">kotlin</span><span class="p">.</span><span class="n">primaryConstructor</span><span class="p">.</span><span class="nf">apply</span> <span class="p">{</span> <span class="k">this</span><span class="o">!!</span><span class="p">.</span><span class="n">isAccessible</span> <span class="p">=</span> <span class="k">true</span> <span class="p">}</span><span class="o">!!</span>
    <span class="k">override</span> <span class="k">fun</span> <span class="nf">deserializeKey</span><span class="p">(</span><span class="n">key</span><span class="p">:</span> <span class="nc">String</span><span class="p">?,</span> <span class="n">ctxt</span><span class="p">:</span> <span class="nc">DeserializationContext</span><span class="p">?):</span> <span class="nc">Any</span> <span class="p">{</span>
        <span class="k">return</span> <span class="k">const</span><span class="p">.</span><span class="nf">call</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kd">class</span> <span class="nc">KotlinInlineClassModule</span> <span class="p">:</span> <span class="nc">Module</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">override</span> <span class="k">fun</span> <span class="nf">version</span><span class="p">()</span> <span class="p">=</span> <span class="nc">Version</span><span class="p">.</span><span class="nf">unknownVersion</span><span class="p">()</span>
    <span class="k">override</span> <span class="k">fun</span> <span class="nf">getModuleName</span><span class="p">()</span> <span class="p">=</span> <span class="n">javaClass</span><span class="p">.</span><span class="n">name</span>

    <span class="k">override</span> <span class="k">fun</span> <span class="nf">setupModule</span><span class="p">(</span><span class="n">context</span><span class="p">:</span> <span class="nc">Module</span><span class="p">.</span><span class="nc">SetupContext</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">context</span><span class="p">.</span><span class="nf">addKeyDeserializers</span><span class="p">(</span><span class="nc">KeyDeserializers</span> <span class="p">{</span> <span class="n">type</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="p">-&gt;</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">type</span><span class="p">.</span><span class="n">isInlineClass</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">return</span><span class="nd">@KeyDeserializers</span> <span class="nc">InlineClassKeySerializer</span><span class="p">(</span><span class="n">type</span><span class="p">.</span><span class="n">rawClass</span><span class="p">)</span>
            <span class="p">}</span>
            <span class="k">null</span>
        <span class="p">})</span>
        <span class="n">context</span><span class="p">.</span><span class="nf">addDeserializers</span><span class="p">(</span><span class="kd">object</span> <span class="err">: </span><span class="nc">Deserializers</span><span class="p">.</span><span class="nc">Base</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">override</span> <span class="k">fun</span> <span class="nf">findBeanDeserializer</span><span class="p">(</span>
                <span class="n">type</span><span class="p">:</span> <span class="nc">JavaType</span><span class="p">,</span>
                <span class="n">config</span><span class="p">:</span> <span class="nc">DeserializationConfig</span><span class="p">?,</span>
                <span class="n">beanDesc</span><span class="p">:</span> <span class="nc">BeanDescription</span><span class="p">?</span>
            <span class="p">):</span> <span class="nc">JsonDeserializer</span><span class="p">&lt;</span><span class="err">*</span><span class="p">&gt;?</span> <span class="p">{</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">type</span><span class="p">.</span><span class="n">isInlineClass</span><span class="p">)</span> <span class="p">{</span>
                    <span class="k">return</span> <span class="nc">InlineClassDeserializer</span><span class="p">(</span><span class="n">type</span><span class="p">.</span><span class="n">rawClass</span><span class="p">)</span>
                <span class="p">}</span>
                <span class="k">return</span> <span class="k">null</span>
            <span class="p">}</span>
        <span class="p">})</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="kd">val</span> <span class="py">JavaType</span><span class="p">.</span><span class="n">isInlineClass</span><span class="p">:</span> <span class="nc">Boolean</span>
        <span class="k">get</span><span class="p">()</span> <span class="p">=</span> <span class="n">rawClass</span><span class="p">.</span><span class="nf">isAnnotationPresent</span><span class="p">(</span><span class="nc">EnableInlineClassDeserialize</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="n">java</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>これで以下は動く</p>
<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@EnableInlineClassDeserialize</span>
<span class="k">inline</span> <span class="kd">class</span> <span class="nc">MyStringId</span><span class="p">(</span>
    <span class="err">@</span><span class="k">get</span><span class="p">:</span><span class="nc">JsonValue</span>
    <span class="kd">val</span> <span class="py">value</span><span class="p">:</span> <span class="nc">String</span>
<span class="p">)</span>

<span class="nd">@EnableInlineClassDeserialize</span>
<span class="k">inline</span> <span class="kd">class</span> <span class="nc">MyLongId</span><span class="p">(</span>
    <span class="err">@</span><span class="k">get</span><span class="p">:</span><span class="nc">JsonValue</span>
    <span class="kd">val</span> <span class="py">value</span><span class="p">:</span> <span class="nc">Long</span>
<span class="p">)</span>

<span class="kd">class</span> <span class="nc">InlineJackson</span> <span class="p">{</span>
    <span class="k">companion</span> <span class="k">object</span> <span class="p">{</span>
        <span class="k">private</span> <span class="kd">val</span> <span class="py">log</span> <span class="p">=</span> <span class="n">mu</span><span class="p">.</span><span class="nc">KotlinLogging</span><span class="p">.</span><span class="nf">logger</span> <span class="p">{}</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="kd">val</span> <span class="py">mapper</span> <span class="p">=</span> <span class="nc">ObjectMapper</span><span class="p">().</span><span class="nf">registerKotlinModule</span><span class="p">()</span>

    <span class="nf">init</span> <span class="p">{</span>
        <span class="n">mapper</span><span class="p">.</span><span class="nf">registerModule</span><span class="p">(</span><span class="nc">KotlinInlineClassModule</span><span class="p">())</span>
    <span class="p">}</span>

    <span class="nd">@Test</span>
    <span class="k">fun</span> <span class="nf">testInlineSerialize</span><span class="p">()</span> <span class="p">{</span>
        <span class="kd">val</span> <span class="py">ret</span> <span class="p">=</span> <span class="n">mapper</span><span class="p">.</span><span class="nf">writeValueAsString</span><span class="p">(</span><span class="nc">MyStringId</span><span class="p">(</span><span class="s">"test"</span><span class="p">))</span>

        <span class="n">log</span><span class="p">.</span><span class="nf">info</span> <span class="p">{</span> <span class="n">ret</span> <span class="p">}</span>

        <span class="kd">val</span> <span class="py">readValue</span> <span class="p">=</span> <span class="n">mapper</span><span class="p">.</span><span class="nf">readValue</span><span class="p">(</span><span class="n">ret</span><span class="p">,</span> <span class="nc">MyStringId</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="n">java</span><span class="p">)</span>
        <span class="kd">val</span> <span class="py">longValue</span> <span class="p">=</span> <span class="n">mapper</span><span class="p">.</span><span class="nf">readValue</span><span class="p">(</span><span class="s">"123"</span><span class="p">,</span> <span class="nc">MyLongId</span><span class="o">::</span><span class="k">class</span><span class="p">.</span><span class="n">java</span><span class="p">)</span>
        <span class="kd">val</span> <span class="py">mapValue</span> <span class="p">=</span> <span class="n">mapper</span><span class="p">.</span><span class="n">readValue</span><span class="p">&lt;</span><span class="nc">Map</span><span class="p">&lt;</span><span class="nc">MyStringId</span><span class="p">,</span> <span class="nc">MyLongId</span><span class="p">&gt;&gt;(</span><span class="s">"""{"key": 1}"""</span><span class="p">)</span>
        <span class="kd">val</span> <span class="py">listValue</span> <span class="p">=</span> <span class="n">mapper</span><span class="p">.</span><span class="n">readValue</span><span class="p">&lt;</span><span class="nc">List</span><span class="p">&lt;</span><span class="nc">MyStringId</span><span class="p">&gt;&gt;(</span><span class="s">"""["1","2"]"""</span><span class="p">)</span>

        <span class="n">log</span><span class="p">.</span><span class="nf">info</span> <span class="p">{</span> <span class="n">readValue</span> <span class="p">}</span>
        <span class="n">log</span><span class="p">.</span><span class="nf">info</span> <span class="p">{</span> <span class="n">longValue</span> <span class="p">}</span>
        <span class="n">log</span><span class="p">.</span><span class="nf">info</span> <span class="p">{</span> <span class="n">mapValue</span> <span class="p">}</span>
        <span class="n">log</span><span class="p">.</span><span class="nf">info</span> <span class="p">{</span> <span class="n">listValue</span> <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="result">Result</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>03:01:08.002 [main] INFO - "test"
03:01:08.035 [main] INFO - MyStringId(value=test)
03:01:08.035 [main] INFO - MyLongId(value=123)
03:01:08.035 [main] INFO - {MyStringId(value=key)=MyLongId(value=1)}
03:01:08.036 [main] INFO - [MyStringId(value=1), MyStringId(value=2)]
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[title: Kotlin’s inline class and jackson. permalink: kotlin-inline-class-and-jackson —]]></summary></entry><entry><title type="html">Microsoft Q# Coding Contest - Summer 2018</title><link href="https://kazuki-ma.github.io/Microsoft_Qsharp_Coding_Contest_Summer_2018" rel="alternate" type="text/html" title="Microsoft Q# Coding Contest - Summer 2018" /><published>2018-07-17T00:00:00+00:00</published><updated>2018-07-17T00:00:00+00:00</updated><id>https://kazuki-ma.github.io/qsharp</id><content type="html" xml:base="https://kazuki-ma.github.io/Microsoft_Qsharp_Coding_Contest_Summer_2018"><![CDATA[<p>Q# ってググラビリティ低さある。。。</p>

<p>https://assets.codeforces.com/rounds/997-998/main-contest-editorial.pdf</p>

<p>公式 Editorial が出ていた。</p>

<p>個人成績は</p>
<ul>
  <li>後ろから2番目はスミマセン考えると言うよりはむっちゃググりました。</li>
  <li>最後の問題が解けなかった。</li>
</ul>

<p>一番のアハ体験が、普通にやってると『CNOT って、Controlled bit &gt; Target bit に制御をしてるから、Controlled bit には影響が無い（？）』ものだと思ってたら感違いで、もつれを作ってるから普通に『CNOT を適用 &gt; Target を計測』の流れて Controlled の状態が収束してしまうことがある。</p>

<p>なぜか自宅に 『<a href="https://www.amazon.co.jp/dp/4621062271">量子計算と量子情報の原理 (World Physics Selection)</a>』があったので後から読んでいたら『CNOT = CNOT を逆方向にして前後 H で挟んだやつとおんなじやで』って書かれていて意味が分からなかったけどあー。って感じだ。</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Q# ってググラビリティ低さある。。。]]></summary></entry><entry><title type="html">『忘れられた巨人』カズオ・イシグロ</title><link href="https://kazuki-ma.github.io/%E5%BF%98%E3%82%8C%E3%82%89%E3%82%8C%E3%81%9F%E5%B7%A8%E4%BA%BA" rel="alternate" type="text/html" title="『忘れられた巨人』カズオ・イシグロ" /><published>2018-06-09T00:00:00+00:00</published><updated>2018-06-09T00:00:00+00:00</updated><id>https://kazuki-ma.github.io/wasureraretakyojin</id><content type="html" xml:base="https://kazuki-ma.github.io/%E5%BF%98%E3%82%8C%E3%82%89%E3%82%8C%E3%81%9F%E5%B7%A8%E4%BA%BA"><![CDATA[<p>書評メモ</p>

<hr />

<blockquote>
  <p>「悪い記憶も取り戻します。仮に、それで泣いたり、怒りで身が震えたりしてもです。人生を分かち合うとはそういうことではないでしょうか」</p>
</blockquote>]]></content><author><name></name></author><summary type="html"><![CDATA[書評メモ]]></summary></entry></feed>