<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_十年磨一劍--從程序員到架構師</title><subtitle type="text">一个.net程序员，一个企业应用的开发者，喜欢系统架构，数据库，领域驱动，面向对象，表现层技术。关注重用的理论和实践。设计原则：简单，快速，适应变化能力强，表现层灵活多变...</subtitle><id>http://feed.cnblogs.com/blog/u/11773/rss</id><updated>2012-02-08T09:44:23Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/11773/rss"/><entry><id>http://www.cnblogs.com/tsoukw/archive/2012/02/08/2343018.html</id><title type="text">IE不能直接顯示PDF的原因分析和解決方法</title><summary type="text">關鍵字： IE，PDF，浏览器，直接显示，不要下载，adobe，foxit reader，注册表</summary><published>2012-02-08T09:44:00Z</published><updated>2012-02-08T09:44:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2012/02/08/2343018.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2012/02/08/2343018.html"/><content type="html">&lt;p&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;問題&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;因為有系統用iframe顯示PDF，但PDF有時卻并不能順利地在流覽器中顯示，而是跳出下載對話框，要求下載，給user帶來很多困擾，&lt;br /&gt;也給我們系統維護人員帶來了麻煩，用了兩天，查找IE打開PDF的一些規則，和大家分享一下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;分析&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;一.測試環境&lt;br /&gt;win7 32bit &lt;br /&gt;IE9&lt;br /&gt;foxit reader(version 3.2.1.0401，直接將以前安裝好的目錄Foxit Software打包，然後解壓在電腦上直接執行)&lt;br /&gt;adobe reader x(version 10.0.0，安裝包文件名:AdbeRdr1000_zh_TW.exe)&lt;/p&gt;&#xD;
&lt;p&gt;二.原理說明&lt;br /&gt;以下註冊表鍵值，決定IE是否直接打開PDF&lt;br /&gt;HKEY_CLASSES_ROOT\MIME\DataBase\Content Type\application/pdf\CLSID&lt;br /&gt;1.如果CLSID中是個錯的值，即在HKCR\CLSID中不存在(如隨便一個xxxxx)，&lt;br /&gt;如果pdf的預設打開程式是foxit reader，那會根據foxit reader的設定，在流覽器中還是在外面開啟&lt;br /&gt;如果pdf的預設打開程式是adobe reader x，則不論設定如何，都會彈出下載對話框，在流覽器外面開啟&lt;/p&gt;&#xD;
&lt;p&gt;2.如果CLSID值存在于HKCR\CLSID中，但是不是正確的foxit reader和adobe reader x的CLSID值&lt;br /&gt;(測試過這兩個CLSID:{0000002F-0000-0000-C000-000000000046}:clsid中的第一個，{22D6F312-B0F6-11D0-94AB-0080C74C7E95}:Windows Media Player)&lt;br /&gt;則會彈出下載對話框，當用戶選擇【打開】時，&lt;br /&gt;不管pdf的默認程序是foxit reader，還是adobe reader x，都會在流覽器外面打開，而不管其是否有設定在流覽器中顯示PDF&lt;/p&gt;&#xD;
&lt;p&gt;三.adobe reader x在流覽器中打開PDF的設定&lt;br /&gt;adobe reader x的CLSID:&lt;br /&gt;{CA8A9780-280D-11CF-A24D-444553540000}&lt;/p&gt;&#xD;
&lt;p&gt;以下鍵值不存在則會在流覽器中顯示（默認），存在則不會在流覽器中顯示，&lt;br /&gt;HKCU\Software\Adobe\Acrobat Reader\10.0\Originals\bBrowserIntegration&lt;/p&gt;&#xD;
&lt;p&gt;PS:adobe reader x在流覽器有時PDF顯示不出來，這時可以通過【說明】/【修復adobe reader安裝】后， 重新開啟流覽器或重啟系統試一下。&lt;/p&gt;&#xD;
&lt;p&gt;{CA8A9780-280D-11CF-A24D-444553540000}內容&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;Windows Registry Editor Version 5.00&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}]&lt;br /&gt;@="Adobe PDF Reader"&lt;br /&gt;"AppID"="{BBAA0E44-3862-490C-8E63-AC2D2D6EF733}"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\Control]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\DocObject]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\EnableFullPage]&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\EnableFullPage\.fdf]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\EnableFullPage\.pdf]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\EnableFullPage\.xdp]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\EnableFullPage\.xfd]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\EnableFullPage\.xfdf]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\Implemented Categories]&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\InprocServer32]&lt;br /&gt;"ThreadingModel"="Apartment"&lt;br /&gt;@="C:\\Program Files\\Common Files\\Adobe\\Acrobat\\ActiveX\\AcroPDF.dll"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\MiscStatus]&lt;br /&gt;@="0"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\MiscStatus\1]&lt;br /&gt;@="131473"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\ProgID]&lt;br /&gt;@="AcroPDF.PDF.1"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\Programmable]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\ToolboxBitmap32]&lt;br /&gt;@="C:\\PROGRA~1\\COMMON~1\\Adobe\\Acrobat\\ActiveX\\AcroPDF.dll, 102"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\TypeLib]&lt;br /&gt;@="{05BFD3F1-6319-4F30-B752-C7A22889BCC4}"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\Version]&lt;br /&gt;@="1.0"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{CA8A9780-280D-11CF-A24D-444553540000}\VersionIndependentProgID]&lt;br /&gt;@="AcroPDF.PDF"&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;關鍵是ProgID @="AcroPDF.PDF.1"&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;Windows Registry Editor Version 5.00&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\AcroPDF.PDF.1]&lt;br /&gt;@="Adobe PDF Reader"&lt;br /&gt;"EditFlags"=hex:00,00,01,00&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\AcroPDF.PDF.1\CLSID]&lt;br /&gt;@="{CA8A9780-280D-11CF-A24D-444553540000}"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\AcroPDF.PDF.1\DocObject]&lt;br /&gt;@=""&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;四.foxit reader在流覽器中打開PDF的設定&lt;br /&gt;foxit reader的CLSID:&lt;br /&gt;{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}&lt;/p&gt;&#xD;
&lt;p&gt;下面這些鍵值存在，則會在流覽器中打開，反之則會在流覽器外打開&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;Windows Registry Editor Version 5.00&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}]&lt;br /&gt;@="PDF Document"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\AuxUserType]&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\AuxUserType\2]&lt;br /&gt;@="PDF"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\AuxUserType\3]&lt;br /&gt;@="Foxit Reader"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\DefaultExtension]&lt;br /&gt;@=".pdf, PDF Files(*.pdf)"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\DefaultIcon]&lt;br /&gt;@="C:\\Users\\C036503220A\\Downloads\\foxit\\Foxit Software\\Foxit Reader\\Foxit Reader.exe,1"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\DocObject]&lt;br /&gt;@="0"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\InprocHandler]&lt;br /&gt;@="ole2.dll"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\InprocHandler32]&lt;br /&gt;@="ole32.dll"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\Insertable]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\LocalServer]&lt;br /&gt;@="C:\\Users\\C036503220A\\Downloads\\foxit\\Foxit Software\\Foxit Reader\\Foxit Reader.exe"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\LocalServer32]&lt;br /&gt;@="C:\\Users\\C036503220A\\Downloads\\foxit\\Foxit Software\\Foxit Reader\\Foxit Reader.exe"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\MiscStatus]&lt;br /&gt;@="32"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\Printable]&lt;br /&gt;@=""&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\ProgID]&lt;br /&gt;@="FoxitReader.Document"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\Verb]&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\Verb\0]&lt;br /&gt;@="&amp;amp;Edit,0,2"&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\CLSID\{14E8BBD8-1D1C-4D56-A4DA-D20B75EB814E}\Verb\1]&lt;br /&gt;@="&amp;amp;Open,0,2"&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;至于&lt;br /&gt;HKCU\Software\Foxit Software\Foxit Reader\MainFrame\DisplayInBrowser&lt;br /&gt;值為1，則foxit reader設定對話框中的【是否在流覽器中顯示】checkbox會勾上，&lt;br /&gt;值為0，則不勾上&lt;br /&gt;這個設定不影響foxit reader如何在IE中打開PDF&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;五.其它&lt;br /&gt;HKEY_CLASSES_ROOT\.pdf鍵，雖然在IE處理PDF時不起直接作用，但最好還是設定正確&lt;br /&gt;adobe reader x的設定&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;Windows Registry Editor Version 5.00&lt;/p&gt;&#xD;
&lt;p&gt;[HKEY_CLASSES_ROOT\.pdf]&lt;br /&gt;"Content Type"="application/pdf"&lt;br /&gt;@="AcroExch.Document"&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;foxit reader的設定&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;Windows Registry Editor Version 5.00&lt;br /&gt;[HKEY_CLASSES_ROOT\.pdf]&lt;br /&gt;@="FoxitReader.Document"&lt;br /&gt;"Content Type"="application/pdf"&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;結論&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;IE中一直彈出下載對話框，即使在adobe或foxit中已經有設定相關選項，但還是不能在流覽器中直接顯示。&lt;br /&gt;最直接的原因，可能就是HKEY_CLASSES_ROOT\MIME\DataBase\Content Type\application/pdf\CLSID設定錯誤&lt;br /&gt;將這個值設定為adobe或foxit正確的clsid，應該就可以解決這個問題了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/2343018.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2012/02/08/2343018.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tsoukw/archive/2012/01/06/2315267.html</id><title type="text">[2012-01-06]</title><summary type="text">一。sjs的继承方式ext(v2.x)的继承方式extend是通过原型链的方式实现子类.prototype = new F()F.prototype = 父类.prototypevar obj = new 子类();obj就有了父类的属性借助临时函数F的存在，为子类的prototype和父类的prototype架起桥梁。//父类test.base = function(cfg){}//子类test.input = function(cfg){ test.input.superclass.constructor.call(this, cfg);}//继承ext.extend(test.in...</summary><published>2012-01-06T14:51:00Z</published><updated>2012-01-06T14:51:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2012/01/06/2315267.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2012/01/06/2315267.html"/><content type="html">&lt;p&gt;一。sjs的继承方式&lt;/p&gt;&#xD;
&lt;p&gt;ext(v2.x)的继承方式extend是通过原型链的方式实现&lt;/p&gt;&#xD;
&lt;p&gt;子类.prototype = new F()&lt;/p&gt;&#xD;
&lt;p&gt;F.prototype = 父类.prototype&lt;/p&gt;&#xD;
&lt;p&gt;var obj = new 子类();&lt;/p&gt;&#xD;
&lt;p&gt;obj就有了父类的属性&lt;/p&gt;&#xD;
&lt;p&gt;借助临时函数F的存在，为子类的prototype和父类的prototype架起桥梁。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;//父类&lt;br /&gt;test.base = function(cfg){&lt;/pre&gt;&#xD;
&lt;pre &gt;}&lt;/pre&gt;&#xD;
&lt;pre &gt;//子类&lt;br /&gt;test.input = function(cfg){&lt;br /&gt;    test.input.superclass.constructor.call(this, cfg);&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;pre &gt;//继承&#xD;
ext.extend(test.input, test.base, {&#xD;
&#xD;
    _renderInner: function(html) {&#xD;
        this._renderInput(html);&lt;br /&gt;    }&amp;nbsp;&lt;/pre&gt;&#xD;
&lt;pre &gt;}&#xD;
&#xD;
...&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;sjs(simple js)继承实现不一样，严格来说，sjs并不是继承，而是一种mixin，并且允许子类，插件，甚至最终实例对象，都可以自由override任意方法和属性，提供最大的灵活性和扩展性。&lt;/p&gt;&#xD;
&lt;p&gt;不管是继承,mixin,plugin还是最终的config override，都提供统一的overide方式，在子类方法中，都可以用this.callOverride()访问被override的上一层函数。&lt;/p&gt;&#xD;
&lt;p&gt;最终被new出来的实例，其原型链只有一层，即被mixin后的最终对象&lt;/p&gt;&#xD;
&lt;p&gt;显然这种方式比起原型链来说，多了很多次的copy动作，但毕竟是class的构建，加上极短的原型链，在访问实例的属性和方法时，想必对性能影响也不会太大&lt;/p&gt;&#xD;
&lt;p&gt;但是其对于在各个层次，类层次，插件层次，对象层次时提供的统一，简单的override访问，则会得到更多的好处&lt;/p&gt;&#xD;
&lt;p&gt;构造方式大致如下：&lt;/p&gt;&#xD;
&lt;p&gt;var classPrototype = mixin(base,overrides,plugin1,plugin2...);&lt;/p&gt;&#xD;
&lt;p&gt;new F()&lt;/p&gt;&#xD;
&lt;p&gt;F.prototype = classPrototype;&lt;/p&gt;&#xD;
&lt;p&gt;使用时直接new F(cfg)即可&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;二。sjs的UI对象与Html Element的关系&lt;/p&gt;&#xD;
&lt;p&gt;传统的js UI对象，一般与最终输出在浏览器中的对象都是一一对应的，即一个js UI对象，一般对应一个具体的Html Element元素。&lt;/p&gt;&#xD;
&lt;p&gt;这种方式对于开发UI类来说很方便，UI对象任何时候可以通过this.el访问dom，再对dom的原生浏览器event进行attach&lt;/p&gt;&#xD;
&lt;p&gt;但这种方式的弊端就是在grid中的行中的子对象构建相当麻烦&lt;/p&gt;&#xD;
&lt;p&gt;试想一个有500行的grid，每行可能有三个input输入，或是直接显示datepicker这样的对象用于某个栏位的输入。&lt;/p&gt;&#xD;
&lt;p&gt;多达1500次的new动作，再加上事件构造，dom对象引用，然后翻页时又全部dispose，想想就受了不。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;而再想最原始的处理方式，就是先显示html&lt;/p&gt;&#xD;
&lt;p&gt;中间可能夹了一些onclick，显示直接将td中的html加起来，最后innerHTML就行，方便简单&lt;/p&gt;&#xD;
&lt;p&gt;翻页也无需多恼，直接innerHTML替换新的就好了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;因此sjs考虑采用这种原始方式&lt;/p&gt;&#xD;
&lt;p&gt;getHtml和事件响应和处理分开&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一个new好的对象，如果在除了私有数据不一样外，可以一直render&lt;/p&gt;&#xD;
&lt;p&gt;UI 对象保存每一份的数据，并且在id匹配时，自动在程式中使用这个id的私有数据&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这样，整个框架，一般只有一个datePicker对象，一个monthPicker对象，一个textInput对象&lt;/p&gt;&#xD;
&lt;p&gt;却可以为所有的实例提供对象操作支持。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;至于外部通过这个对象操作具体的Html Element时，则需要调用一下fly(id)或flyByKey(dataRowIndex)这样的方式先行引用，再进行方法，如datePicker的setDay方法&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;三。ORA-02067: 必須執行交易或儲存點的倒回作業&lt;/p&gt;&#xD;
&lt;p&gt;在发生这个错误后，那台主机（不管IIS应用程序池，以及连接字符串不同）的相同账号访问同台DB都会被Pending住，后台程式不可预料，所以看是否可以在.net服务端统一解决？&lt;/p&gt;&#xD;
&lt;p&gt;捕捉异常，看能否传入rollback指令?&lt;/p&gt;&#xD;
&lt;p&gt;等有时间，将错误重现后，再来找解决方案&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/2315267.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2012/01/06/2315267.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tsoukw/archive/2011/08/12/2136731.html</id><title type="text">流程系统设计--消息和通知</title><summary type="text">所谓流程系统，就是不同的人按照规则参与同一件事情的处理。比如报销审批，由报销人提出申请，再经各级主管审核，最后由财务部门核准的一个过程。工务申请，由申请人提出申请，经各经主管审核和相关部门评估，再由制作部门派工制作的一个过程。。。今天就对流程系统消息和通知的设计分享一些想法一般流程中的人员，特别是主管，都不会每时每刻守在系统中，等待单据或任务的到来，很多时候，流程中的人员都是在接到系统的通知后，再登录系统处理任务。因此流程的消息，就成为流程系统设计一个不可或缺的环节第一.消息的分类流程系统中最重要的消息，就是通知人员有任务需要处理的任务消息了，这些消息带动流程有序按时运转。消息的内容可能像这样</summary><published>2011-08-12T14:04:00Z</published><updated>2011-08-12T14:04:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2011/08/12/2136731.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2011/08/12/2136731.html"/><content type="html">&lt;p&gt;所谓流程系统，就是不同的人按照规则参与同一件事情的处理。比如报销审批，由报销人提出申请，再经各级主管审核，最后由财务部门核准的一个过程。工务申请，由申请人提出申请，经各经主管审核和相关部门评估，再由制作部门派工制作的一个过程。。。&lt;/p&gt;&#xD;
&lt;p&gt;今天就对流程系统消息和通知的设计分享一些想法&lt;/p&gt;&#xD;
&lt;p&gt;一般流程中的人员，特别是主管，都不会每时每刻守在系统中，等待单据或任务的到来，很多时候，流程中的人员都是在接到系统的通知后，再登录系统处理任务。因此流程的消息，就成为流程系统设计一个不可或缺的环节&lt;/p&gt;&#xD;
&lt;p&gt;第一.消息的分类&lt;br /&gt;流程系统中最重要的消息，就是通知人员有任务需要处理的任务消息了，这些消息带动流程有序按时运转。&lt;br /&gt;消息的内容可能像这样:"您有2张请假单需要签核，单击这里处理"&lt;/p&gt;&#xD;
&lt;p&gt;其次是知会消息，收消息的人员可能只是获得一个通知，不一定要登录系统进行作业，因此这种消息的重要性比较低&lt;br /&gt;如：&lt;br /&gt;您的请假单已被核准，单击这里查看&lt;br /&gt;XX的请假单已被退回，单击这里查看&lt;/p&gt;&#xD;
&lt;p&gt;第二.消息何时发送&lt;br /&gt;流程中的消息的都是在流程人员进行某个动作后产生，如用户送审请假单后，请假审核的任务消息就会产生，并且发送给第一个审核人员。工务单审核完后，就会发送要求派工的信息给派工人员，通知其进入系统进行派工作业。&lt;/p&gt;&#xD;
&lt;p&gt;又比如在最后一个人员审核后，请假单已被核准的知会消息，就可以向申请人发送。&lt;/p&gt;&#xD;
&lt;p&gt;知会消息一般都是这样发送&lt;/p&gt;&#xD;
&lt;p&gt;但是任务消息如果这样的话，有可能会碰到下面这些情况：&lt;br /&gt;1.某人的任务单据太多，可能一天要处理几十上百个，这时候如果每笔作业都通知势必会造成用户的困扰&lt;br /&gt;2.虽然大多数时候，人员依赖消息来处理任务，但是并没有排除有人主动登录系统就把任务处理掉了，这时候滞后的消息可能会干扰和迷惑用户&lt;br /&gt;3.有的流程可能在运行到某一个节点时，才发现这个人员已离职，或休假，或出差，因此需要把任务替换或代理给另一个人，如果采用这种方式，则在流程动态变更后，新的流程人员就没办法收到任务处理的消息了(流程在实例运行过程中的动态变更是检验一个流程系统是否实用的很重要的标准)&lt;/p&gt;&#xD;
&lt;p&gt;因此任务消息我们采用的是&lt;br /&gt;1.用户登录系统，获取最新任务（用户完全主动，不需要消息通知）&lt;br /&gt;或者登录网站后，通过站内短信，定时询问是否有任务（任务系统即时计算任务）。&lt;br /&gt;或者打开我们自己开发的消息客户端，定时询问是否有任务（任务系统即时计算任务）。&lt;br /&gt;后两种一般都可以让用户设定间隔时间（如每隔5分钟收一次）。&lt;/p&gt;&#xD;
&lt;p&gt;在这里再分享一些客户端消息程式（站内短信或window客户端）设计的一些实际作法&lt;br /&gt;消息图标有三种状态：无消息，新消息（新任务），有消息未看（或者有任务未处理）&lt;br /&gt;新消息表示最新收到，最后一次定时询问时收到的消息，一般图标闪烁，提醒用户&lt;br /&gt;新消息到来时，可能用户没有时间去处理，这时一般闪烁一段时间后，则变成有消息未读的图标，不再闪烁的方式干扰用户，但是也提醒用户有消息没有看，以区别无消息&lt;/p&gt;&#xD;
&lt;p&gt;但是对于任务来说，消息有没有看并不决定任务是否有没有处理，所以有消息未看，变成有任务未处理，凡是有任务未处理&lt;/p&gt;&#xD;
&lt;p&gt;则以相同的状态提醒，则不论用户有没有看&lt;/p&gt;&#xD;
&lt;p&gt;所以任务收到后，一般要比对主key，检查是否新的任务到来，再选择以何种方式提醒用户&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;2.任务消息除了定时获取外，有时候还需要主动通知&lt;br /&gt;如超过几小时或一天未处理的，可以通过mail或手机短信等进行通知&lt;br /&gt;一般通过一支排程程式，定时运行，计算任务人员，统一发送消息&lt;/p&gt;&#xD;
&lt;p&gt;第三.消息发送方式&lt;br /&gt;严格来说，这个不止在流程系统的设计会遇到，在一般的系统可能也会有消息发送分为系统主动发送，和用户主动索取&lt;br /&gt;1.如系统主动用mail,短信,MSN或自己开发的客户端程式通知用户，类似于推送&lt;/p&gt;&#xD;
&lt;p&gt;2.用户向系统询问消息&lt;br /&gt;a.如用户登录某个网页后，网页通过ajax，定时向消息服务询问消息。&lt;br /&gt;b.通过客户端程式，每隔一段时间询问消息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;对于任务消息来说&lt;br /&gt;即时的待办任务，则可在用户的消息定时器轮询时，即时计算，再发给用户&lt;/p&gt;&#xD;
&lt;p&gt;催办类的任务消息本质上是知会消息，因此其处理方式与知会消息相同&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;对于知会消息来说&lt;br /&gt;一般都通过1的方式直接推送&lt;br /&gt;用户还可以选择是否接收某类消息或选择何种方式（如mail,手机短信，MSN，站内短信还是自定义的客户端）&lt;br /&gt;如果选择的是站内短信或定时询问的客户端，则后者可能需要设计一个资料表来存储这些信息，等到定义询问时再发送出去&lt;/p&gt;&#xD;
&lt;p&gt;，并标记为已发或删除&lt;br /&gt;如果要帮助用户管理这些信息，则可能只标记为已发(记录用户阅读时间)&lt;br /&gt;如果只是发出去，由接收程式自行管理消息，则删除&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;系统可以设定哪些方式发，默认哪些发，哪些不能发&lt;br /&gt;用户也可以在系统设定的范围内再选择以何种方式收&lt;/p&gt;&#xD;
&lt;p&gt;另外消息内容可能因接收类别不一样而不一样，&lt;br /&gt;如手机短信，内容可能要精简&lt;br /&gt;站内短信，可以以链接方式&lt;br /&gt;邮件，内容可以比较详细&lt;/p&gt;&#xD;
&lt;p&gt;其它如消息内容的语言设定有时也需在多语言用户环境进行考虑。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/2136731.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2011/08/12/2136731.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tsoukw/archive/2011/01/21/1941350.html</id><title type="text">企业应用整合(1)--一个账号</title><summary type="text">在对企业应用进行整合时，存在着各种既有自己开发的系统，又有移植，购买来的系统，还有众多旧系统的情形， 这些系统，一般都有自己独立的用户模块，而整合这些不同系统的用户登录，避免让账号飞，则是企业应用整合...</summary><published>2011-01-21T08:23:00Z</published><updated>2011-01-21T08:23:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2011/01/21/1941350.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2011/01/21/1941350.html"/><content type="html">&lt;p&gt;在对企业应用进行整合时，存在着各种既有自己开发的系统，又有移植，购买来的系统，还有众多旧系统的情形，&lt;/p&gt;&#xD;
&lt;p&gt;这些系统，一般都有自己独立的用户模块，而整合这些不同系统的用户登录，避免让账号飞，则是企业应用整合的一个最基本的要求&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;要整合企业应用，首先就是要整合账号&lt;/p&gt;&#xD;
&lt;p&gt;整合账号的原则就是，如果用户已经有一个账号，那么尽量地使用它&lt;/p&gt;&#xD;
&lt;p&gt;这个账号，可以是web系统账号，也可以是ERP的账号，还可以是邮件账号，甚至集团内其它子公司过来出差的同事，他们在他们自己的网站已有账号，现在可以让它直接登录出差地的网站&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/201101/201101211622519487.png"&gt;&lt;img height="493" width="655" src="http://images.cnblogs.com/cnblogs_com/tsoukw/201101/201101211622543438.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于web系统，要使用一个账号登录，可以使用以下两种方法：&lt;/p&gt;&#xD;
&lt;p&gt;第一种&lt;/p&gt;&#xD;
&lt;p&gt;是能够直接使用提供方的资源，如可以访问ERP的用户资料库，可以调用B网站的登录web service，可以访问LDAP&lt;/p&gt;&#xD;
&lt;p&gt;并且提供方信任登录网站，允许其直接使用其资源，并且他的用户也不用担心在该网站登录后，会泄漏其密码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;满足这两个条件，过程就很简单了&lt;/p&gt;&#xD;
&lt;p&gt;用户只要打开内部网站&lt;/p&gt;&#xD;
&lt;p&gt;输入账号，密码，并且选择用户类别(普通用户，A公司用户，ERP用户)&lt;/p&gt;&#xD;
&lt;p&gt;登录程式根据不同的用户类别，调用不同的登录方式来验证用户，即可完成登录&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一般内部各系统，如果各自都有其独立的用户模块，其整合都可以使用这种方法来进行&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;接下来就是第二种&lt;/p&gt;&#xD;
&lt;p&gt;如集团老总在总公司已经有一个账号，那么当他访问子公司的网站时，可以直接使用其总公司的账号登录子公司网站的订单系统查看报表&lt;/p&gt;&#xD;
&lt;p&gt;这种情况下，网站与网站之间都是各自独立或平等的，如163和sohu，总公司网站和子公司网站，子公司A的网站和子公司B的网站&lt;/p&gt;&#xD;
&lt;p&gt;每个网站有自己独立的用户，只是在某些时候，其中一个网站的用户需要使用另一个网站的程式时，为了避免多账号，因而进行的整合&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;假设网站A的用户需要访问网站B的程式，则其登录过程可以描述如下：&lt;/p&gt;&#xD;
&lt;p&gt;1.用户在网站A登录，登录成功后，产生token，并暂存token在cache中，然后引导用户转向网站B的地址&lt;/p&gt;&#xD;
&lt;p&gt;如 http://网站B/ssologin.aspx?token=XXXX&amp;amp;source=网站A &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.网站B的ssologin.aspx提取token，并以其作为参数调用网站A的web service&lt;/p&gt;&#xD;
&lt;p&gt;ValidToken(token)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.网站A验证成功，删除暂存的token，并返回用户ID，告诉网站B，该用户确实在网站A登录过，其用户ID是XXX。远程登录成功&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第二种方式和openID相似，只不过后者是专门用来登录，而这里则主要是为了独立网站之间的账号重用和整合&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;到这里，主要原理已OK，&lt;/p&gt;&#xD;
&lt;p&gt;但是如果没有对登录系统的完整认识，很多时候并不能做好这种借用第三方账号登录的功能&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;大部分系统在设计登录系统时，往往把账号当作具体应用系统中的用户&lt;/p&gt;&#xD;
&lt;p&gt;虽然账号的确代表一个系统中的用户，但账号与用户必须明确分离其功能&lt;/p&gt;&#xD;
&lt;p&gt;账号是用来登录和让系统授予权限的，而用户则是以某种方式具体地参与系统&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;例如请假申请系统，用户需要有工号，部门等人事考勤信息，以便在请假成功后，可以与考勤资料相关联&lt;/p&gt;&#xD;
&lt;p&gt;因此系统设计者往往将用户账号，密码和工号，部门等信息设计在一起，以便用户登录后，直接关联其人事资料，为请假申请程式提供基础&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但请假系统中的账号，可能根本不需要这些资料&lt;/p&gt;&#xD;
&lt;p&gt;如作为审核者的公司高层或总裁，他可能只要登录系统审核请假单，但是并不需要填写请假单，因此他的用户资料中的工号，部门栏位是无意义的&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另一方面，如生产线上的员工，他们可能并不是由自己填写请假单，而是由部门助理代他们填写请假单，因此这些人的资料应该只有工号，部门等人事资料，而不需要使用系统的账号，密码，因为他们并不使用账号密码使用这个系统&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;以上例子，是为了说明登录系统和应用系统是各自独立的，登录系统并不需要知道其用来检验登录和权限管控外的其它任何信息&lt;/p&gt;&#xD;
&lt;p&gt;因此这些账号可能是代表自己公司的一个员工，也可能是某一家使用其B2B系统的供应商，还可能是提供给第三方专属服务时需要验证的账号，密码，他们之间唯一的相同点就是账号，密码，登录，以及各种登录规则和权限管控。&lt;/p&gt;&#xD;
&lt;p&gt;除此之外，设计在登录系统中的其它任何信息都是多余的&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不同地方的账号登录后，在系统中都表现为一个用户唯一标识，如：&lt;/p&gt;&#xD;
&lt;p&gt;850.00&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="mailto:sis@ERP"&gt;sis@ERP&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="mailto:79998686@qq.com"&gt;79998686@qq.com&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="mailto:kevin@company"&gt;kevin@company&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;（@后面表示是什么类型的用户，如果没有，则是网站自己的用户）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;具体系统对于这些唯一标识，一般都一视同仁，不再因其是不同来源的用户而有所区别，这样这个系统的被整合性将更强&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/201101/201101211623004033.png"&gt;&lt;img height="508" width="664" src="http://images.cnblogs.com/cnblogs_com/tsoukw/201101/201101211623043939.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;未提及问题：如果一个用户有很多账号，如何合并？ 可以建立map档，在其中任何一个账号登录后，map到主账号然后再进行各种操作&lt;/p&gt;&#xD;
&lt;p&gt;未完待续：企业应用整合(2)--一次登录&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/1941350.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2011/01/21/1941350.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tsoukw/archive/2010/12/31/1923209.html</id><title type="text">2010年终随笔--漫谈技术</title><summary type="text">2010还有几个小时就要过去了，在这一年收获还是挺多的，感慨也挺多，趁着手上的工作终于告一段落，聊聊一些我的想法。从事企业开发已近8年，时间真的很长，但是对于像我这样经常为了某个想法而兴奋不已的人来说，真的很短，有时候一夜就闭着眼睛架构系统而过去了（失眠真是个非常可怕的东西，期望来年，能够好好地克服这个毛病）从ASP到.net，一直做的就是企业开发，即我们常说的管理系统，和数据打着交道。用户的需求无穷无尽，企业的信息化依然漫长。技术不断发展，而数据库编程这份以前很有前途的职业也似乎渐渐暗淡下来圈子里还是不断地弥漫着各种管理系统没有技术含量，程序员没有前途的说法但是以我看来，有没有前途也好，有没</summary><published>2010-12-31T08:04:00Z</published><updated>2010-12-31T08:04:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2010/12/31/1923209.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2010/12/31/1923209.html"/><content type="html">&lt;p&gt;2010还有几个小时就要过去了，在这一年收获还是挺多的，感慨也挺多，趁着手上的工作终于告一段落，聊聊一些我的想法。&lt;/p&gt;&#xD;
&lt;p&gt;从事企业开发已近8年，时间真的很长，但是对于像我这样经常为了某个想法而兴奋不已的人来说，真的很短，有时候一夜就闭着眼睛架构系统而过去了（失眠真是个非常可怕的东西，期望来年，能够好好地克服这个毛病）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;从ASP到.net，一直做的就是企业开发，即我们常说的管理系统，和数据打着交道。&lt;/p&gt;&#xD;
&lt;p&gt;用户的需求无穷无尽，企业的信息化依然漫长。&lt;/p&gt;&#xD;
&lt;p&gt;技术不断发展，而数据库编程这份以前很有前途的职业也似乎渐渐暗淡下来&lt;/p&gt;&#xD;
&lt;p&gt;圈子里还是不断地弥漫着各种管理系统没有技术含量，程序员没有前途的说法&lt;/p&gt;&#xD;
&lt;p&gt;但是以我看来，有没有前途也好，有没有技术含量也罢，针对的只是某个人，对某个人来说，可能一无是处，对某个人来说，可能就是他的全部&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我曾经也在这条路上寻思了很久，也认为做管理系统没有半分技术含量，也认为只有写操作系统，进入微软才会有程序员的价值。&lt;/p&gt;&#xD;
&lt;p&gt;但是随着时间的推移，我的积累，我的经验让我知道我不会放弃&lt;/p&gt;&#xD;
&lt;p&gt;因为我对它我还没有参透，没有悟透。&lt;/p&gt;&#xD;
&lt;p&gt;它是我现阶段人生价值的一个体现，也是我目前最纯粹的追求之一。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我很庆幸自己是一个程序员，我很感谢上帝给我的这份职业&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;信息化技术，何时才能真正地达到巅峰呢？&lt;/p&gt;&#xD;
&lt;p&gt;信息化是一个企业，乃至一个社会迈向高科技文明的的第一步，也是最基础的一步。&lt;/p&gt;&#xD;
&lt;p&gt;可能大家都有看过《小兵传奇》这部网络小说吧&lt;/p&gt;&#xD;
&lt;p&gt;里面的超级电脑，掌管着这地球，这宇宙的一切信息&lt;/p&gt;&#xD;
&lt;p&gt;如果没有强大的信息化技术，如何才能做到呢?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于企业来说，信息化的重要性更不必说&lt;/p&gt;&#xD;
&lt;p&gt;但现在很多的企业系统却是有很大的局限&lt;/p&gt;&#xD;
&lt;p&gt;很多数据只对系统人员开放，而像信息的生产者或消费者却很难拿到自己拥有，或所需要的数据，而要透过系统现有的功能拿出来，如果不能达到要求，就要改程式或加程式&lt;/p&gt;&#xD;
&lt;p&gt;很多流程只对系统人员开放，企业的管理者甚至不知道这个流程是如何运行的，流程不规范，无效率，或者为某些人的利益而效应的情况有很多&lt;/p&gt;&#xD;
&lt;p&gt;系统只对系统人员开放，管理者想要透过系统完成某项管理意愿，得到的答复却是几个月后早已过时的且有太多不合要求的旧系统。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;系统开发的速度还是太慢了，适应变化的能力还是太弱了&lt;/p&gt;&#xD;
&lt;p&gt;动不动就要用户等个几周，几个月，谁都受不了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;依我看，快速开发是当前信息化技术的一个基本方向&lt;/p&gt;&#xD;
&lt;p&gt;一切技术，如果不能提供快速开发，价值就会大打折扣&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;快速开发不是代码生成，代码生成一般只用在建立专案的第一次，但是系统是需要不断地发展，变化来适应外部环境的发展的，所以，系统也需要不断地修改和维护&lt;/p&gt;&#xD;
&lt;p&gt;如果代码是自动生成的，那肯定不能有效地达到这个目的&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;快速开发也不是所谓的智能表单系统，普通的用户永远都不能代替专业的IT人员来完成系统的开发或所谓的定制的。&lt;/p&gt;&#xD;
&lt;p&gt;除非这个企业确实是只需要一个固定的，简单的，永远不变的系统&lt;/p&gt;&#xD;
&lt;p&gt;但要真正做到信息化，只一个这样的系统是远远不够的&lt;/p&gt;&#xD;
&lt;p&gt;必须依靠我们这些程序员，通过代码来完成，来实现&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;快速开发更不是所谓的拖拖拉拉控件，这种依靠人力的行为怎么能称为快速开发&lt;/p&gt;&#xD;
&lt;p&gt;一个表，一个程式可能可以&lt;/p&gt;&#xD;
&lt;p&gt;如果是十个表，百个表，上千支程式呢？&lt;/p&gt;&#xD;
&lt;p&gt;也这样吗？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;快速开发是在真正地理解了信息系统本质后所开发的直指要害的代码，少而精，简单于是灵活。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;没错，快速开发其实就是简单，拨开一切遮住眼睛的迷雾，你会发现，简单才是最美的&lt;/p&gt;&#xD;
&lt;p&gt;举个例子，你觉得Jquery够简单了，但是我认为其依然复杂&lt;/p&gt;&#xD;
&lt;p&gt;我自己写的document.getElementById虽然简单简陋&lt;/p&gt;&#xD;
&lt;p&gt;但是规范化后，系统中只需要getElementById这个功能，我为什么又要把整个jquery库引进来呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;能简单就简单&lt;/p&gt;&#xD;
&lt;p&gt;能不要就不要&lt;/p&gt;&#xD;
&lt;p&gt;用到多少，就拿来多少&lt;/p&gt;&#xD;
&lt;p&gt;系统中80%以上的代码是真正的业务逻辑代码，而不是为了各种绚丽的技术而使用的代码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;系统开发简单化以后，从需求到上线可能只需要几十分钟或几分钟&lt;/p&gt;&#xD;
&lt;p&gt;我想，这才会是企业的上层，企业的管理人员真正需要的&lt;/p&gt;&#xD;
&lt;p&gt;这样才能为系统化，信息化做更多的工作&lt;/p&gt;&#xD;
&lt;p&gt;才能更快速地实现管理者的各种想法，各种要求，各种idea&lt;/p&gt;&#xD;
&lt;p&gt;才能体现系统化价值，让管理者思考如何更进一步地系统化，信息化&lt;/p&gt;&#xD;
&lt;p&gt;最终实现良性循环，社会大量地需要IT人才，促进信息化技术的更一步发展&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;路漫漫兮其修远，吾将上下而索求&lt;/p&gt;&#xD;
&lt;p&gt;2011,我来了!&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/1923209.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2010/12/31/1923209.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tsoukw/archive/2010/12/18/1909823.html</id><title type="text">Schtasks命令理解排程的應用</title><summary type="text">理解一下windows server 排程(Job)at命令的進階版: schtasks /create命令 建立一個排程必須要有 1.排程的名字(唯一) TN:Task Name(必須)  2.執行...</summary><published>2010-12-18T03:32:00Z</published><updated>2010-12-18T03:32:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2010/12/18/1909823.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2010/12/18/1909823.html"/><content type="html">&lt;p&gt;理解一下windows server 排程(Job)at命令的進階版:&lt;/p&gt;&#xD;
&lt;p&gt;schtasks /create命令&lt;/p&gt;&#xD;
&lt;p&gt;建立一個排程必須要有&lt;/p&gt;&#xD;
&lt;p&gt;1.排程的名字(唯一)&lt;/p&gt;&#xD;
&lt;p&gt;TN:Task Name(必須)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.執行什么程式&lt;/p&gt;&#xD;
&lt;p&gt;TR:Task Run(必須)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.用什么賬戶執行排程&lt;/p&gt;&#xD;
&lt;p&gt;RU:Run User(必須)&lt;/p&gt;&#xD;
&lt;p&gt;RP:Run Password(必須)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4.重頭戲：頻率&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;SC:Schedule(必須)&lt;/p&gt;&#xD;
&lt;p&gt;每分鐘 , 每小時 還是 每天 / 每周 /每月 ?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果要真的every，則不太靈活，因此再提供一個間隔&lt;/p&gt;&#xD;
&lt;p&gt;MO:modifier(默認1)&lt;/p&gt;&#xD;
&lt;p&gt;即每幾分鐘，每幾小時或每幾天，每幾周，每幾個月執行一次&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;5.什么時候執行？&lt;/p&gt;&#xD;
&lt;p&gt;一支程式總有一個精確的時間開始執行&lt;/p&gt;&#xD;
&lt;p&gt;ST:StartTime(默認當前時間)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;這個時間以分鐘表示&lt;/p&gt;&#xD;
&lt;p&gt;那那些每分鐘要執行的，每三分鐘要執行的呢？&lt;/p&gt;&#xD;
&lt;p&gt;當然就是從什么時間&lt;strong&gt;開始&lt;/strong&gt;每分鐘，每三分鐘執行一次了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;6.有了開始執行時間，當然就有停止執行的時間了&lt;/p&gt;&#xD;
&lt;p&gt;ET:EndTime&lt;/p&gt;&#xD;
&lt;p&gt;每分鐘執行，每小時執行的排程，可能只需要執行到22:00就不要執行排程了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但如果是每(幾)天，每(幾)周，每(幾)月執行一次呢？&lt;/p&gt;&#xD;
&lt;p&gt;執行一次當然不需要幾天，幾周，幾月了（不鉆牛角尖，說有的程式要執行幾年的）&lt;/p&gt;&#xD;
&lt;p&gt;結束時間是否就沒有意義呢？&lt;/p&gt;&#xD;
&lt;p&gt;同樣，這就引出了如果是按天，周，月執行，是不是真的就執行一次&lt;/p&gt;&#xD;
&lt;p&gt;答案顯示是否定的&lt;/p&gt;&#xD;
&lt;p&gt;比如以每兩天的頻率執行的排程，可能需要在執行日期內，上午一次，下午一次，或每3分鐘一次&lt;/p&gt;&#xD;
&lt;p&gt;同樣每周，每月執行的排程也存在上述這種情況，也需要重複執行&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;7.這就是每日，每周，每月的重複執行間隔(以分鐘為單位)&lt;/p&gt;&#xD;
&lt;p&gt;RI:Run Interval（如果有ET，或下面的DU，則默認為10分鐘)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有了這個東東，上面的ET同樣也就對日，月，周有效了&lt;/p&gt;&#xD;
&lt;p&gt;聰明的同學可能到這里就會想到&lt;/p&gt;&#xD;
&lt;p&gt;以每1天的頻率，然後再加以重複執行間隔&lt;/p&gt;&#xD;
&lt;p&gt;應該就可以替代每分，每小時的SC設定了&lt;/p&gt;&#xD;
&lt;p&gt;答案是非常正確&lt;/p&gt;&#xD;
&lt;p&gt;windows的排程設定界面，就沒有讓你選擇每分鐘，每小時的頻率選項&lt;/p&gt;&#xD;
&lt;p&gt;好了，為了簡單起見，就認為頻率只縮小到日，周，月就行了，而把小時，分鐘看成是每日執行的重複執行&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;8.再回到結束時間上來&lt;/p&gt;&#xD;
&lt;p&gt;可能有時候直接設定一個準確的時間作為結束&lt;/p&gt;&#xD;
&lt;p&gt;DU: duration&lt;/p&gt;&#xD;
&lt;p&gt;但有時也可以直接設定重複執行多少分鐘后就停止&lt;/p&gt;&#xD;
&lt;p&gt;事實上在win2003上的排程管理界面中，輸入ET是會被自動換算成DU的&lt;/p&gt;&#xD;
&lt;p&gt;因此這兩個其實是一個意思，表達方式不一樣罷了&lt;/p&gt;&#xD;
&lt;p&gt;不過一般情況下，我自己還是ET用得多，也方便&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;9.好了，在那些執行頻率很密集的排程，如每分鐘執行一次，但是某次的執行時間可能超過一分鐘，下次排程要不要啟動呢&lt;/p&gt;&#xD;
&lt;p&gt;如果不想啟動，那就&lt;/p&gt;&#xD;
&lt;p&gt;K:Kill&lt;/p&gt;&#xD;
&lt;p&gt;吧&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;10.討論了時間，我們再來討論日期吧&lt;/p&gt;&#xD;
&lt;p&gt;對于每天（每小時，每分鐘就不談了）來說，沒有具體的日期選擇，都是每天&lt;/p&gt;&#xD;
&lt;p&gt;而對于每周，就可以選擇星期幾執行&lt;/p&gt;&#xD;
&lt;p&gt;D:Days MON,TUE&amp;hellip;&lt;/p&gt;&#xD;
&lt;p&gt;用逗號可以設定多個&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;而每月，則可以選擇幾號執行&lt;/p&gt;&#xD;
&lt;p&gt;D:Days 1,2,5&amp;hellip;&lt;/p&gt;&#xD;
&lt;p&gt;哪些月執行&lt;/p&gt;&#xD;
&lt;p&gt;M:Months JAN,FEB&amp;hellip;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另外如果是每月執行&lt;/p&gt;&#xD;
&lt;p&gt;在這里有一個MO的特例(MO不表示每隔幾月執行)&lt;/p&gt;&#xD;
&lt;p&gt;MO可以設為first,second,last,lastday等&lt;/p&gt;&#xD;
&lt;p&gt;然後再在D中設定星期幾&lt;/p&gt;&#xD;
&lt;p&gt;表示在每月的第一個，第二個，最后一個星期幾，最后一天執行&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;11.好了，有了開始時間和結束時間&lt;/p&gt;&#xD;
&lt;p&gt;那開始日期和結束日期同樣存在&lt;/p&gt;&#xD;
&lt;p&gt;不管是每分，每小時&lt;/p&gt;&#xD;
&lt;p&gt;還是每日，每周，每月&lt;/p&gt;&#xD;
&lt;p&gt;都可以設定開始日期和結束日期&lt;/p&gt;&#xD;
&lt;p&gt;SD:Start Date(默認今天)&lt;/p&gt;&#xD;
&lt;p&gt;ED:End Date&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;12.強制建立&lt;/p&gt;&#xD;
&lt;p&gt;/F&lt;/p&gt;&#xD;
&lt;p&gt;當前Job名稱存在，則強行Update&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;除了上面所說的SC頻率外&lt;/p&gt;&#xD;
&lt;p&gt;還有以下SC類型&lt;/p&gt;&#xD;
&lt;p&gt;ONCE、ONSTART、ONLOGON，ONIDLE &lt;/p&gt;&#xD;
&lt;p&gt;一般在系統中用得比較少 &lt;/p&gt;&#xD;
&lt;p&gt;所以也沒有關注 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以通過 Schtasks /Create /? &lt;/p&gt;&#xD;
&lt;p&gt;來獲取全部信息 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;此外，對于非英文操作系統&lt;/p&gt;&#xD;
&lt;p&gt;如繁體中文操作系統&lt;/p&gt;&#xD;
&lt;p&gt;這個命令還非常變態&lt;/p&gt;&#xD;
&lt;p&gt;SC,M,D等選項居然使用當前語言&lt;/p&gt;&#xD;
&lt;p&gt;如每日,每週,每月&lt;/p&gt;&#xD;
&lt;p&gt;如星期一，星期二&lt;/p&gt;&#xD;
&lt;p&gt;如一月（這個一直沒有成功，我也不知道用什么代替Jan,Feb等)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;兩個示例如下：&lt;/p&gt;&#xD;
&lt;p&gt;強制建立排程test&lt;/p&gt;&#xD;
&lt;p&gt;每隔3分鐘執行1次xxx.exe，從早上7:00到晚上22:00&lt;/p&gt;&#xD;
&lt;p&gt;如果還在執行，則不執行&lt;/p&gt;&#xD;
&lt;p&gt;schtasks /create /tn test /f&lt;/p&gt;&#xD;
&lt;p&gt;/tr xxx.exe&lt;/p&gt;&#xD;
&lt;p&gt;/ru useracount /rp password&lt;/p&gt;&#xD;
&lt;p&gt;/sc dayly&lt;/p&gt;&#xD;
&lt;p&gt;/st 07:00&lt;/p&gt;&#xD;
&lt;p&gt;/et 22:00&lt;/p&gt;&#xD;
&lt;p&gt;/ri 3&lt;/p&gt;&#xD;
&lt;p&gt;/k&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;強制建立排程test&lt;/p&gt;&#xD;
&lt;p&gt;每年一月，三月的5號&lt;/p&gt;&#xD;
&lt;p&gt;從早上10:00開始，到晚上22:00結束，每隔5分鐘執行一次執行xxx.exe&lt;/p&gt;&#xD;
&lt;p&gt;如果還在執行，則不執行&lt;/p&gt;&#xD;
&lt;p&gt;schtasks /create /tn test /f&lt;/p&gt;&#xD;
&lt;p&gt;/tr xxx.exe&lt;/p&gt;&#xD;
&lt;p&gt;/ru useracount /rp password&lt;/p&gt;&#xD;
&lt;p&gt;/sc monthly&lt;/p&gt;&#xD;
&lt;p&gt;/m Jan,Mar&lt;/p&gt;&#xD;
&lt;p&gt;/d 5&lt;/p&gt;&#xD;
&lt;p&gt;/st 10:00&lt;/p&gt;&#xD;
&lt;p&gt;/et 22:00&lt;/p&gt;&#xD;
&lt;p&gt;/ri 5&lt;/p&gt;&#xD;
&lt;p&gt;/k&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/1909823.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2010/12/18/1909823.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tsoukw/archive/2010/11/23/1885746.html</id><title type="text">用Adobe ImageReady制作简单GIF动画</title><summary type="text">以前也玩过，但是好久不用，忘记了，这次记下来备忘 原理: 利用在Photoshop中先制作多图层的图片 然后再在ImageReady中通过加Frame，以及控制每个Frame的显示隐藏来制作动画  例...</summary><published>2010-11-23T10:18:00Z</published><updated>2010-11-23T10:18:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2010/11/23/1885746.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2010/11/23/1885746.html"/><content type="html">&lt;p&gt;以前也玩过，但是好久不用，忘记了，这次记下来备忘&lt;/p&gt;&#xD;
&lt;p&gt;原理:&lt;/p&gt;&#xD;
&lt;p&gt;利用在Photoshop中先制作多图层的图片&lt;/p&gt;&#xD;
&lt;p&gt;然后再在ImageReady中通过加Frame，以及控制每个Frame的显示隐藏来制作动画&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;例:制作一个简单的两桢GIF动画&lt;/p&gt;&#xD;
&lt;p&gt;1.Photoshop中做一个两层图片(都要显示，图层前的眼睛)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/AdobeImageReadyGIF_F27C/QQ%E6%88%AA%E5%9C%96%E6%9C%AA%E5%91%BD%E5%90%8D1_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="1" border="0" alt="1" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/AdobeImageReadyGIF_F27C/QQ%E6%88%AA%E5%9C%96%E6%9C%AA%E5%91%BD%E5%90%8D1_thumb.png" width="513" height="506" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;2.到ImageReady中去&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/AdobeImageReadyGIF_F27C/QQ%E6%88%AA%E5%9C%96%E6%9C%AA%E5%91%BD%E5%90%8D2_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="QQ截圖未命名2" border="0" alt="QQ截圖未命名2" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/AdobeImageReadyGIF_F27C/QQ%E6%88%AA%E5%9C%96%E6%9C%AA%E5%91%BD%E5%90%8D2_thumb.png" width="108" height="135" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.通过新建Frame等，完成动画过程(注意左下角的Forever，可以循环Frame)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/AdobeImageReadyGIF_F27C/QQ%E6%88%AA%E5%9C%96%E6%9C%AA%E5%91%BD%E5%90%8D3_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="QQ截圖未命名3" border="0" alt="QQ截圖未命名3" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/AdobeImageReadyGIF_F27C/QQ%E6%88%AA%E5%9C%96%E6%9C%AA%E5%91%BD%E5%90%8D3_thumb.png" width="700" height="439" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4.最后选择 File/Save Optimized As... 进行保存即可&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2011.1.28补录：&lt;/p&gt;&#xD;
&lt;p&gt;1.图片层必须在ps中全部设置为显示&lt;/p&gt;&#xD;
&lt;p&gt;2.预览应以optimized面板为准&lt;/p&gt;&#xD;
&lt;p&gt;3.如果实在不行，全部关闭再来一次&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/1885746.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2010/11/23/1885746.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tsoukw/archive/2010/10/20/1856497.html</id><title type="text">Console输出UTF-8</title><summary type="text">用控制台写一些简单的程式，是一个很不错的选择。 不过windows下的console，却输出不了utf-8格式的文字，通过网友和自己尝试，有以下方法  第一种 繁体操作系统，chcp为950 C#写的...</summary><published>2010-10-20T03:51:00Z</published><updated>2010-10-20T03:51:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2010/10/20/1856497.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2010/10/20/1856497.html"/><content type="html">&lt;p&gt;用控制台写一些简单的程式，是一个很不错的选择。&lt;/p&gt;&#xD;
&lt;p&gt;不过windows下的console，却输出不了utf-8格式的文字，通过网友和自己尝试，有以下方法&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第一种&lt;/p&gt;&#xD;
&lt;p&gt;繁体操作系统，chcp为950&lt;/p&gt;&#xD;
&lt;p&gt;C#写的Console程式运行起来时，显示不了简体字?Console.WriteLine（不过可以输入简体字Console.ReadLine)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_6.png"&gt;&lt;img height="128" width="487" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_2.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;找遍网络，发现了一种还算行的解决方法 &lt;/p&gt;&#xD;
&lt;p&gt;a.改变当前字符集为65001(utf8)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_8.png"&gt;&lt;img height="94" width="495" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_3.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;b.设定字型&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_10.png"&gt;&lt;img height="386" width="355" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_4.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;c.界面会乱掉，不过还是可以正常运行&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_12.png"&gt;&lt;img height="139" width="472" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_5.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;d.最小化一下cmd窗口，然后再回来，即可看得到已还原的正常界面&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_14.png"&gt;&lt;img height="137" width="473" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_6.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第二种&lt;/p&gt;&#xD;
&lt;p&gt;英文操作系统，chcp为437，直接chcp 950报错（原因不明）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_16.png"&gt;&lt;img height="108" width="482" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_7.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;chcp 65001，然后修改字体后也不行，显示一些方块&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.于是只好先改注册表，先改为950&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_18.png"&gt;&lt;img height="126" width="483" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_8.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_20.png"&gt;&lt;img height="71" width="525" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_9.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;2.重新打开cmd,chcp后发现是950&lt;/p&gt;&#xD;
&lt;p&gt;然后修改字体，这时候可以显示汉字了&lt;/p&gt;&#xD;
&lt;p&gt;然后再chcp 65001(记得一定是先修改console的font,然后再chcp)&lt;/p&gt;&#xD;
&lt;p&gt;这样就可以正常运行console的输出简体字和繁体字的程式了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_22.png"&gt;&lt;img height="262" width="419" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_10.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;好了，到此为止&lt;/p&gt;&#xD;
&lt;p&gt;下面再看一个没有作过任何修改的chcp950的cmd&lt;/p&gt;&#xD;
&lt;p&gt;发现dir命令可同时显示简繁体的文件名&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_2.png"&gt;&lt;img height="300" width="481" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;可type命令也显示含有简体字的文本文件内容，不过该文件必须以unicode格式存储，utf-8格式存储则会显示乱码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_4.png"&gt;&lt;img height="322" width="481" src="http://images.cnblogs.com/cnblogs_com/tsoukw/WindowsLiveWriter/ConsoleUTF8_74C3/image_thumb_1.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明控制台确实可以在不改变任何设定的情况下输出unicode字符，即同时显示简体和繁体&lt;/p&gt;&#xD;
&lt;p&gt;type,dir命令是如何调用标准输出的？&lt;/p&gt;&#xD;
&lt;p&gt;是一个疑问&lt;/p&gt;&#xD;
&lt;p&gt;留待以后有空研究，看是否可以让C#的Console.WriteLine也具备此项功能&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;附一些关于windows默认字符集的看法:&lt;/p&gt;&#xD;
&lt;p&gt;1.windows系统有一个默认字符集，也叫内码页，在windows中此格式叫做ansi字符集&lt;/p&gt;&#xD;
&lt;p&gt;ansi字符集在不同的操作系统中对应的字符集也不一样&lt;/p&gt;&#xD;
&lt;p&gt;如&lt;/p&gt;&#xD;
&lt;p&gt;936(GB2312)：简体操作系统&lt;/p&gt;&#xD;
&lt;p&gt;950(big5)：繁体操作系统&lt;/p&gt;&#xD;
&lt;p&gt;437：英文操作系统&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个字符集兼容ASCII&lt;/p&gt;&#xD;
&lt;p&gt;并且扩展部分采用双字节&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;因此unicode和utf8是不行的&lt;/p&gt;&#xD;
&lt;p&gt;前者一般是两字节显示，后者则可能有三字节显示&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;windows关于默认字符集的设定是在&lt;/p&gt;&#xD;
&lt;p&gt;控制面板--&amp;gt;地区及语言选项&amp;mdash;&amp;gt;Advanced--&amp;gt;选择非unicode的默认字符集(更改此选项，需要重启电脑)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;至于为什么需要一个这样的设定，全世界都用unicode不行吗？&lt;/p&gt;&#xD;
&lt;p&gt;可能是因为：&lt;/p&gt;&#xD;
&lt;p&gt;GB2312,Big5格式的文本文件，完全没办法区分&lt;/p&gt;&#xD;
&lt;p&gt;因此windows在碰到此类文件时，需要有一个选项说明用何种字符集来读，这就是默认的内码页&lt;/p&gt;&#xD;
&lt;p&gt;当然，瀏覽器解析html可以根据meta标签的charset来选用，而不用默认字符集&lt;/p&gt;&#xD;
&lt;p&gt;xml的第一行也可以说明charset是什么&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另外，如果是unicode（包括big endian）,utf-8则有标志，即文本文件的开头有一些特殊的字节，用以说明现在的文件是什么格式的&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.windows系统本身应该使用的是unicode&lt;/p&gt;&#xD;
&lt;p&gt;如资料夹名称，文件名称既可以使用简体，也可以使用繁体&lt;/p&gt;&#xD;
&lt;p&gt;还有就是你写的程式，如果有字符串变量，这个字符串变量在exe中是以unicode存储的&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;UCS = Unicode Character Set = Unicode&lt;/p&gt;&#xD;
&lt;p&gt;UCS-2:表示Unicode 16，即用2个字节表示，65536个字符&lt;/p&gt;&#xD;
&lt;p&gt;UCS-4:则是Unicode 32，4个字节的完整unicode&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2010.10.20 13:09 补录&lt;/p&gt;&#xD;
&lt;p&gt;如果是C#写的Console程式，并且要在windows排定的工作中运行，则需要设定以下键值&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/tsoukw/107571/r_job%e9%81%8b%e8%a1%8cconsole%e7%a8%8b%e5%bc%8f%e7%9a%84%e8%a8%ad%e5%ae%9a.png" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/1856497.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2010/10/20/1856497.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tsoukw/archive/2010/10/15/1852249.html</id><title type="text">JQuery1.4+ Ajax IE8 内存泄漏</title><summary type="text">将JQuery1.2.6升级到JQuery1.4，有几天下班没有关闭ajax轮询网页，第二天早上来，内存耗尽 发现此内存泄漏在IE6上不存在(IE7未测试),IE8上存在 并且JQuery1.3.2版...</summary><published>2010-10-15T07:17:00Z</published><updated>2010-10-15T07:17:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2010/10/15/1852249.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2010/10/15/1852249.html"/><content type="html">&lt;p&gt;将JQuery1.2.6升级到JQuery1.4，有几天下班没有关闭ajax轮询网页，第二天早上来，内存耗尽&lt;/p&gt; &lt;p&gt;发现此内存泄漏在IE6上不存在(IE7未测试),IE8上存在&lt;/p&gt; &lt;p&gt;并且JQuery1.3.2版本不存在，JQuery1.4+版本存在&lt;/p&gt; &lt;p&gt;通过对比，最终找到这两个版本的其中一个差别&lt;/p&gt; &lt;p&gt;JQuery1.4+在ajax方法增加了一段代码，用于在abort时调用onreadystatechange方法&lt;/p&gt; &lt;p&gt;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var oldAbort = xhr.abort;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.abort = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( xhr ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oldAbort.call( xhr );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;/p&gt;&lt;p&gt;onreadystatechange();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;} catch(e) { }  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;经查，正是此段赋值产生了错误 &lt;/p&gt;&lt;p&gt;onreadystatechange的readyState为4，即成功时，将xhr.abort销毁 &lt;/p&gt;&lt;p&gt;内存泄漏解决 &lt;/p&gt;&lt;p&gt;另：如果直接xhr.abort=null，不知道为什么在IE6下会报错 &lt;/p&gt;&lt;p&gt;只好try&amp;#8230;catch一下，反正IE6不修正错误与不会有问题 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;此项问题在IE8中有问题的原因不明 &lt;/p&gt;&lt;p&gt;可能是xhr.abort与oldAbort产生了一个闭包？ &lt;/p&gt;&lt;p&gt;但为什么IE6不泄漏？ &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;blog备查 2010.10.15&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/1852249.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2010/10/15/1852249.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836951.html</id><title type="text">权限设计的三层境界续</title><summary type="text">《闲话权限设计三层境界》以权限设计为例聊了一下我对系统设计的理解过程，不过有园友在评论中问到了权限设计一些具体细节，于是就又专门就某些问题说明了一下，并同时感谢大家的关注  # 2010-09-27 ...</summary><published>2010-09-27T08:30:00Z</published><updated>2010-09-27T08:30:00Z</updated><author><name>Kevin Zou</name><uri>http://www.cnblogs.com/tsoukw/</uri></author><link rel="alternate" href="http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836951.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836951.html"/><content type="html">&lt;p&gt;《闲话权限设计三层境界》以权限设计为例聊了一下我对系统设计的理解过程，不过有园友在评论中问到了权限设计一些具体细节，于是就又专门就某些问题说明了一下，并同时感谢大家的关注&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;# 2010-09-27 14:17 &lt;a href="http://home.cnblogs.com/124363/"&gt;&lt;b&gt;顾晓北&lt;/b&gt;&lt;/a&gt; &lt;a href="http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836485.html###"&gt;回复&lt;/a&gt; &lt;a href="http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836485.html###"&gt;引用&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836485.html#1925080"&gt;@&lt;/a&gt;Kevin Zou&lt;br /&gt;我刚想了一下，至少需要5个表吧（如果用关系数据库的话）？&lt;br /&gt;1，用户表；&lt;br /&gt;2，角色表；&lt;br /&gt;3，资源表；&lt;br /&gt;4，用户&amp;mdash;&amp;mdash;角色关系表；&lt;br /&gt;5，资源&amp;mdash;&amp;mdash;角色关系表； &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;答复：&lt;/p&gt;&#xD;
&lt;p&gt;权限设计过程中的用户表是不可见的，无足轻重的，只要提供一个用户ID给权限系统即可（那些把年龄，学历什么的纳入权限设计纯属扯淡）&lt;/p&gt;&#xD;
&lt;p&gt;以一个实际例子来说&lt;/p&gt;&#xD;
&lt;p&gt;ERP系统有一个用户系统，web中也有一个用户系统&lt;/p&gt;&#xD;
&lt;p&gt;但是为了避免用户记忆这么多账号，密码，因此我们的web系统同样认可ERP用户，接受ERP的用户登录，给ERP的用户进行授权。&lt;/p&gt;&#xD;
&lt;p&gt;而在权限资料表中，权限可能是这样记录的&lt;/p&gt;&#xD;
&lt;p&gt;UserID,ObjectID&lt;/p&gt;&#xD;
&lt;p&gt;-------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="mailto:sis@ERP"&gt;sis@ERP&lt;/a&gt;,查询产量&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --ERP用户系统中的sis用户&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="mailto:sis@ERP"&gt;sis@ERP&lt;/a&gt;,查询订单&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;850.00，管理用户&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --web系统的user id 850用户&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有这样的权限管控，只要认证过程够聪明，能够认证出&lt;a href="mailto:sis@ERP，850.00"&gt;sis@ERP，850.00&lt;/a&gt;这样的用户ID，&lt;/p&gt;&#xD;
&lt;p&gt;那权限管控过程对于是ERP用户还是web用户都是一样的处理，都是以用户ID和资源ID去找对应&lt;/p&gt;&#xD;
&lt;p&gt;至于&lt;a href="mailto:sis@ERP"&gt;sis@ERP&lt;/a&gt;到底是个什么东东，姓名是什么，Email是多少，可能只与设计权限分配的页面有关系，与权限管控真的无关&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;UserID除了可以表示人，它也可以是权限需求所要求的任何主体，如访问者机器的IP&lt;/p&gt;&#xD;
&lt;p&gt;如某系统只允许本厂的人查询，集团中其它公司不能查询&lt;/p&gt;&#xD;
&lt;p&gt;UserID,ObjectID&lt;/p&gt;&#xD;
&lt;p&gt;-------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;172.19,查询产量&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --本厂IP段&lt;/p&gt;&#xD;
&lt;p&gt;172.19,查询订单&lt;/p&gt;&#xD;
&lt;p&gt;172.17,查询电话&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --兄弟厂IP段&lt;/p&gt;&#xD;
&lt;p&gt;认证过程中，只要识别出了IP，就可调用相同的权限表示逻辑完成权限管控&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再举一个例子吧&lt;/p&gt;&#xD;
&lt;p&gt;我们的短信平台接收手机短信查询系统数据&lt;/p&gt;&#xD;
&lt;p&gt;如发送&lt;/p&gt;&#xD;
&lt;p&gt;0D01到1362585XXXX（我们的短信平台号码），则系统会自动将D01生产线现在的产量以短信方式回复&lt;/p&gt;&#xD;
&lt;p&gt;同样，也需要权限管控，要不然所有人都可以发送短信去询问产量了&lt;/p&gt;&#xD;
&lt;p&gt;UserID,ObjectID&lt;/p&gt;&#xD;
&lt;p&gt;-----------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;13638384438,产量查询&lt;/p&gt;&#xD;
&lt;p&gt;13558968888,订单查询&lt;/p&gt;&#xD;
&lt;p&gt;这时的权限主体就是手机号码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不过因为我们的系统同一个服务，可以用短信查询，也可以在web中查询，为了给User只分配一次权限（即短信平台和web系统共用一套权限）&lt;/p&gt;&#xD;
&lt;p&gt;则可以记录用户ID的手机号码&lt;/p&gt;&#xD;
&lt;p&gt;UserID,Phone&lt;/p&gt;&#xD;
&lt;p&gt;-----------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;850.00,13638384438&lt;/p&gt;&#xD;
&lt;p&gt;54.00,13558968888&lt;/p&gt;&#xD;
&lt;p&gt;然后在认证过程中将短信号码映射到UserID，剩下的事情也就与其它权限的管控是一样了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;举了这些例子，只想说明一件事情&lt;/p&gt;&#xD;
&lt;p&gt;权限只是一个工具&lt;/p&gt;&#xD;
&lt;p&gt;《三层境界中》说明了权限的本质是什么&lt;/p&gt;&#xD;
&lt;p&gt;权限表示可能可以抽象，但是权限管控的方法却不一定相同，只是过程却是类似，都是&lt;/p&gt;&#xD;
&lt;p&gt;---------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;a.识别出人 &lt;/p&gt;&#xD;
&lt;p&gt;b.识别出物 &lt;/p&gt;&#xD;
&lt;p&gt;c.调用HasPermission(人,物)判断权限 &lt;/p&gt;&#xD;
&lt;p&gt;d.实施管控策略 &lt;/p&gt;&#xD;
&lt;p&gt;--------------------------------------- &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;同样在InsertUser方法中，也是一个管控的过程，如用户只能新增自己部门的账号 &lt;/p&gt;&#xD;
&lt;p&gt;public void InsertUser(User user) &lt;/p&gt;&#xD;
&lt;p&gt;{ &lt;/p&gt;&#xD;
&lt;p&gt;string userID = AuthenticateSystem.UserID; &lt;/p&gt;&#xD;
&lt;p&gt;if(!RightTool.HasPermission(userID,user.Dept)) &lt;/p&gt;&#xD;
&lt;p&gt;throw new PermissionException("没有&amp;rdquo; + user.Dept + &amp;ldquo;的权限&amp;rdquo;); &lt;/p&gt;&#xD;
&lt;p&gt;&amp;hellip; //新增用户的具体代码 &lt;/p&gt;&#xD;
&lt;p&gt;} &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;同样，资源表的存在与否其实与权限管控也没有很大关系&lt;/p&gt;&#xD;
&lt;p&gt;很多权限管控，并没有资源表&lt;/p&gt;&#xD;
&lt;p&gt;如以URL为权限对象的管控，并不需要专门建一个URL表&lt;/p&gt;&#xD;
&lt;p&gt;以dll中某个类的某个方法，也不需要专门再建一个类方法表&lt;/p&gt;&#xD;
&lt;p&gt;权限认证过程只与识别资源有关，而与有没有资源表完全没有关系&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;所以最终就是&lt;/p&gt;&#xD;
&lt;p&gt;用户表，资源表在权限设计过程中是不必要存在的&lt;/p&gt;&lt;img src="http://www.cnblogs.com/tsoukw/aggbug/1836951.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836951.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
