2014年2月27日木曜日

CentOS Apache+SSLでhttpと通信を行う

Webサーバー間の通信を暗号化することができる。
リンクがhttpsになっているやつがそうなんだそうな。
これでユーザー名やパスワードの情報送信をWebサーバー間で行っても安心!

参考サイト

OpenSSLがインストールされているか確認する


今ではほとんどデフォルトでインストールされているらしいけど、念のため。
下記コマンドを実行する

/*---------------------------------------------------------------------------*/
openssl version
/*---------------------------------------------------------------------------*/

OpenSSLのバージョンが表示されればインストール済み。
表示されないようならyumなりなんなり使ってインストールしよう。

mod_sslをインストールする


ssl機能をサーバーに実装してくれるモジュールをインストールする。

/*---------------------------------------------------------------------------*/
yum install --enablerepo=remi mod_ssl
/*---------------------------------------------------------------------------*/

Webサーバーの秘密鍵を生成する


キーを作成するディレクトリに移動して生成コマンドを実行する。
入力を求められるパスフレーズは任意でオーケー。
今後のSSL鍵関連にはこのパスを使うので忘れないように。

/*---------------------------------------------------------------------------*/
openssl genrsa -des3 1024 > server.key
/*---------------------------------------------------------------------------*/

ディレクトリはどこでも問題なさそう。
参考サイトにならってhttpdのconfディレクトリを今回は使用する。

Webサーバーの公開鍵を生成する


続けて公開鍵。コマンドを叩け!

/*---------------------------------------------------------------------------*/
openssl req -new -key server.key > server.csr
/*---------------------------------------------------------------------------*/

各種公開鍵の情報を入力。各要素がなにを指しているかを参考サイトから引用して張っとく。

/*---------------------------------------------------------------------------*/

   正しい秘密鍵のパスフレーズを入力すると、公開鍵情報の入力が求められます。参考例として筆者が入力した値をリスト1に紹介します。それぞれ、Country Nameは国名、State or Province Nameは都道府県名、Locality Name、区町村名となります。

   また、Organization Nameは組織名、Organizational Unit Nameは部門名です。Common NameはSSLを使うサイトの名前(今回は皆さんのサーバIPアドレス)、Email Addressはメールアドレスとなります。

   A challenge passwordは証明書を破棄する場合に必要になるパスワード、An optional company nameは別の組織名がある場合、その組織名の入力となります。なお「A challenge password」と「An optional company name」は空欄でもかまいません。

/*---------------------------------------------------------------------------*/

デジタル証明書を作成する


本来このデジタル証明書は有料で発行してもらうものなのだが、今回は自分で作成してしまう。

/*---------------------------------------------------------------------------*/
openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt
/*---------------------------------------------------------------------------*/

こちらでも、秘密鍵作成時のパスフレーズが求められる。

SSLの設定を行う


ssl_modをインストールしたときに/etc/httpd/conf.d/ssl.confが作成されているので
そいつを編集する。

/*---------------------------------------------------------------------------*/
<VirtualHost hogeserver:443>
DocumentRoot "/var/www/html"
ServerName hogeserver
SSLCertificateFile /hoge/httpd/conf/server.crt
SSLCertificateKeyFile /hoge/httpd/conf/server.key
/*---------------------------------------------------------------------------*/

変更箇所のみ抜粋。SSLCertificateFileとSSLCertificateKeyFileは作成した鍵のファイルパス。
ServerNameは公開鍵作成時に指定したホスト名を指定。でないと警告が出る。

設定を完了したらapacheを再起動する。

/*---------------------------------------------------------------------------*/
/etc/rc.d/init.d/httpd restart
/*---------------------------------------------------------------------------*/

ポートが開放されているかを確認する


参考サイト


ツールが置いてあるページに飛んでポートが開放されているかを確認する。
ページに飛んだらホスト名とポート番号を入力してボタンを押す。

自分はポートが開放されているのに気づかないで結構な時間を無駄にしてしまった。
ポートが開放されていなければ開放してあげよう。
/etc/sysconfig/iptablesに使用するポート番号(今回は443)を追加。

/*---------------------------------------------------------------------------*/
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
/*---------------------------------------------------------------------------*/

ほんでもって再起動。

/*---------------------------------------------------------------------------*/
/etc/init.d/iptables restart
/*---------------------------------------------------------------------------*/

もっかいツールを使って開放されているか確認。開放されていれば次へ。

SSLで接続する


次へと言うかこれで最後。httpsを使ってWebページに接続する。接続に問題なければ成功。

おまけ:apache再起動時の鍵認証をなくす


SSL、というか秘密鍵を導入するとapacheを再起動するたびにパス認証が必要になる。
面倒なのでこれをなくす。

/*---------------------------------------------------------------------------*/
openssl rsa -in server.key -out server.key
/*---------------------------------------------------------------------------*/

サーバー用秘密鍵からパスワードを削除してしまう。これでパスの入力がいらなくなる。


2014年2月20日木曜日

C++ VisualStudio2008でzlibを使う

生のファイルじゃなくて圧縮したファイルをリソースとして使いたい。そんな私に、zlib。
そんなわけで、zlibを使ってみた。

zlibはzipやgzipに使われている圧縮アルゴリズムをライブラリ化したもの。
pngの圧縮もこのzlib。

参考サイト
Windows・VC++でZlibを使う(VisualStudio2008)

zlibをダウンロードする


まずはホームページからzlibのソースを持ってくる。
とりあえずその時の最新版をもってくりゃよかろう。
この記事を書いている当時はzlib-1.2.8だったので、記事もそれに倣って書く。

makefileの設定


参考サイトに倣ってzlib-1.2.8/win32/makefile.mscを書き換える。

/*---------------------------------------------------------------------------*/
# optional build flags
LOC =
OC =
OL =
/*---------------------------------------------------------------------------*/

OCとOLを追加。

/*---------------------------------------------------------------------------*/
CFLAGS  = -nologo -W3 -O2 -Oy- -Fd"zlib" $(LOC) $(OC)
LDFLAGS = -nologo -debug -incremental:no -opt:ref $(OL)
/*---------------------------------------------------------------------------*/

CFLAGSはコンパイラオプション。LDFLAGSはリンクオプション。
追加したOCとOLを使用するように設定。

コンパイルする


スタートメニューの全てのプログラムから「VisualStadio2008コマンドプロンプト」を起動するなり、
参考サイトのように自分でbatファイルを実行するなりして環境変数を通す。
zlibがあるフォルダまで移動して、以下のコマンドを実行。

/*---------------------------------------------------------------------------*/
リリースビルド
nmake -f win32\Makefile.msc LOC="-DASMV -DASMINF" OBJA="inffas32.obj match686.obj" OC="/MT"

デバッグビルド
nmake -f win32\Makefile.msc LOC="-DASMV -DASMINF" OBJA="inffas32.obj match686.obj" OC="/MTd /Z7" OL="/PDB:zlib.pdb"
/*---------------------------------------------------------------------------*/

zlib1.dll,zdll.lib,zlib.lib,zlib.pdbが生成される。参考サイトで言ってることと違ってデバッグじゃなくてもzlib.pdbができてしまった。

適当なプロジェクトでリンカオプションを設定して実行。
問題なく動作したのでよしとする。


2014年2月11日火曜日

android-ndk NativeActivityを実行してみる

ようやくちゃんとドライバもインストールできる実機を手に入れたので以前作っていたプロジェクトを
テストしてみたら、なんてこったい、ポリゴンが描画されない。
おまけに実機テストなしに突っ走った部分が多すぎてエラーがどこにあるのかがわからない。
こりゃ最初からやり直しじゃないですかい。

というわけで心機一転ついでにNativeActivityを使って今後はやってみようと思う。
全て(?)の処理をNative(C/C++)で行うことでjni以上に高速化を図っているクラスだそうな。

参考サイト
NativeActivityクラスを用いたアプリケーションを実行する。

今回はサンプルを読み込んで実機で実行するところまで。

プロジェクトを作成する


eclipceを立ち上げたら、「プロジェクト・エクスプローラ」で右クリックして「新規」、「プロジェクト」。
「既存コードからのAndroidプロジェクト」を選択して、NDKのsamplesフォルダからnative-activityを
選択。これでエミューレーターではもう実行できるはず。
画面上でタッチしてうねうね動かすと背景色が変わる。

実機で実行する


実機で実行できる環境は整っていること前提。
作成したプロジェクトを右クリックして「Androidツール」から「Add Native Suport」を選択。
ここで作成されるファイルは使わないので名前なんて気にせずに作成。
これで実行時に一緒にビルドをやってくれるようになる。
あとは実機をPCにつないで実行。

2014年2月7日金曜日

PHP キャメルケースとアンダースコアの相互変換

参考サイト
[PHP] キャメルケースとアンダースコア表記の相互変換

キャメルケースからアンダースコア


/*---------------------------------------------------------------------------*/
public function camelToUnderScore($camel)
{
$underBar = strtolower(preg_replace("/([A-Z])/u", "_$0", $camel));
$underBar = trim($underBar, "_");
return $underBar;
}
/*---------------------------------------------------------------------------*/

アンダースコアからキャメルケース


/*---------------------------------------------------------------------------*/
public function underScoreToCamel($under)
{
$words = explode("_", $under);
$camel = "";
foreach($words as $word) {
$camel .= ucfirst($word);
}
return $camel;
}
/*---------------------------------------------------------------------------*/

jQuery toggleでアコーディオンメニュー

要素を押すとスライドして表示されるメニューを作る。

参考サイト

slideToggleというのを使うとあっさりできるらしい。
これにちょっと手を加えて箇条書きリストの表示で作ってみる。

javascript


まずはjavascriptから。

/*---------------------------------------------------------------------------*/
<script type="text/javascript">
   $(function(){
       $("#accordion ul").on("click", function() {
           $(this).next().slideToggle();
       });
   });
</script>
/*---------------------------------------------------------------------------*/

accordionIDの下にある要素を弄くる。

css


/*---------------------------------------------------------------------------*/
#accordion ul#parent {
}
#accordion ul#child {
display:none;
}
/*---------------------------------------------------------------------------*/

とりあえず子要素を消すだけ。あとから色々デザインを変更できるように。

HTML

/*---------------------------------------------------------------------------*/
<div id="accordion">
<ul id="parent"><li>Parent</ul>
<ul id="child">
<li>Child
</ul>
</div>
/*---------------------------------------------------------------------------*/

これだけでできる。
便利だね。toggle。指定された要素の表示非表示を切り替えるメソッド。