2005年是众多纪念的一年,C++20年,Java10年,Windows 95 10年,水木清华10年,还有很多很多。
2005年是我值得纪念的一年,生了女儿,买了新房子,决定换工作,离神也越来越近。
无它,聊写数笔,以为将来前进的动力。
月度归档:2005年12月
C++编程规范阅读手记(二)
第二部分:设计风格
5. 给一个实体一个内聚的职责
倾向于从小一些的低层抽象构造高层抽象;避免将许多低层抽象集合成一个更大的低层抽象。从一些简单个体完成复杂行为要比相反的更容易。
两个声名狼藉的例子:realloc 和 basic_string
6. 正确性,简单性,和清晰性先行
这是第二部分最重要的一条,其实重要性不言自明
7. 知道何时和如何为可伸缩性编写代码
在一切可能情况下使用线性(或更好的)算法;在一切合理情况下避免使用比线性差的多项式复杂度的算法;在任何时候避免使用指数复杂度的算法。
8. 避免过早优化
9. 避免过早恶化(pessimize)
这两条应该一起说,因为常常有人搞混。这里作者将“过早优化”定义为以优化的名义将设计和编码搞得更加复杂,也因此更加不可读,实际上并没有被证明的性能需求,因而也明显地没有为你的程序增加被证明的价值。
让一个正确的程序快起来要比让一个快的程序正确要容易得多得多。
不要进行过早优化的两个理由:1. 我们程序员并不能能准确地评估代码中的瓶颈,因为现在的计算机计算模型十分复杂。因此,要优化必须通过准确地实际度量。2. 现在越来越多的瓶颈不在于CPU的限制,而是内存、网络、磁盘、Web Service。数据库等等的等待上,因此实际上要优化的是如何减少这种等待时间而不是程序运行的时间。
但是,这并不意味着不注意一些效率上的考虑,这就是第9项想说明的:避免过早地恶化。
这些考虑包括:传递引用而不是传递值;使用前置++和–运算符而不是后置运算符;使用构造函数中的赋值语句而不是初始化语句列表。减少对象不必须的临时拷贝,尤其在内循环中;使用现成的抽象、库和算法,例如STL。
因为这些手段的采用并未影响代码的可读性,因而也不会影响代码的复杂性,相反,有时候还降低了代码的复杂性。
基于IIS的OTA无线游戏下载服务器配置
摘录自:http://www.yi5.net/ArticleShow.asp?ArticleID=2337
IIS中站点的属性->HTTP头->MIME映射->”文件类型”按钮->”新类型“按钮, 添加两种类型jad和jar:
JAD: text/vnd.sun.j2me.app-descriptor
JAR: application/java-archive
———————————————-
无线移动开发论坛 http://www.everenter.com/bbs
jerryQQ:3324131
games.jad
安装j2wtk2.0,在开始菜单的j2wtk菜单中启动OTA Provisioning,点击屏幕右下角
的apps,点击install application,输入http://127.0.0.1/down.html,不出意外,屏幕出现games.jad,选项,选择install后,执行如果正常运行进行下一步 ,就能提示你安装成功,可以在wtk里玩你的下载游戏了。
1.games.jar不一定必须和games.jad放到同一路径下,但是games.jad中MIDlet-Jar-URL属性指向的必须是games.jar的绝对地址。
2.wtk版本要2.0以上,1.04里面没有OTA Provisioning。
我又成新的工具了
我最喜欢的游戏之一
C++编程规范阅读手记(一)
《C++编程规范(英文版)》(英文名:《C++ Coding Standards – 101 Rules, Cuidelines, and Best Practices》)
Herb Sutter, Andrei Alexandrescu 著
第一部分:组织和政策问题
0. 不要为小问题焦虑(要知道哪些无需规范化)
统一最重要,而具体统一成什么细节并不是那么重要,比如缩进是多少,每行长度多少,命名方式如何,注释方式如何,括号方式如何,TAB还是空格等等。另外提到两条传统的规范认为无需遵守,一是匈牙利命名法,二是函数的单入单出。
个人意见:对于一个团队来说,最好还是需要需要就一些细节的东西进行统一,当然统一成什么格式关系不大,没有哪种格式一定比别的格式好。单入单出我是早就反对的,但匈牙利命名法得很习惯了。现在看到的许多软件开发的书籍里都提到说匈牙利命名法对面向对象的语言是不适合的,最近也是有些体会,但主要集中在类型的重复上(对类似乎还可以,但对于Generic Programming显然毫无意义),自己觉得作用域的说明似乎还是有些好处的。一个程序里阅读的时候直接能知道哪些是类的成员变量,哪些是局部变量或者函数的参数。不过也许按照写小函数的原则,一个小函数中这一点也能够看得很清楚,也许也会慢慢觉得没有必要。
1.使用最高的警告级别进行编译
2.使用一个自动构造系统
3.使用一个版本控制系统
这几点都在遵循,但自动构造系统并没有对公司所有产品都这么用。另外,以前很多习惯仍然没有到达“建立工具,让机器替代人来工作”的自觉程度,有时候还是为图省事就手工做了,然后一遍遍重复做。
4.在软件复查上投资
做得不好,所以重复一下书中的理由:
* 通过有益的同伴压力来增加代码质量
* 找到bug,不可移植的代码(如果适用),以及潜在的伸缩性问题。
* 通过想法的杂交促进更好的设计以及实现
* 带领新的团队成员和新手加快速度
* 在团队内部培养共同的价值观和一种社区感觉
* 增强精英意识,自信,积极性以及职业自豪感。
另一种局部刷新
学到另一招,不需要象AJAX一样创建对象:
function testScript(resultRowCnts)
{
MyScript.src = “new.js”; // 或者”new.asp”
}
============================
new.js
document.getElementById("toggle").innerText = "abcd";
============================
new.asp
<% Response.Write ("document.getElementById('toggle').innerText = 'abcd'") %>;
实际上new.asp一样是动态的,得到数据然后通过一些javascript语句进行更新。
好处是不需要在客户端脚本创建"Microsoft.XMLHTTP"对象,缺点是需要将Javascript写在ASP中间。
如果只是js的话,其实也还清楚。
我的语言能力
VBScript中的函数括号的使用
做的一个ActiveX后台组件,有个函数的定义为:
[id(1), helpstring(“method GetData”)] HRESULT GetData([out] VARIANT * pb);
GetData函数示例如下:
STDMETHODIMP CArrayBox::GetData(VARIANT *pb)
{
// TODO: Add your implementation code here
::VariantClear(pb);
pb->vt = VT_UI1 | VT_ARRAY;
SAFEARRAYBOUND bound;
bound.cElements = 200;
bound.lLbound = 0;
pb->parray = ::SafeArrayCreate(VT_UI1, 1, &bound);
if (pb->parray == NULL)
return E_FAIL;
memcpy(pb->parray->pvData, “abcdefg”, 7);
return S_OK;
}
在VBScipt中这样调用 o1.GetData(d) 是有问题的,d的类型和内容并不改变。
需要 o1.GetData d 不加括号才是对的
另一个函数定义是:
[id(15), helpstring(“method CreateNewFile”)] HRESULT CreateNewFile([in] BSTR bstrOutFileName, [in] long nFormat, [out, retval] VARIANT *pbResult);
o1.CreateNewFile(“res.pmd”, 6) 错误是: 调用子程序时不能使用括号
o1.CreateNewFile “res.pmd”, 6 正确
res = o1.CreateNewFile(“res.pmd”, 6) 正确
res = o1.CreateNewFile “res.pmd”, 6 错误是: 语句未结束
在网上看到这样的描述:
所有的方法, Function, Subroutine的呼叫都要加上小括号,但若呼叫Function但不需要Function 的回传值,或者Function不需要传入参数,可以使用不加小括号的方式呼叫, Subroutine不使用小括号也是可以的,但VB.NET中不再允许。
上面说“可以”不加小括号,但似乎是“必须”不加小括号。
又试了试上面的调用换成 k = o1.GetData(d),此时d的值就是对的了,但实际上原来的函数是没有返回值的。
有点想不明白VBScipt的机理。