Masteries

技術的なことや仕事に関することを書いていきます.

MySQLでテーブル名やカラム名に予約語を使うには?

最高の夏ことはてなサマーインターン2018が今年も開催されています. いろいろあって今年も講義を担当させて頂いており, 今回は何故かデータベースの講義をすることになりました.

その講義の途中, インターン参加者の方から, 「MySQLのテーブル名やカラム名に予約語は使えますか?」と質問をもらったところ, 「アー... どうでしたっけね...?」となってしまい, きちんとお答えできなかったので, 調べました.

結論としては,

にあるように, 引用符(`)で囲まれている場合は, 予約語もテーブル名やカラム名として使えます. MySQL 8.0.12で試すと, こういう感じなります:

mysql> create table int (i int);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'int (i int)' at line 1

mysql> create table `int` (i int);
Query OK, 0 rows affected (0.11 sec)

EdgeRouter Xでsardineを動かす

Edgerouter Xにmackerel-agentを入れて, 家のNasneやNature Remoを監視しています. 特段不満はないのですが, 唯一挙げるとすれば mackerel-agent.conf にプラグインの設定を書いているので, NasneやNature RemoのメトリックがEdgeRouter Xのカスタムメトリックとして扱われる, というのがあります. 出来ればHomeなどのサービスを用意して, そのサービスメトリックとして投稿したい...

そういう時に使えるのが, fujiwaraさん謹製のsardineです. Mackerelのプラグインによって取得したメトリックを, CloudWatchに蓄積したり, Mackerelのサービスメトリックとして投稿したりすることができます.

github.com

次のような設定ファイルを書いて...

[plugin.metrics.NatureRemo]
command = "/path/to/mackerel-plugin-nature-remo -access-key=..."
destination = "Mackerel"
service = "Home"

次のようなコマンドで, 設定ファイルを読み込みつつ実行すると, serviceで指定したMackerelのサービスにプラグインの実行結果がサービスメトリックとして登録されます.

$ MACKEREL_APIKEY=... sardine -config /path/to/sardine.conf

こういう感じ. いかにも便利ですね.

f:id:papix:20180809120010p:plain

というわけで, sardineをEdgeRouter Xでも動くようにビルドしてみましょう. 結論から言えば, 次のようにビルドしてあげればOKです.

$ GOOS=linux GOARCH=mipsle go build -o sardine ./cmd/sardine/main.go

sardineという名前で, GOOS=linuxかつGOARCH=mipsleなバイナリが生成されるので, あとはscpなどでEdgeRouter Xに転送して実行すれば大丈夫でした.

「Rejectcon 2018」に登壇することになりました

9月29日にbuildersconのRejectconがあるのですが, そこで登壇することになりました.

techplay.jp

タイトルは, その「s」を付けるために ─ はてなブログHTTPS化の軌跡です.

以前, エンジニアセミナーでもはてなブログのHTTPS化について発表しています. その時は, はてな社内において"第1フェイズ"そして"第2フェイズ"と呼ばれていた, 独自ドメインのための証明書自動発行システム以外の出来事について語りました. 今回のRejectconのトークでは, "第3フェイズ"すなわち独自ドメインのための証明書発行システムを含む, はてなブログのHTTPS化の全行程において, どのように考え, どのように取り組み, どのような出来事が起きたのかをお話できればと思っています.

Rejectconではない, 本編のbuildersconでは, id:aereal さんがブログサービスのHTTPS化を支えたAWSで作るピタゴラスイッチというタイトルで, 独自ドメインのための証明書自動発行システムの詳細についてトークされますので, それと合わせてお聞き頂けると, より楽しめる... かもしれません.

...それでは, 9月28日に「Rejectcon 2018」でお会いしましょう!

「go-nature-remo」と「mackerel-plugin-nature-remo」で照度の取得に対応しました

先日, iPhone版のNature Remoのアプリがリニューアルされていたのですが, いろいろ触ってみているうちに, 温度と湿度に加えて照度を取得して表示されるようになっていることに気づきました.

f:id:papix:20180701000646p:plain

APIドキュメントにはまだ掲載されていませんが, 実際にAPIを叩いたところ照度が取得できたので, Nature RemoのGo言語向けクライアントのgo-nature-remoと, それを使ったMackerelプラグイン, mackerel-plugin-nature-remoでも対応しておきました.

github.com

github.com

実際に自宅にあるEdge Router Xで動いているmackerel-plugin-nature-remoの様子をお見せします*1.

...ちなみにこのグラフは, Mackerelのグラフ共有機能を使って埋めてみました. 便利ですね.

mackerel.io

*1:後日, サービスメトリック化したので最近のグラフです

Go言語でMixed Contentsをなるべく発見する

ウェブサービス/ウェブサイトのHTTPS化にあたっては, Mixed Contentsへの対応が求められます. 既にHTTPSを有効にする作業が完了している状態で, Mixed Contentsが発生していないかを確認したいのであれば, (Node.js製のツールですが)Mixed Contentsの発見のために mcdetect などを使うことができるでしょう.

www.npmjs.com

例えば, このブログ(https://papix.hatenablog.com/)を mcdetect でチェックすると, 次のような結果になります:

$ mcdetect https://papix.hatenablog.com/
Checking https://papix.hatenablog.com/ ...

Targets checked: 1
Errors (blockable content): 0
Warnings (optionally blockable content): 0

ここでの Errors (blockable content)Warnings (optionally blockable content) は, どちらもHTTPSのページでHTTPのコンテンツを読み込んでいる状態ですが, 前者はそのコンテンツがHTTPのみで配信されている状態, 後者はそのコンテンツがHTTPとHTTPSの両方で配信されている状態(= コンテンツを読み込むときのURLを, http://... から https://... にすればMixed Contentsが解決できる)を指します.

mcdetect の課題

mcdetect は, 実際にHeadless Chromeを利用してMixed Contentsの検出を行います. そのため, Mixed Contentsを検索する対象ページは, (前述の通り)HTTPS化が有効になっている必要があります. 実際, mcdetect にHTTPのURLを与えると, Mixed Contentsを見つけるために, 自動的にHTTPSのURLとしてアクセスを行い, Mixed Contentsの検出を行います:

$ mcdetect http://example.com/
Checking https://example.com/ ...

Targets checked: 1
Errors (blockable content): 0
Warnings (optionally blockable content): 0

そのため, 実際にHTTPS化を有効にする前に, なるべくMixed Contentsを見つけたい! という用途には利用できません.

Go言語でMixed Contentsをなるべく発見する

※ "なるべく"とあるように, 以下のコードで全てのMixed Contentsが発見出来るわけではありません. あくまでMixed Contentsを見るける上での参考情報としてお使い下さい.

そこで, Go言語でMixed Contentsを"なるべく"見つけるコードを書きました:

package main

import (
    "fmt"
    "log"
    "regexp"
    "strings"

    "github.com/PuerkitoBio/goquery"
)

func main() {
    doc, err := goquery.NewDocument("https://papix.hatenablog.com/")
    if err != nil {
        log.Fatal(err)
    }

    for _, tag := range []string{"img", "audio", "video", "script", "iframe"} {
        doc.Find(tag).Each(func(i int, s *goquery.Selection) {
            src, _ := s.Attr("src")
            if strings.HasPrefix(src, "http://") {
                fmt.Printf("error\t%s\t%s\n", tag, src)
            }
        })
    }

    doc.Find("link").Each(func(i int, s *goquery.Selection) {
        rel, _ := s.Attr("rel")
        if strings.HasPrefix(rel, "stylesheet") {
            href, _ := s.Attr("href")
            if strings.HasPrefix(href, "http://") {
                fmt.Printf("error\tlink\t%s\n", href)
            }
        }
    })
}

前述の通り, "なるべく"なので100%のMixed Contentsを見つけられる訳ではないですが, これである程度のMixed Contentsを見つけることができます. ここでは,

  • img, audio, video, script, iframeタグのsrcにHTTPのURLがないか
  • linkタグで, かつrelstylesheetのときに, hrefにHTTPのURLがないか

を見ています. 加えて目視で,

  • style タグの中でHTTPのコンテンツを呼び出していないか
  • scriptタグで呼び出しているJavaScriptや, linkタグで呼び出しているスタイルシートでHTTPのコンテンツを呼び出していないか

...辺りを確認しておくと, 更に良さそうです.

まとめ

Go言語のgithub.com/PuerkitoBio/goqueryを使って, なるべくMixed Contentsを見つけるコードを紹介しました.

前述の通り, 実際にHTTPS化した後にMixed Contentsの対応を出来るのであれば, mcdetect を利用する方が確実ではありますが, そうもいかない場合はこういうったスクリプトである程度Mixed Contentsを潰した後, HTTPS化を実施して, mcdetectで最終チェックをする, という手が有効になるかもしれません.