Backlogに添付されたファイルをscpみたいにダウンロードするbacklogcpコマンドを作った

皆さんBacklog使っていますか?私はいつも便利に使っています。

Backlogの添付ファイルをクリックしてダウンロードしなければならない問題

ところで、こんなことありませんか?

  • 素材ファイルを添付してもらったが、それを利用するためにクリックしてダウンロードしてリネームして設置
  • バナーファイルを添付してもらったが、それを利用するためにクリックしてダウンロードして、さらに仮想環境に転送して設置
  • バナーファイルを添付してもらったが、それを利用するためにクリックしてダウンロードして、さらに本番環境に転送して設置

ダウンロードして見るだけのようなファイルなら良いのですが、エンジニアとしてBacklogを使っているとどうしても添付ファイルと開発が紐付いてきます。

で、上記のような作業が続いて続いて続いたので、嫌になってBacklogから直接ファイル設置できるようなコマンドを作りました。

backlogcp

github.com

事前設定

Backlogの[個人設定] > [API] でAPIキーを生成します。

f:id:k1LoW:20160707195051p:plain

インストール

$ gem install backlogcp

使い方

Backlogからファイルをダウンロードできそうに見えるURLをコピーします。例えば、

です。

そして、設置したいサーバで backlogcp のあとにコピーしたURLをそのまま貼り付けて保存先を指定します。

$ export BACKLOG_API_KEY=XXXXXxxxXXXXxxXXXXXxXXXXXXX
$ backlogcp https://101000lab.backlog.jp/file/TEST/path/to/%E7%94%BB%E5%83%8F.jpg ./path/to/image.png

scp ライクにファイル設置ができます。

これで、「クリックしてダウンロード」がなくなりました。便利!

というわけで、Backlogで「クリックしてダウンロード」が嫌になった人は是非使ってみて下さい。


(Backlogで、ダウンロード用の期限付きURLとか発行できるようにならないかなー)

フォームの入力を覚えてくれるChrome Extension "typd" をバージョンアップするなどした

そろそろFirefoxにWebExtension APIが安定搭載されるみたいなので

chrome.google.com

主な変更点

  • 動的なフォーム(input要素などを追加・削除したりするようなフォーム)に、ある程度対応しました。
    • 補完キーバインドを押したタイミングにもフォームを走査するようにしました。
  • ストレージ(chrome.storage.localのMAXが 5,242,880 byte)がいっぱいになった時のために、保存しているデータをフォーム単位で削除できるようにしました。
    • 拡張機能のオプションページで削除可能になっています。
    • 1.0.0以前に保存したものは一度同じフォームで入力データを保存しないと削除できません。
  • 'type=submit' な値は保存しないようにしました。
    • これによって一部保存データが利用できなくなります。
  • バージョンを1.0に上げた。

その他

最近JavaScriptづいているので、ちょっと開発環境を見なおしてみました。

  • package.jsonによる scripts 属性で npm run * なコマンドを定義。わかりやすく。
  • Webpack + BabelでちょっとモダンJavaScript環境を構築してみた。

たったこれだけですが、それだけでもかなり良いですね。

近い将来、GitHub - OctoLinker/browser-extension: OctoLinker – Available on Chrome and Firefox.ソースコードなどを参考にFirefoxにも対応したいと考えているのですが、

そうなると当初から構想にあった「入力データの共有」が欲しくなってきそう。

今のところ、どういう形で「入力データの共有」を実現するかは決まっていませんが、便利な形で実現したいです。

Auto ScalingではなくてAuto Cachingという考え方

今年の3月くらいからずっと悶々としていて、なかなか手が出せなかったアイデアがやっと実現できました。

(試行錯誤して書いてみたら、結果たった数行という。。。)

Auto ScalingではなくてAuto Cachingという考え方

AWSではAuto Scalingという、サーバの負荷の変化などによってEC2インスタンスをスケールする便利な機能があります。

が、大抵はクラウド環境でないと容易には実現できません。

例えば、クラウドではなく

  • サーバリソースは増やせない。
  • 普段はキャッシュはしてほしくないコンテンツ。
  • ただ、アクセスが多くなるとかで何かしら負荷が高くなった時には「仕方なく」キャッシュを使っても良い。落ちるよりはマシ。
  • 負荷が戻ったらキャッシュを使わないようにして欲しい。

という状況もあるかもしれません(そしてあります)。

「状況によってWebサーバがいい感じにキャッシュコントロールしてくれないかな」と考えていました。

Auto ScalingならぬAuto Cachingみたいな。

その時のメモがこちら

  • ngx_mruby( + http-dos-detector + mruby-changefinder)とかを駆使して、高負荷を検知したらキャッシュを利用するように変更するとか?
  • mod_mrubyとmod_cacheでもいけるのか?
  • というか、もともとそういう設定できないの?できるんでしょ?

(改めて検索してみたら、はるか以前に同じようなことを実現されていた方が。しかもkazuhoさんという。。)

Fukuoka.rb活動

いろいろ考えてはいたものの、別のOSS活動をしていました。

で、やっと先日のFukuoka.rbで重い腰を上げて試してみました。

なんとかmod_mrubyのインストールまでできたので、そのあとはずっとmod_cacheとmod_mrubyのドキュメントやエントリーを読んで、試行錯誤していました。

Auto Caching

こちらが成果です。

# -*- coding: utf-8 -*-
# LoadModule cache_module modules/mod_cache.so
# LoadModule cache_disk_module modules/mod_cache_disk.so
# LoadModule mruby_module modules/mod_mruby.so
#
# CacheRoot /var/www/cache
# CacheEnable disk /cache-control
# CacheIgnoreCacheControl Off
# CacheIgnoreNoLastMod On
# CacheIgnoreHeaders Set-Cookie
# CacheDefaultExpire 300
# CacheMaxExpire 600
#
# <Location /cache-control>
#   mrubyQuickHandlerFirst /path/to/autocache.rb
# </Location>

r = Apache::Request.new()

r.headers_in['Cache-Control'] = 'no-cache'

wc = Apache::Scoreboard.new()

if wc.loadavg.first > 1
  # cache
  r.headers_in['Cache-Control'] = 'public'
end

Apache.return(Apache::DECLINED)

mod_cache、mod_disk_cacheを併用して使います。

サーバのLoad Averageが1以上になったときにだけ、mod_cacheを利用してコンテンツをキャッシュします。そして、Load Averageが1以下に落ち着いたらキャッシュが解除されます。

若干強引ですが Cache-Control ヘッダをいじってmod_cacheを反応させることで実現しています。

今更ながら mod_mruby / ngx_mruby すごい

たった数行でこんなことができるとは。。。

if wc.loadavg.first > 1 の部分を頑張れば、より柔軟にキャッシュコントロールできそうです。

ギョームではLAMP環境を構築することが多いです。

mod_mrubyというプログラマにやさしいモジュールは、今後インフラを考えるときに選択肢を増やす強力な武器になりそうです。

やさしいツール

AWSもInfrastructure as codeもmod_mruby / ngx_mrubyもプログラマにやさしいです。

やさしさ重要だなーと思う日々です。

今後

Auto Cachingの実戦投入をしてみたい。

JAWS-UG福岡でawspecの中の話をしてきました #jawsug

JAWS-UG福岡:3度目の濃い目にAWSの話をしてみよう - JAWS-UG九州 | Doorkeeper にてawspecの中の話をしてきました。

speakerdeck.com

スライドからもわかるように、AWS成分よりもRuby成分多めになりました。話しているほうはとても楽しかったです。

イムリーに勉強会中にPull Requestがあったので、事前にレビューを済ませた上で、発表中にライブマージ&リリースをするなどしました。

Release v0.41.0 · k1LoW/awspec · GitHub

なんか仕込んでいた感がありましたが、そんなことはありませんよ。

awspecの開発は今どうしているのか?

awspecは基本的に自分が必要になったタイミングで(もしくは周りのメンバーが必要になったタイミングで)機能追加をしています。

リソースタイプについては個人的には困らないレベルにまでなってきたので、最近はもう少し上位のテストをしたいなあという希望があって、悶々としている感じです。

ほんと、待っています。。

JAWS-UG福岡の濃さ

今のJAWS-UG福岡は、完全に技術側に振り切っていて、外から見ていて楽しそうだと思ったし、実際に参加してみたらやっぱり楽しかったです。学ぶことも多かったです。

「最初から乾杯をする」というのも良いですね。昼ビールはヤバいです。呑みながらの発表もヤバいです。

あえて改善点を上げるとしたら、もっと発表内容について語れる時間があるとさらに良いかもと思いました(今回だけ違ったっぽい?)。もっとグダグダでも個人的には良いです。得るものは多かったので良かったです。

運営の皆様、ほろ酔い気分な時間をありがとうございました。

というわけで

awspecへのPull Request待っています!

github.com

CakePHPで開発しているけれどもMigrationsは捨ててRidgepoleを使っているはなし

タイトルは若干釣りです。

CakePHPにはマイグレーションツールとして、CakeDC/Migrations(CakePHP2)や、Phinxベースのcakephp/migrations(CakePHP3)があります。

とても有用ですし、CakePHP Bakerはみんな知っているツールです。自分もずっとお世話になっていました。

ただ、ちょいちょい困ることもあったので、最近はRidgepoleを使い始めています。

Ridgepole

github.com

Ridgepoleはクックパッド社で利用されているというマイグレーションツールです。

techlife.cookpad.com

Ridgepoleは最大の利点が、1つのSchemafileを管理するだけでスキーマのべき等性を担保してくれるということです。

RidgepoleはDSL自体がRailsActiveRecordと同じだということで、Railsだとさらに恩恵をうけられそうですが、この"べき等性"はCakePHPなプロジェクトでもかなりアツいです。

「1ファイルを管理すれば良い」という良さ

特に新規開発スタート時は、スキーマの変更頻度も高いです。

数人で開発するだけでもスキーマ変更のマイグレーションがコンフリクトし、作業をブロック。マイグレーションの順番を検討。チャットで「今からスキーマ触ります」と通知とかし始めて、最後は「もう一度マイグレーションファイルを消して1からやりなおそうか」ということに。。。

それが1つSchemafileをGit(などのバージョン管理システム)で管理するだけで良いというのは、かなりのメリットがあります。

データベース設計書的なファイルとMigrationsのファイル群の2種類を管理する必要がなくなったのも健全です(Schemafileのコメントでフィールドの論理名も管理可能ですし)。

今は深遠なる理由でデータベースコメントも管理したいので、あえて 0.6.3 を利用していますが、現在Rails5への対応を進めているらしい(さらに、Rails5のActiveRecordではデータベースコメントやカラムコメントも管理できるらしいのでもしかしたら。。)ので、楽しみです。

PHPな人も是非試してはいかがでしょうか?

ssh_config形式のファイルからVulsのconfig.tomlを生成するコマンドを作った

今、脆弱性検出ツールでかなりアツいVulsですが、対象のリモートホストへの接続のためにはTOML形式の設定ファイルが必要です。

なんかssh_configに似ているなーと思ったので、作ってみました。

github.com

Usage

まずはインストール。

$ gem install ssh_config_to_vuls_config

インストールすると sc2vc というコマンドが使えるようになるので、あとはSTDINにssh_config形式のファイルをかませるだけです。

$ cat ~/.ssh/config | sc2vc > vuls_config.toml

あれ?なんか koma に使い方が似ていますね。

というわけで

本家のREADMEにも載せてもらえました!嬉しい!

https://github.com/future-architect/vuls#related-projects