無料SSL証明書のLet’s Encryptを使ってみた
nginxでlet's encrypt使ってみました。
# 準備 git clone https://github.com/letsencrypt/letsencrypt.git cd letsencrypt ./letsencrypt-auto --help # nginxに設定(letsencryptとやり取りするために使う) location ^~ /.well-known { alias /var/letsencrypt/.well-known; } # ディレクトリ作成 mkdir /var/letsencrypt # 作成 ./letsencrypt-auto certonly --webroot --webroot-path /var/letsencrypt -d takuan.me # 証明書 /etc/letsencrypt/live/takuan.me/fullchain.pem #秘密鍵 /etc/letsencrypt/live/takuan.me/private.pem
的な感じで。
90日で期限が切れるので、cron等で自動更新させるのが通っぽい。
0 2 1 * * $SCRIPT_PATH/letsencrypt-auto --force-renew certonly --webroot --webroot-path /var/letsencrypt -d takuan.me >> $LOG 2>&1
無料のSSL証明書、便利ですなー。
CentOS 7のFirewall
iptablesに代わってfirewallというのができたらしい。
#設定確認 firewall-cmd --list-all # httpsを許可(一時的に) firewall-cmd --add-service=https --zone=public # httpsを許可(永続的に、再起動しても適用) firewall-cmd --add-service=https --zone=public --permanent # httpsを許可(サービスを削除、非許可にする) firewall-cmd --remove-service=http --zone=public
CodeDeploy + Github + AutoDeployでくっそハマった。
Amazonの英語のチュートリアルをおうだけなんですねどねー
英語読めないわしにはつらい。
所感をメモっとくと・・・
- EC2にはCodeDeployのAgentをインストールしないと行けない(これは必須みたい)
- appspec.yml にdeploy script的なものを呼び出す記述をするが、ここでエラーになると原因が追いづらく感じたので小さく作っていったほうがいい(慣れの問題?ログがわかりづらい気がした。Agentのログが出ているのでちゃんと見ればそれで原因は追えそう)
- GithubとAWS CodeDeployが直接連携できる。AccessKeyとか渡すので、連携用にIAM作るのがベター。
- トリガーにはGitHub Auto-DeploymentとかいうService使う。デフォルトのブランチしかhockできないっぽい。
- デフォルト以外のブランチでもCodeDeployフックさせるなら適当なCIサービス使わないとダメかなー
- AWSCodeDeployRole をEC2のiam-roleに紐付ける
- ログの場所 /opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log
基本amazonのdocument見ればok。なんとなくどこまでやってくれるサービスなのか掴めてなかった。
一瞬hockの方法がわからなかった(Github -> CodeDeployの連携ができることを知らなかった)ので、Webhock -> API Gateway -> Lambda -> CodeDeploy ? とか思ってめんどくせーなーと思ったけどそんなことなかった。
まとめ
- CodeDeployとGithubを組み合わせて、JenkinsやCI不要で自動デプロイができる。
- また、AutoScalingグループに対してローリングデプロイみたいなことができるのでこれ便利。
joinしているテーブルでUsing temporary; Using filesort が出て遅い時
Railsを触るヽ('ω')ノ三ヽ('ω')ノ
とある日MySQLのチューニングをしていると Using temporary; Using filesort に出会う。
記事テーブルとコメントテーブルをjoinしているようなクエリ。とあるカテゴリの最新のコメント3件がほしい、またコメントしている記事の情報もほしい。
WHERE句で使っている検索条件のテーブルが、2つのテーブルでまたがってしまっている場合、一度JOINした後にSORTなどいろいろやらねばならず無駄である。先にレコードを絞ってからjoinしたほうが効率的。*1
そのため、1つのテーブルに検索条件を寄せて、Using filesortが出ないようにした。
NG case
SELECT `comments`.*, `post`.* FROM `comments` INNER JOIN `posts` ON `posts`.`id` = `comments`.`post_id` WHERE `posts`.`category_id` = 161 -- ☆ここがまずい AND ( comments.status = 1 AND comments.created_at <= '2016-03-27 18:11:47' ) ORDER BY comments.created_at DESC LIMIT 3; +----+-------------+----------+------+-----------------------------+-----------------+---------+--------------------------------+------+---------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+-----------------------------+-----------------+---------+--------------------------------+------+---------------------------------+ | 1 | SIMPLE | posts | ref | PRIMARY,category_id_idx | category_id_idx | 5 | const | 694 | Using temporary; Using filesort | | 1 | SIMPLE | comments | ref | post_id_idx,created_at_idx | post_id_idx | 5 | development.posts.id | 21 | Using where | +----+-------------+----------+------+-----------------------------+-----------------+---------+--------------------------------+------+---------------------------------+ 2 rows in set (0.00 sec)
OK case
SELECT `comments`.*, `post`.* FROM `comments` INNER JOIN `posts` ON `posts`.`id` = `comments`.`post_id` WHERE `comments`.`category_id` = 161 -- ☆ 一度commentsテーブルを絞ってからjoinする AND ( comments.status = 1 AND comments.created_at <= '2016-03-27 18:11:47' ) ORDER BY comments.created_at DESC LIMIT 3; +----+-------------+----------+--------+---------------------------------------------+----------------+---------+----------------------------------------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+--------+---------------------------------------------+----------------+---------+----------------------------------------+-------+-------------+ | 1 | SIMPLE | comments | range | post_id_idx,category_id_idx,created_at_idx | created_at_idx | 6 | NULL | 89540 | Using where | | 1 | SIMPLE | posts | eq_ref | PRIMARY | PRIMARY | 4 | development.comments.post_id | 1 | NULL | +----+-------------+----------+--------+---------------------------------------------+----------------+---------+----------------------------------------+-------+-------------+ 2 rows in set (0.00 sec)
いいね!
*1:JOINせずに、先にcommentsテーブルを取得して、それからpostsテーブルを引く二回に分ける方法もありだと思います。
レーベンシュタイン距離
サジェストで使うアルゴリズム
#!/usr/bin/env python # coding: utf8 import Levenshtein import sys inputString = sys.argv[1].decode('utf-8') strings = [ "大城しゅうじ", "大城ひろし", "大城隆史", "天野かつた", "比嘉太郎", "比嘉まさし", "大城まさし", "辺土名まさし", "オダスキーさん" ] for s in strings: l = Levenshtein.distance(inputString, s.decode('utf-8')) if (l <= 3): print(" 距離: " + str(l) + ", もしかして: " + s)
医療費控除のため確定申告してきた
骨折で手術して医療費が10万超えたので申告。
まあまあ還付あるかなーと思ったが、結果1300円程度の還付。
あれ…?交通費と時間考えたらあまりやる意味なかった!!