跳至主要内容

博文

批量检测可用域名

批量检测可用域名 redraiment, 2009-09-25   在《 内网 IP 自动获取 》的评论中,有个网友希望能帮忙写一个批处理来批量检测域名的可用性。但前两天都在赶文档,刚刚接到老师电话说推迟到 10 月 08 日交,心头大石终于落地 ^_^ 。所以就马上开工帮那位朋友实现这个批处理!   原理很简单,就是找一个域名注册网站(比如我这里找的中国域名为 http://www.chinadomain.com.cn/ ),这类网站一般都提供了域名查询功能,我们只要用 curl 等命令行 Web 客户端来提交表单就能获得域名的信息,然后通过 grep 来提取可用域名。    注 :这两个工具在 Linux 系统中是自带的,但 Windows 中没有。我已经将它们和批处理文件一起上传到我的 Google Sites ( https://sites.google.com/site/redraiment/sunshine/domain )里,方便大家下载。下面是批处理的代码: :: 查询可用域名 :: 使用方法:domain.bat hostname ... :: By redraiment @echo off :loop if "%1"=="" goto end curl "http://www.chinadomain.com.cn/whoischeck.asp?domain_type=en_domain&ifcn=en&name=%1&imageField44.x=0&imageField44.y=0&suffix=.com&suffix=.com.cn&suffix=.cn&suffix=.net&suffix=.net.cn&suffix=.org&suffix=.org.cn&suffix=.biz&suffix=.info&suffix=.mobi&suffix=.tel&suffix=.me&suffix=.cc&suffix=.hk&suffix=.tv&suffix=.asia&suffix=.name&s...

内网IP自动获取V2

内网IP自动获取V2 redraiment, 2009-09-24   为解决上内网问题,我需要找一个 DHCP 未分配的 IP 地址来使用,在《 内网 IP 自动获取 》一文中的批处理能成功实现自动搜索。原理是逐个尝试地址是否可用,测试方法就是将本地地址设置成指定的静态 IP ,然后去 ping 网关,直到找到一个成功的地址。但这种方法有些美中不足: 通过 netsh 设置本地静态 IP 比较耗时间; 如果 IP 已经被分配就会弹出一个消息框需要手工确认,因此并不算真正的自动化。   在前一篇评论里也有朋友在问,能 ping 通的主机就是在线主机,这样只要搜索不能 ping 通的 IP 地址即可。其实不然,大部分防火墙默认都开启了防 ping 规则, ping 都会被拦截,因此即使在线也 ping 不通。但转念一想:如果主机在线,它的物理地址机会记录在 ARP 列表里,在 ping 完一个地址后到 ARP 列表中检查是否存在该地址的记录,就可以确定这个地址是否已经被 DHCP 分配出去!用下面的代码去替换《 内网 IP 自动获取 》中的 scan 模块: :scan arp -d for /l %%d in (2,1,253) do (   ping -n 1 %~n1.%%d & arp -a | find " %~n1.%%d "   if ERRORLEVEL 1 (     netsh int ip set address "本地连接" static %~n1.%%d 255.255.255.0 %1 1     ping -w 10 -n 1 %1 | find /I "TTL"     if NOT ERRORLEVEL 1 (       netsh int ip set dns "本地连接" static 210.33.88.1 primary       exit     )   ) )   这段代码只在最终找到可用地址后才设置本地地址,执...

内网IP自动获取

内网IP自动获取 redraiment, 2009-09-23   在寝室上内网真的是很闹心呀~稍微迟点开机, IP 地址就被别人抢去了。昨晚九点放学后,一直等到十点半才连上,实在忍无可忍了!    IP 被抢后解决方法无非就是找一个没被占用的地址,但手工去测试 256 个地址太折磨人了,早些时候我们班的两个同学就分别用 Java 和 C# 来实现过类似的小工具。但解决这样的小问题有点杀鸡用牛刀的感觉,不符合我的性格 ^_^ ,我当然还是用批处理来解决。   批处理中核心的两条语句就是: 设置静态IP地址 netsh int ip set address "本地连接" static IP地址 子网掩码 网关 1 设置域名解析器 netsh int ip set dns "本地连接" static 域名解析器地址 primary   程序使用时需要提供一个网关地址,为了方便大家使用,在 XP 和 Vista 系统能自动检测网关地址,如果正确的话直接敲一个回车就可以了。下面是批处理的代码,大家只要将下面的代码复制到记事本里,另存为 sip.bat ,双击即可运行。 :: 自动查找可用 IP :: 适用于浙江工商大学 :: by redraiment @echo off setlocal enabledelayedexpansion if NOT "%1"=="" goto scan :: 检测可识别的系统版本 :: XP ver | find "[版本 5" if NOT ERRORLEVEL 1 (   set SV=XP   set CG='"ipconfig|find /I "gate""'   set TS=13 ) :: VISTA ver | find "[版本 6" if NOT ERRORLEVEL 1 (   set SV=VISTA   set CG='"ipconfig|find /V "::"|find "网关""'   set TS=15 ) if NOT ...

解决 Debian 升级后小键盘失效

解决 Debian 升级后小键盘失效 redraiment, 2009-09-11   经过两个月的假期,寝室里蒙上了厚厚的一层灰。擦桌子、拖地、刷马桶……忙得不亦乐乎!回到实验室,第一件事就是“ aptitude update && aptitude upgrade ”。   经过一段不算漫长的等待, Debian 以崭新的面貌展现在我面前。但想输入密码的时候发现小键盘没反应了:按“ Num Lock ”指示灯还会改变,回车也依然有效,按数字却就“没反应”。再仔细观察一下,发现按“8、2、4、6”时,鼠标指针分别按“上、下、左、右”移动。莫非这就是传说中的“鼠标键”?   打开“键盘手选项”,切换到“鼠标键”,“允许键盘控制鼠标指针”这个选项果然是选中了,去掉后就恢复正常了。难道升级后覆盖了原来的配置文件,大家有没有遇到过这个问题?

DuplexPipe二三事(六)——没有第七

DuplexPipe二三事(六)——没有第七 redraiment, 2009-09-04 我的设想   在着手编写 DuplexPipe 之前,我规划过我的需求:我想要一个最通用的通信工具,换言之就是能让所有具有输入/输出的程序都可以相互通信。 DuplexPipe 本身远没达到这个设想,至少还得具备以下几中模式: -f file       # 通过读写文件获得数据 -s            # 从 stdio 中获得数据 -e exefile    # 从本地程序的输入输出中获得数据 -r url        # 这是一个附加功能。如果你玩过几天木马,你可能也渴望将它变成一个强大的后门!通过这个选项可以从URL中获得IP地址和端口,主动进行连接。 没有第七   但我会很遗憾的宣布,上述功能不会被加入 DuplexPipe 中。这也意味着介绍 DuplexPipe 到此为止,不会再有《 DuplexPipe 二三事(七)》,关于 DuplexPipe 维护的动态则会更新在项目主页 http://code.google.com/p/duplexpipe/ 中。   你可能听说过:“一篇文章的完成不是再也不能往里面加内容,而是再也没法删内容时。”写程序也是如此。我们来看上面提到的四个功能: -f file       # 这条可以最先被排除,因为主流的系统都支持输入输出重定向('<'、'>'和'>>')。 -s            # -s 和 -e 两种模式 nc 都支持!写程序也很机会重复制造车轮。 -e exefile    # 理由同上 -r url        # 这个功能虽然诱人,但很明显和主要功能无关,没必要保留。   因此,前三个功能都可以通过和 nc 配合来完成(瑞士军刀 nc 的使用方法请参看《 DuplexPipe 二三事(二) 》)!而且现在 Http Client 遍地开花(例如 ...

DuplexPipe二三事(五)——来自内网的呼唤

DuplexPipe二三事(五)——来自内网的呼唤 redraiment, 2009-09-04 穿越防火墙   你是否曾经尝试过去连接一台远程计算机,却因为被防火墙拦截或路由器没有转发而造成无法通信?这是主动式连接的一个弊端:它依赖服务器的状态,而对服务器有生杀大权的只有管理员。如果能让服务器主动尝试连接我们的计算机,那就没问题了!因为防火墙、路由等一般不会过滤向外的连接(反弹式木马就是利用这一原理)。   但以往的服务端程序都是采用监听本地端口的方式(比如 Windows 远程桌面程序监听本地 3389 端口),我们需要将它的连接方式改成主动连接外部网络的方式。我想你也一定要将想到(如果你看过《 DuplexPipe 二三事(四) 》),用 DuplexPipe 来转换它的连接方式! 反弹式远程桌面   在此以 Windows 远程桌面为例,演示如何用一个正向连接的程序实现反向连接。本次演示的环境: 主机 A(客户端) :处于外网, IP 地址为  60.180.*.* 。系统环境为 Vista 家庭版,自带远程桌面连接客户端; 主机 B(服务端) :处于内网。系统环境为 Win XP SP2 ,并开启了远程桌面服务 。   具体操作步骤如下:   一、将客户端的“连接式”转换为“监听式”。 打开命令提示符,执行: java -jar DuplexPipe.jar -l 1234 -l 3389      二、将服务器端“监听式”转换为“连接式”,并连接客户端监听的 1234 端口。 打开命令提示符,执行: java -jar DuplexPipe.jar -c 60.180.*.* 1234 -c localhost 3389      三、启动客户端上的远程桌面连接程序,连接本地的 3389 (默认)端口,即可连接成功!      连接成功后:    总结   如果你能理解上面的操作,就可以照样画葫芦去连接任何其他程序!我在前面提到过, DuplexPipe 目前还有待完善,那它以后还会添加些什么功能?会不会发展成为一个反弹式木马?请看《 DuplexPipe 二三事(六)》。

DuplexPipe二三事(三)——网络中转站:端口映射

DuplexPipe二三事(三)——网络中转站:端口映射 redraiment, 2009-09-03 端口映射   在《 DuplexPipe 二三事(二) 》中介绍了瑞士军刀 nc 的用法: nc 就像给程序一张飞机票,让原本只能在本地执行的程序也能运行在网络上!但网络和现实交通一样,很多地方需要中转才能到达(比如外网计算机无法直接访问公司内部 Web 服务器)。   为实现公网对内部网络的访问,需要对数据进行转发(即端口映射)。比如内网“主机 A ”开启了 Web(port 80) 服务,需要在“服务器的网关”上设置:凡来自 Internet 上对 80 端口的请求,全部转发给内部网络中的“主机 A ”。这里的“服务器网关”可以是路由器、交换机或者一台 PC 。 工具简介    FPipe 是一款命令行下的端口映射工具,可以映射 TCP/UDP 协议,支持连接数的最大上限。你可以从它的官网( http://www.foundstone.com )下载到最新版本。下面是它的用法和几个常用的选项: FPipe [-hvu?] [-lrs <port>] [-i IP] IP   -l 在本地监听的端口   -s 从哪个端口发送出重定向的信息   -r 要定向到IP主机的端口号   -u UDP 模式   -v 详细地显示过程 示例:   FPipe -v -l 80 -s 90 -r 80 192.168.1.100   作用就是将来自本机80端口的信息,通过90端口,转发到主机192.168.1.100的80端口上去。   你可以尝试执行:“ FPipe -l 80 -s 80 -r 80 203.208.39.160 ”,然后访问“ http://localhost/ ”就会打开 Google 首页,因为 203.208.39.160 就是  Google  主机的  IP  地址,^_^。更多的内容请参见程序附带的帮助文档。 总结   对于在《 DuplexPipe二三事(一) 》中提出的“进程通信”问题, nc 可以让本地程序通过网...

DuplexPipe二三事(四)——网络连接方式随心换

DuplexPipe二三事(四)——网络连接方式随心换 redraiment, 2009-09-04 连接方式   在《 DuplexPipe二三事(一) 》中提到建立连接有两种方式:监听本地端口,等待其他程序来连接(以下简称“监听方式”);或者主动连接其他程序(以下简称“连接方式”)。排列组合一下,会得到三种结果:监听-连接、监听-监听、连接-连接。其中只有“监听-连接”方式能正确地建立连接,《 DuplexPipe 二三事(三)》中介绍的 FPipe 只是在其中添加了一节“监听- 连接-监听 -连接”,其中粗体部分就是 FPipe 的工作。   那有没有办法让“监听-监听”、“连接-连接”这两种方式也能通信呢?或者说,有没有办法在不修改程序的前提下转换它的连接方式?这就是 DuplexPipe 提供的功能! DuplexPipe简介    DuplexPipe 和 FPipe 类似,也是命令行下的转发工具,但它允许你自己选择连接方式,因此比 FPipe 更加灵活!DuplexPipe 目前还只有 Java 实现方式,开放源代码,目前还不支持 UDP 模式。欢迎有兴趣的同学一起参与开发和维护!项目主页: http://code.google.com/p/duplexpipe 。下面来介绍一下它的选项和用法: 用法: java -jar DuplexPipe [-vh] model model 选项:         -v              输出一些提示信息         -h              显示本帮助文档 模式:         -l port         监听本地端口         -c host port    连接远程端口 示例:         java pipe.Dup...

DuplexPipe二三事(二)——瑞士军刀再显锋芒:让程序相互聊天

DuplexPipe二三事(二)——瑞士军刀再显锋芒:让程序相互聊天 redraiment, 2009-09-02 瑞士军刀NC    nc(NetCat) 是我很喜欢的一个小工具。在我常用的网络小工具中使用频率仅次于 cURL 。 nc 属于传输层的工具( TCP/IP  四层模型请看 这里 ),它能保证准确无误地发送和接收数据,但并不关心数据的具体含义(这些工作交给应用层的软件)。难怪说 nc 是网络的瑞士军刀,因为所有应用层的软件都是通过各自的网络协议来解析来自传输层的数据。所以,只要你了解应用层协议(比如HTTP、POP3等),就可以手工模拟出任何服务端或客户端程序。而且,只要你愿意,以后设计网络程序完全可以只实现一个“解析器”,数据传输的工作则全权交给 nc 了。 常用功能   网络程序要建立连接有两种方式:主动去连接、监听本地端口等待连接。nc 也提供了这两种方式: 1) nc host port     主动连接 host 的 port 端口。 2) nc -l -p port     监听本地 port 端口,等待其他程序来连接。 示例:     运行 nc g.cn 80     这样就连接上“谷歌中国”的服务器,输入“ GET / HTTP/1.1<CR><CR> ”(不包括引号,其中<CR>是回车,这里需要敲两次回车),服务器就会返回“谷歌”首页的 HTML 源代码。   上面是一个网络程序最基本的功能,默认下输入输出为 stdin 和 stdout (也就是“键盘”和“屏幕”)。nc 让我最欣赏的就是“ -e ”选项,通过它能将输入输出重定向到本地可执行程序。例如在 windows 环境下执行: nc -l -p 1234 -e cmd.exe   这样,从端口 1234 获得的数据都会转发给 cmd.exe ,而 cmd.exe 的输出也会返回给网络。此时的 nc 就像一件外衣罩在 cmd.exe 上,让原本不具备网络通信功能的 cmd.exe 也成为网络程序。 更多关于 nc 的用法可以参见 这里 。 程序自动“聊天” ...

DuplexPipe二三事(一)——有趣的起因:算24

DuplexPipe二三事(一)——有趣的起因:算24 redraiment, 2009-09-02   写 DuplexPipe 是因为“无聊”!真的,那天很无聊,想起小时候用扑克牌和姐姐比赛算24,就随手写了一个 Shell 脚本重温一下: #!/bin/sh for (( i = 0;i<4;i++ )) do     (( n = $RANDOM % 10 + 1 ))     echo -n " $n " done echo i = 0 while read exp do     (( i++ ))     (( value = $exp ))     if [[ $value -ne 24 ]]     then         echo -n " Wrong! "         echo " $exp = $value "         echo " try again! "     else         echo " OK! "         echo " Total use ${i} s "         break     fi done   最近好像养成一个习惯:能让计算机自动处理的尽量不制作。才玩了几盘,就开始动歪脑筋要写一个求24的程序来自动计算。方法就是最简单的穷举,下面是一个最初的简陋版本(有兴趣的朋友可以在此再添加五种括号): #!/bin/sh s[ 0 ]=' + ' s[ 1 ]=' - ' s[ 2 ]=' * ' s[ 3 ]=' / ' read a b c d for (( i =0;i<64;i++)) do    ...

关于批量重命名文件

关于批量重命名文件 redraiment, 2009-08-29   不久前,我们软件工程系举行了全系大会。我在大会上做了简短的报告,主题是“学以致用、动手实践”。报告期间我说了一个亲身经历:以前校园内U盘病毒肆虐,病毒会把U盘里所有的文本文件加上系统属性和隐藏属性,并添加“.tmp”扩展名(例如原文件名为“a.txt”,病毒修改为“a.txt.tmp”),然后生成一个和原文件同名的病毒文件。我不幸中招,于是用我所学的知识写了一个小程序,几秒钟就解决了。   原以为它就像插播广告一样随听随忘,不料言者无心听者有意。几个学弟回去后也都竭尽所能玩了一把:有用 Java 的,也有用 C# 的……功能也五花八门,不仅能批量修改扩展名,还能按 1→N 的顺序批量重命名文件等等。看他们玩得不亦乐乎,想来那次报告还有点作用嘛^_^。   今天又被问起我那时候的程序是怎么写的。其实在我们大一那会儿,要用计算机只能到图书馆的电子阅览室。那儿的系统“干干净净”,不会有 VC++ 等编译器,而且那种打开网页需要半分钟的速度也不会让你考虑去下载(估计其他高校情况也差不多),所以我是用批处理解决的。我用了下面三条命令: ::a.bat @echo off ::删除所有病毒文件 del /F /S /Q * ::递归地去掉文件的隐藏属性 attrib -s -h -r * /S /D ::遍历目录,去掉 tmp 扩展名 for /R . %%f in ( *.tmp ) do ren %%f %%~nf   上面的程序中是为了去掉“.tmp”这个扩展名,所以用 for 命令来遍历。但如果仅仅是修改扩展名则更简单,只要运行 ren *.bat *.txt 即可。另附一段好玩的批处理:将下面的代码保存成 bat 文件,双击运行就能将当前目录下的 jpg 图片文件按 1-N 的顺序重新命名(用来批量处理从网上下载下来的图片非常有效)。大家可以修改蓝色部分来改变扩展名。 ::b.bat @echo off ::开启延迟的变量扩充 setlocal enabledelayedexpansion ::计数器 set /a i=1 for /R . %%f in ( *.jpg ) do (   ren %%f !i! .jpg   s...

Shell中同时读多个文件

Shell中同时读多个文件 redraiment, 2009-08-23 一个文件分割成多个文件   有时需要提取文件中的一个或多个列元素生成新的文件,这一操作在 Shell 里很容易实现。比如有一个数据文件 data,有三列信息:姓名、学号、班级。 redraiment 0612800134 0601 christine 0612800136 0601 zb 0612800229 0602   现在需要这个文件的第一列和第二列信息分别存到文件 f1 和 f2 中,可以用 awk 提取,也可以用下面这个简单 shell 程序: #!/bin/sh while read f1 f2 f3 do      echo $f1 >> f1      echo $f2 >> f2 done 多个文件合并成一个文件   如果想把多个文件重新合并成一个多列文件,而不是追加到文件尾处。例如把上列中生成的 f1 和 f2 重新组成 join.txt 。这时需要同时操作多个文件,就像 C 语言中用 fopen 同时打开多个文件,在 shell 里也是类似的。只是在 shell 里叫做“文件描述符”,用“0-9”十个数字表示。其中 0、1、2 分别是系统的标准输入、输出、错误。“3-9”则由用户只有使用。我们就可以任选两个来重定向输入。脚本如下: #!/bin/sh exec 3< f1 exec 4< f2 while read f1 < & 3 && read f2 < & 4 do      echo $f1 $f2 >> join.txt done

JavaScript中的字符串乘法

JavaScript中的字符串乘法 redraiment, Date 原文 原文地址: http://www.davidflanagan.com/2009/08/string-multipli.html 原作者:David Flanagan In Ruby, the "*" operator used with a string on the left and a number on the right does string repetition. "Ruby"*2 evaluates to "RubyRuby", for example. This is only occasionally useful (when creating lines of hyphens for ASCII tables, for example) but it seems kind of neat. And it sure beats having to write a loop and concatenate n copies of a string one at a time--that just seems really inefficient. I just realized that there is a clever way to implement string multiplication in JavaScript: String.prototype.times = function(n) {     return Array.prototype.join.call({length:n+1}, this); }; "js".times(5) // => "jsjsjsjsjs" This method takes advantage of the behavior of the  Array.join()  method for arrays that have undefined elements. But it doesn't even bother creating an array with n+1 undefined ele...

难得糊涂

难得糊涂 redraiment, 2009-08-17 前记   以前戏称自己写的是“自醒文”,世道轮回,我终究还是来写“自省文”了。 悲剧   曾经我自视遵循老庄的教诲、奉行道家的指导,但现在看来我完全是在背其道而行。   《庄子·天地》有云:“有机械者,必有机事;有机事者,必有机心。”大致意思就是说:“有省劲的工具,就一定有省劲的事;有那个省劲的事,就说明我起了省劲的心。”而所谓省劲的心就是投机取巧。这虽然是道家反对智慧、反对科技文明的极端思想,但也不无道理。易中天老师就总结得非常好:“我们现在买一包方便面一撕开,开水一泡就吃了;我们买一个快餐食品,微波炉里转两分钟就出来了。这个食品里还有妈妈的味道吗?”科技越发达,个人的能力也得到越大的发挥,人与人之间就越独立,也越来越不知人情冷暖。   易老师的分析给我触动很大,诸多事情依然历历在目:某人能将谷歌金山词霸里的生词本导出去打印,我就花了几天写了一个程序让她自动转换,从此不再听她和我提起这件事;某人喜欢我陪她玩小游戏,结果我写了个外挂24小时刷分,于是游戏失去了娱乐意义,她也不再邀请我一起玩;某人希望我帮她去学校内网图书馆下载论文,我在内网的机子上开后门、中木马、启用VPN,打那以后下载论文不再需要我这个“代理”……   那时还洋洋得意,自以为做了一件一劳永逸的事情,甚至自视思想简单得和计算机一样只知道01,不知深浅地认为已经达到梁肇新老师说的“我就是程序,程序就是我”的境界。却不料总是无情地将人家一颗挚热的心抛给不知冷暖的程序。   希望此文能和大家共勉:不要因为长时间面对冷冰冰的计算机而被同化,该糊涂时则糊涂,因为现在能对她说“我来帮你”的已经不再是我了。

永生轮回之术

永生轮回之术 redraiment, 2009-08-15   前段时间看了一个视频——《 科学家证明轮回的事实 》。视频中疑点甚多,姑且就当科幻片看好了 。 很多宗教里都有生命轮回的概念,但真伪难证。我相信生命还是公平的,每个人要完成的任务份额是一样的。我的身体属于早熟型,不晓得早熟会不会意味着早衰,所以在十多岁就开始感叹人生苦短,一直渴望能有永生之法。今撰此文来扯扯“永生轮回”的淡,本文是在一本正经地讲一段屁话,仅供消遣切莫认真。 从物理学的波开始   “波”蕴含能量:在真空中没有任何阻碍,因此能力可以毫无损失地传播到任意远处;在空气或其他介质中传播,能量不断地被其他物质吸收直至耗尽。   “波”储存信息:不同的频率、不同的振幅、不同的波长能组合出成千上万种信息。不要小看它,DNA只有4种含氮碱基、计算机更是寥寥的二进制,但都能存储这大千世界。   量子物理学认为万物皆有波粒二象性,所有物质都有波,即物质波(相关概念请看 这里 )。人体就随时随地的往四周扩散着波,比如广为人知的“脑电波”。目前已经研究出一些运动“脑电波”的产品,比如用“脑电波”控制的轮椅、用意念玩游戏的头盔等等。这至少说明了“脑电波”在离开人体后不仅能继续存在,而且还存储着本体思维意识等的信息。因此我大胆提出一个假设——灵魂也是一种电磁波。 灵魂也是一种电磁波   神秘的人体蕴含了肉身和精神。从上面的观点来看,我更愿意将“肉身”视作给精神之力(灵魂)提供能量的制造机;而灵魂获得了能量后可以指挥肉身工作,还会将自己复制传播出去,来影响周边。发散出去的“波”携带的能量越多意识就越强,其他一些相对意识较弱的人可能就很容易受到影响,导致自己的意识波慢慢地与它同步、产生共鸣,最终完全接受了其他人的思想观点(今天的话叫“洗脑成功”)。   不同的环境里聚集着不同的波,因而你在不同的地方能感受到不同的气氛、产生不同的想法,所以艺术家们需要踏遍万水千山到处寻找灵感。上述的影片中也提到,出现轮回现象的大多是宗教盛行之地。   生活中有很多诸如此类的现象,比如一下几个荒唐的说法。 电影中的幽灵 :当我们很专注地看完一部电影,接下来的两三天大脑几乎像不受自己控制似的回味着电影里情节、对话, 在大型的电影院里看效果尤佳。因为全神贯注的状态就是主动地去同步自己的意识波,所以很容易引起共鸣,致使人们身临其境沉浸于...

VB和Dev-C++合作

VB和Dev-C++合作——手把手教你写GUI程序 redraiment, 2009-08-13 声明   此文的读者定为C语言初学者。此文介绍的技巧适用于开发迷你型项目或自娱自乐的玩具程序,正规的项目中可能不会采用。读者可以抱着茶余饭后休闲娱乐的心态来围观,至于CLI、GUI等名词解释请参看百度百科。转载请保留此声明和原作者redraiment,谢谢! 诱人的GUI程序   程序的作用就是化繁为简,让计算机高效地帮我们完成枯燥的工作。写程序最大的动力就是你精心设计的程序能获得大家的认可、大众的好评,这其中伴随着发布程序给大家使用。   在C语言编写的操作系统(比如UNIX、Windows等)上,C语言可以说是“无所不能”。但很多初学者发现,即便自己把C语言教材从头啃到尾,依然只能写出命令行下的程序。程序是CLI还是GUI本无可厚非,对我们程序员来说更重要的是程序本身提供的功能嘛,而且CLI相对于GUI还更灵活一些。也许你可以尝试一下把程序发送给一个非计算机科班出身的朋友,估计得大费唇舌来解释程序如何运行,可能最后还落得一个“不方便”的抱怨。撇开这些不说,至少一个活泼的桌面图标也比死气沉沉的终端图标更吸引人。   但编写GUI程序从来不是一件容易的事情,MFC也好、Swing也罢,都是一堆烦人的接口。用VB可以屏蔽这些细节,界面设计是所见即所得的,拖拖拽拽就能堆出一个像样的界面。本文的原理就是用VB来设计前台界面,C做后台逻辑处理。实现方法就是将C程序打包成DLL文件,由VB程序来调用。 所需软件   Dev-C++ 4.9.9.2或以上版本,VB 6.0精简版。这两款软件在华军软件园都能下载到,合起来大小也就15MB左右。如果你有完整版的VB当然更好,不过有精简版的也够用了。 Dev-C++生成DLL的方法 打开Dev-C++; 点击“文件”-“新建”-“工程”,工程类型选择“DLL”; 语言必须选择“C”,不能选择“C++”; 为工程取一个名字,比如“hello”。确定后会自动生成“dllmain.c”和“dll.h”两个文件; “dllmain.c”里自带了一个函数“DLLIMPORT void HelloWord () ”,但为了能在VB里调用,需要在DLLIMPORT后面添加一个“ __stdcall ”,即“DLLIMPORT __std...

你的密码安全吗

你的密码安全吗 redraiment, 2009-08-12 想个好密码不容易   Web 2.0时代需要用户主动参与,大大小小的站点都需要你注册登入(连期末课程设计也视此为最低指标)。密码原则上是一个烂在肚子里的字串,只有自己知道且容易回忆。容易回忆就意味着这一串字符对自己来说具有某种意义,但真要找到一串字符既有意义又不广为人知还的确不太容易。于是很多人选择迁就“容易记忆”,比如下列几类常用的密码: 类似111111、123456等 潜意识型的密码; 和帐号一样或者稍做修改; 用自己(或家人)的名字、生日、身高、手机号码等; 用Ilovexxx,xxx520等,臭屁点的人还会用woshitiancai之类的密码。 ...   还有很多类似的密码,有兴趣的话可以下载一些“黑客字典”来参考。总结起来,大多数密码都是在自身或周边取材,或经过简单的变化。因此,破解密码的过程其实也就是了解对方的过程,如果我对你非常熟悉,了解你就像了解我自己一样,你的生活习惯、喜好厌恶我都清楚,甚至你在想什么我都知道。那才你的密码不就等于想像一下自己会设什么密码(黑客们觉得这样很有趣,反感暴力破解)。而在这个开发的Web 2.0时代,通过人肉搜索收集个人信息可谓轻而易举。   所以,提高密码的复杂度可能并不是简单的组合数学问题,尤其是那些心里藏不住秘密的人。 驻扎的网站是否够安全   即使找到了一个安全的密码,也不过是万里长征的第一步。你驻扎站点的安全性又如何呢?每个时期都有其代表性的漏洞,我刚接触计算机时SQL注入漏洞就像今天的XSS一样风靡,即使是《黑客防线》等专业黑客站点也一样难幸免。黑客在取得服务器的绝对权限后,所有用户的密码都成为了明码。   这并不是问题的关键,真正糟糕的地方还是在人本身:人都是有惰性的!你可以检查一下自己的密码:QQ、邮箱、网游……是不是用的都是相同(或相似)的密码?取得其中任何一个,几乎就是一卡通了。   用户尚且如此,很多站长也同样是懒人。有多少中小型站点是按默认配置来运行的,哪天你无聊完全可以拿/data/dvbbs7.mdb这个路径去匹配动网论坛,指不定就下载到后台数据库。   碰到一些霸道的站点,下载个文件还得注册,对于这些一次性光顾的网站,你注册时得多留一个心眼了。 这些站点值不值得信赖   纵使访问的网站铜墙铁壁,这些站点值得信赖...

别拿面试题来折磨自己

别拿面试题来折磨自己 redraiment, 2009-08-12 起因   临近毕业,QQ群里开始讨论就业话题,偶尔也有人发几道面试题上来给大家耍耍。今天又有同学发了一道自称是IBM里月薪8万的职位的面试题,大致意思就是8元买进一只鸡9元卖出,再10元买进11元卖出,问最终受益是多少?答案是-2元。这个匪夷所思的结果在群里引起激烈讨论,网上解释很多,大家Google一下。你甚至能搜到一些激昂的文章,摆事实、讲道理,最终得出结论:出这种面试题的公司是失败中的失败。 正文   据说这道面试题90%的答题者都做错。这没什么值得惊讶的,甚至说99%的人做错我也相信。    语言的表达是需要在配合特定的情景才能理解 。你在厨房里和一位厨师说“刀”,他会理解成“菜刀”;而在仪表前和一位机械工程师说“刀”,他可能就理解成“模具抛光用的刀”。以前网络上盛传“ 大学教授不会做小学生课后习题 ”,其实道理也是一样。小学生今天刚学完“三角形”,在这样的前提下做课后习题自然会想到运用三角形的知识解题;而你在没有任何前置知识下突如其来地让你去解题,当然不能完成任务。这就好比嘲笑关公不会绣花、IT人员不会修电脑。 企业选人   企业为某一职位招聘,选择的应该是最合适的人(最合适的人并不一定是最优秀的人),因此就需要通过“笔试”、“交谈”等方式来了解应聘者是否具有胜任该职位的素质。这些 素质 可能是相关的“专业技能”,也可能是“思维方式”。   我家附近开了一家“人本超市”,招聘收银员时明确指出只要初中生或高职生,大专生和本科生反而被冷落了。并不是说大学生不及初中生,而是因为收银员的工作简单、单调,并不需要这么高的学历,大学生的工资比中学生高,而且可能不甘于长时间做这份工作,因此招聘大学生的成本反而比中学生高。   微软的面试官曾坦言:“出类似‘美国有多少个加油站’这样的面试题,其实并不是真的想知道答案,而是想看看应聘者在这种有压力的环境下会做出什么样的反应。”在公司里工作难免会遇到加班、赶工等有压力的时刻,你又是如何面对这些困难的呢,是选择退却、放弃还是义无反顾地前进?   因此面试成功不必骄傲,面试失败也无需自责,你只是不适合他们的需求而已。 我选企业   我曾开玩笑说:早先的工作由国家分配,后来是按个人兴趣自己找工作,现在是按职业钱途找工作。不管是出于什么动机,要谋求一个...

今天你犯贱了吗

今天你犯贱了吗 redraiment, Date 前言    这是自醒文,不是自省文,是来提醒自己的。我还没铸成什么大错,用不着自我反省。 正文   前几天好像又回到了小时候,同情心有点泛滥,觉得可恨之人也有可怜之处。但我这人一有同情心就容易犯贱!现在的我更加坚定当初的立场: 可怜之人,必有可恨之处 !!   “ 可怜 ”是对自己的态度,是对自我的否定。如果一个人对自己的生活很知足,又如何会给人可怜的感觉?落水的人就会狼狈?穷人就不快乐?倒是有些人,生活在温馨的家庭里抱怨双亲太唠叨,孤儿抱怨父母为什么不能多陪伴自己一些时候。    人之所以会痛苦就是因为对别人(可能也包括自己)要求太多 ,凡事都想绝对公平,体育考试大家在同一起跑线上你怎么跑不过人家?如果靠想就管用,我当初直接从娘胎里举着大学文凭出来好了。   再说“ 帮助 ”。现在的捐款,权利大于义务!来借钱的人说:你钱这么多,就分一点给穷人好了。这就好比迈克尔·菲尔普斯一届奥运会能6枚金牌,反正他金牌这么多,分一块给我也让我做做奥运冠军好了。纵使他真的给你了,别人承认吗?这是帮助吗?即使你自己心安理得,那也只是阿Q精神胜利法的现代版——意淫!这不是“帮助”,而是嗟来之食。    帮助就是要做到双赢 !双赢并不可耻,老想着让别人单方面无私地为自己谋福利,那才是最可耻的!迈克尔·菲尔普斯如果打算帮你,不是把他获得的奖牌分给你,而是做你教练,指导和督促你练习,最后你靠自己实力获得金牌,而他也收获了一个金牌教练的美名。   最后是“ 犯贱 ”,比如把别人家的棺材抬到自己家来哭。 做一个自甘堕落、不自尊自爱,只会通过摇尾乞怜来引起别人的关注,这样的可怜虫是犯贱,与这样的可怜虫产生共鸣更是贱得不可原谅 !以后得不时地扪心自问:“今天你犯贱了吗?” 附言 武当武功讲的是十八字秘诀、六路拳、十段锦和点穴法,其中十八字以“残”为首。“残”并非解为“残忍”,而是内家拳法之一,意思是 比武交手时不存丝毫客气,出手绝不留情 。所以流传“遇少林尤可活,遇武当不可活!”起初我无法理解:武当创始人张三丰号称宅心仁厚,口头禅就是“严以律己、宽以待人”,后期何以如此铁石心肠?现在我多少有点了解了。

四类程序

四类程序 redraiment, 2009-07-25    前几天读了沈公的《 也谈写写编译器 》,很认同其观点。我也赞同“编译原理”就像数据结构一样是很基础、很实用的课程:“ unix/linux 下随便哪个项目为了方便都可能随手做一个, 这是 unix 程序员的基本功 ”。但很可惜我们学校软件工程专业不开设编译原理,理由是学了没用。   我们都知道“ 程序=数据结构+算法 ”,我们姑且通俗地说是程序由“ 数据 ”和处理数据的“ 行为 ”组成。根据程序对数据和行为的控制,可以将其归类为“硬编码”、“可配置”、“可控制”以及“可编程”四类。下面以简易计算器为例依次讨论。 硬编码   此级别的程序,数据和行为都是硬编码到代码中,执行时用户不能改变。比如在C程序中直接printf ( "%d\n", 1+2 );。这时候程序的数据“1”、“2”和行为“+”都是固定不必的。   硬编码的程序在实际应用中不常见。 可配置   到了可配置级别,程序的行为依然固定,但数据由用户来决定。比如ACM的经典入门题“a+b”:scanf ( "%d%d", &a, &b ); printf ( "%d\n", a + b );。此时程序行为依然是求和,但数据是运行时才确定,程序变得比较灵活。   为可配置的程序提供的数据文本,可以看作是一种数据格式(Data formats)。比如 /etc/passwd。 可控制   可控制的程序比可配置更灵活,运行时用户不仅可以指定数据,还能指定处理该数据的行为。即运算符“+、-、×、÷”也由用户指定。例如scanf ( "%d%c%d", &a, &c, &b );,接下来用switch (c) 分别处理四则运算。可控制就是指程序的行为可控制,但行为的范围依然是固定的。也就是说用户指定的行为必须是程序本身提供的,程序只能进行四则运算,求根、阶乘等运算行为程序没提供,因此就无法使用。   此时,程序的数据文本具有隐式操作,可以理解成一种暗含控制流的声明性语言。例如 fetchmail(1) 的运行控制语法可视为一种很弱的命令性语言。 可编程   可编程的程序,已经同时具备“输入输出、算数运算、内存管理、按条件跳...