存档

‘开源软件’ 分类的存档

Seccomp和系统调用过滤

2009年12月8日 dipplum 1 条评论

Seccomp v1

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

阅读全文…

分类: 开源软件 标签: , , ,

stratagus最新Windows版

2009年11月13日 dipplum 没有评论

简介

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

stratagus1 stratagus2 stratagus3 stratagus4

下载说明

阅读全文…

最近用scons的收获

2009年11月13日 dipplum 没有评论

背景

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的妙处。

阅读全文…

分类: 开源软件 标签: , ,

Visual C++ 2008编译libpng

2009年11月9日 dipplum 没有评论

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会不会冲突。这个问题留待考察。

分类: 开源软件 标签: , , ,

Visual C++ 2008编译lua

2009年11月9日 dipplum 没有评论

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

分类: 开源软件 标签: , ,

Visual C++ 2008编译zlib

2009年11月8日 dipplum 没有评论

记录下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了。或者下载我改好的

分类: 开源软件 标签: , , ,

Visual C++ 2008编译SDL小结

2009年11月8日 dipplum 没有评论

最近在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文件的方法发布,还没搞懂,搞懂再写。

分类: 开源软件 标签: , , ,

ezgdi – gdi++移植到64位Windows

2009年8月28日 dipplum 19 条评论

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平台.

usplash主题制作问题

2009年8月20日 dipplum 没有评论

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

定制 Debian Live

2009年6月20日 dipplum 8 条评论

Debian Live 是一款制作可从移动介质直接启动的 Linux 系统的工具,支持生成 iso 镜像,USB 磁盘镜像和 NFS 镜像。

Debian Live 定制性很强,下面简单介绍几项定制内容:

1. 定制 Debian Mirror 地址

如果你的工作机无法访问官方 mirror,一定要通过下面 lh_config 的 5 个参数,配置可以访问的 mirror:

lh_config
            [-m|--mirror-bootstrap URL]
            [--mirror-binary URL]
            [--mirror-binary-security URL]
            [--mirror-chroot URL]
            [--mirror-chroot-security URL]

2. 定制 syslinux splash 图像

syslinux 使用一种特殊的图像格式(RLE 或 LSS),需要用下面的方法准备:

  • 用 GIMP 编辑图像,不要超过 640×400。
  • 设置为 14 Indexed Color。如果图像已经为 Indexed Color,但超过 14 种,应该先转换成 RGB 格式,再转换回 14 Indexed Color
  • 另存为 PPM 格式
  • 使用 syslinux 包中的 ppmtolss16,将 PPM 图像转换成 LSS
  • ppmtolss16 '#d0d0d0=7' < splash.ppm > splash.rle

得到 LSS 格式的图像之后,需要:

  • 放入 config/binary_syslinux/ 下,假设文件名为 splash.rle
  • 同时修改 config/binary,设置:
  • LH_SYSLINUX_SPLASH="config/binary_syslinux/splash.rle"

然后 lh_clean && lh_build 生成新的镜像。

3. 定制默认用户配置

Debian 以及其他 Linux 发行版在创建新用户时,会将 /etc/skel 目录下的所有文件复制到新用户 HOME 目录下。借助这一特色,可以通过将配置文件放在 /etc/skel 目录下,起到默认配置的作用。

Debian Live 系统每次启动时会生成全新用户 HOME 目录,同样会拷贝 /etc/skel 目录下的所有文件。因此需要将配置文件放入 Debian Live 系统的 /etc/skel 目录下。

在 config/chroot_local-includes/ 目录下,创建 etc/skel 子目录,在生成 binary 时,这些文件会自动拷贝到文件系统上。

lh_clean && lh_build 生成新的镜像。

4. 定制 splashy

splashy 可以在系统启动时,显示图形化的进度栏。splashy 的定制过程如下:

  • 创建 config/chroot_local-hooks/01-splash.sh:
  • #!/bin/sh
    splashy_config -s debian-moreblue || true
    update-initramfs -u -k all
  • chmod +x config/chroot_local-hooks/01-splash.sh
  • 修改 config/chroot 文件,LH_PACKAGES 后增加两个包:splashy splashy-themes

最后,lh_clean && lh_build 生成新的镜像。

5. 定制 usplash

usplash 与 splash 类似,同样可以显示图形化启动进度。由于 splashy 不支持 initramfs,有一部分启动过程无法图形化,而 usplash 能弥补这一缺陷。

  • 参照 splashy 前两步,生成同样的 01-splash.sh 可执行脚本
  • 修改config/chroot 文件,LH_PACKAGES 后增加两个包:usplashy usplash-theme-debian
    最后,lh_clean && lh_build 生成新的镜像。

6. 最小化生成 image

通常减少 Debian/Linux 系统空间的方法无外乎:1 删除不用的 locale 信息,2 删除 APT 缓存。可以参照上面定制过程,在 config/chroot_local-hooks/ 目录下,创建 hooks 脚本实现。

  • 首先,修改config/chroot 文件,LH_PACKAGES 后添加 localepurge
  • 创建 config/chroot_local-hooks/99-clean.sh 文件:
  • #!/bin/sh
    rm -r /var/lib/apt/lists/mirror.ivic.org.cn*
    rm -r /var/cache/apt/*.bin
     
    debconf-set-selections <<EOF
    debconf localepurge/nopurge select en, en_US.UTF-8
    debconf localepurge/nopurge seen true
     
    debconf localepurge/mandelete select true
    debconf localepurge/mandelete seen true
     
    debconf localepurge/dontbothernew select false
    debconf localepurge/dontbothernew seen true
     
    debconf localepurge/showfreedspace select true
    debconf localepurge/showfreedspace seen true
     
    debconf localepurge/verbose select false
    debconf localepurge/verbose seen true
     
    debconf localepurge/quickndirtycalc select true
    debconf localepurge/quickndirtycalc seen true
    EOF
     
    dpkg-reconfigure -u -phigh localepurge
  • chmod +x config/chroot_local-hooks/99-clean.sh

最后 lh_clean && lh_build 生成新的镜像。

7. 使用 fluxbox

fluxbox 是一款小巧的 X Window Manager。生成使用 fluxbox 的 Debian Live 系统的过程如下:

  • 修改config/chroot 文件,LH_PACKAGES_LISTS 后添加 fluxbox(替换 xfce/gnome/kde 等)
  • 创建 chroot_local-packageslists/fluxbox,内容如下:
  • ## LH: Fluxbox
    #include <standard-x11>
     
    fluxbox gdm
    ##desktop-base

最后 lh_clean && lh_build 生成新的镜像。

分类: 开源软件 标签: ,
This work by dipplum is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 China Mainland.