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月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月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就能得到四位数?我真蠢~

2006年10月20日

记一下
比较:
http://blog.csdn.net/huijunzi/archive/2004/03/25/5095.aspx

vml资源:
http://www.itlearner.com/code/vml/index.html
http://www.8esky.com/vml/index.htm
http://srufaculty.sru.edu/david.dailey/grapher/grapher.96.html

canvas资源:
http://developer.mozilla.org/en/docs/Canvas_tutorial
http://starkravingfinkle.org/blog/2006/03/svg-in-ie/
http://me.eae.net/archive/2005/12/29/canvas-in-ie/

2006年08月23日

谢谢醒来老大,这些资料真讲究:

A DOM Ready Extension for Prototype
http://ajaxcn.org/space/start/2006-07-14/1

改善 window.onload
http://ajaxcn.org/space/start/2006-04-14/5

windows.onload事件,是等所有外部元素(如图片)加载完才触发的,这样就有可能需要:
对于包含大量图片但只需html dom加载完就要执行javascript初始化。
http://ajaxcn.org/space/start/2006-07-14/1
文中提到的dom ready库依赖prototype,有人做了不依赖其它库的封装:
http://www.cherny.com/webdev/24/domloaded-script 
demo: http://www.cherny.com/demos/onload/
下载地址:http://www.cherny.com/demos/onload/domloaded.js
用法:在head里:
script type="text/javascript" src="domloaded.js"></script>
<script>
  function init(){
    alert("初始化函数执行了");
 }
  DomLoaded.load(init);
</script>
其中,load方法可被多处调用。

2006年08月17日

有人能连续写出抨击RoR的文章,本来是件好事,可惜此人对要抨击的技术一点都不懂就乱吐口水的做法,太让人气愤了,懒得理他,可惜这种做法误导多少人?什么心态?

我真的很生气,还有这种人,传说也做企业级应用很多年了,怎么混到这种RP?在自己没人访问的blog上发发牢骚,不去满世界得罪人了,嗯嗯!!!

2006年08月14日

http://blog.csdn.net/danny_xcz/archive/2006/08/13/1056932.aspx

最近blog没啥好写的,看到纯月部落上又发文挑RoR –有反对声音总是好事,只要挑对地方。
一时兴起又去留言。

—————-

大家冷静,就事论事~
我有个疑问:LZ "1 从技术的角度来看"…."无论从Ruby语言,还是DSL,还是Web容器性能和代码生成,不存在任何创新。"

不知道LZ说的"代码生成"是指?

LZ上篇的ror安全问题正在关注…

———
受不了,大家说话口气真是服了!

纯月几篇blog提出以技术角度分析/对比RoR(现状及前景),却流于评论者资历、RoR现有成功案例、商业模式、业务领域等非技术话题,难免 让我们这些看官失望,期待能写些更具体的东西,安全性就是其中之一,纯月做了,虽然也有争论,但这个争论对俺来说更有看头。毕竟都是做技术的,实打实的掰 扯更有意思,比方(这里只是比方,俺都不懂PHP,估且拿Java当靶子)有人说代码生成不存在任何创新,俺就说它好(不知道此"代码生成"与彼"代码生 成"是不是同一个东东),俺贴段代码:
class Person < ActiveRecord::Base
end
对应Java(hibernate)就要:
class Person{
private Integer id;
private String name;
private int age;
…. getter & setter (& constructor [optional])
}
同时写Person.hbm.xml用来做声明映射
<hibernate-mapping>
<class name="Person" table="people">
<id name="id" column="id">
<generator …>
</id>
<property name="name" column="name" />
…其它property映射
</class>
</hibernate-mapping>

并且,ror(更具体是ror的ActiveRecord)使得Person类不光做了自动映射及自动有了setter/getter, 而且还自动有了find,find_by_id,update等类方法和update_attributes等实例方法,对于Java,借助spring 的HibernateTemplate(连同它的配置文件)可以做到一些,但不如ror的灵活。

这么一来,我用RoR PK Java的目的就达到了,当然,看官们肯定有理由反击,至少耙子立在这儿了。

———

俺一直坚持认为:东西好不好,和它有没有前途 *没有* 必然因果关系。
因此,同样不能用分析其前途的手段,来断言该东东好不好。
没人说RoR就是银弹,空来空去的没什么意思,俺是个爱细抠的同学,不如把它肢解了一点点掰扯,说商业就单说商业,说技术就单说技术,说现状就陈列现状,说预测就标明预测,把话题拉到一个具体的层面上大家好说事,比如技术上可以拿ORMapping、安全性、第三方库、IDE、AJAX…,商业上可以是大厂商支持、布署模式、客户认知度、市场响应速度…,像现在这样搅和着来对于初学者会是误导。
纯月自然是很历害的了,光看blog上的文章就很佩服,不过去回复那些质疑者就显得….嘿嘿嘿~
不过牛人只会牛在一个或几个领域,所以俺也没有盲目崇拜,期待后面精彩的评论。