tag:blogger.com,1999:blog-73348288295633316602024-03-14T23:35:13.797+09:00とあるゲームプログラマの軌跡Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.comBlogger135125tag:blogger.com,1999:blog-7334828829563331660.post-11397199286477178622015-06-09T17:06:00.001+09:002016-02-02T10:58:43.094+09:00Cocos2d-x 2.2系でLuaを部分的に使う検索したら意外に情報が少なかったCocos2d-xでLua使う方法<br />
まずC++で作ったプロジェクトだとLua関係がimportされてないので追加する。<br />
<br />
・iOS<br />
Luaの空プロジェクト作って、luaフォルダを同じようにimportしてやるのが一番早い<br />
luajit(Luaをバイナリコードするやつ)が古いため64bitに対応していないので、3.6からluajitをコピー<br />
Build SettingsのHeader Search PathsとLibrary Search Pathsにlua系を追加<br />
<br />
・Android<br />
こっちもluajitを3.6についてるバージョンに上書き<br />
Android.mkに以下を追加<br />
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_lua_static<br />
<div>
<div>
$(call import-module,scripting/lua/proj.android)</div>
</div>
<div>
<br /></div>
<div>
・あとは普通にLuaEngineから読み込める</div>
<div>
<div class="p1">
<span class="s2">CCLuaEngine</span><span class="s1"> *engine=</span><span class="s2">CCLuaEngine</span><span class="s1">::</span><span class="s3">defaultEngine</span><span class="s1">();</span></div>
<div class="p1">
<span class="s2">string</span><span class="s1"> luaFile=</span><span class="s3">CCFileUtils</span><span class="s1">::</span><span class="s4">sharedFileUtils</span><span class="s1">()-></span><span class="s4">fullPathForFilename</span><span class="s1">(</span><span class="s5">"script.lua"</span><span class="s1">);</span></div>
<div class="p2">
<span class="s4">engine-></span><span class="s8">executeScriptFile</span><span class="s4">(luaFile.</span><span class="s7">c_str</span><span class="s4">());</span></div>
</div>
<div>
<div class="p1">
<span class="s2">lua_State</span><span class="s1"> *L=engine-></span><span class="s3">getLuaStack</span><span class="s1">()-></span><span class="s3">getLuaState</span><span class="s1">();</span></div>
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1">こっから先は <a href="http://giginet.hateblo.jp/entry/2012/10/10/070651" target="_blank">ココらへん</a> で詳しく乗ってます</span></div>
<div class="p1">
<span class="s1"><br /></span></div>
</div>
Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com1tag:blogger.com,1999:blog-7334828829563331660.post-57384113282298061112015-01-22T13:56:00.002+09:002015-01-22T13:57:15.335+09:00Elastic BeanstalkでSSL証明書を設定ものすごく簡単だった。<br />
大体 <a href="http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/InstallCert.html" target="_blank">ココ</a> に書いてあるんだけど、この手のヘルプアレルギーの人向けに簡単に書くと<br />
<br />
・SSL証明書取得<br />
・awsコマンドインストール(今の所管理画面からは追加出来ないっぽい)<br />
・aws configureでawsアカウントを設定<br />
・awsコマンドでアップロード(ファイルに file:// を付けるのが必須なのがポイント)<br />
・Elastic Beanstalkに管理画面からconfigurationから<span class="type-weight-bold type-size-medium color-text-dark-grey card-title ng-binding">Load BalancingでHTTPS(443)を有効化+さっきアップロードした証明書を選択</span><br />
<br />
<span class="type-weight-bold type-size-medium color-text-dark-grey card-title ng-binding">以上。 </span><br />
<br />
<br />Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-74673359150996415282014-11-11T14:09:00.004+09:002014-11-11T14:09:51.282+09:00cocos2d-x v2系の64bit対応についてiOSアプリでは2015年から64bit対応が必須になります。<br />
cocos2d-xのv3系は64bit対応しているので問題ないのですが、v2系はそのままでは使えません。<br />
v2>v3のアップデートは結構な手間もかかりますし、v2時のオレオレ実装等もあるかと思います。<br />
公式にも要望が出て、次回のバージョンでFix&とりあえず緊急対応法が上がっています。<br />
<br />
<a href="http://discuss.cocos2d-x.org/t/64-bit-and-ios-8-requirements-for-new-apps/17797/28" target="_blank">http://discuss.cocos2d-x.org/t/64-bit-and-ios-8-requirements-for-new-apps/17797/28</a><br />
<br />Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-37945775379172930632014-10-22T14:36:00.002+09:002014-10-22T14:36:18.312+09:00OSX Yosemiteアップグレードに伴うetcYosemiteにして色々困ったものなど。<br />
<br />
・JAVAが(また)居ない<br />
<a href="http://support.apple.com/kb/DL1572" target="_blank">公式</a>からダウンロードしてインストール<br />
<br />
・Apacheのユーザディレクトリがはずれている(ついでに自動起動からも外れている)<br />
<a href="http://dogstar-cocolog.tea-nifty.com/blog/2014/10/imac-os-x-yosem.html" target="_blank">ココ</a>にユーザディレクトリを復活させる方法がのってます。<br />
起動方法やら自動起動やらは<a href="http://blog.offline-net.com/2014/01/19/mavericks-apache-php-mysql-devel/" target="_blank">ココ</a>を参照<br />
<br />
・なぜかネットワークの設定がリセットされてた<br />
普通に再設定で解決<br />
<br />
大きなトラブルはなさそう、Adobe系のソフトは色々あるみたいですがとりあえずCCの最新版にしたら今の所問題なさそう。<br />
前はアップグレードした時にSSDの容量がガッと空いたのですが今回はわりかし減ったような感じがします。<br />
Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-75294824799881622452014-09-30T10:51:00.004+09:002014-09-30T10:51:54.484+09:00最近のAdobeAIRでiOSアプリについていつからかわかりませんが、Xcode6になったあたりから申請時に以下のようなエラーが出るようです。<br />
<br />
RROR ITMS-9000: "Invalid Segment Alignment. This app does not have
proper segment alignment and should be rebuilt with the latest version
of Xcode. Please contact Developer Technical Support if you need further
assistance."<br />
<br />
SDK内のld64を更新してやればOKのようです。<br />
cd <sdk>/AirSDK/lib/aot/bin/ld64</sdk><br />
<sdk>mv ld64 ld64_orig</sdk><br />
<sdk>ln –s /usr/bin/ld ld64
</sdk><br />
<sdk><br />
詳しくは<a href="https://forums.adobe.com/message/6763023#6763023" target="_blank">コチラ</a></sdk><br />
<sdk><br />
</sdk><br />
<sdk>よく仕様が変わったりするのでAIRみたいな外部ツールでビルドするのはなかなか手間がかかりますね。</sdk><br />
<sdk>最近はアプリをAIRで作ることはないのですが、過去のアプリがiOS8で動かなかったりしてちょいちょい手のかかる子になっております。</sdk><br />
<sdk><br />
</sdk><br />
<sdk>
</sdk>Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-82942310579681206662014-09-25T09:39:00.000+09:002014-09-25T09:39:13.175+09:00Xcode6のiOSシミュレータ保存場所すぐ忘れるんでメモがてら。<br/>
Xcodeのバージョンが上がる度に保存場所が変わるiOSシミュレータですが、今回は<br/>
<br/>
/Users/[username]/Library/Developer/CoreSimulator/Devices/[deviceId]/data/Containers/Data/Application/[applicationId]<br/>
<br/>
みたいな感じで保存されてます。<br/>
前はOSのバージョンで区切らてて、シミュレータの機種を変更してもOSが同じならデータは同じものを使用する感じだったんですが、<br/>
OS、機種毎に別れるようになりました。<br/>
<br/>
バージョンアップしても前のデータは残っているので、容量きつい場合は消してしまいましょう。<br/>
前のデータパスは<br/>
/Users/[username]/Library/Application Support/iPhone Simulator<br/>
以下にあります。<br/>
Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-43025289558850083782011-03-28T17:47:00.002+09:002011-03-28T18:01:53.741+09:00FlexでiOSアプリを作ってみた。AdobeAIR2.6も公開され、AIR for iOSも公式に実装される形になりました。<br />というわけでFlexでiOSアプリを作ってみます。<br />なぜFlexかというと、Flashはタイムラインの概念がどうにもわかりにくく扱いきれてないので・・・<br /><br />必須なものはAIR2.6SDKとiOSのデベロッパー登録のみです。<br /><a href="http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f3cb56e2a12cc36970aa-8000.html">コレ</a>を参考に。<br />FlashBuilderなんかがあるとビルド設定あたりは勝手にやってくれるので楽です。<br />FlashBuilderに最新版のSDKをいれ、新規アプリケーションを作成します。<br /><br />はじめはWindowedApplicationが親になっているので、こいつをApplicationに変更。<br />BorderContainerにLabelいれただけでのHelloWorld作ります。<br /><br />FlashBuilderであれば自動的に「プロジェクト名-app.xml」ファイルが出来ているので、これの中身を編集。<br />とりあえずiPhoneの部分を活かし、supportedProfilesをmobileDeviceに。<br />FlashBuilderが勝手にコンパイルしてくれるので、出来たswfとxmlを使ってadtでipaファイルにコンパイル。<br />ipaファイルができたらiTunesのAppに放りこんで実機と同期。<br /><br />サクっとiOSアプリが完成しました。<br />特にFlexアプリケーションでも問題なく動くようです。<br />これを登録するときはApplicationLoaderを使うのかな?<br /><br />アプリの方は若干起動が重い感じがしますが・・・。Flexベースなせいでしょうね、きっと。<br />Flashちゃんとやらないとなぁ・・・ああめんどくさい><<br />cocos2d for Flashとかあればいいのに!<br /><br />でもこれでWin,Mac,Android,iOSとワンソースでいけるのはなかなか魅力的ですね!<br />あとはAirのランタイムが初回起動時にネット接続必須なのがなんとかなってくれるといいんだけどなぁPonytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-88092005164318943362011-03-23T10:28:00.003+09:002011-03-23T10:48:29.623+09:00xcode4+cocos2dでiPhoneアプリを申請してみた新MBPに乗り換え、xcode4+iOS4.3も正式リリースになったという事で移行した際にはまった事など。<br /><br />・missing fileが出まくる<br />svnを使用していて、svn deleteせずにファイルだけ消えている状態になると出るっぽい。<br />ビルドには問題ないけどwarningが出まくってるのは気分的によろしくない。<br />該当ファイルをsvn deleteしてプロジェクトを開きなしたら治った。<br /><br />・iOS4.3 simulatorでエラーが出る<br /><a href="http://www.cocos2d-iphone.org/forum/topic/14449">ココ</a>とか<a href="https://devforums.apple.com/message/397038#397038">ココ</a>によると皆なってるっぽい。<br />実機の4.3では問題なく動作するので気にしない事にする。<br />xcode4 templateで改善したのかもしれない。<br /><br />・Distribution<br />xcode4ではアプリケーションローダーが不要になり、xcode4内で完結出来るようになっている。<br />アップの仕方は<a href="http://iphone-app-developer.seesaa.net/article/190448941.html">ココ</a>らへんを参考に。<br />cocos2dの旧プロジェクトをそのまま移行した場合、そのままではvalidateでエラーが出る。<br />メインプロジェクトとcocos2dのターゲット両方がインストールされる指定になっているので、プロジェクトツリーからプロジェクトを選択>TARGETSのcocos2d librariesを選択>Skil InstallをYESにする事で回避。<br /><br /><a href="http://www.cocos2d-iphone.org/archives/1412">cocos2d xcode4 template</a>では修正されてるのかな?<br /><br />ついでにcocos2d 0.99.5であった<a href="https://github.com/cocos2d/cocos2d-iphone/commit/956df4c511362b9defbe23daef3a561d9a1ebd55">BUG FIX</a>を適応してアップ。<br />このバグ確認出来なかったけど、これでアプリケーションクラッシュが改善されるといいなぁ<br /><br />・新MBP<br />なんかSSDが早く感じる。VAIOのSSD*4 RAIDと比べても遅いとか思わない。<br />プロジェクト内の文字列検索とかいつ検索したの?ってぐらい早い。<br />ビルドも早いんだけど、その分実機への転送が遅く感じる、特に3G世代(´・ω・`)Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-17470966923587735702010-09-14T15:45:00.002+09:002010-09-14T16:08:31.107+09:00iOS4.1の目玉(?)GameCenterを使ってみた・その1iOS4.1がリリースされ、GameCenterが正式に稼働となりました。<br /><br />あんまり期待してなかったのですが、なんだかドキュメントを読んでいたら意外におもしろそうな感じ。<br />単純なスコアランキングから、条件達成、自動対戦マッチにフレンド機能と、自前サーバいらずな感じになりそう。<br />(どうせならアイテム課金の管理もAppleでやってくれたら完璧なのに・・・)<br /><br />ちょうどスコア系のゲームをつくっていたので慣れない英語を必死に読みながら実装してみた。<br /><br />・iTunesConnectにアプリケーションを登録する<br />登録必須です、スクリーンショットとか検索キーワードとか先に入れるの面倒ですが、後から変更出来ますのでとりあえず作っちゃいましょう。<br />登録したら、Manage GameCenterから、GameCenter Testingを有効にする。<br />Leaderboard(ハイスコア)とAchievements(条件達成)がセットアップ出来るので設定しておく。<br /><br />・プロジェクトの設定<br />対象のプロジェクトにGameKitをLinkする。<br />GameKit/GameKit.h をインポートする。<br />ビルトプロパティの識別子をアプリケーションで設定したものと同じにする。(jp.co.hoge.application)<br /><br />・稼働しているデバイスがGameCenterに対応しているか調べる<br />サンプルコードの isGameCenterAvailable に該当<br /><br />・ユーザを認証する<br />サンプルコードの authenticateLocalPlayer に該当<br />ゲーム中にバックグラウンドでログアウトしたりする可能性があるので、GameCenterでの処理を行う前には必ず行う。<br /><br />・スコアの登録<br />サンプルコードの reportScore に該当<br /><br />・ランキングの表示<br />一般的なGameCenter用の表示と、カスタムでスコアだけ取得して自分で描画するパターンがある。<br />統合されたインターフェースで十分だったので、一般的な表示を使おうと思ったんだけど、cocos2dだとここがちょっと面倒に。<br />GKLeaderboardViewControllerDelegate を持つ UIViewController クラスを作成して、CCDIrector の openGLView に addSubview して解決。(超適当)<br />詳しくは<a href="http://www.cocos2d-iphone.org/forum/topic/9450">ココ</a>らへんを参照<br /><br /><br />とりあえずこんだけでランキングに登録、表示が可能になりました。<br />フレンドとかはGameCenter側で出来る話なので気にすることもなし。<br />オンラインマッチに関しては<a href="http://blog.livedoor.jp/abars/archives/51894994.html">エイバースの中の人</a>が詳しく紹介されてます。<br /><br />あれ、その1で完結しちゃった。<br />Achievements触ってみてなんかあれば続きでも・・・Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com1tag:blogger.com,1999:blog-7334828829563331660.post-80939050682952055332010-08-31T16:18:00.001+09:002010-08-31T16:23:34.078+09:00Flexで丸画像とかFlexで四角以外のアイテムを生成するときのお話<br />忘れそうなのでメモメモ<br /><br />丸画像に対してイベントを取得したい時など、Imageを使うと四角の領域でイベントが取得されます。<br />コンポーネントに対して mask 処理をしてやることで、任意の領域のみイベントの対象とする事が出来ます。<br /><br />詳細は<a href="http://cookbooks.adobe.com/post_Rounded_Image-6502.html">コチラ</a><br />Imageを拡張したクラスを用意して、 cornerRadius プロパティを追加。<br />描画更新時(updateDisplayList)に、cornerRadius の値からマスクを作成してセット。Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-38709834928160032942010-08-26T10:52:00.002+09:002010-08-26T11:09:29.634+09:00cocos2dで日本語をCCBitmapFontAtlasで使うにはちょっとはまったんでメモメモ<br /><br />cocos2dでは文字の表示に CCLabel という簡単なものがあるのですが、これが結構な重い処理となります。<br />スムーズな動作を必要とするゲームなどでは、BitmapFontを使うと良いです。<br />(逆にADV系など速度を要求しないものであればCCLabelでおk)<br /><br />現時点(cocos2d v0.99.4)では標準のままでは使えません。<br />公式フォーラムの<a href="http://www.cocos2d-iphone.org/forum/topic/8361">コチラ</a>で問題点が指摘されています。<br /><br />プロジェクト内の cocos2d Sources > cocos2d > CCBitmapFontAtlas.h を編集します。<br /><br />kCCBitmapFontAtlasMaxChars = 2048<br />を<br />kCCBitmapFontAtlasMaxChars = 65536<br />に変更<br /><br />BitmapFontを作る方法ですが、<a href="http://www.n4te.com/hiero/hiero.jnlp">Hiero Font Editor</a>というのと<a href="http://www.angelcode.com/products/bmfont/">BMFontGenerator</a>というが推奨されているようです。<br /><br />BMFontはWindowsでしか動かないので、とりあえずhieroを使ってみたんですが、どうもうちではうまく動作してくれませんでした。<br />(出力画像が天地左右反転されたり、出力対象がコピペできなかったり、一度出力すると変更して二度目の出力が出来なかったり)<br /><br />なのでBMFontを使ったやり方を紹介します。<br /><br />・必要な文字を含んだテキストファイルを作成(UTF-16で保存)<br />・Edit -> Select chars from file で上記ファイルを選択<br />・Export OptionsでBit depth を 32、png 出力<br />・Font Settingsで Font smoothing を選択<br /><br />色などはお好みで、cocos2d側でも変更が効くので特に気にする必要もないと思います。<br />これで出力された .fnt ファイルを CCBitmapFontAtlas で読み込んでやればBitmapFontで描画されます。Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-3306230592170838722010-08-04T13:55:00.000+09:002010-08-04T13:56:26.655+09:00今そこにあるpaypalpaypalが日本での本格展開を始めると言う事で、早速使ってみた。<br /><br />使い始めるまでの準備をザックリと。<br /><br />1.Paypalにサインアップする。<br />本番用と練習用(sandbox)では、別々にアカウントをセットアップする必要があるので注意。<br /><br />2.sandbox内で使えるアカウントを作成する。<br />テンプレで作成出来るが、日本語アカウントはマニュアルで作るしかない。<br />ビジネスでセットアップすれば架空のカード番号が入力されるので、そのままセットアップする。<br /><br />3.APIのアカウントを取得する<br />個人設定>APIアクセス>オプション2のAPI証明書を取得する<br /><br />4.エクスプレスチェックアウトを有効にする<br />上と同じ所から有効にできる。<br />レガシーなウェブペイメントorメール決済を使う場合は必要ない、けどエクスプレスチェックアウトを推奨<br /><br /><br />上記に加え、本番アカウントならカード認証やら口座設定やらをしておく。<br /><br />新しくはじめるなら、paypalのAPIに対応したカートを使うのが一番簡単。<br />APIのアカウントを設定するだけでいけるはず。<br /><br />それではおもしろくない(?)ので、一からAPIをつついてみた。<br />APIではSOAPとNVP(Name-Value-PairただのPOST通信)が使えるらしいので、もっとも汎用的っぽいNVPをチョイス。<br /><br />APIのURLや詳細はまずそうなので伏せるとして、流れは以下の通り。<br /><br />1.SetExpressCheckout<br />今から支払いスルヨー!とpaypalに宣言する。<br />オプションでアカウント不要とか、画面表示を変えたりとか出来る。<br />APIコールに問題なければTOKENが返ってくるので、ユーザ向けページへTOKENを付けてリダイレクトする。<br /><br />2.GetExpressCheckoutDetails<br />指定した戻り先のページに戻ってきたら、このAPIを実行。<br />ユーザがpaypalのページで入力した情報を取得する。(住所とか。クレジットカード番号は取得不可。)<br /><br />3.DoExpressCheckoutPayment<br />決済処理の確定。<br /><br /><strike>だんだんめんどくさくなってきたので</strike>この辺で終了。<br />paypalの利点は、他社に比べて圧倒的に安い事と、始めやすい(オンラインだけですぐ始められる)事でしょうか。<br />欠点としては日本での認知度の低さや、わかりにくさ(決済ページが英語表示、ユーザが日本語表示に切り替える必要がある)でしょうか。Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-91641840752931236512010-06-24T14:23:00.002+09:002010-06-24T14:32:56.676+09:00iOS3のプロジェクトをiOS4に対応してみるiOS4が正式に公開されたので、プロジェクトをアップデートしてみるテスト<br /><br />iPhoneDevよりxcode 3.2.3 finalをインストール<br />古いxcodeやiPhone simulatorが立ち上がってたら落としておくこと。インストールに失敗する事があるので落としておく。<br />iTunesも途中で落とせと言われるので先に落としておくのが吉。<br /><br />とりあえずそのまま以前のプロジェクトを実行してみる>エラー>あるある<br /><br />UIView.h等で以下のようなエラーが多発<br />syntax error before '^' token<br /><br />なぞい、コンパイラをGCC4.2からLLVM GCC4.2に変更すると回避出来るけど・・・<br />再度ビルド>エラー>ですよねー<br /><br />今度はSBJSONでエラーが出てる<br />とりあえず最新版を落としてドキュメントを読んでみると、インストール方法が変わったらしい<br /><br />追加SDKとリンカグラグをはずして、最新のオススメインストール方法(クラスコピーするだけ)に戻したらさっくり動いた<br />コンパイラの設定をGCC4.2に戻しても問題なし、と。なんだよ、ちょっと焦っちゃったヨ。<br /><br />なんでJSON-Frameworkとか使ってないプロジェクトはそのままでいけると思う。<br />cocos2d(v0.99.3)に関しては今の所問題無し。<br /><br />お次は実機に・・・と思ったらプロビジョニングされた実機がつながってないよ、と<br />どうやら実機をiOS4にアップデートしたら別物として認識されているっぽい<br />xcodeのオーガナイザからIdentifierをコピーして・・・と思ったら「デバイスを開発で使う」みたいなボタンが出ていたので押してみる。<br />iTunesConnectのIDをきかれ、xcodeからデバイスの登録が完了!<br />xcode上でiTunesConnectと連携出来るのね、これはイイ改良<br /><br />HPから確認してみるとTeam Provisioning Profile: *というのが追加されていた<br />とりあえずこの状態で実機の動作確認もOK<br /><br />シミュレータで注意しないといけないのが、HOMEボタンで終了ではなくなったので、HOMEおしてもタスクは実行中ということ(3G実機では終了されるけどね :p)<br />ここで新しいイベント(applicationDidEnterBackground)が飛ぶので、必要ならば処理を追加する。<br /><a href="http://d.hatena.ne.jp/kamiyan2/20100623">コチラ</a>に日本語で詳しい内容がアップされています。<br />どうやらapplicationWillTerminateが呼ばれずに終わる事もあるそうで・・・?(本体ないし未確認)<br />終了処理はちょっと気を付けた方が良さそうです。<br /><br />当面はiPhoneシミュレータを見ながらiPhone4が手元に届くのを待っています・・・Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-49099027480842534752010-04-23T10:43:00.003+09:002010-04-23T10:46:38.195+09:00iPhoneでバイブレーションを作動させる<pre name="code" class="java:nocontrols"><br /><br />#import <AudioToolbox/AudioToolbox.h><br /><br />AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);<br /></pre><br /><br />AudioToolBoxをインポートして AudioServicesPlaySystemSound を呼ぶだけ・・・<br />Twitterでつぶやける程のコード量で拍子抜けしたwPonytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-89227789284318020292010-04-09T14:43:00.003+09:002010-04-09T14:47:00.762+09:00Flex 自分メモ・FlexBuilderでプロジェクトのプロパティ画面(Flexビルドパスなど)が表示されない時は、境界線をちょっと移動すると表示される。<br /><br />・サイズが%指定の領域内でスクロールさせたい場合(VBox 100%など)は minHeight=0 を指定しておく<br /><br />・ListのItemRendererでTextAreaなどを使用し、行数が増える場合データは正しく更新されるが、表示ははじめの行数のまま増えない。<br />この場合は itemRenderer="mx.controls.Text" を指定してやれば良い。<br /><br />以上、メモ投稿Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-58605867661781193032010-04-06T16:09:00.006+09:002010-04-06T16:26:26.039+09:00iPhoneおアプリ内課金について・その1iPhoneでアプリ内課金をするのに色々と面倒だったのでまとめておく<br /><br />概念とかは<a href="http://developer.apple.com/jp/iphone/library/documentation/NetworkingInternet/Conceptual/StoreKitGuide/StoreKitGuide.pdf">StoreKitガイド</a>辺りで把握出来ますので、実際にコードに組み込む辺りを。<br /><br /><br />・まずはプロジェクトにStoreKitFrameworkを追加する。<br />プロジェクトの編集>一般>リンク済みライブラリの「+」から StoreKit.framework を選択して追加<br />なぜかリストには反映されないが、動作しているので気にしない<br />これってiPhoneアプリ的には常識なんでしょうかね・・・まったく知らなかったんでここに来るのすら苦労しましたw<br /><br />・下準備<br /><br />#import <StoreKit/StoreKit.h><br /><br />して、クラスに <SKProductsRequestDelegate> を追加する<br /><br />こんな感じ<br /><pre name="code" class="java:nocontrols"><br /><br />#import <StoreKit/StoreKit.h><br /><br />@interface TestLayer : NSObject <SKProductsRequestDelegate> {<br />}<br />@end<br /><br /></pre><br /><br /><br />・購入するアイテムの情報を取得<br /><br />SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"PRODUCT_ID"]];<br /><br />PRODUCT_IDはitunes connectで指定したものをあてる。<br />通信中の処理待ちなどはアプリ側で各自実装、リクエストが終わると productsRequest がコールされる<br /><br /><pre name="code" class="java:nocontrols"><br /><br />-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {<br /> // プロダクトの取得<br /> SKProduct *product = [[response products] lastObject];<br /> <br /> // アイテムのタイトル<br /> NSLog(@"%@",product.localizedTitle);<br />}<br /></pre><br /><br />request は requestDidFinish で解放してやりましょう<br /><br /><pre name="code" class="java:nocontrols"><br /><br />- (void)requestDidFinish:(SKRequest *)request {<br /> [request release];<br />}<br /><br /></pre><br /><br />itunes connectへ課金アイテムの登録がうまくいっていれば、この時点でアイテムの名称がログに出力されます。<br />後は SKPaymentQueue の使い方と、テストユーザでの購入の仕方、その際のTIPS等Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-91484783701696071132010-03-21T08:15:00.003+09:002010-03-21T08:17:41.663+09:00iPhoneアプリはじめましたというわけで無事Appleの審査も通りAppStoreへ公開されました!<br /><br />アプリのダウンロードは以下より<br /><a href="http://itunes.com/apps/scratchgirl">ScratchGirl</a><br /><br />無料アプリなんで良かったら遊んでみてください :)Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-88665833656709752072010-03-11T10:28:00.002+09:002010-03-11T10:50:27.866+09:00AppStoreへ申請するアプリにjson-frameworkを使用している場合の注意点AppStoreへアプリを登録する際に、嫌というほど目にする以下のエラー<br /><br />The binary you uploaded was invalid. The signature was invalid, or it was not signed with an Apple submission certificate<br /><br />基本的にはCodeSign系のエラーですが、その他のエラーもすべてこれで帰ってくるもよう。<br />Webで調べたら以下のような症状があった。<br /><br />・Developerの証明書でビルドしていた<br />・Distribution or Provisioningの証明書の有効期限が切れていた(それぞれ別の有効期限になるので注意)<br />・Info.plistのBundle identifierが登録した内容と違っていた<br />・プロジェクト>アクティブターゲット"あぷり名"を編集>プロパティ>識別子 がInfo.plistのBundle identifierと一致しなかった(基本的には同期するはずなんだけども・・・)<br />・アイコンファイルのサイズが57x57ではなかった、また24bitでなかった(これに結構ひっかかってた・・・24bitのPNGでもMacのプレビュー>インスペクタではビット深度8と表示される)<br />・コード署名IDの設定を、プロジェクト>プロジェクト設定を編集 から行った(必ず、アクティブターゲット"あぷり名"を編集 から行った方が良いです)<br /><br />Xcodeのビルドは基本的に差分ビルドなので、Distributionの場合は毎回クリーンした方が良いです。<br />そして、Xcode自体にもなんやらキャッシュっぽい感じで設定が残るようです。<br />公式にもありますが、いったんCodeSignをはずして、クリーンしてフォルダも消して、Xcodeを再起動してCodeSignを当てなおすとうまく行くとかあるようです。<br /><br />で、色々やった結果全部だめだったので途方にくれていたのですが、ふと使用しているライブラリのCodeSignとかどうなるんだろと思って調べたら、これがビンゴでした。<br /><br />cocos2dとjson-frameworkを使ったのですが、cocos2dは特に設定無しで問題ないもよう。<br />json-frameworkでは、<a href="http://code.google.com/p/json-framework/issues/detail?id=18">2.2の頃にCodeSign系のなんやら</a>があったようで、以下の設定をすると良いとの事でした。<br /><br />「アクティブターゲット"あぷり名"を編集」から「コード署名リソース・ルールパス」に、$(SDKROOT)/ResourceRules.plist を入力<br /><br />説明には「ビルド実行可能ファイルのコード署名後に変更する有効な理由のあるファイルを除外するために、オプションで使用されます」とありますので、なんかの理由があるんでしょ、きっと。<br />2.2の頃の話+AdHocや実機デバッグでは問題なく動いていたので、マサカネーと思いつつアップしたらあっさりと通りました(><)<br /><br />そんなわけで、転職しましてWebプログラマじゃなくなっていたりします。(Webアプリも書いていますが・・・)<br />無料アプリなので審査が通ったら公開致します :)Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-87020700944505028902010-02-04T11:34:00.004+09:002010-02-04T11:38:01.297+09:00C#でiPhoneアプリを作ってみた!C#や.Net Frameworkを使ってiPhoneアプリを開発出来るという<a href="http://monotouch.net/">MonoTouch</a>を使ってみた<br /><br />まず<a href="http://mono-project.com/Downloads">MonoFramework</a>と<a href="http://monodevelop.com/Download/Mac_MonoTouch">MonoDevelop</a>をダウンロード&インストールする。(共にMac版)<br />次にMonoTouchのSDKを<a href="http://monotouch.net/DownloadTrial">ダウンロード</a>する<br />上記2つは無料らしい、MonoTouchは有料だけどTrial出来るので今回はそれで試してみました<br /><br />あ、もちろんiPhoneSDKは必須です。AppleIDを取得すれば無料でダウンロード可能<br /><br />全部インストールした所でおもむろにMonoDevelopを起動、、、はい、文字化けしてます<br />ぐぐると早速<a href="http://kki-zakki.blogspot.com/2008/12/monodevelop-20-alphamac-os-x.html">答え</a>があったので設定します<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0rMCFhghdrKS7c99hbLuuFaZpKmLCCTY9Wn_CwAjeX566ZjpSO1mXuNcH2-mXDHcURzQ5KWOkxAiOzvE1W9ZlEL0d4umesgQvDZZ_8_7XkrQZAv2MYZSXhFLA7rxKSW0lXQR2KZEOsf4/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0rMCFhghdrKS7c99hbLuuFaZpKmLCCTY9Wn_CwAjeX566ZjpSO1mXuNcH2-mXDHcURzQ5KWOkxAiOzvE1W9ZlEL0d4umesgQvDZZ_8_7XkrQZAv2MYZSXhFLA7rxKSW0lXQR2KZEOsf4/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5434211354810715810" /></a><br /><br />はい、バッチリ日本語でました<br />とりあえず公式の<a href="http://monotouch.net/Tutorials/MonoDevelop_HelloWorld">チュートリアル</a>を進めてみます<br /><br />ファイル>新規>ソリューション で テンプレートから C#>iPhone を選択<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyPgecAc8JAU4yjkL59xuU0EAEcLsRZl31m5JIk7Is_Bt97TSPwO_JALdpUpwMal-h1BhyphenhyphenPZ4yChcvE3AE3yvyltqni3S6LZqzR-4vQZouUX9B5eDr73JB_eirkyRIWILn6QHr5bhynlM/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 235px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyPgecAc8JAU4yjkL59xuU0EAEcLsRZl31m5JIk7Is_Bt97TSPwO_JALdpUpwMal-h1BhyphenhyphenPZ4yChcvE3AE3yvyltqni3S6LZqzR-4vQZouUX9B5eDr73JB_eirkyRIWILn6QHr5bhynlM/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5434211477407205522" /></a><br /><br />早速使えるテンプレートが増えているようです、今回はHelloWorldなんで、iPhone Window-based Projectでいってみましょう<br />とりあえず作成しただけの状態で実行してみます・・・<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNnFMtrfiV8gMqkAQbb4sLMFQNE64xos3zt0PpxOjQKr-3-0eVjg1wV32W7tSAzZ6Sk47zIjJJlkunLd7ntRE2N4ESki98Hsixna6GfYOi47SHvkN4YfF59pDT5xboEUDBzuBa9QaF38Y/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 172px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNnFMtrfiV8gMqkAQbb4sLMFQNE64xos3zt0PpxOjQKr-3-0eVjg1wV32W7tSAzZ6Sk47zIjJJlkunLd7ntRE2N4ESki98Hsixna6GfYOi47SHvkN4YfF59pDT5xboEUDBzuBa9QaF38Y/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5434211585527111730" /></a><br /><br />iPhone Simulatorが立ち上がってまっしろな画面が出ました、ここまでは良好ですね。<br />生成されたプロジェクトの MainWindow.xib をダブルクリックすると InterfaceBuilder が起動しました。<br />この辺はXcodeで作る時と同じ容量で良さそうですね。<br /><br />InterfaceBuilderで生成されたOutletやActionを、MainWindow.xib.designer.cs という自動生成されたファイルで関連付けしてくれます。<br />で作ってみたHelloWorldがこんな感じ<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieFTdyHtStQCaQNTlUagiBPCK2kfZIwFawnRYjtAm_lSsN4htY6vJDADgNH0mcEHVLLE3f-uL5pcbplh1v4KGBOJjOQ1w68DrIBYKGay0vxbIPpE54jqXXKCunzsjB16o_xUnWrIzZCaA/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+4.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 172px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieFTdyHtStQCaQNTlUagiBPCK2kfZIwFawnRYjtAm_lSsN4htY6vJDADgNH0mcEHVLLE3f-uL5pcbplh1v4KGBOJjOQ1w68DrIBYKGay0vxbIPpE54jqXXKCunzsjB16o_xUnWrIzZCaA/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5434211719527351234" /></a><br /><br />残念なところは、MonoDevelopが日本語入力出来ません・・・<br />ファイルを直接別のエディタで編集すれば日本語も使えますが、ちょっと効率悪いですね。<br />実機テストもしてみようかと思ったのですが、実機テストが出来るのは有料版のみのようです。<br /><br />C#マカーがどれだけいるのかわかりませんが、actionscript等、別の言語で作れるようになるのは非常に良い事です。<br />今後に是非期待しましょう!Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-91624823632237507752010-02-03T13:40:00.000+09:002010-02-03T13:41:09.401+09:00kumofs その5・スケールアウトしてみたkumo-serverを2台のマシンへセットアップし、色々試してみました。<br /><br />スケールアウト時のチェックポイントはserverのIPや名称等は必ず一意となるようにつける事です。<br />例えばmanagerを起動するサーバで<br />kumo-manager -v -l localhost<br />kumo-manager -v -l 127.0.0.1<br />とかやってしまうと失敗します。必ず自分のIPか一意のサーバ名としましょう。<br /><br />前回接続が不安定だったのはSpymemcachedが原因でした。<br /><a href="http://www.whalin.com/memcached/">memcached client for java</a>で接続したらエラーにならずにすみました。<br />んが、こちらの方が速度が遅いようです。<br /><br />1台から2台にした結果、速度は遅くなりました。<br />まぁ2台ではボトルネックの方が大きくなってしまうのでしょうがないですね・・・<br /><br />memcached client+2台状態での速度は以下のような感じでした。<br />Set<br />128,187ms<br /><br />Get<br />112,314ms<br /><br />どちらも大体同じくらいの速度で安定して動きました。<br />SetはHSQLDBより遅くなりましたね・・・<br />GetをチューニングしたらHSQLDBが最速になるかな??と思って試してみました<br /><br />Indexあり HSQLDB Get<br />637,811ms<br />622,084ms<br /><br />Indexなしより4倍ぐらい早くなりましたが、kumofsと比べるとだいぶ遅いですね。<br />CouchDBより微妙に遅い程度なので、Grailsの中だけで使うDBという割当にCouchDBは向いていません。<br /><br />続いて障害時の検証<br /><br />memcached clientには複数のmemcachedをPoolして使う機能があります。<br />なのでkumo-gatewayを二つたてて二つをPoolして使ってみました。<br /><br />マシン構成<br />server1 - kumo-manager , kumo-server , kumo-gateway<br />server2 - kumo-server , kumo-gateway<br /><br />・すべてが稼働している状態からserver1or2のkumo-gatewayを落とす<br />正しく取得出来たり、Exceptionが出たり。<br />memcached clientでは接続先が落ちているかどうかまで判断はしてくれないようです。<br />A,Bどちらを落とした場合でも結果は同じです。<br /><br />・すべてが稼働している状態からserver1or2のkumo-serverを落とす<br />何事もなかったかのように動作しました。<br /><br />・片方のkumo-serverしか動いていない状態で、データを追加or変更し、落ちているkumo-serverを復旧させる<br />復旧した時点では not attached になっていますので、Aのマシンからattachします<br /><br />kumoctl server1 attach<br /><br />attach時にReplicationが行われ、アプリケーションからは常に変更後のデータが取得されます。<br />もちろんノンストップでいけます。<br /><br />という事で、memcached clientのPoolは使わずに、公式のオススメどおりwebアプリとkumo-gatewayを1:1にし、kumofs側で障害対策をするのが良いようです。Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-16680504061234727652010-02-01T17:25:00.005+09:002010-02-01T17:53:11.498+09:00kumofs その4・速度比較してみたGrailsから kumofs と couchDB で速度比較してみました。(ついでにRDBMSも)<br />対象データは全国の郵便番号(12万件)をキーに住所を入力しています。<br /><br />kumofs+spymemcachedでは、大量のデータをいっぺんに投げると接続が不安定になります。<br />一応接続方法を DefaultConnectionFactory から、KetamaConnectionFactory (蹴球?)に変えたら多少良くなったような気がしました。(が、たまにエラーでます)<br /><br />やり方は前回のサービスの一部を変更↓<br /><br /><pre name="code" class="java:nocontrols"><br />def void afterPropertiesSet() {<br /> memcachedClient = new MemcachedClient(new KetamaConnectionFactory(60000,60000), AddrUtil.getAddresses("localhost:11211"))<br />// memcachedClient = new MemcachedClient(AddrUtil.getAddresses("localhost:11211"))<br />}<br /></pre><br /><br />コメントアウトしたところが元のソースです。<br />念のためバッファ等もあげてあります。<br /><br /><br />CouchDBはRESTですべて行えるので、Grailsからはサクサク使えるのですが、Java用のライブラリがあったので試してみました。<br />勢いのある<a href="http://code.google.com/p/jcouchdb/">jcouchdb</a>を使っています。<br /><br />インポートはこんな感じで書きました<br /><pre name="code" class="java:nocontrols"><br />Database db = new Database("localhost", "postal");<br />def doc=new BaseDocument()<br />doc.setId(key)<br />doc.setProperty("val",val)<br />db.createDocument(doc);<br /></pre><br /><br />・結果はこんな感じ<br />データインポート<br /><table><tr><th>kumofs</th><th>CouchDB</th><th>HSQLDB</th></tr><br /><tr><td style="width:120px;text-align:right;">21,917ms</td><td style="width:120px;text-align:right;">980,457ms</td><td style="width:120px;text-align:right;">41,883ms</td></tr><br /><tr><td style="width:120px;text-align:right;">18,785ms</td><td style="width:120px;text-align:right;">1,008,333ms</td><td style="width:120px;text-align:right;">33,800ms</td></tr><br /><tr><td style="width:120px;text-align:right;">18,205ms</td><td style="width:120px;text-align:right;">955,118ms</td><td style="width:120px;text-align:right;">35,256ms</td></tr><br /><tr><td style="width:120px;text-align:right;">17,387ms</td><td style="width:120px;text-align:right;">3回で心が折れました</td><td style="width:120px;text-align:right;">31,735ms</td></tr><br /><tr><td style="width:120px;text-align:right;">18,062ms</td><td style="width:120px;text-align:right;"></td><td style="width:120px;text-align:right;">32,539ms</td></tr></table><br /><br />取得した結果はこちら<br /><table><tr><th>kumofs</th><th>CouchDB</th><th>HSQLDB</th></tr><br /><tr><td style="width:120px;text-align:right;">51,357ms</td><td style="width:120px;text-align:right;">564,257ms </td><td style="width:120px;text-align:right;">2,803,802ms </td></tr><br /><tr><td style="width:120px;text-align:right;">45,988ms </td><td style="width:120px;text-align:right;">590,907ms </td><td style="width:120px;text-align:right;">2,764,875ms </td></tr><br /><tr><td style="width:120px;text-align:right;">50,615ms </td><td style="width:120px;text-align:right;">539,712ms </td><td style="width:120px;text-align:right;">2回で心が折れました</td></tr><br /><tr><td style="width:120px;text-align:right;">46,966ms </td><td style="width:120px;text-align:right;">3回で心が折れました</td><td style="width:120px;text-align:right;"></td></tr><br /><tr><td style="width:120px;text-align:right;">48,286ms </td><td style="width:120px;text-align:right;"></td><td style="width:120px;text-align:right;"></td></tr></table><br /><br /><br />・ちなみにDBの容量はこんな感じになりました。<br />元のテキスト 12mb<br />kumofs 22mb<br />couchDB 600mb<br /><br />couchDBは差分もてたりする分情報が多いのは理解出来ますが、ちょっとありえないサイズになってますね・・・<br /><br /><br />・まとめるとこんな感じ<br />(そもそも単純なKVSであるkumofsとMapReduce出来るCouchDBを比べるのも変かも知れませんが・・・あえてTokyoTryrantとかとは比べないのがうちっぽいという事で)<br /><br />速度だけでみたらkumofsが最速(安定性に不安があるけど・・・)<br />CouchDBは想像以上に遅かったですね、、、特に書き込み。<br />ってそういう見方もあるけど、CouchDB良い所はKVSやSQL文になじみのない人がチームにいても理解しやすいって所だと思います。<br /><br />RDBMS(今回はHSQL使ってます)の読み込みの遅さは正直壊れたのかと思うぐらい遅かったです・・・<br />まあINDEXもチューニングも何もしていない状態だとこんなものでしょうか。<br />そこらへんはプログラマならやって当然の事なんですが、そういう事考えなくても早いDBってのも良い物ですよね。<br /><br />次回はkumofsをスケールアウトしてみます、果たして更なる速度向上はあるのか!?Ponytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-42536795460925550412010-01-29T09:26:00.005+09:002010-02-03T13:42:03.341+09:00kumofs その3・Grailsと連携してみたGrailsからkumofsを使ってみます<br /><br />・適当な Grails アプリケーションを作成します<br />grails create-app kvstest<br /><br />・memcachedクライアントのライブラリをインストールします<br />kumofs は memcached プロトコルを使用します。<br />今回は memcached の Java クライアントである <a href="http://code.google.com/p/spymemcached/downloads/list">Spymemcached</a><br /> を使用します<br /><br />上記サイトからJARファイルをダウンロードして lib フォルダへコピーします<br /><br /><br />・やりとりをするサービスを作成します<br /><a href="http://www.ibm.com/developerworks/jp/java/library/j-memcached2.html">IBMのサイト</a>にとても良いサンプルがあるのでこれを参考にします<br />上記サイトにあるサービスがほぼそのまま使えます<br />setのタイムアウトが600と指定されているのですが、kumofsでは0しか受け付けないため、0に変更します<br /><br />*デフォルトの接続方式だと大量データでエラーが起きたので変更しました、そこらへんは次回に。<br /><br />->Spymemcachedの問題でした、解決方法は<a href="http://ponytailthes.blogspot.com/2010/02/kumofs_03.html">こちら</a>のエントリーで<br /><br />memcachedClient.set(key, 0, value)<br /><br /><br />・適当なコントローラーを作成してget,setをテストします<br />本当に適当なので割愛、SSだけ<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4WwZQAkDG6-NZWEwdKanm9cjXtcqTQFdJBOZYnpq1VxWeX74tYn0bbMd9Z8gN-NWmD7-zr79jRW-trRyIqnp63DI6jDJdnbK6p5JXCCKWic4QkI4SaLNHxKY6Y9_UPeOSKEarFCkOGSA/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 302px; height: 185px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4WwZQAkDG6-NZWEwdKanm9cjXtcqTQFdJBOZYnpq1VxWeX74tYn0bbMd9Z8gN-NWmD7-zr79jRW-trRyIqnp63DI6jDJdnbK6p5JXCCKWic4QkI4SaLNHxKY6Y9_UPeOSKEarFCkOGSA/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5431951902559595426" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQgIJui6X9JOAGL1Oka3rytmTcQvVg6vcCzIMQUYKDCk04rEz0540cMqKiESTHOsGCzp2Wb3ifDgMmeHgqu1QJYcSoi0UQlUH7tD3aJDKRZypbmvfB0PzXoNaEudROm0yz61ZbE9BrPJc/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 271px; height: 161px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQgIJui6X9JOAGL1Oka3rytmTcQvVg6vcCzIMQUYKDCk04rEz0540cMqKiESTHOsGCzp2Wb3ifDgMmeHgqu1QJYcSoi0UQlUH7tD3aJDKRZypbmvfB0PzXoNaEudROm0yz61ZbE9BrPJc/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5431951989675753746" /></a><br /><br />サクっと動きました!<br />次回はCouchDBとの速度比較なんかをやってみますPonytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-17845327426385407552010-01-28T16:33:00.001+09:002010-01-28T16:33:40.810+09:00kumofs その2・Macで起動させてみたとりあえずインストール出来ましたので、早速起動してみましょう<br />まずはkumofsの構成から<br /><br />・kumo-server <br />データノード<br />実データが保存される場所、最低1つ<br /><br />・kumo-manager<br />管理ノード<br />kumo-serverの管理を行う、1or2台<br /><br />・kumo-gateway<br />アプリケーション <-> kumo-serverのプロキシ<br />アプリケーションからは常にここを参照するため、裏のmanager,serverの構成がどんな風に変わっても問題ない<br />アプリケーションサーバに対して 1:1 で起動する<br /><br /><br />とりあえずオールインワンで動かしてみます<br />・管理ノードを起動<br />kumo-manager -v -l localhost<br /><br />・データノードを起動<br />kumo-server -v -l localhost -m localhost -s /opt/kumo/kumodb.tch<br /><br />・起動したノードを確認<br />kumoctl localhost status<br /><br />hash space timestamp:<br /> Thu Jan 01 09:00:00 +0900 1970 clock 0<br />attached node:<br />not attached node:<br /> 127.0.0.1:19800<br /><br />not attached node に登録されていますね。<br /><br />・起動したデータノードを実際に参加させます<br />kumoctl localhost attach<br /><br />・もっかい確認します<br />kumoctl localhost status<br />hash space timestamp:<br /> Thu Jan 28 14:42:43 +0900 2010 clock 152<br />attached node:<br /> 127.0.0.1:19800 (active)<br />not attached node:<br /><br />・プロキシを起動します<br />kumo-gateway -v -m localhost -t 11211<br /><br />・telnet で接続確認します<br />telnet localhost 11211<br />Trying ::1...<br />telnet: connect to address ::1: Connection refused<br />Trying fe80::1...<br />telnet: connect to address fe80::1: Connection refused<br />Trying 127.0.0.1...<br />Connected to localhost.<br />Escape character is '^]'.<br /><br />・データを入れてみます<br />set hoge 0 0 3<br />foo<br />STORED<br /><br />・データを取得してみます<br />get hoge<br />VALUE hoge 0 3<br />foo<br />END<br /><br />hoge=foo というデータが入りました!<br /><br />次回はGrailsと連携してみますPonytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-81711320328503464232010-01-28T15:18:00.001+09:002010-01-28T15:20:09.705+09:00kumofs その1・Macにkumofsを入れてみたこの記事は書きかけでMacがクラッシュしたため、当社比-120%の説明不足でお送りさせていただきます。<br /><br />kumofsとは<br />・内側=KVS用のライブラリであるTokyoCabinet(mixi等で使用されている)を使用<br />・外側=グローバルスタンダードなmemcachedプロトコルでのやり取りが可能<br />・簡単にスケールアウトが可能なスケーラビリティを持ったKVS<br />という認識!<br /><br />なんだかワクワクする構成なのでとりあえず試してみた<br /><br />Macでのインストールをベースに書いていきます。<br /><br /><br />・gccのバージョンをあげる<br />kumofsのインストールにはgccの4.1以上が必要です<br />MacではXcodeをインストールする事によってgccがインストールされますが、デフォルトのバージョンは4.0.1です<br />4.2も一緒に入っているので、これを切り替えます<br /><br />cd /usr/bin<br />sudo rm -rf cc gcc c++ g++<br />sudo ln -s gcc-4.2 cc<br />sudo ln -s gcc-4.2 gcc<br />sudo ln -s c++-4.2 c++<br />sudo ln -s g++-4.2 g++<br /><br /><br />・TokyoCabinetのインストール<br />最新のソースパッケージをダウンロードして<br /><br />./configure<br />make<br />sudo make install<br /><br /><br />・MessagePack(C++API)<br />MessagePackはバイナリでシリアライズ可能な形式<br />JSONのバイナリ版みたいな感じ、JSONよりもシリアライズ/デシリアライズが高速で、容量も小さい<br /><br />C/C++向けのソースパッケージをダウンロードして<br /><br />./confifure<br />make<br />sudo make install<br /><br /><br />・MessagePack(RubyAPI)<br /><br />gem install msgpack <br />でさくっと入るはずなんだけど何故かうまくいかなかったので、ソースからインストールする<br />Gitは http://code.google.com/p/git-osx-installer/ からダウンロード<br /><br />git clone git://git.sourceforge.jp/gitroot/msgpack/msgpack.git<br />cd msgpack<br />cd ruby<br />ruby extconf.rb<br />make<br />sudo make install<br /><br /><br />・kumofsのインストール<br />最新のパッケージをダウンロードして<br /><br />./configure<br />make<br />sudo make install<br /><br />上記のインストールが終わっていれば正常にインストールされると思います<br /><br />/usr/local/bin/kumo*<br />のファイルがあればOKです<br /><br />次回は実際に起動をしてデータを入れてみますPonytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0tag:blogger.com,1999:blog-7334828829563331660.post-71432891921041489342010-01-27T10:04:00.003+09:002010-01-27T10:11:23.784+09:00コンパイルされたClassファイルからJavaのバージョンを取得するJavaのバージョントラブルがあったので、忘れないうちにメモ!<br /><a href="http://d.hatena.ne.jp/dewa/20071102/1193990886">ココ</a>を参考にしました。<br /><br />javap -v ClassFile | grep major<br />(クラスファイル名に .class はなしでOK)<br /><br />で以下のように表示される(はず)<br /><br /> major version: 47<br /><br />Javaのバージョンとの対比表<br /><br />1.1 = 45.3<br />1.2 = 46.0<br />1.3 = 47.0<br />1.4 = 48.0<br />1.5 = 49.0<br />1.6 = 50.0<br /><br />なので、上記の場合は 1.3でコンパイルされている、と。<br />Grailsって中のファイルとPluginでコンパイルされるバージョンが違う・・・Javaの参照の仕方が違うのかなPonytail.The.Shttp://www.blogger.com/profile/05418275995811639845noreply@blogger.com0