2005年8月的归档

资治通鉴.笔记(1)

| | Comments(0) | TrackBacks(0)
  魏置相,相田文。吴起不悦,谓田文曰:“请与子论功,可乎?”田文曰:“可。”起曰:“将三军,使士卒乐死,敌国不敢谋,子孰与起?”文曰:“不如子。”起曰:“治百官,亲万民,实府库,子孰与起?”文曰:“不如子。”起曰:“守西河而秦兵不敢东乡,韩、赵宾从,子孰与起?”文曰:“不如子。”起曰:“此三者子皆出吾下,而位加吾上,何也?”文曰:“主少国疑,大臣未附,百姓不信,方是之时,属之子乎,属之我乎?”起默然良久,曰:“属之子矣。”

通过私有构造函数强化不可实例化的能力

这种事,我想很多人都干过,包括以前的我:在JAVA里,新建一个类,然后写一大堆public+static函数,接下来就是在别的类里疯狂调用这些函数。
  虽然这是个不好的习惯,但有时,你可能又不得不建一个这样的类,因为确实有些类必须有这个动作,而又不适合做个接口。

  这样的类,是没有必要实例化的,更不能把它做为抽象类去建立他,那只会给人以这个类可以被继承的错觉。
 

 // Noninstantiable utility class
 public class UtilityClass {

 // Suppress default constructor for noninstantiability
  private UtilityClass() {
     // This constructor will never be invoked
  }
  ...  // Remainder omitted
 }

 所以,我们把这种类的构造函数声明为private的,这样就保证了不会为其它类所继承,或创建实例。

刚刚知道这个消息,深深悼念... ...

数据库同步

| | Comments(0) | TrackBacks(2)
  上个星期经朋友介绍到百度去试一个职位,其间那部门主管问了我一个关于数据同步的问题,我曾经看同事用过,但还没有自己真正试过,于是回来后,自己尝试了一下,查阅了一些英文文档,最终在两台oracle数据库之间测试成功,下面就总结一下吧:
需求:
现有两台oracle数据库服务器A和B(A,B可以是在同一内网,也可以是在互联网上的两台独立机器)。A和B里有都有testable表,结构一样,现需要当A库中的testable表变化时,B库里的testable也相应变化数据

我的解决方案:
在A中建立到B库的链接,然后对要同步的表做一个同义synonym,最后建一个触发器,就可以完成了。当然,你所用的当前的用户要有相应的权限去执行这些操作。

当从A向B同步数据时,应该在A上做所有的设置:
1,为保证连接到另一台远程服务器的数据库,你需要建立一个DB Link,但是,这里要注意语法格式,using +"connect string",这个connect string应该是存在于oracle服务器的TNSNAMES.ORA文件里,监听程序将从这里获取远方服务器
的ip地址等信息,我定义了一个'251'的connect string如下:

251 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.251)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mychoice)
)
)
把它存到你的TNSNAMES.ORA文件里。

2,然后就可以定义DB Link了:

create public database link TEST2.US.ORACLE.COM
connect to 用户名
identified by "密码"
using '251';

3,建立synonym(同义)

create or replace synonym TEST01
for MYCHOICE.TESTABLE@TEST2.US.ORACLE.COM;

建立完了以后,你可以通过:
select * from test01
上面的语句相当于在B服务器上执行:
select * from testable 

4,封建触发器:
当A中的testable表变化时(这里只考虑插入操作),就会触发向远程的B库的testable也插入相应的数据:

create or replace trigger rtest
after insert on testable
for each row
begin

insert into test01 (something) values (:new.something);
end;

ok,现在我们可以测试一下,你在A库中往testable表中插入一条记录,看看B库中是不是也相应的增加了,呵,开瓶82年的红酒庆祝......

去年冬天

| | Comments(0) | TrackBacks(0)
  晚上在家事理以前拍过的一些照片,找到了这两张雪后的随手拍。
  这是在我住的楼下,我每天就是在这里等车去地铁。
  晚上,又回到这里,不知哪一天会离开。


oracle触发器

| | Comments(0) | TrackBacks(2)
  最近正在把一个开源的论坛代码和公司的网站做整合,其中涉及到两个系统的数据库的相互关联。如果把论坛的数据库和现有网站的后台数据库整合,将会对整个论坛的代码或是原网站的库做很大的改动,但要在短时间内完成整合,可以采取触发器将两个系统的库连r来,这样两边看似独立,却被紧密的关联在一起。
  下面就是我写的那个触发器,在oracle9i下,关健是把两者的会员表关联起来,只要有增,删,改操作,就会触发另一库的相关操作:
create or replace trigger bbsmember2_trig_autoinc
after insert or update or delete on members
for each row
begin
 case
 when inserting then
 insert into bbsmember (memberid,memberpassword,memberemail,membername) values (: new .userid,: new .psw,: new .email,: new .username);
 when updating then
  if (: new .psw is not null ) then
   update bbsmember set memberpassword=: new .psw where memberid=: new .userid;
  end if ;

  if (: new .email is not null ) then
   update bbsmember set memberemail=: new .email where memberid=: new .userid;
  end if ;

 when deleting then
  delete from bbsmember where memberid=: old .userid;
 end case ;
end ;
  她是我面试进来的,结果却是我去通知她明天不用来了... ...
  其实她是一名非常好的员工,只是部门要调整,老总有老总的想法,只是开人,是我能想到的最坏的结果。
  做为部门经理,我是尽量去培养每个员工,但事实上我并不能总是一个好好人,公司是要利润的毕竟不是福利机构,老总只会留下他觉得合适的人。当然,如果有一天我当了老板,我也许也会这样。
  这就是现实了,总会有些无奈。
  但大家还是朋友,真心希望你能找到一份更适合你的工作,努力吧。
See the rain, see the rain fall down
See the rain, see the rain fall down
仍记起春眠不觉哓 处处闻啼鸟
轻叹夜来风雨声 花落知多少
匆匆岁月年头过 茫茫人海你和我
太多太多太颠簸 真太多
叹奈何太多 大半生的奔波 大半生的风波
令困扰增多
渐朦胧 犹如梦幻似烟花 太虚假
如烟花的奢华 消逝的芳华

Even if rain, even if the rain falls down
Life is full of memories
We won~t let them wash away
Even if the rain, even if the rain falls down
The sun will always shine on you and me
even even if the rain

回味我往昔光辉 回味我放淤心底
回望我逝去的东西 回望我往昔的一切一切
岁月如风 往昔去匆匆
已失了芳踪 看不见西与东
逝去风 再冲 认真 阴公
个个起势冲呀冲 掉低我呢个老公公
阿女凑紧老公 我个仔要返工
白头翁 老翁 发也野嗡风
明明简简单单 却会兜兜转转

心中偏偏反反复复 更会蹦蹦波波风雨中
短叹长嗟 得快乐时且快乐些
只渴望 你每天爱我多一点

仍记起春眠不觉哓 处处闻啼鸟
轻叹夜来风雨声 花落知多少
谁能够无欲无求 冲出天空宇宙
谁能够少欲随缘 静静看天边星宿

大街上有秋天的味道

| | Comments(0) | TrackBacks(0)
  开完部门经理会是19:30了。
  想想周末终于可以休息了,兴奋ing。北京的大街上已经有了少许秋天的味道了,我可以感觉到。
  一路公交车到公文坟,就接到了公司运营经理的电话,原来老总心急,想让我们周末加班做电子周刊,唉,刚兴奋周末可以好好休息,真是大喜之后是大悲呀。
  如果工作能在计划内完成,我是不会安排部门的员工加班的,但老总的心总是比常人要急。
  当一件事你觉得不合理时,要么去改变它,要么,去接受它。

关于”User-Agent”

| | Comments(0) | TrackBacks(0)
  Of all the headers sent by the browser, the User-Agent header is probably the most useful because it indicates what kind of browser is making the request. Oddly, both Netscape and Internet Explorer identify themselves as Mozilla, which was the nickname for the early Netscape browser. (There is now a browser called Mozilla, which was born from the code for Netscape 5.)

  In case you're wondering where the name Mozilla came from, Netscape was founded by the folks who wrote the old Mosaic Web browser. Netscape Navigator was intended to be a monstrous version of Mosaic: the Godzilla Mosaic, or Mozilla.

  When Internet Explorer (IE) first came out, it lagged behind Netscape in usage, and gradually added features to become a reasonable alternative by the time IE version 3 came along. By identifying itself as Mozilla-compatible, IE is telling the Web server that it can handle anything Mozilla can.

  If you want to figure out whether the browser is Netscape or IE, only IE sends the MSIE string as part of its User-Agent header. Thus, you can do the following test in your JSP or servlet:
if (request.getHeader("USER-AGENT"). indexOf("MSIE") >= 0)
{
// do Internet Explorer specific stuff here
}
else
{
// do Netscape specific stuff here
}

  You can perform similar tests to detect other browsers, such as Opera.
  研究到这里,其实到底USER-AGENT包含哪些元素,自己还不是太清楚,于是写了下面的代码来查看所有的文件头里都有什么:
  Enumeration temp=request.getHeaderNames();
  while (temp.hasMoreElements()){  
  String paramName = (String) temp.nextElement();
  out.print(paramName+"=");
  out.println(request.getHeader(paramName)+"<br>");
}
  在IE浏览器中得到的是:
Accept=*/*
Accept-Language=zh-cn
Accept-Encoding=gzip, deflate
User-Agent=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; Alexa Toolbar)
Host=localhost:8080
Connection=Keep-Alive
Cookie=JSESSIONID=1zxeFTZUY1grAeAi

  在Firefox中得到的是:
Host=localhost:8080
User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
Accept=text/xml,application/xml,application/xhtml+xml,text/html;
q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language=zh-cn,zh;q=0.5
Accept-Encoding=gzip,deflate
Accept-Charset=gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive=300
Connection=keep-alive
Cookie=JSESSIONID=3wYp8TfGUnbgfxAi
Cache-Control=max-age=0

  在Opera中得到的是:
User-Agent=Opera/8.01 (Windows NT 5.1; U; zh-cn)
Host=localhost:8080
Accept=text/html, application/xml;q=0.9,
application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language=zh-cn,en;q=0.9
Accept-Charset=gbk, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1
Accept-Encoding=deflate, gzip, x-gzip, identity, *;q=0
Cookie=JSESSIONID=3JsNHSp6bxg_0KAi
Cookie2=$Version=1
Cache-Control=no-cache
Connection=Keep-Alive, TE
TE=deflate, gzip, chunked, identity, trailers

I hate Mondays

| | Comments(0) | TrackBacks(0)
  北京的桑拿天真是让人难受,更何况还是让人紧张的星期一,上班一定不能迟到!!!
  早上离开卧室时,竟然在关门的一瞬间把门锁给拨了下来,oh my God,算了,上班要紧,晚上回来再修吧。
  公交车,地铁,好不容易到了公文坟,看看表,时间真的不多了,打算打个出租车了,可突然发现今天打车的人也太多了吧。竟然一辆车也见不到,大家都在翘首以昐闲车的经过,就这样,挥汗如雨,在公文坟白白站了竟半个小时,也没见到一辆闲车经过。
  算了,谁让今天是周一了,不得以,又回去坐公交车,一路颠簸,真是跋山涉水,千辛万苦,终于在九点到了公司...(上班时间是8:30)
  Ihate Mondays,更可恶的是下午还开会,从一点开到五点!!!!
  唉,此刻窗外大雨,还是未能减去哪怕是一点点的热气。
使用私有构造函数强化Singleton

下面是第一种方法,
它把本身做为一个Singleton类,用了一个公有的静态类变量来得到对他的实例化.
// Singleton with final field
public class Browser {
 public static final Browser INSTANCE = new Browser();

private Browser() {
 ....
 }

 ... // Remainder omitted
}

第二种方法:
和第一种最大的不同就是,这个类已经不是Singleton类了,所以,定义了一个私有的类变量来获取这个类的实例,并提供一个静态函数来得到这个类变量。

//Singleton with static factory
public class Browser {
 private static final Browser INSTANCE = new Browser();

  private Browser() {
  ....
 }

 public static Browser getInstance() {
  return INSTANCE;
 }


 ... // Remainder omitted
}

至于在何时选择何种方式:
  总而言这,只要你能肯定这个类将只会是singleton,当然就选择第一种方式。如果不能,还是用第二种方式。
On balance, then, it makes sense to use the first approach if you're absolutely sure that the class will forever remain a singleton. Use the second approach if you want to reserve judgment in the matter.

北京地铁2008年规划图

| | Comments(0) | TrackBacks(0)

谁收购谁

| | Comments(0) | TrackBacks(0)
  8月11日,阿里巴巴召开发布会宣布收购雅虎中国全部资产,并获雅虎10亿美元投资,同时雅虎获阿里巴巴40%的经济利益和35%的投票权。
  昨天的CCTV晚间新闻就播出了这个IT业内的重大新闻。网上关于这个收购已经开始大规模的讨论了,但是,细看一下,我就纳闷了,如果是按新闻说的是阿里巴巴收购雅虎中国,那怎么结果是雅虎中国拥有了阿里巴巴的35%的投票权和40%的经济利益!!除去软银在阿里巴巴中不少于30%的股份,实际上雅虎中国已经拥有了阿里巴巴的决策权,这看上去更像是雅虎中国收购阿里巴巴。
  感觉这不那么简单,到底是谁得益,来日再看吧。
昨天是咱中国人的情人节,我,在加班。
有时不知道自己的选择是不是对的,也不知道自己到底想要的是什么,两个人在一起究竟应该是什么样的。也许该找个人一块住了。至少不用每天让闹钟叫你起床了。
早上在床上,天还微亮,北京城就突下大雨,窗外雾蒙蒙,又一个桑拿天,真可惜,还没遇到北京的沙尘暴了。

初游颐和园

| | Comments(0) | TrackBacks(0)

新的blog开始启用

| | Comments(0) | TrackBacks(0)
  找了很久,终于找到了一个比较不错的窝。
  自从上次服务器不能用之后,一直未能找到比较好的地方来放自己的blog,好在几天前突然发现了这里,发现还有些不错,然后自己对系统提供的模板做了些许修改,ok,以后要开始继续我的blog生涯了,谢谢大家的支持,谢谢CCTV,MTV今天颁这个奖给我.....(跑题了)

最近的留言

John发表于2008北京车展: 你是要看车,还是看美
bannoorse发表于2008北京车展: 太好看了啊啊啊 希
易风行发表于宇宙大爆炸(四):宇宙的模样: 这片子真的不错,很值
John发表于宇宙大爆炸(四):宇宙的模样: 自此为止,《宇宙大爆
星迷发表于周星驰的下一个梦想是什么?: 人因梦想而伟大
John发表于数据恢复中....: 呵,谢谢了,已发过的
风南发表于数据恢复中....: 我rss里还有一些片
风南发表于数据恢复中....: 唉。早知道我把那几篇