JavaScript でスプレッド構文使ってオブジェクトから pick する

こういうのがある

const obj = { a: 1, b: 3, c: 5 };

ここから a, b だけを取り出した

{ a: 1, b: 3 }

を作りたい

結論

こうすれば良い

const picked = (({ a, b }) => ({ a, b }))(obj);

流れ

スプレッド構文*1使ってこんな感じで要素を取り出せる

const { a, b } = obj;

console.log(a, b); // => 1 3

関数にして同じことやるとこんな感じ

const proc = ({ a, b }) => { console.log(a, b) };

proc(obj); // => 1 3

戻り値で受け取るとこんな感じ

const fn = ({ a, b }) => { return { a, b } };
const picked = fn(obj);

console.log(picked); // => { a: 1, b: 3 }

なので省略して書くと

const picked = (({ a, b }) => { return { a, b } })(obj);

return も省略できる*2ので

const picked = (({ a, b }) => ({ a, b }))(obj);

VSCode に Makefile のタスクを追加する

結論

.vscode/tasks.json を追加すれば良い

github.com

流れ

Configure 開く
f:id:lesamoureuses:20200116125630p:plain

Create tasks.json する
f:id:lesamoureuses:20200116125635p:plain

Others 選ぶ
f:id:lesamoureuses:20200116125649p:plain

tasks.json の雛形ができるのでこんな感じで書き換え
( ${relativeFile} みたいにすると「現在開いてるファイルの相対 path 」が取れる)

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "make: test current file",
            "type": "shell",
            "command": "make",
            "args": [
                "test",
                "path=${relativeFile}"
            ],
            "presentation": {
                "panel": "dedicated",
                "clear": true,
                "focus": true
            }
        }
    ]
}

Run Task 実行
f:id:lesamoureuses:20200116125659p:plain

tasks.json につかした label が表示されているのでそれを実行
f:id:lesamoureuses:20200116125706p:plain

こんな感じで下に表示される
f:id:lesamoureuses:20200116125711p:plain

絵文字を判定する正規表現

以下の記事の最初だけを読んで

/\p{Emoji}/u.test("😃"); 

みたいに書けば良いのかなぁと思ったらそうではなかった。

blog.tes.co.jp

読み進めるとこんな風に書きましょう、というのが出てくる。

/\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F/gu;

github.com

で、 unicode.org にある emoji-data ってのを見てみた。
http://unicode.org/Public/emoji/12.0/emoji-data.txt

0..9 が入ってる。

0030..0039    ; Emoji                #  1.1 [10] (0️..9️)    digit zero..digit nine

1 がどうなるか試してみる。

> /\p{Emoji}/gu.test("1")
true

おー!たしかに。

> /\p{Emoji}/gu.test("あ")
false

「あ」だとちゃんと false になる。

提案されているやつで 1 を試す。

> /\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F/gu.test("1")
false

ちゃんと false になった。

terraform で workspace 使って環境ごとの変数の読み込みをする

terraform の workspace 使っていて「本番と staging で変数名変えたいときにはどうするんだろうなぁ?」って思って調べたんだけど、
ドキュメント探してもたどり着かず、結局以下の issue のようにした
Feature: Conditionally load tfvars/tf file based on Workspace · Issue #15966 · hashicorp/terraform · GitHub

以下のようなディレクトリ構造だとして、

.
├── main.tf
├── modules
└── workspaces
    ├── production
    │   └── tfenv.json
    └── staging
        └── tfenv.json

例えば staging の tfenv.json が以下のようになっているときに

{
  "db_host": "staging.example.com",
  "db_name": "staging"
}

main.tf に以下のように書いて解決。

locals {
  // デフォルト値があるやつはここに書いちゃう
  default_env = {
    db_name = "default_db"
  }
  tfvarsfile        = "workspaces/${terraform.workspace}/tfenv.json"
  tfvarsfilecontent = fileexists(local.tfvarsfile) ? file(local.tfvarsfile) : "{}"
  tfvars            = jsondecode(local.tfvarsfilecontent)
  tfenv             = merge(local.default_env, local.tfvars)
}

module "base" {
  tfenv                  = local.tfenv

  source = "./modules"
}

iPhone 故障で Suica 引き継げずに新しい iPhone になってしまった場合には iCloud.com から削除する

iPhone 交換前に Suica 登録してるか聞かれなかったんだけど、僕のあとに来た人とかはみんな「モバイル Suica 使ってますか?」って聞かれていて「おや?」となり、
交換後の iPhoneSuica のところ見たらエラーになって引き継げず詰んだと思った。

が、以下の記事にある通り Mac から iCloud に繋いでオフラインになった旧 iPhone から Apply Pay 削除することができてそうするとしばらくしてから Suica が戻ってきてくれる
(クレジットカード含めて全部削除しちゃって問題なし)

iCloud: iCloudの「設定」でApple PayとWalletからカードを削除する

メールアドレスのドメインチェックで問題ないやつがエラーになる

node でメールのアドレスのドメインチェックするのに dns 使ってるんですが、

dns.resolveAny(domain, (err, records) => {
  if (err) {
    // 1. ドメインが存在しないのでエラー
    return;
  }

  const mailRecords = records.filter((record) => {
    return record.type === 'MX'
      || record.type === 'A'
      || record.type === 'AAAA'
  });

  if (mailRecords.length === 0) {
    // 2. ドメインあるけどメール使えないのでエラー
    return;
  }

  // 問題なし
});

の 2. に関してたまにエラーになって欲しくないやつがあって困る。
例えば softbank.ne.jp の結果が

[
  {
    "value": "ns003.bbtec.net",
    "type": "NS"
  },
  {
    "value": "ns004.bbtec.net",
    "type": "NS"
  },
  {
    "nsname": "ns003.bbtec.net",
    "hostmaster": "root.softbank.ne.jp",
    "serial": 2019010901,
    "refresh": 1200,
    "retry": 600,
    "expire": 2419200,
    "minttl": 1800,
    "type": "SOA"
  }
]

みたいになったりする。
どういう状態なんだろうか?使い方間違ってるのかなぁと思いつつたまにしかエラーにならないしわからん。

builderscon tokyo 2018 行ってリフレッシュしてきました

前夜祭の朝から気合いを入れて行きました


前夜祭の IoT 話楽しかった

闇の話、ヤバいしか書けないないけど「あー、使ってたライブラリの開発が終わってしまったから書き換えないといけないのかー」がとても小さく思えるレベルだった。

ペパボのデモ、かわいくてよかった。

もう1つの発表の歯ブラシスタンドで「光らないんですけど笑」がネタっぽくなってて笑っちゃったけど上手くいってるのか失敗してるのかわからないから光らせるの大事なのねと理解した。


初日朝に電子名札いじった

「会場のネットワークが設定済みです」的なこと書いてあったんだけど、「 Mac から直接画像突っ込むし、まぁ関係ないよね」と思って画像突っ込んで再起動したらネットワークなくてQRコード取りに行けなくなっちゃったみたいでエラーになった。ということで会場で設定し直して上手くいきました。とりあえずでやるとこういうことあるけどそういうの含めて楽しかったので良い良い。


懇親会と HUB 良かった。

ぼっちだったので懇親会では隣りにいた人を捕まえて話をした。オンプレでインフラエンジニア1人な環境の人で、技術話だけじゃなく会社の話も面白かった。こういう集まり、隣りの知らない人に話しかければ何かしら面白い話できる。

HUB ではスタッフの人たちと話してたらすぐに終わってしまった。話足りなかったなー。ボウモア美味しかったです。


多目的教室2倍くらいの大きさが欲しい

懇親会で話した人も言ってたけど、多目的教室すぐ満席になってしまうので多目的のトークいくつか聞くの諦めてしまった。「メインホールとイベントホールに居ればいっか」みたいな感じに。

入ることができた場合でもスクリーンが1つだったため、逆側一番前に座るとほぼ真横向く上に隣りの人の動きが気になっちゃうっていう辛さあった。

のだけど、これはすぐに反応してもらって机の向きが変わってました。すごい!
(残念ながらそのあと僕は座ってないのでもしこれによって良くないことがあったら僕のせいですごめんなさい)


今年も ajitofm 聴けました

今年も面白かったんだけど短い時間の中でたくさんのカテゴリ話さないといけないってなると深い話に行けずに回さないとで大変そうだなという感じだった。




今年も builderscon 楽しかったです!

トークについては feedback から返すことができてそこに直接感想送れるの良かったです。
聴いた中では kazuho さんのトーク は普段全然触れていないのでわからないところ多々あったんだけど「こういう問題あったよ」「こう解決したよ、まだこういう問題もあるよ」の流れわかりやすくてきっかけとしてすごく良かった。
「朝一セッション行こうかなぁどうしようかなぁ」と思ってたんだけどこのために早起きして良かった。

ということで今年も builderscon 楽しかったです!
全く知らない話に触れるきっかけたくさんあって普段の仕事の時と気分が変わる。
スタッフの方々も外から見てるとだいぶ余裕ある感じでわぁすごいという感じだった。運営ありがとうございました。