08/10/13 01:56:31
Rubyのクラス分けやモジュール分けはてきとーで良いということがわかった頃から
スクリプト作るの早くなったような気がする
今でも特異メソッドとかわからんが
インスタンスメソッドとクラスメソッドしか作ってない
Proc はライブラリで要求されないと作らない
yield は使う機会が無いのでわけがわからない
551:デフォルトの名無しさん
08/10/13 06:21:15
yield は each 作ったりしたらすぐ覚える
552:デフォルトの名無しさん
08/10/13 06:31:29
おれはテストを書く気が全く起こらないんだよなあ…
少しづつでも書けばいいんだろうけど
つまらないから全く続かない…
553:デフォルトの名無しさん
08/10/13 07:56:06
どう考えても
テストを書くのに悩む時間 >> 変なバグで悩む時間
なのでテストを書く理由がない俺
他人様に提供するライブラリ書くんじゃない限り要らないもんだと割り切ってる
書き方指南がないということは本当はみんな不要だと思ってる証拠
554:デフォルトの名無しさん
08/10/13 08:32:04
>>553
書き方指南いろいろあるじゃん
本にもwebページにも
俺も有用であるという自信はないが
555:デフォルトの名無しさん
08/10/13 08:43:49
テスト書くためのスクリプトでテスト書く説明するだけだしなあ
お前そんなスクリプトなんて普段絶対書かないだろ、というのが多々…(特にテスト駆動)
556:デフォルトの名無しさん
08/10/13 08:54:11
スクリプト序盤から中盤での書き方がよくわからないのがテスト駆動の特徴
というかMockとかあのへんを理解しないと関数的スクリプトのテストしかできん
557:デフォルトの名無しさん
08/10/13 09:23:47
色々書き方の作法もあるけど、むしろ形式に捕らわれず自由にテスト書くようにしたら
それはそれで楽める部分もあると思う。
558:デフォルトの名無しさん
08/10/13 09:42:39
俺はテスト書かなくて困るのってリリース後なんだよなぁ。
デグレ出るたびに書いときゃよかったって思う。
559:デフォルトの名無しさん
08/10/13 10:07:10
ちゃんとテストが書けるようになったら、もう上級者だよ。
つまり上級者になるためには、テストがきちんと書けるようにならないといけない。
おれはまだうまく書けないんだけどな。
UIのテストなんか、どうしたらいいのかさっぱりだ。
560:デフォルトの名無しさん
08/10/13 10:36:29
他人様のライブラリのgitのtestディレクトリとか眺めてるとよくわかる
本文コードの追加変更に対してテストが異常に適当というか不足
時間かけてまでして作りたくないかどうすれば網羅するか考えるの面倒なんだろうな
561:デフォルトの名無しさん
08/10/13 14:01:54
テストなしでロジック修正とかコードの整理(リファクタリング)とか、
怖くてできない体になった。
562:デフォルトの名無しさん
08/10/13 15:01:22
ZenTest試用中。なかなか良さげ。
URLリンク(mono.kmc.gr.jp)
URLリンク(zentest.rubyforge.org)
gem install ZenTest
でインストール。
563:デフォルトの名無しさん
08/10/13 17:14:28
>>561
わかります
564:デフォルトの名無しさん
08/10/13 17:30:17
テスト書くとメソッド単位でしか検証できないからめんどくさい
あと、GUIアプリのTestってどうやるの?
565:デフォルトの名無しさん
08/10/13 17:35:59
できない
566:デフォルトの名無しさん
08/10/13 17:55:46
入力の自動化をすれば出来る。
が、チェック項目をリストにして人力でやったほうがなんぼかマシ。
567:デフォルトの名無しさん
08/10/13 18:30:55
RubyでGUIつーと、テスト以前に環境が貧弱だからのう。
WebならSeleniumとか。
568:デフォルトの名無しさん
08/10/13 18:32:59
>>564
自動でマウス動かしてクリックしたりフォーム埋めたりするよプログラムを併用する
稀にどうしても自動化できないところが出てくることがあり、そういうときは漏れのない操作一覧図を書いて手動
569:デフォルトの名無しさん
08/10/13 18:58:10
>>564
ビューとコントローラを極力分離すれば、ある程度までは機械的にテストできる
570:デフォルトの名無しさん
08/10/13 19:02:19
GUI自体をテストしたい場合は?
571:デフォルトの名無しさん
08/10/13 19:15:36
GUI自体のテストって具体的にどんなの?
572:デフォルトの名無しさん
08/10/13 19:52:47
マウスクリックのタイミングとか
573:デフォルトの名無しさん
08/10/14 02:10:57
サブネットマスクにマッチするような判定って簡単に出来ますか?
例えば、
"192.168.0.45".in_mask?("192.168.0.0/24") # => true
"192.168.0.45".in_mask?("192.168.0.0/29") # => false
となってほしいのです。
574:デフォルトの名無しさん
08/10/14 02:15:25
本質的にサブネットマスクはbitmaskだから
ANDしてやればいい
575:デフォルトの名無しさん
08/10/14 03:03:18
>>573
IPAddr#include?
576:デフォルトの名無しさん
08/10/14 07:48:35
rubyはじめたばかりのものです。
Windowsにて、ワンクリックインストーラでrubyをインストールし、
RMagick(とImageMagick)をインストールしました。
サンプルプログラムを走らせようとすると(ruby sample.rb)、以下のようなエラーメッセージが出ました。
./RMagick.rb:2: uninitialized constant Magick (NameError)
from D:/Programs/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:
27:in `gem_original_require'
from D:/Programs/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:
27:in `require'
from rmagick.rb:1
ファイルの内容は以下です。
require 'RMagick'
include Magick
img1 = ImageList.new("d:/a.bmp")
img2 = img1.blur_image(0,2)
img2.write("sample01.bmp")
exit
色々と試した結果、上記ファイルがあるディレクトリ(D:\rubyとする)をカレントディレクトリとして、
cmd.exeからruby sample.rbとすると上記のエラーが発生しますが、カレントディレクトリがd:\の
場合は正常に実行されました。どうもカレントディレクトリに*.rbなファイルがあると失敗するようです。
irbでも同様の結果でした。
これを回避する方法はないものでしょうか?
577:デフォルトの名無しさん
08/10/14 09:35:18
そろそろ解決してる頃だろうか
>>576
require 'hoge' は カレントディレクトリの hoge.rb ファイルを読み込む
rmagick.rb (大文字小文字問わず)という自作ファイルを改名しろ
「hoge ライブラリを試そうとして hoge.rb を作って実行し、次にまた別のスクリプトを作って変なエラーにはまる」というのは
そろそろ FAQ にしてもいいと思う
578:デフォルトの名無しさん
08/10/14 09:46:44
>>577
ああ、まさにそれでした。
5時間くらい悩んでの書き込みだったので、今はRMagickのマニュアルを読んでました。
有難うございました。
579:デフォルトの名無しさん
08/10/14 20:24:43
文字列中のすべての"\"を"\\"に、"'"を"\'"に置きかえたいときに
gsubってものすごくつかいづらいんですけど、
なんか他にいい方法はありませんか?
580:デフォルトの名無しさん
08/10/14 21:00:31
str.gsub(/['\\]/){|s|"\\#{s}"}
十分簡潔に思うが、どの辺が使いづらく感じた?
581:デフォルトの名無しさん
08/10/14 21:19:06
str.gsub(/['"]/) { %Q|¥¥#{$&}| }
あたりで手を打たないか?
582:デフォルトの名無しさん
08/10/14 21:19:40
遅すぎたリロード
583:デフォルトの名無しさん
08/10/14 21:42:38
ブロック使わずに表現できないの?
584:デフォルトの名無しさん
08/10/14 21:45:41
str.gsub(/([\\'])/, "\\\\\\1")
・・・うん、ブロックのほうがいい。
>>579-580
後方参照使わずにgsub繰り返すっていう力押しをしてた人が
ハマるパターンだろうね。
585:デフォルトの名無しさん
08/10/14 22:04:09
>>580
なるほど、ブロックを使えばいいんですね。
>十分簡潔に思うが、どの辺が使いづらく感じた?
perl なら、 s/([\\'])/\\\1/; と、比較的直感的なところを
>>584 のように"\\\\\\1"と書くとバックスラッシュが多くなりすぎて
後で読みにくいと思ったわけです。
586:デフォルトの名無しさん
08/10/14 22:06:36
おっと、 s/([\\'])/\\\1/g; でした。
587:デフォルトの名無しさん
08/10/14 23:56:30
str.gsub(/[\\']/, /\\\&/.source)
588:デフォルトの名無しさん
08/10/15 00:44:09
Windows限定でいいんですけど、OSが32ビット版か64ビット版か調べる方法はあるでしょうか。
ENV["OS"]だと32bit版XPでも64bit版XPでも"Windows_NT"と表示されて区別が付きません。
589:デフォルトの名無しさん
08/10/15 00:51:21
Ruby関係ねえええ
ENV['PROCESSOR_ARCHITECTURE'].include?('64') が true なら 64BitなCPUなのできっと 64Bit版Windows
URLリンク(support.microsoft.com)
590:デフォルトの名無しさん
08/10/15 01:06:42
じゃあruby関係で
ruby -e 'p RUBY_PLATFORM'
64bit環境を持ってないのでどんな出力がされるのかは知らんけど
591:デフォルトの名無しさん
08/10/15 01:10:11
RUBY_PLATFORMはコンパイル時に決まりそう
592:デフォルトの名無しさん
08/10/15 01:15:50
Fixnumを地道にカウントアップしていってBignumになる境界を見つける -> そこから推定
とかそういうアホを思いついた
593:デフォルトの名無しさん
08/10/15 01:21:56
64bitのOSで32bitのバイナリ使ってたら無理じゃないか
594:デフォルトの名無しさん
08/10/15 02:22:11
WIN32 API の GetSystemInfo() とか呼んだら良さそうな気がする。
呼び方はあれ、dl 使うなり何なり工夫してくれと。
595:デフォルトの名無しさん
08/10/15 03:01:15
Ruby の Web アプリケーションによくでてくる、
class CGI
def valid?( param, idx = 0 )
self.params[param] and self.params[param][idx] and self.params[param][idx].length > 0
end
end
というコードの著作権者、またはライセンスってわかりますか?
GPL だとしてもソースを配布する際には著作権表示が必要ですよね。
tDiary や hiki にも登場していますが、特別そういう表示がないので
勝手に使っても差し支えないんでしょうか?
596:デフォルトの名無しさん
08/10/15 03:12:41
その程度の誰が書いても同じになるコードには
著作権が発生するほどの創作性はないよ。
597:デフォルトの名無しさん
08/10/15 06:11:16
適当に書き換えればおk
if self.params[param]
if self.params[param][idx]
if not self.params[param][idx].size.zero?
return true
end
end
end
return false
598:デフォルトの名無しさん
08/10/15 06:42:47
>>588
64bit の Windows で試していないから動いたらラッキーぐらいで
require 'Win32API'
GetCurrentProcess = Win32API.new('kernel32', 'GetCurrentProcess', 'v', 'i')
hProcess = GetCurrentProcess.call()
isWow64Process = "\0" * 4
is64BitWindows = false
begin
IsWow64Process = Win32API.new('Kernel32', 'IsWow64Process', ['p', 'p'], 'i')
IsWow64Process.call(hProcess, isWow64Process)
is64bitOS = true unless isWow64Process == "\0" * 4
rescue RuntimeError
end
p is64BitWindows
599:デフォルトの名無しさん
08/10/15 07:08:01
CamelCaseキモすぎる
600:デフォルトの名無しさん
08/10/15 08:10:27
PascalCaseだね
601:デフォルトの名無しさん
08/10/15 08:20:52
LCCだろ
さりとて、Windows の API にはハイフン区切りは似合わないのも事実
602:デフォルトの名無しさん
08/10/15 08:25:44
CamelCaseは力強さを感じる
603:デフォルトの名無しさん
08/10/15 12:36:20
MSは先頭大文字のCamelCase好きだよね
クラス名でもないのに何故?と違和感を感じる
604:デフォルトの名無しさん
08/10/15 14:33:09
クラス名は許せるが、rubyでは_区切りとisPredicateではなくpredicate?を使ってほしい
605:デフォルトの名無しさん
08/10/15 15:06:15
>>604
>isPredicateではなくpredicate?
変数に?使えたっけ
606:デフォルトの名無しさん
08/10/15 15:17:48
使えないよ。
けどpredicateってことは多分604はメソッド名のつもりで言ったんだと思う
607:デフォルトの名無しさん
08/10/15 17:14:47
何気に
attr_reader :hoge?
って書けないんだよな
608:デフォルトの名無しさん
08/10/15 20:37:53
@hoge? がだめだからなぁ。
Module#attr_readerが再定義されていればその限りじゃないぜ
意義はないけど。
609:デフォルトの名無しさん
08/10/15 20:39:11
?付きメソッドを定義したくなるのはよくあることなのに、attrで定義できないのがな・・・
自分でattr_readerを拡張するか、rubyplusのboolattr使うと便利
つーかActiveSupport辺りにも入ってそうな気がする
610:デフォルトの名無しさん
08/10/15 21:32:47
?付きメソッドを自分で定義すれば済むだけなので、漏れは必要ないかなあ。
611:デフォルトの名無しさん
08/10/15 21:48:34
>>610
メソッドごとに一つ一つ?付きを定義していくのって凄く面倒じゃね? 変更に弱くなるし
612:デフォルトの名無しさん
08/10/15 21:59:26
?末尾のシンボルを渡されたら、メソッド名はそのままに
末尾削った変数にアクセスするっていうのも便利かもしらんね
でも真偽値のアクセサが面倒になるほど多いっていうのも
設計見直せる可能性はない?
613:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/15 22:40:14
>>611
>>612の言うように?付きメソッドをそんなに定義することあるかな?
615:611
08/10/15 22:43:31
>>612 >>614
4~5つ程度の?付きメソッドでも、似たような定義を続けて書くことになるからかなり面倒だと俺は思う
この辺は個人の意見もあるとは思うが
616:デフォルトの名無しさん
08/10/15 22:51:08
attr はあまり使わない
メソッドはきちんと定義する
617:デフォルトの名無しさん
08/10/15 23:34:27
そもそも @hoge? ができないことに疑問を感じるんだが
618:デフォルトの名無しさん
08/10/15 23:45:48
だから ? つきはメソッドだっつーの述語だっつーの
data= っていう変数が作れないのは不自然か?
change! っていう変数が作れないのは不自然か?
619:デフォルトの名無しさん
08/10/15 23:56:18
@is_foo みたいな変数名をどれだけ見かけることか
変数名が述語になれないのはおかしい
620:デフォルトの名無しさん
08/10/16 00:08:25
@hoge? = 123
まず見た目がきもい
そして三項演算子の文法と衝突しそう
621:デフォルトの名無しさん
08/10/16 00:08:33
変数名が述語になるほうがおかしい飢餓す
622:デフォルトの名無しさん
08/10/16 00:12:41
@foop か @foo_p でいい
623:デフォルトの名無しさん
08/10/16 00:14:27
「○○が二者択一のどちらかか、を格納する変数」というのはあまり Ruby っぽくない
二者択一の判断自体をメソッドで参照するのがフツーな気がする
624:デフォルトの名無しさん
08/10/16 00:32:23
>>620
そんなこと言ったらメソッド foo? がどんなオブジェクトも返すことのできる点もおかしくないかい?
625:デフォルトの名無しさん
08/10/16 00:36:58
見た目がきもい、ってのはほんとに見たまんま、?で終わる識別子が左辺値にくるのが
きもいってことだよ。
別に @hoge? = true ならいいってことじゃない
626:デフォルトの名無しさん
08/10/16 00:41:29
>>621
変数名とメソッド名の間で、言葉づかいの上でのセマンティックスが違っている「べき」なら、attr 系は廃止すべきってことになるな
>>625
@hoge? = true なら悪くないと思うけど
627:デフォルトの名無しさん
08/10/16 00:46:06
やだよ。
メソッド名の慣習のせいで、「hogeっすか?」って訊いてるようなイメージがあるじゃん。>@hoge?
で、「そうっすよ」とか「違いますよ」とか返事しようとしてるところに値突っ込むってのは変な感じだ。観念的な言い方でアレだが
628:デフォルトの名無しさん
08/10/16 00:50:34
何も @hoge? があってもそう書かなきゃいけないわけじゃないから、? を使わない自由を奪っているわけではないでしょ。
それよりも、attr 系によって変数名とメソッド名を関連付ける機能が提供されているにもかかわらず、? 付のメソッドだけ特例でそれができないほうが一貫性に欠けて嫌だ。
629:デフォルトの名無しさん
08/10/16 00:54:28
>変数名とメソッド名を関連付ける機能
単なるメソッド。とあるリフレクションのラップなだけ。
>? 付のメソッドだけ特例でそれができない
できないのはそこじゃなくて変数名に?を付けること。
でもってこっちは処理系本体の機能の話。
パーサとかに手を入れて?付き変数を許してまで@hoge?とか書きたいか?
630:デフォルトの名無しさん
08/10/16 00:58:26
そりゃ現状じゃ @hoge? が書けないようにパースしてるんだから、パーサを変えるしかないわな。
別に難しいことじゃない。
あと、attr_reader が処理系そのものが提供しているかどうかなんて関係ないじゃん。飽くまで意味論の話だし、built-inで入ってるんだから。
631:デフォルトの名無しさん
08/10/16 01:02:56
だって…再定義できるもの
632:デフォルトの名無しさん
08/10/16 01:06:57
>>627
メソッドvalueと変数@valueがあったとして、メソッドのほうは「valueは何か?」と問う意味なのに対して@valueはそのままの意味だよね?
同じようにhoge?がメッセージだと解釈されても、@hoge?までメッセージと解釈する必要はないのでは?
633:デフォルトの名無しさん
08/10/16 01:20:26
変数名だからその通りなんだけど、あくまでイメージというか馴れや先入観の問題だよ。>@hoge?がメッセージっぽい
また別の問題として、
変数名に?が付けられて、attr系もそんな名前を受け取るとすると
hoge.foo? = true とか
hoge.bar! = false とかが出て来る。後者なんて比較の否定と見間違う。
さらにいうと、?や!を許すとして、[]とか[]=とか@-は変数名に許す? 全部メソッド名としては有効なはずだよ。
attr_accessor :foo=
-> foo.foo= = 123
こんなことになる
634:デフォルトの名無しさん
08/10/16 01:44:47
hoge.foo? = true はできてもいいと思う。
hoge.foo! = ってのはまあちょっとヘンだけど、attr系で ! つけたかったことないから、あってもなくてもいいや。
[] や = が「メソッドの一部である」というのは別の側面で筋を通すための論法であって必ずしも名前の一部ではないので
(その証拠にメソッド「foo=」は、「foo.foo = 」のようにスペースを入れることができる)、
attr_accessor :foo= 等はなくてもよいかと。
635:デフォルトの名無しさん
08/10/16 01:55:24
>その証拠にメソッド「foo=」は、「foo.foo = 」のようにスペースを入れることができる
いやいや、メソッド名はあくまで「foo=」だよ。__send__(:foo=, 123)とか出来る。
パーサが頑張って「foo.foo = value」を「foo.foo=(value)」と同じような扱いにしてくれているだけで。
636:デフォルトの名無しさん
08/10/16 06:05:11
隔離スレでやれ
637:デフォルトの名無しさん
08/10/16 09:41:53
本スレが隔離スレってのも難儀な話だよなあ
638:デフォルトの名無しさん
08/10/21 07:15:54
RDEのツールバーとコンソール窓の設定などが上手く動作してくれません
ツールバーを移動して1段にまとめたりしても、RDEを最起動すると別の位置へ
勝手に移動した状態になってしまいます
コンソール窓は、フォントの設定が初期値に戻ってしまうのと、
ctrl+alt+cで開閉したりができません
コンソール窓のフォント設定だけは致命的なんで、そこだけでもなんとかできればと
639:638
08/10/21 07:27:47
一応環境も
ActiveScriptRuby 1.8.7(p72)
Windows XP SP3
です
640:デフォルトの名無しさん
08/10/21 14:20:14
ツールバーの問題は俺の環境(XP)では何年も前からあるよ。
641:デフォルトの名無しさん
08/10/21 15:51:59
てかRDE薦めてるサイトでもあるのか?
俺なら間違ってもRDEなんて使わせないんだが
642:デフォルトの名無しさん
08/10/21 15:56:44
統合環境使わせるなら EclipseかNetBeansあたりじゃね?
643:デフォルトの名無しさん
08/10/21 15:58:04
本筋以外での障壁が大きいからねえ…
「我慢して使う」時点で何か間違っとる
素直にエディタとプロンプトをAlt+Tabで切り替えて使うほうがマシ
644:638
08/10/21 17:13:53
コンソール窓のフォント設定は自分のミスでした
コンソール窓で右クリして「設定」からフォントを設定していたのですが、
直ぐ上に「フォント」というのがありました… 見逃してました
>>640
どもです
ツールバーはしょうがないみたいですね
>>641-643
どもです
winの人がrubyを始めようと思うと、RDEがまず最初に目に入るような気がします
NetBeansはDLしてあったのですが、JAVAが云々…とまたやることが増えそうなので
後回しになってました
とりあえず簡単なプログラムを書いて試したかったので、RDEをという感じで
日常はEmEditorのフリー版(かなり古い)を使っていたので、それでやればよかったのですが
コマンド操作には不慣れなwin人なんで、お手軽(そう)なRDEから初めてみようと思い
初心者~中級者?への道筋がすっぽり抜けてる感じがしていて先行き不安ですが
書いて直ぐ実行できるのはやっぱり楽しいし勉強になります
645:デフォルトの名無しさん
08/10/21 18:04:59
RDEはirbと似たような感じでSandBoxとしてしか使わないなぁ。
ファイルに保存はしなきゃならんけど、EmEditorも言語モード別のキー設定と、
外部プログラムのを実行して標準出力を下窓に出す機能が(少なくともVer6からには)
備わってるから、キー1発で実行はできるよ。
646:デフォルトの名無しさん
08/10/21 18:48:59
RDEはいろいろなところで紹介されてるから、知名度はかなり高いし
動作はけっこう軽くて多機能、日本語対応と利点は多い
が、不安定さ(特に文字コード関連)とレジストリ使用がそれらの魅力を帳消しにしている
647:デフォルトの名無しさん
08/10/21 19:42:48
RDEを普段使ってない人がファーストインプレッションあるいは又聞きで薦めてんじゃないかと思ってる
普段から使っていれば、少なくとも初心者には勧めようとは思えないはずだ
単一言語用だからといってIDE作成が簡単になるわけではない
1種類の言語にしか対応しなくても、10種類の言語に対応してても、IDEとしての作り方は同じだと思う
Rubyに特化すればIDEが俺でも作れそうとか最初に思った人は罪深いなと思ってみる
648:デフォルトの名無しさん
08/10/21 19:58:42
FreeRIDEが日本語や他の文字コードに対応してくれれば無敵なんだが
649:デフォルトの名無しさん
08/10/21 22:52:51
rubyの表記法の質問なのですが、
Test::Sample
のように書かれていたら、TestとSampleはともにクラスでTestがSampleの親クラス
という認識で合ってますか?
::という記号は定数やクラス変数なども表すとネットで見たのですが
区別は付くのでしょうか?
650:デフォルトの名無しさん
08/10/21 23:13:36
:: は 「の」 だ
Test::Sample は Test 「の」 Sample だ
それ以上の意味はないよ
クラスかどうかは普通に識別子で判断する
先頭が大文字なら定数かクラス
先頭が小文字かアンダースコアならメソッド
ただ、あからさまに面倒なのでメソッドを :: で繋ぐことはRubyでは意図的にしない
(他の言語での書き方をしないと死ぬ人が稀に使う)
651:649
08/10/22 00:09:42
>>650
ありがとうございます。
そんな曖昧なものだったんですね。メソッドは#でしたっけ?
この業界っていやに自己主張強い人が多いから統一できないのかな
652:デフォルトの名無しさん
08/10/22 07:50:20
RDEってRubyのサンプルプログラムとして付いているもんだと思ってた・・・
653:デフォルトの名無しさん
08/10/22 09:30:08
>>651
スクリプト上での表記とマニュアルでの表記は違う
…違ってちゃいけないと思うんだが、まあ、
「○○クラスのインスタンスメソッド××を…」と書く代わりに「○○#××を…」と
「○○クラスのクラスメソッド××を…」と書く代わりに「○○.××を…」と
「○○クラスの定数××を…」と書く代わりに「○○::××を…」と書けたほうが
一度理解してしまえば便利ではある
654:デフォルトの名無しさん
08/10/22 18:04:18
>>653
> スクリプト上での表記とマニュアルでの表記は違う
>
> …違ってちゃいけないと思うんだが、まあ、
とはいえ、あるクラスのインスタンスメソッドというのは、直接コード上には
現れないから、そもそも同じ表記にはしようがない。
いちいち X.new.m とか書くのもめんどくさいだろ。
655:デフォルトの名無しさん
08/10/22 20:22:05
>>650
Test::Sample だったら普通はmoduleかclassがネストされてるやつじゃね?
656:デフォルトの名無しさん
08/10/23 09:59:06
>649
::で示されるのは主に
・モジュール内クラス
・クラス内クラス
・モジュール内モジュール
・クラス内モジュール
・モジュールの持つ定数
・クラスの持つ定数
などであって、クラス間の親子関係ではない。
どちらかと言えば所有、もしくは所属の関係。
657:デフォルトの名無しさん
08/10/23 17:43:37
Windowsなら、既に更新停止状態だがJmEditorでぜんぜんいける。
コマンドライン登録しとけば、キー一発で実行できるし、プロンプト
勝手に閉じてほしくないなら、ruby.exe実行してからpauseするバッチ
ファイル登録すればいい。
658:デフォルトの名無しさん
08/10/23 18:56:51
まさかJmEditor使いが俺の他にもいたとは
動作軽いしUSBで運べるし、便利だよね
659:デフォルトの名無しさん
08/10/23 22:50:55
irb とかでいっつも忘れるんだけど、NKF.guess の返り値の数字と文字エンコード名の関係ってどっかに書いてないかな?
660:デフォルトの名無しさん
08/10/23 22:57:18
NKF.constants.map{|s|[NKF.const_get(s),s]}
こんな感じで出せばいいんじゃないか?
661:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/24 08:30:26
.chmもちあるけば解決するお
663:デフォルトの名無しさん
08/10/24 09:07:06
>>659
あれは inspect で文字列が出るべきだと思う
664:デフォルトの名無しさん
08/10/24 09:07:51
>>662
書いてねえって
665:デフォルトの名無しさん
08/10/24 10:01:53
>>664
キーワード:NKF.guess(str) (nkf)
でとんだページの下に定数が書いてあるけど・・・
666:デフォルトの名無しさん
08/10/24 11:02:43
> NKF.guess の返り値の数字と文字エンコード名の関係
667:デフォルトの名無しさん
08/10/24 23:52:29
ああ、そりゃソース嫁としかw
668:デフォルトの名無しさん
08/10/25 13:34:31
>>656
じゃあクラスの継承はどうやって表すの?
669:デフォルトの名無しさん
08/10/25 13:55:39
「表しようがない」が正解かと
「XXXを継承したYYY」のように文章で書くしかないな
670:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/26 11:07:36
>>670-671
Excel.Application ペースト でググるんだ
Win32OLEの情報を探すときはRubyに限定しないほうが良い
俺excel持ってないから動作検証できないけどごめんね
673:デフォルトの名無しさん
08/10/26 12:43:20
関係ないけど gemで入れられる excel用のライブラリ見つけたぜ
spreadsheet-0.6.1.5 Documentation
URLリンク(spreadsheet.rubyforge.org)
674:670-671
08/10/26 17:37:00
>>672-673
ありがとうございます。解決しました。
原因は貼り付ける際に列で指定していたからダメだったようで、
貼り付ける先頭セルの値をRangeで受け渡したらうまく行きました。
また上のプログラムだとちゃんと保存できないのも注意です。
開き方の問題なのか読み取り専用になっているようです。
名前を付けて保存するようにしたらちゃんと保存されました。
675:デフォルトの名無しさん
08/10/26 19:29:35
掲示板スクリプトを作ってるんだけど、動かない。
どこがおかしいのかな。
使っているサーバー @pages (www4サーバー)
一応誘導を受けて来たので誘導元
□規制解除要望□ dion.ne.jp専用 Part727
スレリンク(accuse板)
スクリプトはここからダウンロードして
URLリンク(www4.atpages.jp)
676:デフォルトの名無しさん
08/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
08/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
08/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:デフォルトの名無しさん
08/10/26 19:44:37
>>675
いきなり自作CGIをレンタルサーバーで動かすとか正気の沙汰ではないぞ
httpdのエラーログをみよう。
いやその前に、まずは、WindowsならばXAMPPでも入れてローカル環境で試そう、な
680:デフォルトの名無しさん
08/10/26 19:54:27
>>679
一応ローカルで実験はした。
方法
1.irbを起動する
2.環境変数を設定
3.systemコマンドで実行
結果
とりあえず動いた
だからアップロードしたわけだが。
681:デフォルトの名無しさん
08/10/26 19:58:41
結論:
・ 馬鹿にCGIを渡すな
682:デフォルトの名無しさん
08/10/26 20:02:38
>>681
一応Apacheをインストール中
ところで、WindowsのApacheでCGIを動かすとき#!の行はどうすればいい?
683:デフォルトの名無しさん
08/10/26 20:10:51
家の環境では、ruby.exeをapacheと同じドライブの例えばc:\usr\local\bin\ に放り込んでおけば動いた
684:デフォルトの名無しさん
08/10/26 20:12:44
パスは通しておいてね
685:デフォルトの名無しさん
08/10/26 20:12:47
>>682
パス通して#!rubyでいいんじゃね
686:デフォルトの名無しさん
08/10/26 20:13:15
> パスは通しておいてね
Ruby本体をインスコしたディレクトリにパスは通しておいてね
687:675
08/10/26 20:20:11
実験は成功した。普通に動いた。
今度は書き込みを実行したとき何も出力されないバグが出てきたが
688:デフォルトの名無しさん
08/10/26 20:34:55
cgi-exception入れとけ
URLリンク(cgi-exception.rubyforge.org)
689:デフォルトの名無しさん
08/10/26 21:02:28
>>688
ローカルでは動く。リモートでは動かない
cgi-exceptionをrequireしても(もちろんそのファイルごとアップロード済み)
まったくダメ。
690:デフォルトの名無しさん
08/10/26 21:07:27
この分だと向こうで拡張ライブラリの一部が欠損しているというオチの可能性が
高そう。標準添付のライブラリ(cgi,nkf)しか使ってないのに…
691:デフォルトの名無しさん
08/10/26 21:24:01
CGI.unescape(cgi.params['うんこ']) を CGI.unescape(cgi.params['うんこ'][0]) にするとかさ、
NKF,nkf(略) を NKF.nkf(略) にするとかさ、
変数名やGET/POSTパラメタの名前に誤りがないかよく見るとかさ。
692:デフォルトの名無しさん
08/10/26 21:26:19
環境を疑うよりは、まず自分のスクリプトを徹底的に疑うべき
CGI-Exceptionでエラーが出ないなら次はprintfデバッグだ
スクリプト中の適当な位置で、テキストファイルにログを書き出していけば
たいていエラー箇所を特定できる
(スクリプトが全く実行されない場合は、syntax errorかrubyパス絡みの可能性が高い)
693:692
08/10/26 21:37:21
あ、重要なこと書き忘れてた
初心者は(初心者じゃなくても一緒だけど)まず最小限のCGIスクリプトから書き始めろ
小さなスクリプトが動いてから、徐々に機能追加していかないと
ただでさえ特定しづらいCGIのエラーが、余計に特定しづらくなる
少なくとも、そこそこの長さがあって環境変数が関わるような掲示板スクリプトを
一気に書き上げるべきではない
694:デフォルトの名無しさん
08/10/26 21:55:34
>>691
それにはすでに気づいて直した。直したが治らない。
>>692
syntax errorがらみはありえない(-cオプションで検査済み)
パスもチェック済み(/usr/local/bin/ruby)
>>693
一応ローカルで動作確認済みなので
695:デフォルトの名無しさん
08/10/26 21:59:42
これはRubyの問題ではない(まだ)
>>694
だからその方法が間違ってると指摘されてるだろう
CGIは「ブラウザでInternalServerErrorが出なくなるまで書き直す」という手法で開発してはいけない
エラーメッセージを確認しない開発手法は糞だ
696:デフォルトの名無しさん
08/10/26 22:02:14
> 一応ローカルで動作確認済みなので
最小限のCGIスクリプトをサーバー上で動かさないとダメ
「環境変数自分で入れて、systemで実行して動いたから」というのではあまり意味がない
697:デフォルトの名無しさん
08/10/26 22:03:11
結論:
・ 馬鹿にCGIを渡すな
698:デフォルトの名無しさん
08/10/26 22:04:18
>>695
とりあえずちょいと方法が思い浮かんだので実験してみる
1.まずは単なるテストスクリプトが動くか確かめる
それすら動かないようならとりあえずこの環境での動作はあきらめたほうがよい
2.次にちょっとした工夫のなされたテストスクリプトを使って実験を行う
3.最後にその結果を見て検証する
699:デフォルトの名無しさん
08/10/26 22:04:55
RubyでWin32弄くる場合に必要な知識はRubyそのものではないのと同様に
RubyでCGIやる場合に必要な知識はRubyそのものではないのだな
ライブラリで吸収隠蔽すべきかどうかというのは悩ましいとこだと思う
700:デフォルトの名無しさん
08/10/26 22:05:14
>>696
Apacheでも動作確認済み
1時間以上前に実験した。
701:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/26 22:09:26
>>700
どう動作確認したのかkwsk
俺の環境でApache立ち上げて試してみたが、普通にアクセスしただけでエラーが出る
具体的には>>701
703:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/10/26 22:10:02
>>699
だねえ
>>700
小出しにするな
自分で話をまとめられないなら諦めれ
705:デフォルトの名無しさん
08/10/26 22:11:17
> 小出しにするな
> 自分で話をまとめられないなら諦めれ
に一票
そして離脱
706:デフォルトの名無しさん
08/10/26 22:17:59
>最小限のCGIスクリプトをサーバー上で動かさないとダメ
に対して
>Apacheでも動作確認済み
>1時間以上前に実験した。
って…明らかに話噛み合ってないな
707:デフォルトの名無しさん
08/10/26 22:19:34
>>703
自分でApache立ち上げて試すときは、そのパスじゃまず起動しないぞ
#!ruby -Ks
にして試してみ。それでも駄目ならお手上げ
708:675
08/10/26 22:21:49
>>706
まったくかみ合わない上に、どうやらこちらの問題ではなさそうだと
判明したのでたぶんこれ以上話し合っても結論が出る可能性は0(正確には)
ただ、根本的バグが見つかったのは皆さんのおかげです。
皆さん、ご協力どうもありがとうございました。
709:デフォルトの名無しさん
08/10/26 22:24:45
>>707
もちろんローカルでやるときはそのためのパスにするわけですけどね。
710:デフォルトの名無しさん
08/10/26 22:31:12
>>707
Rubyの絶対パスを指定して動いてるので、いえるのは
もはやここでは対処しようのない問題だということです。
とりあえずテストスクリプトすら動かないということは
他のところに持っていったのでこれ以上の深入りは
避けたいと思います。
711:デフォルトの名無しさん
08/10/26 22:32:04
>>703
ステータスコード書いてないから動かなくて当然
あと\n\nだとサーバが非winのとき困るんじゃないか?
712:デフォルトの名無しさん
08/10/26 22:33:31
てゆーかbbs.cgi自体も割りと…たぶん2、3個の虫食いじゃないよな、
斜め読みした感じでも
713:デフォルトの名無しさん
08/10/26 23:01:23
パーミッションの設定してませんでした><
714:707
08/10/26 23:10:02
>>711
あ、そうか
NPH環境だとステータスコード無しでは動かないのか…
715:デフォルトの名無しさん
08/10/26 23:38:16
超遅レスだけど
>>656 >>668 >>669
ここら辺の話って本当なんですか?
Rubyのライブラリのレファレンスでクラスの説明とか見るとよく::が使われてるけど
あれは本当は間違いなんですか?
716:デフォルトの名無しさん
08/10/26 23:48:43
>>656以外の使い方してるやつなんてあんのか
具体的になんてライブラリのリファレンスのどの部分よ
717:デフォルトの名無しさん
08/10/27 00:17:15
>>676
「vlookupのようなもの」ってのが、一体どんなのか分からんのだが
vpreとvpstではさんで比較してるってことは、ソート済みだと仮定してもいいの?
良いなら二分探索が使える
コードについて
・Range#eachがあるんだからeachを使う。Rubyでforは(めったに)使わない
・不要なbreakが見られる
・異常入力に対して99.9とかを返すのは、これでいいの?
718:デフォルトの名無しさん
08/10/27 01:26:18
>715
マニュアル内でのその記述はクラスの親子関係じゃなくて、大抵モジュールの定数のハズ。
719:デフォルトの名無しさん
08/10/27 01:33:20
例えば、Objectクラス、IOクラス、Fileクラス、File::Statクラスの関係は
IO と File::Stat の直接の親は Object クラス
File は IO の子クラス
File::Stat は File の子クラスではない
File::Stat は File 内のクラス
Rubyのコードで書くとこんな関係。
class Object
end
class IO < Object
end
class File < IO
class Stat
end
end
720:デフォルトの名無しさん
08/10/27 01:34:23
言うなれば :: でクラス同士を繋いでいたら、それは親子じゃなくて入れ子の関係ってところか。
721:デフォルトの名無しさん
08/10/27 01:47:29
Railsの質問はここでいいんでしょうっか?
Web画面を共有出来るアプリが作りたいので
実験で5分で動くshootingstar使ったchatのテストアプリみたいなのを
動かしたんですけど自分でブラウザを更新しないと表示画面が更新されません。
バージョンは、shooting_star (3.2.7)とrailsは2.1.2でOSはUbuntuなんですけど。。
722:デフォルトの名無しさん
08/10/27 02:10:00
WebProg板にRailsスレあるよ
【Ruby】Ruby on Rails Part6
スレリンク(php板)
723:デフォルトの名無しさん
08/10/27 05:38:49
>>676
>>677-678の気になる点。
1.vの1列目の値が小さい順で並んでいないと動かない
以後は1列目は昇順ソート済みであるものとする
2.vs == v[0][0], vs < v[1][0] なら (vs>vpre) && (vs<=vpst) は常に偽
forの最終ループでvpstがvの範囲外となりエラーを起こす
vpst = v[v.size][0] => vpst = nil[0]
3.VLOOKUPと検索の仕様が違う
VLOOKUPは完全一致検索または検索値を超えない最大値の検索
こちらは四捨五入もどきというか、小さい側優先の再近接値検索?
(ちなみに四捨五入は中間値切り上げ丸め、つまり大きい側優先)
4.VLOOKUPと違って返値の列が2列目固定
それならMATCH関数にした方がまだ使いやすくない?
724:デフォルトの名無しさん
08/10/27 05:45:45
>>677を問題点もそのままで、ちょっとRubyぽく書き直してみた
def Vlookup(vs,v)
vx = vs.to_f
return -99.9 if vx < v[0][0]
return 99.9 if vx > v[-1][0]
v.each_cons(2) do |vpre, vpst|
if vx>vpre[0] && vx<=vpst[0] # *1
return vx-vpre[0] <= vpst[0]-vx ? vpre[1] : vpst[1] # *2
end
end
nil[0] # *3
end
*1 検索対象が昇順なら"vx>vpre[0] && " 部分は不要
というか、ここを削れば問題点2は解消する
*2 3項演算子といってexcelのif関数のようなもの (cond ? retA : retB)
*3 問題点2のエラーを発生させるためのもの。
*1の対策を実施すればこの行には到達しないので削除してよし
高速化とか一切していないので悪しからず。
>>717の言うとおり、二分検索するのがいいんでない。
適当にコード見て書いただけなんで、バグとか指摘の間違いとかあるやも。
725:デフォルトの名無しさん
08/10/27 05:51:25
>>711
ほぼ参考書のままです。
とりあえずステータスコードをつけて動くか確かめてみます
726:デフォルトの名無しさん
08/10/27 05:59:36
結局Content-typeの改行コードを\r\nにしたら動きました
727:デフォルトの名無しさん
08/10/27 06:22:47
>>726
それは誤りだ
728:デフォルトの名無しさん
08/10/27 07:26:44
>>727
一応めでたく完成して新しい追加機能2つ(日付表示・連投規制)を
付け加えました。たぶんこれで実運用上、書き込みがぶつからなければ
なんとかなると思います。タグ検索機能はなんか変ですが
おいおい何とかします。
729:デフォルトの名無しさん
08/10/27 08:20:38
>>727
誤りではないだろう、HTTPの標準改行コードは\r\nだ
出力先がバイナリモードでさえあれば問題はない
730:デフォルトの名無しさん
08/10/27 21:40:37
>>716 >>718 >>719
Java出身のruby初心者だったものでクラスライブラリはクラスの継承で繋がってると思い込んでました。
なるほど、rubyはモジュールや入れ子のクラスを多用するんですね。
勉強になりました。ありがとうございました。
731:デフォルトの名無しさん
08/10/27 22:15:18
Javaだってよく使うだろう。
732:デフォルトの名無しさん
08/10/27 22:25:44
RubyやPerlって一体なにに使う言語なんですか?
Htmlに組み込む言語という解釈でいいんですか?
733:デフォルトの名無しさん
08/10/27 22:41:28
>>732
だいたい何にでも使う
734:デフォルトの名無しさん
08/10/27 23:02:23
テキスト処理をするのに使う
テキスト処理と聞いて何も思いつかない場合はまだスクリプト言語に用がないということなので
PerlやRubyのことはすっぱり忘れて別なことを楽しみましょう
735:デフォルトの名無しさん
08/10/28 00:49:43
rubyはrailsのために使います。
フリーだと現時点で一番効率よく稼げるのrailsです。
3人月の案件で700は固いから月給200万ですよ。
736:デフォルトの名無しさん
08/10/28 17:05:00
日本語でおk
737:デフォルトの名無しさん
08/10/28 19:13:55
>>732
>Htmlに組み込む言語
それはPHP
738:デフォルトの名無しさん
08/10/28 20:26:14
>>737
HTMLがPHPになるんですか?
PHPがHTMLになるんですか?
組み込むってそういうことですよね?
739:デフォルトの名無しさん
08/10/28 20:54:46
画面分割はどうやればいいんですか?
自動的に隠したり、分割を×ボタンで消したりする機能のパックになったコントロールとかあるんですか?
740:デフォルトの名無しさん
08/10/28 20:57:37
>>739
Webクライアントの仕組みについて理解してから来なさい。
741:デフォルトの名無しさん
08/10/28 20:58:32
>>739
えーと…
Rubyの仕事ではないので、GUIに何を使ってるか調べて、それに関するスレなりサイトなりに行くといい
742:デフォルトの名無しさん
08/10/28 21:18:58
①蠣←これを右クリでコピーする
②スタート→すべてのプログラム→アクセサリ→メモ帳を起動
③編集→貼り付け
④編集→すべて選択
⑤変換キーを押す
743:676
08/10/28 23:44:49
>>717
説明不足でした。私がやりたいのは、以下のものです。
・1列目にソート済みの数値が入っている
・2列目には1列目の各行に対応する数値が入っている
・ある数値(入力値)が来た時に1列目の中から最も近い値を探し、それに対応する2列目の値を返す
・もし入力値が1列目の数値の上下限から外れていたら、それぞれ99.9か-99.9を返す
です。
>・Range#eachがあるんだからeachを使う。Rubyでforは(めったに)使わない
始めたばかりなもので。。。今後はeachを使います。(ちなみに速度に差はありますか?)
>・不要なbreakが見られる
入力値が上下限から外れていたら、関数の中のif文より後のfor文にいれたくなかったので使いました。これを見てからelseに書き換えました。
(一般的にbreakは多用しない方がよいのですか?)
>・異常入力に対して99.9とかを返すのは、これでいいの?
異常を示す文字列にしようかとしましたが、今、私がやりたいことにおいて99.9で十分なのでこうしました。
744:676
08/10/28 23:45:30
>>723
>1.
書き忘れていましたが、ご指摘のとおりソート済みを仮定しています。
>2.
ちょうどそのエラーに出くわしていたところでした。。。
>3.
事前に一応調べてはみたのですが、ちゃんと理解できていなかったです。
また数学がよくわかっていないため、2の事態が発生しました。
>4.
MATCH関数を知らなかったので調べてみましたが、どのように適用すればよいかわかりませんでした。もう少し詳しく教えていただけないでしょうか。
>>724
知らない事がありすぎるのですが、みやすくなったので使ってみたいと思います。
速くなるのも教えていただけると助かります。。。
745:デフォルトの名無しさん
08/10/29 05:33:04
forは内部的にeachを呼び出すそうだから、速度差など無いに等しい。
どうしても気になるなら一億回くらい空ループ回して計ってみるといい。
まぁ、仮に10倍の速度差があったとしても、今は気にする必要ない。
プログラムの高速化はまず何よりもアルゴリズムが最優先。
小手先の最適化に手をつけるのはその後だね。
breakは単に使い方が悪い。
>>677の最初の2つは先にreturnするので、絶対に到達しない。
最後のはbreak後returnしかしていないので、returnで置き換え可能。
breakせずに抜けるパターンの場合、必ず範囲外アクセスで落ちる。
つまりすべての箇所で何の役にも立っていないというわけ。
異常入力にマジックナンバーを返すのもありだけど、発生頻度が低く
検査箇所が多いようなら例外(Exception)を発生させたほうがいいよ。
コードの見通しがまるで違ってくるから。
VLOOKUPは検査値に対応する行と指定した列が交差するセルの値を
返すのに対し、MATCHは検査値に対応する値の位置を返す。
VLOOKUPでは検索範囲が左端の列で、かつ対応する値の列の高さと
縦位置が完全に一致しなければいけない。
MATCHとINDEXまたはOFFSETとの組み合わせなら、検査列に対応
する値の列が左にあってもよいし、縦にずれていてもよいし、列でなく
行(対応する値が横に並ぶ)でもよい。
その気になれば対応する値をnマスおきに飛び飛びにだってできる。
それに比べると列指定不可のVLOOKUPなんてあまりに不便すぎる。
746:デフォルトの名無しさん
08/10/29 05:37:23
MATCH関数もどき。 返値は0を起点とする点が異なる。
直近値検索方法は>>677と同じ。
def match_liner(val, array) # >>677と同等
array[0...-1].each_index do |i|
if val <= array[i+1]
return val-array[i] <= array[i+1]-val ? i : i+1
end
end
array.size - 1
end
def match_recursive(val, array)
case array.size
when 0
nil
when 1
0
when 2
val-array[0] <= array[1]-val ? 0 : 1
else # ↑↓ 不等号に注意のこと
i = array.size / 2
val < array[i] ?
match_recursive(val,array[0..i]) : match_recursive(val,array[i..-1]) + i
end
end
747:デフォルトの名無しさん
08/10/29 05:40:31
ベンチマーク
srand 1.0 * 2008/10/29 * 3*14 * 0xdeadbeaf # 乱数の種を設定
lookup = Array.new(100000){ rand }.sort!
data = Array.new(2000) { rand }
Benchmark.bm do |x|
x.report { data.each do |v| match_liner v, lookup end }
x.report { data.each do |v| match_recursive v, lookup end }
x.report { data.each do |v| match_loop v, lookup end }
end
user system total real
221.528000 0.040000 221.568000 (237.392000) # 線形検索
0.501000 0.000000 0.501000 ( 0.550000) # 二分検索(再帰)
0.140000 0.000000 0.140000 ( 0.141000) # 二分検索(ループ)
748:デフォルトの名無しさん
08/10/29 05:57:19
>>746の二分検索は再帰で実装してあるけど、ループに展開すると
もうちょっと高速化できる。(ベンチ中のmatch_loopがそれ)
どうやって展開するのかは自分で考えてみてほしい。
うまく書ければ20行かそこらで済むはず。
ついでにおまけ。 (>>747続き、 match_なんたらはmatchと定義しておく)
def vlookup(val, range, column) # 指定列は0を起点とする
val = val.to_f
if val < range.first[0] or val > range.last[0]
raise ArgumentError, "value out of range"
end
row = match val, range.map(&:first)
# range[row][column] と同じだが、範囲外では例外を起こす。
range[row].fetch column
end
pairs = lookup.zip(Array.new(lookup.size) { rand 100000 })
data.take(10).each do |v|
puts vlookup(v, pairs, 1)
end
749:デフォルトの名無しさん
08/10/29 07:00:09
全角空白厨は何を言っても説得力がない
750:デフォルトの名無しさん
08/10/29 09:42:12
そこが気になるというのは、もしやコードをテストしてみようとしたわけか?
朝早くから実に殊勝な心がけだ。 大変すばらしい。
それだけ向上心があるなら、更なる技術向上のための課題として、全角半角の
変換フィルタでもチャレンジしていただきたい。 (もちろんワンライナーな)
751:デフォルトの名無しさん
08/10/29 10:08:41
>>750
コードは全く読んでない
全角空白かどうかだけをブラウザ上でチェックした
それで充分
752:デフォルトの名無しさん
08/10/29 10:21:12
>>749,751
俺もコード張るときはwebブラウザとかJaneのこと考えて
全角に変換してから張るんだけど何かまずいの?
753:デフォルトの名無しさん
08/10/29 10:21:57
書き込む際に見やすいように、という理由でいわゆる全角スペースを使うのは
割とよくあることだと思うんだが、それをどういう切り口で転がすと「厨」になるんだろ。
それこそ「説得力が無い」よ。
754:デフォルトの名無しさん
08/10/29 10:26:48
全角空白なんて危険なもの使わなくたって があるだろう
初心者がコピペで実行する初心者スレで全角空白みたいなのをコードに混ぜるのはあまりいい気はしない
arr.each do |e|
puts e
end
755:752
08/10/29 10:31:22
>>754
ああなるほどな、サンクス
756:デフォルトの名無しさん
08/10/29 10:34:41
>>754
本人?
よりよい方法がある、という話ならわかるけど、そんなことで厨呼ばわりした上で、
コードなんか見なくても十分とか言ってのけたわけ?
「あまりいい気はしない」とか、なんか急にトーン下がってるけど。
757:デフォルトの名無しさん
08/10/29 10:40:23
>>756
いや全然
検証のために irb にコピペして全角空白でエラーになってピキッとなったことはないか?
せっかく書き込み前に置換する手間を割いてるのに置換先が全角空白だというのはバカっぽいだろ
なんでわざわざ実行不可能なコードにさせるんだよ
758:デフォルトの名無しさん
08/10/29 10:46:17
他人が実行するかもしれないことに気が回らない俺スゴイ系の人は
2chでは厨呼ばわりされても仕方ないかな、という気はちょっとだけする
759:デフォルトの名無しさん
08/10/29 11:01:39
だが、ム板では普通に見かけるけどな。
インデントを全角空白で、ってのは。
760:デフォルトの名無しさん
08/10/29 11:24:51
ソース見れば普通に半角空白残ってるんだお
761:デフォルトの名無しさん
08/10/29 11:35:27
置換の手間は割けなくても長文粘着はありなんだよねこういう人ってw
762:デフォルトの名無しさん
08/10/29 11:47:31
CSV::Writer.generateを使ってCSV出力をしているようなんですが
出力されたCSVを見ると
AAA,BBB,CCC,DDD
と出力されており1データに改行が含まれている場合に正常に解析できなくなってます。
AAA,BBB,CCC,DD
D
本来ですと
"AAA","BBB","CCC","DD
D"
のようにデータが""で囲われてほしいのですが何か方法は無いでしょうか?
ソースは↓な感じですです。
def issues_to_csv(issues, project = nil)
ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')
export = StringIO.new
CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
# csv header fields
headers = [ "#",
l(:my_data1),
l(:my_data2),
l(:my_data3),
]
csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
end
export.rewind
export
end
763:デフォルトの名無しさん
08/10/29 11:55:24
投稿者1人が半角スペースなコードをエディタに書く
↓
書き込み時に全角スペースに置換する
↓
参照者複数人が各々のコピペ時に全角スペースを置換する
↓
エディタに半角スペースなコードができる
まあ、プロトコル的に無駄ではあるな
投稿者が半角スペースを に置換してくれさえすれば参照者はコピペだけでおkなのに
2chブラウザによっては半角スペースを投稿時に に変換してくれるものもあるけどな
navi2ch使いあたりはこのへん全く意識しないはず
というか、全角スペース混じってると範囲実行のM-|ができなくてイラつく(w
いちいち
1 [1,2,3].each do |e|
2 puts e
3 end
と行番号つきで書かれるくらいムカつく
764:デフォルトの名無しさん
08/10/29 12:05:00
Jane Doe Styleで >>754 をコピーすると
半角スペースの箇所はクリップボードには &#160 (&#は半角)で保存されるぞ
アプリケーション( 2ch 含む)によって文字参照の扱いなんてまちまちなんだから
文字参照に変換してから貼れって主張にはあまり魅力を感じないんだよな
765:デフォルトの名無しさん
08/10/29 12:09:49
コピペ内容に関して意識してる2chブラウザはそう多くないよね
どうレンダリングするかとかはRFCに記述ないんだっけ?
766:デフォルトの名無しさん
08/10/29 13:14:44
なにやらえらい騒ぎになってしまったな。
全角半角が問題になるのはコピペする人間だけなのだが、実際それをする人間がどれ
ほどいるのか。
他の板ならともかく、いかに初心者スレとはいえここはム板なんだから、一括置換な
んぞ5秒でこなす
くらいの能力は期待できないものなのか。
学校のセンセじゃあるまいし、その程度は勘弁していただきたい。
まぁ、全角を使っているのは書き込みログが読みにくくなるから、というしょーもな
い理由なので、
こちらも置換すれば済む話ではあるし、専ブラで対処できるものなら導入を検討する
よ。
と、ここで新着見たら、そんな簡単な話しでもないのか。
確かに>>764は以前くらったことがあるな。
どうしたもんかね。
767:デフォルトの名無しさん
08/10/29 13:17:44
ノンブレイカブルスペースは \x20 とは別物。常識
768:デフォルトの名無しさん
08/10/29 16:32:30
おれも つかってたけど、>>764と同じことがあって、
結局全角スペースのほうが害がすくないと判断してる。
>>767
そうなんだよね。しかも が半角スペースにならない環境だと、
置換が全角スペースより面倒なんだよな。
まあ2chの仕様がクソということで。
769:デフォルトの名無しさん
08/10/29 16:33:42
>>762
CSVやめて、FasterCSVを使ってみたらどうでしょうか。
「ruby fastercsv」でぐぐってみてください。
770:デフォルトの名無しさん
08/10/29 17:08:50
>>769
実は先ほどソースはredmineのものなんです
ファイル名app\helpers\issues_helper.rb
なので簡単にFasterCSVに置き換えて大丈夫なものなのか判断しにくいんです。
変更は簡単ですかね?
771:デフォルトの名無しさん
08/10/29 22:43:51
>>762
CSV::Writer ならエスケープが必要なフィールドだけエスケープされるので、
以下のようになるはずだけど。
AAA,BBB,CCC,"DD
D"
DD\nDだけじゃなくてAAAとかもクォートして欲しいってこと?
772:デフォルトの名無しさん
08/10/30 13:30:47
>749-768
先頭の空白に関しては、まだRubyは良いほうでしょ
Pythonなんて先頭の空白が纏められたら話にならんかと
773:デフォルトの名無しさん
08/10/30 16:17:11
while文の中にif文入れられる?
774:デフォルトの名無しさん
08/10/30 16:22:19
a = [1, 2, 3]
while if n = a.shift
n
else
false
end
p n
end
# => 1
# => 2
# => 3
775:デフォルトの名無しさん
08/10/30 18:36:04
msg = "(1+2+3)*2/3" などのように数式の入った変数を
プログラムの構文として処理することは可能でしょうか?
val = 構文評価(msg)
のようなイメージで、
任意の数式をRubyで処理することを期待してるのですが
776:デフォルトの名無しさん
08/10/30 18:53:18
>>775
手っ取り早いのはeval。
でも数式に限らずなんでも実行できてしまうから
四則演算だけ処理したいならraccとそのサンプルのcalc.yあたりとか。
777:775
08/10/30 19:31:22
>>776
ありがとうございます。助かりました。
778:デフォルトの名無しさん
08/10/30 22:51:35
>>776
> 四則演算だけ処理したいならraccとそのサンプルのcalc.yあたりとか。
正規表現で入力を検査してokならevalに渡す方が楽でない?
779:デフォルトの名無しさん
08/10/30 22:58:30
そのへんは入力元がどのくらい信用できてどのくらい調教可能かによるな
780:デフォルトの名無しさん
08/10/30 23:07:18
信用できないから検査する。
何によるかというならどれくらい受理する式の文法を限定できるかだろう。
君、バカでしょ。
781:デフォルトの名無しさん
08/10/30 23:18:40
検査が必要かどうかという話だろ
自分で電卓代わりに使いたいだけなら入力検査は不要
こんなの完璧にやるか全くやらないかの2択なんだから信用度は重要
2//3 で エラー吐いて落ちるのは困るだろうし
1 2 + 3 で エラー吐いて落ちるのは困るだろうし
1/3*3 で 0 が返るのも困るだろうし
(1..2) で Range オブジェクトが返るのも困るだろう
782:デフォルトの名無しさん
08/10/31 00:02:44
>>781
君はバカさ加減の露出癖でもあるのかね。
> こんなの完璧にやるか全くやらないかの2択なんだから信用度は重要
不測の動作をさせないことが保証できればいいんだよ。
エラーはevalのすぐ外で捕捉すりゃいい話。
> (1..2) で Range オブジェクトが返るのも困るだろう
そうならないように検査するんだろうが。
783:デフォルトの名無しさん
08/10/31 00:03:55
じゃあraccでやれよ
784:デフォルトの名無しさん
08/10/31 00:06:22
は?
785:676
08/10/31 00:28:23
>>745
returnしたら、その後に行かないという基本的な事を知りませんでした。。。
説明していただいた内容が理解できていない部分があるので質問させて下さい。
「MATCHとINDEXまたはOFFSETとの組み合わせなら」とおっしゃっているのは、
それぞれ以下のもののことでしょうか?
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-lang.org)
それとも以下のようなexcelの関数のことでしょうか?
URLリンク(support.microsoft.com)
これすらも解からない状況です。申し訳ありませんがよろしくお願いいたします。
>>746-748
ループ版の早さは今の私には驚異的です!
1個のデータを処理するのにexcelで処理していたときは約5分
自分で作ったvlookupで約2分だったので、1秒かからなくなるんですね。
ただ、勉強不足でわからないことだらけです。
ループ版を自分で作るには時間がかかるので少し待って下さい。
完成したら添削をお願いします。
786:デフォルトの名無しさん
08/10/31 02:28:31
スレリンク(operate板:657番)
駄目元で書き込んだ。
賛同してくれる人はこのレスに同意のアンカーをつけてくれ。
787:デフォルトの名無しさん
08/10/31 04:54:23
>>785
コードの端々で妙な書き方してるから、他言語でヘンな癖でもつけて
きたのかと思ってたら、もしかしてプログラミング初心者だった?
Excel VBA使いを想定してたんだが、Excelもサッパリのようだし…
INDEXやOFFSET等、全部大文字で書いたのはExcelの関数。
これらについてはスレ違いなので他でよろしく。
まぁ、とりあえずは基本的な文法・制御構造をまず覚えてくれ。
最低限、分岐・ループ・メソッド呼び出しとそこからの脱出あたり。
勧めといてなんだけど例外は後回しでいいかな。
一度苦労した後の方が有り難みもよく分かるだろうし。
次に組み込みクラスについて調べてみる。
上で使ってるのは、数値(Numeric), 文字列(String), 範囲(Range)
あたりを見れば分かる程度の簡単な使い方してる。
重要なのは配列(Array)とEnumerableの2つ。
制御構造と並んで、こいつらがアルゴリズムを実装する要だ。
(今回は使わなかったが、Hashもいずれ知っておくべき)
クラスライブラリを全部覚えるのは大変だろうけど、どんなことが
できるかくらいはざっと目を通しておくといい。
そうしたらコードを読んでみる。
どれもかなり短いから、読み下すのはそう難しくないとおもう。
行数短縮のために三項演算子を濫用している点は申し訳ない。
788:デフォルトの名無しさん
08/10/31 04:58:30
コードを読んだだけでは内容を理解するのは難しいだろうから、
短い配列でどのような動きになるか、紙に書いてみるといい。
再帰をループに変更するにはアルゴリズムを十分に理解して
いなければならないが、是非がんばって挑戦してほしい。
ケチな高速化など後回しと書いた理由も実感して貰えたと思うが、
もし興味を持ったなら、アルゴリズムも勉強してみてはどうか。
ほんのちょっとの仕組みの違いで速度が千倍とかざらにあるよ。
計算量の考え方だけでも知っておくことをお勧めする。
789:デフォルトの名無しさん
08/10/31 07:54:59
VB系はreturnに直接相当する命令がないからな。
戻り値と、プロシージャを抜ける構文が別になってるから。
で、そのまま直訳してreturnとbreakに分けた、と。そんな感じだろう。
790:デフォルトの名無しさん
08/10/31 10:38:32
ひとこといわせてくれ。
>>787-788、おつ。こんごもがんがれ。
791:デフォルトの名無しさん
08/10/31 17:14:09
あるクラスAが別のクラスBのサブクラスかどうかを判定するメソッドってありませんでしたっけ?
今は
A.ancestors.include?(B)
とやってるんですけど、かっこわるいですよね。
792:デフォルトの名無しさん
08/10/31 17:21:41
どうして?それでよいのでは?
793:デフォルトの名無しさん
08/10/31 17:45:25
class B;end
class A < B; end
class C; end
p A < B
p A > B
p A < C
794:デフォルトの名無しさん
08/10/31 17:51:24
>>793
>> File < IO
=> true
>> Dir < IO
=> nil
なにこれーーー
>> Fixnum < Integer
=> true
>> Array < Enumerable
=> true
module もOKだ
ちょうさんくすです
795:デフォルトの名無しさん
08/10/31 18:44:55
まさかModule/Class同士の比較ができるとは・・・知らなかった
796:デフォルトの名無しさん
08/10/31 21:10:08
>>795
伊達に継承の記号が "<" なわけじゃない。
……かどうかは知らないが。
797:デフォルトの名無しさん
08/11/01 06:26:05
VIPから来ますた
798:デフォルトの名無しさん
08/11/01 06:26:45
VIPから来ますた
799:デフォルトの名無しさん
08/11/01 06:28:45
∧_∧
( ´・ω・) みなさん、VIPからさし入れのお茶が入りましたよ・・・・。
( つ旦O
と_)_) 旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦
800:デフォルトの名無しさん
08/11/01 06:44:02
VIPから来ますた
801:728
08/11/01 08:48:50
検索機能がついに完成しました。
一応私の夢見た掲示板をついに作り終えました。
とはいえまだ課題がいくつか残ってます。
それを今後つぶしていきます。
802:デフォルトの名無しさん
08/11/01 11:00:45
以下のスクリプトで,30行目で,
usr/lib/ruby/1.8/net/http.rb:451:in `initialize': wrong number of arguments (2 for 1) (ArgumentError)
のエラーが出てしまいます。
比較のためにAとBを作ったのですが、29行目ではエラーが出ません。
Net::HTTPを承継したクラスを作って,コンストラクタの部分を
オーバーライドしようとしています。
エラーの原因は何でしょうか
1 #!/usr/bin/ruby
4 require 'net/http'
5 require 'uri'
7 class A
8 def initialize(arg)
9 puts "A initialized", arg
10 end
11 end
13 class B < A
14 def initialize
15 puts "B initialized"
16 end
17 end
19 class C < Net::HTTP
20 Net::HTTP.version_1_2
21 def initialize(url)
22 uri = URI.parse(url)
23 puts "C initialized"
24 super(uri.host, uri.port)
25 end
26 end
28 url = 'URLリンク(www.yahoo.co.jp)'
29 p b = B.new
30 p c = C.new(url)
803:デフォルトの名無しさん
08/11/01 12:21:28
URIはHTTP専用ってわけじゃないので、ちゃんとプロトコルから書く。
あとNet::HTTPはわりと残念な設計で、サブクラスでinitializeをオーバーライドしても呼ばれない。
委譲したほうがいいかも
804:デフォルトの名無しさん
08/11/01 19:52:20
>>802
これで我慢すれ
class C < Net::HTTP
def initialize(*args)
args[0].kind_of?(URI) ? super(args[0].host,args[0].port) : super
end
end
805:デフォルトの名無しさん
08/11/02 08:33:41
そこでhttpclientですね
806:デフォルトの名無しさん
08/11/02 12:26:17
802 じゃないけど、なんであのエラーが出るのか理屈がわからない…。>>802 の initialize にダミー引数を渡すと呼ばれるよね。
require 'net/http'
require 'uri'
class C < Net::HTTP
Net::HTTP.version_1_2
def initialize(url, dummy=nil)
uri = URI.parse(url)
puts "C initialized"
super(uri.host, uri.port)
end
end
url = 'URLリンク(www.yahoo.co.jp)'
p c = C.new(url)
Net::HTTP を眺めて同じ挙動を再現しようと思ったけど、できないYO!
class A;end
class << A; alias newobj new; end
class A
def A.new(foo, bar=nil)
a = A.P(foo, bar).newobj(foo, bar)
end
def initialize(foo, bar=nil)
puts "A init."; @foo = foo; @bar = bar
end
def A.P(foo, bar=nil);self;end
end
class B < A
def initialize(foo)#, bar=nil)
puts "B init."; super(1, 2)
end
end
p b = B.new(3)
807:デフォルトの名無しさん
08/11/02 17:50:27
>>806
× a = A.P(foo, bar).newobj(foo, bar) # in A.new
○ a = self.P(foo, bar).newobj(foo, bar)
808:806
08/11/03 00:21:05
おおお!!thx>>807
なんで、A付けちゃったんだろ?
これを色々いじって、マニュアル見ながらよく考えてみる。
も一回ありがとう!>>807
809:デフォルトの名無しさん
08/11/03 17:14:38
ディレクトリの中にあるすべてのファイル名を変えるプログラムを作ろうとしたのですが
5分で挫折しました(笑)
File.open("D:\\Data") {|f|
puts f.to_str()
}
とりあえずこうやってファイル名を出力しようとしたのですが、
コマンドプロンプトではすべてUNICODEのファイル名で表示されてしまい
わけわかめです。
$SCODE = SJISとかやってもダメでした
810:デフォルトの名無しさん
08/11/03 17:28:30
それファイル名じゃなくdataというファイルの中身を読んでいるように思えるが
`dir d:\\data /b`.each { |f| f.chop!
puts f
}
811:デフォルトの名無しさん
08/11/03 17:39:07
その場合メソッドパラメタの名前は line とかのほうがいいぞ
812:デフォルトの名無しさん
08/11/03 17:42:01
メソッドパラメタ → ブロックパラメタ
813:デフォルトの名無しさん
08/11/03 17:58:21
>>809
そういうときは、致命的な動作になるまでは Dirl.glob を使う
ディレクトリ区切り文字は \ ではなく / なので注意
irb> Dir.glob('c:/*')
["c:/AUTOEXEC.BAT", "c:/boot.ini", "c:/bootfont.bin", "c:/CONFIG.SYS", "c:/Documents and Settings",
"c:/Program Files", "c:/RECYCLER", "c:/ruby", "c:/System Volume Information", "c:/WINNT"]
irb> Dir.glob('c:/*/')
["c:/Documents and Settings/", "c:/Program Files/", "c:/RECYCLER/", "c:/ruby/",
"c:/System Volume Information/", "c:/WINNT/"]
irb> Dir.glob('*.txt')
["001.txt", "002.txt", "003.txt"]
irb> Dir.glob('*.txt').each{|e| FileUtils.mv(e, "#{File.basename(e,'.*')}.bak") }
irb> Dir.glob('*')
["001.bak", "002.bak", "003.bak"]
814:デフォルトの名無しさん
08/11/03 18:15:13
>>813
今のrubyは\も扱ってくれるよ
と思ってたが、Dir.globは\区切りに対応してないのね……
815:デフォルトの名無しさん
08/11/03 20:31:28
下のディレクトリの中も再帰的にやるんじゃなかったら
Dir.entries(ディレクトリのパス).reject{|d| File.directory? }
とか。
816:デフォルトの名無しさん
08/11/04 00:14:51
rubyでファイルの種類の判断ってできますか?
拡張子で判断するのではなくファイルの中身で、Excelファイルかどうかの判断が
したいんです。
よろしくおねがいします。
817:デフォルトの名無しさん
08/11/04 01:34:00
できますよ
818:デフォルトの名無しさん
08/11/04 03:33:29
>>816
がんばってマジックナンバー嫁
819:デフォルトの名無しさん
08/11/04 08:17:09
>>816
unix系ならFileMagicだけどwindowsはよう知らん
820:デフォルトの名無しさん
08/11/04 19:22:11
>>815
Windowsですが
再帰でディレクトリリストが欲しい時もcmdのdirですましちゃう
サブディレクトリ一覧
dir /s /ad /b \ほげほげ\ | ruby -ne "puts $_”
ほげほげ下のサブディレクトリ内の.rbファイル一覧
dir /s /a-d /b \ほげほげ\*.rb | ruby -ne "puts $_"
とか
rubyだけでやるならglobで/**/使って
Dir.glob('/ほげほげ/**/*/'){|e| puts e}
とか
Dir.glob('/ほげほげ/**/*.rb'){|e| puts e}
と、いろいろ試してたら列挙される数が違ったんで、あれっ?と思ったら
globの方は標準ではドットファイルが除外されるのを忘れてた
使用してるのがWindowsオンリーなので、普段ドットファイルなんて意識しないし
Dir.glob('/ほげほげ/**/*.rb',File::FNM_DOTMATCH){|e| puts e}
821:デフォルトの名無しさん
08/11/05 21:56:06
>>816
エクセル持って無いけど
たぶんファイルの先頭見たら判るんじゃね?とググって見ると
エクセルもワードも BIFFってフォーマット(OLE?)でどっちもファイルの先頭は同じだったorz
さらにぶらぶらと調べてたら、parseexcelっていうライブラリを見つけたので
適当にインターネットからxlsファイルを落としてきて
require 'parseexcel'
workbook = Spreadsheet::ParseExcel.parse('エクセルのサンプルファイル.xls')
で読み込めたけど、えらく遅かったので parseexcel がパース直前にやってることを直に書いてみた
require 'parseexcel'
begin
ole= OLE::Storage.new('エクセルのサンプルファイル.xls')
biff = ole.search_pps([OLE.asc2ucs('Book'),OLE.asc2ucs('Workbook')],true)
if biff.first
puts "エクセルファイル"
else
raise 'NotExcelfile'
end
rescue
puts "エクセルファイルじゃない"
end
エクセルファイルを漏れなく判定できるのかはわかりませんが…
822:デフォルトの名無しさん
08/11/06 11:05:21
require 'foobar'
としたあとで、'foobar.rb' の絶対パスを調べる方法ってありますか。
823:デフォルトの名無しさん
08/11/06 15:13:55
File.expand_path($LOAD_PATH.map{|d| File.join(d, 'foobar.rb') }.find{|path| File.exist?(path) })
824:デフォルトの名無しさん
08/11/06 15:19:42
>>823
それは読み込んだファイルであることを保証しない
825:デフォルトの名無しさん
08/11/06 15:27:19
読み込んだファイルそのものを指定することは1.8ではできないと思った
同名のファイルをファイルパスから探すことはできるけれど
>>823で問題になる場合というのはなくはないとは思うが非常にレアなような気もする
826:デフォルトの名無しさん
08/11/06 15:32:16
foobar.rb で File.expand_path(__FILE__) を返すようなメソッドなりなんなりを用意しておくほうが確実なのかな
>>823の要件に合うとは思えないけど
827:デフォルトの名無しさん
08/11/06 15:35:43
>>826
require を拡張したほうが妥当と思う
が、どうすればいいのやら
gem の require はどうやってるんだっけ
828:デフォルトの名無しさん
08/11/06 15:43:39
foobar.rb で File.expand_path(__FILE__) を返すようなメソッドなりなんなりを
requireしたあとからくっつければ医院で内科医?
829:デフォルトの名無しさん
08/11/06 16:20:11
>>828はのび太
830:デフォルトの名無しさん
08/11/06 17:55:23
>>823-828
どうもありがとうございます。
ないということなので、以下の方法で済ませることにしました。
lib = "foobar.rb"
dir = $:.find{|path| File.exist?(File.join(path, lib)) }
filepath = dir ? File.join(dir, lib) : nil
ありがとうございました。
831:デフォルトの名無しさん
08/11/06 21:45:52
拡張子省いてrequireしたとき、.soだったのか.rbだったのかまで知りたくなったら、$LOADED_FEATURESとも突き合わせて比較する必要も出てくる。
832:デフォルトの名無しさん
08/11/07 00:21:42
突然ごめん。
p array
した時の["hoge", "fuga", "boo"]みたいな書式って
変更できたりしない?
あと一歩でcsvなので便利に使えそうなんだが。
pのことをググって調べるのは非常にホネが折れる…
833:デフォルトの名無しさん
08/11/07 00:28:03
inspect
834:デフォルトの名無しさん
08/11/07 01:07:55
>>832
URLリンク(www.ruby-lang.org)
なんでもぐぐって調べようとするから骨が折れてるんだろうw
835:デフォルトの名無しさん
08/11/07 02:12:54
>>832
joinの方が楽
836:デフォルトの名無しさん
08/11/07 03:23:57
>>832
>>835
その名も「csv」というライブラリが標準で付いてることを忘れないでやってくれ。
837:デフォルトの名無しさん
08/11/07 09:49:56
>>832
一文字目と最後の文字消せばいいだけじゃね?
838:デフォルトの名無しさん
08/11/07 12:18:53
なんでもかんでもググるって馬鹿がすることだよね。
賢い人なら知りたいことが見付かりそうな文書はどこにあるのかをまずは考える。
839:デフォルトの名無しさん
08/11/07 20:15:46
ロックシステムについて相談があるんですが
i=0
begin
File.open('lockfile',File::WRONLY|File::CREAT|File::EXCL,0666) do |lfile|
File.open('hoge','r') do |file|
# hogeを使ったいろいろな処理
end
end
File.unlink('lockfile')
rescue SystemCallError
if(i>10) then raise
i+=1
if(File.stat('lockfile').mtime<Time.new+10) then
File.unlink('lockfile') #残骸のロックファイル削除
else
sleep(0.1)
end
retry
end
どうもi386-mswin32だとEXCLオープンしても例外を投げなくてうまくいかない
ようです。他のプラットフォームだとどうなんでしょう?
840:デフォルトの名無しさん
08/11/07 21:16:58
File#flock() を使う方法しかしらない。
File.open("foobar.txt", "wb") do |f|
f.flock(File::LOCK_EX) # 排他ロック
f.unlock();
end
841:デフォルトの名無しさん
08/11/07 21:22:21
なんか既視感がある
組み込みで妥当に動作してるロック機構を再発明しようとするな、というのがアドバイスだったはず
842:デフォルトの名無しさん
08/11/07 21:24:54
>>840
まずそのサーバーでflockが使えないから無理
>>841
組み込みで現に存在してるのが使えないから問題。
確認したいこと
1.とりあえず方法があっているか。
2.Windowsだとまともに動かないようだが他のプラットフォームだとどうか。
843:デフォルトの名無しさん
08/11/07 21:35:38
>>839
1.8.6-FreeBSDだけど File::CREAT|File::EXCL で Errno::EEXIST が出る
ただし>>839のソースをそのまま実行すると例外が rescue でとらえられて
例外処理でロックファイル削除されてからリトライするから、例外が発生してないように見える
あとrescueの下の二行間違ってるよ
844:デフォルトの名無しさん
08/11/07 21:40:52
>>839
$ ./ruby.exe -v -e 'open("hoge", File::WRONLY|File::CREAT|File::EXCL,0666)'
ruby 1.8.7 (2008-11-04 revision 20103) [i386-mswin32]
-e:1:in `initialize': File exists - hoge (Errno::EEXIST)
投げるが。
> if(File.stat('lockfile').mtime<Time.new+10) then
未来の時刻と比較してるようだがこれはいいのか?
845:デフォルトの名無しさん
08/11/07 21:43:49
>>843
確かにおかしいところがあるかもしれないです。
rescue
if(i>10) then
raise
end
i=i+1
if(File.stat('lockfile').mtime<Time.new+10) then
File.unlink('lockfile') #残骸のロックファイル削除
else
sleep(0.1)
end
retry
end
一応rescue節の書き換えはしてみました。これで大丈夫でしょうか。
あと、例外処理でロックファイルが削除されるのはたぶん正しいです。
というのもそのファイルの最終更新時間が10秒以上前なら削除するように
できてますから。
846:デフォルトの名無しさん
08/11/07 21:45:56
>>844
あ、やばい。そこがおかしい。
どう考えてもおかしい。
if(File.stat('lockfile').mtime+10<Time.new) then
こう直すべきだ
847:デフォルトの名無しさん
08/11/07 21:55:09
>>844
どこでおかしかったか分からないが治った。thx
848:デフォルトの名無しさん
08/11/07 21:57:23
>>842
> 組み込みで現に存在してるのが使えないから問題
849:デフォルトの名無しさん
08/11/07 22:10:05
>>842
> 1.とりあえず方法があっているか。
あってない。突っ込み所満載。
・SystemCallError なんて上がらないんだが。
rescue => e
puts e.class
とでもして、何が上がってるのか確認しろ。
・if文が閉じてねーぞ。
> if(i>10) then raise
1行で書きたきゃ「if(i>10) then raise; end」か「raise if (i>10)」だ。
つか、endの対応が合ってなくてさくっとsyntax errorなんだが……。
・mtimeが「現在+10秒」より過去、って何の冗談だ。
・あるプロセスがunlinkした直後に別のプロセスがstatしたら死ぬんだが。
・あるプロセスがstatしてunlinkするまでの間に別のプロセスがstatしてunlinkしてopenしたら不味いんだが。
> 2.Windowsだとまともに動かないようだが他のプラットフォームだとどうか。
とりあえず適当に修正したら、2プロセス程度の簡単なテストならちゃんと動いた。(@mswin32)
850:デフォルトの名無しさん
08/11/07 22:19:35
>>849
1.Errno::XXX系統のクラスは全部SystemCallErrorのサブクラスなので
きちんと受け止められる
2.if文問題は修正済み
3.時間問題も修正済み
4.いまだにレースコンディションが解消してない件は最悪またSystemCallErrorで
受け止めてやればいい
修正したソース(rescue節のみ記載)
rescue
if(i>10) then
raise
end
i=i+1
begin
if(File.stat('lockfile').mtime+10<Time.new) then
File.unlink('lockfile') #残骸のロックファイル削除
else
sleep(0.1)
end
rescue SystemCallError
#rescueするけど何もしない
end
retry
end
851:デフォルトの名無しさん
08/11/07 22:24:21
それでもやっぱり最後のレースコンディションは解消してないのだが、
これ以上この方法にこだわる限り改善の余地はなさそう。
852:デフォルトの名無しさん
08/11/07 22:42:44
>>842
>まずそのサーバーでflockが使えないから無理
File#flock() が使えない環境ってどんなの?
どこでも使えるもんだと思ってた。
853:デフォルトの名無しさん
08/11/07 23:03:27
>>850
更新時刻から10秒待つのに、リトライは0.1秒×10回でいいのか、というのはおいといて、ゴミ掃除を別々のプロセスで確実にやるのは無理だと俺は判断してる。
ゴミ掃除専用のプロセスを1個だけ別に動かしとけ。メインの処理に10秒以上かかる可能性がないと言えるなら、それで大丈夫だろ。
854:デフォルトの名無しさん
08/11/07 23:31:32
どうせ専用のプロセスを立ち上げるなら,
druby使ってmutexを共有するという強引な方法を思いついた
855:デフォルトの名無しさん
08/11/08 00:22:16
普通にO_EXLOCKでシステムのアドバイザリロック機構に頼ればいいんじゃないのか?
下がnfsだったりするとアレだが。
856:デフォルトの名無しさん
08/11/08 05:41:35
>>853-854
レンタルサーバーでCGIを動かすために使うというのが大前提なので。
プロセスの常駐とかまず無理。
10秒待つのではなく確実を期すために10秒以上前のロックファイルを
削除するといっている。待つ時間は1秒。
857:デフォルトの名無しさん
08/11/08 05:43:07
flockメソッド(関数)は、言語によって同じ名前でも実装が違ったり
一部のファイルシステムやレンタルサーバ上では使えなかったりしてあまり信用できない
かといって自分でロック機構を実装すれば、レースコンディションの危険がある
なんかこの辺をさくっと解決してくれるpure rubyなライブラリないかな
858:デフォルトの名無しさん
08/11/08 11:34:57
>>857
>flockメソッド(関数)は、言語によって同じ名前でも実装が違ったり
Rubyの話してるんだから他の言語は関係ないだろ。
>一部のファイルシステムやレンタルサーバ上では使えなかったりしてあまり信用できない
だからどんなファイルシステムやレンタルサーバ上で使えないの?
具体名をだしてくれ。
どういう場合にflockが使えないのかを、ドキュメントに書いてもらおうぜ。
859:デフォルトの名無しさん
08/11/08 12:23:44
>>858
NFS上でのロックは不可能。
これはflockシステムコールの実装から来る制約。
fcntlを使えばNFSでロックすることは可能になるがIO.ioctl関数という
可搬性が低いメソッドを用いなければならず(まずWindowsなら実装されていないと
門前払い)かなり面倒。おまけにたいていNFS上でのロックはセキュリティホールに
なるので使えないのが普通。
860:デフォルトの名無しさん
08/11/08 12:49:31
>>858
レンタルサーバだと、flockが明示的に禁止されているサーバがある。パンドラとか
ただ、現在flockを使えないサーバがどのくらいあるかは分からない
無視できるほど少数かも
861:デフォルトの名無しさん
08/11/08 22:07:38
正規表現の書き方なのですが、、、、
>Sector:</td><td class="yfnc_tabledata1"><a href="URLリンク(biz.yahoo.com)">Services<
こんな文字列があって、前後にも改行以外の文字が色々とくっついているのですが、
Sector:の後のServicesをマッチさせて文字としてとってこようとすると、どう書けば良いでしょうか?
862:デフォルトの名無しさん
08/11/08 22:17:18
正規表現は書き方を覚えないと駄目
なぜなら、ほんの少し変えようと思っただけで別物になるから
コピペでやろうとすると異常に遠回りになる
正規表現自体は他の言語の正規表現とけっこう互換性があるから適当なサイトで勉強すれ
863:デフォルトの名無しさん
08/11/09 00:42:26
>>862
ありがとうございます。
マッチしたい文字列が9種類しかないのが分かったので、こうやりました。
if line =~ /.*Sector:<.*(Basic Materials|Conglomerates|Consumer Goods|Financial|Healthcare|Industrial Goods|Services|Technology|Utilities)/
p $1
end
864:デフォルトの名無しさん
08/11/09 11:46:37
wxRubyについて勉強してるんですが、何かいいサイトはありますか?
一応自力で見つけたサイト
URLリンク(www.gesource.jp)
URLリンク(wx.k5-n.com)
最小限のことは自分でやってます。require周りは自分でなんとかしてます。
865:デフォルトの名無しさん
08/11/09 11:59:40
具体的には…
1.とりあえずwxWindowをインストールした
2.wxRubyをgems経由でインストールした
3.簡単なテストアプリケーションが動くようになった
以上のことがすでに完了してます。
866:デフォルトの名無しさん
08/11/09 12:00:00
文字列変換メソッドを多数持たせたモジュールがあります。呼び出し
ごとに正規表現オブジェクトが作成されるのを防ぎたいのですが、
単に/abcde/ の代わりにRegexp.new("abcde")とすればOKですか?
それともグローバル変数みたいなものに格納しないとキャッシュと
しての効果は出ない?
867:デフォルトの名無しさん
08/11/09 12:12:20
式展開を含まないならどうでもいい
868:デフォルトの名無しさん
08/11/09 12:18:17
>>866
irb> class RegData
def reg1; /abc/; end
def reg2; /ABC/; end
def reg3; /123/; end
end
irb> RegData.new.reg1
/abc/
irb> RegData.new.reg1.object_id
537973880
irb> RegData.new.reg1.object_id
537973880
irb> RegData.new.reg1.object_id
537973880
ということで、静的な正規表現は、クラス定義が読み込まれた時点で使いまわしモードに入る
@re_scan = /xxxx.+?(yyy)zzz+/i
のようにクラス変数に正規表現を保管するというようなよくあるテクニックは、
正規表現が静的である場合に限り、コスト上は実は無意味、あるいは参照コストのぶん損だったりする
>>867の言うように、式展開を含むような「毎回違う可能性のある」正規表現はこの限りではない
869:デフォルトの名無しさん
08/11/09 12:20:32
>>866
/abc/ なら毎回生成されることはない。
/ab#{var}cd/ や Regexp.new("abcd") なら毎回作成される。
あとは
CACHE_REGEXP = {}
def cache_regexp(str)
CACHE_REGEXP[str] ||= Regexp.new(str)
end
とか。
870:デフォルトの名無しさん
08/11/09 12:42:43
>>864
公式のチュートリアル。
あとWxWidgetsのサイト全般と公式のAPIドキュメント。
wxに限ったことではなく、既存ライブラリのRubyバインディングは
元ネタのサイト漁るのが一番いいと思う。
871:デフォルトの名無しさん
08/11/09 12:57:40
>>870
読んでみたんですが、すでに???状態です。
英語ワカンネじゃなくてそもそも読む気力がないのが大問題だったりするわけですがorz
今度気力が回復したらやってみます
872:デフォルトの名無しさん
08/11/09 13:09:11
わかんなくてもコードコピペしてたら何となく動くし
それでもダメならWxWidgets関連のサイト参考にって>>870の2-4行目で
873:デフォルトの名無しさん
08/11/09 13:15:24
>>872
ええ。一応その段階はある程度OKです。
あとはゆっくり亀のように進んでいけばいいんです。
解決しました。ありがとうございます。
874:デフォルトの名無しさん
08/11/09 13:23:24
>>864
harukaze wxPython で検索
あと、解説サイトじゃないけど
wxRuby開発者が出してるwxsugarオススメ
875:デフォルトの名無しさん
08/11/09 13:49:02
>>874
たぶん言ってるサイトはこれだと思うんだけど、
URLリンク(www.harukaze.net)
なんかドメイン飛んでるよ
Pythonのが参考になるっつーことは理解できたけど。
876:866
08/11/09 15:29:30
>>867-869
ありがとう、よく分かりました。
877:デフォルトの名無しさん
08/11/10 23:22:19
>>859
>NFS上でのロックは不可能。
ほう、そうなのか。知らなかった。さんくす。
>fcntlを使えばNFSでロックすることは可能になるがIO.ioctl関数という
>可搬性が低いメソッドを用いなければならず(まずWindowsなら実装されていないと
>門前払い)かなり面倒。
Windows上でNFSを使うことはないだろうから、ioctlはUNIX限定でいいんじゃね?
>おまけにたいていNFS上でのロックはセキュリティホールに
>なるので使えないのが普通。
これよくわかんないんだけど、理由は?参考になるURLプリーズ。
>>860
>レンタルサーバだと、flockが明示的に禁止されているサーバがある。パンドラとか
これも理由がわからん。レンタルサーバでNFS使ってるわけじゃないだろうし。なんで?
878:デフォルトの名無しさん
08/11/10 23:31:11
>>877
URLリンク(menu.pandora.nu)
パンドラ側の説明みつけた
879:デフォルトの名無しさん
08/11/11 00:06:10
超絶初心者な質問で申し訳ないんですけど、RubyScript2Exeでexeファイル作りたいんですけど上手くいきません。
使い方は、RubyScript2Exe.rbとexeにしたいファイルを同じフォルダに入れて、
コマンドプロンプトで、「ruby [RubyScript2Exeのパス] [exeにしたいファイル]」
で合っていますか?
880:デフォルトの名無しさん
08/11/11 07:32:00
>>878
サンクス。あきらかにNFS使ってるね。
そんなサーバがあることに驚いたけど。
881:デフォルトの名無しさん
08/11/11 07:50:04
つまりflock前提として、最適なロック方法は
「まずIO.ioctlでロックを試みる、エラーが出ればrescueしてflockする」ということか!
・・・面倒だ
やっぱり、完全に可搬性のあるファイルシステムロック用のライブラリが欲しいな
882:デフォルトの名無しさん
08/11/11 08:19:04
「完全に」とか簡単に言っちゃう人って頭悪そう。
883:デフォルトの名無しさん
08/11/11 08:36:33
不完全or不安定なライブラリがほしいって言うのもなんだと思うが
884:デフォルトの名無しさん
08/11/11 08:49:34
欲しい欲しい、して欲しい。
885:デフォルトの名無しさん
08/11/11 09:14:19
RAAやRubyForgeをざっと探してみたけど、ファイルロック用のライブラリらしきものが見当たらない
実はみんな、あまり必要としていないのか?
MLでこんな古い話は見つけたが、ソースコードはもう公開されてないっぽい
(時間ないから詳しく探してないけど)
URLリンク(blade.nagaokaut.ac.jp)
886:デフォルトの名無しさん
08/11/11 09:50:16
本来、ファイルロックみたいにべったり環境依存なものに、完全な可搬性を求める発想が普通は余りないんだよね。
とはいうものの「環境依存だから諦めろ」ってのも古い考えで、こういう操作こそ処理系で環境差異を吸収しろ、っていう意見も、確かに一つの見識だと思う。
というわけで、完全な可搬性を持ったファイルロックの実装をコントリビュートしてくれ。
887:デフォルトの名無しさん
08/11/11 09:54:31
あんまり気にしたこと無かったけど、makeするあたりで
良きに計らってくれるとよさそうな感じだね
888:デフォルトの名無しさん
08/11/11 15:07:35
flockが使えるかどうかがファイルシステムに依存する以上、
コンパイル時に判定するのは無意味じゃないか?
889:デフォルトの名無しさん
08/11/11 17:32:32
>>886
SQLが使えるなら簡単な表を作って、そこに1つだけレコードを追加して、
あとはSELECT FOR UPDATEかSELECT LOCK IN SHARE MODEで終了。
幸いSQL用のライブラリは普通に配布されてる。
SQLが使えない場合はやり方を工夫するしかないわけなんだが。
とりあえずパンドラさんのPerlライブラリを解析するしかなさそうだけど。
>>881
むしろ順番は逆のほうがいい。ioctl関数はどちらかといえば汎用関数。
ioctlが使えないのはほぼ例外なくWindowsで作られてるサーバー。
890:デフォルトの名無しさん
08/11/11 17:34:51
RuBBSになんかあったな、ロック用のモジュール。
これの可搬性はどうなんだろう。
URLリンク(www.google.com)