2008年06月12日

曾经沧海难为水,除却巫山不是云。
取次花丛懒回顾,半缘修道半缘君。

弃置今何道,当时且自亲。
还将旧时意,怜取眼前人。

2007年07月17日

require ‘open-uri’
require ‘CSV’

def fetch_info(code)
  uri = ‘http://finance.sina.com.cn/realstock/company/sh’ + code.to_s + ‘/techchart.shtml?asi’
  open(uri) do |f|
    text = f.read
    title_start = text.index(‘<title>’) + ‘<title>’.size  
    title_end = text.index(‘</title’)
    title = text[title_start...title_end]
    stock_name = title[0...(title.index('_'))]
    rate_start = text.index(‘机构介入比例’) + ‘机构介入比例’.size
    rate_end = rate_start + 4
    rate = text[rate_start...rate_end].to_f
    return [stock_name,rate]
  end
end

def fetch_all_info
  all_info = []
  for code in 600001…600003
    info = fetch_info(code)
    all_info << info
  end
  return all_info
end

def fetch_and_save_all_info
  all_info = fetch_all_info
  CSV.open(‘d:\test\stock.csv’,'w’) do |f|
    for info in all_info
      f << info
    end
  end
end

fetch_and_save_all_info

2007年03月07日

俺生造了个名词:"桌面portal"
http://blog.donews.com/liusong1111/archive/2006/12/07/1092529.aspx

冉翔今天告诉我,google desktop大有改观,完全是"桌面portal"的思路,可得去瞧瞧!

下载地址:
http://desktop.google.com
开发SDK:
http://desktop.google.com/dev/

它的插件叫Gadget。下载到的SDK里还有中文开发文档,使用js开发。
小厂商抢不到"桌面portal”的市场,就来抢Gadget的地盘吧! google还提供了一个简易的开发平台,支持可视化开发。

2006年12月27日

绘制一棵树,如:
/*
root ->
    a
    b
    c ->
        d
        e
        f
    g ->
        h ->
            k
            m

*/

代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>

<BODY>
<div id="panel">

</div>

<SCRIPT LANGUAGE="JavaScript">
<!–
function Node(parent,label){
  this.parent = parent;
  this.label = label;
  this.children = [];
  if(parent != null)
    parent.children[parent.children.length] = this;
 
  this.x = 0;
  this.y = 0;

  this.totalH = 0;
  this.totalV = 0;
  this.index = 0;

  return this;
}

function calcTotal(node,index){
  node.index = index;
  var parent = node.parent;
  if(parent == null){
    node.totalH = 1;
  }else{
    node.totalH = parent.totalH + 1;
  }

  if(node.children.length == 0){
    node.totalV = 1;
  }else{
    var result = 0;
    for(var i=0;i<node.children.length;i++){
      var child = node.children[i];
      calcTotal(child,i);
      result += child.totalV;
    }
    node.totalV = result;
  }
}

function calcPosition(node){
  var parent = node.parent;
  if(parent == null){
    node.x = 0;
    node.y = node.totalV * _V_ /2;
  }else{
    node.x = node.totalH * _H_ ;
    var y = parent.y – parent.totalV * _V_ /2;
    for(var i=0;i<node.index;i++){
      var sibling = parent.children[i];
      y += sibling.totalV * _V_ ;
    }
    y += node.totalV * _V_ /2;
    node.y = y;
  }

  for(var i=0;i<node.children.length;i++){
    var child = node.children[i];
    calcPosition(child);
  }
}

var _H_ = 50;
var _V_ = 50;

function drawNode(node){
  var element = document.createElement("DIV");
  element.style.position = "absolute";
  var text = document.createTextNode(node.label);
  element.appendChild(text);
  element.style.left = node.x;
  element.style.top = node.y;
  var panel = document.getElementById("panel"); 
  panel.appendChild(element);

  for(var i=0;i<node.children.length;i++){
    var child = node.children[i];
    drawNode(child);
  }
}

/*
root ->
    a
    b
    c ->
        d
        e
        f
    g ->
        h ->
            k
            m

*/
var root = new Node(null,"root");
var a = new Node(root,"a");
var b = new Node(root,"b");
var c = new Node(root,"c");
var d = new Node(c,"d");
var e = new Node(c,"e");
var f = new Node(c,"f");
var g = new Node(root,"g");
var h = new Node(g,"h");
var k = new Node(h,"k");
var m = new Node(h,"m");

calcTotal(root,0);
calcPosition(root);
drawNode(root);

//–>
</SCRIPT>
</BODY>
</HTML>

效果:

连线都没画,懒人呀~

2006年12月20日

jquery-trim.js

String.prototype.mylength = function(){
  var arr = this.match(/[\u00FF-\uFFFF]/gi);
  if(!arr || arr==null)
      return this.length;
  var len = this.length + arr.length;
  return len;
}

String.prototype.mysubstring = function(limit){
  var len = 0;
  var arr = [];
  for(var i=0;i<this.length;i++){
    var it = this.substring(i,i+1);
    len += it.mylength();
    if(len > limit)
        break;
    arr[arr.length] = it;
  }

  var result = arr.join("");
  return result;
}

jQuery.fn.limit = function(){
  $(this).each(function(){
    
    var mylimit = parseInt($(this).attr("limit"));
    var applied = $(this).attr("applied");
    if(applied)
        return;
    var text = $(this).text();
    var original_text = text;
    if(text.mylength() > mylimit){
      text = text.mysubstring(mylimit);
      text += "…";
      text = "<SPAN style=\"position:relative\"><SPAN class=’tooltip’>" + original_text + "</SPAN>" + text + "</SPAN>";
      $(this).html(text);
      $(this).mouseover(function(){
            $(this).find(".tooltip").css("display","");
          });
      $(this).mouseout(function(){
            $(this).find(".tooltip").css("display","none");
          });
      $(this).find(".tooltip")
          .css({ ‘display’:'block’,
                 ‘position’:'absolute’,
                 ‘top’:'2em’,
                 ‘left’:'2em’,
                 ‘width’:'15em’,
                 ‘border’:'1px solid #0cf’,
                 ‘background-color’:'#cff’,
                 ‘color’:'#000′,
                 ‘text-align’:'center’,
                 ‘word-wrap’:'break-word’,
                 ‘word-break’:'break-all’})
          .css("display","none");
      $(this).attr("applied",true);
    }
  
  });
}

function apply_limit(){
  $("[@limit]").limit();
}

$(document).ready(apply_limit);

html中这样用:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<SCRIPT LANGUAGE="JavaScript" src="jquery.js"></SCRIPT>
<SCRIPT LANGUAGE="JavaScript" src="jquery-trim.js"></SCRIPT>
</HEAD>

<BODY>
这是一行 <br><br>
这是另一行 <span limit="8">这是超级长昂昂昂昂昂昂昂昂昂昂昂的字符串</span>
</BODY>
</HTML>

抓图:

注意到html中<span limit="8">了吗? 后面的文字按“中文两个字符,英文一个字符”的规则截断了,随后只显示…,鼠标移上去,出现完整信息的提示。

2006年12月07日

看银狐999老大本本的桌面用的日程管理软件不赖,原来叫Wallcal,下载用了两天,感觉只能在日期格子里写字,憋屈,胡永登同学推荐了active desktop calendar,搞下来看,果然粉爽,有notes/alarms/tasks一应俱全,还有layers/contacts/pictures的管理。与Wallcal相比,它在桌面的右侧分了两栏显示notes和tasks,只显示最近两日的信息,空间利用很有效。它们都是桌布的外观,半透明效果,几乎不影响桌面图标的使用。

vista也带了日历。

我相信这种"桌面portal"的潜力很大,大家快来抢地盘呀!

2006年12月04日

总结一下rails安装的几种方式,所有内容均以 http://www.rubyonrails.org/down 为准。
当然,第一步是安装ruby,略。

一、常规方式:远程gem
gem install rails –include-dependencies

安装时需要联网。

二、 本地gem方式
仔细分析远程gem方式的安装,发现它首先下载并安装其依赖的其它gem包,它们依次是:
activesupport
activerecord
actionpack
actionmailer
actionwebservice
最后才是 rails
因此,到rubyforge.org分别下载这六个包,像 gem install activesupport –local 依次安装就可以了

三、 zip方式
从http://www.rubyonrails.org/down 上,有stand-alone packages的链接,点进去可以下载zip方式的rails。
解压后是一个空的rails工程,在它上面就可以直接创建rails应用了,运行 ruby script/server 可运行。
这种方式与前两者的区别在于,前两种方式将rails的六个gem安装到了ruby的目录下,而这种方式是放到了 解压目录/rails/vendor/rails下。
昨天按这种方式试报了错误,发生在 解压目录/rails/config/environment.rb的第8行,进去一看,咦,怎么ruby代码有<%xxx%>的东东呢,注释掉,再试,好使了。

四、 InstantRails方式
到 http://instantrails.rubyforge.org/ 下载InstantRails,它把ruby、rails、mysql、apache和两个rails应用打包到一起,解压不需配置就能运行了。只支持windows环境。

2006年11月29日

nifty – 圆角CSS
iframe sandboxing – 还木看

2006年11月16日

如对[1,2,3],将得到[123,132,213,231,312,321]
结果数字不重复。
思路:
x([1,2,3])  ->
 y(1,x([2,3])) + y(2,x([1,3])) + y(3,x([1,2]))

y(1,x[2,3]) ->
[12,13]

代码:

arr = [1,2,3]

def y(num,arr)
  arr.collect{|it| num.to_s + it.to_s }
end

def x(arr)
  return arr.dup if arr.size==1
  result = []
  arr.each_index do |i|
    arr1 = arr.dup
    num = arr1.delete_at(i)
    result.concat(y(num,x(arr1)))
  end
  return result
end

def z(arr)
  arr.uniq.collect{|it| it.to_i}
end

require ‘pp’
pp z(x(arr))

2006年11月14日

materials = (0..9).to_a
result = 0
(0..5).each{|i| result += materials.delete_at(rand(materials.size))* 10**i }
puts result%10000

再省两行代码的实现是:

materials = (0..9).to_a
puts (0..5).inject(0){ |n,i|  n + materials.delete_at(rand(materials.size)) * 10**i } % 10000

思路跟昨天Ttrail说的一样。
用一个数组 materials = (0..9).to_a 存放可以取的数,循环从里面随机取,取完就从数组中删除。
为了保证千位数不是0,我没有特意判断,而是多循环了一次(5次),将最终结果 % 10000截到。
每次的随机数在 0至数组.size之间(不包括),即能随机取到一个合法的组数索引。

– 后记:对一个五位数取模10000就能得到四位数?我真蠢~