10 月
09
2008
URLをわりと短くするサービスhttp://shur.in/をリリースしました。

最近はてな界隈で話題のIT業界のえがちゃん
サービスの内容はどうあれ、週に1つ2つはサービスをリリースする勢いは見習いたいものだと感心していた。
で、えがちゃんが作ってる数多くのサービスの中で
サイトURL短縮君つー、tinyurlライクなサービスがあって
URL圧縮サービスの仕組みとか全く考えたことが無かった僕は、えがちゃんやるなーと思っていたのだけど
ただ単にqurl.comのAPIを叩いているだけだった。
全然サービスでもなんでもねーー。
というわけで自分で考えつつ作ってみた。実装は3〜4時間くらいで、ドメイン取るのに時間がかかった・・・。
仕組みは簡単で
2,176,782,336(36の6乗)からランダムに数字を選んで、それをPKとしてDBにURLを保存。
PKの数字を36進数に変換して一緒に保存しておくだけ。
rubyは36進数の相互変換が超ラクチンなので簡単だった。
code = rand(36**6).to_s(36)
code.to_i(36)
9 月
28
2008

パスワードをシンプルに管理できるHummingPassというサービスをリリースしました。ベータ版です。
HummingPassβ
mixiやTwitterやGoogleなど、どんどん増えていくアカウント情報をオンライン上で一括管理するためのサービスで、タグによる分類が可能です。
もともと自分のために作っていたのですが、2週間前のRails on Award 2008の存在をしり、ほぼ全部作り直しました。
デザイン、コーディング、JavaScript、システム、サーバ、全部ひとりでやりました。
どうぞ、よろしくお願いします。
9 月
26
2008
こんにちはfunc09です。
Rails on Award2008に出品すべく、Webサービスを誠意作成中です。
僕はHTMLオペレーターから始まり、デザイナに転向し、Flashデベロッパに転向し、今プログラマ兼サーバ管理者という節操のないWeb人生を渡って来ていますので、デザインからサーバ構築まで全部ひとりでやってます、というのが最大の売りです。
今週末中にはリリースできると思うので、よろしくおながしまつ。
9 月
17
2008
タイトルの通り。
Hogeクラスにhoge1〜hoge10までのインスタンス変数を作って、パブリックメソッドにする場合、以下のような感じで書ける。
class Hoge
attr_accessor *Array.new(10){|i| "hoge#{i}".to_sym }
def initialize
10.times do |i|
self.instance_variable_set("@hoge#{i}".to_sym,i)
end
end
end
hoge = Hoge.new
p hoge
p hoge.hoge1
もっときれいに書けるかな
8 月
30
2008
ブログパーツのようなFlashで、いろいろなサイトに埋め込まれるSWFの
埋め込まれているページのURLを取得する方法。
import flash.external.*;
var locationHref:String = String(ExternalInterface.call("function(){return location.href}"));
ExternalInterface.callの1番目の引数は、呼び出すJavaScriptのメソッド名という事になっていますが
ExternalInterface.call("myMethod","args1","args2");
は単純に以下のようなJSが実行されているものと考えられるので
eval("myMethod").apply(window,["args1","args2"]);
まぁ、ようするに無名関数をFlash側で引数としてあげればいいと。
8 月
27
2008
CodeIgniterというフレームワークがなかなか良い。
PHPのフレームワークではCakePHPをよく利用するのだけれど、使えば使うほど何がゴールなのかわからないフレームワークだなと感じる。非常にRuby on Railsに似ているのだけど、RailsはRubyだから成り立っているような側面が多いから、結局PHPで実装しようとすると非常に中途半端になる。CakePHPは高機能だけど、おせっかいだし、そのおせっかいさも中途半端だなと思う。Railsも随分おせっかいだけど、かゆいところに手が届きすぎるくらい徹底的におせっかいだ。
CodeIgniterは見るからにシンプルで軽量。PHPでスクラッチやセミスクラッチするのは面倒だけど、おおげさなフレームワークは必要ないような時はぴったりだと思う。
最低限のMVCは用意されていて、あとはPHPとヘルパーライブラリでがんばれ、フレームワーク特有の俺節はあんまりないよ。そんなフレームワークな感じがする。
8 月
26
2008
一ヶ月に1エントリーは書かないと・・・。
PassengerでRailsのdevelopment環境を動かす方法。
恐らくPassenger2以降のみです。
<VirtualHost *:80>
ServerName www.hoge.com
DocumentRoot /home/hoge/hogeproject/public
RailsEnv development
RailsAllowModRewrite off
</VirtualHost>
参考
http://w.koshigoe.jp/study/?%5BRuby%5D+Passenger#l20
7 月
02
2008
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 最大値超えるとどうなるの<br/>
http://becomehappy.orz.hm/smithlog/article.php?id=370
Javaのintは-0x80000000~0x7fffffffの間をぐるぐるループしているらしい。<br/>
最大値(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;
}
6 月
30
2008
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なので、気合いをいれて拡張していくつもりはサラサラないけど、
気が向いたら公開したいですね。
6 月
25
2008
家のサーバから外にメールが送信できなくて、ハマっていたのだけど
プロバイダのOP25Bという対策の所為だということに、やっと気付いた。
うちはKDDI
下記のページを探すのに2〜3時間かかった。
http://www.auone-net.jp/support/trouble/mail_other.html
relay-mta.auone-net.jp
KDDIはサポートサイトをFlexで作ったり、Macで表示されなかったり
かなり酷いと思います。。