wiresharkでgoのサーバーをキャプチャするとき
WSL上で開発していて、loopbackをキャプチャしているはずなのに何故か通信が取得できなかった。
WSL上の通信はキャプチャされなかったので、windows上でサーバーを立てるとloopbackの通信がキャプチャできた。
react-testing-libraryのtoBeとtoEqualの違い
toBeがcheckByReferenceでtoEqualがcheckByValueOnRecursive いくつか例を挙げておく
expect(1).toBe("1") -> false expect(1).toEqual("1") -> false let a = { foo:"bar" } let b = { foo:"bar" } expect(a).toBe(b) -> false expect(a).toEqual(b) -> true
参考
https://stackoverflow.com/questions/22413009/jasmine-javascript-testing-tobe-vs-toequal
https://dpericich.medium.com/react-testing-with-toequal-vs-tobe-76021acd459e
golang io.Copyとio.ReadFullの違いについて
io.Copyとio.ReadFullどっちを使えばいいかよくわかってなかったので調べた。
結論
io.ReadFullはbufSizeを指定しなきゃいけないっぽくて、io.CopyはbufSize指定しなくてよし
func ReadFull(r Reader, buf []byte) (n int, err error) { return ReadAtLeast(r, buf, len(buf)) }
なので var buf bytes.Bufferとしてio.ReadFullを使ってもlenが0なので結局読み込まず
大体みんなが想像する楽に全部読み込みする方法というのははReadFullじゃなくCopyの方ってことかな。
Go言語による分散サービス 第三章修正点
第三章 index.goのClose()
下記のようにi.mmap.Syncではなく、i.mmap.UnsafeUnmapをしないとi.file.Truncateでエラーが出てしまう
func (i *index) Close() error { // //mmap上のファイルデータをメモリ上のファイルデータに同期 // if err := i.mmap.Sync(gommap.MS_SYNC); err != nil { // return err // } // //UnsafeUnmapをしないとTruncateがうまく働かないっぽい?,unmapはsyncを含んでいるのでunmapのみでよい if err := i.mmap.UnsafeUnmap(); err != nil { return err } //メモリ上のファイルデータをディスクに同期 if err := i.file.Sync(); err != nil { return err } //newIndexでTruncateした分を元に戻している.unmapしてないとTruncateでエラーが出る if err := i.file.Truncate(int64(i.size)); err != nil { return err } return i.file.Close() }
#ゆめみからの挑戦状 ★第5弾での学び
問題
<?php $in = [ ['2nd' => 'two', 'four' => '4th'], 'three' => '3rd', ['one' => '1st'], '10th' => 'ten', ['6th' => 'six'], '5th' => 'five', 'seven' => '7th', ['fourteen' => '14th', '11th' => 'eleven'], ['8th' => 'eight'], 'thirteen' => '13th', '12th' => 'twelve', 'nine' => '9th', ['15th' => 'fifteen'], ]; // 以下と同じ配列を $in から作って出力してください [ // '1st' => 'one', // '2nd' => 'two', // '3rd' => 'three', // '4th' => 'four', // '5th' => 'five', // '6th' => 'six', // '7th' => 'seven', // '8th' => 'eight', // '9th' => 'nine', // '10th' => 'ten', // '11th' => 'eleven', // '12th' => 'twelve', // '13th' => 'thirteen', // '14th' => 'fourteen', // '15th' => 'fifteen', // ]
回答
上記回答です。いろいろな回答があって面白かった~
学んだこと
自分の回答は下記、解けることは解けたけど学びが二点あったのでメモ。
function array_flatten($arr) { $v = []; array_walk_recursive($arr, function ($key, $value) use (&$v) { //keyとvalueを逆転 if (is_numeric($value[0])) { list($key, $value) = array($value, $key); } $v[$key] = $value; }); return $v; } $out = array_flatten($in); uksort($out, function ($a, $b) { $a_num = preg_replace('/[^0-9]/', '', $a); $b_num = preg_replace('/[^0-9]/', '', $b); return $a_num > $b_num; });
① 文字列中に数字が含まれているかを(int)で判定できる is_numeric("1st"[0])みたいにやってしまっていたが、(int)("1st")で判定できる
② 1st,2nd,3rd...10th,11thみたいなときに通常ソートではうまくいかないが、SORT_REGULAR SORT_NATURALを使うとうまくいく SORT_NUMERICは(int) キャストされた状態でソートできるので、ksort($out, SORT_NUMERIC);とすれば良い