bianbian coding life

便便代码人生: 关注技术, 翻译文档, 偶尔动动手

bianbian.org

[原]一种blog日历的JSON压缩输出算法

Posted by bianbian on 2007-10-17 11:56


本文Tags: , , ,

一般高效的blog日历会将所有发表日期单独存储到js中,由客户端脚本负责输出日历链接。
以前都是按yyyymmdd输出blog日历的,如果发文多的话会特别长(特别是几年下来)。
最近用JSON输出blog日历的时候,发现一种更简单、更高效、更省数据量的方法:

{
"年份":["一月天", "二月天", ...., "五月天", .... , "十二月天"]
}

即年份作为JSON属性,值是十二个月天数构成的数组(五月天纯粹是增加关键字 - -)。
一个月最多有31天,如果用数字表示得用62个长度的字符。我决定用单个可打印字符的ASCII码代替。
在ASCII表里找了一段:从61-91(”=>?@ABCDEF……UVWXYZ[”)满足要求(刚好是天数+60)
于是,原来比如2006每个月各发表1篇blog的数据从:

"20060111,20060212,20060313,20060414,20060515,20060616,20060717,20060818,20060919,20061020,20061121,20061222"

就可以压缩到(106是linux下struct tm的year,是1900+的,106+1900=2006):

{"106":["G","H","I","J","K","L","M","N","O","P","Q","R"]}

当然这只是一个特殊例子,实际上用户写blog都有一段时间的连续性。用这种办法输出的日历数据在
数据量大的情况下会更加省空间。(显然原来的方法重复了很多年份、月份数据)。
下面是一个勤劳用户从04到07年的blog日历(几乎天天有文章更新):
总数据量1K不到,如果用yyyymmdd的方法估计要是这个的5-6倍

b_date={"104":["=@DEGJO[","?CGHLP","BDEHIPTUY[","?ELNOPQRSUVZ","?ABGIKLMOPSTZ[",">CHIJLMNOPSUX",">AFGNT[",">GNOPQV","DUWZ","BDGHKNOQR","=?CDFLNOSTUVXYZ","=>?@BCDEFIJOPQSTWXYZ["],
"105":["?@BCEFGHIJMNOPQSTUV[","=>?@ABCGIJKLMNOPQRSTUVWX","=>?@ABCDEFGHIJKLMNOP","VWXYZ","=>ABCDEFGHIJLMN","BCDEFIJKLMOPQRSUWXYZ","=?@BCDEFGHIJNOPQRUVWY","=>BNRSUVWZ",">ABCDFGHIJKMOQTVWYZ","DEFGHIJLNOPQRUVW[","=>?@BCDEFGHIJKLQSTWXZ","=>@AHIJKNOPQRSVYZ"],
"106":["@ABFILMOPSTU",">DEFGIJKMNPQ",">BCDEFGHIJKOPQSTWXYZ","=?@ABEFGHIJLMNOPQRSTUVWX","DFLNORY[",">ABEFGHIJLOPQSUVWZ","=>ABCEFIJMNQUVW[","=>CEIJORSTUXYZ[","=>ACEGHKOPQRTUVWX","?@BDEFGHIJLNOPQSTUVWX","=>?AFHIJOPQSTWXYZ","=ABCGJNORUV["],
"107":[">@JKLNOPQRSTUVWXY[","=>?BDFGIKLSTUVWX",">@ABCEGHIKOPQRUVWXY[","=ABEFGHIKLMOPQSUVWXZ","?CDFHIJKLMNOQRSTUVWYZ","=?@ABCDEFGHIKLMNOPQRUWY","=?ADFGHIKMNOPSUWZ[","=>?@ABCDFGHIKLMNOPRSVWXY",">?@ABCDEFGIJKMNPQRTVXY",">ACDEGHJKL","",""]
}

用客户端Javascript解析的时候也比原来方便直接。原来需要split然后循环判断(如果排序了可以用二分法)。而JSON不需要这种解析,直接可以拿来用:使用String.fromCharCode(60+天)获得某天的字符,然后在当月中查找一下:

  1. //b_date={}
  2. function HasPost(Y, M, D)
  3. {
  4.     if (!b_date)
  5.         return false;
  6.     if (!b_date[Y])
  7.         return false;
  8.     var ds = b_date[Y][M];
  9.     return (ds.indexOf(String.fromCharCode(60+D)) > -1);
  10. }

(当然,如果要更省空间,甚至可以把各月的数据用一个字符串表示、用逗号隔开;不过这样就得在客户端split然后再解析了。我认为这是不必要的:每年只省下22个字节而已)

标签: , , ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in JavaScript, Technology | 1 Comment »

[晕] nginx的internal属性的bug

Posted by bianbian on 2007-10-16 14:17


本文Tags: , ,

文档上说,internal用来禁止用户直接通过地址访问。
syntax: internal
default: no
context: location

internal indicates that the matching location can be used only for so called “internal” requests.
For external requests it will return the error “Not found” (404).
Internal requests are the following:
1) requests redirected by the instruction error_page
2) subrequests created by the command include virtual of the “ngx_http_ssi_module” module
3) requests changed by the instruction rewrite of the “ngx_http_rewrite_module” module

An example to prevent clients fetching error pages directly:

  1. error_page   404   /404.html;
  2. location  /404.html {
  3.     internal;
  4. }

实际发现,rewrite的用internal修饰后就挂了。像下面这个配置,如果/realpath/设了internal,用/proxypath/访问就是404。
这个跟本意是违背的(本意只能通过/proxypath/访问,而隐藏/realpath/),应该是nginx的bug(我的版本0.5.32)

  1. location /proxypath/ {
  2.    root     /realpathroot;
  3.    rewrite ^/proxypath/(.+)$  /realpath/$1? last;
  4. }
  5. location /realpath/ {
  6.   internal;
  7. }
标签: , ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Linux, Technology | No Comments »

[转]帝国时代2端口映射

Posted by bianbian on 2007-10-04 07:43


本文Tags: ,

备忘:
http://www.game5i.com/aoc/xueyuan/faq/200308/308.html
疯子微软了,同样是即时战略游戏,星际只用了两个端口,而帝国却用了N个,你知道N等于几吗? N=201 !!!天啊201个端口,真不知道 那帮编游戏的疯子是怎么想的。下面给出帝国要用到的具体的端口。
TCP:2300-2400 ,47624
UDP:2300-2400

标签: ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Entertainment, Not IT | No Comments »

[原]用AutoIt完成CCProxy的代理切换

Posted by bianbian on 2007-10-03 01:50


本文Tags: ,

南大的VPN,进校以后访问外网就必须用代理。
这样各个软件切换代理特别麻烦,比如浏览器、QQ、MSN、旺旺、BT、FlashGet得改代理吧。
我用AutoIt3写了一个软件,能自动切换CCProxy的代理(就是使不使用二级代理)。这样,把其他软件的代理都设为127.0.0.1:8080,就是用CCProxy作为其他软件的代理服务器,然后用程序切换CCProxy的二级代理状态即可。
不用VPN的时候不使用二级代理,用了VPN的时候只要运行一下程序,把CCProxy的二级代理状态打开,其他软件就不需要切换代理了。反之也一样。非常方便。
下面是源码:

  1. #cs ------------------------------------------------
  2.  
  3.  AutoIt Version: 3.2.8.1
  4.  Author:         http://bianbian.sunshow.net
  5.  
  6.  Script Function:
  7.     切换CCProxy的代理(是否使用二级代理).
  8.  
  9. #ce ------------------------------------------------
  10.  
  11. $PATH = @ProgramFilesDir & "\CCProxy"
  12. $EXE = $PATH & "\" & "CCProxy.exe"
  13. $INI = $PATH & "\" & "CCProxy.ini"
  14. $TT = "CCProxy 6."
  15. $TX = "Youngzsoft"
  16.  
  17. ; check running
  18. If Not ProcessExists("CCProxy.exe") Then
  19.     MsgBox(0, "Error", "CCProxy未运行!")
  20.     Exit
  21. EndIf
  22.  
  23. ; run it! so activate the already-running one!
  24. RunWait($EXE, $PATH)
  25.  
  26. ; try kill it!
  27. WinClose($TT, $TX)
  28. WinWait("CCProxy", "是否真的关闭代理服务器")
  29. ControlClick("CCProxy", "是否真的关闭代理服务器", "Button1")
  30.  
  31. ; change PROXY setting
  32. $set = IniRead($INI, "system", "CascadingProxy", 0)
  33. If $set = 0 Then
  34.     $set = 1
  35. Else
  36.     $set = 0
  37. EndIf
  38. IniWrite($INI, "system", "CascadingProxy", $set)
  39.  
  40. ; done! restart it!
  41. Run($EXE, $PATH)
  42. ?>
标签: ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in AutoIt3, Technology | 1 Comment »

[呜]硬盘坏掉真是太郁闷了

Posted by bianbian on 2007-10-01 01:41


本文Tags:

尝试各种办法都没办法恢复我的那么多代码了,唉。
太郁闷了~~~~~~~~~~~~~太痛苦了~~~~~~~
虽然有些代码到处都有备份,不过是比较老的版本。
尤其是最近写的那些个淘宝工具丢了,,,,唉,,,,,
看来以前说的3月刻一次文档盘还是得执行下去。

标签:

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Uncategorized | No Comments »

[哎]WD800JD的SATA 80G无法被VIA8237识别

Posted by bianbian on 2007-09-28 17:00


本文Tags: ,

WD800JD的这个SATA1在ECS精英主板 K8T800-A (南桥芯片VIA8237)里无法识别。
问题是那些从SATA2用跳针降级到SATA1的却能识别:ST系列、WD的都可以。
就是WD的这个WD800JD不能识别,而到其他平台上这个硬盘又是可以的。
正在遭遇踢皮球。考虑起诉两个厂家。

补充:
这个硬盘在2005。12。1以后就是SATA2的了,鄙视WD两种规格也不在标记上写清楚:
看这个地址:
http://www.dicvideo.com.cn/web/ArticleShow.asp?ArticleID=197
里面有这段:

传输率
(在2005年12月1日之前制造的硬盘,缓冲区达到150 MB/秒 以实现最佳传输速率。)
缓冲区到主机(串行ATA) 300 MB/秒 (最大值)
磁盘缓冲区 748 Mbits/秒(最大值)

顺便赞一下南京兴隆达的服务。因为我当时是问他们确认这个是SATA1我才买的80G,不然肯定加点钱上160G的了。
结果事实上是SATA2的,所以我要换型号。明天去换个160G的回来,用跳针转成SATA1用了(不然80G太亏了):

看这个地址:
http://www.xander.com.cn/news_show.asp?cat=0&id=130

关于WD串口硬盘与VIA8237南桥匹配性的技术通告

近来有客户反馈WD SATA II代硬盘在南桥为VIA8237的主板上无法检测到硬盘,导致硬盘的无法使用。造成此情况的主要原因是因为VIA8237仅能支持SATA I的硬盘,而WD工厂自2005年4月起就开始生产SATA II代的硬盘。为了能使新出的硬盘还能够匹配VIA 8237南桥,WD提出了如下的解决方案:
从4月20号之后生产的SATA II硬盘,通过跳线配置可强制到SATA I以解决该问题。4月20号之前的SATA II硬盘,通过FirmWare升级+跳线解决。
具体操作方法:
1、首先确认客户反映的确实是VIA8237与WDxxx-xxLSA0配合的情况下硬盘不能检测到的问题;
2、让客户将硬盘上的跳线从SSC位置(默认)跳到OPT1位置(OPT1:强制到SATA I)。看问题能否解决。
3、如果跳线后不能解决,跳线跳回原始(SSC)位置,用WD提供的升级程序升级,升级后再跳线到OPT1位置,问题即可解决。
FirmWare升级方法:
1、用WIN98制作一张纯DOS启动软盘(或者DOS6.22以上);
2、硬盘连接在一个非VIA8237(INTEL芯片组或带IDE-SATA转接卡)的主板上,用上面软盘启动;
3、运行WD提供的升级程序(UPGRADE.EXE);
4、看到提示升级成功后,关掉主机,跳线放置到OPT1位置硬盘即可正常使用。

最后鄙视下列单位:
VIA,多少年了,还靠VIA8237南桥,不思进取;
WD,硬盘换技术规范了也不在型号上标明,连自己的经销商都不知情。

标签: ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Technology | 1 Comment »

[原] Intel平台gcc4,gcc3,icc测试

Posted by bianbian on 2007-09-24 00:20


本文Tags: , , , ,

[from zhch begin]
以一个简单的计算程序为例:

int main() {
double s=0;
int i;
for(i=200000001; i>=1; i-=4) s+=1.0/i-1.0/(i+2);
printf(”Pi=%f\n”, s*4);
}

这是一个常见的算Pi的程序,基本算法是Pi/4=1-1/3+1/5-1/7+…..
[from zhch end]

Slackware 12.0预装了gcc 4.1.2,我手动装了gcc 3.4.6,和icc 10.0。下面是测试结果:

bbs@bbs:~/test$ gcc -o PI.gcc PI.c -O3 -march=pentium4 -msse2 -mmmx
PI.c: In function ‘main’:
PI.c:5: warning:incompatible implicit declaration of built-in function ‘printf’

bbs@bbs:~/test$ icc -o PI.icc PI.c -O3 -xP
PI.c(5): warning #266: function “printf” declared implicitly
printf(”Pi=%f\n”, s*4);
^
PI.c(4): (col. 9) remark: LOOP WAS VECTORIZED.

bbs@bbs:~/test$ gcc3 -o PI.gcc3 PI.c -O3 -march=pentium4 -msse2 -mmmx

bbs@bbs:~/test$ time PI.gcc; time PI.gcc3; time PI.icc
Pi=3.141593

real 0m1.568s
user 0m1.544s
sys 0m0.016s
Pi=3.141593

real 0m1.551s
user 0m1.544s
sys 0m0.008s
Pi=3.141593

real 0m1.246s
user 0m1.212s
sys 0m0.012s

测试环境:Intel(R) Xeon(TM) MP CPU 3.00GHz * 4, 8G MEM

文件大小:
bbs@bbs:~/test$ v PI*
-rw-r–r– 1 bbs bbs 140 2007-09-23 22:28 PI.c
-rwxr-xr-x 1 bbs bbs 6365 2007-09-23 23:08 PI.gcc*
-rwxr-xr-x 1 bbs bbs 6343 2007-09-23 23:47 PI.gcc3*
-rwxr-xr-x 1 bbs bbs 19769 2007-09-23 23:08 PI.icc*

果然跟一些文章说的,gcc4比gcc3编译结果和运算速度都有所下降,icc在Intel平台下确实优化比较明显,毕竟是自己家的东西。

标签: , , , ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in C/C++, Linux, Technology | 1 Comment »

[原]Linux下的c/c++ GDB调试

Posted by bianbian on 2007-09-18 22:13


本文Tags: , , ,

还是比较厉害的,比较准。
编译的时候加入 -g -rdynamic 选项,之后就可以跑调试了:
linux $ gcc -g -rdynamic -o error error.c
linux $ gdb error
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i686-pc-linux-gnu”…Using host libthread_db library “/lib/libthread_db.so.1″.

(gdb) run
Starting program: /home/linux/error

Program received signal SIGSEGV, Segmentation fault.
错误内容
行数 源码;
(gdb) kill
(gdb) q

linux $

标签: , , ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in C/C++, Linux, Technology | 1 Comment »

[原]第一次完整地编译了Linux内核

Posted by bianbian on 2007-09-17 02:10


本文Tags: , , ,

啊,太痛苦了,从下午一直编译到凌晨,终于每个选项都搞清楚了是干嘛的。用的是最新的2.6.22.6内核。
slackware 12.0太好玩了,装好后有几个cpu就会在屏幕上方显示几个LOGO企鹅。一排八个真壮观。。。。

推荐这个文章: http://lamp.linux.gov.cn/Linux/kernel_options.html

共计遇到的主要问题如下:
1)LILO 不能装到MBR,好像做了raid的都不能写MBR。手动写lilo.conf可以解决。(从安装盘引导,mount /dev/cciss/盘 /d1,chroot /d1,然后就可以改 /etc/lilo.conf了,改完直接lilo)
2)make menuconfig报错。类似:
scripts/lxdialog/dialog.h:127: syntax error before “use_colors”
scripts/lxdialog/dialog.h:127: warning: type defaults to `int’ in declaration of `use_colors’
scripts/lxdialog/dialog.h:127: warning: data definition has no type or storage class
scripts/lxdialog/dialog.h:128: syntax error before “use_shadow”
scripts/lxdialog/dialog.h:128: warning: type defaults to `int’ in declaration of `use_shadow’
scripts/lxdialog/dialog.h:128: warning: data definition has no type or storage class
scripts/lxdialog/dialog.h:130: syntax error before “attributes”
原因是setup装系统的时候有make menuconfig要用到的开发语言和库没有安装进去。重新安装就可以了。网上其他发行版说的需要手动安装libncurses-dev,在Slackware 12.0并不需要,系统应该自带了。

3)网络不通。检查是驱动选错了。(lspci得到的结果不能全相信,仅供参考!我最后是从安装盘里的默认系统开机自检画面里面发现真实网卡驱动的)
4)VFS: cannot open root device。
可能的原因:A)尽管硬盘全都是SCSI,常规IDE里”INCLUDE IDE/ATA disk Support”这个还是得选上。否则就打不开根设备。。。- -!
B)Enable the block layer(块设备支持,使用硬盘/USB/SCSI设备者必选)-》Support for Large Block Devices(仅在使用大于2TB的块设备时需要)。这个选项我发现必须选上。尽管我只有8*140G,不到2T。但是实际上如果这个选项没有选的话可能起不来。因此我觉得这里是翻译有问题。原文并没有指明是2T。
可能还有其他选项上的问题,可以看看这个网址:http://kerneltrap.org/node/970

期间得到ever的大力帮助,特别感谢。
今天还是嘘嘘生日,真是对不住哦。。。。

标签: , , ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Linux, Technology | 1 Comment »

[原]nginx在Slackware 11.0下的编译安装

Posted by bianbian on 2007-09-16 00:24


本文Tags: , ,

configure就不说了,make的时候提示:
objs/src/event/ngx_event.o(.text+0xdbc): In function `ngx_event_init_conf’:src/event/ngx_event.c:1140: warning: warning: epoll_create is not implemented and will always fail
objs/src/event/modules/ngx_epoll_module.o(.text+0×1cc): In function `ngx_epoll_add_event’:src/event/modules/ngx_epoll_module.c:250: warning: warning: epoll_ctl is not implemented and will always fail
objs/src/event/modules/ngx_epoll_module.o(.text+0×416): In function `ngx_epoll_process_events’:src/event/modules/ngx_epoll_module.c:402: warning: warning: epoll_wait is not implemented and will always fail

epoll是高性能网络io,居然不被系统支持,我明明用的是2.6.17的内核。于是make menuconfig,到 General setup / Configure standard kernel features 发现’Enable event poll’ 是关闭的,于是启用。

然后重新编译内核:
make bzImage
make modules
make modules_install
cp System.map /boot/
cp arch/i386/boot/bzImage /boot/vmlinuz
lilo
reboot

话说,Slackware 12.0都出来几个月了,改天我要去装一下。^_^

标签: , ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Linux, Technology | 1 Comment »

[哈]古董卡的无线总算成功了

Posted by bianbian on 2007-09-05 02:56


本文Tags:

20块钱买了张破pc卡(说是驱动装不上)
买来试试吧,破笔记本正好闲着发霉
果然是一万年前的卡,Hawking 11M Ethernet WLAN PC CARD
还好这个hawking的主页上有这个驱动:http://www.hawkingtech.com/support/details.php?CatID=33&FamID=102&ProdID=48

不过呢,这个破驱动默认是装不了的。。。。。
用了很多种方法后(甚至去把驱动的INF文件给改了。。。就差没写驱动了)
最后发现手动选硬件型号,在Mireless manufacturer里选 WLEN PC v3.0可以骗windows装上

然后测试,还是连不上。差点放弃,先去游泳了。

不过后来想想估计是现在54M路由(IEEE802.11g)的PSK加密不支持,于是把路由器的加密方式改为WEP
重新测试,能检测到无线信号了,不过还是ping不通
哀,,,,这时候已经2点了,我都绝望了

最后突然一想,会不会这个sb连WEP加密也不会啊
于是把所有加密给关了
哈哈,于是ping了一下,上来发个贴
最后说一句,古老的硬件最好不要用了,写这个破流水卡了2次,太不稳定了

不过为了这个古董搞得加密也没了。还好家里无线设备不多,就4个,明天一个一个加允许MAC吧。。。。。

标签:

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Other, Technology | 2 Comments »

[原] TP-Link拨号/断开程序

Posted by bianbian on 2007-08-27 19:05


本文Tags: ,

万恶的南京电信好贵啊,,,,,我的套餐是一个月360小时,2M带宽,168元/月
路由器不可能一直联网,需要手动拨号。不过每次都连上192.168.1.1也太麻烦了。
于是写了个程序自动拨号、断开。程序启动就会连上路由器拨号,关闭的时候会断开连接。
tp_link.JPG
需要的朋友请下载(仅适用于TP-Link路由器):tp_link.zip

标签: ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Delphi, Technology | No Comments »

[原]iframe跨域访问解决方案

Posted by bianbian on 2007-08-24 15:09


本文Tags: , , ,

跨域访问提示“没有权限”,真是伤脑筋。研究几天以后,终于得到了所有解决方案。

A:www.bianbian.org
B:test.bianbian.org
C:www.other.com
从A跨域访问B、C,并能控制B、C的页面内容

方案(1)目标页面是自己的(即可以改页面输出),从A->B
最简单的,在B页面输出个

  1. <script>document.domain="www.bianbian.net";</script>

骗骗浏览器就行了

方案(2)目标页面是别人的,从A->C
比较头疼,只能用后台语言 2.1)做个proxy,2.2)做个JS输出(类似JSON方式了)

标签: , , ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in JavaScript, Technology | 7 Comments »

[原] 改进的DOS命令输出重定向到文本框(TMemo)内

Posted by bianbian on 2007-08-17 02:44


本文Tags: , , ,

虽然是Delphi的,都是调用的WinAPI,C++也可参考。
原理就是管道(Pipe),自己的程序可以Create管道出来,让CreateProcess的子程序能继承自己程序里的管道,替代子程序的标准输入输出。
这样DOS程序对stdout输出的内容就输出到自己程序建立的管道里来了,也就能对其进行读取操作,从而完成重定向到文本框(实时显示)。

基本上Delphi世界里流行的都是DFW上的那个重定向代码,我进行了改进:
1)原来那个代码只能截取输出结果,但是没有换行的整理,要是直接Add到Memo里会杂乱不堪(因为循环取到的内容有可能含有 \r 或 \n,这时候直接Add就有了两行)。
我加上了换行符的处理,Add行的时候按实际的换行进行处理,这样和DOS窗口输出就一致了。
2)原来那个代码没有和Memo绑定,还得自己写Memo操作部分
我加上了Memo作为参数,这样直接调用就省事了。

使用的时候只要 CmdExecAndView(”命令”, memo) 即可。

下面是改进后的代码,欢迎交流:

  1. procedure CmdExecAndView(FileName: string; memo: TMemo);
  2.   procedure _AddInfo(mmInfo:TMemo; S: string; var line: string);
  3.   var
  4.     i, p: Integer;
  5.   begin
  6.     if mmInfo.Lines.Count > 800 then
  7.       mmInfo.Lines.Clear;
  8.     //去掉 \r
  9.     for i := 0 to Length(S) - 1 do
  10.       if S[i] = #13 then S[i] := ' ';
  11.     line := line + S;
  12.     // \n 断行
  13.     p := Pos(#10, line);
  14.     if p > 0 then
  15.     begin
  16.       // \n 前面的加入一行,后面的留到下次
  17.       mmInfo.Lines.Add(Copy(line, 1, p - 1));
  18.       line := Copy(line, p + 1, Length(line) - p);
  19.     end;
  20.   end;
  21. var
  22.   hReadPipe, hWritePipe: THandle;
  23.   si: STARTUPINFO;
  24.   lsa: SECURITY_ATTRIBUTES;
  25.   pi: PROCESS_INFORMATION;
  26.   cchReadBuffer: DWORD;
  27.   ph: PChar;
  28.   fname: PChar;
  29.   line: string;
  30. begin
  31.   fname := allocmem(1024);
  32.   ph := AllocMem(1024);
  33.   lsa.nLength := sizeof(SECURITY_ATTRIBUTES);
  34.   lsa.lpSecurityDescriptor := nil;
  35.   lsa.bInheritHandle := True;
  36.   if CreatePipe(hReadPipe, hWritePipe, @lsa, 0) = false then
  37.     Exit;
  38.   fillchar(si, sizeof(STARTUPINFO), 0);
  39.   si.cb := sizeof(STARTUPINFO);
  40.   si.dwFlags := (STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
  41.   si.wShowWindow := SW_HIDE;
  42.   si.hStdOutput := hWritePipe;
  43.   si.hStdError := hWritePipe;
  44.   StrPCopy(fname, FileName);
  45.   if CreateProcess(nil, fname, nil, nil, true, 0, nil, nil, si, pi) = False then
  46.   begin
  47.     FreeMem(ph);
  48.     FreeMem(fname);
  49.     Exit;
  50.   end;
  51.   CloseHandle(hWritePipe);
  52.   while (true) do
  53.   begin
  54.     if not PeekNamedPipe(hReadPipe, ph, 1, @cchReadBuffer, nil, nil) then break;
  55.     if cchReadBuffer <> 0 then
  56.     begin
  57.       if ReadFile(hReadPipe, ph^, 512, cchReadBuffer, nil) = false then break;
  58.       ph[cchReadbuffer] := chr(0);
  59.       _AddInfo(memo, ph, line);
  60.     end
  61.     else if (WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0) then break;
  62.     Application.ProcessMessages;
  63.     Sleep(200);
  64.   end;
  65.   ph[cchReadBuffer] := chr(0);
  66.   _AddInfo(memo, ph, line);
  67.   CloseHandle(hReadPipe);
  68.   CloseHandle(pi.hThread);
  69.   CloseHandle(pi.hProcess);
  70.   FreeMem(ph);
  71.   FreeMem(fname);
  72. end;
标签: , , ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Delphi, Technology | 3 Comments »

[晕] 居然还有这种东西:C++ Trigraph

Posted by bianbian on 2007-08-01 15:34


本文Tags:

听说为了照顾某些键盘坏了又换不起的,可以使用这种3字符的串来代替一些特殊字符,preprocess的时候会替换掉:

#: ??=
\: ??/
^: ??’
[: ??(
]: ??)
{: ??<
}: ??>
|: ??!
~: ??-

于是程序就这样了:

  1. //: S03:trigraph.cpp
  2. ??=include <iostream>
  3.  
  4. int main(int argc, char* argv??(??)) ??<
  5.     using namespace std;
  6.     unsigned int n;
  7.     if (argc != 2 ??!??! (n = atoi(argv??(1??))) <= 0)
  8.         return 1;
  9.     cout << ??-(n ??' 0xf0f0) << '??/n';
  10.     return 0;
  11. ??>

我就奇怪了,键盘换不起,眼睛换换就那么便宜吗?

标签:

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in C/C++, Technology | 2 Comments »