Archive for December, 2008


在中国这个大环境下

无论是在国外还是回国了,和别人聊起自己的出路的时候,都会说到自己在国外混几年之后,最终还是要回归故土的。说这些话的时候,可以说并没有过仔细的思考,而只是一种潜意识下的直接反应。很正常,被相对便宜的物价,遍地的美食佳肴,到处的朋友同学,还有丰富多彩的生活所吸引,有这种念头不足为奇。但是有时细心静下来思考一下,发现很多事情真的让人觉得很伤心,心里有脾气却又要强撑着礼貌的面具不能发作,因为你所面对的不是一个人,而是一整个社会。

今天在滴答上看到,两个中国人,一个拿了加拿大的护照,一个拿了加拿大的PR,回国的时候生了小孩,结果中国官方就是不给你发中国护照,说你没有户口,要你小孩回加拿大去办加拿大护照。而如果你没有护照,你小孩又坐不了飞机,又不给你出海关。还有很多类似的故事,说两口子都是高级教授,在美国拿了护照,现在持外国人暂住证在北京任教,生的孩子想让他在北京上学,却没有户口,不能给安排。说每年中关村因为这种留学归国人员的矛盾产生的事情,数不胜数。我就不明白,这其实是一个不太复杂的政策问题,你国家机构就不能很容易的确定一下吗?

一下让我想到了我总是在抱怨的火车晚点问题。我觉得火车时刻表相对而言是最容易安排的,因为很难会遇到所谓的堵车的现象,这样时刻表应该是很容易做到比较精确的,但是为什么现在仍然几乎所有的车都在晚点,而且有时一晚就是一两个小时。比如我每次从汉口坐到襄樊,至少晚点半个小时以上。每次的解释都是要让车,我不明白这个借口从何而出。让车就是因为两列车要抢同一个车道的原因,既然如此,那么在规划时刻表的时候,两俩车的相遇时间应该是很容易估算出来的。要么把这段错车时间计算到时刻表里面去,要么就在合理安排时间让错车的时候不需要等,这应该是相当容易办到的事情,毕竟大部分的时候铁路上都是闲的。可上次,我们这趟车就是为了让车,竟然在旁边停了40分钟。毫无道理。

没有结尾,OVER。

瘪瘪,汤汤和康康

上一次见到瘪瘪是出国前在瘪瘪家里,上一次见到汤汤是在武大的时候,而上一次见到康康都已经是四年前在上海和杭州了。结果就是发现大家变化都不大,都是老样子,四个人在大福源集合后,去了前进电脑城,然后又到钱柜茶餐厅去吃了饭。一边吃一边说晃过去了两三个小时。

时间飞逝,目前都陷入在了全世界的经济危机中和学习工作的牵扰之下,似乎除了瘪瘪这种有闲心的人,还会去听交响乐看话剧外,其余的人都是为自己的前途在搏斗。结束后,除了我还在无所事事,汤汤晚上就回实验室了,瘪瘪是第二天早上要上班,康康放过圣诞假后又要回法国了。

都是些很无厘头的事情,但是发现人都长大了,想的和做的都不一样了,貌似就我一个人还没长大。还在为无味的英语考试而准备。等熬过去了这段日子,一定要好好地休息一下,好好的享受一下。

iBatis学习记录(4)

今天主要的研究是关于ibatis的DAO。DAO全名是Data Access Object,有它的存在解决了数据库使用中的一个问题,就是如何面对不同的数据库资源进行相同的处理。在DAO下,规定了数据库操作的接口,于是面对不同的数据库资源,只需要分别实现相关接口就可以。提供接口API给用户能是用户更加方便的操作数据库,减少麻烦,避免一些可以避免的错误。

在使用之前,必须下载ibatis的dao包,因为在直接下载的ibatis包中是不含dao部分的。下载页面的右下角就有下载。

首先,来看一下ibatis的DAO结构,其核心就在一个dao.xml配置文件中。
<daoConfig>
<context id=”sqlmap”>
<transactionManager type=”SQLMAP”>
<property name=”SqlMapConfigResource” value=”com/featheast/daobasic/SqlMapConfig.xml”/>
</transactionManager>
<dao interface=”com.featheast.daobasic.UserDao”
implementation=”com.featheast.daobasic.UserDaoImpl”/>
</context>
</daoConfig>
在这个配置文件中,定义了当前的上下文环境,使用的TransactionManager,这个可以直接使用前面已经用过的manager,以及相对应的一组dao接口和实现类。很直观简洁。所有的DAO都是围绕着这个配置文件展开的。

接口定义了需要操作的方法,如下所示,基本包含了常见的CRUD方法:
public interface UserDao {
public void insert(UserBean user);
public void update(UserBean user);
public int delete(UserBean user);
public int delete(Integer id);
public List<UserBean> getUserList(UserBean user);
public List<Map<String, Object>> getMapList(UserBean user);
public UserBean getById(Integer id);
public UserBean getUser(UserBean user);
}

然后仍然是按照前面的定义SqlMapConfig.xml 和 SqlMap.xml,分别管理transactionManager和sql映射。

最后就是完成实现接口类:
public class UserDaoImpl extends SqlMapDaoTemplate implements UserDao {
public UserDaoImpl(DaoManager daoManager){
super(daoManager);
}
public int delete(UserBean user) {
// TODO Auto-generated method stub
return delete(user.getId());
}
public int delete(Integer id) {
// TODO Auto-generated method stub
return delete(”UserBean.delete”,id);
}
public UserBean getById(Integer id) {
// TODO Auto-generated method stub
return (UserBean)queryForObject(”UserBean.getById”,id);
}
public List<Map<String, Object>> getMapList(UserBean user) {
// TODO Auto-generated method stub
return queryForList(”UserBean.getMapList”,user);
}
public UserBean getUser(UserBean user) {
// TODO Auto-generated method stub
return null;
}
public List<UserBean> getUserList(UserBean user) {
// TODO Auto-generated method stub
return queryForList(”UserBean.getUserList”,user);
}
public void insert(UserBean user) {
// TODO Auto-generated method stub
insert(”UserBean.insert”,user);
}
public void update(UserBean user) {
// TODO Auto-generated method stub
update(”UserBean.update”,user);
}
}
首先要注意的是该类扩展了SqlMapDaoTemplate,这就可以直接在该类中调用常见的数据库操作方法而不需要生成一个SqlClient的实例。

最后是测试类:
public static void main(String[] args) {
// TODO Auto-generated method stub
DaoManager manager=GetDaoManager.getDaoManager();
//UserDaoImpl impl=new UserDaoImpl(manager);
UserDao impl=(UserDao)manager.getDao(UserDao.class);
System.out.println(impl.delete(108));
//System.out.println(impl.getById(108));
UserBean user=new UserBean();
user.setDay(”7″);
user.setEmail(”123@123.com“);
user.setMonth(”1″);
user.setName(”fea”);
user.setPwd(”123″);
user.setQq(”222″);
user.setUid(”fea”);
user.setYear(”1000″);
impl.insert(user);
}
其中有很重要的一点要注意的,就是在初始化impl的时候,不能直接使用构造函数,不然就会在后面出现NEP报错,地点应该是在getTransaction()方法中,第108行。这个问题花了我半个小时,最后才在Goolge上找到一个人出了同样的问题,用UserDao impl=(UserDao)manager.getDao(UserDao.class);这个方法解决的。

iBatis学习记录(3)

在ibatis中,会发现其输入参数只能有一个,于是当出现需要进行多个输入参数的时候,就要想点办法了,我看到的有以下两种比较好的方法能够解决这个问题
1) 用String代替
<select id=”checkLogin” parameterClass=”java.lang.String” resultClass=”java.lang.Integer”>
SELECT count(*) AS value FROM userinfo WHERE $sql$
</select>
比如如上的map statement代码中,将输入的参数设置为String类型,而在select语句中直接使用该String,于是用户可以在Java程序代码中手工植入需要匹配的参数。

String sql = “uid = ‘” + username + “‘ and pwd=’” + password + “‘”;
Integer r = (Integer) sqlMap.queryForObject(”checkLogin”, sql);

这个方法很简单,但是弊端也很多。首先得需要用户自己手动写sql语句代码在java中,这与ibatis的本质要将数据层的操作和业务逻辑操作分隔开来是违背的。其次,这个办法可能会被利用造成sql injection的问题。比如在sql语句的最后加上一句;drop some table。这样的结果显而易见,就是灾难性的。

2)用 Map
<select id=”checkLogin2″ parameterClass=”java.util.Map” resultClass=”java.lang.Integer”>
SELECT count(*) AS value FROM userinfo WHERE uid=#uid# and pwd=#pwd#
</select>

这种办法显得要清楚的很多,也不需要自己手动编写sql到java之中。
Map map=new HashMap();
map.put(”uid”, username);
map.put(”pwd”, password);
Integer r = (Integer) sqlMap.queryForObject(”checkLogin2″, map);

在java中首先生成需要的map,然后作为输入参数传入即可。这个方法应该是比较好的,值得推荐。

3)也有人采用根据需要编写javaBean的方法,但是这个方法的弊病在于如果你的逻辑操作涉及到很多的不同的属性的组合,你就会浪费很多资源去生成各种各样的bean。

iBatis学习记录(2)

今天主要对iBatis的各种SQL语句进行了一些测试,iBatis的query一共有三种形式,分别是queryForObject, queryForList, queryForMap

queryForObject返回的是一个一个单独的实例,queryForList返回的是一组实例,而queryForMap返回一个映射表

在使用这三个方法之前,首先需要在SqlMap文件中配置好相关的resultMap,这样才能将结果集顺利返回。也就是说,必须需要一个javaBean存在,然后是一个resultMap:

  1. # <resultMap id=“UserBeanMap” class=“com.featheast.chap4.UserBean”>
  2. # <result property=“id” column=“id”/>
  3. # <result property=“uid” column=“uid”/>
  4. # <result property=“pwd” column=“pwd”/>
  5. # <result property=“email” column=“email”/>
  6. # <result property=“name” column=“name”/>
  7. # <result property=“qq” column=“qq”/>
  8. # <result property=“year” column=“year”/>
  9. # <result property=“month” column=“month”/>
  10. # <result property=“day” column=“day”/>
  11. # </resultMap>

比如如上是一个UserBean的resultMap,它包含了这个bean中的所有的属性,并且对应到了数据库表中的列。

1).queryForObject:

代码看上去是很简单的,下面是按照ID取出唯一的一个user元素

如果你试图返回一个多行的值到Object中,程序就会报错Error: executeQueryForObject returned too many results

2).queryForList:

在前面的一篇文章中已经采用了queryForList来作为实验。其实看看第一部分的代码,需要改的地方其实就是把函数名改为queryForList,然后取出各个List就好了。道理是一样的。

3).queryForMap:

唯一需要改变的地方就是要讲resultMap中的class改换为java.util.HashMap,其余的都可以按照正常的方法向下进行,的确非常易懂。

2.insert:

相比较select的复杂而言,insert就简单的多了,几乎和jdbc中一样,直接套用上去就可以了。下面给出一个例子:

  1. <insert id=“insertUser”>
  2. INSERT INTO userinfo(
  3. uid,pwd,email,name,qq,year,month,day
  4. )VALUES(
  5. #uid:VARCHAR#,#pwd:VARCHAR#,#email:VARCHAR#,#name:VARCHAR#,#qq:VARCHAR#,#year:VARCHAR#,#month:VARCHAR#,#day:VARCHAR#
  6. )
  7. </insert>

以上是sql的map结果,是不是和JDBC一样呢。然后在JAVA中的调用:

  1. UserBean user=new UserBean();
  2. user.setDay(“31111″);
  3. user.setEmail(“featheast@123.com111″);
  4. user.setMonth(“10111″);
  5. user.setName(“featheast111″);
  6. user.setPwd(“123456111″);
  7. user.setQq(“30003000111″);
  8. user.setUid(“featheast111″);
  9. user.setYear(“2008111″);
  10. sqlMap.insert(“insertUser”,user);

如果觉得每次都得在sqlmap中写得太多而繁琐的话可以用一个parametermap来代替

  1. <parameterMap class=“com.featheast.chap4.UserBean” id=“insertUserMap”>
  2. <parameter property=“uid” jdbcType=“VARCHAR”/>
  3. <parameter property=“pwd” jdbcType=“VARCHAR”/>
  4. <parameter property=“email” jdbcType=“VARCHAR”/>
  5. <parameter property=“name” jdbcType=“VARCHAR”/>
  6. <parameter property=“qq” jdbcType=“VARCHAR”/>
  7. <parameter property=“year” jdbcType=“VARCHAR”/>
  8. <parameter property=“month” jdbcType=“VARCHAR”/>
  9. <parameter property=“day” jdbcType=“VARCHAR”/>
  10. </parameterMap>

如果你的数据库中有自动增长列那么就把那一列在添加的语句中空出来就可以了。系统会自动补上的。

iBatis学习记录(1)–转自以前的新浪博客

这一两个星期是学期结束的时候,也是各个项目交的时候,于是大忙特忙之下,人的身体状况也不佳。而且为了machine learning,还熬了在墨尔本的第一次夜。直到现在都还没怎么缓过来。还好,现在闲下来了,离考试时间还有三个星期,闲暇之余,去图书馆逛了逛,看到了这本崭新的iBatis in Action。很早就听说过这个持久层的框架,一般来说在你听说到Hibernate的时候,iBatis这个名字也会冒出来。一直都觉得 hibernate才是这一层里最有用的东西,就没有关心过太多iBatis,但这次看到了这本书,感觉上心动了一下,想想这几天也没什么事,书也不厚,就借回来看看好了。于是就这样开始了我的iBatis的学习路程。

目前看了前面的三章,用eclipse小试了一把,感觉这玩意的确很小巧实在。使用很容易,不用像其他的大型框架配置半天,它就只有一个jar,大小才376K,里面就包括了所有的东西了。这点是最吸引我的地方,毕竟小嘛,操作容易,上手也快。的确写起来很快,虽然我目前只做了一个很小的select的实验。对于真正的JAVA调用代码,其实就只有四行:

  1. try{
  2. String resource=“com/featheast/chap2/SqlMapConfig.xml”;
  3. Reader reader=Resources.getResourceAsReader(resource);
  4. SqlMapClient sqlMap=SqlMapClientBuilder.buildSqlMapClient(reader);
  5. List list=sqlMap.queryForList(“getAllUsers”,“1″);
  6. System.out.println(“Selected ”+list.size()+“ records.”);
  7. for(int i=0;i<list.size();i++){
  8. System.out.println(list.get(i));
  9. }
  10. }catch(Exception e){
  11. e.printStackTrace();
  12. }
  13. }

第一行是申明了你的sqlMapConfiguration文件的位置,第二行是读入这个配置文件,第三行是用这个文件生成sqlMap,最后一行就是调用其中的各种方法了。这样看来如果把配置文件给写好了的话,前面的JAVA简直就是太小儿科了。

回头来看看它的配置文件。分为两种,一种就是上面提到的sqlMapConfiguration,这是整个程序的全局配置地点。包括了你的数据库的驱动,地址,用户名,密码等等这些常用的connection参数:

  1. <sqlMapConfig>
  2. <properties resource=“com/featheast/chap2/db.properties”/>
  3. <transactionManager type=“JDBC”>
  4. <dataSource type=“SIMPLE”>
  5. <property name=“JDBC.Driver”
  6. value=“${driver}”/>
  7. <property name=“JDBC.ConnectionURL”
  8. value=“${url}”/>
  9. <property name=“JDBC.Username”
  10. value=“${user}”/>
  11. <property name=“JDBC.Password”
  12. value=“${password}”/>
  13. </dataSource>
  14. </transactionManager>
  15. <sqlMap resource=“com/featheast/chap2/SqlMap.xml”/>
  16. </sqlMapConfig>

上面这段代码就是一个简单的实例,其中的值是在properties文件中。可以看到非常直观易懂。如果你会JDBC,就没有什么好解释的了。如果你不懂,估计看了你也知道一二了。

接下来的关键部分就是上面这段代码中的sqlMap,这就是iBatis的核心部分,讲数据库的sql语句如何MAP到OO上来。

  1. <sqlMap>
  2. <select id=“getAllUsers” parameterClass=“string” resultClass=“hashmap”>
  3. SELECT * FROM userinfo WHERE month = #monthId#
  4. </select>
  5. </sqlMap>

看了以后也觉得非常的容易,不就是一个select语句被包在一个select的标签里吗。iBatis将sql语句划分为了input和output两部分,在上面这个语句中,你要输入的monthid就是input,得到的结果*就是output,返回的是一个hashmap。那么在java程序中就可以直接调用这些hashmap了。其实更好的是能够写出对应的返回值的bean,这样操作起来更加规范一些。

有一个小小的问题就是目前来说,这些XML配置文件的代码都得自己手写,于是这也就造成了会写错的地方,特别是DOCTYPE部分,下午我自己写的时候,就是在这里抄错了一个标点符号和多写了一个字母,结果BAIDU来GOOGLE去,都解决不了问题,最终还是发现了这点点的敲击键盘错误。要是以后eclipse能自动生成配置文件格式并检验就好了。我个人觉得现在应该也有了这种插件吧,还是明天再研究研究。

以上所列出的就是第一天学习的iBatis的一点点总结。很基础,每一个模块都还有很多东西要深究,这也就是后面几章要讲的内容。就我个人看来,iBatis相当于就是一个半自动化的ORM工具,毕竟各种SQL 语句还是得自己写,但是他能够将其MAP到OO,也算是一种很基础的封装,的确比直接调用JDBC显得要模式清楚的多。所以对于JDBC很熟悉的人来说,看这些东西真的是很容易的一件事。而且再次说的是,iBatis真的是小巧,和Hibernate比起来呵呵。不过自然hibernate有它的强大之处,打算等假期结束了,再重新回头来看一次Hibernate,也许会有更多的收货。

PS:iBatis还可以在.net上运行,现在是月底,网速没有了,明天到学校去下一个.net版本的跑跑C#看效果如何。

介绍一个听广播的软件

在国内的时候,如果还想听国外的广播该怎么办?

有个软件叫龙卷风网络收音机,目前来看,可以收到的频道那可是相当之多,至少澳大利亚的可以收到10个以上的台。而且速度不错,也非常清楚,而且还可以下个绿色版本的,才1.8M。

其实最重要的是可以练习英语,听广播绝对是练听力的极好办法。

The Elements of Style

这是一本很经典的英语教材,在很多地方都有很多版本的翻译,主要介绍的是英语写作上经常会出现的问题和要避免的问题。这本书是上个实际10年代的作品,快100岁了,虽然有部分地方的确用词有些陈旧,但是大部分的内容都是十分好的。无论是作为自己学习写作,熟悉英文书写方式,还是像我这样为一个月以后的雅思考试而发愁的人来说,都是很大的帮助。

以下是一些学习笔记,其实基本上也就是半翻译半理解的状态。花了一个上午扫尽这本书,还有更多需要慢慢体会的。有不少内容写的可能都有问题,略之。

需要下载的朋友可以到百度上搜一下,遍地都是PDF的格式,内容不多,50多页纸,半天最多的话一天就可以看完,收货应该还是不错的。

基础用法:
1. 名词所有格的用法:
无论名词以何辅音结尾,均直接加上’s,如
Charles’s friend, Burns’s poems, the witch’s malice
这是美国政府打印办公室和牛津出版社的用法。
例外出现在一些很古老的单词中,比如Jesus’等。而对Achilles’ heel, Moses’ laws, Isis’ temple 则一般用of 结构表示。
对于代词its, hers, theirs等没有加’这一用法

2. 在三个或者三个以上的措词的连接中,每一个措词之间用逗号隔开,除了最后一个。
red, white, and blue
honest, energetic, and headstrong
He opened the letter, read it and made a note of its contents.
在一些商业公司的连续下,可以把最后一个逗号省略
Brown, Shipley and Company
省略词etc.,即使前面只有一个单独的成分,也需要在前面加上逗号

3. 用逗号把附加语句隔开
The best way to see a country, unless you are pressed for time, is to travel on foot.
这个规则有的时候会比较难以判断,比如是否将however或者一个简单的词组看做是附加成分。如果这个插入对语句的流畅性的打断存在但是非常轻微,逗号可以省略,其他情况下一定需要逗号。
非限定性的以which开头的关系从句,需要逗号隔开。
The audience, which had at first been indifferent, became more and more interested.
类似的一样用法在where和when语句中。
限定性的关系从句不需要用逗号隔开。

4. 在and和but前加上逗号,当引入一个非独立的语句时
The early records of the city have disappeared, and the story of its first years can no longer be reconstructed.
The situation is perilous, but there is still one chance of escape.
同样的在as, for, or, nor, 以及while的类似句式中,也用逗号隔开。

5. 不要用逗号分开相关的从句。
如果两个句子是相互独立,语法完整并且没有用连词连接,则用分号分割开。
Stevenson’s romances are entertaining; they are full of exciting adventures.
It is nearly half past five; we cannot reach town before dark.
当然也可以将他们写成两个单独句子,用句号分开。
如果第二个句子是用以下副词开头,accordingly, besides, so, then, therefore, or thus,并且没有连词,那么分号是必须的。
I had never been in the place before; so I had difficulty in finding my way about.
一般情况下尽量避免用so,不然很容易会使得so在文章中出现的次数太多。这种情况下,第一个句子用as开头来代替。
As I had never been in the place before, I had difficulty in finding my way about.
6. 不要将一个句子分开成两个。
换句话说,不要用句号取代逗号的功能。

7. 在句子开始部分的分词短语必须是指向语法上的主语。
Walking slowly down the road, he saw a woman accompanied by two children.
单词walking指的是这个句子的主语he而不是a woman。如果作者想指向的是a woman,句子需要改写为:
He saw a woman, accompanied by two children, walking slowly down the road.
用连词,介词,名词同位语,副词和副词从句下引出的分词短语同样遵守这个规则。

8. 在一行末端写不下一整个单词的时候,用-分开。
按照组成和读音分开,不要只留下一个或者两个字母在另一行开始。

文章的基本原则
9. 使每一个段落成为一篇文章的一个单元,每一个段落指向一个主题。
同样作为原则,一个单独的句子不应该被写为一个段落。在对话中,每一次说话人的转折就另起一段。

10. 作为一个原则,在每一段的开头概括的说这段话的意思,结尾进行呼应。
用一个离题的或者不重要的细节作为结尾是应该避免的。
如果该段落与前面的段落有联系,应该在开头加以表明。可以使用一个简单的连接词如,again, therefore, for the same reason。 有时候用一到两个句子来引入也是可以接受的,如果有更多的句子需要引入,则最好用一个单独的段落。

11. 主动语态有的时候比被动语态更加直接有力。
I shall always remember my first visit to Boston.
My first visit to Boston will always be remembered by me.
第一个句子就比第二个句子要好,更加直接,更加醒目,并且更加简洁。
有时候,可以将被动语态转化为词组形式效果更好,比如:
There were a great number of dead leaves lying on the ground.
Dead leaves covered the ground.
The sound of the falls could still be heard.
The sound of the falls still reached our ears.
The reason that he left college was that his health became impaired.
Failing health compelled him to leave college.
It was not long before that he was very sorry that he had said what he had.
He soon repented his words.
尽量避免以下两种句式结构出现被动+被动和名词+of+名词+被动。如:
Gold was not allowed to be exported.
A survey of this region was made in 1900.

12. 用直接的肯定语句来表达声明。
避免使用温顺的,无色的,犹豫的,不肯定的语言。用not在否定句中,而不要用在逃避的语句中。
He was not very often on time.
He usually came late.
He did not think that studying Latin was much use.
He thought the study of Latin unless.
读者更愿意看到的是肯定的内容而非不是什么的内容。以下的几种表达用肯定形式更好:
not honest – dishonest, not important – trifling, did not remember – forgot, did not pay any attention to – ignored, did not have much confidence in – distrusted

13. 省略掉没有作用的单词
the question as to whether – whether, there is no doubt but that – no doubt, used for fuel purposes – used for fuel, he is a man who – he, in a hasty manner – hastily, this is a subject which – this subject, his story is a strange one – his story is strange.
owing to the fact that – since, in spite of the fact that – though, call your attention to the fact that – remind you, i was unaware of the fact that – i was unaware that, the fact that he had not succeeded – his failure, the fact that i had arrived – my arrival
His brother, who is a member of the same firm
His brother, a member of the same firm
Trafalgar, which was Nelson’s last battle
Trafalgar, Nelson’s last battle

14. 避免使用一系列的散尾句
如***, and ***. ***, but ***. ***, when ***.类型句式连续出现。

15. 在并列的句式中,保持句子格式一致,用词方式一致

16. 将相关的词组放在一起。

17. 在总结部分,使用同一个时态。

18. 把强调的词,放在句子的尾部。

其他的一些点:
1. 标题: 在标题后空一行。在随后的页面中,从第一行开始写。
2. 数字: 不需要写出其拼写格式,如August 9, 1918
3. 括号: 里面的内容是应该可以完全忽略掉的。最后的结束标点应该在反括号前。
4. 引号: 在标准的文档里,应该用冒号起头,如:
The provision of the Constitution is:”*****************.”
一个人说的话,用逗号开始
Aristotle says, ”Art is an imitation of nature.”
在一个多行的引用中,应该将另起一行,空格开始,不需要引号:
Wordsworth’s enthusiasm for the Revolution was at first unbounded:
Bliss was it in that dawn to be alive,
But to be young was very heaven.

一些经常用错的表达方式
All right 一般使用在口语中,在书面中尽量避免。
As good or better than 如此表达的句式一般要改换为*** us as good as **, or better.
As to whether 只需要使用whether
Case 一般情况下这个词没有什么作用,是不需要的
Certainly 写作中尽量避免
Character 经常被多余使用,如acts f a hostile character – hostile acts
Claim 在使用claimed that 的时候,尽量用claimed to be代替
Compare 区别compare to和compare with,前者是和不同的事物比较,后者更多和同样的事物比较。
Clever 一般被夸大使用了,最好限制在很小的事情上
Consider 它的意思是检查或者讨论,而不是一般所认为的believe to be.
Dependable 没有用的代替对reliable, trustworthy
Due to 错误的被用作because of 看做是副词,应该被应作是标语或者特定名词的修改词
Effect 作为名词的时候,经常不准确地被草率的用在时尚,音乐,绘画中。
Etc. 不能被用在人之上。在一个介绍行的短语之后作为结尾也是不正确的。
Fact 只能用在肯定绝对的事情之中,而不能用在主观判断之上。
Factor 一个很陈旧的词语,经常可以用其他的表示取代。
Feature 同样也是一个陈旧的词语。
Fix 避免在口语中的含义。
He is a man who 一个普遍的冗余句式
However 作为转折的时候,不要放在句子开头部分。当它开头使用的时候,意思是无论如何或者不管怎样。
Kind of 不能用作是rather的替代。
Less 注意不要和fewer混淆。less指的是quantity,fewer指的是number。
Line, alone there lines. 避免使用
Literal, literally 避免使用
Lose out 看上去比lose更强调,实际上正好相反。
Most 不能被视为almost。
Nature 被冗余使用。
Near by 尽量使用neighboring替代,不是一个很被接受的词组。
oftentimes, ofttimes 用often代替
One hundred and one 其中and 必须使用
One of the most 不要在句子开头用one of the most ****,没有任何意义
People 不要和数量用在一起,如4 people,应该使用person
Phase 是步骤的意思,而不是方面或者话题
Possess 不能被用作是have或者own的替代
Respective, respectively 在正式的文章中没有必要使用。
So 避免在文章中使用如so good
Sort of 同kind of
State 仅仅只在完全清晰的表达时使用
Student body 只需要使用students
System 冗余
Thanking you in advance 不需要in advance
They 使用he来代替当用在复数指代的时候,除非先行词必须是女性
Very 尽量避免使用
Viewpoint 使用point of view
While 避免将其当作and和but使用。尽量将其用作处于某一个时间这个意思用。
Whom 经常和who混淆
Worth while 不能将其使用在名词之前
Would 用should而不要用would。

推荐几个技术博客

这些都是我收藏在GOOGLE REALDER里面的几个,其实也不一定就是完全的技术博客,也许还包括一些作者的生活,不过内容都挺丰富的,作为搞CS的,多了解一下身边的事情还是很有必要的。

1. 4G Space: http://blog.youxu.info/
大名鼎鼎的编程珠玑应该很多人都知道,不知道的话上上CSDN的主页,一般都是会被推荐的。作者Eric是留美在读博士,年龄和我们相差无几,应该说有很多值得参考的地方。最为感叹的是,作者在读本科期间,通读了南京大学图书馆CS/EE架上的所有图书。

2. AW: http://www.awflasher.com/blog
HUST/EE毕业的牛人,最初是在校内上发现其人,然后追踪到博客,发现了其在互联网领域的广阔天下。在目前来看,PR能打到六分的个人博客真的是相当难得。关注互联网领域,关注web2.0,很多最新的消息都可以从他这直接获得,更关键的是同为HUST毕业的,自豪一把。

3. 阿朱:http://blog.csdn.net/david_lv/
如果关注CSDN的人肯定知道今年有本书很火叫做走出软件作坊,阿朱也就是该文的作者。作为一个在IT圈比较有资历的人来,看东西看的角度往往更高一些,对于我们这些初级阶段的开始者,适当的开阔一下眼界还是极为重要的。

4. 云风的博客: http://blog.codingnow.com/
从其域名就可以看出来其对编程的热爱,文笔很好,谈到了很多自己在工作中的体会。

PHP学习记录(4)

PHP的调试

要打开PHP的调试功能,需要在代码中加入下面一段:

ini_set(‘display_errors’, 1);

对于PHP的出错显示,大致上有三种级别:

1)通知级别,不停止代码的执行,并不会一定带来出错

2)警告,提示有问题出现,但是不停止代码执行

3)错误,停止代码执行

error_reporting(0)将会停止显示任何出错

使用@在函数上或者数学操作上,可以将错误掩盖,而继续执行下面的代码

一般情况下,如果打开了错误显示,并且错误被捕捉到,PHP将会打印出这些错误在一个简单的HTML表单中。可以使用set_error_handler(‘report_errors’)来覆盖处理出错的方式,其中的参数是一个自定义的函数。在使用自定义的错误处理时,ini_set()error_reporting()都将失去作用。

可以使用error_log(message, type, destination, extra headers)来记录错误日志,其中type0是系统默认日志,为1是邮件日志,2是远程调试日志,3是文件日志。

Older Entries
  • English Version

    • Cannot read Chinese? Please take a look at my English site, hope you can find more you need there!
  • 感谢支持

  • twitter

    facebook

    linkedin

  • Categories