gemのslideshowでMarkdownからスライドショーを作る

gemのslideshowを使ってMarkdownファイルをスライドhtmlに変換する

slideshowとは?

slideshowは、Markdownファイルを様々なJavaScriptスライドライブラリを使ったhtmlファイルをビルドするgem。 一つのMarkdownからいろいろなテンプレートのスライドを生成出来るので便利。

インストールとサンプル

$ gem install slideshow
$ slideshow help  #オプションを確認
$ slideshow help build #buildオプションを確認
$ slideshow new   #サンプル用のwelcom.txtファイルが出力される。中身はMarkdownテキスト。
$ slideshow build welcome.txt

スライド.htmlファイルが出力されるので、ブラウザで開いてデフォルトテンプレート(s6)でスライドがレンダリングされるのを確認する

f:id:ono_matope:20131018174904p:plain

他のテンプレートを使ってみる

$ slideshow install shower
$ slideshow build welcome.txt -t shower

showerテンプレートでレンダリングされる

f:id:ono_matope:20131018175406p:plain

revealテンプレートを使ってみる

ここを参考に

$ slideshow update
$ slideshow install plugins
$ slideshow install reveal
$ slideshow build welcome.txt -t reveal

f:id:ono_matope:20131018175603p:plain

以上。remark.jsテンプレートがほしい。

Blenderでボーンをミラーするメモ

Blender 2.67使用

こういう鳥の翼を作りたいとする。ただしメッシュはポーズ作業以降もX軸ミラーModifierを維持し、ポーズも左右反転コピーを使っていきたいものとする。

左半分のメッシュとボーンを作り、ウェイトをペイントして調整する。

f:id:ono_matope:20130718004129p:plain

ウェイトペイントすると*Lの頂点グループができるが、ここで同名のRの頂点グループを作っておく。_Rの頂点グループは空のままでよい。これをしておくと、Mirrorモディファイアを維持したまま左右反転のポーズが付けられる。(参考:Blenderで3DCG制作日記 操作メモ - Mirrorのまま左右非対称にポージングなど

f:id:ono_matope:20130718004443p:plain

Mirrorモディファイアを適用する。Vertex Groupsチェックはオン。Armatureモディファイアの上に配置。

f:id:ono_matope:20130718005335p:plain

ボーンも_LボーンをShift+Dで複製し、Bone -> Mirror -> X GlobalでX軸反転し、Flip Namesする。 ウェイトも右側にミラーされ、左右非対称のポーズも取れるのでミラーリング成功かとおもいきや…

f:id:ono_matope:20130718005634p:plain

今度は左右対称のポーズを取らせようと、振り上げたHumerus_L(左翼付け根)のポーズをHumerus_RにX軸反転ペーストしたところ、見当違いな方向に回転してしまう。わーっ

f:id:ono_matope:20130718010035p:plain

これを防ぐためには、Rのボーンを選択し、Ctrl+N → Reculculate Roll → X Axis で右側ボーンのロールを再計算すると回転方向がそろう…

f:id:ono_matope:20130718010515p:plain

はずだったのだけど(一回そろった)、記事を書くために二度試したら全く揃わなかった。仕方なく、全てのRボーンのRollを、対応するLボーンのRollを正負反転したものに手動で設定したところ、パーペキな左右反転ポーズコピーが成功した。おわり。

f:id:ono_matope:20130718013732p:plain

FireWire800外付け2.5インチHDDケースを買ってSSDを入れた。

(このエントリーは1年くらい前に書きました)

HD画質の動画をコンポジットするにあたり、USB 2.0の外付けHDDの低速さに耐えられず、2.5インチのFireWire800のポータブルHDDケースを買ってきて中にSSDを突っ込み、作業用ドライブとした。本当はUSB 3.0がよかったけど、うちのMacにはついておらず、まだ買い替えの時期でもない気がしたので。

ケース4,980円。このケースはFireWire 800/400/USB 2.0が刺せるので、FWのついていない端末でも一応使える。SSDは使わなくなって床に転がっていたintel X-25M(80GB)なのでタダ。USB 3.0対応ホストマシンを持っていない場合、FireWire800ケース+SSDは最速の外部データドライブになる。ついでに落としても安心、低消費電力。

f:id:ono_matope:20120420202730j:plain

以下ベンチマーク

f:id:ono_matope:20120420231223j:plain

床にSSDが転がっていないご家庭でも、Crucialのm4とか安いし買っておけばいいと思う。

Crucial 2.5インチ 内蔵型 SATA3.0対応 M4 SSDシリーズ 128GB CT128M4SSD2

Crucial 2.5インチ 内蔵型 SATA3.0対応 M4 SSDシリーズ 128GB CT128M4SSD2

Crucial  V4  256GB  2.5inch  SSD  SATA3Gbps  9.5mm厚 CT256V4SSD2

Crucial V4 256GB 2.5inch SSD SATA3Gbps 9.5mm厚 CT256V4SSD2

 iMacほしい。

Scientific Linux 6.1にrbenvでbundlerなRuby 1.9アプリケーションをインストールする手順

やりたいこと。

表題どおり。やるごとに手順をネットで調べてるのでまとめた。

  • 検証環境はScientific Linux 6.1だけどCentOSでもいける。
  • Rubyバージョンはrbenvで管理されたruby1.9.3
  • アプリケーションはBundlerで構成管理されたSinatraアプリケーション

作業履歴

事前準備

Rubyのビルドに必要となるパッケージを入れておく

$ sudo yum install zlib-devel
$ sudo yum install openssl-devel

Install rbenv

まずはrbenvを入れる

https://github.com/sstephenson/rbenv/ のBasic GitHub Checkout に従う。

$git clone git://github.com/sstephenson/rbenv.git ~/.rbenv 

$echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
$echo 'eval "$(rbenv init -)"' >> ~/.zshrc

$exec $SHELL -l
$rbenv install --list

Install ruby-build

ruby-buildを導入する(rbenvでRubyを手早くビルドするために使う)。 https://github.com/sstephenson/ruby-build の Install as an rbenv plugin に従う。

$git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Install ruby

RubyとBundlerをインストールする。

$rbenv install 1.9.3-p392
$rbenv global 1.9.3-p392
$rbenv rehash
$ruby -v  # バージョン確認

$gem install bundler

gem installで次のような警告が出た場合、openssl-devel のyumパッケージをインストールした上で上記ステップでRubyを再インストールする

ERROR:  Loading command: install (LoadError)
    cannot load such file -- openssl
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

Install application

$ exec $SHELL -l
$ cd /path/to/your/application
$ bundle install --deployment

Could not load OpenSSL.とか言われたらやっぱりopenssl-develをインストールしてやりなおし。

MySQLのスレーブを再起動しても勝手にレプリケーションが再開しないようにする

MySQLで、マスタ系を動かしたまま、スレーブの更新を一時的に止めたいという状況はよくあります。スレーブ群の中から一台だけサービスアウトし、STOP SLAVE;してテーブル変更やリペアテーブルしてからSTART SLAVE;するというやつです。

このSTOP SLAVE;ですが、MySQLプロセスを再起動すると勝手にSLAVEが再開してしまいます。ですので、テーブル変更時にうっかり(ディスク増強などのために)MySQLを再起動するといつの間にかレプリケーションが始まってウワーッとなります。悲しいですね。

my.confにこのようなレプリケーションの自動開始の抑制オプションがないか探してみましたが、ないようです。skip-networkingを有効にしておけばスタンドアローン化するかと思いましたが、これは「TCPをリッスンしない」オプションなので、リッスン側のマスターでレプリケーションを抑止するのに役にたっても、スレーブ側の抑止には役に立たないようです。

CHANGE MASTER TO構文でわざと存在しないホストをマスターに指定することも考えましたが、正しい設定をどこかにメモっておかなければならないので若干面倒くさいです。ですので、master.infoファイルを一時退避することで「MySQLのスレーブを再起動しても勝手にレプリケーションが再開しないようにする」が実現できることを確認しました。

mv master.info master.info.bk

 

mysql> show slave status\G;
Empty set (0.00 sec)

ERROR: 
No query specified

あんまり安全では無さそうですが、やむを得ずスレーブ停止中に再起動が必要になった時には自己責任でお試しください。あともっとマトモなやり方を知っていたら教えてください

 

追記

ありがとうございます。

Dynamoの論文を訳した


Dynamo: Amazonの高可用性Key-value Store[和訳] — Gist

 

DynamoDBとかも出てきた事だし、MySQL以外のデータベースに興味が出て来たのでNoSQL的な流れの源流っぽいDynamoの論文を読んでみることにしました。十日くらい掛けて一通り読んだものの、時間がかかりすぎて何が書いてあったのか全く覚えていなかったので、論文の抄訳的なものをサラリと書き出して理解に努めようと思ったのだけど、残念ながらサラリとエッセンスを抽出出来るほど頭がよくなかったので、しょうがないのでカッとなって全訳しました。

 Dynamoは、「顧客は例えディスクが壊れていようが、ネットワーク経路が断線しようが、データセンターが竜巻で破壊されようが、彼らのショッピングカートを閲覧したり、アイテムを追加したりできるべきです」とか、その可用性のためにバージョン衝突とその調停を受け入れ、カートに追加したアイテムが消えたりはしないが、カートから削除したアイテムがいつの間にか復活する事態は許容する、みたいな決断をしているあたりがかっこいいなと思いました。

ECのデータ永続化に関してそんな設計に承認したりするのは怖くてそうだと思うのだけど、技術的な限界点とECサービスとしてのビジネス要件を高度に判断する企業なんだなーという印象を持ちました(ECサービスに関わったことがないので素人の見解です)。トランザクション処理や原子性保証が自明でないNoSQL時代においてスケールするシステムを構築するためには、そういった判断が重要になってくるのかなと思いました。

 

ところで落ち着いて読んでみたらDynamoとDynamoDBは思いのほか別物だったのでいま泣いてます。

VirtualBoxのディスクストレージ設定とIO性能

こんにちは、小野マトペです。

自宅サーバーをVirtualBox on Mac miniに移行してサービスする事が出来れば、面積、静音性、可搬性、サービス独立性の面で有利だと思って、いろいろやってる。VirtualBoxを選んだのは、無料だしライセンス的な面倒がなさそうだから。あとベンチマーク悪くなさそうだったから。

VirtualBox VMの仮想ストレージには色々な設定があるが、それぞれパフォーマンスにどのような影響を与えるか調べてみた。

調査項目

  • Dynamically allocated : VirtualBoxのディスクストレージには、実際に使われてから動的に領域が確保される "Dynamically allocated"と、作成時に全領域を実際に確保してしまう"Fixed size"の二つのモードがある。当然動的確保する前者の方がIOが遅くなるが、マニュアルには「動的確保によるペナルティはわずかなのでDynamically allocated推奨」とか書いてあったが、動的確保で作ったディスクへのscpが妙に遅かったので、両者のベンチマークを取る事にした。
  • ホストのI/Oキャッシュを使う:ゲストのI/OにホストOSのI/Oキャッシュを使ってI/Oを高速化するオプション。ただしゲスト側でフラッシュした筈の書き込みが実際にディスクイメージに書き込まれないので、当然危険。あとホストのメモリを食いつぶすので、複数ゲストの実行時にパフォーマンスが低下する

調査環境

調査方法

  • bonnie++ -s 2048M
  • 大体の傾向が測れれば満足なので試行回数1。

調査結果

f:id:ono_matope:20120218185918j:plain

Sequential Outputに関しては固定の方が動的割り当てより2倍ほど速い感じ。固定割り当ての時にはホストI/Oキャッシュがとても効果的に働いていて、ホストOSの実行速度を上回っている。まあ、非同期I/Oになっているので当然と言えば当然。

Sequential Inputも、固定サイズ+ホストI/Oキャッシュが物理マシンの20%になっている以外は比較にならない感じで、ここまで遅かったっけ…。

 

f:id:ono_matope:20120218191420j:plain

Random Seek回数。これも固定サイズ+ホストI/Oキャッシュのときだけ異様に速くて、他がゴミのような値。

まとめ

シーケンシャルライトなら固定VMのが2倍速い。障害時にデータ破損してもよい AND VM台数が少ないならホストI/Oキャッシュ有効化すればライトとランダムアクセスはネイティブ以上の性能が出る。ただしリードは壊滅的。「物理マシンの半分くらいは出るんじゃないの?」ってたかをくくってたので、少し驚き。