bouzuya.hatenablog.com

ぼうずやのにっき

2018-W50 ふりかえり

2018-W50 をふりかえる。

2018-W50 の目標 とその記事

目標。

  • [x] bouzuya/purescript-react-basic-bbn-viewer 1.0.0 をつくる
  • [x] bouzuya/yzrh のコマンドライン解釈部分をつくる
  • [x] GeoJSON を調べる

記事。

目標。達成。 bouzuya/yzrh から切り出した bouzuya/purescript-bouzuya-command-line-option-parser についてはまだ書いていない。 GeoJSON はコードとして残っていないのがいまひとつ。

つくったもの

2018-12-10/2018-12-16

今日は mockmock.dev #194 で purescript-react-basic-set-position 0.1.0 をつくった。いつもの purescript-react-basic と react-leaflet を使ってみた。 1.0.0 の際に改めて書こうかな。

black-sam blog.bouzuya.net bouzuya.net cookie-storage あたりは GitHub からの security alerts への対応。毎日すこしずつ対応している。

毎日 PureScript の標準っぽいパッケージのソースコードを読んでいる。理解はできていない。

よんだもの

  • 『エンジニアのための時間管理術』 (2018-12-12)
  • 『王とサーカス』 (2018-12-13)

『エンジニアのための時間管理術』を読み終えたので 2018-12-05 に買った本を読んでいく。次は『定理証明手習い』。ざっと読む予定。

みたもの

  • 『キング・オブ・エジプト』 (2018-12-10)

2018-05 から週 2 本の制限がある。今週は問題なし。

その他

ゲーム。 2018-10-14 からのダンジョンメーカーを続けている。あとは 2018-11-24 からの BLUE REVOLVER 。 BLUE REVOLVER はノーマルをノーコンティニュークリアした (2018-12-14) 。次はハイパーのクリアを目指す。

体調。手首の痛みがひいている。ストレッチを続けている。立位体前屈で手のひらがしっかりつくようになってきた。

育児。寝返りしそう (何週も書いている) 。昨日あたりから調子が悪いようで鼻水まみれだ。

『エンジニアのための時間管理術』 (2018-12-12) もあって毎日の時間管理を見直している。特に 2018-12-09 にも書いた「毎朝その日の計画を立てる」ものが大きい。また 2018-12-15 に書いたようなちょっとしたスクリプトも増やしていくつもりで居る。

2018-W51 の目標

  • bouzuya/purescript-bouzuya-command-line-option-parser のことを書く
  • bouzuya/purescript-react-basic-set-position の 1.0.0 をつくる
  • bouzuya/yzrh の 0.1.0 をつくる
  • PureScript から GeoJSON を操作する何かをつくる
  • purescript-react-basic の element のことを書く
  • w010 のことを書く
  • 髪を切る

いろいろやろうとしてどれもできていない

いろいろやろうとしてどれもできていない。「二兎を追うものは一兎をも得ず」な状態。それでもやろうとしたこと・できたことを書いておく。

今日は Google Tasks API を使って TODO をエディタへコピーできるようにした。

リポジトリは公開していないけど動いている。公開していない理由はサンプルコードとの差異が少ないこと・自分の用途に特化していること・ JavaScript の公開リポジトリを増やしたくないことなど。双方向の読み書きができるところまでを PureScript で書いたら公開する。

ちょっとしたスクリプトだけど実用性は高いと思う。ぼくがぼくの必要にせまられてつくっているのだから当然だ。『エンジニアのための時間管理術』 (2018-12-12) を読んでから毎朝 TODO リストとカレンダーを見ながらその日の計画を立てている。検討時にテキストエディタでメモしたい。データを相互に連携したい。でもできていない。そのつなぎ目をなんとかしたかった。


GitHub からの security alerts に対応している。 1 日 1 リポジトリでも対応しようとしている。今日は bouzuya/black-sam に対応した。 bouzuya/mr-jums も対応しようとしたのだけど webpack v2 -> v4 移行など気の滅入るものが出てきたので諦めた。


週目標にある GeoJSON の件を進めている。一応リポジトリをつくって書いている。書いては消し……という状態。 PureScript におけるデータの型をどうすべきか分からないで居る。 Record をうまく使ったほうがいいんじゃないかとか。 GeoJSON で言うとユーザーが自由に追加できるプロパティをどうするか……とか。

答えにたどりつけるかは分からないけど PureScript のソースコードを読み進めていこうと思っている。ただ適当に開くと使い方がピンと来ないようなものが出てくる。レベル差を痛感する。


明日の mockmock.dev では leaflet を試してみようかな。午前中である程度は試しておきたいな……。

bouzuya/purescript-react-basic-bbn-viewer 1.0.0 をつくった / BLUE REVOLVER のノーマルをクリアした

bouzuya/purescript-react-basic-bbn-viewer の v1.0.0 をつくった。

これは mockmock.dev での『毎週 v0.1.0 (仮) 』 (2018-12-03) の続きだ。 mockmock.dev #193 の成果にあたる。過去の成果は↓。

bbn: blog.bouzuya.net のための viewer だ。 input に日付を入れて OK を押すと記事が表示される。実用性はない。

実装。 PureScript で書いている。パッケージマネージャーに npm と purescript/psc-package を使っている。 npm initializer として bouzuya/create-purescript-react-basic を使っている。 UI には lumihq/purescript-react-basic 経由で React を使っている。その他の詳細はリポジトリを参照すると良い。

今回は Markdown (HTML の文字列) をどう表示するかで困った。それについては 2018-12-13 に書いた。 refasync を組み合わせている。たぶんもっと簡単な方法があると思う。

SSRCSS はなし。そのあたりは今後の『毎週 v0.1.0 (仮) 』でやっていきたい。


BLUE REVOLVER のノーマルをノーコンティニューでクリアした。 2018-11-28 と同じ VAL / パワー / ハイパーレーザーのデバイス設定。 16 時間ほど。

実を言うと昨日の時点でクリアしていた。フリープレイが On になっていたため実績解除されなかったので今日も改めてクリアした。昨日のクリア時点で残機 2 と余裕でクリアできていたけど今日やったらギリギリだった。

良いバランス。次はハイパーのクリアを目指す。

purescript-react-basic で dangerouslySetInnerHTML / 『王とサーカス』を読んだ

purescript-react-basic で dangerouslySetInnerHTML っぽいことをしようとした話。

Markdown を HTML (String) にして表示したい。

しかし purescript-react-basic には React の dangerouslySetInnerHTML に相当するものがない。 https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml

そこで代わりに Element を得て innerHTML に設定したい。

しかし purescript-react-basic には Element を得るための関数がない。そこで React.Basic.DOM.Components.Refref を使って Node を得る。それから Web.DOM.ElementfromNode を使って NodeElement にする。

Element は得られた。

しかし purescript-web-dom の ElementinnerHTML がない。 https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML

そこで innerHTML に設定する関数 unsafeSetInnerHTML を定義する。

foreign import unsafeSetInnerHTML :: String -> Element -> Effect Unit
"use strict";

exports.unsafeSetInnerHTML = function (s) {
  return function (e) {
    return function () {
      e.innerHTML = s;
    };
  };
};

この unsafeSetInnerHTML を呼び出したい。

しかし ref :: (Maybe Node -> JSX) -> JSX では Effect が動かせない。

そこで React.Basic.Components.Asyncasync で実行する。

async :: Aff JSX -> JSX

ソースコードのコメント (※ドキュメントには書かれていない) によると async は再描画が動かないようなので React.Basickeyed で wrap してやる。

-- , didUpdate: No! Implementing `didUpdate` breaks the
--               Aff/Component lifecycle relationship.
--               To update the Aff over time, wrap this
--               component with `keyed`.

keyed :: String -> JSX -> JSX

……で出来上がったものがこれ。

, Ref.ref
    (\nodeMaybe ->
      fromMaybe JSX.empty do
        node <- nodeMaybe
        element <- Element.fromNode node
        pure
          (keyed
            self.state.article
            (Async.async do
              liftEffect
                (unsafeSetInnerHTML
                  (Markdown.toHtmlString self.state.article)
                  element)
              pure JSX.empty)))

https://github.com/bouzuya/purescript-react-basic-bbn-viewer/blob/c857bf88fb2514c81ecb8c2752de70f72ddc6618/src/Component/App.purs#L108-L121

Markdown を HTML にしてから innerHTML へ設定したかっただけなんだ……。それがこの「しかし……」「そこで……」の繰り返しときたもんだ。


米澤穂信さんの『王とサーカス』を読み終えた。

さよなら妖精』 (2018-12-04) の大刀洗さんが主人公だ。物語としての繋がりはない。フリーの記者になっている。舞台はネパール。

「だが私は、この国をサーカスにするつもりはないのだ。もう二度と」

主人公が登場人物のひとりから言われたもの。サーカスという「演し物(だしもの)」として消費してくれるなという意味だ。

報道に対する姿勢。誰かに何かを伝えること・伝えないことの選択。インターネット・ウェブ・パソコン・スマートフォンなどの登場で個人の発信力が強化されている。個人の単位でもこういう報道に対する姿勢のようなものを考えることの重要性は増しているんだろうな……。

こんなことを書くのは『コモンズ』 (2018-12-06) を読んだせいもあるのだと思う。まさに↑の個人の強化を背景とした変化について書かれていた。個人が創造・発信する機会を得た時代におけるコモンズの重要性。それを殺すようなコントロールへの警鐘だ。

伝えることができるからには考えないといけないのだろうな。

『エンジニアのための時間管理術』を読んだ / ルミナリエに行った / BLUE REVOLVER 進捗

エンジニアのための時間管理術』を読んだ。

ぼくにぴったりの本ではなかった。どことなく雑多で焦点もあわない感じ。 PMBOK / GTD / ポモドーロ・テクニックなどの過去に読んだものを改めて読みたくなった。

目次

  1. タイムマネジメントの原則
  2. 集中と割り込み
  3. ルーチン
  4. サイクルシステム
  5. サイクルシステム: 作業リストとスケジュール
  6. サイクルシステム: カレンダーの管理
  7. サイクルシステム: 人生の目標
  8. 優先順位
  9. ストレスの管理
  10. 電子メールの管理
  11. 時間の浪費
  12. 文書化
  13. 自動化

前半

前半はわかるけど物足りない……。 GTD: Getting Things Done やポモドーロ・テクニック ほどの衝撃がないのは名前の問題だろうか……。

印象に残るのは 6 つの原則とサイクルシステムだと思う。

6 つの原則

6 つの原則。

  • タイムマネジメント情報をひとつのデータベースにまとめる
  • 能力は重要な作業のために温存しておく
  • 日課を定め、それらに従う
  • 習慣やモットーを養う
  • 「プロジェクトタイム」の間は集中力を保つ
  • 日常生活の管理にも仕事と同じツールを使用する

個数・語感・粒度あたりが微妙。それぞれが特におかしいとは思わないけど並べたときの「そうかな……」感はある。

それぞれの感想を書く。

「ひとつのデータベース」というのが PDA で時代を感じる。あとは道具として作業リスト・カレンダー・長期的な目標のリストが出てくるもんだから。「ひとつになってないよね」と思ってしまう。いまだと Google Calendar とそれについてくる TODO リストを使えばだいたい揃うかな。

「能力は〜温存しておく」は「記憶に頼るな記録しろ」って話。記憶は忘れたり割り込みで混乱したり集中の妨げになるからだそう。ぼくはメモ魔だと言われたことが何度かある。記憶力が悪いので常に記録している。

日課は定型化しろってこと。ぼくの「 3 の倍数週の水曜日に髪の毛を切る」みたいな。決めていれば悩む時間を節約できる。

習慣・モットー。これはあまりピンと来てない。日じゃない繰り返しに対してのものっぽいけど。この本での日課・習慣・ルーチンあたりの使い方が最後まで読んでもよく分からないで居る。

集中力を保つ。そうだよね。時間を区切るのもそうすべきだと思う。そのために阻害するものや割り込みを防ごうとする。この本には出てこないけどポモドーロ・テクニックは時間の区切りを極端に意識した方法。集中などいくつかの効果がうたわれている。

日常生活にも。わかるけど難しい場面も多いと思う。業務用とアカウントを分けていたり業務用しかないものもある。

サイクルシステム

サイクルシステム。日々のサイクル。おまけ程度に長期的な視点が入っている。

サイクルシステムでは、作業リストと今日のスケジュールを組み合わせたもの、カレンダー、長期的な目標のリストという 3 つのツールを使用します。

1 日のサイクル。

  1. 今日のスケジュールを立てる
  2. 今日の作業リストを作成する
  3. 優先順位を設定し、スケジュールを組み直す
  4. 計画を実行する
  5. 1 日の仕上げをする
  6. 退社する
  7. 繰り返す

そうだよねという内容ではある。ただ良い名前がついていないこともあるし新しさもないので薄いという印象。スケールは違うけどぼくはプロジェクト管理におけるスケジュール管理で同じようなことをしていると思う。特に WBS: Work Breakdown Structure で細分化された作業をガントチャートの形でスケジューリングしていくあたり。このあたりの流れって基本的 (……というよりは古典的か) だと思っているのだけどどうなのだろう……。

サイクルシステムのカレンダーはきちんと登録しろ以上のことが書いていない。

サイクルシステムの長期的な目標の部分は↑に書いたプロジェクト管理における要求から WBS を起こすあたりに近い。定期的な見直しがある点でちょっと違うけど……。この本ではないし繰り返しだけど。理想と現状とその差である課題がある。課題を解決するための手段・作業を細分化する。細分化した作業をスケジューリングする。このあたりの流れって……。

後半

後半はこれじゃない感が強い。

ストレスの管理は見出しからして関係ない。文書化はドキュメントリポジトリをつくったり Wiki を使えと書いてある。チームレベルの話題だし時間管理って感じではない。

このズレの原因はもともとのタイトルが『 Time Management for System Administrators 』だからじゃないかと思っている。システム管理者のそのチームを含めての時間管理の悩み……みたいなところに焦点を合わせているからだと思う。

電子メールの管理や自動化の章はいやに些末な感じがした。確かにメールは時間を食う虫だけど。些末。自動化は『エンジニアのための時間管理術』とくれば当然出てくるだろう。説明の流れも自然なのだけど。シェルスクリプトや Make の入門書が欲しいわけではない……。

だいたいおしまい。

読みやすさはともかく PMBOK を読めば網羅的かつ汎用的な気がしてきた。スケジュール管理はもちろんそれ以外のリソースも含めてのプロジェクト管理について書かれているので。改めて読んでみても良いかもしれない。


ルミナリエに行った。

時間帯のせいか混んでいた。今年のものは前半に長いアーチ状の屋根がついていた。赤色が多かったように思う。東遊園地のものは円形ではなく開けた形になっていた。

子どもも連れて行ったのだけど明かりのところでキョロキョロしていた。明るいくらいにしか認識していないと思うけど。


BLUE REVOLVER の進捗。 MISSION は STAGE 3 までをクリア (A+ ではない) 。通しはラスボスを残りハイパーレーザー一発まで追い詰めた (ゲージもあった) ものの終了。明日にはクリアできるかな。

bouzuya/yzrh 進捗 Array String 対応

bouzuya/yzrh の進捗。

コマンドライン解釈部分で Array String を使えるようにした。これで複数回のオプション指定ができる。昨日も同じことを書いている (2018-12-10) けど途中だった。

let
  defs =
    { s: stringOption "str" (Just 's') "<STRING>" "string option" "default"
    , b: booleanOption "bool" (Just 'b') "boolean option"
    , m: maybeStringOption "maybe" (Just 'm') "<MAYBE>" "maybe option" (Just "maybe default")
    , a: arrayStringOption "array" (Just 'a') ["<A1>", "<A2>"] "array option" ["a1", "a2"]
    }
-- ...
Assert.equal
  (Right
    { arguments: []
    , options: { s: "default", b: false, m: Just "maybe default", a: ["Hello", "World"] }
    })
  (parse defs ["-a", "Hello", "-a", "World"])

https://github.com/bouzuya/yzrh/blob/fe459a1ec8112229bce3041d2f16d8f766659dcb/test/Bouzuya/CommandLineOption.purs

もちろん yzrh にこの機能が必要な場面はない。

『キング・オブ・エジプト』を観た

bouzuya/yzrh の進捗。ようやくオプションを解釈してからの処理を一部だけ追加。また脱線して Array a (複数回のオプション指定) を取れるように変更している。


『キング・オブ・エジプト』を観た。神との距離感。