More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  TheOnly Visual SpacePhotosProfileFriendsBlog Tools Explore the Spaces community

Blog

February 21

春节电影

春节电影目录:
<<落叶归根>>
<<加勒比海盗2>>
<<搏击俱乐部>>
<< 博物馆奇妙之夜>>
<<爱情呼叫转移>>:
//www.tudou.com/search/playlist/?posto=%2Fsearch%2Fplaylist%2F&kw=%B0%AE%C7%E9%BA%F4%BD%D0%D7%AA%D2%C6&nav_search_target=0&comefrom=1&x=38&y=15
 
 
 
February 18

年度人物中最经典的一句话

政治家就象尿布,得勤换勤洗.

在上海过春节

  又到除夕了.
  今年过年没有回家,在上海过亲戚家过的年.
  以前小时候,最开心的时候就是拿红包了,今年应该是我拿红包了.看到小朋友们拿红包的开心样子,就想到了我小时候,心里还是蛮开心的.不过已经没有了小时侯对过年的那种向往,更多的是一种对亲情的依恋.也许只有人有了一定的社会责任感以后,才会更明白亲情的意义和家的意义.以前也许会说哪哪儿的年夜饭做得最好吃,不过现在觉得一家人吃饭的感觉是最重要的.
  两个弟弟在部队里面,或许更加想家.曾浩刚刚过了考核,张俊已经做了班长.听他们电话的时候发现已经成熟了很多.以前在拿压岁钱打游戏,放鞭炮的日子已经一回了,男孩子都慢慢变成男人.
  
  
January 06

Tracert 的代码

Source code of Tracert.
More information about ICMP protocol, please refer to the document of RFC.
 
--------------------------------------------------------------------------------------------------
General.h
#include <windows.h>
#ifdef __GENERAL_H__
#define __GENERAL_H__
// CRC Check Sum
extern USHORT ip_checksum(USHORT* buffer, int size);
// Read IP Address from Integer to String
void ReadIPAddress(unsigned long IPAddress);
#endif  // GENERAL_H
 
----------------------------------------------------------------------------------------------------
General.cpp

#include "General.h"
#include <stdio.h>

USHORT ip_checksum(USHORT* buffer, int size)
{
    unsigned long cksum = 0;
   
    // Sum all the words together, adding the final byte if size is odd
    while (size > 1) {
        cksum += *buffer++;
        size -= sizeof(USHORT);
    }
    if (size) {
        cksum += *(UCHAR*)buffer;
    }

    // Do a little shuffling
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);
   
    // Return the bitwise complement of the resulting mishmash
    return (USHORT)(~cksum);
}

void ReadIPAddress(unsigned long IPAddress)
{
    printf("%d.%d.%d.%d\n", UCHAR(IPAddress),
                                       UCHAR(IPAddress >> 8),
                                       UCHAR(IPAddress >> 16),
                                       UCHAR(IPAddress >> 24));
}

----------------------------------------------------------------------------------------------------------

ICMP.h

#include <windows.h>
#ifndef __ICMP_H__
#define __ICMP_H__

#define ICMP_ECHO 8               // Echo ICMP Packet
#define ICMP_REPLAY 0             // Replay ICMP Packet
#define MAX_DATA_SIZE 1024         
#define ICMP_MIN 8                
#define ICMP_TIMEOUT 11           // Time out ICMP Packet
#define DEFAULT_ICMP_SIZE 44      // The Default ICMP Packet Size

#pragma pack(1)
typedef struct tagICMPHeader
{
    UCHAR type;
    UCHAR code;
    USHORT checkSum;
    USHORT ID;
    USHORT SeqNumber;
}ICMPHeader, *PICMPHeader;
#pragma pack()

#pragma pack(1)
typedef struct tagIPHeader
{
    BYTE h_len:4;
    BYTE version:4;
    BYTE tos;
    USHORT total_len;
    USHORT ID;
    USHORT flags;
    BYTE ttl;
    BYTE proto;
    USHORT checksum;
    ULONG source_ip;
    ULONG dest_ip;
}IPHeader, *PIPHeader;
#pragma pack()

#endif  // ICMP_H

-------------------------------------------------------------------------------------------------------

Tracert.h

#include "ICMP.H"
#include "General.h"
#include <iostream>
using namespace std;

#ifndef __TRACERT_H__
#define __TRACERT_H__

#define TRACERT_DATA_PART_SIZE (DEFAULT_ICMP_SIZE - sizeof(ICMPHeader))
#pragma pack(1)
typedef struct tagTracertPacket
{
    ICMPHeader icmp_header;
    BYTE data_part[TRACERT_DATA_PART_SIZE];
}TracertPacket, *PTracertPacket;
#pragma pack()

class Tracert
{
public:
    Tracert();
    ~Tracert();
    BOOL StartClient();

private:
    void PackTracertPacket(TracertPacket& tracert_packet);
    int UnPackTracertPacketPacket();
    int Configuration();
    int ReceivePacket();
    int SendPacket();
    DWORD InitializeConnection();
    int UnitializeConnection();
    int DecodeTracertPacket(const IPHeader& ip_header, const int recvPacketLen);
    friend USHORT ip_checksum(USHORT* buffer, int size);
    friend void ReadIPAddress(unsigned long IPAddress);

private:
    SOCKET sock;
    sockaddr_in dest;
    sockaddr_in source;
};

#endif  // TRACERT_H

 
-------------------------------------------------------------------------------------------------------
Tracert.cpp

#define  WIN32_LEAN_AND_MEAN
#include <winsock2.h>                     //Need the support of WinSock2
#include <ws2tcpip.h>                     //When setting the level of IPPROTO_IP                                        
#include "Tracert.h"           
#define TRANSFER_OVER 0x05      
static const TCHAR* DEFAULT_ADDRESS = TEXT("220.181.18.155");   // BaiDu Address
static const int TIMEOUT = 1000;                               // 1 second
Tracert::Tracert()
{
    InitializeConnection();
}
 
Tracert::~Tracert()
{
    UnitializeConnection();
}
 
int Tracert::Configuration()
{
    int ttl = TIMEOUT;
 
    if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const char*)&ttl,
            sizeof(ttl)) == SOCKET_ERROR)
    {
        cout << "Error in Configuration, error code:" <<  GetLastError() << endl;
        return GetLastError();
    }
    memset(&dest, 0, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr(DEFAULT_ADDRESS);
    return 0;
}
 
int Tracert::SendPacket()
{
    static int livetime = 1;
    int retValue=setsockopt(sock,IPPROTO_IP,IP_TTL,(char *)&livetime,sizeof(int));
    if (retValue < 0)
    {
        cout << "Error in Set Tracert Packet Time, error code" << GetLastError() << endl;
        return GetLastError();
    }
    else
    {
        livetime++;
    }
    TracertPacket tracert_packet;
    PackTracertPacket(tracert_packet);
    retValue = sendto(sock,                          // Socket
                      (const char*)&tracert_packet,  // Buffer
                      sizeof(tracert_packet)
                      0,                             // Flag
                      (const sockaddr*)&dest,        // The Pointer to Socket Address
                      sizeof(dest));                 // Size of Socket Address
    if (retValue < 0)
    {
        cout << "Error in send Packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    return 0;
}
 
int Tracert::ReceivePacket()
{
    // effetive will be worse?
    IPHeader* recv_buf = (IPHeader*)new TCHAR[MAX_DATA_SIZE];
    if (recv_buf == NULL)
    {
        return GetLastError();
    }
    int fromlen = sizeof(source);
    int retValue = recvfrom(sock,
                            (char*)recv_buf,
                            MAX_DATA_SIZE,
                            0,
                            (sockaddr*)&source,
                            &fromlen);
    if (retValue < 0)
    {
        cout << "Error in receive packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    else
    {
        // Decode ping packet
        retValue = DecodeTracertPacket(*recv_buf, retValue);
    }
    delete []recv_buf;
    recv_buf = NULL;
    return retValue;
}
 
void Tracert::PackTracertPacket(TracertPacket &tracert_packet)
{
    //static USHORT ID = 1;
    static USHORT SeqNumber = 1;
    tracert_packet.icmp_header.type = ICMP_ECHO;
    tracert_packet.icmp_header.code = 0;
    tracert_packet.icmp_header.checkSum = 0;
    tracert_packet.icmp_header.ID = (USHORT)GetCurrentProcessId();
    tracert_packet.icmp_header.SeqNumber = SeqNumber++;
    memset(tracert_packet.data_part, 'E', TRACERT_DATA_PART_SIZE);
    tracert_packet.icmp_header.checkSum = ip_checksum((USHORT*)&tracert_packet, sizeof(tracert_packet));
}
 
int Tracert::DecodeTracertPacket(const IPHeader &ip_header, const int recvPacketLen)
{
    USHORT ipheader_len = ip_header.h_len * 4;
    if (recvPacketLen < ipheader_len + ICMP_MIN)
    {
        // Packet is too small
        cout << "Receive packet is too small" << endl;
        return -1;
    }
   
    TracertPacket *tracertpacket = (TracertPacket*)((char*)&ip_header + ipheader_len);
    if (tracertpacket == NULL)
    {
        cout << "ICMP Header is NULL" << endl;
        return -1;
    }
 
    if (tracertpacket->icmp_header.type == ICMP_TIMEOUT && tracertpacket->icmp_header.code == 0)
    {
        //cout << "Reply Packet" << endl;
        //cout << "time:" << int (GetTickCount() - pingpacket->dwTime) << endl;
        cout << "Route Address:";
        ReadIPAddress(ip_header.source_ip);
    }
   
    if(tracertpacket->icmp_header.type==ICMP_REPLAY &&
       tracertpacket->icmp_header.ID==GetCurrentProcessId())
    {
        //printf("%2d:        %-15s       %4dms\n",icmpcount++,
        //       inet_ntoa(from->sin_addr),tick-cStartTickCount);
        cout << "Route Address:";
        ReadIPAddress(ip_header.source_ip);
        printf("Trace complete!\n");
        return TRANSFER_OVER;
    }
    return 0;
}
 
BOOL Tracert::StartClient()
{
    int flag = 0;
    while(true)
    {
        if (SendPacket())
        {
            return FALSE;
        }
        flag = ReceivePacket();
        if (flag == TRANSFER_OVER)
        {
            return TRUE;
        }
        else if (flag)
        {
            return FALSE;
        }
        Sleep(1000);
    }
    return TRUE;
}
 
DWORD Tracert::InitializeConnection()
{
    cout << "+Initialize Connection!" << endl;
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
    {
        cout << "Startup error!" << endl;
        return GetLastError();
    }
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (sock < 0)
    {
        cout << "Create socket error!" << endl;
        return GetLastError();
    }
    if (Configuration())
    {
        return GetLastError();
    }
    cout << "-Initialize Connection!" << endl;
    return 0;
}
 
int Tracert::UnitializeConnection()
{
    WSACleanup();
    closesocket(sock);
    cout << "Unitialize Connection!" << endl;
    return 0;
}
 
int Tracert::UnPackTracertPacketPacket()
{
    return 0;
}
-------------------------------------------------------------------------------------------------------------
main.cpp
 
#include "Tracert.h"
int main()
{
    Tracert tracert_Program;
    tracert_Program.StartClient();
    return 0;
}

Ping的代码

 
Source code of Ping Program. 
Have not test complete yet, more information about Ping and ICMP protocol, please refer to
related website.
 
Please link library WS2_32.LIB at first.
 
// ICMP.h
#include <windows.h>
#ifndef __ICMP_H__
#define __ICMP_H__

#define ICMP_ECHO 8
#define ICMP_REPLAY 0
#define MAX_DATA_SIZE 32
#define ICMP_MIN 8
#pragma pack(1)
typedef struct tagICMPHeader
{
    UCHAR type;
    UCHAR code;
    USHORT checkSum;
    USHORT ID;
    USHORT SeqNumber;
}ICMPHeader, *PICMPHeader;
#pragma pack()
#pragma pack(1)
typedef struct tagIPHeader
{
    BYTE h_len:4;
    BYTE version:4;
    BYTE tos;
    USHORT total_len;
    USHORT ID;
    USHORT flags;
    BYTE ttl;
    BYTE proto;
    USHORT checksum;
    ULONG source_ip;
    ULONG dest_ip;
}IPHeader, *PIPHeader;
#pragma pack()
#endif  // ICMP_H
 
// Ping.h
#include "ICMP.H"
#include <iostream>
using namespace std;
#ifndef __PING_H__
#define __PING_H__
#pragma pack(1)
typedef struct tagPingPacket
{
    ICMPHeader icmp_header;
    DWORD dwTime;
}PingPacket, *PPingPacket;
#pragma pack()
class Ping
{
public:
    Ping();
    ~Ping();
    BOOL StartClient();
 
private:
    void PackPingPacket(PingPacket& ping_packet);
    int UnPackPingPacket();
    int Configuration();
    int ReceivePacket();
    int SendPacket();
    DWORD InitializeConnection();
    int UnitializeConnection();
    DecodePingPacket(const IPHeader& ip_header, const int recvPacketLen);
    friend USHORT ip_checksum(USHORT* buffer, int size);
    friend void ReadIPAddress(unsigned long IPAddress);
private:
    SOCKET sock;
    sockaddr_in dest;
    sockaddr_in source;
};
#endif  // PING_H
 
PING.cpp
#include "PING.H"
const TCHAR* DEFAULT_ADDRESS = TEXT("220.181.27.48");   // LocalHost
const int TIMEOUT = 1000;                                // 1 second
Ping::Ping()
{
    InitializeConnection();
}
Ping::~Ping()
{
    UnitializeConnection();
}
BOOL Ping::StartClient()
{
    while(true)
    {
        if (SendPacket())
        {
             return FALSE;
        }
        if (ReceivePacket())
        {
            return FALSE;
        }
        Sleep(1000);
    }
    return TRUE;
}
 
DWORD Ping::InitializeConnection()
{
    cout << "Initialize Connection!" << endl;
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
    {
        cout << "Startup error!" << endl;
        return GetLastError();
    }
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (sock < 0)
    {
        cout << "Create socket error!" << endl;
        return GetLastError();
    }
 
    if (Configuration())
    {
        return GetLastError();
    }
 
    return 0;
}
 
int Ping::Configuration()
{
    int ttl = TIMEOUT;
 
    if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const char*)&ttl, sizeof(ttl)) == SOCKET_ERROR)
    {
        cout << "Error in Configuration, error code:" <<  GetLastError() << endl;
        return GetLastError();
    }
 
    memset(&dest, 0, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr(DEFAULT_ADDRESS);
    return 0;
}
 
int Ping::UnitializeConnection()
{
    WSACleanup();
    closesocket(sock);
    cout << "Unitialize Connection!" << endl;
    return 0;
}
 
void Ping::PackPingPacket(PingPacket& ping_packet)
{
    static USHORT ID = 1;
    static USHORT SeqNumber = 1;
    ping_packet.icmp_header.type = ICMP_ECHO;
    ping_packet.icmp_header.code = 0;
    ping_packet.icmp_header.checkSum = 0;
    ping_packet.icmp_header.ID = ID++;
    ping_packet.icmp_header.SeqNumber = SeqNumber++;
    ping_packet.dwTime = GetTickCount();
    ping_packet.icmp_header.checkSum = ip_checksum((USHORT*)&ping_packet, sizeof(ping_packet));
}
 
int Ping::UnPackPingPacket()
{
    return 0;
}
 
int Ping::SendPacket()
{
    PingPacket ping_packet;
    PackPingPacket(ping_packet);
    int retValue = sendto(sock,                                  // Socket
                                 (const char*)&ping_packet,    // Buffer
                                 sizeof(ping_packet),
                                 0,                                       // Flag
                                 (const sockaddr*)&dest,        // The Pointer to Socket Address 
                                 sizeof(dest));                       // Size of Socket Address
    if (retValue < 0)
    {
        cout << "Error in send Packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    return 0;
}
 
int Ping::ReceivePacket()
{
    // effetive will be worse?
    IPHeader* recv_buf = (IPHeader*)new TCHAR[MAX_DATA_SIZE];
    if (recv_buf == NULL)
    {
        return GetLastError();
    }
    int fromlen = sizeof(source);
    int retValue = recvfrom(sock,
                                    (char*)recv_buf,
                                    MAX_DATA_SIZE, 
                                    0,
                                    (sockaddr*)&source,
                                    &fromlen);
    if (retValue < 0)
    {
        cout << "Error in receive packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    else
    {
        // Decode ping packet
        DecodePingPacket(*recv_buf, retValue);
    }
    delete []recv_buf;
    recv_buf = NULL;
    return 0;
}
 
USHORT ip_checksum(USHORT* buffer, int size)
{
    unsigned long cksum = 0;
   
    // Sum all the words together, adding the final byte if size is odd
    while (size > 1) {
        cksum += *buffer++;
        size -= sizeof(USHORT);
    }
    if (size) {
        cksum += *(UCHAR*)buffer;
    }
 
    // Do a little shuffling
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);
   
    // Return the bitwise complement of the resulting mishmash
    return (USHORT)(~cksum);
}
 
void ReadIPAddress(unsigned long IPAddress)
{
    printf("%d.%d.%d.%d\n", UCHAR(IPAddress),
                                       UCHAR(IPAddress >> 8),
                                       UCHAR(IPAddress >> 16),
                                       UCHAR(IPAddress >> 24));
}
 
int Ping::DecodePingPacket(const IPHeader& ip_header, const int recvPacketLen)
{
    cout << "IPHeader->source_ip:";
    ReadIPAddress(ip_header.source_ip);
    printf("IPHeader->total_len: %d\r\n", ip_header.total_len);
    printf("IPHeader->tos: %d\r\n", ip_header.tos);
    printf("IPHeader->ID:%d\r\n", ip_header.ID);
    printf("IPheader->ttl:%d\r\n", ip_header.ttl);
    USHORT ipheader_len = ip_header.h_len * 4;
 
    if (recvPacketLen < ipheader_len + ICMP_MIN)
    {
        // Packet is too small
        cout << "Receive packet is too small" << endl;
        return -1;
    }
   
    PingPacket *pingpacket = (PingPacket*)((char*)&ip_header + ipheader_len);
    if (pingpacket == NULL)
    {
        cout << "ICMP Header is NULL" << endl;
        return -1;
    }
 
    if (pingpacket->icmp_header.type == ICMP_REPLAY)
    {
        cout << "Reply Packet" << endl;
        cout << "time:" << int (GetTickCount() - pingpacket->dwTime) << endl;
    }
   
    return 0;
}
 
main.cpp
#include "PING.H"
int main()
{
    Ping myping;
    if (myping.StartClient())
    {
        cout << "Ping Machine Successfully!" << endl;
    }
    else
    {
         cout << "Ping Machine Error!" << endl;
    }
    return 0;
}
 

篮球

  岁月如梭.
  已经半年没有碰篮球了, 想想当年在软件学院也是打组织后卫的.  现在一上球场已经两腿发麻了, 多蹦几下就有抽筋的感觉.
  皑皑, 以前偶尔也能小飞一下,现在纯粹是擦着地板打球. 估计跳得就只有一块肥皂那么高.
  不过理论倒是一点没拉下, 周末必看NBA.  看看孙伟平指导那解说,真叫一专业,每次都能说到点子上: miss match, side-in-out.
  真很过瘾.
 呵呵,祝大家有个愉快的周末.
 
November 29

百度音乐怎么做的啊

  以前没觉得, 突然发现百度音乐真是做得牛B啊.
  不知道大家注意到这个细节没有, 百度音乐的歌词和音乐是同步的. 歌手每唱一句,就会显示相应的歌词.
  有谁知道大概原理,赐教.
November 27

浮躁的人啊

  卖盗版光盘的就是搞IT的,
  写点BLOG的就是文艺青年,
  ...
  用记事本连个hello,world都写不出来,还在谈什么struts, JVM.
  连个三步上篮就不会,就笑人家邓肯的罚球,妈妈的.
  摆脱,我已经是菜鸟了,你丫撑死就一菜虫.
 
  
November 20

怀念下以前的时光

小时侯其实蛮喜欢画画的, 不过现在估计连最最基本的铅笔素描也不会了.  不过小时候喜欢和隔壁邻居玩一种游戏,就是拿出一大张纸,然后每个人半小时画各种各样的太空军舰啊什么的.然后开始"石头,剪子,布", 用自己的"战舰"把对方的毁掉.类似于"太平天国"那种玩法吧,但最富激情的是"构造"自己的舰队的时候.而最伤心的时刻是自己的舰队被人家毁掉.皑皑, 真怀念童年的那段时光啊.
 
后来上了小学, 就是在动画片中度过的. "圣斗士"估计影响了一代人, 呵呵,我最喜欢一辉了.其实,现在的漫画有很难超越它的了,至少从叙事模式上来说很难突破了.
 
再后来就是初中了, 就是在"灌篮高手"和"ps足球"当中度过了. 嘿嘿,ps足球到现在我已经玩了十年了. 不知道ps3的足球是什么样子的呢?而"灌篮高手"也造就了一帮爱耍cool的小男生, 自从那部动画片播出以后, 我猛然发现很多男生背个包,留着"流川枫"式发型,一脸没表情的样子.
 
最后就是高中了, 每天都在疯打篮球,不过水平和身高没见长. 对了,从那时候开始喜欢听周杰伦的歌.
 
 
October 29

到目前为止见过的牛儿们

   一. 老牛在初学c++时候, 一晚上写出Othell.
   二. 一师哥写的汇编语言IDE,不过编译器是用别人的.
   三. 一天实现一个网络协议.(保密)
   四. 用c写设计模式.(保密)
   五. 朱朱写的英语智能输入法.
   六. 老张web中的"我的电脑"

人的潜能无限啊

  今天晚上看中央2的节目<<交换空间>>.
  节目内容是:
  两家人分为蓝,红两队, 蓝队去红队家, 红队去蓝队家. 干什么呢?央视分别给每队8k和一个设计师,要求在48小时内按对方要求, 给对方家里重新设计一下房子. 两家人的房子就是你要做的平台, 8k就是给你的预算, 48小时是项目周期, 而人员就是两队人员和设计师.  如果大家对装修有个基本概念的话,是知道8k基本上是什么也干不了的,何况是在48小时以内呢?
  不过看完这期节目后,真是让我体会到了人在里面的作用了! 特别是设计师在里面的关键作用, 尤其是蓝队的设计师, 几乎把一个平淡无奇的家装修成了一个浪漫满屋.  增加了浮雕墙, 工作台, 吧台, 以前的传统玄关经过改造, 给客厅融入了典雅和温馨两种风格, 特别是在一些小细节的处理上.因为我对装修的专业术语确实不懂, 只能说到这里了, 反正给我的那种震撼! 而设计师虽然只是个25,6的女孩子, 但却拥有8年的设计经验. 皑皑,真是不得不服.
  嘿嘿, 大家以后可以看看那个节目,真的蛮不错的.
  48小时,8k, 人的潜能真是无限.....
October 07

公司里面写程序和大学里面写程序的区别

我写的程序不多,也才刚刚踏出校门,不过还是可以感觉到学校里面写程序和公司里面写程序的区别:
罗列几点吧.
一.公司注重文档, 虽然我到目前为止文档还是写得很烂,就跟我的space一样,不过我还是不得不承认文档的重要性.因为当你看人家程序时,特别是很多很多程序时,是不要试图一下子就看懂的.所以对于对整个项目熟悉的人,文档就好象说明书一样,至少要把文件和目录的组织结构说清楚,命名规范是什么,算法是什么;而对于不清楚这个项目的人,至少要让别人看了你的文档知道你做的是什么;这里面还有很多学问的.而在学校,因为我没有经过研究生阶段的学习,所以还不知道论文怎么写.
二.学校资源更加丰富,可以用各种各样新的东西,比如eclipse新的版本,而由于中国制造业的发达,可以用很多盗版软件; 在公司一般是用正版和开源免费的东西.
三.学校会尝试很多新的和尖端技术的使用, 而公司则是更注重细节和基础.例如,学校会告诉你说AVL树是怎样保持平衡的,复杂度如何;而公司则会让你写出一个AVL树来.
四.学校学的东西其实如果都学透了,到公司就是大大牛了.
 
 
October 04

要做就做艺术品

  最恶心那些流氓软件了, 最恶心 <<20天学会java>>, 或者是 <<精通c++>>之类的书了.
  虽然说软件也是一种工业, 不过它确是集成了数学, 工程学,美学, 心理学的一门工业.  看看sony的实况足球, 苹果的iPod系列, 其实都是艺术品, 而最恶心的那些简直就是对艺术的一种亵渎.
  不要以为在数码城卖盗版光盘的就是做IT的,  就象出说自己出几本写真集的就说自己是搞文学一样, 鸟人!!
  艺术是需要时间的磨砺和天才的雕刻的, 所以我等凡人连个操作系统都写不出来的,只是侯sir说的"IT工厂的男男女女"而已了.  不过我们是可以给天才的艺术家们打杂的, 所以软件工程师也就诞生了. 
   皑皑,不说这个话题了.
   说说我心目中的天才吧,各个行业的.
   达.芬奇, 爱因斯坦, 诸葛亮,  梁朝伟, 周杰伦, 邓肯, 肥罗, Tanenbaum.
   不说了.   

我的女朋友

  是的,  我很爱她.
  现在我和她是邻居,住得很近.
  成熟,纤细,美丽,我不会吝啬任何赞美之辞.
  我只是追求自己的幸福, 虽然我也害怕失去幸福.
  我和她都喜欢吃辣的东西, 一起吃的时候很开心.
  说完了.
 
June 28

写给未来

   明天就会坐上南下上海的火车,对天津这个城市有很多依赖。毕竟生活了四年,而且是由一个彻底的男孩象一个快“不彻底”的男孩的四年。这四年有很多东西我经历了,其实想起来也没有什么,无非就是失恋,恋爱,为兴趣而学习,明白了为什么要赚钱。也明白了看世界杯的快乐远远不如写程序所带来的满足感。但这些东西我相信对于一个男人来说还太幼稚,比我大五到十岁的男人具有什么样的素质呢和魅力呢?我当然是不知道的
June 06

怀念这四年

   我的大学生活快结束了,今天和同学玩了杀人游戏,学软件的同学一直比较忙,难得聚在一起,玩得很开心。
   怀念我中文系的同学,里面有我大学时期最好的哥们儿,那个广东人。前几天一起去烧烤,又见到熟悉的笑容。
   怀念我103的室友们,大一时候背古汉的日子至今难忘;一起出去喝酒,庆祝生日的日子更是难忘;还有关键时候挺身而出的兄弟,以后大家出去不要冲动,要懂得保护自己,我们还约好结婚的时候不管在哪儿都要去的啊。
   怀念413的室友们,大家一起做项目的辛苦日子记得。一起做汇编,一起做数据结构。。。这是我在大学里知识学得最多的时光,对日后的事业都打下了基础。以后大家还能在一起吃烤串该是多好啊。
   怀念大黄,怀念老张,两个已经去了上海的人,很喜欢你们的性格,呵呵。
   最怀念我的玫玫猪,在大学时光里面陪我度过了最幸福和快乐的时光。我有时候也许很象个孩子,不懂得关心你,其实我想让你明白我很爱你,只是有时候不懂得表达。我们一起吃饭,学习,一起happy,一起吵架,还经历好多不愉快和愉快的事情。你知道我是多么想你陪我去上海吗,我好想和你今生共相伴。希望你以后能成为我永远的另一半。
  皑皑,很多事情真是这样,失去了才知道珍惜。
May 29

《扑火》

   现在越来越喜欢更新space的歌曲,希望自己喜欢的歌与大家分享。《扑火》是陈小春《山鸡故事》里的主题曲,很喜欢高潮那段。呵呵,永远的赵山河,永远“罩得住”。
歌词如下:
爱上我你蠢不蠢最爱你我懂不懂雨伞里哪怕会扑空
直到双手酸疼方知怎叫艰苦的抱拥
就算不分轻重不管吉与凶
如能让我为你犯错宁愿没有做对过
悠长岁月平静无事亦是磋跎
值得的怎可错过要渡日如年
去跟你闪与躲宁愿扑火
要是我为你犯错能换十秒偷快渡过
为甚么不奋身扑火就像灯蛾
若灰烬不分你我但感情存在过
轮火和眼泪难划破
用我一手一脚争取一个珍惜的女人
就算单子拥抱终于都抱紧
如能让我为你犯错宁愿没有做对过
悠长岁月平静无事亦是磋跎值得的怎可错过要渡日如年
去跟你闪与躲宁愿扑火
要是我为你犯错能换十秒偷快渡过
为甚么不奋身扑火就像灯蛾
若灰烬不分你我但感情存在过
轮火和眼泪难划破
May 24

看了skater boy 的歌词

     Avril Lavinge 的《skater boy》说的是一个地痞小子,也就是那个skater boy了和一个成绩优秀、跳芭蕾的女生相恋。但是呢,她是pretty girl,是好学生,魄于舆论压力,就没有跟地痞小子好了。然后呢,5年过去了,她已经为人妻了,无非家看看小baby。无意中,她从电视上看到了skater boy,正在开演唱会之类的等等。有一句话特别经典:
"He wasn't good enough for her
Now he's a super star
Slamming on his guitar
Does your pretty face see what he's worth?"人家以前是小地痞,现在已经是超级巨星了。
所以Avril Lavinge在歌词中作出如此总结:"Sorry girl but you missed out"。对不起,女孩,你已经出局了。
May 23

中国和马刺输了,有点沮丧

     中国vs法国。法国确实很厉害啊,很有成年队那种细腻的意思。马刺的失败是起床后才知道的,阿根廷以后也没有飞的机会了。皑皑,今年的NBA没意思了。
May 19

在本部的快乐生活

      这个周三,周四,周五过得真是开心啊。
      周三晚上和玫玫一起去吃香辣虾,在海光寺那块儿,忘叫什么名字了,反正是二十四小时营业。普通的虾,有微辣,中辣,非常辣(好象是吧)。我们点了中辣,照顾她是北方mm了。虾的做法也有很多种,有什么极品虾,就是我们吃那种,一锅有三四十个不止。还有排骨虾,牛蛙虾什么的。本来想吃牛蛙那种的,不过玫玫说她不吃那东西。她吃东西有个习惯,只吃吃过的,不吃没吃过的,所以是个很传统的人。呵呵,接着说虾,虾吃起来很爽,是用辣椒爆吵的,很香,特别入味。锅的中间有菌汤,说是为了中和一下辛辣的东西,喝了几碗,确实很爽口。吃完了虾,可以把锅底(就是土豆,葱之类的东西)捞起来,然后免费换涮肉的汤继续吃,就是还可以点什么涮羊肉那一套东西。
      然后晚上就去看欧洲杯决赛了,巴萨vs阿森那。支持巴萨,因为喜欢曼联而讨厌阿森那。比赛很精彩,巴萨打了个绝地反击,2:1,干掉阿森那。很过瘾,特别两个进球,都让人感觉到了艺术足球的魅力。
     看球到天亮,已经到周四了。
     周四晚上和玫玫一起去吃饭,由于前一天吃了太多。于是决定买点水果降火。于是买了一个菠萝和一斤草莓。菠萝很好吃,草莓也不错,不过玫玫说不如她家的好吃,真是挑剔的孩子。当然,吃水果是吃不饱的,于是又去吃烤串,她学校外的烤羊排口感很不错,呵呵。然后又要了2块钱的山西煎饼,很香的。
     晚上又足球实战了一下,体验了一下PS2的实况10.比实况9更容易控制,更强调球员的个人能力,特别是速度。
     最后和徐迪配合一起踢杯赛。第一个是世界杯,三星难度(默认难度),我们选的是英格兰,除了决赛对巴西是2:0以外,其他都在5:0以上,甚至有一场是10:0,那叫一个过瘾啊。最后看技术统计,欧文进了18个球,鲁尼进了14个球,哈哈,简直是一群英格兰屠夫。后来踢欧洲杯,五星难度(最高难度),还是英格兰。不过这次不是屠夫了,成菜包子了,虽然第一场取得了3:0的胜利,不过还是被西班牙暗算了,小组赛没出线。不服,再来。那叫一个荡气回肠,虽然第一场以0:3失利,不过最后小组赛勉强出现后,以经典的98欧文式进球结束了法国队,挺进8强。虽然最后栽倒在捷克队202个那个koller手中,不过真正经历了比赛的快乐。虽然只是游戏,但一样有足球带来的那种感觉。
     玩球到天亮,已经是周五了。
     一觉醒来,已经是下午一点了。没干什么,晚上又和玫玫去吃饭。最开始准备去吃大盘鸡,那简直是食肉主义的天堂,不过人实在太多;后来又去金百万吃烤鸭,mmd,服务员还真把自己当金百万了,愤然离去;最后决定去东北一家人,久闻大名。虽然也等了很久,不过服务员态度不错,吃饭不就图个心情吗?呵呵。要了个草原排骨,水果沙拉,猪肉炖粉条。水果沙拉还不错,主要是很清爽的感觉。草原排骨热的时候还很好吃的,不过后来有点腻了。很难理解为什么玫玫喜欢吃猪肉炖粉条那么肥的东西,不过粉条还是很不错的。不过那个猪肉就跟我老妈做的四川红烧肉一样,恐怖。
    总结以下:快乐=吃+足球