Windowsで立てるApache2.2+WebDAV+SSL サーバー(SSLサーバーってなんだよ)

ApacheWebDAV+SSLなファイル共有サーバーを立てたのでメモ。
実は一度PC Aでサーバーを立てたのだが、のっぴきならない事情からPC Bにconfファイル
等々を移して立て直そうとしたものの、どうしてもApacheが元のconfファイルを拒否して
しまい、結局原因がわからなかったので一から立て直した次第。

■やりたいこと
Windows+Apache 2.2+WebDAV(Basic認証)+SSLという至って普通のSecure serverを作る
SSL以外の接続は拒否したい
・TeamFileで接続できればOK
SSLApache 2.2のインストーラ付属のOpenSSL 0.9.8x(xはアルファベット)を使う
・なるべく設定は変更しない(移植時に困る)

Apache 2.2の準備
 Apache 2.2の準備自体は簡単。
 公式サイトからWin32向けのインストーラをダウンロードして、ウィザードに従って
 インストールするだけ。SSLを使うのでOpenSSLが一緒にインストールされるものを使う。
 ここから下は"C:\Apache"にApacheをインストールした前提で進めます。

 <注意点>
 ・インストール先パスのデフォルトは"C:\Program Files (x86)\Apach うんちゃら"
  になるが、"C:\apache"のように短くてスペースを挟まないディレクトリを指定した
  方がいい。長かったりスペースを含んでいると、confファイルを書く際に嫌になる。
 ・インストール物をカスタムで指定した後は、必ずツリーの一番上を選択してから次へ
  行くこと。ここで何か(Docとか)を選択した状態でインストール開始すると、選択さ
  れたものしかインストールされない。

 なるべく標準のものから変更したくないので、httpd.confの下記の設定を変更・追加
 した以外はデフォルトのまま(ServerRootもそのまま)。

 -----------------------------------------------------
 # HTTPの待ち受けポートを変更
 Listen xxxx

 #WebDAVを使うのでコメントアウトを削除
 LoadModule dav_module modules/mod_dav.so
 LoadModule dav_fs_module modules/mod_dav_fs.so
 LoadModule dav_lock_module modules/mod_dav_lock.so

 LoadModule ssl_module modules/mod_ssl.so

 #SSL以外の接続をはじきたいので、すべてのに下記を追加
 SSLRequireSSL

 #WebDAVの設定を使うのでコメントアウトを削除
 Include conf/extra/httpd-dav.conf

 #SSL使うのでコメントアウトを削除
 Include conf/extra/httpd-ssl.conf
 ----------------------------------------------------

WebDAVの準備
 conf/extra/httpd-dav.confをいじる。
 BASIC認証を行うためにUser/Passwordが記載されたファイル(.htpasswd)を作る必要が
 あるが、俺はもう作ってあったのでコピペするだけでした。作り方は5個くらい前の記事を参照。

 その前に
 ○Apacheインストールディレクトリの直下にvarというフォルダを作っておく。
  ここにWebDAVのモジュールがファイルアクセスの排他に使うDavLockというファイル
  が作られる(らしいよ)。

 WebDAVでやりたいことの詳細
 ・認証方式はBASIC認証を使う。Digestじゃなくてもいい。いいんだよ。

 httpd-dav.confは下記を変更・追加。
 ----------------------------------------------------
 #エイリアスは/webdavに。共有するフォルダは適宜設定
 Alias /webdav "C:/webdav"

#あわせて変更
 

 #BASIC認証なので、AuthTypeはBasicを指定
 AuthType Basic

 #AuthUserFileは.htpasswdの場所を指定
 AuthUserFile "C:/apache/conf/.htpasswd"

 #BASIC認証のUserListの形式を指定
 AuthBasicProvider file

 #AuthDigestProviderは使わないのでコメントアウト
 #AuthDigestProvider file

 #全てのUserをFullControlにしたいのでコメントアウト
 #
 #require user admin
 #

 #SSL必須なので追加
 SSLRequireSSL
 ----------------------------------------------------

SSLの準備
 conf/extra/httpd-ssl.confをいじる。
 OpenSSLがインストール時にすでに入っているので特にインストールするものはなし。
 念のためコマンドプロンプトを開いて"openssl"と打って実行して、exeが存在すること
 を確認する。エラーが出たら、openssl.exeのあるフォルダにパスが通っているか確認
 する。

 ちなみに証明書(*.crt)・秘密鍵(*.key)はすでに作ってあるので割愛。
 「Apache OpenSSL 証明書」で検索すればヒットします。

 ・SSLを使う理由
  WebDAVで共有しているフォルダにアクセスするにはBASIC認証による認証が必要だが、
  BASIC認証はUser/Passが平文で流れる。昨今のセキュリティ事情的にこれは大変よろ
  しくないので、せめて通信は暗号化しておきたい。

 ----------------------------------------------------
 #HTTPアクセス時のポート。デフォルトのままだと決め打ちでアタックされそうなので、
 #せめてもの抵抗としてポート番号を変えてみる。
 Listen 4430

 #サーバーのIPアドレス(Local)を指定。ポート番号も合わせる。
 

 #証明書ファイルを指定
 SSLCertificateFile "C:/apache/conf/server.crt"

 #秘密鍵ファイルを指定
 SSLCertificateKeyFile "C:/apache/conf/server.key"

 #httpd-ssl.confの中にもがあるが、ここにSSLRequireSSLを追加すると
 #エラーになるので、そのままにしておく。何故エラーになるのかはわからない。
 #触らぬ神に祟り無し。
 ----------------------------------------------------

 Apacheの設定はこれで終わり(かな?)


ファイアウォールの設定(Windows7)
 Windows標準のファイアウォールは生かしてそのまま使うので、Apacheで使用する
 ポートだけ開放する。ついでにPingも許可する。

 □SSLポートの開放
  SSL接続のみ許可したいので、上で設定したPort4430だけ開放する。
  (1)「コントロールパネル」→「システムとセキュリティ」→「ファイアウォール
    状態の確認」を開く
  (2)左側のメニューから「詳細設定」を開く
  (3)管理コンソール画面が出てくるので、左側のツリーの「受信の規則」を選択し、
    右側のメニューから「新しい規則」を開く
  (4)「ポート」→(次へ)→「TCP」「特定のローカルポート:4430」→(次へ)→
    「接続を許可する」→(次へ)→「ドメイン・プライベート・パブリック」全て
    チェック→(次へ)→「名前」「説明」は適当に設定→「完了」
  これでSSL接続に使うPort:4430が解放される。

 □Pingの許可
  「新しい規則」を作るまでは、SSLポートの開放と同じ手順
  (1)「カスタム」→(次へ)→「すべてのプログラム」→(次へ)→「プロトコルの種類
   :ICMPv4」→(次へ)→「接続を許可する」→(次へ)→全部チェック→(次へ)→
   適当に名前と説明を入力→完了

 これでPort:4430(SSL)への接続とPingが許可された(ICMPv4を選択するステップで
 「カスタマイズ」ボタンを押すとICMPv4で許可するコマンドを選択できる)。


■接続テスト
 ブラウザで「https://192.168.0.2:4430/」とかすると確認できる。
 Apache+WebDAV+SSLWebDAVファイル共有を立てたが、クライアント側はTeamFileという
 SSL対応のWebDAVクライアントを使うので、そちらからの接続テストもする。

 (1)マイコンピュータを開くとTeamFileのアイコンがあるので開く
 (2)右クリックして「サーバーの追加」を選択
 (3)好きな名前を入力し、□詳細設定にチェックを入れる
 (4)「URL:http://192.168.0.2:4430/webdav/」を入力し、□SSLを使用する にチェック
   を入れる。
 (5)ログイン情報の欄
   □自動ログイン にチェックを入れる
   ユーザーIDとパスワードは、.htpasswdに登録されているものを入力。
 (6)「接続テスト」タブを選択し、「テスト」を押すと、「接続ステータス:接続成功」
   になることを確認。


ここまできたらあとはルーターの設定を変えて、Port:4430へのアクセスをサーバーに
ルーティングしてあげるだけ。お疲れ様でした。

Timer

MSP430のUser's GuideにはTimerA/TimerBの2つのタイマーの記載があるが、LaunchPadに付属しているG2553では
TimerAしか使えない。TimerAは内部に2chあるようで、2つのタイマーを使って色々出来る。

G2553にはHW制御のPWM出力モジュールは入っていないものの、TimerAのコンペア出力というものがあり、それが
PWMの代わりに使える。LaunchpadであればP1.6(LED2)に対して出力することできる。
(TimerA_0のみ使える。TimerA_1はLaunchpad上のLEDに対してコンペア出力出来ない。)

P1.6でPWMを使うために、P1SELのbit6を1にしておく。これでMUXがTA0.1というfunctionになり、コンペア出力
がこのピンからされる(他にもいろいろMUXされたfunctionあるけど、1bitだけでいいのか・・・??)

デューティー比と周波数はTimerAのソースクロックとCCR0,CCR1の値によって決定される。
ソースクロックがSMCLK(1MHz?)、CCR0が1000、CCR1が250であれば、デューティー比は25%(あれ?75%か?)に
なる。
それと、TAxCCTL1にOUTMOD_xをしていする。どのモードを指定すればよいかはUser's guideに書いてある。
が、どれを選べばいいのかよくわからない…

とりあえずメモ。

MSP430始めた

MSP430 LaunchPadでマイコンの勉強を始めてたり。
H8やPICも考えたけど、下記の点からMSP430に決定。

①開発環境がそろっている
 - EclipseベースのIDE(CodeComposerStudio)
   デバッガも付属している
 - Cコンパイラ付属
   必要なヘッダも用意されている

②開発ボードが安い
 - MSP430 Launchpad
   USB-UART変換ICが乗っていてPC上からフラッシュ書き換えが出来て、
   LEDやスイッチやピンヘッダや32.768kHzのクリスタルやMSP430が2つ付いて$4.3。マジかよ。

DIP
 - GPIOは少ないけど表面実装とかなにそれ無理。

④省電力
 - 1MHz辺りの消費電力は数μA程度。電池駆動を考えるととても嬉しい。

ペリフェラル
 - I2C/UART/SPI/TimerA(2ch)/USI/ADC/その他ICによってもろもろ
  PWMが無いけどTimerAで代用可能

⑥性能
 - G2553は16bit 16MHz/16K ROM/512B RAM

⑥将来性
 H8やPICより将来性がありそう。
 TIのARMマイコンへの移行も楽そう。

ということでしばらくはこれで勉強してみる。
そのうちARMマイコンにも手を伸ばしてみたい。

リモートデスクトップでクリップボードの内容が共有されない

Windows7-Windows7マシンでリモートデスクトップしたとき、クリップボードの内容が共有できなくなってしまった。
ホスト側の「Routing and Remote Access」サービスを無効にしてしまったのが原因だった。
リソース確保の為にと止めましたが、それが影響したみたい。

.htpasswd メモ

■.htpasswdの更新方法
http://www.adminweb.jp/apache/allow/index4.html

・ユーザー追加
(1)コマンドプロンプトを管理者権限で起動
(2)C:\Apache2\binに移る
(3)htpasswd.exe [./htpasswdのパス] [追加したいusername] を実行
(4)パスワードを聞かれるので、2回入力
(5)終了

・ユーザーパスワード変更
(1)コマンドプロンプトを管理者権限で起動
(2)C:\Apache2\binに移る
(3)htpasswd.exe [./htpasswdのパス] [変更したいusername] を実行
(4)パスワードを聞かれるので、2回入力
(5)終了

・ユーザー削除
(1)コマンドプロンプトを管理者権限で起動
(2)C:\Apache2\binに移る
(3)htpasswd.exe -D [./htpasswdのパス] [削除したいusername] を実行
(4)終了

久しぶりのCプログラミング

久しぶりにマイコンでCプログラミングをしている。
あまりにもブランクが長すぎて(3年ほど)基本的なところを忘れていたりする。これじゃ完全に初心者だよ…すこし切なくなった…
C#はいけるんだけどね。C#に慣れすぎて、構造化プログラミングで書くのが違和感があって大変。
マイコンだから、変数の扱いもすこしデリケート。volatileとかstaticとかconst辺りの使い方を復習中。

■volatile
ある関数の中で初期化した変数で、その関数の中では辺りが変更されずに割り込み関数で値が変更されるような場合、コンパイラが勝手に
最適化をして変数を固定値に変えてしまったりすることを防ぐときに使う。

int a;
void main(){
a = 0;
while(a == 0){} // コンパイラが勝手にwhile(1){}にしてしまうこともある
}

void interrupt(){
a = 1; // ここでa=1と代入しているのに
}

■static
関数外に書くのと関数内に書くのとで微妙に挙動が異なる。

―変数(関数外)
 関数外で変数を宣言すると、そのモジュール(.cファイル)の中からしか参照できない。
 グローバルは全てのモジュールから参照できてしまうので、それよりスコープが狭い。

[src1.c]
 static a = 0;

void func(){
a = 1; // これは出来る
}

[src2.c]
void func2(){
a = 1; // これは出来ない
}

―変数(関数内)
 その関数内でしか使えないが、関数終了後も値が破棄されずに、次回関数実行時までも保持される。

―関数
 そのモジュール内でしか呼べない関数になる。
 通常はheaderにプロトタイプ宣言があれば他のファイルからもその関数を呼べるが、これは呼べない。(プロトタイプ宣言も出来ない)

■const
ROMに固定値として割り当ててRAMにコピーさせない

通常グローバル変数を定義すると、初期値をROMに書き込むほかに、プログラム実行中に値を書き換えることもあるので
RAMにもコピーされる。書き換えが不要な変数の場合これは無駄なので、constを付けることでROMだけに書くことができる。
書き換えは不可。




C#に慣れた身としてはstaticとファイル分割を使って積極的にモジュール化したいところだが、マイコンというROMもRAMも限られているうえに
関数呼び出しのコスト(オーバーヘッド)が気になるので、多少コードが読みにくくてもグローバル変数で扱った方が良いこともありそう。
メリットデメリット考えて良い良い方を選べばいいんだけど…
何がどういう仕組み動いているのかマイコンの動作をもっと深く理解する必要がありそう。

参考サイト
http://www.geocities.jp/ky_webid/ProgrammingPlacePlus/c/023.html
http://www.cqpub.co.jp/interface/sample/200807/I0807103.pdf

.conf の構文チェック

Apacheを起動しようとしたところ「そのオペレーションは失敗しちゃった★」的な、とても不親切なダイアログが出てきて起動しなくなった。
エラーの原因が推定できるような情報が一切ないので、対処法を探したところ、confファイルの構文チェックを行うコマンドがあるらしい。

C:\Apache2.2\bin\httpd.exe -w -t -f "C:\Apache2.2\conf\httpd.conf" -d "C:\Apache2.2\."

今回エラーになったのは、WebDAVディレクトリに外したexternalHDDのパーティションを指定していたためだった。
こいつらをコメントアウトしたところ無事に起動した。