« January 2007 | Main | March 2007 »

February 24, 2007

从apache扒出来一段string代码

c 里面字符串处理很讨厌,比如要append东西,就要memset,memcpy,malloc来回折腾,很麻烦。

我问tiny,这种东西大家每次用都自己写一个,难道就没有一个通用的吗?都这么多年了...tiny说都是自己写的。说的也没错,其实这东西就是基本功,应该顺手就能写一个linebuffer出来。但是他还是麻烦啊。字符串处理是内存相关的,大概是c最难掌握的技巧之一了。

我觉得C++比C好学的原因之一就是C++的std下面提供了很好的字符串类。

翻了几个著名的opensource项目,最后我从apache httpd里面扒出来这几个字符串处理函数,还不错。用起来也很简单。
就这样就可以:

MWA_STRING string;
apr_pool_t *pool;
init_string(&string, pool);

append_string(&string,"1111",0);
append_string(&string,"2222",0);
printf("%s",string.data);

用append往上增加字符串。

代码在:
http://blog.devep.net/virushuo/2007/02/24/mwastring.c
http://blog.devep.net/virushuo/2007/02/24/mwastring.h

update :
令狐虫 提醒,这个模块是mod_ WebAuth的一部分。他说的是对的。我是从apr_pool_t开始扒的,故有此错误。谢谢提醒。

关于许可证的问题,我怎么记得mit/bsd都是非继承的许可证呢?应该不用再声明吧?

February 14, 2007

drupal 在 php5.2.0 下session丢失的处理办法

php 5.2.0中,drupal的session总是被设置为uid 0 由此造成了用户无法登录和获得权限。

这似乎是5.2.0中改动的内存管理所导致的。

解决方法很简单,用session_write_close() 即可。

在index.php的 drupal_page_footer(); 之后,加上1行: session_write_close();

就可以了。

http://drupal.org/node/92802

这里有更详细的讨论。

update: 更简单,更可靠的办法:

修改includes/session.inc
在function sess_read($key) 中,加上:
register_shutdown_function('session_write_close');

February 8, 2007

给drupal增加多用户自定义模版的功能

某些原因,要用一下drupal。drupal是套很好的cms系统,当然也可以做blog用。优点自然不用说了,功能强,灵活,缺点也很显然。眼前就有三条:

1 效率太低,四处都是查询,一个页面打开估计没30次查询也要有20次。
2 插件水平差距太大。写成什么样的都有,快的慢的,好的坏的,虽然看起来大体一致,不过差距还是很大的。
3 blog这个模块只能算入门,距离可用还差很多。关键就是没有模版。单用户的时候好办,多用户的时候,就麻烦了。

我下面做的事情就是再试图解决多人blog模版这个问题。当然了,我也懒得花太多时间在上面,所以同样犯了“插件水平差距太大”的错误,不过好处是效率还不算太白痴,界面虽然也不怎么样,但是至少能用。反正如果你正好碰上这个问题,不妨参考一下。我是在drupal.org上翻了个遍也没找到合适的东西。

一 原理

所谓自定义模版,其实就是自定义css,无论是mt还是wp的模版,其实在页面结构上是确定的。两栏还是三栏都是确定的,除了整个换模版的结构,一般不好改,当然也没必要改。我们也按照这个思路,做一个常用的两栏模版。想更复杂其实也不难,不过就要改动blog.module这个模块了,为了维护和升级方便,我不想动这个代码。

那么我们做的就是,提供用户可以输入的html代码,作为左栏,提供用户可以修改的css代码,以便修改样式。因为左栏是html代码,用户就可以随意的往里面加入div的块,于是就可以方便的增加blogroll或是日历或是什么其他需要的功能。通过样式又可以调节这些模块的风格,这就基本够用了。

那么我们要做的事情其实就是:

1 提供一个模块
2 将这个模块作为block装入blog和node页面

虽然简单,但是并不简陋。要知道,wp的著名插件sidebar的原理也是这样的,我只是让他简单一点,界面简陋一点,但是功能可不差什么了。

二 模块
drupal的模块挺让人头疼,因为方法太多,四处都是回调函数,初看比较复杂。其实简单用几个方法就能完成了。恩,我的方法应该是比较笨,不正统的,但是的确能用。也好理解,所以我暂时也没打算改。

首先要注意的是hook这个词,在真正写函数的时候,要被写成模块的名字。比如说你写test.module,那么下面所有hook_的地方,都应该被写做test_。这样就对了。

我们要知道的几个回调函数是:

hook_help($section)
这个函数是为了让你的模块能出现在admin/modules的列表中。
hook_perm()
这个是为了定义访问权限
hook_access($op, $node)
让权限在admin/access control里面可以被分配给用户。
hook_block($op='list', $delta=0)
这个是真正生成block代码的地方了。重点。

行了,知道这4个函数,我们就可以开始开发了。

我把这个模块名字叫做yxsidebar.module (银杏sidebar,哈哈)
于是我的help函数就是这个样子的:
function yxsidebar_help($section)
{
switch ($section) {
case 'admin/modules#description':
return t('blog sidebar for Drupal.');
}
}

这样,在模块列表里面就能看到叫做yxsidebar,描述是“blog sidebar for Drupal.”的模块了,可以启用或是禁止。

然后就是
function yxsidebar_perm() {
return array('view style', 'edit style');
}
我只定义了浏览和编辑两种权限。具体用途后面说。

重头戏
yxsidebar__block($op='list', $delta=0)
代码长,不一一解释,只说需要注意的。

if(arg(0)=='node')
{
//if this node type is a blog ? and who owner this blog?
$sqlstr="select uid from node where nid=".arg(1)." and type='blog'";
$node= db_fetch_object(db_query($sqlstr));
$uid=$node->uid;
}
else if(arg(0)=='blog')
{
$uid=arg(1);
}
这个目的是只让我们定义的模版在blog相关的页面才出现。
blog相关的页面特点是,路径中包含了/blog/的,和数据库中type为blog的node。
所以需要到数据库做一次SELECT,确定node是否为blog类型。这地方就犯了我最开始说的第一个毛病--查询次数太多,降低效率,但是也没别的办法啊。这种“一切皆是node”的架构最大的缺陷大概就是这里了。我相信应该还有更简单的判断方法,但是我不知道⋯⋯这也是最开始说的问题2的原因。不是所有开发者都能把那么厚的文档熟读的。很多时候,我只是为了简单的做个功能,并没打算做drupal专家。

闲话说完,继续。

if(is_numeric($uid))
{
$styles= db_fetch_object(db_query('SELECT * from blogstyle where uid='.$uid.' limit 1;'));
if($styles)
{
$block['content'] .="\r\n".''."\r\n";
$block['content'] .="\r\n

\r\n".$styles->template."\r\n
\r\n";
}
}
}
这个简单,是接着上面的,就是如果$uid是数字,也即为blog相关页面,那么就从数据库取出这个用户的模版,放在block的content里面。在我这个例子中,数据库里面存放的只是css文件的名字。如果存放css代码,原理也类似,需要的话,自己改吧。

下面的代码比较长,简化一下就是:
if (user_access('edit style'))
{
if(arg(2)=='edit')
{
}
else if(arg(2)=='save')
{


这样的。用法就是,先判断是否有edit权限(记得hook_perm()里面的定义了吗?),如果有的话,就做一些动作。我在这里定义了form,用户可以提交修改。这个手法可能也不太正宗。不过目的是达到了。

就这么简单。如果进一步发挥,可以让界面更好一点。比如定义几个块,让用户直接选择,而不是和我这样直接用textarea直接写代码。这些都是锦上添花的事情了,也不难。按照这个原理,相信很容易做出来。

完整的代码放在下面了。yxsidebar.install我懒得写了,反正就是建个库存东西,按照自己的需要来吧。没什么难的。


yxsidebar.module

February 3, 2007

找个咖啡厅做办公室

我和tinyfool开始创业“银杏咨询”之后,一直没固定的办公室。也考虑过租个地方,但是又实在不喜欢写字楼那种气氛。

后来,某天提起伙聚无线公社的时候,终于想起了我们可以找个咖啡厅做办公室,有吃有喝,气氛又好,房租的钱用来消费,自己也不用再操心什么水电上网清洁之类的问题,有客户来还可以在相对轻松的环境谈谈合作什么的。相当的不错。说起来这办法也不是我们第一个用的,douban在咖啡厅做出来的,zhuaxia也用咖啡厅做过会客室。中国人没有车库,没准能从咖啡厅里面成就几家不错的公司呢。说了就做,于是我们今天就开始了选址工作。

今天下午,我们沿着两广大街溜达,看到合适的地方就进去喝点东西,顺便测试一下沙发是否舒服,电源是否好用,网络快不快之类。

当然了,最靠谱的仍然是伙聚的那个wifi地图上标出来的那些家,网络一点都不含糊,好用的很。不过其他地方的结果也令人惊喜--现在在街上随便一搜索就能找到很多开放的wifi,当然都是别人家或是公司用的。大多可以连上。在麦当劳,在KFC,都可以通过这种偷用的方法来用。当然稳定性就不好要求了,谁知道人家什么时候关机呢。

这个测试结果很令人惊奇,现在无线的普及性已经广的令人吃惊了。tiny立刻萌发了买个带有wifi功能的pda的念头,不过想想iphone快出来了,将来用那个东西肯定爽。

当随处都可以无线的时候,生活肯定又有大规模的改变了。我们与世界任何东西的距离大概都只有一条网线和一次google,现在遍地的无线,让我们连网线都省了。

想想看,如果把天坛都覆盖了,把故宫都覆盖了⋯⋯多好玩啊。想起来google要建的免费wifi,还是很值得期待的。当然伙聚做的也很好,托他们的福,我们的咖啡厅办公室的计划才可以实现。

今天的考察中,我们很喜欢天坛附近的莫奈咖啡,可惜那地方只能靠偷用别人的wifi。我跟胡狼抱怨那地方他们没覆盖,胡狼立刻答复说周一就让人去谈合作。天啊,都不知道怎么感谢他们,这世界真是太美妙了:D

about me:
me.jpg
CC License. Some rights reserved.
署名·非商业用途·保持一致
本站之所有未作特别说明的内容均使用 创作共用协议.
POWERED_BY_MT_3.2