Ruby 初心者スレッド Part 65

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0f80-JI52)
垢版 |
2018/12/22(土) 04:43:34.03ID:84E3pYZa0
プログラミング言語 Rubyについての、初心者向けスレです。質問・要望・雑談などをどうぞ

質問するときは、OSやRubyのバージョン、エラーメッセージを書いて下さい。
Ruby on Rails については、WEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 64
https://mevius.5ch.net/test/read.cgi/tech/1535797516/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/

Ruby コミュニティ公式
https://www.ruby-lang.org/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/09/30(月) 20:32:13.86ID:sHSicWZI0
>>722
$ csvtool namedcol aaa,ccc data.csv
aaa,ccc
01,03
11,13
21,23
724722 (ワッチョイ 5f2c-+BGV)
垢版 |
2019/10/01(火) 22:53:28.60ID:9HRGRt020
CSV::Table#by_col! で、列単位で扱える。
そこで、delete(列名) で、列ごと削除できるけど、
事前に、列名が必要

任意の列数のCSV ファイルを扱う場合に、
事前に、列名がわからない場合に、どうすれば良いのか?

一旦、ヘッダー行を取得して、すべての列名を取得してから、処理すれば良いのか?

>>723
csvtool というコマンドがあるのですね
2019/10/02(水) 23:26:12.27ID:14D+F8tw0
>>724
csv = CSV.table ARGV[0]
puts csv.by_col.delete_if{|name, val| ![:AAA, :BBB].include? name}
726デフォルトの名無しさん (ワッチョイ eaa5-P2X/)
垢版 |
2019/10/03(木) 12:16:59.30ID:PnP8AkUw0
Rubyに決めた!
2019/10/03(木) 15:24:11.67ID:qxa8VeaI0
できた!

by_col! でも、元のファイルを更新しない

それと、CSV.tableは、CSV.readに、幾つかのオプションを設定したものだから、
table = CSV.read( ARGV[ 0 ], headers:true, converters: :numeric, header_converters: :symbol )

コンバーターで、変数の型が自動変換されてしまう

require 'csv'

column_names =[ "AAA", "BBB" ]

# 引数は、入力ファイル名。ヘッダー行あり
table = CSV.read( ARGV[ 0 ], headers: true )

# 列モードにしてから、特定の列名以外を、削除する
puts table.by_col!.delete_if {
|column_name, values| !column_names.include? column_name }
728デフォルトの名無しさん (ワッチョイ ea2c-2rUB)
垢版 |
2019/10/09(水) 16:51:10.78ID:z4DviLBe0
Windows10, WSL, Ubuntu 16.04, Ruby 2.3 で、
pty, expect モジュールを使って、端末に自動入力しようとしたが、エラーになる!

この環境では、使えないのかな?

warning: Insecure world writable dir /mnt/c in PATH, mode 040777

/usr/lib/ruby/2.3.0/expect.rb:47:in `eof?':
Input/output error @ io_fillbuf - fd:7 /dev/pts/0 (Errno::EIO)
729デフォルトの名無しさん (ワイーワ2 FF92-PqvS)
垢版 |
2019/10/09(水) 16:59:03.96ID:dDDCJBWOF
君の pwd の結果を曝すか
runas /user:administrator 汁
2019/10/09(水) 18:12:59.85ID:z4DviLBe0
Windows10, WSL, Ubuntu 16.04 の端末上で、
~/mytest/ruby/test に、スクリプトファイルを置いて、実行してる

ディレクトリ・ファイルのパーミッションは、rwxrwxrwx

確かに、/dev/pts/0 は存在しない(Errno::EIO)。
/dev/pts/ptmx しかない

WSL には、その機能が無いのかも
2019/10/09(水) 21:36:17.99ID:K/mDLqh/0
tty コマンド実行したらどうなる?
732デフォルトの名無しさん (ワイーワ2 FFdf-1wBF)
垢版 |
2019/10/10(木) 09:40:50.22ID:yMym0WfOF
ちゃんと読め
Insecure world writable dir /mnt/c in PATH
2019/10/10(木) 09:44:39.40ID:LUJumBxEM
こいつ他のスレでRubyのネガキャンしてまわってるキチガイだろ
相手をするな
2019/10/10(木) 15:46:12.72ID:Nxyr4aACa
Rubyだけじゃないでしょ
この板に取り付いて自演してる糖質君だよ
そういう奴がいるという認識で無視しておけば無害
2019/10/10(木) 18:57:06.29ID:dv1+zkCU0
Windows10, WSL, Ubuntu 16.04 の端末上で、
tty と入力すると、/dev/tty1 と表示される

Ruby ではなく、シェルスクリプトで、expect をしようか
2019/10/10(木) 19:25:48.03ID:dv1+zkCU0
pty は仮想端末だから、ssh 接続をしないと使えないのかも

単に、端末に自動入力したいだけだから、
Ruby ではなく、シェルスクリプトで、expect をやってみる

apt では、sudo のパスワードを聞かれるから、それを自動入力したい
2019/10/10(木) 19:59:39.73ID:dv1+zkCU0
expect のサンプルが、pty を使ったものばかりだったから、ptyを使わなければ良いのかも?

expectだけでも使えるのか?
誰か、サンプルを書いて!
2019/10/11(金) 00:40:11.94ID:SXeDtfTX0
Windows10, WSL, Ubuntu 16.04 の端末上で、

net/telnet モジュールを使って、Telnet で接続しようとしたが、エラーになった!

/usr/lib/ruby/vendor_ruby/net/telnet.rb:350:in `initialize':
Connection refused - connect(2) for "localhost" port 23 (Errno::ECONNREFUSED)

やっぱり、WSL は特殊
739デフォルトの名無しさん (ワイーワ2 FFdf-1wBF)
垢版 |
2019/10/11(金) 10:13:43.38ID:hkXt1GtmF
Windows で Ruby 使ってもロクなことにならない
(WSL でもね)
2019/10/11(金) 10:41:17.51ID:AqBy2q4Y0
ここの淀んだコミュニティはまだWindows目の敵にしてるのか
そんなんだからPythonにぶっちぎられちゃってるのに
741デフォルトの名無しさん (ワイーワ2 FFdf-1wBF)
垢版 |
2019/10/11(金) 10:44:47.24ID:hkXt1GtmF
別に目の仇にしてる訳じゃないやろ
「rubyはなんでwindowsで使うと糞なの」
「じゃあおまいが対応汁」
「forkωωω」
「挫折」
の流れを繰り返してるだけ
屍累々
2019/10/11(金) 10:59:31.96ID:PhVW6Uck0
>>738
お前がわかってないだけだろ

そのエラーはlocalhostでtelnetサーバーを起動してない、
もしくは接続が拒否されたって意味だ。

今どき暗号化されてないtelnetサーバーなんて使わないから
前者だろうな。
2019/10/11(金) 11:00:41.99ID:PhVW6Uck0
ちなみにWindows 10にはtelnetサーバーは付属してない。
2019/10/11(金) 11:01:10.81ID:PhVW6Uck0
>>741
的はずれなレスをするな
2019/10/11(金) 22:27:44.45ID:SXeDtfTX0
Windows10, WSL, Ubuntu 16.04 の端末上で、
tty と入力すると、/dev/tty1 と表示される

/dev/tty, /dev/tty0, /dev/tty1 などもある。
他にも、S が付いた、/dev/ttyS0 〜 /dev/ttyS191 もある

/dev/stdin, /dev/stdout, /dev/stderr もある

expect で、このあたりの、デバイスファイルを使えるかもしれない

>>738
Telnet の接続エラーは、port 23 が開いていないのかも
746デフォルトの名無しさん (ワイーワ2 FFdf-1wBF)
垢版 |
2019/10/14(月) 11:56:07.71ID:Cg/ykvDAF

https://www.atmarkit.co.jp/flinux/rensai/linuxtips/094virtualcon.html
https://kouritool.com/what-linux/ctrlaltf1仮想コンソールを起動を押してしまったら/
747デフォルトの名無しさん (ワイーワ2 FFdf-1wBF)
垢版 |
2019/10/14(月) 11:56:43.70ID:Cg/ykvDAF

https://qiita.com/Kernel_OGSun/items/bdccbe8bc4092f33b43e
http://yudoufu.hatenablog.jp/entry/2014/02/06/001440
748デフォルトの名無しさん (ワッチョイ 7f73-pTuN)
垢版 |
2019/10/20(日) 00:18:23.73ID:tI/yRj1E0
Rubyの課題が全然わからないので教えてほしいです。
1、0、−1、0が繰り返し表示されるようにしたいです。
when使ってできないでしょうか。
OS→windows10
Rubyバージョン→1.8.4
一応作ったのですが、nilが永遠にでます。
2019/10/20(日) 02:00:28.55ID:pHh2P92w0
作ったの貼るっしょ
2019/10/20(日) 08:32:27.73ID:ADDbXmaX0
Ruby 1.8.4 ?
もう、そんなに古いのは無理!

Windows 用のRubyInstaller でも、Ruby2.5.7。
Linux では、Ruby2.6.5 が最新だが、Windows では、1つ前のバージョンを使うこと!

Windows では、irb も日本語でバグるから、VSCode を使え!
Code Runner という拡張機能を入れると、
右クリックメニューから、選択したコードを実行できる
2019/10/20(日) 08:40:43.47ID:akKR2ina0
その問題を「1、0、−1、0を産む機械」と言い換えればすぐにyieldを使えばいいと分かる
whenなの?
2019/10/20(日) 09:10:18.66ID:X1mKFDBe0
0.step do |i|
p case i % 4
when 0 then 1
when 1 then 0
when 2 then -1
when 3 then 0
end
end

a = [1,0,-1,0]
0.step{|i| p a[i%4] }

>>750
> Linux では、Ruby2.6.5 が最新だが、Windows では、1つ前のバージョンを使うこと!
私の観測範囲が狭いのか2.6.5を使わない理由が見つからないのだが、なにかバグありました?
2019/10/20(日) 09:57:11.30ID:V17Fc59sr
>>748
(1..).each{|i| p (-1)**((i & 2) >> 1) * (i & 1)}
2019/10/20(日) 10:13:18.00ID:ADDbXmaX0
>>752
Windows 用のRuby は、いつも1つ前のバージョンを使う!
RubyInstaller のサイトにも、最新版を使わないようにと、いつも書いてある

Windowsでは、MSYS2 でコンパイルするモジュールなどが、
最新版に対応していないので、1年ぐらい待つ必要がある
2019/10/20(日) 10:18:26.35ID:lW4NmDBF0
>>748
loop{ puts 1, 0, -1, 0 }
2019/10/20(日) 11:35:59.48ID:X1mKFDBe0
>>754
RUBYINSTALLER-HEAD(https://github.com/oneclick/rubyinstaller2/releases/tag/rubyinstaller-head)については書いてありますが
latestについては記述見つかりませんでしたが、どこに書いてありますか?

> MSYS2 でコンパイルするモジュールなどが、
コンパイル済みのfat-gemが問題起こしてる印象があり、なくならねぇかな・・・と思ってますね
2019/10/20(日) 12:06:18.48ID:ADDbXmaX0
https://rubyinstaller.org/

以前は、このトップページか、Download のページに書いてあったけど、文章が変わったみたい

まあでも、このスレでも、Windows では、最新バージョンは使うなという書き込みがあったから、
たぶん、1つ前のバージョンを使わないと、依存関係が解決できないのだろう

とにかく、Mac を使っている人は、Windowsの依存関係が地獄だから、皆Macへ移った
2019/10/20(日) 12:16:45.81ID:MDf6mYD+0
[1,0,-1,0].cycle {|x| puts x} #無限
[1,0,-1,0].cycle(3) {|x| puts x} #サイクル数指定
[1,0,-1,0].cycle.take(10).each {|x| puts x} #要素数指定

cycle再発明したいならEnumeratorを返す方法を学ぶ
759デフォルトの名無しさん (ワイーワ2 FF6a-uHRg)
垢版 |
2019/10/20(日) 12:46:50.25ID:9lZC9vgyF
ひょっとすると Ruby は糞なのかも知れない

10.times{|n|puts Math::cos(n*Math::PI/2) <=> 0}
760デフォルトの名無しさん (ワイーワ2 FF6a-uHRg)
垢版 |
2019/10/20(日) 12:48:22.43ID:9lZC9vgyF
10.times{|n|puts Math.sign(Math::cos(n*Math::PI/2))}
10.times{|n|puts Numeric.sign(Math::cos(n*Math::PI/2))}
10.times{|n|puts Number.sign(Math::cos(n*Math::PI/2))}
761デフォルトの名無しさん (ワイーワ2 FF6a-uHRg)
垢版 |
2019/10/20(日) 12:56:08.24ID:9lZC9vgyF
糞は漏れだった orz

10.times{|n|puts Math::cos(n*Math::PI/2).to_i}
2019/10/21(月) 12:00:03.97ID:ZDMJHUdnr
>>758が一番スマートだな
2019/10/21(月) 13:13:03.03ID:a2dL9b0A0
>>760みたいに下手に計算するより早いしね!
2019/10/21(月) 13:27:57.28ID:ZDMJHUdnr
いやそもそも>>759-761は間違ってる
2019/10/21(月) 13:42:33.89ID:a2dL9b0A0
>>764
そういうことじゃなくて発想の問題よ。
物事を単純に考えることができない。
2019/10/21(月) 14:06:09.86ID:ZDMJHUdnr
流石に本気で三角関数使って実装しようなんて思ってないだろうしそこは別にネタで言ってんだと思うけど
ネタとしても面白くはないけど
2019/10/21(月) 16:50:50.88ID:RCZWOoQNa
そもそも>>748はhello worldレベルの初心者だろうに、回答者が求めてるものを無視して俺の解き方見てくれ!って奴ばかりなのは問題だと思う
2019/10/21(月) 17:07:36.09ID:5+ah6i6TF
禁止事項
トリを使おうとしている質問者に対して、そんなトリはやめろとかという、斜め上からのアドバイス
質問者そっちのけでの昔語り(昔はもっと苦労したもんだ、今の若い者は…)
知らないのに、使ったことないのに、知ったかぶりでの書き込み
ググれという誰でも言えそうな忠告
俺は知ってるけど言わない等といった、実社会での扱われ方からの僻みから来る
意地悪な言辞

回答はあくまでボランティアなので、質問者は、回答がつかなかったり、
期待に沿った回答が得られなかったからといって切れたりしないように。
また、わざとそういう困った質問者を演じて釣りに来る人もいるかもしれないので、
回答者も、むかついたからといって、いちいち切れて反応せずスルーしよう。

そして質問者はもう出て来ない
769デフォルトの名無しさん (ワッチョイ 37e7-6fT3)
垢版 |
2019/10/21(月) 17:50:42.35ID:fwYGRAlp0
他人のレスに対して上から目線で批判するしか能がない評論家のカキコこそ、
無駄なスレ消費ではないかと思われ


>>764
では、貴殿の正解をどうぞ!

>>766
では、あなたの考える>>748が求めていた回答(あなたの解き方)をどうぞ!!
2019/10/21(月) 19:35:56.70ID:fwYGRAlp0
訂正
X:
 >>766
 では、あなたの考える>>748が求めていた回答(あなたの解き方)をどうぞ!!
O:
 >>767
 では、あなたの考える>>748が求めていた回答(あなたの解き方)をどうぞ!!
2019/10/22(火) 11:21:00.25ID:wZUXcjF6r
いやどうみてもnがちょっとでかくなったら正しくなくなることくらい自明だろ
同じ発想でやりたいなら複素平面とかπ/2の回転行列とか使って計算すればいいだけ
ただし奇を衒った回答としては斬新さにかけて面白くないと言っている
>>758が一番スマート(かつ自分でもそうする)って言ってるんだがなんなんやこいつ
772デフォルトの名無しさん (ワイーワ2 FF6a-uHRg)
垢版 |
2019/10/22(火) 11:24:07.59ID:fxbuxtP/F
>nがちょっとでかくなったら正しくなくなる

2π で mod すればいい
773デフォルトの名無しさん (ワッチョイ 7f73-pTuN)
垢版 |
2019/10/22(火) 11:42:16.77ID:Bl/xGts70
質問したものです。皆さん様々な意見ありがとうございます。考えてくださってとても感謝しています。
皆さんのを見ながらなんとかできました!
ありがとうございました。
774デフォルトの名無しさん (ワッチョイ 6373-sEIE)
垢版 |
2019/10/26(土) 11:19:55.92ID:VCWPcpX80
def break_test
return break
end

i = 10;
while i > 0
next_test
}
放置すれば無限ループになるのをbreak_testでループを
抜けたいのですが、関数?からnext や breakなどを
返すようにできないのでしょうか。
775デフォルトの名無しさん (ワッチョイ 6373-sEIE)
垢版 |
2019/10/26(土) 11:21:02.82ID:VCWPcpX80
ごめんなさい、
i = 10;
while i > 0
break_test
}
でした。
2019/10/26(土) 12:47:43.93ID:751XFDvk0
そういうキーワードそのものは、返せないだろ

戻り値は、0, 1 などの整数とか、
フラグとして、true, false の真偽値とか、

:next, :break みたいなシンボルとか、文字列とか
2019/10/26(土) 13:32:18.57ID:aCoOcfZt0
キーワードデリゲーションをすればいいんだろ
かんたんじゃん
2019/10/26(土) 13:42:24.92ID:ZMkO6rZZ0
>>774
それをやりたいと思った理由は?

仮にできるとしてもnextやbreakが
別のメソッドに埋まってたら可読性が低くて嫌だと思うんだけど
2019/10/26(土) 19:48:47.03ID:zP6esb2p0
>>774
斬新な発想だな。w
Rubyに限らず一般的に、制御を移すしくみは、関数(メソッド)の範囲を越えることはできない。

ただし、「例外」ならそれ以降をすっとばすことができるので、break相当ならできるかも?
# 勧めないけど。
2019/10/26(土) 19:56:33.83ID:zP6esb2p0
>>778
理由はいろいろやろ。
制御の移しかたを別の関数に封じて共用できたらなあ、という気持ちがわからんのか。

可読性なんか、命名でも運用でもどうとでもなる。
781デフォルトの名無しさん (ワッチョイ 6373-sEIE)
垢版 |
2019/10/26(土) 22:09:58.48ID:VCWPcpX80
>>778
実際はwhileじゃなくて
xxxxx.each do |key|
同じようなことする関数(引数)
  同じようなことする関数(引数)
  同じようなことする関数(引数)
end
の中で関数の中身がある条件だったら
nextで残りをやらずにeach.doの最初からやりたいんですけど
引数の値が違うだけなのに
例えば関数にTrueを返したら next しろとか条件をいちいち
付けるのもめんどくさいと思い、質問してみました。
782デフォルトの名無しさん (ワッチョイ 6373-sEIE)
垢版 |
2019/10/26(土) 22:13:03.44ID:VCWPcpX80
xxxxx.each do |key|
if 同じようなことする関数(引数) then next
  if 同じようなことする関数(引数) then next
  if 同じようなことする関数(引数) then next
end

Rubyにあまり詳しくないのでよくわからないのですが
こんな感じなのでしょうか?
2019/10/26(土) 23:35:07.98ID:BPSgYag60
慣習的に返り値を成否にすることが多いから論理を逆にして

xxxxx.each do |key|
同じようなことする関数(引数) &&
同じようなことする関数(引数) &&
同じようなことする関数(引数)
end

xxxxx.each do |key|
next unless 同じようなことする関数(引数)
next unless 同じようなことする関数(引数)
同じようなことする関数(引数)
end
2019/10/27(日) 00:24:39.23ID:wfElRmia0
>>781
なるほど

自分ならオプショナルチェーン的なのを使うか
「同じようなことする関数」をメソッドオブジェクトかProcにして配列に入れて
true返したらnextしろって書くのを1箇所にする

https://ideone.com/I7hyOs
https://ideone.com/VQMgg2
2019/10/27(日) 05:02:59.99ID:hJUpCTqv0
jQuery.each( object, callback )

これは、jQueryの繰り返し処理用の関数。
配列/オブジェクトで使える

繰り返し処理中に、ループを抜けたい場合(一般的なループ処理で言うところのbreak)、
コールバック関数で、falseを返すことで実装できます。
それ以外の値を返した場合は、無視されます
2019/10/27(日) 05:08:22.73ID:+BT3KxOb0
独自の言語を開発した15歳が経済産業大臣賞を受賞
https://it.srad.jp/story/19/10/23/1625249/

まつもとさんクラスの才能?
2019/10/27(日) 10:29:27.71ID:EzDt4vDz0
ifのネストができないとかなので
qiitaの「オレオレ言語作ってみた」記事レベル
2019/10/27(日) 10:35:17.49ID:4XYnNnzNr
いや、さすがにそれよりは完成度高かったよ
2019/10/27(日) 10:40:08.22ID:Lik42TLZ0
あとgithubプロジェクトには、オブジェクトファイルとか
vimのスワップファイルとかも入っていて周辺知識もない

つまりはプログラミング全般の幅広い知識をつけて、
言語開発できるレベルになったと言うより
言語作ってみたくて、それ関連の知識をぐぐってコピペした程度
再帰を知ってるかも怪しいw
2019/10/27(日) 10:44:23.07ID:4XYnNnzNr
中学生相手に謎のマウントとって恥ずかしくないんかこのおっさん
791デフォルトの名無しさん (ワッチョイ 6f8c-cmPQ)
垢版 |
2019/10/27(日) 11:37:21.19ID:vygsvak+0
どこにも新人を虐め殺す人はいる。
2019/10/27(日) 11:58:18.66ID:hJUpCTqv0
養成読本シリーズのムック本が出た!

Software Design plusシリーズ
Ruby on Rails 6 エンジニア養成読本、2019/10/26

著者は、すがわらまさのり,前島真一
2019/10/27(日) 12:17:41.60ID:Cn2fohUL0
養成ギプスじゃねーのなこのシリーズ
2019/10/28(月) 23:21:57.76ID:FXEIy8w10
>>783
返事が遅くなりすみません。
なるほど、そんなにシンプルにできるのですね。
Rubyの問題ではなかったですね。
ありがとうございます。
2019/10/29(火) 06:00:13.39ID:wBa+308I0
>>784
条件を配列にいれて処理すると楽そうですね。
ありがとうございます。
2019/10/29(火) 06:25:03.68ID:wBa+308I0
>>785
Ruby on Rails入れてませんがjqueryが使えるのでしょうか。
797デフォルトの名無しさん (スップ Sd1f-PDRl)
垢版 |
2019/10/29(火) 23:05:22.63ID:wWZj5nZGd
github の ignoreとか適当だから、objとか普通にアップしてるな。
仕事ならまだしも、個人ねやつなんか、完全やバックアップもくてきだから、
あまりにデカイみだな .db とか除いて、全部あっふだわ。

個人のリポジドリも200とか超え始めると、一つ一つ丁寧に設定なんかしとれんわ。
githubやエディタ独自仕様に振り回される必要なし。
2019/10/30(水) 01:59:02.44ID:p2ffZ2o00
>>796
Rails を使っていない場合でも、

ERB, Selenium WebDriver, Nokogiri などで、
HTML を処理する場合には、Node.js, jQuery も使う
799デフォルトの名無しさん (エムゾネ FF1f-Tlcr)
垢版 |
2019/10/30(水) 13:12:15.78ID:Jt7N9BVBF
>>797 はパスワードをうpして慌てるタイプ

あるいは気付かず放置してるだけかも知らん
800デフォルトの名無しさん (ワッチョイ ca2c-0B+f)
垢版 |
2019/11/04(月) 16:33:35.55ID:Zu03xGz40
あるフォルダ内の子フォルダだけを取得するのに、こう書いているのですが、

PowerShell みたいに、ls -Directory
など、もっと簡単に書けないの?

target_dir = "C:/Users/Owner/Documents/*"

p dest_dirs = Dir.glob( target_dir ).select { |path| File.directory?( path ) }

return if dest_dirs.length == 0 # フォルダが存在しない
2019/11/04(月) 16:36:49.84ID:6GYoHHZPF
RubyはUNIXで使うものであり、シェルコマンドも積極的に使うのが前提
Rubyから普通にlsを呼べ基地外
2019/11/04(月) 19:06:35.57ID:KBcuTkU10
単発で使う分には十分簡単に書けてると思うが
繰り返し書く必要があるなら自分でメソッド抽出すればよくね?
2019/11/04(月) 19:37:03.85ID:Zu03xGz40
Dir.glob( "パス", :directory )

みたいに、ブロックじゃなくて、
オプション・シンボルなどで、簡単に指定できれば
2019/11/04(月) 20:32:46.29ID:15pQYryDa
>>800
むしろPowerShellが凄い
2019/11/04(月) 22:33:04.21ID:KBcuTkU10
Dir.glob('*/')
2019/11/05(火) 21:08:09.25ID:z9XdE4jra
rubyを使い出して2週間なのですが困っています。

今は汎用機のログの一括処理に使っているのですが、
半角カナや漢字が文字化けして読み込まれます。

ログファイルはwindowsにsjisで保存されていて、
これをsjis指定で読み込んでも\x33等と化けます。
どうすれば半角カナが化けないように読めるのでしょうか。
2019/11/05(火) 22:01:22.14ID:+vsp0I/Q0
sjis指定で読み込んでると思い込んでるだけで実際はutf-8になってるんじゃないかな
あるいはログがsjisと思い込んでるだけという線もありうる
もしくは書き出しがsjisになってないとか
可能性を挙げたらきりがない
コードをさらすのが解決への近道
2019/11/05(火) 22:19:23.14ID:HJJtuDtXa
汎用機のデータをRubyで処理とか懐かしいな
俺もやってたわ
結局転職するのが唯一にして最良のソリューションだから、あまり変なことに拘って時間を無駄にするよりAWSの勉強でもしたほうがいいよ
2019/11/05(火) 23:08:03.80ID:rzC/SdAh0
>>806
どういう環境を使って
どういう方法でエンコーディング指定をしていて
どうやって読み込んで、どこに出力して、出力結果をどうやって確認してるのか?
そういう情報が必要
Ruby関係なくエンコーディングに対する理解を深めたほうが良さげ

基本的には外部エンコーディングと内部エンコーディングを指定すれば問題なし
https://docs.ruby-lang.org/ja/2.6.0/class/IO.html#io_encoding
>File.read('sjis.log', mode: "rt:sjis:utf-8")
2019/11/06(水) 00:03:50.72ID:lUVlDRaka
>806です
解決しました。

エンコードにsjisではなくwindows-31Jを
指定すると半角カナを文字化けせずに読めました。

ファイルの文字コードは確実にsjisなのに、
なんでsjis指定で読み込んだら化けるのか分かりませんが、
ひとまず解決です。
2019/11/06(水) 00:05:50.13ID:lUVlDRaka
>>809
文字コードの指定は、
fileopen時にwindows-31Jを指定してうまくいきました。
2019/11/06(水) 02:48:09.37ID:normnvJW0
>>810
一般に、Shift_JIS(標準規格)とcp932(Windowsカスタム)は別物。
Rubyでもそうらしい。

https://docs.ruby-lang.org/ja/latest/class/Encoding.html#S_ALIASES
813デフォルトの名無しさん (アウウィフ FF2f-DOEl)
垢版 |
2019/11/06(水) 11:43:12.78ID:o3tEvZiYF
半角カタカナ ← 混ぜるな危険

30年くらい前の話
2019/11/06(水) 11:50:52.64ID:SpldiVNta
>>812
これを見てやっとわかりました。

rubyは真面目に解釈してこうなったんでしょうけど、
sjisファイルの読み込みでsjis指定では駄目となると
初心者泣かせですね。
2019/11/06(水) 11:52:59.82ID:SpldiVNta
>>813
漢字も駄目なのでやや難易度高しです。
816デフォルトの名無しさん (アウウィフ FF2f-DOEl)
垢版 |
2019/11/06(水) 12:34:12.51ID:o3tEvZiYF
いいがかりは止せ
SJISファイルじゃないんだから当然だろ
2019/11/06(水) 13:41:03.82ID:ZR40S1lI0
Windows では一般用語として、sjis と書くけど、
厳密には、sjisを拡張した、CP932 の事です。
だから、MS が独自に拡張した部分は、sjisではない!

漏れは、Windows で、PowerShell を使って、クリップボード処理を書いているけど、
Windows(CP932) ←→ Ruby(utf8) と、外部環境とruby内で、文字コードを変換している

クリップボード内の複数行文字列の、各行の先頭・末尾から、
連続する空白類を除去して、クリップボードに入れる

str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換

ary = str.each_line.map( &:strip ) # 連続する空白類を除去する

IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end
2019/11/06(水) 15:16:56.50ID:Z1mcKm+J0
別にMSがSJISを拡張したんじゃないけどな。
そもそもSJIS本家を作ったのがMS(+他)なわけで。

じゃあ拡張したのは誰かというとIBMとかNECだよ
まあそもそも拡張可能にしていんだけどな

MSなどがSJISを作った。IBMやNECが拡張した。
それらを取り込んでWindowssのCP932とした。というのが正しい流れ

ちなみにAppleもSJISを拡張してる。それはMacJapaneseと呼ばれる。
拡張部分がIBMやNECが拡張した部分とかぶってるので互換性がないんだけどな
2019/11/06(水) 15:39:23.65ID:Fx0hE3mY0
>Encoding.aliases.select {|_,v| v == "Windows-31J"}
{"CP932"=>"Windows-31J",
"csWindows31J"=>"Windows-31J",
"SJIS"=>"Windows-31J",
"PCK"=>"Windows-31J"}

Rubyでは"SJIS"も"CP932"もWindows-31Jのエイリアスなんだけど
SJISの指定をWindows-31Jに変更して解決する事があるんですねー(棒)
2019/11/06(水) 18:22:07.75ID:8bqr3nzy0
半角カナや大半の漢字はsjis範囲内だからきちんとsjisで読めばほぼ文字化けはないはず
つまりsjisで読めていなかったということ
2019/11/06(水) 19:09:22.79ID:wTTuQQRz0
>>819
エンコーディングは同じで文字集合が違うだけだからね
2019/11/06(水) 19:26:39.67ID:GIJSYcug0
リファレンスマニュアルの aliases -> Hash の例
"SJIS"=>"Shift_JIS" は間違いですね

Encoding::SJIS == Encoding::CP932 #=> true
Encoding::SJIS == Encoding::Windows_31J #=> true
Encoding::SJIS == Encoding::Shift_JIS #=> false
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況