Ruby 初心者スレッド Part 38

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

★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 1.8.7 は 1.9 系の新機能のいくつかが利用可能なため、1.8.7 を習得すればスムーズに 1.9 系に移行できるでしょう。

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

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

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

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

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

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

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

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

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

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 http://jp.rubyist.net/
4デフォルトの名無しさん:2010/08/26(木) 09:43:16
●関連スレ
【RoR】Rubyについて Part 41【CPAN vs RubyGems】
http://hibari.2ch.net/test/read.cgi/tech/1281473294/
●アンチスレ
・Rubyについて(アンチ専用) Part004
http://pc12.2ch.net/test/read.cgi/tech/1249737531/
●Railsスレ
【Ruby】Ruby on Rails Part9
http://pc11.2ch.net/test/read.cgi/php/1266563593/
●Windows用スレ
・【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc12.2ch.net/test/read.cgi/tech/1155031689/
●Ruby 1.9 系列スレ
・魁け! Ruby 1.9.X
http://pc12.2ch.net/test/read.cgi/tech/1201603546/
●GUIの使えなさを堪能するスレ
Ruby で GUI するスレ
http://pc12.2ch.net/test/read.cgi/tech/1269609576/
●ぶん投げスレ
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/

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

・Ruby 1.8.5
 レンタルサーバ等にいまだに残ってる非安定な古いバージョン
 1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい

・Ruby 1.8.6
 過去の長期政権と数の暴力で一大勢力圏を維持中の旧安定版
 公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ

・Ruby 1.8.7
 1.9 シリーズの機能をいくつか足したハイブリッドなバージョン、初学者にこそお勧め
 1.9 系機能は 1.8.6 では動かないが「えーマジ1.8.6!? 1.8.6が許されるのは小(AA略」と煽ってよい

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

・Ruby 1.9.1
 満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている)
 本体と添付ライブラリの動作は問題がないのだがgem等外部第三者ライブラリの対応が超適当特に英語圏産
 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
6テンプレここまで:2010/08/26(木) 09:48:25
Windows で Ruby を使う初心者はとりあえず ActiveScriptRuby の 1.8.7 をインストールして慣れろ
OneClickInstaller は単に古すぎ、RubyInstaller は MinGW32 版で現状扱い怪しい、cygwin 版は cygwin マニア専用
IDEつまり統合環境のお勧めは特にない(せいぜい汎用のEclipseかNetBeans)、RDE は古くて独自すぎで Ruby に慣れた人向け

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

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

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


・初心者向けチュートリアル記事(前スレで出たもの)
ホワイの(感動的)Rubyガイド
http://www.aoky.net/articles/why_poignant_guide_to_ruby/
プログラミング入門 - Rubyを使って -, by Chris Pine, 日本語ver. by S. Nishiyama
http://www.ie.u-ryukyu.ac.jp/~kono/software/s04/tutorial/
Ruby チュートリアル (Ruby 1.8.6 編)
http://www.okisoft.co.jp/esc/ruby/tut.html

7デフォルトの名無しさん:2010/08/26(木) 10:01:38

 ○  >>1 乙 もうお前に用はない 
 く|)へ
  〉   ヽ○ノ
 ̄ ̄7  ヘ/
  /   ノ
  |
 /
 |
8デフォルトの名無しさん:2010/08/26(木) 10:48:35
      ,―ヽ_(((((_、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    IPA Rubyスレは誰でもウェルカム
      i、  \   ./  /
       \   ーー   ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
9デフォルトの名無しさん:2010/08/26(木) 10:49:26
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━-┓
┃ ┌────────────────────────ーーー┐ ┃
┃ │            / ̄ ̄\                      │ ┃
┃ │          /  ヽ_  .\                    │ ┃
┃ │          ( ●)( ●)  |     ____            │ ┃
┃ │          (__人__)      |     /      \          .| ┃
┃ │          l` ⌒´    |  / ─    ─   \       │ ┃
┃ │         . {         |/  (●)  ( ●)  \      .| ┃
┃ │           {       / |      (__人__)      |     │ ┃
┃ │      ,-、   ヽ     ノ、\    ` ⌒´     ,/__      .| ┃
┃ │     / ノ/ ̄/ ` ー ─ '/><  ` ー─ ' ┌、 ヽ  ヽ、   │ ┃
┃ │    /  L_         ̄  /           _l__( { r-、 .ト、 . │ ┃
┃ │       _,,二)     /            〔― ‐} Ll  | l) ).│ ┃
┃ │       >_,フ      /               }二 コ\  Li‐' .| ┃
┃ │    __,,,i‐ノ     l              └―イ   ヽ |   . | ┃
┃ │                l                   i   ヽl   . | ┃
┃ └ーーー────────────────────────┘ ┃
┗-━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
            平成22年8月26日 クソスレにて
10デフォルトの名無しさん:2010/08/26(木) 10:51:16
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

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

                  京都大学霊長類研究
11テンプレここまで:2010/08/26(木) 10:59:47
お決まりとは言えいきんらい荒砂w
12デフォルトの名無しさん:2010/08/26(木) 11:56:19
ruby 楽しいね。
こんな楽しみ、うつ病→統合失調症→引きこもりニートにならないと
出会えなかった。
13デフォルトの名無しさん:2010/08/26(木) 16:36:54
>>12
現実と向き合おうよ…
14デフォルトの名無しさん:2010/08/26(木) 21:22:06
Ruby会議2010が明日から開かれますが行く価値ありますか?
チケットはなぜかあるけどだるいので止めとこうかと。
15デフォルトの名無しさん:2010/08/27(金) 00:48:43
>>12が、意外と名文な件
もちょっと推敲すればなんか真理に近づけそうな気がする
16デフォルトの名無しさん:2010/08/27(金) 01:14:50
かみさまありがとう ぼくにともだちをくれて
Ruby にあわせてくれて
17デフォルトの名無しさん:2010/08/27(金) 10:31:10
そこは 'Pascal' の方が語呂がいいよな
18デフォルトの名無しさん:2010/08/28(土) 04:11:52
Prologのほうがいいんじゃないか
Prologスレとか宿題スレ見てると楽しそうで妬ける
19デフォルトの名無しさん:2010/08/28(土) 05:06:50
あらいぐまが通じないなんて…
20デフォルトの名無しさん:2010/08/28(土) 05:17:19
語呂log
21デフォルトの名無しさん:2010/08/28(土) 06:35:46
>>15
2ch 楽しいね。
こんな楽しみ、うつ病→統合失調症→引きこもりニートにならないと
出会えなかった。


いろいろ使えるな
22デフォルトの名無しさん:2010/08/29(日) 15:28:19
1.9.1そんなに初心者向きでないとは知らなかったぜw
23デフォルトの名無しさん:2010/08/29(日) 15:34:34
もう 1.9.2 出たんだからそっち使えよ
24デフォルトの名無しさん:2010/08/29(日) 15:49:20
>>23
そういう情報もチェックしてない位初心者です(´・ω・`)
25デフォルトの名無しさん:2010/08/29(日) 16:53:58
Rails 3でも1.9.2正式サポートだっけ
26Perl忍者 ◆M5ZWRnXOj6 :2010/08/29(日) 19:27:00
ここも潰そう
27デフォルトの名無しさん:2010/08/29(日) 21:26:13
DBIインストールしようと思ってるんだけど、何が必要なのか分からん
今のところMySQLだけいじれればいいんだけど、
Ruby/MySQLかMySQL/RubyとRuby/DBIがあればいいんですか?

あとググったらCで書かれたMySQL/Rubyの場合は
さらにruby-develとmysql-develかC APIが必要とか書いてあったんだけど、
どういうことですか?ruby-develとかmysql-develとかC APIって何者?
28デフォルトの名無しさん:2010/08/29(日) 22:14:05
邪魔者
29デフォルトの名無しさん:2010/08/29(日) 22:17:42
曲者
30デフォルトの名無しさん:2010/08/30(月) 09:09:13
>>27
なんたら-devel って Linux のパッケージだろうと思うけど、
それはビルドに必要なんじゃないかなぁ。
31デフォルトの名無しさん:2010/08/30(月) 11:36:34
説明が果てしなくめんどくさいな

Windowsの場合、mysqlのdllを公式から落としてきてパスを通してれば
mysqlのgemパッケージをrubygemsでインストールするだけでいいはず

Linuxとかの場合はmysqlのgemパッケージインストール時にコンパイルが行われるはずだから
もしRubyをLinux等のパッケージシステムでインストールしていた場合はruby-develまたはruby-devを、
MySQLをLinux等のパッケージシステムでインストールしていた場合はmysql-develまたはmysql-devのような何かが必要
共に、ソースからコンパイルしてふつうにインストールしていた場合は不要
3227:2010/08/30(月) 23:51:45
何をやってもうまくいかない・・・・・・・・・・・・・
とりあえずRuby/MySQLだけはインストールできたけど、他が全くインストールできないです

とりあえず、Ruby/DBIをインストールする前には何が必要なんですか?
33デフォルトの名無しさん:2010/08/31(火) 00:05:34
>>27
環境plz OSとか、Rubyのバージョンとか
34デフォルトの名無しさん:2010/08/31(火) 00:19:54
>>33
Linux Fedora13
ruby 1.8.7

http://www.jiubao.org/ruby-dbi/ruby-dbi.html
ここを参考にしていましたが、初心者故にあまり用語などが理解できていません
そもそもRuby/DBIってDBをいじる時にMySQLだとかPgSQLだとかの差異を吸収するためのものですよね?
Rubyと例えばMySQLとの間の関係は

Ruby
↑↓
Ruby/DBI
↑↓
Ruby/MySQL
↑↓
MySQL C API
↑↓
MySQL

って感じで考えてるんですが、これで合ってるんでしょうか?
その上でRuby/DBIをインストールするにはMySQL本体とRuby/MySQLが必要と考えてるんですが…

あとRuby本体含めてすべてソースからコンパイルしています
Ruby/MySQLだけうまくコンパイルしてインストールできたけど、
MySQL/RubyとRuby/DBIがコンパイルがうまくいきません
素直にgemつかったほうがいいのかな?

35デフォルトの名無しさん:2010/08/31(火) 02:11:53
Ruby
↑↓
Ruby/MySQL
↑↓
MySQL
36デフォルトの名無しさん:2010/08/31(火) 05:04:03
Windowsで、gemを使う環境をセットアップするのに、
(1)mswin32だとセットアップが大変
(2)AcritveScriptRubyだとインストール一発で使用可能
という認識でよいでしょうか?
37デフォルトの名無しさん:2010/08/31(火) 05:50:29
Rubyで主要な処理を行うdllのような物を作り
UIはGUIが得意な別の言語で作り、
内部からRubyで作ったdllのような物を呼び出すことはできますか?

自分のレベルだと引数をとるRubyの単体のプログラムを作り
それを他のプログラムから外部プログラムとして呼び出す方法しかわかりませんでした。
38デフォルトの名無しさん:2010/08/31(火) 06:30:51
それでいいんじゃね
39デフォルトの名無しさん:2010/08/31(火) 08:57:17
>>37
たまにRubyを組み込みスクリプトとして使っているソフトは見かけるよ

SWIGとかRubyのソースそのものも参考になるとおもう
40デフォルトの名無しさん:2010/08/31(火) 10:43:07
RubyのオブジェクトをCコードで作って、そのメソッドを呼ぶことは
容易にできるよ。
41デフォルトの名無しさん:2010/08/31(火) 15:51:33
ubuntuでruby1.9.1にしたら全部動かなくなったお(・ω・)
42デフォルトの名無しさん:2010/08/31(火) 16:02:28
あれほど最新版の1.9.2にしておけとあれほど

Ubuntuのパッケージシステムは非互換性の警告をすることができないからなあ
1.8.7がインストールされてたら「1.9.1いきなり入れるのやめと毛」というメッセージくらいはあってもいい
なくてもいいけど
43デフォルトの名無しさん:2010/08/31(火) 16:20:04
まだリポジトリに入ってないよ
44デフォルトの名無しさん:2010/08/31(火) 16:22:39
libxml2 も 2.7.6 だよね
めんどくさいから 2.7.7 にして欲しいなあ
45Perl忍者 ◆M5ZWRnXOj6 :2010/08/31(火) 20:52:02
         {:::::i:::::::::::::::::::::::i::/!:::::ハj       ヽ_ン´、レ'´ {:::::::i:::::\__
         レ|::|::::::::::::'、::::::N j/         ノ,、_`__>  }:::::::i`i::ト-'´-
          i::|、::::::ハ{`、:::{             ー夂_,ノイ:::::ノ ノ、j: : : : :
          j_ハ`、 {  `ヾ   `、\ ノ /  ー'´___,ィ ム'´i j-―ー--
            }::!'i、`、ー=r==、  ` 、  /   ,r='ラ ̄// i`ソ/: : : : : : : :
            '、`ハ  \_`ー'´\ 、_ i  i  /__`´__ノノ  ム'/、__: : : : : : :
            r')、゛'、   ̄二ニ´ 、`= /´ニ二 ̄   レ':::r'´'、: : : : : :
         r-、_!厶`Ti、        `          /:::::トv':.:.:.:.iー- ..__
         /  j  .V レ、       ,          ハ∧j:.:.:.:.:.:.:.\:.:.:.:.:
       _ノ  i /    |ハ!`、  _   `ー'   _,.r  /   |:.:.:.:.:.:.:.:.:.:.:.:.:.:.:
    r-‐'´   |/    |'   `ヽ、 ̄ ̄二二 ̄  ,.イ     |:.:.:.:.:.:.:.:.:.:.:.:.:.:.
  r-‐/     i     |     i`ー..._    ,.. -'´/      |:.:.:.:.:.:.:.:.:.:.:.:.:.:.

おい、まつもと しねよ
46デフォルトの名無しさん:2010/08/31(火) 20:58:59
Rubyスレ初の逮捕者ですねわかります
47デフォルトの名無しさん:2010/08/31(火) 21:20:23
>>42
バージョン0.2はバージョン0.1と互換性がなくても文句言えないと思う
バージョン0.2とバージョン0.2.1に動作互換性がなかったら一応文句だけは言っていい
48Perl忍者 ◆M5ZWRnXOj6 :2010/08/31(火) 21:53:47
俺の意志を継ぐ者が現れてRubyコミュニティを破壊しつくすだろ
49デフォルトの名無しさん:2010/09/01(水) 00:34:28
ライブドアからでてくんな
50デフォルトの名無しさん:2010/09/01(水) 05:56:54
Nokogiriでの日本語の扱いについて質問させて下さい。

node = Nokogiri::XML::Node::new "test", doc
node.content = "こんにちは".toutf8
puts node.to_s

このとき、"こんにちは"がエンコードされて次のように表示されてしまいます。

"<test>こん.....</test>" (一部省略)

これをそのまま "<test>こんにちは</test>"と表示させるにはどうすればいいのでしょうか?
51デフォルトの名無しさん:2010/09/01(水) 06:58:52
Nokogiri の to_s とか to_html とか to_xml は、なにもなければマルチバイト等を数値実体参照で記述する

irb> puts node.to_html
<test>&#x3053;&#x3093;&#x306B;&#x3061;&#x306F;</test>

で、マニュアル見るとうっすらわかるのだが、これらのメソッドは実は引数を受け付ける

irb> puts node.to_html(:encoding => 'utf-8')
<test>こんにちは</test>

でどうだ

require 'rubygems'; require 'nokogiri'
doc = Nokogiri::HTML.parse('<html></html>')
node = Nokogiri::XML::Node::new "test", doc
node.content = "こんにちは".toutf8

puts node.to_html
puts node.to_html(:encoding => 'utf-8')
5250:2010/09/01(水) 07:08:25
>>51
おー、解決しました!
これからはマニュアルとの付き合い方を少し変える必要がありそうです。

どうもありがとうございました。
53デフォルトの名無しさん:2010/09/01(水) 07:53:23
一発目は他人に聞いたほうが早い
気づいた2回目からは自力で自由に調べたほうが早いが
54デフォルトの名無しさん:2010/09/01(水) 19:26:16
400字くらいある文字列textを、
20文字ずつ区切って、配列aに入れて行くのにイカした方法は無いでしょうか。
やっぱり、普通に一文字ずつやっていくのが良いのでしょうか。
よろしくお願いします。
55デフォルトの名無しさん:2010/09/01(水) 19:32:28
「1文字」って何?
「1文字」が正規表現 /./ にマッチするという条件のもとで

text.scan(/.{0,20}/)[0..-2]

textがUTF-8ならたとえば

$KCODE = 'u'
text = "あいうえお12345"*7
puts text.scan(/.{0,20}/)[0..-2]

#=>
あいうえお12345あいうえお12345
あいうえお12345あいうえお12345
あいうえお12345あいうえお12345
あいうえお12345
56デフォルトの名無しさん:2010/09/01(水) 19:52:59
>>55
ありがとうございます。
非常にスマートですね。
参考にさせて頂きます。

1文字とは、一般的な方の1文字を想定しています。
表示文字と言えば伝わりやすいでしょうか。

例えばの場合ですが、ちょっと意地悪な条件として
「1文字」を「全角1文字分のスペースに収まる文字」と置いた場合は、
(つまり半角文字は2つで全角1文字になるとします)
このようにスマートに処理ができるものなのでしょうか。

もし、偉そうに見えたらすみません。
そういう意図では書いていないつもりです。
ちょっと書き方が工夫できなかったもので。
57デフォルトの名無しさん:2010/09/01(水) 19:57:41
>「1文字」が正規表現 /./ にマッチするという条件のもとで
58デフォルトの名無しさん:2010/09/01(水) 20:00:25
なにこいつ
偉そう
59デフォルトの名無しさん:2010/09/01(水) 20:02:41
やはり偉そうですよね。
そういう意図ではないつもりでしたので、
書くべきではなかったと後悔しています。

ありがとうございました。
60デフォルトの名無しさん:2010/09/01(水) 20:02:54
全角半角の問題もあるけど
3バイトとかの文字コードの途中で切るとか
「20文字」の中に改行があったらどうすんだとか
そもそも >>54 だとアバウトすぎるんだよ
61デフォルトの名無しさん:2010/09/01(水) 20:20:35
条件あとだしは良くないぬ
62デフォルトの名無しさん:2010/09/01(水) 20:25:32
つまり「1文字」という言葉は理解できたが「正規表現」という言葉が理解できなかったということか
63デフォルトの名無しさん:2010/09/01(水) 20:38:45
文字幅のことを言ってるんなら
半角をぜんぶ全角に置き換える処理を入れてみてはどうか
64デフォルトの名無しさん:2010/09/01(水) 20:39:57
>>62
だと思うよ
正規表現は勉強しておいたほうがいいな
65デフォルトの名無しさん:2010/09/01(水) 20:46:27
半角2文字を全角1文字換算で文字数を数える性器表現はどうかけばよいでしょうか?
66デフォルトの名無しさん:2010/09/01(水) 21:34:51
RDE位簡単で初心者に優しいIDE、ubuntuには無いでしょうか?
67デフォルトの名無しさん:2010/09/01(水) 21:47:34
先日 Ruby でファイル一覧を生成するスクリプトを作成したのですが、
途中で止まってしまいます。
(227,000 ファイルぐらいのところで止まります)

師匠、何が原因なのか助言頂けると助かります。

環境:Windows 7
Ruby:ActiveScriptRuby 1.8.7(p302) with-winsock2 tcl-stub

ソースは↓
68デフォルトの名無しさん:2010/09/01(水) 21:49:04
こんな感じです。

def listup(path, exclusion)
 time_format = "%Y-%m-%d %H:%M:%S"
 fullpath = File.expand_path(path)
 print "\"dirname\",", "\"basename\",", "\"extension\",", "\"size(byte)\",", "\"ctime\",", "\"mtime\",", "\"atime\",", "\"sha1\"\n"
 begin
  Find.find(fullpath) do |entry|
   begin
    if exclusion != nil and entry =~ /#{exclusion}/
     next
    end
    if File.file?(entry)
     ctime = File::stat(entry).ctime
     mtime = File::stat(entry).mtime
     atime = File::stat(entry).atime
     print "\"#{File::dirname(entry)}\","
     print "\"#{File::basename(entry)}\","
     print "\"#{File::extname(entry).downcase}\","
     print "\"#{File::stat(entry).size}\","
69デフォルトの名無しさん:2010/09/01(水) 21:50:15
     print "\"#{ctime.strftime(time_format)}\","
     print "\"#{mtime.strftime(time_format)}\","
     print "\"#{atime.strftime(time_format)}\","
     print "\"#{Digest::SHA1.file(entry).to_s}\"\n"
     File::utime(atime, mtime, entry)
    end
   rescue => e
    STDERR.print "#{e}\n"
   end
  end
 rescue => e
  STDERR.print "#{e}\n"
 end
end
70デフォルトの名無しさん:2010/09/01(水) 22:08:44
ファイルが多すぎ
71デフォルトの名無しさん:2010/09/01(水) 22:14:18
2. ばかでかいファイルがあってSHA1計算時に(一時的に)止まった
72デフォルトの名無しさん:2010/09/01(水) 22:17:02
マルチスレッドにすべき
73デフォルトの名無しさん:2010/09/01(水) 22:23:33
>>71
SHA1 のところをコメントアウトしても
止まるんです。

>>72
マルチスレッドだとどう書けばいいのでしょうか
お手数ですが、サンプルでも頂けると助かります。
74デフォルトの名無しさん:2010/09/02(木) 00:51:39
>(227,000 ファイルぐらいのところで止まります)

これは実行するたびに変わるんかい?
75デフォルトの名無しさん:2010/09/02(木) 06:47:18
>>74
同じ時もあるし、違う時もあるんです。
出力が行の途中で止まっていることもあって
いることも、、、
76デフォルトの名無しさん:2010/09/02(木) 07:57:08
実はlist_upは終わってて、その後で止まってる説
77デフォルトの名無しさん:2010/09/02(木) 12:34:59
>>67-69
止まっているというのがどういう状態か詳しく
CPU占有しっぱなしで(タスクマネージャで確認して)プログラムは終了していないがコンソールなどに何も表示されないみたいな状態とか、
実は途中で例外はいて終了しているとか(コマンドラインから実行しておらずエラーでても見えてないとかw)


行の途中で出力が止まるのは
$stdout.sync = true
したらいけるかな。


問題とは関係ないけど、文字列中に " を使いたくてかつ文字列展開をしないけどエスケープ面倒なときは、
%記法が使えるよ
http://www.ruby-lang.org/ja/man/html/_A5EAA5C6A5E9A5EB.html#a.25.b5.ad.cb.a1

> print "\"#{File::dirname(entry)}\","
print %{"#{File::dirname(entry)}",}
78デフォルトの名無しさん:2010/09/02(木) 13:05:55
わるい、rescueで拾ってたか。

おわびに今手元で軽く動かしてみてる。
79デフォルトの名無しさん:2010/09/02(木) 13:20:43
NTFSで2万超えのファイルとかやめとけ。
80デフォルトの名無しさん:2010/09/02(木) 13:32:12
いや fullpath フォルダの直下にファイルが20まんこあるわけじゃないだろ
Find.find の結果としてサブディレクトリ含めて20まんこ超したってことだろ

Find.find をカウントだけした結果が、エクスプローラなどで表示される総ファイル数と同じであることのチェックからだろうな
81デフォルトの名無しさん:2010/09/02(木) 14:05:12
>>67-69
$stdout.sync = true
を上に入れて

> Find.find(fullpath) do |entry|

Dir.glob(fullpath).each_with_index do |entry, index|
にして、

>     print "\"#{Digest::SHA1.file(entry).to_s}\"\n"
>     File::utime(atime, mtime, entry)

をコメントアウトして同ディレクトリの6万ファイルくらいに試してみたが、
マルチコアCPUでもOSが操作不能になるくらいにはなったが、表示はちゃんとされて問題なく終わったぞ

Windows Vista, Ruby 1.8.7
82デフォルトの名無しさん:2010/09/02(木) 14:07:10
ああっと操作不能になった点は、多分teeでファイルに表示と同時にファイルに落していたせいもあるかもしれないし、
コマンドプロンプトにログ流すのが重いのかもしれない
83デフォルトの名無しさん:2010/09/02(木) 19:04:46
配列の参照について質問させてください。

次のコードを期待通りに動作させるにはどうすればいいのでしょうか?
* 関数への参照を配列に格納し、配列の添え字を利用して関数を呼び出したい。

def a() ... end
def b() ... end
def c() ... end
methods = [a,b,c]
methods[1]()

よろしくお願いします。
84デフォルトの名無しさん:2010/09/02(木) 19:09:49
空の () は普通書かない
よおおおっぽど区別しにくい場合だけ書く

__send___(:mes) や __send___('mes') で mes メソッドを呼ぶことができる

methods = ['a', 'b', 'c']
__send__(methods[1])
85デフォルトの名無しさん:2010/09/02(木) 19:13:30
>>84
関数の件、ご指摘ありがとうございます。

__send__メソッドは知らなかったです。面白いメソッドですね。
どうもありがとうございました。
86デフォルトの名無しさん:2010/09/02(木) 19:16:40
Rubyに関数はありません。

メソッド名で手続き実体のようなオブジェクトにアクセスすることもできません。

Proc オブジェクトを使って以下のようにします。

methods = [Proc.new{a()}, Proc.new{b()}, Proc.new{c()}]
methods[1].call()
87デフォルトの名無しさん:2010/09/02(木) 19:31:08
def a(n)
 print n
end
Proc.new{a()}.call(1234)

wrong number of arguments (0 for 1) (ArgumentError)
88デフォルトの名無しさん:2010/09/02(木) 19:40:25
Proc の使い方知ってるということ前提のネタだしなあ

irb> def a(n)
print n
end
irb> Proc.new{|x| a(x)}.call(1234)
1234
8967-69:2010/09/02(木) 20:26:38
>>77
CPU は ruby.exe が占有している感じはしないです。
書いていなかったのですが DOS 窓で実行していて、標準出力と
標準エラー出力をファイルにリダイレクトしています。
何時間たってもプロンプトが表示されないので、出力結果を tail で
見てみると途中で止まっている、もしくは追加出力されない・・・と。
ちなみに $stdout.sync と % の使い方は勉強になりました。ありがとうございます。

>>80
カウントの途中で止まらないことを祈って、試してみます。

>>81
Find.find と Dir.glob の動きの違いを分かっていません、私。
サブフォルダの中も全て調べたいので、Dir.glob の引数に **/{.*,*} を
追加して実行してたのですが、長時間出力されていないので、一旦
メモリ上にファイル情報を配列として取得して、その後動く作りのかな…と
勝手な理解をしています。
find だとすぐに出力されているので、ファイル走査をしながら
順次処理できるように感じて、find で実装していました。
ちなみに
Dir.glob(fullpath) do |entry|

Dir.glob(fullpath).each do |entry|
でも、動きは違うものなんでしょうか?
90デフォルトの名無しさん:2010/09/02(木) 23:07:12
>>75
出力の途中でとまるなら、コードの問題じゃなくてリソースの問題じゃないかな。野生の勘だけど
91デフォルトの名無しさん:2010/09/03(金) 02:49:34
悪い。恥ずかしながらFind.findの存在しらなくて個別の依存ライブラリかと思ってDir.glob書いたので
Dir.globはスルーしてくれ

92デフォルトの名無しさん:2010/09/04(土) 01:08:13
rubyの人はzsh使うってほんとですか?
93デフォルトの名無しさん:2010/09/04(土) 01:29:21
えー俺bashしか使えない
94デフォルトの名無しさん:2010/09/04(土) 08:49:19
俺はzsh使ってるが、「使ってる」ってレベルじゃないな。
マイコミの漢のzshの設定ファイルをほぼそのまま使ってるだけ。
スクリプト的な使い方はRubyがあるからまったくしてないなぁ。
bashでも全然いいと思う。
95デフォルトの名無しさん:2010/09/05(日) 09:51:27
変数のスコープについて質問させてください。

次のコードで、bメソッド内で test 変数を参照するにはどうすればいいでしょうか?
def a
test = "OK"
def b
puts test
end
b
end

testはaメソッド内に閉じ込めたいので、グローバル変数は使いません。
よろしくお願いします。
96デフォルトの名無しさん:2010/09/05(日) 09:53:58
> bメソッド内で test 変数を参照する
うn
> 閉じ込めたいので
うn?
97デフォルトの名無しさん:2010/09/05(日) 10:03:29
>>95
閉じ込めたいのに参照したいって
矛盾してるじゃん
98デフォルトの名無しさん:2010/09/05(日) 10:09:02
とまあ初心者スレに似つかわしくない応酬が続いております

妥当なのは全部メソッドと引数と返り値の関係にしてしまうこと

def a(arg)
disp text(arg)
end

def text(s)
"#{s}です!"
end

def disp(arg)
puts arg
end
99デフォルトの名無しさん:2010/09/05(日) 10:11:04
壮絶なまでに初心者スレらしいスレになっております

>>95の質問がよくわかんない人は
ポップアップなりしてコードのインデントを復元すればよくわかるよ
100デフォルトの名無しさん:2010/09/05(日) 10:12:28
>>95
やりたいことがイマイチ見えない
クロージャに変数testを閉じ込めたいなら
Rubyではこのように書く
入れ子のメソッドはRubyではサポートしない

def a
test = "OK"
Proc.new { puts test }
end

b = a
b.call
101デフォルトの名無しさん:2010/09/05(日) 10:14:37
>>99
わかってないわけじゃない
マニュアル嫁レベルでできねーという返答だ
10295:2010/09/05(日) 10:27:09
>>98
やはりその方法が一番妥当みたいですね。

>>100
入れ子関数がサポートされていないのは残念です。
>>98の方法では、testは隠れてもbが表に出てしまいますし;

クロージャの使用も検討しながら、コードの体系について見直したいと思います。
どうもありがとうございました。
103デフォルトの名無しさん:2010/09/05(日) 10:30:37
def define_a_and_b
v = "initial"
Kernel.send(:define_method, :a) do
v = "OK"
end
Kernel.send(:define_method, :b) do
puts v
end
end

define_a_and_b

# puts v #=>undefined local variable or method `v'
a
b
104デフォルトの名無しさん:2010/09/05(日) 10:32:39
>>68
・Find.find() do ... end の中の処理は別の関数を定義してそこにやらせたほうがいい
・if exclusion != nil and entry =~ /#{exclusion}/ .. end は begin の内側にある必要がない
・/#{exclusion}/ は Find.find() の内側にあると正規表現オブジェクトが毎回作成されて無駄だから、外側にもっていくべき
・if 条件 then next end は next if 条件 と書いた方がいい
・特に理由がなければ STDERR よりも $stderr のほうを使ったほうがいい(後者のほうがテストしやすい)
・STDERR.print "#{e}¥n" は $stderr.puts e でいい
105デフォルトの名無しさん:2010/09/05(日) 10:35:03
すまんあげちまった
>>68 の修正

$KCODE = 'shift_jis' # 必要なら

def update(entry)
 begin
  return unless File.file?(entry)
  #
  dirname = File.dirname(entry)
  basename = File.dirname(entry)
  extname = File.extname(entry).downcase
  print "#{dirname.inspect}, #{basename.inspect}, #{extname.inspect}, "
  #
  stat = File.stat(entry)
  times = [stat.ctime, stat.mtime, stat.atime]
  times.each {|t| print "#{t.strftime("%Y-%m-%d %H:%M:%S").inspect}, " }
  #
  digest = Digest::SHA1.file(entry)
  puts "{digest.inspect}"
  #
  ctime, mtime, atime = times
  File.uptime(atime, mtime, entry)
 rescue => e
  $stderr.puts e
 end
end
106デフォルトの名無しさん:2010/09/05(日) 10:37:45
つづき

def listup(path, exclusion)
 fullpath = File.expand_path(path)
 exc_rexp = exclusion ? /#{exclusion}/ : nil
 begin
  Find.find(fullpath) do |entry|
   next if exc_rexp && exc_rexp =~ entry
   update(entry)
  end
 rescue => e
  $stderr.puts e
 end
end

あと
def f()
 begin
  ...
 rescue => ex
  ...
 end
end

def f()
 ...
rescue => ex
 ...
end
とかける
107デフォルトの名無しさん:2010/09/05(日) 21:01:49
メソッド内にメソッドは宣言できるけど、クラスでメソッドを宣言したのと同じだし
他の言語の関数内関数のような期待されるものとは違う挙動するからな
(スコープが関数内に限定される、言語によってはクロージャを自動で作るなど)

RubyだとProcやlamdaでクロージャ作る方向ででいいんじゃないかな
108デフォルトの名無しさん:2010/09/05(日) 21:02:59
> クラスでメソッドを宣言したのと同じだし
定義か、失礼。
動的言語でそもそも定義とよんでいいのかしらんけど
109デフォルトの名無しさん:2010/09/05(日) 21:10:04
VBあたりに慣れている人だと
異国の魔言語みたいでキツイね。
スコープなどの基本的なところから異次元。
110デフォルトの名無しさん:2010/09/05(日) 21:18:30
フツーに使ってるぶんにはわりとわかりやすくて異次元言うほどでもないと思うんだけど…

いやまあ時々変な仕様のとこで引っかかって魔境になったりはするけど
111デフォルトの名無しさん:2010/09/05(日) 21:19:09
VBの方が異次元
112デフォルトの名無しさん:2010/09/05(日) 21:22:49
人間から見たら、異次元怪獣にみえるし、
怪獣からみたら、異次元人間に見えるし
そんなもん
113デフォルトの名無しさん:2010/09/05(日) 21:23:37
VB6 にだけは言われたくないと全言語が思ってると思う

VB .net になってからはわりと素直
作りやすさのコンセプトが継続されてよくなった感じ
114デフォルトの名無しさん:2010/09/05(日) 21:32:42
Basic使ってた人間から言わせるとVB.netは全然VBやBasicじゃないな
Basicの皮を被ったC#だろ

VBが期待されるのは、phpとかhspとかAutoHotKeyスクリプトとかそういうのだからな
115デフォルトの名無しさん:2010/09/05(日) 21:35:20
他言語の話は荒れるからやめようぜ
ここはRubyのスレ
116デフォルトの名無しさん:2010/09/05(日) 21:36:49
Railsでしか使えないRubyの拡張って一覧ありますか
117デフォルトの名無しさん:2010/09/05(日) 21:47:35
>>116
Ruby本体のマニュアルを適当に読んで適当に頭に入れるといい
それに書いてないものはすべて非標準

Railsがどうとか考える必要なし
Railsだけで完結することなんて稀でたいてい他の gem 使うわけだし
118デフォルトの名無しさん:2010/09/06(月) 00:09:37
>>103はdefを使わずに定義することでスコープを新規に作らずに
束縛を共有しているってことでいいのかな。
119デフォルトの名無しさん:2010/09/06(月) 03:35:45
cattr_accesorはRuby標準で使えるけど、
class_inheritable_accessorつかえねーとかそういうのを手っ取り早く知りたいってことかな

http://railsapi.com/doc/rails-v2.3.8_ruby-v1.8/
こういうRailsとRuby両方検索できるところあるけど、
class_inheritable_accessorが:nodoc:なせいか載ってなくてワロタ
これ使うだろ。載せとけよw
120デフォルトの名無しさん:2010/09/06(月) 03:37:19
悪い、cattr_accesorもRailsか(というかActiveSupport)
121デフォルトの名無しさん:2010/09/06(月) 03:44:01
>>120みたいなアホにならないためにもある程度の初心者になったら標準Rubyのマニュアルは通読しましょう
122デフォルトの名無しさん:2010/09/06(月) 03:49:51
Railsでインストールされるクラスのメソッドのスレ的に悪いところは、読み解くのに分厚い本の解説が要ること
Activeなんとか単体ならまだマシなんだけど…
123デフォルトの名無しさん:2010/09/06(月) 03:54:41
>>118
>>103 のdefine_methodは、文字通りメソッドを定義しているけど、
http://rurema.clear-code.com/1.8.7/method/Module/i/define_method.html

メソッドなのでブロック内もdefine_methodを読んだselfに影響受け、変数は束縛される(クロージャ)
ということでいいのか?

参考
クラスがレシーバの場合のclass_eval とinstance_eval の違い - Slow Dance
http://d.hatena.ne.jp/LukeSilvia/20090222/p1
124デフォルトの名無しさん:2010/09/06(月) 03:55:48
after railsだか言うらしいが、メタプログラミング使いすぎだろJK
125デフォルトの名無しさん:2010/09/06(月) 04:07:26
メタプログラミングのないRubyなんて粕
126デフォルトの名無しさん:2010/09/06(月) 06:17:38
ruby自体メソッドと文法の区別つかないじゃん
12767:2010/09/06(月) 22:08:39
>>104-106
私のレベルでは、まだこのエレガントなコードの解読が
出来ていませんが、明日試してみようと思います。
ありがとうございます。
128デフォルトの名無しさん:2010/09/07(火) 00:18:47
Module内のメソッドでモジュール名を得ることってできないでしょうか?
例えばログを取るときに

def foobar
  logger.debug("#{self.name} foobar called!!")

などと書いてみたのですが、extendした場合なら
モジュール名ではなくextendしたクラス名がself.nameで取れてしまいます。当たり前ですが・・・

Rubyのmoduleは単なるプリプロセッサのようなマクロではない構造なくはないと思っているのですが、
何か良い方法ないでしょうか?


129デフォルトの名無しさん:2010/09/07(火) 00:23:22
変数にしないで、そのまま自分で書けばいいじゃん
130デフォルトの名無しさん:2010/09/07(火) 00:27:21
はい、今はそのまま書いてます。

module FooBar
  def foobar
   logger.debug("FooBar foobar called!!")

こんなコードですね。
ただなんだかRubyらしくないな、と
131デフォルトの名無しさん:2010/09/07(火) 00:33:46
自モジュール名が変更される場合ってどんな時?
それがないから変数としても用意されてないとか?
132デフォルトの名無しさん:2010/09/07(火) 10:07:27
>>128
質問の意図がよくわからない。self.name がモジュール名を返すなら、selfはインスタンスじゃなくてモジュールオブジェクトだよね。
module A
 def self.foobar
  puts "#{self.name}.foobar() called"
 end
end

こうしたいってこと?
  
133デフォルトの名無しさん:2010/09/07(火) 10:16:07
class A
include M
end
A.new.hello #=> "Hello, M !"

b = B.new
b.extend(M)
b.hello #=> "Hello, M !"

という動作をする

module M
 def hello
  # Mは直書きしない
  puts "Hello, #{何か} !"
 end
end

を作りたいということかぬ
134デフォルトの名無しさん:2010/09/07(火) 13:22:12
>>133
それはできなさそう
self.class.ancestors を調べれば候補はわかるけど。

でもこんな方法もあるらしいので、頑張ればできるのかな。
ttp://subtech.g.hatena.ne.jp/cho45/20071014/1192319823
遅いだろうからデバッグ用にしか使えないとおもうけど。
135デフォルトの名無しさん:2010/09/07(火) 13:34:17
Rubyの内部動作のお勉強をしてるのでない限り不要な追求のような気もする
module L
 puts '私はLです'
end
という直書きの仕方はRubyでは普通だと思う
136デフォルトの名無しさん:2010/09/07(火) 19:38:57
1.8.7以降だが

module M
puts "Hello, #{method(__method__).owner}"
end
137デフォルトの名無しさん:2010/09/08(水) 13:06:19
>>133-135
まさにそれです。

>>126
何故かActiveSupport 3がパフォーマンス上の理由で、既存のクラスをmixinで拡張するのやめた話を思い出した
138デフォルトの名無しさん:2010/09/08(水) 13:07:02
>>137>>126宛のレスは誤爆
139デフォルトの名無しさん:2010/09/08(水) 13:14:46
了解
140デフォルトの名無しさん:2010/09/08(水) 13:42:05
>>136
"#{method(__method__).owner}##{__method__}"
でいけました
当たり前なんですが、これを共通化しようとメソッド化して他から呼び出しても、上記を書いたメソッド名が帰ってきます
__method__を引数にして渡すしか無いですかね。
141デフォルトの名無しさん:2010/09/08(水) 21:15:14
だからそれやる意味ないだろう
142デフォルトの名無しさん:2010/09/08(水) 23:22:01
http://www.sakalab.org/prog-ruby/ruby-man-ja-html-20051129/CGI_Session.html

このページの最後の「ただ、名前を入力するとあいさつをするだけのつまらないCGI」を
少し改変してみたら動かなくなりました。
改変した部分は、cmd_startというメソッドで、
@cgi.out( @header ) {
となっている部分を
@cgi.header
として改変してヘッダーを出力させましたがinternalservererrorが出ます。
cgi.out(header)とcgi.headerとで違いはあるんでしょうか。

以下改変後のcmd_start
def cmd_start
@cgi.header
print <<END
<html><head><title>CGI::Session Demo</title></head>
<body>
<form action="#{ENV['SCRIPT_NAME']}" method="get">
<p>
あなたの名前は?
<input type="text" name="name">
<input type="hidden" name="cmd" value="hello">
<input type="submit" value="です。">
</p>
</form>
</body></html>
END
end
143デフォルトの名無しさん:2010/09/09(木) 00:23:13
「たのしいRuby」でもちょっと難しそうと感じた私にオススメ教えてください
144デフォルトの名無しさん:2010/09/09(木) 00:28:09
猿でもわかるRuby
145デフォルトの名無しさん:2010/09/09(木) 01:03:33
Ruby逆引きハンドブックを買い、てやりたいこと
興味のあることを引いて試していく方が良いと俺は思う。

たのしいRubyは、一通りのことを無難に並べているだけの
退屈極まりない本で、オススメしない。
146デフォルトの名無しさん:2010/09/09(木) 01:16:13
>>136
初心者スレなので、簡単でもいいので解説を求む。
147デフォルトの名無しさん:2010/09/09(木) 02:26:28
>>145
それが出来るのは非プログラミング初心者

だいいちたのしいRubyで文句言うとかどんだけ贅沢なんだよ
みんなのなんとかとかそりゃもう以下略
148デフォルトの名無しさん:2010/09/09(木) 02:35:52
>>142

@cgi.headerだと文字列が返ってくるだけで出力はしてないような?
http://rurema.clear-code.com/1.8.7/method/CGI/i/header.html

149デフォルトの名無しさん:2010/09/09(木) 04:18:25
>>143
作りたいものがないならプログラミングの勉強なんてやめて他の楽しいことをしましょう
150デフォルトの名無しさん:2010/09/09(木) 04:24:32
>>142
改変もとの CGI クラスのインスタンスメソッド CGI#out がどういう動作してるか調べてから改変しろ
なんで改変先しか見てないんだよ
151デフォルトの名無しさん:2010/09/09(木) 09:45:01
>>149
死ね
152デフォルトの名無しさん:2010/09/09(木) 12:53:22
>>151
いや、俺も長年ぷログラム書いてめし食ってるが、作りたいものが無いなら
別のことした方が絶対楽しいと思う。
153デフォルトの名無しさん:2010/09/09(木) 13:04:32
そもそもRubyでやる必要性があるか考えたほうがいい
結果的に早く目的が達成する手段がRubyであるというだけだろう
154デフォルトの名無しさん:2010/09/09(木) 13:09:13
>>146 >>136
ブラウザの検索エンジンにるりまサーチでもいれとくの推奨

・__method__

> 現在のメソッド名を返します。メソッドの外で呼ばれると nil を返します。
>
> def foo
> p __method__
> end
> foo #=> :foo
> p __method__ #=> nil

http://rurema.clear-code.com/version:1.8.7/query:__method__+/
http://rurema.clear-code.com/1.8.7/method/Kernel/m/__method__.html

・method
> オブジェクトのメソッド name をオブジェクト化した Method オブジェクトを返します。
>
> [PARAM] name:
> メソッド名をSymbol またはStringで指定します。
> [EXCEPTION] NameError:
> 定義されていないメソッド名を引数として与えると発生します。
>
> me = -365.method(:abs)
> p me #=> #<Method: Fixnum#abs>
> p me.call #=> 365
http://rurema.clear-code.com/1.8.7/method/Object/i/method.html

・method#owner
> このメソッドが定義されている class か module を返します。
http://rurema.clear-code.com/1.8.7/method/Method/i/owner.html
155デフォルトの名無しさん:2010/09/09(木) 13:18:14
>>154
x ・method#owner
o ・Method#owner

>>146
・ダブルクオーテーションの文字列リテラル内に#{}があると式展開される
http://rurema.clear-code.com/1.8.7/doc/spec=2fliteral.html#exp
・__method__ はメソッド名を文字列で返す
・methodはObject#methodで、指定したメソッドをMethodオブジェクトのインスタンスにしたものを返す
・.ownerはMethod#ownerで、そのメソッドの定義されているModuleを返している

>>140 も合わせるとこういう使い方するのだろう

module M
  def puts_module_name
    puts "Hello, #{method(__method__).owner}"
  end
  def puts_method_name
    puts "Good bye, #{method(__method__).owner}##{__method__}"
  end
end
class A
  extend M
end

A.puts_module_name #=> Hello, M
A.puts_method_name #=> Good bye, M#puts_method_name

156デフォルトの名無しさん:2010/09/09(木) 13:32:35
endの書き忘れを見つけづらいんだけどなんとかならないの?
エラーメッセージが糞すぎる
157デフォルトの名無しさん:2010/09/09(木) 13:36:39
>>156
なんともなんね
end でなくても } でも同じだとは思うが

自動インデント整形機能のあるエディタだと気づけたりそうでもなかったり
158デフォルトの名無しさん:2010/09/09(木) 13:52:34
>>156
いくらRubyのIDEがないなどと言われる現状でも
実際のIDEではリアルタイムである程度文法チェックはしてくれてend閉じ忘れは編集中に表示してくれるが
お使いのエディタにはそういうのない?

endの閉じ忘れチェックの機能くらいはありそうなもんだと思うけど
159デフォルトの名無しさん:2010/09/09(木) 16:05:32
>>156
君はまずendをつけ忘れるレベルから脱却しなさい
160デフォルトの名無しさん:2010/09/09(木) 16:09:23
エラーメッセージが糞と言われても、
構文規則的にどうにもできないものだからどうしようもない。
161デフォルトの名無しさん:2010/09/09(木) 16:12:07
>>156
一つは(>>157,158が勧めるように)文法チェック機能のあるエディタ/IDEへ乗り換える方法。
あるいはendの書き忘れが問題にならないようなコーディング技法を身につける道もある。
自分の場合はvimで開発してるけど、最近だとend忘れは苦痛になっていない。
おそらく、以下の作法でコーディングするようになってきたからだと思う。
(1)インデント幅は(Ruby業界標準(?)の2文字ではなく)4文字にする。
  (自分は K&R のC言語で初歩を習ったから、今流の2文字インデントは狭苦しく感じてしまう。)
(2)一貫したインデント規則を厳守する。規則は俺様流ルールで全くかまわない。
  規則よりも一貫性を大切にする。(もちろん俺様流ルールは個人で楽しむ場合に限定される。)
(3)発想を手続き型から関数型へ切り替える。具体的には、wihle/for文は極力使わず、代わりに
  リスト(Array/Hashクラス)とEnumerableモジュール(select/map/eachメソッド)を使う。
  これによって自然とendの使用機会が減り、残るif式のendとブロック("{" .. "}")が
  混在することで、コード全体にメリハリが出る。(ブロックならvimでカッコの対応がチェック可能。)
(4)1ソースのサイズは500step(せいぜい700step)までとし、それ以上はファイルを分割する。
(5)module/classに対応するendの後ろには、それと分かるコメントを入れる。例:end % module
162デフォルトの名無しさん:2010/09/09(木) 17:05:24
1.9にはインデントとの対応を見ることで
end抜けを発見するオプションが無かったっけ?
163デフォルトの名無しさん:2010/09/09(木) 17:07:07
>>161
Rubyやってない人のスレへの参加はご遠慮いただいております
164161:2010/09/09(木) 17:21:29
>>163
意味不明。>>161は現在のRubyの話だよ。(K&R Cは過去の話だ。)
もちろん顧客相手の開発ではなくて、ごく個人的なツール開発だけど、それは無問題だろ?
165デフォルトの名無しさん:2010/09/09(木) 17:25:04
%
166デフォルトの名無しさん:2010/09/09(木) 17:28:14
>>161 が書いてるのは、どう見ても Ruby ユーザーのノウハウだぞ。
俺もだいたい同意見だが、いくつかフォローが必要そうなので書いてみる。

vim で色分けを有効にしてると、if end などの end と、メソッドやモジュールの end は
違う色になるので、対応がずれてると気付く。

それから、(3) を補足すると、やたら制御構造であれこれ書くのではなく、Ruby らしく
ブロック付きメソッド呼び出しを積極的に使うようにして、ブロックは do end でなく { } で
囲む。ということ。
167161:2010/09/09(木) 17:34:33
>>165
ああ、揚げ足取りがしたかったのか。いかにも2chらしいレスですね。
では、>>161(5)の末尾の文章を以下のように訂正。

[X] 例:end % module
[O] 例:end # module
168161:2010/09/09(木) 17:37:32
>>166
適切なフォローありがと。
169デフォルトの名無しさん:2010/09/09(木) 17:49:49
コメント記号として # を書けないって重傷だよな
170デフォルトの名無しさん:2010/09/09(木) 17:59:08
あんま言うとそのうち藁とか使い出すからやめといたほうが…
素直にMLや研究室に引きこもってりゃいいのにと思うことはある
171デフォルトの名無しさん:2010/09/09(木) 18:09:03
ナウなヤングはメーリスと言います
172デフォルトの名無しさん:2010/09/09(木) 18:10:35
こうでいいじゃん

module A
end == A
173デフォルトの名無しさん:2010/09/09(木) 18:13:49
>>172
module … end や class … end 自体は nil を返す
無意味な比較をするくらいならコメントでも書いたほうがマシ
174デフォルトの名無しさん:2010/09/09(木) 18:14:57
真面目か
175デフォルトの名無しさん:2010/09/09(木) 18:18:26
>>173
irb> class C; 1; end
1

def ... end が nil を返すから class や module も nil になることが多いというだけ
最後に何か書けばそれが返る
176161:2010/09/09(木) 18:18:34
>>161の(3)について、具体例がないと理解しづらいと思うので、以下に書く。
このコードは、XML文書を別のテキスト形式へ変換するプログラムのトップレベル(メイン部分)の一部。

xml_doc = XmlDocument.new(source)

term_lists = xml_doc.map { |path, element, tag, attr, text|
  trasform_xml_to_term_lists(
      importer_id,
      path, element, tag, attr, text
  )
}.select { |term_list|
  term_list
}.flatten

base_terms = xml_doc.map { |path, element, tag, attr, text|
  trasform_xml_to_base_terms(
      importer_id,
      path, element, tag, attr, text
  )
}.select { |base_term| # <-- 補足
  base_term
}.flatten

(term_lists + base_terms).each { |term|
  puts term
  puts
}

補足:この部分は compactメソッド一発で書き換えできる。(1年前のコードをそのままコピペした)
(続く)
177161:2010/09/09(木) 18:22:46
(>>176の続き。これで終わり。)

以下は、Rubyコードを静的解析するツールの一部。(現在開発中)

  def mo_include_modules
    mo_modules = @object_model.mo_modules

    @include_module_paths.map { |include_module_path|
      mo_include_module = mo_modules[include_module_path]
      if mo_include_module
         mo_include_module
      else
        module_path, module_name = include_module_path.divide

        MoExternalModule.new(module_path, module_name)
      end
    }
  end

  def mo_included_modules
    @object_model.mo_modules.reject { |mo_module|
      mo_module == self
    }.map { |mo_module|
      mo_module.mo_include_modules.map { |include_module|
        { :module => mo_module, :path => include_module.path }
      }
    }.flatten.select { |pair|
      self.path == pair[:path]
    }.map { |pair|
      pair[:module]
    }
  end
178デフォルトの名無しさん:2010/09/09(木) 18:23:31
なるほど Untouchable か
179デフォルトの名無しさん:2010/09/09(木) 18:34:54
おまえがな
180デフォルトの名無しさん:2010/09/09(木) 19:06:19
>>153
それいったらみんなphpにいっちゃう(初心者は)
181デフォルトの名無しさん:2010/09/09(木) 19:48:10
>>180
いや、発端の質問(>>149)の内容は「あるruby本が難しそう」なのに、
それを>>149,151が勝手に「作りたいものが無い」へと改変してレスしてるのが問題な訳で

おそらく「作りたいものが無い」というのは>>149,151本人の切実な悩みで、
それを(>>149が自分より低レベルな初心者だと見下して)ヤツアタリしてるだけじゃないかと思われる
182デフォルトの名無しさん:2010/09/09(木) 19:53:24
アンカーを間違えた。発端のカキコは>>じゃなくて>>143だし、
改変レスしたのは>>149,151じゃなくて>>149,152だ ,,,, orz吊ってくる
183デフォルトの名無しさん:2010/09/10(金) 02:30:15
>>176-177
おじさんつられちゃうぞ

制御構造をブロックで表現するもの場合は do end したくなるが、
mapのようにEnumerableなものは複数行でも { }で表したくなるということだな。

>>161で言っている意味わかってきた

複数行=do end厨の俺にはつられたくなるのも分かる
184デフォルトの名無しさん:2010/09/10(金) 06:20:30
>>181
よくわからないで煽ってる君向けのスレ
ttp://hibari.2ch.net/test/read.cgi/tech/1276128624/

『たのしいRuby』は(あまりよくないことにいまだに)上位グループに属する初心者向け解説本だ
これでわかりにくいのは「Rubyでやりたいことがない」「覚えてどうするのかわからない」からに過ぎない
何の自主目的も自主目標もない教科書だけの勉強が通常長続きしないのと同じ理屈
楽しくないわからない趣味に時間を掛ける馬鹿を説得して抱え込み続けようとするのは悪徳商法または新興宗教の手口
185デフォルトの名無しさん:2010/09/10(金) 06:38:53
もうわかったからリャマ本パクってこいよ
表紙赤くすればバレないって
186デフォルトの名無しさん:2010/09/10(金) 06:55:38
趣味のプログラミングなんてやりたくてやるもんだからなあ
必要ない状態なのなら無理に勉強せず放っておいたほうがいいと思う
その人の人生に必要なのなら必ずまた巡り合う
車を運転しなければいけなくなるときのように
187デフォルトの名無しさん:2010/09/10(金) 07:12:15
>>186
自分もようやくそれに気づいた。
35年間独学でプログラミングを勉強してきたが
何一つ身につかなかったのは、能力のせいではない。
結局自分がプログラムを作る必要に
迫られていなかった、ということだ。

作りたいモノがあるなら、作りたいという情熱があるなら
どんな難しい本でも読みあさって身につけていたはずだ。
188デフォルトの名無しさん:2010/09/10(金) 07:26:24
犬小屋作る羽目になって日曜大工の基礎スキルがあがるのと似たようなもんだな
板と釘と金槌買ってきて本を見ながら釘打ちと釘抜きを100回繰り返しても辛い
189デフォルトの名無しさん:2010/09/10(金) 07:41:13
Web関連や文字列いじりで作りたいものが(思いつか)ない人はRubyの学習が遅々として進まないかも
C#やJavaで放っておいても見慣れたウィンドウがぽこぽこできる環境だと作りたいものが思いつくかも
あるいはその逆もあるかも
かものはしかも
190デフォルトの名無しさん:2010/09/10(金) 08:30:26
>>184
ここは初心者スレであって、バトルスレではない。
また、少なくとも>>143のカキコは初心者の態度としてマナーを逸したものでは無く、
なおかつ「プログラミングが楽しくない」とか「造りたいものが無い」とは、どこにも書かれていない。
そんな>>143をつかまえて、いきなり「勉強なんてやめろ(>>149,152)」とレスするのは
非常識ではないのか、と言いたかった。

カキコのネタが無いなら黙っていればいい。漏れはそうだった。
あるいは「具体的には、どこが難しいと思ったの?」と逆質問を返すこともできたはずだ。

まあ、バトルスレでハイテンションになっていたというのは理解した。
漏れはてっきり、>>148,152を心身に重い障害(ストレス)を抱えた気の毒な人のカキコだと勘違いしたよ。

再度、言う。ここは初心者スレであって、バトルスレではない。
自分にしか分からないスレ違いの話題で初心者を惑わすのは、それこそ悪徳商法または新興宗教の手口。
そして、誰でも最初は皆初心者であったことを想い出せ。
191デフォルトの名無しさん:2010/09/10(金) 08:45:14
>>143 みたいなアホな流れひっぱるなよ
192デフォルトの名無しさん:2010/09/10(金) 09:42:51
>>187
いや、35年やって身に付かないなら、さすがに他にもっとクリティカルな問題があるよ…
193デフォルトの名無しさん:2010/09/10(金) 09:43:49
>>190
君のような人間の隔離スレだ
ttp://hibari.2ch.net/test/read.cgi/tech/1276128624/
そして二度と出てくるな
194デフォルトの名無しさん:2010/09/10(金) 11:26:12
不用意に煽らなくていいから
Railsスレみたいになっても知らん
195デフォルトの名無しさん:2010/09/10(金) 11:38:36
Ruby こそ現代の COBOL
196デフォルトの名無しさん:2010/09/10(金) 11:40:35
197デフォルトの名無しさん:2010/09/10(金) 15:16:02
Ruby は読み易さよりも書き易さを重視した言語
198デフォルトの名無しさん:2010/09/10(金) 21:28:52
メソッドチェーンのお陰で、左から右にフローが書けることが結構多いんだよな
199デフォルトの名無しさん:2010/09/10(金) 22:43:18
200デフォルトの名無しさん:2010/09/10(金) 22:48:08
>>199
SUGEE
「そのまま」がポイントだな
201デフォルトの名無しさん:2010/09/11(土) 01:30:48
あまりにもエスパーすぎて5分ほど意味が分からなかった
202デフォルトの名無しさん:2010/09/11(土) 04:29:10
分からん
testだったらどっちになるんだ?
203デフォルトの名無しさん:2010/09/11(土) 04:33:23
Cと同時に学んでいるけど、ざっと見て
Cの100倍くらい覚えることが多い感じっすね。
オブジェクト指向のため、言語仕様がデカくて複雑。
プログラミング初心者が最初に学ぶべき言語では
ないと思うっす。
204デフォルトの名無しさん:2010/09/11(土) 04:40:22
ぷw
205デフォルトの名無しさん:2010/09/11(土) 04:44:56
前半はネタだろうけど後半は同意
206デフォルトの名無しさん:2010/09/11(土) 04:58:51
Cの言語仕様はそれなりに大きいんだけどなあ
JISやISOの仕様書はだいたい200ページ
Rubyのドラフト規格(まあサブセット的なものではあるけど)も200ページぐらい
207デフォルトの名無しさん:2010/09/11(土) 05:12:12
RubyはRailsやその他のメタプログラミングの要素も入れないと話にならない
208161:2010/09/11(土) 05:50:36
>>183
わかってもらえる人が増えてくれるというのは嬉しいものです。

>>176,177のコードを読むポイントは、以下の3点だと考えました。
(1)if や case は「文」ではなく、「式」である。
(2)複数行(式)から構成されるブロックの評価値(戻り値)が、最後の式の評価値である。
(3)メソッドセレクタ(".")はUNIXシェルのパイプ("|")である。
209デフォルトの名無しさん:2010/09/11(土) 06:04:59
>>205
でしょ。
Rubyで楽しくプログラミングを学ぼう!なんて謳い文句の
入門書があるけど、あれはひどいと思うっす。
たぶん本を買った人のほとんどが挫折してるっす。
210デフォルトの名無しさん:2010/09/11(土) 06:38:13
それは他のプログラミング言語も同じようなもんだぬ
211デフォルトの名無しさん:2010/09/11(土) 07:21:10
>>203
最初の頃はシンプルだったけど、今はすげぇ水膨れしてる気がすう。
Cにしたって、Windowsみたいにライブラリーが膨大だと、stdio.h, stdlib.hさえ
押さえればなんとかなるUNIXのCよりずっと難しい。
212デフォルトの名無しさん:2010/09/11(土) 07:44:30
unistd.hもよろしくね
213デフォルトの名無しさん:2010/09/11(土) 14:15:20
でも実際Rubyのオブジェクト指向って難しいと思う
処理系がどうなってるか想像できれば納得できるけど入門者に理解できるのかこれ
214デフォルトの名無しさん:2010/09/11(土) 14:23:13
たしかにRubyのオブジェクト指向って複雑だよね
単一class継承だけどmoduleのMix-inはあるし、
メタプログラミングがやたらと使われてるから
215デフォルトの名無しさん:2010/09/11(土) 14:24:03
>>209
俺のことかー!!!
たのしいRubyが微妙すぎ、初めてのプログラミング最高。
216デフォルトの名無しさん:2010/09/11(土) 14:36:06
>>213
プログラミング言語初心者でなければ、
ここの第三回を読めば分かるはず
http://itpro.nikkeibp.co.jp/article/COLUMN/20060825/246409/

プログラミング自体が初めて、あるいはOOP初体験というなら、
そもそもOOP自体が非常に難しい概念になると思う
217デフォルトの名無しさん:2010/09/11(土) 14:36:38
>>215
ナカーマ
たのしいRubyはたしかに微妙だった。
逆引きハンドブック読んだら、
数字の並んだファイルを読み込んで
いい感じに処理してCSVで吐き出す
くらいのミニミニスクリプトは書けるようになった。

どういうときに自分でクラスを作ればいいのかは、いまだによく分からん。
218デフォルトの名無しさん:2010/09/11(土) 16:32:19
下っ端の利用者は def main だけ使ってりゃいいんだよ
219デフォルトの名無しさん:2010/09/11(土) 17:20:01
Ruby 楽しいですね。ニートの暇つぶしに使える。
こんな面白いのはLISP以来かも
220デフォルトの名無しさん:2010/09/11(土) 17:41:01
仕様がシンプルなのが好みならLuaにでも行けばいい
ただRubyの仕様も初心者が使うべきでないものがいくつもある
特異メソッドとかalias, undefには手を出さない方が良い
継承もできるだけ使わない方がいい
委譲とダックタイプでほとんど事足りるのだから
221デフォルトの名無しさん:2010/09/11(土) 18:30:41
>>218
Rubyでmainって「トップレベルのself」ってイメージがあるから
あんまり使いたくないなあその名前
222デフォルトの名無しさん:2010/09/11(土) 18:40:24
そだな
わざわざ被る名称を選ぶこともあんめえ
$ ruby -e "p self"
main
$
223デフォルトの名無しさん:2010/09/11(土) 21:37:33
Rubyだけじゃなくプログラム全体の初心者には、入門書はたのしいRubyよりもRuby(@初めてのプログラミングからの全三冊)
の方がよさげな気がする・・・と言いたいところなんだがお前らだとどうかナ
全編通して1.9で解説してるのを良しとするかどうかがこのスレ的に微妙かも知れんが
224デフォルトの名無しさん:2010/09/11(土) 21:41:56
標準ライブラリのopen-uriとnet/httpって何が違うんでしょう?
それぞれの長所短所を教えてもらえると嬉しいです。
225デフォルトの名無しさん:2010/09/11(土) 21:50:11
>>224

net/http はHTTPを直接喋るために使う。
HTTPリクエスト/レスポンスヘッダを操作したり(セッションとか
クッキーの操作も結局はこれ)、GET以外のメソッドを使ったり。

open-uriはURIをファイル名であるかのように見なして内容を取得する
という限られた用途のために使う。内部ではnet/httpを道具として使っ
ている。

わからないうちは、
単にURLの指す内容をHTTP GETするだけなら open-uri
それ以上のことがしたいなら net/http
226デフォルトの名無しさん:2010/09/11(土) 21:55:59
Ruby標準の「ほーむぺーじあくせすらいぶらり」がnet/http
そのnet/httpを利用して便利にサイト取得できるようにしたのがopen-uri
open-uri は HTTP の知識がなくても利用できるが、 net/http は基礎動作過ぎて HTTP の知識がないと扱えない
open-uri のほうが一般ユーザー向けだが、open-uri はぜんぜん万能ではないので、
open-uri にできないことに遭遇したなら、標準ライブラリの範囲内では net/http を勉強して利用するしかない
227デフォルトの名無しさん:2010/09/11(土) 22:16:35
net/http だと記述量が多くてめんどいというだけだよね
net/http 自体はそれなりにそこそこ使いやすくはある
228224:2010/09/11(土) 22:42:09
ホットペッパーとかぐるなびなんかのapiでxml取得して解析して・・・ってのをやりたかったんだけど
色々調べてみたらこの2つのライブラリを発見したので聞いてみました

とりあえずそういう用途ならopen-uriのほうが良さそうなのかな
たくさん答えていただいてありがとう
229デフォルトの名無しさん:2010/09/11(土) 23:09:24
Rubyに限らないけど、他サイトに直接アクセスする
アプリはあんまり作らない方がいいんじゃないかな。
この前ニュースになったでしょ。
図書館の蔵書情報を得ようとして
自作アプリからサイトにアクセスしまくって
ダウンさせた人が逮捕されたってのが。
230デフォルトの名無しさん:2010/09/11(土) 23:32:38
プログラムの問題じゃなくて
三菱が埋め込んだサイト側のバグだろ
その逮捕は取り消されるべき
231224:2010/09/11(土) 23:41:29
http://webservice.recruit.co.jp/hotpepper/
ここからとってきてるんだけど、これもダメなの?
図書館のやつはapi用意してなかったところに直接アクセスかけまくったのが発端なんじゃないの?
誰が悪いかは別としてさ
232デフォルトの名無しさん:2010/09/11(土) 23:50:13
http://webservice.recruit.co.jp/faq.html
Q:アフィリエイトプログラムを利用することはできますか?

リクルート Webサービス利用規約に反しない限り、アフィリエイトプログラムを利用することができます。

http://webservice.recruit.co.jp/regulation.html
提供目的

本APIは、リクルートが提供する情報の利用価値の向上を目的として提供されます。
利用者は、この目的を理解した上で、この目的に反しない範囲において、本利用規約中の定めに従い、本APIを利用することができます。

だよもん
233デフォルトの名無しさん:2010/09/12(日) 00:30:14
>>231
APIの公開/非公開は関係ない。
一定の常識があれば、連続的に間隔を置かずアクセスすれば、
相手(Webサービス提供者)に迷惑がかかることは分かるだろ。
API非公開でも(生のHTMLをGETしても)、一定の間隔を置けば無問題だし、
API公開サイトでも、長時間に渡って無間隔でアクセスし続けるのは問題になる。
自分の行為が相手にとって迷惑かそうでないか、社会一般常識と照らし合わせて判断し、
マナーを守ってサービスを利用しなさいってこと。子供じゃなけりゃ何も難しいことじゃない。

>>229は、本人が常識を知らないお馬鹿さんだから、無視してヨシ
あるいは、単なる嫌がらせカキコだよ
234デフォルトの名無しさん:2010/09/12(日) 00:38:12
omae mona
235デフォルトの名無しさん:2010/09/12(日) 02:37:04
>>225
open-uriはメソッド拡張しちゃうのがキモいから、俺はスクリプティング専用にしてる。
236デフォルトの名無しさん:2010/09/12(日) 11:42:13
んだな
net/httpで実装を始めて必要に応じてStringIOを返す
メソッドを自作した方が後々楽だし弊害も少ない
237デフォルトの名無しさん:2010/09/12(日) 23:32:13
>>229 は他所で散々繰り返し議論されてるんで、そっち行ってくれや
238デフォルトの名無しさん:2010/09/13(月) 01:05:26
>>237
おいおい、俺はRuby初心者に警告してやってるんだぜ。
もしこのようなWEBアクセスアプリを組む目的で
Rubyを学ぼうとしているなら、それはやめた方がいい。
239デフォルトの名無しさん:2010/09/13(月) 01:11:58
スクリプト言語を学ぶ主な動機の98%がエロ画像の収集だという確固たる調査結果があるのに
お前はいったい何を言ってるんだ
240デフォルトの名無しさん:2010/09/13(月) 14:17:32
>>223
両方持ってるが、後者のほうが色々と実践的かつ親切だとは思う。
defで関数の定義をする解説なんだが
たのしいRubyは「こうやったら作れるよ」で終わってる所を
Rubyはじめてのプログラミングでは「こうやったら作れるよ、こういう時に作るんだよ」まで書いてある感じかなぁ。
でも三冊揃えるとたのしいRubyの倍くらいの価格だし、実践的である分初心者には難しく映るかも。
241デフォルトの名無しさん:2010/09/14(火) 02:34:00
rubyに限った話じゃないけど、forkとThreadの違いがよくわかりません。
Thread → そのスクリプトの中である処理を同時に行う
fork → 別々のスクリプトに書かれてる処理を同時に行う
って感じで理解してますが間違ってるんでしょうか?

あとforkの使い方もいまいちわかりません

rp, wp = IO.pipe
pid = fork
if pid
rp.close
count = 0
loop do
wp.print(count, "\n")
count += 1
sleep 1
end
else
wp.close
while c = rp.getc
STDOUT.putc(c)
end
end

上のコードが参考書に載ってたんで試してみたのですが、
どのような流れで動いてるのかもよくわかりません
forkを使うとどういう流れでプログラムは動くのでしょうか?
242デフォルトの名無しさん:2010/09/14(火) 02:38:32
forkは自分自身をもうひとつ作る
で fork() の戻り値が
fork() を呼んだ方か
複製されたもうひとつの自分かを示しているので
戻り値に従って次の動作を変えるようにプログラムするのが普通
243デフォルトの名無しさん:2010/09/14(火) 02:52:40
rp, wp = IO.pipe
pid = fork
if pid
  rp.close
  count = 0
  loop do
    wp.print(count, "\n")
    count += 1
    sleep 1
  end
else
  wp.close
  while c = rp.getc
    STDOUT.putc(c)
  end
end
この場合 fork する前に rp, wp = IO.pipe を作って fork するから
rp <- IO.pipe -> wp
という PIPE が作られる
fork を呼んだプロセスを A として fork で作られたプロセスを B とすると最初はどちらも同じ状態なので
rp(A) <- IO.pipe -> wp(A)
rp(B) <- IO.pipe -> wp(B)
という二重化された結合が出来る (IO.pipe は同じもの)
if pid によって pid の値のある方 (fork を呼んだ方 = A) は
rp(A) を閉じる
一方 else によって pid の値が 0 の方 (fork で作られた方 = B) は
wp(B) を閉じる
このとき
                    IO.pipe -> wp(A)
rp(B) <- IO.pipe
という状態になっているので
wp(A) に書き込んだデータが rp(B) の方で読み出せるという塩梅
244デフォルトの名無しさん:2010/09/14(火) 02:55:43
ああ
矢印の向きが変だった orz
適当に脳内変換して読み替えて

rp <- IO.pipe <- wp

rp(A) <- IO.pipe <- wp(A)
rp(B) <- IO.pipe <- wp(B)

                    IO.pipe <- wp(A) (if pid )
rp(B) <- IO.pipe (else の方で読み出し)
245デフォルトの名無しさん:2010/09/14(火) 03:21:25
>>241
通常、forkした(=forkによって生成された)子プロセスは、
他のプログラムをexecする(=プログラムをロードして実行する)。
いわゆる fork/exec と呼ばれ、二つの操作を組み合わせることが多い。
言い換えると、forkだけを使ってexecを使わないのは特殊なケース。

fork/execパターンを使用する典型的なプログラムがシェル(shやbash等)。
シェルはユーザからプログラムの実行を指示されると、forkでプロセス(自身のコピー)を
生成し、その子プロセスは指定されたプログラムをexecする。
これはforkが親プロセスと子プロセスとの間でメモリ空間が分離されているから実現できる。
それがスレッドとの決定的な差異。

スレッドは、親子間でメモリ空間を共有するからシェルのような機能は実現できないけど、
逆にメモリ空間を共有するから、スレッド生成のオーバヘッドが(プロセス生成よりも)小さいという
利点もある。これは大量の並行処理を実装しなければならないサーバーアプリケーションでは特に有用。
たとえばWebサービスの場合、小規模であれば(プロセス生成を伴う)CGIを使ったアプリでもかまわないが、
大規模なWebサービスを実装する場合には(スレッド生成を伴う)Apacheモジュール(mod-ruby)の導入を
検討する必要性がでてくる。
246デフォルトの名無しさん:2010/09/14(火) 03:32:59
forkに失敗したときの処理は書かなくて良いんですか?
247デフォルトの名無しさん:2010/09/14(火) 04:02:04
>>239
ネットウォッチとアフィリエイトサイト作成も入れてくれ
248デフォルトの名無しさん:2010/09/14(火) 04:03:43
> rubyに限った話じゃないけど、forkとThreadの違いがよくわかりません。

fork→mswin32だと使えない
Thread→mswin32でも使える
249デフォルトの名無しさん:2010/09/14(火) 08:19:51
cgi = CGI.new("html4")
cgi.ol(){
["A","B"].map{|x|
cgi.li(){x}
}
}
上記コードを、1.8と1.9で動かすと結果が変わってしまいます
 1.8の場合 <OL><LI>A</LI><LI>B</LI></OL>
 1.9の場合 <OL>["<LI>A</LI>", "<LI>B</LI>"]</OL>
1.9で1.8のような結果になるようにすることはできますか?
250デフォルトの名無しさん:2010/09/14(火) 08:41:05
あー悪い、Array#to_s を活用してる人は 1.9.x で注意な

irb1.8> p [1, 2, 3].to_s
123
irb1.9> p [1, 2, 3].to_s
"[1, 2, 3]"

CGI の

 cgi.foo(){ なにか }

のなにかは暗黙ではない文字列であることが望ましい
つまり手動で文字列にしとけ

cgi = CGI.new("html4")
cgi.ol(){
["A","B"].map{|x|
cgi.li(){x}
}.join
}
251デフォルトの名無しさん:2010/09/14(火) 09:52:59
>>249
別にあおりじゃないけど、cgi.rbのタグ生成メソッドを使ってる人って初めてみた。
あれって何か利点あるのかな。ERBのほうがずっとつかいやすいんだけど。
252デフォルトの名無しさん:2010/09/14(火) 09:56:37
・ ["A","B"].map{|x| cgi.li(){x} }.は配列を返す、
・ cgi.ol(){ … } はブロック内のオブジェクトを to_s して処理する
・ Ruby1.8のArray#to_s は要素連結だが Ruby1.9 のは inspect だ

という複合要因だな
配列をそのまま「自動to_s機構」に渡すのはわりとバグ入れ行為だ
Array#join とかで自前で明示的に文字列にしておいたほうが安心
253デフォルトの名無しさん:2010/09/14(火) 09:58:08
>>251
Ruby のブロックつきメソッドで「R u b y ら し く」 HTML を生成することができます

うん、そんだけ
Rubyスゲー時代にうっかりRuby駆使して作ったライブラリが今も残ってる状態
254デフォルトの名無しさん:2010/09/14(火) 10:05:46
というかCGI.pmにあったから移植したんだろう
255デフォルトの名無しさん:2010/09/14(火) 11:10:25
テンプレートっていうか RoR 使うようになったら erb いらなくね?
256デフォルトの名無しさん:2010/09/14(火) 11:21:12
じゃあ全部Railsで作ってRailsで動かせばいいんじゃね
257デフォルトの名無しさん:2010/09/14(火) 11:29:55
RailsってRubyでしか動かないの?
258デフォルトの名無しさん:2010/09/14(火) 11:41:27
他言語 on Rails は趣味実装試験実装レベルでは存在する
Ruby on Rails がいちばん完成度が高いというか、Ruby 以外では Rails 相当を作っても得しないんだ
どー考えてもライブラリを直接書いたほうが早い

ああ、Lisp なら得できるかも
259デフォルトの名無しさん:2010/09/14(火) 12:27:07
>>253
かなりいろいろ全方位射撃したぞお前
260デフォルトの名無しさん:2010/09/14(火) 12:38:28
「Rubyってスゲェんじゃね!!?」と興奮した時期時代にテクニック(笑)を駆使して作ったライブラリの後始末が大変、
というのは甘酸っぱい青春の思い出的にわりと広く認知されていることだと思ったが違うのか
261デフォルトの名無しさん:2010/09/14(火) 12:41:47
それはj
262デフォルトの名無しさん:2010/09/14(火) 12:44:41
Ruby on Rails ってどうして
Rails on Ruby じゃない訳?
263デフォルトの名無しさん:2010/09/14(火) 13:06:40
えw
264デフォルトの名無しさん:2010/09/14(火) 13:15:02
どちらも同じじゃ。それがわからんのか
265デフォルトの名無しさん:2010/09/14(火) 14:16:25
すまん
アホなんで教えてちょんまげ
266デフォルトの名無しさん:2010/09/14(火) 14:52:28
強いて言えばレールの上を走る電車と、
レールを屋根にのっけて止まってる電車の違いじゃ
どっちもかわらんのじゃ
267デフォルトの名無しさん:2010/09/14(火) 15:15:30
A on B と B on A は接触という点において差はない
268デフォルトの名無しさん:2010/09/14(火) 17:35:23
Ruby1.9.1 で png 形式の画像が読み込めて
ピクセル毎の RGB 値を取得できるライブラリでお勧めはありますか?

複数人で使用するため、なるべく導入が簡単なものがいいです
269デフォルトの名無しさん:2010/09/14(火) 20:37:16
初心者が、岡崎図書館事件のようにならないためにできる防衛策としては、自前サーバじゃなくレンタルサーバで実行すればいきなり逮捕ってことはないかな?
レンサバが先に逮捕されそうな気がするけどどうだろう?
270デフォルトの名無しさん:2010/09/14(火) 20:46:14
>>269
板違い
271デフォルトの名無しさん:2010/09/14(火) 20:51:36
>>269
その話はもうやめよう。
Rubyからサイトにアクセスするなんて
初心者のやることじゃないし。
272デフォルトの名無しさん:2010/09/14(火) 20:59:07
>>269>>229 は同一人物
273デフォルトの名無しさん:2010/09/14(火) 21:08:17
またおまえか
274デフォルトの名無しさん:2010/09/14(火) 21:16:21
ありゃなんかタブー扱いになってんの?
別に板違いでもないし、明日は我が身だと思うけどな
まぁ禁止ならこれで終わりでいいです
229とは別人っす
275デフォルトの名無しさん:2010/09/14(火) 21:21:52
またおまえらか
276デフォルトの名無しさん:2010/09/14(火) 21:23:48
229は俺だけど、
書くとイチャモン付けて潰そうとしてくる変なやつらが
常駐してるんで、スレが荒れるからそれ以上書かないことにした。
Rubyは他サイトに容易にアクセスできる言語だから
初心者が安易にそういうスクリプトを書かないよう
指導するのもこのスレも役目だと思うんだけどさ。
277デフォルトの名無しさん:2010/09/14(火) 21:34:03
相手システムが常軌を逸したタコシステムだったというだけで、
10並列で毎秒100とかとんでもないことをやんなきゃ
安易に書いたっていいじゃん。

どっちかといえば、安直に調書にサインするからこんなことに
なるんだってのを広める方が大事じゃね?
278デフォルトの名無しさん:2010/09/14(火) 21:39:13
>>276
クロスドメインクッキーインジェクションとかの話もしてください
279デフォルトの名無しさん:2010/09/14(火) 21:45:49
>>277
あきらかに自分のアクセスが原因で落ちていることは分かっているのに
IPアドレスブロックされてもプロバイダ変えてしつこくアクセスしたら
そりゃ相手が糞システムだと言い張る度胸はなかなか持てない
280デフォルトの名無しさん:2010/09/14(火) 21:53:00
>>276
よく分からんけど、料理板の包丁初心者スレで

 包丁は殺人の道具になるから安易に振り回さないよう注意してあげたほうがいいよね!!

などと、言ってるのと大した差は無かったりする
281デフォルトの名無しさん:2010/09/14(火) 21:54:14
当人の記述を信じるなら、

固定IPのレンタルサーバ(3月14日から3月31日、cronで起動)
プロバイダより割り振られるIPの自宅や実家(4月2日から4月15日、Thinkpadを持ち運んで自宅と実家から手動で、日毎にどちらか一方から)

プロバイダを変えてなんて書いてないけど…
282デフォルトの名無しさん:2010/09/14(火) 22:19:46
>>278
まあそういうことになるよな
単なる自転車置き場の議論だ
283デフォルトの名無しさん:2010/09/14(火) 22:25:38
プロバイダ変わってるじゃん
284デフォルトの名無しさん:2010/09/14(火) 22:34:57
>>282
「ボクでも話に参加できる」からなー
タチ悪いわー
285デフォルトの名無しさん:2010/09/14(火) 22:42:08
DBのコネクションを切らずに放置しちゃうシステムを擁護してるやつって
まともなシステム作ったことないだろ。
実際同じソフトを使ってたほかの図書館では通常利用で落ちてたということだし。
286デフォルトの名無しさん:2010/09/14(火) 22:47:13
>>283
移動に伴って変わるのと、ブロック回避のために変えるのを同一視か。
287デフォルトの名無しさん:2010/09/14(火) 22:53:38
別にどっちでもいいよ。結果的には、落ちてからでもしつこくアクセスしたんだから。
288デフォルトの名無しさん:2010/09/15(水) 00:27:54
>>269-281
まとめサイトも張らずに(ry

岡崎市立中央図書館事件 議論と検証のまとめ - トップページ
http://www26.atwiki.jp/librahack/

Togetter - タグ「librahack」のTwitterまとめ
http://togetter.com/t/librahack

librahackでぐぐって見たらいい。
何故この話が嫌がられているかわかるよ。
簡単にいうと、経緯を知らずに一から議論しようとするやつを相手するのもはや面倒なの・・・

この話に足突っ込むのがもはやトラップレベル
http://twitter.com/#search?q=%23librahack
http://pcod.no-ip.org/yats/search?query=librahack&lang=ja
289デフォルトの名無しさん:2010/09/15(水) 00:29:19
>>288
まとめもなにも、みんな知ってて話してるものかと眺めていたが、
読み返すと確かに経緯を知らない奴もいるな。

290デフォルトの名無しさん:2010/09/15(水) 00:42:04
それじゃ訪問者いなくなるぞ
291デフォルトの名無しさん:2010/09/15(水) 04:01:55
>>270のシンプルな一言が読めないアホが多すぎる
292デフォルトの名無しさん:2010/09/15(水) 08:00:13
>>291
読めますが?
293デフォルトの名無しさん:2010/09/15(水) 09:56:38
269だけど、事件の流れは把握した上で書いた
それでも、たとえ図書館や警察やMDISがアホだったという結果論だったとしても、実際にプログラム作成者が逮捕されたのは事実
日本では、逮捕される=犯罪者、という誤った認識がある以上、社会的に終了しないためにも逮捕されるのだけは避けなくてはならない

そうした上で、そういう誤認逮捕を可能な限り事前に避ける為には、どうすれば良いか?、という話を振ったつもりだった

上級者ならそういう情報や技術に長けてるから、自分で回避できるだろうけど、初心者はそういう事件があったことすら知らないかもしれない

そういうのが、最初から自分のパソコン(自鯖含む)からスクレイピングやらなにかやりはじめたら、同じように逮捕されるリスクを伴う
レンサバなら、苦情は一旦レンサバ側に行くから、いきなり即逮捕されることはないんじゃないだろうかと思った

でもRubyやRailsを自分の都合のいいように使えるレンサバはまだ少ないから…

長くなってしまったのでここでやめておこう
294デフォルトの名無しさん:2010/09/15(水) 10:02:52
「Ruby利用者が逮捕」って記事に見出しが付くのを恐れてるんじゃまいか
295デフォルトの名無しさん:2010/09/15(水) 10:05:29
>レンサバなら、苦情は一旦レンサバ側に行くから、いきなり即逮捕されることはないんじゃないだろうかと思った

岡崎の件ではさくらにも捜査が入ってトラウマになったのか
さくらの利用規約が変わったとか
つまりレンサバの共同利用者にも迷惑が掛かる行為だと認識すべし
296デフォルトの名無しさん:2010/09/15(水) 10:13:17
>でもRubyやRailsを自分の都合のいいように使えるレンサバはまだ少ないから…

安いVPSいっぱい出てるからこれから増えるよ
297269:2010/09/15(水) 10:29:38
>>295
自分もこの事件が起こるまではそういう考え方だった

いきなりレンサバで動かしてリソース使いまくったらほかの利用者に迷惑掛かるだろうから、まずは自分のパソコンだけでいろいろやってみて、上手に使えるようになったらサーバで使おう、と。

でも、この事件によって、自分のパソコンでいろいろやってみてる間に逮捕される可能性があることがわかった

例の逮捕者は、3箇所からアクセスしていて、そのうちのひとつがさくらなんだろうけど、仮にさくら1箇所からだけしかアクセスがなかったとしたら、今回のような「即逮捕」になっただろうか?
アクセス元が個人じゃなく、特定のレンサバだったら、逮捕前にもうワンクッションあったと思うんだよね
それによって利用者がさくらを利用停止や強制退会になったとしても、逮捕に比べりゃ全然マシといえる

同じさくらの周りの利用者にとってはいい迷惑かもしれんが、自分が逮捕される可能性が少しでも減るなら背に腹は変えられない
298デフォルトの名無しさん:2010/09/15(水) 10:39:50
>固定IPのレンタルサーバ(3月14日から3月31日、cronで起動)
>プロバイダより割り振られるIPの自宅や実家(4月2日から4月15日、Thinkpadを持ち運んで自宅と実家から手動で、日毎にどちらか一方から)

憶測で悪いんだけどこの時間の流れ見ると
4/1にさくらのIPアドレスがアク禁になったから自宅と実家からやり始めたように見える
299デフォルトの名無しさん:2010/09/15(水) 10:44:02
>>297
まずさくらで使っていて、さくらのIPアドレスでアクセス禁止が行われた。
しかし、さくら側に連絡が行ったわけではなかったので気づけず、
さくら側のCPU占有率制限に引っかかったと誤解して、
さくら以外からアクセスすることになった。
で、警察的はこれが「制限したのにアクセスしてくるから悪質!」と取られたわけだ。

ということもまとめサイトに書いてあります。
300デフォルトの名無しさん:2010/09/15(水) 11:10:05
結果的には誤認逮捕だったんだから
マスゴミでももっと大きく取り上げても良いと思うんだがな
301デフォルトの名無しさん:2010/09/15(水) 11:14:22
>>284
同意
302デフォルトの名無しさん:2010/09/15(水) 11:30:40
ホレ、まとめwikiにある「2ちゃんねる関連スレッド」へのリンク集だ
 http://www26.atwiki.jp/librahack/pages/13.html#id_4bf02553
この事件について語りたい奴は、これらのスレへ逝ケ!!
303デフォルトの名無しさん:2010/09/15(水) 14:00:52
この議論をあえてRubyスレでやる理由がわからない
304デフォルトの名無しさん:2010/09/15(水) 14:03:34
>>229さんがこのスレにいるからです
305デフォルトの名無しさん:2010/09/15(水) 14:49:57
同意
306デフォルトの名無しさん:2010/09/15(水) 19:50:51
>>303
Rubyスレどころか「初心者スレ」だからな
本スレでやるならともかく
307デフォルトの名無しさん:2010/09/15(水) 22:20:35
1.9.2で追加されたArray#repeated_combination
今まで自分で実装していた同種のものより圧倒的に速いんですけど
これってC言語で書かれているんですか?
308デフォルトの名無しさん:2010/09/15(水) 22:43:30
array.cのrb_ary_repeated_combination関数が実体。

ついでに、
Array.instance_method(:repeated_combination).source_location
#=> nil

Rubyで実装されたメソッドの場合はその定義位置が返る。
309デフォルトの名無しさん:2010/09/15(水) 23:36:21
Ruby メタプログラミング
って Ruby のバージョンいくつが対象ですか?
310デフォルトの名無しさん:2010/09/15(水) 23:41:29
メタプログラミングRuby
だった
スマソ
311デフォルトの名無しさん:2010/09/15(水) 23:57:42
質問です。

たまにRuby win32のスクリプトをbatファイルがわりに書く事があるのですが、
外部コマンドの実行をするベストソリュー・・・ 良い方法は何があるでしょうか?

Kernel#sysmem逐一実行してくれるのですが、例えばloggerに渡したい時などに出力を得られません。
`your_command` の記法だと出力を得られるのですが、逐一出力が得られません。

よい方法はないでしょうか?
312311:2010/09/16(木) 00:40:14
Open3.#popen3で行けました。win32だと
win32-open3 gemと require 'win32/open3'が必要でした

> gem install win32-open3 --platform x86-mingw32

module function Open3.#popen3
http://rurema.clear-code.com/1.8.7/method/Open3/m/popen3.html


systemみたいにカンタンにかけたらいいんでしょうけど
313デフォルトの名無しさん:2010/09/16(木) 01:30:58
loggerでSTDOUTとファイルに両方出力する方法はありませんか?
コマンドラインからなら、STDOUTに出しておいてteeにでも渡せばいいのですが、
あくまで例の一つですが、.irbrcでRails版irb(script/consoleです)のlogger出力を置き換えたい時に

 RAILS_DEFAULT_LOGGER = Logger.new(STDOUT)

とだけすると、コンソールにはlogger出力ができて便利にはなるのですが、
デフォルトのようにファイルにはログを吐く、ということができません。

Loggerで複数の出力先を指定する方法はないのでしょうか?
IOを渡せばいい、ということであれば複数に出力するIOなんてあるものでしょうか?
314デフォルトの名無しさん:2010/09/16(木) 06:35:30
そういうオブジェクト作ればいいんじゃね

Logger のマニュアルを見ると Logger.new の引数は write と close があればいいらしいので

class Tee
def initialize(io, file)
@io = io
if file.kind_of?(File) then
@file = file
else
@file = File.open(file, 'wb')
end
end
def write(s)
@io.write(s)
@file.write(s)
end
def close
@io.close
@file.close
end
end

logger = Tee.new($stdout, './log.txt')
315デフォルトの名無しさん:2010/09/16(木) 06:43:49
logger = Logger.new(Tee.new($stdout, './log.txt')) だった
まだ眠い

あと標準出力は定数 STDOUT ではなく予約されたグローバル変数 $stdout を使うのが普通
(というか昨今のマナーとしてほぼ必須)
なんでかというといざというときに捻じ曲げ可能で便利だから

$stdout = File.new('output.txt', 'wb')

とするとそれ以降の $stdout 対応メソッド、関数的メソッド puts や print や p の出力先がファイルになる
こんなこともあろうかと超便利
316デフォルトの名無しさん:2010/09/16(木) 09:12:25
>>309
1.9系が基本で、バージョンで差異がある部分には都度言及がある。

317デフォルトの名無しさん:2010/09/16(木) 11:11:42
rubyでmysqlを使いたかったのでgemでMysql/Rubyをインストールしようと思ったのですが
上手くインストールできていないみたいで困ってます。
コマンドは以下の通りです。

$sudo gem install mysql

Building native extensions. This could take a while...
Successfully installed mysql-2.8.1
1 gem installed
Installing ri documentation for mysql-2.8.1...
No definition for next_result
No definition for field_name
No definition for field_table
.
.
.
No definition for time_equal
No definition for error_errno
No definition for error_sqlstate

これで上手くインストール出来たと思ったのでirbを起動し、
require 'mysql'
とやって確認したのですが
LoadError: no such file to load -- mysql
が出てしまいます。

ちなみに環境はRuby1.8.7、Mysql 5.0.77、CentOS 5.5です。
よろしくお願いします。
318デフォルトの名無しさん:2010/09/16(木) 12:05:40
rails3やrspec2も出揃うし、そろそろ1.9に移行する頃かな?
319デフォルトの名無しさん:2010/09/16(木) 13:11:10
>>317
rubygemsの仕組みは1.8が出てからデファクトスタンダードになり、
1.9で標準添付になった、という経緯なので、1.8では明示的に
ライブラリとして rubygems を require する必要がある。

irb -rubygems -rmysql

シェルの設定で
RUBYOPT=-rubygems (または、RUBYOPT=-rrubygems)
export RUBYOPT
しておくと、勝手に毎回使ってくれるのでおすすめ。
320デフォルトの名無しさん:2010/09/16(木) 14:30:40
RUBYOPT 使用はあまりお勧めされないのではなかったか
321デフォルトの名無しさん:2010/09/16(木) 15:10:12
>>318
指定したRubyGemsが1.9に対応しているかチェックするwebサービスなかったけ?
322デフォルトの名無しさん:2010/09/16(木) 16:24:24
rubygemsって1.9で標準になったんだ、しらんかった
323デフォルトの名無しさん:2010/09/16(木) 19:10:34
>>319
ありがとうございます。無事require出来ました。
324デフォルトの名無しさん:2010/09/16(木) 19:32:02
>>320
うん、require 'rubygems' は必要な人が必要な時に自力で書く
325デフォルトの名無しさん:2010/09/17(金) 07:20:40
>>324
gem ライブラリとして公開するときは書かないほうがいいんだっけ
326デフォルトの名無しさん:2010/09/17(金) 18:32:01
tableA
id|first_name|last_name|code

tableB
id|first_name|last_name|address|code

上記のようなテーブルがあり(ActiveRecordで作ったSQLite3)

SELECT tableA.id AS A_id, tableA.last, tableB.id AS B_id from tableA LEFT OUTER JOIN tableB USING(code) WHERE tableA.code IN (SELECT code FROM tableB WHERE last_name = '');
とすると次のように結果が得られます。
A_id|last_name|B_id
....
....
(両方のテーブルのidを取得するのが目的です。)

ところが、Active Recordで
Table_A.find_by_sql(["select tableA.id AS A_id, talbeA.last_name, tableB.id AS B_id from tableA left outer join tableB using(code) where tableA.code in (select code from tableB where last_name = :name)", {:name => ''}])
としても
Table_B.find(:all,
:select => 'tableA.id as A_id, tableA.last_name, tableB.id as B_id',
:joins => 'LEFT OUTER JOIN tableB USING(code)',
:conditions => 'tableA.code IN (select code from tableB where last_nam = "")')
としても同じ結果を得られません。
ようするに,tableBのlast_nameが未入力であるもののidと,それにcodeで対応しているtableAのidを同時に取得したいというのが目的です。
(-> [#<Table_A last_name: "ほげほげ">]みたいなかんじでで,肝心のtableA.idとtableB.idがない。)
構文のどの辺りが間違っているのでしょうか?
よろしくお願いいたします.
327デフォルトの名無しさん:2010/09/17(金) 19:01:30
>>326
ActiveRecodeの振る舞いに関する相談なんだから、
このスレじゃなくWebProg板のRailsスレで質問すべきだろうし、
そのほうが>>326が期待する返答を得られると思うよ
328デフォルトの名無しさん:2010/09/17(金) 19:14:08
ActiveRecord単体なら別にここでもいいよ
ただ、回答率は低いとは思うが
329デフォルトの名無しさん:2010/09/17(金) 19:26:40
上記のようなテーブルがあり(ActiveRecordで作ったSQLite3)

SELECT tableA.id AS A_id, tableA.last, tableB.id AS B_id from tableA LEFT OUTER JOIN tableB USING(code) WHERE tableA.code IN (SELECT code FROM tableB WHERE last_name = '');
とすると次のように結果が得られます。
A_id|last_name|B_id
....


うそつくな
エラーになるはずだろ
330デフォルトの名無しさん:2010/09/18(土) 00:10:58
それ以前にJOINしてるのになんでサブクエリー使ってるの?
sqlite使ったことないけどおかしいし、かなり遅くなると思うだが

sqliteの時点でパフォーマンスなんて関係ないかもしれんが
331デフォルトの名無しさん:2010/09/18(土) 00:34:06
if ture
x=5
end

puts x => 5

これは・・・rubyの仕様なのですか?
332デフォルトの名無しさん:2010/09/18(土) 00:36:57
そうだけど、どんな結果を期待していたのかな?
333デフォルトの名無しさん:2010/09/18(土) 00:37:00
ifはスコープを作らない。
334331:2010/09/18(土) 01:06:19
>>332
nilを期待してました。。

>>333
ありがとうございます。
そういうことだったのですね。

for i in 1..10
puts i
end

puts i => 10

実験してみたらfor文も同様ですね!
う〜ん不思議な仕様だ
335デフォルトの名無しさん:2010/09/18(土) 01:10:57
スコープを作るのはclass, module, def。
あと、ブロック(do...end, {...})でのローカル変数の扱いが少し特殊(1.9でシンプルになったけど)
336デフォルトの名無しさん:2010/09/18(土) 01:26:45
>>334
(1..3).each do |i|
puts i
end
puts i
337デフォルトの名無しさん:2010/09/18(土) 07:01:51
rubyで実装された簡易的なcronってないですか?
デーモンとかじゃなくユーザーのプロセスとして動くものでいいんですが。
338デフォルトの名無しさん:2010/09/18(土) 07:05:59
ないです
339デフォルトの名無しさん:2010/09/18(土) 07:28:43
無限ループにsleep(1)挟んでTime.now覗きゃそれっぽくなんでねーの
340デフォルトの名無しさん:2010/09/18(土) 07:32:52
> ユーザーのプロセスとして動くもの
そんなものイヤだ…
341デフォルトの名無しさん:2010/09/18(土) 12:06:02
crontabの文法が発狂しているから何か代替記法が欲しいという
話なら whenever あたりを見ればいいんだが、(簡易な)cronその
ものが欲しいのかな?
342326:2010/09/18(土) 13:13:20
>327
適切な誘導をありがとうございました。2chは広すぎて,適切なスレがわからないこともあります。
(スクリプトのできも含めて初心者ということで^^)
343デフォルトの名無しさん:2010/09/19(日) 05:16:47
>>337-341
Rails関係でバックグラウンドでジョブ走らせる類のライブラリを見たらよいかも

そして、困ったらまずはRuby Toolboxでジャンル別で検索だ。人気順に見れるしいいぞ
The Ruby Toolbox - Know your options!
http://www.ruby-toolbox.com/categories.html


今回の場合ならこんなのとか、
Daemonizing in The Ruby Toolbox
http://www.ruby-toolbox.com/categories/daemonizing.html

こんなのかな
Queueing in The Ruby Toolbox
http://www.ruby-toolbox.com/categories/queueing.html



cronですむなら、crontabのDSLならwheneverでいいね
cronだからユーザーで動かせるし
344デフォルトの名無しさん:2010/09/19(日) 05:42:54
起動するたびに
bach bwv 1
bach bwv 2
...
bach bwv 1000
とyoutubeで検索して最初の動画を再生するスクリプト作ってるんだけど

http://www.youtube.com/results?search_query=bach+bwv+1000

で検索結果のトップを自動再生する引数ってないかな。
ないならhtmlパースするしかないんだろうけど。
345デフォルトの名無しさん:2010/09/19(日) 06:24:07
Rubyのバージョンの使い分けについて質問です。
rvm でローカルユーザについては 1.8.7 と 1.9.2 を切り替えて使うことができるようになりました。
しかしCGIなどウェブサーバで使う Ruby のバージョン切り替えはどうすればいいのでしょうか。
毎回 make install して上書きするものなのでしょうか。
346デフォルトの名無しさん:2010/09/19(日) 09:03:30
>>344
よくわからんがyoutubeの動作はyoutubeに聞け
347デフォルトの名無しさん:2010/09/19(日) 10:36:31
>>345
rvmでやれんこともないけど。

configureスクリプトの--program-prefix、--program-suffixオプション
などで異なる実行ファイル名になるようにする。

同じく--prefixオプションで入る場所自体を分ける。

など
348デフォルトの名無しさん:2010/09/19(日) 11:42:06
>>345
サーバーサイドはrvmのようなものと思想的にあんまし合わない気がする
実行時にさくっと切り替える方法もないしな

/usr 以下に rvm をインストールして運用する方法がオフィシャルにあるので
それ見て適宜 sudo するしかないかと
default_ruby から /usr/local/bin/ruby にシンボリックリンク張っとくとか
349345:2010/09/19(日) 14:07:25
>>347
>>348
なるほどちょっとrvmでやる方法はおいといて、先に別名でインストールして切り替える方向で行ってみます。
ありがとうございました。

350デフォルトの名無しさん:2010/09/19(日) 14:15:20
別名でインストールとかあり得ん。
素直にprefixオプションで違う場所にインストールした方がいいよ。
あとはrubyコマンドにシンボリック張り替えるだけでOKでしょ。
351デフォルトの名無しさん:2010/09/19(日) 14:28:41
Phusion Passenger 3.0がrvm対応になってたよ
352デフォルトの名無しさん:2010/09/19(日) 14:50:00
>>351
それ言ったら話が終わるだろ
353345:2010/09/19(日) 15:00:37
>>350
あ、そうですかね。
今標準で入っている1.8.7が/usr/bin/なので
1.9.2を/usr/local/binに素で入れてみます。

あれそうするとシンボリックリンクをどうするのがいいのかな・・・←初心者かww
354デフォルトの名無しさん:2010/09/19(日) 16:02:34
configure をよく読めば「実行ファイル群に prefix や suffix つけて ruby1.8.7 や irb1.8.7 としてインストールする」という設定がある
これ使ってインストールして、メインにしたい実行ファイルだけ ruby や irb としてシンボリックリンク張れ
355デフォルトの名無しさん:2010/09/19(日) 16:18:55
既に/usr/binにrubyがインスコされちゃってるから困ってるのでは?
356デフォルトの名無しさん:2010/09/19(日) 16:21:11
PATHなんか好きなようにいじれるし、絶対パス指定というのもあるのに何が問題?
357デフォルトの名無しさん:2010/09/19(日) 16:27:49
>>354
>>347
既出
358デフォルトの名無しさん:2010/09/19(日) 16:47:36
ruby enterprise使ってる人は少ないのかな?
rails使いなら現状では他に選択肢は無いと思うんだけど。
359デフォルトの名無しさん:2010/09/19(日) 20:38:13
鋸入れたいんだけど↓
$ gem install nokogiri
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.

/usr/bin/ruby.exe extconf.rb
checking for libxml/parser.h... yes
checking for libxslt/xslt.h... yes
checking for libexslt/exslt.h... yes
checking for xmlParseDoc() in -lxml2... no
-----
libxml2 is missing. please visit http://nokogiri.org/tutorials/installing_nokog
iri.html for help with installing dependencies.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.


誰か解決方法教えてください。
libxml2-2.2.7、libxlt-1.1.26インスコ済み、
win7-32、cygwin版ruby1.8.7です。
360デフォルトの名無しさん:2010/09/19(日) 20:53:58
>>359
はっきり言う
これを解決できないような人間がcygwinなんて使うな
素直にmswin32版使え
361デフォルトの名無しさん:2010/09/19(日) 21:08:12
> これを解決できないような人間がcygwinなんて使うな
に一応同意を返しておきたい気はする

xmlParseDocということはlibxml2だな
cygwinってなんか変なとこにヘッダファイル置いたっけ?

とりあえず示されたサイト見るといい
gem installするときにlibxml2やlibxsltのディレクトリを指定する方法が載ってる
362デフォルトの名無しさん:2010/09/19(日) 21:11:43
libxml2-dev みたいなのをcygwin のsetupでインスコせよ。
363デフォルトの名無しさん:2010/09/19(日) 21:16:25
…え、パッケージ使ってるの? なんで?
364デフォルトの名無しさん:2010/09/19(日) 21:19:55
>>363
いまは cygwin も主要ライブラリはパッケージですよおじいちゃん
コンパイラ入れないこともできます
365デフォルトの名無しさん:2010/09/19(日) 21:21:49
あー忘れてた

>>362
cygwin では devel
libxml2-devel と libxslt-devel がいるね
366デフォルトの名無しさん:2010/09/19(日) 21:50:31
centos5でruby/gemを使っています。
require "rubygemes"
require "twitter"

しただけで、

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': /usr/lib/ruby/1.8/rexml/element.rb:445: Invalid char `\277' in expression (SyntaxError)
/usr/lib/ruby/1.8/rexml/element.rb:445: syntax error, unexpected '=', expecting kEND
?% doc =hvocumend?new "<z.some t?xt <b...
(以下Invalid charが延々と続く)

のように死ぬので、エラーメッセージを参考に /usr/lib/ruby/1.8/rexml/element.rb を見たところ、445行目以降が文字化けを起こしていました。
マルチバイトなんて使ってるわけがないのですが、ファイルとエディタのエンコーディングを間違えているときのように化けています。
これはgemから再インストールしたほうがいいでしょうか?
367359:2010/09/20(月) 00:17:16
>>360-365
おかげで解決しました、ありがとうございます。
368デフォルトの名無しさん:2010/09/20(月) 08:22:41
>>366
rubygemesだからじゃないっすかね
369デフォルトの名無しさん:2010/09/20(月) 14:17:34
      ,―ヽ____、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/   「言語設計者たちが考えること」にMatzのインタビュー載るからな。おまえら、読めよ。
      i、   \___/  _/
       \       ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||
370デフォルトの名無しさん:2010/09/20(月) 20:18:16
rubyのfor文は以下のようにinを伴う構文しかないのでしょうか?

for element in array
puts element
end

Javaみたいに
for (int i = 1; i < 10; i++) {


のような書き方をしたい場合は、forではなくtimesメソッドを使わなければ出来ないのでしょうか。
371デフォルトの名無しさん:2010/09/20(月) 20:21:52
(1..10).each
372デフォルトの名無しさん:2010/09/20(月) 20:22:01
1.upto(9) do |i|
p i
end
373デフォルトの名無しさん:2010/09/20(月) 20:35:55
for文は使わないのがあたりまえ。
374デフォルトの名無しさん:2010/09/20(月) 20:37:59
for i in 1..10 (終端を含む)
for i in 1...10 (終端を含まない)

375デフォルトの名無しさん:2010/09/20(月) 20:39:10
↑何も特別な記法ではなく、単にinのあとにRangeオブジェクトリテラルを
置いただけだからな。ねんのため。

376デフォルトの名無しさん:2010/09/20(月) 20:44:07
開区間と左閉右開区間の区別をドットの数で決めるのは単なる悪習で、使用しないほうがよい
イテレーションなら Integer#upto なり Integer#step なり存在するわけで、そっち使うべき
ちなみに Range オブジェクトのデフォは閉区間 ..
377デフォルトの名無しさん:2010/09/20(月) 21:07:14
それは同意せざるを得ない
378デフォルトの名無しさん:2010/09/20(月) 21:14:23
他言語はfor文だけですっきりしてるのにアホみたいな仕様だな
379デフォルトの名無しさん:2010/09/20(月) 21:20:06
>>378
他言語に for や while があるのと全く同じ
380デフォルトの名無しさん:2010/09/20(月) 21:25:28
そもそも Ruby では for は使わないからなあ…
while に至っては while line = gets do みたいなイディオムしか頭に入ってない
381デフォルトの名無しさん:2010/09/20(月) 21:29:19
Rubyのfor文なんてのはな、熟達者であるほど使い方を「思い出す」
必要があるんだ。それくらい使わないモノ。
なのに予約語を2つも占有しやがって…
382デフォルトの名無しさん:2010/09/20(月) 21:32:48
each とか map みたいなEnumerableメソッドがあれば、それで十分なんだよな。
自分も while や for は、最近、ほとんど使った記憶が無い。(erb内を除く)
383デフォルトの名無しさん:2010/09/20(月) 21:32:54
どうせ
 for (int i = 1; i < 10; i++) {
だって「変数 i を1から10の直前まで1ずつ増やして」って読み下すんだし、
じゃあそのまんま
 1.upto(9) do |i|
とか
 1.step(9, 1) do |i|
と書いてもいいじゃん? みたいな感じ
384デフォルトの名無しさん:2010/09/20(月) 21:40:15
文が数字リテラルから始まるのは
生理的に受け付けないな俺は。
コンピュータ文化では非常に異端な仕様。
言語=文化の一端だから、自然であることも大事。
385デフォルトの名無しさん:2010/09/20(月) 21:50:13
まあ from とか times とかいう関数的メソッドがあってもいいとは常々思ってる

from(1).upto(9) do |i|
times(9) do |i|

でもそれなら

Range(1, 9).each do |i|

とかでいいんじゃねとも思う
386デフォルトの名無しさん:2010/09/20(月) 21:50:58
文とかいっちゃってて大丈夫か
コンピュータ文化では基本だろオブジェクト指向
387デフォルトの名無しさん:2010/09/20(月) 21:51:03
日本語ベーシックなら「1から9」って書けるから1.upto(9)もそんなに不自然とは思わない。
388デフォルトの名無しさん:2010/09/20(月) 21:53:48
times(9) は repeat(9) で実装してる人がいるな

>>386
Expression と Statement の区分とオブジェクト指向は何の関連性もない
389デフォルトの名無しさん:2010/09/20(月) 22:01:51
Rangeリテラルは
1..9.eachだと 9.each がひとかたまりに見なされてしまうので
(1..9).each と括弧をつけなければいけないのが惜しいところだ。
390デフォルトの名無しさん:2010/09/20(月) 22:09:22
for文は確かに見ないけどwhile文はライブラリのソースの中でも結構見るぞ
391デフォルトの名無しさん:2010/09/20(月) 22:21:50
横槍ですが…

1.upto(10) {|n| puts n}
これは正しく動くけど

1.upto 10 {|n| puts n}
これはエラーになりますよね。

このケースはどうして引数のカッコ省けないんですかね?

ちなみに
1.upto 10 do |n| puts n end
これはエラーにならない。
392デフォルトの名無しさん:2010/09/20(月) 22:26:00
うーん…
ttp://www.google.co.jp/codesearch?hl=ja&sa=N&as_case=y&q=while+lang:ruby

>>391
1.upto(10{|n| puts n})
と解釈されてる
整数10にブロックは渡せない

{...} と do...end は {...} のほうが結合強度が強いから、
do...end では平気でも {...} ではくっついて解釈されることがある
393デフォルトの名無しさん:2010/09/20(月) 22:33:48
ブロック記述の結合強度が問題になることは普通ない
カッコ省略しまくって空白区切りでメソッド引数を利用するような場合に引っかかる

blockmethod arg1, arg2 {|e| block} と書くのはぶっちゃけキモい
そもそもカッコなくしたらメソッドチェーンのドットが浮いてしまうじゃないか
394391:2010/09/20(月) 22:54:59
>>392
>>393

ありがとうございます。
なるほど…結合強度の違いでしたか。

{...}ブロックやメソッドチェーンで繋ぐ場合はメソッド引数にカッコ付ける
習慣付けておけばとりあえず回避できそうですね。
395デフォルトの名無しさん:2010/09/20(月) 23:11:59
いや通常のメソッドは基本括弧つけろよ
関数的メソッドくらいだぞ括弧つけないこと検討するの
396391:2010/09/20(月) 23:25:56
>>395
Railsのソースを見るとカッコ省略がデフォなんですよね。
これは特殊なケースなのかな。
でも確かにカッコなるべくつけるようにした方が安全ですね。
397デフォルトの名無しさん:2010/09/20(月) 23:28:55
RailsはRubyではない
絶対にソースを見てはいけない
398デフォルトの名無しさん:2010/09/20(月) 23:29:13
>>384
言語によっては、条件分岐すら
あたかもtrue/falseのメソッドであるかのように書くんだぜ
399デフォルトの名無しさん:2010/09/20(月) 23:47:08
お前ら大好きテスト駆動開発のスレできてたのでよかったら見てあげてください

【TDD】テスト駆動開発【TestFirst】
http://hibari.2ch.net/test/read.cgi/tech/1284899172/
400デフォルトの名無しさん:2010/09/20(月) 23:48:50
before rails・・・forを使う
after rails・・・forを使わない

と思って手元のRailsによるアジャイル開発本みたら、forつかってるし
401デフォルトの名無しさん:2010/09/20(月) 23:50:51
>>384
爆釣ですね
402デフォルトの名無しさん:2010/09/20(月) 23:53:33
>>398
Smalltalk系の言語か?
io言語もifすらメソッドだった気がするわ。さすがに組み込みだが
403デフォルトの名無しさん:2010/09/21(火) 00:00:56
>>400
before/after関係なくforは使わない。
Railsのscaffoldはもと初期はforを使っていたが、最近はeachになっている。
404デフォルトの名無しさん:2010/09/21(火) 00:10:00
Railsのソース読めにゃい
405デフォルトの名無しさん:2010/09/21(火) 00:59:03
分かってしまえばシンプル
分かる人に解説してもらいながら読むとすごくよく分かるよ
1日で概要掴めた
406デフォルトの名無しさん:2010/09/21(火) 10:39:31
最近rubyさわり始めたんですけど解説してるサイトとか見てると
obj#method
とかいう表記で#使って表現してるのはなんかの理由とか由来とかあったりそれともruby業界の慣習とかだったりするんですか?
最初そういう構文があるのかと勘違いしました
407デフォルトの名無しさん:2010/09/21(火) 10:43:27
慣習

これだけ、見たまま実行できない
紛らわしい欠陥表記なんだが、うまい代案もないのでずるずるこれが使われてる
408デフォルトの名無しさん:2010/09/21(火) 10:58:01
慣習ですか
これですっきりしましたありがとうございます
409デフォルトの名無しさん:2010/09/21(火) 11:08:12
インスタンスメソッドとクラスメソッドの違いで表記を分けてるとかの話じゃなくて?
410デフォルトの名無しさん:2010/09/21(火) 11:18:37
だからそれを「実行できない形式」でわざわざ記述してるのなんで、という話だろ
411デフォルトの名無しさん:2010/09/21(火) 11:33:55
a_<ClassName>.<InstanceMethodName> でよかったのに
412デフォルトの名無しさん:2010/09/21(火) 11:40:19
>>406-409
インスタンスメソッドの表記だよね

他の言語だというどういう表記してるんだろう
413デフォルトの名無しさん:2010/09/21(火) 11:41:20
obj::method
414デフォルトの名無しさん:2010/09/21(火) 11:46:08
>>406
多分Class#methodのことかな?obj.methodは普通に書くよ

違いは#が「そのクラスから生成されたインスタンスが持つメソッド」
ドットは「そのオブジェクト自体が持つメソッド」

ちなみに元ネタは別の言語らしい、Ruby的には慣習という認識でおk
415デフォルトの名無しさん:2010/09/21(火) 11:53:45
String#downcase と str.downcase はインスタンスメソッドの説明として書く
str#downcase とは書かない
String.downcase はクラスメソッドで別物
str::downcase と書く奴は C++ に帰れ
416デフォルトの名無しさん:2010/09/21(火) 11:59:29
Ruby でも :: 使うよね
417デフォルトの名無しさん:2010/09/21(火) 12:01:59
Rubyで::を使うのはクラスやモジュールに直接所属する「定数」を書くときだね
ちなみにクラスやモジュールもRubyでは多くの場合定数なので
クラス内部のクラスを表す時にも使うことが多い
418デフォルトの名無しさん:2010/09/21(火) 13:39:47
初心者スレぽい

>>417
メソッドを呼ぶこともできる
irb> p "ABC"::downcase
"abc"
irb> p URI::parse("http://www.example.com/")
#<URI::HTTP:0xb766f168 URL:http://www.example.com/>

>>415の「C++に帰れ」はこういうことだろう
Ruby 0.x のころのユーザー呼び込み機能で、現在は誰も必要としてないし
普通の人もすごい人もまったく使ってない
1.9で無くなると思ってたんだが案の定残った
419デフォルトの名無しさん:2010/09/21(火) 19:02:21
>>414
Java ですかね。
420デフォルトの名無しさん:2010/09/21(火) 19:14:23
>>419
HAHAHA
421デフォルトの名無しさん:2010/09/21(火) 20:53:28
when ... case ... end で変数スコープがどうなってたか毎回覚えられないんだけどいい方法ある?
422デフォルトの名無しさん:2010/09/21(火) 20:54:50
あああ逆だった

str = case
    when A then a
    when B then b
    end

と書くのと

case
when A then str = a
when B then str = b
end

と書くのとどうだったかなーとか毎回悩む
423デフォルトの名無しさん:2010/09/21(火) 21:14:55
それは変数スコープの仕様とは無関係な気がするけどな

というか、上の書き方で統一すれば悩みは解消すると思うんだけど、
そういう問題じゃあないのか
424デフォルトの名無しさん:2010/09/21(火) 21:21:52
case 〜 end の中のローカル変数が case 〜 end の外でも参照できるかどうかは必ずしも明快自明ではない

いやまあ参照できるんだけど
if 〜 end と一緒
425デフォルトの名無しさん:2010/09/21(火) 21:23:14
似てるけど違う参照できないパターンがあるのが紛らわしいんだよね
いっそブロックの形してるものは一切スコープ作らない、みたいなのならよかったのに
426デフォルトの名無しさん:2010/09/21(火) 21:45:57
そこらへんなおしたいってmatz言ってなかったっけ
427デフォルトの名無しさん:2010/09/21(火) 21:48:41
まあ言うのは無料ですみたいな感じではある
428デフォルトの名無しさん:2010/09/21(火) 21:53:50
ブロックが(1.8だと)とまどうことがある。
他にスコープに影響するのはmodule(class)とdefだけかな。

Cのifとかforのは、複文の {...}がスコープを導入するからであって、
ifやfor自体がスコープを作るわけではない。
429デフォルトの名無しさん:2010/09/21(火) 23:39:49
しつもん
自分と同一ディレクトリ内にある uri.rb を require したいです
どう書くのが妥当で確実動作ですか?
require 'uri' だと標準ライブラリの uri を読んでしまいますよね
430デフォルトの名無しさん:2010/09/21(火) 23:42:27
# 汎用
require File.join(File.dirname(__FILE__), 'uri')

# ruby 1.9 限定
require_relative 'uri'
431デフォルトの名無しさん:2010/09/21(火) 23:49:42
これならまず誤爆しないし見た目から意図もそこそこわかりやすい
require "#{File.dirname(__FILE__)}/uri"
$LOAD_PATH を自力でいじるのは提供ライブラリ内ではやったらイカン
というか問題増えるだけだな

余談だけどRubyが読み書きするファイルのディレクトリ区切りは / 決め打ちできちんと動作する
File.join は作ったファイルパスをOS依存で外部に書き出したいときとかに使えば充分
432デフォルトの名無しさん:2010/09/21(火) 23:50:07
require './uri'
433デフォルトの名無しさん:2010/09/22(水) 00:01:03
>>432
それ不思議動作だからあんまし使いたくない
リクツ上は $LOAD_PATH + './uri' に該当するファイルがあれば読み込めるはずだろ
RUBYDIR/lib/ruby/1.8/./uri.rb を読まない保証ってなんじゃらほ

誰か安心できる解説とかしてくれないもんかな
あと __FILE__ がどんな起動のされ方どんな読み込み方されても絶対パスを返すかどうかとか
434デフォルトの名無しさん:2010/09/22(水) 00:43:34
> pwd
/private/tmp
> cat foo.rb
puts __FILE__
> cat bar.rb
$:.unshift('.')
require 'foo'
> /usr/bin/ruby -v bar.rb
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
./foo.rb
> /opt/local/bin/ruby -v bar.rb
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10]
/private/tmp/foo.rb

rubyspecのこれかな。
ruby_version_is ""..."1.8.8" do
it "equals the relative path of a file loaded by a relative path" do...

... なので 1.8.8 (まだ出てないけど) 以降には該当しない。
435デフォルトの名無しさん:2010/09/22(水) 05:56:17
>>433
> RUBYDIR/lib/ruby/1.8/./uri.rb を読まない保証ってなんじゃらほ
ドットで開始されている場合$LOAD_PATHを無視してカレントディレクトリから探す、とかやってくれてるんじゃないと駄目だよね
436デフォルトの名無しさん:2010/09/22(水) 09:04:34
>>431
>File.join は作ったファイルパスをOS依存で外部に書き出したいとき
すっごい昔はそういうような動作を目指してた気もする
現在は File::SEPARATOR は mswin32 でも常に "/" で、
Ruby の(標準の)クラス経由で呼び出してる限りは、
ファイル名だろうがパス名だろうがドライブだろうが全部区切りは /
外部プログラム等から読み込んだOS依存記述のファイルパスは、
File::ALT_SEPARATOR で split して join しろという話だったはず

irb> puts Dir.pwd
C:/Documents and Settings/俺/デスクトップ
irb> p File.join(`echo %WINDIR%`.chomp.split(File::ALT_SEPARATOR))
"C:/WINNT"
irb> Dir.chdir _
irb> puts Dir.pwd
C:/WINNT

ちなみに Linux とかで OS 標準パス区切り文字が / な場合、File::ALT_SEPARATOR は nil を返す
437デフォルトの名無しさん:2010/09/22(水) 09:11:23
あ、実際は Dir.chdir 自体 "C:\WINNT" という文字列を解釈できるんでこの処理は意味がないよ
438デフォルトの名無しさん:2010/09/22(水) 14:29:34
で結局 __FILE__ には File.expand_path は要るの? 必須なの?
439デフォルトの名無しさん:2010/09/22(水) 15:29:38
>>435
カレントディレクトリが一番最初だろ常考
440デフォルトの名無しさん:2010/09/22(水) 15:57:37
>>439
ruby -e "p $:"
441デフォルトの名無しさん:2010/09/22(水) 19:43:10
WindowsのUNICODEファイル名はDirクラスだと"?"に化けますが
Win32APIを使えば取得できますか?
UNICODEファイル名にアクセスできるライブラリはありませんか?
442デフォルトの名無しさん:2010/09/22(水) 19:53:02
ディレクトリ走査とファイル読み込みとファイル書き込みのすべてをWin32APIで完結させれば可能
Rubyの既存のクラスやメソッドと混ぜることはできない

作ってる人はいてもいいんだけど、あまり聞かない
443デフォルトの名無しさん:2010/09/22(水) 20:07:49
そうなんですよね。どうにかファイル名が取れてもFileじゃopenできない。
444デフォルトの名無しさん:2010/09/22(水) 20:49:58
えー
445デフォルトの名無しさん:2010/09/22(水) 21:36:16
pメソッドについての質問なんですが,以下の環境だと文字化け?が
起こります.


ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]
OS:Ubuntu 10.04 LTS

***$irb -Ku
irb(main):001:0> p "文字列"
"文字\345\210\227"
=> nil

調べると,String#inspectのバグみたいですが,対処する方法はないでしょうか?

また

["abc", "def"]

という配列を

["abcxyz", "defxyz"]

としたい場合に

ary = ["abc", "def"]

ary.each do |str|
str += "xyz"
end

で実現できないのは何故ですか?
446デフォルトの名無しさん:2010/09/22(水) 21:51:17
> ary.each do |str|
> str += "xyz"
> end
>
> で実現できないのは何故ですか?

str += "xyz" は str = str + "xyz" の意味で、
+ メソッドは、文字列を連結した新しい文字列を作って返すメソッドだから。

破壊的に連結する String#concat を使って
ary.each do |str|
str.concat "xyz"
end
とする。

それかmapを使って新しい配列で新しい結果を得るようにする。
ary2 = ary.map do |str|
str + "xyz"
end
447デフォルトの名無しさん:2010/09/22(水) 21:54:25
>>445
前半

p250で直ってるのでバージョンアップするが吉。
自分でコンパイルしたくないならディストリに圧力をかける。


後半
代入前の str は配列の要素を指しているが、
str += "xyz" は str = str + "xyz" の略記なので、
代入前の要素と"xyz"を連結した *新たな* Stringインスタンスを
指している。配列の中身はノータッチ。

ary.each_with_index {|x,i| a[i] = x + "xyz" }
よりRubyらしくは、
ary = ary.map {|x| x + "xyz" }
または
ary.map! {|x| x + "xyz"}
などとする。
448デフォルトの名無しさん:2010/09/22(水) 21:55:38
>>445
inspectのはRubyのバージョンアップで対応
悪いこと言わないからバージョンアップしとけ

後者は String の + メソッドの動作が
「自分と引数をくっつけて新規の文字列にして返す」だからだ
これが「自分の後ろに引数をくっつける」だったら望みの動作になっただろう
449デフォルトの名無しさん:2010/09/22(水) 21:59:51
>>445
> a = [0]
=> [0]
> a.each{|e| e = 100}
=> [0]
> a
=> [0]

代入した時点であたらしい e が作られてる
その e は配列の要素を指していない
450デフォルトの名無しさん:2010/09/22(水) 22:38:15
>>445
10/10まで待てばもしかしたら10.04でもrubyのverがあがるかも
自分はapt-get source rubyで取得したソースでbug修正してdeb作って入れたよ
451445:2010/09/22(水) 22:54:27
>>446, >>447, >>448, >>449, >>450
ありがとうございます.

前半の方は頑張ってコンパイルしてみます.

後半の方なのですが,String#+メソッドが,新しいインスタンスを
生成することは分かりました.
また,>>449さんによるとObject#=メソッドも新しいインスタンスを
生成するということですが,その場合,それより前に生成された
同名のインスタンスはどうなるのですか?
452デフォルトの名無しさん:2010/09/23(木) 01:04:11
インスタンス(オブジェクト)に名前はない。

代入は、変数(名前)とインスタンスの結びつきを変える操作。
(複数の結びつきを持つことも可能)

変数が以前に結びついていたインスタンスは、代入によって
結びつきを失う。
あらゆる結びつきを失ったインスタンスもメモリー上には存在
するが、そのメモリー領域はいずれGCによって再利用可能な
状態になる。

100(Fixnum)は少し扱いが特殊だけど、認識としては上のような感じ。
453445:2010/09/23(木) 08:55:10
>>452
丁寧な解説ありがとうございます.
私自身,少し勘違いして質問していました.
インスタンスに名前を付けるのに変数が必要なんですね.
454デフォルトの名無しさん:2010/09/23(木) 09:06:07
変数は「オブジェクト置き場に置かれたオブジェクトに貼られたラベル」説が根強い
ラベルなのでひとつのオブジェクトにラベルは何枚も貼れる
ラベルの貼られてないオブジェクトはガベージコレクタさんが定期的に巡回してがーっと捨てる
455デフォルトの名無しさん:2010/09/23(木) 09:47:35
> Object#=メソッド

そんなものはない
456デフォルトの名無しさん:2010/09/23(木) 12:24:36
>>451
= には大きく別けて2つの使い方があって
1つは「代入」もう1つは「特殊なメソッド呼び出し」なんだ。
違いはドットの有無。

x = hoge #代入

obj.hoge = #特殊なメソッド呼び出し
obj.[x] = #特殊なメソッド呼び出し

代入は、変数の参照先を設定する、もしくは変える操作。
メソッド呼び出しはメソッド呼び出し。ドットの前の変数が参照する先は変わらない。
457445:2010/09/23(木) 13:06:39
>>454, >>455, >>456
ありがとうございます.Object#=メソッドなんてないんですね.

少し混乱してしまったのですが,つまり

ary = ["abc", "def"]

ary.each do |str|
str = str + "xyz"
end

とした場合には,ブロックの中の str + "xyz" の部分で新しい
インスタンスが生成されて,それが左辺の str に代入されるんですよね?
ということは,ブロックの中の str はC言語で言う仮引数に相当して,ary[0],
ary[1]自体を参照していないということですか?
458デフォルトの名無しさん:2010/09/23(木) 13:14:25
> それが左辺の str に代入されるんですよね?

> 変数は「オブジェクト置き場に置かれたオブジェクトに貼られたラベル」
変数という「箱」は存在しない
459デフォルトの名無しさん:2010/09/23(木) 14:07:21
>>457
そう
配列から既に取り出してしまったものについて代入しても
配列の中身は書き換え出来ないってこと
460445:2010/09/23(木) 14:15:44
>>458, >>459
ありがとうございました.
少しずつ分かってきたような気がします.
461デフォルトの名無しさん:2010/09/23(木) 15:53:30
>>441
RubyはWindowsのUNICODEファイル名に対応してない。
JRubyやIronRubyならいけるかもしれない

誰か直してくれってみんな思ってる
462デフォルトの名無しさん:2010/09/23(木) 18:02:04
小さな処理をそれぞれファイルに記述しておき、
指定したファイル(複数)の処理を実行したい。

とりあえず、下記のような処理を書いてみました。
一応動くけど、シンボル(関数)をひたすら上書きというのが不満です。

こういった処理のナイスな実装例とか、ヒントを教えてくれませんか?

$ cat main.rb

#!/usr/bin/ruby

ARGV.each do |filename|

 load filename, true

 suba("hoge")

 subb("fuga")

end



463デフォルトの名無しさん:2010/09/23(木) 18:03:02
(続き)
$ cat a.rb
def suba(str)
 puts "a.subA:" + str
end
def subb(str)
 puts "a.subB:" + str

end



$ cat a.rb

def suba(str)

 puts "b.subA:" + str

end
//subb() 記述し忘れ

$ main.rb a.rb b.rb
a.subA:hoge
a.subB:fuga
b.subA:hoge
a.subB:fuga //エラーになってくれたほうがうれしい
464462:2010/09/23(木) 18:04:05
変な改行が入ってしまい申し訳ない。
465デフォルトの名無しさん:2010/09/23(木) 18:20:31
よくわからんがクラス作れクラス
466デフォルトの名無しさん:2010/09/23(木) 18:51:54
何をしたいのかよく分からんが、Rakeじゃダメなのか?
467デフォルトの名無しさん:2010/09/23(木) 19:32:06
Thorが近いかもしれない。
468デフォルトの名無しさん:2010/09/23(木) 19:50:49
ぬおおおおおおおお
クラスメソッドの正体は特異クラスのインスタンスメソッドだったのか
今までのモヤモヤが晴れて全ての謎が解けた感じだ

クラスメソッドなんて呼称は廃止した方がいいんじゃないですかね?
自分のようなJava出身者はみんな悩みそうだ
469デフォルトの名無しさん:2010/09/23(木) 20:03:20
よくわからんけど、Javaだってインスタンス化しなくても
メソッドの呼び出しはできるよね。何を悩んでたんだ?
470デフォルトの名無しさん:2010/09/23(木) 20:18:51
>>469
逆だろ
Javaのクラスメソッドはインスタンスからも呼べるけど
Rubyのクラスメソッドでそれが出来ないのが悩みだったんじゃね?
471デフォルトの名無しさん:2010/09/23(木) 20:22:10
えっ?
472デフォルトの名無しさん:2010/09/23(木) 20:25:12
インスタンスに属してるからインスタンスメソッド
クラスオブジェクトに属してるインスタンスメソッドを特にクラスメソッドと呼ぶ

という見掛けになるので、一応呼び名としての対応は取れてなくもない
どちかってとクラスメソッド内から同クラス内の別のクラスメソッドを呼ぶときどう書けばいいか迷うと思う
473デフォルトの名無しさん:2010/09/23(木) 20:35:06
>>468
いや
クラスメソッドしかありえないんだが
Javaがあほすぎなんだろう
474デフォルトの名無しさん:2010/09/23(木) 20:35:15
クラスメソッドに関しては

class C
class << self
def classdisplay; puts classstr; end
def classstr; "class!"end
end
end

という書き方がもうちょい流行ってもよい

irb> C.classdisplay
class!
475デフォルトの名無しさん:2010/09/23(木) 20:41:37
static メソッドのオブジェクト指向的気持ち悪さを実用的に解消した素晴らしいモデルだと思うが

これが駄目な場合「インスタンスに関係しないメソッドの存在禁止」と言うしかなくなるぞ
それは美しい世界かもしれないが実用上辛い
476デフォルトの名無しさん:2010/09/23(木) 20:47:08
>>474
入れ子になったクラス定義かな。あと入れ子になったメソッド定義というのもあるね。

個人的には、Pascalの入れ子だらけになった、非常に読みづらいプログラムを憶い出す。
そんな入れ子でしか記述できない手続き型言語の可読性の悪さを解決するために、
抽象化データやオブジェクト指向が考案されたというのに、退化した時代錯誤な考え方に見える。

名前空間が欲しいのなら、モジュールを使えばいい。

module M
  def M.classdisplay; puts M.classstr; end
  def M.classstr; "class!"; end
end
477デフォルトの名無しさん:2010/09/23(木) 20:49:04
モジュールをインクルードした時に裏で変なクラス作られてるのが最強に気持ち悪い。
478デフォルトの名無しさん:2010/09/23(木) 20:51:46
>>476
class << self ... end の中でのselfは、最初に書いたself(ここではC)の
特異クラスになる。
そしてクラスの中で普通にdefでメソッド定義するとそのクラスのインス
タンスメソッドの定義になることを思い出せば、

クラスメソッド == 特異クラスのインスタンスメソッド

と理解できる、という話じゃないかな。

479デフォルトの名無しさん:2010/09/23(木) 21:04:58
>>476
> 入れ子になったクラス定義かな
違う、class << obj; end で obj にインスタンスメソッドを定義する

o = Object.new
class << o
def foo; puts "foo!"; end
end
# irb> o.foo
# foo!

クラス定義内で obj を self と指定した場合、self にインスタンスメソッドを定義する
つまり、クラスメソッド定義だ
これがいいのは

class C
class << self
attr_accessor :classvar
end
end
C.classvar = 123
とか
class C
class << self
def disp; str; end
private
def str; "str"; end
end
end
C.disp #=> str
C.str #=> NoMethodError: private method `str' called for C:Class
とかがインスタンスメソッドの文法一発で書けるとこ
480デフォルトの名無しさん:2010/09/23(木) 22:11:37
Ruby1.8とRuby1.9の共通のスクリプト作ろうとしてるんだけど、
@str = {Ruby1.9ならエンコーディング情報つける}
というのはどう書けばいいですか
RUBY_VERSION 使って分岐してもいいですか
481デフォルトの名無しさん:2010/09/23(木) 22:33:48
エンコーディング関連に関しては respond_to? は無力なので RUBY_VERSION で分岐してもよい
必要なのはメソッドの存在ではなく、それに付随して呼ばれる長大なライブラリ群だから
メソッドいっこ作ったから回避できるとか言うレベルの問題じゃないことを示す必要がある

たとえばさ
obj.respond_to?(:read) って書いてあったら、
「あーreadで文字列返せるオブジェクトなら動作するのかな」とか思うだろ
でも respond_to?(:force_encoding) とか respond_to?(:encode) とか書いてあっても
「あーここは force_encoding できるオブジェクトならなんでもいいのかな」とは思えないだろ実際
482デフォルトの名無しさん:2010/09/23(木) 22:41:21
>>478
それは分かっているんだ。

>>479
可変(mutable)なクラス変数が必要になるの状況はかなり限定されるよね。
プライベートなクラスメソッドが実現できるようになることは明確な利点だけど、
それも上の理由で、用途は一層限定される。

逆に、この記法に慣れて(流行して)一般的なクラスメソッド定義でも使われるようになると、
インスタンスメソッド定義と一目で区別がつかなくなって、かえって可読性が低下するのでは。
特異クラス/特異メソッドの存在を否定する気は毛頭無いけど、それらは本当にそれが
必要な場合に限って使うべきものなんじゃないかと思う。

同様に、近頃はRailsの影響でメタプログラミング(リフレクション)が「流行」しているけど、
それも本来は流行すべきものじゃない気がする。安易な導入は保守性を著しく悪化させるから。
たぶん、数年後には特異クラスやメタプログラミングの多用はバッドノウハウ扱いされるようになると思う。

以上、過去にPascalの入れ子構造とLispのリフレクションに悩んだ、
頭の固いオッサンからの余計なおせっかいですた。
483デフォルトの名無しさん:2010/09/24(金) 02:39:21
>>482 じゃないが、
Javaみたいな言語と違って、クラスの定義も上から順にスクリプトが走った結果、
クラスが定義され、メソッドが定義され、クラスメソッドが定義されていくよね?
(そういうのはなんというのかはしらん。動的言語ということなのか?)

何が混乱するかというと、言語作者やライブラリ作者の想定通りなんだろうけど、
スコープによってというのかわからんのだが、スクリプトの位置やブロックによってselfが変わりまくるのがなかなか慣れない。
今ここで、selfが何であるかを理解しながらコード書いていくのがけっこうしんどいぞ?

classだけならまだいいけど、
includeされるmodule(A)を書いたり、extendされるmodule(A::ClassMethods)を書いたり、
extendされるmodule内に拡張するためのメソッド(A::ClassMethods#unko、extendされたあとはクラスメソッドになる)を書いたり、
unkoメソッドを読んだときにのみメソッドを追加したいがためのモジュールをネストしたincludeされるmodule(A::ClassMethods::InstanceMethods)を書いて、
同様にunkoメソッドを読んだときにのみクラスメソッドを追加(略) されるmodule(A::ClassMethods::InstanceMethods::ClassMethods)を書いたり
してると今これselfなに?という感じになってくる


何を言っているかわからなくなってきたが、
何かというとRailsのプラグインやライブラリとかの書き方の話ね

あの定型みたいな処理こそメタプログラミングかもしくはシンタックスシュガーみたいなもので
なんとかわかりやすくならないのか
484デフォルトの名無しさん:2010/09/24(金) 02:43:13
あ、書いてて、moduleのネストの複雑さとselfの話はまた別か

Rubyを使った言語内DSLの設定ファイルなどでも、ブロックによってselfが変わりまくるからな
文法はRubyに近く、一見ライブラリを(ブロックとカッコなしメソッドにより)簡単な文法で利用しているように見えて、
selfがブロックごとに変化しまくる。 >>134 みたいなのがまるで想定しない動作になったりw
485デフォルトの名無しさん:2010/09/24(金) 05:58:16
selfの理解が足りないのを言語のせいにしている人がいると聞いて
486デフォルトの名無しさん:2010/09/24(金) 06:53:24
>>483
>今これselfなに?という感じになってくる
ちょー同意
selfがどこでどう切り替わるか知らないと、rubyのコードは読めないよね。
487デフォルトの名無しさん:2010/09/24(金) 08:49:00
そんな大層なもんでもないだろ…
その都度irbで調べてればだいたい分かってくるし。
488デフォルトの名無しさん:2010/09/24(金) 09:10:02
いちおう釘をさしておくが、「RailsはRubyではない」のでそこんとこよろしく
DSL魔術で奔放に構築されているRails関連のソース読んでRubyに文句言う人が絶えないのは何故だ
489デフォルトの名無しさん:2010/09/24(金) 11:03:16
「RailsはRubyではない」って言うほうが無理があるだろ。
RailsはRubyの代表作で、RailsのおかげでRubyが普及したんだろ。
490デフォルトの名無しさん:2010/09/24(金) 11:47:21
ここってすぐ質問者そっちのけの雑談に突入するよね
491デフォルトの名無しさん:2010/09/24(金) 12:02:33
>>490
別に質問スレじゃないからな
わからんのならわからんと続ければ答える気のある奴が続けて返事したりしなかったりするだろう
492デフォルトの名無しさん:2010/09/24(金) 12:16:12
というか、今、困っている質問者って誰?
>>462は何人かが意味分からんというレスを返してるけど
本人から何も返答がないからどうしようもないし、
その後の>>469はつぶやきで>>474は提案にしか見えないんだけど。
493デフォルトの名無しさん:2010/09/24(金) 12:34:22
>>486
個人的にはJavaScriptのthisよりはマシだと思ってる…
494デフォルトの名無しさん:2010/09/24(金) 19:22:48
thisは全然わからん
495デフォルトの名無しさん:2010/09/24(金) 22:59:11
>>489
ある言語でクラスとメソッドとライブラリを作ったとして、
そのクラスとメソッドとライブラリの使い勝手が悪かったら言語のせいになるのか
496デフォルトの名無しさん:2010/09/24(金) 23:08:17
Delphiアプリケーションが馬鹿にされていたのと似ている気がする
いやそうでもないか
いやそうでもないな
497デフォルトの名無しさん:2010/09/24(金) 23:20:03
>>495
そうです
498デフォルトの名無しさん:2010/09/24(金) 23:22:36
>>496
Delphi馬鹿にするなお
当時のVB4とかと比べてもいい動きしてたお
499デフォルトの名無しさん:2010/09/24(金) 23:34:51
Delphi製のソフトはどれもこれも無駄に使わない画像リソース埋め込んで
ファイルサイズがデカくてうざかったお
某単機能ツール群を入れただけでUSBメモリがパンパンだお
500デフォルトの名無しさん:2010/09/25(土) 01:13:00
今の最新のDelphiは新規作成したフォームありのアプリでもexeのサイズが1MB超えた気がする

>>496-498
最初のころのバージョンのDelphiは要インストールのランタイムなくても動く、
例外が起きても落ちないのは当時VBと比べれば画期的だったぜw
501デフォルトの名無しさん:2010/09/25(土) 15:47:11
tes
502デフォルトの名無しさん:2010/09/25(土) 16:02:12
全般的に初心者ですが、質問よろしくお願いします。

環境
CentOS5
ruby1.8.7-p302
gem1.3.6

下記エラーが出力され解決できず困っています。
/usr/local/lib/ruby/gems/1.8/gems/rest-client-1.4.2/lib/restclient.rb:9: no such file to load -- net/https. Try running apt-get install libopenssl-ruby (LoadError)

yumにはlibopenssl-rubyは存在しませんでした。
そこで、aptを入れようとしたのですが、GPGキーのところでつまづいてしましました。

libopenssl-rubyのインストール方法をご教授頂けないでしょうか。
503デフォルトの名無しさん:2010/09/25(土) 16:09:07
CentOS はおまえには向いていない
504デフォルトの名無しさん:2010/09/25(土) 16:30:55
>>502
CentOSスレいった方がよいと思われ・・・

CentOS Part 25【RHEL Clone】
http://hibari.2ch.net/test/read.cgi/linux/1283250261/
505デフォルトの名無しさん:2010/09/25(土) 16:32:15
まあLinuxの使い方はLinuxの解説なりなんなり読んでくれという話だな
506デフォルトの名無しさん:2010/09/25(土) 17:28:32
>>502
何をしようとした時に、そのメッセージが出力されたのかな?
要は、エラーの発生条件を書いて欲しい。たとえば、irbを起動して

 > require "XXXX"

と入力しただけでエラーメッセージが出力されてしまう、とか。

その操作(発生条件)を書いてくれないと、(エスパーはどこにもいないから) 誰にも返答なんてできないよ
507デフォルトの名無しさん:2010/09/25(土) 17:43:47
>>506
これはわりと有名
rest-client gem の LoadError メッセージ
ttp://github.com/adamwiggins/rest-client/raw/master/lib/restclient.rb
508502:2010/09/25(土) 18:25:09
ご返答ありがとうございます。502です。

502のエラーメッセージはherokuというホスティングサービスを使用するため
gemでherokuをインストール後、heroku createを実行した際に出力されました。

502のエラーはrubyをコンパイルして入れた際に、/ruby-1.8.7-p302/ext配下の
opensslをインストールしていなかったことが原因でした。

opensslをインストール後、今度はreadlineのエラーが出力されたので
/ext配下のreadlineをインストールしようと試みたのですが失敗してしまいました。
(ruby extconf.rbの直後にエラーになりました。左記にオプションはつけていません。)

調べたところ、yum install ncurses-develを入れるとあり、試してみましたがうまくいきませんでした。
mkmf.logを確認したところ、ヘッダがないとのエラーメッセージが出力されていますが、どこが原因がわかりません。

----mkmf.log一部抜粋
conftest.c:3: error: ‘tgetnum’ undeclared (first use in this function)
conftest.c:3: error: (Each undeclared identifier is reported only once
conftest.c:3: error: for each function it appears in.)
conftest.c:1:31: error: readline/readline.h: そのようなファイルやディレクトリはありません
conftest.c:1:31: error: editline/readline.h: そのようなファイルやディレクトリはありません

readlineのインストール方法をご教授いただけないでしょうか。
(オプション不足またはパッケージが不足と思っていますが、どうにもわかりません。)
また、/ext配下のインストールについてのマニュアルページのようなものがありましたら、教えて頂けないでしょうか。
509デフォルトの名無しさん:2010/09/25(土) 19:19:42
説明めんどいな

yum install zlib-devel openssl-devel readline-devel
したあとで Ruby をコンパイルする
コンパイル済みのディレクトリが既にあるなら ext/openssl に移動s…いや、いいや
再度 make clean して ./configure して make して make install しろ
510デフォルトの名無しさん:2010/09/25(土) 19:25:24
>>508
なぜか ruby をソースからビルドしようとしてるみたいだけど、それなら README.ja をよく読みなさい。
この文書のインストール手順のどこにも「ruby extconf.rb を実行しなさい」とは書かれていないんだけど。
rubyのビルド&インストールは、ごく一般的な configure; make; make install で済むよ。
で、その時に、configure の --prefix オプションでインストール先ディレクトリを忘れずに指定する。
特別な事は何も無いはずだよ。
511デフォルトの名無しさん:2010/09/25(土) 19:35:27
>>510
>この文書のインストール手順のどこにも「ruby extconf.rb を実行しなさい」とは書かれていないんだけど。
これは既にrubyをインストールしてある状態でのextライブラリの正当な追加インストール法です
512デフォルトの名無しさん:2010/09/25(土) 20:01:47
>>507
ひどいな、このエラーメッセージ
Linuxだったら問答無用でパッケージ管理ツールとパッケージ名まで決め打ちか。
気を回したつもりで混乱の元じゃないか。
513502:2010/09/25(土) 20:12:49
502です。

yum install readline-develを行った後、ruby extconf.rb; make&&make installでうまくいきました。
ありがとうございました。
514デフォルトの名無しさん:2010/09/25(土) 21:06:16
日記はチラウラで
515デフォルトの名無しさん:2010/09/26(日) 01:23:59
CentOSのパッケージのRubyはど古いのものなのか
516デフォルトの名無しさん:2010/09/26(日) 02:32:45
CentOS5
ruby1.8.7-p302
gem1.3.6
517デフォルトの名無しさん:2010/09/26(日) 02:33:54
CentOSのRPMのRubyは古いし、ソースから入れるのが普通。
518デフォルトの名無しさん:2010/09/26(日) 02:38:20
もはやCentOSは遣う意味が無い。
開発マシンとして使う人は元々いないだろうけどサーバーとしてもdebianやubuntuで十分だし。
会社で複数のサービス公開してるけど全てdebianだ。
開発マシンと統一することにもそれなりに価値がある。
519デフォルトの名無しさん:2010/09/26(日) 02:48:07
うちの会社の場合は、開発環境はCentOSで、本番環境はRedHatというパターンだな。
520デフォルトの名無しさん:2010/09/26(日) 05:44:36
>>515
CentOS5のRubyはRuby1.8.5です
安定版ですらない
他の基幹ライブラリもお察し
521デフォルトの名無しさん:2010/09/26(日) 07:56:51
>>520
こいつのせいでライブラリは1.8.5の面倒も見なけりゃならんのだよな
とっとと死滅してくれ
522デフォルトの名無しさん:2010/09/26(日) 14:08:42
>>520
マジデ!?うけるww

ということはRedHatも古いのを使っているのか。パッチ当ててるんだろうけど。
523デフォルトの名無しさん:2010/09/26(日) 14:11:52
今のRailsはRuby1.8.5対応してないような
はなからRailsは度外視ということかw

UbuntuならRails入れるためのドキュメントくらいあるのに
524デフォルトの名無しさん:2010/09/26(日) 16:27:29
>>523
ソースから入れ直せということ
525デフォルトの名無しさん:2010/09/26(日) 18:22:45
>>483
eval系が絡まないかぎり、ブロックの中でselfが変わることはない。
クラス定義中やトップレベルではselfなんて意識する必要すらないはず。

unkoどうのこうのってのは明らかにRubyのダークサイドに落ちてる。
そんなプログラムを書く必要が本当にあるのか確認したほうがいい。

メソッドを呼んだらクラスメソッドを追加させるとか、明らかにおかしい。
Rubyが何でもできるからって、何でもすればいいわけじゃない。

また、ブロックによってselfが変わりまくるようなダークなライブラリは
うんこだから使わなくていい。
526525:2010/09/26(日) 18:27:22
>>482を読んでなかった、スマソ。

メタプログラミングの多用はRailsが出る前から、現在まで
ずっとバッドノウハウになってると思うよ。

少なくとも俺らが普段から使うものではない。
527デフォルトの名無しさん:2010/09/26(日) 18:47:22
Railsガイドのプラグイン作成入門記事はRubyのバッドノウハウの塊としか思えない

Ruby on Rails Guides: The Basics of Creating Rails Plugins
http://guides.rubyonrails.org/plugins.html#add-an-acts_as-method-to-active-record

これ雛形だからまだましで、他のプラグインもっとひどい


> また、ブロックによってselfが変わりまくるようなダークなライブラリは
> うんこだから使わなくていい。

えー・・・DSL風に定義するライブラリ使えないじゃないか
528デフォルトの名無しさん:2010/09/26(日) 18:48:43
わるい、アンカー違った。こっちだ

Ruby on Rails Guides: The Basics of Creating Rails Plugins
http://guides.rubyonrails.org/plugins.html#add-an-instance-method
529デフォルトの名無しさん:2010/09/26(日) 18:53:51
>DSL風に定義するライブラリ使えないじゃないか
うんこなので使わなくていい
ほぼ全てが開発者の性質の悪いオナニー
DSL表記にして何かがよくなったということはまず無い
530デフォルトの名無しさん:2010/09/26(日) 20:02:44
Railsの黒魔術が悪だと言う人が多いけど
その根拠をちゃんと示せる人が全くいないのが笑える
531デフォルトの名無しさん:2010/09/26(日) 20:10:08
どうぞ笑っていてください
532デフォルトの名無しさん:2010/09/26(日) 20:16:51
分かりにくいから
533デフォルトの名無しさん:2010/09/26(日) 20:28:10
オブジェクト指向とか俺みたいなCOBOL30年戦士には分かりにくいだけなんだよ。
まったく性質の悪いオナニーだな。
534デフォルトの名無しさん:2010/09/26(日) 20:32:13
笑えよベジータ
535デフォルトの名無しさん:2010/09/26(日) 21:11:39
笑えばいいと思うよ
536デフォルトの名無しさん:2010/09/26(日) 21:36:11
↓構造化プログラミングが分かりにくい人の出番ですよ
537デフォルトの名無しさん:2010/09/26(日) 21:54:08
>>530
解り切った事をわざわざ説明する馬鹿はおらん
538デフォルトの名無しさん:2010/09/26(日) 22:47:47
質問させてください。

変数1 = クラス.new
newしたインスタンス内で別のクラスのインスタンス生成したりそれをいじったりする
変数1 = nil

これで生成したものは全部自動で開放される、で合ってますか?
539デフォルトの名無しさん:2010/09/26(日) 22:54:39
循環参照していない限りはyes
540デフォルトの名無しさん:2010/09/26(日) 22:57:20
ありがとうございました!
541デフォルトの名無しさん:2010/09/26(日) 22:58:49
Rubyってデストラクタ定義出来るんだっけ?
542デフォルトの名無しさん:2010/09/26(日) 22:59:52
「newしたインスタンス内で別のクラスのインスタンス生成したりそれをいじったりする」の中で
別の生きてるオブジェクトや変数から、そのオブジェクトが参照されるようなことをしてない限り。

あと、いつ解放されるかは保証されない(終了までそのままかもしれない)。
だから、ファイルのクローズとかは自分でやるか、ブロック付きのクローズが保証されている
メソッドを使うとかしないとダメ。
543デフォルトの名無しさん:2010/09/26(日) 23:02:22
>>538-539
代入してすぐには解放されないよ、いつかそのうち。
あと、Mark&Sweepだから循環参照とか関係ないよ。
GC.stress=trueしてるとまた話は変わる。
544デフォルトの名無しさん:2010/09/26(日) 23:28:51
>>541
ファイナライザはある

ただ、Javaでの議論とほぼ同様、
Rubyでも原則ファイナライザには頼らないほうがいいんじゃないかね
例外が握りつぶされるとか、面倒な問題がいくつもある
545デフォルトの名無しさん:2010/09/27(月) 06:01:43
ちょうでっかいオブジェクトがメモリから早めに削除されることがあってメモリの節約になるかも、程度のご利益しかない
その程度の動作しか期待したらいかん
GCされるからこの動作がこうなるはず、なんてのをRubyに期待するのはアウト
546デフォルトの名無しさん:2010/09/27(月) 06:18:39
スクリプト終了時にどーしてもやって欲しい処理がある場合は at_exit がある
ファイナライザ自体の登録はできるが、実行タイミングはGC依存で不定だ
ObjectSpace.define_finalizer(obj, proc)
>>544の言うようにproc内の例外は抑制されて掴めないし外にも出ない
547デフォルトの名無しさん:2010/09/27(月) 06:21:49
ファイナライザに頼りたくなるような処理は
ちゃんと例外処理とか、例外処理付きのブロック付きメソッドだな
548デフォルトの名無しさん:2010/09/27(月) 06:24:42
ああ表現が判りにくいな
最後の文を「を使うべきだな」に直してくれ
549デフォルトの名無しさん:2010/09/27(月) 11:41:58
領海w
550デフォルトの名無しさん:2010/09/27(月) 14:27:00
>>526
> メタプログラミングの多用はRailsが出る前から、現在まで
> ずっとバッドノウハウになってると思うよ。
>
> 少なくとも俺らが普段から使うものではない。

一昔前のgotoは機能としてあるけど使っちゃだめ、みたいな言い分だな

それなら、最初から入れるなとは言わんが(最初はそれがいいと思ったんだろうから)
使えないようにすればいいんじゃね?
何でRubyにメタプログラミングの機能が載ってるの?

メタプログラミングは必要悪なのか?
>>526 がついていけてないだけじゃないのか?


もっとメタプログラミングを簡単にした方がいいのでは?(馬鹿でも当たり前に使えるように)という話なら同意はするが
551デフォルトの名無しさん:2010/09/27(月) 14:29:34
>>550
メタプログラミングは、Lispのマクロと同じだ
使わなければならない場所以外では使ってはいけない
552デフォルトの名無しさん:2010/09/27(月) 15:17:58
継承が最後の武器なのと一緒だな
553526:2010/09/27(月) 23:15:47
>>527
変わり「まくる」と言った。別にRSpecとかRakeとかTkぐらいなら余裕。

>>530
Railsが悪なんていってない。魔術自体を使うことが危険なだけであって、
Railsみたいに魔術を使って作られた綺麗なAPIは素晴らしい。

>>550
バリバリ必要悪です。attr系とか超便利。危険だからといって、
使えないようにしたらJavaになっちゃうよ。
危険でも強力なら搭載するのがRuby。

>>551
>>552
そそ。
554デフォルトの名無しさん:2010/09/27(月) 23:48:59
>>550
Rubyはあなたが自分の足を打ち抜くのを妨げません。
555デフォルトの名無しさん:2010/09/28(火) 00:05:21
配列要素(Fixnum)に代入できるイテレータって書けませんか?
556デフォルトの名無しさん:2010/09/28(火) 00:27:17
Fixnum関係なさそうだな

あんま無いです
a という中身の入った配列と b という空の配列があったとして、
配列 a の中身を適度に選んで b に意味ある順番で移すのを一発で書く、とかいうのは
Ruby ができそうでできない微妙に不得意とするところ

実際にナニをどうしたいのかがわかると迂回策を誰かが思いつくかも
557デフォルトの名無しさん:2010/09/28(火) 00:38:45
Railsは箱さえ開けなきゃ綺麗といえなくもない
個々人でまだ箱を開けざるを得ないのががっかりで醜い

もしRails実装を覗く必要に迫られることが将来なくなったとしたら、それは
558デフォルトの名無しさん:2010/09/28(火) 01:00:21
箱を開けるって具体的にはどんなことだよ
559デフォルトの名無しさん:2010/09/28(火) 01:19:10
Railsは真空管アンプの真空管だけ色々差し替えて楽しむ物
決して箱の中の配線を見てはいけない
560555:2010/09/28(火) 01:20:33
ぞろ目Get
やりたいことは、2次元配列の指定位置に隣接する要素のインクリメント等ですが
561デフォルトの名無しさん:2010/09/28(火) 02:50:13
railsのソース読むな?本気で言ってんの?
こんなに素晴らしい教材はなかなか見つからないのに。
うちの会社はRails勉強会やる時は、rubyに興味無い連中も寄ってきて部屋いっぱいになってしまう。
社外向けのRails勉強会もやってるのだが高校生の応募もあったりして驚いたよ。
562デフォルトの名無しさん:2010/09/28(火) 03:52:14
一人で読んでも理解しにくいコードではあるのかな。
慣れてない人間には理解しにくくても、それをカバーできるほど有用なテクニックなら問題ないのだろうが。
563デフォルトの名無しさん:2010/09/28(火) 05:01:14
メタプログラミングが理解しにくいっていう話なら本人の能力の問題だな
564デフォルトの名無しさん:2010/09/28(火) 05:03:25
>>558
共通の処理まとめたい(DRYという手法だっけ?)

lib/以下におけばいいの?

ただのrequireじゃなくて、autoload使えって?(autoload使うと開発時のリロードのときに上手く働くとかどうとか)

おい、リロードするたびにクラスがunloadされてないとかどうとか、エラーでるようになったぞ、どうしてくれるんだ

production環境だと動くんだけど、、、、

Railsのソースを見出す

ヽ(`Д´)ノ わけわからん!!
565デフォルトの名無しさん:2010/09/28(火) 06:06:46
>>561
スレタイ100回読め
566デフォルトの名無しさん:2010/09/28(火) 06:09:37
>>564
急いでるときにそうなると困るよね
Rapid Programing 出来ると思って Rails 使ってるのに・・・
567デフォルトの名無しさん:2010/09/28(火) 06:24:27
そもそも「勉強会」になってしまう時点で何かおかしいと感じてほしいもんだ
568デフォルトの名無しさん:2010/09/28(火) 06:48:06
まあRailsはRailsスレで
「RailsはRubyではない」という文言が理解できないのは区別できない初心者か、
自分の頭の後ろにくっついてるRailsの知識の意味を理解できない可哀想な人
569デフォルトの名無しさん:2010/09/28(火) 08:16:36
Rubyを(比較的詳しく)知っててもRails解らんって人は多いらしい
570デフォルトの名無しさん:2010/09/28(火) 11:19:09
>>569
特定ライブラリの挙動を知ってるはずがないだろ
571デフォルトの名無しさん:2010/09/29(水) 01:52:54
rubyプログラマならactiverecordの実装ぐらいは知っておいたほうがいいぞ…
いくらrailsに興味無くても。
572デフォルトの名無しさん:2010/09/29(水) 03:14:01
ArelやNamedScopeのソースみたら卒倒するぞ
573デフォルトの名無しさん:2010/09/29(水) 16:01:25
rspecの日本語の本ないのかな?
そしたらBDDで開発しながらruby勉強できるのに。



574デフォルトの名無しさん:2010/09/29(水) 16:32:07
連載2回で止まってるけどるびまは読んだ?
575デフォルトの名無しさん:2010/09/29(水) 16:41:39
教科書を原書のドイツ語にして独習すればドイツ語の勉強にもなって一石二鳥かというと別にそんなことはない
むしろ理解がどっちつかずだ

言語にある程度慣れるまでは特別なテスト開発はやめと毛
576デフォルトの名無しさん:2010/09/29(水) 17:05:45
でも英語の本でプログラミング勉強すると両方の勉強になっていやなんでもない
577デフォルトの名無しさん:2010/09/29(水) 20:42:19
C++で言う「関数への参照渡し」みたいなことをするにはどうすればいいんでしょうか?
Integerの参照をメソッドに与えメソッド内で値を変更したいのですが
578デフォルトの名無しさん:2010/09/29(水) 20:55:14
>>577
できないのでほかの方法を模索してください
あなたの思考法はRubyとして間違っています

が妥当な回答な気がする
やってできないことはないんだが
579デフォルトの名無しさん:2010/09/29(水) 20:56:20
できなくはないがIntegerを例にするのは不適切。
580デフォルトの名無しさん:2010/09/29(水) 21:08:04
じゃあFixnumで
581デフォルトの名無しさん:2010/09/29(水) 21:45:18
マテ
582デフォルトの名無しさん:2010/09/29(水) 23:17:04
あれ全部参照なんじゃなかったっけ
普通に引数変えたら元も変わると思ってたけど違った?
583デフォルトの名無しさん:2010/09/29(水) 23:46:52
Rubyの引数は値渡しです。

オブジェクト渡しとかいろいろと名前が考えられているけど、一つだけ確かなことは、
参照渡しではないということです。
584デフォルトの名無しさん:2010/09/30(木) 00:05:05
>>573
あえて日本語のと聞いているのはRailsスレのレス見ていってるんだと思うけど、
日本語のまとまった本は見ないな。
WEB+DB PRESSでもちょこちょこ載っていることあるけど、ほんのさわりだしネットに載っている以上のことはないみたい


98 名前:nobodyさん[sage] 投稿日:2010/09/16(木) 23:59:45 ID:???
>>92
>>14にあるのはどう?

RSpecとCucumberを使った振舞駆動開発(BDD)
 ・The RSpec Book(英語, ベータ)
 http://www.pragprog.com/titles/achbd/the-rspec-book

Railsでのテスト駆動開発(TDD)の書籍。Tset::Unitから始まり、RSpec, Shoulda, Cucumber, Factory Girl, Rcovなども
 ・The Pragmatic Bookshelf | Rails Test Prescriptions
 http://www.pragprog.com/titles/nrtest/rails-test-prescriptions

585デフォルトの名無しさん:2010/09/30(木) 00:11:17
FixnumはImutableで即値扱いされる、という仕様はどこかマニュアルに書いてないのか

他の言語のつもりでいると、Stringも即値と勘違いするんだよな
586デフォルトの名無しさん:2010/09/30(木) 00:20:11
Integerには実はFixnumとBignumがあり、その境目とされる値が
なぜ境目となるのかを理解できれば難しい話ではないんだけどね。
README.EXT.ja なんて普通のユーザーは読まないしな。

587デフォルトの名無しさん:2010/09/30(木) 00:29:46
即値って言葉はアセンブリ言語ぐらいしか使わないと思ってたけど
Rubyみたいな超高水準言語でも使うものなの?
588デフォルトの名無しさん:2010/09/30(木) 01:11:06
それイミディエイトじゃ?
589デフォルトの名無しさん:2010/09/30(木) 01:11:06
Rubyの場合は、即値と言うよりimmutableって言葉のがよく使うね
オブジェクトなんだけど、オブジェクト自身に変更を加えるメソッドが一切無いものを言う
そして、そういうのは処理系の内部では即値で扱われることが多い

FixnumとBignumは普通に使う分には区別がほとんど付かないようになってるね
区別しようと思えば区別もできる程度

>>585
どうしても即値にしたければSymbolがあるからなあ
とは言っても、SymbolとStringは全然用途が違うのだけれども
590デフォルトの名無しさん:2010/09/30(木) 01:16:48
即値で思い出したけど、ときどきマジックナンバーのことを
即値と呼ぶ人がいて困る。
591デフォルトの名無しさん:2010/09/30(木) 01:23:19
>>587
聞かないねえ。
Cでさえ即値なんて言わない。
アセンブリ言語特有の呼称だと思っている。
592587:2010/09/30(木) 01:35:29
そんなもんだよね。サンクス
593デフォルトの名無しさん:2010/09/30(木) 01:43:46
リテラルの意味で使う場合もあるな
594デフォルトの名無しさん:2010/09/30(木) 01:47:13
> 即値って言葉はアセンブリ言語ぐらいしか使わないと思ってたけど

悪い悪い。一般的にはなんというのかわからなかったので知ってる単語だしただけ。

Rubyの場合はimmutableで通じるのね
595デフォルトの名無しさん:2010/09/30(木) 01:52:15
ほっとして寝ようと思ったら

> 即値
> Immediate Value
> 参照ではなく、実際の値が変数に格納されるもの。Rubyの現在の実装では
> Fixnum、Symbolとnil/true/falseだけが即値である。
> しかし、Fixnumが即値でないRubyの実装があっても構わないし、モデル上
> 全ての値がオブジェクトへの参照であると考えても差し支えない。


うへえ。やっぱり寝る
596デフォルトの名無しさん:2010/09/30(木) 01:56:23
>>595
> モデル上全ての値がオブジェクトへの参照であると考えても差し支えない

ってところは意外と重要なところだと思う
内部的には即値を扱ってるんだけど
コード上は全てオブジェクトを扱ってるように見えるからな
immutableオブジェクトには自身を変更するメソッドが無いおかげでそれを実現できてる
597デフォルトの名無しさん:2010/09/30(木) 02:04:07
BignumはimmutableだけどImmediateでない?
598デフォルトの名無しさん:2010/09/30(木) 02:34:31
>>596
いやいや、実装の細部を隠すことに成功しているという意味だから
本質的に重要な指摘でしょ
いわゆる即値かどうかなんて、気にしなくてもいい
599デフォルトの名無しさん:2010/09/30(木) 03:13:45
何? 何なの?
何がいやいやなんだよ
そう言ってるじゃん
600デフォルトの名無しさん:2010/09/30(木) 03:28:31
ドロップダウンでテーブルから参照するサンプルプログラム
どっかにありませんか?できるだけ簡易なのがいいです。
601デフォルトの名無しさん:2010/09/30(木) 04:05:28
>>599
”意外と”に過剰反応した
すまん
602デフォルトの名無しさん:2010/09/30(木) 05:09:46
実際上の即値が何を意味するかというと、その値を意味するオブジェクトがひとつだけということ
小さい整数は何度も使われるからオブジェクト生成は1回だけにしておこうという単なる効率上の話に過ぎない
irb> p 100.object_id
201
irb> p 100.object_id
201
irb> p 100.object_id
201
irb> p true.object_id
2
irb> p true.object_id
2
irb> p true.object_id
2
irb> p "100".object_id
-608236338
irb> p "100".object_id
-608244138
irb> p "100".object_id
-608251918

50.times{|x| 100} で Integer.new("100") 相当のことを50回やるという
リッチゴジャースで「本物のオブジェクト指向」な Ruby 実装があってもいいという程度のお話
603デフォルトの名無しさん:2010/09/30(木) 05:16:00
しつこく出てくるものは変更の可能性なくても定数使えってことか
604デフォルトの名無しさん:2010/09/30(木) 05:47:12
まあそうなんだけど、1万くらいの要素をもった配列から 'str!' と同一なものが含まれるかどうかを返す
array_10000elements.find{|s| s == 'str!'}

target = 'str!'
array_10000elements.find{|s| s == target}
とするあたりは「名前を付けるリファクタリング」の範疇で推奨だとしても
def search(s)
s == 'str!'
end
array_10000elements.find{|s| search(s)}
とメソッドに吐出ししたときにさらに
TARGET = 'str!'
def search(s)
s == TARGET
end
array_10000elements.find{|s| search(s)}
と定数にするようなことがどれだけ正義なのかについては結構議論の余地が

ちなみに #{...} での変数埋め込みがない「静的」な正規表現については
Ruby が勝手に同一オブジェクトを使い回してくれます
irb> 3.times{|x| p /re!/.object_id}
-608271818
-608271818
-608271818
文字列でもやってくれたらよかったのに
irb> 3.times{|x| p "str!".object_id}
-608279388
-608279408
-608279428
605デフォルトの名無しさん:2010/09/30(木) 09:25:53
うへぇ、ImmutableはMutableと対置される概念だとしか認識してなかった。

即値とImmutableって別の概念だと思うけどなぁ。
606デフォルトの名無しさん:2010/09/30(木) 09:27:44
あなんだ。
ImmediateとImmutableを誤読してたorz
607デフォルトの名無しさん:2010/09/30(木) 10:26:07
>>604
「定数」という言葉の使い方しだいですけど、そこまで考えるのであれば

MATCH_TARGET = lambda{|s| s=='str!'}
array_10000elements.find{|s| MATCH_TARGET[s]}

とか書いた方が素直なような気が。
608デフォルトの名無しさん:2010/09/30(木) 10:41:20
>>607
Procを最大1万回起動するくらいなら文字列を直に書いたほうがまし
609デフォルトの名無しさん:2010/09/30(木) 10:52:29
>>607
問題勘違いしてるな
文字列の生成のコストを嫌ってるんだぞ
> lambda{|s| s=='str!'}
これだとlambdaがcallされるたびに'str!'が生成されるから無意味
610デフォルトの名無しさん:2010/09/30(木) 10:59:45
ローカルスコープの外に変数置くと遡って探して呼び出すコストがかかるようになるから、
実際に計測しないと単純にどっちがいいとは言えんな

文字列くらいならブロック内に置いておいたほうがたぶんいいと思う
リテラルで書ける程度の配列やHashも直に書いたほうがいい
正規表現は前にあったレスの通り
変数にして得するのは自作のなんかごっついオブジェクトとかじゃね、やっぱ
611デフォルトの名無しさん:2010/09/30(木) 11:22:42
require 'benchmark'

class C
STR = 'str!'
def initialize; @str = 'str!'; end

def search_without_external(x); x == 'str!'; end
def search_with_insvalue(x); x == @str; end
def search_with_const(x); x == STR; end

def run
arr = Array.new(100000, nil)
Benchmark.bmbm do |x|
x.report('inline') do
arr.each{|e| e == 'str!'}
end
x.report('method w/o external') do
arr.each{|e| search_without_external(e)}
end
x.report('method with @instance_value') do
arr.each{|e| search_with_insvalue(e)}
end
x.report('method with CONSTANT') do
arr.each{|e| search_with_const(e)}
end
end
end
end

C.new.run
612デフォルトの名無しさん:2010/09/30(木) 11:30:10
すまん
x.report('local') do
str = 'str!'
arr.each{|e| e == str}
end
を足してくれ
んで結果
Rehearsal ---------------------------------------------------------------
inline                0.610000  0.000000  0.610000 ( 0.612713)
local                 0.290000  0.000000  0.290000 ( 0.285593)
method w/o external      0.860000  0.000000  0.860000 ( 0.865840)
method with @instance_value 0.540000  0.000000  0.540000 ( 0.544721)
method with CONSTANT    0.570000  0.000000  0.570000 ( 0.563352)
------------------------------------------------------ total: 2.870000sec

                    user    system   total    real
inline                0.610000  0.000000  0.610000 ( 0.608649)
local                 0.290000  0.000000  0.290000 ( 0.284991)
method w/o external       0.860000  0.000000  0.860000 ( 0.855065)
method with @instance_value  0.550000  0.000000  0.550000 ( 0.543961)
method with CONSTANT    0.560000  0.000000  0.560000 ( 0.564894)

結論
・ ローカル変数最強
・ インスタンス変数や定数にするのは見栄えとお好みとプログラムの意味考えた上で好きにしろ
613デフォルトの名無しさん:2010/09/30(木) 11:36:24
え、これは
「何万回も行う処理をブロック外のメソッドに単純に掃き出ししたら処理自体が遅くなった」
「が、文字列生成を1回にしたらちょっと戻った」
だよね
なにげにまずいと思うんだが
614デフォルトの名無しさん:2010/09/30(木) 11:49:41
>>613
こんな「文字列生成は1回だけでメソッドの引数で渡す」を追加してみる
def search_with_arg(x, s); x == s; end

x.report('method with arg') do
str = 'str!'
arr.each{|e| search_with_arg(e, str)}
end

で、結果
                     user   system   total    real
inline                0.600000  0.000000  0.600000 ( 0.598644)
local                 0.280000  0.000000  0.280000 ( 0.279111)
method w/o external       0.860000  0.000000  0.860000 ( 0.857289)
method with arg          0.530000  0.000000  0.530000 ( 0.530060)
method with @instance_value  0.540000  0.000000  0.540000 ( 0.534953)
method with CONSTANT    0.560000  0.000000  0.560000 ( 0.554683)

文字列生成が1回かどうかだけが効いてて、どこから探してくるかはそれほど問題にならない模様

ちなみに1.8.7ではなく1.9.2でやるとどこか間違ってる感じに爆速だったことを追記しておく
                    user   system   total    real
inline                0.420000  0.000000  0.420000 ( 0.413724)
local                0.120000  0.000000  0.120000 ( 0.121577)
method w/o external      0.540000  0.010000  0.550000 ( 0.544168)
method with arg         0.200000  0.000000  0.200000 ( 0.202301)
method with @instance_value  0.210000  0.000000  0.210000 ( 0.207914)
method with CONSTANT    0.190000  0.010000  0.200000 ( 0.204321)
615デフォルトの名無しさん:2010/09/30(木) 12:23:07
あと、proc はうんざりするほど遅かった(文字列生成を1回だけにするとそのぶんだけは軽減)
ただし 1.9.2 で実行すると 1.8.7 よりはうんと速く、メソッド呼び出しより少し遅い程度
616デフォルトの名無しさん:2010/09/30(木) 12:36:57
はじめまして。
勉強し始めなので、よくわからないことがあるので教えていただければ、
と思いカキコします。
hashの部分を勉強中なのですが、deleteメソッドに関して、
本で見ていると「keyをnilにしてvalとの結びつきをなくす」
とあり、さらに「valは削除されていない・・・」との記述なのですが、
どういうことなのでしょうか?
valを表示させることが可能なのか、また、ガーベジコレクション関係の
話なのでしょうか?
教えていただけると助かります。
617デフォルトの名無しさん:2010/09/30(木) 12:42:13
Hash オブジェクトからペアを取り除く、という以上の意味はないよ
取り除かれたオブジェクトが実際にどうなるかまでは関与しない
プログラム上で誰も参照していなければ他の変数同様GCの対象になるだけ

あとそれはかなりへちょい解説なのでむしろ書名晒せ
618デフォルトの名無しさん:2010/09/30(木) 12:46:30
>>617
ありがとうございます。
署名は「作りながら学ぶRuby入門」です。
P.110の上部にあります。
単純に削除、という理解で良いってことですね。
619デフォルトの名無しさん:2010/09/30(木) 13:14:54
それは入門者用の参考書だからそれで十分でしょ。
620デフォルトの名無しさん:2010/09/30(木) 13:16:59
>>619
入門用なら
「Hash#deleteはkeyに関連するキーと値のペアをHashオブジェクトから削除します」
で削除部分の動作説明は充分だ
入門どころか中級者向けでもこれで充分
621デフォルトの名無しさん:2010/09/30(木) 13:41:19
>>614
手元の 1.9.1 で実行してみると
s == 'str!' と s =~ /^str\!/
は後者の方が速いみたいなのだけれども、そういうもの?
622デフォルトの名無しさん:2010/09/30(木) 13:54:17
>>621
正規表現処理の速度はマッチの仕方に依存
それはたまたま正規表現のほうが速かっただけに過ぎない
str = 'str'*100
arr = Array.new(100000){'str'*100}
re = /\A#{str}\!\Z/

Benchmark.bmbm do |x|
x.report("==") do
arr.each{|e| e == str}
end
x.report("re") do
arr.each{|e| e =~ re}
end
end

こんなスクリプトにすると、
3000文字ぶんを行ったり来たりしながら十万回マッチ試行しなければならない正規表現のほうが遅い
これも1.8.7はバカ遅いが1.9.2だとやたら速いな
623デフォルトの名無しさん:2010/09/30(木) 21:01:55
>>616
一旦 keyをdeleteさせたら
復活させる方法はないかもね。

object_id()で調べてみたけど
同じ要素を消してから入れ直しても
違うobject_idが表示される。

想定していたのはキーと要素をハッシュに登録し直したら
同じobject_idが表示されるかもしれないかと期待したが、
結果は違うobject_idだったから、別物だという事。

疑問の「valを表示させる事は可能なのか?」の答えは出来ないだ。

まぁ、上級者向けのテクニックならあるのかもしれないが。
object_idを記憶させておいて、それをどうにかして再設定させるとか。
(消えてないと書かれているのだから)
624デフォルトの名無しさん:2010/10/01(金) 04:01:50
>>616 >>623

こういう話だと思ってたけど違うの?

irb(main):001:0> val = "yugui"; hash = {:lovely => val }
=> {:lovely=>"yugui"}
irb(main):002:0> hash.delete(:lovely)  # hashからは消す
=> "yugui"
irb(main):003:0> hash
=> {}
irb(main):004:0> val       # valは削除されてない
=> "yugui"
irb(main):005:0> puts val     # valは表示できる
yugui
=> nil
625デフォルトの名無しさん:2010/10/01(金) 06:31:42
>>624
単なるそういう話
「ハッシュから削除っていうけどそれはハッシュから削除というだけの話でハッシュに登録されていたオブジェクトが削除されるという意味では必ずしもありませんよ」
という頭でっかちな説明
>>623はわかってない
626デフォルトの名無しさん:2010/10/01(金) 09:21:51
friends = { :shin => "Shin Tanaka",}
friends.delete(:shin)
p friends

これでdeleteしたらもうアクセス出来ない。
627デフォルトの名無しさん:2010/10/01(金) 09:28:47
>>626もわかってない
628デフォルトの名無しさん:2010/10/01(金) 22:40:31
おいおい、ひょっとして本当に分かってんのは俺だけなんじゃないだろうな?
629デフォルトの名無しさん:2010/10/01(金) 22:58:21
>>626
今の趣旨は、こういう話なんだよ。

friends = { :shin => "Shin Tanaka" }
value = friends[:shin]
p value.object_id,value #=> 84260, "Shin Tanaka"
friends.delete :shin
p value.object_id,value #=> 84260, "Shin Tanaka"

Hash#deleteは、要素自体を『削除』する訳ではなく、Hashから登録を抹消するのみ。
630デフォルトの名無しさん:2010/10/01(金) 23:14:37
元の説明が「親切と正確」というものを履き違えてるんだな
Hash だからといって特別な説明が必要だとは思えない
631デフォルトの名無しさん:2010/10/01(金) 23:33:44
だね。これといっしょだぬ

a = "hoge"
b = a
a = nil
b #=> "hoge"
632デフォルトの名無しさん:2010/10/02(土) 02:22:17
>>631
aもbもメモリの番地を記憶しているという事だな。
633デフォルトの名無しさん:2010/10/02(土) 02:30:49
ハッシュも、変数も配列もすべてメモリ番地を記憶しているのか?
634デフォルトの名無しさん:2010/10/02(土) 07:08:09
>>632-633
番地ではない
実装のメモリをまったく反映しない
そういう考え方は害悪しか生まないので即忘れるべき
オブジェクトの呼び出し法に過ぎない
通常利用に必要な程度のオブジェクトの概念が理解できないならRuby無理して使うのやめと毛
635デフォルトの名無しさん:2010/10/02(土) 08:02:26
害悪ってどんなん
636デフォルトの名無しさん:2010/10/02(土) 09:31:21
Cのポインタやらレジスタやらで説明すると
Cと同様の動作を期待するあほの子が絶対出るので避けたほうがいいという経験則はなくもない
637デフォルトの名無しさん:2010/10/02(土) 09:40:56
変数に*とか&とか付けてC言語と違うのはなぜですか、とか?
638デフォルトの名無しさん:2010/10/02(土) 09:50:02
メソッド引数が参照かどうかとか聞くのはデフォ
639デフォルトの名無しさん:2010/10/02(土) 10:09:42
>>633
どっつかっつーと、object_idを記憶してると考えたほうが良いかな
640デフォルトの名無しさん:2010/10/02(土) 10:52:11
Pascalのポインタくらい抽象化されているものでの理解ならまだいいのかも。
641デフォルトの名無しさん:2010/10/02(土) 11:54:03
実はJavaにもポインタがありますっていう話だろ
642デフォルトの名無しさん:2010/10/02(土) 13:28:34
1.9.2p0でWatirが動かない。。。
と思ったら
http://stackoverflow.com/questions/3234989/which-ruby-version-for-watir-on-windows
で解決した。
643デフォルトの名無しさん:2010/10/02(土) 13:28:54
どこからも参照されなくなったオブジェクトがGCに回収されることを確かめてみようと
a = 'hoge'
p id = a.object_id
a = nil
GC.start
p ObjectSpace.each_object.find{|e| e.object_id == id}
とかすると
いつまでたっても ObjectSpaceから'hoge'が見つかる
a = String.new('hoge')
だと、Stringオブジェクトはすぐに回収されてみつけられなくなる
リテラルから直に生成されるStringオブジェクトは特別なんだろうか?
644デフォルトの名無しさん:2010/10/02(土) 14:35:53
>>643
GC に回収されるタイミングを GC.start やら GC.stress=true やらで保証することはできない
Ruby の GC は保守的な GC(conservative GC) だから、
最終的に回収されることは保証するが、それが実際にいつかは保証できないし、
それが途中で行われていることを見越したコードを書いてもいけないことになっとる

つまり GC 実行のタイミングのテストを Ruby で試すのはたいへんめんどい
脳内で
「まーこんだけオブジェクト作って時間経ってればGCがどっかで動いてさっきのは消えてるんじゃないかなあ」
と想像するしかできない
645デフォルトの名無しさん:2010/10/02(土) 14:42:26
> Ruby の GC は保守的な GC(conservative GC) だから、

> 最終的に回収されることは保証するが、それが実際にいつかは保証できないし、
> それが途中で行われていることを見越したコードを書いてもいけないことになっとる
これは保守的と関係ない。
646デフォルトの名無しさん:2010/10/02(土) 15:22:35
保守的GCは、最終的にすら回収されないことがあるGCだな。

647デフォルトの名無しさん:2010/10/02(土) 18:38:14
vimでRuby書く場合のおすすめプラグインとかある?
例えば補完させるのとかあるのかな
648デフォルトの名無しさん:2010/10/02(土) 18:41:55
649デフォルトの名無しさん:2010/10/02(土) 22:44:09
>>644
一応、それはわかってるつもりなんだけど
10000000.times{String.new}
GC.start
sleep 5 # sleep中にGCが動くか知らんのだけど
とかやっても、あいかわらず'hoge'がObjectSpaceに居座ってる
長いスクリプトだったら、いつかそのうち回収されてるのだろうけど
Object.newやString.new や Array.new 等だと GC.startすらしなくても
すぐさま回収されて消えて無くなる

いろいろ試してみたところ 別の文字列リテラルを評価するとすぐに回収されるみたい
p "fuga"
とかすると、GC.start しなくても'hoge'が回収されてる
ふしぎだ

通常の使い方だとそんなこと気にせずとも、どうでもいいことなんだけどね
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
で試したことです
650デフォルトの名無しさん:2010/10/02(土) 23:02:57
rubykaigiやらなんやらでGCの実装のプレゼントあったような気がする

GCの実装見てみればいいんじゃないの
と思ったけど、それができて簡単に理解できるならここで聞いてないか

651デフォルトの名無しさん:2010/10/02(土) 23:03:38
GCが開始するかもしれないタイミング自体はアルゴリズムである程度決まってるんじゃなかったっけ
652デフォルトの名無しさん:2010/10/03(日) 02:41:17
質問があるのですが、Rubyのセキュリティ情報やリリースアナウンスだけが流れてくるメーリングリストはありませんでしょうか?
メーリングリストというのかわかりませんが・・・

Linuxのディストリビューションや海外のOSSではSecurity Announcement用のメールを流してくれたりするのですが、
そういうのはないものかと
653デフォルトの名無しさん:2010/10/03(日) 04:26:57
>>652
MLはないね。

http://www.ruby-lang.org/ja/feeds/news.rss
これを購読してはどうか。
654デフォルトの名無しさん:2010/10/03(日) 11:49:14
「セキュリティ情報」の粒度によりそうな
655デフォルトの名無しさん:2010/10/03(日) 19:58:37
鍵交換プロトコルの実装をしたいのですが、ソケットの様な通信用関数って
Rubyにあるのでしょうか。
656デフォルトの名無しさん:2010/10/03(日) 20:04:21
それはさすがにぐぐれカスとしか…
ttp://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=Ruby+%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88&num=50
Rubyレベルのこれで不足な場合はCで書かないといけない
たぶんRubyでないほうが楽だろう
657デフォルトの名無しさん:2010/10/03(日) 20:16:37
opensslの再実装でもしたいのだろうか。
658デフォルトの名無しさん:2010/10/03(日) 20:20:41
GPGのもっと使いやすいやつを目指してます。
通信も出来ればいいかなと。Zebedeeみたいに。
659デフォルトの名無しさん:2010/10/03(日) 23:16:18
>>653
サンクス、やっぱり公式のニュースのフィードか。
rssをメールで送るの使ってみるわ。rssだしgrowlにも設定しておけばいいか。

ruby-listのMLの方から抽出するのも早いのだろうけど、
"[ANN]"や"[ANN] リリース"だとRuby本体以外も入るし、
なかなか面倒なんだよ
660デフォルトの名無しさん:2010/10/04(月) 03:55:28
>>647
rsense
661デフォルトの名無しさん:2010/10/04(月) 16:42:23
rand(特別な数字) だと速い、みたいなのってありますか?
たとえばrand(99999)までは速いけどrand(100000)だと桁の関係で遅くなる、みたいな
662デフォルトの名無しさん:2010/10/04(月) 16:46:26
>>661
65535
663デフォルトの名無しさん:2010/10/04(月) 19:15:25
測定してみたら?
664デフォルトの名無しさん:2010/10/04(月) 22:35:52
require 'benchmark'
Benchmark.bmbm {|x|
100000.step(1000000, 100000) { |i|
x.report("rand(10**#{i})") { rand(10**i) }
}
}
Rehearsal -----------------------------------------------------
rand(10**100000) 0.080000 0.000000 0.080000 ( 0.090130)
rand(10**200000) 0.210000 0.000000 0.210000 ( 0.210302)
rand(10**300000) 2.213000 0.010000 2.223000 ( 2.303312)
rand(10**400000) 2.143000 0.000000 2.143000 ( 2.303312)
rand(10**500000) 0.972000 0.010000 0.982000 ( 1.011454)
rand(10**600000) 3.545000 0.000000 3.545000 ( 3.585155)
rand(10**700000) 1.752000 0.000000 1.752000 ( 1.792578)
rand(10**800000) 2.204000 0.010000 2.214000 ( 2.243226)
rand(10**900000) 3.174000 0.000000 3.174000 ( 3.334795)
rand(10**1000000) 3.856000 0.020000 3.876000 ( 4.005760)
------------------------------------------- total: 20.199000sec
user system total real
rand(10**100000) 0.070000 0.000000 0.070000 ( 0.070101)
rand(10**200000) 0.300000 0.000000 0.300000 ( 0.310446)
rand(10**300000) 0.441000 0.000000 0.441000 ( 0.440634)
rand(10**400000) 0.721000 0.000000 0.721000 ( 0.741065)
rand(10**500000) 1.502000 0.000000 1.502000 ( 1.542217)
rand(10**600000) 1.362000 0.010000 1.372000 ( 1.412030)
rand(10**700000) 1.733000 0.000000 1.733000 ( 1.782563)
rand(10**800000) 2.183000 0.010000 2.193000 ( 2.243225)
rand(10**900000) 19.398000 0.000000 19.398000 ( 19.818498)
rand(10**1000000) 3.184000 0.000000 3.184000 ( 3.304752)

rand(i) の i が大きくなればなるほど遅くなるのが一般的な傾向だけど、
必ずしも i が大きい方が遅いというわけではないみたい。
665デフォルトの名無しさん:2010/10/04(月) 22:41:41
i自体の計算時間がかなり影響してるとかないだろうな
666デフォルトの名無しさん:2010/10/04(月) 22:45:44
require 'benchmark'
Benchmark.bmbm {|x|
100000.step(1000000, 100000) { |i|
seed=10**i
x.report("rand(#{seed})") { rand(seed) }
}
}
こうだな
667デフォルトの名無しさん:2010/10/04(月) 23:05:45
>>665
うはwww そうでした

require 'benchmark'

Benchmark.bmbm {|x|
100000.step(1000000, 100000) { |i|
seed=10**i
x.report("#{i}") { rand(seed) }
}
}

user system total real
100000 0.000000 0.000000 0.000000 ( 0.000000)
200000 0.000000 0.000000 0.000000 ( 0.000000)
300000 0.000000 0.000000 0.000000 ( 0.000000)
400000 0.000000 0.000000 0.000000 ( 0.000000)
500000 0.000000 0.000000 0.000000 ( 0.000000)
600000 0.000000 0.000000 0.000000 ( 0.000000)
700000 0.000000 0.010000 0.010000 ( 0.010014)
800000 0.000000 0.000000 0.000000 ( 0.000000)
900000 0.000000 0.010000 0.010000 ( 0.010014)
1000000 0.000000 0.000000 0.000000 ( 0.000000)
668デフォルトの名無しさん:2010/10/05(火) 07:17:37
例外クラスを自分で定義すべきかどうかを判断する基準がわからない…しにたい
669デフォルトの名無しさん:2010/10/05(火) 08:39:24
>>668
組み込みの例外クラスをひととおり把握すれば、あとは
「それら以外の例外は自分で作成する」というルールで
いいと思う。

組み込み例外クラス
ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFA5AFA5E9A5B9A1BFA5E2A5B8A5E5A1BCA5EBA1BFCEE3B3B0A5AFA5E9A5B9.html

ただ、Rubyの例外クラスのうち、自分でつかえそうなのは
ArgumentErrorとNotImplementedError(とRuntimeError)
ぐらいなんだよね。だからそれ以外は全部自前で定義している。
670デフォルトの名無しさん:2010/10/05(火) 09:16:29
Rubyの個々の例外クラスを作った人は、
自分が全ユーザーの全スクリプトのエラークラスの継承元になるということに
全く気を払ってないように見える

概念もまあまあで実装もまあまあだが実際がへぼいというなんとも
671デフォルトの名無しさん:2010/10/05(火) 09:58:13
具体的にどういうときに例外クラスを使うかのガイドはあるべきと言われて誰も書けない状態が続いてるな
無いものは説明できんというたいへん正直な
672デフォルトの名無しさん:2010/10/05(火) 13:34:14
test
673デフォルトの名無しさん:2010/10/05(火) 15:02:52
質問です。

1. XML を別サーバーから GET で取得(http/net を使用)
2. その XML を整形/スタイルを指定して HTML に変換
3. ブラウザに表示

というのをやろうとしているのですが、どうやったらいいのかイマイチわかりません。

今のところちゃんと出来ているのは 1. だけです。
2. は XSLT を使って実現しようとしていましたが、現在頓挫しています。

こういうことをやりたいときのスタンダードなやり方はなんなのかなど、
自分なりに時間をかけて調べていたのですが、
答えが見つからず、質問させて頂きました。

よろしくお願いします
674デフォルトの名無しさん:2010/10/05(火) 15:50:27
>>673

Nokogiriにまんまの機能があるみたいよ。
ttp://nokogiri.rubyforge.org/nokogiri/Nokogiri/XSLT/Stylesheet.html

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

ブラウザに返すときはContent-Typeを付けてね。
675デフォルトの名無しさん:2010/10/05(火) 20:06:11
上司に「(メソッドのなかで)引数チェックしろよ。」って言われたんですけど、
「そんなのメソッドを呼ぶ側がチェックして放り込めばいいじゃないですか?」
って聞き返したら「はぁ?もっぺん入門書読んでこいよ。」とか言われました。
もう何が正しいのかわからなくなりました…
676デフォルトの名無しさん:2010/10/05(火) 20:11:44
入門書読んでこいよだァ?コノヤロウ!てめェがもういっぺん読んでこいよ!

でおk
677デフォルトの名無しさん:2010/10/05(火) 20:18:42
>>675
printf の戻り値はチェックしてますか?と言い返せばよい
678デフォルトの名無しさん:2010/10/05(火) 20:22:35
そのへんはもう Ruby 関係ないなw

一応、

 ・ メソッド使用者がオブジェクトの吟味をする
 ・ メソッド内部で引数オブジェクトの吟味をする
 ・ どうせ動作しないので NoMethodError とかが出てから考える

の3種類ある
マニュアルに使用法が記述されるレベルのパブリックに供するメソッドは
「引数として受け取れるっぽいものは一応なんでも受け付けておいて内部でチェック」という動作が妥当
マニュアルレベルのパブリックでないなら好きにせえ
hogestr_to_array(hoge) の hoge が String かどうかを内部でチェックするのはバカっぽい
679デフォルトの名無しさん:2010/10/05(火) 20:27:55
ひきすうちぇっくしたうえでどうするのかにもよるきがす
680デフォルトの名無しさん:2010/10/05(火) 21:41:59
引数のチェックは基本的に呼び出される側でやる。
が、入門書には載ってないな。

呼び出し側とか言ってるやつは、
エラーの使いこなしとかいつまで経っても進歩しない。
681デフォルトの名無しさん:2010/10/05(火) 22:19:15
例外出さないチェックならメソッド外部でもいいよ
682デフォルトの名無しさん:2010/10/05(火) 23:17:22
下手に気を利かせて nil とか false とかが返却されたり、
独自の例外が発生したりするのは勘弁。
まだ NoMethodError が出た方が引数間違ったと分かっていい。
683デフォルトの名無しさん:2010/10/05(火) 23:47:35
Date#leap? ってばぐってる?西暦900年とかが、
うるう年になるんだけど。
684デフォルトの名無しさん:2010/10/05(火) 23:58:30
>>683
ユリウス暦だから閏年なんじゃね?
http://ja.wikipedia.org/wiki/900%E5%B9%B4
685デフォルトの名無しさん:2010/10/05(火) 23:58:58
>>683
西暦900年なら閏年でいいような気がする
686デフォルトの名無しさん:2010/10/06(水) 00:17:59
rescue しても既にどうしようもなさそうな独自例外を出すメソッドはピキっとくる
687683:2010/10/06(水) 00:34:49
ユリウス暦は正直見落としてたけど、うるう年が単純で4で割り切れると知って考えても
おかしくて1700年とか1800年とかがうるう年でないって判断される。

ちなみにruby 1.8.7 ね
688デフォルトの名無しさん:2010/10/06(水) 00:46:03
おかしくない
http://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4
> 1. 西暦年が4で割り切れる年は閏年
> 2. ただし、西暦年が100で割り切れる年は平年
> 3. ただし、西暦年が400で割り切れる年は閏年
689デフォルトの名無しさん:2010/10/06(水) 01:05:42
>>688
それはグレゴリオ暦ですよね
1582年を境にユリウス暦からグレゴリオ暦に変えているということでしょうか?
690デフォルトの名無しさん:2010/10/06(水) 01:22:23
ん?そもそも900年はfalseになるぞ
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]
$ ruby -rDate -e "p Date.leap?(900)"
false
691デフォルトの名無しさん:2010/10/06(水) 01:29:46
>>683 は小学生?
692デフォルトの名無しさん:2010/10/06(水) 01:33:05
$ ruby --version
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]


$ruby -r date -e "p Date.leap?(900)"
false


falseだな
693デフォルトの名無しさん:2010/10/06(水) 01:41:39
クラスメソッドとインスタンスメソッドで結果が違うね

$ ruby -rdate -e '100.step(3000,100){|i|print "#{i} #{Date.new(i).leap?} "}'
100 true 200 true 300 true 400 true 500 true 600 true 700 true 800 true 900 true 1000 true
1100 true 1200 true 1300 true 1400 true 1500 true 1600 true 1700 false 1800 false 1900 false 2000 true
2100 false 2200 false 2300 false 2400 true 2500 false 2600 false 2700 false 2800 true 2900 false 3000 false
694小学生:2010/10/06(水) 01:50:02
どもです。もうちょっと自分でいろいろ考えながらやってみます。
695デフォルトの名無しさん:2010/10/06(水) 01:58:35
マニュアル見れば解決
ttp://doc.ruby-lang.org/ja/1.8.7/class/Date.html
特異メソッド(クラスメソッド)のDate.leap?はグレゴリオ暦の閏年か判断
インスタンスメソッドのDate#leap?はインスタンスに合わせて閏年か判断
Date#newの引数を省略するとDate::ITALY(1582年10月15日)にユリウス⇒グレゴリオに改定されたという前提のDateオブジェクトになる
696デフォルトの名無しさん:2010/10/06(水) 02:01:49
>>689
1582年10月4日(木曜日)までユリウス暦、
1582年10月15日(金曜日)からグレゴリオ暦
なんでしょ。
5日から14日までは欠番ね。
697デフォルトの名無しさん:2010/10/06(水) 02:05:30
たまに思うのだが、rubyのリファレンスマニュアルの記述って
なんか読みにくいんだよな。

引数説明とかあいまいだし
698デフォルトの名無しさん:2010/10/06(水) 02:35:14
rubyで、CPUやメモリの情報をとってくることはできますか。
今は/procをみることぐらいしかやり方が思いつかないんですが、
できればプラットフォームに依存せず使える方法がほしいです。
699デフォルトの名無しさん:2010/10/06(水) 03:46:02
CPUやメモリ自体が個別の「プラットフォーム」だろ
世の中にはメモリが連続でマップされてないシステムだってあるんだぞ
700デフォルトの名無しさん:2010/10/06(水) 06:07:24
うむ
もしそれを感じさせないのならそれはそのプログラム内部で細かく条件分岐してるだけだ

ということで gem の sys-cpu とかになるんだが
701デフォルトの名無しさん:2010/10/06(水) 08:56:34
>>700
sys-cpuがそのものズバリです。ありがとうございました!
702デフォルトの名無しさん:2010/10/06(水) 21:19:40
VISTAのコマンドラインからrubyを使えるようにするにはどうすればいいですか?
703デフォルトの名無しさん:2010/10/06(水) 21:20:19
rubyをインストールしろ
704デフォルトの名無しさん:2010/10/06(水) 22:21:12
環境変数にパスが設定されているか確認。
705デフォルトの名無しさん:2010/10/06(水) 22:34:25
cygwinで(ry
706デフォルトの名無しさん:2010/10/07(木) 01:23:25
そういうめんどくさいことがないように Ruby Console がスタートメニューに入るんじゃないの
どっか適当なコマンドプロンプトでも実行できるようにするのにはコマンドプロンプトについての基礎知識が要るな
707デフォルトの名無しさん:2010/10/07(木) 06:48:15
ちょwC:\WINDOWS\system32にrubyをインストールすればよくね?
708デフォルトの名無しさん:2010/10/07(木) 07:03:28
>>674
遅レスですみません!

>>673 を書き込んだ当日から予定外の出張が入ったのと、
規制(iPhone)とで書き込めませんでした。

明日から通常作業に戻れそうなので、さっそく試してみます。
親切で丁寧なアドバイス、ありがとうございました!
709デフォルトの名無しさん:2010/10/07(木) 07:24:41
>>707
PATH設定したほうが余計なことを気にしなくても済むし手間もかからないだろう
710デフォルトの名無しさん:2010/10/07(木) 13:05:21
こんにちは。>>673 >>708 です。
あっさりつまりました。
環境は Windows7(64bit)で ruby 1.9.2 です。

1. Nokogiri をとりあえず動かしてみようとしたけど、動かない?

以下のように書いて、ブラウザでアクセスしたけど画面が真っ白です。
ブラウザは Firefox3.6.10 です。

#!/Ruby/bin/ruby.exe

print "Content-Type: text/plain\r\n\r\n"

require 'nokogiri'

doc = Nokogiri::XML(File.read('C:\Apache2.2\htdocs\test\sample01.xml'))
xslt = Nokogiri::XSLT(File.read('C:\Apache2.2\htdocs\test\test01.xslt'))
puts xslt.transform(doc)


2. ruby r- debug *.rb して s → Enter というのをやってみた

require 'nokogiri' のところで
<internal:lib/rubygems/custom_require>:29:
と出ます。何度繰り返しても末尾の数字が変わるだけで
前に進まないので、おそらくエラーメッセージが出ているのだろうと思い、
検索してみたけれど有益な情報にはたどり着けず。


まったくの初心者なので上記の ruby -r debug も、ついさっき知りました。
対処法以外にもアドバイスなどあればいただけるとありがたいです。
よろしくお願いします。
711デフォルトの名無しさん:2010/10/07(木) 13:12:19
>>710
スクリプトをWebサーバー上で実行するな死ぬまでPHPやってろ
712デフォルトの名無しさん:2010/10/07(木) 13:21:58
>>711

なんと!そこから既に間違っていましたか!
と、言うことはコマンドプロンプトでやるんですかね?
このあたりでしょうか。

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

ありがとうございます、知らないって本当に恐ろしいです。
713デフォルトの名無しさん:2010/10/07(木) 13:36:32
リンク先思ったのとちがってた…ひとりでもりあがってすみません
714デフォルトの名無しさん:2010/10/07(木) 13:40:39
普通は標準出力への出力が妥当であることを確認してからCGIなりなんなりに移行させると思う
Webブラウザの出力を見てデバッグするようなことはない
そういうサポートがほしけりゃそれこそPHP使え

で、nokogiri は rubygems で提供されているから gem コマンドでインストールしないと使えない
gem 経由でインストールしたなら rubygems ライブラリを読み込んだ状態でないと利用できない

ということで
#!/Ruby/bin/ruby.exe
# -*- coding: shift_jis -*-.
require 'rubygems'
require 'nokogiri'

doc = Nokogiri::XML(File.read('C:\Apache2.2\htdocs\test\sample01.xml'))
xslt = Nokogiri::XSLT(File.read('C:\Apache2.2\htdocs\test\test01.xslt'))

print "Content-Type: text/plain\r\n\r\n"
puts xslt.transform(doc)
715デフォルトの名無しさん:2010/10/07(木) 14:24:43
>>710>>714 じゃないけど、gemが足りないときに、このgemねーぞ!!って言ってくれる仕組みないの?

Railsだとenvironment.rbに config.gem でgem名とバージョン指定しといたら、
gem足りない時も rake gems:installで一気に入れられるじゃん?

あ、今はBundler使うのだっけ?

そういうことを書き捨てスクリプトでもできないかな、と
716デフォルトの名無しさん:2010/10/07(木) 14:48:05
>>715
今年 rubygems なら gem install とするだけで依存する gem パッケージはすべてインストールされる

require 'hogehoge' としたときに LoadError なら gem search --remote hogehoge してくれるような
gem-not-found みたいなシステムは特に無いというかそれ多分うざい
717デフォルトの名無しさん:2010/10/07(木) 16:30:51
>>714

なるほど、初心者の自分にもすごいわかりやすいです。
めちゃめちゃ助かりました。
参考にしてもうひとがんばりしてみます。
ありがとうございました!
718デフォルトの名無しさん:2010/10/07(木) 18:00:16
文字列を自動変換するプログラムを作ってますが
kconvは半角カナが自動で全角カナになってしまうので
nkfで-xオプションをつかってみましたが
nkfは配列を変換することができません。
アドバイスお願い致します。

require 'kconv'

while line = gets

s = line.split(/\t/)
str = NKF.nkf('-e -x', s)

next unless str[2]

print str[0].toeuc
print " # "
puts str[1].toeuc.gsub(/ /, "\\ ")

end
719デフォルトの名無しさん:2010/10/07(木) 18:40:20
>>718
コレクションの概念がないのか
配列はただの配列だ
Array クラスの each メソッドで、要素を順に枚挙できる
['A', 'B', 'C'].each do |x|
puts x
end

自分で配列作ったら、文字列を each で枚挙させて文字列を変換すればいい
720デフォルトの名無しさん:2010/10/07(木) 21:44:27
>>716
あーいや、gemにするようなものは他のgemの依存を記述するけど、
そうじゃなくてちょっとしたスクリプトでgem使いたい時の話

gem "hogehoge"
の後にrequireするという方法あった気がするけど、今でも使えるんだっけ・・・
721デフォルトの名無しさん:2010/10/07(木) 21:53:28
>>719
出来ました。ありがとうございました。
722デフォルトの名無しさん:2010/10/07(木) 23:47:03
instance_eval にブロックだけでなく引数を渡すことはできますか。

proc_obj = proc {|x| p x }

obj = Hello.new
obj.instance_eval(&proc_obj) # ここで proc_obj のために引数も渡したい
723デフォルトの名無しさん:2010/10/08(金) 00:57:09
obj.instance_eval do
 proc_obj.call(xxx)
end
724720:2010/10/08(金) 04:59:41
bundlerでいい気がしたわ
725デフォルトの名無しさん:2010/10/08(金) 08:24:45
>>723
説明が足りてませんでした。
proc_objはselfがobjの状態で実行したいので、723の方法ではだめです。

proc_obj = proc {|x| x + @val }

class Foo
def initialize(val)
@val = val
end
end

obj = Foo.new
obj.instance_eval(&proc_obj)
726デフォルトの名無しさん:2010/10/08(金) 09:25:00
instance_execは?
727デフォルトの名無しさん:2010/10/08(金) 10:08:06
>>714
遅くなりましたが、できました!
本当にありがとうございました!
728デフォルトの名無しさん:2010/10/08(金) 10:33:34
>>726
そんなのが用意されたのですね。ありがとうございます。
ttp://d.hatena.ne.jp/rubikitch/20080526/instanceexec
なぜ今までなかったのかと聞きたいぐらい。
729デフォルトの名無しさん:2010/10/08(金) 16:21:58
>>728
何年前の話だよ、と思ったが、たった2年前か。trunkにはかなり前からあったんだけどね
730デフォルトの名無しさん:2010/10/09(土) 23:41:14
モジュールに定義した特異メソッドを、別のクラスの得意メソッドとして
利用可能にする方法はありますか。

module Mod
def self.hello
puts "Hello!"
end
end

class Klass
include Mod # NG
extend Mod # NG
#extend (class << Mod; self; end) # NG
end

Klass.hello #=> undefined method `hello' for Klass:Class (NoMethodError)

たぶんできないとは思うんですが、もしできる方法がありましたら教えて下さい。
731デフォルトの名無しさん:2010/10/09(土) 23:59:49
>>730
もし
module M
def self.eigen
end
end
としたeigenメソッドをほかのクラスの特異メソッドとして提供したいのだとしたら、
そもそもeigenメソッドをMの特異メソッドとして定義すべきではない

んで、それとは別に、C.eigen という見かけで M.eigen を「呼びたい」というだけなのなら、委譲をすればいい

require 'forwardable'
module M
def self.eigen; p "eigen!"; end
end

class C
class << self
extend Forwardable
def_delegators(M, :eigen)
end
end

C.eigen
732デフォルトの名無しさん:2010/10/10(日) 02:25:21
C言語で書いたサブルーチンをRubyプログラムから呼び出して使う方法はありませんか?
733デフォルトの名無しさん:2010/10/10(日) 03:01:28
あるぜ!
734デフォルトの名無しさん:2010/10/10(日) 03:09:51
Lispを勉強しようと思い手始めにRubyを始めました。よろしくお願いします。
735デフォルトの名無しさん:2010/10/10(日) 03:37:42
Lisp勉強したけりゃLispやったほうがいいかと
736デフォルトの名無しさん:2010/10/10(日) 04:02:45
>>732
dlってライブラリがあるよ

#include <stdio.h>
void say_hello(void) { printf("Hello!\n"); return; }

$ cc -shared greetings..c -o greetings.so

#!/usr/bin/env ruby
require 'dl'
require 'dl/import'
module Greetings
extend DL::Importable
dlload './greetings.so'
extern 'void say_hello()' # 'void say_hello(void)' だとなぜか怒られる
end
Greetings.say_hello()
737デフォルトの名無しさん:2010/10/10(日) 08:11:22
>>731
>もし
>module M
>def self.eigen
>end
>end
>としたeigenメソッドをほかのクラスの特異メソッドとして提供したいのだとしたら、
>そもそもeigenメソッドをMの特異メソッドとして定義すべきではない

まさにこれをしようとしてました。
やっぱりできないということで、別のアプローチを採用することに決定しました。
できないということがわかっただけで大助かりです。ありがとうございました。
738デフォルトの名無しさん:2010/10/10(日) 12:28:41
クラスオブジェクトを動的に作成するには
c1 = Class.new
としますが、あるクラスのサブクラスを動的に作成するにはどうしたらいいですか。
class A
end
B = A.new #=> Aのサブクラスではなくインスタンスが作られる
739デフォルトの名無しさん:2010/10/10(日) 12:47:00
サブクラスってなんですか?
740デフォルトの名無しさん:2010/10/10(日) 12:52:20
クラスがサブなことです
741デフォルトの名無しさん:2010/10/10(日) 13:00:24
>>738
Class.new(A)
としたら、Aのサブクラスが作成できました。
class A
end
B = Class.new(A)
B.class #=> Class
B.ancestors => [B,A,Object,Kernel]
742デフォルトの名無しさん:2010/10/10(日) 13:06:03
>>740
なにその「マルチメディアとはメディアがマルチ」みたいな論
743デフォルトの名無しさん:2010/10/10(日) 13:29:38
>>739 はきっと 派生クラス と言わせたい C++ 脳。
744デフォルトの名無しさん:2010/10/10(日) 13:59:13
サブクラスという名称は公式にはない、と思う
745デフォルトの名無しさん:2010/10/10(日) 14:04:43
>>744
確か、スーパークラスの説明はあってもサブクラスの説明はないんだよね
サブクラスという言葉自体は説明なしでいきなり出るはず
746デフォルトの名無しさん:2010/10/10(日) 15:15:55
ハイパークラスはありますか?
747デフォルトの名無しさん:2010/10/10(日) 18:36:21
πの計算をしたいです。Rubyでは巨大整数は扱えますが、浮動小数点は何ケタ
位計算できるのでしょうか。ニュートン法で近似していけば無限の精度で
求められますか?
748デフォルトの名無しさん:2010/10/10(日) 18:44:51
>>747
BigDecimal を使えば巨大な浮動小数点数を扱える。
749デフォルトの名無しさん:2010/10/10(日) 19:37:10
クラスという名称はなくて
スーパークラスかサブクラスかの二択

rubyでは
クラスという概念の中に
スーパークラスかサブクラスが入っている。
750デフォルトの名無しさん:2010/10/10(日) 22:11:51
RubyのJIS規格化って今どうなってんだろうな
751デフォルトの名無しさん:2010/10/11(月) 00:23:10
最終ドラフトが出てる
ここで出たコメントを反映させて、日本工業標準調査会に提出、
で審議して通れば規格化されるらしいが

http://www.ipa.go.jp/software/open/ossc/english/ruby/ruby_draft_specification.html

>JIS原案がまとめられてから、担当大臣が制定・改正するまでに、短い場合で約半年程度がかかります。
>これは、まとめられたJIS原案について日本工業標準調査会で審議を行ったり、
>またWTO/TBT協定に基づく意見受付公告(60日間)を行うなどの事務手続きを要するためです。
http://www.jisc.go.jp/qa/index.html#A108
752デフォルトの名無しさん:2010/10/11(月) 02:34:35
大臣が審査するわけか。
誰か知らないが、大臣にRubyなんてわかるのかな?
753デフォルトの名無しさん:2010/10/11(月) 06:53:45
一応エリート様なんだから解かるように書けば解かるだらう…きっと。
754デフォルトの名無しさん:2010/10/11(月) 07:27:10
>>752
お前は小学生か
755デフォルトの名無しさん:2010/10/11(月) 07:37:02
「役人や官僚がよってたかって精査して妥当と判断した結果に大臣名義ではんこ押す」という程度の意味だよな
こんなようなことが大臣個人の能力に左右されてたまるかw
756デフォルトの名無しさん:2010/10/11(月) 08:43:06
BigDecimalの使い方がよくわかりません。ライブラリをインポートしなければ
ならないのか、BogDecimalとして変数を宣言するためにはどうしたらいいのか
教えてください。
757デフォルトの名無しさん:2010/10/11(月) 08:46:48
その質問をする直前にどこの情報、サイトを見てわからなかったのかが気になる
758デフォルトの名無しさん:2010/10/11(月) 08:48:46
すみません、何も見てません。日経サイエンスという雑誌で見つけました。
759デフォルトの名無しさん:2010/10/11(月) 08:52:04
require 'bigdecimal'
a = BigDecimal::new("0.123456789123456789")
b = BigDecimal("123456.78912345678",40)
c = a + b
760デフォルトの名無しさん:2010/10/11(月) 09:08:10
BigDecimalの配列にしたいのですが、方法が解りません。
次のプログラムです。よろしくお願いします。

def pi2()
y=BigDecimal::new("0.0")
y=[20]
a=BigDecimal::new("0.0")
a=[20]
y[0]=sqrt(2)-1.0
a[0]=6-4.0*sqrt(2)
for n in 0..20
y[n+1]=(1-sqrt(sqrt(1-y[n]**4)))/(1+sqrt(sqrt(1.0-y[n]**4)))
a[n+1]=((1+y[n+1])**4)*a[n]-(2**(2*n+3))*y[n+1]*(1+y[n+1]+y[n+1]**2)
print "pi2=",1/a[n+1],"\n"
end

end
761デフォルトの名無しさん:2010/10/11(月) 10:06:06
有効桁数まで表示されません。
def sqrt()
x=BigDecimal("5.0",40)
s=BigDecimal("1.0",40)
last=BigDecimal("1.0",40)
last=last+x
if(x>1.0)
s=x
end
while(s<last)
last=s
s=(x/s+s)/2.0
# print last,"\n"
end
print "x*x=",last*last," x=",x

#print last
end
762デフォルトの名無しさん:2010/10/11(月) 10:30:51
すみません、表示できました。
計算に使う変数全部がBigDecimalでないといけないんですね。
763デフォルトの名無しさん:2010/10/12(火) 00:01:46
みんなはテキストエディタはなに使ってる?
テキストに載ってるSciTXを使ってるけど、いちいち日本設定しないといけないし正直微妙
ハイライトがしっかりしてるいいやつないかな?
764デフォルトの名無しさん:2010/10/12(火) 00:23:34
vim

でもリファクタリングとかはやっぱIDEがいいと思う今日この頃
765デフォルトの名無しさん:2010/10/12(火) 00:37:06
自分もvimだねえ。
歴史の長いエディタだけど、文字コード対応や言語別ハイライトなど
最新の要件にもよく追随している。
でもvimは学習コストが半端ないので、今から使うのはオススメしない。
サクラエディタや秀丸なんかで十分いけるんじゃないの?
766デフォルトの名無しさん:2010/10/12(火) 00:55:58
763です サクラエディタをインスコしてみました
設定が若干面倒だったけど、これよさそうですね。
これから使って見ます。
767デフォルトの名無しさん:2010/10/12(火) 02:03:35
emacs

でも、vimすげぇと思う
768デフォルトの名無しさん:2010/10/12(火) 02:27:59
普通に文章書いたりする時はサクラ
プログラミングするときはgvim
769デフォルトの名無しさん:2010/10/12(火) 04:38:01
xyzzy使ってる
770デフォルトの名無しさん:2010/10/12(火) 05:08:21
実行速度がものすごく遅いんですけど、スーパーπみたいに早く計算
することはできないのでしょうか。Cでないとだめですか?実装が
悪いのでしょうか?

require 'bigdecimal'

N=1040000

def sqrt(x)
x=BigDecimal(x.to_s,4)
s=BigDecimal("1.0",4)
last=BigDecimal("6.0",4)
a=BigDecimal("2.0",4)
k=0
if(x>1.0)
s=x
end
while(k<4)
last=s.truncate(N)
s=((x/s+s)/a).truncate(N)
# print last,"\n"
print "k=",k,"\n"
k=k+1
end
#print "x*x=",(last*last).truncate(N)," x=",x.truncate(N),"\n"

return last.truncate(N)
end
771デフォルトの名無しさん:2010/10/12(火) 06:03:22
>>770
bigdecimalの便利さをRubyによって享受したいのは大いに理解できるのだけど、
純粋な計算速度を求める場合、Rubyは不向きだし、Cのような言語と比較するとRubyはかなり遅いです。
100倍遅くても泣かないことが必要。

bigdecimalみたいな機能やライブラリがある高速な代替言語のオススメは知らんので詳しい方頼む
772デフォルトの名無しさん:2010/10/12(火) 06:56:08
BigDecimalは1回の足し算でCの足し算コードを100回以上利用しているので
Cの足し算1回より100倍以上遅いのはそれこそ足し算で当たり前
773デフォルトの名無しさん:2010/10/12(火) 07:14:41
>>772
まあ概念的にはそうなるな
774デフォルトの名無しさん:2010/10/12(火) 08:08:56
rubyでgitやdiffみたいにテキストの履歴を管理できるライブらりってありますか?
それともgitをコマンドで呼び出して使う方法をプログラム中にかけるでしょうか?
775デフォルトの名無しさん:2010/10/12(火) 08:21:09
>>774
git使うのでよいのならば、githubが利用しているライブラリが使えたと思う
776デフォルトの名無しさん:2010/10/12(火) 08:50:56
gitやdiffみたいなのがやりたいなら
gitやdiffを呼べばいい

result = `diff a.txt b.txt`
777デフォルトの名無しさん:2010/10/12(火) 08:58:51
Webアプリ全盛のこのご時世に外部シェルコマンドを `` で呼ばせる人間は今すぐ死滅していいよ
778デフォルトの名無しさん:2010/10/12(火) 09:07:06
呼ばせる、って表現としてあってるの?
779デフォルトの名無しさん:2010/10/12(火) 09:14:52
webグラマはカタコトでも通用するお仕事です。
780デフォルトの名無しさん:2010/10/12(火) 09:22:04
質問者はWebアプリとして使うと言ってるわけでもなく
diffの引数も文字列定数なのに>>777は何を怒ってるんだめんどくさい
781デフォルトの名無しさん:2010/10/12(火) 09:28:25
代替手段があってアンゼンでないものを使わせないよう習慣付けるのは大事だとは思う
1.8 で File.read 使うなとかと同レベルの話かと
782デフォルトの名無しさん:2010/10/12(火) 09:34:22
>>777
意味わかんね。
Webアプリが全盛であることと
>>774がgitを呼びたいことと
何の関連があるんだ。
783デフォルトの名無しさん:2010/10/12(火) 09:34:40
> 1.8 で File.read 使うなとかと同レベルの話かと
kwsk
784デフォルトの名無しさん:2010/10/12(火) 09:36:56
>>776を見た人が(>>774が、ではない)「そうなんだすごーい」で
result = 'diff #{file1] #{file2}'
というコードになるということに思い至らない頭が怖い

>>776を見て
「じゃあ変数で、あっ 'diff #{file1] #{file2}' だと変数が外部入力由来で file1 に ; が含まれていた場合は
任意のコマンドが外部入力者の指示で実行されちゃうね!いけないいいけないsystem使わなきゃ」
result = system('diff', file1, file2)
とか即対処できるような奴はそもそも参考にしたりせん
785デフォルトの名無しさん:2010/10/12(火) 09:37:50
質問に直接答えるか答えず黙するかどっちかにしなさい
786デフォルトの名無しさん:2010/10/12(火) 09:39:27
>>784の危険性の問題の知識がなかった>>776がキレてるだけにしか…
787デフォルトの名無しさん:2010/10/12(火) 09:39:50
おまいらけんかするなよ。みんなMatzが悪いんだ

【Ruby】なにもかもMatzのせいにするスレ【驚き最小】
ttp://kamome.2ch.net/test/read.cgi/river/1283945893/
788デフォルトの名無しさん:2010/10/12(火) 09:42:39
>>784
そんなもん、お前が危険と思ってるってだけの話じゃないか。
他人のレスに死滅していいよとか書くんじゃない。
789デフォルトの名無しさん:2010/10/12(火) 09:47:16
こうするとセキュリティ上もっと安全だよ、とか
穏やかに書けばいいんだよ。
何が死滅していいよ、だ。
横から出てきて他人の善意のレスをけなす輩は
人として許せねえ。
790デフォルトの名無しさん:2010/10/12(火) 09:52:51
セキュアなコードが書きたいならセキュアなコードの書き方を体系的に学ぶべきで
ム板の初心者スレで場当たり的に知識を仕入れてもしゃーない
791デフォルトの名無しさん:2010/10/12(火) 09:54:59
>>788
バッククォート型のシェルコマンド実行の危険性自体は太古の昔から様々な言語で指摘はされてたぞ
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c909.html
792デフォルトの名無しさん:2010/10/12(火) 10:01:17
一応 $SAFE=1 だと弾かれるこた弾かれる
$ cat a.rb
$SAFE=1
puts `cat #{ARGV[0]}`

$ ruby a.rb a.rb
a.rb:2:in ``': Insecure operation - ` (SecurityError)

が、まあたぶんそんな「不便な設定」などしないだろうな
793774:2010/10/12(火) 10:17:20
えっと質問者です。
盛り上がっているところ申し訳ないのですが、

バージョン管理スクリプト on Ruby - myhd
http://d.hatena.ne.jp/myokoym/20100609/1276091879

>>Gitといった大掛かりなソフトを使うほどでもない、でも手作業は面堂
とあるようにrubyのlibraryはないだろうかと聞いた次第です。
794774:2010/10/12(火) 10:22:47
最初考えていたのは
HTML テキスト抽出
http://s-yata.jp/apps/nwc-toolkit/text-extractor
をみて
テキストを取り出した後、
差分を表示したり、保存したり、元に戻したりするlibraryがあるかな?
と聞きたかったのです。

795デフォルトの名無しさん:2010/10/12(火) 10:36:11
戻せる時点でバージョン管理のお仕事だと思われ
796デフォルトの名無しさん:2010/10/12(火) 10:53:58
ルビ厨のコミュニケーション、コンサル能力のなさを露呈してしまった不幸な事件であった…
797デフォルトの名無しさん:2010/10/12(火) 11:39:27
RCS前提になるけど、rcsdiffコマンドを呼び出して、その差分リスト出力を加工し、
追加部分/削除部分/未変更部分をマージしたHTMLを生成するRubyスクリプトでよければ、
過去に書いたのがあるよ。今見たら、全体で128ステップほど。
diffコマンドの出力も大きな違いは無いから、改造すれば使えるかも。もし必要ならアップするよ。
798デフォルトの名無しさん:2010/10/12(火) 11:53:03
>>794
> 差分を表示したり
ttp://raa.ruby-lang.org/search.rhtml?search=diff から探そう。
> 保存したり、元に戻したり
PStoreにまるごと保存してたり、古いものを取り出したりする、じゃだめかな。
db = PStore.new("foo.db")
db['bar.txt'] = []
db['bar.txt'] << File.read("bar.txt")
db['bar.txt'] << File.read("bar.txt")
db['bar.txt'].first

これらをひっくるめたものというとライブラリというよりは
アプリケーションのような気がする。Wikiエンジンとか。
799デフォルトの名無しさん:2010/10/12(火) 17:42:45
>>777
>Webアプリ全盛のこのご時世に外部シェルコマンドを `` で呼ばせる人間は今すぐ死滅していいよ
ふつうにさ、
 `` は安全性に問題あるからsystem使った方がいいよ
と書けばいいだけなのに、なんであんな書き方するんだろうね。
これはRuby連中のコミュニケ―ション力がないといわれても仕方ない。
#でもきっと本人は、自分は正しいことを言っていると思ってるから、改善しないんだろうな。

>>789
>こうするとセキュリティ上もっと安全だよ、とか
>穏やかに書けばいいんだよ。
ですよねー
800デフォルトの名無しさん:2010/10/12(火) 17:49:04
>>721 です
>>714 のアドバイスのおかげで順調に作業が進んでいたのですが、
いざブラウザに表示するとなった段階で問題が発生しました。
いろいろ調べたり勉強したりはしたものの、
いまだに解決の糸口がつかめないので質問させていただきます。

>>714 のソースをブラウザで表示しようとすると
500 Internal Server Error になります。

http://blog.tofu-kun.org/071220192353.php

を参考にブラウザに表示したエラーログを以下に貼りつけます。


*** CGI Error List ***
#<TypeError: can't convert nil into String>
C:/Ruby/lib/ruby/1.9.1/rubygems/config_file.rb:56:in `join'
C:/Ruby/lib/ruby/1.9.1/rubygems/config_file.rb:56:in `<class:ConfigFile>'
C:/Ruby/lib/ruby/1.9.1/rubygems/config_file.rb:28:in `<top (required)>'
<internal:lib/rubygems/custom_require>:29:in `require'
<internal:lib/rubygems/custom_require>:29:in `require'
C:/Ruby/lib/ruby/1.9.1/rubygems.rb:1110:in `<top (required)>'
<internal:lib/rubygems/custom_require>:29:in `require'
<internal:lib/rubygems/custom_require>:29:in `require'
C:/Apache2.2/htdocs/test/nokogiri.rb:17:in `<main>'


なんども申し訳ありません。よろしくお願いいたします。
801デフォルトの名無しさん:2010/10/12(火) 17:54:54
``がダメなら、外部コマンドを呼んでその出力がほしいときはどうするのpopen?
802デフォルトの名無しさん:2010/10/12(火) 18:06:38
>>799
既に収束した20レス以上も前のレスを穿り返すような人間が何言っても説得力ないな
803デフォルトの名無しさん:2010/10/12(火) 18:19:32
>>800
nil ですエラー見せられても正直見当もつかんが、
とりあえずrequire する gem パッケージ名と同名のファイルはやめとけ
require 'nokogiri' と書いた nokogiri.rb を実行するとか混乱するぞ
804デフォルトの名無しさん:2010/10/12(火) 18:40:22
>>803
>とりあえずrequire する gem パッケージ名と同名のファイルはやめとけ
たしかにそうですよね、変更しました。
ありがとうございます。

>nil ですエラー見せられても正直見当もつかんが
なにか他にお知らせできそうなことがなさそうか探してみます。
805デフォルトの名無しさん:2010/10/12(火) 18:42:56
>>802
777本人様ですか?お疲れさまです。
20レス前のことを話題にされるとお困りでしょうか?以後気をつけます!
806デフォルトの名無しさん:2010/10/12(火) 18:46:34
>>800
エラーメッセージの意味は分かる?
>#<TypeError: can't convert nil into String>
とあるから、「nilをStringに変換できない」という意味なんだが。
#もし分かってたらすまん。
だからconfig_file.rbの56行目を見て、joinしているものの中にnilになってるものが
ないかどうか調べたらいいんじゃないかな。



807デフォルトの名無しさん:2010/10/12(火) 19:03:20
>>806

なるほど!そういう意味ですか、全くわかってなかったです。
ということはこのファイルをコマンドプロンプトでステップ実行して
調査すれば、光が見えてきそうな感じでしょうか。
ちょっとやってみます。
808デフォルトの名無しさん:2010/10/12(火) 21:49:07
>>807
ステップ実行するまでもなく、データをpとかinspectとかで表示させればいいよ。
config_file.rbの56行目がどうなってるか見せてもらわないと分かんないけど、
たとえば "".join(list) とかだったら p list とか puts list.inspect とかして
データの中身を調べればいい。
809デフォルトの名無しさん:2010/10/12(火) 22:14:21
ステップ実行ならどこか当たりをつけてpとかソース書き換えるまでもなく調べられますよね
810デフォルトの名無しさん:2010/10/12(火) 23:52:09
ステップ実行ができるならそれにこしたことはない。
エラーメッセージが読めてない程度の初心者にはデバッガは難しいと思って
printデバッグを進めたのだが、杞憂だったようだすまん。
最近のIDEならデバッガ付いてるもんな。
811デフォルトの名無しさん:2010/10/13(水) 01:45:03
ruby のデバッガといえば rdb
812デフォルトの名無しさん:2010/10/13(水) 02:05:42
なんかアンダースヘルスバーグがC#で開発する時も
デバッガよりもprintfデバッグをよく使うそうで
てめえの言語には立派なIDEがあるのにw
813デフォルトの名無しさん:2010/10/13(水) 05:34:43
質問があります。
ちょっとしたメソッドに渡す引数をメソッド側をなるべく変化させずに遅延評価させるうまい方法はないものでしょうか?

例えば、

hoge :value => lambda{ rand(100) }

というようなhogeメソッドの呼び出しで、名前付き引数のように利用されている:valueの指定を
メソッドが呼ばれるときに引数をすぐに評価するのではなく、
メソッド内で必要になったときに評価する方法はないものか?と思っています。
上の例ではvalueを遅延評価させたい意図です。

この例の場合、通常はhogeメソッド側で、ハッシュの引数をoptionsとして受け取って、
options[:value] = options[:value].call if options[:value].respond_to?(:call)
というようなProc的な値かどうかで場合分けの処理が必要になってきます。

しかし、できればhogeの方に手を入れずに上手く処理することができれば?と思ってます。
814デフォルトの名無しさん:2010/10/13(水) 11:41:13
httpサーバーというものが何をやってるのかを知りたいと思い
ちょうどrubyの勉強中でもあったのでwebrickのソースを読もうとしていますが、
ruby/lib/webrickの中にたくさんソースがあってどれから読んだらいいのか分からないです
どれから読んだらいいんでしょうか?
815デフォルトの名無しさん:2010/10/13(水) 11:47:04
>>814
やめとけ
素直にCで書かれた小型のWebサーバのソース読め
WEBrickは単純なレスポンダ以外の動作もさせるように小細工埋め込まれまくりだから混乱するぞ
816デフォルトの名無しさん:2010/10/13(水) 11:53:46
一般論としては、自分でサーバ作るのでなけりゃHTTPの勉強で充分な気もする
817デフォルトの名無しさん:2010/10/13(水) 12:33:05
>>815,816
あれ?なんか色んなブログやら何やらで
「webrickのソースは綺麗だからrubyの勉強にもなるし読んでみるといいよ!!」
みたいなこと言われたから、容易に読めるもんなのかと思ってました。

確かにその割にはブログでwebrickのソース解説してるしてるとこ
見たことないしな…
818デフォルトの名無しさん:2010/10/13(水) 12:39:31
Rubyの勉強にはなるんだけど、
Webサーバがナニをどうするものなのかという事前知識はどーしても要る
ファイル名を見てサーバ構造を想像できるくらいの基礎知識だ

あと、余談だが、WEBrick の利用自体はわりと小難しい
819デフォルトの名無しさん:2010/10/13(水) 12:42:35
>>817
Rubyでウェブサーバを作ろうと思った人がソースを読むとニヤニヤできるという意味で、勉強になる
Rubyの知識が浅い人、HTTPの知識のない人、Webサーバ作ったことのない人にとっては大変難解
820デフォルトの名無しさん:2010/10/13(水) 12:48:08
「HTTPとCGI/ASPを実現可能なプログラムが綺麗なわけないじゃん」
というたいへんありがたーい言葉がございましてですな
(「HTTPとHTMLを解釈可能なプログラムが綺麗なわけがない」というのもあり)
821デフォルトの名無しさん:2010/10/13(水) 12:59:50
Rubyの面白いテクニックをいろいろ知ることはできるけど、理解できるのは多分中級者以上。
初心者が勉強のために読むのはすすめられない。
822デフォルトの名無しさん:2010/10/13(水) 13:19:21
どうもです
もう少しrubyとかhttpとかの勉強をしてから挑戦してみることにしました
有難うございました。
823807:2010/10/13(水) 13:25:42
>>810

誤解させてすみません。
print デバッグを選択しなかったのは「ステップ実行できる」からじゃなく、
素人考えで、なんとなくこちらの方が王道なのかなと思っていたのと、
Ruby のデバッグ方法を検索して参考にしたのがこちらのブログだったからです。
http://asaasa.tk/wiki/index.php?Ruby%2FDebug

それと自分は IDE じゃなくって Vim を使ってます(初心者ですが)。
いちど Netbeans を使おうとしたのですが、なんとなくやめてしまいました。

最初は Vim で Ruby のデバッグをしようと思っていたのですが、
「Vim Ruby デバッグ」で検索しても特にヒットしないので、
おそらく Vim でやるというのは一般的ではないのだろうと判断して、
今のところはコマンドプロンプトを使ってやっています。
824807:2010/10/13(水) 13:27:12
肝心の56行目なのですが、
SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'gemrc'
とありました。
わからないなりにステップ実行してみた結果が以下ですが、
さらにわからなくなった気もしています。
もしかしたらやり方を間違っているのかも知れません。
825807:2010/10/13(水) 13:29:29
さきほどから改行が多すぎると怒られるので、
関係ありそうな気がするあたりからコピーします。
連投してすみません。

config_file.rb:50: require 'etc.so'
(rdb:1) s
<internal:lib/rubygems/custom_require>:29:
(rdb:1) s
config_file.rb:51: Etc.sysconfdir
(rdb:1) s
config_file.rb:56: SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'gemrc'
(rdb:1) s
config_file.rb:57: puts file.inspect
(rdb:1) s
config_file.rb:57: `' (NilClass)
from config_file.rb:57:in `<class:ConfigFile>'
from config_file.rb:28:in `<main>'
config_file.rb:57: puts file.inspect
(rdb:1) s
config_file.rb:57:in `<class:ConfigFile>': undefined local variable or method `file' for Gem::Config
File:Class (NameError)
from config_file.rb:28:in `<main>'
826デフォルトの名無しさん:2010/10/13(水) 15:58:38
>>813
特にはできないと思う。本当にやりたいことは何かを書けば別の解決策があるかもしれない。

>>814
Rubyの勉強が目的なら「Ruby 添削」でぐぐって出てきた記事を読むのがいちばんいい。
他の人が書いているように Webrick をいきなり読むのはあまりお勧めできない。

>>824
56行目がほんとうにその通りなら、system_config_path の結果が nil であるせいでエラーになってる。
system_config_path が何者なのかはしらん。
827デフォルトの名無しさん:2010/10/13(水) 16:05:23
>>813
hogeの内部処理がどうなっているかによるが、
Hashのラッパークラスを作って遅延評価するインデクサを付加できる様にしてみるとか。
828827:2010/10/13(水) 16:08:03
この場合、ラッパーではなくサブクラスだな。
用語の使い方が不適切ですまん。
829デフォルトの名無しさん:2010/10/13(水) 16:25:04
このデバッガどうですかね?
自分の環境では、gem install ruined ってしたらエラーが出たけど。。。

browser base debugger
http://comments.gmane.org/gmane.comp.lang.ruby.japanese/6654
830デフォルトの名無しさん:2010/10/13(水) 18:32:28
perlでコーディングしたことのある人がRubyをやろうとしたら無理ありますか?

http://sabatobi.com/esthe-one
831デフォルトの名無しさん:2010/10/13(水) 19:03:37
Rubyでファイルを読み書きするにはどうすればいいですか?
832デフォルトの名無しさん:2010/10/13(水) 19:13:48
>>830
全く無問題。
自分もPerlを使っていたんけど、OOPをやりたくなってRubyに乗り換えた一人。
言語の文法もPerlと似ている(= Perlユーザにも違和感のない設計になっている)。
Matz氏は「RubyはPerlの皮を被ったSmalltalkである」と語っているし。

基本的なオブジェクト指向から順々に理解していけば、Perlが使える人なら、たやすいと思う。
ただし、最近はRailsの影響で「メタプログラミングを駆使するのがRuby流である」という風潮がある。
これに惑わされず、Perlで学んだ「読み易いプログラミング作法」をRubyに活かしていけばいい。
833デフォルトの名無しさん:2010/10/13(水) 19:58:09
834デフォルトの名無しさん:2010/10/13(水) 20:18:25
なかなか恥ずかしいことしてるな
835デフォルトの名無しさん:2010/10/14(木) 00:43:37
perlの皮をかぶったlispじゃなかった?
smalltalkに似てるのは偶然で参考にした覚えはない、って言ってた様な
836デフォルトの名無しさん:2010/10/14(木) 01:11:26
これのどこがlispやねん
837デフォルトの名無しさん:2010/10/14(木) 01:16:02
いや、東大かどこかの教授が言ってたよ。
RubyはカッコのないLispだって。
838デフォルトの名無しさん:2010/10/14(木) 01:27:08
『はじめてのRuby』で
「ALGOLの皮を被ったLisp」と紹介したのがyugui氏

>>837
そういえば、教養学部でRubyを採用した背景には
Lisp系教授の支持があったかららしいがw
839デフォルトの名無しさん:2010/10/14(木) 01:29:31
ALGOLの皮を被ったLisp?
840813:2010/10/14(木) 01:53:34
>>826-827
考えた挙句、汎用的に書いてしまったのですが、せっかくなので具体的に書いてみます。

元々はCapistranoのCapfileスクリプトにて、リモートに接続する環境(ユーザー名やパスワード等)をタスクごとに簡単に切り替えたく、
 set :user, "ユーザー名"
のようにCapistrano内部でも使われる変数を局所的に変化させる方法はないものか?という問題です。

Capfileの各タスクでは、set :user, "他のユーザー名" という指定で上書きしてしまうこともできるのですが、
他のタスクにもグローバルに影響を与えてしまいます。
Aタスクで上書きしたuserが、他のBタスクにも影響を与えます。
このsetも曲者でブロックを取って遅延評価させられるのですが、
そのため単に一時的に退避して切り替え(pushしてpopするような)てということがしにくくなっています。

ただ、このuser他いくつかの設定は、roleという設定に指定でき、タスク自身は指定したroleでだけで実行させられ、
つまりroleでuserを指定すれば擬似的にuserを一時的に切り替えることが出来ます。
(ソースをよんだかぎり、グローバルなuserよりもroleで指定したuserが優先されます)

ところが、roleでuserを指定する場合、

 role :role_name, "example.com" :user => other_user

というように指定しますが、other_userはこのroleの設定を読むときに評価されてしまうのです。
other_userが固定ならばそれでもかまわないのですが、この場合setのときに使っているような遅延評価ができません。

setのような指定であれば、
 set(:user){ Capistrano::CLI.ui.ask("other user name: "){|q| q.default = "baribari_denka" }
というように、ユーザーからの情報の入力が必要な場合にブロックで渡すことで、
userが最初に使われた時、つまり、fetch("user")されたときや、内部的にmethod_missingにより単にuserとして参照されたときに初めて入力を促すことができます。

roleの例では、利用するつもりはないのにユーザー名を聞かれてしまいます(setではそうならない)
841813:2010/10/14(木) 01:56:11
長くなってわかりにくくなってしまいました。

Capistranoではそもそもuserはあまり変えないよ、という話はそうなのかもしれませんし、
Capistranoでやりにくいところは、moonshineのようなShadowPuppetや、Chefを使えということかもしれません
842デフォルトの名無しさん:2010/10/14(木) 08:41:06
>>840
ごめん理解できなかった。
だれか助けてあげて。

> そのため単に一時的に退避して切り替え(pushしてpopするような)てということがしにくくなっています。
自分でpush/popを定義するというのはなし?
843デフォルトの名無しさん:2010/10/14(木) 08:47:26
RMD160のメッセージダイジェストについて質問です。
initialize wrong number of argument 1 for 0 ArgumentError
となり実行できません。SHAは動くのにどこが悪いのでしょう。

require 'digest/rmd160'
RMD160=Digest::RMD160
class String
def rmdhex
RMD160.new(self).hexdigest
end
end
844デフォルトの名無しさん:2010/10/14(木) 08:51:04
ruby 1.9 だとエラーにならないので、多分バグ
845デフォルトの名無しさん:2010/10/14(木) 09:02:44
バグというかリファレンスが間違ってるんじゃね
846デフォルトの名無しさん:2010/10/14(木) 09:13:29
こうじゃね?
d = Digest::RMD160.new
d << "foobar"
p d.hexdigest
847デフォルトの名無しさん:2010/10/14(木) 09:24:25
1.8ブランチの先端でも1.8.5でもエラーにならなくて、1.8.7p248ではエラーになるので、どうもかなり
特定の版だけエラーになるっぽい。

とりあえず回避策としては、特異メソッド版のほうを使って、
RMD160.hexdigest self とすればいいと思うのだけど、なんか特異メソッド版と
ふつうのメソッド版とで返してくる値が違うようで、なんか変だな。
848デフォルトの名無しさん:2010/10/14(木) 09:32:41
あれ?1.8.7p248だとSHAもダメだな。
ほんとにSHAでは動いてる?
849デフォルトの名無しさん:2010/10/14(木) 09:33:06
エラーが出なくなりました。ありがとうございます。
結果も確認しました。よくわからないで使っているので理解できるように
がんばりたいと思います。
850デフォルトの名無しさん:2010/10/14(木) 09:57:58
>>849
悪いんだけど >>848 の質問に答えてもらえないかな?
直さなきゃならないところを絞るのが楽になるので。
851デフォルトの名無しさん:2010/10/14(木) 10:08:38
これは動いています。
http://sky.geocities.jp/tcshacina/test.rb
852デフォルトの名無しさん:2010/10/14(木) 10:24:52
あー了解
digestのDigest::SHA1じゃなくて、sha1のSHA1を使ってたわけね
853デフォルトの名無しさん:2010/10/14(木) 10:39:53
すみません、どう違うのか教えてください。
854デフォルトの名無しさん:2010/10/14(木) 10:45:39
機能は同じですが、違う(古いのと新しいの)ライブラリです
855デフォルトの名無しさん:2010/10/14(木) 10:52:44
両方で動かすためには

require 'digest/sha1'
SHA1=Digest::SHA1

class String
def sha1hex
SHA1.hexdigest self
end
end

の書き方の方がいいのでしょうか。
856デフォルトの名無しさん:2010/10/14(木) 10:58:02
digestが使えるrubyを使っているのであればそのほうがいいでしょう。
857デフォルトの名無しさん:2010/10/14(木) 11:01:45
ありがとうございました。
858832:2010/10/14(木) 11:09:21
リンク先も確認せず脊髄反射でカキコして、ああ恥ずかしい ...orz

>>835-839
「RubyはPerlの皮を被ったSmalltalkである」の発言は、以下の書籍の p.477 からでした。

 オブジェクト指向スクリプト言語 Ruby - まつもとゆきひろ著
 http://ascii.asciimw.jp/books/books/detail/4-7561-3254-5.shtml

ただ、ちょいと勘違いしてました。この部分を指した、誰かの発言(blog?)と混同してたようです。
書籍の該当部分(p.477)を引用しときます。

 .... Rubyは「Perl的なSmalltalk」というあだ名があるくらいです(*18)。 ....
 ________
 *18 決して「Smalltalk的なPerl」ではないところが非常に重要です。
859デフォルトの名無しさん:2010/10/14(木) 16:59:53
乱数として32バイト整数を入力したいのですが、以下の方法以外に
直接的な方法はありますか?

salt=[OpenSSL::Random.random_bytes(32)].pack("m")
salt.each_byte{|c| int=(int<<8)^c}
salt=int
860デフォルトの名無しさん:2010/10/14(木) 17:15:09
OpenSSLの機能を使ってRubyでRSA暗号とかは使えますか?
861デフォルトの名無しさん:2010/10/14(木) 18:38:24
>>859
MTでよければ
rand(2**(32*8)) か Random.rand(2**32*8)) (1.9.2)

暗号的には
require 'securerandom'
SecureRandom.random_number(2**(32*8))
とか。

>>860
OpenSSL::PKey::RSAとかOpenSSL::Cipherとか調べるとよいのでは?
862デフォルトの名無しさん:2010/10/14(木) 20:20:46
ファイルから32バイトずつ読み込んで、32バイト整数として演算したい
のですが、以下の方法以外に効率的なやり方はありませんか?

while((str=f.read(32))!=nil)
c=0
salt=0
str.each_byte{|c| salt=(salt<<8)^c}
eadd(@Gen_key_x,@CRV_G_x,@Gen_key_y,@CRV_G_y,@CRV_p)
salt^=@T_y
g.write(salt)
g.write("\n")
end
863デフォルトの名無しさん:2010/10/14(木) 20:25:19
少しは自分で作れよ
864デフォルトの名無しさん:2010/10/14(木) 20:28:58
自分なりに考えたんですが余りに遅いので・・・
865デフォルトの名無しさん:2010/10/14(木) 20:53:14
String#unpack でq/Qを使うと64ビット整数に分割できるから
少しは速度が上がるかも。
866デフォルトの名無しさん:2010/10/14(木) 22:38:59
>ファイルから32バイトずつ読み込んで

これが遅い原因
867デフォルトの名無しさん:2010/10/14(木) 22:44:40
処理のブロックが32バイトなんです。
最初に全部読んでもその後の処理を分割しなければならないかと。
そんなことないですかね。
868デフォルトの名無しさん:2010/10/14(木) 23:17:07
バファリングはされてるだろうからIOはそんなに律速しない気がするなー
(などとコードも動かさずに寝言を言ってみる)
869デフォルトの名無しさん:2010/10/14(木) 23:22:48
f.readとかやるとメモリいっぱい読み込むんですよね。
その後いっぺんに処理して、いっぺんに書きこむみたいな?
870デフォルトの名無しさん:2010/10/14(木) 23:32:26
バッファリングされたデータを32バイト毎にXORして最後に書き込み
という操作をすればいいですか。
871デフォルトの名無しさん:2010/10/14(木) 23:49:01
g=open(file,"wb")
g.write(salt)
これでファイルがバイナリじゃなくて数字になるのはなぜですか。
872デフォルトの名無しさん:2010/10/15(金) 01:26:40
>>871
バイナリモード/テキストモードってのはWindowsなどに備わってるモードで
読み書きの際、改行コードなどの処理が変わる、というもの。
Ruby的には「バイナリモードとOSに伝えるか否か」の違いしかない。
バイナリデータを読み書きしたいのであれば
ファイルをバイナリモードで開くだけでなく
packやunpackを使っての変換が必要。
873デフォルトの名無しさん:2010/10/15(金) 02:02:26
>>799
一応注意しておくけど、system()もパイプやリダイレクトを使うと /bin/sh 経由の実行になるから、
``と同じ程度に危険。
874デフォルトの名無しさん:2010/10/15(金) 02:21:32
変換できません。
`pack': can't convert Bignum into String (TypeError)
875デフォルトの名無しさん:2010/10/15(金) 08:37:11
なんかコミュニケーション能力に欠けた質問者だな。
876デフォルトの名無しさん:2010/10/15(金) 08:59:33
今日も来るのでお楽しみに!
餌やった奴は責任持って処分するように
877デフォルトの名無しさん:2010/10/15(金) 11:47:13
nokogiri のインストールに失敗します。
以前同じ条件でやってうまくいってたと思ったのですが…。
Windows 7 の 64bit 版で Ruby 1.9.2 です。

C:\Windows\system32>gem install nokogiri
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.

C:/Ruby/bin/ruby.exe extconf.rb
checking for libxml/parser.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--srcdir=.
--curdir
--ruby=C:/Ruby/bin/ruby
--with-zlib-dir
--without-zlib-dir
--with-zlib-include
--without-zlib-include=${zlib-dir}/include
--with-zlib-lib
--without-zlib-lib=${zlib-dir}/lib
878デフォルトの名無しさん:2010/10/15(金) 11:48:50
--with-iconv-dir
--without-iconv-dir
--with-iconv-include
--without-iconv-include=${iconv-dir}/include
--with-iconv-lib
--without-iconv-lib=${iconv-dir}/lib
--with-xml2-dir
--without-xml2-dir
--with-xml2-include
--without-xml2-include=${xml2-dir}/include
--with-xml2-lib
--without-xml2-lib=${xml2-dir}/lib
--with-xslt-dir
--without-xslt-dir
--with-xslt-include
--without-xslt-include=${xslt-dir}/include
--with-xslt-lib
--without-xslt-lib=${xslt-dir}/lib
C:/Ruby/lib/ruby/1.9.1/mkmf.rb:368:in `try_do': The complier failed to generate an executable file.
(RuntimeError)
You have to install development tools first.
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:446:in `try_compile'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:853:in `block in find_header'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:693:in `block in checking_for'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:280:in `block (2 levels) in postpone'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:254:in `open'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:280:in `block in postpone'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:254:in `open'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:276:in `postpone'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:692:in `checking_for'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:852:in `find_header'
from extconf.rb:99:in `<main>'
879デフォルトの名無しさん:2010/10/15(金) 11:53:45
64bit版Ruby用のバイナリを用意してるgemパッケージなんて存在しないんじゃなかろうか
880デフォルトの名無しさん:2010/10/15(金) 12:01:21
ruby -v で [mswin32] か [mingw32] が表示されない Windows 版 Ruby なのなら、
gem 用に自前でコンパイラ用意しないと駄目だと思う
881デフォルトの名無しさん:2010/10/15(金) 12:08:10
>>880
ruby 1.9.2p0 (2010-08-18 revision 29036) [x64-mswin64_80]
でした。たぶん以前は32bit版を使ってたんでしょうね、お騒がせしました。

ところで 32bit 版 Ruby を 64bit 版 Windows で使用することで、
何かまずいことってありますか?
開発環境を慣れない Ubuntu に移すかどうか迷っています。
882デフォルトの名無しさん:2010/10/15(金) 12:23:01
特にない
たま〜にへちょいgemインストーラが
「64ビット版Windowsを確認!ということはつまり64ビット版Rubyだな!」とか条件分岐するが
そんなのは焼いて捨てちゃってよし
883デフォルトの名無しさん:2010/10/15(金) 12:38:03
>>882
ありがとうございます、焼いて捨てます。
884デフォルトの名無しさん:2010/10/15(金) 16:12:57
32bitプロセスからは普通にはアクセスできないフォルダやレジストリがあるけど、実用上は問題ないと思う。
885デフォルトの名無しさん:2010/10/15(金) 16:22:51
sprintfでアスキー変換できない数値を識別する関数はありますか?
886デフォルトの名無しさん:2010/10/15(金) 16:34:03
>>884
>32bitプロセスからは普通にはアクセスできないフォルダやレジストリがあるけど、実用上は問題ないと思う。

そういったケースに出くわした場合、なにか対処が必要ですか?
また、その場合通常エラーメッセージなどでアラートがされるのでしょうか?
887デフォルトの名無しさん:2010/10/15(金) 17:27:06
>>885
もうちょっと詳しく。
どういう書式文字列で、どんな型の数値を整形したいのか具体的に。
888デフォルトの名無しさん:2010/10/15(金) 17:56:38
ファイルの処理の時なんですが、パディングする代わりに
アスキー文字に変換できない文字は無視して書き込むという
処理をしようとしてました。以下のプログラムです。
アスキーコードをアスキー文字に変換して書き込みます。
while(l>0)
i=0
while(i<ls)
salt[i]=l&0xff
salt[i]=sprintf("%c",salt[i])
l=(l>>8)
i=i+1
end
end
また書き込んだデータがアスキー数値になっているのでファイルサイズ
が大きいのでバイナリにpackしたいのですがうまくいきません。
バイナリファイルの読み書きも教えてください。よろしくお願いします。
889デフォルトの名無しさん:2010/10/15(金) 18:05:52
890デフォルトの名無しさん:2010/10/15(金) 22:35:01
>>886
884じゃないけど、32ビットアプリからの\Windows\System32へのアクセスは自動的に\Windows\syswow64に
リダイレクトされる。例えば32ビットアプリからはsystem32下のdefrag.exeは呼び出せない
(syswow64にはdefrag.exeがない)。

どうしても本当のsystem32にアクセスしたい場合はVista以降では\Windows\Sysnativeにアクセスする方法がある。
XP/2003ではWin32APIでWow64DisableWow64FsRedirectionを呼び出してリダイレクションを無効化する。

レジストリはHKLM\SoftwareへのアクセスがHKLM\Software\Wow6432Nodeにリダイレクトされる。
こっちはWin32APIでRegDisableReflectionKeyかな。
891デフォルトの名無しさん:2010/10/15(金) 23:44:21
>>877
コンパイル環境がないみたいだけど、devkitいれたら解決するとかそういう問題ではないのか
892デフォルトの名無しさん:2010/10/16(土) 03:55:48
module Kuso
  class Shine
    def baka
      puts "omaegana"
    end
  end
end

というのを、短く書く方法はないでしょうか?
def Kuso::Shine.baka
  puts "omaegana"
end

だと、.bakaのところでsyntax errorになります。

この編の仕様についてのドキュメントはありませんか?
893892:2010/10/16(土) 04:13:20
def (Kuso::Shine).baka
  puts "omaegana"
end

最初が式ならこれでいける、と思ったのですが、、、
そもそも後者のような書き方だとクラスメソッドになってしまうんですね
894デフォルトの名無しさん:2010/10/16(土) 04:43:21
>>892-893
クラスの部分だけなら繋げて

class Kuso::Shine
  def baka

と出来るが…classの部分も繋ぐのはちょっと苦しいかな。
もしかしたら出来るかも知れんが、たぶん解りにくくなるだけだと思う。
せいぜいセミコロンで2行を纏めて

class Kuso::Shine; def baka
  〜
end; end

程度が限界か。



def foo.bar

って感じの書き方は、正確には特異メソッドの定義。
クラスメソッドは特異メソッドの一種だから、クラスメソッドの定義にも使える。
895デフォルトの名無しさん:2010/10/16(土) 11:08:28
なぜMatzという老害がいつまでもコミュニティに
巣食って発言力維持しようとしているのですか?
言語の発展に寄与しない老害がなぜ強いのですか?

ごみ言語だから問題ないの?
896デフォルトの名無しさん:2010/10/16(土) 11:30:07
>>895
3点(100点満点中)

こちらで修行してから出直してください
http://hibari.2ch.net/test/read.cgi/tech/1249737531/
897デフォルトの名無しさん:2010/10/16(土) 12:41:16
ごみって>>895自身のことだと思うの。Matzが消えたら困る人が世界のいたるところにいるけど、895が消えてもだれも困らないと思うの。
だから895のことはそっとしておいてあげよう。
898デフォルトの名無しさん:2010/10/16(土) 13:29:27
RubyってMatzいないとメンテ出来ないの?
なんとかなるんじゃないの?
899デフォルトの名無しさん:2010/10/16(土) 13:57:20
>>898
コードの追加は誰でもできるが、
それを本家crubyとして認めるかどうか(厳密には認めないかどうか)の権限が
まつもとゆきひろにある
その機能は本家Rubyではないと言ったらそのコードは追加されない

そんだけ
方向性の強い決定権を持ってるから、今のところはいなくなると困る
githubのライブラリにおける、pullリクエストの認証者のような立場
900デフォルトの名無しさん:2010/10/16(土) 15:03:24
pack、unpackの使い方がわかりません。
現在データがアスキー数字で書き込まれています。
バイナリでファイルを書き込む方法を教えてください。

while((str=f.read(32))!=nil)
salt=0
str.each_byte{|c| salt=(salt<<8)^c}
eadd(@Gen_key_x,@CRV_G_x,@Gen_key_y,@CRV_G_y,@CRV_p)
salt^=(@T_y%(2**8*str.size))
@Gen_key_x=@T_x
@Gen_key_y=@T_y
g.write(salt)
g.write("\n")
end
901デフォルトの名無しさん:2010/10/16(土) 15:08:05
お、きたな
902デフォルトの名無しさん:2010/10/16(土) 15:40:10
うむ


というか、残念ながら pack/unpack は「Rubyではない」ので、
これに関しては専門の解説を別途参照することをお勧めする
Ruby っぽく実装された gem があれば人気が出そうな蛇足になりそうな微妙な感じ
903デフォルトの名無しさん:2010/10/16(土) 15:48:39
というかこの一連のは素直にRuby以外の"元の言語"でやったほうが効率的なんじゃあ…
904デフォルトの名無しさん:2010/10/16(土) 16:03:14
たしかこの質問者の扱っている整数はpackで扱える64ビット整数を
超えていたよーな記憶。
905デフォルトの名無しさん:2010/10/16(土) 16:46:12
packで扱える数には大きさの制限があるのですか?知りませんでした。
試しに
g.write([salt.to_s].pack("B*"))
と書き込んで
l=l.unpack("B*")
とやると2進数でなく10進数と解釈されます。
配列の先頭に0bを入れても文字列として解釈され10進数にはなりません。
どうすればいいですか?
906デフォルトの名無しさん:2010/10/16(土) 17:28:11
別に暗号化後のファイルの大きさが倍増することを問題にしなければ
どうでもいい問題なのですが、解決できるなら解決したいと思い投稿してます。
暗号化ファイル形式がアスキー数字というのも気になります。
907デフォルトの名無しさん:2010/10/16(土) 17:37:10
Rubyはスクリプトながら高機能で暗号の実装に適しているツールが
呼び出せるので遊びで使う分には問題ないけど、100M暗号化する
のに800分もかかるとスクリプトではもう限界かと思う今日この頃。
908デフォルトの名無しさん:2010/10/16(土) 17:46:57
pack('B*') は *2進数を表す文字列* からバイナリ文字列を作る。

["0000111111110000"].pack('B*')
=> "¥x0F¥xF0"

他には、たとえば
[ 65534, 65534 ]
という配列をリトルエンディアン2バイトとビッグエンディアン2バイト
計4バイトのバイナリ文字列に変換したいなら
* v:16ビット整数(リトルエンディアン)
* n:16ビット整数(ビッグエンディアン)
なので、
[ 65534, 65534 ].pack('vn')
#=> "¥xFE¥xFF¥xFF¥xFE"
のように使う。

packで使える記法を調べると、64ビット整数までは扱う記法があるが、
それより大きいのはないので、2**64 で割っていった余りの配列に対して
変換を行えばいいんじゃないだろうか。

909デフォルトの名無しさん:2010/10/16(土) 17:57:29
私がむしろ問題に感じているのは、10進数から2進数に変換する処理
はあるのに、2進数から直接10進数に変換できる関数がないという所
です。出力をみると64ビッを超えていても2進数の文字列として
packされているようなのですが、unpackした結果は10進数扱いの
2進数文字列なのです。配列の先頭に0bをつけてもだめでした。
どうして?
試しに
scanf("%b",l.unpack("B*"))
とかやるとさらに大きな数に変換されます。
910デフォルトの名無しさん:2010/10/16(土) 18:03:16
"0b1111111111111111".to_i(2)
#=> 65535

二進数と二進数文字列とバイナリの区別ついてないんじゃ?
911デフォルトの名無しさん:2010/10/16(土) 18:07:27
packされてませんでした。ファイルサイズが半分になってました。
unpackの出力が何を意味しているのかわかりません。
912デフォルトの名無しさん:2010/10/16(土) 18:17:55
二進文字列を期待してto_i(2)をするとエラーになります。
undefined method to_i for #Array:XXX
913デフォルトの名無しさん:2010/10/16(土) 18:26:19
to_iは文字列のメソッド。

エスパーじゃないので何をどうしたのか知らないけど
Arrayが返って来てるんならそりゃエラーになるわ。
914デフォルトの名無しさん:2010/10/16(土) 18:34:03
g.write([salt.to_s].pack("B*"))したものを、
open(ARGF.filename + ".ecc") {|file|
while l = file.gets
l=l.unpack("B*").to_i
とするとエラーになります。基本的なところが解りません。
915デフォルトの名無しさん:2010/10/16(土) 19:02:27
salt.to_s と pack('B*') の時点で間違っている。

# 巨大な数 salt をバイトごとの配列に変換(packが使えないので原始的に)
bytes = []
while salt > 0
salt, byte = salt >> 8, salt & 0xff
bytes.unshift(byte) # 望むエンディアネスによっては push かも。
end
# バイトの配列をバイト文字列として書き出す
open('file', 'wb') {|out| out.print(bytes.pack('C*')) }

value = 0
# バイナリデータを読み込んでバイト列に分解
raw = File.binread('file').unpack('C*')
# 数を復元
until raw.empty?
value = (value << 8) + raw.shift
end
916デフォルトの名無しさん:2010/10/16(土) 19:31:42
エラーが出ます。
undefined method binread for File:Class (NoMethod Error)
917デフォルトの名無しさん:2010/10/16(土) 19:34:05
ソース見てもらっていいですか?
918デフォルトの名無しさん:2010/10/16(土) 19:37:27
File.binreadがないRubyバージョンなら open('file', 'rb') {|f| f.read }
919デフォルトの名無しさん:2010/10/16(土) 19:57:34
>>917
gistなりpastebinなりにupしてみれば
http://gist.github.com/
http://pastebin.com/
920デフォルトの名無しさん:2010/10/16(土) 20:05:14
よろしくお願いします。

http://gist.github.com/629676
921デフォルトの名無しさん:2010/10/17(日) 02:40:04
Twitter gemでproxyを通してTwitterに投稿したいです

http://twitter.com/phonsan/status/14896534494
の方法を試してみましたが、
(401): Unauthorized - Could not authenticate with OAuth.
が返ってきましたし、確かに強引すぎて美しくありません

他に良いproxyの通し方はないでしょうか?
922デフォルトの名無しさん:2010/10/17(日) 16:54:39
if と case はどのように使い分ければよいでしょうか?

PHPの時は、swichは評判が悪かったので一切使っていませんでした。
923デフォルトの名無しさん:2010/10/17(日) 17:18:50
より見易くなるほう。
caseの比較は === で行われることを念頭に置いておく。
924デフォルトの名無しさん:2010/10/17(日) 17:21:15
return 1 if a
return 2 if b
return 3 if c
return 4
って書くかcaseでどっちが可愛い?

925デフォルトの名無しさん:2010/10/17(日) 17:32:04
>>924
可愛いはどうでもいいが、
「if a」や「if b」が異常系の条件だったりすると、
ガード節とかいってそう書いた方がいいと「リファクタリング」にあるな。
926デフォルトの名無しさん:2010/10/18(月) 16:47:34
拡張ライブラリを作る際、
rubyからCに、longに収まりきらない整数を渡すにはどうすればいいんですか?
927デフォルトの名無しさん:2010/10/18(月) 16:52:16
doubleに変えればいんじゃない
928デフォルトの名無しさん:2010/10/18(月) 22:57:39
>>926
RubyからCへは文字列として渡し、C側で文字列から多倍長整数に変換する、というのはどうでしょう。
多倍長整数についてはぐぐってください。
929デフォルトの名無しさん:2010/10/19(火) 11:11:32
SecureRandom.hex(6)
-> 23c5a790ab4c
どうして12桁の出力になるのでしょうか?

もう1点、セキュアなランダム英数字を作りたい場合はどのような方法がありますか?

よろしくお願い致します。
930デフォルトの名無しさん:2010/10/19(火) 11:36:21
>>929
それはマニュアル嫁
931679:2010/10/19(火) 12:53:43
ruby&mechanizeで
500 => Net::HTTPInternalServerError (Mechanize::ResponseCodeError)
のときに,サーバから送られてくるHTMLを利用したいのですが、方法を教えてください。
(もちろん,begin rescueで処理するとして)
Mechanize::インスタンスのどこかにありそうなのですが,見つけられませんでした。
よろしく
932デフォルトの名無しさん:2010/10/19(火) 13:41:19
>>931
require 'rubygems'
require 'mechanize'
require 'webmock'

uri = 'http://example.com/'
headers = {'Content-Type' => 'text/html'}
html = '<html><title>ERROR!</title></html>'
WebMock.stub_request(:get, uri).to_return(
:status => 500,
:headers => headers,
:body => html)

agent = Mechanize.new
begin
agent.get(uri)
rescue Mechanize::ResponseCodeError => ex
p ex.page.title
end

結果
"ERROR!"

というわけで普通に例外オブジェクト捕まえてpageメソッド使え
933デフォルトの名無しさん:2010/10/19(火) 21:50:45
ハッシュにキーは同じだけど値は違うみたいなのって保存して表示することできないんですか?
934デフォルトの名無しさん:2010/10/19(火) 22:04:59
>>933
適当に補完して回答するが、できない
そういう用途では普通、値を配列にする
935デフォルトの名無しさん:2010/10/19(火) 22:06:45
cgi/sessionで

session['hoge'] = 'aiueo'
session.close

としてセッションを閉じますけど、
puts session['hoge']
のように読み込んだだけでも
session.closeは必要ですか?

expireはまだ大丈夫なのにページを行ったり来たりしてるうちに消えてしまうんですよね。
何が原因なんでしょう。
936デフォルトの名無しさん:2010/10/19(火) 22:08:14
>>933
そもそもハッシュは1キー1レコードだろ
937デフォルトの名無しさん:2010/10/19(火) 22:08:16
>>934
素早い回答ありがとうございました
しつこいですが、
ハッシュにキーと値を次々と保存していき、同じキーがあった場合、値が違っても
ハッシュに保存し、それを別々に表示することはできないでしょうか?
938デフォルトの名無しさん:2010/10/19(火) 22:13:28
>>937
そういう用途では普通、値を配列にする
939デフォルトの名無しさん:2010/10/19(火) 22:22:52
>>938
ごくろう
940デフォルトの名無しさん:2010/10/19(火) 22:34:13
衝突処理戦略を決める方法は、
perfect hashing(完全ハッシュ法)を使う。
chaining(連鎖)を使う。
open addressing(オープンアドレス法)を使う。

アルゴリズムで調べればいくらでも出てくるだろ。


941デフォルトの名無しさん:2010/10/19(火) 22:55:06
>>940
解決したからいいや
ごくろう
942デフォルトの名無しさん:2010/10/19(火) 23:07:01
>>940
衝突はキーじゃなくてキーのハッシュ値が重複する場合でそ。
943デフォルトの名無しさん:2010/10/20(水) 09:16:50
>>935
読み込むだけならSet-Cookieヘッダを送信する必要はないからcloseも必要ないはず・・・
と思ったけど、セッションファイルがオープンされたままになっていると次のリクエスト時に困るかもね。
CGIでなければcloseしたほうが無難(CGIならプロセス終了時に勝手にクローズされるはず)。

あとセッションが消えるというのは
・サーバサイドのセッションファイルが消える
・クライアントからのクッキーが送られてこない
の両方が考えられる。どっちが原因かを特定したほうがいい。
もし後者なら単にセッション用クッキーのパスの問題である可能性が高い。
944デフォルトの名無しさん:2010/10/20(水) 09:19:17
>>929
マニュアルに書いてると思うけど、SecureRandom.hex(n)はランダムなnバイトのデータを生成してそれを16進数にして返す。
16進数だから、1バイトあたり2文字必要。
セキュアなランダム英数字は、SecureRandom.hex()でいいと思うよ。
945デフォルトの名無しさん:2010/10/20(水) 21:55:58
同じUTF8で書かれたRubyコードをWindowsのコマンドプロンプトとMacのターミナルで実行すると、日本語が含まれる出力があるとWindowsの方は文字化けするけど、なにかいい解決方法ないですか?

rbファイルを複製してsjisにする、とかそういうの以外で
946デフォルトの名無しさん:2010/10/20(水) 21:59:28
chcp 65001
947デフォルトの名無しさん:2010/10/20(水) 22:02:11
特にない
Rubyが手を出せる範疇を越えている
コマンドプロンプトがCP932しか出力できないのはコマンドプロンプトの仕様

コマンドプロンプト上に出力しようとしているということがスクリプト上でチェックできれば
その時だけ標準出力をtosjisとかで変換すればいいんだけど
948デフォルトの名無しさん:2010/10/20(水) 22:08:10
cygwin とか msys とかで
949デフォルトの名無しさん:2010/10/20(水) 22:09:22
Windows のシステムロケールを変更する
950デフォルトの名無しさん:2010/10/20(水) 22:09:46
>>946
それって日本語の入出力できなくなりませんか?自分の環境だとできなかったんですが、普通はできるのかな…

>>947
やっぱり厳しい感じですかー
Pythonはそういうことがないみたいなんですが(普通に意識せずにマルチプラットフォームで日本語使える)、内部で判定して変換でもしてくらてるんでしょうか
951デフォルトの名無しさん:2010/10/20(水) 22:09:56
うん、コマンドプロンプトを使わないというのが解決法のひとつ
配布スクリプトなら諦めろ
952デフォルトの名無しさん:2010/10/20(水) 22:10:40
rubyはwindowsに冷たいです
953デフォルトの名無しさん:2010/10/20(水) 22:10:43
>>950
>>946は実際に使ってないから気にするな
コードポイント切り替えてまともに動作することはない
954デフォルトの名無しさん:2010/10/20(水) 22:17:00
沢山のレスありがとうございます
厳しそうなのが改めて理解出来ました

Ruby好きで使いたいのに使えないってのは歯痒いですね…
Winをばっさり切り捨てられればいいですけど、なかなかそうもいかなくて、Python調べてみるかな…
955デフォルトの名無しさん:2010/10/20(水) 22:20:23
PythonだとUTF-8で出力した文字列を
SJIS前提のコンソールで見られるのか?
956デフォルトの名無しさん:2010/10/20(水) 22:24:37
Pythonだと
print u'ほげほげ'
という形で
unicodeで出力すると
自動的に環境に合わせてエンコードしてくれるよ
957デフォルトの名無しさん:2010/10/20(水) 22:25:40
直に書けないんだよね
958956:2010/10/20(水) 22:26:32
ソースが utf-8 固定のときでも
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

a = 'ほげ' # ここは utf-8
print a.decode('utf-8')



print u'ほげ'

したのと同じになる
959デフォルトの名無しさん:2010/10/20(水) 22:28:45
PythonにできてRubyにできないのは
怠慢?仕様?
960デフォルトの名無しさん:2010/10/20(水) 22:33:44
Rubyも2.4くらいから出来るんじゃないか
961デフォルトの名無しさん:2010/10/20(水) 22:34:10
-Ks とか -Ku の意味が微妙に違うんだよな
962デフォルトの名無しさん:2010/10/20(水) 22:35:24
>>959
PythonはWindowsでしか動作しない専用のコードが物凄く組み込まれてる
彼らはOS依存のコードを大量にパッケージングすることを厭わない

Pythonだからできた、わけではない
Rubyでできないのは単なるリソース不足
963デフォルトの名無しさん:2010/10/20(水) 22:42:10
Ruby1.9ならでき…たはず
964デフォルトの名無しさん:2010/10/20(水) 22:44:21
Rubyはやるきがない
965デフォルトの名無しさん:2010/10/20(水) 22:50:25
そして最近話題の閉鎖的な開発陣、一回終わってみるべき論、につながるわけですね、わかります
966デフォルトの名無しさん:2010/10/20(水) 22:51:05
そもそもコマンドプロンプト出力するRubyスクリプト案件がどんだけあるのかという問題
967デフォルトの名無しさん:2010/10/20(水) 22:54:45
俺も困ってるわ。
コマンドプロンプトはUTF-8もまともに扱えず確かにクソだが、WindowsでいうUnicode(UCS-2、UTF-16か?)は扱えるみたいだし、
そのせいにするのはおかしい。そうでなかったらPowerShellやコンソールアプリどうすんだよ

tosjisで出力するのは現時点での現実的な解だし、
それでもいいならtermtterがその路線のようで、
readlineで入力もできているし、オマケでターミナル向けのカラーも表示できるので、ソースが参考になるかな。
この部分簡単に使えるようにgemでくれ > termtter開発者
http://github.com/jugyo/termtter/blob/master/lib/termtter/system_extensions/windows.rb

内部的に従来どおりUTF-8にしておいて、入出力する時はUCS-2で処理することはできないかな。

Pythonの話が出ていたけど、Windowsと親和性たかいといわれるPythonの実装はどうなってるか知らない?
ようするに誰かパッチ書くか、ハックするgemくれ!!!

>>948
Cygwin 1.7版のRubyはUTF-8いけそう。

mswinやmingw版はUTF-8対応のターミナルで使おうとしても表示はできるが、
irbやインタラクティブな部分はだめだし、他にもいくつか不具合がある。

>>946
chcp 65001まともにつかえないだろ
968デフォルトの名無しさん:2010/10/20(水) 22:55:01
Pythonの文字コード周りは紛糾する初心者続出の危険な領域であって
隣の芝生はよく見えるの典型的ないやなんでもない
969デフォルトの名無しさん:2010/10/20(水) 22:56:01
わるい、Pythonの部分はその後のログ
見逃していたスルーしてくれ
970デフォルトの名無しさん:2010/10/20(水) 22:58:52
>>967

> 内部的に従来どおりUTF-8にしておいて、入出力する時はUCS-2で処理することはできないかな。

1.9.2だとそういう試みがあると聞いたけど具体的なMLログと、Redmineチケットとソースくれ
971デフォルトの名無しさん:2010/10/20(水) 22:59:31
>>966
表示が無理だというのが知れ渡ってるからコマンドプロンプト表示活用者が少ないんじゃないかと
鶏卵な感じもちょっとする
972デフォルトの名無しさん:2010/10/20(水) 23:00:28
擁護ではないが、Perlもできない
973デフォルトの名無しさん:2010/10/20(水) 23:04:43
Windows専用でShift_JIS固定俺用スクリプトでも
コマンドプロンプトに表示させて便利に使ってるスクリプトはゼロだな
974デフォルトの名無しさん:2010/10/20(水) 23:11:39
Pythonの文字コードよりもRuby1.9の文字コードの方が初心者はまると思う
975デフォルトの名無しさん:2010/10/20(水) 23:36:02
ちょっとまてよ、Windowsユーザーは
irb使ってないのかw
976デフォルトの名無しさん:2010/10/20(水) 23:37:13
それとか、autotestとかautospecとかデフォがコマンドラインやターミナルが前提のツールもあろだろ
みんなIDEやエディタの拡張機能から直接実行してるのか
977デフォルトの名無しさん:2010/10/21(木) 01:38:16
"ほげ"が"縺サ縺・"みたいに文字化けで表示されるんなら分かるんだけど
"\343\201\273\343\201\222"みたいになるのがよく分からんね
前者なら(フォント変えてから)chcp 65001でとりあえず解決するんだけど
Rubyの方でUTF-8でない何かにしちゃってる気がする
978デフォルトの名無しさん:2010/10/21(木) 01:56:49
なんでわかんねーんだよアンポンタン
979デフォルトの名無しさん:2010/10/21(木) 01:57:16
>>977
その場合putsやpだとでなくね?

1.8なら$KCODE指定してないとinspectするときにそうなった気がする
例えば$KCODEとか-Kなんとかを指定せずにirbで、文字列を変数に入れたときに
戻り値をirbが表示してくれるが、>>977みたいになる
980デフォルトの名無しさん:2010/10/21(木) 06:50:11
過去ログで、引数でファイルが指定されていたら中身をデータとしてよみ
そうでなく標準入力があるならその中身を読み込み、
それもないなら __END__ 以下を読み込むという話題が出ていたのですが、

http://hibari.2ch.net/test/read.cgi/tech/1274121477/735
http://hibari.2ch.net/test/read.cgi/tech/1274121477/737

src = ($stdin.tty? && ARGV.empty?) ? DATA : ARGF
puts src.read

というコードではコマンドラインでは標準入力のあるときは $stdin.tty? がfalseになり上手く動くのですが、
コマンドライン以外の例えばエディタから実行すると、
標準入力がないときも$stdin.tty?がfalseになってしまうため
ファイルが指定されておらず標準入力がないときに__END__ から取得せず、
ARGFつまり標準入力から読もうとしてしまいます。
981デフォルトの名無しさん:2010/10/21(木) 07:01:24
irbの良さがわからない。
何が良くて使ってるんだ???
982デフォルトの名無しさん:2010/10/21(木) 07:01:56
で?
983デフォルトの名無しさん:2010/10/21(木) 07:05:00
そうねぇ。
結婚して、子どもができて、飯食わすために出世して、親とお別れして、世代が移り変わって…
いよいよ所帯じみてきたら、わかるんじゃないかな…。
984デフォルトの名無しさん:2010/10/21(木) 07:12:39
>>980
TTYとは何かを100篇暗誦しろ

環境変数TERMを読んで条件分岐というのが一般的なんだが、
TERM(に相当するもの)を変更してシェルを起動しないタイプの場合どうにもならない
985デフォルトの名無しさん:2010/10/21(木) 07:34:36
途中で送信してしまった

>>980ですがエディタ以外にmswin32のRubyをCygwinから実行した場合にも
$stdin.tty?がtrueになってしまい同様の問題がおきてしまいます。

Rubyではないですが、pythonのインタプリタは標準入力がないときやファイルの指定がないときは
インタラクティブモードに自動的になりますがやはり同様の問題があるようです。

これは仕方がないものでしょうか?

986デフォルトの名無しさん:2010/10/21(木) 09:12:00
>>977
あぁ、これ自分もなんでこうなるのかわからず悩んでた

$KCODEか-Kオプション指定すればなおるのかーサンクス >>979
987デフォルトの名無しさん:2010/10/21(木) 09:22:17
直るというか、1.8のString#inspectとしては絶対に化けずにinspectしてくれるほうが正しい動作
988デフォルトの名無しさん:2010/10/21(木) 09:33:01
蒸し返して悪いんけど、Perlだと、

binmode STDOUT, ':encoding(cp932)';

で、コンソール出力時に自動でエンコードしてくれるけど、Rubyだとどうするのでしょうか?
989デフォルトの名無しさん:2010/10/21(木) 09:43:22
>>988
それはコンソール出力時ではなく標準出力全部が切り替わるだろ嘘つくな

まあそれはそれとして、$stdout.write を書き換えるとやっぱり標準出力全部が書き換わる
NKF噛ませるのがポピュラーで汚い解決法

require 'kconv'
class << $stdout
alias :write_orig :write
def write(s); write_orig(NKF.nkf('-sxm0', s)); end
end

puts "Ruby1.8はうんこ".toutf8
990デフォルトの名無しさん:2010/10/21(木) 09:57:09
次スレ立てまーす
991デフォルトの名無しさん:2010/10/21(木) 10:20:56
Ruby 初心者スレッド Part 39
http://hibari.2ch.net/test/read.cgi/tech/1287623173/
992デフォルトの名無しさん:2010/10/21(木) 10:41:57
梅まーす
993デフォルトの名無しさん:2010/10/21(木) 10:46:24
>>989
d
ややこしいんすね。
994デフォルトの名無しさん:2010/10/21(木) 12:45:16
出力をsjisにしたいなら、そういうプログラム書いてパイプでつなげばいいやん
995デフォルトの名無しさん:2010/10/21(木) 16:01:03
jrubyを使ってRubyからJAVAにコンバートしたいのですが方法が解りません。
コマンドラインを知っていたら教えてください。
996デフォルトの名無しさん:2010/10/21(木) 16:11:08
bignum too big to convert into long
というエラーが出ます。
997デフォルトの名無しさん:2010/10/21(木) 16:28:22
だからなんだよ
998デフォルトの名無しさん:2010/10/21(木) 16:36:46
正しい使い方を知りたいです
999デフォルトの名無しさん:2010/10/21(木) 16:42:48
JRubyは別スレ立ててもいいくらいの違いっぷりだからなあ
1000デフォルトの名無しさん:2010/10/21(木) 16:44:29
python~~~~
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。