2010年3月26日金曜日

クリティカルスピード

コードが少なくて驚いた。

面白いかも。


リアルアンリアル 高速配信Webサーバシステムをオープンソース化

2010年3月24日水曜日

MinGWでgdbmをビルドしてみた

flockとかfsyncがなくてダメな感じ。

systems.h
#include <io.h>
#include <windows.h>

#define UNLOCK_FILE(dbf) {                              \
    HANDLE h = (HANDLE)_get_osfhandle(dbf->desc);       \
    if (INVALID_HANDLE_VALUE != h) {                    \
      UnlockFile(h, 0, 0, (DWORD)-1, (DWORD)-1);        \
    }                                                   \
  }

#define READLOCK_FILE(dbf) {                                            \
    HANDLE h = (HANDLE)_get_osfhandle(dbf->desc);                       \
    if (INVALID_HANDLE_VALUE == h) {                                    \
      lock_val = -1;                                                    \
    } else {                                                            \
      OVERLAPPED over;                                                  \
      ZeroMemory(&over, sizeof(over));                                  \
      DWORD flags = LOCKFILE_FAIL_IMMEDIATELY;                          \
      if (!LockFileEx(h, flags, 0, (DWORD)-1, (DWORD)-1, &over)) {      \
        lock_val = -1;                                                  \
      } else {                                                          \
        lock_val = 0;                                                   \
      }                                                                 \
    }                                                                   \
  }

#define WRITELOCK_FILE(dbf) {                                           \
    HANDLE h = (HANDLE)_get_osfhandle(dbf->desc);                       \
    if (INVALID_HANDLE_VALUE == h) {                                    \
      lock_val = -1;                                                    \
    } else {                                                            \
      OVERLAPPED over;                                                  \
      ZeroMemory(&over, sizeof(over));                                  \
      DWORD flags = LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK; \
      if (!LockFileEx(h, flags, 0, (DWORD)-1, (DWORD)-1, &over)) {      \
        lock_val = -1;                                                  \
      } else {                                                          \
        lock_val = 0;                                                   \
      }                                                                 \
    }                                                                   \
  }

2010年3月11日木曜日

MinGWでDLLを作ってみる (32bitと64bit)

手軽な方法はこれ。

$ g++ -static -shared -o hello.dll hello.cc world.cc -Wl,--out-implib,libhello.a

gcc 4.4.0 (32bit)を使って、上記の方法でDLLをつくると、必要以上に多くの関数をexportしちゃっている。

ちゃんとDEFファイルを用意して必要な関数だけをexportする場合は次のようにすればよいみたい。

$ g++ -c hello.cc
$ g++ -c world.cc
$ g++ -mdll -o hello.dll.tmp -Wl,--base-file,hello.dll.base hello.o world.o
$ dlltool -l libhello.a --dllname hello.dll --base-file hello.dll.base --output-exp hello.dll.exp --def hello.def
$ g++ -mdll -o hello.dll -Wl,hello.dll.exp -static hello.o world.o

MinGW-w64でx64バイナリを作ってみる

MinGW-w64からmingw-w64-bin_i686-mingw_20100310.zipをダウンロード

適当な場所に展開してPATHを通してコンパイル。

$ x86_64-w64-mingw32-g++ Hello.cpp -static

※ -staticオプションを指定しないと LIBSTDC++-6.DLL が必要。

MinGW/g++-4.4.0でコンパイルしてみた

「-static-libgcc」これをつけると、libgcc_s_dw2-1.dllを配布しなくてすむ

コンソール
$ g++ --version
g++.exe (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ ls -l Hello.cpp
-rw-r--r-- 1 takumakei Administrators 97 Mar 11 13:00 Hello.cpp

$ cat Hello.cpp
#include 

int main() {
  std::cout << "Hello world" << std::endl;
  return 0;
}

$ g++ -o Hello -O3 Hello.cpp -static-libgcc

$ ls -l Hello.exe
-rwxr-xr-x 1 takumakei Administrators 3862265 Mar 11 13:56 Hello.exe*

$ strip Hello.exe

$ ls -l Hello.exe
-rwxr-xr-x 1 takumakei Administrators 496142 Mar 11 13:56 Hello.exe*

$ ./Hello.exe
Hello world
ウィンドウ
$ ls -l HelloW.cpp
-rw-r--r-- 1 JP10007 Administrators 150 Mar 11 13:34 HelloW.cpp

$ cat HelloW.cpp
#include 

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPTSTR, int) {
  MessageBox(NULL, "Hello world", "HelloW", MB_OK);
  return 0;
}

$ g++ -o HelloW.exe -O3 HelloW.cpp -static-libgcc -mwindows

$ ls -l HelloW.exe
-rwxr-xr-x 1 JP10007 Administrators 334435 Mar 11 13:59 HelloW.exe*

$ strip HelloW.exe

$ ls -l HelloW.exe
-rwxr-xr-x 1 JP10007 Administrators 75790 Mar 11 13:59 HelloW.exe*

2010年3月10日水曜日

Vaadinに興味津津

JavaだけでWebアプリケーションを作るフレームワークVaadin

GCJでコンパイルしてみた

MinGW/MSYSをインストールしてgcjしてみたがコンパイル後のプログラムを起動できないという罠にはまった。

つぎにthisiscool.comGCC/GCJ 4.3 (gcj-eclipse-merge-branch)をインストールしてようやくコンパイルと実行に成功した。

SWTを使ってウィンドウを表示するだけの単純なアプリなのに、コンパイルにはやたらと時間がかかるし、実行ファイルのサイズが55,842KBと巨大。upxで圧縮しても20,394KB。

JREをインストールしていない環境でも動作するプログラムをJavaで実装できることにはとても魅力を感じるけれど、この結果だと採用しにくいな。

a/Main.java
package a;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Main {
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("HelloSWT");
        shell.setSize(480, 320);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}
コンパイル
gcj -fjni -c -o swt.o swt.jar
gcj -mwindows -o Hello --classpath=swt.jar --main=a.Main a/Main.java swt.o