Ruby 初心者スレッド Part 39

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 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デフォルトの名無しさん:2010/10/21(木) 10:07:21
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
 ・「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」
  http://www.amazon.co.jp/gp/product/4797357401/
文法は理解済み(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デフォルトの名無しさん:2010/10/21(木) 10:08:18
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デフォルトの名無しさん:2010/10/21(木) 10:09:00
●関連スレ
【RoR】Rubyについて Part 41【CPAN vs RubyGems】
http://hibari.2ch.net/test/read.cgi/tech/1281473294/
●アンチスレ
Rubyについて(アンチ専用) Part004
http://pc12.2ch.net/test/read.cgi/tech/1249737531/
●Railsスレ
【Ruby】Ruby on Rails Part10
http://hibari.2ch.net/test/read.cgi/php/1282991262/
●Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc12.2ch.net/test/read.cgi/tech/1155031689/
●GUIの使えなさを堪能するスレ
Ruby で GUI するスレ
http://pc12.2ch.net/test/read.cgi/tech/1269609576/
●ぶん投げスレ
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/

●前スレ
Ruby 初心者スレッド Part 38
http://hibari.2ch.net/test/read.cgi/tech/1282781922/
Ruby 初心者スレッド Part 37
http://hibari.2ch.net/test/read.cgi/tech/1274121477/
Ruby 初心者スレッド Part 36
http://pc12.2ch.net/test/read.cgi/tech/1269233796/
5デフォルトの名無しさん:2010/10/21(木) 10:09:55
バージョンに関するよくある質問

・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!? 1.8.6が許されるのは小(AA略」と煽ってよい

・Ruby 1.9.0
 不安定にして先鋭機能が超満載の開発版バージョンだったもの
 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に

・Ruby 1.9.1
 1.9 系列安定版の最新版のひとつ前(現在は1.9系列としては1.9.2を推奨)
 本体と添付ライブラリの動作は問題がないのだがgem等外部第三者ライブラリの対応が超適当特に英語圏産

・Ruby 1.9.2
 1.9系列安定版の最新版
 素人目にはどこがスゴいんだかわからないくらい慎重にバージョナップされたある意味つまんない安定版
 初心者を脱した人が外部ライブラリの開発コミュニティに参加して1.9.2対応進めてくれたりすることを期待中
6デフォルトの名無しさん:2010/10/21(木) 10:11:12
Windows で Ruby を使う初心者はとりあえず ActiveScriptRuby の 1.8.7 をインストールして慣れろ
OneClickInstaller は単に古すぎ、RubyInstaller は MinGW32 版で現状扱い怪しい、cygwin 版は cygwin マニア専用
IDEつまり統合環境のお勧めは特にない(せいぜい汎用のEclipseかNetBeans)、RDE は古くて独自すぎで Ruby に慣れた人向け

■ Windows でとにかく迷いたくない普通の人 … ActiveScriptRuby 1.8.7
ttp://arton.hp.infoseek.co.jp/indexj.html
 の題字のでかい 「ActiveScriptRuby 1.8.7(p302) with-winsock2 tcl-stub」

 マニュアルはWebで見ることもできるが手元にあると便利、1.8.7 の HTML ヘルプ版が
ttp://www.ruby-lang.org/ja/documentation/
 の「Rubyリファレンスマニュアル刷新計画 chm版 1.8.7用」

 夢のお告げ等、何かの間違いで Ruby の知識がないうちから 1.9.2 を使って苦しみたいマゾい人は
ttp://www.artonx.org/data/asr/ の「Ruby-1.9.2-p数字 Microsoft Installter Package」


・初心者向けチュートリアル記事(過去スレで出たもの)
ホワイの(感動的)Rubyガイド
http://www.aoky.net/articles/why_poignant_guide_to_ruby/
プログラミング入門 - Rubyを使って -, by Chris Pine, 日本語ver. by S. Nishiyama
http://www.ie.u-ryukyu.ac.jp/~kono/software/s04/tutorial/
Ruby チュートリアル (Ruby 1.8.6 編)
http://www.okisoft.co.jp/esc/ruby/tut.html
7デフォルトの名無しさん:2010/10/21(木) 10:34:36
そういえば ttp://arton.hp.infoseek.co.jp/indexj.html は移転先決まってるのかな
これiswebライトだから今月末でサーバ終わるだろ
8デフォルトの名無しさん:2010/10/21(木) 10:38:27
>>5の内輪的な口調のテンプレは何度見てもキモいな
9デフォルトの名無しさん:2010/10/21(木) 10:43:14
windows 利用者は消えた方が良いと思ってるみたいだ
10デフォルトの名無しさん:2010/10/21(木) 14:27:17
>>7
移転の話が載ってないということはそもそも気づいてない可能性が高い
誰かメールしたれ
11デフォルトの名無しさん:2010/10/21(木) 14:42:16
      ,―ヽ_(((((_、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    IPA Rubyは誰でもウェルカム
      i、  \   ./  /
       \   ーー   ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
12デフォルトの名無しさん:2010/10/21(木) 18:30:54
いちおつ

>>2
Rubyレシピブック 第3版 303の技
http://www.amazon.co.jp/dp/4797359986/

最近Amazonって旧版のページ行くと新版でてるよって教えてくれるけど
これには機能してなかった
1.8/1.9両対応らしいから旧版買った人はカワイソス
13デフォルトの名無しさん:2010/10/21(木) 22:20:23
Jrubyについての質問はここでいいですか?
14デフォルトの名無しさん:2010/10/21(木) 22:37:11
>>13
だめじゃないけど、Ruby初心者でjrubyとかつらそうな感はある。
あと、jruby固有の話題を扱いたいなら、別スレ立てた方がいいかもね。
15デフォルトの名無しさん:2010/10/21(木) 22:41:38
RubyをJAVAにコンバートするアプリとして紹介されたんですが、使い方
が今ひとつよくわからないので正しい使い方を知っている人がいたら
教えてもらおうと思いました。コマンドラインとか、エラーメッセージ
とかです。巨大整数を変換するのにlong型に入らなかったという内容の
エラーが出ます。またJrubyを使うと実行速度は上がるのでしょうか?
16デフォルトの名無しさん:2010/10/21(木) 22:50:31
>>15
RubyとJavaの両方でライブラリを公開できる程度の知識があれば可能
17デフォルトの名無しさん:2010/10/21(木) 22:58:44
そんなに難しいんですか?どっちも初心者なので解りません。
Rubyで作った暗号をJAVAに置き換えようと思ったんですが、コマンド
一つじゃできないんですか?
18デフォルトの名無しさん:2010/10/21(木) 23:06:43
>>17
RubyとJavaの両方でライブラリを公開できる程度の知識があれば可能
ちなみにこれはそんなに高度なことを要求されるわけでもない(初心者ではないというだけ)

というか、ドイツ語→フランス語翻訳サイトの使用に必要なものは何かというと
ドイツ語とフランス語だよな
翻訳されたフランス語がきちんとフランス語として正しいかどうかを検証するためには
フランス語の知識がやっぱ要るよな
で、結局そんな人はドイツ語の文章を読んでフランス語を自力で書いたほうが早いよな

つまりその程度
19デフォルトの名無しさん:2010/10/21(木) 23:08:50
>>15-17
何を言っているわからないw

>>15
> RubyをJAVAにコンバートする

もっと詳しく
ソースコードを変換するという意味?
Rubyで書いたソースコードをJavaの環境で動かすという意味?

> RubyをJAVAにコンバートするアプリとして紹介されたんですが、

紹介者に聞いたほうがあなたの状況も知っていて答えているだろうし、多分早いと思う

>>17
> Rubyで作った暗号をJAVAに置き換えようと思ったんですが、

Rubyで「作った」というのは生成した暗号なのか?Rubyで暗号化するためのソースのことか?
Javaで置き換えるとはどういう意味なのか?Javaで暗号を復号化できさえすればいいのか?


「Ruby 暗号 Java」でググると同じようなことをやっている人は見つかるがこういうのは需要があるのか?

20デフォルトの名無しさん:2010/10/21(木) 23:10:09
物凄く平たく言うと

>>15
>RubyをJAVAにコンバートするアプリとして紹介されたんですが
モルダー、あなた騙されたのよ
21デフォルトの名無しさん:2010/10/21(木) 23:11:34
ググった。こういうのか?ハマりどころも書いてあるし、初心者じゃなければいけそうだが

mixi Engineers’ Blog ≫ OpenSSLの暗号文をJava/Perl/Rubyで開く
http://alpha.mixi.co.jp/blog/?p=91
Javaで暗号化したデータをPerlで復号化しようとしたら大変だった件 - ダウンロードたけし(寅年)の日記
http://d.hatena.ne.jp/download_takeshi/20100819/1282173492
Java で暗号化したデータを Ruby で復号しようとしたら大変だった件 - 口内炎延焼
http://d.hatena.ne.jp/ssig33/20100823/1282554827
22デフォルトの名無しさん:2010/10/21(木) 23:16:10
俺なら普通に最初からJava勉強して普通にJavaで書く

JRubyは
「これなら、且つ、俺ならRubyで書いたほうが早いが、オリジナルRubyの実行環境がない」
「が、Javaならある」
という狭い条件のときにのみ使う
23デフォルトの名無しさん:2010/10/21(木) 23:16:57
RubyのコードをJAVAに変換してJAVAとして走らせて実行速度を上げたい
のです。
24デフォルトの名無しさん:2010/10/21(木) 23:20:18
jruby proj.rb とやっても実行速度は変わらないんですか?
RubyのコードがJAVAに変換されて出てくると思ったんですが違うみたい。
25デフォルトの名無しさん:2010/10/21(木) 23:26:53
JRubyでググれ
26デフォルトの名無しさん:2010/10/21(木) 23:32:41
>>24
AOTモードでコンパイルすればいい
JVMを常に起動した状態のサーバVM上で、そのプログラムに応じた専用の最適化をすれば、
単純なプログラムではRuby1.9.2と同等か速いこともある
27デフォルトの名無しさん:2010/10/21(木) 23:34:42
Rubyは必要な知識がほとんどいらないのに、JAVAはクラスとかオブジェクト
とかメソッドなんかあったりして覚えにくい先入観があります。
28デフォルトの名無しさん:2010/10/21(木) 23:43:52
>AOTモードでコンパイルすればいい
コマンドラインを教えてください。またどの程度速くなりますか?
29Perl忍者 ◆M5ZWRnXOj6 :2010/10/21(木) 23:44:12
お目エラこんなばかだからしょうがねえよなはげ
消えろてめえみらいたなカスが呼吸してるだけで目障りなんだよ
てめえらがルビーやることでさらに俺の怒りへのボルテージをかきたたせるがね
お前らゴミ糞は死ねよ

まつもとひろゆき拝んで死ね
30デフォルトの名無しさん:2010/10/21(木) 23:47:38
>>28
遅くなる
31デフォルトの名無しさん:2010/10/21(木) 23:48:47
ココは初心者のスレです。何様?
32デフォルトの名無しさん:2010/10/21(木) 23:55:12
信じていた妄想を否定する真実を告げられてキレる人が…
33デフォルトの名無しさん:2010/10/21(木) 23:59:23
crubyで遅いスクリプトはjrubyだと更に遅い
まあ当たり前
crubyでこれ以上ないくらい効率的なスクリプトであって、
VM起動済みのjrubyで何十回とベンチマークとってチューニングすれば、
crubyよりも速い実行時間を得られることがあるかもしれない
34デフォルトの名無しさん:2010/10/22(金) 00:02:20
JavaとJRubyとRubyの深い知識がないとチューニングできないと思うぞ
どこの誰に騙されたのか知らんけど>>22が概ねJRubyの真実
35デフォルトの名無しさん:2010/10/22(金) 00:09:58
「あなたが書く程度のプログラムはJavaよりもCで実行したほうがずっと速い」
というのは真実であって欲しいなあ

で、まあ、Rubyスクリプトが遅いのは普通はスクリプトの作り方が悪いんよね
コマンド一発で直してくださいとか言いそうだがそんなもんできんので勉強してくれ
36デフォルトの名無しさん:2010/10/22(金) 01:35:06
1.8系を使っています。
”3042” → あ 
のように16進数のStringからそれに該当するコードポイントを持つUNICODE文字を取得したいのですがどうすればいいでしょう。
["3042"].pack("U") 等ではうまくいきません。
お願いします。
37デフォルトの名無しさん:2010/10/22(金) 01:53:56
print '\u3042'.decode('unicode-escape')
38デフォルトの名無しさん:2010/10/22(金) 03:24:24
>>23-24
あなた騙されてるよ
39デフォルトの名無しさん:2010/10/22(金) 06:56:19
>>36
irb> puts ['0x3042'.hex].pack('U')

40デフォルトの名無しさん:2010/10/22(金) 06:59:43
ああ、String#hexの場合は接頭詞いらんのだった
irb> puts ['3042'.hex].pack('U')


とりあえず、
irb> p ["3042"].pack("U")
TypeError: can't convert String into Integer
とか今回はちゃんとエラー出るんで、できればエラー読んでマニュアルにあたって欲しい
41デフォルトの名無しさん:2010/10/22(金) 08:55:58
undefined method `hex' for 12354:Fixnum (NoMethodError)
42デフォルトの名無しさん:2010/10/22(金) 13:14:56
以前、javaでTDDをするよりは、rubyでTDDが動くのを確認してから
javaのソースコードに焼き直すと提言していた人がいたなぁ。
4336:2010/10/22(金) 23:17:38
>40
ありがとうございました。誤ったコードを書き込んでしまい失礼しました。
実はvisualuruby上でUNICODE文字を表示させたかったのです。
教えていただいたコードでテキストファイルには正しく文字が出力されましたが、
visualuruby上では化けてしまいます。
これはきっとどうにもならなそうなので別の道を考えます。
44デフォルトの名無しさん:2010/10/22(金) 23:38:59
>visualuruby上では化けてしまいます。

まじか
4536:2010/10/22(金) 23:43:52
>44
はい。$KCODEをUTF8にしたりしてみたのですが、わかりません。
exerbで固めれば配布するのも簡単そうなのでvisualurubyで行きたいのですが。
ほかのGUIキットは別途ライブラリのインストールが必要ですよね。

46デフォルトの名無しさん:2010/10/23(土) 00:33:28
visualurubyはSJIS固定
47デフォルトの名無しさん:2010/10/23(土) 17:35:31
質問ですが、windowsでactivescriptruby1.8.7を使って
昨日簡単なプログラムを作ってみて実行させたら結果が出たらすぐに操作盤
が閉じてしまって、ちゃんと実行されたかどうかわからないのですが
どうすればよいでしょう?
48デフォルトの名無しさん:2010/10/23(土) 17:43:00
操作盤ってすごいな

>>47
Windowsの標準の出力の特性上、そもそもそういうもんですとしか…
出力を眺めたいなら、コマンドプロンプト起動してそこから実行するといい
49デフォルトの名無しさん:2010/10/23(土) 17:43:15
>>47
アイコンをダブルクリックで起動すると閉じちゃうから
コマンドプロンプトから実行
よくわかんなかったらコマンドプロンプトの使い方を勉強しる
50デフォルトの名無しさん:2010/10/23(土) 18:34:14
>>48-49さん回答ありがとうございます。
コマンドプロンプトの勉強をします
51デフォルトの名無しさん:2010/10/23(土) 19:07:05
「操作盤」気に入った。おれは今度から使わせてもらう
52デフォルトの名無しさん:2010/10/23(土) 19:16:34
 プ ロ ン プ ト
「 操 作 盤 」
53デフォルトの名無しさん:2010/10/23(土) 19:22:02
>>52
マジレスすると操作盤ってコンソールのことだお
プロンプトは入力を促す > みたいな文字のこと
54デフォルトの名無しさん:2010/10/23(土) 21:59:11
コントロールパネルのことだろ
中国人死ね
55デフォルトの名無しさん:2010/10/24(日) 01:48:16
物理的なコンソールは操作卓と訳すかなー。
それだと椅子までセットになりそうだが。
盤だと上のパネル部分になるのかね。


56デフォルトの名無しさん:2010/10/24(日) 01:52:12
名古屋打ちなら任せてくれ
57デフォルトの名無しさん:2010/10/24(日) 02:44:48
おっさん自重しろ
58デフォルトの名無しさん:2010/10/24(日) 10:40:32
>>52
wwwwwww
59デフォルトの名無しさん:2010/10/24(日) 10:44:07
>>47
・コマンドプロンプトから実行
・外部コマンドが実行できるもしくはRubyのサポートがあるテキストエディタ上から実行
・NetBeansだかAptanaだかのIDEから実行

後者は2つはソースを書きながら、プログラムが終了しても実行結果を表示させたままにできるし
おすすめ
60デフォルトの名無しさん:2010/10/24(日) 13:02:28
ruby1.9.2でmongrel動かないんですか?
あとWEBrickでhttpヘッダのcharset指定ってどうやるんですか?
6160:2010/10/24(日) 13:06:19
あ、すいません。
WEBrickのほうは僕の勘違いでした。
62デフォルトの名無しさん:2010/10/24(日) 13:23:03
1.9.2です。

以下のように、ハッシュをeachで取り出したいのですが、どうも上手くいきません。
正しい記述方法を教えてもらえないでしょうか?

h = {
 :area => 1,
 :output => 2,
 :category_type => 3,
}

url = 'http//'

h.each do |key,value|
  url += key + '=' + value + '&'
end
63デフォルトの名無しさん:2010/10/24(日) 13:32:52
h.each {|key,value|
  url += urlescape(key) + '=' + urlescape(value) + '&'
}
6462:2010/10/24(日) 14:04:24
>>63 

どうもありがとうございますm(_ _)m

さっそく実行してみたのですが、

undefined method `urlescape' for Alert:Class

というエラーがはき出されてしまいました。ググってみたところ、
これは自作してdefを定義しないといけないのでしょうか?

このような形で
def urlescape(string)
string.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
'%' + $1.unpack('H2' * $1.size).join('%').upcase
end.tr(' ', '+')
end
65デフォルトの名無しさん:2010/10/24(日) 14:23:51
>>62
require 'uri'
require 'webrick'
data = {'k1'=>'v1', :k2 =>'v2', 'k3' => '3&4'}
uri = URI.parse("http://example.com/")
query = data.map{|k, v|
# do not use URI.escape
"#{WEBrick::HTTPUtils.escape(k.to_s)}=#{WEBrick::HTTPUtils.escape(v.to_s)}"
}.join('&')
uri.query = uri.query.to_s + query

p uri.to_s
6662:2010/10/24(日) 15:15:39
>>65

ありがとうございます。m(_ _)m

ちょっと、複雑でわからなかったので、
以下のような形にしたら、一応は動きました。

もっとシンプルなやり方がないものでしょうか。

url = 'http://example.com'
params = Hash::new
params['area'] = 'tokyo';
params['output'] = 'json';

params.to_a.each do |key,value|
url += key + '=' + value + '&'
end
67デフォルトの名無しさん:2010/10/24(日) 15:55:20
最大限妥当なURLを作る最短レベルに妥当でわかりやすい方法として、
URLエンコードしたものを繋げてURI#queryに追記、というの以上のものは現状あんまりないと思うぞ

これ以外の書き方をした場合、将来絶対どっかで詰まって
その回避のためにコードがながーいよ状態になるはず
Array#map と Array#join がわかりにくいと思う場合、ぜひ勉強してくれ
これらを一切使用しないコードのほうが逆にわかりにくい
query = pairs.join('&') の部分を分解しようと思ったが諦めた
WEBrick::HTTPUtils.escape は & をパーセントエンコードしないので書き換え

require 'uri'
require 'erb'
data = {'k1'=>'v1', :k2 =>'white space', 'k3' => '3&4'}
uri = URI.parse("http://example.com/")
pairs = []
data.each do |key, value|
encorded_key = ERB::Util.url_encode(key.to_s)
encorded_value = ERB::Util.url_encode(value.to_s)
pairs << encorded_key + '=' + encorded_value
end
query = pairs.join('&')
uri.query = uri.query.to_s + query

p uri.to_s
68デフォルトの名無しさん:2010/10/24(日) 15:57:23
ちなみに ERB の機能駆使で短くするとこんなのに

require 'uri'
require 'erb'
include ERB::Util
data = {'k1'=>'v1', :k2 =>'white space', 'k3' => '3&4'}
uri = URI.parse("http://example.com/")
uri.query = uri.query.to_s + data.map{|k, v| "#{u(k)}=#{u(v)}"}.join('&')
p uri.to_s
69デフォルトの名無しさん:2010/10/24(日) 16:04:18
うまくいきません、でよく解決方法アドバイスできるな。
これがエスパーってやつか
7062:2010/10/24(日) 16:16:10
>>67-68

親切にどうもありがとうございますm(_ _)m

今やろうとしていることは下記のようなことです。 

※Rails3 ruby1.9.2使用

1 JSON形式でAPIアドレスを取得。 (ここでハッシュをeachで回してURLを結合)
2 それをRuby形式に変換 (json.rbを使って変換予定)

require 'json'
def self.get_xml
url = 'http://allcoupon.jp/api-v1/coupon?'
params = Hash::new
params['area'] = '%E6%9D%B1%E4%BA%AC';
params['output'] = 'json';

params.to_a.each do |key,value|
url += key + '=' + value + '&'
end

url = JSON.parse(url)
return url
end

このような場合でも、例で示してもらえたURLエンコードなどの
記述をするべきでしょうか?
最初は単純に文字列をループで結合としか考えてなかったもので。

とりあえず array#mapなどは勉強してきます!
71デフォルトの名無しさん:2010/10/24(日) 16:30:05
入力データがエスケープ済みだと完全に信用できるのなら、エスケープはしたらイカン
二重になってしまうだけだし、その場合は単純に結合でいいんでないの

あと、URL の構成要素についての知識がないようだ
query を & で終了させたらその後にクエリ文字列が続くのかフラグメント文字列が始まるのか
区別つかなくなるからやっちゃ駄目

それと、+= は Ruby ではあんま使用されないので、使わないことをお勧めする
7262:2010/10/24(日) 16:37:30
>>71

ありがとうございます!

URLエンコードを必要とした場合の記述だったのですね。
じっくりコードを見直して、どう動いているかを確認させてもらいます!

&で終了させても普通に動いてたのでそのままにしておきましたが、気をつけたいと思います。

+=以外の方法を探してみます!

7362:2010/10/24(日) 19:33:20
JSON形式からHashに変換したデータの値を取得するのでハマっております。
Rails 3 ruby 1.9.2

※controller

url = 'http://allcoupon.jp/api-v1/coupon?area=%E6%9D%B1%E4%BA%AC&output=json'
contents = URI.parse(url).read
contents = JSON.parse(contents)
@debug = contents['coupon_id']

※view

<%= debug(@debug) %>

-----------------------------

コントローラで、
@debug = contents とすると

こんな感じでずらりと並ぶ。
coupon_id: "2086"
.......

@debug = contents['coupon_id'] とすると

"can't convert String into Integer"

というエラーが出て、上手く値が取得できません。
よい方法を教えてもらえないでしょうか?
74デフォルトの名無しさん:2010/10/24(日) 19:38:20
RailsはRailsスレで
【Ruby】Ruby on Rails Part10
http://hibari.2ch.net/test/read.cgi/php/1282991262/
75デフォルトの名無しさん:2010/10/24(日) 20:15:25
>>73
contents の冒頭はこうなってるよ。

[{"coupon_id"...


contents hash じゃなくて、要素がhashのarray

debugはYAMLで出力するんだが、
coupon_id:
じゃなく
- coupon_id:
になってなるのでは?
76デフォルトの名無しさん:2010/10/24(日) 20:17:42
>>73
<pre><%=h contents.inspect %></pre>
でもしてどんなデータ構造になっているかよく眺めたら。
77デフォルトの名無しさん:2010/10/24(日) 20:22:29
元はJSONだからハッシュじゃなくてオブジェクトだな
# こまけぇこたぁはいいんだよ!!(AA略

78デフォルトの名無しさん:2010/10/24(日) 22:41:51
COBOLからRubyにやってきたのですが、
なかなかなじめません。
A = Bを、MOVE B TO Aと記述できるように
する拡張ライブラリなどはありませんか。
79デフォルトの名無しさん:2010/10/24(日) 22:53:01
2ch は心の荒んだ人の溜り場だな
80デフォルトの名無しさん:2010/10/25(月) 00:56:51
>>78
言語ごとに流儀が違うわけだし、RubyをやるならRubyに慣れるしかないと思う。
81デフォルトの名無しさん:2010/10/25(月) 01:30:11
Rubiniusをインストールしようと思うんだが、Rubiniusのインストール事態にCRubyが必要とか言われて混乱してる。
要するにこれって大部分がRubyで記述されてるだけで正体はLLVMベースのJIT/AOTコンパイラなんだろ?
ならRubinius自体を(中間言語まででいいから)コンパイルして配布すればいいだけなんじゃ……
わざわざCRubyの上でRubinius動かす意味ってあんのかね
82デフォルトの名無しさん:2010/10/25(月) 03:30:10
【Perl,PHP】LLバトルロワイヤル13【Ruby,Python】
http://hibari.2ch.net/test/read.cgi/tech/1287944631/

新スレ
83デフォルトの名無しさん:2010/10/25(月) 06:02:11
>>81
あなたはバイトコンパイルしてあってもファイルを読めるのかもしれないが、
残念ながらふつうのRubyプログラマはバイトコードを直接読むことができない
そういう劣ったRubyプログラマ向けの「Rubyで拡張可能なRubyコンパイラ」なので
あなたは是非こんなものは捨てて高みを目指して頂きたい
84デフォルトの名無しさん:2010/10/25(月) 07:48:33
>>81
CRubyが必要だというなら、インストールすればいいだけじゃないの?
8562:2010/10/25(月) 10:23:54
>>74

すいません、基本的なハッシュの話でこっちのほうがよかったかなと思いまして。

>>75

contents[0]['counpon_id']でうまく行きました!
ありがとうございます。

しかし、<%= debug(@debug) %> で表示すると、
"\xE6\x9D\xB1\xE4\xBA\xAC" こんな感じで日本語がバグっているので、
JSON形式とRubyのハッシュに変換する前に、URLエンコードをしないといけないのかなと思っています。

>>73

debugをやりやすくするにはどうしたらいいのかなと思ってたんですが、
ずばり使いやすいコードを教えていただき、感謝!

>>77

厳密にいうとオブジェクトと考えるのですね。なるへそ。
86デフォルトの名無しさん:2010/10/25(月) 11:10:09
PGconnについて

data = conn.query("SELECT * FROM table1;")

のようにexecかqueryを使った場合、conn.clearしてメモリを解放しなさいとあるのですが、

if conn.query("SELECT * FROM table1;")[0]

のように条件判断で使った場合も本来は変数にいれてclearしないとメモリに残ってしまうのでしょうか?
87デフォルトの名無しさん:2010/10/25(月) 11:13:40
>"\xE6\x9D\xB1\xE4\xBA\xAC" こんな感じで日本語がバグっているので、

バグってなんかいません
88デフォルトの名無しさん:2010/10/25(月) 11:24:34
>>86 残ります
89デフォルトの名無しさん:2010/10/25(月) 11:26:30
PGconn ってなんですか(素)

>>86
えー、よくわからんが、
 data = 外部ライブラリ経由での配列取得行為
でメモリリークするかもしれませんという話なのなら、
 外部ライブラリ経由での配列取得行為[0]
でも外部ライブラリ経由での配列取得行為自体は行われるので、メモリリークへの対処はすべきだと思われ
90デフォルトの名無しさん:2010/10/25(月) 11:28:40
>>85

URLエンコードではなく、JSONには日本語リテラルが ¥uFFFF という
ASCIIテキストにエンコードされて入っているので、FFFF部分を生の表記に
置き換える必要があるんだけど、元のデータにJSON上の違反がある
のでめんどいな。
サロゲートペアが必要な文字のコードを1つの¥uのあとに8桁書いてる。
正しくは¥uXXXX¥uYYYYのように2文字として書く。
91デフォルトの名無しさん:2010/10/25(月) 11:39:28
>>88

ありがとうございます。
デバッグも兼ねて何がメモリに残っているか確認する方法や、ツールなどはあるのでしょうか?
92デフォルトの名無しさん:2010/10/25(月) 11:46:39
PGresult#type について

データベース内にはbool値が入っているのに、conn.queryで取得するとすべてStringになってしまいます。

プログラム内では
hoge = conn.query("SELECT * FROM table1;")
(hoge[0] ? "ほんと": "うそ")
としたいのですが、

(data[0] == "true" ? "ほんと": "うそ")
として動かしています。
bool値はbool値として取得する方法はありますか?
93デフォルトの名無しさん:2010/10/25(月) 11:47:32
>>92
bool値ってなんですか?
94デフォルトの名無しさん:2010/10/25(月) 11:52:15
そのへんは個々のライブラリの動作の話になりそうな
trueとfalseで返さないのはそれはそれで妥当な気もする
95デフォルトの名無しさん:2010/10/25(月) 12:11:11
>>94に一票
とりあえず、query[n] は文字列の配列一覧であるかのように返すように作ってあるのだろう(いや、知らんけど)
ソース見ると getisnull というメソッドがあるようにも見えるがどうやって使うのかはしらね
個々のメソッドで直接アクセスすれば true とかで返ってこないかね
96デフォルトの名無しさん:2010/10/25(月) 12:18:32
つまりは inspect の返り値をどうかしようとしてる状態なんだな
97デフォルトの名無しさん:2010/10/25(月) 12:23:34
例えば、会員サイトのユーザー訪問回数をDBに入れるとして

plus_one = conn.query("SELECT houmon_no+1 FROM table1 WHERE user_id = #{session['user_id']};")[0][0] # 例えば'3' or nilが入る
puts (plus_one ? plus_one : 1)

のようにしてるのですが、これは本来は

plus_one = conn.query("SELECT houmon_no+1 FROM table1 WHERE user_id = #{session['user_id']};") # [['3']] or [[nil]]が入る
puts (plus_one[0][0] ? plus_one[0][0] : 1)
plus_one.clear

とすべきなんですね。ありがとうございました。
9862:2010/10/25(月) 15:23:47
>>90

ありがとうございます。

普通にエンコードする関数を探して、一発で変換と思ってたのですが、
この場合はどのようにすればよいでしょうか?

1.9.2ではJSON形式変換が標準でついているらしく、
このへんを読んでみましたが、日本語に変換というのがよくわからず。
http://rurema.clear-code.com/1.9.2/class/JSON.html

http://webos-goodies.jp/archives/boost_json_conversion_using_string_inspect.html
このライブラリも1.9系だと特に関係ないようで。


これならば、xml形式を使ったほうが簡単なのかと悩み中です。
99デフォルトの名無しさん:2010/10/25(月) 16:02:58
JSONはマルチバイト周りで不適切な動作をする変換器が氾濫してるので
他に選択肢があるなら使用しないのが現状のベター
「ぜんぶえいご」なら問題ないのだけれど
100デフォルトの名無しさん:2010/10/25(月) 19:27:43
UTF-8だろ常考
101デフォルトの名無しさん:2010/10/25(月) 20:28:58
>>62 のひとは
データ型の扱いがルーズすぎるよ
Rubyは基本的に勝手に型変換とかしないので
きっちり変換しないとだめだよ

たとえデータベースに真偽値が入っているとしても、ライブラリがRubyでの真偽値を返すかどうかなんてわからないし
ライブラリのドキュメントをよく読めとしかいえないな
102デフォルトの名無しさん:2010/10/26(火) 11:19:06
(1..5).to_a
=> [1, 2, 3, 4, 5]

(1...5).to_a
=> [1, 2, 3, 4]

...は末尾のみを省くようですが、
スタートも省いてくれるような範囲を作る方法無いでしょうか?
103デフォルトの名無しさん:2010/10/26(火) 11:30:20
左閉半開区間が一般的だから特別に書き方が用意されてただけだと思う
それ以外の開区間とかは自力で書いてくれ

あと、開区間と左閉右開区間の区別をドットの数で決めるのは単なる悪習で、使用しないほうがよい
104デフォルトの名無しさん:2010/10/26(火) 11:34:51
…このコピペ、開区間になってるな

えー、
「閉区間と左閉右開区間(左閉半開区間)の区別をドットで決めるのはPerlの悪習なので使うな」
でひとつ

Ruby 的には 2,3,4 が欲しい場合は (2..4).to_a とか 2.upto(4).each do |i| ... end とか書く
1 と 5 の 数字 2つから 2,3,4 を作るのはたぶん悪だ
105デフォルトの名無しさん:2010/10/26(火) 12:00:14
irb> p 2.upto(4).to_a
[2, 3, 4]

ドットで悩むこともなくてわかりや…すい?
106デフォルトの名無しさん:2010/10/26(火) 12:21:54
>>104
覚えた言葉をむやみやたらに使いたがる子供のようだな
107デフォルトの名無しさん:2010/10/26(火) 12:32:43
>>102
普段ドット2つしか使わんから知らなかったけど
これ酷い仕様だな
108デフォルトの名無しさん:2010/10/26(火) 12:48:09
汚かったらなんでも Perl 由来と言ってしまうのもどうかと

>>107
安心しろ、3連ドットを使用してる人はまずいない
俺は>>102で今年始めて見た
109デフォルトの名無しさん:2010/10/26(火) 13:11:19
整数でなく小数含んだ範囲での比較をwhenでしたいときに
端点の含み方を自由に設定できる区間オブジェクトが標準であったら便利だろうなあ
と思うことが2年に1回くらいある
110デフォルトの名無しさん:2010/10/26(火) 13:28:37
Hashie::Mash 型になってしまっているハッシュっぽいオブジェクトをHash型に戻すにはどうしたらいいでしょうか?

require "rubygems"
require "hashie"
m = Hashie::Mash.new({:foo => {:bar => {:baz => {}}}})
m.to_hash #=> <#Hashie::Mash foo=<#Hashie::Mash bar=<#Hashie::Mash baz=<#Hashie::Mash>>>>
#=> {"foo" => {"bar" => {"baz" => {}}}} が欲しい
111デフォルトの名無しさん:2010/10/26(火) 13:42:27
全く使ったこともないが、Google で検索してマニュアルとソース読む限りでは
{}.update(m) で標準の Hash が返るように見える
112デフォルトの名無しさん:2010/10/26(火) 13:46:25
あー返らんな

Hasie を 0.4.0 にアップデートして to_hash 使え、で FA
113デフォルトの名無しさん:2010/10/26(火) 14:00:26
>>112
ありがとうございます
最新(0.4.0)にしたらto_hashで行けました!
114デフォルトの名無しさん:2010/10/26(火) 17:02:19
たまに、無限数列やカウンター付き無限ループがほしいことがあるので
step,upto,downtoのデフォルト値を無限にしてほしいと思う

不具合?
stepは無引数&ブロックなしでもEnumeratorが返ってくるけど
実際には使えない
使うときになって「引数が足りん」って怒られる
115デフォルトの名無しさん:2010/10/26(火) 17:08:11
1.upto(1.0/0){|x| p x}
116デフォルトの名無しさん:2010/10/26(火) 17:12:08
下記のようなファイルをglobで取得すると、後者のような並び順になってしまいますが、これを前者のような並び順で取得or後からソートする良い方法はありますか?
このままリネームを掛けてしまうと、意図しない並び順の昇順に変わってしまいます。かといって正規表現でやるにはややこしそうっす

# 希望する並び順
hoge-1_fuga.jpg
hoge-3_fuga.jpg
hoge-8_fuga.jpg
hoge-12_fuga.jpg
hoge-54_fuga.jpg

Dir.glob('*.jpg')

# globで取得した時の並び順
hoge-1_fuga.jpg
hoge-12_fuga.jpg
hoge-3_fuga.jpg
hoge-54_fuga.jpg
hoge-8_fuga.jpg
117デフォルトの名無しさん:2010/10/26(火) 17:17:26
>>116
「自動」でやるほうが怖いだろそれ
ということで自力でファイル名から数値を取り出してソートしれ

Dir.glob('*.jpg').sort_by{|s| s.scan(/\d+/)[0].to_i}
118デフォルトの名無しさん:2010/10/26(火) 19:39:08
value = a && b
という式がある時、
aがfalseの場合bが評価されません。

しかしaがfalseの場合もbを評価した上で、結果を返してほしい場合
簡潔な書き方はありますでしょうか?

自分の知る限りでは以下のようなコードしか思いつきません。
value = a
value = b && value
119デフォルトの名無しさん:2010/10/26(火) 19:51:32
素直に if で書け
120116:2010/10/26(火) 19:56:46
>>117
レス遅くなってすみません
sort_byってそんな風に使うんですね、目から鱗
希望通りの動作になりました
ありがとう
121デフォルトの名無しさん:2010/10/26(火) 20:25:49
>>115
いまだとそれしかできないね
1.9.2からは 1.upto(Float::INFINITY) もできるようになったけど

loopのカウンター付きがほしいなぁと
def counter( start=0, delta=1 )
なんてのを作ったら
なんか、stepとほとんどいっしょじゃね?とか思ったものでして
Enumerable#cycleなんて無限Enumeratorを返すものがあるので
無限uptoとかも少しはありなんじゃないかと思うのだが
loopと違ってメソッド名に無限って感じがしないので、採用されないだろうなぁ
122デフォルトの名無しさん:2010/10/26(火) 20:28:13
>>116
数字混じり文字列ソート - どう書く?org
http://ja.doukaku.org/295/
123デフォルトの名無しさん:2010/10/26(火) 20:34:23
>>121
Rubyによくあるいわゆる「あれば便利だとは思うが、いい名前も思いつかないし手で書いて」という奴だな
124デフォルトの名無しさん:2010/10/26(火) 23:24:47
最近Pythonに流れそうだヨ
自然言語処理ってPythonが主流なんだってよ
rubyも1.9からなら使えるみたいだけど遅きに失したようだ。
125デフォルトの名無しさん:2010/10/26(火) 23:29:53
>>122
全角数字ww
126デフォルトの名無しさん:2010/10/26(火) 23:30:47
>>124
kwsk

たまに自然言語処理の人のブログ見ても、Pythonに移行した人見かける

Pythonの有利なところキボン
127デフォルトの名無しさん:2010/10/26(火) 23:40:39
前に見かけたブログ多分これだ。

Rubyも使っていた方みたいだけど乗り換えた理由わからない
PythonはNumPyとSciPyが決め手になったようにはみえるけど

自然言語処理は Python がいちばん - 生駒日記
http://d.hatena.ne.jp/mamoruk/20090327/p1

Poll Results: What programming language(s) do you use for large-ish projects?
http://poll.pollhost.com/aGNkYXVtZTMJMTIzNzczNTIwNglFRUVFRUUJMDAwMDAwCUFyaWFsCUFzc29ydGVk/

自然言語処理の中級者向けのテキストはどのようなものになるだろうか - 生駒日記
http://d.hatena.ne.jp/mamoruk/20101016/p1

「python」の検索結果 - 生駒日記
http://d.hatena.ne.jp/mamoruk/searchdiary?word=python
128デフォルトの名無しさん:2010/10/26(火) 23:44:06
海外の人がPython使っててライブラリがある
これだけだったりして
129デフォルトの名無しさん:2010/10/26(火) 23:57:54
というか自然言語処理関連はライブラリ依存だからなー
それをしてプログラミング言語の優劣語るのも正直
130デフォルトの名無しさん:2010/10/27(水) 01:06:58
優劣は語っていない。

Amazon.co.jp: 入門 自然言語処理: Steven Bird, Ewan Klein, Edward Loper, 萩原 正人, 中山 敬広, 水野 貴明: 本
http://www.amazon.co.jp/%E5%85%A5%E9%96%80-%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86-Steven-Bird/dp/4873114705/
これの原書が
Amazon.co.jp: Natural Language Processing with Python: Steven Bird, Ewan Klein, Edward Loper: 洋書
http://www.amazon.co.jp/Natural-Language-Processing-Python-Steven/dp/0596516495

原書の題名にwith Pythonと付いてるのが・・・
131デフォルトの名無しさん:2010/10/27(水) 01:08:36
>>130
うん、で?
132デフォルトの名無しさん:2010/10/27(水) 01:11:47
おまいらこれの
ttp://www.amazon.co.jp/dp/4873114713/
pythonの章は読んだ?
133デフォルトの名無しさん:2010/10/27(水) 01:18:38
自然言語処理スレッド その3
http://hibari.2ch.net/test/read.cgi/tech/1235129481/
134デフォルトの名無しさん:2010/10/27(水) 01:21:57
よろこべ初心者ども。達人プログラマのむかしのブログに、ruby1.9でendのチェックをする機能が紹介されている。
http://pragdave.blogs.pragprog.com/pragdave/2008/12/ruby-19-can-check-your-indentation.html
たとえばこんなコードがあったとして
class Example
 def meth1
  if Time.now.hours > 12
   puts "Afternoon"
 end
 def meth2
  # ...
 end
end
endがらみのエラーがあったときはruby1.9 に -wc をつけてやれば
dave[RUBY3/Book 8:26:51*] ruby -w t.rb
t.rb:5: warning: mismatched indentations at 'end' with 'if' at 3
t.rb:9: warning: mismatched indentations at 'end' with 'def' at 2
t.rb:10: syntax error, unexpected $end, expecting keyword_end
というメッセージがでる。5行目のendが3行目のif文と対応しているけど、
インデントが揃ってないよというメッセージ。
コメントでは「これこそ1.9のキラー機能だ」と絶賛されている。
135デフォルトの名無しさん:2010/10/27(水) 01:31:17
>>134
M-x indent-region
136デフォルトの名無しさん:2010/10/27(水) 01:54:31
>>135
まあある程度はそれでなんとかなるな
どうしようもない場合はどうしようもないけど
endいっこ余ったとかw
137デフォルトの名無しさん:2010/10/27(水) 03:43:02
>>132
何かおもしろそうなことかいてある?
138デフォルトの名無しさん:2010/10/27(水) 03:46:13
>>135
IDEでもチェックしてエディタ上に表示してくれるしな
そもそもこんな問題で悩むのはemacsやIDEすら使ってない初心者だと思うか?

「Lispは括弧が多いから」「Pythonはインデントが」並のフレームじゃないのかね
139デフォルトの名無しさん:2010/10/27(水) 06:11:28
Python最強
140デフォルトの名無しさん:2010/10/27(水) 07:52:46
ブロック開始時には end を必ず自力で書くなあ

理由の 20 %くらいは確かに文法ミスサポートがないから仕方なく手でやってるクソ仕事という意味なんだが、
残り 8 割は「ここからここまでブロックがある」と自分に認識させるための重要な儀式だ
Ruby においてブロックはそれだけ特別でなおかつ普遍なのだと思う
141デフォルトの名無しさん:2010/10/27(水) 09:06:22
Vimにもこんな機能ある?>>135
142デフォルトの名無しさん:2010/10/27(水) 09:13:16
=G
143デフォルトの名無しさん:2010/10/27(水) 09:25:24
>>142
なんか若干がっかりな挙動なんだが
144デフォルトの名無しさん:2010/10/27(水) 13:41:36
nagaokaut.ac.jp死亡?
ML見れないんだが
145デフォルトの名無しさん:2010/10/27(水) 13:47:40
>>144
うん、死亡中。
といいつつMLアーカイブのリンクを張ろうとして手が止まる俺。


[ruby-list:47586] blade 壊れた
Date: Fri, Oct 22, 2010 at 14:34

原です。

ML のアーカイブの blade ですが、昨日午後突然電源が落ちて、起動しなく
なりました。バックアップ用のマシンもあるのですが、そっちもこの前、壊
れたところで、どうやら両者ともマザーボードがいかれているようです。

復旧まで1週間ぐらいかかりそうです。よろしく!
<snip>
146デフォルトの名無しさん:2010/10/27(水) 13:51:09
GMANEはなんとなく嫌いだけど
ttp://permalink.gmane.org/gmane.comp.lang.ruby.japanese/6698
147デフォルトの名無しさん:2010/10/27(水) 13:51:37
nagaokaut.ac.jp が死亡してたら大騒ぎだろさすがにw

ここ5年くらいのならこちらに
ttp://permalink.gmane.org/gmane.comp.lang.ruby.japanese/6698
ttp://blog.gmane.org/gmane.comp.lang.ruby.japanese
148デフォルトの名無しさん:2010/10/27(水) 15:11:01
>>145
サンクス
149デフォルトの名無しさん:2010/10/27(水) 15:59:41
>>138
IDEならendがいる状況になったら自動で挿入してくれないか?
do書いて改行したらend挿入される
150デフォルトの名無しさん:2010/10/27(水) 23:09:22
Rubyist Magazineの#31って何で告知しねーの?
発行元の日本Rubyの会にすら無いし
151デフォルトの名無しさん:2010/10/27(水) 23:37:53
>>134が便利なのは、「IDEやエディタで整形しなくてもすぐにわかる」点だな。
ちょうど今、まさにendのエラーがでたので試したけど、今までだったら
エディタの自動インデントとかオートフォーマッタをかけてみて、おかしいところをみつけ、
直したらインデントし直しという作業をしてたけど、その必要がなくなった。
これは地味に便利。

>>149
新規に入力するときだけを考えればそうだろうけど、コードを修正するときは
誤ってendをなくしちゃったりdoを忘れたりする。これはIDEでは防げない。
152デフォルトの名無しさん:2010/10/27(水) 23:56:28
>>151
横に間違えてますマークがつくから大丈夫
153デフォルトの名無しさん:2010/10/28(木) 00:26:36
>>86
conn.execはPGresultクラスが帰ってくるのでclear必須。
conn.queryの場合はArrayクラスが帰ってくるのでclearはいらない。
154デフォルトの名無しさん:2010/10/28(木) 09:33:30
こんな機能がキラー扱いされちゃう1.9って
155デフォルトの名無しさん:2010/10/28(木) 10:02:28
>>152
それは対応するendを見つけた上で表示されるの?そうだったらすごい。
Emacsでは最後のendのところで間違えてますマークがつくだけだから、
どこで間違えてるかは自力で見つけなきゃいけない。
だから>>134は便利だった。
IDEだったら、たとえば>>134では5行目の横に間違えてますマークがつくの?
それはぜひ初心者に教えたいので、IDE名教えて。
156デフォルトの名無しさん:2010/10/28(木) 10:50:33
Nokogiri の、この↓機能を使おうと思ってるんだけど、

doc = Nokogiri::XML(File.read('some_file.xml'))
xslt = Nokogir::XSLT(File.read('some_transformer.xslt'))
puts xslt.transform(doc)

XML が外部サーバーにある場合はどうしたらいいですか?
一旦ローカルにダウンロードして XSLT 適用する…ぐらいしか思いつかないけど、
そんなはずない気がするし。すみません、お願いします。
157デフォルトの名無しさん:2010/10/28(木) 11:38:00
…Rubyの基本ライブラリの勉強してから外部ライブラリ使え
158デフォルトの名無しさん:2010/10/28(木) 11:54:06
おまじないに見えてしまってるんだろう

File.read(path) はファイルパス path の内容をディスクから読み込んで文字列で返す
Nokogiri::XML() は引数に文字列を取るからうまく合致するわけだな
だからやっぱり文字列を返すメソッドの返り値を指定するしかあんめえ
159デフォルトの名無しさん:2010/10/28(木) 12:12:13
>>157
なるほど!そうします。
常識レベルのことなのでしょうが、自分にはありがたいです。
ありがとうございます。

>>158
なんとな〜くわかった気がします。
File.read(Path) というカタチにこだわらず、Nokogiri::XML() に
XML ファイルの中身(文字列)を渡してあげればいいということでしょうか。
やり方がわからないので >>157 さんの言われるとおり、標準ライブラリの勉強をしてみます。
ありがとうございます、助かりました。
160デフォルトの名無しさん:2010/10/28(木) 12:44:43
>>157
>>158
いちおう解決できました。
実は net/http で XML の内容を取得することは出来ていたのですが、
doc = Nokogiri::XML(response.body)
とやってもうまくいかなかったので、なにか根本的に
間違っているのだろうと思い、質問させていただいたのでした。

おそらく正しいやり方ではないのでしょうが、
response.body をグローバル変数に代入して
doc = Nokogiri::XML($hoge)
とやってみたらとりあえず意図する結果が得られました。
ありがとうございました。
161デフォルトの名無しさん:2010/10/28(木) 12:45:25
めんどくさいし require 'open-uri'; URI.parse("http://www.2ch.net/").read でいいよね
162デフォルトの名無しさん:2010/10/28(木) 16:48:23
Threadを使って並列に処理させるプログラムを作ろうと思っています。
あるサイトにあったソースを実行してみたところ問題が起きました。
def foo(name)
20.times do
print name
print " "
end
end

def test1
t1=Thread.new{foo("a")}
t2=Thread.new{foo("b")}
t1.join
t2.join
end
test1
実行してみると
a a a a a a a a a a a a a a a a a a a a b b b b b b b b b b b b b b b b b b b b
となってしまい、これではThreadにした意味がなく困っています。
rubyのバージョンは1.8.7です。
163デフォルトの名無しさん:2010/10/28(木) 16:58:19
めんどうだから全く試してないけど

print name

を20回ごとき超一瞬なんだから、
1回ごとにsleepとか入れないとそういう結果になってもおかしくないと思うけど。
164デフォルトの名無しさん:2010/10/28(木) 17:00:14
スレッドt2が動き始めるまでに
スレッドt1の実行が終わっちゃうからですよ
処理内容が軽すぎるのが要因
繰り返しを数百以上にするとか
sleep 0.1
をはさんでみるとか

あとはスレッドの切り替わるタイミング
Ruby1.8.7だと混ざらないけど
1.9だとそのままでもちゃんと混ざりますよ
1.9ではスレッドの実装方法が変更されたので
165デフォルトの名無しさん:2010/10/28(木) 17:04:13
おなかすいてきたしめんどくさいから検証してないが、
標準入力に何かを表示するプログラムはスレッドの検証にまったく向いてない
最初に
$stdout.sync = true
してから試せ
166デフォルトの名無しさん:2010/10/28(木) 17:07:00
Aがcpuを占拠中にBの仕事が入ってこないんじゃテストの意味ないな。
167デフォルトの名無しさん:2010/10/28(木) 17:21:36
>>163>>164
簡潔に説明しようと思い、省いてしまいましたが
timesの回数を10万などに増やしましたがしかし結果は
t1のスレッドの処理が終わってからt2という流れになってしまいます。
sleepを入れたとこ
ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab
のような結果になりました。
ただ何度実行してもこの結果というのはrubyのスケジューリングの仕様なんでしょうか?
取り敢えず1.9にしてもう一度試してみます。

>>165
入れたところ処理されるごとに表示されました。

みなさんありがとうございます!!!
168デフォルトの名無しさん:2010/10/28(木) 17:49:13
>>165
それはリアルタイムに起きているなにかを確認したいときで
今回のはおなじ出力バッファに書き込んでいく順序をみたいのだから
あまり関係ないんじゃないの
と、$buff = '' でprintの代わりに$buff.concatするようにしたら
文字列に追加するコストが軽すぎるのか
1.9でも a 20個の後に bになってしまった
ここはやはりsleepを入れとけって事で

>>167
ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mingw32]だと
200.times程度でも混ざるんだけどな
169デフォルトの名無しさん:2010/10/28(木) 17:55:15
逆に詳しい人に質問
1.8以前だと実際に動いているのは一つだけで
Ruby自身が適当な間隔でスレッドを切り替えながら実行している
1.9だと複数スレッドがネイティブに複数動いてるけど、GILがあるので
ある一つのスレッド以外のスレッドはGILの開放待ちしてる
IO処理とかの一部Ruby外の処理ではGILを開放するので並列動作するときもある
って理解であってるの?

InfoQのRubinius 1.1の記事読んだら
将来RubiniusもGILを使わないようにするので
Ruby実装の中でGILがあるのはMRIだけになる
と、あったんだけど
JRubyやIronRubyって今でも並列動作するの?
Windows版のMRIしか知らんのもので
170デフォルトの名無しさん:2010/10/28(木) 19:23:21
ruby1.9.2、rails3 を使っております。 eachで質問させてください。

下記のようにeachで回すと、なぜかhash全体の内容も最後に表示してしまいます。
この場合、指定した coupon_idの数値のみを表示するにはどうすればよいでしょうか?

※view内のコード

<% hash = [{"coupon_id"=>"2247", "coupon_area"=>"東京",},
{"coupon_id"=>"2254", "coupon_area"=>"東京",}] %>
<br>
<%= hash.each do |item| %>
<%= item['coupon_id'] %>
<br>
<% end %>

※結果

2247
2254
[{"coupon_id"=>"2247", "coupon_area"=>"東京"}, (ここがいらない)
{"coupon_id"=>"2254", "coupon_area"=>"東京"}] (ここがいらない)
171デフォルトの名無しさん:2010/10/28(木) 19:55:54
Railsは知らないのだけど
4行目が
<%= hash.each do |item| %>
じゃなくて
<% hash.each do |item| %>
じゃないの?
172デフォルトの名無しさん:2010/10/28(木) 21:42:59
なおりました
ありがとうございました
173デフォルトの名無しさん:2010/10/29(金) 01:00:27
>>171
<% %> と <%= %> はたしかに間違えやすい
これはeRuby仕様の失敗だった
174デフォルトの名無しさん:2010/10/29(金) 01:02:46
>>155
横からだが>>134のコード試してみた。
NetBeans 6.9では最後にエラーマークが付くだけだったわ、残念

if endやdo endの対応括弧の強調表示もあるけど、
他のエディタにもあるし、それではわかりにくいということだよな

indent-region相当の自動インデント使うと予想通り1つendがないずれたインデントになってわろたw


それよりもヒント機能で式?が1個しか無いからifを後置にするか聞いてきたのがおもしろかった
変化後のプレビュー表示できたりIDEは無駄に豪華な機能あるよな。
リファクタリング系の機能なんだろうけど
175デフォルトの名無しさん:2010/10/29(金) 01:08:46
>>173
あまり関係ないが、
Rails 3より前はformやform_forなどform類のヘルパーが<%= %>じゃなくて、<% %>だったり疑問があったが、
Rails 3から<%= %>に統一されたな

どっちにしろ、<%= と <% はちょっとわかりにくい。見かけが
初心者に他のtemplateエンジンをつかえというのもねえ
176デフォルトの名無しさん:2010/10/29(金) 07:41:29
<% %>
<%print( )%>

これで一目でわかる!
177デフォルトの名無しさん:2010/10/29(金) 07:46:49
っつーか hash.each が戻り値を持つからおかしなことになるんだよ
178デフォルトの名無しさん:2010/10/29(金) 08:15:26
<%= をハイライト表示するよう表示するエディタを使っている。
179デフォルトの名無しさん:2010/10/29(金) 08:28:04
<% %><%= %> はASPのまね?
180デフォルトの名無しさん:2010/10/29(金) 08:29:35
そう
181デフォルトの名無しさん:2010/10/29(金) 08:49:58
>>178
なるほど、それいいな。採用。
182デフォルトの名無しさん:2010/10/29(金) 09:03:05
>>177
君のeachはまたforの書き換えのようだな
183デフォルトの名無しさん:2010/10/29(金) 09:13:35
find_all「フフフ…奴は我らコレクションメソッド四天王の中でも一番の小物…」
map「(…え?)」
inject「(創立メンバーだよねあの人)」
184170:2010/10/29(金) 10:55:28
>>171

ありがとうございます!上手くいきました!
185170:2010/10/29(金) 10:57:09
>>175

そうなんです。Rails3から <%= %>に統一されたと
本に書いていたので、すべて <%= %>で記述してよいと思っていたのです。
186デフォルトの名無しさん:2010/10/29(金) 11:11:05
うおーオマジナイ厨がー
187デフォルトの名無しさん:2010/10/29(金) 11:22:39
each文の書き方は do end か { } を使う方法、
どちらがスタンダードなのでしょうか?

netbeansの入力補助では { } のほうが出てきますが、 do end のほうが
よく説明では見るような気がします。
188デフォルトの名無しさん:2010/10/29(金) 11:23:30
標準はない
189デフォルトの名無しさん:2010/10/29(金) 11:39:24
do end
190デフォルトの名無しさん:2010/10/29(金) 11:46:34
>>187
1行で書けるブロックの場合はかなりの割合で { }
直後にドットでメソッドチェーンを繋げる場合はほぼ確実に { }

each の用途的に each do ... end が多くなるとは思う
191デフォルトの名無しさん:2010/10/29(金) 11:47:39
>>187
自分ルールでは、1行で収まる場合は、{ }
複数行になる場合は、do end
192187:2010/10/29(金) 11:53:03
すごく参考になりました。
みなさんどうもありがとうございます。
193デフォルトの名無しさん:2010/10/29(金) 13:07:36
引数objに対しメソッドA メソッドBを希望するメソッドXが
あったとしてメソッドXがそれを必要とすることをどうやって調べてる?
更にメソッドXがメソッドAにメソッドCを期待してるときもどう判断してんの?
メソッドXをひたすらトレース?
194デフォルトの名無しさん:2010/10/29(金) 13:10:52
よくわからんが依存はマニュアルに書いとけ
195デフォルトの名無しさん:2010/10/29(金) 13:10:54
間違えた
×メソッドAにメソッドCを期待
○メソッドAにメソッドCをもつオブジェクトを返す事を期待
196デフォルトの名無しさん:2010/10/29(金) 13:21:50
>>149
書くとしてどう書くのが理想かな。
結局C++のコンセプトみたいになんのかな。
197デフォルトの名無しさん:2010/10/29(金) 13:31:33
def m(param)
s = param.read
s.scan...
end

だとして、メソッド m の引数 param は read メソッドが動作しないと困る、と
これをどう「書き手」へ知らせるかというと、やっぱりマニュアルに書くしかないと思う
メソッド m の名称を read 可能な引数を取りそうな名前にするとか
引数 param の名称を read しそうな名前にするとかもあるが、確実性はかなり低くてオナニーレベル

一応 Ruby スクリプトとしては respond_to? が使用できるが、
複雑な特定の条件分岐をするのでない限り、
「param に read メソッドなんてありませんが何か」という NoMethodError を出すのと本質的にも対処的にも変わらない

def m(param)
if param.respond_to?(:read) then
s = param.read
else
raise ArgumentError "wrong type argument (needs READable)"
end
s.scan...
end
198デフォルトの名無しさん:2010/10/29(金) 14:47:26
問題は公式のマニュアルも適当なところだな。
「引数○○には××を指定します」と書いてあったので文字列渡したら動かなくて
サンプルコード検索したらシンボルでブチキレ
199デフォルトの名無しさん:2010/10/29(金) 15:00:38
フィードバックしなきゃ改善されないんだが
200デフォルトの名無しさん:2010/10/29(金) 15:02:23
凡人はRubyという素晴らしいツールを手に入れたとしても
数十年来の「型チェック」の呪いからは結局逃れられないのですよ
arg.kind_of?
arg.respond_to?
201デフォルトの名無しさん:2010/10/29(金) 15:07:18
つまり回答はこうか

>>193
オブジェクトの持っていないメソッドを呼ぶとRubyは例外を発生させて報せるから問題ない
202デフォルトの名無しさん:2010/10/29(金) 15:14:53
>>201
正確に言うなら「静的に保証する方法はない」って所か
食わせる引数を雰囲気で想像して、テストにかけろ
かなり適当だが意外にうまくいくのがダックタイピングの経験的根拠

Scalaならできるんだっけ?
203デフォルトの名無しさん:2010/10/29(金) 15:45:47
文字列を要求するメソッドが文字列以外を渡されたときto_sしちゃだめなの?
204デフォルトの名無しさん:2010/10/29(金) 15:55:00
>>203
ホントはあまりよくないが、別に悪いわけでもない
arg.to_s.dup ... と続くメソッドは意外とある
「極力文字列に変換して処理します」と解説つけてればOK

「String以外が渡ったら内部のどっかでエラーが出るだろう」
という期待をしているスクリプト作者もいることを忘れてはならない
205デフォルトの名無しさん:2010/10/29(金) 17:05:44
each を使って、hashに値を追加していきたいです。

下記のようなコードでは上書きされてしまい、最後の値だけ記録されて
しまうのですが、正しいやり方はどうすればよいでしょうか?

def self.get_goods

hash = [{"id" => "500",},{"id" => "60"}]

goods = Hash.new

hash.each do |item|
goods['id'] = item['id']
end

return goods
end
206205:2010/10/29(金) 17:11:40
array だと pushメソッドで値を追加できたのですが。。
207デフォルトの名無しさん:2010/10/29(金) 17:12:49
Hash のメソッド全部読め
Hash オブジェクトに対する登録の仕方を勉強するんだ
208デフォルトの名無しさん:2010/10/29(金) 17:19:55
そういうことをしたければハッシュの中身を配列にする。
1つのキーに対して複数の値を格納する能力をHashは持ってない。

hash = {"id" => ["500", "60"]}

ていうかよく見たら hash = [{"id" => "500",},{"id" => "60"}] って、中身にハッシュが入ってる配列だよね。
何をどうしようとしてそんなもん作ったわけ?
209205:2010/10/29(金) 17:32:11
>>207

もう一度レシピブックを読んで、goods = Hash.new{|h, key| h[key] = [] }
のようなやり方を試してみたところ、一応全部追加できました!

しかし、どうも並び順がおかしい。。


>>208

ありがとうございます。
実は、JSON形式で取得したものを配列に変換したために、
こんな形になっているのです。

なので、中身を配列にすることが無理かもしれません。。

うーむ、どうしようもない。。
210デフォルトの名無しさん:2010/10/29(金) 18:35:30
MRI 1.9では *たまたま* 追加した順序になるような実装を使用しているが、
本来 hash に並び順はないものと理解すべき。
211デフォルトの名無しさん:2010/10/29(金) 18:51:36
>>210
順序は保存されます
212デフォルトの名無しさん:2010/10/29(金) 18:57:51
>>210みたいな人って「Integerとはそもそも本来整数で〜」とか言ってそう
213デフォルトの名無しさん:2010/10/29(金) 19:00:16
>>210の人気に嫉妬

というかPerl由来とはいえハッシュという命名自体が今となっては以下略
214デフォルトの名無しさん:2010/10/29(金) 19:08:37
>>213
> ハッシュという命名自体が
$ irb
irb(main):001:0> p hash
-607941458

…?

というか>>205みたいなスクリプトを見るといつかどっかで爆発しそうで気になって仕方がないw
215デフォルトの名無しさん:2010/10/29(金) 19:13:49
class や id という変数名もめんどくさい
end に至っては同名のローカル変数を end の形で使うことも(ふつうは)できない
216デフォルトの名無しさん:2010/10/29(金) 21:55:11
>>210
スクリプト屋じゃないせいかHashか格納領域(コレクション)と
結びつかん。
データが異なることは示すがデータが同じ事は保証しない値。
そういう見方だな。
217デフォルトの名無しさん:2010/10/30(土) 04:28:54
初心者に1.8.7オススメって無責任なことテンプレに書いたの誰?
過去の資産を引きずっていない真っ白な初学者こそ
最新の1.9.2から始めるべきでしょうよ。
218デフォルトの名無しさん:2010/10/30(土) 04:59:13
>>217
それが正しい、1.9を勧めるおまえは間違ってるからこのスレから去れと言って、
執拗に1.8.7を推奨してたやつ。知らんの?
>>210みたいなやつ。同一人物かもw
219デフォルトの名無しさん:2010/10/30(土) 05:13:44
Hello, Ruby!
と結果に表示させた後に3秒後に結果が消えるようにするにはどうすればいいんでしょうか?
220デフォルトの名無しさん:2010/10/30(土) 05:17:11
八ッシュの中にいくつか入った数値の合計をプログラム上で計算して、
それをまた同じ八ッシュ内に入れるにはどうすればいい?

221デフォルトの名無しさん:2010/10/30(土) 05:18:26
もうすこし仕様を厳格に記述してくれ
222220:2010/10/30(土) 05:28:09
データが
1月 500 400 300
2月 400 200 100
みたいな感じで、

そのデータの月部分がハッシュのキーで、バリューは400 200 300の部分。
で、プログラム上で400足す200足す300の計算をして、
その合計(900)をまたハッシュ[1月]に入れなきゃならないんだ。

ちなみに元の400 200 300はそのまま残したい。

こんなので良いでしょうか?


‥説明下手でごめんねorz
223デフォルトの名無しさん:2010/10/30(土) 06:04:50
元が "400 200 300" なのか ["400", "200", "300"] なのか [400, 200, 300] なのかわからんし
合計を "400 200 300 900" と同列にするのか [[400, 200, 300], 900] みたいに別にするのかもわからん
それと{"1月"=>[400, 200, 300]} と {"1月"=> 900} を別にせず同じハッシュに入れる意味も
224デフォルトの名無しさん:2010/10/30(土) 07:56:34
>>222
そんな説明じゃわからない。
そのデータでなんで400+200+300を計算するの?
1月なら500+400+300だし、2月なら400+200+100じゃないの?
ハッシュはどんな構造になっているの?かりに
{ "1月" => [500, 400, 300], "2月"=>[400, 200, 100] }
だとして、900を追加したら
{ "1月" => [500, 400, 300, 900], "2月"=>[400, 200, 100] }
になるけど、これでいいの?

#上司がこんな仕様もってきたらぶちきれる。
225デフォルトの名無しさん:2010/10/30(土) 08:27:51
>>220,222
出力データの形式(仕様)が定義されていないいから、適当に作ってみた。
もし明確にしてくれれば、書き直すよ。

def calc(input_data)
 Hash[
  *input_data.map { |month, items|
   [
    month,
    {
     :orig => items,
     :sum => items.inject(0) { |result, item| result + item }
    }
   ]
  }.flatten
 ]
end


(irbでの実行例)

$ irb -rcalc.rb
irb(main):001:0> p calc({ 1 => [500, 400, 300], 2 => [400, 300, 200] })
{1=>{:orig=>[500, 400, 300], :sum=>1200}, 2=>{:orig=>[400, 300, 200], :sum=>900}}
=> nil
irb(main):002:0>
226デフォルトの名無しさん:2010/10/30(土) 08:43:34
爆釣れだな
227225:2010/10/30(土) 08:44:54
>>224は(副作用の無い)関数型のコードだったけど、同じ処理を手続き型で書き直してみた。
こちらの方が効率は良いし、おそらく理解し易いと思う。(実行結果は>>224と同じなので省略)

def calc2(input_data)
 output_data = Hash.new

 input_data.each { |month, items|
  sum = 0
  items.each { |item| sum += item }

  output_data[month] = { :orig => items, :sum => sum}
 }

 output_data
end
228デフォルトの名無しさん:2010/10/30(土) 08:46:29
>>219
Ruby の範疇外だな
ああ、Rubyで3秒待つのは sleep(3) でできる
それ以外のことは「表示した先」のマニュアルをご覧になって、system() あたりで指示してください
229225:2010/10/30(土) 09:27:15
>>222
>‥説明下手でごめんねorz

データ構造の仕様を明確に(=形式的に)記述する手法はいくつかある。以下はBNFと呼ばれる書き方。
(もしBNFを知らなければ、Wikipedia等で勉強してね)

 <入力データ> ::= <入力レコード>*
 <入力レコード> ::= <月> <項目>*

 <出力データ> ::= <出力レコード>*
 <出力レコード> ::= <月> <出力レコード本体>
 <出力レコード本体> ::= <項目>* <合計>

 <月> ::= 文字列
 < 項目 > ::= 整数
 < 合計 > ::= 整数

他にも、今回のケースだと(IntegerやStringといった)基礎オブジェクトの他には
ArrayとHashしか使われていないから、JSONやYAMLのスキーマ定義言語で代用してもいい。
・JSONの可能性がグンと拡がるぞ! JSONスキーマ - 檜山正幸のキマイラ飼育記
  http://d.hatena.ne.jp/m-hiyama/20090413/1239581682
・Rubyist Magazine - プログラマーのための YAML 入門 (検証編)
  http://jp.rubyist.net/magazine/?0012-YAML

あるいは、MLやHaskellのような「強いデータ型」の言語の記法でもいい。
(ちなみに、Haskellの記法はRubyリファレンスのメソッド定義記法として利用されている)

おそらくこのスレを覗いている人であれば、これらのいずれかで書けば、理解してくれると思うよ。
230デフォルトの名無しさん:2010/10/30(土) 09:36:18
そんなの日本語で書けばいいじゃん

  [
  5月 => [第1週金額, 第2週金額, 第3週金額, ..],
  6月 => [第1週金額, 第2週金額, 第3週金額, ...],
  7月 => [第1週金額, 第2週金額, 第3週金額, ...],
  }
 で月ごとの合計金額を出して
  {5月 => 5月合計, 6月 => 6月合計, 7月 => 7月合計, }
 というハッシュを作りたいです

とかいうののどこにわかりにくくなる余地があるんだ
231デフォルトの名無しさん:2010/10/30(土) 11:10:03
日本語の便利なとこだな
232220:2010/10/30(土) 11:39:46
力尽きて寝て起きたら凄い事に。

とりあえず今から参考にして頑張ってきますノシ

ありがとー。
233デフォルトの名無しさん:2010/10/30(土) 11:40:45
>>230
さすがエスパー
234220:2010/10/30(土) 12:01:56
一応補足しておきます〜


{ "1月" => [1週目売上, 2週目売上…], "2月"=>[1週目売上,2週目売上…] }
ってハッシュがあって、
売上合計を求めてそれを
{ "1月" => [1週目売上, 2週目売上…,売上合計], "2月"=>[1週目売上,2週目売上…,売上合計] }
で、最後に

  月     1週目売上   2週目売上  〜  売上合計
のように出力したい。
出力の際は売上合計をソートした状態で、売上合計が高い順から表示させる

って感じです。      
235デフォルトの名無しさん:2010/10/30(土) 12:09:56
>{ "1月" => [1週目売上, 2週目売上…,売上合計], "2月"=>[1週目売上,2週目売上…,売上合計] }
この構造は超無駄
「端っこ」を特別欄扱いする表計算思考は捨てなされ

{ "1月" =>
{売上 => [1週目売上, 2週目売上…],
合計 => 1月合計},
"2月" =>
{売上 => [1週目売上, 2週目売上…],
合計 => 2月合計},
...}
みたいなのがとりあえず妥当

data.each do |month, h|
sales = h[売上].join("\t")
sum = h[合計]
puts "#{month} \t #{sales} \t #{sum}"
end

こんなんでなんとかなんね?
236デフォルトの名無しさん:2010/10/30(土) 12:19:37
あ、ソートするって書いてあったな

data.sort_by{|month, h| h[合計]}.reverse_each do |month, h|
sales = h[売上].join("\t")
sum = h[合計]
puts "#{month} \t #{sales} \t #{sum}"
end
237デフォルトの名無しさん:2010/10/30(土) 12:23:51
Rubyでは、下記のPHPのように、連想配列にループで値を順番に追加
するにはどうすればよいでしょうか?

for ($i = 0; $i < $itemNumberLimit; $i++){
$items[$i]["url"] = $currentXml -> Items -> Item[$i] -> DetailPageURL;
$items[$i]["image"] = $currentXml -> Items -> Item[$i] -> LargeImage -> URL;
}
238デフォルトの名無しさん:2010/10/30(土) 12:28:58
items = current_xml.items.map {|item| { 'url' => item.detail_page_url, 'image' => item.large_image.url } }
239デフォルトの名無しさん:2010/10/30(土) 12:32:46
>>237
正直、ループ内で値作って追加とかそのへん綺麗に書けなくて苦手なのだ

h = {}
keys = ['k1', 'k2', 'k3']
values = ['v1', 'v2', 'v3']
として
new = Hash[keys.zip(values)]
h.update(new)
とか
keys.each_with_index do |k, index|
h[k] = values[index]
end
とか
240237:2010/10/30(土) 12:42:33
>> 238 >>239
即レス、どうもありがとうございます。

むむむ、結構難しいですね。
ただいま、レシピブックなどを参照して格闘中です。
241225:2010/10/30(土) 14:16:10
>>234
最終的な出力形式に合わせて変更してみた。ただし、中間データの形式は、
(>>234の「ハッシュのハッシュ」ではなく、)「ハッシュのリスト」にしている。

def calc3(input_data)
 input_data.map { |month, sales|
  {
   :month => month,
   :sales => sales,
   :sum => sales.inject(0) { |result, sale| result + sale }
  }
 }.sort_by { |record|
  record[:sum]
 }.reverse.each { |record|
  month = record[:month]
  sales = record[:sales]
  sum = record[:sum]

  printf("%2d月 %s %4d¥n",
   month,
   sales.map { |sale| format("%3d", sale) }.join(' '),
   sum
  )
 }

 nil
end

(実行結果は次のカキコで)
242225:2010/10/30(土) 14:17:19
(>>241の実行結果)

$ irb -rcalc3.rb
irb(main):001:0> calc3({ 1 => [500, 400, 300], 2 => [400, 300, 200] })
1月 500 400 300 1200
2月 400 300 200 900
=> nil
irb(main):002:0>
243デフォルトの名無しさん:2010/10/30(土) 14:29:59
>>240
いきなりだとワケワカだから

items = []
for i in 0...limit do
items[i] = {}
items[i]['url'] = url
items[i]['image'] = image
end

くらいから始めればいい(上のも ... がちと罠くさいが)
244デフォルトの名無しさん:2010/10/30(土) 14:41:50
>>243
コレクションの意味を失わせる上に現状誰も使っていないforにわざわざ誘導する意味は何?
「RubyでHTMLを記述するにはcgi.rbが便利です」とか言われたら怒るだろ
245デフォルトの名無しさん:2010/10/30(土) 15:18:53
>>229
全然関係ないが、HTMLがその形式だったら閉じタグもいらないしファイルサイズも減るしいいことづくめだったのにな
HTMLは可読性が最悪になってしまった
246デフォルトの名無しさん:2010/10/30(土) 15:21:23
>>244
あまりにも違うと、もとのと対応がとれなくて必要以上に理解が困難になるから。
だから「から始め」と書いてある。

247220:2010/10/30(土) 15:58:19
おかげでなんとか出来たよー
ありがとうございましたーノシ
248デフォルトの名無しさん:2010/10/30(土) 18:37:55
rubyの資格ってどれくらい意味あると思う?
こんなかで持ってる人どれくらいいる?
249デフォルトの名無しさん:2010/10/30(土) 18:43:31
>>248
話のネタになる
それ以上の意味はないが、会話のきっかけを生めるという点でけっこう貴重
他の資格ではなかなかこうはいかない
250デフォルトの名無しさん:2010/10/30(土) 19:10:11
>>249
たしかに自分がRubyに興味がある、好きであると伝える手段としてはかなり良さそうですよね
251デフォルトの名無しさん:2010/10/30(土) 22:12:03
>>248
会社で5人とってもらってインテグレータになるのを目指してます。
ちょっとした会社の宣伝になる。
252デフォルトの名無しさん:2010/10/30(土) 22:47:23
>>251
なるほど、個人としてしか考えてませんでしたが、そういうのもあるんですね
silverが5人でいいのかな?goldだとむずかしそう
253デフォルトの名無しさん:2010/10/30(土) 22:54:38
良くも悪くも見せ資格だな
持ってるから何か能力的に強まるというものではない
「わたしはRubyがすきです」
「Rubyにきょうみがあります(きゃっかんてきないみで)」
という感じか
Rubyライブラリ公開してますURLはここ、とかの軽い代替になるものだな
254デフォルトの名無しさん:2010/10/30(土) 23:06:38
Goldは結構難しくなってるらしいが、出題範囲の
" よく使用されるライブラリ(socket、rdocなど)" ってのがいろいろ不安。
コメントの書き方やドキュメント生成の話ならともかく、
ライブラリとしての rdoc なんてそう使わないだろうに。
rdocと同じレベルで生ソケットの知識が並んでるのも理解しがたい。
255デフォルトの名無しさん:2010/10/31(日) 08:48:27
>>248
まだ持っている人も関心ある人も少ない点が貴重

>>254
なんでsocketなんだろうな

だからと言ってRailsだされてもそれだけ別試験作れそうだけど
256デフォルトの名無しさん:2010/10/31(日) 10:53:03
>>7のinfoseekの無料HP終了について
ActiveScriptRubyのリンク先は以降こちらで
ttp://www.artonx.org/data/asr/
257デフォルトの名無しさん:2010/10/31(日) 11:44:09
258デフォルトの名無しさん:2010/10/31(日) 13:18:47
breakとcontinueとreturnの違いをわかりやすく解説したページないですか?
259デフォルトの名無しさん:2010/10/31(日) 13:22:36
>>258
breakとcontinueは使うな
他の手段考えろ

以上
260デフォルトの名無しさん:2010/10/31(日) 13:29:38
proc途中でreturnもそれはそれで奇怪な動作を…
261デフォルトの名無しさん:2010/10/31(日) 13:30:02
>>259
マジ?
今読んでいる「Rubyはじめてのプログラミング」って本では
while true から特定のキー入力を判定して
breakで抜ける手法を使いまくりなんだが。
262デフォルトの名無しさん:2010/10/31(日) 13:34:23
>>258のbreakは無限ループからの条件付脱出のbreakの話ではないと思うの
263デフォルトの名無しさん:2010/10/31(日) 13:48:10
continueじゃなくてnextでした。
forやwhileではなくブロックの中で使うほうです。
264デフォルトの名無しさん:2010/10/31(日) 13:57:39
return は、その時点でのレキシカルスコープのメソッドから抜けるもの。

next と break はブロックのイテレーションを抜けたり、ブロック付きメソッド呼び出し自体から抜けるもの。

Proc のことはブラックマジックなので考えない。
265デフォルトの名無しさん:2010/10/31(日) 14:16:15
ループの中で、処理対象外をスキップし、ネストを浅くするためにnextはよく使う。
266デフォルトの名無しさん:2010/10/31(日) 18:02:10
ブロックって
file.each do |line|
hoge
done

file.each {|line|
hoge
}
と二通りの書き方があるようですが、プログラム的にはどちらも同じ意味になるのでしょうか?
違うのならどのような違いがあるのでしょうか?
267デフォルトの名無しさん:2010/10/31(日) 18:06:02
268デフォルトの名無しさん:2010/10/31(日) 19:13:36
どっちでもいい場合は >>187 からの流れで。

強いて言えば結合の強さが違うので、1つのメソッドの引数に別の
メソッドの返値が必要なケースで、その記述にブロックを付けたい
場合、どっちにつくことになるのかは考える必要がある。
実際に遭遇することはあんまりないけど、予想外の結果になった
ときに原因として疑うべき箇所ではある。

foo bar { ... } は foo(bar { ... })
foo bar do ... end は foo(bar) do ... end



269デフォルトの名無しさん:2010/10/31(日) 20:24:22
すいません
急に仕事でJRubyを使用しての開発を行うことになりました。
とりあえず本を探しているところですが、あまりにも本が少なくて・・・。
RubyとJRubyとで命令や書き方が同じであれば、Rubyの本を買ってしまおうかと
思っています。
違いはJavaのフレームワークで動くか位の違いという認識で問題ないでしょうか?
270デフォルトの名無しさん:2010/11/01(月) 09:03:05
>>266
Rubyクックブック P.39〜P.40より引用

Rubyには、コードブロックを作成するための構文が2つある。ブロック全体が1行に収まる場合は、
中かっこ( { } )で囲むと読みやすくなる。

[1, 2, 3].each { |i| puts i }

ブロックが1行に収まらない場合は、doキーワードとendキーワードで囲むと読みやすい。

[1, 2, 3].each do |i|
 if i % 2 == 0
  puts "#{i} is even."
 else
  puts "#{i} is odd."
 end
end

ブロックの戻り値が重要である場合に中かっこを使用し、ブロックの副作用が重要である場合に
do...end構文を使用することもある。中かっこ構文はdo...end構文よりも優先度が高いことに注意しよう。
例として、次の2つのコードについて考えてみよう。

1.upto 3 do |x|
 puts x
end

1.upto 3 { |x| puts x } # SyntaxError: compile error

2つ目の例では、コードブロックは関数呼び出し 1.upto 3 ではなく、3にバインドする。スタンドアロン変数に
コードブロックを使用することはできないため、コンパイルエラーになる。疑問に思うなら、かっこを付けてみよう。

1.upto(3) { |x| puts x }
271デフォルトの名無しさん:2010/11/01(月) 09:14:17
実際には問題になることは稀

空白区切りなんて
「Rubyって空白でもいいんだすげえwwwwwwwww」
と浮ついた人が麻疹のように使うだけ
普通の人はパーサに優しいように括弧をつけてメソッドにくっつけて書くようになる


…稀に凄い人がDSL的読み下し可能な状態で書き綴ることがあるが、
アレは自分でもできそうに見せる奇術師の手品なので真似厳禁
272デフォルトの名無しさん:2010/11/01(月) 09:20:25
ブロック付きの場合は引数なしの場合を除いて必ず括弧を付ける
ブロックは波括弧

こういうルールで俺はやってる
273デフォルトの名無しさん:2010/11/01(月) 09:22:26
そういや誰もレスしてないな

>>269
Rubyでなにか製品を開発する必要がある場合は、ほぼ100パーセントただのRubyが選ばれる
JRubyという指名がある場合は、指名者がただのアホでない限り、実際に必要なのはJavaやJavaとの連携だ
仮にRubyに超絶熟達していても、JRubyではプロダクトを作れない

というわけで最初は素直にJRubyの本買え
この本ではRuby部分がわかんねー、というようになったら、それ用にRubyの解説本でも買うよろし
274デフォルトの名無しさん:2010/11/01(月) 09:26:26
>>273
スクリプトファイルやライブラリ単体としてはRubyでもJRubyでも動くんだけどね
開発でJRubyというご指名ならJavaがぐんにょり溶け込んだコードが要るのでしょう
275デフォルトの名無しさん:2010/11/01(月) 10:11:44
Ruby環境構築講座 Windows編
達人出版会
ttp://tatsu-zine.com/books/1

とうとう始動したかー。
276デフォルトの名無しさん:2010/11/01(月) 10:29:02
Rubyを使う環境じゃなくて、作る(ビルドする)環境の話なのか。
277デフォルトの名無しさん:2010/11/01(月) 11:39:48
実質artonさんひとりにおんぶにだっこだしなぁ
278デフォルトの名無しさん:2010/11/01(月) 11:54:42
arton:
usaさんがWin32のサポートやめようとしてるっていうのは全く知らなかったんだけど、 usaさん独りでやるのは
そろそろ辛そうだなあというのは傍で見てて思った。
もちろんなかださんとかもやってくれてるんだけど、基本的なところはみんなusaさんにかぶってるしね。 で、
Windowsのまずいのは、それはWindowsのすごいところでもあるんだけど、 あらゆる組み合わせで動くように
なってるもんで、 たとえば遅い遅いという話が出たとして、ぼくやusaさんではそんな症状はぜんぜん出ないのに、
誰かのところじゃ実際にそういう症状が起こるっていうわけのわかんないのが、やっぱりなんだかんだである。
結局、問題があって文句垂れるやつが100人いて、100人とも文句垂れてるよりは、 こういう企画をやれば、
そのうち10人は何が問題かって自力で調べてくれるかも知れない。要するにサンプルが2/100では発生しないかも
しれないけど、 10/100では再現するかもしれないじゃない。Rubyを使っているってことは開発者なんだから、
とっかかりがあれば、自分でどうにかしようとする可能性が高いよね。でもブラックボックスのユーザーはそんなこと
最初から考えない。ブラックボックスなんだから。というわけで、ああいう企画でブラックボックスに隙間を開ける
くらいのことはできるかなぁと。
ということはどういうことかっていうと、 usaさんも私もいい年だから(笑)、 若い人をWindowsの世界に呼ばないと
いかんなあと。 そういう、まあ、義務感じゃないけど、 なんとなく、Rubyにお世話になってるから。 私がRubyの
ためにできる、要するにディストリビューションを作る以外に、 人間のディストリビューションも手伝おうか、
っていうようなのが一つある。
(続く)
279デフォルトの名無しさん:2010/11/01(月) 13:20:56
>>275-278
【RoR】Rubyについて Part 41【CPAN vs RubyGems】
http://hibari.2ch.net/test/read.cgi/tech/1281473294/
280デフォルトの名無しさん:2010/11/01(月) 14:15:20
すいませんが初心者質問です
rubyではaliasでメソッドの別名を定義できますが
def self.get_area_name( m_area_id, format=:area )
# 処理部分
end
alias name get_area_name
の様に記述すると文法エラーになってしまったのですが
エイリアスを記述する場合は、どうすれば良いのでしょうか?
281デフォルトの名無しさん:2010/11/01(月) 14:21:47
クラスメソッドのエイリアスは自力でそのように新クラスメソッドを定義するか、
def self.new_mes
self.orig_mes
end
クラスメソッドの文脈で alias を使用する

class C
def self.orig_mes
puts "orig!"
end
class << self
alias :new_mes :orig_mes
end
end

C.new_mes
282デフォルトの名無しさん:2010/11/01(月) 14:35:27
なんかアレな書き方だな

・ 「クラスCのクラスメソッド」とは、C=Class.new した クラスオブジェクトCのインスタンスメソッドである
・ 関数的メソッド alias は、インスタンスメソッドの自動定義しかできない
・ つまり、alias を使用したい場合、alias に「クラスオブジェクトCのインスタンスメソッド」を作成させればよい

ということで、インスタンスメソッド定義の書き方でクラスメソッドを定義できる文脈
class C
class << self
# ここ
end
end
で、alias を記述する
283デフォルトの名無しさん:2010/11/01(月) 14:54:20
うるさくてすまんが alias は構文であってメソッドではないです。
シンボルではなくメソッド名そのものを書こう。
alias_method なんてももあるけど。
284デフォルトの名無しさん:2010/11/01(月) 15:00:54
http://twitter.com/yukihiro_matz/statuses/29317109670

yukihiro_matz: 英語圏でRubyとPythonを比較する記事を見ることが少なくなってきた
のは、RubyとPythonでクラスタが分離してきたからか。逆に日本語でRubyとPythonを
比較 する記事を見かけるのは国内でのPythonの地位が向上したからか。

               ∩_
              〈〈〈 ヽ
      ____   〈⊃  }
     /⌒  ⌒\   |   |
   /( ●)  (●)\  !   !
  / :::::⌒(__人__)⌒:::::\|   l
  |     |r┬-|       |  / <こいつ最高にアホだお
  \     ` ー'´     //
  / __        /
  (___)      /
285デフォルトの名無しさん:2010/11/01(月) 15:12:17

               ∩_
              〈〈〈 ヽ
      ____   〈⊃  }
     /⌒  ⌒\   |   |
   /( ●)  (●)\  !   !
  / :::::⌒(__人__)⌒:::::\|   l
  |     |r┬-|       |  / <こいつ最高にアホだお
  \     ` ー'´     //
  / __        /
  (___)      /
286デフォルトの名無しさん:2010/11/01(月) 15:12:51
>>284
【Perl,PHP】LLバトルロワイヤル13【Ruby,Python】
http://hibari.2ch.net/test/read.cgi/tech/1287944631/292
【RoR】Rubyについて Part 41【CPAN vs RubyGems】
http://hibari.2ch.net/test/read.cgi/tech/1281473294/399
287デフォルトの名無しさん:2010/11/01(月) 15:20:53
               ∩_
              〈〈〈 ヽ
      ____   〈⊃  }
     /⌒  ⌒\   |   |
   /( ●)  (●)\  !   !
  / :::::⌒(__人__)⌒:::::\|   l
  |     |r┬-|       |  / <全部のスレ貼れおーw
  \     ` ー'´     //
  / __        /
  (___)      /
288デフォルトの名無しさん:2010/11/01(月) 22:25:14
>>278
Windows遅い遅いという人は見かけるがコア開発者の環境では遅くないのか、、、
289デフォルトの名無しさん:2010/11/01(月) 22:44:20
>>288
【RoR】Rubyについて Part 41【CPAN vs RubyGems】
http://hibari.2ch.net/test/read.cgi/tech/1281473294/
290デフォルトの名無しさん:2010/11/01(月) 23:19:09
>>288
Windowsまともに開発する気ないみたいだし
PerlとかPythonに変えたほうがいいよ
291デフォルトの名無しさん:2010/11/02(火) 01:54:20
Ruby環境構築講座 Windows編
達人出版会
ttp://tatsu-zine.com/books/1

とうとう始動したかー。
292デフォルトの名無しさん:2010/11/02(火) 04:52:00
>>291
買っといた
293デフォルトの名無しさん:2010/11/02(火) 04:53:21
悪い、今のなし
俺しか買ってなかったら特定される、、、
294デフォルトの名無しさん:2010/11/02(火) 05:08:53
別にいいじゃん特定されたって
やましいことしてるわけじゃないし

で、俺は特定されるのやだから今は買わないけど
自費出版とかならジュンク堂あたり取り扱ってくれないかしら
295デフォルトの名無しさん:2010/11/02(火) 05:13:06
296デフォルトの名無しさん:2010/11/02(火) 07:49:34
おまいらも >>292 を守るために注文してやれ
297デフォルトの名無しさん:2010/11/02(火) 07:53:49
ふだんやましいレスしてるからまずいんだろ
298デフォルトの名無しさん:2010/11/02(火) 07:56:43
rubyでwindowsが遅いのはファイルIOの部分(require)だからな^^
299デフォルトの名無しさん:2010/11/02(火) 10:00:23
>>298
十分致命的ですが?
300280:2010/11/02(火) 10:11:42
>>281-283
解決法どうもありがとうございます
この点に関しては、ちょっと考えるように書ける程にはまだrubyも進歩出来ていない印象でした
とりあえず、その方法で進めていこうと思います
301デフォルトの名無しさん:2010/11/02(火) 11:09:15
わりと明快な動作なんだけどね、これ
「引数がクラスメソッドを表す文字列である場合」とか場合分けしなくていい
あくまで現在のselfに自分の役目で接続すればいい

class C
class << self
attr_accessor :foo
end
end

C.foo = 1
p C.foo #=> 1
p C.instance_variable_get(:@foo) #=> 1

class << slef ... end という記法はもうちょいなんとかならんかったのかと思うことは週一くらいである
302デフォルトの名無しさん:2010/11/02(火) 11:43:48
class C
self.singleton_class.instance_eval { attr_accessor :foo }
end

singleton_class メソッドを使ってもこれがせいぜいか。
303デフォルトの名無しさん:2010/11/02(火) 11:48:14
>>301
>class << slef ... end という記法はもうちょいなんとかならんかったのかと思うことは週一くらいである
概念的にはわりとステキな部類だと思うんだけど、この書き方はあんまりきれいじゃないよね
これがクラスインスタンスを呼ぶ書き方だと覚えるのにずいぶん手間取った記憶がある
304デフォルトの名無しさん:2010/11/03(水) 04:35:37
>>298
せっかく書籍まで出してくれたしコンパイル環境作って弄ってみるわ

軽くぐぐってみたが、NTFSが遅いやらそうじゃなくてWindowsのファイルIOのAPIが遅いやら
何がなにやら
環境依存そうだし
305STR ◆qj5zEwXUS. :2010/11/03(水) 10:13:59
ここは、初心者にやさしいというので来て見ました。

Array::each_indexは、常に配列の要素番号の若い順に
ブロックが実行されますか?

たとえば、次のコードや、
a = [32, 44, 9]
a.each_index do |i|
puts a[i]
end

このコード
a = [32, 44, 9]
a.each do
puts a[i]
end

の実行結果は、常に
32
44
9
となりますか?
306デフォルトの名無しさん:2010/11/03(水) 10:30:48
307デフォルトの名無しさん:2010/11/03(水) 10:51:56
>>306
悲惨だな
308デフォルトの名無しさん:2010/11/03(水) 11:03:40
悪質コテとかじゃないなら別にいいじゃない

>>305
each_index の仕様が変わらないかぎりそう
ただ下のコードは動かないよ
[32, 44, 9].each{|e| puts e} なら OK
309デフォルトの名無しさん:2010/11/03(水) 11:35:10
>>308
2ちゃんねるははじめてですか?
310デフォルトの名無しさん:2010/11/03(水) 11:46:08
2ch内でコテつけて回って平気なのはそれ自体思考や思想が危険な人物の証…
311デフォルトの名無しさん:2010/11/03(水) 11:55:42
触ってはいけない人と触ってはいけないものがあることを理解しない人の相乗効果でたいてい酷いことになるよね
そういう人だって道端で叫び回ってる人には話し掛けないだろうに、不可解なことだ
312デフォルトの名無しさん:2010/11/03(水) 12:01:10
>>310
君の理屈なら2chに名前欄要らないってことになるが実際にはそうではない
なぜか?
313デフォルトの名無しさん:2010/11/03(水) 12:05:19
基本いらないよね

>>312だって名前書いてないだろ
314デフォルトの名無しさん:2010/11/03(水) 12:11:55
コテつける奴はヤバい奴、というコンセンサスに棹差す人がいるとは思わなかった
まあ半年くらいいろんな板やスレをROMってみるといいぞ
315デフォルトの名無しさん:2010/11/03(水) 12:13:42
ScalaスレとかTclスレとかアセンブラスレとか?

というか匿名だっておかしいのがいっぱいいるのに
コテというだけで危険とみなすことがおかしい
純粋に書き込みの内容だけで判断すべきだ
いちいちぐぐって身元確認とかばからしすぎる
316デフォルトの名無しさん:2010/11/03(水) 12:19:37
>>308のように考えるアホがいるから>>306が先回りしたんだと思う
コテハン流用者は基本アンタッチャブル
317デフォルトの名無しさん:2010/11/03(水) 12:23:15
>>316
結果として当たりだったんじゃないかね
>>308>>315を見るに、経験も耐性もない人はこのスレ多そうだ
無邪気に歓待してしまってから、どうしてこうなったのか困惑するタイプ
318デフォルトの名無しさん:2010/11/03(水) 12:34:30
2ch上級者アピールかっこいいです

てか他のスレでもコテだろうが質問には普通に答えてるぞ
おかしなこと言い出したらあぼんすればいいだけだ
319デフォルトの名無しさん:2010/11/03(水) 12:48:07
右辺をメソッドチェーンで繋げまくって変数に突っ込むコーディングスタイルの人がいる。
それがRuby流だとかぬかしてるのだがものすごく読み辛い。
俺の美しいコードもこの頭の固い先輩に汚されてしまう。
320デフォルトの名無しさん:2010/11/03(水) 13:00:53
selectやらmapやらが全要素を処理しないと返ってこないのが残念すぎる。
321デフォルトの名無しさん:2010/11/03(水) 13:14:02
>>319
出来る限り行を少なくするのが
Rubyの思想だから、それで合っているよ。
Rubyに美しさなんて存在しない。
322デフォルトの名無しさん:2010/11/03(水) 13:34:12
そういえばコテハンがまともな回答してるのを見たことが無いな
323デフォルトの名無しさん:2010/11/03(水) 13:35:38
>>319
コーディングスタイルにこだわるならRubyは向いてない。
Pythonにでもすれば?
324デフォルトの名無しさん:2010/11/03(水) 13:52:19
var = if a
b
else c
d
end

var = case a
when b
c
when d
e
end

こういう感じのコードもRurb流ならアリ?
325デフォルトの名無しさん:2010/11/03(水) 15:07:33
>>320
意味わからん
326デフォルトの名無しさん:2010/11/03(水) 17:41:46
>>325
UNIX の pipe は処理の終わった部分からリアルタイムに流れる
Windows の pipe は全要素を処理しないと次のプロセスに流れない
327デフォルトの名無しさん:2010/11/03(水) 18:23:47
>>324
これってCやJavaの三項演算子A ? B : Cと同じようなもんじゃん。
単に君のスタイルでは使わないってだけで、
プログラマならば読みこなさないとな。
ていうか、これは目から鱗が落ちる。他の言語では無理だろ。
やっぱRubyってすげえ。
328デフォルトの名無しさん:2010/11/03(水) 18:31:21
>>326
写像が途中で止まる理由はない
329デフォルトの名無しさん:2010/11/03(水) 18:38:16
>>324
オートインデントが無闇に深くなるという理由で、使用しない場合がある

 long_name_var = if very_very_comlex_condition1 then
            b
           else
            d
           end


 if very_very_comlex_condition1 then
  long_name_var = b
 else
  long_name_var = d
 end

のほうが、その場のインデントの深さによってはまだ見やすい
が、基本、条件分岐が値を返すというのをRubyは多用する
330デフォルトの名無しさん:2010/11/03(水) 18:40:36
>>296

俺も買ったぜ!
331デフォルトの名無しさん:2010/11/03(水) 19:38:37
>>329
そんなの、バックスラッシュで改行すればいいだけじゃないの。
long_name_var = ¥
 if ver_very_comlex_condition1
  b
 else
  d
 end
これでいいと思うけどなあ。だめ?
もしくはbやdが短い場合は
cond = very_very_complex_condition1
long_name_var = cond ? b : d
332デフォルトの名無しさん:2010/11/03(水) 19:59:19
回避手段はそりゃいくつもあるだろ
問題は回避手段がこの世に存在することじゃない
333デフォルトの名無しさん:2010/11/03(水) 20:12:10
>>332
は?何を語りだしたの?
334デフォルトの名無しさん:2010/11/03(水) 21:12:38
>>314
まれにコテが普通に居る板もあるけどな
まあ技術系の板では何かの作者とかでない限りアンタッチャブルだな
作者とかでも付けるのは作者自らの発言であると示す必要がある場合だけで
雑談では外してたりするし
335デフォルトの名無しさん:2010/11/03(水) 21:16:01
ためしにやってみた

long_name_var = if very_very_comlex_condition1 then
  b
else
  d
end

まあこれならありかな
336デフォルトの名無しさん:2010/11/03(水) 21:25:16
long_name_var = (
if very_very_comlex_condition1
then b
else d
end)

とかどうよ
337デフォルトの名無しさん:2010/11/03(水) 21:31:24
>>329の「オートインデント」が読めない奴がいる模様
338デフォルトの名無しさん:2010/11/03(水) 21:34:21
オートインデントってそんな風に機能するのか・・・
普通行頭からの階層でネストするだろうに
339デフォルトの名無しさん:2010/11/03(水) 21:39:59
エディタ依存だけどな
340デフォルトの名無しさん:2010/11/03(水) 21:43:56
これは行継続処理だろうから

 long_name_var = if very_very_comlex_condition1 then
            b
           else
            d
           end



 foo_method_with_keyhash(
                 :key1 => value1,
                 :key2 => value2,
                 :key3 => value3,)

は根っこが一緒だ

 long_name_var = if very_very_comlex_condition1 then
 b

となって欲しいという場合、

 foo_method_with_keyhash(
 :key1 => value1,

にもなるはず
341デフォルトの名無しさん:2010/11/03(水) 21:48:17
まあ、どうでもいいな
文法的には可能だが実際はめどいので使用されてないという機能はあるし
342デフォルトの名無しさん:2010/11/03(水) 22:37:12
mingw環境でコンパイルしたRubyをWindows2000にインストールしてc:\ruby\bin
にはパスを通したのですがrequireでファイルがロードできないというエラーが出ます。
ライブラリのどこにパスを通せばいいですか?
参照しているのはOpenSSLとSHA1などです。よろしくお願いします。
343デフォルトの名無しさん:2010/11/03(水) 22:52:48
SSL関連は自力で有効にしないと駄目
rubyのコンパイルオプション見て、必要なファイル全部集めてパス指定して再コンパイルしろ
344デフォルトの名無しさん:2010/11/03(水) 23:02:38
WindowsでRubyはドM
345デフォルトの名無しさん:2010/11/03(水) 23:33:04
しかしWindowsのコマンドプロンプトはRubyかそれに代わるものがないと凄く使いにくいというジレンマ
346デフォルトの名無しさん:2010/11/04(木) 01:04:33
お前ら本当に実践でコード書いてんのか…
if文の結果を変数に突っ込む機会なんて滅多にないわ

aとbが短い時は
long_name_var = very_very_complex_condition1 ? a : b
でいいし

aとbが複式になる時は無理に右辺式にしないで
if very_very_complex_condition
1a
2a
...
long_name_ver = na
else
1b
2b
...
long_name_ver = nb
end
でいい。
347デフォルトの名無しさん:2010/11/04(木) 01:18:09
elsifが絡む場合はどうすんだよw
348デフォルトの名無しさん:2010/11/04(木) 01:32:41
各人のスタイルの違いってだけの話だろ。
議論するほどのことかよ。
自分の好きなように書けばいいんだよ。
Matzの言う楽しいプログラミングって、そういうことだろ。
349デフォルトの名無しさん:2010/11/04(木) 01:38:11
直角三角形の二辺a、bの長さから角度Dを求めるコードを教えてくれ><;


          |
         / |
      /   |
     /     | b
   /      |
D∠____□
   a
350デフォルトの名無しさん:2010/11/04(木) 02:12:00
コテハンは2chにいえるおかしな奴にタグつけてあるようなものだし
あぼんしやすい分まだ親切
351デフォルトの名無しさん:2010/11/04(木) 02:43:44
>>349
Math.atan(b/a)

単位はラジアンなので度が欲しいなら180を掛けて円周率で割れ
352STR ◆qj5zEwXUS. :2010/11/04(木) 06:30:25
>>308
レスありがと。

Mechanizeを利用してYahoo financeから企業情報
をスクレイプするbotを作ってます。

eachが要素番号が若い順に値を拾える事を明言
するドキュメントを見つける事ができませんので、
訊いてみました。
353デフォルトの名無しさん:2010/11/04(木) 06:41:07
>>348
>自分の好きなように書けばいいんだよ。
>Matzの言う楽しいプログラミングって、そういうことだろ。
違います
また自分の都合のいいようにしか考えないから
354デフォルトの名無しさん:2010/11/04(木) 09:49:56
>>305 みたいなのが不思議な質問に見えるけど、
配列をイテレーターで取得すると追加順にならない標準ライブラリをもった言語って何か合ったけ?

RubyでいうHash?いわゆる連想配列になる言語とかかな?
355デフォルトの名無しさん:2010/11/04(木) 10:04:10
>>351
ありがとう、超ありがとう
356デフォルトの名無しさん:2010/11/04(木) 10:08:53
追加順じゃなくて、index番号順かスマン
357デフォルトの名無しさん:2010/11/04(木) 10:12:12
>>354
JScriptは配列=連想配列な言語だが
foreachで取得すると番号順に取れない(いやバージョンによって違うかも知れんが)
0から順番に追加したのがバラバラに来るので、追加順でもないってことになる
ハッシュ値順とかなのかな
358デフォルトの名無しさん:2010/11/04(木) 10:14:06
>>354 AWK

明示的にインデックスを指定するので「追加順」でもないし
イテレータでもないけどこういうことでしょ?

$ cat foo.awk
BEGIN {
a[1] = "foo";
a[2] = "bar";
a[3] = "baz";

for (x in a) {
print a[x];
}
}
$ awk -f foo.awk
bar
baz
foo
359デフォルトの名無しさん:2010/11/04(木) 10:41:05
>>357
for-inかな?手元のJScriptだと、{}で作った配列のように使えるObjectも、
Arrayも追加順で列挙された

>>358
foo
bar
baz
になったけど

http://ideone.com/x8wu6

追加順変えても同じ
http://ideone.com/xAMXL
360デフォルトの名無しさん:2010/11/04(木) 10:56:54
awkの配列は連想配列(つまりRubyのHash)
arr[1] は文字列 1 というキーで登録されている値を返す
arrの「1番目」ではない
arr[1] arr[2] arr[3] は配列の1番目・2番目・3番目に見えるが、
実際は文字列1で参照される値・文字列2で参照される以下略である
361デフォルトの名無しさん:2010/11/04(木) 11:03:17
忘れてた
for (var in array) で取り出される順番は awk の内部的順番であり、制御できない
たまたまascii順だったりするかもしれない

整数文字列のインデックスで登録されていることがわかっている場合は
for (x = 1; x <= max; x++)
print arr[x]
のように目的順に並んだキー(添え字)で明示的にアクセスすることはできる
枚挙機能がもうすこし強力ならもうちょっと便利に使えたんだが
362デフォルトの名無しさん:2010/11/04(木) 19:17:32
rubyでのprivateとprotectedの違いがよくわかりません。
どっちも関数形式での呼び出しを強制するようですが、なにが違うんでしょうか。
363デフォルトの名無しさん:2010/11/04(木) 19:21:25
それrubyの話題ちゃうがな
364デフォルトの名無しさん:2010/11/04(木) 19:49:59
protectedはそうじゃない
365デフォルトの名無しさん:2010/11/04(木) 19:51:32
private以外は使わないというのがいいような気がしてならない
366デフォルトの名無しさん:2010/11/04(木) 20:05:51
リファレンスマニュアルの Fixnum の説明に
「ほとんどのマシンでは 31 ビット幅です」とあるけど x86_64 だと違うよね?
367デフォルトの名無しさん:2010/11/04(木) 21:00:09
>>366
63だね
368デフォルトの名無しさん:2010/11/04(木) 21:46:57
こうなった。

$ ruby -ve 'p [2**62-1, 2**62,2**63-1,2**63].map(&:class)'
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0]
[Fixnum, Bignum, Bignum, Bignum]
369デフォルトの名無しさん:2010/11/04(木) 22:09:38
>>368
タグに2ビット取ってるってこと?
370デフォルトの名無しさん:2010/11/04(木) 22:36:28
ポインタと重ねられるように1ビットはシフトしてるはずだけど…


371デフォルトの名無しさん:2010/11/05(金) 10:16:03
符号ビットを忘れないでね
372デフォルトの名無しさん:2010/11/05(金) 10:26:01
32ビットだとこうなるのも同じだね。

$ /usr/bin/ruby -e 'p [2**30-1,2**30,2**31-1,2**32].map{|i| i.class}'
[Fixnum, Bignum, Bignum, Bignum]
373デフォルトの名無しさん:2010/11/05(金) 10:33:34
>>371
言われてみればというか、なんで忘れてたんだろ……
374デフォルトの名無しさん:2010/11/05(金) 11:18:54
ふごうだけにふぉごっとうんしちゃったんだな
375デフォルトの名無しさん:2010/11/05(金) 11:57:22
self.freeze
376デフォルトの名無しさん:2010/11/05(金) 14:59:53
require "nokogiri"
p Nokogiri::VERSION #=> "1.4.3.1"

doc = Nokogiri::HTML('<a></a>')
doc.at("a").inner_html = " >"
p doc.at("a").inner_html #=> " >"

doc = Nokogiri::HTML('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><a></a>')
doc.at("a").inner_html = " >"
p doc.at("a").inner_html #=> " >"

なんで charset の指定があると設定した   だけがスペースになるんですか?
377デフォルトの名無しさん:2010/11/05(金) 15:01:13
nokogirl
378376:2010/11/05(金) 15:07:56
すません。半角で書いたら消えました
"&nbsp;&gt;" を inner_html に設定すると
" &gt;" になってしまうという内容でした
379デフォルトの名無しさん:2010/11/05(金) 15:27:51
irb> p Nokogiri::VERSION_INFO
{"warnings"=>[], "ruby"=>{"engine"=>"mri", "version"=>"1.8.7", "platform"=>"i686-linux"},
"libxml"=>{"loaded"=>"2.7.6", "binding"=>"extension", "compiled"=>"2.7.6"}, "nokogiri"=>"1.4.3.1"}

libxml2 のバージョンが低すぎるのだと思う
380376:2010/11/05(金) 15:39:23
>>379
{"warnings"=>[], "ruby"=>{"engine"=>"mri", "version"=>"1.8.7", "platform"=>"i686-darwin10"},
"libxml"=>{"loaded"=>"2.7.7", "binding"=>"extension", "compiled"=>"2.7.7"}, "nokogiri"=>"1.4.3.1"}

んー 2.7.7 からダメなんですかね

とりあえず回避策として   を別の文字に置換して to_html のあとで元に戻すか、
Hpricot 使います。(Hpricotだと問題なかったので)
381デフォルトの名無しさん:2010/11/05(金) 21:28:47
1.9系に移行した人は何がきっかけで移行しました?
382デフォルトの名無しさん:2010/11/05(金) 22:16:34
そこに1.9があったから
383デフォルトの名無しさん:2010/11/05(金) 22:21:18
>>320
ブロック省略でEnumeratorを返す方針?になってるので
selectやmapでは意味のあるEnumeratorを返せないことになってしまってるのがすごく残念

ためしに、引数でProcを与えてブロックを省略するとEnumeratorを返すようにしてみたら
(Ruby1.9で)素数を二乗したもののうち1000を超えるのを小さいほうから10個得るとかがこう書ける
require 'prime'
p Prime.instance.map(->x{x**2}).select(->x{x>1000}).take(10)
しかし、ブロックを使わないのはRuby的じゃないなぁ
常にEnumeratorを返す別メソッドを作るのとどちらがいいのか

それと、EnumerableにもArray#productみたいなのが欲しい
Pythonみたいなネストした内包表記やジェネレーター式みたいなのが書きにくい
ついでに、Enumeratorでも列挙数が固定されているものはsizeを取得できるようにならんかな
384デフォルトの名無しさん:2010/11/05(金) 22:25:34
>>381
今起こったありのままのことを話すぜ
pacman -S ruby したら 1.9 が入って
385デフォルトの名無しさん:2010/11/05(金) 23:12:49
rvmを導入したら、いろんな処理系を同時に扱うのが楽になって、1.9系もついでに
文字が文字として認識されるのは
使ってみると意外なほど便利に感じる
386デフォルトの名無しさん:2010/11/06(土) 00:13:06
>>381
まだ移行途中だけどrvmでサックリ入れて環境変えられたから

Windowsでもpikで入れてみているけど、思っていたよりかなり速い気がする
まだちょっとしたベンチマークしかメタしてないけど
387デフォルトの名無しさん:2010/11/06(土) 07:26:10
ruby -x ... # 処理Aを実行
...
ruby -x ... # 処理Bを実行

でエントリポイント(メソッド?)を指定して別の処理を指せる方法ってないですか
いまは引数か環境変数でスクリプト側で分岐してますが。
388デフォルトの名無しさん:2010/11/06(土) 10:59:57
>>387
引数で渡して、sendするとか


# send.rb
def matz
puts "I LOVE Guido!!"
end

send ARGV[0]


$ ruby send.rb matz
I LOVE Guido!!
389デフォルトの名無しさん:2010/11/06(土) 11:01:09
あ、悪いすでに引数と環境変数は使ってたか、
ようするにsendに文字列かシンボル渡せばメソッド直接呼べる
ただし、意図しないものを変なもの呼ばれないようにね
390デフォルトの名無しさん:2010/11/06(土) 11:54:05
>>387
ちょっと話はそれるけど、ruby -s とすると簡単な引数が指定できる。

-------- ファイル名 example.rb ----------
#!/usr/bin/ruby -s
if $foo
 foo()
elsif $bar
 bar()
end
-------------------------------------

使い方: ./example.rb -foo または ./example.rb -bar
-foo=xxxとかも指定できる
391デフォルトの名無しさん:2010/11/06(土) 11:58:35
>>383
Python信者はPython使ってれば?こんなところまででばってくることないだろ。
392デフォルトの名無しさん:2010/11/06(土) 12:07:11
>>391
Pythonスレで「Pythonはラムダ書きにくい」とか言って煙たがられたという
輝かしい経歴の持ち主になんてことを
393デフォルトの名無しさん:2010/11/06(土) 17:10:14
>>392
違うよ。エキスパートPythonを売るためにRubyとPHPをディスってるPython信者だよ。

ttp://twitter.com/methane/status/16673043960
C++とJavaがある程度分かっていると、Pythonはサラッとチュートリアル読んだだけで、
(メタクラスとか高度な部分を除き)大抵のコードは読むことができた。Rubyはムリ。

ttp://twitter.com/methane/status/16673105203
Rubyの世界では、DRYがよく叫ばれている。Repeatしないために、どんどんルールを作る。
一方、PythonのZenにはDRYがない代わりに、 "Special casesarn't special enough to
break the rules." というものがある。

ttp://twitter.com/methane/status/16673188444
たとえば、Rubyはメソッド呼び出しの括弧を省略できるけど、Pythonは省略できない。
括弧を書くというRepeatを行った分、特殊メソッド以外の呼び出しは一目瞭然。

ttp://twitter.com/methane/status/16673278223
あと、Rubyはsuperの引数を省略すると、自分の引数がそのまま渡される。
Pythonは普通に引数なしで呼び出す。Rubyの方がタイプ数少ないけど、特別な暗黙ルールを
作れば作るほど、一見さんには意味不明になっていく。

ttp://twitter.com/methane/status/17241429240
GREE Fast Processor とか、ぶっちゃけどう考えても非効率なPHPをある程度マトモな形に
無理やり修正しているだけで、最初からPython使っていれば全く問題なく綺麗に効率的な
構成がとれるんですけどね。APCも設定ファイルのコンパイルも、Pythonなら不要。
394デフォルトの名無しさん:2010/11/06(土) 17:17:21
「エキスパートPython」は良書。各地で賞賛されている。
ttp://www.google.co.jp/search?q=%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88Python
それを翻訳したあるPython信者の意見として暖かく見守ってください。

ttp://twitter.com/methane/status/26559107342
Pythonの名前付き引数は見た瞬間理解して感動したが、Rubyのシンボルは今でも調べてないので
理解できていない。多言語プログラマの共通言語として、Pythonは素晴らしいと思う。

ttp://twitter.com/methane/status/26558926751
self.は見た瞬間意味を理解したが、@はPerlっぽく見えた。Pythonの. は -> だとすぐわかった
が、Rubyの . がメソッド呼び出しなのは判らなかった。"foo bar".split() は判ったが、
%w[foo bar] は判らなかった。

ttp://twitter.com/methane/status/26558636746
Pythonはチュートリアル流し読みしただけで、Web上でみたいろいろなコードを全く問題なく読め
た。Rubyは勉強しないと読めない。
395デフォルトの名無しさん:2010/11/06(土) 17:18:52
趣味でしかプログラムしてなくて、ほぼRubyしか使ってないのだが
他言語で書かれているものを、Rubyだとどう書かけるのかとかやって遊んでると
隣の芝生が青く見える時があるのですよ

内包表記はRubyとは合わない気がするので、内包表記そのものは要らないけど
Enumeratorの使い勝手はもっと充実させて欲しいと思う
遊んでて面白いので

業務でRubyを使う人にはEnumeratorの充実なんて不必要なのかもしれない
Enumeratorでメソッドチェーンとかがんがんしてたら
なんか遅そうな気はするし、一見して何やってるかわかりにくいかもしれない
でもなにせ遊びなもので、人のプログラムを見ることなんてないし
自分で書くのも書き捨ての小さいのばかりなのだから関係ないのだ

JRubyで実現困難なので不採用らしいけどBinding.of_callerとか欲しいなぁ
WindowsユーザーなのでRubiniusとか使えないし(Cygwin使ってまでは使いたくない)

>>391
Pythonはなにか肌に合わない
単にRubyの方を先に覚えたからだけのことかもしれないけど
396デフォルトの名無しさん:2010/11/06(土) 17:25:58
わざわざコピペとかうざいから他所でやれよバーカ
397デフォルトの名無しさん:2010/11/06(土) 17:40:25
やることないなら尖閣スレで暴れといで
398デフォルトの名無しさん:2010/11/06(土) 17:53:52
Pythonが合わないってひとはCが出来ないんだろうね
399デフォルトの名無しさん:2010/11/06(土) 22:18:21
>>391
Ruby使うのに参考になるようなことならいいんじゃね?
それを超えるのは本スレでお願いしたいけど

>>393-394
荒らしのつもりなのかも知れないけど、けっこう同意できて泣けた(´;ω;`)
たまにPythonのソース見ると見やすい

> C++とJavaがある程度分かっていると、

これはRuby使っていると、でも同じだな。C++やJava関係ないわ
400デフォルトの名無しさん:2010/11/06(土) 22:19:22
う、悪いよく読んでなかった >>394 は全く同意できないわ。これいちゃもんつけてるだけじゃん。
401デフォルトの名無しさん:2010/11/06(土) 22:41:37
Ruby の -> は訳判らんw
402デフォルトの名無しさん:2010/11/06(土) 23:17:09
ruby詳しい人に実装を解説してもらった。
頭の悪い俺でも1日で理解できるほど簡潔で美しいと思った。
しかし特異クラスの扱いが中途半端だから初心者が混乱するんだとも思った。
クラスメソッドなんて呼び方はやめた方がいいし、
オブジェクトからは通常のクラスだけでなく特異クラスの参照も辿れる様にすべきだ。
403デフォルトの名無しさん:2010/11/06(土) 23:24:48
>>399
読みやすいと思ったのは「たまに」見たからじゃない?
何が言いたいかと言うと、読み方をきちんと覚えればRubyのほうが
読みやすさと書きやすさの2点は上回るんじゃないかってこと。
時間はかかるかも知れないけど、
時間がかかるだけで2点が同時に手に入るならRubyのほうがお得じゃない?
404デフォルトの名無しさん:2010/11/06(土) 23:29:44
> 何が言いたいかと言うと、読み方をきちんと覚えればRubyのほうが
> 読みやすさと書きやすさの2点は上回るんじゃないかってこと。

こういう論争ってほとんど意味がないと思う
読みやすさなんて大阪弁と広島弁ほどの差も無いだろう
保守性って点で言えばPythonに分がある
405デフォルトの名無しさん:2010/11/06(土) 23:30:24
本スレでやれ
406デフォルトの名無しさん:2010/11/06(土) 23:31:52
嫌じゃ
407デフォルトの名無しさん:2010/11/07(日) 00:16:38
>>404
本スレにレスを書いた。Pythonは本当に現実的な言語だと思う。
408デフォルトの名無しさん:2010/11/07(日) 00:49:49
python厨ってなんかむかつく
409デフォルトの名無しさん:2010/11/07(日) 01:10:27
「なんかむかつく」って小学生かよ
410デフォルトの名無しさん:2010/11/07(日) 01:26:47
使えりゃなんだっていいだろ……
411デフォルトの名無しさん:2010/11/07(日) 01:30:33
DHHがRailsを実装しようとして最初PHPで始めたけど無理で、他の色々な言語を調べてて最終的にRubyを選んだって話は有名だけど、なぜPythonを選ばなかったんだろうね
412デフォルトの名無しさん:2010/11/07(日) 02:15:20
前にBDDの日本語の解説本かサイトを教えてくれ、という人がいたけど
BDDのツールCucumberの日本語の電子書籍がでてたから紹介しとく

さらっと前半読んだ限り、かなり基本的なところからスタートしてるが
つくりながら学んでいくタイプなのでBDDって何だよ、Cucumberやってみたいんだがわかんね、という人にいいんじゃないかな。

はじめる! Cucumber - 達人出版会
http://tatsu-zine.com/books/2



ただ、英語だとこの手の本はいくつあるので英語出来る人はそっちのがいいと思うけど
413デフォルトの名無しさん:2010/11/07(日) 02:16:21
誤爆った

Railsスレと間違えた
流してくれ
414デフォルトの名無しさん:2010/11/07(日) 05:00:05
fishing詐欺?
415デフォルトの名無しさん:2010/11/07(日) 17:53:25
>>411
Python には Zope という完成形が既に存在していたからではないかと思う。
バイソンマニアには自慢の代物だったらしいし、確かに技術的には高度なWebフレームワークだった。
しかもRailsみたいなメタプログラミングを積極活用する思考は、Python界隈では(今なお)否定的だから。
PythonはOOPには向いていない言語。普通の手続き型言語として使えば(LLとしては)保守性の良い言語だけ思うけど。

問題は、Rubyが「Pythonを差し置いて」Webプログラミング言語として定着してしまった現実にあるみたい。
416225:2010/11/07(日) 18:31:12
>>395
>業務でRubyを使う人にはEnumeratorの充実なんて不必要なのかもしれない
>Enumeratorでメソッドチェーンとかがんがんしてたら

Enumuratorによるメソッドチェーンって、読みにくいのかな?
例えば>>241のコードは、それをガンガン使った典型的な例だけど、

output_data = input_data.map { .... }.sort_by { .... }.reverse.each { .... }

入力データを変換(map)して、ソート(sort_by)して、反転(reverse)して、結果を処理(each)する、って読める。
UNIX Shellのパイプライン処理や、(業務系アプリの)バッチ処理を見慣れた人なら、理解してもらえると思う。
もちろん慣れは必要だけど、(手続き型プログラミング的な)ループ処理よりも、結果的には簡潔でバグも少ない
プログラミングが可能になる。以下は、>>241を(Perl/Python風の)手続き型に書き直したもの。どう見る?
417225:2010/11/07(日) 18:34:24
(>>416の続き)

def calc3(input_data)
 output_data = []
 for month, sales in input_data
   output_data[:month] = month
   output_data[:sales] = sales

   sum = 0
   for i = 0 to sales.size - 1
    sum += sales[i]
   end
   output_data[:sum] = sum
 end

 output_data.sort_by! { |record| record[:sum] }
 output_data.reverse!

 for record in output_data
  : (ここは>>241と同じだから省略)
 end
 nil
end
418デフォルトの名無しさん:2010/11/08(月) 16:07:22
puts 'do' if (n == 100) or (n == 200)

puts 'do' if (n == 100 or 200)

のように書きたいのですが、これでは動きません。
スマートに書くにはどうしたらいいですか?
419デフォルトの名無しさん:2010/11/08(月) 16:13:29
[100, 200].include?(n)
420デフォルトの名無しさん:2010/11/08(月) 16:26:36
case n; when 100, 200; puts 'do' end
421デフォルトの名無しさん:2010/11/08(月) 16:48:09
puts 'do' if [100, 200].find{|x| n == x}

ただし、or の前が真であった場合に or の後ろを評価(実行)したくないというような場合は or で書くしかない

def one
return 1
end

def two
puts 'two実行されたよやベーよ'
return 2
end

n = 1
puts 'case using or ========='
puts 'do' if (n == one) or (n == two)
puts 'case using find ========='
puts 'do' if [one, two].find{|x| n == x}

の結果は

case using or =========
do
case using find =========
two実行されたよやベーよ
do

になるので注意
find や >>419-420 は比較対象が全て評価されてしまう
422デフォルトの名無しさん:2010/11/08(月) 17:23:53
puts 'do' if (n == 100) or (n >= 200)
をスマートに書くには?
423デフォルトの名無しさん:2010/11/08(月) 17:26:49
>>422
それが一番スマート
というか数学的処理は数学的処理の得意な言語に任せろ(逆切れ
424デフォルトの名無しさん:2010/11/08(月) 17:41:38
puts 'do' if (n == 100) and (m == 100)
をスマートに書くには?
puts 'do' if (n and m == 100)
みたいに書けない?
425デフォルトの名無しさん:2010/11/08(月) 17:45:44
例えば、ユーザーIDが100, 200だけに見せたいrhtmlはどう書く?

% begin
%  raise unless [100, 200].include?(session['user_id'])

<html>
 略
</html>

% rescue
%  print CGI.new.header({'location' => 'http://2ch.net/'})
% end
426デフォルトの名無しさん:2010/11/08(月) 17:49:08
>>424
Rubyの「ひかくえんざんし」は全てメソッドだ
n == 100
は実際は
n.==(100)

n >= 200
は実際は
n.>=(200)

だから、こういうメソッドで書けないものは根本的に無理
427デフォルトの名無しさん:2010/11/08(月) 18:04:56
こう書けるPythonに乗り換えれば?

if n == m == 100:
 print 'do'
428デフォルトの名無しさん:2010/11/08(月) 18:15:17
キモイ
429デフォルトの名無しさん:2010/11/08(月) 21:33:54
>>427
リファレンス読んでるけどわからん。どこに書いてある?
430デフォルトの名無しさん:2010/11/08(月) 21:35:22
あったあった。本当だ
431デフォルトの名無しさん:2010/11/08(月) 21:36:22
これだな。構文レベルのシンタックスシュガーか?

5. Expressions ? Python v2.7 documentation
http://docs.python.org/reference/expressions.html#notin

5.9 比較 (comparison)
http://www.python.jp/doc/release/ref/comparisons.html
432デフォルトの名無しさん:2010/11/08(月) 23:24:45
すいません。
とっても基本的なことなんですが、Rubyでのスプリットの書き方を誰か教えてください!!
お願いします!!
433デフォルトの名無しさん:2010/11/09(火) 01:02:23
434デフォルトの名無しさん:2010/11/09(火) 06:39:13
>>427
python すげー(棒
435デフォルトの名無しさん:2010/11/09(火) 09:54:11
Perl6だと、

if n = 100 | 200
if 100 < n < 200

ができたような
436デフォルトの名無しさん:2010/11/09(火) 10:16:46
まあ、どちらにしても、比較記号が数値オブジェクトのインスタンスメソッドであるRubyでは無理な相談だな

if Math.compare("100 < n #{max}") then ... とか作って書くしかあるまい
compareメソッドが引数文字列をどう分析して比較動作にするかは任せる
437デフォルトの名無しさん:2010/11/09(火) 13:41:24
Ruby らしく、か。
[n, m].all? 100 とか [100, n, 200].monoinc? とかどうだろう。
単調増加 = monoinc
単調減少 = monodec

等号を含む含まないを言い分ける一般的な用語がないんだなこれ。
438デフォルトの名無しさん:2010/11/09(火) 13:53:38
irb> num = ''
=> ""
irb> 5.times{num += (%[1 2 3 4 5][rand(5)]).to_s}
=> 5
irb> num
=> "3249514950"

どうして5桁じゃなくて10桁の数字が返るの?
439デフォルトの名無しさん:2010/11/09(火) 14:25:15
>>438
irb> p "1 2 3 4 5"[1].to_s
"32"
文字列 "1 2 3 4 5" の0バイト目から5バイト目のアスキーコードを
ランダムに5回選んで文字列にして追記するんだから、そりゃ10文字の数値になるだろ
440デフォルトの名無しさん:2010/11/09(火) 14:28:04
a = 100
if a in 100, 200
puts 'wonderful'
end
441デフォルトの名無しさん:2010/11/09(火) 14:29:35
irb> num=""; 5.times{num = num + (%w(1 2 3 4 5)[rand(5)]).to_s}; p num
"25153"
本当にやりたかったのはこうだろうな
442438:2010/11/09(火) 16:19:40
>>439->>441
ふーむ、分かったような分からないようなw
文字コードとか絡むと理解が追いつかなくなる…

>>441
やりたかったのはそれです。使わせていただきます。
ありがとうございます。
443デフォルトの名無しさん:2010/11/09(火) 17:51:05
プログラムでゴチャッとするのはたいてい数学にも対応する表現法がないものが多いよね。数学も記号化が不徹底だ。
(n == 100) or (n >= 200)を例に取ると
n.getrange( 100.ソリトン or 200.閉集合右界 )
みたいな表現が必要になるのにそういうのは数学にない。
こういうの言葉でしか説明できない数学が論理的だなんて笑っちゃうよね。アリストテレスかよってのw
444デフォルトの名無しさん:2010/11/09(火) 18:04:35
わざと間違ったこと言って、訂正する人を待つというやり方、不健康だからやめませんか
445デフォルトの名無しさん:2010/11/09(火) 20:05:00
>>436
>まあ、どちらにしても、比較記号が数値オブジェクトのインスタンスメソッドであるRubyでは無理な相談だな

そんなことないでしょ。
比較記号を連続できるかは、構文解析ががんばれば十分可能。
インスタンスメソッドだからできないというのはおかしい。
446デフォルトの名無しさん:2010/11/09(火) 20:51:18
いや、演算子をメソッドと解釈する今のRubyのやりかたである限り不可能だと思うぞ。
さもなくば構文をそれ専用に拡張するか。

構文解析は今でも十分かんばり過ぎてるw
447デフォルトの名無しさん:2010/11/09(火) 20:58:29
>>446
今でもパーサは演算子をメソッドとしては解釈してない。
演算子がメソッドであることが関わってくるのは、構文解析してASTが作られたあと。
比較演算子をPythonのようにするのは構文解析をつくるところまでの話だから
演算子がメソッドであることは関係してこない。
448デフォルトの名無しさん:2010/11/09(火) 23:11:08
実装できるかどうかじゃなくて
演算子=メソッド という一貫性が崩れるので
比較の連続は導入できないのでしょうね
449デフォルトの名無しさん:2010/11/10(水) 03:42:08
Ruby1.8系列では動いていたSHA1が1.9になるとつかえなくなりました。
プログラムをどうすれば動かすことが出きるでしょう?
require でファイルを呼び出すことができませんというエラーが出ます。
実効環境はLinux Slackware13.1です。よろしくお願いします。
450デフォルトの名無しさん:2010/11/10(水) 04:51:31
>>449
$ ruby -v
ruby 1.9.1p378とかいろいろ
$ ruby -rdigest/sha1 -e ""
で LoadError が出るのなら、ruby コンパイル時に openssl が有効になってない
openssl の開発パッケージのようなものをインストールするか、
通常ソース丸ごとコンパイルしてインストールした後、
ruby のコンパイルオプションで openssl を有効にして再コンパイルしれ
451デフォルトの名無しさん:2010/11/10(水) 05:07:58
もし rvm を使って ruby を管理してるなら、 rvm に openssl の管理を任せてもいいぞ
452デフォルトの名無しさん:2010/11/10(水) 05:30:10
コマンドを実行しましたが特にエラーは出ませんでした。
実行時にオプションを指定しないとエラーが出るのでしょうか?
453デフォルトの名無しさん:2010/11/10(水) 05:48:58
じゃあSHA1が使えないというのが嘘だな

個人企業団体の情報が漏れない程度のエラーメッセージを貼ると誰かが気づくかも気づかないかも
454デフォルトの名無しさん:2010/11/10(水) 05:55:21
SHA1関連のライブラリを呼んで使用していたgemパッケージが
Ruby1.9では単にインストールされていない説にまとめて10票くらい入れておく
gemライブラリのモジュール名にSHA1とか入ってて勘違いしたのだろう
455デフォルトの名無しさん:2010/11/10(水) 06:04:34
よく分かりませんが1.8系を使った方がいいということですね。
456デフォルトの名無しさん:2010/11/10(水) 07:52:27
そうですねw
457デフォルトの名無しさん:2010/11/10(水) 09:45:28
sha1 は obsolete だ。
digest 使え。

が答えだと思う。
458418:2010/11/10(水) 10:06:17
言いたいことが詰まった記事発見↓
ttp://d.hatena.ne.jp/ku-ma-me/20100114/p1

include?しかないかなと思ったのですが、1行caseが一番マシそうなのでcaseを使うことにします。

結論
case n when 100, 200
 puts 'do'
end

ありがとうございました。

p.s. ほんとは>>440みたいに書きたかったなぁ
459デフォルトの名無しさん:2010/11/10(水) 10:07:01
まあどちらにしても、エラーメッセージを翻訳できる実力のある方ならなんとでもなるでしょう
我々がとやかく口挟むようなレベルのお話ではないと思われます
460デフォルトの名無しさん:2010/11/10(水) 10:22:39
461デフォルトの名無しさん:2010/11/10(水) 11:07:38
>>460
おまえ最後の一行だけ見てレスつけてるだろ
462デフォルトの名無しさん:2010/11/10(水) 15:06:01
>>442
配列のつもりで使った表記が文字列になってるからだよ
%[]と%w()は全然違う
463デフォルトの名無しさん:2010/11/10(水) 15:36:27
>>448
だから、演算子がメソッドであることは関係ないってんだろ。
構文解析時には、演算子がメソッドであることは関係してこないの。
それが関係してくるのはあくまで構文解析後の話。
> 演算子=メソッドという一貫性が崩れる
そんなわけがない。なにこの頭悪い子。
464デフォルトの名無しさん:2010/11/10(水) 17:10:59
頭悪いなあこの人
465デフォルトの名無しさん:2010/11/10(水) 18:15:00
>>463
よく嫁

>>448
>演算子=メソッド という一貫性が崩れるので

だ「一貫性が崩れる」と書かれてるのであって

if 演算子.is_a?(メソッド)

なんてことは書かれてないぞ
466デフォルトの名無しさん:2010/11/10(水) 18:32:19
…と>>463を読み直した。

ああ、あれか。
「演算子=メソッド」とならない構文を入れちゃえば関係ないって話か。
467デフォルトの名無しさん:2010/11/10(水) 18:33:12
いやちょっと待てよ、それは既に一貫性が崩れてるのではないのか?
468デフォルトの名無しさん:2010/11/10(水) 19:29:42
rubyでターミナルに出力するときに下に出力していくのではなく、同じところで値を更新して出力していきたいのですが
どうやるのでしょうか?
469デフォルトの名無しさん:2010/11/10(水) 19:31:39
行末に改行じゃなくて "\r" (だけ)を出力する
470デフォルトの名無しさん:2010/11/10(水) 19:43:17
>>468
ncursesか何か

行全体を再度書き出してもいいのなら>>469

irb> 5.times{|i| print "現在の時刻は #{Time.now}\r"; sleep 1};
現在の時刻は Wed Nov 10 19:40:15 +0900 2010

Time.now の部分だけを更新するのは、…まあカーソル移動させればできなくもない気がするが

あと、キャリッジリターンを行改とするターミナルがあっても文句は言わないこと
471デフォルトの名無しさん:2010/11/10(水) 19:51:27
"\r" はびっくりするほど簡単なんだが

 手順             3 of 7
  タマネギを炒めます... [OK]
  ニンジンを炒めます ... [OK]
  肉を炒めます ...

の1行目の「n of 7」の n の部分を書き換えたいとかそういう用途にはあんま向かないな
472デフォルトの名無しさん:2010/11/10(水) 19:55:24
改行せずに行頭から書き直せる、ってだけだからね
簡単だけど改行した後は戻れない
473デフォルトの名無しさん:2010/11/10(水) 19:59:27
どうでもいいけど一般的に最初に炒めるのは肉だと思う
表面に火を通した肉を別皿に取っておくのがめんどいなら別にいいけど
474デフォルトの名無しさん:2010/11/10(水) 20:04:30
ありがとうございます。参考になりました!
475473:2010/11/10(水) 20:08:24
>>474
いやいや料理の基本ですよ
476デフォルトの名無しさん:2010/11/10(水) 20:15:20
>>475
お前じゃねえ
座ってろ
477デフォルトの名無しさん:2010/11/10(水) 20:19:34
>>474-476
ワロタ
478デフォルトの名無しさん:2010/11/10(水) 20:21:50
>>458
このページ見ていたんだけど

人生を書き換える者すらいた。: 人材獲得作戦・4 試験問題ほか
http://okajima.air-nifty.com/b/2010/01/post-abc6.html

Re: 人材獲得作戦・4 試験問題ほか - まめめも
http://d.hatena.ne.jp/ku-ma-me/20100112/p1


この最短の経路探索の問題がなんで、下のページのように解けるかがわからないんだけど・・・
どうしたらこういう解き方が短時間でできるようになるんでしょうか?

479デフォルトの名無しさん:2010/11/10(水) 20:26:38
ショートコーディング本嫁
480デフォルトの名無しさん:2010/11/10(水) 22:25:13
たぶん単純に変数名とか()とか省略した表現を読みやすく戻して読めばプログラムの意味はわかるはず
たぶん
481デフォルトの名無しさん:2010/11/10(水) 23:05:04
ゴルフがうまくなりたいんじゃなくて、
この手のアルゴリズムを短い時間でこなせるようになりたいってことじゃなくて?
482デフォルトの名無しさん:2010/11/10(水) 23:24:02
こういう非実用的なのは書く気になれん
勉強にはなるんだろうけどね
だから読めんw
483デフォルトの名無しさん:2010/11/11(木) 00:54:52
あるURLのHTTPレスポンスコード(200とか403)だけ取得したいです

require 'net/http'
Net::HTTP.start('www.example.com', 80) {|http|
response = http.get('/index.html')
puts response.code
}

これだとHTML本文も取得したうえでレスポンスコードを返してますよね
なるべく相手のサーバーに負担をかけたくないのでレスポンスコードだけ取りたいのですが、
そういった事は可能でしょうか?
484デフォルトの名無しさん:2010/11/11(木) 01:01:51
HEAD使え。
とはいえ、先方の処理が、HEADだったら中身作らずにステータス
だけ返す、という作りになってないと意味ないと思うが。
485デフォルトの名無しさん:2010/11/11(木) 06:24:33
>>481
そうそう!そういうこと

経路探索ならA*とかダイクストラとか思いついてもサッと実装できないレベルだと、
ゴルフのコード見たとき置換で解いててギョットした

>>479
読んでみる
486デフォルトの名無しさん:2010/11/11(木) 09:02:48
サーバ的には特定のURLに対してGET要求を受け取った時点で「重い処理」を開始してるはずだからな

仮に「レスポンスボディを受け取る前に通信を打ち切る」ようにクライアント動作を作ったとしても、
レスポンスボディを作成するサーバの負担自体はふつう変わらない
200とか304とかレスポンスコード返す時点で既にレスポンスボディは作ってあるか、
作成予約が入ってて取り消せない状態のはずだから
(ここでコネクション切られたことを検知して作成キャンセルするようなサーバ処理してるのは見たことがない)、
単にサーバ側の作り損だ

>>484の言うようにHEAD投げろ
GETの代替として動作するかどうかはサーバ作った人の根性次第だが
487483:2010/11/11(木) 22:43:23
>>484 >>486
Net::HTTP.get_response(URI.parse(uri_str))
というのも見つけたのですが結局変わり無さそうですね
いい機会なのでHTTPの仕様から勉強し直します
ありがとうございました
488デフォルトの名無しさん:2010/11/11(木) 23:09:23
open-uriはお手軽にPOSTもできないし、headerだけ取得もできないよね
Net::HTTPだるいし、curb(curl)くらい標準で付けてもいいと思うんだ
taf2's curb at master - GitHub
https://github.com/taf2/curb
489デフォルトの名無しさん:2010/11/11(木) 23:25:41
>>487
こんなのか

$ gem install curb
$ ruby -e "require 'curb'; puts Curl::Easy.http_head('http://example.com/').response_code"
200

これ見て適当に書いた
Curb - libcurl bindings for ruby
http://curb.rubyforge.org/


と思ったら、ふつうにNet::HTTPでもできるんじゃ・・

$ ruby -e "require 'net/http'; p Net::HTTP.new('example.com').head('/').code"
"200"

どっちも始めて使ったから知らんので確認して
490デフォルトの名無しさん:2010/11/12(金) 00:07:40
Rubyのインストールに必要な外部ライブラリがまたひとつ増えるのか
491デフォルトの名無しさん:2010/11/12(金) 00:54:18
いや別に。open-uriって時代的にもうお手軽じゃないよね、ってだけ
492デフォルトの名無しさん:2010/11/12(金) 05:44:21
>>491
curbはlibcurlが必要だということを知らずに言っているわけでもあるまい
あとURIの仕様が拡張されてPOST情報がURIに記述可能になってからまたおいで

writeしてからreadするという方法も考えなかったわけでもないのだが
493デフォルトの名無しさん:2010/11/12(金) 06:09:46
cURLはスクリプト言語標準にするには動作が固定され過ぎている
あと名前が紛らわしすぎ
494デフォルトの名無しさん:2010/11/12(金) 06:36:05
あれ?Rubyってlibなんとか他に使ってなかったけ?
ライセンスの問題ならlibcurlはMIT/Xみたいだから大丈夫そうだけど

curb(curl)がまともに使えるのかどうかは知らんw
始めて使ったし

とはいえ>>489の用途だったらnet/httpでも問題ないよね
495デフォルトの名無しさん:2010/11/12(金) 06:37:16
悪いMIT/X派生ライセンスか
496デフォルトの名無しさん:2010/11/12(金) 06:38:17
問題はライブラリは素晴らしいかもしれないが、誰がメンテするかという話だね
ハイすいません、出直してきます
497デフォルトの名無しさん:2010/11/12(金) 07:16:00
単体で多用されるGETはopen-uriとして、POST投稿に関するライブラリがあってもよかったとは思う
498デフォルトの名無しさん:2010/11/12(金) 11:39:00
ネットの複数のニュースサイトを定期的にポーリングしてテキストに保存するようなプログラムやライブラリはないでしょうか?

rubyならすぐに作れそうですがもしあれば
499デフォルトの名無しさん:2010/11/12(金) 12:31:57
>>498
いろいろなサイトからデータを取得して、RSSリーダーや検索エンジンみたいなもの自分で作りたいと勝手に仮定する


Perlにはplaggerという定期的に登録したサイトのRSSやその全文やどこかのxmlやら何やらその他いろいろデータをゲットしてきて
それを自分のメールに送ったりもしくはDBに入れたり、RSSとして再配信したり、いろいろ加工するフレームワークがある。
それのRuby版のpraggerというのがかつてあり、今もメンテがつづいているYapraというのフレームワークがある。

Yapraよりも以前からあるplaggerの方が環境は整っていそうなので、Yapraを選ぶのはRubyに慣れている以外の選択肢はないかもしれない。

参考:
Yapra メモ: コマンド+パイプを使った処理との比較、モジュールの書き方など | anobota
http://haraita9283.blog98.fc2.com/blog-entry-356.html

最新版:
yuanying's yapra at master - GitHub
https://github.com/yuanying/yapra



もしくは、特定のサイトだけでいいなら、
上でもでているopen-uriやらnet/httpやcurbもしくは、定番のnokogiriやmechanizeを併用して、
定期的に指定したサイトを巡回しデータを取得して、ActiveRecrdなりDataMapperなりを使ってDBに入れる。
DBに入れておけば、あとは表示はRails使うなり、静的HTMLではくなりテキストにするなりなんとでもなる。

巡回する部分は「Ruby クロール」「Ruby Webスクレイピング」でググって調べると幸せになれるとおもう。

あと、サイト側でRSSやらWeb APIが提供されているならそれを取得するとサイトデザインの変更に強くなりかなり楽。

また、既存のRSSやWebAPIをxmlやJSONとして取得したり、ちょっとした加工して取得したいだけならYahoo!Pipesを間に入れて
それをRubyから取得して使う手もある。
plaggerやYapraでやるようなフィルタリング的なことでちょっとしたことは、Yahoo!Pipesだけでもできてしまうので。
500デフォルトの名無しさん:2010/11/12(金) 12:50:57
>>498
ただし>>499にあることは、普段Rubyを使っていて、こんなライブラリを使えば楽ですよ、すぐにできそうですよ、という面が強い話。

Rubyに慣れていないなら、すぐには作れないかも知れないけど、難しく考えなくてもいい。
最低限の方法ならば、

・HTMLかRSSかWeb APIのxmlかJSONを持ってくる:
 open-uriやらnet/httpやcurbもしくは、定番のnokogiriやmechanize
・データベースに保存:
 ActiveRecordとかDataMapperとか使うと楽だけど、よくわからないなら別にファイルに直接吐いてもいいし
・条件を指定して、データベースから出力して好きなように吐き出す
 ActiveRecordとかDataMapperなどを使ってデータをDBから取り出して、
 ERBなりなんなりでHTMLやテキストに吐き出す。ファイルに吐いてあるなら適当に加工する
・定期的に上のスクリプトを実行: cronやタスクマネージャーに登録するか、ループで走らせておいてsleepしておくとか。

というようなことは、Ruby初心者でもそんなに難しくない。とにかく勉強と思わずやりたいことをすぐやったほうがいい。

どかかにサーバーを用意しておいて、寝ている間にデータを取得させて、
表示はRailsやSinatraのアプリを立てておいてWebブラウザでLANから見られるようにもできるが、
そういうのは慣れてからでもいいだろう。


それとWeb APIが予め用意されていてかなり普及しているようなWebサービス、例えば
ソーシャルブックマークやTwitterのようなSNSなどのサイトは、
そのサイトが持っているAPIをサポートするライブラリがすでに結構あるので
データを持ってくるだけならドキュメントとAPI仕様みればある程度簡単にかけるとは思う。

Rubyのライブラリがあるかは http://rubygems.org/ を検索するとわかる。
例としてTwitterのリアルタイムなデータを得るためのstreaming APIを扱うライブラリを探すときはこんな感じ
http://rubygems.org/search?utf8=%E2%9C%93&query=twitter+streaming

また http://github.com/ にもrubygems.orgにあがっていない有志の作ったライブラリが結構ある。
501デフォルトの名無しさん:2010/11/12(金) 12:58:57
>>498
ただもっと簡単にシンプルに考えるならば、Rubyすら使わずにもある程度できる。

Yahoo!Pipesでニュースサイトの吐くRSSやHTMLを都合のイイように加工する
(例えば本文テキストと日付だけとか)

wgetやcurlのようなコマンドラインでデータを取得できるプログラムで
作ったYahoo!Pipesのデータにアクセスして、ファイルに落としていく。

必要なら加工して、欲しいフォーマットにする。
検索したいだけなら、あとでgrepをかけるなり、全文検索プログラムにインデックスさせるなりする。


段階を追うならば、これらの作業をRubyで自動化してもよい。
もちろんバッチファイルやシェルスクリプトでも良い。

いきなり簡単にできそうとプログラムに飛びついて悩むことになるよりは、まずは簡単に考えよう。
502デフォルトの名無しさん:2010/11/12(金) 12:59:25
初めの2行だけ読んだ
503デフォルトの名無しさん:2010/11/12(金) 13:03:32
「まずは簡単に考えよう」だけ読んだ
504デフォルトの名無しさん:2010/11/12(金) 13:05:17
>>499-501ではぐちゃぐちゃ書いてあるが、激しくどうでも良い。こんなものは読まなくていい。

大事なのは、好きなサイトのエロ画像や動画を定期的に集めたい、
有名人やキチガイをウォッチしつづけたい、
図書館の検索エンジンが遅いのでオレオレ図書館DBを作りたい、
という欲求とそれを達成することである。

技術や言語はどうでもいいのでとにかく自分の知っている方法で始めていけばいいと思う。
とっかかりをつかめば、自分のしたいことをしやすい言語やライブラリがそのうち見つかる。
505デフォルトの名無しさん:2010/11/12(金) 13:07:28
投稿をブロックとして捉え、これは読まなくていいと判断して全てを読み飛ばした
506デフォルトの名無しさん:2010/11/12(金) 13:09:08
2行の質問、しかも曖昧な質問に長文書き込みすること自身が物事を難しく考えている証拠。
>>503が正解。「まずは簡単に考えよう」

以上
507498:2010/11/12(金) 15:47:51
詳しいアドバイスありがとうございますm(__)m

説明していただいた内容とキーワードで調べてみます


他人が作ったものが利用できるかどうかを判断するだけでも大変なので
定番やキーワードだけでも参考になります

508デフォルトの名無しさん:2010/11/12(金) 22:25:35
FileTestモジュールのsizeメソッドで負の値が返されるものがあるのですがどういうことでしょう
509デフォルトの名無しさん:2010/11/12(金) 22:48:04
ふふふふふ
510デフォルトの名無しさん:2010/11/12(金) 23:08:20
>>508
2G超のファイルだとオーバーフローして負になるのでは
2.5Gのファイルを試す
Ruby1.8.7 => -1703582628 => 0xffffffff9a75645c
Ruby1.9.2 => 2591384668 => 0x000000009a75645c

4.9Gのファイルだと
Ruby1.8.7 => 982142884 => 0x000000003a8a4fa4
Ruby1.9.2 => 5277110180 => 0x000000013a8a4fa4
正の数だが桁が落ちてる
511デフォルトの名無しさん:2010/11/12(金) 23:09:52
>>510 は、Windows版での話です
512デフォルトの名無しさん:2010/11/12(金) 23:12:48
FileTest.sizeは OFFT2NUM(stat.st_size)を返しているだけなので、
* off_t 型(signed整数、サイズは環境依存)の限界を超える巨大ファイル
* off_t 型の実体検出結果に間違いがある(もしそうならバグ)
という理由を思いついたが他にもあるだろうか。
513デフォルトの名無しさん:2010/11/12(金) 23:17:06
mechanizeのようなものでさらにjavascriptを理解できるライブラリってありますか?
514デフォルトの名無しさん:2010/11/12(金) 23:24:42
Watir
ただしInternetExplorerや特殊なアドオン入りFirefoxを常に起動している必要あり
515デフォルトの名無しさん:2010/11/12(金) 23:27:02
>>508です

>>510
>>512

確かに当該ファイルだけ3G強というサイズでした。
お二人のおっしゃるとおり限界値を越えていたのだろうと思います
ありがとうございました
516デフォルトの名無しさん:2010/11/12(金) 23:44:22
>514
有難うございます!
517デフォルトの名無しさん:2010/11/13(土) 14:11:32
>>508
6GBくらいのファイルで試した

・Windows
Ruby 1.8.7-p302 -1395916800  ←!!
Ruby 1.9.2-p0  7194017792
Ruby 1.9.2-dev  7194017792

・Linux Ubuntu 32bit
Ruby 1.8.7-p302 7194017792
Ruby 1.9.2-p0  7194017792

昔の32bit intでファイルサイズ扱ってて2GB超えると正しく扱えない処理系思い出した
518デフォルトの名無しさん:2010/11/13(土) 14:35:10
>>513
BDDやテスティンフレームワークにから使われるCapybaraというライブラリが
JavaScriptの解釈にSeleniumかCulerityとCelerityを使うので参考になるかも。

CapybaraはDSLでブラウザのテストを自動化するためのもののようだし、
どこまで使えるかわからないけど
519デフォルトの名無しさん:2010/11/14(日) 07:26:06
リファクタリングRuby 実践ワークブック: ウィリアム・C・ウェイク: 本
ttp://www.amazon.co.jp/dp/4864010099/
520デフォルトの名無しさん:2010/11/14(日) 12:36:38
eclipseでRubyOnRailsの開発環境を構築しようとして困っています。
助けてくださいませんでしょうか・・・

【環境】
OS: WindowsXP Home Edition
eclipse: pleiades-e3.6-java-jre_20101025
InstantRails: 2.0(Rubyのバージョンは1.8.6)

Railsプロジェクトを作成すると、
’Replace prject index file’に問題が発生しました。
リソース'/(プロジェクト名)/public'が存在しません
というエラーダイアログが表示されます。

エラーダイアログを閉じ、ジェネレーターでscaffoldを生成しようとしても、
うんともすんとも言いません・・・。

eclipseログには
!MESSAGE 内部エラー
!STACK 1
org.eclipse.core.runtime.CoreException: Local configuration cannot be nested in a directory.
at org.eclipse.debug.internal.core.LaunchConfigurationType.newInstance(LaunchConfigurationType.java:463)
at com.aptana.rdt.internal.core.gems.GemManager.createGemLaunchConfiguration(GemManager.java:374)
at com.aptana.rdt.internal.core.gems.GemManager.launchInBackgroundAndRead(GemManager.java:258)
at com.aptana.rdt.internal.core.gems.GemManager.loadSourceURLs(GemManager.java:850)
at com.aptana.rdt.internal.core.gems.GemManager$2.run(GemManager.java:834)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
!SUBENTRY 1 org.eclipse.debug.core 4 0 2010-11-14 12:17:18.812
!MESSAGE Local configuration cannot be nested in a directory.
が出力されています。

RadRails単体でRailsプロジェクトを作成しても同じエラーが発生していまいました。
521デフォルトの名無しさん:2010/11/14(日) 12:43:58
>>1にすら書いてあるのだがRailsのことはRailsスレで
【Ruby】Ruby on Rails Part10
http://hibari.2ch.net/test/read.cgi/php/1282991262/
522デフォルトの名無しさん:2010/11/14(日) 12:59:05
>>521
ごめんなさい。
読んだつもりが見逃していました。
>>4に書いてありましたね。
わざわざありがとうございます。
失礼しました。
523デフォルトの名無しさん:2010/11/14(日) 15:51:06
やっぱ>>1は長くてわかりにくいんだろう
1人や2人じゃないからな、多分構造的な問題
524デフォルトの名無しさん:2010/11/14(日) 20:44:33
SWIGをただいま勉強中なのですが、配列を受け取って中身を破壊的に操作して返す関数というのは簡単に書けるでしょうか?
typemapというものを勉強する必要があるのでしょうか?
525デフォルトの名無しさん:2010/11/16(火) 18:48:55
hash modified during iteration
ってエラーはどんな時にでるの?

http://www.java2s.com/Code/Ruby/Hash/RuntimeErrorhashmodifiedduringiteration.htm
にあるみたいに

 1.upto(100){|x| h[x]=true}
 h.keys{|k| h[k*2]=true}

とかしてみたけど起こらなかった
526デフォルトの名無しさん:2010/11/16(火) 19:02:55
foo = {"a" => 1}
foo.each{foo["b"] = 2}

RuntimeError: can't add a new key into hash during iteration

ではなくて?
527デフォルトの名無しさん:2010/11/16(火) 21:34:28
>>525
「ruby hash modified during iteration」でぐぐって、最初のページに書いてあった。

hash = {1 => 2, 3 => 4, 5 => 6}
big_hash = {}
64.times { |k| big_hash[k.to_s] = k }
hash.each { hash.merge!(big_hash) }
528デフォルトの名無しさん:2010/11/16(火) 21:39:47
hash というローカル変数を使用する人は個人的にあんまし信用できないんだが
いやまあ Hash オブジェクトがあるのに Object#hash なんて作った Ruby 側が一方的に悪いんだけどさ
これ __hash__ でも全く何の問題もないよね
529デフォルトの名無しさん:2010/11/16(火) 23:58:06
Rubyはどうして敗北しちゃったの?

あんなに勢い良かったのに。
530デフォルトの名無しさん:2010/11/17(水) 00:01:28
>>529

?
531デフォルトの名無しさん:2010/11/17(水) 00:01:45
>>529
【Perl,PHP】LLバトルロワイヤル13【Ruby,Python】
http://hibari.2ch.net/test/read.cgi/tech/1287944631/
532デフォルトの名無しさん:2010/11/17(水) 00:16:07
>>529
それまでふつうにRubyを使っていた人は辟易していたよ。
533デフォルトの名無しさん:2010/11/17(水) 01:07:42
>>527が何をしてるのかわかんない
63.times { } だとRuntimeErrorにならないけど
534デフォルトの名無しさん:2010/11/17(水) 01:26:52
今やPythonプログラマーはプログラマー人口の5%超なのに、Rubyは2%以下だしな。
535デフォルトの名無しさん:2010/11/17(水) 06:03:05
スレタイ嫁
ここは雑談スレでもバトロワスレでもない
Rubyを学ぶ者が質問するスレだ
536デフォルトの名無しさん:2010/11/17(水) 07:25:49
>>533
たぶんテーブルの再構成が 64 で起きるんだろう。
537デフォルトの名無しさん:2010/11/17(水) 11:13:30
iteration回してる時に、コレクションの数を変動させる男の人って…
538デフォルトの名無しさん:2010/11/17(水) 11:24:42
極力本質的になるように短く簡潔にしたコードに文句言う人というのは確かにいる
539デフォルトの名無しさん:2010/11/17(水) 11:43:25
Hashに追加するスレッドとHashを回すスレッドが別ならわかりやすいのだろうか
わざわざそんなふうに書く必要もない気がするんだが
540デフォルトの名無しさん:2010/11/17(水) 11:54:58
変数名を1文字とかにするのはごく短い寿命の変数とかループのiとかを別にするとあまりよくないと思う
541デフォルトの名無しさん:2010/11/17(水) 12:03:01
メソッドの引数として数値を想定してて、それが本当に単に
「数値」以上の意味を求めない場合はxとかnとかいう名前にすることはあるかな
542デフォルトの名無しさん:2010/11/17(水) 12:08:08
>>540
そんな話はしていない
543デフォルトの名無しさん:2010/11/17(水) 18:03:59
>>525
ってちゃんとエラー出ていてエラーメッセージが現象を表している分にはいいんじゃないの?

他の言語で似たようなことがあってもエラーでずに動いたり、
もしくはたまにエラーでたり大変だったわ。
エラーといってもiteration中に弄るんじゃねえよというエラーではない。

想定されているから出せるエラーだよなこれ
544デフォルトの名無しさん:2010/11/17(水) 19:33:57
で、結局何が原因なの?
iteration中にHashの要素弄るなってこと?
gemで配ってるライブラリの中だから直せないけど
545デフォルトの名無しさん:2010/11/17(水) 19:47:15
…いや原因なんて見たまんまじゃねえか
対策としてはほんのりsleepさせるとうまくいったりいかなかったり
作者の環境で気が付かないのならおそらくそれで
546デフォルトの名無しさん:2010/11/17(水) 20:34:24
ええぇ?
イテレーション中に弄ってもいいの!?
547デフォルトの名無しさん:2010/11/17(水) 20:38:11
>>544
githubだったら修正してpull request
548デフォルトの名無しさん:2010/11/17(水) 22:40:25
<?xml version='1.0' encoding='UTF-8'?>
<ResultSet
xsi:schemaLocation = "urn:yahoo:jp:srch http://search.yahooapis.jp/WebSearchService/V1/WebSearchResponse.xsd"
firstResultPosition = "1"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
totalResultsAvailable = "404000000"
pgr = "22656901"
xmlns = "urn:yahoo:jp:srch"
totalResultsReturned = "1">
<Result>
<Title>Ruby - Wikipedia</Title>
<Summary>Ruby(ルビー)は、まつもとゆきひろ(通称Matz)により開発されたオブジェクト指向スクリプト言語であり、 ... Rubyの公式な実装には、以下の二種類が存在する。 ...</Summary>
<Url>http://ja.wikipedia.org/wiki/Ruby</Url>
〜〜
</Result>
</ResultSet>
というXMLをyahoo apiで取得しているのですが、これから titleとurlを取得しようとしています。
libxmlでurlだけ取得しようと思って
xp=XML::Parser.new
xp.string =xml#上のxml
doc=xp.parse
doc.find('/Url').each do |e|
p e.content
end
としたのですが、無反応でした。rexmlを使っているかたは居たのですが、
大量に処理をしたいと思っているので、速度的に問題があるかなと思っています。
なにか知恵を与えてくださるとありがたいです
549デフォルトの名無しさん:2010/11/17(水) 22:50:16
irb> doc = Nokogiri::XML.parse(xml)
irb> p doc.at('Title').inner_text
"Ruby - Wikipedia"
irb> p doc.at('Url').inner_text
"http://ja.wikipedia.org/wiki/Ruby"
550デフォルトの名無しさん:2010/11/17(水) 23:20:40
>>548
Rubyからlibxml使ったことないからよく知らないけど
findの引数を 'Url', '//Url', '/Result/Url' なんかにして試してみては
あるいは正規表現で /<Url>(.*?)</Url>/ とかでも
551デフォルトの名無しさん:2010/11/17(水) 23:22:33
>>549 ありがとうございます。
複数の<Result></Result>になったものを最終的にしようと思ったので
doc.xpath("/ResultSet/Result/Title").each do |e|
p e.inner_text
end
としたのにこれまたダメでした。xpathの書き方あ
http://ja.wikipedia.org/wiki/XML_Path_Language をみたのですが、間違っていますか?
552デフォルトの名無しさん:2010/11/17(水) 23:55:12
そんなこと言われてもどんなXMLが返ってくるかなんてこっちは知らんので

<ResultSet>
 <Result>TitleとかUrlとかが入ってる検索結果その1</Result>
 <Result>TitleとかUrlとかが入ってる検索結果その2</Result>
</ResultSet>

という構造だと勝手に推測、夜遅いし眠いのでXPathの条件記述とか全く使用しない力技

doc.search("Result").each{|res| puts res.at('Title').inner_text, res.at('Url').inner_text}
553デフォルトの名無しさん:2010/11/18(木) 00:02:12
>>552
すいませんすいません。簡略化してでも書けば良かったですね><
かかれたものでうまくいきました。
XPATHとNokogiriをキーに勉強して来ます。
554デフォルトの名無しさん:2010/11/18(木) 01:15:59
解決したみたいだけどLibXMLでも一応

#!/usr/bin/ruby
require 'rubygems'
require 'xml'

doc = XML::Document.file('resultset.xml')
doc.root.namespaces.default_prefix = 'yapi'
doc.find('yapi:Result').each{|res|
        title = res.find('yapi:Title')[0]
        url = res.find('yapi:Url')[0]
        puts "#{title.content}: #{url.content}"
}

デフォルトの名前空間をうまいこと扱ってくれないのは面倒だね
555デフォルトの名無しさん:2010/11/18(木) 12:43:47
rubyのメソッドの解釈する順番が分からないです

hoge("huga")

def hoge(text)
puts text
end

上のようにメソッド定義前にメソッドを呼び出すとダメだよね?

でも

class SelfTest
def fuga
hoge("success!!")
end

def hoge(text)
puts text
end
end

test = SelfTest.new
test.fuga

これだとうまくいくのはなんでなの?
556デフォルトの名無しさん:2010/11/18(木) 12:58:16
>>555
Rubyでの定義文(classやdef)は実行文なので、実行されないと定義もされない。


hoge("huga")   # この時点ではまだhoge()の定義文が実行されてないからエラー
def hoge(text)
 puts text
end



class SelfTest
 def fuga
  hoge("success!!")
 end
 def hoge(text)
  puts text
 end
end

test = SelfTest.new
test.fuga   # この時点でfuga()もhoge()も定義文が実行されているからエラーにならない
557デフォルトの名無しさん:2010/11/18(木) 13:22:44
いわゆる後ろ sub は、それが一般的な言語もあるんだが、Ruby ではできないと考えてもらっていい
ぶっちゃけやってやれないこともなかったはずなんだが、誰も覚えてない程度には誰もやらない
558デフォルトの名無しさん:2010/11/18(木) 13:31:02
このへん若干不審っぽい動作なんだよね
def はメソッド登録だけすると思ってもらえるといいんだけどさ
def の中身がどうなっているかは def 登録時には関与しない

puts b
def b; "B!!"; end
がアウトで

def a; puts b; end
def b; "B!!"; end
がいいのは理不尽っぽい気がちょっとだけする
559デフォルトの名無しさん:2010/11/18(木) 13:38:06
>いわゆる後ろ sub は

前方参照じゃなかったっけ
560デフォルトの名無しさん:2010/11/18(木) 13:47:16
requireで読み込みながら上から実行してってるだけだからな、Ruby
紳士協定で誰もやらないってだけで、本来はrequireの順番が重要なはず
今もrequire 'rubygems'なんかが順番依存だけどさ

>>559
そういうのではなく、たぶん
&hello;
sub hello{
print "Hello!\n";
}
で書かれるタイプの「プログラム後半にサブルーチンどかっと定義」のやり方のことだと思う
561デフォルトの名無しさん:2010/11/18(木) 14:02:28
それを前方参照と言うのでは?
562556:2010/11/18(木) 15:06:45
>>558
自分もなんだか理不尽に感じて質問したんだよね
javascriptとかならそういうやり方出来るし・・・
とりあえず分かった気がします、ありがとう
563デフォルトの名無しさん:2010/11/18(木) 18:21:21
>>558
俺もrubyに来たときその挙動が不思議だった。
「あとで宣言するものを参照できない仕様」くらいに思っていたけど全然違ってた

rubyは上から順に実行していってるだけで、メソッドの中は後でそのときになって実行してると考えたら>>558の挙動はしっくりきた
動的言語でのメソッドの遅延評価というだけなのか知らんが



>>558の例で言えば def a までプログラムが走ったときにそのメソッドの中身は「評価」しないと。
つまりputs bのbがそれまでに定義されているかいないかなんて見てない。そのときは評価しないんだから。


その後でコード外で、どこか別のところでaが呼ばれれば、
その中で始めてbが参照されると

こんな理解でいいの?
564デフォルトの名無しさん:2010/11/18(木) 18:22:07
>>556 ですでに端的にまとめられてた
ウワァァァン
565デフォルトの名無しさん:2010/11/18(木) 18:26:16
>>563 がおかしいわ、スマンこってす

後で評価されるから、ではなく、
メソッドの定義をしたときにはメソッドが有るか無いかまでは見ない
実行時に初めて調べるということだな

動的言語だからっと言ったほうがすっきりくるかも
566デフォルトの名無しさん:2010/11/18(木) 18:52:28
初心者にとってまぎわらしいのは、評価はしなくても文法チェックは行われるところだな
$ cat a.rb
def foo
if 1 then
ende
end

$ ruby a.rb
a.rb:5: syntax error, unexpected $end, expecting kEND

これなんかは foo メソッドを実行して初めて
「いやーないわーこのifはないわー(endが無い的な意味で)」
とか言ってくれてもよさそうなもんなのに
567デフォルトの名無しさん:2010/11/18(木) 19:13:32
いやーないわーそれはないわー(文法がおかしいのは最初から実行するべきでない的な意味で)
568デフォルトの名無しさん:2010/11/18(木) 19:59:37
>>566
そのfooメソッドの範囲はどこまでになるのか考えるといい
endeは無効なんだから、放っておくなら最後のendはif文に対応するわけだが
569デフォルトの名無しさん:2010/11/18(木) 21:41:33
570デフォルトの名無しさん:2010/11/19(金) 00:40:03
メソッドも動的に追加出来る仕様な以上
文法チェック以上のチェックは出来ないんよね
def文だって、いわば動的に追加してるだけだし
571デフォルトの名無しさん:2010/11/20(土) 11:18:16
verはたぶん1.8 cgi
クッキーをブラウザから読み込んだり、書き込んだりしたいのですが
上手く行きませんので、下記の修正お願いします
プログラム初心者のため、ハッシュも分かってない状態です

konomi1 = cgi.cookies['konomi'].first
expires = Time.now + 60*60*24*30
cookies = [CGI::Cookie::new({
'name' => 'konomi',
'value' => konomi1',
'expires' => expires,})
cgi.out("cookie" => cookies)
572デフォルトの名無しさん:2010/11/20(土) 11:35:38
cookies の代入の最後に ] が欠けている。
'value' に対応する値 konomi' の最初の ' が欠けている。

以上を直して、コマンドラインから実行

$ /usr/bin/ruby -v test.rb
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
(offline mode: enter name=value pairs on standard input)
^D
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/cgi.rb:706:in `out':
no block given (LocalJumpError)

cgi.out はブロックがないとエラーになることが分かる。
文字列を返すブロック( { '' } でよい)を付ける。

$ /usr/bin/ruby -v test.rb
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
(offline mode: enter name=value pairs on standard input)
^D
Content-Type: text/html
Content-Length: 0
Set-Cookie: konomi=; path=; expires=Mon, 20 Dec 2010 02:34:29 GMT

573デフォルトの名無しさん:2010/11/20(土) 11:51:50
>>572
コメント有難うございます。
上手く動かないので、前文載せます。指摘お願いします

#!/usr/bin/ruby
print "Content-Type: text/html\n\n"
require 'cgi'
cgi = CGI.new
konomi = cgi.cookies['konomi'].first
expires = Time.now + 60*60*24*30
cookies = [CGI::Cookie::new({
'name' => 'konomi',
'value' => konomi,
'expires' => expires,})]
cgi.out("cookie" => cookies) do

print <<EOM
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
"<html lang="ja"><body>
<form action="test.cgi" method="get">
このみ:<select name="konomi">
<option>りんご</option>
<option>みかん</option>
</select>
<input type="submit" value="計算">
</form>
あなたの好みは#{konomi}ですね
</body></html>"
EOM
end
574デフォルトの名無しさん:2010/11/20(土) 12:11:19
CGI.rbを使うのはRubyの基礎を学んでからにしたほうがいい
知識なしでは2重3重に遠くから長い菜箸で物をつまむような感覚に近い
575デフォルトの名無しさん:2010/11/20(土) 12:46:11
>>574
2行目を削除する必要あるような気がする。
そうするとprint<<EOM以下を大幅変更する必要ありそうだが、分からず。

地道に基礎から学んでいこうと思います。
576デフォルトの名無しさん:2010/11/20(土) 13:57:14
cgi.out の中身は文字列そのものを返す処理を書く。printしたらダメ。
577デフォルトの名無しさん:2010/11/20(土) 15:37:18
>>576
了解です。
いちごは表示しましたが、りんごは選択しても表示せず。
あと一歩です

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
konomi = cgi.cookies['konomi'].first
cookies = [CGI::Cookie::new({
'name' => 'konomi',
'value' => konomi,
'expires' => Time.now + 60*60*24*30,})]

cgi.out("cookie" => cookies) do
"<html><body>
<form action=test.cgi method=post>
好み:<select name=konomi>
<option>いちご</option>
<option>りんご</option>
</select><br>
<input type=submit value=計算></p>
</form>
Cookie test: #{konomi}
</body></html>"
end
578デフォルトの名無しさん:2010/11/20(土) 15:43:41
selectの情報を結果生成に利用しているようには見えないのだが。
579デフォルトの名無しさん:2010/11/20(土) 16:15:10
CGI.rbを使うのはRubyの基礎を学んでからにしたほうがいい

・ Rubyの知識
・ CGIの知識
・ HTMLの知識
・ HTTPの知識

これら全てを全く隠蔽せず、剥き出しで求めてくる
これら4つの知識がある人にのみ使用可能
はっきり言って、今のままだと書き換えるたびにこのスレに聞いてくるはずだ
580デフォルトの名無しさん:2010/11/20(土) 16:37:43
いい代替ライブラリもないけどな
まあ簡単に作ってもらっては困るという点で間違ってもいないのか
581デフォルトの名無しさん:2010/11/20(土) 16:43:01
今なら、ミニマムなもの作るならRack+Sinatraでいいじゃん

Rackが動かん、Rubyが古い環境ならわかるが
それは新たにCGI.rbの使い方を聞くような状況ではなかろう
582デフォルトの名無しさん:2010/11/20(土) 16:44:59
なんで初心者がCGI.rbを使いたがるのかわからん
CGI.rbにたどり着くのか?

Rubyに限らずネットには古い情報もあるし、
まずは期間を1年以内にして検索するというのもテンプレに入れとけや
583デフォルトの名無しさん:2010/11/20(土) 16:46:38
CGIという名前自体は知っていて、標準ライブラリに cgi.rb があったら飛びつくのも無理はないと思う。
584デフォルトの名無しさん:2010/11/20(土) 17:07:47
RackはRackの概念が若干…
585デフォルトの名無しさん:2010/11/20(土) 17:44:25
>>582
ほかに代替がないから仕方ない。
Rack?初心者にはRackは難しいヨ。
586デフォルトの名無しさん:2010/11/20(土) 18:13:48
起動コストの高い糞RubyをCGIで動かす馬鹿いるのか?w
587デフォルトの名無しさん:2010/11/20(土) 18:19:21
>>586
よし、日本におけるRuby普及の歴史について400字でまとめていいぞ
588デフォルトの名無しさん:2010/11/21(日) 19:05:45
Q.RubyでCGIが作りたいのですが
A.PHPがお勧めですよ。
589デフォルトの名無しさん:2010/11/22(月) 11:39:58
# 戦闘でのターンごとの行動をまとめて格納する
class Turn
# ターン番号
attr_accessor :turn

# ターンごとのキャラごとの行動
attr_accessor :actions

def initialize( turn )
@turn = turn
@actions = []
end
end
こういうコードを書きながら思ったのですが
上のコードを
Struct.new :turn, :actions
とすると1行で収まるけど、変数の初期値が設定できないので
これをハッシュを与えて
Struct.new :turn=nil, :actions=>[]
とできると嬉しいのですが。
590デフォルトの名無しさん:2010/11/22(月) 12:41:58
>>589
Struct.new :turn, :actions
は配列を渡していて、これが今の仕様。
Struct.new :turn=>nil, :actions=>[]
だとハッシュを渡すことになって、これだと仕様が変わっちゃうので、多分無理。
#ハッシュを渡すと引数の順番の情報がなくなるから。
#でも1.9だといけそうだね。
591デフォルトの名無しさん:2010/11/22(月) 13:27:55
>>589
メソッド定義は冗長になるが、正攻法なコードを。

def initialize(options = {})
  @turn = nil
  @actions = []
  for key, value in options
    case key
    when :turn
      @turn = value
    when :actions
      @actions = value
    else
      raise ArgumentError
    end
  end
end
attr_accessor :turn, :actions

使い方は Turn.new :turn => 1, :actions => [:hoge, :fuga, :foo] で。
このTurnクラスのような単なる構造体/レコードをたくさん定義する必要があるなら、
上のやり方だと面倒に感じるかもしれない。もしメタプログラミングに慣れれば、
自分で(Structのように)クラスを返すnewメソッドを定義できるようになる。
(普通はインスタンスを返すよね?)以下はそんなクラスの例。

Turn1 = MyStruct.new :turn, :action
592デフォルトの名無しさん:2010/11/22(月) 14:01:29
それなりに意味のある仕様なのであんま勝手に変えるな読みにくいだろ、とちょっと思う
593591:2010/11/22(月) 15:09:31
>>592
何を言ってるのか意味が読み取れない.....。

>>591では、Ruby標準の組み込みクラスであるStructの仕様は何も変更してないよ。
上段のコードはオプション引数処理を手作業でゴリゴリ書いていく、ごく常識的なもの。
下段のメタプログラミングうんぬんというのは、(Structクラスの挙動を変更するのではなく、)
たとえばMyStructという名前で、目的に応じた独自の(クラスを返す)クラスを
自分で新規に定義するのがいいね、って話なんだけどな。
594デフォルトの名無しさん:2010/11/22(月) 15:58:26
selfの使いどころというか何者なのかが分かりません

class MyClass1
def self.define_m(name)
define_method(name){
puts name
}
end
define_m :method_a
define_m :method_b
end

class MyClass2
def define_m(name)
define_method(name){
puts name
}
end
define_m :method_a
define_m :method_b
end

上のようなコードを書いてみたけど、
classtest.rb:21: undefined method `define_m' for MyClass2:Class (NoMethodError)
ってエラーが出てきて実行できません
selfがあるのとないのとではどう違うのでしょうか?
595デフォルトの名無しさん:2010/11/22(月) 16:21:21
MyClass2.new.define_m
596デフォルトの名無しさん:2010/11/22(月) 16:23:13
class C
 # ここ
end

において「インスタンスメソッド形式で記述できる」のは、
定数 C に入ってる Class クラス のオブジェクトのインスタンスメソッドだ
つまり、いわゆる、クラス C のクラスメソッド

Class C
def m; end
m
end

としても、定数 C にはインスタンスメソッド m が定義されてないからエラー
C.new としたものにはインスタンスメソッド m は定義されている
597デフォルトの名無しさん:2010/11/22(月) 16:34:57
最初のうちは p self や p methods すれば現在地や呼べるものが把握しやすいよ
598デフォルトの名無しさん:2010/11/22(月) 16:54:00
>>594
selfの意味は「文脈」によって変わる。たとえば>>594であれば、前半の

 class MyClass1
   def self.defile_m(name)  # 本当に必要な場合を除いて、オヌスメしない

だと self はクラス MyClass1 を指す。言い換えると、上のコードは以下と等しい。

 class MyClass1
   def MyClass1.defile_m(name)  # 慣れぬうちは、(いくらか面倒でも)こちらがオヌヌメ

これは、クラスMyClass1への「クラスメソッド」の定義を意味する。そして、後半の

 class MyClass2
   def defile_m(name)

は、MyClass2への「インスタンスメソッド」の定義を意味する。
これが、いわゆる普通のメソッド定義と呼ばれるもの。
599デフォルトの名無しさん:2010/11/22(月) 20:53:00
なんで? def self.xxx のほうが分かりやすいような気がするけど
600デフォルトの名無しさん:2010/11/22(月) 21:13:34
みんなが使ってない書き方のほうがかっこいいだろ
601デフォルトの名無しさん:2010/11/22(月) 22:06:15
なるほど
602デフォルトの名無しさん:2010/11/22(月) 22:13:34
このへんには「クラスメソッドなんて特別なもんは存在しなかったんや」という理解がどうしても必要
そういう点で>>598は全面的に糞
603デフォルトの名無しさん:2010/11/22(月) 22:14:48
特異メソッドという名前なのに特別ではないとはおかしいじゃなイカ
604デフォルトの名無しさん:2010/11/22(月) 23:05:16
特異メソッドは特定のインスタンスのメソッドってだけで全然特別じゃない
605デフォルトの名無しさん:2010/11/22(月) 23:22:12
特定のインスタンスってところが特別なんじゃない
606デフォルトの名無しさん:2010/11/22(月) 23:23:39
そんなこと言うと、クラスは単なるClassクラスのインスタンス云々とか
今まで100回以上言ってるようなことを繰り返し出すぞ
607デフォルトの名無しさん:2010/11/22(月) 23:32:48
そのへんはsingletonを特異と最初に訳した奴が悪いという結論になってる
608デフォルトの名無しさん:2010/11/23(火) 00:01:25
Singularityかと思った
609デフォルトの名無しさん:2010/11/23(火) 01:48:26
並列でDLするのってrubyからcurlつかえばいいの?
610デフォルトの名無しさん:2010/11/23(火) 03:01:52

typhoeusを調べてみれば。使い方わかんないけど
611デフォルトの名無しさん:2010/11/23(火) 08:57:16
>>607
誰?
612598:2010/11/23(火) 12:23:32
>>599
>>598で書いたけど、 ---- selfの意味は「文脈」によって変わる ---- から、というのが理由。
613デフォルトの名無しさん:2010/11/23(火) 12:41:05
http://twitter.com/yukihiro_matz/statuses/6862021614112769

yukihiro_matz: 昨日の「遅刻する夢」に引き続いて、今日は「迷子になる夢」を見
た。なんか不安があるんじゃないだろうか、オレ
               ∩_
              〈〈〈 ヽ
      ____   〈⊃  }
     /⌒  ⌒\   |   |
   /( ●)  (●)\  !   !
  / :::::⌒(__人__)⌒:::::\|   l
  |     |r┬-|       |  / <こいつ最高に良い勘してるお
  \     ` ー'´     //
  / __        /
  (___)      /
614デフォルトの名無しさん:2010/11/23(火) 12:51:15
マルチうざい
615デフォルトの名無しさん:2010/11/23(火) 13:06:35
>>612
selfの概念なしでRubyプログラミングできるようになってから喋れ
できないというのならselfの存在を意識して身につける機会を初心者から取り上げて悦に浸る自慰行為なんてするな、迷惑だ
616598:2010/11/23(火) 13:22:32
>>615
>selfの存在を意識して身につける機会を初心者から取り上げて

取り上げる気なんてぜんぜん無いし、>>598でも「オヌヌメ」と書いただけ。なぜ絡まれるのか訳わからん
617デフォルトの名無しさん:2010/11/23(火) 13:28:47
>>598はいまさら何を言っても説得力ゼロな気が…
class〜end 内でプライベート形式でメソッドを書ける理由の説明にすらなってねえ
「クラスメソッドはクラス定義中ではselfなしで、メソッド定義中ではクラス名をつけて書きます」
「インスタンスメソッドはクラス定義中では使えず、メソッド定義中はselfをつけて書くこともできます」
みたいな恐ろしい形式的説明を初心者にしなければならない羽目に陥る危険性が大だ
618デフォルトの名無しさん:2010/11/23(火) 13:40:48
ぶっちゃけここだけでself避けても意味ないんやなすぐにまたぶちあたるんやな
619デフォルトの名無しさん:2010/11/23(火) 13:51:23
どうでもいいけどどう考えても総合的な使い勝手は クレラップ > サランラップ だと思う
サランラップは常温や低温でもラップとしてぺったりくっつくことを重視し過ぎた
620デフォルトの名無しさん:2010/11/23(火) 14:04:00
よくわかんないけどサランラップは大原さやかが動画で使い方をレクチャーしてくれるから
まだまだクレラップに負けていないと思う
621598:2010/11/23(火) 14:17:42
>>617
何を指して「いまさら」なのか意味不明だが....。

繰り返しになるけど、>>598で書いたのは
「selfは文脈によって意味が変わるから読みづらいコードになる。だから、(本当に必要な場合を除いて)オヌヌメしない。」
という、ごく単純なお話。

逆に、
>「クラスメソッドはクラス定義中ではselfなしで、メソッド定義中ではクラス名をつけて書きます」
>「インスタンスメソッドはクラス定義中では使えず、メソッド定義中はselfをつけて書くこともできます」
みたいな難解な理屈を初心者相手に振り回して悦に入るほうが、かえって不親切だと思うけど。

>>618
その通りで、基本はselfを避ける。で、本当に必要になった時に(メタプログラミングに挑戦しようとする時に)、
慎重にselfを使うってのがオヌヌメだと思う。
622デフォルトの名無しさん:2010/11/23(火) 20:54:20
javascriptのthisよりマシじゃん>self
623デフォルトの名無しさん:2010/11/23(火) 23:48:58
適当にRuby使ってたら気にしなくても良かったけど
メタプログラミングが気になりだしてからはselfの取り扱いを慎重にならざるを得なかったな

主にRailsでだが
624デフォルトの名無しさん:2010/11/23(火) 23:58:41
Python最強
625デフォルトの名無しさん:2010/11/24(水) 08:32:47
Pythonは正規表現をなんとかしてほしい
626デフォルトの名無しさん:2010/11/24(水) 13:19:26
スレチだが、新しいエンジンに入れ替えるという話が進んでるみたいよ> Pythonの正規表現
ttp://bugs.python.org/issue2636
627デフォルトの名無しさん:2010/11/24(水) 13:46:38
せめて向こうに張れや
みんな両方チェックしてるんだから
628デフォルトの名無しさん:2010/11/24(水) 16:05:40
エンジンどうこうより、あのreをどうにかしてほしい
629デフォルトの名無しさん:2010/11/24(水) 16:24:24
おでかけですか?
630デフォルトの名無しさん:2010/11/24(水) 18:48:10
git help rerere
631デフォルトの名無しさん:2010/11/24(水) 19:22:49
みんな>>599みたいな感覚だと思っていたので>>598みたいな人がいるのにはちょっとびっくり。

>>598
うーん、クラス名を変更したときのこと考えてもselfを使う方が素直な書き方のような。
598オヌヌメ方針だと、ついタイプミスして class MyClass1 ... def MyClass2.defile_m とかしてしまいそう:-)


632デフォルトの名無しさん:2010/11/24(水) 19:39:20
ズレたおれルールを押しつける
Rubyスレ全般で名物的な人なので相手にしなくていいです
633デフォルトの名無しさん:2010/11/24(水) 19:47:10
文脈によって意味が変わるってどういう場合にどんな意味に変わるんだ?
参照先のインスタンスが変わるだけじゃないの?
634598:2010/11/25(木) 01:24:20
>>631
>うーん、クラス名を変更したときのこと考えても

自分も最初はそう考えていたけど、最近のエディタの文字列置換機能や自動補完機能は賢いから
クラス名の一括変更はそれほど苦にはならなかったりすることに気付いた。

>598オヌヌメ方針だと、ついタイプミスして class MyClass1 ... def MyClass2.defile_m とかしてしまいそう:-)

ついタイプミスをしてしまっても、Rubyインタプリタがその場でミスした箇所とミスの内容とを
エラーメッセージという表現で教えてくれる。
なんとなく動いてしまって意図しない最終的な出力結果の矛盾に悩みこむよりも、ずっと楽ができると思う。

>>632
だから「押しつける」気なんて全然無いし....。漏れの個人的なオヌヌメをカキコしてるだけ。
そのオヌヌメが自分に合わないと感じたならスルーすればいい。誰でも自分の考えを発言するのは自由だろ?
635598:2010/11/25(木) 01:28:48
>>633
>参照先のインスタンスが変わるだけじゃないの?

たとえば>>594の場合だと、(インスタンスではなく)クラスと表現したほうが適切だろうね。
難しく言えば「クラスオブジェクトであり、その言葉の意味は.....」とかなるけど、初心者スレ向きじゃない。

>文脈によって意味が変わるってどういう場合にどんな意味に変わるんだ?

・定義しようとしているメソッドはクラスメソッドなのかインスタンスメソッドなのか?
・selfの位置はメソッド定義の内側か外側か?

これらの組合せによって、参照先のオブジェクトがインスタンスになったりクラスになったりする、という意味。
さらに(>>594は最も単純なケースだけど)、これに

・モジュールやクラスの定義がネストする(= 入れ子になった)ケース
・includeによるMix-inや、加えてextendによる........

みたいな条件の組合せが絡みだすと、(少なくとも漏れには)もうワカワカメな状態になる。
そんな事で悩むくらいなら、(selfで省略したりせずに)クラス名を明示的に書いたほうが最終的には楽になるカモ、という意味。
難しいことを言う(押し付ける)気はなくて、楽をしよう!!、ズボラなプログラミングで行こうぜ!!っていうお話です。
636デフォルトの名無しさん:2010/11/25(木) 01:56:07
ズボラ流だったら self.xxx と書いてた方が、
他のクラスにそのままコピペできるじゃん
って話とは違うのか。
637デフォルトの名無しさん:2010/11/25(木) 06:26:59
>>635 あんたが Java 脳ってだけ
638デフォルトの名無しさん:2010/11/25(木) 07:42:34
1.9はいつド素人に解禁されるの?
639デフォルトの名無しさん:2010/11/25(木) 07:58:45
クラス定義の中とメソッド定義の中を区別しない奴はその時点で色々アウトだろ。
640デフォルトの名無しさん:2010/11/25(木) 11:57:10
self がイヤなら逐一クラス名を明示的に指定ということでトップレベルで

def MyClass1.func1
...
end

def MyClass1.func2
...
end

と書けばよいのでは?わざわざ class ... end の中に入れる必要はないかと。
641デフォルトの名無しさん:2010/11/25(木) 13:13:51
クラスが定義済みならな
642デフォルトの名無しさん:2010/11/25(木) 14:06:50
gem source -a http://gems.github.com
したらHTTPエラー302だったんだけどなんで?
643デフォルトの名無しさん:2010/11/25(木) 14:39:30
gem install に --source=http://gems.github.com オプションつけたら
30分以上メモリ消費とディスクアクセスがハンパないんだが
Rubyライブラリインストールするだけでgem何やってのよ
644デフォルトの名無しさん:2010/11/25(木) 14:45:46
それは gem コマンドのバージョンが低すぎる
$ gem --version
1.3.7
Linux とかでディストリビューション固有のパッケージを使うとバージョン 0 台がインストールされたりするが
バグしか入ってないので手動で gem コマンドをバージョンアップしろ
645デフォルトの名無しさん:2010/11/25(木) 14:50:39
あ、もし、gem install rails (またはrailsがくっついてくるライブラリ)をしているなら
gem コマンドはしばらく返ってこないよ
空きメモリが2桁MBとかだとしばらくだんまりだ
646デフォルトの名無しさん:2010/11/25(木) 16:03:00
>>644-645
サンクス
前に同じようなことがあって/usr/localにgem1.3.5を入れたの忘れてた
647デフォルトの名無しさん:2010/11/25(木) 20:40:58
Object#tapのArray版はないでしょうか?

Array#mapでチェーン中にオブジェクトの中身を弄りたいときは、

objs.map{|x| x.hoge = "new hoge"; x }

のようにするしかないでしょうか?
648647:2010/11/25(木) 20:42:24
Array#each{}で行けました

objs.each{|x| x.hoge = "new hoge"}.map{ (以下略

ありがとうございました!!
649デフォルトの名無しさん:2010/11/25(木) 22:14:53
> URI.parse("ttp://hibari.2ch.net/test/read.cgi/tech/1287623173/").scheme.sub!(/^ttp$/, "http")
TypeError: can't modify frozen string

OMG!

> URI.parse("ttp://hibari.2ch.net/test/read.cgi/tech/1287623173/").tap{|uri| uri.scheme = uri.scheme.sub(/^ttp$/, "http")}
=> #<URI::Generic:0x5852028 URL:http://hibari.2ch.net/test/read.cgi/tech/1287623173/>

Good!!

Why??????


650デフォルトの名無しさん:2010/11/25(木) 22:29:28
> TypeError: can't modify frozen string
ということで、String が freeze されている
コンテナとしての URI オブジェクトが freeze されているわけではない
URI オブジェクトの scheme= メソッドが操作する格納オブジェクト(配列など)が freeze されているわけではない

irb> a = [1, 2, 3]
irb> a.freeze
irb> a[0] = 'one'
TypeError: can't modify frozen array

irb> str = 'hoge'
irb> str.freeze
irb> str.sub!(/o/){'a'}
RuntimeError: string frozen
651デフォルトの名無しさん:2010/11/25(木) 22:33:05
クラスから期待されるスキーム(URI::HTTPなら 'http' とか)が返ってこなくなると
不整合が生じるからfreezeしてあるのかな、とも思ったが、代入はできてしまうんだな。
もっとイミュータブルにしてもよい気がする。

652デフォルトの名無しさん:2010/11/25(木) 22:42:55
>>650-651
ありがと
気になったのでURI::Genericの実装見たら
たしかにfreezeされてた
scheme=メソッドでcheck_schemeよんで正しいかチェックしてるせいだと思う。

こういう属性に代入するときのチェックにライブラリの仕様が依存している場合、
破壊的メソッドを使えないようにfreezeするのはわかるんだけどなにかしっくり来ない。
653デフォルトの名無しさん:2010/11/25(木) 22:44:56
あんまり実際的イミのあるfreezeではないとは思う
昔のRubyのライブラリっぽい動作だなあと思った
654デフォルトの名無しさん:2010/11/26(金) 03:20:57
Enumerableに、ある条件を満たすような要素のインデックスを返すメソッドってなかったっけ?

[10, 20, 30, 40].index {|x| x % 3 == 0 } #=> 2
みたいなメソッド。
655デフォルトの名無しさん:2010/11/26(金) 03:30:42
Enumerable#find_indexかな
656デフォルトの名無しさん:2010/11/26(金) 17:39:43
複数の XML を取得して、結合したり整形したりしたいのですが、
どうやって実現するのがおすすめでしょうか?
657デフォルトの名無しさん:2010/11/26(金) 18:05:47
nokogirl
658デフォルトの名無しさん:2010/11/26(金) 19:11:23
DTDはどうすんのさ。
659デフォルトの名無しさん:2010/11/26(金) 19:24:45
おいおい XML Schema とか言い出してくれるなよ
660デフォルトの名無しさん:2010/11/26(金) 22:26:08
>>655
ありがとうございました。でも1.8.7以降なのかな。1.8.6にはないや。残念。
661デフォルトの名無しさん:2010/11/27(土) 01:52:30
>>657
いい事言うなあお前。
みんなが頭じゃわかっててもなかなか実践できない事を口に出して言えるなんざ大変な自信だよ。
それで出来てなかったらあのインチキ占いのバアさんと一緒だぞお前。
そんなに当たり前の事を言いたかったら尼さんにでもなってから説教したらどうだ。
662デフォルトの名無しさん:2010/11/27(土) 02:53:08
人に逢ったら挨拶するとか、当たり前の事が出来ずに会社を辞めていくプログラマが多いな。
663デフォルトの名無しさん:2010/11/27(土) 03:04:59
コミュニケーションが大事といわれるけど、
何気ないあいさつするだけも違うんだよな

お前らもまずこのスレ開いたときと閉じる前にあいさつしていくこと
664デフォルトの名無しさん:2010/11/27(土) 03:11:46
>>663
ひろゆきがそういうの面倒だから2chつくったって言ってたろうが
665デフォルトの名無しさん:2010/11/27(土) 03:24:30
>>661がなんで急に怒り出したのか理解できないんだがw
666デフォルトの名無しさん:2010/11/27(土) 12:02:52
精神疾患またはそれに類するもの程度に理解しておけ
667デフォルトの名無しさん:2010/11/27(土) 15:07:10
誤爆でしょ
668デフォルトの名無しさん:2010/11/27(土) 16:14:52
誤爆でも少しやばいだろ
669デフォルトの名無しさん:2010/11/27(土) 16:19:17
島根県ってRubyを使うこと自体が目的で町おこししてるように感じるんですけど、
その点に関してmatzさん(というかプログラミング言語開発者として)はどう思ってるのか気になるわぁ。
プログラミング言語は手段であって適材適所に使われるべきであって、不適材不適所に使うのはハッカーだけが許される行為だと、そう思うんです。
じゃないとまわりを不幸にしてしまう。
670デフォルトの名無しさん:2010/11/27(土) 16:22:59
単なる地元への利益誘導政策としてrubyが遣われてる麺もあるけどね。
結局東京にしか仕事ないって感じで東京でruby使いを求人しては派遣で顧客企業に送り込んでピンハネしてる感じが。
671デフォルトの名無しさん:2010/11/27(土) 17:23:13
【RoR】Rubyについて Part 41【CPAN vs RubyGems】
http://hibari.2ch.net/test/read.cgi/tech/1281473294/
672デフォルトの名無しさん:2010/11/27(土) 18:54:38
さきほど BlueFeather を知った。
マニュアルとか充実していてチョーうれしい。
作者さん、ありがとう。
673デフォルトの名無しさん:2010/11/28(日) 10:23:46
(irb):69: syntax error, unexpected $undefined, expecting '}'
...me(0000,データ名){}"\n:
^
from (irb):69
from (null):0
$

氏ね
っていうか文法エラーの位置にマルチバイト文字書いただけでirb自体が終了するのなんとかなんないの
674デフォルトの名無しさん:2010/11/28(日) 11:29:40
お前が直せ
675デフォルトの名無しさん:2010/11/28(日) 11:55:15
>>673
再現できるコードきぼん

前にreadlineが正しく入っていないときに日本語入れたら落ちまくっていたが、そういうことではないだろうし
676デフォルトの名無しさん:2010/11/28(日) 13:18:22
irbはあらゆるものが最新じゃないとどっかの何かが影響して落っこちるナイーブなプログラム
プロンプト実行系はたいていそうだが
677デフォルトの名無しさん:2010/11/28(日) 14:53:16
一度落ちた方がすっきりしてすがすがしいじゃんかよ
678デフォルトの名無しさん:2010/11/28(日) 15:55:26
全くだ。
間違った動作でしれっと動き続けられるより
キッチリ落ちてくれる方が100倍マシ。
679デフォルトの七氏:2010/11/28(日) 18:44:02
大学のゼミの授業で以下のプログラムを作らなければならなくなりました。

1、「食べログ」東京の東京都市区町村一覧のページ(http://r.tabelog.com/tokyo/citylst/)にアクセス。
2、区名を指定してそのリンクをクリック
3、表示された20件のページにアクセスし、「店名」、「ジャンル」、「TEL」、「住所」、「評価」、「最寄駅名」、「営業時間」、「定休日」、「平均利用金額」、「用途」の情報を取得する。
4、次のページがあれば次のページに行き、3を行う。
5、csvファイルに出力。
6、ハッキングと間違われないようにランダムアクセスにする。(食べログ運営者にこのようにするようにと指定を受けた。)
*「食べログ」運営者から公開情報の利用許可を頂いております。

3、の個々のページにおいて情報を取得するところまではできました(コード→http://codepad.org/aW2wDA1d)が、

・それをそれぞれのページで情報取得の操作を行うようにする。
・次のページがあれば次のページに行き行う

のやり方がわかりません。

教えて頂けないでしょうか!?

よろしくお願いします。

環境はOS: Windows vista、バージョン:Ruby 1.8.6
680デフォルトの名無しさん:2010/11/28(日) 19:10:42
このへんはあんまアレなのでアレを悪用のナニ詳細にも言えないことになってるんだが
まあ普通は
「このページに○○という文字列(またはリンク)があったら次ページが存在するということなので、
リンクを探してアクセス」
というつくりにすると思う

複数ページは、URLに規則性があるなら手元で作って直接アクセスするかなあ
IEみたいな普通のWebブラウザがサイトに対してどういうHTTPリクエストをしてるか調べてみるといいぞ
681デフォルトの名無しさん:2010/11/28(日) 19:24:34
Chromeとかでリクエスト覗いて、HTMLと睨めっこすればなんとかなるんじゃね
682デフォルトの名無しさん:2010/11/28(日) 19:28:00
>>679
・それをそれぞれのページで情報取得の操作を行うようにする。
・次のページがあれば次のページに行き行う
次のページへ行くのはどうすればいいか?という意味ですか?
「食べログ」の次のページがどのように実装されているかによりますが、通常のサイトなら
次のページへのリンクを見つけて、それを新たにgetすればいいんじゃないでしょうか。

リンクの見つけ方が分からないとか、getを繰り返す処理の書き方が分からないとか、
もう少し具体的に質問したほうがいいと思いますよ。
683デフォルトの名無しさん:2010/11/28(日) 19:43:26
>>679
今ってこんな課題出るのか。
大学のサイトならともかく、一般のサイトにアクセスさせるって…
下手なスクリプト組んで迷惑かけるようなことにならなきゃいいけど。
684デフォルトの七氏:2010/11/28(日) 19:54:58
皆さん、

早いレスありがとうございます。そして、舌足らずですみません。

htmlはFirefoxのFirebugで見ています。

具体的な内容を述べさせていただきます。
方法としてはこのページ(http://r.tabelog.com/tokyo/C13101/)の<span class=rank rank1>の<a>の中のhrefの後に表記されているアドレス取得して、
そのページに飛んで今で着ている処理を行えばいいのであろうと思うのですが、

・hrefの後のアドレス抜き出しの処理
・抜き出したページに行き、取得のプログラムを回す
・これをrank1〜20について繰り返す。

という処理のruby上での記述の仕方がわかりません。

初学者ゆえ、当たり前のことをお聞きしているかもしれませんがひとつよろしくお願いします。


685デフォルトの名無しさん:2010/11/28(日) 19:58:38
なんか怪しいなあ
そんなことを食べログが許可するとは思えないんだが

まあとりあえずRubyの基本ライブラリ群に関する知識がないのはわかった
ひょっとして全部コピペで作ってないか
686デフォルトの名無しさん:2010/11/28(日) 20:17:20
そんな課題出す大学のゼミがあるのか
というかゼミの課題丸投げとかありえないだろう
687デフォルトの名無しさん:2010/11/28(日) 20:23:25
ていうかめっちゃ駆使したスクリプトができたんだが、課題ならアウトだよなやっぱ
どうせ初級の課題なんだろうし、習ったもので習ったように作らないとだめだろ
688デフォルトの名無しさん:2010/11/28(日) 20:44:48
ランダムアクセスとか何をランダムにするんだよ
689デフォルトの七氏:2010/11/28(日) 20:45:48
>685さん
運営者に問い合わせフォームから問い合わせたところ、
「口コミ」や「画像」は著作権が発生するために利用できないとのことでしたが、
上記の項目については許可を頂いています。

コピペというかgoogleで検索して使用できそうなものをつぎはぎで使用しています。

>686さん
すみません。下記の通り、語弊がありました。

課題というより、興味のあることを発表したら、
次のゼミまでにそこら辺までやってきてねっという感じで。。。

おっしゃる通りです。私の力不足が明らかです。

申し訳ありません。少しでもご教示いただければ幸いです。


>687さん
すみません。すこし最初の説明の段階で語弊がありました。
私がゼミの授業と書いているのは、一般で言うゼミ会議みたいなものです。
私の大学ではそれが単位として取り扱われているので授業と書いてしましました。
すみません。

習ったというより、ゼミで上記のようなプログラムをRubyで作ってみて。。
っといった感じで丸投げされまして。
Rubyをやったことがなかったので必死でネットなどを見ながら勉強してみたのですが、
旨く行かず、皆様を頼った次第です。

よければコードを見せて頂けないでしょうか!?
690デフォルトの名無しさん:2010/11/28(日) 20:49:47
これがゆとりか・・・
691デフォルトの七氏:2010/11/28(日) 20:50:24
>688さん
5〜7秒ごとくらいでプロセスを停止して行ってくれとのことでした。

それをもとに色々、検索してみたところ、
「ランダムアクセス」という言葉になってしまいました。

言葉足らずでした。申し訳ありません。
692デフォルトの名無しさん:2010/11/28(日) 21:39:18
ランダムアクセスってのは、アクセスしたい対象に
その先頭から順番にアクセスするだけでなく
いきなり任意の場所からアクセス可能なことを言う
693デフォルトの名無しさん:2010/11/28(日) 22:27:20
大学のゼミでそんなことしないよね普通
694デフォルトの名無しさん:2010/11/28(日) 22:29:23
ていうか「Ruby 食べログ」あたりで検索すれば普通に
http://hibari.2ch.net/test/read.cgi/php/1290432735/
http://oshiete.goo.ne.jp/qa/6349817.html
このへんが出るだろ
695デフォルトの名無しさん:2010/11/28(日) 22:33:37
インターネットは怖いところだぬ…
696デフォルトの名無しさん:2010/11/28(日) 22:35:04
これはひどい
697デフォルトの名無しさん:2010/11/28(日) 22:44:45
というかそもそもとしてRubyの知識が足りない気がする
変な言い方だが、ここまで自力で書けるならここで詰まるとかありえんのだ
もうちょい先で詰まるはず、というか詰まって欲しい

Rubyそのものの勉強からしていったほうが結局は早い
もしRubyそのものに興味がないのならRuby使わないほうがたぶん手っ取り早い
698デフォルトの名無しさん:2010/11/28(日) 23:57:09
>>697
私もそう思う。
晒しているコードをコピペにせよ理解しながら作ったのなら
その知識で十分出来ると思う。
699デフォルトの名無しさん:2010/11/29(月) 01:04:58
そんな課題を出す方もあれだがこんなところで質問するのもどうかと思うよ
スクレイピングにたいして双方共にモラルが欠けてる
スクレイピングで不起訴になったとは言え逮捕されちゃった例もあるんだぞ
ruby初心者に課題を出すならローカルで完結するのにすればいいのに
700デフォルトの名無しさん:2010/11/29(月) 03:21:55
>>694
ちょww 高校生なのか大学生なのかはっきりしろw

http://hibari.2ch.net/test/read.cgi/php/1290432735/
1 名前:hirofis[[email protected]] 投稿日:2010/11/22(月) 22:32:15 ID:???
RubyのmechanizeやHpricotを使って「食べログ 東京」内の「東京都の路線・駅から探す」へいき、23区内のすべての飲食店の「店名」「ジャンル」「住所」「電話番号」「星の点数」「営業時間」「平均予算」「席数」「用途
」を取ってきてcsvファイルとして保存するっていうプログラムを創っているのですが、うまくいきません。。

高校生ですが、将来programerに成りたくRubyの勉強を始め、精進しております。
何としてもこの問題を解きたいです。

2chの皆様、ご指導ご鞭撻のほどよろしくお願いします。

rubyでのweb スクレイピングプログラム - Ruby - 教えて!goo
http://oshiete.goo.ne.jp/qa/6349817.html

大学のゼミの授業で以下のプログラムを作らなければならなくなりました。
1、「食べログ」東京の東京都市区町村一覧のページ(http://r.tabelog.com/tokyo/citylst/)にアクセス。
2、区名を指定してそのリンクをクリック
3、表示された20件のページそれぞれにアクセスし、個々のページの「店名」、「ジャンル」、「TEL」、「住所」、「評価」、「最寄駅名」、「営業時間」、「定休日」、「平均利用金額」、「用途」の情報を取得する。
4、次のページがあれば次のページに行き、3を行う。
5、csvファイルに出力。
6、ハッキングと間違われないようにランダムアクセスにする。(食べログ運営者にこのようにするようにと指定を受けた。)
*「食べログ」運営者から公開情報の利用許可を頂いております。

個々のページにおいて情報を取得するところまではできました(コード→http://codepad.org/aW2wDA1d)が、
・それをそれぞれのページで情報取得の操作を行うようにする。
・次のページがあれば次のページに行き行う
のやり方がわかりません。
教えて頂けないでしょうか!?
よろしくお願いします。
環境はOS: Windows vista、バージョン:Ruby 1.8.6
701デフォルトの名無しさん:2010/11/29(月) 03:25:59
Rubyの宿題教えてください。2限目
http://hibari.2ch.net/test/read.cgi/tech/1200175247/901-904

マルチポストは感心しないという人によってスレが荒れるから、マルチポストは感心しないな
702デフォルトの名無しさん:2010/11/29(月) 07:55:20
>>657 は結局どういう結論??
703デフォルトの名無しさん:2010/11/29(月) 07:56:44
間違えた>>656
704656:2010/11/29(月) 09:42:35
>>656 です。
自分が質問したあと、ちょっともめ事?みたいになってて、
書きこむタイミングを見失ってました。放置したみたいになってすみません。
真剣に困っているのでどなたかアドバイスをいただけたらありがたいです。
705デフォルトの名無しさん:2010/11/29(月) 09:51:04
>>704
>>657 がアドバイスくれてるじゃないか
(標準添付の REXMLでやってもいいけど)
706デフォルトの名無しさん:2010/11/29(月) 09:58:04
>>705
そのあとなんか揉めてあるみたいだったので、Nokogiri について調べつつも、
もしかすると間違ったアドバイスなのかも…と半信半疑の状態で不安に思ってました。
ありがとうございます。がんばって調べてみます。
707デフォルトの名無しさん:2010/11/29(月) 09:59:48
> 1、「食べログ」東京の東京都市区町村一覧のページ(http://r.tabelog.com/tokyo/citylst/)にアクセス。
> 2、区名を指定してそのリンクをクリック
> 3、表示された20件のページにアクセスし、「店名」、「ジャンル」、「TEL」、「住所」、「評価」、「最寄駅名」、「営業時間」、「定休日」、「平均利用金額」、「用途」の情報を取得する。
> 4、次のページがあれば次のページに行き、3を行う。
> 5、csvファイルに出力。
> 6、ハッキングと間違われないようにランダムアクセスにする。(食べログ運営者にこのようにするようにと指定を受けた。)
> *「食べログ」運営者から公開情報の利用許可を頂いております。

なんというクソ仕様。
俺が今やってる仕事より要件がハッキリしているとかw
708デフォルトの名無しさん:2010/11/29(月) 14:52:08
みな、、

もうちょっと寛大にみてやろう。

ここは初心者スレッドということだし、嫌味をゆうのは違う気がするな。

スレッドの最初にある通り、根気よく育てるつもりでいこう。
709デフォルトの名無しさん:2010/11/29(月) 15:02:57
こういう質問は見るからに怪しいし、まじめなものだったとしても
あちこち怪しげなことをしなければ勉強にならないWEB技術は勉強しづらいもんだな
710デフォルトの名無しさん:2010/11/29(月) 15:07:58
>>697でそもそもFA
小型トラックの運転したことなさそうな人から
「一般家庭へ小包届ける宅配便配送運転手の心得教えてください」とか言われても
「まず住宅街で普通に手足のように運転できるようになってから聞け」としか言えん
711デフォルトの名無しさん:2010/11/29(月) 15:37:04
RubyでAjax開発をしようとしているのですが、
外部サーバーからXMLを受け取ってページの一部分だけを更新…
というのを実現するにはどうしたらよいでしょうか?
712デフォルトの名無しさん:2010/11/29(月) 15:40:28
webprog板池
っていうかAJAXの本なんか買え
713デフォルトの名無しさん:2010/11/29(月) 15:41:52
>>709
手元にサーバ立てて勉強するのが本来デフォだったはずなんだけどね
HTTPとHTMLと若干のTCP/IP、サーバサイド技術についてを広く浅く学んだ上でやるものだったはずなんだが

まあ見かけ「だけ」簡単にしすぎるのも問題なのよね
その裏には重い技術やウンコみたいな泥テクニックやうんざりするコストが山積してるということすら隠してしまう
あなたがニコニコ動画から100MBのなんでもない動画を手元にダウンロードするまでに
誰かがどっかに払ってる金額は合計で30円くらいなんじゃないかなあ
714デフォルトの名無しさん:2010/11/29(月) 15:46:37
>>711
ページ内のJavaScriptに
「JavaScriptで表示させてたこの部分のHTMLをサーバと通信した結果を元にして書き換えて表示させる」
ということをさせる
つまり>>712
ブラウザから何か小さい通信を受け取って何か小さいデータを返す、という
サーバサイド部分にはRubyが入る余地がないわけではないが、
結局全体のうち95%はJavaScriptでがりんがりんコード書かなければならないことだろう
715デフォルトの名無しさん:2010/11/29(月) 15:48:53
>>713
動画ダウンロードするだけで内需拡大に貢献できるんだね素敵!
バックボーン回線代としては海外に払ってるほうが大きいのかしら
716デフォルトの名無しさん:2010/11/29(月) 15:54:02
>>712 >>714
なるほど、やっぱりそうなんですね。
ありがとうございます、仰る通りにやることにします。
717デフォルトの名無しさん:2010/11/29(月) 16:32:55
スクレイピング乞食腹立つな

言葉遣いは丁寧だが「何か揉めているようなので」とか他人事みたいな態度が意味不明だし、
設定も高校生になってたり大学生になってたり嘘ばかり

つまりどっかの馬鹿が学生のふりして教えてもらおうっていう糞みたいな魂胆
だいたい食べログがスクレイピングしてweb上にデータを表示することを会社として正式に許可するわけがない
ほんとカスだな質問者は
718デフォルトの名無しさん:2010/11/29(月) 16:36:14
どうせ食べログ情報取ってきてadsense張り付けて小銭を稼ごうっていうスケールの小さい屑
しかも学生の宿題を装って人の善意を利用しようとして簡単に嘘が露呈する馬鹿
クズ中のクズだし日本に存在する価値が全くないカス
ここまで頭の悪い人間が日本に存在することに驚きを禁じ得ない
King of kasu
Best of kasu
719デフォルトの名無しさん:2010/11/29(月) 16:41:40
http://oshiete.goo.ne.jp/qa/6349817.html
これも焦って削除してるw
馬鹿ってだけなら生暖かい目で見守られるかもしれんが卑怯で小賢しくて嘘ばっかついてるとそのうちリアルでも誰からも相手されなくなるぞ
720デフォルトの名無しさん:2010/11/29(月) 17:10:16
ここはレベルの高い初心者スレですね。
721デフォルトの名無しさん:2010/11/29(月) 17:31:49
>>714
そこでJSRubyですよ
722デフォルトの名無しさん:2010/11/29(月) 18:38:52
何度もゆうが気長に面倒をみてあげようよ。

初心者のスレだしさ。

指摘まではいいけど嫌味ゆうのはやっぱ違うって。。

他の初心者の人たちも使いにくくなるよ。
723デフォルトの名無しさん:2010/11/29(月) 18:45:42
俺もスクレイピング系の質問は不利だと思う。

まじめな質問であったとしても(今回の質問がどうかはわからないけど)、
こんな風に周りが深読みするから。

ちょっと質問者に同情するな。俺は。
724デフォルトの名無しさん:2010/11/29(月) 18:57:19
深読みって、マルチポストは置いとくとしても、
そこに書いてある内容が高校生だったり大学生だったりなんだぞ。
普通に信用できないなと思うに決まってるだろ。本人じゃないだろうな。
725デフォルトの名無しさん:2010/11/29(月) 19:13:00
サイトのデータだけスクリプトで抜き取って
csvに落とすなんて、泥棒と同じじゃないか。
ブラウザで見るように作られているサイトは
ブラウザからアクセスしろ。それがマナーだろ。
726デフォルトの名無しさん:2010/11/29(月) 19:14:20
>>725
Googleは泥棒かよ。馬鹿は黙ってろ。
727デフォルトの名無しさん:2010/11/29(月) 19:21:31
RailsスレにCSVファイルからDBにデータをインポートする方法の質問がきてるから、
プログラムは着々とできてるようだな。最後はRailsでスキャフォールド作って表示か?
728デフォルトの名無しさん:2010/11/29(月) 19:43:24
>>725
そういう汚れ仕事4ヶ月ぐらいやらされてたことあるけど虚しかったわ。
Googleにデータ抜かれるのは抜かれる側に大きなメリットがあるが、
俺のやってたのはデメリットしかなかった。ただのDOS攻撃を兼ねた泥棒。
MechanizeやらHpricotに異常に詳しくなったがもう二度とやりたくね
729デフォルトの名無しさん:2010/11/29(月) 20:15:06
>>728
まーね
今は「わるいひと」が使っている割合のほうがトラフィック的に多いと思う
だから解説やら説明やらは本来ないほうがいいんだが…
730デフォルトの名無しさん:2010/11/29(月) 20:25:09
libwww-perlはすっかり悪者になってしまいました
mechanizeも早晩弾かれることでしょう
731デフォルトの名無しさん:2010/11/29(月) 20:35:43
>>729
やっぱりそうだよね
解説や説明やめよっか? すこしはネットが礼儀正しくなるかな?
732デフォルトの名無しさん:2010/11/29(月) 20:54:54
NokogiriはふつうにXMLパーサの面があるが、Mechanizeは基本暗黒ぎじゅちゅだと思う
ユーザーが「ふつう」のWebブラウザ以外でアクセスすることを喜ぶ管理者はまずいないだろう
733デフォルトの名無しさん:2010/11/29(月) 21:10:27
>>731
マナーも含めてしっかり解説啓蒙するのはいいんじゃないの?
悪意ないのに無知ゆえに中途半端に迷惑な使い方する奴は減らせるなら減らした方が。
どうせ最初から悪意を持って使う奴は解説しようがしまいが関係なく悪用するんだろうし。
734デフォルトの名無しさん:2010/11/30(火) 01:12:58
>>722,723
おい、こいつの目欄に気付いてるか?あーアンカー付けるのすら汚らわしいわ
735デフォルトの名無しさん:2010/11/30(火) 01:28:06
ここの住民はそういうのに冷たいというかスルースキル持ってるので
今まで縦読みを何度スルーされたか
736デフォルトの名無しさん:2010/11/30(火) 02:22:38
久々にクズをみた
心からシネと思った
737デフォルトの名無しさん:2010/11/30(火) 02:34:10
GC.start
738デフォルトの名無しさん:2010/11/30(火) 09:48:35
メール欄はもともと表示されてるからな
煽っても騙ってもなにしてもいいと思ってる奴が常駐してるので、そこは判断材料にならん
739デフォルトの名無しさん:2010/11/30(火) 11:12:29
>>717
スクレイピングの人と「何か揉めてるようなので」の人は別人。ソースは私です。
自分の質問(>>656)に「Nokogiri」と返ってきたあと、
DTD がどうとか XML Schema がどうとか強めの口調でツッコミが入ってるっぽかったけど、
自分が低レベルすぎて内容がわからなかったので、実際に揉めているのかどうかすら
判別が出来なかったため「ようなので」と曖昧な表現をしました。
740739:2010/11/30(火) 11:14:08
蛇足でしたら申しわけありません。スルーしちゃってください。
741デフォルトの名無しさん:2010/11/30(火) 11:55:28
インスタンスメソッドをオーバーライドした時に、
本来の(オーバーライドする前の)処理を行うにはどうすれば良いでしょうか?
サブクラスの super みたいなことをオーバーライドで行いたいです。

class Array
 def pop
742741:2010/11/30(火) 11:58:01
すいません。途中で送信してしまいました。
class Array
 def pop
  hogehoge # 何かする
  # ここでpop
 end
end
みたいな感じです。
743デフォルトの名無しさん:2010/11/30(火) 12:01:16
class Array
alias pop_orig pop
def pop(*args)
puts "popしまーす"
pop_orig(*args)
end
end

[1,2,3].pop

alias でオリジナルを保存して、書き換えた新メソッド内で呼ぶのが一般的
これ以外の記法をされても「いわゆるメソッドのsuper」だと思えず頭が追いつかん
744741:2010/11/30(火) 12:30:12
>>743さん
期待通りに動作しました。ありがとうございました。
745デフォルトの名無しさん:2010/11/30(火) 13:03:39
>>731
アホか

ぐぐって1秒以内に答えが返ってくるために、裏では個人では到底整えられないような設備があったり
人類の英知を積み上げたようなアルゴリズムや優秀な技術者が実装したコードが
もし仮にあろうとも、そんなのいちいち意識してられるかよ


適当につくってそれで動くんならOKだろうが
わざわざ難しく考える奴が多すぎ
746デフォルトの名無しさん:2010/11/30(火) 13:04:27
うわ恥ずかしい・・・
アンカー間違えた
>>713宛ね
747デフォルトの名無しさん:2010/11/30(火) 13:05:37
>>745
意味が解からん。
748デフォルトの名無しさん:2010/11/30(火) 13:06:18
あっ…
749745:2010/11/30(火) 13:13:08
過去ログよんでなかったし蒸し返す必要なかった反省している
750デフォルトの名無しさん:2010/11/30(火) 18:04:00
どんまい
751デフォルトの名無しさん:2010/11/30(火) 19:33:59
次からは気をつけろよ
752デフォルトの名無しさん:2010/11/30(火) 21:10:18
またかよ、カス
753デフォルトの名無しさん:2010/11/30(火) 22:09:43
>>743
これ実行するとputsが16回くらい実行されるけどなんで?
754デフォルトの名無しさん:2010/11/30(火) 22:18:27
>>753
そりゃ内部のどっかでArray#popが16回くらい実行されてるからだろ
755デフォルトの名無しさん:2010/11/30(火) 22:23:56
irb> a.size
popしまーす
popしまーす
popしまーす
popしまーす
popしまーす
=> 3
ということで、Array#size するだけで 6回も呼ばれてるな
宇宙の神秘だね
756デフォルトの名無しさん:2010/12/01(水) 01:53:28
irbがpop使っててもなんの不思議もないわな
757デフォルトの名無しさん:2010/12/01(水) 16:30:36
>>741-743
active_supportのalias_method_chainみたいなパターンだな
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/aliasing.rb

こんなgemもあるが
http://rubygems.org/gems/chainable


こういうメソッド拡張するのをなんていうんだメタプログラミングじゃなくてもっと具体的に、
えっっぇえっとメソッドなんとか


758デフォルトの名無しさん:2010/12/01(水) 16:37:21
物は相談なのだけど、どうも基本的なクラスを拡張することに抵抗感がある。
目的は読みやすくしたいというくらいなので自分だけのコードなら気にしなければいいし、いつも迷ってあげく拡張しない事が多いんだ

例えば、
require 'yaml' したら、Object#to_yamlが使えるようになるよね。
でもつい、自分で似たような処理をするときに、

 YAML.convert_to_yaml(obj)

のようなモジュールやライブラリの作りをしてしまう。

俺の感覚だと標準ライブラリやactive_supportや他人のライブラリでそういうことをやっているのは対して気にならないんだが、
自分が作るときにイマイチ基準がわからなくて躊躇する。

こういう拡張を部分的に適用する方法、もしくはある文脈でだけ module を includeする(もしくはextend)するような方法があれば
思い切って使えるんだけど、いい方法ない?



759デフォルトの名無しさん:2010/12/01(水) 17:52:25
760デフォルトの名無しさん:2010/12/01(水) 18:40:54
761デフォルトの名無しさん:2010/12/01(水) 20:13:11
sortばっかり使っててsort_byに気がついた新参ですが、
こんな風にこのメソッドを使うときは気をつけるとかありますか?
大量のデータを解析しようと思ったので、なるべくオーダーが発散しないように心がけたいのですが。
条件式の順序とか、オブジェクトの初期化などは考えていますが。
再利用する回数は少ないので、高速化をするために、コードかく時間が増えるのも問題ですが。
762デフォルトの名無しさん:2010/12/01(水) 20:23:57
sort_by のほうがメモリ食いだったはず
気になるなら最初は全部 sort で実装すればいい
763761:2010/12/01(水) 21:53:58
>>762
大量にソートする時にメモリは確かにきになりますね。
まだ、実データをソートさせていないので、実際に解析するまではsortでいってみます。
あと、sort,sort_byとは別にここ、ボトルネックになりそうなものはありますか?
正規表現で|は使わなくてすむならそうするなど…。tipsみたいなものでよいのですが…
764デフォルトの名無しさん:2010/12/01(水) 21:58:08
>>763
大量データの一括処理にRubyは向かないよ。
パフォーマンスのよくない言語だから。
なんでRubyを使おうと思ったの?
765デフォルトの名無しさん:2010/12/02(木) 00:49:40
思い悩むよりも、さっさと作って動かしてみるのが一番早い
一にも二にもプロファイル
766デフォルトの名無しさん:2010/12/02(木) 07:21:09
ま、実行速度と開発効率のバランスを考えればJavaで書いたほうが無難よ。
767デフォルトの名無しさん:2010/12/02(木) 12:06:02
何をもって大量データや大量処理と呼ぶのかというのはその人によって違うからな
処理時間1分なら問題ないという人も、遅すぎるという人も、そんなの大量処理じゃないという人もいる
768デフォルトの名無しさん:2010/12/02(木) 15:00:10
ちょっと地球シミュレートするプログラムを作った
実行してから2週間たったが初期化が終わらない
Ctrl+Cすべきかどうか悩む
769デフォルトの名無しさん:2010/12/02(木) 18:38:33
>>760
1時間もある・・・お手数ですがどのあたりを見ればよいか教えてもらえないでしょうか?
770デフォルトの名無しさん:2010/12/02(木) 19:05:18
刮目せよ
771デフォルトの名無しさん:2010/12/02(木) 19:08:20
>>760
オープンクラスっていうみたいだね。

部分的に拡張を適用する話は動画では少ないけど
>>758に関連するところはclassboxに関してかな
772デフォルトの名無しさん:2010/12/02(木) 19:15:31
こっちのが微妙に新しいかも
ttp://www.slideshare.net/yukihiro_matz/rubyconf-2010-keynote-by-matz
48-53枚目
773デフォルトの名無しさん:2010/12/02(木) 22:03:01
>>760>>772 を一通り眺めたのですが >>758 が気にしているような
global monkey patching の問題点は ruby 2.0 で導入されるかもしれない classbox (仮称)が
http://d.hatena.ne.jp/sumim/20100903/p1
こんなかんじで解決してくれるであろう、というかんじなんでしょうか。

つまり現時点では local monkey patching (?)みたいなことはできない?
774デフォルトの名無しさん:2010/12/02(木) 22:08:11
>>773
うん、できない。
問題点であるという認識は存在していて、まさに現在進行形で改修案が俎上に上っている、というレベルだな。
それと、なんでか分からんけど、ruby-devよりもruby-coreのほうが熱心に議論されてる感じ。
775デフォルトの名無しさん:2010/12/02(木) 22:59:29
>>761 ruby-profでも使って変なとこ探し時名
776デフォルトの名無しさん:2010/12/02(木) 23:23:10
>>760
面白かった

動画内でMatzが置いてきぼりにならないか危惧していたけど、
Rubyのスレでもたまにでる話題や不満点が解消する方向というか内容が2.0で盛り込まれるようで期待
777デフォルトの名無しさん:2010/12/03(金) 00:24:36
>>772
文字起こしたのあった
これだよね

RubyConf2010 -Matz基調講演編- - Everyleaf Lab
http://blog.everyleaf.com/rubyconf2010-matz
778デフォルトの名無しさん:2010/12/03(金) 00:42:56
プレゼンを文字に起こされると恥ずかしい(///)
779デフォルトの名無しさん:2010/12/03(金) 00:51:13
>>760 >>772
これだな
refineだな
Ruby 1.9 - Feature #4085: Refinements and nested methods - Ruby Issue Tracking System
http://redmine.ruby-lang.org/issues/show/4085
780デフォルトの名無しさん:2010/12/03(金) 02:20:42
Ruby1.9ってこれからどれくらいパフォーマンスがあがる余地があんの?
Javaくらいにはなれるの?
781デフォルトの名無しさん:2010/12/03(金) 05:51:29
>>780
Java馬鹿にすんな
782デフォルトの名無しさん:2010/12/03(金) 07:48:45
エディタの色分けに使いたいんだけど
rubyのフォルダ以下にあるソースコードのクラス名やメソッド名等々の
識別子一覧を取得する方法ないですか。
783デフォルトの名無しさん:2010/12/03(金) 09:42:51
riのデータベースに何か入ってませんかね
784デフォルトの名無しさん:2010/12/03(金) 15:37:33
自作ライブラリってどこに置いてます?
785デフォルトの名無しさん:2010/12/03(金) 15:46:47
~/lib/ruby
786デフォルトの名無しさん:2010/12/03(金) 15:51:57
>>784
じぶんのぱそこんのなかにはいってまふ

RUBYLIB に設定するしかないと思う
こまいのは RUBYLIB を $HOME/usr/local/lib/ruby/ にして、
$HOME/usr/local/lib/ruby/my/ の下にどっさり入れてる
require 'my/hoge' とか使う
"my/" という接頭詞で普通のライブラリと区別

ある程度大きいのはgemパッケージにしてローカルにインストールしてる
履歴管理とかめんどい
787784:2010/12/03(金) 17:03:37
参考にさせていただきます
ありがとう
788デフォルトの名無しさん:2010/12/03(金) 17:07:24
>>781
wwww

>>780
数値計算の多い処理ならRuby1.9が速いみたい
ただ、1.8でもバージョンによって違うみたいだし、RubyGemsの有無でも違ってくる

UNIXならrvm、Windowsならpikで簡単に複数のRubyがインストールできて
1つのスクリプトを楽に複数のバージョンのRubyで走らせられるので
自分の必要な範囲での比較はしやすいから試してみたらよいと思う
789デフォルトの名無しさん:2010/12/03(金) 17:11:53
> pik
Windowsでrvmって何か問題あるんだっけ…って、そういやbashべったりだったなrvm
790デフォルトの名無しさん:2010/12/03(金) 17:11:55
質問に答えてないな

>>780
> Javaくらいにはなれるの?
1.8がすでにJavaほどにパフォーマンスがあると思っているなら1.9もJava並と言えると思う
が、そうでないと思っているなら>>780にとってはJavaほどのパフォーマンスはないと思えると思う


そのパフォーマンスは人によっては気にならないものであったり、
その他に上回る利点があるからRubyを使うが(実行速度の)パフォーマンスが第一優先ならJavaでいいんじゃないのか

延々と言われていることだがw
791デフォルトの名無しさん:2010/12/03(金) 17:16:42
>>780
Cygwinならいけるかも

pikはcmd.exeとmingwのbashが考慮されてる
それとpikはWindowsらしくバイナリでスコッと入るw

前に試したときはcygwinが考慮されていなかったので使いにくかったw
mingwで動く方法だとそのままではCygwinでは動かん

どっちにせよ、mswin32やmingw32のRubyだとCygwin環境からは使いにくいものだけど
792デフォルトの名無しさん:2010/12/03(金) 17:21:00
>>780
>>791ミスった・・・

vertiginous's pik at master - GitHub
https://github.com/vertiginous/pik

> Pik is a tool to manage multiple versions of ruby on Windows.
> It can be used from the Windows command line (cmd.exe),
> Windows PowerShell, or Git Bash. I have yet to test on cygwin.

なので

x pikはcmd.exeとmingwのbashが考慮されてる
o pikはcmd.exeとmsysのbashとPowerShellが考慮されてる

x mingwで動く方法だとそのままではCygwinでは動かん
o msysで動く方法だとそのままではCygwinでは動かん
793デフォルトの名無しさん:2010/12/03(金) 17:26:24
パフォーマンスって思ってるとか思ってないで変わっちゃうものなのか・・・
794デフォルトの名無しさん:2010/12/03(金) 17:39:58
パフォーマンスは心で感じろ!
795デフォルトの名無しさん:2010/12/03(金) 17:40:07
>>793
そりゃそうだろ
絶対的な定量的パフォーマンス値というものがあるなら今すぐ論文にまとめて発表しろ
世界中でニュースになるぞ
796デフォルトの名無しさん:2010/12/03(金) 17:49:59
>>795
おまえ「相対的=計測できない」とか思ってない?
そもそもお前の言う定量的パフォーマンス値ってなに?
797デフォルトの名無しさん:2010/12/03(金) 17:56:21
おいおい、定量的パフォーマンス値をバカにするのか?
798デフォルトの名無しさん:2010/12/03(金) 18:06:00
ていうか「ない」からそういうもんがあるなら言えという話なのでは
使う人や測る人にとって許されればそれがパフォーマンスとして正当だって程度だし
799デフォルトの名無しさん:2010/12/03(金) 18:52:48
つまりRubyは将来的にもJava並に速くなることはないってことですかね。
生産性もJavaと大して変わらないし、保守性に居たってはむしろ悪い部類ですよね。
はー、Rubyのメリットが解かりません。
「好き嫌い」でしか語れない言語ですか?
800デフォルトの名無しさん:2010/12/03(金) 18:54:27
頭の悪い煽りはLLバトロワスレでやろうねボクw
801デフォルトの名無しさん:2010/12/03(金) 19:00:53
・柔軟性は高い
・生産性は普通
・保守性は悪い

これは事実だと思うよ。
802デフォルトの名無しさん:2010/12/03(金) 19:14:55
Rubyの保守性が悪いなんて初耳なんだが
誰がそんなこと言ってんの?
803デフォルトの名無しさん:2010/12/03(金) 19:15:45
Rubyでクラス名その物を表示するにはどうすればいいですか
class Hogeがあったときに"Hoge"が欲しいのですが
804デフォルトの名無しさん:2010/12/03(金) 19:30:48
言語としての基本的保守性能は別に低くない
アホみたいに作ることが可能なのと、市場として見た場合にプログラマがJavaより少ないという話か

>>803
Class オブジェクトを to_s すると文字列で得られる
irb> String.to_s
=> "Strng"
定義されてるクラス名一覧が欲しいなら、その文脈で self.class.constants して定数一覧を得、
それから Class オブジェクトであるものを抜き出す
irb> self.class.constants.delete_if{|c| !self.class.const_get(c).kind_of?(Class)}
=> ["ThreadError", "RubyLex", "Numeric", "String", "Bignum", "Proc",
"IndexError", "SecurityError", "Time", "MatchData", "Exception", "Method",...
あらかじめクラス名がわかってるならもちっと楽
irb> p self.class.constants.include?("Hoge")
false
irb> class Hoge; end
irb> p self.class.constants.include?("Hoge")
true
Hoge という定数があった場合も true になるので本当はもっとチェックが要る
805デフォルトの名無しさん:2010/12/03(金) 19:39:48
ruby-talkに変な奴が降臨している…

Subject: DRM Principle - Don't Repeat Microsoft
806803:2010/12/03(金) 20:11:34
 hoge = Hoge.new
 puts hog.to_s
は、#<Hoge:0x7f384f1e1340>と表示されますよね?
そうではなく単なる文字列の"Hoge"が欲しいのです。
807デフォルトの名無しさん:2010/12/03(金) 20:13:32
>>806
class オブジェクトを to_s すればいい
つまり
hoge = Hoge.new
p hoge.class
808803:2010/12/03(金) 20:15:46
すいませんこれで出来ました。
 hoge = Hoge.new
 puts hoge.class.to_s
有難うございました。
809デフォルトの名無しさん:2010/12/03(金) 21:11:06
普通 Class#name 使うだろ
810デフォルトの名無しさん:2010/12/04(土) 00:18:09
Rubyでサーバプログラムを組んでみたいと思っておるのじゃが
epollとか使うにはどうすればいいんですかのぅ?
811デフォルトの名無しさん:2010/12/04(土) 00:58:21
最近 1.8から1.9に移行したけど、意外と大丈夫だね。
812デフォルトの名無しさん:2010/12/04(土) 01:05:51
>>810
eventmachine gemかな。環境に応じてselect(2)やepoll(4)を使ってくれる。

ioctlにシステムコール番号を直接指定しても出来そうな気がするけど、きっとめんどい。

813810:2010/12/04(土) 22:32:35
>>812
かたじけない。
814デフォルトの名無しさん:2010/12/05(日) 15:04:29
gemってインストールしなくても使える?

main.rb
gems/hoge.gem
gems/fuga.gem
gems/bazz.gem

みたいにmain.rbから各gemを使いたいんだけど…
815デフォルトの名無しさん:2010/12/05(日) 15:13:38
>>814
出来ない。

$LOAD_PATHの要素をvirtual化してファイルパス以外が入れられるようにする提案が実装され
たらgemのままとか、URL指定でも使えるようになるかもしれないけど、今は$LOAD_PATHにイ
ンストールしたgemのlib(等)をドカドカ追加して行くだけの仕様。
816デフォルトの名無しさん:2010/12/05(日) 15:47:27
>>814
絶対パスで require すればそのファイルだけは緊急避難的に使える
ただ、そのファイル内で require してる他の gem や
そのファイルが require してる他の「そのファイルのあるディレクトリ内のファイル」は動作しない」のでそこでエラーになる

「require 'rubygems' しなくても絶対パスで指定するだけで使えます」というように
作者が慎重に作ったものでない限り、普通は無理
817デフォルトの名無しさん:2010/12/05(日) 17:30:32
やっぱりgemをほぐすしかないのかぁ。d。
818デフォルトの名無しさん:2010/12/05(日) 17:49:24
bundler 使えば?
819デフォルトの名無しさん:2010/12/05(日) 18:13:39
いろいろやってどれもしっくりこなくて
試しにRubyやってみたら本当に楽しいじゃないか
短いコードでいろいろできるし、VSのIDEの重さからも開放された
丁寧な解説サイトがあるのも初心者にうれしい
小物ツールが作りたいならこれでいいですよね?
820デフォルトの名無しさん:2010/12/05(日) 19:14:26
既にプログラム作れる人が自分用の便利スクリプト(テキスト処理やネット関連)を作るなら
Rubyがイチオシだと思う

それ以外のことはたいして得意ではないので他の言語使ってくれ
ゲームとかウィンドウアプリとか業務用プログラムとか
821デフォルトの名無しさん:2010/12/05(日) 21:45:06
>>814
あるスクリプトでだけ特定のgem使うならbundlerがよさそう
大げさだけどrvmもgem環境を閉じ込める方法あったはず
822デフォルトの名無しさん:2010/12/05(日) 21:48:21
質問させてください。

環境変数PATH上にあるコマンドを調べることってできないものでしょうか?
やりたいことは、systemで実行するコマンドがあるかないかで処理を変えたいのです。
例えば、zipコマンドがあるならzipを使って、それ以外なら別のコマンドを使うといったようなことです。
823デフォルトの名無しさん:2010/12/05(日) 22:46:46
which
824デフォルトの名無しさん:2010/12/06(月) 01:31:57
Rubyレベルで地道にやりたければ
ENV['PATH'].split(':').find { |e| FileTest.executable?("#{e}/zip") }
とか。
825デフォルトの名無しさん:2010/12/07(火) 01:26:21
スクリプトから同じディレクトリにある別のスクリプトをrequireするには?
826デフォルトの名無しさん:2010/12/07(火) 01:38:13
requireすればいい。
827デフォルトの名無しさん:2010/12/07(火) 05:19:32
$LOAD_PATHの各要素 + requireの引数 + ".rb"
でヒットしたファイルを読み込んでる
そういうふうに $LOAD_PATH と require の引数を設定するといい
$LOAD_PATH に自分でパスを追加するのはカッコよくないと思われているが、追加行為自体は普通のことだ

require に絶対パスっぽい文字列を渡すと絶対パスっぽく探してくれる
require 'rubygems' したあとだと、とりあえず gems の各ディレクトリから "引数-n.m.o/引数.rb" を探す
828デフォルトの名無しさん:2010/12/07(火) 09:04:36
趣味でやっているひとに聞きたいんだけど
これでなにを作っているの?
サーバーやWEB関連は全くやる気がないので
それ以外での使い道あったらおしえて
829デフォルトの名無しさん:2010/12/07(火) 09:43:36
kakikomi.txtから「んほおおおお」って書きこんだ回数を探す
830デフォルトの名無しさん:2010/12/07(火) 09:57:48
世界を滅ぼす魔力を秘めた一つの指輪
831デフォルトの名無しさん:2010/12/07(火) 10:10:16
>>825
1.9系ではrequire_relativeが使えるよ
832デフォルトの名無しさん:2010/12/07(火) 16:33:02
>>828
コマンドプロンプトでの作業のお供に使ってる
833デフォルトの名無しさん:2010/12/07(火) 18:42:54
>>831
ありがとう。こんな便利なものがあったなんて
>>827
1.9系が使えないときには参考にさせていただきます
834デフォルトの名無しさん:2010/12/07(火) 20:00:19
プログラミング言語ってなかなか擬人化されないよね。
それとかプログラミングを題材にした萌えアニメとかさぁ。
835デフォルトの名無しさん:2010/12/07(火) 20:07:08
侵略!ヘビ娘とかやったら一気に普及しそうだよね

ちなみに擬人化は大昔にやって歴史の暗部に追いやられた
836デフォルトの名無しさん:2010/12/07(火) 20:09:29
うん、Rubyの擬人化というかマスコットの女の子は確か昔…
837デフォルトの名無しさん:2010/12/07(火) 20:10:44
じゃぁRubyの公式マスコットはmatz氏の名前にかけて「matz子・デラックス」ということで。
838デフォルトの名無しさん:2010/12/07(火) 20:11:59
ていうかあんま言いたくないがプログラミング自体かなり特殊なんだよ
これは認めて直視しないといかん
「誰にとっても便利」「誰にとっても簡単」「誰にとっても習えばある程度までできる」は幻想

生活の中での扱われ方は絵を描く行為にかなり近い
まあ初心者スレで言うようなことでもないんだが
839デフォルトの名無しさん:2010/12/07(火) 20:33:50
うん。俺らは気づいてないけど
プログラミングのできる人って
体感で1万人に一人くらいのもんだと思うよ。
それくらい特殊な技能。
840デフォルトの名無しさん:2010/12/07(火) 20:34:42
昔、日本語ベーシック、ぴゅーたとかあったのを思い出した。
単語が日本語に置き換わっただけだけど。
841デフォルトの名無しさん:2010/12/07(火) 20:43:06
何らかの書類(学級通信や新聞、手紙、レポート、広告等)に
自力でイラストや挿絵を描けるかどうか、とかいうのに近いよね
フツーの人はそんなレベルのプロダクトを作れないという点で

フツーはそれができる人が作ったものを有償無償でもらってきて使うはず
プログラムも、やっぱおんなじなんだと思う

ヘタに「机でお勉強」のスタイルをとることができるもんだからよく勘違いされる
「勉強」したって、それだけじゃできないものはできないのだわ
学校の図工や美術の授業を受けたからといって「絵が描ける」ようにならなかったのと同じ
842デフォルトの名無しさん:2010/12/07(火) 20:46:42
擬人化の話は、 ランゲージ娘 でぐぐればまだ出てくる。
843デフォルトの名無しさん:2010/12/07(火) 21:44:25
ユニットテストでの、ユニットって何ですか?
人によって、クラスのことだったりメソッドのことだったりするので、混乱しています。
844デフォルトの名無しさん:2010/12/07(火) 21:56:16
単体のことです

ナニを以って単体とするか(テストの粒度)はほんとうに様々です
まあとりあえずユーザーに提供するメソッド(パブリックメソッド)のテストさえしとけば最低限なんじゃないのかね
845デフォルトの名無しさん:2010/12/07(火) 23:32:35
結合テストに対する言葉なので、
何か(ユニット)を結合しない状態でのテストならユニットテストです。
846デフォルトの名無しさん:2010/12/08(水) 01:05:40
>>828
といってもネットからAV女優の名前一覧持ってきて加工して自動で動画や画像をダウンロードして私的利用したり、
あわせて名前や関連タグつけてリネームするような便利スクリプトもweb関連だが、それ以外でと申すか・・・

・batやshellスクリプトの延長
・sedやawkの使い方をふと忘れたときのテキストの加工
・batやbashでファイルの列挙やforの書き方を忘れたときの(ry
・irbでGoogle電卓でしにくい計算
847デフォルトの名無しさん:2010/12/08(水) 01:48:33
Goにおけるgofmtに相当するもんはRubyにもありまつか?
848デフォルトの名無しさん:2010/12/08(水) 02:08:18
ポピュラーなのはねっす
849デフォルトの名無しさん:2010/12/08(水) 08:49:47
パス指定するとき
windowsだと毎回
C:\test

C:/testに置き換えないとだめなの?
850デフォルトの名無しさん:2010/12/08(水) 10:00:53
>>849
俺もそれ思ってた
Rubyの中だけでなら/でいいけど、systemで呼び出したい時にコマンドが\しかうけつけないことあるし
相互変換のメソッドないの?
851デフォルトの名無しさん:2010/12/08(水) 10:14:15
おお、同じような人がいた
Dir.globeが全く反応せず、エラーもでないから
どうしたものかと小一時間ハマってしまったわw

path.towinpath()みたいなメソッドを自作しろってことなのかねぇ?

なんかぞっとするんだがw
852デフォルトの名無しさん:2010/12/08(水) 10:43:14
>>844
つまりユニットとはクラスのこともあるしメソッドのこともあるというわけですか。
じゃあ、ユニットがクラスのことだったりメソッドのことだったりするのは、間違いどころか、正しい使い方だったんですね。

>>845
「何かを結合しない状態でのテスト」というのは、つまり「非結合テスト」という意味なわけですね。なるほど。

ありがとうございました。
853デフォルトの名無しさん:2010/12/08(水) 12:37:55
Ruby の中で完結する場合は、最初から最後まで '/' だけでよい
ただし、mswin/mingw の場合は、'\\' が引数に入っていてもたいていディレクトリ区切りだとみなす

system のように外部シェルを起動するタイプの場合は、
「シェルがそのまま解釈できる文字列」でなければならない
つまり、「2つ上のディレクトリ内容を表示する」場合は
system('ls ../../') か system('dir ..\\..\\') だ

Dir.glob の引数は Ruby パスでもシェル渡し文字列でもない独自規則なので、
それに合った記述を行わなければならない
パス区切りは '/' なので、mswin/mingw でも linux/mac でも '/' で書く
余談だが、ディレクトリを「上らせ」ようとして '../..' というような記述をしても Dir.glob ではそもそも動作しない

で、「二つ上に移動する外部system用引数」をどうやって記述するのがベストかというと、
FIle.join('..', '..') だと思う
これは実行環境が mswin/mingw などの場合は '\\' で、それ以外では '/' で引数を連結する
「Linuxで実行中だけどWindows用のパス区切り文字列が欲しいなあ」という場合は
自力で '../hoge/fuga'.split(/\//).join('\\') したりしろ
854デフォルトの名無しさん:2010/12/08(水) 12:47:46
めんどくせw
855デフォルトの名無しさん:2010/12/08(水) 12:50:01
>>853
> FIle.join('..', '..') だと思う
> これは実行環境が mswin/mingw などの場合は '\\' で、それ以外では '/' で引数を連結する
いや、それは間違い。
どんなプラットフォームでもFile.joinは'/'で引数を連結する。
856デフォルトの名無しさん:2010/12/08(水) 13:00:56
いまFile::ALT_SEPARATORってどういう扱いになってるんだ
結局はPathname使えバーカバーカという話になるんだろうか
857デフォルトの名無しさん:2010/12/08(水) 13:19:04
>>856
ALT_SEPARATORでもrubyは受け付けるよ、以上の意味はないね。
Pathnameも起きることは同じ。
858デフォルトの名無しさん:2010/12/08(水) 13:28:14
過去に「DOSISH対応」という言葉でおーざっぱにまとめられてしまって若干混乱した経緯があるな
File.join は File::SEPARATOR しか使用しない
859デフォルトの名無しさん:2010/12/08(水) 13:38:25
結論:rubyはWindows環境には対応していません。
860デフォルトの名無しさん:2010/12/08(水) 13:39:56
さて、Rubyアンインスコするか^^
861デフォルトの名無しさん:2010/12/08(水) 13:51:48
連投恥ずかしーーーw
862デフォルトの名無しさん:2010/12/08(水) 14:02:32
ちょ、ちょっとまってw

試したんだけどPathnameは元のパスが\区切りだろうが、/で連結しようとするね
それはいいとして、実行環境依存だから

このあたりPythonはどうなっているか調べてみるか
863デフォルトの名無しさん:2010/12/08(水) 14:12:18
Pythonは普通にできる
RubyはMS嫌いな奴が作った言語だからな
864デフォルトの名無しさん:2010/12/08(水) 14:36:54
まあ普通とはなんぞやという話ではある

スクリプトからファイルパス文字列を「エクスポート」する際に環境依存にするかどうか
865デフォルトの名無しさん:2010/12/08(水) 14:44:43
こんな初歩的なところで詰まる言語なんて
続けていくともっと大変そうだな
Windowsユーザーはやるべからず
866デフォルトの名無しさん:2010/12/08(水) 14:45:37
>>864
「エクスポート」ならデフォルト動作は環境読むべきだろうね
mswin で
path = FilePath.new('../foo/bar')
p path.export
としたら、 '../\\foo\\bar' という文字列になるべき、だろう
でも Ruby のファイルパスは単なる文字列だからなー
867デフォルトの名無しさん:2010/12/08(水) 14:50:24
ガラクタの寄せ集めって感じ
統一感がまるでなし
ファイル操作なんて間違えたら致命的なのに
そこが安心して使えないなんて終わってる
868デフォルトの名無しさん:2010/12/08(水) 14:51:56
間違った '..\\foo\\bar' だ

どうでもいいけど Ruby 使ったことのない奴が一人で頑張ってるな
869デフォルトの名無しさん:2010/12/08(水) 14:53:13
間違った人が何を言う
そういうのが怖いんだよ
しかもエラー吐かないしww
870デフォルトの名無しさん:2010/12/08(水) 14:53:57
'..\foo\bar' だった

まあファイルパスをエクスポートするようなときは自前で慎重に書けということなんだろう
871デフォルトの名無しさん:2010/12/08(水) 14:57:02
>>859-860,>>865,>>867の母でございます。この度はうちのニートが荒らしてしまい、
皆様に多大なるご迷惑をおかけしました事を心より深くお詫び申し上げます。
>>859-860,>>865,>>867には厳しく注意しておきますゆえ、
これからもどうかうちのニートをよろしくお願いいたします。


.@@@
(゜´д`)                ...((( )))≡ママ〜 ゴメンヨ〜
∪/  )                 (´Д` )≡
( .|   |                 ⊂⊂  )≡
..|└┬┘                   Y 人≡
.(_)__)                    (_)__)≡

【Perl,PHP】LLバトルロワイヤル14【Ruby,Python】
http://hibari.2ch.net/test/read.cgi/tech/1290367109/
872デフォルトの名無しさん:2010/12/08(水) 15:01:31
>>869
FilePathというクラスは標準で存在しない(Pathnameはあるが)
Rubyの標準クラスが解釈する限り、 / だろうが \ だろうがパス区切りとして動作する
irb> path = Pathname.new('C:\Program Files')
=> #<Pathname:C:\Program Files>
irb> rubypath = path.join('ruby-1.8')
=> #<Pathname:C:\Program Files/ruby-1.8>
irb> p Dir.entries(rubypath)[2]
"bin"

外部シェルが解釈可能な文字列に変換したいときでも、
環境依存の自動処理が行われないという話に過ぎない
873デフォルトの名無しさん:2010/12/08(水) 15:10:12
おれがやりたいことは単純なこと
ただフォルダ内からファイルを検索したいだけ
たったこれだけのことなのに環境依存だとか考えなきゃいけないのが面倒
Dir.globeに至ってはエラーすら出さないので
何がだめなのかすらわからなかった

よく使うであろう関数ですらこれなんだから
統一性のない関数をこれから複数覚えていくと考えるとぞっとする
やっぱりC#が完璧すぎるんだな
874デフォルトの名無しさん:2010/12/08(水) 15:11:10
875デフォルトの名無しさん:2010/12/08(水) 15:12:55
>>851が勝手に「俺も>>849-850と同じだ」と思い込んでるだけだな
876デフォルトの名無しさん:2010/12/08(水) 15:13:50
p path
だとなぜか数字だらけ
puts pathだとちゃんと表示。

非常にわかりづらい
pだけをみてこういう動作をすると予測できる人間がどれだけいるか
1億人に聞いたとしても予測は無理だろう
877デフォルトの名無しさん:2010/12/08(水) 15:15:10
Windowsしかやってないと外部シェルとか言われてもピンとこないんだろうな
Dir.globに渡す文字列の話とごっちゃになってるし

つかC#使えるならC#でこう書くのはRubyだとどう書くの?って質問すればいいのに
878デフォルトの名無しさん:2010/12/08(水) 15:15:40
File.joinだと確か再起処理をかかないとだめなはず
そんな面倒なことをさせる言語ならC#でいい
879デフォルトの名無しさん:2010/12/08(水) 15:17:46
外部シェルって誰かが作ったクラスとかそんなだろ?
そういうのを寄せ集めてるから統一性がないんだよ
1社でつくれ、個人で作るなと
880デフォルトの名無しさん:2010/12/08(水) 15:18:03
作ってる人がそもそも乗り気じゃないんだから、無理にWindowsで使わなければよい。
頼んで使っていただこうというのならともかく。
881デフォルトの名無しさん:2010/12/08(水) 15:18:31
お茶ふいた。
882デフォルトの名無しさん:2010/12/08(水) 15:20:02
じゃあ質問WPFでこのように”1行”で書いたコードを
Rubyならどうやって書くの?

<WebBrowser Source="http:..."/>
883デフォルトの名無しさん:2010/12/08(水) 15:20:31
>>876
>pだけをみてこういう動作をすると予測できる人間がどれだけいるか
5000万人くらいの人は「よくわかんないけど使用マニュアルとかないの?」と聞くだろうな

Dir.glob が返す Array に含まれる文字列に対して Sting#inspect を呼んでいるに過ぎない
String のマニュアルには $KCODE 設定しろと書いてあるんだから日本語扱うときは $KCODE 設定しろ
>>849-850 とは全く無関係の話だ
884デフォルトの名無しさん:2010/12/08(水) 15:27:39
つまり日本語を表示するだけなのにいろいろしなきゃらないってことなんでしょ
コードが短いし、文字列に強いと評価があったからやってみたが
その文字列で詰まるとはなw

日本語書くだけでいろいろ設定しなくちゃいけないとか・・・
こうなると、テキストがutf-8かsjisかどうかの判別コードも
自作しなくちゃならないんじゃないの?
C#じゃ自前で判別用のものを作らなきゃならない
しかもそれは完璧ではない
Rubyも同じか
885デフォルトの名無しさん:2010/12/08(水) 15:27:44
p に関する動作は理解しないとどうにもならんのでわりと初期に学ぶと思うんだが
886デフォルトの名無しさん:2010/12/08(水) 15:29:10
>>884
別に p は日本語表示のメソッドじゃないし
日本語を日本語文字として表示してほしいなら puts なり print なり使え
887デフォルトの名無しさん:2010/12/08(水) 15:30:18
p を puts や print の略記だと思い込んでる人は稀に見かける
Rails の人に多い
888デフォルトの名無しさん:2010/12/08(水) 15:37:54
>>887
あー、h とかと同じだと思ってるのか

関数的メソッド p は、対象オブジェクトに設定されたinspect表記を呼び出す
inspect はクラス製作者が設定した、主にデバッグやコード製作に有用な内部表記だ
String#inspect は、何も設定されていなければ文字列のバイト表現を返す
889デフォルトの名無しさん:2010/12/08(水) 15:40:55
irb での返り値表示も基本的に insepct の類の管理用表示だな
あのへんになるとぶっちゃけ $KCODE 設定しないほうがなにかと便利だと思うが
読みたいときだけ puts とかすれば充分
890デフォルトの名無しさん:2010/12/08(水) 19:28:03
W系API版誰か作ってくれ〜
891デフォルトの名無しさん:2010/12/08(水) 20:09:58
pの説明なんてrubyの入門書の最初に書いてあることないか?
892デフォルトの名無しさん:2010/12/08(水) 20:17:50
「んっん〜?pはputsかprintの略だよな?ポチッとな…ほーれ。」とすぐに予想できることはいちいち読まない。
たとえ、予想が間違っていたとしても、そして理解も間違っていたとしてもだ…
893デフォルトの名無しさん:2010/12/08(水) 20:18:36
動作を見ると、機能が分かったと容易に錯覚できるから、説明があっても「あー、表示するのね」
と読み飛ばしてしまうかもね。
894デフォルトの名無しさん:2010/12/08(水) 20:25:32
"文字列" と表示するメソッド、みたいな理解をする人はまれにいる
配列は「もともと」
 [1, 2, 3]
みたいな構造をして存在してるものだと思うらしい
引数オブジェクトの持つ特定のメソッドを呼んだ結果を表示するだけ、みたいな考えには思い至らない模様

まあわからんでもないのだが
っていうかそういうふうにならないように解説とか慎重に書いてあるんじゃないのと思うんだけどどう
895デフォルトの名無しさん:2010/12/08(水) 20:32:35
if max > @max_value
 @max_value = max
end

をプロが1番かっこよく書くとどうなるでしょうか?
上のでもいいのですが気になって。
896デフォルトの名無しさん:2010/12/08(水) 20:43:29
>>890
お前も俺と一緒に作るんだ!
そのためにコミッタが一筆してくれんだろがw
Ruby環境構築講座 Windows編 - 達人出版会
http://tatsu-zine.com/books/winrubybuild
897デフォルトの名無しさん:2010/12/08(水) 20:43:34
一番かっこいいかは知らんけど、
@max_value = [max, @max_value].max
898デフォルトの名無しさん:2010/12/08(水) 20:44:34
p=高級printfデバッグ用途
899デフォルトの名無しさん:2010/12/08(水) 20:45:48
#inspect
#display
#name
#p
#print
#printf
#putc
#puts
#sprintf
#to_s
#to_str
こやつらは整理して理解すべき。初心者スレにも定期的に上がるWADAI。
900デフォルトの名無しさん:2010/12/08(水) 23:27:50
>>896
trunkのソースを見てみたけど、CreateProcessくらいしかA系API使ってないように見える。
901デフォルトの名無しさん:2010/12/09(木) 00:50:19
マジで?
_UNICODE定義してなくて勝手にA系使ってるとかもない?
902デフォルトの名無しさん:2010/12/09(木) 00:51:57
ppがすきです〜
903デフォルトの名無しさん:2010/12/09(木) 00:52:43
あそういえば何だったか1.8.7だと上手くWindowsでうごかなかったコードが
1.9.2だと上手く動いたことあったな。ファイル周りだった気がするが実は対応されているのか
904デフォルトの名無しさん:2010/12/09(木) 00:55:42
Rubyのそういうとこ厄介だよな。
正直、業務用途には恐くて使えん。
905デフォルトの名無しさん:2010/12/09(木) 01:20:53
業務でWindows?

906デフォルトの名無しさん:2010/12/09(木) 01:53:52
ニートが業務?
907デフォルトの名無しさん:2010/12/09(木) 08:52:04
おまいら英語苦手すぎるだろー
ttp://atnd.org/events/10439
参加してやれよ
908デフォルトの名無しさん:2010/12/09(木) 09:43:11
rakeで、依存ファイルのタイムスタンプを無視して強制的にタスクを実行させるオプションってありませんか。
909デフォルトの名無しさん:2010/12/09(木) 10:47:41
ないみたい。

依存物をtouchするか、名指しもしくはcleanなどで生成物を消去して
再実行が一般的かな。

rake --execute-continue でどうにかするのも無理気味。
910デフォルトの名無しさん:2010/12/09(木) 11:54:53
rakdeの標準的なcleanのやり方はRakefileで
require 'rake/clean'
これで
clean タスク(中間生成ファイルを掃除)
clobber タスク(最終生成物も掃除)
が追加される。
掃除の対象を増やしたいときはCLEANとCLOBBERというFileListに
#includeで追加すればOK。
911デフォルトの名無しさん:2010/12/09(木) 14:08:01
rake clean; rake
912デフォルトの名無しさん:2010/12/09(木) 15:51:26
ちゃんと&&で綺麗にしてからがいいけどな。
913デフォルトの名無しさん:2010/12/09(木) 17:00:51
puts self.class.name とかやると"モジュール名::クラス名"が返ってくるのですが、
これを"クラス名"だけ取得する方法はありませんか。
914デフォルトの名無しさん:2010/12/09(木) 17:27:22
とくにないです
文字列操作して切り出してください
915デフォルトの名無しさん:2010/12/09(木) 19:22:56
active_support 使ってれば self.class.name.demodulize で取れる
916デフォルトの名無しさん:2010/12/09(木) 19:40:53
>>912
すいません&&ってなんですか?
917デフォルトの名無しさん:2010/12/09(木) 19:43:40
rake clean && rake
として、rake cleanが失敗した時は止まるようにしとけ、ということ。
918デフォルトの名無しさん:2010/12/09(木) 19:46:28
Ruby無関係の特定のシェルの機能だな
919デフォルトの名無しさん:2010/12/09(木) 19:49:38
&& 使えないシェルって困るなー
現在はまず無いと思うけどね
920913:2010/12/09(木) 21:18:58
>>914-915
ありがとうございます。あきらめます。
921デフォルトの名無しさん:2010/12/09(木) 21:48:08
>>913
/::/ で split して、最後の要素を取り出せばいい。

module Foo
module Bar
class Baz; end
end
end

cls = Foo::Bar::Baz
cls.name #=> "Foo::Bar::Baz"
cls.name.split(/::/).last #=> "Baz"
922デフォルトの名無しさん:2010/12/09(木) 22:07:19
923デフォルトの名無しさん:2010/12/09(木) 22:15:53
確認コード書いたあとただ捨てるのが勿体なく思えて2chに貼ることはよくある
924デフォルトの名無しさん:2010/12/09(木) 22:48:38
>>923
それ初心者スレにふさわしいと思う。
「確認コード蓄積スレ」を兼ねて
コードだけググってここに来れたらイイけど。
925デフォルトの名無しさん:2010/12/09(木) 23:37:04
そしてそれを見てしまった人は同じコードを使えなくなる、という罠だな。
926デフォルトの名無しさん:2010/12/09(木) 23:38:46
適当にライセンス書いてgistに貼る。
2ちゃんに貼るとタラコのおっさんのもんになるぞ。
927デフォルトの名無しさん:2010/12/10(金) 00:23:05
そこまでいくと暴行罪に問われると嫌だから
あらゆる他人との接触を拒もうってのと大差ないぞ
貼られるコードと利用される分量にもよるが
928デフォルトの名無しさん:2010/12/10(金) 00:32:11
まぁ見たけど見なかったことにしてサッと書けば(ry
929デフォルトの名無しさん:2010/12/10(金) 02:55:38
てs
930デフォルトの名無しさん:2010/12/10(金) 03:08:05
Railsの初心者スレがなかったのでこちらで失礼します.

Railsのscaffoldでは,CRUDの実装でnewとcreateを分けてるみたいなんですが,これ何か理由あるんですか?
昔cakePHP使ってた時,確かcakeのscaffoldでは,(RoRでいえば)↓みたいなコードが出されてた気がします.

def create
if !params[:mdl]
@mdl=Mdl.new()
else
@mdl=Mdl.new(params[:mdl])
〜以下CREATE処理
end
end

もちろん↑でもできるので,わざわざ分けてる理由がわかりません.
RESTに準拠してstatelessな通信をするためかなって思ったんですが,RoR自体は昨日始めたばかりなので確信が持てなくて,
もしかしてもっと別のpragmaticな理由があるのかもしれないと思ったので質問させていただきました.
931デフォルトの名無しさん:2010/12/10(金) 03:42:32
CRUDに相当するメソッドは以下の通り。
#create #show #update #destroy

#newは新規作成用の入力画面
#editは編集用の入力画面
#indexは一覧表示画面

たぶん。
932デフォルトの名無しさん:2010/12/10(金) 07:00:04
>>930
>Railsのscaffoldでは,CRUDの実装でnewとcreateを分けてるみたいなんですが,これ何か理由あるんですか?

本当のところは作者であるDHHにきかないとわかんないけど、理由を3つ考えてみた。
(A) メソッドは単機能であるべき(作成を行うcreate()と、作成用の画面を表示するnew()は分けるべき)
(B) リクエストメソッド(GET, POST, ...)が異なるならアクションも分けたい(通常、new()はGETでcreate()はPOSTだから、アクションメソッドも別にしたほうが、routingでの割り当てがやりやすい)
(C) アクションはhtml用とjson用とで共通化したい(通常、作成用の画面を表示するnew()はhtml用にだけ用意してjson用は用意しないので、new()の機能をcreate()にいれたくない)

あと1つのメソッドでnew()とcreate()を兼ねるなら、request methodがGETかPOSTかで分けたほうがいいと思うのだがどうか。
933デフォルトの名無しさん:2010/12/10(金) 08:05:43
>>930-932
> Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
934デフォルトの名無しさん:2010/12/10(金) 15:49:02
Rubyって条件式の所で数字を評価すると必ずtrueになるのな。

if 0
# ここは必ず実行される
end

どうも動作がおかしいと思った。
935デフォルトの名無しさん:2010/12/10(金) 15:56:00
>>931
>>932
詳しいご解説ありがとうございます.
scaffoldの生成したコードを見ていたら,↓のように

# GET /cntrs/new
# GET /cntrs/new.xml

コントローラの全メソッドに,対応するhttpリクエストのメソッドがコメントされていました.
つまりお二人のおっしゃった理由だったということなんだと思います.

>あと1つのメソッドでnew()とcreate()を兼ねるなら、request methodがGETかPOSTかで分けたほうがいいと思うのだがどうか。

確かにその方がエレガントですね.ありがとうございます.

>>933
すみません,知りませんでした.今後はそっちに書きます.
失礼しました.
936デフォルトの名無しさん:2010/12/10(金) 16:02:20
>>934
「評価が偽になるのはfalseとnilだけ」
これ大事
937デフォルトの名無しさん:2010/12/10(金) 16:14:42
ていうか>>934みたいな人はどのサイトなり本なり読んでるんだ
危険だから晒せ
938デフォルトの名無しさん:2010/12/10(金) 16:17:19
0 は数字じゃないぞ。数字は "0" だ。
939デフォルトの名無しさん:2010/12/10(金) 17:35:27
>>937
他の言語では0が偽になることが多いからってだけでしょ
有名なRubyの落とし穴

http://www.ruby-lang.org/ja/man/html/Ruby_A4CECDEEA4C8A4B7B7EA.html
http://www.ruby-lang.org/ja/man/html/trap_BFBFB5B6C3CD.html
940デフォルトの名無しさん:2010/12/10(金) 17:40:49
そんな太古の Ruby 1.4 とかの化石な状況ならともかく、今は説明が「必ず」あるはずなんだが
>>934みたいな人がいるってことは、そういう説明しない書籍やらサイトがあるってことだろ
941デフォルトの名無しさん:2010/12/10(金) 17:43:12
力抜けよ
942デフォルトの名無しさん:2010/12/10(金) 18:42:15
説明書をしっかり読む人って少ないもんだよ。
943デフォルトの名無しさん:2010/12/10(金) 18:51:11
>>934
「評価が偽になるのはfalseとnilだけ」
rubyでは偽かそれ以外だから
falseだけを設定しておけばいいのだが、
falseだけじゃバランスが悪いのでtrueも一応用意している。

0が偽だというのは君の思い込みor他のプログラム言語のせい
944デフォルトの名無しさん:2010/12/10(金) 18:59:09
r=Net::HTTP.post_form(...)
p r.body.encoding
とした結果が
#<Encoding:ASCII-8BIT>
になってしまっていて、bodyをファイルに保存してもUTF-8で開けません。
どうすればいいですか?
945デフォルトの名無しさん:2010/12/10(金) 19:01:48
>>943
数学の世界で0は無を意味する。
Rubyの世界でnilは無を意味する。

数学の世界の無と、Rubyの世界の無が、対応取れてないからだと思うよ。
Rubyの世界にはまずオブジェクトの世界がある。その上に数学の世界が構築される。
プログラミング初心者は、数学の世界の上にオブジェクトの世界があると思っている。
946944:2010/12/10(金) 19:12:09
ふつうにブラウザでやるとUTF-8のHTMLドキュメントが返ってきます。
947デフォルトの名無しさん:2010/12/10(金) 19:42:38
948944:2010/12/10(金) 19:43:45
r.body.encode('UTF-8',"iso-8859-1")
でなおりました。どこが問題だったのかいまだに分かりませんが。
949デフォルトの名無しさん:2010/12/10(金) 20:26:54
net/http は Content-Type の charset を見てくれるようになったのだっけ?
950デフォルトの名無しさん:2010/12/10(金) 20:29:36
Ruby 1.9.1/2 の Net::HTTP はデータ取得を必ずバイナリとして扱う(Encoding.default_externalとかは利用しない)
…あ、ちょっと待って自信ない、…うん、利用しないはず、たぶん利用しない

なので、返る HTTP ボディの文字列はまったく変換されないサーバからの生データのままで、
エンコーディング名は「不明なバイナリデータ」を示す ASCII-8BIT だ
ユーザーが何らかの手段で正しい文字エンコーディングを調べて、force_encoding で名づけて欲しいというスタンス

ということで
 ・ サーバが User-Agent などを読んで、IE などには UTF-8 で返すようになってた
 ・ どこかで誰かが不正な force_encoding を行ってた
 ・ ファイル保存時のエンコーディング指定が論理的に変だった
のどれかだと思う
951デフォルトの名無しさん:2010/12/10(金) 20:34:37
>>949
見ない
それは Net::HTTP の仕事ではないというかそんな根底部分で余計なことすんなということらしい
open-uri ならヘッダの Content-Type を読んで force_encoding で設定してくれるが、

irb1.9> require 'open-uri'
irb1.9> p open("http://dailynews.yahoo.co.jp/").read.encoding
#<Encoding:EUC-JP>
irb1.9> p open("http://sankei.jp.msn.com/").read.encoding
#<Encoding:Shift_JIS>
irb1.9> p RUBY_VERSION
"1.9.2"

レスポンスヘッダの Content-Type ほど信用ならないものもないのでまあ掛け捨て保険程度
952デフォルトの名無しさん:2010/12/10(金) 20:46:25
なにもしない … Net::HTTP
Content-Type ヘッダの値を試す(エンコーディングエラーなら無視) … OpenURI
<meta> の charset と Content-Type ヘッダ と NKF.guess を試す … Mechanize

こんな感じだな
まあエンコーディングチェックのコストの関係で事実上の住み分けになってる
Mechanize は HTML を全文パースしてエンコーディング情報候補を探すから動作が他よりずっと重い

HTML が文字エンコーディング情報をヘッダでのみ記述するようになってれば楽だったのですが
http-equiv とかいうドヤ顔機能マジ氏ね
953デフォルトの名無しさん:2010/12/10(金) 21:31:44
ruby1.9.2からrequireを同ディレクトリ内のファイルを呼んでくれなくなる。
つまりRuby 1.9.2から$LOAD_PATHにカレントディレクトリが含まれなくなった。
require'./@@@@'
とするか、
require_relative'@@@@'
としなければならない。
古い参考書を読んでいてはまった。
954デフォルトの名無しさん:2010/12/10(金) 21:40:18
>>934
イディオムで

!!(式)

というのがある、これでtrueになるかfalseになるかわかるけど基本は >>936

irb> [-1, 0, 1, true, false, nil, [], "0"].map{|x| !!x}
=> [true, true, true, true, false, false, true, true]

メソッドでtrueかfalseかだけを返すことを明示したい時の使われているけど
記号的だしObject.to_boolがあればいいけど、長いよな
955デフォルトの名無しさん:2010/12/10(金) 21:48:03
module Object
  def is_true?
    !!self
  end
end

他の言語で言う if (flag == true) 並に恥ずかしいが
956デフォルトの名無しさん:2010/12/10(金) 21:49:21
ごめん適当に書いたら間違ってる
is_true?よりもRubyならtrue?の方がいいな
957デフォルトの名無しさん:2010/12/10(金) 21:55:57
ユニットテストってみんな標準のTest::Unit使ってるの?
それ以外の凄いのない?
958デフォルトの名無しさん:2010/12/10(金) 21:56:19
>>955-956
module Kernel
  def true?
    !!self
  end
end

require 'pp'
pp [-1, 0, 1, 0.0, 0.1, true, false, nil, [], "0", ""].map{|x| [x, x.true?]}
959デフォルトの名無しさん:2010/12/10(金) 21:57:48
>>955-956
irb> p (1 == true)
false

Ruby にとって true という呼び名はあまり意味がないので述語に入れるのは不適当
Object#nil? があっても Object#true? はない
non-nil みたいなもの
960デフォルトの名無しさん:2010/12/10(金) 21:59:37
>>957
もはやユニットテストではないかもsれんが

rspecが流行りか
あとはshoulda

受け入れテストはCucumber(とCucumberの記法がウザイ人のためのsteak)

今の流行りはここを参照しる
Testing frameworks in The Ruby Toolbox
http://ruby-toolbox.com/categories/testing_frameworks.html
961デフォルトの名無しさん:2010/12/10(金) 22:02:31
>>959
trueではないが、ifでは真と評価されるというくらいか
962デフォルトの名無しさん:2010/12/10(金) 22:03:58
>>934 が「条件式の所で数字を評価すると必ずtrueに」

「条件式の所で」つってんだろがw
963957:2010/12/10(金) 22:04:39
すげー。ありがとうございます。勉強します。
でもどれが凄いのかわっぱりわからんw
964デフォルトの名無しさん:2010/12/10(金) 22:05:29
>>957
今の標準はminitestじゃね?
標準じゃなくて今は切り離されたTest::Unitは進化してるみたいだぞ
965デフォルトの名無しさん:2010/12/10(金) 22:07:21
>>963
BDDやTDDで最近の日付でググっとけ

書き捨てのスクリプトならともかく、テスト書かないとやっとれんし効率的なテスト書く方法しっとくと楽
966デフォルトの名無しさん:2010/12/11(土) 00:00:45
ifの式の中では#to_booleanを呼んで真偽判定すればいいのに。
んでnil.to_booleanすると「ぼっ僕は真でもない偽でもないよ!」って例外をあげればいい。
なんでnilも偽なんだからね!とか勝手にになっちゃうのかわからん。
nilさんがかわいそうだろ…そんなつもりじゃないのに偽とか決め付けたら。
967デフォルトの名無しさん:2010/12/11(土) 00:05:03
一応、本質的には nil だけなのだと思う
nil なら ELSE、それ以外は THEN という処理

真偽値で nil と non-nil だけだとわかりにくい人向けに false が作られた感じ、に見える
968デフォルトの名無しさん:2010/12/11(土) 00:11:51
もうわけわからん。
コードの世界2でも出して完全解説ヨロ。>マツモティーヌ
969デフォルトの名無しさん:2010/12/11(土) 00:14:27
非nil という概念を当たり前に思えるかが鍵なんだろうなあ
Ruby のスクリプトを書いてる人で明示的に false を返してる人は稀だと思う
970デフォルトの名無しさん:2010/12/11(土) 00:16:28
>>969
foo? みたいなのはメソッドの名称的に true か false を「返さないといけない」んで、きちんと書く

それ以外の if 条件になるメソッドの返り値なんかは nil かそうでないかの気遣いしかしないなー
971デフォルトの名無しさん:2010/12/11(土) 00:23:05
つまりこの世界にはnilか非nilしかないってこと?
972デフォルトの名無しさん:2010/12/11(土) 00:26:51
「該当がなかったらnilを返す」というメソッドがやたら多い理由でもあるね
ホントは、該当なしなら空文字列や空配列もでいいはずなのよ
でもそうせずに“失敗”時に nil を返すようにすると

foo() || var || baz()

みたいな混成の処理ができる
foo メソッドが空文字列を返すとか var は Hoge::EmptyData オブジェクトが入ってるとか
そういうのだととても困る
まさか false を入れとくわけにもいかないし
undef? ああその手もあるか
973デフォルトの名無しさん:2010/12/11(土) 00:35:30
>>972
んー…「該当がなかったらnilを返す」のは駄目なことなの?
例えばHashでキーに対応する値が無かったらnilを返すのは正しいとおもうんだど。
974デフォルトの名無しさん:2010/12/11(土) 00:37:54
>>973 よく読め
975デフォルトの名無しさん:2010/12/11(土) 00:39:17
>>973 よく書け
976デフォルトの名無しさん:2010/12/11(土) 00:40:00
゚(゚´ω`゚)゚。ピー
977デフォルトの名無しさん:2010/12/11(土) 00:42:34
undef は地獄なのでやめといたほーが…
978デフォルトの名無しさん:2010/12/11(土) 01:18:10
テストは
内部テストにRspec
外部テストにcucumber+capybara

979デフォルトの名無しさん:2010/12/11(土) 01:25:13
>>6のActiveScriptRuby 1.8.7が落とせない(サイトがなくなってる)のですが
どこか替わりのサイトはありますか?
980デフォルトの名無しさん:2010/12/11(土) 01:57:17
消える寸前に移転の情報を見た気がするが、Windows興味ないので
どこだか覚えてないや、ごめんな。
981デフォルトの名無しさん:2010/12/11(土) 02:15:13
いまならここだろ
RubyInstaller for Windows
http://rubyinstaller.org/
Downloads
http://rubyinstaller.org/downloads/
982デフォルトの名無しさん:2010/12/11(土) 02:50:29
>>978
artonさんのとこ
http://www.artonx.org/
983デフォルトの名無しさん:2010/12/11(土) 02:51:19
>>981のような人にはなりたくないと思う
移転先は>>256
>>981はMinGWなので初心者には勧めない
984デフォルトの名無しさん:2010/12/11(土) 03:16:24
中級者な人ならRubyInstallerのrubyのほうが速くていいんだけどね
RubyInstallerのほうはRuby以外にやらなければならないことがちと多すぎるな
Rubyに慣れて「拡張ライブラリ作るぜー」とかいう段になってから改めて乗り換えるので充分間に合う
985デフォルトの名無しさん:2010/12/11(土) 03:27:21
ゆくゆくはみんなmingwになるんだろうけどね…
っていうかmingw32対応してないような拡張ライブラリはそろそろ焼却炉で燃やしていい
いまだに RUBY_PLATFORM =~ /mswin/ も残ってるしやんなるな
986デフォルトの名無しさん:2010/12/11(土) 11:02:11
javascriptはnull, undefined, false が別々に存在するすばらしい言語
※ただしundefinedは予約語ではない
987デフォルトの名無しさん:2010/12/11(土) 11:04:44
+=だけ許可して=はNGにしたいのですが、どうやって書けばいいのでしょうか?

(1) foo.bar = hoge # NG
(2) foo.bar += hoge # 許可

Bar#+ と Foo#bar= を定義すると(2)はOKですが、(1)も同時にOKになってしまうのですが……
方法はない?
988デフォルトの名無しさん:2010/12/11(土) 11:07:32
>>987
許可も何も、ユーザーがメソッドを使用することを拒否することはできない
紛らわしい書き方するなと赤字で文書に書いておけ
989デフォルトの名無しさん:2010/12/11(土) 11:08:04
<< を使う。
990デフォルトの名無しさん:2010/12/11(土) 11:13:32
まあ別のメソッドを作るとか

class Foo
 def plus(n)
  @bar += n
 end
end
991987:2010/12/11(土) 11:22:53
Rubyの中では
foo.bar += hoge を
foo.bar = (foo.bar + hoge)
で計算してますよね。そうすると代入を禁止することは無理っぽい。
そうだとすると>>989-990が言うように別のメソッドを定義するしかない。

いまいち追加っぽい気がしない?
foo.bar << hoge



992デフォルトの名無しさん:2010/12/11(土) 11:26:11
barの中には何が入ってんだよ
それ言わないとどうにもならんよ
993デフォルトの名無しさん:2010/12/11(土) 11:30:25
barは配列みたいに使う自分定義のクラス(中でC++の拡張ライブラリに飛ぶ)
現在こう書いているのを、
@world.add_child node
こう書きたい。
@world.child += node
でもこう書くのは不可能にしたい
@world.child = node
994987:2010/12/11(土) 11:35:29
なんでRubyは+と=は演算子なのに+=は制御構造なんだよ。
仕様おかしいよ。matz変えてー
995デフォルトの名無しさん:2010/12/11(土) 11:41:15
+と=と+=を全部定義するの面倒くさいから
996デフォルトの名無しさん:2010/12/11(土) 11:43:36
どちらにしろ+=だけ使うような変な使い方は止めた方が良い
四則演算子の定義は、数値を表現するクラス以外で使わない方が良い
997987:2010/12/11(土) 11:56:32
標準の配列も要素を追加するのに+=は使えないしね。
ar = [1,2,3]
ar += 4
./main.rb:8:in `+': can't convert Fixnum into Array (TypeError)
おとなしく << 使うことにします。ありがとうございました。
998デフォルトの名無しさん:2010/12/11(土) 12:25:35
+=の意味で<<使うのはよくなくなくない?
普通は再代入と破壊で意味ちがうし
999デフォルトの名無しさん:2010/12/11(土) 13:06:35
text = ''.tap do |t|
t += い
t += ろ
t += い
t += ろ
end
ってやって、textが '' だったので3分ほど悩んだなぁ。
1000デフォルトの名無しさん:2010/12/11(土) 13:07:26
いや、意味的に += じゃないから、
この場合、<< にしろよ、が正しいと思う
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。