[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/16 20:51 / Filesize : 256 KB / Number-of Response : 901
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 22



1 名前:730 [2008/09/15(月) 17:25:21 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.7 の使用をお勧めします】
    ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。
      1.9 の新機能の一部が利用可能なので初学者にお勧めです。
    ※ただし十分安定しているとは言えないので
      プロダクション環境での利用にはお勧めしません。

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

610 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:32:47 ]
?付きメソッドを自分で定義すれば済むだけなので、漏れは必要ないかなあ。

611 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:48:34 ]
>>610
メソッドごとに一つ一つ?付きを定義していくのって凄く面倒じゃね? 変更に弱くなるし

612 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:59:26 ]
?末尾のシンボルを渡されたら、メソッド名はそのままに
末尾削った変数にアクセスするっていうのも便利かもしらんね

でも真偽値のアクセサが面倒になるほど多いっていうのも
設計見直せる可能性はない?

613 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 22:29:30 ]
class Hoge
 def self.def_predicate(name)
  attr_accessor name
  private name
  private "#{name}="
  define_method("#{name}?"){ __send__(name) }
  public "#{name}?"
 end

 def_predicate :hoge
end

こんなんとか。リフレクションを用いるほど多く使うんじゃなければ
ちゃんと書いたほうがいいと思うけど

614 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 22:40:14 ]
>>611
>>612の言うように?付きメソッドをそんなに定義することあるかな?

615 名前:611 mailto:sage [2008/10/15(水) 22:43:31 ]
>>612 >>614
4〜5つ程度の?付きメソッドでも、似たような定義を続けて書くことになるからかなり面倒だと俺は思う
この辺は個人の意見もあるとは思うが

616 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 22:51:08 ]
attr はあまり使わない
メソッドはきちんと定義する

617 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:34:27 ]
そもそも @hoge? ができないことに疑問を感じるんだが

618 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:45:48 ]
だから ? つきはメソッドだっつーの述語だっつーの

data= っていう変数が作れないのは不自然か?
change! っていう変数が作れないのは不自然か?



619 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:56:18 ]
@is_foo みたいな変数名をどれだけ見かけることか
変数名が述語になれないのはおかしい

620 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:08:25 ]
@hoge? = 123
まず見た目がきもい
そして三項演算子の文法と衝突しそう

621 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:08:33 ]
変数名が述語になるほうがおかしい飢餓す

622 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:12:41 ]
@foop か @foo_p でいい

623 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:14:27 ]
「○○が二者択一のどちらかか、を格納する変数」というのはあまり Ruby っぽくない
二者択一の判断自体をメソッドで参照するのがフツーな気がする

624 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:32:23 ]
>>620
そんなこと言ったらメソッド foo? がどんなオブジェクトも返すことのできる点もおかしくないかい?

625 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:36:58 ]
見た目がきもい、ってのはほんとに見たまんま、?で終わる識別子が左辺値にくるのが
きもいってことだよ。
別に @hoge? = true ならいいってことじゃない

626 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:41:29 ]
>>621
変数名とメソッド名の間で、言葉づかいの上でのセマンティックスが違っている「べき」なら、attr 系は廃止すべきってことになるな

>>625
@hoge? = true なら悪くないと思うけど

627 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:46:06 ]
やだよ。
メソッド名の慣習のせいで、「hogeっすか?」って訊いてるようなイメージがあるじゃん。>@hoge?
で、「そうっすよ」とか「違いますよ」とか返事しようとしてるところに値突っ込むってのは変な感じだ。観念的な言い方でアレだが

628 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:50:34 ]
何も @hoge? があってもそう書かなきゃいけないわけじゃないから、? を使わない自由を奪っているわけではないでしょ。
それよりも、attr 系によって変数名とメソッド名を関連付ける機能が提供されているにもかかわらず、? 付のメソッドだけ特例でそれができないほうが一貫性に欠けて嫌だ。



629 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:54:28 ]
>変数名とメソッド名を関連付ける機能
単なるメソッド。とあるリフレクションのラップなだけ。

>? 付のメソッドだけ特例でそれができない
できないのはそこじゃなくて変数名に?を付けること。
でもってこっちは処理系本体の機能の話。

パーサとかに手を入れて?付き変数を許してまで@hoge?とか書きたいか?

630 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 00:58:26 ]
そりゃ現状じゃ @hoge? が書けないようにパースしてるんだから、パーサを変えるしかないわな。
別に難しいことじゃない。
あと、attr_reader が処理系そのものが提供しているかどうかなんて関係ないじゃん。飽くまで意味論の話だし、built-inで入ってるんだから。

631 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:02:56 ]
だって…再定義できるもの

632 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:06:57 ]
>>627
メソッドvalueと変数@valueがあったとして、メソッドのほうは「valueは何か?」と問う意味なのに対して@valueはそのままの意味だよね?
同じようにhoge?がメッセージだと解釈されても、@hoge?までメッセージと解釈する必要はないのでは?

633 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:20:26 ]
変数名だからその通りなんだけど、あくまでイメージというか馴れや先入観の問題だよ。>@hoge?がメッセージっぽい

また別の問題として、
変数名に?が付けられて、attr系もそんな名前を受け取るとすると
hoge.foo? = true とか
hoge.bar! = false とかが出て来る。後者なんて比較の否定と見間違う。

さらにいうと、?や!を許すとして、[]とか[]=とか@-は変数名に許す? 全部メソッド名としては有効なはずだよ。
attr_accessor :foo=
-> foo.foo= = 123
こんなことになる

634 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:44:47 ]
hoge.foo? = true はできてもいいと思う。
hoge.foo! = ってのはまあちょっとヘンだけど、attr系で ! つけたかったことないから、あってもなくてもいいや。
[] や = が「メソッドの一部である」というのは別の側面で筋を通すための論法であって必ずしも名前の一部ではないので
(その証拠にメソッド「foo=」は、「foo.foo = 」のようにスペースを入れることができる)、
attr_accessor :foo= 等はなくてもよいかと。

635 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:55:24 ]
>その証拠にメソッド「foo=」は、「foo.foo = 」のようにスペースを入れることができる
いやいや、メソッド名はあくまで「foo=」だよ。__send__(:foo=, 123)とか出来る。
パーサが頑張って「foo.foo = value」を「foo.foo=(value)」と同じような扱いにしてくれているだけで。

636 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 06:05:11 ]
隔離スレでやれ

637 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 09:41:53 ]
本スレが隔離スレってのも難儀な話だよなあ

638 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 07:15:54 ]
RDEのツールバーとコンソール窓の設定などが上手く動作してくれません
ツールバーを移動して1段にまとめたりしても、RDEを最起動すると別の位置へ
勝手に移動した状態になってしまいます
コンソール窓は、フォントの設定が初期値に戻ってしまうのと、
ctrl+alt+cで開閉したりができません

コンソール窓のフォント設定だけは致命的なんで、そこだけでもなんとかできればと



639 名前:638 mailto:sage [2008/10/21(火) 07:27:47 ]
一応環境も
ActiveScriptRuby 1.8.7(p72)
Windows XP SP3
です

640 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 14:20:14 ]
ツールバーの問題は俺の環境(XP)では何年も前からあるよ。

641 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 15:51:59 ]
てかRDE薦めてるサイトでもあるのか?
俺なら間違ってもRDEなんて使わせないんだが

642 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 15:56:44 ]
統合環境使わせるなら EclipseかNetBeansあたりじゃね?

643 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 15:58:04 ]
本筋以外での障壁が大きいからねえ…
「我慢して使う」時点で何か間違っとる
素直にエディタとプロンプトをAlt+Tabで切り替えて使うほうがマシ

644 名前:638 mailto:sage [2008/10/21(火) 17:13:53 ]
コンソール窓のフォント設定は自分のミスでした
コンソール窓で右クリして「設定」からフォントを設定していたのですが、
直ぐ上に「フォント」というのがありました… 見逃してました

>>640
どもです
ツールバーはしょうがないみたいですね

>>641-643
どもです
winの人がrubyを始めようと思うと、RDEがまず最初に目に入るような気がします
NetBeansはDLしてあったのですが、JAVAが云々…とまたやることが増えそうなので
後回しになってました
とりあえず簡単なプログラムを書いて試したかったので、RDEをという感じで
日常はEmEditorのフリー版(かなり古い)を使っていたので、それでやればよかったのですが
コマンド操作には不慣れなwin人なんで、お手軽(そう)なRDEから初めてみようと思い

初心者〜中級者?への道筋がすっぽり抜けてる感じがしていて先行き不安ですが
書いて直ぐ実行できるのはやっぱり楽しいし勉強になります

645 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 18:04:59 ]
RDEはirbと似たような感じでSandBoxとしてしか使わないなぁ。
ファイルに保存はしなきゃならんけど、EmEditorも言語モード別のキー設定と、
外部プログラムのを実行して標準出力を下窓に出す機能が(少なくともVer6からには)
備わってるから、キー1発で実行はできるよ。

646 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 18:48:59 ]
RDEはいろいろなところで紹介されてるから、知名度はかなり高いし
動作はけっこう軽くて多機能、日本語対応と利点は多い
が、不安定さ(特に文字コード関連)とレジストリ使用がそれらの魅力を帳消しにしている

647 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 19:42:48 ]
RDEを普段使ってない人がファーストインプレッションあるいは又聞きで薦めてんじゃないかと思ってる
普段から使っていれば、少なくとも初心者には勧めようとは思えないはずだ

単一言語用だからといってIDE作成が簡単になるわけではない
1種類の言語にしか対応しなくても、10種類の言語に対応してても、IDEとしての作り方は同じだと思う
Rubyに特化すればIDEが俺でも作れそうとか最初に思った人は罪深いなと思ってみる

648 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 19:58:42 ]
FreeRIDEが日本語や他の文字コードに対応してくれれば無敵なんだが



649 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 22:52:51 ]
rubyの表記法の質問なのですが、
Test::Sample
のように書かれていたら、TestとSampleはともにクラスでTestがSampleの親クラス
という認識で合ってますか?
::という記号は定数やクラス変数なども表すとネットで見たのですが
区別は付くのでしょうか?

650 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 23:13:36 ]
:: は 「の」 だ
Test::Sample は Test 「の」 Sample だ
それ以上の意味はないよ
クラスかどうかは普通に識別子で判断する
先頭が大文字なら定数かクラス
先頭が小文字かアンダースコアならメソッド
ただ、あからさまに面倒なのでメソッドを :: で繋ぐことはRubyでは意図的にしない
(他の言語での書き方をしないと死ぬ人が稀に使う)

651 名前:649 mailto:sage [2008/10/22(水) 00:09:42 ]
>>650
ありがとうございます。
そんな曖昧なものだったんですね。メソッドは#でしたっけ?
この業界っていやに自己主張強い人が多いから統一できないのかな

652 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 07:50:20 ]
RDEってRubyのサンプルプログラムとして付いているもんだと思ってた・・・

653 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 09:30:08 ]
>>651
スクリプト上での表記とマニュアルでの表記は違う

…違ってちゃいけないと思うんだが、まあ、
「○○クラスのインスタンスメソッド××を…」と書く代わりに「○○#××を…」と
「○○クラスのクラスメソッド××を…」と書く代わりに「○○.××を…」と
「○○クラスの定数××を…」と書く代わりに「○○::××を…」と書けたほうが
一度理解してしまえば便利ではある

654 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 18:04:18 ]
>>653
> スクリプト上での表記とマニュアルでの表記は違う
>
> …違ってちゃいけないと思うんだが、まあ、

とはいえ、あるクラスのインスタンスメソッドというのは、直接コード上には
現れないから、そもそも同じ表記にはしようがない。
いちいち X.new.m とか書くのもめんどくさいだろ。


655 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 20:22:05 ]
>>650
Test::Sample だったら普通はmoduleかclassがネストされてるやつじゃね?

656 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 09:59:06 ]
>649
::で示されるのは主に
・モジュール内クラス
・クラス内クラス
・モジュール内モジュール
・クラス内モジュール
・モジュールの持つ定数
・クラスの持つ定数
などであって、クラス間の親子関係ではない。
どちらかと言えば所有、もしくは所属の関係。

657 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 17:43:37 ]
Windowsなら、既に更新停止状態だがJmEditorでぜんぜんいける。
コマンドライン登録しとけば、キー一発で実行できるし、プロンプト
勝手に閉じてほしくないなら、ruby.exe実行してからpauseするバッチ
ファイル登録すればいい。

658 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 18:56:51 ]
まさかJmEditor使いが俺の他にもいたとは
動作軽いしUSBで運べるし、便利だよね



659 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 22:50:55 ]
irb とかでいっつも忘れるんだけど、NKF.guess の返り値の数字と文字エンコード名の関係ってどっかに書いてないかな?

660 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 22:57:18 ]
NKF.constants.map{|s|[NKF.const_get(s),s]}
こんな感じで出せばいいんじゃないか?

661 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 23:42:46 ]
refeで引いてみたら出てるかと思ったが

$ refe NKF.guess
require 'nkf'
NKF.guess
--- guess(str)

文字列 str の漢字コードを判別して返します。
返される値は、NKF モジュールのモジュール定数です(下記参照)。
ruby 1.8.2 より前は現在の NKF.guess1 と同じものです。
ruby 1.8.2 以降では NKF.guess2 と同じものです。


下記参照て言われても、下記がない・・・

662 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 08:30:26 ]
.chmもちあるけば解決するお

663 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 09:07:06 ]
>>659
あれは inspect で文字列が出るべきだと思う

664 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 09:07:51 ]
>>662
書いてねえって

665 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 10:01:53 ]
>>664
キーワード:NKF.guess(str) (nkf)
でとんだページの下に定数が書いてあるけど・・・

666 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 11:02:43 ]
> NKF.guess の返り値の数字と文字エンコード名の関係

667 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 23:52:29 ]
ああ、そりゃソース嫁としかw

668 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 13:34:31 ]
>>656
じゃあクラスの継承はどうやって表すの?



669 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 13:55:39 ]
「表しようがない」が正解かと
「XXXを継承したYYY」のように文章で書くしかないな

670 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 23:39:57 ]
Win32OLEを使ってエクセルの自動処理をしようと思っているんですがうまくいきません。

require 'rubygems'
require "win32/clipboard"
require 'win32ole'

excel = WIN32OLE.new('Excel.Application')
excel.visible = false
excel.displayAlerts = false

excel.workbooks.open 'filename' => 'foo'
workbook = excel.workbooks(1)
sheet = workbook.sheets(1)
sheet.select
excel.Columns("B:B").select
excel.selection.copy
excel.quit
↓に続く

671 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 23:40:47 ]

class Excel
end
excel = WIN32OLE.new('Excel.Application')
WIN32OLE.const_load(excel, Excel)
excel.visible = true
excel.displayAlerts = true

book = excel.workbooks.add('bar')
sheet = book.worksheets(1)
sheet.Columns("B:B").Insert Shiftt = Excel::XlToRight

excel.Range("B1").ColumnWidth=11  #セル幅設定                       ←幅や領域が違うっていうエラーが出るのでなんとなく

excel.Columns("B:B").select
excel.selection.parent.paste

book.Save
excel.quit

エラーメッセージは以下
 `method_missing': paste (WIN32OLERuntimeError)
    OLE error code:800A03EC in Microsoft Office Excel
      Worksheet クラスの Paste プロパティを取得できません。
    HRESULT error code:0x80020009
      例外が発生しました

pastespecialなんてのも試してみてもダメ、エラーコードでググってもダメ、"ruby excel paste"などもググって見ましたがダメでした。
よろしくお願いします。

672 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 11:07:36 ]
>>670-671
Excel.Application ペースト でググるんだ
Win32OLEの情報を探すときはRubyに限定しないほうが良い
俺excel持ってないから動作検証できないけどごめんね

673 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 12:43:20 ]
関係ないけど gemで入れられる excel用のライブラリ見つけたぜ
spreadsheet-0.6.1.5 Documentation
spreadsheet.rubyforge.org/


674 名前:670-671 mailto:sage [2008/10/26(日) 17:37:00 ]
>>672-673
ありがとうございます。解決しました。

原因は貼り付ける際に列で指定していたからダメだったようで、
貼り付ける先頭セルの値をRangeで受け渡したらうまく行きました。
また上のプログラムだとちゃんと保存できないのも注意です。
開き方の問題なのか読み取り専用になっているようです。
名前を付けて保存するようにしたらちゃんと保存されました。

675 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:29:35 ]
掲示板スクリプトを作ってるんだけど、動かない。
どこがおかしいのかな。

使っているサーバー @pages (www4サーバー)

一応誘導を受けて来たので誘導元
□規制解除要望□ dion.ne.jp専用 Part727
ex24.2ch.net/test/read.cgi/accuse/1224841217/

スクリプトはここからダウンロードして
www4.atpages.jp/mh35jp/bbsmake.html

676 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:33:52 ]
excelのvlookupのようなものをrubyで書きたいのですが
遅いので速くしたいです。(元々excelのものが遅いのが発端です。)
アドバイスをいただけないでしょうか。
よろしくお願いします。

###################
想定する入力データ

1,0.25,2.25
2,0.75,1.76
3,1.24,1.24
4,1.76,0.75
5,2.25,0.25



677 名前:676 mailto:sage [2008/10/26(日) 19:34:59 ]
#676の続きです
def Vlookup(vs,v)
vx=vs.to_f
if (vx<v[0][0]) then
return -99.9
break
elsif (vx>v[v.size-1][0]) then
return 99.9
break
end
for i in 0..(v.size-1)
vpre=v[i][0]
vpst=v[i+1][0]
if (vx>vpre)&&(vx<=vpst) then
if (vpre-vx).abs<=(vpst-vx).abs then
num=i
elsif (vpre-vx).abs>(vpst-vx).abs then
num=i+1
end
break
end
end
return v[num][1]
end


678 名前:676 mailto:sage [2008/10/26(日) 19:35:43 ]
#677の続きです。
DAT=[[0.5,5.0,50.0],[1.0,10.0,100.0],[1.5,15.0,150.0],[2.0,20.0,200.0]]

lines=Array.new

open(ARGV[0],"r") do |f|
while line = f.gets
line.chomp!
lines=line.split(/,/)
lines[1]=Vlookup(lines[1],DAT)
lines[2]=Vlookup(lines[2],DAT)
print lines.join(","),"\n"
end
end




679 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:44:37 ]
>>675
いきなり自作CGIをレンタルサーバーで動かすとか正気の沙汰ではないぞ
httpdのエラーログをみよう。
いやその前に、まずは、WindowsならばXAMPPでも入れてローカル環境で試そう、な


680 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:54:27 ]
>>679
一応ローカルで実験はした。
方法
1.irbを起動する
2.環境変数を設定
3.systemコマンドで実行
結果
とりあえず動いた

だからアップロードしたわけだが。

681 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 19:58:41 ]
結論:

 ・ 馬鹿にCGIを渡すな



682 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:02:38 ]
>>681
一応Apacheをインストール中
ところで、WindowsのApacheでCGIを動かすとき#!の行はどうすればいい?

683 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:10:51 ]
家の環境では、ruby.exeをapacheと同じドライブの例えばc:\usr\local\bin\ に放り込んでおけば動いた

684 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:12:44 ]
パスは通しておいてね

685 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:12:47 ]
>>682
パス通して#!rubyでいいんじゃね

686 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:13:15 ]
> パスは通しておいてね
Ruby本体をインスコしたディレクトリにパスは通しておいてね

687 名前:675 mailto:sage [2008/10/26(日) 20:20:11 ]
実験は成功した。普通に動いた。
今度は書き込みを実行したとき何も出力されないバグが出てきたが

688 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 20:34:55 ]
cgi-exception入れとけ
ttp://cgi-exception.rubyforge.org/



689 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:02:28 ]
>>688
ローカルでは動く。リモートでは動かない
cgi-exceptionをrequireしても(もちろんそのファイルごとアップロード済み)
まったくダメ。

690 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:07:27 ]
この分だと向こうで拡張ライブラリの一部が欠損しているというオチの可能性が
高そう。標準添付のライブラリ(cgi,nkf)しか使ってないのに…

691 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:24:01 ]
CGI.unescape(cgi.params['うんこ']) を CGI.unescape(cgi.params['うんこ'][0]) にするとかさ、
NKF,nkf(略) を NKF.nkf(略) にするとかさ、
変数名やGET/POSTパラメタの名前に誤りがないかよく見るとかさ。

692 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:26:19 ]
環境を疑うよりは、まず自分のスクリプトを徹底的に疑うべき
CGI-Exceptionでエラーが出ないなら次はprintfデバッグだ
スクリプト中の適当な位置で、テキストファイルにログを書き出していけば
たいていエラー箇所を特定できる
(スクリプトが全く実行されない場合は、syntax errorかrubyパス絡みの可能性が高い)

693 名前:692 mailto:sage [2008/10/26(日) 21:37:21 ]
あ、重要なこと書き忘れてた

初心者は(初心者じゃなくても一緒だけど)まず最小限のCGIスクリプトから書き始めろ
小さなスクリプトが動いてから、徐々に機能追加していかないと
ただでさえ特定しづらいCGIのエラーが、余計に特定しづらくなる

少なくとも、そこそこの長さがあって環境変数が関わるような掲示板スクリプトを
一気に書き上げるべきではない

694 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:55:34 ]
>>691
それにはすでに気づいて直した。直したが治らない。
>>692
syntax errorがらみはありえない(-cオプションで検査済み)
パスもチェック済み(/usr/local/bin/ruby)
>>693
一応ローカルで動作確認済みなので

695 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 21:59:42 ]
これはRubyの問題ではない(まだ)

>>694
だからその方法が間違ってると指摘されてるだろう
CGIは「ブラウザでInternalServerErrorが出なくなるまで書き直す」という手法で開発してはいけない
エラーメッセージを確認しない開発手法は糞だ

696 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:02:14 ]
> 一応ローカルで動作確認済みなので
最小限のCGIスクリプトをサーバー上で動かさないとダメ
「環境変数自分で入れて、systemで実行して動いたから」というのではあまり意味がない

697 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:03:11 ]
結論:

 ・ 馬鹿にCGIを渡すな



698 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:04:18 ]
>>695
とりあえずちょいと方法が思い浮かんだので実験してみる

1.まずは単なるテストスクリプトが動くか確かめる
それすら動かないようならとりあえずこの環境での動作はあきらめたほうがよい
2.次にちょっとした工夫のなされたテストスクリプトを使って実験を行う
3.最後にその結果を見て検証する



699 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:04:55 ]
RubyでWin32弄くる場合に必要な知識はRubyそのものではないのと同様に
RubyでCGIやる場合に必要な知識はRubyそのものではないのだな

ライブラリで吸収隠蔽すべきかどうかというのは悩ましいとこだと思う

700 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:05:14 ]
>>696
Apacheでも動作確認済み
1時間以上前に実験した。

701 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:06:11 ]
bbs.cgi:57: cgi.params['content']をCGI.unescapeに渡している
Arrayが渡ったりしてNoMethodError -> あぼーん
bbs:cgi:58: NKF,nkf('-s',content) カンマとドットのtypo

とりあえず2つみっけ
動作確認済みとは笑わせるな
それともHPのzipからまた弄ってるのか?

702 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:09:26 ]
>>700
どう動作確認したのかkwsk
俺の環境でApache立ち上げて試してみたが、普通にアクセスしただけでエラーが出る
具体的には>>701

703 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:09:46 ]
#!/usr/local/bin/ruby -Ks

print "Content-type: text/html\n\n"
print "<html><head><title>テスト</title></head><body><p>テスト</p></body></html>"

このスクリプトすら動作してないのでもはやお手上げ

704 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:10:02 ]
>>699
だねえ

>>700
小出しにするな
自分で話をまとめられないなら諦めれ

705 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:11:17 ]
> 小出しにするな
> 自分で話をまとめられないなら諦めれ

に一票
そして離脱

706 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:17:59 ]
>最小限のCGIスクリプトをサーバー上で動かさないとダメ

に対して

>Apacheでも動作確認済み
>1時間以上前に実験した。
って…明らかに話噛み合ってないな

707 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:19:34 ]
>>703
自分でApache立ち上げて試すときは、そのパスじゃまず起動しないぞ
#!ruby -Ks
にして試してみ。それでも駄目ならお手上げ

708 名前:675 mailto:sage [2008/10/26(日) 22:21:49 ]
>>706
まったくかみ合わない上に、どうやらこちらの問題ではなさそうだと
判明したのでたぶんこれ以上話し合っても結論が出る可能性は0(正確には)

ただ、根本的バグが見つかったのは皆さんのおかげです。
皆さん、ご協力どうもありがとうございました。



709 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:24:45 ]
>>707
もちろんローカルでやるときはそのためのパスにするわけですけどね。

710 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:31:12 ]
>>707
Rubyの絶対パスを指定して動いてるので、いえるのは
もはやここでは対処しようのない問題だということです。
とりあえずテストスクリプトすら動かないということは
他のところに持っていったのでこれ以上の深入りは
避けたいと思います。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<256KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef