Ruby 初心者スレッド Part 65
■ このスレッドは過去ログ倉庫に格納されています
プログラミング言語 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 >>722 $ csvtool namedcol aaa,ccc data.csv aaa,ccc 01,03 11,13 21,23 CSV::Table#by_col! で、列単位で扱える。 そこで、delete(列名) で、列ごと削除できるけど、 事前に、列名が必要 任意の列数のCSV ファイルを扱う場合に、 事前に、列名がわからない場合に、どうすれば良いのか? 一旦、ヘッダー行を取得して、すべての列名を取得してから、処理すれば良いのか? >>723 csvtool というコマンドがあるのですね >>724 csv = CSV.table ARGV[0] puts csv.by_col.delete_if{|name, val| ![:AAA, :BBB].include? name} できた! 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 } 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) 君の pwd の結果を曝すか runas /user:administrator 汁 Windows10, WSL, Ubuntu 16.04 の端末上で、 ~/mytest/ruby/test に、スクリプトファイルを置いて、実行してる ディレクトリ・ファイルのパーミッションは、rwxrwxrwx 確かに、/dev/pts/0 は存在しない(Errno::EIO)。 /dev/pts/ptmx しかない WSL には、その機能が無いのかも ちゃんと読め Insecure world writable dir /mnt/c in PATH こいつ他のスレでRubyのネガキャンしてまわってるキチガイだろ 相手をするな Rubyだけじゃないでしょ この板に取り付いて自演してる糖質君だよ そういう奴がいるという認識で無視しておけば無害 Windows10, WSL, Ubuntu 16.04 の端末上で、 tty と入力すると、/dev/tty1 と表示される Ruby ではなく、シェルスクリプトで、expect をしようか pty は仮想端末だから、ssh 接続をしないと使えないのかも 単に、端末に自動入力したいだけだから、 Ruby ではなく、シェルスクリプトで、expect をやってみる apt では、sudo のパスワードを聞かれるから、それを自動入力したい expect のサンプルが、pty を使ったものばかりだったから、ptyを使わなければ良いのかも? expectだけでも使えるのか? 誰か、サンプルを書いて! 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 は特殊 Windows で Ruby 使ってもロクなことにならない (WSL でもね) ここの淀んだコミュニティはまだWindows目の敵にしてるのか そんなんだからPythonにぶっちぎられちゃってるのに 別に目の仇にしてる訳じゃないやろ 「rubyはなんでwindowsで使うと糞なの」 「じゃあおまいが対応汁」 「forkωωω」 「挫折」 の流れを繰り返してるだけ 屍累々 >>738 お前がわかってないだけだろ そのエラーはlocalhostでtelnetサーバーを起動してない、 もしくは接続が拒否されたって意味だ。 今どき暗号化されてないtelnetサーバーなんて使わないから 前者だろうな。 ちなみにWindows 10にはtelnetサーバーは付属してない。 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 が開いていないのかも Rubyの課題が全然わからないので教えてほしいです。 1、0、−1、0が繰り返し表示されるようにしたいです。 when使ってできないでしょうか。 OS→windows10 Rubyバージョン→1.8.4 一応作ったのですが、nilが永遠にでます。 Ruby 1.8.4 ? もう、そんなに古いのは無理! Windows 用のRubyInstaller でも、Ruby2.5.7。 Linux では、Ruby2.6.5 が最新だが、Windows では、1つ前のバージョンを使うこと! Windows では、irb も日本語でバグるから、VSCode を使え! Code Runner という拡張機能を入れると、 右クリックメニューから、選択したコードを実行できる その問題を「1、0、−1、0を産む機械」と言い換えればすぐにyieldを使えばいいと分かる whenなの? 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を使わない理由が見つからないのだが、なにかバグありました? >>748 (1..).each{|i| p (-1)**((i & 2) >> 1) * (i & 1)} >>752 Windows 用のRuby は、いつも1つ前のバージョンを使う! RubyInstaller のサイトにも、最新版を使わないようにと、いつも書いてある Windowsでは、MSYS2 でコンパイルするモジュールなどが、 最新版に対応していないので、1年ぐらい待つ必要がある >>748 loop{ puts 1, 0, -1, 0 } >>754 RUBYINSTALLER-HEAD(https://github.com/oneclick/rubyinstaller2/releases/tag/rubyinstaller-head )については書いてありますが latestについては記述見つかりませんでしたが、どこに書いてありますか? > MSYS2 でコンパイルするモジュールなどが、 コンパイル済みのfat-gemが問題起こしてる印象があり、なくならねぇかな・・・と思ってますね https://rubyinstaller.org/ 以前は、このトップページか、Download のページに書いてあったけど、文章が変わったみたい まあでも、このスレでも、Windows では、最新バージョンは使うなという書き込みがあったから、 たぶん、1つ前のバージョンを使わないと、依存関係が解決できないのだろう とにかく、Mac を使っている人は、Windowsの依存関係が地獄だから、皆Macへ移った [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を返す方法を学ぶ ひょっとすると Ruby は糞なのかも知れない 10.times{|n|puts Math::cos(n*Math::PI/2) <=> 0} 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))} 糞は漏れだった orz 10.times{|n|puts Math::cos(n*Math::PI/2).to_i} >>764 そういうことじゃなくて発想の問題よ。 物事を単純に考えることができない。 流石に本気で三角関数使って実装しようなんて思ってないだろうしそこは別にネタで言ってんだと思うけど ネタとしても面白くはないけど そもそも>>748 はhello worldレベルの初心者だろうに、回答者が求めてるものを無視して俺の解き方見てくれ!って奴ばかりなのは問題だと思う 禁止事項 トリを使おうとしている質問者に対して、そんなトリはやめろとかという、斜め上からのアドバイス 質問者そっちのけでの昔語り(昔はもっと苦労したもんだ、今の若い者は…) 知らないのに、使ったことないのに、知ったかぶりでの書き込み ググれという誰でも言えそうな忠告 俺は知ってるけど言わない等といった、実社会での扱われ方からの僻みから来る 意地悪な言辞 回答はあくまでボランティアなので、質問者は、回答がつかなかったり、 期待に沿った回答が得られなかったからといって切れたりしないように。 また、わざとそういう困った質問者を演じて釣りに来る人もいるかもしれないので、 回答者も、むかついたからといって、いちいち切れて反応せずスルーしよう。 そして質問者はもう出て来ない 他人のレスに対して上から目線で批判するしか能がない評論家のカキコこそ、 無駄なスレ消費ではないかと思われ >>764 では、貴殿の正解をどうぞ! >>766 では、あなたの考える>>748 が求めていた回答(あなたの解き方)をどうぞ!! 訂正 X: >>766 では、あなたの考える>>748 が求めていた回答(あなたの解き方)をどうぞ!! O: >>767 では、あなたの考える>>748 が求めていた回答(あなたの解き方)をどうぞ!! いやどうみてもnがちょっとでかくなったら正しくなくなることくらい自明だろ 同じ発想でやりたいなら複素平面とかπ/2の回転行列とか使って計算すればいいだけ ただし奇を衒った回答としては斬新さにかけて面白くないと言っている で>>758 が一番スマート(かつ自分でもそうする)って言ってるんだがなんなんやこいつ >nがちょっとでかくなったら正しくなくなる 2π で mod すればいい 質問したものです。皆さん様々な意見ありがとうございます。考えてくださってとても感謝しています。 皆さんのを見ながらなんとかできました! ありがとうございました。 def break_test return break end i = 10; while i > 0 next_test } 放置すれば無限ループになるのをbreak_testでループを 抜けたいのですが、関数?からnext や breakなどを 返すようにできないのでしょうか。 ごめんなさい、 i = 10; while i > 0 break_test } でした。 そういうキーワードそのものは、返せないだろ 戻り値は、0, 1 などの整数とか、 フラグとして、true, false の真偽値とか、 :next, :break みたいなシンボルとか、文字列とか キーワードデリゲーションをすればいいんだろ かんたんじゃん >>774 それをやりたいと思った理由は? 仮にできるとしてもnextやbreakが 別のメソッドに埋まってたら可読性が低くて嫌だと思うんだけど >>774 斬新な発想だな。w Rubyに限らず一般的に、制御を移すしくみは、関数(メソッド)の範囲を越えることはできない。 ただし、「例外」ならそれ以降をすっとばすことができるので、break相当ならできるかも? # 勧めないけど。 >>778 理由はいろいろやろ。 制御の移しかたを別の関数に封じて共用できたらなあ、という気持ちがわからんのか。 可読性なんか、命名でも運用でもどうとでもなる。 >>778 実際はwhileじゃなくて xxxxx.each do |key| 同じようなことする関数(引数) 同じようなことする関数(引数) 同じようなことする関数(引数) end の中で関数の中身がある条件だったら nextで残りをやらずにeach.doの最初からやりたいんですけど 引数の値が違うだけなのに 例えば関数にTrueを返したら next しろとか条件をいちいち 付けるのもめんどくさいと思い、質問してみました。 xxxxx.each do |key| if 同じようなことする関数(引数) then next if 同じようなことする関数(引数) then next if 同じようなことする関数(引数) then next end Rubyにあまり詳しくないのでよくわからないのですが こんな感じなのでしょうか? 慣習的に返り値を成否にすることが多いから論理を逆にして xxxxx.each do |key| 同じようなことする関数(引数) && 同じようなことする関数(引数) && 同じようなことする関数(引数) end xxxxx.each do |key| next unless 同じようなことする関数(引数) next unless 同じようなことする関数(引数) 同じようなことする関数(引数) end >>781 なるほど 自分ならオプショナルチェーン的なのを使うか 「同じようなことする関数」をメソッドオブジェクトかProcにして配列に入れて true返したらnextしろって書くのを1箇所にする https://ideone.com/I7hyOs https://ideone.com/VQMgg2 jQuery.each( object, callback ) これは、jQueryの繰り返し処理用の関数。 配列/オブジェクトで使える 繰り返し処理中に、ループを抜けたい場合(一般的なループ処理で言うところのbreak)、 コールバック関数で、falseを返すことで実装できます。 それ以外の値を返した場合は、無視されます ifのネストができないとかなので qiitaの「オレオレ言語作ってみた」記事レベル あとgithubプロジェクトには、オブジェクトファイルとか vimのスワップファイルとかも入っていて周辺知識もない つまりはプログラミング全般の幅広い知識をつけて、 言語開発できるレベルになったと言うより 言語作ってみたくて、それ関連の知識をぐぐってコピペした程度 再帰を知ってるかも怪しいw 中学生相手に謎のマウントとって恥ずかしくないんかこのおっさん 養成読本シリーズのムック本が出た! Software Design plusシリーズ Ruby on Rails 6 エンジニア養成読本、2019/10/26 著者は、すがわらまさのり,前島真一 >>783 返事が遅くなりすみません。 なるほど、そんなにシンプルにできるのですね。 Rubyの問題ではなかったですね。 ありがとうございます。 >>784 条件を配列にいれて処理すると楽そうですね。 ありがとうございます。 >>785 Ruby on Rails入れてませんがjqueryが使えるのでしょうか。 github の ignoreとか適当だから、objとか普通にアップしてるな。 仕事ならまだしも、個人ねやつなんか、完全やバックアップもくてきだから、 あまりにデカイみだな .db とか除いて、全部あっふだわ。 個人のリポジドリも200とか超え始めると、一つ一つ丁寧に設定なんかしとれんわ。 githubやエディタ独自仕様に振り回される必要なし。 >>796 Rails を使っていない場合でも、 ERB, Selenium WebDriver, Nokogiri などで、 HTML を処理する場合には、Node.js, jQuery も使う >>797 はパスワードをうpして慌てるタイプ あるいは気付かず放置してるだけかも知らん あるフォルダ内の子フォルダだけを取得するのに、こう書いているのですが、 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 # フォルダが存在しない RubyはUNIXで使うものであり、シェルコマンドも積極的に使うのが前提 Rubyから普通にlsを呼べ基地外 単発で使う分には十分簡単に書けてると思うが 繰り返し書く必要があるなら自分でメソッド抽出すればよくね? Dir.glob( "パス", :directory ) みたいに、ブロックじゃなくて、 オプション・シンボルなどで、簡単に指定できれば rubyを使い出して2週間なのですが困っています。 今は汎用機のログの一括処理に使っているのですが、 半角カナや漢字が文字化けして読み込まれます。 ログファイルはwindowsにsjisで保存されていて、 これをsjis指定で読み込んでも\x33等と化けます。 どうすれば半角カナが化けないように読めるのでしょうか。 sjis指定で読み込んでると思い込んでるだけで実際はutf-8になってるんじゃないかな あるいはログがsjisと思い込んでるだけという線もありうる もしくは書き出しがsjisになってないとか 可能性を挙げたらきりがない コードをさらすのが解決への近道 汎用機のデータをRubyで処理とか懐かしいな 俺もやってたわ 結局転職するのが唯一にして最良のソリューションだから、あまり変なことに拘って時間を無駄にするよりAWSの勉強でもしたほうがいいよ >>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") >806です 解決しました。 エンコードにsjisではなくwindows-31Jを 指定すると半角カナを文字化けせずに読めました。 ファイルの文字コードは確実にsjisなのに、 なんでsjis指定で読み込んだら化けるのか分かりませんが、 ひとまず解決です。 >>809 文字コードの指定は、 fileopen時にwindows-31Jを指定してうまくいきました。 半角カタカナ ← 混ぜるな危険 30年くらい前の話 >>812 これを見てやっとわかりました。 rubyは真面目に解釈してこうなったんでしょうけど、 sjisファイルの読み込みでsjis指定では駄目となると 初心者泣かせですね。 いいがかりは止せ SJISファイルじゃないんだから当然だろ 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 別にMSがSJISを拡張したんじゃないけどな。 そもそもSJIS本家を作ったのがMS(+他)なわけで。 じゃあ拡張したのは誰かというとIBMとかNECだよ まあそもそも拡張可能にしていんだけどな MSなどがSJISを作った。IBMやNECが拡張した。 それらを取り込んでWindowssのCP932とした。というのが正しい流れ ちなみにAppleもSJISを拡張してる。それはMacJapaneseと呼ばれる。 拡張部分がIBMやNECが拡張した部分とかぶってるので互換性がないんだけどな >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に変更して解決する事があるんですねー(棒) 半角カナや大半の漢字はsjis範囲内だからきちんとsjisで読めばほぼ文字化けはないはず つまりsjisで読めていなかったということ >>819 エンコーディングは同じで文字集合が違うだけだからね リファレンスマニュアルの aliases -> Hash の例 "SJIS"=>"Shift_JIS" は間違いですね Encoding::SJIS == Encoding::CP932 #=> true Encoding::SJIS == Encoding::Windows_31J #=> true Encoding::SJIS == Encoding::Shift_JIS #=> false ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる