Jian's profile星舞PhotosBlogListsMore Tools Help

Blog


    2/25/2008

    明天,后天

    明天data structure的期中,后天sound&audio的期中。。。哎,我notes都还么过一遍呢,而且sound&audio是铁定来不及复习完全的了。。。
     
    但是,我却一点都不紧张,呵呵。。。
     
    无聊的逛逛sound&audio的bbs,我这个名字已经挺有发言权的了~
     
    貌似,在同级别的IT技术上,我已经可以开始牛气了~
    2/19/2008

    今天有点抓狂

    今天7点30开始研究sound&audio的第一份作业,一直到晚上8点从图书馆回来。。。12个小时,还是没有搞定。。。
    真TMD郁闷!!!!!!
     
    本来把一个单声道的.wav文件通过代码编程个立体声,从左声道过渡到右声道的.wav并不是很难。我完全可以先定义好左边的声源,然后计算出运行的轨道,再用openAL的函数让那个声源沿着这个轨道运行;但是!作业要求一定要用amplitude panning,而且,老师还给了段代码,说是要一模一样的用。。。
     
    那段代码引用的参数是 short* stereoData, 虽然说.wav单声道的文件,数据确实是保存在一个8bit的short 数组中,但是我接触openAL还不到2天,程序员手册看得是晕乎乎,还是没找出什么函数的返回值和short是有联系的。。。编译器不停的报错,很郁闷啊。。。
     
    不过这几天的时间也不是白花的。。。学了很多的东西,还很仔细的研究了.wav的数据结构(虽然一头雾水),不过在搜寻的过程中,发现了很多很有料的论坛,这对自已以后的路来说,是很有帮助的。而且做游戏,openGL和openAL如果能很精通的话,那就可以尝试着开发属于自己的3D游戏引擎了。在google上找openAL的例子的时候,发现很多老外都有在开发自己的游戏引擎,呵呵。。。我要好好追击了。。。
    2/14/2008

    史玉柱商人本能与马云一念之仁

    马云的一念之仁与史玉柱的商人本性,造成了两大公司股票走势曲线大致相同,但实际却冰火两重天的结局。

                                                                                                              王育琨/文

      巨人网络与阿里巴巴分别在2007年11月1日和11月6日在纽约证券交易所与香港联交所上市,先后刷新了中国互联网公司上市的融资规模。恰逢全球股市阴雨连绵的季节,美国次级债危机阴云密布,投资人信心大受折损,两家公司上市后均遭遇了股市大跌,许多人被套牢。但是两者的境遇则全然不同。

      2007年10月31日,巨人网络首次公开招股。董事局主席史玉柱以每股15.50美元的发行价格卖出5720万股,当天即从股民那里换回8.87亿美元。第二天价格就蹿升到20.48美元,投资者一起叫好。可是没过几天股价就直线回落,直到2007年12月20日探底至9.50美元。迫于投资者的压力,2007年12月24日,史玉柱决定从8.87亿美元中拿出2亿美元回购巨人股票,此时,巨人股价是10.5美元。回购股票救市,依然招来质疑:2个月前,史玉柱用1290万股,换回2亿美元,现在扔回2亿美元,却换回近2000万股,凭什么好处全是你的?但是回购没有挽回巨人股价的颓势。2008年2月8日收盘价为10.39美元。巨人高价发行,一下子套牢了精于股票投资的美国人。个别美国投资者压抑不住被套牢的沮丧,干脆起诉巨人网络披露信息不完整,让史玉柱备受压力。

      IT精英刘韧11月1日没睡觉,在高位抢先吃进了大量巨人股份,也后悔不已。或许史玉柱曾经说过的一句话很值得美国股民和中国IT精英谨记:“我觉得最大的挑战不在于能不能发现机遇和把握机遇,最大的挑战是他能不能抵挡诱惑”?遗憾的是,恐怕连史玉柱自己也没有守住以血的教训换来的经验,在巨大的利益面前,商人的本能让他提高了发行价。

      阿里巴巴董事会主席马云则显得淡定自如。在香港、美国等地路演成功后,投行建议把阿里巴巴发行价定在20港元以上,马云依然把发行价圈定在13.5港元。首日开盘价即为30港元,收盘39港元,暴涨192.59%。上市两月来最高价达41.80港元,成为港股“新股王”。可是,受美国股市持续低迷拖累,阿里巴巴(1688.HK)也未能独善其身,最低价至16.34港元。2008年2月8日,阿里巴巴收市报19.58港元。但是阿里巴巴的下滑被各大机构认为是暂时的,花旗、高盛、德信等国际大投行依然维持其目标价锁定在30港元以上。马云当初的一念之仁收获了平和。马云的逻辑是,可以把价格定高,公司可以多筹集10亿美元,但是这样做有点竭泽而渔。一如阿里巴巴崇尚与客户和员工的分享,与投资者分享红利是其一贯价值取向的延续而已。

      看上去,是马云的一念之仁,克制住了商人逐利的本性,避免了跌破发行价的尴尬。实际上一念之差的背后却有着不寻常的故事。

      史玉柱从来不准备做公众的玩偶,他执意要做他自己。商人只要有利便可起早。多募集资金,多兑现一些创业的盈余,无可厚非。巨人垮过一回,没有得到过什么怜悯。面对那些投机者,史玉柱不须承担责任。股市定价是市场对创业者价值的认同。这不是创业者的主观意向起作用,而是市场的综合判断。作为创业者,当市场机会给了你可以赚取更多的钱,可以一次性兑现更多价值,可以融到更多以后发展的资金,何乐而不为呢?

      史玉柱坦言,“商业是什么?商业的本质就是在法律法规许可范围内获取最大利益,我是一个商人,做的事情就是在不危害社会的前提下为企业赚取更多利润。要一个商人又要赚钱又要宣扬道德,那不是商人,而是慈善家”。在史玉柱眼里,商人过多地讲道德和慈悲,只能导致人格分裂。史玉柱不干违法的事,承诺的东西,也从来不躲避。2004年,史玉柱借助脑白金赚取的利润,主动偿还了巨人大厦的欠债2.5亿元,换回了巨大的商誉。

      马云的商业观与史玉柱有着明显的区别。他立志要改变全球几十亿人的生活。阿里巴巴的企业愿景是“让天底下没有难做的生意”。

      马云善于说朴实的白话:“真想赚钱需把钱看轻”,“财富的本意是帮助他人赚钱”,“如果不让别人富起来,阿里巴巴会是一个虚幻的东西”,“研究对手就是往后看,只有研究明天、研究自己才是往前看”,“管理一家公司不需要股权而需要智慧”,等等。这些体现马云商业价值观的大白话,都已经在阿里巴巴的公司运作中体现出来。

      历史教训告诉史玉柱股权不能分散,所以巨人网络公司上市,史玉柱持有了68.43%的股权。为了满足上市股权分散的需要,上市前他把女儿持有的1000万股,作价10美元一股卖给了六大投行。马云却只持有阿里巴巴7%的股权,而阿里巴巴65%的员工持有股权,阿里巴巴B2B上市以后,1000多名员工一下子成了白万富翁。马云认为,中国太多企业因为强调控股权与控制权,而最终陷入利益争斗,影响了公司发展。管理和控制一家公司更需要智慧。

      两相比较,马云的商业观和成就得到了世界商界的认可。史、马均为2007年风云人物,但是马云入选美国《商业周刊》20名2007年最佳领袖和2008年24位对世界未来商业、财政和经济有着重大影响力的风云人物榜单。而史玉柱则毫无斩获。可以说,正是马云的一念之仁与史玉柱的商人本性,造成了两大公司股票走势曲线大致相同,但实际却冰火两重天的结局。

    原始出处:《上海证券报》

    2/13/2008

    OpenAL & OpenGL

     

    OpenAL是款多平台,功能及其强大的制作3D音场的API。

    OpenGL,有名了,这里就不介绍了

    以下是学习笔记:

    1. 载入WAV文件,播放/暂停/停止等控制的代码 [openAL]

    2. openGL实现2D人物移动、跳跃和攻击动画 [openGL]

    3. 一个Keyframe system实现了插入关键帧,以及smooth关键帧之间轨迹的操作 [openGL]

    4. 简单飞行游戏,包括简易物理引擎,碰撞系统等 [openGL]

    OpenAL学习笔记1:载入WAV文件,播放/停止/暂停等功能控制代码

    /**********************************************
    *Explanation    1:Since we use printf, we MUST
    *                include stdio.h to use this
    *                function
    *
    ************************************************/

    #include <conio.h>
    #include <stdlib.h>
    #include <stdio.h>           
    #include <al/al.h>
    #include <al/alc.h>      
    #include <al/alut.h>       //Added by TheCell
                                

    /*
    * These are OpenAL "names" (or "objects"). They store and id of a buffer
    * or a source object. Generally you would expect to see the implementation
    * use values that scale up from '1', but don't count on it. The spec does
    * not make this mandatory (as it is OpenGL). The id's can easily be memory
    * pointers as well. It will depend on the implementation.
    */

    // Buffers to hold sound data.
    ALuint Buffer;

    // Sources are points of emitting sound.
    ALuint Source;

    /*
    * These are 3D cartesian vector coordinates. A structure or class would be
    * a more flexible of handling these, but for the sake of simplicity we will
    * just leave it as is.
    */

    // Position of the source sound.
    ALfloat SourcePos[] = { 0.0, 0.0, 0.0 };

    // Velocity of the source sound.
    ALfloat SourceVel[] = { 0.0, 0.0, 0.0 };

    // Position of the Listener.
    ALfloat ListenerPos[] = { 0.0, 0.0, 0.0 };

    // Velocity of the Listener.
    ALfloat ListenerVel[] = { 0.0, 0.0, 0.0 };

    // Orientation of the Listener. (first 3 elements are "at", second 3 are "up")
    // Also note that these should be units of '1'.
    ALfloat ListenerOri[] = { 0.0, 0.0, -1.0,  0.0, 1.0, 0.0 };

    /*
    * ALboolean LoadALData()
    *
    *    This function will load our sample data from the disk using the Alut
    *    utility and send the data into OpenAL as a buffer. A source is then
    *    also created to play that buffer.
    */
    ALboolean LoadALData()
    {
        // Variables to load into.

        ALenum format;
        ALsizei size;
        ALvoid* data;
        ALsizei freq;
        ALboolean loop;

        // Load wav data into a buffer.

        alGenBuffers(1, &Buffer);

        if(alGetError() != AL_NO_ERROR)
            return AL_FALSE;

        alutLoadWAVFile("wavdata/FancyPants.wav", &format, &data, &size, &freq, &loop);
        alBufferData(Buffer, format, data, size, freq);
        alutUnloadWAV(format, data, size, freq);

        // Bind the buffer with the source.

        alGenSources(1, &Source);

        if(alGetError() != AL_NO_ERROR)
            return AL_FALSE;

        alSourcei (Source, AL_BUFFER,   Buffer   );
        alSourcef (Source, AL_PITCH,    1.0      );
        alSourcef (Source, AL_GAIN,     1.0      );
        alSourcefv(Source, AL_POSITION, SourcePos);
        alSourcefv(Source, AL_VELOCITY, SourceVel);
        alSourcei (Source, AL_LOOPING,  loop     );

       // Do another error check and return.

        if(alGetError() == AL_NO_ERROR)
            return AL_TRUE;

        return AL_FALSE;
    }

    /*
    * void SetListenerValues()
    *
    *    We already defined certain values for the Listener, but we need
    *    to tell OpenAL to use that data. This function does just that.
    */
    void SetListenerValues()
    {
        alListenerfv(AL_POSITION,    ListenerPos);
        alListenerfv(AL_VELOCITY,    ListenerVel);
        alListenerfv(AL_ORIENTATION, ListenerOri);
    }

    /*
    * void KillALData()
    *
    *    We have allocated memory for our buffers and sources which needs
    *    to be returned to the system. This function frees that memory.
    */
    void KillALData()
    {
        alDeleteBuffers(1, &Buffer);
        alDeleteSources(1, &Source);
        alutExit();
    }

    int main(int argc, char *argv[])
    {
        printf("MindCode's OpenAL Lesson 1: Single Static Source\n\n");
        printf("Controls:\n");
        printf("p) Play\n");
        printf("s) Stop\n");
        printf("h) Hold (pause)\n");
        printf("q) Quit\n\n");

        // Initialize OpenAL and clear the error bit.

        alutInit(NULL, 0);
        alGetError();

       // Load the wav data.

        if(LoadALData() == AL_FALSE)
        {
            printf("Error loading data.");
            return 0;
        }

        SetListenerValues();

        // Setup an exit procedure.

        atexit(KillALData);

        // Loop.

        ALubyte c = ' ';

        while(c != 'q')
        {
            c = getche();

            switch(c)
            {
               // Pressing 'p' will begin playing the sample.

                case 'p': alSourcePlay(Source); break;

               // Pressing 's' will stop the sample from playing.

                case 's': alSourceStop(Source); break;

                // Pressing 'h' will pause the sample.

                case 'h': alSourcePause(Source); break;
            };

        }

        return 0;
    }

    2/6/2008

    08本命年了

    节前2个星期,和9年没见的初中同学见面了,聊了几个小时的天,呵呵,变化真大啊。。。

    年30,和家里人聊天,和我妈吵了会,抛出了我的想法。她明显是不能接受的。。。哎。。。做IT的不像卖房子,特别是做游戏的,能不玩游戏吗?如果按照老路走,肯定是没前途的。。。我不能再在事关自己前途的事情上有一丝的妥协了,自己觉得该怎么做就应该怎么做,没有任何人能改变我的想法。

    后来,MSN遇到了钱MM,她一个人在迪拜吃的年夜饭,很惨,什么东西都被偷了(除了护照和行李),也不知道怎么安慰她。。。有的时候想想,人这种生物真是有意思,只能在逆境中才能成长,相信她肯定能很顺利的度过难关的,毕竟她是初中里第一个在国外工作的人。

    最后,要想想自己的事了。。。

    这学期的难度真得很大,而且很多东西都要独挑大梁,有的时候想想,真TMD想买机票就彻底回去了。。。不过。。。从小开始就一路失败上来,既然挺过了以前最艰难的时间,现在的事情真的不算什么,虽然心里没底,不过不到最后一秒是不能有松懈的。

    呵呵,08还是我的本命年呢,爱怎么样就怎么样吧,别人说要戴个红的,不过一直买不到,就算了,无所谓,老子偏偏不戴红,呵呵~

    2月25日前,我一定会精通OpenAL的代码,成为一个牛X的音轨师~