技術的自由への長い道

日々学んでいきます。

VSCodeでprettierを有効にしたらgoのformatができなくなった

問題

prettierをvscodeで有効にしようとして、下記をsetting.jsonに書き込んだらgoのformatterが利かなくなった。

"editor.defaultFormatter": "esbenp.prettier-vscode"

解決

setting.jsonにgo環境での動きを追加してあげればよい

"editor.defaultFormatter": "esbenp.prettier-vscode",
  "[go]": {
    "editor.defaultFormatter": "golang.go"
  }

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', // ]

回答

qiita.com

上記回答です。いろいろな回答があって面白かった~

学んだこと

自分の回答は下記、解けることは解けたけど学びが二点あったのでメモ。

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);とすれば良い