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

Ruby 初心者スレッド Part 56©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net2014/12/13(土) 09:29:12.93ID:DLY4IovQ
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 55
http://peace.2ch.net/test/read.cgi/tech/1403361584/

るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/

逆引きRuby
http://www.namaraii.com/rubytips/
0698デフォルトの名無しさん2015/02/11(水) 15:32:08.71ID:u2Y4u6H8
>>662
>もしも「右辺と左辺を取り替えて評価しても結果が同じになる」ことを期待しているならば、

代入じゃないんだから、等号の前後で意味が変わるってのは間違いを呼び込みやすい
良くない仕様だと思う。
こういうのに違和感を感じない奴って数学的センスがないんだろうなあ、と思う。
0699デフォルトの名無しさん2015/02/11(水) 15:46:18.57ID:uxm1HOmW
>>697
Rubyにこだわらず正規表現の資料に当たるのがいいと思うよ
(?=〜)は肯定先読み
0700デフォルトの名無しさん2015/02/11(水) 15:52:52.72ID:73gQVPeZ
数学でもランダウ記号なんか扱ってると「=」の前後で意味が変わる
数学的センスとは一体……w
0701デフォルトの名無しさん2015/02/11(水) 15:54:49.91ID:r3BddX0b
>>697
横からだけどこれの「先読み、後読み」のところ
http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fregexp.html

詳説正規表現って本が定番で三章ぐらいまで読めば普段使いには十分
0702デフォルトの名無しさん2015/02/11(水) 15:55:06.55ID:73gQVPeZ
>>697
とりあえずこれ読んでおけば良いと思う
ttp://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fregexp.html
0703デフォルトの名無しさん2015/02/11(水) 15:56:45.20ID:73gQVPeZ
すまん、かぶった
0704デフォルトの名無しさん2015/02/11(水) 16:01:09.99ID:sK01Ui9b
>>698
数学的に違和感があっても
Rubyの仕組み的に違和感がない(むしろ全てレシーバのメソッドで統一されてる)

Rubyは数学じゃなくてプログラミング言語だからそんなにおかしな仕様じゃないと思うけど
07056932015/02/11(水) 16:15:37.27ID:cDpEjOcI
URLのその欄を見落としていたようです。失礼しました。
早速読んでみましたが、何となくでしか理解できないので
紹介された書籍を今からポチってきます
皆さん、ありがとう
0706デフォルトの名無しさん2015/02/11(水) 16:25:36.31ID:PYSPfi0Q
ちょっとまってどうせ買うならおれのアフィリンクから買ってくれよ
0707デフォルトの名無しさん2015/02/11(水) 16:50:02.25ID:r3BddX0b
図書館(手遅れ)
0708デフォルトの名無しさん2015/02/11(水) 16:56:43.99ID:sDJf85Ja
>>698
∃f∃g s.t. ¬( o(f) = o(g) ⇔ o(g) = o(f) ).
と言おうとしたら既出だった
0709デフォルトの名無しさん2015/02/11(水) 17:03:48.99ID:X7wVt/Fu
肯定・否定先読みのためだけに、
「詳説正規表現」を買うのか?

漏れなんか、「たのしいRuby」で正規表現を覚えたけど、
ちょっと使うには十分だよ

それ以上のことは、2chの正規表現スレで、聞けばよい。
一々、買わなくてもよいだろう。
もし買うのなら、そいつのリンクから買ってやれ
0710デフォルトの名無しさん2015/02/11(水) 17:06:47.22ID:HV6QGBu9
最後の行だけ言いたかったんと違うか
0711デフォルトの名無しさん2015/02/11(水) 17:54:07.50ID:xOldc4y+
すみません、教えてください(ぐぐったけど分からず)
gem install mysql2
すると
ruby/thread.hが無い
と言われるのですが、
thread.hはどうすればインストールされるのでしょうか?

Debianのaptで
ruby
ruby-dev
は入ってます。(1.9.3)
0712デフォルトの名無しさん2015/02/11(水) 17:58:59.39ID:PYSPfi0Q
githubのmarkdownパーサって何てライブラリですか?
0713デフォルトの名無しさん2015/02/12(木) 07:46:08.52ID:9gMH9uw0
たぶんRedcarpet

>>711
https://github.com/brianmario/mysql2#linux-and-other-unixes
libmysqlclient-devかmysql-devel入れろって書いてあるけど入れた?
0714デフォルトの名無しさん2015/02/12(木) 12:03:09.39ID:gfPr4M9I
何で.newでクラス生成するのに def newって毎回定義しなくていいの?
クラスで定義したメソッドを.なんちゃらで呼び出せますってはずなのに
メソッド作ってもいないnewが使えてしまうのが謎
0715デフォルトの名無しさん2015/02/12(木) 12:11:42.06ID:oLOcoqWq
Class.new

Calls allocate to create a new object of
class's class, then invokes that object's
initialize method, passing it args.
This is the method that ends up getting called whenever
an object is constructed using .new.
0716デフォルトの名無しさん2015/02/12(木) 13:50:20.19ID:pmmZp4nI
z= if 3==4 then 1 else 2 end
puts z # →2
こんなことが出来るのを知った

いままでいちいち
if 3==4 then x=1 else x=2 end
puts x # →2
などとやっていた
0717デフォルトの名無しさん2015/02/12(木) 13:56:04.42ID:oLOcoqWq
それなら三項演算子「?:」を使うとよいよ。
a = 3 == 4 ? 1 : 2
0718デフォルトの名無しさん2015/02/12(木) 14:03:01.16ID:vZuNWRuz
whileやtapもbreakした値を返すので知っておくとごくまれに使うかも
0719デフォルトの名無しさん2015/02/12(木) 14:12:14.17ID:pmmZp4nI
>>717 >>718
ありがとうございます
知らないことアバカン(=多いの熊本語)
0720デフォルトの名無しさん2015/02/12(木) 16:27:53.76ID:qdUt/p4n
>>714
勝手にObjectクラスを継承するから、何も書いてなくてもObjectクラスのメソッドは使える
0721デフォルトの名無しさん2015/02/12(木) 21:01:46.12ID:ACguu+ql
たとえできてもやる奴はクソ
0722デフォルトの名無しさん2015/02/13(金) 00:21:20.42ID:qAadHGJa
>>716
Rubyではifも式だからね
たぶんLISP由来だろう
最近の言語ではScalaもそうだね
0723デフォルトの名無しさん2015/02/13(金) 00:21:39.71ID:CzCNKwo/
Loggerを使ってコンソールとログファイルに同時に出力したいのですが
何かいい方法はないでしょうか?
一応Shell::teeというのを見つけたのですがリファレンスマニュアルが
投げやりな感じで困っています・・・
0724デフォルトの名無しさん2015/02/13(金) 00:28:06.47ID:qAadHGJa
>>723
ログファイルに出しておいて、tail -F でコンソールで見ればいいんじゃない?
0725デフォルトの名無しさん2015/02/13(金) 01:20:51.80ID:SVZa3gOz
>>716(>>719)
if 式だけでなく、 case 式もある

color_num = case color
       when :blue; 0
       when :red; 1
       when :Yellow; 2
       else; -1

これらは「関数型プログラミング」と呼ばれるプログラミング・スタイルのひとつ
詳しくは、以下を参照:
・Rubyによる関数型プログラミング
 http://www.h6.dion.ne.jp/~machan/misc/FPwithRuby.html

Ruby は「オブジェクト指向な手続き型スクリプト言語」であるけれど、
「関数型プログラミング」にも(他の手続き型言語と比較すれば)極めて適している性質がある
状況に応じて、常識的な「手続き型プログラミング」と簡潔な「関数型プログラミング」とを
自在に使い分けることができるようになることが望ましい
0726デフォルトの名無しさん2015/02/13(金) 02:16:33.14ID:Hocs4IwU
Effective Ruby買ったけどいいね。
このスレみているような人は必読の良書だった。
0727デフォルトの名無しさん2015/02/13(金) 05:54:31.12ID:3tmdVICO
>>725
個人的に一行whenの場合、文の前はthenだな
何つーか、汎用的な文区切りになっちゃうセミコロンより
whenの一部である以上そうとしか解釈されないthenのが安心感あるというか
…まあ、どうせ複数行whenのときはthen書かずに改行しちゃうから同じっちゃ同じか
0728デフォルトの名無しさん2015/02/13(金) 13:42:31.60ID:W6lKBquT
>>725
caseが値を返すのは関数型で必要とされることの多い性質ではあるけど
それ自体は別に関数型でも何でもないぞ
0729デフォルトの名無しさん2015/02/13(金) 23:29:34.48ID:v7o1vyZw
なんでもかんでも式になってる言語はどう整形するか悩むんだよな。
0730デフォルトの名無しさん2015/02/13(金) 23:35:16.88ID:qAadHGJa
>>729
いっそのことLISPぐらいまでいってしまえば、整形はあまり悩まなくてすむのになw
emacs lisp はたまに書くが、整形で悩んだことはほぼない
0731デフォルトの名無しさん2015/02/14(土) 00:12:54.67ID:/i+i2oPj
LISP書きはどうやって括弧の数を間違えずに書くのか
07326932015/02/14(土) 00:27:23.04ID:ng5YU6yI
ぶっちゃけRuby技術者認定試験 て実際どの程度のものなんでしょうか?

趣味の範疇でruby始めたのですが、
独学の悪いくせで好きなものしかやらない・・・ し覚えない・・。 
そこで全体的な知識不足の指標となるかな?
この試験も目指してみようかなと思い立ったしだいです。

別のruby参考資料を買おうか、こっちにしようか悩み中
0733デフォルトの名無しさん2015/02/14(土) 01:07:33.88ID:ISQup94G
やめとけ
広く知識を身につけたいなら基本情報にでも挑戦したほうがRubyプログラミングにおいてもよっぽど役に立つし
Rubyを「使う」スキルが欲しいならRailsでWebサービスでも運営すれば嫌でも身に付く
言語の重箱の隅をつつくのは時間の無駄
0734デフォルトの名無しさん2015/02/14(土) 01:37:38.64ID:4ueOEeTW
特定の言語を自在に使えるようになりたいなら、
変に思えるかもしれないけど他の言語を2つくらい覚えるといいよ
言語の違いなんて大したことではないというのが理解できるとすごく視野が広がる
あんまり特定の言語に執着しないほうがいい
0735デフォルトの名無しさん2015/02/14(土) 10:04:33.41ID:3EPsJ3bR
>>731
エディタの対括弧表示見てりゃ間違えないよ
と言うか、括弧を足したり削ったりするときは
現在カーソル位置でなくてそっち見てるかも
0736デフォルトの名無しさん2015/02/14(土) 13:40:26.34ID:dTMvU3xT
>>728
Rubyのcaseはパターンマッチ(正規表現じゃないぞ)が使えないから、
関数型としては全くもって不足
0737デフォルトの名無しさん2015/02/14(土) 15:28:57.41ID:15MsuvIH
複数の変数を同時にできないだけでパターンマッチはできるでしょう
まあ複数できないことが大きな差かもしれんが
0738デフォルトの名無しさん2015/02/15(日) 10:28:43.99ID:SklWaN/q
Rubyらしい書き方として参考になるライブラリをご存知の方
教えていただけると助かります。
0739デフォルトの名無しさん2015/02/15(日) 10:46:38.75ID:ABT28a22
nokogiriとかああいう普通なのがいいんじゃない
DSLガ〜とかメタプログラミングが〜とか言ってるのは真似しないほうがいい
元々そんな変態言語ではない
0740デフォルトの名無しさん2015/02/15(日) 11:28:16.40ID:SklWaN/q
>>739
ありがとうございます。
Nokogiri読みやすそうなので参考になりそうです。
0741デフォルトの名無しさん2015/02/15(日) 12:50:33.82ID:wv9Dnfvm
>>711
正解でした、ありがとう。
なにしろRubyは始めたばかりで、ドキュメントの在り処も手探りなんですワ。
0742デフォルトの名無しさん2015/02/16(月) 03:56:38.95ID:Zn9bWbFW
Rubyのしくみ、2014

年末に出た外人の翻訳本で、
Rubyの実装系、Ruby1.9のRuby仮想マシンの本。
内容は新しく、Ruby2.0のキーワード引数まで含む

RubyVMは、笹田という日本人が作っていたんだね


2 + 3
2が主体となる数値オブジェクト(レシーバ)
'+'がそのオブジェクトのメソッド
3がそのメソッドの引数

左がオブジェクトで、演算子の左右で、意味が違うんだね。
つまり、関数の糖衣構文

(A + B + C + D).to_s
漏れが、あればよい機能と思うのは、
型の異なるオブジェクトを、幾つかつなげて、
簡単に文字列に変換できるもの
0743デフォルトの名無しさん2015/02/16(月) 04:44:23.59ID:cj2/WV/R
gemをオフラインでインストールしたいのですが、
ダウンロードしたフォルダに.rbばかりで.gemが入っていない場合、
どうすればよいですか?
0744デフォルトの名無しさん2015/02/16(月) 07:44:02.00ID:2rxNb6Sn
>>742
>(A + B + C + D).to_s
>漏れが、あればよい機能と思うのは、
>型の異なるオブジェクトを、幾つかつなげて、
>簡単に文字列に変換できるもの

'%s%s%s%s' % [A, B, C, D]
"#{A}#{B}#{C}#{D}"
0745デフォルトの名無しさん2015/02/16(月) 21:06:14.75ID:/Le2iIgb
>>732
せめて、OracleとLPICにしとけ
07466932015/02/16(月) 23:10:02.23ID:aIhcyWTg
正規表現の自習をしてるのですが
それなりに書けるようになってきたのに、以前として読みが厳しい・・・
自分で書いた正規表現も数日立つと・・読めないこともあったり
なにかコツありますか? 演算子の優先順位みたいなコツあるのかしら
0747デフォルトの名無しさん2015/02/16(月) 23:25:17.19ID:GiwwQ3NF
>>746
フクロウ本ポチったんじゃなかったのか
0748デフォルトの名無しさん2015/02/16(月) 23:32:23.50ID:bsos2N+l
コメント入れればいいんでない
07496932015/02/16(月) 23:34:38.96ID:aIhcyWTg
その節はお世話になりました。
ふくろうはちょっと重い(書きぶり)ので
別冊のドリル解きながらふくろうチラ見してる段階です。
0750デフォルトの名無しさん2015/02/17(火) 00:02:23.67ID:K0RsylMY
自分がつまずいた表現をその都度復習していけば違い将来きちんと読み解くことができるようになると思いますよ。
0751デフォルトの名無しさん2015/02/17(火) 01:22:40.02ID:Jv+uJpkb
>>742
[A, B, C, D].join
0752デフォルトの名無しさん2015/02/18(水) 09:40:42.56ID:49+iv0Kk
SASS専門スレが見当たらなかったのでここで質問させてください。
Windowsでsassをコンパイルすると、"\f012"のような文字を収めた変数が文字化けしたようになります。
変数を使用せずに直接スタイルに記述するとちゃんと"\f012"と出力されます。
私の環境のせいかもしれませんが、バックスラッシュがある文字に原因があるように思えます。
これを解消したいのですが、どうしたら良いでしょうか?
Rubyは1.9.3を使っています。


-- test.ssss
$test : "\f012";
.test {
content : $test;
}

-- compile.bat
set LANG=ja_JP.utf8
cmd /c C:\Ruby193\bin\sass %SCSS%\test.scss:%CSS%\test.css --style compressed --sourcemap=none

出力結果 => .test{content:"?"}   // ←これを content:"\f012" としたい
0753デフォルトの名無しさん2015/02/18(水) 15:17:15.21ID:KMXsePc+
>>752
https://github.com/sass/sass/issues/1395
unquoteを使えばいいらしい

$test1 : \f012;
$test2 : unquote(\f012);
$test11 : unquote('"') + \f012 + '"';
$test22 : unquote('"') + unquote(\f012) + '"';
.test {
content : "\f012";
content : unquote('"') + $test1 + '"';
content : unquote('"') + $test2 + '"';
content : $test11;
content : $test22;
}


文字化けの原因は
$test : "\f012"
をutf16leと解釈されるからみたい
たまらなんなこりゃ
0754デフォルトの名無しさん2015/02/18(水) 18:49:22.02ID:49+iv0Kk
>>753
ありがとうございます!
色々と試行錯誤してたのですが解決できなくて泣きそうでした。
無事に解決できました、本当に感謝です!
0755デフォルトの名無しさん2015/02/19(木) 02:24:04.45ID:lDFiAK4+
" ダブルクォートだと、#{}, \ などのメタ文字が、
特別に解釈されるんでしょ?

' シングルクォートか、ヒアドキュメントを使えば?
0756デフォルトの名無しさん2015/02/19(木) 08:45:11.80ID:oS1fF8P8
>>755
シングルクォートとか関係ない
せめて2つ上のレスくらい読んでから発言しよう
0757デフォルトの名無しさん2015/02/19(木) 11:18:05.36ID:iGdP7Vg9
target = "55 25659565564 56"

reg = /25(?=65)/,
/25(?=65)\d*/,
/(?=65)\d*/


reg.each{|ex|
puts target.match(ex)
}

結果
25
25659565564
659565564
先読みのあとに記述があると
この結果になるのはなぜでしょうか
0758デフォルトの名無しさん2015/02/19(木) 12:57:30.27ID:fdKBoaCS
どこを疑問に思ってるのかよくわからんけど
そのreg3つはそれぞれ以下のような意味だよ

・/25/ただし25まで読み込んだ時点でその先に65が続くもの
・/25\d*/ただし25まで読み込んだ時点でその先に65が続くもの
・/\d*/ただし先頭が65であるもの

先読みした部分は結果には入らないし、読み飛ばされもしない
あとは先読み以外の部分が結果として表示されてる
0759デフォルトの名無しさん2015/02/19(木) 13:32:07.49ID:iGdP7Vg9
/25(?=65)/
結果25で、65が除外されるのは理解できるのですが

/(?=65)\d*/ な場合
65が除外されずに 65....とマッチします

評価として点(・)を用いいます
(?=65)の時点で
25・659565564

25・6595.....
(?=65)の時点で一度65を除外してるが
\dにより 6595が読み込まれるので 65除外のあとから6595がヒットする 2565・95ではなく、25・6595の理由からって意味でしょうか
0760デフォルトの名無しさん2015/02/19(木) 14:10:36.73ID:00AGhhL1
厳密には違うが、除外はするが点は動かないのが先読み
0761デフォルトの名無しさん2015/02/19(木) 14:29:02.05ID:fdKBoaCS
言葉での表現は微妙だけど
たぶん考え方はあってると思うよ
先読みの場合は、点(・)の先に65があることを確認するだけで、点の位置は動かない
なので、その後に\d*とマッチする部分に65が含まれる

だからマッチに使われる(点が進む)ことを除外というのなら、先読みでは除外しないっていうことになると思う
0762デフォルトの名無しさん2015/02/19(木) 16:18:09.18ID:Q7B3YZ4l
http://qiita.com/a_ishidaaa/items/47a8459aa5fe5512871a
ほんとセマンティックバージョニングの意味ねえな
パッチアップデートで壊したわけじゃないだけマシか?
マシって何と比べてマシなんだ(自問)
0763デフォルトの名無しさん2015/02/19(木) 16:20:42.35ID:DC8iLU1G
ファイルを指定された回数だけ、一行ずつ読み込んで
そのあと同じファイルに、読み込んだ行数分を削除したいのですが、何かいい方法ありませんか?

例えば、
hoge.txt
1.れもん
2.いちご
3.りんご
4.ばなな
5.パイナップル

を2行分読み込んで削除

hoge.txt
1.りんご
2.ばなな
3.パイナップル
0764デフォルトの名無しさん2015/02/19(木) 16:43:02.17ID:Xd3keHXW
丸投げはいかんよ
0765デフォルトの名無しさん2015/02/19(木) 16:50:15.33ID:ra0CCNS1
構造上前を詰めるのはそのままじゃ無理なのはわかるべ
各行をリンクや配列にして新たに書くかシークしてまるまるコピーか
0766デフォルトの名無しさん2015/02/19(木) 17:03:30.07ID:00AGhhL1
横だが
>構造上前を詰めるのはそのままじゃ無理なのはわかるべ
ってどういうこと?
0767デフォルトの名無しさん2015/02/19(木) 17:08:06.98ID:ra0CCNS1
後ろを切るのは前の位置動かさないで済むけど、前を詰めるのに後ろを動かさないわけにはいかないって話
0768デフォルトの名無しさん2015/02/19(木) 17:17:55.65ID:00AGhhL1
なるほど、thx!
0769デフォルトの名無しさん2015/02/19(木) 23:24:09.47ID:/rXoqLFu
>>763
https://ideone.com/pyWQL9


実行例:
  $ ruby enum-drop.rb hoge.txt
  3.りんご
  4.ばなな
  5.パイナップル
  $

28行目のメソッド Enumerable#drop(n) を利用することがポイント
  http://docs.ruby-lang.org/ja/2.2.0/method/Enumerable/i/drop.html

なお Enumerable#drop はリターン値として配列(Array オブジェクト)を返すから、
入力データ(の行数)が膨大になるとメモリ効率が悪くなる
この問題は代わりに Enumerator::Lazy#drop(n) を使うと、行単位にオブジェクトが
生産/消費されるようになるから、メモリ効率を改善できる
  http://docs.ruby-lang.org/ja/2.2.0/method/Enumerator=3a=3aLazy/i/drop.html

具体的には、28行目のメソッドチェーンで drop の前に lazy を挿入するだけで終わる:
  ....(前略).... .each_line.lazy.drop(num). ....(後略)....

ただし Enumerator::Lazy は Ruby 2.0 で追加された組込みモジュールだから、
Ruby 1.8/1.9 で利用するなら enumerable-lazy という Gems パッケージが必要になる
0770デフォルトの名無しさん2015/02/20(金) 02:35:25.81ID:2YGngXGF
バグあり注意
0771デフォルトの名無しさん2015/02/20(金) 02:46:11.83ID:EBONnwDB
同じファイルに書き込むのは、ちょっと危険かも?
いったん違うファイルに書いて、
元のファイルを削除してから、renameする方が安全

行1,2,3,4 とあれば、上から順に、1行ずつ処理していく。
行1 → 読み込むだけで、データは捨てる
2 → 同様に捨てる

3 → 書き込む
4 → 書き込む
0772デフォルトの名無しさん2015/02/20(金) 03:04:50.52ID:h4oRuNjd
$ tail -n +3 hoge.txt | tee hoge.txt
$ tail -n +3 hoge.txt | sponge hoge.txt
0773デフォルトの名無しさん2015/02/20(金) 07:53:47.32ID:fEal40kx
こんなどうでもいいことに小細工して満足感以外の何が得られるんだ
0774デフォルトの名無しさん2015/02/20(金) 08:04:39.98ID:Qj8W36XI
rubyのブロックを引数にする関数がよくわかりません。
単に実行するだけのものを定義する時は
def my_func
  yield
end
みたいにしたり&blockというような引数を使うことはわかったのですが
open( "aa.txt", "r" ){ |file|
}

のopen関数のような、他の値も引数にもっていて、ブロックも引数を持っているような関数はどうやって作れば良いのでしょうか
もし良ければ教えて下さい
0775デフォルトの名無しさん2015/02/20(金) 08:11:05.65ID:pk2QnuVc
$ ruby -i -ne 'BEGIN{2.times{gets}}; print' hoge.txt
0776デフォルトの名無しさん2015/02/20(金) 08:26:35.79ID:KoZ8UZGe
>>774
普通にmy_funcf(普通の引数)にするだけ
ブロック引数は暗黙的に渡るので引数として明示的に宣言する必要はない
0777デフォルトの名無しさん2015/02/20(金) 09:40:29.75ID:2q5bsCKh
>>776
ありがとうございます。
さっそくためしてみます!
0778デフォルトの名無しさん2015/02/20(金) 13:47:34.06ID:NRgYnesQ
>>769
PythonスレになぜかRubyコード投下してたときも同じだったが
関数化して書くのならちゃんとFile.closeするかcloseが必要ないようにしなよ
再利用したときにハマるよ
0779デフォルトの名無しさん2015/02/20(金) 17:58:04.38ID:NOsWQdQa
>>769じゃないけど、File.openってブロック渡さないとcloseしないんだな
なんか変な動きするなーって思ってたらこれが原因だったわ
ためになった
07807692015/02/20(金) 19:50:56.52ID:8OUkX7Zl
>>778
指摘ありがとん
ということで、訂正してみた

https://ideone.com/0IemVC
0781デフォルトの名無しさん2015/02/21(土) 11:19:24.57ID:zv91iaBv
str_ary = File.read('File1').scan(/^=begin.*^=end/m)

# CR・CRLF 改行を、LF 改行に置き換える
str = str_ary[0].encode(:universal_newline => true)

str.each_line do |line|

end

漏れはこんな風に、File.read で、
1行ずつ処理しているが、なぜ、File.open を使うの?
0782デフォルトの名無しさん2015/02/21(土) 11:57:28.42ID:YnThFa9S
メモリ効率とか
メモリ所要量がファイルサイズに依存しないとか
小っさい小っさいファイルしか使わないんなら気にしなくていいよ
0783デフォルトの名無しさん2015/02/21(土) 15:44:56.37ID:K/x//vvW
メモリ圧迫するほど膨大なデータになったら自然とSQL使うんじゃないの?
0784デフォルトの名無しさん2015/02/21(土) 16:20:01.62ID:kawK2KK0
2~3GBのテキストファイルとかあるところにはある
そういうのは分割しろとは思うがDBに入れるべきかといわれるとそうじゃないと思う
0785デフォルトの名無しさん2015/02/21(土) 16:37:36.72ID:1ts2mUR/
そういう巨大なファイルを扱う用事ができたら、そのときに考えればいいよ
この程度の用事にメモリ効率とか考える方が時間の無駄

いまある用事に対してできることを最小限の労力でやるのが一番
「こういう用事もあるかも」を考えて設計するのは愚の骨頂、とDHHあたりも言ってた気がする
0786デフォルトの名無しさん2015/02/21(土) 17:05:47.11ID:T2DgAzdT
MacのRubyでVPKファイルが作りたいのですが、やり方が全く分かりません…
Ruby以前にコマンドやそういったものに関しても初心者で、このVpkツールをインストールするだけで一週間ほどかかりました…
VPKファイルフォーマットのパーサー
https://github.com/kimoto/vpk
本来Linux用に作られたものらしいのですが、Macでも使用できるとツールの作者が書いていました
まずVPKファイルの生成よりも展開のほうが簡単かと思い、試しにデスクトップにVPKファイルを置いて
require 'vpk'を書いてエンターを押すと-bash: require: command not foundと出ました
これは別に入力する必要のないものなのでしょうか?
続いてVPK::VPKFile.new("./path_to.vpk").extract_to("./")をやってみましたが
MacName:Desktop UserName$ VPK::VPKFile.new("./Users/UserName/Desktop/test.vpk ")を実行すると
-bash: syntax error near unexpected token `" /Users/UserName/Desktop/test.vpk "'と出て駄目でした
ちなみに、このツールを作った人は日本人でどのように使うかも日本語で説明しています

VPKファイルの展開
require 'vpk'
vpk = VPK::VPKFile.new("./VPKのパス.vpk")
vpk.extract_to("./どこに解凍するか")

VPKファイルをディレクトリから生成する
require 'vpk'
vpk = VPK::VPKFile.archive("./ディレクトリのパス")
vpk.write_to("./生成後のVPKのパス")

ここまで書かれていてまだ理解できません…誰か馬鹿にも分かるように説明して下さるかたいらっしゃいませんか…
0787デフォルトの名無しさん2015/02/21(土) 17:28:20.44ID:sa43Zcnr
>>786
require 'vpk'
VPK::VPKFile.new(ARGV[0]).extract_to("./")

と書いたファイルをvpktest.rbって名前でデスクトップに保存したらターミナルを起動して

$ cd Desktop
$ ruby vpktest.rb test.vpk

とかする(もちろんtest.vpkがDesktopにあるのが前提)
できればRubyとBashの入門書を一冊ずつ入手して勉強したほうがいい
0788デフォルトの名無しさん2015/02/21(土) 17:31:41.15ID:sa43Zcnr
ここまで書いてREADMEの一番最後に気がついた
Rubyスクリプト書かなくてもターミナルから次でいけるらいし
$ vpk -x ~/Desktop/test.vpk
0789デフォルトの名無しさん2015/02/21(土) 18:09:59.96ID:T2DgAzdT
レスありがとうございます…!vpktest.rbを作成して保存後
$ cd Desktop
$ ruby vpktest.rb test.vpk
をするとvpktest.rb:1: syntax error, unexpected $undefined, expecting '}'
{\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf400
^
と出ました
$ vpk -x ~/Desktop/test.vpkのほうは
/Library/Ruby/Gems/1.8/gems/vpk-0.0.2/lib/vpk.rb:162:in `extract_to': undefined method `write' for File:Class (NoMethodError)
from /Library/Ruby/Gems/1.8/gems/vpk-0.0.2/lib/vpk.rb:156:in `each'
from /Library/Ruby/Gems/1.8/gems/vpk-0.0.2/lib/vpk.rb:156:in `extract_to'
from /Library/Ruby/Gems/1.8/gems/vpk-0.0.2/bin/vpk:40
from /usr/bin/vpk:23:in `load'
from /usr/bin/vpk:23
これは成功してたのでしょうか…!? しかし展開後のフォルダのようなものはデスクトップに見当たりませんでした
787さんがおっしゃるように、最初に本を買って勉強しようと思います
それでも分からなかったらまた質問しにきます
ありがとうございました
0790デフォルトの名無しさん2015/02/21(土) 18:50:52.11ID:lQiGN8ke
>>789
パスの概念が分かってないようだから
gemを使って入れたらいいのでは?

$ sudo gem install vpk
// $ gem install vpk
$ mkdir -p ~/tmp/vpktest
$ cd ~/tmp/vpktest
$ mkdir hoge
$ touch hoge/testfile_{01..5}.txt
$ ls hoge
testfile_01.txt testfile_02.txt testfile_03.txt testfile_04.txt testfile_05.txt
$ vpk -c hoge
compressed hoge -> hoge.vpk
$ mkdir hoge_out && cd hoge_out
$ vpk -x ../hoge.vpk
extracted!: ../hoge.vpk

$ sudo gem uninstall vpk
$ gem uninstall vpk
0791デフォルトの名無しさん2015/02/21(土) 19:01:34.99ID:sa43Zcnr
>>789
それはおそらくライブラリ側でtest.vpkに対応できなくてエラーを吐いてる
そのライブラリのリリース後にフォーマットが変更されたりしてない?
test.vpkか他のvpkファイルをうpしてもらえれば調べてみるけど
0792デフォルトの名無しさん2015/02/21(土) 19:21:53.03ID:T2DgAzdT
>>790
ありがとうございます!
vpkツールのインストールはgemを使って入れました、後は教えてもらった通りにやってみましたが未知の世界すぎて…
MacName:~ UserName$ mkdir -p ~/tmp/vpktest
MacName:~ UserName$ cd ~tmp/vpktest
-bash: cd: ~tmp/vpktest: No such file or directory
MacName:~ UserName$ mkdir hoge
MacName:~ UserName$ touch hoge/testfile_{01..5}.txt
MacName:~ UserName$ ls hoge
testfile_1.txt testfile_2.txt testfile_3.txt testfile_4.txt testfile_5.txt
MacName:~UserName$ vpk -c hoge
compressed hoge -> hoge.vpk
/Library/Ruby/Gems/1.8/gems/vpk-0.0.2/lib/vpk.rb:178:in `archive': undefined method `binread' for File:Class (NoMethodError)
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/find.rb:39:in `find'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/find.rb:38:in `catch'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/find.rb:38:in `find'
from /Library/Ruby/Gems/1.8/gems/vpk-0.0.2/lib/vpk.rb:174:in `archive'
from /Library/Ruby/Gems/1.8/gems/vpk-0.0.2/bin/vpk:31
from /usr/bin/vpk:23:in `load'
from /usr/bin/vpk:23
0793デフォルトの名無しさん2015/02/21(土) 19:27:58.61ID:T2DgAzdT
規制で一つのレスに書ききれませんでした
MacName:~ UserName$ mkdir hoge_out && cd hoge_out
MacName:hoge_out UserName$ vpk -x ../hoge.vpk
not found specified file: ../hoge.vpk
MacName:hoge_out UserName$ vpk -x ../hoge.vpk
not found specified file: ../hoge.vpk
MacName:hoge_out UserName$ extracted!: ../hoge.vpk
-bash: : unrecognized history modifier
この文字列を保存しておいて、後でゆっくりどういうことか調べてみようと思います

>>791
ライブラリのリリース後にフォーマットが変更というのがよく分かりませんでした…すみません
このVPKツール自体2012年あたりに作られたものみたいなので、バージョンが古くて対応していないということもあるのかもしれません
ファイルはこれです
元々はvocalizev8.vpkというL4D2というゲーム用ファイルを、分かりやすいようにtest.vpkに名前だけ変えたものです
http://www1.axfc.net/u/3416997
0794デフォルトの名無しさん2015/02/21(土) 19:50:06.41ID:sa43Zcnr
>>793
うpしてもらったファイルは問題なく解凍できるみたい
RubyよりもBashの使い方勉強したほうがいいと思う
Amazonでシェルスクリプトで検索するとそれ系の本が出てくる

$ ls
test.vpk test.vpk.zip
$ vpk -x test.vpk
extracted!: test.vpk
$ ls
addonimage.jpg addoninfo.txt scripts test.vpk test.vpk.zip

$ irb
irb(main):001:0> require 'vpk'
=> true
irb(main):002:0> VPK::VPKFile.new('./test.vpk').extract_to('testdir')
[Ctrl+D]
$ ls testdir
addonimage.jpg addoninfo.txt scripts
0795デフォルトの名無しさん2015/02/21(土) 20:08:10.84ID:T2DgAzdT
>>794
わざわざ試してくれたんですか…ありがとうございます
Bashを先に学んだ方がいいのですね、頑張って勉強します

他の方も親切に教えてくださってありがとうございました
0796デフォルトの名無しさん2015/02/21(土) 21:00:28.05ID:sa43Zcnr
>>795
勉強するなら手始めにこことかよさそう(ぐぐったら出てきた)
http://www.pxt.jp/ja/diary/article/292/
がんばってねー
0797デフォルトの名無しさん2015/02/21(土) 23:01:02.82ID:sa43Zcnr
>>795
>>792でFile.binread(Ruby1.9から)ってメソッドがないって言われてるので
Rubyのバージョン上げたらあっさり動くかも
■ このスレッドは過去ログ倉庫に格納されています