tag:blogger.com,1999:blog-54971530666594196892008-08-25T22:02:42.580+08:00tony cheung‘’ Technische schriftlich技术性文字Tony Cheungnoreply@blogger.comBlogger33125tag:blogger.com,1999:blog-5497153066659419689.post-69530122886186206892008-03-25T00:12:00.001+08:002008-03-25T00:13:49.994+08:002008-03-25T00:13:49.994+08:00在 VMWare linux 0.11 上搭建 gcc 1.4 开发环境<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cppblog.com/Files/jb8164/linux0.11.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://www.cppblog.com/Files/jb8164/linux0.11.jpg" border="0" alt="" /></a><br /><span class="Apple-style-span" style=" ;font-family:Verdana;font-size:13px;"><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "> <span class="Apple-style-span" style="font-size: medium;">读赵烔博士的 Linux 0.11 内核完全注释, 受益良多,总想在 Linux 0.11 搭建一个开发环境,这样可以按自己的想法修改内核代码并编译了。抱着这个想法,今天在 VMWare 上实践了一回。现将操作过程记录于下,一来做个备忘,二来若对有此想法的人稍有帮助,则甚欣慰矣!</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">1. 获取 gcclib-1.40.taz</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">2. 通过 VMWare 创建一个软盘映像文件 fd.flp</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">3. 在 VMWare Ubuntu 的虚拟机上添加一个软驱设备,并指定此映像文件 fd.flp</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">4. 启动 Ubuntu (注意启动之前要设置其 BIOS 从硬盘启动优先), 用如下命令低格此映像文件:<br /> fdformat /dev/fd0</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">5. 格式化,建立 ms-dos 文件系统<br /> mkfs.msdos /dev/fd0</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">6. 挂接软盘到 /mnt/floppy<br /> mount -t vfat /dev/fd0 /mnt/floppy</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">7. 将 gcclib-1.40.taz 存入软盘映像文件<br /> cp gcclib-1.40.taz /mnt/floppy</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">8. 执行实际的写入操作<br /> umount /mnt/floppy</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">9. 在 VMWare linux0.11 的虚拟机上添加一个软驱设备,并指定刚创建的 fd.flp 为映像文件</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">10.启动 linux0.11, 将软盘映像里的文件拷贝到 /usr/root 下<br /> mcopy B:\* /usr/root</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">11.解压 gcclib-1.40.taz, 并拷贝到合适位置<br /> tar xzvf gcclib-1.40.taz<br /> cd /usr/root/gcclib-1.40<br /> cp -r /usr/root/gcclib-1.40/include /usr<br /> cd /usr/root/gcclib-1.40/local<br /> cp -r * /usr/local</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><span class="Apple-style-span" style="font-size: medium;">12.测试你的 gcc<br /> gcc -o hello hello.c<br /> ./hello</span></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><br /></p></span>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-85069246661026314442008-03-24T16:16:00.001+08:002008-03-24T16:18:15.032+08:002008-03-24T16:18:15.032+08:00AJAX in Rails with Authenticity Token<div class="entrybody"> <p>这是一篇很重要的转载文章。</p><p>如何从Rails框架中全部去掉Authenticity Token 功能:</p><p>注释掉Application Controller中的protect_from_forgery语句。</p><p>When you use active_record_store instead of the cookie-based default, you need to uncomment the line in controllers/application.rb that says protect_from_forgery :secret => ‘blah’. This makes sure all your HTML and JavaScript requests are coming from your web application. It essentially protects you from something called “Cross-site request forgery” by embedding a token into your web forms.</p> <p>As a side note, it’s really not giving you much security at all, but that might be better left for another blog post.</p><p><br /></p> <p>I was banging my head against the wall yesterday trying to figure out why a custom Ajax.Updater wasn’t working and I kept getting an ActionController::InvalidAuthenticityToken exception. I decided to dig into the request_forgery_protection.rb file in actionpack-*/lib/action_controller and found that for custom requests, you need to include the authenticity_token yourself by taking advantage of the form_authenticity_token helper. When building the updater’s request url I just added “&authenticity_token=<%= form_authenticity_token %>” to the end and everything was fine.</p> <p>Another way would be to not use the forgery protection at all for that action by including this in your controller: protect_from_forgery :except => :updater</p> <p>You can also completely remove forgery protection from a controller by doing skip_before_filter :verify_authenticity_token</p> <p>Back to the vulnerability of your web forms: I imagine this does protect your web application from someone hosting a form on their site that posts to your site. However, if someone really wants to spam some stuff they’ll scrape your page with cookies enabled on their scraping software, scrape your form’s fields (which include the authenticity_token hidden field) and POST to their heart’s desire.</p> </div>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-75789111156534248212008-01-25T10:52:00.000+08:002008-01-25T10:53:15.580+08:002008-01-25T10:53:15.580+08:00IE和Firefox处理透明效果的CSS<pre>td.pop_topleft {<br /> background-image: url('../img/pop_dialog_top_left.png')!important;<br /> background-image: none;<br /> filter: none!important;<br /> filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.xiaonei.com/img/pop_dialog_top_left.png', sizingMethod='crop');<br />}<br /><br />td.pop_topright {<br /> background-image: url('../img/pop_dialog_top_right.png')!important;<br /> background-image: none;<br /> filter: none!important;<br /> filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.xiaonei.com/img/pop_dialog_top_right.png', sizingMethod='crop');<br />}</pre>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-25150713242425435772007-12-02T17:44:00.000+08:002007-12-02T17:58:55.936+08:002007-12-02T17:58:55.936+08:00Discuz!稳定性有个很哲理的话:复杂的系统,稳定性必然下降。Discuz!的插件制作人员参差不齐。很容易导致Web服务死掉。<br /><br />而且通常毛病出在频繁的读取数据库,导致连接数过大。<br />最近woodk总是访问不上,也不是特别清楚具体的原因。<br />从昨天装上Google Analytics开始分析数据量,并且查看系统错误日志。<br />大体定位在RSS在升级的时候出现错误,还有就是PLUGIN的问题。<br /><br />刚才关了论坛的RSS功能。先看看是不是不会无缘无故死了。<br /><br />另外,发现APM-Server这个东西太复杂了。可能APM-Express的稳定性更加高,再挂就换APM-Express了。坚信简单即稳定。Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-47652447144339139492007-11-28T08:54:00.000+08:002007-11-28T09:02:04.181+08:002007-11-28T09:02:04.181+08:00How to write a Copyright?<h1 style="font-weight: bold; text-align: center;font-family:verdana;" id="ctl00_ContentPlaceHolder1_ArticleTitle"><span style="font-size:100%;">关于版权声明的写法</span></h1><span style=";font-family:arial;font-size:100%;" >格式应该是:Copyright [dates] by [author/owner]</span> <p style="font-family:arial;"><span style="font-size:100%;">© 通常可以代替Copyright, 但是不可以用(c)。 All Rights Reserved 在某些国家曾经是必须的,</span></p><div style="display: none;" id="ggovtqkftlon">供网G,'gP中教c软e</div><span style=";font-family:arial;font-size:100%;" >但是现在在大多数国家,都不是法律上必须有的字样。 </span><p style="font-family:arial;"><span style="font-size:100%;">参见下面几个正确的格式:</span></p> <p style="font-family:arial;"><span style="font-size:100%;">©1995-2004 Macromedia, Inc. All rights reserved.</span></p> <p style="font-family:arial;"><span style="font-size:100%;">©2004 Microsoft Corporation. All rights reserved.</span></p> <p style="font-family:arial;"><span style="font-size:100%;">Copyright © 2004 Adobe Systems Incorporated. All rights reserved.</span></p> <p style="font-family:arial;"><span style="font-size:100%;">©1995-2004 Eric A. and Kathryn S. Meyer. All Rights Reserved.</span></p><p style="font-family:arial;"> InfoQ.com 及其所有内容,版权所有© 2006-2007 C4Media Inc. InfoQ.com 服务器由 <a href="http://www.contegix.com/">Contegix</a> 提供,我们最信赖的 ISP 合作伙伴。 <a href="http://www.infoq.com/cn/PrivacyPolicy.jsp">隐私政策</a></p><p face="arial"><span style="font-size:100%;"><span id="ctl00_ContentPlaceHolder1_ArticleContent"><p>现在流行some rights reserved:creativecommons.org</p> <p>some rights reserved 和copyright 本身并不矛盾,但是其中的界限更多是一个道德问题,真正的保留一部分权力,是指给浏览者fair use 的权利,fair use的界定也决不是随便乱用,或者抄袭。</p> <p>甚至说,除了copyright, 还有copyleft,它的定义是为了程序员开发能够共享源代码的一个方式,英文里free, 并不仅仅是免费。 而且这种的源码公开免费使用,和版权也一点都不冲突。请大家不要误解。</p> <p>对于从网上下载素材,如音乐,图片等版权问题, 有朋友问这个问题,答案很简单,所有的这些都有版权问题。和这些作品的大小格式没有关系。</p> <p>这也是为什么经典论坛不讨论下载的原因,包含字体,同时经典网站也希望其他的网站能尊重本站作者的版权。</p> <p>版权是互相的,因为每个人都在随时的拥有着你所刚刚创造的作品的版权,哪怕你的涂鸦之作已经被丢进垃圾桶,<span style="display: none;" id="dvvibbsgqa">供TsIVA络.08</span>严格意义上,那也不可以被人抄袭的。不然公司就不需要碎纸机了。</p> <p>只有彼此的尊重,互相的尊重才能有真正意义上的共享,简单的拿来主义,或者因为我是经典的用户,所以别人就必须要尊重经典的版权,而我不必尊重别人的版权,是不会形成好的版权保护意识的</p> <p>版权其实并不意味着付费,和商业化也没有直接的关联。很多时候,你如果真想使用版权保护的内容,只要发封邮件,询问一下许可就可以, 大多数的情形下,个人用户是很喜欢甚至欣赏这样的礼貌和尊重的。</p></span></span></p>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-19641345059980994512007-11-27T15:18:00.000+08:002007-11-27T15:19:40.456+08:002007-11-27T15:19:40.456+08:00What is the htmllite.dll in Visual Studio Install Packet?http://www.codeproject.com/miscctrl/htmllite.aspTony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-79342346794074223512007-11-23T14:09:00.000+08:002007-11-25T15:31:51.719+08:002007-11-25T15:31:51.719+08:00IM Survive in China2020?<br /><br />1.Fetion<br />2.MSN<br />3.Yahoo Messenger<br />4.Google Talk<br />5Skype<br />6.QQ<br /><br />用户一般只开1-3个通讯软件。Fetion特殊性除外,那么这个表单里MSN,Yahoo,Google Talk可能被经常使用。<br /><br />这里没QQ什么事情。QQ将在2020年退出IM主要市场。Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-91361134091869305022007-11-22T20:41:00.000+08:002007-11-22T20:50:50.420+08:002007-11-22T20:50:50.420+08:00Journey Man - Can Change The History?<span style="font-family:verdana;"><strong>Journey Man really can change the history?</strong></span><br /><span style="font-family:verdana;"><strong>Yes.It is.</strong></span><br /><span style="font-family:verdana;"><strong>But....it will be a big trouble.</strong></span><br /><span style="font-family:verdana;"><strong>example:</strong></span><br /><span style="font-family:verdana;"><strong></strong></span><br /><span style="font-family:verdana;"><strong>Your wife was dead in a air accidence in 2001.</strong></span><br /><span style="font-family:verdana;"><strong>You! back in 2001 stoped her!</strong></span><br /><span style="font-family:verdana;"><strong>Now you are back home in 2007....guess what!</strong></span><br /><span style="font-family:verdana;"><strong>You have 2 wives!</strong></span><br /><span style="font-family:verdana;"><strong></strong></span><br /><span style="font-family:verdana;"><strong>lol..</strong></span>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-33094005559744609232007-11-20T14:46:00.000+08:002007-11-20T14:50:26.099+08:002007-11-20T14:50:26.099+08:00Oracle Mix: First large JRuby on Rails app onlinehttp://www.infoq.com/news/2007/11/oracle-mix-jruby<br /><h1><span style="font-size:100%;">Oracle Mix:网上第一个大型JRuby on Rails应用</span></h1><p class="info"> 作者 <strong>Werner Schuster</strong>译者 <strong>郭晓刚</strong> 发布于 2007年11月15日 下午9时7分 </p> <p>Oracle刚刚发布了<a href="https://mix.oracle.com/">名为Oracle Mix的社交网络Web应用</a>——<a href="http://oracleappslab.com/2007/11/12/lets-mix/">它用的是JRuby on Rails</a>: </p> <blockquote>到目前为止对Oracle Mix的反响都是正面的。我要澄清一下Paul对Mix的技术架构的评论……它的运行环境是Oracle Application Server、Oracle Database、Oracle Internet Directory、Oracle SSO和JRuby on Rails。据我所知,Mix是首个也是最大型的面向公众的JRuby on Rails部署。最棒的是我们用了不到5周时间就实现了它……在ThoughtWorks的优秀人员的帮助下。 </blockquote> <p>这是<a href="http://www.thoughtworks.com/">ThoughtWorks</a>继<a href="http://studios.thoughtworks.com/mingle-project-intelligence">Mingle</a>和<a href="http://cruisecontrolrb.thoughtworks.com/">CruiseControl.rb</a>之后涉足的又一个JRuby项目。JRuby团队成员以及ThoughtWorks员工<a href="http://ola-bini.blogspot.com/2007/11/oracle-mix-has-launched.html">Ola Bini也参与了Oracle Mix项目</a>: </p> <blockquote>在之前的5个星期里,由我、Alexey Verkhovsky、Matt Wastrodowski和Toby Tripp几个来自ThoughtWorks的人,再加上来自Oracle的Rich Manalang,共同以一个Oracle内部应用为基础创建了一个新应用。这个网站叫做Oracle Mix,目标是作为Oracle的客户与Oracle以及客户之间相互沟通的途径,客户们还可以提出建议,回答彼此的问题以及建立一般的联系网络。 </blockquote> <p>你在实际投入使用的系统中使用了JRuby on Rails吗?你会如何使用JRuby on Rails——是编写专门的JRuby应用,还是用它来运行已有的Rails应用? </p>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-36658816318853048092007-11-19T20:48:00.000+08:002007-11-19T20:51:43.468+08:002007-11-19T20:51:43.468+08:00Naio Talk will be build in .NET Framework/WindowsNaio Talk (Client)通讯组建将使用C#语言编码,基于.NET Framework平台运行。<br /><br />Naio Talk在0.0.1,0.0.2陆续测试开发的时候碰到了一个疑惑,是不是要反过头来用MFC/C++完成,于是听了将近好多个星期。<br /><br />今天吃晚饭前,和STO在路上随便聊了几句。终于鉴定了继续使用C#的信念。Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-24548361946943466002007-11-18T10:38:00.000+08:002007-11-18T10:59:34.594+08:002007-11-18T10:59:34.594+08:00How will be ctyle.com look like?<span style="font-size:100%;"><span style="font-weight: bold;font-family:verdana;" >Ctyle</span></span> 这个单词衍生自style<br /> 这个衍生和现在比较火热的SNS社区有关。xiaonei在净化环境方面还是不错的,但是不能避免的事用户使用她的方式。大学生们大部分还是在猎艳。还是比较少的真正关注身边的朋友。<br /> ctyle,意味着一种社区风格,将用户引导“和谐”的生活风格,少些sex的东西,多谢真正的生活乐趣,关心身边的朋友,Care the reall friends nearby.....<br /><br />这就是<span style="font-weight: bold;font-family:verdana;" >Ctyle</span>的定义。<br /><br /> 另外,太多的商业气氛不利于青少年的身心健康发展。VC们,你们是不是希望自己的孩子在网络生活中使用QQ,而QQ随时随地,带领他们接触到黄色,裸体的这样一个通讯工具?你们虽然很有钱,但是希望孩子把钱浪费在无谓的QQ币上?同样是一种对青少年消费心理不健康的影响。<br /><br /> 校内币,QQ币,都是人民币换的。在<span style="font-family: verdana; font-weight: bold;">Ctyle.com</span>中,类似积分的东西将不会与金钱挂钩,而是使用用户及其周围朋友的矩阵公式来计算,你人品越好,这个月得到的积分越多。<br /><br /> 同时我已经为<span style="font-family: verdana; font-weight: bold;">Ctyle.com</span>设计好了评估用户热门的公式,不是通过那个人访问次数多来决定。那样决定将返回到了SEX诱惑。美女被刷的非常多。我使用的同样是最大向量值计算。这样即使你是美女,人品不行,同样打分很低。这些都是有系统功能公式计算出来的。<br /><br /> <span style="font-family: verdana; font-weight: bold;">Ctyle.com </span>在未来2008年春节赠送给我朋友,校友们的礼物。希望我的朋友网络生活舒服。同时,我希望发展壮大,让我后代,你的后代,能上一个绿色的网站,而不是黄色的网站。Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-12852292674393420232007-11-14T12:49:00.000+08:002007-11-14T12:57:54.898+08:002007-11-14T12:57:54.898+08:00How does the Windows Live save its password?Windows Live 程序如何在本地保存密码?<br /><br /> Windows Live 登录助手,Windows Live Messenger有自动密码保存功能。并且使用起来也很方便,Remove也很方便。如果对安全有根弦的话,就要问了,究竟密码保存在哪里?<br />文件?注册表?<br /><br /> 先不说这个。在Windows Live Blog上有这样一段描述。<br /><span style="font-size:85%;"><span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry" style="font-family:verdana;"><div><strong></strong></div><blockquote><div><strong>True Password Persistence!</strong></div> <div> </div> <div>Before the Windows Live Sign-in Assistant, the ‘save my password’ option caused your sign-in state to be persisted across multiple browser sessions (it was a persistent cookie), but hitting “sign-out” at any page would delete the cookie and the next time you wanted to log in, you were prompted for your password again. </div> <div> </div> <div>This was a frustrating experience for users.<br /></div> <div> </div> <div>With the Sign-in Assistant installed, the ‘save my password’ box will work just like it does in Messenger –<span style="font-weight: bold;"> <span style="color: rgb(255, 0, 0);">it will keep the password in a local credential store (we use the Windows Credential Manager)</span></span>. If you’ve chosen to save your password, all it takes to sign in is a single click on the appropriate user tile. This is a huge improvement over the previous experience. We’ve also made it very easy for you to remove your saved password, just click on “remove” link and the member name and password are deleted from the credential store. You are in still in control of when your credentials are saved.</div></blockquote><div></div></span></span> 所以不用管他到底存储在哪里,这已经不是重点,重点是微软Windows Live用一个类似容器的东西对密码进行了保护。存在文件还是注册表这只是容器之下的一种底层细节,说不定那个版本就把文件又转存到注册表里了。而这里的关键很显然对Windows Live密码做了加密保护。<br /> 具体怎么才能让Windows Messenger还有Assisant调用这个是具体的技术细节问题。但是目前大体有了个感性的认识。Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-62281179978262019682007-11-13T11:05:00.000+08:002007-11-13T11:37:06.193+08:002007-11-13T11:37:06.193+08:00RGB 距离计算在寻找索爱主题创建的时候在开发文档里看到这段。<br />哈,多媒体考试的时候用到的公式<br /><br />如果创建主题时没有使用 Themes Creator,则应该计算 RGB 距离以确认可以分辨这些颜色。 下面的示例显<br />示如何计算两种颜色之间的 RGB 距离。<br />注意: 对于具有 256、512 或 4096 色屏幕的手机,在极少情况下,即使 RGB 距离大于 20,元素颜色对也<br />可能无效。这是因为颜色会转换为屏幕的调色板,在 RGB 模式中不同的两种颜色可能会转换为不同的调色<br />板颜色。<br />示例:<br />计算两种蓝色(RGB(0,67,140) 和 RGB(0,82,164))之间的 RGB 距离:<br />1. 分别计算红色、绿色和蓝色值之间的差,然后计算这些差的平方。<br />红色差 = 0 – 0 = 0<br />蓝色差 = 82 – 67 = 15<br />绿色差 = 164 – 140 = 24<br />2. 将这三种颜色差的平方相加:<br />02 + 152 + 242 = 0 + 225 + 576 = 801<br />3. RGB 距离是上面那些平方之和的平方根:<br />RGB 距离 = 根号(801) = 28.3Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-25538754703441925882007-11-13T10:42:00.000+08:002007-11-13T10:56:30.181+08:002007-11-13T10:56:30.181+08:00Ruby Deployment and ScalingRails的部署与伸缩<br /><br />在Rails发布的时候,选择发布平台是开发人员关心的问题。Rails可以在很多Web服务器上运行,只要实现了CGI协议的Web服务器都可以,这是Rails的最低。<br /><br /> 容易部署 速度 伸缩<br />WEBrick ★★★★★ ★★ ★<br />Apache-CGI ★★★★ ★ ★★<br />Apache-fcgi ★ ★★★★ ★★★★<br />lighttpd-fcgi ★★ ★★★★★ ★★★★★<br />(上图来自应用Rails进行敏捷Web开发 P22 各种部署选择比较)<br /><br />虽然没有提及IIS,不过肯定也有模块可以在上面跑。<br /><br />优化考虑:<br />lighttpd:占用,轻量级。建议只在上面提供图片,JavaScript,样式表,中等规模的文件下载以及其他静态的页面。但不建议存放至关重要的数据,因为lighttpd据说存在一些严重的稳定性问题,在进行大量文件传输时候也有问题。Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-64479031472358472252007-11-08T14:08:00.000+08:002007-11-08T14:23:51.329+08:002007-11-08T14:23:51.329+08:00从Google拼音看自动升级方案要素Google 程序升级总是做的人不知鬼不觉。<br />其中有2点可以借鉴。<br /><ul><li>程序本身非常小</li><li>一旦下载,比急于更新,只是提醒您已经更新。等下次启动后自动升级。</li></ul><br />自动升级通常都需要设置一些参数。可以发现一些必须要素。<br /><br />Windows Registry Editor Version 5.00<br /><br />[HKEY_LOCAL_MACHINE\SOFTWARE\Google\Google Pinyin\Autoupdate]<br />程序安装路径<br /><span style="font-weight: bold;">"InstalledVersion"</span>="1.0.23.40"<br />更新程序下载的地址<br /><span style="font-weight: bold;">"UpdateURL"</span>="https://tools.google.com/service/update"<br />程序安装路径<br />"AppPath"="C:\\Documents and Settings\\Administrator\\Application Data\\Google\\Google Pinyin\\"<br />可用版本<br /><span style="font-weight: bold;">"AvailableVersion"</span>="1.0.23.40"<br />可用下载地址<br /><span style="font-weight: bold;">"AvailableURL"</span>="http://dl.google.com/pinyin/GooglePinyinUpdate.exe"<br /><br />"LaunchAction"="execute-wait"<br /><br />"LaunchTarget"="GooglePinyinUpdate.exe"<br />"UpdateInterval"=dword:00015180<br /><span style="font-weight: bold;">"NextUpdate"=dword:4733d9b4</span><br /><span style="font-weight: bold;">"DownloadedVersion"="1.0.23.40"</span><br />"LaunchParameter"="/S"<br /><br /><span style="font-weight: bold;">下载后解压的文件夹</span><br />"PackagePath"="C:\\Documents and Settings\\Administrator\\Application Data\\Google\\Google Pinyin\\pinyin-1.0.23.40\\"Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-73347231084950667482007-11-07T09:11:00.000+08:002007-11-07T09:15:11.057+08:002007-11-07T09:15:11.057+08:00Ruby On Rails 顺利移植的提示《Ruby on Rails 移植指南》一文中作者:Matt Kern提到关于数据库外键对于顺利移植的观点。我觉得相当认同。<br /><span style="font-style: italic;"></span><p>虽然许多开发人员喜欢在数据库中充分利用各种约束,但我发现在数据库中取消大部分限制更简单、更清洁。<span style="font-style: italic; font-weight: bold;">我认为约束是应用程序业务逻辑的一部分,并且发现当它们位于应用程序代码中和数据库外时更易于跟踪</span>。以<span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;" >外键</span>为例;尽管没有将<span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;" >外键</span>添加到移植的内置方法,但有插件和其他帮助可供使用。然而,我显然有点茫然,因为我认为它们并不可取。向移植添加<span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;" >外键</span>会降低数据库独立性,而且在尝试修复出错数据时会导致问题发生。可以依赖 Rails 过滤器和验证,从而避免与添加<span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;" >外键</span>相关的问题。许多开发人员(包括我自己在内)都希望能够在 SQLite3 等轻型数据库上进行开发,在 Oracle 等大型工具上进行部署和生产,移植中的<span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;" >外键</span>在 SQLite 上将不能正常使用。保持灵活。 </p> <p>尝试使每个移植类成为一个单独的任务或特性。选择最适合的工作并坚持不懈。我的经验是如果文件/类名过长,不能描述即将进行的更改,则应将其分类成 单独的移植。您应该能够根据文件名识别更改,而无需深究程序代码本身。记住,这样做的目的是使开发更高效、更愉快。我甚至可以告诉您一个小秘密: ActiveRecord 和移植也可以在 Rails 框架外使用。(当然上,这实际上并不是一个秘密,但了解这一点还是有好处的!) </p> <p>最后,测试,测试,再测试。在投入生产之前,确保移植是可靠的。运行移植时,任务的完成顺序很重要,因此测试是重中之重。例如,如果您视图在删的数 据之前更改包含该数据的列,移植将失败。我认为,最严重的错误莫过于将未经过全面测试的移植投入生产。移植很强大,但果您不够细心,它们会损坏生产数据 库。当然,为了提高开发流程效率和舒适度,如何明智地使用移植还需要长期的努力。</p>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-31100490231101878102007-11-06T23:22:00.000+08:002007-11-06T23:37:10.306+08:002007-11-06T23:37:10.306+08:00Ruby on Rails 移植(Migration)指南<div style="text-align: center;"><span style="font-size:130%;"><span style="font-weight: bold;font-family:verdana;" >Ruby on Rails 移植指南</span></span><br /></div><br />http://www.oracle.com/technology/global/cn/pub/articles/kern-rails-migrations.html<br /><br /><h1 style="font-family: verdana; font-weight: bold; text-align: center;"><span style="font-size:100%;">使用 ActiveScaffold 增强 Ruby on Rails 的功能</span></h1>http://www.ibm.com/developerworks/cn/linux/l-activescaffold/<br /><br /><div style="text-align: center;"><span style=";font-family:verdana;font-size:130%;" ><span style="font-weight: bold;" class="bold">has_many :through详解</span></span><br /></div><br />原E文地址:<a href="http://blog.hasmanythrough.com/2006/04/20/many-to-many-dance-off" target="_blank">http://blog.hasmanythrough.com/2006/04/20/many-to-many-dance-off</a><br /><br />我已注意到使用 Rails 关联在创建多对多关系的两种方式上有些混乱。出现混乱是可以理解的,因为 has_many :through 还有些新,写它的文章并不多。<br /><br />Has_and_belongs_to_many 出现的较早,确定的角色与资料超出了你为什么使用多对多关系的假设。事实上,许多人似乎并没有抓住本质上的区别。<br /><br />就像我们从观看经典影片所学到的,告诉我们两个预期选择之间的区别最好方式是它们的舞蹈。你得观察每个人的表演。那么我们必须在两者之间选择哪个演员呢?<br /><br />一、连接表:简单的关联<br /><br />表:<br /><br />create_table "dancers_movies", :id => false do |t|<br /><br />t.column "dancer_id", :integer, :null => false<br /><br />t.column "movie_id", :integer, :null => false<br /><br />end<br /><br />模型:<br /><br />class Dancer < null =""> false<br /><br />t.column "movie_id", :integer, :null => false<br /><br />t.column "character_name", :string<br /><br />t.column "dance_numbers", :integer<br /><br />end<br /><br />模型:<br /><br />class Appearance < dependent =""> true<br /><br />has_many :movies, :through => :appearances<br /><br />end<br /><br />class Movie < dependent =""> true<br /><br />has_many :dancers, :through => :appearances<br /><br />end<br /><br />has_many :through 关联对这个简单例子来说很容易设定的,但是当使用其它特征如 polymorphism 时要有些技巧。用于连接模型的表有个主键并包含了类似其它模型的属性。<br /><br />三、Checking out the moves<br /><br />下面是对两种操作基本特征的比较<br /><br />-----------------------------------------------------------------------------------<br /><br />关联 has_and_belongs_to_many has_many :through<br /><br />----------------------------------------------------------------------------------<br /><br />AKA habtm 关联 遍历关联<br /><br />结构: 连接表(Join Table) 连接模型(Join Model)<br /><br />主键: 无 有<br /><br />富关联 否 是<br /><br />代理集合 是 否<br /><br />Distinct 选择 是 是<br /><br />自引用 是 是<br /><br />早期加载 是 是<br /><br />多态性 否 是<br /><br />多向连接 否 是<br /><br />------------------------------------------------------------------------------------------<br /><br />该表格内包含了很多东西,现在我们分别看一下:<br /><br />(1)、结构:<br /><br />has_and_belongs_to_many 使用了简单的连接表,表的每一行记录只有两个外键。没有为连接表使用模型类的连接记录从不会被直接访问。<br /><br />has_many :through 更新连接表为一个完整的模型。它使用一个模型类来表现表内的条目。<br /><br />(2)、主键:<br /><br />连接表没有主键。我听说一些人,如从外键对创建一个主键,但 Rails 从不为任何东西使用主键。我不能肯定你为什么要得到创建的主键,虽然它可能依据你数据库给你一些性能上的好处。 (我不是一个 DBA ,所以对于主键不想说得太多。)<br /><br />连接模型有键,就像其它模型。这意味着你可以直接地访问及管理记录。<br /><br />(3)富关联:<br /><br />在 Rails 1.1 以前,你使用 push_with_attributes 来存储额外的属性到你的 habtm 连接表内。这样做会带来很多问题,包括随后不能更新属性。Push_with_attributes 现在不再使用了。如果你希望一个带有额外属性的富关联的话,使用连接模型。<br /><br />(4)、代理集合:<br /><br />使用 habtm 的一个好处是,关联是个代理集合。这意味着你可以使用关联的 << 方法在连接表内创建条目,就像 has_many 关联。因为连接模型记录有这些额外属性,所以用同样方式来自动创建连接表条目会更复杂。所以你必须手工创建连接模型条目。(更完整的解释,可参阅我的 Why aren't join models proxy collections? 文章。) (5)、Distinct 选择: 有时候,连接表(或模型)在同样的记录之间可能有多个引用。例如,一个人可能是一本书的作者及插图绘制者。如果你有多个引用,数据库会返回给你所有与你查 询相关多条记录。选项 :uniq 告诉关联过滤重复的对象,以便你只得到每个记录的一条显示。这类似于在 SQL 中使用 DISTINCT 关键字,但这是在 Ruby 内而不是数据库内移除重复发生的记录。这篇文章原只由 habtm 支持的 :uniq 才能查到,但现在通过 through 关联也可以查到。 (6)、自引用: Habtm 与 through 关联都可是自引用的。Users 的朋友用户就是一个自引用关系的例子。你可以通过在关联上使用带有 :foreign_key 与 :association_foreign_key 选项的 habtm 来完成。同样也可以使用 through 关联,因为它的做法不太明显,所以稍后我会写出如何处理它。 (7)、早期加载 Habtm 与 through 关联都通过 :include 选项来支持被关联对象的早期加载。 (8)、多态性: 连接模型与 through 关联可以用 polymorphic 模型类型工作。 (9)、多向连接 一个 habtm 关联只可以连接两个模型。但有时候你需要表现多个模型的关联。例如登记的可能是一位飞行家,一个乘客,及一个座位的分配。使用 through 关联,你可以创建一个连接模型,它连接你需要的多个模型。技巧部分是如何构建可方便地得到被关联对象的查询。 四、And the winner is... has_and_belongs_to_many 的使用范围狭小。但 has_many :through 则很广泛。 Seriously, there's no way to pick a winner here. Like any engineering decision, choosing a join table or a join model is a matter of picking the right tool for the job (or the right dancer for the part). Now that you've seen our players go head to head, you can make a better choice about who should get that part. 五、回帖部分: 1、David on 2006年4月21日 关于 distinct 选择 ---- 我认为你可以附加 :select 'DISTINCT *' 给关联,类似于: has_many foos, :through => bars, :select 'DISTINCT *'Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-50899112905667254732007-11-06T14:17:00.000+08:002007-11-06T14:26:24.034+08:002007-11-06T14:26:24.034+08:00案例:rapidreportig.com压力测试Rapid Reporting 将他们的“身份及收入验证 引擎”运行在Rails系统上。美国1000强的抵押担保商有80%都使用这套引擎,每月处理2百万次抵押申请交易。<br /><br />一开始,,Rapid Reporting希望检验Rails是否能够胜任,因此他们从10台集群机器向一个应用程序进行压力测试,每秒3千次请求。真是的应用程序大概需要每秒300次请求,并执行一系列的业务逻辑。因此,处理抵押业务必须遵循GLBA,因此很多地方都需要检查授权许可、生成查账索引。<br /><br />应用程序使用PostgreSQL作为数据库,lighttpd作为web服务器,每台应用服务器运行大约10个FastCG进程,在一台虚拟服务器上用IP隧道技术实现负载均衡。使用这种部署方式,就可以随时增减FastCGI进程,而不必重启web server。由此又可以实现进程管理的自动化:用一个守护进程监视负载情况,当负载达到峰值时分配更多的FastCGI进程。Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-8004121431086606672007-10-30T22:14:00.001+08:002007-11-07T08:45:42.939+08:002007-11-07T08:45:42.939+08:00一些关于 Add-In VSTO 2008的资源部署Addin<br /><a href="http://blogs.msdn.com/pstubbs/archive/2007/05/17/vsto-my-favorite-feature-clickonce-deployment.aspx">http://blogs.msdn.com/pstubbs/archive/2007/05/17/vsto-my-favorite-feature-clickonce-deployment.aspx</a><br /><br />对于Office 2007 Word Addin小小的探索<br /><a href="http://www.cnblogs.com/allenlooplee/archive/2007/09/19/898983.html">http://www.cnblogs.com/allenlooplee/archive/2007/09/19/898983.html</a><br /><br /><br />MSDN Paul Stubbs about VSTO<br /><br /><a href="http://blogs.msdn.com/pstubbs/archive/tags/VSTO/default.aspx">http://blogs.msdn.com/pstubbs/archive/tags/VSTO/default.aspx</a><br /><br />Addin 部署<br /><a href="http://www.cnblogs.com/epjnpe/archive/2007/09/23/902924.html">http://www.cnblogs.com/epjnpe/archive/2007/09/23/902924.html</a>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-91520055851369749562007-10-29T20:34:00.000+08:002007-10-29T20:38:02.826+08:002007-10-29T20:38:02.826+08:00如何用Code Access Security技术来保护代码,使代码不致被恶意调用 作为一名.NET开发人员,你没日没夜地写代码,你的组件运行在越来越多的机器上。忽然有一天,你发现你写的组件被引用在别人写的项目里,而且最可气的是,那人竟用你的名义在做破坏它人系统的恶事!你忍不住了,大叫一声Oh shit!,然后打开MSDN,看看有什么办法能帮助你阻止这场阴谋。<br /> OK,办法找到了,那就是。NET平台提供的Code Access Security.有大量继承于CodeAccessPermission的类可以帮你实现不同方面、不同范围的代码安全控制。你所需要做的只是从中挑出最适合的类别加以应用,从而达到保护你的组件的目的。<br /> 在经过一番挑选之后,你最终确定了使用StrongNameIdentityPermissionAttribute类。这个类允许你将组件(或类、方法)与某一强名称(通常就是你发布程序时所用的强名称)绑定,这样,只有在客户端程序具有该强名称签名的情况下才能使用你的组件。也就是说,除了你自己编写的客户端代码因为拥有同样的签名而被允许使用组件以外,任何第三方代码都无法通过StrongNameIdentityPermissionAttribute的防护,因此也就无法恶意调用你的组件了:)。听起来真的不错,马上就动手做吧!<br /> 为了简便起见,先创建一个很简单的Class Library项目,代码如下:<br /> // SecureComp.dll<br /> using System;<br /> namespace musicland<br /> { <br />public class SecureComp<br /> {<br /> public string Confidential()<br /> {<br /> return "This is confidential!";<br /> }<br /> }<br /> }<br /> 现在的这个组件非常可怜,因为任何人都可以写代码来调用它。下面,你就要耍点手段了:):<br /> 首先引入System.Security.Permissions命名空间:<br /> using System.Security.Permissions;<br /> 然后,在组件级加上StrongNameIdentityPermissionAttribute属性:<br /> [assembly: StrongNameIdentityPermissionAttribute(SecurityAction.RequestMinimum, PublicKey="0024000004800000940000000602000000240000525341310004000001000100c11c8497d“+ “283259f23d645358d65812b69136846b03a7d15124545fc3ed27d89d1330cceda4232c7bc6e8a0e7ecd857f8”+ “126d0859e2300237b3cab6f7737a92f585cbf2afb4b475c537703efb96e17e5921ff00c6e022b22f3d772f14”+ “6a3a5c7f6ccad3131b8d0465e6709e5a28cc3ca1c8b610af4162c1a18c0feb8e6993ab1")] namespace musicland …<br /> 注意,这里使用了SecurityAction.RequestMinimum,这申明除非获得StrongNameIdentityPermissionAttribute所表明的资源访问权限(即对SecureComp.dll组件的访问权限,可以把SecureComp.dll看作一样资源),否则CLR不会准许调用方(即客户端代码)访问所请求的资源;此外,在PublicKey属性中加入了你所允许的公匙(Public Key)的十六进制表示(转化成字符串类型)。CRL在运行期间将依照这一段公匙来判断调用方是否合法,除非调用方拥有相应的私匙(Private Key),否则将无法访问。看来,平时一定要倍加保护你的密钥文件,因为密钥文件(特别是private key)的泄露将会成为你无尽恶梦的根源,而延迟签名(delay signing)在这里也就显得格外重要了:。)<br /> 说到这里,你一定会有个大大的问号:这长长的一串PublicKey是怎么得出来的?难道要我凭空凑出来不成?当然不是。还记得那个Sn.exe工具吗?通过它就可以把PublicKey给提取出来。OK,打开你的命令行,定位到密钥文件所在目录并输入以下内容:<br /> sn –p Key.snk PublicKey.snk<br /> 这样,提取出来的公匙信息就被存储在PublicKey.snk文件中。你现在只需把公匙信息读取出来并转化成适当的格式就可以了。这里,你可以使用。NET Framework自带的Secutil.exe工具,但据我所了解,Secutil工具的输出都是数组格式(我在自己的机器上测试了Secutil所提供的全部输出选项,但所得结果都是一样,这让我很感意外,不知大家是否有更好的办法),因此就动手自己写了一个小工具来完成这一读取和转换。大家如果感兴趣可以发邮件给我(因为我没有自己的网络空间可以存放。当然你也可以自己来写,因为它实在是太简单了,就是读取二进制文件)。<br /> 好了,现在你的代码就被全副武装起来了。试着写一个Console客户端来调用SecureComp,结果怎么样?是不是“无法获得相应权限”?试着用Key.snk给客户端程序签名后再访问,这回可以访问了吧!:)<br /><br /> 结论:适当地应用Code Access Security可以使你的代码被保护起来,不致被第三方不正确调用;但是过多的安全保护也将造成代码运行效率下降,从而带来负面影响。<br /><br />转载: <a href="http://dotnet.csdn.net/page/ee384219-8735-45d8-80fb-d365946d7ffb">http://dotnet.csdn.net/page/ee384219-8735-45d8-80fb-d365946d7ffb</a>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-18294108173221324772007-10-28T15:19:00.000+08:002007-10-28T15:39:01.166+08:002007-10-28T15:39:01.166+08:00Besti Talk折腰的第一个版本<a href="http://bp3.blogger.com/_ixvUuH2oMHg/RyQ5l3e2YtI/AAAAAAAAAlc/GkxXr0mIq_Y/s1600-h/%E6%9C%AA%E5%91%BD%E5%90%8D-1.jpg"><img id="BLOGGER_PHOTO_ID_5126285598565753554" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp3.blogger.com/_ixvUuH2oMHg/RyQ5l3e2YtI/AAAAAAAAAlc/GkxXr0mIq_Y/s320/%E6%9C%AA%E5%91%BD%E5%90%8D-1.jpg" border="0" /></a><br />黑色的Title是可以当MouseDown的时候接受窗体拖动的。<br />窗体边框是可以resizer的。这个问题在昨天的日志上已经提到了怎么实现。<br />阴影效果同样在昨天的日志中已经提及。<br />最大的问题是突然间Jabber服务器一个都登录不了了。真伤心。<br /><br />通宵写程序容易发迷糊。 整个风格都是模仿Google talk完成的。对了,要值得提及的是:我把Google talk中的 设置和帮助标签放到了TrayIcon里了。那个不常用的按钮没有必要出现在重要的位置,去掉后可以把图像的照片调整的更加大,就美观多了。<br /><br />这个.NET界面是折腰了。未来多月内修改一下,还是打算用WinAPI老老实实的完成。Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-21148818145646548482007-10-27T23:58:00.001+08:002007-10-28T00:52:07.626+08:002007-10-28T00:52:07.626+08:00如何实现IE协议调用本地程序? 刚才在看zuola的Blog的时候,看到右上有<br /><ol><li>skype:+8613467668333?call</li><li>skype:zuola.com?add</li><li><a href="mailto:zuola.com@gmail.com">mailto:zuola.com@gmail.com</a></li><li>gtalk:chat?jid=zuola.com@gmail.com</li></ol><br /> 这看上去类似URL协议的东西。特别是最后一个,你可能会想到QQ也可以。那么他们是怎么做到的?去Google了一下,其实实现还挺简单的。通过一下注册表很快能实现类似skype:, mailto:, gtalk:, 包括verycd的这些很cool的浏览器调用方法。<br /><br /><br /><span style="font-family:arial;font-size:85%;"><blockquote><span style="font-family:arial;font-size:85%;">REGEDIT4</span><br /><span style="font-family:arial;font-size:85%;">[HKEY_CLASSES_ROOT\notenote]</span><br /><span style="font-family:arial;font-size:85%;">"URL Protocol"="notepad.exe"</span><br /><span style="font-family:arial;font-size:85%;">[HKEY_CLASSES_ROOT\notenote\DefaultIcon]</span><br /><span style="font-family:arial;font-size:85%;">@="notepad.exe,1"</span><br /><span style="font-family:arial;font-size:85%;">[HKEY_CLASSES_ROOT\notenote\shell\open\command]</span><br /><span style="font-family:arial;font-size:85%;">@="notepad.exe"</span><br /></blockquote></span><br /> 把上面的notenote全部换成naiotalk以及路径,或者你自己的程序。<br /><br /><span style="font-family:arial;font-size:85%;"><blockquote><p><span style="font-family:arial;font-size:85%;">REGEDIT4 [HKEY_CLASSES_ROOT\<span style="color:#ff0000;">naiotalk</span>]<br /></span><span style="font-family:arial;font-size:85%;">"URL Protocol"="<span style="color:#ff0000;">naiotalk.exe</span>"<br />[HKEY_CLASSES_ROOT\<span style="color:#ff0000;">naiotalk</span>\DefaultIcon]<br />@="naiotalk.exe,1"<br />[HKEY_CLASSES_ROOT\notenote\shell\open\command]<br />@="<span style="color:#ff0000;">C:\Program Files\Naio Network\Naio Talk\notepad.exe</span>"</span> <span style="color:#ff0000;">"/%1"</span></p></blockquote></span><br /><strong><span style="font-family:verdana;">注意</span></strong>:<br /> 以上代码保存到txt文件。然后修改文件名后缀为.reg。双击运行即可导入注册表。<br /> 这样你就可以在IE浏览器里输入 naiotalk: (注意有冒号),即可调用naiotalk.如果想在你自己的程序中指定传参,那可就不是几句话了。<br /><br /><br /><div align="center"><span style="font-family:verdana;color:#ff0000;"><strong>自动化对象才可以的.也就是进程外COM</strong></span></div>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-22010460995417125032007-10-27T19:36:00.000+08:002007-10-27T19:49:09.854+08:002007-10-27T19:49:09.854+08:00How to Resize Windows with No Form border in .NET如何在.NET调整一个无窗体边缘的窗体?<br /><br /> 在<span style="font-family:verdana;">Naio Talk</span>的界面设计部分,由于项目周期的问题以及对Windows系统编程尤其是消息传递机制的不熟悉,选择了.NET来开发。为了使得克服.NET带来的窗体反应迟钝感,打算对Naio Talk的界面经行彻底精心设计。<br /><br /> 其中计划将<span style="font-family:verdana;">Naio Talk</span>的主界面的窗体边框去掉。一是减少重绘,二是看上去更加轻薄。<br /><br />首先设置窗体FormBorderStyle = None;<br />然后添加如下C#代码即可。<br /><br /><span style="font-family:arial;font-size:85%;"><blockquote><span style="font-family:arial;font-size:85%;">protected override void WndProc(ref Message m)</span><br /><span style="font-family:arial;font-size:85%;">{base.WndProc(ref m); </span><br /><span style="font-family:arial;font-size:85%;">switch (m.Msg)</span><br /><span style="font-family:arial;font-size:85%;">{</span><br /><span style="font-family:arial;font-size:85%;">case WM_NCHITTEST:</span><br /><span style="font-family:arial;font-size:85%;">Point vPoint = new Point((int)m.LParam &<br />0xFFFF, </span><br /><span style="font-family:arial;font-size:85%;">(int)m.LParam >> 16 &<br />0xFFFF);</span><br /><span style="font-family:arial;font-size:85%;">vPoint = PointToClient(vPoint); </span><br /><span style="font-family:arial;font-size:85%;">if (vPoint.X <= 5)</span><br /><span style="font-family:arial;font-size:85%;">if (vPoint.Y <= 5)</span><br /><span style="font-family:arial;font-size:85%;">m.Result = (IntPtr)HTTOPLEFT;</span><br /><span style="font-family:arial;font-size:85%;">else if (vPoint.Y >= ClientSize.Height -5)</span><br /><span style="font-family:arial;font-size:85%;">m.Result = (IntPtr)HTBOTTOMLEFT;</span><br /><span style="font-family:arial;font-size:85%;">else m.Result = (IntPtr)HTLEFT;</span><br /><span style="font-family:arial;font-size:85%;">else if (vPoint.X >= ClientSize.Width - 5)</span><br /><span style="font-family:arial;font-size:85%;">if (vPoint.Y <= 5)</span><br /><span style="font-family:arial;font-size:85%;">m.Result = (IntPtr)HTTOPRIGHT;</span><br /><span style="font-family:arial;font-size:85%;">else if (vPoint.Y >= ClientSize.Height - 5) </span><br /><span style="font-family:arial;font-size:85%;">m.Result = (IntPtr)HTBOTTOMRIGHT;</span><br /><span style="font-family:arial;font-size:85%;">else m.Result = (IntPtr)HTRIGHT;</span><br /><span style="font-family:arial;font-size:85%;">else if (vPoint.Y <= 5) </span><br /><span style="font-family:arial;font-size:85%;">m.Result = (IntPtr)HTTOP;</span><br /><span style="font-family:arial;font-size:85%;">else if (vPoint.Y >= ClientSize.Height - 5)</span><br /><span style="font-family:arial;font-size:85%;">m.Result = (IntPtr)HTBOTTOM;</span><br /><span style="font-family:arial;font-size:85%;">break; </span><br /><span style="font-family:arial;font-size:85%;">}</span><br /><span style="font-family:arial;font-size:85%;">}</span><br /><span style="font-family:arial;font-size:85%;">}</span><br /></blockquote></span><br />以及如下的成员变量。<br /><br /><span style="font-family:arial;font-size:85%;"><blockquote><span style="font-family:arial;font-size:85%;">const int WM_NCHITTEST = 0x0084;</span><br /><span style="font-family:arial;font-size:85%;">const int HTLEFT = 10;</span><br /><span style="font-family:arial;font-size:85%;">const int HTRIGHT = 11;</span><br /><span style="font-family:arial;font-size:85%;">const int HTTOP = 12;</span><br /><span style="font-family:arial;font-size:85%;">const int HTTOPLEFT = 13;</span><br /><span style="font-family:arial;font-size:85%;">const int HTTOPRIGHT = 14;</span><br /><span style="font-family:arial;font-size:85%;">const int HTBOTTOM = 15;</span><br /><span style="font-family:arial;font-size:85%;">const int HTBOTTOMLEFT = 0x10;</span><br /><span style="font-family:arial;font-size:85%;">const int HTBOTTOMRIGHT = 17;</span><br /></blockquote></span><br /><span style="font-family:Arial;font-size:85%;"></span><br /><span style="font-family:Arial;font-size:85%;"></span><br /><span style="font-family:Arial;font-size:85%;"></span>Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-92022729726480968372007-10-26T14:15:00.000+08:002007-10-26T14:25:12.928+08:002007-10-26T14:25:12.928+08:00Ruby NetBeans 去参加过Java的校园宣传活动,看过,听过SUN的“布道士”的花言巧语。但是对于Java却始终不想去学习。但是对于NetBeans这个IDE却留下了深刻的影响。由于NetBeans那时候只提供Java,C++的编译,当时非常不适合我去尝试。甚至半年前看lucene的Java代码的时候,我也只下载了eclipse来浏览代码(我不会Java,也不会编译,只是看里面的类关系)<br /> 半年后,看到Daniel King在使用NetBeans写Ruby...恩,是时候用NetBeans了。<br />甚至SUN提供了你单独的Ruby版本的NetBeans.相对RadRails,NetBeans的Ruby IDE已经非常成熟。<br /><br />下载:<br /><a href="http://dlc.sun.com.edgesuite.net/netbeans/6.0/beta2/">http://dlc.sun.com.edgesuite.net/netbeans/6.0/beta2/</a><br /><br />进入页面你可以看到下载的第4列Ruby,Basic IDE & Ruby! That's IT!<br /><br />但是更加推荐Nightly 的最新版本哦。<br /><a href="http://bits.netbeans.org/download/6.0/nightly/latest/">http://bits.netbeans.org/download/6.0/nightly/latest/</a><br /><br />yea...nightly.Tony Cheungnoreply@blogger.comtag:blogger.com,1999:blog-5497153066659419689.post-5772643077916197512007-10-26T11:27:00.000+08:002007-10-29T18:12:59.508+08:002007-10-29T18:12:59.508+08:00Google Talk协议构架 网络上一定有很多人在搜索Google Talk是怎么设计和代码的。所以Google Group上也会有人问Google Talk开源?Google Talk代码在哪里?Google Talk 的API有不?<br /><br /> 如果你不是编程熟手,那么很遗憾地告诉你,Google Talk提供了一种更加广泛的接口或者说是标准,也就是你熟悉的XMPP/Jabber.当然,你光知道这个名词是不能了解Google Talk如何工作的。<br /><br /> Google Talk使用了3种协议(或者说扩展了2种)。并且将这3种协议的实现库lib都开源了。您可以从code.google.com上搜索到。<br /><ol><li>Google Talk构建于大的XMPP协议上。所以您使用PSI,iChat都能连接上。XMPP协议的各个语言实现库可以从Jabber.com中的<a href="http://www.jabber.org/software/libraries.shtml">库列表</a>中找到。</li><li>XEP: XMPP enhancement proposals。然后Google Talk Server中使用了一个非标准的扩展,来实现Google Talk的一些特色功能。该功能通过<a href="http://code.google.com/apis/talk/jep_extensions/extensions.html">XEP extensions</a>来实现。</li><li><a href="http://code.google.com/apis/talk/index.html">libjingle</a> :C++库,提供Google Talk点对点文件传输,视频,语音聊天功能的协议实现。</li></ol>具体的Google Talk英文文档简介可参看:<a href="http://code.google.com/apis/talk/talk_developers_home.html">Google API about Google Talk</a>Tony Cheungnoreply@blogger.com