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

Ruby 初心者スレッド Part 39

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

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 1.8.7 は 1.9 系の新機能のいくつかが利用可能なため、1.8.7 を習得すればスムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0002デフォルトの名無しさん2010/10/21(木) 10:07:21
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
 ・「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」
  http://www.amazon.co.jp/gp/product/4797357401/
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
 ・「初めてのRuby」
  http://www.amazon.co.jp/dp/4873113679/

以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください。
 ・「Rubyレシピブック 第2版 268の技」(初心者向け)
  http://www.amazon.co.jp/dp/4797340045/
 ・「プログラミングRuby 第2版 言語編」(初心者向け)
  http://www.amazon.co.jp/dp/4274066428/
 ・「Ruby Way 第2版」(脱初心者向け)
  http://www.amazon.co.jp/dp/4798115339/
 ・ 「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
  http://www.amazon.co.jp/dp/4873113245/

以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません。
 ・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
  http://www.amazon.co.jp/dp/4873113946/
0003デフォルトの名無しさん2010/10/21(木) 10:08:18
Ruby 公式・非公式便利サイト2009

・Ruby Home Page 【公式、お役立ち度が微妙】
 http://www.ruby-lang.org/ja/
・Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
 http://www.ruby-lang.org/ja/man/
 http://www.ruby-doc.org/ 【詳しい英語版】
・HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
 http://elbereth-hp.hp.infoseek.co.jp/ruby.html
・Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
 http://www.ruby-doc.org/docs/ProgrammingRuby/
・Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
 http://jp.rubyist.net/magazine/

・逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
 http://www.namaraii.com/rubytips/
・はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
 http://d.hatena.ne.jp/keyword/Ruby

・RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
 http://www.rubyforge.org/
・GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
 http://github.com/

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 http://jp.rubyist.net/
0004デフォルトの名無しさん2010/10/21(木) 10:09:00
●関連スレ
【RoR】Rubyについて Part 41【CPAN vs RubyGems】
http://hibari.2ch.net/test/read.cgi/tech/1281473294/
●アンチスレ
Rubyについて(アンチ専用) Part004
http://pc12.2ch.net/test/read.cgi/tech/1249737531/
●Railsスレ
【Ruby】Ruby on Rails Part10
http://hibari.2ch.net/test/read.cgi/php/1282991262/
●Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc12.2ch.net/test/read.cgi/tech/1155031689/
●GUIの使えなさを堪能するスレ
Ruby で GUI するスレ
http://pc12.2ch.net/test/read.cgi/tech/1269609576/
●ぶん投げスレ
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/

●前スレ
Ruby 初心者スレッド Part 38
http://hibari.2ch.net/test/read.cgi/tech/1282781922/
Ruby 初心者スレッド Part 37
http://hibari.2ch.net/test/read.cgi/tech/1274121477/
Ruby 初心者スレッド Part 36
http://pc12.2ch.net/test/read.cgi/tech/1269233796/
0005デフォルトの名無しさん2010/10/21(木) 10:09:55
バージョンに関するよくある質問

・Ruby 1.8.5
 レンタルサーバ等にいまだに残ってる非安定な古いバージョン
 1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい

・Ruby 1.8.6
 過去の長期政権と数の暴力で一大勢力圏を維持中の旧安定版
 公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ

・Ruby 1.8.7
 1.9 シリーズの機能をいくつか足したハイブリッドなバージョン、初学者にこそお勧め
 1.9 系機能は 1.8.6 では動かないが「えーマジ1.8.6!? 1.8.6が許されるのは小(AA略」と煽ってよい

・Ruby 1.9.0
 不安定にして先鋭機能が超満載の開発版バージョンだったもの
 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に

・Ruby 1.9.1
 1.9 系列安定版の最新版のひとつ前(現在は1.9系列としては1.9.2を推奨)
 本体と添付ライブラリの動作は問題がないのだがgem等外部第三者ライブラリの対応が超適当特に英語圏産

・Ruby 1.9.2
 1.9系列安定版の最新版
 素人目にはどこがスゴいんだかわからないくらい慎重にバージョナップされたある意味つまんない安定版
 初心者を脱した人が外部ライブラリの開発コミュニティに参加して1.9.2対応進めてくれたりすることを期待中
0006デフォルトの名無しさん2010/10/21(木) 10:11:12
Windows で Ruby を使う初心者はとりあえず ActiveScriptRuby の 1.8.7 をインストールして慣れろ
OneClickInstaller は単に古すぎ、RubyInstaller は MinGW32 版で現状扱い怪しい、cygwin 版は cygwin マニア専用
IDEつまり統合環境のお勧めは特にない(せいぜい汎用のEclipseかNetBeans)、RDE は古くて独自すぎで Ruby に慣れた人向け

■ Windows でとにかく迷いたくない普通の人 … ActiveScriptRuby 1.8.7
ttp://arton.hp.infoseek.co.jp/indexj.html
 の題字のでかい 「ActiveScriptRuby 1.8.7(p302) with-winsock2 tcl-stub」

 マニュアルはWebで見ることもできるが手元にあると便利、1.8.7 の HTML ヘルプ版が
ttp://www.ruby-lang.org/ja/documentation/
 の「Rubyリファレンスマニュアル刷新計画 chm版 1.8.7用」

 夢のお告げ等、何かの間違いで Ruby の知識がないうちから 1.9.2 を使って苦しみたいマゾい人は
ttp://www.artonx.org/data/asr/ の「Ruby-1.9.2-p数字 Microsoft Installter Package」


・初心者向けチュートリアル記事(過去スレで出たもの)
ホワイの(感動的)Rubyガイド
http://www.aoky.net/articles/why_poignant_guide_to_ruby/
プログラミング入門 - Rubyを使って -, by Chris Pine, 日本語ver. by S. Nishiyama
http://www.ie.u-ryukyu.ac.jp/~kono/software/s04/tutorial/
Ruby チュートリアル (Ruby 1.8.6 編)
http://www.okisoft.co.jp/esc/ruby/tut.html
0007デフォルトの名無しさん2010/10/21(木) 10:34:36
そういえば ttp://arton.hp.infoseek.co.jp/indexj.html は移転先決まってるのかな
これiswebライトだから今月末でサーバ終わるだろ
0008デフォルトの名無しさん2010/10/21(木) 10:38:27
>>5の内輪的な口調のテンプレは何度見てもキモいな
0009デフォルトの名無しさん2010/10/21(木) 10:43:14
windows 利用者は消えた方が良いと思ってるみたいだ
0010デフォルトの名無しさん2010/10/21(木) 14:27:17
>>7
移転の話が載ってないということはそもそも気づいてない可能性が高い
誰かメールしたれ
0011デフォルトの名無しさん2010/10/21(木) 14:42:16
      ,―ヽ_(((((_、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    IPA Rubyは誰でもウェルカム
      i、  \   ./  /
       \   ーー   ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
0012デフォルトの名無しさん2010/10/21(木) 18:30:54
いちおつ

>>2
Rubyレシピブック 第3版 303の技
http://www.amazon.co.jp/dp/4797359986/

最近Amazonって旧版のページ行くと新版でてるよって教えてくれるけど
これには機能してなかった
1.8/1.9両対応らしいから旧版買った人はカワイソス
0013デフォルトの名無しさん2010/10/21(木) 22:20:23
Jrubyについての質問はここでいいですか?
0014デフォルトの名無しさん2010/10/21(木) 22:37:11
>>13
だめじゃないけど、Ruby初心者でjrubyとかつらそうな感はある。
あと、jruby固有の話題を扱いたいなら、別スレ立てた方がいいかもね。
0015デフォルトの名無しさん2010/10/21(木) 22:41:38
RubyをJAVAにコンバートするアプリとして紹介されたんですが、使い方
が今ひとつよくわからないので正しい使い方を知っている人がいたら
教えてもらおうと思いました。コマンドラインとか、エラーメッセージ
とかです。巨大整数を変換するのにlong型に入らなかったという内容の
エラーが出ます。またJrubyを使うと実行速度は上がるのでしょうか?
0016デフォルトの名無しさん2010/10/21(木) 22:50:31
>>15
RubyとJavaの両方でライブラリを公開できる程度の知識があれば可能
0017デフォルトの名無しさん2010/10/21(木) 22:58:44
そんなに難しいんですか?どっちも初心者なので解りません。
Rubyで作った暗号をJAVAに置き換えようと思ったんですが、コマンド
一つじゃできないんですか?
0018デフォルトの名無しさん2010/10/21(木) 23:06:43
>>17
RubyとJavaの両方でライブラリを公開できる程度の知識があれば可能
ちなみにこれはそんなに高度なことを要求されるわけでもない(初心者ではないというだけ)

というか、ドイツ語→フランス語翻訳サイトの使用に必要なものは何かというと
ドイツ語とフランス語だよな
翻訳されたフランス語がきちんとフランス語として正しいかどうかを検証するためには
フランス語の知識がやっぱ要るよな
で、結局そんな人はドイツ語の文章を読んでフランス語を自力で書いたほうが早いよな

つまりその程度
0019デフォルトの名無しさん2010/10/21(木) 23:08:50
>>15-17
何を言っているわからないw

>>15
> RubyをJAVAにコンバートする

もっと詳しく
ソースコードを変換するという意味?
Rubyで書いたソースコードをJavaの環境で動かすという意味?

> RubyをJAVAにコンバートするアプリとして紹介されたんですが、

紹介者に聞いたほうがあなたの状況も知っていて答えているだろうし、多分早いと思う

>>17
> Rubyで作った暗号をJAVAに置き換えようと思ったんですが、

Rubyで「作った」というのは生成した暗号なのか?Rubyで暗号化するためのソースのことか?
Javaで置き換えるとはどういう意味なのか?Javaで暗号を復号化できさえすればいいのか?


「Ruby 暗号 Java」でググると同じようなことをやっている人は見つかるがこういうのは需要があるのか?

0020デフォルトの名無しさん2010/10/21(木) 23:10:09
物凄く平たく言うと

>>15
>RubyをJAVAにコンバートするアプリとして紹介されたんですが
モルダー、あなた騙されたのよ
0021デフォルトの名無しさん2010/10/21(木) 23:11:34
ググった。こういうのか?ハマりどころも書いてあるし、初心者じゃなければいけそうだが

mixi Engineers’ Blog ≫ OpenSSLの暗号文をJava/Perl/Rubyで開く
http://alpha.mixi.co.jp/blog/?p=91
Javaで暗号化したデータをPerlで復号化しようとしたら大変だった件 - ダウンロードたけし(寅年)の日記
http://d.hatena.ne.jp/download_takeshi/20100819/1282173492
Java で暗号化したデータを Ruby で復号しようとしたら大変だった件 - 口内炎延焼
http://d.hatena.ne.jp/ssig33/20100823/1282554827
0022デフォルトの名無しさん2010/10/21(木) 23:16:10
俺なら普通に最初からJava勉強して普通にJavaで書く

JRubyは
「これなら、且つ、俺ならRubyで書いたほうが早いが、オリジナルRubyの実行環境がない」
「が、Javaならある」
という狭い条件のときにのみ使う
0023デフォルトの名無しさん2010/10/21(木) 23:16:57
RubyのコードをJAVAに変換してJAVAとして走らせて実行速度を上げたい
のです。
0024デフォルトの名無しさん2010/10/21(木) 23:20:18
jruby proj.rb とやっても実行速度は変わらないんですか?
RubyのコードがJAVAに変換されて出てくると思ったんですが違うみたい。
0025デフォルトの名無しさん2010/10/21(木) 23:26:53
JRubyでググれ
0026デフォルトの名無しさん2010/10/21(木) 23:32:41
>>24
AOTモードでコンパイルすればいい
JVMを常に起動した状態のサーバVM上で、そのプログラムに応じた専用の最適化をすれば、
単純なプログラムではRuby1.9.2と同等か速いこともある
0027デフォルトの名無しさん2010/10/21(木) 23:34:42
Rubyは必要な知識がほとんどいらないのに、JAVAはクラスとかオブジェクト
とかメソッドなんかあったりして覚えにくい先入観があります。
0028デフォルトの名無しさん2010/10/21(木) 23:43:52
>AOTモードでコンパイルすればいい
コマンドラインを教えてください。またどの程度速くなりますか?
0029Perl忍者 ◆M5ZWRnXOj6 2010/10/21(木) 23:44:12
お目エラこんなばかだからしょうがねえよなはげ
消えろてめえみらいたなカスが呼吸してるだけで目障りなんだよ
てめえらがルビーやることでさらに俺の怒りへのボルテージをかきたたせるがね
お前らゴミ糞は死ねよ

まつもとひろゆき拝んで死ね
0030デフォルトの名無しさん2010/10/21(木) 23:47:38
>>28
遅くなる
0031デフォルトの名無しさん2010/10/21(木) 23:48:47
ココは初心者のスレです。何様?
0032デフォルトの名無しさん2010/10/21(木) 23:55:12
信じていた妄想を否定する真実を告げられてキレる人が…
0033デフォルトの名無しさん2010/10/21(木) 23:59:23
crubyで遅いスクリプトはjrubyだと更に遅い
まあ当たり前
crubyでこれ以上ないくらい効率的なスクリプトであって、
VM起動済みのjrubyで何十回とベンチマークとってチューニングすれば、
crubyよりも速い実行時間を得られることがあるかもしれない
0034デフォルトの名無しさん2010/10/22(金) 00:02:20
JavaとJRubyとRubyの深い知識がないとチューニングできないと思うぞ
どこの誰に騙されたのか知らんけど>>22が概ねJRubyの真実
0035デフォルトの名無しさん2010/10/22(金) 00:09:58
「あなたが書く程度のプログラムはJavaよりもCで実行したほうがずっと速い」
というのは真実であって欲しいなあ

で、まあ、Rubyスクリプトが遅いのは普通はスクリプトの作り方が悪いんよね
コマンド一発で直してくださいとか言いそうだがそんなもんできんので勉強してくれ
0036デフォルトの名無しさん2010/10/22(金) 01:35:06
1.8系を使っています。
”3042” → あ 
のように16進数のStringからそれに該当するコードポイントを持つUNICODE文字を取得したいのですがどうすればいいでしょう。
["3042"].pack("U") 等ではうまくいきません。
お願いします。
0037デフォルトの名無しさん2010/10/22(金) 01:53:56
print '\u3042'.decode('unicode-escape')
0038デフォルトの名無しさん2010/10/22(金) 03:24:24
>>23-24
あなた騙されてるよ
0039デフォルトの名無しさん2010/10/22(金) 06:56:19
>>36
irb> puts ['0x3042'.hex].pack('U')
あ
0040デフォルトの名無しさん2010/10/22(金) 06:59:43
ああ、String#hexの場合は接頭詞いらんのだった
irb> puts ['3042'.hex].pack('U')
あ

とりあえず、
irb> p ["3042"].pack("U")
TypeError: can't convert String into Integer
とか今回はちゃんとエラー出るんで、できればエラー読んでマニュアルにあたって欲しい
0041デフォルトの名無しさん2010/10/22(金) 08:55:58
undefined method `hex' for 12354:Fixnum (NoMethodError)
0042デフォルトの名無しさん2010/10/22(金) 13:14:56
以前、javaでTDDをするよりは、rubyでTDDが動くのを確認してから
javaのソースコードに焼き直すと提言していた人がいたなぁ。
0043362010/10/22(金) 23:17:38
>40
ありがとうございました。誤ったコードを書き込んでしまい失礼しました。
実はvisualuruby上でUNICODE文字を表示させたかったのです。
教えていただいたコードでテキストファイルには正しく文字が出力されましたが、
visualuruby上では化けてしまいます。
これはきっとどうにもならなそうなので別の道を考えます。
0044デフォルトの名無しさん2010/10/22(金) 23:38:59
>visualuruby上では化けてしまいます。

まじか
0045362010/10/22(金) 23:43:52
>44
はい。$KCODEをUTF8にしたりしてみたのですが、わかりません。
exerbで固めれば配布するのも簡単そうなのでvisualurubyで行きたいのですが。
ほかのGUIキットは別途ライブラリのインストールが必要ですよね。

0046デフォルトの名無しさん2010/10/23(土) 00:33:28
visualurubyはSJIS固定
0047デフォルトの名無しさん2010/10/23(土) 17:35:31
質問ですが、windowsでactivescriptruby1.8.7を使って
昨日簡単なプログラムを作ってみて実行させたら結果が出たらすぐに操作盤
が閉じてしまって、ちゃんと実行されたかどうかわからないのですが
どうすればよいでしょう?
0048デフォルトの名無しさん2010/10/23(土) 17:43:00
操作盤ってすごいな

>>47
Windowsの標準の出力の特性上、そもそもそういうもんですとしか…
出力を眺めたいなら、コマンドプロンプト起動してそこから実行するといい
0049デフォルトの名無しさん2010/10/23(土) 17:43:15
>>47
アイコンをダブルクリックで起動すると閉じちゃうから
コマンドプロンプトから実行
よくわかんなかったらコマンドプロンプトの使い方を勉強しる
0050デフォルトの名無しさん2010/10/23(土) 18:34:14
>>48-49さん回答ありがとうございます。
コマンドプロンプトの勉強をします
0051デフォルトの名無しさん2010/10/23(土) 19:07:05
「操作盤」気に入った。おれは今度から使わせてもらう
0052デフォルトの名無しさん2010/10/23(土) 19:16:34
 プ ロ ン プ ト
「 操 作 盤 」
0053デフォルトの名無しさん2010/10/23(土) 19:22:02
>>52
マジレスすると操作盤ってコンソールのことだお
プロンプトは入力を促す > みたいな文字のこと
0054デフォルトの名無しさん2010/10/23(土) 21:59:11
コントロールパネルのことだろ
中国人死ね
0055デフォルトの名無しさん2010/10/24(日) 01:48:16
物理的なコンソールは操作卓と訳すかなー。
それだと椅子までセットになりそうだが。
盤だと上のパネル部分になるのかね。


0056デフォルトの名無しさん2010/10/24(日) 01:52:12
名古屋打ちなら任せてくれ
0057デフォルトの名無しさん2010/10/24(日) 02:44:48
おっさん自重しろ
0058デフォルトの名無しさん2010/10/24(日) 10:40:32
>>52
wwwwwww
0059デフォルトの名無しさん2010/10/24(日) 10:44:07
>>47
・コマンドプロンプトから実行
・外部コマンドが実行できるもしくはRubyのサポートがあるテキストエディタ上から実行
・NetBeansだかAptanaだかのIDEから実行

後者は2つはソースを書きながら、プログラムが終了しても実行結果を表示させたままにできるし
おすすめ
0060デフォルトの名無しさん2010/10/24(日) 13:02:28
ruby1.9.2でmongrel動かないんですか?
あとWEBrickでhttpヘッダのcharset指定ってどうやるんですか?
0061602010/10/24(日) 13:06:19
あ、すいません。
WEBrickのほうは僕の勘違いでした。
0062デフォルトの名無しさん2010/10/24(日) 13:23:03
1.9.2です。

以下のように、ハッシュをeachで取り出したいのですが、どうも上手くいきません。
正しい記述方法を教えてもらえないでしょうか?

h = {
 :area => 1,
 :output => 2,
 :category_type => 3,
}

url = 'http//'

h.each do |key,value|
  url += key + '=' + value + '&'
end
0063デフォルトの名無しさん2010/10/24(日) 13:32:52
h.each {|key,value|
  url += urlescape(key) + '=' + urlescape(value) + '&'
}
0064622010/10/24(日) 14:04:24
>>63 

どうもありがとうございますm(_ _)m

さっそく実行してみたのですが、

undefined method `urlescape' for Alert:Class

というエラーがはき出されてしまいました。ググってみたところ、
これは自作してdefを定義しないといけないのでしょうか?

このような形で
def urlescape(string)
string.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
'%' + $1.unpack('H2' * $1.size).join('%').upcase
end.tr(' ', '+')
end
0065デフォルトの名無しさん2010/10/24(日) 14:23:51
>>62
require 'uri'
require 'webrick'
data = {'k1'=>'v1', :k2 =>'v2', 'k3' => '3&4'}
uri = URI.parse("http://example.com/")
query = data.map{|k, v|
# do not use URI.escape
"#{WEBrick::HTTPUtils.escape(k.to_s)}=#{WEBrick::HTTPUtils.escape(v.to_s)}"
}.join('&')
uri.query = uri.query.to_s + query

p uri.to_s
0066622010/10/24(日) 15:15:39
>>65

ありがとうございます。m(_ _)m

ちょっと、複雑でわからなかったので、
以下のような形にしたら、一応は動きました。

もっとシンプルなやり方がないものでしょうか。

url = 'http://example.com'
params = Hash::new
params['area'] = 'tokyo';
params['output'] = 'json';

params.to_a.each do |key,value|
url += key + '=' + value + '&'
end
0067デフォルトの名無しさん2010/10/24(日) 15:55:20
最大限妥当なURLを作る最短レベルに妥当でわかりやすい方法として、
URLエンコードしたものを繋げてURI#queryに追記、というの以上のものは現状あんまりないと思うぞ

これ以外の書き方をした場合、将来絶対どっかで詰まって
その回避のためにコードがながーいよ状態になるはず
Array#map と Array#join がわかりにくいと思う場合、ぜひ勉強してくれ
これらを一切使用しないコードのほうが逆にわかりにくい
query = pairs.join('&') の部分を分解しようと思ったが諦めた
WEBrick::HTTPUtils.escape は & をパーセントエンコードしないので書き換え

require 'uri'
require 'erb'
data = {'k1'=>'v1', :k2 =>'white space', 'k3' => '3&4'}
uri = URI.parse("http://example.com/")
pairs = []
data.each do |key, value|
encorded_key = ERB::Util.url_encode(key.to_s)
encorded_value = ERB::Util.url_encode(value.to_s)
pairs << encorded_key + '=' + encorded_value
end
query = pairs.join('&')
uri.query = uri.query.to_s + query

p uri.to_s
0068デフォルトの名無しさん2010/10/24(日) 15:57:23
ちなみに ERB の機能駆使で短くするとこんなのに

require 'uri'
require 'erb'
include ERB::Util
data = {'k1'=>'v1', :k2 =>'white space', 'k3' => '3&4'}
uri = URI.parse("http://example.com/")
uri.query = uri.query.to_s + data.map{|k, v| "#{u(k)}=#{u(v)}"}.join('&')
p uri.to_s
0069デフォルトの名無しさん2010/10/24(日) 16:04:18
うまくいきません、でよく解決方法アドバイスできるな。
これがエスパーってやつか
0070622010/10/24(日) 16:16:10
>>67-68

親切にどうもありがとうございますm(_ _)m

今やろうとしていることは下記のようなことです。 

※Rails3 ruby1.9.2使用

1 JSON形式でAPIアドレスを取得。 (ここでハッシュをeachで回してURLを結合)
2 それをRuby形式に変換 (json.rbを使って変換予定)

require 'json'
def self.get_xml
url = 'http://allcoupon.jp/api-v1/coupon?'
params = Hash::new
params['area'] = '%E6%9D%B1%E4%BA%AC';
params['output'] = 'json';

params.to_a.each do |key,value|
url += key + '=' + value + '&'
end

url = JSON.parse(url)
return url
end

このような場合でも、例で示してもらえたURLエンコードなどの
記述をするべきでしょうか?
最初は単純に文字列をループで結合としか考えてなかったもので。

とりあえず array#mapなどは勉強してきます!
0071デフォルトの名無しさん2010/10/24(日) 16:30:05
入力データがエスケープ済みだと完全に信用できるのなら、エスケープはしたらイカン
二重になってしまうだけだし、その場合は単純に結合でいいんでないの

あと、URL の構成要素についての知識がないようだ
query を & で終了させたらその後にクエリ文字列が続くのかフラグメント文字列が始まるのか
区別つかなくなるからやっちゃ駄目

それと、+= は Ruby ではあんま使用されないので、使わないことをお勧めする
0072622010/10/24(日) 16:37:30
>>71

ありがとうございます!

URLエンコードを必要とした場合の記述だったのですね。
じっくりコードを見直して、どう動いているかを確認させてもらいます!

&で終了させても普通に動いてたのでそのままにしておきましたが、気をつけたいと思います。

+=以外の方法を探してみます!

0073622010/10/24(日) 19:33:20
JSON形式からHashに変換したデータの値を取得するのでハマっております。
Rails 3 ruby 1.9.2

※controller

url = 'http://allcoupon.jp/api-v1/coupon?area=%E6%9D%B1%E4%BA%AC&output=json'
contents = URI.parse(url).read
contents = JSON.parse(contents)
@debug = contents['coupon_id']

※view

<%= debug(@debug) %>

-----------------------------

コントローラで、
@debug = contents とすると

こんな感じでずらりと並ぶ。
coupon_id: "2086"
.......

@debug = contents['coupon_id'] とすると

"can't convert String into Integer"

というエラーが出て、上手く値が取得できません。
よい方法を教えてもらえないでしょうか?
0074デフォルトの名無しさん2010/10/24(日) 19:38:20
RailsはRailsスレで
【Ruby】Ruby on Rails Part10
http://hibari.2ch.net/test/read.cgi/php/1282991262/
0075デフォルトの名無しさん2010/10/24(日) 20:15:25
>>73
contents の冒頭はこうなってるよ。

[{"coupon_id"...


contents hash じゃなくて、要素がhashのarray

debugはYAMLで出力するんだが、
coupon_id:
じゃなく
- coupon_id:
になってなるのでは?
0076デフォルトの名無しさん2010/10/24(日) 20:17:42
>>73
<pre><%=h contents.inspect %></pre>
でもしてどんなデータ構造になっているかよく眺めたら。
0077デフォルトの名無しさん2010/10/24(日) 20:22:29
元はJSONだからハッシュじゃなくてオブジェクトだな
# こまけぇこたぁはいいんだよ!!(AA略

0078デフォルトの名無しさん2010/10/24(日) 22:41:51
COBOLからRubyにやってきたのですが、
なかなかなじめません。
A = Bを、MOVE B TO Aと記述できるように
する拡張ライブラリなどはありませんか。
0079デフォルトの名無しさん2010/10/24(日) 22:53:01
2ch は心の荒んだ人の溜り場だな
0080デフォルトの名無しさん2010/10/25(月) 00:56:51
>>78
言語ごとに流儀が違うわけだし、RubyをやるならRubyに慣れるしかないと思う。
0081デフォルトの名無しさん2010/10/25(月) 01:30:11
Rubiniusをインストールしようと思うんだが、Rubiniusのインストール事態にCRubyが必要とか言われて混乱してる。
要するにこれって大部分がRubyで記述されてるだけで正体はLLVMベースのJIT/AOTコンパイラなんだろ?
ならRubinius自体を(中間言語まででいいから)コンパイルして配布すればいいだけなんじゃ……
わざわざCRubyの上でRubinius動かす意味ってあんのかね
0082デフォルトの名無しさん2010/10/25(月) 03:30:10
【Perl,PHP】LLバトルロワイヤル13【Ruby,Python】
http://hibari.2ch.net/test/read.cgi/tech/1287944631/

新スレ
0083デフォルトの名無しさん2010/10/25(月) 06:02:11
>>81
あなたはバイトコンパイルしてあってもファイルを読めるのかもしれないが、
残念ながらふつうのRubyプログラマはバイトコードを直接読むことができない
そういう劣ったRubyプログラマ向けの「Rubyで拡張可能なRubyコンパイラ」なので
あなたは是非こんなものは捨てて高みを目指して頂きたい
0084デフォルトの名無しさん2010/10/25(月) 07:48:33
>>81
CRubyが必要だというなら、インストールすればいいだけじゃないの?
0085622010/10/25(月) 10:23:54
>>74

すいません、基本的なハッシュの話でこっちのほうがよかったかなと思いまして。

>>75

contents[0]['counpon_id']でうまく行きました!
ありがとうございます。

しかし、<%= debug(@debug) %> で表示すると、
"\xE6\x9D\xB1\xE4\xBA\xAC" こんな感じで日本語がバグっているので、
JSON形式とRubyのハッシュに変換する前に、URLエンコードをしないといけないのかなと思っています。

>>73

debugをやりやすくするにはどうしたらいいのかなと思ってたんですが、
ずばり使いやすいコードを教えていただき、感謝!

>>77

厳密にいうとオブジェクトと考えるのですね。なるへそ。
0086デフォルトの名無しさん2010/10/25(月) 11:10:09
PGconnについて

data = conn.query("SELECT * FROM table1;")

のようにexecかqueryを使った場合、conn.clearしてメモリを解放しなさいとあるのですが、

if conn.query("SELECT * FROM table1;")[0]

のように条件判断で使った場合も本来は変数にいれてclearしないとメモリに残ってしまうのでしょうか?
0087デフォルトの名無しさん2010/10/25(月) 11:13:40
>"\xE6\x9D\xB1\xE4\xBA\xAC" こんな感じで日本語がバグっているので、

バグってなんかいません
0088デフォルトの名無しさん2010/10/25(月) 11:24:34
>>86 残ります
0089デフォルトの名無しさん2010/10/25(月) 11:26:30
PGconn ってなんですか(素)

>>86
えー、よくわからんが、
 data = 外部ライブラリ経由での配列取得行為
でメモリリークするかもしれませんという話なのなら、
 外部ライブラリ経由での配列取得行為[0]
でも外部ライブラリ経由での配列取得行為自体は行われるので、メモリリークへの対処はすべきだと思われ
0090デフォルトの名無しさん2010/10/25(月) 11:28:40
>>85

URLエンコードではなく、JSONには日本語リテラルが ¥uFFFF という
ASCIIテキストにエンコードされて入っているので、FFFF部分を生の表記に
置き換える必要があるんだけど、元のデータにJSON上の違反がある
のでめんどいな。
サロゲートペアが必要な文字のコードを1つの¥uのあとに8桁書いてる。
正しくは¥uXXXX¥uYYYYのように2文字として書く。
0091デフォルトの名無しさん2010/10/25(月) 11:39:28
>>88

ありがとうございます。
デバッグも兼ねて何がメモリに残っているか確認する方法や、ツールなどはあるのでしょうか?
0092デフォルトの名無しさん2010/10/25(月) 11:46:39
PGresult#type について

データベース内にはbool値が入っているのに、conn.queryで取得するとすべてStringになってしまいます。

プログラム内では
hoge = conn.query("SELECT * FROM table1;")
(hoge[0] ? "ほんと": "うそ")
としたいのですが、

(data[0] == "true" ? "ほんと": "うそ")
として動かしています。
bool値はbool値として取得する方法はありますか?
0093デフォルトの名無しさん2010/10/25(月) 11:47:32
>>92
bool値ってなんですか?
0094デフォルトの名無しさん2010/10/25(月) 11:52:15
そのへんは個々のライブラリの動作の話になりそうな
trueとfalseで返さないのはそれはそれで妥当な気もする
0095デフォルトの名無しさん2010/10/25(月) 12:11:11
>>94に一票
とりあえず、query[n] は文字列の配列一覧であるかのように返すように作ってあるのだろう(いや、知らんけど)
ソース見ると getisnull というメソッドがあるようにも見えるがどうやって使うのかはしらね
個々のメソッドで直接アクセスすれば true とかで返ってこないかね
0096デフォルトの名無しさん2010/10/25(月) 12:18:32
つまりは inspect の返り値をどうかしようとしてる状態なんだな
0097デフォルトの名無しさん2010/10/25(月) 12:23:34
例えば、会員サイトのユーザー訪問回数をDBに入れるとして

plus_one = conn.query("SELECT houmon_no+1 FROM table1 WHERE user_id = #{session['user_id']};")[0][0] # 例えば'3' or nilが入る
puts (plus_one ? plus_one : 1)

のようにしてるのですが、これは本来は

plus_one = conn.query("SELECT houmon_no+1 FROM table1 WHERE user_id = #{session['user_id']};") # [['3']] or [[nil]]が入る
puts (plus_one[0][0] ? plus_one[0][0] : 1)
plus_one.clear

とすべきなんですね。ありがとうございました。
0098622010/10/25(月) 15:23:47
>>90

ありがとうございます。

普通にエンコードする関数を探して、一発で変換と思ってたのですが、
この場合はどのようにすればよいでしょうか?

1.9.2ではJSON形式変換が標準でついているらしく、
このへんを読んでみましたが、日本語に変換というのがよくわからず。
http://rurema.clear-code.com/1.9.2/class/JSON.html

http://webos-goodies.jp/archives/boost_json_conversion_using_string_inspect.html
このライブラリも1.9系だと特に関係ないようで。


これならば、xml形式を使ったほうが簡単なのかと悩み中です。
0099デフォルトの名無しさん2010/10/25(月) 16:02:58
JSONはマルチバイト周りで不適切な動作をする変換器が氾濫してるので
他に選択肢があるなら使用しないのが現状のベター
「ぜんぶえいご」なら問題ないのだけれど
0100デフォルトの名無しさん2010/10/25(月) 19:27:43
UTF-8だろ常考
0101デフォルトの名無しさん2010/10/25(月) 20:28:58
>>62 のひとは
データ型の扱いがルーズすぎるよ
Rubyは基本的に勝手に型変換とかしないので
きっちり変換しないとだめだよ

たとえデータベースに真偽値が入っているとしても、ライブラリがRubyでの真偽値を返すかどうかなんてわからないし
ライブラリのドキュメントをよく読めとしかいえないな
■ このスレッドは過去ログ倉庫に格納されています