<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>きのこる庭 &#187; 検証・考察</title>
	<atom:link href="http://kinokoru.jp/archives/category/%e6%a4%9c%e8%a8%bc%e3%83%bb%e8%80%83%e5%af%9f/feed" rel="self" type="application/rss+xml" />
	<link>http://kinokoru.jp</link>
	<description></description>
	<lastBuildDate>Wed, 09 Jan 2019 03:18:33 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.2</generator>
		<item>
		<title>家庭内のタスクをRedmineとSlackを連携させて管理するようにしたらうまくいった話</title>
		<link>http://kinokoru.jp/archives/1198</link>
		<comments>http://kinokoru.jp/archives/1198#comments</comments>
		<pubDate>Fri, 11 Mar 2016 09:52:26 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[ツール系]]></category>
		<category><![CDATA[検証・考察]]></category>
		<category><![CDATA[Redmine]]></category>
		<category><![CDATA[Slack]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1198</guid>
		<description><![CDATA[<p>先日無事入籍を終え、結婚式に向けてあれこれ準備が必要になるということで、友人の何人かがやっていたように家庭内でRedmineを導入した。「結婚式準備」プロジェクトを立ち上げて暫く運用していて 最近ようやく運用が落ち着いて [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1198">家庭内のタスクをRedmineとSlackを連携させて管理するようにしたらうまくいった話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p><a href="http://kinokoru.jp/wp-content/uploads/2016/03/shared-img-thumb-YUUKI150321200I9A4368_TP_V.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2016/03/shared-img-thumb-YUUKI150321200I9A4368_TP_V-1024x703.jpg" alt="-shared-img-thumb-YUUKI150321200I9A4368_TP_V" width="1024" height="703" class="aligncenter size-large wp-image-1209" /></a></p>
<p>先日無事入籍を終え、結婚式に向けてあれこれ準備が必要になるということで、友人の何人かがやっていたように家庭内でRedmineを導入した。<strong>「結婚式準備」プロジェクト</strong>を立ち上げて暫く運用していて 最近ようやく運用が落ち着いてきたため、今度は少し欲が出てきた。<br />
現状、チケットが更新されるタイミング・何のチケットが更新されたか等タイムラインでしか把握できない状態になっているので、<strong>Slackを使って チケットが更新されたらリアルタイムに通知が飛ぶようにした</strong>。最近一部の界隈では家庭内でこういうツールを導入するのもよくある流れになってきたのかなあとは思う(ねーよ)ので、流行に便乗してみようといった所だ。導入・設定に苦戦するかなあと思ったら、<strong>元々Redmineが入っている状態から15分くらいで意外とサクッと導入できた</strong>。</p>
<p><span id="more-1198"></span></p>
<h2>これまで</h2>
<p>家庭内でRedmineを導入したのはおよそ一ヶ月前のことだ。使い方としては、以下のような感じでチケット毎にタスクの進捗状況などを書き込んだりして使用していた。<br />
暫く回してみた感じ、中々良い感じに管理できているなという手ごたえがあった。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_3.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_3.jpg" alt="redmine_3" width="538" height="281" class="aligncenter size-full wp-image-1201" /></a></p>
<p>そこに今回、より利便性を高めるためSlackを導入しようという算段である。<br />
導入に際し、今後何かとライフイベントが発生する可能性を考慮して、「結婚式準備」「引越し」等プロジェクトごとにチャットルームを作成し それぞれに通知が飛ぶようにした。</p>
<h2>結果</h2>
<p>以下のような感じでRedmine側で更新をかけると･･･</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_1.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_1.jpg" alt="redmine_1" width="764" height="373" class="aligncenter size-full wp-image-1199" /></a></p>
<p>以下のようにリアルタイムで通知が飛ぶ。デスクトップ上にNotificationも飛んでくれるので便利ですね。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_2.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_2.jpg" alt="redmine_2" width="753" height="260" class="aligncenter size-full wp-image-1200" /></a></p>
<h2>まとめ</h2>
<p>大人になると色々と比較的大きめの取り決め事を並行して消化していかないといけない事が多くなってくるので、こういう風に家庭の事も管理しておくと「あーこれも準備しておかなきゃいけなかったー」みたいな抜け漏れも防ぐことができ、且つ計画的・効率的にタスクをこなしていくことができて結構良いのではないかと思った。</p>
<h2>参考にさせていただいたサイト様</h2>
<p>● Redmineの変更をSlackで通知できるようにする<br />
<a href="http://liginc.co.jp/web/programming/other-programming/97710" target="_blank">SlackとRedmineを連携し、登録したチケットの更新を通知する方法 &#8211; LIG INC.</a></p>
<p>● Redmine上の複数プロジェクトをSlackのチャットルームごとに通知<br />
<a href="http://blogs.zealot.co.jp/archives/763" target="_blank">SlackにRedmineのチケット更新を通知する &#8211; ZEALOTエンジニアブログ</a></p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1198">家庭内のタスクをRedmineとSlackを連携させて管理するようにしたらうまくいった話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1198/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「秒間●リクエスト」の具体的な定義がモヤモヤしていたので調べてみた話</title>
		<link>http://kinokoru.jp/archives/1121</link>
		<comments>http://kinokoru.jp/archives/1121#comments</comments>
		<pubDate>Sun, 12 Jul 2015 03:54:18 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[サーバ・インフラ系]]></category>
		<category><![CDATA[検証・考察]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1121</guid>
		<description><![CDATA[<p>最近個人的にアプリケーションのみならず ミドルのあたりを触る機会が増えて、サーバのパフォーマンスを意識するようになってきた。 とはいえそのあたりの負荷テストに対する認識等、割とざっくりとやってしまっていたので ここらで一 [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1121">「秒間●リクエスト」の具体的な定義がモヤモヤしていたので調べてみた話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>最近個人的にアプリケーションのみならず ミドルのあたりを触る機会が増えて、サーバのパフォーマンスを意識するようになってきた。<br />
とはいえそのあたりの負荷テストに対する認識等、割とざっくりとやってしまっていたので ここらで一度しっかり落とし込んでおこうと考え、色々調べてみた。</p>
<p>特に<strong>「秒間にさばけるリクエスト数って、何をもって秒間●リクエストって言えるのか」</strong> とか、<br />
<strong>「秒間リクエストを測る際に、ユーザごとの端末の違いは考えなくて良いの？例えば有線のPCと3Gのスマホだと全然速度違うから、サーバ-クライアント間のコネクションが続く時間も変わってきてしまうんじゃないの？」</strong><br />
とか色々考えていたけど、調べているうちに自分なりに何となくハッキリしてきたので 情報の整理がてら共有。<br />
もしかしたら認識誤りで 間違った事を言っているかもしれないので、その場合はご指摘いただければ本当に嬉しいです。<br />
<span id="more-1121"></span></p>
<h3>「秒間リクエストを測る際に、ユーザごとの端末の違いは考えなくて良いの？」について</h3>
<p>結論から言うと、<strong>サーバが秒間でさばけるリクエスト数はユーザが使用しているネット回線には依存しない</strong>。</p>
<p>これは速度の差が発生するのがどこのネットワークにおいてかを考えるとわかりやすいかも。<br />
PCでもスマホでも ユーザ側のネットワークにおける速度が変われど、サーバ側における通信の速度は(PC/スマホごとにネットワーク側で別々の処理が行われていない、またはサーバ側でリクエスト元のIPに対して特定の帯域制限等をしていない 等の限りにおいて)変わらないことがわかる。<br />
以下はそれを示した図である。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/07/network1.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2015/07/network1.jpg" alt="network" width="650" height="412" class="aligncenter size-full wp-image-1134" /></a></p>
<p>ユーザ側のネットワークの帯域制限(図で言うと Aくんの使用しているWiFiのネットワークにおける帯域制限)とか媒体のネットワークは、飽くまでユーザ側のネットワークにおけるものであり、さらに言うと、サーバ自体のネットワーク領域は同じなので、ユーザ側のネットワークの帯域はサーバがさばける秒間リクエスト数には関係しない。</p>
<p>ので、秒間リクエスト数を測る際に 秒間リクエストに直接関わってくるネットワーク周りの問題は、サーバ側のネットワークが提供しているスペック、つまり以下の部分となる。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2015/07/network2.png"><img src="http://kinokoru.jp/wp-content/uploads/2015/07/network2.png" alt="network2" width="650" height="412" class="aligncenter size-full wp-image-1137" /></a></p>
<p>上記の赤枠で囲まれたネットワーク部分からサーバ間通信( アプリケーション自体のレスポンス、DBサーバのレスポンス速度等 )等を見て最終的なレスポンスの速度を判断し、ボトルネックを見つけて改善し続けていく工程が「秒間●リクエストをさばく」という事の意味なのかなと思った。</p>
<h3>つまり「秒間●リクエスト」とは</h3>
<p><strong>「秒間●リクエストをさばける」事が保障するのは、その量のリクエストが来た時にサーバがダウンすることなく稼動し続けられる事</strong>、及び<strong>システム全体におけるボトルネックの特定が可能になる事</strong><span class="supl">( アプリケーションの特定のSQLクエリが重く、結果的にAPサーバで遅延が発生している、各サーバ上では処理に時間がかかっていないがネットワークの帯域のスペックがそもそも微妙でレスポンスが遅れている 等)</span>である。<br />
言い換えると、<strong>サービスがユーザにとってサクサク見られるかどうかを&#8221;完全に保障するわけではない&#8221;</strong>。</p>
<h3>「秒間で沢山リクエストをさばける＝ユーザがサクサクページを見られる」ではない</h3>
<p>勿論、サーバが十分にリクエストをさばくことができないと 待ち行列ができてレスポンスが遅延してユーザがサクサクページを見られないので、<strong>サーバが想定されるリクエストを十分にさばけることは最低限保障されている必要があるが、さらにユーザがサクサクページを見られるようにするための工夫は秒間リクエストの話とは別に別途必要になる</strong>。<br />
例えば以下のような事を考慮する必要がある。</p>
<h4>1. ターゲットとするユーザが主に使用するであろう端末</h4>
<p>有線で見れば速いページでも、スマホ媒体向けに提供されている特定の回線で見たら遅い、且つサービスが提供するターゲットとなるユーザがスマホ媒体 なんてこともあるので、(当たり前だけど)ターゲットとする人達が利用するであろう端末での速度面の検証作業は必須になるだろうなあと思う。<br />
それでもって、<strong>明らかに媒体に対してコンテンツのサイズが大きすぎる場合は圧縮したりキャッシュを利用したり何なりの手立てが必要になる</strong>。</p>
<h4>2. ターゲットとするユーザの居住地</h4>
<p>基本的にインターネットは様々な異なるネットワークを経由してできているため、距離が遠ければ遠い程 パケットがネットワーク上を移動するのに要する距離・時間が長くなる。<br />
更に、国によっては 海外IPのサーバに対して自動で検閲が入るようになっている関係で遅くなったり、一つの国の中でも南部と北部で異常に重くなったりする事もあるそうなので、<strong>特に海外ユーザ向けにサービスを展開する場合は基本的に サービスを提供するユーザに近い場所にサーバを置くのが良い</strong>らしい。</p>
<h3>まとめ</h3>
<p>・ <strong>サーバ側で「秒間●リクエスト」をはかる時、ユーザ側のネットワーク帯域までは見ない</strong><span class="supl">( ユーザが有線を使っていようが3G回線を使っていようが、最終的に到達するサーバ周りのネットワーク領域は同じで、サーバ側のネットワーク領域側で特別な設定をしていない限りレスポンスの速度も基本的に同じだから )</span><br />
・ <strong>「秒間●リクエストをさばける」事が保障するのは</strong>、<strong>その量のリクエストが来た時にサーバがダウンすることなく稼動し続けられる事</strong> と <strong>システム全体におけるボトルネックの特定が可能になる事</strong><br />
・ 「秒間で沢山リクエストをさばける＝ユーザがサクサクページを見られる」ではない<br />
・ ただし必要最低限の秒間リクエスト数をクリアできないと 勿論ユーザへのレスポンス遅くなる<br />
・ ユーザがサクサクコンテンツを利用する上で、<strong>秒間リクエスト数の話とは別にターゲットとなるユーザの媒体とか居住地は別途考慮する必要はある</strong></p>
<p>…という認識です。</p>
<p>僕自身 まだまだ勉強不足な部分もございますので、「ここの部分根本から認識間違ってるよ」という部分がございましたら、優しくマサカリを投げていただければ幸いです。。。(´・_・`)</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1121">「秒間●リクエスト」の具体的な定義がモヤモヤしていたので調べてみた話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1121/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LispマクロでLispコードをCSSに変換するようにしてみた</title>
		<link>http://kinokoru.jp/archives/840</link>
		<comments>http://kinokoru.jp/archives/840#comments</comments>
		<pubDate>Tue, 16 Sep 2014 12:13:59 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[検証・考察]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Lisp]]></category>
		<category><![CDATA[マクロ]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=840</guid>
		<description><![CDATA[<p>覚えたてのマクロの練習がてらつくってみた。500バイト程度で実装。ファイル出力がなければ400バイトくらい？ 引数には名前と要素のリストを取るようにしよう。要素のリストは CSSの構造が以下のコードのようにネストされてい [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/840">LispマクロでLispコードをCSSに変換するようにしてみた</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p><a href="http://kinokoru.jp/wp-content/uploads/2014/09/text3763.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2014/09/text3763.jpg" alt="text3763" width="600" height="343" class="aligncenter size-full wp-image-853" /></a></p>
<p>覚えたてのマクロの練習がてらつくってみた。500バイト程度で実装。ファイル出力がなければ400バイトくらい？</p>
<p><span id="more-840"></span></p>
<pre class="brush: plain; title: ; notranslate">
(defmacro css (name elems)
  (with-open-file
    (*standard-output* (string-downcase name) :direction :output :if-exists :supersede)
    `(progn
       ,@(mapc
           (lambda (style)
             (let ((elem (car style))
                   (attrs (cadr style)))
               (format t &quot;~a {~%&quot; elem)
               (loop for i in attrs do
                     (format t &quot;~2T~a: ~a;~%&quot; (string-downcase (car i)) (cadr i)))
               (format t &quot;}~%~%&quot;))) elems)) t))
</pre>
<p>引数には名前と要素のリストを取るようにしよう。要素のリストは CSSの構造が以下のコードのようにネストされているようにする。<br />
2行目で with-open-file関数を呼び出し、3行目では標準出力の使用、アウトプット先などのオプションの指定。<br />
あとは <strong>要素 { &#8230; }</strong> が 各要素毎にひと固まりとして生成されるように mapをかけてあげる。ここでmapは直接ファイル出力として作用しており、リストを返す必要が無いのでmapcarではなくmapcを使用している。</p>
<p>そんでもって変換用のLispコードを用意する。</p>
<pre class="brush: plain; title: ; notranslate">
; Macro Sample 1

(css
  test.css
  ((&quot;.hoge&quot;
     ((background &quot;#F00&quot;)
      (border-radius &quot;5px&quot;)))
   (&quot;#fuga&quot;
     ((background &quot;#009&quot;)
      (color &quot;#FFF&quot;)))))

; Macro Sample 2

(css
  test2.css
  ((&quot;body&quot;
     ((background &quot;#CCC&quot;)))
   (&quot;p&quot;
     ((font-size &quot;10px&quot;)
      (margin &quot;3px 0&quot;)
      (padding &quot;5px 0&quot;)))))
</pre>
<p>これを先ほどのマクロと共に実行すると、「test.css」「test2.css」という二つのCSSファイルが作成される。</p>
<pre class="brush: css; title: ; notranslate">
/* test.css */
.hoge {
  background: #F00;
  border-radius: 5px;
}

#fuga {
  background: #009;
  color: #FFF;
}
</pre>
<pre class="brush: css; title: ; notranslate">
/* test2.css */
body {
  background: #CCC;
}

p {
  font-size: 10px;
  margin: 3px 0;
  padding: 5px 0;
}
</pre>
<p>もう少し厳密に書けばファイル出力のあたり関数に分けられるだろうし そもそももっと賢い書き方ができそうな気がするので、「ここはこうした方が良い」という部分がございましたら そっとマサカリを投げて頂ければ幸いです。</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/840">LispマクロでLispコードをCSSに変換するようにしてみた</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/840/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>【MySQL】インデックス指定の順序が気になったので、MySQLの構文解析ロジックを検証してみた話</title>
		<link>http://kinokoru.jp/archives/306</link>
		<comments>http://kinokoru.jp/archives/306#comments</comments>
		<pubDate>Tue, 25 Mar 2014 10:49:09 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[サーバ・インフラ系]]></category>
		<category><![CDATA[検証・考察]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=306</guid>
		<description><![CDATA[<p>ご無沙汰です。 本当は「数千万件のデータが入ったテーブルでインデックスを構築したらパフォーマンスが劇的に改善された話」というタイトルで書こうと思ったのだけど、書いているうちに内部構造が気になり出したので上記のタイトルに変 [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/306">【MySQL】インデックス指定の順序が気になったので、MySQLの構文解析ロジックを検証してみた話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>ご無沙汰です。</p>
<p>本当は<strong>「数千万件のデータが入ったテーブルでインデックスを構築したらパフォーマンスが劇的に改善された話」</strong>というタイトルで書こうと思ったのだけど、書いているうちに内部構造が気になり出したので上記のタイトルに変更。</p>
<h2>まずはパフォーマンスが改善された話から</h2>
<pre class="brush: sql; title: ; notranslate">

SELECT A FROM hoge WHERE B = ~~~ ORDER BY C DESC;

</pre>
<p>hogeは数千万件のデータが入ったテーブルで、その中から結果約4万件程のデータのうち A の部分をSELECT。条件としては、カラムBの値が~~~に合致するときで、更には Cという別のカラムで並び替えるというクエリになっている。</p>
<p>結果的に</p>
<pre class="brush: sql; title: ; notranslate">
ALTER TABLE hoge ADD INDEX foo ( B, C, A );
</pre>
<p>というインデックスを張ることによって、<strong>それまで2分以上かかっていたselect文が 0.1秒～0.2秒まで短縮されたという某赤いモビルスーツも驚きのパフォーマンス改善を見せた</strong>。</p>
<p>正直インデックスの劇的な威力に感動して、その喜びをブログにつづろうと思い立った所、以下の疑問が生まれたというのが始まり。</p>
<p>すなわち、</p>
<p>何で↓じゃだめなの？</p>
<pre class="brush: sql; title: ; notranslate">
ALTER TABLE hoge ADD INDEX foo ( A, B, C );
</pre>
<p>という話(どこかのブログで「<strong>インデックスは順序左から書かないと意味無いよ</strong>」と書いていたので)。</p>
<h2>仮説</h2>
<p>なんとなーく最近コンパイラをいじっていて記憶に新しい<strong>構文木的なにおい</strong>がするなあと感じた。</p>
<p>そこで、MySQLの構文解析機構を調べてみたところ、</p>
<p>案の定字句解析と構文解析をそれぞれ<strong>Flex</strong>と<strong>Bison</strong>で行っているようなので、勉強がてらMySQLの構文解析ロジックを見てみることにした。</p>
<h2>調査</h2>
<p>丁度GoogleがMySQLのコードを出していたので、MySQLの構文定義部である<strong>sql_yacc.yy</strong>の中身を拝見。</p>
<p><a href="http://code.google.com/p/google-mysql/source/browse/sql/sql_yacc.yy?r=d15790ab618324fb1729aa212b244cad5cb9778f" target="_blank">http://code.google.com/p/google-mysql/source/browse/sql/sql_yacc.yy?r=d15790ab618324fb1729aa212b244cad5cb9778f</a></p>
<p>まずは<strong>式全体の構文</strong>を探す。<strong>1600行目</strong>でみっけ。</p>
<pre class="brush: cpp; title: ; notranslate">
/* Verb clauses, except begin */
statement:
alter
| analyze
| backup
| binlog_base64_event
| call
| change
| check
| checksum
| commit
| create
| deallocate
| delete
| describe
| do
  :
  :
  :

</pre>
<p>中には「select」もしっかり定義されていたので、続いて<strong>select</strong>を探す。</p>
<p><strong>6638行目</strong>から始まっているのがそれっぽい。</p>
<pre class="brush: cpp; title: ; notranslate">

select:
select_init
{
LEX *lex= Lex;
lex-&gt;sql_command= SQLCOM_SELECT;
}
;

/* Need select_init2 for subselects. */
select_init:
SELECT_SYM select_init2
| '(' select_paren ')' union_opt
;

</pre>
<p>どんどん掘り下げていった結果、だいたいこんな感じになりました。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2014/03/trees.png"><img class="aligncenter size-full wp-image-310" alt="trees" src="http://kinokoru.jp/wp-content/uploads/2014/03/trees.png" width="630" height="500" /></a></p>
<h2></h2>
<h2>考察</h2>
<p><strong>選択するカラム</strong>と <strong>where句、order by句、 having 句、group by 句などの条件</strong>が<strong>明確に分断されていました</strong>。</p>
<p>つまり、<strong>select_from の部分は、よくあるコンパイラの factor = ( expression ) 的な感じで先に解析されていて、解析が終了した後でSELECT_SYM とがっちゃんこするのではないか</strong>と予想(定かではありません)。</p>
<p>こう考えると</p>
<pre class="brush: sql; title: ; notranslate">
ALTER TABLE hoge ADD INDEX foo ( B, C, A );
</pre>
<p>になるのはそこまで不思議な話ではないかなと感じた。</p>
<h2></h2>
<h2>実際はどうだったのか(2014.03.26追記)</h2>
<p>記事の公開後、友人から「<strong>covering index</strong> 的な話では」とご指摘をいただきました。</p>
<p>Covering Indexに関しては 以下の記事がとても参考になった。</p>
<p><a href="http://blog.livedoor.jp/sasata299/archives/51336006.html" target="_blank">MySQLでインデックスを使って高速化するならCovering Indexが使えそう</a></p>
<p>もう少しDBまわりの勉強もしないとなあと思いつつ、また新しいことを勉強させていただいた上にMySQLの内部構造にもちょこっと触れられたので 結果としては良かったかなと思った。</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/306">【MySQL】インデックス指定の順序が気になったので、MySQLの構文解析ロジックを検証してみた話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/306/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Cコンパイラことはじめ] 再帰的下向き構文解析の再帰ルーチンがいまいちイメージできない人に送る記事</title>
		<link>http://kinokoru.jp/archives/275</link>
		<comments>http://kinokoru.jp/archives/275#comments</comments>
		<pubDate>Sun, 09 Mar 2014 09:51:33 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[プログラミング言語]]></category>
		<category><![CDATA[検証・考察]]></category>
		<category><![CDATA[C言語]]></category>
		<category><![CDATA[再帰]]></category>
		<category><![CDATA[構文解析]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=275</guid>
		<description><![CDATA[<p>構文解析をしていてちょっと詰まったのでメモ。 上記の構文規則に基づくとすると、 10 + 20 * 5 + 10 * (1 + 1) の再帰ルーチンは以下のようになる。 (なお、 expression(), term() [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/275">[Cコンパイラことはじめ] 再帰的下向き構文解析の再帰ルーチンがいまいちイメージできない人に送る記事</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>構文解析をしていてちょっと詰まったのでメモ。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2014/03/rule.png"><img class="aligncenter size-medium wp-image-276" alt="rule" src="http://kinokoru.jp/wp-content/uploads/2014/03/rule-300x202.png" width="300" height="202" /></a></p>
<p>上記の構文規則に基づくとすると、<br />
10 + 20 * 5 + 10 * (1 + 1)<br />
の再帰ルーチンは以下のようになる。<br />
(なお、 expression(), term(), factor() はそれぞれ上記の構文規則を実装した関数 )</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2014/03/kaiseki2.png"><img class="aligncenter size-large wp-image-300" alt="kaiseki" src="http://kinokoru.jp/wp-content/uploads/2014/03/kaiseki2-321x1024.png" width="321" height="1024" /></a></p>
<p><span id="more-275"></span></p>
<h2>簡単な解説</h2>
<p>再帰的下向き構文解析って？</p>
<p>コンパイラとかで構文を解析する時に使う方法の一つ。</p>
<p>例えば以下の図は再帰的下向き構文解析を行うための簡単な規則の例です。</p>
<p>ここで使用しているそれぞれのワードについては以下の式を考えると分かりやすいかもしれないです。</p>
<p>10y + 3/5(10 + 10)</p>
<p>数学では 10y とか 3/5 とかのことを「<strong>項(term)</strong>」と呼ぶけど、<br />
10y, 3/5 というのは<br />
複数の変数・数値を割って成り立っているものなので、</p>
<p>10y = 10 * y<br />
3/5 = 3 / 5 * (10 + 10)</p>
<p>というように、<br />
項は 複数個の 割り算 または かけ算 によって成り立つ一つの単位として考えられるので、上記のような構文規則になります。</p>
<p>この項を足したり引いたりしたものをここでは「<strong>式(expression)</strong>」と呼びます。</p>
<p>10y + 3/5(10 + 10) は式です。</p>
<p>「あれ？そうすると ( 10 + 10 ) は式じゃないの？」<br />
となりますが、こちらの 10 + 10 も立派な式です。<br />
ですが、最初の expression() の段階では計算しません。<br />
項を更に分割した単位である「<strong>因子(factor)</strong>」まで分解して 因子にたどり着いた段階ではじめて 式に変換して計算を開始します。</p>
<p>因子については、上の式で言うと</p>
<p>10, y, 3, 5, (10 + 10) にあたります。</p>
<p>10, y, 3, 5 はそれ以上分解できない「定数」「識別子」としてそのまま処理され、<br />
括弧がついている場合は「その中に式がある」と判断して計算を開始します。</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/275">[Cコンパイラことはじめ] 再帰的下向き構文解析の再帰ルーチンがいまいちイメージできない人に送る記事</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/275/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
