Ruby 初心者スレッド Part 38
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/08/26(木) 09:18:42★注意★ 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:32Q:
いちから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 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:25OneClickInstaller は単に古すぎ、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:470012デフォルトの名無しさん
2010/08/26(木) 11:56:19こんな楽しみ、うつ病→統合失調症→引きこもりニートにならないと
出会えなかった。
0013デフォルトの名無しさん
2010/08/26(木) 16:36:54現実と向き合おうよ…
0014デフォルトの名無しさん
2010/08/26(木) 21:22:06チケットはなぜかあるけどだるいので止めとこうかと。
0015デフォルトの名無しさん
2010/08/27(金) 00:48:43もちょっと推敲すればなんか真理に近づけそうな気がする
0016デフォルトの名無しさん
2010/08/27(金) 01:14:50Ruby にあわせてくれて
0017デフォルトの名無しさん
2010/08/27(金) 10:31:100018デフォルトの名無しさん
2010/08/28(土) 04:11:52Prologスレとか宿題スレ見てると楽しそうで妬ける
0019デフォルトの名無しさん
2010/08/28(土) 05:06:500020デフォルトの名無しさん
2010/08/28(土) 05:17:190021デフォルトの名無しさん
2010/08/28(土) 06:35:462ch 楽しいね。
こんな楽しみ、うつ病→統合失調症→引きこもりニートにならないと
出会えなかった。
いろいろ使えるな
0022デフォルトの名無しさん
2010/08/29(日) 15:28:190023デフォルトの名無しさん
2010/08/29(日) 15:34:340024デフォルトの名無しさん
2010/08/29(日) 15:49:20そういう情報もチェックしてない位初心者です(´・ω・`)
0025デフォルトの名無しさん
2010/08/29(日) 16:53:580026Perl忍者 ◆M5ZWRnXOj6
2010/08/29(日) 19:27:000027デフォルトの名無しさん
2010/08/29(日) 21:26:13今のところ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:050029デフォルトの名無しさん
2010/08/29(日) 22:17:420030デフォルトの名無しさん
2010/08/30(月) 09:09:13なんたら-devel って Linux のパッケージだろうと思うけど、
それはビルドに必要なんじゃないかなぁ。
0031デフォルトの名無しさん
2010/08/30(月) 11:36:34Windowsの場合、mysqlのdllを公式から落としてきてパスを通してれば
mysqlのgemパッケージをrubygemsでインストールするだけでいいはず
Linuxとかの場合はmysqlのgemパッケージインストール時にコンパイルが行われるはずだから
もしRubyをLinux等のパッケージシステムでインストールしていた場合はruby-develまたはruby-devを、
MySQLをLinux等のパッケージシステムでインストールしていた場合はmysql-develまたはmysql-devのような何かが必要
共に、ソースからコンパイルしてふつうにインストールしていた場合は不要
003227
2010/08/30(月) 23:51:45とりあえずRuby/MySQLだけはインストールできたけど、他が全くインストールできないです
とりあえず、Ruby/DBIをインストールする前には何が必要なんですか?
0033デフォルトの名無しさん
2010/08/31(火) 00:05:34環境plz OSとか、Rubyのバージョンとか
0034デフォルトの名無しさん
2010/08/31(火) 00:19:54Linux 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/MySQL
↑↓
MySQL
0036デフォルトの名無しさん
2010/08/31(火) 05:04:03(1)mswin32だとセットアップが大変
(2)AcritveScriptRubyだとインストール一発で使用可能
という認識でよいでしょうか?
0037デフォルトの名無しさん
2010/08/31(火) 05:50:29UIはGUIが得意な別の言語で作り、
内部からRubyで作ったdllのような物を呼び出すことはできますか?
自分のレベルだと引数をとるRubyの単体のプログラムを作り
それを他のプログラムから外部プログラムとして呼び出す方法しかわかりませんでした。
0038デフォルトの名無しさん
2010/08/31(火) 06:30:510039デフォルトの名無しさん
2010/08/31(火) 08:57:17たまにRubyを組み込みスクリプトとして使っているソフトは見かけるよ
SWIGとかRubyのソースそのものも参考になるとおもう
0040デフォルトの名無しさん
2010/08/31(火) 10:43:07容易にできるよ。
0041デフォルトの名無しさん
2010/08/31(火) 15:51:330042デフォルトの名無しさん
2010/08/31(火) 16:02:28Ubuntuのパッケージシステムは非互換性の警告をすることができないからなあ
1.8.7がインストールされてたら「1.9.1いきなり入れるのやめと毛」というメッセージくらいはあってもいい
なくてもいいけど
0043デフォルトの名無しさん
2010/08/31(火) 16:20:040044デフォルトの名無しさん
2010/08/31(火) 16:22:39めんどくさいから 2.7.7 にして欲しいなあ
0045Perl忍者 ◆M5ZWRnXOj6
2010/08/31(火) 20:52:02レ|::|::::::::::::'、::::::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:590047デフォルトの名無しさん
2010/08/31(火) 21:20:23バージョン0.2はバージョン0.1と互換性がなくても文句言えないと思う
バージョン0.2とバージョン0.2.1に動作互換性がなかったら一応文句だけは言っていい
0048Perl忍者 ◆M5ZWRnXOj6
2010/08/31(火) 21:53:470049デフォルトの名無しさん
2010/09/01(水) 00:34:280050デフォルトの名無しさん
2010/09/01(水) 05:56:54node = Nokogiri::XML::Node::new "test", doc
node.content = "こんにちは".toutf8
puts node.to_s
このとき、"こんにちは"がエンコードされて次のように表示されてしまいます。
"<test>こん.....</test>" (一部省略)
これをそのまま "<test>こんにちは</test>"と表示させるにはどうすればいいのでしょうか?
0051デフォルトの名無しさん
2010/09/01(水) 06:58:52irb> puts node.to_html
<test>こんにちは</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')
005250
2010/09/01(水) 07:08:25おー、解決しました!
これからはマニュアルとの付き合い方を少し変える必要がありそうです。
どうもありがとうございました。
0053デフォルトの名無しさん
2010/09/01(水) 07:53:23気づいた2回目からは自力で自由に調べたほうが早いが
0054デフォルトの名無しさん
2010/09/01(水) 19:26:1620文字ずつ区切って、配列aに入れて行くのにイカした方法は無いでしょうか。
やっぱり、普通に一文字ずつやっていくのが良いのでしょうか。
よろしくお願いします。
0055デフォルトの名無しさん
2010/09/01(水) 19:32:28「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ありがとうございます。
非常にスマートですね。
参考にさせて頂きます。
1文字とは、一般的な方の1文字を想定しています。
表示文字と言えば伝わりやすいでしょうか。
例えばの場合ですが、ちょっと意地悪な条件として
「1文字」を「全角1文字分のスペースに収まる文字」と置いた場合は、
(つまり半角文字は2つで全角1文字になるとします)
このようにスマートに処理ができるものなのでしょうか。
もし、偉そうに見えたらすみません。
そういう意図では書いていないつもりです。
ちょっと書き方が工夫できなかったもので。
0057デフォルトの名無しさん
2010/09/01(水) 19:57:410058デフォルトの名無しさん
2010/09/01(水) 20:00:25偉そう
0059デフォルトの名無しさん
2010/09/01(水) 20:02:41そういう意図ではないつもりでしたので、
書くべきではなかったと後悔しています。
ありがとうございました。
0060デフォルトの名無しさん
2010/09/01(水) 20:02:543バイトとかの文字コードの途中で切るとか
「20文字」の中に改行があったらどうすんだとか
そもそも >>54 だとアバウトすぎるんだよ
0061デフォルトの名無しさん
2010/09/01(水) 20:20:350062デフォルトの名無しさん
2010/09/01(水) 20:25:320063デフォルトの名無しさん
2010/09/01(水) 20:38:45半角をぜんぶ全角に置き換える処理を入れてみてはどうか
0064デフォルトの名無しさん
2010/09/01(水) 20:39:57だと思うよ
正規表現は勉強しておいたほうがいいな
0065デフォルトの名無しさん
2010/09/01(水) 20:46:270066デフォルトの名無しさん
2010/09/01(水) 21:34:510067デフォルトの名無しさん
2010/09/01(水) 21:47:34途中で止まってしまいます。
(227,000 ファイルぐらいのところで止まります)
師匠、何が原因なのか助言頂けると助かります。
環境:Windows 7
Ruby:ActiveScriptRuby 1.8.7(p302) with-winsock2 tcl-stub
ソースは↓
0068デフォルトの名無しさん
2010/09/01(水) 21:49:04def 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:15print "\"#{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:440071デフォルトの名無しさん
2010/09/01(水) 22:14:180072デフォルトの名無しさん
2010/09/01(水) 22:17:020073デフォルトの名無しさん
2010/09/01(水) 22:23:33SHA1 のところをコメントアウトしても
止まるんです。
>>72
マルチスレッドだとどう書けばいいのでしょうか
お手数ですが、サンプルでも頂けると助かります。
0074デフォルトの名無しさん
2010/09/02(木) 00:51:39これは実行するたびに変わるんかい?
0075デフォルトの名無しさん
2010/09/02(木) 06:47:18同じ時もあるし、違う時もあるんです。
出力が行の途中で止まっていることもあって
いることも、、、
0076デフォルトの名無しさん
2010/09/02(木) 07:57:080077デフォルトの名無しさん
2010/09/02(木) 12:34:59止まっているというのがどういう状態か詳しく
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おわびに今手元で軽く動かしてみてる。
0079デフォルトの名無しさん
2010/09/02(木) 13:20:430080デフォルトの名無しさん
2010/09/02(木) 13:32:12Find.find の結果としてサブディレクトリ含めて20まんこ超したってことだろ
Find.find をカウントだけした結果が、エクスプローラなどで表示される総ファイル数と同じであることのチェックからだろうな
0081デフォルトの名無しさん
2010/09/02(木) 14:05:12$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コマンドプロンプトにログ流すのが重いのかもしれない
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関数の件、ご指摘ありがとうございます。
__send__メソッドは知らなかったです。面白いメソッドですね。
どうもありがとうございました。
0086デフォルトの名無しさん
2010/09/02(木) 19:16:40メソッド名で手続き実体のようなオブジェクトにアクセスすることもできません。
Proc オブジェクトを使って以下のようにします。
methods = [Proc.new{a()}, Proc.new{b()}, Proc.new{c()}]
methods[1].call()
0087デフォルトの名無しさん
2010/09/02(木) 19:31:08print n
end
Proc.new{a()}.call(1234)
wrong number of arguments (0 for 1) (ArgumentError)
0088デフォルトの名無しさん
2010/09/02(木) 19:40:25irb> def a(n)
print n
end
irb> Proc.new{|x| a(x)}.call(1234)
1234
008967-69
2010/09/02(木) 20:26:38CPU は 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出力の途中でとまるなら、コードの問題じゃなくてリソースの問題じゃないかな。野生の勘だけど
0091デフォルトの名無しさん
2010/09/03(金) 02:49:34Dir.globはスルーしてくれ
0092デフォルトの名無しさん
2010/09/04(土) 01:08:130093デフォルトの名無しさん
2010/09/04(土) 01:29:210094デフォルトの名無しさん
2010/09/04(土) 08:49:19マイコミの漢の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うn
> 閉じ込めたいので
うn?
0097デフォルトの名無しさん
2010/09/05(日) 10:03:29閉じ込めたいのに参照したいって
矛盾してるじゃん
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やりたいことがイマイチ見えない
クロージャに変数testを閉じ込めたいなら
Rubyではこのように書く
入れ子のメソッドはRubyではサポートしない
def a
test = "OK"
Proc.new { puts test }
end
b = a
b.call
0101デフォルトの名無しさん
2010/09/05(日) 10:14:37わかってないわけじゃない
マニュアル嫁レベルでできねーという返答だ
010295
2010/09/05(日) 10:27:09やはりその方法が一番妥当みたいですね。
>>100
入れ子関数がサポートされていないのは残念です。
>>98の方法では、testは隠れてもbが表に出てしまいますし;
クロージャの使用も検討しながら、コードの体系について見直したいと思います。
どうもありがとうございました。
0103デフォルトの名無しさん
2010/09/05(日) 10:30:37v = "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・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:45def 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異国の魔言語みたいでキツイね。
スコープなどの基本的なところから異次元。
0110デフォルトの名無しさん
2010/09/05(日) 21:18:30いやまあ時々変な仕様のとこで引っかかって魔境になったりはするけど
0111デフォルトの名無しさん
2010/09/05(日) 21:19:090112デフォルトの名無しさん
2010/09/05(日) 21:22:49怪獣からみたら、異次元人間に見えるし
そんなもん
0113デフォルトの名無しさん
2010/09/05(日) 21:23:37VB .net になってからはわりと素直
作りやすさのコンセプトが継続されてよくなった感じ
0114デフォルトの名無しさん
2010/09/05(日) 21:32:42Basicの皮を被ったC#だろ
VBが期待されるのは、phpとかhspとかAutoHotKeyスクリプトとかそういうのだからな
0115デフォルトの名無しさん
2010/09/05(日) 21:35:20ここはRubyのスレ
0116デフォルトの名無しさん
2010/09/05(日) 21:36:490117デフォルトの名無しさん
2010/09/05(日) 21:47:35Ruby本体のマニュアルを適当に読んで適当に頭に入れるといい
それに書いてないものはすべて非標準
Railsがどうとか考える必要なし
Railsだけで完結することなんて稀でたいてい他の gem 使うわけだし
0118デフォルトの名無しさん
2010/09/06(月) 00:09:37束縛を共有しているってことでいいのかな。
0119デフォルトの名無しさん
2010/09/06(月) 03:35:45class_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:190121デフォルトの名無しさん
2010/09/06(月) 03:44:010122デフォルトの名無しさん
2010/09/06(月) 03:49:51Activeなんとか単体ならまだマシなんだけど…
0123デフォルトの名無しさん
2010/09/06(月) 03:54:41>>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:480125デフォルトの名無しさん
2010/09/06(月) 04:07:260126デフォルトの名無しさん
2010/09/06(月) 06:17:38012767
2010/09/06(月) 22:08:39私のレベルでは、まだこのエレガントなコードの解読が
出来ていませんが、明日試してみようと思います。
ありがとうございます。
0128デフォルトの名無しさん
2010/09/07(火) 00:18:47例えばログを取るときに
def foobar
logger.debug("#{self.name} foobar called!!")
などと書いてみたのですが、extendした場合なら
モジュール名ではなくextendしたクラス名がself.nameで取れてしまいます。当たり前ですが・・・
Rubyのmoduleは単なるプリプロセッサのようなマクロではない構造なくはないと思っているのですが、
何か良い方法ないでしょうか?
0129デフォルトの名無しさん
2010/09/07(火) 00:23:220130デフォルトの名無しさん
2010/09/07(火) 00:27:21module FooBar
def foobar
logger.debug("FooBar foobar called!!")
こんなコードですね。
ただなんだかRubyらしくないな、と
0131デフォルトの名無しさん
2010/09/07(火) 00:33:46それがないから変数としても用意されてないとか?
0132デフォルトの名無しさん
2010/09/07(火) 10:07:27質問の意図がよくわからない。self.name がモジュール名を返すなら、selfはインスタンスじゃなくてモジュールオブジェクトだよね。
module A
def self.foobar
puts "#{self.name}.foobar() called"
end
end
こうしたいってこと?
0133デフォルトの名無しさん
2010/09/07(火) 10:16:07include 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それはできなさそう
self.class.ancestors を調べれば候補はわかるけど。
でもこんな方法もあるらしいので、頑張ればできるのかな。
ttp://subtech.g.hatena.ne.jp/cho45/20071014/1192319823
遅いだろうからデバッグ用にしか使えないとおもうけど。
0135デフォルトの名無しさん
2010/09/07(火) 13:34:17module L
puts '私はLです'
end
という直書きの仕方はRubyでは普通だと思う
0136デフォルトの名無しさん
2010/09/07(火) 19:38:57module M
puts "Hello, #{method(__method__).owner}"
end
0137デフォルトの名無しさん
2010/09/08(水) 13:06:19まさにそれです。
>>126
何故かActiveSupport 3がパフォーマンス上の理由で、既存のクラスをmixinで拡張するのやめた話を思い出した
0138デフォルトの名無しさん
2010/09/08(水) 13:07:020139デフォルトの名無しさん
2010/09/08(水) 13:14:460140デフォルトの名無しさん
2010/09/08(水) 13:42:05"#{method(__method__).owner}##{__method__}"
でいけました
当たり前なんですが、これを共通化しようとメソッド化して他から呼び出しても、上記を書いたメソッド名が帰ってきます
__method__を引数にして渡すしか無いですかね。
0141デフォルトの名無しさん
2010/09/08(水) 21:15:140142デフォルトの名無しさん
2010/09/08(水) 23:22:01このページの最後の「ただ、名前を入力するとあいさつをするだけのつまらない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:130144デフォルトの名無しさん
2010/09/09(木) 00:28:090145デフォルトの名無しさん
2010/09/09(木) 01:03:33興味のあることを引いて試していく方が良いと俺は思う。
たのしいRubyは、一通りのことを無難に並べているだけの
退屈極まりない本で、オススメしない。
0146デフォルトの名無しさん
2010/09/09(木) 01:16:13初心者スレなので、簡単でもいいので解説を求む。
0147デフォルトの名無しさん
2010/09/09(木) 02:26:28それが出来るのは非プログラミング初心者
だいいちたのしいRubyで文句言うとかどんだけ贅沢なんだよ
みんなのなんとかとかそりゃもう以下略
0148デフォルトの名無しさん
2010/09/09(木) 02:35:52@cgi.headerだと文字列が返ってくるだけで出力はしてないような?
http://rurema.clear-code.com/1.8.7/method/CGI/i/header.html
0149デフォルトの名無しさん
2010/09/09(木) 04:18:25作りたいものがないならプログラミングの勉強なんてやめて他の楽しいことをしましょう
0150デフォルトの名無しさん
2010/09/09(木) 04:24:32改変もとの CGI クラスのインスタンスメソッド CGI#out がどういう動作してるか調べてから改変しろ
なんで改変先しか見てないんだよ
0151デフォルトの名無しさん
2010/09/09(木) 09:45:01死ね
0152デフォルトの名無しさん
2010/09/09(木) 12:53:22いや、俺も長年ぷログラム書いてめし食ってるが、作りたいものが無いなら
別のことした方が絶対楽しいと思う。
0153デフォルトの名無しさん
2010/09/09(木) 13:04:32結果的に早く目的が達成する手段がRubyであるというだけだろう
0154デフォルトの名無しさん
2010/09/09(木) 13:09:13ブラウザの検索エンジンにるりまサーチでもいれとくの推奨
・__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:14x ・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エラーメッセージが糞すぎる
0157デフォルトの名無しさん
2010/09/09(木) 13:36:39なんともなんね
end でなくても } でも同じだとは思うが
自動インデント整形機能のあるエディタだと気づけたりそうでもなかったり
0158デフォルトの名無しさん
2010/09/09(木) 13:52:34いくらRubyのIDEがないなどと言われる現状でも
実際のIDEではリアルタイムである程度文法チェックはしてくれてend閉じ忘れは編集中に表示してくれるが
お使いのエディタにはそういうのない?
endの閉じ忘れチェックの機能くらいはありそうなもんだと思うけど
0159デフォルトの名無しさん
2010/09/09(木) 16:05:32君はまずendをつけ忘れるレベルから脱却しなさい
0160デフォルトの名無しさん
2010/09/09(木) 16:09:23構文規則的にどうにもできないものだからどうしようもない。
0161デフォルトの名無しさん
2010/09/09(木) 16:12:07一つは(>>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:24end抜けを発見するオプションが無かったっけ?
0163デフォルトの名無しさん
2010/09/09(木) 17:07:07Rubyやってない人のスレへの参加はご遠慮いただいております
0164161
2010/09/09(木) 17:21:29意味不明。>>161は現在のRubyの話だよ。(K&R Cは過去の話だ。)
もちろん顧客相手の開発ではなくて、ごく個人的なツール開発だけど、それは無問題だろ?
0165デフォルトの名無しさん
2010/09/09(木) 17:25:040166デフォルトの名無しさん
2010/09/09(木) 17:28:14俺もだいたい同意見だが、いくつかフォローが必要そうなので書いてみる。
vim で色分けを有効にしてると、if end などの end と、メソッドやモジュールの end は
違う色になるので、対応がずれてると気付く。
それから、(3) を補足すると、やたら制御構造であれこれ書くのではなく、Ruby らしく
ブロック付きメソッド呼び出しを積極的に使うようにして、ブロックは do end でなく { } で
囲む。ということ。
0167161
2010/09/09(木) 17:34:33ああ、揚げ足取りがしたかったのか。いかにも2chらしいレスですね。
では、>>161(5)の末尾の文章を以下のように訂正。
[X] 例:end % module
[O] 例:end # module
0169デフォルトの名無しさん
2010/09/09(木) 17:49:490170デフォルトの名無しさん
2010/09/09(木) 17:59:08素直にMLや研究室に引きこもってりゃいいのにと思うことはある
0171デフォルトの名無しさん
2010/09/09(木) 18:09:030172デフォルトの名無しさん
2010/09/09(木) 18:10:35module A
end == A
0173デフォルトの名無しさん
2010/09/09(木) 18:13:49module … end や class … end 自体は nil を返す
無意味な比較をするくらいならコメントでも書いたほうがマシ
0174デフォルトの名無しさん
2010/09/09(木) 18:14:570175デフォルトの名無しさん
2010/09/09(木) 18:18:26irb> class C; 1; end
1
def ... end が nil を返すから class や module も nil になることが多いというだけ
最後に何か書けばそれが返る
0176161
2010/09/09(木) 18:18:34このコードは、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年前のコードをそのままコピペした)
(続く)
0177161
2010/09/09(木) 18:22:46以下は、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:310179デフォルトの名無しさん
2010/09/09(木) 18:34:540180デフォルトの名無しさん
2010/09/09(木) 19:06:19それいったらみんなphpにいっちゃう(初心者は)
0181デフォルトの名無しさん
2010/09/09(木) 19:48:10いや、発端の質問(>>149)の内容は「あるruby本が難しそう」なのに、
それを>>149,151が勝手に「作りたいものが無い」へと改変してレスしてるのが問題な訳で
おそらく「作りたいものが無い」というのは>>149,151本人の切実な悩みで、
それを(>>149が自分より低レベルな初心者だと見下して)ヤツアタリしてるだけじゃないかと思われる
0182デフォルトの名無しさん
2010/09/09(木) 19:53:24改変レスしたのは>>149,151じゃなくて>>149,152だ ,,,, orz吊ってくる
0183デフォルトの名無しさん
2010/09/10(金) 02:30:15おじさんつられちゃうぞ
制御構造をブロックで表現するもの場合は do end したくなるが、
mapのようにEnumerableなものは複数行でも { }で表したくなるということだな。
>>161で言っている意味わかってきた
複数行=do end厨の俺にはつられたくなるのも分かる
0184デフォルトの名無しさん
2010/09/10(金) 06:20:30よくわからないで煽ってる君向けのスレ
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自分もようやくそれに気づいた。
35年間独学でプログラミングを勉強してきたが
何一つ身につかなかったのは、能力のせいではない。
結局自分がプログラムを作る必要に
迫られていなかった、ということだ。
作りたいモノがあるなら、作りたいという情熱があるなら
どんな難しい本でも読みあさって身につけていたはずだ。
0188デフォルトの名無しさん
2010/09/10(金) 07:26:24板と釘と金槌買ってきて本を見ながら釘打ちと釘抜きを100回繰り返しても辛い
0189デフォルトの名無しさん
2010/09/10(金) 07:41:13C#やJavaで放っておいても見慣れたウィンドウがぽこぽこできる環境だと作りたいものが思いつくかも
あるいはその逆もあるかも
かものはしかも
0190デフォルトの名無しさん
2010/09/10(金) 08:30:26ここは初心者スレであって、バトルスレではない。
また、少なくとも>>143のカキコは初心者の態度としてマナーを逸したものでは無く、
なおかつ「プログラミングが楽しくない」とか「造りたいものが無い」とは、どこにも書かれていない。
そんな>>143をつかまえて、いきなり「勉強なんてやめろ(>>149,152)」とレスするのは
非常識ではないのか、と言いたかった。
カキコのネタが無いなら黙っていればいい。漏れはそうだった。
あるいは「具体的には、どこが難しいと思ったの?」と逆質問を返すこともできたはずだ。
まあ、バトルスレでハイテンションになっていたというのは理解した。
漏れはてっきり、>>148,152を心身に重い障害(ストレス)を抱えた気の毒な人のカキコだと勘違いしたよ。
再度、言う。ここは初心者スレであって、バトルスレではない。
自分にしか分からないスレ違いの話題で初心者を惑わすのは、それこそ悪徳商法または新興宗教の手口。
そして、誰でも最初は皆初心者であったことを想い出せ。
0191デフォルトの名無しさん
2010/09/10(金) 08:45:140192デフォルトの名無しさん
2010/09/10(金) 09:42:51いや、35年やって身に付かないなら、さすがに他にもっとクリティカルな問題があるよ…
0193デフォルトの名無しさん
2010/09/10(金) 09:43:49君のような人間の隔離スレだ
ttp://hibari.2ch.net/test/read.cgi/tech/1276128624/
そして二度と出てくるな
0194デフォルトの名無しさん
2010/09/10(金) 11:26:12Railsスレみたいになっても知らん
0195デフォルトの名無しさん
2010/09/10(金) 11:38:360196デフォルトの名無しさん
2010/09/10(金) 11:40:35http://www.yomiuri.co.jp/national/news/20100910-OYT1T00389.htm
0197デフォルトの名無しさん
2010/09/10(金) 15:16:020198デフォルトの名無しさん
2010/09/10(金) 21:28:520199デフォルトの名無しさん
2010/09/10(金) 22:43:180200デフォルトの名無しさん
2010/09/10(金) 22:48:08SUGEE
「そのまま」がポイントだな
0201デフォルトの名無しさん
2010/09/11(土) 01:30:480202デフォルトの名無しさん
2010/09/11(土) 04:29:10testだったらどっちになるんだ?
0203デフォルトの名無しさん
2010/09/11(土) 04:33:23Cの100倍くらい覚えることが多い感じっすね。
オブジェクト指向のため、言語仕様がデカくて複雑。
プログラミング初心者が最初に学ぶべき言語では
ないと思うっす。
0204デフォルトの名無しさん
2010/09/11(土) 04:40:220205デフォルトの名無しさん
2010/09/11(土) 04:44:560206デフォルトの名無しさん
2010/09/11(土) 04:58:51JISやISOの仕様書はだいたい200ページ
Rubyのドラフト規格(まあサブセット的なものではあるけど)も200ページぐらい
0207デフォルトの名無しさん
2010/09/11(土) 05:12:120208161
2010/09/11(土) 05:50:36わかってもらえる人が増えてくれるというのは嬉しいものです。
>>176,177のコードを読むポイントは、以下の3点だと考えました。
(1)if や case は「文」ではなく、「式」である。
(2)複数行(式)から構成されるブロックの評価値(戻り値)が、最後の式の評価値である。
(3)メソッドセレクタ(".")はUNIXシェルのパイプ("|")である。
0209デフォルトの名無しさん
2010/09/11(土) 06:04:59でしょ。
Rubyで楽しくプログラミングを学ぼう!なんて謳い文句の
入門書があるけど、あれはひどいと思うっす。
たぶん本を買った人のほとんどが挫折してるっす。
0210デフォルトの名無しさん
2010/09/11(土) 06:38:130211デフォルトの名無しさん
2010/09/11(土) 07:21:10最初の頃はシンプルだったけど、今はすげぇ水膨れしてる気がすう。
Cにしたって、Windowsみたいにライブラリーが膨大だと、stdio.h, stdlib.hさえ
押さえればなんとかなるUNIXのCよりずっと難しい。
0212デフォルトの名無しさん
2010/09/11(土) 07:44:300213デフォルトの名無しさん
2010/09/11(土) 14:15:20処理系がどうなってるか想像できれば納得できるけど入門者に理解できるのかこれ
0214デフォルトの名無しさん
2010/09/11(土) 14:23:13単一class継承だけどmoduleのMix-inはあるし、
メタプログラミングがやたらと使われてるから
0215デフォルトの名無しさん
2010/09/11(土) 14:24:03俺のことかー!!!
たのしいRubyが微妙すぎ、初めてのプログラミング最高。
0216デフォルトの名無しさん
2010/09/11(土) 14:36:06プログラミング言語初心者でなければ、
ここの第三回を読めば分かるはず
http://itpro.nikkeibp.co.jp/article/COLUMN/20060825/246409/
プログラミング自体が初めて、あるいはOOP初体験というなら、
そもそもOOP自体が非常に難しい概念になると思う
0217デフォルトの名無しさん
2010/09/11(土) 14:36:38ナカーマ
たのしいRubyはたしかに微妙だった。
逆引きハンドブック読んだら、
数字の並んだファイルを読み込んで
いい感じに処理してCSVで吐き出す
くらいのミニミニスクリプトは書けるようになった。
どういうときに自分でクラスを作ればいいのかは、いまだによく分からん。
0218デフォルトの名無しさん
2010/09/11(土) 16:32:190219デフォルトの名無しさん
2010/09/11(土) 17:20:01こんな面白いのはLISP以来かも
0220デフォルトの名無しさん
2010/09/11(土) 17:41:01ただRubyの仕様も初心者が使うべきでないものがいくつもある
特異メソッドとかalias, undefには手を出さない方が良い
継承もできるだけ使わない方がいい
委譲とダックタイプでほとんど事足りるのだから
0221デフォルトの名無しさん
2010/09/11(土) 18:30:41Rubyでmainって「トップレベルのself」ってイメージがあるから
あんまり使いたくないなあその名前
0222デフォルトの名無しさん
2010/09/11(土) 18:40:24わざわざ被る名称を選ぶこともあんめえ
$ ruby -e "p self"
main
$
0223デフォルトの名無しさん
2010/09/11(土) 21:37:33の方がよさげな気がする・・・と言いたいところなんだがお前らだとどうかナ
全編通して1.9で解説してるのを良しとするかどうかがこのスレ的に微妙かも知れんが
0224デフォルトの名無しさん
2010/09/11(土) 21:41:56それぞれの長所短所を教えてもらえると嬉しいです。
0225デフォルトの名無しさん
2010/09/11(土) 21:50:11net/http はHTTPを直接喋るために使う。
HTTPリクエスト/レスポンスヘッダを操作したり(セッションとか
クッキーの操作も結局はこれ)、GET以外のメソッドを使ったり。
open-uriはURIをファイル名であるかのように見なして内容を取得する
という限られた用途のために使う。内部ではnet/httpを道具として使っ
ている。
わからないうちは、
単にURLの指す内容をHTTP GETするだけなら open-uri
それ以上のことがしたいなら net/http
0226デフォルトの名無しさん
2010/09/11(土) 21:55:59そのnet/httpを利用して便利にサイト取得できるようにしたのがopen-uri
open-uri は HTTP の知識がなくても利用できるが、 net/http は基礎動作過ぎて HTTP の知識がないと扱えない
open-uri のほうが一般ユーザー向けだが、open-uri はぜんぜん万能ではないので、
open-uri にできないことに遭遇したなら、標準ライブラリの範囲内では net/http を勉強して利用するしかない
0227デフォルトの名無しさん
2010/09/11(土) 22:16:35net/http 自体はそれなりにそこそこ使いやすくはある
0228224
2010/09/11(土) 22:42:09色々調べてみたらこの2つのライブラリを発見したので聞いてみました
とりあえずそういう用途ならopen-uriのほうが良さそうなのかな
たくさん答えていただいてありがとう
0229デフォルトの名無しさん
2010/09/11(土) 23:09:24アプリはあんまり作らない方がいいんじゃないかな。
この前ニュースになったでしょ。
図書館の蔵書情報を得ようとして
自作アプリからサイトにアクセスしまくって
ダウンさせた人が逮捕されたってのが。
0230デフォルトの名無しさん
2010/09/11(土) 23:32:38三菱が埋め込んだサイト側のバグだろ
その逮捕は取り消されるべき
0231224
2010/09/11(土) 23:41:29ここからとってきてるんだけど、これもダメなの?
図書館のやつはapi用意してなかったところに直接アクセスかけまくったのが発端なんじゃないの?
誰が悪いかは別としてさ
0232デフォルトの名無しさん
2010/09/11(土) 23:50:13Q:アフィリエイトプログラムを利用することはできますか?
リクルート Webサービス利用規約に反しない限り、アフィリエイトプログラムを利用することができます。
http://webservice.recruit.co.jp/regulation.html
提供目的
本APIは、リクルートが提供する情報の利用価値の向上を目的として提供されます。
利用者は、この目的を理解した上で、この目的に反しない範囲において、本利用規約中の定めに従い、本APIを利用することができます。
だよもん
0233デフォルトの名無しさん
2010/09/12(日) 00:30:14APIの公開/非公開は関係ない。
一定の常識があれば、連続的に間隔を置かずアクセスすれば、
相手(Webサービス提供者)に迷惑がかかることは分かるだろ。
API非公開でも(生のHTMLをGETしても)、一定の間隔を置けば無問題だし、
API公開サイトでも、長時間に渡って無間隔でアクセスし続けるのは問題になる。
自分の行為が相手にとって迷惑かそうでないか、社会一般常識と照らし合わせて判断し、
マナーを守ってサービスを利用しなさいってこと。子供じゃなけりゃ何も難しいことじゃない。
>>229は、本人が常識を知らないお馬鹿さんだから、無視してヨシ
あるいは、単なる嫌がらせカキコだよ
0234デフォルトの名無しさん
2010/09/12(日) 00:38:120235デフォルトの名無しさん
2010/09/12(日) 02:37:04open-uriはメソッド拡張しちゃうのがキモいから、俺はスクリプティング専用にしてる。
0236デフォルトの名無しさん
2010/09/12(日) 11:42:13net/httpで実装を始めて必要に応じてStringIOを返す
メソッドを自作した方が後々楽だし弊害も少ない
0237デフォルトの名無しさん
2010/09/12(日) 23:32:130238デフォルトの名無しさん
2010/09/13(月) 01:05:26おいおい、俺はRuby初心者に警告してやってるんだぜ。
もしこのようなWEBアクセスアプリを組む目的で
Rubyを学ぼうとしているなら、それはやめた方がいい。
0239デフォルトの名無しさん
2010/09/13(月) 01:11:58お前はいったい何を言ってるんだ
0240デフォルトの名無しさん
2010/09/13(月) 14:17:32両方持ってるが、後者のほうが色々と実践的かつ親切だとは思う。
defで関数の定義をする解説なんだが
たのしいRubyは「こうやったら作れるよ」で終わってる所を
Rubyはじめてのプログラミングでは「こうやったら作れるよ、こういう時に作るんだよ」まで書いてある感じかなぁ。
でも三冊揃えるとたのしいRubyの倍くらいの価格だし、実践的である分初心者には難しく映るかも。
0241デフォルトの名無しさん
2010/09/14(火) 02:34:00Thread → そのスクリプトの中である処理を同時に行う
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() を呼んだ方か
複製されたもうひとつの自分かを示しているので
戻り値に従って次の動作を変えるようにプログラムするのが普通
0243デフォルトの名無しさん
2010/09/14(火) 02:52:40pid = 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通常、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:590247デフォルトの名無しさん
2010/09/14(火) 04:02:04ネットウォッチとアフィリエイトサイト作成も入れてくれ
0248デフォルトの名無しさん
2010/09/14(火) 04:03:43fork→mswin32だと使えない
Thread→mswin32でも使える
0249デフォルトの名無しさん
2010/09/14(火) 08:19:51cgi.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:05irb1.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別にあおりじゃないけど、cgi.rbのタグ生成メソッドを使ってる人って初めてみた。
あれって何か利点あるのかな。ERBのほうがずっとつかいやすいんだけど。
0252デフォルトの名無しさん
2010/09/14(火) 09:56:37・ cgi.ol(){ … } はブロック内のオブジェクトを to_s して処理する
・ Ruby1.8のArray#to_s は要素連結だが Ruby1.9 のは inspect だ
という複合要因だな
配列をそのまま「自動to_s機構」に渡すのはわりとバグ入れ行為だ
Array#join とかで自前で明示的に文字列にしておいたほうが安心
0253デフォルトの名無しさん
2010/09/14(火) 09:58:08Ruby のブロックつきメソッドで「R u b y ら し く」 HTML を生成することができます
うん、そんだけ
Rubyスゲー時代にうっかりRuby駆使して作ったライブラリが今も残ってる状態
0254デフォルトの名無しさん
2010/09/14(火) 10:05:460255デフォルトの名無しさん
2010/09/14(火) 11:10:250256デフォルトの名無しさん
2010/09/14(火) 11:21:120257デフォルトの名無しさん
2010/09/14(火) 11:29:550258デフォルトの名無しさん
2010/09/14(火) 11:41:27Ruby on Rails がいちばん完成度が高いというか、Ruby 以外では Rails 相当を作っても得しないんだ
どー考えてもライブラリを直接書いたほうが早い
ああ、Lisp なら得できるかも
0259デフォルトの名無しさん
2010/09/14(火) 12:27:07かなりいろいろ全方位射撃したぞお前
0260デフォルトの名無しさん
2010/09/14(火) 12:38:28というのは甘酸っぱい青春の思い出的にわりと広く認知されていることだと思ったが違うのか
0261デフォルトの名無しさん
2010/09/14(火) 12:41:470262デフォルトの名無しさん
2010/09/14(火) 12:44:41Rails on Ruby じゃない訳?
0263デフォルトの名無しさん
2010/09/14(火) 13:06:400264デフォルトの名無しさん
2010/09/14(火) 13:15:020265デフォルトの名無しさん
2010/09/14(火) 14:16:25アホなんで教えてちょんまげ
0266デフォルトの名無しさん
2010/09/14(火) 14:52:28レールを屋根にのっけて止まってる電車の違いじゃ
どっちもかわらんのじゃ
0267デフォルトの名無しさん
2010/09/14(火) 15:15:300268デフォルトの名無しさん
2010/09/14(火) 17:35:23ピクセル毎の RGB 値を取得できるライブラリでお勧めはありますか?
複数人で使用するため、なるべく導入が簡単なものがいいです
0269デフォルトの名無しさん
2010/09/14(火) 20:37:16レンサバが先に逮捕されそうな気がするけどどうだろう?
0270デフォルトの名無しさん
2010/09/14(火) 20:46:14板違い
0271デフォルトの名無しさん
2010/09/14(火) 20:51:36その話はもうやめよう。
Rubyからサイトにアクセスするなんて
初心者のやることじゃないし。
0272デフォルトの名無しさん
2010/09/14(火) 20:59:070273デフォルトの名無しさん
2010/09/14(火) 21:08:170274デフォルトの名無しさん
2010/09/14(火) 21:16:21別に板違いでもないし、明日は我が身だと思うけどな
まぁ禁止ならこれで終わりでいいです
229とは別人っす
0275デフォルトの名無しさん
2010/09/14(火) 21:21:520276デフォルトの名無しさん
2010/09/14(火) 21:23:48書くとイチャモン付けて潰そうとしてくる変なやつらが
常駐してるんで、スレが荒れるからそれ以上書かないことにした。
Rubyは他サイトに容易にアクセスできる言語だから
初心者が安易にそういうスクリプトを書かないよう
指導するのもこのスレも役目だと思うんだけどさ。
0277デフォルトの名無しさん
2010/09/14(火) 21:34:0310並列で毎秒100とかとんでもないことをやんなきゃ
安易に書いたっていいじゃん。
どっちかといえば、安直に調書にサインするからこんなことに
なるんだってのを広める方が大事じゃね?
0278デフォルトの名無しさん
2010/09/14(火) 21:39:13クロスドメインクッキーインジェクションとかの話もしてください
0279デフォルトの名無しさん
2010/09/14(火) 21:45:49あきらかに自分のアクセスが原因で落ちていることは分かっているのに
IPアドレスブロックされてもプロバイダ変えてしつこくアクセスしたら
そりゃ相手が糞システムだと言い張る度胸はなかなか持てない
0280デフォルトの名無しさん
2010/09/14(火) 21:53:00よく分からんけど、料理板の包丁初心者スレで
包丁は殺人の道具になるから安易に振り回さないよう注意してあげたほうがいいよね!!
などと、言ってるのと大した差は無かったりする
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まあそういうことになるよな
単なる自転車置き場の議論だ
0283デフォルトの名無しさん
2010/09/14(火) 22:25:380284デフォルトの名無しさん
2010/09/14(火) 22:34:57「ボクでも話に参加できる」からなー
タチ悪いわー
0285デフォルトの名無しさん
2010/09/14(火) 22:42:08まともなシステム作ったことないだろ。
実際同じソフトを使ってたほかの図書館では通常利用で落ちてたということだし。
0286デフォルトの名無しさん
2010/09/14(火) 22:47:13移動に伴って変わるのと、ブロック回避のために変えるのを同一視か。
0287デフォルトの名無しさん
2010/09/14(火) 22:53:380288デフォルトの名無しさん
2010/09/15(水) 00:27:54まとめサイトも張らずに(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まとめもなにも、みんな知ってて話してるものかと眺めていたが、
読み返すと確かに経緯を知らない奴もいるな。
0290デフォルトの名無しさん
2010/09/15(水) 00:42:040291デフォルトの名無しさん
2010/09/15(水) 04:01:550292デフォルトの名無しさん
2010/09/15(水) 08:00:13読めますが?
0293デフォルトの名無しさん
2010/09/15(水) 09:56:38それでも、たとえ図書館や警察やMDISがアホだったという結果論だったとしても、実際にプログラム作成者が逮捕されたのは事実
日本では、逮捕される=犯罪者、という誤った認識がある以上、社会的に終了しないためにも逮捕されるのだけは避けなくてはならない
そうした上で、そういう誤認逮捕を可能な限り事前に避ける為には、どうすれば良いか?、という話を振ったつもりだった
上級者ならそういう情報や技術に長けてるから、自分で回避できるだろうけど、初心者はそういう事件があったことすら知らないかもしれない
そういうのが、最初から自分のパソコン(自鯖含む)からスクレイピングやらなにかやりはじめたら、同じように逮捕されるリスクを伴う
レンサバなら、苦情は一旦レンサバ側に行くから、いきなり即逮捕されることはないんじゃないだろうかと思った
でもRubyやRailsを自分の都合のいいように使えるレンサバはまだ少ないから…
長くなってしまったのでここでやめておこう
0294デフォルトの名無しさん
2010/09/15(水) 10:02:520295デフォルトの名無しさん
2010/09/15(水) 10:05:29岡崎の件ではさくらにも捜査が入ってトラウマになったのか
さくらの利用規約が変わったとか
つまりレンサバの共同利用者にも迷惑が掛かる行為だと認識すべし
0296デフォルトの名無しさん
2010/09/15(水) 10:13:17安いVPSいっぱい出てるからこれから増えるよ
0297269
2010/09/15(水) 10:29:38自分もこの事件が起こるまではそういう考え方だった
いきなりレンサバで動かしてリソース使いまくったらほかの利用者に迷惑掛かるだろうから、まずは自分のパソコンだけでいろいろやってみて、上手に使えるようになったらサーバで使おう、と。
でも、この事件によって、自分のパソコンでいろいろやってみてる間に逮捕される可能性があることがわかった
例の逮捕者は、3箇所からアクセスしていて、そのうちのひとつがさくらなんだろうけど、仮にさくら1箇所からだけしかアクセスがなかったとしたら、今回のような「即逮捕」になっただろうか?
アクセス元が個人じゃなく、特定のレンサバだったら、逮捕前にもうワンクッションあったと思うんだよね
それによって利用者がさくらを利用停止や強制退会になったとしても、逮捕に比べりゃ全然マシといえる
同じさくらの周りの利用者にとってはいい迷惑かもしれんが、自分が逮捕される可能性が少しでも減るなら背に腹は変えられない
0298デフォルトの名無しさん
2010/09/15(水) 10:39:50>プロバイダより割り振られるIPの自宅や実家(4月2日から4月15日、Thinkpadを持ち運んで自宅と実家から手動で、日毎にどちらか一方から)
憶測で悪いんだけどこの時間の流れ見ると
4/1にさくらのIPアドレスがアク禁になったから自宅と実家からやり始めたように見える
0299デフォルトの名無しさん
2010/09/15(水) 10:44:02まずさくらで使っていて、さくらのIPアドレスでアクセス禁止が行われた。
しかし、さくら側に連絡が行ったわけではなかったので気づけず、
さくら側のCPU占有率制限に引っかかったと誤解して、
さくら以外からアクセスすることになった。
で、警察的はこれが「制限したのにアクセスしてくるから悪質!」と取られたわけだ。
ということもまとめサイトに書いてあります。
0300デフォルトの名無しさん
2010/09/15(水) 11:10:05マスゴミでももっと大きく取り上げても良いと思うんだがな
0301デフォルトの名無しさん
2010/09/15(水) 11:14:22同意
0302デフォルトの名無しさん
2010/09/15(水) 11:30:40http://www26.atwiki.jp/librahack/pages/13.html#id_4bf02553
この事件について語りたい奴は、これらのスレへ逝ケ!!
0303デフォルトの名無しさん
2010/09/15(水) 14:00:520304デフォルトの名無しさん
2010/09/15(水) 14:03:340305デフォルトの名無しさん
2010/09/15(水) 14:49:570306デフォルトの名無しさん
2010/09/15(水) 19:50:51Rubyスレどころか「初心者スレ」だからな
本スレでやるならともかく
0307デフォルトの名無しさん
2010/09/15(水) 22:20:35今まで自分で実装していた同種のものより圧倒的に速いんですけど
これってC言語で書かれているんですか?
0308デフォルトの名無しさん
2010/09/15(水) 22:43:30ついでに、
Array.instance_method(:repeated_combination).source_location
#=> nil
Rubyで実装されたメソッドの場合はその定義位置が返る。
0309デフォルトの名無しさん
2010/09/15(水) 23:36:21って Ruby のバージョンいくつが対象ですか?
0310デフォルトの名無しさん
2010/09/15(水) 23:41:29だった
スマソ
0311デフォルトの名無しさん
2010/09/15(水) 23:57:42たまにRuby win32のスクリプトをbatファイルがわりに書く事があるのですが、
外部コマンドの実行をするベストソリュー・・・ 良い方法は何があるでしょうか?
Kernel#sysmem逐一実行してくれるのですが、例えばloggerに渡したい時などに出力を得られません。
`your_command` の記法だと出力を得られるのですが、逐一出力が得られません。
よい方法はないでしょうか?
0312311
2010/09/16(木) 00:40:14win32-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コマンドラインからなら、STDOUTに出しておいてteeにでも渡せばいいのですが、
あくまで例の一つですが、.irbrcでRails版irb(script/consoleです)のlogger出力を置き換えたい時に
RAILS_DEFAULT_LOGGER = Logger.new(STDOUT)
とだけすると、コンソールにはlogger出力ができて便利にはなるのですが、
デフォルトのようにファイルにはログを吐く、ということができません。
Loggerで複数の出力先を指定する方法はないのでしょうか?
IOを渡せばいい、ということであれば複数に出力するIOなんてあるものでしょうか?
0314デフォルトの名無しさん
2010/09/16(木) 06:35:30Logger のマニュアルを見ると 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まだ眠い
あと標準出力は定数 STDOUT ではなく予約されたグローバル変数 $stdout を使うのが普通
(というか昨今のマナーとしてほぼ必須)
なんでかというといざというときに捻じ曲げ可能で便利だから
$stdout = File.new('output.txt', 'wb')
とするとそれ以降の $stdout 対応メソッド、関数的メソッド puts や print や p の出力先がファイルになる
こんなこともあろうかと超便利
0316デフォルトの名無しさん
2010/09/16(木) 09:12:251.9系が基本で、バージョンで差異がある部分には都度言及がある。
0317デフォルトの名無しさん
2010/09/16(木) 11:11:42上手くインストールできていないみたいで困ってます。
コマンドは以下の通りです。
$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:400319デフォルトの名無しさん
2010/09/16(木) 13:11:10rubygemsの仕組みは1.8が出てからデファクトスタンダードになり、
1.9で標準添付になった、という経緯なので、1.8では明示的に
ライブラリとして rubygems を require する必要がある。
irb -rubygems -rmysql
シェルの設定で
RUBYOPT=-rubygems (または、RUBYOPT=-rrubygems)
export RUBYOPT
しておくと、勝手に毎回使ってくれるのでおすすめ。
0320デフォルトの名無しさん
2010/09/16(木) 14:30:400321デフォルトの名無しさん
2010/09/16(木) 15:10:12指定したRubyGemsが1.9に対応しているかチェックするwebサービスなかったけ?
0322デフォルトの名無しさん
2010/09/16(木) 16:24:240323デフォルトの名無しさん
2010/09/16(木) 19:10:34ありがとうございます。無事require出来ました。
0324デフォルトの名無しさん
2010/09/16(木) 19:32:02うん、require 'rubygems' は必要な人が必要な時に自力で書く
0325デフォルトの名無しさん
2010/09/17(金) 07:20:40gem ライブラリとして公開するときは書かないほうがいいんだっけ
0326デフォルトの名無しさん
2010/09/17(金) 18:32:01id|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:30ActiveRecodeの振る舞いに関する相談なんだから、
このスレじゃなくWebProg板のRailsスレで質問すべきだろうし、
そのほうが>>326が期待する返答を得られると思うよ
0328デフォルトの名無しさん
2010/09/17(金) 19:14:08ただ、回答率は低いとは思うが
0329デフォルトの名無しさん
2010/09/17(金) 19:26:40SELECT 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:58sqlite使ったことないけどおかしいし、かなり遅くなると思うだが
sqliteの時点でパフォーマンスなんて関係ないかもしれんが
0331デフォルトの名無しさん
2010/09/18(土) 00:34:06x=5
end
puts x => 5
これは・・・rubyの仕様なのですか?
0332デフォルトの名無しさん
2010/09/18(土) 00:36:570333デフォルトの名無しさん
2010/09/18(土) 00:37:000334331
2010/09/18(土) 01:06:19nilを期待してました。。
>>333
ありがとうございます。
そういうことだったのですね。
for i in 1..10
puts i
end
puts i => 10
実験してみたらfor文も同様ですね!
う〜ん不思議な仕様だ
0335デフォルトの名無しさん
2010/09/18(土) 01:10:57あと、ブロック(do...end, {...})でのローカル変数の扱いが少し特殊(1.9でシンプルになったけど)
0336デフォルトの名無しさん
2010/09/18(土) 01:26:45(1..3).each do |i|
puts i
end
puts i
0337デフォルトの名無しさん
2010/09/18(土) 07:01:51デーモンとかじゃなくユーザーのプロセスとして動くものでいいんですが。
0338デフォルトの名無しさん
2010/09/18(土) 07:05:590339デフォルトの名無しさん
2010/09/18(土) 07:28:430340デフォルトの名無しさん
2010/09/18(土) 07:32:52そんなものイヤだ…
0341デフォルトの名無しさん
2010/09/18(土) 12:06:02話なら whenever あたりを見ればいいんだが、(簡易な)cronその
ものが欲しいのかな?
0342326
2010/09/18(土) 13:13:20適切な誘導をありがとうございました。2chは広すぎて,適切なスレがわからないこともあります。
(スクリプトのできも含めて初心者ということで^^)
0343デフォルトの名無しさん
2010/09/19(日) 05:16:47Rails関係でバックグラウンドでジョブ走らせる類のライブラリを見たらよいかも
そして、困ったらまずは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:54bach 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:07rvm でローカルユーザについては 1.8.7 と 1.9.2 を切り替えて使うことができるようになりました。
しかしCGIなどウェブサーバで使う Ruby のバージョン切り替えはどうすればいいのでしょうか。
毎回 make install して上書きするものなのでしょうか。
0346デフォルトの名無しさん
2010/09/19(日) 09:03:30よくわからんがyoutubeの動作はyoutubeに聞け
0347デフォルトの名無しさん
2010/09/19(日) 10:36:31rvmでやれんこともないけど。
configureスクリプトの--program-prefix、--program-suffixオプション
などで異なる実行ファイル名になるようにする。
同じく--prefixオプションで入る場所自体を分ける。
など
0348デフォルトの名無しさん
2010/09/19(日) 11:42:06サーバーサイドはrvmのようなものと思想的にあんまし合わない気がする
実行時にさくっと切り替える方法もないしな
/usr 以下に rvm をインストールして運用する方法がオフィシャルにあるので
それ見て適宜 sudo するしかないかと
default_ruby から /usr/local/bin/ruby にシンボリックリンク張っとくとか
0349345
2010/09/19(日) 14:07:25>>348
なるほどちょっとrvmでやる方法はおいといて、先に別名でインストールして切り替える方向で行ってみます。
ありがとうございました。
0350デフォルトの名無しさん
2010/09/19(日) 14:15:20素直にprefixオプションで違う場所にインストールした方がいいよ。
あとはrubyコマンドにシンボリック張り替えるだけでOKでしょ。
0351デフォルトの名無しさん
2010/09/19(日) 14:28:410352デフォルトの名無しさん
2010/09/19(日) 14:50:00それ言ったら話が終わるだろ
0353345
2010/09/19(日) 15:00:37あ、そうですかね。
今標準で入っている1.8.7が/usr/bin/なので
1.9.2を/usr/local/binに素で入れてみます。
あれそうするとシンボリックリンクをどうするのがいいのかな・・・←初心者かww
0354デフォルトの名無しさん
2010/09/19(日) 16:02:34これ使ってインストールして、メインにしたい実行ファイルだけ ruby や irb としてシンボリックリンク張れ
0355デフォルトの名無しさん
2010/09/19(日) 16:18:550356デフォルトの名無しさん
2010/09/19(日) 16:21:110357デフォルトの名無しさん
2010/09/19(日) 16:27:49>>347
既出
0358デフォルトの名無しさん
2010/09/19(日) 16:47:36rails使いなら現状では他に選択肢は無いと思うんだけど。
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はっきり言う
これを解決できないような人間がcygwinなんて使うな
素直にmswin32版使え
0361デフォルトの名無しさん
2010/09/19(日) 21:08:12に一応同意を返しておきたい気はする
xmlParseDocということはlibxml2だな
cygwinってなんか変なとこにヘッダファイル置いたっけ?
とりあえず示されたサイト見るといい
gem installするときにlibxml2やlibxsltのディレクトリを指定する方法が載ってる
0362デフォルトの名無しさん
2010/09/19(日) 21:11:430363デフォルトの名無しさん
2010/09/19(日) 21:16:250364デフォルトの名無しさん
2010/09/19(日) 21:19:55いまは cygwin も主要ライブラリはパッケージですよおじいちゃん
コンパイラ入れないこともできます
0365デフォルトの名無しさん
2010/09/19(日) 21:21:49>>362
cygwin では devel
libxml2-devel と libxslt-devel がいるね
0366デフォルトの名無しさん
2010/09/19(日) 21:50:31require "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から再インストールしたほうがいいでしょうか?
0368デフォルトの名無しさん
2010/09/20(月) 08:22:41rubygemesだからじゃないっすかね
0369デフォルトの名無しさん
2010/09/20(月) 14:17:34,/ ノ ヽ ~\
/ ノ IPA ヽ ~\
/ ノ ヽ、 `ヽ
| ノ / ̄\ / ̄~ヽ ヽ i
| ノ | ノ
\ | <●> <●> ( )
\ | | | i /
| / ヽ レ
i (●_●) /
i、 ,-――-、 ・ /
i、 <(EEEEE)> ∵/ 「言語設計者たちが考えること」にMatzのインタビュー載るからな。おまえら、読めよ。
i、 \___/ _/
\ ,ノ
,,.....イ.ヽヽ、ー-―一ノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
> ヽ. ハ | ||
0370デフォルトの名無しさん
2010/09/20(月) 20:18:16for element in array
puts element
end
Javaみたいに
for (int i = 1; i < 10; i++) {
}
のような書き方をしたい場合は、forではなくtimesメソッドを使わなければ出来ないのでしょうか。
0371デフォルトの名無しさん
2010/09/20(月) 20:21:520372デフォルトの名無しさん
2010/09/20(月) 20:22:01p i
end
0373デフォルトの名無しさん
2010/09/20(月) 20:35:550374デフォルトの名無しさん
2010/09/20(月) 20:37:59for i in 1...10 (終端を含まない)
0375デフォルトの名無しさん
2010/09/20(月) 20:39:10置いただけだからな。ねんのため。
0376デフォルトの名無しさん
2010/09/20(月) 20:44:07イテレーションなら Integer#upto なり Integer#step なり存在するわけで、そっち使うべき
ちなみに Range オブジェクトのデフォは閉区間 ..
0377デフォルトの名無しさん
2010/09/20(月) 21:07:140378デフォルトの名無しさん
2010/09/20(月) 21:14:230379デフォルトの名無しさん
2010/09/20(月) 21:20:06他言語に for や while があるのと全く同じ
0380デフォルトの名無しさん
2010/09/20(月) 21:25:28while に至っては while line = gets do みたいなイディオムしか頭に入ってない
0381デフォルトの名無しさん
2010/09/20(月) 21:29:19必要があるんだ。それくらい使わないモノ。
なのに予約語を2つも占有しやがって…
0382デフォルトの名無しさん
2010/09/20(月) 21:32:48自分も while や for は、最近、ほとんど使った記憶が無い。(erb内を除く)
0383デフォルトの名無しさん
2010/09/20(月) 21:32:54for (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:13from(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:030388デフォルトの名無しさん
2010/09/20(月) 21:53:48>>386
Expression と Statement の区分とオブジェクト指向は何の関連性もない
0389デフォルトの名無しさん
2010/09/20(月) 22:01:511..9.eachだと 9.each がひとかたまりに見なされてしまうので
(1..9).each と括弧をつけなければいけないのが惜しいところだ。
0390デフォルトの名無しさん
2010/09/20(月) 22:09:220391デフォルトの名無しさん
2010/09/20(月) 22:21:501.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:00ttp://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} と書くのはぶっちゃけキモい
そもそもカッコなくしたらメソッドチェーンのドットが浮いてしまうじゃないか
0394391
2010/09/20(月) 22:54:59>>393
ありがとうございます。
なるほど…結合強度の違いでしたか。
{...}ブロックやメソッドチェーンで繋ぐ場合はメソッド引数にカッコ付ける
習慣付けておけばとりあえず回避できそうですね。
0395デフォルトの名無しさん
2010/09/20(月) 23:11:59関数的メソッドくらいだぞ括弧つけないこと検討するの
0396391
2010/09/20(月) 23:25:56Railsのソースを見るとカッコ省略がデフォなんですよね。
これは特殊なケースなのかな。
でも確かにカッコなるべくつけるようにした方が安全ですね。
0397デフォルトの名無しさん
2010/09/20(月) 23:28:55絶対にソースを見てはいけない
0398デフォルトの名無しさん
2010/09/20(月) 23:29:13言語によっては、条件分岐すら
あたかも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:50after rails・・・forを使わない
と思って手元のRailsによるアジャイル開発本みたら、forつかってるし
0401デフォルトの名無しさん
2010/09/20(月) 23:50:51爆釣ですね
0402デフォルトの名無しさん
2010/09/20(月) 23:53:33Smalltalk系の言語か?
io言語もifすらメソッドだった気がするわ。さすがに組み込みだが
0403デフォルトの名無しさん
2010/09/21(火) 00:00:56before/after関係なくforは使わない。
Railsのscaffoldはもと初期はforを使っていたが、最近はeachになっている。
0404デフォルトの名無しさん
2010/09/21(火) 00:10:000405デフォルトの名無しさん
2010/09/21(火) 00:59:03分かる人に解説してもらいながら読むとすごくよく分かるよ
1日で概要掴めた
0406デフォルトの名無しさん
2010/09/21(火) 10:39:31obj#method
とかいう表記で#使って表現してるのはなんかの理由とか由来とかあったりそれともruby業界の慣習とかだったりするんですか?
最初そういう構文があるのかと勘違いしました
0407デフォルトの名無しさん
2010/09/21(火) 10:43:27これだけ、見たまま実行できない
紛らわしい欠陥表記なんだが、うまい代案もないのでずるずるこれが使われてる
0408デフォルトの名無しさん
2010/09/21(火) 10:58:01これですっきりしましたありがとうございます
0409デフォルトの名無しさん
2010/09/21(火) 11:08:120410デフォルトの名無しさん
2010/09/21(火) 11:18:370411デフォルトの名無しさん
2010/09/21(火) 11:33:550412デフォルトの名無しさん
2010/09/21(火) 11:40:19インスタンスメソッドの表記だよね
他の言語だというどういう表記してるんだろう
0413デフォルトの名無しさん
2010/09/21(火) 11:41:200414デフォルトの名無しさん
2010/09/21(火) 11:46:08多分Class#methodのことかな?obj.methodは普通に書くよ
違いは#が「そのクラスから生成されたインスタンスが持つメソッド」
ドットは「そのオブジェクト自体が持つメソッド」
ちなみに元ネタは別の言語らしい、Ruby的には慣習という認識でおk
0415デフォルトの名無しさん
2010/09/21(火) 11:53:45str#downcase とは書かない
String.downcase はクラスメソッドで別物
str::downcase と書く奴は C++ に帰れ
0416デフォルトの名無しさん
2010/09/21(火) 11:59:290417デフォルトの名無しさん
2010/09/21(火) 12:01:59ちなみにクラスやモジュールも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:21Java ですかね。
0420デフォルトの名無しさん
2010/09/21(火) 19:14:23HAHAHA
0421デフォルトの名無しさん
2010/09/21(火) 20:53:280422デフォルトの名無しさん
2010/09/21(火) 20:54:50str = 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いやまあ参照できるんだけど
if 〜 end と一緒
0425デフォルトの名無しさん
2010/09/21(火) 21:23:14いっそブロックの形してるものは一切スコープ作らない、みたいなのならよかったのに
0426デフォルトの名無しさん
2010/09/21(火) 21:45:570427デフォルトの名無しさん
2010/09/21(火) 21:48:410428デフォルトの名無しさん
2010/09/21(火) 21:53:50他にスコープに影響するのは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:27require File.join(File.dirname(__FILE__), 'uri')
# ruby 1.9 限定
require_relative 'uri'
0431デフォルトの名無しさん
2010/09/21(火) 23:49:42require "#{File.dirname(__FILE__)}/uri"
$LOAD_PATH を自力でいじるのは提供ライブラリ内ではやったらイカン
というか問題増えるだけだな
余談だけどRubyが読み書きするファイルのディレクトリ区切りは / 決め打ちできちんと動作する
File.join は作ったファイルパスをOS依存で外部に書き出したいときとかに使えば充分
0432デフォルトの名無しさん
2010/09/21(火) 23:50:070433デフォルトの名無しさん
2010/09/22(水) 00:01:03それ不思議動作だからあんまし使いたくない
リクツ上は $LOAD_PATH + './uri' に該当するファイルがあれば読み込めるはずだろ
RUBYDIR/lib/ruby/1.8/./uri.rb を読まない保証ってなんじゃらほ
誰か安心できる解説とかしてくれないもんかな
あと __FILE__ がどんな起動のされ方どんな読み込み方されても絶対パスを返すかどうかとか
0434デフォルトの名無しさん
2010/09/22(水) 00:43:34/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> RUBYDIR/lib/ruby/1.8/./uri.rb を読まない保証ってなんじゃらほ
ドットで開始されている場合$LOAD_PATHを無視してカレントディレクトリから探す、とかやってくれてるんじゃないと駄目だよね
0436デフォルトの名無しさん
2010/09/22(水) 09:04:34>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:230438デフォルトの名無しさん
2010/09/22(水) 14:29:340439デフォルトの名無しさん
2010/09/22(水) 15:29:38カレントディレクトリが一番最初だろ常考
0440デフォルトの名無しさん
2010/09/22(水) 15:57:37ruby -e "p $:"
0441デフォルトの名無しさん
2010/09/22(水) 19:43:10Win32APIを使えば取得できますか?
UNICODEファイル名にアクセスできるライブラリはありませんか?
0442デフォルトの名無しさん
2010/09/22(水) 19:53:02Rubyの既存のクラスやメソッドと混ぜることはできない
作ってる人はいてもいいんだけど、あまり聞かない
0443デフォルトの名無しさん
2010/09/22(水) 20:07:490444デフォルトの名無しさん
2010/09/22(水) 20:49:580445デフォルトの名無しさん
2010/09/22(水) 21:36:16起こります.
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> 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前半
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:38inspectのはRubyのバージョンアップで対応
悪いこと言わないからバージョンアップしとけ
後者は String の + メソッドの動作が
「自分と引数をくっつけて新規の文字列にして返す」だからだ
これが「自分の後ろに引数をくっつける」だったら望みの動作になっただろう
0449デフォルトの名無しさん
2010/09/22(水) 21:59:51> a = [0]
=> [0]
> a.each{|e| e = 100}
=> [0]
> a
=> [0]
代入した時点であたらしい e が作られてる
その e は配列の要素を指していない
0450デフォルトの名無しさん
2010/09/22(水) 22:38:1510/10まで待てばもしかしたら10.04でもrubyのverがあがるかも
自分はapt-get source rubyで取得したソースでbug修正してdeb作って入れたよ
0451445
2010/09/22(水) 22:54:27ありがとうございます.
前半の方は頑張ってコンパイルしてみます.
後半の方なのですが,String#+メソッドが,新しいインスタンスを
生成することは分かりました.
また,>>449さんによるとObject#=メソッドも新しいインスタンスを
生成するということですが,その場合,それより前に生成された
同名のインスタンスはどうなるのですか?
0452デフォルトの名無しさん
2010/09/23(木) 01:04:11代入は、変数(名前)とインスタンスの結びつきを変える操作。
(複数の結びつきを持つことも可能)
変数が以前に結びついていたインスタンスは、代入によって
結びつきを失う。
あらゆる結びつきを失ったインスタンスもメモリー上には存在
するが、そのメモリー領域はいずれGCによって再利用可能な
状態になる。
100(Fixnum)は少し扱いが特殊だけど、認識としては上のような感じ。
0453445
2010/09/23(木) 08:55:10丁寧な解説ありがとうございます.
私自身,少し勘違いして質問していました.
インスタンスに名前を付けるのに変数が必要なんですね.
0454デフォルトの名無しさん
2010/09/23(木) 09:06:07ラベルなのでひとつのオブジェクトにラベルは何枚も貼れる
ラベルの貼られてないオブジェクトはガベージコレクタさんが定期的に巡回してがーっと捨てる
0455デフォルトの名無しさん
2010/09/23(木) 09:47:35そんなものはない
0456デフォルトの名無しさん
2010/09/23(木) 12:24:36= には大きく別けて2つの使い方があって
1つは「代入」もう1つは「特殊なメソッド呼び出し」なんだ。
違いはドットの有無。
x = hoge #代入
obj.hoge = #特殊なメソッド呼び出し
obj.[x] = #特殊なメソッド呼び出し
代入は、変数の参照先を設定する、もしくは変える操作。
メソッド呼び出しはメソッド呼び出し。ドットの前の変数が参照する先は変わらない。
0457445
2010/09/23(木) 13:06:39ありがとうございます.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> 変数は「オブジェクト置き場に置かれたオブジェクトに貼られたラベル」
変数という「箱」は存在しない
0459デフォルトの名無しさん
2010/09/23(木) 14:07:21そう
配列から既に取り出してしまったものについて代入しても
配列の中身は書き換え出来ないってこと
0461デフォルトの名無しさん
2010/09/23(木) 15:53:30Rubyは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 //エラーになってくれたほうがうれしい
0464462
2010/09/23(木) 18:04:050465デフォルトの名無しさん
2010/09/23(木) 18:20:310466デフォルトの名無しさん
2010/09/23(木) 18:51:540467デフォルトの名無しさん
2010/09/23(木) 19:32:060468デフォルトの名無しさん
2010/09/23(木) 19:50:49クラスメソッドの正体は特異クラスのインスタンスメソッドだったのか
今までのモヤモヤが晴れて全ての謎が解けた感じだ
クラスメソッドなんて呼称は廃止した方がいいんじゃないですかね?
自分のようなJava出身者はみんな悩みそうだ
0469デフォルトの名無しさん
2010/09/23(木) 20:03:20メソッドの呼び出しはできるよね。何を悩んでたんだ?
0470デフォルトの名無しさん
2010/09/23(木) 20:18:51逆だろ
Javaのクラスメソッドはインスタンスからも呼べるけど
Rubyのクラスメソッドでそれが出来ないのが悩みだったんじゃね?
0471デフォルトの名無しさん
2010/09/23(木) 20:22:100472デフォルトの名無しさん
2010/09/23(木) 20:25:12クラスオブジェクトに属してるインスタンスメソッドを特にクラスメソッドと呼ぶ
という見掛けになるので、一応呼び名としての対応は取れてなくもない
どちかってとクラスメソッド内から同クラス内の別のクラスメソッドを呼ぶときどう書けばいいか迷うと思う
0473デフォルトの名無しさん
2010/09/23(木) 20:35:06いや
クラスメソッドしかありえないんだが
Javaがあほすぎなんだろう
0474デフォルトの名無しさん
2010/09/23(木) 20:35:15class 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これが駄目な場合「インスタンスに関係しないメソッドの存在禁止」と言うしかなくなるぞ
それは美しい世界かもしれないが実用上辛い
0476デフォルトの名無しさん
2010/09/23(木) 20:47:08入れ子になったクラス定義かな。あと入れ子になったメソッド定義というのもあるね。
個人的には、Pascalの入れ子だらけになった、非常に読みづらいプログラムを憶い出す。
そんな入れ子でしか記述できない手続き型言語の可読性の悪さを解決するために、
抽象化データやオブジェクト指向が考案されたというのに、退化した時代錯誤な考え方に見える。
名前空間が欲しいのなら、モジュールを使えばいい。
module M
def M.classdisplay; puts M.classstr; end
def M.classstr; "class!"; end
end
0477デフォルトの名無しさん
2010/09/23(木) 20:49:040478デフォルトの名無しさん
2010/09/23(木) 20:51:46class << self ... end の中でのselfは、最初に書いたself(ここではC)の
特異クラスになる。
そしてクラスの中で普通にdefでメソッド定義するとそのクラスのインス
タンスメソッドの定義になることを思い出せば、
クラスメソッド == 特異クラスのインスタンスメソッド
と理解できる、という話じゃないかな。
0479デフォルトの名無しさん
2010/09/23(木) 21:04:58> 入れ子になったクラス定義かな
違う、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@str = {Ruby1.9ならエンコーディング情報つける}
というのはどう書けばいいですか
RUBY_VERSION 使って分岐してもいいですか
0481デフォルトの名無しさん
2010/09/23(木) 22:33:48必要なのはメソッドの存在ではなく、それに付随して呼ばれる長大なライブラリ群だから
メソッドいっこ作ったから回避できるとか言うレベルの問題じゃないことを示す必要がある
たとえばさ
obj.respond_to?(:read) って書いてあったら、
「あーreadで文字列返せるオブジェクトなら動作するのかな」とか思うだろ
でも respond_to?(:force_encoding) とか respond_to?(:encode) とか書いてあっても
「あーここは force_encoding できるオブジェクトならなんでもいいのかな」とは思えないだろ実際
0482デフォルトの名無しさん
2010/09/23(木) 22:41:21それは分かっているんだ。
>>479
可変(mutable)なクラス変数が必要になるの状況はかなり限定されるよね。
プライベートなクラスメソッドが実現できるようになることは明確な利点だけど、
それも上の理由で、用途は一層限定される。
逆に、この記法に慣れて(流行して)一般的なクラスメソッド定義でも使われるようになると、
インスタンスメソッド定義と一目で区別がつかなくなって、かえって可読性が低下するのでは。
特異クラス/特異メソッドの存在を否定する気は毛頭無いけど、それらは本当にそれが
必要な場合に限って使うべきものなんじゃないかと思う。
同様に、近頃はRailsの影響でメタプログラミング(リフレクション)が「流行」しているけど、
それも本来は流行すべきものじゃない気がする。安易な導入は保守性を著しく悪化させるから。
たぶん、数年後には特異クラスやメタプログラミングの多用はバッドノウハウ扱いされるようになると思う。
以上、過去にPascalの入れ子構造とLispのリフレクションに悩んだ、
頭の固いオッサンからの余計なおせっかいですた。
0483デフォルトの名無しさん
2010/09/24(金) 02:39:21Javaみたいな言語と違って、クラスの定義も上から順にスクリプトが走った結果、
クラスが定義され、メソッドが定義され、クラスメソッドが定義されていくよね?
(そういうのはなんというのかはしらん。動的言語ということなのか?)
何が混乱するかというと、言語作者やライブラリ作者の想定通りなんだろうけど、
スコープによってというのかわからんのだが、スクリプトの位置やブロックによって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:13Rubyを使った言語内DSLの設定ファイルなどでも、ブロックによってselfが変わりまくるからな
文法はRubyに近く、一見ライブラリを(ブロックとカッコなしメソッドにより)簡単な文法で利用しているように見えて、
selfがブロックごとに変化しまくる。 >>134 みたいなのがまるで想定しない動作になったりw
0485デフォルトの名無しさん
2010/09/24(金) 05:58:160486デフォルトの名無しさん
2010/09/24(金) 06:53:24>今これselfなに?という感じになってくる
ちょー同意
selfがどこでどう切り替わるか知らないと、rubyのコードは読めないよね。
0487デフォルトの名無しさん
2010/09/24(金) 08:49:00その都度irbで調べてればだいたい分かってくるし。
0488デフォルトの名無しさん
2010/09/24(金) 09:10:02DSL魔術で奔放に構築されているRails関連のソース読んでRubyに文句言う人が絶えないのは何故だ
0489デフォルトの名無しさん
2010/09/24(金) 11:03:16RailsはRubyの代表作で、RailsのおかげでRubyが普及したんだろ。
0490デフォルトの名無しさん
2010/09/24(金) 11:47:210491デフォルトの名無しさん
2010/09/24(金) 12:02:33別に質問スレじゃないからな
わからんのならわからんと続ければ答える気のある奴が続けて返事したりしなかったりするだろう
0492デフォルトの名無しさん
2010/09/24(金) 12:16:12>>462は何人かが意味分からんというレスを返してるけど
本人から何も返答がないからどうしようもないし、
その後の>>469はつぶやきで>>474は提案にしか見えないんだけど。
0493デフォルトの名無しさん
2010/09/24(金) 12:34:22個人的にはJavaScriptのthisよりはマシだと思ってる…
0494デフォルトの名無しさん
2010/09/24(金) 19:22:480495デフォルトの名無しさん
2010/09/24(金) 22:59:11ある言語でクラスとメソッドとライブラリを作ったとして、
そのクラスとメソッドとライブラリの使い勝手が悪かったら言語のせいになるのか
0496デフォルトの名無しさん
2010/09/24(金) 23:08:17いやそうでもないか
いやそうでもないな
0497デフォルトの名無しさん
2010/09/24(金) 23:20:03そうです
0498デフォルトの名無しさん
2010/09/24(金) 23:22:36Delphi馬鹿にするなお
当時のVB4とかと比べてもいい動きしてたお
0499デフォルトの名無しさん
2010/09/24(金) 23:34:51ファイルサイズがデカくてうざかったお
某単機能ツール群を入れただけでUSBメモリがパンパンだお
0500デフォルトの名無しさん
2010/09/25(土) 01:13:00>>496-498
最初のころのバージョンのDelphiは要インストールのランタイムなくても動く、
例外が起きても落ちないのは当時VBと比べれば画期的だったぜw
0501デフォルトの名無しさん
2010/09/25(土) 15:47:110502デフォルトの名無しさん
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:070504デフォルトの名無しさん
2010/09/25(土) 16:30:55CentOSスレいった方がよいと思われ・・・
CentOS Part 25【RHEL Clone】
http://hibari.2ch.net/test/read.cgi/linux/1283250261/
0505デフォルトの名無しさん
2010/09/25(土) 16:32:150506デフォルトの名無しさん
2010/09/25(土) 17:28:32何をしようとした時に、そのメッセージが出力されたのかな?
要は、エラーの発生条件を書いて欲しい。たとえば、irbを起動して
> require "XXXX"
と入力しただけでエラーメッセージが出力されてしまう、とか。
その操作(発生条件)を書いてくれないと、(エスパーはどこにもいないから) 誰にも返答なんてできないよ
0507デフォルトの名無しさん
2010/09/25(土) 17:43:47これはわりと有名
rest-client gem の LoadError メッセージ
ttp://github.com/adamwiggins/rest-client/raw/master/lib/restclient.rb
0508502
2010/09/25(土) 18:25:09502のエラーメッセージは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:42yum install zlib-devel openssl-devel readline-devel
したあとで Ruby をコンパイルする
コンパイル済みのディレクトリが既にあるなら ext/openssl に移動s…いや、いいや
再度 make clean して ./configure して make して make install しろ
0510デフォルトの名無しさん
2010/09/25(土) 19:25:24なぜか ruby をソースからビルドしようとしてるみたいだけど、それなら README.ja をよく読みなさい。
この文書のインストール手順のどこにも「ruby extconf.rb を実行しなさい」とは書かれていないんだけど。
rubyのビルド&インストールは、ごく一般的な configure; make; make install で済むよ。
で、その時に、configure の --prefix オプションでインストール先ディレクトリを忘れずに指定する。
特別な事は何も無いはずだよ。
0511デフォルトの名無しさん
2010/09/25(土) 19:35:27>この文書のインストール手順のどこにも「ruby extconf.rb を実行しなさい」とは書かれていないんだけど。
これは既にrubyをインストールしてある状態でのextライブラリの正当な追加インストール法です
0512デフォルトの名無しさん
2010/09/25(土) 20:01:47ひどいな、このエラーメッセージ
Linuxだったら問答無用でパッケージ管理ツールとパッケージ名まで決め打ちか。
気を回したつもりで混乱の元じゃないか。
0513502
2010/09/25(土) 20:12:49yum install readline-develを行った後、ruby extconf.rb; make&&make installでうまくいきました。
ありがとうございました。
0514デフォルトの名無しさん
2010/09/25(土) 21:06:160515デフォルトの名無しさん
2010/09/26(日) 01:23:590516デフォルトの名無しさん
2010/09/26(日) 02:32:45ruby1.8.7-p302
gem1.3.6
0517デフォルトの名無しさん
2010/09/26(日) 02:33:540518デフォルトの名無しさん
2010/09/26(日) 02:38:20開発マシンとして使う人は元々いないだろうけどサーバーとしてもdebianやubuntuで十分だし。
会社で複数のサービス公開してるけど全てdebianだ。
開発マシンと統一することにもそれなりに価値がある。
0519デフォルトの名無しさん
2010/09/26(日) 02:48:070520デフォルトの名無しさん
2010/09/26(日) 05:44:36CentOS5のRubyはRuby1.8.5です
安定版ですらない
他の基幹ライブラリもお察し
0521デフォルトの名無しさん
2010/09/26(日) 07:56:51こいつのせいでライブラリは1.8.5の面倒も見なけりゃならんのだよな
とっとと死滅してくれ
0522デフォルトの名無しさん
2010/09/26(日) 14:08:42マジデ!?うけるww
ということはRedHatも古いのを使っているのか。パッチ当ててるんだろうけど。
0523デフォルトの名無しさん
2010/09/26(日) 14:11:52はなからRailsは度外視ということかw
UbuntuならRails入れるためのドキュメントくらいあるのに
0524デフォルトの名無しさん
2010/09/26(日) 16:27:29ソースから入れ直せということ
0525デフォルトの名無しさん
2010/09/26(日) 18:22:45eval系が絡まないかぎり、ブロックの中でselfが変わることはない。
クラス定義中やトップレベルではselfなんて意識する必要すらないはず。
unkoどうのこうのってのは明らかにRubyのダークサイドに落ちてる。
そんなプログラムを書く必要が本当にあるのか確認したほうがいい。
メソッドを呼んだらクラスメソッドを追加させるとか、明らかにおかしい。
Rubyが何でもできるからって、何でもすればいいわけじゃない。
また、ブロックによってselfが変わりまくるようなダークなライブラリは
うんこだから使わなくていい。
0526525
2010/09/26(日) 18:27:22メタプログラミングの多用はRailsが出る前から、現在まで
ずっとバッドノウハウになってると思うよ。
少なくとも俺らが普段から使うものではない。
0527デフォルトの名無しさん
2010/09/26(日) 18:47:22Ruby 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:43Ruby 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表記にして何かがよくなったということはまず無い
0530デフォルトの名無しさん
2010/09/26(日) 20:02:44その根拠をちゃんと示せる人が全くいないのが笑える
0531デフォルトの名無しさん
2010/09/26(日) 20:10:080532デフォルトの名無しさん
2010/09/26(日) 20:16:510533デフォルトの名無しさん
2010/09/26(日) 20:28:10まったく性質の悪いオナニーだな。
0534デフォルトの名無しさん
2010/09/26(日) 20:32:130535デフォルトの名無しさん
2010/09/26(日) 21:11:390536デフォルトの名無しさん
2010/09/26(日) 21:36:110537デフォルトの名無しさん
2010/09/26(日) 21:54:08解り切った事をわざわざ説明する馬鹿はおらん
0538デフォルトの名無しさん
2010/09/26(日) 22:47:47変数1 = クラス.new
newしたインスタンス内で別のクラスのインスタンス生成したりそれをいじったりする
変数1 = nil
これで生成したものは全部自動で開放される、で合ってますか?
0539デフォルトの名無しさん
2010/09/26(日) 22:54:390540デフォルトの名無しさん
2010/09/26(日) 22:57:200541デフォルトの名無しさん
2010/09/26(日) 22:58:490542デフォルトの名無しさん
2010/09/26(日) 22:59:52別の生きてるオブジェクトや変数から、そのオブジェクトが参照されるようなことをしてない限り。
あと、いつ解放されるかは保証されない(終了までそのままかもしれない)。
だから、ファイルのクローズとかは自分でやるか、ブロック付きのクローズが保証されている
メソッドを使うとかしないとダメ。
0543デフォルトの名無しさん
2010/09/26(日) 23:02:22代入してすぐには解放されないよ、いつかそのうち。
あと、Mark&Sweepだから循環参照とか関係ないよ。
GC.stress=trueしてるとまた話は変わる。
0544デフォルトの名無しさん
2010/09/26(日) 23:28:51ファイナライザはある
ただ、Javaでの議論とほぼ同様、
Rubyでも原則ファイナライザには頼らないほうがいいんじゃないかね
例外が握りつぶされるとか、面倒な問題がいくつもある
0545デフォルトの名無しさん
2010/09/27(月) 06:01:43その程度の動作しか期待したらいかん
GCされるからこの動作がこうなるはず、なんてのをRubyに期待するのはアウト
0546デフォルトの名無しさん
2010/09/27(月) 06:18:39ファイナライザ自体の登録はできるが、実行タイミングは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:580550デフォルトの名無しさん
2010/09/27(月) 14:27:00> メタプログラミングの多用はRailsが出る前から、現在まで
> ずっとバッドノウハウになってると思うよ。
>
> 少なくとも俺らが普段から使うものではない。
一昔前のgotoは機能としてあるけど使っちゃだめ、みたいな言い分だな
それなら、最初から入れるなとは言わんが(最初はそれがいいと思ったんだろうから)
使えないようにすればいいんじゃね?
何でRubyにメタプログラミングの機能が載ってるの?
メタプログラミングは必要悪なのか?
>>526 がついていけてないだけじゃないのか?
もっとメタプログラミングを簡単にした方がいいのでは?(馬鹿でも当たり前に使えるように)という話なら同意はするが
0551デフォルトの名無しさん
2010/09/27(月) 14:29:34メタプログラミングは、Lispのマクロと同じだ
使わなければならない場所以外では使ってはいけない
0552デフォルトの名無しさん
2010/09/27(月) 15:17:580553526
2010/09/27(月) 23:15:47変わり「まくる」と言った。別にRSpecとかRakeとかTkぐらいなら余裕。
>>530
Railsが悪なんていってない。魔術自体を使うことが危険なだけであって、
Railsみたいに魔術を使って作られた綺麗なAPIは素晴らしい。
>>550
バリバリ必要悪です。attr系とか超便利。危険だからといって、
使えないようにしたらJavaになっちゃうよ。
危険でも強力なら搭載するのがRuby。
>>551
>>552
そそ。
0554デフォルトの名無しさん
2010/09/27(月) 23:48:59Rubyはあなたが自分の足を打ち抜くのを妨げません。
0555デフォルトの名無しさん
2010/09/28(火) 00:05:210556デフォルトの名無しさん
2010/09/28(火) 00:27:17あんま無いです
a という中身の入った配列と b という空の配列があったとして、
配列 a の中身を適度に選んで b に意味ある順番で移すのを一発で書く、とかいうのは
Ruby ができそうでできない微妙に不得意とするところ
実際にナニをどうしたいのかがわかると迂回策を誰かが思いつくかも
0557デフォルトの名無しさん
2010/09/28(火) 00:38:45個々人でまだ箱を開けざるを得ないのががっかりで醜い
もしRails実装を覗く必要に迫られることが将来なくなったとしたら、それは
0558デフォルトの名無しさん
2010/09/28(火) 01:00:210559デフォルトの名無しさん
2010/09/28(火) 01:19:10決して箱の中の配線を見てはいけない
0560555
2010/09/28(火) 01:20:33やりたいことは、2次元配列の指定位置に隣接する要素のインクリメント等ですが
0561デフォルトの名無しさん
2010/09/28(火) 02:50:13こんなに素晴らしい教材はなかなか見つからないのに。
うちの会社はRails勉強会やる時は、rubyに興味無い連中も寄ってきて部屋いっぱいになってしまう。
社外向けのRails勉強会もやってるのだが高校生の応募もあったりして驚いたよ。
0562デフォルトの名無しさん
2010/09/28(火) 03:52:14慣れてない人間には理解しにくくても、それをカバーできるほど有用なテクニックなら問題ないのだろうが。
0563デフォルトの名無しさん
2010/09/28(火) 05:01:140564デフォルトの名無しさん
2010/09/28(火) 05:03:25共通の処理まとめたい(DRYという手法だっけ?)
↓
lib/以下におけばいいの?
↓
ただのrequireじゃなくて、autoload使えって?(autoload使うと開発時のリロードのときに上手く働くとかどうとか)
↓
おい、リロードするたびにクラスがunloadされてないとかどうとか、エラーでるようになったぞ、どうしてくれるんだ
↓
production環境だと動くんだけど、、、、
↓
Railsのソースを見出す
↓
ヽ(`Д´)ノ わけわからん!!
0565デフォルトの名無しさん
2010/09/28(火) 06:06:46スレタイ100回読め
0566デフォルトの名無しさん
2010/09/28(火) 06:09:37急いでるときにそうなると困るよね
Rapid Programing 出来ると思って Rails 使ってるのに・・・
0567デフォルトの名無しさん
2010/09/28(火) 06:24:270568デフォルトの名無しさん
2010/09/28(火) 06:48:06「RailsはRubyではない」という文言が理解できないのは区別できない初心者か、
自分の頭の後ろにくっついてるRailsの知識の意味を理解できない可哀想な人
0569デフォルトの名無しさん
2010/09/28(火) 08:16:360570デフォルトの名無しさん
2010/09/28(火) 11:19:09特定ライブラリの挙動を知ってるはずがないだろ
0571デフォルトの名無しさん
2010/09/29(水) 01:52:54いくらrailsに興味無くても。
0572デフォルトの名無しさん
2010/09/29(水) 03:14:010573デフォルトの名無しさん
2010/09/29(水) 16:01:25そしたらBDDで開発しながらruby勉強できるのに。
0574デフォルトの名無しさん
2010/09/29(水) 16:32:070575デフォルトの名無しさん
2010/09/29(水) 16:41:39むしろ理解がどっちつかずだ
言語にある程度慣れるまでは特別なテスト開発はやめと毛
0576デフォルトの名無しさん
2010/09/29(水) 17:05:450577デフォルトの名無しさん
2010/09/29(水) 20:42:19Integerの参照をメソッドに与えメソッド内で値を変更したいのですが
0578デフォルトの名無しさん
2010/09/29(水) 20:55:14できないのでほかの方法を模索してください
あなたの思考法はRubyとして間違っています
が妥当な回答な気がする
やってできないことはないんだが
0579デフォルトの名無しさん
2010/09/29(水) 20:56:200580デフォルトの名無しさん
2010/09/29(水) 21:08:040581デフォルトの名無しさん
2010/09/29(水) 21:45:180582デフォルトの名無しさん
2010/09/29(水) 23:17:04普通に引数変えたら元も変わると思ってたけど違った?
0583デフォルトの名無しさん
2010/09/29(水) 23:46:52オブジェクト渡しとかいろいろと名前が考えられているけど、一つだけ確かなことは、
参照渡しではないということです。
0584デフォルトの名無しさん
2010/09/30(木) 00:05:05あえて日本語のと聞いているのは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他の言語のつもりでいると、Stringも即値と勘違いするんだよな
0586デフォルトの名無しさん
2010/09/30(木) 00:20:11なぜ境目となるのかを理解できれば難しい話ではないんだけどね。
README.EXT.ja なんて普通のユーザーは読まないしな。
0587デフォルトの名無しさん
2010/09/30(木) 00:29:46Rubyみたいな超高水準言語でも使うものなの?
0588デフォルトの名無しさん
2010/09/30(木) 01:11:060589デフォルトの名無しさん
2010/09/30(木) 01:11:06オブジェクトなんだけど、オブジェクト自身に変更を加えるメソッドが一切無いものを言う
そして、そういうのは処理系の内部では即値で扱われることが多い
FixnumとBignumは普通に使う分には区別がほとんど付かないようになってるね
区別しようと思えば区別もできる程度
>>585
どうしても即値にしたければSymbolがあるからなあ
とは言っても、SymbolとStringは全然用途が違うのだけれども
0590デフォルトの名無しさん
2010/09/30(木) 01:16:48即値と呼ぶ人がいて困る。
0591デフォルトの名無しさん
2010/09/30(木) 01:23:19聞かないねえ。
Cでさえ即値なんて言わない。
アセンブリ言語特有の呼称だと思っている。
0592587
2010/09/30(木) 01:35:290593デフォルトの名無しさん
2010/09/30(木) 01:43:460594デフォルトの名無しさん
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> モデル上全ての値がオブジェクトへの参照であると考えても差し支えない
ってところは意外と重要なところだと思う
内部的には即値を扱ってるんだけど
コード上は全てオブジェクトを扱ってるように見えるからな
immutableオブジェクトには自身を変更するメソッドが無いおかげでそれを実現できてる
0597デフォルトの名無しさん
2010/09/30(木) 02:04:070598デフォルトの名無しさん
2010/09/30(木) 02:34:31いやいや、実装の細部を隠すことに成功しているという意味だから
本質的に重要な指摘でしょ
いわゆる即値かどうかなんて、気にしなくてもいい
0599デフォルトの名無しさん
2010/09/30(木) 03:13:45何がいやいやなんだよ
そう言ってるじゃん
0600デフォルトの名無しさん
2010/09/30(木) 03:28:31どっかにありませんか?できるだけ簡易なのがいいです。
0601デフォルトの名無しさん
2010/09/30(木) 04:05:28”意外と”に過剰反応した
すまん
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:000604デフォルトの名無しさん
2010/09/30(木) 05:47:12array_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って別の概念だと思うけどなぁ。
0606デフォルトの名無しさん
2010/09/30(木) 09:27:44ImmediateとImmutableを誤読してたorz
0607デフォルトの名無しさん
2010/09/30(木) 10:26:07「定数」という言葉の使い方しだいですけど、そこまで考えるのであれば
MATCH_TARGET = lambda{|s| s=='str!'}
array_10000elements.find{|s| MATCH_TARGET[s]}
とか書いた方が素直なような気が。
0608デフォルトの名無しさん
2010/09/30(木) 10:41:20Procを最大1万回起動するくらいなら文字列を直に書いたほうがまし
0609デフォルトの名無しさん
2010/09/30(木) 10:52:29問題勘違いしてるな
文字列の生成のコストを嫌ってるんだぞ
> lambda{|s| s=='str!'}
これだとlambdaがcallされるたびに'str!'が生成されるから無意味
0610デフォルトの名無しさん
2010/09/30(木) 10:59:45実際に計測しないと単純にどっちがいいとは言えんな
文字列くらいならブロック内に置いておいたほうがたぶんいいと思う
リテラルで書ける程度の配列やHashも直に書いたほうがいい
正規表現は前にあったレスの通り
変数にして得するのは自作のなんかごっついオブジェクトとかじゃね、やっぱ
0611デフォルトの名無しさん
2010/09/30(木) 11:22:42class 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:10x.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こんな「文字列生成は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ただし 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取り除かれたオブジェクトが実際にどうなるかまでは関与しない
プログラム上で誰も参照していなければ他の変数同様GCの対象になるだけ
あとそれはかなりへちょい解説なのでむしろ書名晒せ
0618デフォルトの名無しさん
2010/09/30(木) 12:46:30ありがとうございます。
署名は「作りながら学ぶRuby入門」です。
P.110の上部にあります。
単純に削除、という理解で良いってことですね。
0619デフォルトの名無しさん
2010/09/30(木) 13:14:540620デフォルトの名無しさん
2010/09/30(木) 13:16:59入門用なら
「Hash#deleteはkeyに関連するキーと値のペアをHashオブジェクトから削除します」
で削除部分の動作説明は充分だ
入門どころか中級者向けでもこれで充分
0621デフォルトの名無しさん
2010/09/30(木) 13:41:19手元の 1.9.1 で実行してみると
s == 'str!' と s =~ /^str\!/
は後者の方が速いみたいなのだけれども、そういうもの?
0622デフォルトの名無しさん
2010/09/30(木) 13:54:17正規表現処理の速度はマッチの仕方に依存
それはたまたま正規表現のほうが速かっただけに過ぎない
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一旦 keyをdeleteさせたら
復活させる方法はないかもね。
object_id()で調べてみたけど
同じ要素を消してから入れ直しても
違うobject_idが表示される。
想定していたのはキーと要素をハッシュに登録し直したら
同じobject_idが表示されるかもしれないかと期待したが、
結果は違うobject_idだったから、別物だという事。
疑問の「valを表示させる事は可能なのか?」の答えは出来ないだ。
まぁ、上級者向けのテクニックならあるのかもしれないが。
object_idを記憶させておいて、それをどうにかして再設定させるとか。
(消えてないと書かれているのだから)
0624デフォルトの名無しさん
2010/10/01(金) 04:01:50こういう話だと思ってたけど違うの?
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単なるそういう話
「ハッシュから削除っていうけどそれはハッシュから削除というだけの話でハッシュに登録されていたオブジェクトが削除されるという意味では必ずしもありませんよ」
という頭でっかちな説明
>>623はわかってない
0626デフォルトの名無しさん
2010/10/01(金) 09:21:51friends.delete(:shin)
p friends
これでdeleteしたらもうアクセス出来ない。
0627デフォルトの名無しさん
2010/10/01(金) 09:28:470628デフォルトの名無しさん
2010/10/01(金) 22:40:310629デフォルトの名無しさん
2010/10/01(金) 22:58:21今の趣旨は、こういう話なんだよ。
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:37Hash だからといって特別な説明が必要だとは思えない
0631デフォルトの名無しさん
2010/10/01(金) 23:33:44a = "hoge"
b = a
a = nil
b #=> "hoge"
0632デフォルトの名無しさん
2010/10/02(土) 02:22:17aもbもメモリの番地を記憶しているという事だな。
0633デフォルトの名無しさん
2010/10/02(土) 02:30:490634デフォルトの名無しさん
2010/10/02(土) 07:08:09番地ではない
実装のメモリをまったく反映しない
そういう考え方は害悪しか生まないので即忘れるべき
オブジェクトの呼び出し法に過ぎない
通常利用に必要な程度のオブジェクトの概念が理解できないならRuby無理して使うのやめと毛
0635デフォルトの名無しさん
2010/10/02(土) 08:02:260636デフォルトの名無しさん
2010/10/02(土) 09:31:21Cと同様の動作を期待するあほの子が絶対出るので避けたほうがいいという経験則はなくもない
0637デフォルトの名無しさん
2010/10/02(土) 09:40:560638デフォルトの名無しさん
2010/10/02(土) 09:50:020639デフォルトの名無しさん
2010/10/02(土) 10:09:42どっつかっつーと、object_idを記憶してると考えたほうが良いかな
0640デフォルトの名無しさん
2010/10/02(土) 10:52:110641デフォルトの名無しさん
2010/10/02(土) 11:54:030642デフォルトの名無しさん
2010/10/02(土) 13:28:34と思ったら
http://stackoverflow.com/questions/3234989/which-ruby-version-for-watir-on-windows
で解決した。
0643デフォルトの名無しさん
2010/10/02(土) 13:28:54a = '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:53GC に回収されるタイミングを GC.start やら GC.stress=true やらで保証することはできない
Ruby の GC は保守的な GC(conservative GC) だから、
最終的に回収されることは保証するが、それが実際にいつかは保証できないし、
それが途中で行われていることを見越したコードを書いてもいけないことになっとる
つまり GC 実行のタイミングのテストを Ruby で試すのはたいへんめんどい
脳内で
「まーこんだけオブジェクト作って時間経ってればGCがどっかで動いてさっきのは消えてるんじゃないかなあ」
と想像するしかできない
0645デフォルトの名無しさん
2010/10/02(土) 14:42:26> 最終的に回収されることは保証するが、それが実際にいつかは保証できないし、
> それが途中で行われていることを見越したコードを書いてもいけないことになっとる
これは保守的と関係ない。
0646デフォルトの名無しさん
2010/10/02(土) 15:22:350647デフォルトの名無しさん
2010/10/02(土) 18:38:14例えば補完させるのとかあるのかな
0648デフォルトの名無しさん
2010/10/02(土) 18:41:550649デフォルトの名無しさん
2010/10/02(土) 22:44:09一応、それはわかってるつもりなんだけど
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:57GCの実装見てみればいいんじゃないの
と思ったけど、それができて簡単に理解できるならここで聞いてないか
0651デフォルトの名無しさん
2010/10/02(土) 23:03:380652デフォルトの名無しさん
2010/10/03(日) 02:41:17メーリングリストというのかわかりませんが・・・
Linuxのディストリビューションや海外のOSSではSecurity Announcement用のメールを流してくれたりするのですが、
そういうのはないものかと
0653デフォルトの名無しさん
2010/10/03(日) 04:26:57MLはないね。
http://www.ruby-lang.org/ja/feeds/news.rss
これを購読してはどうか。
0654デフォルトの名無しさん
2010/10/03(日) 11:49:140655デフォルトの名無しさん
2010/10/03(日) 19:58:37Rubyにあるのでしょうか。
0656デフォルトの名無しさん
2010/10/03(日) 20:04:21ttp://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:370658デフォルトの名無しさん
2010/10/03(日) 20:20:41通信も出来ればいいかなと。Zebedeeみたいに。
0659デフォルトの名無しさん
2010/10/03(日) 23:16:18サンクス、やっぱり公式のニュースのフィードか。
rssをメールで送るの使ってみるわ。rssだしgrowlにも設定しておけばいいか。
ruby-listのMLの方から抽出するのも早いのだろうけど、
"[ANN]"や"[ANN] リリース"だとRuby本体以外も入るし、
なかなか面倒なんだよ
0660デフォルトの名無しさん
2010/10/04(月) 03:55:28rsense
0661デフォルトの名無しさん
2010/10/04(月) 16:42:23たとえばrand(99999)までは速いけどrand(100000)だと桁の関係で遅くなる、みたいな
0662デフォルトの名無しさん
2010/10/04(月) 16:46:2665535
0663デフォルトの名無しさん
2010/10/04(月) 19:15:250664デフォルトの名無しさん
2010/10/04(月) 22:35:52Benchmark.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:410666デフォルトの名無しさん
2010/10/04(月) 22:45:44Benchmark.bmbm {|x|
100000.step(1000000, 100000) { |i|
seed=10**i
x.report("rand(#{seed})") { rand(seed) }
}
}
こうだな
0667デフォルトの名無しさん
2010/10/04(月) 23:05:45うは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:370669デフォルトの名無しさん
2010/10/05(火) 08:39:24組み込みの例外クラスをひととおり把握すれば、あとは
「それら以外の例外は自分で作成する」というルールで
いいと思う。
組み込み例外クラス
ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFA5AFA5E9A5B9A1BFA5E2A5B8A5E5A1BCA5EBA1BFCEE3B3B0A5AFA5E9A5B9.html
ただ、Rubyの例外クラスのうち、自分でつかえそうなのは
ArgumentErrorとNotImplementedError(とRuntimeError)
ぐらいなんだよね。だからそれ以外は全部自前で定義している。
0670デフォルトの名無しさん
2010/10/05(火) 09:16:29自分が全ユーザーの全スクリプトのエラークラスの継承元になるということに
全く気を払ってないように見える
概念もまあまあで実装もまあまあだが実際がへぼいというなんとも
0671デフォルトの名無しさん
2010/10/05(火) 09:58:13無いものは説明できんというたいへん正直な
0672デフォルトの名無しさん
2010/10/05(火) 13:34:140673デフォルトの名無しさん
2010/10/05(火) 15:02:521. XML を別サーバーから GET で取得(http/net を使用)
2. その XML を整形/スタイルを指定して HTML に変換
3. ブラウザに表示
というのをやろうとしているのですが、どうやったらいいのかイマイチわかりません。
今のところちゃんと出来ているのは 1. だけです。
2. は XSLT を使って実現しようとしていましたが、現在頓挫しています。
こういうことをやりたいときのスタンダードなやり方はなんなのかなど、
自分なりに時間をかけて調べていたのですが、
答えが見つからず、質問させて頂きました。
よろしくお願いします
0674デフォルトの名無しさん
2010/10/05(火) 15:50:27Nokogiriにまんまの機能があるみたいよ。
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:42printf の戻り値はチェックしてますか?と言い返せばよい
0678デフォルトの名無しさん
2010/10/05(火) 20:22:35一応、
・ メソッド使用者がオブジェクトの吟味をする
・ メソッド内部で引数オブジェクトの吟味をする
・ どうせ動作しないので NoMethodError とかが出てから考える
の3種類ある
マニュアルに使用法が記述されるレベルのパブリックに供するメソッドは
「引数として受け取れるっぽいものは一応なんでも受け付けておいて内部でチェック」という動作が妥当
マニュアルレベルのパブリックでないなら好きにせえ
hogestr_to_array(hoge) の hoge が String かどうかを内部でチェックするのはバカっぽい
0679デフォルトの名無しさん
2010/10/05(火) 20:27:550680デフォルトの名無しさん
2010/10/05(火) 21:41:59が、入門書には載ってないな。
呼び出し側とか言ってるやつは、
エラーの使いこなしとかいつまで経っても進歩しない。
0681デフォルトの名無しさん
2010/10/05(火) 22:19:150682デフォルトの名無しさん
2010/10/05(火) 23:17:22独自の例外が発生したりするのは勘弁。
まだ NoMethodError が出た方が引数間違ったと分かっていい。
0683デフォルトの名無しさん
2010/10/05(火) 23:47:35うるう年になるんだけど。
0684デフォルトの名無しさん
2010/10/05(火) 23:58:30ユリウス暦だから閏年なんじゃね?
http://ja.wikipedia.org/wiki/900%E5%B9%B4
0685デフォルトの名無しさん
2010/10/05(火) 23:58:58西暦900年なら閏年でいいような気がする
0686デフォルトの名無しさん
2010/10/06(水) 00:17:590687683
2010/10/06(水) 00:34:49おかしくて1700年とか1800年とかがうるう年でないって判断される。
ちなみにruby 1.8.7 ね
0688デフォルトの名無しさん
2010/10/06(水) 00:46:03http://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4
> 1. 西暦年が4で割り切れる年は閏年
> 2. ただし、西暦年が100で割り切れる年は平年
> 3. ただし、西暦年が400で割り切れる年は閏年
0689デフォルトの名無しさん
2010/10/06(水) 01:05:42それはグレゴリオ暦ですよね
1582年を境にユリウス暦からグレゴリオ暦に変えているということでしょうか?
0690デフォルトの名無しさん
2010/10/06(水) 01:22:23$ 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:460692デフォルトの名無しさん
2010/10/06(水) 01:33:05ruby 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:020695デフォルトの名無しさん
2010/10/06(水) 01:58:35ttp://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:491582年10月4日(木曜日)までユリウス暦、
1582年10月15日(金曜日)からグレゴリオ暦
なんでしょ。
5日から14日までは欠番ね。
0697デフォルトの名無しさん
2010/10/06(水) 02:05:30なんか読みにくいんだよな。
引数説明とかあいまいだし
0698デフォルトの名無しさん
2010/10/06(水) 02:35:14今は/procをみることぐらいしかやり方が思いつかないんですが、
できればプラットフォームに依存せず使える方法がほしいです。
0699デフォルトの名無しさん
2010/10/06(水) 03:46:02世の中にはメモリが連続でマップされてないシステムだってあるんだぞ
0700デフォルトの名無しさん
2010/10/06(水) 06:07:24もしそれを感じさせないのならそれはそのプログラム内部で細かく条件分岐してるだけだ
ということで gem の sys-cpu とかになるんだが
0701デフォルトの名無しさん
2010/10/06(水) 08:56:34sys-cpuがそのものズバリです。ありがとうございました!
0702デフォルトの名無しさん
2010/10/06(水) 21:19:400703デフォルトの名無しさん
2010/10/06(水) 21:20:190704デフォルトの名無しさん
2010/10/06(水) 22:21:120705デフォルトの名無しさん
2010/10/06(水) 22:34:250706デフォルトの名無しさん
2010/10/07(木) 01:23:25どっか適当なコマンドプロンプトでも実行できるようにするのにはコマンドプロンプトについての基礎知識が要るな
0707デフォルトの名無しさん
2010/10/07(木) 06:48:150708デフォルトの名無しさん
2010/10/07(木) 07:03:28遅レスですみません!
>>673 を書き込んだ当日から予定外の出張が入ったのと、
規制(iPhone)とで書き込めませんでした。
明日から通常作業に戻れそうなので、さっそく試してみます。
親切で丁寧なアドバイス、ありがとうございました!
0709デフォルトの名無しさん
2010/10/07(木) 07:24:41PATH設定したほうが余計なことを気にしなくても済むし手間もかからないだろう
0710デフォルトの名無しさん
2010/10/07(木) 13:05:21あっさりつまりました。
環境は 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スクリプトをWebサーバー上で実行するな死ぬまでPHPやってろ
0712デフォルトの名無しさん
2010/10/07(木) 13:21:58なんと!そこから既に間違っていましたか!
と、言うことはコマンドプロンプトでやるんですかね?
このあたりでしょうか。
http://www.ruby-lang.org/ja/man/html/Ruby_A4CEB5AFC6B0.html
ありがとうございます、知らないって本当に恐ろしいです。
0713デフォルトの名無しさん
2010/10/07(木) 13:36:320714デフォルトの名無しさん
2010/10/07(木) 13:40:39Webブラウザの出力を見てデバッグするようなことはない
そういうサポートがほしけりゃそれこそ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:43Railsだとenvironment.rbに config.gem でgem名とバージョン指定しといたら、
gem足りない時も rake gems:installで一気に入れられるじゃん?
あ、今はBundler使うのだっけ?
そういうことを書き捨てスクリプトでもできないかな、と
0716デフォルトの名無しさん
2010/10/07(木) 14:48:05今年 rubygems なら gem install とするだけで依存する gem パッケージはすべてインストールされる
require 'hogehoge' としたときに LoadError なら gem search --remote hogehoge してくれるような
gem-not-found みたいなシステムは特に無いというかそれ多分うざい
0717デフォルトの名無しさん
2010/10/07(木) 16:30:51なるほど、初心者の自分にもすごいわかりやすいです。
めちゃめちゃ助かりました。
参考にしてもうひとがんばりしてみます。
ありがとうございました!
0718デフォルトの名無しさん
2010/10/07(木) 18:00:16kconvは半角カナが自動で全角カナになってしまうので
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コレクションの概念がないのか
配列はただの配列だ
Array クラスの each メソッドで、要素を順に枚挙できる
['A', 'B', 'C'].each do |x|
puts x
end
自分で配列作ったら、文字列を each で枚挙させて文字列を変換すればいい
0720デフォルトの名無しさん
2010/10/07(木) 21:44:27あーいや、gemにするようなものは他のgemの依存を記述するけど、
そうじゃなくてちょっとしたスクリプトでgem使いたい時の話
gem "hogehoge"
の後にrequireするという方法あった気がするけど、今でも使えるんだっけ・・・
0721デフォルトの名無しさん
2010/10/07(木) 21:53:28出来ました。ありがとうございました。
0722デフォルトの名無しさん
2010/10/07(木) 23:47:03proc_obj = proc {|x| p x }
obj = Hello.new
obj.instance_eval(&proc_obj) # ここで proc_obj のために引数も渡したい
0723デフォルトの名無しさん
2010/10/08(金) 00:57:09proc_obj.call(xxx)
end
0724720
2010/10/08(金) 04:59:410725デフォルトの名無しさん
2010/10/08(金) 08:24:45説明が足りてませんでした。
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:000727デフォルトの名無しさん
2010/10/08(金) 10:08:06遅くなりましたが、できました!
本当にありがとうございました!
0728デフォルトの名無しさん
2010/10/08(金) 10:33:34そんなのが用意されたのですね。ありがとうございます。
ttp://d.hatena.ne.jp/rubikitch/20080526/instanceexec
なぜ今までなかったのかと聞きたいぐらい。
0729デフォルトの名無しさん
2010/10/08(金) 16:21:58何年前の話だよ、と思ったが、たった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もし
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:210733デフォルトの名無しさん
2010/10/10(日) 03:01:280734デフォルトの名無しさん
2010/10/10(日) 03:09:510735デフォルトの名無しさん
2010/10/10(日) 03:37:420736デフォルトの名無しさん
2010/10/10(日) 04:02:45dlってライブラリがあるよ
#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>もし
>module M
>def self.eigen
>end
>end
>としたeigenメソッドをほかのクラスの特異メソッドとして提供したいのだとしたら、
>そもそもeigenメソッドをMの特異メソッドとして定義すべきではない
まさにこれをしようとしてました。
やっぱりできないということで、別のアプローチを採用することに決定しました。
できないということがわかっただけで大助かりです。ありがとうございました。
0738デフォルトの名無しさん
2010/10/10(日) 12:28:41c1 = Class.new
としますが、あるクラスのサブクラスを動的に作成するにはどうしたらいいですか。
class A
end
B = A.new #=> Aのサブクラスではなくインスタンスが作られる
0739デフォルトの名無しさん
2010/10/10(日) 12:47:000740デフォルトの名無しさん
2010/10/10(日) 12:52:200741デフォルトの名無しさん
2010/10/10(日) 13:00:24Class.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なにその「マルチメディアとはメディアがマルチ」みたいな論
0743デフォルトの名無しさん
2010/10/10(日) 13:29:380744デフォルトの名無しさん
2010/10/10(日) 13:59:130745デフォルトの名無しさん
2010/10/10(日) 14:04:43確か、スーパークラスの説明はあってもサブクラスの説明はないんだよね
サブクラスという言葉自体は説明なしでいきなり出るはず
0746デフォルトの名無しさん
2010/10/10(日) 15:15:550747デフォルトの名無しさん
2010/10/10(日) 18:36:21位計算できるのでしょうか。ニュートン法で近似していけば無限の精度で
求められますか?
0748デフォルトの名無しさん
2010/10/10(日) 18:44:51BigDecimal を使えば巨大な浮動小数点数を扱える。
0749デフォルトの名無しさん
2010/10/10(日) 19:37:10スーパークラスかサブクラスかの二択
rubyでは
クラスという概念の中に
スーパークラスかサブクラスが入っている。
0750デフォルトの名無しさん
2010/10/10(日) 22:11:510751デフォルトの名無しさん
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:450754デフォルトの名無しさん
2010/10/11(月) 07:27:10お前は小学生か
0755デフォルトの名無しさん
2010/10/11(月) 07:37:02こんなようなことが大臣個人の能力に左右されてたまるかw
0756デフォルトの名無しさん
2010/10/11(月) 08:43:06ならないのか、BogDecimalとして変数を宣言するためにはどうしたらいいのか
教えてください。
0757デフォルトの名無しさん
2010/10/11(月) 08:46:480758デフォルトの名無しさん
2010/10/11(月) 08:48:460759デフォルトの名無しさん
2010/10/11(月) 08:52:04a = BigDecimal::new("0.123456789123456789")
b = BigDecimal("123456.78912345678",40)
c = a + b
0760デフォルトの名無しさん
2010/10/11(月) 09:08:10次のプログラムです。よろしくお願いします。
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:06def 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でもリファクタリングとかはやっぱIDEがいいと思う今日この頃
0765デフォルトの名無しさん
2010/10/12(火) 00:37:06歴史の長いエディタだけど、文字コード対応や言語別ハイライトなど
最新の要件にもよく追随している。
でもvimは学習コストが半端ないので、今から使うのはオススメしない。
サクラエディタや秀丸なんかで十分いけるんじゃないの?
0766デフォルトの名無しさん
2010/10/12(火) 00:55:58設定が若干面倒だったけど、これよさそうですね。
これから使って見ます。
0767デフォルトの名無しさん
2010/10/12(火) 02:03:35でも、vimすげぇと思う
0768デフォルトの名無しさん
2010/10/12(火) 02:27:59プログラミングするときはgvim
0769デフォルトの名無しさん
2010/10/12(火) 04:38:010770デフォルトの名無しさん
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:22bigdecimalの便利さをRubyによって享受したいのは大いに理解できるのだけど、
純粋な計算速度を求める場合、Rubyは不向きだし、Cのような言語と比較するとRubyはかなり遅いです。
100倍遅くても泣かないことが必要。
bigdecimalみたいな機能やライブラリがある高速な代替言語のオススメは知らんので詳しい方頼む
0772デフォルトの名無しさん
2010/10/12(火) 06:56:08Cの足し算1回より100倍以上遅いのはそれこそ足し算で当たり前
0773デフォルトの名無しさん
2010/10/12(火) 07:14:41まあ概念的にはそうなるな
0774デフォルトの名無しさん
2010/10/12(火) 08:08:56それともgitをコマンドで呼び出して使う方法をプログラム中にかけるでしょうか?
0775デフォルトの名無しさん
2010/10/12(火) 08:21:09git使うのでよいのならば、githubが利用しているライブラリが使えたと思う
0776デフォルトの名無しさん
2010/10/12(火) 08:50:56gitやdiffを呼べばいい
result = `diff a.txt b.txt`
0777デフォルトの名無しさん
2010/10/12(火) 08:58:510778デフォルトの名無しさん
2010/10/12(火) 09:07:060779デフォルトの名無しさん
2010/10/12(火) 09:14:520780デフォルトの名無しさん
2010/10/12(火) 09:22:04diffの引数も文字列定数なのに>>777は何を怒ってるんだめんどくさい
0781デフォルトの名無しさん
2010/10/12(火) 09:28:251.8 で File.read 使うなとかと同レベルの話かと
0782デフォルトの名無しさん
2010/10/12(火) 09:34:22意味わかんね。
Webアプリが全盛であることと
>>774がgitを呼びたいことと
何の関連があるんだ。
0783デフォルトの名無しさん
2010/10/12(火) 09:34:40kwsk
0784デフォルトの名無しさん
2010/10/12(火) 09:36:56result = 'diff #{file1] #{file2}'
というコードになるということに思い至らない頭が怖い
>>776を見て
「じゃあ変数で、あっ 'diff #{file1] #{file2}' だと変数が外部入力由来で file1 に ; が含まれていた場合は
任意のコマンドが外部入力者の指示で実行されちゃうね!いけないいいけないsystem使わなきゃ」
result = system('diff', file1, file2)
とか即対処できるような奴はそもそも参考にしたりせん
0785デフォルトの名無しさん
2010/10/12(火) 09:37:500786デフォルトの名無しさん
2010/10/12(火) 09:39:270787デフォルトの名無しさん
2010/10/12(火) 09:39:50【Ruby】なにもかもMatzのせいにするスレ【驚き最小】
ttp://kamome.2ch.net/test/read.cgi/river/1283945893/
0788デフォルトの名無しさん
2010/10/12(火) 09:42:39そんなもん、お前が危険と思ってるってだけの話じゃないか。
他人のレスに死滅していいよとか書くんじゃない。
0789デフォルトの名無しさん
2010/10/12(火) 09:47:16穏やかに書けばいいんだよ。
何が死滅していいよ、だ。
横から出てきて他人の善意のレスをけなす輩は
人として許せねえ。
0790デフォルトの名無しさん
2010/10/12(火) 09:52:51ム板の初心者スレで場当たり的に知識を仕入れてもしゃーない
0791デフォルトの名無しさん
2010/10/12(火) 09:54:59バッククォート型のシェルコマンド実行の危険性自体は太古の昔から様々な言語で指摘はされてたぞ
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c909.html
0792デフォルトの名無しさん
2010/10/12(火) 10:01:17$ cat a.rb
$SAFE=1
puts `cat #{ARGV[0]}`
$ ruby a.rb a.rb
a.rb:2:in ``': Insecure operation - ` (SecurityError)
が、まあたぶんそんな「不便な設定」などしないだろうな
0793774
2010/10/12(火) 10:17:20盛り上がっているところ申し訳ないのですが、
バージョン管理スクリプト on Ruby - myhd
http://d.hatena.ne.jp/myokoym/20100609/1276091879
>>Gitといった大掛かりなソフトを使うほどでもない、でも手作業は面堂
とあるようにrubyのlibraryはないだろうかと聞いた次第です。
0794774
2010/10/12(火) 10:22:47HTML テキスト抽出
http://s-yata.jp/apps/nwc-toolkit/text-extractor
をみて
テキストを取り出した後、
差分を表示したり、保存したり、元に戻したりするlibraryがあるかな?
と聞きたかったのです。
0795デフォルトの名無しさん
2010/10/12(火) 10:36:110796デフォルトの名無しさん
2010/10/12(火) 10:53:580797デフォルトの名無しさん
2010/10/12(火) 11:39:27追加部分/削除部分/未変更部分をマージしたHTMLを生成するRubyスクリプトでよければ、
過去に書いたのがあるよ。今見たら、全体で128ステップほど。
diffコマンドの出力も大きな違いは無いから、改造すれば使えるかも。もし必要ならアップするよ。
0798デフォルトの名無しさん
2010/10/12(火) 11:53:03> 差分を表示したり
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>Webアプリ全盛のこのご時世に外部シェルコマンドを `` で呼ばせる人間は今すぐ死滅していいよ
ふつうにさ、
`` は安全性に問題あるからsystem使った方がいいよ
と書けばいいだけなのに、なんであんな書き方するんだろうね。
これはRuby連中のコミュニケ―ション力がないといわれても仕方ない。
#でもきっと本人は、自分は正しいことを言っていると思ってるから、改善しないんだろうな。
>>789
>こうするとセキュリティ上もっと安全だよ、とか
>穏やかに書けばいいんだよ。
ですよねー
0800デフォルトの名無しさん
2010/10/12(火) 17:49:04>>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:540802デフォルトの名無しさん
2010/10/12(火) 18:06:38既に収束した20レス以上も前のレスを穿り返すような人間が何言っても説得力ないな
0803デフォルトの名無しさん
2010/10/12(火) 18:19:32nil ですエラー見せられても正直見当もつかんが、
とりあえずrequire する gem パッケージ名と同名のファイルはやめとけ
require 'nokogiri' と書いた nokogiri.rb を実行するとか混乱するぞ
0804デフォルトの名無しさん
2010/10/12(火) 18:40:22>とりあえずrequire する gem パッケージ名と同名のファイルはやめとけ
たしかにそうですよね、変更しました。
ありがとうございます。
>nil ですエラー見せられても正直見当もつかんが
なにか他にお知らせできそうなことがなさそうか探してみます。
0805デフォルトの名無しさん
2010/10/12(火) 18:42:56777本人様ですか?お疲れさまです。
20レス前のことを話題にされるとお困りでしょうか?以後気をつけます!
0806デフォルトの名無しさん
2010/10/12(火) 18:46:34エラーメッセージの意味は分かる?
>#<TypeError: can't convert nil into String>
とあるから、「nilをStringに変換できない」という意味なんだが。
#もし分かってたらすまん。
だからconfig_file.rbの56行目を見て、joinしているものの中にnilになってるものが
ないかどうか調べたらいいんじゃないかな。
0807デフォルトの名無しさん
2010/10/12(火) 19:03:20なるほど!そういう意味ですか、全くわかってなかったです。
ということはこのファイルをコマンドプロンプトでステップ実行して
調査すれば、光が見えてきそうな感じでしょうか。
ちょっとやってみます。
0808デフォルトの名無しさん
2010/10/12(火) 21:49:07ステップ実行するまでもなく、データをpとかinspectとかで表示させればいいよ。
config_file.rbの56行目がどうなってるか見せてもらわないと分かんないけど、
たとえば "".join(list) とかだったら p list とか puts list.inspect とかして
データの中身を調べればいい。
0809デフォルトの名無しさん
2010/10/12(火) 22:14:210810デフォルトの名無しさん
2010/10/12(火) 23:52:09エラーメッセージが読めてない程度の初心者にはデバッガは難しいと思って
printデバッグを進めたのだが、杞憂だったようだすまん。
最近のIDEならデバッガ付いてるもんな。
0811デフォルトの名無しさん
2010/10/13(水) 01:45:030812デフォルトの名無しさん
2010/10/13(水) 02:05:42デバッガよりも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ちょうどrubyの勉強中でもあったのでwebrickのソースを読もうとしていますが、
ruby/lib/webrickの中にたくさんソースがあってどれから読んだらいいのか分からないです
どれから読んだらいいんでしょうか?
0815デフォルトの名無しさん
2010/10/13(水) 11:47:04やめとけ
素直にCで書かれた小型のWebサーバのソース読め
WEBrickは単純なレスポンダ以外の動作もさせるように小細工埋め込まれまくりだから混乱するぞ
0816デフォルトの名無しさん
2010/10/13(水) 11:53:460817デフォルトの名無しさん
2010/10/13(水) 12:33:05あれ?なんか色んなブログやら何やらで
「webrickのソースは綺麗だからrubyの勉強にもなるし読んでみるといいよ!!」
みたいなこと言われたから、容易に読めるもんなのかと思ってました。
確かにその割にはブログでwebrickのソース解説してるしてるとこ
見たことないしな…
0818デフォルトの名無しさん
2010/10/13(水) 12:39:31Webサーバがナニをどうするものなのかという事前知識はどーしても要る
ファイル名を見てサーバ構造を想像できるくらいの基礎知識だ
あと、余談だが、WEBrick の利用自体はわりと小難しい
0819デフォルトの名無しさん
2010/10/13(水) 12:42:35Rubyでウェブサーバを作ろうと思った人がソースを読むとニヤニヤできるという意味で、勉強になる
Rubyの知識が浅い人、HTTPの知識のない人、Webサーバ作ったことのない人にとっては大変難解
0820デフォルトの名無しさん
2010/10/13(水) 12:48:08というたいへんありがたーい言葉がございましてですな
(「HTTPとHTMLを解釈可能なプログラムが綺麗なわけがない」というのもあり)
0821デフォルトの名無しさん
2010/10/13(水) 12:59:50初心者が勉強のために読むのはすすめられない。
0822デフォルトの名無しさん
2010/10/13(水) 13:19:21もう少しrubyとかhttpとかの勉強をしてから挑戦してみることにしました
有難うございました。
0823807
2010/10/13(水) 13:25:42誤解させてすみません。
print デバッグを選択しなかったのは「ステップ実行できる」からじゃなく、
素人考えで、なんとなくこちらの方が王道なのかなと思っていたのと、
Ruby のデバッグ方法を検索して参考にしたのがこちらのブログだったからです。
http://asaasa.tk/wiki/index.php?Ruby%2FDebug
それと自分は IDE じゃなくって Vim を使ってます(初心者ですが)。
いちど Netbeans を使おうとしたのですが、なんとなくやめてしまいました。
最初は Vim で Ruby のデバッグをしようと思っていたのですが、
「Vim Ruby デバッグ」で検索しても特にヒットしないので、
おそらく Vim でやるというのは一般的ではないのだろうと判断して、
今のところはコマンドプロンプトを使ってやっています。
0824807
2010/10/13(水) 13:27:12SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'gemrc'
とありました。
わからないなりにステップ実行してみた結果が以下ですが、
さらにわからなくなった気もしています。
もしかしたらやり方を間違っているのかも知れません。
0825807
2010/10/13(水) 13:29:29関係ありそうな気がするあたりからコピーします。
連投してすみません。
config_file.rb:50: require 'etc.so'
(rdb:1) s
<internal:lib/rubygems/custom_require>:29:
(rdb:1) s
config_file.rb:51: Etc.sysconfdir
(rdb:1) s
config_file.rb:56: SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'gemrc'
(rdb:1) s
config_file.rb:57: puts file.inspect
(rdb:1) s
config_file.rb:57: `' (NilClass)
from config_file.rb:57:in `<class:ConfigFile>'
from config_file.rb:28:in `<main>'
config_file.rb:57: puts file.inspect
(rdb:1) s
config_file.rb:57:in `<class:ConfigFile>': undefined local variable or method `file' for Gem::Config
File:Class (NameError)
from config_file.rb:28:in `<main>'
0826デフォルトの名無しさん
2010/10/13(水) 15:58:38特にはできないと思う。本当にやりたいことは何かを書けば別の解決策があるかもしれない。
>>814
Rubyの勉強が目的なら「Ruby 添削」でぐぐって出てきた記事を読むのがいちばんいい。
他の人が書いているように Webrick をいきなり読むのはあまりお勧めできない。
>>824
56行目がほんとうにその通りなら、system_config_path の結果が nil であるせいでエラーになってる。
system_config_path が何者なのかはしらん。
0827デフォルトの名無しさん
2010/10/13(水) 16:05:23hogeの内部処理がどうなっているかによるが、
Hashのラッパークラスを作って遅延評価するインデクサを付加できる様にしてみるとか。
0828827
2010/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:28http://sabatobi.com/esthe-one
0831デフォルトの名無しさん
2010/10/13(水) 19:03:370832デフォルトの名無しさん
2010/10/13(水) 19:13:48全く無問題。
自分もPerlを使っていたんけど、OOPをやりたくなってRubyに乗り換えた一人。
言語の文法もPerlと似ている(= Perlユーザにも違和感のない設計になっている)。
Matz氏は「RubyはPerlの皮を被ったSmalltalkである」と語っているし。
基本的なオブジェクト指向から順々に理解していけば、Perlが使える人なら、たやすいと思う。
ただし、最近はRailsの影響で「メタプログラミングを駆使するのがRuby流である」という風潮がある。
これに惑わされず、Perlで学んだ「読み易いプログラミング作法」をRubyに活かしていけばいい。
0833デフォルトの名無しさん
2010/10/13(水) 19:58:09ttp://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:250835デフォルトの名無しさん
2010/10/14(木) 00:43:37smalltalkに似てるのは偶然で参考にした覚えはない、って言ってた様な
0836デフォルトの名無しさん
2010/10/14(木) 01:11:260837デフォルトの名無しさん
2010/10/14(木) 01:16:02RubyはカッコのないLispだって。
0838デフォルトの名無しさん
2010/10/14(木) 01:27:08「ALGOLの皮を被ったLisp」と紹介したのがyugui氏
>>837
そういえば、教養学部でRubyを採用した背景には
Lisp系教授の支持があったかららしいがw
0839デフォルトの名無しさん
2010/10/14(木) 01:29:310840813
2010/10/14(木) 01:53:34考えた挙句、汎用的に書いてしまったのですが、せっかくなので具体的に書いてみます。
元々は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ではそうならない)
0841813
2010/10/14(木) 01:56:11Capistranoではそもそもuserはあまり変えないよ、という話はそうなのかもしれませんし、
Capistranoでやりにくいところは、moonshineのようなShadowPuppetや、Chefを使えということかもしれません
0842デフォルトの名無しさん
2010/10/14(木) 08:41:06ごめん理解できなかった。
だれか助けてあげて。
> そのため単に一時的に退避して切り替え(pushしてpopするような)てということがしにくくなっています。
自分でpush/popを定義するというのはなし?
0843デフォルトの名無しさん
2010/10/14(木) 08:47:26initialize 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:040845デフォルトの名無しさん
2010/10/14(木) 09:02:440846デフォルトの名無しさん
2010/10/14(木) 09:13:29d = Digest::RMD160.new
d << "foobar"
p d.hexdigest
0847デフォルトの名無しさん
2010/10/14(木) 09:24:25特定の版だけエラーになるっぽい。
とりあえず回避策としては、特異メソッド版のほうを使って、
RMD160.hexdigest self とすればいいと思うのだけど、なんか特異メソッド版と
ふつうのメソッド版とで返してくる値が違うようで、なんか変だな。
0848デフォルトの名無しさん
2010/10/14(木) 09:32:41ほんとにSHAでは動いてる?
0849デフォルトの名無しさん
2010/10/14(木) 09:33:06結果も確認しました。よくわからないで使っているので理解できるように
がんばりたいと思います。
0850デフォルトの名無しさん
2010/10/14(木) 09:57:58悪いんだけど >>848 の質問に答えてもらえないかな?
直さなきゃならないところを絞るのが楽になるので。
0851デフォルトの名無しさん
2010/10/14(木) 10:08:38http://sky.geocities.jp/tcshacina/test.rb
0852デフォルトの名無しさん
2010/10/14(木) 10:24:52digestのDigest::SHA1じゃなくて、sha1のSHA1を使ってたわけね
0853デフォルトの名無しさん
2010/10/14(木) 10:39:530854デフォルトの名無しさん
2010/10/14(木) 10:45:390855デフォルトの名無しさん
2010/10/14(木) 10:52:44require 'digest/sha1'
SHA1=Digest::SHA1
class String
def sha1hex
SHA1.hexdigest self
end
end
の書き方の方がいいのでしょうか。
0856デフォルトの名無しさん
2010/10/14(木) 10:58:020857デフォルトの名無しさん
2010/10/14(木) 11:01:450858832
2010/10/14(木) 11:09:21>>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直接的な方法はありますか?
salt=[OpenSSL::Random.random_bytes(32)].pack("m")
salt.each_byte{|c| int=(int<<8)^c}
salt=int
0860デフォルトの名無しさん
2010/10/14(木) 17:15:090861デフォルトの名無しさん
2010/10/14(木) 18:38:24MTでよければ
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のですが、以下の方法以外に効率的なやり方はありませんか?
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:190864デフォルトの名無しさん
2010/10/14(木) 20:28:580865デフォルトの名無しさん
2010/10/14(木) 20:53:14少しは速度が上がるかも。
0866デフォルトの名無しさん
2010/10/14(木) 22:38:59これが遅い原因
0867デフォルトの名無しさん
2010/10/14(木) 22:44:40最初に全部読んでもその後の処理を分割しなければならないかと。
そんなことないですかね。
0868デフォルトの名無しさん
2010/10/14(木) 23:17:07(などとコードも動かさずに寝言を言ってみる)
0869デフォルトの名無しさん
2010/10/14(木) 23:22:48その後いっぺんに処理して、いっぺんに書きこむみたいな?
0870デフォルトの名無しさん
2010/10/14(木) 23:32:26という操作をすればいいですか。
0871デフォルトの名無しさん
2010/10/14(木) 23:49:01g.write(salt)
これでファイルがバイナリじゃなくて数字になるのはなぜですか。
0872デフォルトの名無しさん
2010/10/15(金) 01:26:40バイナリモード/テキストモードってのはWindowsなどに備わってるモードで
読み書きの際、改行コードなどの処理が変わる、というもの。
Ruby的には「バイナリモードとOSに伝えるか否か」の違いしかない。
バイナリデータを読み書きしたいのであれば
ファイルをバイナリモードで開くだけでなく
packやunpackを使っての変換が必要。
0873デフォルトの名無しさん
2010/10/15(金) 02:02:26一応注意しておくけど、system()もパイプやリダイレクトを使うと /bin/sh 経由の実行になるから、
``と同じ程度に危険。
0874デフォルトの名無しさん
2010/10/15(金) 02:21:32`pack': can't convert Bignum into String (TypeError)
0875デフォルトの名無しさん
2010/10/15(金) 08:37:110876デフォルトの名無しさん
2010/10/15(金) 08:59:33餌やった奴は責任持って処分するように
0877デフォルトの名無しさん
2010/10/15(金) 11:47:13以前同じ条件でやってうまくいってたと思ったのですが…。
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--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:450880デフォルトの名無しさん
2010/10/15(金) 12:01:21gem 用に自前でコンパイラ用意しないと駄目だと思う
0881デフォルトの名無しさん
2010/10/15(金) 12:08:10ruby 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ありがとうございます、焼いて捨てます。
0884デフォルトの名無しさん
2010/10/15(金) 16:12:570885デフォルトの名無しさん
2010/10/15(金) 16:22:510886デフォルトの名無しさん
2010/10/15(金) 16:34:03>32bitプロセスからは普通にはアクセスできないフォルダやレジストリがあるけど、実用上は問題ないと思う。
そういったケースに出くわした場合、なにか対処が必要ですか?
また、その場合通常エラーメッセージなどでアラートがされるのでしょうか?
0887デフォルトの名無しさん
2010/10/15(金) 17:27:06もうちょっと詳しく。
どういう書式文字列で、どんな型の数値を整形したいのか具体的に。
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>>876
0890デフォルトの名無しさん
2010/10/15(金) 22:35:01884じゃないけど、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コンパイル環境がないみたいだけど、devkitいれたら解決するとかそういう問題ではないのか
0892デフォルトの名無しさん
2010/10/16(土) 03:55:48class Shine
def baka
puts "omaegana"
end
end
end
というのを、短く書く方法はないでしょうか?
def Kuso::Shine.baka
puts "omaegana"
end
だと、.bakaのところでsyntax errorになります。
この編の仕様についてのドキュメントはありませんか?
0893892
2010/10/16(土) 04:13:20puts "omaegana"
end
最初が式ならこれでいける、と思ったのですが、、、
そもそも後者のような書き方だとクラスメソッドになってしまうんですね
0894デフォルトの名無しさん
2010/10/16(土) 04:43:21クラスの部分だけなら繋げて
class Kuso::Shine
def baka
と出来るが…classの部分も繋ぐのはちょっと苦しいかな。
もしかしたら出来るかも知れんが、たぶん解りにくくなるだけだと思う。
せいぜいセミコロンで2行を纏めて
class Kuso::Shine; def baka
〜
end; end
程度が限界か。
def foo.bar
って感じの書き方は、正確には特異メソッドの定義。
クラスメソッドは特異メソッドの一種だから、クラスメソッドの定義にも使える。
0895デフォルトの名無しさん
2010/10/16(土) 11:08:28巣食って発言力維持しようとしているのですか?
言語の発展に寄与しない老害がなぜ強いのですか?
ごみ言語だから問題ないの?
0896デフォルトの名無しさん
2010/10/16(土) 11:30:073点(100点満点中)
こちらで修行してから出直してください
http://hibari.2ch.net/test/read.cgi/tech/1249737531/
0897デフォルトの名無しさん
2010/10/16(土) 12:41:16だから895のことはそっとしておいてあげよう。
0898デフォルトの名無しさん
2010/10/16(土) 13:29:27なんとかなるんじゃないの?
0899デフォルトの名無しさん
2010/10/16(土) 13:57:20コードの追加は誰でもできるが、
それを本家crubyとして認めるかどうか(厳密には認めないかどうか)の権限が
まつもとゆきひろにある
その機能は本家Rubyではないと言ったらそのコードは追加されない
そんだけ
方向性の強い決定権を持ってるから、今のところはいなくなると困る
githubのライブラリにおける、pullリクエストの認証者のような立場
0900デフォルトの名無しさん
2010/10/16(土) 15:03:24現在データがアスキー数字で書き込まれています。
バイナリでファイルを書き込む方法を教えてください。
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:050902デフォルトの名無しさん
2010/10/16(土) 15:40:10というか、残念ながら pack/unpack は「Rubyではない」ので、
これに関しては専門の解説を別途参照することをお勧めする
Ruby っぽく実装された gem があれば人気が出そうな蛇足になりそうな微妙な感じ
0903デフォルトの名無しさん
2010/10/16(土) 15:48:390904デフォルトの名無しさん
2010/10/16(土) 16:03:14超えていたよーな記憶。
0905デフォルトの名無しさん
2010/10/16(土) 16:46:12試しに
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呼び出せるので遊びで使う分には問題ないけど、100M暗号化する
のに800分もかかるとスクリプトではもう限界かと思う今日この頃。
0908デフォルトの名無しさん
2010/10/16(土) 17:46:57["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はあるのに、2進数から直接10進数に変換できる関数がないという所
です。出力をみると64ビッを超えていても2進数の文字列として
packされているようなのですが、unpackした結果は10進数扱いの
2進数文字列なのです。配列の先頭に0bをつけてもだめでした。
どうして?
試しに
scanf("%b",l.unpack("B*"))
とかやるとさらに大きな数に変換されます。
0910デフォルトの名無しさん
2010/10/16(土) 18:03:16#=> 65535
二進数と二進数文字列とバイナリの区別ついてないんじゃ?
0911デフォルトの名無しさん
2010/10/16(土) 18:07:27unpackの出力が何を意味しているのかわかりません。
0912デフォルトの名無しさん
2010/10/16(土) 18:17:55undefined method to_i for #Array:XXX
0913デフォルトの名無しさん
2010/10/16(土) 18:26:19エスパーじゃないので何をどうしたのか知らないけど
Arrayが返って来てるんならそりゃエラーになるわ。
0914デフォルトの名無しさん
2010/10/16(土) 18:34:03open(ARGF.filename + ".ecc") {|file|
while l = file.gets
l=l.unpack("B*").to_i
とするとエラーになります。基本的なところが解りません。
0915デフォルトの名無しさん
2010/10/16(土) 19:02:27# 巨大な数 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:42undefined method binread for File:Class (NoMethod Error)
0917デフォルトの名無しさん
2010/10/16(土) 19:34:050918デフォルトの名無しさん
2010/10/16(土) 19:37:270919デフォルトの名無しさん
2010/10/16(土) 19:57:34gistなりpastebinなりにupしてみれば
http://gist.github.com/
http://pastebin.com/
0920デフォルトの名無しさん
2010/10/16(土) 20:05:14http://gist.github.com/629676
0921デフォルトの名無しさん
2010/10/17(日) 02:40:04http://twitter.com/phonsan/status/14896534494
の方法を試してみましたが、
(401): Unauthorized - Could not authenticate with OAuth.
が返ってきましたし、確かに強引すぎて美しくありません
他に良いproxyの通し方はないでしょうか?
0922デフォルトの名無しさん
2010/10/17(日) 16:54:39PHPの時は、swichは評判が悪かったので一切使っていませんでした。
0923デフォルトの名無しさん
2010/10/17(日) 17:18:50caseの比較は === で行われることを念頭に置いておく。
0924デフォルトの名無しさん
2010/10/17(日) 17:21:15return 2 if b
return 3 if c
return 4
って書くかcaseでどっちが可愛い?
0925デフォルトの名無しさん
2010/10/17(日) 17:32:04可愛いはどうでもいいが、
「if a」や「if b」が異常系の条件だったりすると、
ガード節とかいってそう書いた方がいいと「リファクタリング」にあるな。
0926デフォルトの名無しさん
2010/10/18(月) 16:47:34rubyからCに、longに収まりきらない整数を渡すにはどうすればいいんですか?
0927デフォルトの名無しさん
2010/10/18(月) 16:52:160928デフォルトの名無しさん
2010/10/18(月) 22:57:39RubyからCへは文字列として渡し、C側で文字列から多倍長整数に変換する、というのはどうでしょう。
多倍長整数についてはぐぐってください。
0929デフォルトの名無しさん
2010/10/19(火) 11:11:32-> 23c5a790ab4c
どうして12桁の出力になるのでしょうか?
もう1点、セキュアなランダム英数字を作りたい場合はどのような方法がありますか?
よろしくお願い致します。
0930デフォルトの名無しさん
2010/10/19(火) 11:36:21それはマニュアル嫁
0931679
2010/10/19(火) 12:53:43500 => Net::HTTPInternalServerError (Mechanize::ResponseCodeError)
のときに,サーバから送られてくるHTMLを利用したいのですが、方法を教えてください。
(もちろん,begin rescueで処理するとして)
Mechanize::インスタンスのどこかにありそうなのですが,見つけられませんでした。
よろしく
0932デフォルトの名無しさん
2010/10/19(火) 13:41:19require '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:450934デフォルトの名無しさん
2010/10/19(火) 22:04:59適当に補完して回答するが、できない
そういう用途では普通、値を配列にする
0935デフォルトの名無しさん
2010/10/19(火) 22:06:45session['hoge'] = 'aiueo'
session.close
としてセッションを閉じますけど、
puts session['hoge']
のように読み込んだだけでも
session.closeは必要ですか?
expireはまだ大丈夫なのにページを行ったり来たりしてるうちに消えてしまうんですよね。
何が原因なんでしょう。
0936デフォルトの名無しさん
2010/10/19(火) 22:08:14そもそもハッシュは1キー1レコードだろ
0937デフォルトの名無しさん
2010/10/19(火) 22:08:16素早い回答ありがとうございました
しつこいですが、
ハッシュにキーと値を次々と保存していき、同じキーがあった場合、値が違っても
ハッシュに保存し、それを別々に表示することはできないでしょうか?
0938デフォルトの名無しさん
2010/10/19(火) 22:13:28そういう用途では普通、値を配列にする
0939デフォルトの名無しさん
2010/10/19(火) 22:22:52ごくろう
0940デフォルトの名無しさん
2010/10/19(火) 22:34:13perfect hashing(完全ハッシュ法)を使う。
chaining(連鎖)を使う。
open addressing(オープンアドレス法)を使う。
アルゴリズムで調べればいくらでも出てくるだろ。
0941デフォルトの名無しさん
2010/10/19(火) 22:55:06解決したからいいや
ごくろう
0942デフォルトの名無しさん
2010/10/19(火) 23:07:01衝突はキーじゃなくてキーのハッシュ値が重複する場合でそ。
0943デフォルトの名無しさん
2010/10/20(水) 09:16:50読み込むだけならSet-Cookieヘッダを送信する必要はないからcloseも必要ないはず・・・
と思ったけど、セッションファイルがオープンされたままになっていると次のリクエスト時に困るかもね。
CGIでなければcloseしたほうが無難(CGIならプロセス終了時に勝手にクローズされるはず)。
あとセッションが消えるというのは
・サーバサイドのセッションファイルが消える
・クライアントからのクッキーが送られてこない
の両方が考えられる。どっちが原因かを特定したほうがいい。
もし後者なら単にセッション用クッキーのパスの問題である可能性が高い。
0944デフォルトの名無しさん
2010/10/20(水) 09:19:17マニュアルに書いてると思うけど、SecureRandom.hex(n)はランダムなnバイトのデータを生成してそれを16進数にして返す。
16進数だから、1バイトあたり2文字必要。
セキュアなランダム英数字は、SecureRandom.hex()でいいと思うよ。
0945デフォルトの名無しさん
2010/10/20(水) 21:55:58rbファイルを複製してsjisにする、とかそういうの以外で
0946デフォルトの名無しさん
2010/10/20(水) 21:59:280947デフォルトの名無しさん
2010/10/20(水) 22:02:11Rubyが手を出せる範疇を越えている
コマンドプロンプトがCP932しか出力できないのはコマンドプロンプトの仕様
コマンドプロンプト上に出力しようとしているということがスクリプト上でチェックできれば
その時だけ標準出力をtosjisとかで変換すればいいんだけど
0948デフォルトの名無しさん
2010/10/20(水) 22:08:100949デフォルトの名無しさん
2010/10/20(水) 22:09:220950デフォルトの名無しさん
2010/10/20(水) 22:09:46それって日本語の入出力できなくなりませんか?自分の環境だとできなかったんですが、普通はできるのかな…
>>947
やっぱり厳しい感じですかー
Pythonはそういうことがないみたいなんですが(普通に意識せずにマルチプラットフォームで日本語使える)、内部で判定して変換でもしてくらてるんでしょうか
0951デフォルトの名無しさん
2010/10/20(水) 22:09:56配布スクリプトなら諦めろ
0952デフォルトの名無しさん
2010/10/20(水) 22:10:400953デフォルトの名無しさん
2010/10/20(水) 22:10:43>>946は実際に使ってないから気にするな
コードポイント切り替えてまともに動作することはない
0954デフォルトの名無しさん
2010/10/20(水) 22:17:00厳しそうなのが改めて理解出来ました
Ruby好きで使いたいのに使えないってのは歯痒いですね…
Winをばっさり切り捨てられればいいですけど、なかなかそうもいかなくて、Python調べてみるかな…
0955デフォルトの名無しさん
2010/10/20(水) 22:20:23SJIS前提のコンソールで見られるのか?
0956デフォルトの名無しさん
2010/10/20(水) 22:24:37print u'ほげほげ'
という形で
unicodeで出力すると
自動的に環境に合わせてエンコードしてくれるよ
0957デフォルトの名無しさん
2010/10/20(水) 22:25:400958956
2010/10/20(水) 22:26:32#!/usr/local/bin/python
# -*- coding: utf-8 -*-
a = 'ほげ' # ここは utf-8
print a.decode('utf-8')
で
print u'ほげ'
したのと同じになる
0959デフォルトの名無しさん
2010/10/20(水) 22:28:45怠慢?仕様?
0960デフォルトの名無しさん
2010/10/20(水) 22:33:440961デフォルトの名無しさん
2010/10/20(水) 22:34:100962デフォルトの名無しさん
2010/10/20(水) 22:35:24PythonはWindowsでしか動作しない専用のコードが物凄く組み込まれてる
彼らはOS依存のコードを大量にパッケージングすることを厭わない
Pythonだからできた、わけではない
Rubyでできないのは単なるリソース不足
0963デフォルトの名無しさん
2010/10/20(水) 22:42:100964デフォルトの名無しさん
2010/10/20(水) 22:44:210965デフォルトの名無しさん
2010/10/20(水) 22:50:250966デフォルトの名無しさん
2010/10/20(水) 22:51:050967デフォルトの名無しさん
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隣の芝生はよく見えるの典型的ないやなんでもない
0969デフォルトの名無しさん
2010/10/20(水) 22:56:01見逃していたスルーしてくれ
0970デフォルトの名無しさん
2010/10/20(水) 22:58:52> 内部的に従来どおりUTF-8にしておいて、入出力する時はUCS-2で処理することはできないかな。
1.9.2だとそういう試みがあると聞いたけど具体的なMLログと、Redmineチケットとソースくれ
0971デフォルトの名無しさん
2010/10/20(水) 22:59:31表示が無理だというのが知れ渡ってるからコマンドプロンプト表示活用者が少ないんじゃないかと
鶏卵な感じもちょっとする
0972デフォルトの名無しさん
2010/10/20(水) 23:00:280973デフォルトの名無しさん
2010/10/20(水) 23:04:43コマンドプロンプトに表示させて便利に使ってるスクリプトはゼロだな
0974デフォルトの名無しさん
2010/10/20(水) 23:11:390975デフォルトの名無しさん
2010/10/20(水) 23:36:02irb使ってないのかw
0976デフォルトの名無しさん
2010/10/20(水) 23:37:13みんな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:490979デフォルトの名無しさん
2010/10/21(木) 01:57:16その場合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何が良くて使ってるんだ???
0982デフォルトの名無しさん
2010/10/21(木) 07:01:560983デフォルトの名無しさん
2010/10/21(木) 07:05:00結婚して、子どもができて、飯食わすために出世して、親とお別れして、世代が移り変わって…
いよいよ所帯じみてきたら、わかるんじゃないかな…。
0984デフォルトの名無しさん
2010/10/21(木) 07:12:39TTYとは何かを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あぁ、これ自分もなんでこうなるのかわからず悩んでた
$KCODEか-Kオプション指定すればなおるのかーサンクス >>979
0987デフォルトの名無しさん
2010/10/21(木) 09:22:170988デフォルトの名無しさん
2010/10/21(木) 09:33:01binmode STDOUT, ':encoding(cp932)';
で、コンソール出力時に自動でエンコードしてくれるけど、Rubyだとどうするのでしょうか?
0989デフォルトの名無しさん
2010/10/21(木) 09:43:22それはコンソール出力時ではなく標準出力全部が切り替わるだろ嘘つくな
まあそれはそれとして、$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:090991デフォルトの名無しさん
2010/10/21(木) 10:20:56http://hibari.2ch.net/test/read.cgi/tech/1287623173/
0992デフォルトの名無しさん
2010/10/21(木) 10:41:570993デフォルトの名無しさん
2010/10/21(木) 10:46:24�d
ややこしいんすね。
0994デフォルトの名無しさん
2010/10/21(木) 12:45:160995デフォルトの名無しさん
2010/10/21(木) 16:01:03コマンドラインを知っていたら教えてください。
0996デフォルトの名無しさん
2010/10/21(木) 16:11:08というエラーが出ます。
0997デフォルトの名無しさん
2010/10/21(木) 16:28:220998デフォルトの名無しさん
2010/10/21(木) 16:36:460999デフォルトの名無しさん
2010/10/21(木) 16:42:481000デフォルトの名無しさん
2010/10/21(木) 16:44:2910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。