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。指定された要素の表示非表示を切り替えるメソッド。

2014年1月30日木曜日

CakePHP Ajaxを使う

Ajaxを使って動的にMySQLに接続。テーブルに対する処理を行う。
ボタンが押されたらページ遷移せずにデータをテーブルに追加するor持ってくるなど。

CakePHPにはAjaxヘルパーなるものが存在しているが、どうやら古いものなうえ、
どこかからダウンロードしてこないと使えないようだ。
jQueryを使えば問題なく動作するようなので、jQueryを使用する。

参考サイト

上の参考サイトが分かりやすいがCakePHPを使っていないので、今回は上のサイトの例を
下のサイトを参考にしながらCakePHPに落とし込んで行く。
なので細かい部分は参考サイトを参考に。

テーブルとモデルを作成する


Ajaxで操作するテーブルを作成。

/*---------------------------------------------------------------------------*/
CREATE TABLE `Telephones` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 64 ) NOT NULL ,
`phone` VARCHAR( 16 ) NOT NULL ,
PRIMARY KEY ( `id` ) 
);
/*---------------------------------------------------------------------------*/

モデルをDirectoryで作成するとCakePHPのデフォルトのクラスと被るので名前だけ変える。
変えた名前に対応したモデルを作って適当なデータを挿入すればテーブル周りは完了。

jQueryを使用したviewファイルを作成する


jQueryでMySQLに接続。ヒアドキュメントの存在を知ってたけど初めて使ったのでメモ代わりに。

/*---------------------------------------------------------------------------*/
<?php
echo $this->Html->script("jquery-1.10.2.js", array('inline' => false));
$this->Html->scriptStart(array('inline' => false));
echo <<<EOT
$(document).ready(function(){ 
$("#search_results").slideUp(); 
   $("#search_button").click(function(e){ 
       e.preventDefault(); 
       ajax_search(); 
   }); 
   $("#search_term").keyup(function(e){ 
       e.preventDefault(); 
       ajax_search(); 
   }); 
});

function ajax_search(){ 
$("#search_results").show(); 
var search_val=$("#search_term").val(); 
$.post("/hoge/fuga/find", {search_term : search_val}, function(data){
if (data.length>0){ 
$("#search_results").html(data); 
}) 
EOT;
$this->Html->scriptEnd();
/*---------------------------------------------------------------------------*/

普通のphpファイルで操作していた要素をCakePHPのviewファイルに合わせて
書き換えるだけなので難しいことは無いはず。

コントローラにAjaxからアクセスする操作を記述する


上の記述どおりだとFugaControllerにfindメソッドを記述する。

/*---------------------------------------------------------------------------*/
public function find() {
$this->layout = "ajax";
if($this->RequestHandler->isAjax()) {
$term = strip_tags(substr($this->request->data("search_term"), 0, 100));
$sql = "select name,phone
from directory
where name like '%$term%'
or phone like '%$term%'
order by name asc";
$result = $this->Telephone->query($sql);
$string = "";
foreach($result as $row) {
   $string .= "<b>".$row["Telephone"]["name"]."</b> - ";
   $string .= $row["Telephone"]["phone"]."</a>";
   $string .= "<br/>\n";
}
if($string === "") {
$string = "No matches!";
}
$this->set("data", $string);
}
}
/*---------------------------------------------------------------------------*/

これもほぼ参考サイト丸コピ。レイアウトの変更やAjaxからの送信かを確認しているくらい。

ここまでできたら一度ちゃんと動くかを普通にアクセスして確かめたほうがいいと思う。
条件がよくわからないが、エラーがあると普通にエラーメッセージを表示してくれるときと、
500エラーになるときで動作が分かれることがある
最初に普通にエラーメッセージが出てきたので、500エラーが出ている理由が
コントローラ側でエラーを吐いているのだと気づかずにしばらく積んだ。

最後にビューのポストに値を入力して動けば完了。

2014年1月28日火曜日

CentOS インストール

なにかがどうにかこうにかして、「そうだ! 自宅サーバーを作ろう!」と思い立った。
というわけで使わずに放置していた古いPCにCentOSをインストールしてみる。

CentOSはRedHatというディストリビューションから有償の部分を取り除きリビルドしたものらしい。
RedHatとの完全互換がテーマで、ネットにも大変情報が多い。

参考サイト
CentOS 6インストール
CentOSのダウンロードについて | Linux系OSのQ&A【OKWave】

isoをダウンロードする


CentOSの公式ページからisoをダウンロード。
今回は参考サイトに倣い、minimalという最小構成のものをダウンロード。

色々なisoファイルがあって戸惑ったので調べたそれぞれの違いをメモ。
  • bin : 多分全部入っているイメージ。直接インストール。
  • minimal : 最小構成のイメージ。最小なのはいいけどなにが入っているのですか?
  • live : CDやDVDから直接CentOSを起動できる。インストールする気が無いなら。

ネットに転がっているスクリーンショットからデザインが変わっているがそれっぽいリンクを
クリックして行けば辿り着く。最新のバージョンをいただきます。

ダウンロードしたisoはディスクメディアに焼いてやってインストール準備完了。

CentOSをインストールする


イメージを焼き付けたディスクメディアを使って早速PCにインストール開始。
手順が多くて面倒なので、参考サイトに丸投げ。
とりあえず日本的な選択をしていけばオーケーだと思う。

インストールが完了して、設定したパスワードでログイン。