・いつものエディタとターミナルという普段着でお越し下さい ・エディタ初めてならRubyスクリプトをを着色してくれる(できればオートインデントの)エディタ好きなの選べ ・いわゆるIDEはRubyの学習に際しては恐ろしくコスパが悪いのでRubyのためだけに新規導入するのはお勧めしない Q.XXX を使ってるんですが Ruby も覚えたほうがいいんでしょうか? A.好きにしろ ※RubyやRuby使いに対する不満や愚痴などは「Rubyについて」スレや「バトルロワイヤル」スレなどをご利用下さい
4 :
前スレ943 :2013/06/07(金) 00:48:53.67
>>1 乙
アリガトン
>>前スレ995
ハッシュからクラスへの移行には、手続き型脳からオブジェクト思考脳へという発想の転換が必要です。
大変だとは思いますが、自分に合ったペースで付いてきて下さい。なにか疑問があれば質問を。
なお、更新はまだまだ続く予定です....。
乙
前スレのこれね 「具体的には、芸能人ブログの画像を羅列するといったものなのですが、画像と記事URLを結び付けたいのですがむずかしいです。 ハッシュを使うにもキーを記事URLとすると同じキーがいくつも出来てしまいますし、二次配列もいまいちわかりません。」 983書いた者なんだけどそれに対してレスしそこねてスレ変わったのでここに書いておくよ ハッシュというのは要するにハッシュ配列のことだったのね こっちはハッシュ関数のことだと読んだので、一意の画像はないものと仮定(あったらそれを使い回し)して ハッシュ値とURLとを逆にすればいいだけじゃんと書いた まぁ全く同一の画像を複数の記事に使い回すケースもあるかもしれないけどさ
>>2 本屋行ったらたのしい Ruby の 4 版が出てた
それよりレシピブックの新版まだー
>>4 非常にありがたいです
オブジェクト思考は人間にわかりやすいと書いてありましたがぜんぜんそんなことないです(笑)
ついていかせていただきます
>>6 ハッシュ関数なるものがあるんですか 調べてみます
前スレ996のコードを更新しました。
http://play.island.ac/codepaste/code?id=1532 これまでのコードはどれも計算結果をメモリ上に保持していたので、
プログラムが終了するたびにその計算結果は消失していました。
今回の変更では、blogオブジェクトをディスクへ保存/読み込みできるようにします。
実装方法としては、前スレ982で紹介されていた標準ライブラリ pstore を利用します。
== 主な変更点
* クラス Model::Store を追加(これは PStore のサブクラスです)
この変更により、Webアプリケーションとして「とりあえず動く」という
試作品(プロトタイプ)のレベルに到達できたのではないかと思います。
モデル(Model)はできたので、あとはビュー(View)とコントローラ(Controller)、
そしてRSS取得処理が用意できれば、アンテナサイト開発にとって最初の一歩になるでしょう。
Rails使いなら ActiveModel を使うのが簡単かもしれないし、
あるいは前スレ#973で紹介があったHaml(ビュー?)とSinatra(コントローラ?)も面白そうです。
次回は、写真の重複問題について検討する予定です。(正直に告白すればバグ対策です....)
>>10 ありがとうございます
MVCってやつですね RSS取得は既存のrssライブラリで簡単でした
仕様上重複はないのですがありがたいです よろしくおねがいします
(
>>10 への追記)
クラス PStore には(ハッシュと同様に)キーで複数のオブジェクト(=値)を管理できるので、
今回の変更では、ついでに複数blogサイトにも対応させています。
また、コードの先頭にあるコメントについて、以下の行を書き漏らしていました。
<Store> = { <Blog> }.
5行目の後に挿入されているものとして見てください。
>>8 >オブジェクト思考は人間にわかりやすいと書いてありましたがぜんぜんそんなことないです(笑)
今回のケースで言えば、手続き型脳だと、
(1) まず最初にアンテナサイトの「データ構造」についてHash や Array で構成することを考え、
(2) 次にそれらを push や concat といった操作を if や each で組み合わせて「手続き」を考えます。
この思考手順は、Perl や Python といった手続き型言語では極めて常識的なプログラミング法です。
それに対してオブジェクト思考脳だと、
(1) まず最初に、アンテナサイトという主題(subject)からブログ/記事(エントリ)/写真といった
抽象的な概念(concept)を洗い出すことを考えます。
(2) 次に、それら概念に付随する属性(attribute)が何かを洗い出し、クラス(class)として具象化(reify)させます。
(3) そしてようやく最後に、クラスの内部で必要な Hash や Array といったデータ構造や操作(=手続き)を考えます。
こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト思考分析/設計)です。
データ構造や操作を考えるよりも前に、(1)と(2)の主題の分析(analyze)という手順が必要となるのですから、
オブジェクト思考が難しいのはごく当たり前の話だと思います。
「手続き型脳」では、課題を与えられるといきなりコンピュータに向かい、ゴリゴリとコードを書いていきます。
その姿はきっとカッコいいプログラマに見えるでしょうし、自身も言語を自在に操っている満足感が得られます。
これはワンライナーやせいぜい数百ステップ程度の使い捨てプログラム、あるいはアルゴリズムの勉強等といった
多くの局面では(特に初心者では)、決して間違いであるとは言えません。
でも今回のアンテナサイトのような(ある程度)実用性のあるソフトウェアを開発しようとするのであれば、
いきなりコードを書き始めるのではなく、じっくりと思索にふけることが必要になるでしょうし、
その時に(上で述べた)「オブジェクト思考脳」を育てるトレーニングを心がけ、初心者の壁を乗り越えませう。
>>13 を一部訂正
X: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト思考分析/設計)です。
O: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト志向分析/設計)です。
>>13 なるほど すげーわかりやすいです
まずは作りたいものの設計をつかむ。大事なことですね
がんばります
>>17 かなりの分量がありますね。落ち着いたら全部読みたいです。
わかりました。部分的に読んでみて設計を考えます。
よそでやれ
21 :
デフォルトの名無しさん :2013/06/11(火) 07:08:06.91
WinXP-ProでRuby1.8.6を使用 PowerPointは2000と2010 PowerPoint(PPT) にWin32OLEを適用して、選択したオブジェクト(図柄,文字列)の 参照を取りたく思います。 例えばある位置にURLリンクを持つ図柄S01,S02があったとき ← [ URL1 ] [ URL2 ] S01を選択するとDOSプロンプト側に 位置 100,200 の URL1 の図柄を選択しました と表示したくおもいます。 ※PPT側のオブジェクトはVBでは PowerPoint.Slide.Shapesで参照できるようです。 宜しくお願い致します。
22 :
21 :2013/06/11(火) 07:32:02.31
(追記)
中途半端な書き込みになりゴメンなさい。
質問は、
>>21 を実現するためのヒントとなるようなサンプルまたは
サイトをご存知ないですか? ということです。
PPTの各図柄(オブジェクト)には名前を付けられないので、代わりに
それらが持つリンクURLを参照したく思います。
>>10 のコードを再更新しました。
また、約600ステップと全体像の把握が難しい規模になってきたので、自動生成した文書も公開します。
http://play.island.ac/codepaste/code?id=1534 http://www.h6.dion.ne.jp/~machan/tmdoc/example/Blog.book/html/ 今回の変更の目的は
>>10 の最後で書いた「写真の重複問題」ですが、その前にちょい大きめの変更もあるので、
先にそれを説明します。
* 概念の名称「エントリ(entry)」をより具体的な「記事(aticle)」へ変更しました
* データ型検査処理(kind_of?)について、少し昔に書いた表明ライブラリ(assertion.rb)を利用するようにしました
さて本題の重複問題ですが、重複の対象は写真だけでなく、ブログ(blog)/記事(aticle)/写真(photo)で起こりえます。
そこで、重複問題の解消手段として「キーによる索引化を伴うソートされた集合」を表現する抽象クラス
Collection を定義し、その具象クラスとして記事コレクション(Aticles)と写真コレクション(Photos)を定義します。
Collectionの内部(実装)はハッシュであり、URLをキーに記事オブジェクト(Aticle)および写真オブジェクト(Photo)を
値としてURLからオブジェクトへの写像を管理しています。
また、重複の解消処理の詳細は、コレクションの生成(Collection#initialize)時およびコレクションへの
オブジェクト追加(Collection#add!)時にメソッドへ渡すブロックで指定します。これらの具体的な箇所を列挙します。
* #272: Blog#each -- 写真オブジェクトの生成
* #320: Blog#update_aticle! -- 記事オブジェクトの追加
* #352: Blog#add_photo! -- 写真オブジェクトの追加
* #451: Aticle#add_photo! -- 同上
次回の更新では、クラスの継承を検討します。これは
>>17 の分析で残った「分類中心設計(外延で定義)」の部分です。
なお、更新は次回で終了する予定です。
よそでやって
>>21 やろうと思えばできなくも無いかも知れんがどうしてrubyで?
27 :
21 :2013/06/13(木) 20:34:02.46
>>26 Win32OLEの実施体験がRubyでしか今のところないから
VBAで作ってみて動いたらRubyに変換すればよい
>>23 のコードにバグが見つかったので、再々更新しました。(修正量は、ほんの少しだけ)
http://play.island.ac/codepaste/code?id=1535 http://www.h6.dion.ne.jp/~machan/tmdoc/example/Blog.book/html-r1.27/ 現象: ブログと記事の間で写真が重複したブログを列挙した時、順序番号が不連続になる(#1397-1401 を参照)
対策箇所: Blog#each -- #264
最後に
>>23 について、訂正と追加補足(2点)があります。
X: * #272: Blog#each -- 写真オブジェクトの生成
O: * #272: Blog#each -- 写真コレクションの生成
* ブログ間の写真重複、つまりあるブログと別のブログとの間で発生した写真の重複は解消されません。
* 概念上だとストア(store)はブログのコレクションですが、実装上は PStoreのサブクラスです。
つまりクラス Store は抽象クラス Collection の具象クラス(=サブクラス)ではありません。
このためストア内でのブログ重複に対して、更新(Store#update_blog!)時に固有の解消処理を実装しています。
またソートされた集合ではないため、列挙(Store#each)時にブログの順序性は保証されません。
Windowsのを操作したかったらVBAなりC#なり使えばいいよね Rubyでやる理由なんてないわ
すみません、3日間やってるのですが解決策が分からず質問させて下さい。 検索結果から取得する2種類のデータをtitleと descriptionのセットしてデータベースに保存したいです。 eachとかも色々やったのですが、titleだけ取得したぶん入りますがdescriptionが 今度は同時に入れられなかったり… q_results = Nokogiri::HTML(open(q_strings)) arr_title = q_results.xpath('//li[@class="g"]//h3[@class="r"]').map do |node| node.text end arr_desc = q_results.xpath('//li[@class="g"]//div[@class="st"]').map do |node| node.text end hash = {"title" =>arr_title, "desc" =>arr_desc} hash["title"].map do| node | t = node record_g = T_result.new( :product_name => t, #:product_desc => hash["desc"], ) record_g.save end
こんな書き方でも試しているんですが、入ってる結果は2レコードで 確かにDBへ保存されています、ですがarr_descがこれだと入れられず… for t in arr_title T_result.create:product_flag => 0,:product_name => t end 多分やり方としてtitleレコードを一度参照させて該当すればフィールドに値を追加する と言う様な処理を書けばやろうとしている事は実現出来るのかなと考えているのですが、 多分凄い初歩的な何かが分かっておらず普通は1レコードに一回で突っ込めるはずだと…
T_result が何かわからないとなんとも言えない
>>33 さん
すいません、DBへの接続はActiveRecordをrequireしています。
Rails本体は使ってません。
Google 検索の結果について処理してるんだとして desc が入ってるのは div[class=st] ではなく span[class=st] ではないだろうか とりあえずこんなのでどうだろ(CSS セレクタの使い方間違ってるかも) require 'nokogiri' html = Nokogiri::HTML(open(...)) items = html.css('li[class=g]') items = items.map do |item| [item.css('h3[class=r]').first.text, item.css('span[class=st]').first.text] end items.each do |title, desc| T_result.new(:product_name => title, :product_desc => desc).save end
>>35 さん
ありがとうございます。早速試してみましたがやはりproduct_descフィールドは
空っぽでした。。。またなぜか.textの箇所がundefined methodと呼ばれました。。。
putsでは値は取れてたので大丈夫だったのですが、う〜ん、、、もはや素人過ぎて
次何を試せばいいのかも八方塞がりです…
ただ配列の中に処理を書いて更にそれをカンマで連結可と言うのは初めて知りました。
何かここにも大きくヒントがあると思いますので理解出来る様勉強したいと思います。
>>35 さん
度々すいません、descが空っぽだったのはspanの箇所が引っかかっていた様で
div[classに変えたら中身が入っていました。。。!
# ご教示頂いた方法で .text はエラーになる為外した状態
[ item.css('h3[class=r]').first,item.css('div[class=st]').first ]
# DBフィールド状況
product_name / !ruby/object:Nokogiri::XML::Element{}
product_desc / !ruby/object:Nokogiri::XML::Element{}
ただ.textが使えない事でDB内へ保存された際に上記の様な形になってしまい、配列の所で .text に
しない限り解消出来ない気がしており配列の中身に更に手を加える方法と言うのがあるのでしょうか。
.text がエラーになるってことは nil に text でも呼んでるんじゃないの? とりあえずこちらで再現するために環境と検索に使った URL を示してくれないか
putsは文字列を表示するメソッドであって、デバッグ用途でオブジェクトの中身を確かめるメソッドじゃない 文字列(String)であるということが確実にわかっているのではない限り(あるいはわかっていても)通常はpを使う irb> obj = [1] irb> puts obj 1 irb> p obj [1] objは文字列ではなく整数の配列(と考えていいと作者に言われているオブジェクト)だということがわかる putsではなくpを使うようになると対象オブジェクトが(たいていの場合)はっきりするので「なぜか」じゃなくなる nil、空文字列、空の配列、空の文字列が入っている配列、nilが入っている配列、そういったものが区別できる とりあえずデータベースに入れて確かめるのはやめとけ 絶対完全に間違いのないオブジェクトが得られる確証ができてからおもむろにデータベース部分のスクリプトを書き始めろ
>>40 その URL で試したけど div[class=st] では拾えない。空の NodeSet が返ってくる
div[class=st] で拾えることを確認したコードを貼ってくれないか
require 'nokogiri'
require 'open-uri'
url = "
https://www.google.co.jp/search?ie=UTF-8&oe=UTF-8&q=ruby "
doc = Nokogiri::HTML(open(url))
divs = doc.css('div[class=st]')
spans = doc.css('span[class=st]')
p divs.class, divs
p spans.class, spans
>>38 さん
すいません、ご報告があります。
# エラー:`block in <main>': undefined method `text' for nil:NilClass (NoMethodError)
> .text がエラーになるってことは nil に text でも呼んでるんじゃないの?
と言う事でメソッドが定義されてないというエラーメッセージが当初よく理解出来ていなかったのですが、
>>38 さんからご指摘頂いた事でnilだとtextがundefined methodエラーになるって事か、、、
と考え今度
>>39 さんに言われたpで出力し試していった結果当初
>>35 さんから頂いた内容で
titleもdescも取得する事が出来てました。。。
只Rubyの公式リファレンスでArray箇所をずっと調べたりもしていたのですが配列の値をそもそも式で埋め、
更に.first等で繋ぎ取得させるというような記述例が見つけられず全く検討がついてませんでした。
絶対的な経験不足はあるのですが、何かもし他に今のレベルじゃここ読め!
みたいなのがあったら是非教えて頂けると幸いです。。。
(....
>>43 の続き)
ここで、この記述を「集合の外延的定義」とみなして各集合間の「交わり(intersection)」を考えると、
まず最初に属性 "url" を要素とする積集合が容易に発見できます。
{ "url" } = <Blog> ∩ <Aticle> ∩ <Photo>
これら積集合(等式の左辺)と三つの集合(同右辺)を部分集合とする全体集合を「ブログの構成要素(Component)」という
抽象的な概念で命名します。
Component = { "url" } ∪ Blog ∪ Aticle ∪ Photo
Blog = { "title", "seq_counter_of_aticles", "seq_counter_of_photos", <Aticles>, <Photos> }
Aticle = { "title", "seq_num", "seq_counter_of_photos", <Photos> }
Photo = { "seq_num" }
さらに他にも交わりがないか見ていくと、
{ "url" } ∪ { "title", "seq_counter_of_photos", <Photos> } = Blog ∩ Aticle および
{ "url" } ∪ { "seq_num" } = Aticle ∩ Photo という二通りの交わりを発見できますが、
ここでは共有できる属性数が多い前者を採用し、これを「ブログのコンテナ(Container)」という抽象的な概念で命名します。
Component = { "url" } ∪ Container ∪ Photo
Container = { "title", "seq_counter_of_photos", <Photos> } ∪ Blog ∪ Aticle
Blog = { "seq_counter_of_aticles", <Aticles> }
Aticle = { "seq_num" }
Photo = { "seq_num" }
(次レスへ続く ....)
(....
>>43 の続き、これで終わり)
これら集合間には、以下に示す「互いに交わりのない部分集合(nested set)」関係が存在します。
Component ⊃ Container, Component Photo ⊃, Container ⊃ Blog, Container ⊃ Aticle
http://www.h6.dion.ne.jp/~machan/tmdoc/example/Blog.book/subset.png 最後に先頭の継承の定義で述べた「継承 = 部分集合関係」に従って各集合をクラスへ置き換えると、継承階層が完成します。
前回(
>>29 )と比較すると各クラスの定義が簡潔になり、クラスの責任分担がより明確になったのではないでしょうか?
長々とカキコ連投を続けてきましたが、質問等の反応が無ければこれで終了です。スレ汚し失礼しました。
>>41 さん
ありがとうございました。前回確かにspanでエラー出ておりdivにして確認出来たのに、仰る通り
今nilです。色々コード書き換えてる間にどさくさに紛れて出ていたのを勘違いしていたかもしれません。
そこで思い出して書いたところ以下で取得出来てたので途中でこんな事してしまっていた可能性が高いです。
arr_title = q_results.xpath('//li[@class="g"]//h3[@class="r"]').map do |node|
node.xpath('//div[@class="st"]')
node.text
end
p arr_title
結果的にこれだと 処理内で p node.text 等して処理中に出力しない限り、検索結果全部掘りきれずに
どうやってtitle desc 出力された結果をそれぞれ結合してやればいいんだろうなと悩んでいたのを思い出しました…!
そこで一度hashの形にしてみたいなやり方を試したいた経緯がありました。
>>46 おぉぉ有り難う御座います!今まで見た事ありませんでした。
早速熟読したいと思います。
>>45 おつかれさまでした ありがとうございました
>>45 さんのものより随分ちんけな形で完成したので、参考にしてグレードアップさせたいと思います
ありがとうございました
>>49 時間はかかるかもしれませんが、自分のペースで理解を進めていってください。
直感的なプログラミングを否定しているわけではなく、理屈と実践を反復することが大切です。
最後に、別スレへカキコした内容をコピペして終わります。がんばってくださいね。
> 235 名前: デフォルトの名無しさん Mail: sage 投稿日: 2010/09/22(水) 01:12:40
>
>>232 > それでいいんじゃないかと。自分はF#は使ってないから一般論になってしまうけど、
> 理屈先行型の頭でっかちもダメだし、結果的に動くプログラミングしかできないのもダメ。
> 関数型言語の勉強という理屈とプログラミングという実践を繰り返し続けること、
> 言い換えると「抽象化(理屈) <-> 具体化(実践)」の反復プロセスが大切だと思う。
>
> その全体像は螺旋階段(スパイラル構造)のようであり、成長度の傾きはごく緩やかで、
> 暗闇の中で階段を一歩一歩上ることは焦りや不安が常につきまとうものだけど、
> ある時、ふと下界を眺めてみると、過去の自分が別人のように見えることに気付く。
> 自分の経験になるけど、新しいパラダイムの勉強と成長とは、そんなものだと思う。
p の出力をファイルにリダイレクトすると動きが遅くなってしまいます。 何故なのでしょうか? Windows7 32bitでRubyInstaller最新版です。 再現方法 1) 以下をファイルtest.rbに保存する。 100.times do p 'ABC' end 2) コマンドプロンプトを起動して実行する。 > ruby test.rb ===> 一瞬で終わる > ruby test.rb > tmp.txt ===> なかなか終わらない > ruby -e "100.times do p 'ABC' end" > tmp.txt ===> 一瞬で終わる
またsync案件か コマンドプロンプトは不安定っすなー
53 :
デフォルトの名無しさん :2013/06/20(木) 21:46:10.28
rubyでゲーム開発勉強してるんですけど移動のさせ方などの情報はのっていてもスクロールとかそういう詳しいところを解説してくれてるサイトが見つかりません 書籍とかならそういうのが書いてる奴があるのでしょうか おすすめのサイトなり勉強法があったら教えてください 今使ってるライブラリはDXrubyですがそれ以外でも大丈夫です ruby自体はある程度勉強しました
オリジナルの××システムで○○と書くところをRubyの××接続ライブラリではRubyを交えて△△と書く という手順を経るので、元の××システムの勉強が必要 元の××システムを知らなくても××接続ライブラリが使えるということはぜんぜんない DXRubyの場合はDirectXとWindowsAPIだね
56 :
デフォルトの名無しさん :2013/06/21(金) 14:08:18.59
54さん 回答ありがとうございます スクロールというのは一例でそういうのがまとまって乗ってるサイトが知りたかったんです 言葉が足りなくてすいません 55さん とういうことは初めてゲームプログラミングをするならrubydxを学ぶよりdirectxとかを先に学んだ方がいいってことでしょうか
さくらのレンタルサーバーでTwitterBotを作ろうとして
http://d.hatena.ne.jp/arng/20130322/1363882297 上記のサイトを参考にして環境を構築したところ、テストで直接実行して投稿時に
http.rb:799:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (Twitter::Error::ClientError)のようなエラーがでました
解決作はCA証明書をどうにかするらしいですがさくらサーバーでの具体的な解決策は
わかりませんでした どなたかご教授頂けないでしょうか
58 :
デフォルトの名無しさん :2013/06/23(日) 17:16:06.32
認証が可能なルート証明書を探してきて(curlあたりが持ってるんじゃね?)、 Net::HTTP#ca_file = に設定する。 間違っても verify_mode = OpenSSL::SSL::VERIFY_NONE になんてしないように。
ruby初心者です。 コマンドで実行する時にruby a.rb 1とか指定すると1という値が渡せますが 例えば'あああああ[ここ]あああああ'の[ここ]の部分に代入することはできますか? ※置換ということではないです
コマンドライン引数は ARGV で取れるから 式展開で "あああああ[#{ARGV[0]}]あああああ" ARGV[0] に a.rb でなく 1 が入るのと展開するときはダブルクォートを使うのに注意
>>60 ありがとおあああああああああああああああ
質問です。 「a」という文字をCP932からEUC-JPに変換したいのですが、うまくいきません。 この文字はEUC-JPでは「0xFB 0xA6」ですが、変換すると「0x8F 0xCB 0xEA」になってしまいます。 変換に使用しているソースコードは下記の通りです。 使用しているバージョンは1.9.3と2.0.0です。 #coding: cp932 p "a".encode("euc-jp").bytes.map{|i| "%02x" % i} #=> ["8f", "cb", "ea"] (異常) p "山".encode("euc-jp").bytes.map{|i| "%02x" % i} #=> ["bb", "b3"] (正常) よろしくおねがいします。
自己解決できそうです。 EUC-JPの文字符号化方式には、「CP51932」と「eucJP-ms」というのがあって、 「a」は前者では「0xFB 0xA6」、後者では「0x8F 0xCB 0xEA」になるみたいです。 Windowsでは前者を使用しているみたいですが、 Rubyでは後者に変換してくれちゃってるみたいです。 うーん。面倒くさい・・・ ありがとうございました。
64 :
デフォルトの名無しさん :2013/06/25(火) 21:36:56.70
バグの可能性もあるから報告してみたら?
65 :
63 :2013/06/26(水) 19:37:10.32
encodeメソッドに「CP51932」を指定できました。 ふええ・・・別の方法で対処した後に知ったよう・・・ #coding: cp932 str = "a" p str.encode("cp51932") #=> "\x{FBA6}" p str.encode("eucJP-ms") #=> "\x{8FCBEA}" p str.encode("euc-jp") #=> "\x{8FCBEA}"
66 :
デフォルトの名無しさん :2013/06/28(金) 11:23:21.08
uyなんですけど ruby2.0でmechanizeが上手く入らないんですけど
67 :
デフォルトの名無しさん :2013/06/28(金) 11:56:28.95
nokogiriもダメなんですけど
68 :
デフォルトの名無しさん :2013/06/28(金) 12:05:46.79
rubyもまだまだですね
String#encodeってんなバイト列しらんだの変換できんだの文句たれてまともに変換できなくね? 結局NKFつかってる。
日本語を含みうる文字に関しては変換はほぼ妥当にできる ただし、変換元のバイト列のエンコーディングと変換先のエンコーディングに関して大雑把にでも理解指定できているということが大前提 申告に虚偽があっても勝手に不可逆変換して情報を取り戻せなくなるNKFなんかよりはよっぽど誠実 ただしとても使い辛い 想像や無知で申告されたエンコーディング名をそのまま使うとほぼ確実に変換失敗する(HTMLのmeta charset名とか、「○○だから××だろう」とか) これは「世の中が悪い」んではあるんだけども まあエラーで止まってくれるんだったらその情報を頼りにエラー回復処理すればいいじゃん
pythonいいよね
自分はpythonの文字列処理のたびに例外に面食らったが
この板で馬鹿には無理と言われて勉強し直して覚醒したよ
>>70 の言うように勝手に暗黙の変換してデータ壊すより
エラーで止まってくれた方がよほど誠実だと納得した
は?
Ruby1.9 でsqlite3 を叩いているのですが、 ソースをutf8で書いていて、varchar型ににASCIIデータをを格納しようとしたところ、 ascii-8bit扱いになって実態参照でDBに格納されるので、encode("ascii")の連呼になってしまい。。
BLOBになる話かと思ったら違った SQLite3にはvarcharなんて気の利いたものはないぞ、拒否らないだけで sqlite3-rubyは返されるデータオブジェクトにエンコーディングを設定しない 設定しないってことはBINARY、Rubyで言うところのASCII-8BITだ エンコーディング情報のない文字列にエンコーディングを設定するのは道理
75 :
デフォルトの名無しさん :2013/07/11(木) 01:27:06.76
unkonown仕様文字列
勝手にUTF-8とかで返すと海外の人が怒るからこうなってるという説
db open時の引数にcharset=が指定できるとありがたく。。
78 :
デフォルトの名無しさん :2013/07/11(木) 08:34:33.20
ところでこの場合 encode(バイト列を変換する) ではなく force_encoding(エンコーディング情報だけ付け替え) ではないかい?
rubygems はしょうもないライブラリを登録しても怒られませんか?
特等席な名前でなければ気にされることはないと思う
特等席ネームかどうかなんて個人の主観だろ だれも目をつけてない名前で登録して あとからそれだめって言われてもな
たとえば "db" とか、どう見ても、って感じの名前はあるだろ
ruby-helloworld
84 :
79 :2013/07/13(土) 13:28:20.40
ありがとうございます。 特別な名前でもないので思い切って登録してみます。
宝石がまたひとつ増えた
Tkのスレで聞いた方がいいかも知れないけど、 フレームをdestroyする時パックされてるボタンも一緒にdestroyされますか? 何か残骸みたいのが残ってたら気持ち悪いので
87 :
デフォルトの名無しさん :2013/07/17(水) 16:50:43.33
自力で解決できず行き詰っています。 どこが悪くてどうすればいいのか、どうか教えて下さい。 プログラムの目的:ニコニコ動画にログインする。 OS:Windows7 Ruby2.0.0を使っています。 (続きます)
88 :
デフォルトの名無しさん :2013/07/17(水) 19:41:35.84
(続き) require 'mechanize' agent = Mechanize.new url = 'ニコニコ動画のURL' page = agent.get(url) next_page = page.link_with(:text => 'login').click next_page = page.form_with(:name => 'mail' 'password') do |form| form.mail = "自分のメールアドレス" form.password =自分の設定したパスワード end.submit これに出たエラー↓ ファイル名:8:in `<main>': undefined method `click' for nil:NilClass (NoMethodError)
Mechanize 知らないのだけど page.link_with(:text => 'Login') だったりして
require 'mechanize'
mech = Mechanize.new
mech.user_agent_alias = 'Windows IE 7'
mech.ssl_version = 'SSLv3'
login = mech.get("
http://www.nicovideo.jp/login ").forms[0]
login['mail'] = @mail
login['password'] = @password
login.submit
あれ? cant_loginになるな
91 :
87 :2013/07/17(水) 20:28:30.01
>89 'Login'にしてみたらまた違うエラーになってしまいました・・・ エラーメッセージが長くてここに書けなそうです
92 :
87 :2013/07/17(水) 20:32:19.74
>90 私も試してみましたが、また長いエラーメッセージが出ちゃいました
93 :
デフォルトの名無しさん :2013/07/17(水) 21:56:36.03
とりあえず、
>>88 の link_with(:text => 'login') はサンプルか何かの丸コピーで、
意味を把握してない疑いが…
標的となるフォームの構造は
<dt><label for="mail">ログインメールアドレス/電話番号</label></dt>
<dd><input id="mail" name="mail_tel" type="text" class="txt"></dd>
だからな。
94 :
87 :2013/07/17(水) 22:22:58.68
>93ここを参考にしました ownway.info/Ruby/index.php?mechanize%2Fabout
こんなんでいける?
>>90 を参考にさせてもらいました
require 'mechanize'
ua = Mechanize.new do |mech|
mech.user_agent_alias = 'Windows IE 7'
mech.ssl_version = 'SSLv3'
end
homepage = ua.get("
http://www.nicovideo.jp/ ")
loginpage = homepage.link_with(:text => "Login").click
loginpage.form_with(:action => "
https://secure.nicovideo.jp/secure/login?site=niconico ") do |form|
form["mail_tel"] = MYMAILADDR
form["password"] = MYPASSWD
end.submit
# p ua.page
96 :
87 :2013/07/17(水) 23:02:50.24
>95 また長いエラーメッセージが出ちゃいました
>>96 なんてエラーメッセージ?
個人情報伏せたうえで pastebin とかに貼ってもいいよ
98 :
87 :2013/07/17(水) 23:47:25.61
エラーメッセージはこれです。 C:/Ruby200/lib/ruby/2.0.0/net/http.rb:918:in `connect': SSL_connect returned=1 e rrno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL ::SSL::SSLError) (続きます)
99 :
87 :2013/07/17(水) 23:51:34.63
(続き) from C:/Ruby200/lib/ruby/2.0.0/net/http.rb:918:in `block in connect' from C:/Ruby200/lib/ruby/2.0.0/timeout.rb:52:in `timeout' from C:/Ruby200/lib/ruby/2.0.0/net/http.rb:918:in `connect' from C:/Ruby200/lib/ruby/2.0.0/net/http.rb:862:in `do_start' from C:/Ruby200/lib/ruby/2.0.0/net/http.rb:857:in `start' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/net-http-persistent-2.8/lib/net /http/persistent.rb:628:in `start' (続きます)
101 :
87 :2013/07/18(木) 00:03:22.24
(続き) from C:/Ruby200/lib/ruby/gems/2.0.0/gems/net-http-persistent-2.8/lib/net /http/persistent.rb:570:in `connection_for' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/net-http-persistent-2.8/lib/net /http/persistent.rb:926:in `request' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/mechanize-2.7.1/lib/mechanize/h ttp/agent.rb:257:in `fetch' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/mechanize-2.7.1/lib/mechanize/h ttp/agent.rb:974:in `response_redirect'
102 :
87 :2013/07/18(木) 00:08:48.62
(続き) from C:/Ruby200/lib/ruby/gems/2.0.0/gems/mechanize-2.7.1/lib/mechanize/h ttp/agent.rb:298:in `fetch' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/mechanize-2.7.1/lib/mechanize.r b:431:in `get' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/mechanize-2.7.1/lib/mechanize.r b:330:in `click' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/mechanize-2.7.1/lib/mechanize/p age/link.rb:30:in `click' from ファイル名.rb:9:in `<main>' (終わりです)
103 :
87 :2013/07/18(木) 00:24:14.51
>>100 ありがとうございます。今度はエラーが出ませんでした!
エラーが出なかったということは、成功で良いのですよね?
確認する方法が分からないので少し不安ではありますが
サイト構造(HTML的な意味も含めて)を理解してないと辛い いわゆるモダンブラウザが自動でやってる手順の多くを手動で書かないといけないからね で、今なにやってるかというと、サイト利用のためにログイン済みクッキーが必要なので、 ログインページでログインしてMechanizeにクッキーを持たせてるんだ Mechanizeオブジェクト(の、中)にクッキーが書き込まれてるので、そのままトップページや動画を読み込んでみればいい たとえばトップページならユーザー名がHTMLに埋め込まれて送られてきているはず ログイン失敗ならそのようなHTMLが送られてきているはず 余談だけどクッキーを外部保存して再利用することはニコ動ではおすすめできない(他のサイトでは可能) これはサイト側の制限で、こちらではどうしようもない
105 :
デフォルトの名無しさん :2013/07/18(木) 10:02:07.58
そうだぬ 二重管理だと看做されると 強制ログアウトさせられるぬ
>>86 下の階層ごとdestroyされるはずだけど
質問するまでもなく、自分でやってみたらいいんじゃないのかな
require 'tk'
f=Tk::Frame.new(background:'#FF8080',padx:5,pady:5).pack
Tk::Label.new(f,text:'LABEL').pack
Tk::Button.new(f,text:'BUTTON').pack
Tk::Button.new(text:'destroy frame',command:->{f.destroy}).pack
Tk::Button.new(text:'exit',command:->{Tk.root.destroy}).pack
Tk.mainloop
srand("test")とかやりたいんですけど string->bignumに変換する良いやり方教えてください
irb> "test".unpack('C*').inject(:*) => 156291440
偏りたくない人向け irb> require 'digest/md5' irb> Digest::MD5.hexdigest('test').to_i(16) => 12707736894140473154801792860916528374
111 :
デフォルトの名無しさん :2013/07/20(土) 11:46:03.30
SecureRandomの出力を種に使うという贅沢な選択は…
特にセキュリティが絡むわけでもないんですが MD5版使わせてもらいます ありがとうございます
初歩的ですまんです arr=["aaa","aab","aac", ...... ] とい文字でできた長〜い配列から 1つおき、2つおきに取り出してくるようなメソッドてありますか? 普通にループの処理を書いたほうがいいでしょうか。 (数字が並んでたら、select{}のなかに式を書いてでできることはわかりました。)
def choice(arr, n) arr.select { |x| x % (n + 1) == 0 } end a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] choice(a, 1) => [0, 2, 4, 6, 8] choice(a, 2) => [0, 3, 6, 9] choice(a, 3) => [0, 4, 8]
arr.each_slice(N).map{|ary| ary.first }
>>114 うまく動きませんでしたす。たぶん文字だからです。
>>115 これはうまくいきました。ありがとうございます。
slice(N)でN個ごとにとりだして、
mapでN並ぶ配列の先頭だけの配列にするのですね
117 :
デフォルトの名無しさん :2013/07/21(日) 07:41:46.28
a.each_slice(3).map(&:first)
118 :
デフォルトの名無しさん :2013/07/21(日) 08:02:36.05
aに対して1、bに対して2、cに対して3・・・・ みたいな感じで文字列の各文字の対応する数字を合計して返すプログラムを作りたいのですが str="abc".split(//) num={"a"=>1,"b"=>2,"c"=>3} count=0 for i in 0...str.size count += a[str[i]] end puts count ↑のnumをa〜zまでそれぞれ1〜26に対応させるのって手打ちじゃなくて簡単な方法ってありますか?
120 :
デフォルトの名無しさん :2013/07/21(日) 15:40:31.76
"a".ord - 0x60
Hash[("a".."z").each.with_index(1).to_a]
ごめ、違った
124 :
119 :2013/07/21(日) 16:23:38.63
みなさんありがとうございます 早速試してみます
125 :
デフォルトの名無しさん :2013/07/21(日) 16:24:49.38
Integer#to_sは36進法まで対応してるよ、というだけの話。 >> (1..26).each.with_object({}) {|n, hash| hash[(n+9).to_s(36)] = n} => {"a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5, "f"=>6, "g"=>7, "h"=>8, "i"=>9, "j"=>10, "k"=>11, "l"=>12, "m"=>13, "n"=>14, "o"=>15, "p"=>16, "q"=>17, "r"=>18, "s"=>19, "t"=>20, "u"=>21, "v"=>22, "w"=>23, "x"=>24, "y"=>25, "z"=>26}
126 :
デフォルトの名無しさん :2013/07/22(月) 07:54:19.94
>>119 カウンター変数みたいなの作って、ループ処理内でキーの部分に代入
ループ毎にカウンター変数+=1してけば自動化できない?
127 :
デフォルトの名無しさん :2013/07/22(月) 08:02:05.13
128 :
デフォルトの名無しさん :2013/07/22(月) 08:20:47.73
うちは WindowsDefenderだけど 特に問題なかった
なんで McAfee とか Norton みたいな激重糞ソフト使ってんの?
Nortonは軽いよ。
ノートンは信頼できないEXEファイルを強制的に削除するからね Rubyみたいなのを使うとき問題が出る 自分はリアルタイム保護のSONAR拡張モードって奴をOFFにしてる
132 :
デフォルトの名無しさん :2013/07/22(月) 09:09:53.79
つうかPCが4コアくらいあれば別に裏でセキュリティソフト動いてても重さ感じないだろ ネトゲ起動しっぱなしでも他作業余裕
>>119 やってみた
Hash[[*1..26].map{|e|[(e+96).chr,e]}]
134 :
uy :2013/07/22(月) 11:10:27.56
p Hash[("a".."z").map.with_index(1).to_a] アホみたいにレベル下がったなこのスレ
また一人初心者がルビーに興味をもったということ
解答者のレベルが下がったって意味だよな
("a".."z").each.with_index(1).inject({}){|h,(a,i)| h.tap{ h[a]=i} } ついinjectを使ってしまうからコードが読みづらくなる
>>137 ("a".."z").each.with_index(1).inject({}) { |hash, (key, val)| hash.update key => val }
もし inject を使うなら、こうだろ
Hashオブジェクトにhashという名前をつける人はいろんな意味で信用ならない
Hash[(?a..?z).zip(1..26)]
まったくそのとおりだ、組込みのモジュール/クラスと重なる名前付けは一切禁止すべきだよな 例:object, array, klass, data, dir, io, file, mutex, range, string, struct, symbol, thread, time, errno, process, signal,
Hash#[]を使う人は美的感覚に欠けている
>>144 では訂正しよう、Objectクラスのメソッドと重なる(ローカル変数への)名前付けは一切禁止すべきだよな
例:clone dup display hash
instance_variables method methods object_id private_methods protected_methods
public_method public_methods public_send singleton_class singleton_methods
taint tap trust untaint untrust
これでOK?
147 :
119 :2013/07/23(火) 09:52:27.08
いろんな人のコードを見てわからないところ調べるとホント勉強なるわ「 サンキュー
rubyのmechanizeの質問なんですがダイアログボックスの制御ってどうすればいいんでしょう? 具体的にはwindow.confirmで出てくる奴の「はい」か「いいえ」を選択したいのですが・・・・
HTTPとHTMLとJavaScriptを知っていればわかることだが、MechanizeはJavaScriptを解釈制御できない HTTPとHTMLとJavaScriptを知っていればわかることだが、Mechanizeに相応のGETまたはPOSTをさせればいい なにを言っているのかわからないのなら、HTTPとHTMLとJavaScriptに関する勉強が必要 なんか上のほうでも書かれていたが、ふつうのWebブラウザがどんな挙動で何をやっているかを知らないとMechanizeは全く使えない
実行したいシステムにWatirをインストールしてセキュリティ設定を変更させた上で実行させるという手もないではない 通常のWebブラウザ設定を汚して壊す必要があるので、完全自分用でもなければそうそうできるものでもないが一応
151 :
uy :2013/07/23(火) 21:45:36.28
そんなに知識いらないだろ 色んなものの知識習得をすっ飛ばして初心者でも簡単にスクレイピング出来るようにしたのがmechanize js絡むものはmechanizeでやるの効率悪いから諦めたらいい
152 :
デフォルトの名無しさん :2013/07/24(水) 07:49:00.29
>>148 どうしても無理っぽかったら、いっそHSPでもさらりと習得すればいい
ダイアログ使うの簡単な言語だから、rubyプロセスと命令の受け渡しだけ出来ればいいし
あほ
154 :
デフォルトの名無しさん :2013/07/27(土) 02:21:04.18
質問です。自分でどうしても解決できなかったので、分かる方どうか教えてください 下のプログラムに「ファイル名.rb:16:in `<main>': undefined local variable or method `html' for m ain:Object (NameError)」というエラーが出てしまいます。 (つづく)
155 :
154 :2013/07/27(土) 02:24:46.84
(つづき) プログラムの目的:ニコニコ動画で任意の動画をマイリストに登録する require 'mechanize' mech = Mechanize.new mech.user_agent_alias = 'Windows IE 7' mech.ssl_version = 'SSLv3' mech.verify_mode = OpenSSL::SSL::VERIFY_NONE login = mech.get("ニコ動URL/login").forms[0] login['メール'] = @mail login['パス'] = @password login.submit
156 :
154 :2013/07/27(土) 02:28:37.66
(つづき) def getToken() html = urllib2.urlopen("ニコ動URL/my/mylist").read() end for line in html.splitlines() mo = re.match(r'^\s*NicoAPI\.token = "(?P<token>[\d\w-]+)";\s*',line) end if mo token = mo.group('token') assert token return token end
>>154 課題:以下の質問に、深入りしない程度にてきとーに答えなさい
・ トップレベルとはなにか(必須)
・ 変数スコープとはなにか(必須)
・ "undefined local variable or method" の英文的な意味(必須)
・ これまでに作ったことのあるスクリプトの大まかな機能(参考)
もし答えられない項目があるのなら、あなたはまだいてはならないところにいます
動詞が変化することを知らずに英文で手紙を書こうとしているようなもので、根源的な基礎知識が足りません
もっと単純なスクリプトをたくさん書いて練習するべきだと思うし、もしそんな手間をかける理由がないというのなら
おそらく目的専用の出来合いのライブラリやらアプリケーションやらを単体で使ったほうが速くて安くてうまくいきます
自力でわけのわからないプログラミング言語を無闇にいじくり回すこともないでしょう
>>156 へえ最近はRubyにもurllib2やsplitlines()が…
ねえよ!(ペシッ
159 :
デフォルトの名無しさん :2013/07/27(土) 10:04:58.58
>>154 Ruby def で検索かけて、使いかた覚えといたほうがいいよ
申し開きできないくらい基本的な事だから
ネットでググって勉強すると知識が断片的になるから本を買った方がいいと思うの
むしろこの程度のレベルならググったほうが早い
162 :
デフォルトの名無しさん :2013/07/27(土) 10:56:43.46
urllib2って、pythonじゃねーかw
>>154 >「ファイル名.rb:16:in `<main>': undefined local variable or method `html' for m
>ain:Object (NameError)」
翻訳すると「オブジェクト m にはローカル変数(属性)またはメソッドとして
html が定義されていない」であり、エラー発生箇所は16行目とある。
要は、html という名前がどこにも定義されていない、という意味。
おそらく
>>154 は14行目の代入文でhtmlという名前が利用できるようになったと
考えているかもしれない。でも、この行はメソッド定義 getToken() の一部だから、
getToken()が呼び出されなければ実行されない。
メソッドの「定義」と「呼び出し」の違いを理解すること。
で、どうすればいいの?という話になるが、まず14行目の変数htmlへの代入文を
実行できるようにする為に、13行目と15行目を削除(またはコメント化)してみなさい。
変更後のコードは、以下のようになる。
12: login.submit
13: html = urllib2.urlopen("ニコ動URL/my/mylist").read()
14: for line in html.splitlines()
164 :
154 :2013/07/27(土) 12:55:54.24
(つづき) token = getToken() def mylist_create(name) cmdurl = "ニコ動URL/api/mylistgroup/add" q = {} q['name'] = name.encode("utf8") q['description'] = "" q['public'] = 0 q['default_sort'] = 0 q['icon_id'] = 0 q['token'] = token
>>163 for m ではなく for main:Object
urllib2 が未定義
166 :
163 :2013/07/27(土) 13:56:56.24
>>165 指摘ありがとう、
>>163 を訂正しよう
翻訳すると「トップレベル(main:Object)ではローカル変数(属性)または
メソッドとしてhtml が定義されていない」であり、エラー発生箇所は16行目とある。
要は、html という名前がどこにも定義されていない、という意味。
なお、メソッドurllib2に関しては、この先で未定義エラーとなる可能性は高いと思うけど、
今回のエラーの原因が「識別子 html が未定義」である事に間違いは無いと考える
まずは目の前のhtml問題を解決し、それからurllib2問題に目を向ければいいのではないかと
>>166 理屈としては間違ってないけど
>>156 にまるまる Python のコードをぶちこんでくる質問者に対して
その粒度でちまちまレスしてくのは教育的にも2ch的にも筋がいいとは思えないな
今回に関しては入門書読んでこいでいいと思うわ
168 :
デフォルトの名無しさん :2013/07/27(土) 14:51:20.04
>>167 スレタイ嫁
Ruby本スレならその理屈でいいと思うが、ここは初心者スレだ
質問者のレベルに応じて解答するのが望ましいと思うわ
誰だって最初は初心者だったわけで、自分が質問者よりも「いくらか」レベルが高いからといって、
見下したようなレスを返すのは、いかがなものかと
たぶん
>>154 はPyhtonで書かれたコードをRubyで書き換えようと(移植しようと)考えたけど、
それ以前に「定義と呼び出しの違い(
>>163 )」が理解できていないレベルだった、たそれだけのこと
だから、返答ではそれを指摘して、後は質問者本人がどうするか考えればいい
スレが質問カキコで溢れきっていて、返答レスが追いつけない状態にあるのなら話は別で、
「本嫁」の一言で終わらすのもアリだとは思うがね
>>169 木を教えても森はわからないよ。
ありえないほどレベル低すぎなんだから、まず入門書で勉強しろで正解でしょ。
>>170 森がわかるようになるかは質問者の努力しだいだけど、
その可能性を切り捨てて、木を教えることさえ拒絶するのは、いかがなものかと
一昔前はともかく、最近は初めてのプログラミングをRubyで学ぶ人も増えている
熟練者であれば「ありえない」ほど些細なことでつまずくのが、そんな初心者だと思う
172 :
デフォルトの名無しさん :2013/07/27(土) 18:16:11.73
ぶっちゃけ、自演だと思う。
>>169 君に初心者を扱うのは無理だ
既にあらゆるものを忘れ去っていて、柔軟性に欠き、その実、初心者を本当は一番馬鹿にしている
質問者はPythonなど知らない
Mechanizeで検索した結果をくっつけただけだ
そして、MechanizeにはPythonのライブラリとRubyのライブラリがあることを知らず、
そのページがRubyを扱ったものかPythonを扱ったものかを判断する知識もなく、
なおかつコード片からRubyなのかどうかを判断することもできない
だから「Mechanizeのスクリプト」として混ぜ書きしている
よかった・・・・・病気の子供はいなかったんだ
マルチポストの何がいけないんですか
176 :
デフォルトの名無しさん :2013/07/27(土) 20:50:26.32
クロスポストの出来るシステムならマルチは悪だが クロスできない2chのシステムでは マルチするしかない
177 :
デフォルトの名無しさん :2013/07/27(土) 21:06:51.52
178 :
デフォルトの名無しさん :2013/07/27(土) 21:08:36.02
あつかましい 「24時間以上、待っていましたが回答が得られませんでしたので、ここで改めて質問します」
179 :
デフォルトの名無しさん :2013/07/27(土) 21:10:09.93
適切かどうか別として、回答してやったのに、礼もいわないやつがいる
初心者むけの回答っつっても初心者の中でピンからキリまでいるんだし
ぼくがかんがえたさいきょうのしょしんしゃ 向けの回答じゃないからって回答者叩くのおかしくね
ちなみに
>>163 の回答はすごくいいと思います
184 :
154 :2013/07/28(日) 02:15:27.70
たくさんレスをしてくださってありがとうございます これから1つずつ調べたり試したりしていこうと思います プログラミングに関してはRubyが初めてで(Python挫折しました)常識程度も知らずにお手数かけてすみません 試したことに対して結果が出たら、また報告させてもらいます
185 :
デフォルトの名無しさん :2013/07/28(日) 02:19:15.84
>>184 def使った定義命令や定義関数マスターしたら、ほぼどんな言語でも一気にプログラミングが楽になるし、幅が広がるよ
まあ頑張れ
「定義命令」とか「定義関数」とか意味不明な語を使いこなすような人に言われてもな....
187 :
らくだ :2013/07/28(日) 17:02:34.88
> MechanizeにはPythonのライブラリとRubyのライブラリがあることを知らず、 (´;ω;`)ブワッ
結局「それはpythonのコードだpythonスレに行け」の一行レスが、もっとも無難な回答なのよね > ・回答は1行以内で簡潔に。 例:man hoge やっぱり、先輩の言っていたことは正しかったんだ…
結局「あきらかにrubyのコードなのにpythonのコードに見えてしまうのは頭が悪い」の 一行レスが、もっとも無難な回答なのかな
頭が悪いだのなんだの相手を非難して自分の承認欲求を満たしたいならば無難な回答ですね
質問です a=(1..5).to_a a.permutation(5){|a,*arr| p [a,arr] } [a,[b,c,d,e]] の形じゃなくて[[a,b],[c,d,e]]の形で表示させたいのですが |a,*arr|のところって|単品、配列| じゃなくて |配列、配列|の形で受け取ることってできます? 今は a.permutation(5){|a,b,*arr| p [[a,b],arr] } で対応するつもりなのですが、もっと大きいサイズの場合にどう対応すればいいのか分からないので
あー a.permutation(n){*arr| p [arr[0..n-m],arr[n-m..n]] } でいいのか
[*1..5].permutation(5) {|xs| [xs.take(2), xs.drop(2)] }
質問です subjects = %w[apple orange banana] と needle = %w[ana ple] があった場合、 needle の部分文字列を含む配列要素だけsubjects から選択したいのですが (appleとbananaだけを得たい) 作業変数で力技でやる方法は分かるのですが、綺麗な方法はあったりしますでしょうか
re = Regexp.union(needles) subjects.select{|sbj| re =~ sbj } subjects.select{|sbj| needles.any?{|ndl| sbj.include? ndl } }
作業変数使っとるがな
力技じゃないからよかろうもん
>>197 おそらく
>>196 は、FPの関数構成子(あるいはコンビネータ)を応用した、
変数を一切使わないコードしか認めないと思われる
あるいは作業変数という単語について、
なにか別の意味が定義された異世界の住人なのかもしれない
199 :
デフォルトの名無しさん :2013/07/31(水) 20:47:27.42
正規表現マッチということは ArrayやSetの&(intersection)は使えないかぁ。
subjects.select {|word| needle.any? {|n| word.index(n) }}
201 :
200 :2013/08/01(木) 01:10:10.49
書いた奴より
>>195 の下側のコードでいいわ。投稿してから気づいた
コード読まずに3行つかってなんかやってるのかと思った
質問です a=[1,2,3] file=File.open("p1.txt","w" ) file.write(a) file.close file=File.open("p1.txt","r") b=file.read file.close p b #=> "[1, 2, 3]" 配列をファイルに保存して取り出したらStringになってしまったんですけど これって配列で取り出す方法ってありますか? もしくは"[1, 2, 3]"を[1, 2, 3]に変換する方法ってあります?
File#write/print/putsは引数オブジェクトを文字列とみなしてselfに出力する File#readはselfから読み込んで文字列オブジェクトとして返す ので、単にそういうふうに作られたメソッドだからというだけのお話だっていうかマニュアルは慎重に読もうきちんと書いてある で、配列やHashはよく使われるので、「ファイルに"保存"して"再生"したい」という要望が多い のでできたのがyamlだ これは文字列だけが含まれている配列やHashをテキストファイルとして保存して(外部編集してから)読み込むことができる Rubyのオブジェクトが含まれていて、それをまるっと保存再生したいという場合はpstoreを使う これはRubyの扱うほぼ全てのオブジェクトをバイナリファイルとして保存して読み込むことができる あと、RubyではFileオブジェクトのopenはブロックを使うのが普通 File#closeを書くことはまずない File.open('test.txt','wb'){|f| f.puts(str) }
>>203 丁寧な解説ありがとうございます
m(__)m
質問です def o_uri(m) m.times{ open("××××"){|f|a=f.gets.chomp} } end def net(n) n.times{ Net::HTTP.version_1_2 Net::HTTP.start('×××,80){|http| a=http.get('×××')} } end webにアクセスして情報をとって来たいのですが上の2つの方法で速度を比較したところ user system total real o_uri: 0.109000 0.047000 0.156000 ( 14.224814) net: 0.031000 0.015000 0.046000 ( 14.772845) こんな感じになったのですがもっと早い方法ってありますか? それとも回線速度とか他の要因によって決まるからプログラム自体ではどうしようもないのかな
比較は bm do |x| x.report("o_uri:"){o_uri(50)} x.report("net:"){net(50)} end こんな感じでやりました
対ネットにしろ対ディスクにしろ、I/O処理で要する時間の大半は
(Rubyに限らず)I/O待ち時間が大半を占めるから、
性能改善のポイントは、いかに「無駄な待ち時間を減らすか」となる
具体的には、スレッドを使って並行に(=複数のI/O処理を同時に)実行するとか、
キャッシュを用いてI/O処理の実行回数そのものを減らすといった手法がある
>>205 ,206のようなベンチマークを目的にしたコードに、改善の余地は無い
回答としてはちょっとずれてるかとは思う 「ノーマルなHTTPのやりとりの範囲内ではそれ以上は速くなりませんので我慢してください」が回答 ふつうのWebブラウザで画像OFFのJavaScriptオフで読み込んだのとそう大差ないと思うんだけども
たいていのフェッチスクリプトはネットから取得する部分が極端に遅くなるんだよね これは仕方ないと思うなあ
パイプラインに汁
>>207 「スレッド」という言葉は初耳だったので手元にある本を開いたところそれっぽいことが書いてあったのでやってみます
>>208 聞き方が悪かったみたいですいません
1回あたりの時間を短くできるかどうかを聞いてたのですが
質問の本意としては「複数回アクセスする場合、かかる時間を短くできる方法があるかどうか」を聞きたかったんです
並列処理って概念を知らなかったので勝手に脳内で
複数回アクセスする場合時間を短くできる方法があるかどうか=一回あたりの時間を短くできるかどうか
って読み替えて聞いてしまっていました
どちらも参考になったので助言ありがとうございました
212 :
デフォルトの名無しさん :2013/08/03(土) 21:13:59.26
まったくどうでもいいけど、 Net::HTTP.version_1_2 は、 Ruby 1.6の頃に必要だったことが有る指定で、今は要らない。
>>213 「Ruby おまじない」でぐぐると「utf-8」がサジェストされる
死んでしまえばいいのに
気持ちはわかるけども
役割の理解はできたとしても、標準的なEmacs用の装飾つきのをなにも見ないで書ける気がしない 装飾はなくていいとわかったとしても、やっぱいまいち自信がない というかそもそもあれの部分の本名を知ってる人はそんなにいないと思うというか正式名称あったっけ 説明のための検索できないから困るんだよねあれ
はええええええええええええええええ スレッドってやつを使ったら同じ50回アクセス条件で15秒→2.5秒になりました
技術的に可能であるということと「やってもいいこと」との間には若干の開きがある 1秒間に何回もメインファイル群にアクセスがあれば普通はアク禁対象だ 一足飛びに警察に通報されたパターンもあるというか、あったというか、1秒1回でも逮捕されたな…
三菱電機インフォメーションシステムズ 岡崎図書館
219 :
デフォルトの名無しさん :2013/08/04(日) 16:45:28.59
220 :
デフォルトの名無しさん :2013/08/04(日) 16:47:48.42
>>218 10分に1アクセスくらいにしておかないと・・・・
複数のハッシュに、 1 => 'aaaa' 2 => 'bbbb' 3 => 'cccc' といった要素が入ってます ハッシュを結合してキーで昇順や降順にするにはどうすればいいでしょうか
mergeしてsortしよう
オーケー、Rubyにおけるオブジェクトとクラスとメソッドをおおざっぱに勉強しよう ・ Rubyではメソッドとif等の制御構造以外は基本すべてオブジェクトである ・ オブジェクトは自分を作り出したクラスを憶えている ・ オブジェクトにはメソッドを持たせることができる ・ オブジェクトが持つメソッドは特別に「自分自身」を操作対象にすることができる よし勉強した。これよりわかることは ・ ハッシュはHashクラスのオブジェクトであり、Hashクラスのメソッドで操作できる だ。 つまり、ハッシュをどうにかしたいのならHashクラスのメソッドを見てみるといい この理屈はRubyの基本であり、探し物の基本 配列、ハッシュ、文字列はよく使うだろうから、それぞれArray、Hash、Stringのクラスの(インスタンス)メソッドは見ておくと捗る 絶対に損はしない
>>222 まず最初に検討すべきなのは、複数のハッシュ間でキーが重複していた場合、
どのように処理するのが望ましいか、という事柄
望ましさの基準は一般論では決められないから、与えられた問題に応じて各自で考える
ここで、もし重複時に何らかの対処が必要であると考えたのなら、(
>>223 が指摘しているように)
各ハッシュを結合(Hash#merge)してからソート(1.8: Hash#sort, 1.9/2.0: Enumuerable#sort)する
もし重複したままソートすることが望ましいと考えたなら、
各ハッシュを配列へ変換(Hash#to_a)してからソート(上記と同じ)する
また、これら処理を複数のハッシュへ適用させるには、メソッド Enumerable#inject を使う
これ以上の説明は面倒なので、コードを書いてみた(Ruby1.8/1.9/2.0のいずれでも動く)
http://play.island.ac/codepaste/code?id=1540 なお、このコードではキーが重複すると例外が発生するように書いてあるけど、
与えられた問題に応じて様々な処理に書き換えることができる
たとえば 1 => 'aaa' と 1 => 'AAA' が入力として与えられた時、以下のいずれかを出力できる
1 => 'aaa' または 1 => 'AAA' または 1 => 'aaaAAA' または 1 => ['aaa', 'AAA'] ....etc
この具体的な方法については、Hash#merge を参照のこと
226 :
225 :2013/08/05(月) 23:25:17.29
一部訂正 X: 各ハッシュを配列へ変換(Hash#to_a)してからソート(上記と同じ)する O: 各ハッシュを配列へ変換(Hash#to_a)し、結合(Array#+)してから ソート(1.8: Array#sort, 1.9/2.0: 上記と同じ)する
class Hage def fuga end foo do end end この場合のfooってのは、クラス内のローカル変数で、do endブロックのポインタなのでしょうか?
>>228 ブロック引数付きのクラスメソッド呼び出しだと思う
irb(main):001:0> class Hage
irb(main):002:1> def self.foo; puts "FOO"; end
irb(main):003:1> foo
irb(main):004:1> end
FOO
=> nil
クラスHageは他のクラスを継承したりモジュールをエクステンドしていないかい?
class Hage < OtherClass
extend OtherModule
end
もしそうであれば、その継承したクラスやエクステンドした
モジュールで定義されているクラスメソッドになる
あと、別々のファイルで同じクラスHageを定義し、一方で定義されたメソッドを
他方から呼び出すこともできるから、ロード(require)のまわりも確認したほうがいいだろう
それでも見つからなければ、動的にメソッドを定義する、いわゆるメタプログラミングによって
定義されたクラスメソッドかもしれない
コンビニ業界初のハッカソン「HackaLawson」、ローソンが19・24・25日に開催 (2013/8/7 15:25)
http://internet.watch.impress.co.jp/docs/news/20130807_610713.html 株式会社ローソンは6日、コンビニ業界では初めてだというハッカソン
「HackaLawson(ハッカローソン)2013」を開催すると発表した。
まず8月19日にゲートシティ大崎イーストタワー(東京都品川区)のローソン本社でアイデアソンを実施。
続いて24・25日に、渋谷ヒカリエ(東京都渋谷区)でハッカソンを実施する。
現在、キャンペーンサイトにおいて参加登録を受け付けている。定員は、先着順で100名程度。
ローソンはHackaLawsonの開催にあわせ、ローソン店舗の位置情報データを
「オープンストリートマップ」に提供する。
このほか、ローソンがアカウントを持つFacebookやTwitterなどのAPIや、
ボーカロイド「あきこロイドちゃん」の3Dデータや音声などが提供され、
ハッカソンの参加者はこれらを活用したアプリのアイデアや開発技術を競い合う。
作品は審査の上、「ローソン賞」(からあげクン1年分)などの賞が選出されるほか、
最優秀作品はローソンと共同でのサービス化が検討されるという。
キャンペーンサイト
http://www.lawson.co.jp/campaign/static/hackalawson/
からあげクン1年分って356個なのか? 嫌がらせか?
相撲取りか
>>231 お盆(3個)と正月(6個)の分が引いてあるんじゃないのか?
235 :
デフォルトの名無しさん :2013/08/07(水) 21:32:15.69
>>234 uidやinfoの定義は91行目からの文字列のclass_evalだな。
&block というのが受け取るブロック。
ブロックを付けて呼び出す
→対応する名前のインスタンス変数にそれをProcインスタンスとして保存する
→と同時にメソッドの返値ともなる。
ブロックを付けずに呼び出す
→保存されているはずの対応インスタンス変数(=Procインスタンス)を返すだけ。
236 :
229 :2013/08/07(水) 21:42:01.66
>>234 > 特に定義がないメソッドでも、引数としてブロックを渡せるんですね。
いや、ブロック引数を伴うメソッドは、リンク先ソース(strategy.rb)の91..102行目で定義されている
この箇所は、ソースがロードされモジュールClassMethodsが定義される、
その時に(ただ1度だけ)実行され、以下のメソッドを動的に定義している:
uid(&block), info(&block), extra(&block), credentials(&block),
uid_stack(context), info_stack(context), extra_stack(context), credentials_stack(context)
これは
>>229 の最後に書いたメタプログラミングによる動的なメソッド定義の具体例になる
一般的な(=静的な)メソッド定義であれば、def uid(&block) ...... end とコードを書くけど、
メソッド名だけが違う定義がいくつも(uid info extra credentials)続いて面倒になるので、
こういったメタプログラミングで短く書いているのだと思う
Windows7にRubyInstaller最新版をインストールしたところ irbでキーボードから入力した文字が表示されるのに 時間がかかる場合が頻発します。(数秒〜数十秒) 今まではこのようなことはありませんでした。 Nortonが悪さしているかと思い無効化しても解決しませんでした。 解決方法がわかる方、いらっしゃいましたらご教示ください。
OS再インストール
この話題(RubyInstallerが更新されるたび)定期的に出るNE!
とりあえず irb --noreadline で起動すれば直るはず 適当にirbrcにでも書いとけ Readlineが必要になったときどうすればいいのかは知らん マシなReadlineを別途インストールすればいいんだろうけど
サンクス。やってみる。 夏休み明けてからだから随分先になるけど
Rubyで以下のループ処理を書きたいんですが、どんな風に書けばいいのでしょうか p=-1; delta=10 while (p < delta) { for (int k=-p; k<=delta-1; ++k) { fp[k] = うんたら; fp[k+1] = かんたら; ++p; } forループ内部はあまり重要ではないですが、forループのインデックスは必ず使います。 whileが使えること、++pはp+=1で代用できることは分かったのですが、インデックスつきループがわかりません uptoは<なのか≦なのかもいまいち分からないんです
fp.each.with_index|
答を直接聞くよりも、自分でループを試して憶えたほうがいい 変更も容易だし、なによりこれからの効率が違う Rubyにはブロックにも引数が渡せ、ブロック作成またはその回のループ開始時に適当な値が代入される 10.times do |x| p x end 1.upto(8) do |x| p x end ところでその++pの位置そこでいっすか
++p の位置に意味があるのか? for (int k=-p; k<=delta-1; ++k, ++p) と書く習慣がないだけかも
Rubyって標準パッケージにZIPファイルの圧縮・解凍ユーティリティ入ってないの?
いわゆる「普通」のzip/unzipはないねえ
250 :
244 :2013/08/20(火) 22:53:28.96
すると、 forの前にk = -pとか書いたり break if k <= deltaとか書いたり しないといけないんですね Rubyって意外に不便ですね
そこでその処理をしなければならないのなら、そこにその処理を書かなければいけない
こまるねェ・・・ gem使えると思ったら大間違いですョ・・・
なにがしたいのかしらんけど糞すぎて読めないレベルのコードだ
日本語の流れで説明してもらったほうがよかったな 各行の処理(正確には、各行の前後にあるかもしれない処理)のせいでこちらからなにもできん まあ、ループの書き方くらいはきちんと自分で理解して書いて欲しい 下手するとコピペで書いていただけでループや繰り返しの概念がないようにも見受けられる
255 :
デフォルトの名無しさん :2013/08/21(水) 10:57:46.32
PerlとPythonの間にRubyを入れました だからRubyは少しだけ中途半端な言語
256 :
デフォルトの名無しさん :2013/08/21(水) 20:22:21.87
>>250 a..bてのがある。
点がふたつ。これは、他のスクリプト言語にもある。
a = -p
b = delta - 1
for k in a..b do
処理
end
257 :
デフォルトの名無しさん :2013/08/21(水) 23:41:41.30
多重ループ回避のために catch :out do end という処理を書いたら、catch句の中にはいってくれないのはどうしてですか?
rubyの例外構文がtry-catchじゃないから
>>254 知りたいのはループ方法だけなんです
>>256 ありがとうございます。
でもその構文でインクリメントを2にするには、next if...とか使うしかないのでしょうか?
>知りたいのはループ方法だけなんです
違うと思う
たぶん
>>254 の見立てが正しそうだ
a=[1,1,1,2,3,4] b=[1,1,2] に対して a-bを実行すると[3,4]が返ってくるのですが [1,3,4]が返ってくるようにするにはどうしたらいいですか?
質問が多義的 いまは高校数学で、ベクトル、行列、群論とかやってないのかな
% gem install multiset % irb > require 'multiset' > a = Multiset.new([1,1,1,2,3,4]) => #<Multiset:#3 1, #1 2, #1 3, #1 4> > b = Multiset.new([1,1,2]) => #<Multiset:#2 1, #1 2> > a - b => #<Multiset:#1 1, #1 3, #1 4> irb(main):006:0> (a - b).to_a => [1, 3, 4] うおお
>>263 高校数学で群論やってたのっていつの時代だよ?
確かに、 a=[1,1,1,2,3,4] b=[1,1,2] のとき、 a+b => [1,1,1,2,3,4,1,1,2] なのに a-b => [3,4] というのは直感と反してるかもな。
a+b-b => [3,4] a+(b-b) => [1,1,1,2,3,4]
>>264 ありがとうございます
初心者なのでgemってよくわからないんですが
通常のarrayクラスの演算では求めるような操作を行うことはできない'multiset'モジュール?を使え
という理解でよろしいでしょうか?
>>270 [1,1,1,2,3,4].diff[1,2,1] => ?
配列から特定のインデックスの値を複数取り出す場合、この書き方以外に何かありますか? a = [1, 2 ,3] a.select.with_index(0) {|val, i| i == 0 || i == 2 } #=> [1, 3]
s = Time.now Time.now - s これで求めた時刻って、単位はなんなのでしょうか?
>>271 [1,1,1,2,3,4].diff [1,2,1] => [1, 1, 3, 4]
また、
>>271 を更新しました
http://play.island.ac/codepaste/code?id=1552 更新版では、multisetパッケージ(
>>264 )と同様にメソッド Array#- をオーバライドさせました
[1,1,1,2,3,4] - [1,2,1] => [1, 1, 3, 4]
なお、この実装は(コードを見れば一目で分かるように)「配列の差」を単純に表現しています
もし質問者(
>>262 )が必要としているのが「真の多重集合」であるなら multsetを使うべきだし、
「単なる配列の差」でかまわないならばこちらを選んでもいいのではないかと思います
>>273 a.select.with_index { |_, i| [0, 2].include?(i) }
>>275 ありがとうございました
秒なんですかね?
なんか1秒ぐらいかかってる処理が0.02秒で終わるのですが
279 :
デフォルトの名無しさん :2013/08/25(日) 00:05:48.11
function method() { var func = function(i) { //すっげー長い処理 } func(1); func(255); func(1000); } こういう処理をRubyで書きたいんですが方法が分かりません。 def method func = lamda { |k| } end これはなんか違う気がします
気がするのは勝手だけど、メソッド定義内で消尽するサブルーチンを書きたいのならlamnda/procが動作的にも意味的にも妥当 なぜlambdaでは駄目だと思うのか120文字程度で言えるもんなら言ってみろ(15点)
281 :
デフォルトの名無しさん :2013/08/25(日) 00:29:21.70
func = lamda do |k| end func(10) これで普通に上のJavaScriptと同じように動くのですか?
func = lambda {|k| // 処理 } func.call(10) こうでした Rubyって短く書くこと推奨なのにcall()が必要なんですね
func.(10) とか func[10] とか func === 10 とか 好きなの使えばいいと思うよ
>Rubyって短く書くこと推奨なのに そんな推奨はない
まあrubyのダサい所だな
ruby2.0で無理やりにでもfunc(10)と書けるようにして欲しかった
()がついたら変数参照ではなく常にメソッド呼び出し、というルールがあるからどうしようもない Procオブジェクトという態を捨てるわけにもいかないし メソッド化するという機能があればいいんだろうけど
Cでの for ( i=0 ; c = getc© != EOF ; i++) { ほにゃ ] c = STDIN.getc while ( c != nil) ほにゃ c= STDIN.getc end って面倒くさい書き方になっちゃうんですけど、もっと上手いやり方ないですか?
289 :
デフォルトの名無しさん :2013/08/25(日) 23:36:39.77
cでもふつう while ( (c = getc()) != EOF) ... だと思うが…
290 :
デフォルトの名無しさん :2013/08/25(日) 23:38:49.32
io.each_byte do |c| end じゃね?
日本語の流れで説明してもらったほうがよかったな
そんなC初めて見たな。
>>288 I/Oの反復処理を書く方法はいくつかあって(.... ここで「ほにゃ」を「英大文字変換」と仮定):
(1) 反復構文 until .... end を使う -- Rubyを使い始めたばかりの人向け
until (c = STDIN.getc).nil?
STDOUT.putc c.upcase
end
(2) イテレータ IO#each_char を使う(
>>290 ) -- フツウにRubyらしいやりかた
STDIN.each_char do |c|
STDOUT.putc c.upcase
end
(3) (2) + 遅延評価 Enumuable#lazy を使う -- イマドキ(?)のRubyらしいやりかた(Ruby 2.0から)
STDIN.each_char.lazy.map { |c|
c.upcase
}.each do |c|
STDOUT.putc c
end
・Rubyist Magazine - 無限リストを map 可能にする Enumerable#lazy
http://magazine.rubyist.net/?0041-200Special-lazy ・Enumerable lazy について
http://www.slideshare.net/cuzic/enumerable-lazy
294 :
デフォルトの名無しさん :2013/08/27(火) 02:25:26.52
初心者だがルビーからしようとしたらよくわからなかったから html→css→php→rubyの順にしようと思うけどこれでいいと思う?
いいとおもわない
296 :
デフォルトの名無しさん :2013/08/27(火) 04:04:07.50
今html全部勉強し終わってcssに移ろうとしたとこに… どんな順番がいいと思う?
出力・操作したいものがHTMLやCSSやJavascript(を含んだもの)であって、 そしてなおかつそれの知識がないのだとしたら、 そりゃHTMLやCSSやJavascriptの勉強から始め「なければならない」と思う 極める必要などさらさらないが、区別分別できるくらいの知識は必要
298 :
デフォルトの名無しさん :2013/08/27(火) 04:16:12.76
なるほどなー jsもいるのか ありがとーRuby始められるくらいのレベルになったらまたここくるわ
ブログ、SNS、CMS、Twitter とかがなかったとき 1. 情報を発信してー 2. HTMLを勉強する 3. 見栄えを良くするために CSS を勉強する 4. 細工したくて JavaScript 勉強する 5. 動的にしたくて CGI を勉強する CGIでどんな言語を選択するかのが分岐点になる。 2000年はPerlの一強
とりあえずやれそうなものからドンドンやれば良いんじゃないかな 初心者が「やれそう!」と思うようなものは簡単で基礎的なものだろうから 後々無駄になることは多分おそらくあまりないんじゃないかなと思わなくもない
>>276 ,277
遅くなりましたがありがとうございました!
>>294 計算するだけのアプリとかなら、いきなりrubyでいいだろ。
303 :
デフォルトの名無しさん :2013/08/27(火) 18:52:03.80
W
>>302 これは義務教育で算数や数学を学んでいて計算ができる前提だな。
計算なら R がいいよ
てすt
VirtualBox上のUbuntuにソースコードからRubyを入れたいのですが configureからmake installまで1時間30分ぐらいかかりました ホストOSがWindowsのCeleronの1コアのCPUです。 みなさんの環境ではどのくらいの時間でコンパイルできるのでしょうか? 20〜30分切れるというかた,スペック教えてください
>>308 新しい一番安いmacmini(59,800円)でやってみた。
Parallels上のCentOS6(Core4個割り当て)
ruby-2.0.0-p247
# time ./configure
real 0m16.055s
user 0m7.716s
sys 0m3.865s
# time make -j
real 3m12.424s
user 4m30.528s
sys 0m13.983s
(うち、ドキュメント生成 127.1s)
310 :
309 :2013/08/28(水) 17:31:27.61
あ、ごめん嘘ついた。 79,800円の方だった。 2.3GHzクアッドコアIntel Core i7(Turbo Boost使用時最大3.3GHz)、6MB三次キャッシュ
え、そんなに速いんですか やっぱり買い替えます ありがとうございます
コアもCPUも1個しかないならVirtualBoxでLinuxで開発するのはやめといたほうがいいかも
最近プログラム初めて勉強がてらいろんな人のブログ回ってるんだけど Linux?ってやつで開発するとどんなメリットがあるの?
ごめんぐぐったら普通にいろんな回答でてきた 無視して
windowsで動かないgemがあるからlinux
>>306 >>239 のサンプルコードを....
(1) 反復構文 until....end を使う
http://play.island.ac/codepaste/code?id=27 長い(1.2Kstep)けど、見るのは1262行から始めるメイン処理の箇所だけ
変数 seq_num と env をループの中でゴリゴリと(=破壊的代入で)更新するフツーなスタイル
(2) イテレータ IO#each_line を使う
http://play.island.ac/codepaste/code?id=1553 変数 seq_num を更新する代わりにメソッド Enumerable#with_index を、そして
変数 env を更新する代わりにメソッド Enumerable#inject をチェーン(繋ぐ)ことで
(1)と同じ反復処理を実現している
なお、(3)の遅延メソッド Enumuerable#lazy は無くても、ループが止まることは無く普通に動く
メソッドチェーンの途中で map や select 等を使うケースでは必要になるみたいだけど、
どんな条件で lazy が要(あるいは不要)か?に対する明確な答えは分からなかった....
317 :
316 :2013/08/28(水) 20:22:38.86
>>313 開発ツールが豊富で簡単で安定してる。使い方によるだろうから、自分にあった環境使えばいいよ。
nokogiriをBundlerでインストールすると、nokogiriとmini_portileというGemがインストールされました。 nokogiriのGemファイルには他にもminitestやhoeといったGemが書かれているのですが、nokogiriとmini_portileしかインストールされないのは何故でしょうか?
こまけぇことは
開発時に必要なものと実行時に必要なものは違うから
何ページかあるリストにアイテムが複数あるデータがあって、それを必要に応じて外部から持ってくるEnumerableなクラスを作ろうとしています。 適当にeachを実装することでそれはできました。このような実装です def each items_read_position = -1 while get_next (items_read_position+1).upto(@items.length-1) do |i| yield @items[i] end items_read_position = @items.length-1 end end @itemsはアイテムが入った配列で、get_nextは取得した結果を@itemsにArray#<<し、取得終了時にfalse、それ以外はtrueを返すというメソッドです。 そこまでは出来たのですが、後々容易にアイテムを識別したり、リストの重複を防ぐために、Itemの中にあるキーを用いてhashにしようと考えました。 色々調べて、Hashの順序は保証されることがわかったので、Enumerator#nextというのが使えるかなと思いましたが、 nextの実行中に元オブジェクトの変更は出来ませんでした。 何かいい手段があれば教えてください。
>>321 Gemfileではどのgemもgroupに:developmentと:testが指定されているのですが、開発時に必要なものと実行時に必要なものが指定されているのは別のファイルでしょうか?
外部イテレータを使え、というのが回答ではあるんだが、これめんどくさいんだよな
325 :
デフォルトの名無しさん :2013/08/29(木) 07:58:26.29
>>323 Nokogiriって、 gemspecファイルないんだな。
Gem::Specification.find {|spec| spec.name == 'nokogiri'}.dependencies.map(&:type)
を見て。
326 :
デフォルトの名無しさん :2013/08/29(木) 08:00:23.17
あと、開発時ってのは、nokogiri gem の開発時ってことな。
327 :
デフォルトの名無しさん :2013/08/29(木) 09:58:45.39
配列をキャッシュにする方法ありますか? ジェネリクスが無効化される方法でお願いします。
328 :
デフォルトの名無しさん :2013/08/29(木) 15:50:19.10
rubyからtor操作する方法って何かありませんか?(*・ω・*)
犯罪目的ですか
Rubyをメインで使っている人に質問です オブジェクト指向を学ぶのにRubyは適していますか?
一般的なオブジェクト指向というのはJavaのことです オブジェクト指向を学びたいならJavaを学んでください
>>325 Hoe使ってRakeファイルの中でgemspec作って依存性管理してるのかなという結論に至りました。
ありがとうございます!
巨大な配列があります(数百行が平均)。 配列の中身はすべてハッシュで{:type=>"", text:=>""}という中身です。 :typeは、A, B, Cの3種類だけです。 今この巨大配列を α:typeがAとCの配列 β:typeがBとCの配列 に分割したうえで、 αは、:typeがAの要素と:typeがAの要素からインデックスが±3以内の:typeがCの要素のみ βは、:typeがBの要素と:typeがBの要素からインデックスが±3以内の:typeがCの要素のみ にしたいんです。 alpha_tmp = big.dup.delete_if do |ele| if ele[:type] == B end beta_tmp = big.dup.delete_if do |ele| if ele[:type] == A end alpha = [] is_within = 0 alpha.tmp.each.do |ele, index| if ele == A alpha << A is_within = index else is_within -4 < index && index < is_within + 4 alpha << A end alpha = alpha.uniq 書いてみましたが・・・なんか糞です。・・・もっと上手い書き方はないものでしょうか?
普通に受け皿配列用意してデカい配列のeach内で振り分ければよろしがな caseが使えるはず インデックスは要素位置だとして、配列arrの2要素目から7要素目までの部分配列はarr[2..7]で得られる プラマイ3がよくわかんが、xプラマイ3が欲しいならarr[(x-3)..(x+3)]でいいんじゃないのん irb> ["a", "b", "c", "d", "e", "f", "g", "h", "i"][2..5] => ["c", "d", "e", "f"]
>>333 AとCの配列、BとCの配列を作り、六つ以上連続するCがあったら
前後の3つを残して中側のCを削除する
あと杞憂かも知れんがAB分割する前と後の±3では結果が異なってくるぞ
[ABBBC]なら
分割前はalpha=[A],beta=[BBBC]
分割後はalpha=[AC],beta=[BBBC]
>>334-335 ありがとうございます。
助かりました。
AB分割後の配列の±3で問題ないです。
プログラミング自体の初心者で数独ソルバーを作っているのですが、 9x9の問題を縦・横・3x3のブロックの3つの2次元配列に代入するのに 以下のものよりベターな方法ありませんか? def set for x in 0...9 for y in 0...9 @x[x][y] = @sheet[x][y] @y[x][y] = @sheet[y][x] @z[x][y] = @sheet[x / 3 * 3 + y / 3][x % 3 * 3 + y % 3] end end end
まずそんなこと気にしないのがベター
339 :
デフォルトの名無しさん :2013/08/30(金) 16:11:26.03
(*・ω・*)できた
>六つ以上連続するCがあったら前後の3つを残して中側のCを削除する をどう書くのか考えてみた 簡略化して要素はHashの代わりにSymbolで :a,:b,:c big = 10000.times.map{[:a,:b,:c].sample} #ダミーデータでっちあげ 10.times{ big[rand(big.size),0] = [:c]*(rand(10)+7)} #数箇所に:cの連続するデータを挿入 alpha_tmp = big.reject{|e| e == :b} beta_tmp = big.reject{|e| e == :a} alpha = ([:c]*3 + alpha_tmp + [:c]*3).each_cons(7).reject{|s| not s.find{|e| e == :a}}.map{|s| s[3]} # e のとこは e[:type] の代わりのイメージで bigが数百メガ超とかならlazy使ったほうがいいのかな
341 :
デフォルトの名無しさん :2013/09/01(日) 01:12:22.21
array = ["a", "b", "c", "\r", "\n", "d", "e", "f", "\r", "\n", "g"] temp = [] start = 0 array.each_with_index do |e, i| if e == "\r" temp << array.slice(start..i) start = i + 1 end end なんでgが切り出されないのでしょうか?
期待する出力を具体的に述べたまえ
"abc\r\ndef\r\ng".split("\r\n") のようなことをしたいのだろうか。。。
やりたいことを説明してもらったほうがいいような気がする splitとかscanを使うと平易に書けるかもしれない
文字入力をeach_charで受けるとかアホなこと書いた人がいるから… Rubyでは標準入力/ファイル読み混みは行単位または文字列全体として受け取るのが一般的
RubyのI/OはUNIXに由来するバイトストリーム(バイト列)が基本で
そのバイトストリームを扱う様々なメソッドが提供されている
・バイトを単位として扱う -- IO#each_byte
・文字を単位として扱う -- IO#each_char
・行を単位として扱う -- IO#each_line
・ストリーム全体を単位として扱う -- IO.read
そして、I/O処理における「反復の制御方法(
>>293 ,316,317)」と
「I/Oのデータ単位」は直交する概念だから、ごっちゃにせずそれらの組合せとして考え、
解決したい問題に対して最適な方法(組合せ)を選ぶ必要がある
で、それはさておき、
>>316 で紹介した(行をI/Oの単位とする)サンプルコードについて、
irb のようにカーソルキーで履歴/行編集ができるよう改造してみた
http://play.island.ac/codepaste/code?id=1554 標準ライブラリのreadlineとRuby1.9で導入されたEnumeratorクラスの応用になるけど、
Enumuratorクラスはなかなか面白い
>>342-344 temp = [ ["a", "b", "c", "\r"], ["\n", "d", "e", "f", "\r"], ["\n", "g"]]
これを期待しているんです。
a = 12345 下2桁45を取得方法をおしえて
Rubyはどういう思想で設計されてるんえすか? たとえば変換するメソッドとかは頭に必ずto_って付く縛りになっているものでしょうか?
352 :
デフォルトの名無しさん :2013/09/01(日) 11:24:28.53
>>347 a.join.split(/(.*?¥r)/m).reject(&:empty?).map(&:chars)
ruby 2.0 未満では String#chars が Enumerable を返すので、
さらに .map(&:to_a) が欲しいかもしれないが、
Enumerable のままでも十分かもしれない。
353 :
デフォルトの名無しさん :2013/09/01(日) 11:25:28.22
あ、正規表現の m フラグいらんかった。 消しわすれ。
354 :
デフォルトの名無しさん :2013/09/01(日) 11:26:19.13
と思ったがやっぱりいるわ。たびたび済まん。 お茶飲んで落ち着く。
>>347 元のソースを尊重するとすれば、最後の行に
temp << array.slice(start..-1)
を追加すればいいだけ。
tempは"\r"発見時にしか内容が更新されないから、each_with_indexを抜けたあとに、arrayの余り部分を処理させる必要がある。
Rubyの公式マニュアルを修正したり追加して配りたいんですが これってgithubで公開されてないんですか?
>>347 array.chunk {|e| e == "\r" }.map(&:last).each_slice(2).map {|a| a.inject(&:+) }
なんか冗長な気がするが動く
359 :
デフォルトの名無しさん :2013/09/01(日) 11:49:13.43
array.join.lines("\r").map(&:chars)
361 :
デフォルトの名無しさん :2013/09/01(日) 13:38:59.99
なるほど。linesは行末文字を取り除かないから、それでOKなのか。
363 :
デフォルトの名無しさん :2013/09/02(月) 08:09:49.38
さっさと死ねルビーw
アホがいる…
365 :
デフォルトの名無しさん :2013/09/03(火) 06:51:15.72
>>364 ルビー信者のくせに言葉使うなww
死ねやゴミクズw
RubyとPythonって統一しないんですかね 似た言語が2つあるのは明らかに悪い影響出してると思うのですが
FORTRANとCOBOLって統一しないんですかね --> PL/I 誕生 CとPascal(Modula)って統一しないんですかね --> Ada 誕生 英語/仏語/独語..etcって統一しないんですかね --> エスペラント語誕生
まずはひらがなとカタカナを廃止してローマ字に統一しようぜ
369 :
デフォルトの名無しさん :2013/09/03(火) 14:13:01.94
>367 あんまり考えたことなかったけど 言われてみればあれだな 自然言語が複数種類あるのはバビルの塔が原因らしいけど プログラミング言語が複数種類出来たのはなんでだろうね
俺はさRubyでforとforeachを実装してもらいたいんだよ
>>369 本質的にはプログラムはアセンブラで必要充分です
人間が手順を考えてハードウェアにほぼ直接、一連の指示を与えればいいだけだから
アセンブラへの指示をまとめたのがC言語
C言語での指示をまとめたのがRubyなどの(Cで書かれた)各種プログラミング言語
Rubyでの指示をまとめたのが、たとえばRailsなどのアプリケーションフレームワーク
str = 'hello!'
puts str
とほぼ同じだけの安全寄り動作をするC言語のソースは大量になり、アセンブラだと莫大になるだろう
肝心な回答になってなかった プログラミング言語が複数できる理由は、 我々が処理を関数やサブルーチンやメソッドにしてまとめてしてしまうのと完全に同じ 我々が関数やメソッドやクラスを作るのと同じように、言語製作者はプログラミング言語を作る
mrubyのmってなに?
30代業界未経験だけど言語を作ったら採用率高くなりますか?
スレタイと関係ない
>>374 情報系の資格とるほうが楽だしアピールもしやすい
かなの起源はハングル
>>379 ハングルって最近出来たものじゃないの。
ひらがな/カタカナとハングルならひらがな/カタカナが先だね ただしカタカナは,新羅の仏教僧が仏典に注釈をいれるのに使っていた符号が先行の可能性がある,との説があるようだ
最近どっかのニュースサイトに載った記事ネタだろ なんでマジ議論してんだよ
まあ当時の富裕層は渡来人だしね唐招提寺とかね
gemのmysql2何でWindowsに対応してないのでしょうか? 何か決定的な対応できない不具合みたいなのがあるのでしょうか?
Rubいや、Windowsを窓から投げ捨てろ
Rubyでこれをよんでおけって本を全て教えてください
モルモン教には入信しておいた方がいい
gemで追加したけどいらなくなったモジュールって、どうやって削除すればいいでしょうか? ゴミが残らない方法を教えてください。
善意で作って公開してくれてるgemをゴミ呼ばわりするとか酷すぎる
gem uninstall パッケージ名 で、インストールのときにコピーされたファイルとディレクトリは削除される パッケージが勝手に作成・ダウンロードしたファイルで、パッケージのディレクトリ内にないものはたぶん消えない
>>390 ありがとうございます。
問題はあれですよね、そのパッケージ動かした時にできるファイルがどこに作られるのかとか、
それって個々に調べるしかない感じですか?
よほど糞な作り手じゃなきゃ readme に書いてある
>>392 ありがとう!!!
これで元に戻せなくなる心配をせずにrubyに入門できる!!!
>>384 対応してるぞ
俺先月複数回Windowsにmysql2いれたし
ただしコンパイラがどーのこーのヘッダファイルがどーのこーのすげー面倒くせーよ
395 :
デフォルトの名無しさん :2013/09/05(木) 23:40:30.45
>>388 それがいやなので最近はbundlerだけをシステムgemとしてインストールして、
あとはアプリのGemfileに書いたものをvendor/bundleに入れるだけ、にしてる。
使わなくなったら bundle clean するだけ。
Webアプリ屋としてはこれで十分。
日常のスクリプト書きに使う人には適さないと思うけど。
>>395 何それ役に立ちそう!!
やりたいのは基本Ruby on Railsだけだから、
それで出来るのならそっちでやりたい!!!
ちょっと明日ググってみるわ!!ありがとう!!!
いきなりタメ口つかってんじゃねえよタコ
>>388 rpmやdebなどの依存関係を定義できるパッケージマネージャを使って削除。
399 :
デフォルトの名無しさん :2013/09/06(金) 01:53:01.61
>>396 railsすらbundlerで入れるのみ、で通すのは少々手間が必要(可能では
ある)なので、rails本体とその依存物くらいまではシステムに入れても
いいかもね。
webricってlocalhost:任意のポートでしかアクセスできませんよね バーチャルホストに対応したRubyのサーバってありませんか?
プロクシかましてapache使うのはNGです gemで入れられるRuby用のサーバご存知の方教えてください
402 :
デフォルトの名無しさん :2013/09/06(金) 22:37:49.24
array = [ [ {:char=>'a'}, {:char=>'b'}, {:char=>'c'}], [ {:char=>'e'}, {:char=>'f'}, {:char=>'g'}], [ {:char=>'h'}] ] これでabcefghという文字列を取りたいのですが、 array.map {|line| line.map {|hash| hash[:char]}.join }.join 以外にもっと良い書き方はありますか?
RubyにおいてどうでもいいHashオブジェクトはhと呼ぶ(配列はarrかa) arrayやhashと書かれている場合はなにか意図を探してしまうので使わないほうがよい それと、配列の要素はelementのeだ で、まあ、回答としてはそれ以外には特にないというか、 それ以外の書き方をしてなんらかの理由でテクニカル()に動作してもおそらく意図が伝わらないのでやめといたほうがいい arr.map{|e| e.map{|h| h[:char]}.join}.join
flatten.mapとか
array.flatten.map{|m| m[:char] }.join => "abcefgh"
Rubyには_を書かない仕様にしてほしかった to_sとか
array.flat_map{|e| e.map{|h| h[:char] }}.join とか array.flatten.flat_map(&:values).join #これは駄目か
>>402 array.map{|e1|
e1.map{|e2| e2[:char]}.join
}.join
一番内側から考えるといいです。
{:char=>'a'} から 'a' を取り出すコードを書く。
次に、[ {:char=>'a'}, {:char=>'b'}, {:char=>'c'}] から 'abc' を取り出すコードを書く、という具合に。
410 :
409 :2013/09/07(土) 16:13:22.15
すみません。リロードし忘れたため、他の方の回答に気づきませんでした…
411 :
409 :2013/09/07(土) 16:16:34.04
しかも、質問の後半部分にも気づかなくて、とんだ見当違いの回答をしてしまった…
`git ls-files`.split($\)って記述を見かけたんだけど $\って何を表現してるんでしょうか? 改行マッチっぽい気はするんですが、何故これで改行になるのかわかりません。 予約語でしょうか。
>>413 こんなのあったんですね。ありがとうございます。
RubyのフレームワークでRoRみたいな高機能なのじゃなくてシンプルなやつありませんか?
webrick
Sinatra
意味不明度合いはどれもほとんど変わらないとは忠告しておく もし、RoRを忌諱する理由が「理解できなかった」なのなら、おそらくSinatraもWEBrickも「理解できない」可能性が大
ひどく的外れ
Railsは思想への深い理解が必要でつらい
421 :
デフォルトの名無しさん :2013/09/09(月) 07:46:42.33
cgi.rb
付いた解答がwebrick
423 :
デフォルトの名無しさん :2013/09/09(月) 10:02:27.46
cgi.rb はおわこん
RubyのWSGIモジュールはどれ?
Rack
>>415 Rackでいいんだろうけど、ActiveRecordの代替はどうしよう
rbenv/pluginsにruby-buildをcloneしてきたんですけど、rbenv installでrbenv: no such command `install'というエラーが出てしまいます。 どうしてでしょうか。。
rbenv/pluginsにruby-buildをcloneしてきたんですけど、rbenv installでrbenv: no such command `install'というエラーが出てしまいます。 どうしてでしょうか。。
自己解決しました。。
。。
431 :
うゆ :2013/09/11(水) 20:59:57.66
ゆうちゃんの件ではスルーしてたんだけど、2ch●漏れでtorに興味出てきて使ってみたんだよ そしたら、急激にネットワーク関連の知識と技術が増えてきて ついに「本物」になってしまった・・・・ 一瞬で、ネットワークの負荷分散や学校や企業みたいに沢山のホスト扱うノウハウとか 知識がついた 設定やってって言われたら多分、出来る ネットワーク技術者()の資格とかそういうのもあったけど、あれってなんなの?俺にとって一瞬で身に付くレベルのことを 皆必死に勉強して、資格とって・・・ ねえl、なんで俺はいつも、pc関連になると本を読むわけでもなく「一瞬」で理解しちゃうんだろ? 適正っていう物なんだろうけど・・・我ながら異常性を理解してるんだ 自分がごく自然に、やってる事が、いかに異常かってのを気付かせてもらったのは、 昔、知り合いのpcのBIOS設定やってるときだった、「英語読めんの?」 → 「んー、読めないけど、感でやってる」 これだ。 これが"一般人"には出来ないというのが、分かった。俺は確かに英語が読めない、でも・・・・PC関連が少しでも関わってると なぜか読めない英語も読めるようになってしまうんだ 英語の文章単体では読めないものの、英語+PC技術関連になると、俺はその文章を読むことが出来る・・・程度の能力 つうか、"字"を読んでるんじゃなくて、「伝えたい意図」を詠んでる から 俺にとっては単語の一つ一つが読める必要すらない・・・
432 :
うゆ :2013/09/11(水) 21:13:06.61
俺は英語のPC技術関連の文章を「字」を読んでいるわけじゃないし ソースコードに対しても「読んでる」わけじゃないんだろうな 「詠んでる」が、正しい tor使い始めて1日目で、理解して、 3日目にはhidden serviceの使い方を理解して、 1週間経った頃には、torのソースコードを見ることもなく、 torの仕組みをほぼ理解し、作ってって言われたらミニチュアくらいを自分で作れるところまで来てしまったのかもしれない・・・・ いや、当然まだ全然ググってもいないし知識もないよ…? ただ、自信だけが "此処" にある・・・ この異常性は、なんなんだろうな 作った事もなく、ググってもいないし、知識もないのに "自信" だけが俺にはあるんだ けど一般人には、これが無いんだろ 作った事もなく、ググってもいないし、本もないし、 確かに知識もない、 初めてのことなのに、 「やれる」 っていう ”自信” ・・・・・・・・ どうしてこんなに、適正能力の高い奴がいるんだろう 俺もうプログラマじゃないし、かなり離れた事やってるよ 日曜プログラマ化してるというか、暇なときにちょっとやる程度、 にもかかわらず・・・・スキルを高めようとも思ってないのに・・・・勝手に技術が身について・・・・・まじで止まらないのな。。。。 一度、身に付いた習慣、「スキルレベルを向上させていくリズムと快感」それをある程度、停止させてくれたのは、この世の中ではラグナロクだけだった ラグナロクオンラインやってるときだけは完全にプログラミングを忘れる事が出来た けど、それをやめた今、高めようとなんて思ってないのに勝手に・・・スキルが高くなっていく・・・ それに対し、怖さすら感じる 俺は15の時、自分の未来が見えた 最強ハッカーになって、IT歴史に名を残すものを開発し、起業して、・・・退屈な人生を送るという未来がな 俺は、それに近づくのが怖いんだ
433 :
デフォルトの名無しさん :2013/09/11(水) 21:26:33.00
最強ハッカーになるのが怖い、歴史に名を残すのが怖い、起業するのが怖い、退屈な人生を送るのが怖い 15の時に見えてしまった自分の未来像、そこから離脱する為に、俺はありとあらゆる事をやってきた にもかかわらず、未だに勝手に、俺はPC技術が勝手に高まっていくし、止まらない 最終兵器彼女のちせって。こんな気持ちだったんだな 俺はこのまま歴史に名を残してしまうのか・・・・・? 嫌なんだよそういうの 先の見えたレールを歩むのは・・・!! もう見えてしまっている未来というのは、一度読んだ本みたいなもので、 俺はその一度読んだ本をもう一度読もうとは思わない だから、未読の道へ進んでる 戦争でも起こるのか?俺は最終兵器? 俺は今特殊な環境から書き込んでる 最強ハッカーにしか出来ない方法とセキュリティ設定 セキュリティソフト(笑)とか入れるくらいなら、自分で高度セキュリティのネットワーク構築したほうが セキュリティソフト(笑)入れるより、よほど良い事がわかってしまった HDD削除とか、爆撃系のウィルスは食らうけど、遠隔操作系ウィルスは、俺には一切効かなくなってしまった。99%はカットされるであろう 投稿テスト
434 :
デフォルトの名無しさん :2013/09/11(水) 21:40:24.90
pcが行ってる通信をすべて掌握してるのってマジで気持ちいい 自分の許してない通信は今、どんなアプリだろうと一切行われていない セキュリティソフトやWindowsアップデートも例外ではなく・・・・ 自分の許可なくそれらはMikurosohutoやNotonanchivirusuに通信することさえできない その他の弱小アプリなんて、もはや息してないw もしもこのpcにトロイ入ってるとかウィルス入ってるとかあったとしても関係ない 俺様が今2chに書き込んでいるように、特殊な方法でしか外部と通信出来ないから セキュリティソフトって何だったんだろうな・・・・・ 投稿テストend
435 :
デフォルトの名無しさん :2013/09/11(水) 22:06:58.68
nokogiriでスクレイピングしたいんだけど、そのウェブページが、 JavaScriptを有効にしてくれって言ってくるんだけどどうやって有効にしたらいいか教えてください
こういうバカっぽい質問、あたしは好きよ
437 :
デフォルトの名無しさん :2013/09/12(木) 01:17:25.76
nokogiriでJavaScriptを認識させるためのモンキパッチを↓が書く
438 :
うゆ :2013/09/12(木) 01:32:20.63
質問です Webrickでたてたプロキシーサーバーにsocksでも接続できるようにしたいんですが 何を書き足せばいいのかよくわからないんですけど
439 :
デフォルトの名無しさん :2013/09/12(木) 07:24:31.94
自己解決しました
こいつに返事しなくていいよ
どいつだよ
initializeの中からyieldを呼んでるソースを見かけて驚いたのですが、 initializeの最後なら文法的にありなんでしょうか? コンストラクタを実行している最中ってオブジェクトがないってイメージなのですが。
その場合ならinitializeに渡されたブロックを実行するだけで initializeで作成中のオブジェクトとyield呼び出しに直接的な関係は無いでしょ
445 :
デフォルトの名無しさん :2013/09/13(金) 08:17:29.10
initializeはコンストラクタじゃない。 initializeを呼ばれた時点で既にインスタンスは存在する。 クラス.new は 1. クラス.allocate でインスタンスを生成する。 2. そのインスタンスのinitializeを呼ぶ。このとき、newの引数とブロックを渡す。 という動作。
446 :
デフォルトの名無しさん :2013/09/13(金) 08:36:53.63
死ねゴミ共がw 死ねゴミ共がw
JavaScriptのように var a = false var b = a|123 Pythonのように a = False b = a|123 これでbに123が入るんですが Rubyだと b = false a = b|100 p a と書いてもtrueがbに入ってしまいます Rubyではどう書けますか?
||
449 :
デフォルトの名無しさん :2013/09/14(土) 08:45:57.52
うゆ =
>>438 です
自己解決していません
socksプロキシに対応したプロキシ立てをrubyでやりたいんですけどわかりません
ちなみにsshでのsocksプロキシはやりたくないんです
ssh以外の方法でrubyでsocksプロキシに対応したプロキシサーバ作りたいんですけど
自己解決しました
includeとrequireの違いってなんですか?
え?
rubyカンファレンスっていうのはないんですか?
454 :
デフォルトの名無しさん :2013/09/14(土) 15:15:51.75
RubyConf2013 なら 11/8-10 舞浜^H^Hマイアミビーチで開催される。
Rubyの2.0ソースコードってデュアルライセンスですよね ソースコードの勉強として、1ブロック(10〜20行ぐらい?程のコードをブログにアップして解説する場合は ライセンスを明記し解けばいいのですか?
「よくわかんないけど動きません」は禁止です HTMLとJavascript(とCSS)が読めるのなら、 そのサイトでWebブラウザがどういう順を追ってアップロードをしているのかを確かめて、 それの通り(または、飛ばしても動く面倒な部分は飛ばして)動作するように記述すればいい HTMLとJavascript(とCSS)が読めない場合は現実的にちと無理 今回のように「なんだかわからないけど動かない」なんてなったときにどうしようもできない HTMLとJavascriptを大雑把にでも読み解けるくらいの知識が別途必要
ボタン押したりクリックするだけでページが遷移する、みたいなシンプル動作なサイトなら 全くなにも知らなくてもうまくいくことが多いんだけどねWatir
PHPスレからこちらに来てあっちの民度の低さが露呈して発狂しそう
attr_reader や attr_writer にて指定した変数を取得する メタクラス(?)の記述方法は有りませんか? 下記のプログラムにて,a.a a.b を知らなくても その変数名リストとその値をそれぞれ取得出来るような方法です. class AA attr_reader :a, :b def initialize( ) @a = 1 @b = 2 end end a = AA.new printf "%5d%5d\n", a.a, a.b
attr_readerとかを書き換えちゃえばいいじゃん
>>462 def attr_values(obj)
obj.instance_variables.inject({}) { |hash, at_sym|
symbol = (at_sym.to_s)[1..-1].to_sym
result, value = begin
[true, obj.method(symbol).call]
rescue
[false, nil]
end
if result then hash.merge symbol => value else hash end
}
end
class AA
attr_reader :a, :b
def initialize
@a = 1
@b = 2
@c = 3
end
end
a=AA.new
p attr_values(a) # => {:a=>1, :b=>2}
465 :
462 :2013/09/18(水) 19:06:20.27
>>463-464 有難うございます〜.とても助かりました.
この短いコードから色々試して勉強出来ました.
Pythonで作られた有名なサービスはDropboxですが Rubyで有名なものを教えてください
>>458 あなたはwatir使った事がありますか?
レスが全く無関係の方向です
分かる人いなそうなので回答は結構です
なるほど ということは今はRubyで作られた有名なものはないのですよね ぼくがRubyですごいやつ作ったら有名になれる気がしました
>>469 Rubyでなくてもすごいの作ったら有名になるだろ。特にサービスは実装関係ないから、Rubyでなくなったんだろ。
アプリならredmineとか。
基礎がなってないって事実を指摘するとキレる人は多い
Githubは? Twitterも一部にRailsが残ってるとか
どのくらいのレベルに達したらまつもと先生にTwitter follorされるのでしょうか?
まあ基礎がなってなくても人間としてなってないとかいろいろあるからな 喧嘩すんなって感じではあるが
日本だとcookpadが有名だろう
Ruby 2.0.0 ary = [1,2,3] ary.each do |v| p v end のとき ary[0] ary[1] ary[2] の0と1と2の部分Keyていうですか?これを取得する方法を教えてください ググって ary = [1,2,3] ary.each do |key, v| p v end でできるみたいな記事も見つけたのですが keyには値が入ってて、vはnilだったのでダメでした
ary.each_index do |key| p key end って書くと key が 0 から 2 まで回る。 これで要求に答えられてるかわからんけど。
irb(main):001:0> ary = [1,2,3] => [1, 2, 3] irb(main):002:0> ary.each.with_index do |v, index| p [v, index] end [1, 0] [2, 1] [3, 2] => [1, 2, 3] irb(main):003:0>
とあるログを解析するのに、キーとなる文字列を抽出するのにmatchメソッド使ったけど、これだとmatchオブジェクトになるんだな。 これをハッシュのキーにすると、文字列としては同じに見えるのに、異なるキーとして扱われるので、気付くのに時間が かかった。見た目同じ文字列が、見えないところで違う扱い、それも基本的なデータ型で、初心者に優しくないよね。 というか慣れた人でもハマることありそう。 なんでこんな設計になってるの? Rubyって。
> 文字列としては同じに見えるのに puts/print ではなく p してる?
メソッドの返り値くらいマニュアルで確認しようよ どんなアバウトな使い方なんだよ
>>480 >これだとmatchオブジェクトになるんだな。
正確に言うと「MatchDataオブジェクト」だね
>なんでこんな設計になってるの? Rubyって。
パターンの一致結果を詳しく分析するニーズを想定しているからだよ
もし興味があれば、「るりま」等で MatchDataクラスの解説を読んで勉強してみて
で、一般のパターンマッチ処理だとメソッド Regexp#match では面倒なので、
代わりに Regexp#=~ を使い、一致結果を $1, $2, ... で参照する
もしMatchDataオブジェクトが必要であれば、$~ で参照できる
これで、大半のケースは事足りるはずで、わざわざ matchを使うのはレアケースだと思われ
MatchDataオブジェクトをto_sでハッシュのキーにするって筋が悪いの? いつもそうやってた。
>>484 自身が
>>480 で書いているように、MatchDataオブジェクトを直に扱う手法は
初心者に優しくないし慣れた人でも間違えやすいし、タイピングも面倒
だから簡単な方法としてメソッド Regexp#=~ と疑似変数 $1, $2 , ... が用意されている
一般的なRubyにおける正規表現処理の解説ではこの簡単な方法で説明されているはずだし、
ほとんどのプログラムでもこの方法が使われている
だから、慣れておく事を薦めるよ
普段は誰もが知っている単純な方法でサクサクとコードを書き、イザという時には特別な手法で
困難をサラリと飛び越える.... というのが、クールなプログラマの姿ではないかと思われ
486 :
デフォルトの名無しさん :2013/09/21(土) 03:29:53.63
見た目が同じように感じられるのに #hash が異なるクラスは 単にハッシュのキーとして使うことが想定されていない。 JavaScriptとかからの人だと、Regexp#=~より先に Regexp#match を 見つけてしまうんだろうか。
>>471 , 474
基礎とかそういう問題ではなく
現在のwatirにある「不都合」について認知していないレスだったので
つまり使ってないのに憶測でレスしたんだろうなぁと思ってイラっといました
まぁ2chでいちいち環境そろえて的確な回答をする義務はありませんので構いませんよ
489 :
デフォルトの名無しさん :2013/09/21(土) 10:43:35.08
文字列がミュータブルであったり、純粋オブジェクト指向言語とは、みたいな ことにも繋がる面白い疑問点だと思うけど、マニュアルよめー、答えが返って くるとはかぎらないー、とかワンパターンなことを真っ赤になって繰り返す奴 って初心者スレで威張って人生の厳しさでも教える師匠かなんかの気分なの? おてがるにえらくなったつもりでいい気持ち、ってやっすい満足得ているのは 結構だが、ウザいことこの上無し。
あて先不明の爆発物だな・・・
Rubyでこういうgem教えて下さい ・ブログをやる場合の定番gem: ・PythonのSphinxみたいなgem:
>>485 >MatchDataオブジェクトを直に扱う手法は
上にもあったけど、to_sで文字列にすれば分かりやすいし素直じゃん。
内部的な効率でも別に問題ないし。
>だから簡単な方法としてメソッド Regexp#=~ と疑似変数 $1, $2 , ... が用意されている
こっちの方がわかり辛いし、めんどくせーんじゃねえの?
s = ["A", "C", "G", "T"] b = s.product(s,s,s) で4文字が組み合わさるけど これが5とか10のときにわざわざs,s,s,sとかs,s,s,s,s,s,s,s,sって書くのは効率が悪いので 数字で指定できる方法ありませんあk?
ないのでhaskellのreplicate関数みたいなのを自分で定義するとか def replicate(n, arr) [arr] * n end s = ["A", "C", "G", "T"] b = s.product(*replicate(3, s))
s.repeated_permutation(4).to_a でいけるんじゃないかな。
nokogiriでEUC-JPなHTMLファイルをノコノコしてるんだけど Uとかローマ数字があると間違って解析されちゃうんだけど どしたらよかんべ? $ ruby1.9 -v ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12] $ gem1.9 list nokogiri nokogiri (1.6.0)
まつもと先生が使ってるOSってDebianですか?
501 :
デフォルトの名無しさん :2013/09/22(日) 16:47:58.98
>>498 ローマ数字が定義されている EUC-JPは、実際には EUC-JP ではなく
CP1932 なので、ソース HTML が間違っていると言い切ってしまえれば
楽なのだが、とりあえず nokogiri に食わせる前にソースのまま処理して
置換しておくしかないんじゃない?
ちなみに Ruby 2.0 の Encoding には入っていないようなので、
入れてくれ、とバグレポートするのも気長な解決策ではある。
502 :
デフォルトの名無しさん :2013/09/22(日) 16:51:07.43
ごめん CP1932 じゃなくて CP51932 だ。 そして Ruby 2.0 にはあった。
Ruby2.1っていつでる予定なのか知ってる人おしえて
2013/12/25
>>498 Nokogiriの各クラスのparseメソッドには文字エンコーディング名称文字列を受けとる引数がある
いわゆるmetaタグで指定されているエンコーディング名がEncodingクラス的に(あるいはiconv的に)誤っているのなら、自力で指定しろ
引数側が優先されるから
ruby標準の機能が貧弱だからnokogiriが使われているんだよね だったら標準ライブラリいれちゃえよ
nokogiriが何かを知っていればそんな台詞は出ない 知らないものに対して何かを言おうとするのはやめよう
少なくともお前よりかはrubyを知ってます
すぐ喧嘩するなお前ら
中学生か高校生だよね >よりかは
一体誰と戦っているんだ・・・・
module ActiveSupport class TestCase < ::MiniTest::Unit::TestCase end end 上のコードで「::MiniTest」みたいに::の左にモジュールやクラスが指定されていない場合、どういう意味になるのでしょうか?
トップレベル
>>513 ディレクトリのパス表現を連想すると分かりやすい
たとえばUNIXだと、絶対パスは /usr/lib/ruby で
相対パスは lib/ruby や ruby と表現される
同様に、Rubyではモジュールの名前空間上におけるパスを表現する
(クラスはモジュールのサブクラスだから、クラスも同じ名前空間上に位置する)
たとえば、::MiniTest::Unit::TestCase は絶対パスで
Unit::TestCase、Unit、そして TestCase が相対パスになる
>>513 の例であれば、絶対パス ::MiniTest::Unit::TestCase は
(
>>514 のいう)トップレベルからクラス TestCase へのパスを表現し、
相対パスの場合は、カレントパス(=現在のコンテクストのパス)からクラスを表現する
たとえば
>>513 の定義クラス(= "class" の直後にある) TestCase は相対パス表現だから、
カレントパス ActiveSupport の下に位置する相対パス ActiveCase::TestCase と同じ
>>514 ,515
詳細な解説有り難うございます。絶対パスと分かって胸のつかえが取れました。
現在押されているキーボードのキーを取得する方法はないものでしょうか
kbhit
SDL
RSpecのディレクトリ構成について質問があります。 テストケースの中でファイル等を読み込みたい場合、何という名前のディレクトリに配置するのが一般的なのでしょうか?
今日からruby勉強し始めました! 皆さん宜しくお願いします!
>>520 いろいろ考えたのだが、spec/dataがいちばん無難なんじゃねーかという結論に至った
RSpecのディレクトリ構成について質問があります。 テストケースの中でファイル等を読み込みたい場合、何という名前のディレクトリに配置するのが一般的なのでしょうか?
>>520 適当な名前のディレクトリ掘るのが一般的ですかね。ありがとうございます。
なんか色々誤爆してすいません。
変数の初期化をブロック内で宣言するにはどうすればいいでしょうか 例: count=0 10000.times do count+=1 if rand**2+rand**2<1 end のcount=0をイテレータ内で記述したいのです
>>526 値の累積(accumulation)には、Enumerable#inject を使う
変数 count は累積値を表現し、ある条件(ここでは乱数)で加算(+1)した結果を累積していく
1000.times.inject(0) { |count, _|
if rand ** 2 + rand ** 2 < 1 then count + 1 else count end
}
というかEnumerable#countがあるんだからそっち使うべき。用途に合致したメソッド使った方が可読性もいい 10000.times.count{ rand**2 + rand**2 < 1 } とか 10000.times.map{ [rand,rand] }.count{|x,y| x**2 + y**2 < 1} みたいに書くな俺なら
530 :
デフォルトの名無しさん :2013/09/25(水) 21:37:48.09
ブロック引数に |変数群1; 変数群2| という記法もあったけど何だっけ。
自分でRubyのコードを組んで主人公を操作するブラウザゲームがあったんですが知っている方いれば教えて頂きたいです
injectってなんでああいう機能がinjectって名前になったの?
533 :
デフォルトの名無しさん :2013/09/26(木) 08:40:35.53
Smalltalkerに聞いてくれ
畳み込みという概念がうんちゃらかんちゃら
535 :
デフォルトの名無しさん :2013/09/26(木) 09:55:21.27
inject, injection アメリカ人は、まず注射を連想しますよ
536 :
デフォルトの名無しさん :2013/09/26(木) 09:57:35.63
くりこみ群 renormalization group 畳込み積分 convolution integral
fold や reduce や inject が本場であるところの関数型ではリストは再帰的に表現される たとえば (cons 1 (cons 2 (cons 3 nil))) などのように でもってこの cons の部分に関数を注入するのが inject ではないだろうか(憶測)
Smalltalkでは inject:into: って名前のメソッド(Smalltalkではコロンもメソッド名に含める)で、 inject: initialValue into: [:acc :each | ... ] というメッセージとして使う。 Rubyで同じことを書くと inject(initialValue){ | acc, each | ... } となる。 acc に initialValue やブロックの結果を inject してく感じ。
ブロックローカル変数宣言? a=1 1.times{|x;a| a=2} p a #=> 1
ものすごく単純に、ブロックの「中に入れてしまいたい」だけだと思う
bundlerでgemlocalに書いてからbundle installってやるのと bundler使わないでgem install xxxxってやっていれるのとで何が違いがあるのでしょうか? 例えばrailsでthinが使いたいんですけどbundlerから入れないと使えません
bundler経由だとbundlerに管理してもらえます
543 :
デフォルトの名無しさん :2013/09/27(金) 19:11:33.54
bundle installをデフォルトで vender/pathにする方法ある?
544 :
デフォルトの名無しさん :2013/09/27(金) 21:23:56.32
bundle config --global --path=vendor/bundle でおk
545 :
デフォルトの名無しさん :2013/09/27(金) 21:25:25.69
あ、--path じゃなく path だ。
aとbとcで aaa aab aac aba abb abc aca acb acc 略 ccc 見たいに全ての組み合わせを表示するライブラリがあったと思うんですがそれをおしえてください
547 :
デフォルトの名無しさん :2013/09/27(金) 21:31:51.68
w(a b c).repeated_permutation(3).map(&:join)
548 :
デフォルトの名無しさん :2013/09/28(土) 07:42:16.47
549 :
うゆ :2013/09/29(日) 01:24:46.62
>>527 クスクスクス
count = nil
10000.times do
count ||= 0
count+=1 if rand**2+rand**2<1
end
p count
>>549 count = nil で初期化してるやん
10000.times do count#{0}+=1 if rand**2+rand**2<1 end こんな感じにして欲しいが #{ }はタイプしづらいか
>>550 この人日本語もできないから触ったらだめ
何仕切ったつもりになってんだチンカス
キャー(つ∀`)コワイネー
しつもん クラス作る時に def self.new() ~処理~ end でnew()をオーバーライドするのと、 def initialize() ~処理~ end でコンストラクタ呼び出すのって何か違いがあるのですか? 色々とコードを弄ってたらどちらでも書けなくないな〜とか思ったんですが、 何か明確な違いあるのでしたら教えていただけると嬉しいです。
その例ではnewは再定義されていない なぜならnewというメソッドはデフォルトではどこにも定義されていないから C.newと書かれていたとき、(C.newというメソッドがなければ)RubyはCクラスのプライベートメソッドinitializeを参照する決まりになっている Rubyにおいて、クラス定義からオブジェクトを作るときの手順を記述したいときはinitializeに書「かなければならない」 initializeが動作する通常の場合においてC.newとするとCクラスの新規オブジェクトが自動で生成されて返ってくるが、 newを再定義した場合におけるC.newはnewメソッド内で定義した最後の処理のオブジェクトを返す それは通常Cクラスの新規オブジェクトではありえない もし、新規オブジェクトを作る意味が薄い「一連の処理をまとめて起動して終わるだけのカタマリ」を記述したいのなら、 クラスではなくモジュールとして定義して、なんか適当な特異メソッドを適当な名前で定義して呼ぶようにするといい なにも思いつかなかったらrunとかどうだろう
>>556 たいへん丁寧なご回答ありがとうございます。
newとinitializeの関係がよくわかっていなかったのを思い知りました。
> Rubyにおいて、クラス定義からオブジェクトを作るときの手順を記述したいときはinitializeに書「かなければならない」
> initializeが動作する通常の場合においてC.newとするとCクラスの新規オブジェクトが自動で生成されて返ってくるが、
> newを再定義した場合におけるC.newはnewメソッド内で定義した最後の処理のオブジェクトを返す
> それは通常Cクラスの新規オブジェクトではありえない
これが目からウロコでした。
つまりこれは自分が提示した例だと、「newという特異メソッドを自分で定義してしまった」だけなんですね。
さっき自分でも試してみたところ、
Cクラス内でnewを自分で定義するとオブジェクト生成のときにCクラス内のインスタンス変数に触れないとか、
tmp=C.new
p tmp.class
とかしたらCじゃない、newメソッド内で生成した別のオブジェクトのクラスが指定されていたのでなんか変だなと思っていたところでした。
たいへん勉強になりました。
> もし、新規オブジェクトを作る意味が薄い「一連の処理をまとめて起動して終わるだけのカタマリ」を記述したいのなら、
> クラスではなくモジュールとして定義して、なんか適当な特異メソッドを適当な名前で定義して呼ぶようにするといい
まさにやろうとしていたのはこの事でした。よくわかりましたね…。
実はDXRubyでゲーム作る際に(考える必要は正直あんまり無い気がするんですが)
DXRubyの処理を一箇所に固めて、後でライブラリの変更があった時にそこだけ変えられるようラッピング?しようとしてたんですが、
ImageとかSoundとかがクラスとして定義あったので、そのときそれらの「Hoge.new」をどう表したら良いんだろう・・・となって弄っていて
>>555 の状態になりました。
胸のつかえが下りました。本当にありがとうございました。
558 :
デフォルトの名無しさん :2013/10/01(火) 18:20:51.04
1234という四桁の数字を[1,2,3,4]とバラバラにして格納しようとしたのにできない a = "1234" b = a.unpack ("#{4.times do print("a1") end}") puts b じゃ駄目なの???
# coding: euc-jp a = "1234" b = [] y = a.split("") y.each do |z| b.push(z.to_i) end p b # C:\work>ruby spl.rb # [1, 2, 3, 4]
a="1234" b=[] a.size.times{|x| b << a[x].to_i } p b
561 :
デフォルトの名無しさん :2013/10/01(火) 21:26:21.58
>>558 その 4.times ... の値は "a1a1a1a1" ではなく 4 だ。
"#{...}" は式の値で展開される。
print は標準出力に値を出力し、 nil を返す。
Integer#times はブロックを評価し、 self を返す。
a="1234" b=[] b=a.chars b.map{|x| x.to_i } p b
横でROMってた初心者ですが勉強になります
>>564 メソッドチェーンを使うのなら、できれば一行で....
irb(main):001:0> a="1234"
=> "1234"
irb(main):002:0> a.chars.map { |c| c.to_i }
=> [1, 2, 3, 4]
irb(main):003:0>
>>565 この中でいくつか「やってはいけないこと(習慣としてはいけないこと)」がある
なんでもかんでもやってはいかん
"1234".chars.collect(&:to_i)
Object.singleton_class.ancestors.detect{ |k| k.instance_methods(false).include?(:new) } => Class
class C def self.new super end def initialize @a=3 end end C.new #=> #<C:0xdc3750 @a=3>
>>560 のa[x]は何でa[x-1]じゃなくて答えが合ってるんだろう
a[1]は"2"ですよね?
>>571 > 3.times {|x| p x }
0
1
2
あーなるほど盲点でした。どうもです
574 :
デフォルトの名無しさん :2013/10/02(水) 07:54:32.55
b=[] 4.times do|i| b.push(i+1) end
>>567 具体的にどれのことだろう?
そういう情報は貴重です。
Ruby2.0/1.9環境においては
>>566 の "1234".chars.map{|s| s.to_i} が最適解というか一般解だろうな
>>568 (を素直にmapで書いた "1234".chars.map(&:to_i) )も妥当だがすこしだけ中級編
へー こういうの基本に見えて初心者にとって重要だからためになる
おいおい話がそれてるぞ やってはいけないのはどれだよ
>>564 だな
b.map{|x| x.to_i } は破壊的ではないので、b の内容は変わらない
>>560 もかな
今回のように each や map で用が足りるなら添字での参照は避けるべき
一個ずれ参照などのバグを生みやすい
each と map はがんばって覚える価値があるよ
メソッドチェーンとか初めて知ったby初心者
>>559 も時代遅れかな
str.split('')やstr.split(//)がなにをしているか読める必要はあるけど、1文字分割を目的にこれを書く必要はもはやない
あと、aが文字列で直後に配列bでy、zとキモい変数名が続くのが果てしなくキモい
charsまじなんなん? 俺の本にはそんな単語存在しないし とりあえずstringメソッドに関するものは全部charsつけとくわ
「Stringクラスのインスタンスメソッドcharsは、selfのエンコーディング情報を元にselfを"1文字"ずつ列挙するEnumeratorオブジェクトを返す」 わからない語がひとつでもあったらString#charsは使えない そんな無理して能動的に暗記してまで使うメソッドではないので、使いたいときにマニュアルから探して使えれば十二分
1文字ずつにばらした配列じゃなかったっけ?
2.0 から to_a しなくて済むように配列を返すようになったらしいよ % irb irb> RUBY_VERSION => "2.0.0" irb> "おもてなし".chars => ["お", "も", "て", "な", "し"]
『RとRubyによるデータ解析入門』(
http://www.oreilly.co.jp/books/9784873116150/ )を読んでいてつまずいてしまったのですが、
もしよければ助けてください。Rubyは2.0.0、OSはMac OSX(10.8.5)です。
同書で「クラスからインスタンスを作成する」という話で、こんな例が出てきます(p. 14)。
まずはクラスの定義(書いてあるとおりに実行しました)。
irb(main):001:0> class Dog
irb(main):002:1> attr :breed,:color,:name
irb(main):003:1> def initialize(name,color,breed)
irb(main):004:2> @name,@color,@breed = name,color,breed
irb(main):005:2> end
irb(main):006:1> def bark(volume=:softly)
irb(main):007:2> make_a_ruckus(volume)
irb(main):008:2> end
irb(main):009:1> end
で、オブジェクトを生成します。
irb(main):010:0> my_dog = Dog.new('Rover',:brown,'Cocker Spaniel')
ここまではうまくいったのですが、その続きに、
my_dog.bark #この場合は犬はsoftlyに鳴く
と書いてあったので実行してみたところ、NoMethodErrorで「make_a_ruckusが定義されていない」と言われてしまいます。
このmake_a_ruckusなる部分が何なのかよく分からず(コードを見る限り、barkメソッドの定義に含まれてますよね)、途方に暮れています。
何か対処法があれば教えていただけませんでしょうか。
>>587 そのコードを見る限り、barkメソッドの定義に make_a_ruckus(volume) は含まれていない。
あるのは呼び出しだけなんだが、中身どっかに書いてない?
>>588 それが、これが初出なんです。
ひょっとしてこの例は、読者が自分で入力して試すものではなくて、「クラスの定義ってたとえばこういう感じで書くんだよ」というだけのものなのでしょうか。
ものすごく一般論としては、 irb> とかのプロンプトのあとに書いてある場合、それは疑似コードや一部抜粋ではなく そのまま入力して実行すると結果が得られることを示す だからどっか地の文にでも補足説明があるべきだが、 そんなものがないというなら読者が打ち込んで試すことを想定してない疑似コードなのだろう それこそありがちな例としては本を作るときに章を前後させたので後ろの章(たとえばクラスの継承の章)に書いてあるとか こんなとこつまずくような基礎知識不足な人は本の読者として想定していない(RとRubyはただの道具で初心者説明する気なし)とか
>>590 ありがとうございます。
書き方がまずかったですが、プロンプトは私がターミナルで実行したときのものをそのままコピペしたもので、本には記載されていません。
ターミナルでどういうふうに入力したか、具体的にお伝えしたほうがよいかと思ったもので。
とりあえず、ここはいったん保留して続きを読んでみることにしました。
Arrayのイテレータのブロックの中で配列自身にアクセスすることは出来ますか?
ブロックの中でも外側の変数は見れる a = [1,2,3] a.each {|e| p a }
>>593 その場合ですと a って名前はわからない状態です
?
ブロック内で配列の名前を使わずにってことかな a.each_with_object(a) {|e, arr| p arr }
597 :
デフォルトの名無しさん :2013/10/05(土) 01:15:09.99
リテラルに対して、ということじゃないの?
そんなときこそ instance_eval [1,2,3].instance_eval { each {|e| p self } }
ブロック内でselfを見たいってことだから、どっかでevalするしかねえ
well defined じゃない質問を投げていく人が多いな。 しかも回答に対してあまり応答しないから、質問の意図が絞り込めない。
初心者故分からないことがうまく説明できないのでは
[1,2,3].each{|x| puts x } イテレータという言葉を使ってることに惑わされたが こういう単純なことだったりして
DXRuby使っていてどうしてもわからなくなったので質問。 文字コードを文頭で #!ruby -Ks と指定しているにも関わらず、 Window.captionに日本語(Shift_JIS)で名前を入れると文字化けします。 しかもここ数時間の出来事で、過去のうまくいっていたときのコードをコピーして 同じくWindow.captionで日本語を設定している部分だけを抜き出すとうまくいく始末で、 全く同じコードにもかかわらず文字化けする例としない例が存在していて頭がグッチャグチャです。 ちゃんと日本語(Shift_JIS)を読み取るようにさせたいのですがどうしたらよいでしょうか? ちなみにうまくいくのもいかないのもコードは以下のようになります。 #!ruby -Ks require 'dxruby' Window.caption="てすと" Window.loop do end
>>603 DXRubyはRuby1.8上だとShiftJISサポートのみらしくて、
Rubyの文字コード対応は1.8/1.9/2.0で仕様が「迷走」してきた部分
だから、使っているRubyとDXRubyのバージョンを明記したほうが、
期待している回答を得られやすいと思うよ
# DXRubyは触ったことが無いので、おせっかいモードですた....
>>604 すみません、そこまで考えが及んでいませんでした。
Rubyは1.9.3、DXRubyはdxruby140-mswin32-ruby19 です。
#!ruby -Ks を削除して一行目か二行目に # coding: shift_jis したらどうなる?
>>606 文字化け起こすほうだとエラーになりました。
気になったのでそのままの状態で、
Window.caption="てすと" の部分を
Window.caption="test" に直したらうまくいきまして、
その後更にWindow.caption="てすと"に戻したら
エラーは起きずに文字化けの状態になりました。
もう何がなんだかさっぱりです。
保存時の文字コードがおかしいのだろうとエスパー
>>601 できないことではなくやりたいことを言ってもらえるとかなりの割合でうまくいくのだが
質問のやりかた質問スレとかあるといいけどメタだな
>>611 参照先は見てないけど、以下が気になった
Windowsのコマンドラインでは直接指定できない文字が存在し、
空白や特殊記号を含むパラメタは " (ダブルクォーテーション)で囲む必要がある
パラメタを複数行にはできないのでは?
windows には wget コマンドは存在しない
なので、
ruby -e "(1..3) 〜 "
のように全体をダブルクォーテーションで囲み、中のダブルクォーテーションをシングルクォーテーションに置き換える
また、改行させず全体を1行で記述する
ついでに wget を使っているところを wget に依存しないように書き換える
あたりを試す必要がある
たぶん初心者だときびしい
613 :
デフォルトの名無しさん :2013/10/06(日) 17:29:28.09
やりたいコマンドラインをバッチファイル(r.bat)に保存して、バッチファイルを実行するてもある。 プロンプトでrを入力してEnterをおします
>>611 -e '・・・'の中に書いてあるプログラムをテキストファイルに書き出し、コマンドプロンプトで
ruby ファイル
とやれば実行ばできる。多分。
ただし、611さんも言ってる通りwgetコマンドがないのでエラーになる。
windows版のwgetもあるようなので頑張ってインストールしてみてくれ。
プログラミングを正面から覚える気はないようだから、組んでくださいお願いしますみたいなスレに行ったほうがいいんじゃないの?
keep-alive で sleep 2 をはさみつつ 5000 回 GET というのは許されるレベルなんだろうか お仕事で Web 鯖を管理されたことのある方に聞いてみたい
ページごとにwgetの単発プロセスを実行しているので接続張りっぱなしにはならないんじゃないのかな。
wget -d でヘッダ見れるけど keep-alive してるっぽいよ curl なんかもデフォだと keep-alive しようとする
>>619 そういうのはいらないから自分の言葉で説明しておくれ
MaxKeepAliveRequests
コマンド実行するたび毎度TCP接続をクローズしているのにkeep-aliveもへったくれも無いような。
623 :
611 :2013/10/06(日) 22:10:00.45
625 :
616 :2013/10/06(日) 23:33:04.42
626 :
611 :2013/10/07(月) 00:31:23.52
つか、
>>611 >ruby -e '(1..3).each{|i| html = `wget --quiet --no-check-certificate -O - \
の
ruby -e
は、ファイル内に書いちゃっていいもんなんですか?
なんか、コマンドプロンプトで書くような気がして来たんだけどw
ruby -e と引用符を除いてファイルに記述
628 :
611 :2013/10/07(月) 02:13:38.32
629 :
611 :2013/10/07(月) 02:15:47.26
つか、htmlは文字列を入れる変数、iはインクリメントされる数字の変数ですよね?
どんな処理が書いてるのか読み取れるなら 自分の知ってる言語で書いた方が早いよ
631 :
611 :2013/10/07(月) 02:49:23.00
>>630 過去に、Cとphpをほんのちょびっとかじっただけです。
で、rubyは文字処理に強いと聞いているので、この際マスターしたいのです。
wgetを使わないでどなたか書いてくれないですかね?w
これだと短いプログラムだから勉強になります。
632 :
611 :2013/10/07(月) 02:54:12.05
html.sub(/.*<td><p class="mb5">/m, "").split("\n").each{|l| next unless l.start_with?("<td>"); \ l.strip!; print l == "<td>" ? "\n" : l.gsub(/<\/?td>/, "") + "\t" }; \ この辺の正規表現での文字列操作にすごく興味あります。 これがちゃんと動くプログラムだと、自分で色々変更して勉強になると思うのです。
633 :
うゆさま :2013/10/07(月) 05:19:42.59
>>603 dxrubyはutf−8じゃないと無理だよ
それcaptionだけじゃなくてWindow内に文字列描画しても文字化けするっしょ
634 :
うゆさま :2013/10/07(月) 05:23:53.36
ファイルがshift−jisのままだと #!ruby -Ks require 'dxruby' require 'kconv' Window.caption="てすと".toutf8 Window.loop do end すべてのマルチバイトでこうするしかなくなる ソースファイル自体をutf−8でかけってことだよks
>>632 html.sub(/.*<td><p class="mb5">/m, "").split("\n").each{|l|
next unless l.start_with?("<td>")
l.strip!
print( l == "<td>" ? "\n" : l.gsub(/<\/?td>/, "") + "\t" )
}
HTMLの<td><p class="mb5">までを""に置き換え(=削除)残りのテキストを改行で区切って配列化し枚挙処理
文字列(一行)が<td>で始まっていないなら無視して次の行
文字列の前後の空白を削除
文字列が<td>なら改行を、違うならタグを削除した文字列+タブをプリントアウト
枚挙終わり
636 :
デフォルトの名無しさん :2013/10/07(月) 08:06:00.25
>>610 ごめんなさい、
>>603 =
>>607 です。
返信が遅れてしまい申し訳ありません。
地元のおっさん達に神輿担ぎの打ち上げだとかで日本酒飲まされまくって死んでましたorz
アルハラダメだよ絶対…。
エラーの件なのですが、
>>608 を見てもしや?と思って
普段使っているエディタ(Mery)の文字コードを見てみたら、
いつの間にか日本語(シフトJIS)がUTF-8(BOM無し)が変更されていてらしく、
それを日本語(シフトJIS)に直したらうまくいきました。
>>604 ,
>>606 ,
>>608 ,
>>610 の皆様、本当にありがとうございました。
また何かありましたらよろしくお願いいたします。
>地元のおっさん達に神輿担ぎの打ち上げだとかで日本酒飲まされまくって死んでましたorz 「次はこの若いあんちゃんを担ごうぜ!」「おう!」 「セルフ!アペンド!セルフ!インサート!」 rescueされることのないStopIteration 神輿担ぎ夜の部はまだ始まったばかりだ
rescueされることのないStopIteration 神輿担ぎ夜の部はまだ始まったばかりだ
640 :
611 :2013/10/07(月) 14:35:46.35
>>635-636 教えていただき、ありがとうございます。
require 'open-uri'
(2..5).each{
|i| html = `open(
https://i.tipness.co.jp/pc/schedule/registration/?page=#{i} ){}`
html.sub(/.*<td><p class="mb5">/m, "").split("\n").each{
|l| next unless l.start_with?("<td>")
l.strip!
print( l == "<td>" ? "\n" : l.gsub(/<\/?td>/, "") + "\t" )
}
}
を、ruby t04.rbとすると↓のようになります。
C:\a>ruby t04.rb
t04.rb:3:in ``': Invalid argument - open(
https://i.tipness.co.jp/pc/schedule/reg istration/?page=2){} (Errno::EINVAL)
from t04.rb:3:in `block in <main>'
from t04.rb:2:in `each'
from t04.rb:2:in `<main>'
641 :
611 :2013/10/07(月) 14:39:49.04
642 :
611 :2013/10/07(月) 14:43:20.60
すみません、
>>641 の(p)は、ないものとして下さい。
だいぶ前にも言ったと思うんだけど、スクリプトの作り方が違う まったくなにも知らない状態でまったく知らないまったく教育的意図のないスクリプトを利用改造することは実質不可能 スクリプト言語を学ぶのが目的ではないのなら、あなたがやることはスクリプトを書くことではない なにか専用のアプリケーションを使って目的を達成するべき この場合はダウンローダーとかなにかそういうもの
>>641 `` (バッククォート)はその中のコマンドラインのコマンドを実行してその標準出力を文字列として返す。
なのでまずopenコマンドというコマンドラインコマンドが無いとダメなんだけど、ある?
要するにやりたいのは指定されたURLのページをダウンロードしてきて中身を変数htmlに入れること。
これをRubyだけでやりたいのであれば例えばnet:httpという標準ライブラリを使う。
・・・ただこれ、単純なことをやるだけであれば無駄に使うの面倒臭いんだ。
上記のURLはhttpsなのでnet:httpsを使う必要もあるし。
他にもhttpclientというライブラリをgemsでインストールして使う、とか。
>>641 バッククォートで囲むと何が起こるのかまず調べてみることです。
そして、open-uriのサンプルを探して、openメソッドをどう使えばいいか調べるといいでしょう。
>>643 プログラミングに触れるきっかけは何でもいいんですよ。
仕事じゃないんだから。
>>646 仕事じゃないんだからわざわざ開発実行環境インストールして
ぜんぜんわけわからんものわけわからんのに書き換えてぜんぜん動かなくて
わけわからんのに質問してわけわからんこと言われて放置されて4日経ってひとつも進んでないなんて
やってられんのですよ
>>645 gemってなんですか変数ってなんですかってレベルの人にするアドバイスじゃねえな
コンコルドの誤りってやつですな
せっかくここまで時間かけてやったんだからって奴
>>641 おそらくこれから先もトラブルなんかで数時間数十時間の時間がかかることが予想される
(そのスクリプトはもともと他人が使うようにはできていない)
今回のは手作業なり、サイトダウンローダーなり使うなりででも終わらせてしまうといい
もしプログラミングに興味があるのなら(ないと思うけど)別途入門書や入門サイトで勉強をおすすめ
>>647 あなたは効率的に人生を生きてるんだね。
651 :
611 :2013/10/08(火) 01:21:44.26
652 :
611 :2013/10/08(火) 01:28:45.12
654 :
611 :2013/10/08(火) 02:48:29.33
>>653 おお、すばらしい、ありがとうございます。
これでさらに、
「puts f.read#取得して1行ずつ読み出す」
の行を
「ターゲットの文字列をテキストに書き出す作業をする」
の行に置き換えられないでしょうか?
文字列に強いrubyならテキストファイルを作る、
そこに、抽出した文字列を追加書きする、なんて関数がありそうな気がするんですが。
655 :
611 :2013/10/08(火) 03:02:16.79
656 :
611 :2013/10/08(火) 03:04:19.98
これで、
>>635 の文字列操作が使えれば万々歳なのだけど。
上の方々の回答や提案無視して質問繰り返すのって、どうなんでしょう。 せめて調べたふりくらいはしましょうよ・・・
ぬるぽ君とめりぽ君の月のお小遣いを比較して、2人のお小遣いの総計も出します。 2人とも貰えない月というのがあります。集計期間は両者一定であり、仮に12ヶ月とします。 ぬるぽ君のお小遣いのデータは nulpo = [ { 'month' => '1', 'money'=> 100 } { 'month' => '2', 'money'=> nil } { 'month' => '3', 'money'=> 100 } { 'month' => '4', 'money'=> nil } { 'month' => '5', 'money'=> 150 } ] こんな感じのハッシュになっています。(厳密に言うと型はHashではなくてActiveRecordの戻り値ですが) それを↓のような配列にしたいのです。 [ ['1', 100, 200, 300] ['2', 0, 200, 200] ['3', 100, 0, 100] ['4', 0, 0, 0] ['5', 150, 0, 150] ] 月 ヌルポ メリポ 計 ※最初の要素が月、次にぬるぽのお小遣い、めりぽのお小遣い、2人の合算が来るということです。 array = [] (1..12).each do |month| temp_array = [] temp_array[0] = # 月を代入 temp_array[1] = # ヌルポ君のお小遣いを代入 temp_array[2] = # メリポ君のお小遣いを代入 temp_array[3] = # 2人のお小遣いを合算して代入 array << temp_array end ・・・自分で書いたらこんなコードになりそうなのですが・・・・もう少し良いコードはございますでしょうか?
659 :
611 :2013/10/08(火) 03:22:27.49
>>657 ぶっちゃけ、
回答や提案を言われてもよくわからないのです。
入門者なので具体的なプログラムを提示してくれないとわかりません。
学習する意欲の無い人を初心者って呼ぶかなあ? 結果だけ欲しいなら元のスレで動きませんでしたって報告して 別の人に答えてもらえば良かったんだよ require 'net/https' (http=Net::HTTP.new('i.tipness.co.jp',443)).use_ssl=true (1..3).each{|i|http.get("/pc/schedule/registration/?page=#{i}").body[/^<table class="table2[^>]+>(.*?)<\/table>/m,1]. scan(/^<td>.*$/).each{|td|print(td=='<td>'?"\n":td.gsub(/<\/?td>/,'')+"\t")};sleep 2}
Javaスレの人、追い払い方上手ね 見習いたいもんだ
>>658 def f(arr)
arr.map { |hash|
money = hash['money']
[hash['month'], if money then money else 0 end]
}
end
f(nulpo).zip(f(melipo)).map { |(month1, money1), (month2, money2)|
raise "month1: #{month1}, month2: #{month2}" if month1 != month2
[month1, money1, money2, money1 + money2]
}
663 :
662 :2013/10/08(火) 08:37:27.25
インデントがズレていたので再カキコ def f(arr) arr.map { |hash| money = hash['money'] [hash['month'], if money then money else 0 end] } end f(nulpo).zip(f(melipo)).map { |(month1, money1), (month2, money2)| raise "month1: #{month1}, month2: #{month2}" if month1 != month2 [month1, money1, money2, money1 + money2] }
数列ごとに配列化するのはどういう定石があるのでしょうか? 例えば5列ごとなら[1,2,3,・・・・23]を [1,2,3,4,5] [6,7,8,9,10] .... [16,17,18,19,20] [21,22,23]にする感じで。 一応その目的は a=[*1..23] b=[] while a[0] do b << a.shift(5) end p b あたりで達成はできるのですが
元の配列を操作するなんて論外でしょ
Rubyの基本的なクラス、String、Array、Hash、の元になるEnumerable、あとIntegerあたりのメソッドは見ておくといい
暗記しなくていいから、どんな動作するメソッドがあるかだけでも見ておくといい
必要になったときに頭になんか引っかかるから
ttp://doc.ruby-lang.org/ja/1.9.2/class/Array.html 読みにくいけどな!
i
rb> (1..23).to_a.each_slice(5).each{|a| p a}
[1, 2, 3, 4, 5]
[6, 7, 8, 9, 10]
[11, 12, 13, 14, 15]
[16, 17, 18, 19, 20]
[21, 22, 23]
たぶん最初のto_aいらん (1..23).each_slice(5).to_a
>>667 今回は「いる」と思う
配列なんとかしたいですという質問なのだから、配列という区切りは例示であったほうがいい
変にirbでワンライナーにするから意図がわかりにくいのだけども
arr = (1..23).to_a
arr.each_slice(5).each{|a| p a}
うむ完璧
irbとかって2行3行にすると見難くなるんだよな なるべく1行で書いて、残りは結果表示にしたい
671 :
611 :2013/10/08(火) 17:40:43.46
>>660 ありがとうございます。
しかし、↓こんな感じで、エラーになります
C:\a>ruby t12.rb
C:/Program Files/Ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:918:in `connect': SSL_con
nect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verif
y failed (OpenSSL::SSL::SSLError)
from C:/Program Files/Ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:918:in `bloc
k in connect'
from C:/Program Files/Ruby-2.0.0/lib/ruby/2.0.0/timeout.rb:52:in `timeou
t'
from C:/Program Files/Ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:918:in `conn
ect'
from C:/Program Files/Ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:862:in `do_s
tart'
from C:/Program Files/Ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:851:in `star
t'
from C:/Program Files/Ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1367:in `req
uest'
from C:/Program Files/Ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1126:in `get
'
from t12.rb:3:in `block in <main>'
from t12.rb:3:in `each'
from t12.rb:3:in `<main>'
全く成長していない・・・ さすがにもうスレ違いなんじゃないですかね 冗談抜きで、手動でやった方が早いまである
1.8から2.0にしたら日本語コード系の問題多くて嫌になった。 ソースコードの日本語コードがどーたらあーたらとめんどくせえ。 どっかにすっきり分かる解説ってないの?
ふと思ったんですが、みなさんはある変数がnilでないことを判定する際に if variable と、 unless variable.nil? とでは、どちらを使っていますか? 自分のコードを見直した時にまざっていて気持ち悪かったもので…
677 :
デフォルトの名無しさん :2013/10/08(火) 20:57:22.61
場合に応じて読みやすい方だけど、 unless else が繋がる場合は、分かりづらいので、 真偽か処理内容を逆にして if else にしたり。
678 :
676 :2013/10/08(火) 21:13:52.17
>unless else が繋がる場合は、分かりづらい なるほど。たしかに、これは自分も感じます。 また「if variable」でtrueが返るのは、 variableがnilでない時とfalseでない時になるので、 厳密にnilでないことだけを判定したい場合や、 nilでない!というニュアンスを強めたい場合に 「unless variable.nil?」と書こうかなと考えました。 ありがとうございました。
ふと思ったんですが、みなさんはある変数がnilでないことを判定する際に if variable と、 unless variable.nil? とでは、どちらを使っていますか? 自分のコードを見直した時にまざっていて気持ち悪かったもので…
誤ってリロードして再投稿してしまいました。すみません…
681 :
デフォルトの名無しさん :2013/10/09(水) 01:33:44.51
Windows上でRubyの1.9をインストールしてnokogiriを使ってます。
ちょっと実験ということで人気のDMMで女優名を取得しようとしてるんですが、
どうにも取得できない名前があります。
具体的には
http://www.dmm.co.jp/digital/videoa/-/actress/=/keyword=ta/ の田村真樹やら田村まほなど。
doc.xpath("//div[@class='act-box']").inner_text
こんな感じに書いて一応は一覧は取得できるんですが、
どういうわけか歯抜けになります。
どう見ても同じ構造に見えるんですが、何か見落としがあるんでしょうか?
あ、すいませんURLコピペしてて間違いに気が付きました。 違うURLで試してました…orz こんなアホなミスで何時間も格闘してしまったw スレ汚し失礼しました。
>>676 俺はCやC++経験が長いせいか、制御なんかはifで分ける方が好きだなあ。
Rubyって.でどんどん繋げて一行で実現しようとする傾向あるでしょ。
それやりすぎると、パズル的な読解が必要になって面倒になってくるんだよね。
一行当たりの情報量の粒度、インデントとかの「パターン」として見た目で
制御がわかるような書き方の方が、結局あとからメンテしやすいのではないかと。
完結だから、とか日本語と語順が同じだから、とかで1行連続型を勧める
人が多いのは俺にはあわん。
ふと思ったんですが、みなさんはある変数がnilでないことを判定する際に if variable と、 unless variable.nil? とでは、どちらを使っていますか? 自分のコードを見直した時にまざっていて気持ち悪かったもので…
unless variable==nil
unless version>1.9
if variable != nil
689 :
デフォルトの名無しさん :2013/10/09(水) 18:23:12.82
>>675 るびまの記事が参考になるかも。
Ruby M17N の設計と実装
magazine.rubyist.net/?0025-Ruby19_m17n
Ruby 2.0.0 の注意点やその他の新機能
magazine.rubyist.net/?0041-200Special-note#l2
クックパッドを Ruby 2.0.0 に対応させた話 - 文字エンコーディング関係
magazine.rubyist.net/?0042-MigratingARailsApplicationToRuby200#l21
PerlとPythonじゃなくてなぜRubyを選んだのですか?
691 :
デフォルトの名無しさん :2013/10/09(水) 18:34:20.30
逆に、なぜPythonなのかとききたい。Pythonのかきかた(インデント)がイヤなら、Rubyだ
Perl -> Python と使ってきて、Ruby にも興味があったからです 並行して、C# や Haskell も習得中です
先に触ったのがRubyだったし インデントは別にいいけどselfが嫌だし 1行に詰め込みたい症候群だからなあ まあPythonも内包表記は好きだけどな、特にfor2つの時の挙動
先に触ったのはRubyだったけど Pythonに乗り換えた 一番の理由はRubyはGUIのフレームワークがどれも糞だった
RubyのGUIは「Rubyでやること」が目的だからな 「GUIでなにかやること」が目的なら他の言語でやればいい
なるほどPythonやってくる
webkitが使えるライブラリがあればなあ
GUIいう人はどうせWindowsだろうからwin32使えばいいんじゃないの びじゅあるなんたらとか
699 :
デフォルトの名無しさん :2013/10/09(水) 21:55:40.29
rubyはjrubyとrawrがいいらしいよ
日本語まわりの実装ってPythonもRubyも大差ないの? 日本生まれだからRubyの方が出来がいい、とかない?
他のLLは標準コーディングスタイルがありますが Rubyにはないんですか? もしないなら松本先生に作ってもらいたい
>>700 EUC/SJISが主流の時代には日本発のRubyのほうが出来がよかったけど(過去形)、
どのプラットフォームでもUTF-8が普通に使える今の時代では大差無し
残念なことに、現行の1.9ではマジックコメントやら添付ライブラリといった変更で
日本語処理周りに不要な混乱を起こしたことで、逆に弱点となった....と思う
個人的にはRubyの進化(1.6から2.0)の流れを好意的に見ているが、
1.9の日本語対応だけは大失敗だったと見ている
まあ、あと数年もすれば2.x系が主流になるから、それほど気にはしていないが....
インデントはスペース2つとか?
1.9.1飛ばしていきなり2.0になってればまた違ったんだろうけど、たらればの話になっちゃうな 1.9.0と1.9.1があったからこそなんとかなった面も多いわけで
>>702 >1.9の日本語対応だけは大失敗だったと見ている
エラー→Webで調べておまじない、みたいなのが多くて疲れた。
日本語でてこない、コメントでしか使ってないようなログ解析のスクリプトが
突然エラーとかで疲れた。
いろいろ嫌な思い出。
もうちょっとなんとかならなかったのかね?
707 :
デフォルトの名無しさん :2013/10/10(木) 10:10:00.73
708 :
デフォルトの名無しさん :2013/10/10(木) 12:21:40.57
>>690 入門で出てくるプッツとゲッツがコンビ芸名みたいで可愛かったから
windowsでpythonのvirtualenvで仮想環境を作ってgemを別々に管理する方法を教えてください
なぜしたいかというと今gem listってしたら大量のパッケージがあふれかえってて訳がわからなくなりました
とにかくRubyのソースコードをダウンロードしたくないので Web上でp 100のpに関する実装を見たいのでURLください
713 :
709 :2013/10/11(金) 09:31:22.39
やっぱりないんですね・・・
rubyもsqlite3ぐらいは標準ライブラリに入れてもいいと思うんですが
pythonスレ見ましたねわかります
例外処理とやらを実装してみたらえらくロバストなプログラムになって感動したぞ
2013年10月のPYPL PopularitY of Programming Language indexが 公開された。PYPLはGoogle検索エンジンにおいてプログラミング 言語のチュートリアルが検索された回数から、対象となるプログラ ミング言語がどれだけ話題になっているかをインデックス化したもの。 1 Java 26.8% 2 PHP 13.2% 3 Python 9.8% 4 C# 9.5% 5 C++ 9.1% 6 C 8.4% 7 Objective-C 8.1% 8 Javascript 7.6% 9 Visual Basic 3.1% 10 Ruby 2.6% ←がんばれ
やっぱり一行野郎として使うにはPerlのような魔機能で負けているんですかね?
Rubyが流行らないのは仕様などの議論が英語ではなく日本語メインだから 日本では流行っても海外では相手にされない
Top10に入ってるのに流行ってないとかアホらしい これだけがんばれれば十分
TIOBEとかこの手の調査とか本当にどうでもいい。検索エンジンソースだし
>>717 意外とpythonって健闘しとるんやね。
この調査だと毎年下がってるね
サイト名が pyDatalog ってまったくもう
725 :
611 :2013/10/12(土) 03:05:34.48
Rubyは日本でがんばるしかないのに、 君たちが入門者を冷たくあしらうから、先細りなんだよw 俺もpythonに行っちゃったしw
726 :
611 :2013/10/12(土) 03:20:01.33
そもそも、Rubyとpythonが統合すればいいんじゃないの?w ほぼ、同じような感じするんだけどw
727 :
611 :2013/10/12(土) 03:21:14.68
ちなみに、PHPはコマンドプロンプトでは動かせないんですよね?
728 :
デフォルトの名無しさん :2013/10/12(土) 04:16:16.32
うごく
729 :
611 :2013/10/12(土) 05:17:23.36
>>728 ああ、そうですか。
つまり、パソコンの能力が上がってきたから、何でも出来るって感じなんですかね?
ひょっとして、Cもコンパイルなしで、
コマンドプロンプトで動かせたりして?
2枚の画像入力してどのくらい似ているかを0〜100で返してくれるライブラリ無いですか
>>729 C++インタプリタも存在してるね
まあスレチだし自分で調べるかC関連のスレで聞いてくれ
732 :
デフォルトの名無しさん :2013/10/12(土) 11:11:36.89
>>730 image similarity ruby でぐぐったら similie という gem があったけど、
これはハミング距離だから出力範囲がアレだな。
733 :
デフォルトの名無しさん :2013/10/12(土) 11:12:44.91
734 :
デフォルトの名無しさん :2013/10/12(土) 15:30:56.38
735 :
デフォルトの名無しさん :2013/10/12(土) 16:17:10.34
736 :
デフォルトの名無しさん :2013/10/12(土) 16:47:15.73
おれはそうは思いますん。
英語ができないクズのせいでRubyが良くならない
ホントにPythonマニアってのは、 Rubyが気になって気になってしかたないんだねえ....
おれもそうおもう
マイノリティの大半はそんな物だ。
githubにあるrubyのソースコードにプルリクエスト送るときってさ ブランチ名はなににしたらいいのかおしえて バグをみつけたけどこのへんのルールがわからん
fix-hoge とかが無難かな
王様のブランチ
Rubyで簡単にWindows向けのGUIアプリ作れたらいいのになあ
なんかそういうフレームワークなかったっけ? あとiOSやAndroidのアプリが簡単にできるフレームワークっていいのある?
Windows では、Microsoft が作る開発環境が他を駆逐するんだよ。
Windows向けのGUIって条件ならVisualStudioは便利や
プログラミングRubyとプログラミング言語Ruby どっちの本が好きですか
ヴェルタースオリジナル
公式サイトに物申したいんだけど ロケールで自動的に日本語サイトに飛ばしたり英語サイトに飛ばすのやめてもらいたい そんなのサーバ側で勝手にやるのはおせっかい 俺は英語でみたいんだよ
>>751 それは公式サイトの管理者へ(メール等で)直接要望を伝えるか、
または公式メーリングリスト(ruby-talk)で物申せばいいのではないかと....
ここ(=2ch)でグダグダと文句を言うだけでは何も始まらないよ
なぜここで書いたか? だって俺はRubyはメインで使ってないから
メインで使ってなかろうがそういうことは本人に言うんだよ社会常識の問題だわ
メインで使ってるかどうかって関係なさすぎる 要するに愚痴を聞いてもらいたかっただけなんだろ
756 :
794 :2013/10/13(日) 17:40:58.21
ここ初心者スレだよね? 書店に行くから参考にしたいと思って聞いたのに誰も答えてくれないし 後の書き込みへの罵りばっかりってここけっこう民度ひどくないかな
749でした・・・
758 :
611 :2013/10/13(日) 17:41:52.36
おれもそうおもう
>>756 本の良し悪しなんてその人次第だからなあ、答えようがない
誰かにとって良い本が他の誰かには糞だったりもする
万人に糞な本ならしばしばあるが、万人に良い本は本当に稀
てか答えようがないものに対してスルーされるのはマシなほうの対応よ?
スレによっちゃ割とまともな質問すら罵倒しかこないのに
良いレストランないですか? そんな食い物の善し悪しなんてその人次第だからなあ、とか言い出したらなんも言えなくなる。
>>756 1時間くらいで答えが帰ってくるほど人いないよ。
おれは、たのしいRubyが好きだな。
プログラミング言語Rubyは2.0は出ないんだろうか。
まつもと先生は何をしてお金を稼いでいるのですか やっぱり講演だけで食ってるんですかね 俺も金持ちになりたいので日本を代表するまつもと先生にあこがれてます あとdankogaiさんとか堀江さんとかいますけど こういう人は何で儲けてるんですかね プログラミングができるだけじゃ食っていくのは難しいのでしょうか? そりゃそうですよね 今は高校生でプログラミングする人おおいですもんね
>>763 ひとつだけいえることは,
今,君が「プログラミングで儲けている」という人も
またプログラミングで名声を得ている人ですらも
「その人自身は,はじめた当初はそれを全然期待していなかった」
ということだね
765 :
デフォルトの名無しさん :2013/10/13(日) 20:11:48.13
桐島、Rubyやめるってよ
http://magazine.rubyist.net/?0042-FollowUpKirishimaRuby >ヒロキは某社内では人並み以上にプログラムが書ける自信があり、実際にエースとし
>て扱われているわけです。 しかし、ヘタに人並み以上にプログラムが書けてしまう
>がゆえ、自分が「スゴイ級」のプログラマではないことも痛感していました。 天才
>ハッカーみたくイノベーティブなプロダクトを作れる気がしなかったのです。 その
>ため自分がこれから先、何を目的にプログラミングをしていけばよいのか意味を見い
>だせなくなっていました。
これもおもしろいよ。
>>764 >「その人自身は,はじめた当初はそれを全然期待していなかった」
>ということだね
こういう無欲たれみたいなことをいうけど、結構綺麗事で実は個人的な成功への欲求って重要なんじゃないの?
ノーベル賞も裏では苛烈な嫉妬や競争渦巻く世界らしいじゃん。
>>761 レストランとはちょっと違うんじゃない。
Javaやってた人にはわかりやすくても、C言語しかやってない人にはさっぱりわからない本とかもあるだろうし。
好みじゃなくて、対象を絞って書かれているから。
769 :
デフォルトの名無しさん :2013/10/13(日) 20:58:31.92
それはないな。 逆はあるかも。
失敗してノーベル賞もらった人なんているのかな?
>>766 これはさすがにnaoya宣伝乙って言われても仕方ないよね
naoya 氏はこんなところで宣伝する必要が皆無なのでそんなこと言われないと思う
本人降臨wwwwwwwwwww
>>770 科学系の場合
失敗してそれが成功のきっかけっていうのが
ノーベル賞選定の条件にあるらしいよ
naoyaってだれだそそんなに有名じゃねえだろ
>>767 >こういう無欲たれみたいなことをいうけど、結構綺麗事で実は個人的な成功への欲求って重要なんじゃないの?
>
>ノーベル賞も裏では苛烈な嫉妬や競争渦巻く世界らしいじゃん。
とても分かりやすい比喩だね、某半島国家のノーベル賞事情とまったく同じ構図だ.....
普通の国(日本を含む):
知性的探究心と世界貢献のために研究に励んでいたら、気がつけばノーベル賞を次々と受賞
某半島国家:
個人(ないし国家)が受ける称賛への強烈な渇望により、ノーベル賞獲得を目指して
苛烈な嫉妬や競争を繰り広げたあげく、未だにノーベル賞ゼロ記録を絶賛更新中w
>>770 みんながこうだと思ってるような本命予想を証明する研究の場合、規模の勝負になりやすい
カミオカンデとか素粒子を検出するだけでアホみたいな巨大な設備要するし
物事が予想通りに進むだけなら、単純に規模が大きい方が体力の差で押し勝つだけになってしまう
科学に限らずどの分野でもそうなんじゃないか?
カミオカンデで理論が証明されると誰がどれだけ儲かるの?
779 :
デフォルトの名無しさん :2013/10/13(日) 21:34:39.87
>>775 naoyaさん知らないのか
Ruby初心者スレッドで名無しの振りして宣伝してた偉人じゃないか
>>778 光センサーの浜松ホトニクスと東大の宣伝になるぐらいで誰かが儲かるってことは特に無いんじゃないか知らんけど
781 :
デフォルトの名無しさん :2013/10/14(月) 06:18:55.29
>>745 DXrubyなりSTARrubyなり、探せばいくらでもGUIライブラリあるだろ
Ruby/Tk かんたんだよ いろんなかきかたがあってとまどうけど
gollumってさあるじゃないですか gitでデータを管理するwiki あれってどうやってgitからデータを取得しているんですか? コマンドラインにgit logみたいなのを渡して結果を取得してる感じですか? それともgitにはそういうapiがあるのですか?
>>778 人類が月に行けても、人類そのものとして、行ったことそのものとしては「儲からなかった」のと同じ
月になにかがあったわけでもないし、道中結構人死んでるし、開拓航路のようになにか持ち帰って売れたわけじゃない
そうだな 未開の宇宙人に出会って 高価なものをだまくらかして安値で買って来て こっちの糞価値のものをあっちで高値で売って来るのが貿易だよな
月旅行も同じで、月面では豊富にある重水素を地球に持ち帰れば高値で売れる 現在の課題は輸送コストと核融合の実現だけど、それらがクリアできれば....
787 :
デフォルトの名無しさん :2013/10/14(月) 15:39:15.12
rubyってinvalidな文字列を取り除くメソッドってないのか? 一旦内部エンコーディングとは別の文字コードにinvalidオプション付きのencodeで変換して そこからもう一度内部エンコーディングの文字コードにencodeとかアホか
788 :
デフォルトの名無しさん :2013/10/14(月) 16:34:14.61
>>787 2.1で String#scrub というのが追加される。
プレビュー版で使えるので使用感を試して見てくだされ。
789 :
デフォルトの名無しさん :2013/10/14(月) 16:36:29.84
>>782 tkでorcaしてみたけど単純なアプリでも起動にごっつり時間かかるのが泣けるなあ…
すまんocraだった
>>767 >>776 日本を含む東アジアは似たようなもんだよ.
日本人が自国の研究に対して手放しに評価することはほとんどない.田中耕一氏の場合も海外からの推薦だったという.
ただし,東アジアでダントツに日本の受賞が多いのは,それだけ優れた研究がなされていたということではある,それは誇っていいのだろうね.
ruby もおんなじだね.
>>786 月面上でエネルギーに変換して地上に送る,と思うよ.もう核炉を地球上に作らせてもらえる時代じゃないよ…
rubyは学ぶ価値がありますか?
単体では特にはないです その点ではコンピュータプログラム言語はみんな同じだけども
日本生まれという以外にrubyの優位性は何かありますか?
すべてのプログラミング言語の中でもっともRubyっぽい
>>796 人によってRubyを好きになる理由はそれぞれだけど、
以下は自分の場合(比較対象は他のスクリプト言語)
・純粋オブジェクト指向言語である(ただし、Smalltakほどではない)
* あらゆるすべてのデータがオブジェクトなので、柔軟なプログラミングができる
* 最初からオブジェクト指向たることを目的に設計されているので、
素直なオブジェクト指向プログラミングができる(OOPの学習にも適している)
たとえば手続き型言語に後からオブジェクト指向を接ぎ木したPerlにはblessが、
Pythonには__self__といった意味不明な規則があるけど、Rubyにはそれが無い
・関数型プログラミングに適している(Matzによれば、Rubyの先祖はLispであるとのこと)
* あらゆるすべての構文が式なので、柔軟なプログラミングができる
たとえばPythonでは同じ条件分岐でも文と式を使い分けなければならないけど
Rubyでは気にする必要が無いし、同じくPythonのラムダ式の本体に変数宣言が書けない
といった(後から関数型を接ぎ木したことを要因とする)制限が無い
* Smalltalkから引き継いだブロック構文により、高階関数を簡潔に書ける
あと個人的には、Raccという完成度の高いパーザジェネレータが初期(=1.6の時代)から
存在した事も、Rubyを選んだ(=Perlから乗り換えた)理由として大きかった(そして、今でも大きい)
HTML+CSS+Javascript+PHPと比較するとRubyはPHPに取って代わるものという認識でいいんでしょうか?
800 :
デフォルトの名無しさん :2013/10/15(火) 00:14:55.94
パフォーマンスは他の言語と比べて仕様上よろしくない あと言語経験少ない人から見た可読性もよろしくないからチームの開発に向いてない ただ書いてて楽しい黒魔術面白すぎだは
801 :
デフォルトの名無しさん :2013/10/15(火) 01:05:42.63
黒魔術に興味あるならC++しかない。
JavaScriptにリソースが集まってるんだから普通に考えたらJavaScriptを使った方が幸せになれる もはやRubyで幸せになれるのはRubyを作ってる連中だけなんじゃないの? という希ガス
javascriptを触ってみてjavascriptだけでいいなんて言う奴がいるとはとても思えないくらいjavascriptはクソ言語
宗教論争を隔離するためにスレがわかれたというのにお前らときたら…
テキストファイル処理などのワンライナーをとても書きやすい言語の一つなので これをメインの言語として勉強したりこれを使って使って大きなものを書く予定が 無くとも、第二言語や便利な小道具として知っていて損はない言語。
そういう意味ならRubyじゃなくてもいい Rubyの代わりいくらでもある
うんそうしてる とか書くと なんでこのスレ見てんだ とか言うんだろうな きもいな
812 :
1/2 :2013/10/15(火) 14:51:07.24
class Hoge def self.connect(module_name_str) cap = module_name_str.capitalize.to_sym con = self.const_get(cap) HogeHoge1.class_eval("include #{con}") HogeHoge2.class_eval('include #{con}") HogeHoge1.new end class HogeHoge1 end class HogeHoge2 end module Setting1 end module Setting2 end ... end --------- foo = Client.connect("setting1") foo.unkochinkomanko ...
813 :
2/2 :2013/10/15(火) 14:51:59.10
こんな感じで動的にモジュールをインクルードしてるんだが モジュールの中にはHoge1だけで使うメソッド、Hoge2だけで使うメソッド、両方で使うメソッドが存在していて これだと不必要なメソッドまでインクルードしてしまうということで分離したい ただモジュール自体を分離することはなるべく避けたい (モジュールの更新、追加時に余計な手間がかかるため) モジュールのメソッドのアクセス制御をインクルードされるclass別に設定するみたいなことって出来ないんだろうか? このモジュールのメソッドはHoge2にインクルードしてもHoge1からしかアクセス出来ないよーみたいな もしくは設計そのものを見直すかうーん
× foo = Client.connect("setting1") ○ foo = Hoge.connect("setting1") こうだなすまん あーなんでめんどくせー他人の尻拭いせにゃならんのだ
815 :
デフォルトの名無しさん :2013/10/15(火) 15:37:52.99
include の挙動は append_features に従うので、 再定義したらうまいこと出来るような気がする。
>>798 青木峰郎さんに感謝やな
彼はドラゴンブック参考にしたらしいけど
一橋大学出た文系プログラマってとこもミソな
配列じゃなかったら配列を返すメソッドって何かありませんでしたっけ? id_array = Array.try_convert(id) || [id] みたいに書くのまどろっこしくて。
818 :
デフォルトの名無しさん :2013/10/17(木) 22:12:18.46
Array(id_array)
やめといたほうがいいと思うなあ やめといたほうがいいと思わないなら止めないけど
1234 abc 5678 def という内容のtest.txtみたいなファイルを作ります。 で、rubyのワンライナーで ruby -Ku -n -e 'print if /¥d¥d¥d¥d¥d/' test.txt と入れます。 行頭が5桁の数字にマッチするので、何も出力されないのが正解なはずです。 Mac OSでは確かにそうなるのですが、WinXPにインストールしたRubyだと マッチして両方の行が表示されてしまいます。 何が違うんでしょうか?
コマンドプロンプトの '...' はとんでもない挙動だった覚えが
コマンドプロンプトなら "〜" だね ワンライナー内でダブルクォート文字列使いたい時は qq 使う
「数字が5つ連続して存在している行を表示」 なので表示されるのが正常動作 なぜMacだと表示されないのだろうか? Windowsしか所持してないのでわからない Ruby自体は、自前でコマンドラインをパースしなおすから '' でも ""でも大丈夫だが CMD.EXEは ""しか認識しないので 特殊文字を引数にしたいときには注意 ついでにファイル名補完もRubyがやってくれて (UNIXのshellみたいな)Dir.globと同仕様なので何気に便利 ruby hoge.rb foo{1[89],2[012]}.txt とかできる
>なぜMacだと表示されないのだろうか? ¥になってるというオチで終了
5つだからマッチしないんでしょ XPでも表示されなかったぞ
んなアホな、と思ったが再現するなw 元の文がわかりづらいが、Windowsのコマンドプロンプトで表示されるのがおかしいという意味だね 俺のはLinuxのシェルだが、そこでマッチしないのがコマンドプロンプトではマッチする シングルクオートで囲まれた領域で-eオプションだと、プログラム本文と同一ということだと思っていたが、違うんだな 詳しい人の解説&追試求む
824 が言ってることがわからん。 821が書いた数字は4連続なんだが。 単に勘違いか。 俺はMacしか持ってないから確認できない。 $& でマッチした文字列を表示してみたらどうなる?
再現するバージョン教えて
>>830 Win8 + Ruby2.0.0 で試したけど " と ' どっちで括っても再現しなかった
とりあえず再現できる人の OS と ruby -v が知りたい
OpenClipboard = Win32API.new("user32", "OpenClipboard", ["I"], "I") CloseClipboard = Win32API.new("user32", "CloseClipboard", [], "I") SetClipboardData = Win32API.new("user32", "SetClipboardData", ["I", "I"], "I") EmptyClipboard = Win32API.new("user32", "EmptyClipboard", [], "I") CF_TEXT = 1 GlobalAlloc = Win32API.new("kernel32", "GlobalAlloc", ["I","I"], "I") GlobalLock = Win32API.new("kernel32", "GlobalLock", ["I"], "P") GlobalUnlock = Win32API.new("kernel32", "GlobalUnlock", ["I"], "I") GlobalFree = Win32API.new("kernel32", "GlobalFree", ["I"], "I") GMEM_MOVEABLE = 2 GMEM_ZEROINIT = 0x40 GHND = GMEM_MOVEABLE + GMEM_ZEROINIT Lstrcpy = Win32API.new("kernel32", "lstrcpy", ["P", "P"], "P")
def set_text(t) return if t == "" || t == nil sleep 0.2 while OpenClipboard.call(0) == 0 begin if handle = GlobalAlloc.call(GHND, t.bytesize + 1) begin if ptr = GlobalLock.call(handle) Lstrcpy.call(Fiddle::Pointer[ptr], Fiddle::Pointer[t]) EmptyClipboard.call SetClipboardData.call(CF_TEXT, handle) GlobalUnlock.Call(handle) end rescue GlobalFree.call(handle) end end ensure CloseClipboard.call end end
>>828 勘違い
コピペせずに
適当に5桁の数字入れてた
>>821 WinXP Ruby1.8.7
再現しない(表示されない)
gsubにてマッチした数値を使用して計算した結果に置き換えるには 置換文字列をどうすればいいのでしょうか? できなかった例(値を2倍) hoge='Q=123' print hoge.gsub(/Q=(\d+)/,'Q=\1*2')
別にgsubでなくてもいいんじゃないの、てのはおいておいて 文字列を数値または式に変換する必要がある 前者なら、数値部分だけを数値変換 Q = hoge.sub(/Q=(\d+)/, '\1').to_i * 2 後者なら全体を式として評価 eval(hoge.sub(/Q=(\d+)/, 'Q=\1*2'))
ブロック使えば
例に対してはこんな風には書けるけど、 これがやりたかった事なのかは疑問 hoge.gsub(/(?<=Q=)\d+/) {|s| s.to_i * 2 }
そこは /Q=(\d+)/ に $1.to_i でしょ
subはブロック使う癖つけといた方が吉
無理に1行にしなくて変数に移してから数値に変換した方があとから分かりやすいと思う。
デバッグはどうしてる? 俺は主にprint文のデバッグなのだが
lexなりyaccなり好きにしろ
>>846 pryなんて初めて知った。
なんか良さげだね。ありがとう。
一ヶ月前にpryデバッグ環境作ろうとして、 pry-nav→pry-debugger→pry-byebugというdeprecated巡りを一通りしてしまった
ハッシュの配列を1つのハッシュに変換するメソッドを探してるのですが、ありますか? 今はこう書いています。キーが重複した時のことは考慮しなくてよいです。 array = [{id: 1, name: "hoge"}, {id: 2, name: "piyo"}] hash = Hash[array.map {|item| item[:id] }.zip(array)]
hash = array.inject({}) { |h, a| h[a[:id]] = a; h } とか hash = array.each_with_object({}) { |a, h| h[a[:id]] = a } とか? なんかあんまりスマートじゃないね ごめん
hash = array.inject({}) { |ran_hash, dom_hash| ran_hash.merge(dom_hash[:id] => dom_hash) }
Hash[array.map {|item| [item[:id], item]}]
分かりづらいデータ構造は使わない
array.map{|i|{i[:id]=>i}}.inject({},:merge)
ピンポイントなメソッドはないみたいですが、zipは使わなくてもよいですね。 ありがとうございます!
>>832 Lstrcpy = Win32API.new("kernel32", "lstrcpy", ["P", "P"], "P")
がまずい
Lstrcpy = Win32API.new("kernel32", "lstrcpy", ["I", "I"], "I")
じゃないのかな
アドレスは基本的にはIで数値として扱う
PはRubyのStringを渡すときだけ
でも、Fiddleだとメモリコピーは自前でできるので
Lstrcpy.call(Fiddle::Pointer[ptr], Fiddle::Pointer[t])
の代わりに
Fiddle::Pointer[ptr][0,t.bytesize] = t
でよかったりする
>>856 できました!
ありがとうございます!
リファレンスマニュアルをちゃんと読んだら
確かに書いてありました…
お手数かけて申し訳ありません。
質問失礼します。 ある変数名を文字列として返すメソッドはあるのでしょうか? イメージとしては以下の例で"hensuu_to_str"としたような使い方のできるメソッドです。 hensuu = "test" result = hensuu_to_str(hensuu) puts result # => "hensuu" 文字列を評価するevalがあるので、もしかしたらできるのかな?と思い質問させていただきました。 よろしくお願いいたします。
ローカル変数の一覧を得ることはできる。 def foo() a = "b" c = 3 p(local_variables()) end foo() これを実行すると、 [:a, :c] と出力される。
あるオブジェクトに「貼られている」変数名の一覧の取得方法というのは …、ないな
instance_variables じゃなくて?
863 :
858 :2013/10/23(水) 19:05:10.50
みなさんありがとうございます。
できそうだなと思ったんですが、無いんですね……
>>868 さんのアドバイスをもとにある変数名を文字列として返すような処理を書いてみました。
---
■コード
# coding: utf-8
hensuu0 = "スコープから外したい"
def hensuu_to_str_run
def hensuu_to_str(&block)
result = block.call
puts result
end
hensuu1 = "スコープに入れたい1"
hensuu2 = "スコープに入れたい2"
hensuu_to_str { local_variables }
end
hensuu_to_str_run
■実行結果
hensuu1
hensuu2
---
もうちょっとかっこ良くかけないものでしょうか……
お時間のある方がおられたらアドバイスなどいただけると助かりますm(_ _)m
864 :
uy :2013/10/23(水) 19:15:35.28
てst
865 :
uy :2013/10/23(水) 19:16:06.42
&nbsp; てst
866 :
uy :2013/10/23(水) 19:18:50.77
# coding: utf-8 ; 死ね puts a = "死ね" def f def func h puts h end puts b = "死ねゴミ" puts c = "しね" func local_variables end f
868 :
デフォルトの名無しさん :2013/10/23(水) 21:30:18.84
Bindingクラスになんかメソッドがあったような気がしたが錯覚だった。
869 :
デフォルトの名無しさん :2013/10/23(水) 21:36:15.21
local_variablesで得られるシンボルをto_sしてevalすれば値になるな。
870 :
デフォルトの名無しさん :2013/10/23(水) 22:32:09.92
ルビーの発音ってル(↑)ビー(↑)なの?ル(↑)ビー(↓)どちらですか? 標準語苦手でわからないので、教えてください
rúːbi
ルフィ
実行時に変数名知るってなんの役に立つん?
まあ要はなんでそれがやりたいのかだわな それによっちゃまったく別の解決方法とかあるかもしれんしな
877 :
デフォルトの名無しさん :2013/10/24(木) 07:52:28.86
>>868 Ruby(の作者たち)は、この手のイントロスペクションを
絶望的に軽視しているからなぁ…
どういうイントロスペクションが無いことを問題視してるのかわかんない。 コールスタックがオブジェクトじゃないこと?
>>878 そういうことやりたきゃRubinius使え
>>880 Rubiniusだって無理だろ
そもそもそんなことが出来る言語あるか?
883 :
870 :2013/10/24(木) 13:17:05.17
>>871-872 ありがとうございます。
勉強会の配信とかみてるとル(↑)ビー(↑)って言う人がちょくちょくいるんですけど
あれは違うんですか?
Rubyのリフレクション機能では
ソースをパースする前に加工したり、ASTを操作したりとか出来ない
PerlやPythonに比べてできる範囲が狭い
でも、そのかわりに使いやすくなっている
と思う
>>858 リテラルや式を渡してたらどうするんだよっ、と思うが
callerやcaller_locationでソースファイルを読み込んで解析とかすると
一行で複数回メソッドコールしてなければ引数のローカル変数名はわかると思う
def foo(f)
cl = caller_locations[0]
s = File.readlines(cl.path)[cl.lineno-1]
s.match(/\b#{__method__}\b.+?([\w][\d\w]*)/)
$1
end
bar = :hogehoge
p foo(bar)
ちゃんとするにはRipperでパースするとか
ソースファイルが無い場合やsendに対応したりしないと駄目だが
そもそも必要としている機能を間違ってると思うので
もし、変数名とその値が必要ならば binding_of_caller GEMを使って
引数には変数名のシンボルを渡すのがいいんじゃないのかな
>>882 Squeak Smalltalkさんならあっさりやってのける、気がする
>>884 >Squeak Smalltalkさんなら
たしかに。テンポラリ変数限定とかならさくっと書けるな。
MethodContext >> tempNameOf: val
| currentPc instr |
currentPc := self pc.
self pc: self pc - 2.
instr := self nextInstruction.
self pc: currentPc.
^self tempNames at: instr arguments first + 1
| a b |
a := 9. b := 10.
thisContext tempNameOf: a. "=> 'a' "
thisContext tempNameOf: b. "=> 'b' "
>>876 ありがとうインストールできた!
これでRuby入門できます。
知恵袋で回答がつかなかったので質問させてください。 apache形式のログから、コマンド実行時から直近24時間分だけを切り取りたいのですがどのような方法があるでしょうか。 具体的には、 192.168.1.1 - - [24/Oct/2013:20:10:10 +0900] xxxxxxxxxxxxxxxxxxxxxxx 192.168.1.1 - - [25/Oct/2013:12:02:25 +0900] xxxxxxxxxxxxxxxxxxxxxxx 192.168.1.1 - - [26/Oct/2013:01:03:51 +0900] xxxxxxxxxxxxxxxxxxxxxxx のようなlog.txtから、今であれば[25/Oct/2013:04:55:00 +0900]〜[26/Oct/2013:04:55:00 +0900]の行だけを取り出したいのです。 おねがいします。
>>887 require 'date'
format = "[%d/%b/%Y:%H:%M:%S %Z]"
ARGF.each do |line|
if line =~ /(\[.+?\])/
t = DateTime.strptime($1, format)
tend = DateTime.now
tbegin = tend - 1
print line if tbegin <= t and t <= tend
end
end
>>887 rotatelogsコマンドにログファイルを渡し「1日分切り出せ」と指示を出す
今回いちおう
>>891 は現行Rubyで動作はするな
895 :
891 :2013/10/26(土) 08:30:49.72
(でもバグ入りなんだぜ)
[[1], [2], [3]] を [1, 2, 3] にするイディオムありませんか
flatten! せめてググることくらいはしようぜ…
初心者スレに書き込むのはググると同じレベル 答えたくないなら答えなくていい
Array,Hash,Stringあたりのリファレンスは一度ぐらい通読しとけ 大した時間もかからん
Enumerableもね
Ruby はリファレンスが糞
902 :
887 :2013/10/26(土) 16:19:04.67
>>891 完璧に動きました。
本当にありがとうございます。
ファイルシステムエンコーディングを設定(例えばASCII-8BIT)するにはどうすれば良いでしょうか?
>>903 File.open('hoge', 'r:ASCII-8BIT')
>>904 すみませんが、質問をよく読んでから回答をお願いできますでしょうか。
>>906 そうですか。ありがとうございます。
すると、端末とファイル名とで文字コードが違う場合は、
任意のファイルシステムエンコーディングを設定するのは事実上不可能ですね。
Encoding.filesystem= とかがあっても良さそうなのに。残念です。
>>907 Unixの場合はバイト列をいじってるわけじゃない(エンコーディング情報を付けてるだけ)だから、force_encodingで
何とでもできそう
MacはMacの世界で閉じとけ
Windowsは窓から放り投げろ
わからないなら黙ってればいいのに
>>908 確かに、こまめに force_encoding すれば済む話かもしれませんね。
面倒なので String#b! が欲しいところですが。
文字列でeachとかが使えなくなった理由って何なんですか?(each_char等は除いて) ダックタイピングから遠ざかった気がするのですが
>>911 each が文字単位なのかバイト単位なのか行単位なのかは使うシーンによって変わるから
文字列、文字コードの取り扱いは、ほんと1.9は進歩だったのだろうか、と今だに思う。
今更これは失敗だったなんてもはや誰も言い出せない雰囲気。
もう utf-8 固定
アニーリングのように、一旦、混沌を経由すると早く収束する、みたいな
MSもさっさとCP932やめてUTF-8になればいいのに
普通にユニコード使ってるわボケ
UNICODEも最初のころはあらゆる文字に全部一意に割り当てるとか言ってた のに、サロゲートペアだのどんどん複雑怪奇になっていったよね。 韓国が使いもしない自国漢字ねじ込んだり。
こういう奴がすぐ湧くから文字絡みは嫌なんだよ
emacsのruby-modeでハッシュの新記法のキーに色が付きません。 :key => value としたときの :key のように色を付けたいのですが可能でしょうか?
特定のクラスでユーティリティとして使ってるメソッドに 1〜2行処理を追加したメソッドを使いたい場合どうしてる? 重複部分を記述しないで済む方法があれば教えて欲しい
つまり def aa にゃん にゃん にゃか にゃん end があって、これをちょっとだけ変えた def aa2 にゃん にゃん にゃら にゃん end を作りたいときどうしようという話でいっすか
>>921 おかしいね
手元では色つくよ
emacsのバージョンとruby-modeの入手元は?
>>923 そそ
そんな感じのを特定のクラスで使われる時のみ動的に適用させたい
分かり辛くてすいません
>>925 サンプルのユースケースを出してみてよ
いまいちピンとこない
ユースケースって RubyとかSmalltalkで書いてたらモンキーパッチ使いたくなることなんて山ほどあるだろ ただ1〜2行拡張する程度ならメソッド再定義した方がわかりやすいだろから止めたほうがいいと思う
self見て分岐だろうか キモいなあ、トリッキー過ぎて別の方法考えるかもしれない
デザインパターンって初めて知った なんでいままでこれをスルーしていたんだろう はぁ・・ _| ̄|○
デザイン(設計)しない人はけっこう知らないんじゃないかなぁ。 デザインパターン知らなくても、そのやり方自体は使ってたりもすることもあるし。 名前をつけることで認識を共有できるのがメリット。 もちろん人によっては知らないパターンもあるだろうけど、それはその人の分野では使うポイントが少なかったりすることも。無理に使うものではない。
知らなくてもやり方自体は使ってるって、いわゆる車輪の再発明なんじゃ…
>>930 >名前をつけることで認識を共有できるのがメリット。
そう、これがデザパタの存在意義だね
今まで夢中でOOP(プログラミング)を楽しんでいた段階から一歩成長して
OOD(設計)にも目を向けられるようになったからデザパタの存在を認識できた訳で、
落胆するよりも新たなステップアップの目標として、前向きに考えるのがいいと思う
>>929 >>931 デザパタは理論ではないし技術ですらない、単なる(
>>930 のいう)ネーミングとカタログ化だ
だから、デザパタにおける「車輪の再発明」とは、ある設計様式にオレ様流の命名をすること
>>929 を車輪の再発明と言うのは、デザパタの認識がズレていると思われ
可読性考えながらコード書くぞという気概のある奴なら StrategyとかSingleton辺りは知らずに使ってたってことはままある 最初は頭の隅に入れとく程度でいいんじゃない 必要性を感じた時に否が応でも勉強したくなるから
934 :
デフォルトの名無しさん :2013/10/29(火) 23:01:19.45
>>931 デザインパターンは「何らかのライブラリとして実装したもの」の名前ではない。
既にライブラリとして存在するものを自分で作る事だけを車輪の再発明って言うんじゃないぞ
その状況に陥る人の数が10人をこえた時 はじめて1人がアイディアを思いつく アイディアを思いついた人の数が10人を超えた時、 はじめて1人が実装に取り掛かる 実装する人の数が10人を超えた時、 はじめて1人が実装を公開する 公開できる実装を作った人が10人を超えた時、 はじめて1人が実用的なものを公開する 世の中そんな感じにできてるから、車輪の再発明も無駄じゃない 俺はまた一つ実用品までのカウンターを増やしたんだ (と思い込む)
ただのコピペ脳か
938 :
デフォルトの名無しさん :2013/10/29(火) 23:52:19.11
世界初と考えられている車輪(現存する最古の車輪)は、石でできてて 四角形に近い形なんだよね。 これが丸になるまで何万年かかったと思う? そしてそこから木になるまでは? そう考えると再発明は奨励されるべきだよね。
そういうのも再発名っていうのか? どっちかっていうと、再開発の方がしっくりくる
改良
デザインパターンは静的言語やらないとそれほど必要と思わないだろう 勉強してみて、rubyならもっといいやり方があるのにって思えればいいけど
?
デザパタをほとんど知らないと見える
そもそも動的言語では、典型的なデザインパターンの多くが、言語に溶け込んでいてまったく必要にならない 散々言われてることなのになあ
iteratorの言語または標準APIでのサポートは、かなりの数のバグをなくしてると思う。
静的言語のためにデザインされたパターンで学ぶと変な実装になりそうだけど、 rubyのために書かれた本で学ぶのは良いかもしれない そんな本があったような気がする
FacadeとかMediatorあたりが載ってなかったけど 結構良本だった気がする
ファサード? フェケイド? フェケテリゴ?
アルゴリズムとデザインパターンはどう違いますか
アルゴリズム:戦術 デザパタ:戦略
アルゴリズム:戦術 デザパタ:戦略
知ってるとすげぇと思われるのがアルゴリズム 知らないとすげぇと思われるのがデザパタ
>>952 それは言えるかもな
「デザパタ出来る前から使ってたよ」
とかサラっと言ってみたい台詞だな
>>953 > 「デザパタ出来る前から使ってたよ」
> とかサラっと言ってみたい台詞だな
GoFの凄いところは、暗黙知を形式知にしネーミングしたところ。
GoF以前からみんなやってたよ。
みんなじゃないわ。やってる人だけ。
クラスだってクラスパターンだからな本来 言語仕様として取り入れられることが多くなって、デザインパターンとして見えることがなくなった 他のデザインパターンの多くも、ゆくゆくは言語や付属ライブラリ等に吸収されていくことだろう
84 名前: 82 Mail: sage 投稿日: 2013/08/10(土) 23:08:55.85
>>80 では、具体的に「関数型プログラミングにおけるデザパタ」を考察してみよう
まず最も基本であるCompositeパターンについて、もしオブジェクトの属性が
集合論における直和であり、クラス継承が直和であるという認識を持てれば、
以下のようにコード化できる(これはGoF本からの引用になる)
[SML] datatype 'a Component = Leaf of 'a | Composite of 'a * 'a Component list
[Haskell] data Component a = Leaf a | Composite a [Component a]
これは再帰的な代数データ型の初歩的な定義例でしかない
そしてCompositeパターンと深い関連があるIteratorパターンやVistorパターンは、
上記のデータ型を再帰的に辿る探索問題でしかないと理解できるだろうし、
Commandパターンを含めるとコレクション(上記のデータ型)に対する高階関数の適用でしかない
またBuilderパターンやAbstract Factoryパターンは、関数を入力として関数を返す高階関数そのものであり、
Stateパターンは入力事象と遷移元状態の直積(組)から出力事象と遷移先状態の直積への写像(関数)になる
別の見方をすれば、OOPではデザパタとして神格化され高度な技法と見られていた概念が、
FP(関数型プログラミング)では基本とほんの少しの応用でしかない、と見なすことができる
この現実に対して拒絶反応を起こしてしまうかそれとも素直に受け入れられるかが、
OO脳から関数型脳へ脱却できるか否かを決める大きな壁になると考える
85 名前: 82 Mail: sage 投稿日: 2013/08/11(日) 06:30:46.63
>>84 を訂正
X: .... もしオブジェクトの属性が集合論における直和であり、
O: .... もしオブジェクトの属性が集合論における直積であり、
ついでに参考として、直積 A×B と直和 A+B の定義を書いておく(特に難解な定義ではないと思う....)
A×B = { (x, y) | x ∈ A, y ∈ B }
A+B = { (0, x) | x ∈ A } ∪ { (1, y) | y ∈ B }
なお、直積は「集合の直積集合」、直和は「集合の直和分割」とも呼ばれている
そして、言語上では直積はタプル型やレコード型として、直和は代数型として表現される
> OOPではデザパタとして神格化され高度な技法と見られていた概念 ん?
関数型にあらぬ幻想を抱いているようだけど
関数型、関数型って騒ぐやつらはなんでこうも、本来の関数型の話と、たんなる (しかし クラスを抽象データ型に使うアイデア=静的型OOP よりはよく出来た) 型システムの話の区別がつかないのだろうか。不思議だ。
なんで不思議なのかが不思議だわ
>>959 >> OOPではデザパタとして神格化され高度な技法と見られていた概念
これは、静的型付けOOPL、特にJava使いの間でデザパタが
神格化され絶対視されている傾向を指している
ただし、Rubyだと(
>>941 ,944が指摘しているように)デザパタを強く意識するケースは
ほとんど無いから、ここのスレだとピントが外れた記述になるね
>>961 自己紹介乙w
関数型、関数型って騒ぐやつらはなんでこうも、
「(関数型プログラミング向け)データ構造」の話と
「型システム」の話の区別がつかないのだろうか?
>>957 ,958は型システムとは直接的には関係しないし、
まったく触れてもいないのに。不思議だ。
965 :
デフォルトの名無しさん :2013/11/01(金) 07:09:43.44
漏れもそう思う
957で取り上げられているデータ構造の具体的にはどこが「関数型プログラミング向け」なのか 教えてエロい人!それは関数型言語ならどんな型システムを持つ言語でも活用できる パターンなの?
>>966 2つの質問が含まれているね
最初は1つ目の「どこが関数型プログラミング(FP)向けなのか?」について
まず、おさらいとして慣れ親しんだ手続き型プログラミング向けデータ構造を考えてみよう
手続き型プログラミングによる(要素の追加/削除といった)ツリーへの操作では、
操作によってツリー(=操作対象)そのものが変化する
それに対して、関数型プログラミング向けデータ構造である
>>957 のツリーへの操作では、
操作のたびにツリーが新たに生成され、操作対象である元のツリー(の値)は変化しない
具体的な設計や実装の例については、スレ「LLにおける関数型プログラミング」の#101を参照
次に「どの言語でも活用できるパターンなのか?」について
動的/静的や型システムに関係なく、ほぼすべての関数型言語であれば活用できるのはもちろんのこと、
(直積としての)属性と(直和としての)継承を持ち、動的メモリ管理機構(いわゆるガーベジコレクション)を持つ
多くのオブジェクト指向言語で活用できる
特にRubyは、動的型付けな関数型言語として、このパターンの活用に最適
こいつ調子づかせるとめんどくさいことこの上ないことで有名な 関数型ワナビーのru厨だから放置した方がいいぞ
神格化とはゴールデンハンマーアンチパターンのことじゃないかな。
有名人が提案するRubyの標準コーディング規約ってありませんか?
971 :
デフォルトの名無しさん :2013/11/03(日) 12:40:21.28
Rubyの有名人の、という縛りだと前田修吾氏のくらいしか知らん。
日本のコーディング規約挙げてるところは皆インデント2ばっかりで困ります インデント2だとみずらい
>>973 自分一人でコーディングするなら好きなインデント使えばいい
チームで開発するとかオープンソースで公開するとかなら合わせた方が吉
ということはRuby業界ではやっぱりインデント2が標準みたいな感じですか?
Rubyはどこでも2タブ(3タブを使う人もいるとかいないとか)
>>975 そうね
2以外はほとんど見かけたことがない
まつもと先生はどういう風にコード書いてるのか知りたくてgithub見に行ったらmruby(C言語)しかリポジトリがなかった
テストコードみたいな短いのしか書いたことなかったりして
MRIソースのlib配下には彼の書いたコードも残ってるよ、断片的ながら git-blame で探してみると面白いかも
>>975 行の先頭、いわゆるインデント(字下げ)のところにタブ文字を使い、
それ以外の行揃えは(タブ文字ではなく)空白文字を使う規約がお薦め
この規約に従ってコーディングしておけば、
後からエディタ等でタブ幅を2, 3, 4, 8等へ切り替えても整形が乱れない
982 :
デフォルトの名無しさん :2013/11/03(日) 14:55:40.74
fullpath = "/var/test" Dir::entries(fullpath) パスがルートではない場合. と .. も含まれ、 ルートであれば含まれないのですが このピリオドを除外してディレクトリ一覧のみほしいんですがどう書くのでしょうか?
さあ君もDir.glob('*')の泥沼に嵌るんだ
便利なものがあるんですね ありがとうございます
rm -rf .*
RubyってJavascriptやLuaと違って強い型付け言われてるけど ってことは理論上はそれらより実行速度上る可能性も0じゃないわけですか? それとも型付けの強弱と実効速度は無関係?
>>987 いや、言語としてのRubyの型付けは弱いというか、
他と比較して決して強いわけじゃない
言語ユーザ(=プログラマ)から強いように見えるのは、
ライブラリで実行時に(=動的に)型検査しているから
たとえば 1 + "a" という式は、JavaScriptだと "1a" という文字列に、
Rubyでは TypeError となるから、JSよりRubyのほうが強く見える
でも、これはRuby処理系(インタプリタ)が(静的に)型検査しているわけではなく、
1 の数値クラスのメソッド +(x) の内部で x が数値であるかを(動的に)型検査する
だからたとえRubyの型付けが強く見えても、(現状の)実行効率は悪い(=遅い)
ただし、将来的にRubyにも(JavaScriptエンジンのような)最適化を目的とした
型推論メカニズムが導入され、飛躍的に性能が改善する可能性は否定しない
なるほど 解釈時でなく実行時に型検査するから むしろ実行速度は遅くなる方向に働くということですね
990 :
デフォルトの名無しさん :2013/11/05(火) 01:55:31.32
[ "2013-08-30" => 100, "2013-09-11" => 101, "2013-09-30" => 102, "2013-10-10" => 103, "2013-10-23" => 104, "2013-11-05" => 105 ] という配列があるとして、この配列から最も10-20に近い日をキーに持つハッシュを探すにはどうすればいいのでしょうか?
991 :
デフォルトの名無しさん :2013/11/05(火) 02:06:14.57
10-20って2013-10-20のことか。 仮に 10月19日と10月21日のデータがあったらどっちを返すんだろう。
{ "2013-08-30" => 100, "2013-09-11" => 101, "2013-09-30" => 102, "2013-10-10" => 103, "2013-10-23" => 104, "2013-11-05" => 105 }.min_by { |key, val| /^(¥d+)-(¥d+)-(¥d+)/ =~ key (($1 + $2 + $3).to_i - 20131020).abs } => ["2013-10-23", 104]
効率とかのことを考えると、葉にリンクの付いた平衡木が使えるといいんだけど Rubyには標準では無いから悩ましい
>>992 は月をまたぐ場合に問題がありそう
min_by のブロックの中は
(Date.parse(key) - Date.parse("2013-10-20")).to_i.abs
などとする必要がある
997 :
デフォルトの名無しさん :2013/11/05(火) 20:41:05.48
>>991-994 ありがとうございます。
確かに同じだけ近い日の扱いが指摘されてないなど質問が不十分でした
min_by なんてあるんですね
999 :
デフォルトの名無しさん :2013/11/06(水) 00:56:33.60
死体を埋めます
1000 :
デフォルトの名無しさん :2013/11/06(水) 00:59:24.82
タイムカプセルを埋めます
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。