はじめに
Mac 用スクリーンキャプチャツール Skitch,Evernote とくっついていろいろ残念になってしまった version 2.0 になって以来,version 1.X をずっと使ってきていましたが,AppStore の通知が毎日「アップデート」とか出てそのたびに「明日再通知」するのもいいかげん嫌気がさしたので,しぶしぶ最新版にアップデートしてみました.
で.
これまでずっと「古い」Skitch を使っていたけど,この辺りでアップデートしてみた.さっそく後悔している.
— いわ (@issm) April 14, 2015
「やめときゃよかった」のひとことw
主に次の 3点:
- ホットキーを任意に割り当てられない
- ファイル名に
foobar.jpg
とか打っても,旧バージョンのように保存時の拡張子が自動的に変わらない - 選択キャプチャのホットキー Command + Shift + 5 が,Emacs での
query-replace
のキーバインド Meta + % と衝突,かつ Skitch 側が優先される
特に 3つ目は私にとって致命的.これ以上 Skitch を使うのを諦めました.そもそも Evernote との連携とかどうでもいいし.
screencapture
コマンド
個人的な要求としては,「Mac 備え付けのスクリーンキャプチャ(Command + Shift + 4)の,ファイル名とか保存先とか指定できればそれでよい」くらいなので,その辺りをぐぐってみたところ,次あたりのエントリを確認:
- Macのスクリーンキャプチャ機能で撮影した画像の保存場所を変更する裏技 / Inforati
- 【Mac】OS X スクリーンショットのファイル名やファイル形式などの変更方法 | Will feel Tips
defaults
コマンドで設定できるようですが,そもそも,根本的なコマンドとして screencapture
が存在し,いろいろなオプションでコントロールできることを知りました.(詳細は man screencapture
参照)
Alfred の Wordflows を使ってラップしてみる
仕様
- 「選択」スクリーンキャプチャできる
- ファイル名を
ss-{unixtime}.png
とする - デスクトップでない,特定のディレクトリに保存される
- 保存されたファイルのパスがクリップボードにコピーされる
- 保存された画像が勝手に「プレビュー」アプリで開く
- 上記を,Alfred ランチャから
cap
として呼び出せる - また,ホットキー Command + F11 でも呼び出せる
Workflow "cap"
「Run Script」には,次のような shellscript を書いてます:
#!/bin/bash capturedir="$HOME/box/ss" ssname={query} if [ "${ssname}" = "" ]; then ssname="ss-$(echo -n $(date +%s))" fi file=${capturedir}/$(basename ${ssname} .png).png screencapture -i $file open -a /Applications/Preview.app $file echo -n $file |
※ 本来ならばアプリケーション Box 用のディレクトリ Box Sync
を指定したかったのですが,スペースを含むパスだとうまく動いてくれないので,ln -s ~/Box\ Sync ~/box
してそのリンクを指定しています.
結果
こんな感じで動作するようになりました(このキャプチャでは,デスクトップに保存するようになっています):
おわりに
Skitch が使いものにならなくなった(個人的な要求に合わなくなった)ので,Alfred の Workflows を使って screencapture
コマンドをラップする,簡単なスクリーンキャプチャツールを作ってみたお話でした.
「勝手に『プレビュー』アプリが開く」というのは,今後うっとうしくなってくるかもしれません.そのあたりを指定できるしくみはまたそのうちに.
はじめに
あけおめ.2015年初エントリでございます><
対処方法
2010年のツイートですが,個人的に参考になったため引用させていただきます:
mysql workbenchでsynchronize modelをやると、たまにDBごとすべてを削除されることがある。確認してからやればいいんだけど、テスト環境だからって連打しちゃうんだよね…
— meets (@ahosan) April 26, 2010
mysql workbench のsynchronize modelの挙動がオカシイ?スキーマ名が同じなのに、別物として認識して既存のDBをまるごと消そうとしてしまう。ナゼ?
— meets (@ahosan) April 27, 2010
mysql workbench の synchronize model ですべて違うオブジェクトとして認識されて正常に同期できない件がやっと解決した。forward engineer でsqlプレビューまで行って、その後に同期処理をやれば、ちゃんと差分を吐いてくれた
— meets (@ahosan) June 3, 2010
メニュー Database > Forward Engieneer...
を次々進めていき,SQL プレビューが表示されたところでキャンセル,その後, Database > Synchronize Model...
することで,生成される差分 SQL がまともになります,きっと.
おわりに
ことよろ.
メモ.サーバ管理界隈では「今や常識」レベルのことなのでしょうが,その常識を知りませんでしたごめんなさいごめんなさい.
今さらだけど,VPS とかの借りてるサーバで Dropbox 動かしている場合は「LAN 同期」を無効にすべき! です><
前提
Dropbox がインストール&動作していること.
参考:
「お客様サーバから17500/UDPのブロードキャストの通信が大量に行われているんだけど」
% sudo tcpdump -vv port 17500 2>&1 | grep -B 1 $(hostname) 19:40:12.001146 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > 255.255.255.255.17500: [bad udp cksum 0xe290 -> 0x308e!] UDP, length 112 19:40:12.001532 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > ***.***.***.255.17500: [bad udp cksum 0xc664 -> 0x4cba!] UDP, length 112 -- 19:40:42.171360 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > 255.255.255.255.17500: [bad udp cksum 0xe290 -> 0x308e!] UDP, length 112 19:40:42.171887 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > ***.***.***.255.17500: [bad udp cksum 0xc664 -> 0x4cba!] UDP, length 112 -- 19:41:12.350481 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > 255.255.255.255.17500: [bad udp cksum 0xe290 -> 0x308e!] UDP, length 112 19:41:12.350779 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > ***.***.***.255.17500: [bad udp cksum 0xc664 -> 0x4cba!] UDP, length 112 -- 19:41:42.528454 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > 255.255.255.255.17500: [bad udp cksum 0xe290 -> 0x308e!] UDP, length 112 19:41:42.528834 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > ***.***.***.255.17500: [bad udp cksum 0xc664 -> 0x4cba!] UDP, length 112 -- 19:42:12.704700 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > 255.255.255.255.17500: [bad udp cksum 0xe290 -> 0x308e!] UDP, length 112 19:42:12.705046 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > ***.***.***.255.17500: [bad udp cksum 0xc664 -> 0x4cba!] UDP, length 112 -- 19:42:42.880831 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > 255.255.255.255.17500: [bad udp cksum 0xe290 -> 0x308e!] UDP, length 112 19:42:42.881145 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > ***.***.***.255.17500: [bad udp cksum 0xc664 -> 0x4cba!] UDP, length 112 -- 19:43:13.054091 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > 255.255.255.255.17500: [bad udp cksum 0xe290 -> 0x308e!] UDP, length 112 19:43:13.054345 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 140) www*******.sakura.ne.jp.17500 > ***.***.***.255.17500: [bad udp cksum 0xc664 -> 0x4cba!] UDP, length 112 ... |
これはひどい...
UDP/17500
- VPSでDropboxを使うなら、LAN Syncを止めよう! – Soukaku’s HENA-CHOKO Blog
- DropBoxのLANSync(UDP:17500)が問題になっているらしい – ymkoの日記
あぁ,Dropbox の「LAN 同期」機能か...orz
dropbox.py を入れて「LAN 同期」を無効にする
等によると,dropbox.py
なるツールで,コマンドラインから Dropbox をごにょごにょできるみたい.
さっそくインストール:
% curl -L "https://www.dropbox.com/download?dl=packages/dropbox.py" > /path/to/dropbox.py % chmod +x /path/to/dropbox.py |
インストール完了.
「LAN 同期」を無効にするには次のとおり:
% /path/to/dropbox.py lansync n |
その後
% sudo tcpdump -vv port 17500 2>&1 | grep -B 1 $(hostname) (待機) |
先のように tcpdump
を実行してみたけど,何も出力されてこないので,きっとこれで OK.
はじめに
手元のマシンで「http://localhost/docs/*.md
なファイルを HTML に変換して表示」なことが Webサーバレベルで簡単にできないかな,とか思ってたところ,次のエントリに到達:
なんだかお手軽そうな印象を受けたので,ちょっと試してみました.まぁそもそも nginx に ngx_mruby モジュールが入っていないので,それを入れるところから,ですが.
以下,そんな記録です.
インストール
- ngx_mruby のソースコードのパス
$HOME/local/src/ngx_mruby.git
- nginx のソースコードのパス
$HOME/local/src/nginx/1.6.2
- nginx のインストール先
$HOME/local/nginx/1.6.2
参考
準備
ビルド時にライブラリがないって怒られたので,このあたりを追加:
% brew install hiredis % brew unlink markdown % brew install discount |
Discount:
それぞれのソースコードを準備する
nginx:
% cd $HOME/local/src/nginx % curl -LO "http://nginx.org/download/nginx-1.6.2.tar.gz" % tar xvf nginx-1.6.2.tar.gz % mv nginx-1.6.2 1.6.2 |
ngx_mruby:
git clone git://github.com/matsumoto-r/ngx_mruby.git $HOME/local/src/ngx_mruby.git cd $HOME/local/src/ngx_mruby.git git submodule init git submodule update |
ngx_mruby をビルドする
冒頭のエントリでは,コード中に Discount
クラスが出てきてますが,mruby をそのまま入れたのでは利用できないため,build_config.rb
内 1行のコメントを外して利用できるようにします:
diff --git a/build_config.rb b/build_config.rb index c5d32c5..74a3576 100644 --- a/build_config.rb +++ b/build_config.rb @@ -38,7 +38,7 @@ MRuby::Build.new do |conf| conf.gem :github => 'matsumoto-r/mruby-ngx-mruby-ext' # use markdown on ngx_mruby - #conf.gem :github => 'matsumoto-r/mruby-discount' + conf.gem :github => 'matsumoto-r/mruby-discount' # Linux only for ngx_mruby #conf.gem :github => 'matsumoto-r/mruby-capability' |
ビルドします:
% ./configure \ --with-ngx-src-root=$HOME/local/src/nginx/1.6.2 \ --with-ngx-config-opt="--prefix=$HOME/loca/nginx/1.6.2" % make build_mruby % make generate_gems_config |
nginx をビルド&インストールする
--add-module
オプションで先にビルドした ngx_mruby を指定します:
% ./configure \ --prefix=$HOME/local/nginx/1.6.2 \ ... --add-module=$HOME/local/src/ngx_mruby.git % make % make install % $HOME/local/nginx/1.6.2/bin/nginx -V 1 ↵ nginx version: nginx/1.6.2 built by clang 6.0 (clang-600.0.56) (based on LLVM 3.5svn) TLS SNI support enabled configure arguments: --prefix=/Users/issm/local/nginx/1.6.2 ... --add-module=/Users/issm/local/src/ngx_mruby.git |
nginx が入りました.
Hello
とりあえず nginx.conf
の server
コンテキストに次のようなものを追記:
location /mruby { mruby_content_handler_code ' if server_name == "NGINX" Server = Nginx elsif server_name == "Apache" Server = Apache end Server::rputs "Hello #{Server::module_name}/#{Server::module_version} world!" '; } |
再起動後,http://localhost/mruby
へリクエストすると,次のようになりました:
curl で:
% curl -i http://localhost/mruby HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Fri, 05 Dec 2014 05:31:44 GMT Content-Length: 28 Connection: keep-alive Hello ngx_mruby/1.6.7 world! |
*.md
なものを変換して HTML として返す
先と同様に,nginx.conf
の server
コンテキストに次のようなものを追記:
location ~ \.md$ { mruby_output_filter_code ' if server_name == "NGINX" Server = Nginx elsif server_name == "Apache" Server = Apache end r = Server::Request.new f = Server::Filter.new css = "https://gist.github.com/andyferra/2554919/raw/2e66cabdafe1c9a7f354aa2ebf5bc38265e638e5/github.css" title = "markdown" md = Discount.new css, title r.content_type = "text/html; charset=utf8" f.body = md.md2html f.body '; } |
再起動.
Markdown ファイル
次のようなファイルを,$root/hello.md
として置きます:
# Hello markdown via ngx_mruby! はろー! * this * is * list |
結果
http://localhost/hello.md
へリクエストすると,次のように返ってきました:
ブラウザ:
curl:
% curl -i http://localhost/hello.md HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Fri, 05 Dec 2014 05:02:39 GMT Content-Type: text/html; charset=utf8 Content-Length: 541 Last-Modified: Fri, 05 Dec 2014 05:01:31 GMT Connection: keep-alive ETag: "54813c2b-42" Accept-Ranges: bytes <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <title>markdown</title> <link rel="stylesheet" href="https://gist.github.com/andyferra/2554919/raw/2e66cabdafe1c9a7f354aa2ebf5bc38265e638e5/github.css" type="text/css" /> </head> <body> <a name="Hello.markdown.via.ngx_mruby."></a> <h1>Hello markdown via ngx_mruby!</h1> <p>はろー!</p> <ul> <li>this</li> <li>is</li> <li>list</li> </ul> </body> </html> |
ただ,ブラウザでの場合,Command + r でリロードするたびに表示されたりされなかったり「接続できませんでした」になったりと,なんだか不安定な感じでした.curl コマンドではそんなことはないですね.よくわからない.
おわりに
以上,nginx にngx_mruby モジュールを組み込んで,Discount 経由で Markdown 記法を変換して表示するなど,少しだけ触ってみた記録でした.
nginx の挙動を,ruby のコードで記述することができるありがたみを実感できた気がします.ruby ほとんどわかってませんが.
今回試した設定・コードでは,Discount では ```
によるコードブロック表記など,Github や Bitbucket とかで常用するような記法を利用できませんでした.拡張できるのかな?そのへん何かよい情報がないかどうか,今後さがしてみたいところです.
はじめに
今さらながら,bot フレームワークである Hubot を触ってみたのでその記録.
参考
前者の連載 第2回目,「Hubotを動かしてみる」におけるひな形作成あたりの勝手は,現在のものとは異なっているようなので,そのあたりは本家の方を重視.
目次
- インストール
- ひな形を作成
- とりあえず体感:
shell
アダプタ - ちょこっとだけ拡張してみる
- IRC に接続する:
irc
アダプタ - Slack に接続する:
slack
アダプタ
インストール
Hubot は node.js 製なので,そのあたりから.
nodebrew
Homebrew
であれば:
% brew install nodebrew |
で入ります.そうでなければ
% curl -L git.io/nodebrew | perl - setup |
した後,$HOME/.nodebrew/current/bin
を環境変数 PATH
に追加しておきます:
export $HOME/.nodebrew/current/bin:$PATH |
node
% nodebrew install v0.10.33 (... takes a while ...) % nodebrew use v0.10.33 |
Hubot 関連モジュール
Yeoman
と generator-hubot
を追加します.基本的なものなのでグローバルなところに:
% npm install -g yo generator-hubot |
ひな形を作成
yo hubot
した後,聞かれることにテキトーに Enter していけば,bot するためのファイル構成を準備してくれます:
% git init /path/to/myhubot Initialized empty Git repository in /path/to/myhubot/.git/ % cd /path/to/myhubot % yo hubot _____________________________ / \ //\ | Extracting input for | ////\ _____ | self-replication process | //////\ /_____\ \ / ======= |[^_/\_]| /---------------------------- | | _|___@@__|__ +===+/ /// \_\ | |_\ /// HUBOT/\\ |___/\// / \\ \ / +---+ \____/ | | | //| +===+ \// |xx| ? Owner: issm <issm @myemail> ? Bot name: myhubot ? Description: myhubot ? Bot adapter: campfire create bin/hubot create bin/hubot.cmd create Procfile create README.md create external-scripts.json create hubot-scripts.json create .gitignore create package.json create scripts/example.coffee create .editorconfig _____________________________ _____ / \ \ \ | Self-replication process | | | _____ | complete... | |__\\| /_____\ \ Good luck with that. / |//+ |[^_/\_]| /---------------------------- | | _|___@@__|__ +===+/ /// \_\ | |_\ /// HUBOT/\\ |___/\// / \\ \ / +---+ \____/ | | | //| +===+ \// |xx| hubot-maps@0.0.0 node_modules/hubot-maps hubot-help@0.1.1 node_modules/hubot-help hubot-google-images@0.1.0 node_modules/hubot-google-images hubot-diagnostics@0.0.1 node_modules/hubot-diagnostics hubot-pugme@0.1.0 node_modules/hubot-pugme hubot-rules@0.1.0 node_modules/hubot-rules hubot-youtube@0.1.2 node_modules/hubot-youtube hubot-google-translate@0.1.0 node_modules/hubot-google-translate hubot-heroku-keepalive@0.0.4 node_modules/hubot-heroku-keepalive hubot-shipit@0.1.1 node_modules/hubot-shipit hubot-redis-brain@0.0.2 node_modules/hubot-redis-brain └── redis@0.8.4 hubot-scripts@2.5.16 node_modules/hubot-scripts └── redis@0.8.4 hubot@2.9.3 node_modules/hubot ├── optparse@1.0.4 ├── log@1.4.0 ├── scoped-http-client@0.9.8 ├── coffee-script@1.6.3 └── express@3.18.1 (basic-auth@1.0.0, merge-descriptors@0.0.2, utils-merge@1.0.0, fresh@0.2.4, cookie@0.1.2, escape-html@1.0.1, range-parser@1.0.2, cookie-signature@1.0.5, vary@1.0.0, media-typer@0.3.0, parseurl@1.3.0, methods@1.1.0, content-disposition@0.5.0, depd@1.0.0, debug@2.1.0, etag@1.5.1, proxy-addr@1.0.3, commander@1.3.2, mkdirp@0.5.0, send@0.10.1, connect@2.27.1) % git add . % git commit -m 'initial commit' </issm> |
とりあえず体感: shell
アダプタ
最近の閲覧数
- None Found