種類を減らす、バックアップを増やす

最近、部屋にあるものをどんどんと捨てている。
自分がADDであることに気づいてから、ものの種類を出来る限り減らそうとしている。
複数種類の中から選ぶということが辛いし、あまり多くのものを管理することができない。
ものがたくさんあると、それだけで頭がいっぱいになってしまう。
ものの種類を減らすことで、どこに飛んでいってしまうかわからない自分の思考を、
少しはコントロールできるようになっている気がする。

本も多くを捨ててしまった。
電子書籍に移行することにした。
物理的なものを管理するのが難しいからだ。
電子書籍に埃はたまらない。
何も考えなくても、アプリケーションがなんとなく秩序ある順番に並べてくれる。
電子書籍が普及することで、紙の本の手触りがなくなることを悲しんでいたはずだったし、
今もそう思わなくもないし、自分の能力に対する諦めなのだと思う。

バックアップはたくさんあったほうが良い。
洗剤の詰め替えパックなど、3つぐらい一気に買うようにしている。
そろそろ洗剤が切れそう…という不安感がバックグラウンドに残り、
思考を汚染してしまうのが嫌だ。
買い物に行っても毎回何か買うのを忘れてしまうので、
覚えているときにたくさん買っておきたいというのもある。
昔は、細かく買い物に行って、毎回違うものを試したいと思っていたし、
これも自分の能力に対する諦めの結果だと思う。

本当に興味があるものは、種類があってもある程度管理ができると感じる。
でも、そういうものはあまり多くはない。

どうでもいいものをやたら種類を持って悩んだり、なくなることを不安に感じたくない。
スティーブ・ジョブズとかオバマとか、毎日同じ服を着ていたそうだが、
あれも一つの完成形のように思う。

約束を守る

情報技術者として仕事をしているが、
突き詰めていくと仕事とは「約束をする」「約束を守る / 守れないことを告白して新しい約束をする」というステップを繰り返すものでしかないと考えている。
これは結城浩さんの「人から信頼されるためにはどうしたらよいか」という話にものすごく影響を受けている。

約束を極力しないという戦略をとる人もいて、それも一つのやり方だとは思うが、あまり良いとは感じない。
責任を曖昧にして、問題を直視せずに進め、それが爆発することなく最後までいけばそれでいいのだが、
爆発してしまったときに責任回避のスキルが求められる。
そのあたりの能力が全然ダメなのは自覚しており、そこの勝負に持ち込ませないために、きちんと約束をする。
それに、問題に対しては、どう取り組むかをきちんと決断するのが正道であると感じている。
(「問題を直視しない」というのが人間として正しい反応であるのも理解できる。)

で、だいたい約束は守れないのだが、このときの謝罪は早い方が良い。
あまりにも早すぎると「もう諦めたのかよ」みたいになりかねないが、
謝罪までいかないにしてもやばいと思った時点でなんとなく気配を伝えておくと良く、
相手の反応で、最終的に謝罪でなんとかなる系統の話なのか察しがついたりもする。
自分の場合、ここが一番苦手で、謝るタイミングが遅すぎたり、優先順位を読み違えて修羅場を招くことがある。

約束を守れてない立場で言うのは非常に傲慢だが、
謝罪と期限交渉をすることで相手がやばい人なのかどうかを知ることができるという面もある。
優先順位一切無視でとにかく期限通りやれとガンギレするタイプや、
「一度約束を守れなかったのでこの後のことは一切責任を持ちません!」みたいに言い出すタイプをあぶり出して、
あ、この人には近づかないほうがいいな、という判断をする材料を得ることができる。

もちろん、約束を守って期限通りにやれることが最善であるし、約束を守らなければ信頼も得られないのは言うまでもない。

PostgreSQLのpg_triggerからトリガ情報を取得する

SELECT tab.relname AS テーブル名,
       tg.tgname   AS トリガ名,
       tgf.proname AS トリガ関数名,
       CASE SUBSTRING( tg.tgtype::int::bit(8)::varchar FROM 7 FOR 1 )
            WHEN '1' THEN 'BEFORE' ELSE 'AFTER' END AS 作動タイミング,
       CASE SUBSTRING( tg.tgtype::int::bit(8)::varchar FROM 6 FOR 1 )
            WHEN '1' THEN true     ELSE false   END AS INSERT,
       CASE SUBSTRING( tg.tgtype::int::bit(8)::varchar FROM 5 FOR 1 )
            WHEN '1' THEN true     ELSE false   END AS DELETE,
       CASE SUBSTRING( tg.tgtype::int::bit(8)::varchar FROM 4 FOR 1 )
            WHEN '1' THEN true     ELSE false   END AS UPDATE
  FROM pg_trigger tg
  JOIN pg_class tab on tg.tgrelid = tab.oid
  JOIN pg_proc  tgf on tg.tgfoid  = tgf.oid
 WHERE tg.tgisinternal = false
   AND tab.relname     = '[テーブル名]'
 ORDER BY tab.relname, tg.tgname;

tgtype渋い。全然ドキュメントがない。

stackoverflow.com

The source code says:

41 int16 tgtype; / BEFORE/AFTER/INSTEAD, UPDATE/DELETE/INSERT, 42 * ROW/STATEMENT; see below /

93 / Bits within tgtype / 94 #define TRIGGER_TYPE_ROW (1 << 0) 95 #define TRIGGER_TYPE_BEFORE (1 << 1) 96 #define TRIGGER_TYPE_INSERT (1 << 2) 97 #define TRIGGER_TYPE_DELETE (1 << 3) 98 #define TRIGGER_TYPE_UPDATE (1 << 4) 99 #define TRIGGER_TYPE_TRUNCATE (1 << 5) 100 #define TRIGGER_TYPE_INSTEAD (1 << 6) 101 102 #define TRIGGER_TYPE_LEVEL_MASK (TRIGGER_TYPE_ROW) 103 #define TRIGGER_TYPE_STATEMENT 0