Tocyukiのブログ

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

SQLを勉強したい時に活用できる無料サイト

基本的なSQLを学びたい場合、以下の2つのサイトで事足りるなと思ったのでメモ

SQL bolt

sqlbolt.com

英語だけど問題もシンプルなのでそんなに理解に苦しむことなく、サクサクと進めることができ、一通りのSQL構文を身につけることができるので、オススメです

ただし、なぜかChromeでは文字入力がずれてしまっているのでサファリ等他のブラウザでの実行をオススメします!

HackerRank

www.hackerrank.com

SQL boltで基本的なSQLを学習したらあとはHackerRankでSQLの問題を解きまくればOK!

こちらも英語だけど、Google翻訳プラグインを使えば特に問題ないかと思います!

そんな感じでSQL初心者の方は是非チャレンジしてみてください〜\(^o^)/

Pythonでインストールされているはずのpipモジュールが読み込みできない場合の対処

boto3を使ってデプロイスクリプトを作成していたら、インストールされているはずのboto3が読み込みできないというエラーが発生

$ python3 test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import boto3
ModuleNotFoundError: No module named 'boto3'

確認してみると、やはりしっかりとインストールされている

$ pip3 show boto3
Name: boto3
Version: 1.14.34
Summary: The AWS SDK for Python
Home-page: https://github.com/boto/boto3
Author: Amazon Web Services
Author-email: UNKNOWN
License: Apache License 2.0
Location: /usr/local/lib/python3.7/site-packages
Requires: botocore, jmespath, s3transfer
Required-by: 

モジュール読み込みパスが足りていないじゃないのかと疑い、以下のスクリプトを作成し確認

import sys
import pprint
pprint.pprint(sys.path)

やはりLocation: /usr/local/lib/python3.7/site-packagesがないことが判明

['/Users/{USERNAME}/.ghq/repository_path',
 '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python37.zip',
 '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7',
 '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/lib-dynload',
 '/Users/{USERNAME}/Library/Python/3.7/lib/python/site-packages',
 '/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/site-packages']

なんでこんなことが起こるのかまでは調べられてないけど、とりあえず、環境変数PYTHONPATHにLocationで表示されたパスを追加したらエラーは出なくなったのでよしとしようw

export PYTHONPATH='/usr/local/lib/python3.7/site-packages:$PYTHONPATH'  

GitでAuthorを間違えてしまった場合の対応方法

何度もプライベートのリポジトリに会社のAuthor情報でCommit&Pushしてしまいその度にAuthor情報を修正する日々を過ごしているのでメモとして残しておきます。

前提

  • git config --globalで会社のAuthor情報を登録している
  • プライベートで利用しているリポジトリに会社のAuthor情報でCommit&Pushしてしまった

対応手順

対象リポジトリのAuthor情報を正しいものに修正

git config --local user.email "プライベート用のアドレス"
git config --local user.name "プライベート用のアカウント名"

修正対象のコミットへrebaseする

git rebase -i HEAD^

以下の要領でAuthor情報の修正を実施する

git commit --amend --reset-author 
git rebase --continue
git push -f 

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)

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

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 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年も頑張りたいなと思います!

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