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

Ruby 初心者スレッド Part 40

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/12/11(土) 15:46:15
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。

関連スレや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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
02682652010/12/21(火) 18:54:51
>>266
比較方法をブロック内に書くのか
全然気づきませんでした。ありがとう。

>>267
あとでやってみます
0269デフォルトの名無しさん2010/12/21(火) 21:01:21
>>261 ってスレ違い?
0270デフォルトの名無しさん2010/12/21(火) 21:44:18
まあだいたいはスレ違い
Rubyに絡めてくれれば乗る人もいたんだろうけど…
0271デフォルトの名無しさん2010/12/21(火) 21:51:19
>>270
そうですかー
>>261が理解出来たら、じゃあなんでRubyじゃダメだったのか、単に速度が遅かったからか、大量のつぶやきをさばけなかったのか、もしくは動的型によるリファクタのしづらさとか、それとももっと違う原因なのか、という部分も知りたいと思ってました

ここじゃスレ違いだとすると、どこで聞くのが適切でしょうか?
0272デフォルトの名無しさん2010/12/21(火) 21:52:14
HTTPでクライアントに応対する部分がフロントで、
DBやファイルや他のデーモン・サービスと連携する部分がバック
だと思えばいいんじゃないかね。
0273デフォルトの名無しさん2010/12/21(火) 22:13:27
基本RubyとRailsはCPUコストやメモリコストが他のスクリプト言語や他のコンパイル済み言語よりも高い
これは単純に(ある程度の)足し算というレベルで高い
ごっつい処理をたくさんの人に提供、とかいうのだと、最終的にPHPのほうが最低2倍は捌ける人数多いと思う

でも、それでもRubyを使う人がいる
この世のあらゆるプログラムをCで記述しないのと同じような理屈
Rubyで初期開発して、処理負荷が間に合わなくなったら他の言語に移る、というのは
Ruby的にはまったく悲しむべき問題ですらない
むしろRubyの優位性を示す出来事であるとすら思う人が多いはず

公開プロダクトを最初から最後までRubyで運用し倒しましたとかいうのは
その人がお金持ちか基地外か過疎プロダクトかどれか
0274デフォルトの名無しさん2010/12/21(火) 23:04:46
>>273
matzはtwitterがscalaを採用したことを、負けたと思ってるみたいだけどな
0275デフォルトの名無しさん2010/12/21(火) 23:52:11
Ruby(onRails)を高速化すれば戻って来てもらえると本気で思ってる節があるな
0276デフォルトの名無しさん2010/12/22(水) 01:13:36
Rubyの適用範囲がもっと広ければなあと考える事は
特に作者としては自然なことだと思うが
0277デフォルトの名無しさん2010/12/22(水) 08:07:10
http://jp.rubyist.net/magazine/?0013-BundledLibraries
Net::HTTP.Proxy メソッドは、
Net::HTTP を継承したクラスを作成して、
作成した クラスを返します。
Ruby は非常に柔軟な言語であるため、
メソッド中に動的にクラスを作成して、
そのクラスを返すということが可能です。

このメソッドの中にクラスって意味がわかりません。
普通、クラスを作ってその中にメソッドを定義するのではないですか?
0278デフォルトの名無しさん2010/12/22(水) 08:11:08
質問です
Windowsで下記のプログラムを-Eを付けて実行するとEncoding::UndefinedConversionErrorが
発生します。どのように修正すべきか教えていただけませんか

# coding: utf-8
require 'pstore'
db = PStore.new("pstest")
str = "あいうえお"
db.transaction{ db[1] = str }
db.transaction{ puts db[1] }

C:\home\mechanize>ruby -v
ruby 1.9.1p429 (2010-07-02 revision 28523) [i386-mswin32]

C:\home\mechanize>ruby -Ecp932:utf-8 hoge.rb
C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:499:in `write': "\xE3" from ASCII-8BIT to UTF-8
in conversion from ASCII-8BIT to Windows-31J (Encoding::UndefinedConversionError)
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:499:in `save_data_with_fast_strategy'
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:473:in `save_data'
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:335:in `block in transaction'
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:361:in `synchronize'
from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:321:in `transaction'
from hoge.rb:5:in `<main>'
0279デフォルトの名無しさん2010/12/22(水) 08:55:56
ああ、pstoreの中のFile.newが外部エンコーディングに引っ張られてるのか
…これどうしよう

>>277
たいしたことしてない
Net::HTTP.Proxy メソッドの定義見るとわかるが、ClassクラスのオブジェクトをClass.newで作って、
それにmodule_evalでクラスインスタンス変数の定義書いて、そのClassオブジェクトを返すようにしてる

klass = Class.new
klass.module_eval{
attr_reader :name
def initialize
@name='A'
end
}
p klass.new.name #=> 'A'

ぶっちゃけこんなマニュアルの中でこんな宣伝する必要なんてないと思うけどね
1.9時代においては削除されるべき無用で紛らわしい雑談だと思うよ、個人的には
0280デフォルトの名無しさん2010/12/22(水) 09:11:16
>>279
マニュアルじゃなくて雑誌記事でわ?
0281デフォルトの名無しさん2010/12/22(水) 09:13:01
pstoreするときだけ外部エンコーディングの影響をなくしたこれなら動く
当たり前だが

# coding: utf-8
require 'pstore'
db = PStore.new("pstest")
str = "あいうえお"
@evacuated_encoding_for_pstore = Encoding.default_external
Encoding.default_external = Encoding::ASCII_8BIT
db.transaction{ db[1] = str }
db.transaction{ puts db[1] }
Encoding.default_external = @evacuated_encoding_for_pstore

puts してるのは UTF-8 エンコーディングの UTF-8 バイナリ列のままだから
コマンドプロンプトでは化けるので注意
0282デフォルトの名無しさん2010/12/22(水) 09:28:50
>>281
ありがとうございました。
リファレンスちゃんと理解できるよう出直します。

私のところでは、化けずに出力されてます。
0283デフォルトの名無しさん2010/12/22(水) 09:33:59
どっちかというと、File にエンコーディングを指定できない(または固定しない) PStore 側がへなちょこなんだと思う
ユーザー側にあんまり非はないし、この対処をマニュアルから読み取るのは不可能なんじゃないかな
0284デフォルトの名無しさん2010/12/22(水) 10:19:08
>>275-276
言語のユーザーや仕事の開発者としては、Ruby向いてないところに差し迫ったら乗り換えて当然と思ってしまうけど
Matzは立場上(本気でそう思ってなくても)悔しがらないとあかんのでは?w
0285デフォルトの名無しさん2010/12/22(水) 10:44:23
>>277
>メソッド中に動的にクラスを作成して、
>そのクラスを返すということが可能です。
>
>このメソッドの中にクラスって意味がわかりません。

メソッドの中でクラスを作成し、それを返す。ただそれだけ。

これはもとのマニュアルが悪いな。「動的に」なんて初心者にわかるはずがない。
直すなら
「メソッドの中でクラスを作成して返します」
「メソッドを実行するたびにクラスを作成して返すことができます」
とか。
0286デフォルトの名無しさん2010/12/22(水) 11:18:44
>>284
それは単に表面的なスタイルの問題じゃないの?
インデント強制だからPython は嫌だとか言ってる人たちを思い出すな
0287デフォルトの名無しさん2010/12/22(水) 11:20:24
どこをどう読めば>>284がスタイルの問題になるのかまったくわからない。
アンカーミスだよな?
02882862010/12/22(水) 11:22:51
>>287 すまん。確かに275-276が違う所をさしてるように見えてしまった
0289デフォルトの名無しさん2010/12/22(水) 12:22:12
最近Rubyはじめたんですが、クロージャのような無名の処理はみなさんどうやって文書化してます?
0290デフォルトの名無しさん2010/12/22(水) 12:27:25
ソースがドキュメント
0291デフォルトの名無しさん2010/12/22(水) 15:23:46
jrubyのnkfが壊滅的なのですがどうすればいいんでしょうか
jrubyで文字コード変換するなということなんだろうか
0292デフォルトの名無しさん2010/12/22(水) 16:21:18
>>291
もうJava標準APIを呼んでしまえ。
String#getBytesとかエンコード指定付きコンストラクタとか
Reader/Writerとか。
0293デフォルトの名無しさん2010/12/22(水) 19:09:44
>>274
>matzはtwitterがscalaを採用したことを、負けたと思ってるみたいだけどな
うそだぁ
ソースは?
0294デフォルトの名無しさん2010/12/23(木) 07:23:26
>>291
そんなことはない
現在のJRubyの動作は基本的に完全だと外人さんも太鼓判を押している
0295デフォルトの名無しさん2010/12/23(木) 07:46:49
128文字でお釣りが来る国の人の言うことはほんとに当てにならんからのう…

まあNKF.guess組み込んで「エンコーディング対応しました」とか言う日本人もいるからどっちもどっちだが
案の定ISO-8859-xで盛大に誤爆して現在もコードまだ直ってない
君のことだよMechanize
0296デフォルトの名無しさん2010/12/23(木) 09:55:16
>>294
nkfみたいな文脈で外人の太鼓判は信用できないwww
0297デフォルトの名無しさん2010/12/23(木) 11:55:09
railsの機能をirbで使うにはどうしたらいいのでしょうか?
たとえば、
rubyでhtmlタグを文字列から除去する方法(正規表現) - YomuKaku Memo
http://memo.yomukaku.net/entries/51
のstrip_tagsメソッド

irbではエラー
str= open("http://railstutorial.org/ruby-on-rails-tutorial-book")
p strip_tags str

0298デフォルトの名無しさん2010/12/23(木) 12:18:43
strip_tags は actionpack の SanitizeHelperモジュールで定義されている。
いろいろ依存しているライブラリがあるので、

require 'erb'
require 'active_support/dependencies/autoload'
require 'active_support/core_ext/class/attribute_accessors'
require 'active_support/core_ext/string/encoding'
require 'active_support/concern'
# 面倒&初期化の重さを厭わないなら require 'active_support/all'

require 'action_view/helpers/capture_helper'
require 'action_view/helpers/sanitize_helper'

必要ならさらに include ActionView::Helpers::SanitizeHelper
0299デフォルトの名無しさん2010/12/23(木) 12:36:44
必要ならつーかモジュールのインスタンスメソッドだからincludeせんと。
0300デフォルトの名無しさん2010/12/23(木) 12:41:22
Rails3をインストールして、
適当にアプリ作る。
そこで
rails console
でrailsがバックにあるirbが使える
0301デフォルトの名無しさん2010/12/23(木) 13:59:31
rails consoleでもObjectにActionView::Helpers::SanitizeHelperが
includeされるわけじゃない(本来ビューレンダリング用のものだし)ので、
そこは必要。

ただし、helper というビューオブジェクトが存在するので、include
しなくても
helper.strip_tags('...')
とは出来る。
0302デフォルトの名無しさん2010/12/23(木) 14:20:31
そういうのを調べるのってリファレンスを見てるんですか?
日本語のまとまった情報とか無いですよね・・・
0303デフォルトの名無しさん2010/12/23(木) 15:24:50
strip_tags については、リファレンスで SanitizeHelper のものだと
分かるので、あとはそれを使う環境を整えるために試行錯誤するだけ。
0304デフォルトの名無しさん2010/12/24(金) 01:21:41
まあそのへんはRailsスレに行けばわか…わか…、

まあ、Railsも使っててRuby本体にも造詣のある人は少なくないだろうし
わかるんじゃないかなあと思う
RailsのことはRailsスレでやれバーカバーカというよりは、単に遭遇確率の問題
0305デフォルトの名無しさん2010/12/24(金) 13:21:04
irbでrequire '"action_view"; include ActionView::Helpers::SanitizeHelperしただけだと
足りないメソッドあるし使えないから面倒くさい

rails consoleのhelperから使った方がいいな

前はrails consoleから簡単に使えないメソッドもあったし(確かcontrolに依存していたり、内部で擬似的にリクエスト発生が必要だったり?)
そういうのは徐々に改善されていっているようだけど
0306デフォルトの名無しさん2010/12/25(土) 00:35:43
Rubyのソースファイルと実行結果が一緒に表示できるxmpfilterが便利
インストール。
$ gem install rcodetools

0307デフォルトの名無しさん2010/12/25(土) 11:38:05
>>306
[ruby-list:47063] Ruby逆引きハンドブック & xmpfilter (was: Re
http://permalink.gmane.org/gmane.comp.lang.ruby.japanese/6175


これか、よくブログでコードに

1 + 2 # => 2

と表示されるのってxmpfilterなのか
エディタのサポートあれば便利だな
0308デフォルトの名無しさん2010/12/25(土) 11:49:39
言えない、手書きでやってたなんて絶対に言えない
0309デフォルトの名無しさん2010/12/25(土) 14:46:17
日頃Windows版でのテキストファイルの読み込みの遅さに辟易していましたが
ふとバイナリモードにしてみたところ、これまで30秒程かかっていた読み込みが
1秒足らずで終わりました。後から強制エンコーディングするにもおつりが出る速さです。
なぜこんなにテキストモードのI/Oは遅いのでしょうか?
0310デフォルトの名無しさん2010/12/25(土) 14:55:35
実装者に文句言ってけれ
知らないよ
0311デフォルトの名無しさん2010/12/25(土) 15:06:57
> なぜこんなにテキストモードのI/Oは遅いのでしょうか?
そりゃ1バイトずつ内容チェックしていって
CR LF の並びがあれば "\n" に変換するという「無駄」な処理があるからに決まってるじゃん
変換がないだけならただ読んで終了だもの
0312デフォルトの名無しさん2010/12/25(土) 15:12:05
データを読んだからにはそれに対するメインの処理を施すわけだが、
テキストモードで「改行コードを置換する」だけの処理がメインの処理よりも時間がかかるなんてことがあるのだろうか!
0313デフォルトの名無しさん2010/12/25(土) 16:29:23
判断の処理とかさせるからだろ、
フールセーフ(アフォでも安全)というか、
自動判別させる処理とか裏で動いているから、
0314デフォルトの名無しさん2010/12/25(土) 16:30:35
下のようにスクリプトファイルにテキスト名を指定せずにコンソールで指定するにはどうしたらいいのでしょうか?

File.open("sentence.txt").each{|line| ...
0315デフォルトの名無しさん2010/12/25(土) 16:46:34
コンソールからファイル名を読み込んで変数に代入しておき
openにその変数を指定するとかではなく?
0316デフォルトの名無しさん2010/12/25(土) 16:55:22

そういう一手間がいるんですね。
C:\>xxx.rb xxx.txt > xxx1.txt
みたいなわけにはいかないのでしょうか?他の言語かじったときのイメージでこんな
かんじでいけなるのかと勝手に思ってたのですが。
ぐぐってもでてこないのだから、ダメなんでしょうね。
0317デフォルトの名無しさん2010/12/25(土) 16:59:09
テキストモードだとファイルの読み込み30秒、メインの処理1秒でした。
ちなみにCSVファイルの加工です。
0318デフォルトの名無しさん2010/12/25(土) 17:04:40
そもそもコンソールってなんじゃらほ

スクリプト起動時の引数に指定してそれを利用するパターン(推奨)

inputed = ARGV[0]
file = open(inputed, 'rb'){|f| f.readlines}
puts "#{inputed} has #{file.size} lines"

実行:
$ ruby hoge.rb sentence1.txt
$ ruby hoge.rb sentence2.txt

スクリプトを起動して対話的に指定するパターン(一見凄いが後々意外とめんどい)

puts 'ENTER FILEPATH: '
inputed = $stdin.gets.chomp
file = open(inputed){|f| f.readlines}
puts "#{inputed} has #{file.size} lines"

実行:
$ ruby hoge.rb
ENTER FILEPATH: ← ここでキーボードからファイルパス入力してenter


ちなみにこの file.size は実際の行数を必ずしも反映してない
あと、ユーザーの入力が信用できない場合openにそのまま渡してはいけない
0319デフォルトの名無しさん2010/12/25(土) 17:05:37
>>316
それは出力だろ
出力ファイルの名前のことなのか
君のレスは情報の多くが欠落している
欠落した情報でググっても何も出てくるはずもない
0320デフォルトの名無しさん2010/12/25(土) 17:06:51
>>314
普通に書けば、
while line = gets
 puts(line)
end

組み込み変数で明示的に書けば、
while line = $stdin.gets
 $stdout.puts(line)
end

ドヤ顔したければ、
while gets; puts $_; end
0321デフォルトの名無しさん2010/12/25(土) 17:08:09
>>318
初心者スレに初心者がレスすると不幸を生むから見てるだけのほうがいい。
0322デフォルトの名無しさん2010/12/25(土) 17:12:30
>>316
Rubyの標準入力はIOオブジェクトとしてグローバル変数$stdinからアクセス可能
Rubyの標準出力はIOオブジェクトとしてグローバル変数$stdoutからアクセス可能
puts や print のデフォルト出力先は $stdout
スクリプト起動時の引数はARGV
「起動時引数をファイルとみなして開いたIOオブジェクトとみなすが、空の場合は標準入力に切り替える」のはARGF

…ていうか、標準入力や標準出力、起動時の引数を知ってればこれにたどり着くだろうから、
もしかして「コンソール」という言葉を知ってて呼び名を知らないんか
0323デフォルトの名無しさん2010/12/25(土) 17:13:37
関係ないけど、最近の若いもんにちょっとテキスト処理のプログラム課題を与えたら、
とりあえずopenで開く人が多くて、なんだかなぁって感じがする。
普通は標準入出力使ってフィルタを作るだろ…言わなくてもそうなるだろ…?
どうしてopenつかうんだよもぉぉぉぉぉ!
0324デフォルトの名無しさん2010/12/25(土) 17:15:08
>>314の回答は>>318だと思う
open して read する

  対象のファイルの名前

を"コンソール"から指定したいのだろ
0325デフォルトの名無しさん2010/12/25(土) 17:16:27
あとストリームを一気に読み込もうとする人!
なんなんだよ!1行ずつ読み込んで1行ずつ処理しろよぉ!
そうしたほうが省メモリだろぅ!
「でもメモリいっぱいあるし」
まぁそうだけどさぁ…><;
メリークリスマス!
0326デフォルトの名無しさん2010/12/25(土) 17:18:58
お前の言ってるコンソールは、もしかしてコマンドライン?
0327デフォルトの名無しさん2010/12/25(土) 17:19:24
>>324
File.open("sentence.txt").each{|line|
# ここで読み込んだ内容を別途ファイルに保存したいが、
# 書き方がわからないので空欄にして質問しました
}

という質問の可能性を排除するような視野の狭い人は初心者スレで回答すべきではない
そもそも読み込み対象のファイル名は既に記載されてるではないか
なんでそれをユーザー入力させると誤読するのかマジ理解不能
0328デフォルトの名無しさん2010/12/25(土) 17:22:01
なんだ冬休みか...
0329デフォルトの名無しさん2010/12/25(土) 17:22:03
>スクリプトファイルにテキスト名を指定せずにコンソールで指定
0330デフォルトの名無しさん2010/12/25(土) 17:23:55
>>327
いくつもの可能性があるからいちいち聞きなおさにゃならん
記載されてるファイル名をベタ書きしたくないと普通は解釈する
0331デフォルトの名無しさん2010/12/25(土) 17:24:59
はいはいはい、引数に何か指定させようとする馬鹿は全員帰ってね
それは元質問の「スクリプトファイルにテキスト名を指定」で既に行われてるから
引数によるファイル名の指定をやりたくないという質問なのこれは
0332デフォルトの名無しさん2010/12/25(土) 17:27:29
>>331
テキスト名をコンソールで指定したい、だからファイル名を対話的に入力したいんだろ要は
>>318の後半でいいじゃん
0333デフォルトの名無しさん2010/12/25(土) 17:30:22
でも>>316みたいにやりたいのなら引数で渡したいってことじゃないのか
0334デフォルトの名無しさん2010/12/25(土) 17:30:39
コンソールって言ったら普通は端末(エミュレータ)だろ
引数から入力したいならそういう風に言うはずだから、端末から入力する方法を答えればいい
とりあえずは gets でいいんじゃね
0335デフォルトの名無しさん2010/12/25(土) 17:42:19
とりあえず

ruby hoge.rb in.txt > out.txt


「ruby を hoge.rb と in.txt を引数にして起動し、標準入力のリダイレクトで out.txt に書き出す」
と読めてるかどうかでかなり説明レベルが違うような…
これなら「起動時の引数をrubyから取得する方法」と「標準出力

って、標準出力にはそれこそ普通に出力されててそれ以降はRubyの仕事じゃないじゃないですかやだー!

…引数を複数取ってrubyで利用する方法がわかればいいような気がする

ruby hoge.rb in.txt out.txt

と書いて in.txt を読み込んで out.txt に書き出す、ができれば満足されそうな
つまりはシェルのリダイレクトやらパイプやらを使用したくないんじゃないかと
>>316を読む限り、コンソールという概念を勘違いしてるという読みは正しいと思う
0336デフォルトの名無しさん2010/12/25(土) 17:46:05
ruby -n が欲しいんじゃないかなー
>>316の「ほかの言語」はawkとかだと推測
0337デフォルトの名無しさん2010/12/25(土) 17:53:53
てことで
「○○を××して△△するプログラムを書こうとしてここまでできたのですが、
●●の部分を◇◇にする方法がわかりませんてめえら勝手に盛り上がってないでとっとと教えろカスが」
とか言ってくれると僥倖
たぶんこのへんのたいていのパターンはRubyで書けるし別に喧嘩してるわけでもないのでさくっと情報くれ
0338デフォルトの名無しさん2010/12/25(土) 18:26:49
美女を籠絡して満喫するプログラムを書こうとしてここまでできたのですが、
一物の部分をギンギンにする方法がわかりませんてめえら勝手に盛り上がってないでとっとと教えろカスが
0339デフォルトの名無しさん2010/12/25(土) 19:43:09
しかたないなあ
http://www.flickr.com/photos/john_lam/1910968816/
0340デフォルトの名無しさん2010/12/25(土) 21:14:27
>>313
× フールセーフ(約2,580件)
○ フールプルーフ(耐馬鹿性, fool proof, 約5,120,000件)
○ フェイルセーフ(間違っても安心, fail safe, 約1,590,000件)
0341デフォルトの名無しさん2010/12/25(土) 21:15:53
>>313自身が馬鹿だということでフールセルフという言葉を授けよう
0342デフォルトの名無しさん2010/12/25(土) 22:31:01
>>325
前の行に戻りたいときはどうするの?例えば、GenBankの出力で
LOCUS AB248268 638 bp DNA linear PLN 21-AUG-2007
DEFINITION Asarum heterotropoides var. heterotropoides gene for ITS1, 5.8S
rRNA, ITS2, partial and complete sequence, specimen_voucher: H.
Yamaji 6170 (TUS).
ACCESSION AB248268
//
...
となってるときに
{'LOCUS' => 'AB248268', 'DEFINITION' => 'Asarum heterotropoides var. heterotropoides gene for ITS1, 5.8S
rRNA, ITS2, partial and complete sequence, specimen_voucher: H. Yamaji 6170 (TUS).', 'ACCESSION' => ...}
という感じのHashをつくりたいときに、1行ずつの処理でうまくやれるアルゴリズムはあるのでしょうか?
DEFINITIONが終わったときにどうしてもACCESSIONの行を再読み込みするようなアルゴリズムになっちゃうんです。
ちなみに、DEFINITIONのあとに ACCESSIONがくることは保証されていません。別のフィールド(大文字のみ)か、
レコード区切り(//)が期待されます。
0343デフォルトの名無しさん2010/12/25(土) 22:39:56
>>342
入力元となるデータが限定されており、そのサイズが十分に予想できてかつメモリに乗せてもかまわないのなら全て読み込んで処理すればいい。
0344デフォルトの名無しさん2010/12/25(土) 22:46:16
流れてくるデータが1行単位じゃないのなら、1行単位で実処理するのは単にアホだろ
データ区切りまでバッファしてから処理すればいい
0345314,3162010/12/25(土) 22:52:55
いやー、すんません。大混乱を招いたようで。

>>335さんのが最も聞きたいことに近いように思います。コンソールというのも、
勘違いというか、読んだHPでそういう使い方をしていたようにおもったもので。
コマンドラインというのが正確なのでしょうか。

>>335さんのを利用させてもらいますと、

ruby hoge.rb in.txt out.txt

このin.txtという指定をコマンドラインでしたいのですが、その際のhoge.rbには
どう記述すればいいのでしょうか?今、下のような感じになってるわけですが、
"sentence.txt"という指定をファイルからはずして、コマンドラインから
好きなファイルを指定して実行したいのです。File.open()の()の中は
どうすればいいんでしょうか?それとも上の方で指摘されているような
記述じゃないと無理なのでしょうか?

File.open("sentence.txt").each{|line|
ary = []
line.chomp.split(/\s*\/\s*/).each{|item|
ary.push(item) }
0346デフォルトの名無しさん2010/12/25(土) 22:55:41
とにかく
hoge.rbに
p ARGV
と書いて
ruby hoge.rb in.txt out.txt
と実行してみろ。

そしたら後は
ARGV
でググレ。
03473452010/12/25(土) 23:19:31
サンクスです。^O^

コマンドラインに引数ですか。コンソールとかコマンドプロンプトとかファイルとかで
延々とググッてました。
03483422010/12/26(日) 09:03:38
>>343,344
ありがとうございます。元のデータはせいぜい数MBなので、全部読んでもいいと思いますが、
区切りまでバッファするというのは考えてなかったので、それでやってみます。
0349デフォルトの名無しさん2010/12/26(日) 22:05:55
そろそろゴルファーとワンライナー信者による ruby -p -e を使ったテクニカルなフィルタがご覧になれます
0350デフォルトの名無しさん2010/12/27(月) 01:05:14
-n, -p, -a はやらず嫌いはもったいない
来年の漏れの目標はなぜか sed, awk の習得です
0351デフォルトの名無しさん2010/12/27(月) 08:25:06
sed awk して船山に上る
0352デフォルトの名無しさん2010/12/27(月) 08:39:40
>>339
グロ中尉
0353デフォルトの名無しさん2010/12/27(月) 09:03:22
yield でイテレータを独自に定義 - Ruby入門勉強ルーム
http://www.mapee.jp/ruby/yield.html

class Array
def each_twice
i = 0 # => 0
while i < self.length
x = self[i] * 2 # => 0, 8, 10, 14, 18, 64
yield x # => nil, nil, nil, nil, nil, nil
i += 1 # => 1, 2, 3, 4, 5, 6
end
end
end

d_ary = [0, 4, 5, 7, 9, 32] # => [0, 4, 5, 7, 9, 32]
d_ary.each_twice do |x|
puts x # => nil, nil, nil, nil, nil, nil
end

いやーrubyすごいね、arryって基本的な上位のクラスだと思うのだけれども。
何か特殊な指定もしなくても
class Array
だけで関数追加できちゃうんだね。
0354デフォルトの名無しさん2010/12/27(月) 09:32:29
オープンクラスってRubyで初めて知ったんだけど、他にメジャーな言語で採用してるのってある?JSとかそうだったかな
なんつーか素人から見ると、大事なところをこわしそうで怖いよねw
0355デフォルトの名無しさん2010/12/27(月) 11:20:33
JSはプロトタイプ自由にいじれるんだっけ
0356デフォルトの名無しさん2010/12/27(月) 12:02:52
そもそもJSの場合、真の意味でのクラスは存在しないからなぁ
0357デフォルトの名無しさん2010/12/27(月) 12:54:32
真の意味でのクラスってなんだよw
0358デフォルトの名無しさん2010/12/27(月) 12:56:58
分からないんならググれよ
0359デフォルトの名無しさん2010/12/27(月) 13:20:03
いくらグーグルでもお前の妄想なんてヒットしないのだがw
0360デフォルトの名無しさん2010/12/27(月) 14:56:32
全板強制IDでいいと思うわ
自演ばっかりうっとおしい
0361デフォルトの名無しさん2010/12/27(月) 15:18:32
someday = Date::parse 2010.8.29
someday.upto(Date::today) do |val|
p val
end
だと,
Sun, 29 Aug 2010
Mon, 30 Aug 2010
...
Sun, 26 Dec 2010
Mon, 27 Dec 2010
のように,1日づつ出力されるのですが,

Sun, 29 Aug 2010
Wed, 29 Sep 2010
Fri, 29 Oct 2010
Mon, 29 Nov 2010
のように月ごとの応答日を列挙するようなupto的メソッドってありますか?
whileとかifとか条件文を使わずには無理でしょうか?
0362デフォルトの名無しさん2010/12/27(月) 15:36:06
$ irb
> require 'activesupport'
=> true
> time = Time.mktime 2010, 8, 29
=> 2010-08-29 00:00:00 +0900
> time = time.months_since 1
=> 2010-09-29 00:00:00 +0900
> time = time.months_since 1
=> 2010-10-29 00:00:00 +0900
> time = time.months_since 1
=> 2010-11-29 00:00:00 +0900
> time = time.months_since 1
=> 2010-12-29 00:00:00 +0900

これではどう?
0363デフォルトの名無しさん2010/12/27(月) 15:36:49
(Date.today.month - someday.month).times.map {|i| someday >> i }
とか。
03643612010/12/27(月) 16:50:29
>> 362, 363
ありがとうございました。
>>363では若干問題が...
somedayが2010.8.25の場合は,本日を基準にすると,12.25が既に到来しているので,
5こ列挙されて最後が2010.12.25になってほしいのです。

逆に>>362だと2010.12.29はまだ到来していないので,列挙してほしくない。

いずれにしても,示唆に富んだアドバイスをありがとうございました。
(条件文無しでは無理そうですね。)
0365デフォルトの名無しさん2010/12/27(月) 18:25:00
メインの処理内に直接条件文を記述したくないということなら
そのようなイテレータを定義するのもありかもよ
条件文はイテレータ定義内に書いておき
メインの処理ではイテレータを使うとか
0366デフォルトの名無しさん2010/12/27(月) 18:34:10
条件を書いていいなら
# 1.9
someday.upto(Date.today).select {|d| d.day == someday.day }
# 1.9 or 1.8
(someday..Date.today).select {|d| d.day == someday.day }
あたりでOKなんだろうけど。
0367デフォルトの名無しさん2010/12/27(月) 22:45:56
activesupportってなんでアンダースコア入ってないの?他は入ってるよね
■ このスレッドは過去ログ倉庫に格納されています