トップページ⇒tech
1001コメント375KB

Ruby 初心者スレッド Part 38

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2010/08/26(木) 09:18:42
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0002デフォルトの名無しさん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/
0003デフォルトの名無しさん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/
0004デフォルトの名無しさん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/
0005デフォルトの名無しさん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等外部第三者ライブラリの対応が超適当特に英語圏産
 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
0006テンプレここまで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

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

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

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

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


いろいろ使えるな
0022デフォルトの名無しさん2010/08/29(日) 15:28:19
1.9.1そんなに初心者向きでないとは知らなかったぜw
0023デフォルトの名無しさん2010/08/29(日) 15:34:34
もう 1.9.2 出たんだからそっち使えよ
0024デフォルトの名無しさん2010/08/29(日) 15:49:20
>>23
そういう情報もチェックしてない位初心者です(´・ω・`)
0025デフォルトの名無しさん2010/08/29(日) 16:53:58
Rails 3でも1.9.2正式サポートだっけ
0026Perl忍者 ◆M5ZWRnXOj6 2010/08/29(日) 19:27:00
ここも潰そう
0027デフォルトの名無しさん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って何者?
0028デフォルトの名無しさん2010/08/29(日) 22:14:05
邪魔者
0029デフォルトの名無しさん2010/08/29(日) 22:17:42
曲者
0030デフォルトの名無しさん2010/08/30(月) 09:09:13
>>27
なんたら-devel って Linux のパッケージだろうと思うけど、
それはビルドに必要なんじゃないかなぁ。
0031デフォルトの名無しさん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のような何かが必要
共に、ソースからコンパイルしてふつうにインストールしていた場合は不要
0032272010/08/30(月) 23:51:45
何をやってもうまくいかない・・・・・・・・・・・・・
とりあえずRuby/MySQLだけはインストールできたけど、他が全くインストールできないです

とりあえず、Ruby/DBIをインストールする前には何が必要なんですか?
0033デフォルトの名無しさん2010/08/31(火) 00:05:34
>>27
環境plz OSとか、Rubyのバージョンとか
0034デフォルトの名無しさん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つかったほうがいいのかな?

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

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

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

Ubuntuのパッケージシステムは非互換性の警告をすることができないからなあ
1.8.7がインストールされてたら「1.9.1いきなり入れるのやめと毛」というメッセージくらいはあってもいい
なくてもいいけど
0043デフォルトの名無しさん2010/08/31(火) 16:20:04
まだリポジトリに入ってないよ
0044デフォルトの名無しさん2010/08/31(火) 16:22:39
libxml2 も 2.7.6 だよね
めんどくさいから 2.7.7 にして欲しいなあ
0045Perl忍者 ◆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`ー..._    ,.. -'´/      |:.:.:.:.:.:.:.:.:.:.:.:.:.:.

おい、まつもと しねよ
0046デフォルトの名無しさん2010/08/31(火) 20:58:59
Rubyスレ初の逮捕者ですねわかります
0047デフォルトの名無しさん2010/08/31(火) 21:20:23
>>42
バージョン0.2はバージョン0.1と互換性がなくても文句言えないと思う
バージョン0.2とバージョン0.2.1に動作互換性がなかったら一応文句だけは言っていい
0048Perl忍者 ◆M5ZWRnXOj6 2010/08/31(火) 21:53:47
俺の意志を継ぐ者が現れてRubyコミュニティを破壊しつくすだろ
0049デフォルトの名無しさん2010/09/01(水) 00:34:28
ライブドアからでてくんな
0050デフォルトの名無しさん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>"と表示させるにはどうすればいいのでしょうか?
0051デフォルトの名無しさん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')
0052502010/09/01(水) 07:08:25
>>51
おー、解決しました!
これからはマニュアルとの付き合い方を少し変える必要がありそうです。

どうもありがとうございました。
0053デフォルトの名無しさん2010/09/01(水) 07:53:23
一発目は他人に聞いたほうが早い
気づいた2回目からは自力で自由に調べたほうが早いが
0054デフォルトの名無しさん2010/09/01(水) 19:26:16
400字くらいある文字列textを、
20文字ずつ区切って、配列aに入れて行くのにイカした方法は無いでしょうか。
やっぱり、普通に一文字ずつやっていくのが良いのでしょうか。
よろしくお願いします。
0055デフォルトの名無しさん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
0056デフォルトの名無しさん2010/09/01(水) 19:52:59
>>55
ありがとうございます。
非常にスマートですね。
参考にさせて頂きます。

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

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

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

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

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

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

ソースは↓
0068デフォルトの名無しさん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}\","
0069デフォルトの名無しさん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
0070デフォルトの名無しさん2010/09/01(水) 22:08:44
ファイルが多すぎ
0071デフォルトの名無しさん2010/09/01(水) 22:14:18
2. ばかでかいファイルがあってSHA1計算時に(一時的に)止まった
0072デフォルトの名無しさん2010/09/01(水) 22:17:02
マルチスレッドにすべき
0073デフォルトの名無しさん2010/09/01(水) 22:23:33
>>71
SHA1 のところをコメントアウトしても
止まるんです。

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

これは実行するたびに変わるんかい?
0075デフォルトの名無しさん2010/09/02(木) 06:47:18
>>74
同じ時もあるし、違う時もあるんです。
出力が行の途中で止まっていることもあって
いることも、、、
0076デフォルトの名無しさん2010/09/02(木) 07:57:08
実はlist_upは終わってて、その後で止まってる説
0077デフォルトの名無しさん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)}",}
0078デフォルトの名無しさん2010/09/02(木) 13:05:55
わるい、rescueで拾ってたか。

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

Find.find をカウントだけした結果が、エクスプローラなどで表示される総ファイル数と同じであることのチェックからだろうな
0081デフォルトの名無しさん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
0082デフォルトの名無しさん2010/09/02(木) 14:07:10
ああっと操作不能になった点は、多分teeでファイルに表示と同時にファイルに落していたせいもあるかもしれないし、
コマンドプロンプトにログ流すのが重いのかもしれない
0083デフォルトの名無しさん2010/09/02(木) 19:04:46
配列の参照について質問させてください。

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

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

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

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

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

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

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

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

methods = [Proc.new{a()}, Proc.new{b()}, Proc.new{c()}]
methods[1].call()
0087デフォルトの名無しさん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)
0088デフォルトの名無しさん2010/09/02(木) 19:40:25
Proc の使い方知ってるということ前提のネタだしなあ

irb> def a(n)
print n
end
irb> Proc.new{|x| a(x)}.call(1234)
1234
008967-692010/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|
でも、動きは違うものなんでしょうか?
0090デフォルトの名無しさん2010/09/02(木) 23:07:12
>>75
出力の途中でとまるなら、コードの問題じゃなくてリソースの問題じゃないかな。野生の勘だけど
0091デフォルトの名無しさん2010/09/03(金) 02:49:34
悪い。恥ずかしながらFind.findの存在しらなくて個別の依存ライブラリかと思ってDir.glob書いたので
Dir.globはスルーしてくれ

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

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

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

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

def a(arg)
disp text(arg)
end

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

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

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

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

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

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

クロージャの使用も検討しながら、コードの体系について見直したいと思います。
どうもありがとうございました。
0103デフォルトの名無しさん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
0104デフォルトの名無しさん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 でいい
0105デフォルトの名無しさん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
0106デフォルトの名無しさん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
とかける
0107デフォルトの名無しさん2010/09/05(日) 21:01:49
メソッド内にメソッドは宣言できるけど、クラスでメソッドを宣言したのと同じだし
他の言語の関数内関数のような期待されるものとは違う挙動するからな
(スコープが関数内に限定される、言語によってはクロージャを自動で作るなど)

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

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

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

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

Railsがどうとか考える必要なし
Railsだけで完結することなんて稀でたいてい他の gem 使うわけだし
0118デフォルトの名無しさん2010/09/06(月) 00:09:37
>>103はdefを使わずに定義することでスコープを新規に作らずに
束縛を共有しているってことでいいのかな。
0119デフォルトの名無しさん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
0120デフォルトの名無しさん2010/09/06(月) 03:37:19
悪い、cattr_accesorもRailsか(というかActiveSupport)
0121デフォルトの名無しさん2010/09/06(月) 03:44:01
>>120みたいなアホにならないためにもある程度の初心者になったら標準Rubyのマニュアルは通読しましょう
0122デフォルトの名無しさん2010/09/06(月) 03:49:51
Railsでインストールされるクラスのメソッドのスレ的に悪いところは、読み解くのに分厚い本の解説が要ること
Activeなんとか単体ならまだマシなんだけど…
0123デフォルトの名無しさん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
0124デフォルトの名無しさん2010/09/06(月) 03:55:48
after railsだか言うらしいが、メタプログラミング使いすぎだろJK
0125デフォルトの名無しさん2010/09/06(月) 04:07:26
メタプログラミングのないRubyなんて粕
0126デフォルトの名無しさん2010/09/06(月) 06:17:38
ruby自体メソッドと文法の区別つかないじゃん
0127672010/09/06(月) 22:08:39
>>104-106
私のレベルでは、まだこのエレガントなコードの解読が
出来ていませんが、明日試してみようと思います。
ありがとうございます。
0128デフォルトの名無しさん2010/09/07(火) 00:18:47
Module内のメソッドでモジュール名を得ることってできないでしょうか?
例えばログを取るときに

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

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

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


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

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

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

こうしたいってこと?
  
0133デフォルトの名無しさん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

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

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

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

>>126
何故かActiveSupport 3がパフォーマンス上の理由で、既存のクラスをmixinで拡張するのやめた話を思い出した
0138デフォルトの名無しさん2010/09/08(水) 13:07:02
>>137 の >>126宛のレスは誤爆
0139デフォルトの名無しさん2010/09/08(水) 13:14:46
了解
0140デフォルトの名無しさん2010/09/08(水) 13:42:05
>>136
"#{method(__method__).owner}##{__method__}"
でいけました
当たり前なんですが、これを共通化しようとメソッド化して他から呼び出しても、上記を書いたメソッド名が帰ってきます
__method__を引数にして渡すしか無いですかね。
0141デフォルトの名無しさん2010/09/08(水) 21:15:14
だからそれやる意味ないだろう
0142デフォルトの名無しさん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
0143デフォルトの名無しさん2010/09/09(木) 00:23:13
「たのしいRuby」でもちょっと難しそうと感じた私にオススメ教えてください
0144デフォルトの名無しさん2010/09/09(木) 00:28:09
猿でもわかるRuby
0145デフォルトの名無しさん2010/09/09(木) 01:03:33
Ruby逆引きハンドブックを買い、てやりたいこと
興味のあることを引いて試していく方が良いと俺は思う。

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

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

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

0149デフォルトの名無しさん2010/09/09(木) 04:18:25
>>143
作りたいものがないならプログラミングの勉強なんてやめて他の楽しいことをしましょう
0150デフォルトの名無しさん2010/09/09(木) 04:24:32
>>142
改変もとの CGI クラスのインスタンスメソッド CGI#out がどういう動作してるか調べてから改変しろ
なんで改変先しか見てないんだよ
0151デフォルトの名無しさん2010/09/09(木) 09:45:01
>>149
死ね
0152デフォルトの名無しさん2010/09/09(木) 12:53:22
>>151
いや、俺も長年ぷログラム書いてめし食ってるが、作りたいものが無いなら
別のことした方が絶対楽しいと思う。
0153デフォルトの名無しさん2010/09/09(木) 13:04:32
そもそもRubyでやる必要性があるか考えたほうがいい
結果的に早く目的が達成する手段がRubyであるというだけだろう
0154デフォルトの名無しさん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
0155デフォルトの名無しさん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

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

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

endの閉じ忘れチェックの機能くらいはありそうなもんだと思うけど
0159デフォルトの名無しさん2010/09/09(木) 16:05:32
>>156
君はまずendをつけ忘れるレベルから脱却しなさい
0160デフォルトの名無しさん2010/09/09(木) 16:09:23
エラーメッセージが糞と言われても、
構文規則的にどうにもできないものだからどうしようもない。
0161デフォルトの名無しさん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
0162デフォルトの名無しさん2010/09/09(木) 17:05:24
1.9にはインデントとの対応を見ることで
end抜けを発見するオプションが無かったっけ?
0163デフォルトの名無しさん2010/09/09(木) 17:07:07
>>161
Rubyやってない人のスレへの参加はご遠慮いただいております
01641612010/09/09(木) 17:21:29
>>163
意味不明。>>161は現在のRubyの話だよ。(K&R Cは過去の話だ。)
もちろん顧客相手の開発ではなくて、ごく個人的なツール開発だけど、それは無問題だろ?
0165デフォルトの名無しさん2010/09/09(木) 17:25:04
%
0166デフォルトの名無しさん2010/09/09(木) 17:28:14
>>161 が書いてるのは、どう見ても Ruby ユーザーのノウハウだぞ。
俺もだいたい同意見だが、いくつかフォローが必要そうなので書いてみる。

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

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

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

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

def ... end が nil を返すから class や module も nil になることが多いというだけ
最後に何か書けばそれが返る
01761612010/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年前のコードをそのままコピペした)
(続く)
01771612010/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
0178デフォルトの名無しさん2010/09/09(木) 18:23:31
なるほど Untouchable か
0179デフォルトの名無しさん2010/09/09(木) 18:34:54
おまえがな
0180デフォルトの名無しさん2010/09/09(木) 19:06:19
>>153
それいったらみんなphpにいっちゃう(初心者は)
0181デフォルトの名無しさん2010/09/09(木) 19:48:10
>>180
いや、発端の質問(>>149)の内容は「あるruby本が難しそう」なのに、
それを>>149,151が勝手に「作りたいものが無い」へと改変してレスしてるのが問題な訳で

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

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

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

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

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

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

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

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

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

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

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

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

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

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

わからないうちは、
単にURLの指す内容をHTTP GETするだけなら open-uri
それ以上のことがしたいなら net/http
0226デフォルトの名無しさん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 を勉強して利用するしかない
0227デフォルトの名無しさん2010/09/11(土) 22:16:35
net/http だと記述量が多くてめんどいというだけだよね
net/http 自体はそれなりにそこそこ使いやすくはある
02282242010/09/11(土) 22:42:09
ホットペッパーとかぐるなびなんかのapiでxml取得して解析して・・・ってのをやりたかったんだけど
色々調べてみたらこの2つのライブラリを発見したので聞いてみました

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

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

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

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

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

>>229は、本人が常識を知らないお馬鹿さんだから、無視してヨシ
あるいは、単なる嫌がらせカキコだよ
0234デフォルトの名無しさん2010/09/12(日) 00:38:12
omae mona
0235デフォルトの名無しさん2010/09/12(日) 02:37:04
>>225
open-uriはメソッド拡張しちゃうのがキモいから、俺はスクリプティング専用にしてる。
0236デフォルトの名無しさん2010/09/12(日) 11:42:13
んだな
net/httpで実装を始めて必要に応じてStringIOを返す
メソッドを自作した方が後々楽だし弊害も少ない
0237デフォルトの名無しさん2010/09/12(日) 23:32:13
>>229 は他所で散々繰り返し議論されてるんで、そっち行ってくれや
0238デフォルトの名無しさん2010/09/13(月) 01:05:26
>>237
おいおい、俺はRuby初心者に警告してやってるんだぜ。
もしこのようなWEBアクセスアプリを組む目的で
Rubyを学ぼうとしているなら、それはやめた方がいい。
0239デフォルトの名無しさん2010/09/13(月) 01:11:58
スクリプト言語を学ぶ主な動機の98%がエロ画像の収集だという確固たる調査結果があるのに
お前はいったい何を言ってるんだ
0240デフォルトの名無しさん2010/09/13(月) 14:17:32
>>223
両方持ってるが、後者のほうが色々と実践的かつ親切だとは思う。
defで関数の定義をする解説なんだが
たのしいRubyは「こうやったら作れるよ」で終わってる所を
Rubyはじめてのプログラミングでは「こうやったら作れるよ、こういう時に作るんだよ」まで書いてある感じかなぁ。
でも三冊揃えるとたのしいRubyの倍くらいの価格だし、実践的である分初心者には難しく映るかも。
0241デフォルトの名無しさん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を使うとどういう流れでプログラムは動くのでしょうか?
0242デフォルトの名無しさん2010/09/14(火) 02:38:32
forkは自分自身をもうひとつ作る
で fork() の戻り値が
fork() を呼んだ方か
複製されたもうひとつの自分かを示しているので
戻り値に従って次の動作を変えるようにプログラムするのが普通
0243デフォルトの名無しさん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) の方で読み出せるという塩梅
0244デフォルトの名無しさん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 の方で読み出し)
0245デフォルトの名無しさん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)の導入を
検討する必要性がでてくる。
0246デフォルトの名無しさん2010/09/14(火) 03:32:59
forkに失敗したときの処理は書かなくて良いんですか?
0247デフォルトの名無しさん2010/09/14(火) 04:02:04
>>239
ネットウォッチとアフィリエイトサイト作成も入れてくれ
0248デフォルトの名無しさん2010/09/14(火) 04:03:43
> rubyに限った話じゃないけど、forkとThreadの違いがよくわかりません。

fork→mswin32だと使えない
Thread→mswin32でも使える
0249デフォルトの名無しさん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のような結果になるようにすることはできますか?
0250デフォルトの名無しさん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
}
0251デフォルトの名無しさん2010/09/14(火) 09:52:59
>>249
別にあおりじゃないけど、cgi.rbのタグ生成メソッドを使ってる人って初めてみた。
あれって何か利点あるのかな。ERBのほうがずっとつかいやすいんだけど。
0252デフォルトの名無しさん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 とかで自前で明示的に文字列にしておいたほうが安心
0253デフォルトの名無しさん2010/09/14(火) 09:58:08
>>251
Ruby のブロックつきメソッドで「R u b y ら し く」 HTML を生成することができます

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

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

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

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

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

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

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

プロバイダを変えてなんて書いてないけど…
0282デフォルトの名無しさん2010/09/14(火) 22:19:46
>>278
まあそういうことになるよな
単なる自転車置き場の議論だ
0283デフォルトの名無しさん2010/09/14(火) 22:25:38
プロバイダ変わってるじゃん
0284デフォルトの名無しさん2010/09/14(火) 22:34:57
>>282
「ボクでも話に参加できる」からなー
タチ悪いわー
0285デフォルトの名無しさん2010/09/14(火) 22:42:08
DBのコネクションを切らずに放置しちゃうシステムを擁護してるやつって
まともなシステム作ったことないだろ。
実際同じソフトを使ってたほかの図書館では通常利用で落ちてたということだし。
0286デフォルトの名無しさん2010/09/14(火) 22:47:13
>>283
移動に伴って変わるのと、ブロック回避のために変えるのを同一視か。
0287デフォルトの名無しさん2010/09/14(火) 22:53:38
別にどっちでもいいよ。結果的には、落ちてからでもしつこくアクセスしたんだから。
0288デフォルトの名無しさん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
0289デフォルトの名無しさん2010/09/15(水) 00:29:19
>>288
まとめもなにも、みんな知ってて話してるものかと眺めていたが、
読み返すと確かに経緯を知らない奴もいるな。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

よい方法はないでしょうか?
03123112010/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みたいにカンタンにかけたらいいんでしょうけど
0313デフォルトの名無しさん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なんてあるものでしょうか?
0314デフォルトの名無しさん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')
0315デフォルトの名無しさん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 の出力先がファイルになる
こんなこともあろうかと超便利
0316デフォルトの名無しさん2010/09/16(木) 09:12:25
>>309
1.9系が基本で、バージョンで差異がある部分には都度言及がある。

0317デフォルトの名無しさん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です。
よろしくお願いします。
0318デフォルトの名無しさん2010/09/16(木) 12:05:40
rails3やrspec2も出揃うし、そろそろ1.9に移行する頃かな?
0319デフォルトの名無しさん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
しておくと、勝手に毎回使ってくれるのでおすすめ。
0320デフォルトの名無しさん2010/09/16(木) 14:30:40
RUBYOPT 使用はあまりお勧めされないのではなかったか
0321デフォルトの名無しさん2010/09/16(木) 15:10:12
>>318
指定したRubyGemsが1.9に対応しているかチェックするwebサービスなかったけ?
0322デフォルトの名無しさん2010/09/16(木) 16:24:24
rubygemsって1.9で標準になったんだ、しらんかった
0323デフォルトの名無しさん2010/09/16(木) 19:10:34
>>319
ありがとうございます。無事require出来ました。
0324デフォルトの名無しさん2010/09/16(木) 19:32:02
>>320
うん、require 'rubygems' は必要な人が必要な時に自力で書く
0325デフォルトの名無しさん2010/09/17(金) 07:20:40
>>324
gem ライブラリとして公開するときは書かないほうがいいんだっけ
0326デフォルトの名無しさん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がない。)
構文のどの辺りが間違っているのでしょうか?
よろしくお願いいたします.
0327デフォルトの名無しさん2010/09/17(金) 19:01:30
>>326
ActiveRecodeの振る舞いに関する相談なんだから、
このスレじゃなくWebProg板のRailsスレで質問すべきだろうし、
そのほうが>>326が期待する返答を得られると思うよ
0328デフォルトの名無しさん2010/09/17(金) 19:14:08
ActiveRecord単体なら別にここでもいいよ
ただ、回答率は低いとは思うが
0329デフォルトの名無しさん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
....


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

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

puts x => 5

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

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

for i in 1..10
puts i
end

puts i => 10

実験してみたらfor文も同様ですね!
う〜ん不思議な仕様だ
0335デフォルトの名無しさん2010/09/18(土) 01:10:57
スコープを作るのはclass, module, def。
あと、ブロック(do...end, {...})でのローカル変数の扱いが少し特殊(1.9でシンプルになったけど)
0336デフォルトの名無しさん2010/09/18(土) 01:26:45
>>334
(1..3).each do |i|
puts i
end
puts i
0337デフォルトの名無しさん2010/09/18(土) 07:01:51
rubyで実装された簡易的なcronってないですか?
デーモンとかじゃなくユーザーのプロセスとして動くものでいいんですが。
0338デフォルトの名無しさん2010/09/18(土) 07:05:59
ないです
0339デフォルトの名無しさん2010/09/18(土) 07:28:43
無限ループにsleep(1)挟んでTime.now覗きゃそれっぽくなんでねーの
0340デフォルトの名無しさん2010/09/18(土) 07:32:52
> ユーザーのプロセスとして動くもの
そんなものイヤだ…
0341デフォルトの名無しさん2010/09/18(土) 12:06:02
crontabの文法が発狂しているから何か代替記法が欲しいという
話なら whenever あたりを見ればいいんだが、(簡易な)cronその
ものが欲しいのかな?
03423262010/09/18(土) 13:13:20
>327
適切な誘導をありがとうございました。2chは広すぎて,適切なスレがわからないこともあります。
(スクリプトのできも含めて初心者ということで^^)
0343デフォルトの名無しさん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だからユーザーで動かせるし
0344デフォルトの名無しさん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パースするしかないんだろうけど。
0345デフォルトの名無しさん2010/09/19(日) 06:24:07
Rubyのバージョンの使い分けについて質問です。
rvm でローカルユーザについては 1.8.7 と 1.9.2 を切り替えて使うことができるようになりました。
しかしCGIなどウェブサーバで使う Ruby のバージョン切り替えはどうすればいいのでしょうか。
毎回 make install して上書きするものなのでしょうか。
0346デフォルトの名無しさん2010/09/19(日) 09:03:30
>>344
よくわからんがyoutubeの動作はyoutubeに聞け
0347デフォルトの名無しさん2010/09/19(日) 10:36:31
>>345
rvmでやれんこともないけど。

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

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

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

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

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

あれそうするとシンボリックリンクをどうするのがいいのかな・・・←初心者かww
0354デフォルトの名無しさん2010/09/19(日) 16:02:34
configure をよく読めば「実行ファイル群に prefix や suffix つけて ruby1.8.7 や irb1.8.7 としてインストールする」という設定がある
これ使ってインストールして、メインにしたい実行ファイルだけ ruby や irb としてシンボリックリンク張れ
0355デフォルトの名無しさん2010/09/19(日) 16:18:55
既に/usr/binにrubyがインスコされちゃってるから困ってるのでは?
0356デフォルトの名無しさん2010/09/19(日) 16:21:11
PATHなんか好きなようにいじれるし、絶対パス指定というのもあるのに何が問題?
0357デフォルトの名無しさん2010/09/19(日) 16:27:49
>>354
>>347
既出
0358デフォルトの名無しさん2010/09/19(日) 16:47:36
ruby enterprise使ってる人は少ないのかな?
rails使いなら現状では他に選択肢は無いと思うんだけど。
0359デフォルトの名無しさん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です。
0360デフォルトの名無しさん2010/09/19(日) 20:53:58
>>359
はっきり言う
これを解決できないような人間がcygwinなんて使うな
素直にmswin32版使え
0361デフォルトの名無しさん2010/09/19(日) 21:08:12
> これを解決できないような人間がcygwinなんて使うな
に一応同意を返しておきたい気はする

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

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

>>362
cygwin では devel
libxml2-devel と libxslt-devel がいるね
0366デフォルトの名無しさん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から再インストールしたほうがいいでしょうか?
03673592010/09/20(月) 00:17:16
>>360-365
おかげで解決しました、ありがとうございます。
0368デフォルトの名無しさん2010/09/20(月) 08:22:41
>>366
rubygemesだからじゃないっすかね
0369デフォルトの名無しさん2010/09/20(月) 14:17:34
      ,―ヽ____、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/   「言語設計者たちが考えること」にMatzのインタビュー載るからな。おまえら、読めよ。
      i、   \___/  _/
       \       ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||
0370デフォルトの名無しさん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メソッドを使わなければ出来ないのでしょうか。
0371デフォルトの名無しさん2010/09/20(月) 20:21:52
(1..10).each
0372デフォルトの名無しさん2010/09/20(月) 20:22:01
1.upto(9) do |i|
p i
end
0373デフォルトの名無しさん2010/09/20(月) 20:35:55
for文は使わないのがあたりまえ。
0374デフォルトの名無しさん2010/09/20(月) 20:37:59
for i in 1..10 (終端を含む)
for i in 1...10 (終端を含まない)

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

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

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

でもそれなら

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

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

>>386
Expression と Statement の区分とオブジェクト指向は何の関連性もない
0389デフォルトの名無しさん2010/09/20(月) 22:01:51
Rangeリテラルは
1..9.eachだと 9.each がひとかたまりに見なされてしまうので
(1..9).each と括弧をつけなければいけないのが惜しいところだ。
0390デフォルトの名無しさん2010/09/20(月) 22:09:22
for文は確かに見ないけどwhile文はライブラリのソースの中でも結構見るぞ
0391デフォルトの名無しさん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
これはエラーにならない。
0392デフォルトの名無しさん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 では平気でも {...} ではくっついて解釈されることがある
0393デフォルトの名無しさん2010/09/20(月) 22:33:48
ブロック記述の結合強度が問題になることは普通ない
カッコ省略しまくって空白区切りでメソッド引数を利用するような場合に引っかかる

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

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

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

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

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

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

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

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

ちなみに元ネタは別の言語らしい、Ruby的には慣習という認識でおk
0415デフォルトの名無しさん2010/09/21(火) 11:53:45
String#downcase と str.downcase はインスタンスメソッドの説明として書く
str#downcase とは書かない
String.downcase はクラスメソッドで別物
str::downcase と書く奴は C++ に帰れ
0416デフォルトの名無しさん2010/09/21(火) 11:59:29
Ruby でも :: 使うよね
0417デフォルトの名無しさん2010/09/21(火) 12:01:59
Rubyで::を使うのはクラスやモジュールに直接所属する「定数」を書くときだね
ちなみにクラスやモジュールもRubyでは多くの場合定数なので
クラス内部のクラスを表す時にも使うことが多い
0418デフォルトの名無しさん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で無くなると思ってたんだが案の定残った
0419デフォルトの名無しさん2010/09/21(火) 19:02:21
>>414
Java ですかね。
0420デフォルトの名無しさん2010/09/21(火) 19:14:23
>>419
HAHAHA
0421デフォルトの名無しさん2010/09/21(火) 20:53:28
when ... case ... end で変数スコープがどうなってたか毎回覚えられないんだけどいい方法ある?
0422デフォルトの名無しさん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

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

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

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

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

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

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

誰か安心できる解説とかしてくれないもんかな
あと __FILE__ がどんな起動のされ方どんな読み込み方されても絶対パスを返すかどうかとか
0434デフォルトの名無しさん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 (まだ出てないけど) 以降には該当しない。
0435デフォルトの名無しさん2010/09/22(水) 05:56:17
>>433
> RUBYDIR/lib/ruby/1.8/./uri.rb を読まない保証ってなんじゃらほ
ドットで開始されている場合$LOAD_PATHを無視してカレントディレクトリから探す、とかやってくれてるんじゃないと駄目だよね
0436デフォルトの名無しさん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 を返す
0437デフォルトの名無しさん2010/09/22(水) 09:11:23
あ、実際は Dir.chdir 自体 "C:\WINNT" という文字列を解釈できるんでこの処理は意味がないよ
0438デフォルトの名無しさん2010/09/22(水) 14:29:34
で結局 __FILE__ には File.expand_path は要るの? 必須なの?
0439デフォルトの名無しさん2010/09/22(水) 15:29:38
>>435
カレントディレクトリが一番最初だろ常考
0440デフォルトの名無しさん2010/09/22(水) 15:57:37
>>439
ruby -e "p $:"
0441デフォルトの名無しさん2010/09/22(水) 19:43:10
WindowsのUNICODEファイル名はDirクラスだと"?"に化けますが
Win32APIを使えば取得できますか?
UNICODEファイル名にアクセスできるライブラリはありませんか?
0442デフォルトの名無しさん2010/09/22(水) 19:53:02
ディレクトリ走査とファイル読み込みとファイル書き込みのすべてをWin32APIで完結させれば可能
Rubyの既存のクラスやメソッドと混ぜることはできない

作ってる人はいてもいいんだけど、あまり聞かない
0443デフォルトの名無しさん2010/09/22(水) 20:07:49
そうなんですよね。どうにかファイル名が取れてもFileじゃopenできない。
0444デフォルトの名無しさん2010/09/22(水) 20:49:58
えー
0445デフォルトの名無しさん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

で実現できないのは何故ですか?
0446デフォルトの名無しさん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
0447デフォルトの名無しさん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"}
などとする。
0448デフォルトの名無しさん2010/09/22(水) 21:55:38
>>445
inspectのはRubyのバージョンアップで対応
悪いこと言わないからバージョンアップしとけ

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

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

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

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

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

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

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

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

x = hoge #代入

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

代入は、変数の参照先を設定する、もしくは変える操作。
メソッド呼び出しはメソッド呼び出し。ドットの前の変数が参照する先は変わらない。
04574452010/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]自体を参照していないということですか?
0458デフォルトの名無しさん2010/09/23(木) 13:14:25
> それが左辺の str に代入されるんですよね?

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

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

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

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

$ cat main.rb

#!/usr/bin/ruby

ARGV.each do |filename|

 load filename, true

 suba("hoge")

 subb("fuga")

end



0463デフォルトの名無しさん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 //エラーになってくれたほうがうれしい
04644622010/09/23(木) 18:04:05
変な改行が入ってしまい申し訳ない。
0465デフォルトの名無しさん2010/09/23(木) 18:20:31
よくわからんがクラス作れクラス
0466デフォルトの名無しさん2010/09/23(木) 18:51:54
何をしたいのかよく分からんが、Rakeじゃダメなのか?
0467デフォルトの名無しさん2010/09/23(木) 19:32:06
Thorが近いかもしれない。
0468デフォルトの名無しさん2010/09/23(木) 19:50:49
ぬおおおおおおおお
クラスメソッドの正体は特異クラスのインスタンスメソッドだったのか
今までのモヤモヤが晴れて全ての謎が解けた感じだ

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

という見掛けになるので、一応呼び名としての対応は取れてなくもない
どちかってとクラスメソッド内から同クラス内の別のクラスメソッドを呼ぶときどう書けばいいか迷うと思う
0473デフォルトの名無しさん2010/09/23(木) 20:35:06
>>468
いや
クラスメソッドしかありえないんだが
Javaがあほすぎなんだろう
0474デフォルトの名無しさん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!
0475デフォルトの名無しさん2010/09/23(木) 20:41:37
static メソッドのオブジェクト指向的気持ち悪さを実用的に解消した素晴らしいモデルだと思うが

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

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

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

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

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

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

0479デフォルトの名無しさん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
とかがインスタンスメソッドの文法一発で書けるとこ
0480デフォルトの名無しさん2010/09/23(木) 22:11:37
Ruby1.8とRuby1.9の共通のスクリプト作ろうとしてるんだけど、
@str = {Ruby1.9ならエンコーディング情報つける}
というのはどう書けばいいですか
RUBY_VERSION 使って分岐してもいいですか
0481デフォルトの名無しさん2010/09/23(木) 22:33:48
エンコーディング関連に関しては respond_to? は無力なので RUBY_VERSION で分岐してもよい
必要なのはメソッドの存在ではなく、それに付随して呼ばれる長大なライブラリ群だから
メソッドいっこ作ったから回避できるとか言うレベルの問題じゃないことを示す必要がある

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

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

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

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

以上、過去にPascalの入れ子構造とLispのリフレクションに悩んだ、
頭の固いオッサンからの余計なおせっかいですた。
0483デフォルトの名無しさん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のプラグインやライブラリとかの書き方の話ね

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

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

>>496-498
最初のころのバージョンのDelphiは要インストールのランタイムなくても動く、
例外が起きても落ちないのは当時VBと比べれば画期的だったぜw
0501デフォルトの名無しさん2010/09/25(土) 15:47:11
tes
0502デフォルトの名無しさん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のインストール方法をご教授頂けないでしょうか。
0503デフォルトの名無しさん2010/09/25(土) 16:09:07
CentOS はおまえには向いていない
0504デフォルトの名無しさん2010/09/25(土) 16:30:55
>>502
CentOSスレいった方がよいと思われ・・・

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

 > require "XXXX"

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

その操作(発生条件)を書いてくれないと、(エスパーはどこにもいないから) 誰にも返答なんてできないよ
0507デフォルトの名無しさん2010/09/25(土) 17:43:47
>>506
これはわりと有名
rest-client gem の LoadError メッセージ
ttp://github.com/adamwiggins/rest-client/raw/master/lib/restclient.rb
05085022010/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配下のインストールについてのマニュアルページのようなものがありましたら、教えて頂けないでしょうか。
0509デフォルトの名無しさん2010/09/25(土) 19:19:42
説明めんどいな

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

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

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

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

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

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

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

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

少なくとも俺らが普段から使うものではない。
0527デフォルトの名無しさん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風に定義するライブラリ使えないじゃないか
0528デフォルトの名無しさん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
0529デフォルトの名無しさん2010/09/26(日) 18:53:51
>DSL風に定義するライブラリ使えないじゃないか
うんこなので使わなくていい
ほぼ全てが開発者の性質の悪いオナニー
DSL表記にして何かがよくなったということはまず無い
0530デフォルトの名無しさん2010/09/26(日) 20:02:44
Railsの黒魔術が悪だと言う人が多いけど
その根拠をちゃんと示せる人が全くいないのが笑える
0531デフォルトの名無しさん2010/09/26(日) 20:10:08
どうぞ笑っていてください
0532デフォルトの名無しさん2010/09/26(日) 20:16:51
分かりにくいから
0533デフォルトの名無しさん2010/09/26(日) 20:28:10
オブジェクト指向とか俺みたいなCOBOL30年戦士には分かりにくいだけなんだよ。
まったく性質の悪いオナニーだな。
0534デフォルトの名無しさん2010/09/26(日) 20:32:13
笑えよベジータ
0535デフォルトの名無しさん2010/09/26(日) 21:11:39
笑えばいいと思うよ
0536デフォルトの名無しさん2010/09/26(日) 21:36:11
↓構造化プログラミングが分かりにくい人の出番ですよ
0537デフォルトの名無しさん2010/09/26(日) 21:54:08
>>530
解り切った事をわざわざ説明する馬鹿はおらん
0538デフォルトの名無しさん2010/09/26(日) 22:47:47
質問させてください。

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

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

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

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

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

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

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


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

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

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

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

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

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

もしRails実装を覗く必要に迫られることが将来なくなったとしたら、それは
0558デフォルトの名無しさん2010/09/28(火) 01:00:21
箱を開けるって具体的にはどんなことだよ
0559デフォルトの名無しさん2010/09/28(火) 01:19:10
Railsは真空管アンプの真空管だけ色々差し替えて楽しむ物
決して箱の中の配線を見てはいけない
05605552010/09/28(火) 01:20:33
ぞろ目Get
やりたいことは、2次元配列の指定位置に隣接する要素のインクリメント等ですが
0561デフォルトの名無しさん2010/09/28(火) 02:50:13
railsのソース読むな?本気で言ってんの?
こんなに素晴らしい教材はなかなか見つからないのに。
うちの会社はRails勉強会やる時は、rubyに興味無い連中も寄ってきて部屋いっぱいになってしまう。
社外向けのRails勉強会もやってるのだが高校生の応募もあったりして驚いたよ。
0562デフォルトの名無しさん2010/09/28(火) 03:52:14
一人で読んでも理解しにくいコードではあるのかな。
慣れてない人間には理解しにくくても、それをカバーできるほど有用なテクニックなら問題ないのだろうが。
0563デフォルトの名無しさん2010/09/28(火) 05:01:14
メタプログラミングが理解しにくいっていう話なら本人の能力の問題だな
0564デフォルトの名無しさん2010/09/28(火) 05:03:25
>>558
共通の処理まとめたい(DRYという手法だっけ?)
↓
lib/以下におけばいいの?
↓
ただのrequireじゃなくて、autoload使えって?(autoload使うと開発時のリロードのときに上手く働くとかどうとか)
↓
おい、リロードするたびにクラスがunloadされてないとかどうとか、エラーでるようになったぞ、どうしてくれるんだ
↓
production環境だと動くんだけど、、、、
↓
Railsのソースを見出す
↓
ヽ(`Д´)ノ わけわからん!!
0565デフォルトの名無しさん2010/09/28(火) 06:06:46
>>561
スレタイ100回読め
0566デフォルトの名無しさん2010/09/28(火) 06:09:37
>>564
急いでるときにそうなると困るよね
Rapid Programing 出来ると思って Rails 使ってるのに・・・
0567デフォルトの名無しさん2010/09/28(火) 06:24:27
そもそも「勉強会」になってしまう時点で何かおかしいと感じてほしいもんだ
0568デフォルトの名無しさん2010/09/28(火) 06:48:06
まあRailsはRailsスレで
「RailsはRubyではない」という文言が理解できないのは区別できない初心者か、
自分の頭の後ろにくっついてるRailsの知識の意味を理解できない可哀想な人
0569デフォルトの名無しさん2010/09/28(火) 08:16:36
Rubyを(比較的詳しく)知っててもRails解らんって人は多いらしい
0570デフォルトの名無しさん2010/09/28(火) 11:19:09
>>569
特定ライブラリの挙動を知ってるはずがないだろ
0571デフォルトの名無しさん2010/09/29(水) 01:52:54
rubyプログラマならactiverecordの実装ぐらいは知っておいたほうがいいぞ…
いくらrailsに興味無くても。
0572デフォルトの名無しさん2010/09/29(水) 03:14:01
ArelやNamedScopeのソースみたら卒倒するぞ
0573デフォルトの名無しさん2010/09/29(水) 16:01:25
rspecの日本語の本ないのかな?
そしたらBDDで開発しながらruby勉強できるのに。



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

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

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

オブジェクト渡しとかいろいろと名前が考えられているけど、一つだけ確かなことは、
参照渡しではないということです。
0584デフォルトの名無しさん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

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

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

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

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

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

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

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

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


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

ってところは意外と重要なところだと思う
内部的には即値を扱ってるんだけど
コード上は全てオブジェクトを扱ってるように見えるからな
immutableオブジェクトには自身を変更するメソッドが無いおかげでそれを実現できてる
0597デフォルトの名無しさん2010/09/30(木) 02:04:07
BignumはimmutableだけどImmediateでない?
0598デフォルトの名無しさん2010/09/30(木) 02:34:31
>>596
いやいや、実装の細部を隠すことに成功しているという意味だから
本質的に重要な指摘でしょ
いわゆる即値かどうかなんて、気にしなくてもいい
0599デフォルトの名無しさん2010/09/30(木) 03:13:45
何? 何なの?
何がいやいやなんだよ
そう言ってるじゃん
0600デフォルトの名無しさん2010/09/30(木) 03:28:31
ドロップダウンでテーブルから参照するサンプルプログラム
どっかにありませんか?できるだけ簡易なのがいいです。
0601デフォルトの名無しさん2010/09/30(木) 04:05:28
>>599
”意外と”に過剰反応した
すまん
0602デフォルトの名無しさん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 実装があってもいいという程度のお話
0603デフォルトの名無しさん2010/09/30(木) 05:16:00
しつこく出てくるものは変更の可能性なくても定数使えってことか
0604デフォルトの名無しさん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
0605デフォルトの名無しさん2010/09/30(木) 09:25:53
うへぇ、ImmutableはMutableと対置される概念だとしか認識してなかった。

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

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

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

文字列くらいならブロック内に置いておいたほうがたぶんいいと思う
リテラルで書ける程度の配列やHashも直に書いたほうがいい
正規表現は前にあったレスの通り
変数にして得するのは自作のなんかごっついオブジェクトとかじゃね、やっぱ
0611デフォルトの名無しさん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
0612デフォルトの名無しさん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)

結論
・ ローカル変数最強
・ インスタンス変数や定数にするのは見栄えとお好みとプログラムの意味考えた上で好きにしろ
0613デフォルトの名無しさん2010/09/30(木) 11:36:24
え、これは
「何万回も行う処理をブロック外のメソッドに単純に掃き出ししたら処理自体が遅くなった」
「が、文字列生成を1回にしたらちょっと戻った」
だよね
なにげにまずいと思うんだが
0614デフォルトの名無しさん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)
0615デフォルトの名無しさん2010/09/30(木) 12:23:07
あと、proc はうんざりするほど遅かった(文字列生成を1回だけにするとそのぶんだけは軽減)
ただし 1.9.2 で実行すると 1.8.7 よりはうんと速く、メソッド呼び出しより少し遅い程度
0616デフォルトの名無しさん2010/09/30(木) 12:36:57
はじめまして。
勉強し始めなので、よくわからないことがあるので教えていただければ、
と思いカキコします。
hashの部分を勉強中なのですが、deleteメソッドに関して、
本で見ていると「keyをnilにしてvalとの結びつきをなくす」
とあり、さらに「valは削除されていない・・・」との記述なのですが、
どういうことなのでしょうか?
valを表示させることが可能なのか、また、ガーベジコレクション関係の
話なのでしょうか?
教えていただけると助かります。
0617デフォルトの名無しさん2010/09/30(木) 12:42:13
Hash オブジェクトからペアを取り除く、という以上の意味はないよ
取り除かれたオブジェクトが実際にどうなるかまでは関与しない
プログラム上で誰も参照していなければ他の変数同様GCの対象になるだけ

あとそれはかなりへちょい解説なのでむしろ書名晒せ
0618デフォルトの名無しさん2010/09/30(木) 12:46:30
>>617
ありがとうございます。
署名は「作りながら学ぶRuby入門」です。
P.110の上部にあります。
単純に削除、という理解で良いってことですね。
0619デフォルトの名無しさん2010/09/30(木) 13:14:54
それは入門者用の参考書だからそれで十分でしょ。
0620デフォルトの名無しさん2010/09/30(木) 13:16:59
>>619
入門用なら
「Hash#deleteはkeyに関連するキーと値のペアをHashオブジェクトから削除します」
で削除部分の動作説明は充分だ
入門どころか中級者向けでもこれで充分
0621デフォルトの名無しさん2010/09/30(木) 13:41:19
>>614
手元の 1.9.1 で実行してみると
s == 'str!' と s =~ /^str\!/
は後者の方が速いみたいなのだけれども、そういうもの?
0622デフォルトの名無しさん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だとやたら速いな
0623デフォルトの名無しさん2010/09/30(木) 21:01:55
>>616
一旦 keyをdeleteさせたら
復活させる方法はないかもね。

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

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

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

まぁ、上級者向けのテクニックならあるのかもしれないが。
object_idを記憶させておいて、それをどうにかして再設定させるとか。
(消えてないと書かれているのだから)
0624デフォルトの名無しさん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
0625デフォルトの名無しさん2010/10/01(金) 06:31:42
>>624
単なるそういう話
「ハッシュから削除っていうけどそれはハッシュから削除というだけの話でハッシュに登録されていたオブジェクトが削除されるという意味では必ずしもありませんよ」
という頭でっかちな説明
>>623はわかってない
0626デフォルトの名無しさん2010/10/01(金) 09:21:51
friends = { :shin => "Shin Tanaka",}
friends.delete(:shin)
p friends

これでdeleteしたらもうアクセス出来ない。
0627デフォルトの名無しさん2010/10/01(金) 09:28:47
>>626もわかってない
0628デフォルトの名無しさん2010/10/01(金) 22:40:31
おいおい、ひょっとして本当に分かってんのは俺だけなんじゃないだろうな?
0629デフォルトの名無しさん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から登録を抹消するのみ。
0630デフォルトの名無しさん2010/10/01(金) 23:14:37
元の説明が「親切と正確」というものを履き違えてるんだな
Hash だからといって特別な説明が必要だとは思えない
0631デフォルトの名無しさん2010/10/01(金) 23:33:44
だね。これといっしょだぬ

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

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

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

0647デフォルトの名無しさん2010/10/02(土) 18:38:14
vimでRuby書く場合のおすすめプラグインとかある?
例えば補完させるのとかあるのかな
0648デフォルトの名無しさん2010/10/02(土) 18:41:55
http://www.google.co.jp/search?hl=ja&safe=off&q=vim+Ruby+%E8%A3%9C%E5%AE%8C&aq=f&aqi=g1&aql=&oq=&gs_rfai=
0649デフォルトの名無しさん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]
で試したことです
0650デフォルトの名無しさん2010/10/02(土) 23:02:57
rubykaigiやらなんやらでGCの実装のプレゼントあったような気がする

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

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

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

http://www.ruby-lang.org/ja/feeds/news.rss
これを購読してはどうか。
0654デフォルトの名無しさん2010/10/03(日) 11:49:14
「セキュリティ情報」の粒度によりそうな
0655デフォルトの名無しさん2010/10/03(日) 19:58:37
鍵交換プロトコルの実装をしたいのですが、ソケットの様な通信用関数って
Rubyにあるのでしょうか。
0656デフォルトの名無しさん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でないほうが楽だろう
0657デフォルトの名無しさん2010/10/03(日) 20:16:37
opensslの再実装でもしたいのだろうか。
0658デフォルトの名無しさん2010/10/03(日) 20:20:41
GPGのもっと使いやすいやつを目指してます。
通信も出来ればいいかなと。Zebedeeみたいに。
0659デフォルトの名無しさん2010/10/03(日) 23:16:18
>>653
サンクス、やっぱり公式のニュースのフィードか。
rssをメールで送るの使ってみるわ。rssだしgrowlにも設定しておけばいいか。

ruby-listのMLの方から抽出するのも早いのだろうけど、
"[ANN]"や"[ANN] リリース"だとRuby本体以外も入るし、
なかなか面倒なんだよ
0660デフォルトの名無しさん2010/10/04(月) 03:55:28
>>647
rsense
0661デフォルトの名無しさん2010/10/04(月) 16:42:23
rand(特別な数字) だと速い、みたいなのってありますか?
たとえばrand(99999)までは速いけどrand(100000)だと桁の関係で遅くなる、みたいな
0662デフォルトの名無しさん2010/10/04(月) 16:46:26
>>661
65535
0663デフォルトの名無しさん2010/10/04(月) 19:15:25
測定してみたら?
0664デフォルトの名無しさん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 が大きい方が遅いというわけではないみたい。
0665デフォルトの名無しさん2010/10/04(月) 22:41:41
i自体の計算時間がかなり影響してるとかないだろうな
0666デフォルトの名無しさん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) }
}
}
こうだな
0667デフォルトの名無しさん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)
0668デフォルトの名無しさん2010/10/05(火) 07:17:37
例外クラスを自分で定義すべきかどうかを判断する基準がわからない…しにたい
0669デフォルトの名無しさん2010/10/05(火) 08:39:24
>>668
組み込みの例外クラスをひととおり把握すれば、あとは
「それら以外の例外は自分で作成する」というルールで
いいと思う。

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

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

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

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

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

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

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

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

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

一応、

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

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

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

ちなみにruby 1.8.7 ね
0688デフォルトの名無しさん2010/10/06(水) 00:46:03
おかしくない
http://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4
> 1. 西暦年が4で割り切れる年は閏年
> 2. ただし、西暦年が100で割り切れる年は平年
> 3. ただし、西暦年が400で割り切れる年は閏年
0689デフォルトの名無しさん2010/10/06(水) 01:05:42
>>688
それはグレゴリオ暦ですよね
1582年を境にユリウス暦からグレゴリオ暦に変えているということでしょうか?
0690デフォルトの名無しさん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
0691デフォルトの名無しさん2010/10/06(水) 01:29:46
>>683 は小学生?
0692デフォルトの名無しさん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だな
0693デフォルトの名無しさん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
0694小学生2010/10/06(水) 01:50:02
どもです。もうちょっと自分でいろいろ考えながらやってみます。
0695デフォルトの名無しさん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オブジェクトになる
0696デフォルトの名無しさん2010/10/06(水) 02:01:49
>>689
1582年10月4日(木曜日)までユリウス暦、
1582年10月15日(金曜日)からグレゴリオ暦
なんでしょ。
5日から14日までは欠番ね。
0697デフォルトの名無しさん2010/10/06(水) 02:05:30
たまに思うのだが、rubyのリファレンスマニュアルの記述って
なんか読みにくいんだよな。

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

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

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

明日から通常作業に戻れそうなので、さっそく試してみます。
親切で丁寧なアドバイス、ありがとうございました!
0709デフォルトの名無しさん2010/10/07(木) 07:24:41
>>707
PATH設定したほうが余計なことを気にしなくても済むし手間もかからないだろう
0710デフォルトの名無しさん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 も、ついさっき知りました。
対処法以外にもアドバイスなどあればいただけるとありがたいです。
よろしくお願いします。
0711デフォルトの名無しさん2010/10/07(木) 13:12:19
>>710
スクリプトをWebサーバー上で実行するな死ぬまでPHPやってろ
0712デフォルトの名無しさん2010/10/07(木) 13:21:58
>>711

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

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

ありがとうございます、知らないって本当に恐ろしいです。
0713デフォルトの名無しさん2010/10/07(木) 13:36:32
リンク先思ったのとちがってた…ひとりでもりあがってすみません
0714デフォルトの名無しさん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)
0715デフォルトの名無しさん2010/10/07(木) 14:24:43
>>710 や >>714 じゃないけど、gemが足りないときに、このgemねーぞ!!って言ってくれる仕組みないの?

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

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

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

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

なるほど、初心者の自分にもすごいわかりやすいです。
めちゃめちゃ助かりました。
参考にしてもうひとがんばりしてみます。
ありがとうございました!
0718デフォルトの名無しさん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
0719デフォルトの名無しさん2010/10/07(木) 18:40:20
>>718
コレクションの概念がないのか
配列はただの配列だ
Array クラスの each メソッドで、要素を順に枚挙できる
['A', 'B', 'C'].each do |x|
puts x
end

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

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

proc_obj = proc {|x| p x }

obj = Hello.new
obj.instance_eval(&proc_obj) # ここで proc_obj のために引数も渡したい
0723デフォルトの名無しさん2010/10/08(金) 00:57:09
obj.instance_eval do
 proc_obj.call(xxx)
end
07247202010/10/08(金) 04:59:41
bundlerでいい気がしたわ
0725デフォルトの名無しさん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)
0726デフォルトの名無しさん2010/10/08(金) 09:25:00
instance_execは?
0727デフォルトの名無しさん2010/10/08(金) 10:08:06
>>714
遅くなりましたが、できました!
本当にありがとうございました!
0728デフォルトの名無しさん2010/10/08(金) 10:33:34
>>726
そんなのが用意されたのですね。ありがとうございます。
ttp://d.hatena.ne.jp/rubikitch/20080526/instanceexec
なぜ今までなかったのかと聞きたいぐらい。
0729デフォルトの名無しさん2010/10/08(金) 16:21:58
>>728
何年前の話だよ、と思ったが、たった2年前か。trunkにはかなり前からあったんだけどね
0730デフォルトの名無しさん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)

たぶんできないとは思うんですが、もしできる方法がありましたら教えて下さい。
0731デフォルトの名無しさん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
0732デフォルトの名無しさん2010/10/10(日) 02:25:21
C言語で書いたサブルーチンをRubyプログラムから呼び出して使う方法はありませんか?
0733デフォルトの名無しさん2010/10/10(日) 03:01:28
あるぜ!
0734デフォルトの名無しさん2010/10/10(日) 03:09:51
Lispを勉強しようと思い手始めにRubyを始めました。よろしくお願いします。
0735デフォルトの名無しさん2010/10/10(日) 03:37:42
Lisp勉強したけりゃLispやったほうがいいかと
0736デフォルトの名無しさん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()
0737デフォルトの名無しさん2010/10/10(日) 08:11:22
>>731
>もし
>module M
>def self.eigen
>end
>end
>としたeigenメソッドをほかのクラスの特異メソッドとして提供したいのだとしたら、
>そもそもeigenメソッドをMの特異メソッドとして定義すべきではない

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

rubyでは
クラスという概念の中に
スーパークラスかサブクラスが入っている。
0750デフォルトの名無しさん2010/10/10(日) 22:11:51
RubyのJIS規格化って今どうなってんだろうな
0751デフォルトの名無しさん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
0752デフォルトの名無しさん2010/10/11(月) 02:34:35
大臣が審査するわけか。
誰か知らないが、大臣にRubyなんてわかるのかな?
0753デフォルトの名無しさん2010/10/11(月) 06:53:45
一応エリート様なんだから解かるように書けば解かるだらう…きっと。
0754デフォルトの名無しさん2010/10/11(月) 07:27:10
>>752
お前は小学生か
0755デフォルトの名無しさん2010/10/11(月) 07:37:02
「役人や官僚がよってたかって精査して妥当と判断した結果に大臣名義ではんこ押す」という程度の意味だよな
こんなようなことが大臣個人の能力に左右されてたまるかw
0756デフォルトの名無しさん2010/10/11(月) 08:43:06
BigDecimalの使い方がよくわかりません。ライブラリをインポートしなければ
ならないのか、BogDecimalとして変数を宣言するためにはどうしたらいいのか
教えてください。
0757デフォルトの名無しさん2010/10/11(月) 08:46:48
その質問をする直前にどこの情報、サイトを見てわからなかったのかが気になる
0758デフォルトの名無しさん2010/10/11(月) 08:48:46
すみません、何も見てません。日経サイエンスという雑誌で見つけました。
0759デフォルトの名無しさん2010/10/11(月) 08:52:04
require 'bigdecimal'
a = BigDecimal::new("0.123456789123456789")
b = BigDecimal("123456.78912345678",40)
c = a + b
0760デフォルトの名無しさん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
0761デフォルトの名無しさん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
0762デフォルトの名無しさん2010/10/11(月) 10:30:51
すみません、表示できました。
計算に使う変数全部がBigDecimalでないといけないんですね。
0763デフォルトの名無しさん2010/10/12(火) 00:01:46
みんなはテキストエディタはなに使ってる?
テキストに載ってるSciTXを使ってるけど、いちいち日本設定しないといけないし正直微妙
ハイライトがしっかりしてるいいやつないかな?
0764デフォルトの名無しさん2010/10/12(火) 00:23:34
vim

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

でも、vimすげぇと思う
0768デフォルトの名無しさん2010/10/12(火) 02:27:59
普通に文章書いたりする時はサクラ
プログラミングするときはgvim
0769デフォルトの名無しさん2010/10/12(火) 04:38:01
xyzzy使ってる
0770デフォルトの名無しさん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
0771デフォルトの名無しさん2010/10/12(火) 06:03:22
>>770
bigdecimalの便利さをRubyによって享受したいのは大いに理解できるのだけど、
純粋な計算速度を求める場合、Rubyは不向きだし、Cのような言語と比較するとRubyはかなり遅いです。
100倍遅くても泣かないことが必要。

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

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

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

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

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

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

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

0795デフォルトの名無しさん2010/10/12(火) 10:36:11
戻せる時点でバージョン管理のお仕事だと思われ
0796デフォルトの名無しさん2010/10/12(火) 10:53:58
ルビ厨のコミュニケーション、コンサル能力のなさを露呈してしまった不幸な事件であった…
0797デフォルトの名無しさん2010/10/12(火) 11:39:27
RCS前提になるけど、rcsdiffコマンドを呼び出して、その差分リスト出力を加工し、
追加部分/削除部分/未変更部分をマージしたHTMLを生成するRubyスクリプトでよければ、
過去に書いたのがあるよ。今見たら、全体で128ステップほど。
diffコマンドの出力も大きな違いは無いから、改造すれば使えるかも。もし必要ならアップするよ。
0798デフォルトの名無しさん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エンジンとか。
0799デフォルトの名無しさん2010/10/12(火) 17:42:45
>>777
>Webアプリ全盛のこのご時世に外部シェルコマンドを `` で呼ばせる人間は今すぐ死滅していいよ
ふつうにさ、
 `` は安全性に問題あるからsystem使った方がいいよ
と書けばいいだけなのに、なんであんな書き方するんだろうね。
これはRuby連中のコミュニケ―ション力がないといわれても仕方ない。
#でもきっと本人は、自分は正しいことを言っていると思ってるから、改善しないんだろうな。

>>789
>こうするとセキュリティ上もっと安全だよ、とか
>穏やかに書けばいいんだよ。
ですよねー
0800デフォルトの名無しさん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>'


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

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



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

なるほど!そういう意味ですか、全くわかってなかったです。
ということはこのファイルをコマンドプロンプトでステップ実行して
調査すれば、光が見えてきそうな感じでしょうか。
ちょっとやってみます。
0808デフォルトの名無しさん2010/10/12(火) 21:49:07
>>807
ステップ実行するまでもなく、データをpとかinspectとかで表示させればいいよ。
config_file.rbの56行目がどうなってるか見せてもらわないと分かんないけど、
たとえば "".join(list) とかだったら p list とか puts list.inspect とかして
データの中身を調べればいい。
0809デフォルトの名無しさん2010/10/12(火) 22:14:21
ステップ実行ならどこか当たりをつけてpとかソース書き換えるまでもなく調べられますよね
0810デフォルトの名無しさん2010/10/12(火) 23:52:09
ステップ実行ができるならそれにこしたことはない。
エラーメッセージが読めてない程度の初心者にはデバッガは難しいと思って
printデバッグを進めたのだが、杞憂だったようだすまん。
最近のIDEならデバッガ付いてるもんな。
0811デフォルトの名無しさん2010/10/13(水) 01:45:03
ruby のデバッガといえば rdb
0812デフォルトの名無しさん2010/10/13(水) 02:05:42
なんかアンダースヘルスバーグがC#で開発する時も
デバッガよりもprintfデバッグをよく使うそうで
てめえの言語には立派なIDEがあるのにw
0813デフォルトの名無しさん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の方に手を入れずに上手く処理することができれば?と思ってます。
0814デフォルトの名無しさん2010/10/13(水) 11:41:13
httpサーバーというものが何をやってるのかを知りたいと思い
ちょうどrubyの勉強中でもあったのでwebrickのソースを読もうとしていますが、
ruby/lib/webrickの中にたくさんソースがあってどれから読んだらいいのか分からないです
どれから読んだらいいんでしょうか?
0815デフォルトの名無しさん2010/10/13(水) 11:47:04
>>814
やめとけ
素直にCで書かれた小型のWebサーバのソース読め
WEBrickは単純なレスポンダ以外の動作もさせるように小細工埋め込まれまくりだから混乱するぞ
0816デフォルトの名無しさん2010/10/13(水) 11:53:46
一般論としては、自分でサーバ作るのでなけりゃHTTPの勉強で充分な気もする
0817デフォルトの名無しさん2010/10/13(水) 12:33:05
>>815,816
あれ?なんか色んなブログやら何やらで
「webrickのソースは綺麗だからrubyの勉強にもなるし読んでみるといいよ!!」
みたいなこと言われたから、容易に読めるもんなのかと思ってました。

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

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

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

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

最初は Vim で Ruby のデバッグをしようと思っていたのですが、
「Vim Ruby デバッグ」で検索しても特にヒットしないので、
おそらく Vim でやるというのは一般的ではないのだろうと判断して、
今のところはコマンドプロンプトを使ってやっています。
08248072010/10/13(水) 13:27:12
肝心の56行目なのですが、
SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'gemrc'
とありました。
わからないなりにステップ実行してみた結果が以下ですが、
さらにわからなくなった気もしています。
もしかしたらやり方を間違っているのかも知れません。
08258072010/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>'
0826デフォルトの名無しさん2010/10/13(水) 15:58:38
>>813
特にはできないと思う。本当にやりたいことは何かを書けば別の解決策があるかもしれない。

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

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

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

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

基本的なオブジェクト指向から順々に理解していけば、Perlが使える人なら、たやすいと思う。
ただし、最近はRailsの影響で「メタプログラミングを駆使するのがRuby流である」という風潮がある。
これに惑わされず、Perlで学んだ「読み易いプログラミング作法」をRubyに活かしていけばいい。
0833デフォルトの名無しさん2010/10/13(水) 19:58:09
>>832
ttp://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=http%3A%2F%2Fsabatobi.com%2Festhe-one&num=50
0834デフォルトの名無しさん2010/10/13(水) 20:18:25
なかなか恥ずかしいことしてるな
0835デフォルトの名無しさん2010/10/14(木) 00:43:37
perlの皮をかぶったlispじゃなかった?
smalltalkに似てるのは偶然で参考にした覚えはない、って言ってた様な
0836デフォルトの名無しさん2010/10/14(木) 01:11:26
これのどこがlispやねん
0837デフォルトの名無しさん2010/10/14(木) 01:16:02
いや、東大かどこかの教授が言ってたよ。
RubyはカッコのないLispだって。
0838デフォルトの名無しさん2010/10/14(木) 01:27:08
『はじめてのRuby』で
「ALGOLの皮を被ったLisp」と紹介したのがyugui氏

>>837
そういえば、教養学部でRubyを採用した背景には
Lisp系教授の支持があったかららしいがw
0839デフォルトの名無しさん2010/10/14(木) 01:29:31
ALGOLの皮を被ったLisp?
08408132010/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ではそうならない)
08418132010/10/14(木) 01:56:11
長くなってわかりにくくなってしまいました。

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

> そのため単に一時的に退避して切り替え(pushしてpopするような)てということがしにくくなっています。
自分でpush/popを定義するというのはなし?
0843デフォルトの名無しさん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
0844デフォルトの名無しさん2010/10/14(木) 08:51:04
ruby 1.9 だとエラーにならないので、多分バグ
0845デフォルトの名無しさん2010/10/14(木) 09:02:44
バグというかリファレンスが間違ってるんじゃね
0846デフォルトの名無しさん2010/10/14(木) 09:13:29
こうじゃね?
d = Digest::RMD160.new
d << "foobar"
p d.hexdigest
0847デフォルトの名無しさん2010/10/14(木) 09:24:25
1.8ブランチの先端でも1.8.5でもエラーにならなくて、1.8.7p248ではエラーになるので、どうもかなり
特定の版だけエラーになるっぽい。

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

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

class String
def sha1hex
SHA1.hexdigest self
end
end

の書き方の方がいいのでしょうか。
0856デフォルトの名無しさん2010/10/14(木) 10:58:02
digestが使えるrubyを使っているのであればそのほうがいいでしょう。
0857デフォルトの名無しさん2010/10/14(木) 11:01:45
ありがとうございました。
08588322010/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」ではないところが非常に重要です。
0859デフォルトの名無しさん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
0860デフォルトの名無しさん2010/10/14(木) 17:15:09
OpenSSLの機能を使ってRubyでRSA暗号とかは使えますか?
0861デフォルトの名無しさん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とか調べるとよいのでは?
0862デフォルトの名無しさん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
0863デフォルトの名無しさん2010/10/14(木) 20:25:19
少しは自分で作れよ
0864デフォルトの名無しさん2010/10/14(木) 20:28:58
自分なりに考えたんですが余りに遅いので・・・
0865デフォルトの名無しさん2010/10/14(木) 20:53:14
String#unpack でq/Qを使うと64ビット整数に分割できるから
少しは速度が上がるかも。
0866デフォルトの名無しさん2010/10/14(木) 22:38:59
>ファイルから32バイトずつ読み込んで

これが遅い原因
0867デフォルトの名無しさん2010/10/14(木) 22:44:40
処理のブロックが32バイトなんです。
最初に全部読んでもその後の処理を分割しなければならないかと。
そんなことないですかね。
0868デフォルトの名無しさん2010/10/14(木) 23:17:07
バファリングはされてるだろうからIOはそんなに律速しない気がするなー
(などとコードも動かさずに寝言を言ってみる)
0869デフォルトの名無しさん2010/10/14(木) 23:22:48
f.readとかやるとメモリいっぱい読み込むんですよね。
その後いっぺんに処理して、いっぺんに書きこむみたいな?
0870デフォルトの名無しさん2010/10/14(木) 23:32:26
バッファリングされたデータを32バイト毎にXORして最後に書き込み
という操作をすればいいですか。
0871デフォルトの名無しさん2010/10/14(木) 23:49:01
g=open(file,"wb")
g.write(salt)
これでファイルがバイナリじゃなくて数字になるのはなぜですか。
0872デフォルトの名無しさん2010/10/15(金) 01:26:40
>>871
バイナリモード/テキストモードってのはWindowsなどに備わってるモードで
読み書きの際、改行コードなどの処理が変わる、というもの。
Ruby的には「バイナリモードとOSに伝えるか否か」の違いしかない。
バイナリデータを読み書きしたいのであれば
ファイルをバイナリモードで開くだけでなく
packやunpackを使っての変換が必要。
0873デフォルトの名無しさん2010/10/15(金) 02:02:26
>>799
一応注意しておくけど、system()もパイプやリダイレクトを使うと /bin/sh 経由の実行になるから、
``と同じ程度に危険。
0874デフォルトの名無しさん2010/10/15(金) 02:21:32
変換できません。
`pack': can't convert Bignum into String (TypeError)
0875デフォルトの名無しさん2010/10/15(金) 08:37:11
なんかコミュニケーション能力に欠けた質問者だな。
0876デフォルトの名無しさん2010/10/15(金) 08:59:33
今日も来るのでお楽しみに!
餌やった奴は責任持って処分するように
0877デフォルトの名無しさん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
0878デフォルトの名無しさん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>'
0879デフォルトの名無しさん2010/10/15(金) 11:53:45
64bit版Ruby用のバイナリを用意してるgemパッケージなんて存在しないんじゃなかろうか
0880デフォルトの名無しさん2010/10/15(金) 12:01:21
ruby -v で [mswin32] か [mingw32] が表示されない Windows 版 Ruby なのなら、
gem 用に自前でコンパイラ用意しないと駄目だと思う
0881デフォルトの名無しさん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 に移すかどうか迷っています。
0882デフォルトの名無しさん2010/10/15(金) 12:23:01
特にない
たま〜にへちょいgemインストーラが
「64ビット版Windowsを確認!ということはつまり64ビット版Rubyだな!」とか条件分岐するが
そんなのは焼いて捨てちゃってよし
0883デフォルトの名無しさん2010/10/15(金) 12:38:03
>>882
ありがとうございます、焼いて捨てます。
0884デフォルトの名無しさん2010/10/15(金) 16:12:57
32bitプロセスからは普通にはアクセスできないフォルダやレジストリがあるけど、実用上は問題ないと思う。
0885デフォルトの名無しさん2010/10/15(金) 16:22:51
sprintfでアスキー変換できない数値を識別する関数はありますか?
0886デフォルトの名無しさん2010/10/15(金) 16:34:03
>>884
>32bitプロセスからは普通にはアクセスできないフォルダやレジストリがあるけど、実用上は問題ないと思う。

そういったケースに出くわした場合、なにか対処が必要ですか?
また、その場合通常エラーメッセージなどでアラートがされるのでしょうか?
0887デフォルトの名無しさん2010/10/15(金) 17:27:06
>>885
もうちょっと詳しく。
どういう書式文字列で、どんな型の数値を整形したいのか具体的に。
0888デフォルトの名無しさん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したいのですがうまくいきません。
バイナリファイルの読み書きも教えてください。よろしくお願いします。
0889デフォルトの名無しさん2010/10/15(金) 18:05:52
>>887
>>876
0890デフォルトの名無しさん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かな。
0891デフォルトの名無しさん2010/10/15(金) 23:44:21
>>877
コンパイル環境がないみたいだけど、devkitいれたら解決するとかそういう問題ではないのか
0892デフォルトの名無しさん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になります。

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

最初が式ならこれでいける、と思ったのですが、、、
そもそも後者のような書き方だとクラスメソッドになってしまうんですね
0894デフォルトの名無しさん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

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

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

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

そんだけ
方向性の強い決定権を持ってるから、今のところはいなくなると困る
githubのライブラリにおける、pullリクエストの認証者のような立場
0900デフォルトの名無しさん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
0901デフォルトの名無しさん2010/10/16(土) 15:08:05
お、きたな
0902デフォルトの名無しさん2010/10/16(土) 15:40:10
うむ


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

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

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

エスパーじゃないので何をどうしたのか知らないけど
Arrayが返って来てるんならそりゃエラーになるわ。
0914デフォルトの名無しさん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
とするとエラーになります。基本的なところが解りません。
0915デフォルトの名無しさん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
0916デフォルトの名無しさん2010/10/16(土) 19:31:42
エラーが出ます。
undefined method binread for File:Class (NoMethod Error)
0917デフォルトの名無しさん2010/10/16(土) 19:34:05
ソース見てもらっていいですか?
0918デフォルトの名無しさん2010/10/16(土) 19:37:27
File.binreadがないRubyバージョンなら open('file', 'rb') {|f| f.read }
0919デフォルトの名無しさん2010/10/16(土) 19:57:34
>>917
gistなりpastebinなりにupしてみれば
http://gist.github.com/
http://pastebin.com/
0920デフォルトの名無しさん2010/10/16(土) 20:05:14
よろしくお願いします。

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

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

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

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

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

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

よろしくお願い致します。
0930デフォルトの名無しさん2010/10/19(火) 11:36:21
>>929
それはマニュアル嫁
09316792010/10/19(火) 12:53:43
ruby&mechanizeで
500 => Net::HTTPInternalServerError (Mechanize::ResponseCodeError)
のときに,サーバから送られてくるHTMLを利用したいのですが、方法を教えてください。
(もちろん,begin rescueで処理するとして)
Mechanize::インスタンスのどこかにありそうなのですが,見つけられませんでした。
よろしく
0932デフォルトの名無しさん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メソッド使え
0933デフォルトの名無しさん2010/10/19(火) 21:50:45
ハッシュにキーは同じだけど値は違うみたいなのって保存して表示することできないんですか?
0934デフォルトの名無しさん2010/10/19(火) 22:04:59
>>933
適当に補完して回答するが、できない
そういう用途では普通、値を配列にする
0935デフォルトの名無しさん2010/10/19(火) 22:06:45
cgi/sessionで

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

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

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

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


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

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

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

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

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

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

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

で

print u'ほげ'

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

Pythonだからできた、わけではない
Rubyでできないのは単なるリソース不足
0963デフォルトの名無しさん2010/10/20(水) 22:42:10
Ruby1.9ならでき…たはず
0964デフォルトの名無しさん2010/10/20(水) 22:44:21
Rubyはやるきがない
0965デフォルトの名無しさん2010/10/20(水) 22:50:25
そして最近話題の閉鎖的な開発陣、一回終わってみるべき論、につながるわけですね、わかります
0966デフォルトの名無しさん2010/10/20(水) 22:51:05
そもそもコマンドプロンプト出力するRubyスクリプト案件がどんだけあるのかという問題
0967デフォルトの名無しさん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まともにつかえないだろ
0968デフォルトの名無しさん2010/10/20(水) 22:55:01
Pythonの文字コード周りは紛糾する初心者続出の危険な領域であって
隣の芝生はよく見えるの典型的ないやなんでもない
0969デフォルトの名無しさん2010/10/20(水) 22:56:01
わるい、Pythonの部分はその後のログ
見逃していたスルーしてくれ
0970デフォルトの名無しさん2010/10/20(水) 22:58:52
>>967

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

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

1.8なら$KCODE指定してないとinspectするときにそうなった気がする
例えば$KCODEとか-Kなんとかを指定せずにirbで、文字列を変数に入れたときに
戻り値をirbが表示してくれるが、>>977みたいになる
0980デフォルトの名無しさん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つまり標準入力から読もうとしてしまいます。
0981デフォルトの名無しさん2010/10/21(木) 07:01:24
irbの良さがわからない。
何が良くて使ってるんだ???
0982デフォルトの名無しさん2010/10/21(木) 07:01:56
で?
0983デフォルトの名無しさん2010/10/21(木) 07:05:00
そうねぇ。
結婚して、子どもができて、飯食わすために出世して、親とお別れして、世代が移り変わって…
いよいよ所帯じみてきたら、わかるんじゃないかな…。
0984デフォルトの名無しさん2010/10/21(木) 07:12:39
>>980
TTYとは何かを100篇暗誦しろ

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

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

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

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

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

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

binmode STDOUT, ':encoding(cp932)';

で、コンソール出力時に自動でエンコードしてくれるけど、Rubyだとどうするのでしょうか?
0989デフォルトの名無しさん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
0990デフォルトの名無しさん2010/10/21(木) 09:57:09
次スレ立てまーす
0991デフォルトの名無しさん2010/10/21(木) 10:20:56
Ruby 初心者スレッド Part 39
http://hibari.2ch.net/test/read.cgi/tech/1287623173/
0992デフォルトの名無しさん2010/10/21(木) 10:41:57
梅まーす
0993デフォルトの名無しさん2010/10/21(木) 10:46:24
>>989
�d
ややこしいんすね。
0994デフォルトの名無しさん2010/10/21(木) 12:45:16
出力をsjisにしたいなら、そういうプログラム書いてパイプでつなげばいいやん
0995デフォルトの名無しさん2010/10/21(木) 16:01:03
jrubyを使ってRubyからJAVAにコンバートしたいのですが方法が解りません。
コマンドラインを知っていたら教えてください。
0996デフォルトの名無しさん2010/10/21(木) 16:11:08
bignum too big to convert into long
というエラーが出ます。
0997デフォルトの名無しさん2010/10/21(木) 16:28:22
だからなんだよ
0998デフォルトの名無しさん2010/10/21(木) 16:36:46
正しい使い方を知りたいです
0999デフォルトの名無しさん2010/10/21(木) 16:42:48
JRubyは別スレ立ててもいいくらいの違いっぷりだからなあ
1000デフォルトの名無しさん2010/10/21(木) 16:44:29
python~~~~
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。