2010年10月27日水曜日

人生はとても短い

自分の叔父は真空管アンプを作り、オーディオを趣味とする人で、
50を超えてからDOS/Vを自分で組み立て始め、
Config.sysやAutoexec.batなんかを編集してメモリを空けたりパス通したり、
ごちゃごちゃした作業が全然平気な人だった。

個人事業主でCADを覚え、ずっとCAD屋をやっていたのだ。
しかしその叔父も癌であっという間に亡くなった。
すぐれた頭脳をもっていても、生きる気概に満ちていても、死ぬ時は死ぬ。
所詮人間なんてものは虫の生き死にと同等の生き方しか出来ない。
死の前では生物はみな平等だ。
人間様はこの地球上で他の生命よりも優れているのだと勘違いしてはいけない。

自分はこの人生の中でどこまで何ができるのだろうか
小さい頃の夢だったプログラマにはなる事ができた。
しかし、それは、ただ道具を手に入れただけにすぎない。
物をつくる準備が出来ただけなのだ。

2010年10月19日火曜日

Base64エンコード

---Base64.h---
// Base64.h : Base64.DLL のメイン ヘッダー ファイル
//

#pragma once


class __declspec(dllexport)CBase64
{
public:
 CBase64();
public:
 int gettableint(unsigned char str);
 unsigned short Encode(unsigned char* data, unsigned short datalen, unsigned char* buffer);
 unsigned short Decode(unsigned char* data, unsigned short datalen, unsigned char* buffer);
};


---Base64.cpp---
// Base64.cpp : DLL の初期化ルーチンです。
//


#include "Base64.h"

#if _DEBUG
#define _CRTDBG_MAP_ALLOC
#include 
#include 
#endif


// CBase64App コンストラクション

CBase64::CBase64()
{
   //初期処理
#if _DEBUG
 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif

}


// CBase64App 初期化
// US-ASCII テーブル
static char base64_table[] = {
    'A','B','C','D','E','F','G','H',
    'I','J','K','L','M','N','O','P',
    'Q','R','S','T','U','V','W','X',
    'Y','Z','a','b','c','d','e','f',
    'g','h','i','j','k','l','m','n',
    'o','p','q','r','s','t','u','v',
    'w','x','y','z','0','1','2','3',
    '4','5','6','7','8','9','+','/'
//  '='
};


#define IsBit(c)    ((unsigned char)c) ? 0x01 : 0x00


int CBase64::gettableint(unsigned char str) {
    int i;
 for(i = 0; i < 64; i++) {
        if(str == base64_table[i]) break;
    }
    return i;
}

unsigned short CBase64::Encode(unsigned char* data, unsigned short datalen, unsigned char* buffer)
{
    unsigned short byte = 0;
    unsigned char bit = 0x80;
    unsigned char tmp;
    unsigned short size = 0, line = 0;
    int i;

    while(1) {
  if(byte >= datalen){
   break;
  }
        *buffer = '\0';
        for(i = 5; i >= 0; i--) {
            tmp = IsBit(data[byte] & bit);
            *buffer |= tmp ? (tmp << i) : *buffer;
            bit >>= 1;
            if(bit == 0x00) {
                byte++;
    if(byte >= datalen){
     break;
    }
                bit = 0x80;
            }
        }
        *buffer = base64_table[*buffer];
        buffer++;
        size++;
        line++;
        // 改行
  /*
        if(line >= 76) {
            buffer[0] = '\r';
            buffer[1] = '\n';
//          buffer[2] = '\0';
            buffer += 2;
            size += 2;
            line = 0;
        }
  */
  // 今回は改行しないようにする
    }

    tmp = (unsigned char)((size / 4 * 4 + 4) - size);
    while(tmp--) {
        *buffer = '=';
        buffer++;
        size++;
        // 改行
  /*
        if(line >= 76) {
            buffer[0] = '\r';
            buffer[1] = '\n';
            buffer += 2;
            size += 2;
            line = 0;
        }
  */
  // 今回は改行しないようにする
    }
    *buffer = '\0';
    return size;
}

unsigned short CBase64::Decode(unsigned char* data, unsigned short datalen, unsigned char* buffer)
{
    int bit = 7;
    unsigned char tmp;
    unsigned char i, t;
    unsigned short size = 0;
    unsigned short byte=0;

    *buffer = '\0';
    while(1) {
        if( (data[byte] == '=') || (data[byte] == '\0') || (byte > datalen) )
            break;
        if( (data[byte] == '\n') || (data[byte] == '\r') ) {
            byte++;
            continue;
        }
        tmp = gettableint(data[byte]);
        if(tmp > 63) return 0;
        for(i = 0x20; i != 0; i >>= 1) {
            t = IsBit(tmp & i);
            *buffer |= t ? t << bit : *buffer;
            bit--;
            if(bit < 0) {
                buffer++;
                *buffer = '\0';
                size++;
                bit = 7;
            }
        }
        byte++;
    }

    return size;
}

2010年10月12日火曜日

WindowsMobile7

どのくらいのスピードで動くんだろうか?
外部機器と接続するとかの場合は、
USBのバルクトランスファーが出来るドライバを作ればいいので、
作り方のわかるWindowsMobileのほうが他のMobile向けOSよりも慣れている。

以前Optimizeで出してた USB FX2 用のバルク転送用ドライバをWinMobile6向けに作った。
わりと動いたし、今あれがあれば、ロボットの頭に出来たりするし、いいんだけどなぁ
残念ながら開発した場所に置いてきてしまっている・・・

iPad落ち過ぎなんだけど

メモリが無いためか知らないが、iPad落ち過ぎる

2010年10月11日月曜日

技術はいつも進歩するとは限らない

いまだに本田カブのエンジンを超えるエンジンは出来ない。
あれはまさに奇跡的なエンジンだ。
本田宗一郎と仲間たちによって作られた奇跡なのだと思う。
世の中には偶然かもしれないし奇跡かもしれないが、
こういうとてつもない物作りに成功してしまうことがある。

例えば名も知れないメーカーの作った5000円くらいの掃除機がとても良い性能だったりすることもある。
コーヒーメーカーや圧力鍋なども全然壊れなかったり、
とてつもなく乗りやすい自転車なんてものもあったりする。
(宮田自転車の昔作っていた菱形ギアの自転車は自分のお気に入りだった。)

残念ながらこういう奇跡的産物については口コミもあまりつかず、
世の中にも広く出回る事も無い。
理由はよくわからないが、
ニッチな分野で高性能だったとしても広まらないという事なのかもしれない。

Windows は性能が悪いにもかかわらず、
人為的に広告され宣伝され、あたかも便利なもののように受け止められ、
必要以上に世の中に広まってしまった。

Windowsのおかげで、コンピュータを使える人が大量生産され、
Windowsが売れる事になった!
しかし、売れたアプリはほとんど無い。
売れたのはオフィスくらいなもんだろう。
そういった意味ではMS以外まったくおいしくないプラットフォームだ。

なにしろMSは他社製品の競合製品をことごとく踏みにじってきた。
執拗に何度も何度も蹂躙し続けた。

自分は未だにDOS時代のコードの方が早いしわかりやすいし、外部機器とも繋がりやすいと考えている。
くだらないウイルスなんてものに悩まされることもないし、
ここまで高速なCPUだって必要なかったはずだ。
そしてCO2の排出量だってここまで増えなかったに違いない。

ハードウェア屋から見れば、Windowsはドライバというものが無いと繋がらないし、
もっと時間的にシビアな接続をしたいと思っても、
Windowsのマルチタスクでは、アプリから出来る事は無い。
ドライバ側で吸収しなければならないことも多い上に、
吸収しきれずハード側で解決しなければならないことも多い。

その点DOSはシンプルだった。
シリアルやパラレルがあれば繋がったからだ。
新しいハードが出来るたびにドライバを作る必要も無い。

自分には今の状態がDOSから進歩したようには見えない。

(DOSじゃマルチスレッド出来ないじゃないかとかつっこまれそうだけど、
マルチスレッド可能なOSなんていくつもあったのに、消えていってしまったのだ。)

Windowsはコンピュータの世界において環境破壊をし続けた。

2010年10月10日日曜日

xcodeなぞの挙動

iPad のアプリ開発中で xcode のコンソールで以下のようなメッセージが出る事がある。

データフォーマッタが一時的に使用できなくなっています。“続ける”の後で再試行します。(Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")

Device でデバッグしていると突然落ちる。
そのときのエラーメッセージだ。
Received memory warning. Level=2 の後に出ているので、メモリが足りなくなって落ちているようにも思える。

しかし、デバッガから起動しなければ問題なく動くプログラムなのだ。
Deviceをデバッグ中にはDevice 側のメモリを余分にとられるということだろうか?
確かにARMをJTAGでデバッグするときには、ワーキングエリアの設定が必要だが、、、
微々たる物だし問題があるとも思えない。

そもそも、XCODEでデバッグ中はJTAG接続じゃないと思うし(だったら何で繋がってるんだ?という疑問も湧くが・・・)
よくわからんなぁ

2010年10月9日土曜日

Windowsは重い

MacやUbuntuを使ってると、なぜWindowsはこんなに重いんだろうかと思う。
何をするにももっさりもっさり動く。
こんなの使ってて仕事してると、もっさりもっさりしている時間に仕事をしている時間が食われてしまう。
もうビジネスでもWindowsなんて使えない。使う気が起きない。

しかし、iPadやAndroidに比べるとWindowsCEはUSBのドライバを書けばどういうハードでもつながる
(バルクトランスファーを使えばなんとかなる)という点で優れている。
外部でロギングしたデータを取り込んで表示するのはiPadやAndroidよりもWindowsCEなのだ。
でも、はっきりいって、USBでバルクトランスファーさえ出来ればいいんだから
Android.USB.BulkTransferくらい作ってほしい物だ。

2010年10月2日土曜日

OpenGLES で フリックやらピンチやら

面倒くさいんだけど、フリックやらピンチの処理を実装してみた。
TouchesBeganとかそのあたりをいろいろ使って動くようにするわけだが、
自分のやり方だと、二本指でタッチされた場合はピンチ処理
一本指だとフリック処理と言う事にしている。
ただ、ちまたのアプリを見てみると二本指でもフリックが出来るようになっているものもあったので、
どうしようかなぁと思ってる。
さらに自分のやり方だと、指一本でも高速に二点間を行き来するような動きをすると、
Touch,Touch,Moveなんていうイベントが出てしまってうまくフリックとピンチのステートチェンジできない。
ちょっち考え方を変えた方がいいかもしれないなぁ