Skip to content

Category Archives: 未分類

今更だけどjavaのString#replaceAll()/String#replaceFirst()、String#split()が遅い

JavaのStringのreplaceとsplitは正規表現文字列を使用する。
柔軟ではあるけれど、通常の文字列でreplace/splitしたい場合は速度が低下してしまう。
そこで自作replace/splitの出番ですよ。下記のreplace/splitは実測で5倍くらい早かったです。

public class FastStringUtil {

public static List split(String text, String splitter) {
ArrayList items = new ArrayList();

int spIndex = text.indexOf(splitter);
int index = 0;
while (spIndex >= 0) {
items.add(text.substring(index, spIndex));
spIndex += splitter.length();
index = spIndex;
spIndex = text.indexOf(splitter, spIndex);
}
if (index < text.length() ) {
items.add(text.substring(index));
}

return items;
}

public static String replace(String text, String target,
String replacement, boolean all) {
StringBuilder out = new StringBuilder();
int spIndex = [...]

clojureでファイル処理

clojureはrubyと比べるとファイル処理というかテキスト処理が面倒な気がする。
contribとかもっと調べればいいライブラリがあるのだろうか。
とりあえずユーティリティを書く。
IO.foreachより短いタイプでテキスト処理したいがためにeach-linesアナフォリックマクロを作成。

(defn reader-from-path [path]
(BufferedReader. (InputStreamReader. (FileInputStream. path))))

(defmacro read-lines [path]
`(with-open [r# (reader-from-path ~path)]
(loop [coll# [] line# (.readLine r#)]
(if line#
(recur (conj coll# line#) (.readLine r#))
[...]

clojureで数学

バグってても知らない。

(defn ! [x]
(loop [val x n (- x 1)]
(if (> n 1)
(recur (* val n) (- n 1))
val)))

(defn ** [x n]
(reduce * (repeat n x)))

(defn **2 [x]
(* x x))

(defn combination [n m]
[...]

サイトをインラインフレームで表示するのを禁止するJavaScript

なんとなくtwitter.comのHTMLソースを見てみたら変なJavaScriptコードを見つけた。
なるほど。インラインフレームとかを使ってトップウィンドウ意外でtwitterを開くのを禁止しているので。
念のためローカルでiframeを使って試してみたらtwitterのホームに飛ばされた。
よく知られた方法なのかもしれないけど初めて知った。
以下ちょっと見やすくしたコード。

if (window.top !== window.self) {
document.write = “”;
window.top.location = window.self.location;
setTimeout(function(){document.body.innerHTML=”;},1);
window.self.onload=function(evt){document.body.innerHTML=”;};
}

web sql database を使ってみる

web sql databaseを少しだけ触ってみた。
まだ日本語の情報がほとんどないのでw3cの仕様書を参考にする。
Introductionにコードサンプルがあるけど、そのままだと動かない罠。
chrome5で試しているのだけれど、changeVersion()がどうも動かないみたい。中途半端にエラーがでるけど期待通りに動かないので使わないことにする。
あと、当たり前かもしれないけど、openDatabase()は1回だけ呼ぶものみたい。なんどもopenDatabase()するとchromeの要素検証画面にあるDatabaseタブに
たくさんDBのアイコンがでてくる。内部的に複数のDBオブジェクトが作成されているっぽい。とりあえずグローバルスコープに専用の変数を用意して回避。
そんなこんなで出来上がった、ただ書いて読むだけのコードが下記。

var g_db = null;
function prepareDatabase() {
if ( g_db != null ) { return g_db; }
return g_db = openDatabase(“testdb05″, ‘1.0′, “testdb”, 1024*1024*5, function (db){
[...]

SVGで電卓

勉強がてらSVGで電卓。月並み過ぎる。chrome5で動作確認したので他のブラウザで動くかは謎。
imgタグだとなぜかうまく表示されないので直接リンク。
SVG電卓

無線LANルーター3製品の消費電力を比較

購入検討中の無線LANルータの消費電力
BUFFALO WLR300GNH  12W
NEC WR8300N 9W
corega WZR-HP-G300NH 14W
どれも凝った使い方をしない人には似たり寄ったりな機能しかないので
消費電力の一番低いWR8300Nに決定。WR8300Nはエコモードというのがあって
待機時などの消費電力はさらにぐっと低い。

Google Public DNSを使用してみる。

Googleの無料パブリックDNSサービス「Google Public DNS」を使ってネットのアクセス速度を上昇させる方法
早速設定してみる。
ルータのDNS設定をGoogle Public DNSに向けてみるも何故かあまり速度変わらず。
Googleのチュートリアルどおりに端末に設定してみると一気に速度が倍に!
60~150ms くらいだったのが 30~60msくらいになった。
ウェブも体感で若干早くなったような。。。
とりあえず常用する。

install google go to ubunt8.04

google go を Ubuntu8.04にインストール。
基本的にgoogleのインストールページ通りにインストールできた。
ただ、分散バージョン管理システムのmercurialをインストールするところで
エラーが発生。
「sudo easy_install mercurial」をする前にg++をapt-get install しておく
必要があった。
あと、環境変数のGOBINは最初はOptionalと書いてあるから無視していたが
結局インストール手順内に必要な場所があったので設定した。
なお、GOBINはPATHに含める必要がある。
僕の場合、環境変数は.bashrcに下記のように設定した
(32bitインテルCPUにUbuntuの環境)
GOROOT=$HOME/go
GOBIN=$HOME/bin
GOOS=linux
GOARCH=386
export GOROOT
export GOOS
export GOARCH
export GOBIN
PATH=$PATH:$GOBIN
export PATH
インストールが完了すると$GOBINのディレクトリにコンパイラのバイナリが
入っている。
お決まりのHello Woldでテスト。

// file name: test.go
package main
import fmt “fmt”
func main() {
fmt.Printf(“Hello world\n”);
}

32bitインテルCPU向けのコンパイラは 8g だけどリンクは勝ってには
してくれない。なのでコンパイルとリンクで2回コマンドを実行する。
8g test.go
8l test.8
すると実効バイナリの 8.out ができたので
./8.out してみると「Hello world」が表示された。

iphone VS wimax+ipod touch

首都圏ではwimaxが開始し、23区内では大体どこでもwimaxで通信できるようになった。
主に首都圏で活動する人でiphoneを使いたいけれど契約の2年縛りが気になる場合などは
iphoneの代わりにwimaxとipod touchという組み合わせも検討できる。
そこで、UQ WimaxとiPod Touchの組み合わせとiPhoneでホワイトプランにした場合を比較してみた。

比較項目
iPhone (8GB)
UQ Wimax + iPod Touch

通信費用

ホワイトプラン 980円
パケット定額 4410円
S!ベーシックパック 315円
合計: 5705円

UQ Wimax 4480円

初期費用
なし

[...]