七月 23

需要的朋友请在下面留下你的邮箱,最早到的6位朋友,我将立即发送。

四月 22

先说一下本文档基于的安装环境:

Ubuntu 7.04 Feisty Fawn
Apache2 2.2.3
Python 2.5
Django 0.96

这里假设我们已经拥有了一个全新的Ubuntu 7.04 的 Server 版安装环境,下面分步讲解安装配置各模块过程:

  1. 安装Apache2和mod-python
    利用Ubuntu的apt-get安装二进制包非常方便,不过如果不是使用root用户的话,请使用sudo命令:sudo apt-get install apache2

    同时,安装mod-python模块:

    sudo apt-get install libapache2-mod-python

    启动apache2

    sudo /etc/init.d/apache2 start

    如果发现有这样的报错:
    Could not determine the server’s fully qualified domain name, using 127.0.0.1 for ServerName
    原因多半是因为没有配置ServerName:

    sudo vi /etc/apache2/apache2.conf

    打开apache2.conf文件,在末尾加入ServerName localhost,保存退出

    sudo /etc/init.d/apache2 restart

    重新引导启动apache2就可以了。具体可以参见此文章

  2. 安装Django最新版本的Ubuntu已经自带了Django的二进制包,不过,这里讲解如何从源码编译安装。
    Ubuntu已经缺省安装好了Python 2.5.1的rc0,所以这里无需再安装Python,不过,ez-setup.py并不是最新的,需要更新:

    cd /usr/src
    wget -c http://peak.telecommunity.com/dist/ez_setup.py
    sudo python ez_setup.py

    下载Django 0.96

    wget -c http://media.djangoproject.com/releases/0.96/Django-0.96.tar.gz
    tar zxvf Django-0.96.tar.gz
    cd Django-0.96
    sudo python setup.py install

    执行之后没有错误,表示Django已经安装完成。
    在Shell命令行中输入

    python (回车)

    >>>import django (回车)

    如果没有报错则表示django安装成功。

  3. 配置基础Django环境安装成功以后的Django实际文件存在于/usr/lib/python2.5/site-packages/django,我们将使用Django的django-admin.py(在django/bin目录中)来创建我们的Django项目,Django安装成功后,会自动在/usr/bin中建立一个django-admin.py的一个符号链接,所以无需指定路径就可以使用这个脚本文件了。

    创建项目djangotest,缺省apache2的文档根目录是/var/www:

    cd /var/www
    sudo python django-admin.py startproject djangotest

    这样会在/var/www下建立一个djangotest的目录,里面包含下面的几个文件:

    __inti__.py
    manage.py
    settings.py
    uls.py

    对于初始设置来说,并不需要更改这些文件,至于这些文件的具体用途,可以查阅相关的Django文档。
    这时已经可以启动Django自带的Web Server来测试是否创建成功了:

    sudo python manage.py runserver

    出现类似的提示表示启动成功:

    Validating models…
    0 errors found.

    Starting server on port 8000 with settings module ‘newtest.settings’.
    Go to http://127.0.0.1:8000/ for Django.
    Quit the server with CONTROL-C (Unix) or CTRL-BREAK (Windows).

    但是此Server只接受来自与本地的访问,所有外来的访问请求都不响应,所以只适合于本地开发用途,如果使用虚拟机或者有专门的机器来安装Django环境,则不能使用了,对于生产环境则更不适用,所以需要配置apache2以便和Django良好合作。

  4. 配置Apache2以便与Django一同工作配置/etc/apache2/site-available/default

    sudo vi /etc/apach2/site-available/default

    在<VirtualHost>中增加一个<Directory>段(Apache2的配置详见apache.org),内容如下:

    <Directory /var/www>
    SetHandler python-program
    PythonPath “[’/var/www’] + sys.path”
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE djangotest.settings
    PythonDebug On
    </Directory>

    这里有几点需要注意:
    1)PythonPath一定要声明在前,因为它的作用是要将我们的项目目录加入到sys.path中;
    2)PythonPath里面 [] 中的目录一定要是我们项目的上一级目录(搞不懂为什么是这样);
    3)SetEnv中那个settings的名字就是我们的项目名+.settings。

    上述配置完后,

    sudo /etc/init.d/apache2 restart

    重新启动apache2,无异常成功。

    在客户机上的浏览器中输入 http://服务器IP/djangotest,出现:

    It worked!
    Congratulations on your first Django-powered page.

    这样的提示页面,则表示Django安装成功!

一月 14

POCO: Plain old CLR object。请允许我这样称呼它,先占一个位置,若干随笔之后,我希望我能够整理出一篇有价值的文章。

一月 12

作为一个专业从事软件开发的程序员,经常面对的就是系统开发时各种各样的系统分析和对象模型的构建问题。我承认,至少到目前为止,我还没有在企业级的软件开发领域真正入门。

没有入门的原因就在于:当我面对那些企业级软件必然会涉及的分析、设计问题时,时常感觉到束手无策。幸而我有一个比较好的习惯:勤于思考。

最近,我的思考终于有了让我感到兴奋的成果,我在开发中所遇到的几个主要的系统设计问题,都一一在《企业应用架构模式》这本书里面得到了有益的提示。

呵呵,说起来惭愧,按说自己遇到困惑的问题在别人那里轻描淡写就提出来并给出了各种情况下的考虑建议,实在算不得什么“成果”。我真正兴奋的是我在遇到这些问题的时候所进行的思考与Fowler大师所提出的忠告十分契合,说明我目前找对了思考的方向,或者说我正在遇到企业级开发会遇到的各种大众化问题。我觉得我开始入门了。

这种兴奋感让我立马对之前已经买下,但是始终没有时间(或许是借口)去读的几本书产生了兴趣,《分析模式》《领域驱动开发》等等。能够站在大师的经验之上来思考问题,相信能够让我进步得更加快些。

十二月 25

使用类型化的DataSet时,DataAdapter.Fill()方法里面的TableName必须和生成类型化DataSet所使用的xsd文件中定义的一样。否则得不到数据。

例如:

在xsd文件中:

<?xml version=”1.0″ standalone=”yes”?>
<xs:schema id=”UserDepartRoleDataSet” xmlns=”" xmlns:codegen=”urn:schemas-microsoft-com:xml-msprop” xmlns:xs=”http://www.w3.org/2001/XMLSchema” xmlns:msdata=”urn:schemas-microsoft-com:xml-msdata”>
<xs:element name=”UserDepartRoleDataSet” msdata:IsDataSet=”true” msdata:Locale=”zh-CN”>
<xs:complexType>
<xs:choice maxOccurs=”unbounded”>
<xs:element name=”UserDepartRole“>
<xs:complexType>
<xs:sequence>
<xs:element name=”USERID” type=”xs:string” minOccurs=”0″ />
<xs:element name=”ROLEID” type=”xs:string” minOccurs=”0″ />
<xs:element name=”DEPARTID” type=”xs:string” codegen:nullValue=”" minOccurs=”0″ />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>

在调用时

UserDepartRoleDataSet ds = new UserDepartRoleDataSet();

adapter.Fill(ds, “UserDepartRole“);

必须注意这一点。

五月 17

MVP指的是Model-View-Presenter模式,由Martin Fowler提出。

MVP是MVC的师弟,模式结构不太相同,个人觉得是一种软件结构的进步 ,先姑且作个书签,待我在这次的项目中实践后再细细讲述我的应用经验。

大家可以先看看这两篇文章:

Martin Fowler的原文:
http://www.martinfowler.com/eaaDev/ModelViewPresenter.html

另外一篇中文文章:
http://www.agilelabs.cn/blogs/wind_tower/archive/2006/01/26/626.aspx

四月 30

现在软件分包真是方兴未艾,让我想起了多年前那场与“豆腐渣工程”的斗争,“严禁分包转包”成了建筑工程老板们需要谨记的重要法规。

项目层层分包的背后是利润的层层锐减,金字塔底部的项目真正实施者,很可能是这个利润瓜分运动中获利最少的人,毕竟项目来源掌握在人家手里,一个人在市场中的地位决定了他能够获得的利益,要想获得项目必须出让利润,这样的后果当然是项目资金的缺乏。

软件行业是一个人力密集、知识密集的行业,软件开发的成本大部分都是人力成本,资金的缺乏必然带来开发人员项目收入的减少,缺乏最直观的金钱刺激,人员的投入将很难保证。

人们喜欢关注建筑项目的层层分包带来的“豆腐渣”,那么软件领域的“豆腐渣”呢,软件分包不是不行,而是需要一个正常的市场秩序,只有保证了真正开发者的利益,项目的质量才有保证。

又想起楼上来做项目的哥们了,上次谈话才知道他们的公司也是层层分包进来参与我们项目的,不由得担心起我们的项目了。

四月 25

今天做了一次Phone Interview,有一些收获,赶紧总结。当然我是被测试者,至于面试的公司就不方便透露了哈。

首先是自己的英语水平,太差。我现在再不能将我自己的英文差归咎于大学教育了,毕竟那么多的人都可以学好。当面试官要求我全程英文回答时,说实话我是傻眼了,让我读写没有问题,“说”实在是心中的痛。唉,惭愧之极。

其次是技术细节的掌握不好。今天提到的问题,基本上都是我日常开发中一再用到,并且熟知的,但是一旦让我解释起来就感觉力不从心,话到嘴边却说不出了,究其原因其实就是对于技术的掌握还不那么透彻,对于细节还不那么了解,还有一些原因就是自己平时要求不严,很多名称概念都在混用乱用,唉,出现了张冠李戴的问题,不能用“紧张”来解释吧。

教训就这些,收获不能说不多,上次HR的Interview结束后我就说,应该时常参加一下高水平的面试,能够知道自己的问题在哪里,对于自己的进步实在是不错的促进,这可能就是考试的最大作用吧。

以后的任务应该明确了,首当其冲的应该是自己的英语,特别是口语,要想实现自己的理想目标,这一关必须过!其次是在平时的工作中注意技术的积累,必须夯实基础!基础,一再提到,基础是一切。切记切记。不能什么东西都不求甚解,对于知识的掌握必须准确!

四月 11

作技术工作已经好多年了,呵呵,其间每次遇到问题,总是会去Google搜索,基本上每次都可以从上面得到想要的答案,时间长了,总是会那些分享自己问题解决办法的人们抱着感激,同时也觉得有些许的愧疚,学习和分享应该是同等的。

不知是什么原因,分享的习惯始终没有形成,在工作中得到的许多新知都没有能够写下来,懒惰?不会,可能是心里面的自私心理作祟吧,我这个人始终还是不够Open。

需要改变了……

四月 07

这两天在学习的过程中遇到了一些莫名其妙的问题,所有的语言初学者应该都会去写那么无聊无趣的”Hello World!”程序吧,那么来看看我的第一个C++ Hello World:

#include 
int main()
{
cout << "Hello World!" << endl;
return 0;
}

保存为test.cpp。

按照我之前的记忆,这个简单的小程序肯定是没问题,我在Cygwin的命令行里面输入:

g++ test.cpp -o test

满以为……呵呵……结果却是

test.cpp: In function `int main()’:
test.cpp:5: error: `cout’ undeclared (first use this function)
test.cpp:5: error: (Each undeclared identifier is reported only once for each function it appears in.)
test.cpp:5: error: `endl’ undeclared (first use this function)

说cout和endl都没有定义!不可能!

我到网上一通乱找,翻来翻去,那些C++的教程全都和我一样,却没有提到我的错误,难道是我错了?是不是我的GCC装得有问题?

没辙了,后来我在gcc的include目录里面打开iostream文件来看才知道,里面使用了std的名字空间!如果上面的程序要想编译通过必须这样写:

#include 
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}

就没问题了。

我看了一下《C++ Primer》,里面第8章提到了std名字空间,原来标准C++所有的组件全部定义在这个名字空间下,如果要使用标准C++组件,就必须using它,Lippman先生给出的建议是在一个头文件里面统一引用所有要用的组件,这样就不用麻烦每次都写using语句了。

C++的世界已经不像我想象的那样了。