2010年11月21日日曜日

1フレームで限界を超えてテクスチャを読み続けては駄目みたいだ。

コメントにも書いたが、1フレームで5枚読んだら落ちた。
そこで1フレームずつ5フレームに分けて5枚を読んだら落ちなくなったのだ。
アップルのサイトには「フレームの最初にテクスチャを読んではいけない」という説明もあるのだが、
1フレームで無理矢理5枚読もうとすると、
フレームの限界を超えて次のフレームの先頭に重なって読み込んでしまうのかもしれない。
まぁ本当の所はよくわからないが、今は落ちなくなったのは確かである。

2010年11月9日火曜日

iPadが落ちるのはやはりメモリだ

1024x1024の絵を6枚までなら落ちない。
7枚読むと落ちないときもあるし、落ちるときもある。

落ちるタイミングは読み替えのタイミングだ。
もしかしたらゆっくり読み替えれば落ちないのかもしれない。
だが、それはだましながら動かしているようなものなので、
しっかりと6枚という限界に注意しながら設計したほうがいい。

DevCenterの説明を読むと、
(1)起動時にテクスチャは全部読むようにする。
(2)1024x1024はでかいので512x512などに小分けしたほうがいい

さらに別の書き込みを読むと、
テクスチャの破棄をしてもメモリ中のどこかに残っているようで、
すぐにメモリが解放されていないという記述があった。

このあたりはOS4とかで改良されるのだろうか、
自分はiPadしか手にしていないのでよくわからない。

2010年11月7日日曜日

最近のお仕事

仕事が終わってからであればブログに書いても問題ないだろうと思うので書こうと思う。

少し前にiPadの「リルぷりっアプリ」というのを作った。
残念だが最後のビルドでしくじったため、締め切りに間に合わなかった。

経緯は以下のようなものだ。
(1)当時、提出はバイナリのみということだったのだが、
   ソースを提出し、セガでビルドをする必要があるということで、
   仕方なくソースの提出をした。
   ソースの提出をするのであれば、
   その件についてきちんとお話をするべきだ。
   切羽詰まった状態で有耶無耶のままソースを提出したくは無かった。
   現在もソースの提出についてはグレーのまま作業をしているが、
   自分は自分のソースの著作権を主張させていただく。

(2)当日の自分には別件があり、余裕がなく、
   秋葉で急遽PocketWiFiを購入して、茶店からアップをした。
   時間もかかり、何度もやり直せる状況ではなく、かなり焦っていた。

(3)自分で間違いに気がついて2日後には電話、およびメールをした。
   セガ社ではないのだが、
   取引先の会社に電話、およびメールをし、正しいバイナリは渡した。

(4)バイナリ名称
   最終提出バイナリと自分が間違ったソースからビルドしたバイナリでは、
   出来上がるバイナリ名称が異なる。
   少し注意すればすぐに気がついたはずだった。
  (たとえ自分でなくとも、わかるはず)

まぁ自分が間違ったのは事実なので、上記はその言い訳にしかすぎないのだが・・・

さらに、不幸なことに、セガ社ではおそらく、、、
自分が提出したソースをビルドする前に、
「すべてのターゲットをクリーンアップ」してからビルドをしていない。

自分のiPadでは落ちないのだが、AppStoreから落としたバイナリは落ちるのだ。
iPadではビルドする前に「クリーンアップ」するというのは欠かせない。

自分としてはこういった事が二度と起きないようにしたいのだが、
毎回スケジュールは切羽詰まってくる。

そして自分としては今回(まだ終わってないので話せない)も、
前回の「リルぷりっアプリ」も赤字だ。

これでは、続けられない。

そこで、最近のお仕事だが、3社ほど回ってみた。

どこも好印象。
自分の仕事はみなさん認めてくださる。

そのうち一件は1年のお付き合いになるかもしれない。

iPadでは無いが、ファームやWindows系、そしてもしかしたらAndroidのお仕事だ。
今後も、このように自分に出来ることなら何でもやって行こうと思う。

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なんていうイベントが出てしまってうまくフリックとピンチのステートチェンジできない。
ちょっち考え方を変えた方がいいかもしれないなぁ