今更ながら、eclipseを日本語化

今更ながら、eclipseを日本語化してみる。

常に最新のeclipseを使うので、日本語化はちょっと・・・と思っていたが、ニュアンスで操作してる場合もあったので、日本語化して意味を理解してみようと思う。

使うのはpreadesというプラグイン。

http://mergedoc.sourceforge.jp/

eclipseの日本語化ではわりと昔から存在していたプラグインです。

で、これはeclipse4.2のプラグインインストールでは入れられないようで

zipファイルを解凍して、eclipseディレクトリにファイルをコピーする。

さらに、eclipse.iniファイルを編集してpreadesが動くようにパラメータを追加してあげる必要がある。

詳しくはpreadesの公式ページを参照。

Ruby(Ruby on Rails)で、使わなくなったメソッドをdepricatedにする

ある程度コードを書いていると、使わなくなったメソッドや、新しいメソッドを作ったので使って欲しくないメソッドなどが多々出てくるかと思います。

コメントで書いておいても、使う人はいるし、既存コードで知らぬ間に使ってあったりもします。

そんな時は

depricatedをログに出力するようにしてしまいましょう。

そうすれば、その処理を通るたびにワーニングとしてdepricatedなメッセージが出力されるので

対処しやくすなります。

書き方としては、

[ruby]def old_method
warn "[DEPRECATION] ‘old_method’ is deprecated. Please use ‘new_method’ instead."
end[/ruby]

という感じに

Apacheのログから、各IPからのアクセス数を集計する

Apacheのログから、各IPからのアクセス数を集計して、多い順にソートして表示するスクリプト
[scala]val apacheLog = new File("access.log")

/*
 * IPアドレスのカウント
 */
StringFileInput(apacheLog) { reader =>
  var count = 0

  // ランダム文字生成器
  val it3 = new Iterator[Array[String]] {
    def hasNext = reader.ready
    def next(): Array[String] = { reader.readLine.split(" ") }
  }

  val logAnalize = (Map[String, Int]() /: it3 ){(result, item) => result + (item.first -> (result.getOrElse(item.first, 0) + 1))}
  logAnalize.toList.sort((a, b) => a._2 < b._2).foreach{case (key, value) =>
    println(key, value)
  }

  // 61.126.188.190
  // (List[Array[String]]() /: it3){(result, item) => item :: result}.filter(a => {a.first == "61.126.188.190"}).map(a => println(a.mkString(" ")))
}[/scala]

Play Framework 2.0でログファイルローテートしてみる

Play Framework 2.0系のプロジェクトで、リクエスト毎にログを出力するような設定をした場合、ログファイルをローテートしたくなったりします。

場合によってはlogrotateの設定でやったりもします。

が、今回は、Play Frameworkのログの設定でローテートしてみます。

Play Frameworkは、LogBackというミドルウェアを使用してログを出力します。

で、必要な設定などはすでにPlay Framework自体が設定してくれているので

ログを出力するのは

[text]
Logger.debug("debug ok")
[/text]

という感じでログが出力出来ます。

ログはデフォルトでは
{プロジェクト}/logs/application.log
に出力されます。

デフォルトではログファイルはローテートしないので、カスタマイズして見ます。

カスタマイズするには

logger.xml(ファイル名は適当)というファイルをconf配下に作成します。

Play Framework本体からlogger.xmlファイルをコピーして持ってくるのが確実かもしれません。

その場合は、
{Play Framework}/framework/src/play/src/main/resources/logger.xml
をコピーして持ってきます。

application.logに出力する設定は、

[text]
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
[/text]

という部分になります。 LogBackの設定で、ローテートさせる設定はというと、 このclassの部分を「ch.qos.logback.core.rolling.RollingFileAppender」に変える事で対応出来るようなので、変更します。 さらに、ローテートする条件と、ローテート時のログファイル名をappenderのメンバーとして以下のように指定します。

[xml]
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${application.home}/logs/application.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
[/xml]

fileNamePatternは、ローテート時のログファイル名
maxHistoryは、ヒストリ保持期間(日)

となります。

これで設定ファイルは完成しました。

続いて、このログの設定ファイルを起動時に読み込む設定ですが、これは起動時のパラメータになります。

startコマンドでやる場合は

[shell]
play "start -Dlogger.resource=logger.xml"
[/shell]

となります。

target/startの場合は

[shell]
target/start -Dlogger.resource=logger.xml
[/shell]

となります。

今回はapplication.logという名前のままでしたが、本番用と開発用でログファイル名を分けるのも良いかもしれません。

Scalaでちょっとスマートにファイルを読み込んでみる(その2)

前回、Scalaでちょっとスマートにファイルを読み込んでみるで、defで定義した物を、case classに変えてみました。
[scala]case class StringFileInput(file: File)(f: BufferedReader =&gt; Unit) {
val in = new FileInputStream(file)
try {
f(new BufferedReader(new InputStreamReader(in)))
} finally {
println("ファイルクローズ")
in.close
}
}

// 使用例
StringFileInput(currentFile) { reader =&gt;
while(reader.ready) {
println(reader.readLine)
}
}[/scala]

Scalaでちょっとスマートにファイルを読み込んでみる

Scalaだと、テキストファイルなどを開く時は
[scala]// ファイルを開いてインスタンスを得る
val src = Source.fromFile(currentFile)

// ファイルの行をforeach
src.getLines().foreach(println)

// ファイルを閉じる
src.close[/scala]
と書いたりしますが

なんか、最後にclose書かないと行けないのがスマートじゃ無いなと思ったりします。

なので、ちょっとこの辺をいじってみましょう。

参考として、Rubyの場合は、このように書けます。
[ruby]File.open("foo") {|f|
f.each_line {|line|
print line
}
}[/ruby]
ブロック内でファイル操作という感じですね。

ScalaでもRubyと同様にブロック内でファイル操作、という感じが出来れば嬉しいので

ファイルを開く->ブロック内で処理->ファイルを閉じるという事をするメソッドを書きます。
[scala][/scala]def stringFileInput(file: File)(f: BufferedReader => Unit) {
val in = new FileInputStream(file)
try {
f(new BufferedReader(new InputStreamReader(in)))
} finally {
in.close
}
}

// 使用例
stringFileInput(currentFile) { reader =>
while(reader.ready) {
println(reader.readLine)
}
}[/ruby]

プロバイダにVPNの口をふさがれたっぽいので、SSL-VPNを導入する

タイトルの通りです。

最近外出先から家のネットワークに繋がらないなぁと思ったら

プロバイダでふさがれたっぽいのです。。

ついでにいうと、DoCoMoのスマホでテザリングして接続ということが出来なかったので

それも可能にしたい。

で、IPSecとかも考えましたが

SSL-VPNという方式でつないだら楽かも?という事で

SoftEther VPNというものを使ってみたいと思います。

このSoftEther VPNというのは、ソフトイーサ株式会社という所が作っている

PacketiX VPNというソフトウェアの機能制限したフリーウェア版という事のようです。

で、PacketiX VPNについての詳しい説明は、以下のURLを参照いただきたい。

http://www.softether.co.jp/jp/vpn2/introduction/about_vpn.aspx

簡単にいうと、VPNのサーバ側とクライアント側にそれぞれ仮想NICを作成し、サーバ側仮想NICとクライアント側の仮想NICとを接続する事によってセッション繋いで中身の通信をSSLで暗号化している、という感じになります。

通常の、というか一般的に一般人が手にしやすい家庭用のルータとかだと、PPTPで接続する事になりますが

このPPTPだと、1723ポートの解放のほかにプロトコルGRE(プロトコル番号47)の通信が必要になり、プロバイダに許可されていない場合はPPTPによるVPN接続が出来ないことになります。

PacketiX VPNの場合、SSL通信である443ポートを使って接続するので

上記のプロトコルGREによる制限を受けない事になります。

PacketiX VPNは、ほかにもさまざまなネットワーク上の壁を回避する手段が備わっているので

たいていの場合はVPN接続が可能になると思われます。

ということで、構築します。

サーバ側にはUbuntuを使いたいと思います。

Ubuntuは適当にセットアップしておきます。

http://www.softether.org/のページから

サーバ側ソフトウェアをダウンロードします。

softether01

ダウンロードしたファイルを解凍すると、vpnserverというディレクトリが出来るので、この中に入ってmakeします。
[shell]cd vpnserver
hoge@vpn:/usr/local/vpnserver$ make
——————————————————————–

SoftEther VPN Server (Ver 1.00, Build 9079, Intel x86) for Linux Install Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.

——————————————————————–

Do you want to read the License Agreement for this software ?

1. Yes
2. No

Please choose one of above number:
1 #<= これは1

Did you read and understand the License Agreement ?
(If you couldn’t read above text, Please read ‘ReadMeFirst_License.txt’
file with any text editor.)

1. Yes
2. No

Please choose one of above number:
1 #<= これも1

Did you agree the License Agreement ?

1. Agree
2. Do Not Agree

Please choose one of above number:
1 #<= これも1
[/shell]
以上で実行ファイルの作成とともに、実行可能であるかのチェックが走ります。

vpnserverを起動します。
[shell]sudo ./vpnserver start[/shell]
とします。
※443ポートを使うため、Ubuntuの場合sudoをつけて実行する必要があります。

UbuntuサーバがVMWare上で動いている場合、VMware上の設定で

NICの無差別モードというのをONにする必要があります。
※VMware vShereの場合

また、仮想NIC用として、NICの追加をしておく必要があります。

softether08

つぎに、/etc/interfaces

仮想NIC用の設定もします。
[shell]auto eth1
iface eth1 inet static
address 0.0.0.0[/shell]
を追加し、/etc/init.d/network restart

これでサーバ側は実行できました。

これを管理するツールは、Windows側に入れます。

ダウンロードページから

SoftEther VPN Server Manager for Windows

というソフトウェアをダウンロードします。

インストールするソフトウェアはSoftEther VPN サーバー管理マネージャ(管理ツールのみ)
というのを選択します。

softether02

サーバー管理マネージャを起動すると、以下のようになっています。

softether03

新しい接続先として、先ほどのUbuntuのIPアドレスを入力して接続します。

最初の接続だとパスワード設定画面が開くので、設定します。

softether09

続いて、SoftEther VPN Server簡易セットアップ画面が開くので、リモートアクセス、VPNサーバにチェックを入れて次へ。

softether10

仮想HUBの名前を設定。

softether11

ダイナミックDNS機能は、プロバイダで設定される各家庭へのIPが動的な場合に
softether社が運営するDNS機能を使って固定のドメイン名を取得する機能になります。
IPが固定である場合とか、自分でDDNSを使用している場合などは、これは無効かしておいてもよいかもしれません。

softether12

ユーザを作成します。

softether13

ローカルブリッジ設定をします。

ここで先ほど作成した仮想NIC(eth1)と仮想HUBを関連づけます。

これで、だいたいのサーバ側の設定は完了しました。

続いて、クライアント側です。

別マシンなどにインストールして確認すると接続できたことがわかりやすいと思います。

まずはクライアントをダウンロードします。

softether05

インストーラなので、指示通りにインストールします。

softether14

インストールが完了したらクライアントを起動して、新しい接続設定の作成をクリックします。

softether06

最初は仮想LANカードを追加することを促されるので、そのまま追加します。

softether15

softether07

ホスト名に、ダイナミックDNS機能で設定されたドメイン名を入力します。
仮想HUBには、サーバ設定時に指定した仮想HUBの名前を指定します。
あとはユーザ名・パスワードを入力して完了。

あとは、VPNサーバに接続してみましょう。

Play Framework で、リクエストログを出力したい

リクエストを受けた直後のアクションについては

/app/Global.scala

というオブジェクトのファイルを作り

GlobalSettingsを継承します。

このGlobalSettingsというトレイトには

beforeStart
onStart
onStop
onRouteRequest
onError
onHandlerNotFound
onBadRequest

というメソッドが定義されていて、それぞれオーバーライドする事でアクションを設定する事が出来ます。

今回は、リクエストが来た時に処理させたいので
onRouteRequest
をオーバーライドして使います。

[scala]
import play.api._
import play.api.mvc._

object Global extends GlobalSettings {
/**
* リクエストが発生した時に実行される処理
*
* オーバーライドして、ログ出力後に親メソッド起動
*/
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
Logger.info(request.toString)
super.onRouteRequest(request)
}
}
[/scala]

このように設定する事で、リクエストがあるたびにリクエスト情報を常にログに出力することが出来ます。

Ubuntu Serverをインストール時に日本語で入れてしまった場合のコンソールの文字化け対策

サーバにSSHとかで接続する際には、ターミナルツールのエンコードをUTF-8とかで
日本語の表示が出来るので問題ないとして

ほとんど無いと思いますが。
マシンに直接ログインした時に日本語が表示されません。

そのような時には、

ログイン後に

[shell]export LANG=C[/shell]

と打ち込むことで、表示言語を標準言語に戻すことが出来るので
文字化けは起きないと思います。

まぁ英語になるので、めんどくさいかもしれませんが。

Play Framework で、SQLの実行ログもログに出力させたい場合

Play Frameworkはなんか、デフォルトで正常に動いていると、ログが少ないなと思ったりします。

正常に動いたように見えても、データがおかしいのを拾っている場合もあります。

そんな時は、どんなSQLが叩かれているのかと言うのを見たくなります。

Ruby on Railsでは、developmentモードで起動していると常にSQLの実行ログが出たりしますが

Play Frameworkでは設定を追加しないと駄目なようです。

設定は

application.conf

db関係の設定があると思うのですが
その設定と同列の設定で

[text]db.default.logStatements=true[/text]

というのを1行追加します。

さらに、

[text]# Root logger:
logger.root=ERROR[/text]

という部分を

[text]logger.root=DEBUG[/text]

に変更します。

これで、コンソールにログが出力されるようになります。

VMwareのゲストOSが肥大化してきたな、と思った時に出来る事

VMwareの仮想マシンはその仮想マシンが使うディスクを仮想ディスクとしてファイルとして保存されています。

この仮想ディスクのファイルは、VMwarePlayerなどで作った場合、だいたいは最初はごく少量の小さいファイルですが

OSをインストールしたり、アプリをインストールしたりすると、それなりに大きなファイルとなってしまいます。

そこで、仮想マシンの中身をダイエットしようと思ってアプリを整理したり圧縮したりしても

仮想ディスクのファイル容量は小さくなっていなかったりします。

これはディスク上でファイルを削除する=ファイルのインデックス情報を削除するというのとイコールで

実体がある部分はクリアしてくれない訳です。

そのおかげで、削除してしまっても、直後であれば復活させるツールが使えたりする訳ですが

仮想マシンでは、そのクリアされない部分があることで、実際仮想マシンの内部で使用している容量よりも

大きな仮想ディスクファイルになってしまうと言う訳です。

ということは、この実は削除されている領域をクリア出来ればいいのです。

VMwareにはこの領域をクリアするツールがあったりします。

仮想マシンをインストールする時にVMware toolsというのを入れていると思いますが

このツールの中に

vmware-toolbox-cmd(Linux/Unix系)
VmwareToolBoxCmd(Windows系)

というコマンドがあります。

vmware-toolbox-cmdにhelpオプションを付けて実行してみると、使えるオプションが表示されます。
[shell]:~$ vmware-toolbox-cmd help
Usage: vmware-toolbox-cmd <command></command> [options] [subcommand]
Type ‘vmware-toolbox-cmd help <command></command>’ for help on a specific command.
Type ‘vmware-toolbox-cmd -v’ to see the VMware Tools version.
Use ‘-q’ option to suppress stdout output.
Most commands take a subcommand.

Available commands:
device
disk
script
stat
timesync
upgrade (not available on all operating systems)[/shell]
このオプションの中のdiskという物を使って仮想ディスクの未使用領域をクリアしていきます。

それぞれのオプションにはさらにサブオプションがあるので、help diskなどという感じでサブオプションを表示出来ます。
[shell]:~$ vmware-toolbox-cmd help disk
disk: perform disk shrink operations
Usage: vmware-toolbox-cmd disk [args]

Subcommands:
list: list available locations
shrink : wipes and shrinks a file system at the given location
shrinkonly: shrinks all disks
wipe : wipes a file system at the given location[/shell]
diskのサブオプションで
listというのは、使用しているディスクの一覧
shrinkというのが、今回仮想ディスクの未使用領域をクリアするために使うオプションです。

まずは、vmware-toolbox-cmd disk listと叩くと、使用しているディスクの一覧が表示されます。

Linux/Unix系であれば
[shell]:~$ vmware-toolbox-cmd disk list
/
/boot[/shell]
という感じに出るかと思います。

Windows系だと
[shell]C:\Program Files\VMware\VMware Tools&gt;VMwareToolboxCmd.exe disk list
C:\[/shell]
という感じだと思います。

今回はルートを最適化するので
[shell]:~$ vmware-toolbox-cmd disk shrink /[/shell]
とします。

これを実行すると、数十分ほど仮想マシンを操作出来なくなりますが、このコマンドで仮想ディスクの未使用領域がクリアされて

仮想ディスクファイルを再配置してくれるので、容量が減ってほんの少し快適になると思います。