Tocyukiのブログ

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

【AmazonLinux2】php-fpm + apache環境での環境変数の持たせ方

/etc/systemd/system/httpd.serviceを作成

  • 以下内容で作成する
.include /lib/systemd/system/httpd.service

[Unit]
After=network.target remote-fs.target nss-lookup.target httpd-init.service cloud-config.service

[Service]
UMask=002
EnvironmentFile=/etc/environment

/etc/systemd/system/php-fpm.serviceを作成

  • 以下内容で作成する
.include /lib/systemd/system/php-fpm.service

[Unit]
After=syslog.target network.target cloud-config.service

[Service]
UMask=002
EnvironmentFile=/etc/environment
PrivateTmp=false

/etc/php-fpm.d/www.confに1行追加

  • 以下を追記
clear_env = no

あとは/etc/environmentに環境変数を記載していくだけ!

mysqldumpをするときによく使うオプションとリストア方法

概要

手順

事前準備

  • --default-character-setでどの文字コードで mysqldump を取得するか、対象 DB の現在の文字コードを確認する
$ mysql -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} -e 'show variables like "character_set_database";'

mysqldump取得

圧縮しない時

  • テーブル単位の取得の場合
$ mysqldump -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} --single-transaction --default-character-set=${CHARASET} --routines ${DB_NAME} ${TABLE_NAME_1} ${TABLE_NAME_2} > hogehoge_`date +%Y%m%d`.sql
  • DBスキーマ単位で取得の場合
$ mysqldump -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} --single-transaction --default-character-set=${CHARASET} --routines --add-drop-database --databases ${DB_NAME} > hogehoge_`date +%Y%m%d`.sql

圧縮する時

  • テーブル単位の取得の場合
$ mysqldump  -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} --single-transaction --default-character-set=${CHARASET} --routines ${DB_NAME} ${TABLE_NAME_1} ${TABLE_NAME_2} | gzip > hogehoge_`date +%Y%m%d`.sql.gz
  • DBスキーマ単位で取得の場合
$ mysqldump -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} --single-transaction --default-character-set=${CHARASET} --routines --add-drop-database --databases ${DB_NAME} | gzip > hogehoge_`date +%Y%m%d`.sql.gz

各オプションの内容

single-transaction

  • 対象がinnodbのときのみ有効(myIsamでは効果がない)
  • dump取得時にテーブルロックをしないため、更新時の待ちが発生しない。

default-character-set

  • dump時の文字コードを指定する。
  • 指定した文字列に変換してdumpを作成する。
  • 指定しない場合、サーバー側で指定されているデフォルト文字コードが自動指定されるため、取得側とリストア側で文字コードのデフォルトが違う場合には、文字化けが起きる可能性が高まる。

routines

  • ストアドルーチン (プロシージャーおよび関数) も一緒にdumpに含める。

add-drop-database

  • 指定したDBスキーマをdrop database(削除)するクエリをdumpに含める。

リストア方法

TABLEのリストア

$ mysql -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST}  -D ${DB_NAME} < hogehoge_`date +%Y%m%d`.sql

DBのリストア

$ mysql -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} < hogehoge_`date +%Y%m%d`.sql

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'  

後日談

python2系を動かすとエラーとなってしまったので、やはり根本解決にはなっていない模様

Your PYTHONPATH points to a site-packages dir for Python 3.x but you are running Python 2.x!
     PYTHONPATH is currently: "/usr/local/lib/python3.7/site-packages:$PYTHONPATH"
     You should `unset PYTHONPATH` to fix this.

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したい場合

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

mysql> SELECT GROUP_CONCAT(ID) FROM information_schema.PROCESSLIST WHERE TIME > 59;

GROUP_CONTACT関数を使うことで複数レコードをカンマ区切りで1行にまとめられる

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