なっく日報

技術やら生活やらのメモ

Invokeを少し触ってみた

Invokeとは?

github.com

Python製のタスクランナーだそう。make, rake, gulpみたいな。

↓みたいにタスクを書いて、invoke clean buildみたいに実行できると。

from invoke import run, task

@task
def clean(docs=False, bytecode=False, extra=''):
    patterns = ['build']
    if docs:
        patterns.append('docs/_build')
    if bytecode:
        patterns.append('**/*.pyc')
    if extra:
        patterns.append(extra)
    for pattern in patterns:
        run("rm -rf %s" % pattern)

@task
def build(docs=False):
    run("python setup.py build")
    if docs:
        run("sphinx-build docs docs/_build")

どこで使われている?

Fabric(https://github.com/fabric/fabric/)で。

http://www.pyinvoke.org/faq.html#why-was-invoke-split-off-from-the-fabric-project

↑を読むと、Fabricが仕事し過ぎなため、ライブラリを分割した模様。

サンプルは?

非常にシンプルで直感的に使えるのですが、事例が少ない。。

日本語ではこちらのサイトくらい www.hexacosa.net

一番いいのはFabricの事例と、作者のタスク集みたいなのを見ること。

実戦で使ってみる?

ちょっと悩む。

makeとかrakeで何とかならんこともないし。

While fully usable, Invoke is still pre-1.0 software and has no backwards compatibility 

なので、API変更もあり得るし。

どうしてもPythonで全部統一したい人は使ってみたらよいのではないでしょうか・・・

Google Cloud DNSで設定ファイルをimport/exportする

Cloud Deployment Manager にはGoogle Cloud DNSを設定する機能がないっぽいですが、代わりにgcloud dnsコマンドが使えそうです。

コマンド例

エクスポート

↓のコマンドを打つと

gcloud dns record-sets export -z example-com-zone example-com-zone.yml

↓のようなYAML形式で出力されます。

---
kind: dns#resourceRecordSet
name: example.com.
rrdatas:
- ns-cloud-c1.googledomains.com.
- ns-cloud-c2.googledomains.com.
- ns-cloud-c3.googledomains.com.
- ns-cloud-c4.googledomains.com.
ttl: 21600
type: NS
---
kind: dns#resourceRecordSet
name: example.com.
rrdatas:
- ns-cloud-c1.googledomains.com. cloud-dns-hostmaster.google.com. 3 21600 3600 1209600
  300
ttl: 21600
type: SOA

インポート

↓のコマンドでYAML形式のファイルをインポートできます。

gcloud dns record-sets import --delete-all-existing -z example-com-zone example-com-zone.yml

ポイント

  • インポート時には --delete-all-existing を指定しないとダメなよう
  • 書式にエラーがある場合は更新されないので、中途半端な状態にならないかは気にしなくて大丈夫なよう

Slackで絵文字をskin-toneを変えた絵文字全てをクリップボードにコピー

本日は時間がないので一発ネタで。

mihyaeru21.hatenablog.com

でお見かけしたネタだと思うのですが、ワンライナーでいけます。

EMOJI= no_good perl -E '$a.=":$ENV{EMOJI}::skin-tone-$_:"for 2..6;say$a'|pbcopy

クリップボードに入ったモノをSlackに貼り付ければ、こんな感じに!

f:id:nakimura:20160425193257p:plain

ESLintで拡張子をみてテキストをゴニョゴニョできる話

久しぶりにESLintの話題を。

公式ドキュメントに書いてあるのですが、ESLintプラグインでは拡張子毎にprocessorを設定できるそう。

http://eslint.org/docs/developer-guide/working-with-plugins#processors-in-plugins

processor is 何?

このeslint-plugin-markdownがわかりやすいかもしれません。

github.com

markdownからJavaScriptのコード部分だけを抜き出し、lintできるというプラグインです。

↓のpreprocessという関数の部分を見ればわかりますが、markdownのテキストからJavaScriptのコード部分だけを抜き出すということをやっています。 https://github.com/eslint/eslint-plugin-markdown/blob/f97e0c01beb7cc6dad21d828ea80e4fbe55317af/lib/processor.js#L43

抜き出したコード部分を配列で返せば、ESLint本体側でそれらをlintしてくれる挙動になっています。

※ちなみにmarkdownをパースする箇所では、昨日の記事で書いたプレゼンテーションツールのremarkが使われていましたw

どんな場合に使えるか?

  • ぱっとプラグインが見つからなかったですが、HTMLファイルの<script>〜</script>の中身のチェックにも使えそう
    → ありました eslint-plugin-html - npm (mysticateaさん、ありがとうございます)

  • テキストの中身をみて、pluginをOFFにするとか (eslint-plugin-disable がまさにそれ)

  • /* eslint no-var: 0 */ みたいなコメントを一行目に強引につけて、ファイルの中身に応じて、動的にルールをON/OFFする(ES2015とES5が混じっている環境で使いたい)

など。

まとめ

使いたい(使うかも)

Github Pages + Markdownで楽々プレゼン生活

qiita.com

の記事の内容ほぼままなのですが、

自分的にはライフチェインジングな発見だったのでご紹介。

Github Pagesとremarkを組み合わせるとプレゼン資料作成が捗るよというお話です。

Github Pagesとは?

みなさん知っていると思いますが、Github上で、yukidarake.github.ioみたいなリポジトリを作ると、https://yukidarake.github.io/にWebページを公開できるという機能です。

が、上記のようなユーザ/オーガニゼーションだけでなく、gh-pagesブランチを作成すれば、プロジェクト毎にも作れるそう!(これ知らなかった)

その場合、URLは https://yukidarake.github.io/presentations みたいになります。

詳しくは↓をご覧ください。

pages.github.com

remarkとは?

github.com

HTML and CSSを使って、ブラウザ上で表示できる(よくありそうな)プレゼンテーション用ツールです。

が、このremarkの良い所は、スライドの内容を別ファイルにmarkdownで書くことができるということ。

さらに、一枚、index.htmlを準備し、パラメータでスライド用ファイルを読み分けるよう細工すれば、都度HTMLやCSSを触る必要ありません!

では、Github Pagesとremarkを組み合わせてみましょう

で、こんな感じになりました。

画像キャプチャ f:id:nakimura:20160421194908p:plain

https://yukidarake.github.io/presentations/?my-first-presentation

TIPS

  • Githubリポジトリの設定より、デフォルトブランチをgh-pagesに変更しておくとよい
  • README.mdを各資料へのインデックスページとして利用するとよい https://yukidarake.github.io/presentations/
  • ローカルでの動作確認はpython -m SimpleHTTPServer 8000が便利だった
  • 絵文字を使うと見栄えが良くなる(気がする)

こんなところで。

一発ネタ。ワンライナーでDynamic Inventory

このままでは使えないですが、何かのヒントにはなるかもしれません。

GCPなんかで、AnsibleのDynamic Inventoryを使う場合、↓の公式ページによれば

http://docs.ansible.com/ansible/guide_gce.html#gce-dynamic-inventory

gcp.pyでやるのをオススメしてます。

が、Dynamic Inverntoryを実現するスクリプトを作るのは結構簡単です。

↓のルールを守って、JSON形式の標準出力でホスト一覧を返せばよいと。
Developing dynamic inventory — Ansible Documentation

このレベルであれば、gcloudコマンドとjqを組み合わせればあっさりいけそうな感じ。

#!/bin/sh
gcloud compute instances list --format json --project project_name \
  | jq 'map(select(.tags.items | any(. == "jenkins"))) | {jenkins:{hosts:map(.networkInterfaces[0].networkIP)}}'

とかでも動くっちゃ動く(冒頭でもいってますが、このままじゃ使えませんが・・・)

上記のコマンドで「タグにjenkinsを含むホストのインターナルIPを抜き出して整形」ができるという感じです。

本日NginxでSSLの設定をする際に参考になったサイト

本日、バックエンドのJenkinsおじさんをSSLで終端させるためにNginxを設定したので、その過程のメモを。

多分、どなたかの参考にはなるはず・・・

Mozilla SSL Configuration Generatorが便利

Redirecting to ssl-config.mozilla.org...

各種ミドルウェアApache, Nginx, Lighttpd, HAProxy, AWS ELB )のオススメの設定が生成されます。

勉強になるし、いい感じ。

OCSP Staplingの設定がわかりづらかった

ssl_trusted_certificate に指定する証明書のところ。

http://blog.mylibs.jp/archives/173blog.mylibs.jp

のサイトにお世話になりました。

ルート証明書とCA中間証明書を結合したファイルが必要だと。。

proxy_pass設定時の注意点

今回はNginxとJenkinsおじさんが同一インスタンスにいるので、必要なかったんですが、いちおうメモ。

d.hatena.ne.jp

要は、proxy_passでホスト名を指定する場合、下記設定をしないとDNSに変更があった際に、キャッシュが悪さして困ると。

  • resoloverの設定が必要(例:resolver 127.0.0.1;
  • setでホスト名を変数にしないといけない(例:set $api_backend "api.oreno";

こんなところで。