2011.11.14My365は、まずiPhoneアプリとしてリリースすることにしました。iPhoneアプリをリリースしたのはこれが初めてで、勉強しながらの開発となりました。(iPhoneアプリ開発自体では、ヒマボタンという素晴らしいアプリの開発経験があるのですが、このアプリは残念ながら僕のiPodにしか入っていません。「よくわかるiPhoneアプリ開発の教科書」は、Objective-Cの言語体系についてはほとんど触れられていませんが、Xcodeの使い方であるとか、iOSのフレームワークの使い方であるとかが、とても丁寧に説明されていて分かりやすい本です。4〜5時間くらいで読み終わります。この本だけでとりあえずアプリが作れる風になれることは間違いないです。OSも含めたObjective-C開発全般を対象として、Objective-Cの体系をとても詳しく書いてあります。「よくわかるiPhoneアプリ開発の教科書」では言語体系の部分が不足なので、こちらの本で補います。補うというと失礼なくらい詳しく書いてあります。OSも対象にしているので、全てのプログラムがiPhoneでも動くとは限らないということです。OS限定の場合があります。プログラムの動かし方My365は、ブラウザアプリとほとんど同じような感じで、サーバとHTTPで通信しています。iPhoneのビューが開くタイミングなどで、サーバにHTTPリクエストを送ると、JSON形式でデータが返ってくるので、それを展開して画面を表示していきます。ASIHTTPRequestHTTPで通信をするときに、同期通信と非同期通信の2種が選択できます。同期通信はプログラムが1本道になるので非常に楽なのですが、通信中に画面の操作ができなくなってしまうのがストレスになります。一方の非同期通信は、通信中にも操作ができるので通信を途中でキャンセルできますし、通信中に他の画面を見たりすることができます。その分プログラムは複雑になりがちです。ユーザビリティを考えて、同期でなければならない一部以外は全て非同期の通信で実装しました。実装の面倒くささを緩和するために、ASIHTTPRequestというライブラリを利用しました。failed:(SEL)failed;更にそれをラップするメソッドを作って、通信が成功した時と、失敗した時で処理を分けています。json-frameworkレスポンスはJSONでただのNSStringの状態なので、NSDictionaryなどに展開して使います。この時には、json-frameworkを利用しています。JSONValue];ご覧のとおり、使うのは非常に簡単です。レスポンスの内容iPhoneアプリはユーザーがアップデートをしてくれなければクライアント側が変えられないというのが、最も頭を悩ませるところです。サーバ側をアップデートしたらクライアント側が動かなくなったということにならないように、できるだけ拡張性の高い形式で返したい。いうことで、結局次のような形になりました。"notification":null}開発当初は、配列が返ったり連想配列が返ったりバラバラだったのですが、最終的には全て連想配列で返すようにしました。配列で返してしまうと追加で情報が必要になった時に追加できないためです。連想配列であれば、新しいキーを追加しても、古いバージョンではそのキーが無視されるだけです。順番が前後しますが、リクエストの内容には必ずふたつの情報を含めることにしました。バージョン1つ目はアプリのバージョンです。アップデートの際に大幅な変更が不可欠な場合が出るかもしれません。アプリがどのバージョンであるかが分かれば、それに応じて旧バージョンのレスポンスを変えずに、新バージョンのための新しいレスポンスを返すことができます。objectForKey:@"CFBundleVersion"];言語もう1つは、アプリを使用している言語です。上のレスポンスの内容を見ると、エラーが発生した時にはエラーメッセージを返すようになっています。My365は世界中で広く使われるようにしたかったので、徹底的に多言語化しようと思っていました。いうわけで、エラーメッセージが「誰に対しても英語」というのは避けたいところでした。エラーコードだけ取得してアプリ側でメッセージを生成することもできますが、機能追加で新しいエラーが生じる可能性が生まれた時に対応できません。そこで、アプリで使用している言語をサーバに送信して、その言語に応じてサーバ側からエラーメッセージを返すことにしました。言語の取得方法は、いまいちスマートじゃないですが、localizable.stringsの中にLanguageという項を作って、英語には”en”を、日本語には”ja”を指定しています。あとはこれをNSLocalizedStringで取得すれば使用している言語が分かります。nil);写真フィルタ写真フィルタのあたりはかなり時間をかけた部分です。各フィルタが写真に対してどのような処理を施すかという情報は、初期状態ではアプリ内に持っておらず、サーバ側で管理しています。これによって、リリース後にフィルタの微調整が可能だったり、フィルタの追加が可能になっています。いう機構にしたために、処理の内容を絞り込まざるを得なくなりましたが、以下のような機能の組み合わせでフィルタを実現しています。RGBカラーフィルタピクセルごとに色を変換していくフィルタです。今現在は、これがフィルタの機能の9割を担っています。(BB曲線)B色の入力を横軸、出力を縦軸にとって考えいます。色の値は8bitで0〜255です。色を変化させない場合は、(0,0)から(255,255)までの直線です。色を明るくする場合はこの直線を上に凸になるように歪ませます。色を暗くする場合は逆です。曲線によって、コントラストを上げたり下げたりもできます。いう曲線を9種類、3×3行列のような形で作っておけば、非常に多様なカラーフィルタが表現できます。ぼかしフィルタぼかしは、あるピクセルの付近の色の平均をとるだけです。どのくらいの範囲の平均をとるかだけを指定できるようにしています。ぼかしをかけるのは、iPhoneのパワーではそれなりに時間がかかります。ピクセルごとに周囲の平均をとるということで想像できると思いますが。}}My365の写真は600×600のサイズなので、周囲5×5の画素で平均を取っていくとすると、足し算処理は27,000,000回必要です。実際にやってみると、5秒以上かかりました。参考に計算回数の少ない方法を採用しました。こちらで紹介されているのは、簡単にいえば、「ある画素でぼかしが計算できていれば、その隣はそれを元に計算できますよ」という方法です。touchでも1秒程度で計算できるようになりました。(でもまだ遅い・・・)テクスチャこれは単に上から画像を重ねるだけです。フレームやキラキラした効果を重ねたい場合に使うつもりで実装しましたが、今のフィルタでは使われていません。フィルタを追加できるようになっているので、これから活用されるはずです。マスクこれらの3種類は写真全体にのっぺりと効果を与えるので、選択的に効果を与えられるようにもしています。周辺のみに値をもたせたマスクと、ぼかしを組み合わせることで、「周辺だけぼかす」などができるようになっています。ブレンド更にテクスチャなどもただ上から重ねるだけではなく、加算、乗算、スクリーン、焼きこみなど、色々なブレンドができるようにしています。フィルタ情報の同期フィルタ情報は起動時と「フィルタを獲得しました」というプッシュ通知をトリガーにしてサーバと同期するようになっています。フィルタ情報自体も連想配列になっていて、これはダウンロードしたらiPhone内に保存するようにしていますので電波のないところでも写真を加工できます。(もっとも電波がないと加工した写真をアップロードできませんが・・・)テクスチャやマスクの画像も同様にフィルタを同期する際にダウンロードして保存しています。アニメーションiOSのフレームワークは簡単にアニメーションが作れるようになっています。したアニメを入れるだけで気持ち良くなるので使わない手はないです。個人的に好きなのが、フィルタを選択する部分が下からニョキッと出てくる動きです。filterViewの中に要素を配置しておいて、画面のすぐ真下にはみ出すように移動させて、アニメで画面上に移動させるだけです。rect;}];読み込み中にピンが右下でくるくると回りますが、あれはanimateWithDurationではなく、UIImageViewを使っています。こちらはパラパラ漫画です。デザイナーの@t_ishiyamaが凝ったことしていて、animateWithDurationでは表現できない微妙な表現をしています。release];このようにアニメを作るにはこの2つの方法がありますが、アニメを作る手間と、データ容量と、その効果を比較してお得な方を使いたいものです。おわりにちょっと凝ったことしてる部分を紹介しようと思ってソースコード見ながら書き始めましたが、全然大したことしてませんでした。最近やっとスラスラとObjective-Cが書けるようになってきたくらいのレベルで、勉強とか言語的な試行錯誤に使っていた時間の方が長い印象です・・・。〜サーバ編〜関連記事WEB開発My365ができるまで技術的な話はできるだけ抜きでいきます。このアプリをリリースするまでのチームは4人で、企画・企画・デザイン・開発という分担をしていて、僕は開発の担当です。技術的な話はまた後回しにします。今年のゴールデ...iPhoneアプリiOS向けのユニバーサルでスタティックなframeworkを作るiOS向けのライブラリを提供するのに、framework形式にすると便利です。以前に、iOS向けのframeworkのためのテンプレートについて書きました。〜サーバサイドプログラム編〜My365のサーバサイドのプログラムはPHPで書きました。IndexingがiOSでも利用できるようになったというアナウンスがありました。技術検証をしていたら1...ビジネスプログラマが考える劇的に効率が上がるExcelシートの作り方そこそこの複雑な計算をするのにExcelはものすごく便利です。何かのプログラミング言語を使って書いたら1時間くらいかかるような計算が、ものの数分でシート上にできあがります。超概要!導入からiOS/Android向けビルドまで。最近ぐいぐいきているCocos2d-xについて調べました。Cocos2d-xは、マルチプラットフォームの2Dゲームフレームワークです。マルチプラットフォームのゲームフレームワークというとUnityも有名ですが、最近の感覚値では、2Dゲー...APNSiOS7でプッシュ通知のデバイストークンに大きな変更iOS7でプッシュ通知にもいくつかの機能追加が加えられていますが、おそらくドキュメントに書かれていないことで、場合によっては問題が生じるかもしれない変更が加えられているようです。価格をこれまでの2倍にしても大丈夫なブランドの作り方。小さな会社のためのブランドの作り方。価格をこれまでの2倍する方法を考える。この本で響いたのは、「価格を2倍にしても大丈夫にする方法を考える」というもの。安易な安売り戦略に走ると、価格競争...未分類iPhoneのプッシュ通知(APNS)の証明書の作り方Objective-Cでプッシュ通知をするためには、Appleへの接続に証明書が必要ですが、その証明書の作成手順は結構大変なので、一つ一つスクリーンショットと一緒に追っていきます。現在、My365のAndroid版を開発中です。Android版は、Webビューをうまく利用して、開発時間の短縮と、繊細なレイアウトを狙っています。19:11共有ありがとうございます!以下3点質問があります。iPhoneアプリは何本かリリースしてるのでばりばり技術の話をしていただいてかまいません。面倒かもしれませんが、お答えいただけると幸いです。1:横画面で撮影した画像を600×600で保存する際にどのような画像処理を行っていますか?2:フィードで写真をクリックすると下に伸びたり縮んだりすると思うのですがこれはどのようなアルゴリズムですか?UIImageにtouchDelegate的なのを付けて処理を行っているのでしょうか?3:初期起動時の動画は何を使って再生していますか?一般的に用いられてるやつだと画面をタッチした際に左上に青いボタンでDoneとか出てきたと思うのですが出てきた記憶がないので、どうやっているのかなと。以上、よろしくお願いします。取得した画像から、カメラビューの窓に当たる部分を切り出しているだけです。カメラビューの窓の座標はデバイスの方向に依存するので、それだけ考慮しています。時間ある時にもっと綺麗なアニメーションを入れたいと思っています・・・。controlStyleをMPMovieControlStyleNoneにして、viewを必要なところに貼りつけているだけです。参考にしたような記憶があります。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。ホームWEB開発アプリ開発iPhoneアプリkatty0324経営半分、エンジニアリング半分でやってます。ECSのサービスを複数のロードバランサに追加する2022.01.10Railsプロジェクトにfactory_botの導入2021.12.26ビジネス文書は、読まないで済むほうがいい2021.09.26人気記事mkdirでディレクトリが存在しない時だけディレクトリを作成する。InnoDBの行ロックとテーブルロックの挙動2013.07.122021.02.18Tomcatのログをローテートさせて一定期間で削除する。2014.07.042021.03.07Linuxで共有ライブラリsoを作ったり使ったりする方法。2013.10.242021.02.11UUIDはなぜ、分散環境で好き勝手に生成しても衝突しないのか。RFC4122規格とUUIDの性質。2014.03.282021.02.188年乗ったクロスバイクのボロボロになったパーツをまとめて交換した。2016.11.282021.03.07PHPでnullとfalseと空文字と0は同じ?2011.03.262021.03.07階層化されたデータをHTTPのGETリクエストのパラメータに含める方法。2013.07.27IP制限されているWEBサイトをSSH経由でブラウザに表示する。2014.03.142021.02.11自作ツールテキスト一括変換ツールブラウザ上でリアルタイムにテキストの変換ができるツールです。日記その他ホーム検索トップサイドバーkatty0324経営半分、エンジニアリング半分でやってます。ECSのサービスを複数のロードバランサに追加する2022.01.10Railsプロジェクトにfactory_botの導入2021.12.26ビジネス文書は、読まないで済むほうがいい2021.09.26人気記事mkdirでディレクトリが存在しない時だけディレクトリを作成する。InnoDBの行ロックとテーブルロックの挙動2013.07.122021.02.18Tomcatのログをローテートさせて一定期間で削除する。2014.07.042021.03.07Linuxで共有ライブラリsoを作ったり使ったりする方法。2013.10.242021.02.11UUIDはなぜ、分散環境で好き勝手に生成しても衝突しないのか。RFC4122規格とUUIDの性質。2014.03.282021.02.188年乗ったクロスバイクのボロボロになったパーツをまとめて交換した。2016.11.282021.03.07PHPでnullとfalseと空文字と0は同じ?2011.03.262021.03.07階層化されたデータをHTTPのGETリクエストのパラメータに含める方法。2013.07.27IP制限されているWEBサイトをSSH経由でブラウザに表示する。2014.03.142021.02.11自作ツールテキスト一括変換ツールブラウザ上でリアルタイムにテキストの変換ができるツールです。Handlebars.js2タイトルとURLをコピーしました。