Xcode4.3.2にuncrustifyを導入 インストール編

  1. uncrustifyのソースをダウンロード(https://github.com/bengardner/uncrustify , http://uncrustify.sourceforge.net/)、必要に応じて展開
  2. 展開したフォルダで ./configure
  3. make
  4. sudo make install


基本的には上記手順で問題なく終了するはずなのですが、自分の場合は2の時点で色々とエラーが発生したので以下はその対応記録となります。

エラー内容「configure: error: C++ compiler cannot create executables」

homebrewが古いか、未インストールのために発生するもよう。*1
自分の場合homebrewが未インストールだったのでインストールしました。

インストールするのに以下のコマンドを実行。*2

ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)

/usr/bin/ruby -e "$(/usr/bin/curl -fsSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"

homebrewをインストール後、「You should run `brew doctor' *before* you install anything.」とあったので
brew doctor を実行。
すると、またエラーが発生しました。

エラー内容「Error: You have no /usr/bin/cc.」

Command Line Toolsがないため発生するもよう。
Xcode→Preferences→DownloadsからCommand Line Toolsをダウンロードすることでエラーを解消できました。

これで手順2の./configure が正常に動作するようになったので、
残りのコマンドを実行してインストール完了となりました。

EditTextで入力完了したら、ソフトキーボード閉じて処理を実行する

忘れないようにメモ。

例えば検索条件をEditTextに入力する場合、
ユーザビリティ的にはソフトキーボードで入力完了後(EnterKey押下時)に検索ボタンを押さなくても自動的に検索が始まるのが好ましい。
また、ソフトキーボードは自動的に閉じられると良い。

コードは以下のとおり。

EditText searchEdit = (EditText) findViewById(R.id.search_edit);
				
searchEdit.setOnKeyListener(new OnKeyListener() {
	@Override
	public boolean onKey(View v, int keyCode, KeyEvent event) {

               //EnterKeyが押されたかを判定
		if (event.getAction() == KeyEvent.ACTION_DOWN
				&& keyCode == KeyEvent.KEYCODE_ENTER) {

                        //ソフトキーボードを閉じる
			InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
			inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);

                        //検索処理的な何か
			doSomething();

			return true;
		}
		return false;
	}
});

WebのGoogleCalendarと同期できない問題

Galaxy Sで下記方法でGoogleCalendarにイベント情報を登録しても
Web上のGoogleCalendarと同期がとれない。
AndroidでGoogleCalendarにイベントを登録する - Gen-Sukeの日記
Galaxy Sにプリインストールされているカレンダーアプリで登録すると同期される。
このことで軽くはまったのでメモ。

結論としてはイベント登録時に以下の設定を追加したところ正常に同期がとれた。

ContentValues values = new ContentValues(); 
...
values.put("_sync_account", "aaa@gmail.com"); //これはなくて良いかも 
values.put("_sync_account_type", "com.google"); 

どうも2.2から追加されているようです。

AndroidでGoogleCalendarにイベントを登録する

GoogleCalendarにイベントを登録する日本語的な説明をあまりみなかったので書いてみる。

お品書き


  1. パーミッションを忘れない。

  2. カレンダー情報を取得する。

  3. 取得したカレンダーにイベントを登録する。

  4. 通知情報を登録する。

  5. URIについて

パーミッションを忘れない。

AndroidManifest.xmlに忘れずに書いておきましょう。

<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />

カレンダー情報を取得する。

カレンダーにイベントを登録するには、登録先のカレンダーがわからなければどうしようもないです。

なので、まずはカレンダー情報を取得します。

String[] projection = new String[] { "_id", "name" };//idはプライマリーキー、nameはカレンダー名
String selection = "access_level" + "=?";
String[] selectionArgs = new String[] { "700" };
Uri calendarUri = Uri.parse(calendarProveName);
Cursor managedCursor = managedQuery(URI.parce("content://com.android.calendar/calendars"), projection, selection,
	selectionArgs, null);
int[] mCalIds;
String[] mCalNames;
if (managedCursor.moveToFirst()) {

	int len = managedCursor.getCount();
	mCalIds = new int[len];
	mCalNames = new String[len];

	int idColumnIndex = managedCursor.getColumnIndex("_id");
	int nameColumnIndex = managedCursor.getColumnIndex("name");

	int i = 0;
	do {
		mCalIds[i] = managedCursor.getInt(idColumnIndex);
		mCalNames[i] = managedCursor.getString(nameColumnIndex);
		i++;
	} while (managedCursor.moveToNext());
}

selectionでaccess_level(カレンダーの編集権限)を条件に指定しています。
"700"の場合、オーナー権限です。
イベントを登録したいのでオーナー権限があるカレンダーのみを取得しています。
これにより、祝日用のカレンダーなどが取得されなくなります。

取得したカレンダーにイベントを登録する。

下記コードは取得したカレンダーの1番目のものに対して登録しています。

ContentResolver contentResolver = getContentResolver();
ContentValues cv = new ContentValues();

cv.put("calendar_id", mCalIds[0]);
cv.put("title", "イベントのタイトル");
cv.put("description", "イベントの説明");
cv.put("eventLocation", "住所");
cv.put("dtstart", startDate);//ミリ秒で指定
cv.put("dtend", endDate);//ミリ秒で指定
// 通知機能を使用する場合は1を設定する。使用しない場合は省略して良い
cv.put("hasAlarm", mAlert);

Uri eventUri = contentResolver.insert(Uri.parse("content://com.android.calendar/events"), cv);

イベントの情報はまだ他にも設定できるけど省略。

通知情報を登録する。

通知機能を使用しない場合は、省略して良いです。
insertの戻り値のURIから作成されたレコードの行番号を取得し設定します。

long rowId = Long.parseLong(eventUri.getLastPathSegment());

cv.put("event_id", rowId);

cv.put("method", 1);// 通知方法を指定する
cv.put("minutes", time);//分単位で指定する
contentResolver.insert(Uri.parse("content://com.android.calendar/reminders"), cv);

これでカレンダーに通知付きのイベントが登録されます。

URIについて

URIの指定がAndroid2.2とそれ以前で違います。
  • Android2.2

    calendar :"content://com.android.calendar/calendars"

    event :"content://com.android.calendar/events"

    reminder:"content://com.android.calendar/reminders"

  • Android2.1まで

    calendar :"content://calendar/calendars"

    event :"content://calendar/events"

    reminder:"content://calendar/reminders"

サンプル


下記URLにサンプルコードを置いています。
https://github.com/gensuke/SampleCalendar

解像度について整理してみた

ldpi(Low)
120dpi
mdpi(Medium)
160dpi
hdpi(High)
240dpi
Small screen QVGA
Normal screen WQVGA,FWQVGA HVGA WVGA,FWVGA
Large screen WVGA,FWVGA
dip(Density independent pixel):密度に依存しないピクセル
pixels = dips * (density / 160)
320dpiの画面の端末では、1dipが2px扱いとなる。
解像度 端末
QVGA 240x320 TATTOO
WQVGA 240x400
FWQVGA 240x432
HVGA 320x480 HT-03A
WVGA 480x800 NexusOne
FWVGA 480x854 Xperia,Droid
参考:http://developer.android.com/intl/ja/guide/practices/screens_support.html

ATNDロイドを作ってみた

ATNDでイベントに参加していたりすると、補欠になったりする。
当日キャンセル待ちになったりするのだがブラウザで確認するのは面倒だ。

うんじゃ、Androidアプリつくればいいんじゃね?の流れで作ってみました。

機能は
一覧画面
 ユーザーの登録したイベント情報を表示する。
  参加状態(参加、キャンセル待ち、キャンセル)が確認できる。
 新着(新規、更新)イベントの表示する。
  新着画面の場合、イベント検索ができる。

少し詳細みれる画面
 イベント情報から住所のコピーができる。(地図アプリに貼り付ける用)
 ブラウザで詳細を確認しにいける。(ブラウザからイベントの参加を無理できる用)

となっています。
使ってみてください。
バグ、要望お待ちしております。

HT-03A、Android1.6のみで動作確認してます....。

モチベーション

1人もくもくと勉強をしたり、何か作り続けることは僕には難しい。
というわけで、僕は勉強するための準備段階として、「モチベーションを維持できる状況」を作ることを今更ながら重視するようになった。
というより、今までより意識的に行なうようになった。
そうすることで、心が折れにくくなるのであるー。


勉強し続けることができる環境を整える

やりたい、やってみたいと思ったことがあったら、できる限り早くそれを実現するための環境を整える。
興味のある参考書はすぐに買う。
環境整備ができなくても、常に興味がある事柄に意識が行くように仕向ける。
僕はこういった事をしないと、その間にモチベーションがずるずる低下してしまう傾向がある。


モチベーションが上がる場所に身を置く

自分1人で勉強しているとなかなか強烈な刺激を受けることがない。
勉強して自分の世界を広げているつもりが、実は自分の目の届く分野だけに閉じ篭っていたりする。
知識を共有していく仲間がいないと、「なんだかなー。」状態になってモチベーションが低下する。


例えば勉強会に参加すると、自分の知らない世界で活躍している方々と話す機会があったり、
皆さんモチベーションが高かったりする。
世界は広がるし、刺激を受けるわで僕のモチベーションは急上昇するのだった。
何より楽しい。(これ重要)
勉強会に出席することは、モチベーションにベホマをかけるようなものである。


継続する

継続大事。
一旦だらけると、モチベーションが急落してしまう。僕。
今現在、仕事が忙しくて家に帰ると眠くてどうしようもないけど(これ書いている時も眠い)、
勉強するという習慣は失くしたくないので、通勤や昼休みを使って少しずつ参考書を読み進めている。


楽しむ

楽しもう。


とりあえず、思いついたことをざっと書いてみた。
まだ他にもやり方は色々あるだろうが現状はこんなところ。


現在はモバイル用ノートPCを購入して、外で勉強できるような環境を手に入れようと考えている。