<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7334828829563331660</id><updated>2011-12-22T10:41:27.571+09:00</updated><category term='帳票'/><category term='mail'/><category term='車'/><category term='JPA'/><category term='quartz'/><category term='postgres'/><category term='xcode4'/><category term='MapReduce'/><category term='snow leopard'/><category term='jndi'/><category term='Ext'/><category term='Hibernate'/><category term='glassfish'/><category term='GoogleAppEngine'/><category term='iOS4'/><category term='Oracle'/><category term='grails'/><category term='MySQL Cluster'/><category term='どう書く？'/><category term='itext'/><category term='引っ越し'/><category term='plugin'/><category term='spring'/><category term='Objective-C'/><category term='mod_proxy'/><category term='kumofs'/><category term='cubby'/><category term='image'/><category term='JSON'/><category term='Android'/><category term='confluence'/><category term='FireWall'/><category term='blazeDS'/><category term='pooling'/><category term='Adobe'/><category term='cocos2d'/><category term='チューニング'/><category term='jQuery'/><category term='scala'/><category term='MySQL'/><category term='Codec'/><category term='SSH'/><category term='java'/><category term='Javascript'/><category term='REST'/><category term='CentOS'/><category term='Wii'/><category term='textmate'/><category term='Birt'/><category term='hudson'/><category term='小ネタ'/><category term='font'/><category term='lift'/><category term='Air'/><category term='WebSphere'/><category term='flex'/><category term='pdf'/><category term='CouchDB'/><category term='tcServer'/><category term='GameCenter'/><category term='fop'/><category term='Tomcat'/><category term='Slim3'/><category term='xcode'/><category term='iPhone'/><category term='paypal'/><category term='groovy'/><category term='kvs'/><category term='アプリ内課金'/><category term='mac'/><category term='ssl'/><category term='MonoTouch'/><category term='fxug'/><category term='jasperReport'/><category term='GoogleMap'/><category term='FileMaker'/><category term='インフルエンザ'/><category term='pgfouine'/><category term='AppStore'/><category term='subversion'/><title type='text'>とあるWebプログラマの軌跡（仮）</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default?start-index=101&amp;max-results=100'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>129</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-4302528955885008378</id><published>2011-03-28T17:47:00.002+09:00</published><updated>2011-03-28T18:01:53.741+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Air'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS4'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><title type='text'>FlexでiOSアプリを作ってみた。</title><content type='html'>AdobeAIR2.6も公開され、AIR for iOSも公式に実装される形になりました。&lt;br /&gt;というわけでFlexでiOSアプリを作ってみます。&lt;br /&gt;なぜFlexかというと、Flashはタイムラインの概念がどうにもわかりにくく扱いきれてないので・・・&lt;br /&gt;&lt;br /&gt;必須なものはAIR2.6SDKとiOSのデベロッパー登録のみです。&lt;br /&gt;&lt;a href="http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f3cb56e2a12cc36970aa-8000.html"&gt;コレ&lt;/a&gt;を参考に。&lt;br /&gt;FlashBuilderなんかがあるとビルド設定あたりは勝手にやってくれるので楽です。&lt;br /&gt;FlashBuilderに最新版のSDKをいれ、新規アプリケーションを作成します。&lt;br /&gt;&lt;br /&gt;はじめはWindowedApplicationが親になっているので、こいつをApplicationに変更。&lt;br /&gt;BorderContainerにLabelいれただけでのHelloWorld作ります。&lt;br /&gt;&lt;br /&gt;FlashBuilderであれば自動的に「プロジェクト名-app.xml」ファイルが出来ているので、これの中身を編集。&lt;br /&gt;とりあえずiPhoneの部分を活かし、supportedProfilesをmobileDeviceに。&lt;br /&gt;FlashBuilderが勝手にコンパイルしてくれるので、出来たswfとxmlを使ってadtでipaファイルにコンパイル。&lt;br /&gt;ipaファイルができたらiTunesのAppに放りこんで実機と同期。&lt;br /&gt;&lt;br /&gt;サクっとiOSアプリが完成しました。&lt;br /&gt;特にFlexアプリケーションでも問題なく動くようです。&lt;br /&gt;これを登録するときはApplicationLoaderを使うのかな？&lt;br /&gt;&lt;br /&gt;アプリの方は若干起動が重い感じがしますが・・・。Flexベースなせいでしょうね、きっと。&lt;br /&gt;Flashちゃんとやらないとなぁ・・・ああめんどくさい＞＜&lt;br /&gt;cocos2d for Flashとかあればいいのに！&lt;br /&gt;&lt;br /&gt;でもこれでWin,Mac,Android,iOSとワンソースでいけるのはなかなか魅力的ですね！&lt;br /&gt;あとはAirのランタイムが初回起動時にネット接続必須なのがなんとかなってくれるといいんだけどなぁ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-4302528955885008378?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/4302528955885008378/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=4302528955885008378' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4302528955885008378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4302528955885008378'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2011/03/flexios.html' title='FlexでiOSアプリを作ってみた。'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8809200516431894336</id><published>2011-03-23T10:28:00.003+09:00</published><updated>2011-03-23T10:48:29.623+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='xcode4'/><title type='text'>xcode4+cocos2dでiPhoneアプリを申請してみた</title><content type='html'>新MBPに乗り換え、xcode4+iOS4.3も正式リリースになったという事で移行した際にはまった事など。&lt;br /&gt;&lt;br /&gt;・missing fileが出まくる&lt;br /&gt;svnを使用していて、svn deleteせずにファイルだけ消えている状態になると出るっぽい。&lt;br /&gt;ビルドには問題ないけどwarningが出まくってるのは気分的によろしくない。&lt;br /&gt;該当ファイルをsvn deleteしてプロジェクトを開きなしたら治った。&lt;br /&gt;&lt;br /&gt;・iOS4.3 simulatorでエラーが出る&lt;br /&gt;&lt;a href="http://www.cocos2d-iphone.org/forum/topic/14449"&gt;ココ&lt;/a&gt;とか&lt;a href="https://devforums.apple.com/message/397038#397038"&gt;ココ&lt;/a&gt;によると皆なってるっぽい。&lt;br /&gt;実機の4.3では問題なく動作するので気にしない事にする。&lt;br /&gt;xcode4 templateで改善したのかもしれない。&lt;br /&gt;&lt;br /&gt;・Distribution&lt;br /&gt;xcode4ではアプリケーションローダーが不要になり、xcode4内で完結出来るようになっている。&lt;br /&gt;アップの仕方は&lt;a href="http://iphone-app-developer.seesaa.net/article/190448941.html"&gt;ココ&lt;/a&gt;らへんを参考に。&lt;br /&gt;cocos2dの旧プロジェクトをそのまま移行した場合、そのままではvalidateでエラーが出る。&lt;br /&gt;メインプロジェクトとcocos2dのターゲット両方がインストールされる指定になっているので、プロジェクトツリーからプロジェクトを選択＞TARGETSのcocos2d librariesを選択＞Skil InstallをYESにする事で回避。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cocos2d-iphone.org/archives/1412"&gt;cocos2d xcode4 template&lt;/a&gt;では修正されてるのかな？&lt;br /&gt;&lt;br /&gt;ついでにcocos2d 0.99.5であった&lt;a href="https://github.com/cocos2d/cocos2d-iphone/commit/956df4c511362b9defbe23daef3a561d9a1ebd55"&gt;BUG FIX&lt;/a&gt;を適応してアップ。&lt;br /&gt;このバグ確認出来なかったけど、これでアプリケーションクラッシュが改善されるといいなぁ&lt;br /&gt;&lt;br /&gt;・新MBP&lt;br /&gt;なんかSSDが早く感じる。VAIOのSSD*4 RAIDと比べても遅いとか思わない。&lt;br /&gt;プロジェクト内の文字列検索とかいつ検索したの？ってぐらい早い。&lt;br /&gt;ビルドも早いんだけど、その分実機への転送が遅く感じる、特に3G世代(´・ω・`)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8809200516431894336?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8809200516431894336/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8809200516431894336' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8809200516431894336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8809200516431894336'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2011/03/xcode4cocos2diphone.html' title='xcode4+cocos2dでiPhoneアプリを申請してみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-1747096692358773570</id><published>2010-09-14T15:45:00.002+09:00</published><updated>2010-09-14T16:08:31.107+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='GameCenter'/><title type='text'>iOS4.1の目玉（？）GameCenterを使ってみた・その１</title><content type='html'>iOS4.1がリリースされ、GameCenterが正式に稼働となりました。&lt;br /&gt;&lt;br /&gt;あんまり期待してなかったのですが、なんだかドキュメントを読んでいたら意外におもしろそうな感じ。&lt;br /&gt;単純なスコアランキングから、条件達成、自動対戦マッチにフレンド機能と、自前サーバいらずな感じになりそう。&lt;br /&gt;（どうせならアイテム課金の管理もAppleでやってくれたら完璧なのに・・・）&lt;br /&gt;&lt;br /&gt;ちょうどスコア系のゲームをつくっていたので慣れない英語を必死に読みながら実装してみた。&lt;br /&gt;&lt;br /&gt;・iTunesConnectにアプリケーションを登録する&lt;br /&gt;登録必須です、スクリーンショットとか検索キーワードとか先に入れるの面倒ですが、後から変更出来ますのでとりあえず作っちゃいましょう。&lt;br /&gt;登録したら、Manage GameCenterから、GameCenter Testingを有効にする。&lt;br /&gt;Leaderboard（ハイスコア）とAchievements（条件達成）がセットアップ出来るので設定しておく。&lt;br /&gt;&lt;br /&gt;・プロジェクトの設定&lt;br /&gt;対象のプロジェクトにGameKitをLinkする。&lt;br /&gt;GameKit/GameKit.h をインポートする。&lt;br /&gt;ビルトプロパティの識別子をアプリケーションで設定したものと同じにする。（jp.co.hoge.application）&lt;br /&gt;&lt;br /&gt;・稼働しているデバイスがGameCenterに対応しているか調べる&lt;br /&gt;サンプルコードの isGameCenterAvailable に該当&lt;br /&gt;&lt;br /&gt;・ユーザを認証する&lt;br /&gt;サンプルコードの authenticateLocalPlayer に該当&lt;br /&gt;ゲーム中にバックグラウンドでログアウトしたりする可能性があるので、GameCenterでの処理を行う前には必ず行う。&lt;br /&gt;&lt;br /&gt;・スコアの登録&lt;br /&gt;サンプルコードの reportScore に該当&lt;br /&gt;&lt;br /&gt;・ランキングの表示&lt;br /&gt;一般的なGameCenter用の表示と、カスタムでスコアだけ取得して自分で描画するパターンがある。&lt;br /&gt;統合されたインターフェースで十分だったので、一般的な表示を使おうと思ったんだけど、cocos2dだとここがちょっと面倒に。&lt;br /&gt;GKLeaderboardViewControllerDelegate を持つ UIViewController クラスを作成して、CCDIrector の openGLView に addSubview して解決。（超適当）&lt;br /&gt;詳しくは&lt;a href="http://www.cocos2d-iphone.org/forum/topic/9450"&gt;ココ&lt;/a&gt;らへんを参照&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえずこんだけでランキングに登録、表示が可能になりました。&lt;br /&gt;フレンドとかはGameCenter側で出来る話なので気にすることもなし。&lt;br /&gt;オンラインマッチに関しては&lt;a href="http://blog.livedoor.jp/abars/archives/51894994.html"&gt;エイバースの中の人&lt;/a&gt;が詳しく紹介されてます。&lt;br /&gt;&lt;br /&gt;あれ、その１で完結しちゃった。&lt;br /&gt;Achievements触ってみてなんかあれば続きでも・・・&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-1747096692358773570?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/1747096692358773570/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=1747096692358773570' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1747096692358773570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1747096692358773570'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/09/ios41gamecenter.html' title='iOS4.1の目玉（？）GameCenterを使ってみた・その１'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8093905068295205533</id><published>2010-08-31T16:18:00.001+09:00</published><updated>2010-08-31T16:23:34.078+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='image'/><title type='text'>Flexで丸画像とか</title><content type='html'>Flexで四角以外のアイテムを生成するときのお話&lt;br /&gt;忘れそうなのでメモメモ&lt;br /&gt;&lt;br /&gt;丸画像に対してイベントを取得したい時など、Imageを使うと四角の領域でイベントが取得されます。&lt;br /&gt;コンポーネントに対して mask 処理をしてやることで、任意の領域のみイベントの対象とする事が出来ます。&lt;br /&gt;&lt;br /&gt;詳細は&lt;a href="http://cookbooks.adobe.com/post_Rounded_Image-6502.html"&gt;コチラ&lt;/a&gt;&lt;br /&gt;Imageを拡張したクラスを用意して、 cornerRadius プロパティを追加。&lt;br /&gt;描画更新時（updateDisplayList）に、cornerRadius の値からマスクを作成してセット。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8093905068295205533?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8093905068295205533/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8093905068295205533' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8093905068295205533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8093905068295205533'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/08/flextoka.html' title='Flexで丸画像とか'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3870983492816003294</id><published>2010-08-26T10:52:00.002+09:00</published><updated>2010-08-26T11:09:29.634+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='font'/><title type='text'>cocos2dで日本語をCCBitmapFontAtlasで使うには</title><content type='html'>ちょっとはまったんでメモメモ&lt;br /&gt;&lt;br /&gt;cocos2dでは文字の表示に CCLabel という簡単なものがあるのですが、これが結構な重い処理となります。&lt;br /&gt;スムーズな動作を必要とするゲームなどでは、BitmapFontを使うと良いです。&lt;br /&gt;（逆にADV系など速度を要求しないものであればCCLabelでおｋ）&lt;br /&gt;&lt;br /&gt;現時点(cocos2d v0.99.4)では標準のままでは使えません。&lt;br /&gt;公式フォーラムの&lt;a href="http://www.cocos2d-iphone.org/forum/topic/8361"&gt;コチラ&lt;/a&gt;で問題点が指摘されています。&lt;br /&gt;&lt;br /&gt;プロジェクト内の cocos2d Sources &gt; cocos2d &gt; CCBitmapFontAtlas.h を編集します。&lt;br /&gt;&lt;br /&gt;kCCBitmapFontAtlasMaxChars = 2048&lt;br /&gt;を&lt;br /&gt;kCCBitmapFontAtlasMaxChars = 65536&lt;br /&gt;に変更&lt;br /&gt;&lt;br /&gt;BitmapFontを作る方法ですが、&lt;a href="http://www.n4te.com/hiero/hiero.jnlp"&gt;Hiero Font Editor&lt;/a&gt;というのと&lt;a href="http://www.angelcode.com/products/bmfont/"&gt;BMFontGenerator&lt;/a&gt;というが推奨されているようです。&lt;br /&gt;&lt;br /&gt;BMFontはWindowsでしか動かないので、とりあえずhieroを使ってみたんですが、どうもうちではうまく動作してくれませんでした。&lt;br /&gt;（出力画像が天地左右反転されたり、出力対象がコピペできなかったり、一度出力すると変更して二度目の出力が出来なかったり）&lt;br /&gt;&lt;br /&gt;なのでBMFontを使ったやり方を紹介します。&lt;br /&gt;&lt;br /&gt;・必要な文字を含んだテキストファイルを作成（UTF-16で保存）&lt;br /&gt;・Edit -&gt; Select chars from file で上記ファイルを選択&lt;br /&gt;・Export OptionsでBit depth を 32、png 出力&lt;br /&gt;・Font Settingsで Font smoothing を選択&lt;br /&gt;&lt;br /&gt;色などはお好みで、cocos2d側でも変更が効くので特に気にする必要もないと思います。&lt;br /&gt;これで出力された .fnt ファイルを CCBitmapFontAtlas で読み込んでやればBitmapFontで描画されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3870983492816003294?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3870983492816003294/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3870983492816003294' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3870983492816003294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3870983492816003294'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/08/cocos2dccbitmapfontatlas.html' title='cocos2dで日本語をCCBitmapFontAtlasで使うには'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-330623059217083872</id><published>2010-08-04T13:55:00.000+09:00</published><updated>2010-08-04T13:56:26.655+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='paypal'/><title type='text'>今そこにあるpaypal</title><content type='html'>paypalが日本での本格展開を始めると言う事で、早速使ってみた。&lt;br /&gt;&lt;br /&gt;使い始めるまでの準備をザックリと。&lt;br /&gt;&lt;br /&gt;１．Paypalにサインアップする。&lt;br /&gt;本番用と練習用(sandbox)では、別々にアカウントをセットアップする必要があるので注意。&lt;br /&gt;&lt;br /&gt;２．sandbox内で使えるアカウントを作成する。&lt;br /&gt;テンプレで作成出来るが、日本語アカウントはマニュアルで作るしかない。&lt;br /&gt;ビジネスでセットアップすれば架空のカード番号が入力されるので、そのままセットアップする。&lt;br /&gt;&lt;br /&gt;３．APIのアカウントを取得する&lt;br /&gt;個人設定＞APIアクセス＞オプション２のAPI証明書を取得する&lt;br /&gt;&lt;br /&gt;４．エクスプレスチェックアウトを有効にする&lt;br /&gt;上と同じ所から有効にできる。&lt;br /&gt;レガシーなウェブペイメントorメール決済を使う場合は必要ない、けどエクスプレスチェックアウトを推奨&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;上記に加え、本番アカウントならカード認証やら口座設定やらをしておく。&lt;br /&gt;&lt;br /&gt;新しくはじめるなら、paypalのAPIに対応したカートを使うのが一番簡単。&lt;br /&gt;APIのアカウントを設定するだけでいけるはず。&lt;br /&gt;&lt;br /&gt;それではおもしろくない（？）ので、一からAPIをつついてみた。&lt;br /&gt;APIではSOAPとNVP（Name-Value-PairただのPOST通信）が使えるらしいので、もっとも汎用的っぽいNVPをチョイス。&lt;br /&gt;&lt;br /&gt;APIのURLや詳細はまずそうなので伏せるとして、流れは以下の通り。&lt;br /&gt;&lt;br /&gt;１．SetExpressCheckout&lt;br /&gt;今から支払いスルヨー！とpaypalに宣言する。&lt;br /&gt;オプションでアカウント不要とか、画面表示を変えたりとか出来る。&lt;br /&gt;APIコールに問題なければTOKENが返ってくるので、ユーザ向けページへTOKENを付けてリダイレクトする。&lt;br /&gt;&lt;br /&gt;２．GetExpressCheckoutDetails&lt;br /&gt;指定した戻り先のページに戻ってきたら、このAPIを実行。&lt;br /&gt;ユーザがpaypalのページで入力した情報を取得する。（住所とか。クレジットカード番号は取得不可。）&lt;br /&gt;&lt;br /&gt;３．DoExpressCheckoutPayment&lt;br /&gt;決済処理の確定。&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;だんだんめんどくさくなってきたので&lt;/strike&gt;この辺で終了。&lt;br /&gt;paypalの利点は、他社に比べて圧倒的に安い事と、始めやすい（オンラインだけですぐ始められる）事でしょうか。&lt;br /&gt;欠点としては日本での認知度の低さや、わかりにくさ（決済ページが英語表示、ユーザが日本語表示に切り替える必要がある）でしょうか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-330623059217083872?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/330623059217083872/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=330623059217083872' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/330623059217083872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/330623059217083872'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/08/paypal.html' title='今そこにあるpaypal'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-9164184075293123651</id><published>2010-06-24T14:23:00.002+09:00</published><updated>2010-06-24T14:32:56.676+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iOS4'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><title type='text'>iOS3のプロジェクトをiOS4に対応してみる</title><content type='html'>iOS4が正式に公開されたので、プロジェクトをアップデートしてみるテスト&lt;br /&gt;&lt;br /&gt;iPhoneDevよりxcode 3.2.3 finalをインストール&lt;br /&gt;古いxcodeやiPhone simulatorが立ち上がってたら落としておくこと。インストールに失敗する事があるので落としておく。&lt;br /&gt;iTunesも途中で落とせと言われるので先に落としておくのが吉。&lt;br /&gt;&lt;br /&gt;とりあえずそのまま以前のプロジェクトを実行してみる＞エラー＞あるある&lt;br /&gt;&lt;br /&gt;UIView.h等で以下のようなエラーが多発&lt;br /&gt;syntax error before '^' token&lt;br /&gt;&lt;br /&gt;なぞい、コンパイラをGCC4.2からLLVM GCC4.2に変更すると回避出来るけど・・・&lt;br /&gt;再度ビルド＞エラー＞ですよねー&lt;br /&gt;&lt;br /&gt;今度はSBJSONでエラーが出てる&lt;br /&gt;とりあえず最新版を落としてドキュメントを読んでみると、インストール方法が変わったらしい&lt;br /&gt;&lt;br /&gt;追加SDKとリンカグラグをはずして、最新のオススメインストール方法（クラスコピーするだけ）に戻したらさっくり動いた&lt;br /&gt;コンパイラの設定をGCC4.2に戻しても問題なし、と。なんだよ、ちょっと焦っちゃったヨ。&lt;br /&gt;&lt;br /&gt;なんでJSON-Frameworkとか使ってないプロジェクトはそのままでいけると思う。&lt;br /&gt;cocos2d(v0.99.3)に関しては今の所問題無し。&lt;br /&gt;&lt;br /&gt;お次は実機に・・・と思ったらプロビジョニングされた実機がつながってないよ、と&lt;br /&gt;どうやら実機をiOS4にアップデートしたら別物として認識されているっぽい&lt;br /&gt;xcodeのオーガナイザからIdentifierをコピーして・・・と思ったら「デバイスを開発で使う」みたいなボタンが出ていたので押してみる。&lt;br /&gt;iTunesConnectのIDをきかれ、xcodeからデバイスの登録が完了！&lt;br /&gt;xcode上でiTunesConnectと連携出来るのね、これはイイ改良&lt;br /&gt;&lt;br /&gt;HPから確認してみるとTeam Provisioning Profile: *というのが追加されていた&lt;br /&gt;とりあえずこの状態で実機の動作確認もOK&lt;br /&gt;&lt;br /&gt;シミュレータで注意しないといけないのが、HOMEボタンで終了ではなくなったので、HOMEおしてもタスクは実行中ということ（3G実機では終了されるけどね :p）&lt;br /&gt;ここで新しいイベント（applicationDidEnterBackground）が飛ぶので、必要ならば処理を追加する。&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/kamiyan2/20100623"&gt;コチラ&lt;/a&gt;に日本語で詳しい内容がアップされています。&lt;br /&gt;どうやらapplicationWillTerminateが呼ばれずに終わる事もあるそうで・・・？（本体ないし未確認）&lt;br /&gt;終了処理はちょっと気を付けた方が良さそうです。&lt;br /&gt;&lt;br /&gt;当面はiPhoneシミュレータを見ながらiPhone4が手元に届くのを待っています・・・&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-9164184075293123651?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/9164184075293123651/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=9164184075293123651' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/9164184075293123651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/9164184075293123651'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/06/ios3ios4.html' title='iOS3のプロジェクトをiOS4に対応してみる'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-4909902748084253475</id><published>2010-04-23T10:43:00.003+09:00</published><updated>2010-04-23T10:46:38.195+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>iPhoneでバイブレーションを作動させる</title><content type='html'>&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;&lt;br /&gt;#import &amp;lt;AudioToolbox/AudioToolbox.h&amp;gt;&lt;br /&gt;&lt;br /&gt;AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;AudioToolBoxをインポートして AudioServicesPlaySystemSound を呼ぶだけ・・・&lt;br /&gt;Twitterでつぶやける程のコード量で拍子抜けしたｗ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-4909902748084253475?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/4909902748084253475/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=4909902748084253475' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4909902748084253475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4909902748084253475'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/04/iphone_23.html' title='iPhoneでバイブレーションを作動させる'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8922778928431802029</id><published>2010-04-09T14:43:00.003+09:00</published><updated>2010-04-09T14:47:00.762+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><title type='text'>Flex 自分メモ</title><content type='html'>・FlexBuilderでプロジェクトのプロパティ画面（Flexビルドパスなど）が表示されない時は、境界線をちょっと移動すると表示される。&lt;br /&gt;&lt;br /&gt;・サイズが％指定の領域内でスクロールさせたい場合（VBox 100%など）は minHeight=0 を指定しておく&lt;br /&gt;&lt;br /&gt;・ListのItemRendererでTextAreaなどを使用し、行数が増える場合データは正しく更新されるが、表示ははじめの行数のまま増えない。&lt;br /&gt;この場合は itemRenderer="mx.controls.Text" を指定してやれば良い。&lt;br /&gt;&lt;br /&gt;以上、メモ投稿&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8922778928431802029?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8922778928431802029/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8922778928431802029' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8922778928431802029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8922778928431802029'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/04/flex.html' title='Flex 自分メモ'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5860586766178119303</id><published>2010-04-06T16:09:00.006+09:00</published><updated>2010-04-06T16:26:26.039+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='アプリ内課金'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>iPhoneおアプリ内課金について・その１</title><content type='html'>iPhoneでアプリ内課金をするのに色々と面倒だったのでまとめておく&lt;br /&gt;&lt;br /&gt;概念とかは&lt;a href="http://developer.apple.com/jp/iphone/library/documentation/NetworkingInternet/Conceptual/StoreKitGuide/StoreKitGuide.pdf"&gt;StoreKitガイド&lt;/a&gt;辺りで把握出来ますので、実際にコードに組み込む辺りを。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・まずはプロジェクトにStoreKitFrameworkを追加する。&lt;br /&gt;プロジェクトの編集＞一般＞リンク済みライブラリの「＋」から StoreKit.framework を選択して追加&lt;br /&gt;なぜかリストには反映されないが、動作しているので気にしない&lt;br /&gt;これってiPhoneアプリ的には常識なんでしょうかね・・・まったく知らなかったんでここに来るのすら苦労しましたｗ&lt;br /&gt;&lt;br /&gt;・下準備&lt;br /&gt;&lt;br /&gt;#import &amp;lt;StoreKit/StoreKit.h&amp;gt;&lt;br /&gt;&lt;br /&gt;して、クラスに &amp;lt;SKProductsRequestDelegate&amp;gt; を追加する&lt;br /&gt;&lt;br /&gt;こんな感じ&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;&lt;br /&gt;#import &amp;lt;StoreKit/StoreKit.h&amp;gt;&lt;br /&gt;&lt;br /&gt;@interface TestLayer : NSObject &amp;lt;SKProductsRequestDelegate&amp;gt; {&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・購入するアイテムの情報を取得&lt;br /&gt;&lt;br /&gt;SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"PRODUCT_ID"]];&lt;br /&gt;&lt;br /&gt;PRODUCT_IDはitunes connectで指定したものをあてる。&lt;br /&gt;通信中の処理待ちなどはアプリ側で各自実装、リクエストが終わると productsRequest がコールされる&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;&lt;br /&gt;-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {&lt;br /&gt;  // プロダクトの取得&lt;br /&gt;  SKProduct *product = [[response products] lastObject];&lt;br /&gt;  &lt;br /&gt;  // アイテムのタイトル&lt;br /&gt;  NSLog(@"%@",product.localizedTitle);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;request は requestDidFinish で解放してやりましょう&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;&lt;br /&gt;- (void)requestDidFinish:(SKRequest *)request {&lt;br /&gt;  [request release];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;itunes connectへ課金アイテムの登録がうまくいっていれば、この時点でアイテムの名称がログに出力されます。&lt;br /&gt;後は SKPaymentQueue の使い方と、テストユーザでの購入の仕方、その際のTIPS等&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5860586766178119303?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5860586766178119303/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5860586766178119303' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5860586766178119303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5860586766178119303'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/04/iphone.html' title='iPhoneおアプリ内課金について・その１'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-9148478370169607113</id><published>2010-03-21T08:15:00.003+09:00</published><updated>2010-03-21T08:17:41.663+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppStore'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>iPhoneアプリはじめました</title><content type='html'>というわけで無事Appleの審査も通りAppStoreへ公開されました！&lt;br /&gt;&lt;br /&gt;アプリのダウンロードは以下より&lt;br /&gt;&lt;a href="http://itunes.com/apps/scratchgirl"&gt;ScratchGirl&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;無料アプリなんで良かったら遊んでみてください :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-9148478370169607113?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/9148478370169607113/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=9148478370169607113' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/9148478370169607113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/9148478370169607113'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/03/iphone.html' title='iPhoneアプリはじめました'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8866583365670975207</id><published>2010-03-11T10:28:00.002+09:00</published><updated>2010-03-11T10:50:27.866+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppStore'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>AppStoreへ申請するアプリにjson-frameworkを使用している場合の注意点</title><content type='html'>AppStoreへアプリを登録する際に、嫌というほど目にする以下のエラー&lt;br /&gt;&lt;br /&gt;The binary you uploaded was invalid. The signature was invalid, or it was not signed with an Apple submission certificate&lt;br /&gt;&lt;br /&gt;基本的にはCodeSign系のエラーですが、その他のエラーもすべてこれで帰ってくるもよう。&lt;br /&gt;Webで調べたら以下のような症状があった。&lt;br /&gt;&lt;br /&gt;・Developerの証明書でビルドしていた&lt;br /&gt;・Distribution or Provisioningの証明書の有効期限が切れていた（それぞれ別の有効期限になるので注意）&lt;br /&gt;・Info.plistのBundle identifierが登録した内容と違っていた&lt;br /&gt;・プロジェクト＞アクティブターゲット"あぷり名"を編集＞プロパティ＞識別子　がInfo.plistのBundle identifierと一致しなかった（基本的には同期するはずなんだけども・・・）&lt;br /&gt;・アイコンファイルのサイズが57x57ではなかった、また24bitでなかった（これに結構ひっかかってた・・・24bitのPNGでもMacのプレビュー＞インスペクタではビット深度8と表示される）&lt;br /&gt;・コード署名IDの設定を、プロジェクト＞プロジェクト設定を編集　から行った（必ず、アクティブターゲット"あぷり名"を編集 から行った方が良いです）&lt;br /&gt;&lt;br /&gt;Xcodeのビルドは基本的に差分ビルドなので、Distributionの場合は毎回クリーンした方が良いです。&lt;br /&gt;そして、Xcode自体にもなんやらキャッシュっぽい感じで設定が残るようです。&lt;br /&gt;公式にもありますが、いったんCodeSignをはずして、クリーンしてフォルダも消して、Xcodeを再起動してCodeSignを当てなおすとうまく行くとかあるようです。&lt;br /&gt;&lt;br /&gt;で、色々やった結果全部だめだったので途方にくれていたのですが、ふと使用しているライブラリのCodeSignとかどうなるんだろと思って調べたら、これがビンゴでした。&lt;br /&gt;&lt;br /&gt;cocos2dとjson-frameworkを使ったのですが、cocos2dは特に設定無しで問題ないもよう。&lt;br /&gt;json-frameworkでは、&lt;a href="http://code.google.com/p/json-framework/issues/detail?id=18"&gt;2.2の頃にCodeSign系のなんやら&lt;/a&gt;があったようで、以下の設定をすると良いとの事でした。&lt;br /&gt;&lt;br /&gt;「アクティブターゲット"あぷり名"を編集」から「コード署名リソース・ルールパス」に、$(SDKROOT)/ResourceRules.plist を入力&lt;br /&gt;&lt;br /&gt;説明には「ビルド実行可能ファイルのコード署名後に変更する有効な理由のあるファイルを除外するために、オプションで使用されます」とありますので、なんかの理由があるんでしょ、きっと。&lt;br /&gt;2.2の頃の話＋AdHocや実機デバッグでは問題なく動いていたので、マサカネーと思いつつアップしたらあっさりと通りました（＞＜）&lt;br /&gt;&lt;br /&gt;そんなわけで、転職しましてWebプログラマじゃなくなっていたりします。（Webアプリも書いていますが・・・）&lt;br /&gt;無料アプリなので審査が通ったら公開致します :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8866583365670975207?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8866583365670975207/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8866583365670975207' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8866583365670975207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8866583365670975207'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/03/appstorejson-framework.html' title='AppStoreへ申請するアプリにjson-frameworkを使用している場合の注意点'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8702070094450502890</id><published>2010-02-04T11:34:00.004+09:00</published><updated>2010-02-04T11:38:01.297+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='MonoTouch'/><title type='text'>C#でiPhoneアプリを作ってみた！</title><content type='html'>C#や.Net Frameworkを使ってiPhoneアプリを開発出来るという&lt;a href="http://monotouch.net/"&gt;MonoTouch&lt;/a&gt;を使ってみた&lt;br /&gt;&lt;br /&gt;まず&lt;a href="http://mono-project.com/Downloads"&gt;MonoFramework&lt;/a&gt;と&lt;a href="http://monodevelop.com/Download/Mac_MonoTouch"&gt;MonoDevelop&lt;/a&gt;をダウンロード＆インストールする。（共にMac版）&lt;br /&gt;次にMonoTouchのSDKを&lt;a href="http://monotouch.net/DownloadTrial"&gt;ダウンロード&lt;/a&gt;する&lt;br /&gt;上記２つは無料らしい、MonoTouchは有料だけどTrial出来るので今回はそれで試してみました&lt;br /&gt;&lt;br /&gt;あ、もちろんiPhoneSDKは必須です。AppleIDを取得すれば無料でダウンロード可能&lt;br /&gt;&lt;br /&gt;全部インストールした所でおもむろにMonoDevelopを起動、、、はい、文字化けしてます&lt;br /&gt;ぐぐると早速&lt;a href="http://kki-zakki.blogspot.com/2008/12/monodevelop-20-alphamac-os-x.html"&gt;答え&lt;/a&gt;があったので設定します&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MmNDS6igmGM/S2oyb33jDqI/AAAAAAAAAEo/s-Y1VxYtdf4/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://3.bp.blogspot.com/_MmNDS6igmGM/S2oyb33jDqI/AAAAAAAAAEo/s-Y1VxYtdf4/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5434211354810715810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;はい、バッチリ日本語でました&lt;br /&gt;とりあえず公式の&lt;a href="http://monotouch.net/Tutorials/MonoDevelop_HelloWorld"&gt;チュートリアル&lt;/a&gt;を進めてみます&lt;br /&gt;&lt;br /&gt;ファイル＞新規＞ソリューション　で　テンプレートから C#&gt;iPhone を選択&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MmNDS6igmGM/S2oyjAk1CJI/AAAAAAAAAEw/Mvf_B7y2W6s/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 235px;" src="http://2.bp.blogspot.com/_MmNDS6igmGM/S2oyjAk1CJI/AAAAAAAAAEw/Mvf_B7y2W6s/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5434211477407205522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;早速使えるテンプレートが増えているようです、今回はHelloWorldなんで、iPhone Window-based Projectでいってみましょう&lt;br /&gt;とりあえず作成しただけの状態で実行してみます・・・&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/S2oypTWn4DI/AAAAAAAAAE4/y7V2xmwsFnE/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 172px; height: 320px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/S2oypTWn4DI/AAAAAAAAAE4/y7V2xmwsFnE/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5434211585527111730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;iPhone Simulatorが立ち上がってまっしろな画面が出ました、ここまでは良好ですね。&lt;br /&gt;生成されたプロジェクトの MainWindow.xib をダブルクリックすると InterfaceBuilder が起動しました。&lt;br /&gt;この辺はXcodeで作る時と同じ容量で良さそうですね。&lt;br /&gt;&lt;br /&gt;InterfaceBuilderで生成されたOutletやActionを、MainWindow.xib.designer.cs という自動生成されたファイルで関連付けしてくれます。&lt;br /&gt;で作ってみたHelloWorldがこんな感じ&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MmNDS6igmGM/S2oyxGixQ8I/AAAAAAAAAFA/tXsiiqY8gkc/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 172px; height: 320px;" src="http://2.bp.blogspot.com/_MmNDS6igmGM/S2oyxGixQ8I/AAAAAAAAAFA/tXsiiqY8gkc/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5434211719527351234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;残念なところは、MonoDevelopが日本語入力出来ません・・・&lt;br /&gt;ファイルを直接別のエディタで編集すれば日本語も使えますが、ちょっと効率悪いですね。&lt;br /&gt;実機テストもしてみようかと思ったのですが、実機テストが出来るのは有料版のみのようです。&lt;br /&gt;&lt;br /&gt;C#マカーがどれだけいるのかわかりませんが、actionscript等、別の言語で作れるようになるのは非常に良い事です。&lt;br /&gt;今後に是非期待しましょう！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8702070094450502890?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8702070094450502890/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8702070094450502890' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8702070094450502890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8702070094450502890'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/02/ciphone.html' title='C#でiPhoneアプリを作ってみた！'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_MmNDS6igmGM/S2oyb33jDqI/AAAAAAAAAEo/s-Y1VxYtdf4/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-9162482363223750775</id><published>2010-02-03T13:40:00.000+09:00</published><updated>2010-02-03T13:41:09.401+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kumofs'/><category scheme='http://www.blogger.com/atom/ns#' term='kvs'/><title type='text'>kumofs その５・スケールアウトしてみた</title><content type='html'>kumo-serverを２台のマシンへセットアップし、色々試してみました。&lt;br /&gt;&lt;br /&gt;スケールアウト時のチェックポイントはserverのIPや名称等は必ず一意となるようにつける事です。&lt;br /&gt;例えばmanagerを起動するサーバで&lt;br /&gt;kumo-manager -v -l localhost&lt;br /&gt;kumo-manager -v -l 127.0.0.1&lt;br /&gt;とかやってしまうと失敗します。必ず自分のIPか一意のサーバ名としましょう。&lt;br /&gt;&lt;br /&gt;前回接続が不安定だったのはSpymemcachedが原因でした。&lt;br /&gt;&lt;a href="http://www.whalin.com/memcached/"&gt;memcached client for java&lt;/a&gt;で接続したらエラーにならずにすみました。&lt;br /&gt;んが、こちらの方が速度が遅いようです。&lt;br /&gt;&lt;br /&gt;1台から2台にした結果、速度は遅くなりました。&lt;br /&gt;まぁ２台ではボトルネックの方が大きくなってしまうのでしょうがないですね・・・&lt;br /&gt;&lt;br /&gt;memcached client+2台状態での速度は以下のような感じでした。&lt;br /&gt;Set&lt;br /&gt;128,187ms&lt;br /&gt;&lt;br /&gt;Get&lt;br /&gt;112,314ms&lt;br /&gt;&lt;br /&gt;どちらも大体同じくらいの速度で安定して動きました。&lt;br /&gt;SetはHSQLDBより遅くなりましたね・・・&lt;br /&gt;GetをチューニングしたらHSQLDBが最速になるかな？？と思って試してみました&lt;br /&gt;&lt;br /&gt;Indexあり HSQLDB Get&lt;br /&gt;637,811ms&lt;br /&gt;622,084ms&lt;br /&gt;&lt;br /&gt;Indexなしより４倍ぐらい早くなりましたが、kumofsと比べるとだいぶ遅いですね。&lt;br /&gt;CouchDBより微妙に遅い程度なので、Grailsの中だけで使うDBという割当にCouchDBは向いていません。&lt;br /&gt;&lt;br /&gt;続いて障害時の検証&lt;br /&gt;&lt;br /&gt;memcached clientには複数のmemcachedをPoolして使う機能があります。&lt;br /&gt;なのでkumo-gatewayを二つたてて二つをPoolして使ってみました。&lt;br /&gt;&lt;br /&gt;マシン構成&lt;br /&gt;server1 - kumo-manager , kumo-server , kumo-gateway&lt;br /&gt;server2 - kumo-server , kumo-gateway&lt;br /&gt;&lt;br /&gt;・すべてが稼働している状態からserver1or2のkumo-gatewayを落とす&lt;br /&gt;正しく取得出来たり、Exceptionが出たり。&lt;br /&gt;memcached clientでは接続先が落ちているかどうかまで判断はしてくれないようです。&lt;br /&gt;A,Bどちらを落とした場合でも結果は同じです。&lt;br /&gt;&lt;br /&gt;・すべてが稼働している状態からserver1or2のkumo-serverを落とす&lt;br /&gt;何事もなかったかのように動作しました。&lt;br /&gt;&lt;br /&gt;・片方のkumo-serverしか動いていない状態で、データを追加or変更し、落ちているkumo-serverを復旧させる&lt;br /&gt;復旧した時点では not attached になっていますので、Aのマシンからattachします&lt;br /&gt;&lt;br /&gt;kumoctl server1 attach&lt;br /&gt;&lt;br /&gt;attach時にReplicationが行われ、アプリケーションからは常に変更後のデータが取得されます。&lt;br /&gt;もちろんノンストップでいけます。&lt;br /&gt;&lt;br /&gt;という事で、memcached clientのPoolは使わずに、公式のオススメどおりwebアプリとkumo-gatewayを1:1にし、kumofs側で障害対策をするのが良いようです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-9162482363223750775?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/9162482363223750775/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=9162482363223750775' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/9162482363223750775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/9162482363223750775'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/02/kumofs_03.html' title='kumofs その５・スケールアウトしてみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-1668050406123472765</id><published>2010-02-01T17:25:00.005+09:00</published><updated>2010-02-01T17:53:11.498+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kumofs'/><category scheme='http://www.blogger.com/atom/ns#' term='kvs'/><title type='text'>kumofs その４・速度比較してみた</title><content type='html'>Grailsから kumofs と couchDB で速度比較してみました。（ついでにRDBMSも）&lt;br /&gt;対象データは全国の郵便番号(12万件)をキーに住所を入力しています。&lt;br /&gt;&lt;br /&gt;kumofs+spymemcachedでは、大量のデータをいっぺんに投げると接続が不安定になります。&lt;br /&gt;一応接続方法を DefaultConnectionFactory から、KetamaConnectionFactory （蹴球？）に変えたら多少良くなったような気がしました。（が、たまにエラーでます）&lt;br /&gt;&lt;br /&gt;やり方は前回のサービスの一部を変更↓&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;def void afterPropertiesSet() {&lt;br /&gt;  memcachedClient = new MemcachedClient(new KetamaConnectionFactory(60000,60000), AddrUtil.getAddresses("localhost:11211"))&lt;br /&gt;// memcachedClient = new MemcachedClient(AddrUtil.getAddresses("localhost:11211"))&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;コメントアウトしたところが元のソースです。&lt;br /&gt;念のためバッファ等もあげてあります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CouchDBはRESTですべて行えるので、Grailsからはサクサク使えるのですが、Java用のライブラリがあったので試してみました。&lt;br /&gt;勢いのある&lt;a href="http://code.google.com/p/jcouchdb/"&gt;jcouchdb&lt;/a&gt;を使っています。&lt;br /&gt;&lt;br /&gt;インポートはこんな感じで書きました&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;Database db = new Database("localhost", "postal");&lt;br /&gt;def doc=new BaseDocument()&lt;br /&gt;doc.setId(key)&lt;br /&gt;doc.setProperty("val",val)&lt;br /&gt;db.createDocument(doc);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;・結果はこんな感じ&lt;br /&gt;データインポート&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;kumofs&lt;/th&gt;&lt;th&gt;CouchDB&lt;/th&gt;&lt;th&gt;HSQLDB&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;21,917ms&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;980,457ms&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;41,883ms&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;18,785ms&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;1,008,333ms&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;33,800ms&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;18,205ms&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;955,118ms&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;35,256ms&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;17,387ms&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;3回で心が折れました&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;31,735ms&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;18,062ms&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;32,539ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;取得した結果はこちら&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;kumofs&lt;/th&gt;&lt;th&gt;CouchDB&lt;/th&gt;&lt;th&gt;HSQLDB&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;51,357ms&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;564,257ms &lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;2,803,802ms &lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;45,988ms &lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;590,907ms &lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;2,764,875ms &lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;50,615ms &lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;539,712ms &lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;2回で心が折れました&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;46,966ms &lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;3回で心が折れました&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="width:120px;text-align:right;"&gt;48,286ms &lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;&lt;/td&gt;&lt;td style="width:120px;text-align:right;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・ちなみにDBの容量はこんな感じになりました。&lt;br /&gt;元のテキスト 12mb&lt;br /&gt;kumofs 22mb&lt;br /&gt;couchDB 600mb&lt;br /&gt;&lt;br /&gt;couchDBは差分もてたりする分情報が多いのは理解出来ますが、ちょっとありえないサイズになってますね・・・&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・まとめるとこんな感じ&lt;br /&gt;（そもそも単純なKVSであるkumofsとMapReduce出来るCouchDBを比べるのも変かも知れませんが・・・あえてTokyoTryrantとかとは比べないのがうちっぽいという事で）&lt;br /&gt;&lt;br /&gt;速度だけでみたらkumofsが最速（安定性に不安があるけど・・・）&lt;br /&gt;CouchDBは想像以上に遅かったですね、、、特に書き込み。&lt;br /&gt;ってそういう見方もあるけど、CouchDB良い所はKVSやSQL文になじみのない人がチームにいても理解しやすいって所だと思います。&lt;br /&gt;&lt;br /&gt;RDBMS(今回はHSQL使ってます)の読み込みの遅さは正直壊れたのかと思うぐらい遅かったです・・・&lt;br /&gt;まあINDEXもチューニングも何もしていない状態だとこんなものでしょうか。&lt;br /&gt;そこらへんはプログラマならやって当然の事なんですが、そういう事考えなくても早いDBってのも良い物ですよね。&lt;br /&gt;&lt;br /&gt;次回はkumofsをスケールアウトしてみます、果たして更なる速度向上はあるのか！？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-1668050406123472765?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/1668050406123472765/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=1668050406123472765' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1668050406123472765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1668050406123472765'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/02/kumofs.html' title='kumofs その４・速度比較してみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-4253679546092555041</id><published>2010-01-29T09:26:00.005+09:00</published><updated>2010-02-03T13:42:03.341+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kumofs'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='kvs'/><title type='text'>kumofs その３・Grailsと連携してみた</title><content type='html'>Grailsからkumofsを使ってみます&lt;br /&gt;&lt;br /&gt;・適当な Grails アプリケーションを作成します&lt;br /&gt;grails create-app kvstest&lt;br /&gt;&lt;br /&gt;・memcachedクライアントのライブラリをインストールします&lt;br /&gt;kumofs は memcached プロトコルを使用します。&lt;br /&gt;今回は memcached の Java クライアントである &lt;a href="http://code.google.com/p/spymemcached/downloads/list"&gt;Spymemcached&lt;/a&gt;&lt;br /&gt; を使用します&lt;br /&gt;&lt;br /&gt;上記サイトからJARファイルをダウンロードして lib フォルダへコピーします&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・やりとりをするサービスを作成します&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/jp/java/library/j-memcached2.html"&gt;IBMのサイト&lt;/a&gt;にとても良いサンプルがあるのでこれを参考にします&lt;br /&gt;上記サイトにあるサービスがほぼそのまま使えます&lt;br /&gt;setのタイムアウトが600と指定されているのですが、kumofsでは0しか受け付けないため、0に変更します&lt;br /&gt;&lt;br /&gt;*デフォルトの接続方式だと大量データでエラーが起きたので変更しました、そこらへんは次回に。&lt;br /&gt;&lt;br /&gt;-&gt;Spymemcachedの問題でした、解決方法は&lt;a href="http://ponytailthes.blogspot.com/2010/02/kumofs_03.html"&gt;こちら&lt;/a&gt;のエントリーで&lt;br /&gt;&lt;br /&gt;memcachedClient.set(key, 0, value)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・適当なコントローラーを作成してget,setをテストします&lt;br /&gt;本当に適当なので割愛、SSだけ&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MmNDS6igmGM/S2IrecUSa6I/AAAAAAAAAEY/jM7IELpBI1U/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 302px; height: 185px;" src="http://4.bp.blogspot.com/_MmNDS6igmGM/S2IrecUSa6I/AAAAAAAAAEY/jM7IELpBI1U/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5431951902559595426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MmNDS6igmGM/S2Irjg2ZgRI/AAAAAAAAAEg/O1acFx7DmNs/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 271px; height: 161px;" src="http://4.bp.blogspot.com/_MmNDS6igmGM/S2Irjg2ZgRI/AAAAAAAAAEg/O1acFx7DmNs/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5431951989675753746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;サクっと動きました！&lt;br /&gt;次回はCouchDBとの速度比較なんかをやってみます&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-4253679546092555041?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/4253679546092555041/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=4253679546092555041' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4253679546092555041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4253679546092555041'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/01/kumofs-grails.html' title='kumofs その３・Grailsと連携してみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MmNDS6igmGM/S2IrecUSa6I/AAAAAAAAAEY/jM7IELpBI1U/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-1784532742638540755</id><published>2010-01-28T16:33:00.001+09:00</published><updated>2010-01-28T16:33:40.810+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kumofs'/><category scheme='http://www.blogger.com/atom/ns#' term='kvs'/><title type='text'>kumofs その２・Macで起動させてみた</title><content type='html'>とりあえずインストール出来ましたので、早速起動してみましょう&lt;br /&gt;まずはkumofsの構成から&lt;br /&gt;&lt;br /&gt;・kumo-server &lt;br /&gt;データノード&lt;br /&gt;実データが保存される場所、最低１つ&lt;br /&gt;&lt;br /&gt;・kumo-manager&lt;br /&gt;管理ノード&lt;br /&gt;kumo-serverの管理を行う、1or2台&lt;br /&gt;&lt;br /&gt;・kumo-gateway&lt;br /&gt;アプリケーション &lt;-&gt; kumo-serverのプロキシ&lt;br /&gt;アプリケーションからは常にここを参照するため、裏のmanager,serverの構成がどんな風に変わっても問題ない&lt;br /&gt;アプリケーションサーバに対して 1:1 で起動する&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえずオールインワンで動かしてみます&lt;br /&gt;・管理ノードを起動&lt;br /&gt;kumo-manager -v -l localhost&lt;br /&gt;&lt;br /&gt;・データノードを起動&lt;br /&gt;kumo-server -v -l localhost -m localhost -s /opt/kumo/kumodb.tch&lt;br /&gt;&lt;br /&gt;・起動したノードを確認&lt;br /&gt;kumoctl localhost status&lt;br /&gt;&lt;br /&gt;hash space timestamp:&lt;br /&gt;  Thu Jan 01 09:00:00 +0900 1970 clock 0&lt;br /&gt;attached node:&lt;br /&gt;not attached node:&lt;br /&gt;  127.0.0.1:19800&lt;br /&gt;&lt;br /&gt;not attached node に登録されていますね。&lt;br /&gt;&lt;br /&gt;・起動したデータノードを実際に参加させます&lt;br /&gt;kumoctl localhost attach&lt;br /&gt;&lt;br /&gt;・もっかい確認します&lt;br /&gt;kumoctl localhost status&lt;br /&gt;hash space timestamp:&lt;br /&gt;  Thu Jan 28 14:42:43 +0900 2010 clock 152&lt;br /&gt;attached node:&lt;br /&gt;  127.0.0.1:19800  (active)&lt;br /&gt;not attached node:&lt;br /&gt;&lt;br /&gt;・プロキシを起動します&lt;br /&gt;kumo-gateway -v -m localhost -t 11211&lt;br /&gt;&lt;br /&gt;・telnet で接続確認します&lt;br /&gt;telnet localhost 11211&lt;br /&gt;Trying ::1...&lt;br /&gt;telnet: connect to address ::1: Connection refused&lt;br /&gt;Trying fe80::1...&lt;br /&gt;telnet: connect to address fe80::1: Connection refused&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;Connected to localhost.&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;&lt;br /&gt;・データを入れてみます&lt;br /&gt;set hoge 0 0 3&lt;br /&gt;foo&lt;br /&gt;STORED&lt;br /&gt;&lt;br /&gt;・データを取得してみます&lt;br /&gt;get hoge&lt;br /&gt;VALUE hoge 0 3&lt;br /&gt;foo&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;hoge=foo　というデータが入りました！&lt;br /&gt;&lt;br /&gt;次回はGrailsと連携してみます&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-1784532742638540755?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/1784532742638540755/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=1784532742638540755' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1784532742638540755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1784532742638540755'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/01/kumofs-mac.html' title='kumofs その２・Macで起動させてみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8171132032850346423</id><published>2010-01-28T15:18:00.001+09:00</published><updated>2010-01-28T15:20:09.705+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kumofs'/><category scheme='http://www.blogger.com/atom/ns#' term='kvs'/><title type='text'>kumofs その１・Macにkumofsを入れてみた</title><content type='html'>この記事は書きかけでMacがクラッシュしたため、当社比-120%の説明不足でお送りさせていただきます。&lt;br /&gt;&lt;br /&gt;kumofsとは&lt;br /&gt;・内側=KVS用のライブラリであるTokyoCabinet(mixi等で使用されている）を使用&lt;br /&gt;・外側=グローバルスタンダードなmemcachedプロトコルでのやり取りが可能&lt;br /&gt;・簡単にスケールアウトが可能なスケーラビリティを持ったKVS&lt;br /&gt;という認識！&lt;br /&gt;&lt;br /&gt;なんだかワクワクする構成なのでとりあえず試してみた&lt;br /&gt;&lt;br /&gt;Macでのインストールをベースに書いていきます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・gccのバージョンをあげる&lt;br /&gt;kumofsのインストールにはgccの4.1以上が必要です&lt;br /&gt;MacではXcodeをインストールする事によってgccがインストールされますが、デフォルトのバージョンは4.0.1です&lt;br /&gt;4.2も一緒に入っているので、これを切り替えます&lt;br /&gt;&lt;br /&gt;cd /usr/bin&lt;br /&gt;sudo rm -rf cc gcc c++ g++&lt;br /&gt;sudo ln -s gcc-4.2 cc&lt;br /&gt;sudo ln -s gcc-4.2 gcc&lt;br /&gt;sudo ln -s c++-4.2 c++&lt;br /&gt;sudo ln -s g++-4.2 g++&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・TokyoCabinetのインストール&lt;br /&gt;最新のソースパッケージをダウンロードして&lt;br /&gt;&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・MessagePack(C++API)&lt;br /&gt;MessagePackはバイナリでシリアライズ可能な形式&lt;br /&gt;JSONのバイナリ版みたいな感じ、JSONよりもシリアライズ／デシリアライズが高速で、容量も小さい&lt;br /&gt;&lt;br /&gt;C/C++向けのソースパッケージをダウンロードして&lt;br /&gt;&lt;br /&gt;./confifure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・MessagePack(RubyAPI)&lt;br /&gt;&lt;br /&gt;gem install msgpack &lt;br /&gt;でさくっと入るはずなんだけど何故かうまくいかなかったので、ソースからインストールする&lt;br /&gt;Gitは http://code.google.com/p/git-osx-installer/ からダウンロード&lt;br /&gt;&lt;br /&gt;git clone git://git.sourceforge.jp/gitroot/msgpack/msgpack.git&lt;br /&gt;cd msgpack&lt;br /&gt;cd ruby&lt;br /&gt;ruby extconf.rb&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・kumofsのインストール&lt;br /&gt;最新のパッケージをダウンロードして&lt;br /&gt;&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;上記のインストールが終わっていれば正常にインストールされると思います&lt;br /&gt;&lt;br /&gt;/usr/local/bin/kumo*&lt;br /&gt;のファイルがあればＯＫです&lt;br /&gt;&lt;br /&gt;次回は実際に起動をしてデータを入れてみます&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8171132032850346423?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8171132032850346423/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8171132032850346423' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8171132032850346423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8171132032850346423'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/01/kumofs-mackumofs.html' title='kumofs その１・Macにkumofsを入れてみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-7143289192104148934</id><published>2010-01-27T10:04:00.003+09:00</published><updated>2010-01-27T10:11:23.784+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>コンパイルされたClassファイルからJavaのバージョンを取得する</title><content type='html'>Javaのバージョントラブルがあったので、忘れないうちにメモ！&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/dewa/20071102/1193990886"&gt;ココ&lt;/a&gt;を参考にしました。&lt;br /&gt;&lt;br /&gt;javap -v ClassFile | grep major&lt;br /&gt;（クラスファイル名に .class はなしでOK）&lt;br /&gt;&lt;br /&gt;で以下のように表示される（はず）&lt;br /&gt;&lt;br /&gt; major version: 47&lt;br /&gt;&lt;br /&gt;Javaのバージョンとの対比表&lt;br /&gt;&lt;br /&gt;1.1 = 45.3&lt;br /&gt;1.2 = 46.0&lt;br /&gt;1.3 = 47.0&lt;br /&gt;1.4 = 48.0&lt;br /&gt;1.5 = 49.0&lt;br /&gt;1.6 = 50.0&lt;br /&gt;&lt;br /&gt;なので、上記の場合は 1.3でコンパイルされている、と。&lt;br /&gt;Grailsって中のファイルとPluginでコンパイルされるバージョンが違う・・・Javaの参照の仕方が違うのかな&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-7143289192104148934?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/7143289192104148934/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=7143289192104148934' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7143289192104148934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7143289192104148934'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2010/01/classjava.html' title='コンパイルされたClassファイルからJavaのバージョンを取得する'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5473563675698173163</id><published>2009-12-26T17:16:00.003+09:00</published><updated>2009-12-26T17:20:26.626+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lift'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Lift On!</title><content type='html'>Scalaに引き続きLiftのテスト&lt;br /&gt;&lt;br /&gt;・Mavenが入っていると簡単&lt;br /&gt;&lt;br /&gt;mvn archetype:generate -U -DarchetypeGroupId=net.liftweb -DarchetypeArtifactId=lift-archetype-basic -DarchetypeVersion=1.0 -DremoteRepositories=http://Scala-tools.org/repo-releases -DgroupId=demo.helloworld -DartifactId=helloworld -Dversion=1.0&lt;br /&gt;&lt;br /&gt;で雛形からなにやらダウンロードしてくれる&lt;br /&gt;&lt;br /&gt;・helloworld というフォルダがプロジェクトになっているので、ここへ移動して jetty で起動する&lt;br /&gt;&lt;br /&gt;cd helloworld&lt;br /&gt;mvn jetty:run&lt;br /&gt;&lt;br /&gt;で、 http://localhost:8080 へアクセスすると、Liftの初期画面が表示される&lt;br /&gt;はじめからユーザ管理とかついているので、sign upでアカウントを作るとユーザ画面が表示される！&lt;br /&gt;速度はなかなかいい感じ&lt;br /&gt;初期はH2Databaseでファイルに保存されてます。&lt;br /&gt;&lt;br /&gt;LiftにはMVCでいうControllerの部分が明示的に存在しない&lt;br /&gt;ではどうするのかというと、Viewをメインに考えてSnippetをいうものを使う&lt;br /&gt;Snippetはパーツみたいな感じで、Viewにタグでぺたぺた貼り付けるという感じ、、、であってるかな |-`)&lt;br /&gt;&lt;br /&gt;サンプルプロジェクトでは、HelloWorldというSnippetが入っている&lt;br /&gt;src/webapp/index.html内の&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;lift:helloWorld.howdy /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;という部分でスニペットを読んでいる&lt;br /&gt;&lt;br /&gt;スニペットの中身は&lt;br /&gt;  def howdy = &amp;lt;span&amp;gt;Welcome to helloworld at {new _root_.java.util.Date}&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;という事なので、画面上には&lt;br /&gt;Welcome to helloworld at Sat Dec 26 16:43:00 JST 2009&lt;br /&gt;と表示されているわけだ！スゲー！&lt;br /&gt;&lt;br /&gt;・せっかくなんでスニペットを作ってみる&lt;br /&gt;def sample = &amp;lt;span&amp;gt;日本語テスト 1+1={1+1}&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;index.htmlへタグを追加&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;lift:helloWorld.sample /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;表示されました！&lt;br /&gt;日本語テスト 1+1=2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ですが、残念な事にSnippetのHotDeployに対応していません・・・&lt;br /&gt;と思ったらやっぱり&lt;a href=“http://www.mail-archive.com/liftweb@googlegroups.com/msg05205.html”&gt;みんな同じこと&lt;/a&gt;を考えているようです。&lt;br /&gt;&lt;br /&gt;JavaRevelってのとmvn scala:ccを使って実現しています。&lt;br /&gt;・Liftにあるpom.xml（Jettyの設定ファイル）にある scanIntervalSeconds を 0　にする。&lt;br /&gt;・MAVEN_OPTS=“-noverify -javaagent:/path/javarebel.jar” を設定する&lt;br /&gt;・mvn jetty:run して、別のコンソールから同じフォルダで mvn scala:cc する&lt;br /&gt;で、自動的にscalaファイルがコンパイルされて、JavaRebelがリロードしてくれます。&lt;br /&gt;&lt;br /&gt;でもやっぱりフレームワークで吸収してほしいなぁ&lt;br /&gt;そこらへんはGrailsの方が便利ですね&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5473563675698173163?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5473563675698173163/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5473563675698173163' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5473563675698173163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5473563675698173163'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/12/lift-on.html' title='Lift On!'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8379881126570107299</id><published>2009-12-26T15:50:00.002+09:00</published><updated>2009-12-26T15:51:36.291+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scalaはじめました</title><content type='html'>勉強会でScalaの紹介があったので、聞きながら試してみた&lt;br /&gt;&lt;br /&gt;・Scalaのダウンロード&lt;br /&gt;&lt;br /&gt;http://www.scala-lang.org/downloads からMac版をダウンロード&lt;br /&gt;適当な場所に解凍して bin/scala を実行&lt;br /&gt;&lt;br /&gt;Welcome to Scala version 2.7.7.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_17).&lt;br /&gt;Type in expressions to have them evaluated.&lt;br /&gt;Type :help for more information.&lt;br /&gt;&lt;br /&gt;scala&gt; &lt;br /&gt;&lt;br /&gt;・とりあえずハワロ！&lt;br /&gt;&lt;br /&gt;scala&gt; println("Hello World!") &lt;br /&gt;Hello World!&lt;br /&gt;&lt;br /&gt;・このままじゃ面白くないので、ファイルにして実行&lt;br /&gt;&lt;br /&gt;hello.scala&lt;br /&gt;&lt;br /&gt;println("Hello World!")&lt;br /&gt;&lt;br /&gt;[yossy@yossy-MacBook]# scala hello.scala&lt;br /&gt;Hello World!&lt;br /&gt;&lt;br /&gt;・順調なので、クラスを作ってみる&lt;br /&gt;&lt;br /&gt;object HelloWorld {&lt;br /&gt;  def main(args: Array[String]) {&lt;br /&gt;    if(args.length &gt; 0) {&lt;br /&gt;      println("Hello "+args(0)+"!")&lt;br /&gt;    } else {&lt;br /&gt;      println("usage: HelloWorld {yourname}")&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;scalac hello.scala&lt;br /&gt;でクラスファイルが出来る（コンパイル遅い気がする）&lt;br /&gt;&lt;br /&gt;・クラスファイルを実行&lt;br /&gt;&lt;br /&gt;[yossy@yossy-MacBook]# scala -cp . HelloWorld&lt;br /&gt;usage: HelloWorld {yourname}&lt;br /&gt;[yossy@yossy-MacBook]# scala -cp . HelloWorld yossy&lt;br /&gt;Hello yossy!&lt;br /&gt;&lt;br /&gt;classファイルだけど、scalaのライブラリが必要なのでそのままjavaで使えるわけではない。この辺はgroovyと同じです。&lt;br /&gt;&lt;br /&gt;MVCフレームワークのLiftってのがあるので今度はそれを試してみようかなぁ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8379881126570107299?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8379881126570107299/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8379881126570107299' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8379881126570107299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8379881126570107299'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/12/scala.html' title='Scalaはじめました'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5594096427224460741</id><published>2009-12-14T17:09:00.004+09:00</published><updated>2009-12-15T09:34:23.925+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CouchDB'/><title type='text'></title><content type='html'>&lt;a href="http://ponytailthes.blogspot.com/2009/12/mapreducedb-couchdb.html"&gt;前回&lt;/a&gt;の続き&lt;br /&gt;&lt;br /&gt;・データとURI&lt;br /&gt;データには一意のURIが割り当てわれます。&lt;br /&gt;http://127.0.0.1/${dbName}/${id}&lt;br /&gt;このURIにたいしてRESTする事でDBの操作を行う事が出来ます。&lt;br /&gt;&lt;br /&gt;・データの作成&lt;br /&gt;curl -X PUT http://127.0.0.1:5984/baseball/a89c8812a6f9e83f7b8e1848287de338 -d '{"name":"bar"}'&lt;br /&gt;{"ok":true,"id":"a89c8812a6f9e83f7b8e1848287de338","rev":"1-62bc3c4d01e43ee9d0cead8cd7c76041"}&lt;br /&gt;&lt;br /&gt;UUIDを指定してデータを入れるのですが、UUIDを作成する手段がない場合は、Couchから取得する事も出来ます。&lt;br /&gt; curl -X GET http://127.0.0.1:5984/_uuids         &lt;br /&gt;{"uuids":["a89c8812a6f9e83f7b8e1848287de338"]}&lt;br /&gt;&lt;br /&gt;・リビジョン&lt;br /&gt;CouchDBでは、データが更新されると自動的に履歴が残ります。&lt;br /&gt;_revというフィールドに設定される頭の数字がリビジョン番号になります。&lt;br /&gt;先程のデータを更新してみます。&lt;br /&gt; curl -X PUT http://127.0.0.1:5984/baseball/a89c8812a6f9e83f7b8e1848287de338 -d '{"name":"bar2nd"}'&lt;br /&gt;{"error":"conflict","reason":"Document update conflict."}&lt;br /&gt;おっと、エラーです。&lt;br /&gt;&lt;br /&gt;更新する際は、対象のリビジョンを指定する必要があります。&lt;br /&gt;curl -X PUT http://127.0.0.1:5984/baseball/a89c8812a6f9e83f7b8e1848287de338 -d '{"_rev":"1-62bc3c4d01e43ee9d0cead8cd7c76041","name":"bar2nd"}'&lt;br /&gt;{"ok":true,"id":"a89c8812a6f9e83f7b8e1848287de338","rev":"2-e3faaaf677273de632db3e628147558e"}&lt;br /&gt;&lt;br /&gt;revが2になりました。&lt;br /&gt;Futonから確認するとわかりますが、すべてのリビジョンでの情報を保持しています。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MmNDS6igmGM/SyXy39gTGwI/AAAAAAAAAEE/IaarCijUgnQ/s1600-h/127.0.0.1+screen+capture+2009-12-14-16-18-44.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://2.bp.blogspot.com/_MmNDS6igmGM/SyXy39gTGwI/AAAAAAAAAEE/IaarCijUgnQ/s320/127.0.0.1+screen+capture+2009-12-14-16-18-44.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5415001170199649026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MmNDS6igmGM/SyXy9Uvpi1I/AAAAAAAAAEM/bMQ0DTjPFT4/s1600-h/127.0.0.1+screen+capture+2009-12-14-16-19-2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://2.bp.blogspot.com/_MmNDS6igmGM/SyXy9Uvpi1I/AAAAAAAAAEM/bMQ0DTjPFT4/s320/127.0.0.1+screen+capture+2009-12-14-16-19-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5415001262337395538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;古いリビジョン情報は、CompactDBや、Replicationしたタイミングで消去されるようです。&lt;br /&gt;（残す方法はないのかな・・・）&lt;br /&gt;&lt;br /&gt;長くなりそうなので一旦ここまで・・・&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5594096427224460741?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5594096427224460741/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5594096427224460741' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5594096427224460741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5594096427224460741'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/12/uri-uri-http127.html' title=''/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_MmNDS6igmGM/SyXy39gTGwI/AAAAAAAAAEE/IaarCijUgnQ/s72-c/127.0.0.1+screen+capture+2009-12-14-16-18-44.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8999964805387884108</id><published>2009-12-14T15:47:00.003+09:00</published><updated>2009-12-14T15:52:30.757+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MapReduce'/><category scheme='http://www.blogger.com/atom/ns#' term='CouchDB'/><title type='text'>MapReduce系DB CouchDBを試してみた その１</title><content type='html'>いわゆるNoSQLデータベースというやつ、プチGoogleみたいでおもしろそう。&lt;br /&gt;&lt;a href="http://books.couchdb.org/relax/"&gt;オフィシャル&lt;/a&gt;を参考に&lt;br /&gt;&lt;br /&gt;・インストール&lt;br /&gt;Macなら、MacPortsで一発簡単&lt;br /&gt;sudo port install couchdb&lt;br /&gt;&lt;br /&gt;Windowsは非公式なバイナリパッケージがあるみたい&lt;br /&gt;&lt;br /&gt;・自動起動設定&lt;br /&gt;sudo launchctl load -w /opt/local/Library/LaunchDaemons/org.apache.couchdb.plist&lt;br /&gt;&lt;br /&gt;・動作確認&lt;br /&gt;curl http://127.0.0.1:5984&lt;br /&gt;{"couchdb":"Welcome","version":"0.10.0"}&lt;br /&gt;バージョン情報もJSON返し :)&lt;br /&gt;&lt;br /&gt;・すべてのDBを表示する&lt;br /&gt;curl -X GET http://127.0.0.1:5984/_all_dbs&lt;br /&gt;（curl -X はメソッド（GET,POST,PUT,DELETE)指定）&lt;br /&gt;&lt;br /&gt;[] 何も作ってないので空の配列がかえってくる&lt;br /&gt;&lt;br /&gt;・DBの作成&lt;br /&gt;curl -X PUT http://127.0.0.1:5984/baseball&lt;br /&gt;{"ok":true}&lt;br /&gt;&lt;br /&gt;確認&lt;br /&gt;curl -X GET http://127.0.0.1:5984/_all_dbs&lt;br /&gt;["baseball"]&lt;br /&gt;&lt;br /&gt;・もっかいやってみる&lt;br /&gt;curl -X PUT http://127.0.0.1:5984/baseball&lt;br /&gt;{"error":"file_exists","reason":"The database could not be created, the file already exists."}&lt;br /&gt;もうあるから作れんよ、と&lt;br /&gt;&lt;br /&gt;・DBの削除&lt;br /&gt;curl -X DELETE http://127.0.0.1:5984/baseball&lt;br /&gt;{"ok":true}&lt;br /&gt;&lt;br /&gt;確認&lt;br /&gt;curl -X GET http://127.0.0.1:5984/_all_dbs&lt;br /&gt;[]&lt;br /&gt;&lt;br /&gt;・管理画面&lt;br /&gt;実はインストールした時点で管理ツール（Futon）も一緒に入っている&lt;br /&gt;http://127.0.0.1:5984/_utils/&lt;br /&gt;で管理画面が表示されたらOK&lt;br /&gt;Futonへのアクセスはlocalhostではなく、127.0.0.1を使う方が良いらしい&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/SyXgSQ4kmmI/AAAAAAAAAD8/_exhyAVxTuw/s1600-h/127.0.0.1+screen+capture+2009-12-14-15-33-15.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/SyXgSQ4kmmI/AAAAAAAAAD8/_exhyAVxTuw/s320/127.0.0.1+screen+capture+2009-12-14-15-33-15.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5414980731357403746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;FutonからDBを作ったり、データを登録したりも可能&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえずここまで、次回はMapReduceでデータの取得とか&lt;br /&gt;Grailsも&lt;a href="http://www.grails.org/plugin/gorm-couchdb"&gt;CouchDBPlugin&lt;/a&gt;があるのでこれもテストしたい&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8999964805387884108?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8999964805387884108/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8999964805387884108' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8999964805387884108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8999964805387884108'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/12/mapreducedb-couchdb.html' title='MapReduce系DB CouchDBを試してみた その１'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MmNDS6igmGM/SyXgSQ4kmmI/AAAAAAAAAD8/_exhyAVxTuw/s72-c/127.0.0.1+screen+capture+2009-12-14-15-33-15.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-2444767983264249695</id><published>2009-11-18T11:34:00.003+09:00</published><updated>2009-11-18T11:38:01.424+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Air'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><title type='text'>Air2.0Beta!</title><content type='html'>Air2.0ついに公開されました。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/jp/joc/air2/beta/"&gt;ここ&lt;/a&gt;からダウンロード出来ます。&lt;br /&gt;&lt;br /&gt;色々あって、&lt;a href="http://www.adobe.com/jp/devnet/air/articles/photoconnect.html"&gt;このアプリ&lt;/a&gt;を作ってます。&lt;br /&gt;（見た目とかデフォのままなのでいけてないですが・・・）&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.info-event.jp/adobe/air/"&gt;Adobe AIR Day&lt;/a&gt;で紹介されるのかな？&lt;br /&gt;行くけど今回は喋りません :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-2444767983264249695?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/2444767983264249695/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=2444767983264249695' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2444767983264249695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2444767983264249695'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/11/air20beta.html' title='Air2.0Beta!'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-464539522744945950</id><published>2009-11-17T10:53:00.002+09:00</published><updated>2009-11-17T10:56:48.869+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovyで時間計算とか</title><content type='html'>すぐ忘れる・・・のでメモ&lt;br /&gt;&lt;br /&gt;JavaだとCalendarとか使わないといけなくて何かと面倒&lt;br /&gt;Groovyなら便利なのがあるよ！&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groovy.codehaus.org/api/org/codehaus/groovy/runtime/TimeCategory.html"&gt;TimeCategory&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;使い方はこんな感じ&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;use(org.codehaus.groovy.runtime.TimeCategory) {&lt;br /&gt;  def tm = new Date() + 1.days + 25.minute - 2.years&lt;br /&gt;  println tm.format("yyyy/MM/dd HH:mm")&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;簡単かつ、わかりやすいよね！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-464539522744945950?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/464539522744945950/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=464539522744945950' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/464539522744945950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/464539522744945950'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/11/groovy.html' title='Groovyで時間計算とか'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-6957180621147716295</id><published>2009-11-16T18:58:00.002+09:00</published><updated>2009-11-16T19:00:49.097+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Slim3'/><category scheme='http://www.blogger.com/atom/ns#' term='GoogleAppEngine'/><title type='text'>Slim3を試してみた</title><content type='html'>Slim3がPreviewReleaeされたと言うことなので&lt;a href="http://sites.google.com/site/slim3appengine/getting-started"&gt;Getting Started&lt;/a&gt;をみながら早速試してみました。&lt;br /&gt;&lt;br /&gt;・Eclipseのダウンロード&lt;br /&gt;3.5をゲッツ&lt;br /&gt;&lt;br /&gt;・まずは日本人なので日本語化 &lt;br /&gt;&lt;a href="http://mergedoc.sourceforge.jp/"&gt;ここ&lt;/a&gt;からダウンロード&lt;br /&gt;&lt;br /&gt;・EclipseにGooglePluginをインストール&lt;br /&gt;http://dl.google.com/eclipse/plugin/3.5 を指定してインストール&lt;br /&gt;&lt;br /&gt;・slim3の空プロジェクトをダウンロード&lt;br /&gt;&lt;a href="http://code.google.com/p/slim3/downloads/list"&gt;ここ&lt;/a&gt;から最新版をダウンロード&lt;br /&gt;&lt;br /&gt;・ファイル＞インポート＞既存のプロジェクトをワークスペースへ＞アーカイブファイルでダウンロードしたzipを選択&lt;br /&gt;&lt;br /&gt;・環境設定＞Java＞コードスタイル＞インポートの編成で java.lang.Math.*に必要な静的インポート数を１に&lt;br /&gt;&lt;br /&gt;・環境設定＞Java＞エディター＞コンテンツアシスト＞お気に入りで　新規タイプから以下の３つを追加&lt;br /&gt;org.hamcrest.CoreMatchers&lt;br /&gt;org.junit.Assert&lt;br /&gt;org.junit.matchers.JUnitMatchers&lt;br /&gt;&lt;br /&gt;・プロジェクト名を適当に変更して、war/WEB-INF/web.xml の以下の値も適当に変更&lt;br /&gt;&lt;br /&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;      &amp;lt;param-name&amp;gt;slim3.rootPackage&amp;lt;/param-name&amp;gt;&lt;br /&gt;      &amp;lt;param-value&amp;gt;slim3test&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;  &lt;br /&gt;・プロジェクトのプロパティから Javaコンパイラー＞注釈処理＞ファクトリーパス&gt;JARの追加で lib/slim3-gen-EA1-SNAPSHOT.jar を追加&lt;br /&gt;&lt;br /&gt;ここまでやってとりあえず実行可能な状態になったのでとりあえず走らせてみる&lt;br /&gt;&lt;br /&gt;The server is running at http://localhost:8080/&lt;br /&gt;&lt;br /&gt;と出たのでブラウザでアクセスしてみたら画面が出たよ！&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MmNDS6igmGM/SwEisnlq4gI/AAAAAAAAAD0/UxXKKMYwNhY/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 238px;" src="http://4.bp.blogspot.com/_MmNDS6igmGM/SwEisnlq4gI/AAAAAAAAAD0/UxXKKMYwNhY/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5404639177757876738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;しかしOnlineDemoもみても動作速度が遅い・・・（AppEngineが遅いんだろうけど）&lt;br /&gt;&lt;br /&gt;AppEngineにあげるのはGooglePlugin側の設定かな？&lt;br /&gt;次回はここいらへんをちょっとテストしてみたいと思います&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-6957180621147716295?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/6957180621147716295/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=6957180621147716295' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6957180621147716295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6957180621147716295'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/11/slim3.html' title='Slim3を試してみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MmNDS6igmGM/SwEisnlq4gI/AAAAAAAAAD0/UxXKKMYwNhY/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3554578977042187988</id><published>2009-11-11T11:27:00.004+09:00</published><updated>2009-11-11T16:52:54.981+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snow leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>SnowLeopardにしてあれこれ</title><content type='html'>前に使っていたMacBookProがSnowLeopardにアップデートできず（インストール完了後何事もなかったかのようにLeopardが立ち上がる）&lt;br /&gt;、放置プレイだったのですが tyama のお古のMacbook（not pro）を譲り受けたので思い切ってSnowLeopardをクリーンインストールしました。&lt;br /&gt;&lt;br /&gt;以下、色々困った事&lt;br /&gt;&lt;br /&gt;・ATOK を入れたら textmate で日本語がちゃんと入力出来ない&lt;br /&gt;&gt;ATOKのアップデートで解決&lt;br /&gt;&lt;br /&gt;・Java6しか入ってない&lt;br /&gt;ローカルでコンパイル＞サーバにアップしたらVersion違いでエラー出たっ！&lt;br /&gt;&lt;a href="http://builder.japan.zdnet.com/sp/snow-leopard-09/story/0,3800100196,20402666,00.htm"&gt;ココ&lt;/a&gt;を参考にJava5をインストール&lt;br /&gt;こういう時の為のCIなんだろうけど、ちょっとテストしたい時とかもあるので入れておくと便利&lt;br /&gt;&lt;br /&gt;・IPAフォントがインストール出来ない&lt;br /&gt;&lt;a href="http://dslabo.blog4.fc2.com/blog-entry-1624.html"&gt;ココ&lt;/a&gt;に解決方法がのってました。&lt;br /&gt;.otf を .ttf にするだけ・・・なにそれこわい&lt;br /&gt;&lt;br /&gt;・Exposeに設定したFunctionKeyが聞かなくなる&lt;br /&gt;よく見る症状です、いつになったら直るんだろう？&lt;br /&gt;ターミナルから killall Dock で復旧出来るけどすぐダメポになる&lt;br /&gt;&lt;br /&gt;でもトラックパッドが想像以上に使いにくくなったので、マウスでExposeしている&lt;br /&gt;久々に&lt;a href="http://www.logicool.co.jp/index.cfm/mice_pointers/mice/devices/165&amp;cl=jp,ja"&gt;コレ&lt;/a&gt;をひっぱりだした&lt;br /&gt;やっぱりマウスの方が圧倒的にポイント速度が速い・・・隠しているDockが表示されるまでの時間が遅いと感じるぐらいに&lt;br /&gt;&lt;br /&gt;*Bluetoothマウスが欲しくなった :)&lt;br /&gt;&lt;br /&gt;・64bit起動出来ない&lt;br /&gt;64キーを押しても、plist書き換えてもだめ、なんでじゃろい、proじゃないからか！&lt;br /&gt;&lt;br /&gt;・iWork'08 のNumbers が真っ白になって使えない&lt;br /&gt;&lt;a href="http://support.apple.com/downloads"&gt;ココ&lt;/a&gt;から1.0.3をダウンロードしたら直った&lt;br /&gt;&lt;br /&gt;色々あるけど、クリーンインストールしたら死ぬほど快適になった、Winと違ってMacはいつまでも快適！って思ってたけどやっぱりそうでもないのね :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3554578977042187988?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3554578977042187988/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3554578977042187988' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3554578977042187988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3554578977042187988'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/11/snowleopard.html' title='SnowLeopardにしてあれこれ'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5704374271550738406</id><published>2009-10-15T11:59:00.001+09:00</published><updated>2009-10-15T12:00:11.093+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='チューニング'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>Grails+postgresでDBチューニング</title><content type='html'>Grails+postgresでのチューニングで自分がやっている方法をざっくりとまとめ&lt;br /&gt;&lt;br /&gt;・postgresからスロークエリの検出をする&lt;br /&gt;&lt;br /&gt;postgresql.conf に設定&lt;br /&gt;&lt;br /&gt;log_min_duration_statement = 5000ms&lt;br /&gt;&lt;br /&gt;上記だと5秒以上かかった処理をログに書き出してくれます。&lt;br /&gt;Hibernateから実行したクエリは以下のような感じで書き出されます。&lt;br /&gt;&lt;br /&gt;LOG:  duration: 7912.798 ms  statement: EXECUTE &lt;unnamed&gt;  [PREPARE:  select book0_.id as book_1_ from BOOK book0_ where book0_.id=$1]&lt;br /&gt;&lt;br /&gt;・クエリのコストを検出する&lt;br /&gt;&lt;br /&gt;ログに出力されたクエリが実際にDBで検索にかかるコストを算出します。&lt;br /&gt;SQLの部分( select ~）の前に explain をつけて実際にクエリを実行します。&lt;br /&gt;（$1,$2等は実際の値に置き換えて下さい。）&lt;br /&gt;&lt;br /&gt;explain select book0_.id as book_1_ from BOOK book0_ where book0_.id=1&lt;br /&gt;&lt;br /&gt;すると以下のような情報が帰ってきます。&lt;br /&gt;&lt;br /&gt;Seq Scan on book this_  (cost=0.00..32955.18 rows=1 width=2104)&lt;br /&gt;  Filter: (id = 1)&lt;br /&gt;&lt;br /&gt;0~32955のコストが予想されています。&lt;br /&gt;&lt;br /&gt;・indexによるチューニングを行う&lt;br /&gt;&lt;br /&gt;10000を超えるようなコストはかなりの負荷になりますので、indexをつけてやります。&lt;br /&gt;（実際にはidにindexは必要ありません、検索対象となる名称とかに置き換えて下さい）&lt;br /&gt;&lt;br /&gt;CREATE INDEX id_idx&lt;br /&gt;  ON book&lt;br /&gt;  USING btree&lt;br /&gt;  (id);&lt;br /&gt;&lt;br /&gt;再度 explain 付きのクエリを実行すると、以下のような結果が帰ってきます。&lt;br /&gt;&lt;br /&gt;Bitmap Heap Scan on book this_ (cost=4.64..98.43 rows=1 width=2104)&lt;br /&gt;  Recheck Cond: (id = 1)&lt;br /&gt;  -&gt;  Bitmap Index Scan on id_idx  (cost=0.00..4.64 rows=1 width=0)&lt;br /&gt;        Index Cond: (id = 1)&lt;br /&gt;&lt;br /&gt;検索対象のフィールドにIndexがついていたため、indexを使って検索し、総コストが 4.64~98.43 となります。&lt;br /&gt;これであればサクサクと検索が実行されます :)&lt;br /&gt;&lt;br /&gt;postgresを対象に書きましたが、MySQLでもOracleでもexplainはありますので同じような流れでチューニング可能です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5704374271550738406?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5704374271550738406/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5704374271550738406' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5704374271550738406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5704374271550738406'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/10/grailspostgresdb.html' title='Grails+postgresでDBチューニング'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-7504784606690444230</id><published>2009-10-06T10:18:00.002+09:00</published><updated>2009-10-06T10:33:39.896+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Air'/><title type='text'>Air Flex visible=false で領域を確保しないように</title><content type='html'>良く忘れるのでメモ&lt;br /&gt;&lt;br /&gt;通常Air,Flexではlayoutを指定した状態（verticalとかhorizontalとか）で、配置されたオブジェクトのvisibleをfalseにしても、表示が消えるだけで詰めてはくれません。&lt;br /&gt;&lt;br /&gt;詰める場合は includeInLayout というアトリビュートを false にしてやればＯＫです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-7504784606690444230?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/7504784606690444230/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=7504784606690444230' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7504784606690444230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7504784606690444230'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/10/air-flex-visiblefalse.html' title='Air Flex visible=false で領域を確保しないように'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-1849498202201350630</id><published>2009-10-01T16:26:00.003+09:00</published><updated>2009-10-01T16:32:06.057+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><title type='text'>WinとMacでコマンドの実行時間を測定する</title><content type='html'>忘れそうなのでメモしておく、ただし標準で使えるコマンドで&lt;br /&gt;&lt;br /&gt;・Mac&lt;br /&gt;&lt;br /&gt;time コマンドを使ってその後のコマンドにかかった時間を教えてくれる&lt;br /&gt;&lt;br /&gt;time copy /tmp/hoge.zip .&lt;br /&gt;&lt;br /&gt;real    0m0.028s&lt;br /&gt;user    0m0.001s&lt;br /&gt;sys     0m0.019s&lt;br /&gt;&lt;br /&gt;複数コマンドのトータル結果を知り合い場合は、コマンドを並べたシェルスクリプトを time で実行してやれば良い&lt;br /&gt;&lt;br /&gt;test.sh&lt;br /&gt;time copy /tmp/hoge.zip .&lt;br /&gt;time copy /tmp/foo.zip .&lt;br /&gt;&lt;br /&gt;time sh test.sh&lt;br /&gt;&lt;br /&gt;シェルスクリプトの中のコマンドも全部time書いておけば、一個づつにかかった時間と、最後にトータルの時間がわかる&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・Windows&lt;br /&gt;&lt;br /&gt;以下のようなbatを作って実行すると、開始時間と終了時間がわかるので引き算するとかかった時間がわかる&lt;br /&gt;&lt;br /&gt;echo %time%&lt;br /&gt;copy c:¥tmp¥hoge.zip .&lt;br /&gt;copy c:¥tmp¥foo.zip .&lt;br /&gt;echo %time%&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-1849498202201350630?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/1849498202201350630/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=1849498202201350630' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1849498202201350630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1849498202201350630'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/10/winmac.html' title='WinとMacでコマンドの実行時間を測定する'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-4490174136687161066</id><published>2009-09-14T11:06:00.000+09:00</published><updated>2009-09-14T11:07:17.878+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='tcServer'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Spring tcServer 超入門！インストール編</title><content type='html'>GrailsがSpringFrameworkに買収され（今はそのSpringがVMWareに買収されましたが）、Springには元tomcatの中の人達が居るらしく&lt;br /&gt;Groovy/Grailsを動かすにはtcServerが最適らしい&lt;br /&gt;そんなわけでとりあえずインストールしてみた&lt;br /&gt;&lt;br /&gt;まずは tcServer の構成から&lt;br /&gt;tcServer = いわゆるインスタンす部分、中身はtomcat&lt;br /&gt;AMS agent = 同PC内のtcServerをまとめる&lt;br /&gt;serverのconfigはここで管理するっぽい&lt;br /&gt;&lt;br /&gt;AMS Server = AMS agentをまとめる、apacheのかわりになる部分っぽい&lt;br /&gt;&lt;br /&gt;AMS Serverを受け口としてAMS agentへ割り振り、agentがインスタンスを管理している、と・・・そんな感じでしょうか&lt;br /&gt;Server hasMany Manager hasMany Instance な感じ、AMS Server自体は分散処理が必要なのかな・・・？&lt;br /&gt;&lt;br /&gt;・まずはMacへインストールしてみる&lt;br /&gt;tcServer-6.0.20.A-SR1-macosx-node.tgz をダウンロード&lt;br /&gt;解凍して install.sh を実行&lt;br /&gt;Macには AMS agent と tcServer とかしかない&lt;br /&gt;どっちを入れるか聞いてくるので、とりあえず両方インストール&lt;br /&gt;&lt;br /&gt;・tcServer Instanceを作成&lt;br /&gt;cd tcServer-6.0&lt;br /&gt; ./tcserver-instance.sh -s testserver -v 6.0.20.A&lt;br /&gt;&lt;br /&gt;testserverという名称で tomcat のバージョンは 6.0.20.A を指定&lt;br /&gt;これで testserver フォルダと tomcat-6.0.20.A フォルダが出来る&lt;br /&gt;デフォルトだと以下のポートが使用されるらしい&lt;br /&gt;HTTP listen port: 8080&lt;br /&gt;JMX port: 6969&lt;br /&gt;AJP port: 8009&lt;br /&gt;Shutdown port: -1&lt;br /&gt;&lt;br /&gt;・testserverを起動&lt;br /&gt;testserver/bin/tcserver-ctl.sh start&lt;br /&gt;&lt;br /&gt;http://localhost:8080 にアクセスして tcServer の画面が出れば起動は成功&lt;br /&gt;&lt;br /&gt;・アプリケーションの配備&lt;br /&gt;単純にデプロイするだけなら testserver/webapps へwarをコピーすればＯＫ&lt;br /&gt;&lt;br /&gt;次回はAMSを使ったクラスタや自動デプロイ等に挑戦！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-4490174136687161066?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/4490174136687161066/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=4490174136687161066' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4490174136687161066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4490174136687161066'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/09/spring-tcserver.html' title='Spring tcServer 超入門！インストール編'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-6128105531379062564</id><published>2009-09-04T11:32:00.002+09:00</published><updated>2009-09-04T11:38:47.818+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails 1.1.1でDomainのsaveについて</title><content type='html'>Grails1.1.1でたまに .save() でエラーが出る事があります。&lt;br /&gt;MissingPropertyException for "save" って感じなのですが、saveはメソッドなのにプロパティー扱いされてます・・・&lt;br /&gt;&lt;br /&gt;これがまた絶対起きる訳ではなく、同じコードでもcleanしたら発生したりしなかったりとやっかいなものです。&lt;br /&gt;現在は修正済みらしく、1.1.2 or 1.2では直るようです。&lt;br /&gt;&lt;a href="http://jira.codehaus.org/browse/GRAILS-4580"&gt;JIRAはこちら&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;JIRAにも書いてありますが、HibernateGrailsPluginの初期化がうまくいってないようです。&lt;br /&gt;回避方法としてはドメインの .count とか .list とかを使うと初期化がされるようで、Bootstrap.groovy に以下を追加すれば、&lt;br /&gt;すべてのドメインを初期化してくれます。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;import org.codehaus.groovy.grails.commons.ApplicationHolder&lt;br /&gt;&lt;br /&gt;class BootStrap {&lt;br /&gt;    def init = { servletContext -&gt;&lt;br /&gt;        // workaround for GRAILS-4580&lt;br /&gt;        ApplicationHolder.application.domainClasses.each { dc -&gt;&lt;br /&gt;            dc.clazz.count()&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-6128105531379062564?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/6128105531379062564/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=6128105531379062564' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6128105531379062564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6128105531379062564'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/09/grails-111domainsave.html' title='Grails 1.1.1でDomainのsaveについて'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5801525635872481685</id><published>2009-09-03T10:36:00.002+09:00</published><updated>2009-09-03T10:42:30.823+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSH'/><title type='text'>SSHポートフォワーディングでVNC（とかリモートデスクトップとか）</title><content type='html'>VPNが使えれば悩む事は無いんだけど、そうでもない環境の場合もちょくちょくあるかと思います。&lt;br /&gt;そんな時、SSHが入れるのであればSSHポートフォワーディングを使いましょう。&lt;br /&gt;&lt;br /&gt;なんだかフォワーディングとかめんどくさそうな雰囲気が漂っていますが、以外に簡単です。&lt;br /&gt;要領としては、SSHクライアントが特定のポートを受け付ける状態になり、そこへアクセスするとSSH越しに設定した向こう側のPCの特定のポートへアクセス出来るというわけです。&lt;br /&gt;（SSHでログインしたサーバでTCPフォーワーディングが許可されている必要があります）&lt;br /&gt;&lt;br /&gt;SSHクライアントが仮想サーバになるようなイメージというのでしょうか・・・&lt;br /&gt;Windowsの場合はTeraTermで&lt;a href="http://nai.homelinux.net/ssh_forward.html"&gt;ココ&lt;/a&gt;にわかりやすく解説されています&lt;br /&gt;Macであればsshコマンドを使って出来ます、&lt;a href="http://www.tku.ac.jp/~densan/local/ssh-port/port-mac.html"&gt;ココ&lt;/a&gt;に詳しくのっています。&lt;br /&gt;&lt;br /&gt;思ったよりも簡単に接続出来ますね :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5801525635872481685?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5801525635872481685/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5801525635872481685' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5801525635872481685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5801525635872481685'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/09/sshvnc.html' title='SSHポートフォワーディングでVNC（とかリモートデスクトップとか）'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-901472753620735816</id><published>2009-08-24T20:13:00.002+09:00</published><updated>2009-08-24T20:32:23.655+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fxug'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>fxugに参戦！</title><content type='html'>&lt;a href="http://www.fxug.net/modules/bwiki/index.php?cmd=read&amp;page=Flex%CA%D9%B6%AF%B2%F1%C2%E878%B2%F3%A1%F7%CC%BE%B8%C5%B2%B0%BB%B2%B2%C3%BC%F5%C9%D5"&gt;fxugの名古屋の第２回勉強会&lt;/a&gt;へスピーカーとして参加しました&lt;br /&gt;&lt;br /&gt;内容は一からライブコーディングでGrails+BlazeDSの通信を実現するというものです。&lt;br /&gt;今回はFlexのUserGroupと言う事でGrailsが受け入れられるのか若干不安でしたが、アンケート結果を軽く見せてもらったら思ったよりもGrailsへの関心をもっていただけ、楽しんでもらえたようで内心ホッとしております。&lt;br /&gt;これを機にGrailsユーザが一人でも増えれば幸いです :)&lt;br /&gt;&lt;br /&gt;今回個人的に興味をもったのが、FlashCatalystとFlashBuilder4です。&lt;br /&gt;Catalystはイラレ（というと東京では怒られるらしい！？）で作ったaiファイルを読み込んで、入力フォームやらシーンやらアニメーションに動作やらを指定してやるとそのままFlashBuilderで読み込んでコンポーネントとして使えますよ！みたいなものです。&lt;br /&gt;インターフェースと実装を完全に切り分けて作る事で、今までエフェクトの動作やシーンの切替（このボタン押すと詳細がここに表示されて〜みたいな感じの）をプログラマが実装していたのをデザイナー側でやれるという事です。&lt;br /&gt;&lt;br /&gt;FlashBuilder4はRemoteObjectからウィザードでデータを取得してDataGrid等とマッピング、さらにマッピングしたオブジェクトからフォームを自動生成が出来るという新機能を実装しています。&lt;br /&gt;これはなかなかおもしろいのですが、欲を言えばフォームの動的生成なんかが出来るともっと良いですね！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-901472753620735816?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/901472753620735816/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=901472753620735816' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/901472753620735816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/901472753620735816'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/08/fxug.html' title='fxugに参戦！'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-710848384275733279</id><published>2009-07-14T09:28:00.007+09:00</published><updated>2009-07-21T13:19:45.493+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GoogleMap'/><title type='text'>GoogleMapとジオコーディング（住所検索）について</title><content type='html'>GoogleMapAPIを登録すると、以下のようなサンプルが表示されます。&lt;br /&gt;デベロッパーガイドを見ていても大体同じような感じです。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt; &amp;lt;script src="http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;&amp;amp;key=xxxxxxxxxxx" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これで大体の場合は普通に使えるのですが、ジオコーディングを使う場合は注意が必要です。&lt;br /&gt;ロケールの指定というのがあるのですが、 http://maps.google.com から取得するとこれが日本になっていません。&lt;br /&gt;日本になっていない場合でも大概はうまくいくのですが、以下のように違う場所を表示したりする場合があります。&lt;br /&gt;（ブラウザによっては同じ表示になる場合があるようです、Firefoxでは違う位置になりました）&lt;br /&gt;&lt;br /&gt;以下の二つをFirefoxで見ると数値が違うのがわかると思います。（リンクだとうまくいかないのでコピーペーストして下さい。）&lt;br /&gt;http://maps.google.com/maps/geo?q=%E6%BB%8B%E8%B3%80%E7%9C%8C%E8%8D%89%E6%B4%A5%E5%B8%82&lt;br /&gt;http://maps.google.co.jp/maps/geo?q=%E6%BB%8B%E8%B3%80%E7%9C%8C%E8%8D%89%E6%B4%A5%E5%B8%82&lt;br /&gt;&lt;br /&gt;ちなみに二つの位置を地図で表示すると、以下のようにずれています。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/SmVBj0DaKiI/AAAAAAAAADk/9JDQs2z_Kl0/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 303px; height: 288px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/SmVBj0DaKiI/AAAAAAAAADk/9JDQs2z_Kl0/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5360763014978611746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MmNDS6igmGM/SmVBsNbaDPI/AAAAAAAAADs/ScjgBKkN-_8/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 223px; height: 269px;" src="http://2.bp.blogspot.com/_MmNDS6igmGM/SmVBsNbaDPI/AAAAAAAAADs/ScjgBKkN-_8/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5360763159229107442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;これはJSON以外にもXMLやJavaScript(GClientGeocoder)で取得する場合も同じです。&lt;br /&gt;日本の指定にはAPIのパラメーラーに hl=ja をつけるか、 http://maps.google.co.jp/maps で取得すればＯＫです。&lt;br /&gt;日本国内の使用に関しては設定しておいた方が良さそうです。&lt;br /&gt;&lt;br /&gt;2009/7/21 ずれがわかりにくかったので修正しました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-710848384275733279?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/710848384275733279/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=710848384275733279' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/710848384275733279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/710848384275733279'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/07/googlemap.html' title='GoogleMapとジオコーディング（住所検索）について'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MmNDS6igmGM/SmVBj0DaKiI/AAAAAAAAADk/9JDQs2z_Kl0/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3573513004948954596</id><published>2009-07-12T21:40:00.005+09:00</published><updated>2009-07-12T22:26:52.846+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Codec'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grailsで簡単暗号化！ Grails Codecを使ってみよう！</title><content type='html'>Grailsで暗号化をするのは凄く簡単です。&lt;br /&gt;&lt;a href="http://grails.org/doc/1.1.1/ref/Plug-ins/codecs.html"&gt;公式ドキュメント&lt;/a&gt;にも乗っていますが、Objectに encodeAsBase64() というのが注入されています。&lt;br /&gt;複合は decodeBase64() を使います。&lt;br /&gt;&lt;br /&gt;なので hoge を暗号化すると、以下のコードになります。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;def key="hoge".encodeAsBase64() //暗号化&lt;br /&gt;println key&lt;br /&gt;println new String(key.decodeBase64()) //複合化&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;decodeBase64() では byte配列が返ってくるので、new Stringしてやると文字列として読み取れる形式になります。&lt;br /&gt;&lt;br /&gt;これをGroovyだけでやると以下のようになります。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;def bytes="hoge".getBytes()&lt;br /&gt;def key=bytes.encodeBase64().toString()&lt;br /&gt;println key&lt;br /&gt;println new String(key.decodeBase64())&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ところで、GrailsにはencodeAsBase64()以外にも色々なCodec（encode,decode出来るもの）が用意されています。&lt;br /&gt;（encodeAsHTML()などはscaffoldしたgspにかかれていますね）&lt;br /&gt;更にCodecは自分で追加する事が出来ます。&lt;br /&gt;grails-app/utilsフォルダへ HogeCodec.groovy というファイルを追加し、 encode、decodeというStaticメソッドを用意します。&lt;br /&gt;（Codecファイルを作るスクリプトがあってもいいと思うのですが見当たりませんでした・・・）&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;class HogeCodec {&lt;br /&gt;  static encode = { theTarget -&gt;&lt;br /&gt;    return "hoge encode!!!"&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  static decode = { theTarget -&gt;&lt;br /&gt;    return "hoge decode!!!"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これでObjectへ encodeAsHoge() と decodeHoge() が注入されます、簡単ですね！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3573513004948954596?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3573513004948954596/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3573513004948954596' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3573513004948954596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3573513004948954596'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/07/grails.html' title='Grailsで簡単暗号化！ Grails Codecを使ってみよう！'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3220001883616580620</id><published>2009-07-07T14:31:00.003+09:00</published><updated>2009-07-07T14:42:24.568+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><title type='text'>GlassFishで管理コンソールのURL（コンテキスト）を変更する</title><content type='html'>リモート管理用で1IP割り当てられた状況から複数のGlassFishを触るという機会があったのでやってみました。&lt;br /&gt;&lt;br /&gt;glassfish/domain/domain1/config/domain.xml の以下、赤字部分を編集します。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code"&gt;&lt;br /&gt;&amp;lt;web-module availability-enabled="false" &lt;div style="color:red"&gt;context-root="/gfadmin"&lt;/div&gt;&lt;br /&gt; directory-deployed="true" enabled="true"&lt;br /&gt; location="${com.sun.aas.installRoot}/lib/install/applications/admingui/adminGUI_war"&lt;br /&gt; name="admingui" object-type="system-admin"&amp;gt;&lt;br /&gt;  &amp;lt;!-- System Web Module - DO NOT DELETE! --&amp;gt;&lt;br /&gt;&amp;lt;/web-module&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ちなみにポートが自由に使えるのであれば、ポートを変更する方法もあります。&lt;br /&gt;設定 &gt; HTTPサービス &gt; HTTPリスナー &gt; admin-listener のポートを変更して再起動です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3220001883616580620?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3220001883616580620/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3220001883616580620' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3220001883616580620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3220001883616580620'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/07/glassfishurl.html' title='GlassFishで管理コンソールのURL（コンテキスト）を変更する'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8843503837501433672</id><published>2009-07-02T10:07:00.003+09:00</published><updated>2009-07-02T10:20:12.699+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails/Groovy勉強会やります</title><content type='html'>JGGUGの第２回名古屋支部イベント「Grails/Groovy勉強会」でスピーカーをやる事になりました。&lt;br /&gt;&lt;br /&gt;詳細は&lt;a href="http://www.jggug.org/news/dai2kainagoyashibuibento%E3%80%8Cgrailsgroovybenkyoukai%E3%80%8D"&gt;こちら&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;「Grailsで｛さくさく｝作るRIA」ですが、内容は入門編です。&lt;br /&gt;続きも考えて居ますので、興味ある方は無料なんで是非ご来場下さい :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8843503837501433672?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8843503837501433672/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8843503837501433672' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8843503837501433672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8843503837501433672'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/07/grailsgroovy.html' title='Grails/Groovy勉強会やります'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-1745906117217382348</id><published>2009-06-22T15:02:00.001+09:00</published><updated>2009-06-22T15:04:04.230+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mod_proxy'/><category scheme='http://www.blogger.com/atom/ns#' term='ssl'/><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><title type='text'>GlassFIsh + Apache(mod_proxy_balancer) で SSL</title><content type='html'>mod_proxyを以下のように設定&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;  ProxyPreserveHost on&lt;br /&gt;  RewriteEngine  on&lt;br /&gt;&lt;br /&gt;  RequestHeader Set Proxy-keysize 512&lt;br /&gt;  RequestHeader Set Proxy-ip %{REMOTE_ADDR}e&lt;br /&gt;&lt;br /&gt;  ProxyPass /test balancer://gf/test timeout=10 stickysession=JSESSIONID&lt;br /&gt;  &amp;lt;Proxy balancer://gf&amp;gt;&lt;br /&gt;    BalancerMember http://192.168.0.1:38080 loadfactor=10 retry=5 route=instance1&lt;br /&gt;    BalancerMember http://192.168.0.1:38081 loadfactor=10 retry=5 route=instance3&lt;br /&gt;    BalancerMember http://192.168.0.2:38080 loadfactor=10 retry=5 route=instance2&lt;br /&gt;    BalancerMember http://192.168.0.2:38081 loadfactor=10 retry=5 route=instance4&lt;br /&gt;  &amp;lt;/Proxy&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ポイントはRequestHeaderの２カ所！&lt;br /&gt;&lt;br /&gt;そして、GlassFishに以下の２つのプロパティを追加&lt;br /&gt;&lt;br /&gt;設定＞default-config＞HTTPサービス＞追加プロパティ&lt;br /&gt;&lt;br /&gt;名前：authPassthroughEnabled&lt;br /&gt;値：true&lt;br /&gt;&lt;br /&gt;名前：proxyHandler&lt;br /&gt;値：com.sun.enterprise.web.ProxyHandlerImpl&lt;br /&gt;&lt;br /&gt;上で設定したProxy-ipとかを利用する為の設定です&lt;br /&gt;&lt;br /&gt;参考URL&lt;br /&gt;&lt;a href="http://www.manorrock.com/documents/glassfish/proxy-ssl.html"&gt;http://www.manorrock.com/documents/glassfish/proxy-ssl.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.sun.com/app/docs/doc/820-7434/6nimnhpqr?a=view"&gt;http://docs.sun.com/app/docs/doc/820-7434/6nimnhpqr?a=view&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.sun.com/app/docs/doc/820-7434/gcwrb?a=view"&gt;http://docs.sun.com/app/docs/doc/820-7434/gcwrb?a=view&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-1745906117217382348?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/1745906117217382348/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=1745906117217382348' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1745906117217382348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1745906117217382348'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/06/glassfish-apachemodproxybalancer-ssl.html' title='GlassFIsh + Apache(mod_proxy_balancer) で SSL'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-6130633676975921858</id><published>2009-06-15T10:57:00.002+09:00</published><updated>2009-06-15T10:58:27.750+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails+MySQL Clusterでのトラブル</title><content type='html'>Grails+MySQL Clusterでのハマったのでメモメモ&lt;br /&gt;（Grailsじゃなくても起こる問題なんだけども）&lt;br /&gt;&lt;br /&gt;開発環境時はMyISAMでうまく行っていたのですが、サーバへアップした時にテーブルが作成出来ずにエラーとなりました。&lt;br /&gt;何度やっても特定のテーブルだけが作成されなかったのでMyISAMで作成したDBをダンプアウトしてSQLで流し込んでみたら「Row size too large」だとかなんとか・・・&lt;br /&gt;&lt;br /&gt;Google先生に聞いてみたら以下で同様なトラブル事例が&lt;br /&gt;&lt;a href=”http://forums.mysql.com/read.php?25,33433,33433”&gt;http://forums.mysql.com/read.php?25,33433,33433&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Clusterではサイズ指定されたフィールドが 8052バイトを超えるとNGらしいです。&lt;br /&gt;&lt;br /&gt;UTF-8では１文字3バイトなのでGrailsのDomain上で、&lt;br /&gt;Stringのフィールドをmapping指定せずに作った場合 varchar(255) で１フィールド辺り768バイト使用されます。&lt;br /&gt;なのでString指定のフィールドを作る場合は極力mappingを指定するようにしましょう。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;class Book {&lt;br /&gt;  static mapping = {&lt;br /&gt;     name type:”text”&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  String name&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-6130633676975921858?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/6130633676975921858/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=6130633676975921858' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6130633676975921858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6130633676975921858'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/06/grailsmysql-cluster.html' title='Grails+MySQL Clusterでのトラブル'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5430942412744967376</id><published>2009-06-11T10:25:00.001+09:00</published><updated>2009-06-11T10:27:05.245+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>Subversionの移行とバックアップについて</title><content type='html'>ちょっとSubversionを移行する機会があったのでメモ&lt;br /&gt;&lt;br /&gt;SVNを作成&lt;br /&gt;svnadmin create repoName&lt;br /&gt;&lt;br /&gt;バックアップの作成&lt;br /&gt;svnadmin dump repoName &gt; repo.dump&lt;br /&gt;&lt;br /&gt;バックアップのリストア&lt;br /&gt;svnadmin load repoName &lt; repo.dump&lt;br /&gt;&lt;br /&gt;ファイルを丸ごとコピーしてもいけるっぽいけど、環境によってはNGっぽいのでdumpを使う事にしました。&lt;br /&gt;&lt;br /&gt;バックアップをする時は、必ずsvnのユーザで実行する事！rootはだめ！&lt;br /&gt;dump した時にエラーが出る場合は repoName/db/log* のファイルが壊れている事があります。&lt;br /&gt;だからと言って log* ファイルは結構大事なファイルなので、さくっと消してはいけません。&lt;br /&gt;&lt;br /&gt;そんな時にはリカバリコマンド&lt;br /&gt;svnadmin recover repoName&lt;br /&gt;&lt;br /&gt;もちろんこれもsvnユーザで。rootユーザでやってリポジトリ壊れたのはいい思い出・・・&lt;br /&gt;&lt;br /&gt;cronで常用バックアップしたい場合は svn-backup-dumps.py を使うと便利！&lt;br /&gt;SVN1.4以降なら一緒にインストールされてます。&lt;br /&gt;&lt;a href=”http://www.asahi-net.or.jp/~iu9m-tcym/svndoc/svn_backup_dumps_py.html”&gt;ここ&lt;/a&gt;に詳しい事が乗っています。&lt;br /&gt;&lt;br /&gt;こんな感じのスクリプトを作って&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;DUMP="/subversion-1.4.2/tools/server-side/svn-backup-dumps.py"&lt;br /&gt;BACKUPDIR="/svnbackup/"&lt;br /&gt;&lt;br /&gt;for var in `ls -F /svn/repos|grep /`&lt;br /&gt;do&lt;br /&gt; BKSVN="$BACKUPDIR$var"&lt;br /&gt; mkdir $BKSVN&lt;br /&gt; $DUMP -c 10 $var $BKSVN&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;crontab に設定&lt;br /&gt;05 4 * * * root /root/svnbackup.sh&lt;br /&gt;&lt;br /&gt;これでrepos以下にあるリポジトリ全部を /svnbackup へバックアップしてくれます、リポジトリが増えても安心！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5430942412744967376?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5430942412744967376/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5430942412744967376' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5430942412744967376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5430942412744967376'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/06/subversion.html' title='Subversionの移行とバックアップについて'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-4994345625955841511</id><published>2009-06-08T21:10:00.006+09:00</published><updated>2009-06-08T21:36:08.663+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='車'/><title type='text'>ありがとう、さようなら</title><content type='html'>&lt;a href="http://ponytailthes.blogspot.com/2008/02/blog-post.html"&gt;去年買ったシビック&lt;/a&gt;を売る事になりました&lt;br /&gt;&lt;br /&gt;もの凄く良い車だったのですが、維持が困難になったしまったので仕方なく・・・&lt;br /&gt;思えばノーマルのまま乗り続けたのは今まででこの車だけなんだなぁと、改めて感動を覚えました&lt;br /&gt;&lt;br /&gt;久しぶりにサーキットも行って、車を走らせる楽しさを思い出させてくれました&lt;br /&gt;&lt;br /&gt;またいつかこんな車に出会えると信じて&lt;br /&gt;&lt;br /&gt;今は、ありがとうの気持ちを形に残しておきたいと思います&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/Si0FpGhpCMI/AAAAAAAAADc/oHKySdJlTNk/s1600-h/DSC00152.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/Si0FpGhpCMI/AAAAAAAAADc/oHKySdJlTNk/s320/DSC00152.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5344934536443136194" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-4994345625955841511?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/4994345625955841511/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=4994345625955841511' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4994345625955841511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4994345625955841511'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/06/blog-post.html' title='ありがとう、さようなら'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MmNDS6igmGM/Si0FpGhpCMI/AAAAAAAAADc/oHKySdJlTNk/s72-c/DSC00152.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-1596562146431147726</id><published>2009-05-19T13:44:00.005+09:00</published><updated>2009-05-21T00:01:24.605+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails 1.1.1 でプラグインリポジトリ（認証付き）を使ってみた</title><content type='html'>Grails1.1.1がリリースされた事もあり、自分プラグインリポジトリを試してみました。&lt;br /&gt;&lt;br /&gt;1.1系になり、プラグイン周りが大幅に変わったのは&lt;a href="http://d.hatena.ne.jp/mottsnite/20090222/1235290545"&gt;コチラ&lt;/a&gt;で詳しく解説されています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;では早速実践です！（環境はMacです）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まずはSubversion Clientを1.5系にします（SVNKitの部分で1.5以外はうまく動作しませんでした）&lt;br /&gt;&lt;a href="http://subversion.tigris.org/getting.html"&gt;ココ&lt;/a&gt;から探っていくと過去のバージョンもありましたのでそこから 1.5.6 を入れました。&lt;br /&gt;&lt;br /&gt;次にSVNリポジトリを作成します。リポジトリ側のバージョンは1.5でなくてもＯＫです。（今回は 1.4.2 でテストしました）&lt;br /&gt;サーバ側の設定は何もありません、中身も空で良いです。&lt;br /&gt;&lt;br /&gt;開発環境orプロジェクトへリポジトリ設定を追加します。&lt;br /&gt;開発環境に追加する場合は ~/.grails/settings.groovy ファイルへ、&lt;br /&gt;プロジェクト毎に設定する場合はプロジェクトの grails-app/conf/BuildConfig.groovy ファイルへ以下の内容を記述します。&lt;br /&gt;&lt;br /&gt;grails.plugin.repos.discovery.リポジトリ名称=SVN URL&lt;br /&gt;grails.plugin.repos.distribution.リポジトリ名称=SVN URL&lt;br /&gt;&lt;br /&gt;discovery は取得（list-pluginsやinstall-plugin）、&lt;br /&gt;distribution はコミット（release-plugin）の設定です。&lt;br /&gt;&lt;br /&gt;開発環境とプロジェクトの両方に同じリポジトリ名称が設定されている場合はプロジェクトに設定された方が優先されます。&lt;br /&gt;&lt;br /&gt;SVNのURLは認証が無い場合はそのまま、http://svnurl/ と記述すればＯＫですが、今回はBasic認証を使います。&lt;br /&gt;Basic認証を使う場合には https を使用する必要があります。&lt;br /&gt;&lt;br /&gt;試しに https://svnurl/ だけ指定して list-plugins するとユーザ名とパスワードを聞かれます。&lt;br /&gt;ですが、これ list-plugins 以外にも run-app 等毎回聞かれます、しかもhttpsのリポジトリが複数あると、すべてのパスワードを毎回聞かれてうっとおしいことこの上ないです。（しかもパスワード入力がマスクされないので丸見えです :p）&lt;br /&gt;&lt;br /&gt;ユーザを聞かれないようにするには https://username:password@svnurl と入力しておきます。&lt;br /&gt;ですがこれもパスワード丸見えなので、BuildConfig.groovy に書いておくとチームで使うには不便です。&lt;br /&gt;（とりあえずチーム内で使うには各自の settings.groovy へ書いておくのが得策と思われます）&lt;br /&gt;&lt;br /&gt;ここまで設定出来れば準備完了です。&lt;br /&gt;適当な plugin を作成し、releaseしてみましょう。&lt;br /&gt;&lt;br /&gt;grails create-plugin testPlugin&lt;br /&gt;cd testPlugin&lt;br /&gt;grails release-plugin -repository=リポジトリ名称&lt;br /&gt;&lt;br /&gt;コミットメッセージ等を聞かれて、うまくいけばSVNへプロジェクトがコミットされます。&lt;br /&gt;初releaseの場合はリポジトリに .plugin-meta/plugin-list.xml ファイルが作成されます。&lt;br /&gt;この中にそのリポジトリ内のpluginの情報が記述されます。&lt;br /&gt;ファイルがうまく作成されていたら以下のコマンドを実行して確認してみましょう。&lt;br /&gt;&lt;br /&gt;grails list-plugins -repository=リポジトリ名称&lt;br /&gt;&lt;br /&gt;先程releaseした testPlugin が表示されれば成功です。&lt;br /&gt;&lt;br /&gt;ですが、今 release したローカルのファイルはsvnの管理下にいないので、次のバージョンをリリースするには、&lt;br /&gt;一度アップされた plugin を checkout して、更新後、release-plugin する必要があります。&lt;br /&gt;１回目だけはちょっと面倒です。&lt;br /&gt;&lt;br /&gt;最後に通常のGrailsプロジェクトを作成し、insall-plugin 出来れば完璧です。&lt;br /&gt;&lt;br /&gt;grails create-app test&lt;br /&gt;cd test&lt;br /&gt;grails install-plugin test-plugin&lt;br /&gt;&lt;br /&gt;これでチーム開発をする時に plugin ファイルを共有する必要がなく、&lt;br /&gt;application.properties に plugins.test-plugin=0.1 が記述されているだけで、ファイルがなければ run-app時に自動的にインストールしてくれます！&lt;br /&gt;&lt;br /&gt;まだちょっと扱いが生な感じがするのですが機能としては十分使えそうです、プラグインもプロジェクトもスッキリさせましょう！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-1596562146431147726?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/1596562146431147726/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=1596562146431147726' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1596562146431147726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1596562146431147726'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/05/grails-111.html' title='Grails 1.1.1 でプラグインリポジトリ（認証付き）を使ってみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3184277225945754208</id><published>2009-05-12T19:11:00.008+09:00</published><updated>2009-05-13T11:51:31.542+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><title type='text'>そろそろMySQL Clusterと向き合う時期が来たのかもしれない　その１</title><content type='html'>普通のMySQLすらまともに使った事の無い状態でのトライです&lt;br /&gt;なんで基本的に間違ってる事があるかもしれませんがご了承を・・・&lt;br /&gt;&lt;br /&gt;まずは&lt;a href="http://dev.mysql.com/downloads/cluster/6.3.html"&gt;MySQL Cluster&lt;/a&gt;から必要なパッケージをダウンロードしにいく&lt;br /&gt;今回はRedHatにセットアップするので、RedHatのリンクへ&lt;br /&gt;&lt;br /&gt;・・・&lt;br /&gt;・・・&lt;br /&gt;・・・&lt;br /&gt;Server、Client、Cluster storatge engine、Cluster storage engine managemen、Cluster storage engine basic tools、Cluster storage engine extra tools、Headers and libraries、Debug Info、Shared libraries、Test suiteと山盛りであるんですが・・・&lt;br /&gt;&lt;br /&gt;どれをダウンロードしろと？w&lt;br /&gt;&lt;br /&gt;・・・&lt;br /&gt;&lt;br /&gt;まーさっぱりわからんのでとりあえず何がどれなのか知る為に&lt;a href="http://nippondanji.blogspot.com/"&gt;漢の中の人&lt;/a&gt;が書いてる&lt;a href="http://www.thinkit.co.jp/article/95"&gt;ココ&lt;/a&gt;を参照&lt;br /&gt;&lt;br /&gt;MySQL Clusterには管理ノードとデータノードとSQLノードというのがある、それぞれは以下のように解釈&lt;br /&gt;&lt;br /&gt;・管理ノード&lt;br /&gt;他のノード達の管理をしている、バックアップもこいつから実行&lt;br /&gt;管理といっても居ないと動かないわけではなく、ノード達のON/OFFなど本当に管理だけ&lt;br /&gt;&lt;br /&gt;・データノード&lt;br /&gt;実データ格納場所、MySQL Clusterは基本的にデータをHDD上ではなくメモリ上で管理する（！）オプションでHDD保存も出来るらしいけど&lt;br /&gt;データノード間でハートビートを送り、タイムアウトすると管理ノードに報告する。ちくり魔め。&lt;br /&gt;&lt;br /&gt;・SQLノード&lt;br /&gt;SQLを解析して、データノードからデータを取得する&lt;br /&gt;なんだかよくわからんかったけど、どうやらこれは通常のMySQLという事らしい&lt;br /&gt;MySQLにはRDBMSのENGINEとしてMyISAMとInnoDBが主に使われているんだけど、MySQL ClusterとはこのENGINEの一つとして動作するものらしい！&lt;br /&gt;（ずっとMySQL Clusterというまったくの別物だと思っていたので、ここを理解したらなんだか随分わかりやすくなった）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で、ようやくダウンロードに戻るわけですが・・・イマイチよくわかりませんでしたw&lt;br /&gt;セットアップ後の自分なりの解釈で、&lt;br /&gt;&lt;br /&gt;Server　SQLノードにあたる部分&lt;br /&gt;Client　サーバ上でSQLノードへ接続したり、いわゆる mysql コマンド&lt;br /&gt;Cluster storatge engine　データノード&lt;br /&gt;Cluster storage engine managemen　管理ノード&lt;br /&gt;Cluster storage engine basic tools　データノードツール？&lt;br /&gt;Cluster storage engine extra tools　データノードツール？&lt;br /&gt;Shared libraries　共通のライブラリ&lt;br /&gt;&lt;br /&gt;こんな感じ、以下は必要なさそうだったのでダウンロードしてない :)&lt;br /&gt;&lt;br /&gt;Headers and libraries&lt;br /&gt;Debug Info&lt;br /&gt;Test suite&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2009/5/13 追記&lt;br /&gt;&lt;a href="http://nippondanji.blogspot.com/2009/02/mysql-clusterrpm.html"&gt;漢の中の人&lt;/a&gt;がすでに書いてました :)&lt;br /&gt;これは公式にも乗せるべき内容！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;実は内容的にまったく進んでないんですが、MySQL Clusterにはこんな初心者向けな記事があってもいいよね！&lt;br /&gt;&lt;br /&gt;次回はセットアップ奮闘編&lt;br /&gt;（本当にやるのかなw　Grails+Connector/J（フェイルオーバー）+MySQL Clusterで色々落ちても安心だね！までやったので残しておきたいけど）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3184277225945754208?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3184277225945754208/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3184277225945754208' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3184277225945754208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3184277225945754208'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/05/mysql-cluster.html' title='そろそろMySQL Clusterと向き合う時期が来たのかもしれない　その１'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-4008721873244507412</id><published>2009-05-12T11:27:00.004+09:00</published><updated>2009-05-13T11:04:31.377+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grailsで添付ファイル付きメールを送る</title><content type='html'>Grailsには公式で&lt;a href="http://www.grails.org/plugin/mail"&gt;MailPlugin&lt;/a&gt;というのがあり、こいつを使うとDSL形式で簡単にメールが送れます。&lt;br /&gt;&lt;br /&gt;ですが、こいつは添付ファイルに対応していません。&lt;br /&gt;&lt;a href="http://jira.codehaus.org/browse/GRAILSPLUGINS-1081"&gt;ここ&lt;/a&gt;ですでに解決が出ているのですが、公式のバージョンではまだ実装されていないので、自分で拡張してしまいましょう。&lt;br /&gt;&lt;br /&gt;grails install-plugin mail&lt;br /&gt;でpluginをインストールし、その中の MailService.groovy ファイルを開きます。&lt;br /&gt;&lt;br /&gt;このファイルの中に MailMessageBuilder Class の定義がされているのですが、こいつがDSLを処理している部分になります。&lt;br /&gt;（void to とか void title とかその辺りです。）&lt;br /&gt;ここに attachBytes という添付ファイル名、コンテントタイプ、バイト配列を受け取ってメールに添付する処理を追加してやります。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;void attachBytes(String fileName, String contentType, byte[] bytes) {&lt;br /&gt;  getMessage().mimeMessageHelper.addAttachment(fileName, new ByteArrayResource(bytes), contentType) }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;このままだと getMessage した時に、以下の部分が呼ばれます&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;    message = new MimeMailMessage(mailSender.createMimeMessage() )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;添付ファイルを送る時は Multipart にしないといけないので、以下のように書き換えてやります&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;    message = new MimeMailMessage(new MimeMessageHelper(mailSender.createMimeMessage(), true ))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;あとはメール送信時に attachBytes を呼び出してやればＯＫです。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;    def file=new File("test.dat")&lt;br /&gt;    // ファイル名に日本語が含まれる場合は文字列をエンコードする必要があります&lt;br /&gt;    // 日本のメール環境では iso-2022-jp がまだまだ主流なので、iso-2022-jp を使いましょう&lt;br /&gt;    //def title=javax.mail.internet.MimeUtility.encodeWord("日本語ファイル名.dat", "utf-8", "B")&lt;br /&gt;    def title=javax.mail.internet.MimeUtility.encodeWord("日本語ファイル名.dat", "iso-2022-jp", "B")&lt;br /&gt;&lt;br /&gt;    // コンテントタイプはファイルや用途に合わせて変更して下さい&lt;br /&gt;    def contentType="application/octet-stream"    &lt;br /&gt;&lt;br /&gt;    mailService.sendMail {&lt;br /&gt;      to "test@test.jp"&lt;br /&gt;      from "test@test.jp"&lt;br /&gt;      subject "添付テスト"&lt;br /&gt;      body "添付ファイルを送ります"&lt;br /&gt;      attachBytes title, contentType , file.readBytes()&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;s&gt;と、思ったら&lt;a href="http://www.grails.org/Mail+from+Grails"&gt;Mail from Grails&lt;/a&gt;なんてページがあったり、この方法でもファイル添付出来るみたいですね。&lt;/s&gt;&lt;br /&gt;↑プロポーザル的に書かれているだけで、実装されているわけではないらしいです&lt;br /&gt;&lt;br /&gt;2009/5/13 追記&lt;br /&gt;メールタイトルの文字コードと、Mail from Grailsのページについて、&lt;a href="http://d.hatena.ne.jp/mottsnite/"&gt;mottsnite&lt;/a&gt;の中の人から指摘があったので修正&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-4008721873244507412?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/4008721873244507412/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=4008721873244507412' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4008721873244507412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4008721873244507412'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/05/grails.html' title='Grailsで添付ファイル付きメールを送る'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-6957159934107130226</id><published>2009-05-07T10:25:00.004+09:00</published><updated>2009-05-07T10:47:55.278+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>HudsonをCLI(CUI)で操作する</title><content type='html'>&lt;a href="http://d.hatena.ne.jp/kkawa/20090503/p1"&gt;Hudson CLIとGroovy shell&lt;/a&gt;という記事をよんでとても興味深かったので早速試してみました。&lt;br /&gt;&lt;br /&gt;自分所に入ってるのが古かったので最新版を&lt;a href="https://hudson.dev.java.net/"&gt;公式&lt;/a&gt;からダウンロード&lt;br /&gt;前はjarパッケージしてスタンドアローンアプリで動かしていたけど、特別必要もなかったので普通に tomcat に配備&lt;br /&gt;&lt;br /&gt;tomcat を起動して http://serverurl/hudson/cli へアクセス&lt;br /&gt;こんなんでましたよっと&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MmNDS6igmGM/SgI8GcCyBYI/AAAAAAAAADM/5aaXyLFCcA0/s1600-h/Hudson.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 197px;" src="http://4.bp.blogspot.com/_MmNDS6igmGM/SgI8GcCyBYI/AAAAAAAAADM/5aaXyLFCcA0/s320/Hudson.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5332890990064829826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;リンクから hudson-cli.jar をダウンロードして shell から早速実行してみる&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;java -jar hudson-cli.jar -s http://serverurl/hudson help&lt;br /&gt;&lt;br /&gt;  version&lt;br /&gt;    Shows the Hudson version&lt;br /&gt;  help&lt;br /&gt;    Lists all the available commands&lt;br /&gt;  groovysh&lt;br /&gt;    Runs an interactive groovy shell&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;とりあえず version と help と groovysh が実行出来るっぽい&lt;br /&gt;記事元の groovy コマンドもばっちり動いて Hudson の instance を取得出来た！&lt;br /&gt;pluginとか作る時とか、サーバから操作する時とか色々出来そうですね&lt;br /&gt;&lt;br /&gt;なにより Groovyってのがいいね :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-6957159934107130226?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/6957159934107130226/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=6957159934107130226' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6957159934107130226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6957159934107130226'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/05/hudsonclicui.html' title='HudsonをCLI(CUI)で操作する'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MmNDS6igmGM/SgI8GcCyBYI/AAAAAAAAADM/5aaXyLFCcA0/s72-c/Hudson.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-135280897884100550</id><published>2009-05-01T13:49:00.004+09:00</published><updated>2009-05-01T19:09:41.882+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fop'/><category scheme='http://www.blogger.com/atom/ns#' term='帳票'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grailsで帳票！ fop編</title><content type='html'>帳票、というか組版の部類になると思うんですが、fopでPDFを作成してみました。&lt;br /&gt;&lt;br /&gt;帳票というと帳票ソフト＋帳票ツールという概念が強かったのですが、&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/mottsnite/"&gt;mottsnite&lt;/a&gt;さんから&lt;br /&gt;「HTML組む時にGUIソフト使わないっしょ？帳票もGUI使わずにfopでタグ書いたらいいんじゃないの？」&lt;br /&gt;と言われ妙に納得してしまったので、使ってみる事に。&lt;br /&gt;&lt;br /&gt;日本語出力までに微妙な所でハマってしまったのでメモっておきます。&lt;br /&gt;&lt;br /&gt;・まずは&lt;a href="http://xmlgraphics.apache.org/fop/"&gt;Apache fop&lt;/a&gt;をダウンロードします。（0.95を使いました）&lt;br /&gt;&lt;br /&gt;・Grailsのプロジェクトにライブラリを追加します。&lt;br /&gt;buildフォルダから fop.jar と、libフォルダから以下のファイルを grails プロジェクトの lib フォルダにコピーします。&lt;br /&gt;xmlgraphcs-commons-1.3.1.jar&lt;br /&gt;batik-all.jar&lt;br /&gt;avalon-framework-4.2.0.jar&lt;br /&gt;&lt;br /&gt;その他のjarファイルはgrailsが持っているもので補えるので必要ありません。&lt;br /&gt;&lt;br /&gt;・FOPの設定ファイルをコピーします&lt;br /&gt;conf/fop.xconf ファイルを適当な場所にコピーして以下のように書き換えます。&lt;br /&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;fop version="1.0"&amp;gt;&lt;br /&gt;  &amp;lt;base&amp;gt;.&amp;lt;/base&amp;gt;&lt;br /&gt;  &amp;lt;source-resolution&amp;gt;72&amp;lt;/source-resolution&amp;gt;&lt;br /&gt;  &amp;lt;target-resolution&amp;gt;72&amp;lt;/target-resolution&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;default-page-settings height="11in" width="8.26in"/&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;renderers&amp;gt;&lt;br /&gt;    &amp;lt;renderer mime="application/pdf"&amp;gt;&lt;br /&gt;      &amp;lt;filterList&amp;gt;&lt;br /&gt;        &amp;lt;value&amp;gt;flate&amp;lt;/value&amp;gt;&lt;br /&gt;      &amp;lt;/filterList&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;fonts&amp;gt;&lt;br /&gt;        &amp;lt;auto-detect/&amp;gt;&lt;br /&gt;      &amp;lt;/fonts&amp;gt;&lt;br /&gt;  &lt;br /&gt;    &amp;lt;/renderer&amp;gt;&lt;br /&gt;  &amp;lt;/renderers&amp;gt;&lt;br /&gt;&amp;lt;/fop&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;昔のバージョンではフォントファイルからフォントメトリクスを作成し、その定義をちまちまと書く必要があったのですが、&lt;br /&gt;今はfontsのauto-detectでOSがもってるTTFのフォントが使えるようになります。&lt;br /&gt;（一回目の起動時はフォントファイルを全部読み込むので時間がかかります。）&lt;br /&gt;&lt;br /&gt;・簡単なFoファイルを用意します&lt;br /&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;&lt;br /&gt;&amp;lt;fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"&amp;gt;&lt;br /&gt;  &amp;lt;fo:layout-master-set&amp;gt;&lt;br /&gt;    &amp;lt;fo:simple-page-master master-name="PageMaster"&amp;gt;&lt;br /&gt;      &amp;lt;fo:region-body margin-top="3cm"/&amp;gt;&lt;br /&gt;    &amp;lt;/fo:simple-page-master&amp;gt;&lt;br /&gt;  &amp;lt;/fo:layout-master-set&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;fo:page-sequence master-reference="PageMaster"&amp;gt;&lt;br /&gt;    &amp;lt;fo:flow flow-name="xsl-region-body"&amp;gt;&lt;br /&gt;      &amp;lt;fo:block font-family="Batang" font-size="18pt" text-align="center"&amp;gt;&lt;br /&gt;        Hello: XSL-FO to PDF&lt;br /&gt;        日本語&lt;br /&gt;      &amp;lt;/fo:block&amp;gt;&lt;br /&gt;    &amp;lt;/fo:flow&amp;gt;&lt;br /&gt;  &amp;lt;/fo:page-sequence&amp;gt;&lt;br /&gt;&amp;lt;/fo:root&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;*font-family は実行するPCに入っている適当なTTFフォントを指定します。&lt;br /&gt;（はじめはMS明朝でテストしていたのですが、なぜかMS明朝はうまく乗らないようです、他のTTFフォントを使いましょう。）&lt;br /&gt;&lt;br /&gt;・FopFactoryを定義します。&lt;br /&gt;通常は new FopFactoryでいいんですが、せっかくなのでGrailsっぽくSpringBeanとして登録しちゃいます。&lt;br /&gt;conf/spring/resources.groovy を以下のように書き換えます。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;import org.apache.fop.apps.FopFactory&lt;br /&gt;&lt;br /&gt;beans = {&lt;br /&gt;  def fopFactory=fopFactory(FopFactory){&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これでコントローラーやサービスに def fopFactory とするだけで注入されます :)&lt;br /&gt;&lt;br /&gt;・レンダリングを実行します&lt;br /&gt;とりあえずコントローラーにでも書いちゃいましょう&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;&lt;br /&gt;  def fop={&lt;br /&gt;    fopFactory.setUserConfig(new File("fop/fop.xconf"))&lt;br /&gt;    OutputStream os = new BufferedOutputStream(new FileOutputStream(new File("fop/fop.pdf")))&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, os)&lt;br /&gt;&lt;br /&gt;      TransformerFactory factory = TransformerFactory.newInstance()&lt;br /&gt;      Transformer transformer = factory.newTransformer()&lt;br /&gt;&lt;br /&gt;      Source src = new StreamSource(new File("fop/fop.fo"))&lt;br /&gt;      Result res = new SAXResult(fop.getDefaultHandler())&lt;br /&gt;&lt;br /&gt;      transformer.transform(src, res)&lt;br /&gt;    } finally {&lt;br /&gt;      os.close()&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    render "ok"&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MmNDS6igmGM/SfqrAMnxAKI/AAAAAAAAADE/qSI0YfYLqlY/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 298px;" src="http://2.bp.blogspot.com/_MmNDS6igmGM/SfqrAMnxAKI/AAAAAAAAADE/qSI0YfYLqlY/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330761128822767778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;素晴らしい！&lt;br /&gt;速度も十分です。&lt;br /&gt;グラフを出したりはまた別の仕組みが必要になってしまうのですが、組版的な細かい調整（長体かけたり、外字使ったり、レイアウト組とか・・・）が出来たり、MarkUpBuilder使ってプログラム的に組んでしまえばデータにあわせて微妙に形をかえるような帳票も出来ちゃいますね！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-135280897884100550?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/135280897884100550/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=135280897884100550' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/135280897884100550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/135280897884100550'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/05/grails-fop.html' title='Grailsで帳票！ fop編'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_MmNDS6igmGM/SfqrAMnxAKI/AAAAAAAAADE/qSI0YfYLqlY/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3030717251043638666</id><published>2009-04-28T19:12:00.003+09:00</published><updated>2009-04-28T19:23:37.816+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='jasperReport'/><title type='text'>Grailsで帳票！JasperReport 出力編</title><content type='html'>めずらしく引き続きJasperReportです。&lt;br /&gt;今回は jasper ファイルから pdf を出力します。&lt;br /&gt;&lt;br /&gt;ざっくりコードから！&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;    def report="sample.jasper"&lt;br /&gt;    def ds=new JRXmlDataSource("http://localhost:8080/jasper/book/xmllist","/list/book")&lt;br /&gt;    def print = JasperFillManager.fillReport(report,[:], ds)&lt;br /&gt;    def pdf=new File("test.pdf")&lt;br /&gt;    JasperExportManager.exportReportToPdfFile(print,pdf.getAbsolutePath())&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;reportに帳票ファイルのパスを指定（File型は使えないので注意）&lt;br /&gt;&lt;br /&gt;今回はXMLを読み込むのでデータソースにJRXmlDataSourceを作成、前回アクションでxmlを生成するようにしたので、そのURIと、データの基準となるxpathを指定&lt;br /&gt;&lt;br /&gt;JasperFillManager.fillReport でレポートファイルと、帳票パラメーター（今回はなしなので空のマップ）、データソースを渡して JasperPrint を作成します。&lt;br /&gt;&lt;br /&gt;JasperExportManager.exportReportToPdfFile で出力先のファイルを指定して実行&lt;br /&gt;&lt;br /&gt;これでPDFが出力されます。&lt;br /&gt;小さな帳票だったら爆速です！（BIRTと比べて）&lt;br /&gt;ブラウザに表示したい場合は JasperExportManager.exportReportToPdf でPDFのbyte配列がかえるので、これをストリームに返してやればＯＫです（contentTypeとかはちゃんとセットしてね）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3030717251043638666?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3030717251043638666/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3030717251043638666' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3030717251043638666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3030717251043638666'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/grailsjasperreport_7970.html' title='Grailsで帳票！JasperReport 出力編'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8743249139538606244</id><published>2009-04-28T11:37:00.006+09:00</published><updated>2009-04-28T19:12:08.379+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='jasperReport'/><title type='text'>Grailsで帳票！JasperReport 帳票準備編</title><content type='html'>GrailsでJasperReportの帳票を出力する方法&lt;br /&gt;長いので帳票準備編と出力編に分けます |-`)&lt;br /&gt;XMLを使って出す方法です。&lt;br /&gt;レポートからDB経由して直接引っ張り込む方法もありますが、帳票にあまりロジック的なものをいれたくないので・・・&lt;br /&gt;&lt;br /&gt;・Jasperのライブラリをプロジェクトに追加する&lt;br /&gt;&lt;a href="http://jasperforge.org/projects/jasperreports"&gt;公式サイト&lt;/a&gt;からjasperreports-3.5.0.jarをダウンロードしてきてプロジェクトの lib フォルダへ突っ込む&lt;br /&gt;PDF出力にiTextを使っているので、&lt;a href="http://www.lowagie.com/iText/"&gt;iText&lt;/a&gt;と、日本語出力用にiTextAsian.jarとiTextAsianCmaps.jarを入れます。&lt;br /&gt;&lt;br /&gt;・DomainをXMLで出力出来るようにする&lt;br /&gt;以下のような感じでxmlを返すアクションを作りましょう。&lt;br /&gt;as XMLは import grails.converters.XML をしてやる必要があります。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;def xmllist = {&lt;br /&gt;  render(text:Book.list() as XML,contentType:"text/xml",encoding:"UTF-8")    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;・XMLのサンプルデータを取得し、iReportへデータソースの定義をする&lt;br /&gt;上記のアクションにアクセスするとブラウザにXMLが表示されます。（またはダウンロード）&lt;br /&gt;このXMLを保存し、iReportから新規データソースを作成で、XML file datasourceを選択します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/SfbOCC4Y_1I/AAAAAAAAACs/CMmnkc670Dw/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 279px; height: 320px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/SfbOCC4Y_1I/AAAAAAAAACs/CMmnkc670Dw/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329673743568011090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;適当な名称と、XMLを指定、Create a datasource using this expressionを選択して xpath を指定します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MmNDS6igmGM/SfbO05N_EhI/AAAAAAAAAC0/ZoXYoYSqG2o/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 279px; height: 320px;" src="http://3.bp.blogspot.com/_MmNDS6igmGM/SfbO05N_EhI/AAAAAAAAAC0/ZoXYoYSqG2o/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329674617147560466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;・レポートへフィールドをセットする&lt;br /&gt;Field項目の追加で、Descriptionにフィールド名（XMLのノード名）を入れます&lt;br /&gt;追加されたフィールドをレポートへドラッグします&lt;br /&gt;（値が日本語の場合はフォントを日本語フォントに変更します）&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/SfbQxZjX0NI/AAAAAAAAAC8/01i2PvyGxhE/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 198px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/SfbQxZjX0NI/AAAAAAAAAC8/01i2PvyGxhE/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329676756130975954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Preview を選択するとXMLから読み込まれた値が表示されます。&lt;br /&gt;Previewした時点でテンプレートがコンパイルされ、同名の.jasperファイルが作成されます。&lt;br /&gt;（iReport3.5ではコンパイルの方法がPreviewしか見つかりませんでした・・・）&lt;br /&gt;&lt;br /&gt;ここでは日本語がサクっと出るのですが、このままだとPDFにした時に日本語が表示されません。&lt;br /&gt;レポートのXMLを見ると（DesignerとPreviewの間にあるXML）fontタグがあるのですが、こいつにPDF出力用の設定をしてやる必要があります。&lt;br /&gt;（iReport3.5ではここはGUIでは編集出来ないっぽいです）&lt;br /&gt;&lt;br /&gt;以下平成角ゴの例です。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;&amp;lt;font fontName="Hiragino Kaku Gothic Pro" pdfFontName="HeiseiKakuGo-W5" pdfEncoding="UniJIS-UCS2-H" isPdfEmbedded="true"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これで帳票の準備は完了です。&lt;br /&gt;次回はこのjasperファイルを使ってプログラムから帳票を出力します&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8743249139538606244?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8743249139538606244/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8743249139538606244' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8743249139538606244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8743249139538606244'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/grailsjasperreport_28.html' title='Grailsで帳票！JasperReport 帳票準備編'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MmNDS6igmGM/SfbOCC4Y_1I/AAAAAAAAACs/CMmnkc670Dw/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5928785709582076338</id><published>2009-04-27T11:39:00.005+09:00</published><updated>2009-04-28T11:42:13.963+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Grails 1.1 でやってはいけない事（warするとエラーな件について）</title><content type='html'>とあるGrails1.1のプロジェクトでwarしてTomcatにのっけたら動かないとの事で、、、その時点での1.1.1のSNAPSHOTでやってみたら動いたという情報を元に原因を探してみる事に&lt;br /&gt;&lt;br /&gt;結論からいくと、&lt;a href="http://saxon.sourceforge.net/"&gt;saxon&lt;/a&gt;というXSLTプロセッサのライブラリがあると起動に失敗するっぽい&lt;br /&gt;起動時に applicationContext.xml の定義を読む込み所で失敗しているので、ここで使うxmlのparserがsaxonのライブラリと衝突を起こしているっぽい感じ&lt;br /&gt;&lt;br /&gt;過去の 1.0.3 とか、1.1.1-SNAPSHOTで動く所を見るとソース上の凡ミスっぽい感じもするけど・・・&lt;br /&gt;（最新の1.1.1-SNAPSHOTにアップデートしたら今度はrun-appも出来なくなった、、、本当に近日リリースされるのだろうか |-`;) ）&lt;br /&gt;&lt;br /&gt;2009.4.28 追記&lt;br /&gt;最新版はSubVersionではなく、Gitで管理されているもよう、SVNのリポジトリは信頼しちゃダメ！&lt;br /&gt;多分&lt;a href="http://github.com/grails/grails/tree/master"&gt;コレ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;特に理由がなければ、&lt;a href="http://groovy.codehaus.org/Processing+XML+with+XSLT"&gt;こちら&lt;/a&gt;の方法をを使った方が使いやすいし良いと思います :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5928785709582076338?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5928785709582076338/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5928785709582076338' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5928785709582076338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5928785709582076338'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/grails-11-war.html' title='Grails 1.1 でやってはいけない事（warするとエラーな件について）'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3843833672418864841</id><published>2009-04-21T19:13:00.007+09:00</published><updated>2009-04-22T10:25:52.991+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>Grails+HiberObjectsでJPAなモデリング</title><content type='html'>HiberObjectsというEclipseのPluginでHibernate+JPAをGUIモデリングで作れるのですが、これがGrailsに対応していると言う事で使ってみました。&lt;br /&gt;&lt;br /&gt;公式サイトは&lt;a href="http://objectgeneration.com/eclipse/"&gt;コチラ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;最新のEclipseをダウンロードしてきてpluginをセット、Grailsは1.1を使いました。&lt;br /&gt;公式の説明にしたがってHiberObjectsを有効にしていきます、公式のは少し古いみたいでオプションが一部違いましたが、&lt;br /&gt;特に気にするような項目もなかったのでそのまま続行。&lt;br /&gt;&lt;br /&gt;公式には Deselect Add Hibernate libraries とありますが、後でHibernate関係でライブラリが見つからないよとエラーが出るのでチェックを入れておきました。&lt;br /&gt;（1.1からはHibernateが完全なPluginとなり、GRAILS_HOMEのlibフォルダにHibernate系のライブラリが入らなくなった為）&lt;br /&gt;&lt;br /&gt;設定画面はこんな感じです。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/Se5sP20ZLNI/AAAAAAAAACU/UMON-rwgTqU/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 255px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/Se5sP20ZLNI/AAAAAAAAACU/UMON-rwgTqU/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5327314428894981330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/Se5sURVzz3I/AAAAAAAAACc/7XhlB1sPodc/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 255px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/Se5sURVzz3I/AAAAAAAAACc/7XhlB1sPodc/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5327314504733937522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;HiberObjectsを有効にしたら、クラスダイアグラムを作ってUMLを描いていくとJavaコードと、hibernate.cfg.xml が生成されます。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MmNDS6igmGM/Se5tR7FmbTI/AAAAAAAAACk/4Kkvl21dQdg/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 179px;" src="http://2.bp.blogspot.com/_MmNDS6igmGM/Se5tR7FmbTI/AAAAAAAAACk/4Kkvl21dQdg/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5327315563912260914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;あとは generate-all なり、scaffold=true なりして run-app すると普通に CRUD が出来ま、、、、せんでした |-`)&lt;br /&gt;Create,Read,Deleteとリレーション系はちゃんと実装されてるんですが、Editでエラーになります。&lt;br /&gt;ソース見たら自動生成されるファイルに version がありませんでした(´・ω・｀)&lt;br /&gt;（クラスに手動で Long version フィールドを追加してやれば CRUD できました）&lt;br /&gt;&lt;br /&gt;他にもクラスダイアグラムで削除したクラスやインターフェースが生成され続けるとか、まだまだ微妙な所もあります・・・&lt;br /&gt;Groovyで普通のドメインみたいに作ってくれてUMLが描けるのかと思ってwktkしてたのでちょっと残念、でもGrailsに対応しようとしてくれる辺りが素敵です、今後に期待！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3843833672418864841?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3843833672418864841/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3843833672418864841' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3843833672418864841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3843833672418864841'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/grailshiberobjectsjpa.html' title='Grails+HiberObjectsでJPAなモデリング'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MmNDS6igmGM/Se5sP20ZLNI/AAAAAAAAACU/UMON-rwgTqU/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-63793928401753769</id><published>2009-04-20T10:05:00.005+09:00</published><updated>2009-04-20T15:55:17.385+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><title type='text'>TextmateでGrailsを開発する５つのステップ</title><content type='html'>GrailsのIDEでは現在以下があります。&lt;br /&gt;&lt;br /&gt;・Eclipse&lt;br /&gt;いわずがなとも。Groovy Pluginを入れておくと便利。&lt;br /&gt;だけどGroovyはダイナミックだからJavaほど恩赦は受けられない。&lt;br /&gt;&lt;br /&gt;・NetBeans&lt;br /&gt;Grailsへの対応を結構しっかりやっている。&lt;br /&gt;けどコマンド系（run-app とか create-controller とか）の処理はイマイチな気がする。&lt;br /&gt;なんかタスクがうまく落ちなかったりする。&lt;br /&gt;&lt;br /&gt;・IntelliJ&lt;br /&gt;無料お試し期間でしか使った事ない |-`)&lt;br /&gt;一番公式な感じ？&lt;br /&gt;高いのであんまり興味無し&lt;br /&gt;&lt;br /&gt;と、いくつかあるのですが、どれも重いんですよねぇ&lt;br /&gt;開発はサクサク動かしたいもんです。&lt;br /&gt;&lt;br /&gt;というわけでMacな人にはTextmateをオススメします。&lt;br /&gt;Textmateは有料ですがサクサク動いて色々とカスタマイズする事で凄く便利になります。&lt;br /&gt;Grails向けのおすすめカスタマイズを５つ紹介します。&lt;br /&gt;&lt;br /&gt;・日本語表示&lt;br /&gt;textmateはデフォで日本語表示が出来ないので、&lt;a href="http://d.hatena.ne.jp/hetima/20061102/1162435711"&gt;ココ&lt;/a&gt;らへんを参考に日本語フォントを入れて表示出来るようにしましょう&lt;br /&gt;はじめはつぶれた日本語に違和感がありますが、慣れるとなんてことないです、むしろ幅が揃って良いという気分でいましょう&lt;br /&gt;&lt;br /&gt;・Groovy Grailsバンドル&lt;br /&gt;.gsp 表示のシンタックスハイライトや、便利なスニペット（rt[tab]で render(text:"") とか）がつまってます&lt;br /&gt;&lt;a href="http://www.grails.org/TextMate+Bundle"&gt;ココ&lt;/a&gt;からダウロードできます&lt;br /&gt;&lt;br /&gt;・Groovyバンドル&lt;br /&gt;.groovy 表示のシンタックスハイライトや、次のRun Selected Snippetの為にいれておきましょう&lt;br /&gt;&lt;a href="http://groovy.codehaus.org/TextMate"&gt;ココ&lt;/a&gt;からダウンロードできます&lt;br /&gt;&lt;br /&gt;・Run Selected Snippet&lt;br /&gt;Groovyバンドルの機能の一つです&lt;br /&gt;選択した部分の Groovy を実行できます&lt;br /&gt;GroovyではJavaのクラスへいくつかの便利な機能が付加されてます、詳しくはGroovy JDKにのってますが、&lt;br /&gt;これらの挙動等をちょっとテストしたい時に最適です&lt;br /&gt;&lt;br /&gt;例えばテキストファイルの中身を改行でループして、タブ区切りにした１個目の値をごにょごにょしたいな〜と思った時に、&lt;br /&gt;コントローラーを通してやったりせずに、Groovyファイル上の適当な場所に、その部分のコードだけを書いてちょこちょこ動かして確認すれば良いのです&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;def infile=new File("test.csv")&lt;br /&gt;infile.splitEachLine("\t") { line -&gt;&lt;br /&gt;  println line[0]&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;この出力は通常、ウインドが開いてhtml表示されるのですが、ちょこちょこ動かしたい場合はウインドをいちいち閉じるのがめんどいです&lt;br /&gt;Bundle Editorから Run Selected Snippet を見てみると、 exit_show_html となっている部分が２カ所あります&lt;br /&gt;これが通常の出力になってますので、これを exit_show_tool_tip に変更してやります&lt;br /&gt;すると、 tooltip として結果が表示され、ちょっと動かしてやれば消えるのでサクサク使えます&lt;br /&gt;&lt;br /&gt;ただ１画面ぐらい出力がされると tooltip では不便です、でもって exit_show_html の出力は html が解析されてしまうので、htmlを見たい時には不便です&lt;br /&gt;なので新規ドキュメントとして開いてやりましょう&lt;br /&gt;今度は exit_show_html の部分を exit_create_new_document に変えてやればＯＫです&lt;br /&gt;&lt;br /&gt;exit_show_tool_tip で tooltip 表示&lt;br /&gt;exit_create_new_document で 新規ドキュメント表示&lt;br /&gt;&lt;br /&gt;大事な事なので２回言っておきます :)&lt;br /&gt;この二つを作っておけば大体のケースには対応出来るでしょう。&lt;br /&gt;&lt;br /&gt;・リファレンスリンク&lt;br /&gt;&lt;br /&gt;Groovyバンドルには Groovy JDK というGroovyの拡張部分がわかるAPIを開くコマンドが追加されます&lt;br /&gt;Grailsでは Groovy 以外にも色々なフレームワーク、ライブラリが使われていますので、これらもサッと開けると便利です&lt;br /&gt;Groovy JDKのコマンドをコピーして、URLの部分を &lt;a href="http://grails.jp/links.html"&gt;http://grails.jp/links.html&lt;/a&gt; に変えましょう&lt;br /&gt;Grails関連のAPI等がざっくり見れます :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MmNDS6igmGM/SewblPb8P0I/AAAAAAAAACM/0AVl3QboRdc/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 292px;" src="http://3.bp.blogspot.com/_MmNDS6igmGM/SewblPb8P0I/AAAAAAAAACM/0AVl3QboRdc/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5326662785885290306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;アジャイルなフレームワークにはアジャイルな開発環境を。&lt;br /&gt;これであなたもGroovy!なGrailsライフをおくれる事間違い無し！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-63793928401753769?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/63793928401753769/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=63793928401753769' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/63793928401753769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/63793928401753769'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/textmategrails.html' title='TextmateでGrailsを開発する５つのステップ'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_MmNDS6igmGM/SewblPb8P0I/AAAAAAAAACM/0AVl3QboRdc/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5584593252851853355</id><published>2009-04-20T09:57:00.002+09:00</published><updated>2009-04-23T13:54:11.874+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='Birt'/><title type='text'>GlassFishとBirtの切ない関係</title><content type='html'>GlassFIshが謎の停止をするので色々とさぐっていったらBirtで帳票を出した時に止まるっぽい&lt;br /&gt;&lt;br /&gt;Birtの負荷かな？と思ってJettyとTomcatでアホのように負荷をかけてみたけどまったくとまる様子がない。&lt;br /&gt;というかGlassFIshでは起動直後でも5セッションで帳票を出すと止まる・・・&lt;br /&gt;4セッションだとほとんど止まらない、なんじゃこりゃ&lt;br /&gt;&lt;br /&gt;Birt側の問題かと思って最新版に乗せ変えたりもしてみたけど状況は変わらず&lt;br /&gt;うーん、おとなしくjasperReportにしようかなー、Birtである必要性もないし・・・&lt;br /&gt;&lt;br /&gt;なんかわかったら続報を入れます&lt;br /&gt;&lt;br /&gt;4/23 追記&lt;br /&gt;GlassFish v3の最新版では正しく動作しました&lt;br /&gt;ただしv3ではメモリ関係がv2より厳しいようです、特に -XX:MaxPermSize の指定は必須です&lt;br /&gt;&lt;br /&gt;GlassFIsh v3とTomcat、JettyでOKとなると、v2.1に何か衝突する問題がありそうです&lt;br /&gt;Sunからはv3ではまだCluster等が出来ないので本番環境はv2.1を推奨との事ですが、この状態ではv3を使わざるを得ない感じですね・・・&lt;br /&gt;結局しばらくClusterは上位（Apache等）で処理してやるのが良いかもしれません&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5584593252851853355?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5584593252851853355/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5584593252851853355' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5584593252851853355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5584593252851853355'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/glassfishbirt.html' title='GlassFishとBirtの切ない関係'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5790269227378226004</id><published>2009-04-14T10:46:00.005+09:00</published><updated>2009-04-14T11:50:44.312+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='Birt'/><category scheme='http://www.blogger.com/atom/ns#' term='jasperReport'/><title type='text'>Grailsで帳票！JasperReport ざっくり評価編</title><content type='html'>Javaで帳票といえば長い事BIRTを愛用してきたんだけど、食わず嫌いもよくないと言う事で有名なJasperReportを使ってみた、せっかくなんでGrailsで。&lt;br /&gt;&lt;br /&gt;まずJasperReportの仕組み。&lt;br /&gt;&lt;br /&gt;jasperReportは jrxml というXMLファイルをコンパイルして jasper ファイルを生成して、そこにパラメーターやらデータソースやらを与えて帳票を出力してくれる&lt;br /&gt;&lt;br /&gt;出力形式は XLSやPDF、HTML、CSV等が出せる（XLSはPOI、PDFはiTextを使用）&lt;br /&gt;&lt;br /&gt;XMLファイルを作成するには iReport というGUIソフトがある&lt;br /&gt;iReportには Classic 扱いの 3.0 と 現行の 3.5 がある&lt;br /&gt;3.5 はNetBeansベースのアプリ（NetBeans用のPluginもある）でマルチプラットフォームなので良さげな感じだが、&lt;br /&gt;Classicに比べると設定出来る項目が少なかったりする&lt;br /&gt;でもMacな自分には選択肢がないので設定出来ない項目はXMLに直接書く事にする :(&lt;br /&gt;&lt;br /&gt;一応メニューもマルチランゲージになっているが、ほとんど英語&lt;br /&gt;とりあえず iReport を立ち上げて適当に帳票作ってみて Preview すると日本語もちゃんと通るっぽい&lt;br /&gt;&lt;br /&gt;ざーっくり使ってみた感じ、BIRTとの比較等&lt;br /&gt;レポート的に出来る事、出来ない事の比較はあんまりしてないです、とりあえずJavaで帳票出すって所を視野に入れての感想です&lt;br /&gt;&lt;br /&gt;ここが○&lt;br /&gt;・データソースがレポート内部と外部がちゃんと別れている所&lt;br /&gt;XMLをURLから動的に生成していたので、BIRTではデータソースから動的に設定する必要があった&lt;br /&gt;そうするとサンプルデータの準備も面倒だし、動的なURLを解析してXMLをパースしてくれないので、設定に不便だった・・・&lt;br /&gt;iReportではアプリ上に別データソースとしてサンプルファイルをセットしておけばいいのですごくらくちん！&lt;br /&gt;データソースを複数用意しといて切替も簡単、実際にコードから生成する時もデータソースを別であてるだけなので、これは凄くいい！&lt;br /&gt;&lt;br /&gt;・ファイルがコンパイル出来る&lt;br /&gt;xmlファイルをコンパイルにしてjasperにしておけば印刷時にコンパイルがいらないのでちょっと早いかも？&lt;br /&gt;&lt;br /&gt;・テーブルの部分が別エディタとなっている&lt;br /&gt;BIRTでは同じ帳票上でグリッドとか細かく触らないといけない＆重たくて反応が遅れるのでイライラする&lt;br /&gt;でも使いかっては今の所BIRTの方が良い（なれてるだけか）&lt;br /&gt;&lt;br /&gt;・プログラムに組み込むのが簡単&lt;br /&gt;BIRTではライブラリも含め色々と仕掛けが必要だったが、JasperReportはいくつかのライブラリいれるだけで後はソース上からさくっと作れた、そのままストリーム返しも出来そうだしいい感じ&lt;br /&gt;&lt;br /&gt;・PDF周りの設定がしっかり出来る&lt;br /&gt;PDF上のフォントのエンコード、フォント毎にPDFヘの埋め込みするしない、&lt;br /&gt;PDFのバージョン、セキュリティ関係などなど今なら指定し放題！&lt;br /&gt;BIRTではあるのかもしれないけど、触ってる範囲では出来ないっぽい&lt;br /&gt;&lt;br /&gt;ここが×&lt;br /&gt;・幅の％指定がない？&lt;br /&gt;BIRTでは大きさに％指定ができ、ものによって大きくなったり小さくなったりが出来たがjasperReportではないっぽい&lt;br /&gt;&lt;br /&gt;・iReportが微妙すぎる&lt;br /&gt;NetBeans版は色々と微妙・・・まだこれからなのかな、Classic版を使ったらもっとハッピーになれるのかしら&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次回はBIRTでXMLから帳票を出力しているのがあったので、XMLから帳票を作ってみる編&lt;br /&gt;（ああ、次回ネタが溜まりすぎ・・・）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5790269227378226004?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5790269227378226004/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5790269227378226004' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5790269227378226004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5790269227378226004'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/grailsjasperreport.html' title='Grailsで帳票！JasperReport ざっくり評価編'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-725178886806832234</id><published>2009-04-14T09:35:00.004+09:00</published><updated>2009-04-14T09:51:40.643+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>GroovyのURL Classが素敵すぎる件について</title><content type='html'>以前、別のURLのデータを取得するのに&lt;a href="http://ponytailthes.blogspot.com/2009/01/httpbuilder.html"&gt;httpBuilder&lt;/a&gt;を使ったり、&lt;a href="http://ponytailthes.blogspot.com/2009/03/grailsrest.html"&gt;httpClient&lt;/a&gt;を使ったりしてごにょごにょ書いてたんですが、&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/mottsnite/"&gt;mottsnite&lt;/a&gt;さんがボソっとURLのgetTextでとれるよ。と言っていたので試してみた。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;def url=new URL("http://www.yahoo.co.jp")&lt;br /&gt;println url.getText()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(　ﾟдﾟ)&lt;br /&gt;&lt;br /&gt;(つд⊂)ｺﾞｼｺﾞｼ&lt;br /&gt;&lt;br /&gt;(；ﾟдﾟ)&lt;br /&gt;&lt;br /&gt;(つд⊂)ｺﾞｼｺﾞｼ&lt;br /&gt;　　_, ._&lt;br /&gt;（；ﾟ Дﾟ）ぁぁぁああぁぁ！？&lt;br /&gt;&lt;br /&gt;なにこれ、素敵すぎます。&lt;br /&gt;まだあんまり試してないけど、日本語もすんなり通るし、すげぇ。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groovy.codehaus.org/Simple+file+download+from+URL"&gt;ストリームしてファイルダウンロード&lt;/a&gt;もいけるみたい。&lt;br /&gt;RESTしたいとかには答えられないのかもしれないですが通常使用ならこれで十分っぽいですね。&lt;br /&gt;&lt;br /&gt;FileのgetTextもそうですが、こういうのを見るとまさにGroovy!って感じしますね :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-725178886806832234?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/725178886806832234/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=725178886806832234' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/725178886806832234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/725178886806832234'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/groovyurl-class.html' title='GroovyのURL Classが素敵すぎる件について'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-4027290090421136282</id><published>2009-04-13T14:59:00.004+09:00</published><updated>2009-04-13T15:06:15.324+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>GrailsのServiceでServletContextを使う</title><content type='html'>もの凄いピンポイントネタですが。&lt;br /&gt;&lt;br /&gt;GrailsのController上ではServletContextが勝手に注入されてます。&lt;br /&gt;Service上では注入されてません、そしてSpringBeanでもないので注入も出来ません。&lt;br /&gt;なんか簡単にとる方法ないのかなーと思ってググったら「コントローラーから渡したらええんちゃうん？」みたいな答えしかなくてしょんぼり。&lt;br /&gt;サービスだけで使いたいのよ、BlazeDSとかWebサービスとかさ。&lt;br /&gt;&lt;br /&gt;で、grailsApplicationは注入可能なので、こっからたどって取得します。&lt;br /&gt;&lt;br /&gt;def grailsApplication&lt;br /&gt;&lt;br /&gt;で grailsApplication を注入して、そこからparentのcontextを取得し（SpringのXmlWebApplicationContext）、そこからServletContextがとれます。&lt;br /&gt;&lt;br /&gt;def sc=grailsApplication.getParentContext().getServletContext()&lt;br /&gt;&lt;br /&gt;やったね  :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-4027290090421136282?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/4027290090421136282/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=4027290090421136282' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4027290090421136282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4027290090421136282'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/grailsserviceservletcontext_13.html' title='GrailsのServiceでServletContextを使う'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-6691567752261686353</id><published>2009-04-13T14:59:00.000+09:00</published><updated>2009-04-13T15:00:14.112+09:00</updated><title type='text'>GrailsのServiceでServletContext</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-6691567752261686353?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/6691567752261686353/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=6691567752261686353' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6691567752261686353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6691567752261686353'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/grailsserviceservletcontext.html' title='GrailsのServiceでServletContext'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-969360804395165271</id><published>2009-04-09T15:01:00.004+09:00</published><updated>2009-04-09T17:53:19.777+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pgfouine'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>クエリチューニングについて本気出して考えてみた</title><content type='html'>Grailsでアプリを作っていると、O/Rマッピングに頼りっぱなしで、重い所だけたまにHQLを書いていたのだが、&lt;br /&gt;さすがにDBの規模が大きくなるとそうも言ってられないよなーと思い、クエリチューニングに乗り出す事にした。&lt;br /&gt;（indexの最適な付け方も良くわからないし :D ）&lt;br /&gt;&lt;br /&gt;まずは現在のボトルネックを探す。&lt;br /&gt;今までは体感とシステム上で時間を計測してたけど、DBの事はDBに聞けって事でログ解析をする事に。&lt;br /&gt;（&lt;a href="http://lets.postgresql.jp/documents/technical/query_analysis/1"&gt;ここらへん&lt;/a&gt;を参考にした）&lt;br /&gt;&lt;br /&gt;postgresのログ解析には pgfouine と pqa というのがあるらしい、前者は php、後者は ruby だ。&lt;br /&gt;これはもちろん pgfouine だろう！ php も ruby もよく知らないけど groovy 好きっ子としては ruby に行ったら負けかなと思っている。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20060419/235738/"&gt;ITProの記事&lt;/a&gt;を参考に、postgres のログを出力する設定をする&lt;br /&gt;&lt;br /&gt;んで pgfouine を実行・・・！しようと思ったら動かない。GDというライブラリが必要らしい。&lt;br /&gt;Macにデフォで入っている php にはこれが組み込まれていない。調べてみると MacPorts でインストールすると簡単らしい。&lt;br /&gt;ということで MacPorts から php をインストール、、、長い、、、長い、、、しかもCPUフルに使いやがる、そういう事は先に言ってくれと。&lt;br /&gt;&lt;br /&gt;無事インストールが終わった所で pgfouine を起動してみる。&lt;br /&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&lt;br /&gt;php pgfouine.php -logtype stderr -file log/postgresql-xxxx-xx-xx_xxxxxx.log -format html-with-graphs -report vanfu_sql.html=overall,hourly,bytype,slowest,n-mosttime,n-mostfrequent,n-slowestaverage,n-mostfrequenterrors,tsung&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;とりあえず出力オプション全部付けてみた :p&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MmNDS6igmGM/Sd23UEdSa-I/AAAAAAAAACE/kVDpDrDRgX8/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 238px;" src="http://2.bp.blogspot.com/_MmNDS6igmGM/Sd23UEdSa-I/AAAAAAAAACE/kVDpDrDRgX8/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5322611890043644898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;おー、なんかかっこいいですね！&lt;br /&gt;ちょっと試しで３分ほど適当にシステムを稼働させて集計した結果、SELECT件数が 4,179、、、うーんO/Rマッピングが遅いと言われるのがわかります。&lt;br /&gt;まあ逆に考えれば1クエリ0.01秒の改善でも3分あたり40秒もの改善になるって事ですね。&lt;br /&gt;&lt;br /&gt;とりあえず現状の確認方法まで&lt;br /&gt;次回はGrails向けのチューニング方法をまとめようと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-969360804395165271?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/969360804395165271/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=969360804395165271' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/969360804395165271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/969360804395165271'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/blog-post.html' title='クエリチューニングについて本気出して考えてみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_MmNDS6igmGM/Sd23UEdSa-I/AAAAAAAAACE/kVDpDrDRgX8/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3096568700438255193</id><published>2009-04-07T18:54:00.003+09:00</published><updated>2009-04-07T19:07:42.800+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='blazeDS'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>GrailsでblazeDSプッシュ配信！その１</title><content type='html'>blazeDSといえばプッシュ機能がついていますが、grailsのflex pluginでは定義されてないので使う事が出来ません。&lt;br /&gt;&lt;br /&gt;せっかくあるんだし、サーバから一斉にメッセージ配信とかなんかカッコイイ（ここ重要）ので実装してみました。&lt;br /&gt;まずは plugin を改良して streaming と polling の定義を追加します。&lt;br /&gt;&lt;br /&gt;service-config.xml を編集します。&lt;br /&gt;&lt;br /&gt;services の中に以下の定義を追加。&lt;br /&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&lt;br /&gt;&amp;lt;service id="message-service" class="flex.messaging.services.MessageService"&amp;gt;&lt;br /&gt;  &amp;lt;adapters&amp;gt;&lt;br /&gt;    &amp;lt;adapter-definition id="actionscript" class="flex.messaging.services.messaging.adapters.ActionScriptAdapter" default="true" /&amp;gt;&lt;br /&gt;  &amp;lt;/adapters&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;default-channels&amp;gt;&lt;br /&gt;    &amp;lt;channel ref="grails-streaming-amf"/&amp;gt;&lt;br /&gt;    &amp;lt;channel ref="grails-polling-amf"/&amp;gt;&lt;br /&gt;  &amp;lt;/default-channels&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;destination id="sb-1" /&amp;gt;&lt;br /&gt;&amp;lt;/service&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;＊デフォで入っている default-channels が services 全体になっているので、はじめから定義されている remoting-service の中に正しく入れてやる&lt;br /&gt;&lt;br /&gt;desitination ってのが接続するキーになります、このタグの中にある security って項目を使うと別のユーザ管理と認証が出来ます。&lt;br /&gt;（acegi と連動出来たら素敵ですが、とりあえず認証無しで）&lt;br /&gt;&lt;br /&gt;channelsに以下を追加&lt;br /&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&lt;br /&gt;&amp;lt;channel-definition id="grails-streaming-amf" class="mx.messaging.channels.StreamingAMFChannel"&amp;gt;&lt;br /&gt;    &amp;lt;endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf" class="flex.messaging.endpoints.StreamingAMFEndpoint"/&amp;gt;&lt;br /&gt;    &amp;lt;properties&amp;gt;&lt;br /&gt;        &amp;lt;idle-timeout-minutes&amp;gt;0&amp;lt;/idle-timeout-minutes&amp;gt;&lt;br /&gt;        &amp;lt;max-streaming-clients&amp;gt;10&amp;lt;/max-streaming-clients&amp;gt;&lt;br /&gt;        &amp;lt;server-to-client-heartbeat-millis&amp;gt;5000&amp;lt;/server-to-client-heartbeat-millis&amp;gt;&lt;br /&gt;        &amp;lt;user-agent-settings&amp;gt;&lt;br /&gt;            &amp;lt;user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="1"/&amp;gt;&lt;br /&gt;            &amp;lt;user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="1"/&amp;gt;&lt;br /&gt;        &amp;lt;/user-agent-settings&amp;gt;&lt;br /&gt;    &amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/channel-definition&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;channel-definition id="grails-polling-amf" class="mx.messaging.channels.AMFChannel"&amp;gt;&lt;br /&gt;    &amp;lt;endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling" class="flex.messaging.endpoints.AMFEndpoint"/&amp;gt;&lt;br /&gt;    &amp;lt;properties&amp;gt;&lt;br /&gt;        &amp;lt;polling-enabled&amp;gt;true&amp;lt;/polling-enabled&amp;gt;&lt;br /&gt;        &amp;lt;polling-interval-seconds&amp;gt;4&amp;lt;/polling-interval-seconds&amp;gt;&lt;br /&gt;    &amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/channel-definition&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;FlexPlugin では GrailsBootstrapService というクラスが BlazeDS の起動時に読み込まれるので、ここで MessageClientListener を登録してやります。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;MessageClient.addMessageClientCreatedListener(new ClientWatcher())&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ClientWatcher は MessageClientListener を implements したクラス、サンプルでこんなのを用意してみました。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;package org.codehaus.groovy.grails.plugins.flex;&lt;br /&gt;&lt;br /&gt;import flex.messaging.MessageClient;&lt;br /&gt;import flex.messaging.MessageClientListener;&lt;br /&gt;&lt;br /&gt;public class ClientWatcher implements MessageClientListener {&lt;br /&gt; /**&lt;br /&gt;  * クライアントが接続したときに呼ばれる。&lt;br /&gt;  */&lt;br /&gt; public void messageClientCreated(MessageClient msgClient) {&lt;br /&gt;   println "connect client"&lt;br /&gt;  &lt;br /&gt;  // 自身をクライアントの切断を監視するリスナとしても登録する。&lt;br /&gt;  msgClient.addMessageClientDestroyedListener(this);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * クライアントが切断したときに呼ばれる。&lt;br /&gt;  */&lt;br /&gt; public void messageClientDestroyed(MessageClient msgClient) {&lt;br /&gt;  println "disconnect client"&lt;br /&gt;&lt;br /&gt;  // 明示的にセッションを破棄する。&lt;br /&gt;  msgClient.getFlexSession().timeout();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;でもクラスを直指定はいけてないので、Acegi風にDefaultConfigで対応するクラスを乗せ変えられるようにしてみました。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;// Configのロード&lt;br /&gt;GroovyClassLoader classLoader = new GroovyClassLoader(getClass().getClassLoader())&lt;br /&gt;ConfigObject config&lt;br /&gt;ConfigObject flexConfig&lt;br /&gt;try {&lt;br /&gt;  flexConfig=new ConfigSlurper().parse(classLoader.loadClass('FlexConfig'))&lt;br /&gt;} catch(Exception e) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(flexConfig) {&lt;br /&gt;  config=flexConfig&lt;br /&gt;} else {&lt;br /&gt;  config=new ConfigSlurper().parse(classLoader.loadClass('DefaultFlexConfig'))&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// クライアントの接続を監視する&lt;br /&gt;def className="${config.flex.blazeDs.messageClientListener}"&lt;br /&gt;def clientListener=classLoader.loadClass(className).newInstance()&lt;br /&gt;MessageClient.addMessageClientCreatedListener(clientListener)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ここをやっている時、Class.forName() でエラー出てハマっていたので Google先生に聞いてみたら&lt;a href="http://ponytailthes.blogspot.com/2008/02/grailsclassforname.html"&gt;自分が教えてくれた&lt;/a&gt;　あるあるw&lt;br /&gt;でも GroovyClassLoader を定義してるんでそっちを使ってみた&lt;br /&gt;&lt;br /&gt;これで下準備は完了！&lt;br /&gt;次回は接続＆メッセージ送信編&lt;br /&gt;&lt;br /&gt;（&lt;a href="http://ponytailthes.blogspot.com/2009/03/grails-flex-plugin.html"&gt;この件&lt;/a&gt;の事もあるし、要望あれば plugin 公開してもいいかな・・・）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3096568700438255193?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3096568700438255193/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3096568700438255193' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3096568700438255193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3096568700438255193'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/grailsblazeds.html' title='GrailsでblazeDSプッシュ配信！その１'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-2531990614339003226</id><published>2009-04-06T13:53:00.005+09:00</published><updated>2009-04-06T14:55:27.472+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>マカーがSubversionを1.6へ移行する道程</title><content type='html'>Grailsが1.1になってplugin repositoryを設定出来るようになったりして使ってみようと思ったんだけど、どうやらSubversion1.6でないとだめらしい&lt;br /&gt;（Macにデフォで入ってるのは1.4.4なわけですよ）&lt;br /&gt;&lt;br /&gt;1.6の新機能詳細は&lt;a href="http://subversion.tigris.org/svn_1.6_releasenotes.html"&gt;こちら&lt;/a&gt;&lt;br /&gt;Mac用のバイナリが&lt;a href="http://www.open.collab.net/downloads/community/"&gt;ここ&lt;/a&gt;にあるので、これをインストール&lt;br /&gt;&lt;br /&gt;/usr/bin/svn を1.6に置き換え、既存のプロジェクトを操作してみる・・・&lt;br /&gt;特に問題無し、.svnの中身は自動でアップグレードしてくれるらしい&lt;br /&gt;&lt;br /&gt;ただし下位互換が無いので、一度プロジェクトを1.6にしてしまったら全ユーザが1.6にする必要あり！&lt;br /&gt;&lt;br /&gt;・その他、Subversionを使ってたアプリの設定変更&lt;br /&gt;EclipseのSubclipseを1.6用のものに置き換え（アップデートサイトが1.4.x系とは別なんで注意）&lt;br /&gt;Textmateの Preferences &gt; Advanced &gt; Shell Variables の TM_SVN を 1.6 の svn のパスに変更（ここに設定してあったのすっかり忘れてた）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-2531990614339003226?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/2531990614339003226/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=2531990614339003226' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2531990614339003226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2531990614339003226'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/subversion16.html' title='マカーがSubversionを1.6へ移行する道程'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-6027341626171205171</id><published>2009-04-03T23:25:00.005+09:00</published><updated>2009-04-03T23:45:54.128+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Air'/><title type='text'>merapiがもたらすAirとJavaの素敵な関係</title><content type='html'>Air（Flex）でJavaを呼び出すという夢のようなライブラリが登場したようです。&lt;br /&gt;まだベータですが試してみましたのでつらつらと書いていきます。&lt;br /&gt;&lt;br /&gt;参考&lt;br /&gt;&lt;a href="http://www.merapiproject.net/"&gt;公式サイト&lt;/a&gt;&lt;br /&gt;&lt;a href="http://journal.mycom.co.jp/articles/2009/03/18/merapi/index.html"&gt;マイコミの紹介&lt;/a&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/sugarbabe335/20090328/1238206614"&gt;javaとairを繋ぐmerapiを使ってみた。&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;まずはJava側の実装から&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;merapi本体を解凍した中にある framework/java/libs にあるのがJava側で必要なライブラリ&lt;br /&gt;適当なクラスを作って、IMessageHandler を implements する&lt;br /&gt;&lt;br /&gt;public static void main の中で Bridge クラスに、自身を regist する&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;public class MerapiTest implements IMessageHandler {&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  System.out.println("start");&lt;br /&gt;  Bridge.getInstance().registerMessageHandler("merapiSample", new MerapiTest());&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;第一引数でBridgeに登録するID（タイプと呼ぶらしい）、第二引数が自身のJavaクラスのインスタンス&lt;br /&gt;&lt;br /&gt;flexから呼ばれた時に handleMessage がcallされるのでこれをクラスに書いておく（インターフェース定義されてます）&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;  public void handleMessage(IMessage obj) {&lt;br /&gt;    try {&lt;br /&gt;      System.out.println("flex &gt; java :"+((Message)obj).getData());&lt;br /&gt;      Message response = new Message("merapiSample", "hello merapi");&lt;br /&gt;      Bridge.getInstance().sendMessage(response);&lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      System.out.println("Caught Exception");&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;IMessageというのがFlexから受け取るデータ、MessageにキャストしてgetDataすると中身を取得出来る。&lt;br /&gt;System.out.println("flex &gt; java :"+((Message)obj).getData());&lt;br /&gt;&lt;br /&gt;void なんで return値はなし、Flexに情報を返したい場合は Bridge の sendMessageを使う。&lt;br /&gt;Messageの第一引数にregistしたのと同じIDを指定、第二引数に送りたいデータをセットする。&lt;br /&gt;Message response = new Message("merapiSample", "hello merapi");&lt;br /&gt;Bridge.getInstance().sendMessage(response);&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;続いてFlex側の実装&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;merapi本体を解凍した中にある framework/flex/libs にあるのがflex側で必要なライブラリ&lt;br /&gt;&lt;br /&gt;まずはBridgeのインスタンスを作成する&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;&amp;lt;merapi:BridgeInstance id="bridge" result="handleMessage(event)" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こっちはresultのfunction名を指定出来る、Javaと同じにしとといた方がわかりやすいかもね！&lt;br /&gt;&lt;br /&gt;メッセージの送信は以下のように&lt;br /&gt;&lt;pre name="code" class="java:controls"&gt;&lt;br /&gt;var message:Message = new Message("merapiSample","from flex");&lt;br /&gt;bridge.sendMessage(message);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;MessageクラスはJavaとおんなじ使い方でOK&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;実行方法&lt;/h1&gt;&lt;br /&gt;まずは java のクラスを起動してやる必要がある&lt;br /&gt;起動して regist した時点で listen 状態で待機される&lt;br /&gt;&lt;br /&gt;この状態でFlexを起動してやると、メッセージを送信出来る&lt;br /&gt;Flexが終了した時点でJavaも落ちる&lt;br /&gt;&lt;br /&gt;欠点はJavaを起動する必要がある所かな・・・&lt;br /&gt;終了は一緒に終わってくれるので問題なさそうだけど、Airの起動時にJavaが動いてないとエラーになるんで&lt;br /&gt;なんとかしてJavaを起動してAirを起動するような仕組みが必要&lt;br /&gt;&lt;br /&gt;うまく使えばクライアントサイドで今以上に色んな事が出来そうですね！&lt;br /&gt;Grailsとの絡みで考えると、Grails1.1からGORMが単体で使えるようになっているのでsqliteを使った生なDBでなく、GORMを使ってHSQLとかでクライアントDBを実装出来たら素敵な気がする！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-6027341626171205171?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/6027341626171205171/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=6027341626171205171' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6027341626171205171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6027341626171205171'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/merapiairjava.html' title='merapiがもたらすAirとJavaの素敵な関係'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8191504114457487699</id><published>2009-04-02T11:32:00.002+09:00</published><updated>2009-04-02T11:46:13.292+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Air'/><title type='text'>Airで画面解像度の取得</title><content type='html'>Airアプリケーションでユーザの画面解像度を取得する方法、忘れそうなのでメモ&lt;br /&gt;&lt;br /&gt;Screen.mainScreen.visibleBounds&lt;br /&gt;&lt;br /&gt;返り値はRectangle、macの場合 x , y , w , h で x , y はドックとメニュー分の位置がくるので、&lt;br /&gt;領域として使えるのが w と h で、実際の解像度は x+w , y+h で取得可能。&lt;br /&gt;&lt;br /&gt;拡大／縮小させたいメインコンテンツを%指定して作っておけば画面サイズにあわせて自動的にフルスクリーンになるアプリが作れそう。&lt;br /&gt;&lt;br /&gt;と、思ったけど最大化ボタンを使えばいいじゃん・・・&lt;br /&gt;ご丁寧に maximize() なんてメソッドもありました。&lt;br /&gt;&lt;br /&gt;・・・まぁ何か使う時もあるでしょう！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8191504114457487699?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8191504114457487699/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8191504114457487699' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8191504114457487699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8191504114457487699'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/04/air.html' title='Airで画面解像度の取得'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5060393548608803979</id><published>2009-03-30T17:38:00.005+09:00</published><updated>2009-03-30T17:52:16.076+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Grails 1.1 warしてみた</title><content type='html'>Grails1.1でwarしたものを乗せてみた&lt;br /&gt;&lt;br /&gt;tomcat 5.5.23 &gt; ×&lt;br /&gt;tomcat 5.5.25 &gt; ×&lt;br /&gt;GlassFish 2.1 &gt; ○&lt;br /&gt;&lt;br /&gt;lib関係かな・・・とりあえずメモ、判明したらまた続報入れます&lt;br /&gt;&lt;br /&gt;[追記]&lt;br /&gt;tomcat 6.0.18 &gt; ○&lt;br /&gt;&lt;br /&gt;6系も安定板出てしばらく立つしこれを機に6へ移行した方が良さそうですね。&lt;br /&gt;メモ &lt;br /&gt;5.5.x &gt; 6.x migration&lt;br /&gt;&lt;a href="http://tomcat.apache.org/migration.html"&gt;http://tomcat.apache.org/migration.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5060393548608803979?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5060393548608803979/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5060393548608803979' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5060393548608803979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5060393548608803979'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/03/grails-11-war.html' title='Grails 1.1 warしてみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5457232036460895526</id><published>2009-03-26T16:54:00.005+09:00</published><updated>2009-03-26T17:14:03.925+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails1.x &gt; Grails1.1への移行</title><content type='html'>Grails 1.0.5 のアプリを Grails1.1 へ移行した時に起きた問題。メモメモ。&lt;br /&gt;&lt;br /&gt;とりあえずざっくり grails update をしてみる。&lt;br /&gt;SVNの差分で見てみるとコマンドで変更される内容はたいしてないみたい。&lt;br /&gt;application.propertiesに plugins.hibernate=1.1 が追加されてる、この辺の話しは&lt;a href="http://d.hatena.ne.jp/mottsnite/20090217"&gt;ここ&lt;/a&gt;で詳しくのっている。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・pluginを読み込まない&lt;br /&gt;pluginの置き場所が変わったため、upgradeしただけでは既存のpluginを読み込んでくれない。&lt;br /&gt;これは 1.1 に追加された BuildConifg.groovy というファイルを書いてやる必要がある。&lt;br /&gt;&lt;br /&gt;grails-app/conf/BuildConfig.groovy を作成し、以下のような感じで設定してやる。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;grails.plugin.location."pluginName"="plugins/pluginName-version"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ダブルクォートは重要、groovyなんで無いと引き算扱いになってまうよ :)&lt;br /&gt;とりあえず移行ならこれでいいけど、pluginの管理は別リポジトリで自動バージョンアップとか素敵な感じになってるので将来的にはそっちに移行した方が良い。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・xercesImpl.jar が無くなった。&lt;br /&gt;今まではGrails本体のlibフォルダにXercesが入っていたのですがこれがなくなりました。&lt;br /&gt;なのでXercesを使ってたアプリや、Xercesを使っているpluginをいれているとNoClassDefFoundErrorになります。&lt;br /&gt;以前のバージョンからコピーするか、本家から落としてきてアプリケーションの lib フォルダにいれてやりましょう。&lt;br /&gt;&lt;br /&gt;・起動時にエラーが出る&lt;br /&gt;&lt;br /&gt;以下のようなエラー&lt;br /&gt; ERROR commons.DefaultGrailsControllerClass  - The allowedMethods property in ほにゃららController should be declared static.  The non static version is supported for now but has been deprecated and may not work in future versions of Grails.&lt;br /&gt;&lt;br /&gt;allowedMethods が def から static になったからこのままだと近いうちに使えんくなるよ、と。&lt;br /&gt;単純に def を static にしたら出なくなりました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえずこれで動作しました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5457232036460895526?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5457232036460895526/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5457232036460895526' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5457232036460895526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5457232036460895526'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/03/grails1x-grails11.html' title='Grails1.x &gt; Grails1.1への移行'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3027482447661547808</id><published>2009-03-19T18:56:00.004+09:00</published><updated>2009-03-19T21:52:54.404+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>GrailsCodeReading in 名古屋！</title><content type='html'>というわけで参加してきました。&lt;br /&gt;&lt;br /&gt;お題は「Grails-1.1を斬る！Grails-1.1からのチーム開発」&lt;br /&gt;1.0シリーズ→1.1で結構仕組みが変わっています。&lt;br /&gt;毎度恒例の速度アップやら、GORM（GrailsでのORマッピング）のかゆい所に手が届くようになったとか、正常進化ですね。&lt;br /&gt;&lt;br /&gt;もうなんかすげーいっぱい変更点あるんで、ちょっと気になった所だけピックアップ&lt;br /&gt;&lt;br /&gt;・&amp;lt;g:form&amp;gt; にuseToken="true" をつけて、受け側の action で以下のように拾える&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;def save = {&lt;br /&gt;  withFormat {&lt;br /&gt;     //保存処理&lt;br /&gt;  }.invalidToken {&lt;br /&gt;    render "二度押し禁止！"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;なかなかいい感じ。だけど画面上には invalidToken 側の処理しか返らないので、スルーして正しい結果を表示ってのは自前実装しないといけない。&lt;br /&gt;&lt;br /&gt;・work_dirを選べるようになった&lt;br /&gt;今更感もあるけど、svn とか使ってるとプロジェクトフォルダを trunk とかにしてると、work_dirがかぶってしまう問題があった。&lt;br /&gt;（ ~/.grails/{version}/projects/{projectFolder}  に固定されていた）&lt;br /&gt;かぶると class とかが入り乱れてまともに動かない状態に・・・&lt;br /&gt;これを BuildConfig.groovy ファイルで好きな場所を指定出来るようになったので、安心して実行出来るようになりました。&lt;br /&gt;&lt;br /&gt;・別リポジトリの対応&lt;br /&gt;plugin系で本家のリポジトリ以外に、自前で指定したリポジトリを追加できます。&lt;br /&gt;これを使うと、公式にあげれない／ない plugin を管理出来ます。&lt;br /&gt;さらに1.1では自動インストール／アンインストールがあるので、更新したよーとか最新版いれてーとかしなくても勝手にやってくれる！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3027482447661547808?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3027482447661547808/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3027482447661547808' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3027482447661547808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3027482447661547808'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/03/grailscodereading-in.html' title='GrailsCodeReading in 名古屋！'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-572291141511906271</id><published>2009-03-13T18:43:00.003+09:00</published><updated>2009-03-13T20:08:19.746+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FileMaker'/><title type='text'>FileMakerへのJDBC接続</title><content type='html'>FileMakerはODBCとJDBCで外部からデータを操作出来るらしい。&lt;br /&gt;&lt;br /&gt;JDBCいけるならGrailsでFIleMakerPluginとか作れるんじゃね？という事で接続してみるテスト&lt;br /&gt;&lt;br /&gt;まずはJDBCドライバを探す・・・ってここから情報すくなっ&lt;br /&gt;なんか途中のバージョン（７ぐらい？）からSequeLinkDriverで接続するようになったらしい&lt;br /&gt;&lt;br /&gt;今回のターゲットは９なのでそれ用のドライバを探す・・・&lt;br /&gt;あ、あったあった、てか&lt;a href="http://www.filemaker.co.jp/support/downloads/"&gt;公式&lt;/a&gt;にあった orz&lt;br /&gt;「FileMaker Pro 9 評価版用 FileMaker ODBC &amp; FileMaker JDBC ドライバ（Mac OS X）」ってのをダウンロード&lt;br /&gt;&lt;br /&gt;その中にインストーラー（sljcinstaller.jar）があるのでそれを起動してインストールしていく・・・&lt;br /&gt;インストールした先にはいっぱいファイルがあるけど、とりあえず目的のファイルは driver/lib/sljc.jar&lt;br /&gt;&lt;br /&gt;で、なんやかんや試してみるけど綱がらない・・・&lt;br /&gt;どうやらFileMakerProでは localhost からしか接続出来ないらしい :( &lt;br /&gt;MacからODBCではうまくいかないしセットアップも大変になるので、同マシンで動かして外からクエリうけて実行出来るみたいなのでいいや、と思いつつ設定。&lt;br /&gt;&lt;br /&gt;FileMaker起動して、JDBC/ODBCの共有をONにして、2399ポートがあいてるのを確認。&lt;br /&gt;&lt;br /&gt;そしたらJDBCドライバをロードして、&lt;br /&gt;Class.forName("com.ddtek.jdbc.sequelink.SequeLinkDriver")&lt;br /&gt;&lt;br /&gt;Connectionで接続キター！&lt;br /&gt;Connection con = DriverManager.getConnection("jdbc:sequelink://localhost:2399","user","pass")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-572291141511906271?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/572291141511906271/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=572291141511906271' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/572291141511906271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/572291141511906271'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/03/filemakerjdbc.html' title='FileMakerへのJDBC接続'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-2264882532144374014</id><published>2009-03-11T18:18:00.003+09:00</published><updated>2009-03-11T18:31:23.475+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails Flex Pluginの罠</title><content type='html'>FlexPluginを使うとサービスでのBlazeDSがめっさ簡単になるんで重宝していたのですが、今日はこいつにやられました。&lt;br /&gt;&lt;br /&gt;run-app しているときはシレっと動いてたのですが、warしてGlassFishにのっけてみたら web.xml が DTD にはじかれて登録出来ない・・・&lt;br /&gt;で、調べていったら FlexGrailsPlugin.groovy で注入している所で servlet にたいして display-name を設定しているのが問題っぽい。&lt;br /&gt;これをはずして再度 war したら何事もなく動きました。&lt;br /&gt;&lt;br /&gt;余談ですが、GlassFishでWebアプリケーションを配備する時は war のサイズがあんまり大きいとうまくいかないみたい。&lt;br /&gt;なんらかの方法でサーバへファイルをアップし、「Application Server からアクセス可能なローカルのパッケージファイルまたはディレクトリ 」を使うのが良いみたい。&lt;br /&gt;&lt;br /&gt;grailsアプリを使う上では glassfish v3より glassfish v2.1の方が早くて安定している気がする・・・&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/shin/20090113/p1"&gt;Cubbyでもv2のが相性が良いみたい。&lt;/a&gt; v3はもうちょっと様子見かなぁ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-2264882532144374014?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/2264882532144374014/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=2264882532144374014' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2264882532144374014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2264882532144374014'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/03/grails-flex-plugin.html' title='Grails Flex Pluginの罠'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-6138875193862163902</id><published>2009-03-07T13:45:00.002+09:00</published><updated>2009-03-07T14:03:13.539+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>GrailsとRESTのただならぬ事情</title><content type='html'>GrailsでRESTfulなWebアプリを作るのは凄く簡単です。&lt;br /&gt;&lt;br /&gt;URLMappingで以下のように振分けが出来ます。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;    "/rest/$id?"(controller:"rest"){ &lt;br /&gt;      action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"] &lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これで /rest に来たアクセスはメソッドによりアクションへ振分けされます。&lt;br /&gt;GET（普通にブラウザで開いたり）した場合は show アクションへ、POST（フォーム送信とか）なら save アクションへ飛ばされます。&lt;br /&gt;&lt;br /&gt;詳しくは&lt;a href="http://www.ibm.com/developerworks/jp/java/library/j-grails09168/"&gt;IBMの記事&lt;/a&gt;を参照下さい。&lt;br /&gt;&lt;br /&gt;ではGrailsでRESTfulなサービスを使用するには、というとデフォではそのような機能はありません。（多分）&lt;br /&gt;ここで前に使ったHTTPBuilderを使おうと思ったのですが、こいつがGrailsと組み合わせてしまうと思うように動かないメソッドがあったりします・・・&lt;br /&gt;http.request(GET,TEXT) { req -&gt; } 　とか・・・ responseが正常に取得出来ません :(&lt;br /&gt;&lt;br /&gt;HTTPBuilderは中でApache HttpClientを使ってるだけなんで、こいつを直接使う事にしました。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;    def client = new HttpClient()&lt;br /&gt;    def getMethod = new GetMethod("http://localhost:8080/restProject/rest/1")&lt;br /&gt;    getMethod.setRequestHeader("Accept", "text/json")&lt;br /&gt;    client.executeMethod(getMethod)&lt;br /&gt;    def result=getMethod.getResponseBodyAsString().toString()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これでGETを実行し、結果をStringで受け取れます。&lt;br /&gt;それぞれ PostMethod、PutMethod、DeleteMethodが用意されているのでそれらに置き換えれば他のメソッドを実行出来ます。&lt;br /&gt;&lt;br /&gt;RESTってHTTPプロトコルの標準な機能なのでクライアントに特別なライブラリ等を追加する必要がない反面、WSDLのようにメソッドの仕様や型の制御などが作り手次第になってしまうのがちょっと難点な気がします。&lt;br /&gt;&lt;br /&gt;でもWSDLと違って、認証等はacegi pluginいれてbasic認証使えば比較的セキュアかつ統合された作りが簡単に出来るのは良いですね！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-6138875193862163902?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/6138875193862163902/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=6138875193862163902' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6138875193862163902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6138875193862163902'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/03/grailsrest.html' title='GrailsとRESTのただならぬ事情'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-4121550916250732652</id><published>2009-03-02T17:44:00.003+09:00</published><updated>2009-03-02T20:36:30.716+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>GrailsでMySQLに接続</title><content type='html'>特に書くほどの事でも無いですが一応メモ・・・&lt;br /&gt;&lt;br /&gt;MySQLへの接続は Connector/J で行いますんで、MySQLのサイトから接続するDBバージョンにあわせたConnector/Jをダウンロードします。&lt;br /&gt;今回は 5.1 なので mysql-connector-java-5.1.7.tar.gz をダウンロードしました。&lt;br /&gt;こいつを解凍して mysql-connector-java-5.1.7-bin.jar を grails の lib フォルダに入れます。&lt;br /&gt;&lt;br /&gt;まずはDB側の設定。my.cnf に以下を入れておく。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;  default-character-set=utf8&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;MySQLAdministrator の設定画面から行くと↓のへん&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/SauecdrezwI/AAAAAAAAAB8/D220r0dCAWw/s1600-h/mysqladmin.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 266px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/SauecdrezwI/AAAAAAAAAB8/D220r0dCAWw/s320/mysqladmin.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5308510797626789634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;DBを先に作っておき（今回はdbnameという名称で仮定）、 conf/DataSource.groovy の設定を&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;      pooled = true&lt;br /&gt;      dialect = org.hibernate.dialect.MySQLDialect.class&lt;br /&gt;      driverClassName = "org.gjt.mm.mysql.Driver"&lt;br /&gt;      username = "root"&lt;br /&gt;      password = ""&lt;br /&gt;      dbCreate = "update"&lt;br /&gt;      url = "jdbc:mysql://localhost/dbname?useUnicode=true&amp;characterEncoding=UTF8"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以上のようにして起動すればめでたしめでたし。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-4121550916250732652?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/4121550916250732652/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=4121550916250732652' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4121550916250732652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4121550916250732652'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/03/grailsmysql.html' title='GrailsでMySQLに接続'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MmNDS6igmGM/SauecdrezwI/AAAAAAAAAB8/D220r0dCAWw/s72-c/mysqladmin.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3456416181313881424</id><published>2009-02-27T10:16:00.005+09:00</published><updated>2009-02-27T11:42:10.273+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>mySQLレプリケーションのセットアップ</title><content type='html'>もっぱらpostgresだったのだけんども食わず嫌いも良くないのでmySQLをもしゃもしゃしてみた。&lt;br /&gt;&lt;a href="http://www.irori.org/doc/mysql-rep.html"&gt;このへん&lt;/a&gt;を参考に。&lt;br /&gt;&lt;br /&gt;・セットアップ&lt;br /&gt;Macはパッケージがあるので簡単セットアップで完了。&lt;br /&gt;postgresでいう所のpgAdminはmySQL GUI TOOLというのがある。&lt;br /&gt;&lt;br /&gt;サーバ管理系とクエリ／データ処理系とで以下の二つに別れている。&lt;br /&gt;&lt;br /&gt;・MySQL Administrator&lt;br /&gt;DBの起動／停止、DBの作成、テーブルの作成、ユーザの作成、バックアップ／リストア等がGUIで出来るツール&lt;br /&gt;&lt;br /&gt;・MySQL QueryBrowser&lt;br /&gt;クエリの実行、テーブルの中身をざっくりみたい場合もこっち&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;サクっと起動した所で、レプリケーションの設定。&lt;br /&gt;スレーブ側からマスタへ接続する為のユーザを作成。&lt;br /&gt;&lt;pre name="code" class="html:nocontrols"&gt;&lt;br /&gt;mysql&gt; GRANT REPLICATION SLAVE ON *.* TO repl@'192.168.20.0/255.255.255.0' IDENTIFIED BY 'xmldo';&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;repl / xmldo というユーザが作成される。&lt;br /&gt;この接続は 192.168.20.0/24 からのみ接続可能。&lt;br /&gt;MySQL Administratorから作る事も出来る。&lt;br /&gt;&lt;br /&gt;マスタ側はログをバイナリで出力する必要がある。&lt;br /&gt;また、レプリケーションする際には、すべてのDBへ固有のserver-idが必要となる。&lt;br /&gt;マスター側のmy.cnf&lt;br /&gt;&lt;pre name="code" class="html:nocontrols"&gt;&lt;br /&gt;[mysqld]&lt;br /&gt;server-id=10&lt;br /&gt;log-bin&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;スレーブ側のmy.cnf&lt;br /&gt;&lt;pre name="code" class="html:nocontrols"&gt;&lt;br /&gt;[mysqld]&lt;br /&gt;server-id=11&lt;br /&gt;master-host=192.168.20.15&lt;br /&gt;master-user=repl&lt;br /&gt;master-password=xmldo&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;設定ファイルを書き換えて再起動でレプリケーション完成。あら、アッサリなのね。&lt;br /&gt;ではトラブルを想定して実験をしてみましょう。&lt;br /&gt;&lt;br /&gt;・スレーブが停止中にマスターにデータが書き込まれ、その後スレーブが復帰。&lt;br /&gt;＞スレーブ復旧後に、追加したデータ問題なく挿入されました。&lt;br /&gt;&lt;br /&gt;・マスターが停止中にスレーブにデータが書き込まれ、その後マスターが復帰。&lt;br /&gt;＞標準のレプリケーションはマスタ／スレーブ方式なので、復旧しない。&lt;br /&gt;&lt;br /&gt;なんらかのトラブルでスレーブを使う事になったら、マスタ復旧時にはスレーブをバックアップ＞マスタへリストアしてやる必要がある、と。&lt;br /&gt;ここでマルチマスタ方式のmySqlClusterを使うのだろうけど、とりあえずバックアップをとっておきたいの場合はこれでも十分だろう。&lt;br /&gt;（なんといっても設定が簡単だし・・・）&lt;br /&gt;&lt;br /&gt;データだけを別システムで流用（リードオンリーで）するような場合は良いっすね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3456416181313881424?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3456416181313881424/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3456416181313881424' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3456416181313881424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3456416181313881424'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/02/mysql.html' title='mySQLレプリケーションのセットアップ'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5671196335539479916</id><published>2009-02-14T12:52:00.004+09:00</published><updated>2009-02-16T14:15:36.540+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQueryを使ってみた</title><content type='html'>乗るしかない、このビックウェーブに&lt;br /&gt;という事で食わず嫌いだったjQueryを使ってみました。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/gcrnagoya/"&gt;grailsのwiki&lt;/a&gt;でページ一覧をツリーで表示したいというのがあったので、そこを目標に、というかすでにやっつけで作ってコミットしてあります。&lt;br /&gt;&lt;br /&gt;本家からjQuery本体を&lt;a href="http://jqueryjs.googlecode.com/files/jquery-1.3.1.min.js"&gt;ダウンロード&lt;/a&gt;&lt;br /&gt;ツリーで調べたら&lt;a href="http://abeautifulsite.net/notebook.php?article=58"&gt;jQueryFileTree&lt;/a&gt;というのがあったのでこれをチョイス。&lt;br /&gt;pluginで&lt;a href="http://gsgd.co.uk/sandbox/jquery/easing/"&gt;jQuery Easing Plugin&lt;/a&gt;か、相当するものが必要ということでこれもダウンロード。&lt;br /&gt;&lt;br /&gt;pluginってどうするのかなーと思っていたけど、本体をロードした後にロードするだけでいいみたい。&lt;br /&gt;&lt;br /&gt;以下まずはjQueryを使って感じた事メモメモ&lt;br /&gt;・prototypeでいう$("elementId")は$("#elementId")で取得&lt;br /&gt;・prototypeでいうForm.serialize()はformエレメントの.serialize()で出来る。&lt;br /&gt;　（formがドキュメント上に１個しかなければ $("form").serialize() でおk）&lt;br /&gt;&lt;br /&gt;・ajax処理は以下の感じ&lt;br /&gt;&lt;pre name="code" class="html:nocontrols"&gt;&lt;br /&gt;&lt;br /&gt;var params=$("form").serialize();&lt;br /&gt;$.ajax({&lt;br /&gt;  url:"${createLink(controller:'hoge',action:'foo')}",&lt;br /&gt;  type:"post",&lt;br /&gt;  data:(params),&lt;br /&gt;  success: function(request) {&lt;br /&gt;    $('#success').html(request);&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;・安全なドキュメントロード後のinit処理&lt;br /&gt;$(document).ready(function() {});&lt;br /&gt;&lt;br /&gt;エレメントにイベント追加（クリックを例に）&lt;br /&gt;$("#elementId").click(function(){});&lt;br /&gt;&lt;br /&gt;イベントの追加が自然でいい感じ。&lt;br /&gt;extのStoreみたいなのはあるのかなー、あれ凄く好きだったんだけど・・・&lt;br /&gt;&lt;br /&gt;ツリーの実装はまた今度&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5671196335539479916?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5671196335539479916/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5671196335539479916' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5671196335539479916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5671196335539479916'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/02/jquery.html' title='jQueryを使ってみた'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-909307080862852377</id><published>2009-02-12T16:01:00.002+09:00</published><updated>2009-02-12T16:33:41.088+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>Hudson最強化計画</title><content type='html'>&lt;a href="http://d.hatena.ne.jp/masanobuimai/20090211#1234368473"&gt;HudsonをCI以外で使う&lt;/a&gt;というブログを読んで強カットインが入った。&lt;br /&gt;&lt;br /&gt;そうだよなー、データベースのバックアップをやれば失敗でメールを投げたり、色んなバックアップをまとめて管理しておけるし、バックアップログも残しておけるし、システム稼働監視なんかも出来るじゃまいか。&lt;br /&gt;何よりもそれらが統一されたGUIで行えるわけで、サーバに入り込んでどこで何やってるか把握する必要もなく、Linuxの知識もそれほどいらない。&lt;br /&gt;&lt;br /&gt;いやー、こういう使い方は凄く良いと思う！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-909307080862852377?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/909307080862852377/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=909307080862852377' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/909307080862852377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/909307080862852377'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/02/hudson.html' title='Hudson最強化計画'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3601285834797382220</id><published>2009-02-05T13:16:00.002+09:00</published><updated>2009-02-05T13:26:47.109+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blazeDS'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails+BlazeDSでファイルアップロード</title><content type='html'>FileReferenceを使ったアップロードでは browse() が必須になります。&lt;br /&gt;ファイルを選択してアップする場合は問題ないのですが、決まったファイルのアップロード（別システムから出力されるデータなど）を行う場合には不便です。&lt;br /&gt;&lt;br /&gt;なのでBlazeDSでアップロードしてやりましょう。&lt;br /&gt;GrailsでBlazeDSは&lt;a href="http://ponytailthes.blogspot.com/2008/07/blazeds.html"&gt;過去のエントリ&lt;/a&gt;を参照に。&lt;br /&gt;&lt;br /&gt;BlazeDSではActionScriptの byte[] と Java の byte[] をコンバートして通せるようなので、ファイルをbyteにして投げてやります。&lt;br /&gt;&lt;pre name="code" class="javascript:nocontrols"&gt;&lt;br /&gt;private function blazeDsUpload():void {&lt;br /&gt;  // ファイルをバイト配列で読み込む&lt;br /&gt;  var file:File=new File("/opt/hoge.jpg");&lt;br /&gt;  var fs:FileStream=new FileStream();&lt;br /&gt;  var bytes:ByteArray=new ByteArray();&lt;br /&gt;  fs.open(file, FileMode.READ);&lt;br /&gt;  fs.readBytes(bytes, 0, file.size);&lt;br /&gt;&lt;br /&gt;  //定義してあるRemoteObjectへパラメーターとして渡す&lt;br /&gt;  remoteObject.upload({"Filedata":bytes});&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Grailsのサービス側で受け取るサンプル&lt;br /&gt;byte[]データをファイルへ収めてやります。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;  def upload(params) {&lt;br /&gt;    def fileBytes=params["Filedata"]&lt;br /&gt;    def file=new File("/work/hoge.jpg")&lt;br /&gt;    file.withOutputStream { out -&gt;&lt;br /&gt;      out.write(fileBytes)&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3601285834797382220?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3601285834797382220/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3601285834797382220' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3601285834797382220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3601285834797382220'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/02/grailsblazeds.html' title='Grails+BlazeDSでファイルアップロード'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-103751613293177138</id><published>2009-02-04T19:15:00.002+09:00</published><updated>2009-02-04T19:21:37.270+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Air'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Air+Grailsでファイルアップロードの巻</title><content type='html'>AirにはFileReferenceというアップロード用のクラスが用意されてますので、そいつを使います。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript:nocontrols"&gt;&lt;br /&gt; var fileRef:FileReference=new FileReference();&lt;br /&gt; fileRef.addEventListener(Event.SELECT,selectHandler);&lt;br /&gt; fileRef.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);&lt;br /&gt; fileRef.browse();&lt;br /&gt;&lt;br /&gt;// ファイル選択後アップロード処理を実行&lt;br /&gt;private function selectHandler(event:Event):void {&lt;br /&gt;  var file:FileReference = FileReference(event.target);&lt;br /&gt;  var uploadURL:URLRequest = new URLRequest();&lt;br /&gt;  uploadURL.url = "http://localhost:8080/grails/sample/upload";&lt;br /&gt;  file.upload(uploadURL);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// これがないとエラー画面が出ました&lt;br /&gt;private function ioErrorHandler(event:IOErrorEvent):void {&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Grails側に受けのアクションを作ってやります。&lt;br /&gt;普通にMultiPartFormDataが来るので、処理してやるだけです。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;class SampleController {&lt;br /&gt;  def upload={&lt;br /&gt;    def file=request.getFile("Filedata")&lt;br /&gt;    file.transferTo(new File("/hoge",params["Filename"]))&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-103751613293177138?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/103751613293177138/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=103751613293177138' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/103751613293177138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/103751613293177138'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/02/airgrails.html' title='Air+Grailsでファイルアップロードの巻'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-6356978791176419668</id><published>2009-02-03T23:52:00.003+09:00</published><updated>2009-02-04T00:11:53.394+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>grails run-app が永久ループする件について</title><content type='html'>前にrun-appした時に、起動後永遠とリロードを繰り返して動かないという状況がありました。&lt;br /&gt;その時はinteractiveでrun-appした時はちゃんと動くので、そのままにしてたのですが、最近ふとしたきっかけで解決しました。&lt;br /&gt;&lt;br /&gt;groovyファイルとかjavaファイルとかを実行時にコンパイルするのですが、&lt;br /&gt;packageが指定してある場合に、packageと実際にフォルダ位置があっていない場合に上記の症状が発生します。&lt;br /&gt;多分生成するclassと実際のソースパスが一致しないため、いつまでも新規ファイルが投入されたと思ってコンパイルを繰り返すものと思われます。&lt;br /&gt;&lt;br /&gt;なんでpackage名とフォルダ構成をあわせてやるだけでＯＫです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まったく関係ない話ですが&lt;a href="http://japanese.engadget.com/2009/01/31/iphone-flash/"&gt;アップルとアドビが組んでiPhone用Flashを開発中&lt;/a&gt;という話&lt;br /&gt;ってーことはflexアプリとか動いちゃうんかいなー？アプリ形式に対応すればAppStoreへの登録も可能なわけで :)&lt;br /&gt;もの凄く夢が広がりんぐ！&lt;br /&gt;Androidの方はどうなんだろ、Flashには対応してるみたいだけどアプリ的に扱えるようになればおもしろいですね。&lt;br /&gt;Android/iPhoneのマルチプラットフォームアプリケーション開発とか出来たらかっこいいな〜&lt;br /&gt;adobe labsが出来た辺りからadobeには色々とワクワクさせられます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-6356978791176419668?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/6356978791176419668/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=6356978791176419668' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6356978791176419668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/6356978791176419668'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/02/grails-run-app.html' title='grails run-app が永久ループする件について'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-7780843600228908229</id><published>2009-01-31T22:43:00.002+09:00</published><updated>2009-01-31T22:44:49.329+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails-1.1 Beta3の検証</title><content type='html'>Grails-1.1Beta3がリリースされたので&lt;a href="http://www.grails.org/1.1-beta3+Release+Notes"&gt;リリースノート&lt;/a&gt;から一部検証・・・&lt;br /&gt;&lt;br /&gt;・Persistence of Collections of Basic Types&lt;br /&gt; hasManyでStringとかが指定出来るようになりましたよ。&lt;br /&gt; &lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt; class Book {&lt;br /&gt;   static hasMany = [authors:String]&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; hsqlDBのfileで確認したところ以下のようなテーブルが出来るらしい&lt;br /&gt; CREATE MEMORY TABLE BOOK_AUTHORS(BOOK_ID BIGINT,AUTHORS_STRING VARCHAR(255),CONSTRAINT FKCBA3F8F23FA913A FOREIGN KEY(BOOK_ID) REFERENCES BOOK(ID))&lt;br /&gt; でもscaffoldには対応してくれないみたい。現段階では正直微妙? &lt;br /&gt; &lt;br /&gt;・Persistence of Collections of Enum Types &lt;br /&gt;　上のhasManyでEnumが指定できるよ。&lt;br /&gt; &lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt; enum VehicleStatus { "NONE", "LITTLE", "MANY" }&lt;br /&gt; class Book {&lt;br /&gt;   static hasMany=[statuses:VehicleStatus]&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;br /&gt; 以下のようなテーブルが出来るっぽい&lt;br /&gt; CREATE MEMORY TABLE BOOK_STATUSES(BOOK_ID BIGINT,VEHICLE_STATUS VARCHAR(255),CONSTRAINT FKA209D4B63FA913A FOREIGN KEY(BOOK_ID) REFERENCES BOOK(ID))&lt;br /&gt; 同じくscaffoldには対応してない&lt;br /&gt; &lt;br /&gt;・Read-Only Access to Objects&lt;br /&gt; ReadOnlyでデータをひっぱれるよ。&lt;br /&gt; &lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;  def book = Book.read(1)&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;br /&gt; 通常Grailsではひっぱったドメインはフィールドの値を変更してコントローラーを抜けると、変更された値が自動的に保存されます。&lt;br /&gt; readでひっぱるとフィールドの変更があっても元のデータは更新されません。&lt;br /&gt; んがっ、book.save()したら更新されちゃいました :p&lt;br /&gt; あとfindとかしたい場合はどうするんだろう&lt;br /&gt; &lt;br /&gt;・Default Sort Order&lt;br /&gt; ドメインのデフォソートを決められるよ。&lt;br /&gt; &lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;   class Book {&lt;br /&gt;     static hasMany=[authors:Author]&lt;br /&gt;     static mapping = {&lt;br /&gt;       authors sort:"name"&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     String title&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   class Author {&lt;br /&gt;     static belongsTo = [book:Book]&lt;br /&gt;     String name&lt;br /&gt;   }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;br /&gt; 今までは book.authors　を参照した場合順番はランダムだったのがソートフィールドを指定出来るようになりました。&lt;br /&gt; 上の例だとauthorのname順で取得出来ます。&lt;br /&gt; サンプルではドメイン自体のsortも決められるような事がかいてあったけど .list() では確認できませぬでした。　&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-7780843600228908229?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/7780843600228908229/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=7780843600228908229' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7780843600228908229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7780843600228908229'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/grails-11-beta3.html' title='Grails-1.1 Beta3の検証'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-5446946282684997786</id><published>2009-01-29T19:24:00.002+09:00</published><updated>2009-01-29T19:27:44.425+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><title type='text'>Flexのちょいネタ</title><content type='html'>MXMLのclickとかにfunctionを当てる場合の話&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&lt;br /&gt;  &amp;lt;mx:Button click="hoge()" /&amp;gt&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;と書く所を&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&lt;br /&gt;  &amp;lt;mx:Button click="{hoge()}" /&amp;gt&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;と中括弧でかこってやると、FlexBuilderがちゃんと関数として解釈してくれるので、CMD+Clickでfunctionまで飛べるお。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-5446946282684997786?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/5446946282684997786/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=5446946282684997786' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5446946282684997786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/5446946282684997786'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/flex.html' title='Flexのちょいネタ'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-2372216584535272541</id><published>2009-01-29T19:13:00.003+09:00</published><updated>2009-01-29T19:24:16.296+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Birt'/><title type='text'>俺たちのBirtはこれからだ！</title><content type='html'>今日はBirtでシコシコと帳票を作っておりますた。&lt;br /&gt;&lt;br /&gt;元になるデータを起こすところまではまーまー順調に解消。&lt;br /&gt;さて、このテンプレを元にデータを流すわけですが・・・&lt;br /&gt;今持っているデータだけではさっぱり足りずにフィールドを増やしフォームを増やしとあれやこれやであっという間に時間が。&lt;br /&gt;&lt;br /&gt;AirからHTMLをオープン、HTMLからGrailsへアクセスして、Grailsでデータをこねこね、XMLにして返したのをさらにBirtで微調整。&lt;br /&gt;なんかもうエディタがいっぱい開いて目的のソースがどこにあるのかわかりませんよっと。&lt;br /&gt;&lt;br /&gt;しかしEclipseのBirtPluginはMacで動かしているせいなのか（？）微妙に動きが悪くてしょんぼりです。&lt;br /&gt;・ラベルで日本語打つ＞エンター＞消える・・・（ペーストしてエンターだといける）&lt;br /&gt;・データバインディングを変更する＞変わらない・・・（セレクタをカーソルで切り替えてエンターだといける）&lt;br /&gt;帳票上のデータが多いと目に見えて重くなるし、ちょっと困ったちゃんです。&lt;br /&gt;&lt;br /&gt;それでもフリーでスクリプトやらなんやらバリバリかけてGUIの帳票ツールまであるのは凄い事ですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-2372216584535272541?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/2372216584535272541/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=2372216584535272541' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2372216584535272541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2372216584535272541'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/birt.html' title='俺たちのBirtはこれからだ！'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-7901837492645571953</id><published>2009-01-27T21:07:00.011+09:00</published><updated>2009-01-27T21:22:40.778+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Air'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Air(Flex)か〜ら〜のHTMLか〜ら〜のJavascript</title><content type='html'>AirのHTMLタグから、パッケージに含んだファイル（とかローカルファイルとか）を読み込む方法&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&lt;br /&gt;&lt;br /&gt;        var file:File = new File("app:/html/index.html");&lt;br /&gt;        var src = new File(file.nativePath).url;&lt;br /&gt;        html.location=src;&lt;br /&gt;      &lt;br /&gt;        &amp;lt;mx:HTML id="html" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;パッケージ内にあるJavaScriptは相対パスで読めます。&lt;br /&gt;HTMLとinclude.jsが同じ場所にあるとすれば以下のように。&lt;br /&gt;&lt;pre name="code" class="html:nocontrols"&gt;&lt;br /&gt; &amp;lt;script src="include.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;JavaScriptが全然別のドメインとかでもひっぱてきて使えちゃいますよ。&lt;br /&gt;&lt;pre name="code" class="html:nocontrols"&gt;&lt;br /&gt; &amp;lt;script src="http://hoge.jp/outer.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;なんでJavaScriptのコアをどっかにおいておけばアプリ本体を更新せずにサーバのJSを置き換えて更新も出来ちゃう。&lt;br /&gt;&lt;br /&gt;でもってAirからHTMLでロードした中のJavaScriptの実行方法&lt;br /&gt;htmlのcompleteイベントからdomを取得出来るので、、、&lt;br /&gt;&lt;pre name="code" class="html:nocontrols"&gt;&lt;br /&gt;      private function loadCompleteHandler(e:Event):void {&lt;br /&gt;       dom=e.currentTarget.domWindow;        &lt;br /&gt;      }&lt;br /&gt;      &amp;lt;mx:HTML id="html" location="{src}" width="100%" height="100%" complete="loadCompleteHandler(event)" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;domの直下にスクリプトがバインドされているので、それを実行すればオッケィ&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;html.functionName();&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-7901837492645571953?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/7901837492645571953/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=7901837492645571953' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7901837492645571953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7901837492645571953'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/airflexhtmljavascript.html' title='Air(Flex)か〜ら〜のHTMLか〜ら〜のJavascript'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-931383665354981152</id><published>2009-01-23T09:52:00.002+09:00</published><updated>2009-01-23T10:02:37.029+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>httpBuilderで文字化けする件について</title><content type='html'>httpBuilderでgoogleのサイトを取得している時はうまくいってたのですがShift_JISのサイトを取り込もうとしたらUTF-8になってしまいました。&lt;br /&gt;まぁよくある事だと思ってソースをさぐっていったのですが、思ったよりも深い所で大変でした、、、&lt;br /&gt;&lt;br /&gt;結論からいくとContentTypeが text/html,text/plain,text/xml などの場合は、 ParserRegistry というクラスの parseText という所で、 HttpResponse から charset をあてて InputStream にして返しています。&lt;br /&gt;この charset をあてる所がくせもので、 HttpResponse に含まれるパラメーターの charset を使い、なければ OSデフォ（Charset.defaultCharset().name()）をあてるという処理になっています。&lt;br /&gt;おそらくテストしたサイトの response に charset のパラメーターがついていなくて、UTF-8があたったっぽいです。&lt;br /&gt;&lt;br /&gt;とりあえず parseText に無理矢理 charset をのせてやったらうまくいきました :)&lt;br /&gt;でもちゃんと作るなら ParserRegistry に  charset をあてれるように拡張しないといかんとですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-931383665354981152?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/931383665354981152/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=931383665354981152' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/931383665354981152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/931383665354981152'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/httpbuilder_23.html' title='httpBuilderで文字化けする件について'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8232436302625897591</id><published>2009-01-19T18:18:00.003+09:00</published><updated>2009-01-19T18:31:47.880+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>httpBuilderが俺にもっと輝けと囁いている</title><content type='html'>&lt;a href="http://groovy.codehaus.org/modules/http-builder/index.html"&gt;httpBuilder&lt;/a&gt;という素敵なものがあったので試してみた&lt;br /&gt;&lt;br /&gt;allをダウンロードして、target/dependenciesのjarとhttp-builder自体のjarをlibへコピっと。&lt;br /&gt;&lt;br /&gt;Basic認証して、htmlを取得するサンプル。&lt;br /&gt;取得したhtmlはxmlSlurperへ変換し操作しやすいように。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;    import groovyx.net.http.*&lt;br /&gt;    import static groovyx.net.http.Method.*&lt;br /&gt;    import static groovyx.net.http.ContentType.*&lt;br /&gt;    &lt;br /&gt;    // basic認証用にbase64したID/Passを作成&lt;br /&gt;    def testBytes = "user:pass".getBytes("ISO-8859-1")&lt;br /&gt;    def encoded=testBytes.encodeBase64()&lt;br /&gt;    &lt;br /&gt;    def http = new HTTPBuilder("http://hogehoge.jp/requiredBasicAuth")&lt;br /&gt;    http.headers=["Authorization":"Basic ${encoded}"]&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;      http.get(contentType:TEXT) { resp, reader -&gt;&lt;br /&gt;        def page = new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parseText(reader.text)&lt;br /&gt;        def data = page.depthFirst()&lt;br /&gt;        data.each { println it }&lt;br /&gt;      }&lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      println "auth failure"&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;headerの調整とかpost指定とかなしで、簡単にとりたいだけだったら、上のCyberNekoのSlurperを使っている所を使うと簡単&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;  def page = new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parse("http://www.google.co.jp")&lt;br /&gt;  def data = page.depthFirst()&lt;br /&gt;  data.each { println it }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こんだけでオッケー！&lt;br /&gt;&lt;br /&gt;getのオプションで使う query がうまく動かなかったのが気になる所・・・&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8232436302625897591?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8232436302625897591/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8232436302625897591' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8232436302625897591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8232436302625897591'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/httpbuilder.html' title='httpBuilderが俺にもっと輝けと囁いている'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-7231920454322659041</id><published>2009-01-14T20:31:00.003+09:00</published><updated>2009-01-14T20:47:42.359+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>iPhoneでJsonをごにょごにょ</title><content type='html'>簡単なJSONを返すアクションを作成&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;  def json = {&lt;br /&gt;    def jsonData=[["name":"任天堂","hard":"wii"],&lt;br /&gt;                  ["name":"sony","hard":"PlayStation3"],&lt;br /&gt;                  ["name":"Microsoft","hard":"XBOX360"]]&lt;br /&gt;    &lt;br /&gt;    render(text:jsonData as JSON)&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ブラウザで確認すると、こんな感じのJSONデータが返ります。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;  [{"name":"任天堂","hard":"wii"},{"name":"sony","hard":"PlayStation3"},{"name":"Microsoft","hard":"XBOX360"}]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これをiPhoneでうけとってTableViewに表示します。&lt;br /&gt;JSONを取得する部分&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;- (void)getJSON {&lt;br /&gt; NSURL *jsonURL = [NSURL URLWithString:@"http://localhost:8080/jsonSample/test/json"];&lt;br /&gt; NSMutableString *jsonData = [NSMutableString stringWithContentsOfURL:jsonURL encoding:NSUTF8StringEncoding error:nil];&lt;br /&gt; [jsonData replaceOccurrencesOfString:@"'"&lt;br /&gt;  withString:@"\""&lt;br /&gt;  options:NSCaseInsensitiveSearch&lt;br /&gt;  range:NSMakeRange(0,[jsonData length])];&lt;br /&gt;&lt;br /&gt; NSLog(jsonData);&lt;br /&gt; &lt;br /&gt; if (jsonData == nil) {&lt;br /&gt;  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Webservice Error" message:@"JSON Dataの取得に失敗しました。"  delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];&lt;br /&gt;  [alert show];&lt;br /&gt;  [alert release];&lt;br /&gt; } else {&lt;br /&gt;  SBJSON *json = [SBJSON new];&lt;br /&gt;  json.humanReadable = YES;&lt;br /&gt;  &lt;br /&gt;  id result = [jsonData JSONValue]; &lt;br /&gt;  NSLog([json stringWithObject:result error:NULL]);&lt;br /&gt;  &lt;br /&gt;  webResult = [[NSMutableArray alloc] init];&lt;br /&gt;  &lt;br /&gt;  NSEnumerator* enumerator;&lt;br /&gt;  enumerator = [result objectEnumerator];&lt;br /&gt;  &lt;br /&gt;  // while文を使って要素にアクセスする&lt;br /&gt;  id obj;&lt;br /&gt;  while (obj = [enumerator nextObject]) {&lt;br /&gt;   [webResult addObject:obj];&lt;br /&gt;  }&lt;br /&gt;  printf("データ件数 %d",[webResult count]);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;基本は前と一緒です。シングルクォートをダブルクォートに置換したりしてます。&lt;br /&gt;webResultはクラスのフィールドです。&lt;br /&gt;取得した値をループし、webResultへ追加していきます。&lt;br /&gt;&lt;br /&gt;InterfaceBuilderでTableViewをおいて、Outletとdelegateを設定します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MmNDS6igmGM/SW3PtP9tfsI/AAAAAAAAABw/DIpP89uXdnY/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 158px;" src="http://1.bp.blogspot.com/_MmNDS6igmGM/SW3PtP9tfsI/AAAAAAAAABw/DIpP89uXdnY/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5291113513516629698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;dataSource、delegateをFile'sOwnerに設定し、クラスに定義したtableViewと連結します。&lt;br /&gt;クラスにtableView用の定義をします。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {&lt;br /&gt; return [webResult count];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {&lt;br /&gt; UITableViewCell *cell;&lt;br /&gt; cell = [[UITableViewCell alloc] init];&lt;br /&gt; cell.text = [[webResult objectAtIndex:indexPath.row] objectForKey:@"name"];&lt;br /&gt; return cell;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {&lt;br /&gt; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"あなたが選んだのは"&lt;br /&gt;             message:[[webResult objectAtIndex:indexPath.row] objectForKey:@"hard"]&lt;br /&gt;             delegate:self&lt;br /&gt;                cancelButtonTitle:@"OK"&lt;br /&gt;                otherButtonTitles: nil];&lt;br /&gt; [alert show];&lt;br /&gt; [alert release];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;上から順番に&lt;br /&gt;numberOfRowsInSection : テーブルに何件あるかを返すメソッド&lt;br /&gt;cellForRowAtIndexPath : １行毎に表示するメソッド&lt;br /&gt;didSelectRowAtIndexPath : 行を選択した時のアクション&lt;br /&gt;です。&lt;br /&gt;&lt;br /&gt;詳細はメモなんで略 :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-7231920454322659041?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/7231920454322659041/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=7231920454322659041' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7231920454322659041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7231920454322659041'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/iphonejson_14.html' title='iPhoneでJsonをごにょごにょ'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MmNDS6igmGM/SW3PtP9tfsI/AAAAAAAAABw/DIpP89uXdnY/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-7952749235880677192</id><published>2009-01-12T23:00:00.003+09:00</published><updated>2009-01-12T23:10:51.904+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>よろしい、ならばiPhoneでJSONだ その３</title><content type='html'>Grailsのアプリと通信してJSONデータを取得するサンプルです。&lt;br /&gt;&lt;br /&gt;Grails側にJSONデータを返すアクションを用意します。&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;&lt;br /&gt;  def json = {&lt;br /&gt;    def jsonData=["任天堂":"wii","sony":"PlayStation3","Microsoft":"XBOX360"]&lt;br /&gt;    &lt;br /&gt;    render(text:jsonData as JSON,contentType:"application/x-json")&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;contentTypeは application/json でも無指定でも読み込める。&lt;br /&gt;&lt;br /&gt;Objective-C側&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;NSURL *jsonURL = [NSURL URLWithString:@"http://localhost:8080/jsonSample/test/json"];&lt;br /&gt;NSString *jsonData = [[NSString alloc] initWithContentsOfURL:jsonURL encoding:NSUTF8StringEncoding error:nil];&lt;br /&gt; &lt;br /&gt;if (jsonData == nil) {&lt;br /&gt;  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Webservice Error" message:@"JSON Dataの取得に失敗しました。"  delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];&lt;br /&gt;  [alert show];&lt;br /&gt;  [alert release];&lt;br /&gt;} else {&lt;br /&gt;  SBJSON *json = [SBJSON new];&lt;br /&gt;  json.humanReadable = YES;&lt;br /&gt;  &lt;br /&gt;  id jsonItem = [jsonData JSONValue]; &lt;br /&gt;  NSLog([json stringWithObject:jsonItem error:NULL]);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;NSString の initWithContentsOfURL で encoding を指定するのがポイントです。&lt;br /&gt;encodingがあってないと nil になって通信出来てないのかと思って悩んでました・・・&lt;br /&gt;&lt;br /&gt;そろそろインターフェース側の処理をやっていこうかな :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-7952749235880677192?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/7952749235880677192/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=7952749235880677192' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7952749235880677192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7952749235880677192'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/iphonejson_5715.html' title='よろしい、ならばiPhoneでJSONだ その３'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-7133353130922121088</id><published>2009-01-12T21:04:00.002+09:00</published><updated>2009-01-12T21:11:41.790+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>よろしい、ならばiPhoneでJSONだ その２</title><content type='html'>Objective-CでJsonを取り扱うスニペットめもりんぐ&lt;br /&gt;&lt;br /&gt;NSDictionaryとNSStringをいったりきたり&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;    // NSDictionaryからStringに&lt;br /&gt;    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:&lt;br /&gt;                          @"The iPhone", @"Today",&lt;br /&gt;                          @"The World", @"Tomorrow",&lt;br /&gt;                          nil];&lt;br /&gt;    SBJSON *json = [SBJSON new];&lt;br /&gt;    json.humanReadable = YES;&lt;br /&gt;    NSLog([json stringWithObject:dict error:NULL]);&lt;br /&gt; &lt;br /&gt;    // StringからNSDictionaryに&lt;br /&gt;    NSString *jsonString = @"{\"hoge\":\"foo\",\"wow\":[\"good\",\"cool\"]}";&lt;br /&gt;    id jsonObj = [json objectWithString:jsonString error:NULL];&lt;br /&gt;    if(jsonObj==NULL || jsonObj==nil) {&lt;br /&gt;        printf("NULL dayo\n");&lt;br /&gt;    } else {&lt;br /&gt;        NSLog([json stringWithObject:jsonObj error:NULL]);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;jsonでパース出来るのは、ダブルクォートだけです、シングルコートはだめです。（これにずっと気づかなかった・・・）&lt;br /&gt;objectWithStringの返り値はNSArrayだったりNSDictionaryだったりするので、idで受け取る必要があります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-7133353130922121088?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/7133353130922121088/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=7133353130922121088' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7133353130922121088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7133353130922121088'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/iphonejson_12.html' title='よろしい、ならばiPhoneでJSONだ その２'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3020990672108365629</id><published>2009-01-06T13:58:00.004+09:00</published><updated>2009-01-12T21:03:49.205+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><title type='text'>glassfishでメモリチューニングシンドローム</title><content type='html'>めもめもっと&lt;br /&gt;&lt;br /&gt;ドメイン毎に設定ファイルがありやんす。&lt;br /&gt;glassfish/domains/domain1/config/domain.xml&lt;br /&gt;&lt;br /&gt;java-configタグ以下に jvm-options タグを書いていく。&lt;br /&gt;デフォは -client とか入ってるのとメモリまったく調整してないのでパツパツ落ちます。&lt;br /&gt;&lt;br /&gt;一例&lt;br /&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&lt;br /&gt;&amp;lt;java-config classpath-suffix="" debug-options="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9009" system-classpath=""&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-server&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:+UnlockDiagnosticVMOptions&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:+LogVMOutput&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:LogFile=${com.sun.aas.instanceRoot}/logs/jvm.log&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Djava.endorsed.dirs=${com.sun.aas.installRoot}/lib/endorsed&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Djava.security.policy=${com.sun.aas.instanceRoot}/config/server.policy&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Xmx2048m&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Xms2048m&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Xmn1024m&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:PermSize=128m&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:MaxPermSize=128m&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:NewSize=320m&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:MaxNewSize=320m&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:SurvivorRatio=2&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:TargetSurvivorRatio=70&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Djavax.net.ssl.keyStore=${com.sun.aas.instanceRoot}/config/keystore.jks&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Djavax.net.ssl.trustStore=${com.sun.aas.instanceRoot}/config/cacerts.jks&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Djava.ext.dirs=${com.sun.aas.javaRoot}/lib/ext${path.separator}${com.sun.aas.javaRoot}/jre/lib/ext${path.separator}${com.sun.aas.instanceRoot}/lib/ext${path.separator}${com.sun.aas.derbyRoot}/lib&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Djdbc.drivers=org.apache.derby.jdbc.ClientDriver&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-XX:NewRatio=2&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;  &amp;lt;jvm-options&amp;gt;-Dconfluence.disable.peopledirectory.anonymous=true&amp;lt;/jvm-options&amp;gt;&lt;br /&gt;&amp;lt;/java-config&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3020990672108365629?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3020990672108365629/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3020990672108365629' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3020990672108365629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3020990672108365629'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/glassfish.html' title='glassfishでメモリチューニングシンドローム'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-603576909670723483</id><published>2009-01-06T11:00:00.004+09:00</published><updated>2009-01-06T11:29:39.229+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>よろしい、ならばiPhoneでJSONだ</title><content type='html'>GoogleCodeにてObjective-CのJSON Frameworkが公開されています。&lt;br /&gt;&lt;a href="http://code.google.com/p/json-framework/"&gt;http://code.google.com/p/json-framework/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;これを使ってiPhoneでJSONを使用してみましょう。&lt;br /&gt;以下の記事を参考にしています。&lt;br /&gt;&lt;a href="http://iphone.zcentric.com/2008/08/28/using-threads-for-a-json-request/"&gt;http://iphone.zcentric.com/2008/08/28/using-threads-for-a-json-request/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;まずはJSON Frameworkのインストールです。&lt;br /&gt;GoogleCodeからdmgを&lt;a href="http://json-framework.googlecode.com/files/JSON_2.1.1.dmg"&gt;ダウンロード&lt;/a&gt;します。&lt;br /&gt;ユーザのLibraryフォルダへSDKsフォルダをコピーします。&lt;br /&gt;（ユーザが hoge だった場合 &gt; /Users/hoge/Library に dmg内の SDKs をコピー）&lt;br /&gt;&lt;br /&gt;xcodeを立ち上げて適当な iPhone プロジェクトを生成します。&lt;br /&gt;メニューから、「プロジェクト」＞「プロジェクト設定を編集」 で 追加SDK へ以下の設定を追記します。&lt;br /&gt;&lt;br /&gt;$HOME/Library/SDKs/JSON/$(PLATFORM_NAME).sdk&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MmNDS6igmGM/SWLBkFpij2I/AAAAAAAAABg/oWoANz-bvWw/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 258px; height: 320px;" src="http://3.bp.blogspot.com/_MmNDS6igmGM/SWLBkFpij2I/AAAAAAAAABg/oWoANz-bvWw/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5288001738222243682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;「他のリンカフラグ」 へ以下の設定を追記します。&lt;br /&gt;&lt;br /&gt;-ObjC -ljson&lt;br /&gt;&lt;br /&gt;あとはJSONを使用するコードで JSON/JSON.h をインポートしてやればＯＫです。&lt;br /&gt;&lt;br /&gt;上記サイトに&lt;a href="http://iphone.zcentric.com/files/JSONiPhoneTest.dmg"&gt;サンプルアプリ&lt;/a&gt;もアップされています。&lt;br /&gt;以下サンプルアプリを実行した画面です。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MmNDS6igmGM/SWLCBVyis-I/AAAAAAAAABo/ZSIx2dGbrs4/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 172px; height: 320px;" src="http://4.bp.blogspot.com/_MmNDS6igmGM/SWLCBVyis-I/AAAAAAAAABo/ZSIx2dGbrs4/s320/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5288002240771175394" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-603576909670723483?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/603576909670723483/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=603576909670723483' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/603576909670723483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/603576909670723483'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2009/01/iphonejson.html' title='よろしい、ならばiPhoneでJSONだ'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_MmNDS6igmGM/SWLBkFpij2I/AAAAAAAAABg/oWoANz-bvWw/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-7857817963612803998</id><published>2008-12-31T13:28:00.008+09:00</published><updated>2009-02-05T13:27:39.945+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='インフルエンザ'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>iPhoneで動かすHelloWorld その４</title><content type='html'>インフルエンザで死んでおります・・・胃が痛い(T_T)&lt;br /&gt;高熱でちょっと忘れかけておりますが、日々の積み重ねが大事です！&lt;br /&gt;&lt;br /&gt;ではViewControllerの実装です。&lt;br /&gt;&lt;br /&gt;MyViewController.m で警告が出ているはずです。&lt;br /&gt;MyViewController.h で property 指定した textField , label , string に対するメソッドがないという事なので、アクセサメソッドの実装をしてやります。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;@synthesize textField;&lt;br /&gt;@synthesize label;&lt;br /&gt;@synthesize string;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これらのインスタンス変数が正しく解放されるように dealloc に追記します。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;- (void)dealloc {&lt;br /&gt; [textField release];&lt;br /&gt; [label release];&lt;br /&gt; [string release];&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ボタンを押させると changeGreeting がコールされる所まで確認しましたので、ここでテキストフィールドから文字列を取得し、ラベルを書き換えるようにします。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;- (IBAction)changeGreeting:(id)sender {&lt;br /&gt; self.string=textField.text;  // textFieldから文字列を取得し、自身のstring変数に格納します。&lt;br /&gt; &lt;br /&gt; NSString *nameString=string;&lt;br /&gt; if([nameString length]==0) {&lt;br /&gt;  nameString=@"World"; // textFieldの文字列が空なら World を代入する&lt;br /&gt; }&lt;br /&gt; NSString *greeting=[[NSString alloc] initWithFormat:@"Hello, %@!",nameString]; // ラベルに表示するメッセージを作成&lt;br /&gt; label.text=greeting;&lt;br /&gt; [greeting release];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ここまででビルドすると、以下のような結果が得られます。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MmNDS6igmGM/SVr5fFzJmbI/AAAAAAAAABY/i7HVZSer7QQ/s1600-h/iphone2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 172px; height: 320px;" src="http://2.bp.blogspot.com/_MmNDS6igmGM/SVr5fFzJmbI/AAAAAAAAABY/i7HVZSer7QQ/s320/iphone2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5285811425200675250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;大筋は完了しましたが、キーボードが閉じられない事に気がつくでしょう。&lt;br /&gt;MyViewController.m に以下のコードを追記します。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {&lt;br /&gt; if(theTextField==textField) {&lt;br /&gt;  [textField resignFirstResponder];&lt;br /&gt; } &lt;br /&gt; return YES;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;再度実行すると、Doneでキーボードが隠れる事を確認できます。&lt;br /&gt;&lt;br /&gt;以上で完成です！思ったより長かったです・・・体が痛い(T_T)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-7857817963612803998?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/7857817963612803998/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=7857817963612803998' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7857817963612803998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/7857817963612803998'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/iphonehelloworld_31.html' title='iPhoneで動かすHelloWorld その４'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_MmNDS6igmGM/SVr5fFzJmbI/AAAAAAAAABY/i7HVZSer7QQ/s72-c/iphone2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-2077588650115216734</id><published>2008-12-27T15:07:00.010+09:00</published><updated>2009-02-05T13:28:09.171+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>iPhoneで動かすHelloWorld その３</title><content type='html'>Viewに物をおいてみましょう！&lt;br /&gt;&lt;br /&gt;ControllerView.xib をインターフェースビルダーで起動して、LibraryからTextField と Label と Round Rect Button を配置します。&lt;br /&gt;↓こんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MmNDS6igmGM/SVXYjsUi8CI/AAAAAAAAABQ/8It_2JFLkrc/s1600-h/controllerview.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 220px; height: 320px;" src="http://4.bp.blogspot.com/_MmNDS6igmGM/SVXYjsUi8CI/AAAAAAAAABQ/8It_2JFLkrc/s320/controllerview.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5284367845493501986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;各Objectの設定はInspectorパネルから色々操作出来ます。&lt;br /&gt;TextのInspectorを見ると、TextInputTraitsという項目があって、ここでキーボードの形や、決定ボタンの形などが調整出来ます。&lt;br /&gt;&lt;br /&gt;ここでシミュレーターで実行してみると、キーボードは開きますが、消す事が出来ない状態です。&lt;br /&gt;これはキーボードの終了イベントを受け取る場所がないのでキーボードが閉じられないというわけです。&lt;br /&gt;&lt;br /&gt;このイベントをMyViewControllerと関連付けします。&lt;br /&gt;関連付けはアウトレットというインスタンス変数によって行われます。&lt;br /&gt;&lt;br /&gt;MyViewController.h&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;#import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;&lt;br /&gt;//MyViewControllerはテキストフィールドのデリゲートになるため、UITextFieldDelegateプロトコルを採用する必要があります。&lt;br /&gt;//プロトコルの指定はクラスの継承元クラスの後に &lt;&gt; で指定します。&lt;br /&gt;@interface MyViewController : UIViewController&lt;UITextFieldDelegate&gt; {&lt;br /&gt;&lt;br /&gt; //IBOutletは、続く宣言をアウトレットとして使う。という指示です。&lt;br /&gt; IBOutlet UITextField *textField;&lt;br /&gt; IBOutlet UILabel *label;&lt;br /&gt; NSString *string;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//@propertyでgetter,setterをproperty定義します。&lt;br /&gt;@property (nonatomic, retain) UITextField *textField;&lt;br /&gt;@property (nonatomic, retain) UILabel *label;&lt;br /&gt;@property (nonatomic, copy) NSString *string;&lt;br /&gt;&lt;br /&gt;//Helloボタンを処理するchangeGreetingメソッドを定義します。&lt;br /&gt;//IBActionは、続く宣言をターゲット／アクション接続のアクションとして扱う。という指示です。&lt;br /&gt;-(IBAction)changeGreeting:(id)sender;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;実装クラスへメソッドの中身を定義します。&lt;br /&gt;&lt;br /&gt;MyViewController.m&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;- (IBAction)changeGreeting:(id)sender {&lt;br /&gt;  printf("call!");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;保存してインターフェースビルダーへ戻り、File's OwnerのIdentity Inspectorをみると、&lt;br /&gt;Class ActionとClass OutletsにchangeGreetingとlabel,textFieldが追加されています。&lt;br /&gt;これはMyViewControllerクラスがControllerViewのビュークラスとして指定されている為です。&lt;br /&gt;&lt;br /&gt;インターフェース上に設置されたオブジェクトとフィールドを関連付けます。&lt;br /&gt;File's Ownerを右クリックして出てきたリストから○をドラッグして、関連付けたいオブジェクトへドロップします。&lt;br /&gt;&lt;br /&gt;ボタンのアクションをファンクションへ関連付けます。&lt;br /&gt;ボタンをCTRL+クリックで出てくるInspectorの中からTouch Up Insideの○をFile's Ownerへドラッグ＆ドロップします。&lt;br /&gt;changeGreetingが表示されるのでそれを選択する事で関連付けが行われます。&lt;br /&gt;&lt;br /&gt;テキストフィールドのデリゲートを設定します。&lt;br /&gt;テキストフォールドをCTRL＋ドラッグでFile's Ownerへドロップします。&lt;br /&gt;選択肢からDelegateを選ぶ事でデリゲートの設定が行われます。&lt;br /&gt;&lt;br /&gt;ここまで設定したら一度実行してみます。&lt;br /&gt;ボタンを押してコンソールにcall!が表示されたら連携がうまくいっています！&lt;br /&gt;次は実際に処理を書いていきます。（まだまだキーボードは戻せません :p）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-2077588650115216734?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/2077588650115216734/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=2077588650115216734' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2077588650115216734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2077588650115216734'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/iphonehelloworld_27.html' title='iPhoneで動かすHelloWorld その３'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MmNDS6igmGM/SVXYjsUi8CI/AAAAAAAAABQ/8It_2JFLkrc/s72-c/controllerview.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-623348554877339850</id><published>2008-12-25T00:00:00.006+09:00</published><updated>2009-02-05T13:28:23.952+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>iPhoneで動かすHelloWorld その２</title><content type='html'>Viewを追加するにはViewControllerとnibファイルを使用します。&lt;br /&gt;&lt;br /&gt;まずはViewControllerの作成です。&lt;br /&gt;Xcodeから新規ファイルで CocoaTouchClasses の UIViewControler subclass を選択します。&lt;br /&gt;テンプレートを元にざっくりとファイルが生成されます。&lt;br /&gt;&lt;br /&gt;作成したクラスをアプリケーションデリゲートのインスタンス変数に追加します。&lt;br /&gt;&lt;br /&gt;作成したクラスをMyViewControllerとし、HelloWorldAppDelegateへ以下のように定義します。&lt;br /&gt;&lt;br /&gt;HelloWorldAppDelegate.h&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;#import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;@class MyViewController; // クラス宣言&lt;br /&gt;&lt;br /&gt;@interface HelloWorldAppDelegate : NSObject &lt;UIApplicationDelegate&gt; {&lt;br /&gt;    UIWindow *window;&lt;br /&gt;    MyViewController *myViewController; // 追加したビューをインスタンス変数として定義します&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (nonatomic, retain) IBOutlet UIWindow *window;&lt;br /&gt;@property (nonatomic, retain) MyViewController *myViewController;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;HelloWorldAppDelegate.m&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;#import "HelloWorldAppDelegate.h"&lt;br /&gt;#import "MyViewController.h" // インポート宣言&lt;br /&gt;&lt;br /&gt;@implementation HelloWorldAppDelegate&lt;br /&gt;&lt;br /&gt;@synthesize window;&lt;br /&gt;// アクセサメソッドの合成？&lt;br /&gt;@synthesize myViewController;&lt;br /&gt;&lt;br /&gt;- (void)applicationDidFinishLaunching:(UIApplication *)application {    &lt;br /&gt; // ViewControllerの作成、ControllerView.nibをターゲットとします。bundleはresouceの位置的な情報？&lt;br /&gt; MyViewController *aViewController = [[MyViewController alloc]initWithNibName:@"ControllerView" bundle:[NSBundle mainBundle]];&lt;br /&gt; // デリゲータのmyViewControllerに上で作成したインスタンスを指定&lt;br /&gt; self.myViewController=aViewController;&lt;br /&gt; // 一時インスタンスの解放&lt;br /&gt; [aViewController release];&lt;br /&gt;    &lt;br /&gt; // myViewControllerからviewを取得&lt;br /&gt; UIView *controllersView=[myViewController view];&lt;br /&gt; // windowへControllerViewのviewを追加&lt;br /&gt; [window addSubview:controllersView];&lt;br /&gt; &lt;br /&gt; [window makeKeyAndVisible];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)dealloc {&lt;br /&gt;    [myViewController release]; // デリゲートが解放される時（アプリ終了時）にビューを一緒に解放します&lt;br /&gt;    [window release];&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ビューを作成します。&lt;br /&gt;InterfaceBuilderを起動して新規作成＞CocoaTouch＞Viewでビューが作成できます。&lt;br /&gt;ControllerView.nib としてHelloWorld プロジェクトに保存します。&lt;br /&gt;Xcodeが立ち上がっていれば、自動的にリソースとして取り込むか選択が出ます。&lt;br /&gt;リソースとして登録されたらResourcesフォルダに移動します。&lt;br /&gt;&lt;br /&gt;このViewがどのコントローラークラスに所属するかを指定します。&lt;br /&gt;Tools &gt; Identity Inspector を起動して、File's Ownerを選択＞ClassにMyViewControllerを指定します。&lt;br /&gt;File's Ownerにアウトレット（nibファイル内の項目に接続しているインスタンス変数）を設定します。&lt;br /&gt;File's OwnerをCtrlクリックしながらViewまでドラッグすればＯＫです。&lt;br /&gt;&lt;br /&gt;Tool &gt; Attribute Inspector から BackgroundColorを変更してシミュレーターで動かすと、このViewが正しく読み込まれているのがわかります。&lt;br /&gt;&lt;br /&gt;次はビューにオブジェクトを追加します。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-623348554877339850?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/623348554877339850/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=623348554877339850' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/623348554877339850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/623348554877339850'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/viewviewcontrollernib-viewcontroller.html' title='iPhoneで動かすHelloWorld その２'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8003881761022047013</id><published>2008-12-23T23:34:00.009+09:00</published><updated>2009-02-05T13:28:35.845+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>iPhoneで動かすHelloWorld その１</title><content type='html'>とりあえずHelloWorld的なものを作ってみよう！&lt;br /&gt;とはいってもDeveloperCenterのiPhoneアプリケーションチュートリアルを実行しながらメモるだけですが :)&lt;br /&gt;&lt;br /&gt;まずは最低限必要なCocoaのデザインパターンの説明をざっくりと&lt;br /&gt;&lt;br /&gt;・Delegation&lt;br /&gt;オブジェクトが、デリゲートとして指定された別のオブジェジェクトに定期的にメッセージを送信し、入力の要求やイベントの発生を通知するデザインパターン。&lt;br /&gt;このデザインパターンはクラス継承の代替手段として、再利用可能なオブジェクトの機能を拡張するために使用する。&lt;br /&gt;&lt;br /&gt;使用される場所：メイン処理の終了感知、ビューのセットアップ＆管理、テキストフィールドのReturnイベント処理等&lt;br /&gt;&lt;br /&gt;・Model-View-Controller&lt;br /&gt;いわゆるMVC。&lt;br /&gt;Model=データ、オブジェクト&lt;br /&gt;View=ユーザインターフェース部分&lt;br /&gt;Controller=ModelとViewを仲介する部分&lt;br /&gt;&lt;br /&gt;・Target-Action&lt;br /&gt;コントロールオブジェクトから、別のオブジェクトにメッセージの送信と、送信されたメッセージを受け取って処理する仕組み。&lt;br /&gt;&lt;br /&gt;使用される場所：ボタン押す＞Controllerへ指示&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次に、Xcodeを起動して新規プロジェクトの作成を選択。&lt;br /&gt;Windows-Based Applicationを選択。&lt;br /&gt;とりあえず「ビルドして進行」するとiPhoneシミュレーターが立ち上がって白い画面が出たらOK&lt;br /&gt;&lt;br /&gt;まずはどのようにアプリケーションが起動して画面が出て行くのかを追ってみよう！&lt;br /&gt;main.m をみるとUIApplicationMainを起動しているだけなのがわかりました。&lt;br /&gt;UIApplicationMainは info.plist 内の MainNibFile 値のインターフェースを起動します。&lt;br /&gt;デフォではMainWindowになっているので、MainWIndow.xibが読み込まれます。&lt;br /&gt;（前回はここの関連が？だった）&lt;br /&gt;&lt;br /&gt;MainWindowをダブルクリックするとインターフェースビルダーが起動します。&lt;br /&gt;そこに含まれる４つの項目は以下のような意味をもっています。&lt;br /&gt;・File'sOwner&lt;br /&gt;　UIApplicationのインスタンスです。&lt;br /&gt;・First Responder&lt;br /&gt;　イベント処理、今はまだ使用しません。&lt;br /&gt;・[アプリケーション名]AppDelegate&lt;br /&gt;　アプリケーションのデリゲートインスタンス&lt;br /&gt;・WIndow&lt;br /&gt;　実際の画面に表示されるウインド&lt;br /&gt;&lt;br /&gt;アプリケーションは起動が完了すると applicationDidFinishLaunching をデリゲートに送信します。&lt;br /&gt;デフォルトで作成されるこのメソッド処理を見てみます。&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;- (void)applicationDidFinishLaunching:(UIApplication *)application {    &lt;br /&gt;&lt;br /&gt;    // Override point for customization after application launch&lt;br /&gt;    [window makeKeyAndVisible];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;windowを定義してるだけですね。&lt;br /&gt;&lt;br /&gt;次回はここへ、デフォルト以外のViewを追加してみます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8003881761022047013?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8003881761022047013/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8003881761022047013' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8003881761022047013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8003881761022047013'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/iphonehelloworld.html' title='iPhoneで動かすHelloWorld その１'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-2470608833120281906</id><published>2008-12-21T22:54:00.003+09:00</published><updated>2008-12-21T23:36:53.734+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>Objective-Cにおけるメモリ管理なんて怖くない！その２</title><content type='html'>前回、retain , release と dealloc でインスタンスのメモリ管理をやりました。&lt;br /&gt;deallocで関連するインスタンスの解放をするのは良いとしても、 release 自体も忘れてしまったりする事があります。&lt;br /&gt;&lt;br /&gt;Objective-Cでは autorelease という仕組みがあるそうなのでそこを見ていきます。&lt;br /&gt;NSAutoreleasePool クラスを使って実現します。&lt;br /&gt;NSAutoreleasePool は、自動解放されるべきインスタンスを保持しておくクラスです。&lt;br /&gt;クラスが定義されると、 autorelease対象の広場（プール）が作成されます。&lt;br /&gt;広場が存在する状態で、他クラスのインスタンスに autorelease を送ると、そのインスタンスは広場にほうりこまれます。&lt;br /&gt;（広場に存在するだけで参照されているわけではないので、インスタンスのリファレンスカウンタは変わらない）&lt;br /&gt;&lt;br /&gt;広場の release を実行すると、広場に存在するインスタンスすべてに release が実行されます。&lt;br /&gt;&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;id pool=[[NSAutoreleasePool alloc] init]; // 広場の作成&lt;br /&gt;&lt;br /&gt;id foo=[[Foo alloc] init]; // Fooクラスのインスタンス作成。foo のリファレンスカウンタは１&lt;br /&gt;[foo autorelease]; // foo インスタンスを広場に登録する。リファレンスカウンタは１のまま&lt;br /&gt;&lt;br /&gt;[pool release]; // foo にもreleaseが実行される&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;NSAutoreleasePool は、複数存在してもよい。&lt;br /&gt;複数存在する場合に autorelease を実行した場合は、一番近い所で指定されたプールへほうりこまれる。&lt;br /&gt;基本は開始と終了でメインの pool を作り、内部でループなど一時的なインスタンスを作成する場所で子プールを作成する。&lt;br /&gt;&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;id mainPool=[[NSAutoreleasePool alloc] init];&lt;br /&gt;&lt;br /&gt;id hoge=[[Hoge alloc] init];&lt;br /&gt;[hoge autorelease]; // mainPool へ登録される&lt;br /&gt;&lt;br /&gt;while(条件) {&lt;br /&gt;  id subPool=[[NSAutoreleasePool alloc] init];&lt;br /&gt;&lt;br /&gt;  id foo=[[Foo alloc] init];&lt;br /&gt;  [foo autorelease]; // subPool へ登録される&lt;br /&gt;  &lt;br /&gt;  [subPool release];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[mainPool release];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;CocoaのGUIアプリケーションはNSApplicationがイベント発生時（マウスクリック等）に子プールを作成して、イベント終了時にreleaseしてくれるので、それほど気にしなくても自動でやってくれる。&lt;br /&gt;iPhoneSDKもそうなのかな？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・オーナーシップとメモリ管理&lt;br /&gt;init~~ で呼ばれるメソッドはオーナーシップが定義される。（メモリの管理をする必要がある）&lt;br /&gt;同等のメソッドで init がない場合は一時的なインスタンスとなり、 autorelease に登録される。&lt;br /&gt;&lt;br /&gt;例：文字列を扱うNSStringクラスの場合&lt;br /&gt;&lt;br /&gt;-(id)initWithUTF8String:(const char *)bytes&lt;br /&gt;+(id)stringWithUTF8String:(const char *)bytes&lt;br /&gt;&lt;br /&gt;どちらも文字列を保持するオブジェクトが作成されるが、initは生成したオブジェクトがオーナーとなり、&lt;br /&gt;stringはプールへ登録される（autoreleaseが実行される）&lt;br /&gt;&lt;br /&gt;オーナーシップを与えないコンストラクタをコンビニエンスコンストラクタと呼ぶ。&lt;br /&gt;&lt;br /&gt;・シングルトンの定義&lt;br /&gt;定数やシングルトンを作成する為には、retain,release,retainCountの機能を上書きする必要がある。&lt;br /&gt;retainとreleaseを何もしないメソッドにし、retainCountは常に UINT_MAX を返すようにする。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-2470608833120281906?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/2470608833120281906/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=2470608833120281906' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2470608833120281906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2470608833120281906'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/objective-c_21.html' title='Objective-Cにおけるメモリ管理なんて怖くない！その２'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-1580723908023536176</id><published>2008-12-20T22:03:00.004+09:00</published><updated>2008-12-20T23:02:18.873+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>Objective-Cにおけるメモリ管理なんて怖くない！</title><content type='html'>Object-C2.0でのメモリ管理には２種類の方法がある。&lt;br /&gt;&lt;br /&gt;・リファレンスカウンタ方式&lt;br /&gt;・ガーベジコレクション&lt;br /&gt;&lt;br /&gt;ガーベジコレクションは2.0から採用された自動メモリ管理の仕組みで、Javaのガーベジコレクションと同じ要領である。&lt;br /&gt;一定時間毎に不必要な（参照されていない）クラスを探しだし、解放していく。&lt;br /&gt;これは後にとっておくとして・・・&lt;br /&gt;&lt;br /&gt;まずはリファレンスカウンタ方式から詳しく見ていく。&lt;br /&gt;一言でいうと、クラスがいくつ参照されているかをカウンタで管理し、０になったらメモリを解放するという仕組みである。&lt;br /&gt;&lt;br /&gt;具体的には alloc init された時点で、インスタンスはカウンタを1とする。&lt;br /&gt;&lt;br /&gt;以下例：&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;id foo = [[Foo alloc] init];  // fooインスタンにカウント１が刻まれる&lt;br /&gt;[foo release]; // fooインスタンスのカウントは０となり、メモリがリリースされる&lt;br /&gt;&lt;br /&gt;id foo2 = [[Foo alloc] init]; // foo2インスタンスにカウント１が刻まれる&lt;br /&gt;id hoge = [[Hoge alloc] init];&lt;br /&gt;[hoge setFoo:[foo2 retain]]; // HogeインスタンスにはsetFooでfooを参照する機能がある。この時点でfoo2インスタンスにカウント２が刻まれる&lt;br /&gt;&lt;br /&gt;[foo2 release]; // foo2のカウントが１に減る&lt;br /&gt;[foo2 release]; // foo2のカウントが０となり、メモリがリリースされる&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;・retain メソッドでカウントを＋１する。このメソッドは自身を返す。&lt;br /&gt;・release メソッドでカウントを−１する。&lt;br /&gt;・現在のカウント数は retainCount メソッドで見る事が出来る。&lt;br /&gt;・dealloc でメモリをリリース出来るが、これはカウンタに関係なくリリースされてしまうので使うべきではない。&lt;br /&gt;&lt;br /&gt;でもいちいち手動でリリースしてたらきりがない！&lt;br /&gt;そこで dealloc をオーバーライドして、インスタンスが解放される時にインスタンスが保持するオブジェクトをリリースするのだ。&lt;br /&gt;&lt;br /&gt;以上をふまえて簡単なテストプログラム&lt;br /&gt;&lt;br /&gt;ReferenceCounterクラス&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;#import &lt;Cocoa/Cocoa.h&gt;&lt;br /&gt;&lt;br /&gt;@interface ReferenceCounter : NSObject {&lt;br /&gt; id obj;&lt;br /&gt;}&lt;br /&gt;-(void)setObj:(id)_obj;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@implementation ReferenceCounter&lt;br /&gt;-(void)setObj:(id)_obj {&lt;br /&gt; obj=[_obj retain]; // 何かオブジェクトがセットされる。ただ代入するのではなく、使用するよ！とカウンタを＋する。&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)dealloc {&lt;br /&gt; [obj release]; // 自身がリリースされるまえに、自分がもってるオブジェクトをリリースする。&lt;br /&gt; [super dealloc]; // 自身のリリース&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt; &lt;br /&gt; id foo=[[NSObject alloc] init];&lt;br /&gt; printf("retainCount: %d\n",[foo retainCount]);&lt;br /&gt;&lt;br /&gt; id rctest=[[ReferenceCounter alloc] init]; // テストクラスを作成&lt;br /&gt; [rctest setObj:foo]; // テストクラスになんかオブジェクトをセットする&lt;br /&gt; printf("retainCount: %d\n",[foo retainCount]);&lt;br /&gt;&lt;br /&gt; [foo release]; // オブジェクトをリリース&lt;br /&gt; printf("retainCount: %d\n",[foo retainCount]);&lt;br /&gt;&lt;br /&gt; [rctest release]; // テストクラスをリリース&lt;br /&gt; &lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;・foo インスタンスが alloc されて foo = 1 カウンタがつく&lt;br /&gt;・rctest インスタンスが alloc されて rctest = 1 カウンタがつく&lt;br /&gt;・rctest に foo をセットする。setter内で foo を retain するので foo=2 になる&lt;br /&gt;・foo インスタンスを release する。 foo=1 になる&lt;br /&gt;・rctest をリリースする。rctest=0になり、dealloc がよばれ rctest内のobj(foo)がreleaseされる。 foo=0になる&lt;br /&gt;&lt;br /&gt;出力は以下のような感じ&lt;br /&gt;retainCount: 1&lt;br /&gt;retainCount: 2&lt;br /&gt;retainCount: 1&lt;br /&gt;&lt;br /&gt;なるほど、オブジェクト思考っぽい。&lt;br /&gt;この考えは普通にJavaでも活かせる気がする！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-1580723908023536176?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/1580723908023536176/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=1580723908023536176' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1580723908023536176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/1580723908023536176'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/objective-c_20.html' title='Objective-Cにおけるメモリ管理なんて怖くない！'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-9114276486608487412</id><published>2008-12-18T23:03:00.002+09:00</published><updated>2008-12-19T00:02:10.439+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>不思議の国のアプリ（iPhone）</title><content type='html'>えー、メモリ管理をすっとばして、とりあえず今まで学んだ知識でiPhoneアプリのサンプルがどれぐらい理解できるか挑戦！&lt;br /&gt;&lt;br /&gt;XCODEの新規プロジェクトからNavigation-BasedApplicationを作成してみる。&lt;br /&gt;&lt;br /&gt;まずは main.m から&lt;br /&gt;&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;#import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {   &lt;br /&gt;    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;    int retVal = UIApplicationMain(argc, argv, nil, nil);&lt;br /&gt;    [pool release];&lt;br /&gt;    return retVal;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;あらスッキリ。&lt;br /&gt;NSAutoreleasePoolでメモリ管理をしつつ、UIApplicationMainってのを起動しているだけっぽい？&lt;br /&gt;ではUIApplicationMainを・・・って早速ここからどこにいってるのか・・・&lt;br /&gt;&lt;br /&gt;そんなわけでiPhoneDeveloperCenterのGettingStartedを一生懸命斜め読み&lt;br /&gt;どうやらUIApplicationMainからはMainWindow.xibが開かれるって事かな？&lt;br /&gt;xibを開くとインターフェースビルダーが立ち上がる、、、おお、なんかおもしろい&lt;br /&gt;して、このボタンのイベントなどはどこで設定するのやら・・・&lt;br /&gt;うーん何がなんだかサッパリ、、、日本語の情報がほしー&lt;br /&gt;DeveloperCenterの情報は豊富だけど、有料でもいいから日本語がほっすいよん&lt;br /&gt;とりあえず来月日本語本出るみたいだし読んでみようかなー&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-9114276486608487412?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/9114276486608487412/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=9114276486608487412' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/9114276486608487412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/9114276486608487412'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/iphone.html' title='不思議の国のアプリ（iPhone）'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-4235868193050714657</id><published>2008-12-18T11:05:00.003+09:00</published><updated>2008-12-18T11:39:04.698+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='confluence'/><title type='text'>覚えておくと便利なConfluenceのウラワザ</title><content type='html'>Confluenceの2.9.2を入れて数日、日本語で検索をした時にエラーが出ます。&lt;br /&gt;&lt;br /&gt;エラーメッセージを見ると StringIndexOutOfBounds エラーが出ているもよう。&lt;br /&gt;&lt;br /&gt;・英語での検索はエラーが出ない&lt;br /&gt;・前のバージョンと比べて、検索結果でハイライトされるようになった&lt;br /&gt;&lt;br /&gt;以上の結果から検索結果の文字をハイライトする時の文字数計算が２バイト考慮されてなくてエラーが出てるのではないかと推測&lt;br /&gt;&lt;br /&gt;まずは検索結果の decorators/components/search-results.vmd を見てみる&lt;br /&gt;該当部分は以下&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;&amp;lt;ul class="search-results"&amp;gt;&lt;br /&gt;        #foreach($searchResult in $results)&lt;br /&gt;        &amp;lt;li&amp;gt;&lt;br /&gt;                #searchResult($searchResult $showExcerpts $queryString)&lt;br /&gt;        &amp;lt;/li&amp;gt;&lt;br /&gt;        #end&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;searchResultを消してしまうと検索結果がでないので、この searchResultがどこにあるかを探っていくと、以下にたどりついた&lt;br /&gt;template/includes/macros.vm&lt;br /&gt;該当部分は以下&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;    #set ($summary = $generalUtil.makeSummary($contentBody, $queryString))&lt;br /&gt;#elseif ($searchResult.type == "attachment" &amp;&amp; $contentBody)&lt;br /&gt;    #set ($summary = $generalUtil.makeSummary($contentBody, $queryString))&lt;br /&gt;#elseif ($searchResult.type == "attachment" &amp;&amp; $searchResult.comment)&lt;br /&gt;    #set ($summary = $generalUtil.makeSummary($searchResult.comment, $queryString))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;GeneralUtilクラスのmakeSummaryがダメダメっぽい&lt;br /&gt;&lt;br /&gt;APIを見てみる &gt; http://docs.atlassian.com/com/atlassian/confluence/atlassian-confluence/latest/com/atlassian/confluence/util/GeneralUtil.html&lt;br /&gt;&lt;br /&gt;Summary型を返さないといけないので、ここをはぶいてしまうと検索は出来るけど、検索結果がページタイトルしかでなくなってしまう&lt;br /&gt;makeSummaryを見てみると、 content だけをうけとるのと、 contentとqueryを受け取るメソッドがあるのがわかる。&lt;br /&gt;queryのハイライトが問題なんで、contentだけを渡すメソッドに書き換えてみる。&lt;br /&gt;&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;    #set ($summary = $generalUtil.makeSummary($contentBody))&lt;br /&gt;#elseif ($searchResult.type == "attachment" &amp;&amp; $contentBody)&lt;br /&gt;    #set ($summary = $generalUtil.makeSummary($contentBody))&lt;br /&gt;#elseif ($searchResult.type == "attachment" &amp;&amp; $searchResult.comment)&lt;br /&gt;    #set ($summary = $generalUtil.makeSummary($searchResult.comment))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ここのテンプレートは再起動しないと反映されないので、confluenceを再起動。&lt;br /&gt;検索してみると、無事検索がとおり、検索結果にページタイトルと中身の一部が表示された！ :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-4235868193050714657?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/4235868193050714657/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=4235868193050714657' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4235868193050714657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/4235868193050714657'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/confluence_18.html' title='覚えておくと便利なConfluenceのウラワザ'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-245584792161308071</id><published>2008-12-17T22:21:00.003+09:00</published><updated>2008-12-17T23:35:50.593+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>いまさら聞けない「Objective-C」超入門 Objective-C その4</title><content type='html'>そんなこんなで第４回。&lt;br /&gt;&lt;br /&gt;動的結合ってなんじゃ？&lt;br /&gt;・存在しないメソッドを実行しようとしたコードを書いた場合に、コンパイル時にエラーが出ず、実際に実行したときにメソッドが実行出来るかを確認する方式を「動的結合」と呼ぶ&lt;br /&gt;・Javaは比較的静的結合、Groovyみたいにダイナミックに扱う場合は動的結合、という認識でいいのかな？&lt;br /&gt;&lt;br /&gt;Object は id として扱うとしてきたが、普通にクラス名で宣言してもよい&lt;br /&gt;&lt;br /&gt;Class Fooがあったとして&lt;br /&gt;id c;&lt;br /&gt;c=[Foo alloc];&lt;br /&gt;と&lt;br /&gt;Foo *c;&lt;br /&gt;c=[Foo alloc];&lt;br /&gt;どちらでもFooのインスタンスを作成出来る。&lt;br /&gt;&lt;br /&gt;クラス名をしておくと、不正なクラス利用をされていた場合にコンパイル時にチェックしてくれる。&lt;br /&gt;ダイナミックにクラスが変わる場合は id を使うって事ね！&lt;br /&gt;&lt;br /&gt;nilについて&lt;br /&gt;・nilはポインタが空の状態、NULLとは違う&lt;br /&gt;・Classのinitに失敗した場合等に nilとなる&lt;br /&gt;・JavaでNullになんかすると NullPointerException が出るが、 nil にメッセージを送ってもエラーにならない（ただしプログラム上ではわかりやすくする為に nil 判定を書いておく事は重要）&lt;br /&gt;&lt;br /&gt;インターフェース内のクラス指定について&lt;br /&gt;Objectの中に別のClassを持つ場合、 importして書く事も出来るが、通常は @class 宣言を使う。&lt;br /&gt;&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;@class Hoge;&lt;br /&gt;&lt;br /&gt;@interface Foo : NSObject {&lt;br /&gt;  Hoge *ho;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;HogeはClassだよと教えてやるわけです。ただし実装部では import する必要があります。&lt;br /&gt;&lt;br /&gt;変数hogeにgetter , setter を定義する場合&lt;br /&gt;-(int)hoge;&lt;br /&gt;-(void)setHoge:(int)value;&lt;br /&gt;getterにはgetを付けない！&lt;br /&gt;&lt;br /&gt;Class型って？&lt;br /&gt;・インスタンス化されたものじゃなくて、元となるクラス&lt;br /&gt;・NSObjectに用意された class を呼ぶと、そのクラスのClass型を取得できる&lt;br /&gt;これを使って動的にクラスを割り当てるサンプル！&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;Class theClass = flag ? [Foo class] : [Hoge class];&lt;br /&gt;id v = [theClass alloc];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;flagがtrueなら v はFooのインスタンスになり、falseなら v はHogeのインスタンスとなる。&lt;br /&gt;&lt;br /&gt;インスタンスのクラスが指定したクラスのインスタンスかをチェックするには isMemberOfClass を使う。&lt;br /&gt;BOOL isFoo = [v isMemberOfClass:[Foo class]];&lt;br /&gt;v がFooのインスタンスであれば isFoo は true となる。&lt;br /&gt;&lt;br /&gt;クラスメソッドとは？&lt;br /&gt;・Javaでいうところのstaticメソッド？&lt;br /&gt;・NSObjectには、class とか isMemberOfClass とか、alloc がクラスメソッドとして定義してあるため、上記のように使える&lt;br /&gt;・自分でクラスメソッドを定義するには、今まで - と書いてた所を + と書く&lt;br /&gt;例：allocの定義&lt;br /&gt;+(id)alloc;&lt;br /&gt;&lt;br /&gt;クラス内から、自分のクラスメソッドを呼ぶとき等は、&lt;br /&gt;[[Foo alloc] say];&lt;br /&gt;と書いてしまうと、Fooを継承したクラスで不都合が起きてしまうので&lt;br /&gt;[[[self class] alloc] say];&lt;br /&gt;とすれば、必ず呼ばれた時のクラスのクラスメソッドを呼ぶ事が出来る。&lt;br /&gt;&lt;br /&gt;今日はこの辺りで・・・、次回はやっとメモリ関係&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-245584792161308071?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/245584792161308071/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=245584792161308071' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/245584792161308071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/245584792161308071'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/objective-c-objective-c-4.html' title='いまさら聞けない「Objective-C」超入門 Objective-C その4'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-8667713812883843177</id><published>2008-12-16T23:31:00.004+09:00</published><updated>2008-12-17T00:36:33.686+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>いまさら聞けない「Objective-C」超入門 Objective-C その3</title><content type='html'>そんなこんなで継承について&lt;br /&gt;&lt;br /&gt;スーパークラスとかサブクラスとか継承の考え方はJavaとまったく一緒、省略&lt;br /&gt;Cocoa環境では基本的にNSObjectというのがルートクラスとなる。JavaでいうObject的なものっぽい。&lt;br /&gt;C＋＋にはこういったすべてのベースとなるルートクラスがないらしい（！）&lt;br /&gt;&lt;br /&gt;では実際に以下のような継承クラスを作成してみる&lt;br /&gt;Parent = ルートクラス callNumber(int) で value に値をセットし、受け取った値を返す&lt;br /&gt;Child = Parentのサブクラス、callNumber(int) をオーバーライドし、 受け取った2倍の値を返す&lt;br /&gt;Grandchild = Childのサブクラス、callNumberでセットされた value の3倍の値を返す anotherNumber メソッドを追加&lt;br /&gt;&lt;br /&gt;Parent.h&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;#import &lt;Cocoa/Cocoa.h&gt;&lt;br /&gt;&lt;br /&gt;@interface Parent : NSDocument {&lt;br /&gt; int value;&lt;br /&gt;}&lt;br /&gt;- (int)callNumber:(int)num;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Parent.m&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;#import "Parent.h"&lt;br /&gt;&lt;br /&gt;@implementation Parent&lt;br /&gt;- (int)callNumber:(int)num {&lt;br /&gt; value=num;&lt;br /&gt; return num;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Child.h&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;#import &lt;Cocoa/Cocoa.h&gt;&lt;br /&gt;#import "Parent.h"&lt;br /&gt;&lt;br /&gt;@interface Child : Parent {&lt;br /&gt;}&lt;br /&gt;-(int)callNumber:(int)num;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Child.m&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;#import "Child.h"&lt;br /&gt;&lt;br /&gt;@implementation Child&lt;br /&gt;-(int)callNumber:(int)num {&lt;br /&gt; value=num;&lt;br /&gt; return num * 2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Grandchild.h&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;#import &lt;Cocoa/Cocoa.h&gt;&lt;br /&gt;#import "Child.h"&lt;br /&gt;&lt;br /&gt;@interface Grandchild : Child {&lt;br /&gt;}&lt;br /&gt;-(int)anotherNumber;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Grandchild.m&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;#import "Grandchild.h"&lt;br /&gt;&lt;br /&gt;@implementation Grandchild&lt;br /&gt;-(int)anotherNumber{&lt;br /&gt; return value * 3;&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;そしてこれらを実行して結果を出力する main.m&lt;br /&gt;せっかくなんで入力された文字のキーコードを出力する q で終了&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;&lt;br /&gt;#import &lt;Cocoa/Cocoa.h&gt;&lt;br /&gt;#import "Parent.h"&lt;br /&gt;#import "Child.h"&lt;br /&gt;#import "Grandchild.h"&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt; id p,c,g;&lt;br /&gt; char buf[8];&lt;br /&gt;&lt;br /&gt; p=[Parent alloc];&lt;br /&gt; c=[Child alloc];&lt;br /&gt; g=[Grandchild alloc];&lt;br /&gt; &lt;br /&gt; while(scanf("%s",buf) &gt; 0) {&lt;br /&gt;  switch(buf[0]) {&lt;br /&gt;   case 'q':return 0; break;&lt;br /&gt;   default:&lt;br /&gt;   printf("parent class &gt;&gt; %d\n",[p callNumber:buf[0]]);&lt;br /&gt;   printf("child class &gt;&gt; %d\n",[c callNumber:buf[0]]);&lt;br /&gt;   [g callNumber:buf[0]];&lt;br /&gt;   printf("grandchild class &gt;&gt; %d\n",[g anotherNumber]);&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;今日のポイント&lt;br /&gt;Javaと違う所！&lt;br /&gt;interfaceはクラスには必ず存在し、Javaのように同じインターフェースを持った別のクラスみたいな考えではない&lt;br /&gt;同じような事をやる場合はインターフェース用のクラスを作成する、もちろんクラスだからインターフェースもいる&lt;br /&gt;インターフェース用クラスのインターフェースとかどんだけ〜&lt;br /&gt;&lt;br /&gt;なんで import は h ファイルだけでいいのか、昨日の謎がとけた！&lt;br /&gt;早くぐりぐり動かしたいな〜&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-8667713812883843177?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/8667713812883843177/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=8667713812883843177' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8667713812883843177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/8667713812883843177'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/objective-c-objective-c-3.html' title='いまさら聞けない「Objective-C」超入門 Objective-C その3'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3580546174684409981</id><published>2008-12-15T23:59:00.007+09:00</published><updated>2008-12-16T00:29:14.648+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>いまさら聞けない「Objective-C」超入門 Objective-C その2</title><content type='html'>とりあえず前回動かしたクラスを別々のファイルにする。&lt;br /&gt;&lt;br /&gt;インターフェース部を クラス名.h でヘッダファイルとして、実装クラスを クラス名.m とするのが一般的らしい。&lt;br /&gt;クラス名.m には クラス名.h を import する。&lt;br /&gt;別の実装を各場合も クラス名.h を import すればおk。&lt;br /&gt;&lt;br /&gt;main.h 内は main だけ残して、Helloクラスを別ファイルにする&lt;br /&gt;main から import するのは クラス名.h だけでおk。何でだろう？同クラス名をデフォの実装として読み込んでくれる？&lt;br /&gt;&lt;br /&gt;Hello.h&lt;br /&gt;&lt;pre id="code" style="code"&gt;&lt;br /&gt;&lt;br /&gt;#import &lt;Foundation/NSObject.h&gt;&lt;br /&gt;&lt;br /&gt;@interface Hello : NSDocument {&lt;br /&gt; int val;&lt;br /&gt; int min,max,step;&lt;br /&gt;}&lt;br /&gt;- (id)initWithMin:(int)a max:(int)b step:(int)s;&lt;br /&gt;- (int)value;&lt;br /&gt;- (id)up;&lt;br /&gt;- (id)down;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hello.m&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;&lt;br /&gt;#import "Hello.h"&lt;br /&gt;&lt;br /&gt;@implementation Hello&lt;br /&gt;- (id)initWithMin:(int)a max:(int)b step:(int)s {&lt;br /&gt; self=[super init]; // NSObjectの初期化を呼ぶ&lt;br /&gt; if(self!=nil) { // nilはnullみたいなもん？ init が成功していたら&lt;br /&gt;  val=min=a;&lt;br /&gt;  max=b;&lt;br /&gt;  step=s;&lt;br /&gt; }&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (int)value {&lt;br /&gt; return val;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (id)up {&lt;br /&gt; if((val += step) &gt; max) val=max;&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (id)down {&lt;br /&gt; if((val -= step) &lt; min) val=min;&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;main.m&lt;br /&gt;&lt;pre id="code"&gt;&lt;br /&gt;&lt;br /&gt;#import &lt;Cocoa/Cocoa.h&gt;&lt;br /&gt;#import "Hello.h"&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt; id v,w;&lt;br /&gt; &lt;br /&gt; v=[[Hello alloc] initWithMin:0 max:10 step:2];&lt;br /&gt; w=[[Hello alloc] initWithMin:0 max:9 step:3];&lt;br /&gt; [v up];&lt;br /&gt; printf("%d %d\n",[v value], [w value]);&lt;br /&gt; [v up];&lt;br /&gt; [w up];&lt;br /&gt; printf("%d %d\n",[v value], [w value]);&lt;br /&gt; &lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Objective-CだからといってすべてをObject指向で作る必要はない&lt;br /&gt;Object型より関数型の方が軽いため、あきらかな重い処理は関数型で作成した方が良い&lt;br /&gt;関数定義のみを含むソースは .c ファイルとして扱う&lt;br /&gt;ただしオブジェクトを引数や返り値としたり、メソッド呼び出しなどをする場合は .m とする&lt;br /&gt;&lt;br /&gt;#import は複数のクラスを読み込んだ場合、かぶるヘッダファイルを読み込まない&lt;br /&gt;#include は読み込む。（通常はヘッダファイル内で２度読み込まないように定義しておく）&lt;br /&gt;２度読み込みたい事情が無い限り #import でおk&lt;br /&gt;&lt;br /&gt;今日はここまで！次回はクラス継承&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3580546174684409981?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3580546174684409981/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3580546174684409981' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3580546174684409981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3580546174684409981'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/objective-c-objective-c-2.html' title='いまさら聞けない「Objective-C」超入門 Objective-C その2'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-2712065791454073612</id><published>2008-12-14T22:37:00.003+09:00</published><updated>2008-12-15T00:41:00.417+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective-C'/><title type='text'>いまさら聞けない「Objective-C」超入門</title><content type='html'>というわけでObjective-Cはじめます。初心忘れるべからず。&lt;br /&gt;&lt;br /&gt;・はじめに　Objective-Cとはなんじゃらほい&lt;br /&gt;　C言語にオブジェクト指向の機能を追加した言語&lt;br /&gt;　MacOSX上で動作する言語、それ以外ではあまり使われない。iPhoneのアプリもObjective-Cで作成する　。&lt;br /&gt;　C＋＋もCにオブジェクト指向を追加した言語だが、Objective-Cとは別路線で互換性は無い&lt;br /&gt;　Objective-Cの特徴としては、際立って柔軟性が高く、効率的なコードを書く事が出来るらしい&lt;br /&gt;　Leopardの登場とあわせてObjective-C2.0（ガベージコレクション、宣言プロパティ、高速列挙を追加）が公開＆実装された&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;なんとなく概要がわかった所でまずは触ってみよう&lt;br /&gt;&lt;br /&gt;//オブジェクトは id という特殊な型&lt;br /&gt;id obj&lt;br /&gt;&lt;br /&gt;//オブジェクトにメッセージを送る（オブジェクトのメソッドを実行する？） &lt;br /&gt;//この形をメッセージ式と呼ぶ。&lt;br /&gt;[obj msg]&lt;br /&gt;&lt;br /&gt;//objのmsgを呼び出した結果が戻り値となる&lt;br /&gt;//以下のように、戻り値を使って別のメッセージを呼ぶ事も出来る&lt;br /&gt;[[obj msg] msg2];&lt;br /&gt;[[[obj msg] msg2] msg3];&lt;br /&gt;&lt;br /&gt;// [] は配列としても使う、左側にあるもので自動的に判別される&lt;br /&gt;array=[1,2,3]; // 配列の定義&lt;br /&gt;el=test[[obj msg]]; // test配列の添字として [obj msg] の返り値を使う&lt;br /&gt;&lt;br /&gt;//メッセージに引数が必要な場合はコロンを付ける&lt;br /&gt;[obj msg:'yossy']&lt;br /&gt;&lt;br /&gt;//メソッド一覧はメッセージセレクタと呼ばれる&lt;br /&gt;//コロンの有無でも別のセレクタとして認識される&lt;br /&gt;//コロンが引数的なキーワード&lt;br /&gt;copy&lt;br /&gt;copy:&lt;br /&gt;delete&lt;br /&gt;allDelete&lt;br /&gt;create&lt;br /&gt;findBookName:Author:&lt;br /&gt;&lt;br /&gt;//クラスのインスタンス化&lt;br /&gt;[クラス名 alloc]&lt;br /&gt;&lt;br /&gt;//通常はinitするべし&lt;br /&gt;//initがデフォ、initからはじまるメソッドでも良い&lt;br /&gt;[[クラス名 alloc] init]&lt;br /&gt;&lt;br /&gt;//インターフェースの作成&lt;br /&gt;@interface Hello:NSObject&lt;br /&gt;{&lt;br /&gt;  //インスタンス変数の宣言&lt;br /&gt;}&lt;br /&gt;// メソッドの宣言&lt;br /&gt;- (id)delegate;&lt;br /&gt;- (id)cellAtRow:(int)row column:(int)col;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;// this は self と表現される&lt;br /&gt;//文字列を扱うのはちょっと面倒？&lt;br /&gt;//とりあえず入門書に従って数値をいじるクラスが出来た・・・今日はタイムアップなり&lt;br /&gt;// XCodeで新規Cocoaアプリケーション、mainに全部かきかき&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border:1px solid #333"&gt;&lt;br /&gt;#import &lt;Cocoa/Cocoa.h&gt;&lt;br /&gt;&lt;br /&gt;@interface Hello : NSDocument {&lt;br /&gt; int val;&lt;br /&gt; int min,max,step;&lt;br /&gt;}&lt;br /&gt;- (id)initWithMin:(int)a max:(int)b step:(int)s;&lt;br /&gt;- (int)value;&lt;br /&gt;- (id)up;&lt;br /&gt;- (id)down;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;@implementation Hello&lt;br /&gt;- (id)initWithMin:(int)a max:(int)b step:(int)s {&lt;br /&gt; self=[super init]; // NSObjectの初期化を呼ぶ&lt;br /&gt; if(self!=nil) { // nilはnullみたいなもん？ init が成功していたら&lt;br /&gt;  val=min=a;&lt;br /&gt;  max=b;&lt;br /&gt;  step=s;&lt;br /&gt; }&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (int)value {&lt;br /&gt; return val;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (id)up {&lt;br /&gt; if((val += step) &gt; max) val=max;&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (id)down {&lt;br /&gt; if((val -= step) &lt; min) val=min;&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;//int main(int argc, char *argv[])&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt; id v,w;&lt;br /&gt; &lt;br /&gt; v=[[Hello alloc] initWithMin:0 max:10 step:2];&lt;br /&gt; w=[[Hello alloc] initWithMin:0 max:9 step:3];&lt;br /&gt; [v up];&lt;br /&gt; printf("%d %d\n",[v value], [w value]);&lt;br /&gt; [v up];&lt;br /&gt; [w up];&lt;br /&gt; printf("%d %d\n",[v value], [w value]);&lt;br /&gt; &lt;br /&gt;//    return NSApplicationMain(argc,  (const char **) argv);&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-2712065791454073612?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/2712065791454073612/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=2712065791454073612' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2712065791454073612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/2712065791454073612'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/objective-c.html' title='いまさら聞けない「Objective-C」超入門'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3293780815340488392</id><published>2008-12-10T14:43:00.003+09:00</published><updated>2008-12-10T15:00:26.168+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='confluence'/><title type='text'>報道されないConfluenceの裏側</title><content type='html'>Confluenceの移行をしていてハマったのでめもめも&lt;br /&gt;&lt;br /&gt;・Confluenceはメジャーバージョンが変わると復元が出来ない&lt;br /&gt;・フルバックアップが２GBを超える場合は処理出来ない（おいおい）&lt;br /&gt;&lt;br /&gt;さて困った&lt;br /&gt;&lt;br /&gt;とりえあずスペースでバックアップして復元してみると、メジャーバージョンが違うからだめだよ。と・・・&lt;br /&gt;バックアップファイルを解凍して中を覗いてみると、exportDescriptor.properties の buildNumber というそれっぽいものを発見&lt;br /&gt;とりあえずこれを新しいバージョンのbuildNumberにかえてインポートしてみる・・・できた！ :D&lt;br /&gt;&lt;br /&gt;ユーザとかはDBから直接もってきたりしたけどNGだった :(&lt;br /&gt;同じユーザIDでユーザを作ってやると履歴とかはちゃんと表示されたので、ちょっと安心&lt;br /&gt;&lt;br /&gt;しかし無理矢理感がいなめない・・・なんか正しい移行方法があるのかぁ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3293780815340488392?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3293780815340488392/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3293780815340488392' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3293780815340488392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3293780815340488392'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/confluence.html' title='報道されないConfluenceの裏側'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7334828829563331660.post-3654373047364308019</id><published>2008-12-10T11:37:00.003+09:00</published><updated>2008-12-10T11:44:31.078+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>人生に役立つかもしれないpostgresについての知識</title><content type='html'>今日もまたよくやるけど、よく忘れるメモ&lt;br /&gt;&lt;br /&gt;postgresで外部から接続出来るようにする（ローカル内のpgAdminとかからサックリ操作出来るようにする）&lt;br /&gt;&lt;br /&gt;pg_hba.conf でアクセス制限をつける。&lt;br /&gt;下の方にある行を書き換える&lt;br /&gt;&lt;br /&gt;サンプル&lt;br /&gt;&lt;br /&gt;&lt;pre style="border:1px solid #333"&gt;&lt;br /&gt;# "local" is for Unix domain socket connections only&lt;br /&gt;local   all         all                               trust&lt;br /&gt;# IPv4 local connections:&lt;br /&gt;host    all         all         127.0.0.1/32          trust&lt;br /&gt;host    all         all         192.168.0.0 255.255.255.0 trust&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;日本語訳：とりあえず 192.168.0 シリーズからと、ローカルからなんでもばっちこいやー&lt;br /&gt;&lt;br /&gt;postgresql.conf の設定&lt;br /&gt;&lt;br /&gt;&lt;pre style="border:1px solid #333"&gt;&lt;br /&gt;#---------------------------------------------------------------------------&lt;br /&gt;# CONNECTIONS AND AUTHENTICATION&lt;br /&gt;#---------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;# - Connection Settings -&lt;br /&gt;&lt;br /&gt;listen_addresses = '*'          # what IP address(es) to listen on; &lt;br /&gt;                                        # comma-separated list of addresses;&lt;br /&gt;                                        # defaults to 'localhost', '*' = all&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;の部分の listen_addresses がデフォだと localhost になるんで、ここのコメントアウトをはずし、 * （すべて許可）にする&lt;br /&gt;&lt;br /&gt;で、postgresを再起動してやればOK&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7334828829563331660-3654373047364308019?l=ponytailthes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ponytailthes.blogspot.com/feeds/3654373047364308019/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7334828829563331660&amp;postID=3654373047364308019' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3654373047364308019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7334828829563331660/posts/default/3654373047364308019'/><link rel='alternate' type='text/html' href='http://ponytailthes.blogspot.com/2008/12/postgres.html' title='人生に役立つかもしれないpostgresについての知識'/><author><name>Ponytail.The.S</name><uri>http://www.blogger.com/profile/05418275995811639845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
