ぶろぐ

日記です

無料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のログが出ているのでちゃんと見ればそれで原因は追えそう)
  • GithubAWS 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

github.com

基本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)