ruby的文件读取
[
2007/06/08 13:15 | by edwardproAdmin ]
2007/06/08 13:15 | by edwardproAdmin ]
ruby里边有两套File函数
本地的 File::open() 属于标准库
远程的 open_uri 包中的 open函数
本地的 File::open() 属于标准库
远程的 open_uri 包中的 open函数
rubyzip 初体验
[
2007/05/31 12:32 | by edwardproAdmin ]
2007/05/31 12:32 | by edwardproAdmin ]
非常讨厌看类文档,那些东西空洞无物,但是有时候是没有办法的,比如rubyzip,因为需要在项目中使用zip包,只能看类文档了。
第一次使用这东西其实出了不少问题,下面先贴一段有问题的测试代码:
require 'zip/zipfilesystem'
Zip::ZipFile.open("E:\\moive\\c.zip") { #打开
|zf|
zf.dir.entries("").each do |ak| #get files list on root path in zip File
file = File.new("e:\\#{ak}","w+")
file.write(zf.file.open(ak).read())
file.close()
end
}
以上方法有一个问题就是如果读写的是文本文件问题不大(也不是没有问题是看不出),通过FILE泪下的open方法可以得到某个文件的文件流,利用File类可以写入,但问题恰恰出现在这里,这个方法不是真正意义的解压缩,它有个毛病会把一些控制字符转移比如它会吧OA转成 ODOA,所以当你用这个方法保存的文件文件尺寸和原来是不同的,大家一定要注意对于小文件还可以使用 read或者readline方法得到它的string对象这样更方便。
下面贴一个正确的代码:
require 'zip/zipfilesystem'
Zip::ZipFile.open("E:\\moive\\c.zip") {
|zf|
zf.dir.entries("").each do |ak|
zf.extract(ak,"e:\\#{ak}")
end
}
直接用extract方法就好了,这个应该是最简单的,如果要判断文件类别或者重命名都可以简单的在参数中自己设定,非常方便。
更多参考请看:
http://rubyzip.sourceforge.net/
我也是看了一个晚上基本看完了,现在比较困,非常困,坚持中
第一次使用这东西其实出了不少问题,下面先贴一段有问题的测试代码:
require 'zip/zipfilesystem'
Zip::ZipFile.open("E:\\moive\\c.zip") { #打开
|zf|
zf.dir.entries("").each do |ak| #get files list on root path in zip File
file = File.new("e:\\#{ak}","w+")
file.write(zf.file.open(ak).read())
file.close()
end
}
以上方法有一个问题就是如果读写的是文本文件问题不大(也不是没有问题是看不出),通过FILE泪下的open方法可以得到某个文件的文件流,利用File类可以写入,但问题恰恰出现在这里,这个方法不是真正意义的解压缩,它有个毛病会把一些控制字符转移比如它会吧OA转成 ODOA,所以当你用这个方法保存的文件文件尺寸和原来是不同的,大家一定要注意对于小文件还可以使用 read或者readline方法得到它的string对象这样更方便。
下面贴一个正确的代码:
require 'zip/zipfilesystem'
Zip::ZipFile.open("E:\\moive\\c.zip") {
|zf|
zf.dir.entries("").each do |ak|
zf.extract(ak,"e:\\#{ak}")
end
}
直接用extract方法就好了,这个应该是最简单的,如果要判断文件类别或者重命名都可以简单的在参数中自己设定,非常方便。
更多参考请看:
http://rubyzip.sourceforge.net/
我也是看了一个晚上基本看完了,现在比较困,非常困,坚持中
Apache2.0 worker模式性能调试
[
2007/05/28 23:30 | by edwardproAdmin ]
2007/05/28 23:30 | by edwardproAdmin ]
花了整下午调试了下worker模式,一直想用,不过听说还不是太稳定,所以没有尝试,今天正好要重新编译服务器所以偷偷把MPM改成了worker模式,尝试下线程的魅力,下面说说自己调优的过程和效果
服务器配置: 皓龙 1.8GHz×2 1G DDR 333 250G SATAII的硬盘
软件环境Apache2.0.59+Mysql 5.0.18+PHP 5.2.1 + Rails 1.2.3
谈谈体会,原来的perfolk模式平时一直开10个进程的,效率也不太高。现在调试成2~4个进程,主要目的看看是每个进程线程多性能好,还是进程多些线程少比较好,测试了2×200 和4×100两种模式。
结果如下:
2×200 : 这种模式下响应时间短,服务器消耗时间也短,但缺点是吞吐量不如后者高
4×100 : 这种模式下响应时间略长于2×200 ,但在吞吐量上提升了10%
所以最后决定还是采用4×100的模式,在这种模式下前端的静态读取确实得到了有效的提升。
ruby的正则循环查找
[
2007/05/28 01:38 | by edwardproAdmin ]
2007/05/28 01:38 | by edwardproAdmin ]
写了一个从html中提取图片的helper方法,不过不知道怎么让正则一个个匹配下去,似乎String.scan不能达到我的要求,所以还是用了递归方法,代码如下:
def get_only_pic(cbody,result="")
results=/<img (.*) src=\"(.*)\" (.*)\/>/i.match(cbody)
if results == nil
#if no match, return it.
return result
else
result+="<img src=\"#{results[2]}\" border=0 /><br/>"
#把前一次的匹配位置替换掉,然后继续查找下一个
get_only_pic(cbody.sub(/<img (.*) src=\"(.*)\" (.*)\/>/i,""),result)
end
end
不是一个好方法,谁知道应该怎么写的话告诉我吧:)
def get_only_pic(cbody,result="")
results=/<img (.*) src=\"(.*)\" (.*)\/>/i.match(cbody)
if results == nil
#if no match, return it.
return result
else
result+="<img src=\"#{results[2]}\" border=0 /><br/>"
#把前一次的匹配位置替换掉,然后继续查找下一个
get_only_pic(cbody.sub(/<img (.*) src=\"(.*)\" (.*)\/>/i,""),result)
end
end
不是一个好方法,谁知道应该怎么写的话告诉我吧:)
rails中递归的烦闷
[
2007/05/24 18:08 | by edwardproAdmin ]
2007/05/24 18:08 | by edwardproAdmin ]
因为要实现树展现,当然用非递归也可以的,不过考虑灵活性和维护简便还是用递归实现,以下的例子是在helper中使用的,不过rails的输出始终让我有点找不到北,毕竟在webwork中如果实在要输出依然可以通过response得到输入流的,但rails似乎没有,于是只能用如下如此愚蠢的方法实现了:
protected
@@body=""
def build_tree(father_id=0,level=1)
@trees=Site.find(:all,:conditions => "father_id=#{father_id}")
@trees.each do |tree|
@t=""
(level-1).times do
@t+="++"
end
@@body +="#{@t}#{tree.tree_name}(#{tree.id})<br/>"
build_tree(tree.id,level+1)
end
return @@body
end
最后结果灭有问题,但这样用返回类变量方法总不是太好,还米有想出特别好的解决方案只能先如此了。接下来要实现js的权限菜单也会采用此法。
protected
@@body=""
def build_tree(father_id=0,level=1)
@trees=Site.find(:all,:conditions => "father_id=#{father_id}")
@trees.each do |tree|
@t=""
(level-1).times do
@t+="++"
end
@@body +="#{@t}#{tree.tree_name}(#{tree.id})<br/>"
build_tree(tree.id,level+1)
end
return @@body
end
最后结果灭有问题,但这样用返回类变量方法总不是太好,还米有想出特别好的解决方案只能先如此了。接下来要实现js的权限菜单也会采用此法。
gems 2小时历险记
[
2007/05/20 19:45 | by edwardproAdmin ]
2007/05/20 19:45 | by edwardproAdmin ]
下午 update了下rails 升级到了1.2.3
但莫名其妙的突然rails链接不上数据库了,报了一个类型无法转换,百思不得其解
过了两小时用gem update,发现gems自己又更新了,这次奇迹出现了,居然正常了。
2小时历险记啊。
但莫名其妙的突然rails链接不上数据库了,报了一个类型无法转换,百思不得其解
过了两小时用gem update,发现gems自己又更新了,这次奇迹出现了,居然正常了。
2小时历险记啊。
发现一个新的图片lib js库推荐大家
[
2007/05/11 17:14 | by edwardproAdmin ]
2007/05/11 17:14 | by edwardproAdmin ]
http://orangoo.com/labs/GreyBox/
他的特点是比较容易实现 rel加入一个gl_imageset[]就行了,缺点也是太方便了不太灵活(看来万物都是两面的)修改源代码后终于灵活了:) 不过效果超级好大家try下吧。
他的特点是比较容易实现 rel加入一个gl_imageset[]就行了,缺点也是太方便了不太灵活(看来万物都是两面的)修改源代码后终于灵活了:) 不过效果超级好大家try下吧。
prototype1.5在firefox上的一个BUG
[
2007/05/10 19:27 | by edwardproAdmin ]
2007/05/10 19:27 | by edwardproAdmin ]
升级到1.5后发现 Ajax.Updater()不好用,在IEok,在Firefox不行,改用了Ajax.Request后就好了。
用apache Rewrite要注意
[
2007/05/10 08:41 | by edwardproAdmin ]
2007/05/10 08:41 | by edwardproAdmin ]
prototype ajax 乱码的补遗
[
2007/05/09 16:14 | by edwardproAdmin ]
2007/05/09 16:14 | by edwardproAdmin ]
上次说过出去的乱码用apache解决,这样很方便因为apache规定了所有的header都是gbk的了,但这样有个严重的问题,比如你在这个apache下挂载了另外一个utf-8的业务怎么办?这是一个非常痛苦的问题,要解决的方法,我个人觉得还是利用服务器端解决比较好。
比如在php里用header();解决头的问题,唯一的改动可能就是你把原来的文件名改成.php的就行了,这个占不了多少消耗的,而且这样比较灵活。
当然最后老话重提:强烈建议用utf-8编码!!!重提100次,因为编码会非常折腾人的,这些都是用时间和血泪换来的。
比如在php里用header();解决头的问题,唯一的改动可能就是你把原来的文件名改成.php的就行了,这个占不了多少消耗的,而且这样比较灵活。
当然最后老话重提:强烈建议用utf-8编码!!!重提100次,因为编码会非常折腾人的,这些都是用时间和血泪换来的。
用innerHTML要小心了
[
2007/05/09 16:08 | by edwardproAdmin ]
2007/05/09 16:08 | by edwardproAdmin ]
昨天在家使用innerHTML时出现点小问题,调试了1个小时才明白:
代码:
$('message').innerHTML+="<div id='abc'>";
$('message').innerHTML+="<div id='abc_child'>";
$('message').innerHTML+="<p>test</p>";
$('message').innerHTML+="</div>";
$('message').innerHTML+="</div>";
看起来正确的代码,但是奇异的现象出现了,首先是页面上所有的css看起来都丢了。经过调试发现原来上述的代码变了:
<div id='abc'></div>
<div id='abc_child'></div>
<p>test</p>
<div></div>
<div></div>
神奇地把代码都补全了,造成原来的布局全没有。
当然要解决也很容易咯:
var str="";
str+="<div id='abc'>";
str+="<div id='abc_child'>";
str+="<p>test</p>";
str+="</div>";
str+="</div>";
$('message').innerHTML=str;
代码:
$('message').innerHTML+="<div id='abc'>";
$('message').innerHTML+="<div id='abc_child'>";
$('message').innerHTML+="<p>test</p>";
$('message').innerHTML+="</div>";
$('message').innerHTML+="</div>";
看起来正确的代码,但是奇异的现象出现了,首先是页面上所有的css看起来都丢了。经过调试发现原来上述的代码变了:
<div id='abc'></div>
<div id='abc_child'></div>
<p>test</p>
<div></div>
<div></div>
神奇地把代码都补全了,造成原来的布局全没有。
当然要解决也很容易咯:
var str="";
str+="<div id='abc'>";
str+="<div id='abc_child'>";
str+="<p>test</p>";
str+="</div>";
str+="</div>";
$('message').innerHTML=str;
prototype乱码的问题解决
[
2007/05/05 15:01 | by edwardproAdmin ]
2007/05/05 15:01 | by edwardproAdmin ]
问题描述,采用gbk页面传输中文到后台,后台显示乱码。
经过查看原来是prototype把前台的gbk自作聪明变成了utf8(这是合理的方法哈),造成后台无法取得正确的编码。
经过考虑还是用后台来解决乱码问题,网上找了几个urlencode的函数都不行,所以还是用php本身解决这个问题比较省心。如下的函数:
iconv("UTF-8", "GBK//IGNORE",substr(Char_cv($pwuser),0,50));
注意输出编码的解释IGNORE这个非常重要,后来在网上查到了一个帖子和我一样的问题,现在终于解决了全部的问题。
总结下prototype的乱码问题:
1 出来的乱码:这种问题可以在服务器配置是解决,我利用apache的defaultcode解决
2 进去的乱码:我建议大家还是用服务器端方法解决,这种方法效率比js解决高效些,也就是上述的表述。
最后表达下一条建议,建议如果没有历史问题,所有页面使用utf-8编码比较好,这个问题不仅是prototype我相信jquery或者yui都会有,因为utf-8才是最好的编码,也省却了很多麻烦,所以在使用这些东西的时候最好还是用utf8的页面。
经过查看原来是prototype把前台的gbk自作聪明变成了utf8(这是合理的方法哈),造成后台无法取得正确的编码。
经过考虑还是用后台来解决乱码问题,网上找了几个urlencode的函数都不行,所以还是用php本身解决这个问题比较省心。如下的函数:
iconv("UTF-8", "GBK//IGNORE",substr(Char_cv($pwuser),0,50));
注意输出编码的解释IGNORE这个非常重要,后来在网上查到了一个帖子和我一样的问题,现在终于解决了全部的问题。
总结下prototype的乱码问题:
1 出来的乱码:这种问题可以在服务器配置是解决,我利用apache的defaultcode解决
2 进去的乱码:我建议大家还是用服务器端方法解决,这种方法效率比js解决高效些,也就是上述的表述。
最后表达下一条建议,建议如果没有历史问题,所有页面使用utf-8编码比较好,这个问题不仅是prototype我相信jquery或者yui都会有,因为utf-8才是最好的编码,也省却了很多麻烦,所以在使用这些东西的时候最好还是用utf8的页面。
原来css是有顺序的
[
2007/05/05 07:47 | by edwardproAdmin ]
2007/05/05 07:47 | by edwardproAdmin ]
终于解决了一个css的bug,发现原来css摆放是有顺序的,有覆盖行为,比如:
a:link {
font-size: 9pt; COLOR: #333333; TEXT-DECORATION: none;
}
a:visited {
font-size: 9pt; COLOR: #333333; TEXT-DECORATION: none;
}
a:hover {
font-size: 9pt; COLOR: #FF5400; TEXT-DECORATION:underline;
}
如果把上述代码替换成:
a:link {
font-size: 9pt; COLOR: #333333; TEXT-DECORATION: none;
}
a:hover {
font-size: 9pt; COLOR: #FF5400; TEXT-DECORATION:underline;
}
a:visited {
font-size: 9pt; COLOR: #333333; TEXT-DECORATION: none;
}
这样visited始终就会覆盖掉hover上的冲突属性,造成效果不正常。
a:link {
font-size: 9pt; COLOR: #333333; TEXT-DECORATION: none;
}
a:visited {
font-size: 9pt; COLOR: #333333; TEXT-DECORATION: none;
}
a:hover {
font-size: 9pt; COLOR: #FF5400; TEXT-DECORATION:underline;
}
如果把上述代码替换成:
a:link {
font-size: 9pt; COLOR: #333333; TEXT-DECORATION: none;
}
a:hover {
font-size: 9pt; COLOR: #FF5400; TEXT-DECORATION:underline;
}
a:visited {
font-size: 9pt; COLOR: #333333; TEXT-DECORATION: none;
}
这样visited始终就会覆盖掉hover上的冲突属性,造成效果不正常。
Timer的Class化还是失败了
[
2007/04/29 03:10 | by edwardproAdmin ]
2007/04/29 03:10 | by edwardproAdmin ]
深夜了,还在写tab切换的核心类,很想把timer集成进去,却不行。
/**
* @author edwardpro@hellodigi.com
* @copyright hellodigi.com 2007~2008
* @projectDescription provide with you a tabs changes function
*/
var tabCore=function(tabs,tabsItem){
this._tabs=$(tabs);
this._timeout=0;//默认是0
this._curitem=0;// current item means who is the current object.
this._timer;
this._tabsitemObj=$(tabs).getElementsBySelector(tabsItem);
this.dochange=function(){}
this.enabletimer=function(){
this._timer=setInterval(this.dochange,this._timeout);
};
this.disabletimer=function(){
clearInterval(this._timer);
}
this.getcurObj=function(){
this._curitem=(this._curitem+1)%this._tabsitemObj.size();
//alert(this._curitem);
return this._tabsitemObj[this._curitem];
}; //单体执行ok
}
tabCore.prototype.addListen=function(dofunc,eventname){
//添加tab事件到主函数
for(var i=0;i<this._tabsitemObj.size();i++){
Event.observe(this._tabsitemObj[i], eventname, function(event) {
var elt = Event.element(event);
if(elt.tagName == "A"){
dofunc(elt);
}
});
}
}
tabCore.prototype.setdochange=function(dofunc){
this.dochange=function(){
this._curitem=(this._curitem+1)%this._tabsitemObj.size();
dofunc(this._tabsitemObj[this._curitem]); //调用之后却告诉我没有这个属性
};
}
tabCore.prototype.setTimer=function(timeout,func){
if(timeout){
this._timeout=timeout;
}else{
this._timeout=0;
}
this.setdochange(func);
this._timer=setInterval(this.dochange,this._timeout);
}
tabCore.prototype.test=function(){
alert(this._tabsitemObj.size());
}
看来和js的类核心有关,他的timer应该是只能接收类似静态函数的东西,唯一解释就是那个类当时并没有初始化,所以得不到属性值。不知道是方法问题还是什么。实现了半天实现了一个人家也做了的功能貌似还没有别人好用郁闷啊!!!
/**
* @author edwardpro@hellodigi.com
* @copyright hellodigi.com 2007~2008
* @projectDescription provide with you a tabs changes function
*/
var tabCore=function(tabs,tabsItem){
this._tabs=$(tabs);
this._timeout=0;//默认是0
this._curitem=0;// current item means who is the current object.
this._timer;
this._tabsitemObj=$(tabs).getElementsBySelector(tabsItem);
this.dochange=function(){}
this.enabletimer=function(){
this._timer=setInterval(this.dochange,this._timeout);
};
this.disabletimer=function(){
clearInterval(this._timer);
}
this.getcurObj=function(){
this._curitem=(this._curitem+1)%this._tabsitemObj.size();
//alert(this._curitem);
return this._tabsitemObj[this._curitem];
}; //单体执行ok
}
tabCore.prototype.addListen=function(dofunc,eventname){
//添加tab事件到主函数
for(var i=0;i<this._tabsitemObj.size();i++){
Event.observe(this._tabsitemObj[i], eventname, function(event) {
var elt = Event.element(event);
if(elt.tagName == "A"){
dofunc(elt);
}
});
}
}
tabCore.prototype.setdochange=function(dofunc){
this.dochange=function(){
this._curitem=(this._curitem+1)%this._tabsitemObj.size();
dofunc(this._tabsitemObj[this._curitem]); //调用之后却告诉我没有这个属性
};
}
tabCore.prototype.setTimer=function(timeout,func){
if(timeout){
this._timeout=timeout;
}else{
this._timeout=0;
}
this.setdochange(func);
this._timer=setInterval(this.dochange,this._timeout);
}
tabCore.prototype.test=function(){
alert(this._tabsitemObj.size());
}
看来和js的类核心有关,他的timer应该是只能接收类似静态函数的东西,唯一解释就是那个类当时并没有初始化,所以得不到属性值。不知道是方法问题还是什么。实现了半天实现了一个人家也做了的功能貌似还没有别人好用郁闷啊!!!





