Class types
Overview
Symbian平台的应用程序使用4种主要类型的类,下面是它们:
- 数值类,或者数值类型,名字以T开头。它们不包含任何外部对象,不管直接(指针)或者间接(句柄)。
- 堆分配类,名字以C开头。这样的类都是继承自CBase类。
- 资源类,名字以R开头。资源对象控制真实的资源。
- 接口类,名字以M开头。它们定义抽象的接口,有派生类来实现功能。
这些类型都和垃圾清理支持紧密相关。
Value types―T classes
数值类型是最基础的类型。它们是用T开头的类型或者类。
- T类型有自己的值。它们不包含任何外部对象,不管直接(指针)或者间接(句柄)。
- T类型可以分配空间在堆栈(C++自动变量)或者作为其他类的成员。
这些基础特征的后果,将在下面探索。
Constructor
许多T类型简单到不需要构造器。它们仍旧需要构造起来初始化成员数据。
Copy constructor and assignment operator
复制构造器(TX(const TX&))或者赋值运算符(TX& operator=(const TX&))是很少需要的。这个因为复制总是简单的,几乎总是简单的把源对象的成员复制到目的对象而已。这是编译器生成复制构造器和赋值运算符的时候的缺省行为。
当T类是一个模板类,而参数是一个整数长度而类也有成员的情况下,这些功能还是有用的。那么,复制或者赋值TX<32>到TX<40>的时候,就需要比简单的位复制更老练的机制,所以需要给复制构造器和赋值运算符进行编码。
Destructor
T类型没有C++析构器。因为没有必要,T类型没有任何外部资源需要释放。
Orphaning
T类型可以安全的在堆栈上面孤立。孤立的意思就是在不掉用析构器的情况下释放内存。因为T类型没有外部资源,所以当T类型孤立的时候,没有外部资源会变得无法访问。
Function arguments
T类型可以在作为传值和传址参数的情况下作为函数的参数。
Data members
T类型可以包含其他T类型。另外它们还可以包含R对象,或者是C对象的指针,作为对象的宿主,有义务维护对象的清除过程。在实际中,这种情况很少发生。
Built-in C++ types
所有的C++内建类型都符合T类的标准。内建类型都用typedef定义了以T开头的名字,例如TInt。
Standard class hierarchy―C classes and class CBase
Layout conventions
Overview
和命名习惯一样,Symbian有一种标准的代码布局方式。开发者和组织一般都有自己偏爱的习惯。下面的信息是为了帮助你更好的阅读Symbian平台的代码,即使你已经打算采用其他的布局方式。
Headers
- 尽量减少头文件的数目,尽可能使用前导声明。
- 使用标准的放重复机制,防止头文件的重复引用。例如:
// EG.H
//
// Copyright notice
//
#ifndef _EG_H_
#define _EG_H_
//...include files and declarations
#endif
Class layout
Symbian平台的类代码布局风格如下:
General
- 为了可读性,永远保留访问控制标志
- 成员的声明顺序:公共成员函数、保护成员函数、私有成员函数、保护数据、私有数据、公共数据。相应的访问控制标志放在每一组的前面。
- 为了可读性,在声明中给出函数参数的名字。
Virtual functions
- 在头文件里把替换继承的行为的虚函数都放在一起,用注释表明这些行为从哪一个类继承而来。
- 这些函数不写virtual关键字。
- 虚函数不能是inline函数,因为这样很难确定编译器会怎么处理它们。唯一例外的是虚inline析构器,这是被允许的。
Inline functions
- 必须注明inline关键字。
- 不要在函数的声明里面实现inline函数。应该在头文件的底部实现,或者在其他文件实现。
Subsystems and APIs
Overview
Symbian是一个很大的系统,包含了数百个类和数千个成员函数。象大部分复杂的系统一样,接触Symbain可以把它分成几个大的领域去了解,然后更加关注在你的任务中最重要的部分。比较好的分割方式叫做子系统subsystems。例如,应用程序引擎子系统包括了标准应用程序(例如联系人)所需的处理数据的所有API。
第三方开发者可以把任何领域和相关的功能组和看做一个子系统。他们不是类似DLL的二进制文件,也不是头文件那样的源文件。但是出于下面的原因,他们仍旧值得去被学习。
- 子系统是可以配置的,可以以很多种方式存在,子系统的一部分是必要的时候,其它部分可能是可选的。
- 系统文档,利用子系统来组织文档的结构。
The subsystems
下图就是Symbian的子系统
Base
不管是写哪一类程序,开发者都不能忽略Base子系统的API。对于初次进行Symbain开发的开发者来说,应该知道的是程序的基础都是用专门给手机优化的类库来构件的,而不是标准C函数库,或者标准C++类库。也就是说Base子系统的API包括了字符串处理、数组、表、错误处理,甚至表示整数和实数的标准数据类型。而且,它还包括了系统开发者所需要的可以处理系统基础,例如线程、进程、内存的API。
开始理解Base子系统API的最好起点是Essential Idioms章节,里面说明了面向对象的操作系统内部环境。
Graphics
图形组件包括用来描绘具体手机的API,例如屏幕、打印机、嵌入图形对象、字体、位图处理等等。
这个组件也包括了窗口客户服务器端API,这样提供了描绘窗口和接收窗口事件的能力,还有动画API,这个API允许动画运行在一个比较高优先级的线程上面。
Application Framework
应用程序框架API,实现了程序框架、定义了程序结构和基本的用户界面处理。应用程序就是狭义的程序:实现一个包含用户界面的程序,而且一个服务程序可以在后台进行系统任务。他也实现了一些其它的功能,例如怎么把文档给用户展现等等。
这些API其实比刚才说得更加的有用,包含了可重用的程序框架,可以处理文本布局,用户接口控件、和前端处理。
手机厂商会加入他们自己提供的用户元素API,这些API可以更好的适应他们的屏幕尺寸和输入机制。然而,关键的应用程序概念和基础类都是在这个子系统定义的。
Engines and utilities
应用程序引擎API提供访问核心程序数据的方法。这样第三方程序就可以完美的和核心应用程序相结合,例如可以写一个新的通信程序来保存操作读取联系人和议程的数据。
另外,多媒体服务API可以处理音频和图像。应用程序服务API提供一系列的工具服务,从日志到系统信息,到通讯录同步和日程表同步。
Communications
正象你期望的那样,Symbian提供了丰富的通讯API。它们往往都很小,而且经常使用。
Comms Infrastructure API提供了通讯和网络编程的框架和系统服务。希望使用串口和红外的数据传输的都需要了解这个API。
在更高的层面上,Messaging提供了一个多协议的信息传递的程序框架。
Developer's Guide
Hands On
Development basics
为任何一种基于Symbian OS的电话编程都需要遵循一种标准的模式。
Symbian OS软件开发是在基于PC/Windows平台的模拟器上面进行的。对于6.0,6.1版本来说,编辑/编译/创建的循环是基于MS的VC6.0开发环境。然而,开发者并不会链接Win32/MFC库,而是链接SDK提供的Symbian的头文件和库。二进制结果文件直接运行在相应版本的模拟器上面。
SDK提供的工具可以让这些过程变得简单。Symbian开发环境的mmp工程文件可以用来生成VC工具集的工程文件和GCC的工程文件,这样在开发中,可以用VC类型的工程文件来管理所有的链接和创建细节。这样也确保了创建产生的输出以及任何所需要的资源文件(图标,位图,声音文件等等),可以创建在正确的位置,以便模拟器可以调用它们。
更喜欢命令行的开发者的开发流程会有一些区别。他们的开发流程基本上和用Makefile来控制编译链接步骤差不多。
Reference hardware
对大部分的开发者来说参考硬件是来自Symbian授权的真电话,或者是购买来的电话。然而,开发循环中的硬件部分实际上是和真实硬件独立的。真实硬件的主要是测试和校验环境,在开发的大部分层次里面,大部分时间里,他是不必需的。
事实上,模拟器的基本处理流程和真实电话上面的真实应用精确的相似。
Issues to be aware of
创建程序的时候可以指定是否打开调试信息。
如果需要调试,那么对于6.0,6.1版本来说强烈推荐MS VC的调试器。MS VC可以提供系统级头文件方便调试和跟踪,而且允许在系统级显示线程运行情况。
模拟器肯定和真实的手机有一些区别。例如Windows的进程线程模型就与Symbian的不完全相同。这在app和exe两种不同类型的工程在模拟器产生的结果中可以看出,但是这个情况不会在真实硬件中出现。而且Cpu的不同带来的区别也存在与模拟器和非模拟器版本之间,比如,字长和高低位在前问题。
对于大多数的开发者,大多数情况下,这些不同是不可见的。
Hello World
HelloWorld是一个非常简单的UI程序。这个程序在屏幕中央显示了一个简单的消息,而且提供了一个菜单。它包括了一个简单的视图(View)显示“HelloWorld”文本,这个文本使用了UI提供的缺省字体。这个例子程序可以在[path]\epoc32ex\HelloWorld下面找到。[path]指的就是Symbian的安装目录。
这个工程显示的要点是:
- 应用程序资源,资源用来定义程序里面显示的文本,菜单,对话框和自定义的“屏幕设备”。资源是在程序代码以外的资源文件管理的,可以单独编译,在这个例子里面是 HelloWorld.rss。
- 程序里面需要解释的命令,也是定义在主程序代码之外的,而且要#include近来包括它的资源文件。
- 应用程序可以分为引擎、UI、显示组件等部分,虽然相互依靠,但是逻辑上面相对分离。
- 所有的程序都必须有一个三值的UID用来唯一标识它。
同样很重要的是,这个工程展示了基本的程序需求-需要的文件,基本的创建流程,需要使用的命令和它们的功能。
Build files
HelloWorld工程文件提供了一个Symbain的.mmp工程文件和一个bldmake组件描述文件bld.inf。
bld.inf文件只是简单的制定了一个用来编译的.mmp文件,如下:
PRJ_MMPFILES
HelloWorld.mmp
HelloWorld.mmp文件内容如下:
TARGET HelloWorld.app
TARGETTYPE app
UID 0x100039CE 0x10004299
TARGETPATH \system\apps\HelloWorld
SOURCEPATH .
SOURCE HelloWorld_Main.cpp
SOURCE HelloWorld_Application.cpp
SOURCE HelloWorld_Document.cpp
SOURCE HelloWorld_AppUi.cpp
SOURCE HelloWorld_AppView.cpp
USERINCLUDE .
SYSTEMINCLUDE \epoc32\include
RESOURCE HelloWorld.rss
LIBRARY euser.lib apparc.lib cone.lib eikcore.lib
注意,TARGETTYPE是app,这说明这是一个图形界面(GUI)程序,LIBRARY段列出来一个图形界面程序所需要的应用程序框架和图形库。UID行表明一个GUI程序的唯一系统标识符(0x100039CE),和这个程序的唯一系统标识符(0x10004299)。
Building the application
所有的类定义在一个头文件里面,每个类的实现都包含在自己的.cpp文件里面。
在命令行界面下,做如下的操做:/*注释:nokia的s60开发包1.2版本不包括perl语言解释器,所以下面的命令不能运行,需要自己下载一个perl解释器,例如ActivePrel,版本至少5.0以上。*/
- 改变当前目录为[path]\epoc32ex\HelloWorld
- 输入bldmake bldfiles
- 输入abld makefile vc6
这样就会生成VC工作区格式文件HelloWorld.dsw,声称目录在[path]\epoc32\build\[path]\epoc32ex\HelloWorld\HelloWorld\wins。这个文件可以用VC打开,而且可以用F7进行创建,或者选择菜单里面的Build | Build HELLOWORLD.APP。
用命令行编译调试版,使用下面的命令:
abld build wins udeb
程序会创建在模拟器的z:\system\apps\HelloWorld目录,而且可以从模拟器的图形界面运行。
用命令行编译真正手机需要的文件,用下面的命令:
abld build armi urel
这样程序文件就生成在[path]\epoc32\release\armi\urel目录,而且可以下载到一个真的手机里面。(这个实验我做了,包含后面章节的内容:怎么样创建安装程序。没有出现什么大问题。)
Up and running
在IDE里面如果你想运行Hello World程序,你可以先按Ctrl F5,或者选择 Build | Execute菜单。第一次,IDE会提示输入运行的可执行文件名,你必须提供模拟器的完全地址[path]\epoc32\release\wins\udeb\epoc.exe。注意,你只需要这么做一次,下次模拟器的地址就自动保存在工作区里面了。
模拟器运行以后,需要等一会儿,然后你就可以运行Hello World程序了。
Debugging
Symbian程序的调试和一般的Windows调试没有什么不同。首先装入VC工程文件,然后按F7创建程序。任何编译错误都会在"Build"标签里面出现。你可以用F4在错误间切换,显示错误所在的源码位置。你也可以象平时一样设置断点和单步运行代码。
注意Hello World程序没有任何错误,所以不需要进行调试。
Uploading
开发流程的最后一环就是把程序传到手机上面。模拟器和真实手机的二进制格式是不相同的,所以你首先必须用ARMI格式重新编译程序,在命令行使用abld build armi urel命令即可。你可以把程序和资源文件从pc的[path]\epoc32\release\armi\目录,复制到手机的\System\Apps\HelloWorld目录。
Symbain提供一个打包应用程序的工具――makesis。如果你要做很多次的重现编译和测试,那么利用这工具的机制,要比直接复制文件到目录更加方便。
参看:Application installation guide (尚未翻译)
Going deeper
这个指南里的其他主题描述了构成OS的主要子系统,以及为了保证程序的健壮和可靠性而制定的编程准则。
其他的专家话题可以在DevNet的技术论文里面看到。另外现在部分Symbianos编程的书已经上市了。
今天首先是从http://www.forum.nokia.com下载了Series 60 SDK for Symbian OS 1.2版本。之前,我看到的一些资料说用0.9中文版最好,实际上0.9中文版和1.2版本我都在电脑上面安装过,目前还说不出他们的区别。我的一个朋友的公司使用的就是1.2版本。
我目前计划的学习方法是看开发包提供的英文文档,并把看过的部分进行简要的翻译,放在这个日记里面。
去年开始接触过nokia的Symbian开发包,但是一直也没有仔细研究,我现在开始正式的学习Symbian开发。
年前,服务器的一个scsi硬盘突然损坏,然而我所有的重要资料都在这个硬盘里面,所以本站和《Tinyfool的开发日记》都暂停服务。目前,另一个scsi一切正常,我们购买的新硬盘也已经到货,年后就会安装...
学号转让(适合于想加强英语,又对瑞特,华尔街等学校有一定了解的上海朋友)
机构:上海瑞特国际英语(上海环亚西文现代英语培训中心)
网址:
http://www.right.org.cn/zhuye.html
课程:英语培训(4个月22天内无限量学习)
转让价格:6200RMB
转让原因:工作变动,无法继续上课
学习氛围和环境很不错(同华尔街),但是价钱比华尔街低,和外交交流的机会很多。
这个课程的特点是无限量,你可以在自己方便的任何时间,到学校去学习任何课程,
(包含多媒体,沙龙,club,电影赏析等所有课程)
如果你平时比较有空,那么你学习的机会就很多,也就越划算。
现在这种无限量的课程已经取消了,改为按照级别限制时间学,大概是一个级别4个月,总共7500元
我转让的价格是6200元,可以随意学4个月22天,如果你的进度足够快,你可以学两个级别,非常非常的划算,
现在我的学号是冻结状态,随时可以转让,请有意的朋友联系13519287,谢谢
客户咨询的服务热线:68888855(限上海地区拨打,外省市请拨打当地培训中心热线)
上海培训中心地址:
上海金钟中心:上海市淮海中路98号金钟广场28楼
上海中创中心:上海市南京西路819号中创大厦7楼
上海华融中心:上海市上海浦东南路1271号3楼(新开的,人最少,环境最好)
大约一年前,我开始玩VHDL,很感动。我从小是一个爱拆东西的孩子,我拆过的东西包括了收音机、钟、电视机、手机、电脑等等几乎一切我可以拆的了的东西。芯片是一个很难受的东西,每次拆到了芯片级别,我就抑制不住想用什么东西把他也拆开。但是大家知道那个封装是相当结实的,每次我费尽了九牛二虎之力,打开了也看不到什么......然后我就会觉得很郁闷。知道我开始学VHDL了,我开始发现原来芯片设计也可以那么简单,当然我们说的是芯片设计,而不是说设计好的芯片。
然后,我入门了以后,一直没有机会去实际做一个板子,把那些在modelsim上面跑了一千多遍的代码编程芯片里面实实在在的东西。慢慢的,我也就开始淡漠了。最近公司的项目开始用CPLD,这个和我一直以来跟领导们灌输这个概念,还是有一些关系的。可是因为我毕竟不是做硬件的,所以我不负责那部分的工作,但是我又开始有玩VHDL的冲动了。
中国芯,到现在为止,好像至少有4个芯片自己给自己冠上了这个头衔,他们全然不同,有专用的多媒体处理芯片,嵌入芯片,台湾技术的CPU,还有龙芯。其实我们并不需要那么的可以宣布自己是第一个中国芯的芯片的名字,我们需要的是一个产业,一个可以带来金钱,同时带来所谓的芯片级国家安全的芯片产业。但是我可以坦率的承认,我看到龙芯的一系列报道都是那么的激动。
那么,可能需要好好学两本书了《计算机系统结构》和《数电》。
昨天找到的一些资料
北京某培训机构的培训讲义,我正在看C++部分,相当不错。这个讲义非常适合自学,和Think in C++一起看效果想当好。
C#讲义
C++讲义
Delphi讲义
J2EE讲义
Linux/Unix讲义
Pb8讲义
Pfc讲义
偶最近有一个想法,就是人工智能应该由进化产生,而不是由猜测人脑结构产生。
不过想法很不成熟,最近找一个人工智能方面的高手聊聊先。
今天我的数据库程序出了问题,很奇怪
代码没有任何的问题
后来才发现是代码调用的一个view出了问题,view里面的输出,居然丢失了一列,这列全部变成NULL,所有后面的列自动后移
这样字段对应的数据类型就变了,所以程序不能运行
可是我看了100遍,view的定义没有发生任何变化,正当我百思不得其解的时候,我开始修改view代码的缩进,一句一句的分析,还是没有问题,退出去,程序居然对了
再去看view的输入也不错行了,,,,
对sqlserver表示极大的愤慨和怀疑
附:在MOP程序员联盟里面关于这个问题的讨论
今天遇到一个很怪异的sqlserver的问题
--------------------------------------------------------------------------------
今天我的数据库程序出了问题,很奇怪
代码没有任何的问题
后来才发现是代码调用的一个view出了问题,view里面的输出,居然丢失了一列,这列全部变成NULL,所有后面的列自动后移
这样字段对应的数据类型就变了,所以程序不能运行
可是我看了100遍,view的定义没有发生任何变化,正当我百思不得其解的时候,我开始修改view代码的缩进,一句一句的分析,还是没有问题,退出去,程序居然对了
再去看view的输入也不错行了,,,,
对sqlserver表示极大的愤慨和怀疑
(发帖时间:2004-1-5 12:21:57)
---tinyfool J
回复(1):
sqlserver是不会犯这样的错误的。
100%一定是你的程序犯错。
---匿名人士777384 b
回复(2): 楼上是走9遍,233
从概率上讲我出错的几率比sqlserver大得多
但是,MS可不是不出错,MS出的错也很多,而且这样类似的东西又不是没有遇到过
---tinyfool J
回复(3): 大胆的揣测一下:
后来才发现是代码调用的一个view出了问题,view里面的输出,居然丢失了一行,这行全部变成NULL,所有后面的行自动后移
这样字段对应的数据类型就变了,所以程序不能运行
介个意思是说,丢失了一行,然后所有的行会后移?丢失了一行,应该是所有行前移才对啊。
如果只是丢失行,字段应该不会错位的说,当然不会存在类型不匹配的错误....
你....
---匿名人士777384 b
回复(4): 缩进导致出错?头一次听说。
不过有时候ms出的问题就是很蹊跷,比如我 blog上写的这个,还不是百思不得其解
相关链接:
http://blog.codelphi.com/netfire/posts/696.aspx
---Fire J
回复(5): 走9遍,看样子你语文不及格
偶说的丢失列是列的数据丢失,全部被NULL填充,然后,所有的列后移
这么说如果不清楚,偶给你一个例子好了
正确的数据
A1 A2 A3 A4
1 '2' '3' 4
5 '6' '7' 8
出了问题以后的数据,问题出在A2一列
A1 A2 A3 A4
1 null '2' '3'
5 null '6' '7'
但是构成View的那几个表都素完全正常的,而A4原本是int,现在变成了变成了varchar,所以我后面有一些利用这个view产生新表的存储过程就不行了....
---tinyfool J
回复(6): 如果是我代码写错的,至少这个view一打开就素代码错误的提示吧!
还有代码错误,我这个null列是怎么出来的呢???
---tinyfool J
回复(7):
行...列....
楼上的语文真行...
明明是多了一列,偏偏说是少了一行...
出这样的错误,在所难免,俺能理解你...
---匿名人士777384 b
回复(8): 走9遍,行列的问题偶不和你讨论,那个是打字打错了
至于多少的问题,你确实没看懂,多了一个null列,我肯定要少了一个有意义的列,这个没有什么疑问了吧?
---tinyfool J
回复(9): 你要是有兴趣,倒是可以帮我想想数据和程序哪里出错可能会引发这样的问题,然后什么代码都不修改的情况下,这样的问题又怎么可能解决吧???
不然的话,我还是要认为是sqlserver的错误了
---tinyfool J
回复(10): 和一个朋友讨论的结果....
383023(Illusion) 12:27:11
view也是要编译的。
你可能看到的是未编译的版本。
30010(Tinyfool) 12:27:22
我觉得有可能是这个问题
30010(Tinyfool) 12:27:34
但是我一直用这个view没有问题
30010(Tinyfool) 12:28:07
我觉得最后的解决是因为view代码改变以后重新编译,所以就正常了
30010(Tinyfool) 12:28:10
你说呢?
383023(Illusion) 12:28:35
有理!
30010(Tinyfool) 12:28:42
;) 我想到了一个可以试验的方法了,我去试验一下我的推论
30010(Tinyfool) 12:28:49
如果是这么回事儿就对了
---tinyfool J
回复(11): 我现在对这个解释比较满意,正在试验验证中....
---tinyfool J
回复(12): 现在的推论,但是只是推论,按照这个推论做的试验没有成功
30010(Tinyfool) 12:46:43
我现在估计问题是这样的
30010(Tinyfool) 12:46:50
构成视图有5个表
30010(Tinyfool) 12:47:09
其中一个最主要的表里面我前些日子多加了一个字段
30010(Tinyfool) 12:47:43
而且是加入在作为连接表的某个外键的前面
383023(Illusion) 12:47:45
什么原因使代码没有编译呢?
是不是用查询分析器了?
30010(Tinyfool) 12:47:58
view没有变化啊!
30010(Tinyfool) 12:48:05
只是我的表变化了
30010(Tinyfool) 12:48:34
我估计编译以后的view,联接的时候用的不是字段名字,而是字段编号一类的东西
383023(Illusion) 12:48:38
你用了select *?
30010(Tinyfool) 12:48:45
有*
30010(Tinyfool) 12:48:48
对
383023(Illusion) 12:49:29
那个*我从来不用。
用企业管理器生成的sql语句最方便。
30010(Tinyfool) 12:49:50
嗯,你说的*可能是一个问题
30010(Tinyfool) 12:50:02
我用的也是企业管理器啊!
30010(Tinyfool) 12:50:32
就是说表更新了,但是view编译的时候联接的是字段编号
383023(Illusion) 12:50:41
sql server还是比较好用的。就是没用过太大的数据量,
我写过运算很复杂的t-sql。如果硬件好的话。还不错。
30010(Tinyfool) 12:50:48
所以表更新了结构以后,应该把view也更新一下
30010(Tinyfool) 12:50:50
你说呢?
30010(Tinyfool) 12:51:05
我用sqlserver的主要原因就是好配置
30010(Tinyfool) 12:52:09
不过,我做了几次试验都得不到一样的错误
383023(Illusion) 12:52:16
我没遇到过这种情况。
30010(Tinyfool) 12:52:18
现在只能是这么推论了
---tinyfool J
回复(13): Create Table TestAB
(
field1 char(1) not null
)
go
create view TestViewA as select * from TestAB
go
select * from TestViewA
go
alter table TestAB add column field2 int
go
select * from TestViewA
go
是这样的吗?
---匿名人士777384 b
回复(14): 问题差不多,但是view本身复杂一些,是很多表的连接
可能和连接也有关系
我估计现在在原数据库上在加一个新的字段可以重复这个错误,但是这个是公司的人事数据库,而且这两天马上要发工资了
我可不敢在这个数据库上面随便做实验
我做的简单试验都没有产生这个错误
---tinyfool J
回复(15): 我遇到过比编译出错更怪异的事情:
一个复杂的SQL语句在查询分析器里执行好好的,放到企业管理器里面执行就不对了(企业管理器会自动的重新排列SQL语句 -- 这个功能好像叫查询优化什么的 -- 结果给“优化”错了).
不幸的是我写程序的时候先用企业管理器作验证....浪费了我整整一天...
---caitsith J
我原来以为CVS的服务器是很难配置的,现在我才发现更难学习的是客户端的使用,我想我被打败了。。。。
我所在的公司是一个小公司,以前的人事管理都是手工进行的,所有人员的信息都是记录在某一个本子上面的。在公司很小的时候,这样的工作方式没有看出来有什么问题。现在公司有管理人员近百名,工人近千人,而且由于产品的特性,公司的人员流动率相当的高,慢慢的人事部门发现原有的管理方式已经没有办法正常运转了。比如,发工资当时也是手工计算的,于是每次工人工资的计算都要花掉两三天的时间,而且最后给不出来一个工资条,工人应该拿多少钱,到底为什么拿这么多钱,没有一个说法,工人们收到工资的时候就会有许多的怨言。
于是在三四个月前,我开始帮助人事管理部门做了一个人事管理和工资结算的软件,由于时间紧,而且我对这类管理不是很懂,所以这个软件做出来还是有很多毛病的,先后几乎改动了30多次,有些是人事部门的需求改变,有些是去除代码中的逻辑错误等等。但是总之值得欣慰的是,现在我们已经有了一个包含所有工人信息的数据库,而且基本上还是在正常的运转。
公司有一个食堂,每餐的用餐人数大约是100-400人次,主要是供应中餐,偶尔会有晚餐和夜宵。根据老板的意图,公司给所有出勤的工作人员准备一顿免费的工作餐。这个用意还是很不错的,但是实施起来还是出现了很多困难。
最早的时候,公司的做法是每个人根据出勤情况,在月底发给补助,标准为一个工作日给4元钱补助。然后,食堂的午饭采用3元和4元两种标准,大家在食堂买饭。这样做的立意很好,但是后来发现了一些问题。问题就是发现很多工人(主要是外地打工人员),经常不在公司吃饭,干脆饿一顿,这样为了节省餐费补助(看这有点不可思议吧,但是对很多外地女工来说,一个月大约80元的餐费补助也不是小钱)。公司的工作还是很辛苦的,这些刻意省钱的工人发生过多次在上班时候晕倒的情况,后来调查发现她们经常不吃中饭来省钱。公司领导知道这个问题以后,决定一定要解决这个问题,就是说要保证发给员工的餐费补助只能用来吃饭而不是省下来。第二个问题,就是公司的工作量是很不均匀的,一个工人这个月出勤天数是20天,下个月可能只有15天,而餐费补助和工资一起发的办法,实际上只能发给工人上月的餐费补助。相对另一些工人,刚刚来到这里打工的女工,他们往往在发第一个月工资前,身上没有多少钱,去食堂吃饭都是奢侈的。这个问题公司也想解决,是否能够在公司出勤一天,马上就给他补助呢?
这个问题其实还是相当复杂的,每天基本上出勤人数是100-400左右,也就是说每天发出去的餐费补助在400-1600之间,这个多现金发到那么多人手里面,是相当麻烦的。如果按照每天发补助的模式,管理部门的工作量将大大提高,而且出现问题的几率也大大提高。另一个问题就是,一旦现金发给了工人,那么就无法控制这个钱是用来吃饭还是别的。
在解决这个问题上面,公司最后决定采用射频卡售饭系统,补助发放到卡里。于是公司购买了北京某公司的射频卡售饭系统,并买了相当数量的射频卡。购买这个射频卡系统时,我作为技术部门的监督全程参与。买来以后这个系统的安装调试也是由我来负责的。安装很容易,然后我们给公司所有的员工注册了卡,并每人在里面预先放了50元。但是这个方案后来也遇到了一些困难,在第一笔50元钱用完以后,很多人开始用钱买饭,这个系统开始崩溃,因为相对来说,拿着钱去食堂加卡是比较麻烦的。
但是不管怎么说从技术上讲,这个射频卡还是很稳定的,虽然他没有给我们提供二次开发的接口。于是,后来我们又从同一家公司购买了射频卡考勤系统,使用的是相同类型的射频卡,但是考勤机和食堂的卡机还是有些区别的。后来,我们还从这家公司购买了射频卡门禁系统作为我们的安全系统的一部分。这三套射频卡系统都采用的是同一种类型的射频卡,实际上我们给每个人只发一张卡。他需要什么功能,我们就在那个系统上面给他开通这个功能。
于是,管理部门提出,能不能只要工人早晨在考勤机上面打卡,我们就在食堂的账号上面给他加上4元钱。这个工作我做了一下,程序本身并不复杂,但是遇到了一些程序外的因素。比如,我们设定7:30到10:00是打卡上班的时间,但是发现很多工人由于班车早到7:30前就已经打卡了,这样他们的账号就不能得到4元钱,而很多工人昨天晚上来上班的,今天下午才下班,所以他们在早晨没有打开,这些问题都和程序没有什么关系,但是确实是影响系统的使用。还有一些工人,比如动力机房的工人,办公室那边的工人,他们都不从现在的考勤地点上班,所以他们的以前都不打卡的。这也造成了一些问题。
前天开始有一个想法,想做一个手机的网络游戏。于是,昨天和今天我和14和贱男商量了一下,他们基本上都同意我的计划。所以,我今天开始写策划案,真累,写了2000多字,还没写到我们的系统到底是什么样子呢。
这个游戏是什么,我不能说,因为这是我们几个人的商业秘密。这个游戏是GBA上面很流行的一个游戏,当然我们只是要做一个类似的游戏,不是移植。但是我们的游戏和原有游戏也会有很多的区别,这是很多原因造成的,一方面是因为目前手机的内存都比较小,另一个方面是我们打算做的是一个网络游戏而不是单机游戏。
但是整个系统设计仍旧可以参考那个游戏很多,为了让14和贱男理解我的创意,我把那个GBA游戏的系统做了一个分析,放在我的策划案里面。然后说明,我们的游戏可以看作是那个游戏的手机版和网络版。
这个游戏计划,有很多优势,也有很多困难。优势方面,这个计划的参与者(目前的三个),都是和我很熟的,技术水平都是我很了解的。另外这个游戏的服务器可以使用我的托管服务器,没有多余的投资。困难方面,国内手机目前的界面几乎没有一个标准(日本不同,日本的手机屏幕尺寸都是有标准的),这样给程序编写造成了一定的困难;另外手机的存储空间相当有限,游戏的界面元素等等信息的存储将是一个很大的问题;另外目前的GPRS网络的收费还不是很合理,用户玩这个游戏会花费比较多的钱。这些问题我们都需要仔细的考虑。
目前我不希望美工的工作介入,等到我们对整个游戏的系统设计的比较成熟了,等到游戏的程序框架基本上差不多的时候,我们才会考虑让美工介入,虽然这个游戏的美工工作量肯定很大的。这是因为如果现在让美工介入,而我们拿不出来让美工有效工作的工作计划,这样只会挫伤美工的工作积极性。
我对这个游戏还是很有信心的。相信我们这次一定能创造一个经典的中国游戏出来。