func09
JavaのString#hashCode()をRubyで再現
Javaで作ってあるアプリをiPhoneに移植しようと思ったが、まずObjective-Cがわからないので、Rubyに移植してみようと考えた。
移植元のアプリの中でさらっとString#hashCode()を使っていて困った。
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#hashCode()
この文字列のハッシュコードを返します。String のハッシュコードは、次の方法で計算します。
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
上記の通りの計算をしてもRubyでは同じ数値にならない。 どうもJavaのintとRubyのIntegerは挙動が違うからのようだ。
java のInteger int 最大値超えるとどうなるの
http://becomehappy.orz.hm/smithlog/article.php?id=370
Javaのintは-0x80000000~0x7fffffffの間をぐるぐるループしているらしい。
最大値(2147483647)を超えたら最小値(-2147483648)に戻してやる気遣いが必要だ。
というわけで作ってみたのが下記。
hashcode_gen.rb
module EmurateJavaStringHashCode
def to_hashcode
max = 2 ** 31 - 1 # Javaのint最大値
min = -2 ** 31 # Javaのint最小値
h = 0
n = self.size
n.times do |i|
h = 31 * h + self[i]
while h <min || max <h
h = max - ( min - h ) + 1 if h <min
h = min - ( max - h ) - 1 if max <h
end
end
h
end
end
class String
include EmurateJavaStringHashCode
end
key = ARGV.first
puts key.to_hashcode
確認用のjava HashCodeGenerator.java
public static void main(String argv[]) {
System.out.println( argv[0].hashCode() );
}
}
テストスクリプト test/test_hashcode_gen.rb
$:.unshift "#{File.dirname(__FILE__)}/../"
$:.unshift File.dirname(__FILE__)
class HashCodeGenTest <Test::Unit::TestCase
def test_random
10.times do
str = [Array.new(rand(20)){rand(256).chr}.join].pack("m").chomp
j = `java HashCodeGenerater '#{str}'`
r = `ruby hashcode_gen.rb '#{str}'`
assert_equal(j,r)
end
end
end
テスト結果
Started
.
Finished in 1.478273 seconds.
1 tests, 10 assertions, 0 failures, 0 errors
ちゃんと通りました。
--
ついでにCでも書いてみた。
#include <string.h>
int strhashcode( char *word );
int main( int argc, char** argv)
{
printf("hashcode = %d\n", strhashcode(argv[1]) );
return 0;
}
int strhashcode( char *word){
int len,i,h = 0;
len = strlen(word);
for (i=0; i<len; i++){
h = 31 * h + word[i];
}
return h;
}
- Comments: 0
- Trackbacks: 0
[works] eyeVioがHDビデオに対応
- 2008-06-30 (月)
- works | actionscript2.0 | flash
1 users
0 user
0 user
eyeVioがHD動画に対応してます。
今回もいつも通り、動画のプレイヤーと、JavaScriptあたりをやりました。
FlashPlayerは7で作っているのでExternalInterfaceクラスが使えないわけですが、 それでも一生懸命JavaScriptと連携しています。
SWFからダイナミックにHTMLのレイアウトを弄ったりして、なかなか楽しいです。
今回途中で非同期処理の管理に嫌気がさしたのでAS2用のスレッドライブラリを作りました。
AS3ではSparkの「そうめん」のような素晴らしいライブラリがあるんですが、AS2向けでシンプルなのは見つからなかったので 自作で
new Wait(1),
new XMLLoad('hoge.xml'),
new Wait(1),
new FunctionJob(this,this.normalfunc)
).start();
こんな感じで書けるように。
もともとのソースコードのコールバック関数をそのまま弄らずシーケンス処理に組み込めるように 関数をひとつのスレッドとして利用できるようにしたのが正解でした。
非同期の整理のつもりでスレッドライブラリを作りましたが、メソッドが集中しやすいコントローラー系クラスの処理分散にも効果を発揮してウハウハ。
時代遅れのAS2なので、気合いをいれて拡張していくつもりはサラサラないけど、 気が向いたら公開したいですね。
- Comments: 0
- Trackbacks: 0
KDDIのSMTPリレーサーバ
家のサーバから外にメールが送信できなくて、ハマっていたのだけど プロバイダのOP25Bという対策の所為だということに、やっと気付いた。
うちはKDDI 下記のページを探すのに2〜3時間かかった。
http://www.auone-net.jp/support/trouble/mail_other.html
relay-mta.auone-net.jp
KDDIはサポートサイトをFlexで作ったり、Macで表示されなかったり かなり酷いと思います。。
- Comments: 0
- Trackbacks: 0
弊社の動画が米GIZMODOに掲載された
- 2008-06-16 (月)
- 日記
0 user
0 user
0 user
僕がつとめている会社で作った動画が米GIZMODOに掲載されますた。
http://gizmodo.com/5016555/r2+d2s-in-ur-serverz-monitoring-ur-packetz
R2D2のプロジェクタをサーバ監視に使ってるよ~♪っていう動画です。おいらもちょろっと出てます。
- Comments: 0
- Trackbacks: 0
Apple Keyboard Wireless購入と、caps lock遅延問題。
Apple Keyboard Wirelessを購入しました。
最近会社用のHHKが経年劣化のせいで、キーを押しづらくなったせいで 腱鞘炎になりそうな気配がしたので、買い替えました。
で、emacserなのでcapslockはキーボード設定の修飾キーのところで ctrlに切り替えて使っていますが、巷で言われているcapslockの遅延問題が起こりません。 うちの環境だと、ライトがずっと消えたまま、普通に使えています!!
環境はMacOS10.5.3です。
ということで、遅延問題で購入を思いとどまっていた方々、じゃんじゃん買いましょうよ!
個人的にはHHKLite2よりも良い感じなので、家も会社もApple Keyboard Wirelessにしたいと思ってます。
- Comments: 0
- Trackbacks: 0
Macに繋がるテプラが発売される
テプラが欲しい。
テプラでMacの美しい書体が使えればなぁと、かなり本気で考えていたところに発表されたのが
Macにつながり、Macの内蔵フォントが使えて、Macにあわせてオシャレな筐体をもった新生テプラ「SR3700P」だ。
http://news.kakaku.com/prdnews/cd=kaden/ctcd=2076/id=2640/
http://www.rakuten.co.jp/officeland/624321/995786/
2万円は高いな。10,000円くらいならすぐ買うのに。。
- Comments: 0
- Trackbacks: 0
[linux]自宅サーバ
久しぶりに投稿します。 最近自宅サーバを買いました。DellのPowerEdge。送料込みで3.5万くらい。
Railsでアプリを大量生産するような場所が欲しかったんですが、 経済的なアレでは、とても専用サーバを借りたりとかはできませんので。
HDDがカリカリいうのが気にはなりますが、ファンは静かで、寝室に置いても気にならないかも。
--
LAN用にDNSを立てたのだけど、nslookupでは正引きできるのに、pingやtracerouteでは名前解決できない状態でハマってる。 BINDは難しくて嫌だなぁ。
- Comments: 0
- Trackbacks: 0
[メモ]日本 Ruby 会議 2008 チケット購入について
- 2008-05-07 (水)
- 日記
0 user
0 user
0 user
Ruby会議のチケット購入の情報が出てた
日本 Ruby 会議 2008 チケット購入について~ http://jp.rubyist.net/RubyKaigi2008/?BuyTicket
- Comments: 0
- Trackbacks: 0
[Ruby]Array#eachの変な挙動
結構Rubyに慣れて来たと思う。でも久々にRubyこえーと思った。
printf "%s ", i
end
#=> 1 2 3
これは問題ない。Array#eachのブロックが受け取る引数は配列の要素そのものだけ。
しかし恐ろしいことに、配列の要素がさらに配列で、ブロックの引数が2つ以上だと挙動が変わる。
printf "%s=>%d ",n,m
end
#=> a=>1 b=>2
ネストされた配列の要素を展開して引数に渡している・・・。この挙動はリファレンスに載っていない。
ちなみに引数を1つにすると
printf "%s ",n.class
end
#=> Array Array
やっぱり要素をそのまま受け取る。
こえーーRubyこえーー。
参考: 天泣記#2008-08-16
[ruby-dev:29616] を実装したとき、最初は上のように括弧で括ればいいと考えて、配列の展開は行わなかった。 しかし、テストを通すために必要なところに括弧を挿入していったところ、最終的に rss でめげたのである。 多すぎてあきらめたのである。めげてしまい、また、配列の展開は使い勝手がいいということを認めざるを得なかったため、配列の展開は行うことにした。
- Comments: 0
- Trackbacks: 0
Ruby会議2008
- 2008-04-12 (土)
- ruby
0 user
0 user
0 user
6/20~22の3日間。チケットの詳細は未定。
最近Rubyの勉強会に行きたいなぁと思ってるんですが これは是非行きたい。 今年はデブサミ行かなかったから、こっちに行こうかね。
なんかロックフェスに行くみたいな感覚だな。 今年はフジロック行かなかったから、朝霧行くか?みたいな。 子供が大きくなったら朝霧行きたいなぁ。
- Comments: 0
- Trackbacks: 0
- Search
- Feeds
- Meta