リファクタリング

リファクタリングの定義

既存のソフトウェアについて外部から見たときの振る舞い(動き方)を 保ちつつ、理解や修正が簡単になるようにソフトウェアの内部構造を 変化させること

コードのにおい  (ソースコードに深刻な問題が存在することを示す何らかの兆候)

以下のような項目をコードのにおいとして、リファクタリングの候補とします。

  • 重複したコード 同じようなコードが複数箇所に存在する

  • 長すぎるメソッド 1つのメソッド内の処理が長く、処理内容が多すぎる

  • 巨大なクラス 1つのクラスが複数の責務を持っている

  • 多すぎる引数 引数の数が多すぎてひとつひとつの意味が理解しづらい

  • 変更の発散 1つのクラスを変更する理由が複数ある

  • 変更の分散 1つの変更によって複数のクラスを変更しなければならない

  • スイッチ文 同じような分岐処理があちこちにある

  • 疑わしき一般化 役に立たない抽象クラス、委譲、メソッドなどがある

  • 相続拒否 サブクラスが継承した機能を使っていない

  • コメント コードのにおいの消臭剤に使われることがある

コードのにおいに対しての対応方法

  • 重複したコード :メソッドの抽出、クラスの抽出、メソッドの引き上げ、Template Methodの形成

  • 長すぎるメソッド :メソッドの抽出、問い合わせによる一時変数の置き換え、 メソッドオブジェクトによるメソッドの置き換え、条件記述の分解

  • 巨大なクラス ク:ラスの抽出、サブクラスの抽出、インタフェースの抽出

  • 多すぎる引数 メ:ソッドによる引数の置き換え、引数オブジェクトの導入、 オ ジェクトそのものの受け渡し

  • 変更の発散 ク:ラスの抽出

  • 変更の分散 メ:ソッドの移動、フィールドの移動、クラスのインライン化

  • スイッチ文 :ポリモーフィズムによる条件記述の置き換え、 サブクラスによるタイプコードの置き換え

  • 疑わしき一般化 :階層の平坦化、クラスのインライン化、引数の削除、メソッド名の変更

  • 相続拒否 委譲による継承の置き換え

  • コメント メソッドの抽出、表明の導入

リファクタリングの基本

事前にテストを作成しておくこと。テストの作成により、リファクタリングの前後で、機能に変更がないかを核にできます。

NATS / NATS Streaming

構築方法

k8sを利用した構築方法

以下の通りに構築されます。

  • A statefulset with a single NATS server (no auth nor TLS)

  • A single NATS Streaming node using file store with persistence

  • A nats headless service to which you can connect

  • A NATS Streaming Server that uses the cluster name stan

**上記で設定されているNATS Streamingの"stan"やNATSの"nats"はClientからアクセスする場合に必要な情報となるので、忘れないでおくこと。

// NATSのInstall
kubectl apply -f https://raw.githubusercontent.com/nats-io/k8s/master/nats-server/single-server-nats.yml

//NATS StreamのInstall
kubectl apply -f https://raw.githubusercontent.com/nats-io/k8s/master/nats-streaming-server/single-server-stan.yml

参考URL Basic NATS and NATS Streaming Setup - NATS Docs

動作確認

動作確認向けに、nats-boxのpodを利用します。。

kubectl run -i --rm --tty nats-box --image=synadia/nats-box --restart=Never

# Send message to NATS
nats-box:~# nats-sub -s nats hello &
Listening on [hello]

nats-box:~# nats-pub -s nats hello world
# Send/Receive message to STAN
nats-box:~# stan-pub -s nats -c stan hello world
Published [hello] : 'world'

nats-box:~# stan-sub -s nats -c stan hello
Connected to nats clusterID: [stan] clientID: [stan-sub]
Listening on [hello], clientID=[stan-sub], qgroup=[] durable=[]
[#1] Received: sequence:1 subject:"hello" data:"world" timestamp:1579544643374163630

上記の"stan"やnatsはNATSサーバ構築時に設定されるものです。

nats-subコマンドは廃止予定らしいので、代わりに、natsコマンドを利用します。 接続するnatsサーバは--serverオプションで利用します。

nats-box:~# nats sub  --server=nats://10.165.8.64:31109  com.sample.nats.*  

DockerのNats-boxのコンテナを利用する場合は以下の通りです。

$ sudo docker run --rm -it synadia/nats-box:latest

Kubernetes

Kubernetes

Kubernetes アーキテクチャ

https://stm05.hatenablog.com/entry/2020/09/05/205822

プライベートなdocker registry をk8sのregistryとして利用する方法

事前準備

dockerのコマンドを一般ユーザーでも実行できるように,docker groupに所属させる。

$ sudo groupadd docker   //docker groupを作成
$ sudo usermod -g docker  <一般ユーザー> // 一般ユーザを作成させたdocker groupに所属させる。
$ systemctl restart docker.service

$ exit    //いったんログアウトしてから、再度、ログインするとdockerコマンドを一般ユーザで実行可能になります。
1 dokcerにログインするための、情報を生成します。

~/.docker/config.jsonが生成されます。

#docker login <private registry>

I.E

# docker login  localhost:5000   //ここでは、Privateなregistrが、Localにあり、5000番 ポートでListenしている場合。
2. k8sから上記docker registryにアクセスする際の認証情報を、k8sのSecret リソースとして、作成します。

Dockerのユーザ名、パスワードは,docker login実行時に設定したものです。

kubectl create secret docker-registry regcred --docker-server=[Docker レジストリ の IP アドレス]:[Docker レジストリ のポート番号] --docker-username=[Docker のユーザ名] --docker-password=[Docker のパスワード] --docker-email=[email アドレス]

I.E

kubectl create secret docker-registry regcred --docker-server=localhost:5000 --docker-username=test --docker-password=test  --docker-email=test@com
3. k8sからdocker registry のイメージをPullすることができます。
# kubectl run --image=localhost:5000/video video

TypeScript 基礎

typescript文法

メソッドの書き方

以下はメソッドの書き方となります。 fooは関数名、引数として、String型のarg1、int型のarg2を取ります。 :以下のobject[]は、返り値を表します。

public foo(arg1: string, arg2: int) : object[] {

   return object
}

 forEach

forEachメソッドは与えられた関数を、配列の各要素に対して一度ずつ実行します。 以下の場合、array1に対して、各要素を1つずつ取り出して、表示します。

const array1 = ['a', 'b', 'c'];

array1.forEach(element => console.log(element));

環境構築

  1. TypescriptのInstall
   #npm install typescript
  1. Pathが設定されていないので、node_modules内の /node_modules/typescript/binのPathを追加すること。
   # export $PATH=$PATH:/node_modules/typescript/bin

typescriptコンパイル方法

以下のコマンドで、typescriptのコードをJavascriptに変換できます。なお、Typescriptの拡張子は、.tsです。

   #tsc sample.ts

Javascriptのコードが生成されるので、node等のコマンドで実行できます。

   #node sample.js

Angular / npm Build

Angularの通常のBuild方法

①:nodejs, npmのバージョン確認 $ node -v v10.15.3 $ npm -v 6.4.1

上記でない場合は②以降を実施

②:nのインストール $ sudo npm install n -g

③:対象バージョンに切替 $ sudo n 10.15.3 →実行後、再ログイン

④:nodejs, npmのバージョン確認 $ node -v v10.15.3 $ npm -v 6.4.1

その後、i配下のnode_modulesを削除し、再度npm installを実行してください

③:対象のディレクトリ直下でビルドコマンド実行 $ npm install $ ng build

 デバッグモード

Angularのデバッグは、ChromeのDevelpperツールから行うことができます。 ただし、Chrome拡張機能を利用する必要があります。 また、Build時にDebug向けのオプションをつけて、Buildを行う必要があります。 次のようにsource-mapオプションを利用することで、jsファイルとAnaularの マッピングファイルを生成することができ、Chromeの機能でデバッグができます。

#ng build   --source-map  --base-href . 

 max_old_space_sizeの拡張

一部のシステムでは、Node が使用できる最大メモリ容量は、デフォルトで 2GB 未満となっており、 Build時にエラーが出ます。Build前に以下のように、サイズを拡張することで、解決します。

node --max_old_space_size=4096  node_modules/@angular/cli/bin/ng build --base-href . --source-map

Jenkins

起動、ログイン

  1. デフォルト設定であれば、http://localhost:8080でJenkinsにアクセスできます。User/Passを入力してログインします。
    f:id:lucky0523:20210222114355p:plain
    Jenkinsログイン画面

簡単なJobの作成

  1. 左メニューからNewItemを選択します。
    f:id:lucky0523:20210222114533p:plain
    Jenkins_NweItem

2.Item nameを入力して、FreeSttyle Projectを選択します。

f:id:lucky0523:20210222114709p:plain
Jenkins_EnterItemName

3.Build Tagを選択します。

f:id:lucky0523:20210222115727p:plain
Jenkins_build

4.Buildの方式を選択します。ここでは、Shell を動かすために、Execute Shellを選択します。

f:id:lucky0523:20210222115859p:plain
Jenkins_Shell

5.Shellコマンドを記述します。その後、画面したのSaveを選択して、設定を保存します。

6.Project Dashboardに戻るので、Build Nowを選択すると、Build History にビルドの履歴が残ります。

f:id:lucky0523:20210222120241p:plain
Jenkins_buildnow

7.ビルド履歴のプルダウンメニューからConsole outputやChangsが参照できます。 f:id:lucky0523:20210222120532p:plain

定期的にBuildを行う。

JenkinsのDashboardからビルドボタンを押してビルドを開始することもできますが、何をトリガにして、自動的にBiuldを開始することもできます。

1.左メニューから、Configureを選択します。

f:id:lucky0523:20210222140528p:plain
Jenkins_configure

2.Build Triggersタブを選択します。   定期的にBuildを行う場合は、Build periodicallyを選択します。

f:id:lucky0523:20210222140701p:plain
Build_triggersタブ
f:id:lucky0523:20210222140912p:plain
Build_Triggers

3.Scheduleに繰り返しのタイミングを入力します。  以下の例ですと、60分おきにBuildが実行されます。  結果はBuild History に表示されるので、そこを確認すること。 bash  H/60 * * * *