技术

最近看到的一些消息

觉得放到 link.eyou.com/qiuyingbo 不大合适,还是写到 blog 里面罢

1. google 访问不通畅和局域网内有人安装 Google Desktop 有关系

2. firefox trunk nightly build 已经开始支持 javascript 以外的脚本语言来操作 DOM 了... 够 cool 吧。首先支持的是 python,用 type="application/x-python" 来表示内嵌的脚本不是 JavaScript 而是 python. 不过我还没有尝试...

3. 利用 SVG 来操作网页对象的功能已经实现,比如旋转网页什么的,可以看这个链接的截图。该功能我已经运行最新的 trunk build 验证过,没有问题

前不久 trunk build 浏览 dup2.org/blog 就 crash 的 bug 也解决了,虽然 opera 9 也有很多好的特性,但比来比去,还是 firefox 看起来更酷一些

Topic: 技术

SMS, Cool!

这里说的 SMS 可不是那种用来抢钱东西,而是 Mac 笔记本上的 Sudden Motion Sensor (紧急动作感应器),IBM 从 R50/T41/X40 开始也装备了类似的技术,不过名字叫 APS (Active_Protection_System)

上周为了解决 AMD64 下网卡不通的问题,亲自动手下载了最新的 linux kernel source 去编译,结果在查看编译选项的时候看到了支持 IBM ThinkPad 硬盘主动保护的模块。立刻就想起前不久同事说的苹果笔记本上,拍屏幕即可切换桌面的技术。上网搜索,发现这项技术最热门的应用是 MacSaber,模拟星球大战里面光剑的嗖嗖声的效果. 见下面的演示:

切换桌面的程序叫SmackBook Pro. 效果见下面的演示:

对于 ThinkPad 用户来说,好消息是类似的开发已经有人在进行了,但是还不够好用.. 呵呵,希望有一天可以在 ThinkPad 上拍屏幕来切换 Gnome 桌面..

也有别人在尝试用这个技术研制笔记本防盗,呵呵,比上述的两个应用有用多了,但是就不够酷了..

Topic: 技术

近期的几个发现

1. >2GB 文件

碰到过好几次 apache log 撑爆 2G 的悲惨事件... 那么,怎么开发支持 >2G 的文件呢??

找到一个关于此问题的站点,http://ac-archive.sourceforge.net/largefile/index.html,刚刚发现。强烈推荐...这里仔细介绍了 Largefile 在各个平台上支持的情况

研究下来,觉得支持 >2GB 不难,现代的 C 库都已经包装的很好了。http://ac-archive.sourceforge.net/largefile/programming.html 说的很清楚

2. 虚拟化

VMware Player是一款免费产品,但它不能创建虚拟机,只能运行一个已经存在的虚拟系统。有人介绍了两个创建虚拟机的方法,一个是 VMX Builder 这个本地应用程序来运行,另一个就更酷,EasyVMX.COM 可以在线定制一个虚拟机下载.

vmmatrix开源软件镜像下载服务用过不少次,昨天才想起来看看这个到底是一个做什么的公司. 发现他们原来是提供虚拟主机服务,就是用 VMware 或 XEN 让虚拟主机使用起来类似一个真正的主机,甚至可以自由的远程关机,重装操作系统. 这样在传统的独立主机和虚拟主机两个产品之间,虚拟机对于 Geek 来说,可能真是不错的东东.

Topic: 技术

关于 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页面检查,搬家成功。

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: 技术
订阅 RSS - 技术 | BT的花