(O+P)ut

アウトプット



(O+P)ut

Output Log

【Linux】numutilsでワンライナーを省力化する

Debian GNU/Linux 9にてスクリプトやコマンドを利用して数値演算をすることがありますが、例えば数値列の合計値を算出する場合は以下で可能です。

$ seq 1 5
1
2
3
4
5
$ seq 1 5 | awk '{a+=$1} END{print a;}'
15

しかし、数値を合計するという処理に特化したnumsumを使えば

$ seq 1 5 | numsum
15

スッキリした記載にできます。本記事では他にも便利なコマンドを紹介します。

numutilsをインストール

デフォルトではnumsumコマンドは入っていないので

$ which numsum

以下でパッケージを確認して

$ apt-cache search numsum
num-utils - programs for dealing with numbers from the command line

apt-getでインストールしました。

$ apt-get install num-utils
...
The following packages were automatically installed and are no longer required:
  libx11-6 libx11-data libxau6 libxcb1 libxdmcp6
...

インストールできています。

$ which numsum
/usr/bin/numsum

利用方法

パッケージの中身は以下です。

$ apt-cache show num-utils
...
Includes these programs:
  * numaverage: A program for calculating the average of numbers.
  * numbound: Finds the boundary numbers (min and max) of input.
  * numinterval: Shows the numeric intervals between each number in a sequence.
  * numnormalize: Normalizes a set of numbers between 0 and 1 by default.
  * numgrep: Like normal grep, but for sets of numbers.
  * numprocess: Do mathematical operations on numbers.
  * numsum: Add up all the numbers.
  * numrandom: Generate a random number from a given expression.
  * numrange: Generate a set of numbers in a range expression.
  * numround: Round each number according to its value.

一通り試しましたが以下は使う場面が思いついたので覚えておこうと思います。

平均値を求める

以下は平均値です。

$ cat pi.txt
3
1
4
1
5
9
2
$ cat pi.txt | numaverage
3.57142857142857

最頻値を求める

$ cat pi.txt | numaverage -m
1

中央値を求める

$ cat pi.txt | numaverage -M
3

1 1 2 3 4 5 9

の中央値は確かに「3」です。

ここで「6」を追加すると

$ cat pi2.txt
3
1
4
1
5
9
2
6
$ cat pi2.txt | numaverage -M
4

「3」と「4」の間ではなく「4」と出力されたので偶数におけるこの動きは覚えておいた方がよさそうです。

合計値を求める

冒頭のnumsumです。

$ cat pi2.txt | numsum
31

最大値を求める

$ cat pi2.txt | numbound
9

終わりに

awkやsedを用いて数値や文字列処理をするのが一般的ですが、よく使う処理に関してはこれらのコマンド群を利用するのも手だと思ったので紹介しました。

ご参考になれば幸いです。

【Windows】skaffoldを利用してコード修正を自動的にポッドに反映する(2/2)

はじめに

以下記事の続きです。

本記事では実際にskaffoldを利用してみます。

skaffoldを利用しない場合

例えばnginxのウェルカムページに差し替えるために用意している「nginx-welcome.html」を修正したとします。

そうするとイメージを更新する必要があるので以下のようにビルドを行い

> docker build -t mynginx .
> docker image ls
...

以下のようにポッドやサービスを落とし上げをして

> kubectl apply -f .\nginx-deployment.yaml
> kubectl apply -f .\nginx-service.yaml

初めて修正が反映されます。

$ curl http://localhost:30080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx! Hoge!!</title>
...

skaffoldを利用する場合

上記でやった一連の流れが修正をトリガーに自動的に行われてユーザは何も行わずともポッド/サービスが反映済みとなります。

skaffoldは以下コマンドで起動します。

> skaffold dev

そうすると以下のようにおなじみの出力が流れて

[34mListing files to watch...[0m
[34m - mynginx
[0m[34mGenerating tags...[0m
[34m - mynginx -> [0mmynginx:a2697be-dirty
[34mChecking cache...[0m
[34m - mynginx: [0m[33mNot found. Building[0m
[34mFound [docker-desktop] context, using local docker daemon.
[0m[34mBuilding [mynginx]...
[0mSending build context to Docker daemon  3.584kB
Step 1/2 : FROM nginx:1.7.9
 ---> 84581e99d807
Step 2/2 : COPY --chown=1001:0 nginx-welcome.html /usr/share/nginx/html/index.html
 ---> 2ba34789f30f
Successfully built 2ba34789f30f
Successfully tagged mynginx:a2697be-dirty
[34mTags used in deployment:[0m
[34m - mynginx -> [0mmynginx:2ba34789f30f261d8258fb47d496e55eb62dd71088df93d7e6a669ba1d6db073
[32m   local images can't be referenced by digest. They are tagged and referenced by a unique ID instead[0m
[34mStarting deploy..[0m
 - deployment.apps/nginx-deployment created
 - service/nginx created
[33mWatching for changes...

「Watching for changes」で止まります。

ここで試しにnginx-welcome.htmlを修正すると

[34mGenerating tags...[0m
[34m - mynginx -> [0mmynginx:a2697be-dirty
[34mChecking cache...[0m
[34m - mynginx: [0m[33mNot found. Building[0m
[34mFound [docker-desktop] context, using local docker daemon.
[0m[34mBuilding [mynginx]...
[0mSending build context to Docker daemon  3.584kB
Step 1/2 : FROM nginx:1.7.9
 ---> 84581e99d807
Step 2/2 : COPY --chown=1001:0 nginx-welcome.html /usr/share/nginx/html/index.html
 ---> 7e5e2114e396
Successfully built 7e5e2114e396
Successfully tagged mynginx:a2697be-dirty
[34mTags used in deployment:[0m
[34m - mynginx -> [0mmynginx:7e5e2114e396845da4dce25dee37cf89eb1f3cfba802e7d0937f45fff943f218
[32m   local images can't be referenced by digest. They are tagged and referenced by a unique ID instead[0m
[34mStarting deploy...[0m
 - deployment.apps/nginx-deployment configured
[33mWatching for changes...[0m

curlコマンドの結果も変更になっています。

補足

Dockerfile無しで同コマンドを利用すると以下のようにエラーとなりました。

level=fatal msg="watching files for artifact nginx: listing files: listing files: opening dockerfile: C:\\..\\Dockerfile: open 
C:\\..\\Dockerfile: The system cannot find the file specified.

skaffold.yamlにDockerfileを指定せずとも修正を検知しているのはデフォルトで同ディレクトリ配下を探しに行っているからだと考えられます。

また、skaffold.yamlにyamlファイルを指定しないとコードを修正してもapplyが行われません。

終わりに

git cloneで落としてくると大量のサンプルが手に入りますが、今回はせっかくなので自作してテストを行いました。
詳細な動き方はつかめていないところはあるので、もう少し遊んでみて新たな知見が分かれば別途記事にしたいと思います。

以上、ご参考になれば幸いです。

【Windows】skaffoldを利用してコード修正を自動的にポッドに反映する(1/2)

はじめに

skaffoldとはKubernetes上で動作するアプリケーションの開発を省力化するコマンドラインツールです。

本記事ではskaffoldのインストールの流れとnginxのウェルカムページを編集した際のskaffoldの動きを見ていきます。

環境情報
  • Windows10(HyperV)
  • DockerDesktop

skaffoldのインストール

以下リンク先からコマンドのみをインストールすることが可能です。

以下のような実行ファイルを入手できるので

skaffold-windows-amd64.exe

こちらをskaffold.exeと名前を変えてパスが通っているディレクトリに配置します。

パスが通れば任意のディレクトリで以下のようにコマンドが利用できます。

$ skaffold version
v1.3.1

今回は以下のような状況で利用します。

★ Build
Dockerfile locally
★ Push
don't push - keep the image on the local daemon
★ Deploy
Kubernetes Command-Line Interface (`kubectl`)

要はWindowsPC環境で全てローカルです。

テストケース

以下のようなディレクトリを用意しました。

$ tree
.
├── Dockerfile
├── nginx-deployment.yaml
├── nginx-service.yaml
├── nginx-welcome.html
└── skaffold.yaml

それぞれの解説です。

Dockerfile

nginxのイメージを元に同ディレクトリにあるnginx-welcome.htmlをindex.htmlに差し替えてイメージにしています。

FROM nginx:1.7.9
COPY --chown=1001:0 nginx-welcome.html /usr/share/nginx/html/index.html

このDockerfileを用いて以下のように新しいmynginxを用意します。

> docker build -t mynginx .

nginx-deployment.yaml

mynginxをデプロイするためのファイルです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: mynginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

nginx-service.yaml

NodePortを30080で固定して開けています。

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
  - port: 80
    nodePort: 30080

nginx-welcome.html

元ファイルから編集してタイトルに「Hoge!」をつけ足しています。

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx! Hoge!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

skaffold.yaml

イメージを今回利用するmynginxにしています。

apiVersion: skaffold/v1
kind: Config
build:
  artifacts:
  - image:  mynginx
deploy:
  kubectl:
    manifests:
    - nginx-deployment.yaml
    - nginx-service.yaml

続き


長くなったので別ページに分けますが、上記ファイル群を利用してskaffoldのテストを行います。

【入門】企業向けサーバの中身と設計ポイント

企業向けサーバ(サーバー)とは、例えばWebサーバやDBサーバといった業務処理を行うためのコンピュータ機器です。

そんな企業向けサーバはどのような構成なのでしょうか?
今回は一例として企業向けサーバを設計する際に意識する構成要素を列挙してみます。

f:id:mtiit:20200115193906p:plain
PowerSystems デモ画面より抜粋

ネットワークアダプタ

こちらは拡張スロットとしてPCIeの規格でサーバに差し込んでいます。いわゆる通信に利用され、一般的にはネットワークスイッチに接続されます。

上の画像で言うところの下側でスロットを差し込むことで口が外から見えるようになっています。

ファイバアダプタ

同じくPCIeにてFibre Channel Adapterが搭載されることがあり、こちらはストレージとの通信に利用します。

ちなみにイーサネットアダプタよりも転送速度が速いです。

例えばイーサネットではギガビットイーサネットといってギガビット/秒のイーサネットの規格を「GbE」と呼び、1GbE等で高速性を謳いますが、ファイバでは8Gb等をよく見かけます。

電源アダプタ

企業向けサーバでは100Vではなく「220-240V/10A」で動作する機器もあります。
もちろん電源アダプタは2つ以上存在し、別々の分電盤に接続することが求められます。

口の形も独特なものがあるため、機器を設置する場所の電源施設と接続するための規格確認は必須です。

メモリ

以下にパソコンに搭載されているメモリ用語を紹介しましたが

この用語はサーバにも当てはまりますが、さらに処理速度(4Gb等)が記載されていることが多く、容量も16GB以上あることも多いです。

CPU

そのCPUにコアがいくつ積まれているかがミソです。
8-core 4.1GHzなどなど。

CPUは複数積むことができる筐体もありますが、CPUを積むとそれを冷やすための大きなファンが積まれるのでカバーを開けると数が一目で分かります。
そして企業向けサーバの場合はCPUと一緒にそのコアを解放するProcessor Activationというものも併せて用意する必要があったりもします。

終わりに

企業向けサーバを設計する上でのポイントは主に上で紹介した「メモリは何GB?」「CPUは何コア?」「ネットワークポートはいくつ必要?」「ファイバポートはいくつ必要?」が考慮する観点です。電源は大体2つ。

自宅サーバのようにカスタマイズしつつ使うというよりかは、一度発注をかけるとEOSするまで利用することが多いのでこのあたりの中身を見る機会があればぜひ眺めてみてください。

【Kubernetes】ローカルでbuildしたimageのコンテナがrepository does not existで起動できない

事象

ローカルでbuildして作成した独自イメージをyamlファイルで起動しようとすると以下のようにポッドが起動しない。

> kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-84f8547f85-fc5cw   0/1     ImagePullBackOff    0          XX

原因

Kubernetesがレジストリ―からイメージをpullして失敗している。

以下はdocker describe podの結果です。

Events:
  Type     Reason     Age                    From                     Message
  ----     ------     ----                   ----                     -------
  Normal   Scheduled   default-scheduler        Successfully assigned default/nginx-deployment-84f8547f85-52hcr to docker-desktop
  Normal   Pulling    kubelet, docker-desktop  Pulling image "mynginx:latest"
  Warning  Failed     kubelet, docker-desktop  Failed to pull image "mynginx:latest": rpc error: code = Unknown desc = Error response from daemon: pull access denied for mynginx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed    kubelet, docker-desktop  Error: ErrImagePull
  Normal   BackOff      kubelet, docker-desktop  Back-off pulling image "mynginx:latest"
  Warning  Failed   kubelet, docker-desktop  Error: ImagePullBackOff

対応策

デプロイメント用のyamlファイルに imagePullPolicy: IfNotPresent を追記する。

    spec:
      containers:
      - name: nginx
        image: mynginx:latest
        imagePullPolicy: IfNotPresent

以下、補足です。

補足

以下コマンドのようにDockerfileを利用して新たなイメージを作成した場合に
docker build -t mynginx .
そのままデプロイメントでポッドを立ち上げようとすると失敗してしまいます。

よって上記で記載したようにポリシーを追記した上で

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: mynginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

無事に起動します。

確かに起動済のポッドを再度describeで見てみると「already present on machine」ということで内部に既に存在するイメージを利用しています。

docker-desktop  Container image "mynginx:latest" already present on machine
  Normal  Created   xx   kubelet, docker-desktop  Created container mynginx
  Normal  Started  xx  kubelet, docker-desktop  Started container mynginx

以上、ご参考になれば幸いです。

【SpringBoot】URLにパラメータを渡して処理させる

はじめに

以下記事で利用したサンプルは特定のURLを叩くと特定のメッセージを返すものでした。

今回はパラメータに数字を入れた場合にその数値を画面に表示させてみます。
環境も同一とし、Libertyに配置する使い方とします。

環境情報
  • Windows 10
  • DockerDesktop
  • Eclipse(STS)

パラメータを受け付けるソースコード

コードは以下です。

package com.example.demo;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping
public class Hello {

    @RequestMapping("/{num}")
    private String hellonum(@PathVariable int num) {
        return "HelloWorld Num:"+num;
    }
}

要はhelloと記載していた箇所を{num}としています。
そしてクラスの引数に@PathVariableとしてint型を渡すとしてプログラム内で処理します。

war化及びデプロイ

mavenを利用してパッケージ化します。

[INFO] --- maven-war-plugin:3.2.3:war (default-war) @ demo ---
[INFO] Packaging webapp
[INFO] Assembling webapp [demo] in [C:\Users\XX\eclipse-workspace\demo\target\demo-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in [510 msecs]
[INFO] Building war: C:\Users\XX\eclipse-workspace\demo\target\demo-0.0.1-SNAPSHOT.war
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...

上記のwarをデプロイします。

> docker run -d -p 80:9080 -v C:\Users\XX\eclipse-workspace\demo\target\demo-0.0.1-SNAPSHOT.war:/config/dropins/app.war websphere-liberty

動作確認

Cygwin上にてcurlコマンドを利用して確認しました。

$ curl http://localhost/app/1
HelloWorld Num:1
$ curl http://localhost/app/2
HelloWorld Num:2
$ curl http://localhost/app/3
HelloWorld Num:3
$ curl http://localhost/app/11111111111
Error 400:

動的に値を返してくれます。ちなみに整数型ということで大きすぎる数はNGのようです。

終わりに

インタラクティブな処理を行う上でリクエストをパラメータ化したいケースはあると思います。
サンプルファイルに少し手を入れるだけで実現できる処理なので、ぜひ試してみてください。

以上、ご参考になれば幸いです。


他の記事を読む