Macの画面を頑張って広げる

MacBookをはじめとするLaptop型のMacは、単体で開発に使用するとどうしても画面が狭くて辛いです。
特にAirの場合Retinaがないので、コーディング中に:vsplit等すると幅が足りず作業効率が落ちてしまいます。。。
そこで表示領域を広げる方法をいくつか考えてみました。

1. Duet Display

http://www.duetdisplay.com/
iOSデバイスを外部モニタとして使用できるアプリです。手軽に物理的に表示領域が増やせるので、モニタを用意できないとき等とても重宝します。
導入はアプリをiOSとMacにそれぞれインストールして、ケーブルで接続するだけなのでとても簡単です。
似たような他のアプリと比べると、有線の為レイテンシが比較的低いですが、Unityのゲームビュー等ではさすがに表示が追いつきませんでした・・・。自分の環境では、UnityのConsole表示にちょうど良いです。

2. AirServer

http://www.airserver.com/
別のPCをAirPlayのサーバにできるソフトです。サーバとしてはWindows/Mac両方対応していますが、そもそもクライアントとなるMacと別にそれらが一台必要なので、活用できるケースは限られそうです。
Wi-Fiですがなかなかレイテンシが低く、コーディング程度ならさくさくこなせます。そもそも本来の用途と若干違う気もしますが・・・。

3. QuickRes

http://www.quickresapp.com/
1, 2と違って、外部デバイス無しで広げられます。
Macの解像度を設定するツールです。パネルの解像度以上に無理やり上げることができます。
単純な表示領域は広げることができますが、当然パネル自体の画素数は変わらないので、精細さは損なわれます。
文字が読みづらくなるので、場合によっては逆に作業効率がおちてしまいますが、Mac単体で画面が広くなるので気に入っています。

私は最終的に安定性と使いやすさでDuet Displayのみ使用に落ち着きました。
捗ります。

mPDFで作成したPDFのファイル名がおかしい

PHPで簡単にPDFが作成できる「mPDF」では、作成したPDFをAcrobat readerまたはFirefox等のビューアでブラウザ上に表示させることもできるが、ダウンロードダイアログを表示してPDFファイルをダウンロードさせることもできる。
もちろんPDFファイルのファイル名は指定できるが、場合によってはおかしくなる。

基本的な使い方と問題

mPDFを使用するには、mPDFを任意のディレクトリに設置し、呼び出し元でincludeして下記の様に処理する。

include('./MPDF57/mpdf.php'); // パスは環境に応じて変える

$mpdf = new mPDF('ja', 'A4'); // 出力ファイル設定
$mpdf->writeHTML($data);      // pdf内容をhtmlで突っ込む

// 'sample.pdf'というファイル名でダウンロードさせる
$mpdf->Output('sample.pdf', 'D');

このとき、$mpdf->Output();で指定するファイル名が一時ファイルのパスとなる為、同一ディレクトリのpermissionによって上手くいかないことがある(特に何らかのフレームワークを使用している場合)。
その為フルパス指定で任意のディレクトリに書き出すと安全だが・・・

$mpdf->Output('/var/www/html/pdf/sample.pdf', 'D');

などとした場合、ダウンロードされるpdfのファイル名は、
_var_www_html_pdf_sample.pdf
の様にパスを含んだものになってしまう。

原因

mpdf.phpの7480行付近(※バージョンによる)に、ファイル名の設定(レスポンスヘッダ)がある。

			if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
				// don't use length if server using compression
				header('Content-Length: '.strlen($this->buffer));
			}
			header('Content-disposition: attachment; filename="'.$name.'"');
 			echo $this->buffer;
			break;

この$nameは$mpdf->Output();の第一引数をそのまま使用している為、ファイル名にパスが含まれてしまう。
ファイル名に関するオプションなどは無さそうなので、この部分の処理を変更するしかない。

パスを含まないように修正する

ヘッダのfilenameに期待するファイル名を記述すればいいので、次のようにした。

			if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
				// don't use length if server using compression
				header('Content-Length: '.strlen($this->buffer));
			}
			/* --- ここから --- */
			$wk_name = explode('/', $name);
			if (count($wk_name) > 1) {
				$name = $wk_name[count($wk_name) - 1];
			}
			/* --- ここまで --- */
			header('Content-disposition: attachment; filename="'.$name.'"');
 			echo $this->buffer;
			break;

入力されたパスを’/’でexplodeし、末尾の文字列をファイル名としている。
これでどの階層にあってもフルパス指定でダウンロードできる。

sixcoreのcronでphpを実行する

root権限がもらえずsshも使えないレンタルサーバで一体何にcronを使用するのか以前から不思議だったが、使う機会があった。詰まったのでそのときのメモ。

phpが叩けない

一定時間毎にphpスクリプトをcronで実行しようとしたところ、動作しなかった。
動作しないというのは、phpコマンドの後に>でリダイレクトしてもブランクファイルが出力され、sixcoreのcron通知機能(結果をメール送信)もメールが送信されないという状況。
そしてsixcoreのcronに関するマニュアルは物凄く簡素で情報が少ない。

今回書いたcron設定はこれ。

* * * * * php /home/<アカウント名>/advpro.co.jp/public_html/hoge/test.php

※どのユーザで実行されているかは不明な為省略

ちなみに実際のphpスクリプトでは、一定時間毎にIMAPでメールを取得し、内容をDBに蓄積するというようなことをしようとしていた。

wgetかcurlを使うと動く

phpが何らかの原因により実行できないことが確認できたので、次に試したのはwgetとcron。apacheを介してphpは実行できるので、任意のパスにphpを設置し、次のようなcronを書けば良い。

* * * * * wget http://advpro.co.jp/hoge/test.php

または、

* * * * * curl http://advpro.co.jp/hoge/test.php

出力が必要なときはリダイレクトする(要らなくても多分>/dev/nullしたほうがいい)。
あとは外部から実行されないように、.htaccessで制御しておけばとりあえず要件は満たせる。

実はコマンドが違った

調べたところ、「php53」としておけば普通に動く事がわかった。
cronで ls -la /usr/bin した結果、

-rwxr-xr-x  1 root root    2866944 Mar 24  2014 php
-rwxr-xr-x  1 root root    2878552 Mar 24  2014 php-cgi
-rwxr-xr-x  1 root root       1123 Mar 24  2014 php-config
lrwxrwxrwx  1 root root         27 Aug 28  2013 php5.2 -> /usr/bin/org/php5.2/php-cgi
lrwxrwxrwx  1 root root         26 Aug 28  2013 php5.3 -> /usr/bin/org/php53/php-cgi
lrwxrwxrwx  1 root root         27 Mar 28  2014 php5.4 -> /opt/php-5.4.26/bin/php-cgi
lrwxrwxrwx  1 root root         27 Mar 28  2014 php5.5 -> /opt/php-5.5.10/bin/php-cgi
lrwxrwxrwx  1 root root         26 Aug 28  2013 php53 -> /usr/bin/org/php53/php-cgi

となっていたので、必要なバージョンのリンクを叩けば良い。
今回の例では、

* * * * * php53 /home/<アカウント名>/advpro.co.jp/public_html/hoge/test.php

上記のように変更したところ動作した。
sshログインできないんだからこれくらいはマニュアルに書いて欲しい。

その他

cron設定について色々いじっていたところ、時刻指定は通常のcronと同様に設定できることがわかった。「*」は当然使えるし、「*/n」も使える。恐らく入力値をそのままファイルに追記しているんだろうと思う。
ちなみに、sixcoreのcron設定では分に「*」を指定すると、負荷掛けたら利用制限するという旨のメッセージが表示されるが、「*/1」としておけば表示されない。どっちにしても負荷掛けたら怒られるだろうけど。

ギークなステッカーを貼ろう

最近Macの天板にステッカーをべたべた貼りまくるのがマイブームです。
技術系のイベント等で(行かないのでレポート見るだけですが)貼ってる人がよくいるので、真似をしていろいろ貼っています。

幾つか日本から購入できるサイトを紹介します。

・Unixstickers(http://www.unixstickers.com/)
Unix系(Linuxディストリビューションのロゴ等)や、ソフトウェア、プログラミング言語のロゴ等、種類が多いです。ここではVimステッカーを買いました。全体的に少し高いです。

・GitHub Shop(https://github.myshopify.com/)
GitHubの公式ショップのようです。ステッカー以外にもグラス等グッズを扱っています。

・Raspberry Pi Swag(http://swag.raspberrypi.org/)
RaspberryPiの公式ショップのようです。ここもステッカー以外に色々なグッズやPi本体が買えます。

次は何を貼ろうかと考えていますが、探すと色々出てくるので迷います。
海外発送で結構お金がかかるのと、時間もかかるのですこし躊躇してしまいますが、満足感は得られるのでまた何か買おうと思います。

CUIでCPUベンチ

自宅で趣味に使用していたサーバが壊れたので、Celeron G1820で一台組みました。せっかくなのでπ焼きをしようとしたら、次のようなメッセージが表示され起動できませんでした・・・。

$ ./super_pi
./super_pi: line 1: 11961 Segmentation fault (core dumped) ./pi $1

解決しそうになかったので、代替案を調べました。
timeでpiの処理時間を取るのが良さそうです。piはaptで入ります。

$ sudo apt-get install pi
$ time pi 1048576 >/dev/null

real    0m3.576s
user    0m3.528s
sys     0m0.044s

5,000円でこれなら良いんじゃないでしょうか。
(比較対象がないので正直よくわかりませんが・・・)

ちなみに社内で開発に使用しているサーバ(E2160)はこんな感じでした。

real    0m4.029s
user    0m3.960s
sys     0m0.046s

もうちょっと速いのが欲しいですね・・・。

【WordPress】プラグインを追加する(SyntaxHighlighter)

当ブログにSyntaxHighlighterというプラグインを導入したので、ついでに導入方法の解説をします。
SyntaxHighlighterは、その名の通りプログラムの特定の語句をハイライトして見やすくしてくれます。(有名なので説明するまでもないと思いますが・・・。)

1.ダウンロード
プラグイン(zipファイル)を下記URLからダウンロードします。
http://wordpress.org/plugins/syntaxhighlighter/

2.解凍
ダウンロードしたzipファイルを解凍します。
01

3.アップロード
解凍したファイルをディレクトリごとアップロードします。
アップロード先:./wp-content/plugins
02

4.有効化
Wordpress管理画面のプラグインのページで、SyntaxHighlighterの「有効化」リンクを押下します。
03

5.使用方法
プログラムとして表示したい部分を、[php]~[/php]の様に言語名で囲みます。
次の様に表示されます。

<?php
if(!empty($hoge)){
	echo 'hoge';
}else{
	echo 'hogehoge';
}
?>

大抵のプラグインは同様の方法で導入できるので試してみてください。