2008-01-01から1年間の記事一覧

1行で書けるうるう年判別法

ある年がうるう年(閏年)であるかどうかの判別は意外と複雑です。 西暦が4で割り切れる年はうるう年 ただし、4で割り切れても100で割り切れる年はうるう年でない ただし、100で割り切れても400で割り切れる年はうるう年 つまり、2004年、2008年、…、2096年…

形態素解析ライブラリSenのエラーと原因究明方法

Javaの形態素解析ライブラリSenを使ってプログラムを書いていたのですが、実行環境を変えると急に動かなくなってしまいました。メモ代わりに対処法を残しておきます。 エラーメッセージとその原因など 私の場合、発生したエラーメッセージは java.lang.Illeg…

Google Chrome(V8)のベンチマーク(Firefox、Safariとの比較)

先日Googleブラウザ「Google Chrome」のベータ版が公開されました。速い速いと言われているChromeのJavaScriptエンジン「V8」がどの程度速いのか、ベンチマークテストでためしてみました。 (グラフの縦軸はChromeを1としたときの実行時間です) 環境 OS Win…

HashMapの注意点

HashMapを使う上での注意点について説明します。 Map型変数を使う HashMapオブジェクトを格納するには、HashMap型変数ではなくMap型変数を使います。 // HashMapオブジェクトの生成 Map<String, String> map = new HashMap<String, String>(); HashMapはMapの実装の一つに過ぎません。HashMap</string,></string,>…

Javaで多重継承する方法

Javaでは言語仕様的に多重継承が許されていません。これは、メソッド名が重複した場合の処置など、多重継承が様々な問題を引き起こしやすいからです(C++でプログラムを書くとよくわかります)。とはいえ、どうしても多重継承をしたい場合というのもあります…

PHPで多重継承する方法

PHPでは言語仕様的に多重継承が許されていません。これは、メソッド名が重複した場合の処置など、多重継承が様々な問題を引き起こしやすいからです(C++でプログラムを書くとよくわかります)。とはいえ、どうしても多重継承をしたい場合というのもあります…

ストリートビューを滑らかに歩く

ストリートビューで街中をスムーズに移動するためのアプリケーションを作りました。SmoothWalk powered by Google Maps Street View Googleマップのストリートビューは非常に興味深い機能ですが、繰り返し矢印を押して移動するのは結構面倒です。そこで、一…

自動散策 by ストリートビュー

ストリートビューで自動散策するプログラム、AutoWalk by Street Viewを作成した。 自分のWEBサイトへの掲載方法 次のようなHTMLを作成することで、自分のWEBサイトに自動散策プログラムを埋め込むことができる。初期地点は自由に設定できるので、自分の街を…

ストリートビューのAPI(京都散策のサンプル)

(2008-08-15)『Googleマップ上でストリートビュー対応の道を青色ハイライト表示する(GStreetviewOverlay)』を追記しました 先日、Google Mapsのストリートビュー日本版が公開されたところですが、早速Google Maps APIを用いてストリートビューをいじってみ…

同期のためにVectorは使わない(VectorとCollections.synchronizedList)

よくJavaの解説には、VectorとArrayListの違いはスレッドセーフであるかないかだということが書かれている。そのような解説を読むと、スレッドセーフな可変長配列がほしい場合にはVectorを使えば良いと思ってしまいそうだが、私は同期を目的としてもVectorは…

任意の底を持つ対数を計算する方法

多くのプログラミング言語では、任意の底を持つ対数を計算するために一工夫が必要だ。 PHP PHPで任意の底の対数得るのは簡単だ。log関数を用いて次のように書く。第二引数を省略するとネイピア数(自然対数の底)eが底となる。 しかし、このように書ける言…

JavaのNaNがおかしい(というか、Doubleがおかしい)

doubleはNaN*1を値として取ることができる(その他にも、正の無限大、負の無限大をとることもできる)。これはIEEE 754で決められている。 NaNはNaNと比較しても等しくないという性質を持っている。つまり、 // aはNaNになる。 double a = 0.0 / 0.0; System…

ハッシュは二分木(ツリー)より速い(ハッシュとツリーの速度比較)

ハッシュは遅いという意見があるようだが、実装や使い方を誤らなければ、基本的にツリーよりハッシュの方が速い。(この記事は以前書いた「ハッシュは本当に遅いのか?いや、遅くない(反語)」を簡潔にまとめたものです) ハッシュとツリーの速度を比較した…

PHPのエスケープやエンコード関数

PHP

HTMLエスケープやURLエンコード、ハッシュ関数など、WEBアプリケーション作成においてよく使うPHPの関数をまとめた。 HTMLエスケープ HTML中で使われる『&』や『<』、『>』などの記号を、『&amp;』や『&lt;』、『&gt;』などに書き換えるのがHTMLエスケープだ…

staticメソッドしか持たないクラス

PHPやJavaで、staticメソッドしか持たないクラスを作るとき(例えばJavaのMathクラスのようなクラス)には、そのクラスのインスタンスが生成できないようにする必要がある(staticメソッドにインスタンス経由でメソッドにアクセスするのは明らかに無駄だ。だ…

JavaScript関連リファレンス

JavaScript関連のサイトはたくさんあるが、ある程度信頼できるリファレンスのようなものがなかなか見つからない(JavaScript歴が短いせいかもしれないけど)。とりあえず見つけたものをメモ代わりに書いておく。 Core JavaScript 1.5 Reference - mozilla de…

System.outの深淵

Javaでは、System.outを用いて標準出力を行う。このSystem.outはリファレンスを見るとPrintStream型の変数であることがわかる。PrintStreamは任意のOutputStreamをラッピングして、表示を簡単にするための機能(printlnとか)を提供する出力ストリームだ。つ…

Singleton 変則double-checked locking

問題の理解に誤りがあったので追記しました。(2008-07-27) Singletonパターンを用いるときに、次のような書き方をすることがある。 public class SingletonA { // ただ一つのインスタンスを保持するためのフィールド。 private static SingletonA instance =…

PHPでセッションを完全に破棄する方法

PHPでセッションを破棄する方法について、きちんと解説されたものが見つからなかったので書いておく。 まず、PHPでセッションを破棄する方法自体はPHPのマニュアルの載っている。↓の部分だ。

5分でわかるオブジェクト指向

プログラミングを勉強していて、オブジェクト指向でつまる人は多い。その理由は、実際のプログラミングでどのようにオブジェクト指向を使うかという、わかりやすい例が示されていないからだと思う。この記事では、必要最小限の実例でオブジェクト指向の使い…

ハッシュは本当に遅いのか?いや、遅くない(反語)

この記事を簡潔にまとめた記事「ハッシュは二分木(ツリー)より速い」を掲載しました。(2008-08-04) ハッシュと二分木(ツリー)*1では普通はハッシュの方が速いとされる(ハッシュは挿入、参照、削除の時間計算量がO(1)、二分木はO(log N))。しかし、ハ…

Javaの配列の初期化の謎

Javaの配列は↓のように初期化することができる。 int[] a={11, 2, 7, 3, 5}; このことはJava言語規定 - 10.6 配列初期化子にも書かれている(英語原文はこちら)。 でも、実は次のような書き方をすることもできる。 int[] a=new int[]{11, 2, 7, 3, 5}; {}だ…