リアルフォース(RealForce 91UBK)を掃除した
隣の人からリアルフォース貰ったので、
せっかくだからお掃除してみました。
キートップを外すのにはダイヤテックのFKP01というキートップ外しを利用しました。
FILCO Keypuller キーボードメンテナンス用キーキャップ引き抜き工具 ブラック FKP01
- 出版社/メーカー: FILCO
- メディア: Personal Computers
- 購入: 55人 クリック: 67回
- この商品を含むブログ (5件) を見る
こいつは、4点で包み込むようにキーを外せるのでとても作業が捗りました。
大きいキーも小さいキーも綺麗に包み込んでくれます。
外したキーは食器用洗剤で浸け置き洗いしました。
キートップを外すとそれなりにホコリが溜まっていました。
綿棒とかでチマチマ掃除したのですが、掃除機で吸うのが
手っ取り早いことに気づきました。
ブラシの着いたアタッチメントで吸ってやるとよし。
浸け置き洗いしたキーはいらない布で軽く拭きます。
最初は一個一個拭いていたのですが、面倒だし、キー裏の細かい水滴は
取れないので、適当に拭いて干すのがよいと思います。
水滴が無くなったら組み立てます。
とても綺麗になりました。
JUnit4.11から@Paremetersで名前を指定できるようになった
前までは
というような味気無い表示でどんなテストケースなのかよくわからなかった@Parameterアノテーションですが、JUnit4.11からにname属性を指定できるようになったようです。
https://github.com/junit-team/junit/wiki/Parameterized-tests#identify-individual-test-cases
{index}でパラメータの添字を{0}, {1}, …でパラメータのn番目の値を表示できます。
以下の例では
@Parameters(name = "No.{index}:Fibonacci.compute({0}) の結果は {1} のはず")
というようにしています。
例
import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import java.util.Arrays; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; @RunWith(Parameterized.class) public class FibonacciTest { /** 入力値 */ private final int input; /** 期待値 */ private final int expected; /** * コンストラクタ。 * * @param input 入力値 * @param expected 期待値 */ public FibonacciTest(int input, int expected) { this.input = input; this.expected = expected; } /** * テストデータ。 * <pre> * [0]:入力値 * [1]:期待値 * </pre> * * @return テストデータ */ @Parameters(name = "No.{index}:Fibonacci.compute({0}) の結果は {1} のはず") public static Iterable<Integer[]> testData() { return Arrays.asList(new Integer[][]{ {0, 0}, {1, 1}, {2, 1}, {3, 2}, {4, 3}, {5, 5}, {6, 0} }); } /** 実際に実行されるテストメソッド。 */ @Test public void test() { assertThat(Fibonacci.compute(input), is(expected)); } /** テスト対象クラス */ public static class Fibonacci { public static int compute(int n) { if (n == 0) return 0; if (n == 1) return 1; return compute(n - 1) + compute(n - 2); } } }
ちなみに。。
Eclipseだと、name属性に丸括弧を使うと表示が途切れるバグがあるらしいです。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=102512
IntelliJ IDEAプラグインの開発 - 有用な情報とリンク集
【訳者前書き】
これは、Developing a plugin for IntelliJ IDEA – some useful tips and linksの翻訳です。
訳者自身はプラグインを作ったことがないので、訳に誤りがあるかもしれません(たぶんそんなに外していないとおもいますが)。
私が最初にIntelliJ IDEAプラグインを作ろうと考え始めた時の最大の問題は、どうやってそれを作り、一つに纏めるかというやり方について包括的な良いガイドが無いことでした。そこで、この投稿では、私が'Share with Pasie'プラグインをIntelliJリポジトリにリリースする過程で、役に立つ、特筆に値すると思った経験やリンクその他リソースを記します。
リンク集
いきなり、刺激的で超絶便利なプラグインを書き始めようとする前に、まず最初にいくつか読んでおくべきものがあります。下記は、見ておく価値のある場所の一覧です。
Getting Started - ここからスタートすべき。新しいプラグインを作るための最も基本的なイントロダクション。
Basics of plugin development – 2番目に見るべきページ。上記のページに似ているが、いくつか興味深い知識が得られる。
Plugin Development FAQ - 疑問や問題が生じたときに解決法や答えをみつけるのに最適
Open API forum - 本当にドツボにハマってしまったときに行くべき場所
コードを見せてくれ!
上のリンク集に挙げた場所は有用ではあるが、何かを動かしたり何か機能を実装するためには、
遅かれ早かれソースコードの中に飛び込まないといけないでしょう。
コンソールを開いて次のようにタイプします。
git clone git://git.jetbrains.org/idea/community.git idea
あるいは、IntelliJ IDEA 10のソースコードをGrepCodeでチェックします。
私はどちらのやり方も使いました。プロジェクト全体をチェックアウトしてIDEAで使い方を調べる用途にはGitリポジトリを使い、単一ファイル内のコードがどんなものかを手早く調べる用途にはGrepCodeを使用しました。
有用なサンプル
ほぼ全てのプラグインのソースコードに存在する要素というものが幾つか存在します。それをGoogleで検索したり解明したりする手間を省けるよう、最も一般的と思われる短いサンプルを2つ示します。
現在のプロジェクト、ファイル等を取得する
プラグインを作る際、IntelliJ OpenAPIの抽象クラスAnActionを継承してアクションを作ります。
actionPerformedメソッドに渡されるパラメータはAnActionEventだけですが、このオブジェクトからいろいろな場所にアクセスできます。
Project currentProject = DataKeys.PROJECT.getData(actionEvent.getDataContext());
VirtualFile currentFile = DataKeys.VIRTUAL_FILE.getData(actionEvent.getDataContext());
Editor editor = DataKeys.EDITOR.getData(actionEvent.getDataContext());
// and so on...
この方法でアクセス可能な場所の一覧は、DataKeysクラス(とその親クラス)の定数一覧に見つけることができます。
バルーンに情報やエラーメッセージを表示する
この手のポップアップは、ユーザに応答メッセージを伝えるのにとても便利です。メッセージはinfoでもいいし、error,warnでもいいです。デフォルトの色は、info用の緑とエラー用の赤、警告用のオレンジがあります。"Share With Pastie"プラグインでは、選択したテキストが無事にPastieに送信されクリップボードにリンクが格納されていることを示す用途にバルーンを使っています。
バルーンを表示する前に、それを表示する場所を特定する必要があります。私のプラグインではステータスバー(IDEA GUIで最も低レベルな要素)になります。
StatusBar statusBar = WindowManager.getInstance() .getStatusBar(DataKeys.PROJECT.getData(actionEvent.getDataContext()));
その後、バルーンを準備して表示することができます。
トリビアを少し
Plugin DevKit
最も重要なのは、開発中に、自作プラグインを起動したりデバッグしたりできるように、Plugin DevKitというプラグインをダウンロードする、あるいは有効化することです。これはとても些細なことのようですが、このプラグインを無効にしているかもしれない(私のように)し、起動時間を短縮するためにこのプラグインを削除しているかもしれません。
UI Designer
追加のウィンドウやポップアップ等を持つプラグインを開発するなら、UI Designerというプラグインがとても便利です。これは、NetBeansのGUIビルダにとても似ており、ドラッグアンドドロップでSwingのパネルを追加したりコンポーネントのサイズを変えることができるようになります。
グループとアクションのID
IntelliJ IDEA内で利用できるメニューに自作のアクションを表示するのに適切な場所を探していたとき、グループとアクションのID一覧があるページにたどり着き、自作プラグインの設定をするのにとても役立ちました。しかしこのページは内容が古くなっていたようにみえたので、他の方法でこれらのIDの適切な値を見つけられないか調べてみました。そして当然のことながら解決方法はありました。それも目の前に。プロジェクトビュー内でAlt+Insertを押すと、新しいオブジェクトを作成するメニューがいくつか表示されます。それをクリックすれば、以下の様なとても親切なAction作成画面が表示されるでしょう。
VMメモリを適切に設定する
次にやるべきことは、正しく動作するように"Run/Debug Configuration"を設定することです。というのもハードウェアの設定(主に利用可能なメモリ量)、IntelliJ IDEAの設定によっては、開発モードで自作のプラグインを動かした時にフリーズするかもしれないからです。
(最も頻繁にクラッシュするのはIndexの再構築中です)
この問題を防ぐため、"Run/Debug Configurations"ウィンドウで適切なVM引数を設定すべきです。私にとっては、-Xms256m -XX:PermSize=128m -XX:MaxPermSize=512m でうまくいきます。
Java用WebDAVクライントライブラリsardine
WindowsXPでコマンドラインから使えるWebDAVクライアントを探していたのですが、
あまりニーズにあったものが見つけられませんでした。
まず、cadaverを試しましたが、Cygwin版と本家とで微妙な差異があって
トラブルシューティングできずに諦めました。
他にもWindowsXPで動作するものを探しましたが、
GUIでしか操作できないものがほとんどでした。
Javaのようなプラットホーム非依存な言語のライブラリなら
Windowsでもうまくいくのではないかと思って、Javaのライブラリを探してみました。
メンテナンスされていないものが多い中、sardineが
使いやすいようにみえました。
これはJava用ライブラリですが、
ちょっとしたファイルのコピーがしたいだけなので、
Groovyで使うことにしました。
こういうスクリプト的なことをやるにはJavaはめんどうなので。
WebDav.groovy
sardineの機能を使いやすいようにまとめたクラスです。
Groovyの@Grabを使うことで、pom.xmlのようなものが無くても、
スクリプトファイルだけで依存関係を解決できます。
(ただし、初回実行時には依存ライブラリをダウンロードするのでとても遅くなります)
@Grab(group = 'com.googlecode.sardine', module = 'sardine', version = '314') @GrabResolver(name = 'sardine-google-svn-repo', root = 'http://sardine.googlecode.com/svn/maven/') import com.googlecode.sardine.Sardine import com.googlecode.sardine.SardineFactory import org.apache.http.client.ClientProtocolException import com.googlecode.sardine.DavResource import com.googlecode.sardine.impl.SardineException class WebDav { final File localRootDir final ConfigObject conf // 依存関係に含めてくれていないのでしょうがなく追加 @Grapes([ @Grab(group = 'org.slf4j', module = 'slf4j-simple', version = '1.6.4'), @Grab(group = 'org.slf4j', module = 'slf4j-api', version = '1.6.4') ]) final Sardine sardine /** * コンストラクタ * @param configScript 設定スクリプト */ WebDav(String configScript) { // 設定ファイル File configFile = new File(configScript) assert configFile.exists() : configFile.absolutePath conf = new ConfigSlurper().parse(configFile.toURL()) println "conf = $conf" // ローカルディレクトリ localRootDir = new File(conf.local.dir as String) assert localRootDir.exists() : localRootDir.absolutePath // Sardineインスタンス sardine = SardineFactory.begin( conf.webdav.user as String, conf.webdav.pass as String ) } boolean exists(String davResource) { try { getResource(davResource) return true } catch (SardineException e) { if (e.statusCode == 404) return false throw e } } boolean isDirectory(String davResource) { return getResource(davResource).directory } private DavResource getResource(String resource) { def list = sardine.list(toRemoteUrl(resource), 0) assert list.size() == 1 return list[0] } List<String> list() { return list("") } List<String> list(String dir){ return sardine.list(toRemoteUrl(dir)).collect { it.path } } void put(String resource) { def file = toLocalFile(resource) if (!file.exists()) { throw new FileNotFoundException(file.getAbsolutePath()) } file.withInputStream { input -> String to = toRemoteUrl(resource) println "put file [${file.absolutePath}] to [${to}]" URI uri = URI.create(to) sardine.enablePreemptiveAuthentication(uri.host) sardine.put(to, input, "text/plain") } } void get(String resource) { def file = toLocalFile(resource) if (!file.exists()) { assert file.createNewFile() : file.absolutePath } file.withOutputStream { output -> String from = toRemoteUrl(resource) println "get resource [${from}] to [${file.absolutePath}]" sardine.get(from).eachByte { b -> output.write(b as int) } } } private String toRemoteUrl(String resource) { return "${conf.webdav.url}/${resource}" } private File toLocalFile(String pathFromRootDir) { return new File(localRootDir, pathFromRootDir); } }
ストリームのようなリソースの扱いにクロージャが使えるので、
シンプルに記述できます。try-finallyがひとつもありませんがちゃんと解放処理はされています。
slf4jというライブラリを使っているのに、依存関係に含めてくれていないので
しょうがなくこちらで足している箇所があります。sardinのソースリポジトリを見ると、
どうもEclipseメインで開発しているぽいので、きっと依存関係に入れ忘れたんでしょう。
config.groovy(設定ファイル)
環境依存値をまとめて書いています。 ConfigSlurperを使うことでJSONのような記述が可能になります。 webdav { url = "https://url/of/webdav/server/" user = "scott" pass = "tiger" } local { dir = "temp" }
実行スクリプト(Hoge.groovy)
こんなかんじで呼び出します。
def dav = new WebDav("config.groovy") dav.get("index.org") //dav.put("index.org")
実行
> ls Hoge.groovy WebDav.groovy config.groovy temp/ > groovy Hoge.groovy
これで、WebDAV上のindex.orgファイルがtempフォルダにコピーされます。
What’s Cool In IntelliJIDEA. Part III
はじめに
これは、What' s Cool In IntelliJIDEA. Part IIIの翻訳です。
本文
IntelliJでは、基本機能かプラグインかのどちらかでほとんどどんな機能でも使えるのだけれども、IDEの力が及ばないことをしたくなる可能性もまだ少しある。そんなレアケースには、IntelliJのExternal Toolsを見てみたくなるだろう。
つい最近私はこのケースに出くわした。JDKのツールを使いたかったのだが、コマンドラインに切り替えて適切な場所まで移動する、というやり方よりもっと柔軟な方法でしたかった。私の意図は「何かショートカットキーを押すだけで結果が得られる」ということだったので、External Toolsを試すことにした。
Javaを研究するときによく使うツールはjavap - Javaクラスファイルの逆アセンブラだ。これは、バイトコードを研究するときには必須だ。IntelliJではASMプラグインを使うことができ、必要な結果をおおよそ与えてくれるのだが、私は今でもjavapの生出力を読むほうが好きだ。
IntelliJでjavapを外部ツールとして設定するには、Settings -> External Toolsと進んで、Add...を押す。ツールのありか、作業ディレクトリ、ツールへの引数が設定できる。
この方法の良いところとは、IntelliJではいくつか基本的なマクロが提供してくれている点だ。このマクロは、ツール実行時の引数を動的に解決してくれる。javapに関して言えば、パラメータ$FileClass$を、作業ディレクトリに$OutputPath$を設定しておけば十分だ。これで終わり。もうツールを使う準備はできている。
ポップアップメニューで、外部ツールをグループ化する「グループ」を定義することもできる。私はjavapにはjdkというグループ名を使っている。こんな感じだ。
これはクールなのだけれども、ファイルを右クリックし"JDK"グループを選択して展開しなければならず、結局javapを実行するだけ、というのは使いにくいということに気づいた人もいるかもしれない。
そこで、ショートカットが助けになる!Settings -> Keymapで、このツールに対するショートカットを定義できる。キーマップの良いところは、競合したショートカットを選択した場合にIntelliJがそれを検知して通知してくれる点だ。
もう一つ微調整が残っている。javapに割り当てたショートカットを押すと、逆アセンブル結果がIDEのコンソールに出力されるが、コンソールはソースコードのちょうど下にある。これを横に並べて見れたらもっと便利だろう。そのために、RunウィンドウをIntelliJのサイドパネルにドラッグアンドドロップすることができる。これで、作業中のソースコードの右となりにjavapの結果を見ることができる。
唯一欠けているのはjavap出力のシンタックスハイライトだが、これでも要望には十分応えられている。
What’s Cool In IntelliJIDEA. Part II - 2
はじめに
これは、What' s Cool In IntelliJIDEA. Part IIの翻訳(の一部)です。
前回分はこちら。
http://d.hatena.ne.jp/fuzzhead/20111128/
自分用のテンプレートを定義する方法
IntelliJはデフォルトの状態でもたくさんのテンプレートがあるが、必要なケースを完全にカバーするわけではない。それゆえ、この投稿の主目的は、IntelliJでLiveTemplateを独自に定義する方法を紹介することだ。最初に、ユースケースをでっちあげてみよう。すなわち、IDEにはデフォルトでは用意されていないが、もっと速くタイプする手段がほしいというような場合だ。
いくつかの理由から、IntelliJではデフォルトではtry-catchテンプレートを提供していない。単に空のtry-catch文を作るのではなく、既存のステートメントをtry-catchで囲みたい場合、このような方法がある。Settings windowを開いて(Ctrl+Alt+S)、Live templatesと[左上のテキストボックスに]入力する。これで、templates 設定が表示されるので右側に表示されるAddボタンを押す。
予め決まったテキストを出力するだけの単純なテンプレートを作成するのはとても簡単だ。
空のtry-catchブロックを定義するには、[テンプレートとなる]コード自身とそれを表す短縮形を入力すればよい。その際、チェックボックスで、そのテンプレートをJavaコンテキストに関連付けるのを忘れないようにする。
これは全くばかなテンプレートで全然賢くない。もし、catch節の例外の型を補完したいと思ったらどうだろう。テンプレート適用後に、特定の場所にカーソルを移動させたい場合はどうだろう。もう少し賢いテンプレートを作ってみよう。
catch節で使用する例外の型を補完できるよう、catch節に変数($EXCEPTION$)を追加し、IntelliJで提供される特別な関数を使って、その変数の値を決めるようにする。つまり、java.lang.Exceptionのサブクラスになるようにしたいので、subtype(<型>)関数を使用している。
私が別の変数,$END$を使っているのにおそらく気が付いただろう。しかし、ダイアログウィンドウには何の値も設定されていない。これは事前に定義された変数であり、テンプレート内で全ての選択操作が終わった後、どこにカーソルを置くかを表す。
tryと入力しスペースキーを押すと、テンプレートが以下のように展開される。
まず、例外の型を選ぶためにcatch節にカーソルが置かれる。どの型にするかを決めてエンターキーを押した直後、カーソルはtryブロック内に置かれる。
さらに、特別な関数を使ってCtrl+Spaceをエミュレートし、例外のインスタンスに対して呼び出すメソッドを選択できるようにしてみよう。これは架空の例だが、そうしたいのだと仮定しよう。
この目的を達成するため、テンプレートエディタにて$METHOD$変数を定義し、complete()関数に割り当てた。
例外の型が選択されると、次は、catch節の例外に対するメソッド候補が補完がされ、
選択可能なメソッドの一覧がポップアップされる。
Live Templateで変数割り当てに使用可能な関数はたくさんある。これらの良い点は、Javaだけではなく他の言語、例えば、JavaScript、HTMLやGroovyでも使えることだ。
Surround with template
IntelliJで使える他のタイプのLive templateにsurrounding templateというのがある。
これは、テキストを選択し(あるいは単に望む位置にカーソルを置き)、
Ctrl+Alt+Tショートカットキーを押すと、テンプレートの一覧がポップアップで表示される
ということだ。
surrounding templateを独自に定義するのは、選択されたコード(またはテキスト)が、予め定義された$SELECTION$変数に割り当てられているという点以外は、通常のテンプレートと何の違いもない。テンプレートがこの変数$SELECTION$を含んでいる場合、そのテンプレートはCtrl+Jで表示される通常のテンプレート一覧には表示されなくなる。
独自のsurrounding templateを定義する例を作ってみよう。
選択したテキストを引用符で囲いたいとする。これはとてもシンプルなテンプレートだ。
テンプレートエディタ内で、単に$SELECTION$変数の外側を引用符で囲うだけだ。
テキストを選択した状態でCtrl+Alt+Tショートカットキーを押しQキーを押すと、
選択したテキストが引用符で囲われるようになる。
What’s Cool In IntelliJIDEA. Part II - 1
はじめに
これは、What’s Cool In IntelliJIDEA. Part IIの翻訳(の一部)です。
Part Iはこちら
http://d.hatena.ne.jp/fuzzhead/20111120/p1
http://d.hatena.ne.jp/fuzzhead/20111121/p1
http://d.hatena.ne.jp/fuzzhead/20111123/p1
Live Templates
私は、IntelliJでLive Templateを非常に多用しているのだが、この機能は未だにあまり利用されていないように思う。この機能には、よくあるコードの入力を楽にしてくれる多くの標準テンプレートがあるだけでなく、新しいテンプレートを定義することもできる。そしてそれは、IntelliJに付属する全標準テンプレートの一覧と一緒に利用可能である。
過去の投稿で、私はこのLive Template機能の基本を取り上げたのだが、より詳しく、この機能の知られていない側面を指摘するのが良いと考えた。
まず最初に、Ctrl+Jはデフォルトで利用可能な一覧を表示するために使うショートカットだ。しかし、実行する機会があれば、たいていの場合は暗記した略語を思い出すことができるだろう。psvm [main() method declaration], iter [Iterate Itarable], psfs [public static final String], soutv [Prints a value to System.out]等のように。
私がLive Template機能を使う前に必ずするのは、テンプレート展開キーをデフォルトのタブキーからスペースキーに変更することだ。私には、この目的に使用するにはスペースキーを使うほうがより自然に感じられた。というのも、タイプするときには、実際ほとんど自動的にスペースキーを押すからだ。
Live Template機能でもう一つクールなのは、以前の投稿でも取り上げたが、ステートメントをコードブロックで囲うことができる点だ。