ファイルのローテーションをするために処理を書くことがある、find
コマンドの -mtime
オプションを使うが、このようなニーズでないと使わないのでメモ。
find /home/hoge/backup/* -mtime +7
7日前のファイルが表示される。
xargs
コマンドと合わせて削除をする。
find /home/hoge/backup/* -mtime +7 | xargs rm -f
ファイルのローテーションをするために処理を書くことがある、find
コマンドの -mtime
オプションを使うが、このようなニーズでないと使わないのでメモ。
find /home/hoge/backup/* -mtime +7
7日前のファイルが表示される。
xargs
コマンドと合わせて削除をする。
find /home/hoge/backup/* -mtime +7 | xargs rm -f
今までは
aws ecr get-login --no-include-email --region ap-northeast-1
のコマンドで ECR に login して container を push することができたが、
近年上記コマンドが実行できなくなってしまった。
代替コマンドとして get-login-password
を使うことでログインができる
aws --profile stg ecr get-login-password | docker login --username AWS --password-stdin https://123456789.dkr.ecr.ap-northeast-1.amazonaws.com
Login Successeded
となれば成功だ
たまに使うんだけど、順番を毎回ググって確認していた 2>&1
というリダイレクト処理がある
いままで
command >> word 2>&1
という書き方で、標準出力、標準エラー出力をリダイレクトしてきたが、
実は bash 4.0 から以下のような記載ができるようになったようだ。
command &>> word
man コマンドで bash を見ると以下のような記載がある
The format for appending standard output and standard error is:
&>>word
This is semantically equivalent to
>> word 2> &1
https://www.gnu.org/software/bash/manual/html_node/Redirections.html
これは便利なので活用していきたい。
参考情報
業務をしていたプロジェクトリーダーを努めさせてもらった一年半の長い長いプロジェクトがようやく終わりを迎える。
振り返ってみたら、不確実性との戦いだった。手探りにプロジェクトを進め、ひっくり返ることもあった。
不確実性との戦いは今回担当したプロジェクト特有のものではない。おそらくきっと、人生につきまとってくるもののひとつだ。
それであればこの機会に不確実性についての取り扱いについてきちんと学びたいと思うに至った。
そこで ヒロキさんの Qiita にたどり着いた。
トム・デルマコの著書はとてもいい知見に溢れているものの、自分からしたら比喩がわかりにくいこともあり、あまりすすんで読もうとはしてこなかったが、
知見を得たいとの一心で久しぶりに トム・デルマコ本。 ピープルウエア を読むことにした。
一言で言うと、この本は不確実性を直接対処するものではなく、生産性の高いチームを育てることで不確実性にも対応できるようにするといった本だ。
個人的にはここで挙げられている項目が現在の自分が考えていた感覚とドンピシャだった。
7つ記載があったが、その中の3つがとても良かった。
人が楽しいと思える仕事に必ず「挑戦」がある。
挑戦はチームのメンバーが一緒になって努力する目標が与えられるからこそ必要になる。挑戦は時にチームを一つにまとめる道具になる。最良の仕事仲間を持った時、人は愉快な気分になるものだし、力を尽くす。その時チームの相互作用がフルに働く。この瞬間、メンバーも楽しいと感じる。
チームが結束し始めると、成功の確率はぐんと高まる。このフェーズに入ったチームを率いることはリーダーとしての楽しみにもなるようだ。
結束の強いチームの特徴として、退職率の低さがある。
チーム編成を妨げ、プロジェクトを崩壊させる確実な方策与えられた仕事をこなす能力が部下にない場合、プロジェクトは失敗する。
しかし、与えられたグループでやっていこうと一旦決めたなら、最良の戦術は部下を信頼すること。
部下を信頼する代わりに、プロジェクトの成功を保障しようとして自己防衛の手段をとれば事態は悪化する。
「管理」などないかのように、チームが和やかに一致団結働かせることができる人。
管理されていることを部下に気づかせずに、そんなやり方を繰り返しやれる人。
この本が書かれた時と時代は変わり、リモートワークが定着したことでオフィスに全員が出社する頻度はかなり減った。本書ではオフィスの環境についても書かれてあったが、そこはざっと読んだだけで、ほとんど読み飛ばした。
ここの部分はリモートワークについて語ってる Youtube大学で語っていることを取り入れることにした。
時代は変わってもチームビルディングについてのポイントは変わってない。
名著から学ぶことは多い。
API gateway にinsert する際、エラが発生
Your API was not imported due to errors in the Swagger file.
Unable to create model for 'user_id': Model name must be alphanumeric: user_id
Unable to create model for 'staff_id': Model name must be alphanumeric: staff_id
これは正規表現でいうところの
[a-zA-Z0-9]+
のみ model name としての利用を許容しており、アンダースコア含めた名前は API gateway に許容されていないため。
swagger としては アンダースコアが利用可能なので、API gateway も許容してもらいたいところだ。。
以下のように対処する
paths:
/hoge:
post:
requestBody:
content:
application/json:
schema:
type: object
properties:
booking_deadline:
$ref: '#/components/schemas/hogeline'
components:
schemas:
Event:
type: object
properties:
hoge_line:
$ref: '#/components/schemas/hogeline'
誰も正解を持っていない中プロダクトを開発しなければならない。不確実性との戦いである。
情熱を科学で支える。データ駆動戦略とは、データを駆動させることで事業の優れた価値を見つけ、組織がデータを中心に意思決定する世界。このゴールのイメージがとても重要になる。
本書ではデータ駆動する上でスクラムなどの開発手法の話にも言及があるが、その辺はすっ飛ばして、あくまでも”データ基盤” を作る上で必要な情報のみまとめる。
データ駆動戦略を用いた事業の捉え方と、プロセスは以下の順番を遡ると説いている。
データ基盤を作る上では、まずはデータを集約することが第一歩にな理、データパイプラインが必要になる。
データ集約は組織全体で行わないと効果が限定的になり、局所最適化になってしまう。
さまざまなリーダーシップや組織論についての本があるが、本屋さんの中で平積みされていたので気になっていた本。
「素顔」のままで疲れ果てるか、「仮面」をかぶり、生まれ変わるか。
という背表紙の一文にはドキッとさせられる。
本書に書かれていたことと、私自身の経験も照らし合わせながらまとめていこうと思う。
リーダーの責務の一つに
部下を成長させ、チームの成果を最大化させることがある。
リーダーがチームの成果を最大化させるためにリーダが見るべきポイントはわずか5つだけである。
この5つのポイントにフォーカスし、それ以外のことは任せる、見守る、スルーするようにする。選択と集中。まさにそのように感じた。
組織マネジメントには数学や物理のように公式のような決められた型がある。
トラブルに見舞われ、リーダーとしてどう振る舞えばいいか悩むことに出くわすが、この5個に立ち返るだけで良い。自分の所感も含めて記す。
場の空気ではなく、言語化されたルールをつくることが重要だ。
ルールを作り、それを守らせるのがリーダーのすべきこと。
ルールを作って、規則正しく動くのであれば精神的に疲れることもない。
ルールを作る際は、主語を明確にするのがポイント。
ルールが重要であり、他人に「気遣い」を期待することなどあってはならない。
他人に期待してしまい、それが期待通りされなかった時は辛い。
最初から「気遣い」などに期待しないと割り切ることが重要。本当に必要であればそれはルールに盛り込むことだと説いている。
対等ではなく、上下の立場でコミュニケーションする
責任者がハッキリしていないと部下は働きにくい。
人間の魅力ではなく、利益の有無で人を動かす
みんなで利益を目指せば迷子にならない。これはとても重要なことであり、目的が一緒であれば手段は部下に選ぶ裁量渡しても良いのではないかと個人的には思う。
チーム全員を「組織の利益」に向かせるための仕組みがとても重要。
「成長」という利益を追い求める限り、会社との利益相反を起こさず永遠に利益を得続けることができる。
プロセスを評価するのではなく、結果だけを見る
目の前の成果ではなく、未来の成長を選ぶ
総括として、いかなる時も個人的な感情は決して表に出さない。
ルールに基づいてチームを動かし、そして結果だけをみて冷静に評価する。
本書では 1on1 などのコミュニケーションも否定しているし、合う人合わない人が明確に分かれそうだ。しかし中間管理職として疲弊する人にとっては、このような考え方もあるのかと非常に勉強になった。
またリーダーシップと、マネジメントについては鴨頭さんの動画が非常にわかりやすかった。
リーダーシップとは
マネジメントはこちら
同じ動画(開始位置が違うだけ)なのでサムネが一緒になってしまっているが。
自分はこの表現がとてもわかりやすかったので紹介。
マイクロサービス化を促進させたく、また今我々がマイクロサービス化に向けてとっているアプローチが正しいのかを確認する上で本書を読むことにした。
事前にいくつか言葉の定義をしっかりしておく必要がある。
代表的な登場人物として、マイクロサービスと、モノリスだ。
それぞれの定義と、メリット、作り出す問題は以下の通りだ。
ビジネスドメインに基づいてモデル化された独立してデプロイ可能なサービス
サービス同士が疎結合である必要がある。
各サービスの作業を並行して行えるため、多くの開発者がお互いの作業を意識する必要がなく作業を行うことができる。
マイクロサービスが作り出すのはメリットだけではない、
ネットワーク通信によりサービス間の通信が発生することになり、今までの処理以上にレイテンシーはかかってしまう。
また、サービスをまたいだデータベースのトランザクションも非常に難しい。
マイクロサービスによるメリットをきちんと享受しないと、デメリットだけ発生する可能性もある。
この問題に対して以下の問いに対し明確になっている必要がある。
マイクロサービスを語るとき、しばしばその対義語として使われることがあるが、この本ではデプロイの単位として捉えている。
システム内の全ての機能を一緒にデプロイする必要があった時、モノリスとして表現している。
全てのコードが単一プロセスとしてデプロイされているシステム。
マイクロサービスと比べてしまうとモノリスで
などを行うのは容易と感じる。とにかく1個に集約されている状態は開発運用するのにメリットも確かにあった。
これはマイクロサービスを運用していると、このモノリスの当たり前がいかに我々に染み込んでいたかを感じる。
そもそもマイクロサービスに舵を切る理由である。
モノリスはさまざまなサービスが1つに集約されている。そのため長年運用していると機能拡張が難しくなる。
マイクロサービスに踏み切る際考えるべきポイント
この辺が重要になる。
茨の道になることもある。ビジョンと戦略を生み出す必要がある。
ビジョンとは・・・仲間を集めてどのような変化をもたらすことを望んでいるのか
戦略とは・・・そこに到達する方法
これらをメンバーと共有する必要がある。一人では到底難しいプロジェクトになる。
サービスのインターフェースを定義する際に重要になるのが
サービスがどのように利用されているかというサービス利用者の観点からサービスをデザインしていくところである。それがマイクロサービスへの道のりの一歩になる。イベントストーミングがそれになる。
技術的なステークホルダーと非技術的なステークホルダーが一緒に共有ドメインを定義する共同で行うべき作業。
イベントストーミングはボトムアップで行う。
システム内に発生する「ドメインイベント」を定義することから始め、
イベントを集約にまとめ、集約を境界づけられたコンテキストへまとめていく。
移行に於けるチェックポイントとして
時折立ち止まって振り返るための時間を組み込むことが重要
情報を分析し、軌道修正が必要かどうかを判断する
ACID トランザクション(DB の一貫性を保つトランザクション)は全てのデータベースが持っているわけではない。
解決策が2つある
投票フェーズと、コミットフェーズの2つに分ける。
複数の状態変更を調整できる。レコードをロックさせない。
各ステップのビジネスを明確にモデル化させる。
ロールバックするにはロールバック用の処理を用意する必要がある。(開発コストもリスクも高くない?)
以上、メモ。良いマイクロサービス移行の旅を。
ストアドプロシージャは サーバーに格納できる一連の SQL です。これが一度登録されると クライアントは個々のステートメントを繰り返し発行す必要はなくなります。
ユーザーに権限を付与する
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON `database`.* TO 'user'@'10.1.%';
ひとつひとつ説明する。
SELECT, INSERT, UPDATE, DELETE これは普通の DML なので省略する。
CREATE ROUTINE … ストアドプロシージャを作成する権限
ALTER ROUTINE … ストアドプロシージャを削除・変更する権限
EXECUTE … ストアドプロシージャを実行する権限
ストアドプロシージャーを実行する際、 delimiter
を一時的に変更すると登録しやすい。
delimiter //
create procedure sample()
-> begin
-> select count(*) from user;
-> end
-> //
delimiter ;
SHOW PROCEDURE STATUS;
SHOW PROCEDURE STATUS;
+------------------+---------+-----------+--------------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+------------------+---------+-----------+--------------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| database | sample | PROCEDURE | root@% | 2021-06-29 14:47:44 | 2021-06-29 14:47:44 | DEFINER | | utf8 | utf8_general_ci | utf8mb4_general_ci |
| database | sample1 | PROCEDURE | user@10.1.% | 2021-06-29 14:57:08 | 2021-06-29 14:57:08 | DEFINER | | utf8 | utf8_general_ci | utf8mb4_general_ci |
+------------------+---------+-----------+--------------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
call sample1();
+----------+
| count(*) |
+----------+
| 188376 |
+----------+
1 row in set (0.00 sec)
開発している際 コンテナの mysql にどのようなクエリ走ったのか確認したいことがある。
スロークエリを 0秒に設定することで、DB にリクエストされた 全クエリを確認することができる。
mysql> show variables like 'slow%';
+---------------------+--------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------+
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/5c364d250748-slow.log |
+---------------------+--------------------------------------+
3 rows in set (0.00 sec)
mysql>
slow_query_log が OFF になっている場合、出力されない。
set global slow_query_log_file = '/tmp/mysql-slow.log';
set global long_query_time = 0;
set global slow_query_log = ON;
上記コマンドを実行し、再度確認すると、スロークエリが出力されるようになってる。
mysql> show variables like 'slow%';
+---------------------+---------------------+
| Variable_name | Value |
+---------------------+---------------------+
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /tmp/mysql-slow.log |
+---------------------+---------------------+
3 rows in set (0.00 sec)
mysql>
スロークエリが 0秒に設定されたか確認するのは
show global variables like 'long_query_time';
コマンドを実行する
mysql> show global variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
mysql>
結果
SET timestamp=1624328575;
INSERT INTO `xxx_transactions` (`id`,`operation`,`request`,`requested_at`,`response`,`responsed_at`,`metadata`,`status`,`failure_code`,`failure_message`,`created_by`,`created_at`) VALUES (105,'request',NULL,NULL,NULL,NULL,NULL,'succeeded',NULL,NULL,'123456789','2021-06-22 02:22:55.1492209');
無事流れたクエリを確認することができた。