2012年4月23日月曜日

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会に参加したよ

参加というか、正確にはチューターとしてひーこら言いながら働いていました。
イベントはこちらで告知されていたものです。

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会[女性枠] #andiphone #andronjo

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会[男性枠] #andiphone


講師:@corosuke_kさん
講師の模様をメモを取る係:@muo_jpさん
愉快な仲間1号:@yoichinejiさん
愉快な仲間2号:@corruptexさん
愉快な仲間3号:@f_megmeg5(私)

また、こちらでtogetterのまとめがあります。
第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会

私はイベントの模様は写真を撮っていないのですが、他の方が写真を撮っていると信じています。
というか、あの状況では撮れませぬ…。
色々やっていたのでそういう暇がなかったなんですよね。

さて、本題です。
ハンズオン自体は、ハッシュタグとmup_jpさんのメモやコードをWebサービスを使って表示させていたので、情報共有は強固にできたのではないかと思います。
こちらは参加者の方やmup_jpさんのおかげで本当に助かりました。
コンソールアプリでひたすらログを出す時は、苦戦されている方も多かったようです。
よくよく見ていますと、Android(というよりもJavaかな?)の命名規約とobjective-cの命名規約が異なるので、メソッド名のスペルが合っていても大文字小文字でエラーが出るといったこともありました。
これに関しましては、ソース補間をやれば少しは軽減できたのではないかと思いました。
escボタンでXcodeは補間ができますしね。

実際にiPhoneアプリを作るときになりますと、InterfaceBuilderとクラスの補間能力の違いで楽しんでくれている方が多かったと思います。
私もちゃんとは扱っていなかったのですが、IBOutletやIBActionも先に.hファイルに定義しないでも、みーっと引っ張って、そこで定義を行えば.mや.hに自動的に書かれるんですね!
これは便利すぎます。
ただ、その便利さのおかげで弊害として起きたのは、実はいらないIBOutletをソースから消しても.xibファイルに残っているために、実行時にエラーが起きてしまうパターンにはまっている方も多かったようでした。
ここは今回の経験を活かして、次から気を付けてもらえれば良いのかなってなりました。

チューター組はてんやわんやしていましたが、結構楽しんでもらえたのではないかと思っています。
お約束事はAndroidとiPhoneとでは違うことも多いですから、そこは慣れるしかないですしね。

参加者の方がかなり詰まっていたというか、理解するのに時間がかかっていたなと思ったのはメモリ管理部分です。
JavaですとGCのおかげで、メモリ管理を気にしないですみます。
Androidの場合ですと、GCだけではなく自分で適宜色々やらないといけないですが。
ただobjective-cですと、メモリ管理が重要になります。
iOS5からARCが入ってきましたが、基本的なことですし、ライブラリによってはARCに対応していないものもありますので、どのように行っていくのかが重要になります。
「releaseとautoreleaseの違いはなんだ?」となっている方もいましたし、retainとreleaseの使いどころもよくわからない方も多かったと思います。
今までC関連の言語を扱ったことがある方なら理解しやすかったかもしれませんが、そうではない方ですとチンプンカンプンだったと思います。
私も最初はわかりませんでしたからね…。

このメモリ管理の部分に関しましては、Twitterを見ていたらしい@splhacksさんがハッシュタグ付きで書かれていましたので、参考書として読むのが一番良いと思います。
というか、むしろ会場に来て話してほしかったね、ところすけさんと話していましたw


後、今回の反省点というか次に活かせたら良いのではないのかなとなったことです。

資料やソースコードの共有は早めに行う

これは大事です。
実際に、当日になるまで何をやるのかをチューター組は把握できていませんでした。
また、
「なんでこういう書き方をするんだろう?」
となってしまった部分も多かったですので、そこの理解をチューター側がもてるようにする時間も欲しかったのです。
ころすけさんも忙しいようでしたから高望みなのかもしれませんが、次はもうちょっと余裕を持って準備していけたら良いな!となりました。
そういう面で、私が本当に書き方やちょっとしたテクニックを忘れまくっていて、あばばばばばとなっていたんですよね…。
本当に参加者の方には申し訳なかったです。
さすがに1年以上触っていなくて、まともに最新情報を追えていないと大変なことになることを実感しました。
む、難しかったな…!

ソースコードが見やすい机配置にする

今回、ちょくちょく聞こえたのが、
「ソースが見えにくい」
というものでした。
そのため、次は大きなディスプレイが見やすい位置に机を配置した方が良いのかなとなりました。
途中から、全体的に前に詰めましたしね。


チューターの人数を増やす

今回はチューターが3人でしたが、もう一人二人いてほしかったなーとなりました。
わからない方を長時間放置することになってしまう時もあったので、そういうことを無くすためにも人手が欲しかったです。
ころすけさんの魅力なら人が集まるよ!!!


とりあえずはこんなところです。
立ちっぱなしで疲れもしましたが、参加された方が楽しそうだったので良かったです。
次回もあればお手伝いしたいなと思っています。

2012年4月18日水曜日

TextViewでリンクを付けてみよう

開発中のアプリで、
「テキストの途中にリンクを入れて欲しいなー。ほら、htmlみたいに!」
といったことがありましたので、備忘録です。

TextView内でリンク処理を入れるには大まかに分けて3つのパターンがあります。

  1. Linkify.addLinksで行う
  2. TextViewの属性であるandroid:autoLinkを使う
  3. TextViewにhtmlの文字列を読み込ませる
こんな感じです。
で、最終的には3を使ったのですが、最初に1を使ってはまってしまいました。


1.Linkify.addLinksで行う


TextView textLink = (TextView)findViewById(R.id.textLink);
textLink.setText("頑張ってぐぐるよ!");
Pattern pattern = Pattern.compile("ぐぐる");
String scheme = "https://www.google.co.jp/";
Linkify.addLinks(textLink , pattern, scheme);

これだけです。
これで「ぐぐる」の部分にリンクが表示されます。
まあ、便利。
ただ、Linkifyはちょっとした問題があります。
それは「スキーマで指定したURLの後にパターンで指定した文字列がくっついて表示される」ということです。
これには地味にはまりました。
Applies a regex to the text of a TextView turning the matches into links. If links are found then UrlSpans are applied to the link text match areas, and the movement method for the text is changed to LinkMovementMethod.
と思いっきり「into links」ってあるやん!となってしまいまして、ふりだしに戻りました。

2.TextViewの属性であるandroid:autoLinkを使う

これはよくある方法です。
この中で定義されている「android:autolink」の属性で自動的に読み取ってリンク化してくれます。
とっても便利。
ちなみに設定できる値は下記の通りです。
  • web:リンクにURLを貼り、ブラウザを起動させる
  • email:メールアドレスにリンクを貼り、メーラーを起動させる
  • phone:電話番号にリンクを貼り、電話を起動させる
  • map:住所にリンクを貼り、マップを起動させる
  • all:上記全てにリンクを貼り、各リンクに合わせた挙動を行ってくれる
うん、とっても便利ですね。
でも、これだけですとhtmlのような文字リンクが実現できません。
そのため、最後にこの方法で実現させました。

3.TextViewにhtmlの文字列を読み込ませる

大雑把に言うとこんな感じですので、コードを載せます。

TextView textLink = (TextView)findViewById(R.id.textLink);
CharSequence charSequence = Html.fromHtml("がんばってぐぐるよ!");
MovementMethod mMethod = LinkMovementMethod.getInstance();
textLink.setMovementMethod(mMethod);
textLink.setText(charSequence);  

こんな感じで書いていきますと「ぐぐる」の箇所にリンクが貼れます。
最終的にはこれで行きまして、なんとかうまくいきました。
ただ、2で説明しました「android:autolink」属性をxmlに定義しますと、リンクが表示されなくなってかなりはまってしまいましたので注意してください。

ちょっと長くなりましたが、このようにして私は実装を行ってきました。
そのうちネタが集まったら改めて更新しようっと。

Androidアプリ開発者のためのiPhoneアプリ開発ハンズオンに参加します

来る4/22に渋谷で行われるイベントにチューターとして参加します!

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会[女性枠] #andiphone #andronjo

第1回Android開発者のための初めてのiPhoneアプリハンズオン勉強会[男性枠] #andiphone

講師はCoronaSDKのエバンジェリストであるころすけさん(@corosuke_k)です!


ころすけさんと愉快な仲間達でやることになっていますので、お時間のある方はまだ残席があるようですのでぜひぜひー。


今気付いたけど、愉快な仲間達になった経緯はねじさん(@yoichineji)のさいたま勉強会な気がするんだな。
さいたま勉強会は蕨の商工会議所で不定期に行われていますので、もし行われるのでしたら告知しますね。


あああ、頑張ってobjective-cの勉強をしなくっちゃ!

2012年3月6日火曜日

UnityのiOSとAndroidライセンスが無料!?

こんにちは、とってもwktkして仕事が手につきません!
嘘です。
心が折れているだけです。

なのでちょっとした雑談でもしたくなっちゃったのです。
さて、昨日の夜からTLを騒がしているのが表題の件です。
ちなみにここからできるらしいです。
https://store.unity3d.com/

500エラーが発生しちょる・・・。
どうやら世界中からアクセスがあって、どーんと落ちているようですね。
Unityのライセンスの違いは「強火で進め」を書かれているnakamura001さんの記事が参考になります。





ライセンスをゲットして、Unityで遊ぶぞー!

2012年2月27日月曜日

AndroidとFacebook連携をやってみて発狂しそうになったから備忘録

タイトルが酷いですが、本当のことなのです。

昨日、現在開発中の要件で「FacebookとTwitter」への投稿をしなくちゃなりません。
最近SNSも流行っているので時代の流れですね!

Twitterとの連携に関しましては、@yusukeyさんが作られたTwitter4Jを使っています。
後でライセンス周りを確認しなくては…。

では、Facebookはどうするのかとなりまして色んなサイトを参考にしてちまちまと環境構築をしていきました。
最初に参考にした記事はこちらの記事です。


1.Git環境構築
ほむほむ、Gitから最新SDKを落としてこないといけないのですね。
はい、最初の関門!
私の会社はSVNでのバージョン管理ですので基本的にGitの環境がありません。
なので、そこから環境構築です。
あ、ちなみにマシンはWindows7使っていますよ!

さらに調べていくとTortisesGitなるもので落とすと便利とありました。
「じゃあ、これを入れるぞ!」となったのですが、TortisesGitを動かすためにはGit Bashなるものが必要とのこと。
で、Git Bashを入れるにはmsysgitを入れないといけないので、インストールします。

これで突貫のGit環境構築が出来上がりました。
てなわけで、こちらからFacebookSDKを落とします。
https://github.com/facebook/facebook-android-sdk/



2.Facebook連携のためにアプリを登録
Facebook連携のために、アプリをこちらに登録します。
https://developers.facebook.com/apps
そうなると細かい設定もできるようになります。
アプリ名等を登録して、いざAndroidとの連携部分に着手します。
…Android Key Hash?
なにこれ???
と思ったのでとりあえず、後回し。
とりあえず、AppIDがゲットできればここはOKです。



3.FacebookSDKのライブラリ作成
githubから落としてきたSDKをソースに入れても動きません。
Androidのライブラリプロジェクトとして動かさないと動かないのです。
面倒やなーと、なりましたがFacebook連携をやるのならこれぐらい簡単でしょ?ということなのでしょうきっと。
というわけで、SDK用のライブラリプロジェクトを作成します。
新規Androidアプリを作成する時に、外部ソースを読み込みを選択します。
ただ、私なんかこれでうまく動かなかったんですよね。
ちなみに外部読み込むをするソースはこちらです。
facebook-android-sdk/facebook
動かない場合はこの中のソースを新規に作ったプロジェクトの中にコピペすれば幸せになれますよ!
とりあえず、これでSDKのライブラリは作成できました。

次に、自分のAppIDga有効かどうかを確認します。
私はsample内のsimpleを使って遊んでみました。
そんでもってデバッグもしてみて、挙動を確認してみました。
public static final String APP_ID = "xxxxxxxx";
この部分に登録したAppIDを記入します。
これでアプリは実行できますが、KeyHashを登録していないためログインに失敗します。


4.Key Hashを作ろう
これに一番はまりました…。
もうね、Windowsの環境構築に苦しむのはいやんなのです。
けど、これしかマシンが無いので半泣き状態でやりましたとも、ええ。

閑話休題。

さて、Key Hashを作成にするには下記のものが必要です。
・JDKのkeytool.exe
・C:\Users\ユーザー名\.android内にあるdebug.keystore
・opensslコマンド
コマンドについてはさっぱりですので、とりあえずcd でkeytoo.exeのところまで行き、下記のようなコマンドを打ちました。

keytool -exportcert -alias simple -keystore "C:\Users\ユーザー名\.android\debug.keystore"
| openssl.exe  sha1 -binary
| openssl.exe base64

ここでopensslコマンドが有効じゃないよと怒られました。
なので、OpenSSLの設定をこちらを参考にしてやっていきました。
http://homepage2.nifty.com/protocol/openssl/
ふむふむOpenSSLをWindowsで動かすにはActive Perlが必要らしい。
それならActive Perlを入れてみます。
それからOpenSSLのインストールを行います。
さあ、どうだ!とコマンドを打ってみる。
…動かない。
何故???

とりあえず、調べまくると環境変数が問題っぽい。
調べまくると、
OPENSSL_CONF C:\OpenSSL-Win64\bin\openssl.cnf
PATH \OpenSSL-Win64\bin
を設定すればいいらしい。

とりあえず、keytool.exeのフォルダに移動してversionコマンドを打つと動いた!
さあ、これでKeyHashが作れる!

keytool -exportcert -alias simple -keystore "C:\Users\ユーザー名\.android\debug.keystore" | openssl.exe  sha1 -binary | openssl.exe base64
もう一度こいつを打ってみた!
…エラー???
「simpleなんかないよー」
というのが出てきた。
最後に最後にこれかよ。
なのでコマンドを探しました。
すると、こちらが参考になりそうです。
http://d.hatena.ne.jp/language_and_engineering/20110830/p1

keytool -exportcert -alias androiddebugkey -keystore C:\Users\ユーザ名\.android\debug.keystore | openssl sha1 -binary | openssl base64

おお、うまくいきそう。
キーストアのパスワードが訊かれますが、debug.keystoreは全て同じパスワードなので「android」と打ちます。
するとずらずらとハッシュが表示されました!


5.アプリと連携させてみる
Facebookのアプリ情報設定画面でこの表示されたKeyHashを登録します。
そして、simpleアプリを起動させるとログインできました!

いやはや良かった良かった。

ここまでの苦労を水の泡にしたくなかったものです。


正直なことを言うと、メッセージのみしか送らない(twitpic投稿等もしなくて、純粋にメッセージのみ)のなら、暗黙的Intentを使ってメッセージを他のアプリに送ることができるのだから、TwitterやFacebook連携にこだわらなくてもいいんじゃないのかなーと思いましたとさ。