WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!の対処
自社業務でステージング環境にssh接続するときに以下のエラーが発生
エラー
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
これは同一ホストを持つ仮想環境が再起動されたことで、
かぎ情報が更新されてしまい自身が持つ公開鍵情報と合致せずにログインできなくなってしまうとのこと。
割とDockerを使っていると良く起きる。
原因
鍵情報がknown_hostsに登録されているので、こちらを一度削除してあげる必要があり
新しいホストの鍵情報を登録してあげる必要がある。
対応方法
以下のコマンドを実施することで、対象のホスト名を持つ鍵情報を削除できる
ssh-keygen -f "/<directory>/.ssh/known_hosts/" -R "xxxxxxx.ap-northeast-1.elb.amazonaws.com"
これでエラーが解消。
SBT(ビルドツール)
業務の説明でSBTについて説明して頂いた。
どうでもいいがgoogleの検索トップはソフトバンク・テクノロジー(違う)
自身の理解を深めるために調査した内容を書いていきます。
SBTとは
SBTはビルドツールの一種
対応言語はScalaとJava(基本的にScalaで使われることが多い?)
最近ではGradleというビルドツールもありますが、
Scalaのみのプロジェクトであればsbtがデファクトスタンダードと
言って問題ないようです。
スポンサーであるLightbendでは商用サポート・サービスを行っており
「自信をもってミッションクリティカルなシステムに採用することができる。」
とのこと
サポートを受ける方法はStackOverFlowで【sbt】というタグを設定することで受けることができる。
特徴
こちらの引用となります。
https://www.scala-sbt.org/1.x/docs/index.html
- 単純なプロジェクトでは設定がほとんどいらない。
- Scalaコードの柔軟性をフルに活用できるScalaベースのビルド定義を使う
- コンパイラから抽出した情報を利用した正確なインクリメンタル再コンパイル
- トリガー実行による継続的なコンパイルとテスト
- jarをパッケージ化して公開する
- scaladoc でドキュメントを生成
- Scala/Javaの混合プロジェクトをサポート
- ScalaCheck、specs、ScalaTestでのテストをサポートしています。JUnitはプラグインでサポートされています。
- プロジェクトクラスとクラスパス上の依存関係でScala REPLを起動します。
- サブプロジェクトでモジュール化をサポート
- 外部プロジェクトのサポート
- タスクの並列実行 (テストの並列実行を含む)
- ライブラリ管理のサポート: インライン宣言、外部IvyまたはMaven設定ファイル、または手動管理
仕様
- 定義ファイル
「build.sbt」に定義されているが、「*.sbt」なら何でもいいらしい。
- ベースディレクトリ
「build.sbt」が配置されているディレクトリがベースディレクトリになる。
「/tmp/foo/build.sbt」ならば、「/tmp/foo」がベースディレクトリ
- ビルドサポートファイル
以下のようにproject配下にヘルパーオブジェクトなど定義が可能とのこと
プロジェクトが肥大化した場合に有効とのこと(詳細はサイト参照)
build.sbt
project/
Dependencies.scala
SBTの使い方
下記サイトに利用方法がまとめられている。
上記は日本語ページだが英語、中国語、スペイン語もある。
訳は自動翻訳ではなく有志がやっている模様。githubにissue管理されている。
公式ページ
参考サイト
https://www.scala-sbt.org/1.x/docs/ja/Getting-Started.html
https://ja.wikipedia.org/wiki/Sbt
https://qiita.com/keiSunagawa/items/d9dfad172713c31ddbc1
https://gist.github.com/hnaohiro/5c19c0c404e0848147300183f929b2b0
https://www.it-swarm.dev/ja/scala/sbt%E3%81%A8gradle%E3%81%AE%E6%AF%94%E8%BC%83/1066694586/
AtCoder169振り返り(A〜C)
AtCoderの復習
結果
約40分の3完で終わり
4問目だけちょっとみて諦めました。(時間があれば復習しておきたい。)
2問目はオーバーフローの考慮が難しくつまづきました。
また自分が未だにJava7でコーディングしていることに気づいてしまい唖然。
次回からはJava8を使います。。。
成績
初めての茶色コーダ!
AtCoderの存在を知り参加し始めて約4ヶ月、ようやくです。
正直思ったよりも時間がかかってしまいました。
Ratingは以下の通り
文字の色が変わるんですね。(分かりづらいですが。。。)
なお今の実力では茶色上位まではいけますが緑コーダは難しそうです。
基礎的なアルゴリズムを学んでいく必要があるのでこれから色々勉強します。
問題
問1
問題が簡単すぎてビビりました。
int型でもオーバフローは起こり得ないので簡単に求められます。
■回答コード
import java.util.Scanner; public class Main { public static void main(String[] args) { try (Scanner scn = new Scanner(System.in)) { int a = scn.nextInt(); int b = scn.nextInt(); System.out.println(a * b); } } }
問2Multiplication 2
渡された引数を順に計算していって、最終的に10^18を超えるかかをチェックする問題です。
この問題ではオーバーフローをどのようにして考慮するか?というのが問題となります。
解説にある通りPythonならば128bitで計算が可能なのでそのまま実装できます。
一方でJavaの場合Java8以降であれば「Math.multiplyExact()」でオーバフローを検出できます。
が、なぜかいまだにローカル環境がJava7でやっていたので利用できませんでした。(というかlong型対応しているのでしょうか?)
私の場合かなり乱暴ですが、オーバフローをした場合
数値が10^18より大きいことに加えて、元の値より小さくなっていた場合を判断に組み込むことで実現しました。
(負数である場合、とした方がスマートでしたでしょうか。)
■回答コード
import java.util.Scanner; public class Main { public static void main(String[] args) { try (Scanner scn = new Scanner(System.in)) { int N = scn.nextInt(); long[] a = new long[N]; for(int i = 0; i < N; i++) { a[i] = scn.nextLong(); if(a[i] == 0) { System.out.println(0); System.exit(0); } } long max = (long) Math.pow(10, 18); max++; long tmp = a[0]; for(int i = 1; i < N; i++){ if(tmp * a[i] / max >= 1 || tmp * a[i] < tmp) { System.out.println(-1); System.exit(0); } tmp *= a[i]; } System.out.println(tmp); } } }
問3Multiplication 3
A×Bの小数点以下を切り捨てて、結果を整数として出力する。というシンプルな問題です。
直感的に浮動小数点で計算するとダメな気がしたので
BigDecimal型を利用しましたが問題なかったです。
解説では「(A × (B × 100))/100」でも誤差をなくすことができると記載があるので
こちらの方が綺麗なコードが掛けると思います。
■回答コード
import java.math.BigDecimal; import java.util.Scanner; public class Main { public static void main(String[] args) { try (Scanner scn = new Scanner(System.in)) { long A = scn.nextLong(); BigDecimal B = scn.nextBigDecimal(); System.out.println(BigDecimal.valueOf(A).multiply(B).setScale(0, BigDecimal.ROUND_DOWN)); } } }
解説
Auroraとは
PayPayのProduct Blogを拝見していると、以下の文言が
上記のブログが書かれた時期以降、実はマネージドデータベースをRDSからAuroraに移行しました。ただ、残りのものはほぼ当時と変わっていません。
「Amazon Aurora」というものが良く知らないので調べてみました。
Auroraとは
RDS(Relational Database Service)の一種
Amazonが提供しているサービスの一つで従来のRDSサービス(MysqlとPostgreSQL)と互換性を持っている。
Wikipediaを参照すると
・2014年10月:Amazonサービスとして提供(MySQLと互換あり)
・2017年10月:PostgreSQLとの互換性が追加
・2018年10月:サーバレスバージョンが提供される。
・2019年:Aurora開発者がクラウド環境向けに根本的に再設計したことでSIGMOD ※ Systems Awardを受賞
※SIGMODは技術的な貢献が大規模データ管理システムの理論や実践に大きな影響を与えたものに与えられる賞、2017年はSQL Lite、2015年はPostgresなどが受賞している
Auroraの特長
互換性
サービス開始当初よりMySQLとの互換性を持つように設計された。
MySQLのコマンドラインクライアントやMySQL Workbenchグラフィカルユーザインターフェイスが使用できる。
だがすべてのMySQLオプションと機能を利用できるわけではないとのこと。ストレージエンジンとしてはInnoDB ※をサポートしている。
※MySQLのデフォルトストレージエンジン
パフォーマンス
標準的なMySQLと比較して最大5倍、
PostgreSQLと比較して最大3倍のパフォーマンスを持つ。
スケーラビリティ
ストレージシステムは分散型
Amazonストレージはデータベースインスタンスごとに最大64TBまで自動スケール可能
他読み取りのキャパシティ、ぱふぉーまんすをすけーるするために3つのアベイラビリティゾーン間で低レイテンシーのリードレプリカを最大15個追加可能
高可用性
ユーザのデータを6個レプリケーションし、継続的にAmazon S3をバックアップすることでBTTFを99.99%超えるように設計されている。
導入事例
MySQL互換としてかなり有名な企業で導入されているようです。
日本で有名なところだとNetflix、TrendMicro、GunghoやPayPayなどが提供されています。
料金
データベースインスタンスはMySQL版とPosgreSQL版の2種類が用意されており、
リージョンや契約するインスタンスによって料金は細かく変動します。
細かい情報はこちらにのっていますが、
https://aws.amazon.com/jp/rds/aurora/pricing/
一旦東京リージョンかつMySQL版は以下の通りとなります。
スタンダードインスタンス – 現行世代 | 時間あたりの料金 |
---|---|
db.t3.small | 0.063USD |
db.t3.medium | 0.125USD |
メモリ最適化インスタンス – 現行世代 | 時間あたりの料金 |
---|---|
db.r5.large | 0.35USD |
db.r5.xlarge | 0.70USD |
db.r5.2xlarge | 1.40USD |
db.r5.4xlarge | 2.80USD |
db.r5.8xlarge | 5.60USD |
db.r5.12xlarge | 8.40USD |
db.r5.16xlarge | 11.20USD |
db.r5.24xlarge | 16.80USD |
なおServerlessの場合はインスタンスがないのでACUで計算されます。
東京リージョンの場合は以下の通りの金額となります。
Aurora キャパシティーユニット | 0.10USD/ACU 時間 |
引用記事
参考サイト
https://www.ossnews.jp/oss_info/Amazon_Aurora
https://aws.amazon.com/jp/rds/aurora/
https://aws.amazon.com/jp/relational-database/
https://www.aurorafoss.org/about/
Anti division
AtCoderの勉強をしようと思っていたら、
数学的問題を解けた方が良いとのことで以下の問題が進められていたのでやってみました。
問題文は単純で以下の通りです。
A ≦ Bの範囲の値で、
CまたはDで割り切れない数がいくつあるかを求める問題です。
一瞬 A ≦ Bの範囲をループ処理することを考慮しましたが、
10^18まで発生する可能性があるので、TLEになると思い別の方法を検討することが大事です。
まず、以下の通り分けて考えました。
①B - Aが、割り切れない可能性がある最大の数
②B - A の数を C で割った数 を求める
③B - A の数をDで割った数を求める
最後に、①に②、③を引けば求められる。。。と思ったのですがこれではまだ不十分です。
CとDの割った数が重複している場合、その値は割り切れる数として重複カウントしてしまいます。
この数値は重複せずにカウントする必要があるので、最小公倍数を求めたうえで以下を求める必要があります。
④ B - Aの数をlcm(c, d)で割った数を求める
lcmとは
lcmとは Least Common Multipleの略で最小公倍数を指します。
最小公倍数はプログラムで表現すると以下の通りとなります。
static long lcm (long a,long b) { long temp; long c = a; c *= b; //暫定的にA, Bを掛けた値を設定する。 while((temp = a%b)!=0) { //A mod Bを求める。これを繰り返す(ユークリッドの互除法?)によって最終的に求められるっぽい a = b; b = temp; } return c/b; }
自分でコーディングすると以下の通りとなりました。
一応sampl1~3まではOKでしたが4以降は分からないですね。
■私的回答コード
import java.util.Scanner; public class Main131_01 { public static void main(String[] args) { try (Scanner scn = new Scanner(System.in)) { long A = scn.nextLong(); long B = scn.nextLong(); long C = scn.nextLong(); long D = scn.nextLong(); long minmaxVal = B - A + 1; long cd = lcm(C, D); long div = B / cd - ((A - 1) / cd); long cDiv = (A - 1) / C - B / C; long dDiv = (A - 1) / D - B / D; System.out.println(minmaxVal + div + cDiv + dDiv); } } static long lcm (long a,long b) { long temp; long c = a; c *= b; while((temp = a%b)!=0) { a = b; b = temp; } return c/b; } }
もうちょっときれいにできると思いますが、こんなところです。
lcmのようなメソッドは良く使うのでatcoderで提出用のソースコードにテンプレで含めておこうかな。。。
Dockerコマンドまとめ
docker
- コンテナ技術、コンテナ内に必要なアプリケーションを内包したImageを作成し、異なる環境に対して容易に適用できる状態にする。
- 単体のコンテナに対してのコマンド
基本的なコマンド
docker image build
Desc:DockerfileからDockerイメージをビルドする。
Sample:
docker image build -t example/echo:latest .
Note: "." はカレントディレクトリを指す。
docker search
Desc:Docker HubにホストされているDockerイメージを検索する
Sample:
docker search nginx
Note: リポジトリのスター数の降順で表示される。
docker image pull
Desc:DockerレジストリからDockerイメージを取得する
Sample:
docker image pull gihyodocker/echo:latest
docker image ls
Desc:対象のDockerホストが保持しているDockerイメージの一覧表示
Sample:
docker image ls --no-trunc
Note:--no-truncオプションをつけることでIDなどが省略されずフルで表示される
docker image push
Desc:DockerレジストリにDockerイメージを送信して登録する
Sample:
docker image push localhost:5000/ch04/todoapi:latest
docker image tag
Desc:Dockerイメージのタグを作成する
Sample:
docker image tag ch04/nginx:latest localhost:5000/ch04/nginx:latest
docker container run
Desc:新規にDockerコンテナを実行する
Sample:
docker container run -d --rm --name cronjob example/cronjob:latest
Note:「-d」はバックグラウンドで実行
docker container ls
Desc:dockerdが保持しているコンテナの一覧を表示する
Sample:
docker container ls --no-trunc
Note:「--no-trunc」をつけることでコンテナID一覧が表示できる
docker container stop
Desc:実行中のコンテナを停止する
Sample:
docker container stop $(docker container ls --filter "ancestor=example/echo" -q)
Note:stopの後コンテナIDではなくlsコマンドの結果を抽出・停止するようにすれば一々調べる必要がない。
docker container restart
Desc:停止したコンテナを再実行する
Sample:
docker container restart <containerId>
docker container rm
Desc:ディスクからコンテナを削除する
Sample:
docker container rm <containerId>
docker container logs
Desc:コンテナのログ(標準出力)を表示する
Sample:
docker container exec -it
Desc:実行中のコンテナの中でコマンドを実行する
Sample:
docker container exec -it <Name>.<ID> bash
docker container cp
Desc:コンテナからホスト側へファイル・ディレクトリをコピーする
Sample:
docker container cp <containerId>:<containerDir> <hostDir>
※引数の順番を逆にするとホスト→コンテナへのコピーとなる。
docker container prune
Desc:停止した全てのコンテナをディスクから削除する。(試したことはない)
Sample:
docker container prune
docker image prune
Desc:未使用の全てのDockerイメージをディスクから削除する(試したことはない)
Sample:
docker image prune
docker system prune
Desc:利用されていない一切のDockerリソース全てを削除する(試したことはない)
Sample:
docker system prune
docker container stats
Desc:コンテナ単位でのシステムリソースの利用状況をリアルタイムで表示する
Sample:
docker container stats --no-trunc
Note:「--no-trunc」を指定すると出力が省略されない
docker-compose
- 複数コンテナで構成されるサービスを起動・管理するための機能
- Dockerfileに必要な定義を設定、読み込むことで実現している
基本的なコマンド
docker-compose build
Desc:Composeで管理するServiceをイメージからビルドする
Sample:
docker-compose build
Note:実行した直下のDockerfileを読み込み、Imageのみ作成する
docker-compose create
Desc:Composeで管理するServiceを作成する
Sample:
docker-compose create
docker-compose start
Desc:Composeで管理するServiceを開始する
Sample:
docker-compose start
Note:コンテナ起動のみ※Imageがないとダメ
docker-compose up
Desc:Composeで管理するServiceを作成・開始する
Sample:
docker-compose up -d
Note:Image作成と起動まで全てやってくれる。オプション「-d」でバックグラウンド実行
docker-compose stop
Desc:Composeで実行中のServiceを停止する
Sample:
docker-compose stop
docker-compose rm
Desc:Composeで実行中のServiceを停止する
Sample:
docker-compose rm -f
オプション「-f」で強制削除
docker-compose down
Desc:Composeで実行中のServiceを削除する
Sample:
docker-compose down
Note:「docker-compose down --rmi all --volumes」という滅びの呪文があるらしい
docker-compose ps
Desc:Composeで実行中のコンテナ一覧を表示する
Sample:
docker-compose ps
docker-compose logs
Desc:COmposeで実行中のコンテナのログを集約して表示する
Sample:
docker-compose logs
以上です。
Docker/K8S実践コンテナ開発入門@28日目
昨日勉強した件で、
アプリケーションを実行したにも関わらず、何もログに出力されなかった件について調べました。
fluentdを書籍に従って構築してみたのですが、
正常に起動しておらずエラーをバンバン出していました。
■エラー抜粋
2020-05-28 10:46:11 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2020-05-28 10:46:12 +0000 error_class="MultiJson::AdapterError" error="Did not recognize your adapter specification (cannot load such file -- bigdecimal)." plugin_id="out_es"
今回注目したのは「Did not recognize your adapter specification 」の方です。
こちらは同じような問題を抱えている方がいらっしゃいました。
■対応
書籍にあった「fluentd.yaml」を以下の通り修正しました。
修正前: image: fluent/fluentd-kubernetes-daemonset:elasticsearch
修正後: image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1
elasticsearchのバージョンを指定していなかったので、
適切なバージョンが選ばれなかった???のでしょうか。
ともかく、上記設定を変更することでエラーは解消しKibanaの方でも
「kubernetes.labels.app: echo」と入力することで、echoログが表示できるようになりました。