vi显示行号

Posted by 冰河 at 10:50 4 Responses » 27,438 Views
232011

在vi下如何显示行号?

按Esc切换到命令行模式,输入:
:set nu

如果您想每次进入vi都标出行号,编辑~/.vimrc文件。也就是在用户的主目录下,编辑存档.vimrc文件。里边写一行: set nu。这样,该用户登录以后,只要进入vi,就有行号。如果想取消只要删除set nu这一行或用”注释掉即可。

152011

今天无意中看到《程序员三大法则》,很搞笑:

第一法则

程序员不得损害产品质量,或袖手旁观产品质量受到损害。

第二法则

程序员必须服从产品经理的命令,除非违背第一法则。

第三法则

程序员必须保护自己,除非违背第一和第二法则。

据说还有一条繁殖定律:

繁殖定律

程序员不得参与程序员的孕育和培养,除非新程序员的行动符合以上三大法则。

Continue reading »

WordPress天气插件

Posted by 冰河 at 12:52 10 Responses » 22,383 Views
十二 212010

一直想找一个WordPress的天气插件。Google搜索“WordPress天气插件”排第一的是Tsov Weather,看起来还不错,只不过作者的演示页面里有点错位,背景色也和我的主题不一致:

于是下了插件想改造下,打开源码一看傻眼了,是frame调用。于是给博主留言索要代码。作者回复如下:

代码很简单,只是用implode读取远程的,再正则过滤取到数据,然后缓存一下。代码我不太懂,写的太烂了,不敢放出来。

说白了就是不给。代码本身就有问题,而且还不开源,调用别人的代码太被动(调用QQ官方的就另当别论了),于是乎这个插件就直接枪毙了。连代码都不公布的插件还好意思挂到WordPress里。没有开源的精神就别玩WP嘛。
然后我在思维海的博客里看到soso的天气预报可以直接调用,窃喜。调用代码:

<iframe src=”http://www.soso.com/tb.q” width=”260″ height=”195″  marginwidth=”0″  marginheight=”0″ hspace=”0″ vspace=”0″ frameborder=”0″ allowtransparency=”true” scrolling=”no”></iframe>

效果如下:

于是建了个小工具放进去一看,不合适。我的小工具栏宽度只有260,放内容的div两边还有5px的padding。于是想把padding去掉,但是尝试了许久之后发现这样改会破坏WordPress的原有代码结构,结果也不怎么好看。于是又放弃了。

Continue reading »

Emlog转WordPress详解

Posted by 冰河 at 14:57 19 Responses » 31,268 Views
十一 242010

其实早就萌生了转WP的念头,但是迟迟没有动手,一是懒的折腾,二是Emlog这一轻量级的开源博客程序确实好用。EM的缺点也是优点,轻量级必然功能要相对弱些。虽然有时候可以自己折腾,但是自己精力有限,而且频繁更改源代码会导致博客可维护性下降。WP的优点众所周知,功能强大,插件也多。很多人诟病WP臃肿,运行效率低,占用资源多,但是从软件开发的角度来讲,WP主题模板化、功能插件化是必然的趋势。我对插件化产生好感是因为以前做的一个项目,使用了开源搜索引擎Nutch,里面的除了内核,其他功能都是用插件实现,二次开发很方便。另一个例子就是Firefox,本身功能一般,但是配合万能的插件,很好很强大的说。使用插件的缺点就是接口多,调用多,运行效率自然就打折扣了,资源占用必然也会飙升。

Continue reading »

在一个struts项目中,碰到这么一个问题:

用户的登录页面地址是:

http://localhost:8080/sduprs/user/user_login.jsp

登录后显示的地址为:

http://localhost:8080/sduprs/userLogin.do

更悲剧的是我们在后台使用了frame框架。这样登录后所有的操作地址都显示为上面的那个地址。大师兄不满意,要求修改为实际地址。在网上查了半天资料,发现是url转发问题,具体点就是ActionForward的问题。下面是关于ActionForward的资料:

(1)ActionForward是Struts的核心类之一,其基类仅有4个属性:name / path / redirect / classname。在基于Struts的Web应用程序开发过程中,Action操作完毕后程序会通过Struts的配置文件struts- config.xml链接到指定的ActionForward,传到Struts的核心类ActionServlet,ActionServlet使用 ActionForward提供的路径,将控制传递给下一个步骤。ActionForward控制接下来程序的走向。ActionForward代表一个 应用的URI,它包括路径和参数。
(2)ActionForward的参数除了在struts-config.xml和页面中设置外,还可以通过在Action类中添加参数,或重新在 Action中创建一个ActionForward。
(3)在ActionForward中有一个重要的属性redirect,当redirect=false时,将保存存储在http请求和请求上下文中 的所有内容,仅在同一个应用中可用。当redirect=true时,Web客户端进行一次新的http请求,请求的资源可以在同一个应用中,也可以不 在,原来的请求参数不再保存,原来的请求上下文也被清除,新的http请求仅包含ActionForward的path属性里所包含的参数。如果在同一个 应用中,用户会话的上下文会被维护。
(4)ActionForward分为全局转发和局部转发,Action的Mapping对象的findForward方法首先会检查局部转发列表,查 找失败就会到全局转发列表中查找。书写格式中,我们一般将全局变量定义为String常数,避免误解,使得转发列表结构清晰易读。

实际上,struts有两种定向方式:转发和重定向(redirect)。当我们用了重定向的时候,是把页面完全转向到请求的视图去了。同时,浏览器上边的url也更新了。这样的优点是请求完全转移,缺点是无法用request.setAttribute传递参数值;当我们使用转发的时候,是将本次请求的request传递给了要定向的jsp或者servlet。同时执行被请求的jsp或 servlet,结果显示出来。但是,浏览器上看到的依然是发出请求的url,而不是结果的url,这种方式的优点:可以向被请求的jsp或 servlet传递值request.setAttribute,缺点是url依然是请求的url,不是结果的url,刷新的话,将再次执行该请求。

根据上面的介绍我发现使用redirect必须谨慎。仔细排查了下处理登录页面的action,发现只是向session写入了user变量,并没有使用request.setAttribute传参。因此就把struts-config.xml里ActionForward的redirect属性设置为了true:

<forward name=”userLoginSuccess” path=”/user/main.jsp” redirect=”true”/>

这样我遇到的问题就解决了。

首先说下Struts中的<html:reset>标签,对应于html中的<input type=”button” />。虽然都是重置按钮,但是它们的功能是不一样的,更确切的说是效果是不一样的。html中的重置按钮很简单,就是将form中的文本框、选择框中的内容清空,当然你也可以自己定义点击事件。

Struts中的<html:reset>标签是将form中的元素重置为当前值。什么是当前值?这里就要用到面向对象的思想了。每个jsp中的form是对应于后台的一个form类(应该是该类的一个对象),这在Struts的配置文件中已经写明了。如果用对象的观点去理解当前值,就很容易了。比如User类的对象myuser有name属性,当前赋值是“张三”,你想把它修改成“李四”,输入“李四“之后你点击了reset而不是submit,那么jsp表单中对应显示会变成”张三“。form被重置为当前值,而不是默认值,即类实例化为对象时的值,说白了就是代码中的默认值。所以具体用那个重置按钮应该根据实际情况决定。

再说下Struts中的<html:>标签捕获问题。一般我们使用Struts的html标签时只有property和value属性,这里的property属性即对应于普通html中的name属性,可以使用document.getElementsByName()获得。但是这个方法返回的是数组,如果想使用document.getElementById(),就必须给Struts中的<html:>标签天添加styleId属性,例如:

<html:password styleId=”password” property=”password”  />

这样我们就可以使用document.getElementById(“password”)获得这个元素,然后对value进行赋值。

关于如何在Struts下使用jsp图片验证码,请参考另外一篇文章《jsp图片验证码》。其原理就是随机生成4位验证码,将其写入Session,同时生成图片显示出来。这样就出问题了。如果同时打开多个带验证码页面,那么只有最后的页面验证码会通过验证,其他的均提示验证码错误。

其实这个问题当初添加验证码功能的时候就知道会有,但是一直没改,因为很少有人打开多个登录页面,就算是出错了刷新一次就能解决。最近负责项目的师兄盯住这个问题了,所以不得不改改。

这个错误的关键代码在于:

request.getSession().setAttribute(“checkcode”,sRand);

也就是说每次生成验证码都存在Session的checkcode变量里。这样每次生成的验证码都会覆盖上次的值。

网上有许多解决方案,其中一种是给验证码加时间戳。

在将验证码存入Session时使用以下代码:

String timestamp=(String) request.getQueryString();//我这里就一个参数
request.getSession().setAttribute(“checkcode”+timestamp,sRand);

其实原理很简单,就是加入时间戳,把存入Session的变量区别开来。

使用的时候在表单里加入:

<input id=”timestamp” type=”hidden” name=”timestamp” value=”">

同时写一个图片的刷新脚本

function loadimage(){
var timestamp=(new Date()).valueOf(); //timestamp.
document.getElementById(“randImage”).src = “<%=request.getContextPath()%>/image.jsp?”+timestamp;
document.getElementById(“timestamp”).value = timestamp;
}

服务器端直接在form的validate()里使用如下代码取出checkcode即可。

String checkcode= (String) request.getSession().getAttribute(“checkcode”+timestamp);

用完记得顺手清理session:

request.getSession().removeAttribute(“checkcode”+timestamp);

参考链接:http://blog.kongxz.com/2010/01/solution-to-verifying-code-in-multiple-instances/

Struts的LOGIC标签库

Posted by 冰河 at 19:37 3 Responses » 24,747 Views
122010

1.  logic:empty

该标签是用来判断是否为空的。如果为空,该标签体中嵌入的内容就会被处理。该标签用于以下情况:

1)当Java对象为null时;

2)当String对象为”"时;

3)当java.util.Collection对象中的isEmpty()返回true时;

4)当java.util.Map对象中的isEmpty()返回true时。
eg.
<logic:empty   name=”userList”>

</logic:empty>
该句等同于:
if   (userList.isEmpty())   {

}

2.  logic:notEmpty
该标签的应用正好和logic:empty标签相反,略。
3. logic:equal
该标签为等于比较符。
eg1. 比较用户的状态属性是否1,若为1,输出”启用”;
<logic:equal   name=”user”   property=”state”   value=”1″>
启用
</logic:equal>
eg2. 如果上例中的value值是动态获得的,例如需要通过bean:write输出,因struts不支持标签嵌套,可采用EL来解决该问题。
<logic:equal   name=”charge”   property=”num”   value=”${business.num}”>
……
</logic:equal>

4. logic:notEqual
该标签意义 与logic:equal相反,使用方法类似,略。
5. logic:forward
该标签用于实现页面导向,查找配置文件的全局forward。
eg. <logic:forward name=”index”/>
6. logic:greaterEqual
为大于等于比较符。
eg. 当某学生的成绩大于等于90时,输出“优秀”:
<logic:greaterEqual name=”student” property=”score” value=”90″>
优 秀
</logic:greaterEqual>
7. logic:greaterThan
此为大于比较符,使用方法同logic:greaterEqual,略;
8. logic:lessEqual
此为小于等于比较符,使用方法同logic:greaterEqual,略;
9. logic:lessThan
此为小于比较符,使用方法同 logic:greaterEqual,略;
10. logic:match
此 标签比较对象是否相等;
eg1. 检查在request范围内的name属性是否包含”amigo”串:
<logic:match name=”name” scope=”request” value=”amigo”>
<bean:write name=”name”/>中有一个“amigo”串。
</logic:match>
eg2. 检查在request范围内的name属性是否已“amigo”作为起始字符串:
<logic:match name=”name” scope=”request” value=”amigo” location=”start”>
<bean:write name=”name”/>以“amigo”作为起始字符串。
</logic:match>
eg3.
<logic:match header=”user-agent” value=”Windows”>
你运行的是Windows系统
</logic:match>
11.  logic:notMatch

此标签用于比较对象是否不相同,与logic:match意义相反,使用方法类似,略。
12. logic:messagePresent
该标签用于判断ActionMessages/ActionErrors对象是否存在;
eg. 如果存在error信息,将其全部输出:
<logic:messagePresent property=”error”>
<html:messages property=”error” id=”errMsg” >
<bean:write name=”errMsg”/>
</html:messages>
</logic:messagePresent >
13. logic:messagesNotPresent
该标签用于判断ActionMessages/ActionErrors对象是否不存在,使用方法与logic:messagePresent类似,略
14. logic:present
此标签用于判断request对象传递参数是否存在。
eg1. user对象和它的name属性在request中都存在时,输出相应字符串:
<logic:present name=”user” property=”name”>
user对象和该对象的name属性都 存在
</logic:present>
eg2. 若有一个名字为“user”的JavaBean,输出对应字符串:
<logic:present name=”user” >
有一个名字为“user”的JavaBean。
</logic:present>
eg3.
<logic:present header=”user-agent”>
we got a user-agent header.
</logic:present>
15. logic:notPresent
此标签用于判断request对象传递参数是否不存在,意义与了logic:present相反,使用方法类似,略。
16. logic:redirect
该标签用于实现页面转向,可传递参数。
eg1. <logic:redirect href=”http://www.abc.com”/>

17. logic:iterator
用于显示列表为collection的值(List ,ArrayList,HashMap等)。
eg1. 逐一输出用户列表(userlList)中用户的姓名:
<logic:iterate  id=”user” name=”userList”>
<bean:write name=”user” property=”name”/><br>
</logic:iterate>
eg2. 从用户列表中输出从1开始的两个用户的姓名
<logic:iterate  id=”user” name=”userList” indexId=”index”  offset=”1″ length=”2″>
<bean:write name=”index”/>.<bean:write name=”user” property=”name”/><br>
</logic:iterate>
eg3. logic:iterator标签的嵌套举例
<logic:iterate id=”user” indexId=”index” name=”userList”>
<bean:write name=”index”/>. <bean:write name=”user” property=”name”/><br>
<logic:iterate id=”address” name=”user” property=”addressList” length=”3″ offset=”1″>
<bean:write name=”address”/><br>
</logic:iterate>
</logic:iterate>

052010

最近找了个兼职,是维护一个团购网站。老板想抓取其他团购网站的的团购内容。因为许多团购网站本身提供api,所以我只要解析出api返回的xml就行了。下面的php下一种简单的xml处理方法。

1 SimpleXML 简介
要处理XML 文件,有两种传统的处理思路:SAX 和DOM。SAX 基于事件触发机制,
对XML 文件进行一次扫描,完成要进行的处理;DOM 则将整个XML 文件构造为一棵DOM
树,通过对DOM 树的遍历完成处理。这两种方法各有优缺点,SAX 的处理思路相对抽象,
DOM 的处理过程相对烦琐,都不很适合新手的入门。
PHP5 推出了一套新的XML 处理函数,即SimpleXML。名如其实,SimpleXML 本身小
巧精干,只提供了少量的几个方法函数,但用它处理起XML 文件功能却非常强大,操作也
非常的简单。
首先,它提供有简单的函数可以从XML 文档、字符串、或DOM 对象上直接构造出
SimpleXMLElement 对象;其次,SimpleXMLElement 提供有简单的方法可以进行属性、子节
点、和XPath 的操作;然而,SimpleXML 最简单的地方是,它提供有使用标准对象的属性和
对象迭代器进行节点操作的方法,这一处理思路使得用PHP 对XML 文档的处理得到了极大
的简化。
2 SimpleXML 入门示例
下面我们通过一些小的代码片段,稍微了解一下SimpleXML 的强大和简洁。为举例方便,
我们使用一个Messages.xml 文件,里面包含这样一段XML 代码:
Messages.xml

<?xml version=’1.0′ standalone=’yes’?>
<Messages>
<msg id=’1′>
<title>This is Title</title>
<content>Here is Content</content>
<time>2008-03-20 21:50:23</time>
<reply id=’11′>reply 1</reply>
<reply id=’12′>reply 2</reply>
</msg>
</Messages>
这是一篇保存有留言信息的XML 文档,每条信息包括属性id,子节点title、content、time
以及若干条对于它的回复信息,每条回复包括属性id 及回复的内容。
用SimpleXML 处理并输出此XML 文档内容的过程以及方法如下。
(1) 构造SimpleXMLElement 对象
代码片断
$xml = simplexml_load_file(‘Messages.xml’);
如果这段xml 已经被读入到一个字符串$messages 中,则可以使用如下语句:
代码片断
$xml = simplexml_load_string(‘Messages.xml’);
(2)输出留言1 的标题
代码片断
//可以使用属性的方式访问子节点,通过节点的标签名可直接得到节点的内容
echo $xml->msg->title;
(3)输出留言1 的第一条回复信息
代码片断
//同级别的多个同名节点自动成为数组,可以通过索引下标访问其内容
echo $xml->msg->reply[0];
(4)输出留言的id
代码片断
//节点的属性与值被封装成为关联数组的键与值
echo $xml->msg['id'];
(5)输出第二条回复的id
代码片断
//成为二维数组,第一维表示节点,第二维表示属性
echo $xml->msg->reply[1][ 'id'];
(6)依次输出所有回复的id
代码片断
//使用 foreach 对同名节点进行遍历
foreach ($xml->msg->reply as $reply){
echo $reply['id'];
}
(7)使用XPath 检索所有的回复信息
代码片断
//xpath 方法直接检索定位(//表示任意深度)
foreach ($xml->xpath(‘//reply’) as $reply){
echo $reply.’<br>’;
}
(8)遍历留言1 所有的子节点
代码片断
//children 方法得到所有子节点
foreach ($xml->msg->children() as $field){
echo $field.’<br>’;
}
(9)重新设置留言1 的发布时间
代码片断
//直接设置属性
$xml->msg->time = ’2008-03-21 00:53:12′;
(10)设置回复2 的id 属性
代码片断
//设置管理数组的值
$xml->msg->reply[1]['id'] = ’222′;
(11)新增一个描述消息作者的字段
代码片断
//直接设置属性
$xml->msg->author = ‘zhangsan’;
(12)将消息的作者保存为属性
代码片断
//设置关联数组的key
$xml->msg['author'] = ‘zhangsan’;
(13)重新保存对象到文件
代码片断
//保存
$xml->asXML(‘MessagesNew.xml’);

附录:

PHP SimpleXML 函数

PHP:指示支持该函数的最早的 PHP 版本。

函数 描述 PHP
__construct() 创建一个新的 SimpleXMLElement 对象。 5
addAttribute() 给 SimpleXML 元素添加一个属性。 5
addChild() 给 SimpleXML 元素添加一个子元素。 5
asXML() 从 SimpleXML 元素获取 XML 字符串。 5
attributes() 获取 SimpleXML 元素的属性。 5
children() 获取指定节点的子。 5
getDocNamespaces() 获取 XML 文档的命名空间。 5
getName() 获取 SimpleXML 元素的名称。 5
getNamespaces() 从 XML 数据获取命名空间。 5
registerXPathNamespace() 为下一次 XPath 查询创建命名空间语境。 5
simplexml_import_dom() 从 DOM 节点获取 SimpleXMLElement 对象。 5
simplexml_load_file() 从 XML 文档获取 SimpleXMLElement 对象。 5
simplexml_load_string() 从 XML 字符串获取 SimpleXMLElement 对象。 5
xpath() 对 XML 数据运行 XPath 查询。 5

现在我想增加index.htm与index.php为缺省首页,应该如何加?

DirectAdmin、Cpanel控制面板,如何设置网站默认首页index.html htm php的次序?

国外很多带有DirectAdmin、Cpanel面板的空间基本上都是基于Apache Web服务的空间,设置网站默认首页的次序,都可以通过设置.htaccess文件来实现。
在.htaccess文件中添加如下行:

DirectoryIndex index.html index.htm index.php pagename.html

然后将.htaccess文件上传至网站根目录即可。

请按自己的需要更改首页文件读取的次序。

一般php空间默认是index.php为首页:如果网站用index.php做首页,就不需要设置.htaccess

© 2009 - 2024 冰河的博客