Home

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

#!/usr/bin/env ruby

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 class HashCodeGenerater {
    public static void main(String argv[]) {
        System.out.println( argv[0].hashCode() );
    }
}

テストスクリプト test/test_hashcode_gen.rb

require 'test/unit'

$:.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

テスト結果

Loaded suite test/hashcodegen_test
Started
.
Finished in 1.478273 seconds.

1 tests, 10 assertions, 0 failures, 0 errors

ちゃんと通りました。

--

ついでにCでも書いてみた。

#include <stdio.h>
#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;
}

[works] eyeVioがHDビデオに対応

eyeVioがHD動画に対応してます。

http://eyevio.jp/

今回もいつも通り、動画のプレイヤーと、JavaScriptあたりをやりました。

FlashPlayerは7で作っているのでExternalInterfaceクラスが使えないわけですが、 それでも一生懸命JavaScriptと連携しています。

SWFからダイナミックにHTMLのレイアウトを弄ったりして、なかなか楽しいです。

今回途中で非同期処理の管理に嫌気がさしたのでAS2用のスレッドライブラリを作りました。

AS3ではSparkの「そうめん」のような素晴らしいライブラリがあるんですが、AS2向けでシンプルなのは見つからなかったので 自作で

new Sequence(
  new Wait(1),
  new XMLLoad('hoge.xml'),
  new Wait(1),
  new FunctionJob(this,this.normalfunc)
).start();

こんな感じで書けるように。

もともとのソースコードのコールバック関数をそのまま弄らずシーケンス処理に組み込めるように 関数をひとつのスレッドとして利用できるようにしたのが正解でした。

非同期の整理のつもりでスレッドライブラリを作りましたが、メソッドが集中しやすいコントローラー系クラスの処理分散にも効果を発揮してウハウハ。

時代遅れのAS2なので、気合いをいれて拡張していくつもりはサラサラないけど、 気が向いたら公開したいですね。

KDDIのSMTPリレーサーバ

家のサーバから外にメールが送信できなくて、ハマっていたのだけど プロバイダのOP25Bという対策の所為だということに、やっと気付いた。

うちはKDDI 下記のページを探すのに2〜3時間かかった。

http://www.auone-net.jp/support/trouble/mail_other.html

relay-mta.auone-net.jp

KDDIはサポートサイトをFlexで作ったり、Macで表示されなかったり かなり酷いと思います。。

弊社の動画が米GIZMODOに掲載された

  • 2008-06-16 (月)
  • 日記
  • add to hatena hatena.comment 0 user add to del.icio.us 0 user add to livedoor.clip 0 user

僕がつとめている会社で作った動画が米GIZMODOに掲載されますた。

http://gizmodo.com/5016555/r2+d2s-in-ur-serverz-monitoring-ur-packetz

R2D2のプロジェクタをサーバ監視に使ってるよ~♪っていう動画です。おいらもちょろっと出てます。

Apple Keyboard Wireless購入と、caps lock遅延問題。

  • 2008-06-03 (火)
  • mac | 日記
  • add to hatena hatena.comment 0 user add to del.icio.us 0 user add to livedoor.clip 0 user

Apple Keyboard Wirelessを購入しました。

最近会社用のHHKが経年劣化のせいで、キーを押しづらくなったせいで 腱鞘炎になりそうな気配がしたので、買い替えました。

で、emacserなのでcapslockはキーボード設定の修飾キーのところで ctrlに切り替えて使っていますが、巷で言われているcapslockの遅延問題が起こりません。 うちの環境だと、ライトがずっと消えたまま、普通に使えています!!

環境はMacOS10.5.3です。

ということで、遅延問題で購入を思いとどまっていた方々、じゃんじゃん買いましょうよ!

個人的にはHHKLite2よりも良い感じなので、家も会社もApple Keyboard Wirelessにしたいと思ってます。

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円くらいならすぐ買うのに。。

[linux]自宅サーバ

久しぶりに投稿します。 最近自宅サーバを買いました。DellのPowerEdge。送料込みで3.5万くらい。

Railsでアプリを大量生産するような場所が欲しかったんですが、 経済的なアレでは、とても専用サーバを借りたりとかはできませんので。

HDDがカリカリいうのが気にはなりますが、ファンは静かで、寝室に置いても気にならないかも。

--

LAN用にDNSを立てたのだけど、nslookupでは正引きできるのに、pingやtracerouteでは名前解決できない状態でハマってる。 BINDは難しくて嫌だなぁ。

[メモ]日本 Ruby 会議 2008 チケット購入について

  • 2008-05-07 (水)
  • 日記
  • add to hatena hatena.comment 0 user add to del.icio.us 0 user add to livedoor.clip 0 user

Ruby会議のチケット購入の情報が出てた

日本 Ruby 会議 2008 チケット購入について~ http://jp.rubyist.net/RubyKaigi2008/?BuyTicket

[Ruby]Array#eachの変な挙動

結構Rubyに慣れて来たと思う。でも久々にRubyこえーと思った。

[1,2,3].each do | i |
  printf "%s ", i
end
#=> 1 2 3

これは問題ない。Array#eachのブロックが受け取る引数は配列の要素そのものだけ。

しかし恐ろしいことに、配列の要素がさらに配列で、ブロックの引数が2つ以上だと挙動が変わる。

[['a',1],['b',2]].each do | n,m |
  printf "%s=>%d ",n,m
end
#=> a=>1 b=>2

ネストされた配列の要素を展開して引数に渡している・・・。この挙動はリファレンスに載っていない。

ちなみに引数を1つにすると

[['a',1],['b',2]].each do | n |
  printf "%s ",n.class
end
#=> Array Array

やっぱり要素をそのまま受け取る。

こえーーRubyこえーー。

参考: 天泣記#2008-08-16

[ruby-dev:29616] を実装したとき、最初は上のように括弧で括ればいいと考えて、配列の展開は行わなかった。 しかし、テストを通すために必要なところに括弧を挿入していったところ、最終的に rss でめげたのである。 多すぎてあきらめたのである。めげてしまい、また、配列の展開は使い勝手がいいということを認めざるを得なかったため、配列の展開は行うことにした。

Ruby会議2008

  • 2008-04-12 (土)
  • ruby
  • add to hatena hatena.comment 0 user add to del.icio.us 0 user add to livedoor.clip 0 user

Ruby会議2008

6/20~22の3日間。チケットの詳細は未定。

最近Rubyの勉強会に行きたいなぁと思ってるんですが これは是非行きたい。 今年はデブサミ行かなかったから、こっちに行こうかね。

なんかロックフェスに行くみたいな感覚だな。 今年はフジロック行かなかったから、朝霧行くか?みたいな。 子供が大きくなったら朝霧行きたいなぁ。

Home

Search
Feeds
Meta

Return to page top