2012/05/23

調べたい書籍をAmazonからワンクリックで図書館を検索できるブックマークレット

Amazon や 楽天などで本を探していたとき、もし、その本が近くの図書館に在庫があった場合に無料で借りることができるのは非常に便利だと思ったので、ブックマークレットを使ってワンクリックで調べられるようにしました。

ブックマークレットとは、
ブックマークレット (Bookmarklet) とは、ユーザーがウェブブラウザのブックマークなどから起動し、ウェブブラウザで簡単な処理を行う簡易的なプログラムのことである。
ブックマークレット - Wikipedia

上の説明でも分かりづらいかもしれません。

とりあえず、今回作成したブックマークレットは、Amazon や 楽天で書籍を見ているページのISBN-10(またはISBN-13)をもとに、カーリルという図書館検索サイトの図書館API(OpenURL)を利用し、それをjavascript を用いて開いています。

そのおかげで、Amazon のサイトを見てるときにブックマークレットをワンクリックするだけで自分が調べたい図書館の在庫を確認することができます。

■はじめに
まずはカーリルで「図書館の設定」をクリックし、「お気に入りの図書館」を登録しておきます。
複数登録できるので、県内の図書館を登録しておくとよいでしょう。理由は、県内の図書館であれば、違う図書館からも借りることができる場合があるからです。

■手順
  1. カーリル検索のリンク先を「右クリック」して「リンク先をブックマーク」を選択する
  2. ブックマークツールバーに追加する(と便利です)
  3. Amazon や楽天などで本を探す
  4. 本のページでブックマークツールバーに登録したブックマークレットをクリックする
  5. 新しいウィンドウが開いて図書館の在庫を検索する
以上、firefoxでの手順を書きましたが、IE や Google Chrome の場合も似たようなものだと思います。

よくよく調べたら、同じようなのがありました。
わずかに動作違うので(新しいウィンドウを開くか同じウィンドウで開くかの違い、など)、好きなものを利用すると良いと思います。

■参考サイト
OpenURL for カーリル | カーリル
http://calil.jp/doc/api_openurl.html
GreasemonkeyでAmazonから探せる図書館まとめ - Myrmecoleon in Paradoxical Library. はてな新館
http://d.hatena.ne.jp/myrmecoleon/20070627/1182958284

2012/05/17

Swing を使うなら、おさえておきたい3つの日本語サイト

Swing を使うなら、おさえておきたい3つのサイトを紹介します。
これらのサイトを知っていれば、Swingを扱うことが容易になるでしょう。

Javaの学習ならJavaDrive
http://www.javadrive.jp/

「Javaの学習ならJavaDrive」というトップページにふさわしく、Swingの学習を始めるときにはJavaDriveのSwingの項目を見ると良いです。
使いたい部品(コンポーネント)の一番小さいひな形を使うのでどのメソッドを使えばよいのか、どのパラメータを渡せばよいのかが非常に分かりやすいです。


Java Swing Tips - てんぷらメモ
http://terai.xrea.jp/Swing/

『最も欲しいものはサンプルである』とトップページに書いてあるように、まさにすぐに動作を確認できる実行ファイルがついてあります。jarファイルを実行し、自分の作りたいもののイメージにあっていればソースコードをダウンロードして、自分のプログラムに組み込んでいく。そういったことができます。

JavaDriveで部品の仕組みを学び、それをどうやって使っていくかを学ぶ上で非常に有用なサイトです。

さらに驚くべきことは、現在(2012/05/17)も更新が続いていることです。絶え間なくSwingの新しい使い方を知ることができるでしょう。


Java Swingメモと改造(Hishidama's Java Swing Memo)
http://www.ne.jp/asahi/hishidama/home/tech/java/swing/index.html

新しいことを学ぶ上では、どうしても分からないことが出てきます。また、Swingの仕組みなどさらに突っこんで学ばないと、自分の作りたいものが作れないということが出てきます。

そのときは、Hishidama's Java Memoのサイトを見ると良いでしょう。
トラブルの対処の仕方やSwingをより深く扱う方法が書かれています。

JavaDriveで部品を学び→てんぷらメモで組み合わせ→Hishidama's Java Memoでまとめ→JavaDriveで・・・


以上のサイトにより、皆さんがSwingをよりよく学び、使えるようになれればと思います。

2012/05/16

【Processing】eclipse上での開発でフルスクリーンを行うためのだいたい3つぐらいの方法

■まえおき
Processing(1.5.1)は自前でIDEを持っており、ソースコードの拡張子はpdeです。
中身はJavaなのですが、電子アートやビジュアルデザインを目的に作られたこともあり、簡単にコーディングできる反面、あまりJavaらしい開発(?)ができないと感じています。

そこで、私はPAppletを継承してeclipse上で開発しています。その方法はgoogleで検索すればでてきますので割愛しますが、要点を3つ挙げます。
  1. processing-1.5.1/lib/core.jarをライブラリに読み込む(その他必要がなれば追加する)
  2. PAppletを継承する
  3. 実行はJava アプレットで起動する
■本題 
さて、Processingで開発したものをフルスクリーンで表示したいとき、ProcessingのIDEでは「Sketch」メニュー>「Present」でフルスクリーンで表示することができる(*1)。また、ライブラリとして個人の人が開発したAPIが提供されている。
FullScreen API For Processing

このライブラリは
processing-1.5.1\modes\java\libraries
に配置する。
ライブラリの設定は、Javaプロジェクトを右クリック>プロパティでプロパティを開き、Java のビルド・パスを選択し、ライブラリー>外部 Jar の追加ボタンをクリックし、さきほど配置したライブラリを選択し、OKボタンを押すと追加できる。

以上のステップでfullscreenのAPIが利用できるようになるので、さっそくサンプルと同じように記述してみる。

import fullscreen.*;

FullScreen fullScreen;  @Override
  public void setup(){
    size(640, 480);
 
  frameRate(5);

 
  // Create the fullscreen object
 
  fullScreen = new FullScreen(this); ・・・(*2) 
 
  // enter fullscreen mode
 
  fullScreen.enter();
}


  @Override
  public void draw() {

    // 省略
  }


さて、Java アプレットとして起動すると、(残念なことに)以下のエラーが出る。

Exception in thread "Animation Thread" java.lang.NullPointerException
    at fullscreen.FullScreen.(FullScreen.java:93)
    at fullscreen.FullScreen.(FullScreen.java:108)
    at jp.sample.fullscreen.SampleFullScreen.setup(SampleFullScreen.java:17)
    at processing.core.PApplet.handleDraw(Unknown Source)
    at processing.core.PApplet.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:662)


(*2)で FullScreenのインスタンスを作成している際、FullScreen.javainitメソッドjava.lang.NullPointerException が発生している。

public FullScreen( PApplet dad ){{
  this( dad, 0 );・・・(108行目)
}

public FullScreen( final PApplet dad, int screenNr ){
    super( dad );
    this.dad = dad;
    // 一部省略

    fsFrame = new Frame( dad.frame == null? "":dad.frame.getTitle() );
    fsFrame.setTitle( dad.frame.getTitle() ); ・・・(93行目)
    // 以下省略
}


この93行目のdad.frame.getTitle()java.lang.NullPointerException が発生している。正確には dad.frame がnull である。

この java.lang.NullPointerException が発生しないようにする対策はぱっと思いつくもので2つあると思う。
  1. dad.frame にインスタンスを与える
  2. 93行目を削除し、自分でFullScreenのAPIを再ビルド、fullscreen.jarを作成する(未検証)
 1の方法は実際にやってみてある程度の成果が挙がっている。2に関しては予想した範囲でやり方をまとめる。

■1. dad.frame にインスタンスを与える
(*2) で FullScreen のインスタンスを作成する前に、以下のプログラムを1行追加する

this.frame = new Frame( "" );// ""には文字列を入れてもよい

これで93行目で null ではない(dad は this を参照している)のでエラーが発生しなくなり、フルスクリーンすることができる。
しかし、新しいフレーム ができる・・・ようは2つのウィンドウが起動している状態になるので少しスマートではないのが惜しむところ。動作自体は特に問題はないと思う。

もしかしたら、最初に立ち上がるウィンドウを this.frame に与えればよいかもしれない。


■2. 93行目を削除し、自分でFullScreenのAPIを再ビルド、fullscreen.jarを作成する(未検証)
93行目の行っていることは、フルスクリーンのフレームのタイトルに名前をつけるだけであり、また92行目でタイトルを設定しているので余分な処理である。

FullScreen APIのソースコードは配布されているので、ソースコードをダウンロードし、93行目を削除して再ビルドを行い、fullscreen.jarを作成することで java.lang.NullPointerException は発生しないと推測している。


以上、いずれかの方法でeclipse上でProcessingの開発を行ってもフルスクリーン化することができる。
これでまとめを終わりたいところであるが、その他の方法もあるので少しだけ触れたい。


■3. その他の方法
さて、ここで(*1)を思い出してほしい。ProcessingのIDEは「Present」で fullscreen.jar を使うことなくフルスクリーンを行っている。
したがって、「Present」で行っていることと同じようなアプローチをすればフルスクリーンできることが推測できる。

processing.core.PApplet.java,  processing.mode.java.JavaEditor.java, processing.mode.java.PresentMode.java

などのソースをおっかけてみると良いと思う。
もしくは、自前でフルスクリーンを実装する。以下のサイトを参考にすると良さそう。
フルスクリーンモード  - 人工知能に関する断創録

Processingのソースを解析してみると、上のサイトと同じようなことをやっている(当たり前と言えば当たり前だが)。


■まとめ
1の方法が手軽です。


2012/05/15

SwingのJFrameのアイコンに null を入れるとアプリのGUIが表示されない

SwingのJFrameのアイコンに null を入れるとアプリのGUIが表示されませんでした。


JFrame frame = new JFrame( "title" );
JPanel panel = new JPanel();
URL url = panel.getClass().getResource( "logo.png" );
frame.setIconImage( Toolkit.getDefaultToolkit().createImage( url ) );

■対策
urlに null だった場合、GUIが表示されないままメモリに常駐してしまう。
なので、null チェックを入れておくことでGUIが表示されない状況を防ぐことができる。

if ( url != null ) { frame.setIconImage( Toolkit.getDefaultToolkit().createImage( url ) );
}
else {
  // どうしても固有のアイコンが表示したい場合は別のアプローチでアイコンを設定する
}

■誘因
今回、urlに null が入ってしまったきっかけはpanel.getClass().getResource()を呼び出した際、ダブルクリックでjarを起動する場合と、eclipse上またはコマンドプロンプトから起動する場合で挙動が変わったためでした。

jarファイル内は
  • example.SamplePanel
  • logo.png
というようにexampleパッケージ内にSamplePanelクラスがあり、logo.pngはjarファイル直下に配置してありました。
そして、下のようにlogo.pngを読み込みました。

JPanel panel = new SamplePanel();
URL url = panel.getClass().getResource( "../logo.png" );

この場合、eclipse上で実行を行った場合と、コマンドプロンプト上で
java -cp sample.jar example.SamplePanel

と入力して実行した場合は、GUIも表示されて起動する。しかし、jarファイルをダブルクリックした場合はGUIが表示されないがメモリには常駐している状況が発生する。そして、jarファイルと同じフォルダ上にlogo.pngがある場合、GUIが表示された。
つまり、ダブルクリックした場合とeclipse上での起動の場合の参照位置が異なるようだ。

■実験結果により推測されること(panel.getClass().getResource())

・eclipse上またはコマンドプロンプトから起動する場合
 ・exampleパッケージが起点

・jarファイルをダブルクリックで起動するの場合
 ・jarファイル直下が起点

という違いがあること。
もし、パッケージを使用せずデフォルトパッケージであれば差異は発生ないが、デフォルトパッケージは推奨されていないことからpanel.getClass().getResource()は使用しないのが良いと思う。


getClassLoader()を使用する
ここで、getClassLoader()を使用した場合、
URL url = panel.getClass().getClassLoader().getResource( "logo.png" );

・eclipse上またはコマンドプロンプトから起動する場合、jarファイルをダブルクリックで起動するの場合、ともに
jarファイル直下が起点であった。
このことから、JFrameのアイコンを読み込む場合はgetClassLoader()を使用すると良い。

ClassLoaderについては以下のサイトを参考にしてほしい。

■その他
できれば、res/logo.pngと配置したいのですが、Antを使わずにeclipseの設定のみでできる方法があれば教えてほしいです。

2012/05/12

PhotoshopではなくGIMPで短時間で加工するためのたった一つに特化したTIPS

今月GIMP2.8が公開された中、 もしも、PhotoshopではなくGIMPで加工したいと考えている人に送る、たったひとつの事柄に特化したTIPSをまとめます。

たったひとつというのは、下のサイトではPhotoshopで見開き写真を作るための方法を

見開き写真のつくりかた | Photoshopで加工する | かわいいフォトブック“TOLOT”にパソコン版アプリ登場!!

GIMP2.6(2.8)を使用してできる限り手早く作成する方法です。

まずは、上のサイトで tolot_spread_template.zip をダウンロードして任意の場所に解凍してください。
GIMP2.6や2.8では psd ファイルを読み込むことができます。

対象の画像はデジカメなどで撮れる4:3の比率の写真を前提として考えています。

■手順
  1. tolot_spread_template.psdをGIMPで読み込む
  2. 分割したい画像をドラッグ&ドロップで追加する
  3. 画像のレイヤーを右クリックし、「レイヤーの拡大・縮小(S)」を行う
  4. 2836 の値を入れる。高さは自動で設定されるようにしておく(ここでは高さが 2122 が良いが、近ければ良い。多少切れるのは覚悟。ムリして合わせると画像がひずむ
  5. 「左ページ用画像範囲」レイヤーを右クリックし、「不透明部分を選択範囲(P)」を選択する
  6. 画像のレイヤーを選択し、コピー(Ctrl+C)を行う
  7. 「ファイルメニュー>画像の生成>クリップボードから」を選択し画像を生成する
  8. jpgで保存(※)を行う(サイズは幅1530,高さ2120になっている)。ファイル名は"xxxx_l.jpg"
  9. 「右ページ用画像範囲」レイヤーに対して、4~7の操作を行う(ファイル名は"xxxx_r.jpg"
  10. 両方の画像を生成したら、最初に追加した画像レイヤーを右クリックから「レイヤーを削除(D)」を行う
以上の手順で見開き写真をつくることができる。あとは、2~10を繰り返せばよく、ショートカットキーをいかに使うかで時間短縮できる。
※GIMP2.8はGIMP2.6に対して保存に手間取ってしまう。というのも、GIMP2.6は Ctrl+S で jpg でファイルを保存できるのに対し、GIMP2.8では Ctrl+S は xcf ファイルのみのため、jpg で保存するには Shift+Ctrl+E でエクスポートしなければならない。


作業スピードを求めるためにはアスリートになったつもりでとにかくスピーディに無心にやると良いです。私が1枚の画像を2つに切り分ける作業にかかった時間は2分~3分ぐらいでした。

数枚であればよいでしょうが、しかしながら面倒です。

 もし、見開き写真のために画像を2つに切り分けたい場合は、キリット(仮名)という自動切り分けツールを使用することをおすすめします。
自分用に作ったのですが、なかなか便利なので近いうちに公開したいと思います。公開しました!(2012/06/09追記)
Kilit(キリット) for TOLOT

単純に写真を分割するのではなく本の中央の溝を考慮しているので、実際に本を手にしてみたときにより自然に見えると思います。

2012/05/11

GIMP2.8ではPython2.7が利用できる

GIMPでPython-Fuを利用するためには、Pythonを入れることはもちろん、いくつかのライブラリを入れる必要がある(ライブラリのインストールについては前の記事 PythonのPyGTKなどのライブラリがWindows 7(64bit)にインストールできない  を参考にしてほしい)。

しかし、Python2.7をインストールしている場合、 GIMP2.6のカスタマイズインストールにおいて、 GIMP Python extensionには

"The following Python versions are supported: 2.5, 2.6"

と表示される。
そのため、GIMP2.6ではPython2.7が利用できない

Python2.7をアンインストールし、2.6をインストールすれば解決すると思うが、その手は取りたくなかった。

そして、運が良かったといえる。
今月GIMP2.8がリリースされ、Python2.7に対応していた

■手順
  1. GIMP2.8をサイトからダウンロードする
  2. GIMP2.8をインストールを開始すると、GIMP2.6がアンインストールされたのち2.8のインストール作業が始まる(現時点では英語のみ)

今回、カスタマイズインストールを行うことなくPython-Fuが利用できるようになったが、これは予めPythonやライブラリが入っていたかもしれない。
描画にCairoが使われるようになったらしく(技術者見習いの独り言: GIMP2.8リリース その1)、もしかしたらPython-Fuのライブラリなどを入れなくてもよくなっているかもしれない。

追記(2012/05/12)
Python-Fu>console を起動したら

GIMP 2.8.0 Python Console
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]
>>>


のように表示されてたので、私が入れている 

Python 2.7.3(default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32

は呼ばれてないようです。
ということは、GIMP内にあるPythonを利用しているのだと思うので、上の仮説は当たっているかもしれません。
(追記ココまで)


GIMP2.8の雑感:メニューの文字のフォントが変わった模様。 


追記(2012/06/09)
実際にPythonでコーディングを行うにあたっては、ネットで検索して調べるのはもちろんですが、私は「Python クックブック」という本を利用しています。
文字列の操作、ファイルの操作、XMLの処理などなど、行いたい処理について小さくまとまっているので便利です。
プログラミング初心者というよりも、ほかの言語を習得している方向けの本です。

PythonのPyGTKなどのライブラリがWindows 7(64bit)にインストールできない

Gimp2.6のマクロを作ろうと思い、ここを参考にPython-Fuを使うために必要なライブラリ「PyCairo」「PyGObject」「PyGTK」をインストールしようとするも、

"Python version 2.7 required, which was not found in the registry."

 と表示され、インストールできなかった。

上の文字列を検索すると、以下のページが見つかり、その解決策を実行したら無事インストールできたので、詳細は以下のサイトを参考にするとよい。
Yamada Program: Pythonのsetuptools を 64bitマシンにインストール
が、上記サイトが消えた場合も考え、手順をまとめておく。

■手順
  1. regedit を起動する
  2. HKEY_LOCAL_MACHINE¥SOFTWARE¥Python を右クリックし、エクスポートを選択して保存する
  3. 保存した regファイルをテキストエディタで開き、¥SOFTWARE¥Python¥SOFTWARE¥Wow6432Node¥Python にすべて置換する
  4. regファイルをダブルクリックし、レジストリへ登録する

※実際の¥は半角文字ですが、Bloggerだと\になってしまうので全角文字で書いています。

最新のFlashにアップデートしたらWindows XP 64bit Editionのブラウザ上でフラッシュが見れなくなった

最新のAdobe Flash Player 11.2.202.235(2012/04/27現在)にアップデートすると、Firefox 12(もしかしたら当事は11だったかも)でFlashが見れなくなった(Windows XP Professional x64 Edition)。

以前からFlash Player をアップデートしたらFirefoxで見れなくなるのはよくあることで、プラグイン(?)もアップデートすると見れるようになっていた。
……が、今回はプラグインがどうもうまくインストールできない。

Flashのダウンロードサイトにも
: Flash Player は 64 ビット版の Windows XP および Vista をサポートしていません。Flash Player 11 は 64 ビット版の Windows 7 をサポートしています。
のように注意書きされている(以前からあったと思うけど)。

試しに32bit用やwindows 7 64bit用のインストーラを用いてインストールを試みるも、「Unable to load application configuration」と表示されてインストールできなかった。

■対処法
最新のFlash Player をアンインストールし、以前動作していたバージョンをインストールする。


■手順
  1. Flash PlayerのアンインストーラWindows(64bit)用ダウンロードする
  2. Flash Playerをアンインストールする
  3. 前のバージョン(Adobe Flash Player 11.1.102.62)をダウンロードする
  4. zipを解凍し、中にあるreadme.txtを読む(←ここ重要)
  5. flashplayer11_1r102_62_winax_64bit.exeを実行して、Flash Playerをインストールする

以上の手順でできました。
Firefox以外を利用している方は、4のreadme.txtを読んで、もう一方のインストーラなどを利用すると良いかもしれません。

また、最近のFlash Playerは自動的にアップデートする設定があるので、当面はその設定は解除していた方が良いと思います。

しかしながら、XP 64bit Editionを利用している人は少数なので、この症状に出くわす人は稀でしょうね(笑)


※この記事は2週間前に解決したものを思い出しながら書いているので、簡単ながら再検証しましたが一部誤りがあるかもしれません。ご注意ください。

追記(2012/07/12)
2012年06月以降、Windows 7 で youtube が見れなくなりました。その解決法を以下にまとめてました。
アウトプットメモ: Windows 7上のfirefoxで youtube の動画が見れない