类别归档:Web开发

RSS feed of Web开发

最后更新于 .

最近一直在学python,的确为python的简洁所折服,因为工作中可能会经常用到python和c打交道的情况,所以研究了一下C语言扩展的写法,可能比较基础,让高手们见笑啦。

发现原来在windows和linux下面,对C扩展的编译方法是不一样的,我们先来看windows版的。

注:文章部分内容引用来自:
http://www.chinaunix.net/jh/55/563784.html

我们用C实现一个简单的加法。
首先新建一个文件add.c,代码如下:

#include <Python.h>;
static PyObject* add(PyObject *self, PyObject *args); 
//一定声明为static,把他们限制在这个文件范围里。 几乎所有的参数都是PyObject类型。 在python,每个东西都是object。 
static PyObject* add(PyObject* self, PyObject* args) 
{ 
    int x=0 ; 
    int y=0;
    int z=0;
    if ...

最后更新于 .

最近在编译项目的时候,出现的multiple definition的错误。仔细排查了.h文件的define定义等,最后发现是自己定义类的时候写法有问题。因为这个问题浪费了很长时间,所以特别记在这里。 做测试如下: 新建一个目录firstdef,在其中创建文件firstdef.h,代码如下:

#ifndef _FIRSTDEF_H_
#define _FIRSTDEF_H_
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
class CFirstDef
{
    public:
        void Show();
        void Error();
        void Test()
        {
            printf("Test\n");
        }
};
void CFirstDef::Show()
{
    printf("OK\n");
}
#endif

对应建立firstdef.cpp,代码如下:

#include "firstdef.h"
void CFirstDef ...

最后更新于 .

最近真的杯具了,完全陷入了写前台的恶性循环,倒是CGI的代码都没怎么动过……
好吧,不废话了,业务那边要求配置文件可视化配置,而配置文件是xml格式的。

所以js必须能做到对XML文件的读和写。

先贴上XML文件如下:

<?xml version="1.0"?>
<data>
   <fonts src="swfs/fonts.swf">
      <font id="headers" name="AvantGardeGothicDemi"/>
      <font id="normal" name="FranklinGothicMedium"/>
   </fonts>
   <assets domain="">
      <asset id="12345" src="assets/swfs/crop1.swf"/>
      <asset id="12344" src="assets/images/diy1 ...

最后更新于 .

js对cookie的几个操作函数,网上找的(仅作备忘)

function getCookieVal(offset) {
    var endstr = document.cookie.indexOf(";", offset);
    if (endstr == - 1) {
        endstr = document.cookie.length;
    }
    return unescape(document.cookie.substring(offset, endstr));
}
function getCookie(name) {
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    var j = 0;
    while (i < clen) {
        j = i + alen;
        if ...

最后更新于 .

最近在做公司的一个内部管理系统,因为自己php不熟,公司又没有asp.net的环境,所以自己最后居然用js+CGI的模式,运行速度倒是飞快了,编码却麻烦的要死……罪过啊,罪过,又不是外网……
废话不多说了,有一个问题就是要在调用我的CGI的时候,返回一个文件下载对话框。
好吧,在网上搜了一下,实际上只是http头里面有这样一段就可以了:

Content-Disposition:   attachment;   filename= %s\r\n\r\n

找到了php版如下:

$old_name = "E:\a.doc";
$file_name = "新文件名.doc";
if (!file_exists($old_name)) { //检查文件是否存在
    echo "文件找不到";
    exit;
} else {
    $file = fopen($old_name, "r"); //   打开文件
    //   输入文件标签
    Header("Content-type:   application/octet-stream");
    Header("Accept-Ranges:   bytes");
    Header("Accept-Length ...

最后更新于 .

现在代码中越来越多的使用单体类,而我们通常的编写代码的方式是:

在A.h文件中:

class CTest
{
    public:
        static CTest* _ins;
        static CTest* Ins()
};

在A.cpp中:

CTest* CTest::_ins = NULL;
CTest* CTest::Ins()
{
    if ( !_ins )
    {   
        try 
        {   
            _ins = new CTest();
        }   
        catch(...)
        {   
            return NULL;
        }   
    }   
    return _ins;
}

而实际上,上面的代码通过valgrind检查内存泄漏的时候,会告诉你内存still reachable,虽然实际上当进程退出的时候,这些内存是实际释放掉了,但是还是多少会对内存泄漏的定位产生影响,而且也不符合谁申请谁释放的原则。

我们可以简单的使用stl的智能指针解决这个问题,即代码更改如下:

在A.h文件中:

class CTest
{
    public:
        static auto_ptr<CTest> m_auto_ptr;
        static CTest* _ins;
        static ...

最后更新于 .

最近在做项目的时候,遇到一个问题,即结构体内的字段可能会在未来的时间内不停的增加(不会减少或者删除),所以在打包解包的时候就会涉及到版本兼容的问题,并且是向前和向后同时兼容。

我们先来看一下,如果结构体的内容永远不变,那么我们用结构体自解析的方法:


typedef struct _farmbase_land1
{/*{{{*/
unsigned char ID;
unsigned char bitmap;
_farmbase_land1()
{
ID = 0;
bitmap = 0;
}
int Output(unsigned int /*ver*/,char*& buff,int& iLen,int iMaxLen)
{/*{{{*/
int needLen = sizeof(unsigned char)*2;
if(needLen>iMaxLen)
{
return FBErrSystemNoMem;
}
char *t_Buff = buff;
*(unsigned char*)t_Buff = ID;
t_Buff+=sizeof(unsigned char);
*(unsigned char*)t_Buff = bitmap;
t_Buff+=sizeof(unsigned char);
iLen ...

最后更新于 .

编写代码的过程中,经常会输出一些调试信息到屏幕上,一般会调用printf这类的函数。
但是当调试解决之后,我们需要手工将这些地方删除或者注释掉。
再这次的项目中就用到类似问题,为了调试程序,再一些地方输出了很多的信息,随着项目的调试,输出的信息越来越多。于是就面临着,如何处理这些输出信息的语句。
简单删掉,不仅有一定的工作量,而且也不能保证之后就不出现问题,出现问题后这些信息还是有用的。
不去掉,带着调试信息就上线,这是明显不允许的。
于是就想到了一个可行的办法。如下:

void myprintf(char* fmt, ...)
{
}
#ifdef DEBUG
#define printf(fmt, args...) myprintf(fmt, ##args)
#endif


调试阶段带着DEBUG调试,正式上线就可以把printf变成一个空函数了。
这样做的一个潜在风险是可能会导致默写glib函数需要调用printf输出错误log也给取消掉了。
令人欣慰的是,大部分glib调用的应该是fprintf。
虽然问题解决了,但是我对args...以及##args还是不太了解。上网找了些gcc手册的资料如下:
带有可变参数的宏(Macros with a Variable Number of Arguments)
在1999年版本的ISO C ...

最后更新于 .

本篇主要是一些使用示例,由于部分代码是来源网上,原作者已经无法考证,所以如有原作者看到,可以告诉我,我给注明~

上一篇链接--libcurl的使用总结(一)

另:文末附有所有代码的打包下载,均在suse 10下编译运行通过

1.下载文件到本地

/*==============================================
#  Author:          DanteZhu - https://www.vimer.cn
#  Email:           dantezhu@vip.qq.com
#  FileName:        test_download.cpp
#  Version:         1.0
#  LastChange:      2010-03-09 14:20:44
#  Description:     
#  History:         
============================================*/
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include "curl/curl.h"
using namespace std;
static char ...