サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Switch 2
qiita.com/scivola
Ruby 3.2 で Integer#ceildiv なるメソッドが導入された。これはどういうものか。 用途 テニスボールが 15 個ある。これを「4 個入るケース」に詰めて保管しておきたい。ケースはいくつ必要か。 15 を 4 で割ると 3 余り 2。ということは,3 ケースに 4 個ずつ詰めて,半端の 2 個を別の 1 ケースに入れることになるので,ケースは計 4 個必要になる。 この計算は,Ruby でやるなら
Qiita の新着記事を眺めていると,ときどき同じお題に取り組んだ結果を書いたものをいくつも目にすることがあります。 「模範解答」があったりするので,おそらく何らかの教材に取り組まれたのだろうと思います。 その「模範解答」のコードを見て首を傾げることがしばしばあったので,本記事で具体的に指摘してみたいと思います。 取り上げるのはすべて Ruby のものです。 たいがい出典が書かれていないので,原典を参照することができないのですが。 ※本記事は,そういった記事および著者を批判する意図を微塵も持っていません。むしろ応援したい気持ちで書いています。 ※また,取り上げた教材およびその提供者を侮辱したり非難したりするつもりもありません。不遜かもしれませんが改善に役立てば幸いです。 なお,教材によってはお題そのものがおかしかったりしますが,今回は取り上げません。 今回,三つのお題を取り上げました。引用
本記事では,このように「◎◎が〇〇で,◎◎が〇〇で」といった情報(のカタマリ)を表すデータ型について考える。 どんな方法があるか このようなデータを表す方法はたくさんあるが,大きく分けて 汎用のクラスを使う方法 (書誌情報なら書誌情報専用の)クラスを作る方法 がある。 前者の代表としてハッシュを使う方法が考えられるし,後者の代表としてはクラス式でクラスを定義する方法が考えられる。 この節では,いくつかの方法を具体的に挙げる。あとの節でそれらの特徴や用途について考えてみる。 ハッシュで表す Ruby のハッシュはキーとして数値などさまざまなクラスのオブジェクトが使えるが,この記事のテーマに沿ったハッシュの場合,キーには文字列かシンボルのどちらかを使うのがよさそうだ。 どちらを使っても大差ないが1,シンボルを採用する場合,ハッシュ式にはいわゆるコロン記法が使えて, book = { title
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
Array クラスの陰に隠れて存在感の薄い Set クラスですが,みなさん使ってますか? Set クラスは文字どおり数学の「集合」を表すクラスです。標準添付ライブラリーなので(組込みではないので),require しないと使えません。 Set の影が薄い理由は,組込みクラスでないことに加え,集合にまつわるだいたいのことが Array で代用できてしまう,ということがあると思います。 これは,Array が「大クラス主義」的に設計されていて,他言語なら分けて設計するようなさまざまなデータ型の機能を Array に詰め込んでいるからですね。 しかし,「Set は要素の重複が無いことが確実」なのに対し,Array で集合を表すと要素の重複があるかもしれないので,最後に uniq をかます必要があったりします。 やはり集合のようなデータは Set クラスで表すのがよさそうです。 でも requir
Ruby on Rails で日付の前後関係に関するバリデーションをどうやって書こうか調べていたら,Rails 7 で,ComparisonValidator なるものが導入されたことを知った。 この記事は,ComparisonValidator の簡単な紹介と,私がハマった落とし穴について。 概要 ComparisonValidator は,モデルオブジェクトの属性値を他の値と比較するバリデーター。 Rails 7 より前でも,数値に関しては NumericalityValidator を使って
発端 Ruby で YAML ファイルを読み込んで利用するコードを書いていたのだが,ある日とつぜん,YAML がエラーを出すようになった。 そのプロジェクトでは何千行もある YAML ファイルの編集が進行中であった。その YAML データを Ruby スクリプトで読み込む際に以下のようなエラーが発生するようになったのだ。 (foobar の部分は実際のものとは変えてある) このプロジェクトで初めての経験だった。 調査 「Psych」というのが YAML のバックエンドであることは知っていた。 Ruby の yaml ライブラリーは psych ライブラリーを内部で利用していて,YAML モジュールは,実際の仕事を Psych モジュールに振っているらしい。 だから,YAML データに不備があったとき YAML モジュールではなく Psych モジュールで例外が発生する,ということは驚くに値
はじめに JavaScript を Ruby で圧縮したい。 こういう処理はフレームワーク側でやってくれるので,あまり意識することはないと思うが,たとえば静的サイトを生成するプログラムを自分で書く場合,やり方を知らなければならない。 定番 Uglifier 従来,こういう目的には Uglifier という gem がよく使われてきた。 執筆時点の最新版は 4.2.0 なので,本記事もこれを前提とする。 使い方は超簡単で, require "uglifier" puts Uglifier.compile(<<~JS) function average(numbers) { return numbers.reduce( function(sum, number) { return sum + number }, 0 ) / numbers.length } JS
pp とは pen-pineapple のことではない。 Ruby のメソッドで,ややこしいオブジェクト1もいい感じに表示してくれるもの。 用途は p メソッドと同じだが,それよりもっと分かりやすくきれいに表示してくれることになっている。メソッド名は pretty print から。 p と pp でどう違うかはよく知らないけど,たとえば要素数が多いハッシュを表示させると,後者では改行を入れてくれるようだ(小さいハッシュだと変わらない)。 p "A".upto("K").with_index.to_h # => {"A"=>0, "B"=>1, "C"=>2, "D"=>3, "E"=>4, "F"=>5, "G"=>6, "H"=>7, "I"=>8, "J"=>9, "K"=>10} pp "A".upto("K").with_index.to_h # => {"A"=>0, # "B
「Ruby は型が無い」という記述をときどき目にします。 本当でしょうか。 あまり正確な表現とは言えません。何をもって「型がある/ない」とするかによりますが,「Ruby は型が無い」は誤解を招くおそれがあります。 データ自身の型と,データを受けるもの(変数・仮引数など)の型を分けて考えるべきでしょう。 Ruby では 変数 定数 メソッドの仮引数 ブロックパラメーター には型がありません。 型宣言というものが文法的に存在しませんし,文字列を代入した変数に浮動小数点数を再代入することもできます。引数を取るメソッドにどんなオブジェクトを渡すことも可能です1。 つまり,データの受け側には型は無いということですね。 一方,組込みクラスだけ見てもデータの型は豊富です。 まあ,ナウいヤングは Ruby のクラスが豊かと言われてもピンとこないかもしれませんが,大昔は文字列型,整数型,実数型(浮動小数点数
Ruby の標準添付ライブラリーが次々と gem 化している。 gem 化すると,Ruby バージョンに縛られずにアップデートすることができる。 prime 0.1.2 リリース さて,昨日(2020-12-09)Ruby の素数ライブラリー prime の新しい版(バージョン 0.1.2)がリリースされた。 何が変わったのだろうか? prime のリポジトリー を見ても CHANGE.txt や HISTORY.txt の類は無いが,コミット一覧 に Optimize Integer#prime? というコミットメッセージを見つけた。 ん? もしや? コミットを覗くと,冒頭に MILLER_RABIN_BASES などという定数が定義されている。 やはりアレだ。ミラー–ラビン素数判定法 を使って素数判定を高速化したんだ。 ベンチマーク 素数判定プログラムのベンチマークテストはなかなか難し
この記事は下記の記事の続編ともいうべきものです。 桁数は Math.log10(x).floor + 1 でいいのか - Qiita さて,$10^{9942067}$ は 10 進で何桁の数だろうか1。 Ruby なら簡単さ。 irb(main):001:0> (10 ** 9942067).to_s.length (irb):1: warning: in a**b, b may be too big => 8 え? は,8 桁ぁ? ど,どういうこと? しかも何か変な警告が出てるし。つか,この警告がヒントか。要するにデカすぎてちゃんと計算できてないってこと? でもエラーじゃないしな。 いっそ .to_s.length を取って実行してみるか。 いや待てよ,もし巨大整数が表示されようとしたらターミナルがしばらく操作不能になりそうだしな。 えーい,やっちまえ。
算法・算譜・作譜とかは普通に使いたいね。 算料,算帳とか界面は知らなかった(この記事を書くために調べてて見つけた)。 data data は哲学(?)方面だと「与件」て訳語もあるみたい。「感覚与件」(sense data)とか。 address ワンボードマイコンの時代は,メモリーのアドレスのことを番地と呼ぶのが普通だったと思う。 computer 「電脳」は中国語。 一口に中国語といっても,中華人民共和国(以下「大陸」)と台湾では字体が違ったり,語彙そのものが違うことがある。香港もまた違ったりする。 大陸の字体をここでは「簡体字」と呼ぶことにする。 「電脳」は簡体字では「电脑」。台湾では「電腦」。 大陸では「电脑」よりも「电子计算机」あるいは単に「计算机」のほうがふつうの表現ぽい1。 「電脳」は,日本では坂村健さんが盛んに使われていたっけ? 『電脳都市感覚』NTT出版(1989)なんて本
Rust に入門したばかりで,公式ガイド「プログラミング言語Rust」(和訳)もまだ一部しか読んでない素人だけど,文字列の検索・置換はどうやるのか調べたのを記事にします。 (動作確認は Rust 1.12.0;改訂時は Rust 1.20.0 + regex 0.2.2 を使用) [2017-09-02 追記]regex のバージョンが 0.2 系に上がって一部互換性がなくなった。0.2 で大きな問題がなければ 1.0 をリリースするとのことなので,今回のような大きな変更はしばらく無いのかもしれない。 変更の詳細については公式の CHANGELOG を参照のこと。 0.2 系で違いがあるところに加筆していきます。 予備知識 文字列について 文字列には &str と String の2種類があるらしい。 公式ガイドの「文字列」が分かりやすい。 (2016-10-07 追記)「Rustの文字列
プログラムのバグでエラーが出るとき,エラーメッセージがバグを見つけるための大きなヒントになるはずだ。 ところが初心者はメッセージを読み解こうとせずに,ただ行番号からコードの該当箇所を探し,そこをじーっと眺めてバグを探そうとしがち(私もそうだった)。 どうしてか。 一つには〈エラーメッセージの読み方が分からない〉ということがあるのだろう。 Ruby のエラーメッセージは必ずしも分かりやすくはない。 それに,相手がナニ人だろうとかまわず英語で出る。私のように英語が苦手だとそれだけで萎えてしまう。「ノー,アイ ドント イングリッシュ!」と叫びたくなる。 この記事は Ruby プログラミングの超初心者に向けて,とくに英語に苦手意識を持つ人に向けて,エラーメッセージの読み取り方の最初の一歩を解説しようと試みたものだ。本当はもっとちゃんと分かっている人に書いてほしい のだが,誰も書いてくれないので1。
以前,「Ruby のココがダメ」という記事で,「フリップフロップ ワケわかめ」と書いた。 その後,@cuzic さんが「Ruby のオススメの機能7選」という記事で「Flip Flop 演算子」を知名度が低いオススメ機能として挙げられた。 最近,@Ping さんが「Ruby でフリップフロップ」という記事で,「..」と「...」の違いなども含め,やや詳しく説明された。 フリップフロップを知ってから十年くらい無視し続けて来たのに,ここ半年でミョーに意識することになったので,ちょっと考えたことを書いてみる。 Ruby のフリップフロップとは何か,ということは,リンク先の記事とかコメントとか公式リファレンスマニュアルの「範囲式」の「条件式としての範囲式」とか見てください。 フリップフロップの闇感 フリップフロップは何か闇な感じがする。なぜなのか。 既に多くの人が書いているとおり,誰が状態を保持し
この記事は,Ruby プログラミングの超初心者に向けて,とくに英語に苦手意識を持つ人に向けて,エラーメッセージの読み取り方の最初の一歩を解説しようとする試みの第 2 回目。 過去の記事はこちら Ruby のエラーメッセージを読み解く(初心者向け)その 1 「その 1」では,スクリプトを解釈するときに出る SyntaxError(構文エラー)を取り上げた。今回は実行時エラーである NoMethodError と NameError。 NoMethodError たとえば "Ruby" という文字列を小文字化したものを表示しようとして, としたら, NoMethodError: undefined method `dawncase' for "Ruby":String というエラーが出た。down を誤って dawn(夜明け)と打ってしまったんである。 NoMethodError は文字どおり
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? Qiita などの技術系の記事を読んでて「あ,ココちょっと残念」と思うポイントを書いてみます。自らの反省も込めて。 日本語表現・表記 「値を返却する」という表現 関数やメソッドが値を return することを日本語で「返却する」と表現した記事がたくさんありますが,ものすごい違和感を覚えます。 「値を返す」と書くべきでしょう。 この件は以前書きましたので理由はそちらを見てください。 「値を返却する」って言うな 「可変する」という言葉 「可変する」というおかしな言葉もよく目にします。 「可変」というのは,読んで字のごとく「変わりうる」とか「
EmEditor とは EmEditor は Windows 用テキストエディター。 巨大ファイルがわりと軽く扱えたり,CSV ファイルが表形式で表示できたり,JavaScript でマクロが書けたり,テキスト比較ツール,行の重複削除やソートが組み込まれてたり,箱形選択・編集ができたりなど,汎用のテキストエディターの中でもプログラマーにとって嬉しい特長をいろいろ持っている。 © と © の相互変換とか,パーセントエンコーディングや Base64 形式との相互変換の機能も地味に便利。 シンタックスハイライトや自動補完,スニピット入力などももちろんできる。 正規表現エンジンが選択可能に 今回の記事は,正規表現エンジンとして Onigmo(鬼雲)が使えるようになった,ということを伝えるのが目的だ。 Qiita には Onigmo の記事が無いようなので,Onigmo の特徴的な機能の紹
Ruby で,特定のクラスやモジュールを拡張する方法として refinements というものがある。Ruby 2.0 で試験的に導入され,Ruby 2.1 で正式に採用された。 一言で言えば,「拡張はするんだけど,その拡張はあるスコープ内でのみ効く。スコープ外では元のまま」を実現する仕組みだ。 ここでは,単位換算のために Numeric を拡張するということをやってみる。 動機 cairo というグラフィックライブラリーがある。PDF や PNG や EPS なんかを統一的なインターフェースで描画・生成することができる。 Ruby にはその名もずばり cairo という gem があり,cairo の機能が簡単に使える。 このライブラリーで PDF を作るとき,寸法の単位は pt(ポイント)を使用しなければならない。 そのため,たとえば,A4 判(横 210 mm,縦 297 mm)の
タイトルは釣りです。Ruby に盲目的に惚れている迂生には Ruby の痘痕(あばた)はエクボです。 それはともかく。 メソッド名の別名がありすぎ 「あなたは map 派? それとも collect 派?」っていう問いがまず嫌い。 いや,別名にも意義があるとは思うんだけど,記憶の負担が大きい。 自分では map しか使わなくても,他人のコード読むんだったら collect を知っていなくちゃならない。 しばらく前に reduce っていうメソッド見て,そんなのあったっけ?と思ったら inject の別名だった。 map/collect と inject/reduce の名前とその背景にある発想については,Rubyist Magazine に良い記事がある: そうかと思えば,Array#delete_if と Array#reject! みたいに,働きは基本的に同じだけど,削除が行われなかっ
注意 この記事は当初,「Ruby の用語として,singular method を特異メソッドと訳したのは妥当でなかったのでは」というモチーフのもとに書いたものですが,コメントのやりとりを見ていただくと分かるように,英語を和訳したのではなく,日本語の「特異メソッド」が先にあったようです。従って「誤訳か」という記事名は適切ではありませんでした。(2016年10月20日付記) ソフトウエア工学とやらを学んだこともなく,プログラミング用語に詳しいわけでもなく,英語が得意でもないので,的外れなことを書いているかもしれません。乞うご批判。 ほかのプログラミング言語でどうなのかは知らないので,Ruby だけを考えます。 追記(2021 年 8 月 4 日) 本記事では Ruby における「特異メソッド」の英語として一貫して「singular method」を採っていますが,どうやら圧倒的に「singl
次のページ
このページを最初にブックマークしてみませんか?
『@scivolaのマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く