tag:blogger.com,1999:blog-48891112587822002842024-03-13T12:31:31.556+09:00tachibanakikaku.commryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.comBlogger48125tag:blogger.com,1999:blog-4889111258782200284.post-62012275753340774842020-04-11T21:32:00.001+09:002020-04-11T21:36:06.870+09:00phpbrewでのPHP環境セットアップ on Mac<h2>
<span style="background-color: #fbfaf8; color: #333333; font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace;">概要</span></h2>
<span style="background-color: #fbfaf8; color: #333333; font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace;"><br /></span>
<span style="background-color: #fbfaf8; color: #333333; font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace;">タイトル通り。PHP環境セットアップは初めてで少し手間取った。</span><br />
<span style="background-color: #fbfaf8; color: #333333; font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace;"><br /></span>
<br />
<h2>
<span style="background-color: #fbfaf8; color: #333333; font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace;">手順</span></h2>
<span style="background-color: #fbfaf8; color: #333333; font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace;"><br /></span>
<span style="background-color: #fbfaf8; color: #333333; font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace;">多言語でも使うことが多いライブラリ等をインストール。</span><br />
<br />
<!--?xml version="1.0" encoding="UTF-8"?-->
<br />
<div style="-en-clipboard: true; -en-codeblock: true; background-color: #fbfaf8; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.14902); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px; padding: 8px;">
% brew install bzip2 zlib libzip curl libxml2 </div>
<br />
phpbrew自体のインストールは<a href="https://github.com/phpbrew/phpbrew/blob/master/README.ja.md#phpbrew%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" target="_blank">phpbrew README</a>の通り。<br />
<br />
その後、fpmやpgsqlなどのvariantsを指定して7.3.16をインストール。<br />
<!--?xml version="1.0" encoding="UTF-8"?--><!--?xml version="1.0" encoding="UTF-8"?-->
<br />
<div style="-en-clipboard: true; -en-codeblock: true; background-color: #fbfaf8; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.14902); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px; padding: 8px;">
# 個別のbrew prefix指定でなく事前指定も可能 (=> <a href="https://github.com/phpbrew/phpbrew/blob/master/README.ja.md#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9" target="_blank">phpbrew README</a>)<br />
# pgsqlの指定例: +pgsql=/Applications/Postgres.app/Contents/Versions/latest<br />
<br />
<!--?xml version="1.0" encoding="UTF-8"?-->
<!--?xml version="1.0" encoding="UTF-8"?-->% phpbrew install --stdout 7.3.16 +default +fpm +curl=$(brew --prefix curl) +openssl=$(brew --prefix openssl) +pdo +bz2=$(brew --prefix bzip2) +zlib=$(brew --prefix zlib) +xml=$(brew --prefix libxml2) +pgsql=<PostgreSQL root directory></div>
<br />
インストールされたことを確認。<br />
<!--?xml version="1.0" encoding="UTF-8"?-->
<br />
<div style="-en-clipboard: true; -en-codeblock: true; background-color: #fbfaf8; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.14902); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px; padding: 8px;">
<div style="-en-clipboard: true;">
% phpbrew switch php-7.3.16
</div>
<div>
% phpbrew list
</div>
<div>
* php-7.3.16
</div>
<div>
% php -m | grep -E '(pgsql|xml|bz|zlib|curl|ssl)'
</div>
<div>
bz2
</div>
<div>
curl
</div>
<div>
libxml
</div>
<div>
openssl
</div>
<div>
pdo_pgsql
</div>
<div>
pgsql
</div>
<div>
xml
</div>
<div>
xmlreader
</div>
<div>
xmlwriter
</div>
<!--?xml version="1.0" encoding="UTF-8"?-->
<br />
<div>
zlib</div>
</div>
<br />
php-fpmを起動・停止。<br />
<!--?xml version="1.0" encoding="UTF-8"?-->
<br />
<div style="-en-clipboard: true; -en-codeblock: true; background-color: #fbfaf8; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.14902); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px; padding: 8px;">
<!--?xml version="1.0" encoding="UTF-8"?-->
<br />
<div>
% phpbrew fpm start
</div>
<div>
Starting php-fpm...
</div>
<div>
[10-Apr-2020 20:40:06] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
</div>
<div>
[10-Apr-2020 20:40:06] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
</div>
<div>
<br /></div>
<div>
% phpbrew fpm stop
</div>
<div>
Stopping php-fpm... </div>
</div>
<br />
<h2>
所感</h2>
<div>
当初、variantsではなくインストール後にpgsql拡張のインストールができるのかと試したができなかった。PHPそのもののビルド時に必要なのだろうか。PHP全然分からないが、必要なものはインストールできている筈。</div>
mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-1097683598189658572019-05-02T19:37:00.000+09:002019-05-02T19:37:04.798+09:00DockerコンテナからMacへアクセス<br />
経緯:開発時にDockerコンテナからMac上のDBへ接続させたかった。<br />
結論:host.docker.internalを使う(<a href="https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host" target="_blank">公式</a>)<br />
<br />
<i>$ mysql -uroot -h host.docker.internal -p</i><br />
<br />mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-5181904582993783652016-02-03T18:28:00.001+09:002016-02-03T20:49:26.058+09:00異なるクラスのスレッド間で同期させる久しぶりの投稿<br />
<br />
当初はあるクラスのスレッド間で1秒ごとにシーケンシャル処理を行いたいというものだった。<br />
<i><br /></i>
<i># a.rb</i><br />
<i><span class="s1">class</span><span class="s2"> </span><span class="s3">A</span></i><br />
<div class="p2">
<i><span class="s1"> </span><span class="s4">@m</span><span class="s1"> = </span><span class="s3">Mutex</span><span class="s1">.new</span></i></div>
<div class="p3">
<i><span class="s1"></span><br /></i></div>
<div class="p2">
<i><span class="s1"> </span><span class="s5">def</span><span class="s1"> </span><span class="s6">get</span></i></div>
<div class="p2">
<i><span class="s1"> </span><span class="s5">self</span><span class="s1">.class.instance_variable_get(</span><span class="s7">:@m</span><span class="s1">).synchronize </span><span class="s5">do</span></i></div>
<div class="p2">
<i><span class="s1"> </span><span class="s6">sleep</span><span class="s1"> 1</span></i></div>
<div class="p4">
<i><span class="s2"> </span><span class="s6">puts</span><span class="s2"> </span><span class="s3">"</span><span class="s1">#{Time.now}</span><span class="s3"> => </span><span class="s1">#{self.class.name}</span><span class="s3">"</span></i></div>
<div class="p2">
<i><span class="s1"> </span><span class="s5">end</span></i></div>
<div class="p1">
<i><span class="s2"> </span><span class="s1">end</span></i></div>
<br />
<div class="p1">
<span class="s1"><i>end</i></span></div>
<div class="p1">
<br /></div>
<div class="p1">
<span class="s1"><i># do.rb</i></span></div>
<div class="p1">
<i><span class="s1">require_relative</span><span class="s2"> </span><span class="s3">'./a'</span></i></div>
<div class="p1">
<i><span class="s1">require_relative</span><span class="s2"> </span><span class="s3">'./b' # Aとはクラス名のみ異なる。</span></i></div>
<div class="p2">
<i><span class="s1"></span><br /></i></div>
<div class="p3">
<i><span class="s1">ps = [</span><span class="s3">A</span><span class="s1">, </span><span class="s3">B</span><span class="s1">]</span></i></div>
<div class="p3">
<span class="s1"><i>ts = []</i></span></div>
<div class="p2">
<i><span class="s1"></span><br /></i></div>
<div class="p3">
<i><span class="s1">5.times </span><span class="s4">do</span></i></div>
<div class="p3">
<i><span class="s1"> ps.each </span><span class="s4">do</span><span class="s1"> |prog|</span></i></div>
<div class="p3">
<i><span class="s1"> t = </span><span class="s3">Thread</span><span class="s1">.new </span><span class="s4">do</span></i></div>
<div class="p3">
<span class="s1"><i> prog.new.get</i></span></div>
<div class="p3">
<i><span class="s1"> </span><span class="s4">end</span></i></div>
<div class="p2">
<i><span class="s1"></span><br /></i></div>
<div class="p3">
<span class="s1"><i> ts << t</i></span></div>
<div class="p4">
<i><span class="s2"> </span><span class="s1">end</span></i></div>
<div class="p4">
<span class="s1"><i>end</i></span></div>
<div class="p2">
<i><span class="s1"></span><br /></i></div>
<div class="p1">
</div>
<div class="p3">
<span class="s1"><i>ts.each { |t| t.join }</i></span></div>
<div class="p3">
<span class="s1"><i><br /></i></span></div>
<div class="p3">
<span class="s1">do.rbの実行結果は次のとおり。</span></div>
<div class="p3">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1"><i>$ ruby do.rb </i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:30 +0900 => A</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:30 +0900 => B</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:31 +0900 => B</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:31 +0900 => A</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:32 +0900 => B</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:32 +0900 => A</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:33 +0900 => A</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:33 +0900 => B</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:34 +0900 => B</i></span></div>
<div class="p3">
<span class="s1"><i>
</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:10:34 +0900 => A</i></span></div>
<div class="p1">
<span class="s1"><i><br /></i></span></div>
<div class="p1">
</div>
<ul>
<li>Aのスレッド間では1秒ごとにメソッドが実行されている。</li>
<li>Bのスレッド間では1秒ごとにメソッドが実行されている。</li>
</ul>
<div>
ただ、この全部のスレッドで1秒ごとに処理を実行したいという変更が入ったため変更。</div>
<div>
今回はモジュール変数で対応した。</div>
<div>
<i><br /></i></div>
<br />
<div class="p3">
<span class="s3"><i># synchronizable.rb</i></span></div>
<div>
<div class="p1">
<i><span class="s1">module</span><span class="s2"> </span><span class="s3">Synchronizable</span></i></div>
<div class="p2">
<i><span class="s3"> </span><span class="s4">@@m</span><span class="s3"> = </span><span class="s5">Mutex</span><span class="s3">.new</span></i></div>
<div class="p3">
<i><span class="s3"></span><br /></i></div>
<div class="p2">
<i><span class="s3"> </span><span class="s1">def</span><span class="s3"> </span><span class="s6">m</span></i></div>
<div class="p2">
<i><span class="s3"> </span><span class="s4">@@m</span></i></div>
<div class="p4">
<i><span class="s2"> </span><span class="s3">end</span></i></div>
<div class="p3">
<i><span class="s3"></span></i></div>
<div class="p4">
<span class="s3"><i>end</i></span></div>
<div class="p4">
<span class="s3"><i><br /></i></span></div>
</div>
<div class="p1">
</div>
<div>
<i># a2.rb</i></div>
<br />
<div class="p1">
<i><span class="s1">require_relative</span><span class="s2"> </span><span class="s3">'./synchronizable'</span></i></div>
<div>
<div class="p2">
<i><span class="s3"></span><br /></i></div>
<div class="p3">
<i><span class="s3">class</span><span class="s2"> </span><span class="s4">A2</span></i></div>
<div class="p1">
<i><span class="s2"> </span><span class="s1">include</span><span class="s2"> </span><span class="s3">Synchronizable</span></i></div>
<div class="p2">
<i><span class="s3"></span><br /></i></div>
<div class="p4">
<i><span class="s3"> </span><span class="s5">def</span><span class="s3"> </span><span class="s1">get</span></i></div>
<div class="p4">
<i><span class="s3"> m.synchronize </span><span class="s5">do</span></i></div>
<div class="p4">
<i><span class="s3"> </span><span class="s1">sleep</span><span class="s3"> 1</span></i></div>
<div class="p5">
<i><span class="s2"> </span><span class="s1">puts</span><span class="s2"> </span><span class="s4">"</span><span class="s3">#{Time.now}</span><span class="s4"> => </span><span class="s3">#{self.class.name}</span><span class="s4">"</span></i></div>
<div class="p4">
<i><span class="s3"> </span><span class="s5">end</span></i></div>
<div class="p3">
<i><span class="s2"> </span><span class="s3">end</span></i></div>
<div class="p3">
<span class="s3"><i>end</i></span></div>
<div class="p3">
<span class="s3"><i><br /></i></span></div>
<div class="p3">
<span class="s3"><i># do2.rb</i></span></div>
<div class="p1">
<i><span class="s1">require_relative</span><span class="s2"> </span><span class="s3">'./a2'</span></i></div>
<div class="p1">
<i><span class="s1">require_relative</span><span class="s2"> </span><span class="s3">'./b2' </span></i><i># A2とはクラス名のみ異なる</i></div>
<div class="p2">
<i><span class="s1"></span><br /></i></div>
<div class="p3">
<i><span class="s1">ps = [</span><span class="s3">A2</span><span class="s1">, </span><span class="s3">B2</span><span class="s1">]</span></i></div>
<div class="p3">
<span class="s1"><i>ts = []</i></span></div>
<div class="p2">
<i><span class="s1"></span><br /></i></div>
<div class="p3">
<i><span class="s1">5.times </span><span class="s4">do</span></i></div>
<div class="p3">
<i><span class="s1"> ps.each </span><span class="s4">do</span><span class="s1"> |prog|</span></i></div>
<div class="p3">
<i><span class="s1"> t = </span><span class="s3">Thread</span><span class="s1">.new </span><span class="s4">do</span></i></div>
<div class="p3">
<span class="s1"><i> prog.new.get</i></span></div>
<div class="p3">
<i><span class="s1"> </span><span class="s4">end</span></i></div>
<div class="p2">
<i><span class="s1"></span><br /></i></div>
<div class="p3">
<span class="s1"><i> ts << t</i></span></div>
<div class="p4">
<i><span class="s2"> </span><span class="s1">end</span></i></div>
<div class="p4">
<span class="s1"><i>end</i></span></div>
<div class="p2">
<i><span class="s1"></span><br /></i></div>
<div class="p3">
<span class="s3"><i>
</i></span></div>
<div class="p3">
<span class="s1"><i>ts.each { |t| t.join }</i></span></div>
<div class="p3">
<br /></div>
<div class="p3">
do2.rbの実行結果</div>
<div class="p3">
<br /></div>
<div class="p1">
<span class="s1"><i>$ ruby do2.rb </i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:44 +0900 => B2</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:45 +0900 => B2</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:46 +0900 => A2</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:47 +0900 => A2</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:48 +0900 => A2</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:49 +0900 => B2</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:50 +0900 => A2</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:51 +0900 => B2</i></span></div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:52 +0900 => A2</i></span></div>
<div class="p3">
</div>
<div class="p1">
<span class="s1"><i>2016-02-03 18:24:53 +0900 => B2</i></span></div>
<div class="p1">
<span class="s1"><i><br /></i></span></div>
<div class="p1">
<span class="s1">すべてのスレッドで1秒ごとに処理が実行されている。</span></div>
</div>
<div class="p1">
<br /></div>
mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-91130886952451605892015-03-28T01:34:00.001+09:002015-03-28T01:36:44.612+09:00VALUE DOMAINとS3を組み合わせて任意のサイトへのリダイレクトを行う設定(簡易版)<br />
VALUE DOMAINのDNS設定、S3を組み合わせてリダイレクトさせる<br />
URL転送用レコードを作成する機能がVALUE DOMAINには元々存在する。<br />
しかし、違う方法でやる必要があったのでメモ。<br />
<br />
<h3>
お題</h3>
<br />
エンドユーザが www.tachibanakikaku.com にアクセスした時、<br />
foobar.example.com へリダイレクトさせる。<br />
<br />
<h4>
S3バケットの作成・設定</h4>
<br />
<br />
<ul>
<li>バケット: www.tachibanakikaku.com を作成</li>
<li>Static Website Hosting で Enable website hosting を選択</li>
<li>Index Document には "index.html" を入力</li>
<li>Endpointをメモしておく</li>
</ul>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-udNskJeEijA/VRWBc_vvnHI/AAAAAAAAAxM/juY5Lf7617w/s1600/s3_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-udNskJeEijA/VRWBc_vvnHI/AAAAAAAAAxM/juY5Lf7617w/s1600/s3_2.png" height="131" width="400" /></a></div>
<br />
<h4>
index.htmlの用意</h4>
<br />
<br />
<ul>
<li>バケット内に次の内容でindex.htmlをアップロードする</li>
</ul>
<br />
<blockquote class="tr_bq">
<html><br />
<head><br />
<meta http-equiv="refresh" content="0; url=http://foobar.example.com/"><br />
</head><br />
<body></body><br />
</html></blockquote>
<br />
<div class="p1">
<br />
<ul>
<li>index.htmlのPermissionsでGrantee: Everyoneを作成し、Open/Downloadを許可</li>
</ul>
</div>
<div class="p1">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-WEPHqDDrgDg/VRWC8jGHMRI/AAAAAAAAAxY/pvOIQVd4m1M/s1600/index_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-WEPHqDDrgDg/VRWC8jGHMRI/AAAAAAAAAxY/pvOIQVd4m1M/s1600/index_2.png" height="156" width="400" /></a></div>
<div class="p1">
<br /></div>
<h4>
DNSを設定</h4>
<div class="p1">
<br /></div>
<div class="p1">
<br />
<ul>
<li>www.tachibanakikaku.com. IN CNAME <メモしておいたEndpoint></li>
</ul>
</div>
<div class="p1">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-YViVzGn-zIc/VRV_kAyCSXI/AAAAAAAAAxA/Pju_zUHji6I/s1600/dns_value_domain.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-YViVzGn-zIc/VRV_kAyCSXI/AAAAAAAAAxA/Pju_zUHji6I/s1600/dns_value_domain.png" height="28" width="400" /></a></div>
<div class="p1">
<br /></div>
<div class="p1">
<br /></div>
<div class="p1">
以上</div>
mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com1tag:blogger.com,1999:blog-4889111258782200284.post-24058385656261405832014-12-08T11:30:00.000+09:002014-12-08T14:15:41.502+09:00EC2インスタンスのAMIバックアップを取るスクリプトRubyで一瞬。<br />
<br />
<h4>
留意事項</h4>
<ul>
<li>認証情報は別途用意する (e.g. ~/.aws/config)。</li>
<li><i>create_image</i>はAMI作成リクエストを送り直ぐに戻るという想像の下に書いてる。</li>
</ul>
<br />
<script src="https://gist.github.com/mryoshio/0732493f052db5ee9dd6.js"></script>mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-42568792782008195152014-11-12T21:13:00.000+09:002014-11-12T21:20:44.037+09:00DPについての講義を受けた記録(前編)恥ずかしながら未だにDP(動的計画法)に慣れてないのでどうしたものかなと思っていたら「DPなら俺に任せろ。俺はDPの気持ちが分かる」という方が居られたのでそれならと知人と共に簡単な講義をお願いした。「ちょっと張り切って作ってみた」と聞いていたので少しビビりながらも当日に臨んだのでその記録。この内容は入門レベルなので読む必要ない人の方が多いはず。<br />
<br />
<br />
<h4>
導入</h4>
<div>
<br /></div>
<h3>
DPとはなんぞや</h3>
<div>
<br /></div>
<div>
Wikipediaには以下の2つの条件を満たすものと書いてある。</div>
<div>
<ul>
<li>分割統治法</li>
<li>メモ化</li>
</ul>
<div>
しかし、講義内ではもう少し厳密さを入れたかったのか、ボトムアップに解いていく点も説明に含められていた。まとめると講義では、「<b>部分問題をボトムアップに解いていく」、</b>「<b>同じ計算を二度実行しない」</b>の二点が何度も繰り返された。</div>
</div>
<div>
<br /></div>
<div>
その後、フィボナッチ数列を例に説明が為された。<br />
<br />
<br /></div>
<div>
<h3>
フィボナッチをDPで解く例
</h3>
<script src="https://gist.github.com/mryoshio/30d3bc9d748330bcadb3.js"></script>
</div>
<h4>
</h4>
<h4>
</h4>
<h4>
演習1(ロッド切り出し問題)</h4>
<div>
<br /></div>
<div>
ロッド切り出し問題を使った演習。漸化式を見つけると言う分かりきった分かりにくいものだけではなく、部分最適構造性を見つけるということで含まれていたSchemeの例がわかりやすかった。<br />
<br />
長さが5の時は、5, (4, 1), (3, 2)の3パターンだが、1から順に入力値までの最適解を求めながらループさせることになる。<br />
<br />
<h3>
コード例</h3>
<script src="https://gist.github.com/mryoshio/57d03a27afd95e39cc26.js"></script>
</div>
<h4>
</h4>
<h4>
演習2(LCS)</h4>
<div>
<br /></div>
<div>
定番のLCSを使った演習。この漸化式見つけられるならそもそも困らないだろと皆がツッコみたいところである。<b>仮定が大事</b>という言葉にうまく丸め込まれた感は否めない。</div>
<div>
<br /></div>
<div>
仮定→漸化式→プログラム、という風に落としこんでいく感じは掴めた(気がする)。</div>
<div>
<br /></div>
<h3>
コード例</h3>
<div>
<script src="https://gist.github.com/mryoshio/9191747.js"></script></div>
<div>
<h4>
所感</h4>
</div>
<div>
<br /></div>
<div>
こういう機会を設けることに意味はあるが、仕事ではあまり使わない現実が悲しい。</div>
<div>
久しぶりに書いたけど、Blogger使いづらい。<br />
<br />
<b>→</b>DP講義(後編)は11/30開催予定</div>
mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com1日本, 東京都35.6894875 139.6917063999999321.7112815 119.03740939999993 49.6676935 160.34600339999992tag:blogger.com,1999:blog-4889111258782200284.post-75316887188066525122014-05-15T01:08:00.001+09:002014-05-15T11:13:54.859+09:00curlを使ってJSONファイルをPOST偶に必要な時にパッと出てこないので自分用メモ。
<br />
<br />
<h3>
# test.jsonを用意</h3>
<div>
<a href="http://en.wikipedia.org/wiki/JSON">WikipediaにあるJSON</a>を一部抜き出した次のJSONをサンプルファイルとして使用する。</div>
<div>
<br /></div>
{<br />
"firstName": "John",<br />
"lastName": "Smith",<br />
"age": 25,<br />
"address": {<br />
"state": "NY"<br />
},<br />
"phoneNumbers": [<br />
{<br />
"type": "home",<br />
"number": "212 555-1234"<br />
}<br />
]<br />
}<br />
<br />
<h3>
# curlを実行</h3>
$ <i>curl -X POST http://localhost:3000 -H 'Content-Type: application/json' -d @test.json</i><br />
<br />
<h3>
# 受信側がRailsアプリの場合</h3>
<div>
パラメータとしてJSONは次のように解釈されている。<br />
<br /></div>
<div class="p1">
[1] pry(#<DashboardController>)> params</div>
<div class="p2">
<span class="s1">=> {</span>"firstName"<span class="s1">=></span>"John"<span class="s1">,</span></div>
<div class="p2">
<span class="s1"> </span>"lastName"<span class="s1">=></span>"Smith"<span class="s1">,</span></div>
<div class="p2">
<span class="s1"> </span>"age"<span class="s1">=></span><span class="s2">25</span><span class="s1">,</span></div>
<div class="p2">
<span class="s1"> </span>"address"<span class="s1">=>{</span>"state"<span class="s1">=></span>"NY"<span class="s1">},</span></div>
<div class="p2">
<span class="s1"> </span>"phoneNumbers"<span class="s1">=>[{</span>"type"<span class="s1">=></span>"home"<span class="s1">, </span>"number"<span class="s1">=></span>"212 555-1234"<span class="s1">}],</span></div>
<div class="p2">
<span class="s1"> </span>"controller"<span class="s1">=></span>"dashboard"<span class="s1">,</span></div>
<div class="p2">
<span class="s1"> </span>"action"<span class="s1">=></span>"index"<span class="s1">,</span></div>
<div class="p2">
<span class="s1">(余分なものは省略)</span></div>
<div class="p2">
<span class="s1"><br /></span></div>
<div class="p2">
<span class="s1">コード内では実際に次のようにJSONファイルの中身を取得できる。</span></div>
<div class="p2">
<span class="s1"><br /></span></div>
<div class="p1">
[2] pry(#<DashboardController>)> params[<span class="s4">:firstName</span>]</div>
<br />
<div class="p2">
<span class="s1">=> </span>"John"</div>
<div class="p2">
<br /></div>
<div class="p2">
これでまた忘れても大丈夫。</div>
mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-83287053573403425632014-01-19T20:41:00.000+09:002014-01-21T22:51:13.111+09:00Ancestry親子構造を格納するモデルを用意しようとしてたら、<a href="https://github.com/stefankroes/ancestry" target="_blank">Ancestry</a>というGemを見つけた<br />
<br />
<h2>
準備</h2>
適当にrailsプロジェクトを作成し、Gemfileに<span style="font-family: Arial; font-size: 18px;"><i>gem 'ancestry'</i>を記述し<i>bundle install</i></span><br />
<span style="font-family: Arial; font-size: 18px;"><i><br /></i></span>
<br />
<h2>
<span style="font-family: Arial; font-size: 18px;">scaffoldを作る</span></h2>
<span style="font-family: Arial; font-size: 18px;">$ rails g scaffold tenant name:string</span>
<br />
<span style="font-family: Arial; font-size: 18px;"><br /></span>
<br />
<h2>
<span style="font-family: Arial; font-size: 18px;">Tenantモデルを編集</span></h2>
<span style="font-family: Arial; font-size: 18px;"># <i>app/models/tenant.rb</i></span><br />
<span style="font-family: Arial; font-size: 18px;">class<i> </i></span><span style="font-family: Arial; font-size: 18px;">Tenant < ActiveRecord::Base</span><br />
<span style="font-family: Arial;"><span style="font-size: medium;"> <strike>attr_accessible :name</strike></span><strike style="font-size: 18px;">, :parent_id</strike></span><br />
<span style="font-family: Arial; font-size: medium;"> attr_accessible :name</span><span style="font-family: Arial; font-size: 18px;"> </span><span style="font-family: Arial; font-size: x-small;"># 2014/1/21 parent_idは不要でした</span><br />
<span style="font-family: Arial; font-size: 18px;"> has_ancestry</span><br />
<span style="font-family: Arial; font-size: 18px;">end</span>
<br />
<span style="font-family: Arial; font-size: 18px;"><br /></span>
<br />
<h2>
<span style="font-family: Arial; font-size: 18px;">フォーム編集用ビューを編集</span></h2>
<span style="font-family: Arial; font-size: 18px;"># <i>app/views/tenants/_form.html.erb</i></span><br />
<span style="font-family: Arial; font-size: 18px;"><div class="field"></span><br />
<span style="font-family: Arial; font-size: 18px;"> <%= f.label :parent %><br /></span><br />
<span style="font-family: Arial; font-size: 18px;"> <%= f.select :parent_id, options_from_collection_for_select(Tenant.all, :id, :name) %></span><br />
<span style="font-family: Arial; font-size: 18px;"></div></span>
<br />
<span style="font-family: Arial; font-size: 18px;"><br /></span>
<br />
<h2>
<span style="font-family: Arial; font-size: 18px;">Tenantモデルへancestryカラムを追加してマイグレーション</span></h2>
<span style="font-family: Arial; font-size: 18px;"># <i>rails g migration add_ancestry_to_tenants ancestry:string</i></span><br />
<span style="font-family: Arial; font-size: 18px;">class AddAncestryToTenants < ActiveRecord::Migration</span><br />
<span style="font-family: Arial; font-size: 18px;"> def change</span><br />
<span style="font-family: Arial; font-size: 18px;"> add_column :tenants, :ancestry, :string, after: :id</span><br />
<span style="font-family: Arial; font-size: 18px;"> add_index :tenants, :ancestry</span><br />
<span style="font-family: Arial; font-size: 18px;"> end</span><br />
<span style="font-family: Arial; font-size: 18px;">end</span>
<br />
<span style="font-family: Arial; font-size: 18px;"><br /></span>
<br />
<h2>
<span style="font-family: Arial; font-size: 18px;">indexビューを編集(抜粋)</span></h2>
<span style="font-family: Arial; font-size: 18px;"># <i>app/views/tenants/index.html.erb</i></span><br />
<span style="font-family: Arial; font-size: 18px;"> <td><%= tenant.parent ? </span><span style="color: #042eee; font-family: Arial; font-size: 18px;"><u>tenant.parent.name</u></span><span style="font-family: Arial; font-size: 18px;"> : nil %></td></span><br />
<span style="font-family: Arial; font-size: 18px;"> <td><%= tenant.ancestors.map &:name %></td></span><br />
<span style="font-family: Arial; font-size: 18px;"> <td><%= tenant.children.map &:name %></td></span><br />
<span style="font-family: Arial; font-size: 18px;"> <td><%= tenant.descendants.map &:name %></td></span><br />
<br />
<span style="font-family: Arial; font-size: medium;">この状態でモデルの作成を繰り返すと、indexの表示はたとえば次のようになる</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-8ifwyofpgKA/Utu4OAGMgRI/AAAAAAAAAYQ/71OVbtHskRo/s1600/tenants_index.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-8ifwyofpgKA/Utu4OAGMgRI/AAAAAAAAAYQ/71OVbtHskRo/s1600/tenants_index.png" height="163" width="400" /></a></div>
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;">この時、tenantsテーブルの中身は次のようになる</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-aOmwcsdRdfs/Utu4e-uj2xI/AAAAAAAAAYY/5d0QxV1o8AU/s1600/tenants_table.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-aOmwcsdRdfs/Utu4e-uj2xI/AAAAAAAAAYY/5d0QxV1o8AU/s1600/tenants_table.png" height="111" width="400" /></a></div>
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;"><br /></span>
<br />
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: medium;"><br /></span>
<span style="font-family: Arial; font-size: 18px;"><br /></span>mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-18934845352752341492014-01-01T01:11:00.000+09:002014-01-01T01:20:52.026+09:00Ansible導入(前編)2013年からの宿題なのか2014年のお年玉なのか不明だが、確定申告用の領収書類を持ち帰るのを忘れたので大晦日に手持ち無沙汰になっていたのでやってた。後編あるかは不明<br />
<br />
<h4>
Ansibleを使ってできること</h4>
<ul>
<li>サーバの構成管理。Chefと同じ目的で使うものという認識</li>
<li>設定として記述したパッケージ・ソフトウェアを簡単に導入できる</li>
<li>冪等性を保ちながらサーバの構築を繰り返し行うことができる(使い方によっては当然冪等性を損なうこともできるけど)</li>
</ul>
<br />
<h4>
インストール</h4>
<a href="http://www.ansibleworks.com/docs/intro_installation.html" target="_blank">AnsibleWorksのサイト</a>にあるので参照。たとえば次の方法がある<br />
<ul>
<li>GitHubレポジトリからcloneしてインストール</li>
<li>pipインストール</li>
<li>yum, apt</li>
</ul>
<br />
ローカルMacにpipが既に入っていたので、pipインストール<br />
<blockquote class="tr_bq">
$ pip install paramiko PyYAML jinja2 httplib2 </blockquote>
<blockquote class="tr_bq">
$ sudo pip install ansible</blockquote>
<br />
<h4>
<span style="font-family: Arial; font-size: medium;">Ansibleで管理対象となるホスト設定を作成</span></h4>
<blockquote class="tr_bq">
# /etc/ansible/hosts<br />
[experiments]<br />
dev ansible_ssh_port=<ssh port> ansible_ssh_host=<your hostname> ansible_ssh_user=<ssh user></blockquote>
<div class="p1">
</div>
<ul>
<li>experimentsはAnsible管理のホストをグルーピングしてる</li>
<li>devはサーバのニックネーム</li>
</ul>
<div>
<br /></div>
<h4>
<span style="font-family: Arial; font-size: medium;">Ansibleの動作設定を作成</span></h4>
以降のコマンド実行の際にControlPathが長過ぎて怒られるのを予防。デフォルトは control_path=%(directory)s/ansible-ssh-%%h-%%p-%%r らしいがこれだと長過ぎるみたい。<br />
<blockquote class="tr_bq">
# /etc/ansible/ansible.cfg<br />
[ssh_connection]<br />
control_path=/tmp/ansible-ssh-%%h-%%p-%%r</blockquote>
<br />
<h4>
テスト</h4>
<blockquote class="tr_bq">
$ /usr/local/share/python/ansible all -m ping<br />
dev | success >> {<br />
"changed": false,<br />
"ping": "pong"<br />
}</blockquote>
<br />
OKそう。さらにテストしてみる<br />
<blockquote class="tr_bq">
$ /usr/local/share/python/ansible all -a "/bin/echo hello"<br />
dev | success | rc=0 >><br />
hello</blockquote>
<br />
OKですな<br />
<br />
<h4>
幾つかコマンドサンプル</h4>
<blockquote class="tr_bq">
$ /usr/local/share/python/ansible dev -m copy -a "src=/etc/hosts dest=/tmp/hosts"<br />
#=> ローカルの/etc/hostsをdevの/tmp/へコピー</blockquote>
<blockquote class="tr_bq">
<br />
$ /usr/local/share/python/ansible dev -a "/sbin/reboot" —sudo<br />
#=> devを再起動</blockquote>
<blockquote class="tr_bq">
$ /usr/local/share/python/ansible -m yum -a 'name=mysql-server state=installed’ dev --sudo#=> devでmysql-serverをyumインストール</blockquote>
<div>
<br /></div>
しかし、いちいちコマンド打つの面倒くさい。そのため、実行する処理(task)をまとめて記述したもの(Playbook)を使う。<br />
<div class="p2">
<span style="font-family: Menlo; font-size: 18px;"><br /></span></div>
<blockquote class="tr_bq">
# /etc/ansible/builds_server.yml </blockquote>
<blockquote class="tr_bq">
- hosts: experiments<br />
remote_user: ec2-user<br />
sudo: no<br />
tasks:<br />
- name: test connection<br />
ping:<br />
- include: tasks/begins_pkg.yml</blockquote>
<br />
<blockquote class="tr_bq">
# /etc/ansible/tasks/begins_pkg.yml</blockquote>
<blockquote class="tr_bq">
- name: ensure all packages are at the latest version<br />
yum: name=* state=latest<br />
sudo: yes<br />
- name: ensure git is installed<br />
yum: name=git state=latest<br />
sudo: yes<br />
- name: ensure apache is running<br />
service: name=httpd state=started<br />
sudo: yes</blockquote>
<div class="p2">
</div>
<div class="p1">
</div>
<div class="p1">
</div>
<br />
上記を用意した上で、次のコマンドを実行する<br />
<blockquote class="tr_bq">
$ /usr/local/share/python/ansible-playbook /etc/ansible/builds_server.yml</blockquote>
<br />
<blockquote class="tr_bq">
PLAY [experiments] ************************************************************<br />
GATHERING FACTS ***************************************************************<br />
ok: [dev]<br />
TASK: [test connection] *******************************************************<br />
ok: [dev]<br />
TASK: [ensure all packages are at the latest version] *************************<br />
ok: [dev]<br />
TASK: [ensure git is installed] ***********************************************<br />
ok: [dev]<br />
TASK: [ensure apache is running] **********************************************<br />
ok: [dev]<br />
PLAY RECAP ********************************************************************<br />
<span class="s1">dev</span> : <span class="s1">ok=5</span> changed=0 unreachable=0 failed=0 </blockquote>
<div class="p2">
<br /></div>
<div class="p1">
</div>
<div class="p1">
こんな感じで実行結果が出力される。言うまでもないが、<br />
<br /></div>
<h3>
builds_server.ymlで次を記述</h3>
<div class="p1">
</div>
<ul>
<li>pingテスト</li>
<li>begins_pkg.ymlをインクルード</li>
</ul>
<br />
<h3>
begins_pkg.ymlで次を記述</h3>
<div class="p1">
</div>
<ul>
<li>yum -y update</li>
<li>最新のgitパッケージをyumインストール</li>
<li>apacheを起動する(パッケージが無ければインストール)</li>
</ul>
<br />
<div class="p1">
後編では次のものをする予定</div>
<div class="p1">
</div>
<ul>
<li>EC2イメージからのインスタンスローンチ(Elastic IP貼り付け等も併せて)</li>
<li>rbenvベースのrubyインストール</li>
</ul>
<br />
<div class="p1">
<br /></div>
mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-33271326815726861332013-12-30T21:39:00.000+09:002013-12-30T21:41:26.242+09:00fluentdで設定したformat(正規表現)をメモしておく<a href="http://fluentular.herokuapp.com/" target="_blank">Fluentular</a>を利用したり<a href="http://d.hatena.ne.jp/tagomoris/20120715/1342368392" target="_blank">@tagomoris氏のページ</a>を見ながら格闘したので記録<br />
<br />
<h2>
ざっくりとした設定</h2>
<div class="p1">
<blockquote class="tr_bq">
<source><br />
type config_expander<br />
<config><br />
type tail<br />
path /some/path/to/log<br />
pos_file /some/path/to/pos/file<br />
tag some.tag<br />
☆<br />
</config><br />
</source></blockquote>
</div>
<div class="p1">
<div class="p1">
以下だらだら挙げる各ログ名の下にある斜体の設定が☆の部分に入る<br />
<br /></div>
</div>
<h2>
Apache</h2>
<h4>
ssl_access_log</h4>
<i>format apache2</i><br />
<br />
<b>[ログ]</b><br />
<br />
<div class="p1">
xx.xx.xx.xx - - [30/Dec/2013:16:49:34 +0900] "GET / HTTP/1.1" 304 -</div>
<div class="p1">
</div>
<div class="p1">
xx.xx.xx.xx - - [30/Dec/2013:16:49:49 +0900] "GET /assets/jquery-i18n/messages_ja.properties?_=1388389789290 HTTP/1.1" 200 2589</div>
<div class="p1">
<br /></div>
<b>[fluentd出力]</b><br />
<br />
<div class="p1">
</div>
<div class="p1">
2013-12-30T07:49:34Z some.tag {"host":"xx.xx.xx.xx","user":null,"method":"GET","path":"/","code":304,"size":null,"referer":null,"agent":null}</div>
<div class="p1">
</div>
<div class="p1">
2013-12-30T07:49:49Z some.tag {"host":"xx.xx.xx.xx","user":null,"method":"GET","path":"/assets/jquery-i18n/messages_ja.properties?_=1388389789290","code":200,"size":2589,"referer":null,"agent":null}</div>
<div class="p1">
<br /></div>
<div class="p1">
<b>[メモ]</b></div>
<div class="p1">
標準で用意されてるapache2を使えたので一番楽できた</div>
<div class="p1">
<br /></div>
<div class="p1">
</div>
<div class="p1">
<h4>
ssl_error_log</h4>
</div>
<div class="p1">
</div>
<div class="p1">
<i>format /^\[(?<time>[^\]]*)\] \[(?<level>[^\]]*)\] \[client (?<host>[^\]]*)\] (?</i><i><message>.*)$/</i><br />
<div class="p1">
<i>time_format %a %b %d %H:%M:%S %Y</i></div>
<br />
<b>[ログ]</b><br />
<br />
<div class="p1">
[Mon Dec 30 17:53:50 2013] [error] [client xx.xx.xx.xx"] Premature end of script headers: hogehoge</div>
<div class="p1">
<br /></div>
</div>
<div class="p1">
<b>[fluentd出力]</b><br />
<div class="p1">
2013-12-30T08:53:50Z some.tag {"level":"error","host":"xx.xx.xx.xx"","message":"Premature end of script headers: hogehoge"}</div>
<br />
<b>[メモ]</b><br />
host部分を取る方法が泥臭い<br />
<br />
<h4>
ssl_request_log</h4>
</div>
<div class="p1">
<i>format /^\[(?<time>[^\]]*)\] (?<host>[^ ]*) (?<ssl_protocol>[^ ]*) (?<ssl_cipher>[^ ]*) "(?<method>\S+)(?: +(?<path>[^ ]*) +\</i><i>S*)?" (?<size>[^ ]*)$/</i></div>
<div class="p1">
<div class="p1">
<i>time_format %d/%b/%Y:%H:%M:%S %z</i></div>
<br />
<b>[ログ]</b><br />
<div class="p1">
[30/Dec/2013:17:53:44 +0900] xx.xx.xx.xx TLSv1.2 DHE-RSA-AES128-GCM-SHA256 "GET /assets/jquery-i18n/messages_ja.properties?_=1388393624678 HTTP/1.1" 2589</div>
<br />
<div class="p1">
[30/Dec/2013:17:53:50 +0900] xx.xx.xx.xx TLSv1.2 DHE-RSA-AES128-GCM-SHA256 "GET /hogehoge HTTP/1.1" 534</div>
<br />
<b>[fluentd出力]</b><br />
<div class="p1">
2013-12-30T08:53:44Z some.tag {"host":"xx.xx.xx.xx","ssl_protocol":"TLSv1.2","ssl_cipher":"DHE-RSA-AES128-GCM-SHA256","method":"GET","path":"/assets/jquery-i18n/messages_ja.properties?_=1388393624678","size":"2589"}</div>
<br />
<div class="p1">
2013-12-30T08:53:50Z some.tag {"host":"xx.xx.xx.xx","ssl_protocol":"TLSv1.2","ssl_cipher":"DHE-RSA-AES128-GCM-SHA256","method":"GET","path":"/hogehoge","size":"534"}</div>
</div>
<div class="p1">
<br />
<b>[メモ]</b><br />
こんなもんかな<br />
<br /></div>
<div class="p1">
</div>
<div class="p1">
<h4>
access_log(combined + %{X-Forwarded-For}i)</h4>
</div>
<div class="p1">
</div>
<div class="p1">
<i>format /^(?<host>[^ ]*) (?<remotelog>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<size>[^ ]*) "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwardedfor>[^\"]*)"$/</i></div>
<div class="p1">
<i>time_format %d/%b/%Y:%H:%M:%S %z</i></div>
<div class="p1">
<br /></div>
<b>[ログ]</b><br />
<div class="p1">
</div>
<div class="p1">
xx.xx.xx.xx - - [30/Dec/2013:16:49:32 +0900] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36" "-"</div>
<br />
<div class="p1">
xx.xx.xx.xx - - [30/Dec/2013:17:18:19 +0900] "GET /admin/sign_in HTTP/1.1" 200 2038 "http://www.baidu.com" "Mozilla/5.0 (X11; U; Linux i686) Web-Security/1.0(it's for a research study,if you have questions,plz contact me liangw@cs.wisc.edu)" "-"</div>
<div class="p1">
<br /></div>
<b>[fluentd出力]</b><br />
<div class="p1">
</div>
<div class="p1">
2013-12-30T07:49:32Z some.tag {"host":"xx.xx.xx.xx","remotelog":"-","user":"-","method":"GET","path":"/","status":"304","size":"-","referer":"-","agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36","forwardedfor":"-"}</div>
<br />
<div class="p1">
2013-12-30T08:18:19Z some.tag {"host":"xx.xx.xx.xx","remotelog":"-","user":"-","method":"GET","path":"/admin/sign_in","status":"200","size":"2038","referer":"http://www.baidu.com","agent":"Mozilla/5.0 (X11; U; Linux i686) Web-Security/1.0(it's for a research study,if you have questions,plz contact me liangw@cs.wisc.edu)","forwardedfor":"-"}</div>
<br />
<b>[メモ]</b><br />
baiduアク禁にしとくか<br />
<br />
<div class="p1">
<h4>
error_log</h4>
</div>
<div class="p1">
</div>
<div class="p1">
<i>format /^(?<message>.+)$/</i></div>
<div class="p1">
<br />
<b>[ログ]</b><br />
<br />
<div class="p1">
[ pid=25565 thr=140417271351328 file=ext/apache2/Hooks.cpp:841 time=2013-12-30 17:53:50.689 ]: The backend application (process 13501) did not send a valid HTTP response; instead, it sent nothing at all. It is possible that it has crashed; please check whether there are crashing bugs in this application.</div>
<br />
<b>[fluentd出力]</b><br />
<br />
<div class="p1">
2013-12-30T08:53:50Z some.tag {"message":"[ pid=25565 thr=140417271351328 file=ext/apache2/Hooks.cpp:841 time=2013-12-30 17:53:50.689 ]: The backend application (process 13501) did not send a valid HTTP response; instead, it sent nothing at all. It is possible that it has crashed; please check whether there are crashing bugs in this application."}</div>
<div class="p1">
<br /></div>
<div class="p1">
<b>[メモ]</b></div>
<div class="p1">
スタックトレースがあるので空行を削る以外の加工を諦めた</div>
<div class="p1">
<br /></div>
</div>
<h2>
System</h2>
<div class="p1">
</div>
<div class="p1">
<h4>
/var/log/messages</h4>
</div>
<div class="p1">
</div>
<div class="p1">
<i>format syslog</i></div>
<div class="p1">
<br />
<b>[ログ]</b><br />
<br />
<div class="p1">
Dec 30 17:15:01 xx.xx.xx.xx yum[14369]: Updated: 2:tar-1.26-27.21.amzn1.x86_64</div>
<br />
<b>[fluentd出力]</b><br />
<br />
<div class="p1">
2013-12-30T08:15:01Z some.tag {"host":"xx.xx.xx.xx","ident":"yum","pid":"14369","message":"Updated: 2:tar-1.26-27.21.amzn1.x86_64"}</div>
<br />
<div class="p1">
<b>[メモ]</b></div>
<div class="p1">
標準でsyslogが用意されていたので助かった</div>
<div class="p1">
<br /></div>
</div>
<div class="p1">
</div>
<div class="p1">
<h4>
/var/log/secure</h4>
</div>
<div class="p1">
</div>
<div class="p1">
<i>format /^(?<time>[^ ]* [^ ]* [^ ]*) (?<host>[^ ]*) (?<message>.*)$/</i></div>
<div class="p1">
</div>
<div class="p1">
<i>time_format %b %d %H:%M:%S</i></div>
<div class="p1">
<br />
<b>[ログ]</b><br />
<div class="p1">
Dec 30 17:15:53 xx.xx.xx.xx runuser: pam_unix(runuser:session): session opened for user td-agent by ec2-user(uid=0)</div>
<br />
<div class="p1">
Dec 30 17:15:54 xx.xx.xx.xx runuser: pam_unix(runuser:session): session closed for user td-agent</div>
<br />
<b>[fluentd出力]</b><br />
<div class="p1">
2013-12-30T08:15:53Z some.tag {"host":"xx.xx.xx.xx","message":"runuser: pam_unix(runuser:session): session opened for user td-agent by ec2-user(uid=0)"}</div>
<br />
<div class="p1">
2013-12-30T08:15:54Z some.tag {"host":"xx.xx.xx.xx","message":"runuser: pam_unix(runuser:session): session closed for user td-agent"}</div>
<br />
<div class="p1">
<b>[メモ]</b></div>
<div class="p1">
スペースで分けられたtimeに初めて対処。<a href="http://documents.mazgi.com/fluentd/doc/plugin.html" target="_blank">ここ</a>のsyslogの項に学んだ</div>
<div class="p1">
<br /></div>
</div>
<div class="p1">
</div>
<div class="p1">
<h4>
/var/log/cron</h4>
</div>
<div class="p1">
</div>
<div class="p1">
<i>format /^(?<time>[^\]]*) (?<host>[^ ]*) (?<process>[^\[]*)\[(?<process_id>[0-9]+)\]: (?<message>.*)$/</i></div>
<div class="p1">
<div class="p1">
<i>time_format %b %d %H:%M:%S</i></div>
<div class="p1">
<br /></div>
<b>[ログ]</b><br />
<div class="p1">
Dec 30 17:05:01 xx.xx.xx.xx CROND[14223]: (root) CMD (/usr/sbin/logrotate /etc/logrotate.d/ooo)</div>
<br />
<div class="p1">
Dec 30 17:10:01 xx.xx.xx.xx CROND[14297]: (root) CMD (/usr/lib64/sa/sa1 1 1)</div>
<br />
<b>[fluentd出力]</b><br />
<div class="p1">
2013-12-30T08:05:01Z some.tag {"host":"xx.xx.xx.xx","process":"CROND","process_id":"14223","message":"(root) CMD (/usr/sbin/logrotate /etc/logrotate.d/ooo)"}</div>
<br />
<div class="p1">
2013-12-30T08:10:01Z some.tag {"host":"xx.xx.xx.xx","process":"CROND","process_id":"14297","message":"(root) CMD (/usr/lib64/sa/sa1 1 1)"}</div>
<div class="p1">
<br /></div>
<div class="p1">
<b>[メモ]</b></div>
<div class="p1">
サンプル不足</div>
<div class="p1">
<br /></div>
</div>
<div class="p1">
</div>
<div class="p1">
<h4>
/var/log/yum.log</h4>
</div>
<div class="p1">
</div>
<div class="p1">
<i>format /^(?<time>[^\]]*) (?<action>[^:]*): (?<package>[^ ]*)$/</i></div>
<div class="p1">
</div>
<div class="p1">
<i>time_format %b %d %H:%M:%S</i></div>
<div class="p1">
<br />
<b>[ログ]</b><br />
<br />
<div class="p1">
Dec 30 17:15:01 Updated: 2:tar-1.26-27.21.amzn1.x86_64</div>
<br />
<b>[fluentd出力]</b><br />
<br />
<div class="p1">
2013-12-30T08:15:01Z some.tag {"action":"Updated","package":"2:tar-1.26-27.21.amzn1.x86_64"}</div>
<div class="p1">
<br /></div>
<div class="p1">
<b>[メモ]</b></div>
<div class="p1">
とりあえず仕掛けた。サンプル不足</div>
<div class="p1">
<br /></div>
</div>
<div class="p1">
</div>
<div class="p1">
<h4>
/var/log/maillog</h4>
</div>
<div class="p1">
</div>
<div class="p1">
<i>format /^(?<time>[^\]]*) (?<host>[^ ]*) (?<process>[^\[]*)\[(?<process_id>[0-9]+)\]: (?<message>.*)$/</i></div>
<div class="p1">
</div>
<div class="p1">
<i>time_format %b %d %H:%M:%S</i></div>
<br />
<b>[ログ]</b><br />
<br />
<div class="p1">
Dec 30 16:58:42 xx.xx.xx.xx sendmail[13943]: NOQUEUE: SYSERR(ec2-user): can not chdir(/var/spool/mqueue/): Permission denied</div>
<br />
<b>[fluentd出力]</b><br />
<br />
<div class="p1">
2013-12-30T07:58:42Z some.tag {"host":"xx.xx.xx.xx","process":"sendmail","process_id":"13943","message":"NOQUEUE: SYSERR(ec2-user): can not chdir(/var/spool/mqueue/): Permission denied"}</div>
<div class="p1">
<br /></div>
<div class="p1">
<b>[メモ]</b></div>
<div class="p1">
これでいいのか。サンプル不足</div>
<div class="p1">
<br /></div>
<h4>
App(my app)</h4>
<h4>
myapp.log (tab separated)</h4>
<div class="p1">
<i>format tsv</i></div>
<div class="p1">
<i>keys </i>user_id<i>,</i> ref_user_id<i>,</i> request_url<i>,</i> params<i>,executed_at</i></div>
<div class="p1">
</div>
<div class="p1">
<i>time_key </i><i>executed_at</i></div>
<div class="p1">
<br />
<b>[ログ]</b><br />
<br />
<div class="p1">
28 22 https://xx.xx.xx.xx/18 {"controller"=>"users", "action"=>"detail", "id"=>"18"} 2013-12-30 08:26:57 UTC</div>
<div class="p1">
<br /></div>
<b>[fluentd出力]</b><br />
<br />
<div class="p1">
2013-12-30T08:26:57Z some.tag {"user_id":"28","ref_user_id":"22","request_url":"https://xx.xx.xx.xx/users/18","params":"{\"controller\"=>\"users\", \"action\"=>\"detail\", \"id\"=>\"18\"}"}</div>
</div>
<br />
<div class="p1">
<b>[メモ]</b></div>
<div class="p1">
初めてのtsv。問題なくtime_keyも解釈できた様子</div>
mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-59988230420704133332013-12-15T21:43:00.000+09:002013-12-15T21:45:31.570+09:00メタプログラミング本からプロコン本へメタプログラミングRubyを終えたので、この本を勉強会で進めている。<br />
<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-fe.amazon-adsystem.com/e/cm?t=fr-22&o=9&p=8&l=as1&asins=4839941068&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 240px; width: 120px;"></iframe>
<br />
<br />
以前は第一版をRubyやPythonでやっていたのでC++で書いてる。以下は、今日やったところ。<br />
<br />
<h4>
2-1</h4>
<b><br /></b>
<b>DFS</b><br />
<br />
<ul>
<li>部分和問題</li>
<li>水たまりカウント</li>
</ul>
<br />
<b>BFS</b><br />
<br />
<ul>
<li>迷路問題</li>
</ul>
<br />
<br />
相変わらず面白いので今後も進める。<br />
<br />mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-81305224609082277902013-09-29T23:37:00.001+09:002013-09-29T23:37:48.837+09:00AWSについて少し話した話某所にてAWSの使い方とか組み合わせ方を少し話してきた。<br />
<br />
資料は<a href="http://www.slideshare.net/mryoshio/aws-26661862">ここ</a>にあります。<br />
やったことをかいつまんで記述する。<br />
<br />
<h4>
スキルについて話</h4>
よくあるアイスブレイク。参加者がこれまでどのようなことをやってきたか、今回どのようなことを期待してきたかを確認<br />
<br />
<h4>
ハンズオンその1</h4>
<h2>
テーマ: 開発するアプリケーションの基盤としてAWSを使うのに必要なスキルを身につける</h2>
EC2, RDS, Route53, VPCあたりをハンズオンで進める。ドメインを持っている人が一人だけだったのでRoute53は説明だけ。あとはいわゆるWEB-DBアプリケーションを動かす基盤をVPC上で構築するところまでをゴールに進めた。<br />
<br />
<h4>
ハンズオンその2</h4>
<h2>
テーマ: ログとかデータがAWSサービス間でどのように流れるかを理解する</h2>
S3, DynamoDB, Elastic MapReduceを使い、AWSサービス間でデータをどのように移行するかを話した。ただ、流石にいきなりハンズオンは厳しかったので概念を説明するにとどまった。Elastic MapReduceのサンプルHiveスクリプトやジョブ実行ファイルは用意した方がより分かりやすかったなと反省。<a href="https://gist.github.com/mryoshio/6744061">DynamoDBにサンプルデータを入れるコード</a>を用意するのが時間的に精一杯だった。<br />
<br />
急ごしらえだったが4時間は軽く持ったのでよしとするか。<br />
<br />mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-23261173592825767212013-09-28T17:22:00.001+09:002013-09-28T17:22:43.991+09:00fluentdのテスト導入<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-fe.amazon-adsystem.com/e/cm?t=fr-22&o=9&p=8&l=as1&asins=4048687158&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 240px; width: 120px;"></iframe>
<br />
メタプログラミングRuby勉強会で使ってた本(↑)が終わったので、<br />
fluentdを触って遊ぼうみたいな話になった。<br />
今回は手元でS3プラグインの動作確認まで。<br />
<br />
<h4>
fluentdのインストール</h4>
<a href="http://docs.fluentd.org/articles/install-by-gem" target="_blank">公式ページ</a>にしたがい入れた<br />
<br />
<h4>
fluent-plugin-s3のインストール</h4>
<a href="http://docs.fluentd.org/ja/articles/out_s3" target="_blank">このページ</a>を見たりして入れた<br />
<br />
<h4>
S3プラグインを使う為の今の設定</h4>
その後、何度か設定を試したりして次の内容になった。<br />
<script src="https://gist.github.com/mryoshio/6739751.js"></script>
<br />
<h4>
はまった点</h4>
fluentdと関係無いのだが、Macのmaxfilesオプションに引っかかってうまく起動しなかった。http://docs.fluentd.org/articles/before-install#increase-max--of-file-descriptorsをMacに読み替えて設定したらOK。設定の途中で間違えて数を減らしてしまいMacを強制再起動する羽目になった<br />
<br />mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-6140632704307300982013-09-23T00:33:00.001+09:002013-09-23T00:33:36.978+09:00ビット演算の復習月1ページでやってるプログラミングを楽しむ会で、ビット演算をもくもくしてた。というのもこの会では<a href="http://www.slideshare.net/mryoshio/ss-20069424" target="_blank">ここ</a>に在る通り普段やらないことを推奨されている。普段はRailsとかAWSなのでこういう時にちょうど良いネタ。<br />
<br />
元ネタはこの本(↓)<br />
<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-fe.amazon-adsystem.com/e/cm?t=fr-22&o=9&p=8&l=as1&asins=4839942390&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 240px; width: 120px;"></iframe><br />
<br />
2進→10進変換はBoostを使ってややさぼった。
<br />
<br />
<script src="https://gist.github.com/mryoshio/6660908.js"></script>
<br />
こんな感じで。引き続き、ビット演算サンプル。<br />
<br />
<br />
<script src="https://gist.github.com/mryoshio/6657746.js"></script>
見たらわかると思うけど一応書く。<br />
<ul>
<li>get_bit: 引数numの第iビットが0か1かを取得</li>
<li>set_bit: 引数numの第iビットに1をセット</li>
<li>clear_bit: 引数numの第iビットに0をセット</li>
</ul>
<br />
<br />
続いて、ある問題に対し考えた回答。<br />
勝手に書いたらダメだと思うので問題は省略。<br />
答え合わせもしてないから間違ってるかもしれないけどコードから問題は想像可能な筈。<br />
<br />
<script src="https://gist.github.com/mryoshio/6658001.js"></script>
<br />
非常に貴重な時間なのでこういう集まりは今後も大事にしたい。<br />
<br />
<br />
<br />mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-17654879505833308582013-07-28T22:14:00.000+09:002013-07-28T22:15:42.264+09:00Team Geek読んだ<iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=fr-22&o=9&p=8&l=as1&asins=4873116309&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
<br />
<br />
自戒の意味を込めて印象に残ったものを自己解釈<br />
<br />
<h4>
HRT大事に</h4>
謙虚(Humility)、尊敬(Respect)、信頼(Trust)を持って他人と対応することで人間関係の衝突を防ぐ。この内いずれかが欠けてもまずいことになるし、これまでの経験上実際に問題になっていた気がする。<br />
<br />
<h4>
学習のための時間</h4>
チーム内であることに長けることは確かに重要であるが、誰かに教えるのと同様に新たなことを学ぶ。学習をやめると時代おくれになる。コンフォートゾーンの外側に自分を意図的に配置する機会が必要である。<br />
<br />
<h4>
チームの文化</h4>
チームの文化は初期からのメンバが作る。文化は自己選択的に機能する。見やすいコードを書くチームは見やすいコードを書く人を引き付ける。他人に敬意を払わない文化を持つチームには他人に敬意を払わない人間が増える。<br />
<br />
<h4>
有害な人への対応</h4>
有害な人がいると、チームの効率が落ちたり職場の雰囲気が悪くなったりする。しかし個人を良いか悪いかで考えるのではなく、あくまで「振る舞いが良くない人」と考える。そいう人がいる時点でチームの文化が良くないものになっている可能性があるが、振る舞いを批判する。<br />
<br />
<br />
エンジニアでなくても読む価値がある本だと思った。<br />
これからも時々読み返そう。mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-15793225668987048622013-07-17T01:31:00.000+09:002013-07-17T01:31:37.195+09:00[練習] ダイクストラアルゴリズム<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?t=mryoshio-22&o=9&p=8&l=as1&asins=4797363282&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 240px; width: 120px;"></iframe><br />
<br />
<br />
バタバタしてたけど地味に進めてようやく終わり<br />
<br />
<br />
<script src="https://gist.github.com/mryoshio/6010280.js"></script>
<br/>
<br/>
シンプルなものが最も美しいmryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-18458822612882448722013-07-08T23:15:00.001+09:002013-07-08T23:15:43.678+09:00ActiveRecordでステートマシーンここ数ヶ月心に留めつつも触れてなかったstate_machineでいじったので記録<br />
<br />
<h4>
何ができるの?</h4>
クラスの状態に応じた振る舞いを簡単に記述できる<br />
<br />
<h4>
Railsで使いたいんだけど?</h4>
ActiveRecordと簡単に統合できる<br />
<br />
<h4>
サンプル</h4>
<script src="https://gist.github.com/mryoshio/5948392.js"></script>
<br/>
<h4>
参考</h4>
GitHub: <a href="https://github.com/pluginaweek/state_machine">https://github.com/pluginaweek/state_machine</a><br />
<br />
<br />
<br />
<br />mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-30999423586880276262013-07-05T00:57:00.000+09:002013-07-05T00:57:14.988+09:00 10パズル<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?t=mryoshio-22&o=9&p=8&l=as1&asins=4797363282&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 240px; width: 120px;"></iframe><br />
<br />
<br />
この本もあと少し。<br />
入力された4桁の数値を元にRPN式を生成し、それを解いて10になるか判定。<br />
再帰だけでなくスタックの練習でもある。<br />
<br />
<script src="https://gist.github.com/mryoshio/5928771.js"></script>mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-37347486135712969732013-06-25T00:59:00.002+09:002013-06-25T00:59:47.110+09:00メタプログラミングRuby勉強会#3<h4>
スコープ</h4>
<div class="p1">
Rubyのスコープは、<i>class / module / def</i>の3つのスコープゲートで区切られている</div>
<div class="p2">
スコープゲートを超えるとスコープが切り替わる。それを超えるにはグローバル変数を使う(当然あまり使わない)、またはスコープのフラット化を使う。</div>
<div class="p2">
<br /></div>
<h4>
スコープのフラット化の例</h4>
<div class="p1">
普通に書くと次の例はクラス内でaという変数は見えない → エラーになる。</div>
<div class="p1">
<br /><script src="https://gist.github.com/mryoshio/5850860.js"></script></div>
<div class="p1">
ここで、classを超えるにはClass.newを使う</div>
<div class="p1">
<br /><script src="https://gist.github.com/mryoshio/5850914.js"></script></div>
<div class="p1">
しかし、まだdefの壁(ゲート)を超えられない.</div>
<div class="p1">
これを超えるにはdefine_methodを使う。</div>
<div class="p1">
<br /><script src="https://gist.github.com/mryoshio/5850928.js"></script></div>
<h4>
instance_eval</h4>
<div class="p1">
instance_evalに渡したブロックはselfオブジェクトと同じコンテキストで評価される。</div>
<div class="p1">
要するにインスタンス変数にアクセスしたり、変更できる。このブロックをコンテキスト探査機を呼ぶ。</div>
<div class="p1">
<br /></div>
<h4>
Procとlambda</h4>
<div class="p1">
returnの動作と引数の扱いの2つの観点からlambdaの方が使いやすそう。</div>
<div class="p1">
Proc内のreturnは、Procが定義されたスコープから戻るのでバグとなりやすい。</div>
<div class="p1">
<br /></div>
<div class="p1">
<br /></div>
<div class="p1">
ブロック、スコープのフラット化、lambdaを使って簡単にDSL書けそう。</div>
<div class="p1">
<br /></div>mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-43738889544702713252013-06-23T19:16:00.000+09:002013-06-24T12:48:32.624+09:00RailsのページアクションでContent-Type設定<br />
Content-Typeがtext/plainになってしまうので調べた<br />
<br />
<h4>
基本の設定</h4>
開発環境でキャッシュを有効にする為に次の設定を行う<br />
<blockquote class="tr_bq">
# config/environments/development.rb<br />
config.action_controller.perform_caching = true</blockquote>
<br />
<h4>
ページキャッシュ</h4>
生成されたページをキャッシュして返す仕組み。<br />
使うにはコントローラに追加の記述を行う。たとえば、caches_page :indexとするとindexアクションのレスポンス(ページ)がキャッシュされる。<br />
<br />
ただし、JSONを返すアクションをキャッシュする場合、このままではキャッシュのContent-Typeがtext/htmlになる。それでも大丈夫な場面は多いと思うが、次の設定を行うと
キャッシュのContent-Typeをapplication/jsonにできる。<br />
<blockquote class="tr_bq">
# config/environments/development.rb<br />
config.action_controller.page_cache_extension = '.json'</blockquote>
mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-29643390336524779522013-06-20T01:46:00.001+09:002013-06-20T01:46:31.905+09:00バックトラック法(Eight Queens Puzzle)徐々に終盤に近づいてきている。<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?t=mryoshio-22&o=9&p=8&l=as1&asins=4797363282&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 240px; width: 120px;"></iframe><br />
<br />
<script src="https://gist.github.com/mryoshio/5815722.js"></script>
ごく単純なアルゴリズム。<br />
右側に駒が置かれていることが存在しないという前提で<br />
<br />
<ul>
<li>左側をチェック</li>
<li>左上をチェック</li>
<li>左下をチェック</li>
</ul>
分かりやすい。mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-77842892527737258662013-06-17T22:48:00.000+09:002013-06-17T22:48:50.551+09:00[練習] 文字列探索アルゴリズム昨日やった文字列内のパターン検索。grepを自分で実装する時とかに使う。<br />
<br />
<br />
<h4>
1. シンプルなアルゴリズム</h4>
1文字づつずらして見ていく方法。最も単純。<br />
<br />
<script src="https://gist.github.com/mryoshio/5796902.js"></script>
<br/>
<h4>
2. KMP法</h4>
1文字ずつずらすのではなくて、次に比較させる場所を記憶しておく。<br />
アルゴリズムが複雑な分、実は1のシンプルなアルゴリズムの方が早い時もある。<br />
<br />
<script src="https://gist.github.com/mryoshio/5796977.js"></script>
<br/>
<h4>
3. BM法</h4>
現実的な早い方法。パターンを後ろから前に対象文字列と照合していく。<br />
<br />
<script src="https://gist.github.com/mryoshio/5796986.js"></script>
<br/>
最近なかなか時間が取れないのが悩みどころ。mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-42304128709247746672013-05-28T01:53:00.000+09:002013-05-28T01:55:02.483+09:00[練習] C++でハッシュマップ実装ふと思い立って復習。ハッシュマップ。この本(↓)の7章。<br />
<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?t=mryoshio-22&o=9&p=8&l=as1&asins=4797363282&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="height: 240px; width: 120px;"></iframe><br />
<br />
最近はRailsアプリとjQuery使ってゴニョゴニョいじる系の仕事が多いので<br />
却って直接関係無いと思えることに手をだしたくなるのが人情。<br />
<br />
英語と日本語の対応を検索・削除・表示するC++プログラム<br />
<br />
<br />
<script src="https://gist.github.com/mryoshio/5657982.js"></script>
<br/>アーサーとリドじゃないけどPractice, Practice, Practicemryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-46329085878141890002013-05-25T23:41:00.000+09:002013-05-25T23:41:14.352+09:00メタプログラミングRuby勉強会#2<br />
<br />
今日やったことのメモ<br />
<br />
<br />
<h4>
動的ディスパッチ</h4>
sendを使い、実行時に呼び出しメソッドを決められる。<br />
<br />
<h4>
メソッドの動的定義</h4>
define_methodを使いメソッドを定義できる<br />
<br />
<h4>
ゴーストメソッド</h4>
method_missingを使い、レシーバに存在しないメソッドを在るかの如く処理できる<br />
<br />
<h4>
動的プロキシ</h4>
method_missingを利用して実際の処理を他のメソッドへ委譲する<br />
<br />
<h4>
例</h4>
<br />
<script src="https://gist.github.com/mryoshio/5649292.js"></script>mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0tag:blogger.com,1999:blog-4889111258782200284.post-85457500553134283672013-05-11T18:22:00.001+09:002013-05-24T17:25:43.374+09:00GitHubに置いたGAE/PythonアプリのテストをTravis CIで行う<br />
<br />
幾つかあるCIサービスのうち、<a href="https://travis-ci.org/" target="_blank">Travis CI</a>を使ってみようと思い試してみた。<br />
<br />
<h4>
前提</h4>
<ul>
<li>手元にGoogle App Engineを利用したPythonプロジェクトがあること</li>
<li>そのプロジェクトをGitHubのPublicプロジェクトとして管理していること</li>
<li>Pythonのunittestを行える環境がローカルに存在すること</li>
<li>Travis CIのアカウントを持っていること</li>
</ul>
<br />
<h4>
GAE SDKを利用したスクリプトの作成</h4>
<a href="https://developers.google.com/appengine/docs/python/tools/localunittesting?hl=ja#Setting_Up_a_Testing_Framework" target="_blank">これ</a>をそのまま適当な名前でプロジェクト直下に保存すればよい。<br />
ここではtest_gae.pyとする。<br />
<br />
<h4>
テストの作成</h4>
tests/を作成し、その直下に__init__.py(空でよい)とテストスクリプトを書く。次のものは、nameとownerプロパティを持つGroupモデルのテスト例。<br />
<br />
<script src="https://gist.github.com/mryoshio/5559311.js"></script>
<br />
<br />
<h4>
テストの実行</h4>
<blockquote class="tr_bq">
python test_gae.py <Google App Engine SDKのパス> <テストディレクトリ><br />
<span style="font-size: x-small;">(e.g. python test_gae.py /usr/local/google_appengine tests/)</span></blockquote>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-X_Uq68WNa-Y/UY4EiyeV_5I/AAAAAAAAACE/u5Eq0gXJ2Uk/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-05-11+17.41.56.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="75" src="http://3.bp.blogspot.com/-X_Uq68WNa-Y/UY4EiyeV_5I/AAAAAAAAACE/u5Eq0gXJ2Uk/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-05-11+17.41.56.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">実行結果</td></tr>
</tbody></table>
<br />
これでテストは通った。<br />
<br />
<h4>
CI対象プロジェクトの指定</h4>
ログイン → Accountsで表示されるプロジェクトから、<br />
Travis CIの対象にするプロジェクトのスイッチをONにする。<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-nMndf9EVrhs/UY4F22KrwbI/AAAAAAAAACQ/bcXgnbS0FYw/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-05-11+17.46.53.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="186" src="http://4.bp.blogspot.com/-nMndf9EVrhs/UY4F22KrwbI/AAAAAAAAACQ/bcXgnbS0FYw/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-05-11+17.46.53.png" title="CIプロジェクトの指定" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">CIプロジェクトの設定</td></tr>
</tbody></table>
<br />
<h4>
Travis CI用設定ファイルの作成</h4>
Google App Engine SDKをダウンロードしてパスに通す荒業を実行する。<br />
というわけで.travis.ymlを次のように書いてプロジェクト直下に保存する。<br />
<br />
<script src="https://gist.github.com/mryoshio/5559373.js"></script>
<br />
install → 必要なパッケージの指定(requirements.txt: pip freezeの内容)<br />
before_script → Google App Engine SDKのダウンロードおよび展開<br />
script → テストの実行<br />
<br />
これで、次回以降のGitHubへのプッシュ時にTravis CIでscriptのテスト内容が実行される。<br />
<br />
<h3>
[追記]</h3>
travis-lintというgemが存在する。<br />
gem installしてtravis-lintコマンドをプロジェクト直下で実行すると、<br />
.travis.ymlが正しいか否かを確認できる。<br />
<br />
<div>
<br /></div>
<br />mryoshiohttp://www.blogger.com/profile/14763171284855485118noreply@blogger.com0