Archive for November, 2005

信息过载

2005-11-29 22:53 | by 2ndboy

  GreatNews 里面订阅了大量的 IT 新闻资讯和 Blog,有人说 RSS 是防止信息过载的有效手段,不过我的切身体会是——恰好相反!

  每天从别人的 Blog 上阅读大量信息正使我逐渐丧失独立思考的能力,因为你看到的都是别人的思考结果,思维被套在了别人的框框里。RSS/信息依赖也会让人越来越浮躁,看着每天都有新鲜玩意出现的 Internet,情绪跟思维跟着一起 high,却忘记了自己只是旁观者,忘了自己该干什么,是时候有意识的克制自己老是把注意力集中在 RSS Reader 上了,是时候戒掉信息依赖的毛病了。

  最近几天都在忙着把房子租出去的杂乱事情,很少有心静的时候干点实事,检讨……

Google Code Jam

2005-11-23 20:36 | by 2ndboy

  昨天在 Solidot.org 上看到 Google 要专程在中国举行一次 Code Jam 大赛,由于对 Google 举办的编程比赛会出什么题目比较感兴趣就去注册了一把。比赛平台用的是 TopCoder 开发的一个专门用于程序竞赛的 Java 程序,默认界面是黑色的,看起来比较 Cool!

  进入练习后的解题界面分上下两部分,上面是用英文描述的题目,下面是代码输入窗口,写好代码后可以点击下面的编译按钮进行编译,还可以用系统提供的测试用例测试程序。解题时有 4 种语言可选:Java、C++、C# 和 VB。从看到题目开始计时,到提交了编译通过的代码后计时停止。如果再次提交代码会减分,代码被别人的测试用例挑战成功也要减分(别人加分)。

  由于 12 月 12 号才开始第一轮选拔赛,所以现在只能看到 3 个练习题,都比较简单,想必正式的比赛是不会出这么简单的题目吧?!尤其是后几轮。最近都在抽时间看 Ruby,正好可以拿这个练练手:-)就用那个 250 分的题开刀吧,题目是这样的:给定一个 20×20 的字符矩阵,左上角坐标为 (0,0),初始方向向下。开始时矩阵中每个点的值都是“.”,输入数据是若干条指令,指令只有两种,“LEFT”和“FORWARD n”,“n”是步长。程序要按照给定的一系列指令在矩阵中 walk,最终的输出就是按照指令 walk 后留下的轨迹,走过的地方用“X”标记,测试用例可以保证不会走出这个矩阵的范围。我用 Ruby 写的程序如下:

  1. class DrawLines
  2.    def execute( commands )
  3.      direction = x = y = 0
  4.      result = []
  5.      for i in 0 ... 20
  6.        result.push( '.' * 20 )
  7.      end
  8.      commands.each{ | command |
  9.        if( "LEFT" == command )
  10.          direction = ( direction + 1 ) % 4
  11.        else
  12.          steps = command.split( ' ' )[1]
  13.          result[y][x] = 'X'
  14.          for i in 0 ... steps.to_i
  15.            case direction
  16.              when 0 then y += 1  # Down
  17.              when 1 then x += 1  # Right
  18.              when 2 then y -= 1  # Up
  19.              when 3 then x -= 1  # Left
  20.            end
  21.            result[y][x] = 'X'
  22.          end
  23.        end
  24.      }
  25.      return result
  26.    end
  27.  end

  这个比我用 C++ 写的代码短多了,Ruby 的 iterater 起了很大的作用!不过由于对 Ruby 还不太熟,很多方法还是要中间查文档才知道的:-)想要测试这段代码可以这样:

  1. ( (DrawLines.new).execute( [ "FORWARD 19", "LEFT", "FORWARD 19", "LEFT", "FORWARD 19", "LEFT", "FORWARD 19" ] ) ).each{ |item| print "#{item}\n" }

没打补丁的 Windows 还敢上网吗?

2005-11-22 22:52 | by 2ndboy

  今天听同事说他的电脑又中毒了,问了问,他的系统居然没打补丁!呵呵,现在用没打补丁没装防火墙的 Windows 上网比开着门睡觉都危险!有专家专门做过实验,用几台裸机装上 Windows、Linux 和 BSD 系统接入互联网,BSD 是最安全的,其次是 Linux,最差的当然要数 Windows 了,这样一个 Windows 的“蜜罐”系统在接入互联网之后最快只要几分钟就会被蠕虫和病毒感染。

  我现在的办法就是把装好的系统打了补丁再用 Ghost 备份下来,重装的时候几分钟就搞定了。当然,第一次装系统怎么办呢?似乎没有什么好办法:-)我没有这样做之前都是“冒着生命危险”在线打补丁,打完补丁后再杀毒,还别说,每次都是正打着补丁就被感染了。严重的时候正打着补丁呢就跳出来个对话框说还有几秒钟重启,搞得人心惊胆战!所以后来我干脆就把常用且重要的补丁下载到本地硬盘上,装完系统先离线打补丁,之后装杀毒软件防火墙,然后装防火墙。

  这些还不够,我每次装完系统都要到“管理工具-服务”里面把“Server”服务关掉再改成手动,这样好像更安全些,这个服务的描述里面写着“提供 RPC 支持……”,这年头,看到 RPC 这个缩写就让人觉得不放心。

  防火墙装好之后我一般要把 TCP 和 UDP 的 135-139 还有 445 端口全部封掉,就算这样还是不放心,一看见网络连接图标无缘无故的亮起来就马上把 TCPView 开起来侦察一番。这可确实不是我神经质,是血的教训啊!话说一年前,那时我的安全意识还不太强,一天晚上,坐在电脑前突然发现网络连接图标亮了起来,但是我没有用浏览器,也没开着 IM,用 TCPView 看了一下,发现一个从没见过的进程跟远端有个连接,赶紧把网线拔掉。一查,原来已经有人通过不知道什么途径在我的机器上种了个改过名字的 tftp,估计再发现的晚点,各种木马、后门、远程控制就会被源源不断的传上来了,怕怕!一朝被蛇咬,十年怕井绳啊!

  想想那些普通的用户,一般就上上网,玩玩游戏,谁会知道还有这么多道道?!放在硬盘上的私人文件说不定哪天就被什么人复制了,更可怕的是 MIC 和 WebCam,不用的时候还是拔下来的好,要不……:-)其实如果有条件的话,前面加个宽带路由器会好一些,但用 Windows 上网的话,打补丁、装杀毒软件、装防火墙再设置真是必不可少的步骤啊!

在 wxWidgets 中使用 RichEdit 及超链接自动识别

2005-11-20 23:28 | by 2ndboy

  wxWidgets 中没有专门的 wxRichTextCtrl 类,只有 wxTextCtrl 类,要使用 RichEdit 的话只要在创建 wxTextCtrl 控件时指定 wxTE_RICH 或 wxTE_RICH2 属性即可,另外要让 RichEdit 对超链接自动识别还要加上 wxTE_AUTO_URL 属性。用上述步骤创建出来的文本控件已经可以自动识别超链接了,但是想要让它对鼠标点击动作作出反应还需要一些额外的手续。

  用 Win32 SDK、WTL 或 MFC 进行这项工作时需要响应 RichEdit 控件的 EN_LINK 通知消息,在传过来的参数中可以取得超链接的起始和终止位置,从而得到超链接文字。在 wxWidgets 中也基本是这个原理,我们需要做的消息映射是:EVT_TEXT_URL( IDC_RICHEDIT, OnTextUrl ),OnTextUrl() 的原型如下:
void OnTextUrl( wxTextUrlEvent &event );
然后用 event.GetURLEnd() 和 event.GetURLStart() 就可以取到超链接的位置了,但是我试了一下,我正在用的 2.6.0 版似乎对中文的支持有点问题,用 wxTextCtrl.GetRange() 取到的内容有点偏差。比如 RichEdit 中的内容是“测试http://www.google.com”,用返回的超链接位置取到的内容却是“试http://www.google.c”,看来 wxWidgets 传给我们的数据是按字符算的,但是我们调用的 GetRange() 却是用字节来计算的。想来想去又换了一种方法,就是先用得到的位置将超链接选中(这一步执行正确),再获取选中的内容,结果还是有点偏差。无奈,只好用 Win32 SDK 的方法解决了这个问题,后果就是这部分代码不再具有跨平台的能力了:-(

最后的代码如下:

  1. void
  2.  FooWnd::OnTextUrl( wxTextUrlEvent &event )
  3.  {
  4.    if( !event.GetMouseEvent().LeftIsDown() )
  5.      return;
  6.  #ifdef WIN32
  7.    char *pURL = new char[event.GetURLEnd() - event.GetURLStart() + 2];
  8.    if( pURL )
  9.    {
  10.      memset( pURL, 0, event.GetURLEnd() - event.GetURLStart() + 2 );
  11.      TEXTRANGE tr = { { event.GetURLStart(), event.GetURLEnd() }, pURL };
  12.      SendMessage( (HWND)m_pRichEdit->GetHWND(), EM_GETTEXTRANGE, 0, (LPARAM)&tr );
  13.      NavigateURL( pURL );
  14.      delete[] pURL;
  15.    }
  16.  #endif
  17.  }

  这肯定是 wxWidgets 的一个 Bug,有时间可以试着给他们写个 patch,如果我能搞定的话:-)

买书和随想

2005-11-19 17:38 | by 2ndboy

  GF 今天又回家了(呓?我为什么要说又),杭州本来就没有什么同学,而我们今年又搬到了开发区住,所以 GF 不在的双休日我就过得度日如年,非常无聊。最近杭州一直阴雨不断,天气也冷得可以,但我实在不想把自己一个人闷在家里,所以决定下午到附近的博库书店逛逛。

  吃完午饭后冒雨来到书店,街上寒气袭人,风也比较大,书店里稍稍暖和一些。用塑料袋包了雨伞我就径自上了二楼的计算机书区,不过今天对计算机书兴趣不大,很多 Java、C++、软工的书拿起放下,翻翻而已。对了,书店里放了些电脑供读者查询之用,但是在查英文时居然只能输入全大写(这还是好心的工作人员告诉我的),否则就没有结果,我说呢,怎么明明架子上满满腾腾的 Java 书在电脑里一本也查不出,这样的设定未免也太弱智了吧?!

  在 Java 书柜最下层的角落里发现了两本台湾工程师蔡学镛写的《Java 夜未眠》,一直对这本书有点兴趣,在这样一个无聊的下午坐在书店里看这样的一本小部头书无疑是个很好的选择:-)虽然书中收录的大都是作者 2000 年左右在专栏里发表的散文,但用词生动幽默,让人读起来颇有兴致,不知不觉的就到了下午 4 点。看完这本书后又接着在计算机区和临近的经济类区乱逛,发现了两本专写 Google 的书,其中一本《搜主意》我已经在新浪读书频道看了连载,另一本却没有听说过,但拿起来翻了翻却发现内容大同小异,都是从 Google 的企业文化、创始人和产品中进行分析,视图去为读者描绘出一个 Google 成功的清晰轨迹。但我想,成功只能学习却无法复制,就算人家当年用某某方式可以取得成功,拿至今时今日,特别是换作不同的人去执行,结果却可能是大相径庭的。

  下雨天坐在安静的书店里看看书真是个不错的主意,尤其是窗外的凄风冷雨跟室内的环境对比强烈的时候,更是种享受:-)

  说说今天的收获,其实今天买的两本书我都已经有了电子版,但我仍然固执的认为,好书就值得收藏,在看书的过程中在留白里写下自己的心得和批注,这都是一种对过程的享受和对走过的路留下的足迹。一本是赵炯博士写的《Linux 内核完全注释》,机械工业出版社出版,42 元。最初知道这本书是从一个同事那里,当时还没有这本书,只是赵炯博士在 www.oldlinux.org 上公开的 PDF 文档(也就是这本书的雏形)。以 Linux 0.11 为蓝本分析 Linux 内核并进行完全的注解确实是个好主意,随着 Linux 内核的不断进化,其代码量也越来越大,读完这个 Linux 内核是不可能完成的任务,早就想买这本书来仔细读读,今天终于如愿。不过现在能静下心来读书的时间还真是少得可怜,尤其是这么一本需要一边读一边在头脑里形成大局观的书,但愿不要被我束之高阁:-)

  另一本是成君忆著的《水煮三国》,其实这本书成名已久,电子档我也看了一部分,但还是前面说过的那句话,好书就值得收藏。况且在做程序员之余提升一下自己在其它方面的能力也是应该的,我不认为程序员作为一个职业可以干到五六十岁,今后的路还要在不断领悟这个世界的基础上好好规划,以后可以做什么?业余时间的修炼也许可以让自己在将来的机会面前不至于失之交臂吧?

  做一个程序员是我初中以来的梦想,在自己的努力和兴趣驱动下,这个梦想在大学毕业后很自然的实现了。然而,大概正因为一个持续了九年的梦想做得太久了吧,一朝实现后的那种梦想缺失和身处变革社会中的迷茫却让我有了另一番体验和思考,也许人就是在梦想、过程、茫然中一路前行的吧,但愿我可以不断超越自己,在几年后真的三十而立!在十几年后能够四十不惑!