2013/11/07
[Android][Nexus5] Nexus5購入
2013/10/15
[Android] 新しいアプリを公開しました: NinNin
ジャンルとしては「ニュース」ですが、Google検索の条件を覚えておいて、毎日自動的にチェックしてくれるという、検索ツールに近いアプリです。
Google Playリンク:
情報忍者NINNIN - 気になるキーワードでニュースを検索
こちらのページに書いた通りですが、以下のようなアプリです。
NinNin(ニンニン)は、あなたの代わりにWebを検索し、忍者のように情報収集します。 Google検索、Googleニュースを使用しています。 簡単に言えば、「あなたが一度ググった条件で繰り返しググれるアプリ」です。 気になったキーワードと条件を登録しておくと画面を引っ張るだけで何度も検索できます。 検索対象のページは、1日以内に更新されたページ、などで指定できますから 1日1回検索すれば今話題の記事をチェックできるでしょう。 さらに「自動検索」を設定すれば、毎日同じ時刻に自動的に検索できるので 忘れずにチェックでき、いつの間にかその話題に詳しくなれるはず。 「自動検索」では検索結果のページも一部読み込んでおくので、 通勤電車など電波の届かない場所でも情報収集することができちゃいます! (繰り返しますが、一部だけです。まだ不完全なので予めご了承ください…) SmartNews、Gunosy、vingow、LINE NEWSなど、最近話題のニュースアプリで 気になるワードを見つけたら、NinNinに登録して継続的にチェックしましょう。 また、メジャーなニュースとして出てこない、レアな情報をチェックしたい方にもおすすめです。 滅多に話題にはならないけれど動きがあればすかさずチェックしたい、 自分に関係のあるキーワードなのでチェックしたい(いわゆる「エゴサーチ」)、 などなど。
他アプリへの共有がしやすいようにちょっと工夫していますので、Evernoteに送ったり、Pocketに保存したり、Facebookで共有したり・・・といったことが楽にできます。
使い方次第ではブラウザよりもAndroidの良さが生かせるかも?しれません。
以下のブログでも詳しい使い方をスクリーンショット付きで説明しています。
http://ninnin.hateblo.jp/
2013/09/16
[Android] 入力チェックライブラリAndroidFormEnhancerのデモアプリ
デモのアプリをGoogle Playで公開しました。
[Android] 最初のActivityが起動するまでの間だけスプラッシュ画面を表示する方法
最初のActivityが起動するまでのわずかな時間だけ別の画像を表示する方法が
なかなか分からなかったのでメモします。
ユーザからすればスプラッシュ画面は操作するまでの時間が長くなるだけなので避けるべきですが、
・Application#onCreate()で重たい処理が必要(何かのSDKの初期化等)で、
Activityの起動まで時間がどうしても長くなってしまう
・ActivityのsetContentView()完了までの時間が長く、
それまでの間にデフォルトのActionBarが表示されてしまうのが嫌
・アプリ内でテーマを選べるようにしたいが、Activity起動直後はデフォルトのテーマのスタイルで
画面が表示されてしまうのが嫌
などなど、初期画面を表示するまでの時間だけスプラッシュを表示しておきたいという場合があると思います。 そんな場合の対処方法です。
2013/09/15
[iOS] APNs証明書の更新手順
少し前にAPNsの証明書をアップデートする方法について調べた手順です。
誰かの参考になれば幸いです。
ただし、あくまで検証した時のメモですので、各自の責任でご利用ください。
(現に、これを調べてからここに公開するまでの間に若干動きが変わっていますので…)
[Android] keystoreパスワードの復元(変更)
一応、解決できたので方法を書き留めておきます。
ただし、解決できる条件は「エイリアスのパスワードは分かる」ということです。
Antやkeytool、ADTのExportツールなどを使うとキーストアのパスワードが間違っているせいでエラーになっていましたが、実はエイリアスのパスワードは正しかったのです。
というのは、Android Keystore Password Recoverを使って分かりました。
https://code.google.com/p/android-keystore-password-recover/
[Android] Galaxy Nexus でのDB書き込みエラー
Android 4.3にアップデートした後、Evernoteでノートが作れませんでした。
Dropboxでファイルがダウンロードできません。
QuickPicでサムネイルが作れません。
アンインストールして再インストールしても解消しないことから、
どうやらSDカード配下のファイルがおかしいかもしれないと思い
確認したところSDカード以下の該当アプリのディレクトリを削除することすらできませんでした。
(もちろんsuしています。)
そこで、
http://coosee.blog.fc2.com/blog-entry-8.html
でヒントを得て、CWMを使えるようにした上で
adb recovery
adb shell
# cd /data/media/0/Android/data
# ls -l
と実行してみると、OSアップデート前のデータのアクセス権がおかしなことになっていました。
所有者がroot:sdcard_rとなっているディレクトリがあります。
/data/media/0/Android/data # ls -l
drwxrwxr-x 3 media_rw media_rw 4096 Dec 6 2012 com.adcyclic
drwxrwxr-x 3 root sdcard_r 4096 Jul 27 01:04 com.adobe.reader
drwxrwxr-x 2 root sdcard_r 4096 Jul 27 00:56 com.alensw.PicFolder
drwxrwxr-x 3 media_rw media_rw 4096 Aug 10 10:13 com.alphonso.pulse
drwxrwxr-x 3 root sdcard_r 4096 Jul 27 01:02 com.android.chrome
drwxrwxr-x 3 media_rw media_rw 4096 Oct 6 2012 com.android.providers.media
drwxrwxr-x 2 root sdcard_r 4096 Jul 26 23:13 com.box.android
drwxrwxr-x 3 media_rw media_rw 4096 Dec 8 2012 com.chartboost.sdk
drwxrwxr-x 3 media_rw media_rw 4096 Aug 30 10:55 com.deploygate
drwxrwxr-x 3 root sdcard_r 4096 Jul 27 01:01 com.dropbox.android
drwxrwxr-x 7 root sdcard_r 4096 Jul 27 01:00 com.estrongs.android.pop
drwxrwxr-x 3 root sdcard_r 4096 Jul 27 01:00 com.evernote
:
chown -R media_rw:media_rw *
[Inkscape][Android][iOS][Mac] 全サイズのアイコンファイル生成ツール
タイトルの通り、1つのファイルから全サイズのアイコンファイルを一括生成します。
(使う人いるでしょうか…もしいればコメントなど頂けると嬉しいです。)
https://github.com/ksoichiro/export_icons
InkscapeでSVG形式のアイコンファイルを用意し、ターミナルで
export_icons -i Icon.svg -o output
と実行するとoutputディレクトリへAndroid用iOS用のアイコンを一括で作ります。
AndroidとiOSでは違うSVGを使ってる、という場合は
export_icons -i ic_launcher.svg -o output -t Android
2013/06/27
iOS: UIScrollViewをStoryboardで使うときのスクロールのさせ方
2013/04/24
iOS App Store用とAd Hoc用のプロビジョニングプロファイル
プロビジョニングプロファイルには大きく分けて
- Development
- Distribution
DistributionにはさらにApp Store用とAd Hoc用があります。
自分の理解では
- Developmentは、MacにiPhoneを接続して直接インストールする際の署名に使用するプロファイル
- DistributionのうちApp Store用のものは、App Storeに提出するバイナリ用のプロファイル
- DistributionのうちAd Hoc用のものは、Ad Hoc配信する場合のバイナリ用のプロファイル
- リポジトリのmasterブランチではApp Store用のプロファイルで署名する設定で常に管理
- 開発・デバッグ・テスト時は一時的にDevelopment/Ad Hocに切り替えてビルド。App Store用でReleaseビルドすると実機に直接インストールはできないし、Ad Hocでインストールしようとすると失敗するし(端末のID情報がないので)。。。
- 一時的に切り替えとはいえ、テストしたときの状態を完全に再現できる状態にしておきたいので、(Developmentはともかく)Ad Hocに切り替えたものを仕方なく別のブランチを作って残しておく
- 結局App Storeに提出するバイナリファイルはテストの完了後に作るしかなく、App Store申請前にテストしておくのは無理?App Storeにリリースされて初めて動かせるなんて恐すぎる…
が、App Store用のプロビジョニングプロファイルを指定してビルド/アーカイブし、アーカイブの一覧からAd Hoc用にDistributeするときに Ad Hoc用のプロビジョニングプロファイルを指定する(端末のID情報が入っていればDevelopmentでも良い?)、ということができるのですね・・。
なので、少なくとも配布に関する情報の差異があるとはいえ、アプリの本体部分はそのままApp Storeに提出できる状態の、限りなく本番に近いものを事前テストできる訳です。 />
アプリの仕様によっては接続先のサービスが本番用/テスト用などの使い分けがあり、必ずしもバージョン管理下のもの全てを 本番と同じにしてテストする訳にはいかないと思いますが、最終確認としてそうしたテストができるのが分かったのは 自分の中では大きな発見なのでした。
Androidの場合は、署名さえ同じであれば良いので事前に動かしたAPKファイルをそのままストアに登録できるので、AppleのApp Storeの仕組みが非常に厄介に思えてしまいました。
Androidアプリを開発してきてiOSに取り組むと、言語の違いよりもこうした仕組みの差の方が 馴染むのに時間がかかるかもしれません。。。
Android 単一項目を選択させるListViewの設定
以下は
- ListViewにラジオボタンつき項目を表示
- 項目は1つだけ選択可能
- 項目が選択されたら(タップされたら)何かする

リスナーの設定はsetOnItemSelectedListener()ではなくsetOnItemClickListener()であること、 項目を初期選択させるのはsetSelection()ではなくsetItemChecked()であることが注意する点でしょうか。
2013/04/21
iOS ステータスバーの扱い
iPhoneでは起動画面(Default.png)にステータスバーの高さが含まれています。
(320 x 480 / 640 x 960 / 640 x 1136)
しかし、iPadでは含まれていません。(768 x 1004 / 1536 x 2008)
これは画像のサイズだけの問題ではなく表示位置にも影響します。
iPhoneではスクリーンサイズの起動画面画像を用意しますがステータスバーの分は隠れてしまいます。
一方でiPadはステータスバーの高さを除いた画像なので、ステータスバーの下から画像が表示されます。
単に起動画面を表示する場合は問題になりませんが、その後の画面とうまく繋げようとすると この差が重要になります。
実際やろうとしたことは以下の二つです。
[1] 起動画面の後、画像の一部を重ねてログイン画面を表示する。
[2] ログインした場合は起動画面をフェードアウトして別画面へ遷移させる。
[1]を実現するには起動画面の画像と、ログイン画面に表示させる画像で、重ねたい部分を同じ位置に描画すれば良いと考えると思います。
iPhoneではうまくいくのですが、前述の通りステータスバーの高さが含まれないiPadではうまく行きません。 合わせるためには、iPad用起動画面(Default-Portrait~ipad.pngなど)の重ねたい部分をステータスバーの高さだけ下にずらします。
(iPad mini用画像(Default-Portrait~ipad.png)なら20px、iPad(Retina)用(Default-Portrait@2x~ipad.png)なら40px)
ログイン画面の画像を修正する方法もありますが、こちらは特に合わせようとしなくてもiPhone/iPad同じレイアウトになるので変更しない方が良いでしょう。
[2]を実現する場合には、単に起動画面の画像をアルファ値を0にするようなアニメーションで表示すれば良いですが、やはりiPadの場合は画像の表示位置をステータスバーの分だけずらす必要があります。
ということで、まとめると以下のような感じです。
- iPad用起動画面(Default.png)はステータスバーの高さが含まれないので、iPhone用の画像を基準にするなら上の20px(Retina用は40px)が欠けたような画像にする。
- 起動画面を別の箇所で表示させる場合は、iPhone/iPadで表示開始位置(frame.origin.y)をステータスバーの分だけずらす。
iOS ローカライズが失敗してNSLocalizedStringのキーが表示される
実は開発中にローカライズの確認をしていたときも何度か発生していたのですが、 2回ビルドして実行すると解消されたため、Cleanするだけでは前回の結果が消えないものがあるのだと思いあまり気にしていませんでした。 結果的に、原因はLocalizable.stringsがプロジェクト内に複数あったことでした。
Check if you have more than one Localizable.strings in your project. Merging them into one solved it for me.
http://stackoverflow.com/questions/6709350/xcode-localized-string-not-loaded
それから「2回ビルドすると解決する」という事実、
JapaneseとEnglishのローカライズされたファイル数が違う、
ということでした。
ローカライズされたファイル数はプロジェクト(XXX.xcodeproj)の「PROJECT」>「INFO」>「Localizations」で確認できますが、英語の方が1つ多かったのでした。
それが何かというと、使用しているEvernote SDKのライブラリ内に存在している英語のLocalaizable.stringsです。
ビルドすると、このファイルとメインの(元々自分で用意した)en.lproj/Localizable.stringsが交互で適用されるようで、マージはされません。
そのため、ビルドした1回目はNSLocalizedStringのキーがそのまま表示され、2回目は正常に表示されます。
開発中は日本語でデバッグし、英語ではローカライズ文字列の確認をする程度だったため、同じコードのまま3回以上ビルドすることがなく気付かなかったのですが、試しに3回以上ビルドしてみると、ローカライズ失敗、成功、失敗、…と繰り返されました(つまり確かに二つのLocalizable.stringsが交互に適用されています)。
同じような事象に遭遇された方の参考になれば幸いです。
2013/04/13
EverForm for iOS
https://itunes.apple.com/jp/app/id630680690
Android版を既にリリースしていますが、今回はそのiOS版です。
EverFormは、Evernoteでよく使うノートの形式をフォームとして管理するアプリです。
Evernoteの使い方は様々だと思いますが、Webのクリップだけではなく、毎日何かの記録をするのに使っている人もいるのではないでしょうか。 EverFormは、そんな人におすすめできるアプリです。
- ノートの書式(見出しなど)を保存しておく
- ノートの作成時に作成日時を自動的に埋め込む
- ノートの作成時の保存先ノートブックを指定しておく(*)
- ノートの作成時に付けるタグを指定しておく(*)
- チェックボックスを埋め込んでおく(*)
(*)実は、前述のAndroid版ではまだ対応できていないのですが、近々対応する予定です。
2013/04/06
Android XMLだけでできたボタン
RichButtons
ライブラリ、とは言ってもグラデーションなどをlayerで重ねただけXMLを集めただけなのですが、、、 1から作ると意外に時間がかかると思うのでよろしければご利用ください。
通常の状態と「pressed」の状態の2種類が定義されているので、タップするとちゃんと見栄えは変わります。
http://developer.android.com/distribute/promote/device-art.html
2013/02/16
iOS UINavigationBarとステータスバーの高さを除いた画面サイズ
Android Fragmentを含む画面遷移のテスト方法(JUnit)
Fragmentインスタンスの取得方法
Fragmentの画面遷移のチェック方法
・BackStackの数が期待通りに増減しているか
・findFragmentByTag()で取得できる(=前面にある)Fragmentが期待通りのクラスか
2013/01/12
Android 入力チェックライブラリ
AndroidFormEnhancer
例えば、「名前」の入力欄を
- 必須
- 全角
- 最大20文字
- 画面上のリソースIDはR.id.textfield_name
- エラーメッセージの項目名としてR.string.form_nameを使う
2013/01/11
Android Drawableのattrを定義
2013/01/03
GitHub pushすると「Permission denied (publickey)」
原因は、単純にGitHub上に現在のsshキーが登録されていなかった(削除してしまった?)ことでした。 単純すぎますが、解決するまでの過程をメモしておきます。