プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
(理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。
関連スレやURLは
>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
バージョンに関するよくある質問 ・Ruby 1.8.5 レンタルサーバ等にいまだに残ってる古いバージョン 1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい ・Ruby 1.8.6 過去の長期政権と数の暴力で一大勢力圏を維持中 公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ ・Ruby 1.8.7 1.9 シリーズとのハイブリッドなバージョン、初学者にこそお勧め 1.9 系から輸入された機能は 1.8.6 では動かないが「1.8.6が許されるのは(AA略」と煽ってよい ・Ruby 1.9.0 不安定にして先鋭機能が超満載の開発版バージョンだったもの 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に ・Ruby 1.9.1 満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている) 本体と添付ライブラリの動作は問題がないのだが外部第三者ライブラリが全く追いついていない 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
おまけ ・Rubygem 0.x 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい
>>1 おつ
>>6 > 1.9 系から輸入された機能は 1.8.6 では動かないが「1.8.6が許されるのは(AA略」と煽ってよい
ハッハッハ、こやつめ
プログラミング自体がまったくの初心者ですがrubyがんばって習得したいと思います とりあえずrubyをインストールしてvimというテキストエディタから動かしたいのですが 自分なりにいろいろ調べてみたのですがわかりません・・・ おしえてください よろしくお願いします
vim は使わなくてよい 素直に通常のテキストエディタで書いて 素直に通常のターミナルなりコマンドプロンプトなりから実行しろ
vimを使いたいのです よろしくお願いします!
じゃあvimで書いて、vim終了させて実行しる
>>9 そうだな、まずは使っているOSとインストールしたRubyのバージョンから聞こうか
14 :
9 :2009/09/17(木) 18:18:07
>>13 すいません
使っているOSはWindos XP sp3 32bit?です
rubyはまだインストールしていません
こちらで聞いて教えてもらってやった方が確実だとおもったので
よろしくお願いします
vim は使わなくてよい 素直に通常のテキストエディタで書いて 素直に通常のターミナルなりコマンドプロンプトなりから実行しろ
16 :
デフォルトの名無しさん :2009/09/17(木) 18:26:36
全角uza
>>14 最初はRubyistMagazineのページを見るといいかも。
ttp://jp.rubyist.net/magazine/?FirstStepRuby 以下引用
> Windows Me, 2000, XP, Vista (95, 98, 98SE)
> -------------------------------------
> 以下のサイトから ActiveScriptRuby の最新版をダウンロードしてインストールしてください。一番上からダウンロード出来るものをインストールして下さい。
> Windows 98 以前の Windows をお使いのかたは、あらかじめ Windows Installer 1.1 以上を入手しておく必要があります。
>
ttp://www.artonx.org/data/asr/ > ActiveScript というものが何であるかを気にする必要はありません。
>>15 べつにVimでもいいんじゃない?どうもVimを使いたいという強いこだわりがあるようだし。
>>14 1. ActiveScriptRubyをインストールする
2. コマンドプロンプトを開く
3. notepad test01.rb
4. メモ帳が開くので、コードを書いて保存
5. ruby test01.rb
あ、3と5はコマンドプロンプトに打ち込む。
ここで Cygwin とか言ったら怒られるんだろうなあw Poderosa とあわせて結構快適だったんだが vim っていっても gvim のことなんだろうし
Cygwinは悩みの種になった記憶のが多い… 俺はCygwin入れるくらいなら仮想マシンにLinux入れるわ
22 :
9 :2009/09/17(木) 18:45:18
>>17 ありがとうございます
やってみます
>>18 メモ帳じゃなくてgvimを使いたいので・・・
こだわりです
vimじゃなくてgvimでした
すいません
>>22 どうでもいいがコードを書くときは全角じゃダメだぞw
24 :
9 :2009/09/17(木) 18:49:01
安定版と最新版はどっちがいいでしょうか?
最新版と書いてありますね すいません
>>9 まずはがんばれ。
初心者がどういうところでつまづくかというデータは大変貴重なので、
気が向いたときに「こういうところでつまづいた」というレポートをお願いします。
27 :
9 :2009/09/17(木) 18:55:58
ActiveScriptRubyの最新版のインストールが終わりました
28 :
9 :2009/09/17(木) 18:57:11
>>26 ありがとうございます!がんばります
とりあえず開発環境を作っているところです
よろしくお願いします
通常は、ダサいアイコンを変更します
プログラミング自体初心者でvimにこだわりってすごいなw
vim自体の操作には慣れてるのか?
>>9 って、プログラミング初心者でvimに精通とかないよな
こりゃ無理だと思ったら当初の目的(プログラミング)を思い出して
とりあえずは普通のテキストエディタに戻ってやることを勧めておく
31 :
9 :2009/09/17(木) 19:00:33
たしかにかっこわるいですね・・・ クールな?アイコンないですか? みなさんが使っているアイコンをおしえてください 真似します
そんなのは hello. world の後でいいって
vista で動く、RDE 以外の軽い IDE ないですかね? うちの環境では RDE は微妙に不安定なんで。
34 :
9 :2009/09/17(木) 19:04:35
>>30 まったくなれていませんし知識もありません
テキストエディタを画像でぐぐったときにgvimが一番かっこいいと思ったので
それだけです
自分はなんでも形から入る傾向があるのもあります
ActiveScriptRubyの最新版のインストールは終わりましたので gvimのダウンロードからrubyとの関連づけ?の手順をおしえてください 教えてばかりで本当にすいません よろしくお願いします
38 :
9 :2009/09/17(木) 19:09:00
>>36 やります!
でもそのまえにvgimのほうを・・・
>>33 「Ruby IDE」でぐぐってみよう。
Java製のならVistaでも動くと思う。
>>38 たぶん、vimがいかに初心者に厳しいかを知らないのだろう。
悪いことは言わん。vimはhello worldができるようになってからにしておけ。
41 :
デフォルトの名無しさん :2009/09/17(木) 19:12:25
荒らしだろjk
42 :
9 :2009/09/17(木) 19:12:29
One-Click Installer - WindowsとActiveScriptRubyは別物ですか?
43 :
9 :2009/09/17(木) 19:13:57
荒らしではないですよ 真剣にやってます
45 :
9 :2009/09/17(木) 19:17:58
hello worldのプログラムできました うまく動いてくれたようです
>>42 別物。似てるけど。
RubyistMagazineがActiveScriptRubyをお勧めしている以上、そっちをインストールしたほうがよい。
>>34 >テキストエディタを画像でぐぐったときにgvimが一番かっこいいと思ったので
>それだけです
そんな理由でgvimを選んだやつはまちがいなく挫折する。
gvimは敷居が高すぎるから初心者はやめておけ。
47 :
9 :2009/09/17(木) 19:29:16
>>47 これはMacのターミナルではないか?
ターミナルは半透明に出来るのでデスクトップピクチャ(壁紙)の猫が
透けて見えている。
>>47 初心者がWindowsで使うなら、エディタとしては秀丸やxyzzyでいいんじゃないかな。
これなら初心者でも使えるし、習熟するにつれて強力にカスタマイズもできるし。
gvimはほんとのプロフェッショナル向け。プロが作業を極めるための道具であって、初心者が手を出す代物ではない。
50 :
9 :2009/09/17(木) 19:45:44
>>48 そこはどうでもいいのですがこんなかっこいい画面でプログラムを作りたいのです
51 :
9 :2009/09/17(木) 19:48:37
>>49 xyzzyもいいですね!
これなら初心者も使えるとのことなのでこれでお願いします
インストールから環境設定までおしえてください
よろしくお願いします
カエレ
>>49 xyzzyも自分でなんとかする人じゃないと相当難儀だぞw
やはり教えてばかりでは嫌われますね こちらはいたって真剣なのですが
55 :
9 :2009/09/17(木) 19:54:10
>>49 xyzzy駄目だろ
まさかvim使えないような奴に最初からgates.l入れさせる気か
着色と自動インデントさえされればなんでもいいはずだ
>>54 自分のスレを読み返してごらんよ
Ruby よりエディタへの言及の方が多いよ
hello world はgvimで書いたのか?
この人に必要なのは、いろんなエディタをインストールして ひととおり色設定をいじって遊んでみることだと思う。
gvimの話はよそでやってくれ、とりあえず。 というか、vimをNGワードにするのが適切だな、こりゃ。
61 :
9 :2009/09/17(木) 20:12:56
エディタのことは忘れて、まずは
>>36 のチュートリアルをやろうぜ。
エディタを語るにはきみはまだ若い。
63 :
9 :2009/09/17(木) 21:00:39
>>62 わかりました
質問があります
hello.rbというhello!と表示するプログラムを作ったのですが実行するときに
いちいち保存先までcd \とか入力していかないとエラーが出るので面倒です・・・
どこからでも○○○.rbと入力して実行するようにはできないのでしょうか?
今まで検索していたのですがnotepad++というエディタがありました
画面の色とか文字の色とか適当にいじって変えてます
gvimやxyzyyはまだまだ先のような気がします
かなり上級者向けのようです
でもやはり形だけでもいいのでgvimやxyzyyでやりたいですねえ・・・
>>63 > どこからでも○○○.rbと入力して実行するようにはできないのでしょうか?
Ruby関係ないのでコマンドプロンプトの使い方勉強しろ
ディレクトリ移動関連の最低限必要なことは10分もあれば終わる
昔話は嫌われるのだが、 UNIXからMSに移植されたツールは、とても多い。 sed,grep,awkとかね。 今でも、とても役に立ちますね。 MS-DOSの始めの頃に、**とか言う名前のフルスクリーンエディターが発売されました。 MS-DOSの環境であれば、同じようにちゃんと動く、ってのが売りです。 (このあたりが?の人は考古学者になったつもりで調査すべし) 結局、これは商業的な成功はなかったみたいですね。 INT21のせいだと思うのですが、とても遅かったのですよ、表示が。 ん、眠くなったので、続く
スレ違い。初心者スレですので無用な語りはお避けください。
>>63 >質問があります
>hello.rbというhello!と表示するプログラムを作ったのですが実行するときに
>いちいち保存先までcd ¥とか入力していかないとエラーが出るので面倒です・・・
>どこからでも○○○.rbと入力して実行するようにはできないのでしょうか?
質問の意味がわからない。どんなエラーがでるの?
>>67 いやそれはそのまんまだろ
コマンドプロンプトの起動時のカレントディレクトリと自作ファイルを置くディレクトリが違うんだ
例はたいていカレントにあるスクリプトを起動しているから、それと同じようにするにはどうしたらいいかという話
つまりはディレクトリの概念と操作の勉強が要る
69 :
9 :2009/09/17(木) 21:42:57
>>68 コマンドプロンプトを開いたときは常に自作ファイルをおいているディレクトリから
はじめることはできませんか?
今の環境だといちいち自作ファイルをおいてあるディレクトリまでcdコマンドで移動しないと実行できません
>>68 ruby: No such file or directory -- hello.rb (LoadError)
70 :
9 :2009/09/17(木) 21:47:06
Cドライブの下にsrcというフォルダを作成してここに自作ファイルを保存しています コマンドプロンプトから自作ファイルを実行するときは ruby ○○○.rb 実行とするだけで動くようにはできませんか? 今の環境でこれをすると ruby: No such file or directory -- hello.rb (LoadError) と表示されてしまいます ruby c:\src\hello.rb 実行とすれば動いてくれるのですが
はやくパッチレベル上がらんかな mingw使いはバイナリを上げられんではないか
p0がどんどん広まるよー
>>69 そういうことはできるのかな。わかんない。
移動がめんどくさいというだけなら、最初から「C:¥」を指定してコマンドプロンプトを起動するのはどうだろうか。
(1) C:¥Documents and Settings¥ユーザ名¥スタートメニュー¥プログラム¥アクセサリ をエクスプローラで開く
(2) 「コマンドプロンプト」ショートカットをデスクトップにコピー
(3) コピーしたショートカットを右クリックして「プロパティ」を選ぶ
(4) 「ショートカット」タブの「作業フォルダ」を「C:¥src」に指定して、OKボタンを押す
(5) コピーしたショートカットをダブルクリックすると、「C:¥src」に移動していることがわかる
>>68 おまえかしこいな。おれはさっぱりわからんかった。
74 :
9 :2009/09/17(木) 22:50:25
>>73 ありがとうございます!
らくになりました!
>>33 NetBeansオススメだぜ。
俺はRubyでちょっとした使い捨てプログラム書くときはxyzzyのruby-mode、
仕事のプロジェクトはNetBeansと使い分けてる。
>>69 "Command prompt from here"いれろ。ぐぐったらでてくる。
エクスプローラーからフォルダの右クリックで、そのフォルダを作業フォルダにしてコマンドプロンプトを開けるようになる。
>>75 すでに解決しております
ありがとうございます
またお願いします
>>9 です
質問することが多いと思いますので名前をつけさせていただきました
よろしくお願いします
>>77 コテつけてくれるのはありがたい。
さ、NGにしよっと。
無駄にスレをのばさないでください。>>見習い S/Nが低下し過ぎ。 これがつづくと、だれもこのスレをみなくなって 質問しても答えてくれる人がいなくなってしまう。
>>77 まあ気長に頑張れ
>>2 は見たか。多少値がはっても入門書ぐらいはちゃんとしたのを
買った読んで方がいいぞ
>>78 さんw
>>79 気をつけます
すいません
S/Nってなんですか?
>>80 ありがとうございます
入門書は買うつもりです
PCだと目が疲れてくるのでやっぱりじっくり見てやるなら紙のほうがいいです
君はググることすらしないのになんでここにいるん
初心者スレだから、いいんじゃね。 むしろ、初心者がどこで躓くのかを俺は知りたい。
>>85 それを知りたいならこの板全部読め
全部載っている
>>83 S/Nでぐぐった?
人に聞く前に自分で調べようって話
>>87 ぐぐりましたけどどれも関係なさそうなものばかりですよ
rubyで再起処理をしようとすると、undefined method `each' for nil:NilClassと出ますが、再帰処理はできないのですか?
>>88 いい加減なことを言うなよ
検索結果の最上位にずらっと並んでいるだろ……
というか、こういう Ruby とは何の関係もないやり取りがまさに N なわけだよ
>>89 各オブジェクトがeachを持っているかどうかの判断をする必要があるんじゃないの?
>>89 それは書き方間違ってるだけです
エラーの理由がそのまんまです
[1,2,3].each do |e| … と直接書いた場合は [1,2,3] をeach 内から読む手段がないんで
再帰したい場合はご面倒でも arr = [1,2,3] と変数として一度定義してから arr[1..-1] とか呼んでください
>>89 意図せず nil に対して each を呼んでいる
コードを張れ
>>91 オブジェクトにeachを持ってるか判断がいるのですか?
ちなみに下記コードで出ました
def treeRecur(activeCell,tree,hier,refCellName)
hier+=1
refCellName[activeCell].each{|activeRefCell|
tree << [activeCell , hier , activeRefCell]
treeRecur(activeRefCell , tree , hier , refCellName) ##再帰的に呼び出し
}
hier-=1
end
activeCellはString
treeは配列
hierは数値
refCellNameハッシュになってます。
それで:87:in `treeRecur'となってるのでtreeRecurが再帰できないのかと思ったのですが
>>94 よくわからないけど停止条件が見当たらないよ
原因がわかりました。 再帰したときにrefCellNameがnilになっています (最初に呼び出された時は正しいデータが入ってました) 再帰したらrefCellNameのデータってnilになるものなんでしょうか?
>>95 停止はrefCellName[activeCell]の中が空になったときです
>>97 > 停止はrefCellName[activeCell]の中が空になったとき
refCellName[activeCell] が空になったら再帰から抜ける、という部分の
コードが見当たりませんが?
それと、空になるとはどうことだと理解してますか?
each の中で再帰するなめんどくさいから あと LCC は氏ね 空のハッシュに特定のキーを指定した場合の返り値は nil だ とりあえず停止条件は明記しろ def treeRecur(activeCell,tree,hier,refCellName) hier+=1 refCellName[activeCell] && refCellName[activeCell].each{|activeRefCell| tree << [activeCell , hier , activeRefCell] treeRecur(activeRefCell , tree , hier , refCellName) ##再帰的に呼び出し } hier-=1 end
>>96 いやそれであのエラーは出ない
nil[:a].each #=> NoMethodError: undefined method `[]' for nil:NilClass
each のレシーバが nil だっていうエラーだから
refCellName[activeCell] が nil のはず
どうしてそれが nil になるのかはよくわからん
refCellName から要素を削除する仕掛けが停止条件兼ねてどっかにあって
それと干渉してるんじゃないの?
>>98-99 わかりました。
eachはnilはエラーを返すのですか
def treeRecur(activeCell,tree,hier,refCellName)
hier+=1
if refCellName[activeCell] == nil
return
end
refCellName[activeCell] && refCellName[activeCell].each{|activeRefCell|
tree << [activeCell , hier , activeRefCell]
treeRecur(activeRefCell , tree , hier , refCellName) ##再帰的に呼び出し
}
hier-=1
end
こうしたら動きました。2日前までperl中でして,perlはこれでも動くからできるかと思ってました。
うん、再帰使ってるプログラムは 停止条件が関数の頭のほうに書いてあると漏れでも理解できて非常に助かる
>>101 「NilClass に each メソッドが定義されていない」と認識するべき
レシーバが nil だからではない
nil.to_s は NilClass#to_s が定義されているからエラーは出ない
空文字列を返す
>>103 なるほど
納得しました。クラスごとに定義が必要でnilにはなかったと
ありがとうございました
初心者にカリカリしている人が多いようなので、再掲しました。
>>1 >■回答する人へ
>相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
>それができないならこないこと(だって初心者スレだもん)。
> ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
> ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
> ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
ここは初心者がバカな質問をすることを大目に見てあげられるマゾヒストのためのスレです。
初心者にカリカリするような人はこないでね。
◆YG1xRh8M6Ffb乙
>>105 「Rubyに関する」既出な質問やわけわかな質問なら、いくらでも大目に見る
スレ違いな質問(S/Nとか)はよそに行け
加えて言うと、調べる気がなさそうな人間に対しては
いくらマゾヒストでも親切でも教える気になれんよ
人力検索サイトに行け
ルビーのショートカットアイコンを変更したいのですが
右クリックしてプロパティから変更しようとしても”アイコンの変更”ボタンが
アクティブ?の状態になっておらず変更できません
どうすればいいですか?
よろしくお願いします
>>106 ちがいますw
>>107 >加えて言うと、調べる気がなさそうな人間に対しては
>いくらマゾヒストでも親切でも教える気になれんよ
回答したいやつが回答すればいい。
回答したくないやつは黙って無視しとけばいい。
ここはもともとそういう場所。
調べる気がなさそうな人間がいれば、キーワードを教えてぐぐることを薦めるだけのこと。
その程度でカリカリするなら、こんなスレ見ない方がいいよ。ストレスたまるだけだから。
>>108 Windows関連のスレで聞いたほうがいいかも。
>>110 ありがとうございます
windows板の質問スレッドで回答待ちです
112 :
デムパゆんゆん :2009/09/18(金) 18:11:39
おう、がむばれ!
スタートメニューのすべてのプログラムのRuby1.8の中にruby consoleがあります でも作業フォルダにはこれと同じファイルがありません 意味がわからないのですが・・・ どういうことですか?
>>113 ruby本体だって作業フォルダにないだろ。それと同じだよ
環境変数PATH、コマンドプロンプトとかでググってみたら
恐らくボクの言っていることが通じてないとおもいます ボクの説明が悪いです すいませんね
116 :
デムパゆんゆん :2009/09/18(金) 19:28:29
どうせならLinuxでやろうぜ。
もっていません
>>115 通じてないと思うのならあやまる前に通じさせる努力をしてくれよw
何がわからなくて何を知りたいのか、回答者が推測しなければならないような
質問はよくない、というかかなり損してるよ
>>29 さんはいませんか?
いらっしゃいましたら方法をおしえてください
>>118 こんな感じでよろしいでしょうか
OSはwindows xp sp3 32bitです
rubyはActiveScriptRubyの最新版1.8.7をインストールしています
デスクトップのショートカットアイコンを”変更”したいのですがその方法がわかりません
自分なりにいろいろがんばってみたのですが力不足のようです
もし知っている方がいらっしゃいましたらご教授いただければ幸いです
ご指導の程よろしくお願い致します
もういいです
>120 Windows板で回答待ちの質問をこっちに持ってくるなよ 向こうの住人に失礼だぞ
流れがどうのこうの 聞いてるんだから 可能か不可能かくらいは こたえてくれても いいんじゃないの
RubyプログラムでWindowsでのショートカットのアイコンを変更したいというんだったら WIN32APIでも叩けば「可能かもしれない」。 俺はやったこと無いから知らないけど、詳しい人が答えてくれるかもね。 Rubyのショートカットアイコンを変更したいという話だったら「可能」だけど スレ違いだから出て行けって言われてる。
>>113 >スタートメニューのすべてのプログラムのRuby1.8の中にruby consoleがあります
>でも作業フォルダにはこれと同じファイルがありません
>意味がわからないのですが・・・
意味が分からないのはキミの質問のほうだな。
Windowsがないから正確なことはわかんないけど、
「スタートメニュー」> 「すべてのプログラム」>「Ruby 1.8」
の中に「ruby console」というのがある、ということがいいたいのか。
しかし「作業フォルダにはこれと同じファイルがありません」という部分は意味がわからん。
再提出!
アイコン変えるくらいで えらいたいそうなことやね あきらめますわ ありがとう
1. まずruby consoleってのを削除する 2. パスを通す 3. 普通にコマンドプロンプトを使う
アイコンとかどうでもいい事にこだわるのはマカ。 ルビー使いたいなら教祖も使ってるデビアン推奨。
130 :
デフォルトの名無しさん :2009/09/18(金) 20:45:18
アイコンを右クリック→プロパティ→カスタマイズ→アイコンの変更→好きなのに換える
ショートカットの場合は「カスタマイズ」を「ショートカット」に読み替えてね。
あれは許容範囲を超えたダサさだからなあ GRScript18.dllのリソースを書き変えたらいいんかな 真面目な話、アイコンをartonに送るというのが真の解決法だ
初心者さんがだんだんグレて来ててワロタ
そろそろ悪態をつくころだね
ひまなおっさんの釣りなんじゃないかと思えてきた。 日本語がおかしいし、いくら初心者でもこれはないだろ。 あるいはリアルに小学生なのか。
[ [1,2,3],[4,5,6],[7,8,9] ] → [ [1,4,3],[4,10,6],[7,16,9] ] ↑のように、配列の配列の2番目の要素だけ2倍にしたい ときはどのように描けば短くかけますか?
まずはうんざりするくらいまで each 使い倒せ Enumerable や Array の各メソッド内部でどう each が使われているか推測できるようになれば いちいち他人に聞かなくても一発で書き下せる 特殊動作のメソッドだけ聞きかじりで使ってても応用できないぞ
>>137 とてもRubyらしく書くとこうなる
L = [ [1,2,3],[4,5,6],[7,8,9] ]
for e in L do e[1] = e[1] * 2 end
Array と String と Enumerable と Hash の4つはメソッド一覧をどっかに書き出しておくといい この 4つのクラスのメソッドの動作が頭に思い浮かべられるようになると、 Ruby スクリプトを書くのにかかる時間が一気に半分以下になる てか、それこそ each じゃ駄目なん? めっちゃ短いと思うんだけど arr = [ [1,2,3],[4,5,6],[7,8,9] ] arr.each{|a| a[1] *=2} p arr
>>139 ,140
非破壊的にやるとすればどうする?
>>141 L1 = [ [1,2,3],[4,5,6],[7,8,9] ]
L2 = Marshal.load(Marshal.dump(L1))
for e in L2 do e[1] *= 2 end
>>139 ともども本当にごめんなさい
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
arr2 = arr.map{|a| b = a.dup; b[1] *=2; b}
>>142 初心者スレではそういうのやってほしくないなあ。冗談を冗談と見抜けないのが初心者なんだから。
しかも冗談としてもつまんないし。
Marshalとかw さすうがに冗談も大概にしろよw
>>148 君の釣りはつまらない
Marshal.dump+load は dup の shallow copy で済む今回は牛刀だが手段としては妥当だ
>>149 なぜ、Marshalを使う必要があるかわからん。dupですむなら、それにこしたことないのではないか
dup では「済まない」から
>>144 ではわざわざ1つネストした map の中で dup してるのだろ
dup で済むというのは
arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr2 = arr.dup
arr2.each{|a| a[1] *=2}
p arr
これが [[1, 2, 3], [4, 5, 6], [7, 8, 9]] を表示するようなことを言う
ネストした配列のような参照だらけのオブジェクトの完全な複製を作る手段は
プリミティブなオブジェクトを見つけるまで深く潜って dup することだが
これをほぼどんなオブジェクトに対しても自動で(結果として)行う一般的な手法が dump して load
事前情報(配列の配列の要素がプリミティブである)を利用して決め打ちで手動で行ったのが
>>144 そんだけ
どちらも特段変ではない
初心者向けでないとして突っ込みが入ったのは for と定数のほうだな
>>151 だったら
>>142 の段階で簡単な説明をつけましょう。
なぜMarshalを使ったのかという説明がないため、初心者は理解できないし他の人も混乱するだけです。
ここは初心者のための回答が期待されるところであり、初心者が理解できない回答を書いて「Marshal使ってるオレかっこいい」とひたる場所ではありません。
スレの趣旨を理解しましょう。
151が142と別人だったらごめんね。
俺もちょっと不思議に思ったからググってああなるほどと思ったクチだが 別に「Marshal使ってるオレかっこいい」じゃないだろw Ruby本でも書かれるような一般的な小技なんだろ まあ上でも言われてるが初心者にネタを見抜けってのはきついから ネタなしかネタだと明らかに分かるよう書いてほしいのはあるが
Array や Hash の複製が欲しいときにいつも歯がゆく思うんだけど なんで Object には deep copy のためのメソッドがないのかな? サブクラス作るたびに適切にオーバーライドする必要が出て面倒だからだろうか
>>155 実際にRubyスクリプトとして作るとわかるが循環解決でわけわかめになる
marshal.のソース流用しようとするとT_DATAであっぴゃーになる
dumpしてloadよりも早くてうまくて短い実装があるならMLで発表だ
基本、ディープトラバースして欲しくないらしいぞ
Rubyで提供されてるディープトラバース手段はMarshalだけだ
Marshalできないやつはそもそも複製できんオブジェクトだったということで
怖いからYAMLにして戻すってのは?w
>>154 >知っていることも使用することも問題は特段存在しない
問題はそこじゃない。初心者への回答という観点を忘れ、ろくに説明もなしにコードだけ書いて満足していることが問題。
dump が目的の場合に Marshal ではなく YAML を使うメリットはゼロ
説明しなくても分からなきゃ自分で調べるだろ
どうしてもMarshalに突っかかってるようにしか見えないが そこは全く問題ないだろ forの方を言うならまだわかるが
なんか一人顔真っ赤にして頑張ってる姿が目に浮かぶんだが
>>147 が
>>139 ,142のようなのは初心者に有害だからやってほしくないと真摯に考えるのなら
その場で「Rubyでforは滅多に使わねえよカスeach使え」
「大文字で始まる識別子は定数だからLとかそんな風に使うなボケ」
「巣に帰れ二度と戻ってくるな」といったツッコミをいれるべき
Marshal を知らなかったのが悔しくて悔しくて悔しくて悔しくて悔しくてたまらないのだろ自称脱初心者が
どっちが必死なんだよw
マジ顔真っ赤だなあ・・・w 説明がないと思ったなら他の人が説明するもよし 分からなきゃそれを質問するもよし だろう
ごめん、俺がMarshalなんて・・・っていったばっかりに、こんなことに(´・ω・`) ごめんなさい、ごめんなさい。双方とも頭冷やしてくだしあ
いや、Marshalは正しい解答の一つでしょ あやまるならforとか定数とか変に使ったことをあやまってくれよw まあ(ちゃんとした)議論になればいろんな情報が出てくるからいいのかもしれんけどね
"[hoge]"とか"{hoge}"みたいな文字列の前後の括弧を取り外すのに "[hoge]".sub(/\[(.+?)\]/){$1} なんかじゃなくて、なんかもっとスマートな方法はありませんか?
173 :
172 :2009/09/19(土) 14:26:22
できれば "[hoge]".split(//)[1...-1].join も無しの方向で。
"[hoge]"[1...-1] では駄目と申すか。
String[] の動作が期待に添っていて、短いのがスマートだと勘違いしているのなら、
>>174 そのまんまの正規表現でマッチした部分を取り出す以上のわかりやすいスマートなものはないかと思われ
str =~ /\A[\(\{\[<](.+?)[\)\]\}>]\Z/; $1
開きカッコの対応を取るライブラリは標準では無いので自作してくれ
というかカッコの対応は正規表現では本来書けない。 とCマガで大昔に読んだけど、最近の拡張しまくりのだと可能かもなー。
後ろの1文字はchopで毟れるけど、先頭の1文字を毟り取るメソッドっ てないよな。
>>177 その手があったか
"[hoge]".chop.reverse.chop.reverse
小橋の回転チョップを思い出した
右のほうをチョップされたら左のほうを差し出せ
×ほう ○ほお
>>172 "[hoge]"[/\[(.+?)\]/, 1]
とも書ける。
>>175 Onigurumaならできるはず。
すんません。このスレどっからドコまで自作自演なんてしょうか?
185 :
デフォルトの名無しさん :2009/09/19(土) 21:06:16
ココまで俺の自演
186 :
デフォルトの名無しさん :2009/09/20(日) 05:42:36
require ってなんで複数のライブラリ名を受け付けないんでしょうか。 けっこう不便なんですけど。
>>186 リファレンスを見たらわかることではないでしょうか?
書いてはあるが、意図を読み取るのは不可能だと思う
>>186 require が真偽値を返すメソッドとして作られているから、がいちおうの答
複数受け取ったときは真偽値の配列を返すようにしてもいいんだけど、おおむねキモい
each で回してもいいはずなんだけど、そういう人はなぜか見ないね
かなり初期に一瞬だけ実装されたことがあったと記憶 false が返ってきたほうが便利だということでお流れになったんでなかったかな
ふとした疑問なのですが、Mechanizeのテストというのはどのように書いたものでしょうか?
test
>>192 それはRubyで作った2chブラウザのテストですか?
186です。
>>188 なるほど!たしかにrequireは戻り値がありますね。でも戻り値を気にする場面っていうのはまれなので、
そういう理由で複数の引数を指定できないのはちょっと勿体ないですね。
Railsとかには require_all というのがあるそうなので、戻り値を気にしなくていいから
引数を複数とれるバージョンのrequireを、requireとは別に用意してほしいなと思いました。
yes,we can
>>194 なければ自分で作るという選択肢ももとう
require を再定義すればいい。
198 :
デフォルトの名無しさん :2009/09/20(日) 16:09:37
\
..  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
/\(<●>)/\ /\(<●>)/\
/\(<●>)/\ /\(<●>)/\
/\(<●> )/\ \(<●>)/\
/ \\(<●>)/\
/ ,ゝ===く <●>)/\
! γ `ヾ,_ \
│ :く( r,J三;ヾ )> \
l =; {三●;= } ,=ニ l
ヽ ゝ≡三=イ / <
>>1 ワロタw
ヽ .,,,. /.|
ヽ 'ぐ'''''''' / / ト,
ヽ. ヾ''" / / |ヽ
,./ヽ `´ / ./ \、
-‐ '''"  ̄ / :| \,,,__,,,, / / | `'''‐- 、.._\
199 :
デフォルトの名無しさん :2009/09/20(日) 16:17:33
eRubyとMySQLをつかって、DBに写真のアップをしたいのだけど <form action="syasinhenkou.rhtml" method="post" enctype="multipart/form-data"> <input type="file" name="syasin" size="30" maxlength="100"> <input type="hidden" name="id" value="<%= cgi["id"] %>"> <input type="submit" value="登録"> </form> ってかんじで、ファイルを登録用のページにおくりたい sql = "UPDATE rireki SET" sql += " syasin = '" + cgi["syasin"] + "'" sql += " WHERE id = '" + cgi["id"] + "'" sql += ";" my.query(sql) 受け側はこんな感じで書いてみた。 IDのところに変な文字列が入ってアップデートされないいのだけど enctype="multipart/form-data"のオプションのせいだよね。 ファイルを送るときは、このオプションがいるみたいだけど どうしたらいいかな? DB側のidがキーで文字列、syasinがBLOB型でやってる これでDBにファイルが送れるのかもよくわからんのだけど 教えてくれるとありがたいです。
>>199 idの所が変になるんじゃなくて、cgi['syashin']以降が変になってるはず
blobとかのバイナリオブジェクトは文字列の連結でSQLを作れない
プリペアードステートメントとかを使え
blobじゃなくても普通プリペアードステートメント使うとこだろ
202 :
デフォルトの名無しさん :2009/09/20(日) 18:41:08
何で空配列がかえってくんねん 空文字列ちゃうん? >> "a".split(/a/) => [] >> "aa".split(/a/) => [] >> "ab".split(/a/) => ["", "b"]
203 :
デフォルトの名無しさん :2009/09/20(日) 18:43:58
空配列に空文字列がつっこまれるべきちゃうん? [""]
>>194 %w(lib0 lib1 lib2).each{|feat| require feat}
でいいじゃん
>>202-203 新リファレンスマニュアルから抜粋
> instance method String#split
> split(sep = $/, limit = 0)
> 第 2 引数 limit は以下のいずれかです。
> limit == 0
> 分割個数制限はなしで、配列末尾の空文字列を取り除く
> limit < 0
> 分割個数の制限はなし
「配列末尾の空文字列を」いくつあっても全部「取り除く」ってことなんだろうな多分
それがデフォルトの動作である理由は知らん
206 :
デフォルトの名無しさん :2009/09/20(日) 19:23:06
> 「配列末尾の空文字列を」いくつあっても全部「取り除く」 こんなん知らへんかったがな。おーきに 理由は実装上の都合なんやろなぁ
Perlがそうだったから。 Perlがそうだった理由は知らん。
>>206 web上では関西弁禁止だよ?知らないな?他の方言ならいいけど
>>199 syasinじゃなくてphotoとかpictureつかえ
210 :
デフォルトの名無しさん :2009/09/20(日) 23:01:59
1.9からThreadにかわりFiberというのが入ったそうですが、どうやって使うものでしょうか。 ぐぐってみたけど、上級者向けの説明しかなくてさっぱりでした。 例:Fiberはいわゆるコルーチンです。←コルーチンが何かわからないからさっぱり理解できない説明 高校生でもわかるような説明をどなたかお願いできますか。
211 :
デフォルトの名無しさん :2009/09/20(日) 23:13:30
>>200-201 Ruby/MySQLではプリペアードステートメントつかえない?
MySQL/Rubyじゃないとだめ?
refe2簡単に入れたいけどパッケージとかある?
そんなに面倒なことはない気がするんだが
>>213-214 プリペアードステートメントは
MySQL/Rubyをいれて解決した
あとは、ファイルのアップだけど
st = my.prepare("UPDATE rireki SET syasin = ? WHERE id = ?")
st.execute(cgi["syasin"].read,cgi["id"].read)
res = st.fetch
って書いてみたところ、MySQLのほうから
2053
Attempt to read a row while there is no result set associated with the statement
って怒られた・・・・BLOBだとだめなんか?
こんなところで詰まってるようだと、表示にもてまどりそう
っていうか、表示できるのか?
MySQLの本でも買えよ・・・またはRails使うか
>>217 エラーメッセージの意味はわかる?
SQL文を実行したけどresult setが返されなかった、なのに行を読み込もうとしてエラーになっている、という意味。
SQLをみるとupdate文を実行しているよね。だからresult setは返ってこない。なのに st.fetch しようとしているからエラーになっているだけ。
これがselect文だったらfetchできるけど。
220 :
デフォルトの名無しさん :2009/09/21(月) 11:47:02
>>219 SERECTしたらはいってた〜〜!!
ありがと〜〜!!!
表示のほうも、相談にのってください
格納したデータを
<img src="data:image/jpg;base64,/9j/4AAQ....中略.....">
って感じには表示できるのですが
これだとIE6では見れない。
エンドユーザにFF入れろとか言えないし
IEでも表示させる方法ありますかね?
もはやRuby関係なし
どうみてもHTMLの質問です 動的か静的かは用途次第だけど、素直にURL割り当てろって
224 :
デフォルトの名無しさん :2009/09/21(月) 13:26:50
>>220 アホだなぁ。
base64デコードして出力すればいいだろが。
Content-Typeヘッダも適切に吐いてね。
あ、スレチだね。
アホです。すんません。
>>224-225 URLの?以降の文字列はENV['QUERY_STRING']で受け取れるはず
そいつをデコードして元に戻すって考えて
#!/usr/local/bin/ruby
require 'base64'
file = ENV['QUERY_STRING']
out = decode64(file)
print "Content-Disposition: filename=\"syasin.jpg\"\n"
print "Content-type:image/jpge\n\n"
print out
って言う具合に組んでみた。
700バイトとかの小さいファイルだとうまく行くんだけど、
8kぐらいのファイルになると表示できなくなるな
そもそも、CGI呼べてないっぽい
これもRubyのはなじしゃないよね(涙
アホなりに解決しました。 どうもbase64のコードが長すぎでうまく行かなかったっぽいので idを指定してDBから画像を引っ張って垂れ流すだけのCGIを作成しました。 idなら長くても50桁とか行かんので、これで解決!! いろいろ、ご迷惑おかけしました。 ヒント本当に助かりました。ありがとうございます。
>>226 >700バイトとかの小さいファイルだとうまく行くんだけど、
>8kぐらいのファイルになると表示できなくなるな
ENV['QUERY_STRING'] をそのままつかってるのが問題なんじゃないかな。
(つまりENV['QUERY_STRING']に %2F や %2B が含まれているんだろう。)
URLエンコードされているからデコードしないと。
require 'cgi'
qstr = ENV['QUERY_STRING']
out = decode64(CGI.unescape(qstr || ""))
詳しくは
ttp://blog.s21g.com/articles/319 をみてくれ。
229 :
デフォルトの名無しさん :2009/09/21(月) 20:00:17
いやいや、というか そんな巨大なデータをクエリ文字列としてURIで渡すなよ、と。
URLの長さ上限は、普及しているブラウザでは、一番短かいIEが 2083バイトだったかね。
一発でroot奪取されかねない素敵コードだな
なんかワロタw
ルヴィーっておもしろいですか?ルヴィー使ってる友達が、開発者が日本人だから誇らしいと言ってました
234 :
デフォルトの名無しさん :2009/09/22(火) 14:23:06
>>233 またお前か。
もういいから自分の巣に帰れ!
URIのやり取りでトンネル掘り出すアフォとか出てきそうだな。
$0とか__FILE__とかARGFとか・・・ 最初から備わってる変数が色々ありますけど、どうしてこんなに表記法に統一性が無いのですか?
変数
Larryにそんなことを聞いたら Perlの文法が言語学的にどう優れているのかの講義が始まるぞ そしてハッシュの頭になぜ%が付くのかを聞いたらPerl信者になること確実だからやめておけ
$0はsh __FILE__はC ARGFはARGVの発展系、ARGVはCのmain関数の引数argvが元になっている どれもこれもunix+Cを知ってれば、なじみの物ばかりだ
241 :
236 :2009/09/22(火) 22:02:34
ありがとうございます。他言語からの習慣に習って付けてるんですね。 でもARGFはどうして定数なんでしょうか?Cだとargvなんかは変数ですよね。 __FILE__は擬似変数で$0はグローバル変数と全部違うけど、どれもグローバルにアクセスしたいものだから 統一してしまえばいいのに、と思ったのです。 ここら辺の、定数やグローバル変数、擬似変数といった使い分けは実装内部のことが分かるような人じゃないと理解できないのでしょうか。
ARGFは大文字で始まる __FILE__は違う
定数だったNILが変数nilになったりしてるから絶対的な境界は無いんだろう ARGFをグローバル変数にするのはおかしな話だが、何でといわれても説明できん
ARGFはARGVの発展系、ARGVが大文字でグローバルなのは多分awkが元 他の言語もそれに習ってるからrubyもそれに習っているんだろう
>>241 どこかでMatzが
「特殊変数周りの仕様はPerlから引きずった。今では後悔している」
的なことを書いてたような
いずれにせよ、一貫性がないという意見には同意
Perlからの脱却 ってのがRubyの精神じゃなかったっけ…
Ruby2.0では特殊変数は一新するんじゃない?
248 :
デフォルトの名無しさん :2009/09/22(火) 23:22:18
以下のような感じでセッションにアクセスしているのですが リロードするたびにセッションIDが変わってしまいうまく数値を取り出せないです。 どなたか助言をよろしくおねがいします。 def GetSession() cgi = CGI.new session_option = {"tmpdir" => "./"} session = CGI::Session.new(cgi, session_option) return session end
色々と突っ込みたい所はあるが、まずはtmpdirにセッション情報が書き込まれたファイルが存在しているかどうかを確認するんだ。
250 :
デフォルトの名無しさん :2009/09/22(火) 23:48:07
ファイルが作成されているのが確認できました。 リロードするたびに増えていきます。 サーバー側の問題でしょうか?
ようし、じゃあ次はFirefoxにFirebugを入れてcookieの受信と送信ができているか確認するんだ。 CGIモジュールの仕様はよく知らんが、きっとセッションIDをクッキーに入れて送ってきてくれているはずだぞ!
252 :
デフォルトの名無しさん :2009/09/23(水) 00:15:52
クッキーのリストが反応しないみたいです、他のサイトだとExpiresの項目にsessionというのが出てきています。
で、セッションを発行したときのレスポンスヘッダにSet-Cookieはあったのか?
254 :
デフォルトの名無しさん :2009/09/23(水) 00:58:52
まじキチ…ユダヤが人工地震を起こすぞ
【緊急情報カクサンよろしく】
ついに来ました。
大きい動きです。250nT超えてきました。ほぼ間違いありません。もう一度言います。
友人、知人、親類縁者、あらゆるつながりを駆使して巨大地震がくることを教えて下さい。
四川地震より大きいのが来る可能性があります。
http://g ★olde★ntam★atama.b★lo★g84.fc2.c★om/
★★★★★危険度MAX★★★★★
★★★★★★★★★★★★★★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★★★★★★★★★★★★★★★★
★★★★★危険度MAX★★★★★
警告!連休中の21、22、23日が危ない!かも2
http://live24.2ch.net/test/read.cgi/eq/1 ★253494015/
【大気イオン】e-PISCO Part11【また延長】
http://live24.2ch.net/test/read.cgi/eq/1 ★252991726/
本当に地震が来たら、犯人は特権階級全員だということ2
255 :
デフォルトの名無しさん :2009/09/23(水) 01:01:28
すいませんレスポンスヘッダを確認することができませんでした。 Firefoxのコンソールで確認できるような事を書いてあるサイトを見つけたのですが うまく確認できませんでした。
>>2555 Firebugでの見方がわからんならLive HTTP Headers入れろ。
257 :
デフォルトの名無しさん :2009/09/23(水) 01:17:14
ありがとうございます、インストールしてみました。 レスポンスヘッダにCookieと名前のつく項目はなかったです。
じゃあそれが原因だろw ってかCGIクラスのインスタンスって何度も生成したらバグるんじゃないの? 関数の中でインスタンス作成して、破棄しているあたりからして使い方が間違ってるんじゃないのかと。
259 :
デフォルトの名無しさん :2009/09/23(水) 01:26:40
なるほど、少し簡単なプログラムを作って実験してみます。 rubyは明確なルールが分かりづらくて難しいですね。 ありがとうございました。
問題はHTTPの理解のほうじゃないだろうか。
262 :
デフォルトの名無しさん :2009/09/23(水) 02:23:35
ありがとうございます、確認してみたらヘッダーはERBを処理した後に追加しているので問題なさそうでした。 erb = File.open(path) { |f| ERB.new(f.read) } print cgi.header + erb.result(binding) 以下のようなtest.rbというのを作成して実験してみたところうまくいきましたが 本番用のソースだとうまくいかないようです>< #!/usr/local/bin/ruby require 'cgi' require 'cgi/session' cgi = CGI.new session = CGI::Session.new(cgi) print cgi.header print "session test'#{session.session_id}'\n" まだ解決していませんがデバック方法やアドバイスなど、とても勉強になりました。 本当にありがとうございました。 もう少し自分なりにrubyやhtmlの勉強を行ってみます。
どうしても分からなければ ソースをまるごと貼り付けて、アドバイスを求めるという手もある もちろん自力で解決できるならその方がいいけど
2chに投稿するとインデントがなくなってすごく見にくいんだけど、JaneStyleのリンクポップアップで 見るとちゃんとインデントされてる! それをコピーしたらインデント付きでコピーもできる! 全角スペースや によるインデントを使う必要なし!
>>264 書き込み時に置換面倒なんだけど、ソースとリンクを毎回書き込むのが面倒なのだが
長い場合はそのほうが望ましいけど 短い場合はそのまま貼ってくれたほうがいいな あとインデント類の扱いは2chブラウザごとに全然違うらしいよ
rubyのせいにしてるが、http知らないと実装は無理なんじゃ。
CGIも知ってないと無理な悪寒
アホばっかだな・・・ ソース張ってるんだからrubyが原因って一発で原因わかるだろw
正しくrubyをかくための http,cgiの前提知識が足りないのかもしれん
Rubyって、GUIアプリを作れるの?
Ruby 自身は GUI 部品を持ってない GUI 部品を司る他の言語や API を直接呼ぶ 一般論としては、GUI が目的なら Ruby を使う理由は何もない 素直に GUI 部品を提供する他の言語を使え Windows でウィンドウを表示したけりゃ、そりゃ C# を使えばいいのさ
うわ 糞言語じゃん
>>274 GUI部品がどういうふうに成り立ってるか理解してないだろ、おまえ。
276 :
デフォルトの名無しさん :2009/09/23(水) 20:11:42
Ruby/Tkの不遇って本当なんだなあ・・・
>>277 Windows環境の俺に言わせると
ActiveTclを別に導入しなければならないあたりが原因
Exerbでまとめて配布できるWxRubyと比べて、いろいろ不便だ
Win32API経由なら「ActiveTclを別途インストールしてください」という必要もない Tclの文法をわざわざ勉強する必要もない アリモノ全部で賄える
One Click InstallerにはRuby/Tk最初から入ってなかったっけ まあPythonでTkinter使ったら幸せになれそうなケース
ruby厨涙拭けよ
というかTkってけっこう大きいんだよね 必要な人だけ適当に別途入れて使って、というスタンスにしておいたら 実行環境持ってない人に配布するという場合のサポートがすっこんと抜けた そこまでRubyでやらなくてもいいじゃん却って不便だろ、と思うんだけれど
あれ? どこか涙流すような流れになってたっけ?
jruby でいいじゃんじゃん。
pythonに標準添付されてるtkをrubyから使う事って出来るん?
286 :
デフォルトの名無しさん :2009/09/23(水) 21:18:26
Linux使ってるけど、Ruby/gtk2が便利。書きやすい。 シグナルまわりの書き方が好きだ。
>>279 ? どういうこと?
dllファイルを直接呼べばいいってこと?
Win32APIでやれることだけでなんとかしろって意味だと思う
Win32API向けにヘッダファイルの翻訳やってくれたりするライブラリでもあるの?
290 :
デフォルトの名無しさん :2009/09/24(木) 07:36:30
gemのjsonライブラリって日本語まんま変換できないの? UTF8で["ほげ"].to_jsonとかすると["\u307b\u3052"]とかなっちゃうんだけど
いやそれそのまんまだと思うのだが irb> puts JSON.parse(["ほげ"].to_json) ほげ 何か問題ある?
javascript内では日本語は直接記述しないとか、そういう話?
>>290 JSONの仕様としては変換するのが正しい。
ただ、それが日本人にとって便利かどうかはまた別の話。
ユニコードに変換させないオプションがほしいよね。
>>293 ごめん、ウソ書いた。「変換するほうが仕様上正しい」というのは間違い。
JSONでは文字列中に日本語をかけるはずだね。
機械が生成した JSON はたいてい Unicode エスケープで日本語が書かれてるぞ 仕様上はエスケープしても構わない(may)のでたいていのライブラリは自動エスケープする そのほうがめんどくさくないからというのが積極的理由 JSON を生で読むなバカという意図が働いてるという気はせんでもない
便乗して質問 JSONやYAMLに変換したとき、日本語をそのまま出力してくれるライブラリって AnJSONやYa2YAMLぐらいしか知らないんだけれど 他に同じことができるライブラリってないかな
Jsonて生で読むなっていうようなものなの? 生で読めるのもいいところの一つだと思ってたんだけど
クラス変数が定義されているかどうかを調べる方法ありますか?
class_variable_defined?
Perlでは複数の返り値(リスト)があって、必要のないものには、以下のようにundefと記述しますが、 my ($second, undef, $hour) = localtime; Rubyではどのように書くものなのでしょうか? def meth return 1, 2, 3 end a, ??, c = meth
>>296 Rubyでは知らない。
PythonのYAMLライブラリは、オプションでユニコードに変換する・しないが選べるんだけど、
同じようなオプションがRubyにも欲しいよね。
>>300 特に用意はされてないと思うので、いらない変数を指定するしかないんじゃないかな。
a, _, c = meth
とか
a, dummy, meth
とか
>>301 ダミー変数を使うしかないんですね。
了解しました。
>>299 古いオンラインマニュアルでは載ってないclass_variable_defined?!古いオンラインマニュアルでは載ってないclass_variable_defined?!じゃないか!
class_variable_defined? が載ってない HTML ヘルプ版マニュアルは持ってる これでも一応 1.8.6 対応だったはずなんだが まいっか
大事なことなので2回いいました
306 :
デフォルトの名無しさん :2009/09/24(木) 17:08:05
Mix-inが言語的にサポートされていると聞いてRubyに心ひかれてます。 とはいえまだ使ってませんが。普段はC++/Javaを使っています。 Mix-in するモジュールを A、その中で定義されているメソッドを foo とすると、foo からは A を Mix-in した側のクラス C1 内のメソッドを 使うことができるんですよね? そのクラス C1 をさらに継承して C2 としたらその C2 で定義した メソッドも呼び出せるんでしょうか? C++の仮想関数や仮想関数テーブルとのアナロジーで説明してくれている ページってありませんか?
これ貼ると人によってはなぜか大変がっかりされるんだけど
>>306 irb> module A; def foo; 'foo!'; end; end
irb> class C1; end
irb> p C1.ancestors
[C1, Object, Kernel]
irb> class C2 < C1; end
irb> p C2.ancestors
[C2, C1, Object, Kernel]
irb> class C1; include A; end
irb> p C1.ancestors
[C1, A, Object, Kernel]
irb> p C2.ancestors
[C2, C1, A, Object, Kernel]
irb> p C2.new.foo
"foo!"
こうなる
Ruby のクラスは再オープン可能でそれが日常であることに注意のこと
Ruby は ancestors に含まれている「前のほうのクラスやモジュール」からメソッドなどを探す
C2 は [C2, C1, A, Object, Kernel] になっているが、
これだと C2 を探して C1 を探して A を探して Object を探す
もし C2 に foo が定義されていれば、 順番表の下にある A の foo は呼ばれない
もし C1 に foo が定義されていれば、 順番表の下にある A の foo はやっぱり呼ばれない
Ruby の include はこの検索順番表(の2番目)に自分を追加するだけのシンプルな機能
継承もこの検索順番表(の2番目)に継承元クラスを追加するだけのシンプルな概念
irb> module B; end
irb> class C2; include B; end
irb> p C2.ancestors
[C2, B, C1, A, Object, Kernel]
C++ の vtbl の仕組みでは説明できません。 Ruby の場合「頼んで答えられれば答える」ただそれだけです。
309 :
306 :2009/09/24(木) 17:26:45
もう一つの疑問です。 二つのMix-inモジュール A, B をクラス C でMix-inしたとき、 AのメソッドからBのメソッドを呼び出すこともできるのでしょうか? つまり A のメソッド foo を書くにあたって、foo の中で 呼び出す bar というメソッドを呼び出したいけど、 それはまぁどこかで実装されてるんだろうと思って 書いて構わないですよね? その bar の実装は A を Mix-in するクラス C に書くべきなのか ほかの Mix-in で bar の実装を提供することができるのか、 という質問です。
310 :
306 :2009/09/24(木) 17:35:01
>>307 ,
>>308 ありがとうございます。分かってきました(気がします)。
RubyというかMix-inという以前に頭が動的型付けの言語に
慣れていないことが原因だったように思います。
>Ruby の include はこの検索順番表(の2番目)に自分を追加するだけのシンプルな機能
>継承もこの検索順番表(の2番目)に継承元クラスを追加するだけのシンプルな概念
その解説ですっきりしました。
ということは
>>309 も当然可能で
複数のモジュールを Mix-in したりさらに継承を続けたりして
メソッドの名前が重複する場合には、要注意、
つまり include の順番も依存するということですね。
311 :
306 :2009/09/24(木) 17:38:28
ということは言語仕様としてMix-inとしての制約を 課しているという点以外は Python の多重継承と 良く似ているなぁ・・・ どうしても業務が静的型付け・手続き型言語 べったりなんで、まだこっち方面(どっち?)は 指をくわえて見てるだけしたが、そろそろ。
Matzは恥ずかしい表紙の本でMix-inは多重継承って言い切ってたな
>>311 そんなあなたに Scala をどーぞ。
>>312 多重継承の形してないだけで、実際は多重継承だと思う
・ 自作以外を include すると地獄
・ 自作でも 2つ include するとわけわかめ
・ 下手に include せずにクラスメソッドとして単体利用すると異常に楽
とか一緒
弱めた多重継承には違いない 実装を共有しつつ、ダイヤモンド継承とか面倒な問題は生じなくなる まあRubyの場合、今度は変数がぶつかる問題があるけど・・・・・ なんかSchemeの健全なマクロみたいに、 名前の衝突を自動回避できないのかね
316 :
306 :2009/09/24(木) 18:26:57
>>315 モジュールのメソッドの中で自由にインスタンス変数作れちゃうんですよね
そうするとたしかに変数名は衝突しますね。
ま、
>>315 の言う通りだね。
多重継承には嫌な問題がたくさんあるけど、あれば便利な場面もある。
そこで、通常の継承は単一継承のみに制限した上で、多重継承したい場面のためにMix-inを用意してある、と。
この辺のバランスの取り方は、まさにRuby的。好き嫌いはあるとは思うが。
実際問題として include ってあまりしないよねえ やろうと思えばできるって感じ 慎重に設計した上で組み込む必要があるから、あまり気軽ではない あと NameSpace::Application を include NameSpace して使う人はトイレのドア開けた瞬間に漏れろ
Ruby1.8 で include REXML したときの defined?(Encoding) の誤爆なんとかしろとか言ってた奴もうんこ漏れろ なんでもかんでも include するんじゃねえ include は「クラスパス」を短くするために使うもんじゃねえ irb> require 'rexml/document' irb> "s".force_encoding('BINARY') if defined?(Encoding) nil irb> include REXML irb> "s".force_encoding('BINARY') if defined?(Encoding) NoMethodError: undefined method `force_encoding' for "s":String from (irb):4 from /usr/lib/ruby/1.8/rexml/namespace.rb:37 これ関連で Ruby1.9 の文字列処理の場合分けを defined?(Encoding) でやってる奴も漏れなくうんこ漏れろ
Ruby のバージョンだけが問題なんだから RUBY_VERSION で場合分けすべきだよね defined?(Encoding) は時々見るんだけど、何が目的なのかな
defined?(Encoding)って何がまずいの?
Encoding という名前のモジュールまたはクラスまたは定数が定義されていること、ということしか調べられないこと
>>319 のような問題が起こるし、Encoding という名前のクラスかモジュールがどこかに存在してさえいればいいとか
Encoding という名前のクラスにならほぼ確実に存在して動作も確定なメソッドがあるという問題でもないわけで
文字列のエンコーディング処理に本当に必要なのはナニかというと Ruby 1.9.1 なわけで、
じゃあ素直に 1.9.1 の存在をチェックしたほうが素直なんじゃね、ということに
>文字列のエンコーディング処理に本当に必要なのはナニかというと
つーか例えば
>>319 の場合ならforce_encodingの存在チェックをするほうがよくね?
ダックタイピングとして意味がありゃあな
エンコーディングではなさそうだけど: 1.9以降の機能と思ってバージョンでチェックしていたら 1.8.8にバックポートされたでござる、という場合を考慮すると バージョンで全部OKというわけでもないだろうな。 ケースバイケースとしか。
いやそれでもそれはバージョンでチェックすべきだろう Rubyのバージョン名と機能の関係はそんなにまでも信頼できない魔境ではない ソース触れる人がアップデートすべきだ
ダッチタイピングに空耳した
だからRUBY_VERSIONで分岐すんなつってんだろ Encodingで被るなら::Encodingとか String.method_defined?(:encoding)とか 使えよ
ある機能を備えているかが定数の存在やメソッドの存在でしかわからないのが問題なのかな。 Open Classなのでいくらでも後から定数やメソッドを追加できるわけで。 かといって、Javaのパッケージみたいにドメイン名使って一意にするのも鬱陶しいけれど。
RUBY_VERSION 否定派は何も根拠がないのが笑える
やはり組み込みと添付は Std モジュールに全部入れておくべきだった
>>330 1.9の機能を模倣する外部ライブラリができるかもしれないし
Ruby実装だって今やMRI一択じゃない
それと機能の有無で分岐してくれた方が後で読んだときに意図がつかみやすい
といっても俺自身否定派でもないから好きにすればいいと思うよ
できれば1.9スレや本スレとか然るべき場所でやってくれればなお良い
涙拭けよ
配列の中にハッシュ作りたいんですけど不可能ですか?
irb> foo = [{"a"=>0, "b"=>1}] => [{"a"=>0, "b"=>1}]
>>334 入れ子にすることは普通にできる
[{'key1' => 'val1'}]
以下のようなことはできそうだができない
['key1' => 'val1', 'key2' => 'val2']
以下のような使い方は一見無駄で遅いっぽい上に実際無駄だが、
Ruby ではけっこう普通にやってるのでどんどん使え
arr = [{'key' => 'val1'}, {'key' => 'val2'}, {'key' => 'val3'}]
arr.each do |h|
p h['key']
end
>>336 それって全部同じ 'key' でも何か意味があるの?
keyは色々なものでってこと?
結局、Encoding関連で今まで出た案をまとめると 1. RUBY_VERSIONで分岐 2. defined?(::Encoding) 3. str.respond_to?(:force_encoding) あたりが現実的な解か
>>336 みたいなのは
{'title' => 'タイトル', 'author' =>'著者', 'date' => '日付'}
という固定フォーマットのハッシュを、何らかの理由で順番を保持したまま
深く考えずに適当に処理したいというときに時々見る
data = { 1 => {'title' => 'タイトル1', 'author' =>'著者1', 'date' => '日付1'}, 2 => {'title' => 'タイトル2', 'author' =>'著者2', 'date' => '日付2'}, 3 => {'title' => 'タイトル3', 'author' =>'著者3', 'date' => '日付3'}} 0.upto(data.keys.size).each do |i| p data[i]['title'] end イエス超解決 data を作るときにキーのためにわざわざ整数をカウントしないといけないのが不便
dataは配列でいいんじゃないか?
railsのソースコード読むとハッシュの上手な使い方が理解できるよネー
>>341 敢えて全部ハッシュにするという例なんじゃないのか
>>339 つまり1.9なら不要の発想ってことでおk?
1.9.1 (以降)でしか使わないスクリプトであるなら、ハッシュ入り配列は不要だな 普通にハッシュを each で回せばいい 個人的には Hash の順番保持は 1.9.3 くらいで唐突に無くなりそうな機能だと思ってて これに依存したスクリプトはあまり作りたくないなあと思ってるんだが
え!Hashの順番保持されるようになったのか
えー 1.9.1 でめちゃくちゃ話題になったじゃん $ irb1.9 irb> h = {2 => 'two', 3 => 'three', 1 => 'one'} irb> h.each_pair{|k, v| puts "#{k} => #{v}"} 2 => two 3 => three 1 => one $ irb irb> h = {2 => 'two', 3 => 'three', 1 => 'one'} irb> h.each_pair{|k, v| puts "#{k} => #{v}"} 1 => one 2 => two 3 => three
どちらかというとネガティブな方向で話題になった気がする 順番記憶したら Hash じゃねえとか Rubyオワタ\(^o^)/ とか
確かにHashはあるキーに対応する値を保持するだけのものな気がするな 順番保持したいなら配列にしろ・・・・・ とこんな話もすでにさんざんしたわけか
Java風に言うなら単なるLinkedHashMapでしょ 単なるハッシュとして使う分にはそれでもいいし、 追加コストは定数だからRuby的には許容範囲だとの判断があったのだろう
標準でOrderedHashクラス作って、Hashの仕様が変更されてもOrderedHashだったら大丈夫って風にしないと まったく意味ないんじゃないの?
ruby をスクリプトエンジンとして使用するフリーソフトを作ったんですが、 Artisticライセンスな windows 版 ruby ってありますか?
yugui氏が担当している間は大丈夫そうなイメージがある、なんとなく 最悪OrderedHash < Hashになったとしても 互換性が必要な場面でHash = OrderedHashとかしときゃいいんじゃねw 冗談はともかく、現時点であらかじめこうしてから利用するとか class OrderedHash < Hash; end 順列が必要な連想配列だというのが明確になるし obsoになったときの対応も比較的容易なはず まあ俺はArrayクラスがArrayとQueueとStackに七変化するようなもんだと思うから抵抗はないし 消える心配も今のところしてない
Hashでも順番持ってた方が普通に便利なんだが 別に深刻な害があるわけでなし、何が不満なんだがさっぱりわからん
>>354 ・性能落ちるかもしれない不安
・今後消えるかもしれない不安
だと思う
言語処理系としてのruby1.9独自仕様なのか、 それともプログラミング言語Ruby1.9の仕様と解釈していいのか混乱があるのでは もし前者だとしたら、処理系依存には抵抗がある ハチドリ本いわく >Ruby 1.9 では、ハッシュの要素は、実装によっては挿入された順序で反復処理される。 う〜ん・・・・・
>>355 性能というのが速度のことであれば逆に速くなった。
というか、だからこそ入った。
確かに列挙は早そうだな
実装依存じゃOrderedHashのつもりで使うのは御法度か
rubyの開発グループは本当に人材酷いな。Railsに全部任せちゃえよ
いやいやRailsの人たちに任せたら新機能と非互換がTINYごとにどんどん増えるよ。
>>360 お前Rails使ってないか、あるいは使い始めたの今月だろ
来月には後悔するのか、流動性速すぎだろRails
Railsは、こっち推奨になりました→やっぱやめました→ごめん、やっぱこれ とかバージョンアップのたびにあったりして笑うw いや、使っている方としてはどっちだよ!とか思うけど
前田さんたちに頑張ってもらって、言語仕様で明文化してもらうまでは Hashのキー順序については昔ながらの意識でいることにする。
JISの話なら、1.8ベースだから順序の保証は入らんと思うぞ
defined? や responsed_to? はダックタイピング用の機能であって モジュール存在判定に使うもんではないと思う
むしろモジュールの存在を問わず メッセージに応答できるか否かだけを問うべきでは?
実際に必要なのは処理結果であって返事そのものではないというのが理想と現実の深くて暗い谷間
>>368 ダックタイピングならそんな判定はしない
ていうかさあ、responed_to? 使ってる奴だって その名前のメソッドを持っていることを期待してるのではなく 「Ruby 1.9 の」 force_encoding であることを期待しているんだろ じゃあそれの条件をきちんと書けよ
>>372 期待していない不正なメソッドが動作した場合はたいてい例外が発生してプログラムが止まる
if str.respond_to?(:force_encoding) && defined?(::Encoding::ASCII_8BIT) && str.respond_to?(:encode) && str.respond_to?(:encoding) && defined?(::Encoding::UTF_8) && str.class.new.encode(::Encoding::UTF_8).encoding == ::Encoding::UTF_8 && (_ = str.class.new.encode(::Encoding::UTF_8).force_encoding(::Encoding::ASCII_8BIT); _.encoding == ::Encoding::ASCII_8BIT) then str.force_encoding(::Encoding::ASCII_8BIT) end
プログラムが止まったあと
>>373 がどう改修するのかにちょっと興味がある
どうせ基本雑談なので次の質問の方気後れせずにどうぞ
376 :
デフォルトの名無しさん :2009/09/27(日) 00:35:12
http://blog.livedoor.jp/dankogai/archives/51183588.html 上のページに掲載されているjavascriptを使って、ブラウザ上で文字列にRaw Deflateにかけた上で Base64 encodeしたデータをサーバへ送信し、
サーバ側ではrubyでBase 64 decode、標準のzlibライブラリを用いてRaw Inflateしたいのですが、
「Zlib::DataError: incorrect header check」が発生しうまく圧縮データを伸張できません。
サーバ側のrubyは以下のようなコードです。
#!/usr/bin/ruby
require 'zlib'
data = "(javascriptで生成した圧縮データ)"
p Zlib::Inflate.inflate(data.unpack('m')[0])
ちなみに、perlだと同じように標準的なライブラリを使って以下のようなコードで圧縮データを伸張できましたので、このjavascriptのコードが特殊なことをやっているというわけではないのかな?と思います。
#!/usr/bin/perl
use IO::Uncompress::RawInflate ':all';
use MIME::Base64;
$data = "(javascriptで生成した圧縮データ)";
$decoded = decode_base64($data);
rawinflate(\$decoded => \$inflated);
print $inflated;
このJavascriptライブラリ特有の問題なのか、rubyの問題なのか切り分けができておらず微妙かと思ったのですが、
perlで動いたので一度ruby界隈で聞いてみようと思い書き込みしています。
何か分かりましたらご教授いただけないでしょうか。
unpackが怪しい気がするから、Base64デコードしたデータのハッシュを、Perlのやつと比べてみたらどうかな? あと、詳しくないんだけど、そもそもRawDeflateと普通のDeflateって同じものじゃないとか?
378 :
デフォルトの名無しさん :2009/09/27(日) 01:20:21
>>377 まさかと思って調べたところ、RawDeflateと普通のDeflateが違うものでした。
考えが及びませんで、ありがとうございました。
RawDeflateにchecksumなんかが頭についたものがDeflateのようで、以下のようにしたら動きました。
p Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(data.unpack('m')[0])
配列の中にハッシュ入れたんですけど a = [0, {1 >= 5}, 3] これの配列データがFixnumかハッシュかどうかで処理を分けたいんですが is_a?(Fixnum)で分岐させようとしたらエラーが出ました classで調べたらエラーが出ます どうすればいいんでしょうか?
{1 >= 5} でエラーという落ちじゃないだろうな ちょっとコードをはってみろ
381 :
379 :2009/09/27(日) 04:07:10
class hogehoge def mastery_open_flag MASTERY_ARRAY::HASH_DATA[1].each{|i| open_flag = true if MASTERY_ARRAY::HASH_DATA[1][i].is_a?(Fixnum) MASTERY_ARRAY::HASH_DATA[1][i].each{|index, level| unless @actor.mastery_level_data[index] >= level open_flag = false end } if open_flag @actor.mastery_open_data[i] = true end end } end end エラーはTypeErrorで cannot convert Hash into Integerと出ます
382 :
379 :2009/09/27(日) 04:08:30
module MASTERY_ARRAY HASH_DATA[1] = [ 0, 0, {0 => 5, 1 => 3}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ] end モジュールの配列です。
どの行でそんなエラー出てるんだい
384 :
379 :2009/09/27(日) 04:28:48
if MASTERY_ARRAY::HASH_DATA[1][i].is_a?(Fixnum) ここです 配列のインデックス2のハッシュ読もうとしたら出ます
mastery_open_flag の MASTERY_ARRAY::HASH_DATA[1].each{|i| ... } の i に hash が きてるからだろう。 i = {0 => 5, 1 => 3} if MASTERY_ARRAY::HASH_DATA[1][i].is_a?(Fixnum) 状態で配列のインデックスにハッシュをブチ込んで、 整数に変換できないよエラーになってる。eachの i にインデックスが入ると勘違いしてない?
387 :
379 :2009/09/27(日) 04:40:24
あーそういうことですか インデックス入らないと困るんですが 何かうまい書き方ありますか? とりあえず考えてみます あったらお願いします ありがとうございました
each {|要素| ... } each_index {|インデックス| ... } each_with_index {|要素, インデックス| ...}
用件は「要素が整数であること」なんだろうか 「要素がハッシュであること」なんじゃなかろうか MASTERY_ARRAY::HASH_DATA[1].each{|e| open_flag = true if e.kind_of?(Hash) e.each_pair{|index, level| open_flag = false unless @actor.mastery_level_data[index] >= level } end @actor.mastery_open_data[e] = true if open_flag end
390 :
379 :2009/09/27(日) 04:58:13
おーすごいさすがプログラム板 each_indexで動きましたありがとうございます 389さんが書いたとおり「要素がハッシュであること」が評価の大筋です kind_of?(Hash) これは知りませんでした なんとかいけそうですありがとうございました
>>389 @actor.mastery_open_data[e] = true の e は each_with_index の i だと思う
要はナントカデータは全部要素数 100の配列なんだろう
マス目みたいに決まっててアクセス手段がインデックスしかないんだ
MASTERY_ARRAY::HASH_DATA[1].each_with_index{|e, i|
open_flag = true
e.each_pair{|index, level|
open_flag = false unless @actor.mastery_level_data[index] >= level
} if e.kind_of?(Hash)
@actor.mastery_open_data[i] = true if open_flag
}
392 :
デフォルトの名無しさん :2009/09/27(日) 13:24:58
Win32で一文字入力してすぐ制御を返すサンプルないですか?
Curses.getch は?
ありがとう。 Winにもcursesってあるのか。
rubyでCGIの勉強しようとおもって lighttpdをインストールしました。 ところが、設定方法がわからず、htmlは表示出来るのですが cgiが動きません。涙目状態です。あちこちググりました・・・ 途方にくれています・・・
397 :
デフォルトの名無しさん :2009/09/27(日) 21:25:08
mongrelをいれるといいよ
力になっちゃあげたいけど、スレ違いかな・・・ WebProg板か、どっかにLighttpdのスレがあるから、そこで質問したらいいよ
SocketってライブラリがあるからそれでWebサーバ書くのがいいと思うな というか環境や参考にしたページをどこまで試してどこで詰まったとか そういうのも無しに答えられるわけないので
それが無いこと自体が答だろ つまり、サーバ立てる知識が無い
>>398 lighttpdのスレは先に見ました。最終書き込みが8月、その前が6月くらいと
人の気配が感じられませんでした・・・
どう転んでもWebサーバの挙動の知識は必要になるわけなんだし 普通にゼロから勉強したほうが早いんだけどね
Linuxなら各ディストリの初心者スレにいけば、誰かが教えてくれそう。
>>402 まったくだぬ
「WebサーバやHTTPはお着せとコピペで済ませて本題のRubyの学習をしよう」というのは
CGI関連に限ってはありえん
>>404 翻訳しながら、lighttpdの本家のページ見てみます。
mongrelも検討してみます。
apacheの設定よりは、ずいぶん楽そうに見えたんですが。。
中途半端にマイナーなサーバソフトウェアだと情報が全くないということはばしばしある めっちゃメジャーなのを小規模で使うのが結局マシだったりすることは意外と多い
自分用WebサーバはApacheを接続数とか1人用に絞って使うのが一番だという結論になった
408 :
デフォルトの名無しさん :2009/09/27(日) 21:50:52
>>396 はどう動かないか書いていないから誰も助けようがないよ。
cgiがどう動かないのさ。スクリプトを貼ったりしろよ。
409 :
デフォルトの名無しさん :2009/09/27(日) 22:02:07
Apacheの方が情報多いのに。
>>408 /var/wwwがドキュメントルートディレクトリで、ここに1.html
/usr/lib/cgi-binがcgiディレクトリに、1.cgi
1.htmlで、action=/usr/lib/cgi-bin/1.cgiと記述。
ブラウザで、localhost/1.htmlを表示。ボタンを押すと
404 not foundとなります。
lighttpd.confでのcgiディレクトリ指定が間違ってるんかなぁと・・
411 :
デフォルトの名無しさん :2009/09/27(日) 22:13:48
ログをまずは見ようぜ。 1.cgiに実行権限がついているかとか1.htmlの読み込み権限とかもチェックしような
action=/usr/lib/cgi-bin/1.cgi っておかしいだろ… lighttpd とかにかかわらず /usr/lib とか公開するとは考えにくいから action=/cgi-bin/1.cgi とかなんじゃないのか この調子じゃ権限とかもだめそうだな
>>396 RubyでCGIの勉強をするなら、lighttpdから始めるのはオススメしない
cgi.rbを使って、WEBrick上 or Apache上で動かしてみるとか
Sinatra使うとかしたほうがいい
>>411 chmod 755はしてあります。
>>412 あ、cgi-binでいいんですね。フルパスにしちゃいました。
たしかに公開しないですもんね。
415 :
デフォルトの名無しさん :2009/09/27(日) 22:52:59
ファイルの所有者も確認しような lighttpdを起動したユーザがownerだよな?
式がnil, false, 0なら偽になるif文てないの?
>>415 ファイルオーナーが、「root」ですね
lighttpdは、「www-data」が起動してます
sudo cpでファイルを/usr/lib/cgi-binにコピーすると
所有者が、ルートになってしまいます。
ちょっと、apacheや他のを調べてみます。みなさん、スレ違いに付き合って
くださって申し訳ありがとうございまsyた
>>416 !x || x== 0
'' や [] や {} も偽にしたいならActiveSupport入れてblank? と present?
を使え。
>>418 それだとnil, false, 0で真になるんだけど。偽がほしいんですが無理なんですか?
x && x != 0 どんだけ応用力ないのかな…
いかにも落とし穴がありそうだと漏れのアンテナが反応しております
422 :
418 :2009/09/27(日) 23:35:35
すまん逆転させるのわすれてた。てへ。
423 :
デフォルトの名無しさん :2009/09/27(日) 23:49:22
>>417 ファイルの権限を777にして実行してみな。
それで実行できれば権限関係の設定がおかしかったってことだ
linuxの基礎を勉強私的な。
Digest::MD5.digest の値を hexdigest に変換する計算式を教えてください。 convert(Digest::MD5.digest(value)) == Digest::MD5.hexdigest(value) となるようなconvert()です。 あるいはヒントでもいいのでお願いします。
そのへんはさすがにマニュアルにも書いてあるだろ > 与えられた文字列に対するハッシュ値を、ASCIIコードを使って 16進数の列を示す文字列にエンコードして返す。 ということで irb> p Digest::MD5.digest('12345') "\202|\313\016\352\212plL4\241h\221\370N{" irb> p Digest::MD5.hexdigest('12345') "827ccb0eea8a706c4c34a16891f84e7b" irb> p Digest::MD5.digest('12345').unpack("H*")[0] "827ccb0eea8a706c4c34a16891f84e7b"
>>425 ありがとうございます。
1バイトずつ16進数に変換するということなので、こう理解しました。
irb> Digest::MD5.hexdigest('foo')
=> "acbd18db4cc2f85cedef654fccc4a4d8"
irb> Digest::MD5.digest('foo')
=> "¥254¥275¥030¥333L¥302¥370¥¥¥355¥357eO¥314¥304¥244¥330"
irb> Digest::MD5.digest('foo').unpack('C*') # 1バイトずつに分解
=> [172, 189, 24, 219, 76, 194, 248, 92, 237, 239, 101, 79, 204, 196, 164, 216]
irb> Digest::MD5.digest('foo').unpack('C*').collect{|c| '%x' % c } # 16進数に変換
=> ["ac", "bd", "18", "db", "4c", "c2", "f8", "5c", "ed", "ef", "65", "4f", "cc", "c4", "a4", "d8"]
irb> Digest::MD5.digest('foo').unpack('C*').collect{|c| '%x' % c }.join == Digest::MD5.hexdigest('foo')
=> true
なるほどー。
どうもでした。
Dir.foreach('hoge'){|filename| filename.match(/(aaa)(bbb)/} print $1 } この状況で、$1や$2の情報を配列に入れるにはどうすればいいですか? 具体的にはこの後、$1の内容について一つ一つ処理をしていきたいんです。
ary = [] Dir.foreach('hoge'){|filename| filename.match(/(aaa)(bbb)/} ary << [$1, $2] # もしくは ary << $1 << $2 } p ary
filename.scan(/(aaa)(bbb)/)
>>428 「<<」ってこういうところで使うんですね。
勉強になりました。ありがとうございました!
rubyを使ってgnuplotで簡単にグラフを書きたいんだけど、 何かお勧めありますか?
h = YAML.load_file(path) @username ||= h[:user]||h[:username]||h[:id]||h['user']||h['username']||h['id'] @password ||= h[:pass]||h[:password]||h['pass']||h['password'] イライラ
エディタから編集中のRubyのスクリプトを独立したウィンドウ、ターミナルで起動したい エラーがあったらエディタがそれを取り込んでタグジャンプしたい teeやら別のモジュールをrequireするのはなるべく避けたい もちろんユーザーはputs/getsを制約なく使いたい といううまいやり方ってないですか? ようするにエラーが出たらそれだけをログファイルに書き込んでrubyは終了コード1を返したいです 標準エラーをファイルに書き込むようなファイルをこっそり-rするのが現実的なんですかね
標準の ruby-mode で M-x run-ruby で Emacs 内に irb 開いて M-x ruby-load-file → Enter すれば irb でファイルが実行されるな エラー行ジャンプはどうしようか
>>432 >h = YAML.load_file(path)
>@username ||= h[:user]||h[:username]||h[:id]||h['user']||h['username']||h['id']
>@password ||= h[:pass]||h[:password]||h['pass']||h['password']
YAML使ってるなら、キーは文字列になるだろうから、Symbolは考えなくていいんじゃないかな。
YAMLでわざわざSymbolをキーに使うとは考えにくい。
@username ||= h['user'] || h['username'] || h['id']
437 :
デフォルトの名無しさん :2009/09/29(火) 19:21:13
1万PVのPHPで作られたサイトをRuby(ROR)かScala(Lift)どちらかを使って バージョンアップしようと計画していますが、どちらがお勧めでしょうか? TwitterもRubyからScalaへ書き換えたりしていますので...
問題ないならPHPのままにしておく
scalaって日本でも実績あるの?
1万PVって何かを説明してるように見えて、実際はまったく説明してないよなあ。 開設以来10年で1万PVなのか、毎秒1万PVなのか。
一応、単位としては1日か1ヶ月かのどっちかだな 1日1万PVならコンテンツによってはまあ普通 1ヶ月1万PVなら内容によっては閉鎖したほうがエコ どっちにしてもPHPで動いてるならPHPで増強したほうがきっと楽だ
>>441 だからEmacs使えって
どうせ使いもしないで脳内で考えてるんだろ
エディタの布教は余所でやれ。
求めること全部できるんだから仕方あんめえ エディタとして動作するものではEmacs以外ではgvimかPeggyくらいしか心当たりがない どう動作するのが効率いいかの研究もEmacsの動作見れば丸分かりだ
特定のエディタじゃなくて何を求めてるんだ どんなエディタでも連携して動く万能スクリプトが欲しいのか
>>446 たぶんそうだと思う
エディタ内でシェルを起動するのでなければ
emacsclient みたいなシステムがないと無理だと思うんだけどね
というか、できないからこそ数十年かけて Emacs が M-x compile を進化させてきたのではないんかのう
うん、Emacsのとか使ってれば「Rubyは特に関係ない」ということにすぐ気づけたはずなのに コンパイラ等が異常終了コードをシェルに返してエラー行を標準出力などに表示さえしてくれれば用は済む
$stderr.reopen($0 + ".errorlog")
>>442 単純にPVって言ったら普通に日単位だろ
何この馬鹿
>>437 >1万PVのPHPで作られたサイトをRuby(ROR)かScala(Lift)どちらかを使って
>バージョンアップしようと計画していますが、どちらがお勧めでしょうか?
どういう理由でバージョンアップしようとしているのかがわからないので、答えられる人はいないでしょう。
パフォーマンスが理由ならRoRはイバラの道だし、開発効率が理由ならLiftはイバラの道。
どちらの道を選んでもイバラの道だと思うので、PHPのまま改善することをお勧めします。
あるいはPythonを使ってGoogleAppEngineにするとか。これもイバラだな。
railsは慣れてしまえば今までの開発が馬鹿に思えるぐらい楽になる
日に1万PV程度なら、サーバ丸1台あればRoRでも余裕だよ。 下手するとキャッシュなしでもいけるくらい。
そりゃ1日8万秒以上あるんだから言われなくても分かる
結局ピーク性能が足りるかどうかだよな。
そして既存のPHP+サーバではおそらく足りてるわけであって、 現時点で言えることは「じゃあPHPでやっとけ」にしかならんという
でも結局ピーク性能が足りるかどうかだよ。
おいちょっと待てよ、ピーク性能が足りてるかどうかが問題だろ
WebProg板に帰れ
1ヵ月1万PVwww
いや、ここはピーク性能が足りるかどうかが肝だろ。
462 :
デフォルトの名無しさん :2009/09/30(水) 18:46:43
全角の数字を半角にしようと下記のフィルタつくったんだけど 変換されないで、元の値が戻ってくる。 何が間違ってるか教えてください。 使う文字コードはUTF-8です。 #全角数字を半角数字に変換するフィルタ def zen_to_han_int(str) outstr = str.gsub(/0/,"0") outstr.gsub!(/1/,"1") outstr.gsub!(/2/,"2") outstr.gsub!(/3/,"3") outstr.gsub!(/4/,"4") outstr.gsub!(/5/,"5") outstr.gsub!(/6/,"6") outstr.gsub!(/7/,"7") outstr.gsub!(/8/,"8") outstr.gsub!(/9/,"9") return outstr end
>>462 str とスクリプトファイルの文字コードが合ってない
ごく一般的には str とスクリプトの正規表現リテラルの文字コードは同一にする
…あーつまりスクリプトのファイルが UTF-8 じゃないか str が UTF-8 じゃないか
あるいは ruby -Ku のような実行指定をしてないかどれか
今はじめて気がついたけどメイリオって数字が全角と半角全く同じに見える。きめぇw
def zen_to_han_int(str)
p "yes!" if /0/ =~ str
end
これで 0 を含む文字列渡したときに "yes!" と表示されなければ
>>463
むしろ、メイリオになってから、半角全角混同さんが気にならなくなりました ^p^
やっとWindowsに標準添付された真の意味での表示用のフォントだからな 表示されるぶんには全角半角の区別がある意味は何もないわけで つまり区別が必要な人は使ったら駄目よ
468 :
デフォルトの名無しさん :2009/09/30(水) 20:25:22
>>463-465 見直したら、スクリプトがS-JISでかかれてました。
$JCODE = "UTF-8"
ってやってもだめなのね
もうひとつ、お願いします。
#数字に変換できるか
def intrger_string?(str)
begin
Integer(str)
return true
rescue ArgumentError
return false
end
end
Rubyレシピブックのまるぱくりなのですが
3桁の先頭に0を含む文字列を渡すとfalseになる場合があります。
例えば078から099までのあいだとか
これも原因が良くわかりません。
どなたか教えてください。
>>468 正規表現じゃだめなん?
del integer_string?(str)
return str =~ /¥A¥d+¥z/
end
>>469-470 お恥ずかしいです
下記のように書き直しました
def intrger_string?(str)
if str.gsub(/\d/,"").size == 0 then
return true
else
return false
end
end
>>471 $KCODEの間違えです(´Д⊂
>>474 メソッド本体だが、ifの条件式が
成立したら(=false, nil以外を返ったら)true
成立しなかったら(=falseかnilが返ったら)false
を返すだけなので、その条件判定式だけでruby的には十分。
ところで str == '' のときはtrue/falseどっちになって欲しいのだろう?
>>475 十進だけにしたいんだろ
/\A\d+\z/ =~ str が最善だと思う
hoge= メソッドと hoge メソッドって、どっちが先に定義されてると自然? reader があってから wiriter があるとわかりやすいよね?
attr_reader :hoge def hoge=(value) でやるのが俺の定番 でも両方書くなら書きやすさ的にライタ側から書くかなあ
ここの真ん中辺のコードなんですが
ttp://www.aoky.net/articles/why_poignant_guide_to_ruby/chapter-4.html wordlist.rb
code_words = {
'スターモンキー' => '新帝国の神経質な閣僚のフィルとピート',
'カタパルト' => 'chuckyゴーゴー', '火炎瓶' => '暖房つきのリビング',
'ナイジェリア' => "Ny and Jerry'sドライクリーニング(ドーナッツ付き)",
'とどめをさす' => 'コンセントをさす'
}
require 'wordlist'
# 邪悪なアイデアを取ってコードワードと入れ替える
print "新しいアイデアを入力してください: "
idea = gets
code_words.each do |real, code|
idea.gsub!( real, code )
end
メソッドdoのブロック引数で、real, codeの二つが出てきます。
これはなんですか?意味がわからないです。。。
コピペで、rbファイルを2つ作って、下のコードをruby hoge.rbとして実行しても
想定通り動きませんし・・・
>>480 こゆこと
これなんぞと思ったら出力して中身を見れ
code_words.each do |key, value|
puts "#{key} -> #{value}"
end
ナイジェリア -> Ny and Jerry'sドライクリーニング(ドーナッツ付き)
カタパルト -> chuckyゴーゴー
スターモンキー -> 新帝国の神経質な閣僚のフィルとピート
火炎瓶 -> 暖房つきのリビング
とどめをさす -> コンセントをさす
だからそういう文法というか基本クラスのメソッドの使い方っぽいのは
マニュアルを一応眺めてから「ここの部分がさっぱりわからんおまえら親切に教えろ」とか言ってくれ
親切かどうかはともかくおおむね解説なりツッコミなりが入るからさ
ttp://www.ruby-lang.org/ja/man/html/Hash.html#each > key と value を引数としてブロックを評価します。 self を返します。
{:a=>1, :b=>2}.each_pair {|k, v| p [k, v]}
# => [:a, 1]
[:b, 2]
doはメソッドではない。ではdoでなければメソッドは何でしょう?
>>482 それはマニュアルを読むだけの力があるのに
手抜きして読まない人向けのお言葉
>>483 do はブロック開始の(予約)文字列
メソッドに引数を渡すときの ( と ) それそのものがメソッドではないのとおおむね同じ理屈
文字列だからたまたま読めるだけで、別に <<<<<< >>>>>> でもよかった
>>481 eachメソッドがハッシュに対して使われたときは、その引数は
|key,value|という形になるわけですね。
>>482 申し訳ないです。
>>483 481の結果からすると、each(すべての要素にたいして)do以下を行えという
ことだと思いますが、メソッドでないならdoはなんだろう。
>>481 実行してみました。
undefined local variable or method `code_words' for main:Object (NameError)
というエラーが出ました。code_wordsが定義されていない?
初心者が最初にwhyの感動的rubyガイドで勉強するのは 不適切だったりしますか?
>>486 だから、doは予約語だってば。
ifがメソッドでないのと同じ。
>
>>483 > 481の結果からすると、each(すべての要素にたいして)do以下を行えという
> ことだと思いますが、メソッドでないならdoはなんだろう。
そのeachはなんですか?
すべての要素にたいして、というおまじないか何かですか?
プログラミング言語はそういうふわふわとしたものではないです。
おまいら、ここは初心者スレだ。
初心者っつーのはとんでもない思い込みや勘違いをしていることも多いんだから
あたたかい目でみてください。
>>486 >メソッドでないならdoはなんだろう。
すでに指摘があるように、doは構文を表す予約語のひとつです。
while i < 10 do
print i
end
では、whileやdoやendが予約語です。なおこの場合ならdoは省略可能。
[1, 2, 3].each do |x| puts x end
なら、each や puts はメソッド名、do と end は構文を表す予約語。
do が何だかわかりませんレベルの人には来て欲しくないな 質問するなら最低限、言語の基礎は身に付けておいて欲しい これくらいは自力で学習、調査しておくのが質問する側のマナーだろう
そもそも、動作としては arr.each(ブロック) なんだよ オブジェクト arr の インスタンスメソッド each に引数でブロックを与えている ただ、便利なブロックがこのままだとたいそう使いにくいので [1,2,3].each(do |e| p e endのブロック、ただし実行できるならこのブロックを要素ごとに実行すること) といちいちテクニカルにする代わりに [1,2,3].each do |e| p e end と平易に書くように Ruby を作ったのだ このへんの動作が気になるなら my_block = lambda do |e| p e end [1,2,3].each(&my_block) とでも書いてみるといい
>>493 思考過程の筋が見えるなら特に問題はないと思われ
まあ、つまりは「勝手に省略せず詳しく書け」ということでしかないわけだが
若干のエスパー能力が要るから万人には勧められない
理解としては
>>486 でまったく問題ないのになんでこんなことになってるんだ
申し訳ありません。whyのrubyガイドが 最初の方は、とてもわかりやすかったのです。 読み進めていると、コードが出てきて、ruby ファイル.rbと実行しても エラーが出たりするようになり、僕はアホなのだろうかと思って質問しました。 初心者向けとして適当でないようなので、もうすこし文法を押さえながら 読んでみようと思います。ありがとうございました。
>>493 >do が何だかわかりませんレベルの人には来て欲しくないな
おまえは
>>1 を声に出して10回よめ。
この程度が我慢できないやつはこのスレくるな。
でも
>>493 程度が我慢できない人は2chに来るべきじゃないよね。
せめてネタ系のスレで頑張ってもらえるとありがたいんだけど そうもいかないんだろうね
rubyに限らず初心者スレッドは全てを受け入れる糞溜だと思ってる
502 :
デフォルトの名無しさん :2009/10/02(金) 05:22:34
日本語の文字抽出でうまい方法が分からず困っています。 抽出元のサンプルは下記の通り 11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69 上記サンプルのうち、「この、文字列を抽出したいんdesu.」の部分を抽出したいんです。 抽出対象:日本語、句読点、日本語文字列に付随する半角英数字、半角記号("テスト."等。空白類を挟んだら不要対象とする) 不要対象:半角英数字、半角記号、空白、"○"、"×"等 現在のコードは下記の通り while line=gets if /\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*/ =~ line if $1 != " " print "日本語抽出:", $1, $2, $3,$4,$5,$6,"\n" end end end 実行結果↓ 日本語抽出:○ × ::この&カ字列を抽盾オたいん (続きます)
503 :
デフォルトの名無しさん :2009/10/02(金) 05:25:20
(続き) if文の条件が大変なことになっているのは if /(\W+)/ =~ line としてしまうと最初の"○ ×"のみ抽出して終わってしまうためです。 プログラムとして力技で美しくないのは分かっています。 また、日本語が文字化けしてしまっています・・・文字コードの問題だろうとソース先頭に#!ruby -Ksを足してみましたが、 空白類の扱いが変わった?のと記号以外の文字類が表示されなくなりました。 抽出部分を綺麗にするにはイテレータで回せば良いかなと思っています。 →一文字ずつチェックしようと思いましたが、String#each_byteが全半角を問題なく捌けるのか問題が・・・ 問題をまとめると 1:文字列の中から上記抽出対象のみ抽出したいが、力技で汎用性がないので改善したい 2:文字化けしてしまうが原因、対策が分からない となります。 OSはWindows XP SP3でRubyのバージョンは1.8.6です。 長文乱文で分かりにくい質問となってしまい申し訳ありませんが、よろしくお願いします。
まあrubyはメゾットの様なものが多いのも事実だけどな。 そこらの統一性の無さは、原理追求派よりも教祖信仰派のほうが多いってだけじゃないかと。 メゾットだからこうって寄りも、教祖がこう使う様に教えたから深く考えずに同じ様に使うのほうが、良いruby信者に成れる気がする。
irb> s = "11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69" irb> puts s.split[6] この、文字列を抽出したいんdesu. 空白で区切られた7フィールド目という意味ならこれでいいのでは フィールド内に半角空白が混じっても構わないという条件だととたんに面倒になるが
506 :
503 :2009/10/02(金) 06:02:35
>>505 レスありがとうございます。
すみません、確かにサンプルに限定すればそれで解決ですね。
ただ、やりたいのは日本語部分(日本語文字列に付随する記号類、英数字は抽出対象とする)の抽出なのです。
質問の書き方が悪かったのですが、おっしゃる通り、日本語列の中の空白、記号、英数字、
もしくは日本語列の先頭・末尾の半角英数字、記号類は抽出したいんです。
(日本語列と結合していない日本語以外(英数字、記号、空白類)は除外)
結合ってなんだ?
508 :
503 :2009/10/02(金) 06:21:11
>>507 付随と同義です。ややこしくてすみません。
文字列の結ご・・・連結ですね。すみません。
>>507 おそらく、セパレータとフィールドという概念がないんだと思う
だから、元データを作った人の意図を読むことができないし、説明もできてないから俺らもどうにもできん
たとえば、俺らは
>>502 を見たときに
「番号、マルバツ、マルバツ、英数字、時分秒、英数字、日本語入り文字列、年月日、時分秒、数字」
という空白で区切られた固定の何らかの意味を持った10項目(または年月日+時分秒の9項目)と読むが、
>>503 にとってはおそらくそうではないのだろう
ひょっとしたら例示のために出しためちゃくちゃな文字の集まりなのかもしれない
空白の数には全く意味がなく、
形態素解析のように「空白で区切られた、日本語文字を含む文字の連なり」が欲しいのなら
split.find_all{|e| <eがShift_JISの日本語文字を含むということ> }
とすればよい
Shift_JIS (というかたぶん CP932)の日本語文字を含む条件を表す正確な正規表現はどっかから拾え
irb> s = "11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69"
irb> puts s.split.find_all{|e| /[\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]/n =~ e}.delete_if{|e| /\A[○|×|△]\Z/s =~ e}
この、文字列を抽出したいんdesu.
>>503 >>509 のようにsplitで配列にしてからfind_allでもいいし
文字列に繰り返し正規表現をしたいのならscanてのもある
Array,String,Hash,Enumerableあたりのメソッドは軽くリファレンスに目を通しておくといいよ
へぇこんなのあるんだっていう程度でも使う時に思い出せる
-Ksを指定するとShift_jis全角文字も\wでマッチするようになる
>>511 「も」では駄目だろ
英数字記号だけの場合はマッチしてはいけない
irb> /\w/ =~ "あういえ".tosjis
nil
irb> $KCODE = 's'
irb> /\w/ =~ "あういえ".tosjis
0
irb> /\w/ =~ "a"
0
全角文字(と場合によっては半角カタカナ)にのみマッチする正規表現か、
英数字記号だけにマッチして全角区域に誤爆しないという正規表現が必要
>>512 ああすまん-Ksにして結果が変わった原因ってことで書いただけなんだ
ruby って、ライブラリやクラスメソッドの使い方を 覚える言語ってことですか?
オブジェクト指向言語は大体そんなもんだ
大抵のプログラミング言語において、文法なんて数時間で全部理解し終えるもんだからなあ。 後は当然ライブラリの使いこなしってことになるだろう。
クラスメソッドよりもインスタンスメソッドのほうが多いよ! とかそんな話を 別に覚えなくてもいいけど、その場合はライブラリに相当するものを全部自力で作ることになる どっちか気に入ったほう選んでくれ
Windows版のRubyって、OpenSSLも使えるんでしょうか。 知っている人がいたら教えてください。
パッケージ次第だった気もするけど、基本的に使える
>>518 推奨されてるパッケージでインストールする限りは使えるはず
他の人のWindows版でも絶対に使えるとは限らないのは他のOS版のRubyと同じ
ありがとうございます。 RSAの仕組みを勉強するのにRubyを使うことにします。
rubyでは、値がすべてオブジェクトということは 1という数値や"太陽パクパク"という文字列や、それらを代入した number,sun_eaterといった変数もオブジェクトということですか? number = 1 sun_eater = "太陽パクパク"
>>522 整数とかはさすがに高速処理するように小細工を施してはありますが、
それらも含めオブジェクトは全部クラスのインスタンス(=オブジェクト)です
irb> p 1.class
Integer
irb> p "太陽パクパク".class
String
変数はオブジェクトについたラベルです
ラベル名 → オブジェクトID
というような対応表を Ruby が管理していて、
該当ラベルの変数が呼ばれたときにはその表の対応を参照して該当オブジェクトが使われます
変数というハコが入れ物オブジェクトとして存在するわけではありません
irb> p 1.object_id
3
irb> p "太陽パクパク".object_id
-605838888
>>522 >rubyでは、値がすべてオブジェクトということは
>1という数値や"太陽パクパク"という文字列や、それらを代入した
>number,sun_eaterといった変数もオブジェクトということですか?
数値や文字列もオブジェクト。
ただし、「変数」はそれらオブジェクトを格納するもの(あるいはオブジェクトとひもづけるもの)であって、オブジェクトそのものではない。
そのへんは他の言語でも同じ。
>>523 変数はオブジェクトじゃなくラベル。
あやうく、間違った認識で通り過ぎるところでした。
ありがとうございます。
>>524 他の言語でも同じなんですね。ありがとうございます。
C++、Perlでは宣言された変数自体がオブジェクトの実体であるケースもあるけどね と、話をややこしくしてみる
他言語がどうであれ、Rubyにおいて変数は箱ではなくラベルなのは間違い無い 沢山あるオブジェクトの中のいくつかに名前を付けるのが変数 1つのオブジェクトに複数の名前があることも珍しくないし 無名のまま役割を終えるオブジェクトも存在する
だいなみっくえいりあしんぐ
2chまとめエディターを作っているのですがどうにもこうにもならなくなってしまったのでヒントをください。
やろうとしていることは
DATの中身をコピペで入力
↓
下ごしらえの置換
アンカー順に並べ替える
チェックボッックスによるdivのclassの追加(文字色を変えたり大きくしたりするため)
↓
ソースを出力
というものです。
ひとまずここまでひとりでつくりました。
http://tomiya.bne.jp/cgi-bin/upup/src/myg_l2344.zip.html やっていることは
簡単な置換とレスに1〜1001までの番号をハッシュとして付ける
ことまでです。
教えて欲しいことは
アンカー順に並べ替える方法
本文をスキャンして「>>○○」を抽出しハッシュのkeyに代入?
チェックしたレスのみ出力する方法
チェックボックスでdivのclassを追加
<div class="res">を<div class="res aka">や<div class="res aka deka">などに置換?
です、見当がつきそうな方はどうかご教授ください。
オブジェクトについて、もうひとつ質問です。 class Gohan def caree print "今日のご飯はラーメンだ\n" end def natto print "朝飯は納豆だ\n" end end yuhan = Gohan.new yuhan.caree asamesi = Gohan.new asamesi.natto この場合、yuhanやasamesiがオブジェクトになるのでしょうか?
ARGVで漢字のフォルダ名が展開できず困っています。 英字だと >ruby -e "p ARGV" hon/* ["hon/新規テキスト ドキュメント.txt"] となってうまくいきますが、漢字だと >ruby -e "p ARGV" 本/* ["本/*"] となってしまい、フォルダ内の新規テキスト ドキュメント.txtが展開されません。 どうすれば展開できるかご教示ください。 OSはWindows XP SP3です。 >ruby -v ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
Ruby標準のCGIクラスって、どれぐらいの大きさのデータを受け取れるのでしょうかね? DBの内容をWeb上からバックアップ(DL)したり、復帰させたり(UP)するシステムを考えてるのですが バックアップするときは、ストリーミングで流せばいいような気がするけど 復帰させるときは、大量のデータが一度メモリに溜め込まれる気がします たとえば、サーバの実メモリを超えるようなデータを受け取ったときに処理できるのか?っていうのが疑問です。 また、なにか回避策が有るのでしたら、教えてください。
ワイルドカードの展開ってシェルの役割じゃ・・・? と思ったらWinではやってくれないのか
>>532 ARGV の処理は環境依存
コマンドプロンプトで
DIR 本/*
とやって、望みの出力が得られなければ ARGV では無理というかコマンドプロンプトの使い方の知識が足りない
537 :
532 :2009/10/02(金) 18:50:17
>>536 それはうまくいきます。/の代わりに\ですが。
>dir 本\*
ドライブ D のボリューム ラベルは以下略
>ruby -e "p ARGV" hon\*
["hon/新規テキスト ドキュメント.txt"]
英字は/でも\でもok
>ruby -e "p ARGV" 本\*
["本\\*"]
漢字はどっともだめ
538 :
532 :2009/10/02(金) 18:55:24
書き忘れ >ruby -e "p ARGV" */* ["hon/新規テキスト ドキュメント.txt", "本/新規テキスト ドキュメント.txt"]
>>530 #!/usr/local/bin/ruby -Ks
class Ch2Thread
def initialize(file)
@dat = file
parse
end
attr_reader :data, :title, :size
def [](v); @data[v]; end
def parse
@data = Array.new
arr = @dat.to_a
arr.each_with_index do |res, i|
@data << parse_res(res, i)
end
@title, @size = arr[0].split(/<>/)[-1], @data.size
end
def parse_res(res, resno)
e = res.split(/<>/)
d = e[2].split
return {:no => resno + 1, :name => e[0], :mail => e[1],
:date => "#{d[0]} #{d[1]}", :id => d[2], :be => d[3], :res => e[3]}
end
end
sure = Ch2Thread.new(File.open('./sample.dat').read)
puts "Title => #{sure.title}"
sure[0..3].each do |res|
res.each{|k,v| puts "#{k} => #{v}"}
end
>>532 WinXP SP2 + ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
だけど展開してくれた。なんなんだろうね
541 :
540 :2009/10/02(金) 19:02:24
SP3だった・・・ あとコマンドプロンプトから動かしてる? 専用エディタとかから走らせたりしてると挙動が違ってくるかも
>>532 ren 本 書
ruby -e "p ARGV" 書/*
1.9のglob周りは多バイト文字に関しては腐ってるね。
1.9.1リファレンスより >標準のシェルがワイルドカードを展開しない環境 (Win32)では、Ruby インタプリタが自前でワイルドカードを展開して Kernel::ARGV に設定します。 らしいからできるはずだと思うけど うち(Vista コマンドプロンプト)でも 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]だと 本\* 本/* どっちも認識してくれるけど 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]だとできなくなってるな
544 :
532 :2009/10/02(金) 19:11:36
ご確認いただきありがとうございます。 うちも1.8.7はokでした。 1.9.1で通る漢字もありました。 >ruby -e "p ARGV" ホン/* ["ホン/新規テキスト ドキュメント.txt"] >ruby -e "p ARGV" 川/* ["川/新規テキスト ドキュメント.txt"] >ruby -e "p ARGV" 山/* ["山/新規テキスト ドキュメント.txt"]
546 :
539 :2009/10/02(金) 19:16:56
とりあえずレスの全データを扱いやすい形に整えないと見通し的にどうにもならないような気がしたので、 たとえばこんなクラスを作る 動作は超適当 変数名も適当 レス本文のHTMLタグとかを消したい場合は parse_res のとこで適当に追加してくれ クラスでなくてもでっかいハッシュや配列を作るのでもいいんだけど面倒だったのでクラスにした
日本語とかマジで廃止しろよ 100年前に廃止してくれてれば今頃こんな苦労することも無かった
>>547 PC/AT互換機使うのいますぐやめろ
元凶はそれだ
ずっとNECなら日本語処理は完璧だったのだ
たいした苦労もしてないくせに
悪いのはシフトJISだよ 日本語は悪くないよ EUCばんざーい
もはや現実逃避しかないのか・・・・・・w
松江市さんは、rubyのドキュメントをしっかりしたものに してください。
>>533 >たとえば、サーバの実メモリを超えるようなデータを受け取ったときに処理できるのか?っていうのが疑問です。
添付ファイルデータなら、cgi.rb が一時ファイルに書き出してくれるので、実メモリを超えても大丈夫なんじゃないかなあ。
>また、なにか回避策が有るのでしたら、教えてください。
そのような場合は、cgi.rbを使わず、自前で$stdinからPOSTデータを読み出したほうがいいと思います。
>>548 78JISに拘泥して混乱を広げた元凶だということも知らずに呑気な馬鹿だ。
>>542 で必要最低限のことは全部触れられていそうだな
「本」をShift_JISとして見ると2バイト目が { なので、rubyのglob特殊文字になる。
というわけで、1.9では、2バイト目がrubyのglob特殊文字になる文字列をコマンドライン引数に与えると危ない、と。
文字のエンコードが1種だけなら問題ないという話だろ
勉強せずにスラスラ英語の文書読めるプログラマと、毎日英語と奮闘してるプログラマ どれだけ差が開くと思う? つまり日本がこの業界でアメリカに勝てないのは必然だ
単なるrubyのバグの話でしょ
Rubyに限らず 引数の文字コードって どんなふうに判別するものなんだろう?
引数の文字列自体はWindows-31Jにしてくれてるぞ
インターネット時代なんだしJISで統一すれば何もかもうまく逝ってけどな。 いまからならOSもメールもウェブもUTFで統一。
文字コードとかごちゃごちゃし過ぎて分からんから指定できるところはとりあえず全てUTF-8にしてる。 特に問題が起きたことはない。
Win32で1.9.2プレビュー1をビルドしようとしたができんw clにminiprelude.cがないぞゴルァって言われる あるしちゃんとインクルードパスにも入ってるのに・・・
>>546 おお、ありがとうございます。
しかしこれからどうしたらいいのか全然アイディアが浮かばないんです。
どういう方向性でいけばいいのでしょうか。
>>564 わかんねーときは、わかる機能だけで作ってみるといいよ
ゴールを遠くに設定しすぎてるから方向わからないんだよ、チェックポイント作りまくれ
いきなり無茶し過ぎなんだろ。小さい所から順々にステップアップしないと。
とあるフォルダの中のファイル名をずらーっとデータベースに入れたのは良いんですが、 この後ファイルがそのフォルダに追加されるごとにデータベースも更新したいです。 差分を取る方法を教えてください。
>> [1,2,3]-[1] => [2, 3] ファイルリスト程度ならオンメモリで余裕だろう
データベース自体は Ruby 以外を使うか、pstore に保存して cron とかで毎回読んでくれ
>>565 >>566 なるほど、そういう考えもありますね。
もうちょっとこつこつやるべきでした、ありがとうございます。
requireとかを使って外部のファイルを読み込むときですが main.rb class Main def initialize @foo = Array.new require 'sub.rb' end end main = Main.new [EOF] sub.rb @foo.concat ['hoge'] [EOF] みたいな場合にsub.rbからmain.rbの@fooにアクセスするにはどうしたらいいですか? よろしくお願いします
rquireは、対象コードをその位置に展開するメソッドではない。 中身が何でも気にしないなら eval File.read('sub.rb') とでも。
>>571 require はトップレベルにファイルを「追加」する
ファイルを物理的に大きな1枚のファイルにする効果しかない(いや物理的って変だが)
メソッドの「奥深く」で require しても、クラス定義の外で普通に require したのと何も変わらない
それと、Ruby では、単純な行単位の切り取りを行うことはできない
現在のクラスにメソッド定義内で機能を追加するには、たとえば module の include を使う
メソッド単位でしか追加できないので、そこは要領よく機能を分ける
# sub.rb
module Sub
def add_hoge
@foo.concat ['hoge']
end
end
# main.rb
require 'sub.rb'
class Main
include Sub
def initialize
@foo = Array.new
add_hoge
end
end
p Main.new.instance_variable_get('@foo')
574 :
571 :2009/10/03(土) 19:57:00
>>572 ,573
レスありがとうございます。言葉足らずですいません・・・
sub.rbにはclassも書いてあるのでその場に展開されるとエラーになります・・・
sub.rbに書いてあるクラスをsub.rb内で初期化してそのオブジェクトをmain.rbの
方に持ち帰りたいです(プラグインシステムみたいな感じ)
グローバル変数を使えば出来るようですがあまりスマートじゃない感じですので
もうちょっとすっきりする方法があればと・・・
よろしくお願いします
class Main def initialize(plugin_name) @foo = Array.new require plugin_name plugin_mod = Object.const_get(plugin_name.capitalize) extend plugin_mod do_something end end Main.new('plugin1') # plugin1.rb module Plugin1 def do_something @foo.concat('hoge') end end
576 :
571 :2009/10/04(日) 15:48:48
>>575 extendで何とかなりました
ありがとうございました
ちょっとした質問です。 items.each{ |x| x.destroy } というようなこう全部の要素にたいしてメソッドを呼ぶのを もっと簡単に書く方法があったような気がしたのですが、ご存知ありませんでしょうか? Ruby 1.8.7です。
&:destroy
>>578 それだ!
items.each(&:destroy)
でいけましたありがとうございました。
1.8.6 では動かないから配布には注意な
1.8.6 なんてもう使わない方がいいよ
>>581 さんがサーバソフトウェアのリプレースを行ってくれるそうです
感謝の印におっぱい見せろ
ごばくった。すまん
586 :
デフォルトの名無しさん :2009/10/05(月) 23:44:01
お礼におっぱいを要求するような人間が使う言語、それがRuby
だがそれがいい
テンプレに追加しといて。 質問する人へ: 回答をいただいたら、ありがとうの言葉とともに、感謝の印としておっぱいを見せましょう。
教祖もおっぱい成人だったか。
>>573 > require はトップレベルにファイルを「追加」する
> ファイルを物理的に大きな1枚のファイルにする効果しかない(いや物理的って変だが)
$ cat s.rb
a=1
def f; 1; end
$ cat c.rb
require './s'
p defined? a
p defined? f
$ ruby c.rb
nil
"method"
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
トップレベルでのローカル変数のスコープは require/load を越えないのでしょうか?
require や load した場合、ローカル変数だけは、ファイルごとにスコープがあります ローカル変数という概念を保護する制限だと思ってくだされ require ではなく Ruby スクリプトファイルとして読み込んで実行することで制限を乗り越えることができますが勧めません ファイルとモジュールの構造を変えることのほうを強く勧めます
数字をキーに持つハッシュがあり その中で一番小さい数のキーの値を取り出したいのですが 単純に書くと以下になるんですが 他に何かこれだという方法はないでしょうか? h = {2 => "a", 5 => "b", 7 => "c"} p h[h.keys.sort[0]] => "a" これで問題があるわけではないですが 他に方法がある気がしたので質問させてもらいました
594 :
デフォルトの名無しさん :2009/10/07(水) 18:12:38
hoge = moge.execute print hoge というとき、print hogeの hogeのところで moge.executeが参照され 実行されて得られた結果が、printされるという理解でいいですか?
>>593 素直に書くなら
h[h.keys.min]
>>594 一行目の時点で
>moge.executeが参照され実行されて得られた結果
がhogeに収まる
二行目はすでに収まってるhogeの中身を出力するだけ
>>594 の日本語の部分をrubyで書くとこんな感じ?
hoge = Proc.new { moge.execute } # moge.executeはまだ実行されない
print hoge.call # Procを実行する(moge.executeが実行される)
597 :
デフォルトの名無しさん :2009/10/07(水) 18:22:48
rows = dbh.do("INSERT INTO people (name,height) VALUES('Wanda',62.5),('Robert',75),('Phillip',71.5),('Sarah',68)") printf "%d rows were inserted\n", rows ruby/dbiの使い方ページにあるコードの抜粋なんですが、実行すると 4 rows were insertedと表示されます。 printf "%d " , rowsで、rowsから何かの数字を得ているようなのですが どういう動きをしているんでしょうか?
>>596 考えていたことと逆でした。ありがとうございます。
>>602 異端審問される恐れがあるので
人前に晒すスクリプトでは使わないように
スタイルの押しつけうぜぇ
個人的にString#%は蛇道
>>601 どもです。putsに書き換えて実行したところ同じように出ました。
どこから、4という数字を得ているのでしょうか? 上の式だとdbh以下を実行して
4つの要素をDBに登録していますよね。
>>604 Ruby使うの今すぐやめれ
プログラミングスタイル強制要素が無数に散りばめられてるぞ
>>601 君にはPythonが向くんじゃないかな?性格的に。
>>608 sprintf は Ruby のものではないということを知らない?
>>606 そりゃそういうふうに作られてるからだろ
do のマニュアル読め
わざわざカウントして数値を返してるようなので初心者殺しではある
sprintf と pack/unpack は「Ruby らしい」糖衣実装が望まれていながら、 ダラダラと旧来の仕様を引きずってきたんだよな オタクが他の言語の知識を流用できて便利というただそれだけの理由で
>>611 あれは正規表現みたいなサブ言語だと思って諦めるのが吉かと思われます
確かに覚えにくいしなんとかしたほうがいいのは確かなんだけれど
あれをまたまとめて別途組み立ててしまうとそれだけで結構な一覧表に
>>610 どもっす。doのマニュアルを探してきます。
printf類にrubyらしい実装なんて不要 他の言語と違う動作されたらそれこそ非難の的
prntf などの「メジャーな関数」をなくせという話ではないように読めるが
>>611 sprintfは別言語でそれやられて大迷惑
>>612 も言ってるけどいまさら別に覚えるのも嫌だから
今までと同じでいいよ・・・
617 :
593 :2009/10/07(水) 19:27:45
>>595 minですね
探し切れてませんでした
ありがとうございます
>>598 なるほど、確かに求めてるのはヒープみたいなものでした
参考になりましたありがとうございます
別にみんな自由に書けばいいじゃんw Obsoleteでもない限り機能として用意されてるんだから使えばいいし 「個人的に嫌い」な人が大半になればそれを使わないのがデファクトスタンダードになるだけだし
619 :
591 :2009/10/07(水) 19:37:20
ruby/dbiの公式に行きまして、classデータベースというページがあり メソッドの説明がしてありました。しかし、記述が少ししかなく。 こういう場合、ソースを読むんでしょうか? とりあえず、今は目的に必要なことだけをやっていこうと思います。
>>597 >rows = dbh.do("INSERT INTO people (name,height)
>VALUES('Wanda',62.5),('Robert',75),('Phillip',71.5),('Sarah',68)")
>printf "%d rows were inserted¥n", rows
>
>ruby/dbiの使い方ページにあるコードの抜粋なんですが、実行すると
>4 rows were insertedと表示されます。
>
>printf "%d " , rowsで、rowsから何かの数字を得ているようなのですが
>どういう動きをしているんでしょうか?
1行目の rows = dbh.do("insert....") で、insertした件数が返されて rows に代入されているだけじゃないかな。
それを printf "%d ", rows で出力している。そんだけ。
>>625 sprintf系まとめて異端だったの?
>>603 は「(sprintfはまだしも)String#%は使うな」と言ってるんだと思ってたけど
C に由来する sprintf や pack/unpack の書式記号や利用法が Ruby らしくないというツッコミなんじゃ…
pack系はともかくsprint系に選択肢ないか?
pack は map で直接書くというコードの動作的にはある意味わかりやすい代替手段が
しかしprintfを非難するとはいい度胸だ…これも平成ゆとりが増えたからなのか…
packにせよprintfにせよ、DSLは不思議と好き嫌いが分かれる気がする
>>631 「わかりにくい」ことは確か
初心忘れると老害と罵られるぞ
反printf派に聞きたいんだけど 今より使いやすい(Rubyっぽい)printf構文ってどんなの?
とりあえず「詳しくはmanページ読んでね」というのは頂けないな 「正規表現はPerlと同じ物が多いので同じ場合はそちらを」は通用しないのに
>>633 packは使ったこともないし使う場面もないから構文すら知らない。
rubyでdef endしちゃうから今後も使うことはないだろう。
$と記号1つのグローバル変数(今となっては排除したいらしいが)も、 「Perlといっしょ」で通じなくなってきてるからな…
printfを知らないとなると、rubyしか触ったことないってことになるんだがな… webクリエータはたいてい適当だしそんなもんかw
>>636 バイナリファイルのヘッダパースとかどうやってやってるの?
>>636 irb1.8> p "ルビー"
"\343\203\253\343\203\223\343\203\274"
これ日本語に戻してー
>>636 1.8でUnicodeEscapeSequence文字列が欲しいです先生
packはまあ・・・・使う時にリファレンスを見てやるしかないな 一方、青木氏はpackで壊れた >まったくpackの意味不明さときたら、 >「packのテンプレートがわからなくたって悔しくなんかないんだからな! バーカバーカ!」 >と幼児退行してみたくなるほどです。
646 :
デフォルトの名無しさん :2009/10/07(水) 22:09:18
青木氏って2chねら?
647 :
デフォルトの名無しさん :2009/10/07(水) 22:27:52
>>647 中身がタブ区切りのtsvだからです
っていうかファイルの中身確認することくらいしようぜ
putsすると日本語でも表示されるよね sjis問題で文字化けはするけど
gets, puts ってのはもろにCだと思うんだが・・・
え・・・そうだと思うけどなんか違った・・?
652 :
デフォルトの名無しさん :2009/10/07(水) 23:28:42
visualstudioみたいにボタンとかを貼り付けて入力フォームが作りたいんですが ああいうツールは無いんでしょうか?
CentOS上でruby1.8.7から1.9にアップデートしたいのですが、 Linuxの知識に乏しいためなかなか手が付けられません。 1.8.7のインストールはネットで調べつつなんとかソースコードから入れました。 一般的にはどのような手段でアップデートするのでしょうか?
654 :
デフォルトの名無しさん :2009/10/07(水) 23:34:49
>>653 このスレ的には Debian にしろって言われると思うが。
> Linuxの知識に乏しいためなかなか手が付けられません。 じゃあ無理だ 諦めろ あとスレ違い
こういう奴は何しにこのスレに張り付いてるんだろうか
>>656 わりと適切だと思うが…
Linux使ったことあるか?
make がなにやってるか理解しないといかんからなー それはこのスレの範囲を超える パッケージがないなら諦めれ
貼りついてるw
もろスレ違いだと思うが。
Ruby公式ページにインストールガイドってリンクあるからみればいいよ
教祖も使っているDebian最強 aptitude install ruby
Linux上で、しかもLinuxに関する知識がないのなら パッケージ管理システム(aptやyum)を使え、としか
この場合Linuxの知識は無関係だろ
666 :
デフォルトの名無しさん :2009/10/08(木) 00:38:00
>>653 package application で source または archive の site を追加…
大抵は package gpg key は初期の物が使える筈…
source package で compile install が出来るので在れば source を拾って来て install.
667 :
デフォルトの名無しさん :2009/10/08(木) 00:50:15
ruby は python を使えれば 使う事ができますか python と ruby の関数で違う物は在るのでしょうか?
フィッシングタイムですか?
>>667 片方が使えるなら、もう片方もさほど苦労しない
gems.rubyforge.orgにgemでアクセスできなくない?
rubyが司る世界において 数字の1が生まれたら、それは数字クラスに所属していて 数字クラスのメソッドにない動きは出来ないってことですか?
Rubyには、オブジェクト(インスタンス)ごとにメソッドを定義できる、 特異メソッドという仕組みがあるので、たいていのクラスでは、イン スタンスごとに振る舞いを変えることができる。 しかしながら、数(Numericおよびサブクラス)にはこれが定義できない ように制限されている。 なお、数インスタンスが生まれた後に、数クラス自体にインスタンスメ ソッドを追加した場合、既存の数インスタンスでも使える。
irb> module One; def one; "one!"; end; end irb> 1.extend(One) TypeError: can't define singleton from (irb):2:in `extend_object' from (irb):2:in `extend' from (irb):2 from :0 irb> "1".extend(One).one "one!" ああ、わかりやすいエラーだ
>>673 一般的にはそう
クラスに定義された動作(メソッド)のみが可能
ただし Ruby はオープンクラスだから、自分でクラスを拡張してメソッドを追加変更することができる
ある人の String クラスにあるメソッドが、 別の人の String クラスにもあるとは限らない
ある人の作った String のインスタンスが、別の人の作った String のインスタンスと全く同じ動作をする保証はない
ただ、組み込みクラスのメソッドやライブラリ標準メソッドの上書きは自己責任なので気にしなくてよい
それと整数クラスは
>>674 の言うように例示にはちょっと不適
M1::C1::C2 というネストしたクラスがあります あるオブジェクトが M1 を「ネスト構造上含んで」いるかどうかを調べたいです 文字列として正規表現で比較するしかありませんか? obj.class.to_s =~ /\AM1::/
>>678 どんな場合にも動作するのは文字列としての比較
Module.nesting が使えることも多いが、特定条件で存在できないモジュールオブジェクトを指定できない
C → Java → Ruby と勉強してきましたが、次の言語は何がいいと思いますか? プログラミングは単なる趣味です。
Haskell
Lisp系列が足りないな
>>680 趣味というなら、マイナー言語でもいいよね。
Rubyとは真逆の、静的な関数言語がいいんじゃないかな。
OCamlかHaskellあたり。どちらも日本語での入門書があるし。
railsで、webアプリを作るのに 必要な知識ってなんですか? ruby rails 正規表現 html,xhtml,xml javascript mysqlなどRDMS apacheなどhttpサーバー こんなもんでしょうか?
>>681-683 サンクス。
OCamlかHaskellあたりがお薦めなんですね。
了解しました。
>>685 どもっす。半年間精進してダメなら諦めます。
rspec 版の testrb コマンドってありませんか?
>>689 1578 examples, 0 failures
っひょー
個人でもちょっと規模大きければこんなもんだろ
俺レベルになるとワンライナーで大企業の基幹システムを作れるようになる
rspec 使ってるとテストはやたら増える
無印のサイトはシェルやワンライナーで作ってる、なんて言ってたけど、 どーりで重いわけだと思ったよ
初心者らしい話題 class CArray < Array end a = CArray.new b = CArray.new c = a + b p c.class #=> Array CArrayを返してほしい。 class CString < String end a = CString.new("aaa") b = CString.new("bbb") c = a + b p c.class #=> String CStringを返してほしい。
CArray というクラス名に吐いた class CArray < Array def +(v); self.class.new(super(v)); end end
a[0..1]みたいなのはちゃんと元のクラスにやってくれるんだよね
Array や String の(Cで記述した) + メソッドの定義の中で Array.new や String.new がハードコーディングされてるんだろうな 何らかのシステム的理由があるか、いまさら変更できないか、どっちかだろう まあ、バグっちゃバグかもしれん
>>698 むしろそっちのほうの挙動が不思議
Stringクラスの実装はCStringを知らないはずなのに、
どうしてCStringオブジェクトを返せるんだ?
インスタンスがあればクラスわかるから返せるにきまっとるわい
superのnew呼び出しでself.class.newってやるのきもくね?
継承を前提としたクラスならってところ 組み込みでいえばIOとかNumericあたり というか、otherと絡むときにわざと基本クラス返してる気がするなぁ
レヴェルの低いインターネッツだな
組み込みのくみこちゃんをdisるのはやめろ
>>703 あらゆるクラスは継承で動作可能「でなければならない」
継承したとたん動作しなくなるライブラリはプギャー
それぞれArrayを継承したFooとBarがあったとして foo + bar がどのクラスを返すべきかとか考えると
>>703 の言うようにわざと基本クラスを返すのはありなんじゃないかと思う
>>707 > foo + bar がどのクラスを返すべきか
変換っぽいメソッドでない限り、通常はレシーバのクラスを返すべき
つまり、foo のクラスを返すべき
このパッチをあててリビルドすればOK --- a/array.c +++ b/array.c @@ -2657,12 +2657,14 @@ rb_ary_fill(int argc, VALUE *argv, VALUE ary) VALUE rb_ary_plus(VALUE x, VALUE y) { + VALUE klass; VALUE z; long len; y = to_ary(y); len = RARRAY_LEN(x) + RARRAY_LEN(y); - z = rb_ary_new2(len); + klass = rb_obj_class(x); + z = ary_new(klass, len); MEMCPY(RARRAY_PTR(z), RARRAY_PTR(x), VALUE, RARRAY_LEN(x));
本当にそのほうがいいと思うなら、 redmine.ruby-lang.orgにfeature request投げとけば。 個人的には、両方のクラスが同じときだけにすべきじゃないかと思うが。 あと2chに初出のコードは著作権的に取り込むのは危険なんじゃなかったっけ。
>>710 危険というか取り込み不可能
というか別にそんなことを意図したコードでもあるまい
お前空気読めないと周りから言われるか全く何も言われないかどっちかだろ
無理矢理ねじ込んだ感バリバリの3行目に ドカタのストレスを見た。
言われるか言われないかのどっちかワロタ
質問です;; mvcモデルをつくりたいのですが、下記エラーが出て削除機能が使えません undefined method `destroy' destroyが使えない?? newもfindも使えるのに・・ 解決法知ってる方いたら教えてください
MVCと直接関係ない質問に見えるけど何の話?
要するにdestroyメソッドを使う方法がわからないです
destroyメソッドってなに?
すいませんここはrailsは対象外なんですかね・・ 他当たってみます
undefined method `destroy'の後が重要だったりするんだよな
722 :
714 :2009/10/11(日) 01:00:33
>>721 何か知ってる事あったら教えてもらえますか?
うざ
PStore.dump してファイルに保存済みのデータがあったとし a = nil PStore.new(...).transaction do |c| a = c[:data] # Array や Hash がネストしたデータ(shallow copy では完全にコピーできない) end x = a[...][...].XXX[...] というように PStore.transaction の外で読み込んだデータ を使っても問題ないものなのでしょうか。 内部的には Marshal.load しているということなので、問題 ないような気もするのですが、ドキュメントの記述を見ると そういう使い方していないようなかんじなので…。
Marshal.dump は唯一、標準ライブラリで深いコピーを行う
726 :
724 :2009/10/11(日) 12:16:24
なるほど
>>725 さん
PStore が Marshal 上に実装されているという前提が変わらない限りは
PStore#transaction の外にデータを持ち出しても問題ないわけですか
これまで無駄に transaction の内部にコード入れていたので書き直そう…。
>>724 PStore#transactionは、
* 同じデータファイルに対する他のPStoreアクセスを禁止している
(読んでる間に書き換えられないように)
* ブロック処理がabortされなければ、変更の再ダンプを行う。
という感じの仕事をしている。
中で読んだデータはそのままメモリにある。ブロックを出たあと、
誰かがデータファイルを書き換えたとき、それとメモリが一致しな
いということを認識した上でなら問題ない。
728 :
724 :2009/10/11(日) 12:43:24
まさにそのあたりが気になっていた(transaction 抜けたら参照している
データがメモリ上から消えちゃう可能性があるのかなあ、とか)のです、
明快な説明どうもありがとうございました
>>727 さん
きちんとトランザクションって書いてあるだろ トランザクション抜けたからって取得データ本体が消えるなんてことはそもそも …実装としてありそうな気もするな トランザクション有効中に明示的に複製してクダサーイというのはアリではある んで、PStore#transaction は普通は File.open のようにブロック範囲を限定して使う データを取得または保存する瞬間にだけ、トランザクションに入る 何らかの理由で複数回アクセスしたいという場合は、PStore.new のオブジェクト自身を変数で保持する なお、 PStore は、実装の都合上「ファイル全体を最初から最後まで必ず読み込む」ので注意 変更部分に対応したファイルの一部分だけを書き換えるとか、そういう細やかな小細工は通用しない データの大きさと更新頻度によっては複数に分けたほうが負荷的にお得
WinでAutoHotKeyの代わりに使える機能を完備してあるライブラリってない?
繰り返し処理で正規表現を使う場合 a.each do |b| print "match" if c =~ /hoge/ end よりも reg = Regexp.new("/hoge") a.each do |b| print "match" if c =~ reg end の方がいいでしょうか?
そういうのは正規表現の中に変数を含む場合です
変数を #{} などで含まない「固定」の正規表現は1回しか生成されない 1.upto(10000).each do /h/ =~ "hoge" end でも re = /h/ 1.upto(10000).each do re =~ "hoge" end でも、Regexp のインスタンス生成は1回だけ つまり、処理速度や負荷的には実質どちらでも構わないし、 厳密にはブロックの外の変数を参照するコストのぶんだけ後者が遅い
735 :
724 :2009/10/11(日) 22:15:19
RDBを使うほどでもないけどちょっと中間データをファイルとして永続化して
おきたい(けどCSVファイルなんかは表現力が弱いので嫌な)ときに、素で
Marshal.dump/load するより楽なので PStore を使っていたのですが
PStore#transaction でデータ処理全体をブロックする必要があるのかないの
か「実装としてありそうな気もする」ので気になっていたので、たいへん勉強
になりました、どうもありがとうございます
>>729 さん
736 :
デフォルトの名無しさん :2009/10/12(月) 19:03:31
rand()の範囲を指定したいのですが 10から20の間の数をランダムに発生させたいというばあい rand(10-20)とか直接与えることは出来ますか?
0から10の範囲の乱数を発生させて10を加える。
俺俺ライブラリに class Range def rand Kernel.rand(last-first+1)+first end end ってやっといて (10..20).rand するとか 標準じゃ無理
(10..20).to_a.sort_by{rand}.first
>>740 短いのですがどうもちゃんと動作しないようです。
(1..2**30).to_a.sort_by{rand}.first
としましたが、結果がかえってこないのであきらめました。
>>741 そりゃ単に重すぎるだけだ
要素数が2**30の配列を作ってるんだから
そこまで大きな数を扱うのなら、小手先なしでrandした方がいいよ
だから
>>737 以外は実用妥当な乱数にならねえって
スレタイ100回読んで半年ROMっとけ
乱数発生部は組み込みに任すのが完全に正しい姿だな 累乗とか使って結果的に偏らせるのも成長段階には必要という説もあるが
最近/.並にゴミで埋まるようになってきたなここ。
こういうありきたりなループの終了条件に !=を使うのは普通ですか? count = 1 end_count = 10 while count != end_count puts count count = count + 1 end
へん
(1...10).each {|i| puts i} じゃだめなん?
count が増えるとは限らないのだろ loop do break if count == end_count ... end せめて break して欲しい
>>752 何でbreakの方を推すの? 横から見てもいまいちわからん
普通ここは、読みやすいuntilを推す流れじゃないかと思うんだけど
あまり使わないんですね。 気をつけます。ありがとうございます。
あまり使わないのか? 場合によりけりで特に使う使わないを気にする記述でもないと思うんだけど
>>740 単に非効率なやり方だろ
他人に教えるようなものじゃない
C++のSTLのイテレータに慣れてるとそう書きたくなるな。
読みやすい until などというものは存在しない と思う
unless hoge.empty? とか良く書くけどな。 while not より直接的だと思うんだが。
ブロックを考えなければならない until は unless の比ではない
全体を括って否定するならuntilだな 複雑な条件を書こうとするとぶっちゃけどっちでも良くなるが
否定条件部に ( ) を使うくらいなら while で書いて欲しい
whileの条件ですが、いまのところ!=でやっています。 いずれ別の方法を覚えようと思います。 質問です h = [] i = 1 while i != 3 h.push(i) puts h i = i + 1 end の出力結果が 1 1 2 となるのはなぜですか? 1 2 となると思って本人は書いています。
すみません、気づきました。 配列表示させてるからですね もうしわけありませんでした・・・
イインダヨ
>>749 while state != :default
お題がこういうのならuntilだのbreakだのはわかるけど
「ありきたりな(カウントの)ループ」だろ?これでいいじゃん
while count < end_count
for (i = 0; i != l; i++)
とか見かけないし
Accelareted C++でそんなループが出てきたなあ
Windows XPでExcelを操作する際、 Excelが1つだけ起動しているときはwin32oleを使って WIN32OLE.connect('ExcelApplication') でうまくいくんですが 複数起動しているとどれかひとつしか操作できません。 どうすれば複数のExcelを操作できるでしょうか?
>>769 そっちに行ってみましたが…過疎ってますね
配列のサイズとかってキャッシュされてる? 利用中は変動しない配列に対して arr.size を毎回行うのと、 最初に arr_size = arr.size として変数格納値を使うのと どっちが好ましいもんかね
確かRubyの配列って、C言語レベルでサイズを記録してるんじゃなかったっけ そうだとすれば無視できる程度のコストでしかない
>>771 されてる
配列の要素数が変動するときにサイズ変数を書き換えてる
Array#size が呼ばれるたびに内部 each でカウントしてるとかそういうことは流石にない
1.9のソースを見た。 配列サイズは、フラグの空き領域に入ってる場合と構造体のフィールド に入ってる場合がある。どちらを返すか判断したりフラグ領域から取り 出すための演算(ビットANDとかシフトとか)がある。 include/ruby/ruby.h の RARRAY_LEN マクロ。
Hash#keys なんかは毎回生成するよね
>>775 「生成して返す」とマニュアルに書いてあるものは毎回生成する(と、読み手は判断する)
マニュアルの言葉遣いは慎重にしたほうがええな
>>771 >配列のサイズとかってキャッシュされてる?
>利用中は変動しない配列に対して arr.size を毎回行うのと、
>最初に arr_size = arr.size として変数格納値を使うのと
>どっちが好ましいもんかね
キャッシュされるというか
>>772 に書いてある通りだけど、
arr.size の場合はメソッド呼び出しのコストがあるのでローカル変数に代入しておいたほうが速いっちゃあ速い。
ただその違いはわずかなので、全体のスピードに影響を与えるほどではないと思う。
>>773 > Array#size が呼ばれるたびに内部 each でカウントしてるとかそういうことは流石にない
そうか、そういう可能性もあるのだな
中身がリンクトリストで、そういう可能性があるなら、それらしい名前が 普通付いてるものではないかと。
いやそれらしいも何も機能的にほぼ確実に size または length という名前がつくと思うんだが
10.function() こんな風にfunction定義して使えるようにする方法ない?
class Integer def dbl self*2 end end p 10.dbl #==> 20
標準ライブラリのクラスに手を加えるのは正直あんまお勧めしない
あったんだねっ Rubyすげ・・・ ありがとうっ
>>783 mjd? 今ちょうどWEBrickイジって簡易blogサーバを作ろうとしてるんだが……。。
>>785 IntegerやStringやArrayと、WEBrickじゃだいぶ事情が違うぞ。
>>783 は、たぶん、標準ライブラリというより、組み込みクラスに、
と言いたかったんじゃないだろうか。
自分ひとりでやる分にはいいんじゃねーの 複数人で開発したり、いずれ引き継ぐんなら慎重であるべきだけど。
WEBrickのクラスはいじる必要がないような 継承でなんとかならない?
789 :
デフォルトの名無しさん :2009/10/16(金) 04:04:42
大変申し訳ございません、質問です。 mysqlのデータを単純にcontrollerでfindで取り出してviewで表示させようとしています。 しかしブラウザでの表示が文字化けならいざ知れず、「#」になってしまいます。 具体的にページのソースを見てみるとその部分は、 #<Book:0x24319ec> となっています(Bookテーブルのものを取り出して表示しようとしています)。 途中までは正常に取り出せているようなのですが、表示のところでこうなってしまって大変困っています。 macosxでMAMPを入れ、いざ開発をしようと決めたところでこのエラーです。 railsのバージョンは2.3.4です。 誰か解決策をご存知の方ご教授おねがいします。よろしくお願いします。
>>1 より抜粋
> Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
>>789 えーと、コントローラで
@book = Book.find(params[:id])
とかやって、ビューで
<%=h @book%>
とかしてるだけでしょうか。
もしそうなら、そんなん表示されなくて当たり前としか。
どんな入門書を読んでいるのか知らないけど、
<%=h @book.title %>
<%=h @book.author %>
のようにしないといけないのでは?
792 :
デフォルトの名無しさん :2009/10/16(金) 05:41:07
>>791 ありがとうございます。
はい、もちろんその通りにはやってはいるんですが、やはり色々試しても
「#」としか表示されません。
ビュー内で<%= p @book.title>としてターミナルで見たところ、
[#<Book id: 1, title: "hoge">]
という風にオブジェクトはわたってはいるような気はするのですが、表示されないのが良く分かりません。
>>790 見落としていました。すいません。そちらで質問し直します。ご指摘ありがとうございました。
メソッドチェーンをさせたいならコンテナクラスを作るほうがいいよね あるメソッドが 10 を返すからメソッドチェーンのために Integer にメソッドを作るんじゃなく
そのへんは他人から言われても絶対わからん 気にせずどんどんクラスとメソッド作りまくれ そのうち加減がわかるからさ
>>792 <%= p @book.title> じゃだめだろ。
せめて <%=h @book.title.inspect %>
つうか、
>その通りにはやってはいる
というのは勘違いだろうな。本人はそのつもりかもしれんが。
まずは ビューの該当箇所のソースをさらせ
796 :
デフォルトの名無しさん :2009/10/16(金) 07:15:27
xxxx [23345] yyyyyyyyyyalksdlfaksjdlf oaisdoi[332] asdlkfjasldkjfaslkdj aslkdjf[1111] aodsfasdjflaksjd みたいなファイルから、数字だけを抜き出そうとして、 while line = gets if /[(\d+)]/ =~ line p $1 end end とやったのですが、nilだけしか表示されませんでした。間違ってるでしょうか?
>>796 '[' と ']' にもバックスラッシュが必要
while line = gets
p $1 if line =~ /¥[(¥d+)¥]/
end
[ ]は正規表現で特殊な意味を持つのでエスケープしなければならない そして都合の悪いことに、その特殊な意味のほうで正規表現に当てはまってしまってる
どうでもいいことなんだけど \を¥にわざわざ置き換える人がいるのは何故なんだ
>>799 人じゃなくてブラウザだかOSだかが勝手に変換してるんじゃなかったか
backslash を書いたのに yen sign に変換するのはWebKit(Safariとか)の コード変換テーブルの仕業だったと思う。
PC初心者スレかと思った
MacはPCではありません
RubyでMySQLに接続しようとしています。 その際、SSHトンネルを介しての接続を行いたいと思っています。 その際、通常のRuby/MySQLやMySQL/Rubyといったらライブラリでできるでしょうか。 サンプルが載っているサイト等教えていただければと思います。 よろしくお願いします。
複数のhtmlファイルを読み込ませたいんですけど、 1.htmlから100.htmlまでをまとめて読み込ませるにはどうすればいいですか?
単に、フォワードで使うように設定したポートを指定して connectするだけじゃないの?
>>807 `zsh -c 'cat <1-100>.html'`
とか
1.upto(100).map {|i| File.read("#{i}.html") }.join
とか出てこない場合は地道にループ組もうぜ。
>>807 1つひとつ読むしかないと思う。
contents = (1..100).collect {|i| File.read("#{i}.html") }
str = contents.join
p str
811 :
792 :2009/10/16(金) 13:19:30
>>795 該当ソースは、
コントローラ
class SayController < ApplicationController
def hello
@n=Book.find(:all)
end
end
ビュー
<html>
<head></head>
<body>
本の名前は
<% for n in @n%>
<%= n.titile %>
<% end %>
</body>
</html>
テーブル名 はbooksで、
id:1
title:hoge
というごくシンプルなものです。
やはり色々試してもブラウザには「♯」か配列構造のものしかでません。
ちなみに今さっきカラム名を違うものにして該当箇所を変更してみると上手くいきました。
戻すとできないので、まだ原因はわかりません。
解決はしてないから悔しいですが、ひとまず安心です。色々ありがとうございました。
>>811 ><%= n.titile %>
タイプミス。<%= n.title %> にしろ。あと h をつけろ。
それから <%=h n.title.inspect %> の結果はどうなった。
あーあと @n なんていう名前を使うな。@books にしろ。
Rubyのメソッドになんらかの属性を持たせたいんですけど、うまい方法ってありませんか。 ちょうどJavaのアノテーションみたいな感じが望ましいんですが。 route '/user/:id' # アノテーション access :public # アノテーション def show @user = User.find(params[:id]) end
うむ
次の方どうぞ
818 :
807 :2009/10/16(金) 15:07:00
RDEでF5押した後フォーカスがコンソールウィンドウにいっちゃうんだけど いかないようにはできない?
あ、ツール設定からいけました すみません
何年かくらいしたらなんとかなりそうな気もするが現行では無理筋だな、アノテーション
RubyにC言語のようなプリプロセッサはありませんか? endを別の文字にできたらいいなぁと
>>822 原理的には、たとえば
require 'ripper'
print Ripper.tokenize(File.read(src)).map {|tok| tok == 'ZZZ' ? 'end' : tok }.join
で、ZZZ というトークンを end に置き換えたスクリプトを吐く。
ripperが付属するようになるのは1.9系からだったかな?
>>822 ねっす
おまけに非推奨
私たちにとって end は文字列ではなく、ちょっと横に長い視認性のよい記号
Ruby厨きめぇ
ブロック終端として色づけされるからどうでもよくなってる感じはする
コマンドラインオプションでプリプロセッサ有効にして#ifdefしたい時はあるな
endを自動で補完したうえで畳み込みして隠してくれるエディタがあったら いやなんでもない
>>828 Emacs
それはそうとプログラミングでは畳み込みって意外と不便でござる
>>814 routeとshowの関係がわからないのでaccessだけ実装してみた
汎用性とかは考えてない
module Annotation
def access(type) ; @access = type ; end
def method_added(name)
if @access
send(@access,name)
@access = nil
end
end
end
class Hoge
extend Annotation
access :public
def show
:
831 :
デフォルトの名無しさん :2009/10/16(金) 22:13:05
pdftotextを使いpdfファイルをtxt形式に変換してプログラムから開き、全角数字(4,714,695など)をsplit(//)メソッドを使い一文字ずつに分解しようとしたのですが、 何故か大文字のアルファベットの羅列(V C O U P C Q R Wなど)に分解されています。何故こうなってしまうのでしょうか。 また、どうすれば全角数字を一文字ずつに分解することが出来ますか? pdfの仕様なのか何なのかさっぱり分からなくて困っています。よろしくお願いします。 全角数字を一文字ずつに分解した後半角数字に変換して、数式の中で使えるようにしたいと考このような処理をしました。
実際にどういう記述をしたかを一切書かないのは 宇宙の言葉はテレパシーだからですか テテテテテテテテテレッパシーですか
833 :
792 :2009/10/16(金) 23:42:20
>>812 ,813
inspectしたところ、ブラウザでの表示は以下のようになりました。
本の名前は [#, #] [#, #]
名前についてはわかりました。もっと考えてつけます。
カラム名変えて、これからがんばって勉強していきたいと思います。
いろいろとご指摘、本当にありがとうございました。
あなたが全角数字だと思い込んでいるものは、実際には全角大文字のアルファベットです。
>>830 なにこれすごい
method_addedとかそんなトリガーがあったのか
ちょーさんくす
やめといたほうがいいと思うぞ
837 :
sage :2009/10/17(土) 07:06:51
to_iメソッドが働いていない気がするのですが。。 a = "4173" a.to_i puts a.class ⇒ String puts "4173".to_i.class ⇒Fixnum なんで上のコードだとFixnumにならないのでしょうか。教えてくださいm(_ _)m
a.to_i # a.to_i を評価してその結果を捨てる なので a = "4173" b = a.to_i p b.class
839 :
sage :2009/10/17(土) 07:14:39
>>評価してその結果を捨てる おお、普通に使っていて気がつきませんでした。有難うございました。
>>837 ・ 変数はオブジェクトにつけたラベルである
・ オブジェクトは内部状態を変更することはできるが、所属クラスを関係のないものに変更することはできない
ので、「aというハコに入れておいたオブジェクトを別のオブジェクトに変換する」という考え方は無理
「あるオブジェクトを別のオブジェクトに変換して、変換後のオブジェクトに新たに(同名の)変数のラベルをつける」
ということしかできない
>>840 irb(main):003:0> a = "abc\n"
=> "abc\n"
irb(main):004:0> a.chomp!
=> "abc"
irb(main):005:0> a
=> "abc"
>>841 irb> a = "abc\n"
irb> a.object_id
-605849488
irb> a.chomp!
irb> a.object_id
-605849488
桁区切りのカンマってputsとかで表示させる改行として扱われるんですかね?
いいえ ただし、引数列挙のカンマは、 puts は引数ごとに改行をはさんで表示するので結果的に改行になる puts('a', 'b', 'c') a b c 説明用のカッコ省略した一般的記法 puts 'a', 'b', 'c' a b c to_s されることを期待して紛らわしく書くとこうなる puts 12,345,678 12 345 678
よく見ると引数列挙になってる。。有難うございました。
そういえば、1_234_567 とか 0x12_45_56_78 いう書き方が出来るのを思い出したわ。
一瞬リテラルに 12,345,678 があるのかと思って焦った
リテラル? 何それ
四大天使の名前
ラリッテル
渋谷署に任意同行だな。
オブジェクトが自分自身を表すthisは、rubyではないのでしょうか?
smalltalk流のself
これの解説がないって厳しいなあ その本なりサイトなりさくっと晒せ
配列中に、重複がない整数が昇順に並んでいるとき、 連続する整数を - でつないで表示じするにはどうしたらよいでしょう? 具体的には 1,3,4,5,7,8 とあったとき 1,3-5,7-8 と表示したいです。
>>856 そのように記述しろ
そのような奇術はない
まあ
>>857 でFAなのだが
とりあえず先頭から調べていくしかないねえ
配列からの取得はArray#shiftが使えるかも
次の整数かどうかはInteger#succがたぶん役に立つ
arr = [1,3,4,5,7,8] res = Array.new start = nil while e = arr.shift do case when e.succ == arr.first && start.nil? then start = e when start then res << "#{start}-#{e}"; start = nil else res << e end end puts res.join(',')
>>859 7行目、thenと&&の位置が反対だよね?
×when e.succ == arr.first && start.nil? then start = e
○when e.succ == arr.first then start.nil? && start = e
# 連続した、隣との差が1であるものでグループを作る。 arr1 = arr.reduce([]) {|r, e| r.empty? || e - r[-1][-1] > 1 ? r << [e] : r[-1] << e; r } #=> [[1], [3,4,5], [7,8]] # グループごとに、先頭と末尾を-で繋ぐ。 arr2 = arr1.map {|e| e.size == 1 ? e[0] : "#{e[0]}-#{e[-1]}" } #=> [1, "3-5", "7-8"] # 最後に,で繋ぐ。 arr2.join(',') #=> "1,3-5,7-8"
arr=[1,3,4,5,7,8] arr1=[[arr.first]] arr.each_cons(2){|n|n[1]==n[0].succ ? arr1.last << n[1] : arr1 << [n[1]]} #arr1=> [[1], [3,4,5], [7,8]] 少し分かりやすいかも
WEBrickのパフォーマンスを少しでも上げたいんだが、 事前にバイトコードに変換できる実装ってExerbとJRubyだけですか? YARVってAOTコンパイラついてなかったっけか
>>865 exerbはバイトコードにはしないよ。
>>865 速さを求めるならWEBRickじゃなくてMongrelやThin使えば。
WEBRick が遅いという場合、半分はコードの書き方が悪い もう半分は WEBRick というか pure Ruby の限界なので、素直に C 拡張を頼れ
>>863 Ruby の AA && BB は 「AA の処理結果が真である場合にのみ BB を実行しその結果を返す」という処理だ
つまり if AA then BB end と全く同じ(結合度が違うが)
よって
when e.succ == arr.first && start.nil? then start = e
when e.succ == arr.first then start.nil? && start = e
どちらも結果的に全く同一に動作する
コードとしての意図がどうであるかのみが問題になるわけで、
「根本条件が真でなおかつフラグが空であるならフラグを入れる」というのは
これはこれで条件をまとめた記述で普通だと思うがどう
>>870 >>859 のコードを実行すると、質問者所望の結果が得られないから、
>>860 の指摘をしました。
>>860 の修正をすると、質問者が意図した結果が得られています。
※Ruby 1.8.6、Windows XPで確認
>>871 1.8.7だと問題無いな。なんでだろ?
>>870 elseのないif文ならその通りなんだけどcase文だからなあ
if flag1 && flag2
exec
else
exec
end
if flag1
exec if flag2
else
exec
end
この二つの違い
前者は必ずexecされる、後者はflag1 = true; flag2 = false;でexecされない
>>871 「正しい結果が得られる」も大事だけど、なぜそうなるかを説明できなきゃ単なる黒魔術だ
>>872 ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]
1,3-4,5,7-8
A def to_s() p "test" end end a = A.new puts a #ここでto_sがよばれてる こんなコードを見つけたんだけど これを↓みたいに自分で名前つけて呼ばせる事はできない? class A def to_s2() p "test" end end def puts2(*n) end a = A.new puts2 a #ここでto_s2を呼ばせたい
こういうこと? def puts2(*n) puts n.map {|o| o.to_s2} end
Object#inspect
>>875 それだと
to_s2が定義されないときエラーになっちゃうんだ
putsの時はto_sがないときは処理されなくてあったら処理されてるっていう感じで
>>876 ぐぐってみたらよくわからない用語たちがが・・・
少し調べてみます
いけたっ ありがとうございます def puts2(*n) begin puts n.map {|o| o.to_s2} rescue NameError end end
>to_s2が定義されないときエラーになっちゃう class Object def to_s2 to_s end end とかしてもいい。
"123456789123"という文字列から1が何個あるかを調べたくて かいてみたんだけど動かない どこがダメなんでしょ? m = "123456789123".match( /1/ ) p m.length
matchでなくscan
scan
p "123456789123".count("1")
>>880 マニュアルくらい一回は読め
読んでもわからん、でもいいから、一回は読め
MatchData の length(size) は
> 部分文字列の数を返します
ということで、 ( ) で括った部分の数を返す
match を使いたいのならこう
m = "123456789123".match( /(1)/ )
count でいいじゃん。
886 :
880 :2009/10/18(日) 16:17:38
ありがとう 色々手段があるんだね ぐぐって調べたところmatchしか見つかんなかった マニュアル次から読むようにしますね count使わせてもらいます てかカッコが必要だったとは・・・ 正規表現よくわからん
配列の各要素とそのインデックスを関連付けるハッシュをつくるとき、Perlでは以下のように しますが、 my @arr = qw(a b c d); my %hash; @hash{@arr} = 0..$#arr; Rubyではどのようにするのでしょうか? arr = %w(a b c d) hash = ???? p hash #=> {'a'=>0, 'b'=>1, 'c'=>2, 'd'=>3}
残念ながら、うまい方法はない irb> p Hash[arr.zip((0..arr.size).to_a)] {"a"=>0, "b"=>1, "c"=>2, "d"=>3} こんなもん
>>888 d
多分、Rubyのバージョンが古いせいだと思いますが、エラーが出ました。
in `[]': odd number of arguments for Hash (ArgumentError)
当方のRubyのバージョンは、以下です。
ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-mswin32]
以下の修正で意図した結果が得られました。
hash = Hash[*arr.zip((0..arr.size).to_a).flatten]
ああ、1.8.7 は
>>888 でも動くのか
厄介な修正だのう
マイナーバージョン間で非互換なんですねわかります
1.8.6 の記述が 1.8.7 で動作しないんじゃないんだから別にいいだろ 1.8.7 での記述が 1.8.6 で動作しないというのはそれなりにフツーだろう
>>889 ruby 1.8.6、1.9.0両方で動かすなら
h = {}
arr.each_index{|i|h[i] = arr[i]}
いや、1.9.0はもう終了してるから それにキーと値が逆 h = {} arr.each_with_index{|e, i|h[e] = i}
いや h = Hash[*arr.zip((0..arr.size).to_a).flatten] のほうは 1.8.7 でも 1.9.0 でもきちんと動作するから
ルビー厨wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
require 'enumerator'
p Hash[*arr.enum_for(:each_with_index).to_a.flatten]
# => {"a"=>0, "b"=>1, "c"=>2, "d"=>3}
とか
h = Hash.new{|t, k| t[k] = arr.index(k) }
p [h["a"], h["b"], h["c"], h["d"]]
# => [0, 1, 2, 3]
とか
だがしかしお薦めは
>>894
>>887 のへんてこな感じを考慮すると
配列サイズの Range を to_a して zip するのが一番近い答のような気もちらっとせんでもない
1.9だと p arr.each.with_index.with_object({}){|(e, i), memo| memo[e] = i } #=> {"a"=>0, "b"=>1, "c"=>2, "d"=>3} で済むんだけどなぁ
>>887 Perlではハッシュの複数の要素に対して一度に代入できるのか。すごいけど、どれくらい使用頻度があるのやら。
Rubyには直接該当する機能はないから、
>>894 をEnumerableに定義するのがいいと思う。
module Enumerable
def indexing
h = {}
self.each_with_index {|x, i| h[x] = i }
h
end
end
p %w(a b c d).indexing #=> {"a"=>0, "b"=>1, "c"=>2, "d"=>3}
>>900 Hash→Array はありだと思うが、Array→Hash は変だと思う
1行で書くなら、1.9 のこれが多分一番素直
Hash[arr.each_with_index.map{|e,i| [e,i]}]
2行でいいなら
>>894 だが
需要的にはわかるけどね つまりは逆引きだし、Array#indexを多用するケースには使えそう h = indexing(arr) p arr[0] #=> a p h["a"] #=> 0 Perlの動作は知らないけど、indexingの名前を付けるなら Array#indexとの対称性を考えて重複時は上書き無しにしとくといいかも self.each_with_index {|x, i| h[x] ||= i }
Perlだとラクダ本にも載ってないっけ?リストを併用する方法 向こうだと結構使われるのかも知れない
RubyでCのインクルードみたいな命令ってないんですか? requireってちょっと違うような・・・
つ include
loadじゃね
>>905 どういう動作をさせたいのかが判らんと何とも言えんが
基本的にはrequireで、用途によってはload
Cに例えるなら…
requireはインクルードガード付きの#include、
loadはインクルードガード無しの#includeに近いかな?
load だな ただし、ローカル変数は読み込めない ローカル変数利用部を「切り出した」場合は文字列として eval する ファイルに信頼できない何が書いてあっても Ruby スクリプトとして実行するのでセキュリティに注意
>>909 あーやっぱ変数ってダメなんですか・・
やりたいことは、
スクリプトの上のほうに
変数宣言がいっぱい増えてきたから
それを他のファイルにまとめて
load "hensuu"
とかしたかったです
だからさっさと -cpp オプションつけろと言っているのに…
>>910 気にするな
慣れろ
というか読みにくくてイライラするからいちいちンなことすんな
スクリプト(またはクラス定義、または def initialize)の上部に変数定義が大量にあるのは Ruby では普通
クラス作ってるなら Hoge::Configure モジュールにして include したりするというような手もなくもないが
頭でっかちに見えるというのはわからなくもないんだよなあ 本当に全部他の場所にあるのなら、それはそれでわかりやすいと思う なんかかっちょええ解決策とかないもんかね
変数定義だけで30行、みたいな時には class Hoge include Hoge::Configure def initialize(params) set_init_vars set_param_to_vars(params) end end class Hoge module Configure def set_init_vars @foo = ... @bar = ... end end end というのはやったことがある めっちゃ自己満足だった
複数ファイルにする規模でトップレベルにローカル変数が大量っていうのもどうかと思うけど グローバル変数の親戚みたいな状態になっていそう
Ruby/GTK2で作成したウィンドウの上でマウスが動いた座標を毎秒テキストログに出力するためにはどうすればいいですか? そのようなクラスやインスタンスも見当たらないのですが・・・.
「ウィンドウの上でマウスが動いた座標を毎秒テキストログに出力するメソッド」とかそういうのを探してそうで怖い マウスの座標を取得するクラスとメソッドはあるだろ 毎秒何かをさせるメソッドってのもあるだろ 結果をファイルに書き出すメソッドってのもあるだろ それ組み合わせればいけんじゃね
918 :
916 :2009/10/20(火) 15:49:33
>>917 さすがに一行めのメソッドは探していません^^;
3行から5行までのメソッドを探すときにどのように探せばいいでしょうか?
ruby-gnome2のサイトをみていっているのですがわかりません.
>>911 興味があったら、perlrun(1) で -P オプションの説明を見てくるといい。
Gdk::Window#pointer Obtains the current pointer position and modifier state. The position is given in coordinates relative to window. Returns: [window, x, y, mask] Gtk::Windowから実装に使われているGdk::Windowにアクセス できるのかどうかは知らん。
#!/usr/bin/ruby require 'gtk2' window = Gtk::Window.new window.signal_connect("destroy") do Gtk.main_quit end window.signal_connect("motion-notify-event") do |w, e| puts "#{e.x}, #{e.y}" end window.add_events(Gdk::Event::POINTER_MOTION_MASK) window.show_all Gtk.main
ルビー厨wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
924 :
916 :2009/10/20(火) 17:26:55
>>920-921 ありがとうございます.
signal_connectやadd_eventsやらを調べてやってみます!
>>910 >やりたいことは、
>スクリプトの上のほうに
>変数宣言がいっぱい増えてきたから
>それを他のファイルにまとめて
>load "hensuu"
>とかしたかったです
なんかPerlやPHPでのやり方だね。
Rubyではローカル変数のスコープはそのファイルに限定されてしまうので、
どうしても他のファイルに分けたかったら、ローカル変数じゃなくて
グローバル変数やインスタンス変数にするしかなさそう。
つうかさ、変数がたくさんあるんだったら、たぶんグループ分けできるから、
それごとにクラスを定義してそこにインスタンス変数をつくったほうがいいんじゃないかな。
どんなスクリプトかにもよるな とりあえず最初は意義とか意味とか考えず形式的にクラス作っていいぞ
定数なら引き継げるけど、定数にしたら駄目なの?
何が悲しくて定数使わなきゃならんのだ というか定数に変数持たせるくらいならクラス定義使え あまり認識されてない上に説明しづらい事実だが インスタンス変数はトップレベルでも普通に使える @foo = 'YES!' def disp_foo puts @foo end disp_foo
もしかして本当に
>>910 の役に立つのは
定数なんじゃないかと思わなくもない
どっちにしても、情報が少なすぎて何とも言えん
win32apiクラスで例えばこのスレに書き込みとか出来るのかな?
>>930 WinInet を呼べばできるはず
普通は Ruby に任せるが
Ruby でできることをわざわざ API でやる理由はないからな
CentOSにruby1.9をインストールしたいのですが、yumを調べるとパッケージは1.8.7までしか無いようです。 1.9を入れるにはcheckinstallなどを使ってソースから入れるしか方法は無いのでしょうか?
教祖も使っているDebian
>>932 パッケージが無いのならYES
パッケージを自作してもいい
>>932 /etc/yum.repos.d/CentOS-Base.repo
[extras]
[centosplus]
WEBrickのハンドラって Java Servletみたいにあらかじめインスタンス化されないの? CGIみたいに毎回呼び出すんじゃあ、CPU負荷がかかって当然のような……
mod_phpもそういうもんだったはずだけど、少なくとも2年前は むしろ毎回コード読み直すからより条件が悪い つーか生成コストが問題になるのは設計の問題じゃねーの ハンドラは単なるブリッジで十分なんだぞ? オブジェクト生成そのものはMRI全体の動作速度に直結するから大したコストにならんようできてるだろ
940 :
932 :2009/10/22(木) 02:44:53
>>933 >>935 >>936 遅くなりましたが、ありがとうございます。
指摘頂いたDebianを調べてみましたが、rubyに限らずパッケージ管理全般が簡単になりそうなので思い切ってDebianに切り替えてみようと思います。
パッケージの自作も勉強になるかな、とも思いましたがCentOSを使い続けてこの先もパッケージ管理に悩まされれるのはやっぱり面倒くさい。。
初心者はfedora系にしとけ
944 :
943 :2009/10/22(木) 06:30:45
結局手持ちのVC++2005で試したのですが、 > fatal error C1189: #error : MSC version unmatch と言われてしまいました。該当箇所のファイル(ruby/lib/ruby/1.8/i386-mswin32/config.h)を見た所 #if _MSC_VER != 1200 #error MSC version unmatch #endif が原因だと思うのですが、これってVC6が必要ということでしょうか? VC6て今でも手に入るのでしょうか・・・VC++Toolkit 2003みたいに配布されていればいいのに・・・
>>945 >make が必要なだけにも見える
makeが必要なだけなのにCコンパイラがエラーを出すわけないでしょ。
win32oleの質問です。 VBAで ActiveDocument.SaveAs "¥¥foo.htm", FileFormat:=wdFormatHTML に相当するのをrubyで書きたいのですが、「wdFormatHTML」という部分の指定方法が分からず困っています。 文字列で指定してみましたが、エラーになりました。 試したコードはこちら。 require 'win32ole' msword = WIN32OLE.new('Word.Application') msword.visible = true doc = msword.documents.open('¥¥foo.doc') msword.activeDocument.saveAs('¥¥foo.htmm', 'wdFormatHTML') #msword.activeDocument.saveAs('¥¥foo.htmm', 'FileFormat'=>'wdFormatHTML') 実行結果(エラー)はこちら。 foo.rb:5:in `method_missing': saveAs (WIN32OLERuntimeError) OLE error code:0 in <Unknown> <No Description> HRESULT error code:0x80020005 種類が一致しません。 目的のVBAはこちら。 ActiveDocument.SaveAs FileName:="¥¥foo.html", _ FileFormat:=wdFormatHTML, LockComments:=False, Password:="", _ AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _ EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _ :=False, SaveAsAOCELetter:=False 環境はWindowsXP, ActiveScriptRuby 1.8.7, MS-Office 2007 よろしくお願いします。
その手のフラグはどこかしらで数値を定義した定数(引数としては数値を渡す)なので、自前で定義すればいい 調べ方は・・・wordだとどうするんだったかな、とりあえずぐぐったら8っぽい あとこの板にrubyのwindowsスレあるからそっちもよろしく
class Word; end WIN32OLE.const_load(msword, Word)
>>949-951 ありがとうございます。
wdFormatHTML = 8
msword.activeDocument.saveAs('¥¥foo.html', wdFormatHTML)
でいけました。
#はじめてwin32ole使ったけど、これはすごい。こんな便利なものがあるなんて知らなかったよ。
class Word; end WIN32OLE.const_load(msword, Word) p Word::WdFormatHTML
必死
>>943-944 VCで拡張ライブラリをコンパイルしようとすると
バージョンの違いやらなにやらで悲惨なことになる
mingwでのコンパイルオススメ
NPR itself has long been accused of having a liberal bias, though the network states that it reflects a diversity of views. ,
957 :
943 :2009/10/23(金) 13:41:51
>>947 サンクス!
てか、VC6て今手に入らないし、サポートも切れてるコンパイラを何で使ってるんだろw
958 :
943 :2009/10/23(金) 13:43:46
>>955 ああ、mingwでもいいのか。つか、ActiveScriptRuby の1.8.7にmingwでコンパイルした拡張ライブラリつかっても大丈夫なの?
ちょっと環境整えてみるか
関係ないけど、coLinuxのubuntuで同じgem入れたらなんごとなきに入ったw Linuxだとこの辺楽屋根
>>958 mingwでもぜんぜんいいです。
>>957 というわけで、mingwとのバイナリ互換性のためです。
「この問題」って何があったの?
「Windowsユーザーの大多数がgemライブラリのバイナリを自力でコンパイルできない状態にあること」かな
>>961 文脈からすると、今更VC6ってことじゃないの?
ああそういうことか リンク先に問題があるのかと思ったw
外部ライブラリと合わせなきゃならないんで、配布されているほとんどの DLL(iconvとかopensslとかncursesとか)がmsvcrt.dllとリンクされている現状 ではrubyだけVC8とか9にはできない、という理由。
SNMPで装置の状態を取得して、 ある状態になったら次の処理をするようなスクリプトにしたいのですが、 以下のようなループを作るしかないですか? (並行で動いている必要はないのでスレッドにはしていませんが) until (装置の状態判定) SNMPで装置状態取得 sleep 1 end 判定式に間違いがあると無限ループになる危険がありますし、 もっと上手い方法があるんじゃないかと思い質問させてもらいました。 よろしくお願いいたします。
"1 2@3#4"こういうデータを一回のsplitで分割する事って出来ませんか? "1 2@3#4".split(" " , "@" , "#") こんな事が出来ればなぁと思ったんですがダメみたいで
>>967 それが普通だと思う
気になるならスレッド使うか条件つき break でも別途入れとけ
>>968 "1 2@3#4".split(/\s|@|#/)
>>968 splitの区切り文字には正規表現が使えるので
.split(/[ @#]/)
とすれば良い
2文字以上のが使いたいなら角カッコ使わず|で区切れ
>>967 細かい話だが、取得と判定とが互いに別処理なら、↓の方が安全。
SNMPで装置状態取得
until (装置の状態判定)
SNMPで装置状態取得
sleep 1
end
>>969 970
そんな手があったんですね
ありがとうございます
buf=[] File.open("text.txt", "r"){|f| while line = f.gets buf << line end } bufの処理(ある文字がある行を除く) File.open("text.txt", "w"){|f| buf.each{|line| f.puts line } } これを1回のFile.openで書きたいのですが よろしくお願いします。
>>973 lines = File.open('text.txt').realines
# なんか消す
lines.delete_if{|line| line =~ /re/}
File.open('text.txt','w').print(lines.join)
これでいいじゃん
うっひょう d がねえ せっかくなので統一 lines = File.open('text.txt'){|f| f.readlines} # なんか消す lines.delete_if{|line| line =~ /re/} File.open('text.txt','w'){|f| f.print(lines.join)} File オブジェクトは読み書きごとに作ったほうが安心安全
File オブジェクトは読み書きごとに作ったほうが安心安全なんですか? ほぼ同時アクセスで pc1がtextを読む pc2がtextを読む pc1がtextを書く pc2がtextを書く となると、ファイルの内容が壊れそうなのですが。 (pc1,2で消す行が違うとします。)
>>976 それは Ruby の知ったこっちゃねー
ある瞬間に書き込む先のファイルが、一瞬前と同一の内容であるかどうかを Ruby は保証しない
読み込んでから書き込むまでの間に自分以外の誰もファイル内容を変更して欲しくないのなら
OS のファイルシステムにファイルロックを頼む
File クラスのインスタンスメソッド lock が使える
描く前に、描き変わったかどうかぐらいチェックしろよw ソロそろう目。
>>978 チェックを終えてから実際に書き込みをはじめるまでのわずかな間に書き換えられてしまうことを防げない
これを「そんなクソ短いタイミングで割り込みなんて起こりっこねえよ」と情緒的解決をするのなら、
そもそも「スクリプト内で一瞬で終わる処理の間に割り込みなんて起こらねえよ」と情緒的決断をすべき
両方を保証するにはファイルに排他処理をかけるしかない
980なので次スレを立てる
>>973 > これを1回のFile.openで書きたいのですが
# 読み書き両用でファイルをオープンする
File.open("text.txt", "r+") do |f|
# 排他的ロックをかける
f.flock(File::LOCK_EX)
# ファイルを読み込み
buf = []
f.each do |line|
buf << line if line =~ /^¥w+$/
end
# ファイルポインタを先頭に戻す
f.rewind()
# ファイルサイズをゼロに切り詰める
f.truncate(0)
# ファイルを書き込み
buf.each {|line| f.write(line) } # or f.write(buf.join)
end # ファイルが閉じられるときにロックも自動的に解除される
>>973 あと
buf = []
f.each do |line|
buf << line if line =~ /^¥w+$/
end
は
buf = f.grep /^¥w+$/
と書ける。
>>982 >>983 ありがとうございます。
分かりやすいコメントもつけていただき、勉強になりました。
動作確認ができましたので、ご報告いたします。
986 :
デフォルトの名無しさん :2009/10/24(土) 15:31:23
すごい初歩的な質問ですまんが class Foo def initialize p "aaa" end def initialize(str) self.nitialize p str end end Foo.new Foo.new("aaa") って許可されてないん?
細かい理屈は省くと、そういうのは普通 class Foo def initialize(str=nil) p "aaa" p str if str end end と書く
シグネチャによるメソッドオーバーロード(多重定義)はない。
引数の有無なら
>>987 のようにしてもいいし、込み入ったものは
メソッドの引数を*args のようにしておき、メソッド内で場合分けをする。
class Foo def initialize(params = nil) p "aaa" setup(params) if params end def setup(params) p params end private setup end というパターンも見るな
990 :
デフォルトの名無しさん :2009/10/24(土) 15:50:23
>>987 ありがと
引数に明示的な種類が無いから種類でのオーバーロードは出来ないのは知ってたけど
引数の数でのオーバーロードも出来ないんだ
>def initialize(str=nil)
のところのstr=nilっていうのは第一引数の指定が無い場合はnilが入っているって解釈でいいのかな?
よい というかこういうデフォルト引数の書き方をしないと Foo.new とだけ書いたときに ArgumentError で落ちる
引数が nil であったときを検知したい場合に mes(params = :default) みたいにしてる人を見た なんかモヤモヤするがこれで動作するし気にしないことにする
もっとスマートな記載があるんでしょうか? size=FileTest.size?("filename") if size >= 1048576 s="#{size/1048576}M" elsif size >= 1024 s="#{size/1024}K" else s="#{size}" end
>>993 そのへんの変換に関しては特にサポートはないと思う
1048576ってなんじゃらほ、という可能性があるからべき乗で書いておく、くらい?
>993 ActiveSupport
>>992 def mes(params = (default = true; nil))
ということもできる。一応。
梅☆
999 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。