リモートワーク環境構築

  • 投稿日:
  • by

リモートワーク環境なメモ。会社は割と早く全社的なリモートワークになって、出社したい人も別に好きにしていい感じだった。自分は自宅で集中して仕事できる気がしなかったのと、長くは続かないだろうと思ってたので出社を続けていたが、なんとなくリモワ半々くらいになっていった。が、椅子やら机やらの準備を怠けていた。結果、腰を痛めたので本気入れて用意した。

椅子

会社ではアーロンチェアを使っていた。高い椅子だとは知ってはいたが、普段から「こんな高い椅子じゃなくても別にいいのにな」と思っていた。在宅で粗末な椅子を使い続けてからありがたみに気づいた。いい椅子は人権だ。大事なものはいつもそばにあって、無くしてから大事さに気づく。気付くのが遅れた代償として今はコルセットを着けている。 椅子に詳しくなかったので、中古オフィス用品店に行って何点か座ってみた。アーロンチェア、バロンチェア、その辺は名前は知っていたが、他にもたくさんあった。最終的にシルフィーという椅子を買った。 あとチェアマットも買った。滑りいい。

会社の机は自動昇降機能つきだった。気分で立って仕事したり、座ったりしていた。これを買うと高いだろうなと思ってはいたが、やはり高かったのでやめた。椅子を買ったのとは違う店で椅子と机をセットして座ってみて、合った高さを覚えて通販でよさげなサイズのを買った。

会社は人が働きやすいように色々考えられていた。エアコンやトイレにしてもそうだ。高性能なのが使い放題で掃除などのメンテもすることはない。自宅ではこうはいかない。勝っているのはベッドがあるくらいでは。

で色々買った結果、会社と変わらない程度の環境は整ったが、元々仕事をあまり真面目におっと

URI::Escape のバージョン問題

  • 投稿日:
  • by
  • カテゴリ:

URI::Escape には escape_char という関数がある。
これはなんと同じバージョンでも実装が異なる。
というのも、これは URI::Escape 単体でリリースされているのではなく、 URI のパッケージに付属するもので、 URI:: 以下のモジュールのバージョン管理が URI と揃っていないから。
例えば URI@1.60 にも URI@1.76 にも URI::Escape@3.31 が付属している上に中身が違う。OMG
なので cpanfile で

requires 'URI::Escape'  => '==3.31';
と書いても、期待するものが得られるとは限らない。
現在の URI の最新版は 1.76 なので、最新の実装がほしいなら
requires 'URI'  => '==1.76';
と書かなければならない。

ということを今日は author の方から教わりました。
https://github.com/libwww-perl/URI/issues/73

redisのkeyの最大数

redisにkeyは何個まで入るんだろうと思ったらfaqにありました

https://redis.io/topics/faq

What is the maximum number of keys a single Redis instance can hold? and what is the max number of elements in a Hash, List, Set, Sorted Set?

2^32個だそうです。異常なことをしない限り気にしなくてよさそう

redisでキューイング

redisにはリスト型というものがあってkeyごとにリストを格納できる。left, rightで方向を表し、leftが先頭、rightが末尾。これを利用してredisでキューイングを実装する。

use strict;
use warnings;
use Redis::Fast;
use 5.10.0;
use Data::Dumper;

sub p { warn Dumper \@_ }

my $redis = Redis::Fast->new;
$redis->flushall;

my $key = "keyhoge";

{ # enqueue
    for my $i (1..5) {
        my $value = "data_$i";
        $redis->rpush($key, $value);
    }

    # 結果確認
    p "enqueue done. data", $redis->lrange($key, 0, -1);
}

{ # dequeue
    my $get_row_per = 2;

    my $loop = 0;
    while (1) {
        say "--------------- loop $loop";

        my @result;
        $redis->multi;

        eval {
            my $part = $redis->lrange($key, 0, ($get_row_per - 1));
            $redis->ltrim($key, $get_row_per, -1);

            if ($loop == 1) {
                die "some error";
            }
        };

        if ($@) {
            say "error. '$@' rollback";
            $redis->discard;
        } else {
            @result = $redis->exec;
            my $part_result = $result[0];
            if ($part_result and @$part_result) {
                p $part_result;
            } else {
                say "end";
                last;
            }
        }
        $loop++;
    }
}
% perl queue.pl
$VAR1 = [
          'enqueue done. data',
          'data_1',
          'data_2',
          'data_3',
          'data_4',
          'data_5'
        ];
--------------- loop 0
$VAR1 = [
          [
            'data_1',
            'data_2'
          ]
        ];
--------------- loop 1
error. 'some error at queue.pl line 39.
' rollback
--------------- loop 2
$VAR1 = [
          [
            'data_3',
            'data_4'
          ]
        ];
--------------- loop 3
$VAR1 = [
          [
            'data_5'
          ]
        ];
--------------- loop 4
end
  • rightからpushし、leftから取り出すことでFIFOにする
  • 逆は不可。pushにはlpush, rpushはあるが、rangeはlrangeしかなく、leftからしか取り出せない
  • データを取り出すコマンドにはpopがあるが、これもrpopしかなくrightからしか取り出せない。1個ずつ取り出すのはパフォーマンスが悪いため、複数取り出す
  • それにはrangeでデータを先頭から参照し、rangeは参照するだけでデータは変更しないため、取り出したのちにtrimでリストを切り詰める
  • rangeとtrimの間にエラーが起きたら(redis自体が落ちた、ネットワーク的に到達できなかったなど)整合性が取れなくなるため、トランザクションを貼る
  • トランザクションはexecでコミットする。execはトランザクション中に発行したコマンドの結果を配列で返す
  • redisはmysql等のDBMSより圧倒的に早いので大規模なキューイングを処理するときはTheSchwartzより効率がいい(信頼性などを考慮しケースバイケース)
  • 暇だった

    • 投稿日:
    • by

    暇じゃなくなったら人生よくなるかなと思ったらそうでもなかった
    先は長い

    static なフィールドに Autowired したい

    ぐぐればなんぼでも出るが基本的には未対応だが古の時代から皆何とかやっている。

    http://etc9.hatenablog.com/entry/20090828/1251486871

    https://stackoverflow.com/questions/7253694/spring-how-to-inject-a-value-to-static-field

    @Componentアノテーションをつけることにより spring boot 起動時の DI コンテナ作成フローでロードされるクラスに追加し、@Autowiredアノテーションを付与したsetterメソッドでprivateフィールドに無理やり追加

    https://teratail.com/questions/35274

    https://stackoverflow.com/questions/17659875/autowired-and-static-method

    @PostConstructを付与したメソッドはDIコンテナ初期化後に呼ばれるのでそこで作成済みのインスタンスをprivateフィールドに代入。ときにこれは例が悪くてここでいうstartメソッドは引数を受けるようにすればその上の@Autowiredは不要になる


    ということを聞いてきました。

    Pixel に factory image を焼こうとしたら実は Verizon 版だということが発覚して色々あった。

    Verizon かどうかの見分け方

    https://iyhlab.info/?p=141

    以下からモデル番号を確認する

    設定>端末情報>規制ラベル

    OEMロック解除の項目がグレーアウトして変更できない

    この通りにする

    https://forum.xda-developers.com/pixel-xl/how-to/how-to-unlock-bootloader-verizon-pixel-t3796030

    1. Remove Google account and any kind of screen lock (fingerprint, PIN, pattern, etc.) from your device.
    2. Eject sim card from your device.
    3. Reset your device. In setup wizard, skip everything, don't connect to WiFi, don't add fingerprint or any kind of screen lock.
    4. Go to Developer Options and enable USB debugging.
    5. Connect your phone to PC.
    6. Open CMD in adb directory and type
    Code:
    
    adb shell pm uninstall --user 0 com.android.phone
    
    7. Restart your device.
    8. Connect to WiFi, open Chrome and go to google.com (or any website really).
    9. Go to Developer Options and enable OEM unlocking.
    10. Reboot into bootloader and via CMD run
    Code:
    
    fastboot oem unlock
    
    or
    Code:
    
    fastboot flashing unlock
    
    
    

    焼こうとしたらエラーになる

    flash-all.sh を実行すると以下のエラー

    archive does not contain 'boot.sig'
    archive does not contain 'recovery.img'
    fastboot(63471,0xa98581c0) malloc: *** mach_vm_map(size=1598820352) failed (error code=3)
    *** error: can't allocate region
    *** set a breakpoint in malloc_error_break to debug
    failed to allocate 1597219140 bytes
    error: update package missing system.img
    

    image を展開後、この通りにする

    https://forum.xda-developers.com/pixel-xl/help/flash-3-factory-images-clue-t3494838/page4

    fastboot flash aboot aboot.img
    fastboot flash apdp apdp.img
    fastboot flash boot boot.img
    fastboot flash bootlocker bootlocker.img
    fastboot flash cmnlib32 cmnlib32.img
    fastboot flash cmnlib64 cmnlib64.img
    fastboot flash devcfg devcfg.img
    fastboot flash hosd hosd.img
    fastboot flash hyp hyp.img
    fastboot flash keymaster keymaster.img
    fastboot flash modem modem.img
    fastboot flash pmic pmic.img
    fastboot flash rpm rpm.img
    fastboot flash tz tz.img
    fastboot flash vendor vendor.img
    
    fastboot flash system system.img
    
    Finally, "fastboot reboot".
    

    なおブートローダーをアンロックしたままだと起動時に脅し文句が出るので事後にロックしたらいい。

    余談

    最初にグーグルのサポートにコンタクトを取ったら、日本人がチャットでサポートに応じてくれたのだが、何の役にも立たなかった。

    • Pixel について知識がないと強烈な自己紹介
    • Pixel ヘルプのフラグメント付きの url を貼られるが、遷移先は何のトピックを指すでもないただのトップページ
    • これを指摘してもこれについての返答なし
    • 他に質問しても "Do you ~?" の類の質問に Yes / No 以外の答えしか返さない
    • しまいには「フォーラムで質問してみては?」とのたまい職務放棄
    • 反応が非常に遅い

    build.gradle にライブラリ書く時

    • 投稿日:
    • by
    • カテゴリ:
    1. 「maven repos」でググる
    2. https://mvnrepository.com/ に辿り着いてライブラリ名で検索する
    3. 最新版のをコピペする

    こんなん

    // https://mvnrepository.com/artifact/org.projectlombok/lombok
    provided group: 'org.projectlombok', name: 'lombok', version: '1.18.2'