Termiusでkeepaliveを設定する

Putty? TeraTerm? 時代はTermius🌊

Termiusでkeepaliveを設定するのに少し手間取ったので備忘録として書いておきます。

□設定方法

①Termiusを開き、左上のハンバーガー(っぽい)メニューを選択

②メニュー内の「 Terminal 」を選択

③メニュー下部の「 Keepalive Interval 」を設定
※ミリ秒で設定するので、20秒であれば、20000と入力する必要あり💦

以上で設定完了です!

余談ですが、ダークモードは①のハンバーガーメニュー下部にあります✨

Effective Javaを読みました

Javaを扱っている人のバイブル的な本ですね。

今まで読んだ本について各項目について書いておりましたが、Effective Javaについては量が多いのでざっくりとした感想だけ書きたいと思います。

第3版を読みました。第2版と比較しましたが、ラムダとストリームという章が追加され、その他の章は大きくは変わってなさそうな印象でした。第2版はもちろん読んでません。

◾️追加された項目
第2章 オブジェクトの生成と消滅
 項目5 資源を直接結び付けるよりも依存性注入を選ぶ
 項目8  ファイナライザとクリーナーを避ける
 項目9 try-finallyよりもtry-with-resourcesを選ぶ

第4章 クラスとインターフェース
 項目21 将来のためにインターフェースを設計する
 項目25 ソースファイルを単一のトップレベルのクラスに限定する

第7章 ラムダとストリーム(※全て追加)
 項目42 無名クラスよりもラムダを選ぶ
 項目43 ラムダよりもメソッド参照を選ぶ
 項目44 標準の関数型インターフェースを使う
 項目45 ストリームを注意して使う
 項目46 ストリームで副作用のない関数を選ぶ
 項目47 戻り値型としてStreamよりもCollectionを選ぶ
 項目48 ストリームを並列化することは注意を払う

第8章 メソッド
 項目55 オプショナルを注意して返す

第11章 並行性
 項目80 スレッドよりもエグゼキュータ、タスク、ストリームを選ぶ

第12章 シリアライズ
 項目85 Javaのシリアライズよりも代替手段を選ぶ

◾️感想
正直、Javaを軽くしか触っていない自分にとっては難しいところが多々ある本でした。
といっても、メソッドやプログラミング一般などは比較的な簡単な項目があったりしたので、全部が難しいわけではないです。

この本に関して初心者に読んでほしい、初心者には向かないなど色々な意見がありますが、自分は初心者の人に関しては、読み方を気をつければ読んだほうがいいかと思います。
罠にハマらないような書き方、どうすると罠にはまってしまうのかなども記載されているため、早めに直しておきたい項目が多々あるからです。
読み方としては項目毎に軽く2ページほど読んで、理解できそうかどうか、あるいは頑張れば理解できそうだったらしっかりその項目を読んで、わからなかったところは時間が経ってから読み直すといったやり方がいいと思います。
デザインパターンを知らないのに解説もされていないデザインパターンについて言及されている項目が理解できるはずがないと思います。
そういうのが多くある場合、挫折すると思うのでここは後回しでいいと割り切っていくのがいいかと思います。
自分も読んでいて心折れかけそうなときがありました。
ですので、わからなかったときに何を勉強しておくとわかるようになるのかをメモしておいてそれについて勉強してから読むぐらいの認識でいいと思います。

内容についてですが、凄く勉強になりました。
例えば 第2章のすべてのオブジェクトに共通のメソッドについてはお恥ずかしながらJava標準でのメソッドをオーバーライドをするという発想が皆無だったのでtoStringをオーバーライドするなどは新鮮でした。
第5章のジェネリック型はよく使ってますがやっぱり便利だと感じます。ArrayListがPHPにも欲しい。
第6章のenum、第7章のラムダとストリーム、第11章の並行性はぜひ使いこなしたいです。
誤解かもしれないですが継承はもうあまり使わない方がよかったりするのかな?最近はis-aよりhas-a傾向強い気がします。

この本に関しては手元に置いておいて必要な時に何度も読み返したいと思います。

Prototypeパターン

Prptotypeパターンは生成に関するデザインパターンの1つです。 通常はnewしてインスタンスを生成しますが、Prototypeでは既存のインスタンスをコピー(clone)して新しいインスタンスを生成します。

メリット
新しいインスタンスを作成する複雑さを、クライアントから隠蔽する。
型のわからないオブジェクトの生成を行うという選択肢を、クライアントに提供する。
環境においてはオブジェクトのコピーの方が新しいオブジェクトを作成するよりも有効である可能性がある(ソースコードの管理等)。

デメリット
コピーを作る事で物事が複雑になる場合がある(これについては追々書いてみたい)。

Head First デザインパターンでモンスターを作るクラス図があったのでそれを参考に中身だけ書いてみたいと思います。
単純にモンスターをコピーできるようにするのと、ゲームを楽しむユーザーがモンスターのレベルとHPを変更できるようにしていきます。

・Monster.php

<?php
abstract class Monster
{
    private int $id; // 1種類につき与えられるモンスターのid
    private string $name;
    protected int $level;
    protected int $hp;
    private string $category;
    private bool $copied; // コピーされたものかどうか

    public function __construct(int $id, string $name, int $level, int $hp, string $category)
    {
        $this->id = $id;
        $this->name = $name;
        $this->level = $level;
        $this->hp = $hp;
        $this->category = $category;
        $this->copied = false;
    }

    abstract protected function __clone();

    public function newInstance(): \Monster
    {
        return clone $this;
    }

    public function getId(): int
    {
        return $this->id;
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function getLevel(): int
    {
        return $this->level;
    }

    public function getHp(): int
    {
        return $this->hp;
    }

    public function getCategory(): string
    {
        return $this->category;
    }

    public function getCaller(): string
    {
        return $this->caller;
    }

    protected function copied(bool $copied): void
    {
        $this->copied = $copied;
    }

}

ユーザー側で値を変更できないモンスター
・WellKnownMonster.php

<?php
require_once 'Monster.php';

class WellKnownMonster extends Monster
{

    protected function __clone()
    {
        $this->copied(true);
    }

}

ユーザー側でlevelとhpを変更できるモンスター
・DynamicPlayerGeneratedMonster.php

<?php
require_once 'Monster.php';

class DynamicPlayerGeneratedMonster extends Monster
{
    protected function __clone() {
        $this->copied(true);
    }

    public function setLevel(int $level): void
    {
        $this->level = $level;
    }

    public function setHp(int $hp): void
    {
        $this->hp = $hp;
    }
}

・MonsterRegistry.php

<?php

class MonsterRegistry
{
    private array $registered;

    public function register(Monster $monster): void
    {
        $this->registered[$monster->getId()] = $monster;
    }

    public function getMonster(int $id){
        return $this->registered[$id]->newInstance();
    }
}

・ index.php

<?php
require_once 'MonsterRegistry.php';
require_once 'WellKnownMonster.php';
require_once 'DynamicPlayerGeneratedMonster.php';

$monsterRegistry = new MonsterRegistry();
$monster1 = new WellKnownMonster(1, 'ゴブリン', 4, 12, 'ゴブリン');
$monsterRegistry->register($monster1);
$monsterCopy1 = $monsterRegistry->getMonster($monster1->getId());

var_dump($monster1);
var_dump($monsterCopy1);

$monster2 = new DynamicPlayerGeneratedMonster(37, 'アイスボム', 24, 400, 'ボム');
$monsterRegistry->register($monster2);
$monsterCopy2 = $monsterRegistry->getMonster($monster2->getId());
$monsterCopy2->setLevel(99);
$monsterCopy2->setHp(9999);

var_dump($monster2);
var_dump($monsterCopy2);

コピー元となるモンスターはDBに入れそうなものですが…。 その場合は引っ張ってきてインスタンス化して必要であればコピーしていくといった方法で使うといいかな?って思います。

(参考)
Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本
2005/12/2
Eric Freeman (著), Elisabeth Freeman (著), Kathy Sierra (著), Bert Bates (著), 佐藤 直生 (監訳), 木下 哲也 (翻訳), 有限会社 福龍興業 (翻訳)
13章 付録:残りのパターン

リモートワーク対策ツールメモ

基本的にリモートデスクトップで作業するんだろうなと思いますが、画面共有や情報共有などについてメモっておきます。役に立つかはわかりません。
ファイルの共有はTeamsやSharePointなどで事足りそうですね。

※リモートワーク時に使えるかは未検証です。

※VPN経由(リモートデスクトップで作業中)で使えるかなども未確認です。

画面共有

※画面共有のやり方を説明している記事のリンク

例)
 Teams: 会議中に自分の画面を共有する – Office サポート

 LINE: LINEで画面共有する方法まとめ【iPhone/Android/PC】 | アプリオ

 Discord: 【Discord】画面共有のやり方/音声共有方法も【PC/スマホ対応】 – DigitalNews365

リモートアシスト

nasが壊れたときに某社サポートが使ってたような遠隔操作ツールです。
Google翻訳をチャットツールみたいに使い始めたときは賢いな~と思いました(余談)。

例)
 TeamViwer

共同プログラミング

エディタは各々自由に選んでいるのでちょっと微妙ですが、共同編集機能(プラグイン)というものもあります。
(TeamViwerとか使ってリモートアシストしてしまう方が早いかもしれない)

例)
 Atom: Teletype for Atom

 Eclipse: DocShare_Plugin

 VS Code: Live Share

 PhpStorm: Code With Me

共有ホワイトボード

お絵かきしながら説明したいなんかに便利。とりあえずGoogleのが安牌?
(そういえば知り合いに画面共有しながらペイントとかパワポ(編集画面)で説明しだす猛者おったな)

※この手のツールを使う場合は、ペン型のポインティングデバイス推奨です。

共用ホワイトボードアプリ紹介:
テレワークで使いたいホワイトボードアプリ5選! – スクラムマスダーの日記


Builderパターン

Buliderクラスについてサンプルを書きます。
effective javaに書いているようなBuilderとGoFのBuilderは違うのかな?その辺がよくわかりませんが、GoFの方を書いていきます。目的は一緒だと思います。
effective javaのBuilderは下をご覧ください。

Bulderパターンですが生成に関するパターンで複合構造の構築に良く使われます。
監督者が(director)、指示を出して建築者 (Builder) が構築していくイメージです。

メリット
複雑なオブジェクトの構築方法をカプセル化できること

デメリット
構築がめんどくさ(ry

他にも複数の手順の変化するプロセスで柔軟なオブジェクトを作成できる点(Factoryとは対照的)がメリットとして挙げられますね。思っていたのと違うパラメータを設定している可能性もあるので一長一短ですが。

それでは作っていきます。夕飯を作ります。

パターン1:ステーキ定食(ご飯、ステーキ、オニオンスープ、ポテトサラダ)
パターン2:パン、ハンバーグ、シーザーサラダ

・Builder.php

<?php
interface Builder
{
    public function stapleFood(string $stapleFood):void;
    public function mainDish(string $mainDish):void;
    public function soup(string $soup):void;
    public function salad(string $salad):void;
    public function getResult();
}

・DinnerBuilder.php

<?php
require_once 'Builder.php';

class DinnerBuilder implements Builder
{
    private string $stapleFood;
    private string $mainDish;
    private string $soup;
    private string $salad;

    public function stapleFood(string $stapleFood): void
    {
        $this->stapleFood = $stapleFood;
    }

    public function mainDish(string $mainDish): void
    {
        $this->mainDish = $mainDish;
    }

    public function soup(string $soup): void
    {
        $this->soup = $soup;
    }

    public function salad(string $salad): void
    {
        $this->salad = $salad;
    }

    public function getResult(): dinnerBuilder
    {
        return $this;
    }
}

・Director.php

<?php

require_once 'Builder.php';

class Director
{

    private Builder $builder;

    public function __construct(Builder $builder){
        $this->builder = $builder;
    }

    public function makeSteakSetMeal(): void
    {
        $this->builder->stapleFood("rice");
        $this->builder->mainDish("steak");
        $this->builder->soup("onion soup");
        $this->builder->salad("potato salad");
    }

    public function addStapleFood(string $stapleFood): void
    {
        $this->builder->stapleFood($stapleFood);
    }

    public function addMainDish(string $mainDish): void
    {
        $this->builder->mainDish($mainDish);
    }

    public function addSoup(string $soup): void
    {
        $this->builder->soup($soup);
    }

    public function addSalad(string $salad): void
    {
        $this->builder->salad($salad);
    }
}

・index.php

<?php
require_once 'DinnerBuilder.php';
require_once 'Director.php';

$builder1 = new DinnerBuilder();
$director1 = new Director($builder1);
$director1->makeSteakSetMeal();

var_dump($builder1);

$builder2 = new DinnerBuilder();
$director2 = new Director($builder2);
$director2->addStapleFood("bread");
$director2->addMainDish("hamburg steak");
$director2->addSalad("caesar salad");

var_dump($builder2);

Builderパターンは実はeffective javaで紹介されているような物を良く使っていてあまりこちらで書いていないので他の人がこの書き方で書いているのを見た事があって混乱した覚えがあります。BuilderといってもLombok BuilderやFluent Builderというのもあるみたいです。複雑ですね…

(参考)
Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本
2005/12/2
Eric Freeman (著), Elisabeth Freeman (著), Kathy Sierra (著), Bert Bates (著), 佐藤 直生 (監訳), 木下 哲也 (翻訳), 有限会社 福龍興業 (翻訳)
13章 付録:残りのパターン