<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xml:lang="ja">
	<channel>
		<title>名称未設定♥</title>
		<link>http://subtech.g.hatena.ne.jp/hirose31/</link>
		<description>名称未設定♥</description>
		<dc:creator>hirose31</dc:creator>


		<item>
			<title> perl-rename-buffer - package名にrename-bufferしてくれるelisp #2</title>
			<link>http://subtech.g.hatena.ne.jp/hirose31/20090624/1245829941</link>

			<description><![CDATA[
		<div class="section">
			<p><a href="http://subtech.g.hatena.ne.jp/hirose31/20090613/1244914640">g:subtech:id:hirose31:20090613:1244914640</a> の続き。</p>
			<p>コードスケッチのときとか、ひとつのファイルにmain部とpackage宣言とが混在してるときに、ファイルの下の方のpackage宣言をひろってrename-bufferしちゃうので、最初のn行までにpackage宣言があるときのみその名でrename-bufferするようにしてみた。</p>
<pre class="syntax-highlight">
<span class="synSpecial">(</span><span class="synStatement">defun</span> plcmp-get-current-package-name-first <span class="synSpecial">(</span>&amp;optional limitline<span class="synSpecial">)</span>
  <span class="synConstant">&quot;nil or string&quot;</span>
  <span class="synSpecial">(</span><span class="synStatement">let</span> <span class="synSpecial">((</span>re <span class="synSpecial">(</span>rx-to-string <span class="synPreProc">`(</span><span class="synStatement">and</span> bol
                                <span class="synSpecial">(</span><span class="synStatement">*</span> <span class="synStatement">space</span><span class="synSpecial">)</span>
                                <span class="synConstant">&quot;package&quot;</span>
                                <span class="synSpecial">(</span><span class="synStatement">*</span> <span class="synStatement">space</span><span class="synSpecial">)</span>
                                <span class="synSpecial">(</span>group
                                 <span class="synSpecial">(</span>regexp ,plcmp-perl-package-re<span class="synSpecial">))</span>
                                <span class="synSpecial">(</span><span class="synStatement">*</span> not-newline<span class="synSpecial">)</span>
                                <span class="synConstant">&quot;;&quot;</span><span class="synPreProc">)</span><span class="synSpecial">))</span>
        <span class="synSpecial">(</span>bound <span class="synSpecial">(</span><span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">not</span> limitline<span class="synSpecial">)</span>
                   <span class="synStatement">nil</span>
                 <span class="synSpecial">(</span>line-end-position limitline<span class="synSpecial">)))</span>
        <span class="synSpecial">)</span>
    <span class="synSpecial">(</span>save-excursion
      <span class="synSpecial">(</span>goto-char <span class="synSpecial">(</span>point-min<span class="synSpecial">))</span>
      <span class="synSpecial">(</span><span class="synStatement">when</span> <span class="synSpecial">(</span>re-search-forward re bound <span class="synStatement">t</span><span class="synSpecial">)</span>
        <span class="synSpecial">(</span>match-string-no-properties <span class="synConstant">1</span><span class="synSpecial">)))))</span>

<span class="synSpecial">(</span><span class="synStatement">defun</span> perl-rename-buffer <span class="synSpecial">()</span>
  <span class="synSpecial">(</span>interactive<span class="synSpecial">)</span>
  <span class="synSpecial">(</span><span class="synStatement">let</span> <span class="synSpecial">((</span><span class="synStatement">package-name</span> <span class="synSpecial">(</span>plcmp-get-current-package-name-first <span class="synConstant">16</span><span class="synSpecial">)))</span>
    <span class="synSpecial">(</span><span class="synStatement">when</span> <span class="synStatement">package-name</span>
      <span class="synSpecial">(</span>rename-buffer <span class="synStatement">package-name</span> <span class="synStatement">t</span><span class="synSpecial">))))</span>
</pre>

		</div>
]]></description>

			<dc:creator>hirose31</dc:creator>

			<pubDate>Wed, 24 Jun 2009 07:52:21 GMT</pubDate>



		</item>

		<item>
			<title> AnyEvent::FastPing 解体新書</title>
			<link>http://subtech.g.hatena.ne.jp/hirose31/20090617/1245220824</link>

			<description><![CDATA[
		<div class="section">
			<p>多ノードにすばやくping☆pongする必要があったのでAnyEvent::FastPingを使ってみたんですが、内部的にどういう処理をしてるのか気になってメモったので残しておきたいと思います。</p>
			<ul>
				<li> <a href="http://search.cpan.org/dist/AnyEvent-FastPing/" target="_blank">http://search.cpan.org/dist/AnyEvent-FastPing/</a></li>
			</ul>
			<p><a href="http://f.hatena.ne.jp/hirose31/20090617151700" class="hatena-fotolife" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/h/hirose31/20090617/20090617151700.jpg" alt="f:id:hirose31:20090617151700j:image" title="f:id:hirose31:20090617151700j:image" class="hatena-fotolife"></a></p>
			<ul>
				<li> pipe(2)を2回実行して、2ペア、都合4つのfdを作る</li>
				<li> BOOTブロック(=useされたタイミング？)でpthread_create(3)してワーカースレッドを作る</li>
				<li> メインスレッドとワーカースレッドは、最初に作ったpipe(2)なfdを介して互いのイベントを発火させる（図の左上と、下部の緑色の箱と矢印）
				<ul>
					<li> 例: メインスレッドが、pipe(2)なfdにwriteすると、繋がってる他方のfd(こっちはワーカスレッドが持ってる)がread可能になる。ほんで、これらのfdはepoll(7)やselect(2)で監視しているので、非同期にそのコールバックを実行可能になるわけです。</li>
				</ul>
				</li>
				<li> あと、ICMP用のSOCK_RAWなsocketも作ってて、これもepoll(7)で監視してる
				<ul>
					<li> ワーカースレッドの中でpingを送りまくる (sendto(2)しまくる)。応答は待たない。気にせず送りまくる。</li>
					<li> ほどなくしてpongが返ってくると、read可能になるのでメインスレッドのそのコールバックでrecvfrom(2)しまくって結果を表示しまくる</li>
				</ul>
				</li>
			</ul>			<br>

			<p>追記。</p>
			<p>「epoll(7)やselect(2)で監視している」のepoll(7)だとかselect(2)だとかは AnyEvent が隠蔽してくれるので、epoll(7)だとかselect(2)だとかのAPIの違いは気にする必要がないです。</p>
			<p>こんな感じ:</p>
<pre class="syntax-highlight">
<span class="synStatement">our</span> <span class="synIdentifier">$THR_RES_W</span> = AnyEvent-&gt;io (<span class="synConstant">fh </span>=&gt; <span class="synIdentifier">$THR_RES_FH</span>, <span class="synConstant">poll </span>=&gt; <span class="synConstant">'r'</span>, <span class="synConstant">cb </span>=&gt;<span class="synIdentifier"> </span><span class="synStatement">sub</span><span class="synIdentifier"> </span>{
   <span class="synStatement">my</span> <span class="synIdentifier">$sv</span> = _read_res
      <span class="synStatement">or</span> <span class="synStatement">return</span>;

   <span class="synIdentifier">$sv</span>-&gt;();
});
</pre>

			<p>に、AnyEventのI/O監視のAPIを使うだけで OK です。</p>
			<p>自分の環境 (Linux) では、use AnyEvent だけだと select(2) が使われて、</p>
<pre class="syntax-highlight">
<span class="synStatement">use </span>AnyEvent;
<span class="synStatement">use </span>EV;
</pre>

			<p>するとepoll(7)が使われました。</p>			<br>

			<p>(港区在住 非同期野郎Ｐチーム 31)</p>
		</div>
]]></description>

			<dc:creator>hirose31</dc:creator>

			<pubDate>Wed, 17 Jun 2009 06:40:24 GMT</pubDate>



		</item>

		<item>
			<title> perl-rename-buffer - package名にrename-bufferしてくれるelisp</title>
			<link>http://subtech.g.hatena.ne.jp/hirose31/20090613/1244914640</link>

			<description><![CDATA[
		<div class="section">
			<p><a class="keyword" href="http://subtech.g.hatena.ne.jp/keyword/Emacs">Emacs</a>でファイルを開くとそのバッファ名はファイル名になります。</p>
			<p>ですので、"なんとか/Server.pm" なファイルをいくつか開いていると、<a href="http://www.emacswiki.org/cgi-bin/wiki/Anything" target="_blank">anything</a>などでのバッファ選択では "Server.pm" がいっぱい出てきてどれがどれだかわかりません。</p>
			<p><a href="http://f.hatena.ne.jp/hirose31/20090614022231" class="hatena-fotolife" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/h/hirose31/20090614/20090614022231.png" alt="f:id:hirose31:20090614022231p:image" title="f:id:hirose31:20090614022231p:image" class="hatena-fotolife"></a></p>			<br>

			<p>バッファ名をpackage名にすれば区別がつくようになるんですが、いちいち手でrename-bufferするのはめんどうです。</p>
			<p>で、なんかいい方法ないですかねー？ときいたら <a href="http://subtech.g.hatena.ne.jp/IMAKADO/">id:IMAKADO</a> がさくっとファイルを開いたらバッファ名をpackage名にしてくれるのを作ってくれました。</p>
			<ul>
				<li> <a href="http://gist.github.com/127629" target="_blank">http://gist.github.com/127629</a></li>
			</ul>
			<p>これが使用後。</p>
			<p><a href="http://f.hatena.ne.jp/hirose31/20090614022232" class="hatena-fotolife" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/h/hirose31/20090614/20090614022232.png" alt="f:id:hirose31:20090614022232p:image" title="f:id:hirose31:20090614022232p:image" class="hatena-fotolife"></a></p>
			<p>ハラショー！！</p>
			<p><a href="http://subtech.g.hatena.ne.jp/hirose31/20090624/1245829941">g:subtech:id:hirose31:20090624:1245829941</a> に続きます……</p>			<br>
			<br>

			<p> </p>
		</div>
]]></description>

			<dc:creator>hirose31</dc:creator>

			<pubDate>Sat, 13 Jun 2009 17:37:20 GMT</pubDate>



		</item>

		<item>
			<title> mod_perl 2で、VirtualHostごとのErrorLogじゃなくてserver contextのErrorLogにエラーログなどが出力されちゃう</title>
			<link>http://subtech.g.hatena.ne.jp/hirose31/20090528/1243498022</link>

			<description><![CDATA[
		<div class="section">
			<ul>
				<li> Apache 2.2.11</li>
				<li> mod_perl 2.0.4</li>
			</ul>
<pre>
# zakkuri httpd.conf

LoadModule perl_module modules/mod_perl.so

ErrorLog  &#34;/var/log/httpd/default/default.err&#34;

&#60;VirtualHost &#42;&#62;
  ServerName   curry.example.com

  ErrorLog  &#34;/var/log/httpd/example.com/curry.err&#34;

  PerlOptions  +SetupEnv +Parent
  &#60;Location /&#62;
    SetHandler           modperl
    PerlResponseHandler  OrenoHandler
  &#60;/Location&#62;
&#60;/VirtualHost&#62;
</pre>

			<p>な構成で、OrenoHandler 内で</p>
<pre class="syntax-highlight">
<span class="synStatement">print</span>        <span class="synConstant">&quot;OrenoTest: STDOUT</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
<span class="synStatement">print</span> <span class="synIdentifier">STDERR</span> <span class="synConstant">&quot;OrenoTest: STDERR</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
<span class="synStatement">warn</span>         <span class="synConstant">&quot;OrenoTest: warn&quot;</span>;
<span class="synStatement">my</span> <span class="synIdentifier">$v1</span> = <span class="synConstant">&quot;2:&quot;</span> + <span class="synConstant">3</span>;
<span class="synStatement">eval</span> q[<span class="synStatement">my</span> <span class="synIdentifier">$v2</span> = <span class="synConstant">&quot;3:&quot;</span> + <span class="synConstant">4</span>;];
(<span class="synStatement">undef</span>) . <span class="synConstant">&quot;xxx&quot;</span>;
<span class="synStatement">my</span> <span class="synIdentifier">%h1</span> = <span class="synConstant">qw(foo bar baz)</span>;
<span class="synStatement">die</span> <span class="synConstant">&quot;OrenoTest: die&quot;</span>;
</pre>

			<p>とすると、VirtualHostのErrorLogのcurry.errじゃなくて、server contextのErrorLogのdeault.errに全部出ちゃう。</p>
			<p>VirtualHostが複数あると、ログが混ざってどのVirtualHostのか判別しづらくなるのでちゃんとVirtualHostのErrorLogに吐かせてあげたい。</p>			<br>

			<p><a href="http://perl.apache.org/docs/2.0/api/Apache2/Log.html#Virtual_Hosts" target="_blank">http://perl.apache.org/docs/2.0/api/Apache2/Log.html#Virtual_Hosts</a></p>
			<p>に書いてあるように、httpd.confで</p>
<pre>
-  PerlOptions  +SetupEnv +Parent
+  PerlOptions  +SetupEnv +Parent +GlobalRequest
</pre>

			<p>して、OrenoHandler で</p>
<pre>
use Apache2::Log ();
$SIG{__WARN__} = &#92;&#38;Apache2::ServerRec::warn;
</pre>

			<p>してあげると、curry.errにはこのように吐かれるようになる。</p>
<pre>
&#91;warn] OrenoTest: warn at ...
&#91;warn] Argument &#34;3:&#34; isn&#39;t numeric in addition (+) at (eval 8) line 1.&#92;n
&#91;warn] Use of uninitialized value in concatenation (.) or string at ...
&#91;warn] Odd number of elements in hash assignment at ...
</pre>

			<p>一方で、default.errにはこのように吐かれる。</p>
<pre>
Argument &#34;2:&#34; isn&#39;t numeric in addition (+) at ...
Useless use of concatenation (.) or string in void context at ...
OrenoTest: STDERR
</pre>
			<br>

			<p>つまり、</p>
			<ul>
				<li> warn</li>
				<li> die</li>
				<li> eval</li>
				<li> 実行時エラー？</li>
			</ul>
			<p>はVirtualHostのErrorLogに出るようになったけど、</p>
			<ul>
				<li> STDERR</li>
				<li> use warningsの警告？</li>
			</ul>
			<p>は依然としてserver contextのErrorLogに出てしまう。</p>			<br>

			<p>まぁこれでだいたいいいかなぁとは思うんですが、2点、残糞感がある感じす。</p>
			<ol>
				<li> 残りのSTDERRとwarningsもVirtualHostのErrorLogに出せないか</li>
				<li> PerlOptions の GlobalRequest ってなんか副作用ないか心配</li>
			</ol>
			<p>しゅ〜しゅ〜</p>
			<h4> 追記 2009-07-10</h4>
			<p>STDERR と Apache2::ServerRec::warn を tie して、print STDERR を Apache2::ServerRec::warn にしちゃう、というテクを同僚に教えてもらいました。</p>
<pre class="syntax-highlight">
<span class="synStatement">use </span>Apache2::Log ();
<span class="synIdentifier">$SIG</span>{__WARN__} = <span class="synIdentifier">\&amp;Apache2::ServerRec::warn</span>;
{
<span class="synType">    </span><span class="synStatement">package</span><span class="synType"> Oreno::_tie_stderr;</span>
<span class="synIdentifier">    </span><span class="synStatement">sub</span><span class="synIdentifier"> TIEHANDLE </span>{ <span class="synStatement">bless</span> {}, <span class="synStatement">shift</span> }
<span class="synIdentifier">    </span><span class="synStatement">sub</span><span class="synIdentifier"> PRINT     </span>{ <span class="synStatement">shift</span>; Apache2::ServerRec::<span class="synStatement">warn</span>(<span class="synIdentifier">@_</span>) }
    <span class="synStatement">tie</span> *STDERR, __PACKAGE__;
}
</pre>

			<p>これで print STDERR も VirtualHosts 毎の ErrorLog に出力されるようになったので、残すは</p>
			<ul>
				<li> use warningsの警告？</li>
			</ul>
			<p>のみです。</p>
		</div>
]]></description>

			<dc:creator>hirose31</dc:creator>

			<pubDate>Thu, 28 May 2009 08:07:02 GMT</pubDate>



		</item>

	</channel>
</rss>
