Rails ActiveRecord でランダムにレコードを取得する方法

Rails No Comments »

まぁ受け売りなんですが、備忘録としてメモ。

モデル名 : Item として読んでくだしあ。

ランダムに 1 レコードを取得したい場合

発行する SQL は2回だけど DB 依存しないパターン(offset 使ってるから割と早そう)

offset = rand(Item.count :all)
Item.find :first, :offset => offset

発行する SQL は1回だけど DB 依存するパターン(MySQLの場合)

Item.find(:first, :order => 'RAND()')

ランダムに N レコードを取得したい場合(MySQLの場合)

Item.find(:all, :order => 'RAND()', :limit => 10)

ちなみに、’RAND()’ は DB に依存するコマンドなので要注意!他のDBの場合は、

  • Postgresql / SQLite : RANDOM()
  • Microsoft SQL Server : NEWID()
  • Oracle : dbms_random.value

参照 : SQL to Select a random row from a database table

※ SQLite と MySQL しか試してないです。ごめんなさい><

Rails ActiveRecord は、結局 :order で渡された文字列を SQL を生成するときに、 ORDER の後に繋げてるだけなので、書いたままの SQL が出来ると思えば好きなように書けるんですねぇ。

あと、当たり前だけどレコード数が多いと、きっと困ることになると思います。そもそもレコード数が多いテーブルからランダムに N レコード取得したいっていう要望が、そもそも間違ってる気もしますが。

詳細はこちら(英語)へ。性能の話や、DB に依存するのではなくて Ruby プログラムでランダムにする方法なんかも載ってます。それでは。

3G携帯のみに限定した携帯サイトを作る前に3G携帯普及率を調べてみた。

未分類 2 Comments »

今リニューアル開発している Web サイトの携帯向けサイトを作ろうとして、( Rails ベースなので)jpmobile というプラグインを使って、キャリア別の View (ひらたく言うとテンプレート)を作ろっかなぁと思ってます。昔なら、DoCoMo/au/Softbank の3つのテンプレートを作って(こだわった開発ならもっと分けるのかなぁ)、んで、ユーザエージェントでテンプレートを振り分けてというのが一般的かと思うのですが。自分も3,4年前に、そんな開発してました。Struts ベースだったので携帯用JSPを何枚書いた事か・・・au の HDML とか書いたさぁ、デッキとか、うきーっ。

愚痴はさておき、あれから3,4年、携帯サイトに携わってないので「最近の携帯サイト開発は、どんな感じなんだろうなぁ」と、あれこれ Google 先生に聞いたりしてたわけです。すると

ウノウラボ Unoh Labs: 3G携帯のみに限定したサイトを作る場合

を見つけて、読んでみると「3G携帯に限定したらテンプレート1つで良くね!?」 と無知な僕は喜びすぎて、今日は帰ろうかと思ったぐらいです。嬉しすぎて。

きっと、それでもキャリアの XHTML 独自拡張とか、外部 CSS がドコモはダメだとか、UTF8 なページでも au はSJIS でリクエストを送ってくるとか、問題は山積みなんでしょうけど、それでも基本 XHTML/UTF8 なテンプレートを作れば良いんですよね。いい時代になったなぁ。今後、地獄がまってるんだろうけど、うん。

でも、ちょっと待ってください。3G携帯限定にしたら、3G携帯じゃない人は困ってしまいますよね。100%の人は救えないけど(※もちろん、需要があれば順次対応するべき)、3G携帯の普及率ぐらいは、抑えておきたいですよね。ってことで調べました。

ソース : 携帯電話・PHS契約数ページ 電気通信事業者協会(TCA) http://www.tca.or.jp/japan/database/daisu/index.html の2008年5月

2008年5月の契約数からキャリア別3G携帯普及率

キャリア 3G契約数 総契約数 3G率
ドコモ 44,819,800 53,544,500 84%
au 29,898,900 30,292,900 99%
ソフトバンク 14,806,300 18,952,800 78%

これぐらい普及していれば3G携帯のみに限定しても OK ですかね。 絶対だめ><というシステムや企業はあるとは思いますが。それでは。

ARP Spoofing とな

セキュリティ No Comments »

Webに携わっているなら知っておいて損はないかなぁとメモ。

はてブ追ってる人なら読んでると思うけど、ethna.jpやjp2.php.netでActiveX や Flash の脆弱性をついた攻撃をする html を読み込む iframeが差し込まれたという事件についてのまとめ。素晴らしく分かりやすいまとめに感謝。

 ethna.jpやjp2.php.netに発生したトラブルについて - maru.cc@はてな

今回のセキュリティ問題は ARP Spoofing というクラックらしい。

超わかりやすい ARP Spoofing の解説。

The Weekly Herald | ARPスプーフィングで通信傍受!

ってことはだよ。ARP Spoofing やられちゃうってことは、そもそもホスティング業者の内部に踏まれてるホストがあるってことだよね!進入された上に乗っ取られているんだよね。そっちの方が、問題なんじゃ。。。

セキュリティは深いですなぁ。

Haskell で日本語(マルチバイト文字)を使う方法

Haskell No Comments »

GHC(Haskell コンパイラ) 単体では日本語(マルチバイト文字)が使えません。単純に出力しようとすると文字化けしちゃいます><
なぜかというと、

http://ja.doukaku.org/comment/2957/ から引用

さらにghcでは文字は内部的にはUCS4で表現されているといってよいのですが,
エンコーディングを変換する機構が標準では提供されていません.
外部から文字列データを読み込み,それを逆転し,外部へ出力するためには
エンコーディングを変換する機構を自前で用意するか,それ用のライブラリ
モジュールを使う必要があります

そこで色んな対処方があるのですが、utf8-string という素敵なパッケージがありますので、これを使います。

環境

  • GHC 6.8.2
  • Ubuntu (UTF8 な OS なら何でも)

utf8-string をインストール

wget http://hackage.haskell.org/packages/archive/utf8-string/0.3.1/utf8-string-0.3.1.tar.gz
tar zxf utf8-string-0.3.1.tar.gz
cd utf8-string-0.3.1/
runhaskell Setup.lhs configure
runhaskell Setup.lhs build
sudo runhaskell Setup.lhs install

ちゃんとインストールできたか確認

ghc-pkg -l | grep utf8
    unix-2.3.0.0, utf8-string-0.3.1, xhtml-3000.0.2.1

utf8-string が表示されればOK!

試してみる

以下のコードを test.hs に保存。

module Main where
import qualified System.IO.UTF8 as U

main = do
  U.putStrLn "あいうえお"

コンパイル

ghc --make test.hs

実行

$ ./test
あいうえお

日本語きたーーー

System.IO.UTF8 が提供する他のメソッドについては以下の通り。他にもさっき落としたソースを読めば使えそうなメソッドがありそうな感じです。Codec.Binary.UTF8.String とか他にもいろんなモジュールがあるっぽい。

module System.IO.UTF8 (
      print
    , putStr
    , putStrLn
    , getLine
    , readLn
    , readFile
    , writeFile
    , appendFile
    , getContents
    , hGetLine
    , hGetContents
    , hPutStr
    , hPutStrLn
  ) where

ちなみに今回みたいに外部パッケージを import したファイルをコンパイルする時には make オプションを付けないとリンクが作れないみたいな以下のようなエラーメッセージが出ます。

$ ghc test.hs
test.o: In function `siz_info':
(.text+0xaa): undefined reference to `utf8zmstringzm0zi3zi1_SystemziIOziUTF8_putStrLn_closure'
test.o: In function `siz_info':
(.text+0x14f): undefined reference to `__stginit_utf8zmstringzm0zi3zi1_SystemziIOziUTF8_'
test.o: In function `siz_closure':
(.data+0x14): undefined reference to `utf8zmstringzm0zi3zi1_SystemziIOziUTF8_putStrLn_closure'
collect2: ld はステータス 1 で終了しました
WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン