Hatena::ブログ(Diary)

四角革命前夜

2013年04月07日(日)

FirefoxにJavaプラグインをインストールする

さくらのVPSにインストールしたOSを再インストールしたくなったのですが、まともなJRE環境がなかったので作ったのですよー。その手順です。

環境:Ubuntu 12.04 LTS 64bit


JREのダウンロード

http://java.com/ja/download/から、tar.gzをダウンロードしてきます。

今回ダウンロードしたものはjre-7u17-linux-x64.tar.gzでした。


アーカイブの展開と配置

適当なところに展開し、シンボリックリンクを貼ります。

$ mkdir -p ~/jre
$ tar xvfz jre-7u17-linux-x64.tar.gz -C ~/jre
$ cd /usr/lib/firefox-addons/plugins
$ sudo ln -s ~/jre/jre1.7.0_17/lib/amd64/libnpjp2.so

これでFirefoxを起動すると、Javaプラグインが読み込まれ、VNCのウィンドウが表示できます。

インストールが終わったら削除すればもっと良いかと。

2012年02月27日(月)

ファイルサイズの調べ方

特定のディレクトリ以下のファイルサイズを取得するJavaのコード――Apache CommonsにあるFileUtilsのsizeOfDirectoryを使っただけだが――を書いたのだけど、どうもそれが出力するファイルサイズがおかしいと言われたので調べた結果と、awkがちょっと使えるようになったメモ。


そもそもの取得方法

$ du -sh ./

調べてわかったけど、ブロックサイズだからちゃんとした値じゃないそうで。

lsするとディレクトリが4096になるやつかな。


……って

$ echo 'aa' >> aaa
$ du -b aaa
3       aaa
$ ls -lh aaa
-rw-r--r-- 1 root root 3 Feb 27 18:25 aaa

ちゃんと3って出てるが……


ああ、調べたときは

$ du -sh

だったかな。これだと4096になる。


findとawkを使う

で、findとawkを使う事に。

$ find . -type f -printf "%s\n" | awk '{sum += $1} END {print sum}'

findにはtype fでファイルだけ検索するようにして、"%s\n"でファイルのサイズと改行を出力するように。

それをパイプでつないでawkに足し算してもらい、最後に出力。


結果

duの結果が間違っていただけで、出力はあってた。

ちゃんと調べる時はfindを使いましょう。ってことでおkなのかな?


追記:

du -b == find -type f + find -type d でおk?

2011年09月07日(水)

Maven2と環境変数

環境: WindowsXP SP3 / ckw + nyaos 3.0.0_1 + MSYS


$ echo %PATH%
(略)C:\Program Files\Java\jdk1.5.0_17\bin(略)
$ echo %JAVA_HOME%
C:\Program Files\Java\jdk1.5.0_17

$ java -version
java version "1.6.0_20"  # !?
(略)
$ javac -version
javac 1.5.0_17
$ mvn -v
Maven version: 2.0.10
Java version: 1.5.0_17

$ set PATH=`echo %PATH% | sed -e 's/1.5.0_17/1.6.0_20/'`
$ echo %PATH%
(略)C:\Program Files\Java\jdk1.6.0_20\bin(略)

$ java -version
java version "1.6.0_20"
(略)
$ javac -version
javac 1.6.0_20
$ mvn -v
Maven version: 2.0.10
Java version: 1.5.0_17  # ?

$ set JAVA_HOME=`echo %JAVA_HOME% | sed -e 's/1.5.0_17/1.6.0_20/'`
$ echo %JAVA_HOME%
C:\Program Files\Java\jdk1.6.0_20

$ mvn -v
Maven version: 2.0.10
Java version: 1.6.0_20

javaPATHを見る
javacPATHを見る
mavenJAVA_HOMEを見る

まあjavaとjavacがPATHのバージョンになるのは当たり前で、MavenがJAVA_HOMEを見てるのはJava界隈のアプリケーションがそういう作りだからなのかな。と憶測で終わらせておく。

2011年05月01日(日)

良いコードを書く技術 第1章〜第6章

良いコードを書く技術 ?読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus)

良いコードを書く技術 ?読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus)

積んだままになっていた良いコードを書く技術を6章まで読みました。さらさら読めていい本だなーと思います。

書いてある大体の事は実践できていたと思ってますが、それ以外に知らなかった事や気が付いた事などを書いていこうかと。


キャストをして使えるメソッドを少なくする

よく以下のコードを見るんですが、やっと理由がわかりました。

ArrayList arrayList = new ArrayList();

と書けばいいのに

List arrayList = new ArrayList();

と書いてあるのはなんで?と思っていたら

List arrayList = new ArrayList();
arrayList.ensureCapasity(100);  // コンパイルエラー

と使う必要のないメソッドを使えなくするとか。

インターフェースを使う理由はこれ以外にもいろいろありますが、こういう理由もあったんですねえ。

2011年04月17日(日)

ctagsで引数付きメソッド一覧

ctagsってエディタの補完用ファイルを生成するだけじゃないんだね!っていうメモです。


引数付きのメソッド一覧が必要になったことがあって、ctagsの生成するtagsファイルが使えるかも、と思って見てみたら引数が書いてなかったのです。(/ /で囲われているところはエディタが検索に使う部分なので、引数の途中で改行されていると途中までしか書いてない)

「ええー、Javaのパーサーなんて書けないよ?」と思って、一応ctagsのオプションを調べたら引数も書いてくれるオプションがあるではないですか。便利ですねえ。

エディタの補完用途にしか使えないのだとばかり思っていたら割と高機能・多機能で…… これからもお世話になります。


$ ctags -R --fields=+KS

-Rはカレントディレクトリ以下を再帰的に検索、--fieldsの+がONにする、という意味で、-にするとOFFに。

Kがmとか表示されるところがmethodと長く記述されるようにするオプションで、Sが引数のリストを記述するオプション。(オプション?)


試しに以下のソースでtagsファイルを生成してみると……

{ aaa.pas }
unit aaa;

function bbb: Boolean;
procedure ccc;
procedure ddd(const Value: String); overload;
procedure ddd(Value: Integer); overload;

implementation

function bbb: Boolean;
begin

end;

procedure ccc;
begin

end;

procedure ddd(const Value: String); overload;
begin

end;

procedure ddd(Value: Integer); overload;
begin

end;

end.
// aaa.java
class aaa {
  public static void main() { }
  public void bbb() { }
  public void bbb(String str) { }
  public void bbb(int l,
    String str,
    int n) {}
  public void ccc(int i) { }
}

aaa	aaa.java	/^class aaa {$/;"	class
bbb	aaa.java	/^  public void bbb() { }$/;"	method	class:aaa	signature:()
bbb	aaa.java	/^  public void bbb(String str) { }$/;"	method	class:aaa	signature:(String str)
bbb	aaa.java	/^  public void bbb(int l,$/;"	method	class:aaa	signature:(int l, String str, int n)
bbb	aaa.pas	/^function bbb: Boolean;$/;"	function
ccc	aaa.java	/^  public void ccc(int i) { }$/;"	method	class:aaa	signature:(int i)
ccc	aaa.pas	/^procedure ccc;$/;"	procedure
ddd	aaa.pas	/^procedure ddd(Value: Integer); overload;$/;"	procedure
ddd	aaa.pas	/^procedure ddd(const Value: String); overload;$/;"	procedure
main	aaa.java	/^  public static void main() { }$/;"	method	class:aaa	signature:()

こんな感じ。Pascalのソースは引数を解析してくれない……

Javaのaaa#bbb()メソッドは/ /で囲まれてるところは途中で改行されてるから引数が全部表示されてないけど、後ろのsignatureのところに全部列挙されてます。


これでパーサを書く必要もなくなり、grepやsed/awkでごにょごにょして事なきを得たのでした。

2011年01月26日(水)

Effective Java 第4章 クラスとインタフェース (21)

sedでは最短マッチが使えないことを知り、驚愕している夜です。一週間ぶりのEffective Javaの時間です。


項目21

GoF本はまだ全然読んでないのでStrategyパターン???な感じだったけど、C言語のqsortみたいな関数ポインタとかを渡して動作を変えるようなパターンを言うみたい?

Javaの場合は、関数ポインタでなくて渡すオブジェクトを変えることで動作を変更できる、という理解でいいのかな。

この動作を変えるためだけにあるクラスは状態を持たないので、シングルトンで作るといいとかなんとか。


Javaは覚えること沢山あるなあ……

2011年01月19日(水)

Effective Java 第4章 クラスとインタフェース (18 - 20)

すっかり飽きてきてるEffective Javaの時間です。今すごく触りたいのはClosureToolsです。


項目18

インターフェースを作ったらできるだけ変えないで、

インターフェースを継承している抽象クラスを変えるようにしろってことかな?


項目19

  • 定数を宣言してあるだけのインターフェースは使う側が混乱するだけ
  • クラスに強く結びついている定数を宣言するときはそのクラスに宣言する
  • 広く使われる定数を宣言するときはインスタンス化を防いであるクラスで宣言する
  • 列挙型で宣言したほうがいいときはenumを使う

こんな感じかな。


項目20

「タグ付きクラス」の意味がわからない…… コメントで説明してあるところを言ってるのかな?

1つのクラスに「円」のコンストラクタと「四角」のコンストラクタを作ってあったり、

各メソッドが「円」か「四角」かで処理を分けてあったりするクラスは非効率だから、

クラスを階層的に作りましょう、ってことが書いてある……と思う。


なんかオブジェクト指向習いたてのころに読んだことがあるような内容だった。

1つにまとめないで図形クラス派生の円クラスと図形クラス派生の四角クラスを作る、みたいな。


うーん、続けられるのかなー。