Skip to main content

Posts

Showing posts with the label code

ptrace 在 linux 和 freebsd 下的若干区别 | Several differences of ptrace between Linux and FreeBSD

最近要把一个程序移植到Debian-kfreebsd上,并不如想象中的顺利。 主要是ptrace在两个平台上不太一样。 首先是宏定义,linux底下都叫PTRACE_*,freebsd上都是PT_*。这个也许不算什么 然后是ptrace函数的参数,主要是value这个,linux下面是long很好用,但是freebsd下是int,这样64位的时候就有些问题。 但是freebsd的ptrace有个更好用的操作PT_IO,可以自定义读写长度,而linux底下没有,要自己搞。 最后一个,花了我很长时间才解决的,是CONTINUE这个操作,linux下面addr这个参数是被忽略的,直接从中断的地方继续;但是freebsd下面则可以利用这个参数指定从哪里继续,如果希望从中断的地方继续,则指定为1即可。 目前只遇到这些,从这些方面来看,还是freebsd的接口更好用一些。 Recently I've been porting a software from Linux to Debian-kfreebsd, but it's not as easy as I had expected. The problem is the interface of ptrace is not exactly the same between linux and kfreebsd. The first is the names of the macros, which are PTRACE_* under linux and PT_* under freebsd. Secondly the function `ptrace' is not the same, the parameter `value' is `long' under Linux, but `int' under freebsd, so it seems that there'll be a problem on 64 bit freebsd. However, there's another operation called PT_IO under freebsd, using which we can specify the number of bytes we ...

并行运行多进程的Bash脚本 | A srcipt for running processes in parallel in Bash

原文: http://pebblesinthesand.wordpress.com/2008/05/22/a-srcipt-for-running-processes-in-parallel-in-bash/ 技巧是控制了最大并发数目,当前并发数过大时,等待有进程退出才开始下一个。 我现在正在写的脚本里正需要这个,借鉴过来 #!/bin/bash NUM=0 QUEUE="" MAX_NPROC=2 # default REPLACE_CMD=0 # no replacement by default USAGE="A simple wrapper for running processes in parallel. Usage: `basename $0` [-h] [-r] [-j nb_jobs] command arg_list -h Shows this help -r Replace asterix * in the command string with argument -j nb_jobs Set number of simultanious jobs [2] Examples: `basename $0` somecommand arg1 arg2 arg3 `basename $0` -j 3 \"somecommand -r -p\" arg1 arg2 arg3 `basename $0` -j 6 -r \"convert -scale 50% * small/small_*\" *.jpg" function queue { QUEUE="$QUEUE $1" NUM=$(($NUM+1)) } function regeneratequeue { OLDREQUEUE=$QUEUE QUEUE="" NUM=0 for PID in $OLDREQUEUE do if [ -d /proc/$PID ] ; then QUEUE="$QUEUE $PID" NUM=$(($NUM+1)) fi done } function che...

pygtk 异步显示对话框

需求是这样,我有一个主窗口,有自己的事情做,同时需要监视一个文件,如果有了变动就蹦个对话框出来,一开始的想法是 def handler(): dialog = gtk.MessageDialog(...) dialog.run() dialog.destroy() gobject.threads_init() gtk.gdk.threads_init() gtk.io_add_watch(source, gobject.IO_IN, handler) xxx_window.show() gtk.main() 结果是对话框能显示出来,但是点击ok之后就卡死了,ok按钮也保持在“按下”的状态 后来看到了http://old.nabble.com/Deadlock-problem-when-calling-messagebox-function-with-idle_add-td25027865.html 于是在handler首尾分别加上gtk.gdk.threads_enter() 和 gtk.gdk.threads_leave() 就可以了

[转]使用Pdftk合并PDF文件

link: http://bbs.haopdf.cn/viewthread.php?tid=441 PDF文件的跨平台特性使其应用广泛,我们在工作学习中经常接触此类文件,但从网上得到的PDF文档,经常是一篇文章中单独页面,怎么把这些单独的页面重新拼合成完整的文档就成了不小的问题。 当然,我们可以借助于Adobe Acrobat中的“Create PDF|From Multiple Files”合并这些单独的页面,但Acrobat是Adobe公司的商业软件,很多朋友由于版权问题并不会安装Acrobat。那么,我们能够使用什么软件来实现同样的功能呢?那就是 Pdftk。 Pdftk是由Sid Steward写的一个PDF增强软件,也就是所谓的PDF Hacks。它可以合并/分割PDF文档、解开必要的输入密码、输出加密、给PDF文档加水印、从PDF文档中解出附件、将PDF文档变成一页等等,能够做到操作PDF文档的所有事情。 其合并文档的具体用法为: 合并多个文档成一个文档: pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf 使用参数: pdftk A=1.pdf B=2.pdf cat A B output 12.pdf 使用通配符: pdftk *.pdf cat output combined.pdf 从几个文档中分割内容合并成一个文档: pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf

Blogger 加入 Digg 支持

在模板上找个地方(也不是随便哪里都可以)加上 <b:if cond='data:blog.pageType == "item"'> <script src='http://digg.com/tools/diggthis.js' type='text/javascript'/> </b:if> 就行啦 我是放在了 <p class='post-footer-line post-footer-line-3'/> 后面(记得展开Widget代码) 欢迎各位来Digg!

[转]让CPU占用率曲线听你指挥

题目《让CPU占用率曲线听你指挥》 问题 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况: 1. CPU的占用率固定在50%,为一条直线; 2. CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100); 3. CPU的占用率状态是一个正弦曲线。 分析与解法 有一名学生写了如下的代码: while (true) { if (busy) i++; else } 然后她就陷入了苦苦思索:else干什么呢?怎么才能让电脑不做事情呢?CPU使用率为0的时候,到底是什么东西在用CPU?另一名学生花了很多时间构想如何“深入内核,以控制CPU占用率”——可是事情真的有这么复杂么? MSRA TTG(Microsoft Research Asia, Technology Transfer Group)的一些实习生写了各种解法,他们写的简单程序可以达到如图1-1所示的效果。 498)this.style.width=498;" onmousewheel="javascript:return big(this)" alt="" src="http://new.51cto.com/files/uploadimg/20080306/103426364.jpg" border="0" height="367" width="324"> 图1-1 编码控制CPU占用率呈现正弦曲线形态 看 来这并不是不可能完成的任务。让我们仔细地回想一下写程序时曾经碰到的问题,如果我们不小心写了一个死循环,CPU占用率就会跳到最高,并且一直保持 100%。我们也可以打开任务管理器 ,实际观测一下它是怎样变动的。凭肉眼观察,它大约是1秒钟更新一次。一般情况下,CPU使用率会很低。但是,当用户运行一个程序,执行一些复杂操作的时 候,CPU的使用率会急剧升高。当用户晃动鼠标时,CPU的使用率也有小幅度的变化。 那当任务管理器报告CPU使用率为0的时候,谁在使用CPU呢?通过任务管理器的“进程(Process)”一栏可以看到,Sy...

bash和sh脚本中关于测试表达式的区别

有两种 [ a = b] [[ a == b ]] sh 只认第一种 bash 两种都认 有个脚本我一直没改好,原因是以为是bash脚本(或者说以为sh就是bash),然后就按第二种写了,但是总是没用。 后来发现原来那个是sh脚本,而且man了一下发现sh和bash原来不是一回事。终于搞定了。

ubuntu 7.10 下安装 windriver

最近要用Xilinx ISE, 装驱动时老装不上, 去Windriver官网上下的也没用。 configure和make都报错, 自己尝试修改未果。 几经查找, 在 http://www.visionlab.uncc.edu/component/option,com_jd-wiki/Itemid,46/ 上找到解决办法: 首先去 ftp://ftp.xilinx.com/pub/utilities/fpga/install_drivers.tar.gz 下载并解压最新的驱动, 我下的跟上面那个网站说的一样, md5是d0aea515f1b4523eb2537df86b c 6db41 创建一个diff文件 --- install_drivers/ linux _drivers/windriver32/windrvr/ linux _wrappers . c .orig 2007-03-27 22:35:36.000000000 +0200 +++ install_drivers/ linux _drivers/windriver32/windrvr/ linux _wrappers . c 2007-09-24 00:32:44.000000000 +0200 @@ -44,9 +44,6 @@ #endif #in c lude <asm/mman. h > #in c lude " linux _wrappers . h " -#if defined( LINUX _26) - #in c lude < linux /io c tl32. h > -#endif #if defined(UDEV_SUPPORT) #in c lude < linux /devfs_fs_kernel. h > #endif @@ -91,7 +88,10 @@ #endif #if defined(MODULE_LI C ENSE) - MODULE_LI C ENSE("Proprietary"); + // MODULE_LI C ENSE("Proprietary"); + // U h ! U h ! We need to set t h is...

关于在bochs的gdb-stub中加入对虚拟内存访问的支持

最近操统课需要用到bochs这个模拟器,我用的2.3.5. 但是实际出现了以个问题,就是gdb-stub这个功能不大正常,运行gdb后可以正常下断点,但是单步进可以,单步过却和单步进相同,这个问题不大比较恶心的是无法显示局部变量的值,总是显示0xffffffff                          google了半天没看到一点有用的。。。。。唉,只好自己搞                          参阅了gdb protocol后我修改了bochs的gdbstub.cc,让其显示出与gdb交互的内容,大致了解了内存这部分的步骤,主要是gdb给server(即bochs)发一个内存读取的请求,格式为m addr,length, 然后server返回十六进制的数据                          在bochs的gdbstub.cc 558行为处理这个指令的,不难看懂,我修改了它,让它输出access_linear的返回值,然后再调试,查看局部变量,果然valid为0,进一步,到access_linear, 经过痛苦地多次调试,发现问题处在valid=BX_MEM(0)->dgb_fetch_mem...一行,最后进到或则个函数,在memory/misc_mem.cc 512行下看到了这部分,原来是bochs发现读取的地址越界,就用0xff填充,然后返回0, 我修改了0xff,然后用gdb调试时证实了这一点。                          最后往上看,发现是addr比内存的长度还要大, 加入调试输出后发现gdb读的地址是0xf010 9fe0左右,而BX_MEM_THIS len仅有2000000,这显然会越界。                          起初我考虑也许是那里关于内存大小的设置没有弄好,但没有找到具体位置,但后来发现其实那BX_MEM_THIS len 是在.bochsrc里有定义的,0x2000000=2^25=32k,而那个0xf0109fe0是内核做的虚拟内存,gdb只跟bochs打交道,而虚拟内存是内核弄的,虚拟机又管不着。因此好像没什么好办法。。。 之后我查了很多关于虚拟内存的资料,发现其实是cpu直接支...

figlet 中文支持

figlet的帮助里说它支持多字节字符,如CJK字符。 不过这肯定需要字体文件,我查到它叫figfonts-CJK,但是不大容易下到,后来发现Debian里虽然package下不来,但是src可以,解开以后赫然发现了gb16fs.flf,呵呵,把里面所有的flf和flc文件放到/usr/share/figlet里就好了,注意要去掉目录,只把文件拷过来。 本以为现在就行了,可是“figlet -f gb16fs 王璐”是乱码,又查了查帮助,说是需要control file, figfonts-CJK自带了一些,叫unshift, iso2022, big5等,但是都试了一遍还是不行。 仔细看了figfont.txt, 它描述了figlet的字体文件和控制文件的格式,我发现控制文件中应当用b命令,但是后来发现用了也不行。 再看一眼figfont.txt中关于command的说明,发现h命令类似,只不过是针对HZ编码的,是以"~{"为开始符,然后把以后每两个字节都当成一个汉字处理,直到遇到"~}"为止。我写个CPP看“王”的GB编码,是0xcdf5, 在gb16fs 对应于0x4d75, 我又看了下unshift.flc,这不就是我想要的么,unshift里定义的编码转换就是把每个字节的首二进制位清零,那么0xcdf5就应该变成0x4d75,但是仔细一看又不对了,每个t命令接的两个区间应该等大,而它里面第一个区间都是以\0x??7E结尾的,显然不对,应该改为\0x??FE,于是我另存了个wl.flc,修正了这个bug 现在试“figlet -f wl 王璐” 仍然不行,直觉告诉了我,它仍没有按多字节处理,又查了下gb16fs.flf,果然乱码的第一个符号就是202,即0xcd,“王”的第一个字节! 于是改用h命令强制处理双字节,并把输入改为"~{王璐~}",字体仍用gb16fs,控制文件用wl(已加入wl.flc),于是, 出现了!!! 这就是成功的一大步了,说明了h命令是好的,字体文件也是好的,figlet也确实具有处理多字节字符的能力,于是目标锁定在b命令上 文档上说b命令每次读一个字符,如果小于0x80则当单字节字符输出,否则再读入一个字符,一起当作双字节字符输出。看似这应当正常工作,但是就是不行。 然后我...

Firefox 中 xmlhttprequest 跨域访问

今天要写一个小爬虫,用xmlhttprequest批量抓取一个图片集的链接,不过firefox有安全限制,对跨域访问有限制,需要权限提升。 记得在《Ajax in Action》曾看到过,现在忘了,在网上竟然查了半天才找到,(原以为Google第一个就是呢) 只需在xmlhttprequest作用域内加入 netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); 即可。 参考: http://www.captain.at/howto-ajax-permission-denied-xmlhttprequest.php

在Blogger首页显示文章摘要二解

在首页显示摘要是个不错的主意,可惜Blogger默认不支持. 网上倒是有一些解决方案,不过我都不大喜欢,因为需要修改文章模板,每次创建文章时还要指定哪里是摘要,哪里是全文,不爽. 我希望摘要的生成是自动的,可且应当便于修改. 网上好像有个这样的脚本,不过我网络不好,下不来... 经过两天的研究,我完成了两种方案. 方案一,根据行数定摘要. 修改模板, 加入CSS /* added by WangLu for summary display */ div.wl_summary{ height: 10em; max-height: 10em; overflow-y: hidden; } 另外在post-body的定义中,把<p><data:post.body/></p> 改为 <!-- added by WangLu --> <!-- display summary on the main page --> <b:if cond='data:blog.pageType == "item"'> <p><data:post.body/></p> <b:else/> <p> <div class='wl_summary'> <data:post.body/> </div> </p> ... <br/> <br/> <a expr:href='data:post.url'>Read more...</a> </b:if> 就行了. 此法优点是改动少,速度快,代码简单,且发文时无需添加额外信息 不过需要说明几点: 1. 在Firefox里指定height或max-height都可以达到效果,但是IE不支持max-height 2. 关于height的值可能需要根据实际字体进行修改, 设置不当容易出现半个字的情况. 3. 即使文章很短,也会出现'...'和Read more字样,逻辑上有点小问题. ...

shortest self-reproducing code

From http://www.nyx.net/~gthompso/quine.htm 总结的很全,各种语言都有,至少我听说的语言都提及了 摘录一些有趣的: C的,很早就知道了,今天想起来帖出来 char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);} 可以把char*去了,只报warning 对这段代码,要么看不懂,要么会为其精妙的构思叫绝 很佩服作者 C++的,有点麻烦,但换汤不换药 Author: lapinski@utexas.edu #include main(){char*s="#include %cmain(){char*s=%c%s%c;cout.form(s,10,34,s,34,10);}%c";cout.form(s,10,34,s,34,10);} Javascript的,有投机取巧的感觉 Author: Geoffrey A. Swift(blimey@toke.com) function a() { document.write(a, "a()"); } a()

交换两个int值的最短代码

CSDN上的帖子http://community.csdn.net/Expert/TopicView3.asp?id=4899577 比较好的是它着重考虑了“极端情况”----防止溢出 总结起来有如下几个 a^=b^=a^=b; b=a+(a=b)*0; a=b|a&~(b=a); 这三个在C#下应该都行,但是在C++下只有第一个行 原因是C#和C++对表达式求值顺序上不同, 如a=f(i)+g(i++)+h(i);中f,g用的都是i旧值,h则用的新值,C++则是未应义。 又如c=a+(a=1);C#中c应该是a旧值加1,C++则是2 C#中一个表达式中一个变量取值是按照从左至右的,C++则是按运算优先级的。 我觉得还是C#的顺序比较好,不过用C++多了总觉得它怪怪的。 另外C++未定义的那个太不好了,据说是因为编译器先于标准出现

[转]VB6逆向工程浅析(1-5全)

从stuhack找到的,原链接地址找不到了,感觉讲数组的那部分最有用 信息来源:[OCN]破解组织论坛(ocn.e5v.com/bbs1) nnd,前几天跟踪一个vb程序算法,几天没进展。找了一堆资料,给大家共享! ================================================== 前言 VB的编译有两种方式,一种是P-Code方式,一种是本机代码。P_Code方式是VB 从早期版本保留下来的,也是比较难逆向的一种。而本机代码方式编译的程序已经 和VC很接近了。这里只探讨以本机代码方式编译的程序。由于微软在VB的实现方面 的资料很少,使人觉得VB的逆向比较难。其实掌握一些规律,VB的程序还是很容易 入门的。 这里所提到的知识都是个人的经验,没有什么官方的资料作为依据。所以错误 之处难免,如果你发现什么错误,欢迎指正。 1. 从简单变量的实现开始 一个VB简单变量的表示至少需要12个字节。通常前2个字节是表示类型信息的。 从第5个字节到第8个字节并不总是使用到,实际上很少被使用。我们不妨先叫它 辅助类型信息。从第9个字节开始就是真正的变量的值了。这里有可能存储一个指针 值,也可能是数据,具体是什么取决于变量类型。 另一个值得注意的事实是VB的内存是以4个字节对齐的。即使你使用一个字节, 那至少也要4个字节来表示。而且编译器只初始化它需要的那些字节,剩余的字节 可能是随机数据。下面我们将会看到这些。 想弄明白编译器在内部怎么实现的,最好的方法就是编一段程序跟踪运行看看。 我编写的代码如下: Dim a, i As Byte Dim b, j As Integer Dim c, k As Long Dim d, l As Boolean Dim e, m As String Dim f, n As Date Dim g, o As Double Dim h, p As Single a = &H30 b = 330 c = 66000 d = True e = "hello" f = Now g = 3.1415 h = 1.27 i = a j = b k = c l = d m = e n = f o = g p = h 这段代码在VB的默认设置(速度优化)下编译。然后用od反汇编出来如下: 去...

[转]一个swf花指令

摘自csdn文章,我就遇到过这样的花指令,使得Sothink SWF Decompiler 3.3 不能正常工作 例1 : 向前跳转的包含无效尺寸数据的死代码。 push True branchifTrue label2 constants ''" label2: push 'a',3 setVariable 你仔细看的话,会发现"constants ''"这行是垃圾代码,它不可能被执行到。然而,理论上,当第二行的结果为"not True"时,它将被执行。因此,反编译器尝试对它进行反编译。 让我们来增大"0x88 - constants"后面的"sentence size",从而包括知道脚本结尾的所有字节。你知道,反编译器将把字节码砍成像这样的3个句子: push True branchifTrue label2 constants label2: push 'a',3 setVariable 如果你试图反编译此SWF文件,根据我前面提到的4个错误,一些反编译器将碰壁。仍旧有些反编译器幸存,但只是显示:"if(false){};"。ASV 3也不能显示此脚本,但是ASV 4能够显示。为了破解这个SWF,我们移除死代码"constant xxxx", (0x88和随后两个字节),然后所有的东西都得到反编译。 例2: 先后跳转的包含无效尺寸数据的死代码。 push 'b' label1: push 'a',3 setVariable branch label2 branch label1 label2: push 'b'是句垃圾代码,我们将修改它,用来使ASV 4碰壁。让我们来修改push 'b'的"length of sentence"。修改"0x96"后面的2个字节的数据,使句子的长度增长到分支Label1之前。这样,反编译器将把字节码作为3个句子: push label1: push 'a',3 setVariable br...

CWS转FWS的C代码

原来的代码不能正常编译运行,我做了多处修改 应该是编译和运行环境不同造成的吧。我的环境是VC++2005 /* * cws2fws by Alex Beregszaszi <alex@fsn.hu> * Public domain. * * This utility converts compressed Macromedia Flash files to uncompressed ones. * */ /* * Modified by Wang Lu Feb. 6th, 2007 */ #include <sys/stat.h> #include <fcntl.h> //#include <unistd.h> //WL: no this header file in VC++ 2005 #include "zlib.h" #ifdef DEBUG #define dbgprintf printf #else #define dbgprintf #endif #define NULL ((void*)0) //WL: Dummy main(int argc, char *argv[]) { int fd_in, fd_out, comp_len, uncomp_len, tag, i, last_out; char buf_in[1024], buf_out[65536]; z_stream zstream; struct stat statbuf; if (argc < 3) { printf("Usage: %s <infile.swf> <outfile.swf>\n", argv[0]); exit(1); } fd_in = open(argv[1], O_RDONLY|O_BINARY); //WL: there wasn't O_BINARY originally, and didn't work correctly under VC++ if (fd_in < 0) { perror(...