<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>caphosra note</title><link>https://caphosra.net/</link><description>Recent content on caphosra note</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Wed, 17 Dec 2025 21:17:03 +0900</lastBuildDate><atom:link href="https://caphosra.net/index.xml" rel="self" type="application/rss+xml"/><item><title>[CTF] SECCON CTF 14 Quals writeup</title><link>https://caphosra.net/posts/2025-12-17-seccon-quals/</link><pubDate>Wed, 17 Dec 2025 16:53:24 +0900</pubDate><guid>https://caphosra.net/posts/2025-12-17-seccon-quals/</guid><description>&lt;p&gt;SECCON CTF 14 Qualsに参加したのでwriteupを書く。&lt;/p&gt;
&lt;p&gt;チームはTSGで参加して、結果は国内7位だった。TSGは(これから何かをしでかさない限り)SECCON本選への出場権を獲得できたことになる。&lt;/p&gt;
&lt;p&gt;個人としては、revを2問(Ez Flag Check, aeppel), jailを1問(excepython)を解いた。&lt;/p&gt;
&lt;h2 id="rev-ez-flag-check-59pt"&gt;
 rev: Ez Flag Check (59pt)
 &lt;a class="heading-link" href="#rev-ez-flag-check-59pt"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;一番解かれていたrev問題。&lt;/p&gt;
&lt;p&gt;ELFファイルが与えられ、そのELFが受け入れるようなflagを見つけるというよくあるタイプの問題だった。Ghidraで覗いてあげると、バイナリは、フラグの長さとフラグが&lt;code&gt;SECCON{****}&lt;/code&gt;の形式を守っていることを確認した上で、フラグを&lt;code&gt;sigma_encrypt&lt;/code&gt;なる関数に通してからエンコードされたバイト列と比較していることがわかる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sigma_encrypt&lt;/code&gt;関数を見てあげると、ハードコーディングされた値を使って計算された&lt;code&gt;key_bytes&lt;/code&gt;とフラグの一部&lt;code&gt;message&lt;/code&gt;をXORして比較用のバイト列&lt;code&gt;out&lt;/code&gt;を生成していることがわかる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;i_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;len&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;i_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;i_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;out&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i_1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;message&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i_1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;^&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;key_bytes&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;uint&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;char&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i_1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;各文字が1文字づつ他の文字と独立に決定していっている様子がわかるので、バイナリをオラクルとしてprintableな文字&lt;code&gt;x&lt;/code&gt;について&lt;code&gt;SECCON{xxx.....x}&lt;/code&gt;を総当たりしていけば、printableの文字の種類回だけのイテレーションでフラグが得られる。もちろんこれよりいくらでも効率的な方法はあるが、別に裏でスクリプトを動かして置くだけなのでこれで十分だった。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-weight:bold;font-style:italic"&gt;#!/usr/bin/python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;from&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;ptrlib&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;subprocess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;def&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;get_list&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;assert&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;==&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;EXEC&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;./chall&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;sock&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Process&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;EXEC&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;time&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;sleep&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;p&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;subprocess&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Popen&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;([&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;gdb&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;-x&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;./gs.py&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;./chall&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;],&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;stdout&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;=&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;subprocess&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;PIPE&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;stderr&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;=&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;subprocess&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;STDOUT&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;time&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;sleep&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;sock&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;sendline&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;SECCON{&amp;#34;&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;}&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;time&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;sleep&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;sock&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;close&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;out&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;err&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;p&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;communicate&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;out&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;out&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;decode&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;out&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;out&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;replace&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#d26464;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;matched&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;re&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;findall&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;r&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;\$1\s=\s\{(.+)\}&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;out&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;split&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;, &amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;x&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;matched&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;append&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;16&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;return&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x12&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;ENC&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x03&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x15&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x13&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x03&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x11&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x55&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x1f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x43&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x63&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x61&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x59&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0xef&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0xbc&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x10&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x1f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x43&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x54&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0xa8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;x&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;string&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;ascii_letters&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;string&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;digits&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;string&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;punctuation&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;out&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;get_list&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x12&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;i&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x12&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;out&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;==&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ENC&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt;&lt;span style="color:#abb2bf"&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;SECCON{flagc29yYW5k&amp;lt;b19!!}&lt;/code&gt;&lt;/p&gt;</description></item><item><title>[Lean4] 実数を構成する</title><link>https://caphosra.net/posts/2025-08-10-lean4-real/</link><pubDate>Sun, 10 Aug 2025 15:05:14 +0900</pubDate><guid>https://caphosra.net/posts/2025-08-10-lean4-real/</guid><description>&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"&gt;&lt;/script&gt;
&lt;p&gt;Lean4を使って有理数を構成してから実数を構成し、任意の有理数に対してそれに対応する実数の構成が確かにできることを示した。その過程をまとめたい。&lt;/p&gt;
&lt;h2 id="構成と証明したことの概要"&gt;
 構成と証明したことの概要
 &lt;a class="heading-link" href="#%e6%a7%8b%e6%88%90%e3%81%a8%e8%a8%bc%e6%98%8e%e3%81%97%e3%81%9f%e3%81%93%e3%81%a8%e3%81%ae%e6%a6%82%e8%a6%81"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;まず前提として、Lean4の標準ライブラリにある、自然数を表現する&lt;code&gt;Nat&lt;/code&gt;, 整数を表現する&lt;code&gt;Int&lt;/code&gt;とそれに関する諸定理は断りなく使った。&lt;/p&gt;
&lt;p&gt;その上で、整数と自然数の組\(\mathbb{Z}\times \mathbb{N}_{&amp;gt;0}\)(&lt;code&gt;NumPair&lt;/code&gt;と命名)を定義し、これに対して、適当な同値関係\(\sim\)を定義した。この同値関係は、\((a, b) \sim (c, d) \Leftrightarrow ad = cb\)となるようなもので、整数の方を分子、自然数の方を分母とみなした時の分数のよくある同値関係を意味している。&lt;/p&gt;
&lt;p&gt;次に、上記の同値関係を用いて、同値類\(\mathbb{Z}\times\mathbb{N}_{&amp;gt;0}/\sim\)をとり、その元を有理数&lt;code&gt;Rational&lt;/code&gt;とした。&lt;/p&gt;
&lt;p&gt;最後に、&lt;code&gt;Rational&lt;/code&gt;の集合を用いて、Dedekind cutをとり実数&lt;code&gt;Real&lt;/code&gt;を構成した。&lt;/p&gt;
&lt;p&gt;証明については、任意の有理数\(r\)について\(\{x \in \mathbb{Q}|x &amp;lt; r \}\)が、確かに実数の元となっていることを示した。この証明に際して\(\mathbb{Q}\)が稠密であることを示した。&lt;/p&gt;
&lt;h2 id="設けた縛り"&gt;
 設けた縛り
 &lt;a class="heading-link" href="#%e8%a8%ad%e3%81%91%e3%81%9f%e7%b8%9b%e3%82%8a"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;今回、この構成と証明をするにあたって、個人的に以下の縛りを設けた。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;証明は&lt;strong&gt;排中律を使わずに&lt;/strong&gt;行う。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mathlibは使わない。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;まず、排中律を使わなかったことについて。今回は、構成的な証明にすることを目標としたので、排中律ならびにそれと同値の公理を利用しなかった。これにより、二重否定除去や背理法による証明ができなくなったが、今回の場合はなんとかなった。&lt;/p&gt;
&lt;p&gt;次に、&lt;a href="https://github.com/leanprover-community/mathlib4" class="external-link" target="_blank" rel="noopener"&gt;Mathlib&lt;/a&gt;を使わないことについて。理由は主に2つある。1つはMathlibにはさまざまな有用な定理が収録されており、あまりにも便利すぎるから。そして、Mathlibのライブラリには背理法を行うtactic &lt;code&gt;by_contra&lt;/code&gt;を用いた証明がかなり収録されていたはず&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;なので、意図しないうちに前述のルールを破ってしまう可能性があるからである。&lt;/p&gt;
&lt;p&gt;ちなみにMathlibでは&lt;code&gt;Mathlib.Data.Real.Basic&lt;/code&gt;において実数を表現する&lt;code&gt;Real&lt;/code&gt;が定義されており、これはCauchy列を用いて定義されている。&lt;/p&gt;
&lt;h2 id="1-有理数の構成"&gt;
 1. 有理数の構成
 &lt;a class="heading-link" href="#1-%e6%9c%89%e7%90%86%e6%95%b0%e3%81%ae%e6%a7%8b%e6%88%90"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;前置きはこれくらいにして、実際に実数を構成した過程を見ていく。&lt;/p&gt;
&lt;p&gt;まず、有理数を構成するために、整数と自然数の組\(\mathbb{Z}\times \mathbb{N}_{&amp;gt;0}\), &lt;code&gt;NumPair&lt;/code&gt;を定義した。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-lean" data-lang="lean"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;structure&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;NumPair&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;num&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Nat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;denom_non_zero&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;≠&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでのポイントは、分母が0でないことを保証するために、&lt;code&gt;denom_non_zero&lt;/code&gt;という要素を&lt;code&gt;NumPair&lt;/code&gt;に追加している点である。&lt;/p&gt;
&lt;p&gt;次に、&lt;code&gt;NumPair&lt;/code&gt;に対して同値関係を定義した。これからこの関係を用いて有理数を定義するのだから、同値関係は以下のようになる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-lean4" data-lang="lean4"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;fun&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;さて、この同値関係を持ちいて同値類をとりたいわけだが、Lean4では同値類&lt;code&gt;Quotient&lt;/code&gt;をとるためには、数学でいうところの\((X, \sim)\)に相当する&lt;code&gt;Setoid&lt;/code&gt;のインスタンスを定義する必要がある。そして、この&lt;code&gt;Setoid&lt;/code&gt;のインスタンス定義には、ちゃんとこの2項関係が同値関係になっていることを示す必要がある。&lt;/p&gt;
&lt;p&gt;この&lt;code&gt;Setoid&lt;/code&gt;のインスタンス定義を行うと以下のようになる。&lt;code&gt;r&lt;/code&gt;の部分が同値関係の定義を、&lt;code&gt;iseqv&lt;/code&gt;の部分がそれがちゃんと同値関係になっていることの証明になっている。&lt;code&gt;case refl&lt;/code&gt;と書いてあるところが反射律を、&lt;code&gt;case symm&lt;/code&gt;が対称律を、&lt;code&gt;case trans&lt;/code&gt;が推移律を示している部分である。推移律に関しては、掛け算の交換法則や結合法則を駆使して証明しているので、そこまで特別なことをしていないのに証明が長くなっている。&lt;code&gt;↑&lt;/code&gt;はもちろんKnuthの矢印記法&amp;hellip;ではなく、&lt;code&gt;Nat&lt;/code&gt;を&lt;code&gt;Int&lt;/code&gt;に変換するための記号である。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-lean" data-lang="lean"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;instance&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;NumPairSetoid&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Setoid&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;NumPair&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;r&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;:&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;fun&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;iseqv&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;:&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;by&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;constructor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;case&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;refl&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;intros&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rfl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;case&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;symm&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;intros&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;x&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_comm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;h&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_comm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;case&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;trans&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;intros&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;x&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;z&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;h1&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;h2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;have&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;h1_mod&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;z&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;z&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;:&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;by&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;h1&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;have&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;h2_mod&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;z&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;z&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;:&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;by&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;h2&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;have&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;z&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;z&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;:&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;by&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_assoc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_assoc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;conv&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;lhs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;conv&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rhs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_comm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;have&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;z&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;)&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;z&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;num&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;*&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;x&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;)&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;:&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;by&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;←&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;h1_mod&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;at&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;this&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;h2_mod&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;at&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;this&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;conv&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;at&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;this&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;lhs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;conv&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;lhs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_comm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_assoc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;conv&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;at&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;this&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rhs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;conv&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;lhs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_comm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_assoc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;exact&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;this&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;have&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y_denom_zero&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;↑&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;:&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;)&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;≠&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;:&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;by&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;ofNat_ne_zero&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;exact&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;denom_non_zero&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;rw&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Int&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mul_eq_mul_left_iff&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;y_denom_zero&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;]&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;at&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;this&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;exact&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;this&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正直この証明は長いだけである。&lt;/p&gt;</description></item><item><title>[CTF] IERAE CTF 2025 writeup</title><link>https://caphosra.net/posts/2025-06-26-ierae-ctf/</link><pubDate>Thu, 26 Jun 2025 17:01:15 +0900</pubDate><guid>https://caphosra.net/posts/2025-06-26-ierae-ctf/</guid><description>&lt;p&gt;IERAE CTF 2025にTSGとして参加しました。&lt;/p&gt;
&lt;h2 id="pwn-gotcha-go-medium-25-solves"&gt;
 pwn: Gotcha-Go (medium, 25 solves)
 &lt;a class="heading-link" href="#pwn-gotcha-go-medium-25-solves"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Go製のメモアプリに対して攻撃を行う問題。メモアプリには特定のIDのメモを作成する(init), 読み込む(info), 書き込む(edit)操作が実装されている。&lt;/p&gt;
&lt;p&gt;脆弱性は明らかで、メモのIDに対してなんの制約も掛かっていないので配列外参照が可能になっている。あとは適当なアドレスを書き換えて終わりだと思っていたが、流石にGo製のアプリだけあって、メモリレイアウトやレジスタの使い方がC言語で同様のコードを書いてgccでコンパイルした時とはかなり違うものとなっていた。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;checksec&lt;/code&gt;の結果は以下の通り。No PIE, No RELROなのでGOTを書き換えて終わりかと思いきや、C言語と同じようにGOTが存在するわけではないため不可能。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ checksec --file=./ctf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[*] &amp;#39;/ctf/2025/ierae/gotcha-go/ctf&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Arch: amd64-64-little
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RELRO: No RELRO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Stack: No canary found
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NX: NX enabled
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PIE: No PIE (0x400000)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Stripped: No
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Debuginfo: Yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;問題をより詳しく見る。&lt;code&gt;info&lt;/code&gt;と&lt;code&gt;edit&lt;/code&gt;を使えば任意の&lt;code&gt;idx&lt;/code&gt;について以下で定義されるような&lt;code&gt;l&lt;/code&gt;に対し、&lt;code&gt;l.list[idx].data&lt;/code&gt;に対して読み書きが可能である。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;type&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Data&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;interface&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00b1f7"&gt;info&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00b1f7"&gt;init&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;MyStr&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#00b1f7"&gt;edit&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;var&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;l&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Data&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;MyList&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;type&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;MyStr&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;struct&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#aa89ea"&gt;idx&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#aa89ea"&gt;data&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x30&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;type&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;MyList&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;struct&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#aa89ea"&gt;list&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;16&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;MyStr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&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;l&lt;/code&gt;はグローバル領域に存在し、毎回固定のアドレスに配置されいること、配列の構造とGhidraでの逆アセンブル結果から、これは要するに任意の&lt;code&gt;idx&lt;/code&gt;に対して&lt;code&gt;*(0x56bfc0 + idx * 8) + 0x8&lt;/code&gt;のアドレスに対して読み書きができることを意味している。&lt;/p&gt;</description></item><item><title>コンパイラ係としてCPU実験を終えて</title><link>https://caphosra.net/posts/2025-03-09-is-cpu/</link><pubDate>Sun, 09 Mar 2025 16:03:26 +0900</pubDate><guid>https://caphosra.net/posts/2025-03-09-is-cpu/</guid><description>&lt;p&gt;CPU実験が終わったので、作ったものの紹介と、やってよかったこと、CPU実験全体としての感想を書いていく。&lt;/p&gt;
&lt;h2 id="作ったもの"&gt;
 作ったもの
 &lt;a class="heading-link" href="#%e4%bd%9c%e3%81%a3%e3%81%9f%e3%82%82%e3%81%ae"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;RISC-VベースのISA RINANA、コンパイラ &lt;a href="https://github.com/cpuex1/mincc" class="external-link" target="_blank" rel="noopener"&gt;mincc&lt;/a&gt;、余興としてコアの上で動くシミュレーター rinacoreを作った。&lt;/p&gt;
&lt;h3 id="1-risc-vベースのisa-rinana"&gt;
 1. RISC-VベースのISA: RINANA
 &lt;a class="heading-link" href="#1-risc-v%e3%83%99%e3%83%bc%e3%82%b9%e3%81%aeisa-rinana"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;CPU実験の第1週の初仕事として、RINANAというISAをRISC-Vを参考にして作った。&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;一旦RISC-Vで実装し始めて、コアが完動してから2nd ISA、3rd ISAと移行していく班が多かったが、我々の班は最初からRINANAで作ることにした。これにより仕様の違いによる混乱を避け、バージョン改訂によるコアの作り直しやシミュレーターの移行コストを最小限にすることを狙った。&lt;/p&gt;
&lt;p&gt;ISAの定義や認識が複数人で割れてしまったり複数バージョンが同時に存在したりすることを避けるために、オペコードの割り振りや新命令の追加などのISAに関係する仕様の策定の最終決定権とバージョン管理の責任を、班員の同意を取った上で全て自分に集約させた。&lt;/p&gt;
&lt;p&gt;最初の段階では、RISC-Vからfence.i等の明らかに余興でも使わない命令を除いてオペコードを振り直し、B-typeやJ-typeの11bit目のような飛んでいるbitをわかりやすいように並べ替えただけのものであった。その後、コンパイラで必要になった命令の追加やコア係からの要望であるfloat命令かどうかを見分けられるbitの追加などを行い実に13回のアップデートを経て、最終的なRINANA v1.1.0が完成した。&lt;/p&gt;
&lt;p&gt;RINANAを真面目にversioningしたことと、バージョンが上がるたびに最優先事項として班のアセンブラr72bとシミュレーターを更新してもらったことで、参照するRINANAのバージョン違いによる混乱は最小限に抑えられたと考えている。また、ISAを管理する仕事をコンパイラ係が行うことで、コア係が求める仕様やコンパイラ係が必要としている機能を相互に理解することができ、コミュニケーションが取りやすくなるという副次的な効果もあった。多分コア係がISAを定義しても同等の効果が得られると思う。&lt;/p&gt;
&lt;h3 id="2-コンパイラ-mincc"&gt;
 2. コンパイラ: mincc
 &lt;a class="heading-link" href="#2-%e3%82%b3%e3%83%b3%e3%83%91%e3%82%a4%e3%83%a9-mincc"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/cpuex1/mincc" class="external-link" target="_blank" rel="noopener"&gt;mincc&lt;/a&gt;という名前のコンパイラを作った。&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;せっかくのCPU実験ということで&lt;a href="https://github.com/esumii/min-caml" class="external-link" target="_blank" rel="noopener"&gt;mincaml&lt;/a&gt;や&lt;a href="https://github.com/utokyo-compiler/mincaml-rs" class="external-link" target="_blank" rel="noopener"&gt;mincaml-rs&lt;/a&gt;などの出来合いのコンパイラに頼らずに書きたいという想いが強く、Haskellを使ってフルスクラッチで作成した。Haskellを選択したのは、個人的に経験が浅いあるいは全くないかつ面白そうな言語を使いたかったからで、該当するJulia, Nim, Gleam, F#の中から選んだ。結果的にHaskellで頻出の諸概念とお友達になれたのでかなり良い選択だったと思う。シミュ完動したのは12/19 0:59だった。&lt;/p&gt;
&lt;p&gt;コンパイラを実装する上で2つのルールを自分に課した。mincamlやmincaml-rsのソースコードをそのまま移植しないことと、過去のコンパイラ係が残したブログや最適化に関する本を一切参考にしないことである。&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;前者は、元からあるコンパイラをただ別言語に移植しただけでは「フルスクラッチ」ということはできないという信念からである。後者は、過去のコンパイラ係のブログを読むと、その人が思う最適解を知ってしまうので、試行錯誤の余地が削られてしまうのではないか、と考えたからである。後者については後ほど改めて言及する。&lt;/p&gt;
&lt;p&gt;フルスクラッチする上で障害となったのは、mincamlの構文が「仕様 = 実装」となっているところである。一応資料はあるものの優先順位や具体的な構文に曖昧な部分が多く、パーサーを書くためにmincamlの実装を腰を据えて読み解く必要があった。それ以外は、時間こそかかるもののしがらみもないので伸び伸びと実装を行うことができた。&lt;/p&gt;
&lt;p&gt;コンパイラ係でこの記事を見ている人が一番気になるのは最適化であろう。残念なことにminccには「新規性のある」最適化は多分積まれていないと思う。ここで「思う」と言ったのは、過去のコンパイラ係のブログを読んでいないので、どれが「新規性のある」ものかどうかわからないからである。少なくとも、2ヶ月間で編み出したものが既出でないとは到底思えないのでこのような書き方をした。&lt;/p&gt;
&lt;p&gt;さて、minccでは最適化はmiddle-endとback-endでそれぞれ独立して行われる。まず、Middle-endで行われる最適化を列挙しよう。名前はその最適化が実装されているモジュール名をそのまま利用している。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;最適化&lt;/th&gt;
 &lt;th&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;BoolOperations&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;if&lt;/code&gt;文のうち、bool演算を使って書けるものを展開する。例えば、&lt;code&gt;if a then not b else b&lt;/code&gt;を&lt;code&gt;xor a b&lt;/code&gt;に変換する。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;CompMerging&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;if&lt;/code&gt;文のうち、&lt;code&gt;let a = b &amp;lt; c in .... in if a then d else e&lt;/code&gt;のようなものを&lt;code&gt;if b &amp;lt; c then d else e&lt;/code&gt;に変換する。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;ConstFold&lt;/td&gt;
 &lt;td&gt;定数畳み込み。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;CSE&lt;/td&gt;
 &lt;td&gt;共通部分式削除をする。式がpureかどうかの判定はかなり甘い。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;IfMerging&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;if c then let a1 = b in ... else let a2 = b in ...&lt;/code&gt;を&lt;code&gt;let a = b in if c then ... else ...&lt;/code&gt;に変換する。最適化というよりはコードサイズ削減のために入れている。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Inlining&lt;/td&gt;
 &lt;td&gt;関数のインライン化をする。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;LoopArgsElim&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;loop a := b e&lt;/code&gt;のうち、&lt;code&gt;a&lt;/code&gt;が&lt;code&gt;e&lt;/code&gt;で変更されない場合、&lt;code&gt;a&lt;/code&gt;を削除する。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;LoopDetection&lt;/td&gt;
 &lt;td&gt;再帰関数からループを検出し、&lt;code&gt;loop&lt;/code&gt;文に変換する。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;ReadOnly&lt;/td&gt;
 &lt;td&gt;1度しか書き込みが起こらない配列を検知し、変数に分解する。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;StripCondition&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;if c then let ... in 1 else let ... in 0&lt;/code&gt;を&lt;code&gt;let () = if c then let ... in () else let ... in () in c&lt;/code&gt;にする。&lt;code&gt;if&lt;/code&gt;文の結果により次の&lt;code&gt;if&lt;/code&gt;文の分岐が決まるパターンに利く。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;SwapIf&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;if c then ... else ()&lt;/code&gt;を&lt;code&gt;if c then () else ...&lt;/code&gt;にする。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;UnusedElim&lt;/td&gt;
 &lt;td&gt;不要定義削除。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;VarMerging&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;let a = b in e&lt;/code&gt;を&lt;code&gt;[b/a]e&lt;/code&gt;にする。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Back-endではLLVMのBasicBlockのような形式でコードを保持している。Back-endでの最適化は、以下の通りである。&lt;/p&gt;</description></item><item><title>[CTF] SECCON CTF 13 Domestic Finals writeup</title><link>https://caphosra.net/posts/2025-03-06-seccon-final/</link><pubDate>Thu, 06 Mar 2025 16:24:45 +0900</pubDate><guid>https://caphosra.net/posts/2025-03-06-seccon-final/</guid><description>&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"&gt;&lt;/script&gt;
&lt;p&gt;SECCON CTF 13の国内決勝にTSGのrev枠として参加し、3位を取ることができた。自分が張り付いていたAllegroの順位は8位だったので心境は複雑だが、ともあれwriteupを書きたいと思う。&lt;/p&gt;
&lt;h2 id="king-of-the-hill-allegro"&gt;
 King of the Hill: Allegro
 &lt;a class="heading-link" href="#king-of-the-hill-allegro"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;人生初のKing of the Hillとなった。　x86_64のバイナリが与えられ、そのバイナリの出力を変えずにいかに高速化できるかを競う問題であった。実質的にrevパートと最適化を行うパートに二分されていた。&lt;/p&gt;
&lt;p&gt;より詳細なルールとしては、1ラウンド2-3時間で各ラウンドの最初にx86_64のバイナリが配布された。プレイヤーはそれを高速化したものを提出すると、5分おきに、そのプログラムが十分高速でかつテストを通る場合、その速度に応じた点が加算されていくというものであった。これが6ラウンド、つまり会場が空いている間ずっとあったので、Allegroを取り組むプレイヤーはこの問題に張り付いておかないといけなかった。&lt;/p&gt;
&lt;h3 id="round1-普通のx86_64のプログラム"&gt;
 Round1: &amp;ldquo;普通&amp;quot;のx86_64のプログラム
 &lt;a class="heading-link" href="#round1-%e6%99%ae%e9%80%9a%e3%81%aex86_64%e3%81%ae%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Ghidraでデコンパイルすると以下のようなCのコードが得られた。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;long&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;long&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;long&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;lVar1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;long&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;lVar2&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;long&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;lVar3&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;==&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;else&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;==&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;else&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;==&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;else&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;lVar1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;lVar2&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;lVar3&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;-&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;((&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;lVar1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;lVar2&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;-&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;lVar3&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;return&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;param_1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;undefined8&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;main&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;void&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;undefined8&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;uVar1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;long&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;in_FS_OFFSET&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;ulong&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;local_18&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;long&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;local_10&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;local_10&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;long&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;in_FS_OFFSET&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x28&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00b1f7"&gt;__isoc99_scanf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;DAT_00102004&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;local_18&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;3&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;local_18&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00b1f7"&gt;sleep&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;5&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;uVar1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;local_18&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00b1f7"&gt;printf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;%llu&lt;/span&gt;&lt;span style="color:#d26464;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;uVar1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;local_10&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;!=&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;long&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;in_FS_OFFSET&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x28&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;))&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8a93a5;font-style:italic"&gt;/* WARNING: Subroutine does not return */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00b1f7"&gt;__stack_chk_fail&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;return&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&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;sleep(5)&lt;/code&gt;を除去しつつ、&lt;code&gt;f&lt;/code&gt;の再帰をループにして&lt;code&gt;-O3&lt;/code&gt;オプションをつけてコンパイルして提出した。&lt;/p&gt;</description></item><item><title>Lean4と戯れるのに役に立ったもの</title><link>https://caphosra.net/posts/2024-12-06-lean4-tips/</link><pubDate>Fri, 06 Dec 2024 07:51:57 +0900</pubDate><guid>https://caphosra.net/posts/2024-12-06-lean4-tips/</guid><description>&lt;p&gt;この記事は, &lt;a href="https://adventar.org/calendars/10445" class="external-link" target="_blank" rel="noopener"&gt;理情 Advent Calendar 2024&lt;/a&gt;の12/6の記事です. この文章を読むのに飽きたら是非他の人の書いた記事を読んでみてください.&lt;/p&gt;
&lt;h2 id="はじめに"&gt;
 はじめに
 &lt;a class="heading-link" href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;今年4月ごろに, 元から興味を持っていたプログラミング言語もとい定理証明支援系のLean4に満を持して入門しました.&lt;/p&gt;
&lt;p&gt;しかしながら, 単に情報がないからなのか自分の検索能力が低いからなのか, 普通に手元では証明できているのにLean4にどのように書き下せばいいのかわからない場面が何度もあったので, この記事では初心者なりにかなり便利でもっと早く知っておきたかったいくつかのトピックを, 少しでも証明を楽しむためのヒントとして記したいと思います. かなり雑多だと思うのですが, どうかお付き合いください.&lt;/p&gt;
&lt;p&gt;注意点として, Lean4の公式の &lt;a href="https://leanprover.github.io/theorem_proving_in_lean4/" class="external-link" target="_blank" rel="noopener"&gt;Theorem Proving in Lean 4&lt;/a&gt; に載っている内容はこの記事では基本省略してあるので, 基本的な使い方を習得するのにはこの記事は向かないと思います.&lt;/p&gt;
&lt;p&gt;また, 直観論理の世界から抜け出したくない方には申し訳ないのですがこの記事では古典論理を前提としており, 断りなく&lt;code&gt;open Classical&lt;/code&gt;されていることを仮定しています.&lt;/p&gt;
&lt;h2 id="1-lean-4-vscode-extension"&gt;
 1. Lean 4 VSCode Extension
 &lt;a class="heading-link" href="#1-lean-4-vscode-extension"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;かなり当たり前かもしれませんが, この拡張を入れるとLean4のsyntax highlightingや入力予測がされるようになります. それだけでなく, 現在の証明の流れがとても掴みやすくなるInfoViewが見れるようになります.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://caphosra.net/images/2024-12-06/lean4_screenshot1.jpg" alt="Lean4 info view screenshot"&gt;&lt;/p&gt;
&lt;p&gt;左に書かれているのがLean4の証明で, 右がその様子をわかりやすく表示してくれるInfoViewです. 写真では119行目にカーソルが合っているので119行目における証明の進行状況が表示されています.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://caphosra.net/images/2024-12-06/lean4_screenshot2.jpg" alt="Lean4 info view screenshot"&gt;&lt;/p&gt;
&lt;p&gt;このviewの見方をざっと解説します.&lt;/p&gt;
&lt;p&gt;まず, 画像でオレンジ色で表示されているのが, すでに導入された命題のリストです. 仮定として証明に使って良い名前付けされた命題が並んでいます. Curry-Howard同型対応と呼ばれる, ざっくりといえば関数と型はそれぞれ証明と命題に対応するという対応関係から, 現在のスコープにある変数とその型であるとみることもできます.&lt;/p&gt;
&lt;p&gt;次に画像で一番下に表示されているのが, この証明のゴール, つまり示すべきものです. このゴールは, 必ずしもある定理の証明をする間ずっと同じというわけでもなく, 場合分けの途中や補題の証明中などに変わることもあるので, 今自分が何を示そうとしているのか意識するためにも常に把握しておきましょう.&lt;/p&gt;</description></item><item><title>[CTF] SECCON 13 Quals writeup</title><link>https://caphosra.net/posts/2024-11-25-seccon-13-q/</link><pubDate>Mon, 25 Nov 2024 22:33:41 +0900</pubDate><guid>https://caphosra.net/posts/2024-11-25-seccon-13-q/</guid><description>&lt;p&gt;caphosraです. SECCON 13 QualsにTSGで参加しました. 結果は国内7位ということで決勝には進めそうです. 本当にチームメンバーが凄すぎる.&lt;/p&gt;
&lt;p&gt;自分はpwnのParagraphとrevのpackedを解きました. 記録上はrevのJumpも解いたことになっていますが, 雑にフラグをguessしただけなので&amp;quot;解けた&amp;quot;ことにしていいものか&amp;hellip;? どうguessしたかは書きます.&lt;/p&gt;
&lt;h2 id="rev-packed-93pt-119teams"&gt;
 rev: packed (93pt, 119teams)
 &lt;a class="heading-link" href="#rev-packed-93pt-119teams"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;gdbをアタッチして手動で前から実行していくと, 入力文字列をある2つのバイト列とxorして0になるかどうかを判定していることがわかる. xorの性質から&lt;code&gt;(a xor b) xor c == 0&lt;/code&gt;は&lt;code&gt;a == b xor c&lt;/code&gt;なので, この2つのバイト列のxorをとってあげれば良い.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;a&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0xe8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x4a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x83&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xf9&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x49&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x75&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x44&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x53&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x57&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x48&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x8d&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x4c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x37&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xfd&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x5e&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x56&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x5b&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xeb&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x2f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x48&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x39&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xce&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x73&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x32&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x56&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x5e&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xac&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x3c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x80&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x72&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xa&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x3c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x8f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x77&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x6&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x80&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x7e&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xfe&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x74&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x6&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x2c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xe8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x3c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;b&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0xbb&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x43&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x43&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x4f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xcd&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x82&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x1c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x25&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x1c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xc&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x24&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x7f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xf8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x2e&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x68&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xcc&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x2d&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x9&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x3a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xb4&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x48&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x78&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x56&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xaa&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x2c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x42&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x3a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x6a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xcf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xdf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x14&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x3a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x4e&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xd0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x1f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x37&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xe4&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x17&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x90&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x39&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x2b&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x65&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x1c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x8c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0x7c&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;text&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;i&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;text&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;chr&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;^&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;text&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;FLAG: &lt;code&gt;SECCON{UPX_s7ub_1s_a_g0od_pl4c3_f0r_h1din6_c0d3}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Flagを見て初めてUPXに思いを馳せることが想定されているのか, と思った. 時代はやっぱり人の手でやるまごころデバッグですよ.&lt;/p&gt;
&lt;h2 id="pwn-paragraph-125pt-65teams"&gt;
 pwn: Paragraph (125pt, 65teams)
 &lt;a class="heading-link" href="#pwn-paragraph-125pt-65teams"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;ソースコードを見ると露骨にFormat String Attackしてね〜という顔をした&lt;code&gt;printf&lt;/code&gt;がいる.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// char name[24];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;&lt;/span&gt;&lt;span style="color:#00b1f7"&gt;scanf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;%23s&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;name&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00b1f7"&gt;printf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;name&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00b1f7"&gt;printf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34; answered, a bit confused.&lt;/span&gt;&lt;span style="color:#d26464;font-weight:bold"&gt;\n\&amp;#34;&lt;/span&gt;&lt;span style="color:#98c379"&gt;Welcome to SECCON,&lt;/span&gt;&lt;span style="color:#d26464;font-weight:bold"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#98c379"&gt; the cat greeted %s warmly.&lt;/span&gt;&lt;span style="color:#d26464;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;name&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで問題となるのはFormat String Attackでどこを書き換えてあげれば良いかである. このscanfでpayloadを送るタイミングではglibcのアドレスもわからないのでリターンアドレスを書き換えてROPするのは辛そうなので, GOTを書き換えてその下の&lt;code&gt;printf&lt;/code&gt;を&lt;code&gt;scanf&lt;/code&gt;に挿げ替えることを考えた. こうするとちょうど下の行が,&lt;/p&gt;</description></item><item><title>[CTF] IERAE CTF 2024 writeup</title><link>https://caphosra.net/posts/2024-09-22-ierae-ctf/</link><pubDate>Sun, 22 Sep 2024 16:10:12 +0900</pubDate><guid>https://caphosra.net/posts/2024-09-22-ierae-ctf/</guid><description>&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"&gt;&lt;/script&gt;
&lt;p&gt;caphosraです. IERAE CTF 2024にTSGとして参加しました. Cryptoのderangement, Weak PRNGとmiscのgnalangの計3問解いたのでwriteupを書きたいと思います.&lt;/p&gt;
&lt;p&gt;分量と難易度的にgnalangのwriteupがメインになります.&lt;/p&gt;
&lt;h2 id="crypto-derangement"&gt;
 Crypto: derangement
 &lt;a class="heading-link" href="#crypto-derangement"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;長さ15のランダムな文字列をランダムに並べ替えたものが与えられ, その元の文字列を求める問題. 並び替えた文字列のどの文字も元の文字列と異なることが保証されている.&lt;/p&gt;
&lt;p&gt;とりあえず回数上限近くまで並べ替え後の文字列を受け取って, 各 \(i\) 文字目についてありえない文字のリストを構成する. その上で, そのリストに含まれていない文字を順に並べていけば良い.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-weight:bold;font-style:italic"&gt;#!/usr/bin/python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;from&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;ptrlib&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;proc&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Socket&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;XXX.XXX.XXX.XXX&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;55555&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;LENGTH&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;LOOP&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;280&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;banned&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;_&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;LENGTH&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;banned&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;append&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;word&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;_&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;LOOP&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;proc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;sendlineafter&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&amp;gt; &amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;proc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;recvuntil&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;hint: &amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;hint&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;proc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;recvline&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;decode&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;not&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;word&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;word&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;hint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;assert&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;hint&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;==&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;LENGTH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;i&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;LENGTH&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;hint&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;not&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;banned&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;banned&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;append&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;hint&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;determined&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;i&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;LENGTH&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;len(banned[&lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;]) = &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;banned&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;])&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;banned&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;])&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;!=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;LENGTH&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;-&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;proc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;close&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;c&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;word&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;c&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;not&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;banned&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;determined&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;magic word = &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;determined&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;proc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;sendlineafter&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&amp;gt; &amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;proc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;sendlineafter&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&amp;gt; &amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;determined&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;proc&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;interactive&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下の通り.&lt;/p&gt;</description></item><item><title>[CTF] SECCON CTF 2023 Finals Domestic writeup</title><link>https://caphosra.net/posts/2024-01-07-seccon-final/</link><pubDate>Sun, 07 Jan 2024 20:14:04 +0900</pubDate><guid>https://caphosra.net/posts/2024-01-07-seccon-final/</guid><description>&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"&gt;&lt;/script&gt;
&lt;p&gt;SECCON CTF 2023の国内決勝にTSGとして参加しました. 1.5問くらい解いたのでwriteupを書きたいと思います.&lt;/p&gt;
&lt;h2 id="reversing-remov"&gt;
 Reversing: ReMOV
 &lt;a class="heading-link" href="#reversing-remov"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Reversingの問題. 大量の意味のないmov, movaps命令が並んでいるバイナリが与えられ, そのバイナリが受理するFlagを考えるというもの.&lt;/p&gt;
&lt;p&gt;GhidraでさっとDisassembleして読もうとしたが, 当然まともに読めそうになかったのでgdbで実行しながら怪しい部分を探した. まず, 最初の方は文字列の長さを見て32文字であるかを確認する部分がある. その次に, 文字列の先頭が&lt;code&gt;SECCON{&lt;/code&gt;であるかどうかを判定する部分と最後が&lt;code&gt;}&lt;/code&gt;で終了しているか確認する部分がある.&lt;/p&gt;
&lt;p&gt;ここまでは, 適当に&lt;code&gt;SECCON{AAA....A}&lt;/code&gt;のような長さ32の文字列を与えておけば特に問題はない. さて, ここから引数を8bytesごとにチェックするパートに入る. 具体的には8bytesを切り出して, ある固定値とxorを取ってから別の固定値と比較する操作が4回行われる. 一見, もう一度xorを取ることで容易にFlagを復号できそうだが, このままでは先頭8bytesの値が&lt;code&gt;L\xbd~\xb3HN{y&lt;/code&gt;でなければならなくなり, これは先頭8bytesが&lt;code&gt;SECCON{&lt;/code&gt;であることと矛盾する.&lt;/p&gt;
&lt;p&gt;もう一度用心深く探ってみると, 途中で不審にptraceを呼んでいる部分がある. これでgdbのようなデバッガーをattachしているかどうか判定し, その返り値によってxorをとる固定値を変更しているようである. そこで, ptraceが呼ばれた後に&lt;code&gt;rax&lt;/code&gt;を変えてしまえば問題ないだろうと推測し, 実際うまく行った. 以下のように書けばこれを実現できる.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;b *0x555555555096&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;set $rax = 0&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実際にその場で書いたソースコードはこんな感じ. 8bytesごとに答えが出てくる.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-weight:bold;font-style:italic"&gt;#!/bin/python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;gdb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;b&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;SECCON&lt;/span&gt;&lt;span style="color:#98c379"&gt;{y3t_4n0th3r_m0vfuAAAAAAA}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;file ./remov&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;o&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;starti &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;decode&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;to_string&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;True&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;o&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;b *0x555555555096&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;b *0x555555555605&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;b *0x555555555637&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;b *0x55555555567d&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;set $rax = 0&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;current&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;from_bytes&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;:&lt;/span&gt;&lt;span style="color:#d19a66"&gt;8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;],&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;little&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;a&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;for&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;i&lt;/span&gt; &lt;span style="color:#b756ff;font-weight:bold"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;4&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;output1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;gdb&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;execute&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;reg&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;to_string&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;=&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;True&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;output1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;m&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;re&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;search&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;r&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#39;(0x.+)&amp;#39;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;output1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;append&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;m&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;group&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;),&lt;/span&gt; &lt;span style="color:#d19a66"&gt;16&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;rax: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;hex&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;])&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;current&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;current&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;^&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0x8&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;i&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;check: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;hex&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;current&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;assert&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;==&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;e1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xbde671e813ba0ec4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;e2&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xfe313878bfd3832a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;e3&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xefe4966fa7747a84&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;e4&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0xac6a45cfcc93f053&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;from&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;pwn&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;import&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;ans1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;e1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;^&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;ans2&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;e2&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;^&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;ans3&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;e3&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;^&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;ans4&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;e4&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;^&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;test&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;from_bytes&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;flag&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;:&lt;/span&gt;&lt;span style="color:#d19a66"&gt;8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;],&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;little&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;^&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;possible: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;ans1&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;assume: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;hex&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;test&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;ans1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ans1&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;to_bytes&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;little&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;ans1: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;ans1&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;ans2&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ans2&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;to_bytes&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;little&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;ans2: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;ans2&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;ans3&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ans3&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;to_bytes&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;little&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;ans3: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;ans3&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;ans4&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ans4&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;to_bytes&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;8&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;little&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;f&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;ans4: &lt;/span&gt;&lt;span style="color:#98c379"&gt;{&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;ans4&lt;/span&gt;&lt;span style="color:#98c379"&gt;}&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;FLAG: &lt;code&gt;SECCON{y3t_4n0th3r_m0vfu5c4t0r?}&lt;/code&gt;&lt;/p&gt;</description></item><item><title>自作言語を作るまでに使えるツールたち</title><link>https://caphosra.net/posts/2020-10-03-original-language/</link><pubDate>Sat, 03 Oct 2020 21:36:42 +0900</pubDate><guid>https://caphosra.net/posts/2020-10-03-original-language/</guid><description>&lt;p&gt;遂に、自作言語kaprinoが無事完成したのでその記念に、自作言語を実装するにあたって
使った物をこの記事で紹介したいと思います。実際に自作言語を作ろうと思っても
何から手を付けていいのか分からなくなってしまうことがあることは想像に難くないので、
その様な人への羅針盤のような記事になることを期待しています。&lt;br&gt;
ただ、それぞれの使い方まで言及すると記事の量がどえらい事になるので、使い方はいずれ書こうと思います。&lt;/p&gt;
&lt;p&gt;これから自作言語作る予定がある方は必見です!&lt;br&gt;
もう既に自作言語を実装した経験がある方は&lt;del&gt;お手柔らかにお願いします。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;自作言語kaprinoのソースコードを管理しているrepositoryへのリンクと自作のオンラインコンパイラ(この話はまた別の記事で)です。もし良かったら見てみてください。&lt;br&gt;
&lt;a href="https://github.com/kaprino-lang/kaprino" class="external-link" target="_blank" rel="noopener"&gt;Github kaprino-lang&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kaprino-lang.github.io/online/" class="external-link" target="_blank" rel="noopener"&gt;Kaprino Online Compiler&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="まず自作言語を何故作ろうと思ったのか"&gt;
 まず自作言語を何故作ろうと思ったのか
 &lt;a class="heading-link" href="#%e3%81%be%e3%81%9a%e8%87%aa%e4%bd%9c%e8%a8%80%e8%aa%9e%e3%82%92%e4%bd%95%e6%95%85%e4%bd%9c%e3%82%8d%e3%81%86%e3%81%a8%e6%80%9d%e3%81%a3%e3%81%9f%e3%81%ae%e3%81%8b"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;なぜでしょうね。&lt;/del&gt;&lt;br&gt;
自作言語を作る人がよく言うのは、使っている既存の言語に不満があって自分の好みにあった言語を作ってみたい、という感じでしょうが、
私が自作言語を作ろうと思った理由は、本当になんとなくです。自作言語という言葉の響きによるものだと言えるかもしれませんし、
単純に自分は気付いていないだけで言語に不満があったのかもしれません。&lt;br&gt;
これは本題ではないのでこれくらいにしておきます。&lt;/p&gt;
&lt;h2 id="言語を動かすまでを大雑把に把握"&gt;
 言語を動かすまでを大雑把に把握
 &lt;a class="heading-link" href="#%e8%a8%80%e8%aa%9e%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%e3%81%be%e3%81%a7%e3%82%92%e5%a4%a7%e9%9b%91%e6%8a%8a%e3%81%ab%e6%8a%8a%e6%8f%a1"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;さて本題に入りましょう。&lt;br&gt;
これから言語を作るまでに使ったものを紹介してゆく訳ですが、そもそも私の自作言語kaprinoが
どのように動いているか説明したいと思います。&lt;/p&gt;
&lt;p&gt;まず、kaprinoは静的な型付けの言語で、実行前にコンパイルを必要とします。&lt;br&gt;
&lt;strong&gt;コンパイル&lt;/strong&gt; とはソースコードを機械語に変換することです。このコンパイルは通常、以下の様な作業を行います。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Lexer&lt;/strong&gt; (字句解析器) と呼ばれるものでソースコードを &lt;strong&gt;Token&lt;/strong&gt; (小さい文字列)に分解&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parser&lt;/strong&gt; (構文解析器) と呼ばれるものでTokenを &lt;strong&gt;AST&lt;/strong&gt; (抽象構文木)に変換&lt;/li&gt;
&lt;li&gt;ASTを低級言語(機械語やアセンブリ言語)に変換&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ということはこの三つを行うプログラムを書くことが出来れば自作言語のコンパイラを手にする事ができます!&lt;/p&gt;
&lt;p&gt;しかし、愚直にこれらを一から実装すると途轍もない時間がかかります。そこでライブラリを使って実装していくことになります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;以下、C++で書くことを前提として話を進めます&lt;/strong&gt;&lt;br&gt;
C#とかJavaとかRustとかでもいいんですがそれらは&lt;del&gt;記事の対象外ということで&lt;/del&gt;&lt;/p&gt;
&lt;h2 id="1-lexerを実装する"&gt;
 1. Lexerを実装する
 &lt;a class="heading-link" href="#1-lexer%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Lexerはこれから行う3つの事の中では最も簡単に実装ができます。自力実装もそこまで難しくないです。&lt;br&gt;
しかし、今回のテーマはツール紹介ということなので自力でやりたいよ、という方は無視します。&lt;br&gt;
&lt;del&gt;頑張って下さい。応援しています。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;LexerをC++で実装する時に使われる有名なツール(ライブラリ)として挙げられるのはこの三つです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;lex&lt;/strong&gt; (伝統的)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;flex&lt;/strong&gt; (再構築されたlex)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Antlr4&lt;/strong&gt; (新勢力)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;flexはlexと構文がほとんど同じなので、lexを使うくらいならより新しいflexを使ったほうがいいと思います。&lt;br&gt;
flexとAntlr4について言えば、どちらを選んでも困ることは起こらないので、それぞれ検索してみて、サンプルコードにシンパシーを感じた方を使えばいいと思います。&lt;/p&gt;
&lt;p&gt;個人的にはAntlr4で書いた方が読みやすいと思ったので、kaprinoにもAntlr4を使っています。&lt;/p&gt;
&lt;h2 id="2-parserを実装する"&gt;
 2. Parserを実装する
 &lt;a class="heading-link" href="#2-parser%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;ParserをC++で実装する時に使われる有名なツール(ライブラリ)として挙げられるのはこの三つです。&lt;/p&gt;</description></item><item><title>C++で全てのstd::minやstd::maxにエラーが出た時の対処法</title><link>https://caphosra.net/posts/2020-07-14-cpp-conflict/</link><pubDate>Tue, 14 Jul 2020 21:53:29 +0900</pubDate><guid>https://caphosra.net/posts/2020-07-14-cpp-conflict/</guid><description>&lt;p&gt;今日、先程あった出来事なのですが、手元のLinux環境で動いているコードをWindows上でビルドしようとしたら突如大量のエラーが発生。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(286,1): error C2059: syntax error: &amp;#39;)&amp;#39; [D:\a\kaprino\kaprino\build\kprc.vcxproj]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(346,19): error C2589: &amp;#39;(&amp;#39;: illegal token on right side of &amp;#39;::&amp;#39; [D:\a\kaprino\kaprino\build\kprc.vcxproj]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(346,1): error C2062: type &amp;#39;unknown-type&amp;#39; unexpected [D:\a\kaprino\kaprino\build\kprc.vcxproj]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(346,1): error C2059: syntax error: &amp;#39;)&amp;#39; [D:\a\kaprino\kaprino\build\kprc.vcxproj]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(579,20): error C2589: &amp;#39;(&amp;#39;: illegal token on right side of &amp;#39;::&amp;#39; [D:\a\kaprino\kaprino\build\kprc.vcxproj]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(579,1): error C2062: type &amp;#39;unknown-type&amp;#39; unexpected [D:\a\kaprino\kaprino\build\kprc.vcxproj]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C:\Program Files (x86)\LLVM\include\llvm/ADT/StringRef.h(579,1): error C2059: syntax error: &amp;#39;)&amp;#39; [D:\a\kaprino\kaprino\build\kprc.vcxproj]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;std::min&lt;/code&gt;と&lt;code&gt;std::max&lt;/code&gt;でした。&lt;/p&gt;</description></item><item><title>[C# tips] #3 C#を対話形式で実行しよう</title><link>https://caphosra.net/posts/2020-05-24-csharptips3/</link><pubDate>Sun, 24 May 2020 06:36:13 +0900</pubDate><guid>https://caphosra.net/posts/2020-05-24-csharptips3/</guid><description>&lt;p&gt;簡単な計算をする時にPythonを使っていませんか?&lt;br&gt;
対話形式で実行するのはとても便利ですよね。しかし、これと同じことはC#でも出来るのです。&lt;/p&gt;
&lt;h2 id="そもそも対話形式とは"&gt;
 そもそも対話形式とは?
 &lt;a class="heading-link" href="#%e3%81%9d%e3%82%82%e3%81%9d%e3%82%82%e5%af%be%e8%a9%b1%e5%bd%a2%e5%bc%8f%e3%81%a8%e3%81%af"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;ユーザーがプログラムを入力すると、それを評価してくれるのが対話形式です。&lt;br&gt;
Pythonを使ったことがあれば、以下のような感じです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3.14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d19a66"&gt;314.0&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;h2 id="cって静的言語だから無理なんじゃないですか"&gt;
 C#って静的言語だから無理なんじゃないですか?
 &lt;a class="heading-link" href="#c%e3%81%a3%e3%81%a6%e9%9d%99%e7%9a%84%e8%a8%80%e8%aa%9e%e3%81%a0%e3%81%8b%e3%82%89%e7%84%a1%e7%90%86%e3%81%aa%e3%82%93%e3%81%98%e3%82%83%e3%81%aa%e3%81%84%e3%81%a7%e3%81%99%e3%81%8b"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Pythonは動的実行をしている(実行時に型変換等を行っている)のに対して、&lt;br&gt;
C#はC++などと同じで静的言語であるので実行にはコンパイルが不可欠なはずです。&lt;br&gt;
コンパイルが必要ということは、時間がかかりすぎるので対話形式で実行するのには致命的&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E" class="external-link" target="_blank" rel="noopener"&gt;Wikipedia 動的プログラミング言語&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;しかし、C#を動的に実行したいと考える人はいるようで&lt;/p&gt;
&lt;h2 id="cを対話形式で実行する拡張"&gt;
 C#を対話形式で実行する拡張
 &lt;a class="heading-link" href="#c%e3%82%92%e5%af%be%e8%a9%b1%e5%bd%a2%e5%bc%8f%e3%81%a7%e5%ae%9f%e8%a1%8c%e3%81%99%e3%82%8b%e6%8b%a1%e5%bc%b5"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;世の中にはC#を対話形式で実行したいと思う人が少なからずいるのでしょう。C#を標準で対話形式で実行することは出来ませんが、
拡張を使用することでできるようになります。&lt;br&gt;
いくつか拡張が存在するのでご紹介します。&lt;/p&gt;
&lt;h3 id="c-repl"&gt;
 C# REPL
 &lt;a class="heading-link" href="#c-repl"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;有名な対話形式の拡張として、オープンソースのC#の先駆けとなったMonoプロジェクトが提供する
&lt;a href="https://www.mono-project.com/docs/tools&amp;#43;libraries/tools/repl/" class="external-link" target="_blank" rel="noopener"&gt;C# REPL&lt;/a&gt;があります。&lt;/p&gt;
&lt;p&gt;使い方は簡単です。Monoをインストールして&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ csharp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;と実行するだけです。&lt;br&gt;
以下の様にC#を対話形式で実行することが可能です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ csharp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;csharp&amp;gt; using System&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;csharp&amp;gt; var &lt;span style="color:#dcaeea"&gt;a&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; 10&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;csharp&amp;gt; a * a * Math.PI&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;314.159265358979
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mono C#を使用している方は今すぐ試すことができます。&lt;/p&gt;
&lt;h3 id="dotnet-script"&gt;
 dotnet script
 &lt;a class="heading-link" href="#dotnet-script"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;C# REPLはMonoプロジェクトのものでした。一方でこちらは .NET Coreで使うことができるものです。&lt;br&gt;
&lt;a href="https://github.com/filipw/dotnet-script" class="external-link" target="_blank" rel="noopener"&gt;dotnet script&lt;/a&gt;は .NET CoreにGlobal toolとして以下のコマンドを使用してインストール出来ます。&lt;br&gt;
.NET Core 2.1以上が必要なことに注意してください。&lt;/p&gt;</description></item><item><title>GATAGATA Mental Shooting</title><link>https://caphosra.net/archives/gatagata/</link><pubDate>Fri, 22 May 2020 19:02:15 +0900</pubDate><guid>https://caphosra.net/archives/gatagata/</guid><description>&lt;script src="Build/UnityLoader.js" async&gt;&lt;/script&gt;
&lt;script&gt;window.onload=function(){let check=false;(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);if(check){document.getElementById("unityContainer").innerHTML="&lt;p&gt;このゲームはスマートフォンに対応していません ('Д')&lt;br/&gt;&lt;br/&gt;詳細はこちらから:&lt;br/&gt;&lt;a&gt;https://docs.unity3d.com/Manual/webgl-browsercompatibility.html&lt;/a&gt;&lt;/p&gt;";}else{document.getElementById("unityContainer").style = "width: 800px; height: 450px; margin: auto";UnityLoader.instantiate('unityContainer', 'Build/WebGL.json');}}&lt;/script&gt;
&lt;div id="unityContainer"&gt;&lt;/div&gt;
&lt;p&gt;開発当時、Unityを始めたばかりだったので、デバッグでメンタルがGATAGATAになりました。&lt;br&gt;
移動: WASD or 矢印キー, 攻撃：クリック&lt;/p&gt;
&lt;script src="https://utteranc.es/client.js"
 repo= "caphosra/caphosra.github.io"
 issue-term="title"
 label="comments"
 theme="github-light"
 crossorigin="anonymous"
 async&gt;
&lt;/script&gt;</description></item><item><title>[LLVM] CreateGlobalStringPtrがクラッシュするときの対処法</title><link>https://caphosra.net/posts/2020-05-02-llvm-string-ptr/</link><pubDate>Sat, 02 May 2020 06:12:01 +0900</pubDate><guid>https://caphosra.net/posts/2020-05-02-llvm-string-ptr/</guid><description>&lt;p&gt;CreateGlobalStringPtrをif文のブロックの中で失敗したので、それを解決する方法をご紹介します。&lt;/p&gt;
&lt;h2 id="発生したエラー"&gt;
 発生したエラー
 &lt;a class="heading-link" href="#%e7%99%ba%e7%94%9f%e3%81%97%e3%81%9f%e3%82%a8%e3%83%a9%e3%83%bc"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;先ずは愚直にif文を実装していきましょう。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C++" data-lang="C++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;auto&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ifblock&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;BasicBlock&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Create&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;module&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;getContext&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(),&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;then&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;auto&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;mergeblock&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;BasicBlock&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Create&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;module&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;getContext&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(),&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;merged&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&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="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C++" data-lang="C++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;builder&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;CreateCondBr&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;match&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ifblock&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;mergeblock&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;builder&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;SetInsertPoint&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;ifblock&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;auto&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;strptr&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;builder&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;CreateGlobalStringPtr&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt; &lt;span style="color:#8a93a5;font-style:italic"&gt;// ERROR !
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;builder&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;CreateBr&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;mergeblock&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;その後でブランチを組込んで、if文の中に&lt;code&gt;SetInsertPoint&lt;/code&gt;してから、&amp;ldquo;Hello World&amp;quot;という文字列をグローバル空間に確保してポインターを取得します。&lt;br&gt;
この際、期待通りの動作であればグローバル空間に&amp;quot;Hello World&amp;quot;と書き込んでから、そのポインターを取得するという操作になります。&lt;br&gt;
今、適当な関数の中のBasicBlockで、この操作を行ったものと仮定すれば、以下のようなコードとほぼ同等なはずです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C++" data-lang="C++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;const&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;char&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;str&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;void&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;somefunc&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;bool&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;match&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;match&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8a93a5;font-style:italic"&gt;// Create global string poiter and it points &amp;#34;HelloWorld&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;auto&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;strptr&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;str&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;}&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;h2 id="basicblockの親の関数に注意"&gt;
 BasicBlockの親の関数に注意!
 &lt;a class="heading-link" href="#basicblock%e3%81%ae%e8%a6%aa%e3%81%ae%e9%96%a2%e6%95%b0%e3%81%ab%e6%b3%a8%e6%84%8f"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;鋭い方はもうお気づきでしょうが、(私は全く鋭くないので気づくのに2時間かかりました)&lt;br&gt;
&lt;code&gt;ifblock&lt;/code&gt;と&lt;code&gt;mergeblock&lt;/code&gt;の親の関数が指定されていません。&lt;code&gt;BasicBlock::Create&lt;/code&gt;は親の関数を指定しなくても使えるので、意外と気づかないではまってしまいました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C++" data-lang="C++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;BasicBlock&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Create&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;LLVMContext&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Context&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;const&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Twine&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Name&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Function&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Parent&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;=&lt;/span&gt;&lt;span style="color:#76a9f9"&gt;nullptr&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;BasicBlock&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;*&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;InsertBefore&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;=&lt;/span&gt;&lt;span style="color:#76a9f9"&gt;nullptr&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://llvm.org/doxygen/classllvm_1_1BasicBlock.html" class="external-link" target="_blank" rel="noopener"&gt;llvm::BasicBlock Class Reference&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;親の関数を指定していなくても様々な操作をできるのですが、&lt;code&gt;CreateGlobalStringPtr&lt;/code&gt;を呼び出すには関数とBasicBlockが必要条件なので実行に失敗していたわけです。&lt;/p&gt;
&lt;p&gt;ということで纏めると、親の関数を指定しないと&lt;code&gt;CreateGlobalStringPtr&lt;/code&gt;は呼び出せないよ、ということです。&lt;/p&gt;
&lt;h2 id="おまけ-現在挿入中の関数を取得する"&gt;
 [おまけ] 現在挿入中の関数を取得する
 &lt;a class="heading-link" href="#%e3%81%8a%e3%81%be%e3%81%91-%e7%8f%be%e5%9c%a8%e6%8c%bf%e5%85%a5%e4%b8%ad%e3%81%ae%e9%96%a2%e6%95%b0%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;現在のBasicBlockを取得してからその親の関数を取得すれば実現可能です。
BasicBlockを一度介すのがミソです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C++" data-lang="C++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;auto&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;parent&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;builder&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;GetInsertBlock&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;getParent&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;();&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="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C++" data-lang="C++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;auto&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ifblock&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;BasicBlock&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Create&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;module&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;getContext&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(),&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;then&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;parent&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;auto&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;mergeblock&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;BasicBlock&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Create&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;module&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;getContext&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(),&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;merged&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;parent&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="さいごに"&gt;
 さいごに
 &lt;a class="heading-link" href="#%e3%81%95%e3%81%84%e3%81%94%e3%81%ab"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;これだけは言いたい。LLVMの日本語資料少なすぎー! &lt;del&gt;(英語読めよ)&lt;/del&gt;&lt;br&gt;
まあ、これがLLVMの記事をかく原動力になっているのですが。&lt;/p&gt;</description></item><item><title>[C# tips] #2 privateなメンバーにアクセスしよう</title><link>https://caphosra.net/posts/2020-04-10-csharptips2/</link><pubDate>Fri, 10 Apr 2020 18:08:04 +0900</pubDate><guid>https://caphosra.net/posts/2020-04-10-csharptips2/</guid><description>&lt;p&gt;これで二回目です。前回はC#のLinqに関する軽い紹介を書きました。&lt;br&gt;
今日のテーマは&amp;quot;privateなメンバーにアクセスしよう&amp;quot;です。&lt;/p&gt;
&lt;h2 id="注意"&gt;
 注意
 &lt;a class="heading-link" href="#%e6%b3%a8%e6%84%8f"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;この記事では&lt;code&gt;System.Reflection&lt;/code&gt;を使用してprivateなメンバーにアクセスする方法をお伝えします。ただ、自己責任でお願いします。(危ない操作ではありませんが、人のコードに対して行えば著作権侵害とかになりえるので。)&lt;/p&gt;
&lt;h2 id="突然ですが問題です"&gt;
 突然ですが問題です
 &lt;a class="heading-link" href="#%e7%aa%81%e7%84%b6%e3%81%a7%e3%81%99%e3%81%8c%e5%95%8f%e9%a1%8c%e3%81%a7%e3%81%99"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;あなたは以下のようなクラスのインスタンスを与えられました。&lt;br&gt;
このクラスにはどうやらfloat型の変数があってそれは秘密の値で初期化されているようです。&lt;br&gt;
秘密にされると暴きたくなるのが人間の性、Capra君はどうしても秘密の値を知りたいです。&lt;br&gt;
果たしてどうすれば秘密の値を手に入れられるでしょうか?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;public&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;class&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;HasSecret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;private&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;?????&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;?????;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;public&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;dummy1&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3.14f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;private&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;dummy2&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;314&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ならディスアセンブルすれば"&gt;
 ならディスアセンブルすれば&amp;hellip;?
 &lt;a class="heading-link" href="#%e3%81%aa%e3%82%89%e3%83%87%e3%82%a3%e3%82%b9%e3%82%a2%e3%82%bb%e3%83%b3%e3%83%96%e3%83%ab%e3%81%99%e3%82%8c%e3%81%b0"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;確かに、dnSpyというC#で凄まじい威力を発揮するディスアセンブラを使えば瞬殺できます。ただ、やはりC#のコードで解決したいですよね。(というより、dnSpy使うのなら記事の意味がなくなってしまいそう&amp;hellip;)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/0xd4d/dnSpy" class="external-link" target="_blank" rel="noopener"&gt;GitHub - 0xd4d/dnSpy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ということでC#のコードから&lt;code&gt;HasSecret&lt;/code&gt;内の変数にアクセスしてみましょう。&lt;/p&gt;
&lt;h2 id="まずは愚直にアクセス"&gt;
 まずは愚直にアクセス
 &lt;a class="heading-link" href="#%e3%81%be%e3%81%9a%e3%81%af%e6%84%9a%e7%9b%b4%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;試しに、dummy2に何も考えずにアクセスしてみましょう。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;var&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;secret&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;new&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;HasSecret&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;Console&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;WriteLine&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;secert&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;dummy2&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;error CS0122: &amp;#39;HasSecret.dummy2&amp;#39; is inaccessible due to its protection level
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然ながらエラーが発生しました。これでアクセス出来たらライブラリ開発者はたまったものじゃないですよね。せっかくの実装の隠蔽が意味をなさなくなりますから。&lt;/p&gt;
&lt;p&gt;また、この方法だと、privateな変数にアクセスするどころか変数名さえわかりません。&lt;br&gt;
今回は変数名さえわからない状態なので、どうすればいいのでしょうか&amp;hellip;&lt;/p&gt;
&lt;h2 id="ここでsystemreflection"&gt;
 ここでSystem.Reflection
 &lt;a class="heading-link" href="#%e3%81%93%e3%81%93%e3%81%a7systemreflection"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;ここから、&lt;code&gt;System.Reflection&lt;/code&gt;を使っていきます。&lt;br&gt;
&lt;code&gt;System.Reflection&lt;/code&gt;は型の情報を使用して動的に物事を処理する方法を提供するクラスを揃えたバリューパックのような名前空間です。&lt;/p&gt;
&lt;p&gt;それではそれらを使用して、privateな変数にアクセスしていきましょう。&lt;br&gt;
まず、&lt;code&gt;GetType&lt;/code&gt;関数を使って動的に型を取得します。静的に型を取得したい方は&lt;code&gt;typeof&lt;/code&gt;キーワードを利用するといいと思います。&lt;br&gt;
受け取った型の型は&lt;code&gt;System.Type&lt;/code&gt;となります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// using System.Reflection;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;var&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;secret&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;new&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;HasSecret&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;var&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;type&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;secret&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;GetType&lt;/span&gt;&lt;span style="color:#abb2bf"&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;GetFields&lt;/code&gt;を呼び出します。名前から想像がつくように、型から、条件を満たす全てのFieldの情報を取得してくる関数です。因みに戻り値は&lt;code&gt;System.Reflection.FieldInfo[]&lt;/code&gt;です。&lt;/p&gt;</description></item><item><title>[LLVM] printfでFloat型の足し算の結果を表示する</title><link>https://caphosra.net/posts/2020-04-09-llvm-printf-float/</link><pubDate>Thu, 09 Apr 2020 13:06:28 +0900</pubDate><guid>https://caphosra.net/posts/2020-04-09-llvm-printf-float/</guid><description>&lt;p&gt;LLVMのC++ APIを使用して、printfでFloat同士の足し算の結果を表示するLLVM IRを表示するまでを行いたいと思います。&lt;/p&gt;
&lt;h2 id="筆者の環境"&gt;
 筆者の環境
 &lt;a class="heading-link" href="#%e7%ad%86%e8%80%85%e3%81%ae%e7%92%b0%e5%a2%83"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;LLVM: LLVM 9.0.1&lt;/li&gt;
&lt;li&gt;Compiler: Visual Studio付属のcl.exe&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="こんなコードを出力したい"&gt;
 こんなコードを出力したい
 &lt;a class="heading-link" href="#%e3%81%93%e3%82%93%e3%81%aa%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e5%87%ba%e5%8a%9b%e3%81%97%e3%81%9f%e3%81%84"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;以下のC言語のプログラムと同じ動きをするLLVM IRを出力するのが今回の目標です。&lt;br&gt;
floatの値を2つ足し算をしてprintfですね。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;#include&lt;/span&gt; &lt;span style="color:#8a93a5;font-style:italic"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;main&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;f1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3.5&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;float&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;f2&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;6.4&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00b1f7"&gt;printf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;%f + %f = %f&lt;/span&gt;&lt;span style="color:#d26464;font-weight:bold"&gt;\n&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;f1&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;f2&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;f1&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;+&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;f2&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;return&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まずはprintfを定義しよう"&gt;
 まずはprintfを定義しよう
 &lt;a class="heading-link" href="#%e3%81%be%e3%81%9a%e3%81%afprintf%e3%82%92%e5%ae%9a%e7%be%a9%e3%81%97%e3%82%88%e3%81%86"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;まず、printfの定義について思い出してみましょう。&lt;br&gt;
printfは関数の引数として、フォーマットの文字列と、複数の値をとることができます。&lt;br&gt;
戻り値はInt32型で帰ってきます。(私は戻り値を使ったことがあまりないです。)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;printf&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#76a9f9"&gt;const&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;char&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;format&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;...);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それではC++のコードで実装していきます。&lt;br&gt;
まず、LLVMのサポートClassを初期化していきましょう。&lt;br&gt;
Builderが大文字なのは、LLVMの公式Tutorialで大文字になっていたので、それに慣れてしまったからです。変数名は勿論変えていただいて問題ありません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C++" data-lang="C++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;LLVMContext&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;context&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;IRBuilder&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Builder&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;context&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Module&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;module&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;module&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;new&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Module&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;test.ll&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;context&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これからいちいち型を定義するのは大変なので、基本的な型はマクロとして簡単にかける様にしておきます。これは本当に我流なのでこのマクロを定義するのが一般的だと思い込まないでください&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C++" data-lang="C++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;#define LLVM_INT8_PTR_TY llvm::Type::getInt8PtrTy(context)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;#define LLVM_INT32_TY llvm::Type::getInt32Ty(context)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;#define LLVM_FLOAT_TY llvm::Type::getFloatTy(context)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;#define LLVM_DOUBLE_TY llvm::Type::getDoubleTy(context)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで前準備は終了です。printfの定義に移っていきましょう。&lt;br&gt;
まずは関数の&amp;quot;型&amp;quot;を定義します。戻り値の型とvectorに詰めた引数の型を&lt;code&gt;llvm::FunctionType::get&lt;/code&gt;に投げて、関数の型を受け取ります。&lt;br&gt;
Int8型(Char型)のポインターを引数にして、戻り値をInt32型で返します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C++" data-lang="C++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;std&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;vector&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Type&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;*&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;printfFuncArgs&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;printfFuncArgs&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;push_back&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;LLVM_INT8_PTR_TY&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;auto&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;printfFuncType&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;llvm&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;FunctionType&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;::&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;get&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;LLVM_INT32_TY&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;printfFuncArgs&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;続けてprintf本体を作成しましょう。以下のようになります。&lt;/p&gt;</description></item><item><title>[C# tips] #1 C#でSQLみたいな構文?</title><link>https://caphosra.net/posts/2020-03-20-onepoint-csharp/</link><pubDate>Mon, 30 Mar 2020 16:26:36 +0900</pubDate><guid>https://caphosra.net/posts/2020-03-20-onepoint-csharp/</guid><description>&lt;blockquote&gt;
&lt;p&gt;30億のデバイスで動くJavaの方がC#より強そう&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;C#ってWin APIを呼ぶやつ&amp;hellip;?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;このような事をいわれたことがあったので、対抗策として、C#の豆知識や小話(というほどでもない)を紹介するシリーズを始めようと思った次第です。&lt;br&gt;
これが、記念すべき第一回です。&lt;/p&gt;
&lt;h2 id="本編"&gt;
 本編
 &lt;a class="heading-link" href="#%e6%9c%ac%e7%b7%a8"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;じつはC#にはSQL likeな構文が用意されています、というのが今回の話です。(あ、これ知ってるよという方、&lt;del&gt;黙ってこのページを閉じてください&lt;/del&gt;)&lt;/p&gt;
&lt;p&gt;SQLと聞くと&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データベースの操作をするやつ&lt;/li&gt;
&lt;li&gt;クエリを投げるやつ&lt;/li&gt;
&lt;li&gt;&lt;del&gt;実はSQLは言語そのもののことではない&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;など色々思い浮かべると思います。&lt;/p&gt;
&lt;p&gt;SQLはデータを処理するのに特化した言語です。SQLでゲームを作るなどという話は聞いたことがありません。&lt;/p&gt;
&lt;h2 id="sqlでデータを取り出してみる"&gt;
 SQLでデータを取り出してみる
 &lt;a class="heading-link" href="#sql%e3%81%a7%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e5%8f%96%e3%82%8a%e5%87%ba%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;例えば、SQLのデータベースに以下のようなテーブルがあったとします。&lt;/p&gt;
&lt;p&gt;Table名 : TestResults&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;math&lt;/th&gt;
 &lt;th style="text-align: left"&gt;english&lt;/th&gt;
 &lt;th style="text-align: left"&gt;name&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;50&lt;/td&gt;
 &lt;td style="text-align: left"&gt;100&lt;/td&gt;
 &lt;td style="text-align: left"&gt;A&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;60&lt;/td&gt;
 &lt;td style="text-align: left"&gt;70&lt;/td&gt;
 &lt;td style="text-align: left"&gt;B&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;80&lt;/td&gt;
 &lt;td style="text-align: left"&gt;80&lt;/td&gt;
 &lt;td style="text-align: left"&gt;C&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;40&lt;/td&gt;
 &lt;td style="text-align: left"&gt;90&lt;/td&gt;
 &lt;td style="text-align: left"&gt;D&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この時、&lt;code&gt;math&lt;/code&gt;が50以上なものを取り出し、&lt;code&gt;english&lt;/code&gt;の値の降順でソートしたいと思います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-SQL" data-lang="SQL"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;SELECT&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;math&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;english&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;FROM&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;TestResults&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;WHERE&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;math&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;ORDER&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;BY&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;english&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;DESC&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを行うSQLの文はこのようになります。ここでの解説は本題ではないので飛ばします。詳しくはググって下さい。&lt;/p&gt;
&lt;h2 id="cでこれができたなら"&gt;
 C#でこれができたなら&amp;hellip;
 &lt;a class="heading-link" href="#c%e3%81%a7%e3%81%93%e3%82%8c%e3%81%8c%e3%81%a7%e3%81%8d%e3%81%9f%e3%81%aa%e3%82%89"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;できます。&lt;code&gt;System.Linq&lt;/code&gt;を使用しましょう。&lt;/p&gt;
&lt;p&gt;まず、Listを用意しましょう。Tupleを使用しました。古いバージョンのC#をお使いの方と匿名型大好きな方、すみません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// using System;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// using System.Collections.Generic;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;var&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;testResults&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;new&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;List&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;&amp;lt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;math&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;english&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;string&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;name&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&amp;gt;()&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;50&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;60&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;70&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;80&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;80&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;C&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;40&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#d19a66"&gt;90&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;D&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして、C#でSQL likeに同じ処理を行ってみましょう。&lt;/p&gt;</description></item><item><title>Avalonia UIで画像を使ったボタンを作成する方法</title><link>https://caphosra.net/posts/2020-03-29-avalonia-image-button/</link><pubDate>Sun, 29 Mar 2020 10:17:52 +0900</pubDate><guid>https://caphosra.net/posts/2020-03-29-avalonia-image-button/</guid><description>&lt;p&gt;今回は、知らないと難しい、Avalonia UIで画像を使ったボタンを作成していきます。&lt;br&gt;
前置きはさっさと飛ばして、本題に入りましょう。&lt;/p&gt;
&lt;h2 id="前提条件"&gt;
 前提条件
 &lt;a class="heading-link" href="#%e5%89%8d%e6%8f%90%e6%9d%a1%e4%bb%b6"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;もう既にAvaloniaのプロジェクトを作っていること。&lt;/li&gt;
&lt;li&gt;ボタンにする画像を選んでいること。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="画像の準備"&gt;
 画像の準備
 &lt;a class="heading-link" href="#%e7%94%bb%e5%83%8f%e3%81%ae%e6%ba%96%e5%82%99"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;私は3枚の画像を選びました。通常の見た目と、Hover時の見た目と、Click時の見た目です。1枚で全ての場合をやってもいいんですが、Userが見た目からボタンとして認識してくれない危険性があるので推奨はしません。&lt;/p&gt;
&lt;p&gt;画像は&lt;code&gt;Assets&lt;/code&gt;フォルダに入れます。&lt;br&gt;
もし、&lt;code&gt;Assets&lt;/code&gt;フォルダがない!という場合は、&lt;code&gt;Assets&lt;/code&gt;フォルダを作ってから、プロジェクトファイルに&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;&amp;lt;ItemGroup&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;&amp;lt;AvaloniaResource&lt;/span&gt; &lt;span style="color:#cebc3a"&gt;Include=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;Assets\*&amp;#34;&lt;/span&gt;&lt;span style="color:#76a9f9"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;&amp;lt;/ItemGroup&amp;gt;&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;h2 id="usercontrolを作る"&gt;
 UserControlを作る
 &lt;a class="heading-link" href="#usercontrol%e3%82%92%e4%bd%9c%e3%82%8b"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;先ずは、UserControlを作成しましょう。名前は適宜読み替えてください。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Visual Studio]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right click your project&amp;rsquo;s Views folder in Solution Explorer&lt;/li&gt;
&lt;li&gt;Select the Add -&amp;gt; New Item menu item&lt;/li&gt;
&lt;li&gt;In the dialog that appears, navigate to the &amp;ldquo;Avalonia&amp;rdquo; section in the category tree&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;User Control (Avalonia)&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Enter TodoListView as the &amp;ldquo;Name&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Click the &amp;ldquo;Add&amp;rdquo; button&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;[.NET Core]&lt;/p&gt;</description></item><item><title>WSL2を使えるようにする</title><link>https://caphosra.net/posts/wsl2-setup/</link><pubDate>Sat, 14 Mar 2020 20:04:43 +0900</pubDate><guid>https://caphosra.net/posts/wsl2-setup/</guid><description>&lt;p&gt;Windows上でLinuxをエミュレートしてくれるWSLが進化を遂げ&amp;hellip;&lt;br&gt;
遂にWSL2が使用出来るようになりました!やったね!&lt;/p&gt;
&lt;p&gt;このニュースを聞いたら、当然プログラマー的には使ってみたくなりますよね。&lt;br&gt;
ということで、気楽にインストールしようとしたら&amp;hellip;&amp;ldquo;あれ?コマンドがないよ&amp;quot;みたいにWindowsに怒られてしまいました。&lt;/p&gt;
&lt;p&gt;WSL2を使用出来るようにするのは一筋縄ではいかなかったので使用できるまでの道筋を紹介していきたいと思います。&lt;/p&gt;
&lt;p&gt;WSL2はまだ安定していない様なので &lt;strong&gt;あくまで自己責任で&lt;/strong&gt; お願いします。&lt;/p&gt;
&lt;h2 id="まずwindowsをアップデート"&gt;
 まず、Windowsをアップデート
 &lt;a class="heading-link" href="#%e3%81%be%e3%81%9awindows%e3%82%92%e3%82%a2%e3%83%83%e3%83%97%e3%83%87%e3%83%bc%e3%83%88"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;実は、私はこれを忘れて数分溶かしました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WSL 2 is only available in Windows 10 builds 18917 or higher&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/wsl2-install" class="external-link" target="_blank" rel="noopener"&gt;Microsoft - WSL2 Install&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;なるほど、Windows 10のビルド番号18917番以降を持っている必要があるのですね。&lt;br&gt;
しかしながら、ただ、愚直にWindowsをアップデートしても、現段階では18917番以前のものになってしまいます。(バージョン確認にはwinverコマンドを)&lt;/p&gt;
&lt;p&gt;それを解決するために、&lt;a href="https://insider.windows.com/en-us/" class="external-link" target="_blank" rel="noopener"&gt;Windows Insider&lt;/a&gt;に加入しましょう。&lt;br&gt;
これは、Windowsの新しいバージョンをMicrosoftが配布し、問題を見つけたら報告するというシステムです。&lt;br&gt;
試験的な内容をいち早く使うことが出来ます。&lt;/p&gt;
&lt;p&gt;Microsoftアカウントを持っていると登録は一瞬で終わります。なんと、&lt;strong&gt;無料&lt;/strong&gt;　です。&lt;/p&gt;
&lt;p&gt;続いて設定を開きます。そして&amp;quot;更新とセキュリティ&amp;quot;をクリック。&lt;/p&gt;
&lt;img src="https://caphosra.net/images/wsl2-setup/settings.jpg" alt="Windows settings" class="center" width="900" height="300" /&gt;
&lt;img src="https://caphosra.net/images/wsl2-setup/windows-insider-program.jpg" alt="Windows Insider Program" class="center" width="300" height="600" /&gt;
&lt;p&gt;&amp;ldquo;Windows Insider Program&amp;quot;をクリックして、ログインしてください。&lt;br&gt;
Insiderの設定は&amp;quot;スロー&amp;quot;で問題ないと思います。&lt;/p&gt;
&lt;p&gt;続いて、&amp;ldquo;Windows Update&amp;quot;に移って、&amp;ldquo;更新プログラムのチェック&amp;quot;をクリック。
先程までなかった、より新しいWindows 10のバージョンへの更新ができるようになります!
これで、先程のWindowsバージョン問題は解決です。あとは、ひたすらWindows Updateを見る会です。&lt;/p&gt;
&lt;h2 id="wslをインストールしていく"&gt;
 WSLをインストールしていく
 &lt;a class="heading-link" href="#wsl%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%97%e3%81%a6%e3%81%84%e3%81%8f"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;WSLのインストール方法は通常の方法と同じなので割愛します。&lt;br&gt;
以下のサイトがわかりやすかったです。(&lt;del&gt;丸投げ&lt;/del&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://qiita.com/Aruneko/items/c79810b0b015bebf30bb" class="external-link" target="_blank" rel="noopener"&gt;Qitta - Windows Subsystem for Linuxをインストールしてみよう！ @Aruneko&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本当にWSLのインストールと同じです。&lt;br&gt;
WSLを既にインストールしているよ、という方はここをスルーしても大丈夫です。&lt;/p&gt;</description></item><item><title>Hugoで_index.mdの仕様を変更した話</title><link>https://caphosra.net/posts/hugo-index-override/</link><pubDate>Thu, 12 Mar 2020 10:35:31 +0900</pubDate><guid>https://caphosra.net/posts/hugo-index-override/</guid><description>&lt;p&gt;今回は、Hugoについてです。&lt;br&gt;
&lt;code&gt;_index.md&lt;/code&gt;は標準では限られたコンテンツしか含めないので、それを改造していきたいと思います。&lt;br&gt;
そもそも&lt;code&gt;_index.md&lt;/code&gt;とは?というところにも触れるので、&lt;code&gt;_index.md&lt;/code&gt;と&lt;code&gt;index.md&lt;/code&gt;の仕様に疑問がある方は必見です。&lt;/p&gt;
&lt;h2 id="hugoでの_indexmd"&gt;
 Hugoでの_index.md
 &lt;a class="heading-link" href="#hugo%e3%81%a7%e3%81%ae_indexmd"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;以下のようなフォルダがサーバー上にあったとします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- contents
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - old
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * index.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * old_content.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * index.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * content1.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * content2.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この時に、&lt;code&gt;contents/&lt;/code&gt;と&lt;code&gt;contents/index.html&lt;/code&gt;はアクセスしたときに同じ様に表示されます。&lt;br&gt;
同様に&lt;code&gt;contents/old/&lt;/code&gt;と&lt;code&gt;contents/old/index.html&lt;/code&gt;も同じ表示となります。&lt;br&gt;
これは、フォルダにアクセスしたときに、&lt;code&gt;index.html&lt;/code&gt;が存在するか探索されるからです。&lt;/p&gt;
&lt;p&gt;一方で、Hugoでは、&lt;code&gt;index.md&lt;/code&gt;と&lt;code&gt;_index.md&lt;/code&gt;というこれとほぼ同様の役割を果たすものをが用意されています。&lt;br&gt;
ただ、これらは厳密には異なり、仕様が異なります。&lt;/p&gt;
&lt;p&gt;ひとつづつ見ていきましょう。&lt;/p&gt;
&lt;h3 id="indexmdの仕様"&gt;
 index.mdの仕様
 &lt;a class="heading-link" href="#indexmd%e3%81%ae%e4%bb%95%e6%a7%98"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;index.md&lt;/code&gt;はほとんど&lt;code&gt;index.html&lt;/code&gt;のようなものであると思ってもらってもいいです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- contents
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - blog
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * index.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにファイルを配置すれば、ビルド後は、&lt;code&gt;[servername]/blog/&lt;/code&gt;とアクセスすることもできるし、
&lt;code&gt;[servername]/blog/index.html&lt;/code&gt;とアクセスすることも出来ます。&lt;/p&gt;
&lt;p&gt;ただ、&lt;code&gt;index.md&lt;/code&gt;には__落とし穴__が&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- contents
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - blog
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - item
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * index.md &amp;lt;- NG (index.md被りは禁止)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * index.md &amp;lt;- OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * server.md &amp;lt;- NG (server/indexかのように扱われる)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - about
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * index.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このような配置をして、ビルドすると、&lt;code&gt;server.md&lt;/code&gt;と&lt;code&gt;item/index.md&lt;/code&gt;がビルドされません!&lt;br&gt;
なぜかと言うと、&lt;code&gt;index.md&lt;/code&gt;は &lt;strong&gt;下層ノードでの重複が禁止&lt;/strong&gt; されているからです。&lt;br&gt;
即ち、&lt;code&gt;blog/&lt;/code&gt;はもう既に&lt;code&gt;index.md&lt;/code&gt;を持っているので、子ディレクトリの&lt;code&gt;index.md&lt;/code&gt;はビルドされません。
Hugoは&lt;code&gt;server.md&lt;/code&gt;の様なファイルを&lt;code&gt;server/index.html&lt;/code&gt;にビルドしようとするので&lt;code&gt;server.md&lt;/code&gt;もビルドされません。&lt;/p&gt;</description></item><item><title>LLVMをWindowsで使いたくて入れたらlliなかった話</title><link>https://caphosra.net/posts/llvm-lli-install/</link><pubDate>Sat, 07 Mar 2020 12:54:53 +0900</pubDate><guid>https://caphosra.net/posts/llvm-lli-install/</guid><description>&lt;img src="https://llvm.org/img/LLVM-Logo-Derivative-1.png" alt="LLVM logo" class="center" width="256" height="256" /&gt;
&lt;p&gt;オレオレ言語を作るためにAntlr4を習得(?)したcapra314cabraです。&lt;br&gt;
今回は自分のWindowsのパソコンにLLVMを使える環境を作ろうとして手こずったのでそれの事について書いていきたいと思います。&lt;/p&gt;
&lt;h2 id="まずllvmって"&gt;
 まずLLVMって?
 &lt;a class="heading-link" href="#%e3%81%be%e3%81%9allvm%e3%81%a3%e3%81%a6"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The LLVM compiler infrastructure project is a set of compiler and toolchain technologies, which can be used to develop a front end for any programming language and a back end for any instruction set architecture.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/LLVM" class="external-link" target="_blank" rel="noopener"&gt;wikipedia LLVM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;そういうことらしいです。LLVMのツール群の使い方は触れない予定なので、&lt;del&gt;他のサイトをご覧下さい。&lt;/del&gt;&lt;/p&gt;
&lt;h2 id="最初にやったこと失敗談"&gt;
 最初にやったこと(失敗談)
 &lt;a class="heading-link" href="#%e6%9c%80%e5%88%9d%e3%81%ab%e3%82%84%e3%81%a3%e3%81%9f%e3%81%93%e3%81%a8%e5%a4%b1%e6%95%97%e8%ab%87"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;取り敢えず、思考停止で&lt;a href="http://releases.llvm.org/download.html" class="external-link" target="_blank" rel="noopener"&gt;LLVMのリリースページ&lt;/a&gt;へ&lt;br&gt;
現時点でLLVM9.0.1が最新ですが、Pre-Built Binariesの何もなかったので、LLVM9.0.0のところにある&lt;code&gt;Windows (64-bit)&lt;/code&gt;をポチっとしてダウンロード。
インストラーだったので実行してインストール完了!&lt;/p&gt;
&lt;p&gt;&amp;hellip;と思いきや、Clang等はインストールされていたものの、&lt;code&gt;lli&lt;/code&gt;や&lt;code&gt;llc&lt;/code&gt;、&lt;code&gt;llvm-as&lt;/code&gt;などが見当たりませんでした。&lt;/p&gt;
&lt;h2 id="次にやったこと失敗談"&gt;
 次にやったこと(失敗談)
 &lt;a class="heading-link" href="#%e6%ac%a1%e3%81%ab%e3%82%84%e3%81%a3%e3%81%9f%e3%81%93%e3%81%a8%e5%a4%b1%e6%95%97%e8%ab%87"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Chocolatery(Windows用のパッケージマネージャ)を使ってLLVMを入れれば全部のせになるかな、という希望的観測でやってみると、ひとつ前と全く同じ&amp;hellip;&lt;/p&gt;
&lt;h2 id="他の人がビルドしているものを貰う止めた"&gt;
 他の人がビルドしているものを貰う(止めた)
 &lt;a class="heading-link" href="#%e4%bb%96%e3%81%ae%e4%ba%ba%e3%81%8c%e3%83%93%e3%83%ab%e3%83%89%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e3%82%82%e3%81%ae%e3%82%92%e8%b2%b0%e3%81%86%e6%ad%a2%e3%82%81%e3%81%9f"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;古いのばかり出てきました(LLVM3が多い印象)&lt;br&gt;
LLVM9.0.0が使いたいのでうーん、といった感じ&lt;/p&gt;</description></item><item><title>Aimed Thief</title><link>https://caphosra.net/archives/aimed-thief/</link><pubDate>Sun, 16 Feb 2020 17:49:03 +0900</pubDate><guid>https://caphosra.net/archives/aimed-thief/</guid><description>&lt;script src="Build/UnityLoader.js" async&gt;&lt;/script&gt;
&lt;script&gt;window.onload=function(){let check=false;(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);if(check){document.getElementById("unityContainer").innerHTML="&lt;p&gt;このゲームはスマートフォンに対応していません ('Д')&lt;br/&gt;&lt;br/&gt;詳細はこちらから:&lt;br/&gt;&lt;a&gt;https://docs.unity3d.com/Manual/webgl-browsercompatibility.html&lt;/a&gt;&lt;/p&gt;";}else{document.getElementById("unityContainer").style = "width: 800px; height: 450px; margin: auto";UnityLoader.instantiate('unityContainer', 'Build/WebGL.json');}}&lt;/script&gt;
&lt;div id="unityContainer"&gt;&lt;/div&gt;
&lt;p&gt;このゲームはOpen-Sourceです! &lt;a href="https://github.com/caphosra/AimedThief" class="external-link" target="_blank" rel="noopener"&gt;GitHub&lt;/a&gt;&lt;br&gt;
撃つ: Space, 移動: WASD or 矢印キー&lt;/p&gt;
&lt;script src="https://utteranc.es/client.js"
 repo= "caphosra/caphosra.github.io"
 issue-term="title"
 label="comments"
 theme="github-light"
 crossorigin="anonymous"
 async&gt;
&lt;/script&gt;</description></item><item><title>混沌の格闘家</title><link>https://caphosra.net/archives/fighter-of-chaos/</link><pubDate>Sun, 16 Feb 2020 17:49:03 +0900</pubDate><guid>https://caphosra.net/archives/fighter-of-chaos/</guid><description>&lt;script src="Build/UnityLoader.js" async&gt;&lt;/script&gt;
&lt;script&gt;window.onload=function(){let check=false;(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);if(check){document.getElementById("unityContainer").innerHTML="&lt;p&gt;このゲームはスマートフォンに対応していません ('Д')&lt;br/&gt;&lt;br/&gt;詳細はこちらから:&lt;br/&gt;&lt;a&gt;https://docs.unity3d.com/Manual/webgl-browsercompatibility.html&lt;/a&gt;&lt;/p&gt;";}else{document.getElementById("unityContainer").style = "width: 800px; height: 450px; margin: auto";UnityLoader.instantiate('unityContainer', 'Build/ForWebGL.json');}}&lt;/script&gt;
&lt;div id="unityContainer"&gt;&lt;/div&gt;
&lt;p&gt;サブタイトルにあるように、話し合いで解決しないと世界はこうなります()&lt;br&gt;
移動: AD or 矢印キー, ジャンプ: W or 矢印上キー, 攻撃：Space&lt;/p&gt;
&lt;script src="https://utteranc.es/client.js"
 repo= "caphosra/caphosra.github.io"
 issue-term="title"
 label="comments"
 theme="github-light"
 crossorigin="anonymous"
 async&gt;
&lt;/script&gt;</description></item><item><title>[CTF] Nullcon HackIM 2020 writeup</title><link>https://caphosra.net/posts/hackim2020-writeup/</link><pubDate>Sun, 09 Feb 2020 17:54:45 +0900</pubDate><guid>https://caphosra.net/posts/hackim2020-writeup/</guid><description>&lt;p&gt;Nullcon HackIM 2020に出たのでそのwriteupでも書こうかなーと思った次第です。&lt;/p&gt;
&lt;p&gt;結論から申し上げますと、解けた問題は&lt;strong&gt;1&lt;/strong&gt;問です&amp;hellip;(しかも、その問題はコピペするだけ)&lt;/p&gt;
&lt;p&gt;ただ、そんなのではwriteupとして意味をなさないので、競技終了後も作業していました。&lt;br&gt;
結局ZeldaAdventureの最初の1問を解くことができたのでそれをここに載せます。&lt;/p&gt;
&lt;h3 id="問題の見た目"&gt;
 問題の見た目
 &lt;a class="heading-link" href="#%e5%95%8f%e9%a1%8c%e3%81%ae%e8%a6%8b%e3%81%9f%e7%9b%ae"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;img src="https://caphosra.net/images/hackim2020-game.jpg" alt="Game scene" class="center" width="500" height="300" /&gt;
&lt;p&gt;Unity製のGameで、このNPC(白い敵)を1体以上倒すとFlagを手に入れられる、とあります。&lt;br&gt;
Playerは剣と体当たり(接触)することでNPCにダメージを与えられますが、敵のHPがとても高く、現実的な時間に倒せないようになっています。&lt;/p&gt;
&lt;h3 id="やったこと"&gt;
 やったこと
 &lt;a class="heading-link" href="#%e3%82%84%e3%81%a3%e3%81%9f%e3%81%93%e3%81%a8"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;UnityのWindowsでビルドした時のファイル構成は決まっています。&lt;br&gt;
特に、プログラマーが書いたコードは&lt;code&gt;AssemblyCSharp.dll&lt;/code&gt;というファイルにコンパイルされて存在しています。&lt;/p&gt;
&lt;p&gt;ここで、dnSpyを使用して&lt;code&gt;AssemblyCSharp.dll&lt;/code&gt;の中のコードを読んでみます。&lt;br&gt;
コードの森を探索していると&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// Token: 0x06000006 RID: 6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;private&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;void&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;TakeDamage&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;float&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;damage&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;this&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;health&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;-=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;damage&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#76a9f9"&gt;this&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;health&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;base&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;StartCoroutine&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#76a9f9"&gt;this&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;ShowSome&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;base&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;gameObject&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;SetActive&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ダメージを処理している部分を見つけました。&lt;br&gt;
HPが0になると&lt;code&gt;ShowSome&lt;/code&gt;というコールチンを回し始めるようです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-C#" data-lang="C#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// Token: 0x0600000A RID: 10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;private&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;IEnumerator&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ShowSome&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;this&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;textbox&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;SetActive&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;yield&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;return&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;new&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;WaitForSeconds&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#d19a66"&gt;3f&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;this&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;textbox&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;SetActive&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;yield&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;null&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;yield&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;break&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&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;ShowSome&lt;/code&gt;をみると&lt;code&gt;this.textbox&lt;/code&gt;を見せるようにしているみたいです。&lt;br&gt;
これはこのTextBoxがFlagを持っているのでしょう。&lt;br&gt;
dnSpyは実はDLLを編集する事が出来るので、この&lt;code&gt;this.textbox&lt;/code&gt;を最初から表示させるようにコードを書き換えれば、Flagゲットです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;Flag&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;:&lt;/span&gt; &lt;span style="color:#98c379"&gt;REVOLUTIONSTARTSWITHME&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;h2 id="おわりに"&gt;
 おわりに
 &lt;a class="heading-link" href="#%e3%81%8a%e3%82%8f%e3%82%8a%e3%81%ab"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;HackIM 2020の前に無力さを感じたので、もっと勉強してから出直します&amp;hellip;&lt;/p&gt;
&lt;h2 id="参考"&gt;
 参考
 &lt;a class="heading-link" href="#%e5%8f%82%e8%80%83"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/xcsh/Unity-game-hacking" class="external-link" target="_blank" rel="noopener"&gt;Unity-Game-Hacking&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Powershellでsudoしてみたい話</title><link>https://caphosra.net/posts/powershell-sudo/</link><pubDate>Wed, 11 Dec 2019 22:28:26 +0900</pubDate><guid>https://caphosra.net/posts/powershell-sudo/</guid><description>&lt;p&gt;今回紹介することはタイトルそのままです。&lt;br&gt;
PowershellではBashの&lt;code&gt;sudo&lt;/code&gt;のように簡単に管理者権限で実行出来るようにするコマンドがありません。&lt;br&gt;
そこで、それとほぼ同等なものを作りたい、というのが今回の話題です。&lt;br&gt;
早速、始めて行きましょう。&lt;/p&gt;
&lt;h2 id="手元の環境"&gt;
 手元の環境
 &lt;a class="heading-link" href="#%e6%89%8b%e5%85%83%e3%81%ae%e7%92%b0%e5%a2%83"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Powershell 6.2.3&lt;/p&gt;
&lt;p&gt;私が使っているPowershellはWindowsに標準でインストールされている.NET Framework依存のものではなく、
.NET Core依存のものです。これはWindowsだけでなくmacOSやLinuxでも動くのでWindows以外を使っている方もインストール出来ます。&lt;/p&gt;
&lt;p&gt;以降、Powershellの実行ファイル名をpwsh.exeとしていますが、.NET Framework依存のものをお使いの方は適宜powershell.exeで読み替えてください。&lt;/p&gt;
&lt;h2 id="コマンドの実装方針"&gt;
 コマンドの実装方針
 &lt;a class="heading-link" href="#%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%ae%e5%ae%9f%e8%a3%85%e6%96%b9%e9%87%9d"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sudo&lt;/code&gt;と同等な機能をもった関数を実装し、&lt;code&gt;sudo&lt;/code&gt;という名前のAliasとして登録する。&lt;/p&gt;
&lt;h2 id="方法"&gt;
 方法
 &lt;a class="heading-link" href="#%e6%96%b9%e6%b3%95"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;まず、Powershellを起動し、&lt;code&gt;$profile&lt;/code&gt;の値を読みます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;pwsh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;# PowerShell 6.2.3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;# Copyright (c) Microsoft Corporation. All rights reserved.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;# https://aka.ms/pscore6-docs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;# Type &amp;#39;help&amp;#39; to get help.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#dcaeea"&gt;$profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;# C:\.....\Microsoft.PowerShell_profile.ps1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;続いて読んだパスのファイルを開きます。&lt;br&gt;
お好みのソフトで開きましょう。因みに私はVisual Studio Codeで開きました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;code&lt;/span&gt; &lt;span style="color:#dcaeea"&gt;$profile&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="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;# 管理者権限で実行する関数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;function&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;SudoRun&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8a93a5;font-style:italic"&gt;# $programにコマンドを詰める&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;foreach&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#dcaeea"&gt;$arg&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;in&lt;/span&gt; &lt;span style="color:#dcaeea"&gt;$args&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#dcaeea"&gt;$program&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#dcaeea"&gt;$program&lt;/span&gt;&lt;span style="color:#63c381"&gt; &lt;/span&gt;&lt;span style="color:#dcaeea"&gt;$arg&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8a93a5;font-style:italic"&gt;# Powershellにより管理者権限で実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#aa89ea"&gt;pwsh&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;-command&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;Start-Process -Verb runas &lt;/span&gt;&lt;span style="color:#dcaeea"&gt;$program&lt;/span&gt;&lt;span style="color:#63c381"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;# 関数をAliasとして登録する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;Set-Alias&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;-Name&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;sudo&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;-Value&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;SudoRun&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを書いたら、そっとそのファイルとPowershellを閉じましょう。&lt;br&gt;
その後、Powershellを起動すると、もうあなたは&lt;code&gt;sudo&lt;/code&gt;をPowershellで使うことができます!&lt;/p&gt;</description></item><item><title>[競プロ]役に立つCompareマクロ</title><link>https://caphosra.net/posts/comparemacro/</link><pubDate>Sun, 08 Dec 2019 22:24:27 +0900</pubDate><guid>https://caphosra.net/posts/comparemacro/</guid><description>&lt;h2 id="tldr"&gt;
 TL;DR
 &lt;a class="heading-link" href="#tldr"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;任意の方法で変数を比較する型を一行で作るためのマクロ&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;#define C(t, f) struct C##t { constexpr bool operator()(t const &amp;amp; a, t const &amp;amp; b) const noexcept { return f(a, b); } }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;structの型名とマクロ名はお好みの名前に付け直してください。&lt;/p&gt;
&lt;h2 id="マクロの説明"&gt;
 マクロの説明
 &lt;a class="heading-link" href="#%e3%83%9e%e3%82%af%e3%83%ad%e3%81%ae%e8%aa%ac%e6%98%8e"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;競技プログラミングで見かける&lt;code&gt;greater&amp;lt;T&amp;gt;&lt;/code&gt;と&lt;code&gt;less&amp;lt;T&amp;gt;&lt;/code&gt;という型。&lt;br&gt;
この&lt;code&gt;greater&amp;lt;T&amp;gt;&lt;/code&gt;は大なり記号、&lt;code&gt;less&amp;lt;T&amp;gt;&lt;/code&gt;は小なり記号と同じ意味を持っています。&lt;br&gt;
これらは、たとえば逆順のPriorityQueueを使うときに用いられます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// このPriorityQueueは小さい順に出てくる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;priority_queue&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;vector&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;greater&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;pq&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// この二つは同じ動作をする
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;priority_queue&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;vector&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;less&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;pq&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;priority_queue&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;pq&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、これだけしかないと問題が生じます。&lt;br&gt;
たとえば、&lt;code&gt;pair&amp;lt;int, int&amp;gt;&lt;/code&gt;型で&lt;code&gt;second&lt;/code&gt;の要素が小さい順に出すPriorityQueueが必要だとします。&lt;br&gt;
この時に&lt;code&gt;greater&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&lt;/code&gt;だと&lt;code&gt;first&lt;/code&gt;の大小関係が優先され期待通りとなりません。&lt;/p&gt;
&lt;p&gt;ではどうすればよいか。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;struct&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;ComparePair&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;constexpr&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;bool&lt;/span&gt; &lt;span style="color:#00b1f7"&gt;operator&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;()(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;pair&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;const&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;pair&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;const&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;)&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;const&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;noexcept&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;if&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;second&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;==&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;second&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;return&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;first&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;first&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#76a9f9"&gt;return&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;a&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;second&lt;/span&gt; &lt;span style="color:#54b1c7"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;b&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;second&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#abb2bf"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;};&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="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// 名前を簡略化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;&lt;/span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;#define P pair&amp;lt;int, int&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// このように書けばsecondで順番が決定する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;priority_queue&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;P&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;vector&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;P&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ComparePair&lt;/span&gt;&lt;span style="color:#54b1c7"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;pq&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;secondが小さい順に値が出てきます。&lt;/p&gt;</description></item><item><title>C#でのusingの使い方を4つ紹介</title><link>https://caphosra.net/posts/csharp-using/</link><pubDate>Sat, 16 Nov 2019 16:40:39 +0900</pubDate><guid>https://caphosra.net/posts/csharp-using/</guid><description>&lt;p&gt;今回はC#で欠かせない存在の&lt;code&gt;using&lt;/code&gt;の使い方を四つに分けて紹介したいと思います。&lt;br&gt;
早速、始めていきましょう!&lt;/p&gt;
&lt;h2 id="ディレクティブとしてのusing"&gt;
 ディレクティブとしてのusing
 &lt;a class="heading-link" href="#%e3%83%87%e3%82%a3%e3%83%ac%e3%82%af%e3%83%86%e3%82%a3%e3%83%96%e3%81%a8%e3%81%97%e3%81%a6%e3%81%aeusing"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;C#でusingと言えば最初に思い浮かべるであろう使い方は、やはりディレクティブとしての&lt;code&gt;using&lt;/code&gt;でしょう。
usingディレクティブと聞いてピンと来なかった方も以下のコードを見ればわかるはずです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// これがディレクティブとしてのusing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;using&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&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;using&lt;/code&gt;は、異なる名前空間の中にあるモジュールを短い名前で呼び出す為に使用されます。
例えば、ファイルの読み書きをストリームで行いたいときに&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Text&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Encoding&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;enc&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Text&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Encoding&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;GetEncoding&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;IO&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;StreamWriter&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;writer&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;new&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;IO&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;StreamWriter&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;./some_file.txt&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;enc&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;と書くことはできますが、これでは余りにも冗長で可読性が低くなってしまいます。&lt;br&gt;
こんな時こそ&lt;code&gt;using&lt;/code&gt;です。&lt;br&gt;
&lt;code&gt;using&lt;/code&gt;を使えば名前空間を省略できます。先ほどの例であれば&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// ファイルの先頭にこれらを書く&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;using&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;System.Text&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;using&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;System.IO&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// Before&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Text&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Encoding&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;enc&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Text&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Encoding&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;GetEncoding&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;IO&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;StreamWriter&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;writer&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;new&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;IO&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;StreamWriter&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;./some_file.txt&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;enc&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// After&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;Encoding&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;enc&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Encoding&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;GetEncoding&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;StreamWriter&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;writer&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#76a9f9"&gt;new&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;StreamWriter&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;./some_file.txt&amp;#34;&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;,&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;enc&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なんということでしょう。あんなに読みにくかったコードがこんなに簡潔に!
(今回の内容とは関係ないですがvarを使うともっと読みやすくなります。)&lt;/p&gt;
&lt;h2 id="忘れられがちなusing-static"&gt;
 忘れられがちなusing static
 &lt;a class="heading-link" href="#%e5%bf%98%e3%82%8c%e3%82%89%e3%82%8c%e3%81%8c%e3%81%a1%e3%81%aausing-static"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;先程の&lt;code&gt;using&lt;/code&gt;の派生として&lt;code&gt;using static&lt;/code&gt;というものがあります。これは クラス名を省略できるようにする為に使われます。例をあげます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// ファイルの先頭にこれを書く&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#76a9f9"&gt;using&lt;/span&gt; &lt;span style="color:#ca72ff"&gt;static&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;System&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Math&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// 半径10の円と同じ面積の正方形の一辺の長さを求めたい&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// Before&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;double&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;radius&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10d&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;double&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ans&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Math&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;Sqrt&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;radius&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;radius&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Math&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;.&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;PI&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;// After&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;double&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;radius&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10d&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;double&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;ans&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;Sqrt&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;(&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;radius&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;radius&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;*&lt;/span&gt; &lt;span style="color:#aa89ea"&gt;PI&lt;/span&gt;&lt;span style="color:#abb2bf"&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;Math.Sqrt&lt;/code&gt; &lt;code&gt;Math.PI&lt;/code&gt;と書かなければならない所をこんなにも簡潔に書く事ができます。
&lt;code&gt;using static&lt;/code&gt;はその名前の通りstaticなメンバについてのみクラス名を省略できるようになります。
(そうでなかったら色々やばそうですが&amp;hellip;)&lt;br&gt;
因みにこの機能はあまり使わない印象です。使うのであれば&lt;code&gt;System.Math&lt;/code&gt;か&lt;code&gt;System.Console&lt;/code&gt;位でしょうか。&lt;/p&gt;
&lt;h2 id="名前を変えるusing"&gt;
 名前を変えるusing
 &lt;a class="heading-link" href="#%e5%90%8d%e5%89%8d%e3%82%92%e5%a4%89%e3%81%88%e3%82%8busing"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;ある日、caphosra君は以下のようなを実装しました。&lt;/p&gt;</description></item></channel></rss>