starky(爱在西元前) 2007 Blog  
去生活就像这个世界便是天堂^_^
日历
<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 18
  • 文章 - 0
  • 评论 - 18
  • 引用 - 1

导航

与我联系

搜索

 

常用链接

留言簿

我参与的团队

随笔分类(16)

随笔档案(18)

文章分类

积分与排名

  • 积分 - 5911
  • 排名 - 6377

最新评论

阅读排行榜

评论排行榜

 

2007年8月30日

今天一个同事碰到dll hell问题,简单说就是vb6中修改src时候,改变了接口的参数数目,结果编译后就重新生成clsid,

原先使用这个dll的地方就必须重新注册,否则无法使用。

 

原本以为com已经成为历史了,不想现在还还会遇到这种问题,幸亏及时想到这个可能性,不然又要花费一些时间来寻找原因了。现在很多人好像已经不知道com为何物了。。。

posted @ 2007-08-30 19:22 爱在西元前 阅读(139) | 评论 (0)编辑
 

错误提示:

将 COM 对象与其基础 RCW 分开后不能再使用该对象

 

原因:

在Finalize中调用了com对象的方法

 

解决方案:

显示调用,而不是放到析构函数里面

 

参考:

http://www.cnblogs.com/LzmTW/archive/2006/12/21/59...

http://webnews.giga.net.tw/article/news.microsoft....

posted @ 2007-08-30 19:17 爱在西元前 阅读(198) | 评论 (0)编辑

2007年4月12日

  1. thread间共享变量时候要使用VolatileWrite/VolatileRead,保证写入读取及时得到反映。
  2. 使用ODP.net时候,尽量不要用abort方法来中止thread,避免出现内存泄露。
  3. 对限制资源的访问需要锁定资源。 有很多方法锁定方法。
  4. deadlock的防止策略
  5. Thread中用raiseevent引发的事件,在其他thread中是同步的,需要注意。如果需要,要用代理来实现异步调用。

感想:相对于vc ++来说,.net中多线程的现实容易了许多。 比如进程间共享数据,原先需要用filemapping,现在可以直接共享。

posted @ 2007-04-12 15:27 爱在西元前 阅读(156) | 评论 (0)编辑

2007年4月10日

最近开始的项目使用的数据库升级了,旧系统是9i新新系统采用10g。

新系统初期需要从旧系统中导入数据,这几天一直在查找相关资料。

遇到的问题:

1. 旧系统24*7运行,新系统运行前,不能常时间停止服务。

2. 数据量大,至少有xxxGB的数据,甚至可能到TB。

 

Oracle官方推荐了4种升级方式

The following sections describe the upgrade methods you can use to upgrade your database to the new Oracle Database 10g release:

· Database Upgrade Assistant

· Manual Upgrade

· Export/Import

· Data Copying

第一种是用DBUA工具,优点是升级速度快,缺点是一旦升级失败,会造成原有数据库不可用,风险很大。

第二种没有仔细研究,和第一种方法类似。

第三种用EXP、IMP来导数据,好处很多,但是数据量巨大的时候,无法接受等待时间,时间风险很大。

第四种使用db link直接copy数据,要求网络直接对接。

以上四种方法各有优缺点,最后在oracle官方的案例里面看到Amadeus的方案:

Using TTS for Fast Database Upgrades with Minimal Downtime (PDF)

用Transportable Tablespace来copy数据,TTS只有在copy所谓metadata的时候会比较费时间,其他数据的

copy都是和文件传输速度差不多。

另外一个文档也可以参考一下,文档中说downtime只有10分钟左右,真是做的很棒!

posted @ 2007-04-10 16:55 爱在西元前 阅读(283) | 评论 (0)编辑

2007年3月30日

Selenium是什么?
它用来对Web应用程序做功能或系统测试。这些测试有些时候也被称作接收测试/用户测试/集成测试。Selenium不止意味着单元测试。

ibm网站上的介绍:http://www.ibm.com/developerworks/cn/java/wa-selenium-ajax/
Selenium指南:http://wiki.springside.org.cn/display/springside/Selenium
Selenium Core FAQ :http://wiki.javascud.org/display/SEL/Selenium+Core+FAQ

我想Selenium最cool的功能应该是用firefox下的插件Selenium IDE来生成脚本。
WatirRecorders 好像还没有动工,WatinRecorders已经出了0.1版了,值得期待。

posted @ 2007-03-31 00:31 爱在西元前 阅读(145) | 评论 (0)编辑
 
刚刚发现类似于watir的dotnet版本,名字叫watin,读what in。
项目主页:http://sourceforge.net/projects/watin/

WatiN (pronounced "what-in") stands for Web Application Testing in dotNet. Inspired by Watir, WatiN enables web application testing, through Internet Explorer on a Windows platform, expressed in any .Net language.

watin中好像没有watir中frame有时无法访问的bug。


3月份刚刚release了1.0,有空来试试看:)

突然发现dotnet的open source很活跃阿。
posted @ 2007-03-31 00:09 爱在西元前 阅读(277) | 评论 (0)编辑

2007年3月27日

这几天一直在看Agile web development with rails这本书。

看书之前想到了下面几个问题,需要在书中寻找:

  1. 如何进行输入validate,比如必须,数字,日期,范围,怎么做一般的逻辑检查?
  2. 如何改变输入的默认形态? 比如datetime的默认形态是:yyyy-mm-dd hh-mm,怎么使用yyyy-mm-dd?
  3. password的设置,怎么加密?
  4. 下拉选择框怎么实现?
  5. 有没有masterpage?
  6. session , cookie怎么使用?
  7. 如何迁移页面?
  8. transaction怎么实现?
  9. unit test怎么做? performance test呢?
  10. active record 对多个表的处理?
  11. ajax有么?
  12. web service 怎么去用?
  13. cache 怎么用?

看了4天,终于看完这本书了:)

上面的问题除了5,也都找到答案。

 

看完书的总的感觉是,rails 改变了我们的开发模式,

可以把注意力集中到更加抽象的层面,很快的开发出原型进行迭代开发,另外就是动态语言的表现真的很cool。

posted @ 2007-03-27 15:09 爱在西元前 阅读(117) | 评论 (0)编辑

2007年3月26日

第一次使用ruby on rails 还是在2005年,当时很震惊竟然可以这么快速的开发web应用。ROR使用MVC,他的设计原则是“不要重复自己”(Don't Repeat Yourself)和“成规优于自定”(Convention Over Configuration),对大多数使用者来说,入门难度很低。因为简单高效,使得ROR很快流行起来。

从初次使用到现在,期间一直用java或者.net来开发,几乎没有碰过rails,

只是偶尔用ruby写写小程序来提高开发效率。最近比较有空,重新耍耍看。

下面是安装步骤

  1.  安装ruby ,从rubyforge.org可以下载,windows user可以从http://rubyinstaller.rubyforge.org安装oneclick的version.
  2.  用gem安装rails以及需要的模块:C:\> gem install rails --include-dependencies
  3. IDE可以从http://www.radrails.org/下载

 

参考:

  1. Ruby on rails 的 wiki  
  2. homepage
  3. java eyes 的 新手十分钟初体验
posted @ 2007-03-26 10:16 爱在西元前 阅读(150) | 评论 (0)编辑

2007年3月23日

很多公司被禁止访问网络,只能收发email。 当然公司这么做也有他的原因。

其实,只要能收发email,你可以访问互联网几乎所有的资源。

前几天搜索到的一篇指南:

Accessing the Internet by E-mail FAQ

可以通过邮件访问ftp,http,newsgroup 等等。。。

 

If you don't have direct access to the Internet through your BBS or online service, you're not alone. Many of the world's countries with Internet connections have only e-mail access to this world-wide network of networks.

posted @ 2007-03-23 17:30 爱在西元前 阅读(94) | 评论 (0)编辑

2007年3月22日

test  update

测试 更新

テスト 更新

posted @ 2007-03-22 14:13 爱在西元前 阅读(82) | 评论 (0)编辑

2007年3月5日

在前面的一篇blog中,使用到了这样的代码
1class SongList
2  def [](key)
3    return @songs[keyif key.kind_of?(Integer)
4    return @songs.find { |aSong| aSong.name == key }
5  end
6end

在第四行中,有find这样一个方法,可以按照指定条件对songs进行遍历,最终返回一个符合条件的个体。

下面就来看看这个方法到底是怎么实现的,
 1class Array  
 2  def find  
 3    for i in 0size  
 4      value = self[i]  
 5      return value if yield(value)  
 6    end  
 7    return nil  
 8  end  
 9end  
10
发现是在Array这个类中,增加了一个method,在method中嵌入了一个遍历操作。
如果只是这样的话,那么ruby和其他语言也就没有什么差别了,我们注意到第5行中有yield
这么一个东东。其实他起到了一个代理的作用,实现了实际操作部分和遍历的分离。

再看看下面这个例子,来了解一下yield的功能。
1def threeTimes
2  yield
3  yield
4  yield
5end
6threeTimes { puts "Hello" }
7
8

这里定义了名叫threeTimes的blocks, blocks中会重复3次外部的操作,当row 6的代码执行后,会得到后面的结果:
Hello
Hello
Hello

可以看到blocks为我们提供了如此灵活的手段,其实他语言中需要通过代理或接口或函数指针来实现。
其实.net 3.x以后的版本也提供了类似的功能,一个叫LINQ(Language Integrated Query )的东东。
可以使用类似SQL的方式过滤集合

LINQ Query:

string[] names = "Geoff""Jessica""Mike""Megan",
                                    
"Priscilla""Jack""Alma" }
;
 
    IEnumerable
<string> expr = from s in names
                               where s.Length 
== 5
                               orderby s
                               select s.ToUpper();
 
    
foreach (string item in expr)
      Console.WriteLine(item);

上面的用法是不是很简洁方便?

用ruby来实现的话,将会是这样:

1names = [ "Geoff", "Jessica", "Mike", "Megan", "Priscilla",
2             "Jack", "Alma" ]
3             
4expr = names.select {
5    |n| n.length == 5
6}.sort.collect { |n| n.upcase }
7
8expr.each {|n| puts n }

正因为blocks如此方便,在阅读ruby程序的时候,可以看到被广泛的使用着。


posted @ 2007-03-05 13:46 爱在西元前 阅读(154) | 评论 (0)编辑

2007年2月22日

终于开始动手翻译了,中间看到一些看不懂的日语句子,就请教旁边的日本mm。
mm看了第一遍,没看懂,第二遍还没有看懂,日本人でもわからない日本語。。。。
看到第三遍,终于懂了。

最后听到mm这样的评价:へんな日本語!(奇怪的日语)
劝我不要看这样的文章,说会把日语学坏。。。我汗!暴汗!瀑布汗!成吉思汗!!

不管怎么说,还是要继续,其实元旦的时候就想翻译了。如果工作不忙的话,准备花2-3个月时间把初稿先完成了。

哈哈,这会儿旁边的mm又问我了,有没有找到其他ruby的书,这一本写得不好,
回答是没有,现在好像只有这一本书讲ruby source code。 残念。。。
posted @ 2007-02-22 18:14 爱在西元前 阅读(280) | 评论 (2)编辑
 

早上在rubychina看到有人贴了一段99乘法表的一小段ruby代码。

 1i=1
 2while i<=9
 3  j=1
 4  while j<=i
 5    s=j*i
 6    print("#{j}*#{i}=#{s}\t")
 7    j=j+1
 8  end
 9  print("\n")
10  i=i+1
11end

这里是输出:
1*1=1    
1*2=2    2*2=4    
1*3=3    2*3=6    3*3=9    
1*4=4    2*4=8    3*4=12    4*4=16    
1*5=5    2*5=10    3*5=15    4*5=20    5*5=25    
1*6=6    2*6=12    3*6=18    4*6=24    5*6=30    6*6=36    
1*7=7    2*7=14    3*7=21    4*7=28    5*7=35    6*7=42    7*7=49    
1*8=8    2*8=16    3*8=24    4*8=32    5*8=40    6*8=48    7*8=56    8*8=64    
1*9=9    2*9=18    3*9=27    4*9=36    5*9=45    6*9=54    7*9=63    8*9=72    9*9=81    

这段代码觉得写的太罗嗦了,不像是ruby的风格。于是改成下面的code:
1(1..9).each {|i| 
2    (1..i).each{|j| print "#{j}*#{i}=#{i*j}\t";} 
3    print("\n")
4 }

这样也行:
11.upto(9) {|i| 
2    i.times {|j| print "#{j+1}*#{i}=#{i*(j+1)}\t"; }
3    print("\n")
4 }

是不是简单很多?

不过如果看了Programming Ruby中的例子,会有更深的印象:ruby好简单,好方便!!
这个例子是从一个歌曲list中根据序号或者名字来查找歌曲,下面是最初的做法,当然也是一般语言的通常做法:
 1class SongList
 2  def [](key)
 3    if key.kind_of?(Integer)
 4      return @songs[key]
 5    else
 6      for i in 0@songs.length
 7        return @songs[i] if key == @songs[i].name
 8      end
 9    end
10    return nil
11  end
12end
13
14

然后是第二种做法:循环被一个find方法所取代,更加方便简洁了
 1class SongList
 2  def [](key)
 3    if key.kind_of?(Integer)
 4      result = @songs[key]
 5    else
 6      result = @songs.find { |aSong| key == aSong.name }
 7    end
 8    return result
 9  end
10end
11
12
还有更简单的形式:
1class SongList
2  def [](key)
3    return @songs[keyif key.kind_of?(Integer)
4    return @songs.find { |aSong| aSong.name == key }
5  end
6end
7
8

从上面的例子来看,ruby是不是很方便,iterator的功能是不是很贴心?

对ruby的了解越多,越感到简单就是美!


posted @ 2007-02-22 14:44 爱在西元前 阅读(281) | 评论 (4)编辑
 
最近在看ruby hacking guide (ruby源代码完全解说,Rubyソースコード完全解説)这本书。

看到网上有团队在翻译,可惜没有搜索到翻译好成果物,只好继续看日文版的原文了。

从大一开始就学习c了,这么多年除了学习,还没有真正使用过c来开发项目。
正好可以通过看ruby source来了解一下其中奥妙。

1 从rubyforge下载1.85版的src,解压缩文件到指定目录下。

2 环境准备:我是WindowXp(sp2 jp)+ Cygwin

3 然后打开指定目录下解压缩的readme文件,按照步骤运行命令。
 
* How to compile and install

This is what you need to do to compile and install Ruby:

  
1. If ./configure does not exist or is older than configure.in,
     run autoconf to (re)generate configure.

  
2. Run ./configure, which will generate config.h and Makefile.

  
3. Edit defines.h if you need.  Usually this step will not be needed.

  
4. Remove comment mark(#) before the module names from ext/Setup (or
     add module names if not present)
, if you want to link modules
     statically.

     If you don't want to compile non static extension modules
     (probably on architectures which does not allow dynamic loading)
,
     remove comment mark from the line 
"#option nodynamic" in
     ext/Setup.

  
5. Run make.

  
6. Optionally, run 'make test' to check whether the compiled Ruby
     interpreter works well.  If you see the message 
"test succeeded",
     your ruby works as it should (hopefully).

  
7. Run 'make install'

     You may have to be a super user to install ruby.

编译成功,在usr/local/下面生成了编译后的文件。
posted @ 2007-02-22 14:22 爱在西元前 阅读(479) | 评论 (2)编辑

2007年2月20日

       最近开始玩一个叫OGame的web游戏,才玩了几天就发现基建太费时间了,才升到lev12就要等将近2个小时。浏览了游戏的FAQ和讨论区,发现游戏没有提供公开的接口,于是便想写个程序来简化操作,初步考虑了一下,有2个方案可以选择:

A 模拟ie来帮我做一些简单的动作
B 利用ie的接口,在特定情况下直接触发ie的事件

需求整理如下: 
NO 描述 优先度
1

定期刷新页面获取最新的信息

2 根据取得的信息判断,一旦资源满足条件,就开始按照指定策略升级建筑。
3 最新信息mail通知
4 战斗信息自动log,星图信息自动log

准备用ruby来开发,先考察A方案的可行性,使用socket模拟ie访问网站,要解析http的包,工作量比较大。
B方案暂时还没有头绪,ruby下访问com接口只记得有个excel的例子。

于是google了一下,发现Watir(web application testing in ruby)这个东东,是用来自动测试web 应用的一个开源框架。
原理是利用ie的COM接口来操纵ie的一些行为。正好是俺需要的东东。

开始动手了,先翻出一个Watir的sample,是访问google的,很简单,一下就运行通过了。

 1require 'watir' 
 2# the watir controller 
 3# open the IE browser 
 4ie = Watir::IE.new 
 5# Step 1: go to the test site: http://www.google.com 
 6ie.goto("http://www.google.com"
 7# Step 2: enter 'pickaxe' in the search text field 
 8ie.text_field(:name, "q").set("pickaxe"# q is the name of the search field 
 9# Step 3: click the 'Google Search' button 
10ie.button(:name, "btnG").click # "btnG" is the name of the Search button 
11# Actual Result: Check that the 'Programming Ruby' link appears on the results page 
12if ie.contains_text("Programming Ruby"
13  puts "Test Passed. Found the test string: 'Programming Ruby'. Actual Results match Expected Results." 
14else 
15  puts "Test Failed! Could not find: 'Programming Ruby'" 
16end 
17# End of test: Google search

Eclipse的Console里面显示:

Test Passed. Found the test string: 'Programming Ruby'. Actual Results match Expected Results.

好,开头很顺利,下面进一步了解一下watir怎么用。


posted @ 2007-02-20 17:09 爱在西元前 阅读(223) | 评论 (6)编辑

2006年3月15日

在GridView 的属性中,将某个column设置为:

DataFormatString="{0:yyyy-MM-dd}"  
发现格式化并没有起作用,同时修改
HtmlEncode="False"
才会发生作用, 为什么呢?

google了一下,发现了微软的说明,还有这里有更详细的解释:

When the HtmlEncode property is true, the value of the field is HTML encoded to its string representation before the formatting string is applied. For some objects, such as dates, you might want to control how the object is displayed with a formatting string. In those cases, you must set the HtmlEncode property to false.

posted @ 2006-03-15 11:19 爱在西元前 阅读(959) | 评论 (1)编辑

2006年3月14日

    使用VS2005开发时,在IDE 菜单中选择 Web Site -- Asp.net Configuration
    可以通过自带管理页面可视化配置你的项目。

    可是发布项目的机器上并没有安装VS2005,仅安装了framework 2.0。
    按照以下步骤即可使用此工具:   

    1. 在开发的机器上(安装VS2005)通过菜单配置你的项目,记下此时的url,我的是:http://localhost:4343/asp.netwebadminfiles/default.aspx?applicationPhysicalPath=D:\source\TaskSystem\&applicationUrl=/TaskSystem
    2. 在目标机器上将次目录C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ASP.NETWebAdminFiles通过IIS建立一个Application ,可以使用默认的名字,当然也可以改名,配置属性支持asp.net 2.0。
    3. 发布你的项目比如TaskSystem到C:\Inetpub\wwwroot\TaskSystem
    4. 修改上面的url,http://localhost/asp.netwebadminfiles/default.aspx?applicationPhysicalPath=C:\Inetpub\wwwroot\TaskSystem\&applicationUrl=/TaskSystem
    5. 通过此url配置你的应用程序:) 最好把它加到收藏夹里面,就不用记了。

注: 由于安全限制,只能在本地访问此链接。
      本文所涉及的内容仅在win2003中测试通过。

 

posted @ 2006-03-14 23:12 爱在西元前 阅读(1215) | 评论 (3)编辑
 
Copyright © 爱在西元前 Powered by: 博客园 模板提供:沪江博客