PC関係のメモ
Terminator P4 533Aがお亡くなり / SimpleTaskデモ / C/C++でHTTP通信 on Windows
Terminator P4 533Aがお亡くなり
永らく自宅サーバであった「Terminator P4 533A」。
昨日、久しぶりに火を入れようと思ったらランプ含めて一切反応がない。
現在の自宅サーバは別の機種で稼働しているので、運用に支障はないが。
予備サーバ兼、アプリサーバとして構築しようと思った矢先の出来事。
あー、どうしようかな。
メモリ2GB~、CPUそこそこのサーバを立てたいんだけど。。。
SimpleTaskデモ
http://www.mylab.jp/program/simpletask/demo/
遅ればせながらデモ環境を用意しました。
くちゃくちゃになってもすぐ直せるので弄ってみて下さい。
C/C++でHTTP通信 on Windows
まずはライブラリを使わない方法。
- WinSock2でソケット通信しながら自前で処理
これはHTTP通信だけでなくSSL/TLS等の暗号化、BASIC/Digest/NTLM等の各種認証、gzip圧縮等、いくつものRFCにまたがる多様な仕様を実装しなければならず大変な作業になる。
で、普通はライブラリに頼ることになる。
- neon http://www.webdav.org/neon/
- WinHTTP
- cURL(Client URL Library) http://curl.haxx.se/
- WinInet
KISS原則 / 内製について / 格安サーバ
KISS原則
http://ja.wikipedia.org/wiki/KISS%E5%8E%9F%E5%89%87
大事。ほんと大事。
KISSについては過去何回かここにも書いてるけど、プログラミングとかパッケージ選定するときに特に思う。
でも、「偉い人にはそれがわからんのです」よ。
格安サーバ
Express5800/GT110a(1C/430-1HD) NP8100-1493YP5Y
http://nttxstore.jp/_NGXYM_01_03_99_01
ML115 G5 帰ってきた! スタートダッシュ3 4577670-AJKV
ntpdと仮想IP(IPエイリアス、サブインターフェース)の組み合わせ(2) / ODE(Open Dynamics Engine)を使ってみた(1)
ntpdと仮想IP(IPエイリアス、サブインターフェース)の組み合わせ(2)
下記記事の続き。前回の記事の設定では上位サーバとの同期ができなくなる可能性が高い。
http://www.mylab.jp/diary/20091028.html#p01
解決策を先に示す。
- ntpdの起動オプションの-Iオプションは推奨されないため使用しない。
- ntp.confに「interface listen all」の行を追加。(/etc/ntp.conf)
理由としては、-Iオプションでは複数インターフェースでListenさせることができないため。 ワイルドカードを使えばいいのかもしれないが、そもそもドキュメントにも「このオプションは推奨されない。ntp.confのinterfaceを使うほうがよい」と記述されている。
複数インターフェースでListenできないと何が問題かというと、仮に「eth0:1」でのみNTP通信を受け付けるとすると、クライアントからの通信は可能だが、上位サーバとの通信は「eth0」で行われるため同期に失敗する。
原因調査の方法を記しておく。
- 「ntpq -p」で確認したところ上位サーバとの同期が取れていない。
- 「tcpdump -l -s 1600 -x port 123」でパケットキャプチャしながら「ntptrace 上位NTPサーバ」したところ、通信自体はeth0で行われていることを確認。
- 「ntpd -I eth0:1」となっていたため、eth0でNTP通信を受け付けていないことに気づく。
- 「ntpd -I eth0 -I eth0:1」として起動したが、「/var/log/messages」で起動ログを確認したら「eth0:1」(後に指定したインターフェース)しか有効になっていないことがわかった。
- ntpdの最新ドキュメントを確認したところ、「-I」オプションが推奨されず、また、lo以外の複数インターフェースでの受付に対応していないことがわかる。代わりにntp.confのinterfaceを使うべきと書いてある。
ODE(Open Dynamics Engine)を使ってみた(1)
オープンソースの物理エンジンライブラリのODEを使ってみる。
まずは環境作り。OpenGLのライブラリであるGLUTライブラリを入れる。
# yum install freeglut-devel
最新のODEのソースコードをダウンロードして、コンパイルして、インストール。
# wget http://downloads.sourceforge.net/project/opende/ODE/0.11.1/ode-0.11.1.tar.gz?use_mirror=jaist # tar xvfz ode-0.11.1.tar.gz # cd ode-0.11.1 # ./configure # make # make install
デモを起動してみる。
# cd ode/demo/ # ./demo_buggy
動いた!簡単!

TeraTermから接続して、「SSH転送」を使ってWindowsのXクライアント(Xming)に描画している。
ODE(Open Dynamics Engine)を使ってみた(2)
まずはとっかかりになるサンプルソースをコンパイルしてみることにした。
サンプルは下記サイトのソースを参考に(というかそのまま)させて頂いた。
http://demura.net/9ode/3993.html
#include <ode/ode.h>
#include <drawstuff/drawstuff.h>
dsFunctions fn;
void start() /*** 前処理 ***/
{
static float xyz[3] = {3.0,0.0,1.0}; // 視点の位置
static float hpr[3] = {-180, 0, 0}; // 視線の方向
dsSetViewpoint(xyz,hpr); // カメラの設定
}
void setDrawStuff() /*** 描画関数の設定 ***/
{
fn.version = DS_VERSION; // ドロースタッフのバージョン
fn.start = &start; // 前処理 start関数のポインタ
fn.step = 0; // simLoop関数のポインタ
fn.path_to_textures = "/usr/local/src/ode-0.11.1/drawstuff/textures"; // テクスチャ
}
void dmLoop(int w, int h){
setDrawStuff();
dsSimulationLoop(0,0,w,h,&fn);
}
int main()
{
dmLoop(800, 600);
return 0;
}
で、コンパイル。
g++ -I/usr/local/include/ode/ -I/usr/local/src/ode-0.11.1/include/ \
-L/usr/local/lib/ \
hello.cpp \
/usr/local/lib/libode.a \
/usr/local/src/ode-0.11.1/drawstuff/src/.libs/libdrawstuff.a \
/usr/lib/libX11.so \
/usr/lib/libglut.so
で、実行。
./a.out
動いた!
gyazoが良い感じ。
超簡単画像アップロードサービスのgyazo。
前から名前は知ってたけど、クライアントどころかサーバまでオープンソースになっているのは先週知った。
しかもこれが超シンプル。
サーバスクリプトに至ってはコメント除けば20行ないくらい。ライセンスはGPLです。一部修正。
#!/usr/bin/env ruby
# -*- ruby -*-
#
# $Date$
# $Rev$
#
require 'cgi'
require 'digest/md5'
require 'sdbm'
cgi = CGI.new("html3")
id = cgi.params['id'][0].read
imagedata = cgi.params['imagedata'][0].read
#hash = Digest::MD5.new(imagedata).to_s
hash = Digest::MD5.hexdigest(imagedata).to_s
dbm = SDBM.open('db/id',0644)
dbm[hash] = id
dbm.close
File.open("data/#{hash}.png","w").print(imagedata)
#cgi.out { "http://gyazo.com/#{hash}.png" }
cgi.out { "http://gyazo.example.com/data/#{hash}.png" }
修正箇所は下記2箇所(コメントが修正前)。
#hash = Digest::MD5.new(imagedata).to_s hash = Digest::MD5.hexdigest(imagedata).to_s
#cgi.out { "http://gyazo.com/#{hash}.png" }
cgi.out { "http://gyazo.example.com/data/#{hash}.png" }
Digest::MD5の仕様変更とURL変更。
上記に適当なファイル名をつけてアップする。後は必要なフォルダ(dbとdata)を作成して書込権限を付けておく。
で、.htaccessも置いておく。
Options +ExecCGI AddHandler cgi-script .cgi
設置イメージはこんな感じ。
db/ data/ .htaccess upload.cgi
クライアントコードについてはgyazowinのコードを自分のサーバにあわせて一部変更すればOK。URLがハードコーディングされているので、そこを変更するだけ。一部抜粋。
BOOL uploadFile(HWND hwnd, LPCTSTR fileName)
{
const TCHAR* UPLOAD_SERVER = _T("gyazo.example.com");
const TCHAR* UPLOAD_PATH = _T("/upload.cgi");
...(snip)...
woopar = "http://gyazo.example.com/data/" + result.substr(17);
以上で、自分だけのgyazoサーバとクライアントの出来上がり。

