まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2014/02

HTML 内のオブジェクトを移動させるには jQuery の animate メソッド を使うのが一般的(というか簡単)ですが、CSS3 の transition を使ってもできます。

プログラマー/デベロッパーの立場だと jQuery を使うことは珍しくないんですが、CSS はちと遠い存在で、基本は理解しているつもりでしたが、あまり接することがありませんでした。いい機会なので勉強がてら使ってみました。


さて、目的は似てるけどアプローチの異なる2つの手法、その違いはどこにあるのでしょう?

簡単に言えば animate は CPU 処理、transition は GPU 併用の処理になります。PC だと見た目にもあまり差はないかもしれませんが、比較的 CPU 性能の劣るスマホ(それもちと古めの)だと、この差がバッチリでそう。グラフィックチップを併用することで非力なCPU環境でもスムーズなアニメーション処理が実現できます。また見た目に差がなくてもCPUの負荷を軽減することにもなります。


実際に2種類のメソッドで同じアニメーションを実装したのが以下の例です。上の "Animate" をクリックすると jQuery.animate で、下の "Transition" をクリックすると CSS3.transition で、それぞれ重ねあわせスライドスクロール処理が行われます。PC ブラウザだとあまり差を感じないかもしれませんが、非力な環境ほど下の方がスムーズな動きになるはず。



Animate









Transition










ソースコード全文はこのページのソースを参照していただきたいのですが、大まかにはこんな感じになります:

共通の CSS クラス:
<style type="text/css">
.c1{
	position: absolute;
	z-index: 1;
	left: 100px;
	opacity: 1;
	width: 100px;
	height: 100px;
	background: yellow;
}
.c2{
	position: absolute;
	z-index: 0;
	left: 100px;
	opacity: 1;
	width: 100px;
	height: 100px;
	background: red;
}
</style>


jQuery.animate を使った場合の HTML & JavaScript コード:
<a  href="javascript:void(0);" id="aa">Animate</a>
<div  class="c1"></div>
<div  id="c2a" class="c2"></div>
<script type="text/javascript">
var ba = true;
$('#aa').on('click', function(){
	ba = !ba;
	var l = 200;
	if( ba ){ l = 100; }
	$('#c2a').animate(
		{ left: l + 'px' },
		{ duration: '700', easing: "linear" }
	);
});
</script>


CSS3.transition を使った場合の HTML & JavaScript コード:
<a  href="javascript:void(0);" id="at">Animate</a>
<div  class="c1"></div>
<div  id="c2t" class="c2"></div>
<script type="text/javascript">

var bt = true;
$('#at').on('click', function(){
	bt = !bt;
	var l = 200;
	if( bt ){ l = 100; }
	$('#c2t').css({
		left: l + 'px',
		WebkitTransition: 'left 0.7s linear',
		MozTransition: 'left 0.7s linear',
		MsTransition: 'left 0.7s linear',
		OTransition: 'left 0.7s linear',
		transition: 'left 0.7s linear'
	});
});
</script>

どちらのケースもクリック時にトグルのような動きをするのでそのための余分なコードがありますが、jQuery.animate では左座標(left)を指定して 700 ミリ秒でリニアにアニメートを、CSS3.transition でも左座標と効果(transition)を指定して 0.7 秒間で遷移するように css を変えています。違いはこの2箇所です。

もちろん全てのケースで有用というわけではないと思います。またこの例はかなりシンプルな内容なので違いが少なく見えていますが、現実的にはそう簡単にはいかないことはあると思います。ただ後者が使える環境であれば後者にすべきなのかな。



 

Linux や MacOS のターミナル(端末)の画面を分割/多重化して、1つのターミナル画面内で複数のターミナルプロセスを実行できるようにする、というツール tmux を使ってみました。ツール自体は結構以前からあったようですが、存在を知らなかった・・・


まずはインストール前の環境準備から。僕の環境は CentOS ですが、他の Linux ディストリビューションや MacOS などでも同様のはずです。

tmux はソースが公開されていて、ソースからビルドして導入します。というわけで公式サイトから tmux 自体のソースコードをダウンロードしておきます(今日時点の最新安定版は tmux-1.9a.tar.gz):
http://tmux.sourceforge.net/

最新安定版が 1.9a であれば、以下のコマンドでもダウンロードできます:
# wget http://downloads.sourceforge.net/tmux/tmux-1.9a.tar.gz


また、 tmux のビルドにはライブラリとして curses ライブラリが必要です。これは yum でサクッと導入します:
# yum install ncurses-devel

更に libevent 2.0 以上が必要です。一般的な環境に導入されているのは 1.x だと思うので、こちらも別途ソースからビルドして用意する必要があります(今日時点の最新安定版は libevent-2.0.21-stable.tar.gz):
# wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
# tar xzvf libevent-2.0.21-stable.tar.gz
# cd libevent-2.0.21-stable
# ./configure
# make
# make install

これで tmux をビルドする準備が完了したので、改めてダウンロードしてきたソースファイルから tmux をビルドします:
# tar xzvf tmux-1.9a.tar.gz
# cd tmux-1.9a
# ./configure LDFLAGS=-L/usr/local/lib/ (上記でビルドした libevent-2.0 をフラグで指定)
# make
# make install

tmux を実行する前に /etc/ld.so.conf.d/libevent.conf というファイルを新規に作成して libevent をインストールした場所を指定し、あらかじめロードしておく必要があります。
# echo '/usr/local/lib' > /etc/ld.so.conf.d/libevent.conf
# ldconfig

これで tmux のインストールは完了です。以下、簡単な使い方の紹介。

tmux を起動するには端末のプロンプト画面から 'tmux' と入力します:
# tmux

あまり変わったように見えませんが、tmux が起動して、最初のセッションを作成し、その中で1つのウィンドウが作成されます:
2014022201


この状態から tmux コマンドを駆使して複数のセッション/ウィンドウを管理します。まずはウィンドウを上下2つのペインに分割します。CTRL+b(CTRLキーを押しながら b)に続けて :(コロン)を入力し、画面下部に split-window と入力して Enter キーを押します:
2014022202


ちなみに、CTRL+b に続けて : で tmux のコマンド入力モードに切り替わります。そこで画面下部に split-window という「縦にウィンドウを分割」という意味のコマンドを入力した結果、このような2画面に分割されたのでした。

同様にして、今度は画面を横に分割してみます。CTRL+b : に続けて split-window -h と入力します:
2014022203


 -h オプションをつけるとアクティブだったウィンドウが横に分割されました。

アクティブペイン内でコマンドを実行すると、その実行結果はペイン内だけに表示されます:
2014022204
(右下のペインがアクティブな状態で ls コマンドを実行した結果)


CTRL+b o でペイン間の移動が可能で、アクティブペインを切り替えることができます:
2014022205
(プロンプトが上のペインに移動 この状態でコマンドを実行すると上のペインで実行される)


アクティブペインは CTRL+b x で破棄できます:
2014022206
(左下のペインをアクティブにしてから破棄コマンドを実行。左下のペインがなくなって上下2つになった)


なお CTRL+b ? でコマンドのヘルプが表示できます:
2014022207
(上のペインをアクティブにしてヘルプを実行した様子。ショートカットに困った時のためにこのコマンドだけでも覚えておくべき)


クラウドサーバーを利用する場合、初期状態では SSH でしかログインできないし、環境によっては X Window を導入することもできないこともあります。そんな時に唯一使える端末を多重化して使えるのは便利です。

ま、現実問題として3つも4つも開くことはないけど、上下に2つ開いて互いの中身をコピペできるだけでもかなり使える。







「iPhone でゲームボーイアドバンスのゲームがプレイできる」というフレコミの GBA4iOS というアプリのバージョン 2.0 がリリースされた、というニュースがありました。

いわゆる「エミュレータ」というやつで、ここでその是非についてコメントするつもりはありません。脱獄した iPhone 向けには以前から提供されていたもので、その意味では特別目新しいニュースでもありません。

が、今回ちょっと気になったのは、「脱獄不要である」という点です。脱獄不要ということは、そのアプリは App Store からダウンロードするということ? アップルがそんなアプリの審査通すの? と。

といった好奇心から、自分でもこのアプリをインストールしてみました。結論としては確かに iPhone にネイティブアプリとしてインストールできているようです。
2014022102


でも導入時に App Store は経由してません
。当たり前だよな、Apple がこんなの許可するわけがない。また(この機種に限ってはw)脱獄もしてません。 アプリ開発者が App Store を経由せずにテストアプリを導入する方法はあるんですが、その場合は電話番号とか iPhone の UDID とかを入力する面倒な手間があります。今回はそういうのも聞かれてないので、ちと違う気がする。 一体どういうこと?? どこからどんな仕組みでこのアプリはインストールされたんだ??


で、他の作業で VPN の設定とかをしていてふと気付いたのが、設定 - 一般 - プロファイル の中に「プロビジョニングプロファイル」として GBA4iOS という、そのまんまの名前のプロファイルが追加されていました。これは??
2014022101


・・・プロビジョニングプロファイルか、ああ、なるほど。分かった気がする。おそらく、以前にちょっと話題になった「iOS デベロッパーエンタープライズプログラムに抜け穴があった」という件に関係してるんだろう。

要は、自社とか特定の企業向けにアプリケーションを提供したい、という企業に対して、Apple はその企業専用のミニ App Store もどきを用意できるようにして、そこから特定ユーザーだけにアプリケーションをインストールさせる、というのが iOS デベロッパーエンタープライズプログラムです(詳しくはこちら)。そこにセキュリティホールというか抜け道があった、というものでした。それを応用(?)して制約なしに誰もがそのミニ App Store もどきを使えるようにしたんだろうな。 
念のため補足すると、このデベロッパーエンタープライズプログラムは契約時に利用条項に同意する必要があり、その中で不特定多数に向けてアプリを提供することは禁止されているので、Apple にすれば「契約違反」ということになるんでしょう。ただその抜け道の存在は想定外だったのだろうな、と。

その後もイタチごっこのような状況が続いていますが、今回の GBA4iOS 2.0 がリリースされた所をみると完全に防ぐのが難しい、ということなのかもしれません。



 

Cybozu Office 10 を Linux にインストールした時に躓いた所を記載しておきます。

基本的にはインストールマニュアルに書いてある通りに進めたつもりでした。OS(CentOS) をインストールして、Apache HTTPD サーバーを導入して起動しておいて、でダウンロードしたインストールモジュールを実行。これだけでインストールできるはず。


やってみると実行直後にこのようなメッセージが表示されます。ここは Y を選択。
cbo_01

その直後にこのようなエラーメッセージが表示されて、プロンプトが戻ってしまいます。
cbo_02


「GLIBCのバージョンを検出できませんでした。」とな・・・
一応、Cybozu 的には動作環境として「GLIBC 2.5 以上」を挙げています。
で、このサーバーに入っている GLIBC のバージョンは 2.12 。なので問題はないはず・・・

色々調べてもよく分からず、念のため無理やり GLIBC 2.5 へダウングレードしたりもしたけど、状況は変わらず。うーん・・・もうちょっとヒントがあればなあ・・・・・



・・・で、偶然気付いたのですが、このターミナルの画面のスクロールバーを上にあげてみると・・・
cbo_07

なんと隠れていたエラーメッセージ発見!
cbo_03

"/lib/ld-linux.so.2: bad ELF interpreter" ってエラーメッセージは以前に遭遇したことがあるのですぐに原因がわかりました。インストール前提に ld-linux.so.2 ライブラリが必要なんだけど、それがない場合に表示されるエラーです。

というわけで、サクっと ld-linux.so.2 をインストール:
# yum install ld-linux.so.2

再度インストーラーを実行。すると今度は先に進み、試用許諾契約画面へ。
cbo_04

インストール開始~
cbo_05

で、無事インストールできました、と。
cbo_06


インストールマニュアルのどこかに書いといてほしい。




 

前回は MySQL の導入について紹介したので、今回は MariaDB を紹介します。

MariaDB は MySQL 互換の RDB です。WordPress などの、MySQL を前提としたアプリケーションも MariaDB を使って動かすことができます。


MariaDB にも言えることですが、MySQL もコミュニティエディションは無料で使うことができるオープンソースのデータベースサーバーソフトウェアです。では MariaDB の存在意義はどこにあるのでしょう?

もともとコミュニティの中で成熟してきた MySQL は後に Sun Microsystems に買収され、そして現在は Oracle の下にあります。この「先が見えない」状態をよしと思わない、MySQL 開発者を中心とした有志によって、新たに開発が進められている MySQL の互換DB、それが MariaDB です。

稼働実績も増えてきており、例えば英語版およびドイツ語版 Wikipedia では MySQL から MariaDB に切り替えられています。また Fedora 19、Open SuSE 12.3、RHEL 7 などのメジャーな Linux ディストリビューションでも搭載 DB が MySQL から MariaDB に変更されています。


では CentOS への MariaDB のインストール手順を紹介します。現在の CentOS 6.x ではまだ標準 DB は MySQL であり、そのまま yum でインストールできるわけではありません。

まずは MariaDB をインストールするための PGP Key をインポートします:
# rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

またリポジトリ設定を自分の環境にあった内容で編集します(以下は MariaDB 10.0.8 を CentOS 6.x の x86_64 向けにインストールするための設定):
# vi /etc/yum.repos.d/mariadb.repo

[mariadb]
name=MariaDB
baseurl=http://yum.mariadb.org/10.0.8/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=1

ここまでの準備ができると yum で MariaDB をインストールできるようになります:
# yum -y install MariaDB-devel MariaDB-client MariaDB-server

インストールが完了したら MariaDB を起動します。MySQL のデーモン名は mysqld でしたが、MariaDB では mysql になっています:
# /etc/init.d/mysql start
Starting MySQL. SUCCESS!

インストールはこれだけ。インストールの後のセットアップは MySQL でのケースとほぼ同じなので省略します。




 

このページのトップヘ