2012年11月17日土曜日

Windows7再インストール

自分のPCの調子が悪くなったのでOSをクリーンインストールすることにした。
何度か実施しているので特に問題ないだろうと思っていたら、また忘れていて
無駄な時間を費やしてしまった。

さすがに懲りたので備忘録を残す事にする。

■構成
OS: Windows7
CPU: Core i7
Board: X58 Extream6
SSD: システムディスク
HDD×2 データディスク

■手順
1) Windows7のDVDを入れて再起動する
2) CD/DVDからBOOTする
3) Windows7の新規インストールを選択して[次へ]を進める
4) Windowsのインストール場所を指定する
5) 以前のシステムパーティションを削除する
6) 未割当領域を選択して、新規にパーティションを作成する

NG :

以下のメッセージが表示されて、[次へ]ボタンがグレーアウトしているため
次に進むことができない。


「ディスク0パーティション1にWindowsをインストールすることはできません。」
「Windowsを選択された場所にインストールできません。エラー:0x80300001」


SSDドライバがインストールされていないためディスクが認識できないことが
原因だった。

7) [ドライバーの読み込み]ボタンを押下する
8) ASRock II58i-14 DVDに入れ替えて、[OK]ボタンを押下する
9) 以下のドライバーを選択して、インストールする
  →Marvell 91xx SATA 6G Controller (X58 Extream3)
10) Windowsのインストール場所を選択する画面に戻る

NG:

これで次に進めると思ったら、[次へ]ボタンがグレーアウトしたまま
上記のエラーメッセージも表示されたまま

先ほど入れ替えたASRock DVDのままだったことが原因だった
Windows7のインストールDVDに入れ替えることで解決した

11) [次へ]ボタンをを押下する

新しいシステムパーティションを作成できない、または既存のシステムパーティションが見つかりません。

悩む・・・
他のドライバを入れてみたがダメ・・・
ネットを調べるがイマイチ参考になるページが見つからない・・・
パソコンを最小構成にして試してみる事に・・・・

12) Windowsインストールを終了して電源を落とす
13) 電源コードを抜く
14) パソコンを開いて、2台のHDDに繋がっているコードを引き抜く
15) 再度電源コードをつないで、Windows7インストール場所選択画面まで移動する
16) [次へ]ボタンを押下する・・・OK
17) 何度か自動的に再起動して、Windowsのインストールが完了した
18) 電源を落として、電源コードを抜いて、先ほど外したHDD2台をつなぎ直す
19) Windowsを起動する

ここからは各種ドライバのインストールを行う

20) グラボのドライバをインストールする(2画面構成や解像度を合わせるため)
21) プリンタドライバをインストールする

今日はここまで



2011年12月20日火曜日

SeekBarのバージョン別動作

Androidアプリ開発を行う過程で、ScrollViewを利用した画面を開発する際に
SeekBarを合わせて利用する人もいると思います。
私の場合は、HorizontalScrollViewでページスクロール画面を作成し、
画面下部にSeekBarを配置して、ページの移動を実現していました。

このSeekBarの動作が、Android 2.3 までと、3.0以降では動きが違うことが
分かったので、書き留めておきます。

SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(this);

seekBar.setMax(最大値);

上記のように動的に初期化を行うことも多いと思いますが、
Android 3.0以降では、setMax() メソッドを実行した直後に、

以下の処理を実行します。
※Android 2.3までは、上記の処理を実行しません。



@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean flag){

  //つまみを移動した時の処理

}

具体的には、以下のような値がセットされます。

i = 0;
flag = false;

私の場合は、setMax() メソッドを呼び出したタイミングで、つまみを移動
したときの処理が実行されてしまい、その結果、横スクロールビューが、
1番左に遷移するという事象になっていました。

これを回避するためには、以下のようにすれば大丈夫です。


@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean flag){

    if( flag ) {
   
      //つまみを移動した時の処理

    }

}

flag には、setMax() によって初期化された時は「false」が設定されるようです。
ユーザがつまみを移動させた時は、「true」が設定されるので上記のように
指定することで初期化の際に想定外の動作が実施されることがなくなります。








2011年11月9日水曜日

AsyncTask 便利だけど注意が必要

Android アプリケーションを開発していると、AsyncTask を利用する機会が
たくさんあると思います。

私が良く使うのは、GridViewやListViewに写真を表示する場合に、
処理時間の掛かる画像ファイルの読み込みを別スレッドで実施するために
AsyncTaskを利用しています。

この時、気をつけなければいけないのはAsyncTaskの呼び出し数です。

例えば1000個の画像ファイルを取得したい時に、1個のファイル毎に
AsyncTaskを呼び出す処理を、for文で実行したりすると
RejectedExecutionExceptionが発生します。
(そんなバカなことをするのは私だけか)

以下のように try~catch で囲んでおきExceptionが発生した場合には、
無視したり、一定時間後に再実行するなど予め対策しておけば問題
ありません。

SampleTask : AsyncTask
try {  SampleTask sampleTask = new SampleTask  sampleTask.execute();} catch(RejectedExecutionException e){  [ユーザ処理]}

2011年11月7日月曜日

ImageView.setImageURI() の動作

自分のAndroidアプリにカメラ機能をつけたいと思った時は、
2つの選択肢がある。

1.sarfaceViewを使って、独自のカメラ機能を作りこむ
2.標準カメラをIntent呼び出しする

どちらの選択肢にもメリット・デメリットはあるが、

画面デザインの統一感や、ギャラリーには保存したくないなど
細かい設定が必要でなければ、「2」をおすすめする。

カメラ機能は、各メーカーで独自仕様のため、「1」を選択すると
思わぬ苦労を背負い込むことになる。

私が「1」を選択した時は、以下のような状態になった・・・

<正常>
IS04(2.1)
IS04(2.2)
GaraxyS(2.3)
Xperia Arc(2.3)

<異常>
HTC Desire HD(2.3)
HTC EVO(2.2)

もちろん一つずつ対応していくことは可能ではあるが、
それには、新しい端末が発表されるたびに動作確認しなければならず
膨大な手間と実機の準備が必要になる。

この時は、「2」を選択することになった。

ただし、「2」を選択しても、考慮すべきことは色々ある。
そのうちの一つである、タイトルに記載した内容について
以下に簡単にまとめる。

ここから、ようやく本題

2つのActivityが存在しており、ここでは「A」と「B」とする。
以下のような処理を行った際に、「2.1」と「2.2」では動作が違うようです。

A で標準カメラ機能を使って撮影した画像のUri オブジェクトを
B にIntentで受け渡し、渡されたUri オブジェクトを使って画像を表示する。

<Aの処理>
File file = new File(dir, filename);
Uri uri = Uri.fromFile(file);
Intent intent.setData(uri);

<Bの処理>
Uri uri = getIntent().getData();
ImageView img = (ImageView) findViewById(R.id.testImg);
img.setImageUri(uri);

上記のコードは、2.2では正常に画像が表示される。
しかし、2.1では特にエラーにはならないが画像は表示されない。

<Bの処理>
Uri uri = getIntent().getData();
File file = new File(uri.getPath());
ImageView img = (ImageView) findViewById(R.id.testImg);
img.setImageUri(Uri.parse(file.toString));

このように書き直すと、2.1、2.2の両方で画像が表示される。

2.1 では、Uri.fromFile() と Uri.parse() で取得できる情報に違いがあるのか・・・
時間ができた時にでも追いかけてみたい。

2011年11月5日土曜日

第5回 Google Developer Days

2011年11月1日に、パシフィコ横浜で開催された「Google Developer Days
に参加してきました。
今年は、世界8カ国で開催されていますが、毎年、開催国は変わっているようです。
そんな中、日本は5回連続で開催されるほどGoogleにとって
日本という国は重要な 位置づけにあるようです。 

こちらに参加するためには、様々な方法がありますが、最もメジャーな方法は、
「DevQuiz」というクイズに答えて正解得点を競うというものになります。

 私は、150点満点中の116点で参加できました。
どうやらボーダーラインは101点以上だったようです。
 満点で参加された強者達もいたようです。 

これは、開発者を対象としているため、出題された問題の回答をプログラムで
作成して提出するという形式になります。
期間は、1ヶ月ぐらいありますが、その間は、Twitterも盛り上がりますので、
お祭り好きなエンジニアは、ぜひ次回は参加してみて下さい。

当日は、朝9時から並んで色々貰ってきました。
Tシャツ、缶バッヂ、スマートフォンコントローラー(zeemote)・・・
















缶バッヂは、最初に10個同じものを渡されて、それを会場の人たちで
交換しあって、揃えていくというゲームになっていました。
すべて揃うと、先着順で更にプレゼントが貰えるという特典付き。

交換という名目でエンジニア同士の交流が進むので以外と面白かったと
思います。
残念ながら私は9個しか揃わなかったので、プレゼントが何だったのか
分かりません。でも十分楽しめました。

基調講演および各セッションは、同時通訳付きなので英語が分からない
人にも十分楽しめました。
開発中のデモもたくさん見せて貰いましたが、Android、Google Apps、
Chrome、Google+などなど、これからが凄く楽しみになりました。













会場では、技術だけでなく、プレゼンも上手いエンジニアにたくさん
会うことができました。
まだまだ学ぶべきことが多いということを実感しましたし、
よい刺激を受けることができました。

エンジニアって楽しいなと思える空間でしたので、
ぜひ多くのエンジニアに参加してほしいです。

参加枠が限られているので競争率が上がりますが、
次回も参加するべく頑張りたいと思います。

2011年1月31日月曜日

Google Data API について

Androidアプリ開発をしていて、悩んだ点についてリマインドの意味も込めて
記事にしておきます。

***********************************************************************

Googleドキュメントと連携するサンプルアプリとして、

IDとパスワードを固定値で渡して認証させた後に、一覧を取得するようなものを
イメージしていました。

すぐに終わると思っていましたが、長い道のりになりました。

***********************************************************************

Web上でサンプルソースを探すと、以外と簡単に見つかったので、
それらを参考にしながら手を加えていきました。

最初に外部JARファイルとして読み込んだものが「gdata-java-client」でした。

これを利用しているサンプルソースは多く、比較的スムーズにサンプルアプリ
の開発は進みました。

プログラムのコンパイルエラーをすべて取り除き、あとは起動するだけ
というところまで来て、プロジェクトがエラーになっていることに
気づきました。

しかし、プログラムにはエラー箇所が見当たらない!!

なぜだろうと思って調べ始めてからが、長くなりました。
もっとも、嵌ったのが「GoogleTransport.java」です。

色々と調査した結果、Android用に「gdata-android-2.2.1-alpha.zip」
というライブラリが存在しており、こちらを使えば良いということが
分かりました。

早速、ライブラリをダウンロードしてコンパイルをすると、
以下のコードがエラーとなります。
(create()がないと言われる)

HttpTransport transport = new GoogleTransport.create();



さらに調査を進めるとGoogleTransportクラスが

「gdata-2.2.1-alpha-client-googleapis.jar」

に存在していることが分かりました。

しかし、該当のJARファイルを外部JARファイルとして登録しても
エラーは消えません。

create()が存在しないのかと思い、GoogleTransport.javaをWeb上で調査すると
createメソッドが、ちゃんと記載されています。

ライブラリのバージョンを変更してみたりもしましたが、状況は改善せず
悶々としている間に、時間だけが過ぎて行きました。

最終的に以下の2つのファイルに入っているGoogleTransportクラスの
中身が違うということに気づくまでに大分時間が掛かってしまいました。
「google-api-client-googleapis-1.2.2-alpha.jar」
「gdata-2.2.1-alpha-client-googleapis.jar」

同じファイル名だから、同じ内容という先入観が無駄な時間を・・・orz
これを超えた後は、比較的スムーズにサンプルアプリが完了しました。


今回、調査の過程で雑多な知識をちょっとだけ得られたので、キーワードを
羅列しておきます。
どうやらGoogleやTwitterといった最近のWebサービスはBASIC認証ではなく、
oAuthやxAuthといった認証方式を採用しているらしい。
またAndroidではAcountManagerを利用することでGoogle連携を比較的簡単に
実装することができるようです。
しかしAcountManagerは、エミュレーターでは動作しないので注意が必要です。

以上、簡単な振り返りでした。

2010年12月28日火曜日

スカイツリーのライトアップ

12月24-25日の2日間スカイツリーがライトアップされました。

とりあえず撮影してみました。


日常の風景とは違って、なんだか映画の舞台になりそうな怪しげな雰囲気…
現在の日中の様子は、こんな感じです。


完成すると、夜はこんな感じになるらしいのですが…
早く見てみたいですね。