‘编程开发’ 分类的存档

  猫言猫语是我个人使用的小型微博,他的地址是:http://www.wuwx.net/status/,StatusNet默认是多用户模式的,需要看我自己发布的消息的话,则需通过:http://www.wuwx.net/status/wuwx这样形式的链接,也就是说需要在站点地址后加上我的用户名才能到我的个人页,一直想找个什么方式可以直接通过访问http://www.wuwx.net/status/就直接是我自己的页面。   刚开始以为要实现这个功能很复杂,看了下代码之后发现在StatusNet中直接有一个配置开关可以直接修改,直接在config.php中加一句话: $config['singleuser']['enabled'] = true;   StatusNet是不是非常地好用、方便呢,快一起来搭建吧!

2010年3月30日14:00 | 2 条评论
分类: 编程开发
标签:

  这篇有点像GoogleAdsense的姐妹篇哈,一篇讲的是广告,一篇讲的是统计,方法同样的简单,在config.php中增加如下配置信息,这个code的值用你的跟踪代码的值去替换他: addPlugin('GoogleAnalytics', array(    'code' => 'UA-440814-12'));   然后就可以保存退出,StatusNet会根据你的配置信息,自动在页面需要的位置加上GoogleAnalytics的,等上几个小时,你就可以在你的GoogleAnalytics帐户中看到StatusNet相关统计了!

2010年3月29日23:23 | 没有评论
分类: 编程开发

  之前猫言猫语曾写过一篇文章介绍在StatusNet中如何设置Google Adsense,这篇文章是那篇文章的后续,将更详细地介绍如何设置Google Adsense。   在那篇文章中,我们很简单地说在使用插件的时候,设置client参数与rectangle参数就可以了,实际上,在Adsense的插件配置中,更完整的配置参数应该如下,由于我现在不想显示广告了,所以我把这些都注释掉了: addPlugin('Adsense', array(    'client'             => 'pub-7713123285728231',    //'mediumRectangle'    => '3223858592',    //'rectangle'          => '3223858592',    //'leaderboard'        => '3223858592',    //'wideSkyscraper'  => '3223858592',));   除了rectangle之外,还有另外三个参数,mediumRectangle,rectangle,leaderboard,showWideSkyscraper本身是数组的“key”,而他们的“value”则是广告的slot,除此之外,这几个参数还代表着在不同的位置按照不同的大小来显示广告,例如mediumRectangle是300x250,rectangle是180*150,leaderboard是728*90,而wideSkyscraper则是160*600,具体显示在哪个位置大家实践下,我就不一一列举了。

2010年3月29日23:12 | 没有评论
分类: 编程开发

  DreamHost已经支持StatusNet一键安装,按道理对StatusNet支持应该非常好,实际支持的可不太好,在尝试使用twidroid的时候,却发现无法通过验证,又是一顿检查代码,发现是因为PHP_AUTH_USER与PHP_AUTH_PW这两个环境变量没有传递到PHP脚本中导致的。   DreamHost中PHP是使用fcgi方式运行的,很可能是fcgi配置的时候把某些变量给抛弃掉了,我们需要重新给他加回去: <IfModule mod_rewrite.c>  RewriteEngine on  RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]</IfModule>   这样整个StatusNet重写规则看起来就是: <IfModule mod_rewrite.c>  RewriteEngine On  RewriteBase /status/  RewriteCond %{REQUEST_FILENAME} !-f  RewriteCond %{REQUEST_FILENAME} !-d  RewriteRule (.*) index.php?p=$1 [L,QSA]</IfModule> <IfModule mod_rewrite.c>  RewriteEngine on  RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]</IfModule> <FilesMatch "\.(ini)">  Order allow,deny</FilesMatch>   这个重写规则改天需要仔细想想原理。

2010年3月13日02:15 | 没有评论
分类: 编程开发
标签: ,

  效果是不是也很不错呢?  

2010年2月2日13:47 | 4 条评论
分类: 编程开发
标签:

  每次安装过程都太漫长了,有些东西还得改,还是记录下来的好,省得自己总忘。首先从官方网站下载omnetpp的安装包:http://www.omnetpp.org/omnetpp,我下的是win32版本的,我实在不喜欢在Linux下用图形,所以还是来个Windows的直接点,虽然大家很B4用迅雷下载,不过我还是建议你在这个时候使用迅雷,可以节省你很多时间。 下载完成后,打开下载完成的文件,然后解压缩到C:\的根目录,并把目录名改为omnetpp,其实不改也行,就是我比较习惯改,改完看着爽。 ,打开这个目录后,里面还是一堆烂七八糟的文件: 看到这个没,打开他就行。如果你机器里没有JRE的环境,自己去Sun网站上去下载一个吧。      打开MINGW32后,介绍的十分清楚,先运行./configure,再运行make,之后输入omnetpp就可以启动了!不过需要提醒各位的是,这个过程很慢很慢……跟编译一次Linux内核所要花费的时间有一拼,特别是那些还用着P4老CPU的同学们,为了社会主义事业,赶紧换个牛X的CPU吧!   ./configure之后是一堆Good提示: ,不是Good提示怎么办?重新下载重新配置吧,我也没啥好着,这着比较容易,能用几回OMNET++啊,非要搞的那么清楚干什么。   make就是正式开始编译,这个过程就是嗷嗷效果时光啊,要知道,一次make过程至少可以写两三篇博客了,可以利用这段时间到厕所大便,小便,喝茶,听歌等等一些事情!   ………………………………………………………   上面的那个大省略号,就是我make过程中,往里打了一堆Fxxx,CaO一类的词语,后来又删掉了,足可见这个过程是有多么地无聊,多么地无聊,用这段时间,我随便写两句:其实OMNET很强大,他的处理机制还是很灵活的,基本上你的模块要是设计的好,可复用的可能性还是比较高的,前提是你得按照他的套路出牌,你不能按斗地主的方式出双扣升级的牌对吧,他里面一些模拟效果都是比较绚的,否则你自己去安装环境,再去模拟,基本上都是搭个现实环境了,累死你!不过要是让你熟悉OMNET++其实也够你受的了,可能你搭一个XX环境只要一天,熟悉个OMNET得半年,真的,我不骗你,真的得半年,可能我比较笨,反正我花了半年时间也没熟悉了他,实在太复杂了。   make完之后,提示 ,这个时候你输入omnetpp就可以启动了。 ,硬盘一顿狂闪,OMNET++4来了!   

2010年1月9日11:50 | 没有评论
分类: 编程开发
标签: ,

  由于PHP4版本已老,PHP官方已不再对其维护支持,官方站上的PHP版本目前只有5.2、5.3、6.0的PHP下载,而一些老项目还是使用PHP4编写的,而存在一些版本兼容问题导致还无法迁移到PHP5,这样在重新部署环境的时候就需要下载PHP4了。   由于官方不直接提供PHP4的下载,我们就需要自己找,Google之后,发现一站点:http://museum.php.net/,上面的PHP版本还挺全的,甚至连PHP1都有,是不是很雷人呢……,有需要老版本PHP的赶紧收藏下来,否则以后又找不到了。

2009年10月13日09:46 | 没有评论
分类: 编程开发
标签: ,

测试方法,新建一个名为User的PHP类,循环1000000次读取相关属性测试。 第一个测试,设置$username为私有方法,在循环内部生成类对象,使用__get获得其值 <?php class User { private $username; public function __get($name) { return $this->$name; } } for ($i = 0; $i < 1000000; $i++) { $user = new User; $user->username; } ?> real 0m4.487s user 0m4.192s sys 0m0.291s 第二个测试,设置$username为公有方法,在循环内部生成类对象,直接获得其值 <?php class User { public $username; public function __get($name) { return $this->$name; } } for ($i [...]

2009年9月24日08:04 | 3 条评论
分类: 编程开发

  目前Web应用的缓存方式多种多样,有APC,File,SQLite,Memcache等等各种类库实现着不同的缓存方式,如果单纯按他们的性能高低对他们进行选择,那将毫无意义,不但不会使你的应用加速,反而有可能给你带来灾难的后果,只有通过了解他们的实现方式,根据具体应用具体选择,才会使缓存系统发挥出最大的性能。   按照缓存系统存储方式不同,可以将缓存系统分为基于内存的缓存与基于文件的缓存。   PHP中,APC恐怕是最典型的基于内存的缓存,速度超级快,读写一个简单的32字节的字符串,可以达到1000000次/秒,这样的读写速度几乎可以忽略掉由于引入了额外的缓存系统而带来的性能消耗。   而对于基于文件的缓存系统来说,ZendFramework有一个基于文件的后端缓存实现(File)比较典型,基于文件的缓存系统具体读写速度没有做过评测,其性能由于受到磁盘IO的限制,所以远远不如内存型缓存速度来的快。   基于内存、磁盘这两种存储方式的基础上,通过存储不同格式的文件,或者提供不同的访问接口我们就可以实现不同的缓存系统了。例如最近非常流行的Memcache,就是在内存存储的基础上提供Socket的访问方式。再例如MemcacheDB,就是在将存储方式更改为磁盘文件,而访问方式不变。   按照缓存系统的可访问范围来分,又可以分为进程级缓存,单机缓存,分布式缓存。   同样的,APC同样是进程级缓存的典型代表,一个PHP FastCGI主进程就会开启一段APC SHM,并且与子进程共享,而多个PHP FastCGI主进程之间的APC SHM相互独立,无法共享,这恐怕也是APC缓存的一大缺陷。   文件型缓存则是单机缓存的代表,假如我们曾经将PHP的Session存储在文件内,一定会遇到多个Web服务器共享缓存的问题,这正是受文件型缓存访问范围的限制导致的。   分布式缓存系统则以Memcache为代表,他提供一个基于Socket的访问方式,使得该缓存系统支持远程读写访问。尽管这个缓存的内容可能是存在内存中,也可能是存在文件内。   其实话说回来,从本质上说,不同的缓存系统就是数据存储方式的不同与数据读写方式的不同,不同的存储方式与不同的读写方式的组合,造就了今天缓存系统百花齐放的场面,只有针对具体应用,判断各个缓存系统优缺点以及局限性,才能选择出最适合自己使用的缓存系统。

2009年8月30日17:22 | 没有评论
分类: 编程开发

  论坛里有UA用户,并有GA,GB两个用户组。GA用户组设置的是允许发表悬赏帖,GB用户组设置的是不允许发布悬赏帖。UA用户属于GA用户组。   UA用户发了一个悬赏帖,悬赏1000,后来UA用户从GA用户组变成GB用户组了,然后他去编辑自己发的悬赏帖,保存的时候,就会发现悬赏金额从1000变成0了。   原因是因为Discuz 7在用户编辑帖子的时候,会判断用户是否允许发布悬赏帖,如果用户被禁止出售悬赏帖,其中的$price变量就会被用于他用,于是赏金就没了。   至于解决方法:让GA和GB这两个用户组都能发悬赏帖就可以了……

2009年8月3日13:04 | 3 条评论
分类: 编程开发
标签: ,

  ActiveRecord有一个功能,如果你的数据库中有一个字段名为“type”,在返回结果时,他将自动使用type字段中的值作为模型类的类名来实例化该结果,这样原始的模型就纯粹退化为DAO类了。   不过我有一个老应用,某个表中恰巧有一个“type”字段,里面又记录着一些奇怪的值,我又不能把这个字段改名,于是我就只能想办法让ActiveRecord把这个字段名给忽略掉了。   其实忽略的方法也挺容易的,写个:“set_inheritance_column nil”就可以了,放到真正的ActiveRecord代码中可能看起来会象这样:      看起来挺简单的,不要要是找不着,真够你郁闷一阵子的。

2009年6月24日17:57 | 没有评论
分类: 编程开发

  从图中可以看出,在Zend Framework Controller分发流程中,Request Object几乎贯穿了整个框架的处理流程,假如程序的本质是I/O,Web的本质就是Request/Response。   整个处理流程中,组件只与Request Object发生耦合,Router通过读取Request Object中的值,再适当地更改其部分值,为Dispatcher指明方向,生成适当的具体控制器类,达到路由的效果。   在各个处理流程中各个组件可以被替换,藕荷度小,符合设计模式,看上去很美。  

2009年5月20日09:32 | 没有评论
分类: 编程开发
标签: , ,
Page 1 of 212