2013年8月8日木曜日

Head First Rails 4 Chapter2

$ rails new MeBay
$ cd MeBay
$ rails g model ad name:string description:text price:decimal seller_id:integer email:string img_url:string
$ rake db:migrate
$ curl -o db/development.sqlite3 http://www.headfirstlabs.com/books/hfrails/code/development.sqlite3
$ rails g controller ads

app/views/ads/show.html.erb の作成は変更なし
config/routes.rb はコメントを参考に以下のように設定して動作を確認できた。
Rubyらしくより規約に近づいた設定になっている。

MeBay::Application.routes.draw do
  root 'welcome#index'
  get 'ads/:id' => 'ads#show'
end

$ rails server

indexの追加、viewとcontrollerは変更なし
config/routes.rb は下記を追記

get 'ads/' => 'ads#index'

静的コンテンツの配置は仕様が変更になっている。ハマりそうだったので今回はスルー。

2013年8月6日火曜日

Head First Rails 4

バージョンアップに伴い再度チャレンジ

Chapter1

$ rails new tickets
$ cd tickets
$ rails g scaffold ticket name:string seat_id_seq:string address:text price_paid:decimal email_address:string
$ rake db:migrate
$ rails server

ラベル修正は基本的に差異はない。new.html.erbとedit.html.erbの記述が_form.html.erbにまとまっていてDRYしてる。

$ rails g migratation AddPhoneToTickets phone:string
$ rake db:migrate

ラベル修正は直前のと同様。Rails2.xではこの変更で十分だったが、Rails4でのscaffoldはcontrollerの作りが少し違うためこのままだとPhoneが空欄のままになっている。dbからデータを取得するカラムを指定しており、こちらにもPhoneを追加してあげる必要があった。具体的には下記の通り。

$ vi app/controllers/tickets_controller.rb

# ticket_paramsを修正
# phoneを追加してあげる必要がある
params.require(:ticket).permit(:name, :seat_id_seq, :address, :price_paid, :email_address, :phone)

イベントの追加も同じように

$ rails g scaffold event artist:string description:text price_low:decimal price_high:decimal event_date:date
$ rake db:migrate

2013年8月5日月曜日

Ruby2.0+Rails4へアップデート


Mac OS X 10.8.4
Ruby 1.8.7
Rails 2.3.5

HomeBrewインストール済み

$ brew update
$ brew install rbenv
$ brew install ruby-build
$ vi ~/.bash_profile

# 以下の2行を追記
# Ruby
eval "$(rbenv init -)"

$ source ~/.bash_profile

$ brew install readline
$ brew install openssl

$ RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-p247

$ rbenv global 2.0.0-p247
$ ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]

$ gem install rails
$ rails -v
Rails 4.0.0

参考:
Ruby on Rails http://rubyonrails.org

MacにRubyをインストールする時のメモ

[Mac]rbenvを使ってRuby2.0をインストール

2013年7月31日水曜日

format not a string literal and no format arguments

PowerVRのサンプルコードをビルドしていてこのエラーに遭遇したので備忘録として残しておきます。

以下のリンクはcocos2d-xのようですが、似たような状態かもしれません。
http://www.cocos2d-x.org/boards/6/topics/32369?r=32373

Try to replace__android_log_print(ANDROID_LOG_DEBUG, "cocos2d-x debug info", buf);with__android_log_print(ANDROID_LOG_DEBUG, "cocos2d-x debug info", "%s", buf);Does it help?

追記:
addon-powervr_graphics_sdk_3_1_-_opengl_es2_0-imagination_technologies_ltd-10/shell/OS/Android/PVRShellOS.cpp
PVRShellInit::OsDisplayDebugString
_android_log_printを上記のように書き換えることでビルド成功

2013年6月21日金曜日

Android+facebook

Facebook SDK for Androidが提供されています。
https://developers.facebook.com/android/

ドキュメントも充実しています。
Shareボタンの実装には以下のドキュメントを参考になります。
https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/
https://developers.facebook.com/docs/howtos/androidsdk/3.0/publish-to-feed/


ハマりどころとしては、Android端末にインストールされているfacebookアプリのバージョンが古いと認証がうまくいかないようです。

2012年3月9日金曜日

AndroidのBufferedReader

サイズ指定なしのコンストラクタを使っていると、

Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.

がログに出力されることがある。Infoレベルなので気にしなくても良いのかもしれないですが、試しに8192をサイズ指定するとログに出力されなくなった。

http://developer.android.com/reference/java/io/BufferedReader.html

BufferedReaderのサイズ指定なしのコンストラクタの説明を読むと8192を渡すよと読み取れるけど、実際は違っている? ソースは未確認。

2012年2月14日火曜日

android開発環境


JDK(7u2)
http://www.oracle.com/technetwork/java/javase/downloads/index.html
7の場合は署名のところで一手間必要らしい
参考: JDK7でAndroidアプリを正しくビルドできない問題を調査した
http://togetter.com/li/208415

なので無難にやるなら下の方にある6 Update 30がいいだろう

Eclipse(3.7.1 androidではclassicがおすすめ)
http://www.eclipse.org/downloads/

Android SDK(r16)
http://developer.android.com/sdk/index.html

※()内は投稿時の最新バージョン

すべてインストールが完了したらEclipseを起動してADT Pluginをインストール
http://developer.android.com/sdk/eclipse-adt.html#installing

2011年12月7日水曜日

メール削除手順

携帯に届いた迷惑メール削除する

いわゆるガラケーの場合


  1. 携帯開く
  2. メールボタンを押す
  3. 受信ボックスを選択
  4. 受信メールを選択
  5. メニューを押す(届いた迷惑メールが選択されている)
  6. 0(削除)を押す
  7. 1(1件)を押す
  8. 十字キーで削除確認NOからYESへ
  9. YESの確定

一方、スマートフォンの場合


  1. ロック解除
  2. メールアイコンタップ
  3. 全受信をタップ
  4. 右から左へスワイプ(届いた迷惑メールに対して)
  5. 削除タップ(4で削除アイコンが右端に表示される)

そこまで大きく違うわけではないが、スマートフォンの手順に慣れるとガラケーの手順が煩わしく感じる。ガラケーの789がなければスマートフォンに近い感じにはなるのではないか。ポイントは

  • 0(削除)を押したんだから、その1件が対象(7の省略)
  • 0(削除)を押したんだから、確認不要(89の省略)

とはいえ、7の手順で複数選択が可能なので、外せないのだろう。スマートフォンの場合は画面右端に編集ボタンがあって、これをタップすると複数削除可能になる。

ガラケーの操作手順で、どれほどのメールを誤って削除することから回避できたのか、スマートフォンの操作手順になって、どれほどのメールを誤って削除してしまったのか、そういうデータはないかしら。

2011年11月24日木曜日

Graphical Layoutでのエラー


AndroidをEclipseで開発していて、Graphical Layoutを表示しようとすると、下記エラーが発生することがあるようです。
main.xml: You must specifiy a valid layout reference. The layout ID @layout/header is not valid.
レイアウトのxmlでincludeすると発生する? この@layout/headerというのがinclude対象のxmlです。一度発生したら直らなくなりましたが、それまでは見れていたので原因がよくわかりません。

下記URLの手順に従ってWindowBuilderプラグインを入れると解決します。

http://www13.plala.or.jp/naka_jima/Eclipse/chapter01_12.html

2011年10月20日木曜日

Admob続き

ゲームでAdmobを利用する場合、すでにActivityに対してSurfaceViewを継承したView(仮にGameViewとします)を使っていると思います。Admobを利用するためには、さらにAdViewを追加します。この時、どのタイミングでAdViewがaddされるかは不定のようです。1分くらい待っても追加されないこともありました。AdViewが追加されると画面の作りによってはレイアウトが乱れると思います。その場合はAdViewが追加され、GameViewの大きさが変更されるとsurfaceChangedが呼ばれるのでここで任意の処理を行えばよさそうです。

Admob

Android Admobで検索すると、古いバージョンでの実装方法が多く見つかりました。
最新のSDKを落とすと、そこの説明にあるAdManagerというクラスが見つからずつまづきました。

現時点での最新の情報は下記が参考になります。というかそのままです。
http://code.google.com/mobile/ads/docs/android/fundamentals.html

古いバージョンより最新バージョンの方がかなり簡単に実装できます。
コピペしてつまづくとしたら、MY_AD_UNIT_IDは定義されていないので、説明にもある通りパブリッシャIDで置換してください。またAPI Level 7で確認していますが、下記属性はありませんでしたが、特に設定しなくても問題ありませんでした。

uiMode
screenSize
smallestScreenSize

ちなみにuiModeはAPI Level 8から、screenSizeとsmallestScreenSizeはAPI Level 13から導入されたようです。
下記activityの属性説明で確認しました。
http://developer.android.com/intl/ja/guide/topics/manifest/activity-element.html

2011年8月9日火曜日

着信イベントの受信


TelephonyManager#listen で着信イベントの受信ができます。
その時、PhoneStateListener のインスタンスを渡します。
解除する時も同じインスタンスを渡さないと解除されません。

2011年8月5日金曜日

startActivity called from non-Activity context

startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent...

アクティビティではないコンテキストからアクティビティの開始が呼ばれました。
Intent に Intent.FLAG_ACTIVITY_NEW_TASK をつけておきました。

出力レベルはワーニング。
ActivityGroup に TabActivity を乗せて、さらにその TabActivity に乗せた Activity から呼んでいるのが原因のような気がします。

Intent に対して明示的にフラグを付与すればワーニングは消えます。

intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );

これでどうしてワーニングが消えるのかわからないでいます。

波bot

つらつらとTwitterのbot集を眺めていました。
http://matome.naver.jp/odai/2124511765173833275?&page=4

そこに、ああこれはいいかもと目を引くbotがありました。


http://imgcc.naver.jp/kaze/mission/USER/6/9/66159/0/a5f19ddbcfaf4fc5e3412843102e61cc.jpg/120/120
波の音をツイートするなみボット(@namibot)です。
波の音が聞こえて来たら、すこし気持ちを休めてリフレッシュなう*



なみボットのプロフィールページへ行ってみると、
波botの更新が3月11日で止まっていました。

作者が意図して止めたようです。

それまでは確かに優しい波がそこにはあったことと、
それまでにも激しい波はそこにあっただろうし、
あの時以前にも恐ろしい波はあっただろうし、
言葉が何も出てこなくなりました。

Twitterは言葉を使ったコミュニケーションですが、
言葉を使わない、沈黙するという表現もそこにはあるのだなと、
作者の優しさ、思いやり、やり切れない思いを感じました。

2011年8月4日木曜日

Tabに設定したActivityからのダイアログ表示

new AlertDialog.Builder( this )...
では、エラーが発生する。詳細はこちら。http://unodroid.blogspot.com/2011/05/tab.html

new AlertDialogBuilder( getParent() )...
とし、親のActivityを渡してあげることで解決。
理由は前述のページにあるようにViewRootまで辿ることができず、is your activity running? ちゃんとアクティビティ動いてますか? とエラーになるようだ。

FileFilterの使い方

FileFilter を無名クラスとして実装してあげる。
ディレクトリのみ取得したい場合は、下記の通り

File[] files = file.listFiles( new FileFilter() { public boolean accept( File file ) { return file.isDirectory(); } }; );

2011年7月19日火曜日

Androidの暗号化で利用できるアルゴリズムを調べる

Set<String> names = Security.getAlgorithms( "MessageDigest" );

for ( String name : names )
{
Log.v( TAG, name );
}

APIレベル7での実行結果:

SHA-256
SHA-512
MD5
SHA-1
SHA-384

参考URL:

2011年7月7日木曜日

iPhoneで将棋! 第2弾

・brainking
・shogitter

webアプリの紹介をします。そのうち・・