トップページ⇒tech
1002コメント364KB

Ruby 初心者スレッド Part 58 [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/03/23(水) 21:16:44.36ID:6HedlyzC
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

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

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
05545492016/07/18(月) 01:50:25.67ID:IKQ2dxNQ
タイミングが良いんだか悪いんだか判らんけどレスthx
mruby-ioを見つけて試すも大きなファイルを操作できない
Fixnumの壁が原因とわかりCコードとにらめっこすること数日
sysseekをFloatも受け付けるように改造してようやく目的を達成
Bignumが無い影響がもろに出てしまっていますな
0555デフォルトの名無しさん2016/07/20(水) 03:31:47.01ID:GlTBqNkC
Ruby1.9以降は、rubyコードをJITコンパイルで変換してから実行してるんだよね?
Rubyのソースコード読んでるんだけど、Ruby1.8までならWebにころがってる情報で構造をなんとなくレベルまで理解できる
でもRuby1.9からはさっぱり理解不能で、何処がVMの部分なのかさえ読めない

どこかにRuby1.9以降のソースを解説しているサイトない?
なければソース全部じゃなくて、おおまかに構造を解説しているサイトでも構わない
0556デフォルトの名無しさん2016/07/20(水) 11:13:49.96ID:WyhLRx8l
ruby/doc/extension.ja.rdoc じゃダメなん?

Appendix A. Rubyのソースコードの分類
https://github.com/ruby/ruby/blob/trunk/doc/extension.ja.rdoc#appendix-a-ruby%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%88%86%E9%A1%9E
0557デフォルトの名無しさん2016/07/20(水) 18:43:26.64ID:KOGDxcQR
>>555
>Ruby1.9以降は、rubyコードをJITコンパイルで変換してから実行してるんだよね?

どこのソースから、そんな嘘情報を仕入れてきたの?
1.8迄はAST(抽象構文木)を直接的に評価していたのが、
1.9以降ではVM(正確にはYARV)へコンパイルするよう改善されただけの話だよ
いわゆるJavaScriptのV8エンジンみたいな本格的なJIT(Just In Time)コンパイル技術は、
今のところRubyには導入されちゃいない

>Rubyのソースコード読んでるんだけど、Ruby1.8までならWebにころがってる情報で構造をなんとなくレベルまで理解できる

1.8までならWeb公開されてるRHGが(言語処理系に興味がある人にとっては)バイブルだったね
  http://i.loveruby.net/ja/rhg/book/
1.9以降なら、以下の書籍が必読本になった(RubyのVMであるYARVの解説書でもある)
  Rubyのしくみ -Ruby Under a Microscope-
  https://www.amazon.co.jp/dp/4274050653/

Ruby処理系高速化の未来に関しては、"HPC(Hight Performance Computing) Ruby"が鍵になると予測する
・HPC Ruby Compiler(プレゼン)
 https://www.cps-jp.org/~mosir/pub/2012/2012-03-05/03_nakamura/pub-web/HPC_Ruby_Compiler.pdf
・HPC Ruby: 静的解析に基づく Ruby の高度最適化コンパイラ
 http://ci.nii.ac.jp/naid/110008583419 
 
さらに、その基礎となる "Soft Typing"(動的型付け言語における型推論) をキーワードで調べるのがいいと思う
もし英語が読めるなら、たとえば以下の論文を:
・SOFT TYPING 1991
 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.24.9333&;rep=rep1&type=pdf
・A Scheme-to-Java Translator with Soft Typing 2002
 www.kb.ecei.tohoku.ac.jp/~sumii/pub/scm2java.ps.gz
 
  
0558デフォルトの名無しさん2016/07/21(木) 03:34:57.24ID:jgTQj/gW
JITを使うのは、JavaVMを使う、JRubyだろ。
10万回以上ループすると、もう一段階、最適化する

500万回(0.5秒)以上では、CRuby(MRI)よりも速くなる

「Rubyのしくみ」2014、に書いてある。
コンパイラ・インタープリターを作るなら、読んだ方がいい
0559デフォルトの名無しさん2016/07/21(木) 04:24:33.02ID:WJGproPC
YARVちょっとググってみたけど、
バイトコードインタプリタって書かれとる
逐次変換して処理してるわけか

1.9以降はバイトコードに変換して処理してるって聞いてたから
てっきりJIT技術使ってるんだと思ってた
さんくす
0560デフォルトの名無しさん2016/07/21(木) 19:25:21.64ID:9nmG0K7V
実行時に変換してるんだからJITでOK
0561デフォルトの名無しさん2016/07/21(木) 22:00:48.00ID:MOZT2+1A
RangeってRubyの組み込みクラスにしては貧弱というか
ある数値が範囲より大きいか小さいかカバーされてるかを調べるUFO演算子とか
2つのRangeオブジェクトが被ってる部分があるかどうかを判定する機能とか
あれば便利な気がするんだがなぁ
0562デフォルトの名無しさん2016/07/22(金) 05:24:42.73ID:8LVOaO/m
Range#===, Range#include?, Range#member?, Range#cover?
Enumerable#grep
じゃダメなの?
0563デフォルトの名無しさん2016/07/22(金) 07:27:36.63ID:y4ZiHYE1
前者についてはそれじゃ機能が足りないんだ
範囲内最小の値よりなお小さいか
最大の値よりなお大きいかまで判定してほしい

後者については機能的にはそれでいいんだけど
Rangeのサイズが1000万までありうるので速度的に(´・ω・`)

自分で実装してみると
class Range
def <=> obj
(((min <=> obj) + (max <=> obj)) / 2.0).truncate
end
def & other
[min, other.min].max..[max,other.max].min
end
end
0564デフォルトの名無しさん2016/07/22(金) 07:39:58.12ID:y4ZiHYE1
セルフツッコミしとくと
前者はobjが<=>演算子非対応でnil返した場合を考慮してない
後者はotherがRange以外の場合を考慮してない上に範囲外の場合変なRangeを返すので気持ち悪い
0565デフォルトの名無しさん2016/07/22(金) 07:53:03.72ID:ot11jjQx
UnityのMathf.Clampみたいに、

Clamp(value, min, max)
最大値と最小値の間で、収めるような関数もあればいいね

10 = Clamp(20, 1, 10)
0566デフォルトの名無しさん2016/07/22(金) 07:55:55.89ID:8LVOaO/m
どうせIntegerなんだから
(min <=> obj) + (max <=> obj) >> 1
でよくね?
あと
(1..2) & (3..4) # => (3..2)
だから
(3..2).max # => nil
になって気持ち悪い
0567デフォルトの名無しさん2016/07/22(金) 07:58:36.16ID:8LVOaO/m
ごめん、リロってなかったorz
0568デフォルトの名無しさん2016/07/22(金) 08:06:48.82ID:y4ZiHYE1
>>566
Rubyでは負数の除算がアレなんだ
-1 >> 1 = -1
0569デフォルトの名無しさん2016/07/22(金) 08:19:38.53ID:8LVOaO/m
-1 >> 1 = -1
って普通じゃないの?
rangeのfirstもlastもIntegerならこれでいいか
class Range
def &(other)
[first, other.first].max..[exclude_end? ? last - 1 : last, other.exclude_end? ? other.last - 1: other.last].min
end
end
0570デフォルトの名無しさん2016/07/22(金) 08:39:44.79ID:DR9XI0EI
>>563
<=> はそういうものじゃない。お前さんの言うような機能はあっても良いが、それが <=> と名付けられることは未来永劫ない。
0571デフォルトの名無しさん2016/07/22(金) 08:49:54.31ID:cUWclNnj
Array#<=>なんてものもあるし未来永劫無いとは言い切れなくもなくない
0572デフォルトの名無しさん2016/07/22(金) 21:13:35.89ID:DR9XI0EI
>>571
Range#<=> が追加されないなんて一言も言ってないよ。
>>563 の期待するものにはならないってだけ。
0573デフォルトの名無しさん2016/07/22(金) 21:16:28.21ID:cUWclNnj
>>572
ああ、本当だ。早とちりすまん
0574デフォルトの名無しさん2016/07/23(土) 23:49:44.32ID:l6bIVOK+
ruby初心者です。
変数の中に入った文字列の置換ができません。
例えばhtmlという変数の中に入った(http://○○-1.jpg)の中の-1を無くしたい場合
subかgsubを使うかと思います。
試しにp html.gsub(/-1.jpg/,
0575デフォルトの名無しさん2016/07/23(土) 23:52:24.68ID:l6bIVOK+
ruby初心者です。
途中で書き込みが消えてしましました(汗)
変数の中に入った置換の方法を教えていただけますでしょうか。
よろしくお願いします。
0576デフォルトの名無しさん2016/07/23(土) 23:55:26.99ID:3089LaeD
>>574-575
html.gsub!(
か
html = html.gsub(
0577デフォルトの名無しさん2016/07/24(日) 00:37:14.40ID:9mJaMPLw
>>574
確認画面が出たとき、ダブルクォーテーションがあると、文が切れる。
2chのバグだろう。たぶん、エスケープしていない

str = 'ttp://abc/xxx-1.jpg'
str = str.gsub(/-1.jpg/, '.jpg')

puts str

結果、ttp://abc/xxx.jpg

正規表現の先読みを使っても、できる
0578デフォルトの名無しさん2016/07/24(日) 00:56:13.49ID:VgaTJS92
>>576>>577
ご丁寧にありがとうございます。
今やってる作業がanemoneで拾ってきたhref要素を変数に入れてその一部-1を置換しようとしています。
教えていただいた通り、
str= node.css('a').attribute('href').value
str = str.gsub(/-1.jpg/, '.jpg')
puts str
と書き換えたのですが-1は消えませんでしたので、何か別の原因で引っかかってるみたいです。
0579デフォルトの名無しさん2016/07/24(日) 07:06:47.90ID:uCHUDa0e
細かい事だが /-1\.jpg$/ の方が変な誤爆しないですむ

実は-1じゃなくて-l(小文字のL largeサイズ指定)だったというオチが思い浮かんだが…
0580デフォルトの名無しさん2016/07/24(日) 07:36:38.76ID:ix/R/9ty
gsub(/http:\/\/○○\K-1(?=\.jpg)/, '')
0581デフォルトの名無しさん2016/07/24(日) 11:12:26.70ID:wdZTIji9
>>577
切れ"ない"よ
ブラウザのバグだろ
0582デフォルトの名無しさん2016/07/24(日) 14:16:46.18ID:VgaTJS92
574です。
置換する変数を間違っていただけのうっかりミスでした・・・orz
sub,gsubを使って上記の教えていただいた方法で変数の中身を無事置換できました。
ありがとうございますm(_ _)m
0583デフォルトの名無しさん2016/07/26(火) 21:17:51.50ID:uTRCF1br
>>440
> 個人的にはアスタリスク2回でハッシュを受け取る

> とかの方がよっぽど見かけたことないです。
> どなたか使ったことある方いらっしゃいますか?

カメだけど、超使う。
キーワード引数と組み合わせたり。
0584デフォルトの名無しさん2016/07/27(水) 15:07:46.63ID:nl1cCFz0
pythonだとさらによく使う
0585デフォルトの名無しさん2016/07/29(金) 08:11:29.53ID:1qYsbBpR
gtk3 でGUIを作ろうとしてるんだけど
stdinを監視したい

普通ならSTDIN.each_lineとかでSTDINを監視したら良いと思うけど
gtk3とか使うとイベントループさせないといけなくなるので
イベントループするメインルーチンでこれやりたいんだけど
やり方わかんない

標準入力を監視しながらのプログラムの場合どうやってる?
別スレッドにするのが普通なのかね?
0586デフォルトの名無しさん2016/07/29(金) 09:19:20.82ID:AO+a9SAV
>>585
・GUI の main loop で fd を監視
 http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=GUI+%A4%CE+main+loop+%A4%C7+fd+%A4%F2%B4%C6%BB%EB

・Gdk::Input - Ruby-GNOME2 Project Website
 https://ruby-gnome2.osdn.jp/hiki.cgi?Gdk%3A%3AInput

・stdinから一行ずつ読んでそれっぽく表示 on ruby-gnome2
 http://shyouhei.tumblr.com/post/119202369/stdinから一行ずつ読んでそれっぽく表示-on-ruby-gnome2
0587デフォルトの名無しさん2016/07/29(金) 09:45:02.59ID:1qYsbBpR
>>586
ありがとう!!!
gtk2ではその方法で上手くいきました
gtk3を使おうとするとGdk.InputのかわりにGLib::IOChannelを使うようにメッセージがでて
Gdk::Input::READのところでエラーになるんだけど
ちょっと検索かけただけじゃやり方わかりませんでした

御存じなら教えてください
よろしくお願い致します
0588デフォルトの名無しさん2016/07/29(金) 10:54:00.67ID:AO+a9SAV
>>587
GTK3は触っていなかったんだけど、GDKより低レイヤーなGLibで
外部イベントを扱うように変わったのですかね

・GLib::IOChannel - Ruby-GNOME2 Project Website
 https://ruby-gnome2.osdn.jp/hiki.cgi?GLib%3A%3AIOChannel

・ruby-gnome2/iochannel.rb at master · taf2/ruby-gnome2 · GitHub
 https://github.com/taf2/ruby-gnome2/blob/master/glib/sample/iochannel.rb

GTK2はGTK3へ更新されましたが、Glib2は(Glib3へ更新されず)そのままGTK3で使われているので、
そのまま動くのではないかと思われます(手元ではGTK3をインストしてないので動作未確認)
0589デフォルトの名無しさん2016/07/29(金) 10:58:51.55ID:1qYsbBpR
>>588
ありがとう助かったよ
検索上手いね!!
0590デフォルトの名無しさん2016/07/29(金) 15:09:47.59ID:DEZEXrtC
配列の中から偶数の要素だけ配列の中に残したいです。テキストにはselect!を使うとあるのですが、まだ、Rubyを勉強して日が浅いので、今までに勉強したやり方で
表記することにしました。自分の考えとしては、配列の要素のvalueを2で割った剰余が0であるもののみ、配列の中に入れなおすという方法しか思いつきませんでした。
そこで以下のプログラムにしてみたのですが、うまく動きません。どこがおかしいのか指摘していただけるでしょうか。よろしくお願いします。

nums = {a: 1, b: 2, c: 3, d: 4, e: 5}

nums.each do |key, value|

  if value%2 == 0

    nums[:key] = value

  end

p nums
0591デフォルトの名無しさん2016/07/29(金) 15:11:49.29ID:DEZEXrtC
配列じゃなくてハッシュでした
0592デフォルトの名無しさん2016/07/29(金) 15:28:57.91ID:1qYsbBpR
先程Gtk::Inputを使った方で
windowの生成も行なうと
上手く期待の動作しなかった

GLib::IOChannelを使ってSTDINをオープンしてadd_watchをそれに使うと
期待の動作になりました
ありがとう
まだGUIの方は作れてないけど作れそうな感じ
0593デフォルトの名無しさん2016/07/29(金) 15:35:49.37ID:flV7hOuN
>>590
これだと偶数の要素だった場合、その要素を再代入してることになる
新しく別の配列に代入するとかならその書き方で問題ないと思うよ
ちなみに nums.select! { |k, v| v % 2 == 0 } が一番良さそう
0594デフォルトの名無しさん2016/07/29(金) 16:15:45.30ID:WGKZmyFx
もっと別な書き方も紹介して混乱させよう
nums.each_with_object({}){|(k,v),o| o[k] = v if v.even?}
0595デフォルトの名無しさん2016/07/29(金) 16:55:05.51ID:Ogz/SEhr
特に面白いものは書けず
nums.reject{|_,v|v.odd?}
nums.grep(proc{|_,v|v&1==0}).to_h
nums.each{|k,v|v.odd?&&nums.delete(k)}
0596デフォルトの名無しさん2016/07/29(金) 17:11:04.04ID:1UayH1GQ
>>595の1つ目が今回に限っては一番妥当
「numsからodd?なものを取り除く」と読み下そう
思いつかなかった>>593-594もぜひ覚えて帰ってね!
0597デフォルトの名無しさん2016/07/29(金) 19:32:20.85ID:jkc14IDK
nums.each do |key, value|
  if value%2 == 0
    nums[:key] = value
  end

まずこれはeach doに対してendが無いからエラーになる
そして:keyはkeyではなく:keyというSymbolなのでこれも間違い
nums = {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :key=>1}
nums[:b] = 2
p nums #=> {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :key=>1}
飽くまで:bに対して2を再び関連付けているだけなので間違い
どうしても上のような書き方がしたいなら

h = Hash.new
nums.each do |key, value|
  if value%2 == 0
    h[key] = value
  end
end

p h #=> {:b=>2, :d=>4} 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0598デフォルトの名無しさん2016/07/29(金) 20:01:51.49ID:mtfgcrou
>>597
やはりあなたはリンクしすぎです
ばいばいおさるさん
0599デフォルトの名無しさん2016/07/29(金) 23:54:22.01ID:AO+a9SAV
某テキスト(?)のメソッド Enumerable#select! を使うなら、
>>593 と >>595 の先頭を参考にして;

 nums.select! { |_, val| val.even? }

 https://ideone.com/Z84zqk


もしも同メソッドを使用せずに自前で各要素を列挙するなら:

 nums.each do |key, val|
   nums.delete key unless val.even?
 end

 https://ideone.com/UqpHHq


なお >>597 のように、元の変数 nums の値を(破壊的代入)で更新せず、
結果としての値を求めることを優先するというお題の改変が許されるなら:

 nums.select { |_, val| val.even? }

 https://ideone.com/JlEy6w

このコードを推奨する
0600デフォルトの名無しさん2016/07/30(土) 12:15:20.35ID:Fe6CTZY3
みなさんありがとうございます。細かい説明が助かります。自分は本当に基本的なことからわかっていなくてどこがわからないのかわからない、という
ていたらくでして。たぶん、いやきっと、593さんのようにメソッドをそれぞれ覚えていけばいいのでしょうが、もう結構記憶容量がパンパンで、とりあえず
知っているメソッドで何とかしようと思いました。しかし、みなさんすごいですね。?皆さん全員プロのプログラマなのですか?

もうちょっと勉強してみたいと思います。ありがとうございました。説明がわかりやすかったです。
0601デフォルトの名無しさん2016/07/30(土) 12:49:12.22ID:UN9LAiBT
よく使うメソッドなんて大した数ないから覚えるかその都度マニュアル読めばいいんじゃね
http://docs.ruby-lang.org/ja/2.3.0/class/Hash.html
まあメソッド覚える前に代入とか制御構造とかもっと基礎的なことを最低限理解してからにしろよとは思うが
0602デフォルトの名無しさん2016/08/02(火) 10:24:25.49ID:7rZajpxG
エクセルの列の文字列(AとかZZZとか)が何番目の列なのか計算するにはどうしたら良いでしょうか?
0603デフォルトの名無しさん2016/08/02(火) 10:34:33.19ID:R1uEEgNe
もっとうまい方法があるかもしれんが
# n番目の列
(n+2+624*26**log(25*n/26+1,26).to_i/25).to_s(26).tr('0-9a-p','A-Z')[1..-1]
# 列sの数
s.tr('A-Z','0-9a-p').to_i(26)+(26**s.length-26)/25
0604デフォルトの名無しさん2016/08/02(火) 19:33:06.09ID:G8b1Dkiv
Rubyに最近興味を持った者です
DXRubyを使用しており、Rubyのバージョンは2.0 32bit
OSはwindows7 64bitです

カレントディレクトリにあるフォルダを開き、中にあるtxt形式のファイルを取得し
その一行目に書かれていたことにたいしてifを使うにはどうすればいいでしょうか?
0605デフォルトの名無しさん2016/08/02(火) 19:49:44.99ID:GrXRtLCP
>>604
いっぺんに全部やろうとするからわからなくなる
↓のように問題を分割して、ひとつずつ調べていけばいいよ

・カレントディレクトリにあるフォルダを開き
・中にあるtxt形式のファイルを取得し
・その一行目に書かれていたこと
・にたいしてifを使う
0606デフォルトの名無しさん2016/08/02(火) 20:07:22.42ID:R1uEEgNe
str = open("フォルダ名/ファイル名.txt").readline # txtファイルの一行目

if (strの条件式)
 # やりたいこと
end
0607デフォルトの名無しさん2016/08/02(火) 21:15:40.05ID:G8b1Dkiv
>>606
では、二行目を単体で読み込む方法はどうするんでしょうか?

あと一行目と二行目を両方読み込む場合はどうするんでしょうか?
0608デフォルトの名無しさん2016/08/02(火) 21:20:03.60ID:bMxB9+Te
>>604
カレントディレクトリ中にある全てのtxt形式のファイルを開く場合
Dir.glob('./*.txt') do |fn|
File.open(fn, 'r:utf-8') do |f|
line = f.readline
if /条件/ =~ line
end
end
end
0609デフォルトの名無しさん2016/08/02(火) 22:04:55.90ID:R1uEEgNe
>>607
foo = open("フォルダ名/ファイル名.txt").
line1 = foo.readline # 一行目
line2 = foo.readline # 二行目

大した量じゃないんだからマニュアルを読もう
http://docs.ruby-lang.org/ja/2.3.0/class/IO.html
0610デフォルトの名無しさん2016/08/03(水) 00:10:59.84ID:qya5GR80
vipでプログラムの話題で盛り上がってるぞ
http://vipper.2ch.net/test/read.cgi/news4vip/1470062380/

これはrubyのステマするチャンス
0611デフォルトの名無しさん2016/08/03(水) 00:39:14.55ID:3mARGs2B
>>602
効率は良くないけど、EXCELで使う程度の数かつ、何十万回も計算を繰り返したりしないなら。

s=“A”; 0.upto(n){s.succ!}; p s

s=“ZZ”; p (“A”..s).to_s.size
0612デフォルトの名無しさん2016/08/03(水) 02:00:46.62ID:W0lh95XI
>>602
inject厨が書いてみた:
 https://ideone.com/PSRQnw
0613デフォルトの名無しさん2016/08/03(水) 13:48:51.38ID:zdWIlhYU
>>602
rubyだと“Z”.nextで”AA”になるから、”A”をスタートとして”ZZZ”までnextをループさせた回数=列の番号になるよ
0614デフォルトの名無しさん2016/08/03(水) 15:07:33.08ID:mbys/AN5
A -> 1
Z -> 26
の 26進数なんだよ
だから
ZZZ -> 26*26*25 + 26*25 + 25 + 1
と瞬時に判る
0615デフォルトの名無しさん2016/08/03(水) 15:10:29.88ID:mbys/AN5
ごめん間違った
桁の0に相当するものがないから
実際の値は違う
もうちょっと工夫が要るけど
考え方は 26進数
0616デフォルトの名無しさん2016/08/03(水) 15:17:25.06ID:B5cRJMaS
sを列の文字列とする
A-Zを A=0, Z=25 の26進数とみなして
s + B..B(Bがsの桁数個) - B が列の番号
だから>>603の下の式のようになる

これの逆変換が求めるものだけど素直にやると桁の左にあるAがなくなってしまうので
一旦 BA..A(Aはsの桁数個)を足しておいて最後にBを削れば良い
それが>>603の上の式
0617デフォルトの名無しさん2016/08/03(水) 15:26:35.51ID:mbys/AN5
logを使うのは筋が悪い希ガス
0618デフォルトの名無しさん2016/08/03(水) 15:31:21.63ID:B5cRJMaS
じゃあFixnum#bit_lengthでも使おう
0619デフォルトの名無しさん2016/08/03(水) 15:43:49.69ID:B5cRJMaS
つまりこういうことね
(n + 2 + 24*26**((25*n + 26).bit_length/4.7).to_i/25).to_s(26).tr('0-9a-p', 'A-Z')[1..-1]
0620デフォルトの名無しさん2016/08/03(水) 15:51:40.29ID:kO+977FM
xl = WIN32OLE.new('Excel.Application')
bk = xl.Workbooks.Add
ws = bk.Worksheets(1)
ws.Cells(1,1).Formula='=column($ZZZ$1)'
puts ws.Cells(1,1).Value
bk.Close
xl.Quit
0621デフォルトの名無しさん2016/08/03(水) 16:03:32.72ID:W0lh95XI
>>612を一般的な手続き型プログラミングへ書き直してみた:
 https://ideone.com/gO9N9x

これならPerlやPythonのような普通の手続き型言語を知っていれば
容易く読めるし、普通のプログラマが引き継いでも問題無く
保守できるのではないかと思われ
0622デフォルトの名無しさん2016/08/03(水) 16:46:12.54ID:/NIG+3Tl
n.to_s(26).tr('0-9a-p','@A-Y').sub(/(.)@/){$1.tr('A-Z','@-Y')+'Z'}.sub('@','')

もうちょい短くできそうでできない
0623デフォルトの名無しさん2016/08/03(水) 16:53:46.46ID:/NIG+3Tl
n.to_s(26).tr('0-9a-p','@A-Y').sub(/(.)@/){$1.tr('A-Z','@-Y')+'Z'}.sub('@','')

もうちょい短くできそうでできない
0624デフォルトの名無しさん2016/08/03(水) 16:56:15.69ID:/NIG+3Tl
連投すまんこ
あと'@A-Y'じゃなくて'@-Y'やな。動くけど
0625デフォルトの名無しさん2016/08/03(水) 17:02:40.83ID:B5cRJMaS
まだ行けるのかな
n.to_s(26).tr('0-9a-p',r='@-Y').sub(/(.)@/){$1.tr('A-Z',r)+'Z'}.delete('@') # 75 B
(n+2+24*26**Math.log(25*n+26,26).to_i/25).to_s(26).tr('0-9a-p','A-Z')[1..-1] # 77 B
0626デフォルトの名無しさん2016/08/03(水) 17:17:54.18ID:/NIG+3Tl
ごめんn=26*26とかの時におかしくなるわ
0627デフォルトの名無しさん2016/08/03(水) 18:04:32.66ID:/NIG+3Tl
p n.to_s(26).tr('0-9a-p',r='@-Y').tap{|s|s.chars{s.sub!(/(.)@/){$1.tr('A-Z',r)+'Z'}}}.delete('@')
#97B

rubyらしさを捨ててtap使わなければ4B減る
0628デフォルトの名無しさん2016/08/03(水) 18:06:33.96ID:mbys/AN5
logなんて使うから可笑しくなる
0629デフォルトの名無しさん2016/08/03(水) 18:09:55.37ID:B5cRJMaS
>>628
Math.logを使うのはいつでも正しいよ
>>626が言ってるのは>>623のこと
bit_lengthを使う方も10**20000くらいまでは正しい
0630デフォルトの名無しさん2016/08/03(水) 18:17:06.18ID:B5cRJMaS
「いつでも」は言いすぎだった
logも9.603431447*10**18989までは正しく動作するよ
0631デフォルトの名無しさん2016/08/03(水) 18:25:45.78ID:mbys/AN5
いつでも正しいコードを書けよ
0632デフォルトの名無しさん2016/08/03(水) 18:28:03.24ID:l8cxGlGj
諄い
0633デフォルトの名無しさん2016/08/03(水) 18:34:18.83ID:mbys/AN5
ついでに言ってやろう
余計な制限のあるコードにはコメントが必須

#logも9.603431447*10**18989までは正しい
+46Bだな
0634デフォルトの名無しさん2016/08/03(水) 18:39:46.41ID:B5cRJMaS
>>633
なんかキレてんの? システムに依存しない、アホみたいにでかい数値に対してすらいつでも正しいコードなんて存在するわけないだろ
0635デフォルトの名無しさん2016/08/03(水) 19:05:26.45ID:mbys/AN5
いや
切れてないよ
0636デフォルトの名無しさん2016/08/03(水) 19:14:20.38ID:B5cRJMaS
そうか、なんかすまんかった
いい加減黙ります ゴルフスレとかあったら面白いかもね
0637デフォルトの名無しさん2016/08/03(水) 23:34:22.20ID:W0lh95XI
String#ord を使うと更に短くなった(ついでにエラー検査も削除):
・関数型 :(旧) >>612 --> (新) https://ideone.com/OQLdlR
・手続き型:(旧) >>621 --> (新) https://ideone.com/Ja6tP9

String#succ の存在も初めて知ったし、勉強になったわ
0638デフォルトの名無しさん2016/08/04(木) 01:32:56.67ID:feZwYdLF
p s.chars.reverse.map.with_index{|c,i|(c.tr('A-Z','0-9a-p').to_i(26)+1)*(26**i)}.inject(:+)

Enumerator#with_indexはもっと流行っていいと思うんだ
使ってもそんなに短くはならないんだけどさ
0639sage2016/08/04(木) 01:37:51.37ID:2HyRwUYq
def cel_No( str )
str.strip.upcase.unpack('C*').inject(0){|result, item| result * 26 + item - 0100 }
end

def cel_str( n )
str = ""
while n > 0
n, r = (n - 1).divmod( 26 )
str << (r + 0101).chr
end
str
end
0640デフォルトの名無しさん2016/08/04(木) 14:01:54.35ID:2HyRwUYq
>>639
最後は
str.reverse
でした。
0641デフォルトの名無しさん2016/08/04(木) 23:00:36.83ID:c9zwl1qO
SQLの使用に関して質問です。
どのようにすれば、回避できるでしょうか?
■症状:インサートした日本語文字が文字化けする。


title =
0642デフォルトの名無しさん2016/08/04(木) 23:04:28.59ID:c9zwl1qO
うまく書き込めなかったので、もう一度

SQLの使用に関して質問です。
どのようにすれば、回避できるでしょうか?
■症状:インサートした日本語文字が文字化けする。
title="あいうえお123"
DB = Mysql.new('host','name','pass','test01')
sql = "UPDATE `test01`.`table01` SET `title` = '#{title}'WHERE `table01`.`id` = '4';"
DB.query(sql)
0643デフォルトの名無しさん2016/08/04(木) 23:36:28.77ID:QKnNcils
とりあえずSQLインジェクション丸出しの書き方はやめよう
0644デフォルトの名無しさん2016/08/05(金) 06:51:27.16ID:tltzsolz
[nil, *'A'..'Z', *'AA'..'ZZ', *'AAA'..'ZZZ'].find_index('ZZZ')
ひどいけどこれで十分
0645デフォルトの名無しさん2016/08/05(金) 07:12:44.43ID:x8TUq60L
Ruby, DBなど、すべてのアプリの文字コードを、UTF-8 に統一すれば?
0646デフォルトの名無しさん2016/08/05(金) 13:38:20.94ID:LJe/qM3f
その辺はrubyよりpythonの方が堅牢
perlは論外
0647デフォルトの名無しさん2016/08/05(金) 15:48:28.22ID:UhWsfPtN
横槍失礼します
>>604 です
唐突に質問なのですが
そもそもDXRubyでユーザーに文字を入力させ、それを扱うにはどうすれば良いのでしょうか
0648デフォルトの名無しさん2016/08/05(金) 15:49:58.62ID:UhWsfPtN
>>647
連投すみません
RPGの名前入力のようなものです

あと、一旦画面を消すのはどのようにするのでしょうか?
タイトルから本編へとかそういう感じです

結構しらべたのですが.....
0649デフォルトの名無しさん2016/08/05(金) 16:21:49.83ID:teNswV+z
DirectXプログラミングかWindowsプログラミングの経験はある?
このへんの基礎知識がないとAPI探せないし何渡していいのかもわからないよ
0650デフォルトの名無しさん2016/08/05(金) 18:50:19.50ID:UhWsfPtN
>>649
正直ありません
Rubyが一番最初にやりました
VBSやBASICはやったことがありますが.....

DXRubyを入れて調べながらやっているところです
0651デフォルトの名無しさん2016/08/06(土) 01:12:59.09ID:8Rl0Ybxy
DXRubyは知らないけど、そういう基本的な関数は、

チュートリアルでもやれば、わかるのでは?
0652デフォルトの名無しさん2016/08/06(土) 04:20:54.79ID:w5zQ+Fii
DXRubyのドキュメント読めばいんじゃねーの
0653デフォルトの名無しさん2016/08/06(土) 05:53:35.02ID:2mFu6MHm
>>644
https://support.office.com/ja-jp/article/Excel-の仕様と制限-ca36e2dc-1f09-4620-b726-67c00b05040f
0654デフォルトの名無しさん2016/08/06(土) 07:35:29.07ID:aQkr0mnl
>>651
チュートリアルには、文字の描画、キーの判定は書いてありますが
全てのキー入力の監視はどうやってやるのかなと.....
■ このスレッドは過去ログ倉庫に格納されています