Home Books Effective Ruby: あなたのRubyをより輝かせる48の特別な方法 項目20におけるfetchを利用したコード例の代替案 SatoKen @kenicode 2024/11/14 16:00 最終更新 2024/11/14 16:07 Effective Rubyの「項目20 ハッシュのデフォルト値を利用することを検討しよう」では、 a. ハッシュにエントリが存在しない場合には配列作成してから配列に要素を追加し、 b. ハッシュにエントリが存在する場合にはそのエントリである配列に要素を追加する という動作をするコードとして、fetchを使う以下のようなコードサンプルが提示されている。 hash[key] = hash.fetch(key, []) << value このコードを実際に動かす簡単な例として、自然数を偶数と奇数に分けるコードを以下に示す。 10.times.reduce({}) do |hash, value| key = value.odd? ? :odd : :even hash[key] = hash.fetch(key, []) << value hash end => {:even=>[0, 2, 4, 6, 8], :odd=>[1, 3, 5, 7, 9]} さて、このhash[key] = hash.fetch(key, []) << valueと同じ動作をする別のコードとして、以下の代替案があるのだが、本書では触れられていない。 (hash[key] ||= []) << value こちらのコードの方が、keyが2回登場しないという面でDRY原則的には優れている。 具体的には、2カ所で同じにしないといけないところをうっかり違うものにしてしまうというミスを防ぐことができる。 なお、Rubyの式がオブジェクトを常に返すことを利用したこのような書き方に慣れていないプログラマには、このコードは理解しづらいかもしれず、それがデメリットになるかもしれない。そういうときには、以下のように2行で書くと良いかもしれない。 ary = (hash[key] ||= []) ary << value
Home Web Document Opening the Software Toolbox 「ソフトウェアの道具箱」はUNIXの考え方の1つを簡潔に説明している SatoKen @kenicode 2024/07/10 13:55 最終更新 2024/07/10 13:56 この「ソフトウェアの道具箱」は、Linux等へも引き継がれ現在でも大いに活用できるUNIXの考え方を、簡潔に紹介してくれていると思います。 この考え方の要約をこの文書から引用すると以下のようになります。 個々のプログラムは、一つの仕事をきちんとやってのければよい。それ以上でもそれ以下でもない。 プログラムを適切な配管工事で組み合わせると、全体が部分の総和以上になる結果が生じる。 作者が想像もしなかったようなプログラムの新しい使用法が見つかることもある。 プログラムは決して余計なヘッダや追加情報を出力すべきではない。 そうしたものもパイプラインの先へ送られてしまうかもしれないからだ。 骨の折れる部分は、他の奴にやらせろ。 自分の道具箱をよく知れ! 個々のプログラムを適切に使え。適切なツールがなかったら、それを作れ。 UNIX系のOSを使うとき、特にパイプを使ってコマンドを組み立てるときに知っていると良い知識であると同時に、UNIX系のOSで動くプログラムを作るときにも、パイプを使って他のコマンド(プログラム)と連携できるようにすることが時に強力な選択肢であることは頭に入れておくと良いと思います。 何しろ短い文章ですので、初めてこの考えに触れるときや、この考えを再確認したいときに、サクッと自分で読んだり、他人に紹介できたり、便利な文章だと思います。
Home Software プログラミング言語 Python Pythonライブラリの作成に関する公式情報 SatoKen @kenicode 2024/05/28 19:43 pyproject.tomlの[build-system]の指定が、サンプルプロジェクトではsetuptoolsである一方、チュートリアルではデフォルト扱いがhatchlingになっていて、両者で違いがあって興味深いですね。 公式(PyPA)としては、setuptoolsがまだまだ現役であることを認めつつ、今後はhatchlingを推していきたいということなのかな?
Home Software Unix Unix commands bash コメントを利用してコマンドを再利用する方法 SatoKen @kenicode 2024/05/17 20:30 同じコマンドをパパッと使い回す方法として便利なときがあるかもしれませんね。 それから、.bash_historyを後から見たり検索したりするなら、こういうコメントが残っていると実は便利なのかも。
Home Software Libraries Ruby w3c_validators w3c_validators gemでNu validatorのコンテナイメージを利用する場合 SatoKen @kenicode 2024/05/01 21:09 Nu validatorのコンテナイメージであるghcr.io/validator/validator:latestをローカルで走らせて、 これをw3c_validatorsのW3CValidators::NuValidatorから使う場合は、以下ようにuriを指定してnewすれば動きます。 validator = W3CValidators::NuValidator.new(:validator_uri => 'http://localhost:8888/') ちなみに、ローカルで走らせたNu validatorに切り替えたところ実行時間がだいぶ減りましたので、w3c_validatorsが遅いと感じている方はローカル実行を試すと良いかもしれません。慣れればコンテナを走らせるのはサクッと出来ますよ。
項目20におけるfetchを利用したコード例の代替案
Effective Rubyの「項目20 ハッシュのデフォルト値を利用することを検討しよう」では、
a. ハッシュにエントリが存在しない場合には配列作成してから配列に要素を追加し、
b. ハッシュにエントリが存在する場合にはそのエントリである配列に要素を追加する
という動作をするコードとして、
fetch
を使う以下のようなコードサンプルが提示されている。このコードを実際に動かす簡単な例として、自然数を偶数と奇数に分けるコードを以下に示す。
さて、この
hash[key] = hash.fetch(key, []) << value
と同じ動作をする別のコードとして、以下の代替案があるのだが、本書では触れられていない。こちらのコードの方が、
key
が2回登場しないという面でDRY原則的には優れている。 具体的には、2カ所で同じにしないといけないところをうっかり違うものにしてしまうというミスを防ぐことができる。なお、Rubyの式がオブジェクトを常に返すことを利用したこのような書き方に慣れていないプログラマには、このコードは理解しづらいかもしれず、それがデメリットになるかもしれない。そういうときには、以下のように2行で書くと良いかもしれない。
「ソフトウェアの道具箱」はUNIXの考え方の1つを簡潔に説明している
この「ソフトウェアの道具箱」は、Linux等へも引き継がれ現在でも大いに活用できるUNIXの考え方を、簡潔に紹介してくれていると思います。
この考え方の要約をこの文書から引用すると以下のようになります。
UNIX系のOSを使うとき、特にパイプを使ってコマンドを組み立てるときに知っていると良い知識であると同時に、UNIX系のOSで動くプログラムを作るときにも、パイプを使って他のコマンド(プログラム)と連携できるようにすることが時に強力な選択肢であることは頭に入れておくと良いと思います。
何しろ短い文章ですので、初めてこの考えに触れるときや、この考えを再確認したいときに、サクッと自分で読んだり、他人に紹介できたり、便利な文章だと思います。
Pythonライブラリの作成に関する公式情報
pyproject.toml
の[build-system]
の指定が、サンプルプロジェクトではsetuptools
である一方、チュートリアルではデフォルト扱いがhatchling
になっていて、両者で違いがあって興味深いですね。 公式(PyPA)としては、setuptools
がまだまだ現役であることを認めつつ、今後はhatchling
を推していきたいということなのかな?コメントを利用してコマンドを再利用する方法
同じコマンドをパパッと使い回す方法として便利なときがあるかもしれませんね。
それから、
.bash_history
を後から見たり検索したりするなら、こういうコメントが残っていると実は便利なのかも。w3c_validators gemでNu validatorのコンテナイメージを利用する場合
Nu validatorのコンテナイメージである
ghcr.io/validator/validator:latest
をローカルで走らせて、 これをw3c_validators
のW3CValidators::NuValidator
から使う場合は、以下ようにuriを指定してnewすれば動きます。ちなみに、ローカルで走らせたNu validatorに切り替えたところ実行時間がだいぶ減りましたので、
w3c_validators
が遅いと感じている方はローカル実行を試すと良いかもしれません。慣れればコンテナを走らせるのはサクッと出来ますよ。