Ruby 初心者スレッド Part 31

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2デフォルトの名無しさん:2009/09/17(木) 17:31:50
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
 ・「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
  http://www.amazon.co.jp/dp/4797336617/
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
 ・「初めてのRuby」
  http://www.amazon.co.jp/dp/4873113679/

以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください。
 ・「Rubyレシピブック 第2版 268の技」(初心者向け)
  http://www.amazon.co.jp/dp/4797340045/
 ・「プログラミングRuby 第2版 言語編」(初心者向け)
  http://www.amazon.co.jp/dp/4274066428/
 ・「Ruby Way 第2版」(脱初心者向け)
  http://www.amazon.co.jp/dp/4798115339/
 ・ 「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
  http://www.amazon.co.jp/dp/4873113245

以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません。
 ・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
  http://www.amazon.co.jp/dp/4873113946/
3デフォルトの名無しさん:2009/09/17(木) 17:32:33
Ruby 公式・非公式便利サイト2009

・Ruby Home Page 【公式、お役立ち度が微妙】
 http://www.ruby-lang.org/ja/
・Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
 http://www.ruby-lang.org/ja/man/
 http://www.ruby-doc.org/ 【詳しい英語版】
・HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
 http://elbereth-hp.hp.infoseek.co.jp/ruby.html
・Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
 http://www.ruby-doc.org/docs/ProgrammingRuby/
・Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
 http://jp.rubyist.net/magazine/

・逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
 http://www.namaraii.com/rubytips/
・はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
 http://d.hatena.ne.jp/keyword/Ruby

・RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
 http://www.rubyforge.org/
・GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
 http://github.com/

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 http://jp.rubyist.net/
4デフォルトの名無しさん:2009/09/17(木) 17:33:17
関連スレ
・Rubyについて Part 37
 http://pc12.2ch.net/test/read.cgi/tech/1251029267/

アンチスレ
・Rubyについて(アンチ専用) Part004
 http://pc12.2ch.net/test/read.cgi/tech/1249737531/

Railsスレ
・【Ruby】Ruby on Rails Part8
 http://pc11.2ch.net/test/read.cgi/php/1252842574/

Windows用スレ
・【ActiveScript】RubyをWindowsで使うスレ【GUI】
 http://pc11.2ch.net/test/read.cgi/tech/1155031689/

Ruby 1.9 系列スレ
・魁け! Ruby 1.9.X
 http://pc11.2ch.net/test/read.cgi/tech/1201603546/
5デフォルトの名無しさん:2009/09/17(木) 17:34:03
前スレ

・Ruby 初心者スレッド Part 30
 http://pc12.2ch.net/test/read.cgi/tech/1249687283/

・Ruby 初心者スレッド Part 29
 http://pc12.2ch.net/test/read.cgi/tech/1246593305/
6デフォルトの名無しさん:2009/09/17(木) 17:37:51
バージョンに関するよくある質問

・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 程度には使えるということになっている)
 本体と添付ライブラリの動作は問題がないのだが外部第三者ライブラリが全く追いついていない
 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
7デフォルトの名無しさん:2009/09/17(木) 17:38:55
おまけ

・Rubygem 0.x
 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン
 このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に
 しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる
 パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい
8デフォルトの名無しさん:2009/09/17(木) 17:48:10
>>1おつ

>>6
> 1.9 系から輸入された機能は 1.8.6 では動かないが「1.8.6が許されるのは(AA略」と煽ってよい

ハッハッハ、こやつめ
9デフォルトの名無しさん:2009/09/17(木) 18:00:13
プログラミング自体がまったくの初心者ですがrubyがんばって習得したいと思います
とりあえずrubyをインストールしてvimというテキストエディタから動かしたいのですが
自分なりにいろいろ調べてみたのですがわかりません・・・
おしえてください
よろしくお願いします
10デフォルトの名無しさん:2009/09/17(木) 18:05:25
vim は使わなくてよい
素直に通常のテキストエディタで書いて
素直に通常のターミナルなりコマンドプロンプトなりから実行しろ
11デフォルトの名無しさん:2009/09/17(木) 18:07:34
vimを使いたいのです
よろしくお願いします!
12デフォルトの名無しさん:2009/09/17(木) 18:12:37
じゃあvimで書いて、vim終了させて実行しる
13デフォルトの名無しさん:2009/09/17(木) 18:13:46
>>9
そうだな、まずは使っているOSとインストールしたRubyのバージョンから聞こうか
14:2009/09/17(木) 18:18:07
>>13
すいません
使っているOSはWindos XP sp3 32bit?です
rubyはまだインストールしていません
こちらで聞いて教えてもらってやった方が確実だとおもったので
よろしくお願いします
15デフォルトの名無しさん:2009/09/17(木) 18:23:57
vim は使わなくてよい
素直に通常のテキストエディタで書いて
素直に通常のターミナルなりコマンドプロンプトなりから実行しろ
16デフォルトの名無しさん:2009/09/17(木) 18:26:36
全角uza
17デフォルトの名無しさん:2009/09/17(木) 18:28:30
>>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を使いたいという強いこだわりがあるようだし。
18デフォルトの名無しさん:2009/09/17(木) 18:36:31
>>14
1. ActiveScriptRubyをインストールする
2. コマンドプロンプトを開く
3. notepad test01.rb
4. メモ帳が開くので、コードを書いて保存
5. ruby test01.rb
19デフォルトの名無しさん:2009/09/17(木) 18:37:20
あ、3と5はコマンドプロンプトに打ち込む。
20デフォルトの名無しさん:2009/09/17(木) 18:39:56
ここで Cygwin とか言ったら怒られるんだろうなあw
Poderosa とあわせて結構快適だったんだが

vim っていっても gvim のことなんだろうし
21デフォルトの名無しさん:2009/09/17(木) 18:45:06
Cygwinは悩みの種になった記憶のが多い…
俺はCygwin入れるくらいなら仮想マシンにLinux入れるわ
22:2009/09/17(木) 18:45:18
>>17
ありがとうございます
やってみます

>>18
メモ帳じゃなくてgvimを使いたいので・・・
こだわりです

vimじゃなくてgvimでした
すいません
23デフォルトの名無しさん:2009/09/17(木) 18:47:33
>>22
どうでもいいがコードを書くときは全角じゃダメだぞw
24:2009/09/17(木) 18:49:01
安定版と最新版はどっちがいいでしょうか?
25デフォルトの名無しさん:2009/09/17(木) 18:49:41
最新版と書いてありますね
すいません
26デフォルトの名無しさん:2009/09/17(木) 18:55:32
>>9
まずはがんばれ。
初心者がどういうところでつまづくかというデータは大変貴重なので、
気が向いたときに「こういうところでつまづいた」というレポートをお願いします。

27:2009/09/17(木) 18:55:58
ActiveScriptRubyの最新版のインストールが終わりました
28:2009/09/17(木) 18:57:11
>>26
ありがとうございます!がんばります
とりあえず開発環境を作っているところです
よろしくお願いします
29デフォルトの名無しさん:2009/09/17(木) 18:57:39
通常は、ダサいアイコンを変更します
30デフォルトの名無しさん:2009/09/17(木) 19:00:10
プログラミング自体初心者でvimにこだわりってすごいなw
vim自体の操作には慣れてるのか? >>9

って、プログラミング初心者でvimに精通とかないよな
こりゃ無理だと思ったら当初の目的(プログラミング)を思い出して
とりあえずは普通のテキストエディタに戻ってやることを勧めておく
31:2009/09/17(木) 19:00:33
たしかにかっこわるいですね・・・
クールな?アイコンないですか?
みなさんが使っているアイコンをおしえてください
真似します
32デフォルトの名無しさん:2009/09/17(木) 19:02:12
そんなのは hello. world の後でいいって
33デフォルトの名無しさん:2009/09/17(木) 19:04:17
vista で動く、RDE 以外の軽い IDE ないですかね?
うちの環境では RDE は微妙に不安定なんで。
34:2009/09/17(木) 19:04:35
>>30
まったくなれていませんし知識もありません
テキストエディタを画像でぐぐったときにgvimが一番かっこいいと思ったので
それだけです
自分はなんでも形から入る傾向があるのもあります
35デフォルトの名無しさん:2009/09/17(木) 19:06:22
ActiveScriptRubyの最新版のインストールは終わりましたので
gvimのダウンロードからrubyとの関連づけ?の手順をおしえてください
教えてばかりで本当にすいません
よろしくお願いします
36デフォルトの名無しさん:2009/09/17(木) 19:07:18
RubyistMagazineのページに、チュートリアルが紹介してあんのな。

ttp://jp.rubyist.net/magazine/?FirstStepRuby
> Ruby ではじめるプログラミング
>
> とりあえず何をしたらいいのかわからない、という人は本誌 Rubyist Magazine の初心者向け連載があります。
> ttp://jp.rubyist.net/magazine/?0002-FirstProgramming
> ただし、この連載はプログラミング自体の初心者を対象にしているため、 すでに他言語でのプログラミング経験がある方には少々簡単すぎると思います。

>>9よ、これやってみない?『プログラミング自体の初心者を対象にしている』そうだから、
これを読んでわからなかったことを報告してもらえたら、
この記事の改善点として誰かがとりあげてくれるかもしれない。
37デフォルトの名無しさん:2009/09/17(木) 19:07:25
>>33
RDEはどの環境でもだいたい不安定だよ
38:2009/09/17(木) 19:09:00
>>36
やります!
でもそのまえにvgimのほうを・・・

39デフォルトの名無しさん:2009/09/17(木) 19:09:32
>>33
「Ruby IDE」でぐぐってみよう。
Java製のならVistaでも動くと思う。
40デフォルトの名無しさん:2009/09/17(木) 19:10:37
>>38
たぶん、vimがいかに初心者に厳しいかを知らないのだろう。
悪いことは言わん。vimはhello worldができるようになってからにしておけ。
41デフォルトの名無しさん:2009/09/17(木) 19:12:25
荒らしだろjk
42:2009/09/17(木) 19:12:29
One-Click Installer - WindowsとActiveScriptRubyは別物ですか?
43:2009/09/17(木) 19:13:57
荒らしではないですよ
真剣にやってます
44デフォルトの名無しさん:2009/09/17(木) 19:14:21
45:2009/09/17(木) 19:17:58
hello worldのプログラムできました
うまく動いてくれたようです
46デフォルトの名無しさん:2009/09/17(木) 19:22:21
>>42
別物。似てるけど。
RubyistMagazineがActiveScriptRubyをお勧めしている以上、そっちをインストールしたほうがよい。

>>34
>テキストエディタを画像でぐぐったときにgvimが一番かっこいいと思ったので
>それだけです

そんな理由でgvimを選んだやつはまちがいなく挫折する。
gvimは敷居が高すぎるから初心者はやめておけ。
47:2009/09/17(木) 19:29:16
>>46
わかりました

gvimは敷居が高いですか・・・
ttp://skitch.com/soh335/bi14a/quickrun-ruby-vim
こんな感じでやりたかったのです
ただかっこいい
それだけです
48デフォルトの名無しさん:2009/09/17(木) 19:39:11
>>47
これはMacのターミナルではないか?
ターミナルは半透明に出来るのでデスクトップピクチャ(壁紙)の猫が
透けて見えている。
49デフォルトの名無しさん:2009/09/17(木) 19:45:19
>>47
初心者がWindowsで使うなら、エディタとしては秀丸やxyzzyでいいんじゃないかな。
これなら初心者でも使えるし、習熟するにつれて強力にカスタマイズもできるし。

gvimはほんとのプロフェッショナル向け。プロが作業を極めるための道具であって、初心者が手を出す代物ではない。
50:2009/09/17(木) 19:45:44
>>48
そこはどうでもいいのですがこんなかっこいい画面でプログラムを作りたいのです
51:2009/09/17(木) 19:48:37
>>49
xyzzyもいいですね!
これなら初心者も使えるとのことなのでこれでお願いします
インストールから環境設定までおしえてください
よろしくお願いします
52デフォルトの名無しさん:2009/09/17(木) 19:49:33
カエレ
53デフォルトの名無しさん:2009/09/17(木) 19:51:08
>>49
xyzzyも自分でなんとかする人じゃないと相当難儀だぞw
54デフォルトの名無しさん:2009/09/17(木) 19:53:29
やはり教えてばかりでは嫌われますね
こちらはいたって真剣なのですが
55:2009/09/17(木) 19:54:10
>>54はボクのレスです
56デフォルトの名無しさん:2009/09/17(木) 19:58:39
>>49
xyzzy駄目だろ
まさかvim使えないような奴に最初からgates.l入れさせる気か
着色と自動インデントさえされればなんでもいいはずだ
57デフォルトの名無しさん:2009/09/17(木) 20:02:40
>>54
自分のスレを読み返してごらんよ
Ruby よりエディタへの言及の方が多いよ
58デフォルトの名無しさん:2009/09/17(木) 20:10:31
hello world はgvimで書いたのか?
59デフォルトの名無しさん:2009/09/17(木) 20:11:36
この人に必要なのは、いろんなエディタをインストールして
ひととおり色設定をいじって遊んでみることだと思う。
60デフォルトの名無しさん:2009/09/17(木) 20:12:14
gvimの話はよそでやってくれ、とりあえず。
というか、vimをNGワードにするのが適切だな、こりゃ。
61:2009/09/17(木) 20:12:56
>>58メモ帳です
62デフォルトの名無しさん:2009/09/17(木) 20:45:34
エディタのことは忘れて、まずは>>36のチュートリアルをやろうぜ。
エディタを語るにはきみはまだ若い。
63:2009/09/17(木) 21:00:39
>>62
わかりました
質問があります
hello.rbというhello!と表示するプログラムを作ったのですが実行するときに
いちいち保存先までcd \とか入力していかないとエラーが出るので面倒です・・・
どこからでも○○○.rbと入力して実行するようにはできないのでしょうか?

今まで検索していたのですがnotepad++というエディタがありました
画面の色とか文字の色とか適当にいじって変えてます
gvimやxyzyyはまだまだ先のような気がします
かなり上級者向けのようです
でもやはり形だけでもいいのでgvimやxyzyyでやりたいですねえ・・・
64デフォルトの名無しさん:2009/09/17(木) 21:03:13
>>63
> どこからでも○○○.rbと入力して実行するようにはできないのでしょうか?
Ruby関係ないのでコマンドプロンプトの使い方勉強しろ
ディレクトリ移動関連の最低限必要なことは10分もあれば終わる
65デフォルトの名無しさん:2009/09/17(木) 21:16:20
昔話は嫌われるのだが、
UNIXからMSに移植されたツールは、とても多い。
sed,grep,awkとかね。
今でも、とても役に立ちますね。

MS-DOSの始めの頃に、**とか言う名前のフルスクリーンエディターが発売されました。
MS-DOSの環境であれば、同じようにちゃんと動く、ってのが売りです。
(このあたりが?の人は考古学者になったつもりで調査すべし)
結局、これは商業的な成功はなかったみたいですね。
INT21のせいだと思うのですが、とても遅かったのですよ、表示が。

ん、眠くなったので、続く
66デフォルトの名無しさん:2009/09/17(木) 21:21:17
スレ違い。初心者スレですので無用な語りはお避けください。
67デフォルトの名無しさん:2009/09/17(木) 21:33:14
>>63
>質問があります
>hello.rbというhello!と表示するプログラムを作ったのですが実行するときに
>いちいち保存先までcd ¥とか入力していかないとエラーが出るので面倒です・・・
>どこからでも○○○.rbと入力して実行するようにはできないのでしょうか?

質問の意味がわからない。どんなエラーがでるの?
68デフォルトの名無しさん:2009/09/17(木) 21:38:36
>>67
いやそれはそのまんまだろ
コマンドプロンプトの起動時のカレントディレクトリと自作ファイルを置くディレクトリが違うんだ
例はたいていカレントにあるスクリプトを起動しているから、それと同じようにするにはどうしたらいいかという話

つまりはディレクトリの概念と操作の勉強が要る
69:2009/09/17(木) 21:42:57
>>68
コマンドプロンプトを開いたときは常に自作ファイルをおいているディレクトリから
はじめることはできませんか?
今の環境だといちいち自作ファイルをおいてあるディレクトリまでcdコマンドで移動しないと実行できません

>>68
ruby: No such file or directory -- hello.rb (LoadError)
70:2009/09/17(木) 21:47:06
Cドライブの下にsrcというフォルダを作成してここに自作ファイルを保存しています
コマンドプロンプトから自作ファイルを実行するときは
ruby ○○○.rb 実行とするだけで動くようにはできませんか?
今の環境でこれをすると
ruby: No such file or directory -- hello.rb (LoadError)
と表示されてしまいます
ruby c:\src\hello.rb 実行とすれば動いてくれるのですが
71デフォルトの名無しさん:2009/09/17(木) 22:09:11
はやくパッチレベル上がらんかな
mingw使いはバイナリを上げられんではないか
72デフォルトの名無しさん:2009/09/17(木) 22:27:10
p0がどんどん広まるよー
73デフォルトの名無しさん:2009/09/17(木) 22:27:36
>>69
そういうことはできるのかな。わかんない。

移動がめんどくさいというだけなら、最初から「C:¥」を指定してコマンドプロンプトを起動するのはどうだろうか。

(1) C:¥Documents and Settings¥ユーザ名¥スタートメニュー¥プログラム¥アクセサリ をエクスプローラで開く
(2) 「コマンドプロンプト」ショートカットをデスクトップにコピー
(3) コピーしたショートカットを右クリックして「プロパティ」を選ぶ
(4) 「ショートカット」タブの「作業フォルダ」を「C:¥src」に指定して、OKボタンを押す
(5) コピーしたショートカットをダブルクリックすると、「C:¥src」に移動していることがわかる

>>68
おまえかしこいな。おれはさっぱりわからんかった。

749:2009/09/17(木) 22:50:25
>>73ありがとうございます!
らくになりました!
75デフォルトの名無しさん:2009/09/18(金) 04:52:49
>>33
NetBeansオススメだぜ。

俺はRubyでちょっとした使い捨てプログラム書くときはxyzzyのruby-mode、
仕事のプロジェクトはNetBeansと使い分けてる。

>>69
"Command prompt from here"いれろ。ぐぐったらでてくる。
エクスプローラーからフォルダの右クリックで、そのフォルダを作業フォルダにしてコマンドプロンプトを開けるようになる。
76デフォルトの名無しさん:2009/09/18(金) 11:27:41
>>75
すでに解決しております
ありがとうございます
またお願いします
77見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 11:39:09
>>9です
質問することが多いと思いますので名前をつけさせていただきました
よろしくお願いします
78デフォルトの名無しさん:2009/09/18(金) 12:12:53
>>77
コテつけてくれるのはありがたい。



さ、NGにしよっと。
79デフォルトの名無しさん:2009/09/18(金) 12:19:14
無駄にスレをのばさないでください。>>見習い
S/Nが低下し過ぎ。

これがつづくと、だれもこのスレをみなくなって
質問しても答えてくれる人がいなくなってしまう。
80デフォルトの名無しさん:2009/09/18(金) 12:20:16
>>77
まあ気長に頑張れ
>>2 は見たか。多少値がはっても入門書ぐらいはちゃんとしたのを
買った読んで方がいいぞ
81見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 12:23:09
>>78さんw

>>79
気をつけます
すいません
S/Nってなんですか?

>>80
ありがとうございます
入門書は買うつもりです
PCだと目が疲れてくるのでやっぱりじっくり見てやるなら紙のほうがいいです
82デフォルトの名無しさん:2009/09/18(金) 12:25:50
君はググることすらしないのになんでここにいるん
83見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 12:34:55
>>82
ググってますよ
84デフォルトの名無しさん:2009/09/18(金) 12:38:37
>>79
どうして存在を認めて名前で呼ぶの
85デフォルトの名無しさん:2009/09/18(金) 12:55:44
初心者スレだから、いいんじゃね。
むしろ、初心者がどこで躓くのかを俺は知りたい。

86デフォルトの名無しさん:2009/09/18(金) 13:01:55
>>85
それを知りたいならこの板全部読め
全部載っている
87デフォルトの名無しさん:2009/09/18(金) 13:04:19
>>83
S/Nでぐぐった?
人に聞く前に自分で調べようって話
88見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 13:08:30
>>87
ぐぐりましたけどどれも関係なさそうなものばかりですよ
89デフォルトの名無しさん:2009/09/18(金) 13:31:00
rubyで再起処理をしようとすると、undefined method `each' for nil:NilClassと出ますが、再帰処理はできないのですか?
90デフォルトの名無しさん:2009/09/18(金) 13:33:00
>>88
いい加減なことを言うなよ
検索結果の最上位にずらっと並んでいるだろ……

というか、こういう Ruby とは何の関係もないやり取りがまさに N なわけだよ
91デフォルトの名無しさん:2009/09/18(金) 13:35:52
>>89

各オブジェクトがeachを持っているかどうかの判断をする必要があるんじゃないの?
92デフォルトの名無しさん:2009/09/18(金) 13:36:55
>>89
それは書き方間違ってるだけです
エラーの理由がそのまんまです
[1,2,3].each do |e| … と直接書いた場合は [1,2,3] をeach 内から読む手段がないんで
再帰したい場合はご面倒でも arr = [1,2,3] と変数として一度定義してから arr[1..-1] とか呼んでください
93デフォルトの名無しさん:2009/09/18(金) 13:37:14
>>89
意図せず nil に対して each を呼んでいる
コードを張れ
94デフォルトの名無しさん:2009/09/18(金) 13:39:53
>>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が再帰できないのかと思ったのですが
95デフォルトの名無しさん:2009/09/18(金) 13:49:58
>>94
よくわからないけど停止条件が見当たらないよ
96デフォルトの名無しさん:2009/09/18(金) 13:50:01
原因がわかりました。

再帰したときにrefCellNameがnilになっています
(最初に呼び出された時は正しいデータが入ってました)

再帰したらrefCellNameのデータってnilになるものなんでしょうか?
97デフォルトの名無しさん:2009/09/18(金) 13:51:29
>>95
停止はrefCellName[activeCell]の中が空になったときです
98デフォルトの名無しさん:2009/09/18(金) 13:53:34
>>97
> 停止はrefCellName[activeCell]の中が空になったとき

refCellName[activeCell] が空になったら再帰から抜ける、という部分の
コードが見当たりませんが?

それと、空になるとはどうことだと理解してますか?
99デフォルトの名無しさん:2009/09/18(金) 13:54:14
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
100デフォルトの名無しさん:2009/09/18(金) 13:59:21
>>96
いやそれであのエラーは出ない
nil[:a].each #=> NoMethodError: undefined method `[]' for nil:NilClass

each のレシーバが nil だっていうエラーだから
refCellName[activeCell] が nil のはず

どうしてそれが nil になるのかはよくわからん
refCellName から要素を削除する仕掛けが停止条件兼ねてどっかにあって
それと干渉してるんじゃないの?
101デフォルトの名無しさん:2009/09/18(金) 14:00:19
>>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はこれでも動くからできるかと思ってました。
102デフォルトの名無しさん:2009/09/18(金) 14:04:24
うん、再帰使ってるプログラムは
停止条件が関数の頭のほうに書いてあると漏れでも理解できて非常に助かる
103デフォルトの名無しさん:2009/09/18(金) 14:05:54
>>101
「NilClass に each メソッドが定義されていない」と認識するべき
レシーバが nil だからではない

nil.to_s は NilClass#to_s が定義されているからエラーは出ない
空文字列を返す
104デフォルトの名無しさん:2009/09/18(金) 14:08:36
>>103
なるほど

納得しました。クラスごとに定義が必要でnilにはなかったと
ありがとうございました
105デフォルトの名無しさん:2009/09/18(金) 16:25:12
初心者にカリカリしている人が多いようなので、再掲しました。

>>1
>■回答する人へ
>相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
>それができないならこないこと(だって初心者スレだもん)。
> ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
> ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
> ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

ここは初心者がバカな質問をすることを大目に見てあげられるマゾヒストのためのスレです。
初心者にカリカリするような人はこないでね。
106デフォルトの名無しさん:2009/09/18(金) 16:30:37
◆YG1xRh8M6Ffb乙
107デフォルトの名無しさん:2009/09/18(金) 16:40:08
>>105
「Rubyに関する」既出な質問やわけわかな質問なら、いくらでも大目に見る
スレ違いな質問(S/Nとか)はよそに行け

加えて言うと、調べる気がなさそうな人間に対しては
いくらマゾヒストでも親切でも教える気になれんよ
人力検索サイトに行け
108見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 16:52:14
ルビーのショートカットアイコンを変更したいのですが
右クリックしてプロパティから変更しようとしても”アイコンの変更”ボタンが
アクティブ?の状態になっておらず変更できません
どうすればいいですか?
よろしくお願いします

>>106
ちがいますw
109デフォルトの名無しさん:2009/09/18(金) 17:33:05
>>107
>加えて言うと、調べる気がなさそうな人間に対しては
>いくらマゾヒストでも親切でも教える気になれんよ

回答したいやつが回答すればいい。
回答したくないやつは黙って無視しとけばいい。
ここはもともとそういう場所。
調べる気がなさそうな人間がいれば、キーワードを教えてぐぐることを薦めるだけのこと。
その程度でカリカリするなら、こんなスレ見ない方がいいよ。ストレスたまるだけだから。
110デフォルトの名無しさん:2009/09/18(金) 17:33:55
>>108
Windows関連のスレで聞いたほうがいいかも。
111見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 18:02:45
>>110
ありがとうございます
windows板の質問スレッドで回答待ちです
112デムパゆんゆん:2009/09/18(金) 18:11:39
おう、がむばれ!
113見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 19:16:05
スタートメニューのすべてのプログラムのRuby1.8の中にruby consoleがあります
でも作業フォルダにはこれと同じファイルがありません
意味がわからないのですが・・・
どういうことですか?
114デフォルトの名無しさん:2009/09/18(金) 19:19:55
>>113
ruby本体だって作業フォルダにないだろ。それと同じだよ
環境変数PATH、コマンドプロンプトとかでググってみたら
115見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 19:21:22
恐らくボクの言っていることが通じてないとおもいます
ボクの説明が悪いです
すいませんね
116デムパゆんゆん:2009/09/18(金) 19:28:29
どうせならLinuxでやろうぜ。
117見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 19:32:36
もっていません
118デフォルトの名無しさん:2009/09/18(金) 19:34:49
>>115
通じてないと思うのならあやまる前に通じさせる努力をしてくれよw
何がわからなくて何を知りたいのか、回答者が推測しなければならないような
質問はよくない、というかかなり損してるよ
119見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 19:36:36
>>29さんはいませんか?
いらっしゃいましたら方法をおしえてください
120見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 20:01:57
>>118
こんな感じでよろしいでしょうか

OSはwindows xp sp3 32bitです
rubyはActiveScriptRubyの最新版1.8.7をインストールしています
デスクトップのショートカットアイコンを”変更”したいのですがその方法がわかりません
自分なりにいろいろがんばってみたのですが力不足のようです
もし知っている方がいらっしゃいましたらご教授いただければ幸いです
ご指導の程よろしくお願い致します
121デフォルトの名無しさん:2009/09/18(金) 20:17:33
>>120
その話はWindows板で回答待ちじゃないのか?
>>113-114の流れはおかしくないと思うが、直後に>>115,120となる意味が分からん
122見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 20:22:41
もういいです
123デフォルトの名無しさん:2009/09/18(金) 20:23:53
>120
Windows板で回答待ちの質問をこっちに持ってくるなよ
向こうの住人に失礼だぞ
124見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 20:24:29
流れがどうのこうの
聞いてるんだから
可能か不可能かくらいは
こたえてくれても
いいんじゃないの
125デフォルトの名無しさん:2009/09/18(金) 20:27:32
RubyプログラムでWindowsでのショートカットのアイコンを変更したいというんだったら
WIN32APIでも叩けば「可能かもしれない」。
俺はやったこと無いから知らないけど、詳しい人が答えてくれるかもね。

Rubyのショートカットアイコンを変更したいという話だったら「可能」だけど
スレ違いだから出て行けって言われてる。
126デフォルトの名無しさん:2009/09/18(金) 20:29:36
>>113
>スタートメニューのすべてのプログラムのRuby1.8の中にruby consoleがあります
>でも作業フォルダにはこれと同じファイルがありません
>意味がわからないのですが・・・

意味が分からないのはキミの質問のほうだな。
Windowsがないから正確なことはわかんないけど、
「スタートメニュー」> 「すべてのプログラム」>「Ruby 1.8」
の中に「ruby console」というのがある、ということがいいたいのか。
しかし「作業フォルダにはこれと同じファイルがありません」という部分は意味がわからん。
再提出!
127見習い ◆YG1xRh8M6Ffb :2009/09/18(金) 20:29:54
アイコン変えるくらいで
えらいたいそうなことやね
あきらめますわ
ありがとう
128デフォルトの名無しさん:2009/09/18(金) 20:39:34
1. まずruby consoleってのを削除する
2. パスを通す
3. 普通にコマンドプロンプトを使う
129デフォルトの名無しさん:2009/09/18(金) 20:45:02
アイコンとかどうでもいい事にこだわるのはマカ。
ルビー使いたいなら教祖も使ってるデビアン推奨。
130デフォルトの名無しさん:2009/09/18(金) 20:45:18
アイコンを右クリック→プロパティ→カスタマイズ→アイコンの変更→好きなのに換える
131デフォルトの名無しさん:2009/09/18(金) 20:46:54
ショートカットの場合は「カスタマイズ」を「ショートカット」に読み替えてね。
132デフォルトの名無しさん:2009/09/18(金) 20:48:45
あれは許容範囲を超えたダサさだからなあ
GRScript18.dllのリソースを書き変えたらいいんかな
真面目な話、アイコンをartonに送るというのが真の解決法だ
133デフォルトの名無しさん:2009/09/18(金) 21:09:34
初心者さんがだんだんグレて来ててワロタ
134デフォルトの名無しさん:2009/09/18(金) 21:29:21
そろそろ悪態をつくころだね
135デフォルトの名無しさん:2009/09/18(金) 22:20:56
>>130-131
アドバタイズショートカットなめんな
136デフォルトの名無しさん:2009/09/18(金) 23:19:34
ひまなおっさんの釣りなんじゃないかと思えてきた。
日本語がおかしいし、いくら初心者でもこれはないだろ。

あるいはリアルに小学生なのか。
137デフォルトの名無しさん:2009/09/18(金) 23:25:08
[ [1,2,3],[4,5,6],[7,8,9] ] → [ [1,4,3],[4,10,6],[7,16,9] ]

↑のように、配列の配列の2番目の要素だけ2倍にしたい
ときはどのように描けば短くかけますか?

138デフォルトの名無しさん:2009/09/18(金) 23:29:04
まずはうんざりするくらいまで each 使い倒せ

Enumerable や Array の各メソッド内部でどう each が使われているか推測できるようになれば
いちいち他人に聞かなくても一発で書き下せる
特殊動作のメソッドだけ聞きかじりで使ってても応用できないぞ
139デフォルトの名無しさん:2009/09/18(金) 23:36:38
>>137
とてもRubyらしく書くとこうなる

L = [ [1,2,3],[4,5,6],[7,8,9] ]
for e in L do e[1] = e[1] * 2 end
140デフォルトの名無しさん:2009/09/18(金) 23:38:18
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
141デフォルトの名無しさん:2009/09/18(金) 23:50:05
>>139,140
非破壊的にやるとすればどうする?
142デフォルトの名無しさん:2009/09/19(土) 00:01:54
>>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ともども本当にごめんなさい
143デフォルトの名無しさん:2009/09/19(土) 00:01:59
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
144デフォルトの名無しさん:2009/09/19(土) 00:01:59
arr2 = arr.map{|a| b = a.dup; b[1] *=2; b}
145デフォルトの名無しさん:2009/09/19(土) 00:28:11
>>142,144
なるほど。ありがとう。
146デフォルトの名無しさん:2009/09/19(土) 00:33:02
>>139>>142
方言わらたw
147デフォルトの名無しさん:2009/09/19(土) 00:52:29
>>142
初心者スレではそういうのやってほしくないなあ。冗談を冗談と見抜けないのが初心者なんだから。
しかも冗談としてもつまんないし。
148デフォルトの名無しさん:2009/09/19(土) 06:34:59
Marshalとかw さすうがに冗談も大概にしろよw
149デフォルトの名無しさん:2009/09/19(土) 07:11:56
>>148
君の釣りはつまらない
Marshal.dump+load は dup の shallow copy で済む今回は牛刀だが手段としては妥当だ
150デフォルトの名無しさん:2009/09/19(土) 07:48:50
>>149
なぜ、Marshalを使う必要があるかわからん。dupですむなら、それにこしたことないのではないか
151デフォルトの名無しさん:2009/09/19(土) 08:07:50
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 と定数のほうだな
152デフォルトの名無しさん:2009/09/19(土) 08:17:24
>>151
だったら>>142の段階で簡単な説明をつけましょう。
なぜMarshalを使ったのかという説明がないため、初心者は理解できないし他の人も混乱するだけです。
ここは初心者のための回答が期待されるところであり、初心者が理解できない回答を書いて「Marshal使ってるオレかっこいい」とひたる場所ではありません。
スレの趣旨を理解しましょう。
151が142と別人だったらごめんね。
153デフォルトの名無しさん:2009/09/19(土) 08:32:23
俺もちょっと不思議に思ったからググってああなるほどと思ったクチだが
別に「Marshal使ってるオレかっこいい」じゃないだろw
Ruby本でも書かれるような一般的な小技なんだろ

まあ上でも言われてるが初心者にネタを見抜けってのはきついから
ネタなしかネタだと明らかに分かるよう書いてほしいのはあるが
154デフォルトの名無しさん:2009/09/19(土) 08:37:29
>>152
知らんよ
Marshal.load して dump するというのは「はいれつがこぴーできません」に対する FAQ だ
きちんとマニュアルにも書い…書…注釈に小さく書いてある
ttp://www.ruby-lang.org/ja/man/html/Object.html#footnote-1

知っていることも使用することも問題は特段存在しない
Marshal.dump を知っているレベルで for や定数を使うことが「ありえない」から叩かれてるのだろ
155デフォルトの名無しさん:2009/09/19(土) 08:39:34
Array や Hash の複製が欲しいときにいつも歯がゆく思うんだけど
なんで Object には deep copy のためのメソッドがないのかな?

サブクラス作るたびに適切にオーバーライドする必要が出て面倒だからだろうか
156デフォルトの名無しさん:2009/09/19(土) 08:56:27
>>155
実際にRubyスクリプトとして作るとわかるが循環解決でわけわかめになる
marshal.のソース流用しようとするとT_DATAであっぴゃーになる
dumpしてloadよりも早くてうまくて短い実装があるならMLで発表だ

基本、ディープトラバースして欲しくないらしいぞ
Rubyで提供されてるディープトラバース手段はMarshalだけだ
Marshalできないやつはそもそも複製できんオブジェクトだったということで
157デフォルトの名無しさん:2009/09/19(土) 09:23:29
怖いからYAMLにして戻すってのは?w
158デフォルトの名無しさん:2009/09/19(土) 09:30:36
>>154
>知っていることも使用することも問題は特段存在しない
問題はそこじゃない。初心者への回答という観点を忘れ、ろくに説明もなしにコードだけ書いて満足していることが問題。
159デフォルトの名無しさん:2009/09/19(土) 09:39:28
dump が目的の場合に Marshal ではなく YAML を使うメリットはゼロ
160デフォルトの名無しさん:2009/09/19(土) 09:40:25
>>158
説明はされた
161デフォルトの名無しさん:2009/09/19(土) 09:56:20
説明しなくても分からなきゃ自分で調べるだろ
162デフォルトの名無しさん:2009/09/19(土) 11:16:12
>>160
あとからな。ここでいっているのは、最初の>>142の時点で何の説明もないことだろ。
163デフォルトの名無しさん:2009/09/19(土) 11:26:23
どうしてもMarshalに突っかかってるようにしか見えないが
そこは全く問題ないだろ

forの方を言うならまだわかるが
164デフォルトの名無しさん:2009/09/19(土) 11:33:22
なんか一人顔真っ赤にして頑張ってる姿が目に浮かぶんだが

>>147>>139,142のようなのは初心者に有害だからやってほしくないと真摯に考えるのなら
その場で「Rubyでforは滅多に使わねえよカスeach使え」
「大文字で始まる識別子は定数だからLとかそんな風に使うなボケ」
「巣に帰れ二度と戻ってくるな」といったツッコミをいれるべき
165デフォルトの名無しさん:2009/09/19(土) 11:45:02
Marshal を知らなかったのが悔しくて悔しくて悔しくて悔しくて悔しくてたまらないのだろ自称脱初心者が
166デフォルトの名無しさん:2009/09/19(土) 12:02:02
>>164は、>>142での説明がないのに「説明はされた」とほざいている>>160の必死の答弁でした。
160先生の次回作をお楽しみに。
167デフォルトの名無しさん:2009/09/19(土) 12:05:26
どっちが必死なんだよw
168デフォルトの名無しさん:2009/09/19(土) 12:06:17
マジ顔真っ赤だなあ・・・w
説明がないと思ったなら他の人が説明するもよし
分からなきゃそれを質問するもよし
だろう
169デフォルトの名無しさん:2009/09/19(土) 13:40:16
ごめん、俺がMarshalなんて・・・っていったばっかりに、こんなことに(´・ω・`)
ごめんなさい、ごめんなさい。双方とも頭冷やしてくだしあ
170デフォルトの名無しさん:2009/09/19(土) 13:44:38
いや、Marshalは正しい解答の一つでしょ
あやまるならforとか定数とか変に使ったことをあやまってくれよw

まあ(ちゃんとした)議論になればいろんな情報が出てくるからいいのかもしれんけどね
171デフォルトの名無しさん:2009/09/19(土) 13:58:09
>>142で既にあやまってるなw
172デフォルトの名無しさん:2009/09/19(土) 14:23:19
"[hoge]"とか"{hoge}"みたいな文字列の前後の括弧を取り外すのに

"[hoge]".sub(/\[(.+?)\]/){$1}

なんかじゃなくて、なんかもっとスマートな方法はありませんか?
173172:2009/09/19(土) 14:26:22
できれば
"[hoge]".split(//)[1...-1].join
も無しの方向で。
174デフォルトの名無しさん:2009/09/19(土) 14:28:01
"[hoge]"[1...-1] では駄目と申すか。
175デフォルトの名無しさん:2009/09/19(土) 14:36:42
String[] の動作が期待に添っていて、短いのがスマートだと勘違いしているのなら、>>174
そのまんまの正規表現でマッチした部分を取り出す以上のわかりやすいスマートなものはないかと思われ

str =~ /\A[\(\{\[<](.+?)[\)\]\}>]\Z/; $1

開きカッコの対応を取るライブラリは標準では無いので自作してくれ
176デフォルトの名無しさん:2009/09/19(土) 14:38:04
というかカッコの対応は正規表現では本来書けない。
とCマガで大昔に読んだけど、最近の拡張しまくりのだと可能かもなー。
177デフォルトの名無しさん:2009/09/19(土) 14:48:30
後ろの1文字はchopで毟れるけど、先頭の1文字を毟り取るメソッドっ
てないよな。
178デフォルトの名無しさん:2009/09/19(土) 14:51:08
>>177
その手があったか

"[hoge]".chop.reverse.chop.reverse
179デフォルトの名無しさん:2009/09/19(土) 14:52:59
>>178
ちょwwwwwプwwwww
180デフォルトの名無しさん:2009/09/19(土) 14:54:21
小橋の回転チョップを思い出した
181デフォルトの名無しさん:2009/09/19(土) 17:26:08
右のほうをチョップされたら左のほうを差し出せ
182デフォルトの名無しさん:2009/09/19(土) 20:20:22
×ほう
○ほお
183デフォルトの名無しさん:2009/09/19(土) 20:28:43
>>172
"[hoge]"[/\[(.+?)\]/, 1]
とも書ける。

>>175
Onigurumaならできるはず。
184デフォルトの名無しさん:2009/09/19(土) 21:00:13
すんません。このスレどっからドコまで自作自演なんてしょうか?
185デフォルトの名無しさん:2009/09/19(土) 21:06:16
ココまで俺の自演
186デフォルトの名無しさん:2009/09/20(日) 05:42:36
require ってなんで複数のライブラリ名を受け付けないんでしょうか。
けっこう不便なんですけど。
187デフォルトの名無しさん:2009/09/20(日) 05:58:31
>>186
リファレンスを見たらわかることではないでしょうか?
188デフォルトの名無しさん:2009/09/20(日) 06:35:34
書いてはあるが、意図を読み取るのは不可能だと思う

>>186
require が真偽値を返すメソッドとして作られているから、がいちおうの答
複数受け取ったときは真偽値の配列を返すようにしてもいいんだけど、おおむねキモい

each で回してもいいはずなんだけど、そういう人はなぜか見ないね
189デフォルトの名無しさん:2009/09/20(日) 06:46:28
かなり初期に一瞬だけ実装されたことがあったと記憶
false が返ってきたほうが便利だということでお流れになったんでなかったかな
190デフォルトの名無しさん:2009/09/20(日) 07:50:00
ふとした疑問なのですが、Mechanizeのテストというのはどのように書いたものでしょうか?
191デフォルトの名無しさん:2009/09/20(日) 08:22:58
>>190
FakeWeb 1.2.6 API Documentation
http://fakeweb.rubyforge.org/

FakeWeb使ったらいけるかも…
192デフォルトの名無しさん:2009/09/20(日) 11:46:12
test
193デフォルトの名無しさん:2009/09/20(日) 11:51:53
>>192
それはRubyで作った2chブラウザのテストですか?
194デフォルトの名無しさん:2009/09/20(日) 12:34:04
186です。

>>188
なるほど!たしかにrequireは戻り値がありますね。でも戻り値を気にする場面っていうのはまれなので、
そういう理由で複数の引数を指定できないのはちょっと勿体ないですね。

Railsとかには require_all というのがあるそうなので、戻り値を気にしなくていいから
引数を複数とれるバージョンのrequireを、requireとは別に用意してほしいなと思いました。
195デフォルトの名無しさん:2009/09/20(日) 12:34:37
yes,we can
196デフォルトの名無しさん:2009/09/20(日) 12:59:39
>>194
なければ自分で作るという選択肢ももとう
197デフォルトの名無しさん:2009/09/20(日) 13:01:42
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にファイルが送れるのかもよくわからんのだけど
教えてくれるとありがたいです。
200デフォルトの名無しさん:2009/09/20(日) 17:25:56
>>199
idの所が変になるんじゃなくて、cgi['syashin']以降が変になってるはず
blobとかのバイナリオブジェクトは文字列の連結でSQLを作れない
プリペアードステートメントとかを使え
201デフォルトの名無しさん:2009/09/20(日) 17:56:53
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
空配列に空文字列がつっこまれるべきちゃうん?

[""]
204デフォルトの名無しさん:2009/09/20(日) 18:57:36
>>194
%w(lib0 lib1 lib2).each{|feat| require feat}
でいいじゃん
205デフォルトの名無しさん:2009/09/20(日) 19:12:10
>>202-203
新リファレンスマニュアルから抜粋

> instance method String#split
> split(sep = $/, limit = 0)

> 第 2 引数 limit は以下のいずれかです。

> limit == 0
> 分割個数制限はなしで、配列末尾の空文字列を取り除く
> limit < 0
> 分割個数の制限はなし

「配列末尾の空文字列を」いくつあっても全部「取り除く」ってことなんだろうな多分
それがデフォルトの動作である理由は知らん
206デフォルトの名無しさん:2009/09/20(日) 19:23:06
> 「配列末尾の空文字列を」いくつあっても全部「取り除く」
こんなん知らへんかったがな。おーきに

理由は実装上の都合なんやろなぁ
207デフォルトの名無しさん:2009/09/20(日) 19:33:54
Perlがそうだったから。
Perlがそうだった理由は知らん。
208デフォルトの名無しさん:2009/09/20(日) 22:23:37
>>206
web上では関西弁禁止だよ?知らないな?他の方言ならいいけど
209デフォルトの名無しさん:2009/09/20(日) 22:53:07
>>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じゃないとだめ?
212デフォルトの名無しさん:2009/09/20(日) 23:17:15
>>210
Threadなくなったわけじゃないし、上級者(地雷踏み?)向けの機能だから忘れていいよ
否定的なこと言われてるし
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/31601
213デフォルトの名無しさん:2009/09/20(日) 23:58:30
214デフォルトの名無しさん:2009/09/21(月) 00:21:13
>>211
出来るみたいだけど使ってないんで確認はしてない
ttp://planet.mysql.com/entry/?id=18088
stmt = my.prepare("select ?,?")
stmt.execute 123, "abc"
stmt.fetch # => [123, "abc"]
215デフォルトの名無しさん:2009/09/21(月) 00:43:01
refe2簡単に入れたいけどパッケージとかある?
216デフォルトの名無しさん:2009/09/21(月) 00:58:24
そんなに面倒なことはない気がするんだが
217デフォルトの名無しさん:2009/09/21(月) 01:37:34
>>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だとだめなんか?
こんなところで詰まってるようだと、表示にもてまどりそう
っていうか、表示できるのか?
218デフォルトの名無しさん:2009/09/21(月) 03:42:41
MySQLの本でも買えよ・・・またはRails使うか
219デフォルトの名無しさん:2009/09/21(月) 04:02:16
>>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でも表示させる方法ありますかね?
221デフォルトの名無しさん:2009/09/21(月) 12:24:04
もはやRuby関係なし
222デフォルトの名無しさん:2009/09/21(月) 12:41:30
どうみてもHTMLの質問です
動的か静的かは用途次第だけど、素直にURL割り当てろって
223デフォルトの名無しさん:2009/09/21(月) 12:54:14
http://pc12.2ch.net/test/read.cgi/tech/1251609039/
スレ立てるまでもない質問はここで 100匹目
http://pc12.2ch.net/test/read.cgi/tech/1054813207/
【漏れは】猫でもわかる質問スレ【猫以下です】
224デフォルトの名無しさん:2009/09/21(月) 13:26:50
>>220
アホだなぁ。
base64デコードして出力すればいいだろが。
Content-Typeヘッダも適切に吐いてね。

あ、スレチだね。
225デフォルトの名無しさん:2009/09/21(月) 13:51:04
>>220
さすがにスレ違いすぎるけど。
src="data:..." は IE6 ではサポートされてない。これはブラウザを変えてもらう以外に方法はない。
だから data: を使わずすなおに画像を別ファイルにしておこう。

あるいは http://example.com/cgi/jpg.cgi?base64=.....(base64文字列)....
が画像ファイルを返すようなCGIを用意して、
src="data:..." をすべて src="http://example.com/cgi/jpg.cgi?base64=...." に変換するとか。
226デフォルトの名無しさん:2009/09/21(月) 18:26:18
アホです。すんません。
>>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のはなじしゃないよね(涙
227デフォルトの名無しさん:2009/09/21(月) 18:59:21
アホなりに解決しました。

どうもbase64のコードが長すぎでうまく行かなかったっぽいので
idを指定してDBから画像を引っ張って垂れ流すだけのCGIを作成しました。
idなら長くても50桁とか行かんので、これで解決!!
いろいろ、ご迷惑おかけしました。
ヒント本当に助かりました。ありがとうございます。
228デフォルトの名無しさん:2009/09/21(月) 19:05:28
>>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で渡すなよ、と。
230デフォルトの名無しさん:2009/09/21(月) 20:02:48
URLの長さ上限は、普及しているブラウザでは、一番短かいIEが
2083バイトだったかね。

231デフォルトの名無しさん:2009/09/21(月) 20:04:53
一発でroot奪取されかねない素敵コードだな
232デフォルトの名無しさん:2009/09/21(月) 21:06:05
なんかワロタw
233デフォルトの名無しさん:2009/09/22(火) 14:17:19
ルヴィーっておもしろいですか?ルヴィー使ってる友達が、開発者が日本人だから誇らしいと言ってました
234デフォルトの名無しさん:2009/09/22(火) 14:23:06
>>233
またお前か。
もういいから自分の巣に帰れ!
235デフォルトの名無しさん:2009/09/22(火) 15:31:24
URIのやり取りでトンネル掘り出すアフォとか出てきそうだな。
236デフォルトの名無しさん:2009/09/22(火) 19:39:02
$0とか__FILE__とかARGFとか・・・
最初から備わってる変数が色々ありますけど、どうしてこんなに表記法に統一性が無いのですか?
237デフォルトの名無しさん:2009/09/22(火) 20:31:24
変数
238デフォルトの名無しさん:2009/09/22(火) 21:03:37
>>236
Larry Wallに聞いてくれ
239デフォルトの名無しさん:2009/09/22(火) 21:08:08
Larryにそんなことを聞いたら
Perlの文法が言語学的にどう優れているのかの講義が始まるぞ
そしてハッシュの頭になぜ%が付くのかを聞いたらPerl信者になること確実だからやめておけ
240デフォルトの名無しさん:2009/09/22(火) 21:28:45
$0はsh
__FILE__はC
ARGFはARGVの発展系、ARGVはCのmain関数の引数argvが元になっている
どれもこれもunix+Cを知ってれば、なじみの物ばかりだ
241236:2009/09/22(火) 22:02:34
ありがとうございます。他言語からの習慣に習って付けてるんですね。
でもARGFはどうして定数なんでしょうか?Cだとargvなんかは変数ですよね。
__FILE__は擬似変数で$0はグローバル変数と全部違うけど、どれもグローバルにアクセスしたいものだから
統一してしまえばいいのに、と思ったのです。
ここら辺の、定数やグローバル変数、擬似変数といった使い分けは実装内部のことが分かるような人じゃないと理解できないのでしょうか。
242デフォルトの名無しさん:2009/09/22(火) 22:06:29
ARGFは大文字で始まる
__FILE__は違う
243デフォルトの名無しさん:2009/09/22(火) 22:08:10
定数だったNILが変数nilになったりしてるから絶対的な境界は無いんだろう
ARGFをグローバル変数にするのはおかしな話だが、何でといわれても説明できん
244デフォルトの名無しさん:2009/09/22(火) 22:23:44
ARGFはARGVの発展系、ARGVが大文字でグローバルなのは多分awkが元
他の言語もそれに習ってるからrubyもそれに習っているんだろう
245デフォルトの名無しさん:2009/09/22(火) 22:27:10
>>241
どこかでMatzが
「特殊変数周りの仕様はPerlから引きずった。今では後悔している」
的なことを書いてたような

いずれにせよ、一貫性がないという意見には同意
246デフォルトの名無しさん:2009/09/22(火) 22:41:46
Perlからの脱却
ってのがRubyの精神じゃなかったっけ…
247デフォルトの名無しさん:2009/09/22(火) 22:44:06
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
249デフォルトの名無しさん:2009/09/22(火) 23:43:38
色々と突っ込みたい所はあるが、まずはtmpdirにセッション情報が書き込まれたファイルが存在しているかどうかを確認するんだ。
250デフォルトの名無しさん:2009/09/22(火) 23:48:07
ファイルが作成されているのが確認できました。
リロードするたびに増えていきます。
サーバー側の問題でしょうか?
251デフォルトの名無しさん:2009/09/22(火) 23:58:52
ようし、じゃあ次はFirefoxにFirebugを入れてcookieの受信と送信ができているか確認するんだ。
CGIモジュールの仕様はよく知らんが、きっとセッションIDをクッキーに入れて送ってきてくれているはずだぞ!
252デフォルトの名無しさん:2009/09/23(水) 00:15:52
クッキーのリストが反応しないみたいです、他のサイトだとExpiresの項目にsessionというのが出てきています。
253デフォルトの名無しさん:2009/09/23(水) 00:50:05
で、セッションを発行したときのレスポンスヘッダに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のコンソールで確認できるような事を書いてあるサイトを見つけたのですが
うまく確認できませんでした。
256デフォルトの名無しさん:2009/09/23(水) 01:04:36
>>2555
Firebugでの見方がわからんならLive HTTP Headers入れろ。
257デフォルトの名無しさん:2009/09/23(水) 01:17:14
ありがとうございます、インストールしてみました。
レスポンスヘッダにCookieと名前のつく項目はなかったです。
258デフォルトの名無しさん:2009/09/23(水) 01:20:23
じゃあそれが原因だろw

ってかCGIクラスのインスタンスって何度も生成したらバグるんじゃないの?
関数の中でインスタンス作成して、破棄しているあたりからして使い方が間違ってるんじゃないのかと。
259デフォルトの名無しさん:2009/09/23(水) 01:26:40
なるほど、少し簡単なプログラムを作って実験してみます。
rubyは明確なルールが分かりづらくて難しいですね。

ありがとうございました。
260デフォルトの名無しさん:2009/09/23(水) 01:32:05
問題はHTTPの理解のほうじゃないだろうか。
261デフォルトの名無しさん:2009/09/23(水) 01:46:05
>>248
たんにHttpヘッダーを送信してないだけかも。
「ruby cgi session」でぐぐったら、こんなページがあった。
ttp://d.hatena.ne.jp/tilfin/20080229/1204360284
参考にしてみて。
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の勉強を行ってみます。
263デフォルトの名無しさん:2009/09/23(水) 07:51:45
どうしても分からなければ
ソースをまるごと貼り付けて、アドバイスを求めるという手もある
もちろん自力で解決できるならその方がいいけど
264デフォルトの名無しさん:2009/09/23(水) 08:05:08
2chに投稿するとインデントがなくなってすごく見にくいんだけど、JaneStyleのリンクポップアップで
見るとちゃんとインデントされてる!

それをコピーしたらインデント付きでコピーもできる!
全角スペースや&nbsp;によるインデントを使う必要なし!
265デフォルトの名無しさん:2009/09/23(水) 11:05:48
>>264
書き込み時に置換面倒なんだけど、ソースとリンクを毎回書き込むのが面倒なのだが
266デフォルトの名無しさん:2009/09/23(水) 11:15:02
コードを貼付ける場合、どうせなら
ttp://pastie.org/
とか
ttp://gist.github.com/
とか使うといいんじゃないかな。
詳しくは ttp://journal.mycom.co.jp/news/2009/02/09/014/index.html
267デフォルトの名無しさん:2009/09/23(水) 11:20:00
長い場合はそのほうが望ましいけど
短い場合はそのまま貼ってくれたほうがいいな

あとインデント類の扱いは2chブラウザごとに全然違うらしいよ
268デフォルトの名無しさん:2009/09/23(水) 11:32:03
rubyのせいにしてるが、http知らないと実装は無理なんじゃ。
269デフォルトの名無しさん:2009/09/23(水) 11:35:06
CGIも知ってないと無理な悪寒
270デフォルトの名無しさん:2009/09/23(水) 11:38:57
アホばっかだな・・・
ソース張ってるんだからrubyが原因って一発で原因わかるだろw
271デフォルトの名無しさん:2009/09/23(水) 11:52:44
正しくrubyをかくための
http,cgiの前提知識が足りないのかもしれん
272デフォルトの名無しさん:2009/09/23(水) 19:47:00
Rubyって、GUIアプリを作れるの?
273デフォルトの名無しさん:2009/09/23(水) 19:56:01
Ruby 自身は GUI 部品を持ってない
GUI 部品を司る他の言語や API を直接呼ぶ

一般論としては、GUI が目的なら Ruby を使う理由は何もない
素直に GUI 部品を提供する他の言語を使え
Windows でウィンドウを表示したけりゃ、そりゃ C# を使えばいいのさ
274デフォルトの名無しさん:2009/09/23(水) 20:03:27
うわ 糞言語じゃん
275デフォルトの名無しさん:2009/09/23(水) 20:05:01
>>274
GUI部品がどういうふうに成り立ってるか理解してないだろ、おまえ。
276デフォルトの名無しさん:2009/09/23(水) 20:11:42
>>274


ま た お ま え か !

277デフォルトの名無しさん:2009/09/23(水) 20:13:41
Ruby/Tkの不遇って本当なんだなあ・・・
278デフォルトの名無しさん:2009/09/23(水) 20:24:45
>>277
Windows環境の俺に言わせると
ActiveTclを別に導入しなければならないあたりが原因
Exerbでまとめて配布できるWxRubyと比べて、いろいろ不便だ
279デフォルトの名無しさん:2009/09/23(水) 20:29:24
Win32API経由なら「ActiveTclを別途インストールしてください」という必要もない
Tclの文法をわざわざ勉強する必要もない
アリモノ全部で賄える
280デフォルトの名無しさん:2009/09/23(水) 20:33:10
One Click InstallerにはRuby/Tk最初から入ってなかったっけ
まあPythonでTkinter使ったら幸せになれそうなケース
281デフォルトの名無しさん:2009/09/23(水) 20:35:56
ruby厨涙拭けよ
282デフォルトの名無しさん:2009/09/23(水) 20:47:46
というかTkってけっこう大きいんだよね

必要な人だけ適当に別途入れて使って、というスタンスにしておいたら
実行環境持ってない人に配布するという場合のサポートがすっこんと抜けた
そこまでRubyでやらなくてもいいじゃん却って不便だろ、と思うんだけれど
283デフォルトの名無しさん:2009/09/23(水) 20:48:31
あれ? どこか涙流すような流れになってたっけ?
284デフォルトの名無しさん:2009/09/23(水) 21:05:57
jruby でいいじゃんじゃん。
285デフォルトの名無しさん:2009/09/23(水) 21:09:32
pythonに標準添付されてるtkをrubyから使う事って出来るん?
286デフォルトの名無しさん:2009/09/23(水) 21:18:26
Linux使ってるけど、Ruby/gtk2が便利。書きやすい。
シグナルまわりの書き方が好きだ。
287デフォルトの名無しさん:2009/09/23(水) 21:36:19
>>279
? どういうこと?
dllファイルを直接呼べばいいってこと?
288デフォルトの名無しさん:2009/09/23(水) 22:15:39
Win32APIでやれることだけでなんとかしろって意味だと思う
289デフォルトの名無しさん:2009/09/23(水) 22:18:29
Win32API向けにヘッダファイルの翻訳やってくれたりするライブラリでもあるの?
290デフォルトの名無しさん:2009/09/24(木) 07:36:30
gemのjsonライブラリって日本語まんま変換できないの?
UTF8で["ほげ"].to_jsonとかすると["\u307b\u3052"]とかなっちゃうんだけど
291デフォルトの名無しさん:2009/09/24(木) 08:05:05
いやそれそのまんまだと思うのだが

irb> puts JSON.parse(["ほげ"].to_json)
ほげ

何か問題ある?
292デフォルトの名無しさん:2009/09/24(木) 08:42:47
javascript内では日本語は直接記述しないとか、そういう話?
293デフォルトの名無しさん:2009/09/24(木) 08:45:26
>>290
JSONの仕様としては変換するのが正しい。
ただ、それが日本人にとって便利かどうかはまた別の話。
ユニコードに変換させないオプションがほしいよね。
294デフォルトの名無しさん:2009/09/24(木) 08:47:18
>>293
ごめん、ウソ書いた。「変換するほうが仕様上正しい」というのは間違い。
JSONでは文字列中に日本語をかけるはずだね。
295デフォルトの名無しさん:2009/09/24(木) 08:49:10
機械が生成した JSON はたいてい Unicode エスケープで日本語が書かれてるぞ
仕様上はエスケープしても構わない(may)のでたいていのライブラリは自動エスケープする
そのほうがめんどくさくないからというのが積極的理由

JSON を生で読むなバカという意図が働いてるという気はせんでもない
296デフォルトの名無しさん:2009/09/24(木) 09:34:48
便乗して質問

JSONやYAMLに変換したとき、日本語をそのまま出力してくれるライブラリって
AnJSONやYa2YAMLぐらいしか知らないんだけれど
他に同じことができるライブラリってないかな
297デフォルトの名無しさん:2009/09/24(木) 09:48:05
Jsonて生で読むなっていうようなものなの?
生で読めるのもいいところの一つだと思ってたんだけど
298デフォルトの名無しさん:2009/09/24(木) 10:45:45
クラス変数が定義されているかどうかを調べる方法ありますか?
299デフォルトの名無しさん:2009/09/24(木) 11:18:24
class_variable_defined?
300デフォルトの名無しさん:2009/09/24(木) 11:26:31
Perlでは複数の返り値(リスト)があって、必要のないものには、以下のようにundefと記述しますが、

my ($second, undef, $hour) = localtime;

Rubyではどのように書くものなのでしょうか?

def meth
return 1, 2, 3
end

a, ??, c = meth
301デフォルトの名無しさん:2009/09/24(木) 11:46:53
>>296
Rubyでは知らない。
PythonのYAMLライブラリは、オプションでユニコードに変換する・しないが選べるんだけど、
同じようなオプションがRubyにも欲しいよね。

>>300
特に用意はされてないと思うので、いらない変数を指定するしかないんじゃないかな。
a, _, c = meth
とか
a, dummy, meth
とか
302デフォルトの名無しさん:2009/09/24(木) 12:00:51
>>301
ダミー変数を使うしかないんですね。
了解しました。
303デフォルトの名無しさん:2009/09/24(木) 12:31:35
>>299
古いオンラインマニュアルでは載ってないclass_variable_defined?!古いオンラインマニュアルでは載ってないclass_variable_defined?!じゃないか!
304デフォルトの名無しさん:2009/09/24(木) 12:34:56
class_variable_defined? が載ってない HTML ヘルプ版マニュアルは持ってる
これでも一応 1.8.6 対応だったはずなんだが
まいっか
305デフォルトの名無しさん:2009/09/24(木) 12:36:10
大事なことなので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++の仮想関数や仮想関数テーブルとのアナロジーで説明してくれている
ページってありませんか?
307デフォルトの名無しさん:2009/09/24(木) 17:23:53
これ貼ると人によってはなぜか大変がっかりされるんだけど

>>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]
308デフォルトの名無しさん:2009/09/24(木) 17:25:10
C++ の vtbl の仕組みでは説明できません。
Ruby の場合「頼んで答えられれば答える」ただそれだけです。
309306: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 の実装を提供することができるのか、
という質問です。
310306:2009/09/24(木) 17:35:01
>>307 , >>308
ありがとうございます。分かってきました(気がします)。
RubyというかMix-inという以前に頭が動的型付けの言語に
慣れていないことが原因だったように思います。

>Ruby の include はこの検索順番表(の2番目)に自分を追加するだけのシンプルな機能
>継承もこの検索順番表(の2番目)に継承元クラスを追加するだけのシンプルな概念

その解説ですっきりしました。
ということは >>309 も当然可能で
複数のモジュールを Mix-in したりさらに継承を続けたりして
メソッドの名前が重複する場合には、要注意、
つまり include の順番も依存するということですね。
311306:2009/09/24(木) 17:38:28
ということは言語仕様としてMix-inとしての制約を
課しているという点以外は Python の多重継承と
良く似ているなぁ・・・

どうしても業務が静的型付け・手続き型言語
べったりなんで、まだこっち方面(どっち?)は
指をくわえて見てるだけしたが、そろそろ。
312デフォルトの名無しさん:2009/09/24(木) 17:40:18
Matzは恥ずかしい表紙の本でMix-inは多重継承って言い切ってたな
313デフォルトの名無しさん:2009/09/24(木) 17:44:20
>>311 そんなあなたに Scala をどーぞ。
314デフォルトの名無しさん:2009/09/24(木) 17:47:26
>>312
多重継承の形してないだけで、実際は多重継承だと思う

 ・ 自作以外を include すると地獄
 ・ 自作でも 2つ include するとわけわかめ
 ・ 下手に include せずにクラスメソッドとして単体利用すると異常に楽

とか一緒
315デフォルトの名無しさん:2009/09/24(木) 18:12:17
弱めた多重継承には違いない
実装を共有しつつ、ダイヤモンド継承とか面倒な問題は生じなくなる

まあRubyの場合、今度は変数がぶつかる問題があるけど・・・・・
なんかSchemeの健全なマクロみたいに、
名前の衝突を自動回避できないのかね
316306:2009/09/24(木) 18:26:57
>>315
モジュールのメソッドの中で自由にインスタンス変数作れちゃうんですよね
そうするとたしかに変数名は衝突しますね。
317デフォルトの名無しさん:2009/09/24(木) 20:13:26
ま、>>315の言う通りだね。
多重継承には嫌な問題がたくさんあるけど、あれば便利な場面もある。
そこで、通常の継承は単一継承のみに制限した上で、多重継承したい場面のためにMix-inを用意してある、と。
この辺のバランスの取り方は、まさにRuby的。好き嫌いはあるとは思うが。
318デフォルトの名無しさん:2009/09/24(木) 20:19:22
実際問題として include ってあまりしないよねえ
やろうと思えばできるって感じ
慎重に設計した上で組み込む必要があるから、あまり気軽ではない

あと NameSpace::Application を include NameSpace して使う人はトイレのドア開けた瞬間に漏れろ
319デフォルトの名無しさん:2009/09/24(木) 20:36:13
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) でやってる奴も漏れなくうんこ漏れろ
320デフォルトの名無しさん:2009/09/24(木) 20:41:52
Ruby のバージョンだけが問題なんだから RUBY_VERSION で場合分けすべきだよね
defined?(Encoding) は時々見るんだけど、何が目的なのかな
321デフォルトの名無しさん:2009/09/24(木) 20:51:16
defined?(Encoding)って何がまずいの?
322デフォルトの名無しさん:2009/09/24(木) 21:00:52
Encoding という名前のモジュールまたはクラスまたは定数が定義されていること、ということしか調べられないこと
>>319 のような問題が起こるし、Encoding という名前のクラスかモジュールがどこかに存在してさえいればいいとか
Encoding という名前のクラスにならほぼ確実に存在して動作も確定なメソッドがあるという問題でもないわけで

文字列のエンコーディング処理に本当に必要なのはナニかというと Ruby 1.9.1 なわけで、
じゃあ素直に 1.9.1 の存在をチェックしたほうが素直なんじゃね、ということに
323デフォルトの名無しさん:2009/09/24(木) 21:19:57
>文字列のエンコーディング処理に本当に必要なのはナニかというと
つーか例えば>>319の場合ならforce_encodingの存在チェックをするほうがよくね?
324デフォルトの名無しさん:2009/09/24(木) 21:27:53
ダックタイピングとして意味がありゃあな
325デフォルトの名無しさん:2009/09/24(木) 21:38:25
エンコーディングではなさそうだけど:

1.9以降の機能と思ってバージョンでチェックしていたら
1.8.8にバックポートされたでござる、という場合を考慮すると
バージョンで全部OKというわけでもないだろうな。

ケースバイケースとしか。

326デフォルトの名無しさん:2009/09/24(木) 21:43:06
いやそれでもそれはバージョンでチェックすべきだろう
Rubyのバージョン名と機能の関係はそんなにまでも信頼できない魔境ではない
ソース触れる人がアップデートすべきだ
327デフォルトの名無しさん:2009/09/25(金) 09:01:16
ダッチタイピングに空耳した
328デフォルトの名無しさん:2009/09/25(金) 15:43:22
だからRUBY_VERSIONで分岐すんなつってんだろ

Encodingで被るなら::Encodingとか
String.method_defined?(:encoding)とか
使えよ
329デフォルトの名無しさん:2009/09/25(金) 16:03:28
ある機能を備えているかが定数の存在やメソッドの存在でしかわからないのが問題なのかな。
Open Classなのでいくらでも後から定数やメソッドを追加できるわけで。
かといって、Javaのパッケージみたいにドメイン名使って一意にするのも鬱陶しいけれど。
330デフォルトの名無しさん:2009/09/25(金) 16:45:12
RUBY_VERSION 否定派は何も根拠がないのが笑える
331デフォルトの名無しさん:2009/09/25(金) 16:54:42
やはり組み込みと添付は Std モジュールに全部入れておくべきだった
332デフォルトの名無しさん:2009/09/25(金) 17:41:18
>>330
1.9の機能を模倣する外部ライブラリができるかもしれないし
Ruby実装だって今やMRI一択じゃない
それと機能の有無で分岐してくれた方が後で読んだときに意図がつかみやすい

といっても俺自身否定派でもないから好きにすればいいと思うよ
できれば1.9スレや本スレとか然るべき場所でやってくれればなお良い
333デフォルトの名無しさん:2009/09/25(金) 17:47:57
涙拭けよ
334デフォルトの名無しさん:2009/09/25(金) 18:12:41
配列の中にハッシュ作りたいんですけど不可能ですか?
335デフォルトの名無しさん:2009/09/25(金) 18:16:30
irb> foo = [{"a"=>0, "b"=>1}]
=> [{"a"=>0, "b"=>1}]
336デフォルトの名無しさん:2009/09/25(金) 18:17:59
>>334
入れ子にすることは普通にできる

[{'key1' => 'val1'}]

以下のようなことはできそうだができない

['key1' => 'val1', 'key2' => 'val2']

以下のような使い方は一見無駄で遅いっぽい上に実際無駄だが、
Ruby ではけっこう普通にやってるのでどんどん使え

arr = [{'key' => 'val1'}, {'key' => 'val2'}, {'key' => 'val3'}]
arr.each do |h|
p h['key']
end
337デフォルトの名無しさん:2009/09/25(金) 18:27:42
>>336
それって全部同じ 'key' でも何か意味があるの?
keyは色々なものでってこと?
338デフォルトの名無しさん:2009/09/25(金) 18:54:14
結局、Encoding関連で今まで出た案をまとめると

1. RUBY_VERSIONで分岐
2. defined?(::Encoding)
3. str.respond_to?(:force_encoding)

あたりが現実的な解か
339デフォルトの名無しさん:2009/09/25(金) 21:03:11
>>336みたいなのは
{'title' => 'タイトル', 'author' =>'著者', 'date' => '日付'}
という固定フォーマットのハッシュを、何らかの理由で順番を保持したまま
深く考えずに適当に処理したいというときに時々見る
340デフォルトの名無しさん:2009/09/25(金) 21:30:24
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 を作るときにキーのためにわざわざ整数をカウントしないといけないのが不便
341デフォルトの名無しさん:2009/09/25(金) 21:40:37
dataは配列でいいんじゃないか?
342デフォルトの名無しさん:2009/09/25(金) 21:42:22
railsのソースコード読むとハッシュの上手な使い方が理解できるよネー
343デフォルトの名無しさん:2009/09/25(金) 21:48:45
>>341
敢えて全部ハッシュにするという例なんじゃないのか
344デフォルトの名無しさん:2009/09/25(金) 22:25:41
>>339
つまり1.9なら不要の発想ってことでおk?
345デフォルトの名無しさん:2009/09/25(金) 22:32:52
1.9.1 (以降)でしか使わないスクリプトであるなら、ハッシュ入り配列は不要だな
普通にハッシュを each で回せばいい

個人的には Hash の順番保持は 1.9.3 くらいで唐突に無くなりそうな機能だと思ってて
これに依存したスクリプトはあまり作りたくないなあと思ってるんだが
346デフォルトの名無しさん:2009/09/25(金) 22:39:09
え!Hashの順番保持されるようになったのか
347デフォルトの名無しさん:2009/09/25(金) 22:46:43
えー 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
348デフォルトの名無しさん:2009/09/25(金) 22:51:52
どちらかというとネガティブな方向で話題になった気がする
順番記憶したら Hash じゃねえとか Rubyオワタ\(^o^)/ とか
349デフォルトの名無しさん:2009/09/25(金) 22:57:26
確かにHashはあるキーに対応する値を保持するだけのものな気がするな
順番保持したいなら配列にしろ・・・・・
とこんな話もすでにさんざんしたわけか
350デフォルトの名無しさん:2009/09/25(金) 23:13:16
Java風に言うなら単なるLinkedHashMapでしょ
単なるハッシュとして使う分にはそれでもいいし、
追加コストは定数だからRuby的には許容範囲だとの判断があったのだろう
351デフォルトの名無しさん:2009/09/26(土) 00:16:02
標準でOrderedHashクラス作って、Hashの仕様が変更されてもOrderedHashだったら大丈夫って風にしないと
まったく意味ないんじゃないの?
352デフォルトの名無しさん:2009/09/26(土) 00:16:16
ruby をスクリプトエンジンとして使用するフリーソフトを作ったんですが、
Artisticライセンスな windows 版 ruby ってありますか?
353デフォルトの名無しさん:2009/09/26(土) 00:38:34
yugui氏が担当している間は大丈夫そうなイメージがある、なんとなく

最悪OrderedHash < Hashになったとしても
互換性が必要な場面でHash = OrderedHashとかしときゃいいんじゃねw

冗談はともかく、現時点であらかじめこうしてから利用するとか
class OrderedHash < Hash; end
順列が必要な連想配列だというのが明確になるし
obsoになったときの対応も比較的容易なはず

まあ俺はArrayクラスがArrayとQueueとStackに七変化するようなもんだと思うから抵抗はないし
消える心配も今のところしてない
354デフォルトの名無しさん:2009/09/26(土) 00:42:41
Hashでも順番持ってた方が普通に便利なんだが
別に深刻な害があるわけでなし、何が不満なんだがさっぱりわからん
355デフォルトの名無しさん:2009/09/26(土) 00:49:15
>>354
・性能落ちるかもしれない不安
・今後消えるかもしれない不安

だと思う
356デフォルトの名無しさん:2009/09/26(土) 00:52:52
言語処理系としてのruby1.9独自仕様なのか、
それともプログラミング言語Ruby1.9の仕様と解釈していいのか混乱があるのでは
もし前者だとしたら、処理系依存には抵抗がある

ハチドリ本いわく
>Ruby 1.9 では、ハッシュの要素は、実装によっては挿入された順序で反復処理される。
う〜ん・・・・・
357デフォルトの名無しさん:2009/09/26(土) 01:19:10
>>355
性能というのが速度のことであれば逆に速くなった。
というか、だからこそ入った。
358デフォルトの名無しさん:2009/09/26(土) 01:22:27
確かに列挙は早そうだな
359デフォルトの名無しさん:2009/09/26(土) 02:14:22
実装依存じゃOrderedHashのつもりで使うのは御法度か
360デフォルトの名無しさん:2009/09/26(土) 02:16:02
rubyの開発グループは本当に人材酷いな。Railsに全部任せちゃえよ
361デフォルトの名無しさん:2009/09/26(土) 02:36:06
いやいやRailsの人たちに任せたら新機能と非互換がTINYごとにどんどん増えるよ。
362デフォルトの名無しさん:2009/09/26(土) 04:38:27
>>360
お前Rails使ってないか、あるいは使い始めたの今月だろ
363デフォルトの名無しさん:2009/09/26(土) 05:31:14
来月には後悔するのか、流動性速すぎだろRails
364デフォルトの名無しさん:2009/09/26(土) 07:24:58
Railsは、こっち推奨になりました→やっぱやめました→ごめん、やっぱこれ
とかバージョンアップのたびにあったりして笑うw
いや、使っている方としてはどっちだよ!とか思うけど
365デフォルトの名無しさん:2009/09/26(土) 11:11:13
前田さんたちに頑張ってもらって、言語仕様で明文化してもらうまでは
Hashのキー順序については昔ながらの意識でいることにする。
366デフォルトの名無しさん:2009/09/26(土) 11:28:47
JISの話なら、1.8ベースだから順序の保証は入らんと思うぞ
367デフォルトの名無しさん:2009/09/26(土) 11:37:01
>>338
>>328のmethod_defined?も。

>>329
ある機能自体がある定数やメソッドで提供されてるんだから、最も自然だろう。
368デフォルトの名無しさん:2009/09/26(土) 19:22:53
defined? や responsed_to? はダックタイピング用の機能であって
モジュール存在判定に使うもんではないと思う
369デフォルトの名無しさん:2009/09/26(土) 19:48:38
むしろモジュールの存在を問わず
メッセージに応答できるか否かだけを問うべきでは?
370デフォルトの名無しさん:2009/09/26(土) 19:54:42
実際に必要なのは処理結果であって返事そのものではないというのが理想と現実の深くて暗い谷間
371デフォルトの名無しさん:2009/09/26(土) 20:01:47
>>368
ダックタイピングならそんな判定はしない
372デフォルトの名無しさん:2009/09/26(土) 20:04:48
ていうかさあ、responed_to? 使ってる奴だって
その名前のメソッドを持っていることを期待してるのではなく
「Ruby 1.9 の」 force_encoding であることを期待しているんだろ
じゃあそれの条件をきちんと書けよ
373デフォルトの名無しさん:2009/09/26(土) 20:08:05
>>372
期待していない不正なメソッドが動作した場合はたいてい例外が発生してプログラムが止まる
374デフォルトの名無しさん:2009/09/26(土) 20:26:09
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
375デフォルトの名無しさん:2009/09/26(土) 20:35:44
プログラムが止まったあと>>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界隈で聞いてみようと思い書き込みしています。
何か分かりましたらご教授いただけないでしょうか。
377デフォルトの名無しさん:2009/09/27(日) 00:49:00
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])
379デフォルトの名無しさん:2009/09/27(日) 03:45:29
配列の中にハッシュ入れたんですけど
a = [0, {1 >= 5}, 3]
これの配列データがFixnumかハッシュかどうかで処理を分けたいんですが
is_a?(Fixnum)で分岐させようとしたらエラーが出ました
classで調べたらエラーが出ます
どうすればいいんでしょうか?
380デフォルトの名無しさん:2009/09/27(日) 03:56:08
{1 >= 5} でエラーという落ちじゃないだろうな
ちょっとコードをはってみろ
381379: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と出ます
382379: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
モジュールの配列です。
383デフォルトの名無しさん:2009/09/27(日) 04:19:58
どの行でそんなエラー出てるんだい
384379:2009/09/27(日) 04:28:48
if MASTERY_ARRAY::HASH_DATA[1][i].is_a?(Fixnum)
ここです
配列のインデックス2のハッシュ読もうとしたら出ます
385デフォルトの名無しさん:2009/09/27(日) 04:35:08
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 にインデックスが入ると勘違いしてない?
386デフォルトの名無しさん:2009/09/27(日) 04:38:30
http://www.ruby-lang.org/ja/man/html/Array.html の each と each_index をよく読むといい
って、eachの例がeach_indexの結果と区別つきにくいね…1,2,3じゃない例つかえばいいのに
387379:2009/09/27(日) 04:40:24
あーそういうことですか
インデックス入らないと困るんですが
何かうまい書き方ありますか?
とりあえず考えてみます
あったらお願いします
ありがとうございました
388デフォルトの名無しさん:2009/09/27(日) 04:47:09
each {|要素| ... }
each_index {|インデックス| ... }
each_with_index {|要素, インデックス| ...}
389デフォルトの名無しさん:2009/09/27(日) 04:49:28
用件は「要素が整数であること」なんだろうか
「要素がハッシュであること」なんじゃなかろうか

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
390379:2009/09/27(日) 04:58:13
おーすごいさすがプログラム板
each_indexで動きましたありがとうございます
389さんが書いたとおり「要素がハッシュであること」が評価の大筋です
kind_of?(Hash) これは知りませんでした
なんとかいけそうですありがとうございました
391デフォルトの名無しさん:2009/09/27(日) 05:02:31
>>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で一文字入力してすぐ制御を返すサンプルないですか?
393デフォルトの名無しさん:2009/09/27(日) 13:44:36
Curses.getch は?
394デフォルトの名無しさん:2009/09/27(日) 18:44:37
ありがとう。
Winにもcursesってあるのか。
395デフォルトの名無しさん:2009/09/27(日) 18:53:34
>>394
普通に導入可能だよー
396デフォルトの名無しさん:2009/09/27(日) 21:22:24
rubyでCGIの勉強しようとおもって
lighttpdをインストールしました。

ところが、設定方法がわからず、htmlは表示出来るのですが
cgiが動きません。涙目状態です。あちこちググりました・・・
途方にくれています・・・
397デフォルトの名無しさん:2009/09/27(日) 21:25:08
mongrelをいれるといいよ
398デフォルトの名無しさん:2009/09/27(日) 21:26:57
力になっちゃあげたいけど、スレ違いかな・・・
WebProg板か、どっかにLighttpdのスレがあるから、そこで質問したらいいよ
399デフォルトの名無しさん:2009/09/27(日) 21:28:09
SocketってライブラリがあるからそれでWebサーバ書くのがいいと思うな

というか環境や参考にしたページをどこまで試してどこで詰まったとか
そういうのも無しに答えられるわけないので
400デフォルトの名無しさん:2009/09/27(日) 21:30:33
それが無いこと自体が答だろ
つまり、サーバ立てる知識が無い
401デフォルトの名無しさん:2009/09/27(日) 21:32:26
>>398
lighttpdのスレは先に見ました。最終書き込みが8月、その前が6月くらいと
人の気配が感じられませんでした・・・
402デフォルトの名無しさん:2009/09/27(日) 21:36:43
どう転んでもWebサーバの挙動の知識は必要になるわけなんだし
普通にゼロから勉強したほうが早いんだけどね
403デフォルトの名無しさん:2009/09/27(日) 21:36:52
Linuxなら各ディストリの初心者スレにいけば、誰かが教えてくれそう。
404デフォルトの名無しさん:2009/09/27(日) 21:40:14
>>402
まったくだぬ

「WebサーバやHTTPはお着せとコピペで済ませて本題のRubyの学習をしよう」というのは
CGI関連に限ってはありえん
405デフォルトの名無しさん:2009/09/27(日) 21:44:58
>>404
翻訳しながら、lighttpdの本家のページ見てみます。
mongrelも検討してみます。

apacheの設定よりは、ずいぶん楽そうに見えたんですが。。
406デフォルトの名無しさん:2009/09/27(日) 21:47:26
中途半端にマイナーなサーバソフトウェアだと情報が全くないということはばしばしある
めっちゃメジャーなのを小規模で使うのが結局マシだったりすることは意外と多い
407デフォルトの名無しさん:2009/09/27(日) 21:50:40
自分用WebサーバはApacheを接続数とか1人用に絞って使うのが一番だという結論になった
408デフォルトの名無しさん:2009/09/27(日) 21:50:52
>>396はどう動かないか書いていないから誰も助けようがないよ。
cgiがどう動かないのさ。スクリプトを貼ったりしろよ。
409デフォルトの名無しさん:2009/09/27(日) 22:02:07
Apacheの方が情報多いのに。
410デフォルトの名無しさん:2009/09/27(日) 22:03:40
>>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の読み込み権限とかもチェックしような
412デフォルトの名無しさん:2009/09/27(日) 22:15:53
action=/usr/lib/cgi-bin/1.cgi っておかしいだろ… lighttpd とかにかかわらず
/usr/lib とか公開するとは考えにくいから action=/cgi-bin/1.cgi とかなんじゃないのか
この調子じゃ権限とかもだめそうだな
413デフォルトの名無しさん:2009/09/27(日) 22:31:01
>>396
RubyでCGIの勉強をするなら、lighttpdから始めるのはオススメしない
cgi.rbを使って、WEBrick上 or Apache上で動かしてみるとか
Sinatra使うとかしたほうがいい
414デフォルトの名無しさん:2009/09/27(日) 22:40:09
>>411
chmod 755はしてあります。

>>412
あ、cgi-binでいいんですね。フルパスにしちゃいました。
たしかに公開しないですもんね。
415デフォルトの名無しさん:2009/09/27(日) 22:52:59
ファイルの所有者も確認しような
lighttpdを起動したユーザがownerだよな?
416デフォルトの名無しさん:2009/09/27(日) 22:55:57
式がnil, false, 0なら偽になるif文てないの?
417デフォルトの名無しさん:2009/09/27(日) 23:06:09
>>415
ファイルオーナーが、「root」ですね
lighttpdは、「www-data」が起動してます

sudo cpでファイルを/usr/lib/cgi-binにコピーすると
所有者が、ルートになってしまいます。

ちょっと、apacheや他のを調べてみます。みなさん、スレ違いに付き合って
くださって申し訳ありがとうございまsyた
418デフォルトの名無しさん:2009/09/27(日) 23:18:45
>>416
!x || x== 0

'' や [] や {} も偽にしたいならActiveSupport入れてblank? と present?
を使え。

419デフォルトの名無しさん:2009/09/27(日) 23:23:03
>>418
それだとnil, false, 0で真になるんだけど。偽がほしいんですが無理なんですか?
420デフォルトの名無しさん:2009/09/27(日) 23:29:26
x && x != 0
どんだけ応用力ないのかな…
421デフォルトの名無しさん:2009/09/27(日) 23:33:29
いかにも落とし穴がありそうだと漏れのアンテナが反応しております
422418:2009/09/27(日) 23:35:35
すまん逆転させるのわすれてた。てへ。

423デフォルトの名無しさん:2009/09/27(日) 23:49:22
>>417
ファイルの権限を777にして実行してみな。
それで実行できれば権限関係の設定がおかしかったってことだ
linuxの基礎を勉強私的な。
424デフォルトの名無しさん:2009/09/28(月) 10:48:55
Digest::MD5.digest の値を hexdigest に変換する計算式を教えてください。

convert(Digest::MD5.digest(value)) == Digest::MD5.hexdigest(value)

となるようなconvert()です。
あるいはヒントでもいいのでお願いします。
425デフォルトの名無しさん:2009/09/28(月) 10:59:18
そのへんはさすがにマニュアルにも書いてあるだろ
> 与えられた文字列に対するハッシュ値を、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"
426デフォルトの名無しさん:2009/09/28(月) 11:12:25
>>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

なるほどー。
どうもでした。
427デフォルトの名無しさん:2009/09/28(月) 20:26:36
Dir.foreach('hoge'){|filename|
filename.match(/(aaa)(bbb)/}
print $1
}

この状況で、$1や$2の情報を配列に入れるにはどうすればいいですか?
具体的にはこの後、$1の内容について一つ一つ処理をしていきたいんです。
428デフォルトの名無しさん:2009/09/28(月) 20:39:11
ary = []
Dir.foreach('hoge'){|filename|
filename.match(/(aaa)(bbb)/}
ary << [$1, $2] # もしくは ary << $1 << $2
}
p ary
429デフォルトの名無しさん:2009/09/28(月) 20:47:13
filename.scan(/(aaa)(bbb)/)
430デフォルトの名無しさん:2009/09/28(月) 20:51:17
>>428
「<<」ってこういうところで使うんですね。
勉強になりました。ありがとうございました!
431デフォルトの名無しさん:2009/09/29(火) 00:50:52
rubyを使ってgnuplotで簡単にグラフを書きたいんだけど、
何かお勧めありますか?
432デフォルトの名無しさん:2009/09/29(火) 08:15:40
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']

イライラ
433デフォルトの名無しさん:2009/09/29(火) 12:52:20
エディタから編集中のRubyのスクリプトを独立したウィンドウ、ターミナルで起動したい
エラーがあったらエディタがそれを取り込んでタグジャンプしたい
teeやら別のモジュールをrequireするのはなるべく避けたい
もちろんユーザーはputs/getsを制約なく使いたい

といううまいやり方ってないですか?
ようするにエラーが出たらそれだけをログファイルに書き込んでrubyは終了コード1を返したいです
標準エラーをファイルに書き込むようなファイルをこっそり-rするのが現実的なんですかね
434デフォルトの名無しさん:2009/09/29(火) 13:06:42
>>433
Emacs使え
435デフォルトの名無しさん:2009/09/29(火) 13:10:50
標準の ruby-mode で M-x run-ruby で Emacs 内に irb 開いて
M-x ruby-load-file → Enter すれば irb でファイルが実行されるな

エラー行ジャンプはどうしようか
436デフォルトの名無しさん:2009/09/29(火) 14:56:39
>>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へ書き換えたりしていますので...
438デフォルトの名無しさん:2009/09/29(火) 19:28:02
問題ないならPHPのままにしておく
439デフォルトの名無しさん:2009/09/29(火) 19:33:59
scalaって日本でも実績あるの?
440デフォルトの名無しさん:2009/09/29(火) 20:17:30
1万PVって何かを説明してるように見えて、実際はまったく説明してないよなあ。
開設以来10年で1万PVなのか、毎秒1万PVなのか。
441デフォルトの名無しさん:2009/09/29(火) 20:21:10
>>434-435
特定のエディタの話はしてないんだけど…
442デフォルトの名無しさん:2009/09/29(火) 20:22:53
一応、単位としては1日か1ヶ月かのどっちかだな
1日1万PVならコンテンツによってはまあ普通
1ヶ月1万PVなら内容によっては閉鎖したほうがエコ
どっちにしてもPHPで動いてるならPHPで増強したほうがきっと楽だ
443デフォルトの名無しさん:2009/09/29(火) 20:24:12
>>441
だからEmacs使えって
どうせ使いもしないで脳内で考えてるんだろ
444デフォルトの名無しさん:2009/09/29(火) 20:28:12
エディタの布教は余所でやれ。
445デフォルトの名無しさん:2009/09/29(火) 20:32:33
求めること全部できるんだから仕方あんめえ
エディタとして動作するものではEmacs以外ではgvimかPeggyくらいしか心当たりがない
どう動作するのが効率いいかの研究もEmacsの動作見れば丸分かりだ
446デフォルトの名無しさん:2009/09/29(火) 20:35:49
特定のエディタじゃなくて何を求めてるんだ
どんなエディタでも連携して動く万能スクリプトが欲しいのか
447デフォルトの名無しさん:2009/09/29(火) 20:38:44
>>446
たぶんそうだと思う
エディタ内でシェルを起動するのでなければ
emacsclient みたいなシステムがないと無理だと思うんだけどね

というか、できないからこそ数十年かけて Emacs が M-x compile を進化させてきたのではないんかのう
448デフォルトの名無しさん:2009/09/29(火) 20:43:52
うん、Emacsのとか使ってれば「Rubyは特に関係ない」ということにすぐ気づけたはずなのに
コンパイラ等が異常終了コードをシェルに返してエラー行を標準出力などに表示さえしてくれれば用は済む
449デフォルトの名無しさん:2009/09/29(火) 20:45:04
$stderr.reopen($0 + ".errorlog")
450デフォルトの名無しさん:2009/09/29(火) 20:54:21
>>442
単純にPVって言ったら普通に日単位だろ
何この馬鹿
451デフォルトの名無しさん:2009/09/29(火) 23:38:21
>>437
>1万PVのPHPで作られたサイトをRuby(ROR)かScala(Lift)どちらかを使って
>バージョンアップしようと計画していますが、どちらがお勧めでしょうか?

どういう理由でバージョンアップしようとしているのかがわからないので、答えられる人はいないでしょう。
パフォーマンスが理由ならRoRはイバラの道だし、開発効率が理由ならLiftはイバラの道。
どちらの道を選んでもイバラの道だと思うので、PHPのまま改善することをお勧めします。
あるいはPythonを使ってGoogleAppEngineにするとか。これもイバラだな。
452デフォルトの名無しさん:2009/09/29(火) 23:47:46
railsは慣れてしまえば今までの開発が馬鹿に思えるぐらい楽になる
453デフォルトの名無しさん:2009/09/29(火) 23:49:40
日に1万PV程度なら、サーバ丸1台あればRoRでも余裕だよ。
下手するとキャッシュなしでもいけるくらい。
454デフォルトの名無しさん:2009/09/30(水) 00:35:22
そりゃ1日8万秒以上あるんだから言われなくても分かる
455デフォルトの名無しさん:2009/09/30(水) 06:13:47
結局ピーク性能が足りるかどうかだよな。
456デフォルトの名無しさん:2009/09/30(水) 08:24:47
そして既存のPHP+サーバではおそらく足りてるわけであって、
現時点で言えることは「じゃあPHPでやっとけ」にしかならんという
457デフォルトの名無しさん:2009/09/30(水) 10:56:30
でも結局ピーク性能が足りるかどうかだよ。
458デフォルトの名無しさん:2009/09/30(水) 11:42:46
おいちょっと待てよ、ピーク性能が足りてるかどうかが問題だろ
459デフォルトの名無しさん:2009/09/30(水) 11:46:40
WebProg板に帰れ
460デフォルトの名無しさん:2009/09/30(水) 12:24:24
1ヵ月1万PVwww
461デフォルトの名無しさん:2009/09/30(水) 12:57:50
いや、ここはピーク性能が足りるかどうかが肝だろ。
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
463デフォルトの名無しさん:2009/09/30(水) 18:52:32
>>462
str とスクリプトファイルの文字コードが合ってない
ごく一般的には str とスクリプトの正規表現リテラルの文字コードは同一にする

…あーつまりスクリプトのファイルが UTF-8 じゃないか str が UTF-8 じゃないか
あるいは ruby -Ku のような実行指定をしてないかどれか
464デフォルトの名無しさん:2009/09/30(水) 18:53:19
今はじめて気がついたけどメイリオって数字が全角と半角全く同じに見える。きめぇw
465デフォルトの名無しさん:2009/09/30(水) 18:54:43
def zen_to_han_int(str)
p "yes!" if /0/ =~ str
end

これで 0 を含む文字列渡したときに "yes!" と表示されなければ>>463
466デフォルトの名無しさん:2009/09/30(水) 20:10:23
むしろ、メイリオになってから、半角全角混同さんが気にならなくなりました ^p^
467デフォルトの名無しさん:2009/09/30(水) 20:12:28
やっと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までのあいだとか
これも原因が良くわかりません。
どなたか教えてください。
469デフォルトの名無しさん:2009/09/30(水) 20:30:25
>>468
8進数
470デフォルトの名無しさん:2009/09/30(水) 20:30:28
該当メソッドのマニュアルくらい読め
ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#Integer
マニュアル読んだ上でここがわからんとかそういう質問してくれ
どうせマニュアル読んで調べてる時間のほうが長いんだから、マニュアルの見方を勉強したほうが結局は得だ
471デフォルトの名無しさん:2009/09/30(水) 21:18:02
>>468
$JCODEってなんやねん
472デフォルトの名無しさん:2009/09/30(水) 21:21:37
>>468
0x1234 とかも渡してみろ。
473デフォルトの名無しさん:2009/09/30(水) 21:47:46
>>468
正規表現じゃだめなん?

del integer_string?(str)
 return str =~ /¥A¥d+¥z/
end
474デフォルトの名無しさん:2009/09/30(水) 22:25:26
>>469-470
お恥ずかしいです
下記のように書き直しました

def intrger_string?(str)
    if str.gsub(/\d/,"").size == 0 then
        return true
    else
        return false
    end
end

>>471
$KCODEの間違えです(´Д⊂
475デフォルトの名無しさん:2009/09/30(水) 22:32:57
>>473
それだと2/8/16進表記に対応してないから>>468とは別物になるぞ
476デフォルトの名無しさん:2009/09/30(水) 22:56:18
>>474

メソッド本体だが、ifの条件式が
成立したら(=false, nil以外を返ったら)true
成立しなかったら(=falseかnilが返ったら)false
を返すだけなので、その条件判定式だけでruby的には十分。

ところで str == '' のときはtrue/falseどっちになって欲しいのだろう?
477デフォルトの名無しさん:2009/10/01(木) 08:49:38
>>475
十進だけにしたいんだろ
/\A\d+\z/ =~ str が最善だと思う
478デフォルトの名無しさん:2009/10/01(木) 11:28:02
hoge= メソッドと hoge メソッドって、どっちが先に定義されてると自然?
reader があってから wiriter があるとわかりやすいよね?
479デフォルトの名無しさん:2009/10/01(木) 14:25:42
attr_reader :hoge
def hoge=(value)

でやるのが俺の定番
でも両方書くなら書きやすさ的にライタ側から書くかなあ
480デフォルトの名無しさん:2009/10/01(木) 16:38:52
ここの真ん中辺のコードなんですが
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として実行しても
想定通り動きませんし・・・
481デフォルトの名無しさん:2009/10/01(木) 16:53:16
>>480
こゆこと
これなんぞと思ったら出力して中身を見れ

code_words.each do |key, value|
puts "#{key} -> #{value}"
end

ナイジェリア -> Ny and Jerry'sドライクリーニング(ドーナッツ付き)
カタパルト -> chuckyゴーゴー
スターモンキー -> 新帝国の神経質な閣僚のフィルとピート
火炎瓶 -> 暖房つきのリビング
とどめをさす -> コンセントをさす
482デフォルトの名無しさん:2009/10/01(木) 16:54:10
だからそういう文法というか基本クラスのメソッドの使い方っぽいのは
マニュアルを一応眺めてから「ここの部分がさっぱりわからんおまえら親切に教えろ」とか言ってくれ
親切かどうかはともかくおおむね解説なりツッコミなりが入るからさ
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]

483デフォルトの名無しさん:2009/10/01(木) 16:54:20
doはメソッドではない。ではdoでなければメソッドは何でしょう?
484デフォルトの名無しさん:2009/10/01(木) 16:59:00
>>482
それはマニュアルを読むだけの力があるのに
手抜きして読まない人向けのお言葉
485デフォルトの名無しさん:2009/10/01(木) 17:00:29
>>483
do はブロック開始の(予約)文字列
メソッドに引数を渡すときの ( と ) それそのものがメソッドではないのとおおむね同じ理屈
文字列だからたまたま読めるだけで、別に <<<<<< >>>>>> でもよかった
486デフォルトの名無しさん:2009/10/01(木) 17:06:57
>>481
eachメソッドがハッシュに対して使われたときは、その引数は
|key,value|という形になるわけですね。

>>482
申し訳ないです。

>>483
481の結果からすると、each(すべての要素にたいして)do以下を行えという
ことだと思いますが、メソッドでないならdoはなんだろう。
487デフォルトの名無しさん:2009/10/01(木) 17:14:30
>>481
実行してみました。
undefined local variable or method `code_words' for main:Object (NameError)
というエラーが出ました。code_wordsが定義されていない?
488デフォルトの名無しさん:2009/10/01(木) 17:20:19
初心者が最初にwhyの感動的rubyガイドで勉強するのは
不適切だったりしますか?
489デフォルトの名無しさん:2009/10/01(木) 17:44:46
490デフォルトの名無しさん:2009/10/01(木) 17:56:55
>>486
だから、doは予約語だってば。
ifがメソッドでないのと同じ。
491デフォルトの名無しさん:2009/10/01(木) 18:12:37
> >>483
> 481の結果からすると、each(すべての要素にたいして)do以下を行えという
> ことだと思いますが、メソッドでないならdoはなんだろう。

そのeachはなんですか?
すべての要素にたいして、というおまじないか何かですか?

プログラミング言語はそういうふわふわとしたものではないです。
492デフォルトの名無しさん:2009/10/01(木) 18:21:35
おまいら、ここは初心者スレだ。
初心者っつーのはとんでもない思い込みや勘違いをしていることも多いんだから
あたたかい目でみてください。

>>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 は構文を表す予約語。
493デフォルトの名無しさん:2009/10/01(木) 18:39:54
do が何だかわかりませんレベルの人には来て欲しくないな
質問するなら最低限、言語の基礎は身に付けておいて欲しい
これくらいは自力で学習、調査しておくのが質問する側のマナーだろう
494デフォルトの名無しさん:2009/10/01(木) 18:42:28
そもそも、動作としては 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)

とでも書いてみるといい
495デフォルトの名無しさん:2009/10/01(木) 18:58:26
>>493
思考過程の筋が見えるなら特に問題はないと思われ
まあ、つまりは「勝手に省略せず詳しく書け」ということでしかないわけだが
若干のエスパー能力が要るから万人には勧められない
496デフォルトの名無しさん:2009/10/01(木) 19:29:15
理解としては>>486でまったく問題ないのになんでこんなことになってるんだ
497デフォルトの名無しさん:2009/10/01(木) 20:58:03
申し訳ありません。whyのrubyガイドが
最初の方は、とてもわかりやすかったのです。

読み進めていると、コードが出てきて、ruby ファイル.rbと実行しても
エラーが出たりするようになり、僕はアホなのだろうかと思って質問しました。

初心者向けとして適当でないようなので、もうすこし文法を押さえながら
読んでみようと思います。ありがとうございました。
498デフォルトの名無しさん:2009/10/01(木) 23:29:17
>>493
>do が何だかわかりませんレベルの人には来て欲しくないな

おまえは>>1を声に出して10回よめ。
この程度が我慢できないやつはこのスレくるな。
499デフォルトの名無しさん:2009/10/01(木) 23:41:55
でも>>493程度が我慢できない人は2chに来るべきじゃないよね。
500デフォルトの名無しさん:2009/10/01(木) 23:45:19
せめてネタ系のスレで頑張ってもらえるとありがたいんだけど
そうもいかないんだろうね
501デフォルトの名無しさん:2009/10/02(金) 00:48:12
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です。

長文乱文で分かりにくい質問となってしまい申し訳ありませんが、よろしくお願いします。
504デフォルトの名無しさん:2009/10/02(金) 05:32:32
まあrubyはメゾットの様なものが多いのも事実だけどな。
そこらの統一性の無さは、原理追求派よりも教祖信仰派のほうが多いってだけじゃないかと。
メゾットだからこうって寄りも、教祖がこう使う様に教えたから深く考えずに同じ様に使うのほうが、良いruby信者に成れる気がする。
505デフォルトの名無しさん:2009/10/02(金) 05:36:40
irb> s = "11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69"
irb> puts s.split[6]
この、文字列を抽出したいんdesu.

空白で区切られた7フィールド目という意味ならこれでいいのでは
フィールド内に半角空白が混じっても構わないという条件だととたんに面倒になるが
506503:2009/10/02(金) 06:02:35
>>505
レスありがとうございます。
すみません、確かにサンプルに限定すればそれで解決ですね。

ただ、やりたいのは日本語部分(日本語文字列に付随する記号類、英数字は抽出対象とする)の抽出なのです。
質問の書き方が悪かったのですが、おっしゃる通り、日本語列の中の空白、記号、英数字、
もしくは日本語列の先頭・末尾の半角英数字、記号類は抽出したいんです。
(日本語列と結合していない日本語以外(英数字、記号、空白類)は除外)
507デフォルトの名無しさん:2009/10/02(金) 06:13:51
結合ってなんだ?
508503:2009/10/02(金) 06:21:11
>>507
付随と同義です。ややこしくてすみません。
文字列の結ご・・・連結ですね。すみません。
509デフォルトの名無しさん:2009/10/02(金) 06:46:02
>>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.
510デフォルトの名無しさん:2009/10/02(金) 10:01:18
>>503
>>509のようにsplitで配列にしてからfind_allでもいいし
文字列に繰り返し正規表現をしたいのならscanてのもある
Array,String,Hash,Enumerableあたりのメソッドは軽くリファレンスに目を通しておくといいよ
へぇこんなのあるんだっていう程度でも使う時に思い出せる
511デフォルトの名無しさん:2009/10/02(金) 10:02:44
-Ksを指定するとShift_jis全角文字も\wでマッチするようになる
512デフォルトの名無しさん:2009/10/02(金) 10:18:29
>>511
「も」では駄目だろ
英数字記号だけの場合はマッチしてはいけない
irb> /\w/ =~ "あういえ".tosjis
nil
irb> $KCODE = 's'
irb> /\w/ =~ "あういえ".tosjis
0
irb> /\w/ =~ "a"
0

全角文字(と場合によっては半角カタカナ)にのみマッチする正規表現か、
英数字記号だけにマッチして全角区域に誤爆しないという正規表現が必要
513デフォルトの名無しさん:2009/10/02(金) 10:32:08
>>512
ああすまん-Ksにして結果が変わった原因ってことで書いただけなんだ
514デフォルトの名無しさん:2009/10/02(金) 11:09:04
ruby って、ライブラリやクラスメソッドの使い方を
覚える言語ってことですか?

515デフォルトの名無しさん:2009/10/02(金) 11:10:33
オブジェクト指向言語は大体そんなもんだ
516デフォルトの名無しさん:2009/10/02(金) 11:26:59
大抵のプログラミング言語において、文法なんて数時間で全部理解し終えるもんだからなあ。
後は当然ライブラリの使いこなしってことになるだろう。
517デフォルトの名無しさん:2009/10/02(金) 11:32:04
クラスメソッドよりもインスタンスメソッドのほうが多いよ!
とかそんな話を

別に覚えなくてもいいけど、その場合はライブラリに相当するものを全部自力で作ることになる
どっちか気に入ったほう選んでくれ
518デフォルトの名無しさん:2009/10/02(金) 13:13:39
Windows版のRubyって、OpenSSLも使えるんでしょうか。
知っている人がいたら教えてください。
519デフォルトの名無しさん:2009/10/02(金) 13:22:50
パッケージ次第だった気もするけど、基本的に使える
520デフォルトの名無しさん:2009/10/02(金) 13:24:35
>>518
推奨されてるパッケージでインストールする限りは使えるはず

他の人のWindows版でも絶対に使えるとは限らないのは他のOS版のRubyと同じ
521デフォルトの名無しさん:2009/10/02(金) 13:42:25
ありがとうございます。
RSAの仕組みを勉強するのにRubyを使うことにします。
522デフォルトの名無しさん:2009/10/02(金) 14:40:48
rubyでは、値がすべてオブジェクトということは
1という数値や"太陽パクパク"という文字列や、それらを代入した
number,sun_eaterといった変数もオブジェクトということですか?

number = 1
sun_eater = "太陽パクパク"
523デフォルトの名無しさん:2009/10/02(金) 14:59:20
>>522
整数とかはさすがに高速処理するように小細工を施してはありますが、
それらも含めオブジェクトは全部クラスのインスタンス(=オブジェクト)です

irb> p 1.class
Integer
irb> p "太陽パクパク".class
String

変数はオブジェクトについたラベルです
ラベル名 → オブジェクトID
というような対応表を Ruby が管理していて、
該当ラベルの変数が呼ばれたときにはその表の対応を参照して該当オブジェクトが使われます
変数というハコが入れ物オブジェクトとして存在するわけではありません

irb> p 1.object_id
3
irb> p "太陽パクパク".object_id
-605838888
524デフォルトの名無しさん:2009/10/02(金) 15:06:21
>>522
>rubyでは、値がすべてオブジェクトということは
>1という数値や"太陽パクパク"という文字列や、それらを代入した
>number,sun_eaterといった変数もオブジェクトということですか?

数値や文字列もオブジェクト。

ただし、「変数」はそれらオブジェクトを格納するもの(あるいはオブジェクトとひもづけるもの)であって、オブジェクトそのものではない。
そのへんは他の言語でも同じ。
525デフォルトの名無しさん:2009/10/02(金) 15:08:38
>>523
変数はオブジェクトじゃなくラベル。
あやうく、間違った認識で通り過ぎるところでした。
ありがとうございます。
526デフォルトの名無しさん:2009/10/02(金) 15:10:25
>>524
他の言語でも同じなんですね。ありがとうございます。
527デフォルトの名無しさん:2009/10/02(金) 15:50:19
C++、Perlでは宣言された変数自体がオブジェクトの実体であるケースもあるけどね
と、話をややこしくしてみる
528デフォルトの名無しさん:2009/10/02(金) 17:55:56
他言語がどうであれ、Rubyにおいて変数は箱ではなくラベルなのは間違い無い
沢山あるオブジェクトの中のいくつかに名前を付けるのが変数
1つのオブジェクトに複数の名前があることも珍しくないし
無名のまま役割を終えるオブジェクトも存在する
529デフォルトの名無しさん:2009/10/02(金) 17:58:09
だいなみっくえいりあしんぐ
530デフォルトの名無しさん:2009/10/02(金) 18:04:25
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">などに置換?
です、見当がつきそうな方はどうかご教授ください。
531デフォルトの名無しさん:2009/10/02(金) 18:26:40
オブジェクトについて、もうひとつ質問です。
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がオブジェクトになるのでしょうか?

532デフォルトの名無しさん:2009/10/02(金) 18:29:10
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]
533デフォルトの名無しさん:2009/10/02(金) 18:31:30
Ruby標準のCGIクラスって、どれぐらいの大きさのデータを受け取れるのでしょうかね?
DBの内容をWeb上からバックアップ(DL)したり、復帰させたり(UP)するシステムを考えてるのですが
バックアップするときは、ストリーミングで流せばいいような気がするけど
復帰させるときは、大量のデータが一度メモリに溜め込まれる気がします

たとえば、サーバの実メモリを超えるようなデータを受け取ったときに処理できるのか?っていうのが疑問です。
また、なにか回避策が有るのでしたら、教えてください。
534デフォルトの名無しさん:2009/10/02(金) 18:35:45
ワイルドカードの展開ってシェルの役割じゃ・・・?
と思ったらWinではやってくれないのか
535デフォルトの名無しさん:2009/10/02(金) 18:39:19
536デフォルトの名無しさん:2009/10/02(金) 18:42:14
>>532
ARGV の処理は環境依存
コマンドプロンプトで

DIR 本/*

とやって、望みの出力が得られなければ ARGV では無理というかコマンドプロンプトの使い方の知識が足りない
537532:2009/10/02(金) 18:50:17
>>536

それはうまくいきます。/の代わりに\ですが。

>dir 本\*
ドライブ D のボリューム ラベルは以下略

>ruby -e "p ARGV" hon\*
["hon/新規テキスト ドキュメント.txt"]

英字は/でも\でもok

>ruby -e "p ARGV" 本\*
["本\\*"]

漢字はどっともだめ
538532:2009/10/02(金) 18:55:24
書き忘れ

>ruby -e "p ARGV" */*
["hon/新規テキスト ドキュメント.txt", "本/新規テキスト ドキュメント.txt"]
539デフォルトの名無しさん:2009/10/02(金) 18:56:09
>>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
540デフォルトの名無しさん:2009/10/02(金) 18:59:22
>>532
WinXP SP2 + ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
だけど展開してくれた。なんなんだろうね
541540:2009/10/02(金) 19:02:24
SP3だった・・・

あとコマンドプロンプトから動かしてる?
専用エディタとかから走らせたりしてると挙動が違ってくるかも
542デフォルトの名無しさん:2009/10/02(金) 19:03:55
>>532
ren 本 書
ruby -e "p ARGV" 書/*

1.9のglob周りは多バイト文字に関しては腐ってるね。
543デフォルトの名無しさん:2009/10/02(金) 19:04:15
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]だとできなくなってるな
544532: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"]
545デフォルトの名無しさん:2009/10/02(金) 19:14:53
Ruby Freaks Lounge 第8回 Windows版Ruby 1.9で培う危機回避スキル(前編)
http://gihyo.jp/dev/serial/01/ruby/0008

Rubyで日本語ファイル名と聞いた瞬間に悪寒がする漏れは正しかった
546539:2009/10/02(金) 19:16:56
とりあえずレスの全データを扱いやすい形に整えないと見通し的にどうにもならないような気がしたので、
たとえばこんなクラスを作る
動作は超適当
変数名も適当
レス本文のHTMLタグとかを消したい場合は parse_res のとこで適当に追加してくれ
クラスでなくてもでっかいハッシュや配列を作るのでもいいんだけど面倒だったのでクラスにした
547デフォルトの名無しさん:2009/10/02(金) 19:19:00
日本語とかマジで廃止しろよ
100年前に廃止してくれてれば今頃こんな苦労することも無かった
548デフォルトの名無しさん:2009/10/02(金) 19:23:46
>>547
PC/AT互換機使うのいますぐやめろ
元凶はそれだ
ずっとNECなら日本語処理は完璧だったのだ
549デフォルトの名無しさん:2009/10/02(金) 19:24:14
たいした苦労もしてないくせに
550デフォルトの名無しさん:2009/10/02(金) 19:25:48
悪いのはシフトJISだよ
日本語は悪くないよ
EUCばんざーい
551デフォルトの名無しさん:2009/10/02(金) 19:29:40
もはや現実逃避しかないのか・・・・・・w
552デフォルトの名無しさん:2009/10/02(金) 19:35:07
松江市さんは、rubyのドキュメントをしっかりしたものに
してください。
553デフォルトの名無しさん:2009/10/02(金) 19:40:25
>>533
>たとえば、サーバの実メモリを超えるようなデータを受け取ったときに処理できるのか?っていうのが疑問です。

添付ファイルデータなら、cgi.rb が一時ファイルに書き出してくれるので、実メモリを超えても大丈夫なんじゃないかなあ。

>また、なにか回避策が有るのでしたら、教えてください。

そのような場合は、cgi.rbを使わず、自前で$stdinからPOSTデータを読み出したほうがいいと思います。


554デフォルトの名無しさん:2009/10/02(金) 19:58:15
>>548 78JISに拘泥して混乱を広げた元凶だということも知らずに呑気な馬鹿だ。
555デフォルトの名無しさん:2009/10/02(金) 20:01:03
>>542 で必要最低限のことは全部触れられていそうだな

「本」をShift_JISとして見ると2バイト目が { なので、rubyのglob特殊文字になる。
というわけで、1.9では、2バイト目がrubyのglob特殊文字になる文字列をコマンドライン引数に与えると危ない、と。
556デフォルトの名無しさん:2009/10/02(金) 20:04:04
文字のエンコードが1種だけなら問題ないという話だろ
557デフォルトの名無しさん:2009/10/02(金) 20:14:38
勉強せずにスラスラ英語の文書読めるプログラマと、毎日英語と奮闘してるプログラマ
どれだけ差が開くと思う?
つまり日本がこの業界でアメリカに勝てないのは必然だ
558デフォルトの名無しさん:2009/10/02(金) 20:20:16
単なるrubyのバグの話でしょ
559デフォルトの名無しさん:2009/10/02(金) 20:24:39
Rubyに限らず
引数の文字コードって
どんなふうに判別するものなんだろう?
560デフォルトの名無しさん:2009/10/02(金) 20:35:10
引数の文字列自体はWindows-31Jにしてくれてるぞ
561デフォルトの名無しさん:2009/10/02(金) 23:35:11
インターネット時代なんだしJISで統一すれば何もかもうまく逝ってけどな。
いまからならOSもメールもウェブもUTFで統一。
562デフォルトの名無しさん:2009/10/02(金) 23:42:47
文字コードとかごちゃごちゃし過ぎて分からんから指定できるところはとりあえず全てUTF-8にしてる。
特に問題が起きたことはない。
563デフォルトの名無しさん:2009/10/02(金) 23:43:48
Win32で1.9.2プレビュー1をビルドしようとしたができんw
clにminiprelude.cがないぞゴルァって言われる
あるしちゃんとインクルードパスにも入ってるのに・・・
564デフォルトの名無しさん:2009/10/03(土) 01:45:15
>>546
おお、ありがとうございます。
しかしこれからどうしたらいいのか全然アイディアが浮かばないんです。
どういう方向性でいけばいいのでしょうか。
565デフォルトの名無しさん:2009/10/03(土) 02:06:27
>>564
わかんねーときは、わかる機能だけで作ってみるといいよ
ゴールを遠くに設定しすぎてるから方向わからないんだよ、チェックポイント作りまくれ
566デフォルトの名無しさん:2009/10/03(土) 05:59:16
いきなり無茶し過ぎなんだろ。小さい所から順々にステップアップしないと。
567デフォルトの名無しさん:2009/10/03(土) 14:37:28
とあるフォルダの中のファイル名をずらーっとデータベースに入れたのは良いんですが、
この後ファイルがそのフォルダに追加されるごとにデータベースも更新したいです。
差分を取る方法を教えてください。
568デフォルトの名無しさん:2009/10/03(土) 14:39:12
>> [1,2,3]-[1]
=> [2, 3]

ファイルリスト程度ならオンメモリで余裕だろう
569デフォルトの名無しさん:2009/10/03(土) 14:49:58
データベース自体は Ruby 以外を使うか、pstore に保存して cron とかで毎回読んでくれ
570デフォルトの名無しさん:2009/10/03(土) 15:23:49
>>565
>>566
なるほど、そういう考えもありますね。
もうちょっとこつこつやるべきでした、ありがとうございます。
571デフォルトの名無しさん:2009/10/03(土) 19:30:46
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にアクセスするにはどうしたらいいですか?
よろしくお願いします
572デフォルトの名無しさん:2009/10/03(土) 19:40:01
rquireは、対象コードをその位置に展開するメソッドではない。
中身が何でも気にしないなら eval File.read('sub.rb') とでも。
573デフォルトの名無しさん:2009/10/03(土) 19:43:37
>>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')
574571:2009/10/03(土) 19:57:00
>>572,573
レスありがとうございます。言葉足らずですいません・・・
sub.rbにはclassも書いてあるのでその場に展開されるとエラーになります・・・
sub.rbに書いてあるクラスをsub.rb内で初期化してそのオブジェクトをmain.rbの
方に持ち帰りたいです(プラグインシステムみたいな感じ)
グローバル変数を使えば出来るようですがあまりスマートじゃない感じですので
もうちょっとすっきりする方法があればと・・・

よろしくお願いします
575デフォルトの名無しさん:2009/10/03(土) 20:16:58
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



576571:2009/10/04(日) 15:48:48
>>575
extendで何とかなりました
ありがとうございました
577デフォルトの名無しさん:2009/10/05(月) 18:06:53
ちょっとした質問です。

items.each{ |x| x.destroy }
というようなこう全部の要素にたいしてメソッドを呼ぶのを
もっと簡単に書く方法があったような気がしたのですが、ご存知ありませんでしょうか?

Ruby 1.8.7です。
578デフォルトの名無しさん:2009/10/05(月) 18:09:46
&:destroy
579デフォルトの名無しさん:2009/10/05(月) 18:11:34
>>578
それだ!

items.each(&:destroy)

でいけましたありがとうございました。
580デフォルトの名無しさん:2009/10/05(月) 18:21:21
1.8.6 では動かないから配布には注意な
581デフォルトの名無しさん:2009/10/05(月) 21:11:40
1.8.6 なんてもう使わない方がいいよ
582デフォルトの名無しさん:2009/10/05(月) 22:36:26
>>581
なんで?
583デフォルトの名無しさん:2009/10/05(月) 22:49:02
>>581さんがサーバソフトウェアのリプレースを行ってくれるそうです
584デフォルトの名無しさん:2009/10/05(月) 23:38:28
感謝の印におっぱい見せろ
585デフォルトの名無しさん:2009/10/05(月) 23:39:11
ごばくった。すまん
586デフォルトの名無しさん:2009/10/05(月) 23:44:01
>>584-585
wwwwww
587デフォルトの名無しさん:2009/10/06(火) 06:33:24
お礼におっぱいを要求するような人間が使う言語、それがRuby
588デフォルトの名無しさん:2009/10/06(火) 10:13:13
だがそれがいい
589デフォルトの名無しさん:2009/10/06(火) 12:14:57
テンプレに追加しといて。

質問する人へ:
回答をいただいたら、ありがとうの言葉とともに、感謝の印としておっぱいを見せましょう。
590デフォルトの名無しさん:2009/10/07(水) 08:45:57
教祖もおっぱい成人だったか。
591デフォルトの名無しさん:2009/10/07(水) 17:45:26
>>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 を越えないのでしょうか?
592デフォルトの名無しさん:2009/10/07(水) 18:00:48
require や load した場合、ローカル変数だけは、ファイルごとにスコープがあります
ローカル変数という概念を保護する制限だと思ってくだされ

require ではなく Ruby スクリプトファイルとして読み込んで実行することで制限を乗り越えることができますが勧めません
ファイルとモジュールの構造を変えることのほうを強く勧めます
593デフォルトの名無しさん:2009/10/07(水) 18:09:36
数字をキーに持つハッシュがあり
その中で一番小さい数のキーの値を取り出したいのですが
単純に書くと以下になるんですが
他に何かこれだという方法はないでしょうか?

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されるという理解でいいですか?
595デフォルトの名無しさん:2009/10/07(水) 18:15:16
>>593
素直に書くなら
h[h.keys.min]
596デフォルトの名無しさん:2009/10/07(水) 18:18:42
>>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から何かの数字を得ているようなのですが
どういう動きをしているんでしょうか?
598デフォルトの名無しさん:2009/10/07(水) 18:24:35
そのような目的に使うデータ構造としては、ヒープツリーや優先順位つきキューというものがあり、
Rubyには長らくこれが標準だというような実装がなかった。ので、自分で作るか、
既存のものをさがすかということになります。

以下、最近できたものなので、あるよ、という紹介しかできませんが、
depqという優先順位つきキューのgemがあります(あるはずです)。
ttp://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-dev/39248?39066-39441
599デフォルトの名無しさん:2009/10/07(水) 18:25:21
>>598>>593あてね
600デフォルトの名無しさん:2009/10/07(水) 18:25:45
>>596
考えていたことと逆でした。ありがとうございます。
601デフォルトの名無しさん:2009/10/07(水) 18:35:10
>>597
ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#printf
ttp://www.ruby-lang.org/ja/man/html/sprintf_A5D5A5A9A1BCA5DEA5C3A5C8.html

個人的には Ruby ではないので嫌い
to_s で問題の起こらない範囲で
puts "#{rows} rows were inserted"
と書くべき
602デフォルトの名無しさん:2009/10/07(水) 18:40:22
>>601
String#%は?
603デフォルトの名無しさん:2009/10/07(水) 18:42:04
>>602
異端審問される恐れがあるので
人前に晒すスクリプトでは使わないように
604デフォルトの名無しさん:2009/10/07(水) 18:44:10
スタイルの押しつけうぜぇ
605デフォルトの名無しさん:2009/10/07(水) 18:57:14
個人的にString#%は蛇道
606デフォルトの名無しさん:2009/10/07(水) 18:57:21
>>601
どもです。putsに書き換えて実行したところ同じように出ました。

どこから、4という数字を得ているのでしょうか? 上の式だとdbh以下を実行して
4つの要素をDBに登録していますよね。
607デフォルトの名無しさん:2009/10/07(水) 18:57:53
>>604
Ruby使うの今すぐやめれ
プログラミングスタイル強制要素が無数に散りばめられてるぞ
608デフォルトの名無しさん:2009/10/07(水) 18:58:58
>>601
君にはPythonが向くんじゃないかな?性格的に。
609デフォルトの名無しさん:2009/10/07(水) 19:02:23
>>608
sprintf は Ruby のものではないということを知らない?
610デフォルトの名無しさん:2009/10/07(水) 19:04:06
>>606
そりゃそういうふうに作られてるからだろ
do のマニュアル読め
わざわざカウントして数値を返してるようなので初心者殺しではある
611デフォルトの名無しさん:2009/10/07(水) 19:10:25
sprintf と pack/unpack は「Ruby らしい」糖衣実装が望まれていながら、
ダラダラと旧来の仕様を引きずってきたんだよな
オタクが他の言語の知識を流用できて便利というただそれだけの理由で
612デフォルトの名無しさん:2009/10/07(水) 19:14:00
>>611
あれは正規表現みたいなサブ言語だと思って諦めるのが吉かと思われます
確かに覚えにくいしなんとかしたほうがいいのは確かなんだけれど
あれをまたまとめて別途組み立ててしまうとそれだけで結構な一覧表に
613デフォルトの名無しさん:2009/10/07(水) 19:17:18
>>610
どもっす。doのマニュアルを探してきます。

614デフォルトの名無しさん:2009/10/07(水) 19:18:04
printf類にrubyらしい実装なんて不要
他の言語と違う動作されたらそれこそ非難の的
615デフォルトの名無しさん:2009/10/07(水) 19:24:33
prntf などの「メジャーな関数」をなくせという話ではないように読めるが
616デフォルトの名無しさん:2009/10/07(水) 19:25:25
>>611
sprintfは別言語でそれやられて大迷惑
>>612も言ってるけどいまさら別に覚えるのも嫌だから
今までと同じでいいよ・・・
617593:2009/10/07(水) 19:27:45
>>595
minですね
探し切れてませんでした
ありがとうございます

>>598
なるほど、確かに求めてるのはヒープみたいなものでした
参考になりましたありがとうございます
618デフォルトの名無しさん:2009/10/07(水) 19:32:02
別にみんな自由に書けばいいじゃんw
Obsoleteでもない限り機能として用意されてるんだから使えばいいし
「個人的に嫌い」な人が大半になればそれを使わないのがデファクトスタンダードになるだけだし
619591:2009/10/07(水) 19:37:20
どうもありがとうございました >>592

うーん、もうちょっと明示的にスコープの話が書いてあると嬉しいような。
http://doc.okkez.net/static/187/method/Kernel/m/require.html
http://doc.okkez.net/static/187/method/Kernel/m/load.html
620デフォルトの名無しさん:2009/10/07(水) 19:56:18
ruby/dbiの公式に行きまして、classデータベースというページがあり
メソッドの説明がしてありました。しかし、記述が少ししかなく。
こういう場合、ソースを読むんでしょうか?

とりあえず、今は目的に必要なことだけをやっていこうと思います。
621デフォルトの名無しさん:2009/10/07(水) 20:06:32
>>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 で出力している。そんだけ。
622デフォルトの名無しさん:2009/10/07(水) 20:29:41
>>620
ググったら公式じゃないけどこんなページがあったよ
ttp://www.nslabs.jp/book2-dbi.rhtml
623デフォルトの名無しさん:2009/10/07(水) 20:31:28
>>618
選択肢がないという話では
624デフォルトの名無しさん:2009/10/07(水) 20:35:37
>>623
>>602-603がそうはとても見えない
625デフォルトの名無しさん:2009/10/07(水) 20:38:34
>>624
sprintf 使ったことある?
626デフォルトの名無しさん:2009/10/07(水) 20:45:18
>>625
sprintf系まとめて異端だったの?
>>603は「(sprintfはまだしも)String#%は使うな」と言ってるんだと思ってたけど
627デフォルトの名無しさん:2009/10/07(水) 20:51:44
C に由来する sprintf や pack/unpack の書式記号や利用法が Ruby らしくないというツッコミなんじゃ…
628デフォルトの名無しさん:2009/10/07(水) 20:57:52
pack系はともかくsprint系に選択肢ないか?
629デフォルトの名無しさん:2009/10/07(水) 21:02:21
>>603はどう考えてもネタです
630デフォルトの名無しさん:2009/10/07(水) 21:04:49
pack は map で直接書くというコードの動作的にはある意味わかりやすい代替手段が
631デフォルトの名無しさん:2009/10/07(水) 21:27:58
しかしprintfを非難するとはいい度胸だ…これも平成ゆとりが増えたからなのか…
632デフォルトの名無しさん:2009/10/07(水) 21:33:55
packにせよprintfにせよ、DSLは不思議と好き嫌いが分かれる気がする
633デフォルトの名無しさん:2009/10/07(水) 21:34:36
>>631
「わかりにくい」ことは確か
初心忘れると老害と罵られるぞ
634デフォルトの名無しさん:2009/10/07(水) 21:37:58
反printf派に聞きたいんだけど
今より使いやすい(Rubyっぽい)printf構文ってどんなの?
635デフォルトの名無しさん:2009/10/07(水) 21:39:17
とりあえず「詳しくはmanページ読んでね」というのは頂けないな
「正規表現はPerlと同じ物が多いので同じ場合はそちらを」は通用しないのに
636デフォルトの名無しさん:2009/10/07(水) 21:40:14
>>633
packは使ったこともないし使う場面もないから構文すら知らない。
rubyでdef endしちゃうから今後も使うことはないだろう。
637デフォルトの名無しさん:2009/10/07(水) 21:40:50
$と記号1つのグローバル変数(今となっては排除したいらしいが)も、
「Perlといっしょ」で通じなくなってきてるからな…
638デフォルトの名無しさん:2009/10/07(水) 21:42:04
printfを知らないとなると、rubyしか触ったことないってことになるんだがな…
webクリエータはたいてい適当だしそんなもんかw
639デフォルトの名無しさん:2009/10/07(水) 21:43:00
>>636
バイナリファイルのヘッダパースとかどうやってやってるの?
640デフォルトの名無しさん:2009/10/07(水) 21:43:31
>>636
irb1.8> p "ルビー"
"\343\203\253\343\203\223\343\203\274"

これ日本語に戻してー
641デフォルトの名無しさん:2009/10/07(水) 21:44:32
>>638
お前puts使わないだろ
642デフォルトの名無しさん:2009/10/07(水) 21:47:39
>>636
1.8でUnicodeEscapeSequence文字列が欲しいです先生
643デフォルトの名無しさん:2009/10/07(水) 21:49:20
>>640
evalしろ
644デフォルトの名無しさん:2009/10/07(水) 21:50:35
packはまあ・・・・使う時にリファレンスを見てやるしかないな

一方、青木氏はpackで壊れた
>まったくpackの意味不明さときたら、
>「packのテンプレートがわからなくたって悔しくなんかないんだからな! バーカバーカ!」
>と幼児退行してみたくなるほどです。
645デフォルトの名無しさん:2009/10/07(水) 21:52:37
>>643
こういう文字列をevalしろとな
646デフォルトの名無しさん:2009/10/07(水) 22:09:18
青木氏って2chねら?
647デフォルトの名無しさん:2009/10/07(水) 22:27:52
ttp://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
このファイルが開けないのですが、どーすれば良いのでしょうか。
648デフォルトの名無しさん:2009/10/07(水) 22:31:52
>>647
中身がタブ区切りのtsvだからです
っていうかファイルの中身確認することくらいしようぜ
649デフォルトの名無しさん:2009/10/07(水) 22:34:21
putsすると日本語でも表示されるよね
sjis問題で文字化けはするけど
650デフォルトの名無しさん:2009/10/07(水) 22:44:34
gets, puts ってのはもろにCだと思うんだが・・・
651デフォルトの名無しさん:2009/10/07(水) 22:55:35
え・・・そうだと思うけどなんか違った・・?
652デフォルトの名無しさん:2009/10/07(水) 23:28:42
visualstudioみたいにボタンとかを貼り付けて入力フォームが作りたいんですが
ああいうツールは無いんでしょうか?
653デフォルトの名無しさん:2009/10/07(水) 23:32:42
CentOS上でruby1.8.7から1.9にアップデートしたいのですが、
Linuxの知識に乏しいためなかなか手が付けられません。
1.8.7のインストールはネットで調べつつなんとかソースコードから入れました。
一般的にはどのような手段でアップデートするのでしょうか?
654デフォルトの名無しさん:2009/10/07(水) 23:34:49
>>653
このスレ的には Debian にしろって言われると思うが。
655デフォルトの名無しさん:2009/10/07(水) 23:34:51
> Linuxの知識に乏しいためなかなか手が付けられません。
じゃあ無理だ
諦めろ
あとスレ違い
656デフォルトの名無しさん:2009/10/07(水) 23:39:29
こういう奴は何しにこのスレに張り付いてるんだろうか
657デフォルトの名無しさん:2009/10/07(水) 23:41:38
>>656
わりと適切だと思うが…
Linux使ったことあるか?
658デフォルトの名無しさん:2009/10/07(水) 23:43:45
make がなにやってるか理解しないといかんからなー
それはこのスレの範囲を超える
パッケージがないなら諦めれ
659デフォルトの名無しさん:2009/10/07(水) 23:44:01
貼りついてるw
660デフォルトの名無しさん:2009/10/07(水) 23:44:15
もろスレ違いだと思うが。
661デフォルトの名無しさん:2009/10/07(水) 23:44:52
Ruby公式ページにインストールガイドってリンクあるからみればいいよ
662デフォルトの名無しさん:2009/10/07(水) 23:48:54
教祖も使っているDebian最強

aptitude install ruby
663デフォルトの名無しさん:2009/10/07(水) 23:49:18
Linux上で、しかもLinuxに関する知識がないのなら
パッケージ管理システム(aptやyum)を使え、としか
664デフォルトの名無しさん:2009/10/07(水) 23:54:26
>>662
1.9.1は存在しない(Sid除く)
665デフォルトの名無しさん:2009/10/07(水) 23:58:14
この場合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 の関数で違う物は在るのでしょうか?
668デフォルトの名無しさん:2009/10/08(木) 00:54:47
フィッシングタイムですか?
669デフォルトの名無しさん:2009/10/08(木) 00:58:16
邪魔しないでください >>668
670デフォルトの名無しさん:2009/10/08(木) 01:05:11
>>667
全体的に大阪弁と東北弁ぐらいの違い
671デフォルトの名無しさん:2009/10/08(木) 01:09:16
>>667
片方が使えるなら、もう片方もさほど苦労しない
672デフォルトの名無しさん:2009/10/08(木) 01:53:24
gems.rubyforge.orgにgemでアクセスできなくない?
673デフォルトの名無しさん:2009/10/08(木) 15:57:30
rubyが司る世界において

数字の1が生まれたら、それは数字クラスに所属していて
数字クラスのメソッドにない動きは出来ないってことですか?

674デフォルトの名無しさん:2009/10/08(木) 16:10:39
Rubyには、オブジェクト(インスタンス)ごとにメソッドを定義できる、
特異メソッドという仕組みがあるので、たいていのクラスでは、イン
スタンスごとに振る舞いを変えることができる。
しかしながら、数(Numericおよびサブクラス)にはこれが定義できない
ように制限されている。

なお、数インスタンスが生まれた後に、数クラス自体にインスタンスメ
ソッドを追加した場合、既存の数インスタンスでも使える。
675デフォルトの名無しさん:2009/10/08(木) 16:21:33
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!"
ああ、わかりやすいエラーだ
676デフォルトの名無しさん:2009/10/08(木) 16:26:28
>>673
一般的にはそう
クラスに定義された動作(メソッド)のみが可能
ただし Ruby はオープンクラスだから、自分でクラスを拡張してメソッドを追加変更することができる
ある人の String クラスにあるメソッドが、 別の人の String クラスにもあるとは限らない
ある人の作った String のインスタンスが、別の人の作った String のインスタンスと全く同じ動作をする保証はない
ただ、組み込みクラスのメソッドやライブラリ標準メソッドの上書きは自己責任なので気にしなくてよい

それと整数クラスは>>674の言うように例示にはちょっと不適
677デフォルトの名無しさん:2009/10/08(木) 18:34:07
>>675
数字と数の違いか:-p
678デフォルトの名無しさん:2009/10/09(金) 11:22:07
M1::C1::C2 というネストしたクラスがあります
あるオブジェクトが M1 を「ネスト構造上含んで」いるかどうかを調べたいです
文字列として正規表現で比較するしかありませんか?

obj.class.to_s =~ /\AM1::/
679デフォルトの名無しさん:2009/10/09(金) 11:56:18
>>678
どんな場合にも動作するのは文字列としての比較
Module.nesting が使えることも多いが、特定条件で存在できないモジュールオブジェクトを指定できない
680デフォルトの名無しさん:2009/10/09(金) 11:58:02
C → Java → Ruby と勉強してきましたが、次の言語は何がいいと思いますか?
プログラミングは単なる趣味です。
681デフォルトの名無しさん:2009/10/09(金) 11:58:52
Haskell
682デフォルトの名無しさん:2009/10/09(金) 12:08:49
Lisp系列が足りないな
683デフォルトの名無しさん:2009/10/09(金) 14:20:33
>>680
趣味というなら、マイナー言語でもいいよね。
Rubyとは真逆の、静的な関数言語がいいんじゃないかな。
OCamlかHaskellあたり。どちらも日本語での入門書があるし。
684デフォルトの名無しさん:2009/10/09(金) 15:10:41
railsで、webアプリを作るのに
必要な知識ってなんですか?

ruby
rails

正規表現
html,xhtml,xml
javascript
mysqlなどRDMS
apacheなどhttpサーバー

こんなもんでしょうか?
685デフォルトの名無しさん:2009/10/09(金) 15:15:04
>>684
他の言語でフレームワークべったりでないWebアプリケーションを作ることができれば問題なし
なんじゃそりゃって感じだけど、まず間違いない

あとRailsは板違いなので
【Ruby】Ruby on Rails Part8
http://pc11.2ch.net/test/read.cgi/php/1252842574/
こっち池
686デフォルトの名無しさん:2009/10/09(金) 15:15:17
>>681-683
サンクス。

OCamlかHaskellあたりがお薦めなんですね。
了解しました。
687デフォルトの名無しさん:2009/10/09(金) 15:20:43
>>685
どもっす。半年間精進してダメなら諦めます。
688デフォルトの名無しさん:2009/10/09(金) 15:40:15
rspec 版の testrb コマンドってありませんか?
689デフォルトの名無しさん:2009/10/09(金) 15:48:15
>>688
spec -fs -c spec/
690デフォルトの名無しさん:2009/10/09(金) 15:54:54
>>689
1578 examples, 0 failures

っひょー
691デフォルトの名無しさん:2009/10/09(金) 16:28:14
>>690
おまえすごいな
692デフォルトの名無しさん:2009/10/09(金) 16:32:09
個人でもちょっと規模大きければこんなもんだろ
693デフォルトの名無しさん:2009/10/09(金) 17:31:04
俺レベルになるとワンライナーで大企業の基幹システムを作れるようになる
694デフォルトの名無しさん:2009/10/09(金) 17:45:04
rspec 使ってるとテストはやたら増える
695デフォルトの名無しさん:2009/10/09(金) 18:08:57
無印のサイトはシェルやワンライナーで作ってる、なんて言ってたけど、
どーりで重いわけだと思ったよ
696デフォルトの名無しさん:2009/10/09(金) 22:44:18
初心者らしい話題

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を返してほしい。
697デフォルトの名無しさん:2009/10/09(金) 23:17:14
CArray というクラス名に吐いた

class CArray < Array
def +(v); self.class.new(super(v)); end
end
698デフォルトの名無しさん:2009/10/09(金) 23:58:05
a[0..1]みたいなのはちゃんと元のクラスにやってくれるんだよね
699デフォルトの名無しさん:2009/10/10(土) 00:22:00
Array や String の(Cで記述した) + メソッドの定義の中で
Array.new や String.new がハードコーディングされてるんだろうな
何らかのシステム的理由があるか、いまさら変更できないか、どっちかだろう
まあ、バグっちゃバグかもしれん
700デフォルトの名無しさん:2009/10/10(土) 01:13:02
>>698
むしろそっちのほうの挙動が不思議
Stringクラスの実装はCStringを知らないはずなのに、
どうしてCStringオブジェクトを返せるんだ?
701デフォルトの名無しさん:2009/10/10(土) 01:28:37
インスタンスがあればクラスわかるから返せるにきまっとるわい
702デフォルトの名無しさん:2009/10/10(土) 02:03:22
superのnew呼び出しでself.class.newってやるのきもくね?
703デフォルトの名無しさん:2009/10/10(土) 02:10:19
継承を前提としたクラスならってところ
組み込みでいえばIOとかNumericあたり

というか、otherと絡むときにわざと基本クラス返してる気がするなぁ
704デフォルトの名無しさん:2009/10/10(土) 03:07:56
レヴェルの低いインターネッツだな
705デフォルトの名無しさん:2009/10/10(土) 03:22:09
組み込みのくみこちゃんをdisるのはやめろ
706デフォルトの名無しさん:2009/10/10(土) 07:06:39
>>703
あらゆるクラスは継承で動作可能「でなければならない」
継承したとたん動作しなくなるライブラリはプギャー
707デフォルトの名無しさん:2009/10/10(土) 07:26:07
それぞれArrayを継承したFooとBarがあったとして foo + bar がどのクラスを返すべきかとか考えると
>>703の言うようにわざと基本クラスを返すのはありなんじゃないかと思う
708デフォルトの名無しさん:2009/10/10(土) 07:31:28
>>707
> foo + bar がどのクラスを返すべきか
変換っぽいメソッドでない限り、通常はレシーバのクラスを返すべき
つまり、foo のクラスを返すべき
709デフォルトの名無しさん:2009/10/10(土) 07:54:09
このパッチをあててリビルドすれば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));
710デフォルトの名無しさん:2009/10/10(土) 08:07:52
本当にそのほうがいいと思うなら、
redmine.ruby-lang.orgにfeature request投げとけば。

個人的には、両方のクラスが同じときだけにすべきじゃないかと思うが。

あと2chに初出のコードは著作権的に取り込むのは危険なんじゃなかったっけ。
711デフォルトの名無しさん:2009/10/10(土) 08:22:54
>>710
危険というか取り込み不可能
というか別にそんなことを意図したコードでもあるまい
お前空気読めないと周りから言われるか全く何も言われないかどっちかだろ
712デフォルトの名無しさん:2009/10/10(土) 08:50:19
無理矢理ねじ込んだ感バリバリの3行目に
ドカタのストレスを見た。
713デフォルトの名無しさん:2009/10/10(土) 08:56:26
言われるか言われないかのどっちかワロタ
714デフォルトの名無しさん:2009/10/10(土) 14:27:56
質問です;;
mvcモデルをつくりたいのですが、下記エラーが出て削除機能が使えません

undefined method `destroy'

destroyが使えない??
newもfindも使えるのに・・
解決法知ってる方いたら教えてください
715デフォルトの名無しさん:2009/10/10(土) 14:40:02
MVCと直接関係ない質問に見えるけど何の話?
716デフォルトの名無しさん:2009/10/10(土) 14:45:48
要するにdestroyメソッドを使う方法がわからないです
717デフォルトの名無しさん:2009/10/10(土) 14:47:12
destroyメソッドってなに?
718デフォルトの名無しさん:2009/10/10(土) 14:49:12
すいませんここはrailsは対象外なんですかね・・
他当たってみます
719デフォルトの名無しさん:2009/10/10(土) 14:51:30
>>718

RailsならRailsと言え。
MVCってのはRails固有の概念ではない。

あと、
【Ruby】Ruby on Rails Part8
http://pc11.2ch.net/test/read.cgi/php/1252842574/

720デフォルトの名無しさん:2009/10/10(土) 16:33:54
undefined method `destroy'の後が重要だったりするんだよな
721デフォルトの名無しさん:2009/10/10(土) 17:12:32
>>720
この場合はいいえ
722714:2009/10/11(日) 01:00:33
>>721
何か知ってる事あったら教えてもらえますか?
723デフォルトの名無しさん:2009/10/11(日) 01:07:07
うざ
724デフォルトの名無しさん:2009/10/11(日) 11:59:17
PStore.dump してファイルに保存済みのデータがあったとし

a = nil
PStore.new(...).transaction do |c|
a = c[:data] # Array や Hash がネストしたデータ(shallow copy では完全にコピーできない)
end

x = a[...][...].XXX[...]

というように PStore.transaction の外で読み込んだデータ
を使っても問題ないものなのでしょうか。

内部的には Marshal.load しているということなので、問題
ないような気もするのですが、ドキュメントの記述を見ると
そういう使い方していないようなかんじなので…。
725デフォルトの名無しさん:2009/10/11(日) 12:02:25
Marshal.dump は唯一、標準ライブラリで深いコピーを行う
726724:2009/10/11(日) 12:16:24
なるほど >>725 さん
PStore が Marshal 上に実装されているという前提が変わらない限りは
PStore#transaction の外にデータを持ち出しても問題ないわけですか

これまで無駄に transaction の内部にコード入れていたので書き直そう…。


727デフォルトの名無しさん:2009/10/11(日) 12:20:45
>>724
PStore#transactionは、
* 同じデータファイルに対する他のPStoreアクセスを禁止している
(読んでる間に書き換えられないように)
* ブロック処理がabortされなければ、変更の再ダンプを行う。
という感じの仕事をしている。

中で読んだデータはそのままメモリにある。ブロックを出たあと、
誰かがデータファイルを書き換えたとき、それとメモリが一致しな
いということを認識した上でなら問題ない。

728724:2009/10/11(日) 12:43:24
まさにそのあたりが気になっていた(transaction 抜けたら参照している
データがメモリ上から消えちゃう可能性があるのかなあ、とか)のです、
明快な説明どうもありがとうございました >>727 さん
729デフォルトの名無しさん:2009/10/11(日) 14:19:20
きちんとトランザクションって書いてあるだろ
トランザクション抜けたからって取得データ本体が消えるなんてことはそもそも

…実装としてありそうな気もするな
トランザクション有効中に明示的に複製してクダサーイというのはアリではある

んで、PStore#transaction は普通は File.open のようにブロック範囲を限定して使う
データを取得または保存する瞬間にだけ、トランザクションに入る
何らかの理由で複数回アクセスしたいという場合は、PStore.new のオブジェクト自身を変数で保持する

なお、 PStore は、実装の都合上「ファイル全体を最初から最後まで必ず読み込む」ので注意
変更部分に対応したファイルの一部分だけを書き換えるとか、そういう細やかな小細工は通用しない
データの大きさと更新頻度によっては複数に分けたほうが負荷的にお得
730デフォルトの名無しさん:2009/10/11(日) 14:36:09
WinでAutoHotKeyの代わりに使える機能を完備してあるライブラリってない?
731デフォルトの名無しさん:2009/10/11(日) 16:56:05
繰り返し処理で正規表現を使う場合
a.each do |b|
print "match" if c =~ /hoge/
end
よりも
reg = Regexp.new("/hoge")
a.each do |b|
print "match" if c =~ reg
end
の方がいいでしょうか?
732デフォルトの名無しさん:2009/10/11(日) 17:05:15
そういうのは正規表現の中に変数を含む場合です
733デフォルトの名無しさん:2009/10/11(日) 17:12:35
変数を #{} などで含まない「固定」の正規表現は1回しか生成されない

1.upto(10000).each do
/h/ =~ "hoge"
end

でも

re = /h/
1.upto(10000).each do
re =~ "hoge"
end

でも、Regexp のインスタンス生成は1回だけ
つまり、処理速度や負荷的には実質どちらでも構わないし、
厳密にはブロックの外の変数を参照するコストのぶんだけ後者が遅い
734デフォルトの名無しさん:2009/10/11(日) 17:34:33
>>732-733
なるほど、ありがとうございます
735724: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)とか直接与えることは出来ますか?
737デフォルトの名無しさん:2009/10/12(月) 19:13:37
0から10の範囲の乱数を発生させて10を加える。
738デフォルトの名無しさん:2009/10/12(月) 19:18:20
>>737が正解
739デフォルトの名無しさん:2009/10/12(月) 19:21:25
俺俺ライブラリに

class Range
  def rand
     Kernel.rand(last-first+1)+first
  end
end

ってやっといて
(10..20).rand
するとか
標準じゃ無理
740デフォルトの名無しさん:2009/10/12(月) 19:29:25
(10..20).to_a.sort_by{rand}.first
741デフォルトの名無しさん:2009/10/12(月) 19:39:58
>>740短いのですがどうもちゃんと動作しないようです。
(1..2**30).to_a.sort_by{rand}.first
としましたが、結果がかえってこないのであきらめました。
742デフォルトの名無しさん:2009/10/12(月) 20:07:39
>>741
そりゃ単に重すぎるだけだ
要素数が2**30の配列を作ってるんだから

そこまで大きな数を扱うのなら、小手先なしでrandした方がいいよ
743デフォルトの名無しさん:2009/10/12(月) 20:08:59
だから>>737以外は実用妥当な乱数にならねえって
744デフォルトの名無しさん:2009/10/12(月) 20:09:56
スレタイ100回読んで半年ROMっとけ
745デフォルトの名無しさん:2009/10/12(月) 20:15:49
乱数発生部は組み込みに任すのが完全に正しい姿だな
累乗とか使って結果的に偏らせるのも成長段階には必要という説もあるが
746デフォルトの名無しさん:2009/10/12(月) 20:17:49
最近/.並にゴミで埋まるようになってきたなここ。
747デフォルトの名無しさん:2009/10/12(月) 20:23:23
>>746
2chも大差ないだろ
748デフォルトの名無しさん:2009/10/12(月) 20:24:39
>>746
斬新な自己紹介ですね
749デフォルトの名無しさん:2009/10/12(月) 20:40:35
こういうありきたりなループの終了条件に
!=を使うのは普通ですか?

count = 1
end_count = 10

while count != end_count
puts count
count = count + 1
end
750デフォルトの名無しさん:2009/10/12(月) 20:44:09
へん
751デフォルトの名無しさん:2009/10/12(月) 20:48:03
(1...10).each {|i| puts i}

じゃだめなん?
752デフォルトの名無しさん:2009/10/12(月) 20:50:22
count が増えるとは限らないのだろ

loop do
 break if count == end_count
 ...
end

せめて break して欲しい
753デフォルトの名無しさん:2009/10/12(月) 21:08:18
>>752
何でbreakの方を推すの? 横から見てもいまいちわからん
普通ここは、読みやすいuntilを推す流れじゃないかと思うんだけど
754デフォルトの名無しさん:2009/10/12(月) 21:15:49
あまり使わないんですね。
気をつけます。ありがとうございます。
755デフォルトの名無しさん:2009/10/12(月) 21:18:26
あまり使わないのか?
場合によりけりで特に使う使わないを気にする記述でもないと思うんだけど
756デフォルトの名無しさん:2009/10/12(月) 21:21:14
>>740
単に非効率なやり方だろ
他人に教えるようなものじゃない
757デフォルトの名無しさん:2009/10/12(月) 22:29:55
C++のSTLのイテレータに慣れてるとそう書きたくなるな。
758デフォルトの名無しさん:2009/10/12(月) 22:33:38
読みやすい until などというものは存在しない
と思う
759デフォルトの名無しさん:2009/10/13(火) 09:54:08
unless hoge.empty? とか良く書くけどな。
while not より直接的だと思うんだが。
760デフォルトの名無しさん:2009/10/13(火) 10:17:07
ブロックを考えなければならない until は unless の比ではない
761デフォルトの名無しさん:2009/10/13(火) 11:25:48
全体を括って否定するならuntilだな
複雑な条件を書こうとするとぶっちゃけどっちでも良くなるが
762デフォルトの名無しさん:2009/10/13(火) 11:32:04
否定条件部に ( ) を使うくらいなら while で書いて欲しい
763デフォルトの名無しさん:2009/10/13(火) 11:48:18
whileの条件ですが、いまのところ!=でやっています。
いずれ別の方法を覚えようと思います。

質問です
h = []
i = 1
while i != 3
h.push(i)
puts h
i = i + 1
end

の出力結果が
1
1
2
となるのはなぜですか?
1
2
となると思って本人は書いています。
764デフォルトの名無しさん:2009/10/13(火) 11:52:00
すみません、気づきました。
配列表示させてるからですね

もうしわけありませんでした・・・
765デフォルトの名無しさん:2009/10/13(火) 14:38:07
イインダヨ
766デフォルトの名無しさん:2009/10/13(火) 15:30:16
>>749
while state != :default
お題がこういうのならuntilだのbreakだのはわかるけど
「ありきたりな(カウントの)ループ」だろ?これでいいじゃん
while count < end_count

for (i = 0; i != l; i++)
とか見かけないし
767デフォルトの名無しさん:2009/10/13(火) 15:52:24
Accelareted C++でそんなループが出てきたなあ
768デフォルトの名無しさん:2009/10/14(水) 19:37:35
Windows XPでExcelを操作する際、
Excelが1つだけ起動しているときはwin32oleを使って
WIN32OLE.connect('ExcelApplication')
でうまくいくんですが
複数起動しているとどれかひとつしか操作できません。
どうすれば複数のExcelを操作できるでしょうか?
769デフォルトの名無しさん:2009/10/14(水) 19:45:46
ROTを取得すればいいのでは
Windows版Rubyでできるかどうかは知らん
てかこっち池
ttp://pc12.2ch.net/test/read.cgi/tech/1155031689/
770デフォルトの名無しさん:2009/10/15(木) 02:25:20
>>769
そっちに行ってみましたが…過疎ってますね
771デフォルトの名無しさん:2009/10/15(木) 09:02:13
配列のサイズとかってキャッシュされてる?
利用中は変動しない配列に対して arr.size を毎回行うのと、
最初に arr_size = arr.size として変数格納値を使うのと
どっちが好ましいもんかね
772デフォルトの名無しさん:2009/10/15(木) 09:09:19
確かRubyの配列って、C言語レベルでサイズを記録してるんじゃなかったっけ
そうだとすれば無視できる程度のコストでしかない
773デフォルトの名無しさん:2009/10/15(木) 09:12:15
>>771
されてる
配列の要素数が変動するときにサイズ変数を書き換えてる
Array#size が呼ばれるたびに内部 each でカウントしてるとかそういうことは流石にない
774デフォルトの名無しさん:2009/10/15(木) 09:19:49
1.9のソースを見た。

配列サイズは、フラグの空き領域に入ってる場合と構造体のフィールド
に入ってる場合がある。どちらを返すか判断したりフラグ領域から取り
出すための演算(ビットANDとかシフトとか)がある。
include/ruby/ruby.h の RARRAY_LEN マクロ。
775デフォルトの名無しさん:2009/10/15(木) 09:26:11
Hash#keys なんかは毎回生成するよね
776デフォルトの名無しさん:2009/10/15(木) 09:29:02
>>775
「生成して返す」とマニュアルに書いてあるものは毎回生成する(と、読み手は判断する)
マニュアルの言葉遣いは慎重にしたほうがええな
777デフォルトの名無しさん:2009/10/15(木) 12:19:05
>>771
>配列のサイズとかってキャッシュされてる?
>利用中は変動しない配列に対して arr.size を毎回行うのと、
>最初に arr_size = arr.size として変数格納値を使うのと
>どっちが好ましいもんかね

キャッシュされるというか>>772に書いてある通りだけど、
arr.size の場合はメソッド呼び出しのコストがあるのでローカル変数に代入しておいたほうが速いっちゃあ速い。
ただその違いはわずかなので、全体のスピードに影響を与えるほどではないと思う。
778デフォルトの名無しさん:2009/10/15(木) 14:44:39
>>773
> Array#size が呼ばれるたびに内部 each でカウントしてるとかそういうことは流石にない
そうか、そういう可能性もあるのだな
779デフォルトの名無しさん:2009/10/15(木) 16:35:35
中身がリンクトリストで、そういう可能性があるなら、それらしい名前が
普通付いてるものではないかと。
780デフォルトの名無しさん:2009/10/15(木) 17:54:13
いやそれらしいも何も機能的にほぼ確実に size または length という名前がつくと思うんだが
781デフォルトの名無しさん:2009/10/15(木) 20:37:42
10.function()
こんな風にfunction定義して使えるようにする方法ない?
782デフォルトの名無しさん:2009/10/15(木) 20:40:13
class Integer
   def dbl
     self*2
   end
end

p 10.dbl #==> 20
783デフォルトの名無しさん:2009/10/15(木) 20:48:54
標準ライブラリのクラスに手を加えるのは正直あんまお勧めしない
784デフォルトの名無しさん:2009/10/15(木) 20:48:57
あったんだねっ
Rubyすげ・・・
ありがとうっ
785デフォルトの名無しさん:2009/10/16(金) 01:02:48
>>783
mjd? 今ちょうどWEBrickイジって簡易blogサーバを作ろうとしてるんだが……。。
786デフォルトの名無しさん:2009/10/16(金) 01:07:40
>>785
IntegerやStringやArrayと、WEBrickじゃだいぶ事情が違うぞ。

>>783は、たぶん、標準ライブラリというより、組み込みクラスに、
と言いたかったんじゃないだろうか。
787デフォルトの名無しさん:2009/10/16(金) 01:10:40
自分ひとりでやる分にはいいんじゃねーの
複数人で開発したり、いずれ引き継ぐんなら慎重であるべきだけど。
788デフォルトの名無しさん:2009/10/16(金) 01:49:44
WEBrickのクラスはいじる必要がないような
継承でなんとかならない?
789デフォルトの名無しさん:2009/10/16(金) 04:04:42
大変申し訳ございません、質問です。
mysqlのデータを単純にcontrollerでfindで取り出してviewで表示させようとしています。
しかしブラウザでの表示が文字化けならいざ知れず、「#」になってしまいます。
具体的にページのソースを見てみるとその部分は、

#<Book:0x24319ec>

となっています(Bookテーブルのものを取り出して表示しようとしています)。
途中までは正常に取り出せているようなのですが、表示のところでこうなってしまって大変困っています。
macosxでMAMPを入れ、いざ開発をしようと決めたところでこのエラーです。
railsのバージョンは2.3.4です。
誰か解決策をご存知の方ご教授おねがいします。よろしくお願いします。
790デフォルトの名無しさん:2009/10/16(金) 04:55:43
>>1より抜粋
> Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
791デフォルトの名無しさん:2009/10/16(金) 05:02:39
>>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

見落としていました。すいません。そちらで質問し直します。ご指摘ありがとうございました。
793デフォルトの名無しさん:2009/10/16(金) 06:13:11
メソッドチェーンをさせたいならコンテナクラスを作るほうがいいよね
あるメソッドが 10 を返すからメソッドチェーンのために Integer にメソッドを作るんじゃなく
794デフォルトの名無しさん:2009/10/16(金) 06:28:03
そのへんは他人から言われても絶対わからん
気にせずどんどんクラスとメソッド作りまくれ
そのうち加減がわかるからさ
795デフォルトの名無しさん:2009/10/16(金) 07:04:13
>>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だけしか表示されませんでした。間違ってるでしょうか?
797デフォルトの名無しさん:2009/10/16(金) 07:21:34
>>796
'[' と ']' にもバックスラッシュが必要
while line = gets
 p $1 if line =~ /¥[(¥d+)¥]/
end
798デフォルトの名無しさん:2009/10/16(金) 07:24:09
[ ]は正規表現で特殊な意味を持つのでエスケープしなければならない
そして都合の悪いことに、その特殊な意味のほうで正規表現に当てはまってしまってる
799デフォルトの名無しさん:2009/10/16(金) 08:36:13
どうでもいいことなんだけど
\を¥にわざわざ置き換える人がいるのは何故なんだ
800デフォルトの名無しさん:2009/10/16(金) 08:45:09
>>799
¥ではなく¥です
801デフォルトの名無しさん:2009/10/16(金) 08:50:02
>>799
人じゃなくてブラウザだかOSだかが勝手に変換してるんじゃなかったか
802デフォルトの名無しさん:2009/10/16(金) 08:52:12
backslash を書いたのに yen sign に変換するのはWebKit(Safariとか)の
コード変換テーブルの仕業だったと思う。
803デフォルトの名無しさん:2009/10/16(金) 08:55:00
PC初心者スレかと思った
804デフォルトの名無しさん:2009/10/16(金) 10:01:13
MacはPCではありません
805デフォルトの名無しさん:2009/10/16(金) 10:03:19
>>800
いいえ、羊です
806デフォルトの名無しさん:2009/10/16(金) 10:51:24
RubyでMySQLに接続しようとしています。
その際、SSHトンネルを介しての接続を行いたいと思っています。

その際、通常のRuby/MySQLやMySQL/Rubyといったらライブラリでできるでしょうか。
サンプルが載っているサイト等教えていただければと思います。

よろしくお願いします。
807デフォルトの名無しさん:2009/10/16(金) 11:25:24
複数のhtmlファイルを読み込ませたいんですけど、
1.htmlから100.htmlまでをまとめて読み込ませるにはどうすればいいですか?
808デフォルトの名無しさん:2009/10/16(金) 11:26:59
単に、フォワードで使うように設定したポートを指定して
connectするだけじゃないの?
809デフォルトの名無しさん:2009/10/16(金) 11:30:44
>>807

`zsh -c 'cat <1-100>.html'`
とか
1.upto(100).map {|i| File.read("#{i}.html") }.join
とか出てこない場合は地道にループ組もうぜ。
810デフォルトの名無しさん:2009/10/16(金) 13:17:34
>>807
1つひとつ読むしかないと思う。
contents = (1..100).collect {|i| File.read("#{i}.html") }
str = contents.join
p str
811792: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

というごくシンプルなものです。
やはり色々試してもブラウザには「♯」か配列構造のものしかでません。
ちなみに今さっきカラム名を違うものにして該当箇所を変更してみると上手くいきました。
戻すとできないので、まだ原因はわかりません。

解決はしてないから悔しいですが、ひとまず安心です。色々ありがとうございました。
812デフォルトの名無しさん:2009/10/16(金) 14:20:15
>>811
><%= n.titile %>

タイプミス。<%= n.title %> にしろ。あと h をつけろ。
それから <%=h n.title.inspect %> の結果はどうなった。
813デフォルトの名無しさん:2009/10/16(金) 14:21:01
あーあと @n なんていう名前を使うな。@books にしろ。
814デフォルトの名無しさん:2009/10/16(金) 14:36:47
Rubyのメソッドになんらかの属性を持たせたいんですけど、うまい方法ってありませんか。
ちょうどJavaのアノテーションみたいな感じが望ましいんですが。

route '/user/:id' # アノテーション
access :public # アノテーション
def show
 @user = User.find(params[:id])
end
815デフォルトの名無しさん:2009/10/16(金) 14:48:03
>>814
Javaやれ
816デフォルトの名無しさん:2009/10/16(金) 14:54:44
うむ
817デフォルトの名無しさん:2009/10/16(金) 15:06:21
次の方どうぞ
818807:2009/10/16(金) 15:07:00
>>808-810
即レスどうもです。
なるほど。参考になります。
頑張ってみます。
819デフォルトの名無しさん:2009/10/16(金) 15:10:41
RDEでF5押した後フォーカスがコンソールウィンドウにいっちゃうんだけど
いかないようにはできない?
820デフォルトの名無しさん:2009/10/16(金) 15:16:02
あ、ツール設定からいけました すみません
821デフォルトの名無しさん:2009/10/16(金) 15:18:10
何年かくらいしたらなんとかなりそうな気もするが現行では無理筋だな、アノテーション
822デフォルトの名無しさん:2009/10/16(金) 17:45:16
RubyにC言語のようなプリプロセッサはありませんか?
endを別の文字にできたらいいなぁと
823デフォルトの名無しさん:2009/10/16(金) 17:55:02
>>822

原理的には、たとえば

require 'ripper'
print Ripper.tokenize(File.read(src)).map {|tok| tok == 'ZZZ' ? 'end' : tok }.join

で、ZZZ というトークンを end に置き換えたスクリプトを吐く。

ripperが付属するようになるのは1.9系からだったかな?
824デフォルトの名無しさん:2009/10/16(金) 17:56:01
>>822
ねっす
おまけに非推奨
私たちにとって end は文字列ではなく、ちょっと横に長い視認性のよい記号
825デフォルトの名無しさん:2009/10/16(金) 18:42:27
Ruby厨きめぇ
826デフォルトの名無しさん:2009/10/16(金) 18:57:37
ブロック終端として色づけされるからどうでもよくなってる感じはする
827デフォルトの名無しさん:2009/10/16(金) 18:59:51
コマンドラインオプションでプリプロセッサ有効にして#ifdefしたい時はあるな
828デフォルトの名無しさん:2009/10/16(金) 19:02:36
endを自動で補完したうえで畳み込みして隠してくれるエディタがあったら

いやなんでもない
829デフォルトの名無しさん:2009/10/16(金) 19:03:37
>>828
Emacs

それはそうとプログラミングでは畳み込みって意外と不便でござる
830デフォルトの名無しさん:2009/10/16(金) 19:40:26
>>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の仕様なのか何なのかさっぱり分からなくて困っています。よろしくお願いします。

全角数字を一文字ずつに分解した後半角数字に変換して、数式の中で使えるようにしたいと考このような処理をしました。
832デフォルトの名無しさん:2009/10/16(金) 22:20:49
実際にどういう記述をしたかを一切書かないのは
宇宙の言葉はテレパシーだからですか
テテテテテテテテテレッパシーですか
833792:2009/10/16(金) 23:42:20
>>812,813

inspectしたところ、ブラウザでの表示は以下のようになりました。

本の名前は [#, #] [#, #]

名前についてはわかりました。もっと考えてつけます。
カラム名変えて、これからがんばって勉強していきたいと思います。
いろいろとご指摘、本当にありがとうございました。
834デフォルトの名無しさん:2009/10/16(金) 23:49:45
あなたが全角数字だと思い込んでいるものは、実際には全角大文字のアルファベットです。
835デフォルトの名無しさん:2009/10/17(土) 00:25:45
>>830
なにこれすごい
method_addedとかそんなトリガーがあったのか
ちょーさんくす
836デフォルトの名無しさん:2009/10/17(土) 06:06:41
やめといたほうがいいと思うぞ
837sage: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
838デフォルトの名無しさん:2009/10/17(土) 07:11:51
a.to_i # a.to_i を評価してその結果を捨てる

なので

a = "4173"
b = a.to_i
p b.class
839sage:2009/10/17(土) 07:14:39
>>評価してその結果を捨てる

おお、普通に使っていて気がつきませんでした。有難うございました。
840デフォルトの名無しさん:2009/10/17(土) 07:17:24
>>837

 ・ 変数はオブジェクトにつけたラベルである
 ・ オブジェクトは内部状態を変更することはできるが、所属クラスを関係のないものに変更することはできない

ので、「aというハコに入れておいたオブジェクトを別のオブジェクトに変換する」という考え方は無理
「あるオブジェクトを別のオブジェクトに変換して、変換後のオブジェクトに新たに(同名の)変数のラベルをつける」
ということしかできない
841デフォルトの名無しさん:2009/10/17(土) 07:30:50
>>840
irb(main):003:0> a = "abc\n"
=> "abc\n"
irb(main):004:0> a.chomp!
=> "abc"
irb(main):005:0> a
=> "abc"

842デフォルトの名無しさん:2009/10/17(土) 07:34:07
>>841
irb> a = "abc\n"
irb> a.object_id
-605849488
irb> a.chomp!
irb> a.object_id
-605849488
843デフォルトの名無しさん:2009/10/17(土) 08:47:01
桁区切りのカンマってputsとかで表示させる改行として扱われるんですかね?
844デフォルトの名無しさん:2009/10/17(土) 08:54:49
いいえ

ただし、引数列挙のカンマは、 puts は引数ごとに改行をはさんで表示するので結果的に改行になる

puts('a', 'b', 'c')
a
b
c

説明用のカッコ省略した一般的記法

puts 'a', 'b', 'c'
a
b
c

to_s されることを期待して紛らわしく書くとこうなる

puts 12,345,678
12
345
678
845デフォルトの名無しさん:2009/10/17(土) 11:19:56
よく見ると引数列挙になってる。。有難うございました。
846デフォルトの名無しさん:2009/10/17(土) 11:59:18
そういえば、1_234_567 とか 0x12_45_56_78
いう書き方が出来るのを思い出したわ。
847デフォルトの名無しさん:2009/10/17(土) 12:02:01
一瞬リテラルに 12,345,678 があるのかと思って焦った
848デフォルトの名無しさん:2009/10/17(土) 13:51:08
リテラル? 何それ
849デフォルトの名無しさん:2009/10/17(土) 13:52:04
四大天使の名前
850デフォルトの名無しさん:2009/10/17(土) 14:13:59
ラリッテル
851デフォルトの名無しさん:2009/10/17(土) 18:32:50
渋谷署に任意同行だな。
852デフォルトの名無しさん:2009/10/17(土) 19:03:28
オブジェクトが自分自身を表すthisは、rubyではないのでしょうか?
853デフォルトの名無しさん:2009/10/17(土) 19:05:43
smalltalk流のself
854デフォルトの名無しさん:2009/10/17(土) 19:07:33
これの解説がないって厳しいなあ
その本なりサイトなりさくっと晒せ
855デフォルトの名無しさん:2009/10/17(土) 19:15:00
>>853
素早い回答ありがとうございます!
856デフォルトの名無しさん:2009/10/17(土) 20:26:30
配列中に、重複がない整数が昇順に並んでいるとき、
連続する整数を - でつないで表示じするにはどうしたらよいでしょう?

具体的には 1,3,4,5,7,8 とあったとき
1,3-5,7-8 と表示したいです。
857デフォルトの名無しさん:2009/10/17(土) 20:32:49
>>856
そのように記述しろ
そのような奇術はない
858デフォルトの名無しさん:2009/10/17(土) 20:36:36
まあ>>857でFAなのだが

とりあえず先頭から調べていくしかないねえ
配列からの取得はArray#shiftが使えるかも
次の整数かどうかはInteger#succがたぶん役に立つ
859デフォルトの名無しさん:2009/10/17(土) 20:53:45
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(',')


860デフォルトの名無しさん:2009/10/17(土) 21:43:51
>>859
7行目、thenと&&の位置が反対だよね?

×when e.succ == arr.first && start.nil? then start = e
○when e.succ == arr.first then start.nil? && start = e
861デフォルトの名無しさん:2009/10/17(土) 21:44:49
>>860
おちつけ
862デフォルトの名無しさん:2009/10/17(土) 21:47:21
# 連続した、隣との差が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"
863デフォルトの名無しさん:2009/10/17(土) 22:26:30
>>861
どういう意味?
864デフォルトの名無しさん:2009/10/17(土) 22:45:13
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]]

少し分かりやすいかも
865デフォルトの名無しさん:2009/10/17(土) 23:33:21
WEBrickのパフォーマンスを少しでも上げたいんだが、
事前にバイトコードに変換できる実装ってExerbとJRubyだけですか?
YARVってAOTコンパイラついてなかったっけか
866デフォルトの名無しさん:2009/10/18(日) 00:12:38
>>865
exerbはバイトコードにはしないよ。
867デフォルトの名無しさん:2009/10/18(日) 00:55:03
>>865
Rubinius
868デフォルトの名無しさん:2009/10/18(日) 01:55:08
>>865
速さを求めるならWEBRickじゃなくてMongrelやThin使えば。
869デフォルトの名無しさん:2009/10/18(日) 05:40:09
WEBRick が遅いという場合、半分はコードの書き方が悪い
もう半分は WEBRick というか pure Ruby の限界なので、素直に C 拡張を頼れ
870デフォルトの名無しさん:2009/10/18(日) 05:46:53
>>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

どちらも結果的に全く同一に動作する
コードとしての意図がどうであるかのみが問題になるわけで、
「根本条件が真でなおかつフラグが空であるならフラグを入れる」というのは
これはこれで条件をまとめた記述で普通だと思うがどう
871デフォルトの名無しさん:2009/10/18(日) 07:27:34
>>870
>>859のコードを実行すると、質問者所望の結果が得られないから、>>860の指摘をしました。
>>860の修正をすると、質問者が意図した結果が得られています。
※Ruby 1.8.6、Windows XPで確認
872デフォルトの名無しさん:2009/10/18(日) 08:08:12
>>871
1.8.7だと問題無いな。なんでだろ?
873デフォルトの名無しさん:2009/10/18(日) 08:13:29
>>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
874デフォルトの名無しさん:2009/10/18(日) 11:50:22
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を呼ばせたい
875デフォルトの名無しさん:2009/10/18(日) 12:20:57
こういうこと?

def puts2(*n)
puts n.map {|o| o.to_s2}
end
876デフォルトの名無しさん:2009/10/18(日) 12:34:12
Object#inspect
877デフォルトの名無しさん:2009/10/18(日) 13:20:18
>>875
それだと
to_s2が定義されないときエラーになっちゃうんだ
putsの時はto_sがないときは処理されなくてあったら処理されてるっていう感じで

>>876
ぐぐってみたらよくわからない用語たちがが・・・
少し調べてみます
878デフォルトの名無しさん:2009/10/18(日) 13:24:51
いけたっ ありがとうございます

def puts2(*n)
begin
puts n.map {|o| o.to_s2}
rescue NameError
end
end
879デフォルトの名無しさん:2009/10/18(日) 14:24:56
>to_s2が定義されないときエラーになっちゃう

class Object
  def to_s2
    to_s
  end
end
とかしてもいい。

880デフォルトの名無しさん:2009/10/18(日) 15:59:43
"123456789123"という文字列から1が何個あるかを調べたくて
かいてみたんだけど動かない
どこがダメなんでしょ?

m = "123456789123".match( /1/ )
p m.length
881デフォルトの名無しさん:2009/10/18(日) 16:03:18
matchでなくscan
882デフォルトの名無しさん:2009/10/18(日) 16:04:18
scan
883デフォルトの名無しさん:2009/10/18(日) 16:07:20
p "123456789123".count("1")
884デフォルトの名無しさん:2009/10/18(日) 16:10:12
>>880
マニュアルくらい一回は読め
読んでもわからん、でもいいから、一回は読め

MatchData の length(size) は
> 部分文字列の数を返します
ということで、 ( ) で括った部分の数を返す
match を使いたいのならこう

m = "123456789123".match( /(1)/ )
885デフォルトの名無しさん:2009/10/18(日) 16:11:26
count でいいじゃん。
886880:2009/10/18(日) 16:17:38
ありがとう
色々手段があるんだね
ぐぐって調べたところmatchしか見つかんなかった
マニュアル次から読むようにしますね
count使わせてもらいます

てかカッコが必要だったとは・・・ 正規表現よくわからん
887デフォルトの名無しさん:2009/10/19(月) 14:06:10
配列の各要素とそのインデックスを関連付けるハッシュをつくるとき、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}
888デフォルトの名無しさん:2009/10/19(月) 14:12:22
残念ながら、うまい方法はない

irb> p Hash[arr.zip((0..arr.size).to_a)]
{"a"=>0, "b"=>1, "c"=>2, "d"=>3}

こんなもん
889デフォルトの名無しさん:2009/10/19(月) 14:36:47
>>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]
890デフォルトの名無しさん:2009/10/19(月) 14:58:41
ああ、1.8.7 は>>888 でも動くのか
厄介な修正だのう
891デフォルトの名無しさん:2009/10/19(月) 15:17:34
マイナーバージョン間で非互換なんですねわかります
892デフォルトの名無しさん:2009/10/19(月) 15:32:59
1.8.6 の記述が 1.8.7 で動作しないんじゃないんだから別にいいだろ
1.8.7 での記述が 1.8.6 で動作しないというのはそれなりにフツーだろう
893デフォルトの名無しさん:2009/10/19(月) 16:12:48
>>889
ruby 1.8.6、1.9.0両方で動かすなら

h = {}
arr.each_index{|i|h[i] = arr[i]}
894デフォルトの名無しさん:2009/10/19(月) 16:15:34
いや、1.9.0はもう終了してるから
それにキーと値が逆

h = {}
arr.each_with_index{|e, i|h[e] = i}
895デフォルトの名無しさん:2009/10/19(月) 16:17:16
いや h = Hash[*arr.zip((0..arr.size).to_a).flatten] のほうは 1.8.7 でも 1.9.0 でもきちんと動作するから
896デフォルトの名無しさん:2009/10/19(月) 16:20:06
ルビー厨wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
897デフォルトの名無しさん:2009/10/19(月) 16:41:24
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
898デフォルトの名無しさん:2009/10/19(月) 16:45:14
>>887のへんてこな感じを考慮すると
配列サイズの Range を to_a して zip するのが一番近い答のような気もちらっとせんでもない
899デフォルトの名無しさん:2009/10/19(月) 16:52:08
1.9だと

p arr.each.with_index.with_object({}){|(e, i), memo| memo[e] = i }
#=> {"a"=>0, "b"=>1, "c"=>2, "d"=>3}

で済むんだけどなぁ
900デフォルトの名無しさん:2009/10/19(月) 21:09:36
>>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}

901デフォルトの名無しさん:2009/10/19(月) 21:16:08
>>900
Hash→Array はありだと思うが、Array→Hash は変だと思う
902デフォルトの名無しさん:2009/10/19(月) 21:26:54
1行で書くなら、1.9 のこれが多分一番素直

Hash[arr.each_with_index.map{|e,i| [e,i]}]

2行でいいなら>>894だが
903デフォルトの名無しさん:2009/10/19(月) 21:42:04
需要的にはわかるけどね
つまりは逆引きだし、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 }
904デフォルトの名無しさん:2009/10/20(火) 01:36:10
Perlだとラクダ本にも載ってないっけ?リストを併用する方法
向こうだと結構使われるのかも知れない
905デフォルトの名無しさん:2009/10/20(火) 14:33:39
RubyでCのインクルードみたいな命令ってないんですか?
requireってちょっと違うような・・・
906デフォルトの名無しさん:2009/10/20(火) 14:35:09
つ include
907デフォルトの名無しさん:2009/10/20(火) 14:43:30
loadじゃね
908デフォルトの名無しさん:2009/10/20(火) 14:51:51
>>905
どういう動作をさせたいのかが判らんと何とも言えんが
基本的にはrequireで、用途によってはload

Cに例えるなら…
requireはインクルードガード付きの#include、
loadはインクルードガード無しの#includeに近いかな?
909デフォルトの名無しさん:2009/10/20(火) 14:53:50
load だな
ただし、ローカル変数は読み込めない
ローカル変数利用部を「切り出した」場合は文字列として eval する
ファイルに信頼できない何が書いてあっても Ruby スクリプトとして実行するのでセキュリティに注意
910デフォルトの名無しさん:2009/10/20(火) 15:15:36
>>909
あーやっぱ変数ってダメなんですか・・

やりたいことは、
スクリプトの上のほうに
変数宣言がいっぱい増えてきたから
それを他のファイルにまとめて
load "hensuu"
とかしたかったです
911デフォルトの名無しさん:2009/10/20(火) 15:17:52
だからさっさと -cpp オプションつけろと言っているのに…
912デフォルトの名無しさん:2009/10/20(火) 15:19:43
>>910
気にするな
慣れろ
というか読みにくくてイライラするからいちいちンなことすんな
スクリプト(またはクラス定義、または def initialize)の上部に変数定義が大量にあるのは Ruby では普通

クラス作ってるなら Hoge::Configure モジュールにして include したりするというような手もなくもないが
913デフォルトの名無しさん:2009/10/20(火) 15:21:46
頭でっかちに見えるというのはわからなくもないんだよなあ
本当に全部他の場所にあるのなら、それはそれでわかりやすいと思う
なんかかっちょええ解決策とかないもんかね
914デフォルトの名無しさん:2009/10/20(火) 15:27:29
変数定義だけで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

というのはやったことがある
めっちゃ自己満足だった
915デフォルトの名無しさん:2009/10/20(火) 15:31:21
複数ファイルにする規模でトップレベルにローカル変数が大量っていうのもどうかと思うけど
グローバル変数の親戚みたいな状態になっていそう
916デフォルトの名無しさん:2009/10/20(火) 15:36:03
Ruby/GTK2で作成したウィンドウの上でマウスが動いた座標を毎秒テキストログに出力するためにはどうすればいいですか?
そのようなクラスやインスタンスも見当たらないのですが・・・.
917デフォルトの名無しさん:2009/10/20(火) 15:41:44
「ウィンドウの上でマウスが動いた座標を毎秒テキストログに出力するメソッド」とかそういうのを探してそうで怖い

マウスの座標を取得するクラスとメソッドはあるだろ
毎秒何かをさせるメソッドってのもあるだろ
結果をファイルに書き出すメソッドってのもあるだろ
それ組み合わせればいけんじゃね
918916:2009/10/20(火) 15:49:33
>>917
さすがに一行めのメソッドは探していません^^;

3行から5行までのメソッドを探すときにどのように探せばいいでしょうか?
ruby-gnome2のサイトをみていっているのですがわかりません.
919デフォルトの名無しさん:2009/10/20(火) 15:51:55
>>911
興味があったら、perlrun(1) で -P オプションの説明を見てくるといい。
920デフォルトの名無しさん:2009/10/20(火) 16:05:42
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にアクセス
できるのかどうかは知らん。
921デフォルトの名無しさん:2009/10/20(火) 17:05:49
#!/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
922デフォルトの名無しさん:2009/10/20(火) 17:08:41
ルビー厨wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
923デフォルトの名無しさん:2009/10/20(火) 17:11:52
>>921
ぬう、GTKぜんぜんわからん…
924916:2009/10/20(火) 17:26:55
>>920-921
ありがとうございます.
signal_connectやadd_eventsやらを調べてやってみます!
925デフォルトの名無しさん:2009/10/20(火) 17:51:11
>>910
>やりたいことは、
>スクリプトの上のほうに
>変数宣言がいっぱい増えてきたから
>それを他のファイルにまとめて
>load "hensuu"
>とかしたかったです

なんかPerlやPHPでのやり方だね。
Rubyではローカル変数のスコープはそのファイルに限定されてしまうので、
どうしても他のファイルに分けたかったら、ローカル変数じゃなくて
グローバル変数やインスタンス変数にするしかなさそう。

つうかさ、変数がたくさんあるんだったら、たぶんグループ分けできるから、
それごとにクラスを定義してそこにインスタンス変数をつくったほうがいいんじゃないかな。
926デフォルトの名無しさん:2009/10/20(火) 18:24:38
どんなスクリプトかにもよるな
とりあえず最初は意義とか意味とか考えず形式的にクラス作っていいぞ
927デフォルトの名無しさん:2009/10/21(水) 01:24:51
定数なら引き継げるけど、定数にしたら駄目なの?
928デフォルトの名無しさん:2009/10/21(水) 07:09:44
何が悲しくて定数使わなきゃならんのだ
というか定数に変数持たせるくらいならクラス定義使え

あまり認識されてない上に説明しづらい事実だが
インスタンス変数はトップレベルでも普通に使える

@foo = 'YES!'

def disp_foo
puts @foo
end

disp_foo
929デフォルトの名無しさん:2009/10/21(水) 07:52:52
もしかして本当に>>910の役に立つのは
定数なんじゃないかと思わなくもない

どっちにしても、情報が少なすぎて何とも言えん
930デフォルトの名無しさん:2009/10/21(水) 16:54:56
win32apiクラスで例えばこのスレに書き込みとか出来るのかな?
931デフォルトの名無しさん:2009/10/21(水) 17:05:34
>>930
WinInet を呼べばできるはず
普通は Ruby に任せるが
Ruby でできることをわざわざ API でやる理由はないからな
932デフォルトの名無しさん:2009/10/21(水) 21:29:51
CentOSにruby1.9をインストールしたいのですが、yumを調べるとパッケージは1.8.7までしか無いようです。
1.9を入れるにはcheckinstallなどを使ってソースから入れるしか方法は無いのでしょうか?
933デフォルトの名無しさん:2009/10/21(水) 21:33:50
教祖も使っているDebian
934デフォルトの名無しさん:2009/10/21(水) 21:42:25
http://www.nicovideo.jp/watch/sm8572243
PHPの講座作ってみました
935デフォルトの名無しさん:2009/10/21(水) 21:44:27
>>932
パッケージが無いのならYES
パッケージを自作してもいい
936デフォルトの名無しさん:2009/10/21(水) 22:17:32
>>932
/etc/yum.repos.d/CentOS-Base.repo
[extras]
[centosplus]
937デフォルトの名無しさん:2009/10/21(水) 23:38:29
938デフォルトの名無しさん:2009/10/22(木) 00:59:20
WEBrickのハンドラって
Java Servletみたいにあらかじめインスタンス化されないの?
CGIみたいに毎回呼び出すんじゃあ、CPU負荷がかかって当然のような……
939デフォルトの名無しさん:2009/10/22(木) 01:18:01
mod_phpもそういうもんだったはずだけど、少なくとも2年前は
むしろ毎回コード読み直すからより条件が悪い

つーか生成コストが問題になるのは設計の問題じゃねーの
ハンドラは単なるブリッジで十分なんだぞ?
オブジェクト生成そのものはMRI全体の動作速度に直結するから大したコストにならんようできてるだろ
940932:2009/10/22(木) 02:44:53
>>933
>>935
>>936
遅くなりましたが、ありがとうございます。
指摘頂いたDebianを調べてみましたが、rubyに限らずパッケージ管理全般が簡単になりそうなので思い切ってDebianに切り替えてみようと思います。
パッケージの自作も勉強になるかな、とも思いましたがCentOSを使い続けてこの先もパッケージ管理に悩まされれるのはやっぱり面倒くさい。。
941デフォルトの名無しさん:2009/10/22(木) 03:37:21
初心者はfedora系にしとけ
942デフォルトの名無しさん:2009/10/22(木) 03:59:59
>>941
お前ブラックだな
943デフォルトの名無しさん:2009/10/22(木) 06:20:01
質問よろしいですか?

以下のコードを動かしたかったのですが、tweetstreamがないと言われて動かなかったため、
Big Sky :: javascriptで動くtwitter streamクライアントを作るならばmultipart/mixedを使うべき
http://mattn.kaoriya.net/software/lang/javascript/20091013002658.htm

下記をgemでインストールしようとしたのですが、yajl-rubyに依存していたようなのですが、
intridea's tweetstream at master - GitHub
http://github.com/intridea/tweetstream

下記のyajl-rubyがnative extensionでインストールに失敗しました。
brianmario's yajl-ruby at master - GitHub
http://github.com/brianmario/yajl-ruby


nmakeがない、といってコケているのでVC++の環境が認識されていないのだと思います。
この場合、どのバージョンのVC++コンパイラを用意すべきなんでしょうか?

環境は、Windows Vista SP2 32bits、Ruby 1.8.7でうs
944943: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デフォルトの名無しさん:2009/10/22(木) 07:13:03
make が必要なだけにも見える
安全のためにバージョン固定してるだけだから、そこ書き換えると動く
ftp://ftp.microsoft.com/Softlib/MSLFILES/NMAKE15.EXE
をダウンロードして実行して出てきたNMAKE.EXEとNMAKE.ERRをパスの通るとこに置いても動く
946デフォルトの名無しさん:2009/10/22(木) 11:58:40
>>945
>make が必要なだけにも見える
makeが必要なだけなのにCコンパイラがエラーを出すわけないでしょ。
947デフォルトの名無しさん:2009/10/22(木) 12:57:25
VC6でコンパイルしてみたよ。win32用のgemの作り方は知らないのでそのままzip
ttp://www1.axfc.net/uploader/Sc/so/47986
948デフォルトの名無しさん:2009/10/22(木) 13:54:05
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
よろしくお願いします。
949デフォルトの名無しさん:2009/10/22(木) 14:10:02
その手のフラグはどこかしらで数値を定義した定数(引数としては数値を渡す)なので、自前で定義すればいい
調べ方は・・・wordだとどうするんだったかな、とりあえずぐぐったら8っぽい

あとこの板にrubyのwindowsスレあるからそっちもよろしく
950デフォルトの名無しさん:2009/10/22(木) 14:17:10
class Word; end
WIN32OLE.const_load(msword, Word)
951デフォルトの名無しさん:2009/10/22(木) 15:20:11
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc12.2ch.net/test/read.cgi/tech/1155031689/
952デフォルトの名無しさん:2009/10/22(木) 18:40:35
>>949-951
ありがとうございます。
wdFormatHTML = 8
msword.activeDocument.saveAs('¥¥foo.html', wdFormatHTML)
でいけました。

#はじめてwin32ole使ったけど、これはすごい。こんな便利なものがあるなんて知らなかったよ。
953デフォルトの名無しさん:2009/10/22(木) 18:55:21
class Word; end
WIN32OLE.const_load(msword, Word)
p Word::WdFormatHTML
954デフォルトの名無しさん:2009/10/22(木) 18:58:51
必死
955デフォルトの名無しさん:2009/10/22(木) 19:54:40
>>943-944
VCで拡張ライブラリをコンパイルしようとすると
バージョンの違いやらなにやらで悲惨なことになる
mingwでのコンパイルオススメ
956aDMbFWhUezcHArB:2009/10/23(金) 01:54:07
NPR itself has long been accused of having a liberal bias, though the network states that it reflects a diversity of views. ,
957943:2009/10/23(金) 13:41:51
>>947
サンクス!

てか、VC6て今手に入らないし、サポートも切れてるコンパイラを何で使ってるんだろw
958943:2009/10/23(金) 13:43:46
>>955
ああ、mingwでもいいのか。つか、ActiveScriptRuby の1.8.7にmingwでコンパイルした拡張ライブラリつかっても大丈夫なの?
ちょっと環境整えてみるか

関係ないけど、coLinuxのubuntuで同じgem入れたらなんごとなきに入ったw Linuxだとこの辺楽屋根
959デフォルトの名無しさん:2009/10/23(金) 14:05:20
>>957
歴史的経緯

よく言えばこの問題にマジギレした人たちが RubyInstaller を作ってる
ttp://github.com/oneclick/rubyinstaller
960デフォルトの名無しさん:2009/10/23(金) 14:07:16
>>958
mingwでもぜんぜんいいです。

>>957
というわけで、mingwとのバイナリ互換性のためです。
961デフォルトの名無しさん:2009/10/23(金) 14:08:40
「この問題」って何があったの?
962デフォルトの名無しさん:2009/10/23(金) 14:19:54
「Windowsユーザーの大多数がgemライブラリのバイナリを自力でコンパイルできない状態にあること」かな
963デフォルトの名無しさん:2009/10/23(金) 14:20:11
>>961
文脈からすると、今更VC6ってことじゃないの?
964デフォルトの名無しさん:2009/10/23(金) 14:50:41
ああそういうことか
リンク先に問題があるのかと思ったw
965デフォルトの名無しさん:2009/10/23(金) 16:39:23
外部ライブラリと合わせなきゃならないんで、配布されているほとんどの
DLL(iconvとかopensslとかncursesとか)がmsvcrt.dllとリンクされている現状
ではrubyだけVC8とか9にはできない、という理由。
966デフォルトの名無しさん:2009/10/23(金) 16:44:09
まとまってるのはこのへんだね
ttp://www.infoq.com/jp/news/2009/08/ruby-installer

でもusaビルドは>>960らしい
ttp://www.garbagecollect.jp/~usa/d/200712b.html#id20071212_P1

まあどちらもmsvcrt.dllが問題の根っこ
967デフォルトの名無しさん:2009/10/23(金) 18:12:00
SNMPで装置の状態を取得して、
ある状態になったら次の処理をするようなスクリプトにしたいのですが、
以下のようなループを作るしかないですか?
(並行で動いている必要はないのでスレッドにはしていませんが)

until (装置の状態判定)
 SNMPで装置状態取得
sleep 1
end

判定式に間違いがあると無限ループになる危険がありますし、
もっと上手い方法があるんじゃないかと思い質問させてもらいました。

よろしくお願いいたします。
968デフォルトの名無しさん:2009/10/23(金) 18:17:11
"1 2@3#4"こういうデータを一回のsplitで分割する事って出来ませんか?
"1 2@3#4".split(" " , "@" , "#")
こんな事が出来ればなぁと思ったんですがダメみたいで
969デフォルトの名無しさん:2009/10/23(金) 18:18:36
>>967
それが普通だと思う
気になるならスレッド使うか条件つき break でも別途入れとけ

>>968
"1 2@3#4".split(/\s|@|#/)
970デフォルトの名無しさん:2009/10/23(金) 18:24:18
>>968
splitの区切り文字には正規表現が使えるので
.split(/[ @#]/)
とすれば良い
2文字以上のが使いたいなら角カッコ使わず|で区切れ
971デフォルトの名無しさん:2009/10/23(金) 18:52:43
>>967
細かい話だが、取得と判定とが互いに別処理なら、↓の方が安全。

SNMPで装置状態取得
until (装置の状態判定)
 SNMPで装置状態取得
 sleep 1
end
972デフォルトの名無しさん:2009/10/23(金) 19:06:12
>>969 970
そんな手があったんですね
ありがとうございます
973デフォルトの名無しさん:2009/10/23(金) 19:42:07
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で書きたいのですが
よろしくお願いします。
974デフォルトの名無しさん:2009/10/23(金) 19:49:03
>>973
lines = File.open('text.txt').realines
# なんか消す
lines.delete_if{|line| line =~ /re/}
File.open('text.txt','w').print(lines.join)

これでいいじゃん
975デフォルトの名無しさん:2009/10/23(金) 19:55:18
うっひょう 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 オブジェクトは読み書きごとに作ったほうが安心安全
976デフォルトの名無しさん:2009/10/23(金) 20:01:20
File オブジェクトは読み書きごとに作ったほうが安心安全なんですか?

ほぼ同時アクセスで
pc1がtextを読む
pc2がtextを読む
pc1がtextを書く
pc2がtextを書く
となると、ファイルの内容が壊れそうなのですが。
(pc1,2で消す行が違うとします。)
977デフォルトの名無しさん:2009/10/23(金) 20:13:29
>>976
それは Ruby の知ったこっちゃねー
ある瞬間に書き込む先のファイルが、一瞬前と同一の内容であるかどうかを Ruby は保証しない

読み込んでから書き込むまでの間に自分以外の誰もファイル内容を変更して欲しくないのなら
OS のファイルシステムにファイルロックを頼む
File クラスのインスタンスメソッド lock が使える
978デフォルトの名無しさん:2009/10/24(土) 03:16:16
描く前に、描き変わったかどうかぐらいチェックしろよw


ソロそろう目。
979デフォルトの名無しさん:2009/10/24(土) 03:23:05
>>978
次スレ立つ前に埋めてどうする
980デフォルトの名無しさん:2009/10/24(土) 06:14:09
>>978
チェックを終えてから実際に書き込みをはじめるまでのわずかな間に書き換えられてしまうことを防げない
これを「そんなクソ短いタイミングで割り込みなんて起こりっこねえよ」と情緒的解決をするのなら、
そもそも「スクリプト内で一瞬で終わる処理の間に割り込みなんて起こらねえよ」と情緒的決断をすべき

両方を保証するにはファイルに排他処理をかけるしかない

980なので次スレを立てる
981デフォルトの名無しさん:2009/10/24(土) 07:08:05
Ruby 初心者スレッド Part 32
http://pc12.2ch.net/test/read.cgi/tech/1256332692/
982デフォルトの名無しさん:2009/10/24(土) 07:17:10
>>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 # ファイルが閉じられるときにロックも自動的に解除される
983デフォルトの名無しさん:2009/10/24(土) 07:18:34
>>973
あと
 buf = []
 f.each do |line|
  buf << line if line =~ /^¥w+$/
 end

 buf = f.grep /^¥w+$/
と書ける。
984デフォルトの名無しさん:2009/10/24(土) 08:22:32
985デフォルトの名無しさん:2009/10/24(土) 12:28:19
>>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")

って許可されてないん?
987デフォルトの名無しさん:2009/10/24(土) 15:42:41
細かい理屈は省くと、そういうのは普通

class Foo
def initialize(str=nil)
p "aaa"
p str if str
end
end

と書く
988デフォルトの名無しさん:2009/10/24(土) 15:46:13
シグネチャによるメソッドオーバーロード(多重定義)はない。
引数の有無なら>>987のようにしてもいいし、込み入ったものは
メソッドの引数を*args のようにしておき、メソッド内で場合分けをする。
989デフォルトの名無しさん:2009/10/24(土) 15:48:01
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が入っているって解釈でいいのかな?
991デフォルトの名無しさん:2009/10/24(土) 15:54:29
よい
というかこういうデフォルト引数の書き方をしないと

Foo.new

とだけ書いたときに ArgumentError で落ちる
992デフォルトの名無しさん:2009/10/24(土) 15:56:42
引数が nil であったときを検知したい場合に mes(params = :default) みたいにしてる人を見た
なんかモヤモヤするがこれで動作するし気にしないことにする
993デフォルトの名無しさん:2009/10/24(土) 19:17:03
もっとスマートな記載があるんでしょうか?

size=FileTest.size?("filename")
if size >= 1048576
 s="#{size/1048576}M"
elsif size >= 1024
 s="#{size/1024}K"
else
 s="#{size}"
end
994デフォルトの名無しさん:2009/10/24(土) 19:51:14
>>993
そのへんの変換に関しては特にサポートはないと思う
1048576ってなんじゃらほ、という可能性があるからべき乗で書いておく、くらい?
995デフォルトの名無しさん:2009/10/24(土) 20:00:50
>993
ActiveSupport
996デフォルトの名無しさん:2009/10/24(土) 21:00:21
>>992
def mes(params = (default = true; nil))
ということもできる。一応。
997デフォルトの名無しさん:2009/10/24(土) 22:15:40
>>958
「なんごとなき」って初めて聞いたわ
998デフォルトの名無しさん:2009/10/24(土) 23:14:22
梅☆
999デフォルトの名無しさん:2009/10/24(土) 23:16:22
999 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1000デフォルトの名無しさん:2009/10/24(土) 23:16:49
Ruby 初心者スレッド Part 32
http://pc12.2ch.net/test/read.cgi/tech/1256332692/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。