2011年1月9日日曜日

ブクログで探しちゃうブックマークレット

ブクログで配布されていた「ブクログに追加」ブックマークレットが、岩波書店のページとかその他でぜんぜん役に立たないことにイラっときてつくりました。

「ISBN : ~」とか「IEBN-10 : ~」とか「IEBN-13 : ~」とかの記述をページ内で探して、その情報をもとにブクログで書籍検索を実施します。そんだけです。

以下のリンクをブックマークバーなどにドラッグすれば、使えるようになるはずです。

ISBNをもとにブクログで探す

ISBNをもとにブクログで探す(ASIN・EAN対応)

※テスト用ISBN-13: 978-4791762460

AppWidgetの作り方

AppWidget(以下、ウィジェット)は、Androidアプリに組み込まれる形で配布され、ユーザーが自身の端末のホームスクリーン上に自由に配置できる小さなアプリです。

ウィジェットの定義ファイルのなかで、更新間隔を指定しておくことで、一定の時間間隔で表示をアップデートしていくことが可能です。表示の更新のタイミングが限られているため、「常駐アプリ」とはかならずしも分類できませんが、画面=Activityを持つAndroidアプリ本体の、高機能なランチャー程度には活用できます。

※より正確に言えば、ウィジェットとは、ユーザーがウィジェットを作成したときや、あらかじめ定められた時間間隔が経過したときに、Androidプラットフォームのシステム側からメッセージを受け取るブロードキャスト・レシーバー(AppWidgetプロバイダー)により初期化・更新されるView、です。

Androidアプリにウィジェットを組み込むには、以下のファイルが必要になります。

①AppWidgetProviderInfo (XML)
ウィジェットのメタデータを記述するもので、ウィジェットの表示を構成するためのレイアウト・リソース、表示更新の頻度、AppWidgetプロバイダー(後述)のクラス名を、XMLで記述します。

②AppWidgetProvider (Class)
ウィジェットの初期化などで呼び出される処理を実装するAppWidgetプロバイダー(ブロードキャスト・レシーバーの一種)の実装クラスです。

③レイアウト (XML)
ウィジェットの表示に使用されるレイアウト・リソースです。サイズの指定方法が独特?です。

④AndroidManifest(XML)
言わずと知れたAndroidアプリのメタデータやコンポーネントについての記述をするためのXMLです。AppWidgetProviderがブロードキャスト・レシーバーの一種であることから、記述の追加が必要になります。

以下では、Android Developpersのリファレンスのコードを参考に説明を行います。

1. AndroidManifestへの登録

Intentフィルターの部分と、AppWidgetプロバイダーのメタデータについて記述したXMLの在所を示す部分が重要です。
<receiver android:name="ExampleAppWidgetProvider">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />
</receiver>

2. AppWidgetプロバイダーのメタデータの記述

AndroidManifestで示した場所に、プロバイダーのメタデータを記述したXMLを配置します。

ウィジェットのサイズ指定の単位となるのは、Android端末のホームスクリーンをタテヨコ4分割した「セル」の幅/高さであり、Android Developpersでは、「(セル数 * 74) - 2」という数式が紹介されています。
この数値を、dp(画面密度非依存ピクセル)でminWidthとminHeight属性に指定することで、ウィジェットのサイズを指定します。ウィジェットは、ユーザーによりサイズ変更可能です。

updatePeriodMillis属性では、ウィジェット の更新間隔を指定します。単位はミリ秒となります。
更新は最短で30分以上の間隔を置いて実行されます。この属性に0を指定すると、更新は行われなくなり、後述のAppWidgetプロバイダーのonUpdateメソッドは、ウィジェット作成時にしか呼ばれなくなります。

configure属性は、ウィジェットにセッティング用画面がある場合のものです。ウィジェットが作成された際にここで指定したActivityが実行され、ウィジェットのプロパティを初期化すること出来るようです。(詳しくはこちらを参照。
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure">
</appwidget-provider>

3. ウィジェットのレイアウトを作成

ウィジェットのレイアウトで使用できるViewGroupとViewには制限があるようです。
ViewGroupについては、FrameLayout、LinearLayout、RelativeLayout。
Viewについては、AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextViewです。
ButtonやImageViewなどのほかに、AnalogClockなどが挙げられているのがおもしろいところです。

4. AppWidgetプロバイダーを実装

AppWidgetProviderクラスの中で、一番重要なのは、onUpdateメソッドでしょう。
このメソッドは、プロバイダーのメタデータの記述(XML)の中で指定した更新タイミングに呼び出されます。

また、より重要なこととして、 ユーザーによりウィジェットが画面に追加された際にも、このメソッドが呼び出されます。したがって、このメソッドの中でウィジェットの表示の初期化や、必要なサービスの起動などを実行することになります。

しかもです。このメソッドの第3引数は、AppWidgetインスタンスのID配列です。この点について、Android Developpersの説明では、大意以下のように述べています。
ユーザーは同じAppWidgetのインスタンスをいくつも作成することができる。例えば、あるAppWidgetが、2時間ごとに更新されるよう指定されていたとする。まず1つめのAppWidgetインスタンスがホームスクリーン上に作成され、その1時間後、もう1つのAppWidgetインスタンスが作成される。1つめのAppWidgetがスクリーン上に追加されてから2時間後、onUpdateメソッドが呼ばれる。しかしその1時間後(2つ目のインスタンスが作成されてから2時間後)にonUpdateが呼ばれることはない。更新のスケジューリングは、あくまでも1つめのAppWidgetインスタンスの生成を基準に行われる。
つまり、ここでupdatePeriodMillis属性があくまでもプロバイダーの属性であり、ウィジェットの属性ではなかったことがここで思い出されるわけですが、いずれにしてもこのメソッドはホームスクリーン上のすべてのウィジェットについて、その更新/初期化を一時に実施するものであるということです。

したがって、ウィジェットのボタンをクリックしたときに、アプリケーション本体となるActivityを起動する、といったことをする場合、以下のようなコードを記述すればよいことになります。
public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context,
        AppWidgetManager appWidgetManager, int[] appWidgetIds) {
       
        final int N = appWidgetIds.length;

        // このプロバイダーに所属するAppWidgetのそれぞれについて処理を行う
        for (int i=0; i
            int appWidgetId = appWidgetIds[i];

            // ExampleActivityを起動するIntentを生成
            Intent intent = new Intent(context, ExampleActivity.class);
           
            // それをPendingIntentに変換する
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

            // AppWidgetのレイアウト・リソースを取得
            RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.appwidget_provider_layout);
           
            // 第1引数にClickリスナーを設定したいViewのID、
            // 第2引数にClickされた際に発行されるPendingIntentを指定
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // IDで指定したAppWidgetの表示を、先ほど取得し、リスナーをセットした
            // RemoteViewsで更新する/初期化するようAppWidgetManagerに指示
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}
onUpdateメソッドに対応するものとしては、onDeletedがあります。
onDeleted(Context context, int[] appWidgetIds)

その他のメソッドとしては、onEnabled、onDisabled、onReceiveがあります。これらがonUpdateメソッド同様、あくまでもプロバイダーの生成~破棄までのライフサイクルに関わってくるものであり、AppWidgetの個別のインスタンスに関連するものではない、ということに注意してください。

これらのメソッドの解説は、Android DeveloppersのAPIリファレンスにあります。

2010年11月30日火曜日

Zen Codingを導入してみた

Amazonで、『HTML+CSSコーディングが10倍速くなるZen Coding』なる書物を見かけたので、ちっとばかり調べてみた。
ばりばり使うことがあるかというとかなり疑問だったけど、便利そうなので手もとのEmEditorやAptanaに導入してみた。


1. EmEditor


EmEditor向けにはマクロとして提供されている。
http://www.emeditor.com/modules/mydownloads/singlefile.php?cid=18&lid=281


上記ページで、FDマークの右の「Zen Coding macros and snippets」という部分をクリックすると、マクロのファイルがダウンロード可能。


同ページの手順書によると、

  1. 「マイドキュメント」フォルダに「My Macros」(MyとMacrosの間は半角スペース)というフォルダを探す。
  2. ない場合は、EmEditorでマクロを一度も使用したことがないことが原因と思われる。ない場合は、自分で作成してしまうこと(EmEditorで何でもいいのでマクロを記録、名前をつけて保存しようとすると自動で作成される)。
  3. My Macrosフォルダに、zen_emeditor.jseeをコピーする。
  4. もしスニペット・カスタムバーが表示されていなければ、メニューから<ツール→プラグイン→スニペット>をクリックし、表示する。
  5. スニペット・カスタムバーの上で右クリック<インポート/エクスポート→ルートにインポート>をクリック。
  6. zen-coding-en.eesnip(もしくは~ja.eesnip)を選択。
  7. もしスニペット・カスタムバーが表示されていない状態でもZen Codingマクロを使用したい場合は、<メニューからツール→プラグイン→プラグインの設定>をクリック。
  8. プラグイン一覧からスニペットを選択し、プロパティをクリック。
  9. 「バックグラウンドでも実行する」にチェックを入れ、OK。


(以上、意訳・補足あり)

これでZen Codingマクロが有効化し、「div#name」とか何とか入力してF12を押すと、コードの展開が可能になる。編集設定がCSSの場合はCSS向けのZen Codingも可能。
また、ほかにもコマンドがあるらしいけど、そこら辺は上記ページを確認のこと。



2. Aptana(Eclipse)


Aptana(Eclipse)向けには、プラグインの形式でリリースが行われはじめている。
以前、Zen Codingについて調べたときにはまだなかったように思うので、隔世の感?


プラグインは、以下のページで配布されている。
https://github.com/sergeche/eclipse-zencoding


インストール手順にしたがうと、

  1. メニューから<Help→Install New Software...>と進む。
  2. アップデートサイトのロケーションとして、http://zen-coding.ru/eclipse/updates/を追加する。
  3. 利用可能なプラグインのリスト中、「Zen Coding for Eclipse」(Uncategorized...→Zen Coding for Eclipse)にチェックを入れ、Nextボタンをクリック。インストール手続きを進める。
  4. インストール後、(Aptana/Eclipseに促されるまま)再起動する。

(以上、意訳・補足あり)


これだけで、Aptanaのテキストエディター中でZen Codingが使用可能になる。
例によって「div#name」とか何とか入力してTabキーを押すと直前のコードが展開されて、HTMLになる。
コマンドのショートカットのカスタマイズもできるっぽい。詳細は上記ページを確認のこと。

2010年8月22日日曜日

Scalaコードの強調表示定義ファイルの所在

Scalaのソースコードを編集する際に便利な、各種テキスト・エディタ向けの強調表示の定義ファイルの所在について、備忘録。
どこで見たのか忘れてしまった…というか確認作業が面倒なのでしないだけなのだけど、ともかく誰かさんのおかげで知りました。

Scala公式サイトで配布されている圧縮ファイルを展開してできたフォルダの、
scala-(バージョン・ナンバー).final > misc > scala-tool-support
に、VimやらEmacsやらNotepad++やら何やらかんやら、ともかく諸種ツールの名前のフォルダがあります。

Windows環境の場合、インストーラーをダウンロードして、手もとのPCにインストールする、ということもできます。その場合も、同じように、
C:\Program Files\scala\misc\scala-tool-support
などのフォルダをのぞくと、見つかります。

たとえばNotepad++向けのフォルダは「notepad-plus」で、この中にしまわれているXMLファイルを、Notepad++のインストール・ディレクトリか、
C:\Users\(ユーザー名)\AppData\Roaming\Notepad++
などにコピーすると(Windows 7の場合)、Scalaソースコード向けの強調表示ができるようになります。







Maven2.2 で新しいプロジェクトを作成する

Windows環境においてMaven2.2で新しいプロジェクトを作成する方法についてメモ。

Maven2での同手順については、以下のサイトなど諸処で解説されている。

■プロジェクトの作成 - Maven-THECHSCOPE
http://www.techscore.com/tech/ApacheJakarta/Maven/2-2.html

■Maven Getting Started Guide - Apache Maven Project
http://maven.apache.org/guides/getting-started/index.html

ようするに、Mavenをローカルにインストールし、mvnコマンドを実行できる状態にまでした上で
mvn archetype:create
-DgroupId=com.mycompany.app
-DartifactId=my-app

か(Maven-THECHSCOPEの場合)、
mvn archetype:create
-DarchetypeGroupId=org.apache.maven.archetypes
-DgroupId=com.mycompany.app
-DartifactId=my-app
を(Apache Maven Projectの場合)、実行するのだけど、どちらにしても警告が出る。

まず、「archetype:create」の部分は、「archetype:generate」が正しい(Mavenのバージョンのちがいによるものと思われる)。
また前者のコマンドを実行した場合、プロジェクトの構築中に、
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
と表示されて、アーキタイプとそのバージョンを、数字で選択するよう促される。アーキタイプについては、「org.apache.maven.archetypes:maven-archetype-quickstart:1.0」がデフォルトのようだったが、これは環境や、直前の操作に影響されるものかもしれない。

前者のコマンドの場合、アーキタイプとバージョンへの回答が済むと、あとは放っておけばプロジェクトの作成が完了する。後者の場合は、アーキタイプの選択をせずとも作業は完了する。

また、こちらのサイトでも述べられていたが、どちらのコマンドもそのままではPowershell上で実行できない。コマンドプロンプトでは問題ないが、Powershell上で実行する場合は、「-D○○」系のオプションを1つ1つ、「"」(ダブルクオテーション)で囲う必要がある。
(そうしないと、コマンドの構文解析に失敗するらしく、どう足掻いてもエラーになる。)

つまり、こうなる。
mvn archetype:generate
"-DarchetypeGroupId=org.apache.maven.archetypes" (アーキタイプ・グループID)
"-DgroupId=com.m12i.myapp" (デフォルト・パッケージ名)
"-DartifactId=my-app" (作成するプロジェクト名)
※コマンドは、可読性のために改行を施したが、実際に実行する場合はこれらの改行はなくする。