Ruby 初心者スレッド Part 30

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

★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
 なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2デフォルトの名無しさん:2009/08/08(土) 08:24:14
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

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

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

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

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

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

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

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

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

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

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

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

・Ruby 初心者スレッド Part 29
 http://pc12.2ch.net/test/read.cgi/tech/1246593305/
・Ruby 初心者スレッド Part 28
 http://pc12.2ch.net/test/read.cgi/tech/1242436010/
6デフォルトの名無しさん:2009/08/08(土) 09:55:42
あれ
るびまが403で見れない
7デフォルトの名無しさん:2009/08/08(土) 10:12:19
http://doc.loveruby.net/refm/api/view/

はやくなおせゴルァ
8デフォルトの名無しさん:2009/08/08(土) 11:40:46
おい、前スレ>>1000が気になるんだが、これなんのゲーム?
http://pc12.2ch.net/test/read.cgi/tech/1246593305/1000

ローグライクな気がするんだが気になる
9デフォルトの名無しさん:2009/08/08(土) 11:42:56
バージョンに関するよくある質問

Ruby 1.8.5 … レンタルサーバ等にいまだに残ってる古いバージョン
         1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい
Ruby 1.8.6 … 過去の長期政権と数の暴力で一大勢力圏を維持中
         公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ
Ruby 1.8.7 … 1.9 シリーズとのハイブリッドなバージョン、初学者にこそお勧め
         1.9 系から輸入された機能は 1.8.6 では動かないが「1.8.6が許されるのは(AA略」と煽ってよい

Ruby 1.9.0 … 不安定にして先鋭機能が超満載の開発版バージョンだったもの
         1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に
Ruby 1.9.1 … 満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている)
         本体と添付ライブラリの動作は問題がないのだが外部第三者ライブラリが全く追いついていない
         初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中

おまけ

Rubygem 0.x … 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン
          このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に
          しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる
          パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい
10デフォルトの名無しさん:2009/08/08(土) 11:49:28
>>8
なんでも屋という表現が不安だが、投資のシステムから言ってたぶん Elona だろうと思われる
*band の見た目をちょっと綺麗にして非戦闘メインの生活もできるように作ってみたら
*band にハマるような人によってはヤバい依存度になる可能性があるものができたという話

ちなみに HSP 製だが、ファイル構成を見ないと HSP で作ったようには見えない

あと、回答は前者の「商品ページが増えて安い杖から高い杖までずらっと並ぶ(可能性がある)」だ
11デフォルトの名無しさん:2009/08/08(土) 11:59:47
>>9
次スレからテンプレだな
12デフォルトの名無しさん:2009/08/08(土) 12:23:45
Ruby 1.8.7 は
Ruby 1.9の新機能の中であまりにも便利だから、とても自然な機能だから、と言われていたものを
Ruby 1.8.6に追加(フィードバック)したバージョン
13デフォルトの名無しさん:2009/08/08(土) 12:33:39
>>9
> Rubygem 0.x
これって、パッケージで入れた後、gem update --systemでアプデトして使ってるんだけどマズイ?
14デフォルトの名無しさん:2009/08/08(土) 12:35:21
>>10
サンクス Elonaか。昔、延々徹夜でお使いやってて、俺何やってんだろ、と思ったゲームだw
またやってみたくなったわ

スレ違いスマソ
15デフォルトの名無しさん:2009/08/08(土) 12:43:47
>>13
gem --version できちんと最新版なら問題ない
apt を利用してると「apt 経由以外でプログラムを更新するのはやめてください」と言われるというだけ
主張はまったく正しいんだが、そう思うならパッケージの rubygem のバージョンとっとと上げろ(w

 ・ apt は勝手にプログラムが更新されることを許可しない
 ・ rubygem は自力更新がポリシー違反になるシステムを考慮してない

という結果だ
16デフォルトの名無しさん:2009/08/08(土) 13:31:49
>>7

ttp://doc.okkez.net/
でもほぼ同じものが見られますよ。
17デフォルトの名無しさん:2009/08/08(土) 18:09:04
>>15
なるほど、そういうことかサンクス

> パッケージの rubygem のバージョンとっとと上げろ(w
そうだわなww
18デフォルトの名無しさん:2009/08/08(土) 21:04:57
CentOS 5.3 で yum install ruby したら入ったのが 1.8.5 でびびったw
こういう場合野良ビルドもやむなしだわな
19デフォルトの名無しさん:2009/08/08(土) 21:30:14
Debian のtable, ubuntu9.04は 1.87 なんだな
この辺が一番多いのかな。
20デフォルトの名無しさん:2009/08/08(土) 23:00:31
正規表現の範囲指定繰り返し{m}のmの部分に、
\1, \2とかの後方参照を埋め込むことってできませんか?

例えば以下のような文字列strがあって、

str = "2foofoo"

2回fooが繰り返すということを意味しているときに、

str =~ /(\d)(foo){\1}/

というような書き方が0を返すようなことがしたいです。
後方参照の\1を数値の2と解釈させるような書き方ってありますか?
21デフォルトの名無しさん:2009/08/08(土) 23:19:59
むしろできて欲しくない気もするな
数値をマッチさせてそれから正規表現を新規に作るしかあんめえ
22デフォルトの名無しさん:2009/08/08(土) 23:22:43
str = "2foofoo"
str =~ /(\d)/
str =~ /\d(foo){#{$1}}/
=>0

2行に分ければできるけど、1行でできるのかな?
23デフォルトの名無しさん:2009/08/08(土) 23:55:29
>>20です。

>>21
>>22

回答ありがとうございます。

んー、2回に分けないとできなさそうですね。
24デフォルトの名無しさん:2009/08/09(日) 00:24:59
>>20
仮に出来たとしても本来の意味の正規表現の能力を逸脱しすぎてて
逆に気持ち悪い機能だな
25デフォルトの名無しさん:2009/08/09(日) 01:23:12
www::mechanizeに関する質問はスレチですか?
26デフォルトの名無しさん:2009/08/09(日) 01:51:29
(\d)の部分が1-9なら、
/1(foo){1}|2(foo){2}|3(foo){3}|4(foo){4}|5(foo){5}|6(foo){6}|7(foo){7}|8(foo){8}|9(foo){9}/
でいける(マテ
27デフォルトの名無しさん:2009/08/09(日) 01:59:09
> (マテ
28デフォルトの名無しさん:2009/08/09(日) 05:02:53
>>25
別に構わないよ
Rubyでスレ違いになる可能性があるのはRailsの機能を使った場合だけ
それにしたって「Railsスレで聞けバカ」という誘導兼ツッコミが入るだろうし
質問一発目くらいは誰でも大目に見るだろ
2925:2009/08/09(日) 05:09:10
ありがとうございます
じゃあ早速ですがfromのボタンを押すのは
agent = WWW::Mechanize.new
agent.get(uri).form_with(nameとかactionとか){入力する物}.click_button
って形ですよねこのとき、nameが無くてactionも同じformがある場合はどうすれば良いんでしょうか?
30デフォルトの名無しさん:2009/08/09(日) 05:23:08
いくらでも複雑に記述することは可能だが、ごく単純には抽出条件なしの配列を使う
ブロックつきメソッドが動作しないのでメソッドチェーンできないことにだけ注意
Ruby 1.9.1 および 1.8.7 の Object#tap を使えば可能なはずだが、 tap はそういう用途に使うもんじゃねー

# 従来(抽出条件記述が難しい)
 agent.page.form_with(抽出条件){|f|
  f.入力指示
 }.click_button

# 配列版(出現順だけ考える)
 f = agent.page.forms[2]
 f.入力指示
 f.click_button

# 配列要素を tap
 agent.page.forms[2].tap{|f|
  f.入力指示
 }.click_button

Page#forms は、Form オブジェクトを含む配列を HTML 上での <form> の出現順に返す
あくまで配列なので、agent.page.forms[2] は HTML 上での 3 番目のフォームになるぞ
3125:2009/08/09(日) 05:31:34
なるほど、配列だから出てくる順番だけ考えて数を入れてやればいいわけですね。
やってみます。
32デフォルトの名無しさん:2009/08/09(日) 18:48:00
Ruby 逆引きレシピとRuby逆引きハンドブックなら、どちらがおすすめですか?
33デフォルトの名無しさん:2009/08/09(日) 18:51:06
>>32
個人的だが著者的に逆引きレシピをオススメしておく。
34デフォルトの名無しさん:2009/08/09(日) 19:01:47
どうせどっちも読むようになるからどっちも買えというのが答ではあるんだが
逆引きのほうでいいんじゃねえの
35デフォルトの名無しさん:2009/08/09(日) 19:17:40
どっちだよw
36デフォルトの名無しさん:2009/08/09(日) 19:30:51
37デフォルトの名無しさん:2009/08/09(日) 19:51:26
>>35
ワロタw
3832:2009/08/09(日) 22:06:05
>>33
>>36
ありがとうございます。

36さんに紹介していただいたブログを読むと、
どっちも買って損はなさそうなので、両方買うことにしました。
39デフォルトの名無しさん:2009/08/10(月) 00:21:00
知っておくとちょっと得をするもんなにか教えてくれ。

当たり前すぎるが、pp。データ構造を見やすく出力。
40デフォルトの名無しさん:2009/08/10(月) 00:28:25
||= 演算子
rakeの使い方
sortよりsort_byの方が劇的に速い
41デフォルトの名無しさん:2009/08/10(月) 01:08:06
Module0::Class0 を継承して
Module1::Module0::Class0 を作るにはどうすれば?

どうしても無理ならクラス・モジュールの名前変えます。

ダメ元で試したコード:
module Module0
class Class0
end
end
module Module1
module Module0
class Class0 < Module0::Class0
end
end
end

エラー:
NameError: uninitialized constant Module1::Module0::Class0
from (irb):7
from :0

環境:
OS: Ubuntu 5.0
Kernel: 2.6.28-14-generic
ruby: 1.8.7
irb: 0.9.5
42デフォルトの名無しさん:2009/08/10(月) 01:46:15
>>41
名前変えた方がいいと思うけど
class Class0 < ::Module0::Class0
43デフォルトの名無しさん:2009/08/10(月) 02:54:21
>>40
> sortよりsort_byの方が劇的に速い
「sortが遅い場合は」な
44デフォルトの名無しさん:2009/08/10(月) 08:46:23
>>39
hashやstructを構造体みたいな使い方で大量に使う時の注意点
速度: Hash(キーがsymbol) > Struct > Hash(キーがstring) >>>(超えられない壁)>>> OpenStruct
45デフォルトの名無しさん:2009/08/10(月) 10:32:18
ちょっとお聞きしたいのですが、
rubyでのgui開発で、
タブによって選択肢を選んだり、数値を代入して、
それをある形式で複数のテキストファイルに出力することはできますでしょうか。
いままでfortranしか触ったことがないのですが、
guiを作る必要がでてきまして、どのプログラムがいいか選んでいる状態
なのですが、もしよろしければ教えていただけると幸いです。
46デフォルトの名無しさん:2009/08/10(月) 10:40:35
その程度どんなGUIでもできるでしょ
>どのプログラムが・・・
言語から選んでるってこと?
自分が使うだけ(もしくは使う人みんなRuby使い)ならRuby+何かGUIでもいいけど
そうでないならコンパイルして実行形式にする言語を個人的には勧める
47デフォルトの名無しさん:2009/08/10(月) 11:06:09
>>46
ありがとうございます。そういうのはどれでもできるんですね
実行形式できる言語というのをちょっと勉強してみます
48デフォルトの名無しさん:2009/08/10(月) 11:08:24
49デフォルトの名無しさん:2009/08/10(月) 11:25:45
IronRubyはダメ?
50デフォルトの名無しさん:2009/08/10(月) 11:30:18
Ruby中級者であるなら何使ってもよい
初心者がRubyでGUIやるのはただのバカ
51デフォルトの名無しさん:2009/08/10(月) 11:49:28
なんでもそれひとつで済ませられる何か、を求めてこそ
何か最後のひとつ以外を学んだら死ぬ、という呪いをかけられていてこそ
プログラミング初心者

老害は立ち去れ
52デフォルトの名無しさん:2009/08/10(月) 12:02:35
BASIC(接頭詞はなにでもなんでも可)であらゆる全てを作っていたあのころの夢を
今の人たちはRubyに見ているのだよ
53デフォルトの名無しさん:2009/08/10(月) 12:28:22
使いやすいGUIビルダーと、充実した日本語ドキュメントがあれば
もはや「全部Ruby」で問題ないレベルまでは来てるんだけどな
最後に残った二つの関門が大きい

>>45
とにかく動けばいいと言うのなら、VisualBasicあたりをオススメする
後のことを考えてRubyでやりたいのなら
VisualuRuby+FormDesigner、WxRubyあたりを使うのがオススメ
54デフォルトの名無しさん:2009/08/10(月) 12:33:36
>>53
winの話なの?それにしてもC#のほうがいいと思う
55デフォルトの名無しさん:2009/08/10(月) 12:39:29
他のGUI言語でAPIの使い方を学び
その知識を利用してRubyからAPIを直に呼ぶ

というのが基本だと思う
56デフォルトの名無しさん:2009/08/10(月) 17:18:45
Windowsの場合、APIを直に呼べばGUIプログラミングができるってもんでもないしなあ。
ウィンドウプロシージャをWindowsからどう呼ばせるかという最大の問題がある。
57デフォルトの名無しさん:2009/08/11(火) 07:22:00
foo.xxx = foo.xxx + 123
で xxx に何入れても代入できる仕組みってできますか?
property_missingで検索したらGroovyしかヒットしない…
58デフォルトの名無しさん:2009/08/11(火) 07:27:33
Rubyに言語仕様としてのプロパティやアクセサというものは存在しない
あくまで「遠目に見ればそのように見えるかもしれない動作」を
単なるインスタンスメソッドで代用しているに過ぎない

>>57
設計思想自体に何か重大な誤りがあるようにしか見えないが、
とりあえずは foo の属するクラス定義の method_missing の中で分岐書くしかないな
59デフォルトの名無しさん:2009/08/11(火) 08:02:55
「インスタンス変数が初めて使用されたときにアクセサメソッドを定義させることはできませんか」
というような質問は年に何回か見るな
動的言語を名乗ってる以上できても面白そうだが、現行では残念ながらできない

クラス設計者が @foo = 100 とする代わりに毎回 instance_variable_initialize(:foo, 100) と書くようにする、みたいな
予防法的なめんどくさい手順しか思いつかん
あ、 instance_variable_initialize は自作してね
60デフォルトの名無しさん:2009/08/11(火) 09:13:07
OpenStructは?
61デフォルトの名無しさん:2009/08/11(火) 09:16:51
そのへんは
> foo.xxx = foo.xxx + 123
を実現するということがどんだけ重要で取替不可かによるな
これの実現のためにどんだけの不便を強いる覚悟があるかみたいな
62デフォルトの名無しさん:2009/08/11(火) 10:01:18
>>59はostruct.rbを写経してこい
63デフォルトの名無しさん:2009/08/11(火) 10:58:56
>>57
デフォルトの値が0っぽいから…
fooのクラスがFooとすると
class Foo
def initialize
@vals=Hash.new(0)
end
def method_missing(name,*args)
x=name.to_s
if name[-1..-1]=='=' then
@vals[name[0..-2]]=args[0]
else
@vals[name]
end
end
end

これでよかろうか(引数の数の検証は自分で書いてちょ)
64デフォルトの名無しさん:2009/08/11(火) 12:16:11
class ZeroStruct < OpenStruct
def initialize(*) super; @table.default = 0; end
end

foo = ZeroStruct.new
65デフォルトの名無しさん:2009/08/11(火) 14:03:30
vim使っている人ってマイナーな人?
それともメジャー?

オススメってある?
66デフォルトの名無しさん:2009/08/11(火) 14:05:22
エディタの話題は荒れるって
67デフォルトの名無しさん:2009/08/11(火) 14:26:38
小学校の野外授業の注意プリントみたいだが、普段使っているものでよい
Rubyのためだけに新規操作を覚えるとかマジキチ
68デフォルトの名無しさん:2009/08/11(火) 14:34:15


  ┏┳┳┓     ハイ.     ┏┳┳┓
┏┫┃┃┃ .エディタの話は ┃┃┃┣┓
┃┃┃┃┣┓   ここまで ┏┫┃┃┃┃
┃      ┃┃┏━━━┓┃┃      ┃
┃スレチ   ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━━┫  ┗━┓
.             ┗━━━┛
69デフォルトの名無しさん:2009/08/11(火) 14:34:50
AA厨うぜえ
70デフォルトの名無しさん:2009/08/11(火) 14:38:00
厳密には「アスキー」アートではない。
71デフォルトの名無しさん:2009/08/11(火) 14:38:21
ほら荒れた
72デフォルトの名無しさん:2009/08/11(火) 14:41:48
×荒れた
○荒らした
73デフォルトの名無しさん:2009/08/11(火) 14:44:31
専門板といえども、数行程度の目障りでないAAなら構わないと思うのだが。
それが嫌なら何で2chにいるの?
2ch以外にもコミュニティはあるよ?
74デフォルトの名無しさん:2009/08/11(火) 14:49:14
>>42
Thx!
75デフォルトの名無しさん:2009/08/11(火) 16:37:25
久々に伸びてると思ったらこの内容かw
気に入らないレスをスルーできないと
(掲示板を利用するのは)難しい
76デフォルトの名無しさん:2009/08/11(火) 16:39:38
そもそもコピペでしか喋れない人間に価値はない
77デフォルトの名無しさん:2009/08/11(火) 16:50:59
>>76
「そもそも」の使い方間違ってるぞ
スレの流れに沿って喋れない人間には価値が無いんだよ、これが
78デフォルトの名無しさん:2009/08/11(火) 16:54:25
Matz曰く「Vimは史上最も無意味なプロジェクト」

ぼくの Vim への憎悪が意味するのは、ぼくが Vim のことを史上最大の
無意味なプロジェクトだと見ているということだ。
Vim がしばらくの間スローガンにしていたのに、
「ちゃんとした Vi」みたいなのがあったよね。
そんなスローガンでスタートしたら、もうどこにも行くところがない。
Vi をちゃんとすることなんて不可能だからだ。
79デフォルトの名無しさん:2009/08/11(火) 17:05:26
>>78
それウケると思ったの?
80デフォルトの名無しさん:2009/08/11(火) 17:10:51
>>76
>>78のことかw
81デフォルトの名無しさん:2009/08/11(火) 17:15:09
>>78
s/Vim/Emacs/g にしてもあまり違和感がないと思うのは俺だけ?w
82デフォルトの名無しさん:2009/08/11(火) 18:38:49
LinusがSubversionについて言った発言
83デフォルトの名無しさん:2009/08/11(火) 18:42:24
つまんねーよ
84デフォルトの名無しさん:2009/08/11(火) 21:38:18
ruby使いって性格最悪な人多いですね^^
85デフォルトの名無しさん:2009/08/11(火) 22:11:09
ID出ないから自演し放題
86デフォルトの名無しさん:2009/08/12(水) 09:31:23
http://www.skuare.net/2007/07/ruby_5.html
の一行掲示板にescapeをかけたいのですが,
表示部分を#{CGI.escapeHTML(message)}とすると,
改行したい<br>まで出力してしまいます.
単純に使い方わかってないこともありますが,ご指摘お願いします.
87デフォルトの名無しさん:2009/08/12(水) 10:01:32
>>78
s/Vim/Ruby/g にしてもあまり違和感(ry
88デフォルトの名無しさん:2009/08/12(水) 10:03:39
>>86
escapeしたいのは何故?
escapeしたいものは何?
89デフォルトの名無しさん:2009/08/12(水) 10:47:21
>>86
#!/usr/bin/ruby -Ke
require 'cgi'
require 'kconv'
# 仕様:1行掲示板なのでユーザーはHTMLタグを使えず、改行の自動置換等も行わない
# ログファイルがプレーンテキストでなくてもいいなら、ファイルにエスケープしたものを保存したくない
logfile = 'bbs_test.log'
log = File.open(logfile ,'r'){|f| f.read} rescue ''

post = CGI.new["datapost"]
if post
log = CGI.escapeHTML(post.toeuc) + "<br>\n" + log # postデータを追加
File.open(logfile, 'w'){|f| f.print(log)}
end

print "Content-type: text/html\n\n"
print <<EOF.toeuc
<html>
<head>
<title>rubyで一行掲示板</title>
</head>
<body>
<form method="POST">
一言:<input type="text" name="datapost">
<input type="submit" value="送信">
</form>
<hr>
#{log}
</body>
</html>
EOF
90デフォルトの名無しさん:2009/08/12(水) 10:48:18
>>86
1. messageを行ごとに分解
2. 行ごとにescapeHTMLする
3. 行末に<br>をつける
4. 出力する

という処理をする必要があるんじゃないかな。

def text2html(str)
str.collect {|line| CGI.escapeHTML(line).sub(/$/, '<br>') }.join()
end

#{text2html(message)}


とかでどうでしょうか。
91デフォルトの名無しさん:2009/08/12(水) 11:02:58
>>89
面影残ってねえ
92デフォルトの名無しさん:2009/08/12(水) 11:18:51
>>91
いまだに cgi-lib を使ったままのスクリプトを再利用してやる義理はねえよ

irb> require 'cgi-lib'
Warning:(irb):1: cgi-lib is deprecated after Ruby 1.8.1; use cgi instead
true
irb>
93デフォルトの名無しさん:2009/08/12(水) 11:43:55
>>90
やってみましたが,変わりありませんでした..
94デフォルトの名無しさん:2009/08/12(水) 11:46:32
>>92
これは元記事がそもそもかなり悪いな
わざわざ悪いやり方で学ぶ必要もあるまい
95デフォルトの名無しさん:2009/08/12(水) 11:54:59
Ruby ユーザは CGI を書くなと言いたい (c) 弾
96デフォルトの名無しさん:2009/08/12(水) 12:25:18
不足なのなら順に説明すればいいんじゃね夏休み、と思ったが 1ページ目であっさり挫折した
ttp://www.skuare.net/2007/06/ruby_1.html

CGI の入力・出力構造は基本的に通常のスクリプトと変わらない
ブラウザからのデータをサーバが解釈した環境変数 QUERY_STRING の中身が標準入力に既に入っていて
標準出力を行うとユーザーに送る HTML などのデータとみなされてサーバが一旦受け取るという違いしかない

ただ、環境変数 QUERY_STRING を直接アクセスすることは今となってはまず無い
たいていは適度に使いやすく変換してくれる肩代わりライブラリ、Ruby では標準添付の cgi 、を使う

Web ブラウザは、HTML 上の送信ボタンが押されたときには、そのボタンを含む FORM 要素の
INPUT 要素や TEXTAREA 要素の name 属性と value 属性をペアにしてまとめ、適当にエンコードしてサーバに送る
上記サイトでは HTML 上で value が省略されているが、普通にユーザーが入力すればその値が value としてサーバに送られる

そして、サーバが受け取ったデータというのは通常
 name1=値1&name2=値2…
というようなひと連なりのテキストというか英数字記号の巨大な塊となっている
これをいちいち安全かつ適切に自力分解復元するのは面倒だし不安なので、 cgi ライブラリにその仕事をやってもらう
CGI.new とすると QUERY_STRING が読み込まれ、わかりやすく分解されて、[ ] メソッドで参照できるようになる
たとえば HTML 上で name1 だった入力欄の値を利用したい場合は

 cgi = CGI.new
 cgi['name1']

とすればよい
なお、標準出力はサーバが全て受け取るので、何かをユーザー向けに表示させたい場合は、
本来 Web サーバが行っていたことも全て自力でする必要がある(CGI はそういうふうになっている)
HTML を表示したいのなら、 サーバが自動で行っていた Content-Type という HTTP ヘッダ等の表示も自前で行わなければならない

 print "Content-type: text/html\n\n"

CGI#out のブロックで括るとこれを自動で行ってくれるのだが、まあそれは別の話
97デフォルトの名無しさん:2009/08/12(水) 13:02:32
まずCGIの仕様をちゃんと紹介すべきだろう。
98デフォルトの名無しさん:2009/08/12(水) 13:03:48
小飼先生が猛然とアップを始めました
99デフォルトの名無しさん:2009/08/12(水) 13:20:22
>>96
標準入力経由でQUERY_STRINGを渡したり
標準出力への出力が勝手にHTMLとみなされるWebサーバなんてあるの?
100デフォルトの名無しさん:2009/08/12(水) 13:25:29
まあ、作ればあるんじゃないかねえ
101デフォルトの名無しさん:2009/08/12(水) 13:41:41
とりあえずあれだ、QUERY_STRING は HTTP GET で、標準入力は HTTP POST だ
そういやなんでわざわざ分けたんだろうな、これ
GET も POST も全部標準入力に渡せばよかったんじゃねーかと思うんだが、当時なんかあったのか
102デフォルトの名無しさん:2009/08/12(水) 14:37:04
RESTでこのあたりの考えが再認識されてるけど、本来の意図は、

GETはリソースを取りに行くメソッド。
リソースの位置(※)を特定する情報としてquery stringが付く。

POSTは指定リソースに対して新たなリソースを作成させるメソッド。
作成する情報はリソースの位置(※)ではないのでURLのquery stringで
はなくHTTPリクエストのBODYで指定する。

※ URL = Uniform Resource Locator



103デフォルトの名無しさん:2009/08/12(水) 16:51:40
文字列をマッチするときに
=~ の右辺を別ファイルから参照させたいんだけど,どうすればいいですか?
104デフォルトの名無しさん:2009/08/12(水) 16:54:57
いまいち質問がよくわからんけど
re = Regexp.new("$d+")
if s =~ re
みたいにすれば動的に正規表現作れる
105103:2009/08/12(水) 17:48:43
例えば word.txtのなかに
apple
banana
cat

が入っていて,それが今後どんどん追加されていくときに
=~の右辺がwordのなかを一行ずつ読み込んでマッチしているか確認してほしいのです.


>>104
$dは特殊変数かなにかですか?
106デフォルトの名無しさん:2009/08/12(水) 17:53:34
だからマニュアルか解説本くらい読めよ
たいてい書いてあるからさ

文字列を正規表現オブジェクトにする方法はいくつかある
リテラルとして直接書き込む方法
 /hoge/
変数として // 内で展開する方法
 str = "hoge"
 /#{str}/
Regexp オブジェクトの明示的な生成
 Regexp.new("hoge")

好きなの選べ
107デフォルトの名無しさん:2009/08/12(水) 18:02:47
>>106
すいません.wordの中をgetsで取得しながらやってみます.
ありがとうございました.
108デフォルトの名無しさん:2009/08/12(水) 18:44:30
>>105->>107

なにか話がすれちがっている気がする
>>103
ストップワードっていう奴ににているのかな?それを用意しておきたいの?

109デフォルトの名無しさん:2009/08/12(水) 18:51:43
/¥b#{Regexp.union(File.read('words.txt').split)}¥b/
という話?
110デフォルトの名無しさん:2009/08/12(水) 18:52:55
あああ、yen になってしまった。 ¥ ← これもなっちまうかな……
111デフォルトの名無しさん:2009/08/12(水) 19:51:19
Regexp#=~とString#=~両方あるから右辺ってのが何かピンとこない
112デフォルトの名無しさん:2009/08/13(木) 02:00:02
子飼団って、堀江もんの仲間で情弱のマカだった様な。
113デフォルトの名無しさん:2009/08/13(木) 04:48:18
>>112
なんでそんなに悔しがってるの
114デフォルトの名無しさん:2009/08/13(木) 05:48:28
ビョーキの人にだけ悔しがってるように見える書き方をしたから。
115デフォルトの名無しさん:2009/08/13(木) 07:17:45
× ビョーキの人にだけ悔しがってるように見える書き方をしたから。
○ おちんちんびろーん
116デフォルトの名無しさん:2009/08/13(木) 07:22:05
>>115
なんでそんなに悔しがってるの
117デフォルトの名無しさん:2009/08/13(木) 07:36:36
おちんちんびろーん
118デフォルトの名無しさん:2009/08/13(木) 08:06:20
おまんまんがばーん
119デフォルトの名無しさん:2009/08/14(金) 03:40:25
WinXPで1.8.6のwin32oleで、Excelよりデータの取得をする場合で質問です。

例えば、A1 〜 A5 を取得するには cells = sheet.Range("A1:A5") と書きますが、
データがある領域の全域を指定するにはどうしたら良いでしょうか?

行と列の数が5x3程度なら大したこと無いのですが、複数のシートが数千行x数十列の
データを持っている場合だと毎回スクロールして端の位置を確認しなければならず不便です。
どなたかよろしく願います。
120デフォルトの名無しさん:2009/08/14(金) 04:58:36
VBAの知識はあると仮定
「Excal シートの端」でぐぐったここ
ttp://oshiete1.watch.impress.co.jp/qa4146366.html
121デフォルトの名無しさん:2009/08/14(金) 07:00:34
http://pc12.2ch.net/test/read.cgi/tech/1137771139/
【OLE】オートメーション総合スレ【ActiveX】
122デフォルトの名無しさん:2009/08/14(金) 11:48:54
子飼団ってtwitterで、「いくぞ、ちんこぉぉぉぉぉぉぉぉぉぉぉぉ」とか、
「わしはでかいがあそこは小さい」とか「オ、オオオ、オ、奥野、奥野、奥野の肛門カッカッカカカツカヤツヤクカツ括約筋、ヒャー!」 」
とか言ってた奴だろ?下品すぎる信用できない
123デフォルトの名無しさん:2009/08/14(金) 13:54:57
>>120,121
さんくす
VBAの要領でできるんですね。
124デフォルトの名無しさん:2009/08/14(金) 14:43:17
Ruby通さないほうが書きやすいし正確だし速いんじゃね、とか思ったらこの支配からの卒業
125デフォルトの名無しさん:2009/08/15(土) 00:01:21
>>122
酒飲んでたとしたら許せるレベルだな。
括約筋ごときで下品って言ってどうする。

ゴルゴ13は、マンガの中で
女スパイとエッチして、
「この括約筋はロシア女だな」と
スパイの母国を言い当てたんだぞw
126デフォルトの名無しさん:2009/08/15(土) 05:00:39
自演醜い
127デフォルトの名無しさん:2009/08/15(土) 05:02:35
ここまで全部電網親方の自演
128デフォルトの名無しさん:2009/08/15(土) 08:11:07
>>125
上と下のレスのつながりがわからんw
129デフォルトの名無しさん:2009/08/15(土) 08:16:31
下品な話はぴんくちゃんねるでどうぞ
130デフォルトの名無しさん:2009/08/15(土) 16:08:48
Ruby1.9系でシーザー暗号プログラムを作っています。
1.8では文字列配列をFixnumとして扱えましたが1.9ではStringが帰ってきます。
今、each_byteを使ってますがもっとスマートな方法を教えてください
131デフォルトの名無しさん:2009/08/15(土) 16:16:37
メールヘッダのMIMEエンコードはRubyではどうするのでしょうか?
Perlでいう以下です。

use Encode;

$text = "あ"; #ソースコードはcp932
Encode::from_to($text, "cp932", "MIME-Header-ISO_2022_JP");
print $text; #=>=?ISO-2022-JP?B?GyRCJCIbKEI=?=
132デフォルトの名無しさん:2009/08/15(土) 16:57:03
>>131
text = NKF.nkf('-M','あ')
133デフォルトの名無しさん:2009/08/15(土) 17:14:27
>>132
d
134デフォルトの名無しさん:2009/08/15(土) 17:32:39
>>130
文字列配列をFixnumで扱うのくだりがさっぱりわからんが、
Ruby1.8のStringはたまたまバイト列だっただけだ
バイト列として扱いたければeach_byte等で回せ
135デフォルトの名無しさん:2009/08/15(土) 19:31:18
1.9はpack unpackも使えないのか?
136デフォルトの名無しさん:2009/08/15(土) 23:23:59
>>130
str.tr("A-Z", "B-ZA")
137デフォルトの名無しさん:2009/08/15(土) 23:32:30
>>135
普通に使えるよ。
138デフォルトの名無しさん:2009/08/16(日) 04:39:04
>>130です
"aaaa".bytes.to_a[2]
のような形で、同じようなことができるようです。答えてくださったかたありがとうございました
139デフォルトの名無しさん:2009/08/16(日) 05:47:38
スマートには見えんのだが…
140デフォルトの名無しさん:2009/08/16(日) 06:04:49
子飼団ってテレビとかに出てるくらいだから本来下衆でしょ。まともなら低能なマスゴミとは距離を置いてる。
141デフォルトの名無しさん:2009/08/16(日) 06:16:40
>>139
ホワイラーなんだと思う
142デフォルトの名無しさん:2009/08/16(日) 06:31:12
>>139
http://codepad.org/rgAGQvq5

別に代入する所もいらないし、trと違って任意の数だけ進められる
143デフォルトの名無しさん:2009/08/16(日) 07:16:44
str.unpack('C*').collecgt {|x| x+i}.pack('C*')
なら1.0でも1.9でも動く
144デフォルトの名無しさん:2009/08/16(日) 20:07:42
質問です。
使用している端末エミュレータの高さ(行数)を取得するには
どうすればいいのでしょうか?
145デフォルトの名無しさん:2009/08/16(日) 20:09:55
146144:2009/08/16(日) 22:44:47
>>145
ありがとうございます。
Curses::lines でいけました。
147デフォルトの名無しさん:2009/08/17(月) 00:26:17
class Parent
attr_accessor :foo
end
class Child < Parent
#...
end

という継承関係がある時、Childクラスではfooアクセッサーを
削除したいのですが、どうすればよいのでしょうか。
具体的に書きますと以下のように例外が発生してほしいです。

child = Child.new
p child.foo #=> 例外発生!
148デフォルトの名無しさん:2009/08/17(月) 00:39:58
Rubyにアクセサは存在しない
ただのメソッドだ

ということを踏まえると

class Parent
attr_accessor :foo
end
class Child < Parent
undef :foo
end

Child.new.foo

NoMethodError: undefined method `foo' for #<Child:0xb7d42530>
from (irb):8
from :0
149デフォルトの名無しさん:2009/08/17(月) 00:46:40
リスコフの置換規則に違反することになるかもしれないが、undef_method :foo, :foo= というのがある。
150デフォルトの名無しさん:2009/08/17(月) 00:56:53
>>143
http://codepad.org/QlJCG6Ry
できました。ありがとう
151デフォルトの名無しさん:2009/08/17(月) 03:31:00
リスコフなんて糞くらえ。
ってか変数に型が無い言語で継承するって、実装の継承しか無いんだから
undefでも好き勝手にしたらいいと思う。

え?俺OO分かってない?
152デフォルトの名無しさん:2009/08/17(月) 04:29:32
>>147の要求の時点でLSP無視なんだから何やっても構わんよ
特定のメソッドの有無に意味を持たせようとすること自体が邪悪
153デフォルトの名無しさん:2009/08/17(月) 10:10:02
> Rubyにアクセサは存在しない
このへんは後々尾を引いてくると推測
154デフォルトの名無しさん:2009/08/17(月) 10:15:23
特定のメソッドの有無こそがオブジェクトの本質ぢゃないか。
155デフォルトの名無しさん:2009/08/17(月) 10:20:24
Rubyにアクセサは存在しないっつーか、
アクセサは、作るもの(用意するもの)なんじゃねーの?
あるメソッドがアクセサかどうかというだけで。
156デフォルトの名無しさん:2009/08/17(月) 10:45:20
アクセサというシステム的なナニカがあるわけではない、という程度の意味なような気もする

たとえば、Object#accessors でアクセサメソッドの一覧が返るとか
def hoge と def hoge= と attr_reader :hoge と attr_writer :hoge を全部定義しても
hoge() と hoge=() と hoge と hoge= で全部別個に使い分けが可能だとか
157デフォルトの名無しさん:2009/08/17(月) 14:34:53
リファレンスマニュアル FAQより

http://www.ruby-lang.org/ja/man/html/FAQ_A5E1A5BDA5C3A5C9.html

> 5.4 オブジェクトのインスタンス変数を外から参照できますか
> 直接はできません。あらかじめそのオブジェクトにインスタンス変数を参照するためのメソッド (アクセサと言います)
> を定義しておく必要があります。たとえば以下のようにします。

メソッドとアクセサは同じレベルの概念じゃないだろ
158デフォルトの名無しさん:2009/08/17(月) 14:44:57
大変だ、>>157だけが明後日の方向に
159デフォルトの名無しさん:2009/08/17(月) 15:05:41
アクセサってのはインスタンス変数へのアクセスを提供する何かであって
それが言語によってメソッドだったり属性参照式だったりするということじゃないの?
160デフォルトの名無しさん:2009/08/17(月) 15:35:17
>>158
おまえが理解できてないだけだ
161デフォルトの名無しさん:2009/08/17(月) 16:08:04
だからさ、>>148が悪いんだよ
162デフォルトの名無しさん:2009/08/17(月) 16:11:43
「Rubyにはアクセサという機構は存在せず、メソッド定義で代用する」
「定義の簡便のためにattr*系のメソッドがあるが、メソッド定義以上のことを期待するのは勘弁してください」

こう書けばよかったんだな
163デフォルトの名無しさん:2009/08/17(月) 16:44:41
>>162が想定する他の言語のアクセサってどんなの?
164デフォルトの名無しさん:2009/08/17(月) 16:46:42
アクセサが言語レベルで実装されてる言語なんてあるのか?
165デフォルトの名無しさん:2009/08/17(月) 16:48:22
def attribute=(value)

これって明らかにアクセサ用の機能だろ
166デフォルトの名無しさん:2009/08/17(月) 16:58:35
初心者ですがまったく話がわかりません
167デフォルトの名無しさん:2009/08/17(月) 17:01:10
確かに、メソッド名の最後に(だけ)は = が使えるとか、
obj.foo = bar が obj.foo=(bar) の意味である、だとか、
言語レベルの機能だよな。
168デフォルトの名無しさん:2009/08/17(月) 17:34:33
テストファイルで Enumerable を拡張してるんですが、これってテストにならないですよね?
169106.79-160-162.customer.lyse.net:2009/08/17(月) 17:53:40
自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L

名言集 その3
『いつもサボってばかりのキャップがウゼえ』

http://yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ ID:PVAf+dux0 = 自動焼人 ★
> 71 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:58:57.28 ID:PVAf+dux0
> >>69
> 大変って言うか
> 毎日、報告されたのを見て、判断して、処理して、完了報告して、以下ループ。
> ちょっとでもミスすると、普段は作業もしてないキャップさんたちがさんざん文句言ってきて
> その言いわけを考えないと、キャップはく奪されたりアカウント凍結されたりするから
>
> 登録されてから一年以上経って、やっといいたいこと言えるようになってきたよ。



----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください
170デフォルトの名無しさん:2009/08/17(月) 20:35:18
Array#include?だと指定した値と等しい要素がある場合trueを返しますけど、
等しい要素数を返すにはselectで条件を満たす要素だけとりだしてそれのsizeを調べるしかないでしょうか?
171デフォルトの名無しさん:2009/08/17(月) 20:52:31
>>170
その通りです。

便乗して質問させて下さい。
include? ってなんで Array で再定義してるんでしょうか?
Enumerable#include? とは違う実装になってるんでしょうか?
172デフォルトの名無しさん:2009/08/17(月) 20:53:08
まあ基本的にはそう
grepしてもいいが、「一致する要素の数」というのを直接返すメソッドはない
というかもしあったとしても内部でfind_allしてsize求めるはず
173デフォルトの名無しさん:2009/08/17(月) 20:58:51
例として非nilを数える場合
[true,false,1, "a",nil,nil].inject(0){|r, i| r += (!i.nil?) ? 1 : 0}

書いてみたはいいけど汚いなぁ
174デフォルトの名無しさん:2009/08/17(月) 21:11:12
>>171
rb_ary_includesが遅いと困るからきちんと作ったのだと推測
175デフォルトの名無しさん:2009/08/17(月) 21:16:15
NTFSの副ストリームって対応してる?
176デフォルトの名無しさん:2009/08/17(月) 21:19:19
>>174
なるほど。Array#include? をネイティブに書いて少しでも性能をだそうとした
ということですね。

でも。。今 ruby-1.9.1-p129 の array.c 見てみたんだけど、すごく当たり前な
実装なんですね。
この程度でもネイティブ化すると結構速くなるものなんですかね?
177デフォルトの名無しさん:2009/08/17(月) 21:22:49
わざわざEnumerableで定義したのを探してアクセスする時間が惜しいからそばに入れたんじゃね

>>175
Windows版Rubyとして何かをしたという話は聞かない
コンパイルしたときに自動で何かがどうかできるのなら対応してるかも
178デフォルトの名無しさん:2009/08/17(月) 21:25:45
>>175
これで足りる?
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

open('foo.txt', 'w'){|f| f.write('in foo.txt') }
open('foo.txt:sub', 'w'){|f| f.write('in foo.txt:sub') }

puts File.read('foo.txt')
puts File.read('foo.txt:sub')
179デフォルトの名無しさん:2009/08/17(月) 21:44:20
>>173
低脳死ねカス
[true,false,1, "a",nil,nil].cmplact.length
180デフォルトの名無しさん:2009/08/17(月) 21:49:39
>>179
低能氏ねカス
s/cmplact/compact/
181デフォルトの名無しさん:2009/08/17(月) 21:54:05
cmplact?
182デフォルトの名無しさん:2009/08/17(月) 21:54:11
length厨はマジでどうにかならんものか
183デフォルトの名無しさん:2009/08/17(月) 21:58:14
size の方が好きなのけ?
184デフォルトの名無しさん:2009/08/17(月) 21:58:26
>>170
sizeを調べる「しかない」わけではない。
cnt = 0
array.each {|x| cnt += 1 if some_condition(x) }
puts cnt
あまり美しくないけど、どうぞ。
185デフォルトの名無しさん:2009/08/17(月) 22:12:45
質問です。
SGEをダウンロードしたいのだけれども、
http://www.etek.chalmers.se/~e8cal1/sge/index.html
がNOT FOUNDになります。
いま、SGEはどこでダウンロードできますか?
186デフォルトの名無しさん:2009/08/17(月) 22:27:53
用途によって変えるっていう当たり前の答えが返ってくるとは思うけど・・・・


ary=["hage","hige","huge","hege","hoge"]
の要素数を出力したいときに
p ary.size
これはaryを後で別の処理が行われると思われる場合でしょ

んで、
p ["hage","hige","huge","hege","hoge"].size
これは確認したい時だけでしょ

んで、
ary_num=ary.size
p ary_num
ってやってる人がいるんだけど,これは変数が説明になってるってこと?

どの段階で処理したものを変数に入れるかってのがわかんない。好き好きかな?
187デフォルトの名無しさん:2009/08/17(月) 22:44:15
>aryを後で別の処理が行われると思われる場合
これは

["hage","hige","huge","hege","hoge"]
の要素数を出力したいときに
ary = ["hage","hige","huge","hege","hoge"]
p ary.size

という感じ
aryに代入するのが前提なら、一番目は最も素直

二番目は主に説明・動作確認・デバッグで使われる
代入するのもめんどくさいとかスペース減らしたいとかそういうのが主な理由

三番目は正直くどい
でも説明以外にも値をキャッシュしておきたいケースはあるし、そういう時には避けられない
188デフォルトの名無しさん:2009/08/17(月) 22:45:40
二番目は説明というかスレや記事とかでの解説だった
189186:2009/08/17(月) 23:03:10
>>187-188
2番めと3番めの説明がわかりやすかったです。ありがとうございます。
190デフォルトの名無しさん:2009/08/18(火) 00:40:37
>>180
低脳死ね。タイプ量が多い
s/l//
191デフォルトの名無しさん:2009/08/18(火) 00:54:11
>>190
低脳死ね。置換できてない。
cmplact => cmpact

正しくは
compact
 ^
192チンパンジー愛ちゃん:2009/08/18(火) 02:24:08
>>191
うきっきーきーきぃっ
193デフォルトの名無しさん:2009/08/18(火) 05:15:32
>>185
質問するスレ間違ってね?
まあいいや、ここ行ってみ
ttp://www.archive.org/
194デフォルトの名無しさん:2009/08/18(火) 09:49:05
>>175
C:\> dir a.txt
(略)
2009/08/18 09:46 0 a.txt
(略)

C:\> ruby -e "open('a.txt:foo', 'w'){|f| f.write 'abc'}"

C:\> dir a.txt
(略)
2009/08/18 09:46 0 a.txt
(略)

C:\> ruby -e "p IO.read('a.txt:foo')"
"abc"
195デフォルトの名無しさん:2009/08/18(火) 14:13:54
くだらない質問だと思いますが、文字列
a = "001011"
b = "000111"
から
c = "000011"
を求める(論理積?)にはどうしたら良いのでしょうか?
196デフォルトの名無しさん:2009/08/18(火) 14:25:39
irb> a = "001011"
irb> b = "000111"
irb> ax = a.split(//n)
irb> bx = b.split(//n)
irb> p (0..5).to_a.map{|i| ax[i].to_i & bx[i].to_i}.join
"000011"
197チンパンジー愛ちゃん:2009/08/18(火) 14:30:51
def and_str(a, b)
return (Integer(a) & Integer(b)).to_s(2)
end
198チンパンジー愛ちゃん:2009/08/18(火) 14:33:05
def and_str(a, b)
return (Integer("0b" + a) & Integer("0b" + b)).to_s(2)
end
199デフォルトの名無しさん:2009/08/18(火) 14:38:04
>>196
1.9 だけでいいなら a[i] で分割いらないんだけどな
どっちでも動作させるならまだ split がスレ的に無難か
めんどい負の遺産じゃのう
200195:2009/08/18(火) 14:45:00
>>196-199
ありがとうございました! 196が自分には理解しやすい一方、
198の方が速そうに見えるのですが(こちらはpaddingが必要ですね)
大量のデータを処理する際には、違いが出るでしょうか。
201デフォルトの名無しさん:2009/08/18(火) 14:56:25
100万桁を0.5秒で処理しないと銃殺されるとかそういう時にはチェックが必要
202195:2009/08/18(火) 15:03:24
そこまで深刻じゃないので、また両方試してみます!
203デフォルトの名無しさん:2009/08/18(火) 15:21:38
ハッシュがよくわからなくなったので質問させていただきます

h={"ja"=>{"a"=>1,"b"=>1,"c"=>0},
"usa"=>{"a"=>0,"b"=>0,"c"=>0}
}
となって次に
"usa"=>{"a"=>1,"b"=>1,"c"=>0}が出たら

h={"ja"=>{"a"=>1,"b"=>1,"c"=>0},
"usa"=>{"a"=>1,"b"=>1,"c"=>0}
}

となってほしいのですが,どうすればいいでしょうか?

説明が分かり辛いですが・・・
ループ内にハッシュのキーが一致したら加算していってほしいのです
204デフォルトの名無しさん:2009/08/18(火) 15:25:02
>>170
1.8.7以降なら Enumerable#count(obj)
205デフォルトの名無しさん:2009/08/18(火) 15:29:26
>>203
とりあえず usa = {"a"=>1,"b"=>1,"c"=>0} を h["usa"] に加算する場合
h["usa"].merge!(usa) { |k, s, d| s += d }

{ "usa" => {"a"=>1,"b"=>1,"c"=>0} } でやりたいなら適当にネストさせて
206デフォルトの名無しさん:2009/08/18(火) 15:30:16
代入いらねーよorz
h["usa"].merge!(usa) { |k, s, d| s + d }
207デフォルトの名無しさん:2009/08/18(火) 15:37:29
>>198
def and_str(a, b)
sprintf("%.*b", [a.length, b.length].max, (a.to_i(2) & b.to_i(2)))
end
208デフォルトの名無しさん:2009/08/18(火) 15:43:26
>>203
最初はとにかくやりたいことをそのまま書くといい
多くの場合、そのまま実行しても充分に速い

def add(base, key, val)
if tgt = base[key]
val.each_pair do |k,v|
if tgt[k] then
tgt[k] = tgt[k] + v
else
tgt[k] = v
end
end
else
base[key] = val
end
end

h={"ja"=>{"a"=>1,"b"=>1,"c"=>0},
"usa"=>{"a"=>0,"b"=>0,"c"=>0}
}
add(h, 'usa', {"a"=>1,"b"=>1,"c"=>0})
p h


{"ja"=>{"a"=>1, "b"=>1, "c"=>0}, "usa"=>{"a"=>1, "b"=>1, "c"=>0}}
209203:2009/08/18(火) 16:27:26
>>205-206,>>208
ありがとうございます。mergeを使ったりやaddを定義するのですね。

本当は
require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
hc =Hash.new(0)

b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
pp b
b.each {|count| hin[count] +=1}
hout[ary[i]] = hin
puts "@@@"
pp hout
puts "@@@"

}
pp hout

こんなことをやってます。
最後の pp houtが自分の思ったものと違っていて悩んでいます.
完全質問だと悪いと思って203で質問しました。
210デフォルトの名無しさん:2009/08/18(火) 19:12:53
ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError)

どうしたらいいんでしょう><
211デフォルトの名無しさん:2009/08/18(火) 20:02:54
>>210
正しいMeCabバインディングを使う
Taggerは今SourceForgeにあるMeCabバインディングをそもそも知らない
212デフォルトの名無しさん:2009/08/18(火) 20:48:35
>>211
hm..
ってことはMeCabがバージョン9.07ではダメってことで、
古いバージョンのMeCabでおk って解釈でいいんですかね?
213デフォルトの名無しさん:2009/08/18(火) 21:08:14
6年前のな
214デフォルトの名無しさん:2009/08/18(火) 21:17:36
MeCab本体とMeCabライブラリは違う
215デフォルトの名無しさん:2009/08/18(火) 21:25:58
ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError)
Possible C/C++ prototypes are:
Tagger.new(char const *argc)
Tagger.new()

少しいじった結果エラーログがこうなりました・・。
これはスクリプト書き換えとかで回避できないんでしょうか?
216203:2009/08/18(火) 21:30:24
>>205->>206,>>208さんのもの自体は理解できたのですが,
やはり>>209での問題が解決しませんでした.
ハッシュのハッシュのvalueを加算していきたいのですが助言お願いします.
217デフォルトの名無しさん:2009/08/18(火) 21:57:11
どんな値が返ってくれば正解なのかすら知らせずに丸投げとな

require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window = 6
hout = Hash.new
ary.size.times do |i|
b = ary[i + 1, window].delete_if{|w| /#{ary[i]}/ =~ w}
b.each do |w|
hout[w] = 0 unless hout[w]
hout[w] += 1
end
end
pp hout


{"w1"=> 10, "w2"=> 9, "w3"=> 11, "w4"=> 9, "w5"=> 6}
218デフォルトの名無しさん:2009/08/18(火) 22:02:04
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window = 6
hout = Hash.new
ary.size.times do |i|
ary[i+1, window].each do |w|
next if /#{ary[i]}/ =~ w
hout[w] = 0 unless hout[w]
hout[w] += 1
end
end
pp hout
219デフォルトの名無しさん:2009/08/18(火) 22:28:25
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window = 6
hout = Hash.new(0)
ary.size.times do |i|
ary[i+1, window].reject{|w| w == ary[i]}.each{|w| hout[w] += 1}
end
pp hout
220203:2009/08/18(火) 22:30:53
>>217->>218
すいません。欲しい出力を書いていませんでした。申し訳ありません。


{"w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2},
"w2"=>{"w1"=>4, "w3"=>5, "w4"=>2, "w5"=>1},
"w3"=>{"w1"=>4, "w2"=>2, "w4"=>3, "w5"=>2},
"w4"=>{"w1"=>2, "w2"=>2, "w3"=>1, "w5"=>1},
"w5"=>{"w1"=>0, "w2"=>1, "w3"=>1, "w4"=>1}}
と出力して欲しいのです。
221チンパンジー愛ちゃん:2009/08/18(火) 23:01:40
require 'pp'

def hash_add(base, add)
ret = add.each do |nest_key, nest_value|
if base[nest_key]
nest_value.each do |add_key, add_value|
base[nest_key][add_key] += add_value
end
else
base[nest_key] = nest_value
end
end
return base
end

h1 = {
"ja"=>{"a"=>5,"b"=>7,"c"=>9},
"usa"=>{"a"=>4,"b"=>2,"c"=>1}
}
# $(B$H$J$C$F<!$K(B
h2 = {
"ja"=>{"a"=>3,"b"=>8,"c"=>4},
"usa"=>{"a"=>14,"b"=>8,"c"=>5}
}
# $(B$,=P$?$i(B
pp hash_add(h1, h2)

# h1.inspect
h = {
"ja"=>{"a"=>1,"b"=>1,"c"=>0},
"usa"=>{"a"=>1,"b"=>1,"c"=>0}
}
222デフォルトの名無しさん:2009/08/18(火) 23:07:58
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h }
window = 6
hout = Hash.new
ary.each_with_index do |key,i|
 (hout[key] = zero.dup).delete(key) unless hout.key?(key)
 ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 }
end
223チンパンジー愛ちゃん:2009/08/18(火) 23:25:03
核と思われる部分だけを抜き出すとこんなことになるんだけど、
問題をうまくまとめれてないんじゃない?
もうちょっと整理してから再度質問して。

require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6

ary.size.times { |i|
j = i + 1
p [":ary[#{j},#{window}]", ary[j, window]]
}
t217.3.rb [utf-8][unix]
:!ruby t217.3.rb
[":ary[1,6]", ["w2", "w3", "w4", "w2", "w3", "w1"]]
[":ary[2,6]", ["w3", "w4", "w2", "w3", "w1", "w1"]]
[":ary[3,6]", ["w4", "w2", "w3", "w1", "w1", "w5"]]
[":ary[4,6]", ["w2", "w3", "w1", "w1", "w5", "w2"]]
[":ary[5,6]", ["w3", "w1", "w1", "w5", "w2", "w3"]]
[":ary[6,6]", ["w1", "w1", "w5", "w2", "w3", "w4"]]
[":ary[7,6]", ["w1", "w5", "w2", "w3", "w4"]]
[":ary[8,6]", ["w5", "w2", "w3", "w4"]]
[":ary[9,6]", ["w2", "w3", "w4"]]
[":ary[10,6]", ["w3", "w4"]]
[":ary[11,6]", ["w4"]]
[":ary[12,6]", []]
224チンパンジー愛ちゃん:2009/08/18(火) 23:25:52
ary[12, 6]がおかしいと思わない?
225203:2009/08/18(火) 23:44:32
>>221->>224
ありがとうございます。

hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
でhinを初期化しているから同じkeyが来たときに上書きされてしまっているのが一つ問題と
同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする方法がわからないのがもう一つの問題です。

mergeの方法は>>205-206,>>208さんのやり方になるのかなと思ってます。

>>224
ary[12,6]はそれでもOKだと思ってます。
そこは加算しなくていいよーということで。だめなんでしょうか?
226チンパンジー愛ちゃん:2009/08/18(火) 23:45:41
>>215
@mecab = MeCab::Tagger.new([$0])
ってかいてあるところに
@mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
みたいな感じで直接Mecab用のオプション書けばうまくいくよ
227チンパンジー愛ちゃん:2009/08/18(火) 23:53:51
>>225
ary[12, 6]をきちんと認識しているのなら何も問題はないでふ
ただ、ここがバグの原因じゃないかな?と思っただけで。

Hash.new(0)
してあるんだから、
「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
は、
h["unknown_value"] += unknown_value_key
と直接書けばよいでしょ。
以下のコードの実行結果の予想つく?

h0 = Hash.new(0)
hash = {}
p h0[:unknown_keh0 = Hash.new(0)
hash = {}
p h0[:unknown_key]
p h0[:unknown_key] += 5
p hash[:unknown_key]
p hash[:unknown_key] += 5
y]
p h0[:unknown_key] += 5
p hash[:unknown_key]
p hash[:unknown_key] += 5
228チンパンジー愛ちゃん:2009/08/18(火) 23:55:27
上のはゴミコードが入っちゃった。ごめん。
こっちのコードの実行結果の予想つく?

h0 = Hash.new(0)
hash = {}
p h0[:unknown_key]
p h0[:unknown_key] += 5
p hash[:unknown_key]
p hash[:unknown_key] += 5
229チンパンジー愛ちゃん:2009/08/18(火) 23:57:18
rails仙人やーい
230デフォルトの名無しさん:2009/08/19(水) 00:04:07
>>228
0
5
0
5
では・・・・ないんですか?すいません。
あと:unknownという表記になれていませんのでそこがわかりません。
231デフォルトの名無しさん:2009/08/19(水) 00:10:07
windows用に作られたRubyファイルを動かしたいのですが、ディレクトリがDOSの¥が使われていてファイルを指定できません・・。
No such file or directory - .\/log.txt (Errno::ENOENT)
このようになります。

ディレクトリ指定をLinux用の表現にしたいんですけど、ソースを見てもまったくわかりません。
その部分を書き換えられれば動くと思うんですが、何をどう書き換えればいいかご教授いただけないでしょうか
232デフォルトの名無しさん:2009/08/19(水) 00:14:36
>>226

@mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
と書いてみましたが・・。

何を見て何のオプションを書き加えていけばいいんでしょうか・・?
233デフォルトの名無しさん:2009/08/19(水) 00:16:04
>>231
原因がわかってるように見えるので、むしろ何がわからないのかわかりません
適当な、それっぽいコード塊でも提示すれば何か答えようがあるかもだけど
234チンパンジー愛ちゃん:2009/08/19(水) 00:16:39
>>230

:aaaとかはシンボルっていうんだけど、
シンボルが難しいんならいいや以下のコードで考えて。

h0 = Hash.new(0)
hash = {} # Hash.new と等価
p h0["unknown_key"]
p h0["unknown_key"] += 5
p hash["unknown_key"]
p hash["unknown_key"] += 5

実行結果の予想は間違ってるよ。
0
5
nil
h.rb:6: undefined method `+' for nil:NilClass (NoMethodError)

自分で確認してね。

あとさ、Hash.newの挙動が分かってないので、Hashの初期化について学んで来てください。
235デフォルトの名無しさん:2009/08/19(水) 00:16:56
>>231
それで躓くとなるとRubyどころかプログラム自体初心者じゃないかと思う
でなければよほど面倒なことをしてるソースか

どちらにせよソース提示が必要かと
236チンパンジー愛ちゃん:2009/08/19(水) 00:27:23
>>232
ええーっ!
@mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
ってほんとうに実行したの?
argの意味が分からない系のヒトなのか
チンパンジー愛ちゃんでもできたのにねー

まあ、いいや。
OSとOSのバージョン・種類、rubyのバージョン、
mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン
@mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ
これらすべてを答えてね。

# 個人的な興味として何でghotiなんて使おうと思ったの?
237チンパンジー愛ちゃん:2009/08/19(水) 00:28:38
追加で、ruby, mecab, mecab-ruby, mecab用辞書
これらすべてのインストール方法も書いてね。
238203:2009/08/19(水) 00:30:44
>>234
ありがとうございます。シンボルですか。了解です。

h0 = Hash.new(0) #ハッシュh0を作り初期値は0
hash = {} # Hash.new と等価 #ハッシュhashを作成(ハッシュの箱を作っただけ)
p h0["unknown_key"] #h0のkeyをunknown_keyとしてそのvalueを出力->初期値0
p h0["unknown_key"] += 5#↑のkeyのvalueに5加算
p hash["unknown_key"] #hashのkeyをunknown_keyとしてそのvalueを出力->でも中身が入ってないからnil
p hash["unknown_key"] += 5 #↑中身がわかってないのに5たしてんじゃねーよ

ということですね。少しわかりました。
239231:2009/08/19(水) 00:30:53
エラーの行は
from ******.rb:444:in `open'
from ******.rb:444:in `store_text'

def store_text(lines)
ary = []
lines.each do |line|
ary << line.gsub(/\s+/, ' ').strip  ←ココ 444行目
end

ary.each do |line|
@text << line
end

File.open(@text_filename, 'a') do |fp|
ary.each do |line|
line.chomp!

fp.puts line
end


240231:2009/08/19(水) 00:31:59

from ******.rb:239:in `memorize'

def memorize(lines)
@dic.store_text(lines)  ←ココ239行目
if @dic.learn_from_text
@dic.save_dictionary
end
end


from ******.rb:779 

require 'readline'   ←779行目
****** = ******.new(".\\")
puts "Welcome to The ******"

while (str = Readline.readline("> ", true))
break if /^(exit|quit)?$/.match(str)

******.memorize(str)
res = ******.talk

puts res
end

******はファイル名です。
241デフォルトの名無しさん:2009/08/19(水) 00:37:06
>>236

OS Ubuntu9.04
ruby 1.84
mecab 0.97

インスコ方法とかは
ttp://d.hatena.ne.jp/shohu33/20090216/1234781661このページを参考に。というより、コピペでコンソールに張り付けて実行してインスコしていきました・・。
rubyなどは全部apt-getです。

ghotiでtwitter用のBOT作るんだ><
242デフォルトの名無しさん:2009/08/19(水) 00:38:20
>>231=>>239-240
@text_filename
この中身をセットしている所をチェックしてみれば?

もしくは単純に、
File.open(@text_filename, 'a') do |fp|
の直前で、
p @text_filename
してみるとか。
まあごっつい原始的なデバグ法で気が引けるが。
243デフォルトの名無しさん:2009/08/19(水) 00:41:00
人工無脳流行ってんの?

>>240
その*****とやらのクラスのinitializeの第一引数どうなってる?
>****** = ******.new(".\\")
の .\ に log.txt を結合してるんだと思う
244242:2009/08/19(水) 00:42:50
>>243
をお。
ちゃんと読めばそこまで読み取れるのか。斜め読みいくないね。人口無能レベルのレススマソ
245195:2009/08/19(水) 00:49:25
流れをぶったぎってすみません。ちょっと質問。

配列のデフォルト値の指定ってできますか?
ハッシュ(デフォルト値==0)だったら hoge = Hash.new(0)だけど
配列は同じ構文で要素数指定になりますよね。

ary = []
ary.default(0)
ary[3] #=> 0

みたいなことがやりたいのです。
246231:2009/08/19(水) 00:51:06
def initialize(dirname)
def initialize(dirname=nil)
def initialize(buf)
def initialize(ary=nil)

第一引数がわかりません><

ruby難しいですorz
247チンパンジー愛ちゃん:2009/08/19(水) 00:51:50
>>239
なんだー?それは。
ghoti.rbが実行できないわけではないのか。
ココ444行目とかかかれても何のエラーか分かんねーよ。
どーせnilがsub呼んだってエラーだろーけどなー
239行目は分からない、でも@dicをみるにmecabの辞書をインストールしてないんでしょ。
779行目はreadlineっていうライブラリがないってだけでしょ。

で、そういうライブラリなし・辞書なしとかのエラーだと予想したからこそ、
>>236-237
OSとOSのバージョン・種類、rubyのバージョン、
mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン
@mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ
これらすべてを答えてね。

追加で、ruby, mecab, mecab-ruby, mecab用辞書
これらすべてのインストール方法も書いてね。

って質問を書いておいたんだけどな。
どうやってインストールされていたか分からないなら分からないと正直に書いて。
とりあえず答えてくれれば解決方法を伝えるようにがんばるけど答えないなら知らない。諦めてね。

>>203(208)
>>227で愛ちゃんが書いた以下のコードを理解してもらいたくって
>>228, >>234を書いたってことを理解してね。
-------------------------------------
Hash.new(0)
してあるんだから、
「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
は、h["unknown_value"] += unknown_value_key
と直接書けばよいでしょ。
248チンパンジー愛ちゃん:2009/08/19(水) 00:53:11
およよ、書かれてた。ごめんね。
リロードせずに書いちゃった。
>>247はとりあえずキャンセル
249チンパンジー愛ちゃん:2009/08/19(水) 00:59:00
質問者が入り乱れてて分け分からなくなってきた。
チンパンジーの限界か!
>>232の質問の続きだと思って>>239のレスに答えてた。
>>232には>>247で悪いことをした。ごめんね
250デフォルトの名無しさん:2009/08/19(水) 01:00:32
愛ちゃんかわいいよ愛ちゃん
てかコテハンうぜぇw
251231:2009/08/19(水) 01:09:23
****** = ******.new (".\\")→(ARGV[0] || "data")でいいんですかね・・
252231:2009/08/19(水) 01:10:30
むりですね。。
253デフォルトの名無しさん:2009/08/19(水) 01:14:25
>>251-252
なんか吹いた

******.new (".\\")
のコード(initialize)を出せって言われとろーがwww

大体その******は、全部同じものか?違うなら、HogeとかPageとか適当に分けやがれw
254チンパンジー愛ちゃん:2009/08/19(水) 01:15:11
>>247
何でUbuntu9.04にruby1.84が入っているんだ。
私も9.04使ってるけどruby1.87が入ってたけどな。
それとリンク先はpythonの説明だったぞ。
なぜruby使いにpythonの記事を読ませた!死罪也!

まさかとは思うけど、pythonとrubyの区別がついてなくて
リンク先の記事はrubyの解説だと思っているってことはないよね?

@mecab = MeCab::Tagger.new
って実行してエラーメッセージを貼ってね。
個人的にはmecab用の辞書入れていないことが問題だと思っているけどね。
あと、mecab-ruby, mecab用辞書のバージョンもちゃんと書いてね。
255231:2009/08/19(水) 01:25:16
>>253
******は同じ文字列です。。
コードのだしかたが・・。

module ******
def ******.new(*args)
******::Core.new(*args)
end
def ******.init_dictionary(dirname)
dic = Dictionary.new(dirname)
dic.load_text
dic.learn_from_text(true)
dic
end

class Dictionary
TEXT_FILENAME = '******.txt'
DIC_FILENAME = '******.dic'
def Dictionary.load(dirname)
dic = Dictionary.new(dirname)
dic.load_text
dic.load_dictionary
dic
end
こうですか?わかりません><
256203:2009/08/19(水) 01:25:22
>>247
>Hash.new(0)
>してあるんだから、
>「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」
>は、h["unknown_value"] += unknown_value_key
>と直接書けばよいでしょ。

すいません。ここが理解できてないです。
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
pp hin
puts "@@@"
pp hout
puts "@@@"
}
pp hout
-------
hout[ary[i]] += hin.valuesだとhoutは初期値がないから
undefined method `+' for nil:NilClass (NoMethodError) ですもんね・・・・。
257デフォルトの名無しさん:2009/08/19(水) 01:27:53
>>255
おk。わかった。
とりあえず、>>231に戻って
******.new (".\\")

******.new (".")
にしてみろ。
それでダメなら、ちゃんとソース嫁。
258231:2009/08/19(水) 01:29:39
>>257

ネ申


ありがとうございます。ありがとうございます。
259デフォルトの名無しさん:2009/08/19(水) 01:34:02
>>258
怖い、怖いよw

本当にそれでいいか、一度ソースを読むことを激しくお勧めする。
てかRubyほとんど関係ねえ!
260デフォルトの名無しさん:2009/08/19(水) 01:37:44
>>259
文字化けしますが、文字コードの謎の不具合のせいなので調整すれば大丈夫そうです。
あとはPerlでの作業なのでなんとかなるでしょう。。
Ruby難しいです・・。ソース読めません・・。
261デフォルトの名無しさん:2009/08/19(水) 01:42:18
>>203
>>222だけどあれじゃだめなの?それとも途中経過の出力が必要?

ary.each_with_index do |key,i|
 (hout[key] = zero.dup).delete(key) unless hout.key?(key)
 ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 }
pp hout[key],'@@@',hout,'@@@',
end
pp hout
262203:2009/08/19(水) 01:47:10
>>222
ありがとうございます。出力結果はOKですし、ソースも読解します。
でも、まず、自分が書いた奴がなぜ結果まで持って行けないかわかってないので
チンパンさんに教えてもらっている感じです。
263チンパンジー愛ちゃん:2009/08/19(水) 01:57:45
>>256
「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」

以下の時にA.B.と分けて考えよう。
h1 = hash.new(0)
h1 = h1.merge({"a" => 2, "b" => 3})# h1.merge!({"a" => 2, "b" => 3})でも可
h2 = {"a" => 3, "c" => 8}

A.同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算
B.なければmergeする

A.これは、以下のままでよいから特に難しくないね。
h1["a"] += h2["a"]

B.は
h1["c"] += h2["c"]
と等価なんだよね。

p h1["unknown_key"] += 5
を思い出してね。

すると、A.Bの時に場合分けは特に必要なく、
h["unknown_value"] += unknown_value_key
のコードで事足りるよね。
264203:2009/08/19(水) 02:16:49
>>263
A,Bの場合分けが入らないのは理解しました。
h["unknown_value"] += unknown_value_key
これは ハッシュhにunknownのvalueをkeyとしたものに unknownのvalueのkeyのvalueを足しているということでいいんですか?
アンダースコアをどのように使っているかわかりません。

hout[ary[i]] とやらないと
w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2}
のw1=>が得られないと思っているのですが、それもちがいますか?

265231:2009/08/19(水) 02:19:29
else

chr = /./m.match(str)[0]
result << chr if num
str = Regexp.last_match.post_match
end

この部分で ぬるぽ って言われるんですが。
NilClass (NoMethodError)

単なる文法間違いですか・・?
266デフォルトの名無しさん:2009/08/19(水) 02:19:39
>>262
「自分で書いた」ってのは>>209の事かな
あれがうまく行かないのはこの行で前のループのデータを上書きしてる為。
hout[ary[i]] = hin
ここに>>208氏のメソッドを使えば>>220に近い結果が出せた。
add(hout,ary[i],hin)

マージに拘りすぎ、普通に枚挙すれ
267チンパンジー愛ちゃん:2009/08/19(水) 02:30:13
>>264
アンダースコアは気にしないで。単語の区切りに使っただけ。
こっちの方が迷わなくていいかな。
×h["unknown_value"] += unknown_value_key
○h["unknownkey"] += unknownvalue
これはhのハッシュに存在していないキーのことをいいたかったんだけど、
愛ちゃんの変数名の付け方がおかしかったね。ごめんね。
> これは ハッシュhにunknownのvalueをkeyとしたものに
> unknownのvalueのkeyのvalueを足しているということでいいんですか?
話がややこしくなってるね。変な変数名でごめんね。

> hout[ary[i]] とやらないと...
これは正しいよ。そうしないと得られないよ。
268203:2009/08/19(水) 03:10:28
>>266
ありがとうございます。上書きしていたのは気がついたのですがそのように書くしか思いつかなかったので手がでませんでした。
addでやったところvalueが0の所は出力されていませんが、欲しいモノで出力されました。

>>267
変数名に関して理解しました。
しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と結びつけるかわかりません。
h["unknownkey"] += unknownvalue はhinの方ですよね。
269チンパンジー愛ちゃん:2009/08/19(水) 03:51:55
> しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と
> 結びつけるかわかりません。h["unknownkey"] += unknownvalue はhinの方ですよね

うんにゃ、違うよ。hinじゃないよ。
h["unknownkey"] += unknownvalue
と結びつけて考えないといけないのは以下の箇所

hout[ary[i]] = hin# ここを以下のように変更すれば期待通りに動くはず

hin.each do |key, value|
hout[ary[i]][key] += value
end
270デフォルトの名無しさん:2009/08/19(水) 04:43:35
的確なレスもできないくせにコテうぜえ
271デフォルトの名無しさん:2009/08/19(水) 05:30:04
ナツノオモイデ君はどこでも厄介だ

>>265
本当に何も考えていないWindows用スクリプトなのなら日本語はShiftJIS決め打ちだろ
入力する日本語を全部ShiftJISにして$KCODE相当もShiftJISにしてみ
272デフォルトの名無しさん:2009/08/19(水) 06:01:39
>>245
arr = Array.new
p arr[3] #=> nil

これを「nil ではなく 0」にしたいのだと推測
できません
「arr[3] が nil なら 0 を代入」という手順を経るのが通例です
この明示的な動作で要素3までの配列が確定され、「空」だった要素にはnilが代入されます
配列の自動初期値設定というのはあったらあったで便利っぽい機能なんですが、おそらくは
「nil以外のオブジェクトが勝手に若い要素全てに代入される」
という動作が Ruby 添付クラス的にキモいということで嫌われたのでしょう

もし必要なサイズがあらかじめわかっているのなら、その大きさの配列を作って Array#fill で埋めるか

arr = Array.new(5)
arr.fill{ 0 }
p arr[3] #=> 0
p arr #=> [0, 0, 0, 0, 0]

あるいは new のときにやっちゃってください

arr = Array.new(5){ 0 }
p arr[3] #=> 0
p arr #=> [0, 0, 0, 0, 0]

[] メソッドで参照しただけで若い要素が 0 で埋まる配列クラスと言うのを自作しても構いませんが、多分動作遅いと思われます
273デフォルトの名無しさん:2009/08/19(水) 11:00:07
>>245
Rubyの配列にはそういう機能がないです。残念でした。
代替案としては arr[x] で参照するかわりに (arr[x] ||= 0) とするとか。
たとえば
arr = [1, 2, 3]
puts (arr[5] ||= 0) + 1
みたいな。

あとは Array#[] を上書きすればいいのかなー
class Array
 def [](x)
  val = super(x)
  val = self[x] = 0 if val.nil?
  return val
 end
end
とか。
274デフォルトの名無しさん:2009/08/19(水) 11:12:08
>>231
めんどくせぇソース全文うpってくれ
275203:2009/08/19(水) 11:43:54
>>263
遅くなってすいません。こうですか?
require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
#hout[ary[i]] = hin
hin.each do |key, value|
hout[ary[i]][key] += value
end
}
pp hout

実行すると
at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
from mat.rb:11:in `each'
from mat.rb:11
from mat.rb:5:in `times'
from mat.rb:5
となってしまいます。
276デフォルトの名無しさん:2009/08/19(水) 12:01:02
>>275
自分で考えてほしいからエラーのヒントだけ
>hout=Hash.new
>#hout[ary[i]] = hin
>hout[ary[i]][key] += value
>at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
277203:2009/08/19(水) 12:32:53
>>276
hout[ary[i]][key]
Hashが二つ[][]を取っているのが気持ち悪いですし、それがundefined method `[]' for nil:NilClass (NoMethodError)
を起こしているのだと思いますが・・・・。そうだとしても解決がわからないです。
278デフォルトの名無しさん:2009/08/19(水) 12:44:23
>>277
>hout[ary[i]][key]
k = ary[i]
x = hout[k]
y = x[key]
と同じ

で、このときのxはなんだとおもう?
279203:2009/08/19(水) 12:50:17
>>278
xはhout[ary[i]]ですか?
ということはhout[ary[i]]が一つのハッシュでhout[ary[i]][key]だとそれのキーということですか?
280デフォルトの名無しさん:2009/08/19(水) 12:58:15
なんどめだナウシカ

ハッシュの h[key] は、「ハッシュ機構」という特殊なものがあるわけじゃなくて
「オブジェクト h の [] メソッドに引数 key を渡している」
という処理を簡単に表記できるように特別扱いされたものに過ぎない

h = {'one' => 1'}
p h['one'] #=> 1
p h.[]('one') #=> 1

つまり、h['one']['two'] という表記があったなら、それは

 h.[]('one').[]('two')

というメソッドチェーンを表しているに過ぎない
メソッドチェーンだから、[]('two') のレシーバ、つまりドットの前の、h.[]('one') の返り値、
が nil だと普通に NoMethodError になる
そんだけ
281203:2009/08/19(水) 12:58:33
あぁ、hout[ary[i]][key]はhout[ary[i]]のkeyがkeyの時のvalueですね
282デフォルトの名無しさん:2009/08/19(水) 13:14:39
これを一括ダウンロードするのってどうやるの?
http://www.boostermp3.com/audio/index.php?search=perfume
283デフォルトの名無しさん:2009/08/19(水) 13:27:56
うぜえからダウンローダー使うなってページ構造に書いてあるな
まあ知識がないなら手作業でやりゃいいんじゃねえの
284デフォルトの名無しさん:2009/08/19(水) 13:34:11
JavaScriptのリンククリックするだけのように見えるから
JavaScriptのリンクをクリックできるライブラリ使えばできそうな気はする
内容が内容だけにこれ以上は自力でやれとしか
285203:2009/08/19(水) 14:03:15
>>280
すいません。ハッシュ機構というものがあるような感じで書いていました。
メソッドチェーンということはと思って
hin.eachの前で
p hout[ary[i]]をしたところ返り値がnilでした.
ということは hout=Hash.newのところが問題になってくるのでしょうか?
286デフォルトの名無しさん:2009/08/19(水) 14:09:22
>>285
そりゃ唯一の代入をコメントアウトしちゃったらnilしか返ってこないわな
287デフォルトの名無しさん:2009/08/19(水) 14:22:23
よし、ではハッシュの初期値を使うのは禁止だ
理由は、全く理解していないから

望ましい処理を自力で一度書け
どういう時にどうなっていて欲しいかを if で条件分岐しろ
288デフォルトの名無しさん:2009/08/19(水) 14:25:13
なんかみんなを混乱させているようだね。
>>275
>at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
これを説明すると、まずat.rbの12行目でエラーが起きている。
エラーの内容は、nilに対して '[]' というメソッドを実行しようとしているため。
つまり nil[i] のようなことをしている。
at.rbの12行目がなにかわからないけど、hout[ary[i]][key] だとしたら、
・aryがnilのせいで ary[i] がエラー
・houtがnilのせいで hout[ary[i]] がエラー
・hout[ary[i]]がnilのせいで hout[ary[i][key] がエラー
のどれかが原因。
あとは自分で調べて。
289231:2009/08/19(水) 14:52:04
>>274
遅くなりましたが>>231.255.258.259.265のソースの全文です。。

ttp://2sen.dip.jp/cgi-bin/upgun/up1/source/up31158.zip
290チンパンジー愛ちゃん:2009/08/19(水) 15:17:23
初心者が混乱しているときは大抵教え方が悪いと思っていたけどやっぱりそうだった。
ごめん、答えだけ書くね。大体>>220と同じ出力になるよ。"w5" => {...}だけ違うけど。

require 'pp'
ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
window =6
hout=Hash.new
ary.size.times{ |i|
hin=Hash.new(0)
b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ }
b.each {|count| hin[count] +=1}
#hout[ary[i]] = hin
if hout[ary[i]].nil?
hout[ary[i]] = hin
else
hin.each do |key, value|
hout[ary[i]][key] += value
end
end
}
pp hout
291デフォルトの名無しさん:2009/08/19(水) 15:24:45
的確なレスもできないくせにコテうぜえ
292デフォルトの名無しさん:2009/08/19(水) 15:25:05
>>289
やっぱsixamoかよ、なんでわざわざ名前伏せるんだw
でもこれ微妙に改変されててバージョン情報に偽りが・・・まあこの際どうでもいいか

とりあえずホンモノ使っときゃいいんじゃね
http://yowaken.dip.jp/sixamo/
293デフォルトの名無しさん:2009/08/19(水) 15:32:10
>>292
本物はRubyのバージョン的に動かないって書いてあったので・・。
動かしてみた感じでは本物は受け答えできず。
改変版は数行実行したのちエラー。
ログのTXTファイル空にしたらまた動くので、文字コードとか?文章作成あたりでエラーになってると予測。

本物より動きそうなんですがね。。
294デフォルトの名無しさん:2009/08/19(水) 15:42:14
厳しい言い方だが、

あなたがただのユーザーなら、Rubyで動作するプログラムは現存しないので諦めれ
あなたがプログラミングを行う者なのなら、あなたが自力で全体修繕して作れ

どっちか
295203:2009/08/19(水) 15:58:50
>>286->>288,>>290

ご指摘ありがとうございます。
各クラスのメソッドの知識がないみたいなのでそこを勉強して出直してきます。
また、初期値なども勉強してきます。
昨日からいろいろな人に教えていただきましてまことにありがとうございます。
296チンパンジー愛ちゃん:2009/08/19(水) 16:15:54
mecab坊やはどうなったの?解決したの?
297デフォルトの名無しさん:2009/08/19(水) 16:28:45
的確なレスもできないくせにコテうぜえ
298デフォルトの名無しさん:2009/08/19(水) 16:48:22
ここまで全部読み飛ばした。
寝る。
299デフォルトの名無しさん:2009/08/19(水) 17:02:48
とりあえず
みんな
おつかれ
300デフォルトの名無しさん:2009/08/19(水) 18:36:53
>>293
Ruby1.9なら1.8を
もし引数無しで起動したならリンク先ちゃんと読め
301デフォルトの名無しさん:2009/08/19(水) 19:09:17
1.8w
302デフォルトの名無しさん:2009/08/19(水) 19:48:41
>>290
>初心者が混乱しているときは大抵教え方が悪い
名言だな。こんどから>>1に追加してほしいくらいだ。
303デフォルトの名無しさん:2009/08/19(水) 20:06:36
本人が言うから名言なんであって
もし質問者側からそんなこと言われたらたまったもんじゃないな
304チンパンジー愛ちゃん:2009/08/19(水) 21:29:48
教える側は常に心の奥底で思っていないといけないことですよ。
独りよがりの教えほど迷惑なものはありませんから。
305191:2009/08/19(水) 22:21:17
すまん、俺が変な野郎(>>192)を呼び込んでしまったようだ orz...
あとは俺に任せてくれ。
306デフォルトの名無しさん:2009/08/19(水) 22:30:23
どっちもサルに見えるのだが
307デフォルトの名無しさん:2009/08/20(木) 03:35:31
逆引きRuby誰か書き足してくれ
308デフォルトの名無しさん:2009/08/20(木) 07:19:18
>>307
どっちの逆引き?
309デフォルトの名無しさん:2009/08/20(木) 08:08:59
とりあえず、逆引きRubyという話題を振る時は、
どちらの逆引きか、逆引きの方か、逆引きの方かはっきり囲うな?
310デフォルトの名無しさん:2009/08/20(木) 08:12:14
日本語でおk
311デフォルトの名無しさん:2009/08/20(木) 08:58:41
レシピブック初版にはお世話になったけど
最近いろいろあるから次買うとき迷うな

>>309
書き足すっていうぐらいだからWikiのほうだろう
312デフォルトの名無しさん:2009/08/20(木) 13:38:05
Emacs の ruby-mode で =begin と =end がインデントされてたいそう困ってるんだけど
これって困ってる人いないのかな
313デフォルトの名無しさん:2009/08/20(木) 14:06:37
>>304
そこまで自覚があるなら、さっさと消えろよ
314デフォルトの名無しさん:2009/08/20(木) 17:19:03
>>312
あー,それ確か俺も愕然とした記憶が。
「=begin, =end は使わないことにする」で解決!
315デフォルトの名無しさん:2009/08/21(金) 10:58:26
シリアルポートからデータをgetsで読んでます。
データは一行ずつ出力されるので問題は生じません。
しかし、特殊な設定情報だけは複数行出力で、行数が不定です。
このような何行か分からない出力を受け取るにはどのような手法が適しているでしょうか?
316デフォルトの名無しさん:2009/08/21(金) 11:09:32
行とい考え方を無くせばいい
ただの改行文字だろ
317デフォルトの名無しさん:2009/08/21(金) 11:10:20
設定情報用の一時変数を確保しておいて、
設定情報1行目だったら通常の処理飛ばしてそこに溜めるようにすれば?
318315:2009/08/21(金) 11:26:15
ありがとうございます。
とりあえず、一行ずつ << 演算子で設定情報用の配列の末尾に追加していくことにしました。
EOFがないので終了条件をどうするか悩んでみます。
319デフォルトの名無しさん:2009/08/21(金) 11:40:13
>>318
EOFって全体の?
終了データが流れてこないとかpingみたいな定期送信がないなら
手動停止させるのが普通だと思う

可変長データなのにサイズ情報も終端情報もないのだとしたら
次の通常のデータが送られてきた時にバッファ吐き出して設定処理するとか
320デフォルトの名無しさん:2009/08/21(金) 11:43:57
そりゃデータフォーマットがわからにゃなんとも
321315:2009/08/21(金) 11:58:57
>>319
全てのデータを受信できるまで、timeoutモジュールを使って少し待ってからgetsの待ちを解除してみます。
322デフォルトの名無しさん:2009/08/21(金) 13:43:36
自作のスクリプトがあります
libディレクトリを作ってファイル分けしてみたら10ファイルくらいになりました

んで、これを日常で使いたいと思います
「開発ディレクトリ」と「実行ディレクトリ」を分けなければなりません
(動作しない状態であることが多い開発中のスクリプトをcronなどで触らせたくない)
どこか適当なディレクトリに「インストール」してバージョンを維持するのがいいと思ってます

最初は rubygem パッケージにすることを考えましたが、
require 'rubygems' で1秒近くかかる環境なので正直あまりやりたくありません
(たぶん、スクリプト本体の実行時間のほうが短い)
これ以外になにかてきとーな方法はありませんか?
323デフォルトの名無しさん:2009/08/21(金) 13:52:21
>>322
subversionあたり使うとか
324デフォルトの名無しさん:2009/08/21(金) 13:59:42
>>322
rake install で超適当なディレクトリに超適当に上書きするような rake スクリプトを書く
要は実行可能なときにファイルをコピーしておきたいってことだろ
ファイルをコピーするという行為だけ rake で書け

バージョン戻すという行為が簡単にできないのだけが難点だが、
まあ実行用ディレクトリを適当に圧縮でもしてバックアップしとけ
325デフォルトの名無しさん:2009/08/21(金) 15:25:22
質問です。

ary = [5, 2, 3, 3, 3, 4, 2, 2]
のような配列を
[5, 2, 3, 4, 2]
のようにする、つまり、「隣り合った」同値の要素を
uniqにまとめた配列を得る方法を求めています。

ary = [5, 2, 3, 3, 3, 4, 2, 2]
prev = nil
result = []
ary.each do |n|
result << n if prev != n
prev = n
end
result #=> [5, 2, 3, 4, 2]

とするより、良い方法はないものでしょうか?

これに限らず、配列処理で直前(または 直後)の要素を参照しながら
進めていくスマートな方法があれば教えていただきたいのですが・・・。
326デフォルトの名無しさん:2009/08/21(金) 15:32:32
prev = nil
result = ary.select{|v| v == prev ? false : (prev = v) }
327デフォルトの名無しさん:2009/08/21(金) 15:33:18
前後を参照するほうが注目だったか、スマン出直してくる
328デフォルトの名無しさん:2009/08/21(金) 15:33:53
Enumerable#each_cons
329デフォルトの名無しさん:2009/08/21(金) 15:51:43
>>326
selectをこういうふうに使えるのは知りませんでした。
関数型言語みたいで格好いいなあ。

>>328
こういうのを探していました。ありがとうございます。
330デフォルトの名無しさん:2009/08/21(金) 20:16:48
デバッガ使ってる?

使いこなせてないからかもしれないけども,まだ自分にはpとかppで十分かな.
どんなレベルからデバッガつかってんの?
331デフォルトの名無しさん:2009/08/21(金) 21:20:08
みんななにで開発してるんだろう?
IDE?エディタ+コンソール?
332デフォルトの名無しさん:2009/08/21(金) 22:31:20
>>331
エディタ+コンソール派
軽くて良いIDEがあったら、そっちに乗り換えるつもり
333デフォルトの名無しさん:2009/08/21(金) 23:22:01
デバッガ使ってもバグ直ってないニダ。
謝罪と賠償ニダ。
334デフォルトの名無しさん:2009/08/21(金) 23:24:21
RDEがもっと使いやすかったらいいのにな・・・
335デフォルトの名無しさん:2009/08/22(土) 00:53:03
netbeansで書いて、家ではemacs+putty
336デフォルトの名無しさん:2009/08/22(土) 02:00:36
EclispeからNetbeansに行ってemacsかな。日曜PGなんで結局自分が良く使うエディタがいいや。
337デフォルトの名無しさん:2009/08/22(土) 02:03:57
Aptana+Eclispe
はじめたばっかりですけど
338デフォルトの名無しさん:2009/08/22(土) 08:22:51
ソースコード上でデバッグできるのは?
NetBeansがいいんかな?
339デフォルトの名無しさん:2009/08/22(土) 08:29:08
正直どれもイマイチ
言語仕様的問題だとは思うんだが
340デフォルトの名無しさん:2009/08/22(土) 09:44:00
>325

result = ary.zip([nil]+ary).select{|x,y| x!=y}.map(&:first)
341デフォルトの名無しさん:2009/08/22(土) 09:53:39
>>340
each_consが提示された時点で問題外
オナニー以下
342デフォルトの名無しさん:2009/08/22(土) 13:45:35
色んなやり方が紹介されるのは,初心者スレでは意味があるんじゃないかな。
悪例だったらダメだけど,>>340 は「へーこういうのもあるんだ」的な
例にもなってると思うし。
343デフォルトの名無しさん:2009/08/22(土) 15:15:49
data = ハッシュまたは適当な格納系クラス
Target.new(param).hoge(data)
data #<= Target に関する情報が追加されている

という処理をします
hoge というメソッドにわかりやすい名前を付けたいのですが、なんかいい案ありませんか
凝ってもアレだし update とか register でいいですかね
344デフォルトの名無しさん:2009/08/22(土) 15:17:19
>>342
普通に悪例だと思うが
345デフォルトの名無しさん:2009/08/22(土) 15:23:30
ようそが nil いっこだけのはいれつがかいてあるじてんでかっこわるくてあたまぐるんぐるんぐるんします
346デフォルトの名無しさん:2009/08/22(土) 16:12:11
>>343
Hoge#dup_to(data) とか
updateならHashにならってHoge#update(Target)にすべき
後は
hoge = Target.new(param).to_hoge
とか
hoge = Hoge.new(Target.new(param))
347デフォルトの名無しさん:2009/08/22(土) 16:27:30
>>343
「自分の内容で引数のデータオブジェクト(自分とは別構成)を更新する」というメソッドに
update は似合わない
Ruby の update は自分と引数が同類であるべき
引数に現在のインスタンス変数の内容を適宜コピー、というメソッドは…なんだろうね

動作としてはこんなんだろ

h = Hash.new
Foo.hoge(h)
Bar.hoge(h)
Baz.hoge(h)
p h

で、h が {'foo' => …, 'bar' => …, 'baz' => …} になったり
{111 => {:foo => …, :bar=> …, :baz => …}, 222 => {:foo => …, :bar=> …, :baz => …}, ...} になるって奴
348346:2009/08/22(土) 17:09:40
間違えた
×Hoge#dup_to(data)
○Target#dup_to_(data)

dup_to(data)じゃなくてdup(type=nil)にして
typeがクラスならデータ格納したインスタンスを生成、
インスタンスならそれに情報をコピー、nilならsuperとかどうだろう
349デフォルトの名無しさん:2009/08/22(土) 18:04:05
きめえ
ObjectやModuleの基本メソッドは上書きすんな
350デフォルトの名無しさん:2009/08/22(土) 18:08:08
dupの存在を知らないだけかもしれないじゃないか
irb> a = []
irb> b = a.dup
irb> a << 1
irb> p b
[]
351デフォルトの名無しさん:2009/08/22(土) 18:35:05
>>349
> ObjectやModuleの基本メソッドは上書きすんな
なんで?
inspectとか==とかto_*とか普通上書きするだろ、最たるものはinitialize
それにdupに引数与えなければ以前と同じ動作をするんだから互換性も問題無い
352デフォルトの名無しさん:2009/08/22(土) 18:51:28
>>343
自分なら Target.new(param).hoge は Hash あたりを吐き出すようにして
data側が自分で取り込むようにする
たとえばdata = {} なら data.update( Target.new(param).hoge )

だから名前は、ある種のアクセサとして吐き出すデータに見合った名前か
主要なデータをまるっと吐くなら to_h とか

>>351
機能はそのままに、そのオブジェクトに見合うよう上書きするのと
機能自体を拡張するという違いがあるからなぁ
ダメだと思わないけど積極的にやるのも微妙な感じ
353デフォルトの名無しさん:2009/08/22(土) 19:14:29
Ruby Best Practicesは良い本ですか?
354デフォルトの名無しさん:2009/08/22(土) 20:24:17
Ruby Best Practicesは(どうでも)良い本です。
355デフォルトの名無しさん:2009/08/22(土) 20:35:37
初歩的な質問ですいません。
Linuxで、シェル(bash cshなど)よりrubyの方が優れているところは何でしょうか?
356デフォルトの名無しさん:2009/08/22(土) 20:42:46
>>355
シェルスクリプトでめんどくさい処理も簡潔に書ける

めんどくさいと思った経験が無いならシェルスクリプト使っとけ
357デフォルトの名無しさん:2009/08/22(土) 20:48:58
>>356
すいません、シェルは結構使うんですが、Rubyは勉強しだしたばっかりであまりよくわかってないんです。
なので自分で比較ができないんですが、具体的にはどんなところがRuby優位なのでしょうか?
358デフォルトの名無しさん:2009/08/22(土) 21:01:29
例えば指定したディレクトリとそのサブディレクトリを巡回して
ファイルのサイズを集計してどのフォルダが何%消費しているかを
大きい順にソートして上位50個表示。
なんてユーティリティを書くと差が出てくるかな。
359デフォルトの名無しさん:2009/08/22(土) 21:01:56
>>357
アプリ一つ書いてみればわかるんじゃないだろうか。
WEBアプリなら敷居が低いから、とりあえず掲示板でも。

また例えば、CSVのパースとかしたくなったときに、シェルスクリプトで
どうやったらいいのかちょっとすぐには思いつかない。
360デフォルトの名無しさん:2009/08/22(土) 21:06:49
シェルスクリプトってものがどういうものかっていう知識不足

だからどんなレスしても、理解できない
361355:2009/08/22(土) 21:14:54
シェルでもcpとかrmしかつかってないんで、
難しいことわかりません。

理解できませんので失礼します。
362デフォルトの名無しさん:2009/08/22(土) 21:37:01
>>358
du -h | sort で用が足りそうな気もするな
363デフォルトの名無しさん:2009/08/22(土) 22:54:42
CSV処理やらディレクトリ走査はシェルスクリプトの得意分野じゃねえの。
シェルスクリプトを覚える必要がないならrubyで良いと思うけども。
364デフォルトの名無しさん:2009/08/23(日) 01:53:06
多次元配列の重複要素削除の仕方がわかりません

Cでいうところの、
a[3][5] = {[1,2,3,4,a], [2,3,4,5,b], [2,3,4,5,a]}

って、あったら、aが重複してるので、
[1,2,3,4,a], [2,3,4,5,b]
だけにしたい

a.uniq{|x| x[4]}

ってのは間違い??


365デフォルトの名無しさん:2009/08/23(日) 03:01:15
>>364
Array#uniqはブロックを取らないはず

a[x][4]の値が既出の配列は捨てるってことだよね?
a = [[1,2,3,4,"a"], [2,3,4,5,"b"], [2,3,4,5,"a"]]
tmp = {}
a.select{|v| tmp[v[4]] ? false : (tmp[v[4]] = true) }

どこかで見たと思ったら>>326と似てた
366デフォルトの名無しさん:2009/08/23(日) 04:55:14
>>364
多次元配列など存在しません
ネストした配列とお呼び下さい

で、まあ、ネストしただけの配列なので普通にイテレーションして
exists = Array.new
a.delete_if{|arr| if exists.include?(arr[4]) then false else exists << arr[4]; true end}
とかすればいいんじゃね
Rubyでコレクションをぐるぐるすること厭っちゃダメ
367デフォルトの名無しさん:2009/08/23(日) 05:22:40
【レス抽出】
対象スレ:Ruby 初心者スレッド Part 30
キーワード:select

抽出レス数:11

これ全部同じ奴なんだろうな、とか思う
368デフォルトの名無しさん:2009/08/23(日) 05:47:02
select が条件全体抽出なのは混乱する、という人は少なくなさそうだな

collect
select
reject
detect
inject



map
find_all
reject
find
inject

なら後者のほうがまだマシにも思えるが、あ〜、でもどうだろう
このへんは出身言語にもよるんだろうけどさ
find/map 派と detect/collect 派は結構昔から揉めてる気がする
find と find_all が紛らわしいとか、そんなんセレクトとデテクトのほうが紛らわしいわボケとか

あと、古い ActiveRecord は find_all が上書きされるから新しいの入れて ActiveRecord#all で書け
369デフォルトの名無しさん:2009/08/23(日) 12:23:18
>>364
> a.uniq{|x| x[4]}
> ってのは間違い??

1.9 ならそれで動くよ。
370デフォルトの名無しさん:2009/08/23(日) 13:04:54
1.8はそろそろ分離してスレ立ててほしいな

【まだまだ】Ruby1.8.x 初心者スレ【現役】

とか
371デフォルトの名無しさん:2009/08/23(日) 13:12:45
>>370
1年半で200レスしか行かないトピックスを1ヶ月で1000レス消費するスレから分離要求とか片腹痛いわー
そういうのは1.9スレ繁盛させてから言え
372デフォルトの名無しさん:2009/08/23(日) 13:20:00
時代についていけない老害め
373デフォルトの名無しさん:2009/08/23(日) 13:23:01
え、板を利用させてもらってる分際で何言ってんの
既存スレの利用もできないのに新スレとか何様
374デフォルトの名無しさん:2009/08/23(日) 13:34:00
いまだに1.8.xにしがみつくのはRuby界の足をひっぱってるってことに気がつけ
375デフォルトの名無しさん:2009/08/23(日) 13:34:04
夏の思い出作りなんだろ
自分の提案であの2ちゃんねるにスレが立つんだぜ
俺なら射精するね
376デフォルトの名無しさん:2009/08/23(日) 13:35:53
2chが世界の全てな人には何を言っても無駄
2chのスレ立てとRuby界の関係とかもうわけわからんし
377デフォルトの名無しさん:2009/08/23(日) 13:38:49
>>374
One-Click Installerの1.9版すら出てないのに何を言ってるの
378デフォルトの名無しさん:2009/08/23(日) 14:05:31
夏の思い出うんぬんって流行ってるのか?
前にも薬が切れたみたいなやつが言ってた気がするが
379デフォルトの名無しさん:2009/08/23(日) 14:22:02
お前ら隔離スレに帰ってくれ
380デフォルトの名無しさん:2009/08/23(日) 20:25:41
>>378
というか夏の思い出作りが流行ってる。
381デフォルトの名無しさん:2009/08/23(日) 20:27:52
バージョンの指定をするスレの方がレスが少ないのは当然だろ
382デフォルトの名無しさん:2009/08/23(日) 22:29:36
Rubyでopensslを利用して共通鍵暗号を使う場合、以下のような
コードを書きますが、pkcs5_keyivgenを使うのはセキュリティ上
良くないのですか?

require 'openssl'

a123 = "0123456789"
pass = "hogehoge"
enc = OpenSSL::Cipher::DES.new
enc.encrypt
enc.pkcs5_keyivgen(pass) # <= この記述がよろしくない?
a = enc.update(a123)
b = enc.final
s = a + b


こんなページ↓を見つけたので、気になりました。
ttp://wp.serpere.info/archives/422

Rubyのソースコード(ossl_cipher.c)には、以下の記載がありますが、
詳しい意味が分かりません。

* WARNING: This method is only PKCS5 v1.5 compliant when using RC2, RC4-40, or DES
* with MD5 or SHA1. Using anything else (like AES) will generate the key/iv using an
* OpenSSL specific method. Use a PKCS5 v2 key generation method instead.


ソースコードの注釈の意味と、pkcs5_keyivgenを使わずに適切に
記述する方法を教えてください。
383デフォルトの名無しさん:2009/08/24(月) 15:48:42
>>382
初心者スレの内容を超えているようにおもうけど、頑張ってみよう。

コメントを翻訳すると、こんな感じでしょうか。暗号についての知識がないのでよくわからないけど。

警告: このメソッドは、RC2やRC4-40を使う場合、あるいはDESをMD5やSHA1とともに使う場合には、PKCS5 v1.5 のみに準拠しています。
他のもの(AESとか)を使うと、OpenSSL固有のメソッドを使ってkey/ivを生成します。
かわりにPKCS5 v2 キー生成メソッドを使ってください。


・・・うん、やっぱわからん。メーリングリストで聞いてみることをお勧めします。
384デフォルトの名無しさん:2009/08/24(月) 16:39:50
すいません。unicodeの文字列を数値に変換してコードに
埋め込んだり複合したりする方法を探しています。Ruby以外での方法は

ttp://0xcc.net/blog/archives/000183.html

にまとめられているので、Rubyでも可能と思うのですが。
385デフォルトの名無しさん:2009/08/24(月) 16:56:36
irb> puts "あいう".unpack("U*").map{|e| sprintf("\\u%x", e)}.join
\u3042\u3044\u3046

正直、ユニバーサルキャラクタ名に一発で変換できないのは怒っていいと思う
386デフォルトの名無しさん:2009/08/24(月) 16:57:34
1.8にはない。
[ 0x3042 ].pack('U')
#=> "あ"

1.9では
"¥u3042"
#=> "あ"
387デフォルトの名無しさん:2009/08/24(月) 17:07:23
inspect の返り値をそのまま "" で貼ると、
ファイル自体の文字コードによらずにUTF-8文字列になる
ただし 1.8 系列限定

irb> puts "あいう".toutf8.inspect
"\343\201\202\343\201\204\343\201\206"

ruby -Ke
require 'nkf'
p NKF.guess("あいう") == NKF::EUC #=> true
p NKF.guess("\343\201\202\343\201\204\343\201\206") == NKF::UTF8 #=> true
388デフォルトの名無しさん:2009/08/24(月) 17:25:53
url 文字列を new に渡すとなんか便利な追加データを搭載した MyURL オブジェクトが返るクラスがあります

MyURL.new(url)

この url が MyURL クラスのオブジェクトだった場合、何もせずにその url 自体を返して欲しいです
389デフォルトの名無しさん:2009/08/24(月) 17:30:12
>>388
Ruby ではそーゆー芸はできません
initialize 内で self を置き換えることができません

class MyURL
 def initialize(url)
  …
 end
 def self.build(url)
  if url.kind_of?(MyURL) then
   return url
  else
   self.class.new(url)
  end
 end
end

my = MyURL.build(url)

とか運用で回避します
390デフォルトの名無しさん:2009/08/24(月) 17:32:46
newを再定義すればいいんじゃないの?
391デフォルトの名無しさん:2009/08/24(月) 19:08:18
def self.new(url)
return url if url.is_a?(MyURL)
myurl = allocate
myurl.instance_eval { initialize(url) }
myurl
end

is_a? の部分は respond_to? MyURL固有のメソッド とかの方がいいかも
392203:2009/08/24(月) 20:16:26
また,質問です.行列のようになった方がみやすいと思って
>>222さんのものをつかって
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
col = %w (w1 w2 w3)
zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h }
window = 6
hout = Hash.new
ary.each_with_index do |key,i|
(hout[key] = zero.dup) unless hout.key?(key)
ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 }
end
pp hout

このようにしました.
そして,colを行列の項目のようにして

{"w1"=>{"w1"=>0, "w2"=>4, "w3"=>4},
"w2"=>{"w1"=>4, "w2"=>0, "w3"=>5},
"w3"=>{"w1"=>4, "w2"=>2, "w3"=>0}}

という出力が欲しいのですが,どのように書き換えればいいか分かりません.
前回の1つ1つは理解できたと思っていましたができませんでした・・・・.すいません.
393デフォルトの名無しさん:2009/08/24(月) 21:11:33
だから処理を逐次書けとあれほど
わからないうちからまとめたって変更できないんだから
394デフォルトの名無しさん:2009/08/24(月) 21:46:03
>>392
メソッドチェーンとか駆使しないでもっと愚直にやれば?
それこそ1行1行 p で結果を確認しながら積み上げていく感じでさ
395デフォルトの名無しさん:2009/08/24(月) 21:47:26
>>389
真顔で嘘を言うなよなw
396デフォルトの名無しさん:2009/08/24(月) 22:25:35
>>392を実行すると
{"w1"=>{"w1"=>0, "w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2},
"w2"=>{"w1"=>4, "w2"=>0, "w3"=>5, "w4"=>2, "w5"=>1},
"w3"=>{"w1"=>4, "w2"=>2, "w3"=>0, "w4"=>3, "w5"=>2},
"w4"=>{"w1"=>2, "w2"=>2, "w3"=>1, "w4"=>0, "w5"=>1},
"w5"=>{"w1"=>0, "w2"=>1, "w3"=>1, "w4"=>1, "w5"=>0}}
ってなるんだけど、これが欲しい出力なんじゃないの?
違うんなら、質問をもっとわかりやすく書いて。
397デフォルトの名無しさん:2009/08/24(月) 22:26:50
ruby -vとやったときの出力を以下のように貼ってね。
ruby -v ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
398デフォルトの名無しさん:2009/08/24(月) 22:31:47
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
399デフォルトの名無しさん:2009/08/24(月) 22:34:08
1.8

wwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwww
400203:2009/08/24(月) 23:08:44
>>396
>>392の実行結果ではなくて
{"w1"=>{"w1"=>0, "w2"=>4, "w3"=>4},
"w2"=>{"w1"=>4, "w2"=>0, "w3"=>5},
"w3"=>{"w1"=>4, "w2"=>2, "w3"=>0}}
となってほしいです。
col = %w(w1 w2 w3) がcol = %w(w7 w8 w9)だったら
{"w7"=>{"w7"=>0, "w8"=>0, "w9"=>0},
"w8"=>{"w7"=>0, "w8"=>0, "w9"=>0},
"w9"=>{"w7"=>0, "w8"=>0, "w9"=>0}} となって欲しいです。
colの中身の配列がaryの中にあるかをwindowでずらしながら確認するのです。

とりあえずバージョンは
ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux]です。
401デフォルトの名無しさん:2009/08/25(火) 00:07:44
>>400
"w?"=>0 以外の結果は>>222のhoutに入ってるんだから
そこからcolに一致するデータだけ抜き出せばいいじゃん
402203:2009/08/25(火) 01:46:21
>>401
思いつく限りしてみたのですが・・・
require 'pp'
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
col = %w(w1 w2 w3 w9)
zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h }
window = 6
hout = Hash.new
ary.each_with_index do |key,i|
(hout[key] = zero.dup) unless hout.key?(key)
ary[i+1,window].select{ |e| e != key }.each { |word| hout[key][word] += 1 }
end
pp hout
ar=Hash.new;ar.default=0;ar= hout.values[0].values_at(*col)
p ar
hout.each_pair do |k,v|
if col.include?(k)
puts "#{k}\t#{v.values_at(*col)}"
end
end

# >> {"w1"=>{"w1"=>0, "w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2},
# >> "w2"=>{"w1"=>4, "w2"=>0, "w3"=>5, "w4"=>2, "w5"=>1},
# >> "w3"=>{"w1"=>4, "w2"=>2, "w3"=>0, "w4"=>3, "w5"=>2},
# >> "w4"=>{"w1"=>2, "w2"=>2, "w3"=>1, "w4"=>0, "w5"=>1},
# >> "w5"=>{"w1"=>0, "w2"=>1, "w3"=>1, "w4"=>1, "w5"=>0}}
# >> ["w1", "w2"]
# >> [0, 4, 4, nil]
# >> w1 044
# >> w2 405
# >> w3 420
arにkeyが存在しなければnilではなくて0にしたいのですが何かどうすればいいでしょうか?
403デフォルトの名無しさん:2009/08/25(火) 02:45:24
>>402のコードの方向性は間違ってない
特殊な用件にスマートな解答なんてそうそう無いよ
ないなら自分で作るしか無いんだよ
この行が何やってるか理解すればnilを0にする(?)方法もわかるかも
zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h }
404デフォルトの名無しさん:2009/08/25(火) 02:52:01
>>391
> myurl = allocate
> myurl.instance_eval { initialize(url) }
> myurl
の部分はsuperだけでいい
405203:2009/08/25(火) 04:17:16
>>403
injectが自分にはまだ早いのでeachでやってみました。
ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4)
col = %w(w1 w2 w3 w9)
non = col - ary
〜〜
zero =Hash.new;ary.uniq.each { |v| zero[v]=0}
czero =Hash.new ;col.uniq.each { |v| czero[v]=0}
p zero;p czero
p zero.merge!(czero)
〜〜
ary.each_with_index do |key,i|
(hout[key] = zero.dup) unless hout.key?(key)
ary[i+1,window].select{ |e| e != key }.each { |word| hout[key][word] += 1 }
end
non.each_with_index do |key,i|
(hout[key] = zero.dup) unless hout.key?(key)
ary[i+1,window].select{ |e| e != key }.each { |word| hout[key][word] =0 }
end
pp hout

かなりお行儀が悪いですが、自分の欲しいものができそうなのでこれから加工してみます。
ありがとうございました。
・・・・また、来るかもしれませんが。そのときは、よろしくお願いしますm(_ _)m
406デフォルトの名無しさん:2009/08/25(火) 08:33:15
メソッドに与えられたブロックは、仮引数の最後に & を付けると
手続きオブジェクトとして得られるらしいけど、

def foo(&block)
 ...
end

このとき「if block_given?」と「if block」は等価なの?
前者の式の方をよく目にするけど、どう違うの??
407デフォルトの名無しさん:2009/08/25(火) 09:32:42
def で定義してるぶんにはなんも変わらんので素直に block_given? 使っとけ
408名無し学生:2009/08/25(火) 10:35:40
Visual Basic の課題で困っております。
誰かお答えください。本当に助けてください。

1.Visual Basicの関数で数値を文字に直すCStr()とStr()の違いについて

2.戻り値の違いが確認できる方法を考え、戻り値の違いについて実際に確認し、
  その確認方法と違いを具体的に述べよ。
注意:実際にやったことと、確認した違いを簡潔かつ具体的に書くこと。

3.下記の計算結果などから、Visual Basicで計算できる数値の桁数について考察をまとめ、
  何故そのような制限があるかについて理由を答えよ
  1) 48 x 100 - 81
  2) 12 ÷ 9.3 x 247
  3) 0.2 - 12 ÷ 69
  4) -12 ÷ 100 + 100
409デフォルトの名無しさん:2009/08/25(火) 10:38:32
VBなら「自分が興味のあるソフトを作りなさい」くらいの課題を出せよ
どこの学校だ?
410デフォルトの名無しさん:2009/08/25(火) 10:44:04
そのような曖昧なテーマの課題を出す学校もどうかと思うが。
411デフォルトの名無しさん:2009/08/25(火) 10:48:19
>>409-410
他のスレでもマルチポストしてる奴をいちいち相手にするな。
412デフォルトの名無しさん:2009/08/25(火) 11:22:05
これってRuby勉強の手助けになりますか?
それはさておき、読んで損のない本でしょうか?

「まつもとゆきひろ コードの世界」は全プログラマ必読の名著
http://v.japan.cnet.com/blog/shimizu/2009/07/03/entry_27023475/
413デフォルトの名無しさん:2009/08/25(火) 11:26:27
> これってRuby勉強の手助けになりますか?
いや特には
> それはさておき、読んで損のない本でしょうか?
お金の余ってる人向け
お金が余ってるなら読んでもよい
お金が余ってないならもっと他に読む本があるはず
414デフォルトの名無しさん:2009/08/25(火) 11:37:32
>>413
そうですか。
今回はパスしておきます。
415デフォルトの名無しさん:2009/08/25(火) 13:49:37
どんだけ金ないんだよ
416デフォルトの名無しさん:2009/08/25(火) 14:09:29
ここは学生スレ
417デフォルトの名無しさん:2009/08/25(火) 15:47:13
s = Path::changeext($0, ".cfg")
t = Path.new(s)
t.changeext(".xml") #==> Path::changeext(s, ".xml")

みたいな使い方をしたいんですけど
クラスメソッドとインスタンスメソッドのoverloadなんて無理?

# Pathはただの例です
418デフォルトの名無しさん:2009/08/25(火) 15:57:06
インスタンスメソッドの中でクラスメソッドを呼ぶとかそういう話ではなく?

class Path
 def change_ext(sfx)
  return self.class.change_ext(@str, sfx)
 end
 def self.change_ext(str, sfx)
  …
 end
end
419デフォルトの名無しさん:2009/08/25(火) 19:00:25
>>417
Path::changeext() と t.changeext() はそれぞれ別のメソッドが呼ばれます。

なおその例で「overload」というのは誤解を招くので使わない方がいいです。
質問するなら、
「クラスメソッドとインスタンスメソッドで同じメソッド名を使うことってできる?」
ぐらいにしておけば、overloadという単語を使わなくても済んだでしょう。
420デフォルトの名無しさん:2009/08/25(火) 19:30:18
てか、クラスメソッドの起動で :: を使う人は Ruby ではまずいない
Ruby では :: の右に来るのは定数で、 . の右に来るのはメソッドだから

Ruby ではクラスも定数として格納されてるから、

irb> CONST = 1
irb> CONST = 2
 (irb)2: warning: already initialized constant CONST
irb> class Foo; end
irb> Foo = 2
 (irb):4: warning: already initialized constant Foo

ネストしたクラスは Foo::Bar::Baz と :: で連結するし、
あるクラス Hoge の定数 CONST は :: で連結して Hoge::CONST と綴る

Ruby ではインスタンスメソッドは一般クラスから作られたオブジェクトに属するメソッドだから、
特定のクラスのオブジェクトというかインスタンス s に属するインスタンスメソッド mes は
特定のクラスのインスタンス s に . でメソッドを繋げて s.mes と書くし、
Ruby では スクリプト中に存在するアクセス可能なクラスは Class(または Module)クラスのインスタンスだから、

irb> p "str".class
String
irb> p String.class
Class

クラス S に属するメソッドつまりクラスメソッド moge は
Class クラスのインスタンス S に . でメソッドを繋げて S.moge と表現する
421デフォルトの名無しさん:2009/08/25(火) 21:18:28
ちょっとはじめたばっかりでしつもんなんですけど
Array.newと[]やHash.newと{}のどっちがいいとかありますか?
始めたばっかりでくせをつけておくなら今のうちかなとおもいましたので
こうやるやるべきとかのってるページとかありますか?
422デフォルトの名無しさん:2009/08/25(火) 21:28:09
機能的には同じなので好きなほう使え

[] や {} のリテラル形式は短い
短いということはそれだけで大きな価値がある
ただし hoge#[] メソッド や ブロック {} と一瞬区別がつけにくいことがありうる
一瞬でも読み下しに詰まる可能性があるということはそれだけでマイナスだ

好きなほう使え
423デフォルトの名無しさん:2009/08/25(火) 21:51:25
おいおい同じじゃないだろ
Hash.new、Array.newはデフォルト値やサイズを設定することができる

オレ的には[]{}を基本に使って、
デフォルト値やサイズを指定したい場合はnewを使うのがおすすめかな
424デフォルトの名無しさん:2009/08/25(火) 21:54:24
そんなこと言ったらリテラルな時点で別物だ
そういう区別をして欲しいわけではないだろう
425デフォルトの名無しさん:2009/08/25(火) 22:01:13
機能的な違いのあるなしと一緒にするな
426デフォルトの名無しさん:2009/08/25(火) 22:01:17
別に {} でもデフォルト値は設定できるよ

h = {}
h.default = 0
p h[:a] #=> 0

マニュアルに書いてあるようなことを知りたいんじゃないと思われ
427デフォルトの名無しさん:2009/08/25(火) 22:14:48
h.default←別のメソッド引っ張り出してきてどうする

質問者の潜在的なニーズがなんであれ間違いを教えるのはよくない
両者は「同じ」と書いてあったから「違いがある」と訂正しただけ
それ以上の意味はない
428デフォルトの名無しさん:2009/08/26(水) 08:28:49
RubyではHTMLのエスケープってどこでやるべき?
429デフォルトの名無しさん:2009/08/26(水) 08:38:43
データ出力時

ただしこれには条件がある
「データ出力者全員が自力でエスケープをしなければならないと認識していること」
これが未来に守られる見込みが全くないのなら、
現在のデータ保管者が親代わりにエスケープするのも致し方ない
430デフォルトの名無しさん:2009/08/26(水) 09:08:39
>>428
template
431デフォルトの名無しさん:2009/08/26(水) 10:09:57
入力時でないことは確か
432デフォルトの名無しさん:2009/08/26(水) 11:42:17
>>420
おまえの文章長いよ
もっと要点を絞って簡潔に書こうぜ
433デフォルトの名無しさん:2009/08/26(水) 12:43:55
>>420を蒸し返すと、

a.some_method(1, "str")
a::some_method(1, "str")

上の2つのスタイルのうち、いずれを使うかは趣味の問題です。
ただしクラスメソッドを呼ぶ場合を除いては第1のスタイルが主流です。
筆者はクラスメソッドに対しても一貫して第1のスタイルを用います。

- 初めてのRubyより -

わざわざリリースマネージャが「〜を除いては」と書くくらいだから、
「まずいない」ということはないだろう。
434デフォルトの名無しさん:2009/08/26(水) 12:56:37
実際の観測として「まずいない」と思うが…
そんな大量にコード見てるわけじゃないが、:: でメソッド呼んだ人は今年一度も見てないぞ
>>417が初めてな気がする
435デフォルトの名無しさん:2009/08/26(水) 13:10:14
大文字で始まるメソッドは、括弧を省略すると::で呼び出せない。
そういう細かい条件を考えると、メソッド呼び出しは.で統一するのが無難。
436デフォルトの名無しさん:2009/08/26(水) 18:45:58
すいませんが、質問させて頂きます。
xmpfilterを使いたいのですが、どうも上手く行きません。
OSはWindowsVista , ruby1.8.6です。

gem install rcodetools  でインストールした後

-------------test.rb--
#! ruby -Ks
p 2+3 # =>
--------------------

上記のファイルに対して

xmpfilter test.rb

を実行すると

-e:1: unterminated string meets end of file
-e:1: warning: useless use of a literal in void context

というエラーが出て、実行してくれません。
空のファイルに対しても、どれも同じエラーが出ます。
どうすれば良いかを教えて下さい。
437デフォルトの名無しさん:2009/08/26(水) 19:18:45
2+3 の後ろに全角空白が入ってるんだけどこれは意図したものかな
438436:2009/08/26(水) 19:24:51
>>437
すいません。全角空白は私の不注意でした。
しかし、これを削っても同じエラーが出てしまいます。

ちなみに、xmpfilterを通さなければtest.rbはきちんと実行することが出来ます。
439デフォルトの名無しさん:2009/08/26(水) 19:34:46
自動生成された \bin\xmpfilter がまずいような気もする
もしかして cygwin か?
440436:2009/08/26(水) 19:51:21
>>439
いえ、cygwinではなくコマンドプロンプトです。
rcodetoolsが自動生成するファイルがどこにあるのか分からないのですが、
どこに作成するのか教えて頂けないでしょうか?
441デフォルトの名無しさん:2009/08/26(水) 20:29:59
>>440
gem contents GEM名
あとバージョンはruby -v結果のコピペで
それとたぶんOneClickInstallerだと思うんだけどそれも明記するとありがたい
442デフォルトの名無しさん:2009/08/26(水) 21:03:14
>>441
申し訳ありません。gem contents rcodetoolsとするとファイル構成は出てくるのですが
そこからどこに一時ファイルが作られるのか私には分かりませんでした。

rubyのバージョンは
ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32] です。
http://www.garbagecollect.jp/ruby/mswin32/ja/download/release.html
↑からダウンロードしてきました。

443デフォルトの名無しさん:2009/08/26(水) 23:59:43
ルビーでGUIは作れるのでしょうか?
444デフォルトの名無しさん:2009/08/27(木) 00:02:08
445436:2009/08/27(木) 00:08:38
すいません、多分解決したみたいです。
ruby 1.8.7 , ruby1.9.1 とverを上げてxmpfilterを実行してみたところ無事に実行出来ました。

お騒がせして申し訳ありませんでした。
返信をして下さった方、どうもありがとうございました。
446デフォルトの名無しさん:2009/08/27(木) 21:17:22
データを突っ込んで行ってそれがあるかないかを高速に判断する場合
ハッシュがベストですか?

list["a"] = true

if list["a"] then ...

で動くんですけどtrueってデータもペアで格納されるのがなんとなく無駄な飢餓
447デフォルトの名無しさん:2009/08/27(木) 21:50:35
とりあえず Hash 使えということになってる
Hash で問題がある場合にのみ他のめんどくさい手段を検討する

あと true はいつどこで呼んでもオブジェクト ID が 2 で固定なので無駄も何もねえよ
448デフォルトの名無しさん:2009/08/28(金) 09:53:51
Hashでいいと思う
標準添付のSet(集合)なんてHashで実装されてるし。
449デフォルトの名無しさん:2009/08/28(金) 11:52:17
こっち↓と

if point > 0
 result['WIN'] += 1
elsif point < 0
 result['LOSE]' += 1
else
 result['DRAW'] += 1
end

こっち↓

win_or_lose = point > 0 ? 'WIN'  \
       : point < 0 ? 'LOSE' \
       :        'DRAW'

result[win_or_lose] += 1

どちらがいいと思いますか?
450デフォルトの名無しさん:2009/08/28(金) 11:54:52
>>449
前者。
451デフォルトの名無しさん:2009/08/28(金) 12:10:04
>>450
d
452デフォルトの名無しさん:2009/08/28(金) 12:17:21
三項演算子は好きこのんで使うものじゃないね

result = if flag then true else false end
どうしても一行で書きたい時にこれよりはマシって程度
453デフォルトの名無しさん:2009/08/28(金) 12:35:54
>>449
case
when point > 0 then result['WIN'] += 1
when point == 0 then result['DRAW'] += 1
when point < 0 then result['LOSE'] += 1
end
454デフォルトの名無しさん:2009/08/28(金) 12:42:10
前どっかで書いたが、条件演算子は便利なんだからどんどん使ってよい
そして、どんどん書き換えろ

条件演算子の中で整頓改行したり ( ) でネストしたり ; つけたりするのは禁止
条件演算子の状態に固執するのはただのアホ
条件演算子の 9 割は最終的には長い条件分岐に書き換えられてしまう
だったらプロトタイプは早くてうまくてやっすいのにしたほうがいいってもんだ
455デフォルトの名無しさん:2009/08/28(金) 12:48:24
Rubyの三項演算子の平均寿命は1日だそうな
456デフォルトの名無しさん:2009/08/28(金) 12:49:23
Rubyの場合ifが式だからifで書けばいいと思うんだけど。
可読性もそのほうが高いと思わない?
457デフォルトの名無しさん:2009/08/28(金) 12:52:28
if のほうがわかりやすそうな気がするときと、
条件演算子のほうがわかりやすそうな気がするときの
2つがあるような気がする

極めて単純な見栄えの問題
他の言語では三項演算子だけが値を返すから入れ替えが効かないけど
Rubyは動作自体は結局一緒だから
(パースの受け方は違うかもしれない)
458デフォルトの名無しさん:2009/08/28(金) 12:55:17
>>453
case文も使えるんだ。
なるほど。
459デフォルトの名無しさん:2009/08/28(金) 13:03:54
case文の意味なくないか?w
460デフォルトの名無しさん:2009/08/28(金) 13:08:40
空 case の例としてはわりと妥当だと思う
else raise の余地がないのがやや弱いがわかりやすかろう
461デフォルトの名無しさん:2009/08/28(金) 13:13:41
このへんは cond をかっちょええと思うかわかりにくくなったと思うかという話になるような気がしないでもない
462デフォルトの名無しさん:2009/08/28(金) 13:16:27
result[ case
        when point > 0 then 'WIN'
        when point == 0 then 'DRAW'
        when point < 0 then 'LOSE'
    end ] += 1

だろJK
463デフォルトの名無しさん:2009/08/28(金) 13:17:36
>>460
その空case自体に疑問
条件に重複する部分がないのを暗示してる、みたいなニュアンス?
464デフォルトの名無しさん:2009/08/28(金) 15:30:39
コードゴルファー登場↓
465デフォルトの名無しさん:2009/08/28(金) 16:12:32
わいは猿や!
466デフォルトの名無しさん:2009/08/28(金) 16:24:10
result[point / 0.0] += 1
467466:2009/08/28(金) 16:25:20
point = 0 のときダメだった。スマン
468デフォルトの名無しさん:2009/08/28(金) 16:25:42
result[{1=>'WIN',0=>'DRAW',-1=>'LOSE'}[point<=>0]]+=1
469デフォルトの名無しさん:2009/08/28(金) 16:30:16
result[%w[DRAW WIN LOSE][point<=>0]]+=1
470デフォルトの名無しさん:2009/08/28(金) 18:07:31
配列で要素が重複していたときに重複している要素の値が知りたいのですが
簡単な方法はないでしょうか?
[1,2,3,4,5,6,3]であれば3が知りたいです
重複は1種類が1回だけしていると仮定してかまいません
471デフォルトの名無しさん:2009/08/28(金) 18:30:43
ありそうでないんだよね、そういう機能
重複は全部消去するのが基本
「配列の構成要素を uniq で決定し、それと同じ値を持つ最初の場所を探してその要素を配列から消す」
という手順でやるとこうなる

arr = [1, 2, 3, 4, 5, 6, 3]
arr.uniq.each{|e| arr.delete_at(arr.index(e))}
p arr

[3]

これだと arr が失われてしまうので他の人の案待つか事前に複製でもしとけ
472デフォルトの名無しさん:2009/08/28(金) 19:17:38
a1 = ary.sort
a2 = a1.uniq
i = 0
a1.find_all {|v|
 if v.eql? a2[i]
  i += 1
  false
 else
  true
 end
}

またselectかと言われそうだけどこのスレでは三回目
473デフォルトの名無しさん:2009/08/28(金) 19:28:17
h = {}
p aryfind {|a| h[a] || !(h[a] = true)}
474デフォルトの名無しさん:2009/08/28(金) 19:30:14
ary.find
475デフォルトの名無しさん:2009/08/28(金) 21:12:35
>>470

arr = [1,2,3,4,5,6,3]
hash = {}
hash.default = 0
arr.each {|x| hash[x] += 1 }
p hash.keys.select {|k| hash[k] > 1 }
476470:2009/08/28(金) 21:24:24
みなさん色々な案ありがとうございます
参考にさせてもらいます!
477デフォルトの名無しさん:2009/08/29(土) 07:31:27
One Click InstallerだかをWindowsで入れると、

 RUBYOPT=-rubygems

だかを環境変数に設定するというような余計な(親切な)ことをしてくれるわけですが、
これって、

 require "rubygems"

する必要がなくなるわけですよね?

他の環境などで同じようなこと(RUBYOPT=-rubygems) している人っていますか?
やっぱり、require "rubygems"をソース内に書いた方がいいものですかね?
478デフォルトの名無しさん:2009/08/29(土) 09:13:38
require "rubygems" は必ず書かなければならない
俺が RUBYOPT を嫌いな理由の一つ
わざわざ可搬性下げて何をしたいのか
479デフォルトの名無しさん:2009/08/29(土) 09:45:31
あとから広まって事実上の標準になる予定だったんだよ
480デフォルトの名無しさん:2009/08/29(土) 09:51:04
別に RUBYOPT は rubygems 用の機能じゃねえが、1.9 で組み込みになったから
RUBYOPT=-rubygems に関してはもう無用の長物だな
481デフォルトの名無しさん:2009/08/29(土) 10:20:24
>>470
ary.group_by{|e|e}.to_a.select{|e|e[1].size>1}.map(&:first)
とか
ary.sort.each_cons(2).select{|x,y|x==y}.map(&:first).uniq
とか
482デフォルトの名無しさん:2009/08/29(土) 10:55:34
>>481
selectするならto_aはいらん
と思ったが、multiple values for a block parameter (2 for 1)とい
う警告が何度も出るのか

ary.group_by{|e|e}.select{|e,l|l.size>1}.map(&:first)
483デフォルトの名無しさん:2009/08/29(土) 10:56:49
>>478
> 俺が RUBYOPT を嫌いな理由の一つ
「江戸の仇を長崎で討つ」ってやつか
484デフォルトの名無しさん:2009/08/29(土) 11:15:11
そもそもrubygemsが嫌い
485sage:2009/08/30(日) 00:10:43
同一のテーブル構造をもつデータベースAとBがあって、
データベースの内容を比較したいです。

どちらのデータベースもSQLiteのファイルです。

ActiveRecordというのを使うのが簡単そうなのですが、
可能なのでしょうか?

というのは調べてみるとActiveRecordでは、
データベースへの接続(ActiveRecord::Base.establish_connection)とか、
レコードの検索を、クラスメソッドで操作しています。

となると、上記のように同一クラスから
別々のデータベースへ接続するインスタンスを作成して、
インスタンス経由で操作するという使い方はできないように見えます。
486デフォルトの名無しさん:2009/08/30(日) 01:08:00
>>485
SQLite3::Database.new(file)で両方のデータベース開いて
テーブル毎にレコードの比較した方が楽な気がする
487sage:2009/08/30(日) 01:38:36
>>486
回答ありがとうございます。

SQL書かずにActiveRecordでできたら楽勝!
と思っていたのでなんとかならないかなーと。
488名無しさん@そうだ選挙に行こう:2009/08/30(日) 07:42:50
初めまして。

質問です。

今やってるプロジェクトが、以前、rubyのMVCフレームワークによって書かれました。
その開発した方が、/public_html/.htaccessで何らかの設定をしました。
今回、/public_html/manage/配下にphpのMVCフレームワークを使用して開発することに
なったのですが、/manage/.htaccessで設定しても親ディレクトリの.htaccessの影響を受けて
/manage/配下のファイルにアクセスしても、404になってしまいます。
/public_html/.htaccessの内容も分からず、なるだけ触りたくないのですが、
サブディレクトリの.htaccessで、親ディレクトリの.htaccessの影響を全く受けないようにすることは可能でしょうか。

お忙しいところ、すみません。
よろしくお願いします。
489名無しさん@そうだ選挙に行こう:2009/08/30(日) 08:28:56
Ruby 関係ねえ
.htaccess の書式勉強しろ
490名無しさん@そうだ選挙に行こう:2009/08/30(日) 08:36:08
Ruby関係ないからスレチ

> .htaccessの内容も分からず、なるだけ触りたくないのですが、

それを晒さないと。というより、せめて自分で読んでみないと。
491488:2009/08/30(日) 10:00:38
ご返信ありがとうございます。
サーバーを見てみたのですが、
/public_html/には、.htaccessがありませんでした。
ただ、404の設定がしてあるので、どこかでそのような設定がなされているものと思います。
/public_html/配下には、rubyのRailsで開発してあるようです。

/public_html/manage/には、今回のPHP開発に必要なcakephpのMVCフレームワークが設定してあります。
その.htaccessは、
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
となっています。
例えば、http://domain.com/manage/css/layout.cssにアクセスした場合は
/public_html/manage/app/webroot/css/layout.cssのファイルが読み込まれる設定にしてあります。
外のサーバー(public_htmlにrubyで設計したファイルが置いてないもの)で試したらちゃんと読み込まれていたので、/public_html/manage/配下は正しく設定してあるはずです。
しかし、http://domain.com/manage/css/layout.cssにアクセスすると、404が返ってきます。

/public_html/には、rubyのMVCフレームワークで設計されたファイルがたくさんあり、
私はrubyを知らないので、何かしらの設定がなっているはずなのですが、どこでどうなっているのか分かりません。

たぶん、http://domain.com/manage/css/layout.cssにアクセスしても
cakephpのシステムは読み込まれず、元々のRuby Railsのシステムで処理されていると思います。
本来、http://domain.com/manage/ooo/xxx/ にアクセスすると処理されるのですが、
これも404に行きます。
でも、http://domain.com/manage/index.php/ooo/xxx/ とアクセスすると処理されます。

もし何かご存知でしたら、教えて頂けないでしょうか。
よろしくお願い致します。
492名無しさん@そうだ選挙に行こう:2009/08/30(日) 11:01:02
可能
493名無しさん@そうだ選挙に行こう:2009/08/30(日) 11:05:08
/public_html/.htaccess

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule manage\/$ manage/app/webroot/ [L]
RewriteRule manage\/(.*) manage/app/webroot/$1 [L]
</IfModule>
494名無しさん@そうだ選挙に行こう:2009/08/30(日) 11:12:58
てか Ruby 全く関係ねーということがわかってなお居座るのってなんなの頭悪いの
495名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:43:36
>>494
自分で正しいことをしていると思っているイタイタイプ
周りでは陰で嫌われているのに気づかないタイプ
496名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:45:40
自分の目的が果たされれば何をしても構わないと思ってるタイプ
497sage:2009/08/30(日) 12:54:11
>>485です。

ActiveRecordで、ひとつのモデルで
複数のデータベースに接続するという
使い方ができるか、あきらめきれずにさらにググったところ、
magic_multi_connectionsというgemが見つかりました。

Magic-MultiConnections:
http://magicmodels.rubyforge.org/magic_multi_connections/

とはいえ、ActiveRecordが当初想定している使い方
ではないということがはっきりしました。

他にちょうどいいO/Rマッパってないですか?
498名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:59:58
ソウダネ、IDナイカラ、ダレガダレダカサッパリワカラナイネ。
499名無しさん@そうだ選挙に行こう:2009/08/30(日) 13:02:53
>>497
自作のORe真っ裸ならあるけど
500名無しさん@そうだ選挙に行こう:2009/08/30(日) 15:59:01
>>491
すげーなー。
そのhtaccessファイルの中身の何がおかしいのかもわからない・調べられないのに、
Webアプリケーションを開発しようなんて。

恐ろしくて使いたくないぜ。
501名無しさん@そうだ選挙に行こう:2009/08/30(日) 16:29:07
>>497
テーブルの差異を調べるプログラム位、数十分で書けるだろ
二度と使わないかもしれないORMの調査に無駄な時間を費すの?

dbs = [file1,file2].map {|fn| SQLite3::Database.new(fn) }
dbs[0].tables.each do |table| # tablesなんてメソッドがあるとして
 results = dbs.map {|db| db.execute("select * from #{table}") }
 # results を比較
 :
end
502名無しさん@そうだ選挙に行こう:2009/08/30(日) 16:37:20
SQLを書きたくないんじゃなくて
書けないの間違いだろうな。。
503名無しさん@そうだ選挙に行こう:2009/08/30(日) 16:42:22
クエリに文字列埋め込みステキです
504名無しさん@そうだ選挙に行こう:2009/08/30(日) 16:43:44
何を言ってるの
ユーザーがSQLを直接発行するだなんて悪手中の悪手じゃないか

適当にうまくやるよボタンを押すだけで内部でSQLが組み立てられて
結果のデータのみがユーザーに返ってくるというのが正しいありかただろう
505名無しさん@そうだ選挙に行こう:2009/08/30(日) 16:48:36
>>504
そうなんだよねえ
結局SQLを書かせなければならないことになって深く絶望したわ
なんとかならんもんかね
506名無しさん@そうだ選挙に行こう:2009/08/30(日) 16:52:28
> SQLite3::Database.new(file)で両方のデータベース開いて
> テーブル毎にレコードの比較した方が楽な気がする

答えでてるじゃん。
終了
507名無しさん@そうだ選挙に行こう:2009/08/30(日) 17:05:53
Ruby使うまでもなくdumpしてdiffとればいいんじゃない。
508デフォルトの名無しさん:2009/08/30(日) 21:07:16
なんだろう。
>>501を信じてそのままドンってやって、ガツンと応答不能になり得たりしそうなこの不安感。

初心者スレでこれはありなんだろうか。
>>501の論旨からいうならもうちょっと、丁寧に逐次的に例を出す文脈ではなかろうか。
509501:2009/08/30(日) 21:41:49
>>508
俺に遠慮する必要は無い、君が教えてあげてくれ
510sage:2009/08/30(日) 22:44:10
>>485です。

ActiveRecordではなくてSequelというのが
良さそうというのがわかりました。

Sequel:
http://sequel.rubyforge.org/

こんな感じで書けます。

DBLeft = Sequel.sqlite("./left.sqlite")
left_table_foo = DBLeft[:table_foo]

DBRight = Sequel.sqlite("./right.sqlite")
right_table_foo = DBRight[:table_foo]

left_table_foo.each do |left_rec|
# right_tableのレコードと比較する
end

なんかしつこく質問してしまったみたいですみません。
でも回答してくれて助かりました。では。
511デフォルトの名無しさん:2009/08/31(月) 01:39:52
WinXPで1.8.6です。
文字列を16進ダンプしたものの中に、2バイト文字が含まれているか
どうかを判定するにはどうしたら良いでしょうか?

変換コードは下記の通りです。
arr0 = dataStr.unpack("H*")[0].scan(/[0-9a-f]{2}/)
arr1= arr0.to_s + "\n"

対象のdataStrが Rec の場合 arr1 が 52,65,63 になりますが、
Rク では 52,83,4e です。この場合、真ん中の16進数の83を元に
判定するのでしょうか?
512デフォルトの名無しさん:2009/08/31(月) 01:47:10
>>511
文字コード決めないと「2バイト文字」を定義できなくないか?
513デフォルトの名無しさん:2009/08/31(月) 02:29:10
>>512
ク で 83,4e です
514デフォルトの名無しさん:2009/08/31(月) 02:36:12
zenkaku=false
arr0.each do |c|
 if c>128 do
  zenkaku=true
 end
end
515デフォルトの名無しさん:2009/08/31(月) 03:04:38
>>511
NKF.guess
516デフォルトの名無しさん:2009/08/31(月) 03:32:36
globってなんであんな低機能なまま放置されてんの?
517デフォルトの名無しさん:2009/08/31(月) 05:32:46
cgiてなんであんな低能なまま放置されてんの?
518デフォルトの名無しさん:2009/08/31(月) 06:20:02
cgiは酷いね。参考にも成らない。
いい加減、政権交代の様に入れ替えるべき。
519デフォルトの名無しさん:2009/08/31(月) 06:29:17
cgiに関しては、政権交代!ばかりいってるだけだし民主党よりヒドイw
520デフォルトの名無しさん:2009/08/31(月) 08:48:25
>>518
ヒント:安定した候補者がいない
521デフォルトの名無しさん:2009/08/31(月) 09:06:31
候補者はいるだろ。その候補者を使えるレベルまでもっていくやつがだれもいないだけで。
WEBrickのcgiライブラリのことなんだけど。
522デフォルトの名無しさん:2009/08/31(月) 09:14:12
WEBrick::Sessionがないのはある意味象徴的
523デフォルトの名無しさん:2009/08/31(月) 09:19:35
これは何度でも言うが、作るだけなら立候補は何人もいるしいくつも作品があるんだよ
作るということとメンテナンスを引き受けるということとは全く違う

スレ違いだが
524デフォルトの名無しさん:2009/08/31(月) 09:22:23
>>523
>作るだけなら立候補は何人もいるしいくつも作品があるんだよ

いくつもあるとは知らなかった。
ぜひ紹介してくれ。
525デフォルトの名無しさん:2009/08/31(月) 09:24:01
ネット関連のライブラリは魔界だ
バージョン0.3まで行かずに放置されるのばっかじゃん
526デフォルトの名無しさん:2009/08/31(月) 09:43:34
Rackがバージョン1.0になって有力候補か? と思いきや
CGIで動かすと落ちるバグがあり、しかもなかなか修正リリースが出ないというオチ
527デフォルトの名無しさん:2009/08/31(月) 09:48:25
そんなに悪いところがわかってるなら自分で作ればいいじゃん
528デフォルトの名無しさん:2009/08/31(月) 10:01:21
みんな忙しい。
529デフォルトの名無しさん:2009/08/31(月) 10:11:30
出したコードにはコミュニティ上の責任もたんといかんのでな
書きっぱで後は知らん、というような人はどの世界でもノーサンキューだ
530デフォルトの名無しさん:2009/08/31(月) 12:13:02
口だけじゃないかw
531デフォルトの名無しさん:2009/08/31(月) 12:16:14
みんな忙しい。
みんな忙しい。




みんな忙しい。
532511:2009/08/31(月) 13:04:08
>>512-515
有難うございます。
514さんの方法を採用しました。
533デフォルトの名無しさん:2009/08/31(月) 13:20:40
Perl や Python の CGI ライブラリを移植するのはどうだろうね
534デフォルトの名無しさん:2009/08/31(月) 13:52:18
それは新しい実に新しい
535デフォルトの名無しさん:2009/08/31(月) 14:36:41
じゃあわかりやすいところで Perl の CGI.pm から始めようぜ
536デフォルトの名無しさん:2009/08/31(月) 14:46:39
(ぐるぐるぐる)
CGI.rb ができましたー

新しいスクリプトが欲しいんじゃなくて、スクリプトを継続的にメンテナンスできる人材が欲しいのよ
新機能をガンガン盛り込む人材ってのはとりあえずはコア近辺には要らないんだ
537デフォルトの名無しさん:2009/08/31(月) 15:00:06
だれだよお前
538デフォルトの名無しさん:2009/08/31(月) 15:13:23
>>536
>新しいスクリプトが欲しいんじゃなくて、スクリプトを継続的にメンテナンスできる人材が欲しいのよ

それどうやって判断するの?人材がいたとして、そいつがおまえのいう条件を満たしているかどうかって、だれがどうやって判断するのさ?
だいたい、CGI.rbなんてtDiaryでもHikiでもつかってるんだろうが。それだけユーザ数が多いのに担当できるだけの人材がいない/いなかったのかよ?
ほんとうに人材が欲しいなら、公式にアナウンスしろよ。このライブラリのメンテな求めてます、条件はこうこうです、と公式サイトに載せればいいだろ。
ろくに求人活動もせずに人がいないだの条件はどうのこうの、言い訳がましいわ。
539デフォルトの名無しさん:2009/08/31(月) 15:16:54
スレ違いの内容で長文とか勘弁
他でやってね
540デフォルトの名無しさん:2009/08/31(月) 15:28:35
>>538
じゃあお前やれよ。
541デフォルトの名無しさん:2009/08/31(月) 17:45:00
>>511

>>514 c>128 -> c>=128
542デフォルトの名無しさん:2009/08/31(月) 17:47:00
CGI.rbの上位互換wrapperがあればいいんだよね
oreoreCGIなら作ったけど
543デフォルトの名無しさん:2009/08/31(月) 17:58:11
>>542
あんまりよくないと思う
Rackの修正リリースが出て、標準添付になれば一番いい
544デフォルトの名無しさん:2009/09/01(火) 17:55:47
配列A1, A2, A3, ... Anから要素を1個ずつ取り出した結果を網羅した配列Xを作る。
・・・やってくれるメソッドなかったっけ?
545デフォルトの名無しさん:2009/09/01(火) 18:06:46
>>544
Array#transposeのこと?
546デフォルトの名無しさん:2009/09/01(火) 18:16:27
ありがとう、調べてみました。近いけど、違う。

p [[1,2],
[3,4],
[5,6]].transpose
# => [[1, 3, 5], [2, 4, 6]]

これが下のようになってくれたら期待通りなのです。
# => [[1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6]]
547デフォルトの名無しさん:2009/09/01(火) 18:27:24
data = [[1,2],[3,4],[5,6]]
p data[0].product(*data[1..-1])
548デフォルトの名無しさん:2009/09/01(火) 18:38:41
てゆーか初心者はきちんとeach使え
小手先だけだと詰まるぞ
549デフォルトの名無しさん:2009/09/01(火) 18:58:34
>>548
そうかproductか!1.8.7から入ったんですね。それっぽいキーワードで
ググってもなかなか見つからなかった。どうもです。
550デフォルトの名無しさん:2009/09/01(火) 19:11:53
>>548
行列的操作関連はeach使ったほうがややこしくなりそうな気がする
転置行列は転置行列でしかないわけだし
551デフォルトの名無しさん:2009/09/01(火) 19:40:28
すまん網羅って見落としてた
それにしてもdata.productって書けそうで書けないのかw

>>548
eachで実装した方法を提示するならともかく
初心者に書かせるレベルにならないと思うぞ
552デフォルトの名無しさん:2009/09/02(水) 01:25:47
>>551
>eachで実装した方法を提示するならともかく
>初心者に書かせるレベルにならないと思うぞ
+1
553デフォルトの名無しさん:2009/09/02(水) 02:34:28
def cartesian_product(*data)
    raise if data.size < 2
    data.inject([[]]) do |product, items|
        product.inject([]) do |r, elem|
            r += items.map {|i| elem + [i] }
        end
    end
end
554488:2009/09/03(木) 05:40:09
無知ですみません。

自分なりに色々調べた結果、Passenger/mod_railsを使っているため、
/manage/の.htaccessが、それによって上書きされているようです。
/public_html/フォルダはRuby railsで開発されており、
今回、/public_html/manage/にPHPで開発することになりました。
私は、Rubyを全く知らない&.htaccess初心者なので、このような事態に陥っています。

RailsAllowModRewrite On
を使えば、なおるようなのですが、
/manage/.htaccessでそのように設定しても、/manage/.htaccessに設定してあることが
有効になりません。

どなたか知っていたら教えて頂けないでしょうか。
よろしくお願いします。
555デフォルトの名無しさん:2009/09/03(木) 06:29:57
556デフォルトの名無しさん:2009/09/03(木) 06:37:34
日本語もまともに掛けないのばかか
557デフォルトの名無しさん:2009/09/03(木) 07:42:35
弁護するわけじゃないが普通に分かる
おまえがRailsを分かってないだけだろ
558デフォルトの名無しさん:2009/09/03(木) 11:00:02
>>556
自己紹介乙
559newbie:2009/09/03(木) 12:46:12
たのしいRubyを読み終わったんだが、謎が一つあります。

count = Hash.new(0)
...カウントにkeyとvalueを設定する処理(省略

count.sort{|a,b|
a[1] <=> b[2]
}.each{|key,value|
print "#{key}: #{value}¥n"
}

とあったとして、「<=>」という演算子が左右のオブジェクトを比較して、
<は-1
=は0
>は1
と返してくるのはわかったのだが、どうやってソート処理されているの謎。

内部のsortメソッドでイテレータが並び替えのアルゴリズムで処理してるのでしょうか。
詳しい解説求む。

ちなみに今まで並び替えのアルゴリズムには目をつぶって生きてきたので、
何種類かあってそれぞれに特徴と効率があるというぐらいしか、あまりよくわかってない。
560デフォルトの名無しさん:2009/09/03(木) 12:56:51
-1と0と+1というそれそのものには深い意味はないよ

「今持ってるものが挿入先と比べて大きいか小さいか同じか」を調べてるだけ
手に持ってるものが大きかったら“上”に置いて、小さかったら“下”に置いて、同じだったら“横”に置く

普通にリアルに手元で何かを大きさ順に手動で並べ替えるのと同じ処理をしている
実際はもちろん事前グループ分けとか処理順とかにテクニックがあって単純ではないが、
並べ替えの行為そのものに着目した場合、理屈自体は「大きいか小さいか同じか」と一緒
561デフォルトの名無しさん:2009/09/03(木) 13:07:55
sortメソッドに与えるブロックは「大小の判断基準」
人間に天秤を与えれば重さの大小になるし、ものさしを与えれば長さの大小になるようなもの

その判断基準を元に実際に並べ替えるのはsortメソッドの内部で行われる

sortメソッドは少量のデータを手軽にソートしたいような
ソート手段にこだわる必要のない場合に向いている(大抵は事足りる)

もし速度的に不足するような場合はアルゴリズムを選ぶ必要があるし
それを自分で実装するかライブラリを使う必要がある
562newbie:2009/09/03(木) 13:08:25
>>560
並べ替えのアルゴリズムに処理をわたす黒魔術ってことでいいですか?
563newbie:2009/09/03(木) 13:12:40
>>561
なるほど、判断基準を渡しているってことか。

イテレータの章で判断基準を渡すってのが書いてあった。
「メソッドがどういう比較処理をおこなうかを渡して欲しい場合がある」と。

その処理がブロックで囲まれた a <=> b ってことか。
謎とけたー。気がする。
564デフォルトの名無しさん:2009/09/03(木) 13:13:43
なるほど
sort{|a, b| a <=> b }


 {|a, b| a <=> b } ってなんだよ! いきなり b とか出てくんじゃねえよ!

というとこですな
565デフォルトの名無しさん:2009/09/03(木) 13:17:54
irb> p [5, 4, 3, 2, 1].sort{|a, b| p "a:#{a}, b:#{b}"; a<=>b}
"a:5, b:3"
"a:3, b:1"
"a:4, b:3"
"a:2, b:3"
"a:4, b:5"
"a:1, b:2"
[1, 2, 3, 4, 5]
566デフォルトの名無しさん:2009/09/03(木) 13:45:19
0が偽じゃない言語だから、perlみたいに、比較 or 比較 or 比較 みたいに書けなくて嫌だね
なんでもいいなら、-1,nil,1 でよかったんじゃないのか
567デフォルトの名無しさん:2009/09/03(木) 13:46:07
Cの標準ライブラリにあるqsortも、「比較方法」だけを別関数で
作っておいて、その関数(のポインタ)を引数として渡すような造りになっている。

Strategyパターンですかな。
568デフォルトの名無しさん:2009/09/03(木) 13:50:31
判断基準を別に設けると、ひとつの枠組みを用意するだけで好きに扱えるからいいよね。
人間配列.sort{|a,b| a.身長 <=> b.身長}だとか、体重に変えてみるとか、逆順にソートしてみるとか。
569デフォルトの名無しさん:2009/09/03(木) 14:18:53
>>566
(a.身長 <=> b.身長).nonzero? or (a.体重 <=> b.体重)
570デフォルトの名無しさん:2009/09/03(木) 14:43:53
変数に型がない言語の場合、""や0が偽じゃないことで得られる恩恵の方が多い気がするな

無効値は偽であってほしいけど、正常値を数値や文字列で返す関数などは
0や""も正常値として扱うケースが多い。なので、これらが偽だと、戻り値をそのままブール式につかえない

Perlなんかだと、0も""も偽だから、これらも正常値として返す関数の戻り値をチェックするときは、
die "エラ〜" unless defined get_string()
とかやって、""のケースを除外しなくちゃならない。|| とか && も有効活用できないし
571デフォルトの名無しさん:2009/09/03(木) 14:51:51
>>570
//演算子じゃダメなの?
572デフォルトの名無しさん:2009/09/03(木) 14:57:24
>>569
それって身長が不一致のときにtrueが返らない?

・・・返値はselfかnilなのか、よくできてるなぁ
573デフォルトの名無しさん:2009/09/03(木) 15:00:24
0を偽にしろと言ってるのではなくて、0が返ってきてもうれしくないよねってことでしょ
574デフォルトの名無しさん:2009/09/03(木) 15:07:10
>>573
あぁ、そっか。骨髄反射してた。さーせん
575デフォルトの名無しさん:2009/09/03(木) 15:18:53
["foo", "Bar", "baZ"].uppereach{|i| puts i}

FOO
BAR
BAZ

みたいなマイ繰返子って作れんの?
576newbie:2009/09/03(木) 15:46:30
>>565
黒魔術解明!!ありがと。スッキリしたぁ。
577デフォルトの名無しさん:2009/09/03(木) 15:46:43
def uppereach
hoge.each do |x|
yield x.upcase
end
end
みたいな?(Arrayに組み込むのってどうやるんだっけ)
578デフォルトの名無しさん:2009/09/03(木) 15:49:30
class Array
def uppereach
self.each do |s|
yield s.upcase
end
end
end
579デフォルトの名無しさん:2009/09/03(木) 15:50:03
newbie氏はブロックがわかってないとみた。
別に黒魔術でもなんでもない。
580デフォルトの名無しさん:2009/09/03(木) 15:59:53
黒魔術というとevil-rubyみたいな。(よいこは検索しないように)

581newbie:2009/09/03(木) 17:23:30
>>579
今回の場合、yieldに与える処理ってことですよね?

yield自体、今日、たのしいRubyを読んで知ったばかりなので…。
わかってないといわれれば、わかってないはず。

間違ってますか?
582デフォルトの名無しさん:2009/09/03(木) 17:44:22
yieldって文脈次第でいろんな日本語になるんだな。
イテレータの場合は何だろ。「任せる」?
583デフォルトの名無しさん:2009/09/03(木) 18:10:50
つまり
yield (newbieさん.理解度)
てことか
584デフォルトの名無しさん:2009/09/03(木) 18:15:22
産むかと。
585デフォルトの名無しさん:2009/09/03(木) 18:29:16
14歳から始めるruby買ったが外した
標準命令の説明あんま書いてないし
内容が詳しくない
586デフォルトの名無しさん:2009/09/03(木) 19:38:52
「14歳からはじめるC」なら買ったんだけど
587デフォルトの名無しさん:2009/09/03(木) 19:50:10
標準命令って何?
588デフォルトの名無しさん:2009/09/03(木) 19:55:19
え、なにこいつ標準命令も知らんののかwwwwバカスwwwwww
mesとかfontとかboxfとかくらい使えるようにしとけwwwwwwww

HSPの
589デフォルトの名無しさん:2009/09/03(木) 20:01:00
まあ言いたいことはそれなりに伝わっては来る

お勧め本以外をいきなり買っても自己責任でよろしこ
590デフォルトの名無しさん:2009/09/03(木) 20:11:40
高っかい金出して最初のデカいRuby本を買った初心者の人に比べればどうということはない
591デフォルトの名無しさん:2009/09/03(木) 20:17:12
オライリーファン登場
592デフォルトの名無しさん:2009/09/03(木) 20:18:32
Rubyを始めようと思っただけのプログラミング初心者の人には荷が勝ちすぎた薀蓄本だったな

知識さえあれば面白い本なんだけどね
593newbie:2009/09/03(木) 23:11:34
>>583
どう処理されるのか自分が知りたい(w
594デフォルトの名無しさん:2009/09/03(木) 23:28:59
>>593
自分の努力しだいだよ。
基本的なアルゴリズムをすっぽかしてきたみたいだけど
一度自分で手を動かして実装しておくと後の理解が断然楽になる。
バブルソートとか簡単なものだけでもやっとくのがオススメ。
595デフォルトの名無しさん:2009/09/04(金) 03:44:50
いまどき、ソートのアルゴリズムを自分で書いてるような
コーディングなんてしてたら、全面的に見直して作り直したほうがいい。
596デフォルトの名無しさん:2009/09/04(金) 04:28:47
なんだ、まだそんなこと言ってる人がいるのか
自力でのソートの実装は並び替えをさせるために書くんじゃねえよ
書けるだけの抽象化知識と基礎的な実装力があることが重要

自作のソートのコードを利用する奴は95%までバカだが、
ソートのコードを書けないのは100%ただのバカ
597デフォルトの名無しさん:2009/09/04(金) 05:22:19
>>569
nonezero?ってながいなあ。nz? くらいでよくない?
598デフォルトの名無しさん:2009/09/04(金) 06:04:23
よくない
599デフォルトの名無しさん:2009/09/04(金) 09:11:11
ブロック付きのsortってほとんど使わんよな
大抵sort_byで済む
600デフォルトの名無しさん:2009/09/04(金) 09:51:09
>>597
本気でそう思うならredmineにfeature request
601デフォルトの名無しさん:2009/09/04(金) 11:13:11
ソートの基準が2段階のとき
sort{|o1,o2|
if o1.a != o2.a
o1.a <=> o2.a
else
o1.b <=> o2.b
end
}
みたいに使ってるな
602デフォルトの名無しさん:2009/09/04(金) 11:35:19
rubyの場合は、配列にして比較するんでしょ。効率の善し悪しは知らないが
603デフォルトの名無しさん:2009/09/04(金) 11:38:50
Enumerable#sort の場合は Ruby スクリプトに降りてこないから遅いわけではないよ
604デフォルトの名無しさん:2009/09/04(金) 11:42:04
俺もほとんど.sort_byだなあ
605デフォルトの名無しさん:2009/09/04(金) 11:42:06
>>596
> 自作のソートのコードを利用する奴は95%までバカだが、
> ソートのコードを書けないのは100%ただのバカ
うむ

説明からソートをコードに起こせない人は時々いて、そういう人は例外なくアレ
ソートをコードにする練習はソートくらいでしかうまく鍛えられないから、
初心者のままでいいと思ってないのなら文句言わず今自分の手を動かしてやるべき
606newbie:2009/09/04(金) 16:39:29
>>601
なるほど。配列引数便利だ!
607デフォルトの名無しさん:2009/09/04(金) 18:37:40
>>601
> ソートの基準が2段階のとき
でも条件が単純ならば大抵sort_byですむ
ブロック付sortなんてsort_byが出来てから使ったこと無いなぁ
A=Struct.new(:a,:b)
a = [A.new(2,4),A.new(2,1),A.new(1,5),A.new(1,1)]
p a.sort_by{|o| [o.a,o.b] }


文字列中の数字を数としてソートするなんかだとどう書くんだろう?
a = %w(3a 20a 100a b9 b80 b700 a9b100 a10b100)
p a.sort_by{|e| e.scan(/\d+|\D+/).map{|e| e[/\d/] ? ['0',e.to_i] : [e]}}
こんなんでいいのかな?
608デフォルトの名無しさん:2009/09/04(金) 18:39:12
アルゴリズムの勉強していたら夏休み終わってたんだが。
609デフォルトの名無しさん:2009/09/04(金) 19:07:19
>>608
ユークリッドの互除法を理解しただけで夏が終わった俺よりマシだ
気にすること無いぞ
610デフォルトの名無しさん:2009/09/04(金) 20:14:34
Ruby 1 初めてのプログラミング(arton/宇野るいも 著)を買ったらRuby1.9.1が付いて来たんだが。
具体的に不便なところ(使えないもの)を教えてもらえないだろうか?
あと、このサイト(http://www.rubylife.jp/ini/)にある、
『オプション指定をプログラム内に記述』というソース内で文字コードを指定する方法が実行できないのだが、
1.9.1では使えないということなのだろう?
誰か頼む。
611デフォルトの名無しさん:2009/09/04(金) 20:21:33
英文テキストを送って翻訳サイトで日本語化してstdoutに文字列表示するサンプルどっかにない
612デフォルトの名無しさん:2009/09/04(金) 21:36:47
613デフォルトの名無しさん:2009/09/04(金) 21:38:56
>>610
> あと、このサイト(http://www.rubylife.jp/ini/)にある、
> 『オプション指定をプログラム内に記述』というソース内で文字コードを指定する方法が実行できないのだが、
> 1.9.1では使えないということなのだろう?
使えるよ。具体的にどう書いてどうなった?
614デフォルトの名無しさん:2009/09/04(金) 22:07:07
使えないだろ。嘘言うな
615デフォルトの名無しさん:2009/09/04(金) 22:12:13
>>612
すげ〜。ありがとう。

いい加減CGIも勉強した方がいいのかな。
あとまだ10年くらいは通用する技術なんだろうか。
616デフォルトの名無しさん:2009/09/04(金) 22:16:09
誰かruby-1.8.6-p383をgcc4.4.0のmingwでビルドしてない?
make testしたらエラー出るんだけど。

not ok float 1 -- ./sample/test.rb:1172
not ok float 2 -- ./sample/test.rb:1173
not ok float 3 -- ./sample/test.rb:1174

って感じでエラー。
617デフォルトの名無しさん:2009/09/04(金) 22:21:21
>>615
CGIもできないヤツがHTTPでなにかできるとは思えないから
通用云々よりまずできるようにしとけ
618デフォルトの名無しさん:2009/09/04(金) 23:37:02
PerlのURI::Fetchに相当するような、CacheつきWebクライアントはないでしょうか?
619デフォルトの名無しさん:2009/09/04(金) 23:58:40
vim-rubyをインストールしたのですが、vim-ruby-install.rbのセットアップが上手くいきません。

$ gem install vim-ruby
>WARNING: Installing to ~/.gem since /usr/lib/ruby/gems/1.8 and /usr/bin aren't both writable.
>WARNIG: You don't have /home/****/.gem/ruby/1.8/bin in your PATH,
> gem executables will not run.
>Successfully installed vim-ruby-2007.05.07
>1 gem installed

$ sudo vim-ruby-install.rb
>Can't find source directory.

上のように出力されてvim-rubyのセットアップができません。
気になるのが、/usr/bin/vim-ruby-install.rbファイルは存在するのに/usr/lib/ruby/gems/1.8/gemsディレクトリにvim-rubyが無いのです。(gemからインストールした他のgemパッケージは全てここにある)
しかしgem listコマンドを叩くと他のgemパッケージとともにvim-rubyが出力される。
何か分かる方がいましたら教えてください。よろしくお願いします。
620デフォルトの名無しさん:2009/09/05(土) 00:11:12
>>615 >>617
ajax で javascript が開発の中心になっても CGI は細々と生き残るだろう
ただし HTML は javascript の単なる loader になり
CGI はバックエンドとしての RDB - XML translator になり下がる
621デフォルトの名無しさん:2009/09/05(土) 00:14:18
>>615
CGIっつーよりwebAPIだよ
622デフォルトの名無しさん:2009/09/05(土) 00:14:33
ぽかーん。
623デフォルトの名無しさん:2009/09/05(土) 00:27:34
>>620-621
わかってないならレスしなくていいよ・・・
624デフォルトの名無しさん:2009/09/05(土) 01:09:33
pythonのようにコンソール上でコマンド1つ1つ実行させて
動作を確認させることはできないのですか?
625デフォルトの名無しさん:2009/09/05(土) 01:12:26
つirb
626デフォルトの名無しさん:2009/09/05(土) 04:24:09
RubyでCGI(笑)
627デフォルトの名無しさん:2009/09/05(土) 05:26:51
>>619
眠いから論理的に読んでないが、
gem は sudo したとき(/usr に書き込み権限があるとき)と
一般ユーザーで使用したとき(/usr に書き込み権限がないとき)とで使用するディレクトリが違う
完全自動で /usr/bin にインストールして欲しいなら最初から sudo gem install しろ
gem install すると gem は $HOME/.gem/ruby/1.8 とかに入る

昔は全員が sudo しまくってたんだが、最近は sudo しないインストール方法が市民権を得ている
いまだに Rakefile で sudo ベタ書きしてるライブラリがあるがとっとと死んでくれてよい
628デフォルトの名無しさん:2009/09/05(土) 06:16:17
>>619
何が起きたのか書いてあるじゃん
629デフォルトの名無しさん:2009/09/05(土) 06:17:49
へ?なんで?意味がわからない。
630610:2009/09/05(土) 06:37:13
>>613
そのサイトの該当部分は、正確には『Ruby入門 >日本語と文字コード >オプション指定をプログラム内に記述』だった。
すまん、言葉が足りんかった。
プログラムだが、これ↓を実行すると、
#! ruby -Ku
print("KCODE=", $KCODE);
こう↓なる。
test.rb:2: warning: variable $KCODE is no longer effective
KCODE=
631デフォルトの名無しさん:2009/09/05(土) 06:55:01
いやそれはメッセージがそのまんまだが

っていうかこれの経緯の解説が無いならその本投げ捨てろ
$KCODE が動作するのは 1.8 までで、1.9 からは別な方法で指定する
632デフォルトの名無しさん:2009/09/05(土) 07:06:23
633デフォルトの名無しさん:2009/09/05(土) 07:18:33
こういう場合大抵その本に罪はないw
634610:2009/09/05(土) 08:48:43
>>631-632
答えてくれてありがとう。
632のリンク先は自分が勉強不足なせいで何言ってるか半分も理解できなかったがw
本にはマジックコメントを使うと書いてあったんだが、ネットで調べてみたら別の事が書いてあったんで混乱したんだ。

やっぱり別の本買えばよかった(´;ω;`)
635デフォルトの名無しさん:2009/09/05(土) 09:29:21
>>632はまだ理解できなくても問題ない
これは Ruby1.8 をある程度修めてて
なおかつエンコーディングの日常的知識があることを前提としている一次文書だ

Ruby 1.9.1 で初めてプログラミング言語に触れる人だとか
文字エンコーディングってナンデスカという人だとか
そういう人向けの文書ではない

そういう人向けの解説はこれをもとに出てくる…はずなんだが、ばあさんやまだかいのう
636デフォルトの名無しさん:2009/09/05(土) 09:29:45
637デフォルトの名無しさん:2009/09/05(土) 11:19:17
>>615
CGIというか、HTMLを使った基本的なWebアプリが作れるようになれば便利
あと10年ぐらいは、HTMLやHTTPが無くなることはないだろう
638デフォルトの名無しさん:2009/09/05(土) 11:29:25
今さすがにCGIはなあ、とか思うんだけど、
で、まあwebアプリを初心者に勧めるとして何するのが(どんなライブラリ使うのが)いいんだろ。

Railsはでかいは、デプロイ面倒だわ、慣れるとすごくいいいんだけど、初心者がいきなりやるには…。

Sinatra辺りだろうか?
639デフォルトの名無しさん:2009/09/05(土) 11:46:14
CGIが書けずにフレームワーク扱いだす新人PGって、
交通ルール知らずに車運転するようなもんじゃないだろうか
640デフォルトの名無しさん:2009/09/05(土) 11:50:33
どこぞのフレームワークと違って
やって無駄になるような技術ではまったくないね
641デフォルトの名無しさん:2009/09/05(土) 11:50:51
比喩は嫌いだ
642デフォルトの名無しさん:2009/09/05(土) 11:56:56
webアプリ初心者が序盤に作ったモノはひどいデキになって当たり前なんだから
まずはライブラリなしの生CGIでいいんだよ
薄っぺらい仕様だからとっかかりにはちょうどいい

セキュリティはこの際忘れろ、ローカルでやるかbasic認証でもかけて隠しとけ
セキュリティやらフレームワークやらはCGIの基礎がわかってから考えろ
643デフォルトの名無しさん:2009/09/05(土) 12:11:04
KENTととほほを知ったことには感謝しなければならない
>>642で納得していただろうから
644デフォルトの名無しさん:2009/09/05(土) 12:26:40
「考えない」んだよな
そりゃそうだ、今の時点で「動作してる」のに、何を付け加える理由があろう

むしろ、安全じゃない文字の基本的テストが標準付属していて、
それを通さないとそもそも動作しないとかそういうフレームワークがあれば
645デフォルトの名無しさん:2009/09/05(土) 17:31:11
Railsの話題なのですが、rubyに共通する話なのでこちらで聞いてみます。
スクリプトのデバッグにruby-debugを使ってみているのですが、
b(break)コマンドでブレイクポイントを表示してくれず、現在行がブレイクポイントに追加されてしまいます。

ブレイクポイントを表示するにはどうしたらよいのでしょうか?

下記を見ると、breakでブレイクポイントの表示のはずなのですが・・・???
debug - Rubyリファレンスマニュアル
http://www.ruby-lang.org/ja/man/html/debug.html


ruby-debug 0.10.3
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Ubuntu 9.04 (coLinux)
646645:2009/09/05(土) 17:54:55
どうも、ruby-debug 0.10でコマンドが変わっていたみたいです。

下記サイトが参考になり申した
Ruby On Rails ピチカート街道 - Rails 2.0・その10(ruby-debugコマンドマニュアルv.0.10.0 デバッグの方法が簡単に) -
http://rubist.blog77.fc2.com/blog-entry-114.html


具体的には、b(break)ではなく info breakpointsでブレイクポイントを表示できるみたいです。って面倒くさいくなっとるやん!!


とにかく解決しました。ありがとうごっざいました。
647610:2009/09/05(土) 18:40:01
>>636
これは……RoRをやれ、ということか?
いずれRoRをやろうと思ってたからありがたいのだが、これでRubyも勉強できる?
嗚呼、RoRはRuby1.8.7対応か。畜生、4000円パーだ。
648デフォルトの名無しさん:2009/09/05(土) 19:58:33
>>647
それは著者がarton氏+初心者にRoRを進めるというギャグ

まずは一冊目をじっくり勉強してみたらいいんじゃないか
それから1.8前提の既存サイトで勉強しても全く問題ないよ
649デフォルトの名無しさん:2009/09/05(土) 20:14:55
650デフォルトの名無しさん:2009/09/05(土) 22:24:07
>>610は「初めてのRuby」(オライリー)を買っておけ。
あれ一冊読んでおけば今回のようなつまらないことで迷うことはない。
651デフォルトの名無しさん:2009/09/05(土) 22:32:29
yugui本か。
公式の愛称はキリン本らしいけど……

他の言語の経験があれば、よい本。
652デフォルトの名無しさん:2009/09/05(土) 23:03:03
>>649
サンクス。
こっちでした。GCC4.4.0の最適化はダメってことかな。
http://redmine.ruby-lang.org/issues/show/1735
653619:2009/09/05(土) 23:10:49
>>627
ありがとうございます。
アドバイス頂いたとおりsudoコマンドでインストールしてみましたが、 それでも$HOME/.gem/ruby/1.8以下に入ってしまうようです。
sudoではなく、suコマンドでrootになってからgem install vim-rubyとすると、/usr/lib/ruby/gems/1.8/gems以下にvim-rubyディレクトリが作成されました。

一般ユーザーでgem installすると$HOME/.gem以下にパッケージが配置されるだけで、uninstallコマンドも効かず自力でディレクトリ削除するしか無いようですが、これが一般的な方法なのでしょうか?
654デフォルトの名無しさん:2009/09/06(日) 00:11:20
データ書き込み用にカレントディレクトリに temp.txt を作成する。すでに有るなら失敗する。
という処理をアトミックに書く方法を教えてください。
openじゃ無理ですか?

ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
655デフォルトの名無しさん:2009/09/06(日) 00:26:34
unix系ならこれで行けるけどWindowsはわからんなあ
open('temp.txt',File::EXCL|File::CREAT|File::RDWR)
656デフォルトの名無しさん:2009/09/06(日) 00:41:20

一発1行で書きたいなら>>655がそのまんまだが、これはちとわかりにくい
普通に長々と条件分岐させたほうが得策かもしれない
657デフォルトの名無しさん:2009/09/06(日) 00:46:31
……
658デフォルトの名無しさん:2009/09/06(日) 00:46:50
アトミックが要求される場面で長々とは書けないんじゃ?
659デフォルトの名無しさん:2009/09/06(日) 00:51:47
アトミックとかもう初心者スレの話題じゃないだろう
660デフォルトの名無しさん:2009/09/06(日) 00:53:04
わかりにくい以前に
File::EXCL|File::CREAT|File::RDWR
の意味を調べる術がないという
661デフォルトの名無しさん:2009/09/06(日) 01:05:03
>>654
ロック処理をきちんと書くべきだと思う
もしくは、ロック処理をやってくれるライブラリを探すか

適当でいい(とりあえず動けばいい)ならflockでOK
662デフォルトの名無しさん:2009/09/06(日) 01:14:49
>>660
ただの数字だぞ
663デフォルトの名無しさん:2009/09/06(日) 01:15:15
>>659
このスレで扱う「初心者」がRubyなのかプログラミングなのかだなw
664デフォルトの名無しさん:2009/09/06(日) 01:15:41
いや、やりたいことからしたら>>655しかないだろ
初心者スレだからって何をとんちんかんなことばかり
665デフォルトの名無しさん:2009/09/06(日) 06:51:57
↓ここでお手本になるような排他制御のサンプルを一つ
666デフォルトの名無しさん:2009/09/06(日) 08:04:06
シンプルに、追記でopenして読み込んでからの分岐だけではいかんのか?
目的がわからんのでなんとも言えんが。
667デフォルトの名無しさん:2009/09/06(日) 08:56:43
……
668デフォルトの名無しさん:2009/09/06(日) 09:05:35
>>664
ヒント:リファレンスにFile::EXCLの意味が載ってない
669デフォルトの名無しさん:2009/09/06(日) 09:06:54
RubyとPythonはどっちが強いですか?
670デフォルトの名無しさん:2009/09/06(日) 09:07:08
Rubyのドキュメンテーションのダメさは異常
671デフォルトの名無しさん:2009/09/06(日) 09:31:43
ハイレベルPythonユーザーのアプリケーション製作能力は異常
が、その下の層が薄い印象

Rubyはハイレベルユーザーの数が多くない代わり、中級ユーザー層が厚い感じ

Python自体は凄いんだが、高次に使いこなすための敷居があまりに高すぎる
672デフォルトの名無しさん:2009/09/06(日) 10:34:50
Pythonは具体的にどうすごいんだ?全く知らんのだが
673デフォルトの名無しさん:2009/09/06(日) 10:37:58
endを書かないことで最大1.5倍程度ソース密度が高まる
674デフォルトの名無しさん:2009/09/06(日) 10:47:24
それで敷居が高いのかw
675デフォルトの名無しさん:2009/09/06(日) 10:59:16
Pythonにはギッチリよりスカスカをよしとする哲学と78文字制があってだな
676デフォルトの名無しさん:2009/09/06(日) 10:59:49
CentOS release 5.3 (Final)
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux]

gem install hpricotで、hpricotをインストールしようとしているのですが、
ビルドエラーが出てインストール出来ません。
どのようにしたらインストールできるでしょうか。
よろしくお願いします。

Building native extensions. This could take a while...
ERROR: Error installing hpricot:
ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb
checking for main() in -lc... yes
creating Makefile

make
gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-linux -I. -D_FILE_OFFSET_BITS=64 -fPIC -g -O2 -c hpricot_css.c
hpricot_css.c: In function ‘hpricot_css’:
hpricot_css.c:3399: warning: comparison between pointer and integer
gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-linux -I. -D_FILE_OFFSET_BITS=64 -fPIC -g -O2 -c hpricot_scan.c

cc1: out of memory allocating 481668 bytes after a total of 13987840 bytes
make: *** [hpricot_scan.o] Error 1


Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/hpricot-0.8.1 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/hpricot-0.8.1/ext/hpricot_scan/gem_make.out


677デフォルトの名無しさん:2009/09/06(日) 11:09:41
>>670
Perlのドキュメントのなさほどひどくはない
678デフォルトの名無しさん:2009/09/06(日) 11:14:59
>>677
なにいってんだか
679デフォルトの名無しさん:2009/09/06(日) 11:17:33
これわひどい

ウェブ
検索ツールを閉じる検索ツールを表示

excl ruby に一致する日本語のページ 約 1,180,000 件中 1 - 50 件目 (0.44 秒)

もしかして: excel ruby
検索結果

1.
Rubyist Magazine - Win32OLE 活用法 【第 2 回】 Excel
2.
Rubyist Magazine - RegionalRubyKaigi レポート (01) 東京 Ruby 会議 01
3.
Take it easy!: Ruby とエクセル
4.
はてなブックマーク - { B!} - excel - Ruby on Rails
5.
はてなブックマーク - kedmブクマ - excel - ruby
6.
RubyでExcel - Ruby/Rails・Web系プログラム情報まとめ
680デフォルトの名無しさん:2009/09/06(日) 11:24:08
ごめんなさい。再起動したらいけました。
681デフォルトの名無しさん:2009/09/06(日) 11:31:14
>>679
excl ruby -excel
682デフォルトの名無しさん:2009/09/06(日) 11:41:38
>>668
See man open(2) for more information.
683デフォルトの名無しさん:2009/09/06(日) 11:44:08
ここに書く暇あったらwiki直せよw
684デフォルトの名無しさん:2009/09/06(日) 11:47:55
rdocで定数の説明ってどこに書くんだっけ
685デフォルトの名無しさん:2009/09/06(日) 11:49:28
これでR**yを殲滅できるぞ!
ttp://d.hatena.ne.jp/wasisan/20090905
686デフォルトの名無しさん:2009/09/06(日) 12:02:47
こっちには一通り載ってるんだな
http://doc.okkez.net/192/view/class/File=Constants
687デフォルトの名無しさん:2009/09/06(日) 12:32:04
>>685
この方、あんまり、物事を嫌い嫌い言うのって敵作るだけだから止めた方がいいと思うんだけどね。
webに不満をぶちまけること自体はかまわんと思うが。

しかし、schemeが日の目を見ないって嘆いているのが、現実を見れていないようなのだし、
前述の件もあるからあまり関わるのはよしたほうがよさそうw
688デフォルトの名無しさん:2009/09/06(日) 12:37:05
まあでも世の中はどう転ぶかわかんないから
なにそれおいしいのだったOOPも今や知ってて当たり前だし
689デフォルトの名無しさん:2009/09/06(日) 12:38:13
>>670
っていうか、明らかに「日本人のドキュメンテーションのダメさは異常」なんだよな。
日本人のタッチするところ、ドキュメントの無い世界が広がるってなもんで。
690デフォルトの名無しさん:2009/09/06(日) 14:12:10
それは、外国人の書いたもので日本で使われるようなものは、
ドキュメントがあるものだけだからな。視野に入ってないだけ。
691デフォルトの名無しさん:2009/09/06(日) 15:26:00
>>687
いや、個人の好き嫌いを述べるのは別に構わんと思うが。

「海外のブログでは批判記事も目にする(そして、その筆者も知らないのに叩く
なと逆に叩かれる)ことが結構あるのに、日本ではこれが非常に少ない。」
と書いてる通り、叩かれることも自ら望んでるんだろうし。
692デフォルトの名無しさん:2009/09/06(日) 15:32:24
そろそろ隔離スレ行こうね
693デフォルトの名無しさん:2009/09/06(日) 18:42:30
>>690
I got it!
694デフォルトの名無しさん:2009/09/06(日) 18:44:10
913 nobodyさん [sage] Date:2009/09/06(日) 14:23:30  ID:??? Be:
    >>905-907
    本当だ。なんだこれ?

    mswin32版のRuby 1.8.7-p160が遅すぎる件 - 那由多屋 開発日誌
    http://d.hatena.ne.jp/nayutaya/20090601/1243848756

    L'eclat des jours(2009-04-22)
    http://www.artonx.org/diary/20090422.html

    (コメ欄)
695デフォルトの名無しさん:2009/09/06(日) 19:00:23
>>691
このBlog書いてるの誰?
696デフォルトの名無しさん:2009/09/06(日) 19:11:53
>>691
批判とかツッコミはやめたほうがいいよ。スルー推奨。
過去の記事を読めばわかるけど、実は極度に打たれ弱い。
697デフォルトの名無しさん:2009/09/06(日) 19:24:49
> 実は極度に打たれ弱い。
叩き甲斐があるってもんじゃないか
698デフォルトの名無しさん:2009/09/06(日) 19:26:10
いや全然
オモチャが極端に少ない生活してるんだな
699デフォルトの名無しさん:2009/09/06(日) 19:26:43
>>697
> 叩き甲斐があるってもんじゃないか

叩き甲斐とは、叩かれ強い人を精神病院送りにした時感じるもの。
700デフォルトの名無しさん:2009/09/06(日) 20:06:46
>>696
本人乙
701デフォルトの名無しさん:2009/09/06(日) 20:12:45
うざい
702デフォルトの名無しさん:2009/09/06(日) 20:13:41
マジで本人乙
703デフォルトの名無しさん:2009/09/06(日) 20:45:32
うざい
704デフォルトの名無しさん:2009/09/06(日) 20:49:45

             ,.、   .,r.、
            ,! ヽ ,:'  ゙;.
            !  ゙, |   }
            ゙;  i_i  ,/
             ,r'     `ヽ、
|  ,.、  ,r.、    ,i" _,    ._   ゙;
| ,! ヽ,:'  ゙;.     !. ・     ・  ,!
| !   ,!  }     ヽ、 x    _,r''
|二゙;  i二二二(⌒ノ"''`''''''''''''"´`ヽ.
| ,r'      `ヽ、 ´ヾ、      l  l
,i"   _,   _ ゙;    !      i___|
!.  ・     ・,!   |       t,ノ
|ゝ_    x _::'    !、、、、、、、、、、!
|,/"`''''''''''''''"´';,     |   |    |
(,;!         !)       |   |   |
|゙''::r--、::--;r'        |____|_____|
|―゙'ー-‐゙ー-゙'―┐   (,,,__(,,,____)
705697:2009/09/06(日) 20:54:13
>>699
うん、オモチャで遊ぶときは今のオモチャを壊してから次のオモチャで遊ぶもんでね
一つのオモチャで2回遊んだことないんだ。
706デフォルトの名無しさん:2009/09/06(日) 21:03:29
ほんとに基地外スレ・・・
707デフォルトの名無しさん:2009/09/06(日) 21:08:40
そんなにほめてくれなくても(赤面)
708デフォルトの名無しさん:2009/09/06(日) 21:17:00
なにそれこわい
709デフォルトの名無しさん:2009/09/06(日) 22:08:16
MoonGiftだっけ?
710デフォルトの名無しさん:2009/09/06(日) 23:38:46
Ruby上でPythonを走らせる実装にRuby/Pythonがありますが
逆にPython上でRubyを走らせる実装ってありますか?

BlenderでRubyを使いたいです・・・
711デフォルトの名無しさん:2009/09/06(日) 23:42:50
ruby-1.8.6-p383をgcc4.4.0のmingwでビルドする場合は、
ルートのMakefileのCFLAGから-O2を外してmakeすれば良いみたい。testとtest-all通った。

ruby-1.8.7-p174はtestは通ったがtest-allするとtestが全然始まらない。重いだけかな?
712デフォルトの名無しさん:2009/09/07(月) 00:09:02
>>709
MoonWolf
713デフォルトの名無しさん:2009/09/07(月) 02:25:13
確かな匂い
714デフォルトの名無しさん:2009/09/07(月) 07:32:47
次のエントリもひどいな。これは、もはや才能。
715デフォルトの名無しさん:2009/09/07(月) 08:58:22
本人のブログに突撃するのはかわいそうだからやめようね。
突っ込みたい人はここでどうぞ。好きなだけ突っ込んであげて。
716デフォルトの名無しさん:2009/09/07(月) 09:03:05
RubyのeachへProc渡し
p = Proc.new {|x|
  print(x)
  if (x == 2)
    return
  end
  print(', ')
}
717デフォルトの名無しさん:2009/09/07(月) 09:18:35
本人はココに常駐してるのかw
718デフォルトの名無しさん:2009/09/07(月) 09:34:31
もう触れるなよ
エントリ更新するたびに出てくるようになるぞ
719デフォルトの名無しさん:2009/09/07(月) 10:36:34
MoonwolfってRubyistだったと思ってたけど、いつの間にRubyぎらいになったんだ
720デフォルトの名無しさん:2009/09/07(月) 10:47:11
Headius: Introducing Surinx
http://blog.headius.com/2009/08/introducing-surinx.html


JRubyの人が新しい言語作るってよ。

Duby = Rubyの見た目+Javaの型システム+静的型、型推論
Surinx = Rubyの見た目+Javaの型システム+動的言語
721デフォルトの名無しさん:2009/09/07(月) 10:55:43
>>720
スレ違い
722デフォルトの名無しさん:2009/09/07(月) 10:57:09
dailsとか出てくるのかな
723デフォルトの名無しさん:2009/09/07(月) 10:59:43
anarchy golf - hello world
http://golf.shinh.org/p.rb?hello+world#Ruby

おいいいいい、RubyでHello worldが12バイトとかどうやんだよ。解説よろ
724デフォルトの名無しさん:2009/09/07(月) 12:17:18
>>722
juby on jails
725デフォルトの名無しさん:2009/09/07(月) 12:31:00
Hello world
726デフォルトの名無しさん:2009/09/07(月) 12:32:17
変なのが消えて、また過疎スレ化するのかな・・・
そういえば夏も終わりだねぇ
727デフォルトの名無しさん:2009/09/07(月) 13:14:56
実は自分がその「変なの」だったっていうオチって怖くね?
728デフォルトの名無しさん:2009/09/07(月) 13:30:20
何その林先生案件
729デフォルトの名無しさん:2009/09/07(月) 15:11:26
>>727
ありきたり過ぎてあくびが出る
730デフォルトの名無しさん:2009/09/07(月) 15:51:32
>>723
さっぱりわからん。頑張っても14Bしか出来んかった
731デフォルトの名無しさん:2009/09/07(月) 17:11:34
>>723
gorubyじゃないよね……?
732デフォルトの名無しさん:2009/09/07(月) 17:18:53
Hello world だけで 11 バイトだからなぁ。
PHP なら 11 バイト可能だけどw
733デフォルトの名無しさん:2009/09/07(月) 17:29:33
Hello, world!
お題がこれだから13byteでPHPでも無理
734デフォルトの名無しさん:2009/09/07(月) 17:30:34
「単純なやり方では」無理、だ
なにかしらの圧縮かけてんだろうけど・・・
735デフォルトの名無しさん:2009/09/07(月) 17:37:24
短縮系golfは初心者の得るものはないので他スレでやっとくれ
736デフォルトの名無しさん:2009/09/07(月) 17:45:07
>>731
gorubyはむしろhだけだった記憶がw
737デフォルトの名無しさん:2009/09/07(月) 18:17:40
exec禁止じゃないから、gorubyを呼び出してるんじゃないかと思うが。
738デフォルトの名無しさん:2009/09/07(月) 19:34:17
s = "aaaaaaaaa[hoge]piyopiyo"
r = "[hoge]piyo"

if s =~ /#{r}piyo/
 puts $&
end

今日こんな感じのコード書いてマッチしねえってことで
しばらくはまってた
739デフォルトの名無しさん:2009/09/07(月) 19:54:27
>>738
気持ちは分かるw

p /#{r}piyo/ #=> /[hoge]piyopiyo/
p /#{Regexp.escape r}piyo/ #=> /\[hoge\]piyopiyo/
740デフォルトの名無しさん:2009/09/07(月) 19:59:26
putsとかpとかprint以外のメソッドに括弧をつけない男の人って
741デフォルトの名無しさん:2009/09/07(月) 20:15:22
自作メソッドにしか付けねーよ
742デフォルトの名無しさん:2009/09/07(月) 20:44:24
括弧は出来るだけ付けるのがナウいんですか?
今までその逆をしてました・・・ごめんなさい
743デフォルトの名無しさん:2009/09/07(月) 21:33:39
カッコがない場合は「わざと」外してる
それは p だったり puts だったり DSL っぽく書く意図だったり
カッコの有無で動作が変わることを経験した人はカッコつけるのを基本にすると思う
744デフォルトの名無しさん:2009/09/07(月) 21:35:00
引数無しメソッドでもつけるのが最近のマイブーム
ああ、これ関数だなって一発でわかるし
745デフォルトの名無しさん:2009/09/07(月) 21:39:13
普段はまあどっちでも好きなようにしろ、が回答
紛らわしいときに ( ) が使われているのなら普段が ( ) ありでもなしでも構わない

問題は、普段からカッコつけない奴の多くは「紛らわしいとき」を全く意識しないということ
たまたま動いてるのを普通にスルーしやがる

普通逆だろ、カッコ常につけまくってる奴のほうがカッコの有無に無頓着であるべきだろ
746デフォルトの名無しさん:2009/09/07(月) 21:47:12
kimoi
747デフォルトの名無しさん:2009/09/07(月) 22:13:24
obj.method arg とか死ぬほどキモイな
748デフォルトの名無しさん:2009/09/07(月) 22:26:46
メソッドチェーンがない言語の因習だと思う
749デフォルトの名無しさん:2009/09/07(月) 22:56:44
Moonwolf説はガセ
750デフォルトの名無しさん:2009/09/07(月) 23:12:59
railsのソースコード読んでruby覚えた俺はカッコ無しの方がしっくりくる
メソッドの戻り値も変数に格納しない
751デフォルトの名無しさん:2009/09/08(火) 00:11:01
1.9.2で、mingw32の4.4.0のpthreadってdisableしてビルドした方が良いのかな?
752デフォルトの名無しさん:2009/09/08(火) 00:12:52
>>751
あ、1.9.1だった。スマン。
753デフォルトの名無しさん:2009/09/08(火) 05:40:43
>>751
よくはないが、別にそんなクリティカルな用途で使うわけでもないだろうし別にいいんじゃね
754デフォルトの名無しさん:2009/09/08(火) 07:59:59
Perlでいうところの関数のリファレンスを変数に格納して実行するにはどうすればいいのでしょうか?

--- Perl ---
sub func { print 'func' }

$func_ref = \&func;
$func_ref->();

--- Ruby ---
def method
print 'method'
end

method_ref = ????
method_ref.call??


こうするしかないのかな?

method_ref = proc { method }
method_ref.call
755デフォルトの名無しさん:2009/09/08(火) 08:24:37
>>754
Kernel#__send__(文字列 or シンボル, 引数...)
Method#call(引数...)
UnboundMethodをbindして#call(引数...)
など。
756デフォルトの名無しさん:2009/09/08(火) 08:40:35
>>754
Object#method # >>755の真ん中の奴

def func ; puts 'func' ; end
func_ref = method(:func)
func_ref.call
757デフォルトの名無しさん:2009/09/08(火) 09:07:43
>>755-756
サンクス
758デフォルトの名無しさん:2009/09/08(火) 09:33:53
>>751
--disable-pthreadでconfigureするかどうかってこと?
意味ないからどっちでも同じ結果になるよ。
759デフォルトの名無しさん:2009/09/08(火) 12:04:10
>>758
サンクス
そうするとstruct timespecが二重定義って怒られるのはどうしよう
760デフォルトの名無しさん:2009/09/08(火) 15:12:36
>>759
redmineで報告すればいいんじゃないかな。
761デフォルトの名無しさん:2009/09/09(水) 13:16:21
Rubygemパッケージを作るための色々なファイルの雛型あきこしてくれるライブラリとかありませんか
762デフォルトの名無しさん:2009/09/09(水) 13:41:05
トップレベレと言うのか、どこのクラスにも属さず、
いきなり書いた一行の文って、どう考えればいいの?

Cで言うmain関数みたいなのに暗黙のうちになってるとか、
Javaで言うmainメソッドみたいなのに暗黙のうちになってるとか、
・・・どう解釈したらいいのだ?
763デフォルトの名無しさん:2009/09/09(水) 13:51:50
>>761
$ jeweler --rspec hogeeee
    create .gitignore
    create Rakefile
    create LICENSE
    create README.rdoc
    create .document
    create lib
    create lib/hogeeee.rb
    create spec
    create spec/spec_helper.rb
    create spec/hogeeee_spec.rb
Jeweler has prepared your gem in hogeeee
$ ls hogeeee/
LICENSE README.rdoc Rakefile lib spec
764デフォルトの名無しさん:2009/09/09(水) 13:59:55
>>762
http://i.loveruby.net/ja/rhg/book/minimum.html
コンテキストとしてのself とか main とか
765デフォルトの名無しさん:2009/09/09(水) 14:01:25
>>762
トップレベルにも self として参照できるオブジェクトがある。
ほとんど単に Object.new したものだが、文字列化すると main
と返すようになっている点だけちょっと違う。
puts self
#=> main
p self
#=> main
puts self.class
#=> Object
766デフォルトの名無しさん:2009/09/09(水) 14:07:31
>>763
これ知ったとき、spec_helper をどっかの rubygem からコピペして
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
を全ファイルの先頭に自力で書いてた俺超涙目
767デフォルトの名無しさん:2009/09/09(水) 15:20:22
メソッド内部で print とかされて標準出力に表示されている結果を
rspec でチェックすることはできませんか?
768デフォルトの名無しさん:2009/09/09(水) 15:36:33
putsはObjectがincludeしているKernelのメソッド。

putsを呼ぶ時点のselfにspecからアクセスできるなら
ソレ.should_receive(:puts).with(出力)
などで可能だと思う。
769デフォルトの名無しさん:2009/09/09(水) 15:38:36
>>767
$stdout = StringIO.new
で溜め込むとか
770デフォルトの名無しさん:2009/09/09(水) 16:12:05
>>768
「メソッド内部」と断ってるし普通アクセスできないと思う
771デフォルトの名無しさん:2009/09/09(水) 16:43:30
>>770
class Greeter
def hello(name)
puts "hello, #{name}"
end
end

このような位置のputsはspecで
@greeter.should_receive(:puts).with('guest')
でテストできるけど、さらに奥深くだと無理だろうってことね。
772デフォルトの名無しさん:2009/09/09(水) 17:01:10
内部ってどのくらいなん、というのに依存するな

汎用的なのは$stdoutねじ曲げる>>769
これ使ったことあるけど、なんかrspecで書いてる気がしないんだよな
stdout マッチャとか display マッチャとか作るべき
773デフォルトの名無しさん:2009/09/09(水) 17:18:54
そりゃまあ、らしく書くのに実装の隠蔽は欠かせない
774デフォルトの名無しさん:2009/09/09(水) 17:21:07
lambda{ @obj.greeting }.should display('hello!')

こんな感じ?
Proc オブジェクト使うのはこれはこれで微妙に不評なんだよね
775デフォルトの名無しさん:2009/09/09(水) 17:51:58
>>763
ジュエラーか。ジュエリストのほうがかっこいいな。
最近ご無沙汰なんだが、hoeとかnewgemはもう古いの?
776デフォルトの名無しさん:2009/09/09(水) 18:10:42
hoe がイヤ過ぎるから newgem や jeweler が出てきたのでは…
777デフォルトの名無しさん:2009/09/09(水) 18:55:17
hoeとかrubyforgeとかって基本的にgemを作るときに要るもので、
配布物を使う人には無用のものだと思っていたのだけど、
なんで依存しているgemがあるんだろう、という疑問。

778777:2009/09/09(水) 18:59:06
自己レス。
作者がadd_development_dependencyを知らないだけなのかな。

779デフォルトの名無しさん:2009/09/09(水) 22:29:32
ある文字列をN文字ずつに分解するのはどうやりますか。
たとえば 'abcdef' を2文字ずつに分解して ["ab", "cd", "ef"] のようにします。
よろしくお願いします。

780デフォルトの名無しさん:2009/09/09(水) 22:37:38
N = 2
'abcdef'.scan(Regexp.new('.{%d}' % N))
781デフォルトの名無しさん:2009/09/09(水) 23:44:39
すごく初歩的な質問なのですが、Rubyのドキュメントはどこにあるのでしょうか?皆さんは何を参照していますか?
公式HPを見ましたが、Rubyの文法を簡単に説明しているだけで、標準ライブラリの細かい仕様を調べたい時などには役に立たないと感じました。
たとえばgemにインストールしたライブラリであればgem serverコマンドでRDocリファレンスが見れますが、標準ライブラリのRDocのようなものは無いのでしょうか?
バージョンは1.8でも1.9でも構いません。よろしくお願いします。
782デフォルトの名無しさん:2009/09/09(水) 23:55:43
>>781
http://www.ruby-lang.org/ja/documentation/
とそのリンク先は見た?
783781:2009/09/10(木) 00:50:23
>>782
ありがとうございます。
そのドキュメントは見ましたが、文法の解説という感じなので自分が求めてるものと少し違いました。
言語が違いますがたとえばhttp://java.sun.com/j2se/1.5.0/ja/docs/ja/api/のように
各クラスにどんなメソッドとフィールドがあって各メソッドの引数は何か、というのが一目で分かるようなAPI的なものを探しています。
784デフォルトの名無しさん:2009/09/10(木) 00:55:42
785デフォルトの名無しさん:2009/09/10(木) 01:02:58
>文法の解説という感じ
何を言ってるんだおまえは
http://doc.okkez.net/static/187/library/_builtin.html
786デフォルトの名無しさん:2009/09/10(木) 01:05:47
www.ruby-doc.org/core でいいんじゃね?
787デフォルトの名無しさん:2009/09/10(木) 01:18:47
職場の頭の悪いJava厨が>>783と同じようなこと言ってたな
788デフォルトの名無しさん:2009/09/10(木) 02:03:14
Rubyって連結リストみたいなListのデータ構造はないのでしょうか?
配列とハッシュしかみあたらないのですが。。。
789デフォルトの名無しさん:2009/09/10(木) 02:05:35
>>781
体裁が gem の rdoc に一番近いのはここの Core API のところかなあ
http://www.ruby-doc.org/

書籍だと内容的にはちと古いがピッケル本のライブラリ編とか
790デフォルトの名無しさん:2009/09/10(木) 02:15:16
>>788
Arrayでおk
791デフォルトの名無しさん:2009/09/10(木) 02:30:57
>>788
連結リストを何に使うの?
キューやスタックなら配列で十分だぞ(#shift, #unshift, #push, #pop)

Lispの処理系を作るとかいう話なら自分で作るべき
792デフォルトの名無しさん:2009/09/10(木) 04:25:14
>>779
str.scan(/../n)
Nが毎回可変なら>>780
793デフォルトの名無しさん:2009/09/10(木) 06:01:01
>>779
5文字を2文字ずつとかしたとき余った文字って捨てていいの
794デフォルトの名無しさん:2009/09/10(木) 07:05:14
>>792
/../n の、n オプションって何?調べたけど見つからない

>>793
str.scan(/..?/)
Nが正の整数で可変なら、

r = '.' + ('.?' * (N-1))
str.scan(Regexp.new(r))

でいける?
うーん。正規表現よくわからん。
795デフォルトの名無しさん:2009/09/10(木) 07:05:58
どうなんだろうね
端数出ないと仮定してもよさそうだが

require 'enumerator'
"12345".split(//n).each_slice(2).to_a.map{|a| a.join}

["12", "34", "5"]
796デフォルトの名無しさん:2009/09/10(木) 07:22:47
>>794
> Ruby は日本語化されているので、$KCODE の値に従って正規表現中の日本語文字を正しく扱います。
> $KCODE = "n" の場合、日本語文字を一切認識せずにバイト列として扱います。これはデフォルトの動作です。
> オプションとして n, e, s, u のいずれかを指定することで
> 正規表現の文字コードを $KCODE の値に関係なく個々の正規表現リテラルに指定することもできます。

irb> $KCODE = 'u'
irb> p 'うんこ'.split(//)
["う", "ん", "こ"]
irb> p 'うんこ'.split(//n)
["\343", "\201", "\206", "\343", "\202", "\223", "\343", "\201", "\223"]

文字列が完全にASCIIの範疇しか使われないならぶっちゃけいらない
ASCII 文字の処理だからと n をつけまくってる人は時々見るが、つけないほうがいい時のほうが多いと思うんだ
797デフォルトの名無しさん:2009/09/10(木) 07:28:24
thx
文字コードの指定ですか
1.9以降はどうなるんだろ
798デフォルトの名無しさん:2009/09/10(木) 07:43:01
無指定の場合は対象文字列の encoding と同じだとみなす

irb1.9> p "しふとじす".encode('Shift_JIS').split(//)
["??", "??", "??", "??", "??"]
irb1.9> p "しふとじす".encode('Shift_JIS').split(//).map{|e| e.encode('UTF-8')}
["し", "ふ", "と", "じ", "す"]

split(//n) と同じことをするのはやや手間

irb1.9> p "しふとじす".encode('Shift_JIS').dup.force_encoding('BINARY').split(//)
["\x82", "\xB5", "\x82", "\xD3", "\x82", "\xC6", "\x82", "\xB6", "\x82", "\xB7"]

each_byte の結果を文字列にしたほうがたぶん妥当
あるいはなんか凄い人が凄い簡単な手法見せてくれるかもしれない
799デフォルトの名無しさん:2009/09/10(木) 07:46:43
余った文字も入れたけりゃ
N = 2
'abcde'.scan(Regexp.new('.{1,%d}' % N))
=> ["ab", "cd", "e"]
800デフォルトの名無しさん:2009/09/10(木) 09:44:20
>>772はカスタムマッチャ作ればすぐじゃん、と思ったが
「そのメソッドからの $stdout への出力」というのを限定して取れないことに気づいた
$stdout を曲げてる期間に他の何かからも $stdout に出力があれば混じってしまう

や、「テスト中にはそんなこと起こらない」ということにすればいいんだけども
801デフォルトの名無しさん:2009/09/10(木) 10:03:31
module MyCustomMatchers
class MatcherDisplay
def initialize(expected); @expected = expected; end

def matches?(proc)
old = $stdout.dup; out = StringIO.new
$stdout = out; proc.call; $stdout = old
out.rewind
@actual = out.read
return (@actual == @expected)
end

def failure_message
"expected stdout is #{@expected.inspect} but was #{@actual.inspect}"
end

def negative_failure_message
"stdout #{@expected.inspect} should not be same"
end
end

def display(expected)
MatcherDisplay.new(expected)
end
end

describe "Test" do
include MyCustomMatchers
it "say hello" do
lambda{print "hello!"}.should display('hello!')
end
end
802デフォルトの名無しさん:2009/09/10(木) 10:08:20
あ、$stdout を dup する必要ないや
そのへん適当に
あとメッセージも適当
failure_message が should が失敗したときのメッセージ
negative_failure_message が should_not が失敗したときのメッセージ
モジュール作って include 形式にはしなくても構わないがこうしたほうがきっとあとで楽
803デフォルトの名無しさん:2009/09/10(木) 11:01:01
>>785
>何を言ってるんだおまえは
おまえこそ何を言っているんだ。
Ruby初心者では、782で紹介されたページから、ライブラリのドキュメントまでたどり着けないことがあるという事実がわかったんだから、
初心者でも簡単にたどり着けるようなページデザインにするにはどうしたらいいかを話し合ったほうが建設的ではないか?

たとえば
ttp://doc.okkez.net/static/188/doc/index.html
のページを見ると、言語仕様の目次がずらーっと並んでいて、ライブラリのドキュメントへのリンクは後ろのほうにあるだけ。
これだと、>>783のような勘違いが生まれても仕方ない。
そうじゃなくて、このページから目次をなくして、
「言語仕様」「組み込みライブラリ」「標準添付ライブラリ」「その他」
の4つの大きなアイコンが並んでいるだけにすれば、>>783のような勘違いもなくなると思うんだけど、どうだろうか。

・・・という感じで、初心者が必要なドキュメントにたどり着けるようにするにはどうしたらいいかを話し合ってほしい。
せっかくの初心者スレだし。
804デフォルトの名無しさん:2009/09/10(木) 11:22:14
>>803
そこはサイトを作ってる奴が○○○ので仕方ないかと。

いいじゃん、ruby-doc.orgの英語ドキュメント充実してるんだから、そこを見れば。
805デフォルトの名無しさん:2009/09/10(木) 11:39:19
> 初心者でも簡単にたどり着けるようなページデザインにするにはどうしたらいいかを話し合ったほうが建設的ではないか?

こんなチラ裏掲示板で話し合っても全く建設的ではありません。

プロジェクトに提案があるならメーリングリストへ。
806デフォルトの名無しさん:2009/09/10(木) 12:17:33
>>798
unpack("C*").map(&:chr)
807デフォルトの名無しさん:2009/09/10(木) 12:18:13
>>781の時点で見つけられないのはわからないでもない
でも回答があったにも関わらず目に付いた部分しか見ずに探そうとしない>>783ようなのはただのバカだろ
バカの世話までしていたらキリがない
808デフォルトの名無しさん:2009/09/10(木) 12:20:26
each_byteのほうが短かった
809デフォルトの名無しさん:2009/09/10(木) 12:33:10
>>802
テストで標準出力奪うのはやめといたほうが…
テスト自体の出力が混ざるぞ
810デフォルトの名無しさん:2009/09/10(木) 12:43:02
>>809
おう、今まさに混じってるぞ
何が辛いってうっかりメソッド側で p とかしてオブジェクトの中身確かめようとしたら
標準出力に p の結果が混じってテストが失敗すること

warn obj.inspect で逃げてるが display マッチャのコンセプト自体が間違ってたとしか思えん(w
811デフォルトの名無しさん:2009/09/10(木) 13:22:41
>>779
BioRubyを入れるとString#stepが拡張されて
require 'bio'
'abcdef'.step(2){|a| puts a}
ab
cd
ef
とできる。割り切れなければ最後に余りが返ってくる。
まあ、これだけのために使うようなライブラリじゃないし、
マルチバイト文字も使えないけど。
812デフォルトの名無しさん:2009/09/10(木) 14:05:36
>>805
ここだから書き込むやつがいるんじゃないか
わざわざメーリングリストに入って発言なんかするかよ
どうせたいした議論なんかしないんだから。
813デフォルトの名無しさん:2009/09/10(木) 14:11:51
現状このチラ裏でいろいろ書かれているわけだから
それを無視しているメーリングリストの人たちのほうが非建設的
814デフォルトの名無しさん:2009/09/10(木) 14:13:27
>>813
うわぁ
815デフォルトの名無しさん:2009/09/10(木) 14:16:07
本買えばいいじゃんとしか思わない
816デフォルトの名無しさん:2009/09/10(木) 14:25:25
本なんて邪道と思ってるやつもいるからな
おれには理解できんが
817デフォルトの名無しさん:2009/09/10(木) 14:48:21
ri にキャッシュ機能を付加したフロントエンドを被せるとそこそこ快適

refe というリファレンサもあることは知ってるけど使ったことないや。
使ってる人いる? インストールめんどくせ、というイメージなんだが
818デフォルトの名無しさん:2009/09/10(木) 14:54:17
>>817
refe使ってるけど、アーカイブを展開してパス通すだけじゃね?
819デフォルトの名無しさん:2009/09/10(木) 15:42:14
RubyでHTTP caching proxyを作ろうと思うのですが、PerlのHTTP::Proxyに
相当するようなライブラリはないでしょうか?
820デフォルトの名無しさん:2009/09/10(木) 15:51:25
webrickにhttpproxyというのがあるけど、希望に沿えてるかはわからない
821デフォルトの名無しさん:2009/09/10(木) 16:04:16
>>819-820
http://jp.rubyist.net/magazine/?0002-WEBrickProxy
http://doc.okkez.net/static/187/class/WEBrick=3a=3aHTTPProxyServer.html
通信後へのフックしか用意されてないようだから、これを基に手を加える必要がありそう
822デフォルトの名無しさん:2009/09/10(木) 16:23:06
rubyのMLってオナニーメールばかりで気持ち悪い
823デフォルトの名無しさん:2009/09/10(木) 16:43:14
日本語のは、メール自体が少ないから
824デフォルトの名無しさん:2009/09/10(木) 17:39:42
>>772
newgemでbinつき、rspecつきで出力したのが参考になるかも

binのスクリプトのスペックファイルがこんなのになってる
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
require 'tweetswget/cli'

describe Tweetswget::CLI, "execute" do
 before(:each) do
  @stdout_io = StringIO.new
  Tweetswget::CLI.execute(@stdout_io, [])
  @stdout_io.rewind
  @stdout = @stdout_io.read
 end
 
 it "should print default output" do
  @stdout.should =~ /To update this executable/
 end
end
825デフォルトの名無しさん:2009/09/10(木) 17:40:26
あらアプリ名でちゃった。はずかすぃ!
826デフォルトの名無しさん:2009/09/10(木) 17:43:12
>>824
要は出力対象を差し替え可能にしておけってことじゃね

class C
 def initialize(out = $stdout)
  @out = out
 end
 def exec
  @out.print "message"
 end
end
827デフォルトの名無しさん:2009/09/10(木) 17:57:11
どうでもいいけど○○wgetとかwget○○とかってセンスないよね
Wgetクラスとか作っちゃうのもセンスないよね
system("wget #{url}")するよりはマシだけどね
828デフォルトの名無しさん:2009/09/10(木) 18:01:04
ほぼ全員が作ったことがある黒歴史っぽい感じでセンス無くて恥ずかしいよな
OptParserの練習にもなっていいんだぞ、多分
829デフォルトの名無しさん:2009/09/10(木) 18:02:30
センスっていう言葉を使う奴って語彙が乏しいよね
830デフォルトの名無しさん:2009/09/10(木) 18:38:19
open-uri.rbに記述されてる説明なんだけど、誰か訳してもらえませんか。
respond toの意味するところが分かりません。

makes possible to open various resources including URIs.
If the first argument respond to 'open' method,
the method is called with the rest arguments.
831デフォルトの名無しさん:2009/09/10(木) 18:43:05
832デフォルトの名無しさん:2009/09/10(木) 18:50:55
>>831
ありがとうございます!なるほどrespond_toメソッドのことでしたか。
ruby(というかプログラミング)特有の言い回しは慣れないと難しいですね。。
833デフォルトの名無しさん:2009/09/10(木) 18:57:01
下記のような、Item.find(params[:id]).hogehoge という部分だけが違うメソッドがあります。

  def move_lower
   Item.find(params[:id]).move_lower
   
   flash[:notice] = '並びかえました。'
   respond_to do |format|
    format.html { redirect_to :action => 'index' }
    format.xml { head :ok }
   end
  end

  def move_higher
   Item.find(params[:id]).move_higher
   
   flash[:notice] = '並びかえました。'
   respond_to do |format|
    format.html { redirect_to :action => 'index' }
    format.xml { head :ok }
   end
  end

  def move_to_bottom
   :
  def move_to_top
   :

(うつく)
834デフォルトの名無しさん:2009/09/10(木) 19:01:56
メソッドのことっていうか、組み込みクラスの名前はそれなりに練られているし
ドキュメント書く人もある程度従うから、メソッド一覧が辞書的・用語的に使える場合があるという感じ

というわけだからその部分は「第一引数がopenメソッドに応答するなら」で、いわゆるduck typing
http://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83%E3%82%AF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0
835デフォルトの名無しさん:2009/09/10(木) 19:12:11
(うつき)

DRYしたくて、この場合、どのような書いたものでしょうか?
例えば、以下のような感じにしたいのですが、Item.find(params[:id]).methodのところがうまく行きません (´・ω・`)

  def move_lower
   do_move(:move_lower)
  end
  def move_higher
   do_move(:move_higher)
  end
  def move_to_bottom
   do_move(:move_to_bottom)
  end
  def move_to_top
   do_move(:move_to_top)
  end

  def do_move(method)
   Item.find(params[:id]).method # ←?????
   
   flash[:notice] = '並びかえました。'
   respond_to do |format|
    format.html { redirect_to :action => 'index' }
    format.xml { head :ok }
   end
  end
836デフォルトの名無しさん:2009/09/10(木) 19:17:02
>>835
Item.find(params[:id]).__send__(method)
837デフォルトの名無しさん:2009/09/11(金) 00:00:27
あまりDRYに見えない気が。
838デフォルトの名無しさん:2009/09/11(金) 01:08:11
>>836
いけますね

Item.find(params[:id]).send(method)
ではダメなんで書馬、
839デフォルトの名無しさん:2009/09/11(金) 01:20:39
>>838
Object#__send__は原則として書き換えてはいけない
Object#sendは上書きされることが予想(許容)される

http://doc.okkez.net/static/187/class/Object.html
>send が再定義された場合に備えて別名 __send__ も用意されており、ライブラリではこちらを使うべきです。また __send__ は再定義すべきではありません。

じゃあsendはなんで存在するのかというと・・・俺も聞きたいw
840デフォルトの名無しさん:2009/09/11(金) 01:26:07
微妙に書き方間違えた、Object由来の__send__とsendの話
class C
 def send; end # Cの都合に合わせたsendに書き換えてOK
 # def __send__; end # __send__の再定義はマナー的にNG
end

Itemの中身は(ほぼ)間違いなくObject由来のオブジェクトだからsendも__send__も使えるけど
sendが再定義されたクラスの可能性もあるから
Object#sendの機能が使いたいなら__send__のほうが確実ということ
841デフォルトの名無しさん:2009/09/11(金) 02:52:17
ごめんちょっとテスト
-スペース×2
 -全角スペース
 - 
842デフォルトの名無しさん:2009/09/11(金) 03:05:49
失礼しました
nbspな書き込みが多かったから2ch側で自動的に置き換えてくれるようになったのか、
と思ったけど違ったみたいだ
843デフォルトの名無しさん:2009/09/11(金) 05:30:26
send は利用専用
再定義のないプレーンな状態では send が使えてしかるべき
object_id と __id__ の関係に近い

個人的には __class__ もあってしかるべきだったと思うのだが
あんま __ つきメソッド作ると Python ぽく動作しなければならない気分になるかも
844デフォルトの名無しさん:2009/09/11(金) 05:32:33
>>842
navi2ch は文頭から始まるスペースを &nbsp; に書き換える
本来はやってはいけないことなんだがまあそれはそれで
845デフォルトの名無しさん:2009/09/11(金) 05:35:48
目茶初心者的な質問です。

RubyのThreadでの引数の役割りって、何ですか?
(どういう場面で役立つのか分からない)

関数なら y = f(x) で引数xを元にyが決定されプロット
できますが、Threadも左右されるのでしょうか?

すいません、ググっても分かりませんでした。
846デフォルトの名無しさん:2009/09/11(金) 06:19:04
引数なんだからルーチン実行に必要な明示的外部因子だろ
という話ではなさそうだな

Thread.new の引数の話なら、これはそのまんまだ
説明読んで実際に動かしてみてわからんのなら、きっとまだ早い
1ヵ月後くらいに再読すると結構わかるので今は諦めれ
847833:2009/09/11(金) 06:34:05
>>836-843
ありがとうございます。
本当だ、Railsだとsend上書きしてたりしますね。

ちょっとした使い分けですね。上書きされるような挙動を許したければsend、
そうでないなら、__send__

使ってみます。ありがとうございました。
848デフォルトの名無しさん:2009/09/11(金) 06:44:42
メッセンジャー機能として上書きするために残ってるんじゃないぞ

「送る」メソッドとして名称が被ってもいいように __send__ がある
たとえばメール用ライブラリでは送信用のメソッドがどう考えても send になるが、
そういうクラスで send を作っても元の send の機能が失われないように __send__ がある
他の Object のメソッドはまあ上書きで消えちゃっても仕方ないかなあと思えるものが多いが、
send の機能だけは特別
この機能が使えない状態のクラスは Ruby としてヤバい
849デフォルトの名無しさん:2009/09/11(金) 06:56:46
>>844
インライン要素に囲まれた空白文字は空白として保存する、みたいな仕様になっていれば
今ごろ世界中ハッピーだったと思うんだ
850デフォルトの名無しさん:2009/09/11(金) 09:10:15
>>847-848
RailsだけじゃなくてSocket#sendなんてのもあるしな
851833:2009/09/11(金) 09:34:56
>>850
あー、ほんとうだ。
Railsのsend(ActiveRecord)と、Socket#sendは全然意図が違いますね。

前者はフックして処理追加みたいな感じですが(superよんでるし)、
後者は、__send__関係ねえw
上の方で教えていただいた事柄は、後者のことですね、たぶん。

別の意味のsendが定義されてる場合、__send__よべと。そりゃそうだ。
Railsの場合は、むしろ、sendとしてsendが呼ばれるのを期待しているみたいなので、
__send__直接でなく、sendを呼んでやらないととおかしなことになりますね。
852デフォルトの名無しさん:2009/09/11(金) 09:39:13
ソケットにrecvとsendがなかったらアルェーってなるだろう
853デフォルトの名無しさん:2009/09/11(金) 11:26:06
class クラスのインスタンスを「足し算」することはできませんか?

bar = Foo::Bar.new
baz = (bar.class + Class.new('Baz')).new
p baz.class #=> Foo::Bar::Baz

eval するしかないとしたら、なにかより安全な方法はありますか?
854デフォルトの名無しさん:2009/09/11(金) 11:43:37
何がしたいかわからん。
Foo::Barのスコープ下に可変な名前の新クラスを定義したいという意味?
855デフォルトの名無しさん:2009/09/11(金) 11:47:59
>>853
できね
文字列としてクラス名を適当に作ってからevalしろ
定数になる書式しか受け取らないevalはあれば楽しいが多分無い
856デフォルトの名無しさん:2009/09/11(金) 11:49:54
>>854の意味なら
new_class_name = 'Baz'
Foo::Bar.const_set(new_class_name, Class.new)
857デフォルトの名無しさん:2009/09/11(金) 15:36:36
ドキュメント表記でFoo::Hogeと書かれている場合のFooとHogeの関係は、

○HogeはFooの内部クラス
○HogeはFooの内部モジュール
○HogeはFooで定義された定数

のいずれかと思っていれば間違いないでしょうか?
ドキュメントを見て自分で調べた限りではこのような使われ方がされているようです。
継承したクラスや、インクルードしたモジュールなどは、Hoge::Fooのような書き方をしていないようなのですが、継承・インクルード用の表記法はあるのでしょうか?
858デフォルトの名無しさん:2009/09/11(金) 15:42:06
意味的にはそれであってる、実装的には三つ目に集約される
というのもクラスもモジュールも、ClassインスタンスやModuleインスタンスが定数に代入されているだけに過ぎないから

継承はC < Object
モジュールにお約束はないと思うけど、リファレンスでは継承と同じように書いてるね
C < Enumerable < Object
859845:2009/09/11(金) 15:50:03
>>846
レスどうも。
理解の助けになるようなサンプルがググっても見つかりません。
(手元の本のサンプルはやたら行数が多いし)

適当なサンプルコードってありますか?
860857:2009/09/11(金) 15:52:25
>>858
ありがとうございます。すっきりしました。
モジュールのインクルードもHoge::Moduleと書きたくなっちゃうけど違うんですね。
公式HP見たら、ご指摘どおり、Array < Enumerable < Object < Kernelとなってました。
Java厨の自分にはObject < Kernelはとっても違和感がw
861デフォルトの名無しさん:2009/09/11(金) 15:56:46
>>859
x = 1; t = Thread.new(x){ sleep 1; p x }; x += 1; t.join #=> 2
x = 1; t = Thread.new(x){|y| sleep 1; p y }; x += 1; t.join #=> 1
こういう話?
862デフォルトの名無しさん:2009/09/11(金) 15:58:14
一個目まちがえた
x = 1; t = Thread.new{ sleep 1; p x }; x += 1; t.join #=> 2
863デフォルトの名無しさん:2009/09/11(金) 16:00:41
>>860
公式のどこ?その書き方おかしいだろ
モジュールは何個でもincludeできるから一つの流れでObjectまで辿り着けるわけじゃないし
864デフォルトの名無しさん:2009/09/11(金) 16:07:39
>>863
http://doc.okkez.net/static/187/class/Array.html

p Array.ancestors #=> [Array, Enumerable, Object, Kernel]
いくつでもincludeはできるけど、優先順位はきっちり存在する
865デフォルトの名無しさん:2009/09/11(金) 16:16:07
String < Comparable < Enumerable < Object < Kernel
p String.ancestors #=> [String, Enumerable, Comparable, Object, Kernel]

矛盾してるぞ
866デフォルトの名無しさん:2009/09/11(金) 16:22:56
それは知らん、書いたヤツに聞いてくれw
867デフォルトの名無しさん:2009/09/11(金) 16:26:59
Comparable < Enumerableはさすがに意味不明だね。無関係のモジュール同士だし。
あまり階層を意識しないでとりあえずincludeしてるモジュールが分かればいいって程度の表記なんじゃない?
868デフォルトの名無しさん:2009/09/11(金) 17:12:56
ライブラリの「ファイル名の区切り」ってハイフンとアンダースコアとキャメルケースのどれがいい?
既存のHogeというライブラリがあって、それの非公式エクステンションぽい感じなんだけど

require 'hoge-ext'
require 'hoge_ext'
require 'hogeext'
require 'hogeExt'

どれになるのがそれっぽいかな
869デフォルトの名無しさん:2009/09/11(金) 17:18:20
>>868
OpenURIにPOST機能をつけた場合

module OpenURIPost
require 'open-uri-post'

これがフツーだと思う
というか、require名はハイフンになるようにライブラリ作れというお達しがどっかに…
870デフォルトの名無しさん:2009/09/11(金) 17:59:10
>>868
その中ならhogeextかhoge-extかな
個人的にはこっちのほうが良いと思う

require 'hoge/ext'
871デフォルトの名無しさん:2009/09/11(金) 18:07:41
本家でもないのにディレクトリ切るとな

いや、見栄えもいいのはわかるんだが
本家 hoge の下に foo とか bar とかあった場合ちょっと微妙に
872デフォルトの名無しさん:2009/09/11(金) 18:35:19
実装上は、includeはスーパークラスと自クラスの間にダミーのクラスを
挿入してそこに指定モジュールからメソッドを追加する感じ(てきとう)。
別のモジュールのincludeではその結果出来る階層にさらに別のダミー
クラスを挿入するので、内部的にはモジュール(ダミークラス)が線形に
階層を成している。

ドキュメントにそれを意識して反映してるかはシラネ。
873デフォルトの名無しさん:2009/09/11(金) 18:49:21
ext という別途存在して見慣れてるディレクトリ名なのがよくない

require 'hoge/plus' とかそういうのにすれば違和感が
874デフォルトの名無しさん:2009/09/11(金) 18:57:17
Railsのスレが過疎ってるのでこちらで質問させてください。
ruby script/generate scaffold book title:string author:string
これでbooksテーブルを作成するmigrationファイルが出来るのは分かるのですが、
NOT NULL制約やstringの長さの制限などを指定することはできないでしょうか?
generate scaffoldでテーブルを作ると全てのカラムでNULL可、文字列は255文字になってしまいます。

仕方なく、作成されたmigrateファイルを修正することで対応していますが、これは正しいやり方でしょうか?
875デフォルトの名無しさん:2009/09/11(金) 19:15:40
>>874
WebProg板のなら、最終投稿10日だし、別に過疎ってないと思う。

やりかたはそれでOK
全くカラム情報を与えずに作って空のmigrationに一から手で書いても
構わない。

そもそもmodelのgenerator templateの中身は
t.<%= attribute.type %> :<%= attribute.name %>
だし。
876874:2009/09/11(金) 19:37:46
>>875
http://pc12.2ch.net/test/read.cgi/tech/1216829388/このスレのことを言いました
WebProg板の存在は知りませんでした。誘導ありがとうございます。次からはそちらで質問します。

migrationに手を加えるやり方でよかったのですね。railsの精神に反する気がして少し躊躇してました。
ありがとうございました。
877デフォルトの名無しさん:2009/09/11(金) 19:43:18
任意次元の多次元配列を初期化するには、どう書くのがスマート
でしょうか?

たとえば

size = [2, 3, 4]

というサイズ指定配列を渡されたら、

a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}

と等価なことをしたいです。
878デフォルトの名無しさん:2009/09/11(金) 19:50:04
Rubyには多次元配列は存在しない
単なるネストした配列だ

ということで、ネストしてるだけなのでネストしてnewする
a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
879デフォルトの名無しさん:2009/09/11(金) 19:53:46
pdfファイルを読み込み表示させようと思って以下のコードを書いたのですがうまくいきません。

open("010.pdf", "r") do |f|
f.gets
end

pdfファイルを読み込むには何か正しい方法があるのでしょうか。
最初はpdftotextでtextファイルに変換してから読み込もうと思ったのですが、
pdftotextを使う方法が分からなかったので直接読み込む方法を探しています。

環境はwindowsです。よろしくお願いします。
880デフォルトの名無しさん:2009/09/11(金) 19:58:51
PDFファイルをテキストエディタで直接開いてみるとなんかわかるかも
というかそのエディタで開くということと同じことしかしてないわけだが
881デフォルトの名無しさん:2009/09/11(金) 20:01:55
Windows なら open は r ではなく rb だろ
そのへんの説明はあるはずなんだが

とりあえず gets ではどうにもならんと思うんで
素直に read してその pdftotext なりなんなりで解析してもらえ
882デフォルトの名無しさん:2009/09/11(金) 20:04:48
>>878
> a = Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}

それじゃダメなので質問してるんですが。

size が必ず [2, 3, 4] と指定されるのでしたら

def foo(size)
return Array.new(2).map{Array.new(3).map{Array.new(4, 0)}}
end

で OK なんでしょうけど、渡される size は [5, 4, 3, 2] だったり
[2, 3, 4, 5, 6, 7] だったりとサイズも次元も可変なのです。
883デフォルトの名無しさん:2009/09/11(金) 20:09:19
本当にWindowsは糞だな。
Mac OSX最新版のSnow Loepardなら
テキスト、画像、動画、PDF、MS Officeをプラグインなしで統一的に扱えるのに。
884デフォルトの名無しさん:2009/09/11(金) 20:12:26
>>882
Rubyの配列に次元は存在しない
お帰りください
885デフォルトの名無しさん:2009/09/11(金) 20:26:18
rubyのコレクションフレームワークって配列とハッシュしかないの?
886デフォルトの名無しさん:2009/09/11(金) 20:27:16
def make_nested_array(*sizes)
  case sizes.size
  when 0
    []
  when 1
    Array.new(sizes[0], 0)
  else
    Array.new(sizes[0]){
      make_nested_array(*sizes[1..-1])
    }
  end
end
887デフォルトの名無しさん:2009/09/11(金) 20:36:09
>>885
Stack、ListはArrayで間に合うだろう。
Queueは、優先度が付かないならArrayを使え。
このへんは大クラス主義。

標準では、他にSetが付いてくるが、組み込みではないので要require。
Treeは標準にはない。
888デフォルトの名無しさん:2009/09/11(金) 20:37:35
>>883
Rubyで? すごいねー
889デフォルトの名無しさん:2009/09/11(金) 20:54:07
>>886
なるほど。
*size を size に替えてうまく動きました。
ありがとうございました!
890デフォルトの名無しさん:2009/09/11(金) 21:17:37
>>880
テキストエディタで開くと文字化け?してしまいます。

>>881
pdftotext.exeは実行ファイルなのですが、Rubyのスクリプトから使用する方法が分かりません。
何度も申し訳ないのですが、教えて頂けないでしょうか。。
891デフォルトの名無しさん:2009/09/11(金) 21:22:12
`pdftotext hoge.pdf`?
892デフォルトの名無しさん:2009/09/11(金) 21:22:58
>>889
横からだけど
make_nested_array([2, 3, 4])
よりは
make_nested_array(2, 3, 4)
のほうが素直というかRuby的だと思う

ary = [2, 3, 4]
で渡された時のことを考えているんだろうけど
make_nested_array(*ary)
とやれば引数を展開できる

>>890
pdftotext.exeは知らないけど、コンソールでできることなら大抵system関数でできる
コマンドラインを関数に渡せばいい
893デフォルトの名無しさん:2009/09/11(金) 21:53:15
system関数でできました。本当にありがとうございました!
894デフォルトの名無しさん:2009/09/11(金) 22:00:33
rubyでpdfを作るにはどうすればいいですか?
895デフォルトの名無しさん:2009/09/11(金) 22:03:58
>>894
ruby pdfでググると色々出てくるので好きに選べばいいじゃない
896デフォルトの名無しさん:2009/09/12(土) 07:51:58
>>894
ぶっちゃけ、基本ただのテキストファイル。仕様どおりに作ればいい。

適当に一部分だけgzipかけてみたりフォント埋め込んでみたり暗号化してみたり
してる部分もあるが、それは全部付加的なものだし。

現実的には、>>895。RubyならHaruでいいんじゃね?
897デフォルトの名無しさん:2009/09/12(土) 08:33:37
>>879
ハイハイ、マルチポスト、マルチポスト

Rubyでpdfファイルを読み込む方法 -OKWave
http://okwave.jp/qa5281984.html

こっちで、解決したらあっちのも答え書いとけよ
898デフォルトの名無しさん:2009/09/12(土) 09:15:54
RubyでPDFをgrepできたら便利だな
簡単にできるのならやってみようかな
899デフォルトの名無しさん:2009/09/12(土) 09:35:10
PDFを読んでるわけじゃないぞ
PDFをプレーンテキストにする外部プログラムにファイルを渡して
標準入力から受け取って文字列にしてるだけ
900デフォルトの名無しさん:2009/09/12(土) 15:15:55
中括弧 { } を付けても付けなくても同じ結果になるのですが、これらに違いはあるのでしょうか?

def hoge arg
p arg
end

hoge( :a => 1, :b => 2 ) #=> {:a=>1, :b=>2}
hoge( {:a => 1, :b => 2} ) #=> {:a=>1, :b=>2}
901デフォルトの名無しさん:2009/09/12(土) 15:24:48
>>900の場合は同じ意味。

{}はHashを意味している。
メソッド引数の最後のものがHashである場合に限り、{}を省いてよい。
902デフォルトの名無しさん:2009/09/12(土) 15:28:06
>>901
そうなんですか。
d
903デフォルトの名無しさん:2009/09/12(土) 16:44:49
rubyとpythonはどっちが強いですか?
904デフォルトの名無しさん:2009/09/12(土) 17:03:01
ruby
905デフォルトの名無しさん:2009/09/12(土) 19:24:56
たしかにruby厨はpython厨よりしつこいな
906デフォルトの名無しさん:2009/09/12(土) 21:54:36
>>903
何を以って強さとするかによる
907デフォルトの名無しさん:2009/09/12(土) 22:09:19
実行速度
書きやすさ
読みやすさ
インストールのしやすさ
ライブラリの使い勝手
リファクタリングの効率
配布
どれをとっても(ry
908デフォルトの名無しさん:2009/09/12(土) 22:43:51
議論してもどうせ荒れる方向にしか行かないんだから初心者スレでこうゆうネタ出すの止めて
909デフォルトの名無しさん:2009/09/12(土) 23:27:50
どうせたいていは釣りなんだからボケの腕の見せ所かと
910デフォルトの名無しさん:2009/09/13(日) 00:19:22
rubyスレはこういうときにもボケで返すセンスのある香具師が多いが
pythonスレではまじめにレスするかスルーされるケースが多い
よってruby埼京
911デフォルトの名無しさん:2009/09/13(日) 00:23:54
2chってどこ行ってもごみレスつけるおっさんばっかりになってるな
そんなに寂しいのか彼らは
912デフォルトの名無しさん:2009/09/13(日) 02:08:10
>>910
おまえはボケのセンスがないんだな
913デフォルトの名無しさん:2009/09/13(日) 12:39:10
すいません質問させてください

(@@connections ||= []) << self

上記のコードの
@@がクラス変数, << が配列への要素の追記ということはわかったのですが
||= の記号の意味がうまく調べられませんでした
どなたか教えていただけないでしょうか?
914デフォルトの名無しさん:2009/09/13(日) 12:42:56
@@connections = @@connections || []
915デフォルトの名無しさん:2009/09/13(日) 13:08:12
>>913
||=は左辺がnil、falseでないときは何もしない
もしnil、falseなら右辺を代入する。
916デフォルトの名無しさん:2009/09/13(日) 13:29:01
このページ全部に目を通しておくといいよ
http://doc.okkez.net/static/187/doc/spec=2foperator.html
917デフォルトの名無しさん:2009/09/13(日) 14:10:48
>>913
foo ||= []

foo = [] unless foo
とおなじ。
(foo ||= []) << "aaa"

foo = [] unless foo
foo << "aaa"
とだいたい同じ。
918デフォルトの名無しさん:2009/09/13(日) 15:18:56
foo = [] unless defined?(foo) じゃないと動作しないだろ、というツッコミは
これはこれで面倒な話でありましてですな
919デフォルトの名無しさん:2009/09/13(日) 15:34:47
まあ、

irb> (p "ok") if foo
NameError: undefined local variable or method `foo' for main :Object
     from (irb):1
     from :0

がエラーで

irb> (foo = "ok") if foo
nil

が OK というのは不条理っちゃ不条理ではある
ちなみに (foo = "ok") if foo のあと、 foo は nil を返す
920デフォルトの名無しさん:2009/09/13(日) 15:42:16
へえ!そんな違いあるのか 初めて知った
どういう基準で分かれてるんだろう?
921デフォルトの名無しさん:2009/09/13(日) 16:11:24
>>920
FAQ にもあるんだが、ローカル変数は、構文解析で代入が見つかるかどうかだけが鍵
実際に(いつ)実行されるかどうかは関係がない

if false
foo = "OK"
end
foo

上記は NameError を起こさないが、以下は foo が NameError を起こす

for e in [1, 2 ,3]
if e == 2 then
foo
else
foo = "OK"
end
end

動作は同一なはずの unless で 代入記述の順番を変えると NameError は起こらない
for 構造はスコープを作らないことに注意

for e in [1, 2 ,3]
unless e == 2 then
foo = "OK"
else
foo
end
end
922デフォルトの名無しさん:2009/09/13(日) 16:15:42
FAQはこちら
ttp://www.ruby-lang.org/ja/man/html/FAQ_CAD1BFF4A1A2C4EABFF4A1A2B0FABFF4.html#a2.2e3.20.a5.ed.a1.bc.a5.ab.a5.eb.ca.d1.bf.f4.a4.cf.a4.a4.a4.c4.bb.b2.be.c8.b2.c4.c7.bd.a4.cb.a4.ca.a4.eb.a4.ce.a4.c7.a4.b7.a4.e7.a4.a6.a4.ab
長い長すぎる

FAQでは昔ながらに「nil で初期化しとけ」と書いてあるが、
こんな繰り返しのスコープを意図的に利用するスクリプトを書くことのほうがヤバい兆候であることがわかってる
素直に他の方法を考えるのがよい
そもそも一般的な each ではスコープが毎回切れるからこれの再現すらできないしな
923デフォルトの名無しさん:2009/09/13(日) 16:16:02
これ、実際改良する気ないのかな。Rubyの実装もいろいろ出てきてるんだし。
気持ち悪くないのかな。それとも、別に実装の都合ではなくてポリシーなのか?
924デフォルトの名無しさん:2009/09/13(日) 16:31:24
もともとそういうポリシー。
ブロックでスコープをわけないようにするという話もあったりするので、
遠い未来の2.0あたりでは>>921の例も動くようになるかも。
925デフォルトの名無しさん:2009/09/13(日) 16:41:10
スタックに積まれるローカル変数は明示的に初期化すべしってのはrubyに限ったことじゃない。
926913:2009/09/13(日) 16:46:38
>>914-919
ご丁寧にありがとうございます。
ソース読んでいてここだけわからなくて困っていたのですが助かりました。
927デフォルトの名無しさん:2009/09/13(日) 16:48:29
>>925
if ARGV
 opt1 = ...
end
opt1_runner(opt1) if defined?(opt1)

これが期待通り動作しないということなんだぜ
たかがローカル変数で

opt1 = nil
if ARGV
 opt1 = ...
end
opt1_runner(opt1) if opt1

とか書かなければならないのは流石にバカっぽい
928デフォルトの名無しさん:2009/09/13(日) 17:13:36
バカっぽいか?すごく素直な書き方でいいと思うけど。
929デフォルトの名無しさん:2009/09/13(日) 17:15:13
Rubyのifはスコープを作らないだろ

いわんとすることはわかるが
930デフォルトの名無しさん:2009/09/13(日) 17:18:18
そんな小さな労力のために仕様変更してたらぐちゃぐちゃになるわ。
ローカル変数を初期化不要にしてしまうと、フィールド変数を参照してるつもりでスペルミスしてもエラーにならなくなる。
あらゆる場所で意図しないローカル変数が勝手に生成される可能性があるわけで何とも気持ち悪い。

フィールドはオブジェクトの属性という意味合いから初期値があるのは自然だけど、
ローカル変数はちょっと値を保存しておく場所って意味合いしかないから、ソースコードを簡略化するために初期値を設けるってのも設計上美しくない
931デフォルトの名無しさん:2009/09/13(日) 17:37:53
質問です
下記のように@flagを判別して
@flagがtrueの場合, testのputs "test"が実行され
@flagがnilの場合,testを中断させputsは実行されない
という処理を書きたいのですが可能でしょうか?
flag_ok?でfalseを返してもいいのですが、
test2,test3と他にも最初にフラグをチェックして@flagがnilの場合、処理を中断したいメソッドが複数あるので、シンプルに書く方法を模索してます

@flag = nil

def test
flag_ok?
puts "test"
end

def test2
flag_ok?
puts "test2"
end

def flag_ok?
if @flag
return true
else
return "testの実行を中断させるなにか"
end
end

932デフォルトの名無しさん:2009/09/13(日) 17:45:10
@flag = nil

def test
 return if @flag
 puts "test"
end

def test2
 return if @flag
 puts "test2"
end

これじゃなんかダメなん
933デフォルトの名無しさん:2009/09/13(日) 17:51:15
>>932
条件逆
934931:2009/09/13(日) 19:08:11
>>932
ありがとうございます参考に直してみました。
ちょっとエラー時に処理をいれたかったのと
うまいこと1行で書きたかったのですが
すっかり if,unlessのこの書き方を失念してました

@flag = nil

def test
return unless flag_ok?
puts "test"
end


def flag_ok?
if @flag
return true
else
puts "処理"
return false
end
end
935デフォルトの名無しさん:2009/09/13(日) 21:25:21
フィールド変数って何?
936デフォルトの名無しさん:2009/09/13(日) 21:32:13
>>935
@hoge = 1234
の@hogeのこと。

Rubyだとインスタンス変数かな?
フィールド変数はJava用語だったかも?Delphiでも聞いたな。
C++だとメンバ変数だっけか。
937デフォルトの名無しさん:2009/09/13(日) 21:33:51
>>935
Rubyで言うインスタンス変数

逆か、他の言語で言うフィールド変数はRubyではインスタンス変数で扱う
938デフォルトの名無しさん:2009/09/13(日) 22:56:49
Smalltalk流だな、インスタンス変数という呼び名は。
939デフォルトの名無しさん:2009/09/13(日) 23:24:18
フィールド=インスタンス変数
じゃないぞ
フィールド=メンバ変数=インスタンス変数&クラス変数
が正しい
940デフォルトの名無しさん:2009/09/14(月) 10:52:05
普通にネストしてるクラス定義があります

class A
class B
class C
end; end; end

A B C を模したモジュール M があります

module M
module A; def hoge; end
module B; def hoge; end
module C; def hoge; end
end; end; end; end

で、M を適度に include して A.new.hoge も B.new.hoge も C.new.hoge も有効にしたいんですが、
次のような書き方しかできないような気がします

class A; include M::A
class B; include M::A::B
class C; include M::A::B::C
end; end; end

なんというかこー、せっかく模したので「一発」でできるようにしたいのですが、なんかうまい方法ないですか
941デフォルトの名無しさん:2009/09/14(月) 11:04:18
include M しただけで A::B::C.new.hoge が有効にならないのはなんでとかそういう質問?
942デフォルトの名無しさん:2009/09/14(月) 13:13:31
>>940
標準機能にはないし、ライブラリもなさそうだから、自分でつくるしかないかなあ。

def get_module_object(name)
 mod = Object
 name.split(/::/).each do |s|
  mod = mod.const_get(s) or raise NameError.new("#{name}: not found.")
 end
 return mod
end

get_module_object('M::A::B::C')

def include_recursively(klass, namespace)
 mod = get_module_object("#{namespace.name}::#{klass.name}")
 klass.class_eval { include(mod) } if mod
 for name in klass.constants
  c = klass.const_get(name)
  include_recursively(c, namespace) if c.is_a?(Class)
 end
 nil
end

include_recursively(A, M::A)
p A.ancestors    #=> M::A が含まれている
p A::B.ancestors   #=> M::A::B が含まれている
p A::B::C.ancestors #=> M::A::B::C が含まれている

実行効率はあんまりよくないけど許して。
943デフォルトの名無しさん:2009/09/15(火) 01:18:30
このスレの人で、RubyをPSPで動かした経験のある方いますか?
ググりましたが、断片的に
ttp://www.rubyist.net/~matz/20070130.html
ttp://www.javaeye.com/topic/50494(中国語)

があるくらいです。
何か役に立ちそうなサイトがありましたらお教え下さい。
944デフォルトの名無しさん:2009/09/15(火) 09:29:00
StringIOを読むときってrewind必須?
昔のテープメディアみたいでなんかヤなんだけど
945デフォルトの名無しさん:2009/09/15(火) 09:50:31
>>944
IO自体がテープメディアみたいなもんなんだけどw
946デフォルトの名無しさん:2009/09/15(火) 10:21:36
to_s で最初から最後までが文字列として返ってこなかったっけか

同名モジュールの include で疑問があったことを思い出した

module A
 def hoge; B.new; end
end
module B; end

class A; include A; end
classB; include B; end

これで、A.hoge すると モジュール B の new メソッド(無論ない)を呼ぼうとするんだよ
全く以って書いてある通りに動いてるだけなんでございまするが、
module A を作る時点で、include 先から見た B クラスを使うように指定することはできんもんかね
947デフォルトの名無しさん:2009/09/15(火) 10:42:03
>>946
できない…と思う
include したらたまたま同名の自作クラス B があったためにモジュールが動作しませんとかモジュールの意味ねえよ
モジュール内部で呼ぶ B はモジュールが定義されたときに(モジュール内部に)存在する B だ

:: で始まる「フルパス」で書くしかないな
include されるクラス名が不定なのならお隣クラス B を呼ぶことはそもそもできないので諦めるべし
948デフォルトの名無しさん:2009/09/15(火) 10:47:53
>>946
module A
def hoge ; self.class.const_get(:B).new ; end
:
949デフォルトの名無しさん:2009/09/15(火) 11:17:23
コード中で、あるライブラリがrequireされているかどうか判断することはできますか?
擬似コードですが、こんな感じで書けたらと思ってます
if nkfがrequireされていたら; ・・・
elsif uconvがrequireされていたら; ・・・; end

現在はbeginブロックに入れてNameErrorで判断しています
950デフォルトの名無しさん:2009/09/15(火) 11:49:19
>>949
そのライブラリが何か定義するなら
defined? NKF
とか。

あと、$LOADED_FEATURES ($") というグローバル変数もあるが、
ファイル名べったり依存になるのであまり推奨したくないな。
951デフォルトの名無しさん:2009/09/15(火) 12:09:44
require自体がファイル単位を扱うメソッドなんだからファイル名依存になるのは当たり前だろ
952949:2009/09/15(火) 12:17:34
>>950
ありがとうございます!どちらも気づきませんでした・・・
プログラムを書き換えてみての動作確認もうまくいきました。
953デフォルトの名無しさん:2009/09/15(火) 12:38:57
>>951
requireされてるかわからないということは自分以外がrequireしたってことだから
ファイル名を知らないし知る必要もないと思う

require 'lib/example'
require './lib/example'
$LOAD_PATH << "lib/"
require 'example'
とりあえず実際問題として、$"ではこれらが区別されるから(requireも二重ロードをする)
>>950のようなduck type的アプローチのほうがよいかと
954デフォルトの名無しさん:2009/09/15(火) 13:12:18
Rubyでよく言うダックタイピングってJavaなんかで言うポリモーフィズムのことですか?
実装の違いは別として機能的には。
955デフォルトの名無しさん:2009/09/15(火) 13:22:04
アドホック
956デフォルトの名無しさん:2009/09/15(火) 13:44:37
>>954
だいたい合ってる

あえて区別するなら、ポリモーフィズムはクラスC1とC2に何かしらの関係性が産まれる
(スーパークラスが同じとか、インターフェイス/モジュールに同じモノを使うとか)
ダックタイプはメソッドに応答するだけでいい

「共通であるから同じに扱う」と「同じに扱えたから共通だと見なす」という感じ
957デフォルトの名無しさん:2009/09/15(火) 13:48:21
・・・とは言ったものの、ポリモーフィズム自体にそういう定義はないと思う
たぶん、関係性が産まれている場面でばかり使われていたから
関係性がないことを強調した言葉として派生させたのがダックタイプなんじゃないかな
958デフォルトの名無しさん:2009/09/15(火) 15:42:31
>>953
あと、require だと拡張子が省けるが、$" の中には拡張子込みで
入るので、実装を気にする必要も出てくる。
959デフォルトの名無しさん:2009/09/15(火) 16:58:31
拡張子込みとは言っても ".rb" か ".so" のどちらかじゃない?
960デフォルトの名無しさん:2009/09/15(火) 17:49:11
Macだと nkf.bundle になってたりする。
961デフォルトの名無しさん:2009/09/15(火) 17:56:21
>>948
self.class::B.new
962デフォルトの名無しさん:2009/09/15(火) 19:54:22
>>961
それだと A::B と解釈されるからダメ
963デフォルトの名無しさん:2009/09/15(火) 20:01:34
>>960
えーそれってMRI(YARV)? それともRubyCocoaとか?
964デフォルトの名無しさん:2009/09/15(火) 20:11:43
そもそも>>946の設定からしてわかりにくいんだよな、定数かぶりまくってるし
module M
 module A; end
 module B; end
end
class C
 class A; include M::A; end
 class B; end
end
こういうことなんだろうか

つーかこの状況だとModule.nesting使えないのか・・・
泥臭い方法以外でC::AのインスタンスからCを得る方法ってあるの?
965デフォルトの名無しさん:2009/09/15(火) 20:47:47
>>963
$ uname -a
Darwin aries.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386 i386 iMac9,1 Darwin
$/usr/bin/ruby -v -rnkf -e 'p $"'
ruby 1.8.6 (2008-08-11 patchlevel 287) [universal-darwin9.0]
["nkf.bundle"]
966デフォルトの名無しさん:2009/09/15(火) 20:52:36
こっちも一応。

$ /usr/local/bin/ruby -v -e 'p $"'
ruby 1.9.2dev (2009-09-08 trunk 24795) [i386-darwin9.8.0]
["enumerator.so",
"/usr/local/lib/ruby/1.9.1/i386-darwin9.8.0/enc/encdb.bundle",
"/usr/local/lib/ruby/1.9.1/i386-darwin9.8.0/enc/trans/transdb.bundle",
"/usr/local/lib/ruby/1.9.1/rubygems.rb" ]

-rnkfすると enc/euc_jp.bundle とか混ざって長くなるので省いた。
967デフォルトの名無しさん:2009/09/15(火) 22:12:09
>>963
基本的にシステム固有のsuffixが使われる。
例外は、ライブラリにlibなどのprefixをつける慣習がないWindows等DOSISH系。
たとえば、libiconvのiconv.dllと拡張ライブラリのiconv.dllが区別つかなく
なるという事態を避けるため、後者を.soにしている。
968デフォルトの名無しさん:2009/09/15(火) 22:48:23
>>966
なんで enumerator.bundle じゃないんだろう。
969デフォルトの名無しさん:2009/09/16(水) 02:31:22
requireをロックするため突っ込んである
実際に探索したわけでもないパスだから。
970デフォルトの名無しさん:2009/09/16(水) 04:32:19
ume
971デフォルトの名無しさん:2009/09/16(水) 04:47:18
どうしてルビーなの?
なんでpythonじゃなくてルビーなの?
開発者が日本人だから?愛国心ってやつ?ねえ?
972デフォルトの名無しさん:2009/09/16(水) 05:42:56
あなたがPerlでもPHPでもSchemeでもなくPythonを使っているのと同じようなレベルの理由です
973デフォルトの名無しさん:2009/09/16(水) 06:59:09
>>971
煽りに使えそうな反論が出たらpythonスレに張り付けに行くんだろ?
974デフォルトの名無しさん:2009/09/16(水) 08:11:47
yes i do
975デフォルトの名無しさん:2009/09/16(水) 09:57:02
class C
def initialize
hoge
hoge = Array.new
hoge
end

def hoge
puts "参照メソッド呼ばれましたん"
end

def hoge=(arg)
puts "代入メソッド呼ばれましたん"
@hoge=arg
end
end

C.new

これはやっぱり

参照メソッド呼ばれましたん
代入メソッド呼ばれましたん
参照メソッド呼ばれましたん

であるべきなんじゃないかと思う今日この頃
っていうかこのへんの動作に依存したスクリプト作るのやめれ紛らわしいわぼけーうおー
976デフォルトの名無しさん:2009/09/16(水) 10:01:11
Pythonスレから刺客が来たと聞いて
977デフォルトの名無しさん:2009/09/16(水) 10:30:57
ローカル変数代入だけはちょっと特別なんだよね
代入の形したメソッドがある場合はどっち使うのか注意
978デフォルトの名無しさん:2009/09/16(水) 10:35:22
識別名がまずローカル変数、でなければインスタンスメソッドと
決定されるのは自然な発想では

ただ確かに紛らわしいから、結局
>このへんの動作に依存したスクリプト作るのやめれ
じゃなかろうか
979デフォルトの名無しさん:2009/09/16(水) 10:41:58
間違ってる人がいそうだから注釈するが、>>975は代入メソッド1回も呼ばれてないぞ
hoge= というインスタンスメソッドがあっても、hoge=Array.new はローカル変数への代入だ
= つきのインスタンスメソッドを呼びたい場合はレシーバが必須になる
この場合は self をつけて self.hoge=Array.new だな

これに def hoge; @hogeを処理して返す; end が加わってると混迷を増す
980デフォルトの名無しさん:2009/09/16(水) 12:00:21
ローカル変数の方がメソッドよりスコープ狭いんだから、ローカル変数が最優先で名前解決されるのは当然のように思える。
981デフォルトの名無しさん:2009/09/16(水) 13:23:01
>>978
呼び出しはそれでいいんだけど、>>977も言うようにキモは代入でしょ
ローカル変数とインスタンスメソッドに同じ名前さえ付けなければ
この手の問題は起きないと思ってる人はわりといるはず、つーか俺

>>980
存在するローカル変数と存在するインスタンスメソッドなら同意
まだ存在しないローカル変数と存在するインスタンスメソッドだったら、存在する方が優先に思える

「代入もメソッド呼び出しである」と考えると
変数hogeがないときにself.hogeが呼ばれる動作と対称的ではないのが違和感の原因
「疑わしきはローカル変数と見なす」も理解はできるけどね
982デフォルトの名無しさん:2009/09/16(水) 13:57:45
まあ世の中にはいろんなバックボーンを持った人がいるから、Rubyのルールが気持ち悪い/気にくわない/落ち着かないという人も大勢いるだろう。
それは仕方ない。そういうもんです、慣れてくださいとお願いするしかない。

ただまあ、代入に関して言えば、
・foo = 123 は変数への代入
・obj.foo = 123 は setter メソッドの呼び出し
というルールが分かっていれば、そう混乱することはないように思う。
問題は、それを明確に教えていない本やドキュメントのほう。
983デフォルトの名無しさん:2009/09/16(水) 14:06:39
問題は

hoge というインスタンスメソッドが定義されているとき、 hoge(123) とすると hoge メソッドに 123 が渡される
hoge! というインスタンスメソッドが定義されているとき、 hoge!(123) とすると hoge! メソッドに 123 が渡される
hoge? というインスタンスメソッドが定義されているとき、 hoge?(123) とすると hoge? メソッドに 123 が渡される
[] というインスタンスメソッドが定義されているとき、 [](123) とすると [] メソッドに 123 が渡される
[]= というインスタンスメソッドが定義されているとき、 []=(123) とすると []= メソッドに 123 が渡される

とここまで来ておきながら

hoge= というインスタンスメソッドが定義されているとき、 hoge=(123) とするとローカル変数 hoge に 123 が代入される

になること
984デフォルトの名無しさん:2009/09/16(水) 14:38:32
着眼点はおもしろいな。
ただ、それは
・代入のほうが優先される
というルールで簡単に説明できるんじゃね?
これなら十分わかりやすい。
985デフォルトの名無しさん:2009/09/16(水) 15:58:47
ルヴィーっておもしろいですか?ルヴィー使ってる友達が、開発者が日本人だから誇らしいと言ってました
986デフォルトの名無しさん:2009/09/16(水) 16:02:12
hoge= が hoge = と書いても動作するのが原因のひとつのような気がしてきた
987デフォルトの名無しさん:2009/09/16(水) 16:17:07
クラス変数が@@var
インスタンス変数が@var
なんだから
ローカル変数にも命名規約を作ればよかっただけ
#varとか

設計者の脳みそが足りなかった
988デフォルトの名無しさん:2009/09/16(水) 16:18:50
つまり認識の順番が逆なんだよ

 ・ obj.hoge = や obj.hoge= とあったとき、それは必ず obj のメソッド hoge=() である
 ・ hoge = や hoge= とあったとき、それは必ず変数 hoge への代入である
 ・ 末尾に = がついたメソッドはいわゆる関数形式では呼べないので諦めろ

こう覚える
989デフォルトの名無しさん:2009/09/16(水) 17:00:32
ルールの一貫性なんかより普段書いてて使いやすいかのほうが重要
990デフォルトの名無しさん:2009/09/16(水) 17:14:11
冗長な接頭辞なんかいらんつーの
991デフォルトの名無しさん:2009/09/16(水) 17:57:10
>>989
ふだん書いてて使いやすいように、一貫したルールが必要なんだろ
マニュアル見ながらだと書きやすいが暗記しにくいルールなんて糞だ
992デフォルトの名無しさん:2009/09/16(水) 18:25:45
> マニュアル見ながらだと書きやすいが暗記しにくいルールなんて糞だ

Perl の $ と @ が脳裏をよぎったw
993デフォルトの名無しさん:2009/09/16(水) 18:31:03
ruby厨無理スンナ
994デフォルトの名無しさん:2009/09/16(水) 18:55:03
>>982や988で十分わかりやすいと思うけどな。
アンチさんたちは何が不満なのかな。
995デフォルトの名無しさん:2009/09/16(水) 19:24:17
>>994
アンチってどれよ
996デフォルトの名無しさん:2009/09/16(水) 20:57:58
これどっちなんだっけ、と迷うようなコードは書かないのが定石だろうに
997デフォルトの名無しさん:2009/09/16(水) 21:01:30
今更そんな当たり前のこと言われても
998デフォルトの名無しさん:2009/09/16(水) 23:18:44
雑魚乙ということで埋め
999デフォルトの名無しさん:2009/09/16(水) 23:19:59
雑魚乙ということで埋め
1000デフォルトの名無しさん:2009/09/16(水) 23:21:35
雑魚乙ということで埋め
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。