存档

‘程序开发’ 分类的存档

【C】sizeof与strlen的比较

2011年11月30日 没有评论

一、sizeof
sizeof(…)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。

它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。

由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。

具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:

阅读全文…

分类: 程序开发 标签: 364次阅读

Cache写机制:Write-through与Write-back

2011年10月23日 没有评论

Cache写机制

参考http://en.wikipedia.org/wiki/Cache#Writing_Policies上的说明,Cache写机制分为write through和write back两种。

  • Write-through- Write is done synchronously both to the cache and to the backing store.
  • Write-back (or Write-behind) – Writing is done only to the cache. A modified cache block is written back to the store, just before it is replaced.

Write-through(直写模式)在数据更新时,同时写入缓存Cache和后端存储。此模式的优点是操作简单;缺点是因为数据修改需要同时写入存储,数据写入速度较慢。

阅读全文…

分类: 程序开发 标签: 1,092次阅读

【Discuz】上传图片界面“浏览”“上传”按钮不显示文字的解决办法

2011年8月15日 6 条评论

点击发帖界面的上传图片按钮,界面上的“浏览”“上传”按钮文字没了,很奇怪,如图:

Discuz上传图片界面按钮不显示文字

Discuz上传图片界面按钮不显示文字

阅读全文…

分类: 程序开发 标签: 1,416次阅读

【Win7】快速启动程序与结束进程的脚本命令

2011年8月7日 1 条评论

写程序由于多线程操作的原因,关闭窗体时后台线程没有退出导致程序没有正常退出,一直用任务管理器来结束进程很不方便,于是想到了脚本命令,采用脚本后方便不少。

结束进程命令

taskkill /f /im ProceessName.exe

运行后会将进程名为ProcessName.exe的所有进程都强制关闭,至于taskkill命令的具体用法可以在命令行提示符下输入taskkill /?查看。

阅读全文…

分类: 程序开发, 软件技巧 标签: 1,128次阅读

【PHP】过滤不完整的UTF-8字符的函数

2011年8月7日 没有评论
用IE打开某个XML文件时提示“无法显示XML页”,具体错误为“文本内容中发现无效字符”。用Notepad打开文件后发现有不完整字符,如下:
不完整字符

不完整字符

于是也就想到写个函数来过滤,具体如下,实验有效

阅读全文…

分类: 程序开发 标签: 709次阅读

【PHP】过滤XML中的非法字符

2011年8月1日 没有评论

一般XML中如果含有&等字符,可以通过CDATA来过滤,但是含有一些不认识的特殊字符时候就会不起作用,下面是从别人那儿拿来的一个过滤方法,过滤xml中的非法字符:

//XML标准规定的无效字节为:

/*
0×00 – 0×08
0x0b – 0x0c
0x0e – 0x1f
*/

//所以很简单,输出的时候过滤这些字符就万无一失了,下面是PHP的实现。

/* PHP 实现 */
function XmlSafeStr($s)
{
return preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/","",$s);
}

原文无法访问http://zongfeng.bloghome.cn/posts/77742.html

p.s. W3C的XML规范中关于字符的定义请参看这里:http://www.w3.org/TR/2004/REC-xml-20040204/#charsets

分类: 程序开发 标签: , 845次阅读

【C】md5函数实现代码

2011年7月25日 没有评论

网上找到的md5函数的代码,试了一下,可以用,记录一下。包括三个文件,依次如下:

头文件md5.h


#ifndef MD5_H
#define MD5_H

typedef struct
{
    unsigned int count[2];
    unsigned int state[4];
    unsigned char buffer[64];   
}MD5_CTX;

                        
#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (y & ~z))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y ^ (x | ~z))
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))
#define FF(a,b,c,d,x,s,ac) \
          { \
          a += F(b,c,d) + x + ac; \
          a = ROTATE_LEFT(a,s); \
          a += b; \
          }
#define GG(a,b,c,d,x,s,ac) \
          { \
          a += G(b,c,d) + x + ac; \
          a = ROTATE_LEFT(a,s); \
          a += b; \
          }
#define HH(a,b,c,d,x,s,ac) \
          { \
          a += H(b,c,d) + x + ac; \
          a = ROTATE_LEFT(a,s); \
          a += b; \
          }
#define II(a,b,c,d,x,s,ac) \
          { \
          a += I(b,c,d) + x + ac; \
          a = ROTATE_LEFT(a,s); \
          a += b; \
          }                                            
void MD5Init(MD5_CTX *context);
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
void MD5Final(MD5_CTX *context,unsigned char digest[16]);
void MD5Transform(unsigned int state[4],unsigned char block[64]);
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);

#endif

阅读全文…

分类: 程序开发 标签: 967次阅读

【PHP】Fatal error: Cannot redeclare class的解决办法

2011年7月19日 2 条评论

写PHP代码的时候碰到这样的问题

Fatal error: Cannot redeclare class ….

从字面来看也很好理解,说明是重复定义了类,找了一下自己的代码,是因为存在同名的类导致的,修改了类名就好了。

再记一个网上找到的解决方法,可能在某些场合有用,先记着

if (!class_exists('pageModule')){
    require_once(PATH_site.'fileadmin/scripts/class.page.php');
}
分类: 程序开发 标签: 2,248次阅读

进程和线程的区别与联系

2011年5月11日 5 条评论

在提到操作系统和程序运行方式的时候,进程和线程是逃不开的话题,面试中问到,于是回顾总结一下。

概念

进程(process)是指在系统中正在运行的一个应用程序,是系统资源分配的基本单位,在内存中有其完备的数据空间和代码空间,拥有完整的虚拟空间地址。一个进程所拥有的数据和变量只属于它自己。

线程(thread)是进程内相对独立的可执行单元,所以也被称为轻量进程(lightweight processes);是操作系统进行任务调度的基本单元。它与父进程的其它线程共享该进程所拥有的全部代码空间和全局变量,但拥有独立的堆栈(即局部变量对于线程来说是私有的)。

阅读全文…

分类: 程序开发 标签: 1,508次阅读

【Discuz】完美集成进现有系统(整合用户和版面增删)

2011年5月8日 没有评论

之前写过《【Discuz】自动同步登陆的完美解决办法》,主要是解决Discuz的同步登陆问题,用户系统是采用UCenter进行管理的。

最近的一次应用是基本完成了业务系统,需要整合Discuz进去作为交流版块使用。于是,涉及到用户系统的整合和版面的增删操作。UCenter提供了API进行用户的增删管理,自然可以用,但为了保证用户id的统一性,暴力地绕过了UCenter API,而采用直接操作数据库的方式来完成用户增删,当然版面的增删也是操作数据库来完成。

1、增加用户到Discuz和UCenter的代码

$uid = 100;   // 用户编号
$username = "maple";  // 用户名
$password = "mypassword"; // 用户密码
$salt = md5((string)rand()); // 随机字符用于加密
$password = md5(md5($pwd) . $salt); // 加密后的密码
$groupid = 10;   // 用户组编号
$timestamp = time();  // 时间戳
$bbsemail = "i@witmax.cn";  // 注册邮箱,不能重复

execute_sql("INSERT INTO cdb_members (uid, username, password, secques, gender, adminid, groupid, regip, regdate, lastvisit, lastactivity, posts, credits, email, bday, sigstatus, tpp, ppp, styleid, dateformat, timeformat, showemail, newsletter, invisible, timeoffset) VALUES ('$uid', '$username', '$salt', '$password', '0', '0', '$groupid', 'Manual Acting', '$timestamp', '$timestamp', '$timestamp', '0', '0', '$bbsemail', '0000-00-00', '0', '0', '0', '0', '0', 'H:i', '1', '1', '0', '8')");
execute_sql("INSERT INTO cdb_memberfields (uid) VALUES ('$uid')");
execute_sql("INSERT INTO `cdb_uc_members` SET uid='$uid', username='$username', password='$password', email='$bbsemail', regip='Manual Acting', regdate='$timestamp', salt='$salt'");
execute_sql("INSERT INTO `cdb_uc_memberfields` SET uid='$uid'");

阅读全文…

分类: 程序开发 标签: 954次阅读