ブラウザの検索エンジン一覧に追加するための方法として、OpenSearchの仕様がある。でも、いろいろと試していると癖がある気がする。Chrome関連だと、これとか、これとかによると、パスのないURL(つまり、ドメインのみ)のときは自動追加が有効だったり、GETでテキストフォームが1個だけでOnSubmitのスクリプトをかましてなければOpenSearchなんかなくても自動で追加されたりする。うーん、汎用的な感じにするにはどうしておくと良いのかね…。
MacBook Airが壊れた
利用していたら突然フリーズしたから何が起きたのかと思い、強制的に電源を落として再起動を行ったけど、電源を入れた途端、ブーブーブーと音がなり起動しない…。ググると、ここに
- ビープ音が 1 回のとき: RAM が搭載されていない、または認識されない
- ビープ音が 2 回のとき: 互換性のない RAM が搭載されている(例えば、EDO RAM など)
- ビープ音が 3 回のとき: 全ての RAM バンクがメモリテスト不合格
- ビープ音が 4 回のとき: 残りのブート ROM 部分でのチェックサムエラー
- ビープ音が 5 回のとき: ROM ブートブロックのチェックサムエラー
という情報があった。仕方がないので、分解してみると確かにほこりが溜まっている。というわけで、ほこりを取り除いて電源を入れると、今度はビープ音が一回になった。RAMが搭載されていないって言われても…。そんでもって、Airってオンボードなメモリだと思うし、どうすることもできない気も…。あっプロのサポートページを見ると問い合わせにはインシデントを買って問い合わせろ的な感じだし。うーん、終わったな。だいたい3年くらいすると同じ状況になっている人もいるみたいだから、Airとかは1年に一回くらい分解して掃除したほうが良さそうな気がする。
というわけで、新しいノートを買う必要があるのだけど、次は何を買おうかしら…。そもそもMacでなくても問題ない気もするので、UltrabookにUbuntuでも入れて使おうかな…。
JSR 335: Lambda expressions
Java 8で導入される予定のラムダ式。Javaの世界だと、Java 5 で遭遇した以上の変化が起きるかもしれない。まぁ、仕様としては、JSR 335 みたいだけど、OpenJDKのところにラムダに関する説明もある。これをすごくざっとまとめると、ラムダ式はクロージャーとか匿名メソッドみたいなやつのこと。今まで
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ui.dazzle(e.getModifiers());
}
});
みたいにやっていたかもしれないけど、
button.addActionListener((ActionEvent e) -> {ui.azzle(e.getModifiers()});
みたいなことができるようになる。そんなわけで、
new Thread(() -> {
connectToService();
sendNotification();
}).start();
ということも普通に起きる感じ。そんで、興味深いのが Target Typing。上記の例のnew Thread()の引数に与えた()->{…}の型が推論されてRunnableになるっぽい。なので、
Callable c = () -> "done";
とすれば、それはCallableになるし、
Comparator c = (s1, s2) -> s1.compareToIgnoreCase(s2);
とすれば、Comparatorになるようだ。そんでもって、省略とかもありっぽいから、
button.addActionListener(e -> ui.dazzle(e.getModifiers()));
というようにいろいろとなくなる…。そして、以下のような状況で勝手に推論して状況に応じて決まるみたい。
- 変数宣言の型
- 引数の型
- 戻りの型
- 配列のパラメータ型
- メソッドやコンストラクタの引数
- ラムダ式の本文
- ?:の条件式
- キャストの型
まぁ、いろんな状況で型をよろしくやっておくよ、という感じだな。そんで、JavaScriptとかではお馴染みのレキシカルスコープ。
あとは、既存のメソッドとかも渡すことができるみたい。
class Person {
private final String name;
private final int age;
public static int compareByAge(Person a, Person b) { ... }
public static int compareByName(Person a, Person b) { ... }
}
Person[] people = ...
Arrays.sort(people, Person::compareByAge);
つまり、::で指定する。上記はstaticなメソッドだけど、インスタンスのメソッドに対してもhoge::doRunみたいなことができるみたい。さらに、コンストラクタもできるみたいで
SocketImplFactory factory = MySocketImpl::new;
という例もある。あとは、defaultの話もあるけど、知りたければラムダの説明を読んでね。