2015年9月1日火曜日

VMPlayerで壊れた仮想ハードディクス(vmdk)を復活させる


VMWare Playerで起動していたUbuntuが起動しなくなりました。どうやらファイルシステムが壊れていたようです。
この壊れた仮想ハードディスクをfsckをしたら治ったので、その時の手順をメモに残します。

  • 同じOSの新規インスタンスをVMPlayerで作成する。
  • 上記で作成したOSで起動前に壊れた仮想ハードディクス(vmdk)を追加する。
  • 上記で作成したOSを起動し、壊れた仮想ハードディスクが「fdisk -l」でどこに認識されているか確認(/dev/sdb1など)
  • 「fsck /dev/sdb1」でハードディスクの修復を行う
  • 途中の質問にはとりあえず全てyesで答える
  • 「mount /dev/sdb1 /mnt」でマウント
  • 必要な情報を取り出すか、このまま新OSでマウントして使用する。

Ubuntu 15.4でMozcを使用する方法

Ubuntu 15.4でMozcを使用する方法です。
Mozcは、google IMEのオープンソース版らしいです。

Linuxの入力メソッドの設定で分かりにくいのは、入力メソッドの切り替えの仕組みでしょう。
Ubuntuでは、ATOKやAnthyやMozcなどの入力メソッド(IME)をインストールする前に、入力メソッドを管理するフレームワークをインストールする必要があります。これをインストールしないと、IMEが扱えない。今回は、このフレームワークにibusを使っています。その後に、好みのIMEをインストールして使います。ibusには複数のIMEを設定することができます。ここで分かりにくいのが、その切り替え方法です。ibusに複数のIMEを設定した場合、そのIMEを切り替えるショートカットがあります。。たとえば、AnthyとMozcを切り替えたりできます。さらに、IMEの中でも「英数半角」と「ひらがな」を切り替えるショートカットがあります。つまり、Anthyに切り替えて、Antyの「ひらがな」入力を選択するというようなことができます。そして、AnthyからMozcに切り替え、Mozcの「半角英数」入力を選択といった具合です。ただ、これ必要ですか。僕は必要ないです。1つのIME(たとえば、Mozcだけ)で「英数半角」と「ひらがな」を切り替えられれば十分です。日によって「今日はAnthyのひらがな入力が使いたいなぁ」とか「明日はMozcのひらがな入力を使いたいなぁ」とかならないでしょう。いろいろなIMEを試すとき以外は、大抵は使いたいIMEを1つだけ使うことがほとんどでしょう。なので、複数のIMEを切り替えたりする機能は必要ないし、ibusに複数のIMEを登録する機能も必要ないです。

ということで、ibusにMozcのみを設定し、Mozcで「半角英数」と「ひらがな」入力を切り替える方法をメモとして残します。

ibusのインストール

$ apt-get install ibus

mozcのイントール

$ apt-get install ibus-mozc

ibusのIME切り替えのショートカットを空欄にする

  • タスクバーにあるインプット・メソッドのアイコンを右クリック
  • 「設定」をクリック
  • 「全般」タブで「次の入力メソッド」の項目で「...」ボタンをクリックする。
  • 現れたダイアログで削除ボタンを押す。

mozc以外の入力メソッドをibusから削除する

  • タスクバーにあるインプット・メソッドのアイコンを右クリック
  • 「設定」をクリック
  • 「入力メソッド」タブをクリック
  • Mozc以外(Anthyなど)の入力メソッド削除して、Mozcのみにする

mozcの入力切換のショートカットの変更

mozcで直接入力(半角英数字入力)とひらがな入力を切り替えるショートカットを変更します。
  • タスクバーにあるmozcのアイコンをクリック
  • ツール > プロパティ を選択
  • 「一般」タブの「キー設定の選択」の「編集」をクリック
  • ショートカット一覧が表示されるので、「コマンド」カラムで「IMEを無効化」または「IMEを有効化」の行の入力キーを希望のショートカットに変更する。「IMEを無効化」は直接入力、「IMEを有効化」はひらがな入力に対応している。

2015年8月13日木曜日

[Scala] FutureとスレッドプールとAkka

僕は、実は最近までFutureについてよく分かってなかったんです。単に別のスレッドで処理をして値を返すものという認識ぐらいしかありませんでした。Future.applymapflatMapもあまり気にせず使っていました。コンパイル時にExecutionContextがないって怒られたら、コンパイラの指定通りにimport scala.concurrent.ExecutionContext.Implicits.globalをソースコードに盲目的に追加するということもやっちゃってました。とりあえず、コンパイラは通るしプログラムも動くし、いいっしょ!っていう。でも、よく分からないまま使っていて、問題が起こった時に困るのは自分です。もしかしたら、周りの人にも迷惑がかかるかもしれません。反省。
ということで、今回は、Future周りのことについて調べたことをまとめます。

ExecutionContextってなに?
暗黙的にimport scala.concurrent.ExecutionContext.Implicits.globalを記述し、Futureを使っていたんですが、Future.applyにもmapにもflatMapにもExecutionContextを渡さないといけないんです。scala.concurrent.ExecutionContext.Implicits.globalってのは、Scalaがデフォルトで用意しているimplicit宣言されているExecutionContextなんですね。だからこれをimportすると暗黙的にFuture.applyにもmapにもflatMapにも渡されることになります。では、このExecutionContextってなんなのよ?っていう話です。これは、簡単に言うと、スレッドプールです。つまり、Futureで処理されることは、Futureを生成するときに渡されたスレッドプールが管理しているスレッド内で実行されるんです。

scala.concurrent.ExecutionContext.Implicits.globalってなに?
scala.concurrent.ExecutionContext.Implicits.globalってのは、Scalaがデフォルトで用意しているスレッドプールというのは、先に述べましたが、それは一体どんなスレッドプールなのか?
とりあえず、知っておくべきことは、このスレッドプールが管理しているスレッドの数は、プロセッサ(コア)の数と同じだということです。例えば、4つしかコアがなくてFutureを4つ作った場合は、スレッドプールのスレッドを全て専有しちゃうので、別にFutureを作っても、その処理は動かないんです。なので、Future内で時間のかかる処理とか、Thread.sleepとかしないほうがいいんです。時間のかからない処理がいっぱいあるようなプログラムだったら、あまり問題になることはないんじゃないでしょうか?

ExecutorServiceを使う
もちろん、他のスレッドプールを使うこともできます。デフォルト以外で簡単なものとしては、JavaExecutorsを使ってスレッドプールを生成するのが簡単だと思います。例えば、固定数のスレッドを持ったスレッドプールを作る場合には、次のようにします。
import scala.concurrent.ExecutionContext
import java.util.concurrent.Executors
implicit val executionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
JavaExecutorServiceは、比較的に時間のかかる処理などに適しているようなので、状況に応じて使いわけるとよいでしょう。

Akkaのスレッドプールを使う
Actorのフレームワークを提供しているAkkaのスレッドプールを使用することもできます。Akkaは、設定ファイルでスレッドプールの設定をすることができるので、設定が容易です。ここでは、比較的に時間のかからない処理をいっぱい行うのに適しているFork/Joinフレームワークを使ったスレッドプールの設定を行います。
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
# sample-akka.conf
akka {
  actor {
    # デフォルトのスレッドプールの設定。
    default-dispatcher {
       # スレッドプールの仕組みの設定。
       # デフォルトでは、"fork-join-executor"なので、ここの設定を省略してもよい。
       executor = "fork-join-executor"

       # "fork-join-executor"の設定。
       # executorが"fork-join-executor"の場合に、この設定が使用される。
       fork-join-executor {
         # 最小のスレッド数
         parallelism-min = 8
         
         # プロセッサ(コア)数の何倍のスレッドを生成するか
         # parallelism-minからparallelism-maxまでの範囲を出ることはない。
         parallelism-factor = 10.0
         
         # 最大スレッド数
         parallelism-max = 64
       }
    }
  }
}
次に、この設定を使ったExecutorContextを取得します。
import com.typesafe.config.{ ConfigFactory }
import akka.actor.{ ActorSystem }
val conf = "sample-akka.conf"
val url = this.getClass.getResource( conf )
val system = ActorSystem( "ActorSystem"ConfigFactory.parseURL( url ) )
implicit val executionContext = system.dispatcher

2015年2月14日土曜日

ROOTのJAVAバインディングを作りました


ROOTとは、高エネルギー物理の分野で広く使われている統計解析フレームワークです。ヒストグラムやグラフを描画することはもちろん、データを解析したり、保存したりすることができます。僕は長らくROOTを使ってきましたが、少しだけ不便に思っていたことがあります。それは、ROOTがC++で記述されているということです。つまり、ROOTはC++のライブラリなので、使う側もC++で書かなくてはいけません。C++の何が嫌ってメモリ管理をしなきゃいけないところです。多くの言語がガベージコレクションを実装している中で、今更自分でメモリ管理をする気にはあまりなれません。最近では、C++も少し改善されて、スマートポインタが導入されて、ある程度楽にはなりました。ROOTもバージョン6からC++11に対応しているようです。でも、やっぱり他の言語で書きたい。簡単な解決策としては、ROOTが提供しているPythonとRubyのバインディングを使うことです。僕は、しばらくROOTのRubyバインディングを使っていたんですが、やはり普段使うことが多いJVM言語(JavaやScala)で使うことができたらなぁと常々思ってました。そこでネットを探してみました。あることはあるんです。ただ、古くてROOTのバージョン3しか対応してなかったり、ROOTとはインターフェースが大きく変わっていたりして満足できるものではありませんでした。しばらくRubyを使うことで諦めていたんですが、もうこうなったら一念発起し自分で作ることにしました。

ここからダウンロードできます。 http://java-root.appspot.com
Javadocです。 http://java-root.appspot.com/javadoc/index.html

設計概要

とにかくよく使うクラスは、実装しようと思います。ヒストグラムやグラフ、描画ツール、データアクセスのようなものは全て実装します。それに依存するようなクラスもできるだけ実装します。例えば、TH1Fを実装するならTAxisも実装しなければいけません。TH1Fは、TAxisを返すGetXaxisメソッドを持っているからです。ほかには、TTreeを実装するならTBranch、TLeafなども必要でしょう。とにかくこのような依存しているクラスも実装対象とします。
また、Javaでは表現できないことは、実装しません。例えばプリミティブの参照渡し。Javaでは、プリミティブを参照渡しすることはできません。このような引数や戻り値を持つメソッドは実装しません。ただ、例外的にTTree::BranchやTTree::SetBranchAddressでは、擬似的にポインタを表現して、これらのメソッドを扱えるようにします。
クラスの継承関係は、できるだけ再現します。ROOTでは多重継承しているクラスが多く見られますが、Javaではクラスの多重継承はすることができません。そこでJava版では、すべてのROOTのオブジェクトは、インターフェースにすることにしました。TObjectもTH1Fもインターフェースです。インスタンスの生成は、ファクトリメソッドで生成することします。
ROOTのメソッド名は、大文字から始まりますが、これはJavaのメソッド名の慣例と違うので、Javaの慣例に従ってメソッド名は小文字で始めることにします。

ROOTのリフレクションを使ってJNIコードを自動生成

JavaからC++にアクセスする方法としてJNIを採用することにします。JNIは、C++のコードとJavaの対応づけをするコード記述する必要がありますが、ROOTのクラスは、めちゃめちゃ多い。これらのクラスにアクセスするJNIコードをいちいち手で実装していっては大変です。各クラスに対して記述するコードは、だいたい似たようなものです。同じようなことの繰り返しを自動化するのは、コンピュータの得意分野です。幸いROOTではリフレクションが使えるので、メソッドの名前や引数などを取得できます。これによってJNIコードを自動生成できます。

TTree

ROOTではTTreeにデータを保存するときは、ブランチにポインタのポインタを渡して、各イベントでそのポインタのアドレスをデータのアドレスに書き換えることで、値を受け渡ししています。
TLorentzVector *= new TLorentzVecotr();
tree->Branch( "x""TLorentzVector"&);

Javaでは、ポインタがないので、TPointerクラスを導入してこれを実現しました。
TLorentzVector x = newTLorentzVecotr();
TPointer ptr = newTPointer(x);
tree.branch( "x""TLorentzVector", ptr );

このままでは、プリミティブが保存できないので、プリミティブのクラスも導入しました。作成したクラスは、
  • TInt
  • TLong
  • TFloat
  • TDouble
です。

TInt x = newTInt();
TPointer ptr = newTPointer();
tree.branch( "x""TInt", ptr );

Example

次のコードは、ヒストグラムを描画するコードです。

10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
import net.blackruffy.cern.root.*;
import static net.blackruffy.cern.root.ROOT.*;

public class DrawTH1F {

  public static void main( String[] args ) {

    final TApplication app = newTApplication( "app" );

    final TH1F h = newTH1F( "h""h", 100, -10., 10. );
    
    h.fillRandom("gaus", 100);
    
    final TCanvas c = newTCanvas( "c""c", 800, 600 );
    
    h.draw();
    
    app.run();
    
    c.destroy();
    h.destroy();
  }

}

2014年12月26日金曜日

Firefoxの通信を監視するアドオンを作る


開発ツールのインストール

基本的には、tarファイルをダウンロードして、展開するだけ完了です。
展開したディレクトリの中にあるbinディレクトリにパスを通すと更によいでしょう。

詳しくは、次のページを参照してください。
https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Installation
アドオンのプロジェクトの作成

プロジェクトのディレクトを適当な場所に作成して、その直下で次のコマンドを実行します。

cfx init

すると、ディレクトリやファイルが作成されます。
その中のlibディレクトリの中のmain.jsにプログラムを記述します。

アドオンのテスト

main.jsを作成したら、次のコマンドで簡単にテストすることができます。

cfx run

作成したアドオンが一時的にインストールされた状態で、Firefoxが立ち上がります。

アドオンのパッケージング

Firefoxにアドオンをインストールするには、パッケージングする必要があります。
次のコマンドで、xpiファイルを作成することができます。

cfx xpi

アドオンのインストール

アドオンを公開せずに、XPIファイルをFirefoxにインストールするには、Firefoxのアドオン画面で次のようにします。

ツール > アドオン > 「設定」アイコン > ファイルからアドオンをインストール

通信を監視するプログラム

次のコードは、Firefoxが生成した全てのHTTPリクエストの接続先URLをコンソールに出力します。

10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
// lib/main.js

// クラスを作成するライブラリをインポートする
var { Class } = require('sdk/core/heritage');

// 基本的なクラスUnknownをインポートする
// Unknownクラスは、nsISupportsインターフェースを実装してる。
var { Unknown } = require('sdk/platform/xpcom');

// XPCOMライブラリをインポートする。
// CCは、Components.classの別名。
// Ciは、Components.interfacesの別名。
// 詳しくは、https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Chrome_Authorityを参照。
var { Cc, Ci } = require('chrome')

// いろんなものを監視するライブラリobserver serviceを取得する。
// observer serviceのaddObserverメソッドで監視内容を設定する。
var observerService = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService);

// StarObserverクラスを定義
// observer serviceのaddObserverメソッドは、第一引数にnsIObserverインターフェースを指定する必要があるため、
// StarObserverは、nsIObserverインターフェースを実装する。
// nsIObserverのobserveメソッドを実装しなければならない。
var StarObserver = Class({
  extends:  Unknown, // Unknownクラスを継承する。
  interfaces: [ 'nsIObserver' ]// nsIObserverインターフェースを実装する。
  // どんな情報を監視するか指定する。
  // この値は、addObserverメソッドの第二引数に渡される。
  // 他の指定できるtopicは、https://developer.mozilla.org/ja/docs/Observer_Notificationsを参照。
  topic: 'http-on-modify-request'
  register: function register() {
    observerService.addObserver(this, this.topic, false);
  },
  unregister: function() {
    observerService.removeObserver(this, this.topic);
  },
  // addObserverメソッドに渡されるコールバック関数。
  // このコールバック関数の引数には、nsIHttpChannelのインスタンスが渡される。
  // nsIHttpChannelでリクエストの情報の取得やキャンセルなどができる。
  observe: function observe(subject, topic, data) {
    // キャスト的なことをする。
    // これをしないと、nsIHttpChannelのメソッドが使えない。
    subject.QueryInterface(Ci.nsIHttpChannel);
    // URLを取得する。
    var url = subject.URI.spec;
    // コンソールにURLを取得する。
    console.log('star observer:', url);
  }
});

var starobserver = StarObserver();
starobserver.register()// nsIObserverを登録する。

2014年9月13日土曜日

GradleのApplicationプラグインで生成したスクリプトが動かない


GradleのApplicationプラグインで、生成したスクリプトが実行出来ませんでした。原因は、パスが通ってないことが原因でした。
生成されたスクリプトのパスを通している部分を見ると、依存関係のあるJARファイルには全てパスが通ってますが、$APP_HOME/libにパスがないじゃありませんか。これでは、依存するクラスファイルにはパスが通りません。

僕は、以下の方法でこの問題を解決しました。

build.gradleの編集

build.gradleに以下の記述を追加します。

build.gradle
10 
11 
12 
13 
14 
15 
16 
17 
task modifyscripts( dependsOn: startScripts ) {
  
  outputs.dir startScripts.outputDir

  doLast {    
    def uf = file(startScripts.getUnixScript())
    uf.write( uf.text.replace('CLASSPATH=$APP_HOME''CLASSPATH=$APP_HOME/lib:$APP_HOME') )
    
    def wf = file(startScripts.getWindowsScript())
    wf.write( wf.text.replace('CLASSPATH=%APP_HOME%''CLASSPATH=%APP_HOME%\\lib;%APP_HOME%') )
  }
  
}

applicationDistribution.from(modifyscripts) {
  into "${installApp.destinationDir}/bin"
}

これで、$APP_HOME/libにもパスが通るようになります。

Dartで"Hello World"


Javascriptに変換してくれるプログラミング言語Dartを使って"Hello World"を表示するプログラムを作ってみます。
今回はDartの開発環境であるDart Editorを使用せずにコマンドラインで実行できるdart2jsを使用します。

Dart SDK のダウンロード

dart2jsはDart SDKに入っています。下記のサイトからダウンロードします。
https://www.dartlang.org/tools/download.html
ページの最初には、Dart Editorがあるので注意してください。Dart SDKはページの中程からダウンロードできます。
ダウンロードが完了したら、解答して、出来たディレクトリの中のbinディレクトリにパスを通します。これでdart2jsが使用できます。

プログラムを作成

main.dart
import 'dart:html';

main() {
  window.onLoad.listen( ( evt ) {
    var div = new Element.div();
    div.text = "Hello World";
    document.body.children.add( div );
  });
}

コンパイル

$ dart2js -o main.js main.dart

HTMLの作成

main.html
<html>
  <head>
    <title>main</title>
    <script type="text/javascript" src="main.js"></script>
  </head>
  <body>
  </body>
</html>

完成

main.htmlをブラウザで表示して「Hello World」が表示されていれば成功です。