せお丸さんのYoutubeチャンネルのデータベース入門講座が良かったのでメモ
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に従ってみましょう!
先日、vim-jp の slack で Go をどうやって学んでいくかみたいな話題が出たので僕的にまとめると
— mattn (@mattn_jp) 2020年4月2日
1. Go Tour をやる (1日)
2. Effective Go を読む (1~2日)
3. GitHub から興味のあるソースを読む
4. 標準ライブラリを読む
間に適度にスキルにあった書籍を買う、くらいが良さげな感じと思います。
目次
1. Go Tour をやる (1日)
2. Effective Go を読む (1~2日)
3. GitHub から興味のあるソースを読む
4. 標準ライブラリを読む
番外編
Gopher道場 自習室なるものがあってこれに参加するのもかなり良さそう!
課題が用意されていて、Slackで質問や課題のレビュー(ベストエフォートですが)をしてもらえるようなので気になる方はぜひ!
参考
【iTerm2】tmuxでマウス操作を有効にしているときにマウスでコピペできないときにやること
これ、いつも忘れてしまうので書いておこう。
というのも自分はtmuxを使っていてマウス操作も有効にしているのだけど、Mac上のターミナルであれば特に気にならない(tmuxのコピペがMacのクリップボードに保存されるため)けど、踏み台で使っているtmuxのコピペがMacのクリップボードに保存されないので、マウスで範囲選択しようとするにもtmuxのモードで動いてしまい、Macのクリップボードに保存されず「あれ?」となることが何度もあり、その度にこの設定について検索していたというしょーもない過去があったのであった。
設定方法
iTerm2のPreferencesで[Enable mouse reporting]をOFFにするだけ
もうこれで忘れないはず!!
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 QUERY
とKILL CONNECTION
の違い
MySQLでクエリを強制終了させる場合、KILL QUERY
とKILL CONNECTION
のコマンドがるのですが、基本的にはKILL CONNECTION
コマンドを実行するのが今回の運用では適切っぽいですね。
その理由としてはKILL QUERY
コマンドではステートメントは終了されるが、トランザクションは終了されないので、接続自体が残ってしまうからのようです。
そんなわけで
DBに強くなりたいと心から願っている今日このごろです。。。
参考情報
VScodeのVimプラグインでh,j,k,lキー押しっぱなしで移動できない問題
最近のVScodeちゃんの出来が良すぎてVimを使い続けていく気持ちを維持できなくなってきている今日このごろでございます・・・><
いやー、この問題なんだけども職場ではMacbook Pro使ってて家ではMacbook Air使ってるんですが、自体のMacのVScodeでしか起きなくて放置してたんですが、ちょっと調べて見るかーと思ったら普通にマーケットプレイスのVimプラグインのページに丁寧に記載があったのですぐ解決できたって話\(^o^)/
のページの以下の部分
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に同僚と参加してきましたよ!
もちろん早期来場者特典のヨガから参加しましたよ!
ヨガなう #srenext pic.twitter.com/F9v6POr7or
— とっしー@SRE (@Tocyuki) January 25, 2020
実際に見た基調講演たち
感想
まず基調講演を聞いていて感じたのはSREとして抱える課題が今の会社で抱えている課題と結構同じだったことにびっくりしたというか、スキルセット的な難しさもあるけど、どうSREチームとして成果を上げていくのかというのは程度の差はあれどこも課題があるんだなぁというのを知れたのは良かったというか安心したし、今自分が課題に対してやろうとしていることもずれていないというのも確認できたので一番の収穫だった!
そしてそういった課題感からなのか組織論というかチームリーディングなどの話などもたくさんあったのが印象的で、とくにそのっつさんの基調講演はとても共感でき、単純にかっこいいなぁと思ったし、こんなリーダーがいるチームは幸せなんだろうなといろいろと妄想してしまったw
やっぱり、背中で見せるのは大事だよなぁと思いつつも背中で語れるスキルが身に付いていないので頑張ろうと思いました\(^o^)/
さすがにメルカリやカヤックの基調講演は圧巻というかすごいなぁという感じでSREチームとして理想的だなぁと思える取り組みや施策、改善をきちんと進められているのがさすがという感じでした。
とにかく今の自分にとってとても有意義な時間となり、モチベーションが上がりまくった一日でした!
あと個人的に会いたかった方に会えたり、SREの知り合いが増えたのもとっても嬉しかったー!
今日はずっとお会いしたいと思っていた いなむーさん@kzm0211 に会えて良かった!ご飯の約束させてもらったのでまた今度ゆっくり話せるのが楽しみだー!あだちんさん@adachin0817 ともお話し出来たしSREの知り合いが出来て感謝感激の助だよ〜😂サムギョプサル美味しいかよ〜😂 #srenext
— とっしー@SRE (@Tocyuki) 2020年1月25日
あとメルカリブースでSREクイズ行っていて献本頂いてしまったり
🎉メルカリブース、メルペイSREクイズ、4問正解者の方です! #srenext
— Mercari_Dev (@mercaridevjp) 2020年1月25日
マネジメントキャリアパスをプレゼントしました! pic.twitter.com/YjnxIVetyE
ノベルティたくさんもらいまくったり
こちらが本日の戦果となりますのでご査収下さいませ。 #srenext pic.twitter.com/QG6L8HUPzX
— とっしー@SRE (@Tocyuki) 2020年1月25日
とにかく内容盛り沢山で全部おもしろくて本当に参加してよかった!
また次回開催されたら必ず参加します!
いやー!SRE Nextめちゃくちゃ楽しかったー!運営の皆様ありがとうございましたー!次回開催期待してます!@srenext #srenext
— とっしー@SRE (@Tocyuki) 2020年1月25日
おわりに
さっそく基調講演資料をまとめてくれている方がいらっしゃるので気になる方は是非見てみてください! qiita.com
つぎはMerPey Tech Festいくぞー!
とりあえず参加者限定招待コードを使いMerpayTechFesへの参加申し込み完了!#srenext
— とっしー@SRE (@Tocyuki) 2020年1月25日
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をいじった経験がなくてもアソシエイト試験は軽々突破できるぜよ!!
そう信じて頑張っていこうぜよ!!
コンピューティング
ストレージ
データベース
開発者ツール
セキュリティ、アイデンティティ、コンプライアンス
暗号化と PKI
マネジメントとガバナンス
ネットワーキングとコンテンツ配信
アプリケーション統合
【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 で最強のドキュメントビルド環境を構築する
Sphinx + @gitlab でGitLab Pagesに公開するのCIも簡単に導入できるし最強すぎる!!
— としゆき@インフラエンジニア (@Tocyuki) 2019年1月23日
最近、仕事で運用しているサービスのドキュメントをもうWordで作りたくないという思いがすごくてSphinxがよさそうなのでいろいろいじってたらGitLab CI + GitLab Pages + Sphinxが最強のドキュメントビルド環境すぎたのでやり方を説明します。
- 前提条件
- やること
- リポジトリの作成とクローン
- Sphinxでプロジェクトの作成
- .gitlab.ymlを作成し、GitLabへPush後、CI結果を確認
- GitLab Pagesへアクセス
- おわりに
- 参考情報
前提条件
- 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
を作成する
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結果がパスしていることを確認
GitLab Pagesへアクセス
以下のページからGitLab PagesのURLを確認する
画面が正常に表示されることを確認
おわりに
GitLabでCI環境作ってしまえばGitLab Pagesへテスト後自動でデプロイされるしめちゃ便利!
GitHubはデファクトスタンダードだけど、GitLabですべて完結できるのは大きいなぁと感じました!
今後はGitLabを中心に使っていこうかなー。
参考情報
今回使用したリポジトリです。 gitlab.com
Sphinxユーザーの会 sphinx-users.jp
Amazon S3で処理速度(パフォーマンス)を上げる方法
タイムスタンプやアルファベット順などの連続するプレフィックスを使用すると、Amazon S3 の特定のパーティションに大量のキーが集中し、そのパーティションの I/O 容量がひっ迫する場合があります。
上記が原因で以下のような問題が発生することがある。
Amazon Simple Storage Service (Amazon S3) のワークロードが急増する (「リクエスト率およびリクエストパフォーマンスに関する留意事項」で説明されているリクエスト率を超える) と、ワークロードに応じて Amazon S3 のパフォーマンスがスケールされません。これに伴って、HTTP 500 や 503 エラーが発生する場合があります。
上記問題に対応するにはどうするか?
ランダムなキー名にすると、I/O の負荷は複数のインデックスパーティションに分散されます。
各オブジェクト名にランダム文字列をプレフィックスとして付加すればよいってことですねー!
Amazon ECSでタスク(コンテナ)単位でIAMロールを適用したい
Amazon ECSを使っていて、EC2にIAMロールを適用してしまうと全部のコンテナに適用されてしまうのでコンテナ毎にIAMロールを適用できないのかな〜っと思っていたら2年も前にできるようになってる〜!