その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

TypeScriptのMap<K, V>をJSON.stringify()に食わせると空のオブジェクトになって困るんですけどって時

(TypeScriptに限らずJavaScriptでもだいたいこのような感じだと思いますが)

例えば以下のようなコードを書くと,出力としては {"body":{}} が得られます.

const body = new Map<string, string>().set("foo", "bar");
console.log(JSON.stringify({body}));

本当は {"body": {"foo": "bar"}} のような構造がほしいところにこれでは困るわけですね.

そこでどうするかと言うと Object.fromEntries() を利用すると良い:

developer.mozilla.org

2019年11月現在だと比較的新しい機能ですね.

const body = new Map<string, string>().set("foo", "bar");
console.log(JSON.stringify({body: Object.fromEntries(body)}));

このようにするとめでたく {"body": {"foo": "bar"}} という構造が得られる.ヤッター!!

これはid:sugyanさんに教えていただきました.ありがとうございます!

なお注意点としては以下のとおりです

  • node 12以降のバージョン (もしくは対応ブラウザ) が必要.MDNのページでサポート状況をご確認ください.
  • tsconfigのlibの指定に es2019 を指定する必要あり

以上です.助かりましたね.

[追記]
JavaScriptの場合について記す (環境はnode v12.13.0).

const body = new Map().set("foo", "bar");
console.log(JSON.stringify({body})); // => {}
const body = new Map().set("foo", "bar");
console.log(JSON.stringify({body: Object.fromEntries(body)})); // => {"body": {"foo": "bar"}}

同じような感じですね.
[追記ここまで]

以下はやり取りのおまけです.

バイナリぽん置きでGPG passphraseベースの暗号化・復号化を行うツールを書いた

表題のとおりです.

github.com

名前は出オチです (ref: エニグマ (暗号機) - Wikipedia)

色々あってgpgコマンドが無い (入れられない) ような環境でもバイト列を暗号化・復号化したいということがあり (あと脳が悪くてgpgコマンドのオプションを覚えられない),バイナリぽん置きでそれをやるツールを書いたという話です.使い方についてはREADMEをご覧ください.至ってシンプル.
もちろんgpgコマンドとの互換性もあるので,gpgでencryptしたファイルをamugineでdecryptしたり,あるいはその逆をすることも可能となっています.

golangはopenpgpの実装をgolang orgで提供しているので大変便利ですね! https://github.com/golang/crypto/tree/master/openpgp

CompletionStage<T>な変数を同期的に処理したいんですけど〜ってとき

Javaの話です.

CompletionStage<T>を返却するようなメソッドがあって,それを同期的に処理したい (単体テストを書くというシーンが最も多いでしょう) ということが生きているとあります.しかしCompletionStageget()のようなメソッドが生えていないので同期的に処理することができません.thenAccept()を使おうにも,例えばJUnitのテストケースではすっぽ抜けてしまってうまく扱えません (逆にテストケース以外ではうまく働くでしょう).

そんなときにどうするかというと,手っ取り早い方法はCompletableFuture<T>にキャストしてしまうことでしょう.すると,オブジェクトにget()が生えてくるので同期的に値を取り扱うことが可能となります.

例:

final CompletionStage<String> completionStage = getSomething();
final CompletableFuture<String> future = (CompletableFuture<String>) completionStage;
final String got = future.get(); // ここで同期的に取り扱える

最初からCompletableFutureで値を返却してほしいですね.以上です.

技術書典7 (く39D) にて「ATコマンドかるた」を頒布します!!!

技術書典7,SORAZINE技術組(く39D*1 にて「ATコマンドかるた」を頒布いたします.

techbookfest.org

「ATコマンドとはなにか?」という疑問については同時に頒布される SORAZINE 技術組 Vol.2019F 中の,おそらく今のところ日本で最も詳しいATコマンドの解説文章をご覧いただければと思いますが *2,その文中から抜粋しますと,

AT コマンドは AT という文字列で始まる、モデムを制御したりするためのテキストベースのコマンド群です.

というものです.ホラ,皆さん生きているとAT+COPSとかAT+CGDCONTとかよく見たり喋ったりするじゃないですか? ソレのかるたを頒布するという話です.

こんな感じ:

f:id:moznion:20190920162109j:plain

これがATコマンドふだで……

f:id:moznion:20190920162156j:plain

これが機能ふだです.

たのしい48種類のATコマンドのふだをご用意してございます! (なお,コマンドふだと機能ふだは左上の通し番号で対応が付いています)

ATコマンドふだを読み上げて機能ふだを取るもよし,機能ふだを読み上げてATコマンドふだを取るもよし,ニヤニヤ眺めるのもよしと三方よしな仕上がりとなっております! これで皆さんも遊びながらにしてATコマンドを暗記できます,やりましたね!!!

f:id:moznion:20190920161953j:plain

f:id:moznion:20190920163632j:plain

このようなかわいいパッケージでお出迎え.

ところで,いまのところこのかるたの印刷代を全て建て替えてるので売れないと年を越せません!!!!!!
技術書典7,SORAZINE技術組(く39D)でお待ちしています!!! よろしくお願いします……


【おわび】

一部ATコマンドふだに誤植がございまして,そちらは大変申し訳ありませんが人力加筆による修正を加えております

(誤)

f:id:moznion:20190920144627j:plain

AT+CCACT

(正: 修正済み)

f:id:moznion:20190920144712j:plain

AT+CGACT

以上です.

*1:よみがながtypoっているのはご愛嬌

*2:ATコマンド学習されたい向きには超おすすめです

Kyoto.なんか #5で「AWS上に構築する メンテ容易なElasticsearch System」というタイトルで話してきました

表題の通りKyoto.なんか #5で話してきました.もうかれこれ3週くらい前の話なのですね……筆不精がたたっております.

kyoto-nanka.connpass.com

内容としてはここ数年ElasticsearchをAWS上で運用しているのでそのアーキテクチャのご紹介という感じの発表をしたという次第です.現状上手いこと回っております.

この発表の後にElasticの@johtaniさんからのメンションで,クラスタまたぎのレプリケーションがElasticsearch 6.7以降サポートされていることを教えていただきました.ありがとうございます!

それにつけても最近の願いはAWS Elasticsearch Serviceにauto reshard機能が入ることですね,現場からは以上です.

builderscon 2019見本市 (土曜12時から) で自作ガジェット展示します

id:uzulla, id:mackee_wらと共に自作のE-バッジを展示します!
というかこのブログの内容ママです!!

ここには本物があります.
ぜひお立ち寄りください!!!

ところでチップのデータシートを見ながらあれこれコードを書いて試しているんですが,どうやっても一部機能を実装することが出来ないでいます,これはなんなんだ……当日お立ち寄りの方でお詳しい向きがあれば是非教えていただきたく思います!

よろしくお願いいたします.

tcpdumpで今すぐキャプチャ内容を全部ファイルにflushしてくれ!! というとき

tcpdumpはキャプチャした内容をバッファに蓄積してバッチ的にflushするので,うっかりプロセスを即断するとキャプチャしていた内容をdrainできないことがままあります.困りますね.

www.tcpdump.org

Using the SIGUSR2 signal along with the -w flag will forcibly flush the packet buffer into the output file.

というわけでここに書いてあるとおり,SIGUSR2tcpdumpのプロセスに対して発行してあげるとその時点のバッファの内容をファイルに吐き出します (ただし -w フラグによって出力先ファイルを指定している,すなわちファイル書き出しモードにしている必要がある).

If the -w option is specified, make the saved raw packet output ``packet-buffered''; i.e., as each packet is saved, it will be written to the output file, rather than being written only when the output buffer fills.

あるいは -U (--packet-buffered) フラグを -w フラグとともに利用するというのも良いでしょう.ただ,この際はバッファをバイパスして直接ファイルに書き込むような挙動となるので,tcpdumpdaemonとして常に動かしているような環境ではパフォーマンスの問題が発生する可能性があるので注意が必要そうです.


なお,-B オプションを使ってバッファサイズを0にするとどうなのか……というとこれは

tcpdump: invalid packet buffer size 0

と出て動きません.なるほど〜,そりゃそうですね.