当前位置

技术

技术

关于 web 服务器获取使用 proxy 的客户端源 IP

1. 标准实现的 proxy 会在代理的请求中增加一个 HTTP 头部 X-Forwarded-For,记录源 IP 信息

2. 对于多级 Proxy 代理的,会在 X-Forwarded-For 字段后增加信息,比如
X-Forwarded-For: client1, proxy1, proxy2

3. PHP 可以通过 $_SERVER['HTTP_X_FORWARDED_FOR'] 获取该头部字段,然后判断该变量是否存在,再决定是否采取 $_SERVER['REMOTE_ADDR']

4. 也有 apache module 让这一切对编程者更加透明,请参考 mod_extract_forwarded

启动该模块后,可以统一采用 $_SERVER['REMOTE_ADDR'] 了,同时可以通过 $_SERVER['PROXY_ADDR'] 来获取实际连接的 proxy 地址

Topic: 

针对程序员的网摘 CodeNote

无意中发现 codenote, 完全是针对程序员的..

几个疑问:

a. 如此垂直的 Web 2.0 商业上能成功吗?更何况是在竞争众多的网摘服务市场

b. 程序员同样是普通人,我的 link 里面也并不局限于技术,CodeNote 的内容是否会越来越多样,然后丧失自己的特色呢?

c. 对于寻找信息的人来说,它真的会比 google/baidu 还好用吗?

关键点可能还是定位。服务对象现在很清楚了,但竞争对手是谁,合作伙伴是谁,服务价值怎么去体现,CodeNote 可能还有很多东西要继续摸索。

Topic: 

cvstrac

在看 cvstrac 的时候发现它包括了 honey pot 功能,感觉对防 baidu 的爬虫还是挺管用的,而且也不担心被访客误点击。

trac 很久以前就看到有开源项目在运用,而 cvstrac 我才是最近刚刚知道,真是有些孤陋寡闻。其实我就只是想要timeline功能,检查每个人每天的 check-in 和注释(它还包括 RSS 输出),但试着在我们的 email 上导入,cvstrac 运行失败... 看来还需要花时间慢慢检查.

cvstrac 可以以 inetd/standalone/cgi 三种方式运行,挺强的,只不过用 c 来做字符串处理太让看代码的人郁闷了.. 如果现在开始一个新项目,svn + trac 确实是不错的 SCM 解决方案.

Topic: 

端午logo

端午节    2006年端午节

呵呵,我感觉百度的美工水平似乎稍差一点。

端午毕竟是“小节日”,因此英文Google首页上还是最普通的logo,这倒也罢了,让我郁闷的是台湾Google也是普通的logo。

另外,百度明显不在乎自己的网页是否支持Firefox浏览器,要么就是制作网页的同学没有弄清title属性和alt属性的区别,在Firefox里,鼠标移到百度的端午logo上后,没有“2006年端午节”的文字提示。

点链接进入相关网页,原来百度的这个logo是端午节的民间画。百度的想法很好,希望它能达到好的效果吧。

Topic: 

Blogchina To Drupal

三月初,注册了一个域名dup2.org,作为我和我哥的个人网站,并于第一时间在上面搭了一个Drupal的blog服务。于是我面临了许多blogger都曾遇到的一个痛苦问题——搬家。虽然我的blog不多(127篇),就算重新发布一遍工作量也不算太大,可是如果搬家不把blog的发布时间也同时搬过去,意义不大。

上个周末的目标就是和我哥解决这个搬家的问题。我的想法是把所有blog都先下载到本地,用perl或者其它脚本语言把blog的标题、发布时间、正文内容从这些本地文件中抽取出来,然后分析Drupal的数据库表结构,再写个程序把这些抽取出来的东东插入到数据库中。其中难点是1.perl不熟悉,需要再学习;2.研究Drupal的程序,找出存数据库中存blog的表结构;3.需要找找perl的数据库操作范例依葫芦画瓢写个插入数据库的程序。

周六白天去了植物园,下午五点来到哥哥家,他已经用python写了个程序提取blog中的数据(利用python中现成的库把html变成xml,然后取对应标签中的数据。可是这个程序碰到blog中含有表格时,处理的结果有问题)。同时又找了一个Drupal的模块Node Import,通过此模块可以把CSV文件(用逗号分隔字段的文本文件)直接导入到Drupal中。这样一来搬家任务几乎就没啥障碍了,如果提取的数据没有问题,只需把python再顺便做一个CSV文件出来就搞定了(以后再有类似需求,首先想到的就是python而不是perl了)。

在我的注视与参与下,重新写了一个python程序,抛弃了html转xml的思路,直接按字符串处理html(顺便我也领略了python的简单强大的字符串处理方法),把需要的数据完美地从blog中提取出来:)。因为CSV文件要用“,”分隔字段,为了避免混淆再把数据中的“,”变成别的符号;将日期处理成模块中要求的格式;当然最后还要把数据变成UTF-8编码,用iconv命令,这我哥熟,交给他搞定了。

公元二○○六年四月一日晚十时许,先备份数据库(万一失败,还可以恢复),开始导入,几十秒过后,导入完成,进入blog页面检查,搬家成功。

附件大小
图像图标 bokee2csv2drupal.png22.9 KB
Topic: 

当用 Python ctypes 模块调用动态链接库,如何传入一个结构体指针

最近用 dv2xvid 这个东东很多,上两周几乎每天都用它跑一个晚上压缩2个小时的视频。于是又萌发了把它改进得更通用的念头。

目前 dv2xvid 有一个很严重的问题,就是只支持 xvid-1.1.0-beta2 的压缩。而事实上目前大家用的最多的是应该都是正式版本,比如 1.0.3 或者 1.1.0 之类。如果想能支持更多版本的 xvid codec,就必须能在压缩之前判断 xvid 的版本。

恶心的是安装的 xvid 的目标文件没有 Windows Dll 的版本属性,查了半天,调用 xvidcore.dll 里面的一个函数可以获得 xvidcore.dll 的版本号

  1. #include "xvid.h"
  2.  
  3. {
  4.   xvid_gbl_info_t info;
  5.   HINSTANCE m_hdll;
  6.  
  7.   memset(&info, 0, sizeof(info));
  8.   info.version = XVID_VERSION;
  9.   m_hdll = LoadLibrary(XVID_DLL_NAME);
  10.   if (m_hdll != NULL) {
  11.     ((int (__cdecl *)(void *, int, void *, void*))
  12. GetProcAddress(m_hdll, "xvid_global"))(0, XVID_GBL_INFO, &info, NULL);
  13.    
  14.    printf("xvidcore.dll version %d.%d.%d (\"%s\")",
  15.                 XVID_VERSION_MAJOR(info.actual_version),
  16.                 XVID_VERSION_MINOR(info.actual_version),
  17.                 XVID_VERSION_PATCH(info.actual_version),
  18.                 info.build);
  19.  
  20.     FreeLibrary(m_hdll);
  21.   } else {
  22.     printf("xvidcore.dll not found!");
  23.   }
  24. }

如果在 python 里面做到这个事情,可以通过 ctypes 模块来完成。但查遍 ctypes 有关的中文文档,都没有关于怎样在函数中传入结构体指针的说明,只能自己 google 之,后来发现应该这么来做:

  1. from ctypes import *
  2.  
  3. ### 定义结构体
  4. class xvid_gbl_info_t(Structure):
  5.     _fields_ = [("version", c_int),
  6.                 ("actual_version", c_int),
  7.                 ("build", c_char_p),
  8.                 ("cpu_flags", c_uint),
  9.                 ("num_threads", c_int)]
  10.  
  11. XVID_GBL_INFO = 1
  12.  
  13. dll = cdll.load("c:\\windows\\system32\\xvidcore.dll")
  14. xvid_global = dll.xvid_global
  15.  
  16. ### 构造 pinfo 结构体, 然后赋值
  17. pinfo = xvid_gbl_info_t()
  18. pinfo.version = ((((1)&0xff)<<16) | (((0)&0xff)<<8) | ((0)&0xff))
  19.  
  20. x = c_voidp(0)
  21. y = c_voidp(0)
  22. ### 用 byref 传入指针
  23. if xvid_global(x, c_int(XVID_GBL_INFO), byref(pinfo), y) == 0:
  24.     major_version = (pinfo.actual_version>>16)&0xff
  25.     minor_version = (pinfo.actual_version>>8)&0xff
  26.     patch_version = (pinfo.actual_version>>0)&0xff
  27.     print major_version, minor_version, patch_version
  28.     print pinfo.build
  29.     print pinfo.cpu_flags
  30.     print pinfo.num_threads
  31. else:
  32.     print "ERROR"

另:最近一周: qyt 完成了 blog 搬家, www.dup2.org 已经通过 ICP 备案. Logo 和 favicon 也正在热情实施中...(不得不承认我弟比我有美术天赋)

Topic: 

Mozilla Relicensing Complete

当我昨天(4月1日)从订阅的"mozillaZine feedHouse"读到这条新闻时,第一反应就是"这个应该是 mozilla 的愚人节玩笑了",Mozilla 以罕见的tri-license发布,开什么玩笑。

但是从 Mozilla 许可证网页以及其 FAQ 上,他们似乎是认真在做这件事情耶。所以到今天(4月2日),我想可以确认这是真真切切的事件了。

把原有的代码转换License是一件无比麻烦的事情,对于哪些在 NPL 条款下的贡献代码而言还轻松些,因为 NPL 确保 mozilla 可以把贡献代码按任何许可协议发布,但对于那些以 MPL,或者 MPL/GPL dual-license 的贡献代码而言,就必须一个一个的取得贡献者的许可......于是 "After four and a half years, 445 contributors and 28522 files",mozilla 终于完成了这一步.

现在,用户可以选择:
1. MPL,将 mozilla 代码和自己的代码混合在一起编译出专有软件,只需发布出 mozilla 相关的那部分代码就可以
2. LGPL,将 mozilla 代码和部分LGPL代码(可能自己编写)编译出一个链接库,然后配合自己的专有软件发布
3. GPL,将 mozilla 代码和 GPL 代码或者库混合在一起发布新的软件,比如在地址栏或者搜索框里调用 readline 做编辑..

总之,在这样的授权下,mozilla 期望,"making our code available to as wide a group of developers as possible, as part of our mission to promote choice and innovation on the Internet. We hope that this will enable people to build even more cool and innovative products."

 
Topic: 

筹划中的 blogchina -> drupal 搬迁

早就答应负责把 qiuyingtao.blogchina.com 搬过来的技术任务,计划这个周末抽时间来弄。上 Drupal.org 找了一下,看起来只有 "Import HTML""node_import" 这两个现成的 module 可以用,其中又以 "node_import" 似乎更加靠谱。

计划如下:
1. 将 blog 文章全部从 blogchina 取出来。flashget 似乎可以直接搞定
2. 写一个 html 处理脚本,分离出需要的正文内容,时间等信息
3. 安装 node_import 模块,测试确认该模块符合需求,然后确认导入 CSV 的格式
4. 制作 csv 并且导入.

不晓得一个晚上能否搞定,阿门...

Topic: 

报告的 Firefox Trunk(Firefox 3.0) 的 Bug 终于有人写 patch 了.

当基于 Cairo 的 Trunk 第一时间正式成为 win32 缺省 build 的时候,偶就下载了一个试用,结果立刻发现浏览中文网页有 Bug:https://bugzilla.mozilla.org/show_bug.cgi?id=328940

patch 来看,Mozilla 的开发好像也不是很难.

什么时候这个问题解决了,再继续使用 Trunk build

Topic: 
订阅 RSS - 技术