weblog of key_amb

主にIT関連の技術メモ

Googleサイト上の個人WikiでMarkdown Hereを使うことにした

気づけば1ヶ月以上ブログの更新が滞っていたようです(汗)
いくつか小ネタが溜まっているので、隙を見て消化していきたいと思っています。

さて、半年ほど前に、日々の個人的な雑メモは こちらの Google サイト に書くことにしました。
その経緯については、下の記事でかんたんに紹介しています。

Google サイトは手軽にページ階層が編集できるなど、個人 Wiki として便利である一方で、 Markdown に対応していないというのが、そこそこ大きなペインポイントでした。

が、1ヶ月ほど前に何か手段はないかともう一度探してみたところ、 Markdown Here を見つけることができました。

で、試してみて、非常に満足したので、それからこれを使っています。

以下、Markdown Here について簡単に紹介します。

Markdown Here の使い方

  1. Markdown で記事の原稿を書く。
  2. ホットキー(デフォルトは Ctrl + Alt + M)を入力すると、HTMLにレンダリングされる。
    1. もう一度ホットキーを入力すると Markdown テキストに戻る。

自分は FirefoxChrome を常用していますが、どちらもデフォルトのホットキーのまま使っています。
また、オプションでシンタックスハイライトのスタイルで使われている highlight.js のスタイルを変更することができます。 自分は Tommorow Night Bright にしました。

Markdown Here の他のブラウザやメーラへのインストール方法については、公式サイトをご覧ください。

余談ですが、 Markdown Here は Google サイトだけでなく、 GmailBlogger など他の Google サービスでも使えます。 更には、 FacebookTumblr, Evernote でも動作するようです。
詳しくは Compatibility · adam-p/markdown-here Wiki · GitHub をご覧ください。*1

見た目はどんな風になるの?

Google サイトのこのページ で、 Markdown-Cheatsheet のソーステキストを入力して、 Markdown Here でレンダリングしてみました。

だいたい、いい感じになっていると思います。

ご興味のある方は、ぜひご覧ください。

終わりに

Google サイトを Markdown で書けるようになる Markdown Here を紹介しました。
Gmail 等でも使えますので、機会がありましたら試してみてはいかがでしょうか。

*1:こちらにはリストされていませんが、自分が試してみたところ、 Confluence Wiki でも動作しました。

#PrometheusCasual #1 に行ってきた

発表資料

@wyukawa Hadoop, Fluentd cluster monitoring with Prometheus and Grafana

@mtanda Prometheus on AWS

@tokuhirom promgen - prometheus management tool

kawamuray HBase, Kafka cluster monitoring with Prometheus and Grafana

@moznion 5分で作るprometheus exporter

Togetter まとめ

メモ

  • Prometheus の特徴
    • アーキテクチャ - https://prometheus.io/docs/introduction/overview/#architecture
    • Pull 型
      • Prometheus は監視ノードの HTTP インタフェース(Exporter)を叩いてデータを取得
      • pushgateway を使うと push 型もできる
    • 監視対象に Exporter を仕込む方法:
      • 1) 監視対象自体に HTTP エンドポイントを持たせる
      • 2) 独立した Exporter プロセスを動かす
    • データを演算できる。クエリが書ける
      • PromQL
    • Local の TimeZone 使えない
      • @kawamuray「彼らは local time に猛烈な嫌悪感を持っている」
  • Exporter を作る
    • Go, Java, Python, Ruby のクライアントライブラリがある https://github.com/prometheus?query=client
      • client_java
        • simpleclient を監視対象の Java アプリに組み込むが楽っぽい @tokuhirom
        • simpleclient_jetty, simpleclient_spring_boot 作った @tokuhirom
    • 作るのは簡単なので、どんどん作るといい @kawamuray
      • H2O の exporter (Golang) は5分で書ける @moznion
  • Prometheus の運用について
    • 楽でほぼ手間はないらしい @mtanda
      • バージョンアップ時に非互換の変更があると、設定を書き換えないといけなかったり
    • ディスクをかなり使う @mtanda
      • 1ノード 150 メトリクスで1ヶ月あたり 200MB とか
    • YAML 管理がつらい
      • Exporter の管理など
      • Solution:
        • Service Discovery
          • EC2, Consul, k8s などと連携して監視対象リストを自動更新
          • ★ @mtanda 氏の資料
        • promgen by @tokuhirom
          • WebUI ぽちぽちで監視ノード(というか Exporter ?)管理できるっぽい
            • Export/Import 機能もある?(想像)
          • バックエンドはデフォルト RDB だけど、プラガブル
            • ポータブル
            • 内部ではデプロイツールがホスト情報を管理していて、それと連携してる
          • promgen-alerting
            • Prometheus の Alertmanager から webhook でアラートを受け取り、通知する
          • 「天気がよかったので Ruby で作った」(笑)
    • 設定
      • データの保持期間がデフォルト15日
      • storage.local.memory-chunks デフォルト 1MB
        • 変える場合、max-chunks-to-persist も合わせて変更しないといけない。罠い。
  • データを長期保存する工夫 @mtanda
    • Prometheus を2台用意
    • 片方で 1時間ごとにデータをサマライズしている

所感

  • 勉強会
    • 出席率よかった。次世代監視ツールとして、注目度が高い雰囲気
    • Prometheus 手元でちょっと動かしたぐらいでほとんど情報がなかったので、ユーザ事例をたくさん聞けてよかった
  • Prometheus
    • 他の監視ツールとはアーキテクチャが異なるので、学習コストはありそう。実運用に落としこむまで試行錯誤が必要そう
    • 大規模向けと思った
    • SaaS 使いたくない、柔軟にメトリクス取りたい、技術力のあるエンジニアが揃ってる、そんなチームに向いてそう
    • promgen は公開予定はあるのだろうか?

ありがとうございました。

6/8 appengine ja night #33 に行ってきた #gcpja

後でブログ書こうと思って、土日にも書くのを忘れていた(汗)のですが、珍しく早起きして思い出したので、今更ブログを書いています。。

というわけで、掲題の通り、6/8 に appengine ja night #33 に行ってきました。

ご存知、GAE こと Google App Engine のユーザ向けイベントですね。

さて、今年はよく GAE の話題を見聞きするように思います。
今回も発表されていたメルカリアッテで採用されたという件と、GCP の年内東京リージョン開設が発表されたことがインパクトが大きかったですかね。

今回の発表資料(の一部)は Connpass の資料一覧ページ に上がっておりますので、そちらをご覧ください。

印象に残ったこと

「メルカリ アッテ」の発表

事前に 4/23 Go Conference の発表資料を見ていたこともあり、個人的に一番注目度が高い発表でした。

正確な月次コストについての言明は避けられましたが、DAU 100万あたり 200万円と、かなり具体的な数字が述べられました。
コスト試算するにあたって参考になりそうです。
また、GAE の費用内訳の紹介もありました。(詳しくは資料をご覧ください)

Standard Environment が強い

Standard Environment と Flexible Environment については公式の Google App Engine ドキュメントをご覧ください。

今回のイベントでは、Standard Environment 対応言語の中でも、Go 言語推しの方々が目立ったと思います。メルカリアッテさんも Go。

「メルカリ アッテ」の発表でも述べられていたように、急激なトラフィック変動にもロスなくシームレスにスケールできるのは、Standard Environment + Go言語の力によるところがあるようです。

逆に言うと、Flexible Environment だとインスタンスの起動が遅い(下の参考記事によれば分単位)ので、そこまで瞬間的にスケールはできないのだろうと思われます。

例えば、3月に GAE 対応が発表された Ruby や Node.js は Flexible Environment なので、これらの言語での GAE 利用を検討する場合、この点は念頭に置いておいた方がよさそうです。

この辺り、最近下の記事を読んで、参考になりました。

LT: a2cさん「GAEレスポンスの1桁ms化」

今の GAE は海外にしか拠点がなく、RTT が 300ms 以上はかかるので、それを短縮しましょうという話。
このトークでは CDN の Fastly を使って高速化した事例が紹介されました。

メモ:

  • Fastly について:
    • XHR のプリフライトリクエストをスキップできる
    • 全てのログを即時に取得可能
    • CDN なのに演算できる
    • パージなど API の使い勝手がよさそう
    • 価格についてはボリュームディスカウントが効く。詳しくは Fastly の営業さんに聞いて下さい、と。

その他

他にも色々おもしろい話があったので、興味があれば Togetter など見てみるとよいかもです。

所感

運用のないインフラは、インフラの理想だと思います。

GAE は、特有の制約も色々とあるようですが、レイテンシ要求の厳しくない、RDB を使わなくていいサービスであれば、有力な候補になりそうです。

なんとなく、今後スタートアップなどでの採用も増えそうだなと思いました。

Ubuntu + xkb で JISキーボードのキー配置入れ替え

はじめに

仕事で使っている Mac は、昔USキーボードがかっこいいと思っていた頃にUSキーボードにしたままなのですが、家ではJIS配置のキーボードを使っています。
JIS配置の場合、「変換」「無変換」キーが余ること、「半角/全角」「Esc」キーが遠いことから、昔から以下のように入れ替えて使っています。

  • 「変換」 ⇔ 「半角/全角」
  • 「無変換」 ⇔ 「Esc」

…で、最近 Ubuntu 16.04 LTS でこれのやり方を調べてやってみたので、本記事にメモしておきます。

TL;DR

xkb の設定ファイル /usr/share/X11/xkb/symbols/inet を以下のように直接編集しました。

  // Evdev Standardized Keycodes
  partial alphanumeric_keys
  xkb_symbols "evdev" {
      :
-     key <HENK>   {      [ Henkan                ]       };
-     key <MUHE>   {      [ Muhenkan              ]       };
+     //key <HENK>   {      [ Henkan                ]       };
+     //key <MUHE>   {      [ Muhenkan              ]       };
+     key <HENK>   {      [ Zenkaku_Hankaku       ]       };
+     key <MUHE>   {      [ Escape                ]       };
+     key <ESC>    {      [ Muhenkan              ]       };
+     key <TLDE>   {      [ Henkan                ]       };
      :

ざっくり解説

xkbX Window System の一部で、キーボードを制御するもののようです。

この xkb の設定は下のコマンドで確認することができます。

setxkbmap -print

自分の環境では次の出力が得られました。

xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+jp+us:2+inet(evdev)"    };
    xkb_geometry  { include "pc(pc105)" };
};

設定ファイル /usr/share/X11/xkb/symbols/inetxkb_symbols の行で読み込まれています。
これには、キーボードのシンボル(キーに対するエイリアスのようなものと理解している)とその振る舞いの対応が記述されているようです。

そのマッピングを上のように書き換えた、というわけです。

なぜグローバルな設定ファイルを書き換えたか

後掲する参考記事では ~/.xkb/symbols/ 以下に独自のキーシンボル設定ファイルを作り、xkb_symbols のブロックで include するやり方が記載されています。
自分も最初、それでやろうと思ったのですが、入力モードを 日本語 ⇔ 英語 と切り替えると、設定がリセットされてしまうようで、しばらくこれにハマりました。
おそらく、xkb のグローバルな設定で、 xkb_symbols が再読み込みされるのだろうと想像しました。

その設定をログインユーザについて書き換える方がベターと思いますが、そこまで調べずに今回はこういうやり方にしてしまいました。

入力モードの切り替えは「Ctrl + Space」でもできる

冒頭で「半角/全角」キーが遠いと述べましたが、入力モードのトグルだけであれば、「Ctrl + Space」でもできます。
これは下の記事にある Fcitx の機能で、Ubuntu 16.04 LTS では、最初から有効になっているようでした。

また、下の記事もこの Fcitx の機能を使った Tips のようです。

参考記事

"clenv" というシェルスクリプトのパッケージ管理ツールのようなものを作った

主に先月、開発していました。
いまバージョンは 0.1.12 です。

最近、久しぶりにやりかけだった機能拡張を進めようかと思ったのですが、拡張した機能を今後、自分自身でもあまり使うイメージが持てなくて、現状をひとまずこの記事にまとめておくことにしました。

目次:

clenv とは

シェルスクリプトのパッケージ管理システムがあったら、流行るんじゃないかという妄想があって、試しにちょっと作ってみた、という感じです。

今のところ、シェルスクリプトに限らず、コマンドラインで実行可能なファイルをまとめる用途には使えるかな、というぐらいのもので、実際に自分でも使っています。

できること:

  • $CLENV_ROOT/shims/ というパス配下にモジュールの実行ファイルの symlink を貼る
  • $CLENV_ROOT/environments/ に任意の名前で「環境」を作り、モジュール群をその「環境」にインストール

お察しかと思いますが、clenv という名前は rbenvplenv の類推です。

clam モジュール

clenv で利用されるモジュールを clam モジュールと呼ぶことにしました。

モジュールの形式としては「Git リポジトリ」か、「ローカル環境からアクセスできるファイルシステム内の特定ディレクトリ」のみサポートされています。
いずれの場合も、clam.spec というファイルをトップ階層に持つ必要があります。

拙作のシェルスクリプトテストツールである shove も、実はこの clam モジュール形式に対応しておりまして、その clam.spec は下のようになっています。

# bash
name=shove
version=0.7.2
executables=bin/shove
resources=lib/*

このファイルは clam という bash スクリプト内で評価されます。

clam スクリプトRubygem, Perlcpan コマンド相当です。

clam https://github.com/key-amb/shove.git を実行すると shoveclenv の環境下にインストールします。
デフォルトの default environment を使っている場合、$CLENV_ROOT/environments/ 以下のディレクトリ構成は以下のようになります。

~/.clenv/environments
└── default
    ├── Clamdb.txt
    ├── bin
    │   └── shove -> ~/.clenv/environments/default/modules/shove/bin/shove
    ├── lib
    │   ├── shove.bashrc -> ~/.clenv/environments/default/modules/shove/lib/shove.bashrc
    │   └── t.shrc -> ~/.clenv/environments/default/modules/shove/lib/t.shrc
    └── modules
        └── shove/ # モジュールのディレクトリが丸っとコピーされる

で、 ~/.clenv/environments/default/bin~/.clenv/shims に symlink されるので、 ~/.clenv/shims に PATH を通しておけば shove をパスなしで実行できる、というわけです。

clam を使う前に 〜 clenv セットアップ

順番が前後したのですが、上の clam の機能を使う前に clenv のセットアップが必要です。
README.md にも書いている通りですが、転記しておきます。

インストール:

git clone https://github.com/key-amb/clenv.git ~/.clenv

シェルの設定:

export CLENV_ROOT=$HOME/.clenv
export PATH="$HOME/.clenv/bin:$PATH"
export PATH="$HOME/.clenv/shims:$PATH"
. ${CLENV_ROOT}/shrc.d/clenv.shrc

初回はこれを .bashrc ないし .zshenv に書いて exec $SHELL -l を実行して下さい。
最後の . clenv.shrcclenv_switchclenv_use という2つのシェル関数をロードします。

環境の作成には clenv init-env [ENV] を実行します。(ENV のデフォルトは default)
これは $CLENV_ROOT/environments/ 以下に所定のディレクトリを作るだけです。

clenv_switch ENV で、~/.clenv/environments/ENV/bin~/.clenv/shims に symlink されます。
clenv_use ENV だと更に ~/.clenv/environments/ENV/lib/*シェルスクリプトとして現在のシェルに読み込みます。(が、この機能は要らないかなと思っていたりします。)

その他便利かもしれない使い方

Clamfile

RubyGemfile, Perlcpanfile 相当です。

モジュールをこのファイルに記述して clam -r Clamfile でまとめてインストールできます。
気になる方は README.md をご覧ください。

任意の実行ファイルを勝手に clam 化してインストール

「この実行ファイルに PATH を通したいから clenv 下に入れておきたい」というときに便利な使い方です。
単純にソースをローカルにダウンロードして clam.spec を記述すればいいです。

wget https://example.com/any-program.zip
unzip any-program.zip
cd any-program
cat <<EOS > clam.spec
name=any-program
version=0.x
executables=bin/*
EOS
clam . # インストール

こんな感じで any-program/bin/* 以下の実行ファイルに PATH を通せます。

clenv を作ってよかったこと

自分は割とリポジトリを細かく分ける性格で、小さな CLI を含むリポジトリがちらほらあります。
clenv 以前は、それらを submodule にまとめて管理していました。 その管理や、各環境で PATH を通す作業がやや面倒だったのですが、clenv + clam に移行して Clamfile だけの管理になったので、ちょっと楽になった気がします。

clam は消すのも簡単なので、ツールを試しに使うようなときに、とりあえず PATH を通しておくことも気軽にできます。

あれ、シェルスクリプトあんまり関係ない…?

そうなんです。
一応シェル・リソースをロードする機能もあるにはあるのですが、今のところ、「任意の実行ファイルをまとめる君」になっており、「シェルスクリプトのパッケージ管理ツール」としては不完全かな、と思います。

最初に考えていた構想では、シェル関数などを再利用しやすいようにしようなどの企てもあったのですが、今は手が止まってる感じです。
Bash でライブラリ関数的なものを作る気になったら、この構想も進めたい気持ちが高まるかもしれません。

Zsh だとけっこうプラグインがたくさんあって、プラグインの管理ツールもあるようなので、ひょっとしたらここで考えているようなことは実現されているかもしれませんね。

(そもそもシェル関数にしたいケースってけっこう限られそうだと最近思いました。その話はまた機会があれば。)

他に似たようなものないの?

シェルスクリプトのパッケージ管理システムとして見つけたのは下の2つです。

それぞれ、各々のフレームワークの中でモジュール化して再利用できそうな雰囲気ですが、さらっと眺めたところ、各々の形式に合わせてモジュール/パッケージを作らないといけなさそうな感じ。
自分が妄想しているものとは少し違うかなー、と思いました。

余談 〜 shove との関係

下の記事でもちらっと言及していましたが、shove を作ったのは、この clenv のテストを書くためでした。

おわりに

…というわけで、かなり個人用途な感じのツールですが、GitHub で公開していますので、ご利用・ツッコミなどご自由にどうぞ。

また、他に「こういうのあるよ」という情報をいただけましたら幸いに思います。

Enjoy!