2022-03-21

Operations Anti-Patternsの翻訳版が出るのでおすすめする #システム運用アンチパターン

2020年にTwitterで紹介されているのを見つけて読んだ Operations Anti-Patterns の邦訳が4月に出るそうです。
とても良い内容だったので事前におすすめしておきたい。

上層部がDevOpsに理解のない組織で働き、組織構造を変える権限を持っていない開発者であっても、チームにDevOpsを導入するための現実的な方法を紹介します。

重厚な承認プロセス、可視化されていない運用、プロセスの最後でのみ行われるソフトウェアテスト、ノイズだらけのアラート、インシデントから学習しない習慣、時間外のデプロイ、情報のため込みなどを取り上げ、ソフトウェアシステムの開発運用が滞るチームや組織に共通してみられる陥りがちな状況や犯しがちな間違いをアンチパターンとして紹介します。そして管理職やマネージャでなく、エンジニアが実行し、繰り返すことで改善できる具体的な行動を解説します。

組織で必要とされる変化を、エンジニアが行動することで実現する本書は、ソフトウェアシステムをよりよく開発運用したいエンジニア必携の一冊です。
O’Reilly Village/オラの村 - 4月新刊情報『システム運用アンチパターン』

紹介文からつらみが溢れていて良いですねー。「現実的」「具体的」というのは本当にそうで、この本の良いところです。

2021-12-08

golang: 一時的/恒久的なエラーの隙間をハンドリングする

これはGoアドベントカレンダー3の8日目の記事です。

外部のAPIと連携して仕事をするサービスを長年運用・開発しています。 エラーが発生しある仕事が完了できないことがあり、その場合はエラーレポートを見て手動対応します。 なるべく運用負荷を減らすため、エラーの自動対応を進めていく過程で見つけた方針・実装テクがあるので紹介します。

ポイント

  • 一時的なエラー、恒久的なエラーのあいだにはグラデーションがある
  • エラー自身にエラー対応をさせると複雑さが減る


エラーのグラデーション

エラーハンドリングの記事を探すと、func Temporary(err) bool で一時的なエラーか判別してリトライをかますのをよく見ます。 一時的なエラーとは例えばネットワークのTimeoutなど。時間をおけば自動的に回復ししそうなもの。 それ以外はぜんぶ恒久的(Permanent)なエラーとしてレポートを上げてしまう。

実際に運用していると上がってきたエラーにはなにか対応が必要なので手を取られてしまいます。 可能ならば自動対応してエラーレポートしないようにしたい。

運用をつづけていて一時的なエラーと恒久的なエラーのあいだに次のようなエラーの種類があることに気づきました。

  • そのままではリトライしても成功しないけれど、何かの操作をすれば成功する状態に持っていける回復可能なエラー
  • どうやってもリトライ成功にはできないけど、失敗した状況をマシにしたり詳細なレポートを作れるフォロー可能なエラー

単に一時的なエラーかそうでないかだけでなく、これらを区別してハンドリングすることで成功率を上げて手動対応を減らすことを目指します。

区分 自動対応 レポート 説明
一時的 不要
回復可能 不要 なにか操作することで回復可能
フォロー可能 不可 必要 回復不能だがより良い状態に出来る
恒久的 不可 必要



2021-12-04

Clojureで行列計算を実装したときに考えたトリック

これはClojureのアドベントカレンダー2021、4日目の記事です。


趣味でディープニューラルネットワークのフレームワークをClojureでゼロから実装しています。

「ゼロから」とは行列計算から。

deltam/neuro: Deep Neural Network written in Clojure from scratch

そのときに行列計算についてあるトリックを思いついて実装したら早くなったのでそれを紹介してみます。関数的プログラミングっぽい発想で、ほかにも応用が効くかもしれない。Clojureのデータ構造の勘所もすこし分かるかも。

注意:完全なる趣味の行いなので単に行列計算したいだけならそれ用のライブラリを使うほうが100倍かしこい。
実用的な知識というよりちょっとしたトリックを面白がってくれればありがたい。

ニューラルネットの学習では行列の転置をよく使うんですが、プロファイルを取ってみたらそこが遅かったので何とかしたいといろいろやって思いついたトリックです。
思ったより応用が効きました。

2020-12-01

Bangle.js を購入した

Bangle.js というスマートウォッチを買いました。JavaScriptでアプリが作れる Hackable Smart Watch です。

2019-12-01

2つの操作のみで全順列を列挙する:対称群のグラフ上のハミルトン路にもとづく順列生成の紹介と実装

データ構造とアルゴリズム Advent Calendar 2019の1日目の記事です。
2日目は@yurahunaさんによる「三角形分割の数え上げとランダムサンプリング」です。

6月にグレッグ・イーガン氏のHPで見つけた順列生成アルゴリズムについてブログを書きました。
そのあとに元ネタの論文1を読んでいたのですが、おもしろい順列生成アルゴリズムを含んでいたのでGoでライブラリ化してみました。

deltam/perm: Permutation generator based on group theory written in Go

自分のベンチマークでは再帰関数で実装したナイーブなアルゴリズムより33%ほど早いですが、高速さが売りというよりも「順列への最小限の操作セットのみを駆使して順列生成できないか?」という研究の流れから出てきた副産物的なアルゴリズムです。

ただその最小限の操作セットを駆使するアイデアが面白く、最終的に出来るルールが非常にシンプルで実装も短くできるのでアドベントカレンダーに乗じて紹介しようと思います。

まずアルゴリズムの背景となる論文の内容を紹介し、その結果をルール化して順列生成のプログラムを作ります。



2019-06-29

グレッグ・イーガン経由で知った順列生成アルゴリズム

SF作家のグレッグ・イーガンさんは最小超置換文字列の分散探索プロジェクトを主催しています。それ自体も興味深いんですが、解説ページで紹介されていた副産物の順列を列挙するアルゴリズムが面白かったので紹介&実装してみます。

Local Ruleのセクションで解説されている内容の紹介です。)

(追記:順列生成アルゴリズムをライブラリ化しました deltam/perm: Permutation generator based on group theory written in Go.

順列生成アルゴリズム

まず順列の順番を入れ替える写像sigma、deltaを次のように定義します。

sigma: (2,3,4,...,n-1,n,1)
delta: (3,4,5,...,n-1,n,2,1)

始点の順列を(n-2, n-3, ..., 3, 2, n, 1)として、それに対して次のルールAを繰り返し適用します。

ルールA
以下の条件をすべて満たすなら現在の順列にdeltaを適用し、そうでないならsigmaを適用する。

  1. 左端の数字がnではない。
  2. 順列中のnの右隣の数字をrとする(nが右端なら左から2番めをrとする)。左端の数字をfとし、r が 1+(f-2) mod (n-1) と等しい。
  3. 現在の順列が(1, n, n-1, ..., 3, 2)ではない。

(2番めの条件が分かりにくいので具体例を挙げると、順列(3, 1, 2, 4) ならf=3かつr=1で、1+(3-2) mod (4-1) = 1+1 = 2なので r = 1 ≠ 2となります)

始点からルールAを繰り返し適用した系列はすべての順列が一回だけ登場するものになっています。

実験

2018-10-10

カスタマイズしやすい重み付きレーベンシュタイン距離ライブラリをGoで書きました

deltam/go-lsd-parametrized: Weighted Leveshtein Distance and its extended interfaces written in Go.

重み付きレーベンシュタイン距離(編集距離)のライブラリを書きました。文字ごとに追加・削除・置換のコストが指定できます。文字列の長さによる正規化や複数の文字列から近いものを選ぶ関数も含まれてます。

エラーメッセージをラフに分類したいという動機から作り始めました。類型的で機械学習が必須なわけでない分類タスクにお役立てください。
詳しい使い方はGitHubのREADMEを見てください。

go get -u github.com/deltam/go-lsd-parametrized

カスタマイズ


2018-03-13

FitDesk X-2.0を修理した

FitDesk X-2.0というエアロバイクを愛用してます。


デスクが付いているので運動しながら読書をしたりPC作業をしたり便利です。
もう2年以上ほぼ毎日使っているのですが、すこし前からペダリングに違和感を覚えるようになりました。音がうるさくなりペダル回転も引っかかるような感触がします。

エアロバイクの故障について調べてみたら故障の原因はだいたいがベルトかベアリングの破損のようです。私のFitDeskの保証期間はすでに切れていたので何とか自分で修理できないか試すことにしました(安くない買い物だったし)。

検索してみるとFitDesk製造元のYoutubeチャンネルにギアボックスを分解するための手順の解説動画があります。

2015-08-27

SICP問題1.45の回答と説明(SICP1.3.4, ex1.45)

この記事の対象読者:『計算機プログラムの構造と解釈』を読んだことがあって、問題1.45に納得がいってないひと



1.3.4 値として返される手続き (計算機プログラムの構造と解釈 第二版)

SICPの読んでたときにけっこう苦労した練習問題。
n乗根を求めるための平均緩和法の適用回数を「実験して確かめよ」って書いてあるけど、たぶん実験だけでは分からない。回答自体はカンニング(検索)して見つけたけど、なぜそうなのかをちゃんと説明しているのを見つけられなかったので、この記事で説明してみる。


平均緩和法、不動点探索の復習


回答のまえに平均緩和法や不動点探索についておさらいしておきます。

2015-05-26

『コンピュータシステムの理論と実装』第5章 CPUを作ったよ

個人的に進めてる『コンピュータシステムの理論と実装』の実装メモを書きますよ。
今回はCPUを作るのが山場でした。

「第5章 コンピュータアーキテクチャ」ではHackコンピュータというこの本オリジナルのコンピュータを作ります。前章まででALU、レジスタやプログラムカウンタなんかは作ってあるので、それらを組合せてなんとかします。

命令メモリ、CPU、データメモリを合体させるとHackコンピュータになるらしい(P.105、5.3.3)。メモリは前章のRAMを利用すればすぐ作れるので、問題はCPUを作ることです。


P.102に概略図が載ってるのでそのとおりに作るんですが、詳細が省かれてるので実際にHDLで書こうとすると大変でした。この本は実践に重きを置いているので、詳細を省いているのはたぶん意図的です。実装を通じて学んで欲しいということでしょう。

下に私の考えた実装コードを載せますけど、本の思想に忠実に自分で考えたいというひとはネタバレ注意です。(GW中にやったけどハマった部分があって3日ぐらいかかってしまったw)

2015-04-19

AND、ORだけではNOT回路は作れないのか

「コンピュータシステムの理論と実装」読書会のときの疑問を追っかけて考えてみました。

NotとAnd/Orからならすべての論理回路が作れることは分かりました。ではAnd、OrのみからNot回路は作れないのでしょうか?
直感的に「作れない」って感じるんですが、きちんと論理的に説明するのはけっこう難しい気がします。

ではどうやったら説明できるか。

Notは1入力1出力の回路です。まずは入力をaとおきます。最初の入力の可能性としてはa、定数0、定数1のどれかしかありません。
最初の入力から次の出力の可能性は次の表の通りです。やっぱりa,0,1のどれかになってしまいます。

入力1 入力2 And出力 Or出力
a 0 0 a
a 1 a 1
a a a a
0 0 0 0
0 1 0 1
1 1 1 1


つぎに1出力ってことを考えます。And、Orのみで回路を作るならケーブルをまとめる最後の素子はAndまたはOrのどっちかになります。そして回路の最初の入力も次の出力もa,0,1になってるので、最後の出力もやっぱりa,0,1になってしまう。
雑に図解するとこんな感じ。


途中の回路がどんな複雑でもAnd/Orのみなら中間出力も変わらないので、最後の論理素子の入力も変わらない。だから最後までNot aを作ることはできない。


……という説明を考えてみたけど、なんだかすっきりしない。背理法か何かでさっぱりと証明する方法はないのかなー。




追記:ツイートしたら@chiralさんが速攻で返信くれました。だいぶすっきりした!

2015-04-17

#nandris コンピュータシステムの理論と実装 読書会(2) に参加してきました

「コンピュータシステムの理論と実装」は論理回路から順を追ってコンピュータの仕組みを知ろうという教科書です。
Nand回路から初めて論理回路、加算器から機械語、OSや高級言語のコンパイラを経てテトリスを作っちゃおうという、デアゴスティーニでやりそうな構成。

この本の内容はNand2Tetrisというオンライン学習コースで、私はこのTED Talksで知りました。

2014-12-31

素数腕立て伏せ Advent Calendar まとめ #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



ACの経過を一覧表にまとめました。リンク集としてお使いくださいませ。
けっきょく全体の勝率は3割2分でした。

素数腕立て伏せ Advent Calendar 31日目(最終回) #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


最終回じゃー!

31日目
58回で負け(合成数)



負けだけど連続での素数腕立て伏せでは最高の回数だ。30ぐらいでもまだ余裕があったので「イケるかな?」と思ってガンバった。
欲を言えば59(素数)までやって勝ちで終わりたかったけど、まぁいいや。
$ 58 = 3^2 + 7^2 $

Alphaちゃんによると58はIdoneal numberだとのこと。

58 is an idoneal number.
58 - Wolfram|Alpha

日本語でなんていうのか分からなかったけど英語版Wikipediaによるとこんな数らしいです。

In mathematics, Euler's idoneal numbers (also called suitable numbers or convenient numbers) are the positive integers D such that any integer expressible in only one way as x^2 ± Dy^2 (where x^2 is relatively prime to Dy^2) is a prime, prime power, or twice one of these.
(relatively prime=互いに素)

うーむ、こういうことかな。
正整数Dがidoneal numberであるならば、整数x,yによって

\[n = x^2 \pm Dy^2 \]

と書いたとき(ただし$x^2$と$Dy^2$は互いに素)、値nを素数素数のべき乗およびそれらの2倍にできる。
(定義が複雑でよく分からん。これで正しいのか?)


$ 3^2 + 58*1^2 = 67 $で素数ですね。他に適当にemacs lispで計算してみると($58=2*29$なのでxを2の倍数にすると互いに素にならないのでNG)、

(defun idoneal (d x y)
  (list (+ (* x x) (* d y y))
        (- (* x x) (* d y y))))

(idoneal 58 3 2)
(241 -223) ; 241 素数

(idoneal 58 5 1)
(83 -33) ; 83 素数

(idoneal 58 5 2)
(257 -207) ; 257 素数

(idoneal 58 7 1)
(107 -9) ; 107 素数

あれ、なんかすごくないこれ? Wikipediaによるとこの系列には無限個の素数を含んでいるそうです。
算術級数定理と似てるけど等差数列にはならないから違いますね。


idoneal numberは意外にも有限みたいです。
カール・ガウスとオイラーによって今まで65個のidoneal numberが発見されていて、それで全部だと予想されていると。

The 65 idoneal numbers found by Carl Friedrich Gauss and Leonhard Euler and conjectured to be the only such numbers are 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, 18, 21, 22, 24, 25, 28, 30, 33, 37, 40, 42, 45, 48, 57, 58, 60, 70, 72, 78, 85, 88, 93, 102, 105, 112, 120, 130, 133, 165, 168, 177, 190, 210, 232, 240, 253, 273, 280, 312, 330, 345, 357, 385, 408, 462, 520, 760, 840, 1320, 1365, and 1848 (sequence A000926 in OEIS). Weinberger proved in 1973 that at most one other idoneal number exists, and that if the generalized Riemann hypothesis holds, then the list is complete.
Idoneal number - Wikipedia, the free encyclopedia

なんかリーマン予想とも関係あるらしいけど、もう追い切れないので切り上げる!


素数腕立て伏せ一言コメント
とうとうACをやり遂げました(インド標準時とかイラン標準時とか知らんもーん)。
12月1日に比べると明らかに腕力が付きました。あといろんな自然数の性質に触れて楽しかった。
最後の最後にidoneal numberなんていうよく分からない数も出てきて、「俺たちの素数腕立て伏せはこれからだ!」と打ち切りエンドっぽく盛り上がりました(自分の中では)。
各記事のPVは二桁なんですが、2015年も素数腕立て伏せニストとして普及に努めていきまーす。(来年はQiitaを使おう)


あと2014年中に今までのまとめ一覧表をアップしまーす。

2014-12-30

素数腕立て伏せ Advent Calendar 30日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


これまでのまとめ記事を書こうと思ったけどクソメンドイっすね、書くけど。

30日目
33回で負け(合成数)


あと10回は行けたはず。TV見ながらやるのは止めよう。19日目の38.7度の熱を出してた時と同じ記録なのはアカン。

33 is the smallest number with 9 representations as a sum of 3 primes:
33 = 2+2+29 = 3+7+23 = 3+11+19 = 3+13+17 = 5+5+23 = 5+11+17 = 7+7+19 = 7+13+13 = 11+11+11
33 - Wolfram|Alpha

33は9通りの方法で3つの素数の和として表せる最小の数だと。
素数の和といえば「4以上のすべての偶数は2個の素数の和で表せる」というゴールドバッハの予想が有名ですね。
もともとゴールドバッハさんが述べたのは「5より大きな任意の自然数は3つの素数の和で表せる」という命題だったそうです。3素数の和で表せたとして、そのパターン数を求める定理は無いのかな?


ほかにWikipediaにある数学的性質ではこれが面白かった。

33 = 1! + 2! + 3! + 4!
33 - Wikipedia


素数腕立て伏せ一言メモ
明日で素数腕立て伏せACは終わりです。できれば53以上の素数で終わりたいなぁ(フラグ)。

2014-12-29

素数腕立て伏せ Advent Calendar 29日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


コタツはあれか、催眠ビームでも出してんのけ?

29日目
43回で勝ち(素数)


53越えを目指してたのでイマイチ不満。うーむ、腕のポジションが安定して無かった気がするなー。
43は41と双子素数ですね。そういや29と31も双子素数だ。

41 and 43 form a twin prime pair.
43 - Wolfram|Alpha


素数腕立て伏せ一言メモ
お餅が美味しいのでつい食べ過ぎちゃったが、素数腕立て伏せのおかげで筋肉量が増えてるはずなのでたぶん大丈夫なはず。たぶん。

2014-12-28

素数腕立て伏せ Advent Calendar 28日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


寒い!

28日目
27回で負け(合成数)


素数腕立て伏せの途中で話しかけられると記録が伸びないということが分かりました。
やはり精神統一と脳内カウントが大事みたいっすねー。

27 is the smallest number with 2 representations as a sum of 3 positive squares:
27 = 1^2+1^2+5^2 = 3^2+3^2+3^2
27 - Wolfram|Alpha


素数腕立て伏せ一言メモ
今度はロッキーのテーマをiPodで聞きながら素数腕立て伏せします。

素数腕立て伏せ Advent Calendar 27日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


大掃除してたらこれを書くの忘れてしまった。腕立て自体はちゃんとやったよ!

27日目
50回で負け(合成数)


53を目指してたので残念。49でかなり限界にきてて+1回で力尽きた。
50は21日から2回めですね。2通りの方法で2つの平方数の和で表せる最小の数字。ただし0も平方数に含めると25が最小です($25 = 0^2 + 5^2 = 3^2 + 4^2$)。


素数腕立て伏せ一言メモ
大掃除すると素数腕立て伏せしたときに床がピカピカで気分いいですよ!

2014-12-27

素数腕立て伏せ Advent Calendar 26日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


忘年会に出て年を忘れてたら筋トレの習慣も忘れてたわ〜(かなり大爆笑)

26日目
48回で負け(合成数)


またしても53まで行かなかった。スポーツ的な面もあるから今度は精神統一してからやろう。掛け声とかも。
$ 48 = 4^2 + 4^2 + 4^2$、ゾロ目でキレイ。


WolframさんとこのAlphaちゃんに訊いたところ正48角形は定規とコンパスで作図可能だとのことです。

A regular 48-gon is constructible with straightedge and compass.
48 - Wolfram|Alpha

ガウスはさらに1801年に出版した『整数論の研究』において、正 n 角形が作図可能であるための必要十分条件が、n が2の冪と相異なるフェルマー素数の積、すなわち
n = 2^mFaFb…Fc(Fa , Fb , … ,Fc は全て異なるフェルマー素数、m は非負整数)
の形であることを示した[6]。
定規とコンパスによる作図 - Wikipedia

フェルマー素数は $ p = 2^{2^m} + 1 $ と書ける素数のこと。

うーんと、$ 48 = 2^4 * 3 = 2^4 * (2^{2^0} + 1) $ か。たしかに条件は満たしてますね。

ところでWikipediaにあったモール-マスケローニの定理が気になるぞ(内容と語感がいい)。





素数腕立て伏せ一言メモ
素数腕立て伏せに必要不可欠となってきているWolframAlphaですが、Wolframおじさんの孫娘Alphaちゃんと考えると非常に癒やされることに気づきました。
「WolframAlpha 萌え擬人化」で検索しても出てこないから誰か描いちゃってもいいのよ。
ちなみにMathematicaは個人的には数学ガールのミルカさんのイメージ。


2014-12-26

素数腕立て伏せ Advent Calendar 25日目 #prime_num_pushups


素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



 クリスマスというものに、最近の犀川は何も感じない。十二月二十五日だから、1、2、2、5の数字を全部足すとちょうど10になる、というくらいの印象しかない。
笑わない数学者

クリスマス=チキンとケーキが安く買える日になりつつある。
そういや$12^2 + 25 = 13^2$ですね(深い意味は無い)。

25日目
38回で負け(合成数)


別のことを考えながらやり始めたら、なんかタイミングがおかしくなった。
手のポジション、タイミング、スピードなどをいつもどおりにしないと調子が狂うなぁ。
$38 = 2^2 + 3^2 + 5^2$


素数腕立て伏せアナウンス
1日目に書きましたが、25って数字が気に食わないのでアドベントカレンダーだけど31日まで続けます。
PVの少なさもなんのその、カーズ様だって言ってます「頂点に立つものは 常にひとり!」。(このセリフ、使い勝手よくて好き)