Tocyukiのブログ

ギターと柔術とプログラミングが好き!

SSHの秘密鍵をAWS Secret Managerで管理する

要点

  • 秘密鍵をバイナリ形式でSecretManagerに登録
  • バイナリ形式でSecretManagerへ登録するにはCLIで実行する必要がある
  • AWS CLIで呼び出してBase64でデコードして使う

AWS CLIによるSecretManagerへ秘密鍵をバイナリ形式で登録する

$ aws secretsmanager create-secret \
   --name ${KEYPAIR_NAME} \
   --secret-binary file://~/.ssh/${KEYPAIR_NAME}.pem

AWS CLIで呼び出してBase64でデコード

$ aws secretsmanager get-secret-value \
    --secret-id ${KEYPAIR_NAME} \
    --query 'SecretBinary' \
    --output text \
    | base64 -d > ${KEYPAIR_NAME}.pem

参考

dev.classmethod.jp

PHP7.3環境でmecabを使えるようにする

とある業務でPHP5.5からPHP7.3へバージョンアップする必要が発生しまして、その環境ではphp-mecabをつかっているんですが、どうもPHP7系だとパッケージマネージャーでインストールできないっぽいので、ソースからコンパイルしてインストールする必要がありそうだ、ということで手順をメモとして残しておこうという次第でございま。

目次

環境情報

項目 詳細
OS Amazon Linux 2
PHPバージョン 7.3

mecabのインストール

以下からmecabのソースファイルとなるmecab-0.996.tar.gzをダウンロード

taku910.github.io

以下の手順でコンパイルおよびインストールを実施

tar -xvf mecab-0.996.tar.gz
cd mecab-0.996
./configure --enable-utf8-only
make
make install

mecab-ipadicのインストール

以下からmecab-ipadicのソースファイルとなるmecab-ipadic-2.7.0-20070801.tar.gzをダウンロード

taku910.github.io

以下の手順でコンパイルおよびインストールを実施

tar -xvf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-mecab-config=/usr/local/bin/mecab-config --with-charset=utf8
make
make install

php-mecabのインストール

以下のリポジトリからソースをクローンする

github.com

以下の手順でコンパイルおよびインストールを実施

cd php-mecab/mecab
phpize
./configure --with-mecab=/usr/local/bin/mecab-config
make
make install

動作確認

動作確認用PHPプログラム

<?php
$str = "すもももももももものうち";
$mecab = new \MeCab\Tagger(array('-O' => 'chasen'));
echo $mecab->parse($str) . PHP_EOL;

実行結果

$ php test.php 
すもも  スモモ  すもも  名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
の      ノ      の      助詞-連体化
うち    ウチ    うち    名詞-非自立-副詞可能
EOS

DBの概要を勉強するのに良い無料動画

せお丸さんのYoutubeチャンネルのデータベース入門講座が良かったのでメモ

【2020年版】データベース+SQL入門|MySQL/PostgreSQL/Oracleなどデータベースの使い方や役割・SQLについて👉初心者向けに6分で解説✅

www.youtube.com

データベース設計入門#1 リレーションとER図【11分でマスター!DB設計】

youtu.be

データベース設計入門#2 正規化|無駄のないテーブル設計とは?【日本一わかりやすくDB正規化を解説します】

youtu.be

データベース設計入門#3 テーブル設計の手順【実戦形式で解説】

youtu.be

トランザクションとは?【13分でわかるDBトランザクション処理】データベース入門講座#4

youtu.be

データベースのロック(排他制御)とは?ロックの種類や仕組みを解説

youtu.be

デッドロックとは?データベースのデッドロックの意味や仕組み・原因・回避方法を解説!

youtu.be

tmuxでコピーモードを使う

めちゃ便利なのでみんな使ったほうがいいやつだけど、ちょっと使わないとすぐ忘れてしまうやつですはい。

コピーモード開始

Prefix + [

選択範囲指定

Vimと同様にShift + vで線形選択するか、Spaceキーでコピー範囲を指定する

コピー完了

Enterキーを押す

貼り付け

Prefix + ]

【Rails】MinitestでのテストをGuardで自動化して表示結果に色をつける

テストに関するGemを以下のようにGemfileへ記述する

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest',                 '5.10.3'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
end

bundle install実行後、bundle exec guard initを実行する

テスト結果に色付けするのはtest/test_helper.rbを以下のように編集するだけ

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
+ require "minitest/reporters"
+ Minitest::Reporters.use!

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

【Linux】リソース状況を確認するときによく使うコマンドたち

以下のリソース状況を確認するときによく使うコマンドたち。

CPU

システム全体のCPU使用率

  • top (htop)
  • vmstat
  • iostat
  • mpstat
  • sar -u|-P
  • dstat

プロセス毎のCPU使用率

  • top (htop)
  • ps u[ax]

LoadAverage(負荷平均)

  • top (htop)
  • uptime
  • w
  • dstat

メモリ

システム全体のメモリ使用量

  • top (htop)
  • vmstat
  • sar -r
  • dstat

プロセス毎のメモリ使用量

  • top (htop)
  • ps u[ax]

スワップ

スワップ領域の使用状況

  • top (htop)
  • free
  • vmstat
  • sar -S
  • swapon -s
  • dstat

スワップイン・スワップアウトの状況

  • vmstat
  • dstat

ディスク I/O

  • iostat
  • iotop
  • vmstat
  • sar -b
  • dstat

ネットワーク I/O

  • iptraf
  • netstat -i | -s
  • sar -n DEV | EDEV
  • ss
  • dstat

dstat最強!!!

Go言語の勉強方法

最近ISUCONの利用言語でもほとんどGo言語になっていて、CLIツールやインフラ周りでかなりの存在感を出してきているGo言語。

直近のISUCONでは最も利用されている言語のようですね〜。
これはインフラエンジニアとしてGo言語知らんとは言えない状況です。

直近のISUCONでのGo言語利用率

大会名 Go言語利用率(全体) Go言語利用率(本戦出場組)
ISUCON9 49.4% 73.3%
ISUCON8 40.0% 63.3%
ISUCON7 28.4% 53.3%
ISUCON6 19.2% 42.3%
ISUCON5 14.2% 22.2%
ISUCON4 16.1% -
ISUCON3 4.23% 8.00%

というわけで、mattn_jpさんの教えに従いGoに入りてはGoに従ってみましょう!

目次

1. Go Tour をやる (1日)

go-tour-jp.appspot.com

2. Effective Go を読む (1~2日)

go.shibu.jp

3. GitHub から興味のあるソースを読む

github.com

4. 標準ライブラリを読む

golang.org

golang.org

golang.org

golang.org

golang.org

golang.org

golang.org

番外編

Gopher道場 自習室なるものがあってこれに参加するのもかなり良さそう!

課題が用意されていて、Slackで質問や課題のレビュー(ベストエフォートですが)をしてもらえるようなので気になる方はぜひ!

gopherdojo.org

参考

future-architect.github.io

speakerdeck.com

【iTerm2】tmuxでマウス操作を有効にしているときにマウスでコピペできないときにやること

これ、いつも忘れてしまうので書いておこう。

というのも自分はtmuxを使っていてマウス操作も有効にしているのだけど、Mac上のターミナルであれば特に気にならない(tmuxのコピペがMacのクリップボードに保存されるため)けど、踏み台で使っているtmuxのコピペがMacのクリップボードに保存されないので、マウスで範囲選択しようとするにもtmuxのモードで動いてしまい、Macのクリップボードに保存されず「あれ?」となることが何度もあり、その度にこの設定について検索していたというしょーもない過去があったのであった。

設定方法

iTerm2のPreferencesで[Enable mouse reporting]をOFFにするだけ

f:id:tocguitar1:20200203113340p:plain
iterm preferences

もうこれで忘れないはず!!

MySQLで時間のかかっているクエリを強制終了させる

DB触ってない勢なのでDB周りの運用を覚えていかないとやばい〜、というわけで最近ちょくちょく発生しているMySQLで時間のかかっているSELECT文を強制終了させるというオペレーションの備忘録として残しておきます。

この対応が最高にイケていないというのは重々承知の上ですが、ちょっと特殊な環境のサーバー&アプリで移行も控えているということで人力で頑張っている感じです!

MySQLでクエリの一覧を表示させる

まずは現在実行されているクエリの一覧をSHOW PROCESSLISTコマンドで表示させる

mysql> SHOW PROCESSLIST;
+----+------+-----------+------+---------+------+------------+--------------------+
| Id | User | Host      | db   | Command | Time | State      | Info               |
+----+------+-----------+------+---------+------+------------+--------------------+
| 88 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 89 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 90 | root | localhost | NULL | Query   |   96 | User sleep | select sleep (100) |
| 91 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 92 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 93 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 94 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 95 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 96 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 97 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 98 | root | localhost | NULL | Query   |    0 | starting   | SHOW PROCESSLIST   |
+----+------+-----------+------+---------+------+------------+--------------------+
11 rows in set (0.00 sec)

通常、Info 列に表示されるクエリは100文字を越えると省略されますが、FULL オプションを指定すると、省略せずクエリの全文が表示される その際、表示が崩れるようであれば\Gオプションでクエリ結果を垂直表示すると見やすくなる

mysql> SHOW FULL PROCESSLIST \G;

対象のクエリを強制終了させる

KILL CONNECTION <processlist id>コマンドで対象のクエリを強制終了させる

mysql> KILL CONNECTION 90;
Query OK, 0 rows affected (0.00 sec)

再度クエリの一覧を確認する

id 90のクエリが消えているのが確認できました!

mysql> SHOW PROCESSLIST;
+----+------+-----------+------+---------+------+------------+--------------------+
| Id | User | Host      | db   | Command | Time | State      | Info               |
+----+------+-----------+------+---------+------+------------+--------------------+
| 88 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 89 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 91 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 92 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 93 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 94 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 95 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 96 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 97 | root | localhost | NULL | Query   |    6 | User sleep | select sleep (100) |
| 98 | root | localhost | NULL | Query   |    0 | starting   | SHOW PROCESSLIST   |
+----+------+-----------+------+---------+------+------------+--------------------+
10 rows in set (0.00 sec)

複数のクエリを一発でKILLしたい場合

以下のクエリでプロセスIDを抽出可能(60秒以上かかっている処理を抜き出したい場合)

mysql> SELECT GROUP_CONCAT(ID) FROM information_schema.PROCESSLIST WHERE TIME > 59;
+------------------+
| group_concat(ID) |
+------------------+
| 1,2,3,4,5        |
+------------------+

GROUP_CONTACT関数を使うことで複数レコードをカンマ区切りで1行にまとめられるが、MySQL内のkillコマンドでは複数IDを受け付けてくれてくれないため、 一旦MySQLから抜けてmysqladminコマンドで実行する必要がある

mysqladmin kill 1,2,3,4,5 -h localhost -u foo

KILL QUERYKILL CONNECTIONの違い

MySQLでクエリを強制終了させる場合、KILL QUERYKILL CONNECTIONのコマンドがるのですが、基本的にはKILL CONNECTIONコマンドを実行するのが今回の運用では適切っぽいですね。

その理由としてはKILL QUERYコマンドではステートメントは終了されるが、トランザクションは終了されないので、接続自体が残ってしまうからのようです。

そんなわけで

DBに強くなりたいと心から願っている今日このごろです。。。

参考情報

dev.mysql.com

VScodeのVimプラグインでh,j,k,lキー押しっぱなしで移動できない問題

最近のVScodeちゃんの出来が良すぎてVimを使い続けていく気持ちを維持できなくなってきている今日このごろでございます・・・><

いやー、この問題なんだけども職場ではMacbook Pro使ってて家ではMacbook Air使ってるんですが、自体のMacのVScodeでしか起きなくて放置してたんですが、ちょっと調べて見るかーと思ったら普通にマーケットプレイスのVimプラグインのページに丁寧に記載があったのですぐ解決できたって話\(^o^)/

marketplace.visualstudio.com

のページの以下の部分

To enable key-repeating execute the following in your Terminal and restart VS Code:

というわけで以下のコマンド打ったら無事解決したのでありました。

$ defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false 
$ defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false
$ defaults delete -g ApplePressAndHoldEnabled

【参加レポ】SRE Next 2020に参加してきた!

ブログに書くまでがSRE Nextというわけで参加レポ書いていくよ!
というか今年は週一ぐらいで頑張ってブログ書きたいと思っていたのに今年初ブログですわ・・・^^

まぁ、そんなわけでSRE Next2020に同僚と参加してきましたよ!

sre-next.dev

もちろん早期来場者特典のヨガから参加しましたよ!

実際に見た基調講演たち

speakerdeck.com

speakerdeck.com

speakerdeck.com

speakerdeck.com

speakerdeck.com

docs.google.com

speakerdeck.com

感想

まず基調講演を聞いていて感じたのはSREとして抱える課題が今の会社で抱えている課題と結構同じだったことにびっくりしたというか、スキルセット的な難しさもあるけど、どうSREチームとして成果を上げていくのかというのは程度の差はあれどこも課題があるんだなぁというのを知れたのは良かったというか安心したし、今自分が課題に対してやろうとしていることもずれていないというのも確認できたので一番の収穫だった!

そしてそういった課題感からなのか組織論というかチームリーディングなどの話などもたくさんあったのが印象的で、とくにそのっつさんの基調講演はとても共感でき、単純にかっこいいなぁと思ったし、こんなリーダーがいるチームは幸せなんだろうなといろいろと妄想してしまったw

やっぱり、背中で見せるのは大事だよなぁと思いつつも背中で語れるスキルが身に付いていないので頑張ろうと思いました\(^o^)/

さすがにメルカリやカヤックの基調講演は圧巻というかすごいなぁという感じでSREチームとして理想的だなぁと思える取り組みや施策、改善をきちんと進められているのがさすがという感じでした。

とにかく今の自分にとってとても有意義な時間となり、モチベーションが上がりまくった一日でした!

あと個人的に会いたかった方に会えたり、SREの知り合いが増えたのもとっても嬉しかったー!

あとメルカリブースでSREクイズ行っていて献本頂いてしまったり

ノベルティたくさんもらいまくったり

とにかく内容盛り沢山で全部おもしろくて本当に参加してよかった!

また次回開催されたら必ず参加します!

おわりに

さっそく基調講演資料をまとめてくれている方がいらっしゃるので気になる方は是非見てみてください! qiita.com

つぎはMerPey Tech Festいくぞー!

events.merpay.com

2019年の振り返りと2020年の目標

なんだかあっという間の2019年でした〜。
でもなかなか濃厚な一年でもあったような気もする。

  • 3人目の子供が産まれる(2018年末だけども)
  • 虫歯を11本治療(あとは親不知の抜歯のみ)
  • AWS触り始めてとりあえずSAA取得
  • セブ島に一ヶ月語学留学
  • 転職し、名ばかりのSREになる
  • フットサル再開
  • 柔術紫帯ストライプ2本もらうも転職に伴い道場を退会
  • ゴールドジムに入会しボディメイクに本気出すことを誓う

今年はそんな感じでした!
それでは来年の抱負をつらつらと述べようかと!

勉強

  • TOEIC700点以上
  • AWS資格5冠達成(残りSysOps/Developer/SAP/DevOpsの4つを取得)
  • 今積まれている技術書やUdemyを消化する(主にPython系を)

仕事

  • 監視基盤の再構築
  • CI/CDパイプライン構築&運用にのせる
  • GitHub、Slackの導入
  • 定期的な勉強会の実施

健康

  • 6月までの間最低週2回は追い込む
  • 体脂肪率15%を切る
  • 7月から柔術再開し最低週2回稽古を行う

その他

  • ブログを週に一度は書く

そんなわけで

2020年は一番上の子供も小学校に入ったり、生活面での変化も色々予定されているので、確固たる決意を持って2020年も頑張りたいなと思います!

今年もお世話になりました!来年もよろしくおねがいします!

【厳選】AWSアソシエイト試験を突破するための公式ドキュメントおよびチュートリアル

以下に挙げたAWS公式ドキュメントを読んでチュートリアルを実施していればAWSをいじった経験がなくてもアソシエイト試験は軽々突破できるぜよ!!

そう信じて頑張っていこうぜよ!!

コンピューティング

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

ストレージ

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

データベース

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

開発者ツール

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

セキュリティ、アイデンティティ、コンプライアンス

docs.aws.amazon.com

暗号化と PKI

docs.aws.amazon.com

docs.aws.amazon.com

マネジメントとガバナンス

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

ネットワーキングとコンテンツ配信

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

アプリケーション統合

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

【Python】リストの要素を頻出順でソートする

やりたいこと

例えば以下のようなリストを

[5, 4, 3, 5, 5, 5, 4, 4, 3, 2]

こうしたい場合のTipsです

[5, 5, 5, 5, 4, 4, 4, 3, 3, 2]

できあがったコード

from collections import Counter

a = [5, 4, 3, 5, 5, 5, 4, 4, 3, 2]
counter = Counter(a)
result = [k for k, v in counter.most_common() for _ in range(v)]
print(result)
# [5, 5, 5, 5, 4, 4, 4, 3, 3, 2]

色々やりかたはあると思うけど、とりあえずリストを手っ取り早く要素毎に辞書形式でカウントアップしてくれるCounterと要素数毎に返してくれるmost_common()を使って実装してみた。

まず、対象のリストをCounter()メソッドを使って要素: 要素数の辞書型で返すようにする

a = [5, 4, 3, 5, 5, 5, 4, 4, 3, 2]
counter = Counter(a)

print(counter)
# Counter({5: 4, 4: 3, 3: 2, 2: 1})

ちなみにtype関数で型を見るとcollection型になっている

>>> type(counter)
<class 'collections.Counter'>

これをさらにmost_common()を使って値の昇順で返すようにして、

>>> counter.most_common()
[(5, 4), (4, 3), (3, 2), (2, 1)]

あとは以下のようなイメージのforループを内包表記で記載すればリストの要素を頻出順でソートすることができた!

このforループを

reuslt = []
for k, v in counter.most_common():
    for _ in range(v):
        result.append(k)

こんな感じで内包表記!

result = [k for k, v in counter.most_common() for _ in range(v)]

もっと良い方法等あれば教えてつかーさい^^

GitLab CI + GitLab Pages + Sphinx で最強のドキュメントビルド環境を構築する

最近、仕事で運用しているサービスのドキュメントをもうWordで作りたくないという思いがすごくてSphinxがよさそうなのでいろいろいじってたらGitLab CI + GitLab Pages + Sphinxが最強のドキュメントビルド環境すぎたのでやり方を説明します。

前提条件

  • GitLab.comでアカウント作成済み
  • Sphinxで初回ビルドできる環境を構築済み

やること

  • リポジトリの作成とクローン
  • リポジトリのクローン
  • Sphinxでプロジェクトの作成
  • .gitlab.ymlを作成し、GitLabへPush後、CI結果を確認
  • GitLab Pagesへアクセス

リポジトリの作成とクローン

なんか適当にREADMEだけあるようなリポジトリを作成してクローンしておく

Sphinxでプロジェクトの作成

$ sphinx-quickstart -q -p sphinx-handson -a Tocyuki -v 1.0 sphinx-handson

状態の確認

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Makefile
        conf.py
        index.rst
        make.bat

GitLabへPushしておく

$ git add .
$ git commit -m 'Create sphinx-handson project'
$ git push

.gitlab.ymlを作成し、GitLabへPush後、CI結果を確認

以下のページを参考にして.gitlab.ymlを作成する

gitlab.com

image: alpine

pages:
  script:
  - apk --no-cache add py2-pip python-dev
  - pip install sphinx
  - apk --no-cache add make
  - make html
  - mv _build/html/ public/
  artifacts:
    paths:
    - public
  only:
  - master

GitLabへPush

$ git add .
$ git commit -m 'Create .gitlab-ci.yml'
$ git push

CI結果がパスしていることを確認 f:id:tocguitar1:20190129014622p:plain

GitLab Pagesへアクセス

以下のページからGitLab PagesのURLを確認する

f:id:tocguitar1:20190129014728p:plain

画面が正常に表示されることを確認

f:id:tocguitar1:20190129014902p:plain

おわりに

GitLabでCI環境作ってしまえばGitLab Pagesへテスト後自動でデプロイされるしめちゃ便利!
GitHubはデファクトスタンダードだけど、GitLabですべて完結できるのは大きいなぁと感じました!

今後はGitLabを中心に使っていこうかなー。

参考情報

今回使用したリポジトリです。 gitlab.com

Sphinxユーザーの会 sphinx-users.jp