ImageMagickで一括画像変換の記録
個人サイトで配布してる素材がgifになっていたんだけれど、bmp形式に変換してのzip archive配布にしたくて、シェルスクリプト叩いたら一旦コピーしてbmpに変換した上にarchive化、というのを目論んでみた。
homebrew + imagemagick + cpanm + Image::Magickで、メンテナンス用にperlのスクリプトを書こうと試みたところ、シェルスクリプトに落ち着いた過程を以下に。画像変換が鬼門だった。
CPANからImage::Magickを導入(使わなかったけれど)
homebrew経由にてimagemagickを入れた後で、cpanmからImage::Magickを入れる際にどうしても転ける。
Note (probably harmless): No library found for -lperl
理由としてはパスが通っていなかっただけのこと。でも、パスを確認してみたら、何故かあるべきはずのCOREディレクトリがなかった。仕方なくPerl自体を入れ直し。
perlbrew install perl-5.16.0 perlbrew switch perl-5.16.0
再びImage::Magickを入れる。Makefile.PLを一部修正して、COREディレクトリを通す。
cpanm --look Image::Magick vim Makefile.PL my $LIBS_magick = '-L/Users/haoyayoi/perl5/perlbrew/perls/perl-5.16.0/lib/5.16.0/darwin-2level/CORE -lMagickCore -lperl -lm';
とりあえずこれで通ったけど、use Image::Magickするとsegmentation fault。ぐぐってみたところ、homebrewでImageMagickを入れるときに--disable-openmpを渡すとよいらしい、とあったので試したところ変わらず。
これを解決しようとフラグを確認したり、バージョンを確認したりで、結果丸一日くらい使ってたけど、別にPerlMagick経由しなくてもいいんじゃね、って思ったところでやめた。
convertによる変換
wrapper使って苦しむのはどうも微妙な気がしたので、試しにImageMagickのconvertを使ってみた。
最初は以下の感じでトライ。が、出来上がったのは0バイトのbmp。
convert a.gif a.bmp
どうやら目的のbmpファイルの構成上、bmp3:と指定を付けないとダメらしい。(参考:ImageMagick で bmp に変換するときは「bmp3」てのを指定しないとダメらしい)
最終的に、こんな感じに落ち着いた。
for file in $(ls *.gif) do convert $file bmp3:`echo $file | sed 's/gif/bmp/'` done
正直なところ、シェルスクリプトの書き方がどこまでフリーダムに行けるのか理解してなくて、この書き方もありなのか、と。
さくらVPSでサイト運用を手っ取り早くやってみた
さくらVPSのリニューアルプランに乗り換えたついでに、サイト作り直した上で、今まで放置してた運用環境の整理にも手をつけることにした。
以下の組み合わせを使った上で、git pushにてhookさせてdaemonの再起動とかも目論む。
- nginx
- supervisor
daemontoolsを使おうと試してたけど、色々面倒になってsupervisorにした。
gitのリモートリポジトリ設置
内容としては以前書いたこの記事と殆ど変わらない。
#git user 追加 adduser git passwd git su - git #リモートのリポジトリ設置 mkdir -p repos/WebSite.git cd repos/WebSite.git git init --bare
ローカルからサイト用のデータをpush
軽めでいいのでAmon2::Liteに。
amon2-setup.pl WebSite --flavor=Lite cd WebSite git commit -v git remote add origin git@xxx.xxx.xxx:repos/WebSite.git git push origin master
nginxをいれる
aptitude install nginx vim /etc/nginx/nginx.conf
nginx内の設定は、静的ファイルについてはそのまま渡す形にした。
http { server { server_name xxx.xxx.xxx; location / { proxy_pass http://127.0.0.1:9002; } location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) { root /home/git/www/WebSite/; index index.html; ssi on; break; } }
supervisorを導入する
supervisorのcommandから呼び出すスクリプト。git pushで更新するため、リポジトリの中に含めておく。
#!/bin/sh exec 2>&1 exec /home/git/perl5/perlbrew/perls/perl-5.12.4/bin/start_server --port=9002 -- \ /home/git/perl5/perlbrew/perls/perl-5.12.4/bin/plackup -s Starlet \ --max-workers=10 \ --max-keepalive-reqs=1 \ --max-reqs-per-child=10000 \ -a /home/git/www/WebSite/app.psgi
supervisorの導入。
su - aptitude install supervisor vim /etc/supervisord.conf ;[unix_http_server] ;file=/tmp/supervisor.sock ; (the path to the socket file) [inet_http_server] ; inet (TCP) server disabled by default port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
supervisorの設定ファイル。
- /etc/supervisord.d/webroot.ini
[program:webroot] user=git command=/home/git/www/WebSite/webroot/run redirect_stderr=true stdout_logfile=/var/log/supervisor/webroot.log stdout_logfile_maxbytes = 10MB stdout_logfile_backups = 5 autostart = true autorestart = true startsecs = 5
サービス化させる。
supervisorctl reread supervisorctl add webroot
一通りここまでやってbind時にAddress already useと出てた。ぐぐってみたところipv6周りが原因らしい。無効にしてみたところ正常動作。
supervisorctl status
webroot RUNNING
hook用スクリプトを更新
とりあえずこんなものでいいかな、という具合に。
- hook/post-receive
cd /home/git/www/WebSite;git --git-dir=.git pull; /bin/chown git:git /home/git/www/WebSite/webroot/run; /usr/local/bin/supervisorctl stop webroot; /usr/local/bin/supervisorctl start webroot;
監視もいれたいなーと思いつつも、とりあえずはこれでいいかという気分になったのでこのくらいで。
参考URL
Unityにおける日本語表示にかんするえとせとら
Unityにおける2D表現ってのは鬼門で、そこに文字の表現が加わると尚更厄介なものです。Unity自体の操作に熟知していない場合等は、ゲームオブジェクトを只管くっつけて文字っぽく見せたり等もありますが、正直スマートではないです。
日本語のスマートな表示を行う場合、以下の2パターンが考えられます。
- UI系Assetからラベルなどを使う
- UnityからiPhoneのネイティブコードを実行する
UI系Assetからラベルなどを使う
Asset StoreにはUI作成に欠く事ができないAssetが山ほど存在しており、これを巧く利用すると文字の表現もあっさりとうまくいきます。ただし、UI系Assetでの文字表現にはビットマップ化したフォントが必要になります。
ビットマップ化フォント作成ツールにも幾つかありますが、フリーな作成ツールとしてはJava製でHieroというものがあります。が、どうもバグなのか正常に動作しなくなっています。代わりにUI系AssetへのGoodな対応やら処理中に落ちたりしないという点をとって、GlyphDesignerを現在愛用しています。
そして、作成したビットマップ化フォントを使うためのUI系Assetですが、最近流行のNGUIは一押しです。ドロー系ソフトの感覚でボタンなどのサイズ・色等の調整ができます。ただ、このAssetが要求してくるHierarchy構成が少々変わり物で、すでにHierarchy構成がかっちり固まっている場合はそれなりに手間が発生してくる可能性もあり。
UnityからiPhoneのネイティブコードを実行する
iOSのUIKitを利用して日本語表示を行います。iPhoneなどで入力出来る文字が全て使えるため、多国語言語表示対応等で使える文字数に制限を入れたくない場合は必須になります。
実行に当たっては、
- ネイティブコードを書いたファイル
- ネイティブコードをUnityから呼び出すための関数を定義してあるファイル
の二つが最低限必須です。
ファイルを作成してみると分かると思いますが、実行すると Unity側レイヤ ・ UIKit側レイヤ という2つのレイヤー構成が出来上がります。ゲーム処理はUnity側のみ、UIもとい文字はUIKit側のみで扱われ、Unityからの命令が自動でUIKit側へ飛ぶことはありません(逆もしかり)。UIKit側でUnity側からの命令を個別対応するための処理を、独自に作成する必要がでてくるわけです(これまた逆もしかり)。そして、Unity側とUIKit側が自動で連携していない結果、単純にシーン遷移をするととても残念なことになります。
全ての文字表現がUIKitで出来ればそれがベストなのですが、手間を考えるとピンポイントで使うのが一番です。また、この方法はUnity側のAssetでの影響をそこまで受けません。利用範囲を狭めればプロジェクト構成が固まった後からでも導入はしやすいかもしれません。
ゲームクリエイターはじめました
Amon2::Lite + dotcloudな開発の今のところメモ
時間があるうちに、色々ためてたものを一気に作ってしまうのと、なるだけお金を使わない生活ということで只管コードを書いてます。
わりとハマりがちかなーと思える部分と、ちょっとゴージャスに作り込みをした部分を、自分用メモ兼ねて。
403ページを贅沢にする
ナビゲーションを入れたかったのでテコ入れ。
# load plugins __PACKAGE__->load_plugin('Web::CSRFDefender', { no_validate_hook => 1 }); __PACKAGE__->add_trigger( BEFORE_DISPATCH => sub { my $c = shift; if (not $c->validate_csrf()) { my $contents = $c->render('session_lost.html')->body; return $c->create_response( 403, [ 'Content-Type' => 'text/html', 'Content-Length' => length($contents), ], $contents ); } else { return; } } );
Amon2::Plugin::Web::CSRFDefenderにno_validate_hookを渡して、デフォルトで実行される403ページ生成部分を飛ばす。あとはapp.psgiに403ページ生成処理を差し込むだけ。
session storeを変える
Dotcloudのsessionが頻繁に切れてしまう場合の対応。
__PACKAGE__->enable_session( store => 'File' );
sessionが頻繁に切れてcsrf_tokenが常時空に近い状態になり、フォーム入力がままならなかったのが、これで緩和。
Amon2::Lite (0.07)にて、post(あるいはget)が405 Method Not Allowedになるケース
自分のやり方が希有なケースなのかもしれないのと、pathを書き換えれば即対応もできる、という前提で。
今確認している限りだと、一つのPathでgetとpostの両方の処理を書くと、後に書いた方がうまくmatchされないという状態になっている。
131 if (my $p = $router->match($c->request->env)) { 132 if ($p->{method}) { 133 for my $method ( @{ $p->{method} } ) { 134 if ( $method eq $c->request->env->{REQUEST_METHOD} ) { 135 return $p->{code}->( $c, $p ); 136 } 137 } 138 } else { 139 return $p->{code}->( $c, $p ); 140 } 141 my $content = '405 Method Not Allowed'; 142 return $c->create_response( 143 405, 144 [ 145 'Content-Type' => 'text/plain; charset=utf-8', 146 'Content-Length' => length($content), 147 ], 148 [$content] 149 );
app.psgiで、
get '/login' => sub { shift->render('login.html') }; post '/login' => sub { my $c = shift; ... };
としたうえで/loginに対してpostリクエストを送り、132行目の$pをDumpさせると
$VAR1 = { 'method' => [ 'GET', 'HEAD' ], 'code' => sub { "DUMMY" } };
となる。
修正をかけるにしても、Router::Simpleのほうにmethodも確認するようにpatchをあてないとダメな気がしつつ、なんかめんどくさいのでpathを変更する形でapp.psgiを修正しちゃったほうが早い気もしつつ…。
只今のモバマス模様
mobageのアイマスがスマートフォンにも対応された、というtweetを見て開始。
チーム編成
現在38lv。雪歩・美希・伊織が主力で、スキマをオリジナルキャラが埋めているという状態。雪歩+伊織+無料ガチャでは少々心もとないチーム編成だったので、オープン時にやっていた1500コインの特別ガチャを一度だけ回して美希を増員。2回以上回したら無料ガチャの効果が薄れると感じてセーブ。
進め具合
イベントをこなしたり、ランキングに地味に入ったりしたお陰で、レッスン(合成)に著しい効果をもたらすキャラが複数もらえてる。貰いすぎて手元に収めるには溢れてしまうので、まだギフトから全部は受け取ってない。
同じような有料ガチャ等を控えているプレイヤーとは割と遊べている感じ。ガチャ漬けになっているユーザのチーム編成が露骨にパワープレイすぎて、ちょっと引くこともある。
ローコストでの運用
基本的に、チーム編成に使えるポイント内で、
- 「攻撃力あるいは防御力 / コスト」のコスト対能力値が高いキャラ
あるいは
- コスト対能力値がある程度低くても、特技をもっているキャラ
をメインにチームを組むわけだけど、そうそうレアが手に入ることはないため自然と前者前提になる。
同じアイドルを特訓(合成)すると各能力が大幅に上昇するものの、合成前の二人のアイドルの能力を高めておいた方が特訓後その分強化されるので、基本的に最大まで強化しつくしてから特訓というプレイスタイル。もちろん親愛度はMAX。
手に入るアイドルが多種多様なので目移りしてしまうのだけれど、コストが6〜10くらいのアイドルをフロントメンバーに置く形にすれば、ある程度は無料プレイ中心でも底上げは可能。細かい数値の違いとかで割と迷いそうになるけれど、実際にはスキルやら属性やらの補正で、割と細かい部分は無視してもかまわないくらいの状態になるので、アイドルの好みが決め手になる。
最初に決めるプレイヤー属性と合わないアイドルを取得した場合、レアならトレード要員として、それ以外は全部レッスン要員にしてしまう感じ。
対戦
プロダクションに入っていないプレイヤーはいい鴨になる。あと、劇団ひとりも。
基本的に高レベルプレイヤーは対戦相手から外すのだけれど、たまにレベルが高いわりに防御ポイントが低いプレイヤーもいるため(防御をすてて攻撃一択タイプ)、そういったのも合わせていくと勝率とランキングもそれなりに稼げる。
同レベル帯の平均的な育て方をしているプレイヤーに対戦ふっかけると割と高い確率で負けるので、防御ポイントとレベルをよく確認しないと黒星が蓄積されやすく、そこそこ負け上等プレイになりやすい。
まとめ
負けてもロストするものが少ない(人によっては全然痛くない)こともあって、無課金で負け上等プレイも割といける。勝ちを目指し始めると、恐らくきりがない。アイドルの編成をどうするか(メガネ'sとかお姉様軍団とか)ということのほうに夢中になるほうが幸せになれるかも。