2012年11月19日月曜日

平成24年秋季試験のリリースを始めました

すでに秋の試験から1ヶ月が経過して、本日19日は基本情報技術者試験の合格発表日ですね。
受験された方はいかがでしたでしょうか?

基本情報のアプリは最近更新を怠っていて申し訳なく思いますが、現在作業中です。
ITパスポートも含めて年内には最新版にアップデートしたいと思っていますが、なかなか作業が進まないのは、ひとえに怠け者の私がいけないのですが・・・


さて、昨日の夜にはお約束通り「応用情報」「高度情報 午前」「ネットワーク 午前Ⅱ」「セキュリティ 午前Ⅱ」のアップデートをリリースいたしました。
また、新たな試験の追加はありませんが「データベース」「プロジェクトマネージャ」についてはバージョンアップしました。

秋季試験問題を含めて、タグ管理の機能アップやヘルプ画面の追加などを行って使いやすさも多少ではありますが向上したと思います。




今回のアップデート作業で、開発者の間で割と頻繁に発生している「akpファイルのアップロードができない」というトラブルに遭遇しました。以前にも遭遇したのですが、その時はアプリのサイズを多少変えてあげるとアップロードできるという結果になったので、今回もその方法を取ってみましたがアップロードすることは出来ませんでした。

18日の9時頃にアップロードを行ったのですが、2本成功、2本失敗という状況でした。
基本的に情報処理試験用アプリはソースは共通で試験データだけが異なるという作りですからアプリのチェックでエラーになるなら全てのアプリがエラーになりそうなものですが、そういううわけではないようです。

アップロードできなかったアプリのサイズを変更してみたりといろいろと試みるも全てエラーとなってしまいます。
10時頃まで試みてみましたが、用事があったので断念して外出してしまいました。


夕方に帰宅して午後9時頃に再度トライしてみましたが、やはりエラーとなるので、「データベース」「プロジェクトマネージャ」についてもアップロードを試みましたが同じようにエラーとなります。

ただ、9時頃にはアップロードを始めるとすぐにエラーとなっていましたが、10時前になるとアップロードを始めてすぐにエラーとならずに、多少アップロードを行ってからエラーになるようです。


そうこうしている内に、突然アップロードが成功しました。

成功したとたんに、いままで失敗していたアプリも全て成功するようになったのです。

時計を見て見ると午後10時を少し回っていました。


以上のことから、アメリカ太平洋時間の日中(日本時間午前9時はアメリカでは午後4時)から早朝午前5時(日本時間の午後10時)までは日本からのアップロードがしずらい状況なのかもしれないなと言う結論になりました。

おそらくアメリカの日中はサイトへの負荷が高くて(それぐらいでトラブルようなサーバではないと思いますが)、深夜から早朝まではバックアップ作業を行っていて、終わった途端にアップデートできるようになったのかな?といった感じです。

ネットを検索してみると、ブラウザを変えたらうまくいったとか、-app.xmlファイルの記述を直すとうまくいったといったようなサイトが見受けられましたが、どうもそれらが原因でもなさそうです。
Google側が何もいってませんので実際はわかりませんが、どうやらGoogle側に原因がありそうな感じですね。


とりあえず私は午後10時以降にアップデートするようにしてみたいと思います(笑)

2012年11月11日日曜日

勉強への長い道のり

さて、購入した参考書はいまだカバンの肥やしとなっていて、ダンベル代わりとしてか機能していません(笑)

現在は、アプリのバージョンアップ作業に追われて(といってもその作業も思うように時間が取れないのですが)勉強をする時間も取れない状態です。

今改良している点は以下の3点です。

1.操作説明の追加

アプリの操作について判りづらいというご意見もよせられていますし、隠し機能的な物もあるのでアプリ起動時の画面に「ヘルプ」をメニューに追加しました。
出来るだけわかりやすく説明したつもりですが、リリース後にご意見をいただければ順次改善していきたいと思います。

2.タブの一括設定

間違えた問題にタグをつけて管理したい場合、現状ですと1問1問タグの設定が必要ですが採点後に間違った問題に一括してタグを設定できるようにしました。

3.検索機能の復活

当初は検索機能があったのですが、いつのころからか検索機能(メニューの検索です)が使えなくなっていました。従来(1.6の頃)は単純なコーディングで実現できていたのですが、Androidのバージョンアップ時に仕様が変わったようです。
今回、テストをしている中で検索が機能していないことを発見しました。(自分でも使っていなかったので発見が遅れてしまいました)
とりあえず、現状の仕様に合わせて検索できるようにしましたが、表示される検索ダイアログのデザインについていまひとつ満足しています。デザインはAndroid側で固定で決まっているようですが、Googleの検索ウイジットのようなデザインがよかったのですが、ちょっとちょっとのデザインとなっています。時間を見つけて今後改良していきたいと思います。

これと平行して、秋の試験問題の書き起こしを行っています。

あと1週間程でまずは第一弾として、「応用情報」「高度午前Ⅰ」「情報セキュリティ」をリリースしたいと思います。

残りは11月末までにはリリースしたいと思っています。いましばらくお待ちください。




検索機能については従来

onSearchRequested();

を呼び出すだけで実現できていましたが、以下のような修正をしないと動かなくなったようです。



1.以下のような「searchable.xml」を「res/xml」フォルダに作成します。これは検索時に表示されるダイアログについて指定しています。詳細はこちらを参照してください。

<searchable
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:label="@string/search_label"
  android:hint="@string/search_hint"
  android:imeOptions="actionSearch"
  android:searchMode="showSearchLabelAsBadge"
  android:inputType="text"
  android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" >
 </searchable>



2.AndroidMmanifest.xmlの中で検索機能を持つActivityを以下のように修正します。

<activity android:name=".MyActivity" android:label="@string/app_name"
            android:launchMode="singleTop">
 <intent-filter>
    <action android:name="android.intent.action.SEARCH" />
  </intent-filter>
  <meta-data android:name="android.app.default_searchable"
  android:value=".MyActivity" />
  <meta-data android:name="android.app.searchable"
  android:resource="@xml/searchable"/>
</activity>

検索を呼び出すと検索ダイアログで入力された情報はmeta-data android:name="android.app.default_searchable"で指定されたActivityに引き渡されます。ここでandroid:launchMode="singleTop"の指定が無いと検索が呼び出されるつど新たなActivityが生成されてしまうのでsingleTopを指定する必要があります。
<intent-filter>は、その時のインテントを受け付ける為の指定です。また、meta-data android:name="android.app.searchable"で1.で作成したsearchable.xmlを指定しています。



3.onSearchRequested();を呼び出す。
今回はメニューから検索機能を呼び出しているのでメニューで検索が選択された時の処理としてonSearchRequested();を呼び出すようにしています。



4.検索ダイアログで入力された文字列を受け取って、インターネット検索を行う。

@Override
protected void onNewIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
    startWebSearch(query);
}
}

検索ダイアログに入力された検索用文字列はインテントandroid.intent.action.SEARCHとして送られてきます。通常はActivityのonCreateでインテントが引き渡されますが、singleTask の場合、はonNewIntentメソッドが呼び出されるので、ここで検索ダイアログで入力された文字列を取得して必要な処理を行います。