Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
rubyneko - ruby
[go: Go Back, main page]

いま話題の人気ページ&動画
ようこそ ゲスト さん
ホーム
ログイン

ruby

using sqlite3 with ActiveRecord without Rails

* 普通のRubyプログラムで、データはplainなテキストじゃなく、sqlite3使いたい
* sqlは書きたくない (後にMySQLなどに簡単に変更できるように保ちたい)
* 無駄に複雑にしたくない。ベタに書きたい

こんなシチュエーションでの例。


require 'rubygems'
require 'active_record'

ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => 'sqliter.db',
:timeout => 5000
)

ActiveRecord::Schema.verbose = false
ActiveRecord::Schema.define do
create_table "users", :force => true do |t|
t.column "name", :string
end
end


class User < ActiveRecord::Base
end


User.create(:name => "taro")
User.create(:name => "jiro")
p User.find(:all)



ベタに書くと、こんな感じになる。


ちょっと細かく:

ActiveRecord::SchemaはActiveRecord::Migrationを継承している。

ActiveRecord::Schema.verbose = false
これがないと、ActiveRecord::Migrationのwriteメソッドが
SQL実行結果を標準出力に出力してしまう。

ActiveRecord::Schema.defineのブロックの中に
verbose = false
と書いてみたが、ダメだった。

影武者 0.0.1リリース

Kagemushaをリリースしました。
…といっても私はドキュメント書いただけです。

Kagemusha – 影武者
http://kagemusha.rubyforge.org/


Rubyの任意のクラスの「影武者」を作ることができるライブラリです。
特定のスコープの範囲内で、オブジェクトの挙動を上書きしたいときに使います。
(SmalltalkのClassboxみたいなもの。←あまりよく知らないけど)

インストール:
sudo gem install kagemusha


使用例:

    require "rubygems"
require "kagemusha"

musha = Kagemusha.new(Time)
musha.defs(:now) { self.local(1984, 6, 11) }
musha.def(:+) { |other| other }
musha.swap {
p Time.now
p Time.now + 60 * 60 * 24
}






影武者作成で一番苦労したのは、ネーミングです。

internationalization in ruby on rails

Ruby/Rails勉強会@関西-18で発表してきました。

internationalization in ruby on rails、
長いので略してi35sというお題で発表してきました。

発表資料はコチラ:
I35s » SlideShare
http://www.slideshare.net/ujihisa/i35s

# 日本Rubyの会 公式Wiki - Ruby/Rails勉強会@関西-18
# http://jp.rubyist.net/?KansaiWorkshop18#l7

15分のLightning Talkで、
* 前半 - 英語重要
* 中盤 - Ruby-GetText-Packageの紹介
* 後半 - Ruby-GetText-PackageをRailsで使うデモ
* おまけ - 勉強会とRailsアプリ事例紹介(宣伝)
の4部構成でした。

今回はネタに走らず真面目に発表するつもりでしたが、
つい悪ノリしてDesktop Tower Defenseやら
ウダーやら関数型言語Rubyやらの出番が出てくるはめになってしまいました。
今では反省しています。


で、ちょっとだけ発表の補足をしておきます。

今回の発表の技術的なテーマはRuby-GetText-Packageを
Railsで使うためにはどうすればよいかということになるのですが、
一番主張したかったのは「英語重要」の部分です。

ものすごく大雑把にとらえると、Webサービスを作るときに
はじめから英語で作っておけば、いきなり3.6倍お得なわけです。
得をする道があるなら、はじめからそれを選んでおいちゃえばいいですよね。

私の英語力は糞レベルですが、無理して今回の資料は
ほとんど全て英語で記述しました。
(部分的に中国語です)
ネイティブの人が見たら奇妙な表現があるかもですが、
多分おおかた伝えたいことは伝わるんじゃないかなと思ってます。


railsのrakeでのテスト実行時に、
ソースコードetc中に日本語を記述してしまっていないかを
チェックするものも用意しておくといいかもしれません。


# Psychsさんから修正いただきました。Arabian -> Arabic

るびま読書会#4

るびま読書会#4いってきた。
がっつり勉強してきた。

今回はログをKeyNoteでとってみた。
ファイルはこちら:

http://jitor.net/rubyma4.pdf

暫定的な置き場所なので、あとで別の場所に移動する。
あと、もしかしたらファイル内容修正するかも。

[ruby] ArrayのかわりにSetを使いたいときもあるよね

Arrayと似て非なるクラス、Set。
それぞれが果たす役割が違うので、使い分ける必要がある。

場合によっては、Arrayは不要でSetだけが欲しいときがある。
が、
* Arrayには[1, 2, 3]などいったステキなリテラルがある
* 多くのEnumerableのメソッドはArrayを返す (例: map, select)
ので、Arrayを基本とした方がなにかとラクになってしまうのだ。

Arrayを全てSetで上書きしたい!
どうすればよいだろうか?



irbでいろいろと試してみる。

irb -rset
>> Array = Set
(irb):2: warning: already initialized constant Array


warningが出るが、気にしない。
とりあえずこれでArrayをSetで上書きした。

>> [1, 2, 3, 4, 5].class
=> Array

リテラルの挙動は上書きできなかったか…

>> Array.new [1, 2, 3, 4, 5]
=> #

これはOK

>> Array.new([1, 2, 3, 4, 5]).map {|i| i*2 }.class
=> Array

NG


手詰まり。
リテラルの挙動を上書きするのは無理なのか…?

[Ruby] Infty

netswitch! | netswitch!
http://blog.netswitch.jp/articles/2007/08/01/


にコメントなりトラックバックしようと思ったけど
できないみたいなので、ここに普通に書いてみる。

irb -Kuするとすごい名前の変数が作れるわけで、
無限と戯れましょうというお話。

ここで出てくる変数∞だけど、
MacならOption+5で入力できる。
非常に入力しやすい。

というわけで無限が好きなRubyistは
Macを購入しましょう。
USキー配置だとなおよろしい。

学んできたプログラミング言語

? : HyperCard
中2: Perl
中3: C, Tcl/tk
高1:
高2:
高3:
大1: (C), PHP, Java
大2: ML
大3: Prolog
院1: Ruby
院2: JavaScript, Haskell, Erlang, Common Lisp

中学生のときにEric S. Raymondの
How to become a hackerを
当時使っていたSlackware LinuxのJFか何かで読んだ。
また当時購読していたLinux系の雑誌による影響もあった。
(雑誌名は忘れた…。編集長が風穴さんで、よしだともこさんの連載があったような)
このあたりがきっかけで勉強をはじめた。

高校時代がみごとに空白。
この期間はLinuxをいじったりしていたものの
プログラミングはほとんどやってなかった。

大学1年のころに
* 達人プログラマー
* UNIXという考えかた
* オブジェクト脳のつくりかた
あたりを読んで、院1のころに
* センスオブプログラミング
を読んだ。このあたりの本による影響が大きいと思う。

学んだ言語の変遷を見るとわかるが、Windows系と
低レイヤを可能な限り避けている。

そもそもアンチMSで、フリー主義者で、またアンチGUIだったので
MSによるVisual.*系は一切手を出していなかった。
おかげでそれ関係には本当に疎い。

また、どうしても上のレイヤ上のレイヤとばかり気を取られて
低レイヤがほとんど全く分からないままになってしまった。
ポインタ操作の意義がよくわからなかったのだ。
無名関数での再帰とか、そういったことばかりに注目してしまう性癖になってしまったのだ。


大学の講義で習ったのがC, Java, ML, Prolog。
Cは中学生のときに勉強したけどほとんど忘れていたので
実質大学1年のときに勉強したようなもの。
Javaも同様に、講義より前に本読んでテトリスの最適化とか作ってた記憶がある。

ML, Prologは少ししかやっていないので、文法などほとんど忘れてしまったが
その概念はすごく深く印象に残った。
いまHaskellにハマっているのは、間違いなく当時の影響だ。

関数定義は
def foo
123
end

ではなく
foo = 123

のような記法で行いたいと思ってしまう。
forやwhileは使いたくない。
などなど…


いま注目しているのはLispのマクロ。
さてさて、どんな世界が見えてくるんだろうか。



以上、若干酔ったままの雑記でした。

ruby vs perl

残念ながらrubyにはperlに対して決定的に負けている部分がある。
これはタイプのしやすさである。

rubyを入力するとき、
r: 左手の人差し指を上にずらす
u: 右手の人差し指を上にずらす
b: 左手の人差し指を斜め下にずらす
y: 右手の人差し指を斜め上にずらす
となっていて、左右交互にタイプできるので
比較的入力しやすい。

perlを入力するときは、
p: 右手小指または薬指 (私は後者)
e: 左手中指
r: 左手人差し指
l: 右手薬指
となっていて、erを一気に入力すると
実質左右交互のタイプするのと同じだ。

rubyに比べてperlの方がerの流れがよくて
入力しやすい。
この点において、rubyはperlに負けていることを
認めなければならない。


haskellは文字数が多いものの、比較的入力しやすい。
haskまでだとperlにかなり近いレベルだ。
もちろん実行するときはghcやhugsと入力するので
haskellの場合はhaskellという言葉の
キー入力速度はあまり重要でないかもしれない。

Erlangのerlはperl - pなのでさらに良い…
はずだが、何故かperlの方が気持ちよく入力できる。
このあたりになってくると個人の好みの差が出てくるかもしれない。

期待の新言語xtalは、xtaの流れが
最高に入力しにくい。残念だ。

scalaも片手率が高いが、こちらはなぜか
それほど入力しづらくない。


なお、オレポータビリティ重要なので
キー配置変更は考慮していません。

Haskellで偽証明を暴く

数学的帰納法を用いた有名な嘘の証明がある。

------------------------------
全ての人が数学好きであることを示す。
「グループの構成人数が0人ならば、グループ全員が数学好き」は真である。
グループの構成人数がk人以下ならばグループ全員が数学好きと仮定する。
このとき、構成人数が1人のグループとk人のグループは全員数学好きなので、
n+1人のグループも全員数学好きとなる。
よって、どんな構成人数のグループでも必ず数学好きである。
------------------------------

ぱっと見だまされそうになるが、よく考えればこれは成り立たない。
理由は
「k=0のとき、1 < kが成り立たない」からである。

これを実際にHaskellで書いて確かめてみよう。


main = print $ map love [0..10]
love :: Int -> Bool
love 0 = True
love k = love (k-1) && love 1

まさに証明と同じ記述である。

これをkino.hsとして保存し、実行してみる:

$ runghc kino.hs
[True,


ここで処理が停止してしまう。
無限ループに陥っているのだ。


で、実はここからが本題だ。
ここまでの話は単なる前フリである。

同様のものをRubyで書いてみる。

def love(k)
return true if k == 0
love(k-1) && love(1)
end

p (1..10).map {|n| love(n) }


実行する。

$ ruby kino.rb
kino.rb:2:in `love': stack level too deep (SystemStackError)
from kino.rb:3:in `love'
from kino.rb:6
from kino.rb:6:in `map'
from kino.rb:6:in `each'
from kino.rb:6:in `map'
from kino.rb:6


SystemStackErrorで死ぬ。
Haskellの場合はk=1の場合が[True, と
途中まででもきちんと表示されるが、
Rubyの場合はそれも表示されない。

もちろん
p (1..10).map {|n| love(n) }

ではなく、逐次的に画面に出力する
(1..10).each {|n| p love(n) }

にすればきちんと表示される。
が、こんな書き方をしたがる人はいない。


「なぜこのような違いがあるか」はふつうのプログラマの皆さんは
ご存知だと思うのでわざわざ書かないが、ここで主張したいのは
Haskellを使うことにはこのような具体的な実益がある、ということだ。

文字列の足し算をまとめてみる

今回の例の範囲内ではシングルクオートとダブルクオートを
区別しないケースでは、シングルクオートのみを用いた。


Ruby (irb)
'1' + '1' => '11'

JavaScript (jash)
'1' + '1' => '11'

Perl (perlsh)
'1'+'1' => 2
'1' . '1' => 11

PHP (php)
<? print('1' + '1') ?> => 2
<? print('1' . '1') ?> => 11

Haskell (ghci)
'1' + '1' => エラー
"1" + "1" => エラー
"1" ++ "1" => "11"

Erlang (erl)
'1' + '1'. => エラー
"1" + "1". => エラー
"1" ++ "1". => "11"


== まとめ
多くの言語では文字列結合に+, ++, .のいずれかを使う。
RubyとJavaScript, PerlとPHP, HaskellとErlangが
それぞれ似ている。

至極当たり前か…。

# 文の終わりを.で表現するErlangは異色…

チャンネル

フレンド

lapis25さん
otsuneさん
yagieyさん
adaさん
tac38fbさん

もっと見る

コメント

using sqlite3 with ActiveRecord without Rails
define のブロックパラメータに ActiveReco
novさん
Haskellで外部コマンド実行
おお、そんな手が! これで外部コマンドも
ujihisaさん
Haskellで外部コマンド実行
UnsafeIOのunsafePerformIOを使えば、IO a
takkanmさん
[Ruby] Infty
macすげ。 http://blog.netswitch.jp/ar
nankiさん
文字列の足し算をまとめてみる
Squeakは,で結合、.で文の終わりですか…。
ujihisaさん