Ruby 初心者スレッド Part 30at TECH
Ruby 初心者スレッド Part 30 - 暇つぶし2ch2:デフォルトの名無しさん
09/08/08 08:24:14
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

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

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

以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません
 ・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
  URLリンク(www.amazon.co.jp)


3:デフォルトの名無しさん
09/08/08 08:25:37
Ruby 公式・非公式便利サイト2009

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

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

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

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 URLリンク(jp.rubyist.net)


4:デフォルトの名無しさん
09/08/08 08:27:14
関連スレ
・Rubyについて Part 36
 スレリンク(tech板)

アンチスレ
・Rubyについて(アンチ専用) Part003
 スレリンク(tech板)

Railsスレ
・【Ruby】Ruby on Rails Part7
 スレリンク(php板)

Windows用スレ
・【ActiveScript】RubyをWindowsで使うスレ【GUI】
 スレリンク(tech板)

Ruby 1.9 系列スレ
・魁け! Ruby 1.9.X
 スレリンク(tech板)


5:デフォルトの名無しさん
09/08/08 08:29:01
前スレ

・Ruby 初心者スレッド Part 29
 スレリンク(tech板)
・Ruby 初心者スレッド Part 28
 スレリンク(tech板)


6:デフォルトの名無しさん
09/08/08 09:55:42
あれ
るびまが403で見れない

7:デフォルトの名無しさん
09/08/08 10:12:19
URLリンク(doc.loveruby.net)

はやくなおせゴルァ

8:デフォルトの名無しさん
09/08/08 11:40:46
おい、前スレ>>1000が気になるんだが、これなんのゲーム?
スレリンク(tech板:1000番)

ローグライクな気がするんだが気になる

9:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/08 11:49:28
>>8
なんでも屋という表現が不安だが、投資のシステムから言ってたぶん Elona だろうと思われる
*band の見た目をちょっと綺麗にして非戦闘メインの生活もできるように作ってみたら
*band にハマるような人によってはヤバい依存度になる可能性があるものができたという話

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

あと、回答は前者の「商品ページが増えて安い杖から高い杖までずらっと並ぶ(可能性がある)」だ

11:デフォルトの名無しさん
09/08/08 11:59:47
>>9
次スレからテンプレだな

12:デフォルトの名無しさん
09/08/08 12:23:45
Ruby 1.8.7 は
Ruby 1.9の新機能の中であまりにも便利だから、とても自然な機能だから、と言われていたものを
Ruby 1.8.6に追加(フィードバック)したバージョン

13:デフォルトの名無しさん
09/08/08 12:33:39
>>9
> Rubygem 0.x
これって、パッケージで入れた後、gem update --systemでアプデトして使ってるんだけどマズイ?

14:デフォルトの名無しさん
09/08/08 12:35:21
>>10
サンクス Elonaか。昔、延々徹夜でお使いやってて、俺何やってんだろ、と思ったゲームだw
またやってみたくなったわ

スレ違いスマソ

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

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

という結果だ

16:デフォルトの名無しさん
09/08/08 13:31:49
>>7

URLリンク(doc.okkez.net)
でもほぼ同じものが見られますよ。

17:デフォルトの名無しさん
09/08/08 18:09:04
>>15
なるほど、そういうことかサンクス

> パッケージの rubygem のバージョンとっとと上げろ(w
そうだわなww

18:デフォルトの名無しさん
09/08/08 21:04:57
CentOS 5.3 で yum install ruby したら入ったのが 1.8.5 でびびったw
こういう場合野良ビルドもやむなしだわな

19:デフォルトの名無しさん
09/08/08 21:30:14
Debian のtable, ubuntu9.04は 1.87 なんだな
この辺が一番多いのかな。

20:デフォルトの名無しさん
09/08/08 23:00:31
正規表現の範囲指定繰り返し{m}のmの部分に、
\1, \2とかの後方参照を埋め込むことってできませんか?

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

str = "2foofoo"

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

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

というような書き方が0を返すようなことがしたいです。
後方参照の\1を数値の2と解釈させるような書き方ってありますか?


21:デフォルトの名無しさん
09/08/08 23:19:59
むしろできて欲しくない気もするな
数値をマッチさせてそれから正規表現を新規に作るしかあんめえ

22:デフォルトの名無しさん
09/08/08 23:22:43
str = "2foofoo"
str =~ /(\d)/
str =~ /\d(foo){#{$1}}/
=>0

2行に分ければできるけど、1行でできるのかな?

23:デフォルトの名無しさん
09/08/08 23:55:29
>>20です。

>>21
>>22

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

んー、2回に分けないとできなさそうですね。

24:デフォルトの名無しさん
09/08/09 00:24:59
>>20
仮に出来たとしても本来の意味の正規表現の能力を逸脱しすぎてて
逆に気持ち悪い機能だな

25:デフォルトの名無しさん
09/08/09 01:23:12
www::mechanizeに関する質問はスレチですか?

26:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/09 01:59:09
> (マテ

28:デフォルトの名無しさん
09/08/09 05:02:53
>>25
別に構わないよ
Rubyでスレ違いになる可能性があるのはRailsの機能を使った場合だけ
それにしたって「Railsスレで聞けバカ」という誘導兼ツッコミが入るだろうし
質問一発目くらいは誰でも大目に見るだろ

29:25
09/08/09 05:09:10
ありがとうございます
じゃあ早速ですがfromのボタンを押すのは
agent = WWW::Mechanize.new
agent.get(uri).form_with(nameとかactionとか){入力する物}.click_button
って形ですよねこのとき、nameが無くてactionも同じformがある場合はどうすれば良いんでしょうか?

30:デフォルトの名無しさん
09/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 番目のフォームになるぞ

31:25
09/08/09 05:31:34
なるほど、配列だから出てくる順番だけ考えて数を入れてやればいいわけですね。
やってみます。

32:デフォルトの名無しさん
09/08/09 18:48:00
Ruby 逆引きレシピとRuby逆引きハンドブックなら、どちらがおすすめですか?

33:デフォルトの名無しさん
09/08/09 18:51:06
>>32
個人的だが著者的に逆引きレシピをオススメしておく。

34:デフォルトの名無しさん
09/08/09 19:01:47
どうせどっちも読むようになるからどっちも買えというのが答ではあるんだが
逆引きのほうでいいんじゃねえの

35:デフォルトの名無しさん
09/08/09 19:17:40
どっちだよw

36:デフォルトの名無しさん
09/08/09 19:30:51
>>32
URLリンク(d.hatena.ne.jp)

37:デフォルトの名無しさん
09/08/09 19:51:26
>>35
ワロタw

38:32
09/08/09 22:06:05
>>33
>>36
ありがとうございます。

36さんに紹介していただいたブログを読むと、
どっちも買って損はなさそうなので、両方買うことにしました。

39:デフォルトの名無しさん
09/08/10 00:21:00
知っておくとちょっと得をするもんなにか教えてくれ。

当たり前すぎるが、pp。データ構造を見やすく出力。


40:デフォルトの名無しさん
09/08/10 00:28:25
||= 演算子
rakeの使い方
sortよりsort_byの方が劇的に速い

41:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/10 01:46:15
>>41
名前変えた方がいいと思うけど
class Class0 < ::Module0::Class0

43:デフォルトの名無しさん
09/08/10 02:54:21
>>40
> sortよりsort_byの方が劇的に速い
「sortが遅い場合は」な

44:デフォルトの名無しさん
09/08/10 08:46:23
>>39
hashやstructを構造体みたいな使い方で大量に使う時の注意点
速度: Hash(キーがsymbol) > Struct > Hash(キーがstring) >>>(超えられない壁)>>> OpenStruct

45:デフォルトの名無しさん
09/08/10 10:32:18
ちょっとお聞きしたいのですが、
rubyでのgui開発で、
タブによって選択肢を選んだり、数値を代入して、
それをある形式で複数のテキストファイルに出力することはできますでしょうか。
いままでfortranしか触ったことがないのですが、
guiを作る必要がでてきまして、どのプログラムがいいか選んでいる状態
なのですが、もしよろしければ教えていただけると幸いです。

46:デフォルトの名無しさん
09/08/10 10:40:35
その程度どんなGUIでもできるでしょ
>どのプログラムが・・・
言語から選んでるってこと?
自分が使うだけ(もしくは使う人みんなRuby使い)ならRuby+何かGUIでもいいけど
そうでないならコンパイルして実行形式にする言語を個人的には勧める

47:デフォルトの名無しさん
09/08/10 11:06:09
>>46
ありがとうございます。そういうのはどれでもできるんですね
実行形式できる言語というのをちょっと勉強してみます

48:デフォルトの名無しさん
09/08/10 11:08:24
>>45
URLリンク(jp.rubyist.net)
を読め

49:デフォルトの名無しさん
09/08/10 11:25:45
IronRubyはダメ?

50:デフォルトの名無しさん
09/08/10 11:30:18
Ruby中級者であるなら何使ってもよい
初心者がRubyでGUIやるのはただのバカ

51:デフォルトの名無しさん
09/08/10 11:49:28
なんでもそれひとつで済ませられる何か、を求めてこそ
何か最後のひとつ以外を学んだら死ぬ、という呪いをかけられていてこそ
プログラミング初心者

老害は立ち去れ

52:デフォルトの名無しさん
09/08/10 12:02:35
BASIC(接頭詞はなにでもなんでも可)であらゆる全てを作っていたあのころの夢を
今の人たちはRubyに見ているのだよ

53:デフォルトの名無しさん
09/08/10 12:28:22
使いやすいGUIビルダーと、充実した日本語ドキュメントがあれば
もはや「全部Ruby」で問題ないレベルまでは来てるんだけどな
最後に残った二つの関門が大きい

>>45
とにかく動けばいいと言うのなら、VisualBasicあたりをオススメする
後のことを考えてRubyでやりたいのなら
VisualuRuby+FormDesigner、WxRubyあたりを使うのがオススメ

54:デフォルトの名無しさん
09/08/10 12:33:36
>>53
winの話なの?それにしてもC#のほうがいいと思う

55:デフォルトの名無しさん
09/08/10 12:39:29
他のGUI言語でAPIの使い方を学び
その知識を利用してRubyからAPIを直に呼ぶ

というのが基本だと思う

56:デフォルトの名無しさん
09/08/10 17:18:45
Windowsの場合、APIを直に呼べばGUIプログラミングができるってもんでもないしなあ。
ウィンドウプロシージャをWindowsからどう呼ばせるかという最大の問題がある。

57:デフォルトの名無しさん
09/08/11 07:22:00
foo.xxx = foo.xxx + 123
で xxx に何入れても代入できる仕組みってできますか?
property_missingで検索したらGroovyしかヒットしない…

58:デフォルトの名無しさん
09/08/11 07:27:33
Rubyに言語仕様としてのプロパティやアクセサというものは存在しない
あくまで「遠目に見ればそのように見えるかもしれない動作」を
単なるインスタンスメソッドで代用しているに過ぎない

>>57
設計思想自体に何か重大な誤りがあるようにしか見えないが、
とりあえずは foo の属するクラス定義の method_missing の中で分岐書くしかないな

59:デフォルトの名無しさん
09/08/11 08:02:55
「インスタンス変数が初めて使用されたときにアクセサメソッドを定義させることはできませんか」
というような質問は年に何回か見るな
動的言語を名乗ってる以上できても面白そうだが、現行では残念ながらできない

クラス設計者が @foo = 100 とする代わりに毎回 instance_variable_initialize(:foo, 100) と書くようにする、みたいな
予防法的なめんどくさい手順しか思いつかん
あ、 instance_variable_initialize は自作してね

60:デフォルトの名無しさん
09/08/11 09:13:07
OpenStructは?

61:デフォルトの名無しさん
09/08/11 09:16:51
そのへんは
> foo.xxx = foo.xxx + 123
を実現するということがどんだけ重要で取替不可かによるな
これの実現のためにどんだけの不便を強いる覚悟があるかみたいな

62:デフォルトの名無しさん
09/08/11 10:01:18
>>59はostruct.rbを写経してこい


63:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/11 12:16:11
class ZeroStruct < OpenStruct
def initialize(*) super; @table.default = 0; end
end

foo = ZeroStruct.new


65:デフォルトの名無しさん
09/08/11 14:03:30
vim使っている人ってマイナーな人?
それともメジャー?

オススメってある?

66:デフォルトの名無しさん
09/08/11 14:05:22
エディタの話題は荒れるって

67:デフォルトの名無しさん
09/08/11 14:26:38
小学校の野外授業の注意プリントみたいだが、普段使っているものでよい
Rubyのためだけに新規操作を覚えるとかマジキチ

68:デフォルトの名無しさん
09/08/11 14:34:15


  ┏┳┳┓     ハイ.     ┏┳┳┓
┏┫┃┃┃ .エディタの話は ┃┃┃┣┓
┃┃┃┃┣┓   ここまで ┏┫┃┃┃┃
┃      ┃┃┏━━┓┃┃      ┃
┃スレチ   ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━┛┗┳━┳┛┗━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━┫  ┗━┓
.             ┗━━┛

69:デフォルトの名無しさん
09/08/11 14:34:50
AA厨うぜえ

70:デフォルトの名無しさん
09/08/11 14:38:00
厳密には「アスキー」アートではない。

71:デフォルトの名無しさん
09/08/11 14:38:21
ほら荒れた

72:デフォルトの名無しさん
09/08/11 14:41:48
×荒れた
○荒らした

73:デフォルトの名無しさん
09/08/11 14:44:31
専門板といえども、数行程度の目障りでないAAなら構わないと思うのだが。
それが嫌なら何で2chにいるの?
2ch以外にもコミュニティはあるよ?

74:デフォルトの名無しさん
09/08/11 14:49:14
>>42
Thx!

75:デフォルトの名無しさん
09/08/11 16:37:25
久々に伸びてると思ったらこの内容かw
気に入らないレスをスルーできないと
(掲示板を利用するのは)難しい

76:デフォルトの名無しさん
09/08/11 16:39:38
そもそもコピペでしか喋れない人間に価値はない

77:デフォルトの名無しさん
09/08/11 16:50:59
>>76
「そもそも」の使い方間違ってるぞ
スレの流れに沿って喋れない人間には価値が無いんだよ、これが

78:デフォルトの名無しさん
09/08/11 16:54:25
Matz曰く「Vimは史上最も無意味なプロジェクト」

ぼくの Vim への憎悪が意味するのは、ぼくが Vim のことを史上最大の
無意味なプロジェクトだと見ているということだ。
Vim がしばらくの間スローガンにしていたのに、
「ちゃんとした Vi」みたいなのがあったよね。
そんなスローガンでスタートしたら、もうどこにも行くところがない。
Vi をちゃんとすることなんて不可能だからだ。

79:デフォルトの名無しさん
09/08/11 17:05:26
>>78
それウケると思ったの?

80:デフォルトの名無しさん
09/08/11 17:10:51
>>76
>>78のことかw

81:デフォルトの名無しさん
09/08/11 17:15:09
>>78
s/Vim/Emacs/g にしてもあまり違和感がないと思うのは俺だけ?w

82:デフォルトの名無しさん
09/08/11 18:38:49
LinusがSubversionについて言った発言


83:デフォルトの名無しさん
09/08/11 18:42:24
つまんねーよ

84:デフォルトの名無しさん
09/08/11 21:38:18
ruby使いって性格最悪な人多いですね^^

85:デフォルトの名無しさん
09/08/11 22:11:09
ID出ないから自演し放題

86:デフォルトの名無しさん
09/08/12 09:31:23
URLリンク(www.skuare.net)
の一行掲示板にescapeをかけたいのですが,
表示部分を#{CGI.escapeHTML(message)}とすると,
改行したい<br>まで出力してしまいます.
単純に使い方わかってないこともありますが,ご指摘お願いします.

87:デフォルトの名無しさん
09/08/12 10:01:32
>>78
s/Vim/Ruby/g にしてもあまり違和感(ry

88:デフォルトの名無しさん
09/08/12 10:03:39
>>86
escapeしたいのは何故?
escapeしたいものは何?

89:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/12 11:02:58
>>89
面影残ってねえ

92:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/12 11:43:55
>>90
やってみましたが,変わりありませんでした..

94:デフォルトの名無しさん
09/08/12 11:46:32
>>92
これは元記事がそもそもかなり悪いな
わざわざ悪いやり方で学ぶ必要もあるまい

95:デフォルトの名無しさん
09/08/12 11:54:59
Ruby ユーザは CGI を書くなと言いたい (c) 弾

96:デフォルトの名無しさん
09/08/12 12:25:18
不足なのなら順に説明すればいいんじゃね夏休み、と思ったが 1ページ目であっさり挫折した
URLリンク(www.skuare.net)

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:デフォルトの名無しさん
09/08/12 13:02:32
まずCGIの仕様をちゃんと紹介すべきだろう。

98:デフォルトの名無しさん
09/08/12 13:03:48
小飼先生が猛然とアップを始めました

99:デフォルトの名無しさん
09/08/12 13:20:22
>>96
標準入力経由でQUERY_STRINGを渡したり
標準出力への出力が勝手にHTMLとみなされるWebサーバなんてあるの?

100:デフォルトの名無しさん
09/08/12 13:25:29
まあ、作ればあるんじゃないかねえ

101:デフォルトの名無しさん
09/08/12 13:41:41
とりあえずあれだ、QUERY_STRING は HTTP GET で、標準入力は HTTP POST だ
そういやなんでわざわざ分けたんだろうな、これ
GET も POST も全部標準入力に渡せばよかったんじゃねーかと思うんだが、当時なんかあったのか

102:デフォルトの名無しさん
09/08/12 14:37:04
RESTでこのあたりの考えが再認識されてるけど、本来の意図は、

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

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

※ URL = Uniform Resource Locator





103:デフォルトの名無しさん
09/08/12 16:51:40
文字列をマッチするときに
=~ の右辺を別ファイルから参照させたいんだけど,どうすればいいですか?


104:デフォルトの名無しさん
09/08/12 16:54:57
いまいち質問がよくわからんけど
re = Regexp.new("$d+")
if s =~ re
みたいにすれば動的に正規表現作れる

105:103
09/08/12 17:48:43
例えば word.txtのなかに
apple
banana
cat

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


>>104
$dは特殊変数かなにかですか?

106:デフォルトの名無しさん
09/08/12 17:53:34
だからマニュアルか解説本くらい読めよ
たいてい書いてあるからさ

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

好きなの選べ

107:デフォルトの名無しさん
09/08/12 18:02:47
>>106
すいません.wordの中をgetsで取得しながらやってみます.
ありがとうございました.

108:デフォルトの名無しさん
09/08/12 18:44:30
>>105->>107

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



109:デフォルトの名無しさん
09/08/12 18:51:43
/¥b#{Regexp.union(File.read('words.txt').split)}¥b/
という話?


110:デフォルトの名無しさん
09/08/12 18:52:55
あああ、yen になってしまった。 ¥ ← これもなっちまうかな……

111:デフォルトの名無しさん
09/08/12 19:51:19
Regexp#=~とString#=~両方あるから右辺ってのが何かピンとこない

112:デフォルトの名無しさん
09/08/13 02:00:02
子飼団って、堀江もんの仲間で情弱のマカだった様な。

113:デフォルトの名無しさん
09/08/13 04:48:18
>>112
なんでそんなに悔しがってるの

114:デフォルトの名無しさん
09/08/13 05:48:28
ビョーキの人にだけ悔しがってるように見える書き方をしたから。

115:デフォルトの名無しさん
09/08/13 07:17:45
× ビョーキの人にだけ悔しがってるように見える書き方をしたから。
○ おちんちんびろーん

116:デフォルトの名無しさん
09/08/13 07:22:05
>>115
なんでそんなに悔しがってるの

117:デフォルトの名無しさん
09/08/13 07:36:36
おちんちんびろーん

118:デフォルトの名無しさん
09/08/13 08:06:20
おまんまんがばーん

119:デフォルトの名無しさん
09/08/14 03:40:25
WinXPで1.8.6のwin32oleで、Excelよりデータの取得をする場合で質問です。

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

行と列の数が5x3程度なら大したこと無いのですが、複数のシートが数千行x数十列の
データを持っている場合だと毎回スクロールして端の位置を確認しなければならず不便です。
どなたかよろしく願います。


120:デフォルトの名無しさん
09/08/14 04:58:36
VBAの知識はあると仮定
「Excal シートの端」でぐぐったここ
URLリンク(oshiete1.watch.impress.co.jp)

121:デフォルトの名無しさん
09/08/14 07:00:34
スレリンク(tech板)
【OLE】オートメーション総合スレ【ActiveX】

122:デフォルトの名無しさん
09/08/14 11:48:54
子飼団ってtwitterで、「いくぞ、ちんこぉぉぉぉぉぉぉぉぉぉぉぉ」とか、
「わしはでかいがあそこは小さい」とか「オ、オオオ、オ、奥野、奥野、奥野の肛門カッカッカカカツカヤツヤクカツ括約筋、ヒャー!」 」
とか言ってた奴だろ?下品すぎる信用できない

123:デフォルトの名無しさん
09/08/14 13:54:57
>>120,121
さんくす
VBAの要領でできるんですね。


124:デフォルトの名無しさん
09/08/14 14:43:17
Ruby通さないほうが書きやすいし正確だし速いんじゃね、とか思ったらこの支配からの卒業

125:デフォルトの名無しさん
09/08/15 00:01:21
>>122
酒飲んでたとしたら許せるレベルだな。
括約筋ごときで下品って言ってどうする。

ゴルゴ13は、マンガの中で
女スパイとエッチして、
「この括約筋はロシア女だな」と
スパイの母国を言い当てたんだぞw

126:デフォルトの名無しさん
09/08/15 05:00:39
自演醜い

127:デフォルトの名無しさん
09/08/15 05:02:35
ここまで全部電網親方の自演

128:デフォルトの名無しさん
09/08/15 08:11:07
>>125
上と下のレスのつながりがわからんw

129:デフォルトの名無しさん
09/08/15 08:16:31
下品な話はぴんくちゃんねるでどうぞ

130:デフォルトの名無しさん
09/08/15 16:08:48
Ruby1.9系でシーザー暗号プログラムを作っています。
1.8では文字列配列をFixnumとして扱えましたが1.9ではStringが帰ってきます。
今、each_byteを使ってますがもっとスマートな方法を教えてください

131:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/15 16:57:03
>>131
text = NKF.nkf('-M','あ')

133:デフォルトの名無しさん
09/08/15 17:14:27
>>132


134:デフォルトの名無しさん
09/08/15 17:32:39
>>130
文字列配列をFixnumで扱うのくだりがさっぱりわからんが、
Ruby1.8のStringはたまたまバイト列だっただけだ
バイト列として扱いたければeach_byte等で回せ


135:デフォルトの名無しさん
09/08/15 19:31:18
1.9はpack unpackも使えないのか?

136:デフォルトの名無しさん
09/08/15 23:23:59
>>130
str.tr("A-Z", "B-ZA")

137:デフォルトの名無しさん
09/08/15 23:32:30
>>135
普通に使えるよ。

138:デフォルトの名無しさん
09/08/16 04:39:04
>>130です
"aaaa".bytes.to_a[2]
のような形で、同じようなことができるようです。答えてくださったかたありがとうございました

139:デフォルトの名無しさん
09/08/16 05:47:38
スマートには見えんのだが…

140:デフォルトの名無しさん
09/08/16 06:04:49
子飼団ってテレビとかに出てるくらいだから本来下衆でしょ。まともなら低能なマスゴミとは距離を置いてる。

141:デフォルトの名無しさん
09/08/16 06:16:40
>>139
ホワイラーなんだと思う

142:デフォルトの名無しさん
09/08/16 06:31:12
>>139
URLリンク(codepad.org)

別に代入する所もいらないし、trと違って任意の数だけ進められる

143:デフォルトの名無しさん
09/08/16 07:16:44
str.unpack('C*').collecgt {|x| x+i}.pack('C*')
なら1.0でも1.9でも動く


144:デフォルトの名無しさん
09/08/16 20:07:42
質問です。
使用している端末エミュレータの高さ(行数)を取得するには
どうすればいいのでしょうか?

145:デフォルトの名無しさん
09/08/16 20:09:55
>>144
URLリンク(www.ruby-lang.org)

146:144
09/08/16 22:44:47
>>145
ありがとうございます。
Curses::lines でいけました。

147:デフォルトの名無しさん
09/08/17 00:26:17
class Parent
attr_accessor :foo
end
class Child < Parent
#...
end

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

child = Child.new
p child.foo #=> 例外発生!

148:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/17 00:46:40
リスコフの置換規則に違反することになるかもしれないが、undef_method :foo, :foo= というのがある。


150:デフォルトの名無しさん
09/08/17 00:56:53
>>143
URLリンク(codepad.org)
できました。ありがとう

151:デフォルトの名無しさん
09/08/17 03:31:00
リスコフなんて糞くらえ。
ってか変数に型が無い言語で継承するって、実装の継承しか無いんだから
undefでも好き勝手にしたらいいと思う。

え?俺OO分かってない?

152:デフォルトの名無しさん
09/08/17 04:29:32
>>147の要求の時点でLSP無視なんだから何やっても構わんよ
特定のメソッドの有無に意味を持たせようとすること自体が邪悪

153:デフォルトの名無しさん
09/08/17 10:10:02
> Rubyにアクセサは存在しない
このへんは後々尾を引いてくると推測

154:デフォルトの名無しさん
09/08/17 10:15:23
特定のメソッドの有無こそがオブジェクトの本質ぢゃないか。

155:デフォルトの名無しさん
09/08/17 10:20:24
Rubyにアクセサは存在しないっつーか、
アクセサは、作るもの(用意するもの)なんじゃねーの?
あるメソッドがアクセサかどうかというだけで。

156:デフォルトの名無しさん
09/08/17 10:45:20
アクセサというシステム的なナニカがあるわけではない、という程度の意味なような気もする

たとえば、Object#accessors でアクセサメソッドの一覧が返るとか
def hoge と def hoge= と attr_reader :hoge と attr_writer :hoge を全部定義しても
hoge() と hoge=() と hoge と hoge= で全部別個に使い分けが可能だとか

157:デフォルトの名無しさん
09/08/17 14:34:53
リファレンスマニュアル FAQより

URLリンク(www.ruby-lang.org)

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

メソッドとアクセサは同じレベルの概念じゃないだろ

158:デフォルトの名無しさん
09/08/17 14:44:57
大変だ、>>157だけが明後日の方向に


159:デフォルトの名無しさん
09/08/17 15:05:41
アクセサってのはインスタンス変数へのアクセスを提供する何かであって
それが言語によってメソッドだったり属性参照式だったりするということじゃないの?

160:デフォルトの名無しさん
09/08/17 15:35:17
>>158
おまえが理解できてないだけだ

161:デフォルトの名無しさん
09/08/17 16:08:04
だからさ、>>148が悪いんだよ

162:デフォルトの名無しさん
09/08/17 16:11:43
「Rubyにはアクセサという機構は存在せず、メソッド定義で代用する」
「定義の簡便のためにattr*系のメソッドがあるが、メソッド定義以上のことを期待するのは勘弁してください」

こう書けばよかったんだな

163:デフォルトの名無しさん
09/08/17 16:44:41
>>162が想定する他の言語のアクセサってどんなの?

164:デフォルトの名無しさん
09/08/17 16:46:42
アクセサが言語レベルで実装されてる言語なんてあるのか?

165:デフォルトの名無しさん
09/08/17 16:48:22
def attribute=(value)

これって明らかにアクセサ用の機能だろ

166:デフォルトの名無しさん
09/08/17 16:58:35
初心者ですがまったく話がわかりません

167:デフォルトの名無しさん
09/08/17 17:01:10
確かに、メソッド名の最後に(だけ)は = が使えるとか、
obj.foo = bar が obj.foo=(bar) の意味である、だとか、
言語レベルの機能だよな。

168:デフォルトの名無しさん
09/08/17 17:34:33
テストファイルで Enumerable を拡張してるんですが、これってテストにならないですよね?

169:106.79-160-162.customer.lyse.net
09/08/17 17:53:40
自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L

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

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



----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
スレリンク(sec2chd板)
にて自動焼人 ★までご連絡ください

170:デフォルトの名無しさん
09/08/17 20:35:18
Array#include?だと指定した値と等しい要素がある場合trueを返しますけど、
等しい要素数を返すにはselectで条件を満たす要素だけとりだしてそれのsizeを調べるしかないでしょうか?

171:デフォルトの名無しさん
09/08/17 20:52:31
>>170
その通りです。

便乗して質問させて下さい。
include? ってなんで Array で再定義してるんでしょうか?
Enumerable#include? とは違う実装になってるんでしょうか?

172:デフォルトの名無しさん
09/08/17 20:53:08
まあ基本的にはそう
grepしてもいいが、「一致する要素の数」というのを直接返すメソッドはない
というかもしあったとしても内部でfind_allしてsize求めるはず

173:デフォルトの名無しさん
09/08/17 20:58:51
例として非nilを数える場合
[true,false,1, "a",nil,nil].inject(0){|r, i| r += (!i.nil?) ? 1 : 0}

書いてみたはいいけど汚いなぁ

174:デフォルトの名無しさん
09/08/17 21:11:12
>>171
rb_ary_includesが遅いと困るからきちんと作ったのだと推測

175:デフォルトの名無しさん
09/08/17 21:16:15
NTFSの副ストリームって対応してる?

176:デフォルトの名無しさん
09/08/17 21:19:19
>>174
なるほど。Array#include? をネイティブに書いて少しでも性能をだそうとした
ということですね。

でも。。今 ruby-1.9.1-p129 の array.c 見てみたんだけど、すごく当たり前な
実装なんですね。
この程度でもネイティブ化すると結構速くなるものなんですかね?

177:デフォルトの名無しさん
09/08/17 21:22:49
わざわざEnumerableで定義したのを探してアクセスする時間が惜しいからそばに入れたんじゃね

>>175
Windows版Rubyとして何かをしたという話は聞かない
コンパイルしたときに自動で何かがどうかできるのなら対応してるかも

178:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/17 21:44:20
>>173
低脳死ねカス
[true,false,1, "a",nil,nil].cmplact.length

180:デフォルトの名無しさん
09/08/17 21:49:39
>>179
低能氏ねカス
s/cmplact/compact/

181:デフォルトの名無しさん
09/08/17 21:54:05
cmplact?

182:デフォルトの名無しさん
09/08/17 21:54:11
length厨はマジでどうにかならんものか

183:デフォルトの名無しさん
09/08/17 21:58:14
size の方が好きなのけ?

184:デフォルトの名無しさん
09/08/17 21:58:26
>>170
sizeを調べる「しかない」わけではない。
cnt = 0
array.each {|x| cnt += 1 if some_condition(x) }
puts cnt
あまり美しくないけど、どうぞ。

185:デフォルトの名無しさん
09/08/17 22:12:45
質問です。
SGEをダウンロードしたいのだけれども、
URLリンク(www.etek.chalmers.se)
がNOT FOUNDになります。
いま、SGEはどこでダウンロードできますか?

186:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/17 22:44:15
>aryを後で別の処理が行われると思われる場合
これは

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

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

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

三番目は正直くどい
でも説明以外にも値をキャッシュしておきたいケースはあるし、そういう時には避けられない

188:デフォルトの名無しさん
09/08/17 22:45:40
二番目は説明というかスレや記事とかでの解説だった

189:186
09/08/17 23:03:10
>>187-188
2番めと3番めの説明がわかりやすかったです。ありがとうございます。

190:デフォルトの名無しさん
09/08/18 00:40:37
>>180
低脳死ね。タイプ量が多い
s/l//

191:デフォルトの名無しさん
09/08/18 00:54:11
>>190
低脳死ね。置換できてない。
cmplact => cmpact

正しくは
compact
 ^

192:チンパンジー愛ちゃん
09/08/18 02:24:08
>>191
うきっきーきーきぃっ

193:デフォルトの名無しさん
09/08/18 05:15:32
>>185
質問するスレ間違ってね?
まあいいや、ここ行ってみ
URLリンク(www.archive.org)

194:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/18 14:13:54
くだらない質問だと思いますが、文字列
a = "001011"
b = "000111"
から
c = "000011"
を求める(論理積?)にはどうしたら良いのでしょうか?

196:デフォルトの名無しさん
09/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:チンパンジー愛ちゃん
09/08/18 14:30:51
def and_str(a, b)
return (Integer(a) & Integer(b)).to_s(2)
end

198:チンパンジー愛ちゃん
09/08/18 14:33:05
def and_str(a, b)
return (Integer("0b" + a) & Integer("0b" + b)).to_s(2)
end

199:デフォルトの名無しさん
09/08/18 14:38:04
>>196
1.9 だけでいいなら a[i] で分割いらないんだけどな
どっちでも動作させるならまだ split がスレ的に無難か
めんどい負の遺産じゃのう

200:195
09/08/18 14:45:00
>>196-199
ありがとうございました! 196が自分には理解しやすい一方、
198の方が速そうに見えるのですが(こちらはpaddingが必要ですね)
大量のデータを処理する際には、違いが出るでしょうか。

201:デフォルトの名無しさん
09/08/18 14:56:25
100万桁を0.5秒で処理しないと銃殺されるとかそういう時にはチェックが必要

202:195
09/08/18 15:03:24
そこまで深刻じゃないので、また両方試してみます!

203:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/18 15:25:02
>>170
1.8.7以降なら Enumerable#count(obj)


205:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/18 15:30:16
代入いらねーよorz
h["usa"].merge!(usa) { |k, s, d| s + d }

207:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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}}


209:203
09/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:デフォルトの名無しさん
09/08/18 19:12:53
ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError)

どうしたらいいんでしょう><

211:デフォルトの名無しさん
09/08/18 20:02:54
>>210
正しいMeCabバインディングを使う
Taggerは今SourceForgeにあるMeCabバインディングをそもそも知らない

212:デフォルトの名無しさん
09/08/18 20:48:35
>>211
hm..
ってことはMeCabがバージョン9.07ではダメってことで、
古いバージョンのMeCabでおk って解釈でいいんですかね?

213:デフォルトの名無しさん
09/08/18 21:08:14
6年前のな

214:デフォルトの名無しさん
09/08/18 21:17:36
MeCab本体とMeCabライブラリは違う

215:デフォルトの名無しさん
09/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()

少しいじった結果エラーログがこうなりました・・。
これはスクリプト書き換えとかで回避できないんでしょうか?

216:203
09/08/18 21:30:24
>>205->>206,>>208さんのもの自体は理解できたのですが,
やはり>>209での問題が解決しませんでした.
ハッシュのハッシュのvalueを加算していきたいのですが助言お願いします.

217:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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


220:203
09/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:チンパンジー愛ちゃん
09/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:デフォルトの名無しさん
09/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:チンパンジー愛ちゃん
09/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:チンパンジー愛ちゃん
09/08/18 23:25:52
ary[12, 6]がおかしいと思わない?

225:203
09/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:チンパンジー愛ちゃん
09/08/18 23:45:41
>>215
@mecab = MeCab::Tagger.new([$0])
ってかいてあるところに
@mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...")
みたいな感じで直接Mecab用のオプション書けばうまくいくよ

227:チンパンジー愛ちゃん
09/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:チンパンジー愛ちゃん
09/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:チンパンジー愛ちゃん
09/08/18 23:57:18
rails仙人やーい

230:デフォルトの名無しさん
09/08/19 00:04:07
>>228
0
5
0
5
では・・・・ないんですか?すいません。
あと:unknownという表記になれていませんのでそこがわかりません。

231:デフォルトの名無しさん
09/08/19 00:10:07
windows用に作られたRubyファイルを動かしたいのですが、ディレクトリがDOSの¥が使われていてファイルを指定できません・・。
No such file or directory - .\/log.txt (Errno::ENOENT)
このようになります。

ディレクトリ指定をLinux用の表現にしたいんですけど、ソースを見てもまったくわかりません。
その部分を書き換えられれば動くと思うんですが、何をどう書き換えればいいかご教授いただけないでしょうか

232:デフォルトの名無しさん
09/08/19 00:14:36
>>226

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

何を見て何のオプションを書き加えていけばいいんでしょうか・・?

233:デフォルトの名無しさん
09/08/19 00:16:04
>>231
原因がわかってるように見えるので、むしろ何がわからないのかわかりません
適当な、それっぽいコード塊でも提示すれば何か答えようがあるかもだけど

234:チンパンジー愛ちゃん
09/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:デフォルトの名無しさん
09/08/19 00:16:56
>>231
それで躓くとなるとRubyどころかプログラム自体初心者じゃないかと思う
でなければよほど面倒なことをしてるソースか

どちらにせよソース提示が必要かと

236:チンパンジー愛ちゃん
09/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:チンパンジー愛ちゃん
09/08/19 00:28:38
追加で、ruby, mecab, mecab-ruby, mecab用辞書
これらすべてのインストール方法も書いてね。

238:203
09/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たしてんじゃねーよ

ということですね。少しわかりました。

239:231
09/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




240:231
09/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:デフォルトの名無しさん
09/08/19 00:37:06
>>236

OS Ubuntu9.04
ruby 1.84
mecab 0.97

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

ghotiでtwitter用のBOT作るんだ><

242:デフォルトの名無しさん
09/08/19 00:38:20
>>231=>>239-240
@text_filename
この中身をセットしている所をチェックしてみれば?

もしくは単純に、
File.open(@text_filename, 'a') do |fp|
の直前で、
p @text_filename
してみるとか。
まあごっつい原始的なデバグ法で気が引けるが。

243:デフォルトの名無しさん
09/08/19 00:41:00
人工無脳流行ってんの?

>>240
その*****とやらのクラスのinitializeの第一引数どうなってる?
>****** = ******.new(".\\")
の .\ に log.txt を結合してるんだと思う

244:242
09/08/19 00:42:50
>>243
をお。
ちゃんと読めばそこまで読み取れるのか。斜め読みいくないね。人口無能レベルのレススマソ

245:195
09/08/19 00:49:25
流れをぶったぎってすみません。ちょっと質問。

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

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

みたいなことがやりたいのです。

246:231
09/08/19 00:51:06
def initialize(dirname)
def initialize(dirname=nil)
def initialize(buf)
def initialize(ary=nil)

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

ruby難しいですorz

247:チンパンジー愛ちゃん
09/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:チンパンジー愛ちゃん
09/08/19 00:53:11
およよ、書かれてた。ごめんね。
リロードせずに書いちゃった。
>>247はとりあえずキャンセル

249:チンパンジー愛ちゃん
09/08/19 00:59:00
質問者が入り乱れてて分け分からなくなってきた。
チンパンジーの限界か!
>>232の質問の続きだと思って>>239のレスに答えてた。
>>232には>>247で悪いことをした。ごめんね

250:デフォルトの名無しさん
09/08/19 01:00:32
愛ちゃんかわいいよ愛ちゃん
てかコテハンうぜぇw

251:231
09/08/19 01:09:23
****** = ******.new (".\\")→(ARGV[0] || "data")でいいんですかね・・

252:231
09/08/19 01:10:30
むりですね。。

253:デフォルトの名無しさん
09/08/19 01:14:25
>>251-252
なんか吹いた

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

大体その******は、全部同じものか?違うなら、HogeとかPageとか適当に分けやがれw

254:チンパンジー愛ちゃん
09/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用辞書のバージョンもちゃんと書いてね。

255:231
09/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
こうですか?わかりません><

256:203
09/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:デフォルトの名無しさん
09/08/19 01:27:53
>>255
おk。わかった。
とりあえず、>>231に戻って
******.new (".\\")

******.new (".")
にしてみろ。
それでダメなら、ちゃんとソース嫁。

258:231
09/08/19 01:29:39
>>257

ネ申


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

259:デフォルトの名無しさん
09/08/19 01:34:02
>>258
怖い、怖いよw

本当にそれでいいか、一度ソースを読むことを激しくお勧めする。
てかRubyほとんど関係ねえ!

260:デフォルトの名無しさん
09/08/19 01:37:44
>>259
文字化けしますが、文字コードの謎の不具合のせいなので調整すれば大丈夫そうです。
あとはPerlでの作業なのでなんとかなるでしょう。。
Ruby難しいです・・。ソース読めません・・。

261:デフォルトの名無しさん
09/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

262:203
09/08/19 01:47:10
>>222
ありがとうございます。出力結果はOKですし、ソースも読解します。
でも、まず、自分が書いた奴がなぜ結果まで持って行けないかわかってないので
チンパンさんに教えてもらっている感じです。


263:チンパンジー愛ちゃん
09/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
のコードで事足りるよね。

264:203
09/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=>が得られないと思っているのですが、それもちがいますか?



265:231
09/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:デフォルトの名無しさん
09/08/19 02:19:39
>>262
「自分で書いた」ってのは>>209の事かな
あれがうまく行かないのはこの行で前のループのデータを上書きしてる為。
hout[ary[i]] = hin
ここに>>208氏のメソッドを使えば>>220に近い結果が出せた。
add(hout,ary[i],hin)

マージに拘りすぎ、普通に枚挙すれ

267:チンパンジー愛ちゃん
09/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]] とやらないと...
これは正しいよ。そうしないと得られないよ。

268:203
09/08/19 03:10:28
>>266
ありがとうございます。上書きしていたのは気がついたのですがそのように書くしか思いつかなかったので手がでませんでした。
addでやったところvalueが0の所は出力されていませんが、欲しいモノで出力されました。

>>267
変数名に関して理解しました。
しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と結びつけるかわかりません。
h["unknownkey"] += unknownvalue はhinの方ですよね。

269:チンパンジー愛ちゃん
09/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:デフォルトの名無しさん
09/08/19 04:43:35
的確なレスもできないくせにコテうぜえ

271:デフォルトの名無しさん
09/08/19 05:30:04
ナツノオモイデ君はどこでも厄介だ

>>265
本当に何も考えていないWindows用スクリプトなのなら日本語はShiftJIS決め打ちだろ
入力する日本語を全部ShiftJISにして$KCODE相当もShiftJISにしてみ

272:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/19 11:12:08
>>231
めんどくせぇソース全文うpってくれ

275:203
09/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:デフォルトの名無しさん
09/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)

277:203
09/08/19 12:32:53
>>276
hout[ary[i]][key]
Hashが二つ[][]を取っているのが気持ち悪いですし、それがundefined method `[]' for nil:NilClass (NoMethodError)
を起こしているのだと思いますが・・・・。そうだとしても解決がわからないです。

278:デフォルトの名無しさん
09/08/19 12:44:23
>>277
>hout[ary[i]][key]
k = ary[i]
x = hout[k]
y = x[key]
と同じ

で、このときのxはなんだとおもう?

279:203
09/08/19 12:50:17
>>278
xはhout[ary[i]]ですか?
ということはhout[ary[i]]が一つのハッシュでhout[ary[i]][key]だとそれのキーということですか?

280:デフォルトの名無しさん
09/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 になる
そんだけ

281:203
09/08/19 12:58:33
あぁ、hout[ary[i]][key]はhout[ary[i]]のkeyがkeyの時のvalueですね

282:デフォルトの名無しさん
09/08/19 13:14:39
これを一括ダウンロードするのってどうやるの?
URLリンク(www.boostermp3.com)

283:デフォルトの名無しさん
09/08/19 13:27:56
うぜえからダウンローダー使うなってページ構造に書いてあるな
まあ知識がないなら手作業でやりゃいいんじゃねえの

284:デフォルトの名無しさん
09/08/19 13:34:11
JavaScriptのリンククリックするだけのように見えるから
JavaScriptのリンクをクリックできるライブラリ使えばできそうな気はする
内容が内容だけにこれ以上は自力でやれとしか

285:203
09/08/19 14:03:15
>>280
すいません。ハッシュ機構というものがあるような感じで書いていました。
メソッドチェーンということはと思って
hin.eachの前で
p hout[ary[i]]をしたところ返り値がnilでした.
ということは hout=Hash.newのところが問題になってくるのでしょうか?

286:デフォルトの名無しさん
09/08/19 14:09:22
>>285
そりゃ唯一の代入をコメントアウトしちゃったらnilしか返ってこないわな


287:デフォルトの名無しさん
09/08/19 14:22:23
よし、ではハッシュの初期値を使うのは禁止だ
理由は、全く理解していないから

望ましい処理を自力で一度書け
どういう時にどうなっていて欲しいかを if で条件分岐しろ

288:デフォルトの名無しさん
09/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] がエラー
のどれかが原因。
あとは自分で調べて。

289:231
09/08/19 14:52:04
>>274
遅くなりましたが>>231.255.258.259.265のソースの全文です。。

URLリンク(2sen.dip.jp)

290:チンパンジー愛ちゃん
09/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:デフォルトの名無しさん
09/08/19 15:24:45
的確なレスもできないくせにコテうぜえ


292:デフォルトの名無しさん
09/08/19 15:25:05
>>289
やっぱsixamoかよ、なんでわざわざ名前伏せるんだw
でもこれ微妙に改変されててバージョン情報に偽りが・・・まあこの際どうでもいいか

とりあえずホンモノ使っときゃいいんじゃね
URLリンク(yowaken.dip.jp)

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

本物より動きそうなんですがね。。

294:デフォルトの名無しさん
09/08/19 15:42:14
厳しい言い方だが、

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

どっちか

295:203
09/08/19 15:58:50
>>286->>288,>>290

ご指摘ありがとうございます。
各クラスのメソッドの知識がないみたいなのでそこを勉強して出直してきます。
また、初期値なども勉強してきます。
昨日からいろいろな人に教えていただきましてまことにありがとうございます。

296:チンパンジー愛ちゃん
09/08/19 16:15:54
mecab坊やはどうなったの?解決したの?

297:デフォルトの名無しさん
09/08/19 16:28:45
的確なレスもできないくせにコテうぜえ

298:デフォルトの名無しさん
09/08/19 16:48:22
ここまで全部読み飛ばした。
寝る。

299:デフォルトの名無しさん
09/08/19 17:02:48
とりあえず
みんな
おつかれ

300:デフォルトの名無しさん
09/08/19 18:36:53
>>293
Ruby1.9なら1.8を
もし引数無しで起動したならリンク先ちゃんと読め

301:デフォルトの名無しさん
09/08/19 19:09:17
1.8w

302:デフォルトの名無しさん
09/08/19 19:48:41
>>290
>初心者が混乱しているときは大抵教え方が悪い
名言だな。こんどから>>1に追加してほしいくらいだ。

303:デフォルトの名無しさん
09/08/19 20:06:36
本人が言うから名言なんであって
もし質問者側からそんなこと言われたらたまったもんじゃないな

304:チンパンジー愛ちゃん
09/08/19 21:29:48
教える側は常に心の奥底で思っていないといけないことですよ。
独りよがりの教えほど迷惑なものはありませんから。

305:191
09/08/19 22:21:17
すまん、俺が変な野郎(>>192)を呼び込んでしまったようだ orz...
あとは俺に任せてくれ。

306:デフォルトの名無しさん
09/08/19 22:30:23
どっちもサルに見えるのだが

307:デフォルトの名無しさん
09/08/20 03:35:31
逆引きRuby誰か書き足してくれ

308:デフォルトの名無しさん
09/08/20 07:19:18
>>307
どっちの逆引き?

309:デフォルトの名無しさん
09/08/20 08:08:59
とりあえず、逆引きRubyという話題を振る時は、
どちらの逆引きか、逆引きの方か、逆引きの方かはっきり囲うな?

310:デフォルトの名無しさん
09/08/20 08:12:14
日本語でおk

311:デフォルトの名無しさん
09/08/20 08:58:41
レシピブック初版にはお世話になったけど
最近いろいろあるから次買うとき迷うな

>>309
書き足すっていうぐらいだからWikiのほうだろう

312:デフォルトの名無しさん
09/08/20 13:38:05
Emacs の ruby-mode で =begin と =end がインデントされてたいそう困ってるんだけど
これって困ってる人いないのかな

313:デフォルトの名無しさん
09/08/20 14:06:37
>>304
そこまで自覚があるなら、さっさと消えろよ

314:デフォルトの名無しさん
09/08/20 17:19:03
>>312
あー,それ確か俺も愕然とした記憶が。
「=begin, =end は使わないことにする」で解決!

315:デフォルトの名無しさん
09/08/21 10:58:26
シリアルポートからデータをgetsで読んでます。
データは一行ずつ出力されるので問題は生じません。
しかし、特殊な設定情報だけは複数行出力で、行数が不定です。
このような何行か分からない出力を受け取るにはどのような手法が適しているでしょうか?

316:デフォルトの名無しさん
09/08/21 11:09:32
行とい考え方を無くせばいい
ただの改行文字だろ

317:デフォルトの名無しさん
09/08/21 11:10:20
設定情報用の一時変数を確保しておいて、
設定情報1行目だったら通常の処理飛ばしてそこに溜めるようにすれば?

318:315
09/08/21 11:26:15
ありがとうございます。
とりあえず、一行ずつ << 演算子で設定情報用の配列の末尾に追加していくことにしました。
EOFがないので終了条件をどうするか悩んでみます。

319:デフォルトの名無しさん
09/08/21 11:40:13
>>318
EOFって全体の?
終了データが流れてこないとかpingみたいな定期送信がないなら
手動停止させるのが普通だと思う

可変長データなのにサイズ情報も終端情報もないのだとしたら
次の通常のデータが送られてきた時にバッファ吐き出して設定処理するとか

320:デフォルトの名無しさん
09/08/21 11:43:57
そりゃデータフォーマットがわからにゃなんとも

321:315
09/08/21 11:58:57
>>319
全てのデータを受信できるまで、timeoutモジュールを使って少し待ってからgetsの待ちを解除してみます。

322:デフォルトの名無しさん
09/08/21 13:43:36
自作のスクリプトがあります
libディレクトリを作ってファイル分けしてみたら10ファイルくらいになりました

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

最初は rubygem パッケージにすることを考えましたが、
require 'rubygems' で1秒近くかかる環境なので正直あまりやりたくありません
(たぶん、スクリプト本体の実行時間のほうが短い)
これ以外になにかてきとーな方法はありませんか?

323:デフォルトの名無しさん
09/08/21 13:52:21
>>322
subversionあたり使うとか

324:デフォルトの名無しさん
09/08/21 13:59:42
>>322
rake install で超適当なディレクトリに超適当に上書きするような rake スクリプトを書く
要は実行可能なときにファイルをコピーしておきたいってことだろ
ファイルをコピーするという行為だけ rake で書け

バージョン戻すという行為が簡単にできないのだけが難点だが、
まあ実行用ディレクトリを適当に圧縮でもしてバックアップしとけ

325:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/21 15:32:32
prev = nil
result = ary.select{|v| v == prev ? false : (prev = v) }

327:デフォルトの名無しさん
09/08/21 15:33:18
前後を参照するほうが注目だったか、スマン出直してくる

328:デフォルトの名無しさん
09/08/21 15:33:53
Enumerable#each_cons

329:デフォルトの名無しさん
09/08/21 15:51:43
>>326
selectをこういうふうに使えるのは知りませんでした。
関数型言語みたいで格好いいなあ。

>>328
こういうのを探していました。ありがとうございます。

330:デフォルトの名無しさん
09/08/21 20:16:48
デバッガ使ってる?

使いこなせてないからかもしれないけども,まだ自分にはpとかppで十分かな.
どんなレベルからデバッガつかってんの?

331:デフォルトの名無しさん
09/08/21 21:20:08
みんななにで開発してるんだろう?
IDE?エディタ+コンソール?

332:デフォルトの名無しさん
09/08/21 22:31:20
>>331
エディタ+コンソール派
軽くて良いIDEがあったら、そっちに乗り換えるつもり

333:デフォルトの名無しさん
09/08/21 23:22:01
デバッガ使ってもバグ直ってないニダ。
謝罪と賠償ニダ。

334:デフォルトの名無しさん
09/08/21 23:24:21
RDEがもっと使いやすかったらいいのにな・・・

335:デフォルトの名無しさん
09/08/22 00:53:03
netbeansで書いて、家ではemacs+putty

336:デフォルトの名無しさん
09/08/22 02:00:36
EclispeからNetbeansに行ってemacsかな。日曜PGなんで結局自分が良く使うエディタがいいや。

337:デフォルトの名無しさん
09/08/22 02:03:57
Aptana+Eclispe
はじめたばっかりですけど

338:デフォルトの名無しさん
09/08/22 08:22:51
ソースコード上でデバッグできるのは?
NetBeansがいいんかな?

339:デフォルトの名無しさん
09/08/22 08:29:08
正直どれもイマイチ
言語仕様的問題だとは思うんだが

340:デフォルトの名無しさん
09/08/22 09:44:00
>325

result = ary.zip([nil]+ary).select{|x,y| x!=y}.map(&:first)

341:デフォルトの名無しさん
09/08/22 09:53:39
>>340
each_consが提示された時点で問題外
オナニー以下

342:デフォルトの名無しさん
09/08/22 13:45:35
色んなやり方が紹介されるのは,初心者スレでは意味があるんじゃないかな。
悪例だったらダメだけど,>>340 は「へーこういうのもあるんだ」的な
例にもなってると思うし。

343:デフォルトの名無しさん
09/08/22 15:15:49
data = ハッシュまたは適当な格納系クラス
Target.new(param).hoge(data)
data #<= Target に関する情報が追加されている

という処理をします
hoge というメソッドにわかりやすい名前を付けたいのですが、なんかいい案ありませんか
凝ってもアレだし update とか register でいいですかね

344:デフォルトの名無しさん
09/08/22 15:17:19
>>342
普通に悪例だと思うが

345:デフォルトの名無しさん
09/08/22 15:23:30
ようそが nil いっこだけのはいれつがかいてあるじてんでかっこわるくてあたまぐるんぐるんぐるんします

346:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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 => …}, ...} になるって奴


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch