13/06/06 23:50:09.17
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ
前スレ
Ruby 初心者スレッド Part 51
スレリンク(tech板)
るりまサーチ (リファレンス検索)
URLリンク(rurema.clear-code.com)
Rubyist Magazine - るびま
URLリンク(jp.rubyist.net)
逆引きRuby
URLリンク(www.namaraii.com)
2:デフォルトの名無しさん
13/06/06 23:50:41.42
【RoR】Ruby on Rails Part15
スレリンク(php板)
【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)
書籍:ほぼ公式
「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」 (プログラミング自体が初めてでない人向け)
URLリンク(www.amazon.co.jp)
「初めてのRuby」 (同上)
URLリンク(www.amazon.co.jp)
書籍:紙のマニュアルに相当
「Rubyレシピブック 第3版 303の技」(脱初心者向け基礎テクニック集、1.9対応)
URLリンク(www.amazon.co.jp)
「プログラミングRuby 第2版 言語編」(初心者向け参考書)
URLリンク(www.amazon.co.jp)
現在、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と
URLリンク(www.artonx.org)
RubyだけインストールされるRubyInstallerの2種類存在。
URLリンク(rubyinstaller.org)
chm(HTMLヘルプ)式のダウンロードできるマニュアルが便利
URLリンク(www.ruby-lang.org)
Rubyリファレンスマニュアル chm版リミックス
URLリンク(ruby.morphball.net)
3:デフォルトの名無しさん
13/06/06 23:51:19.49
・いつものエディタとターミナルという普段着でお越し下さい
・エディタ初めてならRubyスクリプトをを着色してくれる(できればオートインデントの)エディタ好きなの選べ
・いわゆるIDEはRubyの学習に際しては恐ろしくコスパが悪いのでRubyのためだけに新規導入するのはお勧めしない
Q.XXX を使ってるんですが Ruby も覚えたほうがいいんでしょうか?
A.好きにしろ
※RubyやRuby使いに対する不満や愚痴などは「Rubyについて」スレや「バトルロワイヤル」スレなどをご利用下さい
4:前スレ943
13/06/07 00:48:53.67
>>1乙
アリガトン
>>前スレ995
ハッシュからクラスへの移行には、手続き型脳からオブジェクト思考脳へという発想の転換が必要です。
大変だとは思いますが、自分に合ったペースで付いてきて下さい。なにか疑問があれば質問を。
なお、更新はまだまだ続く予定です....。
5:デフォルトの名無しさん
13/06/07 01:12:16.94
乙
6:デフォルトの名無しさん
13/06/07 04:21:07.21
前スレのこれね
「具体的には、芸能人ブログの画像を羅列するといったものなのですが、画像と記事URLを結び付けたいのですがむずかしいです。
ハッシュを使うにもキーを記事URLとすると同じキーがいくつも出来てしまいますし、二次配列もいまいちわかりません。」
983書いた者なんだけどそれに対してレスしそこねてスレ変わったのでここに書いておくよ
ハッシュというのは要するにハッシュ配列のことだったのね
こっちはハッシュ関数のことだと読んだので、一意の画像はないものと仮定(あったらそれを使い回し)して
ハッシュ値とURLとを逆にすればいいだけじゃんと書いた
まぁ全く同一の画像を複数の記事に使い回すケースもあるかもしれないけどさ
7:デフォルトの名無しさん
13/06/07 08:02:12.94
>>2
本屋行ったらたのしい Ruby の 4 版が出てた
それよりレシピブックの新版まだー
8:デフォルトの名無しさん
13/06/07 18:23:40.89
>>4
非常にありがたいです
オブジェクト思考は人間にわかりやすいと書いてありましたがぜんぜんそんなことないです(笑)
ついていかせていただきます
>>6
ハッシュ関数なるものがあるんですか 調べてみます
9:デフォルトの名無しさん
13/06/07 23:09:11.55
>>8
触らないほうがいいよ
10:前スレ943
13/06/08 00:05:18.83
前スレ996のコードを更新しました。
URLリンク(play.island.ac)
これまでのコードはどれも計算結果をメモリ上に保持していたので、
プログラムが終了するたびにその計算結果は消失していました。
今回の変更では、blogオブジェクトをディスクへ保存/読み込みできるようにします。
実装方法としては、前スレ982で紹介されていた標準ライブラリ pstore を利用します。
== 主な変更点
* クラス Model::Store を追加(これは PStore のサブクラスです)
この変更により、Webアプリケーションとして「とりあえず動く」という
試作品(プロトタイプ)のレベルに到達できたのではないかと思います。
モデル(Model)はできたので、あとはビュー(View)とコントローラ(Controller)、
そしてRSS取得処理が用意できれば、アンテナサイト開発にとって最初の一歩になるでしょう。
Rails使いなら ActiveModel を使うのが簡単かもしれないし、
あるいは前スレ#973で紹介があったHaml(ビュー?)とSinatra(コントローラ?)も面白そうです。
次回は、写真の重複問題について検討する予定です。(正直に告白すればバグ対策です....)
11:デフォルトの名無しさん
13/06/08 00:17:10.21
>>10
ありがとうございます
MVCってやつですね RSS取得は既存のrssライブラリで簡単でした
仕様上重複はないのですがありがたいです よろしくおねがいします
12:前スレ943
13/06/08 00:17:36.03
(>>10 への追記)
クラス PStore には(ハッシュと同様に)キーで複数のオブジェクト(=値)を管理できるので、
今回の変更では、ついでに複数blogサイトにも対応させています。
また、コードの先頭にあるコメントについて、以下の行を書き漏らしていました。
<Store> = { <Blog> }.
5行目の後に挿入されているものとして見てください。
13:前スレ943
13/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)という手順が必要となるのですから、
オブジェクト思考が難しいのはごく当たり前の話だと思います。
「手続き型脳」では、課題を与えられるといきなりコンピュータに向かい、ゴリゴリとコードを書いていきます。
その姿はきっとカッコいいプログラマに見えるでしょうし、自身も言語を自在に操っている満足感が得られます。
これはワンライナーやせいぜい数百ステップ程度の使い捨てプログラム、あるいはアルゴリズムの勉強等といった
多くの局面では(特に初心者では)、決して間違いであるとは言えません。
でも今回のアンテナサイトのような(ある程度)実用性のあるソフトウェアを開発しようとするのであれば、
いきなりコードを書き始めるのではなく、じっくりと思索にふけることが必要になるでしょうし、
その時に(上で述べた)「オブジェクト思考脳」を育てるトレーニングを心がけ、初心者の壁を乗り越えませう。
14:前スレ943
13/06/08 23:14:27.84
>>13を一部訂正
X: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト思考分析/設計)です。
O: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト志向分析/設計)です。
15:デフォルトの名無しさん
13/06/08 23:25:04.21
>>13
ブログでやって
16:デフォルトの名無しさん
13/06/08 23:43:11.28
>>13
なるほど すげーわかりやすいです
まずは作りたいものの設計をつかむ。大事なことですね
がんばります
17:前スレ943
13/06/09 00:31:18.81
>>14を再訂正 .... orz
X: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト思考分析/設計)です。
X: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト志向分析/設計)です。
O: こうした主題/概念の分析を体系化したものが、いわゆるOOA/OOD(オブジェクト指向分析/設計)です。
>>16
この「オブジェクト思考脳」という発想の出発点になったのが、書籍「オブジェクト指向システム分析設計入門」です。
この書籍は著者である青木淳氏のホームページ上で全文(!)が無償公開されています。
URLリンク(aokilab.kyoto-su.ac.jp)
この本、口調はやさしいのですが、中身はすごく抽象的で哲学的です。難解ですがなにせタダですので、一読を薦めます。
特に「第2章 広義のオブジェクト指向」内にある節「2.1.1 理解の三つの秘訣」が、>>13 と直接的に関連します。
URLリンク(aokilab.kyoto-su.ac.jp)
例題「人間とは?」を参考に、「アンテナサイトとは?」を思考してみてください。
なお、>>13で述べたのは、上記節における「データ中心設計(属性による定義)」と「機能中心設計(内包で定義)」です。
残る「分類中心設計(外延で定義)」、いわゆる継承(インヘリタンス)はこれから検討結果を反映させていく予定です。
18:デフォルトの名無しさん
13/06/09 00:37:50.63
>>17
かなりの分量がありますね。落ち着いたら全部読みたいです。
わかりました。部分的に読んでみて設計を考えます。
19:デフォルトの名無しさん
13/06/09 01:34:02.96
>>9
20:デフォルトの名無しさん
13/06/09 02:30:24.44
よそでやれ
21:デフォルトの名無しさん
13/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
13/06/11 07:32:02.31
(追記)
中途半端な書き込みになりゴメンなさい。
質問は、>>21を実現するためのヒントとなるようなサンプルまたは
サイトをご存知ないですか? ということです。
PPTの各図柄(オブジェクト)には名前を付けられないので、代わりに
それらが持つリンクURLを参照したく思います。
23:前スレ943
13/06/12 23:03:18.05
>>10のコードを再更新しました。
また、約600ステップと全体像の把握が難しい規模になってきたので、自動生成した文書も公開します。
URLリンク(play.island.ac)
URLリンク(www.h6.dion.ne.jp)
今回の変更の目的は>>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の分析で残った「分類中心設計(外延で定義)」の部分です。
なお、更新は次回で終了する予定です。
24:デフォルトの名無しさん
13/06/13 06:35:37.19
よそでやって
25:デフォルトの名無しさん
13/06/13 07:48:12.90
>>24
>>9
26:デフォルトの名無しさん
13/06/13 19:20:50.61
>>21
やろうと思えばできなくも無いかも知れんがどうしてrubyで?
27:21
13/06/13 20:34:02.46
>>26
Win32OLEの実施体験がRubyでしか今のところないから
28:デフォルトの名無しさん
13/06/14 00:05:13.74
VBAで作ってみて動いたらRubyに変換すればよい
29:前スレ943
13/06/14 21:12:55.88
>>23のコードにバグが見つかったので、再々更新しました。(修正量は、ほんの少しだけ)
URLリンク(play.island.ac)
URLリンク(www.h6.dion.ne.jp)
現象: ブログと記事の間で写真が重複したブログを列挙した時、順序番号が不連続になる(#1397-1401 を参照)
対策箇所: Blog#each -- #264
最後に>>23について、訂正と追加補足(2点)があります。
X: * #272: Blog#each -- 写真オブジェクトの生成
O: * #272: Blog#each -- 写真コレクションの生成
* ブログ間の写真重複、つまりあるブログと別のブログとの間で発生した写真の重複は解消されません。
* 概念上だとストア(store)はブログのコレクションですが、実装上は PStoreのサブクラスです。
つまりクラス Store は抽象クラス Collection の具象クラス(=サブクラス)ではありません。
このためストア内でのブログ重複に対して、更新(Store#update_blog!)時に固有の解消処理を実装しています。
またソートされた集合ではないため、列挙(Store#each)時にブログの順序性は保証されません。
30:デフォルトの名無しさん
13/06/14 23:09:32.57
Windowsのを操作したかったらVBAなりC#なり使えばいいよね
Rubyでやる理由なんてないわ
31:デフォルトの名無しさん
13/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
32:デフォルトの名無しさん
13/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レコードに一回で突っ込めるはずだと…
33:デフォルトの名無しさん
13/06/15 00:43:13.99
T_result が何かわからないとなんとも言えない
34:デフォルトの名無しさん
13/06/15 00:51:39.34
>>33さん
すいません、DBへの接続はActiveRecordをrequireしています。
Rails本体は使ってません。
35:デフォルトの名無しさん
13/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
36:デフォルトの名無しさん
13/06/15 02:21:58.65
>>35さん
ありがとうございます。早速試してみましたがやはりproduct_descフィールドは
空っぽでした。。。またなぜか.textの箇所がundefined methodと呼ばれました。。。
putsでは値は取れてたので大丈夫だったのですが、う~ん、、、もはや素人過ぎて
次何を試せばいいのかも八方塞がりです…
ただ配列の中に処理を書いて更にそれをカンマで連結可と言うのは初めて知りました。
何かここにも大きくヒントがあると思いますので理解出来る様勉強したいと思います。
37:デフォルトの名無しさん
13/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 に
しない限り解消出来ない気がしており配列の中身に更に手を加える方法と言うのがあるのでしょうか。
38:デフォルトの名無しさん
13/06/15 09:23:50.62
.text がエラーになるってことは nil に text でも呼んでるんじゃないの?
とりあえずこちらで再現するために環境と検索に使った URL を示してくれないか
39:デフォルトの名無しさん
13/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が入っている配列、そういったものが区別できる
とりあえずデータベースに入れて確かめるのはやめとけ
絶対完全に間違いのないオブジェクトが得られる確証ができてからおもむろにデータベース部分のスクリプトを書き始めろ
40:デフォルトの名無しさん
13/06/15 11:24:19.53
みなさん勉強になります。ありがとうございます。
>>38さん
以下のURLで試しています。
URLリンク(www.google.co.jp)
>>39さん
何気なくpにしたりputsにしたりprintとしてみたり取り敢えず値がどれかに
まず入ってるのか程度でしか使ってなかったのでそれぞれの違いを理解する
様にがんばります。
41:デフォルトの名無しさん
13/06/15 16:31:46.11
>>40
その URL で試したけど div[class=st] では拾えない。空の NodeSet が返ってくる
div[class=st] で拾えることを確認したコードを貼ってくれないか
require 'nokogiri'
require 'open-uri'
url = "URLリンク(www.google.co.jp)
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
42:デフォルトの名無しさん
13/06/15 21:50:44.74
>>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:前スレ943
13/06/15 21:54:21.10
>>29のコードを更新しました。
URLリンク(play.island.ac)
URLリンク(www.h6.dion.ne.jp) -- 自動生成ドキュメント
URLリンク(www.h6.dion.ne.jp) -- UMLクラス図
今回の変更の目的は>>23の最後で書いた「クラスの継承」ですが、実際には前回の>>23ではコレクションを
実装するために継承を用いていました。ただし、これはありふれた継承パターンであり、しかもそれらのクラスは
属性を持たない単純な継承であったので、特に解説しません。今回は、残りのクラス群について検討します。
まず「継承(inheritance)」とは何か?にはいくつかの定義があり、その一つは「言語(Ruby)が提供する便利な仕掛けである」
という実践的な立場であり、もう一つは「クラスとは集合であり、継承とはクラス間の部分集合関係である」という
形式的な立場です。一般には前者で考える人が多いのですが、ここでは後者の定義を採用し、これに沿って検討を進めます。
クラスが集合であるとすれば、その集合の要素とは各クラスが持つ「属性(attribuute)」です。
>>29のコードの先頭付近にある「Grammar of Blog(ブログの文法)」というコメントから
コレクション関連のクラスを除いたものを以下に示します。
<Blog> = "url" "title" "seq_counter_of_aticles" "seq_counter_of_photos" <Aticles> <Photos>.
<Aticle> = "url" "title" "seq_num" "seq_conter_of_photos" <Photos>.
<Photo> = "url" "seq_num".
(次レスへ続く ....)
44:前スレ943
13/06/15 21:56:12.45
(.... >>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" }
(次レスへ続く ....)
45:前スレ943
13/06/15 21:56:57.89
(.... >>43 の続き、これで終わり)
これら集合間には、以下に示す「互いに交わりのない部分集合(nested set)」関係が存在します。
Component ⊃ Container, Component Photo ⊃, Container ⊃ Blog, Container ⊃ Aticle
URLリンク(www.h6.dion.ne.jp)
最後に先頭の継承の定義で述べた「継承 = 部分集合関係」に従って各集合をクラスへ置き換えると、継承階層が完成します。
前回(>>29)と比較すると各クラスの定義が簡潔になり、クラスの責任分担がより明確になったのではないでしょうか?
長々とカキコ連投を続けてきましたが、質問等の反応が無ければこれで終了です。スレ汚し失礼しました。
46:デフォルトの名無しさん
13/06/15 22:05:08.57
>>42
>何かもし他に今のレベルじゃここ読め!
URLリンク(doc.ruby-lang.org)
47:デフォルトの名無しさん
13/06/15 22:29:56.70
>>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の形にしてみたいなやり方を試したいた経緯がありました。
48:デフォルトの名無しさん
13/06/15 22:31:44.36
>>46
おぉぉ有り難う御座います!今まで見た事ありませんでした。
早速熟読したいと思います。
49:デフォルトの名無しさん
13/06/15 22:39:43.96
>>45
おつかれさまでした ありがとうございました
>>45さんのものより随分ちんけな形で完成したので、参考にしてグレードアップさせたいと思います
ありがとうございました
50:前スレ943
13/06/17 00:15:03.99
>>49
時間はかかるかもしれませんが、自分のペースで理解を進めていってください。
直感的なプログラミングを否定しているわけではなく、理屈と実践を反復することが大切です。
最後に、別スレへカキコした内容をコピペして終わります。がんばってくださいね。
> 235 名前: デフォルトの名無しさん Mail: sage 投稿日: 2010/09/22(水) 01:12:40
> >>232
> それでいいんじゃないかと。自分はF#は使ってないから一般論になってしまうけど、
> 理屈先行型の頭でっかちもダメだし、結果的に動くプログラミングしかできないのもダメ。
> 関数型言語の勉強という理屈とプログラミングという実践を繰り返し続けること、
> 言い換えると「抽象化(理屈) <-> 具体化(実践)」の反復プロセスが大切だと思う。
>
> その全体像は螺旋階段(スパイラル構造)のようであり、成長度の傾きはごく緩やかで、
> 暗闇の中で階段を一歩一歩上ることは焦りや不安が常につきまとうものだけど、
> ある時、ふと下界を眺めてみると、過去の自分が別人のように見えることに気付く。
> 自分の経験になるけど、新しいパラダイムの勉強と成長とは、そんなものだと思う。
51:デフォルトの名無しさん
13/06/19 18:43:12.21
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
===> 一瞬で終わる
52:デフォルトの名無しさん
13/06/19 19:57:28.14
またsync案件か
コマンドプロンプトは不安定っすなー
53:デフォルトの名無しさん
13/06/20 21:46:10.28
rubyでゲーム開発勉強してるんですけど移動のさせ方などの情報はのっていてもスクロールとかそういう詳しいところを解説してくれてるサイトが見つかりません 書籍とかならそういうのが書いてる奴があるのでしょうか
おすすめのサイトなり勉強法があったら教えてください
今使ってるライブラリはDXrubyですがそれ以外でも大丈夫です
ruby自体はある程度勉強しました
54:デフォルトの名無しさん
13/06/20 22:21:16.40
>>53
URLリンク(www.google.co.jp)スクロール
55:デフォルトの名無しさん
13/06/20 22:21:49.20
オリジナルの××システムで○○と書くところをRubyの××接続ライブラリではRubyを交えて△△と書く
という手順を経るので、元の××システムの勉強が必要
元の××システムを知らなくても××接続ライブラリが使えるということはぜんぜんない
DXRubyの場合はDirectXとWindowsAPIだね
56:デフォルトの名無しさん
13/06/21 14:08:18.59
54さん
回答ありがとうございます
スクロールというのは一例でそういうのがまとまって乗ってるサイトが知りたかったんです
言葉が足りなくてすいません
55さん
とういうことは初めてゲームプログラミングをするならrubydxを学ぶよりdirectxとかを先に学んだ方がいいってことでしょうか
57:デフォルトの名無しさん
13/06/23 16:30:39.11
さくらのレンタルサーバーでTwitterBotを作ろうとして
URLリンク(d.hatena.ne.jp)
上記のサイトを参考にして環境を構築したところ、テストで直接実行して投稿時に
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:デフォルトの名無しさん
13/06/23 17:16:06.32
認証が可能なルート証明書を探してきて(curlあたりが持ってるんじゃね?)、
Net::HTTP#ca_file = に設定する。
間違っても verify_mode = OpenSSL::SSL::VERIFY_NONE になんてしないように。
59:デフォルトの名無しさん
13/06/24 00:29:12.38
ruby初心者です。
コマンドで実行する時にruby a.rb 1とか指定すると1という値が渡せますが
例えば'あああああ[ここ]あああああ'の[ここ]の部分に代入することはできますか?
※置換ということではないです
60:デフォルトの名無しさん
13/06/24 00:59:35.18
コマンドライン引数は ARGV で取れるから
式展開で "あああああ[#{ARGV[0]}]あああああ"
ARGV[0] に a.rb でなく 1 が入るのと展開するときはダブルクォートを使うのに注意
61:デフォルトの名無しさん
13/06/24 01:09:50.70
>>60
ありがとおあああああああああああああああ
62:デフォルトの名無しさん
13/06/25 09:06:26.48
質問です。
「珉」という文字をCP932からEUC-JPに変換したいのですが、うまくいきません。
この文字はEUC-JPでは「0xFB 0xA6」ですが、変換すると「0x8F 0xCB 0xEA」になってしまいます。
変換に使用しているソースコードは下記の通りです。
使用しているバージョンは1.9.3と2.0.0です。
#coding: cp932
p "珉".encode("euc-jp").bytes.map{|i| "%02x" % i} #=> ["8f", "cb", "ea"] (異常)
p "山".encode("euc-jp").bytes.map{|i| "%02x" % i} #=> ["bb", "b3"] (正常)
よろしくおねがいします。
63:デフォルトの名無しさん
13/06/25 09:13:38.20
自己解決できそうです。
EUC-JPの文字符号化方式には、「CP51932」と「eucJP-ms」というのがあって、
「珉」は前者では「0xFB 0xA6」、後者では「0x8F 0xCB 0xEA」になるみたいです。
Windowsでは前者を使用しているみたいですが、
Rubyでは後者に変換してくれちゃってるみたいです。
うーん。面倒くさい・・・
ありがとうございました。
64:デフォルトの名無しさん
13/06/25 21:36:56.70
バグの可能性もあるから報告してみたら?
65:63
13/06/26 19:37:10.32
encodeメソッドに「CP51932」を指定できました。
ふええ・・・別の方法で対処した後に知ったよう・・・
#coding: cp932
str = "珉"
p str.encode("cp51932") #=> "\x{FBA6}"
p str.encode("eucJP-ms") #=> "\x{8FCBEA}"
p str.encode("euc-jp") #=> "\x{8FCBEA}"
66:デフォルトの名無しさん
13/06/28 11:23:21.08
uyなんですけど
ruby2.0でmechanizeが上手く入らないんですけど
67:デフォルトの名無しさん
13/06/28 11:56:28.95
nokogiriもダメなんですけど
68:デフォルトの名無しさん
13/06/28 12:05:46.79
rubyもまだまだですね
69:デフォルトの名無しさん
13/07/07 00:23:04.13
String#encodeってんなバイト列しらんだの変換できんだの文句たれてまともに変換できなくね?
結局NKFつかってる。
70:デフォルトの名無しさん
13/07/08 11:52:53.51
日本語を含みうる文字に関しては変換はほぼ妥当にできる
ただし、変換元のバイト列のエンコーディングと変換先のエンコーディングに関して大雑把にでも理解指定できているということが大前提
申告に虚偽があっても勝手に不可逆変換して情報を取り戻せなくなるNKFなんかよりはよっぽど誠実
ただしとても使い辛い
想像や無知で申告されたエンコーディング名をそのまま使うとほぼ確実に変換失敗する(HTMLのmeta charset名とか、「○○だから××だろう」とか)
これは「世の中が悪い」んではあるんだけども
まあエラーで止まってくれるんだったらその情報を頼りにエラー回復処理すればいいじゃん
71:デフォルトの名無しさん
13/07/08 12:10:05.19
pythonいいよね
自分はpythonの文字列処理のたびに例外に面食らったが
この板で馬鹿には無理と言われて勉強し直して覚醒したよ
>>70 の言うように勝手に暗黙の変換してデータ壊すより
エラーで止まってくれた方がよほど誠実だと納得した
72:デフォルトの名無しさん
13/07/08 12:12:24.98
は?
73:デフォルトの名無しさん
13/07/11 00:32:26.60
Ruby1.9 でsqlite3 を叩いているのですが、
ソースをutf8で書いていて、varchar型ににASCIIデータをを格納しようとしたところ、
ascii-8bit扱いになって実態参照でDBに格納されるので、encode("ascii")の連呼になってしまい。。
74:デフォルトの名無しさん
13/07/11 01:24:26.89
BLOBになる話かと思ったら違った
SQLite3にはvarcharなんて気の利いたものはないぞ、拒否らないだけで
sqlite3-rubyは返されるデータオブジェクトにエンコーディングを設定しない
設定しないってことはBINARY、Rubyで言うところのASCII-8BITだ
エンコーディング情報のない文字列にエンコーディングを設定するのは道理
75:デフォルトの名無しさん
13/07/11 01:27:06.76
unkonown仕様文字列
76:デフォルトの名無しさん
13/07/11 01:35:20.05
勝手にUTF-8とかで返すと海外の人が怒るからこうなってるという説
77:デフォルトの名無しさん
13/07/11 02:47:32.08
db open時の引数にcharset=が指定できるとありがたく。。
78:デフォルトの名無しさん
13/07/11 08:34:33.20
ところでこの場合 encode(バイト列を変換する) ではなく
force_encoding(エンコーディング情報だけ付け替え) ではないかい?
79:デフォルトの名無しさん
13/07/11 16:39:43.79
rubygems はしょうもないライブラリを登録しても怒られませんか?
80:デフォルトの名無しさん
13/07/11 17:02:34.69
特等席な名前でなければ気にされることはないと思う
81:デフォルトの名無しさん
13/07/11 17:29:38.49
特等席ネームかどうかなんて個人の主観だろ
だれも目をつけてない名前で登録して
あとからそれだめって言われてもな
82:デフォルトの名無しさん
13/07/12 11:46:07.90
たとえば "db" とか、どう見ても、って感じの名前はあるだろ
83:デフォルトの名無しさん
13/07/13 01:59:06.02
ruby-helloworld
84:79
13/07/13 13:28:20.40
ありがとうございます。
特別な名前でもないので思い切って登録してみます。
85:デフォルトの名無しさん
13/07/13 14:31:13.67
宝石がまたひとつ増えた
86:デフォルトの名無しさん
13/07/16 00:26:20.97
Tkのスレで聞いた方がいいかも知れないけど、
フレームをdestroyする時パックされてるボタンも一緒にdestroyされますか?
何か残骸みたいのが残ってたら気持ち悪いので
87:デフォルトの名無しさん
13/07/17 16:50:43.33
自力で解決できず行き詰っています。
どこが悪くてどうすればいいのか、どうか教えて下さい。
プログラムの目的:ニコニコ動画にログインする。
OS:Windows7
Ruby2.0.0を使っています。
(続きます)
88:デフォルトの名無しさん
13/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)
89:デフォルトの名無しさん
13/07/17 20:00:08.33
Mechanize 知らないのだけど page.link_with(:text => 'Login') だったりして
90:デフォルトの名無しさん
13/07/17 20:27:21.73
require 'mechanize'
mech = Mechanize.new
mech.user_agent_alias = 'Windows IE 7'
mech.ssl_version = 'SSLv3'
login = mech.get("URLリンク(www.nicovideo.jp)).forms[0]
login['mail'] = @mail
login['password'] = @password
login.submit
あれ? cant_loginになるな
91:87
13/07/17 20:28:30.01
>89 'Login'にしてみたらまた違うエラーになってしまいました・・・
エラーメッセージが長くてここに書けなそうです
92:87
13/07/17 20:32:19.74
>90 私も試してみましたが、また長いエラーメッセージが出ちゃいました
93:デフォルトの名無しさん
13/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
13/07/17 22:22:58.68
>93ここを参考にしました
ownway.info/Ruby/index.php?mechanize%2Fabout
95:デフォルトの名無しさん
13/07/17 22:30:45.31
こんなんでいける? >>90 を参考にさせてもらいました
require 'mechanize'
ua = Mechanize.new do |mech|
mech.user_agent_alias = 'Windows IE 7'
mech.ssl_version = 'SSLv3'
end
homepage = ua.get("URLリンク(www.nicovideo.jp))
loginpage = homepage.link_with(:text => "Login").click
loginpage.form_with(:action => "URLリンク(secure.nicovideo.jp)) do |form|
form["mail_tel"] = MYMAILADDR
form["password"] = MYPASSWD
end.submit
# p ua.page
96:87
13/07/17 23:02:50.24
>95 また長いエラーメッセージが出ちゃいました
97:デフォルトの名無しさん
13/07/17 23:18:16.24
>>96
なんてエラーメッセージ?
個人情報伏せたうえで pastebin とかに貼ってもいいよ
98:87
13/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
13/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'
(続きます)
100:デフォルトの名無しさん
13/07/17 23:59:09.53
>>98
Windows だとうまくいかないんだって
URLリンク(rubydoc.info)
よくわかんなかったら 証明書 mechanize windows でぐぐって
101:87
13/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
13/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
13/07/18 00:24:14.51
>>100 ありがとうございます。今度はエラーが出ませんでした!
エラーが出なかったということは、成功で良いのですよね?
確認する方法が分からないので少し不安ではありますが
104:デフォルトの名無しさん
13/07/18 07:06:02.53
サイト構造(HTML的な意味も含めて)を理解してないと辛い
いわゆるモダンブラウザが自動でやってる手順の多くを手動で書かないといけないからね
で、今なにやってるかというと、サイト利用のためにログイン済みクッキーが必要なので、
ログインページでログインしてMechanizeにクッキーを持たせてるんだ
Mechanizeオブジェクト(の、中)にクッキーが書き込まれてるので、そのままトップページや動画を読み込んでみればいい
たとえばトップページならユーザー名がHTMLに埋め込まれて送られてきているはず
ログイン失敗ならそのようなHTMLが送られてきているはず
余談だけどクッキーを外部保存して再利用することはニコ動ではおすすめできない(他のサイトでは可能)
これはサイト側の制限で、こちらではどうしようもない
105:デフォルトの名無しさん
13/07/18 10:02:07.58
そうだぬ
二重管理だと看做されると
強制ログアウトさせられるぬ