へきょのーと https://hekyou.hatenadiary.org/ http://blogs.law.harvard.edu/tech/rss Hatena::Blog SphinxCon JP 2012で発表させて頂きました https://hekyou.hatenadiary.org/entry/20120917/p1 <p>docutilsについて発表しました。</p><p><a href="https://gist.github.com/3730720">&#x767A;&#x8868;&#x8CC7;&#x6599;</a></p><br /> <p>デモで使用したツールはこちらです。<br /> reSTをリアルタイムでHTMLに変換します。</p><p><a href="http://dct.hekyou.com/">docutils check tool</a></p><br /> <p>ツールの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>はこちらです。<br /> 訳あって3つありますがgevent_socketio_flaskが良いと思います。</p><p><a href="https://github.com/hekyou/docutils-check">&#x30BD;&#x30FC;&#x30B9;&#x30B3;&#x30FC;&#x30C9;</a></p><br /> <p>最初は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Sphinx">Sphinx</a>のs6テーマで作っていましたが<br /> 表示の調整をする時間がなかったので<br /> <a href="http://gistdeck.herokuapp.com/">GistDeck</a><br /> を利用させて頂くことにしました。</p><p>ですがこれ<a class="keyword" href="http://d.hatena.ne.jp/keyword/Markdown">Markdown</a>用なので<br /> reSTだとページの扱いがうまくできません。</p><p>発表時は時間がなかったので<br /> 空行をたくさん入れて泥くさい対応で望みましたが<br /> 格好悪いのでちょっと調べてreST対応してみました。</p><p>下記をブックマークに登録して<a href="https://gist.github.com/3730720">&#x767A;&#x8868;&#x8CC7;&#x6599;</a>のページで<br /> そのブックマークをクリックして頂くとスライドが表示されます。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>javascript:(<span class="synIdentifier">function</span>()<span class="synIdentifier">{var</span>%20s=<span class="synStatement">document</span>.createElement(<span class="synConstant">'script'</span>);s.setAttribute(<span class="synConstant">'src'</span>,<span class="synConstant">'https://gistdeck-hekyou.herokuapp.com/gistdeck.js'</span>);<span class="synStatement">document</span>.getElementsByTagName(<span class="synConstant">'head'</span>)<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>.appendChild(s);<span class="synIdentifier">}</span>)(); </pre><p><br /> 初めての発表なのに<br /> 準備不足睡眠不足でぐだぐだになってしまって<br /> なんかすみませんでした。。</p><p>次がんばろ...</p> Mon, 17 Sep 2012 00:00:00 +0900 hatenablog://entry/17680117127185954214 python sphinx 数値の合計を求めるコマンドを作ってみた https://hekyou.hatenadiary.org/entry/20120912/p1 <p>exprとか<a class="keyword" href="http://d.hatena.ne.jp/keyword/awk">awk</a>とか使う方法は思い付いたけど<br /> もっと簡単にできないかなぁと思って作ってみました。<br /> <br /> </p> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20OS%20X">Mac OS X</a> 10.8.1<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a> 4.2.1<br /> <br /> </p> </div> <div class="section"> <h4>準備</h4> <div class="section"> <h5>入力値の準備</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>$ cat input.txt <span class="synConstant">123</span> <span class="synConstant">10</span> <span class="synConstant">232</span> <span class="synConstant">111</span> <span class="synConstant">301</span> </pre> </div> <div class="section"> <h5>コマンドの準備</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>$ gcc <span class="synSpecial">-o</span> calc calc.c </pre> </div> </div> <div class="section"> <h4>実行</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>$ cat input.txt |./calc <span class="synConstant">777</span> $ seq <span class="synConstant">1</span> <span class="synConstant">10</span> |./calc <span class="synConstant">55</span> </pre> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a></h4> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&lt;stdio.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;string.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;stdlib.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;unistd.h&gt;</span> <span class="synPreProc">#define BUF_SIZE </span><span class="synConstant">512</span> <span class="synType">int</span> calc(<span class="synType">char</span> *read, <span class="synType">int</span> sum) { <span class="synType">char</span> *read_pos = read; <span class="synType">char</span> *new_pos; <span class="synStatement">while</span> (<span class="synConstant">1</span>) { new_pos = strchr(read_pos, <span class="synSpecial">'\n'</span>); <span class="synStatement">if</span> (new_pos == <span class="synConstant">NULL</span>) { memcpy(read, read_pos, BUF_SIZE * <span class="synConstant">2</span> - (read_pos - read) + <span class="synConstant">1</span>); <span class="synStatement">break</span>; } *new_pos = <span class="synSpecial">'\0'</span>; ++new_pos; sum += atoi(read_pos); read_pos = new_pos; } <span class="synStatement">return</span> sum; } <span class="synType">int</span> main(<span class="synType">int</span> argc, <span class="synType">char</span> *<span class="synType">const</span> argv[]) { <span class="synType">char</span> buf[BUF_SIZE]; <span class="synType">char</span> cache[BUF_SIZE * <span class="synConstant">2</span> + <span class="synConstant">1</span>]; <span class="synType">int</span> read_size = <span class="synConstant">0</span>; <span class="synType">int</span> write_size = <span class="synConstant">0</span>; <span class="synType">int</span> cache_size; <span class="synType">int</span> sum = <span class="synConstant">0</span>; memset(cache, <span class="synSpecial">'\0'</span>, BUF_SIZE * <span class="synConstant">2</span> + <span class="synConstant">1</span>); <span class="synStatement">while</span> (read_size = read(<span class="synConstant">0</span>, buf, BUF_SIZE)) { <span class="synStatement">if</span> (read_size == -<span class="synConstant">1</span>) { fprintf(<span class="synConstant">stderr</span>, <span class="synConstant">&quot;read error</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>); <span class="synStatement">return</span> <span class="synConstant">1</span>; } cache_size = strlen(cache); memcpy(cache + cache_size, buf, read_size); read_size = cache_size + read_size; sum += calc(cache, sum); <span class="synStatement">if</span> (strlen(cache) &gt; BUF_SIZE) { fprintf(<span class="synConstant">stderr</span>, <span class="synConstant">&quot;record size over error</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>); <span class="synStatement">return</span> <span class="synConstant">1</span>; } } printf(<span class="synConstant">&quot;</span><span class="synSpecial">%d</span><span class="synConstant">&quot;</span>, sum); <span class="synStatement">return</span> <span class="synConstant">0</span>; } </pre><p>久々に<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%B8%C0%B8%EC">C言語</a>触った!自信ないw</p><p>まあこれから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%D5%A5%A1%A5%AF%A5%BF%A5%EA%A5%F3%A5%B0">リファクタリング</a>しつつ機能を拡張してみようかなと。<br /> 付けたいオプションもあるしね!</p><br /> <br /> <p>って、今こんなことしている暇ないんだった!!!</p><p>SphinxConJPの資料作成しないと><</p><p>試験前に掃除したくなる病ががが......</p> </div> Wed, 12 Sep 2012 00:00:00 +0900 hatenablog://entry/17680117127185954561 C shell geventでWebSocketを使ってみる https://hekyou.hatenadiary.org/entry/20120712/p1 <p>WebSocketを使ってやりたいことがあったのですが<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>のモジュールを使いたかったので<br /> Node.jsではなく<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>のgeventを使ってみました。<br /> <br /> </p> <div class="section"> <h4>環境</h4> <p>Max <a class="keyword" href="http://d.hatena.ne.jp/keyword/OS%20X">OS X</a> 10.6.8<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 2.7.3<br /> gevent 0.13.7<br /> gevent-websocket 0.3.6</p> </div> <div class="section"> <h4>インストール</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>はインストール済みで<br /> virtualenvで作った仮想環境で行います。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>port install libevent <span class="synComment"># pip install geventだとエラーが出るのでソースからインストール</span> curl http://pypi.python.org/packages/<span class="synStatement">source</span>/g/gevent/gevent-0.13.7.tar.gz#<span class="synIdentifier">md5</span>=c74004730c2543260b751b0aa782987c <span class="synSpecial">-o</span> gevent-0.13.7.tgz tar xzf gevent-0.13.7.tgz <span class="synStatement">cd</span> gevent-0.13.7 python setup.py install <span class="synSpecial">-I</span> /opt/<span class="synStatement">local</span>/include <span class="synSpecial">-L</span> /opt/<span class="synStatement">local</span>/lib pip install gevent-websocket </pre> </div> <div class="section"> <h4>コーディング</h4> <div class="section"> <h5>app.py</h5> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> sys <span class="synPreProc">from</span> gevent <span class="synPreProc">import</span> pywsgi <span class="synPreProc">from</span> geventwebsocket.handler <span class="synPreProc">import</span> WebSocketHandler f = <span class="synIdentifier">open</span>(<span class="synConstant">&quot;./index.html&quot;</span>); content = f.read() f.close() <span class="synStatement">def</span> <span class="synIdentifier">app</span>(environ, start_response): <span class="synStatement">if</span> environ[<span class="synConstant">&quot;PATH_INFO&quot;</span>] == <span class="synConstant">'/echo'</span>: ws = environ[<span class="synConstant">&quot;wsgi.websocket&quot;</span>] <span class="synStatement">while</span> <span class="synIdentifier">True</span>: src = ws.receive() <span class="synStatement">if</span> src <span class="synStatement">is</span> <span class="synIdentifier">None</span>: <span class="synStatement">break</span> ws.send(src) <span class="synStatement">else</span>: start_response(<span class="synConstant">&quot;200 OK&quot;</span>, [ (<span class="synConstant">&quot;Content-Type&quot;</span>, <span class="synConstant">&quot;text/html&quot;</span>), (<span class="synConstant">&quot;Content-Length&quot;</span>, <span class="synIdentifier">str</span>(<span class="synIdentifier">len</span>(content))) ]) <span class="synStatement">return</span> <span class="synIdentifier">iter</span>([content]) <span class="synStatement">if</span> __name__==<span class="synConstant">&quot;__main__&quot;</span>: server = pywsgi.WSGIServer((<span class="synConstant">'127.0.0.1'</span>, <span class="synConstant">8000</span>), app, handler_class=WebSocketHandler) server.serve_forever() </pre> </div> <div class="section"> <h5>index.html</h5> <pre class="code lang-html" data-lang="html" data-unlink><span class="synIdentifier">&lt;</span><span class="synStatement">html</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span> <span class="synPreProc"> </span><span class="synIdentifier">&lt;</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span>gevent websocket test<span class="synIdentifier">&lt;/</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">h1</span><span class="synIdentifier">&gt;</span>test<span class="synIdentifier">&lt;/</span><span class="synStatement">h1</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">input</span><span class="synIdentifier"> </span><span class="synType">name</span><span class="synIdentifier">=</span><span class="synConstant">&quot;send_input&quot;</span><span class="synIdentifier"> </span><span class="synType">id</span><span class="synIdentifier">=</span><span class="synConstant">&quot;send_input&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">input</span><span class="synIdentifier"> </span><span class="synType">type</span><span class="synIdentifier">=</span><span class="synConstant">&quot;button&quot;</span><span class="synIdentifier"> </span><span class="synType">value</span><span class="synIdentifier">=</span><span class="synConstant">&quot;push&quot;</span><span class="synIdentifier"> </span><span class="synSpecial">onclick=&quot;send_data</span>()<span class="synSpecial">&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">textarea</span><span class="synIdentifier"> </span><span class="synType">id</span><span class="synIdentifier">=</span><span class="synConstant">&quot;view&quot;</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">textarea</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier"> </span><span class="synType">type</span><span class="synIdentifier">=</span><span class="synConstant">&quot;text/javascript&quot;</span><span class="synIdentifier"> </span><span class="synType">src</span><span class="synIdentifier">=</span><span class="synConstant">&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier"> </span><span class="synType">type</span><span class="synIdentifier">=</span><span class="synConstant">&quot;text/javascript&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">var</span><span class="synSpecial"> ws = </span><span class="synStatement">new</span><span class="synSpecial"> WebSocket</span>(<span class="synConstant">&quot;ws://127.0.0.1:8000/echo&quot;</span>)<span class="synSpecial">;</span> <span class="synSpecial">ws.onmessage = </span><span class="synIdentifier">function</span>(<span class="synSpecial">e</span>)<span class="synSpecial"> </span><span class="synIdentifier">{</span> <span class="synSpecial"> $</span>(<span class="synConstant">&quot;#view&quot;</span>)<span class="synSpecial">.html</span>(<span class="synSpecial">$</span>(<span class="synConstant">&quot;#view&quot;</span>)<span class="synSpecial">.val</span>()<span class="synSpecial"> + e.data + </span><span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>)<span class="synSpecial">;</span> <span class="synIdentifier">}</span><span class="synSpecial">;</span> <span class="synIdentifier">function</span><span class="synSpecial"> send_data</span>()<span class="synSpecial"> </span><span class="synIdentifier">{</span> <span class="synSpecial"> ws.send</span>(<span class="synSpecial">$</span>(<span class="synConstant">&quot;#send_input&quot;</span>)<span class="synSpecial">.val</span>())<span class="synSpecial">;</span> <span class="synIdentifier">}</span><span class="synSpecial">;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">html</span><span class="synIdentifier">&gt;</span> </pre> </div> </div> <div class="section"> <h4>実行</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>python app.py </pre><p>ブラウザで"<a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>"にアクセスして<br /> input textに文字を入力して"push"すると</p><p>textareaに入力した内容が表示されました!</p> </div> Thu, 12 Jul 2012 00:00:03 +0900 hatenablog://entry/17680117127185957161 python websocket geventとWebSocketとFlask https://hekyou.hatenadiary.org/entry/20120712/p2 <p><a href="http://d.hatena.ne.jp/hekyou/20120712/p1">gevent&#x3067;WebSocket&#x3092;&#x4F7F;&#x3063;&#x3066;&#x307F;&#x308B; - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a></p><p>前回の内容にFlaskを組み込んでみた。<br /> <br /> </p> <div class="section"> <h4>環境</h4> <p>Max <a class="keyword" href="http://d.hatena.ne.jp/keyword/OS%20X">OS X</a> 10.6.8<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 2.7.3<br /> gevent 0.13.7<br /> gevent-websocket 0.3.6<br /> Flask 0.9</p> </div> <div class="section"> <h4>インストール</h4> <p>前回の環境をそのまま使います。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>pip install Flask <span class="synStatement">mkdir</span> templates <span class="synStatement">mv</span> index.html templates/ </pre> </div> <div class="section"> <h4>コーディング</h4> <div class="section"> <h5>app.py</h5> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> os <span class="synPreProc">from</span> gevent <span class="synPreProc">import</span> pywsgi <span class="synPreProc">from</span> geventwebsocket.handler <span class="synPreProc">import</span> WebSocketHandler <span class="synPreProc">from</span> flask <span class="synPreProc">import</span> Flask, request, render_template app = Flask(__name__) <span class="synPreProc">@</span><span class="synIdentifier">app.route</span>(<span class="synConstant">'/'</span>) <span class="synStatement">def</span> <span class="synIdentifier">index</span>(): <span class="synStatement">return</span> render_template(<span class="synConstant">'index.html'</span>) <span class="synPreProc">@</span><span class="synIdentifier">app.route</span>(<span class="synConstant">'/echo'</span>) <span class="synStatement">def</span> <span class="synIdentifier">echo</span>(): <span class="synStatement">if</span> request.environ.get(<span class="synConstant">'wsgi.websocket'</span>): ws = request.environ[<span class="synConstant">'wsgi.websocket'</span>] <span class="synStatement">while</span> <span class="synIdentifier">True</span>: src = ws.receive() <span class="synStatement">if</span> src <span class="synStatement">is</span> <span class="synIdentifier">None</span>: <span class="synStatement">break</span> ws.send(src) <span class="synStatement">return</span> <span class="synStatement">if</span> __name__ == <span class="synConstant">'__main__'</span>: server = pywsgi.WSGIServer((<span class="synConstant">'127.0.0.1'</span>, <span class="synConstant">8000</span>), app, handler_class=WebSocketHandler) server.serve_forever() </pre> </div> <div class="section"> <h5>index.html</h5> <p>※変更なし</p> </div> </div> <div class="section"> <h4>実行</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>python app.py </pre><p>ブラウザで"<a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>"にアクセスして<br /> input textに文字を入力して"push"すると</p><p>textareaに入力した内容が表示されました!</p> </div> Thu, 12 Jul 2012 00:00:02 +0900 hatenablog://entry/17680117127185956794 python websocket geventをginkgoフレームワークで使ってみたよ https://hekyou.hatenadiary.org/entry/20120712/p3 <p><a href="http://d.hatena.ne.jp/hekyou/20120712/p1">gevent&#x3067;WebSocket&#x3092;&#x4F7F;&#x3063;&#x3066;&#x307F;&#x308B; - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a><br /> <a href="http://d.hatena.ne.jp/hekyou/20120712/p2">gevent&#x3068;WebSocket&#x3068;Flask - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a></p><p>前回、前々回とgeventを使いましたが<br /> 今回はginkgo<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF">フレームワーク</a>を利用してやってみます。</p><p>※ginkgoの読みってギンコ??<br /> <br /> </p> <div class="section"> <h4>環境</h4> <p>Max <a class="keyword" href="http://d.hatena.ne.jp/keyword/OS%20X">OS X</a> 10.6.8<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 2.7.3<br /> gevent 0.13.7<br /> Ginkgo 0.5.0dev</p> </div> <div class="section"> <h4>インストール</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>git clone https://github.com/progrium/ginkgo.git <span class="synStatement">cd</span> ginkgo/ sudo python setup.py install </pre> </div> <div class="section"> <h4>コーディング</h4> <div class="section"> <h5>app.py</h5> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> os <span class="synPreProc">from</span> ginkgo <span class="synPreProc">import</span> Service <span class="synPreProc">from</span> ginkgo.async.gevent <span class="synPreProc">import</span> WSGIServer <span class="synPreProc">from</span> geventwebsocket.handler <span class="synPreProc">import</span> WebSocketHandler <span class="synStatement">class</span> <span class="synIdentifier">WebSocket</span>(Service): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self): self.add_service(WSGIServer((<span class="synConstant">'127.0.0.1'</span>, <span class="synConstant">8001</span>), self.handle, handler_class=WebSocketHandler)) <span class="synStatement">def</span> <span class="synIdentifier">handle</span>(self, environ, start_response): <span class="synStatement">if</span> environ.get(<span class="synConstant">'wsgi.websocket'</span>): ws = environ[<span class="synConstant">&quot;wsgi.websocket&quot;</span>] <span class="synStatement">while</span> <span class="synIdentifier">True</span>: src = ws.receive() <span class="synStatement">if</span> src <span class="synStatement">is</span> <span class="synIdentifier">None</span>: <span class="synStatement">break</span> ws.send(src) <span class="synStatement">class</span> <span class="synIdentifier">Http</span>(Service): f = <span class="synIdentifier">open</span>(<span class="synConstant">&quot;./index.html&quot;</span>); content = f.read() f.close() <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self): self.add_service(WSGIServer((<span class="synConstant">'127.0.0.1'</span>, <span class="synConstant">8000</span>), self.handle)) <span class="synStatement">def</span> <span class="synIdentifier">handle</span>(self, environ, start_response): start_response(<span class="synConstant">'200 OK'</span>, [(<span class="synConstant">'Content-Type'</span>, <span class="synConstant">'text/html'</span>)]) <span class="synStatement">return</span> [self.content] <span class="synStatement">class</span> <span class="synIdentifier">Application</span>(Service): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self): self.add_service(Http()) self.add_service(WebSocket()) </pre> </div> <div class="section"> <h5>index.html</h5> <pre class="code lang-html" data-lang="html" data-unlink><span class="synIdentifier">&lt;</span><span class="synStatement">html</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span> <span class="synPreProc"> </span><span class="synIdentifier">&lt;</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span>ginkgo test<span class="synIdentifier">&lt;/</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">h1</span><span class="synIdentifier">&gt;</span>test<span class="synIdentifier">&lt;/</span><span class="synStatement">h1</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">input</span><span class="synIdentifier"> </span><span class="synType">name</span><span class="synIdentifier">=</span><span class="synConstant">&quot;send_input&quot;</span><span class="synIdentifier"> </span><span class="synType">id</span><span class="synIdentifier">=</span><span class="synConstant">&quot;send_input&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">input</span><span class="synIdentifier"> </span><span class="synType">type</span><span class="synIdentifier">=</span><span class="synConstant">&quot;button&quot;</span><span class="synIdentifier"> </span><span class="synType">value</span><span class="synIdentifier">=</span><span class="synConstant">&quot;push&quot;</span><span class="synIdentifier"> </span><span class="synSpecial">onclick=&quot;send_data</span>()<span class="synSpecial">&quot;</span><span class="synIdentifier"> /&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">textarea</span><span class="synIdentifier"> </span><span class="synType">id</span><span class="synIdentifier">=</span><span class="synConstant">&quot;view&quot;</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">textarea</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier"> </span><span class="synType">type</span><span class="synIdentifier">=</span><span class="synConstant">&quot;text/javascript&quot;</span><span class="synIdentifier"> </span><span class="synType">src</span><span class="synIdentifier">=</span><span class="synConstant">&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier"> </span><span class="synType">type</span><span class="synIdentifier">=</span><span class="synConstant">&quot;text/javascript&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">var</span><span class="synSpecial"> ws = </span><span class="synStatement">new</span><span class="synSpecial"> WebSocket</span>(<span class="synConstant">&quot;ws://127.0.0.1:8001/&quot;</span>)<span class="synSpecial">;</span> <span class="synSpecial">ws.onmessage = </span><span class="synIdentifier">function</span>(<span class="synSpecial">e</span>)<span class="synSpecial"> </span><span class="synIdentifier">{</span> <span class="synSpecial"> $</span>(<span class="synConstant">&quot;#view&quot;</span>)<span class="synSpecial">.html</span>(<span class="synSpecial">$</span>(<span class="synConstant">&quot;#view&quot;</span>)<span class="synSpecial">.val</span>()<span class="synSpecial"> + e.data + </span><span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>)<span class="synSpecial">; </span> <span class="synIdentifier">}</span><span class="synSpecial">;</span> <span class="synIdentifier">function</span><span class="synSpecial"> send_data</span>()<span class="synSpecial"> </span><span class="synIdentifier">{</span> <span class="synSpecial"> ws.send</span>(<span class="synSpecial">$</span>(<span class="synConstant">&quot;#send_input&quot;</span>)<span class="synSpecial">.val</span>())<span class="synSpecial">;</span> <span class="synIdentifier">}</span><span class="synSpecial">;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">html</span><span class="synIdentifier">&gt;</span> </pre> </div> </div> <div class="section"> <h4>実行</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>ginkgo app.Application </pre><p>ブラウザで"<a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>"にアクセスして<br /> input textに文字を入力して"push"すると</p><p>textareaに入力した内容が表示されました!</p> </div> Thu, 12 Jul 2012 00:00:01 +0900 hatenablog://entry/17680117127185956292 python websocket geventとWebSocketとginkgoとFlask https://hekyou.hatenadiary.org/entry/20120712/p4 <p><a href="http://d.hatena.ne.jp/hekyou/20120712/p1">gevent&#x3067;WebSocket&#x3092;&#x4F7F;&#x3063;&#x3066;&#x307F;&#x308B; - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a><br /> <a href="http://d.hatena.ne.jp/hekyou/20120712/p2">gevent&#x3068;WebSocket&#x3068;Flask - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a><br /> <a href="http://d.hatena.ne.jp/hekyou/20120712/p3">gevent&#x3092;ginkgo&#x30D5;&#x30EC;&#x30FC;&#x30E0;&#x30EF;&#x30FC;&#x30AF;&#x3067;&#x4F7F;&#x3063;&#x3066;&#x307F;&#x305F;&#x3088; - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a></p><p>前回、ginkgo<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF">フレームワーク</a>を利用してgeventを使いましたが<br /> 今回はそれにFlaskも組み込んでみます。<br /> <br /> </p> <div class="section"> <h4>環境</h4> <p>Max <a class="keyword" href="http://d.hatena.ne.jp/keyword/OS%20X">OS X</a> 10.6.8<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 2.7.3<br /> gevent 0.13.7<br /> Ginkgo 0.5.0dev<br /> Flask 0.9</p> </div> <div class="section"> <h4>インストール</h4> <p>※変更なし</p> </div> <div class="section"> <h4>コーディング</h4> <div class="section"> <h5>app.py</h5> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> os <span class="synPreProc">from</span> ginkgo <span class="synPreProc">import</span> Service <span class="synPreProc">from</span> ginkgo.async.gevent <span class="synPreProc">import</span> WSGIServer <span class="synPreProc">from</span> geventwebsocket.handler <span class="synPreProc">import</span> WebSocketHandler <span class="synPreProc">from</span> flask <span class="synPreProc">import</span> Flask, render_template <span class="synStatement">class</span> <span class="synIdentifier">WebSocket</span>(Service): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self): self.add_service(WSGIServer((<span class="synConstant">'127.0.0.1'</span>, <span class="synConstant">8001</span>), self.handle, handler_class=WebSocketHandler)) <span class="synStatement">def</span> <span class="synIdentifier">handle</span>(self, environ, start_response): <span class="synStatement">if</span> environ.get(<span class="synConstant">'wsgi.websocket'</span>): ws = environ[<span class="synConstant">&quot;wsgi.websocket&quot;</span>] <span class="synStatement">while</span> <span class="synIdentifier">True</span>: src = ws.receive() <span class="synStatement">if</span> src <span class="synStatement">is</span> <span class="synIdentifier">None</span>: <span class="synStatement">break</span> ws.send(src) <span class="synStatement">class</span> <span class="synIdentifier">Http</span>(Service): app = Flask(__name__) <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self): self.add_service(WSGIServer((<span class="synConstant">'127.0.0.1'</span>, <span class="synConstant">8000</span>), self.app)) <span class="synPreProc">@</span><span class="synIdentifier">app.route</span>(<span class="synConstant">&quot;/&quot;</span>, methods=[<span class="synConstant">'GET'</span>]) <span class="synStatement">def</span> <span class="synIdentifier">index</span>(): <span class="synStatement">return</span> render_template(<span class="synConstant">'index.html'</span>) <span class="synStatement">class</span> <span class="synIdentifier">Application</span>(Service): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self): self.add_service(Http()) self.add_service(WebSocket()) </pre> </div> <div class="section"> <h5>index.html</h5> <p>※変更なし</p> </div> </div> <div class="section"> <h4>実行</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>ginkgo app.Application </pre><p>ブラウザで"<a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>"にアクセスして<br /> input textに文字を入力して"push"すると</p><p>textareaに入力した内容が表示されました!</p> </div> Thu, 12 Jul 2012 00:00:00 +0900 hatenablog://entry/17680117127185955233 python websocket luvitを使ってLuaでWebアプリ! https://hekyou.hatenadiary.org/entry/20120520/p1 <p>luvitはNode.jsの機能を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Lua">Lua</a>で実現しようみたいな?<br /> もののようです。(まだよくわかっていない...)</p><p>試しにインストールとブラウザ上で"<a class="keyword" href="http://d.hatena.ne.jp/keyword/Hello%20world">Hello world</a>"を<br /> 表示するところまでやってみます。</p><br /> <p>最初 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20OS%20X">Mac OS X</a> 10.6.8 に入れたのですが</p> <pre class="code lang-sh" data-lang="sh" data-unlink>luaL_newstate has failed </pre><p>が出て実行できませんでした。。<br /> 解決策を調べて色々と試してはみたのですが<br /> 力不足で解決できず、諦めましたw<br /> <br /> </p> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a> 6.2<br /> luvit 0.3.1-61-g95c2503</p> </div> <div class="section"> <h4>インストール</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>git clone https://github.com/luvit/luvit.git <span class="synStatement">cd</span> luvit make make install </pre><p>※予め<a class="keyword" href="http://d.hatena.ne.jp/keyword/Lua">Lua</a>, LuaJITを入れておく必要はありません。</p> </div> <div class="section"> <h4>コーディング</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>から落としてきたなかにexamplesがあって<br /> 実装例が豊富にあるので参考になります。</p><p>今回はブラウザで表示するだけなので<br /> luvit/examples/http-server.<a class="keyword" href="http://d.hatena.ne.jp/keyword/lua">lua</a><br /> を使用します。</p> <pre class="code lang-lua" data-lang="lua" data-unlink><span class="synComment">-- http-server.lua</span> <span class="synStatement">local</span> http = <span class="synIdentifier">require</span>(<span class="synConstant">&quot;http&quot;</span>) http.createServer(<span class="synIdentifier">function</span> (req, res) <span class="synStatement">local</span> body = <span class="synConstant">&quot;Hello world</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span> res:writeHead(<span class="synConstant">200</span>, <span class="synType">{</span> [<span class="synConstant">&quot;Content-Type&quot;</span>] = <span class="synConstant">&quot;text/plain&quot;</span>, [<span class="synConstant">&quot;Content-Length&quot;</span>] = #body <span class="synType">}</span>) res:finish(body) <span class="synIdentifier">end</span>):listen(<span class="synConstant">8080</span>) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;Server listening at http://localhost:8080/&quot;</span>) </pre><p>このサンプルファイルを実行して</p> <pre class="code lang-sh" data-lang="sh" data-unlink>luvit http-server.lua </pre><p>"<a href="http://localhost:8080/">http://localhost:8080/</a>"にアクセスするだけ。簡単!<br /> <br /> </p> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/localhost">localhost</a>ではなく<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>を指定する方法</h5> <p>検索しても見つからなかったので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>を調べてみました。<br /> "luvit/lib/luvit/net.<a class="keyword" href="http://d.hatena.ne.jp/keyword/lua">lua</a>"<br /> を見るとlisten()の第二引数に指定でいけそうです。</p> <pre class="code lang-lua" data-lang="lua" data-unlink><span class="synComment">-- my-http-server.lua</span> <span class="synStatement">local</span> http = <span class="synIdentifier">require</span>(<span class="synConstant">&quot;http&quot;</span>) http.createServer(<span class="synIdentifier">function</span> (req, res) <span class="synStatement">local</span> body = <span class="synConstant">&quot;Hello world</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span> res:writeHead(<span class="synConstant">200</span>, <span class="synType">{</span> [<span class="synConstant">&quot;Content-Type&quot;</span>] = <span class="synConstant">&quot;text/plain&quot;</span>, [<span class="synConstant">&quot;Content-Length&quot;</span>] = #body <span class="synType">}</span>) res:finish(body) <span class="synIdentifier">end</span>):listen(<span class="synConstant">8080</span>, <span class="synConstant">&quot;192.168.212.197&quot;</span>) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;Server listening at http://localhost:8080/&quot;</span>) </pre><p>実行!</p> <pre class="code lang-sh" data-lang="sh" data-unlink>luvit my-http-server.lua </pre><p>ブラウザで"<a href="http://192.168.212.197:8080/">http://192.168.212.197:8080/</a>"にアクセス</p> <pre class="code" data-lang="" data-unlink>Hello world</pre><p>できた!</p> </div> </div> Sun, 20 May 2012 00:00:00 +0900 hatenablog://entry/17680117127185957637 Lua luvit Vimで矩形貼り付けをするプラグインを作ってみた - 改良版 - https://hekyou.hatenadiary.org/entry/20120325/p1 <p><a href="http://d.hatena.ne.jp/hekyou/20120315/p1">Vim&#x3067;&#x77E9;&#x5F62;&#x8CBC;&#x308A;&#x4ED8;&#x3051;&#x3092;&#x3059;&#x308B;&#x30D7;&#x30E9;&#x30B0;&#x30A4;&#x30F3;&#x3092;&#x4F5C;&#x3063;&#x3066;&#x307F;&#x305F; - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a></p><p>以前作成した矩形貼り付けをする<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a> pluginを改良したので<br /> 改めて使い方をご紹介します。(まだhelpがないので...)</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%AF%A5%E9%A5%A8%A5%C7%A5%A3%A5%BF">サクラエディタ</a>などにある矩形貼り付けは<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>標準では(おそらく)ないのでpluginとして実装しました。</p><p>※setreg()で可能なようですが、本pluginでは選択モード時とquickrun挿入で差別化を...<br /> <br /> <br /> </p> <div class="section"> <h4>ダウンロード</h4> <p><a href="https://github.com/hekyou/vim-rectinsert">https://github.com/hekyou/vim-rectinsert</a></p><p></p> </div> <div class="section"> <h4>使い方</h4> <div class="section"> <h5>カーソルの左側に挿入する場合</h5> <pre class="code lang-vim" data-lang="vim" data-unlink>:RectInsert <span class="synStatement">-i</span> </pre><p>※マップコマンド設定例</p> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synStatement">nmap</span> <span class="synSpecial">&lt;silent&gt;</span> <span class="synSpecial">&lt;leader&gt;</span>hi <span class="synSpecial">&lt;Plug&gt;</span>(rectinsert_insert) </pre> </div> <div class="section"> <h5>カーソルの右側に挿入する場合</h5> <pre class="code lang-vim" data-lang="vim" data-unlink>:RectInsert <span class="synStatement">-a</span> </pre><p>※マップコマンド設定例</p> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synStatement">nmap</span> <span class="synSpecial">&lt;silent&gt;</span> <span class="synSpecial">&lt;leader&gt;</span>ha <span class="synSpecial">&lt;Plug&gt;</span>(rectinsert_append) </pre> </div> <div class="section"> <h5>矩形選択した箇所に挿入する場合</h5> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synComment">&quot; カーソルの左側に挿入する場合</span> :RectInsert <span class="synStatement">-i</span> <span class="synStatement">-mode-v</span> <span class="synComment">&quot; カーソルの右側に挿入する場合</span> :RectInsert <span class="synStatement">-a</span> <span class="synStatement">-mode-v</span> </pre><p>※マップコマンド設定例</p> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synComment">&quot; カーソルの左側に挿入する場合</span> <span class="synStatement">vmap</span> <span class="synSpecial">&lt;silent&gt;</span> <span class="synSpecial">&lt;leader&gt;</span>hi <span class="synSpecial">&lt;Plug&gt;</span>(rectinsert_insert) <span class="synComment">&quot; カーソルの右側に挿入する場合</span> <span class="synStatement">vmap</span> <span class="synSpecial">&lt;silent&gt;</span> <span class="synSpecial">&lt;leader&gt;</span>ha <span class="synSpecial">&lt;Plug&gt;</span>(rectinsert_append) </pre><p>※実行例<br /> 下記文字列をコピーして</p> <pre class="code" data-lang="" data-unlink>one</pre><p>2行矩形選択した場合は</p> <pre class="code" data-lang="" data-unlink>one one</pre><p>が挿入されます。</p><p>下記文字列をコピーして</p> <pre class="code" data-lang="" data-unlink>one two</pre><p>3行矩形選択した場合は</p> <pre class="code" data-lang="" data-unlink>one two one</pre><p>が挿入されます。</p><p>下記文字列をコピーして</p> <pre class="code" data-lang="" data-unlink>one two three</pre><p>2行矩形選択した場合は</p> <pre class="code" data-lang="" data-unlink>one two</pre><p>が挿入されます。<br /> <br /> </p> </div> <div class="section"> <h5>任意の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>の処理結果で挿入する場合 <span class="deco" style="color:#FF0000;">※新機能!!</span></h5> <p>自分の使い慣れた言語で矩形挿入したい文字列を生成できる!</p><p>※<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>を使った偶数連番5桁0埋め挿入の例<br /> 1. 挿入したい箇所にカーソルをもっていく<br /> 2. 下記コマンドを実行(<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>の箇所を他の言語にすることも可能)</p> <pre class="code lang-vim" data-lang="vim" data-unlink>:RectScriptInsert <span class="synStatement">ruby</span> </pre><p>3. 新しく開いたバッファに下記コードを記述</p> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synConstant">10</span>.times {|<span class="synIdentifier">i</span>| printf(<span class="synSpecial">&quot;</span><span class="synConstant">%05d: </span><span class="synSpecial">\n&quot;</span>, i + <span class="synConstant">1</span>) <span class="synStatement">if</span> i % <span class="synConstant">2</span> != <span class="synConstant">0</span> } </pre><p>4. 下記コマンドを再実行</p> <pre class="code lang-vim" data-lang="vim" data-unlink>:RectScriptInsert <span class="synStatement">ruby</span> </pre><p>5. 挿入完了!!</p><br /> <p>よかったら使ってみてください。</p> </div> </div> Sun, 25 Mar 2012 00:00:00 +0900 hatenablog://entry/17680117127185958040 Vim Vim script Vimで矩形貼り付けをするプラグインを作ってみた https://hekyou.hatenadiary.org/entry/20120315/p1 <p><a href="http://d.hatena.ne.jp/hekyou/20120325/p1">Vim&#x3067;&#x77E9;&#x5F62;&#x8CBC;&#x308A;&#x4ED8;&#x3051;&#x3092;&#x3059;&#x308B;&#x30D7;&#x30E9;&#x30B0;&#x30A4;&#x30F3;&#x3092;&#x4F5C;&#x3063;&#x3066;&#x307F;&#x305F; - &#x6539;&#x826F;&#x7248; - - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a></p> <pre class="code" data-lang="" data-unlink>追記:2012-03-26 本記事の内容は古くなっているため上記リンク先の記事をご参照願います。</pre><p>ある<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vimmer">Vimmer</a>が矩形貼り付けをする時だけ<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%AF%A5%E9%A5%A8%A5%C7%A5%A3%A5%BF">サクラエディタ</a>を起動しているのを見て</p><p>「それ<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>でできる(はず)よ」</p><p>と、つい言ってしまい(^^;<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>を探してみたのですが<br /> 探し方が悪いのか見つからず...</p><br /> <p>というわけで、自分で作ってみました。<br /> <br /> </p> <div class="section"> <h4>ダウンロード</h4> <p><a href="https://github.com/hekyou/vim-rectinsert">https://github.com/hekyou/vim-rectinsert</a></p><p></p> </div> <div class="section"> <h4>使い方</h4> <div class="section"> <h5>カーソルの左側に挿入する場合</h5> <pre class="code lang-vim" data-lang="vim" data-unlink>:RectInsert <span class="synStatement">-i</span> </pre><p>※マップコマンド設定例</p> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synStatement">nmap</span> <span class="synSpecial">&lt;silent&gt;</span> <span class="synSpecial">&lt;leader&gt;</span>ri <span class="synSpecial">&lt;Plug&gt;</span>(rectinsert_insert) </pre> </div> <div class="section"> <h5>カーソルの右側に挿入する場合</h5> <pre class="code lang-vim" data-lang="vim" data-unlink>:RectInsert <span class="synStatement">-a</span> </pre><p>※マップコマンド設定例</p> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synStatement">nmap</span> <span class="synSpecial">&lt;silent&gt;</span> <span class="synSpecial">&lt;leader&gt;</span>ra <span class="synSpecial">&lt;Plug&gt;</span>(rectinsert_append) </pre> </div> <div class="section"> <h5>矩形選択した箇所に挿入する場合</h5> <pre class="code lang-vim" data-lang="vim" data-unlink>:RectVisualInsert </pre><p>※マップコマンド設定例</p> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synStatement">vmap</span> <span class="synSpecial">&lt;silent&gt;</span> <span class="synSpecial">&lt;leader&gt;</span>rv <span class="synSpecial">&lt;Plug&gt;</span>(rectinsert_visual) </pre><p>※実行例<br /> 下記文字列をコピーして</p> <pre class="code" data-lang="" data-unlink>one</pre><p>2行矩形選択した場合は</p> <pre class="code" data-lang="" data-unlink>one one</pre><p>が挿入されます。</p><p>下記文字列をコピーして</p> <pre class="code" data-lang="" data-unlink>one two</pre><p>3行矩形選択した場合は</p> <pre class="code" data-lang="" data-unlink>one two one</pre><p>が挿入されます。</p><p>下記文字列をコピーして</p> <pre class="code" data-lang="" data-unlink>one two three</pre><p>2行矩形選択した場合は</p> <pre class="code" data-lang="" data-unlink>one two</pre><p>が挿入されます。</p><br /> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a> scriptに慣れておらず<br /> かなり苦戦しつつ作成しているのでこの実装でいいのか不安ですが...<br /> そして書き方がまだわからなくてヘルプが出来てないですが...</p><p>よかったら使ってみてください。</p> </div> </div> Thu, 15 Mar 2012 00:00:00 +0900 hatenablog://entry/17680117127185958810 Vim Vim script Python3のprintを使ってみよう! https://hekyou.hatenadiary.org/entry/20111224/p1 <p><a href="https://connpass.com/event/142/">2011 Python&#x30A2;&#x30C9;&#x30D9;&#x30F3;&#x30C8;&#x30AB;&#x30EC;&#x30F3;&#x30C0;&#x30FC;(Python3)</a> 24日目です!</p><p>実はPython3は...というか<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>自体ほとんど触ったことがなくて...<br /> エキスパート<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>の読書会に2回(2章途中)参加したくらいの知識しかないのですが<br /> 急遽参加してみることにしました!大丈夫か!?<br /> <br /> </p> <div class="section"> <h4>はじめに</h4> <p>記事のネタをどうしようか考えてたところに他の参加者様の記事を見て<br /> Python3からprintが文から式に変わったというのを見つけたので<br /> print文についてもうちょっと具体的に調べてみようかなと思いました。<br /> <br /> </p> </div> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20OS%20X">Mac OS X</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Snow%20Leopard">Snow Leopard</a> 10.6.8<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 3.2<br /> <br /> </p> </div> <div class="section"> <h4>インストール</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>sudo port install python32 </pre> </div> <div class="section"> <h4>調査結果</h4> <div class="section"> <h5>Python3での出力仕様</h5> <p>Python2までは</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">print</span> <span class="synConstant">&quot;aaa&quot;</span> </pre><p>だったのに対してPython3では</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span>) </pre><p>となる。</p><p>Python3でのprintについて試したものを以下にまとめます。<br /> 各処理右側のコメントが処理の出力になります。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># endを指定しない場合は&quot;\n&quot;がdefaultとなり出力の最後で改行される</span> <span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span>) <span class="synComment"># -&gt; aaa\n</span> <span class="synComment"># endに空文字を指定することで改行を防止できる</span> <span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span>, end=<span class="synConstant">&quot;&quot;</span>) <span class="synComment"># -&gt; aaa</span> <span class="synComment"># 引数には出力用データを複数指定可能</span> <span class="synComment"># データの結合文字はsepで指定する。defaultは半角スペース</span> <span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span>, <span class="synConstant">&quot;bbb&quot;</span>) <span class="synComment"># -&gt; aaa bbb\n</span> <span class="synComment"># sepで結合文字を変更</span> <span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span>, <span class="synConstant">&quot;bbb&quot;</span>, sep=<span class="synConstant">&quot;,&quot;</span>) <span class="synComment"># -&gt; aaa,bbb\n</span> <span class="synComment"># sepとendは同時に設定可能</span> <span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span>, <span class="synConstant">&quot;bbb&quot;</span>, sep=<span class="synConstant">&quot;,&quot;</span>, end=<span class="synConstant">&quot;&quot;</span>) <span class="synComment"># -&gt; aaa,bbb</span> <span class="synComment"># fileで指定したファイルオブジェクトに出力できる</span> <span class="synIdentifier">print</span>(<span class="synConstant">&quot;test&quot;</span>, <span class="synIdentifier">file</span>=sys.stdout) </pre> </div> <div class="section"> <h5>文から式へ</h5> <p>文は値を返さないもの。改行を伴うもの。<br /> 式は値を返すもの。文中で使用可能。</p><p>という認識だけど合ってるかな??</p><p>そこで</p><p>printが文から式になったことで何が便利かなぁと考えたときに<br /> リスト内包表記内とかで使うと便利かも?と思いついたので試してみました。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># 単純出力</span> [<span class="synIdentifier">print</span>(x) <span class="synStatement">for</span> x <span class="synStatement">in</span> (<span class="synConstant">&quot;aaa&quot;</span>, <span class="synConstant">&quot;bbb&quot;</span>, <span class="synConstant">&quot;ccc&quot;</span>)] <span class="synComment"># -&gt; aaa</span> <span class="synComment"># bbb</span> <span class="synComment"># ccc</span> <span class="synComment"># CSV風出力</span> [<span class="synIdentifier">print</span>(x, end=<span class="synConstant">&quot;,&quot;</span>) <span class="synStatement">for</span> x <span class="synStatement">in</span> (<span class="synConstant">&quot;aaa&quot;</span>, <span class="synConstant">&quot;bbb&quot;</span>, <span class="synConstant">&quot;ccc&quot;</span>)] <span class="synComment"># -&gt; aaa,bbb,ccc,</span> <span class="synComment"># ※この場合、printが複数回呼ばれるため、sepではなくendです。</span> <span class="synComment"># format出力</span> [<span class="synIdentifier">print</span>(<span class="synConstant">&quot;%03d&quot;</span> % (x * <span class="synConstant">2</span>)) <span class="synStatement">for</span> x <span class="synStatement">in</span> (<span class="synConstant">1</span>, <span class="synConstant">2</span>, <span class="synConstant">3</span>)] <span class="synComment"># -&gt; 002</span> <span class="synComment"># 004</span> <span class="synComment"># 006</span> </pre><p>実際まだ<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>のコードをほとんど書いたことがないので<br /> 本当に便利かは実感できてないですが...<br /> こんなことも出来るようになったようです的なご紹介でした!<br /> <br /> </p> </div> <div class="section"> <h5>おまけ</h5> <p>下記、同じ結果になるのですが、どちらが良いのだろう??</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span>, <span class="synConstant">&quot;bbb&quot;</span>, sep=<span class="synConstant">&quot;&quot;</span>) <span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span> + <span class="synConstant">&quot;bbb&quot;</span>) </pre><p>速度を簡単に測ってみたところ+<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>を使った方が若干速そうです。</p> <table> <tr> <th></th> <th>+<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>未使用</th> <th>+<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>使用</th> </tr> <tr> <th>平均</th> <td>0.3108s</td> <td>0.2562s</td> </tr> <tr> <th>1回目</th> <td>0.312s</td> <td>0.331s</td> </tr> <tr> <th>2回目</th> <td>0.298s</td> <td>0.280s</td> </tr> <tr> <th>3回目</th> <td>0.354s</td> <td>0.220s</td> </tr> <tr> <th>4回目</th> <td>0.271s</td> <td>0.252s</td> </tr> <tr> <th>5回目</th> <td>0.365s</td> <td>0.302s</td> </tr> <tr> <th>6回目</th> <td>0.295s</td> <td>0.217s</td> </tr> <tr> <th>7回目</th> <td>0.355s</td> <td>0.218s</td> </tr> <tr> <th>8回目</th> <td>0.292s</td> <td>0.299s</td> </tr> <tr> <th>9回目</th> <td>0.278s</td> <td>0.228s</td> </tr> <tr> <th>10回目</th> <td>0.288s</td> <td>0.215s</td> </tr> </table><p>テストコード</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># +演算子未使用</span> <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">10000</span>): <span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span>, <span class="synConstant">&quot;bbb&quot;</span>, <span class="synConstant">&quot;ccc&quot;</span>, sep=<span class="synConstant">&quot;&quot;</span>) <span class="synComment"># +演算子使用</span> <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">10000</span>): <span class="synIdentifier">print</span>(<span class="synConstant">&quot;aaa&quot;</span> + <span class="synConstant">&quot;bbb&quot;</span> + <span class="synConstant">&quot;ccc&quot;</span>) </pre><p>最後25日目は<a href="https://connpass.com/event/142/">2011 Python&#x30A2;&#x30C9;&#x30D9;&#x30F3;&#x30C8;&#x30AB;&#x30EC;&#x30F3;&#x30C0;&#x30FC;(Python3)</a>にお返ししますー。<br /> でいいのかな?</p> </div> </div> Sat, 24 Dec 2011 00:00:01 +0900 hatenablog://entry/17680117127185959600 python3 python Advent Calendar pythonのジェネレータを使ってFizzBuzz https://hekyou.hatenadiary.org/entry/20111224/p2 <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>ろくに出来もしないのに<br /> 急遽Advent Calendarに参戦してしまい<br /> 書く内容を考えないといけなくてかなり焦ってたのに</p><p>途中でつい遊んでしまい...</p><p>まあなんとか一応記事は書き終わったので<br /> その時遊んだ内容について書きますw</p><br /> <p>最近<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>を始めたばかりで<br /> ジェネレータやらを初めて知ったので使ってみたくて<br /> ちょっと練習で無理矢理<a class="keyword" href="http://d.hatena.ne.jp/keyword/FizzBuzz">FizzBuzz</a>を実装してみました。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">def</span> <span class="synIdentifier">fizz</span>(): <span class="synStatement">while</span> <span class="synIdentifier">True</span>: <span class="synStatement">yield</span> <span class="synConstant">&quot;&quot;</span> <span class="synStatement">yield</span> <span class="synConstant">&quot;&quot;</span> <span class="synStatement">yield</span> <span class="synConstant">&quot;fizz&quot;</span> <span class="synStatement">def</span> <span class="synIdentifier">buzz</span>(): <span class="synStatement">while</span> <span class="synIdentifier">True</span>: <span class="synStatement">yield</span> <span class="synConstant">&quot;&quot;</span> <span class="synStatement">yield</span> <span class="synConstant">&quot;&quot;</span> <span class="synStatement">yield</span> <span class="synConstant">&quot;&quot;</span> <span class="synStatement">yield</span> <span class="synConstant">&quot;&quot;</span> <span class="synStatement">yield</span> <span class="synConstant">&quot;buzz&quot;</span> <span class="synStatement">def</span> <span class="synIdentifier">fizzbuzz</span>(): cnt = <span class="synConstant">0</span> f = fizz(); b = buzz(); <span class="synStatement">while</span> <span class="synIdentifier">True</span>: cnt += <span class="synConstant">1</span> res = <span class="synIdentifier">next</span>(f) res = res + <span class="synIdentifier">next</span>(b) <span class="synStatement">if</span> res == <span class="synConstant">&quot;&quot;</span>: res = <span class="synIdentifier">str</span>(cnt) <span class="synStatement">yield</span> res fb = fizzbuzz() [<span class="synIdentifier">print</span>(<span class="synIdentifier">next</span>(fb)) <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">20</span>)] </pre> Sat, 24 Dec 2011 00:00:00 +0900 hatenablog://entry/17680117127185959362 python Node.jsにてsocket.ioのjoinでチャットルーム実装! https://hekyou.hatenadiary.org/entry/20111222/p1 <p><a href="http://atnd.org/events/21979">JavaScript Advent Calendar 2011(Node.js/WebSockets&#x30B3;&#x30FC;&#x30B9;)</a> 22日目です!<br /> 急遽参戦!そして初Advent Calendar...</p><br /> <p>Node.jsでのチャットルームの実装にsocket.ioのjoin()を使ってみます。<br /> <br /> </p> <div class="section"> <h4>はじめに</h4> <p>socket.ioを利用したチャット機能の実装については<br /> サンプルも多く結構簡単に実装が可能です。</p><p>ですが、チャットルームの実装方法については情報が少なく<br /> やり方がわからなかったので色々調べつつ<br /> RoomList, Room, User クラスを自作することで対応を行いました。</p><p>※sample<br /> <a href="https://github.com/hekyou/socket_io-not-join-sample">https://github.com/hekyou/socket_io-not-join-sample</a></p><p>ですが、、</p><p>最近socket.ioにjoinメソッドがあることを知りまして。</p><p>これなら簡潔に書けるじゃん...</p><p>と、思ったので試してみました。<br /> <br /> </p> </div> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20OS%20X">Mac OS X</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Snow%20Leopard">Snow Leopard</a> 10.6.8 (Lionっておいしいの?)<br /> Node.js 0.4.12 (0.6にしないと!)<br /> socket.io 0.8.5<br /> <br /> </p> </div> <div class="section"> <h4>利用するメソッド</h4> <div class="section"> <h5>join(room)</h5> <p>roomに指定した部屋に参加することができる。</p> </div> <div class="section"> <h5>to(room).emit</h5> <p>roomに指定した部屋にのみメッセージを送れる。<br /> <br /> </p> </div> </div> <div class="section"> <h4>実装</h4> <div class="section"> <h5>サーバ側</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> io = require(<span class="synConstant">'socket.io'</span>).listen(app); chat = io.sockets.on(<span class="synConstant">'connection'</span>, <span class="synIdentifier">function</span>(client) <span class="synIdentifier">{</span> <span class="synComment">// ※2 クライアントに接続成功を送信</span> client.emit(<span class="synConstant">'connected'</span>); client.on(<span class="synConstant">'init'</span>, <span class="synIdentifier">function</span>(req) <span class="synIdentifier">{</span> client.set(<span class="synConstant">'room'</span>, req.room); client.set(<span class="synConstant">'name'</span>, req.name); chat.to(req.room).emit(<span class="synConstant">'message'</span>, req.name + <span class="synConstant">&quot; さんが入室&quot;</span>); <span class="synComment">// ※4 クライアントを部屋に入室させる</span> client.join(req.room); <span class="synIdentifier">}</span>); client.on(<span class="synConstant">'message'</span>, <span class="synIdentifier">function</span>(data) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> room, name; client.get(<span class="synConstant">'room'</span>, <span class="synIdentifier">function</span>(err, _room) <span class="synIdentifier">{</span> room = _room; <span class="synIdentifier">}</span>); client.get(<span class="synConstant">'name'</span>, <span class="synIdentifier">function</span>(err, _name) <span class="synIdentifier">{</span> name = _name; <span class="synIdentifier">}</span>); <span class="synComment">// ※6 受け取ったメッセージを部屋の皆に送信</span> chat.to(room).emit(<span class="synConstant">'message'</span>, name + <span class="synConstant">&quot;: &quot;</span> + data); <span class="synIdentifier">}</span>); <span class="synComment">// ※8 退室</span> client.on(<span class="synConstant">'disconnect'</span>, <span class="synIdentifier">function</span>() <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> room, name; client.get(<span class="synConstant">'room'</span>, <span class="synIdentifier">function</span>(err, _room) <span class="synIdentifier">{</span> room = _room; <span class="synIdentifier">}</span>); client.get(<span class="synConstant">'name'</span>, <span class="synIdentifier">function</span>(err, _name) <span class="synIdentifier">{</span> name = _name; <span class="synIdentifier">}</span>); client.leave(room); chat.to(room).emit(<span class="synConstant">'message'</span>, name + <span class="synConstant">&quot; さんが退出&quot;</span>); <span class="synIdentifier">}</span>); <span class="synIdentifier">}</span>); </pre> </div> <div class="section"> <h5>クライアント側</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// ※1 サーバに接続リクエスト</span> <span class="synIdentifier">var</span> socket = io.connect(<span class="synConstant">'/'</span>); <span class="synIdentifier">function</span> chat(room, name) <span class="synIdentifier">{</span> socket.on(<span class="synConstant">'connected'</span>, <span class="synIdentifier">function</span>() <span class="synIdentifier">{</span> <span class="synComment">// ※3 入室する部屋番号を送信</span> socket.json.emit(<span class="synConstant">'init'</span>, <span class="synIdentifier">{</span> <span class="synConstant">'room'</span>: room, <span class="synConstant">'name'</span>: name <span class="synIdentifier">}</span>); <span class="synIdentifier">}</span>); <span class="synComment">// ※7 受け取ったメッセージを表示</span> socket.on(<span class="synConstant">'message'</span>, <span class="synIdentifier">function</span>(data) <span class="synIdentifier">{</span> <span class="synStatement">if</span> (data) <span class="synIdentifier">{</span> update(data); <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>); <span class="synIdentifier">}</span> <span class="synIdentifier">function</span> send(name) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> data = $(<span class="synConstant">'#comment'</span>).val(); <span class="synComment">// ※5 メッセージを送信</span> socket.json.send(data); $(<span class="synConstant">'#comment'</span>).val(<span class="synConstant">&quot;&quot;</span>); <span class="synIdentifier">}</span> <span class="synIdentifier">function</span> update(data) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> obj = $(<span class="synStatement">document</span>.createElement(<span class="synConstant">'div'</span>)); obj.html(data); $(<span class="synConstant">'#view'</span>).append(obj); <span class="synIdentifier">}</span> </pre><p>大分すっきりしました!!<br /> もっと早く知っていれば...</p><p>ちなみに、※番号は一応処理の順番になっています。</p><br /> <p>今回この記事用に作成したものが下記になります。<br /> <a href="https://github.com/hekyou/socket_io-join-sample">https://github.com/hekyou/socket_io-join-sample</a></p><p>ちなみに独自クラスを使って作成したサービスが下記になります。<br /> blockdiagをみんなで編集しよう的なものです。<br /> <a href="http://live-diag.herokuapp.com/">http://live-diag.herokuapp.com/</a></p><p>※blockdiagについてはこちらを参照してください。便利ですヨ!<br /> <a href="http://blockdiag.com/ja/blockdiag/">http://blockdiag.com/ja/blockdiag/</a></p><p>後でjoinで書き直そうっと...<br /> <br /> </p> </div> </div> <div class="section"> <h4>備考</h4> <p>to(room).send は使えなくてちょっとだけハマりました。</p> </div> Thu, 22 Dec 2011 00:00:00 +0900 hatenablog://entry/17680117127185959969 node.js javascript Advent Calendar Macでupdatedbとlocateを使ってファイルをさくさく検索! https://hekyou.hatenadiary.org/entry/20110922/p1 <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/linux">linux</a>ではfindコマンドより高速にファイルを検索するために<br /> locateコマンドを使いますが</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/mac">mac</a>にもlocateコマンドはあります!</p><p>ただ、検索用のデータベースを作成する<br /> updatedbが<a class="keyword" href="http://d.hatena.ne.jp/keyword/mac">mac</a>の場合<a class="keyword" href="http://d.hatena.ne.jp/keyword/linux">linux</a>と異なります。。</p> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/mac">mac</a>の場合</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>/usr/libexec/locate.updatedb </pre><p>いつも忘れるので…</p><p>メモ!</p><p>でも、毎回調べるのも面倒くさいので...</p><p>aliasをつくります。<br /> <br /> </p> </div> <div class="section"> <h5>手順</h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synComment"># alias設定追加</span> vim ~/.bashrc <span class="synComment"># 変更した設定を読み込み</span> <span class="synStatement">source</span> ~/.bashrc <span class="synComment"># データベース更新</span> updatedb <span class="synComment"># 高速検索!</span> locate httpd.conf </pre> </div> <div class="section"> <h5>.bashrcに追加したalias設定</h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">alias </span><span class="synIdentifier">updatedb</span><span class="synStatement">='</span><span class="synConstant">sudo /usr/libexec/locate.updatedb</span><span class="synStatement">'</span> </pre> </div> Thu, 22 Sep 2011 00:00:00 +0900 hatenablog://entry/17680117127185960213 mac netcatを使わずにSSHのProxyCommandで多段ssh https://hekyou.hatenadiary.org/entry/20110921/p1 <p>AのサーバにBのサーバを経由して<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>接続する場合<br /> 今まではnetcatを利用していましたが<br /> OpenSSH 5.4からはnetcatの機能が組み込まれたようです。</p><p>ということで試してみました。</p><br /> <p>~/.<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssh">ssh</a>/config の内容</p> <div class="section"> <h5>変更前 [netcat使用]</h5> <p>nc %h %p</p> <pre class="code lang-sh" data-lang="sh" data-unlink>Host hoge_host HostName 192.168.1.10 ProxyCommand ssh <span class="synSpecial">-l</span> hoge_name 192.168.0.5 nc %h %p </pre> </div> <div class="section"> <h5>変更後 [netcat未使用]</h5> <p> -W %h:%p</p> <pre class="code lang-sh" data-lang="sh" data-unlink>Host hoge_host HostName 192.168.1.10 ProxyCommand ssh <span class="synSpecial">-l</span> hoge_name 192.168.0.5 <span class="synSpecial">-W</span> %h:%p </pre> </div> <div class="section"> <h5>接続</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>ssh hoge_host </pre><p>最初 %h:%p を %h %p にしていて繋がりませんでした。。</p><p>が、問題なく接続できましたー。<br /> <br /> <br /> </p> </div> <div class="section"> <h4>結論</h4> <p>まあ、どっちでも同じことができるのですが</p> <ul> <li>中継サーバでnetcatがなくてもよい</li> <li>接続中に中継サーバでnetcatのプロセスが動かない</li> <li>中継サーバの<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>のバージョンは問わない</li> </ul><p>といった利点があるので<br /> 手元のOpenSSHのバージョンが5.4以上であれば<br /> Wオプションを使った方が良いのかなと思いました。</p> </div> Wed, 21 Sep 2011 00:00:00 +0900 hatenablog://entry/17680117127185960501 ssh Mac用メモリ増設 https://hekyou.hatenadiary.org/entry/20110911/p1 <p>普段<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook">MacBook</a>を使っているのですが<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Chrome">Chrome</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Firefox">Firefox</a>と仮想環境を複数起ち上げると<br /> メモリ的にかなり苦しいです。。</p><p>そこで<br /> 4GBから8GBにメモリを増やすことにしました。</p><br /> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook">MacBook</a> (Mid 2010)</p><p>公式には書かれていませんでしたが8GBまでは認識可能なようです。<br /> 未サポートなので自己責任ですが。</p><p>今回は4GB 2枚入りの下記を購入。</p><p><div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B004EST77Q/hekyou-22/"><img src="https://d.hatena.ne.jp/images/hatena_aws.gif" class="hatena-asin-detail-image" alt="シー・エフ・デー販売 メモリ ノートPC用 DDR3 SO-DIMM PC3-8500 CL7 256x8Mbit 4GB 2枚組 W3N1066Q-4G" title="シー・エフ・デー販売 メモリ ノートPC用 DDR3 SO-DIMM PC3-8500 CL7 256x8Mbit 4GB 2枚組 W3N1066Q-4G"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B004EST77Q/hekyou-22/">シー・エフ・デー販売 メモリ ノートPC用 DDR3 SO-DIMM PC3-8500 CL7 256x8Mbit 4GB 2枚組 W3N1066Q-4G</a></p><ul><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A1%BC%A1%A6%A5%A8%A5%D5%A1%A6%A5%C7%A1%BC%C8%CE%C7%E4">シー・エフ・デー販売</a></li><li><span class="hatena-asin-detail-label">メディア:</span> Personal Computers</li><li><span class="hatena-asin-detail-label">購入</span>: 28人 <span class="hatena-asin-detail-label">クリック</span>: 153回</li><li><a href="http://d.hatena.ne.jp/asin/B004EST77Q/hekyou-22" target="_blank">この商品を含むブログ (4件) を見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div>※<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook">MacBook</a>(Mid 2010)の場合、最近のproや<a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a>とは対応メモリが異なるので注意が必要です。</p><br /> <p>交換作業自体はかなり簡単です。<br /> 底板を外して元々刺さっている2枚を入れ替えるだけです。</p> <div class="section"> <h5>作業前</h5> <p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/hekyou/20110912051034" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/h/hekyou/20110912/20110912051034.png" alt="f:id:hekyou:20110912051034p:image:w300" title="f:id:hekyou:20110912051034p:image:w300" class="hatena-fotolife" style="width:300px" itemprop="image"></a></span><br /> </p> </div> <div class="section"> <h5>作業後</h5> <p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/hekyou/20110912051035" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/h/hekyou/20110912/20110912051035.png" alt="f:id:hekyou:20110912051035p:image:w300" title="f:id:hekyou:20110912051035p:image:w300" class="hatena-fotolife" style="width:300px" itemprop="image"></a></span></p><p>無事認識されました!</p><p>これでかなりメモリに余裕が出来ました。<br /> 快適です♪</p><p>あとは、HDDを<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>に変更したいなぁ。<br /> かなり安くなってきてますがもうちょっと待ってみます!<br /> <br /> </p> </div> <div class="section"> <h5>おまけ</h5> <p>最近の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>の対応メモリをついでに調べたので<br /> 以下に簡単にまとめます。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook%20Pro">MacBook Pro</a> (Early 2011)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20mini">Mac mini</a> (Mid 2011)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> (Mid 2011)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> (Mid 2010) <ul> <li>PC3-10600(DDR3-1333)</li> </ul></li> </ul><p><div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00405SBC0/hekyou-22/"><img src="https://images-fe.ssl-images-amazon.com/images/I/51GIfPqVyaL._SL160_.jpg" class="hatena-asin-detail-image" alt="CFD販売 Elixir ノートPC用 DDR3 メモリー 8GB (4GB 2枚)DDR3-1333 (PC3-10600) CL9 W3N1333Q-4G" title="CFD販売 Elixir ノートPC用 DDR3 メモリー 8GB (4GB 2枚)DDR3-1333 (PC3-10600) CL9 W3N1333Q-4G"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00405SBC0/hekyou-22/">CFD販売 Elixir ノートPC用 DDR3 メモリー 8GB (4GB 2枚)DDR3-1333 (PC3-10600) CL9 W3N1333Q-4G</a></p><ul><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A1%BC%A1%A6%A5%A8%A5%D5%A1%A6%A5%C7%A1%BC%C8%CE%C7%E4">シー・エフ・デー販売</a></li><li><span class="hatena-asin-detail-label">メディア:</span> Personal Computers</li><li><span class="hatena-asin-detail-label">購入</span>: 49人 <span class="hatena-asin-detail-label">クリック</span>: 314回</li><li><a href="http://d.hatena.ne.jp/asin/B00405SBC0/hekyou-22" target="_blank">この商品を含むブログ (51件) を見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook">MacBook</a> (Mid 2010)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/MacBook%20Pro">MacBook Pro</a> (Early 2010)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20mini">Mac mini</a> (Mid 2010)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> (Late 2009) <ul> <li>PC3-8500(DDR3-1066)</li> </ul></li> </ul><p><div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B004EST77Q/hekyou-22/"><img src="https://d.hatena.ne.jp/images/hatena_aws.gif" class="hatena-asin-detail-image" alt="シー・エフ・デー販売 メモリ ノートPC用 DDR3 SO-DIMM PC3-8500 CL7 256x8Mbit 4GB 2枚組 W3N1066Q-4G" title="シー・エフ・デー販売 メモリ ノートPC用 DDR3 SO-DIMM PC3-8500 CL7 256x8Mbit 4GB 2枚組 W3N1066Q-4G"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B004EST77Q/hekyou-22/">シー・エフ・デー販売 メモリ ノートPC用 DDR3 SO-DIMM PC3-8500 CL7 256x8Mbit 4GB 2枚組 W3N1066Q-4G</a></p><ul><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A1%BC%A1%A6%A5%A8%A5%D5%A1%A6%A5%C7%A1%BC%C8%CE%C7%E4">シー・エフ・デー販売</a></li><li><span class="hatena-asin-detail-label">メディア:</span> Personal Computers</li><li><span class="hatena-asin-detail-label">購入</span>: 28人 <span class="hatena-asin-detail-label">クリック</span>: 153回</li><li><a href="http://d.hatena.ne.jp/asin/B004EST77Q/hekyou-22" target="_blank">この商品を含むブログ (4件) を見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> </div> Sun, 11 Sep 2011 00:00:00 +0900 hatenablog://entry/17680117127185960763 mac メモリ PHP 5.3.8をソースからインストール https://hekyou.hatenadiary.org/entry/20110907/p1 <p>前回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a>をソースからインストールしました。</p> <ul> <li><a href="http://d.hatena.ne.jp/hekyou/20110905/p2">Apache HTTP Server 2.2.20&#x3092;&#x30BD;&#x30FC;&#x30B9;&#x304B;&#x3089;&#x30A4;&#x30F3;&#x30B9;&#x30C8;&#x30FC;&#x30EB; - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a></li> </ul><p>今回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a>をソースからインストールしてみます。</p> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a> 6.0<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> 5.3.8(5.3.7はcrypt関数に重大なバグがあるので注意!)<br /> paco 2.0.9(必須ではない)<br /> <br /> </p> </div> <div class="section"> <h4>インストール手順</h4> <div class="section"> <h5>ソースをダウンロード</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>wget http://jp2.php.net/get/php-5.3.8.tar.gz/from/this/mirror tar zxvf php-5.3.8.tar.gz <span class="synStatement">cd</span> php-5.3.8 </pre> </div> <div class="section"> <h5>インストール準備</h5> <p>指定するオプションによります。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>yum install libxml2-devel yum install libjpeg-devel yum install libpng-devel </pre> </div> <div class="section"> <h5>インストール</h5> <p>オプションは任意で必要なものを選択してください。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a>との連携のために --with-apxs2 には<br /> インストール済みの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a>のapxsを指定する。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>./configure <span class="synSpecial">--with-apxs2=/usr/local/apache2/bin/apxs</span> <span class="synSpecial">--enable-mbstring</span> <span class="synSpecial">--enable-mbregex</span> <span class="synSpecial">--enable-zend-multibyte</span> <span class="synSpecial">--with-mysql=/usr/local/mysql</span> <span class="synSpecial">--with-pdo-mysql=/usr/local/mysql</span> <span class="synSpecial">--enable-libxml</span> <span class="synSpecial">--enable-xml</span> <span class="synSpecial">--with-gd</span> <span class="synSpecial">--enable-gd-native-ttf</span> <span class="synSpecial">--with-pear</span> <span class="synSpecial">--enable-bcmath</span> <span class="synSpecial">--with-jpeg-dir</span> <span class="synSpecial">--with-png-dir</span> <span class="synSpecial">--with-zlib-dir</span> <span class="synSpecial">--with-config-file-path=/etc</span> make paco <span class="synSpecial">-D</span> make install </pre><p>インストール完了です!<br /> <br /> </p> </div> </div> <div class="section"> <h4>設定</h4> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a>設定</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>cp /usr/<span class="synStatement">local</span>/src/php-5.3.8/php.ini-production /etc/php.ini vim /etc/php.ini </pre><p>デフォルト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%E0%A5%BE%A1%BC%A5%F3">タイムゾーン</a>の設定を追加<br /> ※これがないとdate系関数の使用時にエラーが出る</p> <pre class="code lang-sh" data-lang="sh" data-unlink>date.timezone <span class="synStatement">=</span> Asia/Tokyo </pre> </div> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a>設定</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>vim /etc/httpd/conf/httpd.conf </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a>から<a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a>を実行できるように設定を追加する</p> <pre class="code lang-sh" data-lang="sh" data-unlink>LoadModule php5_module /usr/<span class="synStatement">local</span>/apache2/modules/libphp5.so AddType application/x-httpd-php .php </pre><p>これで<a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a>のインストール作業は完了です!</p><p>ドキュメントルートに index.<a class="keyword" href="http://d.hatena.ne.jp/keyword/php">php</a> を用意して<br /> ブラウザからアクセスしてみます!<br /> <br /> </p> <pre class="code" data-lang="" data-unlink>Starting httpd: httpd: Syntax error on line 203 of /etc/httpd/conf/httpd.conf: Cannot load /usr/local/apache2/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: failed to map segment from shared object: Permission denied</pre><p>エラー......</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/SELinux">SELinux</a>のセキュリティによるもので<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/php">php</a>のライブラリがロード出来ないようになっていました。。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>vim /etc/selinux/config </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/SELinux">SELinux</a>の設定を変更します。</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synComment">#SELINUX=enforcing</span> <span class="synIdentifier">SELINUX</span>=permissive </pre><p>再起動して再度確認です!</p> <pre class="code lang-sh" data-lang="sh" data-unlink>shutdown <span class="synSpecial">-r</span> now </pre><p>無事アクセスが出来ました!</p> </div> </div> Wed, 07 Sep 2011 00:00:00 +0900 hatenablog://entry/17680117127185961015 PHP CentOS mysql-5.5.15をソースからインストール https://hekyou.hatenadiary.org/entry/20110905/p1 <p>テスト用の環境を作るために<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a>をソースからインストールしました。</p> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a> 6.0<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a> 5.5.15<br /> paco 2.0.9(必須ではない)<br /> <br /> </p> </div> <div class="section"> <h4>インストール手順</h4> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synComment"># ソースをダウンロード</span> wget http://www.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.15.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/ tar zxvf mysql-5.5.15.tar.gz <span class="synStatement">cd</span> mysql-5.5.15 <span class="synComment"># MySQL 5.5ではcmakeを使うようです。</span> yum install cmake cmake<span class="synStatement"> . </span>-<span class="synIdentifier">DCMAKE_INSTALL_PREFIX</span>=/usr/<span class="synStatement">local</span>/mysql <span class="synSpecial">-DDEFAULT_CHARSET</span><span class="synStatement">=</span>utf8 <span class="synSpecial">-DDEFAULT_COLLATION</span><span class="synStatement">=</span>utf8_general_ci </pre><p>と、ここで下記エラー...</p> <pre class="code" data-lang="" data-unlink>-- Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH) CMake Error at cmake/readline.cmake:83 (MESSAGE): Curses library not found. Please install appropriate package, remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.</pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Curses">Curses</a> libraryがないということなので、インストールします。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>yum install ncurses-devel </pre><p>cmakeをやり直します。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>cmake<span class="synStatement"> . </span>-<span class="synIdentifier">DCMAKE_INSTALL_PREFIX</span>=/usr/<span class="synStatement">local</span>/mysql <span class="synSpecial">-DDEFAULT_CHARSET</span><span class="synStatement">=</span>utf8 <span class="synSpecial">-DDEFAULT_COLLATION</span><span class="synStatement">=</span>utf8_general_ci -- Could NOT <span class="synStatement">find</span> Curses <span class="synPreProc">(</span><span class="synSpecial">missing: CURSES_LIBRARY CURSES_INCLUDE_PATH</span><span class="synPreProc">)</span> CMake Error at cmake/readline.cmake:<span class="synConstant">83</span> <span class="synPreProc">(</span><span class="synSpecial">MESSAGE</span><span class="synPreProc">)</span>: Curses library not found. Please install appropriate package, remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel. </pre><p>またまたエラー...<br /> 先ほどの失敗時のキャッシュのせいかも?ということで削除してみる。</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">rm</span> CMakeCache.txt cmake<span class="synStatement"> . </span>-<span class="synIdentifier">DCMAKE_INSTALL_PREFIX</span>=/usr/<span class="synStatement">local</span>/mysql <span class="synSpecial">-DDEFAULT_CHARSET</span><span class="synStatement">=</span>utf8 <span class="synSpecial">-DDEFAULT_COLLATION</span><span class="synStatement">=</span>utf8_general_ci <span class="synComment"># 成功!!</span> make <span class="synComment"># pacoを使わない場合は make install のみ</span> paco <span class="synSpecial">-D</span> make install </pre><p>インストール完了です!<br /> <br /> </p> </div> <div class="section"> <h4>設定</h4> <div class="section"> <h5>ユーザ作成</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>groupadd mysql useradd mysql <span class="synSpecial">-g</span> mysql <span class="synSpecial">-s</span> /sbin/nologin </pre> </div> <div class="section"> <h5>DB初期化</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>/usr/<span class="synStatement">local</span>/mysql/scripts/mysql_install_db <span class="synSpecial">--basedir=/usr/local/mysql</span> <span class="synSpecial">--datadir=/usr/local/mysql/data</span> <span class="synSpecial">--user=mysql</span> chown <span class="synSpecial">-R</span> mysql:mysql /usr/<span class="synStatement">local</span>/mysql </pre> </div> <div class="section"> <h5>設定ファイル作成</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>cp /usr/<span class="synStatement">local</span>/mysql/support-files/my-medium.cnf /etc/my.cnf vim /etc/my.cnf </pre><p>my.cnfにテーブル毎にファイルを分ける設定を追加<br /> テーブル毎に分かれていた方が何かと便利!</p> <pre class="code" data-lang="" data-unlink>[mysqld] innodb_file_per_table</pre> </div> <div class="section"> <h5>起動<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>設定</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>cp /usr/<span class="synStatement">local</span>/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld <span class="synStatement">chmod</span> <span class="synSpecial">+x</span> /etc/rc.d/init.d/mysqld chkconfig <span class="synSpecial">--add</span> mysqld chkconfig mysqld on /etc/rc.d/init.d/mysqld <span class="synStatement">start</span> </pre><p>これで<a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a>のインストール作業は一通り完了です。<br /> 後は<a class="keyword" href="http://d.hatena.ne.jp/keyword/mysql">mysql</a>上でユーザ、DB、テーブル等を作成していきます。</p> </div> </div> Mon, 05 Sep 2011 00:00:01 +0900 hatenablog://entry/17680117127185961912 MySQL CentOS Apache HTTP Server 2.2.20をソースからインストール https://hekyou.hatenadiary.org/entry/20110905/p2 <p>前回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a>をソースからインストールしました。</p> <ul> <li><a href="http://d.hatena.ne.jp/hekyou/20110905/p1">mysql-5.5.15&#x3092;&#x30BD;&#x30FC;&#x30B9;&#x304B;&#x3089;&#x30A4;&#x30F3;&#x30B9;&#x30C8;&#x30FC;&#x30EB; - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a></li> </ul><p>今回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a>をソースからインストールしてみます。</p> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a> 6.0<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a> 2.2.20(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a> Killer対策済バージョン)<br /> paco 2.0.9(必須ではない)<br /> <br /> </p> </div> <div class="section"> <h4>インストール手順</h4> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synComment"># ソースをダウンロード</span> wget http://ftp.jaist.ac.jp/pub/apache/httpd/httpd-2.2.20.tar.gz tar zxvf httpd-2.2.20.tar.gz <span class="synStatement">cd</span> httpd-2.2.20 <span class="synComment"># configure</span> ./configure <span class="synSpecial">--enable-so</span> <span class="synSpecial">--enable-ssl</span> <span class="synSpecial">--enable-module=rewrite</span> </pre><p>ここで下記エラー発生...</p> <pre class="code" data-lang="" data-unlink>configure: error: ...No recognized SSL/TLS toolkit detected</pre><p>OpenSSLがなかったのでインストールします。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>yum install openssl-devel <span class="synComment"># インストール作業再開</span> ./configure <span class="synSpecial">--enable-so</span> <span class="synSpecial">--enable-ssl</span> <span class="synSpecial">--enable-module=rewrite</span> make <span class="synComment"># pacoを使わない場合は make install のみ</span> paco <span class="synSpecial">-D</span> make install </pre><p>インストール完了です!<br /> <br /> </p> </div> <div class="section"> <h4>設定</h4> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synComment"># 起動設定 及び 起動確認</span> chkconfig httpd on /etc/rc.d/init.d/httpd <span class="synStatement">start</span> </pre><p>これで<a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a>のインストール作業は完了です!</p> </div> Mon, 05 Sep 2011 00:00:00 +0900 hatenablog://entry/17680117127185961610 Apache CentOS 便利!ソースからインストールを管理する https://hekyou.hatenadiary.org/entry/20110831/p1 <p>パッケージで管理すると楽なのですが<br /> ソースからインストールしたいこともあります。</p><p>でも、ソースからインストールした場合<br /> アンインストールが大変です。。</p><p>そこで登場</p><p>「paco」</p><p>ソースからインストールしたものを<br /> パッケージ感覚で管理できるツールです。</p><p>気になってたので試してみました!<br /> <br /> </p> <div class="section"> <h4>実行環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a> 6.0<br /> paco 2.0.9<br /> <br /> </p> </div> <div class="section"> <h4>pacoインストール</h4> <p>※実験環境用の簡易構築だったためrootで作業しています。</p><p>ソースをダウンロード、解凍してconfigureを実行。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>wget http://sourceforge.net/projects/paco/files/paco/2.0.9/paco-2.0.9.tar.gz/download tar zxvf paco-2.0.9.tar.gz <span class="synStatement">cd</span> paco-2.0.9 ./configure </pre><p>でも、下記エラー発生...</p> <pre class="code lang-sh" data-lang="sh" data-unlink>checking <span class="synStatement">for</span> GTKMM... configure: error: Package requirements <span class="synPreProc">(</span>gtkmm-2.4 &gt;= 2.12<span class="synPreProc">)</span> were not met: No package <span class="synStatement">'</span><span class="synConstant">gtkmm-2.4</span><span class="synStatement">'</span> found </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/gtkmm">gtkmm</a>がないらしい。<br /> 調べてみると、pacoの<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>を使うために必要なんだそうだ。</p><p>でも、今回<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>はいらないなぁと思ったので<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>を無効にしてインストール作業続行!</p> <pre class="code lang-sh" data-lang="sh" data-unlink>./configure <span class="synSpecial">--disable-gpaco</span> make </pre><p>今度はmakeで下記エラー...</p> <pre class="code lang-sh" data-lang="sh" data-unlink>../../build/depcomp: line <span class="synConstant">611</span>: <span class="synStatement">exec</span>: g++: not found </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/c%2B%2B">c++</a>がなかったのでインストール!</p> <pre class="code lang-sh" data-lang="sh" data-unlink>yum install gcc-c++ </pre><p>pacoのインストール続行!</p> <pre class="code lang-sh" data-lang="sh" data-unlink>make make install </pre><p>イントール完了です!!</p><p>でも、このままだとソースからインストールしたpaco自身が管理されません。<br /> そこで下記コマンドでpaco自身を管理化に置きました。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>make logme </pre> </div> <div class="section"> <h4>試してみる</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a> 5.5.15をソースからインストールしてみます。<br /> <br /> </p> <div class="section"> <h5>インストール準備</h5> <p>makeまでは通常のインストール作業と同じです。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>wget http://www.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.15.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/ <span class="synComment"># ...</span> <span class="synComment"># MySQL 5.5のインストール中には色々あったのですが</span> <span class="synComment"># これは別の記事にします。ので、省きます。</span> <span class="synComment"># ...</span> make </pre> <ul> <li>参照 : <a href="http://d.hatena.ne.jp/hekyou/20110905/p1">mysql-5.5.15&#x3092;&#x30BD;&#x30FC;&#x30B9;&#x304B;&#x3089;&#x30A4;&#x30F3;&#x30B9;&#x30C8;&#x30FC;&#x30EB; - &#x3078;&#x304D;&#x3087;&#x306E;&#x30FC;&#x3068;</a></li> </ul> </div> <div class="section"> <h5>インストール及びpaco管理下におく</h5> <p>make installの時にpacoを使用します。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>paco <span class="synSpecial">-D</span> make install </pre><p>Dオプションでカレント<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ名が管理パッケージ名になります。<br /> pオプションでは任意のパッケージ名が付けられます。</p><p>これで<a class="keyword" href="http://d.hatena.ne.jp/keyword/mysql">mysql</a>はpacoで管理されました!</p><p>下記コマンドを使うと管理されていることが確認できます。<br /> <br /> </p> </div> <div class="section"> <h5>管理パッケージ確認</h5> <p>aオプションで管理しているパッケージの一覧が確認できます。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>paco <span class="synSpecial">-a</span> <span class="synComment"># 出力:mysql-5.5.15 paco-2.0.9</span> </pre> </div> <div class="section"> <h5>管理ファイル確認</h5> <p>fオプションで指定パッケージで生成されたファイルの一覧を表示します。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>paco <span class="synSpecial">-f</span> <span class="synStatement">[</span>パッケージ名<span class="synStatement">]</span> </pre> </div> <div class="section"> <h5>アンインストール</h5> <p>rオプションで指定パッケージの管理するファイルを削除します。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>paco <span class="synSpecial">-r</span> <span class="synStatement">[</span>パッケージ名<span class="synStatement">]</span> </pre> </div> <div class="section"> <h5>その他</h5> <p>その他のオプションについては</p> <pre class="code lang-sh" data-lang="sh" data-unlink>paco <span class="synSpecial">--help</span> </pre><p>でご確認ください。</p> </div> </div> Wed, 31 Aug 2011 00:00:00 +0900 hatenablog://entry/17680117127185962342 paco CentOS シェルスクリプト基本構文備忘録 https://hekyou.hatenadiary.org/entry/20110829/p1 <p>今までちゃんと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">シェルスクリプト</a>を勉強したことがなかったのですが<br /> 今回仕事で使う機会があったので組みながら勉強してみました。</p><p>他の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%B8%C0%B8%EC">スクリプト言語</a>でも良かったんだけど<br /> 覚えたかったので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">シェルスクリプト</a>を選択!</p><p>勉強した内容を備忘録として下記に残します。<br /> <br /> </p> <div class="section"> <h4>算術<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a></h4> <pre class="code lang-sh" data-lang="sh" data-unlink> <span class="synIdentifier">a</span>=<span class="synSpecial">`</span><span class="synStatement">expr</span><span class="synSpecial"> </span><span class="synConstant">1</span><span class="synSpecial"> + </span><span class="synConstant">1</span><span class="synSpecial">`</span> </pre><p>exprコマンドで行う。</p> <table> <tr> <th>+</th> <th>-</th> <th>*</th> <th>/</th> <th>%</th> </tr> <tr> <td> a + b </td> <td> a - b </td> <td> a \* b </td> <td> a / b </td> <td> a % b </td> </tr> </table><p>※乗算の時だけ「\*」のように<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>ケープが必要。</p> </div> <div class="section"> <h4>比較<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a></h4> <table> <tr> <th>=</th> <th>!=</th> <th></th> <th>></th> <th><=</th> <th>>~</th> </tr> <tr> <td> -eq </td> <td> -ne </td> <td> -gt </td> <td> -lt </td> <td> -ge </td> <td> -le </td> </tr> </table> </div> <div class="section"> <h4>論理<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a></h4> <table> <tr> <th>!</th> <th>and</th> <th>or</th> </tr> <tr> <td> ! </td> <td> -a </td> <td> -o </td> </tr> </table> </div> <div class="section"> <h4>if文</h4> <div class="section"> <h5>通常</h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">if [</span> <span class="synPreProc">$1</span> <span class="synStatement">-eq</span> <span class="synPreProc">$2</span> <span class="synStatement">]</span>; <span class="synStatement">then</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synStatement">&quot;</span><span class="synConstant">=</span><span class="synStatement">&quot;</span> <span class="synStatement">elif</span> <span class="synStatement">[</span> <span class="synPreProc">$1</span> <span class="synStatement">-gt</span> <span class="synPreProc">$2</span> <span class="synStatement">]</span>; <span class="synStatement">then</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synStatement">&quot;</span><span class="synConstant">&gt;</span><span class="synStatement">&quot;</span> <span class="synStatement">else</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synStatement">&quot;</span><span class="synConstant">other</span><span class="synStatement">&quot;</span> <span class="synStatement">fi</span> </pre><p>thenをifの次の行に置くのが一般的?<br /> 2行になるのがどうも馴染めないので「;」を使って1行にまとめて使うことにする。<br /> 「[」の後に半角スペースが必要。(嵌った。。)<br /> <br /> </p> </div> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a></h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">if </span><span class="synSpecial">[[</span> <span class="synPreProc">${file}</span> <span class="synStatement">=</span>~ .*\.sh$ <span class="synSpecial">]]</span>; <span class="synStatement">then</span> 処理<span class="synConstant">1</span> <span class="synStatement">else</span> 処理<span class="synConstant">2</span> <span class="synStatement">fi</span> </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>の時はカギ括弧2個。<br /> <br /> </p> </div> </div> <div class="section"> <h4>case文</h4> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">case</span> <span class="synPreProc">$1</span> <span class="synStatement">in</span> 1<span class="synStatement">)</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synStatement">&quot;</span><span class="synConstant">1</span><span class="synStatement">&quot;;;</span> 2<span class="synStatement">)</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synStatement">&quot;</span><span class="synConstant">2</span><span class="synStatement">&quot;;;</span> 3 <span class="synStatement">|</span> 4<span class="synStatement">)</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synStatement">&quot;</span><span class="synConstant">3 or 4</span><span class="synStatement">&quot;;;</span> *<span class="synStatement">)</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synStatement">&quot;</span><span class="synConstant">other</span><span class="synStatement">&quot;;;</span> <span class="synStatement">esac</span> </pre><p>「;;」がbreak。<br /> 「*)」がdefault。<br /> <br /> </p> </div> <div class="section"> <h4>for文</h4> <div class="section"> <h5>通常</h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">for</span> num <span class="synStatement">in</span> <span class="synConstant">1</span> <span class="synConstant">2</span> <span class="synConstant">3</span> <span class="synConstant">4</span> <span class="synConstant">5</span>; <span class="synStatement">do</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synPreProc">${num}</span> <span class="synStatement">done</span> </pre><p>「for arg in $@; do」で引数を1つずつ処理可能。<br /> <br /> </p> </div> <div class="section"> <h5>ファイル毎に処理</h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">for</span> file <span class="synStatement">in</span> /var/log/*; <span class="synStatement">do</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synPreProc">${file}</span> cat <span class="synPreProc">${file}</span> <span class="synStatement">done</span> </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リを指定しているところをコマンドにすると色々出来そうです!<br /> <br /> </p> </div> </div> <div class="section"> <h4>while文</h4> <div class="section"> <h5>通常</h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">while [</span> <span class="synPreProc">${i}</span> <span class="synStatement">-lt</span> <span class="synConstant">10</span> <span class="synStatement">]; do</span> <span class="synIdentifier">i</span>=<span class="synSpecial">`</span><span class="synStatement">expr</span><span class="synSpecial"> </span><span class="synPreProc">${i}</span><span class="synSpecial"> + </span><span class="synConstant">1</span><span class="synSpecial">`</span> <span class="synStatement">done</span> </pre><p>whileの条件文に戻る場合はcontinueを使う。<br /> 途中で抜ける場合はbreakを使う。case文とは異なる。。<br /> <br /> </p> </div> <div class="section"> <h5>ファイルを1行ずつ読み込む</h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">while read line; do</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synPreProc">${line}</span> <span class="synStatement">done</span> <span class="synStatement">&lt;</span> <span class="synPreProc">${file}</span> </pre><p>EOFでwhileを抜ける。<br /> <br /> </p> </div> <div class="section"> <h5>標準出力から読み込む</h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">ls</span> | <span class="synStatement">while read file; do</span> <span class="synStatement">echo</span><span class="synConstant"> </span><span class="synPreProc">${file}</span> <span class="synStatement">done</span> </pre> </div> </div> <div class="section"> <h4>until文</h4> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">until [</span> <span class="synPreProc">${i}</span> <span class="synStatement">-gt</span> <span class="synConstant">0</span> <span class="synStatement">]; do</span> <span class="synIdentifier">i</span>=<span class="synSpecial">`</span><span class="synStatement">expr</span><span class="synSpecial"> </span><span class="synPreProc">${i}</span><span class="synSpecial"> - </span><span class="synConstant">1</span><span class="synSpecial">`</span> <span class="synStatement">done</span> </pre><p>条件のところをコマンドにして、処理のところにsleepを入れれば<br /> 正常終了するまでコマンドを繰り返すことが可能。</p> </div> Mon, 29 Aug 2011 00:00:00 +0900 hatenablog://entry/17680117127185962933 シェルスクリプト cron処理内で別ユーザ権限でコマンドを実行する方法 https://hekyou.hatenadiary.org/entry/20110826/p1 <p>バックアップ用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">シェルスクリプト</a>を書きました。</p><p>でも、、</p><p>直接実行した場合は想定通りに動きましたが<br /> cronで実行した場合に途中で処理が失敗してしまいます。。</p><br /> <p>調べてみると</p><p>/var/log/secure に</p> <pre>sorry, you must have a tty to run sudo </pre><p>というエラーメッセージが出力されてました。</p><br /> <p>どうやらデフォルトの設定では<br /> tty上でしかsudoは使えないようです。</p><p>使うためには /etc/sudoers を下記のように<br /> 変更する必要があるようです。</p><p>※visudo で編集</p> <pre># 下記を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%E1%A5%F3%A5%C8%A5%A2%A5%A6%A5%C8">コメントアウト</a>する # Defaults requiretty </pre><p>今回は上記sudoの設定変更ではなく<br /> 下記のようにsuを使うようにして対処しました。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>sudo rsync rsync <span class="synSpecial">-avz</span> <span class="synSpecial">-e</span> ssh ... </pre><p>を</p> <pre class="code lang-sh" data-lang="sh" data-unlink>su rsync <span class="synSpecial">-c</span> <span class="synStatement">&quot;</span><span class="synConstant">rsync -avz -e ssh ...</span><span class="synStatement">&quot;</span> </pre><p>に変更。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/rsync">rsync</a>ユーザになって -c で指定したコマンドを実行する<br /> という処理です。<br /> <br /> </p> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a> 5.5</p> </div> Fri, 26 Aug 2011 00:00:00 +0900 hatenablog://entry/17680117127185963425 cron PukiWiki用のblockdiagプラグイン https://hekyou.hatenadiary.org/entry/20110717/p1 <p>便利なblockdiag。<br /> 各システムに埋め込むための<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>があるようですが<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/PukiWiki">PukiWiki</a>用がなかったので作ってみましたー。</p><p>既にあれば無視してください。。</p><p>以下、簡単な使い方を。<br /> <br /> </p> <div class="section"> <h4>要件</h4> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/PukiWiki">PukiWiki</a> 1.4.6以降</li> <li>blockdiagインストール済</li> <li>nwdiagインストール済</li> <li>seqdiagインストール済</li> <li>actdiagインストール済</li> </ul> </div> <div class="section"> <h4>ダウンロード</h4> <p><a href="https://github.com/hekyou/diag-pukiwiki-extension">https://github.com/hekyou/diag-pukiwiki-extension</a></p> <ul> <li>diag.inc.<a class="keyword" href="http://d.hatena.ne.jp/keyword/php">php</a> [本体]</li> <li>README.rst [メモ]</li> </ul><p><a href="#f-2f399f8a" name="fn-2f399f8a" title="mediawikiプラグインとフォーマット等を合わせました。問題があればご指摘頂けると助かります。。">*1</a></p><p></p> </div> <div class="section"> <h4>インストール方法</h4> <div class="section"> <h5>1. <a class="keyword" href="http://d.hatena.ne.jp/keyword/PukiWiki">PukiWiki</a>のplugin配下にdiag.inc.<a class="keyword" href="http://d.hatena.ne.jp/keyword/php">php</a>を置く</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>cp diag.inc.php <span class="synPreProc">${PUKIWIKI_ROOT}</span>/plugin/ </pre> </div> <div class="section"> <h5>2. <a class="keyword" href="http://d.hatena.ne.jp/keyword/pukiwiki">pukiwiki</a>.ini.<a class="keyword" href="http://d.hatena.ne.jp/keyword/php">php</a>内の複数行<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>引数設定を有効に</h5> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/PukiWiki">PukiWiki</a> 1.4.6以降のみ可能なようです。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>define<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK</span><span class="synStatement">'</span><span class="synSpecial">, </span><span class="synConstant">0</span><span class="synPreProc">)</span>; // <span class="synConstant">1</span> <span class="synStatement">=</span> Disabled </pre> </div> <div class="section"> <h5>3. 初期設定変更</h5> <p>diag.inc.<a class="keyword" href="http://d.hatena.ne.jp/keyword/php">php</a>内のdefineを変更することで可能です。</p> <ul> <li>画像一時生成場所</li> </ul><p>表示時、一時的に使用。<br /> 画像ファイルを保存しないようにするために<br /> 毎回表示時に画像を生成する方式を採用しました。<br /> そのため表示の際に多少ラグがあるかも…</p> <pre class="code lang-sh" data-lang="sh" data-unlink>defined<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_IMAGE_DIR</span><span class="synStatement">'</span><span class="synPreProc">)</span> or define<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_IMAGE_DIR</span><span class="synStatement">'</span><span class="synSpecial">, </span><span class="synStatement">'</span><span class="synConstant">/tmp/</span><span class="synStatement">'</span><span class="synPreProc">)</span>; </pre> <ul> <li>blockdiag等のパス</li> </ul><pre class="code lang-sh" data-lang="sh" data-unlink>defined<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_BLOCKDIAG_PATH</span><span class="synStatement">'</span><span class="synPreProc">)</span> or define<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_BLOCKDIAG_PATH</span><span class="synStatement">'</span><span class="synSpecial">, </span><span class="synStatement">'</span><span class="synConstant">/usr/local/bin/blockdiag</span><span class="synStatement">'</span><span class="synPreProc">)</span>; defined<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_NWDIAG_PATH</span><span class="synStatement">'</span><span class="synPreProc">)</span> or define<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_NWDIAG_PATH</span><span class="synStatement">'</span><span class="synSpecial">, </span><span class="synStatement">'</span><span class="synConstant">/usr/local/bin/nwdiag</span><span class="synStatement">'</span><span class="synPreProc">)</span>; defined<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_SEQDIAG_PATH</span><span class="synStatement">'</span><span class="synPreProc">)</span> or define<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_SEQDIAG_PATH</span><span class="synStatement">'</span><span class="synSpecial">, </span><span class="synStatement">'</span><span class="synConstant">/usr/local/bin/seqdiag</span><span class="synStatement">'</span><span class="synPreProc">)</span>; defined<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_ACTDIAG_PATH</span><span class="synStatement">'</span><span class="synPreProc">)</span> or define<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_ACTDIAG_PATH</span><span class="synStatement">'</span><span class="synSpecial">, </span><span class="synStatement">'</span><span class="synConstant">/usr/local/bin/actdiag</span><span class="synStatement">'</span><span class="synPreProc">)</span>; </pre> <ul> <li>フォントの変更</li> </ul><pre class="code lang-sh" data-lang="sh" data-unlink>define<span class="synPreProc">(</span><span class="synStatement">'</span><span class="synConstant">PLUGIN_DIAG_FONT_PATH</span><span class="synStatement">'</span><span class="synSpecial">, </span><span class="synStatement">'</span><span class="synConstant">--font=/Library/Fonts/Osaka.ttf</span><span class="synStatement">'</span><span class="synPreProc">)</span>; </pre><p>といった形式でフォントのパスを指定することで<br /> 任意のフォントが使用可能です。<br /> <br /> </p> </div> </div> <div class="section"> <h4>使い方</h4> <p>埋め込みたいところに下記フォーマットで記述</p> <pre>#diag([type]){{ [diagram] }} </pre><p>[type]に入れるのは</p> <pre>block : blockdiag使用時 nw : nwdiag使用時 seq : seqdiag使用時 act : actdiag使用時 </pre><p>[diagram]には通常使用するdiagram文をそのまま使用<br /> <br /> </p> </div> <div class="section"> <h4>使用例</h4> <div class="section"> <h5>blockdiag</h5> <pre>#diag(block){{ diagram { A -> B -> C -> D; A -> E -> F -> G; } }} </pre> </div> <div class="section"> <h5>nwdiag</h5> <pre>#diag(nw){{ diagram { network <a class="keyword" href="http://d.hatena.ne.jp/keyword/dmz">dmz</a> { address = "210.x.x.x/24" web01 [address = "210.x.x.1"]; web02 [address = "210.x.x.2"]; } network internal { address = "172.x.x.x/24"; web01 [address = "172.x.x.1"]; web02 [address = "172.x.x.2"]; db01; db02; } } }} </pre> </div> <div class="section"> <h5>seqdiag</h5> <pre>#diag(seq){{ diagram { browser -> webserver [label = "GET /index.html"]; browser <-- webserver; browser -> webserver [label = "POST /blog/comment"]; webserver -> database [label = "INSERT comment"]; webserver <-- database; browser <-- webserver; } }} </pre> </div> <div class="section"> <h5>actdiag</h5> <pre>#diag(act){{ diagram { write -> convert -> image lane user { label = "User" write [label = "Writing reST"]; image [label = "Get diagram IMAGE"]; } lane actdiag { convert [label = "Convert reST to Image"]; } } }} </pre><p>blockdiag等をそのままコマンドにしたかったのですが<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>ファイルを1つにしたかったため<br /> diagコマンドとなりました。。</p><p>要望があれば諸々検討させていただきます!</p> </div> </div><div class="footnote"> <p class="footnote"><a href="#fn-2f399f8a" name="f-2f399f8a" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a class="keyword" href="http://d.hatena.ne.jp/keyword/mediawiki">mediawiki</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>とフォーマット等を合わせました。問題があればご指摘頂けると助かります。。</span></p> </div> Sun, 17 Jul 2011 00:00:00 +0900 hatenablog://entry/17680117127185963657 blockdiag nwdiag seqdiag actdiag node.js環境構築 https://hekyou.hatenadiary.org/entry/20110716/p1 <p>node.jsがおもしろい。</p><p>最初は直接node.jsをインストールしていたけど<br /> バージョン管理が面倒なのでnaveを使って管理することにしました。</p><p>以下、naveによるnode.js環境構築時に行った手順です。<br /> <br /> </p> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20OS%20X">Mac OS X</a> 10.6.8<br /> <br /> </p> </div> <div class="section"> <h4>インストール手順</h4> <div class="section"> <h5>Step1. gitインストール</h5> <p>naveが<a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>に置いてあるのでgitをインストールします。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>sudo port install git-core <span class="synSpecial">+svn</span> <span class="synSpecial">+bash_completion</span> <span class="synSpecial">+doc</span> </pre><p>gitインストール時に<a class="keyword" href="http://d.hatena.ne.jp/keyword/curl">curl</a>-ca-bundleでエラーが出てしまいました。。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>sudo port clean curl-ca-bundle </pre><p>で解決!<br /> <br /> </p> </div> <div class="section"> <h5>Step2. インストール先を準備する</h5> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">mkdir</span> ~/work <span class="synStatement">cd</span> ~/work </pre><p>場所も<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ名も任意で。<br /> <br /> </p> </div> <div class="section"> <h5>Step3. naveインストール</h5> <pre class="code lang-sh" data-lang="sh" data-unlink>git clone http://github.com/isaacs/nave.git <span class="synStatement">cd</span> nave/ ./nave.sh install latest </pre><p>latest指定で最新版がインストールされます。<br /> latestの代わりにバージョンを指定することもできます。<br /> <br /> </p> </div> <div class="section"> <h5>Step4. npmインストール</h5> <p>node.jsのパッケージ管理ツールをインストールします。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>./nave.sh use latest curl http://npmjs.org/install.sh | sh </pre><p>これにて構築は完了です。<br /> <br /> </p> </div> </div> <div class="section"> <h4>動かしてみよう!</h4> <p>example.jsファイルを用意して下記コードを記述します。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// モジュールの読み込み </span> <span class="synIdentifier">var</span> http = require(<span class="synConstant">'http'</span>); <span class="synComment">// サーバを起動する </span> http.createServer(<span class="synIdentifier">function</span> (req, res) <span class="synIdentifier">{</span> res.writeHead(200, <span class="synIdentifier">{</span><span class="synConstant">'Content-Type'</span>: <span class="synConstant">'text/plain'</span><span class="synIdentifier">}</span>); res.end(<span class="synConstant">&quot;Hello World</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>); <span class="synIdentifier">}</span>).listen(8124, <span class="synConstant">&quot;127.0.0.1&quot;</span>); console.log(<span class="synConstant">'Server running at http://127.0.0.1:8124/'</span>); </pre><p>実行!</p> <pre class="code lang-sh" data-lang="sh" data-unlink>~/work/nave/nave.sh use latest node example.js </pre><p>コンソールに</p> <pre>Server running at <a href="http://127.0.0.1:8124/">http://127.0.0.1:8124/</a> </pre><p>が表示されていれば起動成功です。<br /> この状態でブラウザで<a href="http://127.0.0.1:8124/">http://127.0.0.1:8124/</a>にアクセスすると</p> <pre><a class="keyword" href="http://d.hatena.ne.jp/keyword/Hello%20World">Hello World</a> </pre><p>が表示されます。<br /> 素晴らしい!<br /> <br /> </p> </div> <div class="section"> <h4>おまけ</h4> <p>naveのパスを毎回打ち込むのが面倒なので<br /> aliasを設定しています。</p> <pre>alias nave='~/work/nave/nave.sh' </pre> </div> Sat, 16 Jul 2011 00:00:01 +0900 hatenablog://entry/17680117127185964261 javascript node.js blockdiagシリーズをインストール https://hekyou.hatenadiary.org/entry/20110716/p2 <p>作成が面倒なブロック図やネットワーク図などを<br /> テキストから簡単に生成してくれるblockdiagシリーズ。</p><p>面白そうだったので使ってみました!</p><p>以下、インストール手順です。<br /> <br /> </p> <div class="section"> <h4>環境</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20OS%20X">Mac OS X</a> 10.6.8<br /> <br /> </p> </div> <div class="section"> <h4>インストール手順</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>sudo port install freetype libpng jpeg sudo easy_install pip sudo pip install pil sudo pip install blockdiag nwdiag seqdiag actdiag </pre><p>上記でインストールは完了です!</p><p>ただ、最初に入れた時は<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/freetype">freetype</a>を入れずに実施してしまったために<br /> 下記エラーが出てしまいました。。</p> <pre>Traceback (<a class="keyword" href="http://d.hatena.ne.jp/keyword/most">most</a> recent call last): File "/usr/local/bin/nwdiag", line 8, in <module> load_entry_point('nwdiag==0.2.7', 'console_scripts', 'nwdiag')() File "/Library/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>/2.6/site-packages/nwdiag/command.py", line 113, in main draw.draw() File "/Library/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>/2.6/site-packages/nwdiag/DiagramDraw.py", line 53, in draw super(DiagramDraw, self).draw() File "/Library/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>/2.6/site-packages/blockdiag/DiagramDraw.py", line 112, in draw self.node(node, **kwargs) File "/Library/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>/2.6/site-packages/nwdiag/DiagramDraw.py", line 82, in node fontsize=self.metrix.fontSize) File "/Library/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>/2.6/site-packages/blockdiag/imagedraw/<a class="keyword" href="http://d.hatena.ne.jp/keyword/png">png</a>.py", line 268, in textarea lines = TextFolder(box, string, scale=self.scale_ratio, **kwargs) File "/Library/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>/2.6/site-packages/blockdiag/utils/PILTextFolder.py", line 27, in __init__ self.ttfont = ImageFont.truetype(font, fontsize) File "/Library/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>/2.6/site-packages/PIL/ImageFont.py", line <a class="keyword" href="http://d.hatena.ne.jp/keyword/218">218</a>, in truetype return FreeTypeFont(filename, size, index, encoding) File "/Library/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>/2.6/site-packages/PIL/ImageFont.py", line 134, in __init__ self.font = core.getfont(file, size, index, encoding) File "/Library/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>/2.6/site-packages/PIL/ImageFont.py", line 34, in __getattr__ raise ImportError("The _imagingft C module is not installed") ImportError: The _imagingft C module is not installed </pre> </div> <div class="section"> <h4>使ってみよう!</h4> <p>test.diagファイルを用意して下記コードを記述します。</p> <pre class="code" data-lang="" data-unlink>diagram { orientation = portrait A -&gt; B -&gt; C; B -&gt; D; }</pre><p>実行!</p> <pre class="code lang-sh" data-lang="sh" data-unlink>blockdiag <span class="synSpecial">--font=/Library/Fonts/Osaka.ttf</span> <span class="synSpecial">--antialias</span> test.diag </pre><p>すると下記画像[test.<a class="keyword" href="http://d.hatena.ne.jp/keyword/png">png</a>]が生成されます。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/hekyou/20110716173009" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/h/hekyou/20110716/20110716173009.png" alt="f:id:hekyou:20110716173009p:image" title="f:id:hekyou:20110716173009p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> 素晴らしい!</p> </div> Sat, 16 Jul 2011 00:00:00 +0900 hatenablog://entry/17680117127185964025 blockdiag nwdiag seqdiag actdiag