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

Ruby 初心者スレッド Part 52

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/06/06(木) 23:50:09.17
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ

前スレ
Ruby 初心者スレッド Part 51
http://toro.2ch.net/test/read.cgi/tech/1358636526/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0002デフォルトの名無しさん2013/06/06(木) 23:50:41.42
【RoR】Ruby on Rails Part15
http://kohada.2ch.net/test/read.cgi/php/1341589839/
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://toro.2ch.net/test/read.cgi/tech/1155031689/

書籍:ほぼ公式
「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」 (プログラミング自体が初めてでない人向け)
http://www.amazon.co.jp/dp/4797357401/
「初めてのRuby」 (同上)
http://www.amazon.co.jp/dp/4873113679/
書籍:紙のマニュアルに相当
「Rubyレシピブック 第3版 303の技」(脱初心者向け基礎テクニック集、1.9対応)
http://www.amazon.co.jp/dp/4797359986/
「プログラミングRuby 第2版 言語編」(初心者向け参考書)
http://www.amazon.co.jp/dp/4274066428/

現在、1.8 系列の最新である Ruby 1.8.7 と 1.9 系列の最新である Ruby 1.9.3 の2系統が存在。
肝心な部分がわりと違い、プログラムはそのままでは動作せず、予備知識も別個。
1.8 用のスクリプトやライブラリは 1.9.3 では動作しないので注意。
1.9.3 用の教科書があるなら 1.9.3 から始めても構わない。

Windows用Rubyは、Ruby以外のものもあらかた入っているActiveScriptRubyと
http://www.artonx.org/data/asr/
RubyだけインストールされるRubyInstallerの2種類存在。
http://rubyinstaller.org/downloads/
chm(HTMLヘルプ)式のダウンロードできるマニュアルが便利
http://www.ruby-lang.org/ja/documentation/
Rubyリファレンスマニュアル chm版リミックス
http://ruby.morphball.net/refm-remix.html
0003デフォルトの名無しさん2013/06/06(木) 23:51:19.49
・いつものエディタとターミナルという普段着でお越し下さい
・エディタ初めてならRubyスクリプトをを着色してくれる(できればオートインデントの)エディタ好きなの選べ
・いわゆるIDEはRubyの学習に際しては恐ろしくコスパが悪いのでRubyのためだけに新規導入するのはお勧めしない

Q.XXX を使ってるんですが Ruby も覚えたほうがいいんでしょうか?
A.好きにしろ

※RubyやRuby使いに対する不満や愚痴などは「Rubyについて」スレや「バトルロワイヤル」スレなどをご利用下さい
0004前スレ9432013/06/07(金) 00:48:53.67
>>1乙
アリガトン

>>前スレ995
ハッシュからクラスへの移行には、手続き型脳からオブジェクト思考脳へという発想の転換が必要です。
大変だとは思いますが、自分に合ったペースで付いてきて下さい。なにか疑問があれば質問を。
なお、更新はまだまだ続く予定です....。
0005デフォルトの名無しさん2013/06/07(金) 01:12:16.94
乙
0006デフォルトの名無しさん2013/06/07(金) 04:21:07.21
前スレのこれね
「具体的には、芸能人ブログの画像を羅列するといったものなのですが、画像と記事URLを結び付けたいのですがむずかしいです。
ハッシュを使うにもキーを記事URLとすると同じキーがいくつも出来てしまいますし、二次配列もいまいちわかりません。」

983書いた者なんだけどそれに対してレスしそこねてスレ変わったのでここに書いておくよ
ハッシュというのは要するにハッシュ配列のことだったのね
こっちはハッシュ関数のことだと読んだので、一意の画像はないものと仮定(あったらそれを使い回し)して
ハッシュ値とURLとを逆にすればいいだけじゃんと書いた
まぁ全く同一の画像を複数の記事に使い回すケースもあるかもしれないけどさ
0007デフォルトの名無しさん2013/06/07(金) 08:02:12.94
>>2
本屋行ったらたのしい Ruby の 4 版が出てた
それよりレシピブックの新版まだー
0008デフォルトの名無しさん2013/06/07(金) 18:23:40.89
>>4
非常にありがたいです
オブジェクト思考は人間にわかりやすいと書いてありましたがぜんぜんそんなことないです(笑)
ついていかせていただきます

>>6
ハッシュ関数なるものがあるんですか 調べてみます
0009デフォルトの名無しさん2013/06/07(金) 23:09:11.55
>>8
触らないほうがいいよ
0010前スレ9432013/06/08(土) 00:05:18.83
前スレ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(コントローラ?)も面白そうです。

次回は、写真の重複問題について検討する予定です。(正直に告白すればバグ対策です....)
0011デフォルトの名無しさん2013/06/08(土) 00:17:10.21
>>10
ありがとうございます
MVCってやつですね RSS取得は既存のrssライブラリで簡単でした
仕様上重複はないのですがありがたいです よろしくおねがいします
0012前スレ9432013/06/08(土) 00:17:36.03
(>>10 への追記)

クラス PStore には(ハッシュと同様に)キーで複数のオブジェクト(=値)を管理できるので、
今回の変更では、ついでに複数blogサイトにも対応させています。

また、コードの先頭にあるコメントについて、以下の行を書き漏らしていました。

 <Store> = { <Blog> }.

5行目の後に挿入されているものとして見てください。
0013前スレ9432013/06/08(土) 22:48:21.10
>>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)という手順が必要となるのですから、
オブジェクト思考が難しいのはごく当たり前の話だと思います。

「手続き型脳」では、課題を与えられるといきなりコンピュータに向かい、ゴリゴリとコードを書いていきます。
その姿はきっとカッコいいプログラマに見えるでしょうし、自身も言語を自在に操っている満足感が得られます。
これはワンライナーやせいぜい数百ステップ程度の使い捨てプログラム、あるいはアルゴリズムの勉強等といった
多くの局面では(特に初心者では)、決して間違いであるとは言えません。
でも今回のアンテナサイトのような(ある程度)実用性のあるソフトウェアを開発しようとするのであれば、
いきなりコードを書き始めるのではなく、じっくりと思索にふけることが必要になるでしょうし、
その時に(上で述べた)「オブジェクト思考脳」を育てるトレーニングを心がけ、初心者の壁を乗り越えませう。
0014前スレ9432013/06/08(土) 23:14:27.84
>>13を一部訂正

X: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト思考分析/設計)です。
O: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト志向分析/設計)です。
0015デフォルトの名無しさん2013/06/08(土) 23:25:04.21
>>13
ブログでやって
0016デフォルトの名無しさん2013/06/08(土) 23:43:11.28
>>13
なるほど すげーわかりやすいです
まずは作りたいものの設計をつかむ。大事なことですね
がんばります
0017前スレ9432013/06/09(日) 00:31:18.81
>>14を再訂正 .... orz
X: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト思考分析/設計)です。
X: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト志向分析/設計)です。
O: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト指向分析/設計)です。

>>16
この「オブジェクト思考脳」という発想の出発点になったのが、書籍「オブジェクト指向システム分析設計入門」です。
この書籍は著者である青木淳氏のホームページ上で全文(!)が無償公開されています。

  http://aokilab.kyoto-su.ac.jp/documents/IntroductionToOOAOOD/index-j.html

この本、口調はやさしいのですが、中身はすごく抽象的で哲学的です。難解ですがなにせタダですので、一読を薦めます。
特に「第2章 広義のオブジェクト指向」内にある節「2.1.1 理解の三つの秘訣」が、>>13 と直接的に関連します。

  http://aokilab.kyoto-su.ac.jp/documents/IntroductionToOOAOOD/chapter2/index-j.html#2-1-1

例題「人間とは?」を参考に、「アンテナサイトとは?」を思考してみてください。

なお、>>13で述べたのは、上記節における「データ中心設計(属性による定義)」と「機能中心設計(内包で定義)」です。
残る「分類中心設計(外延で定義)」、いわゆる継承(インヘリタンス)はこれから検討結果を反映させていく予定です。
0018デフォルトの名無しさん2013/06/09(日) 00:37:50.63
>>17
かなりの分量がありますね。落ち着いたら全部読みたいです。
わかりました。部分的に読んでみて設計を考えます。
0019デフォルトの名無しさん2013/06/09(日) 01:34:02.96
>>9
0020デフォルトの名無しさん2013/06/09(日) 02:30:24.44
よそでやれ
0021デフォルトの名無しさん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で参照できるようです。

宜しくお願い致します。
0022212013/06/11(火) 07:32:02.31
(追記)
中途半端な書き込みになりゴメンなさい。

質問は、>>21を実現するためのヒントとなるようなサンプルまたは
サイトをご存知ないですか? ということです。

PPTの各図柄(オブジェクト)には名前を付けられないので、代わりに
それらが持つリンクURLを参照したく思います。
0023前スレ9432013/06/12(水) 23:03:18.05
>>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の分析で残った「分類中心設計(外延で定義)」の部分です。
なお、更新は次回で終了する予定です。
0024デフォルトの名無しさん2013/06/13(木) 06:35:37.19
よそでやって
0025デフォルトの名無しさん2013/06/13(木) 07:48:12.90
>>24
>>9
0026デフォルトの名無しさん2013/06/13(木) 19:20:50.61
>>21
やろうと思えばできなくも無いかも知れんがどうしてrubyで?
0027212013/06/13(木) 20:34:02.46
>>26
Win32OLEの実施体験がRubyでしか今のところないから
0028デフォルトの名無しさん2013/06/14(金) 00:05:13.74
VBAで作ってみて動いたらRubyに変換すればよい
0029前スレ9432013/06/14(金) 21:12:55.88
>>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)時にブログの順序性は保証されません。
0030デフォルトの名無しさん2013/06/14(金) 23:09:32.57
Windowsのを操作したかったらVBAなりC#なり使えばいいよね
Rubyでやる理由なんてないわ
0031デフォルトの名無しさん2013/06/15(土) 00:04:06.57
すみません、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
0032デフォルトの名無しさん2013/06/15(土) 00:37:22.18
こんな書き方でも試しているんですが、入ってる結果は2レコードで
確かにDBへ保存されています、ですがarr_descがこれだと入れられず…

for t in arr_title
T_result.create:product_flag => 0,:product_name => t
end

多分やり方としてtitleレコードを一度参照させて該当すればフィールドに値を追加する
と言う様な処理を書けばやろうとしている事は実現出来るのかなと考えているのですが、
多分凄い初歩的な何かが分かっておらず普通は1レコードに一回で突っ込めるはずだと…
0033デフォルトの名無しさん2013/06/15(土) 00:43:13.99
T_result が何かわからないとなんとも言えない
0034デフォルトの名無しさん2013/06/15(土) 00:51:39.34
>>33さん

すいません、DBへの接続はActiveRecordをrequireしています。
Rails本体は使ってません。
0035デフォルトの名無しさん2013/06/15(土) 01:57:16.84
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
0036デフォルトの名無しさん2013/06/15(土) 02:21:58.65
>>35さん

ありがとうございます。早速試してみましたがやはりproduct_descフィールドは
空っぽでした。。。またなぜか.textの箇所がundefined methodと呼ばれました。。。

putsでは値は取れてたので大丈夫だったのですが、う〜ん、、、もはや素人過ぎて
次何を試せばいいのかも八方塞がりです…

ただ配列の中に処理を書いて更にそれをカンマで連結可と言うのは初めて知りました。
何かここにも大きくヒントがあると思いますので理解出来る様勉強したいと思います。
0037デフォルトの名無しさん2013/06/15(土) 02:39:35.17
>>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 に
しない限り解消出来ない気がしており配列の中身に更に手を加える方法と言うのがあるのでしょうか。
0038デフォルトの名無しさん2013/06/15(土) 09:23:50.62
.text がエラーになるってことは nil に text でも呼んでるんじゃないの?
とりあえずこちらで再現するために環境と検索に使った URL を示してくれないか
0039デフォルトの名無しさん2013/06/15(土) 09:33:59.66
putsは文字列を表示するメソッドであって、デバッグ用途でオブジェクトの中身を確かめるメソッドじゃない
文字列(String)であるということが確実にわかっているのではない限り(あるいはわかっていても)通常はpを使う
irb> obj = [1]
irb> puts obj
1
irb> p obj
[1]
objは文字列ではなく整数の配列(と考えていいと作者に言われているオブジェクト)だということがわかる

putsではなくpを使うようになると対象オブジェクトが(たいていの場合)はっきりするので「なぜか」じゃなくなる
nil、空文字列、空の配列、空の文字列が入っている配列、nilが入っている配列、そういったものが区別できる

とりあえずデータベースに入れて確かめるのはやめとけ
絶対完全に間違いのないオブジェクトが得られる確証ができてからおもむろにデータベース部分のスクリプトを書き始めろ
0040デフォルトの名無しさん2013/06/15(土) 11:24:19.53
みなさん勉強になります。ありがとうございます。

>>38さん
以下のURLで試しています。
https://www.google.co.jp/search?ie=UTF-8&;oe=UTF-8&q=ruby

>>39さん
何気なくpにしたりputsにしたりprintとしてみたり取り敢えず値がどれかに
まず入ってるのか程度でしか使ってなかったのでそれぞれの違いを理解する
様にがんばります。
■ このスレッドは過去ログ倉庫に格納されています