Archive

Archive for the ‘开源软件’ Category

在Ubuntu上安装L2TP/IPsec VPN服务器

August 30th, 2010 li No comments

最近用VPN翻墙比较流行, 我也赶了一下潮流: 买了一个Linode的VPS, 安装了最新的Ubuntu Lucid (10.04), 并在上面配置了L2TP服务器.

以下虽然是在10.04上的配置过程, 但应该对其他版本的Ubuntu同样适用.

2010-09-01: Ubuntu ppa没有karmic上的openswan包, 只能自己编译了, 或是下载我预编译的版本, 参照后面说明.

1. 安装OpenSWAN

L2TP(Layer 2 Tunneling Protocol)顾名思义, 是2层隧道协议. 这个协议的认证方式不是非常安全, 因此实际使用中, 往往将L2TP和IPsec结合, 客户端和服务器之间, 首先通过IPsec生成安全信道, 之后再进行L2TP协议的交互.

因此, 安装L2TP服务器, 首先需要安装IPsec软件. 目前在Linux下, 有FreeSWAN, OpenSWAN, StrongSWAN三款IPsec协议的实现. 这里我用的是OpenSWAN.

目前Ubuntu Lucid中官方自带的OpenSWAN版本是2.6.23. 可惜的是, 这个版本的OpenSWAN有bug, 无法和L2TP服务器配合使用, 必须至少升级到2.6.24以后. 因此需要安装Ubuntu提供的非官方OpenSWAN升级版. Read more…

Categories: 开源软件 Tags: , , , ,

Seccomp和系统调用过滤

December 8th, 2009 li 1 comment

Seccomp v1

Seccomp是2005年Andrea Arcangeli在Linux内核加的一个功能,为了给*Grid计算中的应用*提供sandbox模型。运行在Seccomp模式下的进程,只能执行下面几个系统调用:
    read(), write(), exit(), sigreturn()

Read more…

Categories: 开源软件 Tags: , , ,

stratagus最新Windows版

November 13th, 2009 li 9 comments

简介

stratagus的前身是freecraft。freecraft重写了Blizzard公司的经典游戏Warcraft II的RTS游戏引擎。后因版权问题改名。freecraft改名后分成了几个部分,stratagus项目承接了其游戏引擎的部分,wargus在stratagus引擎上进行二次开发,几乎完美重现了Warcaft II的功能。下面是Wargus/Stratagus的效果:

stratagus1 stratagus2 stratagus3 stratagus4

下载说明

Read more…

最近用scons的收获

November 13th, 2009 li 3 comments

背景

Windows平台上的编译工程工具很多,Visual C++ 6的dsp文件,2003以后用的vcproj,以及最近2010支持的用msbuild编译的vcxproj,加上古老的nmake,cygwin、msys移植的make,等等很多。

make的问题是扩展性比较差,尤其是在Windows平台上,nmake的功能更弱,导致写一个工程文件很费劲,管理多个工程有大量的重复工作要做。make最大的问题是不能automake那种简洁的工程写法(automake同样存在扩展问题,m4语言不懂).

最新的msbuild 4.0试用了一下,感觉不是很好,很费劲。因为最近迷恋上了命令行,一直不愿意安装完整的Visual Studio 2010 Beta 2,直接把2010的命令行拷贝出来用cl.exe之类的。想只装.Net Framework 4.0就试试msbuild,发现不行,把2010里的msbuild相关资源拷贝出来也不行。而且用XML手写工程文件很麻烦。

猛然想起之前听说过,鼎鼎大名,但之前简单了解后放弃了的scons。再次使用之后,才发现scons的妙处。

Read more…

Categories: 开源软件 Tags: , ,

Visual C++ 2008编译libpng

November 9th, 2009 li No comments

1. 主页 http://www.libpng.org/pub/png/libpng.html

2. 最新稳定版本 1.2.40

    源码下载 http://download.sourceforge.net/libpng/lpng1240.zip

3. 编译依赖

    依赖zlib。要求名为zlib的目录位于和libpng源码平级的目录下。libpng会自行编译zlib的源码,而zlib 1.2.3版本中的汇编代码在VC 2008下编译存在问题,参见zlib的编译说明

4. 编译方法

    打开源码中的projects\vc71\libpng.sln工程文件。编译DLL ASM Release和LIB ASM Release就可以了。会得到libpng.lib、libpng13.lib、libpng13.dll。

5. 注意

    ligpng会编译自己的zlib1.dll和zlib.lib,不知道编译参数和zlib自己的工程文件是否一样,也不知道和zlib工程文件编译出的dll和lib会不会冲突。这个问题留待考察。

Categories: 开源软件 Tags: , , ,

Visual C++ 2008编译lua

November 9th, 2009 li No comments

1. 项目主页 http://www.lua.org/

2. 当前最新稳定版本 5.1.4,2008年8月发布

    源码下载 http://www.lua.org/ftp/lua-5.1.4.tar.gz

3. VC编译方法

    解压后,用Visual Studio 2008命令行环境进入lua目录,运行etc\luavs.bat。之后会在src目录下生成lua.exe、luac.exe、lua51.dll

4. 注意

    默认的luavs.bat只会生成DLL,如果需要编译静态链接库,可以自行修改luavs.bat,修改两处地方

    1. 删除cl.exe的编译选项 /DLUA_BUILD_AS_DLL

    2. 生成DLL的命令改成 lib.exe /nologo /out:lua.lib *.obj

Categories: 开源软件 Tags: , ,

Visual C++ 2008编译zlib

November 8th, 2009 li No comments

记录下Visual C++ 2008编译zlib的过程,以备不时之需。

1. 项目主页 http://www.zlib.net/

2. 当前最新稳定版本 1.2.3,2005年7月发布

源码下载 http://www.zlib.net/zlib123.zip

3. VC编译方法

解压后,打开项目文件projects\visualc6\zlib.dsw,新版本的VC会提示要做工程格式转换。一般只编译其中zlib项目的DLL Release和LIB Release就好了。

4. Bug

如果想编译zlib的DLL ASM Release和LIB ASM Release,会出现下面的错误:

contrib\masmx86\inffas32.asm(647) : error A2070:invalid instruction operands
contrib\masmx86\inffas32.asm(649) : error A2070:invalid instruction operands
contrib\masmx86\inffas32.asm(663) : error A2070:invalid instruction operands
contrib\masmx86\inffas32.asm(720) : error A2070:invalid instruction operands

这是因为VC2008的MASM语法更严格了,导致之前的代码语法检查不过。参照这里的说明,把inffas32.asm改好就OK了。或者下载我改好的

Categories: 开源软件 Tags: , , ,

Visual C++ 2008编译SDL小结

November 8th, 2009 li No comments

最近在Windows平台上编译SDL,过程记录下来备忘。说是用VC 2008编译,其实和用VC 2005和VC 2010编译过程都是一样的。

1. SDL 主页 http://www.libsdl.org/

2. 当前最新稳定版本 1.2.14

    源码 http://www.libsdl.org/release/SDL-1.2.14.zip

3. VC编译方法

    SDL-1.2.14.zip解压后,再解压其中的VisualC.zip,然后用VC打开VisualC\SDL.sln。编译SDL和SDLmain两个工程。

4. 编译依赖

    DirectX SDK中的dsound.h, dinput.h几个头文件,和dxguid.lib这个库文件。最新的DirectX SDK 2009 Auguest可以从微软(http://is.gd/4Q3Mo)下载。或者只下载其中include目录和lib目录打包(http://is.gd/4Q416)。

5. 注意

    这样通过SDL.sln编译出的SDL.dll依赖msvcr90.dll,需要目的端也装了VC 2009的redistributable才行。要么就用外置manifest文件的方法发布,还没搞懂,搞懂再写。

Categories: 开源软件 Tags: , , ,

ezgdi – gdi++移植到64位Windows

August 28th, 2009 li 22 comments

ezgdi是我最近做的一个小项目, 将用于字体美化的gdi++动态链接库移植到x64平台上. 原始想法来源于极限主题论坛的相关讨论[1][2][3].

gdi++移植到64位windows, 为什么?

gdi++替换了操作系统的gdi接口功能, 可以提供更加伤心悦目的字体渲染效果. 而gdi++的一个重要特点, 即操作系统接口替换, 是依赖于微软研究院发布的一个库, 叫detours, 现在detours版本号是2.1, express版可以免费使用, 但不支持64位程序. 而支持64位的Professional版本不免费, 要$1000, 而且有钱也不能用, 因为微软禁止你用detours开发GPL类开源软件. 据我所知, 很多很好的项目都依赖于detours, 以至于迟迟不能提供对64位的支持.

64位是未来的趋势, Linux, Windows现在发布, 都主推64位版本. 如果gdi++不支持64, 会严重影响我升级64位操作系统的决心. 所以我觉得gdi++移植到64位windows, 是一件挺有意义的事情.

怎么移植? 为什么选择easyhook?

首先, easyhook提供与detours类似的操作系统API劫持功能. 并且开源, 支持x64平台. 所以将gdi++对detours的依赖移植到easyhook上, 可以编译出64位的gdi++.dll, 用于渲染64位Windows程序.

截止到8月26日, 从detours到easyhook的移植工作基本完成雏形. 这意味着, 使用easyhook代替detours的方案是可行的.

ezgdi 怎么用?

将来64位的gdi++.dll和32位的gdi++.dll会并存, 分别负责渲染64/32位程序. 虽然目前只支持注册表加载, 但实现成gditray的支持那种也是可行的.

虽然我目前是基于freetype版做出的修改, 但其实修改的内容都和freetype没关系, 所以推广到其他版本应该也不是问题.

总的来说, 从使用来讲没什么不一样的. 想试用当前的版本, 可以参见安装说明.

移植当前是什么状态? 什么时候可以用?

目前把gdi++从detours移植到easyhook的工作已经基本完成, 32-bit和64-bit的DLL都能正确生成. 但运行不稳定. 尤其是x64的dll, 会导致IE crash. 即使这样, 如果你还是感兴趣, 可以下载试用.

现在我有两个忧虑, 一是性能, 我怕easyhook相对detours的实现会产生明显的性能瓶颈, 二是全面性, 目前已经发现有些操作系统的界面easyhook不能渲染, 不知道是不是easyhook做不到.

上述两个问题有可能是植根于easyhook本身的技术实现, 无法解决的. 所以最坏的结果是, 走了一圈, 发现此路不通.

需要帮忙么?

非常需要, 我一个人的精力能力毕竟有限. 如果觉得ezgdi有一点价值, 可以关注ezgdi项目的主页. 上面有一些文档, 和我改动之后的代码

目前的缺陷

目前的ezgdi尚有很多较为严重的问题没有解决, 大概有下面几点:
1. 只支持注册表加载, 需要将gditray这种也用easyhook改写才能支持其他加载方式
2. 有些程序中渲中文字体不能渲染(SVN中r27应该已经解决, 至少一部分)
3. x64的DLL非常不稳定, 肯定有从32位到64位移植遗留的bug没有发现. 访问中文站点会导致IE 64-bit崩溃
4. 不能正常截获开始菜单, IE等Windows主界面的内容, 怀疑和easyhook有关, 还未确认.

下步计划

完善, 不断完善. 尤其是改善x64的DLL稳定性, 因为移植到easyhook的优点就是支持x64平台.

Categories: 开源软件 Tags: , , , , ,

usplash主题制作问题

August 20th, 2009 li No comments

Debian下目前有3个可以用的usplash主题包,分别是usplash-theme-debian,debian-edu-artwork-usplash,brdesktop-artwork-usplash。目前在lenny下制作出来的效果都有问题。截图:

usplash

为了解决这个问题,我先分析了usplash主题的制作原理。usplash的主题制作过程大概如下:

  • 由一个svg图,分别生成1024×876,800×600,640×480等分辨率下的背景图片。其实也可以不用svg,但非矢量图缩放效果可能不佳。也可以手动PS不同分辨率下的背景图片,也就不用借助svg的缩放了;下图是一个背景图:

background_640x480

  • 编辑生成一个进度条的png文件。图像中除进度条部分,其他应该是透明色;下图是用gimp编辑进度条的透明色效果:

progress

  • 将不同分辨率下的背景图和进度条叠加,生成2种叠加后的进度条效果,分别代表"进度为0"和"进度为100%"两种状态;

progressbg_640x480

progressfg_640x480

  • 统一所有图片的调色板。包括不同分辨率下的背景图、进度条效果图。下面是用gimp编辑图片看到的调色板:

palette

  • 将png图片转换为c文件
  • 将c文件编译链接成so文件

而产生前面截图那样的错误,是因为图片的调色板没有统一。而调色板不统一的原因,是因为usplash用的图片转换工具修改了统一调色板的方法。

本来,usplash 用的统一调色板的方法,是通过imagemagick提供的convert命令,先将png转换到gif,再转换回png的方法。(可能是因为convert对png格式的调色板支持不好)。方法如下:

convert image.png +dither -map ./cmap.gif gif:-
  | convert gif:- image.png

后来这种方法不管用了。原因是从gif转回png格式时,convert不再保留调色板。

经过网上的搜索,发现新版本的imagemagick应该用下面的命令设置调色板:

convert +dither image.png -type Palette -depth 8 -map cmap.gif image.png

修改Makefile中相关语句后,再次编译usplash主题,就会出现正确的效果了:

usplashgood

附usplash-theme-debian的patch:

--- a/Makefile	2009-08-20 00:51:49.000000000 +0800
+++ b/Makefile	2009-08-20 00:34:28.000000000 +0800
@@ -88,8 +88,8 @@
 
 %.c: %.png cmap.gif
 	$(E) "  PNGSRC  " $@
-	$(Q) convert $< +dither -map cmap.gif gif:- | \
-	     convert gif:- $<
+	$(Q) convert +dither $< -type Palette -depth 8 -map cmap.gif $<.new
+	$(Q) mv $<.new $<
 	$(Q) pngtousplash $< > $@
 
 #cmap.gif: background.svg progress.png
Categories: 开源软件 Tags: , ,