Ruby 初心者スレッド Part 66

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

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

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

るりまサーチ (リファレンス検索)
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
2020/08/19(水) 00:28:27.54ID:dM5o8vR90
windowsのファイルシステムのエンコーディングを中途半端なままにしたことで、
windowsユーザーへの嫌がらせになった以外に何の意味もなかった
697デフォルトの名無しさん (ワッチョイ 7f47-fHWV)
垢版 |
2020/08/19(水) 01:42:46.33ID:Ch6IfZIA0
>>695
+1
ほんそれ
2020/08/19(水) 01:52:26.05ID:zoQbwZV20
>>696
Windowsのファイルシステムでは、あらゆるエンコーディングがうまくいってない気がするな。w
まあ、しょせんUTF-16だしな。
安全そうなところだけをつかったほうが安心。
2020/08/19(水) 02:07:17.75ID:w/3evjlx0
UTF-8 以外は実績が無いから、文字列処理とか、怖くて使えないだろ。
誰も使っていないから

文字列を、正しく数値に変換できるのかとか

IO の境界で、変換する方が安全だと思う
2020/08/19(水) 02:33:17.91ID:w/3evjlx0
>>689
RubyでCookieの読み込みや保存を幸せにする(Mechanize&Selenium)
https://rooter.jp/web-crawling/ruby-cookie/

「ruby mechanize cookie」で検索すれば?

漏れは、selenium webdriver で、実際のブラウザを操作しているだけだから、
クッキーの事も、考えたことはない。
ブラウザが勝手にやる

プログラミングでは、入力して、ボタンを押すだけだから、簡単。
下は、yahoo のログインの例

driver.navigate.to "https://login.yahoo.co.jp/config/login_verify2?.src=ym";

element = driver.find_element(:id => "username")
element.send_key "ユーザー名"

driver.find_element(:id => "btnNext").click

element = driver.find_element(:id => "passwd")
element.send_key "パスワード"

driver.find_element(:id => "btnSubmit").click
2020/08/19(水) 07:23:42.56ID:w/3evjlx0
selenium webdriver なら、これで、
この板のtest スレの、書き込み確認画面が出る。
ひょっとしたら、確認画面が出ないかも知れない

require "selenium-webdriver"

options = Selenium::WebDriver::Chrome::Options.new

options.add_option( :detach, true ) # ブラウザを切り離す
options.add_argument( '--start-maximized' ) # 画面最大

driver = Selenium::WebDriver.for :chrome, options: options
driver.manage.timeouts.implicit_wait = 15 # default timeout

# プログラム板のtest スレ
driver.navigate.to "https://mevius.5ch.net/test/read.cgi/tech/1597362675/1";

element = driver.find_element( :css => ".formbody textarea" )
element.send_key "あい"

driver.find_element( :css => ".formbody input.submitbtn" ).click
2020/08/19(水) 09:15:13.90ID:w/3evjlx0
>>701
の続きに、以下を書くと、確認画面に切り替わった後の処理も、できる

単に、input[type=submit] のボタンを待つと、
遷移前後の両方のページで、ヒットするので、
確認画面に切り替わったかどうか、判別できない

遷移後のページだけに存在する、要素を待てば、
それが出現するまで、wait できるかも

sleep 7

# 確認画面が出る。https://mevius.5ch.net/test/bbs.cgi
puts driver.current_url # 切り替わったかどうか、URL を表示する

# ボタンのラベルを表示する
puts driver.find_element( :css => "input[type=submit]" ).attribute( "value" )
703デフォルトの名無しさん (ワッチョイ 1f6a-RTUg)
垢版 |
2020/08/19(水) 10:10:18.21ID:jdryYSd80
>>700さんのリンク先参考に見よう見まねでとりあえずやってみたんですけど、いまいちcookie_jarとかよくわからない・・・

require 'mechanize'
require 'yaml'

agent = Mechanize.new
agent.user_agent_alias = "Windows Mozilla"
agent.get('https://mevius.5ch.net/test/read.cgi/tech/1578068134/l50')
cookie_str = agent.cookies.map{|e| e.set_cookie_value}.join(", ")
#puts cookie_str

agent2 = Mechanize.new
HTTP::Cookie.parse(cookie_str, "https://mevius.5ch.net/test/read.cgi/tech/1578068134/l50";).each{ |cookie| agent2.cookie_jar << cookie }

cookie_yml = agent.cookies.map{ |e| e.to_yaml }.join
#puts cookie_yml

agent2.cookie_jar << YAML.load(cookie_yml)

#pp agent2.cookie_jar

agent2.user_agent_alias = "Windows Mozilla"
page = agent2.get('https://mevius.5ch.net/test/read.cgi/tech/1578068134/l50')


form = page.form_with(:action=>'//mevius.5ch.net/test/bbs.cgi')
form.field_with(:name=>'MESSAGE').value = 'テスト'
next_page = agent2.submit(form)
form2 = next_page.form_with(:action=>'../test/bbs.cgi?guid=ON')
704デフォルトの名無しさん (ワッチョイ 1f6a-RTUg)
垢版 |
2020/08/19(水) 10:13:04.91ID:jdryYSd80
agent2.submit(form2)
2020/08/19(水) 10:21:48.83ID:w/3evjlx0
そりゃ、個別のページのクッキーを解析したり、大変だよ。
お金をもらえる訳でもないのに、他人が作ったシステムを分析するのは

それが嫌だから、漏れらは、selenium webdriver で、ブラウザにやらせる。
入力したり、ボタンを押したり、ブラウザを操作するだけだから、まだマシ
2020/08/19(水) 10:32:07.88ID:w/3evjlx0
>>703
>form = page.form_with(:action=>'//mevius.5ch.net/test/bbs.cgi')

>form2 = next_page.form_with(:action=>'../test/bbs.cgi?guid=ON')

これらには、https: とか、付いていないけど、動くの?
2020/08/19(水) 10:38:39.32ID:w/3evjlx0
簡単に言えば、serialize と同じなんだろう。
異なるアプリに、Ruby のオブジェクトを渡せない

1 などの数値も、"1" みたいな文字列になってしまうのだろう。
すべての型情報が無くなって、文字列になる。
だから、YAML.load とかを、使っているのだろう

今なら、JSON を使う事が多い
708デフォルトの名無しさん (ワッチョイ 1f6a-Mhwj)
垢版 |
2020/08/19(水) 14:06:31.62ID:jdryYSd80
agent.getの時点でcookieの情報って得られてるんですね
709デフォルトの名無しさん (ワッチョイ 1f6a-Mhwj)
垢版 |
2020/08/19(水) 14:20:11.51ID:jdryYSd80
>>705
seleniumはブラウザ操作でmechanizeはhttp解析?みたいな感じですか?
710デフォルトの名無しさん (ワッチョイ 1f35-6L5+)
垢版 |
2020/08/19(水) 20:08:35.13ID:JONuvCWb0
>>689
よく調べたわけじゃ無いけど、
CSRF, クロスサイトリクエストフォージェリ、サイバー攻撃の一種対策されてるんじゃないかなぁ。

つまり、何某かのTokenが5chから送られていて、そいつをPOSTしないといけないとか。

5chのサイトからPOSTする時には、<input type=“hidden” value=“Token” name=“CSRF対策”>とかのタグがあって、Submitと共に自動送信される。
2020/08/19(水) 22:43:49.56ID:w/3evjlx0
プログラム板のtest スレと、その確認画面は、どちらも、mevius.5ch.net だから、
クロスドメインアクセスにはならない

ただ、HTML は本来、1回限りのアクセスで、前後のページには関係がない。
それを関係があるようにするために、ブラウザのクッキーを使って、セッションを結ぶ

こういうセッションがあるものは難しい。
5ch 側は仕様を知っているけど、分析する方は、仕様を知らないから、
ずっと他人のアプリを解析しなければならない

漏れは、解析するのが面倒だから、selenium webdriver を使って、ブラウザにやらす。
ただ、これはブラウザの操作でも、難しい

クッキーが無ければ確認画面が出て、有れば確認画面が出ない。
こういう条件判断をしないといけないから、難しい

Ruby on Rails でも、システムテストには、Capybara を使うけど、
これは、seleniumで、Headless Chrome を使っている

他人のアプリの解析は、HTML ヘッダーなどを分析しないといけないから、かなり難しい。
スクレイピングをやってる香具師で、こういうのを知ってる香具師は、まずいない。
HTMLヘッダーなんて、無数の項目があるから
2020/08/19(水) 22:57:07.95ID:w/3evjlx0
たぶん、Mechanizeは、Nokogiri みたいなものなんだろう

その時点のHTML を取得するだけ。
ちょっとした、GET, POST などは、出来るけど

JavaScript, Ajax で動的にページを作ったものには、対応できないとか
713デフォルトの名無しさん (ワッチョイ 1f35-6L5+)
垢版 |
2020/08/20(木) 06:07:11.62ID:5ApdpCMn0
>>712
MechanizeはServerから受け取ったCookieを返すよ。

だから、POSTしたパラメータに問題があって上手くいかないのだ。

書き込み画面のHTMLからinputタグをscrapingしてhidden属性の付いてるのを探す事が先決。

見つかったらそのname, valueを取り出してPOSTパラメータへセットしてやれば良い。
714デフォルトの名無しさん (ワッチョイ 1f35-6L5+)
垢版 |
2020/08/20(木) 06:08:32.79ID:5ApdpCMn0
seleniumが簡単だが、動作が重い。
Mechanizeでがんばれ!
715デフォルトの名無しさん (ワッチョイ 1f35-6L5+)
垢版 |
2020/08/20(木) 06:38:17.41ID:5ApdpCMn0
>>687
これは違う!

外部・CP932 → Ruby内部・CP932 → 外部・CP932

が正解。
Ruby内部は、外部・CP932であればCP932だし、UTF-8なら、それに合わせて、Ruby内部・UTF-8なのだ。
716デフォルトの名無しさん (ワッチョイ 1f35-6L5+)
垢版 |
2020/08/20(木) 06:39:16.98ID:5ApdpCMn0
>>708
agent.cookies
717デフォルトの名無しさん (ワッチョイ 1f35-6L5+)
垢版 |
2020/08/20(木) 07:05:48.71ID:5ApdpCMn0
大抵のWebサイトのFormは、Formを表示したBrowserからしか、POSTできない様になっている。

その仕組みは、ServerがFormを表示するするHTMLを生成する時に、Tokenを埋め込み、そのTokenが帰って来なかったPOSTを弾くと言うものだ。

TokenはFormが表示されるごとに変更さる。(one time Token)

https://html-coding.co.jp/knowhow/security/csrf/
2020/08/20(木) 07:13:47.07ID:nWR09WFB0
Rails にもある、CSRF のセキュリティー・トークンとかか?

2つのページが、同じセッションと判別できるような、仕組みを探さないといけない。
他人が作った、アプリを解析するのは大変
719デフォルトの名無しさん (ワッチョイ 1f35-6L5+)
垢版 |
2020/08/20(木) 07:53:19.33ID:5ApdpCMn0
>>718
違うんだなぁ。
RubyプログラムがいきなりPOSTしても成功しない。
一旦Form画面をScrapingすれば良いのだ。
2020/08/20(木) 09:46:21.48ID:Myo84Br30
>>715
それも違う。RubyはUnicode対応で作られてる
だから内部もUnicode
Windows側からUTF16で渡された場合はUnicodeで受け取るし
ANSIで渡された場合はUnicodeに変換して処理する
出力する場合はその反対
2020/08/20(木) 10:42:37.67ID:nWR09WFB0
Ruby の文字列は、混在できる

ある文字列は、CP932 で、
別の文字列は、UTF-8 とか

何もしなければ、変換されない
2020/08/20(木) 11:13:11.83ID:FC2EZr4O0
>>719
kan = [
"\xE6\xBC\xA2\xE5\xAD\x97".force_encoding( Encoding::UTF_8 ),
"\x8A\xBF\x8E\x9A".force_encoding( Encoding::CP932 ),
"\xB4\xC1\xBB\xFA".force_encoding( Encoding::EUC_JP ),
"\x1B\x24B4A;z\x1B(B".force_encoding( Encoding::ISO2022_JP )
]
puts kan
kan.combination(2){ |a,b| p a == b }
kan.size.times{|n| puts kan.inject(''){|r,s| r << s.encode(kan[n].encoding) } }
puts kan.map{|s| s.encoding }
2020/08/20(木) 12:03:56.57ID:tyNv301J0
>>715,720
君たちまずマニュアルを読もうか
https://docs.ruby-lang.org/en/2.7.0/Encoding.html
2020/08/20(木) 13:07:43.70ID:UjCnOWKd0
>>718
解析が大変かどうかはものによる。
セッションIDベースのWebアプリならともかく、ログインなしの掲示板なら大したことはないやろ。
2020/08/20(木) 22:50:29.80ID:Uplnh7Gz0
>>720 変換はせんだろ
2020/08/21(金) 01:31:14.88ID:SPVvFNrm0
Rubyをしばらく使ってきたが、やっぱり、ブロックの最後がendであることや、
0,1が共に真であること、複数行コメントが書きにくいこと、
構造体の書き方が new Person ではなく、Person.newであること、
Directory関連でワイルドカードを使うと、関連フォルダを全て変数に読み込んでから
動作し始めること、などが使いにくいので、node.jsに乗り換えようかなと思ってる。
Rubyが良い点は、それらの機能は使ったことは無いけど、
・最初から用意されているメソッド群でmethodチェーンが書けること。
・ブロック関数が書けること。
かな。
でも、使ったことがないということは、優先順位が低いと言うことではなかろうか。
2020/08/21(金) 10:50:02.63ID:w5e9p4kz0
え。
そんな調子だと何を使ってもダメそう。w
2020/08/21(金) 13:05:57.88ID:SPVvFNrm0
>>727
個人的には、実世界では、能力はかなり高いと評価されているけれど。
2020/08/21(金) 14:15:07.59ID:tDzk/wNZ0
0, 0.0, 空文字列、空配列、空辞書など、
各型に、偽がある言語は、バグる

Ruby の偽は、nil, false だけ

MISRA-C でも、( a ) みたいに、単独の数値型の変数で、真偽値を表すのは禁止されてる。
0 なら偽として使う方法

Ruby で、if ( b ) みたいに書けるのは、nil の時だけ偽だから。
0, 0.0, 空文字列、空配列、空辞書などでも真

または、b がbool 型の場合
730デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/21(金) 14:31:29.79ID:2LaXNW9iF
nil == false
は false
2020/08/21(金) 14:33:13.81ID:w5e9p4kz0
>>728
相対評価は、まわりのレベルがわからんので、なんとも。
元コメから判断すると、周辺まるごと低いのかな?と思わざるを得ない。w

まあ、たまたま自分が使ってない特定機能をアレコレ言うのはアホに見えるのはたしか。
2020/08/21(金) 14:35:00.79ID:w5e9p4kz0
>>729
型のないRubyでそんなことを言われても。w
そんなの、たいした違いじゃないよ?
2020/08/21(金) 14:49:57.72ID:SPVvFNrm0
>>731
そんなことない。
非常に上層のごく一部の人しか入れないところだと言われている。
734デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/21(金) 15:22:52.16ID:2LaXNW9iF
スキンのひとか
735デフォルトの名無しさん (JP 0H7f-08ol)
垢版 |
2020/08/21(金) 15:35:51.23ID:dYZcDjdTH
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

VM + ASM を書いた (C#, DX) * x86 ではない!
simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ

VM + ASM のダウンロード
ttp://up.x0000.net/files/TSimulang.zip
2020/08/22(土) 00:05:39.01ID:cH1OO8njr
「実世界では、能力はかなり高いと評価されている」っていう言い回しが最高に知性を感じないんですけど
いや煽りとかじゃなくマジで
2020/08/22(土) 00:13:16.02ID:rn2pygew0
異世界では無双している
2020/08/22(土) 02:33:00.24ID:orN/hav20
>>736
非常に上層のごく一部の人しか入れないんだぞ!
739デフォルトの名無しさん (ワッチョイ ff8c-IEoI)
垢版 |
2020/08/22(土) 08:20:46.05ID:lfF/bqLu0
非情に上層のごく一部の人しか入れないんだぞ!
2020/08/22(土) 08:46:37.28ID:j5SL9Fsb0
>>736
あんまりちゃんと人と会話したりまともな本とかは読んだことがなくて、丁寧にかつちょっとカッコつけて話そうとしたらラノベとかで覚えた変な言い回ししか出てこなかった、と予想してみる
741デフォルトの名無しさん (ワッチョイ ffbb-ZIaG)
垢版 |
2020/08/22(土) 15:31:25.70ID:rjSk5doP0
まあ、能力の高いっていうそこのお方は、Youtubeで流行ってる学歴ジャンケンでもして能力を示した方がいいんじゃん?
学歴だけが能力を示すものじゃないにしても、能力がどうの言い張るだけよりずっとマシだし、おおよその実力が周りの人も推定できるだろうからいいぜ!
2020/09/01(火) 22:10:17.03ID:vLz2GEqc0
Rubyは、node.jsに比べて、ファイル出力のメソッド名が短いので楽。
fp=File.open("filename","w");
fp.print( "nanigshi=#{変数名}\n" );
みたいに書ける。node.jsだと、
fd = fs.openSync("filename", "w");
fs.writeSync(fd, `nanigshi=${変数名}\n` );
となり、キーワードが長い。逆引用符`が打ち込みにくいという
欠点も有る。
2020/09/01(火) 22:45:30.43ID:Bhx0z62Fr
US配列なら楽だぞ
2020/09/01(火) 22:58:40.10ID:JyDU62SB0
>>742
「Sync」をあえて表現してるんやろ。
ポリシーの問題。
2020/09/01(火) 23:33:04.32ID:knLE24Nq0
ブロックと;省略で
File.open("filename","w") { |file| puts "nanigshi=#{変数名}" )
みたいに書くのがRubyっぽくない?
2020/09/02(水) 02:02:43.13ID:0/6Ab1gT0
クローズしちゃうだろ
2020/09/02(水) 15:16:44.13ID:Wngy4TOD0
>>744
でも、コンピュータ黎明期の非常に古くから open, write は、同期的だったの
だから、互換性を考えれば、逆さまにしたのは問題。
2020/09/02(水) 15:21:09.21ID:Wngy4TOD0
open, writeといえば、Unix/Linux/Windows/Macでも動作がほぼ同じな
非常に大事なもので、特にUnix/Linuxでは、「全てがファイル」という設計
思想であり、その根幹を成すのが、これらの関数で、あらゆる概念の基礎と
なっているので、その動作を変更するのはあらゆる場所に悪影響を及ぼす。
Unix系では、OSの動作の90%以上が、open, writeに依存した設計に
なっているといってもかごんでは無いくらい、基礎中の基礎。
その動作を変更することは、自然法則を変更するくらい驚天動地の試み。
重力が引力ではなく斥力になってしまうくらいで、太陽も惑星も存在し得ない
位の結果となる。
2020/09/02(水) 15:57:35.42ID:iCfAZPhu0
>>747
Cとの互換性がー、とか非同期重視のアグレッシブなNode.jsに言うの?w
2020/09/02(水) 16:53:35.95ID:X9xcF9vI0
>>748
でもネットワークはファイルじゃないんですよ
全てがファイルという設計と言っても
その程度のものなんです。
2020/09/02(水) 17:55:27.42ID:Wngy4TOD0
>>749
Cとの互換性というより、UnixやWindowsなどのあらゆるOSの基礎の部分との
互換性。
それくらい、open, writeは、OSの基礎に根ざしていて、勝手に働きを変えるべき
じゃない。
働きを変えたいなら、変えた方の関数の名前を少し変えるべき。
それで十分なのに、名前と働きをさかさまにしてはいけなかった。
2020/09/02(水) 18:19:28.61ID:0/6Ab1gT0
rubyInstallerでruby 2.7入れたんだがirbのレスポンスがめちゃくちゃ遅くて
かなりゆっくりキーボード入力しても入力を取りこぼすんだけど
速くする方法ありませんか?
2020/09/02(水) 21:47:08.53ID:iCfAZPhu0
>>751
いちいちAsyncをつけろというのか?
Node.jsのポリシーにあわんやろ。
郷に入っては郷に従え。

オレも知らんけど。w
754デフォルトの名無しさん (アウウィフ FF8b-th+2)
垢版 |
2020/09/03(木) 10:05:34.13ID:DK3Ul6vKF
Sync.js
755デフォルトの名無しさん (ワッチョイ 272c-3NJ+)
垢版 |
2020/09/04(金) 00:42:11.02ID:Wl7qFIBb0
Node.js は非同期が基本。
Windows では、50ms 以上掛かるものは、非同期にするのが基本

>>752
irb とか、そんな面倒なものは使わない

VSCode の拡張機能・Code Runner(Run Code)で、
ファイル全体、または、コード片を選択して実行できる
2020/09/04(金) 03:38:08.87ID:Akgzavid0
VSCodeでCode Runnerね。オーケーオーケー
2020/09/04(金) 05:36:12.08ID:ovAJuzA/0
穴ほって埋めるやつか
2020/09/04(金) 10:18:21.30ID:icCvRHhg0
平安京エイリアンか。
759デフォルトの名無しさん (ワッチョイ 272c-3NJ+)
垢版 |
2020/09/05(土) 22:17:01.41ID:dAk5cbFF0
エンジニアチャンネル粟島、9/4

プログラミングでYouTube動画の編集作業を自動化する
https://www.youtube.com/watch?v=2nDkNHeCKs4

プログラミングで、自動的に無音部分をカットして、動画をつなげる。
Python で作ってる

皆、何時間も掛かって編集しているから、
誰か、Ruby で作って、公開しろ

粟島に、スーパー・プログラマーの称号を独り占めさせるのは、癪にさわる
760デフォルトの名無しさん (アウウィフ FF8b-th+2)
垢版 |
2020/09/06(日) 14:32:01.97ID:pKWvrGW4F
ffmpeg 呼んでるだけだから ruby で同じことすればいいだけ
そもそも youtube の web 上の作業を自動化するのかと思ったらそうでもないし
誤解を招く
2020/09/07(月) 11:58:27.72ID:IF51aHwX0
粟島に、敵対心むき出しの、凡才プログラマーKBOY に教えてやったら?

エンジニアチャンネル粟島

【検証】現役プログラマーは30万円の案件を何時間で出来るのか?
https://www.youtube.com/watch?v=rt_X6n9oWa4

YouTube API で、指定条件に当てはまる、動画を集める(filtering)のを、Ruby で、1時間で作った。
つまり、時給30万円!

これも最終的に、30人が応募して、数千円になったらしいがw
762デフォルトの名無しさん (エムゾネ FF7f-j7FC)
垢版 |
2020/09/07(月) 12:03:06.35ID:K0kNn/CsF
闇サイトのバイトか
763デフォルトの名無しさん (ワッチョイ 4b2c-8GNv)
垢版 |
2020/09/23(水) 01:34:43.74ID:vUEpR4nB0
エンジニアチャンネル・小川

【悪用厳禁】Amazonの価格を監視するシステムを作ってみた
https://www.youtube.com/watch?v=Gr6FJUOfMHc

Amazon のAPI を使って、価格を監視して、LINE へ通知する
2020/09/28(月) 08:01:27.35ID:ZnjqOblj0
このサイトIRB代わりに使ってたんですがバージョン2.1.5とめっちゃ古いです
ライブコーディング?機能のついた同種のサイトってないですか
http://fatiherikli.github.io/fil/#eyJwYXRoIjoiSVJCLnJiIiwic291cmNlIjoicCBSVUJZX1ZFUlNJT04ifQ==
765デフォルトの名無しさん (ワッチョイ d32c-G8Sl)
垢版 |
2020/10/01(木) 08:39:12.41ID:theiHz1p0
JSON ファイルの中身が、下のようなユニコード・コードポイントの表示が多くて、読めない

{{\u30ab\u30ec\u30f3\u30c0\u30fc 10\u6708}}

ファイルを丸ごと読めるように、変換する方法を教えて!
2020/10/01(木) 08:49:16.51ID:theiHz1p0
>>764
paiza.jp は比較的、新しいバージョンだったと思う

puts RUBY_VERSION
と入力してみ
2020/10/01(木) 21:03:03.13ID:BMjHKKQ5r
>>764
そもそものopalのサイト使えば?
https://opalrb.com/try/

>>765
標準出力に出力すれば?
768765 (ワッチョイ d32c-G8Sl)
垢版 |
2020/10/01(木) 22:25:46.66ID:theiHz1p0
JSON ファイルをcat しても、変換されませんでした!

普通の英数字と、\u6708 みたいな文字が混じっているファイルです
769デフォルトの名無しさん (ラクッペペ MM7f-0zgZ)
垢版 |
2020/10/02(金) 09:07:20.78ID:ugOoTtJuM
matlabでのfiltfilt()のように、ゼロ位相デジタルフィルター処理ができる関数はなんでしょうか
770デフォルトの名無しさん (ラクッペペ MM7f-0zgZ)
垢版 |
2020/10/02(金) 11:29:50.32ID:36KHjBX6M
すみませんでした
771765 (ワッチョイ d32c-IT45)
垢版 |
2020/10/03(土) 07:39:23.69ID:/wA+nWqo0
c@at input.json | pe@rl -@Xpne 's/\\u([0-9a-fA-F]{4})/c@hr(h@ex($1))/eg'
(投稿できないので、@を入れました)
で、日本語で表示されました!

これを、Ruby では、どう書きますか?
正規表現で、\u6708 みたいな文字を、どう変換するの?
2020/10/03(土) 09:17:06.76ID:DiO6Np8S0
Rubyだと、正規表現にマッチした部分を引数にして関数に渡してくれる
メソッドが有る筈だから、それを使えば出来るはず。
773デフォルトの名無しさん (ワッチョイ b37c-gW4a)
垢版 |
2020/10/03(土) 09:27:06.27ID:F7oAx4CC0
-Ks -Ke -Ku があるから -Kw もあるはずだろう(驚き最小)
2020/10/03(土) 09:32:00.87ID:DiO6Np8S0
>>771
以下のようにすれば、\uXXXX の部分を unicode コードとして文字に直した後のテキストが
標準出力に出力されるのではないかと思われる。
なお、試して無いので実際に動くかどうかは分からない。
$1.to_i(16)は、$1 に入っている文字列を 16進数とみなして整数値に直しているつもり。
x.chr は、数値 x を文字コードとして対応する文字に直しているつもり。
gsub は、正規表現に合致した部分を後続のブロックの中の $1 に入れて、結果に
置換しているつもり。

[test.rb]

strJson = JSONを読み込んだ文字列;

print( strJson.gsub( /\\u([0-9a-fA-F]{4})/ ) { $1.to_i(16).chr } );
2020/10/03(土) 09:45:21.01ID:MOu6VxbMr
そういうことならJSON.load使えば?

require 'json'
JSON.load(fname)

愚直にやるならArray#packを使いましょう。

str.gsub(/\\u(\h{4})/){[$1].pack('H*').unpack('n*').pack('U*')}
2020/10/03(土) 10:47:42.33ID:DiO6Np8S0
>>774
間違いがあった。正しくは、
print( strJson.gsub( /\\u([0-9a-fA-F]{4})/ ) { $1.to_i(16).chr("UTF-8") } );
2020/10/03(土) 10:58:07.83ID:DiO6Np8S0
"UTF-8"ではなくて、"UTF16-BE"か、"UTF16-LE"かも知れない。
試して上手く行くのを選んで欲しい。
2020/10/03(土) 11:41:59.34ID:/wA+nWqo0
>>775
>>776
でも、正常に動きました。ありがとう。
JSON.load で、自動的に読めるようになるのが便利

require 'json'

json = File.read( "input.json" )
p JSON.load( json )

p json.gsub(/\\u(\h{4})/){[$1].pack('H*').unpack('n*').pack('U*')}

print( json.gsub( /\\u([0-9a-fA-F]{4})/ ) { $1.to_i(16).chr("UTF-8") } );
2020/10/03(土) 12:38:03.63ID:1IyBCfpu0
👨‍👩‍👧‍👦1コードポイント1文字とは限らないし¥uの後は4桁とは限らないよね👨
2020/10/03(土) 13:09:59.31ID:/wA+nWqo0
それなら、単純な正規表現では、ダメ。
実際に存在する、コードポイントを調べないといけない

ひょっとしたら、JSON.load は、それに対応しているかも
2020/10/04(日) 15:56:43.31ID:P8Zgc9xR0
>>780
全ての文字を utf16 に変換してから、utf8に再変換すればいい気がする。
第一段階の変換で、ついでに \uXXXX の部分を 単純に 16BIT 整数に直せばいいはず。
782765 (ワッチョイ d32c-IT45)
垢版 |
2020/10/05(月) 01:16:19.79ID:z7kgQPv30
\u は、4・8桁の2種類あるのか?
2020/10/05(月) 08:08:05.24ID:z7kgQPv30
👨‍👩‍👧‍👦 は、4つの文字が連結したような感じ

\uD83D\uDC68\u200D
\uD83D\uDC69\u200D
\uD83D\uDC67\u200D
\uD83D\uDC66

\U0001F468\U0000200D
\U0001F469\U0000200D
\U0001F467\U0000200D
\U0001F466

\u{1F468}\u{200D}
\u{1F469}\u{200D}
\u{1F467}\u{200D}
\u{1F466}
784デフォルトの名無しさん (ワッチョイ b37c-N+m6)
垢版 |
2020/10/05(月) 10:14:21.95ID:H6rSrLtq0
もう ruby 関係無いだろ
良い加減消えろ

推奨スレ
mevius.5ch.net/test/read.cgi/tech/1545032904/
mevius.5ch.net/test/read.cgi/tech/1593777227/
785デフォルトの名無しさん (ワッチョイ 672c-JAxH)
垢版 |
2020/10/11(日) 00:59:43.22ID:B+MSoWxK0
( line, ary ), line_num
この( ) をなくすと、エラーになる

TEXT = <<'EOT'
a
b
EOT

line_numbers = TEXT.each_line.with_object( [ ] ).with_index( 1 ) do | ( line, ary ), line_num | # 各行・蓄積変数・行番号
ary.push( line_num )
puts "#{ line_num } : #{ line }"
end

p line_numbers

出力
1 : a
2 : b
[1, 2]
2020/10/11(日) 18:44:20.92ID:vt3DXswMr
>>785
仕様通りです
787デフォルトの名無しさん (ワッチョイ c308-8Ti4)
垢版 |
2020/10/13(火) 15:52:15.31ID:Iy+8ZYjV0
初心者です
Windows10でrubyのバージョンは2.4です
gets.chompで日本語の文字列を入力しprintで出力したら文字化けするのですがどうしたら治りますか?
2020/10/13(火) 16:24:17.23ID:y5Oy6HcC0
漏れは、WSL, Ubuntu 18.04 を使っているけど、
Ruby Installer のMSYS 2 かい?

日本語入力が難しい

ファイルか、端末の文字コードの設定だろう。
BOM 無しUTF-8(UTF-8N)

ユーザー環境変数に、RUBYOPT を作って、--encoding=UTF-8 を設定するとか。
ただし、irb が、コマンドプロンプトでは使えなくなるので、
PowerShell しか使えなくなる

VSCode の拡張機能、Code Runner で、
選択したコード片、またはファイル全体を実行できる

これで、irbは使わなくてもよいけど、デバッグで、pry が使えなくなるかも。
pry は、irbを使っているのかも?
2020/10/13(火) 16:34:59.69ID:y5Oy6HcC0
2020-10-06
RubyInstaller 2.7.2-1, 2.6.6-2 and 2.5.8-2 released

Windows では最新版を避けて、2.6.6-2 を使えば?

漏れは、Windows 10, WSL, Ubuntu 18.04 で、
VSCode の拡張機能、Remote WSL も使う

Linux側には、日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv を使って、
ruby 2.6.6, node 12.16.2 を入れた

yarn は、Windows側に入れて、WSL から、拡張子なしのyarn コマンドを呼べる。
これは、#!/bin/sh で始まるシェルスクリプト

anyenv は多言語向きで、rbenv, nodenv, pyenv, phpenv などを同じ使い方で、統一的に扱える
2020/10/13(火) 16:44:54.23ID:y5Oy6HcC0
Windows 版Ruby の日本語入力では、

コマンドプロンプトよりも、
PowerShell を使う方が良いのかも?

日本語出力は問題ない。
もし、フォントがかすれて表示されたら、バグっているけど
2020/10/13(火) 16:56:07.22ID:y5Oy6HcC0
>>788
修正

>ユーザー環境変数に、RUBYOPT を作って、--encoding=UTF-8 を設定するとか。
>ただし、irb が、コマンドプロンプトでは使えなくなるので、
>PowerShell しか使えなくなる

RUBYOPT に、--encoding=UTF-8 を設定すると、
コマンドプロンプト・PowerShell の両方で、irbが起動しなくなる

C:/Ruby25-x64/lib/ruby/site_ruby/rbreadline.rb:6135:in `delete': invalid byte sequence in UTF-8

コマンドプロンプト・PowerShell の文字コードの設定で、使えるようになるのかな?
漏れは、VSCode, Code Runner を使っているから、irbを使っていない
2020/10/13(火) 17:01:18.58ID:v339nyYs0
>>787
ridk use で切り替えられるから最新版を試すと良い
このへんの問題も改善されてたはず
2020/10/13(火) 17:05:42.76ID:y5Oy6HcC0
RUBYOPT に、--encoding=UTF-8 を設定すると、

コマンドプロンプト・PowerShell の文字コードの設定で、
chcp 65001
と入力したが、どちらもエラーで、irbが起動しない

でも、irbを使わなければ、
RUBYOPT に設定するのは、便利なんだけど
2020/10/13(火) 17:09:23.25ID:y5Oy6HcC0
>>792
ほう
795デフォルトの名無しさん (ワッチョイ c308-8Ti4)
垢版 |
2020/10/13(火) 17:24:55.62ID:Iy+8ZYjV0
みんなありがとうございます
環境変数って編集したら再起動しないといけないとかありますか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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