2008年10月6日星期一

解决VMware启动故障

VMware启动时弹出对话框:

---------------------------
VMware Workstation Error
---------------------------
VMware Workstation unrecoverable error: (vmui)
Unable to create VmappPoll object: 没有注册类别. Reinstalling VMware Workstation may help.
A log file is available in "E:\temp\vmware-Victor.Woo\vmware-Victor.Woo-3912.log". A core file is available in "C:\Documents and Settings\Victor.Woo\Application Data\VMware\vmware-3912.dmp". Please request support and include the contents of the log file and core file.
To collect data to submit to VMware support, select Help > About and click "Collect Support Data". You can also run the "vm-support" script in the Workstation folder directly.
We will respond on the basis of your support entitlement.

---------------------------
确定
---------------------------

log里的内容是:

Oct 06 09:04:11.107: vmui| Msg_Post: Error
Oct 06 09:04:11.107: vmui| [msg.log.error.unrecoverable] VMware Workstation unrecoverable error: (vmui)
Oct 06 09:04:11.107: vmui| Unable to create VmappPoll object: 没有注册类别. Reinstalling VMware Workstation may help.
Oct 06 09:04:11.107: vmui| [msg.panic.haveLog] A log file is available in "E:\temp\vmware-Victor.Woo\vmware-Victor.Woo-3912.log". [msg.panic.haveCore] A core file is available in "C:\Documents and Settings\Victor.Woo\Application Data\VMware\vmware-3912.dmp". [msg.panic.requestSupport.withLogAndCore] Please request support and include the contents of the log file and core file. [msg.panic.requestSupport.vmSupport.windowsOrLinux]
Oct 06 09:04:11.107: vmui| To collect data to submit to VMware support, select Help > About and click "Collect Support Data". You can also run the "vm-support" script in the Workstation folder directly.
Oct 06 09:04:11.107: vmui| [msg.panic.response] We will respond on the basis of your support entitlement.
Oct 06 09:04:11.107: vmui| ----------------------------------------


经过一番查找,发现是3个dll的注册丢失了,而且这种现象连续3天出现。于是,写了一个批处理文件,需要的时候执行一下,万事大吉。

rem ----- repairvmware.bat -----
regsvr32.exe /s %ProgramFiles%\VMware\VMware Workstation\vmappsdk.dll
regsvr32.exe /s %ProgramFiles%\VMware\VMware Workstation\vmdbCOM.dll
regsvr32.exe /s %ProgramFiles%\VMware\VMware Workstation\vmnetBridge.dll

2008年9月30日星期二

cdbe辅助脚本

关于CDBE的概念,它是一个Docbook套件,请参见 http://sinosmond.com/media/cdbe/manual/cdbe_layout.html

创建目录结构是繁琐的工作。这里用一个脚本帮你实现:
-------------------- createdir.bat ---------------------
if exist "%1" (
set DefaultBookName=%1
goto BOOK_NAME_FOUND
)

set DefaultBookName=DefaultBook

:BOOK_NAME_FOUND

echo Generating %DefaultBookName%

for /f %%A in (language.txt) do md books\%DefaultBookName%\%%A\src

for /F %%A in (language.txt) do md output\%DefaultBookName%\%%A\chunk
for /F %%A in (language.txt) do md output\%DefaultBookName%\%%A\html
for /F %%A in (language.txt) do md output\%DefaultBookName%\%%A\pdf
for /F %%A in (language.txt) do md output\%DefaultBookName%\%%A\plain

for /F %%A in (language.txt) do md website\%DefaultBookName%\contrib
for /F %%A in (language.txt) do md website\%DefaultBookName%\graphics
for /F %%A in (language.txt) do md website\%DefaultBookName%\projects
for /F %%A in (language.txt) do md website\%DefaultBookName%\stylesheets

--------------- language.txt -----------------------
en
zh-cn

请大家更新我博客新地址

请大家更新我的博客的新地址: http://blog.vichamp.com/
该地址既可以网页的形式查看,同时也是一个可添加到订阅工具的rss feed。

---------分割线,对于关注我的朋友,以上信息够用了。-------------

以下解释一下这么做的原因:
因为“国家防火墙”的原因,我位于blogspot上的博客经常被屏蔽。很是令人郁闷。今天彻底解决一下这个问题。请朋友们更新收藏夹及rss订阅工具里的链接。给朋友带来的不便,只好请多包涵。

以前为了防止屏蔽,我购买了一个顶级域名,并且使用“自定义域名”的方式,为blogger做绑定。可惜过了一段时间这种方法也遭屏蔽。

这样来说,各种方法都不能太信任,都有可能被屏蔽。于是想到一个新方法,能在被屏蔽的时候基本不影响用户体验:先找一个国外的rss聚合服务。能读取rss,并生成一个新的rss地址。这里我选择了xfruits(http://xfruits.com)。然后再用国内的feedsky(www.feedsky.com)来读取该rss地址。然后再将我购买的域名绑定到feedsky。由于feedsky或者我的域名被屏蔽的可能性比较小。那么有可能被屏蔽的就是中间的跳板——xfruits.com。不过没关系,如果跳板被屏蔽的话,我们可以换一家跳板,用户感觉不出来。如果哪天feedsky被屏蔽的话,还可以把feedsky换掉,用户还是感觉不出来。

用软件设计的术语来说,请参见gof的design pattern - adapter pattern。

以下记录一下几个可能有用的链接,可以从技术上描述一下一个feed是如何流到您的订阅工具的:

我的blogspot博客原始入口
WEB: http://vichamp.blogspot.com/
RSS: http://vichamp.blogspot.com/feeds/posts/default

xfruits.com(跳板服务)
WEB: http://xfruits.com/victorwoo/blogweb/
RSS: http://xfruits.com/victorwoo/blogrss/

feedsky
WEB&RSS: http://feed.feedsky.com/vichamp

绑定自定义域名之后
WEB&RSS: http://blog.vichamp.com -- 请大家收藏这个,因为基本不会改变。

大家可能会觉得我很折腾。但是没办法,这是目前最好的办法了。

2008年9月11日星期四

解决中文版VisualStudio中使用Resharper快捷键问题

在非英文版的Visual Studio中安装Resharper以后会出现如下提示:


---------------------------
ReSharper
---------------------------
Some keyboard shortcuts could not be assigned because the current keyboard scheme is read only.
Change the keyboard scheme and try again.
---------------------------
确定  
---------------------------


打开Visual Studio -- Resharper -- Options -- General -- Restore Resharper keyboard shortcuts ,点击 Apply ,也同样出现上述提示框。那么可以确定,是当 Resharper 修改 Visual Studio 的快捷键映射表的时候发生错误。
快捷键的映射表包含在 Visual Studio 的用户设置文件 %USERPROFILE%\My Documents\Visual Studio 2008\Settings\CurrentSettings.vssettings 中。它是一个xml文档,默认是没有排版的。我们可以将它复制一份,更名为xml后缀,用ie或者xmlspy等工具打开,对它进行排版,以便查看和后续操作。
通过比较中文版和英文版的设置文件,在以下(xpath)路径中,我们可以找到一些不同之处:
/UserSettings/Category[@name="Environment_Group"]/Category[@name="Environment_KeyBindings"]/KeyboardShortcuts
中文版的vssettings的<UserShortcuts/>节中,少了不少条目,经过手工设置快捷键( Visual Studio -- 工具 -- 选项 -- 环境 -- 键盘)并对vssettings进行diff比较,发现中英文版的一些关键字不同,例如英文版为 Scope="Global" ,中文版为 Scope="全局" ;英文版为 Up Arrow ,中文版为上箭头。由此可以推断,Resharper在进行检索的时候仅仅按英文进行检索,故找不到一些特定的关键字。
这里批评一下微软,对于这类非展现给用户查看的元数据,不应进行本地化。否则第三方程序进行索引的时候会遇到困难。特别需要本地化的场合,也应做一个映射表。
经过整理,我总结出中英文版本vssettings文件<UserShortcuts/>节中的不同之处。用户可以手工把<UserShortcuts/>节截取出来,进行字符串替换。将英文版的关键字替换成中文版的关键字。
以下每一条第一行为英文版,第二行为中文版。


Scope="Global"
Scope="全局"


Scope="Text Editor"
Scope="文本编辑器"


Del</Shortcut>
Delete</Shortcut>


Ins</Shortcut>
Insert</Shortcut>


+Up Arrow
+上箭头


+Down Arrow
+下箭头


+Left Arrow
+左箭头


+Right Arrow
+右箭头


+PgUp
+Page Up


+PgDn
+Page Down


+Space
+空格键


+Bkspce
+Backsapce


*** 为了方便读者,贴出整理后与Resharper有关的快捷键映射,请定位到<UserShortcuts/>节的尾部,删除包含Resharper的两个<Shortcut/>,并添加以下内容 ***
     <Shortcut Command="ReSharper_ErrorsView_IgnoreErrors" Scope="ReSharper Errors in Solution Window">Delete</Shortcut>
     <Shortcut Command="ReSharper_ErrorsView_UnignoreErrors" Scope="ReSharper Errors in Solution Window">Insert</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_RefactorThis" Scope="文本编辑器">Ctrl+Shift+R</Shortcut>
     <RemoveShortcut Command="Tools.RecordTemporaryMacro" Scope="全局">Ctrl+Shift+R</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_RefactorThis" Scope="全局">Ctrl+Shift+R</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_Rename" Scope="文本编辑器">Ctrl+R, R</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_Rename" Scope="全局">Ctrl+R, R</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_Rename" Scope="文本编辑器">Ctrl+R, Ctrl+R</Shortcut>
     <RemoveShortcut Command="Refactor.Rename" Scope="全局">Ctrl+R, Ctrl+R</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_Rename" Scope="全局">Ctrl+R, Ctrl+R</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_Move" Scope="文本编辑器">Ctrl+R, O</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_Move" Scope="全局">Ctrl+R, O</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_Move" Scope="文本编辑器">Ctrl+R, Ctrl+O</Shortcut>
     <RemoveShortcut Command="Refactor.ReorderParameters" Scope="全局">Ctrl+R, Ctrl+O</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_Move" Scope="全局">Ctrl+R, Ctrl+O</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_SafeDelete" Scope="文本编辑器">Ctrl+R, D</Shortcut>
     <RemoveShortcut Command="TestResults.RunAllTestsInTestResults" Scope="全局">Ctrl+R, D</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_SafeDelete" Scope="全局">Ctrl+R, D</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_SafeDelete" Scope="文本编辑器">Ctrl+R, Ctrl+D</Shortcut>
     <RemoveShortcut Command="TestResults.DebugAllTestsInTestResults" Scope="全局">Ctrl+R, Ctrl+D</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_SafeDelete" Scope="全局">Ctrl+R, Ctrl+D</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_SafeDelete" Scope="文本编辑器">Alt+Delete</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_SafeDelete" Scope="全局">Alt+Delete</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ExtractMethod" Scope="文本编辑器">Ctrl+R, M</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ExtractMethod" Scope="文本编辑器">Ctrl+R, Ctrl+M</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_IntroduceVariable" Scope="文本编辑器">Ctrl+R, V</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_IntroduceVariable" Scope="文本编辑器">Ctrl+R, Ctrl+V</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_IntroduceField" Scope="文本编辑器">Ctrl+R, F</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_IntroduceField" Scope="文本编辑器">Ctrl+R, Ctrl+F</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_IntroParameter" Scope="文本编辑器">Ctrl+R, P</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_IntroParameter" Scope="文本编辑器">Ctrl+R, Ctrl+P</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_InlineVariable" Scope="文本编辑器">Ctrl+R, I</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_InlineVariable" Scope="文本编辑器">Ctrl+R, Ctrl+I</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_EncapsulateField" Scope="文本编辑器">Ctrl+R, E</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_EncapsulateField" Scope="全局">Ctrl+R, E</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_EncapsulateField" Scope="文本编辑器">Ctrl+R, Ctrl+E</Shortcut>
     <RemoveShortcut Command="Refactor.EncapsulateField" Scope="全局">Ctrl+R, Ctrl+E</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_EncapsulateField" Scope="全局">Ctrl+R, Ctrl+E</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ChangeSignature" Scope="文本编辑器">Ctrl+R, S</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ChangeSignature" Scope="全局">Ctrl+R, S</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ChangeSignature" Scope="文本编辑器">Ctrl+R, Ctrl+S</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ChangeSignature" Scope="全局">Ctrl+R, Ctrl+S</Shortcut>
     <RemoveShortcut Command="Edit.LineOpenAbove" Scope="文本编辑器">Ctrl+Enter</RemoveShortcut>
     <Shortcut Command="ReSharper_ForceCompleteItem" Scope="文本编辑器">Ctrl+Enter</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowFindResults" Scope="文本编辑器">Ctrl+Alt+F12</Shortcut>
     <RemoveShortcut Command="View.FindSymbolResults" Scope="全局">Ctrl+Alt+F12</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowFindResults" Scope="全局">Ctrl+Alt+F12</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowTypeHierarchy" Scope="文本编辑器">Ctrl+Alt+H</Shortcut>
     <RemoveShortcut Command="Debug.Threads" Scope="全局">Ctrl+Alt+H</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowTypeHierarchy" Scope="全局">Ctrl+Alt+H</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowCodeStructure" Scope="文本编辑器">Ctrl+Alt+F</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowCodeStructure" Scope="全局">Ctrl+Alt+F</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowTodoExplorer" Scope="文本编辑器">Ctrl+Alt+D</Shortcut>
     <RemoveShortcut Command="Debug.Disassembly" Scope="全局">Ctrl+Alt+D</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowTodoExplorer" Scope="全局">Ctrl+Alt+D</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowUnitTestExplorer" Scope="文本编辑器">Ctrl+Alt+U</Shortcut>
     <RemoveShortcut Command="Debug.Modules" Scope="全局">Ctrl+Alt+U</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowUnitTestExplorer" Scope="全局">Ctrl+Alt+U</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowUnitTestSessions" Scope="文本编辑器">Ctrl+Alt+T</Shortcut>
     <RemoveShortcut Command="View.DocumentOutline" Scope="全局">Ctrl+Alt+T</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_ShowUnitTestSessions" Scope="全局">Ctrl+Alt+T</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_FindUsagesAdvanced" Scope="文本编辑器">Ctrl+Shift+Alt+F12</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_FindUsagesAdvanced" Scope="全局">Ctrl+Shift+Alt+F12</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_HighlightUsages" Scope="文本编辑器">Shift+Alt+F11</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_HighlightUsages" Scope="全局">Shift+Alt+F11</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoPreviousOccurence" Scope="文本编辑器">Ctrl+Alt+Page Up</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoPreviousOccurence" Scope="全局">Ctrl+Alt+Page Up</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoNextOccurence" Scope="文本编辑器">Ctrl+Alt+Page Down</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoNextOccurence" Scope="全局">Ctrl+Alt+Page Down</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_LocateInSolutionExplorerAction" Scope="文本编辑器">Shift+Alt+L</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_LocateInSolutionExplorerAction" Scope="全局">Shift+Alt+L</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoRecentFiles" Scope="文本编辑器">Ctrl+,</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoRecentFiles" Scope="全局">Ctrl+,</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoRecentEdits" Scope="文本编辑器">Ctrl+Shift+,</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoRecentEdits" Scope="全局">Ctrl+Shift+,</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_TypeHierarchy_Browse" Scope="文本编辑器">Ctrl+E, H</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_TypeHierarchy_Browse" Scope="全局">Ctrl+E, H</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_TypeHierarchy_Browse" Scope="文本编辑器">Ctrl+E, Ctrl+H</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_TypeHierarchy_Browse" Scope="全局">Ctrl+E, Ctrl+H</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_CompleteCodeTypeName" Scope="文本编辑器">Shift+Alt+空格键</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_CompleteCodeSmart" Scope="文本编辑器">Ctrl+Alt+空格键</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_LiveTemplates_Insert" Scope="文本编辑器">Ctrl+E, L</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_LiveTemplates_Insert" Scope="文本编辑器">Ctrl+E, Ctrl+L</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_SurroundWith" Scope="文本编辑器">Ctrl+E, U</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_SurroundWith" Scope="文本编辑器">Ctrl+E, Ctrl+U</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_Generate" Scope="文本编辑器">Alt+Insert</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_Generate" Scope="全局">Alt+Insert</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_MoveUp" Scope="文本编辑器">Ctrl+Shift+Alt+上箭头</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_MoveDown" Scope="文本编辑器">Ctrl+Shift+Alt+下箭头</Shortcut>
     <RemoveShortcut Command="Edit.WordPreviousExtendColumn" Scope="文本编辑器">Ctrl+Shift+Alt+左箭头</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_MoveLeft" Scope="文本编辑器">Ctrl+Shift+Alt+左箭头</Shortcut>
     <RemoveShortcut Command="Edit.WordNextExtendColumn" Scope="文本编辑器">Ctrl+Shift+Alt+右箭头</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_MoveRight" Scope="文本编辑器">Ctrl+Shift+Alt+右箭头</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ExtendSelection" Scope="文本编辑器">Ctrl+Alt+右箭头</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ShrinkSelection" Scope="文本编辑器">Ctrl+Alt+左箭头</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_DuplicateText" Scope="文本编辑器">Ctrl+D</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_LineComment" Scope="文本编辑器">Ctrl+Alt+/</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_BlockComment" Scope="文本编辑器">Ctrl+Shift+/</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_CleanupCode" Scope="文本编辑器">Ctrl+E, Ctrl+C</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_CleanupCode" Scope="全局">Ctrl+E, Ctrl+C</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_CleanupCode" Scope="文本编辑器">Ctrl+E, C</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_CleanupCode" Scope="全局">Ctrl+E, C</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_QuickDoc" Scope="文本编辑器">Ctrl+Shift+F1</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_QuickDoc" Scope="全局">Ctrl+Shift+F1</Shortcut>
     <RemoveShortcut Command="Edit.CharTranspose" Scope="文本编辑器">Ctrl+T</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoType" Scope="文本编辑器">Ctrl+T</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoType" Scope="全局">Ctrl+T</Shortcut>
     <RemoveShortcut Command="Edit.WordTranspose" Scope="文本编辑器">Ctrl+Shift+T</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoFile" Scope="文本编辑器">Ctrl+Shift+T</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoFile" Scope="全局">Ctrl+Shift+T</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoFileMember" Scope="文本编辑器">Alt+\</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoFileMember" Scope="全局">Alt+\</Shortcut>
     <RemoveShortcut Command="Edit.LineTranspose" Scope="文本编辑器">Shift+Alt+T</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoSymbol" Scope="文本编辑器">Shift+Alt+T</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoSymbol" Scope="全局">Shift+Alt+T</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_NavigateFromHere" Scope="文本编辑器">Alt+`</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_NavigateFromHere" Scope="全局">Alt+`</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoTypeDeclaration" Scope="文本编辑器">Ctrl+Shift+F11</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoTypeDeclaration" Scope="全局">Ctrl+Shift+F11</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoBase" Scope="文本编辑器">Alt+Home</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoBase" Scope="全局">Alt+Home</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoInheritors" Scope="文本编辑器">Alt+End</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoInheritors" Scope="全局">Alt+End</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoUsage" Scope="文本编辑器">Shift+Alt+F12</Shortcut>
     <RemoveShortcut Command="Edit.QuickFindSymbol" Scope="全局">Shift+Alt+F12</RemoveShortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoUsage" Scope="全局">Shift+Alt+F12</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoNextMethod" Scope="文本编辑器">Alt+下箭头</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoNextMethod" Scope="全局">Alt+下箭头</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoPrevMethod" Scope="文本编辑器">Alt+上箭头</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoPrevMethod" Scope="全局">Alt+上箭头</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoContainingDeclaration" Scope="文本编辑器">Ctrl+[</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoContainingDeclaration" Scope="全局">Ctrl+[</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoNextHighlight" Scope="文本编辑器">Alt+Page Down</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoNextHighlight" Scope="全局">Alt+Page Down</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoPrevHighlight" Scope="文本编辑器">Alt+Page Up</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoPrevHighlight" Scope="全局">Alt+Page Up</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoNextErrorInSolution" Scope="文本编辑器">Shift+Alt+Page Down</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoNextErrorInSolution" Scope="全局">Shift+Alt+Page Down</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoPrevErrorInSolution" Scope="文本编辑器">Shift+Alt+Page Up</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoPrevErrorInSolution" Scope="全局">Shift+Alt+Page Up</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoLastEditLocation" Scope="文本编辑器">Ctrl+Shift+Backsapce</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_GotoLastEditLocation" Scope="全局">Ctrl+Shift+Backsapce</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ExploreStackTrace" Scope="文本编辑器">Ctrl+E, T</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ExploreStackTrace" Scope="全局">Ctrl+E, T</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ExploreStackTrace" Scope="文本编辑器">Ctrl+E, Ctrl+T</Shortcut>
     <Shortcut Command="ReSharper.ReSharper_ExploreStackTrace" Scope="全局">Ctrl+E, Ctrl+T</Shortcut>
     <Shortcut Command="ReSharper_SilentCleanupCode" Scope="文本编辑器">Ctrl+E, F</Shortcut>
     <Shortcut Command="ReSharper_SilentCleanupCode" Scope="全局">Ctrl+E, F</Shortcut>
     <Shortcut Command="ReSharper_SilentCleanupCode" Scope="文本编辑器">Ctrl+E, Ctrl+F</Shortcut>
     <Shortcut Command="ReSharper_SilentCleanupCode" Scope="全局">Ctrl+E, Ctrl+F</Shortcut>
     <Shortcut Command="ReSharper_ParameterInfo_GoToPreviousSignature" Scope="文本编辑器">Ctrl+Shift+Alt+空格键</Shortcut>
     <Shortcut Command="ReSharper_ParameterInfo_GoToPreviousSignature" Scope="全局">Ctrl+Shift+Alt+空格键</Shortcut>
     <Shortcut Command="ReSharper_QuickFix" Scope="文本编辑器">Alt+Enter</Shortcut>
     <Shortcut Command="ReSharper_WindowManager_CloseRecentTool" Scope="文本编辑器">Ctrl+Shift+F4</Shortcut>
     <Shortcut Command="ReSharper_WindowManager_CloseRecentTool" Scope="全局">Ctrl+Shift+F4</Shortcut>
     <Shortcut Command="ReSharper_WindowManager_ActivateRecentTool" Scope="文本编辑器">Ctrl+Alt+Backsapce</Shortcut>
     <Shortcut Command="ReSharper_WindowManager_ActivateRecentTool" Scope="全局">Ctrl+Alt+Backsapce</Shortcut>
     <Shortcut Command="ReSharper_EnableDaemon" Scope="文本编辑器">Ctrl+8</Shortcut>
     <RemoveShortcut Command="Debug.LocationToolbar.ToggleCurrentThreadFlaggedState" Scope="全局">Ctrl+8</RemoveShortcut>
     <Shortcut Command="ReSharper_EnableDaemon" Scope="全局">Ctrl+8</Shortcut>
     
     
最终的结果如下:
<UserShortcuts>
 <RemoveShortcut Command="Edit.WordPreviousExtend" Scope="文本编辑器">Ctrl+Shift+左箭头</RemoveShortcut>
 <Shortcut Command="ReSharper_ErrorsView_IgnoreErrors" Scope="ReSharper Errors in Solution Window">Delete</Shortcut>
 ...
</UserShortcuts>


现在,可以在中文版Visual Studio中使用 Resharper 的快捷键了。

2008年8月31日星期日

关于博客的二三事

朋友给我发了个*.blogspot.com的文章链接,我一点居然打开了。看来是借奥运东风,blogspot解封了。

但是我用自定义域名将 http://blog.vichamp.com 指向 http://vichamp.blogspot.com 之后,反而不能用了。但用gladder、tor翻墙却可以。看来风向变了,以前用自定义域名来使blogspot可被访问是作茧自缚了。:(

顺便去查查博客的计数器,惊讶地发现大批来自于维基百科的来源,循链接点进去,原来是自己分析迅雷下载机制的一篇文章《关于迅雷盗窃一文的再分析》(若打不开,请点这里,再打不开,只好翻墙)被维基百科引用了。话说回来有些惭愧,我在文中指责cnBeta上的某个作者搞技术过于情绪化,而自己的文章中也带有一些情绪。

仔细分析了一下计数器,基本上来路都是指向几篇技术文章。看来还是要继续发表一些质量高一些的技术文章。

2008年8月23日星期六

海誓惊涛碎,
山盟竟崩塌。
断肠走天涯,
茫!

风吹彼岸花,
幽幽送芬芳。
可闻不可及,
香!

2008年8月21日星期四

欢歌笑语远去,
凭栏不见妻回。
纵酒空度残日,
愁!

2008年7月21日星期一

Oracle精简客户端及ODBC驱动的安装

oracle很大。
开发用机装oracle服务端不合适。
所以我们要想办法在开发用机只装客户端,把宝贵的资源留给开发体验。

第一步:
先下载《Oracle9i客户端精简版3.0.msi》,地址如下:
http://www.oracle.com.cn/archiver/?tid-104387.html
http://d.download.csdn.net/source/343755

安装以后在开始菜单里找到tnsnames.ora 用记事本打开编辑。删掉不要的tns,按其中的格式添加自己需要的tns。这时候pl/sql developer等工具就可以连上了。

现在安装odbc驱动。为什么要装呢?比如说用PowerDesigner做reverse engineering的时候,非得配个odbc源不可。

第二步:
下载
http://download.oracle.com/otn/utilities_drivers/odbc/oracle9i/ora9202.exe
解压到本地的某个固定目录,如ORA9202下。
这时候还得借助oracle安装盘,运行universal installer。选择产品的时候选择
刚才自解压包中解出来的 ORA9202\Disk1\stage\products.jar

第三步:
配置环境变量,在path中添加如 %ProgramFiles%\Oracle\ora90\BIN; 注意“%ProgramFiles%\Oracle”是第一步中精简版的安装目录。

注意第三步,如果不做的话,添加odbc数据源的时候会报如下错误 ;)
---------------------------
Driver title
---------------------------
Error Cannot Load Resource File sqresus.dll
---------------------------
确定
---------------------------

2008年7月13日星期日

暴强男子狂损邮局傲慢职员

今天受mm之托去铜盘路邮局寄包裹。邮局里有2个女职员,一个30来岁,一个40来岁。as很通常的情景,由于缺乏管理和素质,对几个客户都忙得鸡飞狗跳,先来的滞留,插进来的反而受理一下,又晾在旁边,一会儿五笔字根打不出来,一会儿满桌子翻打印纸……整个场景怨声载道,混乱不堪。

我要寄个包裹,单都填好了,40岁的职员居然说:寄包裹比较慢,我要一个字一个字打到电脑里啊!让后面快的人先办。你先等。
我靠

这时一个面目和蔼,领导模样的中年男子出现,来办理淘宝业务。

30来岁的女职员态度冷漠,眼睛不抬,跟他说你这个要填,那个要填,下一个人先办
中年男子笑呵呵地说,我已经办过2次,前两次都这么填的。
女职员说,我也不懂,这个只有你知道。
男子说:您要我填什么我不懂。我来过三次,第一次您教我,第二次我照做了,第三次我教你?
女职员哑口。

中年男子继续发挥:
现在最糟糕的就是邮电,办事效率低,服务态度一般般,跟大爷一样对待客户。你看看到银行去,里面的小姐都要站起来笑着双手递单子过来,把客户当作大爷一样。你们两个谁站起来面对我过?是不是?现在国企、银行都改制了,就剩一个邮电,最扯蛋。
两个职员把头埋得深深的,一个打电脑,一个写单据

这时旁边一个小弟站出来说话:
这您说得就不对了,邮电自从去年起就开始xx改制,xx分开……
男子打断:
对呀,人家都改革30年了,你邮电才刚开始。男子又笑,呵呵,没关系,咱不跟别人比,咱跟自己比,总是在不断进步嘛,至少每年长一岁嘛。
全场人笑
两个职员把头埋得更深了

旁边有个小伙子来寄电子元件,男子拍着他的肩膀说
小伙子,你不知道了吧,x月到x月期间,因为奥运,电子元器件邮政一律不准运。可是如果不准运去北京我可以理解,我就不明白上个月从深圳运到福州都不让运,这是什么道理?唯一可以运的就是通过快递公司,呵呵。
两个职员继续无语

这个时候,给我办理寄包裹的职员死活打不出收件人里的“毅”字,字根拆了五六次拆不对。当然,是用一个食指打字的哦。问旁边的职员,答曰UEM,听者无论如何又分不清M还是F。至少耗了三四分钟才输进去这个字。
男子又过来损她:
姑娘啊,你这键盘要好好背背咯,你看你这个熟练程度。。
职员憋急了,说:
我都快退休的人了,学这个有什么用?(假设50岁退休,那职员显然夸大岁数)
男子一听,马上笑容可掬:哇,原来你快退休了啊,看不出来,看不出来,保养得不错。
周围人爆笑(哪有女人自己夸大自己年龄的),那职员立刻满面通红……

这个时候我办完业务离开了。

真是酣畅淋漓。平时在这种窗口办事,拖拖沓沓,受尽窗口里穿着制服没文化人的白眼,动不动里面的人还破口大骂。这回这位仁兄的气势是完全把窗口里的人压了回去,说话不带脏字。可惜忘了录音。看来平时真是得练就三寸不烂之舌,好好调教这帮龟孙子,社会主义的寄生虫。

2008年7月9日星期三

MyEclipse中Tomcat发布失败的几种可能性

MyEclipse中,Tomcat经常发布失败,烦恼不已,费了不少时间。现总结几个可能碰到的问题如下:
1.工程中有Error,即红色的叉叉,这样发布有可能失败。要么修正工程中的错误,要么降低编译提示级别。
2.引用了不存在的jar。其实发布失败以后在Problems视图中有相应的信息,但Eclipse不会自动激活该视图,所以容易被忽视。
3.GoogleDesktop等第三方工具锁定某些文件进行索引,会造成MyEclipse无法删除这些文件,导致发布失败。
4.发布过程中用外部编辑器修改了其中的文件,会导致发布失败。

2008年7月6日星期日

Firefox通过Flashgot调用迅雷出现AddRef的解决方法

1. 用Firefox打开about:config页面(即在地址栏中输入about:config后回车);
2. 找到flashgot.autoReferrer项,将其值改为false即可。

2008年7月2日星期三

PortablePidgin2.4.3 is out

smart Pidgin that can take in a USB drive

read more | digg story

2008年6月12日星期四

ReSharper 4.0发布

关于IDE增强:
Delphi上有CnPack(国人开发的,凭良心说,比GExpert、Castalia强多了)
VC++上有Visual Assist X(for vs 98不可或缺,for vs 2003、2005、2008还不如不用)
C#中的王者莫过于ReSharper了。提供的各个增强功能都是精品。量级相近的还有个CodeRush。经过一段时间的比较,发现ReSharper的含金量更高,CodeRush后者太花哨了,实用的功能不够多。并且,两者摆在一起用的时候会有少许冲突(比如说输入一个左括号,两套工具都会为你自动插入一个右括号)。最后还是把CodeRush卸了,专心用ReSharper。

ReSharper的博客(呵呵,不好意思,得穿墙才能访问)老早就在announce,.NET 3.x的支持不好做。苦等了半年,终于等到完美支持.NET 3.x所有语法的ReSharper 4.0。装上试了一下,果然lambda表达式、get;set;、linq之类的都支持了(上一个版本应用这些语法的代码会红色波浪线提示)。

rock & roll!

2008年6月8日星期日

白水洋、鸳鸯溪游记

绿林可拭目,清水以濯足。
幽谷能避暑,净气也怡心。

2008.06.08 (端午游)

2008年5月18日星期日

.NET中进行报文编解码(byte[]->struct等)

关于报文编解码方面,常需要做byte[]-&gt;struct等操作。我总结了一下,避免大量手工拼凑字段。有更好的方法可以补充。

1. enum可以用[FlagsAttribute]来做位运算
参见http://topic.csdn.net/t/20041018/13/3466293.html

2. struct可以用[StructLayoutAttribute]和[MarshalAsAttribute]控制数据字段的物理布局
http://topic.csdn.net/t/20041018/13/3466293.html

3. 可以用以下两个非托管方法来做byte[]到struct的互相转化
System.Runtime.InteropServices.Marshal.PtrToStructure();
System.Runtime.InteropServices.Marshal.StructureToPtr();
参见
http://topic.csdn.net/u/20080510/16/994313a3-0987-4a11-9544-979be6e38583.html

2008年5月7日星期三

洪山西客站到软件园自驾路线

从洪山西客站沿洪甘公路往北,到图中示意处右拐,经过水泥厂,可到软件园C区


从洪山西客站出发沿洪甘公路向北行驶1公里,洪甘公路较为颠簸。
注意这棵树,右边有条路,通往软件园后门



这是右转以后的风景。现在这个村庄拆迁了,但是那棵树还在,该坡略向下倾斜。


沿该路行驶,在分叉处向右行(左侧是水泥厂)


继续行驶,在此分叉处仍向右行(左边的路较泥泞)


行驶一段,可看到工程学院软件学院的白色宿舍楼,即软件园C区。在主干道路旁有软件园地图。

公司乔迁新址

2008.5.7,公司乔迁新址——一个挥洒热情的新地方。



Flash地图:

2008年4月28日星期一

用脚本批量下载.NET Framework源码

微软将.NET Framework开源之后,掀起一大学习浪潮,不过微软提供的方法比较土一点。用户在Visual Studio中设置断点之后,VS自动连接微软的服务器进行PDB和源码的下载。虽然它有缓存机制,但还是太太太慢了。例如System.Windows.Forms.pdb有10MB,调试程序时根本不能忍受。于是有了大天使迦百列NetMassDownloader 这是个命令行工具,能批量下载PDB和src。但是还不是十分好用,尤其是需要敲命令,选择类库路径、版本、目标路径,对于.NET不同的库还要分别下载,以及耗很多时间,有的时候还会下载失败。我们要的是最新的源码,以及PDB。所以俺写了个脚本,可以放在公司服务器上,每晚做成计划任务执行,把目标路径设成共享文件夹(每日覆盖),本地调试的时候,在VS中设置源码路径为共享文件夹。这样第二天早上上班的时候,就可以开心地阅读“fresh new”的源码了。以下是脚本:


@echo 自动下载.NET Framework源码
@echo 需要NetMassDownloader配合,请到http://www.codeplex.com/NetMassDownloader下载
@echo by Victor.Woo 2008.04.28 http://blog.vichamp.com


del Get2.0.cmd
del Get3.0.cmd
del Get3.5.cmd


set targetdir=D:\CSharpSourceCode\Microsoft.Net


for %%a in (Get2.0.cmd Get3.0.cmd Get3.5.cmd) do del /f %%a


echo @echo off&gt;Get2.0.cmd
echo echo Downloading .NET 2.0 Sourcecode...&gt;&gt;Get2.0.cmd
echo NetMassDownloader.exe -d %SystemRoot%\Microsoft.NET\Framework\v2.0.50727 -o %targetdir%\v2.0 -fo&gt;&gt;Get2.0.cmd


echo @echo off&gt;Get3.0.cmd
echo echo Downloading .NET 3.0 Sourcecode...&gt;&gt;Get3.0.cmd
echo NetMassDownloader.exe -d "%SystemRoot%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation" -o %targetdir%\v3.0 -fo&gt;&gt;Get3.0.cmd
echo NetMassDownloader.exe -d "%SystemRoot%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation" -o %targetdir%\v3.0 -fo&gt;&gt;Get3.0.cmd
echo NetMassDownloader.exe -d "%SystemRoot%\Microsoft.NET\Framework\v3.0\WPF" -o %targetdir%\v3.0 -fo&gt;&gt;Get3.0.cmd
echo NetMassDownloader.exe -d "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0" -o %targetdir%\v3.0 -fo&gt;&gt;Get3.0.cmd


echo @echo off&gt;Get3.5.cmd
echo echo Downloading .NET 3.5 Sourcecode...
echo NetMassDownloader.exe -d "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" -o %targetdir%\v3.5 -fo&gt;&gt;Get3.5.cmd


rem goto end


start Get2.0.cmd
start Get3.0.cmd
start Get3.5.cmd


:end
rem pause

2008年4月5日星期六

推荐Serv-U 7.x

Serv-U 3.x开始用起,界面和功能一直没有大的改变,这回的7.x是动真格了。
看官方网站的介绍: http://www.serv-u.com/features/default.asp
试用了一段,大体的变化如下:

支持更多的认证方式,包括Windows认证、数据库认证。以前都要靠Serv-U Plus和动网之类的论坛、整站系统做整合,现在应该更简单了。

支持WEB远程管理!这跟传统Serv-U的区别好比Remotely AnywherePCAnywhere的区别,前者只要打开浏览器,就可以随时随地地控制服务器!而后者需要客户端。


基本WEB客户端,这个跟管理界面不一样,是给用户使用的,用户除了以ftp://domain的形式访问,还可以http://domain的方式访问,会显示一个登录界面,以及一个简单的网页,可以在网页上进行下载。以前我是用hfs来解决的。虽然Serv-U的五花八门功能不如hfs那样多,但从权限集成管理的角度来说,Serv-U还是有好处的。


看来WEB做界面真是大势所趋啊,做新的系统架构时得注重往这方面倾斜了。

推荐Serv-U 7.x

Serv-U 3.x开始用起,界面和功能一直没有大的改变,这回的7.x是动真格了。
看官方网站的介绍: http://www.serv-u.com/features/default.asp
试用了一段,大体的变化如下:

支持更多的认证方式,包括Windows认证、数据库认证。以前都要靠Serv-U Plus和动网之类的论坛、整站系统做整合,现在应该更简单了。

支持WEB远程管理!这跟传统Serv-U的区别好比Remotely AnywherePCAnywhere的区别,前者只要打开浏览器,就可以随时随地地控制服务器!而后者需要客户端。


基本WEB客户端,这个跟管理界面不一样,是给用户使用的,用户除了以ftp://domain的形式访问,还可以http://domain的方式访问,会显示一个登录界面,以及一个简单的网页,可以在网页上进行下载。以前我是用hfs来解决的。虽然Serv-U的五花八门功能不如hfs那样多,但从权限集成管理的角度来说,Serv-U还是有好处的。


看来WEB做界面真是大势所趋啊,做新的系统架构时得注重往这方面倾斜了。

2008年3月30日星期日

轻羽飞扬

《敏讯人》公司杂志强制征稿,要求写篇羽毛球的,于是作此一篇《轻羽飞扬》,正文如下:

羽球者,隔网击球之戏也。时而轻羽飞扬,悠然坠下,扬拍轻点,胜似闲庭信步;时而迅雷不及掩耳,纵横起落,左右腾挪,转战厮杀。故缓急兼备,易学难精,老少咸宜,玄妙无穷。尔等IT工作者伏案终日,文牍不停于手。偶得闲暇片刻,则投笔去案,投奔所谓江湖,与各路大侠高僧小聚。

每逢周一,诸位爱好羽毛球的同仁们齐备武器,于日暮七时二刻沿各路聚于球馆。众侠客褪下白领皮鞋,换上运动行头,顿觉更加精神抖擞,焕然一新。为多扳几个球,多弑几个对手,多赢一些mm的喝彩,部分侠客还趁周末奔武器铺购买、修缮了玄铁剑、天罡刀等铁器。

一个正手高远球划过天顶,高昂,精确,直逼对方底线。再看轨迹始端,是虎背熊腰、威风凛凛的Lee,拍锋剑气逼人。刚才那一球,就是出自于此。弧线的另一边,小Z早已戎装以待。面对呼啸奔袭而来的这一球,小Z却是冷漠、凝视……冷不防出刀一挡,球如一片羽毛,轻飘飘、慢悠悠地奔网前而去。Lee见一招被轻易化解,心里暗暗吃惊,连忙化解对方的飞刀。并继续把战局拉开,重造杀阵,打算克敌于五个回合之内。起初,小Z节节退让,招数也平淡无奇,在凌厉的攻势下被打成3:10。但看久了便发觉其中包含了极多厉害的套路,犹如打太极一般。Lee的招招重击,被小Z悉数破解,并借其力道,还治其身。在小Z把比分追到15平的时候,Lee已经是遍地驰骋沙场,气喘吁吁。小Z反而请求暂停,原来换上一支重拍。只见小Z祭起重武器,一改之前阴忍的形象,频频出招,怎一个狠字了得?Lee苦苦招架,却无法拾起昔日的威风。俗话说兵败如山倒,Lee不堪重击,眼见江河日下,却无回天之力。一声长叹,以16:21败下阵来。

正当台下诸位看官对此精彩的杀阵津津乐道,为小Z的绝地大反击赞叹不已的时候,围观的人群中又起了一阵躁动。原来两位巾帼小f、小h正摩拳擦掌,在一片叫好声中整好衣冠,一跃上台。话说这两位女将初涉江湖不长,但深知江湖规矩,平时十分注重内功修炼,是江湖中少见的进步最快的女侠。其功力令一般人不敢小视。另有两位好汉vv、小L分别登场,组成混合双打。

较量从小L一个儒雅的发球拉开序幕。双方的女将在网前筑成的两道“水晶墙”,堵住了对手每一次进犯;不管场上哪个地方有漏洞,女将不屈的身影就立刻出现在哪里,“水晶墙”的滴水不漏使双方的男选手得以创造一次又一次的杀机。起跳!反弓!击球!雷鸣般的暴扣迎来台下阵阵的叫好。双方一时难舍难分,比分交替上升至10:10。俗话说,狭路相逢勇者胜。那么勇者相逢谁胜?

答案是智者胜。经过短暂的暂停,双方在营里耳语一阵,重新布阵。于是江湖上杀机再现,而且更隐蔽,更残酷!小L改变火力点,集中攻击位于网前的女将小f,企图打开一个突破口。而与小L搭档的小h,则将“水晶墙”更往前推进一步,随时准备对小f的回球给予致命的一扑。此阵果然奏效,该方连得4分,把比分拉开。vv和小f连忙稳住阵脚,寻找破茧之机。面对小L的炮火,小f采取假动作加以躲闪,实际的球却落到vv的枪口上,vv借力打力,以其人之道还治其人之身,把炮火反弹至敌阵。而小f也不闲着,常常瞅准机会,吊球至对方软肋,另小L和小h判断失误,两人眼睁睁见球落地,却还未来得及拔腿相助。接下来的战事精彩纷呈,高潮迭起,双方各不相让,捉对厮杀,直杀得天昏地暗日月无光。令看官们不敢叫好,唯恐错过了下一个致命的瞬间。比分交替上升至24平,双方都有少许疲惫。这时小L无意间放了个高球,vv哪肯放过这转瞬即逝的机会,悄悄运气丹田,“砰”地一个扣杀,突破了小h的水晶防火墙。紧接着一鼓作气,再拔一城,结束了这场旷日持久的战斗。

喂,我说各位看官,别只知道鼓掌,上来比试比试?

常盼周一日暮
最恋球场深处
聚英雄美女各路
谈笑间挥汗如瀑
高手过招
顶住,顶住
兴尽晚回宿
疲惫不知归路
—— 如梦令·羽球

2008年3月25日星期二

破,易。立,难。

社会、事业、家庭、爱情……皆如斯夫。

2008年3月24日星期一

TotalCommand之0Day过滤器

如果下载的东西太多,归类起来就比较麻烦。本来想写个Python脚本全自动自动搞定这事,但发现TotalCommand可以比较轻松地半自动搞定,就不再写了。

使用方法:TotalCommand - Alt+F7 - 粘贴相应的过滤串到“FileName” - Load/Save - 保存为相应的模板名,以后便可以在N层文件夹中轻易地找出“所有电子书”,并进行下一步的移动操作。技术含量不高,但可以节省很多操作时间。

E-Book:
*Addison.Wesley.*;*Cisco.Press.*;*McGraw.Hill.*;*Microsoft.Press.*;*MOC.COURSE.*;*OReilly.*;*Sams.*;*Wiley.*;*Wrox.*;*.eBook*;*.e-book*;*.Press.*;*For.Dummies*

Templete:
*Template.Monster.*;*YouJoomla.*;*JoomlArt.*;*JoomlaWorks.*;*Boxedart.*


Modify log:
2008-03-24 E-Book 增加 For.Dummies

TotalCommand之0Day过滤器

如果下载的东西太多,归类起来就比较麻烦。本来想写个Python脚本全自动自动搞定这事,但发现TotalCommand可以比较轻松地半自动搞定,就不再写了。

使用方法:TotalCommand - Alt+F7 - 粘贴相应的过滤串到“FileName” - Load/Save - 保存为相应的模板名,以后便可以在N层文件夹中轻易地找出“所有电子书”,并进行下一步的移动操作。技术含量不高,但可以节省很多操作时间。

E-Book:
*Addison.Wesley.*;*Cisco.Press.*;*McGraw.Hill.*;*Microsoft.Press.*;*MOC.COURSE.*;*OReilly.*;*Sams.*;*Wiley.*;*Wrox.*;*.eBook*;*.e-book*;*.Press.*

Templete:
*Template.Monster.*;*YouJoomla.*;*JoomlArt.*;*JoomlaWorks.*;*Boxedart.*

2008年3月22日星期六

中选会第5案正文存在语病

所谓的“第5案”,指的是“入联公投”两个议案之一。
请参见“中选会”官方网站:http://www.cec.gov.tw
这是“第5案”的投票情况: http://vote2008-3.nat.gov.tw/zh-tw/R1/00000000000.html

以下是“第5案”原文:
第5案:1971年中華人民共和國進入聯合國,取代中華民國,台灣成為國際孤兒。為強烈表達台灣人民的意志,提升台灣的國際地位及參與,您是否同意政府以「台灣」名義加入聯合國?
注意这里的用语:
注意原文,为强烈表达……,您是否同意政府以……。
本身就是个病句犯了“偷换概念”的逻辑错误。“为强烈表达”是一个单向立场;“您是否同意政府以”是一个中立立场。前后立场外延不一致,违反了普通逻辑上“同一律”,至少是有倾向性的语句。以这样的语句作为投票议案,相当于绑架了选民的意识,实在政府在出老千。

正常的语序应该是 您是否同意政府为强烈表达……,以……

你认为呢?

2008年2月26日星期二

解决一例局域网无法共享

装好番茄花园3.5版XP,发现从另一台机器不能以\\IP\Share的方式访问。现象是,敲入\\IP\Share的时候,弹出身份验证框中用户是Guest,并且不可修改。而第一台主机默认是禁用Guest的,于是无法通过共享访问。
摸索了一下,在组策略里做如下设置:
组策略(运行gpedit.msc) -> Windows 设置 -> 安全设置 -> 本地策略 -> 安全选项 -> 网络访问: 本地账户的共享和安全模式。有两个值:
1.经典 - 本地用户以自己的身份验证
2.仅来宾 - 本地用户以来宾的身份验证
将2改为1,立竿见影。

2008年2月22日星期五

用二分法快速定位bug

预备知识:

  • 现在我是FireFox不折不扣的粉丝 -> 当然装的扩展(类似"插件")很不少 -> 扩展多了问题也随之而来。
  • 我已经抛弃Flashget和eMule,用迅雷;VeryCD网站的 ,是调用eMule -> 我不能用这个按钮下载文件 -> 得使用 这个按钮,配合迅雷的"监视剪贴板"功能进行下载。

 
 

不知什么时候开始,我发现一个问题: 似乎失效了,单击以后剪贴板没有改变。于是很长一段时间都用在ed2K的链接上点右键复制链接地址的方法来应付。这样需要下载的链接很多时简直不堪重负,甚至开Maxthon来应急。

 
 

今天早上精神比较好,打算在吃早餐的过程彻底解决一下。

 
 

首先,重点怀疑对象是扩展和插件。我的Firefox里装有54个扩展和9个插件,而且不定时会进行插件的各种参数设置。所以无法从时间上定位具体装了哪个插件以后出现该现象。说到这里,停下来BS一些不负责任的客服:

客户:我这里的系统出现了xxx现象,请问怎么解决?

客服mm:请问您的系统是什么时候开始出现该现象的?

客户:大约是上周。。。也有可能是上上周。

客服mm:请问您上上周对电脑做过什么操作?

客户:~!@¥%@¥#&%!@#¥#~~@¥!#~...记不得了。

客服mm:您再好好回忆一下,您当时对电脑做过什么操作,好吗?

客户:对。。对不起,上上周的事我实在想不起来了。

客服mm:哦,那么这样我无法帮助您。还有什么我可以帮助您?如果不需要帮助,请稍候对我的服务进行评价。

客户:    ~@!$~!$~@~@$$@~@$~~@$~!~@~#@~~~#$%^&^!~    @#$%^%*&^~

这种客服各行各业都是,不会分析问题,避重就轻,制造障碍,想办法打发客户。

 
 

好了,BS完毕,我们继续分析。既然无法从时间上定位哪个扩展造成影响,那么我们从空间上来。一共有54个扩展,我们先禁掉前27个,如果现象消失,说明这27个插件中有某个在作怪。否则说明问题可能存在于后27个。然后再对可能存在问题的27个进行迭代分析。实际上最多需要 [log2(54)]+1 次即可定位到出问题的扩展所在。

 
 

OK,二分法很简单。写这篇文章的主要目的在于启发一个调试技巧:分块注释。比如说我们发现接手了一个程序有诸多内存泄漏,而根本不可能追述代码是谁写的、什么时候写的。这时候最好的办法就是分块注释,从程序入口点开始,在合适的构造函数处把后面的操作分块注释。在不影响程序编译的情况下,尽量按二分法注释代码。很多同行们看着代码大片大片地变绿会有些心虚,实际上动动手,你会发现比想象的简单。 ;-)

 
 

在Firefox中禁用、启用扩展是需要重启程序的。在重复劳动量很大的时候,千万不要用鼠标,因为使用鼠标容易造成疲劳。我们尽量用键盘。观察一下,在插件管理器中,按↓跳到下一个插件,按ALT + D是禁用(&D),按ALT + E是启用(&E)。所以我们只要右手放在↓键,左手放在ALT+D或E,就能一阵噼里啪啦地完成这项工作,很high。 ;-)

 
 

经过一番噼里啪啦,我找到是MediaWrap在作怪。最后再分别禁用一次、启用一次,确认现象消失一次、出现一次,那么MediaWrap确实是元凶。

 
 

打开MediaWrap,里面也有不少复选选项,继续套用二分法,发现是和"检查 EMBED 标签媒体"和"自动播放Flash"这两个选项在作怪,勾上就挂了。

 
 

好,现在从源码角度剖析。先拖拽反选 按钮。我习惯多选一点,把相邻的也选一点点,某些情况下可以避免遗漏。然后右键,查看选中部分的源码。观察到有关的代码片段为:

<input
value="复制选中的链接"
class="button"
onclick="copy('EM47b82f9be4a8e')"
type="button">

这时候运用"Web Developer Toolbar"扩展的Information -> View JavaScrip功能。这里我不选用FireBug的原因是WDT的JS查看功能能够把所有引用到的JS组合到一个新窗口中,而FireBug会开N个新窗口,查找起来就麻烦了。这里找到copy()函数的定义: 

http://statics.verycd.com/javascripts/group.js.r8407 第485行

function copy(str) {


 


var a = document.getElementsByName(str);


var n = a.length;


var ed2kcopy = "";


for (var i = 0; i < n; i++) {


if(a[i].checked) {

ed2kcopy += a[i].value;

ed2kcopy += "\r\n";

}

}


//copyToClipboard(ed2kcopy);

VeryCD.events.copy(ed2kcopy);

}

在FireBug中定位到这个函数,我们在VeryCD.events.copy(ed2kcopy);下断点,之后可以说一切尽在掌握中。这里引用了函数"VeryCD.events.copy",单步来到 http://statics.verycd.com/javascripts/global.js.r8589 第156行

VeryCD.events.copy = function(text2copy)

{


if (window.clipboardData)

{

window.clipboardData.setData("Text", text2copy)return

}


var flash_el = null
if (arguments.length == 2)

{


if (typeof $(arguments[1]) == "object")

{

flash_el = $(arguments[1])

}

}


if (!flash_el)

{


var div_holder = document.createElement('div')div_holder.id =


"flash-copier"document.body.appendChild(div_holder)flash_el = $(


"flash-copier")

}

flash_el.innerHTML = '<embed src=


"' + VeryCD.config.root.statics + '\/images\/clipboard.swf" FlashVars=


"clipboard=' + encodeURIComponent(text2copy).replace( / \

+ / g, "%2B") + '" width="0" height="0" type="application\/x

-shockwave-flash"><\/embed>'

}

从上一段代码可以看出,VeryCD

http://statics.verycd.com

http://statics.verycd.com/images/clipboard.swf

嘿,这里用了个Flash

// Action script...


 

// [Action in Frame 1]

System.useCodepage = true;

if (clipboard.length)

{

System.setClipboard(clipboard);

} // end if


 

哈哈,这下基本上清楚了:我在Firefox的Mediawrap插件中,VeryCD网站的右键复制功能是利用运行一个Flash。Flash的第一帧有个ActionScript,作用是写入剪贴板。当我勾选了MediaWrap中的"非ActiveX控件-检查EMBED标签的媒体",同时反选"自动播放Flash"的时候,这个ActionScript得不到执行。应该是显示一个"播放"的图标,等待用户点击。但是这个Flash的尺寸是0("width="0" height="0"),根本不可见,所以一直处在等待用户点击的状态,所以复制剪贴板无效。

 
 

  

自动播放Flash

勾选

反选

检查EMBED标签的媒体

勾选

可用

不可用

反选

可用

可用

 
 

至于"检查EMBED标签的媒体"做了什么,没有文档资料,我也不太清楚,如果知道的朋友请告诉我一声?如果找到原因,我将更新本文。

2008年2月20日星期三

关于迅雷"盗窃"一文的再分析

午休前看到cnBeta上的这篇文章[多图技术解析]小心,你的文件正在被迅雷盗窃!觉得作者有点夸张。晚上吃完饭又看到迅雷官方稿件: 安全与快捷并重 迅雷将用户利益进行到底 忍不住re了一下。以下是re

写之前那篇文章的作者充其量是个伪行家,好像会用ProcessMonitor就入门了似的。看到那篇原文(http: //www.cnbeta.com/articles/48566.htm),觉得主观色彩太重,用了一堆文革大字报的词藻,没什么技术含量,还搞得很炫 的大红字。本不想出来说,看到迅雷回的这篇,干脆也re一下。

1.原作者知道拿ProcessMonitor来监视迅雷,那么按常理应该懂得拿ProcessMonitor来监视一下其它进程,做一比较,再下结论。比如说我用ProcessMonitor监视记事本,设置:
“ProcessName is notepad.exe then include”,为了公平起见,仅监视文件系统“Show File System Activity”。记事本进程一运行,ProcessMonitor就监视到78条相关event。其中不乏C:诸多目录的访问。

2. 作者截的图贻笑大方。一大堆Event都是对插入为全局钩子的DLL记录,还有BHO的记录。这个恐怕是迅雷的作者也难以控制的。不信可以在C:任意建一 个文件夹,用ProcessMonitor看看迅雷会不会遍历这个文件夹。如果迅雷在遍历整个盘的话,一定所有文件夹遍历过去,不会针对某些跳过。

3.作者截图的时候也太情绪化了,没有注意到细节,反毁自己形象。比如说网络流量图,作者很愤怒地指责“图四:网速几乎消耗殆尽”实际上,仔细看这个图的比例是最高带宽使用率(红线处)为2.5%。要说“消耗殆尽”,就太情绪化了。【注意,此处有误,修正请参见评论】

都是做技术的人,还是冷静地分析问题为上。谩骂会诋毁自己的形象。

2008年2月19日星期二

一卡多号碰壁

成功将自己的SIM卡号写入1卡12号企鹅卡之后,启动i718+(i718ZMGF4),这下打电话都需要确认了,现象如下:





先是顶部的电话图标弹出提示“网络服务不可用。请稍候重试。”





然后是下方弹出信息框“手机号码已在SIM卡中修改。拨打xxxxx?”其中xxxxx是刚才拨打的电话号码








十分郁闷中,期待解决。


2008年2月2日星期六

del.icio.us好用乎?

铺天盖地的WEB2.0浪潮中,像del.icio.us这样的社会化服务每天都难免有几次钻入视线,这个是它的图标,你熟悉吗?
但是,今天一装上del.icio.us bookmark这个官方的Firefox扩展,就大倒胃口。
装完以后,它询问我是否要自动导入Firefox书签,我想想如果全用del.icio.us来管理,应该可以达到foxmark这样的效果吧。。。
10秒钟后导入结束,一打开傻眼了,书签名中的中文乱码,包括WEB页上的和工具条上的。首先想到的是试一下修改字符编码,试了几种可能都无效。由于发现有大量相同的怪字符,比如“中å⊘½é⊘³ä¹⊘ç½⊘--å⊘¤å ¸é⊘³ä¹⊘ä¸⊘è½½”,对应过去的ASCII码是0x3F、0x3F、0x3F、0xA8、0xA8可能导入的时候采用了值域更小的字符集,这样信息已经不可逆地损失了。。
土到掉渣,这时候想到的是马上把这一大批导入的书签删掉,这时发现del.icio.us没有批量管理的功能,只能一个一个删 &gt;_&lt; 。。
真的只有我这么不顺吗?那么多使用del.icio.us的用户都没有这样的问题吗??
最后,mm想到了很finally的一招:自杀帐号。强!


Powered by ScribeFire.

2008年1月31日星期四

惨烈的战斗

惨烈的战斗,简直是比指法啊……

Posted by Picasa

2008年1月24日星期四

34个原因让读者退订你的博客(转载,好文,共勉)

网络上如此经典的好文章不多,我收藏过《提问的智慧》、《如何成为一位 hacker》、《如何有效地报告Bug》、《论坛的十个基本礼节》、《软件工程师道德规范》。而这篇文章随着WEB2.0的蓬勃发展也应运而生。且看下文:


  翻译人:William Long,译文地址:34个原因让读者退订你的博客,英文原文:34 Reasons Why Readers Unsubscribe from Your Blog

  很多人都在思考为什么他们的读者会退订他们的RSS Feed,这里总结了34个原因,试图解释一下用户退订的部分原因所在以及动机。

  34个用户退订RSS Feed的原因:

  1、文章更新太快(频繁发文导致用户信息过载)

  2、文章更新太慢(也许博客已经停止更新)

  3、RSS Feed是摘要输出

  4、博客更改了内容主题(无关主题的文章太多)

  5、大部分内容在其他地方见过(复制或转载内容)

  6、没有意思的内容

  7、不相关的内容

  8、作者过于自我,过于自我宣传、自吹自擂

  9、内容质量低劣

  10、长篇文章过多

  11、负面报道

  12、RSS Feed错误,特别是Feed总是每次重载最后的10-20篇文章

  13、攻击性的内容/人身攻击/歧视

  14、内容商业化(大量销售信息)

  15、文章标题不说明文章主要内容

  16、内容没有排版

  17、读者的自身兴趣转移

  18、不再有用或有价值

  19、文章内的链接很多,内容不够

  20、内容大多是广告

  21、不一致的写作(风格和重点)

  22、语法错误太多

  23、发现有其他更好的Feed

  24、视线太窄

  25、一直重复某个议题

  26、言语粗鲁

  27、博客不回应文章的评论

  28、没有图片

  29、信心或看法不足

  30、不知道这个博客是谁

  31、文章结尾太多混乱

  32、评论读者

  33、太多引用

  34、更换了原来的博主

  下面是我的一些简短的评论(我不想发表长篇大论)

  发布频率显然是一个重要的因素,有35%的受访者表示是因为文章发布太快而退订,28%的称文章发布太慢而退订。我猜想原因可能是,停止更新的Feed并没有打扰读者(在Google Reader中某个模式你会看不到不活动的Feed,除非其进行更新)。

  摘要输出也不被人喜欢,24%的受访者说,他们会退订那些只输出摘要的Feed。

  博客改变研究方向和话题也是一个焦点,22%的人放弃订阅是因为这个理由。

  关于内容,有趣的是我发现人们对文章的质量、相关内容及性质并不太关心。发布的形式和更新次数成为主要因素,而内容则成为了次要因素。



原创文章如转载,请注明:转载自月光博客 [ http://www.williamlong.info/ ]

Powered by ScribeFire.

2008年1月23日星期三

用Firebug和WebDeveloper插件来帮助WEB设计


自从抛弃maxthon,用上firefox,的确腰不酸腿不疼了。以前在IE下有IEInspector,以为是最好的WEB调试方式了。结果到了Firefox的海洋中真是小巫见大巫。Firefox里的插件一车一车的多……当然改善程序员(网页设计师)生活的更是多如牛毛。
挑来拣去,最后挑了两套认为最强大的装上,如图。
随便说点功能吧:

内部、外部CSS查看
内部、外部js查看
DOM分析
盒图
显示一堆本不可见的东西,比如所有的id、class、div边框……
集成w3c validate
性能分析

肯定是说不完了,有兴趣的装起来看看吧
Firebug 下载: https://addons.mozilla.org/en-US/firefox/addon/1843
Web Developer 下载: https://addons.mozilla.org/en-US/firefox/addon/60
Posted by Picasa

2008年1月16日星期三

Oracle大小写问题的来龙去脉

玩过Oracle的同学应该都知道如果用大小写混合的命名做库表名会十分悲惨,但也许很多同学摸不清原因,只能敬而远之全用大写。这里分析一下来龙去脉:

Oracle在命名表的时候可以使用大写或小写字母。只要表名或字段名没有用双引号括住,Oracle对大小写就不敏感。Oracle支持使用双引号的语法。但是,最好不要直接使用双引号,理由如下:

因为在建立查询的时候,表名和列名都应该带有双引号,而Hibernate生成的查询是不会带有双引号的,所以会出现无法找到表或视图的错误。

以下假设对Table_1表操作

在创建表时:
1.通过SQL*Plus操作时会自动转化为大写TABLE_1,再写入数据库。
2.通过PL/SQL Developer操作时也会自动转化为大写TABLE_1,再写入数据库。
3.通过PoweerDesigner来Generate的时候,不会自动转为大写,也就是说把"Table_1"写入数据库

在使用表时(如果库里写的是Table_1):
1.PL/SQL Developer中进行可视化地进行表的删除等操作时,后台采用的是不带双引号的表名,也就是Table_3,将出现无法找到表或视图的错误。
2.通过Hibernate生成的查询也不带双引号,也将出现无法找到表或视图的错误。
……
这时只能采用类似 drop table "Table_1" 的语法,在SQL*Plus或PL/SQL Developer手工删除或修改表。


Powered by ScribeFire.

2008年1月15日星期二

火狗(FireDog)

中午在阿韬楼下不经意发现一只睡懒觉的狗狗,形状酷似FireFox。。。
Posted by Picasa
以下是FireFox的官方图标,看看像不像:)
发件人 图标