ヤクの毛刈り刈り

yakをshavingしたり、本を読んだり

「Clean Coder」を読んだ

タイトル

Clean Coder プロフェッショナルプログラマへの道

Clean Coder プロフェッショナルプログラマへの道


Clean Coder プロフェッショナルプログラマへの道
 

なぜ読もうと思ったか

WEB+DB PRESS Vol.108|技術評論社 の懸賞みたいなアレで当たったから。こういうの全然当たったことないから妙に嬉しかった。

 

書評というか感想

一言で言うと

面白い。金言詰まってる。技術書ではなくて、プロのプログラマであるためにはどうすればいいかという心構えや振る舞い方、どういう技術を身につけるべきかといった指針を示してくれる。エッセイというか。あとRobert C. Martinの昔の苦労話が面白いし、誰しも初心者から始まるのだという希望と勇気をくれる。久しぶりに楽しくスラスラと本を読んだ気がする。


感想箇条書き

  • 第1章の最初の方でもう耳が痛かった。「プロ意識とは、自分で責任を取ることに他ならない」「書いたコードはすべてテストしなければならない」「容赦ないリファクタリング」「君のキャリアの責任は君にある」etc.. とにかく名言にあふれている
  • 「プロのプログラマは自分の時間に練習する。」これに全て詰まっている気がした
  • 「スキルを磨くのは自分の責任であり、雇用主の責任ではない」はい。すみません
  • さりげなく自分が作ったライブラリをおすすめしていてちょっと笑った
  • 第9章 時間管理、第10章 見積もりあたりは結構具体的かつ実用的なことが書いてあった
  • この本に書かれている内容はある種の理想。当たり前だけど現実とのすり合わせが必要
  • 内容は割と過激な方だと思う。誰でも何箇所かは同意できない部分もありそう。それでいいと思うけど
  • 著者の自分語りがかなり多いので、楽しめない人には向いてないかも。自分にとっては面白かった。1970年代のプログラミングがどんなだったかみたいな話とか、興味深さしかない

 


読んだ後どうするか

モチベーションが上がったので、「自分の時間に練習する」ために何か作り始めようと思う。というか始めた。あとは「週〇〇時間」といった感じで継続して取り組めるような仕組みを作りたいところ。
あと、すべてのソフトウェアのプロが備えるべき最低限のことというのが挙がっていたので、最低限になれるよう勉強する。


その他

「Clean Code」と名前が紛らわしすぎると思う。Clean Codeだと思ってこの本を読んだら怒りで発狂することであろう。南無三。
 

 

 

Rubyで配列の全要素に対する繰り返し処理の「正しい」書き方(Ruby 2.6.0 Ver.)

久々にRubyを触っていて、色々調べることが多い。

この間見つけた10年前のstack overflowがなんとなく面白かったので適当に言及してみる。「Rubyで配列の全要素に繰り返し処理する正しい方法はなんですか?」

stackoverflow.com   上から二番目の回答が好きなので、適当に訳してみる。

多分「正しい」方法はないんじゃないかな。イテレート(反復)の方法はたくさんあって、それらは適材適所だからね。

  • each は色んな場面で使えるよね。インデックスとかどうでもいいことが多いし。
  • each_ with _index は Hash#each に似てる。値とインデックスを扱える。
  • each_index はインデックスだけ。あんまり使わない。"length.times"と同じだね。
  • map はイテレートするもう一つの方法。配列を別の配列に変換したいときに便利。
  • select は配列の一部を抜き出してイテレートしたいときに使うやつ。
  • inject は全要素の和とか積を出すのに便利。あとはある一つの結果にまとめるようなとき。

なんかたくさん覚えなきゃいけないっぽいけど、心配ない。別に全部覚えなくてもなんとかなる。ただ、複数の異なるやり方を覚えてそれを使い始めれば、コードがより綺麗になる。そしてそれは、Rubyをマスターする道のりの一つでもあるんだ。 


どんな言語でもイテレート処理は微妙に違うので、こういうシンプルかつ適切なアドバイスができる人はすごくいいなあと思う。新しい言語を触るときにこういう記事があるととても助かる。(どうでもいいけど、injectよりreduceの方がしっくりくるんだけどな…と思ったらエイリアスされてるらしい。よかった)


ところで、この回答がされたのは2008年12月。当時のRubyの最新バージョンはいくつだろう。Release Noteを見てみると、どうやらRuby 1.9.1-preview1が最新で、普通に考えたらRuby 1.8.7-p72がプロダクションで使える実質最新版だったと思われる。

つまり、この回答にはRuby 1.9以降で追加されたメソッドが考慮されていない。Rubyに詳しい人ならそんなの当たり前だろという感じかもしれないが、僕みたいな未熟者はリファレンスを見ないと安心できないので、Arrayクラスと親のEnumerableクラスのメソッドを確認してみる。

プログラミング言語 Ruby リファレンスマニュアルのArrayとEnumerableのページについて、Ruby 1.8.7Ruby 2.6.0を比較してみる。2.6.0にのみ存在するメソッドは以下の通り。

# Arrayクラスのメソッド
append
push
bsearch
bsearch_index
difference
dig
filter!
select!
to_s
keep_if
max
min
prepend
unshift
repeated_combination
repeated_permutation
rotate
rotate!
sample
sort_by!
sum
to_h
union

# Enumerableクラスのメソッド
chunk
chunk_while
collect_concat
flat_map
each_entry
each_with_object
filter
grep_v
lazy
slice_after
slice_before
slice_when
sum
to_h
uniq

この中で配列の全要素探索に関係しそうなのはeach_with_object、sum/max/minあたりだろうか。

each_with_objectはinjectに似ているけどチョットチガウ的な感じ。https://blog.arkency.com/inject-vs-each-with-object/にいい感じの解説が書いてあった。個人的にはExample 2がわかりやすいと思う。(Example 1はなんかこう、それmapでええんちゃうの…と思ったので)

sum/max/mixは、この辺使えば全探索はいらないよという感じ。シンプルに便利。特にsumについては、上の記事で「総和はinjectで出せるよ」と書いてあるものの、sumの方がinjectで足し合わせるより早いらしいので覚えておくべきだろう。というかむしろ、以前はわざわざ全要素探索して加算や比較しないと出せなかったのかな。C言語かよ。もともとRuby 1.8を使っていたけど全然覚えてないな…。



まあそんなわけで、Ruby 2.6.0で配列の全要素探索するときは以下の7個+3個くらいのメソッドをおさえておけばよさそうです。なんか足りてなかったら誰か教えてください。

全探索

  • each:インデックスいらないとき
  • each_with_index:インデックスほしいとき
  • each_index:インデックスだけほしいとき
  • map:別の配列に変換したいとき
  • select:一部の要素だけ抜き出して全探索したいとき
  • inject (reduceでも可):全探索しながら結果を積み上げたいとき
  • each_with_object :初期値ありでmapみたいなことがしたいとき(※個人の意見です)

以下を使えば全探索が不要になるよ

  • sum
  • max
  • min



補足:バージョン間のメソッド一覧差分の出し方

リファレンス上でいい感じに見れるかと思ったけどなんか無理っぽかったしGithub上でdiffを見ようにもちょっと辛かった。ので、リファレンスの目次のメソッド一覧をコピペした上でこんな感じのことをした。Macです。

# 1.8.7のメソッド一覧をコピペ
pbpaste | sed -e 's/ /\'$'\n/g' > rb_array_1.8.7
# 2.6.9のメソッド一覧をコピペ
pbpaste | sed -e 's/ /\'$'\n/g' > rb_array_2.6.0

# 2.6.0にだけあるメソッドの一覧表示
diff rb_array_1.8.7 rb_array_2.6.0 |grep '>' |sed -e 's/> //g'

もっと簡単な差分の出し方があったら誰か教えてください。



蛇足

https://docs.ruby-lang.org/ja/2.6.0/class/Array.htmlインスタンスメソッド一覧、アルファベット順に並んでると見せかけてunshift だけ真ん中の方にあるのはなぜだろう。誰か教え(略)

「初めてのJavaScript 第3版」を読んだ

タイトル

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発


初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

 

なぜ読もうと思ったか

JSについては大概ネット上の情報とプロダクトやライブラリのコード読んで身につけてきており、そういえばJSの本って読んだことないな〜と思っていた。オライリーからES6完全対応の本が出たら買おうと思っていて、発売してすぐに購入した。

以前に一度読んではいたが、復習のためにもう一度読もうと思った。


書評というか感想

一言で言うと

良い本。Webサイトに動きをつけるツールとしてではなく、一つのプログラミング言語としてしっかり解説されている。ES6(ES2015)についても丁寧に書かれていてタメになった。

感想箇条書き

  • 言語としてのJavaScript(ES6)入門にオススメしたい良本
  • 逆にブラウザ操作についてはあまり載っておらず、一章分の解説があるのみ。あとjQueryの章もある
  • Node.jsについての章もあるが、若干内容が古いので注意(import/exportとか載ってない)
  • ES2016, 2017については付録のみ。ただ付録にasync/awaitの使い方とかは載っている

実はよく分かっていないところ

Promise。難しい。ライブラリとかでPromise返してくるメソッドを利用することは問題ないけど、自分で実装できるかというと微妙。理解が怪しい。経験上async/awaitとPromise.allが使えればなんとかなるのだが、もう少し内部構造を正しく理解したい。14章を繰り返し読む必要がある。


読んだ後どうするか

自分用にたくさんメモを取ったので、フロントエンド開発時に役立ちそう。
あとはMDNのJSリファレンス(JavaScript | MDN)を改めて読もうと思った。
あともう一冊くらい適当な技術書を読んでみたい。なんとなく。

 

「PHPはどう動くのか」を読んだ

まえがき

積ん読消化の手引きが書かれた素晴らしい記事を読んだので、実践してみようと思う。
note.mu

自身の備忘録&読書のモチベーション向上、あとは自分の感想を見て参考にしてくれる人が世の中に1人でもいたら嬉しいという心持ちです。


タイトル

PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石

PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石

PHPはどう動くのか 〜PHPコアから読み解く仕組みと定石


なぜ読もうと思ったか

職場の先輩がオススメしていたし、前から気になっていたから。
Kindle版を買って、通勤時間とかで読んだ。


読了した感想など

一言で言うと

PHPの言語処理系についての入門書的立ち位置と思われる。良い。すごく良い。ただし、より深く追うためには自分でソースを読んだりPHPマニュアルを見る必要がある。当たり前か。

感想箇条書き

  • PHP内部のことについて色々知れる。面白いしみんな読むべき
  • オペコードそのものの解説とかはないので詳しいことは自分で調べる必要がある
  • PHP7はなぜはやいのか、の章が一番良かった。
  • 文字列構造体とかが持っているコピーオンライト判定用のzend_refcounted構造体の変数名がgcなのがいいなと思ってにやっとしてしまった(気持ち悪い)
  • メモリを富豪的に使うことでパフォーマンスを向上させるアプローチが随所に見られた。ソフトウェアもハードウェアとともに進化していくといういい例だと思った
  • 自分の無知を噛みしめる良い機会になった

実はよく分かっていないところ

PHP7のHashTableの構造が微妙によく分からなかった。Bucketのリストはどう持ってるのやら。
あと、「第7章 Zend Engineをハックする」はほぼ流し読みしかできていない。いつかもう一度読みたい。というか、この章は読むだけだと眠すぎる。ちゃんと写経して動かした方が良さげ。


読んだ後どうするか

第1〜3章および第5章の内容を心に留めて、なるべくパフォーマンスの良いプログラムを書けるよう意識する。内容忘れそうなので1章と2章は繰り返し読みたい。
また、PHP7へのバージョンアップを推進するときの材料が増えた。
あとはPHP: PHP のコア: ハッカーの手引き - Manualを読んでみようという気持ちになった。

CakePHPでComponentディレクトリ直下以外に置いたComponentを読み込む方法

タイトルの通り、src/Controller/Component/ 直下以外の場所にComponentを置いてControllerからloadしたい場合。なぜか公式にやり方が書いていなかったのでメモ。

バージョン

CakePHP 3.x

書き方

例えばsrc/Controller/Component/SubDir/AbcdComponentをloadしたい場合は以下のように書けば良い

// In Your Controller
$this->loadComponent('Abcd', [
    'className'=> '\App\Controller\Component\SubDir/AbcdComponent'
]);

備考

上記でちゃんと動きますが表記が冗長な感じですし、公式に載っていないということはおそらく推奨されていないということなので、大人しくComponent/直下に置きましょう。Componentの数が増えたりNamespaceを切りたいということであればPluginにしてしまうのが良さそうです。

JSでモジュール化するならとりあえずこれ、ってやつ

普段書かないNode.jsをたまに書くと、モジュール化のやり方を思い出せなくて困る。

ググると詳細な解説記事がたくさん出て来るが、やり方がいくつかあって結局どれか悩むので、自分用にメモっておく。

基本的には既存コードやライブラリに合わせて書くのがよいが、選択肢は二つ。ES6で追加されたネイティブのimport/exportか、module.exports/requireのどちらか。2018年時点ではmodule.exportsで書かれたコードが結構多い気がするので、とりあえずこちらを使うことにする。

// module_sample.js
function hello() {
  return "Hello, Module!";
}

module.exports = hello;
// require_sample.js
function hello() {
  return 'Hello, World!';
}

const module_hello = require('./module_sample.js');

console.log(hello());
console.log(module_hello());
$ node require_sample.js

#=> Hello, World!
#=> Hello, Module!

複数の関数をエクスポートしたいときはオブジェクトのプロパティに突っ込む感じで。

// module_object.js
module.exports = {
  hello() {
    return "Hello, Module Object!";
  },
  bye() {
    return "Bye, Module Object.";
  },
};
// require_sample2.js
function hello() {
  return 'Hello, World!';
}

const module_object = require('./module_object.js');

console.log(hello());
console.log(module_object.hello());
console.log(module_object.bye());
$ node require_sample2.js

#=> Hello, World!
#=> Hello, Module Object!
#=> Bye, Module Object.

その他メモ。

  • オブジェクトのエクスポート時はexports.hello = function(){...} とも書けるけど別にmodule.exportsでいい気がする

  • ブラウザ上のJSでこの構文を使いたい場合はwebpack等が必要

  • ES6ネイティブのexport/importが近いうち主流になる。すでに有名ライブラリ等はこちらになってきている

  • その他の方法(AMDとか)を使うメリットはおそらくないので使わない

ブログ作った

技術っぽいことやぽくないことなどをアウトプットしたいと思い、ブログを作ることにした。しかし、選択肢が複数ありずいぶん悩んだ。具体的には下記のようなフローで意思決定をした。

  • 勉強を兼ねて、なんか新しい技術を(無駄に)ふんだんに使ってブログを構築しよう!無駄にSPAにしてPWAにしてdev.to並みの爆速サイトにしよう!Reactかな…裏はBFF…API Aggregation…SSR…ワクワク…
  • いや待て、そんなのやったことないしいつ出来上がるか分かったんもんじゃない、とりあえずRailsとかの慣れた技術スタックでサクッと作ったほうがいいのでは
  • いやいや、よく考えたら動的である必要すらないのだから静的サイトジェネレーターでええやん。Jekyllとかいうのがあった気がするぞ
  • てかWordPressにすれば一瞬で構築できるやん。AWSWordPress入ってるイメージみたいなのあった気がするし
  • と色々考えたけど、目的は「ブログを書くこと」であって同時に色々やろうというのは良くない。純度が低い。純度が大切。純度を高めよう。手間を最低限におさめるには…普通に適当なブログサービス使うよね普通に。ええ。

てな訳でこんにちははてなブログ。これからよろしく。

今の所、決まっているのはブログタイトルのみ。ブログのコンセプトとかどんなカテゴリの記事書くとかなーんにも考えてないけど、とりあえず自分と誰かもう一人くらいが読んでくれたらいいやという思考で何かしらアウトプットしていく所存。最近アウトプット筋が大分落ちている気がするので、徐々に取り戻していかねば…。