??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美黑人猛交群,风间由美在线亚洲一区,亚洲妇女水蜜桃av网网站http://www.tkk7.com/deepnighttwo/zh-cnSun, 11 May 2025 06:06:57 GMTSun, 11 May 2025 06:06:57 GMT60OSGiQEquinoxQ类加蝲的问题——用ClassLoaderH破bundle的访问限?/title><link>http://www.tkk7.com/deepnighttwo/archive/2010/05/17/321158.html</link><dc:creator>深夜两点</dc:creator><author>深夜两点</author><pubDate>Mon, 17 May 2010 04:09:00 GMT</pubDate><guid>http://www.tkk7.com/deepnighttwo/archive/2010/05/17/321158.html</guid><wfw:comment>http://www.tkk7.com/deepnighttwo/comments/321158.html</wfw:comment><comments>http://www.tkk7.com/deepnighttwo/archive/2010/05/17/321158.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.tkk7.com/deepnighttwo/comments/commentRss/321158.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/deepnighttwo/services/trackbacks/321158.html</trackback:ping><description><![CDATA[<span style="color: navy;"><a href="/Files/deepnighttwo/example.zip"><span style="color: navy;">例子下蝲在此</span></a><br /> <br /> 最q搞了个实验,发现Eclipse 插g的类加蝲的一个问题。Eclipse使用<font style="background-color: rgb(253, 245, 193);">Equinox</font>实现OSGi的框Ӟ可以在插件的配置中确定哪些类expose出去Q哪些类不能为外部所见。我发现的问题是Q可以通过ClassLoaderl过q个限制Q在外部插g中加载到插g里那些不为外部所见的c,q且能够创徏cȝ实例Q可以通过反射调用其方法(当然Q如果被加蝲的类实现了某些接口,也可以通过接口的引用直接调用相应的Ҏ(gu)Q?br /> <br /> Z演示q个问题Q先在eclipse中创Z个插?font style="background-color: rgb(253, 245, 193);">UtilityLibrary</font>Q?br /> <img alt="" src="http://www.tkk7.com/images/blogjava_net/deepnighttwo/MWSnap005.gif" border="0" /><br /> 其中u<font style="background-color: rgb(253, 245, 193);">tilitylibrary.expose包中的类会暴露给外部Q而utilitylibrary.hide包中的类不会暴露l外部。在MANIFEST.MF中增加这个设|:<br /> <img alt="" src="http://www.tkk7.com/images/blogjava_net/deepnighttwo/MWSnap006.gif" border="0" /><br /> </font><br /> <font style="background-color: rgb(253, 245, 193);">VisiableClass</font>?font style="background-color: rgb(253, 245, 193);">VisiableClass</font>cȝ内容很简单:<br /> <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); width: 98%; font-size: 13px;"><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> utilitylibrary.expose;<br /> <br /> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> VisiableClass {<br />     </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> VisiableClass() {<br />         System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">This is VisiableClass</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />     }<br /> <br />     </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> String getMessage() {<br />         </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">From VisiableClass:\r\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />                 </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.getClass().getClassLoader().toString() </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">\t</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />     }<br /> }<br /> </span></div> <br /> <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); width: 98%; font-size: 13px;"><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> utilitylibrary.hide;<br /> <br /> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> InvisiableClass {<br />     </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> InvisiableClass() {<br />         System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">InvisiableClass</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />     }<br /> <br />     </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> String getMessage() {<br />         </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">From InvisiableClass:\r\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />                 </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.getClass().getClassLoader().toString() </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">\t</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />     }<br /> }<br /> </span></div> <br /> <br /> 其实主要是打印出相应的信息。类代码几乎是一L(fng)?br /> <br /> 下面创徏另一个插件UsePluginQ依赖ƈ使用UtilityLibrary中的cR插件其实就是Eclipse自带的Hello WorldE序Q它会在eclipse 的toolbar上增加一个按钮,点击后会弹出一个MessageBox。好QMessageBox上显C的是从UtilityLibrary中类的方法的q回倹{首先增加插件依赖关p:<br /> <img alt="" src="http://www.tkk7.com/images/blogjava_net/deepnighttwo/MWSnap007.gif" border="0" /><br /> <br /> 在SampleAction中的RunҎ(gu)里,如果直接使用InvisiableClassQ插件完全找不到q个c,修改里面exposeq个c:<br /> <img alt="" src="http://www.tkk7.com/images/blogjava_net/deepnighttwo/MWSnap008.gif" border="0" /><br /> <br /> 当然Q用VisiableClass是没问题的。下面通过VisiableClass来将InvisiableClass拽出来,SampleActioncȝ源代码如下,只要兛_runҎ(gu)可以了Q?br /> <br /> <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); width: 98%; font-size: 13px;"><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> useplugin.actions;<br /> <br /> </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.lang.reflect.InvocationTargetException;<br /> </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.lang.reflect.Method;<br /> <br /> </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.eclipse.jface.action.IAction;<br /> </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.eclipse.jface.dialogs.MessageDialog;<br /> </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.eclipse.jface.viewers.ISelection;<br /> </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.eclipse.ui.IWorkbenchWindow;<br /> </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.eclipse.ui.IWorkbenchWindowActionDelegate;<br /> <br /> </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> utilitylibrary.expose.VisiableClass;<br /> <br /> </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />  * Our sample action implements workbench action delegate. The action proxy will<br />  * be created by the workbench and shown in the UI. When the user tries to use<br />  * the action, this delegate will be created and execution will be delegated to<br />  * it.<br />  * <br />  * </span><span style="color: rgb(128, 128, 128);">@see</span><span style="color: rgb(0, 128, 0);"> IWorkbenchWindowActionDelegate<br />  </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> SampleAction </span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);"> IWorkbenchWindowActionDelegate {<br />     </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> IWorkbenchWindow window;<br /> <br />     </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />      * The constructor.<br />      </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> SampleAction() {<br />     }<br /> <br />     </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />      * The action has been activated. The argument of the method represents the<br />      * 'real' action sitting in the workbench UI.<br />      * <br />      * </span><span style="color: rgb(128, 128, 128);">@see</span><span style="color: rgb(0, 128, 0);"> IWorkbenchWindowActionDelegate#run<br />      </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> run(IAction action) {<br />         </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />             Class</span><span style="color: rgb(0, 0, 0);"><?></span><span style="color: rgb(0, 0, 0);"> clazz </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> VisiableClass.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">.getClassLoader().loadClass(<br />                     </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">utilitylibrary.hide.InvisiableClass</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />             Object obj </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> clazz.newInstance();<br />             Method method </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> clazz.getMethod(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">getMessage</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />             Object ret </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> method.invoke(obj, </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Object[] {});<br />             System.out.println(ret);<br />             MessageDialog.openInformation(window.getShell(), </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">UsePlugin</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, ret<br />                     .toString());<br />         } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (ClassNotFoundException e) {<br />             </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> TODO Auto-generated catch block</span><span style="color: rgb(0, 128, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">            e.printStackTrace();<br />         } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (InstantiationException e) {<br />             </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> TODO Auto-generated catch block</span><span style="color: rgb(0, 128, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">            e.printStackTrace();<br />         } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (IllegalAccessException e) {<br />             </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> TODO Auto-generated catch block</span><span style="color: rgb(0, 128, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">            e.printStackTrace();<br />         } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (SecurityException e) {<br />             </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> TODO Auto-generated catch block</span><span style="color: rgb(0, 128, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">            e.printStackTrace();<br />         } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (NoSuchMethodException e) {<br />             </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> TODO Auto-generated catch block</span><span style="color: rgb(0, 128, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">            e.printStackTrace();<br />         } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (IllegalArgumentException e) {<br />             </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> TODO Auto-generated catch block</span><span style="color: rgb(0, 128, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">            e.printStackTrace();<br />         } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (InvocationTargetException e) {<br />             </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> TODO Auto-generated catch block</span><span style="color: rgb(0, 128, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">            e.printStackTrace();<br />         }<br /> <br />     }<br /> <br />     </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />      * Selection in the workbench has been changed. We can change the state of<br />      * the 'real' action here if we want, but this can only happen after the<br />      * delegate has been created.<br />      * <br />      * </span><span style="color: rgb(128, 128, 128);">@see</span><span style="color: rgb(0, 128, 0);"> IWorkbenchWindowActionDelegate#selectionChanged<br />      </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> selectionChanged(IAction action, ISelection selection) {<br />     }<br /> <br />     </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />      * We can use this method to dispose of any system resources we previously<br />      * allocated.<br />      * <br />      * </span><span style="color: rgb(128, 128, 128);">@see</span><span style="color: rgb(0, 128, 0);"> IWorkbenchWindowActionDelegate#dispose<br />      </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> dispose() {<br />     }<br /> <br />     </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />      * We will cache window object in order to be able to provide parent shell<br />      * for the message dialog.<br />      * <br />      * </span><span style="color: rgb(128, 128, 128);">@see</span><span style="color: rgb(0, 128, 0);"> IWorkbenchWindowActionDelegate#init<br />      </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> init(IWorkbenchWindow window) {<br />         </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.window </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> window;<br />     }<br /> }</span></div> <br /> <br /> 在runҎ(gu)里面Q直接用VisiableClass.class.getClassLoader().loadClass("utilitylibrary.hide.InvisiableClass");来加载本不应该被外部所见的InvisiablecR因为在Eclipse中,每个插g使用一个ClassLoaderQ所以用来加载VisiableClasscȝClassLoader也同栯责加载在同一个插件中的InvisiableClasscR这样InvisiableClass在插g外部被加载成功了。类加蝲成功后,剩下的事情就是顺水推舟了Q创Z实例然后使用反射调用相应的方法?br /> E序q行的时候,点击toolbar上那个buttonQ会弹出如下对话框:<br /> <img alt="" src="http://www.tkk7.com/images/blogjava_net/deepnighttwo/MWSnap009.gif" border="0" /><br /> <br /> E序q行也没啥错误?br /> <br /> <br /> 问题分析Q?br /> 其实我觉得这个问题是很难l过ȝ。对于同一个插Ӟ因ؓ内部的类需要互相引用和互相使用Q所以必M用同一个类加蝲器来加蝲。所以,q个插g只要expose出来一个包Q那么外部的插g可以通过包中的Q何一个类来得到加载这个插件中的类的类加蝲器,然后可以通过reflect爱做啥做啥了?br /> <br /> 换一个角度可能更好理解这个问题ؓ什么难以绕q去。假设VisiableClass需要用到InvisiableClassQ虽然InvisiableClass没有暴露出来Q但是在正常的用VisiableClass的时候,需要先加蝲VisiableClassc,而加载VisiableClass的时候JVM׃隐式的加载InvisiableClass。这个过E和例子里现式的加蝲InvisiableClass没啥本质不同。也是_从ClassLoader的角度,很难判断一个类的加载是正常的代码还是ؓ了突破bundle的访问限制——它们都是在执行runҎ(gu)时发生的cd载行为?br /> <br /> 或者是我有什么地Ҏ(gu)讄好?求解{?span style="color: navy;"><a href="/Files/deepnighttwo/example.zip"><span style="color: navy;">例子下蝲在此</span></a>?/span> </span> <img src ="http://www.tkk7.com/deepnighttwo/aggbug/321158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/deepnighttwo/" target="_blank">深夜两点</a> 2010-05-17 12:09 <a href="http://www.tkk7.com/deepnighttwo/archive/2010/05/17/321158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的书出版了http://www.tkk7.com/deepnighttwo/archive/2010/04/27/319523.html深夜两点深夜两点Tue, 27 Apr 2010 12:47:00 GMThttp://www.tkk7.com/deepnighttwo/archive/2010/04/27/319523.htmlhttp://www.tkk7.com/deepnighttwo/comments/319523.htmlhttp://www.tkk7.com/deepnighttwo/archive/2010/04/27/319523.html#Feedback1http://www.tkk7.com/deepnighttwo/comments/commentRss/319523.htmlhttp://www.tkk7.com/deepnighttwo/services/trackbacks/319523.html宅能量终于爆发了Q书l于出版了。China Pub有售http://www.china-pub.com/196571



深夜两点 2010-04-27 20:47 发表评论
]]>
U程模型设计http://www.tkk7.com/deepnighttwo/archive/2010/04/26/319401.html深夜两点深夜两点Mon, 26 Apr 2010 08:33:00 GMThttp://www.tkk7.com/deepnighttwo/archive/2010/04/26/319401.htmlhttp://www.tkk7.com/deepnighttwo/comments/319401.htmlhttp://www.tkk7.com/deepnighttwo/archive/2010/04/26/319401.html#Feedback0http://www.tkk7.com/deepnighttwo/comments/commentRss/319401.htmlhttp://www.tkk7.com/deepnighttwo/services/trackbacks/319401.html在设计一个多U程E序的时候,首先要考虑好线E模型是怎样的。设计线E模型的时候可以有多个考虑Q比如用线E池Q用多个线E处理Q务,或者用类似AWT/Swing中事件处理机刉P使用单个U程处理同一cȝd?/span>


深夜两点 2010-04-26 16:33 发表评论
]]>
Java之父dOraclehttp://www.tkk7.com/deepnighttwo/archive/2010/04/11/317984.html深夜两点深夜两点Sun, 11 Apr 2010 03:21:00 GMThttp://www.tkk7.com/deepnighttwo/archive/2010/04/11/317984.htmlhttp://www.tkk7.com/deepnighttwo/comments/317984.htmlhttp://www.tkk7.com/deepnighttwo/archive/2010/04/11/317984.html#Feedback0http://www.tkk7.com/deepnighttwo/comments/commentRss/317984.htmlhttp://www.tkk7.com/deepnighttwo/services/trackbacks/317984.html

深夜两点 2010-04-11 11:21 发表评论
]]>
玩一下技术宅Q数学之——Julia Set分Şhttp://www.tkk7.com/deepnighttwo/archive/2010/03/20/316023.html深夜两点深夜两点Sat, 20 Mar 2010 09:25:00 GMThttp://www.tkk7.com/deepnighttwo/archive/2010/03/20/316023.htmlhttp://www.tkk7.com/deepnighttwo/comments/316023.htmlhttp://www.tkk7.com/deepnighttwo/archive/2010/03/20/316023.html#Feedback2http://www.tkk7.com/deepnighttwo/comments/commentRss/316023.htmlhttp://www.tkk7.com/deepnighttwo/services/trackbacks/316023.html 自己写的一个小E序Q做个视频冒充一下技术宅……


E序l多ơ优化,l于能够辑ֈ一个可以接受的性能?#8230;…莫言Java无效率,其实重要的还是要_Nl琢。至 就l制Julia Set而言Q我q个E序比我见过的几个cpp版本的要快的多?
目主页地址Q?a >http://code.google.com/p/juliasetcreator/
E序下蝲地址Q?a >http://code.google.com/p/juliasetcreator/downloads/list?

深夜两点 2010-03-20 17:25 发表评论
]]>
【ZT】[译文]E序员能力矩?Programmer Competency Matrixhttp://www.tkk7.com/deepnighttwo/archive/2010/03/14/315411.html深夜两点深夜两点Sun, 14 Mar 2010 15:35:00 GMThttp://www.tkk7.com/deepnighttwo/archive/2010/03/14/315411.htmlhttp://www.tkk7.com/deepnighttwo/comments/315411.htmlhttp://www.tkk7.com/deepnighttwo/archive/2010/03/14/315411.html#Feedback0http://www.tkk7.com/deepnighttwo/comments/commentRss/315411.htmlhttp://www.tkk7.com/deepnighttwo/services/trackbacks/315411.html

[译文]E序员能力矩?Programmer Competency Matrix

注意:每个层次的知识都是渐增的Q位于层?em>nQ也蕴涵了你需了解所有低于层?em>n? 知识?
计算机科?Computer Science
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
数据l构 不知道数l和链表的差? 能够解释和用数l, 链表Q字典等Qƈ且能够用于实际的~程d?/td> 了解基本数据l构旉和空间的折中Q比如数lvs 链表Q能够解释如何实现哈希表和处理冲H,了解优先队列及其实现? 高等的数据结构的知识Q比如B-?wi)、二堆、斐波那契堆、AVL ?wi)、红黑树(wi)、展树(wi)、蟩跃表以及前缀?wi)等?/td>
不能够找Z个数l各数的q_?qo人难以置信,但是我的在应聘? 中遇到过) 基本的排序,搜烦和数据的遍历和检索算法?/td> ?wi),图,单的贪婪法和分而治之算法,能够适度了解矩阵? 层的含义?/td> 能够辨识和编写动态规划方案,良好的图法知识Q良好的数g的知识Q能够L别NP问题{? Working with someone who has a good topcoder ranking would be an unbelievable piece of luck!
~程体系 不知道何为编译器、链接器和解释器? 对编? 器、链接器、解释器有基本的了解。知道什么是汇编代码以及在硬件层如何工作。有一些虚拟内存和分页知识? 了解内核模式vs用户模式, 多线E,同步原语以及它们如何实现Q能够阅L~代码。了解网l如何工作,了解|络协议和socketU别~程? 了解整个E序堆栈? g(CPU+内存+中断+微码)、二q制代码、汇~、静态和动态链接、编码、解释、JITQjust-in-timeQ编译、内存碎片回收、堆、栈、存 储器~址…
软g工程 Software Engineering
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
源码版本控制 通过日期备䆾文g? VSS和初U的 CVS/SVN用户 熟练C用CVS和SVNҎ(gu)。知道如何分支和归ƈQ用程序库补丁安装Ҏ(gu)等 有分布式VCS pȝ的知识。尝试过Bzr/Mercurial/Darcs/Git
自动化编?/td> 只知道在IDE下编? 知道如何~译在命令行 下编译系l? 能够安装一个脚本构建基本的pȝ 能够安装一个脚本来构徏pȝq且归档Q安装程序,生成发布记录和给? 码控制中的代码分配标{?/td>
自动化测?/td> 认ؓ所有的试都是试员的工作? 能够~写 自动化的单元试Q能够ؓ正在~写的代码提好的试用例? 按照TDD QTest Driven DevelopmentQ方式编写代码?/td> 了解q且能够有效自动化安装,载入/性能和UI试
E序设计 Programming
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
问题分解 只有直线式的代码Q通过复制_脓(chung)来复? 能够? 问题分散到多个函C 能够惛_可复用的函数/对象来解军_题的问题 使用适宜的数据结构和法Q写出通用?面向 对象的代码来装问题的易改变的层面?/td>
pȝ分解 N想不出比单一的文?cL好的层面 如果不在 同一q_或没采用相同的技术,能够把问题空间和设计Ҏ(gu)分解? 能够设计跨技?q_的系l? 能够在多个品线? 与外部体pM体化中虚拟化和设计复制的pȝ。同时也能够设计支持pȝ监视、报告、故障恢复等?/td>
交流 不能向同伴表达想?L。匮乏拼写和语法的能力? ? 伴能了解你在说什么。有良好的拼写和语法能力? 能够和同伴进行高效的交流 能够使用清晰的方式了解和交流x/设计 /L/l则Q能适应每种环境的交? This is an often under rated but very critical criteria for judging a programmer. With the increase in outsourcing of programming tasks to places where English is not the native tongue this issue has become more prominent. I know of several projects that failed because the programmers could not understand what the intent of the communication was.
同一文g中代码组l?/td> 同一文g中组l没有依? 按照逻辑 性或者易接近的方? 代码分块和对于其他源文g来说是易于是?引用其他源文件时有良好的注释 文档头部有许可声 明,ȝQ良好的注释Q一致的I格~进。文档外观美观?/td>
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
跨文件代码组l?/td> 没够惌l代码跨文gl织 相关文g按文? 夹分l? 每个物理文g都有独立的目的,比如一个类的定义,一个特性的实现{? 代码在物理层l织紧密Q在文g名上? 设计和外观相匚wQ可以通过文g分布方式z察设计理念?/td>
源码?wi)组l?/td> 一切都攑֜一个文件夹? 初步地将代码分散q? 对应逻辑的文件夹? 没有循环依赖Q二q制文gQ库Q文,构徏Q第三方的代码都l织q合适的文g夹内? 源码?wi)? 物理布局与逻辑层次、组l方式相匚w。可以通过目录名称和组l方式洞察设计理c? The difference between this and the previous item is in the scale of organization, source tree organization relates to the entire set of artifacts that define the system.
代码可读?/td> 单音节的名称 Q在国内应该是那些类似用汉语拼音命名的习(fn)惯) Ҏ(gu)件、变量、类、方法等Q有良好的命名? 没有长函数、注释解释不常规的代码,bug修复,代码假设? ? 码假N证用断aQ自然的代码,没有深层嵌套的条件和Ҏ(gu)
防M性编?/td> 不知道这个概?/td> 查代码中所有的参数Q对关键 的假设进行断a 保查了q回值和使代码失败的异常? 有自q库来帮助防M性编E、编写单元测试模拟故?/td>
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
错误处理 只给乐观的情形编? 基本的代码错误处理,抛出 异常/生成错误 保错误/异常留在E序中有良好的状态,资源Q连接,内存都有被合适的清理? 在编码之前察觉可? 出现的异常,在代码的所有层ơ中l持一致性的异常处理{略Q提出整个系l的错误处理准则?/td>
IDE IDE大部分用来进行文本编? 了解其周围的? 口,能够高效地通过菜单来用IDE 了解最常操作的键盘快捷? ~写自定义宏
API 需要频J地查阅文 把最频繁使用的API记在? 子里 qK且深入的API知识? Z使实际Q务中常用API使用更加便捷Q编写过API的上层库Q填补API之间 的缺口? E.g. of API can be Java library, .net framework or the custom API for the application
框架 没有使用q主q_外的M框架 听过但没用过q_? 行的可用框?/td> 在专业的职位中用过一个以上的框架Q通晓各框架的特色?/td> 某框架的作?/td>
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
需求分?/td> 接受l定的需求和代码规格 能对规格的遗漏提? 疑问 了解全面情况Q提出需要被规格化的整体范围?/td> 能够提出更好的可选方案,Ҏ(gu)l验的Q现给出需?/td>
脚本 不具备脚本工L(fng)知识 批处理文?shell脚本 Perl/Python/Ruby/VBScript/Powershell 写过q且发表q可重用的代?/td>
数据?/td> 认ؓExcel是数据? 知道基本的数据库? 念,规范化、ACIDQ原子性Atomicity、一致性Consistency、隔LIsolation、持久性DurabilityQ、事务化Q能 够写单的select语句 能够牢记在运行时必要查询中设计良好的规范化数据库模式Q? _N用戯图,存储q程Q触发器和用户定义类型。知道聚集与非聚集烦引之间的差异。精通用ORMQObject Relational Mapping对象关系映射Q工? 能做基本的数据库理Q性能优化Q烦引优化,~写高的select查询Q能够用相关sql来替 换游标,理解数据内部的存储,了解如何镜像、复制数据库。知道两D|据提交如何工?/td>
l验 Experience
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
专业语言l验 命o式语a和面向对象语a 命o式语a,面向对象语言和说明型语言(SQL),如果了解静态类型vs动态类型,q型vs强类型则有加? 函数式语a,如果了解? ~求|局部套用函敎ͼ延箋则有加分 q发语言(Erlang, Oz) 逻辑语言(Prolog)
专业q_l验 1 2-3 4-5 6+
专业l验q龄 1 2-5 6-9 10+
领域知识 没有该领域的知识 在该领域中曾l至ؓ一? 产品工作q?/td> 在同一领域中ؓ多个产品工作q? 领域专家。在该领域设计和实现数种产品/Ҏ(gu)。精通该领域使用的标准条? 和协?/td>
学识 Knowledge
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
工具知识 仅限于主要的IDE(VS.Net, Eclipse{? ? 道一些流行和标准工具的备选方? 对编辑器、调试器、IDE、开源的备选方案有很好的了解。比如某Z解大多数Scott Hanselman的威力工具列表中的工P使用qORM工具?/td> 实际地编写过工具和脚本,如果q些被发布则有加?/td>
语言接触 命o式语a和面向对象语a 命o式语a、面向对? 语言和说明型语言(SQL),如果了解静态类型vs动态类型、弱cdvs强类型则有加? 函数式语a,如果了解延缓求倹{局部套用函 数、continuations Q源于scheme中的一U高U控制结构)则有加分 q发语言(Erlang, Oz) 逻辑语言(Prolog)
代码库知?/td> 从来没有查询q代码库 基本的代码层知识Q了 解如果构建系l? 良好的代码库工作知识Q实现过几次bug修复或者完成了一些细的Ҏ(gu)? 实现了代码库中多个大型特 性,能够L地将多数Ҏ(gu)的需求变更具体化Q从容地处理bug修复?/td>
下一代技术知?/td> 从来没听说过卛_到来的技? 听说q某? 域即到来的技? 下蝲qalpha preview/CTP/beta版本Qƈ且读q一些文章和手册 试用q预? 版而且实际地构某物Q如果共享给其他人的话则有加?/td>
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
q_内部 对^台内部毫无所? 有^台基本的内部工作? 知识 深度的^台内部知识,能够设想q_如何程序{换成可执行代码? ~写q增强^台或者ؓ其^台内部提供信息的 工具。比如,反汇~工P反编译工P调试工具{?/td>
书籍 菜鸟pdQ?1天系列,24时pdQ蠢货系?.. 《代 码大全》,《别让我思考? 《精通正则表辑ּ? 《设计模式》,《h件》,《代码珠玑》,《算法设计手册》,《程序员修炼之道》, 《h月神话? 《计机E序设计与解释》,《事务处?概念与技术》,《计机E序设计模型》,《计机E序设计艺术》,《数据库pȝ D?C.J Date版,《Thinking Forth?Q《Little Schemer》(没找到其中译本)
博客 听过但是从来抽不出空L? 阅读一些科技/~程 /软g工程的博客,q且l常的收听一些播?/td> l护一些博客的链接Q收集博d享的有用的文章和工具 l护一个在~程? 面,分n有个解和思考的博客
Creative Commons License
E序员能力矩?/span> by XGuru is licensed under a Creative Commons |名-非商业性?相同方式׃n 2.5 中国大陆 License. 原文L(fng) q? ?/a>?br /> Thanks to bearice for debugging.
Thanks to
John Haugeland for a reformatting of it that works much more nicely on the web.



深夜两点 2010-03-14 23:35 发表评论
]]>
[ZT]E序员的相关W话http://www.tkk7.com/deepnighttwo/archive/2009/12/07/304965.html深夜两点深夜两点Mon, 07 Dec 2009 02:24:00 GMThttp://www.tkk7.com/deepnighttwo/archive/2009/12/07/304965.htmlhttp://www.tkk7.com/deepnighttwo/comments/304965.htmlhttp://www.tkk7.com/deepnighttwo/archive/2009/12/07/304965.html#Feedback0http://www.tkk7.com/deepnighttwo/comments/commentRss/304965.htmlhttp://www.tkk7.com/deepnighttwo/services/trackbacks/304965.htmlQ{?a >http://coolshell.cn/?p=1903Q?/strong>

问答

QQ你是怎么区分一个内向的E序员和一个外向的E序员的Q?br /> AQ外向的E序员会看着你的鞋和你说话时?/p>

QQؓ什么程序员不能区分万圣节和圣诞节?
AQ这是因为Oct 31 == Dec 25Q(八进制的31==十进制的25Q?/p>

刹Rq

有一个物理学Ӟ工程师和一个程序员N着一辆汽车行驶在阿尔卑斯p上,在下q时候,忽然Q汽车的刹Rq了,汽R无法控制地向下冲去,眼看? 面就是一个?zhn)崖峭壁,但是很幸q的是在q个(zhn)崖的前面有一些小?wi)让他们的汽车停了下来,而没有掉下山厅R三个惊未定地从R里爬了出来?/p>

物理学家_“我觉得我们应该徏立一个模型来模拟在下车过E中刹R片在高温情况下失늚情Ş”?/p>

工程师说Q?#8220;我在车的后备厢来有个xQ要不我们把车拆开看看到底是什么原?#8221;?/p>

E序员说Q?#8220;Z么我们不再找相同的R再来一ơ以重现q个问题呢?”

关于~程语言

如果C++是一把锤子的话,那么~程׃变成大手指头?/p>

如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一DJavaE序Q而其余的只会敲出PerlE序?/p>

一阉|促的敲门声Q?#8220;谁啊Q?#8221;Q过?分钟Q门外传?#8220;Java”?/p>

如果说Java很不错是因ؓ它可以运行在所有的操作pȝ上,那么可以说肛交很不错,因ؓ其可以用于所有的性别上?/p>

自行?/h4>

一个程序员骑着一个很漂亮的自行RC公司Q另一个程序员看到了他Q问刎ͼ“你是从哪搞到的这么漂亮的车的Q?#8221;

骑R的那个程序员_“我刚从那边过来,有一个漂亮的姑娘骑着q个车过来,q停在我跟前Q把服全脱了,然后Ҏ(gu)_‘你想要什么都可以’”?/p>

另一个程序员马上说到Q?#8220;你绝对做了一个正的选择Q因为那姑娘的衣服你q不一定穿得了”?/p>

火R

一个年ȝE序员和一个项目经理登上了一列在山里行驶的火车,他们发现列R上几乎都坐满了,只有两个在一L(fng)IZQ这个空位的寚w是一个老奶奶和一 个年L亮的姑娘。两个上前坐了下来。程序员和那个姑娘他们比较暧昧地怺看对斏V这Ӟ火Rq入山洞QR厢里一片漆黑。此Ӟ只听见一个亲嘴的声音Q随 后就听到一个响亮的巴掌声。很快火车出了山z,他们四个人都不说话?/p>

那个老奶奶在喃喃道,“q个q轻伙怎么q么无礼Q不q我很高兴我的孙x了一个巴?#8221;?/p>

目l理在想Q?#8220;没想到这个程序员居然q么大胆Q敢M那姑娘,只可惜那姑娘打错了hQ居然给打了我?#8221;

漂亮的姑娘想Q?#8220;他亲了我真好Q希望我的祖母没有打g”?/p>

E序员坐在那里露ZW容Q?#8220;生活真好啊。这一辈子能有几次Z可以在亲一个美女的同时打项目经理一巴掌?#8221;

问\

有一个驾驶热气球的h发现他迷路了。他降低了飞行的高度Qƈ认出了地面上的一个h。他l箋下降高度q对着那个人大叫,“打扰一下,你能告诉我我在哪吗?”

下面那个Q?#8220;是的。你在热气球里啊Q盘旋在30英尺的空?#8221;?/p>

热气球上的h_“你一定是在IT部门做技术工?#8221;?/p>

“没错”Q地面上的h说到Q?#8220;你是怎么知道的?”

“呵呵”Q热气球上的Q?#8220;你告诉我的每件事在技术上都是对的Q但寚w没有?#8221;?/p>

地面上的Q?#8220;你一定是理层的?#8221;?/p>

“没错”Q热气球上的Q?#8220;可是你是怎么知道的?”

“呵呵”Q地面上的那刎ͼ“你不知道你在哪里Q你也不知道你要dQ你d望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我错了”?/p>

警告

有一个小伙子在一个办公大楼的门口抽着烟,一个妇奌\q他w边Qƈ对他_“你知道不知道q个东西会危害你的健P我是_你有没有注意到香烟盒上的那个警告QWarningQ?”

伙子说Q?#8220;没事儿,我是一个程序员”?/p>

那妇奌Q?#8220;q又怎样Q?#8221;

E序员说Q?#8220;我们从来不关心WarningQ只兛_Error”



深夜两点 2009-12-07 10:24 发表评论
]]>
【zt】开发h员进阶读书指?/title><link>http://www.tkk7.com/deepnighttwo/archive/2009/12/05/304881.html</link><dc:creator>深夜两点</dc:creator><author>深夜两点</author><pubDate>Sat, 05 Dec 2009 13:48:00 GMT</pubDate><guid>http://www.tkk7.com/deepnighttwo/archive/2009/12/05/304881.html</guid><wfw:comment>http://www.tkk7.com/deepnighttwo/comments/304881.html</wfw:comment><comments>http://www.tkk7.com/deepnighttwo/archive/2009/12/05/304881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/deepnighttwo/comments/commentRss/304881.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/deepnighttwo/services/trackbacks/304881.html</trackback:ping><description><![CDATA[Qhttp://www.yeeyan.com/articles/view/115732/71484Q?br /> <br /> <div id="i8gooqe" class="content_topp"> 阅读软g开发相关书c,是程序员在技能和职业上ؓ自己投资的好办法。但是,需要阅读那些书Q应该按照什么顺序来q行Q这份书单适合那些刚刚开始,一心想要提高自q~程能力Q想要以E序员ؓ职业的h? <div><br /> </div> <div> <p><span>我之前曾_阅读<span id="ec6as2o" class="Apple-style-span" style="background-color: #ffffff;">软g开?/span>有关的书c,是在你技能和事业上投资的好办法?/span> <span>但是哪些应该阅读呢?</span><span>而且该按照什么顺序阅dQ?/span> <span>我已l编制了一份书单,我认为它能真正大q提高你的能力?/span> <span>我已l安排好它们的顺序,分ؓ3个阶D,<span>我相信这U顺序是最有成效的。这份书?/span><span>主要是ؓ那些刚刚h的开发h员编写的Q当然专业的开发者也可参照,它对周围那些惌得提高的人来说都是相当有用的?/span></span></p> <p><span>首先Q你应该x的是提高书写q净Q毫不含p的Q可l护代码的能力?/span> <span>下列书籍应该大大有助于?zhn)Q?/span></p> <p style="text-align: center;"><img src="http://www.techcn.com.cn/uploads/200911/1259507849cYMQs5Bz.jpg" height="648" width="517" alt="" /></p> <ol> <li><span><a $ included="null">试驱动开发(肯特·贝克Q?/a></span> </li> <li><span><a $ included="null">重构Q马?#183;勒Q?/a></span> </li> <li><span><a $ included="null">实现模式Q肯?#183;贝克Q?/a></span> </li> <li><span><a $ included="null">代码大全Q第二版Q史蒂夫·麦康奈尔Q?/a></span> </li> <li><span><a $ included="null">Working Effectively With Legacy Code</a><a $ included="null">Q?/a><a $ included="null">Michael Feathers</a>Q?/span> </li> <li><span><a $ included="null">Clean Code (Robert C. Martin)</a></span> </li> </ol> <p><span>上述的读书顺序可能有些人感到惊Ӟ但我敢打赌,q是最有效的阅读顺序?/span></p> <p><span>当你学会了如何书写伟大的代码Q你应该开始以z的设计和架构ؓ重点?/span> <span>qƈ不是_你应该只集中于设计和架构Q但你越了解它,你会变得好Q?/span></p> <p style="text-align: center;"><img src="http://www.techcn.com.cn/uploads/200911/12595078495pSxH5ts.png" alt="" /></p> <ol> <li><span><a $ included="null">设计模式Q?/a><a $ included="null">Gang Of Four</a>Q?/span> <a $ included="null"><br /> </a></li> <li><span><a $ included="null">企业应用架构模式Q马?#183;勒Q?/a></span> </li> <li><span><a $ included="null">领域驱动设计Q埃里克·埃文斯)</a></span> </li> <li><span><a $ included="null">企业集成模式Q格里高·HohpeQ鲍?#183;沃尔夫)</a></span> </li> <li><span><a $ included="null">Release It! Design and deploy production-ready software</a><a $ included="null">(Michael T. Nygard)</a></span> </li> <li><a $ included="null">97 Things Every Software Architect Should Know (edited by Richard Monson-Haefel)</a> </li> </ol> <p><span>q一阶段可能值得说明的是在这部分列出的一些图书中可能是有?争议'的?/span> <span>如果(zhn)已l阅MW一阶段的书c,那么你应该有能力用你自n的观点看待第二阶D늚q些书籍?/span> <span>你会了解刎ͼ你不应该仅仅仿照那些模式Q但了解它们的存在肯定是一件好事?/span></p> <p><span>最后,(zhn)需要了解如何在团队环境下工作ƈ理解团队的动力?/span> <span>下面的书c不是具体介l团队中的工作,但包含了众多的智慧和z察力,q一定会帮助(zhn)在专业的团队环境中工作Q?/span></p> <p style="text-align: center;"><img src="http://www.techcn.com.cn/uploads/200911/1259507849Thp6uC2Q.jpg" height="580" width="408" alt="" /></p> <ol> <li><span><a $ included="null">极限~程Q第二版Q肯?#183;贝克Q?/a></span> </li> <li><a $ included="null">The Art Of Agile Development (James Shore & Shane Warden)</a> </li> <li><span><a $ included="null">人月话Q?0周年U念版(弗雷德里?#183;布鲁克斯Q?/a></span> </li> </ol> <p><span>q本书可能也需要一点说明?/span> <span>我ƈ不是说你应该做极限编E?/span> <span>但你了解它肯定不会有宛_Q至你应该在你认ؓ有意义的时候去试采用q种做法?/span> <span>你ƈ不会真的需要去采用所有的做法Q虽然你q样做会获得额外的好处,或者至假装这样做Q,但它们中的一些,每个人都应该臛_了解一下?/span></p> <p><span>所以就是这样了...试用上q方式阅读这些书Q不要忘了以后感谢我</span> </p> </div> <h3><span id="4cuummu" class="texts">A Reading Guide To Becoming A Better Developer</span><a name="3" class="font_blue"></a></h3> <div id="g6qq28a" class="content_topp"> <p>I’ve stated <a >previously</a> that reading software development books is a good way of investing in your skills and your career. But which ones should you read? And in what order should they be read? I’ve compiled a list of books that i think can truly increase your skills substantially. I’ve put them in the order in which i believe they will have the most effect, and grouped them in 3 ’stages’. I primarily have young developers who are just getting started as professional developers in mind with this list, but it should be just as useful to developers who’ve been around for a while and simply want to improve. </p> <p>The first thing that you should focus on is improving your ability to write clean, unambiguous, maintainable code. The following books should greatly help you with that:</p> <ol> <li><a jquery1259506581015="15" modo="false">Test-Driven Development (Kent Beck)</a> </li> <li><a jquery1259506581015="16" modo="false">Refactoring (Martin Fowler)</a> </li> <li><a jquery1259506581015="17" modo="false">Implementation Patterns (Kent Beck)</a> </li> <li><a jquery1259506581015="18" modo="false">Code Complete: 2nd Edition (Steve McConnell)</a> </li> <li><a jquery1259506581015="19" modo="false">Working Effectively With Legacy Code (Michael Feathers)</a> </li> <li><a jquery1259506581015="20" modo="false">Clean Code (Robert C. Martin)</a> </li> </ol> <p>The order of this stage might surprise some people, but i’m willing to bet that this is the most efficient order to reading those books. </p> <p>After you’ve learned how to write great code, you should really start focusing on clean design and architecture. That’s not to say that you should focus solely on design and architecture, but the more you know about it, the better off you will be:</p> <ol> <li><a jquery1259506581015="21" modo="false">Design Patterns (Gang Of Four)<br /> </a></li> <li><a jquery1259506581015="22" modo="false">Patterns Of Enterprise Application Architecture (Martin Fowler)</a> </li> <li><a jquery1259506581015="23" modo="false">Domain-Driven Design (Eric Evans)</a> </li> <li><a jquery1259506581015="24" modo="false">Enterprise Integration Patterns (Gregor Hohpe, Bobby Woolf)</a> </li> <li><a jquery1259506581015="25" modo="false">Release It! Design and deploy production-ready software (Michael T. Nygard)</a> </li> <li><a jquery1259506581015="26" modo="false">97 Things Every Software Architect Should Know (edited by Richard Monson-Haefel)</a> </li> </ol> <p>This stage probably deserves a bit of clarification as some of the books listed in this part might be somewhat ‘controversial’. If you read and learned from the books in the first stage, then you should be capable of putting everything you read in the second stage in perspective. You will have learned that you shouldn’t just apply as many patterns as possible, but it’s certainly a good thing to know about their existence. </p> <p>Finally, you need to learn about working in a team environment and understanding team dynamics. The following books aren’t about working in teams specifically, but contain a tremendous amount of wisdom and insight that will definitely help you when it comes to working in a professional team environment:</p> <p style="text-align: center;"><img src="http://www.techcn.com.cn/uploads/200911/1259507849EyT9k8ZZ.jpg" height="648" width="435" alt="" /></p> <ol> <li><a jquery1259506581015="27" modo="false">Extreme Programming Explained, Second Edition (Kent Beck)</a> </li> <li><a jquery1259506581015="28" modo="false">The Art Of Agile Development (James Shore & Shane Warden)</a> </li> <li><a jquery1259506581015="29" modo="false">The Mythical Man-Month, 20th Anniversary Edition (Frederick P. Brooks)</a> </li> </ol> <p>This one probably needs a bit of clarification as well. I’m not saying that you should do Extreme Programming. But it certainly won’t hurt you to learn about it, and at least try to apply the practices that you believe in when it makes sense to do so. You don’t really need to apply them all (though you will get bonus points from the cool kids if you do so, or at least pretend to), but there are a few of them that everyone really should do regardless of which agile variant you subscribe to.</p> <p>So there you have it… try those books out in that order, and don’t forget to thank me later <br /> </p> </div> </div> <br /> <br /> <img src ="http://www.tkk7.com/deepnighttwo/aggbug/304881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/deepnighttwo/" target="_blank">深夜两点</a> 2009-12-05 21:48 <a href="http://www.tkk7.com/deepnighttwo/archive/2009/12/05/304881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的认证http://www.tkk7.com/deepnighttwo/archive/2009/12/03/304680.html深夜两点深夜两点Thu, 03 Dec 2009 15:17:00 GMThttp://www.tkk7.com/deepnighttwo/archive/2009/12/03/304680.htmlhttp://www.tkk7.com/deepnighttwo/comments/304680.htmlhttp://www.tkk7.com/deepnighttwo/archive/2009/12/03/304680.html#Feedback0http://www.tkk7.com/deepnighttwo/comments/commentRss/304680.htmlhttp://www.tkk7.com/deepnighttwo/services/trackbacks/304680.html Q上一:计算Z的加密和认证http://www.tkk7.com/deepnighttwo/archive/2009/12/03 /304631.htmlQ?br /> A公司开发了一个YӞ打成了一个jar包,然后发布出去liao。作Z个用P如何来确认这个jar包确实是A公司发布的哪个?而且Q如何确定这个jar包没有被别有用心的一撮改q?q就需要Java中的{֐来保证?br />
Java中的可执行代码就是class文g。直接用class文g是很naive的。通常的做法是是对一个jar包中的所有class文gq行{֐。过E可以分为如下步骤?br />
  1. 首先使用JDK自带的keytool工具生成一个keystoreQ命令如下: keytool -genkey -keystore keystore文g -alias 别名。回车后q有一些信息需要填写。keystore里面包含了很多信息,包括公钥和私钥信息。当然可以用keytool命o从keystore文g里面导出公钥和私钥。keytool命oq有很多参数Q比如你可以指定使用的摘要算法等。(具体用法可以Google之)?/li>
  2. 然后Q第二步当然是找个CAl公钥签名。自p乐的用途就可以不用q一步了?/li>
  3. W三步是ljar包签名。JDK中提供了ljar包签名的工具Q叫做jarsinger。命令各式如下:jarsigner -keystore keystore文g jar文g 别名Q就是生成keystore时用的那个别名)。回车后要输入密码,也跟生成keystore时候的密码一样就行了?
好,到这里就签名结束了。命令执行完毕后Qjar包会陡然多出几k来。这几k是{֐的内宏V?br />

JavaQ或者说是Java RuntimeQ是支持{֐和认证的。也是说一个jar包一旦被{֐了,Java Runtime会对q个jar包进行验证。下面是验证{֐的过E?br /> 首先需要知道签名后jar包里面多Z什么。签名ƈ不会改变jar包中已经有的内容Q而是d了一?DSAQ说明用的是DSA法Q文件和一?SFQsigned fileQ文Ӟ然后?MF文g里面增加一些内宏V验证的q程是这L(fng)Q我猜的。。。觉得不对可以去http://java.sun.com/javase/6/docs/technotes/guides/jar /jar.htmlQSun公司的jar包规范,自己看自qQ,首先是DSA文gQ它里面存储了公钥内容和对SF文g摘要的加密内容,所以,首先验证公钥Q跟https里面的那个验证是一L(fng)q程Q,验证完毕证书后,用公钥解密加密的内容Q然后得到SF文g的摘要|把这个值和实际 SF文g的摘要值比较,q样可以保证SF文g没问题了。SF文g里面的内容包含了很多条目的签名倹{首先是对MF文g的签名|q就是验证MF文g了。而MF文g里面Ҏ(gu)个class文g都有一D|q的内容Q比如:
Name: common/class2.class

MD5-Digest: (base64 representation of MD5 digest)

SHA-Digest: (base64 representation of SHA digest
它代表这个class文g对应摘要法的摘要倹{这个条目在SF里面有一个对应的条目Q?br /> Name: common/class2.class
MD5-Digest: (base64 representation of MD5 digest)


注意QSF文g中的q个摘要g是class文g的,而是MF文g里面对应条目的。也是_SF里面的签名值统l是用来验证MF文g或者MF文g中的条目的,而MF文g中的摘要值才是用来验证class文g的。真l。。?br />
MQ最后一层层的验证后Q整个jar包中的内定w被验证了。过E:CA的证?>自己的公?>SF文g{֐ ->MF文g{֐和MF文g每个条目的签?>jar包中的每个文Ӟ当然主要是clas文g。别的文件应该也会被验证的,臛_properties文g会被{֐认证Q?br />
验证完了之后Q就可以保证jar包确实出自某公司之手Q也实没有被别有用心的一撮人篡改过。如果你信Q某公司,那就可以用这个jar包了?br />
同样Q如果一个applet的jar包是{֐了的Q而且在启动applet的时候用户选择信Qq个{֐Q那么这个applet拥有了讉K本机资源的权限,如果选择不信任,那么applet׃会被启动。如果一个applet没有被签名,那么applet可以启动Q但是不会被允许讉K本机资源Q文件等Q?br />
如果一个证书没有被CA的证书认证,比如_对于我写的这个appletQ它?yu)是用我自己搞出来的没认证过的证书签了名的:http://appletfarm.appspot.com/juliaappletsigned.html
q时候Java会提CQ?br />
“该应用程序的数字{֐无法验证”Q因为我没给qVeriSignq费。如果证书是验证q的Q对话框׃是询问你是否信Q“某公?#8221;Q这个意思就是说Q此jar包确实是“某公?#8221;搞出来的Q信任那个公司就可以q行它了?br />


深夜两点 2009-12-03 23:17 发表评论
]]>
计算Z的加密和认证?/title><link>http://www.tkk7.com/deepnighttwo/archive/2009/12/03/304631.html</link><dc:creator>深夜两点</dc:creator><author>深夜两点</author><pubDate>Thu, 03 Dec 2009 09:55:00 GMT</pubDate><guid>http://www.tkk7.com/deepnighttwo/archive/2009/12/03/304631.html</guid><wfw:comment>http://www.tkk7.com/deepnighttwo/comments/304631.html</wfw:comment><comments>http://www.tkk7.com/deepnighttwo/archive/2009/12/03/304631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/deepnighttwo/comments/commentRss/304631.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/deepnighttwo/services/trackbacks/304631.html</trackback:ping><description><![CDATA[<span style="color: navy;"> 大学时候学|络安全Q不知道是老师太脱d际,q是当时我上评太多了,反正学了个糊里糊涂。上机实验比着葫芦ȝ在JBoss上搞了个EJBCA的什么东西,p得已l؜q去了。不q该学的q是得学Q躲不过。现在开始还大学睡觉的债。。。。前D|间看了一阵子的Java安全~程Q回q头来ȝȝ?br /> <br /> 首先是跟Java没关pȝQ是加密和认证。加密的法可以分ؓ三类Q?br /> <ul> <li> 摘要法Q指U算法,哈希法{)Q摘要算法其实不加密。算法以数据入,生成一串等长的输出。这个输出就是这D输入的指纹Q或者说是摘要。算法不输入有多长Q?G或者一个byteQ输出都是一样长的。指U算法比较Ş象。我们可以认为,只要数据不同Q生成的摘要是不同的(或者说Q想Ҏ(gu)一个摘要来生成特定的数据是很难的,所以这个摘要可以唯一的确定数据的w䆾Q。当然是无法从这个简短的摘要q原原始数据的。比较常用的摘要法有MD5QSHA-1QDSA之类的。摘要算法是公开的,M人都可以通过摘要法来计一D|据的摘要。所以,如果一个文件传输给你,同时也给你一个这个文件的MD5摘要Q那么你收到文g后,计算一下文件的MD5Q然后和别hl你的MD5摘要比较一下,q道文件在C手上之前是不是被人改动过了?/li> <li> 对称加密法Q对U加密算法是<strong>使用相同密钥</strong>加密和解密数据的一U加密算法。密钥可以认为就是一D|据。用相同的密钥q点很重要。对U加密算法很多,加密解密也很快。最入门的对U加密算法就使凯撒密码。工业中使用的加密算法很多,比如用于加密的RC4Q还有AESQDES{。只有有密钥Q那么就可以对加密后的数据进行解密,得到原始的数据。从q里可以看出Q密钥是对称加密的关键,如果密钥的传输无法保证安全,对称加密是形同虚设的?/li> <li>非对U加密算法:非对U加密算法是计算机加密和认证中最关键的一环。非对称加密的特Ҏ(gu)Q它有俩密钥Q?strong>用密?加密的数据需要用密?解密Q同P用密?加密的数据需要用密钥1解密?/strong>如果公开密钥1Q那么密?成为公钥,卛_开的密钥,同时Q密?׃ɿU钥Q必d好保存不能让别h得到。非对称加密法有数学证明来保证它几乎不可能在一个有意义的时间段内被破解。但是非对称加密也有致命的弱点——加密解密计量大,不适合用来处理大量的数据。非对称加密法有RSAQDSA{?br /> </li> </ul> 计算机加密体p需要保证——保密性、完整性、认证性和不可抵赖性。保密性就是说Q数据是使用加密法加密q的Q一般是使用对称加密法加密Q。完整性可以用摘要法保证Q因ZD|据一旦被人改动过了,那么摘要p定不同了。但是,q两者如果没有非对称加密法保护Q一切就都是I。因为,密钥d要通过 internet传输的,如果被hH取了咋办?摘要Q大不了黑客改了数据之后,生成一个新的摘要。好Q非对称加密上场了,认证性和不可抵赖性这两点也是非对U加密来保证的。它如何来保证前面这些呢Q?br /> <br /> 先看看什么是证书。有了这些算法之后,有了证书这个概c啥叫做证书呢?证书其实是一个文件。文件内Ҏ(gu)多,需要关心的有:<br /> <ul> <li>非对U加密的公钥。它可以用来解密那个U密的私钥加密过的数据?/li> <li><strong> 用别的私钥加密过?/strong>非对U加密的公钥的签名。上面说的非对称加密的公钥也是一D|据呀Q用摘要法计算一下它的摘要。然后用别的U钥加密一下这个摘要。注意,q里说的是用别的U钥加密?/li> <li><strong>所谓的别的U钥</strong>的标识。有了这个标识,才知道是谁加密了公钥的签名?/li> </ul> 问题来多了。什么叫做别的私钥?哪儿来的U钥Q对于一个有效的证书来说Q这里说的别的私钥,是那些专门来提供证书加密服务的公司Q比?VeriSignQ的U钥。这些公怼全副武装的保护好自己的私钥(公司的命根子呀Q。下面来叙述一下这个过E:<br /> <ol> <li>首先QA公司惌一个证书,用来在internet上证明自q实实是A公司。于是公叔R过工具生成了一对密钥(q个很简单,谁都可以L的生成一对密钥)?/li> <li>然后他拿着公钥LVeriSignQ计了公钥的MD5|hVeriSign拿出自己的宝贝私钥,来对q个公钥的MD5D行加密?/li> <li>VeriSign很专业,他们会要求A公司出具相应的证明,核实无误后,VeriSign此才会拿出私钥,把A公司公钥的MD5D行加密。这个就叫做{֏证书?/li> <li>q不是一锤子买卖QA公司Zq个事儿Q须要按q给VeriSign付钱?/li> <li>好,A公司的公钥的MD5DVeriSign的私钥加密过了,得到了一D加密后的数据,只有VeriSign的公钥才能解密这D|据,得出正确的倹{?/li> <li>A公司屁颠屁颠的可以生成自q证书了,证书的内容包括:<br /> </li> </ol> <ul> <li>A公司的公钥?/li> <li>VeriSign的私钥对A公司的公钥的MD5值加密后Q所得到的数据。再ơ提醒一下,q个密钥只有VeriSign的公钥才能解密?/li> <li>一D|字,说明证书是VeriSign验证的,公钥的指U算法是MD5。这D|字不用加密,谁爱看谁看?br /> </li> </ul> l于A公司有了自己的证书,但是QVeriSign的私钥加密过的东西,要使用VeriSign的公钥来解密Q咋办?不用急,VeriSignq种提供证书服务的公司早和各种操作pȝ提供商协商好了,他们的公钥早׃l包含在了每一个操作系l中Q在我们安装操作pȝ的时候,VeriSignq些公司的公钥就已经包含在计机里了?br /> <br /> 下面以https来解释一下计机中的安全体系Q保密性、完整性、认证性和不可抵赖性)是如何工作的?br /> A公司有了一个站点,览器用https来访问这个站点的时候,大概的过E就是这L(fng)Q下面的q程<strong>基本</strong>是Https协议的运作过E)Q?br /> <ol> <li>A公司站点首先l客L(fng)发送自q宝贝证书。(数据传输的时候被Z中间截获了?不怕,惛_听吧)</li> <li><strong>认证?/strong>Q客L(fng)得到证书之后Q开始验证这个证书:</li> <ul> <li>首先Q客L(fng)从证书中知道Q这个证书是被VeriSign公司{֏的。所以客L(fng)从操作系l中拿出来VeriSign公司的公钥,待用?/li> <li>客户端还知道QA公司公钥是用MD5法计算的签名,OKQ客L(fng)d出来证书中A公司的公钥,使用MD5|待用?/li> <li> 下面是重要的一步了Q客L(fng)从A公司的证书中抽取出那D?strong>加密后的数据</strong>Q也是<strong>A公司公钥的MD5?/strong>?strong>VeriSign公司的私钥加?/strong>q的那段数据Q,然后再拿q来W一步中扑ֈ的VeriSign公司的公钥,非对U加密的特点是U钥加密Q公钥解密之。所以,当当当当当,解密之,得到的值就<strong>应该是A公司的公钥的MD5?/strong>?lt; /li> </li> <li>那到底是不是呢?跟第二步中客L(fng)自己计算出来的MD5值比对一下就知道了?/li> <li> 如果通过比较Q发现确实是Q那么安全体pM的认证性就得到保证了,也就是说Q客L(fng)可以完全怿Ҏ(gu)是A公司Q访问的站点也就是A公司的站炏V?strong>Q等{,A公司的公钥不是公开的吗Q那岂不是Q何站炚w可以伪装成A公司Q不急,q不是个事儿Q在下面不可抵赖性会说到Q?/strong>当然Q如果验证不通过Q说明对Ҏ(gu)?#8220;李鬼”。浏览器会有提示Q说q个站点提供的证书没有通过验证思密达(q有一U情况就是,证书q期了,q记得前面说的每q给VeriSign的年费吗Q?/li> </ul> <li>好,客户端验证通过了,下面是开始传输数据了。传输数据的q程有保密性、完整性和不可抵赖性三炚w要保证?/li> <li> 首先Q?strong>客户端浏览器(zhn)?zhn)地生成一个随机数</strong>。然后用A公司的公钥加密这个随机数Q发送给A公司的站炏V因为是A公司公钥加密的,所以不怕被人窃听。ؓ啥不怕被H听Q因为窃听了也没用,<strong>因ؓH听者肯定没有A公司的私?/strong>Q没有私钥也没法对H听到的数据解密?/li> <li>A公司站点收到q个数据后,开始用自qU钥解密数据。到了这个时候,肯定是只有客L(fng)和A公司的站Ҏ(gu)务器知道q个随机数的?/li> <li> 接下来,客户端浏览器和A公司站点Ҏ(gu)相同的算法,生成对称加密使用的密钥(实际上是一l密钥,当然在这里不用深I这个)。以后的数据传输全使用q个对称加密密钥q行了。这是<strong>保密?/strong>?/li> <li> 保密性得C保证Q完整性如何保证呢Q如果攻击者虽然不能够获得数据Q但是他x蛋,偷偷改数据来破坏数据的完整性。这个时候也没啥问题Q在https 协议中,每条消息在加密之前都包含了消息内容和消息的hash|比如Q消息的MD5|Q这样在消息的接收端Q就可以对这条消息进行验证了。通过验证可以知道消息是不是被篡改过。当Ӟ如果被篡改过Q也使没办法回复的,不过知道消息被篡改过Q那么就可以要求Ҏ(gu)重新发送消息了QMd者是没法办得逞的。这是消息?strong>完整?/strong>?br /> </li> <li> 好的Q在q里我们来看一?strong>不可抵赖?/strong>。因为只有A公司有私钥,q也是_只有A公司可以把这个数据成功解密,来得到这个随机数Q从而来计算对称加密使用的密钥。所以,如果A公司x赖说那个站点不是自己Q是不可能的事情。因为只有A公司有这个用于解密的U钥Q不是A公司是谁。同P好像在前面说的Q如果有人用A公司的公钥冒充A公司Q那么这个李鬼其实没有A公司的公钥,也就没有办法解密数据Q注意,客户端生的随机数是使用A公司的公钥加密的Q须要用A公司的私钥解密)Q所以这个是徒劳的?/li> </ol> 好,保密性、完整性、认证性和不可抵赖性都在上面的q程中都得到保证了。这个过E的核心?yu)是非对U加密的Ҏ(gu):公钥加密U钥解密Q私钥加密公钥解密。本到此结束,下一中涉及Java中的认证和加密?br /> <br /> 关于https的具体内容可以参考这文章:<a title="http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser" >http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser</a></span><br /> <span style="color: navy;"> <br /> <br /> <br /> <br /> </span> <img src ="http://www.tkk7.com/deepnighttwo/aggbug/304631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/deepnighttwo/" target="_blank">深夜两点</a> 2009-12-03 17:55 <a href="http://www.tkk7.com/deepnighttwo/archive/2009/12/03/304631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://6777s.com" target="_blank">ĻӰ</a>| <a href="http://pgb168.com" target="_blank"> ͼƬ</a>| <a href="http://928288.com" target="_blank">һƷһavһˬˬ</a>| <a href="http://aa77cc.com" target="_blank">츾avvrӰ</a>| <a href="http://www026qqcom.com" target="_blank">þۺϾƷ</a>| <a href="http://pencilinside.com" target="_blank">?V˾Ʒպ</a>| <a href="http://zhaosaohuo.com" target="_blank">ֻ߿avƬ</a>| <a href="http://uu313.com" target="_blank">һaëƬѲ</a>| <a href="http://cnpc1002.com" target="_blank">žžŹƷƵ</a>| <a href="http://shunfk.com" target="_blank">ŷպһ</a>| <a href="http://shenghe228.com" target="_blank">޻ɫĻ</a>| <a href="http://yu388.com" target="_blank">avr</a>| <a href="http://zjyxc.com" target="_blank">޾Ʒþþwww</a>| <a href="http://phlinhng.com" target="_blank">aػƵƬƵ</a>| <a href="http://lianghao999.com" target="_blank">ëƬȫѹۿ</a>| <a href="http://wuiso.com" target="_blank">Ƶ߹ۿ </a>| <a href="http://601508.com" target="_blank">ϣӰԺѹۿƵ</a>| <a href="http://01shanzhai.com" target="_blank">ëƬ߲ѹۿ</a>| <a href="http://www-474749.com" target="_blank">Ʒվ </a>| <a href="http://junyehome.com" target="_blank">ŮAëƬ</a>| <a href="http://fangdazd.com" target="_blank">97ƵѲ</a>| <a href="http://yanyingqiang.com" target="_blank">ҹ뾫Ʒѿ</a>| <a href="http://bbscqz.com" target="_blank">һ˿wwwѸ</a>| <a href="http://langse3.com" target="_blank">һһëƬѲ</a>| <a href="http://440878.com" target="_blank">ѾƷӰվ</a>| <a href="http://kk600700.com" target="_blank">ҹƵ</a>| <a href="http://apguangyu.com" target="_blank">ŷ޾Ʒһѿ</a>| <a href="http://fzgjw.com" target="_blank">һ</a>| <a href="http://fuzhiwushu.com" target="_blank">޳AVӰƬ߹ۿ</a>| <a href="http://haiholr.com" target="_blank">޾Ʒŷۺ</a>| <a href="http://www99383.com" target="_blank">鵺̳߹ۿ</a>| <a href="http://zbr555sina.com" target="_blank">޾Ʒ߲</a>| <a href="http://tlyyt.com" target="_blank">123Һ</a>| <a href="http://wwwseselu.com" target="_blank">߹ۿר</a>| <a href="http://lshwork.com" target="_blank">һѻɫƬ</a>| <a href="http://vvbbn.com" target="_blank">һ߹ۿ </a>| <a href="http://www-774220.com" target="_blank">ɫ</a>| <a href="http://bii59.com" target="_blank">޵һƷӰ</a>| <a href="http://aaa99999.com" target="_blank">avһ</a>| <a href="http://sswg2.com" target="_blank">Ļ</a>| <a href="http://48eh.com" target="_blank">GVGVͬ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>