あいつの日誌β

働きながら旅しています。

Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user

Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user とか言われた場合、ドキュメントには pipelining すればいいと書かかれているようです。

http://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user

ということで ansible.cfg に下記を追加すればいいんじゃないかな

[ssh_connection]
pipelining = true

おしまい

DB のインデックス設計できますか?

あらすじ

DB インデックスを知らないエンジニアがいるらしいので啓蒙したいという話です。

DB のインデックス設計は HDD 使っている頃には最重要なスキルだった気がしますが、今の時代、エンジニアに求められる事が増えすぎているのでインデックスの事に関して知らない人(DBインデックスが起因する問題に出会ってない人)がいても不思議ではない気がします。

というわけで何故 DB インデックスを知らない人がいるのか?という事に関しては我々のようなおじさんエンジニアが伝えないといけいない事をちゃんと伝えていないからなんじゃないかと思いペンをとりました。

といいつつ

詳しい事は過去にそういう記事を書いたのでこちらを見てください...

http://okamuuu.hatenablog.com/entry/2013/02/23/005046

そういえば

昔とある企業でいつも同じクエリーが遅いとインフラエンジニアから苦情が来るので解消してくださいと言われたので調べたら掲示板の全件取得にインデックスが効いてなかった事があります。

どうやら最初は index が効いていたようですが、後から delete_flg を追加するタスクが発生し、そのフラグのせいでフルーテーブルスキャンに変わってしまったようです。日時の経過にともないデータ量が増えてある日インフラチームから警告が発生した。という事だと思います。

上述のエントリーはそのタスクを解消したときの方法を紹介しています。

割とあるあるな話ではあると思いますが、こういう昔ながら話をもう一度してみると誰かの役に立つかもしれませんね。近年のWEB開発者は覚える事が多すぎて以外と知らない事が多いでしょうし。

そういえば 2017/5/27(土) にアットホームなカンファレンスが開催されるようです。昔あなたが困った事を発表したりすると誰かの役に立つかもしれません。

http://y8-2017-spring.hachiojipm.org/

問題です。自然数を Invert する関数をつくりなさい。

商談の時にコーディングテストがあったのですが解けなかったので復習

function invert(num) {
  let answer = 0 
  while (num > 0) {
    const rightNumber = num % 10 // num 1 の位を取得
    num = (num - rightNumber) / 10 // num を位下げする

    answer = answer * 10 // answer を位上げする
    answer += rightNumber // 取得した1の位を付け足す
  }
  return answer
}

console.log(invert(12345)) // 54321
console.log(invert(12340)) // 4321
console.log(invert(12040)) // 4021
console.log(invert(12000)) // 21

ちなみに最初は下記のように一回文字列にするやり方で回答したのですが、「文字列にしないで解いて下さい」と言われました。要件を満たしているのに何故なんだろう...

function invert(num) {
  return parseInt((num + "").split("").reverse().join(""), 10) 
}

Facebook の fiber が新しい UI components かと早とちりした件

あらすじ

以下のような記事を見つけたので facebook がいい感じの UI components を出したかと思って興味をもちました。

jp.techcrunch.com

で以下の動画を見た。どうやら期待していた話とはちがっている模様。UI component な話ではないらしい。

www.youtube.com

そもそも React.js が今までやってくれている事と fiber で変わる事

いわゆる仮想DOMと呼ばれているのは概ね下記の事なのかな?

  • reconciliation: DOM の差分を出すために色々計算する
  • update: setState でデータを更新し、最終的に再レンダリングをする

で、fiber は reconciliation の部分を新しいアルゴリズムに変えたらしいです。なので互換性自体は損なわれないはず。

というわけで私が最も気になっていたのは「JavaScript の UIフレームワークを完全リニューアル」がいい感じの UI components が出たの??という事だったのですがどうやらちがった。

結論

  • UI components ではないらしい
  • Fiber 自体がアルゴリズムを再実装した React.js のことらしい
  • 細かい事はさておき、恩恵を受けるには素直に最新 version に追従していればいい

というわけで fiber 自体は非常に興味深いのですが、私がとる選択は「素直に最新バージョンが出たら追従する」で「他に興味がある事柄に注力する」です。

とはいえ

最新のバージョンに追従すると既存のコードに影響が出てしまったり、他のタスクも平行して進めなければならない場合がほとんど。

そんななかフロントエンドを一騎駆けしないといけない状況(援軍が来ない)だとバージョンアップの追従をだんだんやらなくなっていくんだよなあ...

良識のある偉い人のみなさまにはぜひフロントエンドに友軍を送り込んで頂きたい。

Node.js v7.6.0 以降で async と await で逐次処理を書く

Node.js v7.6.0 から async と await が --harmony フラグ無しで使えるようになっています。

以下のような逐次処理を書くときに簡単に書けるようになりました。

async function x() {
  let total = 0 
  for (let i = 0; i < 100; i++) {
    total += await Promise.resolve(i)
  }
  return total
}

x().then(console.log) // 4950

逐次処理ではなくて並列処理をしたい場合は Promise.all を使うとよいでしょう。

function sleep(ms = 0) {
  return new Promise(r => setTimeout(r, ms))
}

// async をつけて Promise を return する
async function y() {
  for (let i = 0; i < 100; i++) {
    await sleep(1)
  }
}

// Promise を return しているので async はつけない
function z() {
  const tasks = []
  for (let i = 0; i < 100; i++) {
    tasks.push(sleep(1))
  }
  return Promise.all(tasks)
}

console.time("y")
y().then(() => console.timeEnd("y")) // 151.229ms

console.time("z")
z().then(() => console.timeEnd("z")) // 10.434ms