Ruby 初心者スレッド Part 30
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/08/08(土) 08:21:23★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
(理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。
関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0021デフォルトの名無しさん
2009/08/08(土) 23:19:59数値をマッチさせてそれから正規表現を新規に作るしかあんめえ
0022デフォルトの名無しさん
2009/08/08(土) 23:22:43str =~ /(\d)/
str =~ /\d(foo){#{$1}}/
=>0
2行に分ければできるけど、1行でできるのかな?
0024デフォルトの名無しさん
2009/08/09(日) 00:24:59仮に出来たとしても本来の意味の正規表現の能力を逸脱しすぎてて
逆に気持ち悪い機能だな
0025デフォルトの名無しさん
2009/08/09(日) 01:23:120026デフォルトの名無しさん
2009/08/09(日) 01:51:29/1(foo){1}|2(foo){2}|3(foo){3}|4(foo){4}|5(foo){5}|6(foo){6}|7(foo){7}|8(foo){8}|9(foo){9}/
でいける(マテ
0027デフォルトの名無しさん
2009/08/09(日) 01:59:090028デフォルトの名無しさん
2009/08/09(日) 05:02:53別に構わないよ
Rubyでスレ違いになる可能性があるのはRailsの機能を使った場合だけ
それにしたって「Railsスレで聞けバカ」という誘導兼ツッコミが入るだろうし
質問一発目くらいは誰でも大目に見るだろ
002925
2009/08/09(日) 05:09:10じゃあ早速ですがfromのボタンを押すのは
agent = WWW::Mechanize.new
agent.get(uri).form_with(nameとかactionとか){入力する物}.click_button
って形ですよねこのとき、nameが無くてactionも同じformがある場合はどうすれば良いんでしょうか?
0030デフォルトの名無しさん
2009/08/09(日) 05:23:08ブロックつきメソッドが動作しないのでメソッドチェーンできないことにだけ注意
Ruby 1.9.1 および 1.8.7 の Object#tap を使えば可能なはずだが、 tap はそういう用途に使うもんじゃねー
# 従来(抽出条件記述が難しい)
agent.page.form_with(抽出条件){|f|
f.入力指示
}.click_button
# 配列版(出現順だけ考える)
f = agent.page.forms[2]
f.入力指示
f.click_button
# 配列要素を tap
agent.page.forms[2].tap{|f|
f.入力指示
}.click_button
Page#forms は、Form オブジェクトを含む配列を HTML 上での <form> の出現順に返す
あくまで配列なので、agent.page.forms[2] は HTML 上での 3 番目のフォームになるぞ
003125
2009/08/09(日) 05:31:34やってみます。
0032デフォルトの名無しさん
2009/08/09(日) 18:48:000033デフォルトの名無しさん
2009/08/09(日) 18:51:06個人的だが著者的に逆引きレシピをオススメしておく。
0034デフォルトの名無しさん
2009/08/09(日) 19:01:47逆引きのほうでいいんじゃねえの
0035デフォルトの名無しさん
2009/08/09(日) 19:17:400036デフォルトの名無しさん
2009/08/09(日) 19:30:51ttp://d.hatena.ne.jp/kimuraw/20090724/p1
0037デフォルトの名無しさん
2009/08/09(日) 19:51:26ワロタw
003832
2009/08/09(日) 22:06:05>>36
ありがとうございます。
36さんに紹介していただいたブログを読むと、
どっちも買って損はなさそうなので、両方買うことにしました。
0039デフォルトの名無しさん
2009/08/10(月) 00:21:00当たり前すぎるが、pp。データ構造を見やすく出力。
0040デフォルトの名無しさん
2009/08/10(月) 00:28:25rakeの使い方
sortよりsort_byの方が劇的に速い
0041デフォルトの名無しさん
2009/08/10(月) 01:08:06Module1::Module0::Class0 を作るにはどうすれば?
どうしても無理ならクラス・モジュールの名前変えます。
ダメ元で試したコード:
module Module0
class Class0
end
end
module Module1
module Module0
class Class0 < Module0::Class0
end
end
end
エラー:
NameError: uninitialized constant Module1::Module0::Class0
from (irb):7
from :0
環境:
OS: Ubuntu 5.0
Kernel: 2.6.28-14-generic
ruby: 1.8.7
irb: 0.9.5
0042デフォルトの名無しさん
2009/08/10(月) 01:46:15名前変えた方がいいと思うけど
class Class0 < ::Module0::Class0
0043デフォルトの名無しさん
2009/08/10(月) 02:54:21> sortよりsort_byの方が劇的に速い
「sortが遅い場合は」な
0044デフォルトの名無しさん
2009/08/10(月) 08:46:23hashやstructを構造体みたいな使い方で大量に使う時の注意点
速度: Hash(キーがsymbol) > Struct > Hash(キーがstring) >>>(超えられない壁)>>> OpenStruct
0045デフォルトの名無しさん
2009/08/10(月) 10:32:18rubyでのgui開発で、
タブによって選択肢を選んだり、数値を代入して、
それをある形式で複数のテキストファイルに出力することはできますでしょうか。
いままでfortranしか触ったことがないのですが、
guiを作る必要がでてきまして、どのプログラムがいいか選んでいる状態
なのですが、もしよろしければ教えていただけると幸いです。
0046デフォルトの名無しさん
2009/08/10(月) 10:40:35>どのプログラムが・・・
言語から選んでるってこと?
自分が使うだけ(もしくは使う人みんなRuby使い)ならRuby+何かGUIでもいいけど
そうでないならコンパイルして実行形式にする言語を個人的には勧める
0047デフォルトの名無しさん
2009/08/10(月) 11:06:09ありがとうございます。そういうのはどれでもできるんですね
実行形式できる言語というのをちょっと勉強してみます
0048デフォルトの名無しさん
2009/08/10(月) 11:08:24http://jp.rubyist.net/magazine/?0001-RubyGUI
を読め
0049デフォルトの名無しさん
2009/08/10(月) 11:25:450050デフォルトの名無しさん
2009/08/10(月) 11:30:18初心者がRubyでGUIやるのはただのバカ
0051デフォルトの名無しさん
2009/08/10(月) 11:49:28何か最後のひとつ以外を学んだら死ぬ、という呪いをかけられていてこそ
プログラミング初心者
老害は立ち去れ
0052デフォルトの名無しさん
2009/08/10(月) 12:02:35今の人たちはRubyに見ているのだよ
0053デフォルトの名無しさん
2009/08/10(月) 12:28:22もはや「全部Ruby」で問題ないレベルまでは来てるんだけどな
最後に残った二つの関門が大きい
>>45
とにかく動けばいいと言うのなら、VisualBasicあたりをオススメする
後のことを考えてRubyでやりたいのなら
VisualuRuby+FormDesigner、WxRubyあたりを使うのがオススメ
0054デフォルトの名無しさん
2009/08/10(月) 12:33:36winの話なの?それにしてもC#のほうがいいと思う
0055デフォルトの名無しさん
2009/08/10(月) 12:39:29その知識を利用してRubyからAPIを直に呼ぶ
というのが基本だと思う
0056デフォルトの名無しさん
2009/08/10(月) 17:18:45ウィンドウプロシージャをWindowsからどう呼ばせるかという最大の問題がある。
0057デフォルトの名無しさん
2009/08/11(火) 07:22:00で xxx に何入れても代入できる仕組みってできますか?
property_missingで検索したらGroovyしかヒットしない…
0058デフォルトの名無しさん
2009/08/11(火) 07:27:33あくまで「遠目に見ればそのように見えるかもしれない動作」を
単なるインスタンスメソッドで代用しているに過ぎない
>>57
設計思想自体に何か重大な誤りがあるようにしか見えないが、
とりあえずは foo の属するクラス定義の method_missing の中で分岐書くしかないな
0059デフォルトの名無しさん
2009/08/11(火) 08:02:55というような質問は年に何回か見るな
動的言語を名乗ってる以上できても面白そうだが、現行では残念ながらできない
クラス設計者が @foo = 100 とする代わりに毎回 instance_variable_initialize(:foo, 100) と書くようにする、みたいな
予防法的なめんどくさい手順しか思いつかん
あ、 instance_variable_initialize は自作してね
0060デフォルトの名無しさん
2009/08/11(火) 09:13:070061デフォルトの名無しさん
2009/08/11(火) 09:16:51> foo.xxx = foo.xxx + 123
を実現するということがどんだけ重要で取替不可かによるな
これの実現のためにどんだけの不便を強いる覚悟があるかみたいな
0062デフォルトの名無しさん
2009/08/11(火) 10:01:180063デフォルトの名無しさん
2009/08/11(火) 10:58:56デフォルトの値が0っぽいから…
fooのクラスがFooとすると
class Foo
def initialize
@vals=Hash.new(0)
end
def method_missing(name,*args)
x=name.to_s
if name[-1..-1]=='=' then
@vals[name[0..-2]]=args[0]
else
@vals[name]
end
end
end
これでよかろうか(引数の数の検証は自分で書いてちょ)
0064デフォルトの名無しさん
2009/08/11(火) 12:16:11def initialize(*) super; @table.default = 0; end
end
foo = ZeroStruct.new
0065デフォルトの名無しさん
2009/08/11(火) 14:03:30それともメジャー?
オススメってある?
0066デフォルトの名無しさん
2009/08/11(火) 14:05:220067デフォルトの名無しさん
2009/08/11(火) 14:26:38Rubyのためだけに新規操作を覚えるとかマジキチ
0068デフォルトの名無しさん
2009/08/11(火) 14:34:15┏┳┳┓ ハイ. ┏┳┳┓
┏┫┃┃┃ .エディタの話は ┃┃┃┣┓
┃┃┃┃┣┓ ここまで ┏┫┃┃┃┃
┃ ┃┃┏━━━┓┃┃ ┃
┃スレチ ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
┏┻┓┃
┏━┛ ┣┻┓
┗━━━┫ ┗━┓
. ┗━━━┛
0069デフォルトの名無しさん
2009/08/11(火) 14:34:500070デフォルトの名無しさん
2009/08/11(火) 14:38:000071デフォルトの名無しさん
2009/08/11(火) 14:38:210072デフォルトの名無しさん
2009/08/11(火) 14:41:48○荒らした
0073デフォルトの名無しさん
2009/08/11(火) 14:44:31それが嫌なら何で2chにいるの?
2ch以外にもコミュニティはあるよ?
0074デフォルトの名無しさん
2009/08/11(火) 14:49:14Thx!
0075デフォルトの名無しさん
2009/08/11(火) 16:37:25気に入らないレスをスルーできないと
(掲示板を利用するのは)難しい
0076デフォルトの名無しさん
2009/08/11(火) 16:39:380077デフォルトの名無しさん
2009/08/11(火) 16:50:59「そもそも」の使い方間違ってるぞ
スレの流れに沿って喋れない人間には価値が無いんだよ、これが
0078デフォルトの名無しさん
2009/08/11(火) 16:54:25ぼくの Vim への憎悪が意味するのは、ぼくが Vim のことを史上最大の
無意味なプロジェクトだと見ているということだ。
Vim がしばらくの間スローガンにしていたのに、
「ちゃんとした Vi」みたいなのがあったよね。
そんなスローガンでスタートしたら、もうどこにも行くところがない。
Vi をちゃんとすることなんて不可能だからだ。
0079デフォルトの名無しさん
2009/08/11(火) 17:05:26それウケると思ったの?
0080デフォルトの名無しさん
2009/08/11(火) 17:10:51>>78のことかw
0081デフォルトの名無しさん
2009/08/11(火) 17:15:09s/Vim/Emacs/g にしてもあまり違和感がないと思うのは俺だけ?w
0082デフォルトの名無しさん
2009/08/11(火) 18:38:490083デフォルトの名無しさん
2009/08/11(火) 18:42:240084デフォルトの名無しさん
2009/08/11(火) 21:38:180085デフォルトの名無しさん
2009/08/11(火) 22:11:090086デフォルトの名無しさん
2009/08/12(水) 09:31:23の一行掲示板にescapeをかけたいのですが,
表示部分を#{CGI.escapeHTML(message)}とすると,
改行したい<br>まで出力してしまいます.
単純に使い方わかってないこともありますが,ご指摘お願いします.
0087デフォルトの名無しさん
2009/08/12(水) 10:01:32s/Vim/Ruby/g にしてもあまり違和感(ry
0088デフォルトの名無しさん
2009/08/12(水) 10:03:39escapeしたいのは何故?
escapeしたいものは何?
0089デフォルトの名無しさん
2009/08/12(水) 10:47:21#!/usr/bin/ruby -Ke
require 'cgi'
require 'kconv'
# 仕様:1行掲示板なのでユーザーはHTMLタグを使えず、改行の自動置換等も行わない
# ログファイルがプレーンテキストでなくてもいいなら、ファイルにエスケープしたものを保存したくない
logfile = 'bbs_test.log'
log = File.open(logfile ,'r'){|f| f.read} rescue ''
post = CGI.new["datapost"]
if post
log = CGI.escapeHTML(post.toeuc) + "<br>\n" + log # postデータを追加
File.open(logfile, 'w'){|f| f.print(log)}
end
print "Content-type: text/html\n\n"
print <<EOF.toeuc
<html>
<head>
<title>rubyで一行掲示板</title>
</head>
<body>
<form method="POST">
一言:<input type="text" name="datapost">
<input type="submit" value="送信">
</form>
<hr>
#{log}
</body>
</html>
EOF
0090デフォルトの名無しさん
2009/08/12(水) 10:48:181. messageを行ごとに分解
2. 行ごとにescapeHTMLする
3. 行末に<br>をつける
4. 出力する
という処理をする必要があるんじゃないかな。
def text2html(str)
str.collect {|line| CGI.escapeHTML(line).sub(/$/, '<br>') }.join()
end
#{text2html(message)}
とかでどうでしょうか。
0091デフォルトの名無しさん
2009/08/12(水) 11:02:58面影残ってねえ
0092デフォルトの名無しさん
2009/08/12(水) 11:18:51いまだに cgi-lib を使ったままのスクリプトを再利用してやる義理はねえよ
irb> require 'cgi-lib'
Warning:(irb):1: cgi-lib is deprecated after Ruby 1.8.1; use cgi instead
true
irb>
0093デフォルトの名無しさん
2009/08/12(水) 11:43:55やってみましたが,変わりありませんでした..
0094デフォルトの名無しさん
2009/08/12(水) 11:46:32これは元記事がそもそもかなり悪いな
わざわざ悪いやり方で学ぶ必要もあるまい
0095デフォルトの名無しさん
2009/08/12(水) 11:54:590096デフォルトの名無しさん
2009/08/12(水) 12:25:18ttp://www.skuare.net/2007/06/ruby_1.html
CGI の入力・出力構造は基本的に通常のスクリプトと変わらない
ブラウザからのデータをサーバが解釈した環境変数 QUERY_STRING の中身が標準入力に既に入っていて
標準出力を行うとユーザーに送る HTML などのデータとみなされてサーバが一旦受け取るという違いしかない
ただ、環境変数 QUERY_STRING を直接アクセスすることは今となってはまず無い
たいていは適度に使いやすく変換してくれる肩代わりライブラリ、Ruby では標準添付の cgi 、を使う
Web ブラウザは、HTML 上の送信ボタンが押されたときには、そのボタンを含む FORM 要素の
INPUT 要素や TEXTAREA 要素の name 属性と value 属性をペアにしてまとめ、適当にエンコードしてサーバに送る
上記サイトでは HTML 上で value が省略されているが、普通にユーザーが入力すればその値が value としてサーバに送られる
そして、サーバが受け取ったデータというのは通常
name1=値1&name2=値2…
というようなひと連なりのテキストというか英数字記号の巨大な塊となっている
これをいちいち安全かつ適切に自力分解復元するのは面倒だし不安なので、 cgi ライブラリにその仕事をやってもらう
CGI.new とすると QUERY_STRING が読み込まれ、わかりやすく分解されて、[ ] メソッドで参照できるようになる
たとえば HTML 上で name1 だった入力欄の値を利用したい場合は
cgi = CGI.new
cgi['name1']
とすればよい
なお、標準出力はサーバが全て受け取るので、何かをユーザー向けに表示させたい場合は、
本来 Web サーバが行っていたことも全て自力でする必要がある(CGI はそういうふうになっている)
HTML を表示したいのなら、 サーバが自動で行っていた Content-Type という HTTP ヘッダ等の表示も自前で行わなければならない
print "Content-type: text/html\n\n"
CGI#out のブロックで括るとこれを自動で行ってくれるのだが、まあそれは別の話
0097デフォルトの名無しさん
2009/08/12(水) 13:02:320098デフォルトの名無しさん
2009/08/12(水) 13:03:480099デフォルトの名無しさん
2009/08/12(水) 13:20:22標準入力経由でQUERY_STRINGを渡したり
標準出力への出力が勝手にHTMLとみなされるWebサーバなんてあるの?
0100デフォルトの名無しさん
2009/08/12(水) 13:25:290101デフォルトの名無しさん
2009/08/12(水) 13:41:41そういやなんでわざわざ分けたんだろうな、これ
GET も POST も全部標準入力に渡せばよかったんじゃねーかと思うんだが、当時なんかあったのか
0102デフォルトの名無しさん
2009/08/12(水) 14:37:04GETはリソースを取りに行くメソッド。
リソースの位置(※)を特定する情報としてquery stringが付く。
POSTは指定リソースに対して新たなリソースを作成させるメソッド。
作成する情報はリソースの位置(※)ではないのでURLのquery stringで
はなくHTTPリクエストのBODYで指定する。
※ URL = Uniform Resource Locator
0103デフォルトの名無しさん
2009/08/12(水) 16:51:40=~ の右辺を別ファイルから参照させたいんだけど,どうすればいいですか?
0104デフォルトの名無しさん
2009/08/12(水) 16:54:57re = Regexp.new("$d+")
if s =~ re
みたいにすれば動的に正規表現作れる
0105103
2009/08/12(水) 17:48:43apple
banana
cat
が入っていて,それが今後どんどん追加されていくときに
=~の右辺がwordのなかを一行ずつ読み込んでマッチしているか確認してほしいのです.
>>104
$dは特殊変数かなにかですか?
0106デフォルトの名無しさん
2009/08/12(水) 17:53:34たいてい書いてあるからさ
文字列を正規表現オブジェクトにする方法はいくつかある
リテラルとして直接書き込む方法
/hoge/
変数として // 内で展開する方法
str = "hoge"
/#{str}/
Regexp オブジェクトの明示的な生成
Regexp.new("hoge")
好きなの選べ
0107デフォルトの名無しさん
2009/08/12(水) 18:02:47すいません.wordの中をgetsで取得しながらやってみます.
ありがとうございました.
0108デフォルトの名無しさん
2009/08/12(水) 18:44:30なにか話がすれちがっている気がする
>>103
ストップワードっていう奴ににているのかな?それを用意しておきたいの?
0109デフォルトの名無しさん
2009/08/12(水) 18:51:43という話?
0110デフォルトの名無しさん
2009/08/12(水) 18:52:550111デフォルトの名無しさん
2009/08/12(水) 19:51:190112デフォルトの名無しさん
2009/08/13(木) 02:00:020113デフォルトの名無しさん
2009/08/13(木) 04:48:18なんでそんなに悔しがってるの
0114デフォルトの名無しさん
2009/08/13(木) 05:48:280115デフォルトの名無しさん
2009/08/13(木) 07:17:45○ おちんちんびろーん
0116デフォルトの名無しさん
2009/08/13(木) 07:22:05なんでそんなに悔しがってるの
0117デフォルトの名無しさん
2009/08/13(木) 07:36:360118デフォルトの名無しさん
2009/08/13(木) 08:06:200119デフォルトの名無しさん
2009/08/14(金) 03:40:25例えば、A1 〜 A5 を取得するには cells = sheet.Range("A1:A5") と書きますが、
データがある領域の全域を指定するにはどうしたら良いでしょうか?
行と列の数が5x3程度なら大したこと無いのですが、複数のシートが数千行x数十列の
データを持っている場合だと毎回スクロールして端の位置を確認しなければならず不便です。
どなたかよろしく願います。
0120デフォルトの名無しさん
2009/08/14(金) 04:58:36「Excal シートの端」でぐぐったここ
ttp://oshiete1.watch.impress.co.jp/qa4146366.html
0121デフォルトの名無しさん
2009/08/14(金) 07:00:34【OLE】オートメーション総合スレ【ActiveX】
■ このスレッドは過去ログ倉庫に格納されています