本文依照 Joomla! 1.5 Stable 版本的安装程序写作,文中所引用代码均来自实际程序文件。
我们从安装程序入口文件 /installation/index.php 开始。
1. 常量定义
index.php 文件起始处定义了若干常量:1define( '_JEXEC', 1 ); 2define( 'JPATH_BASE', dirname( __FILE__ ) ); 3define( 'DS', DIRECTORY_SEPARATOR );
_JEXEC 是一个标志量,表示程序正常启动(通过合法入口 /index.php 访问)。Joomla! 在其他所有的 .php 程序起始处,均通过执行以下代码,阻止直接访问非入口程序的请求,这是出于安全的考虑: Read More- 这种异常只会发生在 Windows 平台上,可以说是 iBatis 的一个 Bug,大约 iBatis 的开发测试人员都比较热衷于 Unix 族系的平台,而忽略了 Windows 下的兼容性测试。
出现 FileNotFoundException 异常的情形是这样的:Windows7 + iBatis2.3.0.677 + OSCache2.4.1。
iBatis 中配置使用 OSCache 缓存,在映射文件 Product.xml 中有如下声明片断:1<cacheModel type="OSCACHE" id="productCache"> 2 <flushOnExecute statement="Product.insert"/> 3 <flushOnExecute statement="Product.delete"/> 4</cacheModel> 5 6<select id="getById" cacheModel="productCache" parameterClass="int" resultClass="Product"> 7 select id, name,description as desc1 from test_product where id = #value# 8</select>
OSCache 的 oscache.properties 中指明用磁盘文件缓存数据,注意以下几个配置: Read More - 初看 cgaolei 翻译的 Java技巧之双括弧初始化 一文,走马观花,只知用法,未细看后面的解释。蔚为惊艳,心里想 Java 竟然有这么神奇的语法而一直未得知。因为在初始化集合时确实方便不少。原来做某些测试要初始化集合时会用到 commons-lang 包和 JDK 的 Arrays 工具类,现在知道可以这么用了:
1Map map = new HashMap() {{ 2 put("Name", "Unmi"); 3 put("QQ", "1125535"); 4}}; 5 6List stooges = new ArrayList() {{ 7 add("Larry"); 8 add("Moe"); 9 add("Curly"); 10}};
看起来都是在一条语句里完成,而不需要分步骤写成: Read More - XML 和 JSON 是当今常用的两种数据描述与传输的格式,特别是涉及到 JS 时使用 JSON 颇为频繁。自然,在 Java 的世界里少不了完成 JavaBean 与这两种格式相互转换的组件,那就是 XStream 和 JSON-lib。这里我简单记下 XStream 的用法。
其实相类似的工具早已有之。如果用过 DWR 的同志,一定有印像,DWR 进行远程方法调用时也能为你完成 JavaBean 和 JSON 格式的双向转换的,所依赖的是它的各种 Converter。再要是对 Struts1 的细节有所注意的话,Struts1 的 ActionServlet 在初始化 struts-config.xml 时是通过 commons-digester 来完成 XML 到 JavaBean 转换的。相应的 Apache 也有一个 commons-betwixt 实现了 JavaBean 到 XML 的生成。 Read More - 基本用法(不涉及其他相关类):
Ext.data.Record 实例就是对应一条记录,记录通常会放在数据集 Store 中,其中包含了数据的定义信息(字段名等) 和数据的值信息。这里不涉及与它相关的 Proxy、DataReader 和 Store,只单纯的用 Record 的方法。通常是两步,先调用 Record 的 create() 方法,返回一个类,然而 new 前面方法返回的类,代码过程如下:代码说明: Read More1//第一步,create() 返回一个 Record 的子类(定义了数据表现,有点像泛型) 2var Person = Ext.data.Record.create([ //用对象数组指定每个字段名 3 {name:'name'},{name:'email'} //name 属性指定每个字段名 4]); 5 6//通过前面 create() 返回的 Person 类创建 record 实例 7var record = new Person({//传入一个对象作为第一个参数,注意属性名对应 8 name:'Unmi', 9 email:'[email protected]' 10},2009); //第二个参数指定记录的标识 ID,未指定 ID 则为你用整数进行编号 11 12//验证效果,只取 id 和其中的 email 属性,可试下前面无 {id:'name'}的情况 13alert('id:' + record.id +", email:" + record.get('email')); - 在 ExtJs 中支持多线程的类有 Ext.util.TaskRunner 和 Ext.util.DelayedTask。TaskRunner 提供了多线程的定时服务,DelayedTask 允许你延时多久在新建线程中执行一个任务。Ext.TaskMgr 是一个 TaskRunner 实例,在 TaskMgr.js 源码中可以看到最后一行是:
Ext.TaskMgr = new Ext.util.TaskRunner();
实质上不管是 TaskRunner 还是 DelayedTask,它们都是通过 setInterval() 来执行任务的,TaskRunner 能多次重复的执行一个方法,而 DelayedTask 是延时执行完一次任务后就会调用 clearInterval() 来保证只执行一次。所以这里所说如何向任务的 run() 方法传递参数,本质上就是向 setInterval() 中方法传递参数。 Read More 译自:http://www.vineetmanohar.com/2009/07/17/howto-ssh-without-password/
这个简单的教程讲解了如何无需输入密码 SSH 连接到远程机器。在你需频繁的登陆到同一机器,而又不得不一次次输入密码时就可以使用这一技术。这也很适于这样的场景:当你有一个脚本需要通过 SSH 从远程机器取文件或者在远程机器上执行一个任务,并且希望能自动的运行该脚本,而用不着人工去输入一个密码。
这些指令在 Linux 和 Mac 下能正常工作。你可以在 Windows 下参照同样的方法来使用 Putty,但是我这里没有针对具体 Putty 指令作描述。
目标:从本机登陆到远程服务器无需输入密码
步骤 1/2:在本机上:生成认证码认证码是一个私钥公钥对。你的公钥也是一个 2-3 行的长长看不懂东西。公钥就像是你登录后的唯一标识。私钥就像是你的密码,但比一个规则的密码要长。你可以通过如下命令来产生你的公钥和私钥: Read More
- 最近以裁判的身份参加了公司举办的编程大赛,发现高手云集,对公司内部的程序员能力也有了更深入的了解。我觉得编程能力对程序员而言,虽然很重要,但并不是全部。那么作为一个程序员,到底应该具备什么样的能力呢?这个话题显然太大。不过我觉得可以看看其它国家的程序员,也许可以得到一些借鉴。我有幸和中国,美国,印度和日本四国程序员有比较深入的合作过。虽然他们不一定有代表性,但我觉得他们的共性还是比较明显的。以下的比较纯属个人见解,欢迎指正。首先是日本程序员。他们的特点是非常仔细。我认为很主要的一个原因是日本公司的需求非常细致。细致到在网页上,连一个像素都不能偏差的地步。另外,日本人的执行力非常强,对老板的承诺比命还重要。一个项目可以做到连续3个月天天加班,每天只睡4个小时。然而,高执行力背后的代价是低创造力。在日新月异的互联网今天,很少听说日本工程师发明了哪些重要的技术。与其说这些特点是日本程序员的,不如说是大部分日本人的。因为在日本文化中,追求品质和遵守等级制度是根深蒂固的。另外,技术领域中的很多专业词汇是外来语,以英语(论坛)为主。这些专业词汇往往会被翻译成片假名。而片假名的发言有时候和英语大相径庭,导致沟通的困难。比如病毒一词在英语中是Virus,发音为歪儒斯,而日语的发音是味鲁斯。再例如服务器(Server)一词在日语中的发音是萨巴,和英文发言简直风牛马不相及。因此与日本程序员沟通是比较痛苦的,除非你懂日语。 Read More我们在使用 ExtJs 创建组件时最容易理解的当然是用
new Ext.form.TextField({fieldLabel:'姓名', id:'name',width:120});
我们还可以直接用 xtype(比如 TextField 对应的 xtype 是 textfield) 的对象形式来创建组件,比如在面板的 items 属性中,尤其是多个组件或需要写许多的 ExtJs 相关代码时就更值得推荐。我们来对照如下形式就知道了:Read More1items[ 2 new Ext.form.TextField({fieldLabel:'姓名', id:'name', width:120}), 3 new Ext.form.TextField({fieldLabel:'密码', id:'passwd', inputType:'password', width:120}), 4 new Ext.form.DateField({fieldLabel:'生日', id:'birth', format:'Y年m月d日', width:120}) 5] 6//替换成用 xtype 写法就如下(似乎只是免去了很多的 new ...) 7items[ 8 {xtype:'textfield', fieldLabel:'姓名', id:'name', width:120}, 9 {xtype:'textfield', fieldLabel:'密码', id:'passwd', inputType:'password', width:120}, 10 {xtype:'datefield', fieldLabel:'生日', id:'birth', format:'Y年m月d日', width:120} 11]自然,我们都习惯了 IE,在 IE 中要在函数中获得各事件对象很容易,直接用 event、event.srcElemtn、event.fromElement、event.toElement 就行了。在 FireFox 中获得触发事件的元素可以用 event.target,但其他两个 fromElement 和 toElement 就要费些周折。
所以,为了保持一致的使用方式,也为了保持原有的使用习惯,我们加入以下 JS 代码(代码有些紧凑,未加注释,应该很好理解): Read More