博文
国际观点:有助于你编程而立即要做的10件事(2008-09-19 12:56:00)
摘要:我们一直努力又努力去掌握那些对于我们来说是全新的东西。那么,我们做什么来帮助学习?下面是一个关于如何使你编程更迅速合理的10件事情的列表。我更习惯与使用Ruby on Rails,但下面的观点也适用于其他环境。
1.升级单元测试
你的编程没有测试?你应当随时进行测试,即TATFT ( testing all the fucking time )。当然你应当选择比仅是单元测试更好的方式。RSpec和Shoulda是两个可以选来使用的工具。
2.试用TDD
既然你在测试,那你就应当记录下这些测试。不要记录代码并用后来的测试覆盖它,而应当是方法的记录。TDD ( Test Drive Development ) 可以使你编出更好的代码,TATFT最重要的基础就是 TDD。进行TATFT并不难,首先你写下你所能做的最简单的测试并运行,观察测试的失败,然后写出执行语句以便使测试通过,不停地重复这样的过程就可以了。
3.自动化部署
自动化是你最好的朋友,想要实现自动Capistrano是相当好用的工具。在你配置部署好你的项目后,第一个要装的东西就应当是Capistrano。从第一天起就可以自动化部署将会节约你大量的时间。
4.安装 SCM
安装 SCM并学习使用它,这样做的好处是可以使那些超重的库中的代码不再那么冗繁,目前有大量的工具可以选择,我每天使用的是Git。Git是一款很特别的分布式SCM,即DSCM。DSCM是很有前景的,它可以同有其他库的用户们协同工作。
5.审查持续集成
现在我们已经测试了代码并将其安全的存放在库内。比起不停地测试,什么是更好的方式?自动测试是个不错的选择。很感激有cruisecontrol.rb的存在,这个应用工具自动运行了那些琐碎的测试。
6.了解你的代码
写代码是一回事,但是更重要的事情是了解代码。可以用四种自动化工具来帮助你了解代码:flog、 tarantula、rcov 和saikuro。这些工具分别有其独到之处,我很乐意向你介绍它们。
Flog,可以按字母排列的顺序来记录复杂的结果。
Tarantula,根据相关性原则和一些灵活的创意设计......
简明 Python 编程规范(2008-08-28 08:53:00)
摘要:
本文转载自『恋花蝶的博客!』
http://blog.csdn.net/lanphaday
更多精彩内容,欢迎访问恋花蝶的博客!本文最初发表于赖勇浩(恋花蝶)的博客:http://blog.csdn.net/lanphaday,如蒙转载,必须保留全文完整,未经本人同意,不得用于商业目的。
简明 Python 编程规范
编码
所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- 。设置编辑器,默认保存为 utf-8 格式。
注释
业界普遍认同 Python 的注释分为两种的概念,一种是由 # 开头的“真正的”注释,另一种是 docstrings。前者表明为何选择当前实现以及这种实现的原理和难点,后者表明如何使用这个包、模块、类、函数(方法),甚至包括使用示例和单元测试。
坚持适当注释原则。对不存在技术难点的代码坚持不注释,对存在技术难点的代码必须注释。但与注释不同,推荐对每一个包、模块、类、函数(方法)写 docstrings,除非代码一目了然,非常简单。
缩进
Python 依赖缩进来确定代码块的层次,行首空白符主要有两种:tab 和空格,但严禁两者混用。如果使用 tab 缩进,设定 tab 为 4 个空格。
公司内部推荐使用 4 个空格的 tab 进行缩进。
空格
空格在 Python 代码中是有意义的,因为 Python 的语法依赖于缩进,在行首的空格称为前导空格。在这一节不讨论前导空格相关的内容,只讨论非前导空格。非前导空格在 Python 代码中没有意义,但适当地加入非前导空格可以增进代码的可读性。
1) 在二元算术、逻辑运算符前后加空格:如 a = b + c;
2) 在一元前缀运算符后不加空格,如 if !flg: pass;
3) “:”用在行尾时前后皆不加空格,如分枝、循环、函数和类定义语言;用在非行尾时两端加空格,如 dict 对象的定义 d = {‘key’ : ’value’}。......
c c++ include机制简述[转](2008-08-27 08:54:00)
摘要:1.引言
做c/c++编程的对#include指令都不会陌生,绝大多数也都知道如何使用,但我相信仍有人对此是一知半解,
C:
#include <stdio.h>
C++:
#include <iostream>
表示包含C/C++标准输入头文件。包含指令不仅仅限于.h头文件,可以包含任何编译器能识别的C/C++代码文件,包括.c,.hpp,.cpp,.hxx,.cxx等,甚至.txt,.abc等等都可以
2.名词解释
preprocess
预处理:为方便编译器处理而设置的一种机制,包括一些常用预处理指令和语句,我们统称为预处理系统。
如#include #define #if...#else...#endif #pragma等
这些指令的实现是由编译器来决定的(implementation specified)
提到预处理指令,顺便说一下头文件防止重复包含的2种方法
a.保护宏(暂且称为Macro guard 宏卫兵?):
#ifndef _ABCDE_H
#define _ABCDE_H
/*
代码部分
*/
#endif
在被包含过一次之后,宏_ABCDE_H已经有了,下次再碰到就会略过从#define _ABCDE_H开始到#endif之间的代码
还有一种特定编译器支持的指令:
b.#pragma once
能保证该文件(物理上的)只被编译一次,也能起到防止重复包含的作用
但这2种方式是有区别的:
a.Macro guard可移植性好,绝大多数编译器都支持,而且万一不小心拷贝了几分相同的代码也不会出问题,但你得确保这个宏名不会与其他的宏冲突,否则等编译器报出一大堆错误的时候你可能会觉得莫名其妙;
b.#pragma once指令简单,它能保证该文件(物理上的)只被编译一次,不用去费劲的想不同的宏名,但如果有几份该文件的拷贝,显然起不到作用。
declaration
声明:指将一个名称引入当前编译单元,或者重新声明一个前面已经声明过的名称,声明指定了如何解释一个名称和该名称具有的属性;
例如:
int main(void)
{
int a;&nbs......
深入嵌入式linux知识要点[转](2008-07-10 17:24:00)
摘要:深入嵌入式linux知识要点
1.linux理论
1.计算机体系结构
2.CPU结构
3.内存管理
4.文件系统
5.进程调度
2.linux驱动
1.i2c驱动添加使用 (inno,摄像头)
2.spi驱动添加和读写 (inno,spi的flash)
3.io驱动 (led的控制,io操作)
4.dma驱动 (lcd和ac97 alsa和网卡)
5.中断源 (inno,摄像头)
6.竞争,并发,阻塞,异步,线程,内存,io,调试(ldd3)
7.usb (libusb,skeleton.c)
8.flash,文件系统 (u-boot,kernel source)
3.linux编程
1.输入输出,文件,文件夹 (linux c 函数手册)
2.字符串,数据结构,堆栈,链表,(查找)算法,二叉树 (glib,glibc)
3.线程: 线程属性,线程同步(锁,信号量,条件变量) (多线程编程指南)
4.进程:守候进程,进程通信-管道,信号,SystemV(消息,共享内存,信号灯),读写锁,套接字 (linux网络编程指南)
5.网络:socket,ftp客户端,tftp客户端,http server,snmp命令 (inetutils-1.4.2.tar.gz源码,linux网络编程指南)
6.环境变量,库默认搜索路径,arm-linux-gcc库路径,设置搜索路径,编译流程,lds文件,内联汇编
7.gcc ,ld, ar, ranlib, objdump, readelf, objcopy工具(看博客)
8.make makefile,autoconf,aclocal, automake,configure脚本GNU make中文手册)
9.shell,perl (高级Bash脚本编程指南)
10......
C++程序中的内存划分(2008-04-28 16:21:00)
摘要:点击原文
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改......
InfoQ: 敏捷Web开发向左,标准Java平台向右?(2008-04-20 12:18:00)
摘要:InfoQ: 敏捷Web开发向左,标准Java平台向右?
2008-04-17 来自:villa123
在最近图灵公司总编刘江发布的一个博客中,提到PHP 3之后的主要语言开发者、Zend公司创始人Andi Gutmans向Java平台发难,说其已经失利于现代Web开发的这场战争,寄希望于JVM并不能挽回颓势。但社区似乎并没有完全支持Gutmans的这一观点。
根据Gutmans的表述,最终目的的不同是动态语言和Java平台选择不同道路的主要诱因。Java从所诞生的那一刻起就注定是为企业平台开发服务,而动态语言则好像是为Web开发量身打造,这一发展趋势仍然在延续:
[大型企业级项目团队中最优秀的人]恰恰忽视了Web,因此Java EE设计时并没有以Web为中心,而且关注在企业集成、事务管理和其他后端处理上。虽然Java EE通过Servlet和JSP支持Web开发也有不短的历史,但是掌握标准发展的大公司们忽视了Web的RESTful本质,仍然在向通用平台的方向上走。
而与此同时,建于C语言库和工具的生态系统之上的LAMP架构,则成了Web程序最流行的开发平台。其中最常用的语言是PHP。由于PHP专注于Web开发,而且为此不断演变,它简直就是为Web范型(paradigm)量身打造的,能够快速和容易地解决常见的Web问题,因此获得了最大的市场份额。
Java平台显然也注意到了Web开发的兴起,当包括CRM、ERP、报表、文档管理等业务应用程序也都转向了Web后,Java厂商开始支持各种标准和非标准的Java Web框架,比如JSF、Struts、Spring MVC等,以使得Java适应Web。但结果并不理想,Gutmans分析其原因是:
它们都无法解决Java在Web上的主要问题:由于严格的类型化和架构过度复杂,开发时间和开发人员的技能要求都更高,也就是说,总成本无法令人满意。
而且,大的Java厂商还什么都想占着。一方面想融入Web,一方面又不肯放弃自己已经在Java上建立起来的数十亿计的生意。甚至动态语言的广泛流行都未能显著改变他们的行为模式。
一直对技术社区保持关注的国内技术专家李锟对Java在面向互联网Web开发领域被边缘化,也给出了自己的见解......
ORACLE常用命令(2008-04-15 13:09:00)
摘要:一、ORACLE的启动和关闭
1、在单机环境下
要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下
su - oracle
a、启动ORACLE系统
oracle>svrmgrl
SVRMGR>connect internal
SVRMGR>startup
SVRMGR>quit
b、关闭ORACLE系统
oracle>svrmgrl
SVRMGR>connect internal
......
为你的MFC程序添加宏脚本语言(2008-04-11 20:34:00)
摘要:为你的MFC程序添加宏脚本语言
原著: Ernest Laurentin
翻译:haily
下载源代码
屏幕截图
简介
我总是对脚本控件(msscript.ocx)如何使用和当需要使用的时候,C++ 开发者该如何应对感到惊奇。可能扩展名(.ocx)使他们觉得,那是vb!在本文中,我将解决这些界限,给出 C++ 开发者使用它的新的理由。
问题描述
由于MS开发者的努力而创造的 Windows 脚本技术,使在VB和 C++ 应用中使用vbScript和Jscript变得相当简单的。开发者只需要知道如何使用Microsoft脚本控件和如何给一个脚本方法传值就可以了。由此,首先我想要提出的一个包容类是CScriptObject。这个包容类的使用是非常简单的,她提供了你将会在你应用程序中使用的大部分功能。它能提供从文件和资源中中载入脚本(文本数据),得到方法列表,选择脚本语言和执行函数和语句的功能。本类不依赖于MFC,能在控制台程序(console Application)中使用。
对脚本调用首先最重要的是要了解VBScript和Jscript只能处理VARIANT类型的参数。这就是我建立CSafeArrayHelper类的原因了。CSafeArrayHelper包容类允许你建立你将要传给你的Script函数的的参数。 class CSafeArrayHelper
{
public:
CSafeArrayHelper();
~CSafeArrayHelper();
bool Create(VARTYPE vt, UINT cDims, UINT lBound, UINT cCount);
bool Destroy();
UINT GetDimension();
bool Attach(LPSAFEARRAY psa);
bool AttachFromVariant(VARIANT* pVariant);
LPSAFEARRAY Detach();
LPSAFEARRAY Get......
用ATL实现VC插件(3)(2008-03-24 22:16:00)
摘要:用ATL实现VC插件
作者: IUNKNOW 出处: vchelp
增加命令对应的方法:
1) 如果要增加一条命令,必须在Icopyright中增加相应的方法。如在示例程序中我增加了MiniWindow这个命令,那么我在Icopyright中也必须增加MiniWindow这样一个方法 (在ClassWizard中鼠标右键Icopyright,在弹出菜单中选择Add Method 即可增加方法)
示例程序程序中共增加了四个命令:ShowInfoDlg,MiniWindow,MaxWindow和Test,应此必须在Icopyright接口中实现此四个方法
7)实现工具条后,就是实现具体的方法了,具体的实现请参看Ccopyright中的四个方法
STDMETHODIMP CCopyright::ShowInfoDlg()
STDMETHODIMP CCopyright::MaxWindow()
STDMETHODIMP CCopyright::MiniWindow()
STDMETHODIMP CCopyright::Test()
STDMETHODIMP CCopyright::ShowInfoDlg()
{
// TODO: Add your implementation code here
USES_CONVERSION;
CUserInfoDlg dlg;
dlg.m_bstrName = m_bstrName;
dlg.m_bstrEmail = m_bstrEmail;
if(dlg.DoModal() == IDOK)
{
m_bstrName = dlg.m_bstrName;
m_bstrEmail = dlg.m_bstrEmail;
}
CRegKey reg;
reg.Create(HKEY_CURRENT_USER,_T("Software\\Evesoft\\AddIns"));
reg.SetValue(OLE2CT(m_bstrName),_T("NAME"));
reg.SetValue(OLE2CT(m......
用ATL实现VC插件(2)(2008-03-24 22:15:00)
摘要:用ATL实现VC插件
作者: IUNKNOW 出处: vchelp
如果我增加一条这样的命令AddCommand(CComBSTR(_T("ShowInfoDlg\n显示\n修改用户版权信息\n显示")),CComBSTR(_T("ShowInfoDlg")), 0, dwAddInID, &bRet);在Categroy的All Commands中就能找到ShowInfoDlg这条命令。AddCommandBarButton()方法就是向IDE集成环境增加一个工具条按钮,程序中可以不调用此方法,可以手动拖拉到工具条上。打开菜单Tools/Customize 用鼠标拽拉你需要的的命令到工具条上即可(如图)
在Ccopyright 类NewDocument()方法中的代码,主要就是增加必要的版权信息到文档中,此处主要是说明怎样操作VC环境中文档,大家也得到具体的Windows来修改窗口的形状和属性,怎么修改就要看各自的想象力了。
HRESULT CCopyright::NewDocument(IDispatch* theDocument)
{
CComQIPtr <ITextDocument,&IID_ITextDocument> pTextDoc(theDocument);
HRESULT hr = S_OK;
CComBSTR bstrLang;
if (pTextDoc == NULL) return hr;
hr = pTextDoc->get_Language(&bstrLang);
if (FAILED(hr))
return hr;
//µÃµ½Îļ
þÀàÐÍ£¬²¢
µÃ³&o......