2015年 03月 27日

git で今すぐ成果を倍にできる方法

#!/bin/sh

if [ "x$COMMMMMMIT" = "x" ]; then
	COMMMMMMIT=1 git commit --allow-empty -m "仕事したぞ!!!"
fi

このファイルを .git/hooks/post-commit として保存します。

gitで今すぐ成果を3倍にする方法

#!/bin/sh

if [ "x$COMMMMMMIT" = "x" ]; then
	COMMMMMMIT=1 git revert HEAD
	COMMMMMMIT=1 git revert HEAD
fi

このファイルを .git/hooks/post-commit として保存します。

2015年 03月 24日

ブログシステムは自作すべきか? ブログサービス VS 自作システム

結論:自作するメリットはほぼない (金銭的にもない)

ブログサービスの利点と欠点

先にブログサービス(ASP、すなわち自分でインストールしたりホストしたりしない)の利点を列挙する

  • 大抵基本無料である
  • 大抵既に機能が豊富である
  • 運営会社の日々のサービス開発によって自動的に機能が増える
  • 欲しい機能がないときは要望フォームに書けばよい
  • それで実装されなきゃ文句いってれば良いので気楽
  • サービス停止がまずない
  • 勝手に閲覧者が増える仕組みが備わっていることが多い
  • 良いデザインのテンプレートが用意されていることが多い

一方で欠点は

  • 一部有料であることが多い
  • 広告がでる・自分で広告を貼れないことが多い
  • 機能が実装されなくても文句しかいいようがない
  • ニッチなニーズには答えてくれない

自作の利点と欠点

利点

  • 自由に欲しいものが作れる
  • プログラミングの勉強になる

欠点

  • 自力でホスティングするため金がかかる
  • 自分で実装しなければ機能は永遠に増えない

つまり

自作するメリットはほとんどない。ホスティングに金を払うよりブログサービスに金を払ったほうが気楽である。

それでも自作するか

もしウェブプログラマなら自作すべきであると常に主張したい。

2015年 03月 20日

トルクの単位

案外表記が統一されていない。系統的には N・m (ニュートン・メートル) と kgf・m (キログラムフォース・メートル / 重量キログラム・メートル) がある。kgf は 国際単位系ではない。

なので、

ユーチューバー活動

ちょっと前まで日記の補足として動画を用いてきて、YouTube にあげるにせよ音もなにもなくスクリーンキャストだけというのが多かったけど、動画だけである程度完結してトピックの内容が纏まっていたほうが一石二鳥だろうというのと、いくつかの理由で、ちゃんと動画を作ることに挑戦している。

  • 上記の通り動画だけを見ても内容がわかるように
  • 作ったものをちゃんと説明することを心掛けるように
  • 文字だと伝えにくいニュアンスを説明するため
  • 最近は勉強会とかで話す機会がほとんどないため

作ったものをちゃんと説明することを心掛ける

日記で文字で説明するときは割と適当というか「わかる人だけわかれば良い」というスタンスで書いてしまう。

雑誌記事みたいなノリで書けばいいと思うけど、そういうスタンスで毎回書くのは結構大変で辛いし、細かいことをいちいち説明していると読者をバカにしている感がでるので避けたい。

動画、というか音声だと声色のニュアンスで細かい配慮を省略しやすく感じる。

文字だと伝えにくいニュアンスを説明する

文字で書くとすこしカタくなるというか、偉そうな感じになるケースが多々ある。これは根本的には書き手側の文章による表現力の問題なのだとはいえ、一方で受け取る側のリテラシにも関わるので限界がある。

音声の場合、受け取る側も文章を読むということよりも経験が長い (1歳ぐらいから音声を使ってコミュニケーションしている) はずなので、書き手の表現力による齟齬が生じにくくなる。

あと、文字で書くと「読み飛ばす」ことに慣れていない人には負担になってしまう。音声の場合勝手にすすむので、わからないなら勝手にすすむ。人によってはこのほうがいい人もいそう。(個人的には読み飛ばすほうが楽だけど)

最近は勉強会とかで話す機会がほとんどない

そもそも情弱になってきていて、おもしろそうだなと思ったイベントを当日に知るレベル。

ここ数年YAPCでだけ声出してる感じがする。

平日の勉強会だと仕事のあとあまりに疲れきっていることが多いのでさっさと帰りたいと思ってしまう。

ということで何らかの形で声出しておきたい。

続くか

わからない。どれだけ楽をして作れるかにかかってる。

今のところ

  • だいたいのストーリーを考えて台本をつくる
  • スクリーンキャストを撮りつつ同時に喋る
  • 編集していらないところカットする

は最低限必要そうという感じ。

適当に喋ってるように聞こえるが、一応台本を書いてから喋ってる。プレゼンのスライドよりは情報量が多いが、プレゼンよりは雑に書いた感じの台本がある。

一発録りで出すのはかなり厳しい。失敗できないという気持ちでやると気が滅入る。なので、後編集はある程度は必要と考える。編集で切ればいいやと考えられれば、そのほうが気が楽だし、クオリティがあがる (と思う)。

台本を書かずにとりとめもなく喋ると編集が大変だし、たぶん撮りなおしが頻発することが目に見えているし、どうせ話の流れは考えなければならないので、先に考えるのが一番良い。なお少しでも酔っぱらってると呂律がまわらないうえ、話題が飛んだりして完全にダメ。

ということで、たぶんこれ以上は作業を削れない。

スクリーンキャスト以外で動画を撮る必要がある場合はもっと面倒だけど、自分が作ったものを自分で説明するという限りでは、あまりその必要性は多くはなさそう。動画を撮る場合カメラと音声のセットアップがとても面倒くさい。

そして作業の全体の面倒くささは収録時間が長くなるほど増える。なので、だいたい5〜10分ぐらいを目安にしている。一度録ったものは最低でも編集で数度と通しで数度は見ることになるから、短かければ短いほど良い。

ということで僕のチャンネルです。視聴者ファンディング (投げ銭) も有効にしてますよ!!!!

WebAudio の BiquadFilterNode の周波数特性をグラフにするやつ

検索してもいまいち出てこなくて、いつも「前見たのどこだったかな」となるので自分で書いた……

2015年 03月 18日

CopyHook というペーストボードの中身をいじるツールを作った

ペーストボードにコピーが行われたときに、JavaScript で何かするというツールを書いた。

競合するソフトウェアがいくつかあると思うけど (dot-clipboard とか)、すぐできそうだし Swift で書かれたのはなさそうということで書いてみた。

ユースケースとしては

  • Slack のチャット画面を適当にコピーしたのを、自動でフォーマットしてペーストしやすくする
  • リッチテキストとしてコピーされるのがウザいので、プレーンテキストにしてしまう
  • 画像を自動でグリッチする

というのがあります。

つかいかた

起動するとアクセシビリティを有効にしろといわれるのでする

有効にしたらもう一度起動する。

コピーのイベントをキーイベントの Cmd+C を見ることで実現している (設定で変更可能)

あとフォーカスされているアプリとかウィンドウの名前を取得するためにアクセシビリティの機能を使っている

~/.copyhook.js を書く

function onCopied () {
	// console.log(pb.types());

	var bundleId = utils.focusedApplicationBundleId();
	console.log('onCopied: ' + bundleId);
	if (bundleId === "com.apple.Terminal") {
		// clear data without "public.utf8-plain-text"
		pb.copy(pb.string());
	}
}

こんな感じのを書く。これだと Terminal.app で Cmd+C を押した場合、プレーンテキストだけにして他のデータ型を削除するようになる。(Google Keep とかにペーストするとき意味不明な改行が入りまくったりするのを回避できる)

または、レポジトリにあるファイルをとりあえず使ってみるなら

git clone https://github.com/cho45/CopyHook.git
cd CopyHook
ln -s dotcopyhook.js ~/.copyhook.js
ln -s dotcopyhook ~/.copyhook

これだと Slack のアプリででコピーしたときいい感じにフォーマットするようになる。

JS をカスタマイズする

require() で ~/.copyhook 以下から外部ファイルを読みこんだりできるようになっている。

console.log() は OS X のシステムログに書きこむことができる。Console.app を起動すれば確認可能。

utils.focusedApplicationBundleId() でフォーカスされているアプリの bundle id を取得できたり、utils.focusedWindowName() でフォーカスされているウィンドウのタイトルを取得できたりする。これにより、処理を場合わけできる。

CopyHook の JS は直接ファイルの読み書きなどができるようになっていないが、utils.system() によって外部プログラムを呼びだせるようにしてある。

なお、書きかえた JS ファイルは次回コピー実行時に自動でリロードされる。

実装について

コピーイベント

ペーストボードに「コピーが行われた」という Notification (OS X でイベントコールバックしてくれる仕組み) はないので、別の方法でやる必要がある。

  • NSPasteboard の changeCount をポーリングする
    • 殆どのペーストボード監視アプリはこれでやっているはず
    • ポーリングなので常に余計にCPU負荷がかかる
  • Cmd+C 監視
    • 右クリックからコピーなどに対応できない
    • アクセシビリティ設定が必要

ポーリングで常に監視するのがとりあえず嫌だったので Cmd+C をデフォルトにしている。

設定でポーリングにも変更可能。

JavaScriptCore

JS の実行には JavaScriptCore.framework を使っている。OS X 10.9 から使えるようになった framework で、JS の実行環境とネイティブ実行環境をブリッジして使えるようにしてくれる。

JS で書けるようにしておくと、テキストフィルタするようなのを書く場合、とりあえず node で書いてテストして、それをそのまま CopyHook でも使うということができて便利。

2015年 03月 10日

キヤノン EOS をウェブカメラとして使う。

(写っていないが手前に EOS がある。RasPi が写っているウィンドウは Quick Time Player の録画ウィンドウで、リアルタイムに表示している)

前にデジタル一眼レフ (EOS) をウェブカメラ的にとして使うという記事を書いたが、あくまで「ウェブカメラ的」であって OS 的に「ウェブカメラデバイス」として認識させられるわけではなかった。

しかし、500 Can't connect to blog.oldershaw.org:80 というページをふとした拍子に見つけてしまった。自分が試した方法を手順だけ簡単に要約する

インストール

要は Camera Live がキモ。

  1. Camera Live を入れる https://github.com/v002/v002-Camera-Live
    • EOS カメラを Syphon というアプリケーション間で映像データをやりとりする形に変換する
  2. CamTwist 3.0 BETA をいれる
    • 内蔵で Syphon サポートがあるので 3.0 を使うのが早い

使用方法

  1. Camera Live を起動し、カメラをUSBで繋いで電源を入れる。
  2. Camera Live のリストにカメラ名がでるので選択すると Active になる
  3. CamTwist を起動する
  4. Syphon を video source に選び、Setting の Syphon Server を Camera Live にする

これで準備完了なので、これ以降は任意のビデオアプリケーションを使う。以下は例

  1. Quick Timer Player を起動し、録画元に CamTwist を選ぶと表示がでる。
    • CamTwist が候補にでない場合、Quick Time Player を再起動する。
  2. オーディオも適切に設定すれば同時録画可能 (ただし多少遅延あり)

Tips

カメラをUSBに繋いでいると、カメラ側では露出の変更が一切できなくなる。どうするか? というと、この状態でEOS Utilityを起動して、カメラの遠隔撮影モードの画面を出せば良い。他のアプリケーションが動いていても絞りを変えたりとかは普通にできるようだ。

ちなみに フォーカス調整はフォーカスリングを回せば良いので、USB を繋いでいても可能。

備考

Camera Live は名前が攻めてるが、Canon EDSDK を使っており EOS にしか対応していない。

ただ、試したところ EOS の中でも EOS M では Camera Live のリストには出るものの、Camera Error とでて接続できなかった。EDSDK の Release Note に「In the case of EOS M, remote shooting function is not supported.」と書いてあるので仕様っぽい。

今回上手くいったのは EOS 5D Mark II

解像度については、機種によって異なるようだ。Live View の機能を使ってるので、基本的に HD よりも低い。

なので、1080p で録りたい場合はやはりカメラ側で録画する必要がある。

感想

これにより映像を録画しつつ、かつ音声を Audio Units で処理しながら同時録音が可能となる。

しかも、録画データは直接コンピュータ上にできるので、いちいちカメラからコピーしてくる必要がない。

また、普通のウェブカメラデバイスとして使えるので、ビデオ通話とかにも使える (自分はやらないけど)

というか、キヤノンがオフィシャルにSDK出していたことを初めて知ったよ… しかし日本のサイトにはない… どういうこと

Canon デジタル一眼レフカメラ EOS 5D MarkII ボディ - キヤノン

キヤノン

5.0 / 5.0

2015年 03月 09日

IntelliJ IDEA で src/test/java がないところに新規でつくる方法

よくわからないけど src/test/java ができなくてであとから作る場合

  1. src/test/java のディレクトリをプロジェクトツリーから New → Directory して作成
  2. java ディレクトリを右クリックして Mark Directory As → Test Sources Root に設定する
  3. java ディレクトリを右クリックして New → Package して使う名前空間のディレクトリを掘っておく

までやると、Refactor の destination に該当ソースパスのパッケージが出てきて移動できるようになるっぽい……

3番目の手順をやらないと destination に出てこなくて???ってなる

2015年 03月 07日

デカい文字をA4で分割して印刷するツールをJSで書いた

デカ文字A4ジェネレータというのを書いた。

https://github.com/cho45/dekaimoji-a4

原寸印刷について

いくつか方法があるがピンヘッダのレイアウトを実寸で印刷するツールを書くときに検討した通り、PDF をつくるのが現状では確実と思われる。

その上で、プレビューとの兼ね合いを考えるとさらにいくつか方法がある。

canvas で作った画像を PDF に貼る

「画像で作ってPDFに貼りつける」という方法は JS に限らず安定して確実な出力ができる。

JS の場合でもスムーズにプレビューできるし出力も簡単。ただし出力サイズが大きい場合、メモリが足りなくなることがある。

また、テキストの選択はできなくなる。

PDF オンリー PDF プレビュー

PDF オンリーの場合、ブラウザーがPDFのインライン表示に対応していれば、iframe でプレビューができる。昨今、だいたいのブラウザーで実はpdfが組み込み表示可能なので案外いける。ただしスマフォでは未対応。

2D Context の API にあわせる

jsPDF の場合、単純な図形化なら、2D Context と APIをあわせることができるので、canvasプレビュー、pdf出力がスムーズにできそう。ただしこれはテキストレンダリングしたくなった時点で確実に破綻すると思われる。