bouzuya.hatenablog.com

ぼうずやのにっき

bouzuya/create-b 0.5.1 等

bouzuya/create-b 0.5.1 をつくった。

create-b は bouzuya/bs のための npm initializer 。

0.5.0 および 0.5.1 の変更点は↓。

  • 変数 day / utc_day / utc_month / utc_year を追加
  • 指定したディレクトリに bbn の記事がなくてもエラーにならないよう修正

軽微な変更。変数の追加はキリがないので外部から JSON などで渡す形にするのが良さそう……。


bouzuya/create-version-module 0.1.2 をつくった。

package.jsonversion を元に Version モジュールを生成する npm initializer 。

0.1.2 の変更点は↓。

  • package.json をカレントディレクトリではなく npm prefix から探すように修正

ちょっとした変更。そんなにすべきこともないので 1.0.0 にしても良かったかもしれない。


bouzuya/yzrh 。 purescript や spago のバージョンアップ。 --help--version の実装など。↑に書いた create-version-module も試している。

0.1.0 にして終わるつもりだったのだけどいろいろあって終わらず。


ABC120 の B 。 B と C の間の壁。 C と D の間の壁。


イミテーション・ゲーム』を観た。チューリングの人がドクター・ストレンジの人だった。


ベビーベッドを移動した。

Array.prototype.concat に注意する

JavaScriptArray.prototype.concat で大きな配列を扱ったときの処理時間を確認した。

AtCoder の 2s 制限において Array.prototype.concat では要素数 105 の配列を前からひとつずつ順に構築はできない。 20s 以上もかかってしまうからだ。なので例えば↓のようなものを書いてはいけない。 a <> [i](<>)Array.prototype.concat を使うので要素数が多いときに破綻する。

f :: Int -> Array Int
f n = MonadRec.tailRec go { a: [], i: 0 }
  where
    go { a, i }
      | i == n = MonadRec.Done a
      | otherwise = MonadRec.Loop { a: a <> [i], i: i + 1 }

Functor ArraymapJavaScript では new Array(n); で事前に確保して a[i] = f(v); していく形で速い。この形がおそらく最速。 []push していくのは次点。 a.concat([i]) を繰り返すのは桁違いに遅い。必要なら PureScript でも STArray などで mutable な Array を使っていく必要がありそう。

細かい気づき。 Array.intercalate "\n" a よりも String.joinWith "\n" a のほうが Array.prototype.join を使うことになるので良さそう。前者のほうが汎用的ではある。

https://pursuit.purescript.org/packages/purescript-arrays/5.2.0/docs/Data.Array#v:intercalate https://pursuit.purescript.org/packages/purescript-strings/4.0.1/docs/Data.String.Common#v:joinWith


ABC122 D 問題はすこし考えて厳しそうだったので今日は ABC120 A 問題に逃げた。簡単でも毎日 1 問は。


水曜日は魚の日。魚を食べた。


子どもの通院。当たり前だけど子ども向けの病院にはいつも子どもが居るなあ。

『ポモドーロテクニック入門』

アジャイルな時間管理術 ポモドーロテクニック入門』を読んだ。

以前にも読んだことがある (2013-02-05) 。なかなか面白い感想が書いてある。「集中するには休むことが必要」という再発見をしたそうだ。ぼくは。まったく覚えていない。意図的にタイムボックスを短く区切っていくところが印象的だったのだろうな。

何にせよ。ぼくはポモドーロテクニックが好きだ。

ひとつには概要の説明が簡単な点で好きだ。

ポモドーロテクニックは、とてもシンプルです。最優先の活動を今日の ToDo シートから選び出し、タイマーを 25 分にセットし、そのアクティビティに集中するだけです。

1 ポモドーロ (= 25 分) というタイムボックスを決める。タイマーが鳴るまでひとつのことに集中する。コアな部分はそれだけだ。

これは極めて具体的な方法だ。それもあって理解しやすい。以前の『エンジニアのための時間管理術』 (2018-12-12) や『はじめての GTD ストレスフリーの整理術』 (2019-03-02) よりも細かい単位で機能する。組み合わせることもできる。

ぼくはいまポモドーロテクニックを厳格には実践していない。ただ似たような行動様式はしばしばとる。

たとえばぼくが本を読むときだ。ぼくはタイマーをセットする。

これはまず読む速さ・読み終わる時間を知りたいからだ。読み終わるまでの時間という全体像が見えると計画が立てられる。一日に何時間読むと何日で読み終わるのかをおおまかにでもつかむことができる。

次に「とりあえず」ではじめられるからだ。はじめの一歩を踏み出せるからだ。先送りせずに 5 分だけ読んでみる。読みはじめると続きが読みたくなることも多い。

そして集中できるからだ。読書というひとつのこと以外を頭の外に追い出すことができる。割り込みがありそうな場合も必要ならメモだけするなどして続ける。タイマーが鳴るまでに別のことをするのは目標を投げ出してしまうという罪悪感が伴う。時間の超過を心配する必要はない。タイマーが教えてくれる。

最後に成果が得られる・見えるようになるからだ。たった 5 分 10 分でも数ページでも進むと達成感が得られる。前述の計画と合わせてゴールに近づいていることを感じられる。

この読書法とポモドーロテクニックには似た部分があると思っている。

自分の見積もりに自信が持てるようになる。はじめの一歩を踏み出せる。余計なことを頭の外に出してひとつのことに集中できる。小さくて確実な成果と達成感が得られる。

本としてどうかは分からないがポモドーロテクニックの要素はいろいろな人に知ってほしいものだなあ。


bouzuya/purescript-at-coder ABC122 の A, B, C を解いた。

C 問題に苦戦した。 Data.Array.ST を使った。欲しくなることが多そうなので慣れておいたほうが良さそう。あと今日も Map を試してダメだった。もうすこし実装を理解して使いたい。

bouzuya/purescript-npm-bin-google-tasks 0.2.0

bouzuya/purescript-npm-bin-google-tasks 0.2.0 をつくった。

google-tasks は Google Tasks の CLI2019-03-17 に 0.1.0 をつくったもの。

0.2.0 では google-tasks task list とそのオプションを追加した。

w010 のものは 1.0.0 にしているけどこれはすこし刻んでみる。


bouzuya/purescript-at-coder 。 ABC121 をひととおり解いた。

C 問題で詰まった。アルゴリズムによるものではなくて PureScript への慣れによるもの。 Array (Tuple Int Int) として解釈したあとソートして先頭から要求数まで取るだけ……なんだけど TLE になってしまう。

こうなるとあらゆる処理が遅いんじゃないかと疑ってしまう。 Data.String.CodePoints が遅いんじゃないかとか。厳密に計測したわけじゃないけどおそらく purescript-precise の HugeInt まわりが致命的だったのだと思う。

Int の範囲を超えてしまう箇所があった。 precise の HugeInt で良いと思って使ったのだけどまずかったようだ。最終的には purescript-bigints の BigInt を選んだ。 precise (HugeInt) → longs (Long) → bigints (BigInt) と移った。ちなみに Longnpm:long を使い BigIntnpm:big-integer を使う。 long は内部で WebAssembly を使っているため Node.js v5 になっている AtCoder では動かない。 long および bigints 採用時には node_modules を含めた bundle をつくらないといけないため bundler が必要になる。 parcel を使って bundle した。

いろいろ準備が足りてない。過去問題を解いていくうちにある程度は慣れると思う。

テストでテキストファイルを読む形に変更した。毎回テストファイルをつくらなくてもデータを置くだけにするのも良いかもしれない。

明日は ABC122 から何問か解く。

2019-W12 ふりかえり

2019-W12 をふりかえる。

2019-W12 の目標 とその記事

目標。

  • ☑ bouzuya/cars-example を TypeScript に移行する
  • ☑ 『追想五断章』を読む
  • AtCoder の過去問題に挑戦する
  • ☐ bouzuya/purescript-npm-bin-google-tasks を進める
  • ☑ 『キャプテンマーベル』を観に行く

記事。

つくったもの

2019-03-18/2019-03-24

blog.bouzuya.net は create-b のバージョンアップに対応したもの。

bs-code は引用機能などを追加した ([2019ー03ー19][]) 。

cars-example は CoffeeScript & JavaScript リポジトリ最後のひとつ。 TypeScript 化した (2019-03-18) 。

create-b はテンプレートの形式を変更した (2019-03-22) 。

create-beater-index は空行で終わっていなかったのを修正。

purescript-at-coder は AtCoder 用のリポジトリ (2019-03-23) 。

purescript-bouzuya-command-line-option-parser は README に類似パッケージをメモした。

create-version-module

今日は mockmock.dev #209 w010 v3 で create-version-module 0.1.0 をつくった (過去のものは bouzuya/w010 を参照) 。 package.jsonversion を実行時に __dirname を使わずに参照したくなった。ビルド時に埋め込むのが良いと考えてそのためのコマンドを書いた。 jq などのコマンドで実現可能ではあるけど jq が入っていないこともあるので。

よんだもの

週 1 本。良い。

みたもの

週 2 本を超えている。悪い。

その他

ゲーム。 2018-11-24 からの BLUE REVOLVER 。停滞中。 2019-01-03 からの大乱闘スマッシュブラザーズ SPECIAL 。停滞中。 2019-03-03 からのモグラーニャ。停滞中。

買い物。先週だが珪藻土のバスマットを買った。

体調。毎日のストレッチを継続している。なんとなくいい加減なのか固くなっている。

育児。子ども服を買った (2019-03-17, 2019-03-20) 。上下が別になっている服を着はじめた。

2019-W13 の目標

  • bouzuya/purescript-npm-bin-google-tasks 0.2.0 をつくる
  • AtCoder Beginner Contest に参加する
  • 2019-03 ふりかえりを書く
  • bouzuya/yzrh 0.1.0 をつくる
  • AtCoder 過去問題を毎日解く

AtCoder Beginners Selection

AtCoder Beginners Selection の問題を解いた。 PureScript で書いたものを JavaScript として投稿した。元のソースコードbouzuya/purescript-at-coder に置いている。

明日の ABC に出るかは分からないけど過去問題を解いていくつもりでいる。毎日何問かは解いていくと良さそうだ。

それとは関係ないけど [2012-06-30][] に『 AtCoder に参加した』というのを書いている。日付からすると ARC005 だろうか……。今回が初登録のつもりで書いていたのだけど実はすっかり忘れていただけのようだ。古いアカウントはどこに行ってしまったのだろう。


コードギアス 反逆のルルーシュII 叛道』を観た。

bouzuya/create-b 0.4.0

bouzuya/create-b 0.3.0 & 0.4.0 をつくった。

create-b は bouzuya/bs および bouzuya/blog.bouzuya.net のための npm initializer (npm init @bouzuya/bnpx @bouzuya/create-b の形で使う CLI) 。

0.3.0 & 0.4.0 の変更点は↓。

  • テンプレート用変数 (utc_date_time & utc_date_time_basic) の追加
  • テンプレートの形式の変更
  • テンプレート指定オプション (--content-template & --meta-template) の削除

テンプレートの形式の変更が大きい。個別にファイルを指定していたのをディレクトリを指定してそこにあるファイルをコピー・変数展開するようにした。

次は変数まわりの挙動を大幅に変えると思う。現状のものは扱いづらすぎるので。

今回のバージョンアップに合わせて bouzuya/blog.bouzuya.net4.9.1 にした。