2016年09月10日

JavaでAvroのGenericRecordの中身をループで見る

やり方がわからなかったので調べた。getFieldsでSchema.Fieldの一覧を取ってそれをループさせれば良いようだ。

Recordが入れ子になっている場合は型調べつつ再帰的にやれば子要素まで取れると思う(未確認)。

Javaと言いつつコードはScala。まあ、同じようなものだし。続きを読む

2016年09月04日

JavaでSlackにMessageを投稿する最小限のコード

メッセージを飛ばすだけの用事で依存ライブラリを増やすのもなんだったので、最小限のメッセージを飛ばすだけのコードを書く。戻り値はレスポンスを文字列にしたもの。続きを読む

apt-getでopenjdkを入れる

普段はoracleのjdk installerを入れてるけど、openjdk入れたい時ってどうすればいいんだっけ。

jreの場合はdefault-jreを入れるところだけど、jdkの場合はdefault-jdkで良いらしい。

$ sudo apt-get install default-jdk

これで最新(この記事を書いている時点では1.8.0_91)が入った。defaultと書いておけば済むのは便利。

前のバージョンを入れたい際は apt-get install openjdk-7-jdk のようにバージョン付きのパッケージがあるっぽいけど未検証。

2016年09月01日

JavaでHadoopのrmdirしたかった

fs.rmdir(path) みたいなことができるかと思ったのだけど、API見てみるとおらぬ。 続きを読む

2014年04月03日

CSSBoxでCSSの情報を含めたHTMLを落とす

WebからHTMLを取得して保存しておく際に、スタイルの情報も含めて記録しておきたい時がある。CSSBoxを使ってstylesToDomとかすればうまく記録できそうだったのでやってみた。

具体的には下記のようなコードで、org.fit.cssbox.css.DOMAnalyzerのstylesToDom()、stylesToDomInherited()なんかを設定することでうまくいった。 続きを読む

2013年11月10日

SolrJでSoftCommitしようとした

みんな大好き、SolrJでSoftCommitしようと思ったけど、どうやれば良いのかわからなかったので調べた。 続きを読む

2012年05月31日

JavaでWikipediaのwiki記法をパースしてHTMLにする

表題のようなことをするためのライブラリはいくつか存在する。

以前試したMyLynのWikiTextは、一部の記法が残ってしまうことがあり({ja|こういうのとか})、Wikipediaに対して使う分には今ひとつだった。

次に試したのがjava-wikipedia-parser。これはシンプルで使いやすかったのだけど、たまにパースエラーが出ることがあったのとMavenリポジトリが見当たらなかったのでパス。

JWPLはMavenのセントラルにも上がっていて使えそうに見えたけど、依存ライブラリの数が多く当該機能だけ使うのに向いているか分からなかったのでパス。

ということで落ち着いたのが、gwtwiki。

gwtwiki(Bliki engine)
http://code.google.com/p/gwtwiki/
続きを読む

2011年09月02日

実行可能なjarファイルを作るメモ

久々に作ったらやり方をすっかり忘れていたので、メモしておく。

続きを読む

2011年07月23日

JavaのCollectionとMapに関するメモ書き

JavaのCollectionをイマイチよく分かっていない気がしたので、最近ちょくちょく見直している。でも、いまだに把握しきれていない。

続きを読む

2011年06月13日

HTTPClientのリダイレクトに関するメモ

今日使った時に調べたことを2つほどメモしておく。HTTPClientのバージョンは4.1.1。コードはScala2.9。

続きを読む

2011年05月31日

MavenでHBaseのクライアント機能を使おうとした記録

HBaseは一応Mavenのレポジトリを用意してくれている。

<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase</artifactId>
<version>0.90.3</version>
</dependency>

続きを読む

2011年05月29日

BufferedInputStreamのmarkとresetを使ってみる

JavaのBufferedInputStreamには、markとresetというメソッドが実装されている。これはresetをすると前回markした場所までStreamの位置を戻せるという機能。

InputStream系のクラスは昔のマリオの横スクロールのように、一度進んでしまうと後戻りはできない仕様になっている。

BufferedInputStreamなら、markとresetを使って、条件付きで後戻りが可能になる。

続きを読む

2010年10月05日

ディレクトリ配下のjarをまとめてCLASSPATHに入れるシェル

指定したディレクトリ配下のjarをまとめてCLASSPATHに入れる方法ってあったっけと3分ばかり悩んだ末、なかったような気がしたから適当にシェルを書いた。

また使いそうな気もするから貼っておく。grepの指定とかが適当さを醸し出している。

続きを読む

2010年03月18日

java.text.Collatorによる、それっぽい日本語ソート

技術評論社から出てる文字コード技術入門を読んでいたら、java.text.Collatorというのが出てきた。使ったことなかったけど、より自然な文字列のソートをしてくれるものらしい。

続きを読む

2010年02月16日

UnicodeBlockをさらに使ってみる

日本語の文書はUnicodeBlockのどの辺を使って書かれているのかを適当に確認してみたりしたので、その結果とかを貼ってみる。

Unicodeの文字のブロックに触れてみる
http://www.mwsoft.jp/programming/munou/unicode_block_java.html

結論は、だいたい「BASIC_LATIN」、「CJK_UNIFIED_IDEOGRAPHS」、「HIRAGANA」、「KATAKANA」、「CJK_SYMBOLS_AND_PUNCTUATION」の5つかなぁみたいな。

2010年02月08日

JavaのUnicodeBlockを使ってみる

UnicodeBlockを使うと平仮名やカタカナの判定ができる。うまく使えば指定サイトが何語で書かれているか判定したりできる。

続きを読む

2010年01月29日

JavaでBMPをJPEGに

200個くらいあるBMPファイルをJPEGに変換しないといけない用があったので、試しにJavaでやってみる。

javax.imageio.ImageIOを使用すると、BMP、JPEG、GIF、PNGなんかを手軽に扱える。

BufferedImage image = ImageIO.read(bmpFile);
ImageIO.write(image, "jpeg", new File(jpgFilePath));
と書くだけで変換できる。今回は書いてないけど、画像に線引いたりもできる。

というわけで、ディレクトリ配下のBMPファイルを全部JPEGに変換するとても簡易なコード。

続きを読む

2010年01月22日

JavaからSQLiteを使ってみる

軽くて丈夫でコンパクト(というキャッチフレーズの腹筋トレーニングマシンが昔あった気がする)なSQLiteをJavaから使ってみる。

ここのページに置いてあるSQLiteJDBCが便利らしい。
http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC

どの辺が便利かというと、JARの中にWindows用のsqlitejdbc.dllとか、Linux用のlibsqlitejdbc.soが同梱されているので、パスやら環境を意識することなく、ライブラリを読み込みさえすれば使えてしまう。

続きを読む

2010年01月21日

JD-Eclipseを使ってみる

JADの行方とかが不安定なので、他の逆コンパイラを探していたところ、JDに行き着いた。

Java Decompiler
http://java.decompiler.free.fr/

続きを読む

2010年01月20日

HttpClientとHttpCleanerでGoogle検索結果を解析する例

HttpCleanerの実力試験代わりに、Google検索結果を解析させてみる。

HttpClientでコンテンツを取得し、独自拡張したResponseHandler内でHttpCleanerを呼び出して云々するようなだいぶ適当なソースだけど、割と問題なく動いてくれた。

続きを読む

2010年01月12日

【Java】HttpComponentsを使ってみる

HttpComponentsは、昔はCommons HttpClientという名前で配布されていたJavaでHTTPリクエストを行う為のライブラリ。

Cookieを使った通信とかが簡易にできるので、クローラーなどを作る際には重宝する。

HttpComponentsの公式サイトはこちら
http://hc.apache.org/

続きを読む

2010年01月06日

【Java】HtmlCleanerを使ってみる

HtmlCleanerとは、SourceForge.JPの説明によると

HtmlCleaner HTMLパーサを、Javaで書かれている。それは十分には、ブラウザでは、ほとんどのWeb利用と同じ規則に次のXMLが形成された汚れのHTMLに変換します。

http://sourceforge.jp/projects/sfnet_htmlcleaner/

ドンマイ、機械翻訳

続きを読む

2009年11月11日

【Java】Runtime.execでリダイレクト付きコマンド実行

今日、Javaからコマンドラインでmysqlを実行させようとした際に、Runtime.execはリダイレクトの入ったコマンドを実行してくれないことを思い出した。

リダイレクトを実行するには、shとかcmdとかを噛ませて実行してあげる必要があります。

続きを読む

2009年07月29日

JavaのBooleanクラスの==比較

今日もまた、割とどうでも良いJavaのお話


JavaのBooleanクラスの==比較
http://www.mwsoft.jp/programming/java/boolean/java_lang_boolean_value_of.html


今回の記事は、
1:   Boolean b = new Boolean[10000];
2: for(int i = 0; i < 10000; i++) {
3: b[i] = new Boolean[true];
4; }

とした場合は2〜4行目の間で152KBほどメモリを使用する

1:    Boolean b = new Boolean[10000];
2: for(int i = 0; i < 10000; i++) {
3: b[i] = true;
4: }

とした場合は、2〜4行目の間で1バイトもメモリは消費しない。

みたいなお話です。

2009年07月25日

Integer.reverse( int )でビット演算を学ぶ

予告していたInteger.reverseです。DVD見ながら書いてたら、4時を過ぎてしまった。明日(というか今日)も用事があるのに。恐ろしい。。。


Integer.reverse( int ) の処理を追ってみる
http://www.mwsoft.jp/programming/java/java_lang_integer_reverse.html
若干、寝ぼけて書いてます。間違いがあった場合は、見つけ次第直していきます。


処理事態は、こんな感じの子です。
i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;
i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
i = (i << 24) | ((i & 0xff00) << 8) | ((i >>> 8) & 0xff00) | (i >>> 24);

面白いかなぁと思ったのですが、bitCountとかなり内容が被ってました。次回に期待。


ところで、検証コードを書いている時に間違って
for( int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++ )
って書いて無限ループを発生させてみた。

intはInteger.MAX_VALUEを超える値になろうとすると、溢れてマイナスになるので永遠に条件を満たさないという、こっそり混入して他人を貶める目的で使えそうな記述だなぁと思いました。

2009年07月23日

intを10進数の文字列に直すロジック

今日はInteger.toString( int )を追いかけてみた。

見ての通り、intを文字列にコンバートする機能。とてもよく使う機能だけど、これまで内部でどうやって文字列に変換しているのか、意識したことがなかった。


Integer.toString( i ) に見る数値から文字列への変換
http://www.mwsoft.jp/programming/java/java_lang_integer_to_string.html


ソース自体が長いので、説明がちょっと間延びした感じになってしまった。

面白いところは、
(i * 52429) >>> 19 == i / 10
なところとか。

2009年07月17日

-2147483648 * -1 == -2147483648 は true

本日は、Integerから僅かにそれて、java.lang.Math の abs について。

abs は名前の通り絶対値を取る子ですが、Integer.MIN_VALUE(-2147483648)を引数に取った際の動きはどうなるのだろう、というお話です。

Math.abs( Integer.MIN_VALUE )について
http://www.mwsoft.jp/programming/java/java_lang_math_abs_min_value.html

ビットの世界はいろいろとイレギュラーなことがあって楽しいです。浮動小数点数の誤差とかはあんまり楽しくないですが。

intの最も左側の1のビット以外を0にする

昨日は「lowest」、一番右側だったので、今日は左側、「highest」を扱ってみました。


intの最も左側の1のビット以外を0にする
http://www.mwsoft.jp/programming/java/java_lang_integer_highest_one_bit.html


今回のお題は、こんな感じです。
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);

毎日見てると、徐々にビットが頭の中で動くようになってきた気がします。でも、1週間遠ざかればまた固まってしまうのだろうなぁ。

記事中で無駄にピコーンとか言ってるのは、それっぽい動画を見ながら記事を書いていたせいです。

2009年07月16日

intの最も右側の1のビット以外を0にする

昨日の流れに合わせて、今日は「Integer.lowestOneBit」のロジックの説明。「i & -i」という割と有名なヤツです。

http://www.mwsoft.jp/programming/java/java_lang_integer_lowest_one_bit.html

内容的には基本的な話なのですが、それを文字にして説明しようとすると途端に言葉に詰まりました。言葉って難しい。

2009年07月15日

Javaのビット演算のお勉強

JavaのInteger.bitCountのロジックを追いかけていたら、いつの間にか2時を過ぎていました。

そして気が付いたら、(自分にしては)割とちゃんとした解説ページが出来上がっていました。


intの1のビットの数を数えるロジック
http://www.mwsoft.jp/programming/java/java_lang_integer_bit_count.html


お題になっているロジックは、こんな感じのものです。

  i = i - ((i >>> 1) & 0x55555555);
  i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
  i = (i + (i >>> 4)) & 0x0f0f0f0f;
  i = i + (i >>> 8);
  i = i + (i >>> 16);
  return i & 0x3f;

この処理の意味がなかなか理解できず、でも、分かってしまえばとても簡単だということに気づき、長時間悩んでしまった自分に対して「俺って阿呆だ……」と深い悲しみに包まれたような解説ページです。

2009年07月14日

【1日1Java】シフト演算子の説明

Integerクラスのビット関連の中身を徐々に漁ってみたいので、
下準備としてシフト演算子に関するお話

続きを読む

2009年07月13日

【1日1Java】Integer.signumでビットの勉強

JavaのInteger.signumで使用されているロジックを見ながらビット演算の勉強

続きを読む

2009年07月12日

【1日1Java】Integerのビット操作関連メソッド

Integerクラスにビット操作関連メソッドがいくつかいたので使ってみる


続きを読む

2009年07月10日

【1日1Java】2進数、8進数、16進数への変換

intから2進数、8進数、16進数の文字列に変換する
逆に文字列からintに戻す

続きを読む

2009年07月09日

【1日1Java】クラス名を取得する

java.lang.Class
getName, getCanonicalName, getSimpleName

続きを読む

【1日1Java】JVMを強制終了する

// JRE 1.6.0_07
// java.lang.System
// 処理を強制的に終了する
// tag exit halt


続きを読む

2009年07月07日

【1日1Java】ミリ秒やナノ秒を取得

// JRE 1.6.0_07
// java.lang.System
// currentTimeMillis, nanoTime
// System.out.printlnやSystem.err.println
// tag ミリ秒 マイクロ秒 ナノ秒


続きを読む

【1日1Java】プリミティブ型一覧

// JRE 1.6.0_07
// プリミティブ型一覧
// tag primitive data type


続きを読む

2009年07月06日

【1日1Java】標準出力とエラー出力

// JRE 1.6.0_07
// java.lang.System
// System.out.printlnやSystem.err.println
// tag 標準出力 エラー出力


続きを読む

2009年07月05日

【1日1Java】java.lang.Voidがいることを初めて知った

// JRE 1.6.0_07
// java.lang.Void
// Void型なんてあったんだという気持ちになる
// tag void


続きを読む

2009年07月04日

【1日1Java】ZipOutputStreamで圧縮

// JRE 1.6.0_07
// java.util.zip.ZipOutputStream
// ZipOutputStreamクラスを使用してZipファイルの圧縮
// tag zip 


続きを読む

2009年07月02日

【1日1Java】ZipInputStreamで解凍

// JRE 1.6.0_07
// java.util.zip.ZipInputStream
// ZipInputStreamクラスを使用してZipファイルの解凍
// tag zip


続きを読む

2009年06月30日

【1日1Java】ZIP解凍

// JRE 1.6.0_07
// java.util.zip.ZipFile
// ZipFileクラスを使用してZipファイルの解凍
// 1階層のみ対応
// 圧縮ファイル内にディレクトリがある場合については、
// ZipInputStreamのエントリー(明日書く予定)参照
// tag zip


続きを読む

【1日1Java】URLのエンコード、デコード

// JRE 1.6.0_07
// java.net.URLEncoder
// java.net.URLDecoder
// URLのエンコード、デコード
// tag encode

続きを読む

2009年06月28日

【1日1Java】ランダムな数値、アルファベットを取得

// JRE 1.6.0_07
// java.lang.Math
// java.util.Random
// ランダムな数値、ランダムなアルファベット(a-z)を取得する
// tag ランダム Math

// 0〜9までのランダムな数を取得する
// Math.randomは0.0以上、1未満(1を含まない)の値を返す
// ので、10かけてfloorすれば、0〜9の値になる
int num = (int) Math.floor( Math.random() * 10 );
System.out.println( num );

// JavaDoc
// http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Math.html#random()

// ランダムなアルファベットを取る場合は、「a = (char)97」なので、
// 「a-z = 26文字」に「97」を足す
char c = (char) Math.floor( Math.random() * 26 + 97 );
System.out.println( c );

// そういえば、java.util.Randomというのが居た
// こちらの方がnextIntが居る分、可読性が良いかも
Random random = new Random();
num = random.nextInt(10);
System.out.print( num );

// コンストラクタでシードを指定できるけど、デフォルトコンストラクタの中で
// こんな風にシードを指定してるので、普通は気にしなく良いかも
// ++seedUniquifier + System.nanoTime()
// (内部的に持ってるlongの値をインクリメントしつつ、ナノ秒を足してる)

// a-zを取る場合はこんな感じ
// nextCharという子はいない()
c = (char) Math.floor( random.nextInt(26) + 97 );
System.out.print(c);

// JavaDoc
// http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Random.html

// ちなみにjava.lang.Math.randomは、内部的にjava.util.Randomの
// インスタンスをシングルトンで持っていて、それを使用している
// ので、パフォーマンス上はMath.randomの方が良いかも

2009年06月27日

【1日1Java】簡易スケジューラ(5秒置きに処理実行)

import java.util.Date;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

public class Test {

    public static void main(String[] args) throws Exception {
        // JRE 1.6.0_07
        // java.util.Timer
        // java.util.TimerTask
        // 定期的(本例では5秒ごと)に処理を実行する

        Timer timer = new Timer( "hoge" );

        // 3秒後に1度目のタスクを実行し、その後は5秒置きに実行する
        timer.scheduleAtFixedRate(new TestTimerTask(), 3 * 1000, 5 * 1000);
        
        // 30秒待って、処理を終了する
        Thread.sleep(10 * 3000);
        timer.cancel();
        
        // JavaDoc
        // http://java.sun.com/javase/ja/6/docs/ja/api/
        // 上記のような「固定頻度実行」だけでなく、処理終了後から指定秒後に再度
        // 処理を実行するような「固定遅延実行」も可能
        
        
        // 指定したname(hoge)はそのままスレッドの名前として設定される
        // こんな阿呆な消し方も可能と言えば可能(Thread.stopはduplicated)
        // Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
        // for( Thread thread : map.keySet() ) {
        //     if( "hoge".equals( thread.getName() ) ) {
        //         thread.stop();
        //     }
        // }
    }
}

class TestTimerTask extends TimerTask {
    public void run() {
        System.out.println(new Date());
    }
}

2009年06月26日

【1日1Java】Javaの文字列比較

// JRE 1.6.0_07
// Javaの文字列比較
// java.lang.String
// tag 文字列,比較

// 文字列を比較する
String hoge1 = new String("HOGE");
String hoge2 = new String("HOGE");

// == ではfalseになる場合がある
boolean bool = ( hoge1 == hoge2 ); //=> false

// 特に理由がなければ、equalsを使用する
hoge1.equals( hoge2 ); //=> true

// == で trueになる場合がある理由は、== がObjectを比較し、
// equalsが文字列を比較しているから。
// Objectの比較でtrueになるとは、同じものを参照しているということ

// == でfalseにならない例
String fuga1 = "FUGA";
String fuga2 = "FUGA";
String fuga3 = "FUG";
fuga3 += "A";

// 初期化時に値を入れた場合、Javaは容量の節約の為、
// ヒープ領域に入れられた1つの"FUGA"という文字列を、共有して参照する
bool = ( fuga1 == fuga2 ); //=> true

// fuga3のように演算を噛ませると、別の領域にFUGAを確保するので、
// ==比較はfalseになる
bool = ( fuga2 == fuga3 ); //=> false
fuga2.equals( fuga3 ); //=> true