@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

Homebrewをインストールし直す

Homebrewの再インストール

GitHub - Homebrew/install: 📥 Homebrew (un)installer を見て

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"

Homebrewでインストールしていた諸々も消えたので入れ直します。

fish-shell

brew install fish

PostgresSQL

brew install postgres
~ pg_ctl -D /usr/local/var/postgres start
pg_ctl: another server might be running; trying to start server anyway
waiting for server to start....2020-06-21 01:06:21.086 JST [59996] FATAL:  lock file "postmaster.pid" already exists
2020-06-21 01:06:21.086 JST [59996] HINT:  Is another postmaster (PID 607) running in data directory "/usr/local/var/postgres"?
 stopped waiting
pg_ctl: could not start server
Examine the log output.

起動時に色々言われるので地道に対応します。

rm /usr/local/var/postgres/postmaster.pid
mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/
cd /usr/local/var/postgres/
mkdir pg_commit_ts
mkdir -p pg_logical/snapshots
mkdir -p pg_logical/mappings

Ruby

せっかくなのでrbenvをgitから入れます。

過去に入れたバージョンを一旦逃します。 再インストールするとそれぞれコンパイルする必要があって時間がかかります。

mv .rbenv/ .rbenv_old/
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
set -Ux fish_user_paths $HOME/.rbenv/bin $fish_user_paths
~/.rbenv/bin/rbenv init

インストール済みのバージョンを戻します。

mv .rbenv_old/versions/* .rbenv/versions/.

ruby-buildも入れます。

mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

最新のRubyはHomebrewで入れていたので、rbenvでインストールします。

rbenv install 2.7.1
rbenv global 2.7.1

Ruby 2.6.5を動かそうとすると

~ ruby
dyld: Library not loaded: /usr/local/opt/gmp/lib/libgmp.10.dylib
  Referenced from: /Users/shigerunakajima/.rbenv/versions/2.6.5/bin/ruby
  Reason: image not found
fish: 'ruby' terminated by signal SIGABRT (Abort)

libgmpを求められるので、インストール

brew install gmp

Ruby on Rails

Railsを動かそうとすると

~ rails c
/Users/shigerunakajima/.rbenv/versions/2.6.5/lib/ruby/2.6.0/yaml.rb:3: warning: It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.

libyamlを求められるので、インストール

brew install libyaml

現在のbrew list

~ brew list
fish        gmp     icu4c       krb5        libyaml     openssl@1.1   pcre2       postgresql  readline

再インストール前のも取っておけばよかったな・・・

追記

gitを入れ忘れていました。

brew install git

追記追記

RubyMineのターミナルに教えるrbenvのパスを更新しました。 ~/.config/fish/config.fish にset PATH /usr/local/bin $PATHと書いていたのを、set PATH /Users/shigerunakajima/.rbenv/bin/ $PATHに更新しました。

RubyMineのターミナルが壊れた話 - @ledsun blog

「論理的思考の放棄」をパクる

「論理的思考の放棄」とは

論理的思考の放棄 - 登 大遊 (Daiyuu Nobori) の個人日記 がバズっていたので読みました。 世の中のスーパープログラマーは1日で1万行のプログラム書くことができるようです。 その手法として「論理的思考の放棄」が挙げられていました。 1万行は無理なので、仮に1000行に桁を落として自分に当てはまらないか考えてみました。

彼我の分析

僕には1日で1万行のプログラミングをすることはできません。 登 大遊氏と僕は何が違うのでしょうか?

登 大遊氏をプログラマー風林火山 : 小野和俊のブログ に当てはめると、 「風のプログラマ」で、かつレベルが異様に高いのだと思います。 僕はどちらかというと「山のプログラマ」です。

1万行は途方もなさすぎて無理そうです。ちょっと目標を現実的なラインに落として見ましょう。 目標を1日1000行書ける「風なプログラマ」としてみます。

僕が1000行レベルの「山のプログラマ」と「風のプログラマ」を兼任できたらすごくないですか?すごい。 0から1日で1000行書けて、何かしらのアプリケーションを動かせるようになると結構使い所があるように思います。 それで良いアプリケーションができたら、リファクタリングはどんとこいです。 「論理的思考の放棄」を真似て「風のプログラマ」属性が身についたら良さそうです*1

というわけで「論理的思考の放棄」をパクってみます。

「論理的思考の放棄」を分析

最初、1万行という規模感にとらわれ、「フロー状態」と違う概念かと考えました。 「フロー状態」なら自分だって体験したことあるし、それで自分が1万行書けてないの矛盾じゃん、と考えたわけです。

仮に、1万行を1000行に置き換えると*2リファクタリングならできています*3。 やっぱり「フロー状態」の話なのではないか? リファクタリング中の自分の脳の動きをモニタしていけば「論理的思考の放棄」が理解できるのではないでしょうか?

プログラミング脳をモニタリング

実際にプログラミング中の思考をモニタリングしてみると、ビビると「手を止めて考えよう」と思いつきます。 「ビビる」のは主に手戻りに対してです。 プログラミングしているときに、ちょっとつまると 「この作業を1時間続けても、結局うまく行かなくて、無駄な作業になるのでは?」とビビります。

そこで「上手い設計」を考えようとするわけです。 実際に設計を考えると2時間ぐらいいろんなパターンの設計を比較してみて、結局元の設計でよくて「お、さすが俺。天才じゃん」とか思うわけですよ。 で、満足して1時間プログラミングして完成させます。

下手の考え休み

冷静に考えると、「ビビり」を無視してプログラミングしていれば1時間で終りです。 「2時間設計して、1時間実装する」が「1時間の実装」です。 3倍速いの。 3倍速いなら、仮に今の実装で上手く行かなくても、他の実装を更に2つ試せます。 「下手の考え休むに似たり」って奴です。

「3時間のプログラミング」を「1時間のプログラミング」で済ませようって策なので、「似たり」っていうか「休み」です。「下手の考え休み」です。

なるほど「論理的思考を放棄」して、思いつた実装を片っ端から実装して試した方が速いんです。体力の問題を無視すれば*4。あとは「論理的思考を放棄」無視して、プログラミングしまくってプログラミングの体力をつける*5だけです。

*1:結局、1日1000行の「風のプログラマ」になっても、1日1万行の秘密はわかりません。ですが、同じ「風のプログラマ」になってから、量の差を分析すれば、1日1万行の秘訣はもっと具体的にわかるはずです。

*2:いまのところ1日1万行を達成する必要はなくて、リファクタリングで1日1000行できているのを、0からのプログラミングに転用できる方法が見つかれば良い。ついでにリファクタリングを1日1000行ができる必要条件が緩和できたりとか、2000行に増えたりとかできる方法が見つかったらラッキー

*3:厳密には嘘です。リファクタリングにはソースコードの追加と削除があるので、どうカウントして1日1000行なのかわかりません。

*4:結局のところ「フロー状態を維持する手法」だと思っています。「二の矢を受けず」と同じで、脳がサボるために提案してくるアイデアを却下する手法だと思っています。

*5:「いろいろなプログラミングをディープラーニングして、パターン認識と手癖だけで書けるようになれば、疲れない」だと思います。