uasi さんはインスタンス qiitadon.com のユーザーです。アカウントさえ持っていればフォローしたり会話したりできます。 もしお持ちでないなら こちら からサインアップできます。

勝手に負債返済週間をやっていっています

Qiita の CoffeeScript と Flow を全部 TypeScript にした😂

Qiita の Ruby を2.4.1から2.6.3に上げた😂

Gigalixir gigalixir.com

Elixir に特化した PaaS。

- Heroku などと違ってインスタンスの日次再起動をしないためインメモリ DB を問題なく使える
- リモートコンソール、分散クラスタリング、ホットアップグレードなど OTP の各種機能に対応
- 月額$10から。 1 app & 1 db まで無料
- インフラは Google Cloud らしい。

読んでない:How Reddit ranking algorithms work medium.com/hacking-and-gonzo/h

Reddit のランキングアルゴリズムの紹介。

そういえば Reddit 本体のソースコードはオープンソースではなくなってしまったのだった reddit.com/r/changelog/comment

読んだ: Pythonのhttp.serverを利用してWebスクレイピングのunittestを書く - Stimulator vaaaaaanquish.hatenablog.com/e

タイトル通りの内容。

読んだ:PythonでWebスクレイピングする時の知見をまとめておく - Stimulator vaaaaaanquish.hatenablog.com/e

話題:

- 各種スクレイピングフレームワーク
- URL パーサとか非同期 IO とかの関連ライブラリ
- クローラの非同期テスト
- 法律まわりの話:著作権法と動産不法侵入
- 参考書籍

読んだ:Webアプリケーションのキャッシュ戦略とそのパターン / Pattern and Strategy of Web Application Caching // Speaker Deck speakerdeck.com/moznion/patter

よく使うキャッシュ戦略に名前をつけて呼んでる話がよかった。

- Broker パターン:キャッシュになければ一次ストレージから取り出しつつキャッシュにも入れる
- Inventory パターン:キャッシュになければデフォルト値で済ませ、非同期ジョブで一次ストレージからキャッシュを生成する
- Warmer パターン:コンテンツ生成時にキャッシュも生成する
- Pool & Flush パターン: write リクエストをキャッシュに溜めて、あるタイミングで永続化する

CUI のエディタがクラッシュするなどしてターミナルの表示が崩れたときは stty sane で直る

curl に URL のリストを与えて一括ダウンロードするにはリストを curl config 形式で書く:

# conf.txt
url = "http://example.com/image1.jpg"
url = "http://example.com/image2.jpg"

curl --remote-name-all -K conf.txt

--remote-name-all 重要。

ちなみに、1行1 URL のリストを curl config 形式に変換するには

sed 's/.*/url = "&"/' urls.txt > conf.txt

アスキーアートでダイアグラムを描くと SVG に変換してくれるオンラインエディタ Svgbob。よくできてる ivanceras.github.io/svgbob-edi

JSON のデータ構造を変形する JavaScript ライブラリをオンラインで試せる playglound selecttransform.github.io/play

PostgreSQL 10でバージョン番号のスキームが x.y.z から x.y に変わってバージョン番号に依存するコードの互換性に影響があるらしいが、 LLVM みたいに x.y.z から x.0.y にすりゃよかったのにと思う

で readonly な関数を unset -f するとエラーが出るが unset だと正常に unset できる。いいのかそれで

$ fn1() { :; }
$ readonly -f fn1
$ unset -f fn1
bash: unset: fn1: cannot unset: readonly function
$ declare -F | grep ' fn1'
declare -fr fn1
$ unset fn1
$ declare -F | grep ' fn1'
$

で親 Bash プロセスから export された関数をすべて unset する:

while read -r fn; do
unset -f "$fn"
done \
<<< $(declare -F | awk '$2 == "-fx" { print($3) }')

readonly にした関数を export しても子プロセスでは readonly にならないので気にしなくてよい。

で定義済みの関数名を一覧にするには declare -F を使う。

$ fn1() { :; }
$ fn2() { :; }
$ export -f fn2
$ fn3() { :; }
$ export -f fn3
$ readonly -f fn3
$ declare -F
declare -f fn1
declare -fx fn2
declare -frx fn3

Git 管理下のファイルの履歴を遡るツール DeepGit を試している。 git blame を強化したようなもので、ある行を誰が書き換えたか、書き換える前はどうだったか、さらにその前は……と次々に辿れて便利。 syntevo.com/deepgit/

Phoenix サーバを起動しつつインタラクティブシェルを開くには iex -S mix phx.server 。立っているサーバに後からシェルを接続するには、サーバを elixir --sname foo@localhost -S phx.server で起動しておいて iex --sname bar --remsh foo@localhost とする。 @localhost はこの通りに指定しないとシェルが起動時にクラッシュする。 cookie が必要なら --cookie xxx で与える。

メモ: Phoenix の phx.server コマンドでサーバを起動したとき、リスンしているポートをアプリケーション内から取得するには

:ranch.get_port(MyAppWeb.Endpoint.HTTP) # or HTTPS

とする。ソースはこのへん github.com/phoenixframework/ph

調べた手順:
- ranch のリファレンスで get_port/1 を見つけた ninenines.eu/docs/en/ranch/1.3
- ワーキングツリーの deps/ 以下に展開された phoenix のコードを書き換えて ref の値をプリントするコードを仕込んだ
- mix deps.compile
- iex -S mix phx.server でサーバを起動して :ranch.get_port(MyAppWeb.Endpoint.HTTP) を実行し、ポート番号が返るのを確かめた

RuboCop の Lint/RescueWithoutErrorClass cop 違反をざっくり直すコマンド(エラークラス指定なしの rescuerescue StandardError に書き換える)

rubocop --only Lint/RescueWithoutErrorClass \
| grep -E '^[^ ]' \
| perl -E 'while (<>) { /(^[^:]+):(\d+)/; say q(sed -i "" -e "${2}s/rescue/rescue StandardError/" $1); }'

後置 rescue に誤爆するので適宜直す必要あり。