アーカイブ - 5月, 2013



2013年 5月 28

MySQL – SELECT … WHERE id IN (..) – correct order – Stack Overflow

という事で、MySQLでこんなSQLが使えるとの事。

SELECT * FROM table WHERE id IN (4,3,1) ORDER BY FIELD(id,4,3,1)

なので、PerlのORMであるDBIx::SkinnyでSQL組み立てられるのか実験してみる。

my @id_lists = (4,3,1);
$" = ",";  #"

my $rs = MyModel->resultset;
$rs->select([qw/*/]);
$rs->from(['entry']);
$rs->add_where('id' => { 'IN' => \@id_lists });
$rs->order({ 'column' => "FIELD(id, @id_lists)" });

warn $rs->as_sql;

----- 実行結果
SELECT *
FROM entry
WHERE (id IN (?,?,?))
ORDER BY FIELD(id, 4,3,1)

特殊変数 $” で 配列展開時の区切り文字を ,(カンマ) にしている。DBIx::Skinnyなんだから生のSQL使えばいい話だけど。かなり無理矢理だけど一応使えると言う事で。

参考

Filed under: MySQL,perlモジュール

Trackback Uri






2013年 5月 22

群馬、勉強会:Gunma.web( web勉強会 in 群馬 )
Gunma.web #13 : ATND

先日行われたGunma.web#13でLTした資料です。今回は最近流行っているっぽい Speaker Deck にてうpしてみました。

発表したスライド

補足

  • Iaasでもリソース型とインスタンス型がある
    • GMOはリソース型。Amazon EC2なんかはインスタンス型。
  • ハイパーバイザ
    • XenかKVM。最近の安い方のプランだとXen。
    • とはいえXenでも十分。むしろXenの方が細かい設定できて助かる部分も。
  • サーバのテンプレート
    • ロケーションが別の場所には使えない
    • 同じロケーションでもゾーンが違う場合も使えない
  • グローバルなIPアドレス増やせるのは個人的に必須
    • 安い。約210円/月
    • IPベースのvirtual hostじゃないとSSL証明書が有効にならないから
      • マルチドメインとかは高価だし固定されちゃうしブラウザ依存あるので
  • ネットワークについて
    • 提供されるファイアウォール
      • ping通す設定ができない?
      • iptables使ったほうがいい?
    • ポートスピード
      • 〜512Mbpsまで変更できる
      • ただしpublicの場合は100Mbps超は有料。localは無料。
  • コンテンツについて
    • 結構大目に見てくれている
    • 丸見え(・A・)イクナイ!!

国内のサービスの中では使いやすいのではないかと思っています。はい。GMOの回し者じゃないよ。レポートは後程別エントリーで。


Filed under: 勉強会

Trackback Uri






2013年 5月 21

Mojoliciousのバージョンあげたら動かなくなった。

Mojolicious::Commandsの start メソッドが無くなった

$ENV{MOJO_APP} ||= 'MyApp';
Mojolicious::Commands->start;

エラーになる

Couldn't load application from file "./myapp": Can't locate object method "start" via package "Mojolicious::Commands" at ./myapp line 34.

現在は

Mojolicious::Commands->start_app('MyApp');

$ENV{MOJO_APP}が無くなった

詳細はこのエントリに

最近のMojoliciousのバージョンに関して – kinjou_jのメモログ


Filed under: Mojolicious

Trackback Uri






2013年 5月 20

Server::Starter + Starlet

以前はdaemontools+Starmanで起動していたのだけれど、
最近のPlack/Starletのパフォーマンス改善まとめ。最大2倍の性能向上を読んでたらStarletが使ってみたくなったのでServer::Starter+Starletを試してみることに。

コマンドラインから起動してみる。

start_server --port=3000 -- plackup -s Starlet --max-workers=5 my app.pl

start_server (pid:31803) starting now...
starting new worker 31804
Plack::Handler::Starlet: Accepting connections at http://0:3000/

これでポート3000でサーバが待ち受けています。

UpStart

CentOS6に乗り換えたし、折角なのでデーモンの管理はUpStartに乗り換えてみる。CentOS6は標準でインストールされている(というかSysVinitが置き換わった?)なので以下のコマンドが最初から使えるみたい。daemontoolsとかsupervisorとか要らなくなりそう。

  • start SEVICE_NAME
  • stop SEVICE_NAME
  • reload SEVICE_NAME
  • restart SEVICE_NAME

perlの起動方法がよく分からなかったけどStack Overflowでそれっぽい記事を発見したので参考に書いてみた。

vi /etc/init/MyApp.conf

description "MyApp"
author "clicktx<clicktx@mail.tld>"

start on runlevel [2345]
stop on runlevel [016]

chdir /home/clicktx/MyApp/Web
script
  export PATH="/home/clicktx/perl5/perlbrew/bin:/home/clicktx/perl5/perlbrew/perls/perl-5.16/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/clicktx/bin:${PATH}"

  exec su -c "start_server --pid-file=/tmp/myapp.pid --status-file=/tmp/myapp.status --port=3000 -- plackup -s Starlet --max-workers=5 myapp.pl" clicktx
end script

respawn

※ exportするPATHは各自 echo $PATHで確認

サービスの起動
$ sudo start MyApp
MyApp start/running, process 32114

start は initctl start というコマンドのエイリアスのようだ。全てのジョブリストの確認は

$ sudo initctl list

とかで出来る。

余談

start_serverで起動するMojoliciousアプリケーションは他のperlスクリプトから再起動を受け付けたいので、–pid-fileと –status-file オプションを付けている(start_server –restartの場合は必須なので)

他のスクリクトから、

#!/usr/bin/env perl
system "start_server --restart --pid-file=/tmp/myapp.pid --status-file=/tmp/myapp.status";

なんて出来る。もちろんコマンドラインでも出来るけど。

あと、

start_server --port=127.0.0.1:3000 -- plackup -s Starlet myapp.pl

なんてしておくと、http://xxxx:3000 でアクセスされても表示されないみたい。

参考エントリー

Filed under: CentOS6.x,perl

Trackback Uri






2013年 5月 19

Linodeのマニュアルにはiptablesの設定の仕方とか書いてあって親切。

Linode – Creating a Firewall

ルールの作成
vi /etc/iptables.firewall.rules

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT
ルールの適用
sudo iptables-restore < /etc/iptables.firewall.rules
ルールの確認
sudo iptables -nL
ルールの保存

CentOS6.2以上の場合は

/sbin/service iptables save

Filed under: メモ

Trackback Uri