tag:blogger.com,1999:blog-86538139497804960142024-03-15T05:01:36.948+09:00あろえの備忘録aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.comBlogger152125tag:blogger.com,1999:blog-8653813949780496014.post-53319986362687627022023-12-14T00:00:00.008+09:002023-12-14T00:00:00.126+09:00Terraform コードのテスト方法<h2 style="text-align: left;">詳解 Terraform 第3版</h2>
<p>2023年11月に「詳解 Terraform 第3版」の日本語版がオライリーから発売された。</p>
<p><a href="https://www.oreilly.co.jp/books/9784814400522/">https://www.oreilly.co.jp/books/9784814400522/</a></p>
<p>詳解 Terraform の目次</p>
<ul>
<li>1章 なぜ Terraform を使うのか</li>
<li>2章 Terraform をはじめよう</li>
<li>3章 Terraform ステートを管理する</li>
<li>4章 モジュールで再利用可能なインフラを作る</li>
<li>5章 Terraform を使うためのヒントとコツ:ループ、条件文機、デプロイ、その他つまずきポイント</li>
<li>6章 シークレットを管理する</li>
<li>7章 複数のプロバイダを使う</li>
<li>8章 本番レベルの Terraform コード</li>
<li>9章 Terraform のコードをテストする</li>
<li>10章 チームで Terraform を使う</li>
</ul>
<p>「9章 Terraform のコードをテストする」が気になったので購入し、気になるところをメモした。</p>
<h2>Terraform コードのテスト手法</h2>
<p>本書の中ではテスト手法を以下のように区分している。</p>
<ol>
<li>静的解析</li>
<li>プランテスト</li>
<li>サーバテスト</li>
<li>ユニットテスト</li>
<li>結合テスト</li>
<li>E2Eテスト</li>
</ol>
<p>リストの下に行くにつれて実装・実行コストが増えるが、Terraform コードの動作確認における確からしさが上がっていく。</p>
<p>実際には特定の区分のみ用いるのではなく、静的解析 + プランテスト + ユニットテスト + E2Eテストなどのように組み合わせて使う。</p><h3 style="text-align: left;">結論</h3><div>やはり銀の弾丸はない。自分たちの身の丈、運用、サービスレベルにあったテスト手法を選択することになる。</div>
<p>テスト手法の組み合わせ、各テスト手法にかけるコスト比重、導入順序を検討し、サービスの成長に合わせて変えていくことになる。</p><p>静的解析はコストが非常に少ないのでとりあえず導入してみるでも良さそう</p>
<p>以下はそれぞれの手法の概要です。</p>
<h2>静的解析</h2>
<p>代表的なツール</p>
<ul>
<li>terraform validate</li>
<li>tfsec</li>
<li>tflint</li>
<li>Terrascan</li>
</ul>
<p>静的解析ツールの強み</p>
<ul>
<li>動作が高速</li>
<li>使用が簡単</li>
<li>安定している</li>
<li>実際のプロバイダに認証の必要がない</li>
<li>実際のリソースをデプロイ・削除しない</li>
</ul>
<p>静的解析ツールの弱み</p>
<ul>
<li>非常に限られた種類のエラーのみ発見できる</li>
<li>機能性をチェックしないので、すべてのチェックが成功してもインフラが動かない可能性がある</li>
</ul>
<h2>プランテスト</h2>
<p>terraform plan を実行し、プランの出力を解析する</p>
<p>静的解析より踏み込んでいるが、コードを完全に実行するわけではない</p>
<p>プランテストツール</p>
<ul>
<li>Terratest</li>
<li>Open Policy Agent</li>
<li>Hashi Corp Sentinel</li>
<li>Checkov</li>
<li>terraform-compliance</li>
<li>terraform test で plan を使用する
<ul>
<li>v1.6で追加されたコマンド。本書はv1.3時点に書かれているそうなので、記載されていない</li>
</ul>
</li>
</ul>
<h3>Terratestを用いた例</h3>
<p>planの出力結果</p>
<pre><code>Terraform will perform the following actions:
# module.alb.aws_lb.example will be created
+ resource "aws_lb" "example" {
+ arn = (known after apply)
+ load_balancer_type = "application"
+ name = "test-4Ti6CP"
(...)
}
(...)
Plan: 5 to add, 0 to change, 0 to destroy.
</code></pre>
<p>Terratestでのplanを使ったテスト</p>
<pre><code class="prettyprint">func TestAlbExamplePlan(t *testing.T) {
t.Parallel()
albName := fmt.Sprintf("test-%s", random.UniqueId())
opts := &terraform.Options{
// この相対パスは、自分の alb モジュールの example ディレクトリを
// 指すよう変更すること
TerraformDir: "../examples/alb",
Vars: map[string]interface{}{
"alb_name": albName,
},
}
planString := terraform.InitAndPlan(t, opts)
// plan の出力の add/change/destroy の数をチェックする方法の例
resourceCounts := terraform.GetResourceCount(t, planString)
require.Equal(t, 5, resourceCounts.Add)
require.Equal(t, 0, resourceCounts.Change)
require.Equal(t, 0, resourceCounts.Destroy)
}
</code></pre>
<h3>Policy as Codeツール</h3>
<ul>
<li>Open Policy Agent(OPA)が人気</li>
<li>Rego という宣言型言語でポリシーをコートして記録できる</li>
<li>Terraformで管理しているリソースに <code>ManagedBy</code> というタグがあるかチェックする</li>
</ul>
<pre><code>// enforce_tagging.rego
package terraform
allow {
resource_change := input.resource_changes[_]
resource_change.change.after.tags["ManagedBy"]
}
</code></pre>
<ul>
<li>使い方
<ul>
<li>planの出力をプランファイルに保存する <code>terraform plan -out tfplan.binary</code></li>
<li>OPAはJSONに対してのみ実行できる。JSONに変換 <code>terraform show -json tfplan.binary > tfplan.json</code></li>
<li>JSONになったプランファイルをチェックする
<code>opa eval --data enforce_tagging.rego --input tfplan.json --format pretty data.terraform.allow</code></li>
</ul>
</li>
</ul>
<p>プランテストツールの強み</p>
<ul>
<li>ユニットテスト・結合テストと静的解析の間の実行速度</li>
<li>使いやすい</li>
<li>安定している。不安定なテストはほとんどない</li>
<li>実際のリソースを作成・削除しない</li>
</ul>
<p>プランテストツールの弱み</p>
<ul>
<li>静的解析よりは多くのエラーを発見できる</li>
<li>プロバイダの認証が必要</li>
<li>静的解析と同じく、テストが通ってもインフラが動かないことはあり得る</li>
</ul>
<h3>サーバテスト</h3>
<p>サーバ(仮想サーバも含む)が正しく設定されているかテストすることに焦点を当てたテストツール</p>
<p>サーバテストツール</p>
<ul>
<li>InSpec</li>
<li>Serverspec</li>
<li>Goss</li>
</ul>
<p>InSpecの例</p>
<pre><code>describe file('/etc/myapp.conf') do
it { should exist }
its('mode') { should cmp 0644 }
end
describe apache_conf do
its('Listen') { should cmp 8080 }
end
describe port(8080) do
it { should be_listening }
end
</code></pre>
<p>サーバテストツールの強み</p>
<ul>
<li>ツールが提供するDSLで一般的な項目は簡単に確認できる</li>
<li>applyして、動作しているサーバを確認するので、より多くのエラーを発見できる。</li>
</ul>
<p>サーバテストツールの弱み</p>
<ul>
<li>高速ではない。applyとdestroy(必要ないケースもあり)が必要になる</li>
<li>実際にapplyするため、不安定なテストが存在する</li>
<li>プロバイダの認証が必要</li>
<li>リソースの作成・削除が必要。お金がかかる</li>
<li>サーバはチェックできるが、それ以外のインフラはチェックされない</li>
</ul>
<h2>ユニットテスト</h2>
<p>Terraform におけるユニットは、再利用可能なモジュール</p>
<p>Terraform コードはAWSのAPIなどを呼びだすため、外部依存関係を全く無くす現実的な方法は存在しない</p>
<ul>
<li>純粋なユニットテストができない。実際のところ結合テストになる</li>
</ul>
<p>実際のインフラを実際の環境にデプロイする自動テストを書くことで、Terraform コードが期待通りに動作するか確認できるため</p>
<p>基本戦略</p>
<ol>
<li>小さく、独立したモジュールを作る</li>
<li>terraform apply を実行し、実環境にデプロイする</li>
<li>期待通りに動作するか確認。ALBならHTTPリクエストを送る等</li>
<li>terraform destroy で後片付け</li>
</ol>
<p>terraform test で apply を使用する</p>
<ul>
<li>v1.6で追加されたコマンド。本書はv1.3時点に書かれているそうなので、記載されていない</li>
</ul>
<p>Terratest</p>
<ul>
<li>terraform applyを実行し、動作確認をし、terraform destroy をする</li>
<li>HTTPリクエストの送信等のヘルパー関数が含まれる</li>
<li>terraform の出力変数の値を利用してテストコードを書ける</li>
</ul>
<pre><code>func TestAlbExample(t *testing.T) {
opts := &terraform.Options{
// この相対パスは、自分の alb モジュールの example ディレクトリを
// 指すよう変更すること
TerraformDir: "../examples/alb",
}
// テストの最後にすべてを後片付け
defer terraform.Destroy(t, opts)
// サンプルをデプロイ
terraform.InitAndApply(t, opts)
// ALB の URL を取得
albDnsName := terraform.OutputRequired(t, opts, "alb_dns_name")
url := fmt.Sprintf("http://%s", albDnsName)
// ALB のデフォルトアクションが動作し、404 を返すことをテスト
expectedStatus := 404
expectedBody := "404: page not found"
maxRetries := 10
timeBetweenRetries := 10 * time.Second
http_helper.HttpGetWithRetry(
t,
url,
nil,
expectedStatus,
expectedBody,
maxRetries,
timeBetweenRetries,
)
}
</code></pre>
<h2>結合テスト</h2>
<p>複数のUnitを組み合わせてテストをする</p>
<ul>
<li>mysql serverの作成、mysql server を使用するweb app</li>
</ul>
<h2>E2E テスト</h2>
<p>インフラが複雑になると実行に時間がかかりすぎる</p>
<p>現実的な対応として、本番に近いテスト環境を1回だけ構築し、動かしたままにする。</p>
<p>インフラコードに変更を加えたらテスト環境に変更を適用し、SeleniumなどでE2Eテストを実行する</p>
<h2>その他:不安定なテストに対してリトライする</h2>
<p>インフラのコードの定期的に自動テストをすると、不安定なテスト(flaky tests)に直面する</p>
<ul>
<li>時々EC2が立ち上がらないとか</li>
</ul>
<p>Terratestを使っているなら、terraform.Options の MaxRetries、TimeBetweenRetries、RetryableTerraformErrors の各引数を使ってリトライを有効にする</p>
<!--notionvc: 9912da39-d92f-4986-b6bd-c2d505efd3f8-->aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-61781204355683680862019-12-13T18:15:00.000+09:002019-12-13T18:15:34.671+09:00macOS Mojave + VirtualBox + Vagrantで作った環境で composer install が失敗する<div style="color: #737373; font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", Arial, sans-serif; font-size: 13px; margin-bottom: 9px; padding: 0px;">
環境</div>
<ul style="color: #737373; font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", Arial, sans-serif; font-size: 13px;">
<li>macOS Mojave: 10.14.6</li>
<li>VirtualBox: 6.0.12</li>
<li>php: 7.0.33</li>
<li>composer: 1.9.1</li>
</ul>
<div style="color: #737373; font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", Arial, sans-serif; font-size: 13px; margin-bottom: 9px; padding: 0px;">
Vagrantでdebian環境を構築し、PHPのプロジェクトを共有フォルダでマウントする方式だった。</div>
<div style="color: #737373; font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", Arial, sans-serif; font-size: 13px; margin-bottom: 9px; padding: 0px;">
セットアップで <code style="background-color: #fee9cc; border-radius: 3px; color: rgba(0, 0, 0, 0.75); font-family: Monaco, "Andale Mono", "Courier New", monospace; font-size: 12px; padding: 1px 3px;">vagrant ssh</code> して、その中で <code style="background-color: #fee9cc; border-radius: 3px; color: rgba(0, 0, 0, 0.75); font-family: Monaco, "Andale Mono", "Courier New", monospace; font-size: 12px; padding: 1px 3px;">composer install</code> を実行したところ、1つ目のpackageのインストールが失敗して、以下のようなエラーが表示された。</div>
<pre style="border: 1px solid rgb(217, 217, 217); font-family: monaco, "andale mono", "courier new", monospace; font-size: 11px; line-height: 16px; margin-bottom: 18px; overflow-wrap: break-word; padding: 14px; white-space: pre-wrap;"><code style="background-color: white; border-radius: 3px; font-family: Monaco, "Andale Mono", "Courier New", monospace; padding: 0px;"><span style="color: #737373;">- Installing ****</span><span class="hljs-regexp" style="background-color: #fff0ff; color: #880088;">/xxxxxxx (x.y.z): Reading /home/vagrant/</span><span style="color: #737373;">.cache</span><span class="hljs-regexp" style="background-color: #fff0ff; color: #880088;">/composer/files/</span><span style="color: #737373;">****/xxxxxxx/</span><span class="hljs-number" style="color: #009999;">4</span><span style="color: #737373;">beacec67ac5fe138813cdfd0ab1d031111111.zip from cache
Loading from cache
Extracting archiveExecuting command (CWD): unzip -qq </span><span class="hljs-string" style="color: #dd1144;">'/vagrant/hoge/vendor/****/xxxxxxx/98c734dfe8c02cf90edc8787111111111'</span><span style="color: #737373;"> -d </span><span class="hljs-string" style="color: #dd1144;">'/vagrant/hoge/vendor/composer/zxcvbnm'</span><span style="color: #737373;">
Plugin installation failed, rolling back
- Removing ****/xxxxxxx (</span><span style="color: #009999;">x.y.z</span><span style="color: #737373;">)
[RuntimeException]
Could </span><span class="hljs-keyword" style="color: #009999;">not</span><span style="color: #737373;"> </span><span class="hljs-keyword" style="color: #009999;">delete</span><span style="color: #737373;"> /vagrant/yoyaku/vendor/****/</span></code><span style="color: #737373;">xxxxxxx/tests/HogeFuga:</span></pre>
<div style="color: #737373; font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", Arial, sans-serif; font-size: 13px; margin-bottom: 9px; padding: 0px;">
結論としては、Vagrantfileの共有フォルダのtypeオプションに <code style="background-color: #fee9cc; border-radius: 3px; color: rgba(0, 0, 0, 0.75); font-family: Monaco, "Andale Mono", "Courier New", monospace; font-size: 12px; padding: 1px 3px;">virtualbox</code>が指定されていたので、削除すると動作した。</div>
<div style="color: #737373; font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", Arial, sans-serif; font-size: 13px; margin-bottom: 9px; padding: 0px;">
ファイルのパーミッションやcomposer周りを色々調べたが、時間の無駄だった。</div>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com5tag:blogger.com,1999:blog-8653813949780496014.post-80308631714384754792015-09-15T00:26:00.000+09:002015-09-15T00:26:04.171+09:00Dropboxで同期させてるDay Oneのエントリが増殖した
<p>Day One/Journal.dayone/entries の下にエントリが1ファイルずつ存在しているが、 <br>
以下のように同じファイルが増殖してた。</p>
<pre><code>4619D4A8395F4163B3CDA61BD40FB1F8 (1).doentry
4619D4A8395F4163B3CDA61BD40FB1F8 (2).doentry
4619D4A8395F4163B3CDA61BD40FB1F8 (3).doentry
4619D4A8395F4163B3CDA61BD40FB1F8.doentry
</code></pre>
<p>以下のコマンドで適当に削除して、再同期することで治った</p>
<pre><code class="prettyprint">cd ~/Dropbox/アプリ/Day\ One/Journal.dayone/entries
find . -type f -name '*(*' -print0 | xargs -0 rm -f
</code></pre>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com1tag:blogger.com,1999:blog-8653813949780496014.post-59475665577355204492015-08-03T21:28:00.000+09:002015-08-03T21:28:09.635+09:00php-fpmをServer::Starterを使ってHot deploy<p>したかったけど、ダメだった。</p>
<p><a href="https://metacpan.org/pod/Server::Starter">Server::Starter</a>はサーバプログラムをよしなにホットデプロイしてくれるスーパーデーモンです。</p>
<p>FPM_SOCKETSを使ってsocketは引き継げるが、php-fpmがそもそもgraceful shutdownに対応してないため、Server::StarterがSIGHUPを受けてphp-fpmを切り替える際に処理途中のリクエストが切断される。</p>
<p>なんとかしたい……。</p>
<h3>FPM_SOCKETSについて</h3>
<p>php-fpmは環境変数のFPM_SOCKETSからsocket情報を引き継ぐ機能がある。</p>
<p>start_serverはsocket情報をSERVER_STARTER_PORTに入れてサーバプログラムに渡すので、FPM_SOCKETSにセットしてphp-fpmを起動するとよい。</p>
<p>ざっくり書くとこういう形</p>
<p>start.sh</p>
<pre><code class="prettyprint">#!/bin/bash
start_server --path=`pwd`/php-fpm.sock \
--interval=15 \
--signal-on-hup=QUIT -- \
sh -c 'FPM_SOCKETS=$SERVER_STARTER_PORT php-fpm -y php-fpm.conf'
</code></pre>
<h4>その他テスト用ファイル</h4>
<p>php-fpm.conf</p>
<pre><code class="prettyprint">[global]
pid = /Users/yosasaki/devel/php/php-fpm-graceful/php-fpm.pid
error_log = /Users/yosasaki/devel/php/php-fpm-graceful/php-fpm-error_log
daemonize = no
[www]
listen = /Users/yosasaki/devel/php/php-fpm-graceful/php-fpm.sock
listen.backlog = 256
listen.allowed_clients = 127.0.0.1
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /Users/yosasaki/devel/php/php-fpm-graceful/www-slow_log
php_admin_value[error_log] = /Users/yosasaki/devel/php/php-fpm-graceful/www-error_log
php_admin_flag[log_errors] = on
</code></pre>
<p>index.php</p>
<pre><code class="prettyprint"><?php
sleep(10);
echo "OK";
</code></pre>
<p>nginx.conf</p>
<pre><code class="prettyprint">worker_processes 1;
daemon off;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 8080;
server_name localhost;
root /Users/yosasaki/devel/php/php-fpm-graceful;
location / {
fastcgi_pass unix:/Users/yosasaki/devel/php/php-fpm-graceful/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
}
</code></pre>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-23707480560269554372015-07-22T12:45:00.001+09:002015-07-22T12:45:09.469+09:00CentOS 6.4でyum updateが"Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again"で失敗する<p>epelの mirrors.fedoraproject.org とSSLコネクションをひらくところでコケている模様</p>
<h3>解決方法</h3>
<ol>
<li><p>/etc/yum.repos.d/epel.repoのmirrorlistがhttpsになっているので、一旦baseurlに変更する</p>
<pre>baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
</pre></li>
<li><p>ca-certificatesを更新</p>
<p>% sudo yum update -y ca-certificates</p></li>
</ol>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-9975510072692359442015-06-26T14:24:00.004+09:002015-06-26T14:24:55.443+09:00DockerでClojureを動かす<p>Docker containerでClojureのWAFである<a href="http://www.luminusweb.net/">Luminus</a>を動かしてみる</p>
<h3>事前準備</h3>
<ul>
<li><a href="http://boot2docker.io/">boot2docker</a>のinstall</li>
<li><a href="http://leiningen.org/">leiningen</a>のinstall</li>
</ul>
<h3>プロジェクト生成と実行</h3>
<pre><code class="prettyprint">$ lein new luminus hello-world
$ cd hello-world/
$ lein run
Retrieving org/clojure/clojure/1.7.0-RC2/clojure-1.7.0-RC2.pom from central
Retrieving org/clojure/clojure/1.7.0-RC2/clojure-1.7.0-RC2.jar from central
2015-6-26 13:02:18 +0900 SPC-072.local INFO [hello-world.handler] -
-=[ hello-world started successfullyusing the development profile]=-
2015-06-26 13:02:18.357:INFO:oejs.Server:jetty-7.6.13.v20130916
2015-06-26 13:02:18.439:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:3000
</code></pre>
<p>ブラウザで開く</p>
<pre><code class="prettyprint">$ open http://localhost:3000
</code></pre>
<h3>Dockerfile</h3>
<p>方針</p>
<ul>
<li>imageはdocker hubのjava8を使う</li>
<li>containerにuberjarを含める
<ul>
<li><code>leiningen run</code>だとcontainer起動後から接続可能になるまで時間がかかる</li>
<li>Elastic Beanstalkだと結構致命的</li>
</ul></li>
<li><code>CMD</code>は<code>exec form</code>じゃなく<code>shell form</code>で書く
<ul>
<li><code>sh</code>経由で立ち上がるので、<code>ENV</code>でセットした環境変数が受け取れる</li>
<li><code>CMD</code>なら<code>docker run</code>時に簡単に書き換えられる</li>
</ul></li>
</ul>
<p>Dockerfile</p>
<pre><code class="prettyprint"> FROM java:8
ENV TZ JST-9
ENV JVM_OPTS -server -Xms512m -Xmx512m -Xmn256m
RUN mkdir -p /home/app
COPY ./target/hello-worldjar /home/app/
EXPOSE 3000
WORKDIR /home/app
CMD /usr/bin/java $JVM_OPTS -jar hello-world.jar 3000
</code></pre>
<p>詳しくは<a href="https://docs.docker.com/reference/builder/">Dockerfile reference</a>を参照。</p>
<h3>containerの作成と立ち上げ</h3>
<p>uberjar作成</p>
<pre><code class="prettyprint">$ lein uberjar
Compiling hello-world.core
Compiling hello-world.handler
Compiling hello-world.layout
Compiling hello-world.middleware
Compiling hello-world.routes.home
Compiling hello-world.session
Created /path/to/project/hello-world/target/hello-world-0.1.0-SNAPSHOT.jar
Created /path/to/project/hello-world/target/hello-world.jar
</code></pre>
<p>container作成</p>
<pre><code class="prettyprint">$ docker build -t luminus/hello-world .
Sending build context to Docker daemon 56.42 MB
Sending build context to Docker daemon
Step 0 : FROM java:8
---> 433801eb0894
Step 1 : ENV TZ JST-9
---> Running in ac5801626c85
---> 77b3c91b3d78
Removing intermediate container ac5801626c85
Step 2 : ENV JVM_OPTS -server -Xms512m -Xmx512m -Xmn256m
---> Running in 5c6a50907c9d
---> 9db9e3ecf034
Removing intermediate container 5c6a50907c9d
Step 3 : RUN mkdir -p /home/app
---> Running in 4e0e9d8c0b15
---> 9af2a4c10750
Removing intermediate container 4e0e9d8c0b15
Step 4 : COPY ./target/hello-world.jar /home/app/
---> 4e89615ff644
Removing intermediate container 88d653f5d04f
Step 5 : EXPOSE 3000
---> Running in 383fc9ad8ee1
---> 0ecb672ec459
Removing intermediate container 383fc9ad8ee1
Step 6 : WORKDIR /home/app
---> Running in eb575c33ce63
---> 158e8dbc87eb
Removing intermediate container eb575c33ce63
Step 7 : CMD /usr/bin/java $JVM_OPTS -jar hello-world.jar 3000
---> Running in 344eac7db8b2
---> 132b7b08093a
Removing intermediate container 344eac7db8b2
Successfully built 132b7b08093a
</code></pre>
<p>docker run</p>
<pre><code class="prettyprint">$ docker run --rm -it -p 3000:3000 luminus/hello-world
2015-Jun-26 13:47:52 +0900 9ae20b5deccf INFO [hello-world.handler] -
-=[ hello-world started successfully]=-
2015-06-26 13:47:52.424:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2015-06-26 13:47:52.513:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:3000
</code></pre>
<p><code>-p</code>オプションでcontainer側のTCP/3000をhost側(localhostじゃない)のTCP/3000にマッピングしているので、 <br>
<code>boot2docker</code>コマンドでhost側のIPを調べて接続する</p>
<pre><code class="prettyprint">$ open http://$(boot2docker ip):3000
</code></pre>
<h3>TODO</h3>
<p>そのうち以下について書く</p>
<ul>
<li>Docker Compose</li>
<li>Docker + ElasticBeanstalk</li>
</ul>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-8028079486449378542015-03-04T21:08:00.001+09:002015-03-04T21:08:11.674+09:00Railsアプリをruby-profとqcachegrindでプロファイリング<p>遅いサイトをなんとかする必要があったので、まずは計測する。</p>
<p>最初に使ったrack-mini-profilerは大して役に立たないので無駄だった。</p>
<h3>qcachegrindのインストール</h3>
<pre><code class="prettyprint">% brew install qcachegrind graphviz
</code></pre>
<p>graphvizはqcachegrindでコールグラフの生成に使う</p>
<h3>手順</h3>
<ol>
<li><p>Gemfileに<code>ruby-prof</code>を追加</p>
<pre><code class="prettyprint">group :profile do
gem 'ruby-prof'
end
</code></pre></li>
<li><p>config.ruにprofの設定追加</p>
<pre><code class="prettyprint">if Rails.env.profile?
use Rack::RubyProf, :path => 'tmp/profile',
:printers => {
::RubyProf::FlatPrinter => 'flat.txt',
::RubyProf::GraphPrinter => 'graph.txt',
::RubyProf::GraphHtmlPrinter => 'graph.html',
::RubyProf::CallStackPrinter => 'call_stack.html',
::RubyProf::CallTreePrinter => 'call_grind.txt',
}
end
</code></pre></li>
<li><p><code>RAILS_ENV=profile</code>の設定は適宜developmentあたりをコピーして作成。</p></li>
<li><p>サーバを起動して、問題のページにアクセスする。</p>
<pre><code>./bundle/bin/spring rails s -p 3001 -e profile
</code></pre></li>
<li><p><code>tmp/profile/-call_grind.txt</code>が生成されているのでqcachegrindに読み込ませる。</p>
<a href="http://1.bp.blogspot.com/-xUUA164LGuA/VPb003ih-1I/AAAAAAAAASs/bUmYVv6uKi4/s1600/qcachegrind.png" imageanchor="1" ><img border="0" src="http://1.bp.blogspot.com/-xUUA164LGuA/VPb003ih-1I/AAAAAAAAASs/bUmYVv6uKi4/s320/qcachegrind.png" /></a></li>
<li><p>Incl.やSelfの値の大きいところを目安にして、実際に遅い処理の部分を探す</p></li>
</ol>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-63574249147411820272014-09-14T10:00:00.000+09:002014-09-14T10:00:07.309+09:00YAPC::Asia Tokyo 2014に行ってきました #yapcasia<h4>YAPC::Asia Tokyo 2014</h4>
<p><a href="http://yapcasia.org/2014/">YAPC::Asia Tokyo 2014 公式サイト</a></p>
<p>大分報告が遅くなりました。</p>
<p>諸事情でトークは2,3つくらいしか見れなかったのですが、昨年以前と同様、各地のPerl Mongerと交流できたので満足です。無限コーヒーとワッフルが最高でした!周りに著名Perl Mongerがいるのでお話もできます。コーヒー最高!</p>
<p>PM繋がりで2日目の午後から、「地域.pmミートアップ 2014」というイベントでHokkaido.pmを代表してお話させていただきました。その様子はエンジニアtypeさんで記事になっています。</p>
<p><a href="http://engineer.typemag.jp/article/yapc2014-pm">「『やろう』と言ったらそれはもう『.pm』」~YAPC::Asia Tokyo 2014に見る地方コミュニティの盛り上げ方</a></p>
<p>最近はSapporo.cljというClojureのイベントも主催しておりますが、Perlに限らず地域コミュニティはやりたい人が「やろう」と周りに宣言することから始まります。やりたい言語、技術があれば、どんどん自分から声をかけて行けばいいんじゃないでしょうか。</p>
<h4>次のHokkaido.pm</h4>
<p>非常によく「次のHokkaido.pmはいつですか?」と訊かれまして、お待たせてして申し訳ない気持ちでいっぱいでした。子育ても落ち着いてきましたので、10月末〜11月にHokkaido.pm#12を開催したいと思います。便乗帰省を目論んでいる方も暖かく迎え入れますので、是非ご参加ください。</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-30547299379517566362014-07-11T00:51:00.002+09:002014-07-11T00:52:29.772+09:00ClojureでFibonacci(10) Calculation per Request<p>Express vs Flask vs Go vs Sparkjava <br>
<a href="https://medium.com/@tschundeee/express-vs-flask-vs-go-acc0879c2122">https://medium.com/@tschundeee/express-vs-flask-vs-go-acc0879c2122</a></p>
<p>Clojureだとどの程度なのか気になったのでベンチとってみたら、 <br>
比較用のNodeの4倍程度速度だった。</p>
<p>GolangとSparkjavaはやはり速い……</p>
<h3>環境</h3>
<p>Hardware: Macbook Air 2011mid Core i7@1.8GHz and 4GB RAM <br>
Software: OSX 10.9.3 <br>
Java 1.8.0_05 Java HotSpot(TM) 64-Bit Server VM</p>
<h3>ソースコード</h3>
<p><a href="https://github.com/ysasaki/clj-fib-server">github.com/ysasaki/clj-fib-server</a>にアップしてある</p>
<p>src/fib/handler.clj</p>
<pre><code class="prettyprint">
(ns fib.handler
(:gen-class)
(:require [compojure.core :refer :all]
[compojure.route :as route]
[ring.middleware.params :as mp]
[org.httpkit.server :as httpkit]))
(defn- ^long fib [^long n]
(case n
0 0
1 1
(+ (fib (- n 1)) (fib (- n 2)))))
(defroutes app-routes
(GET "/:number" {{number :number} :params}
{:status 200 :header {"Content-Type" "text/plain"} :body (str (fib (Integer/parseInt number)))}))
(def app
(mp/wrap-params app-routes))
(defn -main [port]
(httpkit/run-server app {:port (Integer. port)}))
</code></pre>
<h3>ベンチマーク</h3>
<p>1回目</p>
<pre>
Running 30s test @ http://localhost:5000/10
2 threads and 64 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.84ms 10.50ms 169.24ms 96.29%
Req/Sec 9.76k 3.31k 14.07k 77.83%
571981 requests in 30.00s, 51.82MB read
Socket errors: connect 0, read 25, write 0, timeout 0
Requests/sec: 19065.88
Transfer/sec: 1.73MB
</pre>
<p>2回目。JVMが頑張っているのか2回目は大体1000req/secくらい速い</p>
<pre>
% wrk -c 64 -d 30s http://localhost:5000/10
Running 30s test @ http://localhost:5000/10
2 threads and 64 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 3.42ms 5.11ms 133.44ms 99.18%
Req/Sec 10.75k 1.43k 14.22k 85.30%
605999 requests in 30.00s, 54.90MB read
Socket errors: connect 0, read 3, write 0, timeout 0
Requests/sec: 20199.93
Transfer/sec: 1.83MB
</pre>
<p><code>fib</code>にtype hintsを付けないと1000req/sec減る感じだった</p>
<h3>Node</h3>
<p>比較用にNodeも元記事のソースコードでベンチマーク</p>
<pre>
% node -v
v0.10.7
% wrk -c 64 -d 30s http://localhost:3000/10
Running 30s test @ http://localhost:3000/10
2 threads and 64 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 12.72ms 1.51ms 30.10ms 71.00%
Req/Sec 2.55k 224.26 3.03k 68.94%
150699 requests in 30.00s, 31.19MB read
Requests/sec: 5022.71
Transfer/sec: 1.04MB
</pre>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com1tag:blogger.com,1999:blog-8653813949780496014.post-41038114471098510872014-06-24T00:53:00.001+09:002014-06-24T00:53:22.827+09:00Sapporo.clj#0 開催しました<p>参加者の皆様、@tnoborioさんありがとうございました。 <br>
誰にも参加意思を確認せずに開催に踏み切ってしまったので、最悪 @tnoborio <br>
さんと二人きりかと思いましたが、予想外にあつまっていただいて感謝しております。</p>
<p>特に赤字覚悟で札幌まで来ていただいた登尾さん、本当にありがとうございました。 <br>
ニャンパスステッカーを寄付していただきましたので、#1以降で配っていきたいと思います。</p>
<p>次回以降ですが、隔月くらいの頻度でもくもく会なんかを開いていきたいところです。 <br>
参加者の皆さんにご協力いただくこともあるかと思いますので、よろしくお願いします。</p>
<hr>
<p>最後に私のLTで使ったスライドのリンクを貼っておきます。</p>
<p>Web開発時におけるClojureとPerlのライブラリ比較です。 <br>
Clojureはさっとしか触っていないので、他にベターなもの等あるかと思います。 <br>
<a href="http://ysasaki.github.io/presentations/sapporoclj0/#/title">http://ysasaki.github.io/presentations/sapporoclj0/#/title</a></p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com1tag:blogger.com,1999:blog-8653813949780496014.post-37303925997421244852014-06-20T14:33:00.000+09:002014-06-20T14:33:06.111+09:00Sapporo.cljを開催します<p>明日6/21(土)にSapporo.cljを開催します。</p>
<p>はじめてのClojureの著者 <a href="https://twitter.com/tnoborio">@tnobrio</a> さんが来札されるので、
それに合わせての開催となります。</p>
<h3>イベント詳細ページ</h3>
<p>Sapporo.clj #0 「はじめてのClojure」出版記念 <br>
<a href="http://atnd.org/events/51603#comments">http://atnd.org/events/51603</a></p>
<p>私自身もClojureの勉強を始めたばかりで、わからないことだらけです。
参加者同士で互いにお役立ち情報をシェアしましょう。
需要があれば、今後もSapporo.cljを時々開いていきたいと思います。</p>
<p>はじめてのClojureについては著者割引があるそうなので、
事前に連絡をすると買えるんじゃないでしょうか。</p>
<blockquote class="twitter-tweet" lang="en"><p>Sapporo.clj #0、今週末札幌行きまーす。もうすでに7名も申し込みが。ニャンパスステッカーと、著者割引ありありの「はじめてのClojure」も持っていきます。 <a href="http://t.co/tixl2ZCsn6">http://t.co/tixl2ZCsn6</a></p>— 登尾 徳誠(のぼりお とくせい) (@tnoborio) <a href="https://twitter.com/tnoborio/statuses/479103016381861889">June 18, 2014</a></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-79685356174334202642014-03-28T01:38:00.003+09:002014-03-28T01:38:44.028+09:00CentOS 6.x向けにremiのchef cookbook書いた<p>気づいたらopscodeのyumからremiが消えていて、何度も書くのが段々めんどうになったので作成</p>
<p><a href="https://github.com/ysasaki/yum-remi">https://github.com/ysasaki/yum-remi</a></p>
<p>よんどころのない事情によりCentOS 6.x系でphp55が使いたい、そんな時に使ってください。</p>
<p>Berksfileに以下のようなものを追加</p>
<pre><code class="prettyprint">cookbook 'yum-remi', git: 'git://github.com/ysasaki/yum-remi.git'
</code></pre>
<p>後はrun listに<code>recipe[yum-remi]</code>を追加して、remi-php55のリポジトリを有効にするだけです。</p>
<pre><code class="prettyprint">default['remi']['php55']['enabled'] = 1
</code></pre>
<p>remiのrpmをinstallして、/etc/yum.repos.d/remi.repoを上書きしているだけです。</p>aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-628925348728876912013-10-06T19:47:00.002+09:002013-10-06T19:47:45.801+09:00MTDDC Meetup HOKKAIDO 2013 に参加しました #mtddc<p>10月5日のMTDDC Meetup HOKKAIDOと翌日のHackathonに参加してきました。
非常に盛況で、予想よりも賑わってたのが印象的です。</p>
<p>ノベルティにMONA+SKという函館のお菓子が入ってて、これが結構美味しかったです。 </p>
<div class="separator" style="clear: both; text-align: left;"><a
href="http://2.bp.blogspot.com/-17uuh16zZyQ/UlE5HuCn2wI/AAAAAAAAAPk/M2N7iv2TsI8/s1600/2013-10-05+15.23.33.jpg"
imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0"
src="http://2.bp.blogspot.com/-17uuh16zZyQ/UlE5HuCn2wI/AAAAAAAAAPk/M2N7iv2TsI8/s320/2013-10-05+15.23.33.jpg"
/></a></div>
<p>さらにはじゃんけん大会でMovableType
Tシャツをゲットできたので非常に満足度の高いイベントでした。</p>
<div class="separator" style="clear: both; text-align: left;"><a
href="http://1.bp.blogspot.com/-HBsNXvwxmRg/UlE9w9SB55I/AAAAAAAAAPw/Emj6iYtEDg4/s1600/2013-10-05+18.18.43.jpg"
imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"><img border="0"
src="http://1.bp.blogspot.com/-HBsNXvwxmRg/UlE9w9SB55I/AAAAAAAAAPw/Emj6iYtEDg4/s320/2013-10-05+18.18.43.jpg"
/></a></div>
<h2>Hackathon</h2>
<p>今回のHackathonではVagrantfileを含んだMTOSのアプリケーション環境丸ごとのchef cookbookを公開しました。 <br>
<a href="https://github.com/ysasaki/cookbook-movabletype-opensource-standalone">cookbook-movabletype-opensource-standalone</a></p>
<p>これは5ヶ月ほど前に作成したVagrantとchefのcookbookをブラッシュアップしたものです。 <br>
先にMTOSだけの<a href="https://github.com/ysasaki/cookbook-movabletype-opensource">cookbook</a>は公開していましたが、Vagrantfileとその他のcookbookの設定等は含まれていませんでした。</p>
<p>今回は丸ごと配布なので、githubからcloneしてきて<code>vagrant up --provision</code>を実行すると以下のような環境が作成されます。</p>
<ul>
<li>CentOS 6.4</li>
<li>Perl 5.16.3</li>
<li>Nginx</li>
<li>MySQL</li>
</ul>
<p>この環境はSkyarcさんのエンジニアブログの記事を元にしております。 <br>
<a href="http://www.skyarc.co.jp/engineerblog/entry/movabletype_psgi_mysql.html">デザイナー必見!VPSで高速なMovable Type用サーバをゼロから構築する方法</a></p>
<p>公開するに当たって、以前のバージョンに以下の作業を行ってます。</p>
<ul>
<li>Vagrantfileをversion 2にアップデート</li>
<li>cookbookの管理をBerkshelfに移行</li>
</ul>
<p>環境丸ごとのcookbookを公開しているのでVagrantでローカルに環境を作成するだけではなく、AWSのEC2上やWindows Azure、その他任意の場所のLinuxサーバにも簡単に環境を作れることになります。</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-41082284480768843442013-10-05T17:47:00.000+09:002013-10-06T10:55:13.784+09:00Vagrant + Chef Solo + Berksfileでのアプリケーション環境の作業手順<p>仕様変更だったり、ディレクトリ配置等が色々あるので自分の流儀を決める</p>
<h2>Chef, Vagrantのインストール</h2>
<p>chef関連ツールをインストール</p>
<pre><code>> gem install chef knife-solo berkshelf
</code></pre>
<p>Vagrantはgemで入れると古いので公式サイトからパッケージでインストールする</p>
<p>Vagrant Pluginをインストール</p>
<pre><code>> vagrant plugin install vagrant-berkshelf vagrant-vbox-snapshot
</code></pre>
<h2>アプリケーションの雛形の作成</h2>
<p>一番最初の雛形は<code>knife solo</code>で作成するのが無難</p>
<pre><code>> knfie solo init foo
</code></pre>
<p><code>berks</code>でBerksfile, Gemfile, Vagrantfileの雛形を生成する。gitの初期化もしてく <br>
れる。既存ファイルを上書きするか聞かれるので"a"を押して、全部上書きする。</p>
<pre><code>> berks init foo
</code></pre>
<p>cookbookの雛形を作成しておく</p>
<pre><code>> knife cookbook create MyApp -o site-cookbooks
</code></pre>
<p>gitに突っ込んでおく</p>
<pre><code>> git add -f * .chef/ .gitignore
> git commit
</code></pre>
<p>.chef/knife.rbにknife solo実行時のcookbook, role, node等のpathが入っているの <br>
でこれは必須ファイル。このファイルがなくてハマることが多い</p>
<h2>Vagrantの設定</h2>
<p>いい感じに設定して、provisionをoffでとりあえず立ち上げる</p>
<pre><code>> vagrant up --no-provision
</code></pre>
<p>chef soloの開発やsshで簡単に接続できるようにssh-configを書きだしておく。
この時ホスト名を分かりやすいものに置換しておくと良い</p>
<pre><code>> vagrant ssh-config | sed 's/default/HOSTNAME/' >> ~/.ssh/config
</code></pre>
<p>置き換えたホスト名で接続確認</p>
<pre><code>> ssh HOSTNAME
</code></pre>
<h2>Chef SoloをVM側に容易</h2>
<pre><code>> knife solo prepare HOSTNAME
</code></pre>
<h2>VMのスナップショットを作成</h2>
<p>今後すぐに初期状態に戻せるようにスナップショットを作成しておく</p>
<pre><code>> vagrant snapshot take chef-ready
</code></pre>
<h2>Berksfileを更新</h2>
<p>cookbook用のbundler。これから自分が書くcookbookの依存ファイルを追加する</p>
<pre><code>> cat Berksfile
site :opscode
cookbook "yum"
cookbook "database"
cookbook "mysql"
cookbook "nginx"
cookbook "simple_iptables"
cookbook "openssl"
</code></pre>
<h2>Cookbookを修正</h2>
<p>好きなようにsite-cookbooks/MyApp/以下を修正していく</p>
<h2>chef soloを実行</h2>
<p>ある程度できたらVMにchefを適用する。</p>
<pre><code>> knife solo cook HOSTNAME -V | tee install-log
</code></pre>
<p><code>-V</code>を付けて詳細なログを出す。長いのでinstall-logにも書きだしておく。
後はトライアンドエラーで徐々に修正していく</p>
<p>繰り返しすぎてよくわからなくなったりしたら、スナップショットの状態に戻して再度試す</p>
<pre><code>> vagrant snapshot go chef-ready
</code></pre>
<h2>完成</h2>
<p>最終的にいい感じに仕上がったら、vagrantコマンドで一発で入るか確認する</p>
<pre><code>> vagrant destroy
> vagrant up --provision
</code></pre>aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-75264215611218232412013-09-22T20:37:00.000+09:002013-09-22T20:37:56.934+09:00YAPC::Asia 2013と今後のHokkaido.pmの活動について<h2>YAPC::Asia 2013</h2>
<p>今年もYAPC::Asiaに行ってきました。スタッフの皆さまのおかげで、非常に楽しい二日間を過ごせました。スタッフの皆さま、ありがとうございます!</p>
<p>普段お世話になっている方への挨拶や次回以降のHokkaido.pmでゲストとして招待したい人とコンタクトを取ることができたので、非常に満足しています。今回は前回よりも中々いい感じにいろんな人に会えた気がします。</p>
<p>今年は私事が色々と重なり、年内の予定が不明瞭だったためスピーカーには応募できませんでした。またスピーカーに応募したい思っていますが、次回のYAPC::Asiaの開催は不明ということで、とりあえずアウトプットを増やしつつ機会を待とうかなと思います。</p>
<h2>今後のHokkaido.pm</h2>
<p>次回のHokkaido.pmは1月後半から2月頃になるんではないでしょうか。もしかすると12月あたりにもあるかもしれません。</p>
<p>何人かに言われたので、そろそろUstをどうにかしたいところです。Ustがあれば遠方の方からも反応をもらえるのというメリットがありますし、土日に参加できない人が一定数いるようなので、そういった方にもフレンドリーかなと。また、先週札幌で行われたオープンソースカンファレンスでもHokkaido.pm Casualの空気感がわからず参加しにくいという話も聞きました。ブログ等での開催報告をもう少し頑張るというのももちろんですが、Ustも空気感を伝える手段の一つにもなるのかなと考えています。何か手頃なUSB接続のカメラを探したいと思います。</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-28512552339410651262013-09-03T15:28:00.000+09:002013-09-03T15:28:43.568+09:00Hokkaido.pm#10 を開催しました #hokkaidopm<p>8/31(土)に札幌市産業振興センターでHokkaido.pm#10を開催しました。 <br>
今回はJPA様の支援でゲストに@tokuhiromさんをおよびしてお話しして頂きましたありがとうございます。 <br>
さらにTengの中の人である@nekokakさんやPerl Beginners主催の@ytnobodyさん、mod_perl大好きな@xtetsujiにもお越しいただき大変豪華は顔ぶれとなりました。 <br>
皆様、まことにありがとうございます。</p>
<p>春から夏にかけて時間が取れなかったので前回の開催から半年程度間が開いてしまいました。 <br>
物足りない方は毎月第3水曜日開催のHokkaido.pm Casualに参加していただけると良いのではないでしょうか。 <br>
次回の開催日はまだ決まっていませんが半年に一度は開催したいと思っております。 <br>
ゲストの目星はある程度つけてありますので、9月のYAPC::Asiaで何人かにアプローチしたいと思います。</p>
<p>イベントのレポートは<a href="http://hokkaido.pm.org/event/hokkaidopm10.html">Hokkaido.pm#10 開催報告</a>を御覧ください。</p>
<h3>LT - Asset Pipeline for Perl</h3>
<p>今回はLTで『Asset Pipeline for Perl』という発表をしました。Railsについてるあの機能の一部をPlack::Middlewareとして実装したものです。 <br>
CoffeeScriptは私が使わないので対応していませんし、<code>javascript_include_tag</code>も未実装です。 <br>
もう少ししたら『GitHub止まりモジュール』から格上げされてCPANにアップロードするかもしれません。</p>
<p><iframe src="http://www.slideshare.net/slideshow/embed_code/25772139" width="512" height="421" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/aloelight/plack-middlewareassetsrailslike" title="Asset Pipeline for Perl" target="_blank">Asset Pipeline for Perl</a> </strong> from <strong><a href="http://www.slideshare.net/aloelight" target="_blank">Yoshihiro Sasaki</a></strong> </div></p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-88338990573467387862013-08-11T17:37:00.000+09:002013-08-11T17:37:16.986+09:00Movable Type Open SourceのChef recipeを更新
<p>MTCafe Sapporo#3に参加したので、Movable Type Open Sourceのchef recipeを修正しました。 <br>
このrecipeはスカイアーク技術ブログに掲載されていた「<a href="http://www.skyarc.co.jp/engineerblog/entry/movabletype_psgi_mysql.html">デザイナー必見!VPSで高速なMovable Type用サーバをゼロから構築する方法</a>」を自動化したものです。</p>
<p><a href="https://github.com/ysasaki/cookbook-movabletype-opensource">https://github.com/ysasaki/cookbook-movabletype-opensource</a></p>
<h4>主な変更点</h4>
<ul>
<li>git checkout時のreference(revision)をmasterからmt5.2.7に変更</li>
<li>perl-5.16.3のinstallをrootユーザに変更</li>
<li>htdocのmv時にonly_ifを追加し、ディレクトリがあるか確認を追加</li>
</ul>
<p><code>git checkout</code>はとrevisionを指定しないとHEADになってしまうので、しっかり指定しないと後々面倒なことになる。</p>
<h4>MTCafe Sapporo#3の感想</h4>
<p>ハンズオンということでchef recipeを修正しつつ、簡単なMTMLを書いてた。 <br>
MTOSのソースコードは読んでたりするが、実は今までMTMLを書いたことがなかった。 <br>
Vimのpluginはなさそうなことを某S社の方が言っていたので、そこはちょっと残念。zen codingで書くしかないようだ。</p>
<p>タグについても色々と歴史的な事情があるのか自由な感じ。 <br>
<code>mt:EntryTitle</code>のようなタグのコロンを抜かせたり、case-insensitiveだったりする。 <br>
開始と終了タグが一致していればいいらしい。</p>
<p>テンプレートをコピペで管理画面上から貼り付けるのが面倒だったが、後で聞くとFTPでアップロードしたファイルに紐付けするような機能もあるらしい。</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-82665595194069442762013-07-18T23:02:00.000+09:002013-07-18T23:02:17.200+09:00daemontoolsのenvdirだけ欲しかったからEnvDir書いた<p>やっぱりenvdirしたかったので、作りかけだったのをちゃんと実装した。</p>
<p>俺得モジュールです。<p>
<ul>
<li>github <a href="https://github.com/ysasaki/p5-envdir">https://github.com/ysasaki/p5-envdir</a></li>
<li>CPAN <a href="http://p3rl.org/EnvDir">http://p3rl.org/EnvDir</a> (そのうち見れると思う)</li>
</ul>
<p>使い方</p>
<pre><code class="prettyprint"> use strict;
use warnings;
# environment from /path/to/envdir/*
use EnvDir -autoload => '/path/to/envdir', -clean;
</code></pre>
<p><code>-clean</code>を付けると本家のenvdir同様に%ENVをクリア(PATHのみは/bin:/usr/binになる)して、指定したdirのファイルから<code>%ENV</code>に色々セットします。 <br>
<code>envdir</code>をimportするか、OOスタイルで使うとガードオブジェクトが返ってきてスコープを抜けると元の<code>%ENV</code>に戻る</p>
<pre><code class="prettyprint"> use strict;
use warnings;
# import envdir function
use EnvDir 'envdir', -clean;
# Function style
{
my $guard = envdir('/path/to/envdir');
...
}
# OO style
my $envdir = EnvDir->new( clean => 1 );
{
my $guard = $envdir->envdir('/path/to/envdir');
...
}
</code></pre>
<p><code>envdir.pl</code>コマンドを添付しているので本家envdirと同じようにも使える</p>
<pre><code class="prettyprint"> > envdir.pl ./env sh -c 'echo $PATH'
</code></pre>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-83408490924268332352013-06-29T02:07:00.000+09:002013-06-29T09:10:07.553+09:00plenv installから--asが消えたのでperl-buildを直接使う<h4>追記 2013/06/29 09:09</h4>
<p>@tokuhiromさんにコメントでご指摘頂きましたところ、8日前にperl-build側で実装されたそうです。 <br>
githubにあるperl-buildのHEADを利用すると使えるようになります。</p>
<hr>
<p>plenvの中身がperlからbashに変更された際に消えたようです。 <br>
バージョンはplenv 2.0.1-7-ge389af0 </p>
<p>違うバージョンのperlを一つずつinstallする分には困りませんが、同じバージョンでコンパイルオプションを変更したものをinstallしようとすると「もうそのバージョンあるから!」とinstallを拒否されます。</p>
<p>ざっくりと見たところplenvは~/.plenv/versions以下にbuildしたperlを保存してます。</p>
<pre><code> > ls -1 ~/.plenv/versions/
5.16.2
5.16.3
5.18.0
</code></pre>
<p>場所が分かれば後は、perl-buildで直接installしてやると大体うまく行きそうです。</p>
<pre><code> > perl-build 5.18.0 ~/.plenv/versions/5.18-ithreads -Duseithreads
</code></pre>
<p>無事installが終わるとこんな感じになるので、後は<code>plenv global 5.18-ithreads</code>等の通常の方法で切り替えることが出来ます。</p>
<pre><code> > plenv versions
system
5.16.2
5.16.3
5.18-ithreads
* 5.18.0 (set by PLENV_VERSION environment variable)
</code></pre>
<p>公式に説明があるわけではないので自己責任で行ってください。</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com3tag:blogger.com,1999:blog-8653813949780496014.post-25690592634054006572013-06-17T01:18:00.001+09:002013-06-17T01:18:10.702+09:00Travis CIでbuild失敗時にエラーメッセージを確認する方法<p>ビルドに失敗した時に~/.cpanm/build.logを見たいことがあるので、以下の二つを最初から設定しておくと便利</p>
<ul>
<li>install</li>
<li>after_failure</li>
</ul>
<p>.travis.yml全体だとこんな感じ</p>
<pre><code> language: perl
perl:
- 5.10
- 5.12
- 5.14
- 5.16
install:
- "cpanm --installdeps --notest . || cat ~/.cpanm/build.log"
after_failure:
- "cat ~/.cpanm/build.log"
</code></pre>
<p>before_script, script等の各コマンドを上書きして全部に<code>|| cat /path/to/log</code>みたいなのを付けてる人もいた</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-37045962530294062922013-06-12T17:23:00.001+09:002013-06-14T15:04:58.408+09:00Windows環境でVagrant/Chef Solo環境を構築するメモ(2013-06-14更新)Windows XP上で構築
<ul>
<li>Vagrantはgemから入れるとちょっと古いので公式にあるインストーラを利用する</li>
<li>Rubyの環境はMingw + Msys + RubyInstaller for Windows</li>
<li>gitが使えないと不便なのでmsysgitも入れる</li>
</ul>
<h2>手順</h2>
<ol>
<li>VirtualBoxをインストール</li>
<li>Vagrantをインストール</li>
<li>ディレクトリ <em>C:\Mingw\msys\1.0</em> を作成
<ul>
<li>多分途中にスペースをを含まないほうがいい</li>
</ul></li>
<li>3で作成したディレクトリに<a href="https://code.google.com/p/msysgit/" title="msysgit - Git for Windows - Google Project Hosting">msysgit</a>を展開</li>
<li>Mingw/Msysのインストール
<ol>
<li><a href="http://sourceforge.net/projects/mingw/" title="MinGW - Minimalist GNU for Windows">mingw-get-inst</a>の最新版をDL</li>
<li><em>C:\Mingw</em>に展開</li>
</ol></li>
<li>Rubyのインストール
<ol>
<li><a href="http://rubyinstaller.org/" title="RubyInstaller for Windows">RubyInstaller for Windows</a>から<a href="http://rubyforge.org/frs/download.php/76957/ruby-2.0.0-p195-i386-mingw32.7z" title="ruby-2.0.0-p195-i386-mingw32.7z">7z版のruby-2.0.0-p195</a>をダウンロード</li>
<li>7zを適当な場所に展開する(一時的な展開先なのでどこでもよい)</li>
<li>展開してできた <em>ruby-2.0.0-p195-i386-mingw32</em> の中身を全部 <em>C:\Mingw\msys\1.0\local</em> に移動</li>
</ol></li>
<li><p>cmd.exeの代わりに使うckw-modをインストールする</p>
<ol>
<li><a href="http://ckw-mod.github.io/" title="ckw-mod">ckw-mod</a>を適当な場所に展開(一時的なものではないのでMy Documents\Applications\ckwとかに入れること)</li>
<li><p>ckw.cfgの<code>Ckw*exec</code>を以下のように編集</p>
<p>Ckw*exec: "C:\Mingw\msys\1.0\bin\sh.exe" --login -i</p></li>
</ol></li>
<li><p>ckw.exeを起動してMsysのshellに入る</p></li>
<li><p>~/.inputrcを編集してshell上で日本語が使えるようにする。設定項目は以下のような感じ</p>
<pre><code># disable/enable 8bit input
set meta-flag on
set input-meta on
set output-meta on
set convert-meta off
set kanji-code utf8
</code></pre></li>
<li><p>~/.bash_profileを修正してrubyをPATHに追加する</p>
<pre><code>export PATH="$PATH:/c/Mingw/msys/1.0/local/bin"
</code></pre></li>
<li><p>vagrantが使用するVBoxManage.exeへのPATHが通っているか確認する。通っていない場合はPATHに追加しておくこと</p>
<pre><code>$ which VBoxManage
/c/Program Files/Oracle/VirtualBox/VBoxManage.exe
</code></pre></li>
<li><p>Rubyのnative拡張が必要な諸々を再インストール</p>
<pre><code>$ gem uninstall ffi win32-api yajl-ruby
$ gem install ffi win32-api yajl-ruby --platform=ruby
</code></pre></li>
<li><p>Chef関連をインストール</p>
<pre><code>$ gem install chef knife-solo --platform=ruby
</code></pre></li>
</ol>
<p>これで<code>knife configure</code>を実行してみてエラーが出なければ多分OK</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-56836600593892225952013-05-20T02:41:00.000+09:002013-05-20T02:41:07.740+09:00MTCafe Sapporo#2とSapporo.js<p>5/18にMTCafe Sapporo#2と5/19にSapporo.jsに参加したので、その記録をざっくりと。</p>
<h2>MTCafe Sapporo#2</h2>
<p>Perl繋がりということでお邪魔しました。 <br>
ゆるふわな空気の中、Chef SoloによるMTOS環境の構築をテーマにひとりHackathonを敢行しました。 <br>
作成したMovable TypeのOpenSource版のcookbookは以下です。
<a href="https://github.com/ysasaki/cookbook-movabletype-opensource">ysasaki/cookbook-movabletype-opensource</a></p>
<p>自動化を思い立ったきっかけはちょっと前に公開された<a href="http://www.skyarc.co.jp/engineerblog/entry/movabletype_psgi_mysql.html">デザイナー必見!VPSで高速なMovable Type用サーバをゼロから構築する方法</a>です。 <br>
明らかにデザイナーには大変そうなので、Chef Soloで簡単に環境を構築できれば楽ができるだろうと考えた次第です。 <br>
前日からnaoyaさんの<a href="http://www.amazon.co.jp/gp/product/B00BSPH158/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00BSPH158&linkCode=as2&tag=aloelight06-22">入門Chef Solo - Infrastructure as Code</a><img src="http://www.assoc-amazon.jp/e/ir?t=aloelight06-22&l=as2&o=9&a=B00BSPH158" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />を読みながら書き進めましたが、当日には完成しなかったのが残念です。</p>
<p>まだ未完成ですが、現在は以下の構成で動作するところまで来ています。</p>
<ul>
<li>Reverse Proxy - Nginx</li>
<li>Database - MySQL</li>
<li>PSGI Server - Starman</li>
</ul>
<p>今後もChefの勉強も兼ねて手直ししていく予定です。次回のMTCafeには間に合わせたいなーと考えています。</p>
<p>TODO</p>
<ul>
<li>依存cookbookの指定を追加</li>
<li>Daemontoolsに対応するか検討する。Upstartを使うのも良さそう</li>
<li>Memcached対応</li>
<li>NginxのReverse Proxy対応をオプショナルなrecipeに変更</li>
<li>ApacheをReverse Proxyに使うrecipeの追加</li>
<li>さくらVPS等での動作確認</li>
</ul>
<h2>Sapporo.js</h2>
<p>久しぶりのSapporo.jsということで東区民センターまで出向きました。</p>
<p><a href="https://twitter.com/tricknotes">@tricknotes</a>さんのember.jsの紹介、<a href="https://twitter.com/y_jono">@y_jono</a>さんのJavaScriptでの非同期処理のプラクティス的なお話を聞いた後に、恒例のJavaScript: The Good Partsの読み合わせを行いました。</p>
<h4>ember.jsの紹介</h4>
<ul>
<li><a href="http://emberjs.com/guides/">公式のガイド</a>がよく出来ている</li>
<li>他のMVCと比べてemberは不必要なコードが少ない</li>
<li>Good Partsでは推奨されていないやり方をしているが、他所は他所、うちはうちと考えよ</li>
<li>ember.jsをterminalから使える<a href="https://github.com/tricknotes/term-ember">ember term</a></li>
<li>Modelの変更とかの自動で感知する</li>
<li>テンプレートはhandlebars</li>
<li><a href="http://www.embercast.com">EMBERCAST</a>
<ul>
<li>動画で紹介</li>
<li>これ自体もemberを使っていて、ソースコードがgithubで公開されている</li>
</ul></li>
<li>気に入らないところ
<ul>
<li>動かないときに完全に沈黙することがある</li>
<li>debuggerとかで対応</li>
<li>コーディングの効率を上げるためにprototypeを拡張するけど、オプションで拡張しないようにもできる</li>
</ul></li>
<li>サーバとのやり取りはemberjs/dataがあるけど、まだまだ使える段階ではない
<ul>
<li>ember-modelが良さげ?</li>
</ul></li>
</ul>
<h4>Concurrent Programming in JavaScript</h4>
<ul>
<li>サイ本の第6版にスレッド関連がある</li>
<li>callbackスタイル</li>
<li>setTimeout
<ul>
<li>UIのブロックを防ぐため、適当なdelayを付けてsetTimeoutで後回しにする</li>
</ul></li>
<li>Web Workers
<ul>
<li>意図した動作にならなかったり、初期化処理に時間がかかったりする場合があるので使う前に実装を確かめよう</li>
</ul></li>
<li>nodeスタイル(async.series)</li>
<li>Promise/A+</li>
<li>Promiseって書き方がいけてなくね?
<ul>
<li>Flow.js</li>
<li>task.js</li>
</ul></li>
<li>Effective JavaScriptがいい本</li>
</ul>
<h4>読み合わせ</h4>
<p>1ページちょっとしか進みませんでしたので、まだまだ読み合わせは続きそうです。 <br>
次回はP.103の<code>string.match</code>からです。</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-79631633344666129372013-03-21T00:45:00.000+09:002013-03-21T00:45:04.802+09:00Hokkaido.pm Casual#11に行って来ました<p>今回でHokkaido.pm Casualは第1シーズンが終了となります。 <br>
次回から第2シーズンになりますが、特に内容は決まっていません。WAF, ORMあたりは一度は触れるんじゃないかと思います。 <br>
後は<a href="https://twitter.com/techno_neko">@techno_nekoさん</a>が適宜考えながらやって行くはずです。</p>
<h4>今日の発表内容</h4>
<p>第11回目のテーマはリクエスト特集ということでしたが、特にリクエストもなかったので今まで紹介できなかったけど知っていると嬉しいモジュールとして以下を紹介しました</p>
<ul>
<li><a href="http://p3rl.org/Benchmark">Benchmark</a></li>
<li><a href="http://p3rl.org/Devel::NYTProf">Devel::NYTProf</a></li>
<li><a href="http://p3rl.org/Devel::KYTProf">Devel::KYTProf</a></li>
<li><a href="http://p3rl.org/Devel::Cycle">Devel::Cycle</a></li>
</ul>
<p>Synopsisを見たほうが早いですが、スライドは<a href="http://ysasaki.github.com/presentations/hokkaidopm-casual11/#/title">こちら</a>です。 <br>
一応例に使用したgithubにpushしてありますので、確認したかたは<a href="https://github.com/ysasaki/ysasaki.github.com/tree/master/presentations/hokkaidopm-casual11/scripts">こちら</a>からどうぞ</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-30473711845650788182013-03-16T20:52:00.000+09:002013-03-18T12:11:26.155+09:00LINEで勝手に他人のメールアドレスを登録できる件 (追記あり)#LINE<h4>追記 2013/03/18 12:05</h4>
<p>LINEカスタマーサポートから返信をいただきました。
対応が遅れたことを謝罪していただいた上で、再度12時間有効な登録拒否メールを送信するとのことでした。</p>
<p>そのメールの直後に登録拒否メールが来ましたので、記載のリンクから無事登録拒否できました。アプリからパスワード再発行しても特に音沙汰がないことから、恐らく削除されているかとおもいます。</p>
<p>登録フローの変更については<strong>現在対応を検討中</strong>とのことです。</p>
<p>メールアドレスを間違って登録すると、登録した人、された人の両方が不利益を被るので是非とも変更していただきたいところです。</p>
<p>追記ここまで</p>
<hr />
<p>メールアドレス登録フローが腐っているため、勝手に他人のメールアドレスを利用することができます。</p>
<p>一般的なサービス利用時のメールアドレス登録のフローは以下になります。</p>
<ol>
<li>メールアドレスをアプリから仮登録</li>
<li>メールアドレスの有効性と本人確認のた、セッション付きリンクを記載したメールを送信</li>
<li>メールアドレス所有者がリンクをクリックしてメールアドレスの登録完了</li>
</ol>
<p>メールアドレスの所有者による確認が入るため、基本的に他人のメールアドレスは使えないように配慮されています。</p>
<p>しかしLINEの場合は一般的なフローと異なり以下のようになっています。</p>
<ol>
<li>メールアドレスをアプリから入力した時点で<strong>登録完了</strong></li>
<li>入力したメールアドレスに<strong>登録を拒否するリンク(有効時間12時間)</strong>を記載したメールを送信</li>
</ol>
<p>12時間以内に拒否しない場合、今後登録を拒否することはできません。 <br />
勝手に登録されたくない人は12時間に1度メールボックスを確認する必要があります。 <br />
また、<em>line@naver.jp</em>からのメールを迷惑メールに入らないようフィルタの設定を忘れないでください。</p>
<p>今回の私のケースでは普段使っていないicloud.comのメールアドレスが勝手に使われました。 <br />
icloud.comは複数回パスワード入力に失敗した場合アカウントがロックされ、メールを受信できなくなります。普段使っていないので後でロックを解除すればいいと放置していると、このように勝手に使用されることになります。 <br />
ロック解除に手間取るようなサービスの場合、故意にパスワード入力をミスすることでメールアドレスの乗っ取りがしやすくなるかもしれません。</p>
<p>LINEのWindows用アプリとiPhoneアプリを確認しましたが、どちらもメールアドレスの登録解除はできません。 <br />
iPhoneアプリからパスワードリセットのみ可能でしたが、勝手に他人のLINEアカウントを問題がありそうなため、まだそのアカウントにログインはしていません。</p>
<p>念のためカスタマーサポートに問い合わせましたが、自動返信がくるのみで対応してくれません。
LINEの中の人用に私の問い合わせ受付番号を載せておきます</p>
<ul>
<li>受付番号:859194</li>
<li>受付番号:852220</li>
<li>受付番号:846368</li>
<li>受付番号:847236</li>
</ul>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0tag:blogger.com,1999:blog-8653813949780496014.post-69572934640010967802013-03-14T23:26:00.000+09:002013-03-14T23:26:25.863+09:00Hokkaido.pm#9を開催しました
<p>報告が遅れましたが、3/9(土)に無事開催しました。 <br>
参加者のみなさん、講師のxaicronさん、悪天候の中ありがとうざいました。 <br>
詳しい内容は公式ブログの<a href="http://hokkaido.pm.org/event/hokkaidopm9_1.html">Hokkaido.pm#9 開催報告</a>を御覧ください。</p>
<p>個人的には<a href="https://twitter.com/shinotra">@shinotraさん</a>のATNDのAPIでWebサービスを作った話がすこぶる良かったです。 <br>
最初はLTでの申し込みだったのですが、無理を言って20分やっていただいて正解でした。 <br>
今後もshinotraさんのようにCasualで釣って、本体に参加してくれる人が増えるとよいですね。</p>
<h4>自分の発表について</h4>
<p>今回はPerl版Gemfileのcpanfileについてざっくりと説明しました。 <br>
開催直前にcpanfileに対応したcartonがリリースされたので、ちょうどよいタイミングでした。</p>
<p>Perl自体とCPANモジュールについては互換性の維持に相当力をいれていますので、Makefile.PLでの指定でもそれほど問題はありませんでしたが、これでカッチリとした指定がやろうと思えば簡単にできるようになったのは大きいです。 </p>
<p>個人的に一番大きなメリットはgitリポジトリを直接指定できることかと思います。この機能自体はどちらかと言うとcpanmによるものですが。 <br>
社内やgithubにおいておけば簡単に自社アプリケーションで利用できるので、わざわざDarkPANを立てなくてもよくなります。勤務先にも自社ライブラリをOrePANを立てて利用していますが、gitに移行してOrePANを止めないと考えています。</p>
<p>今回のスライドを貼っておきます。</p>
<p><iframe src="http://www.slideshare.net/slideshow/embed_code/17053550" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="http://www.slideshare.net/aloelight/cpanfile" title="cpanfile" target="_blank">cpanfile</a> </strong> from <strong><a href="http://www.slideshare.net/aloelight" target="_blank">Yoshihiro Sasaki</a></strong> </div></p>
<h4>今後の開催について</h4>
<p>今回から開催者は持ち回りでやってみないかと言う事で、とりあえず私がメインで色々担当しました。 <br>
次回は誰が開催するのか決まってませんが、多分他にいなそうなので私がやるんじゃないかなと思います。</p>
<p>@techno_nekoさんが毎月Hokkaido.pm Casualを開催していますので、Hokkaido.pm本体の方は年3回(3,7,11月とか)くらいの頻度でやるんじゃないでしょうか。</p>
<p>JPA様の講師派遣制度には毎度お世話になっております。ありがとうございます。次回も恐らく利用するかと思います。 <br>
毎回開催前に誰にしようかという話になりますので、5月頃に「自分、Perl Mongerなんだけど、夏の北海道いいよねー」とアッピールしてもらえるとこちらも呼びやすいところであります。</p>
aloelighthttp://www.blogger.com/profile/18113542990700990508noreply@blogger.com0