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にまたがる多様な仕様を実装しなければならず大変な作業になる。

で、普通はライブラリに頼ることになる。

最終更新時刻: 2009年11月02日

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

http://nttxstore.jp/_II_P812921544

最終更新時刻: 2009年11月05日

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

動いた!簡単!

title0

TeraTermから接続して、「SSH転送」を使ってWindowsのXクライアント(Xming)に描画している。

最終更新時刻: 2009年11月12日

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

動いた!

最終更新時刻: 2009年11月12日

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サーバとクライアントの出来上がり。

最終更新時刻: 2009年11月16日