Mar27th

在Rails环境之外引用Active Support

比如要算360天之后的日期:

require 'rubygems'
require 'date'
require 'active_support'

puts Date.today.advance(:days => 360).to_s
Feb18th

Git,Bluehost以及Capistrano

cowoo Notes Read on

昨天配置好了用GIT以及Capistrano在Bluehost上发布Rails应用的自动发布,感觉还不错,一点点记录如下:

1. Bluehost上的Rails是用的fcgi,不是Mongrel。所以要在.htaccess里面加上fcgi的handler:

AddHandler fcgid-script .fcgi

以及

RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

2. 正如这篇文章里所说,如果在Windows下开发,别忘了改首行:

dispatch.fcgi和dispatch.rb(在publice目录下)的首行。

因为BlueHost下是虚拟的unix系统,所以要改成#!/usr/bin/ruby

(如果在windows下开发的程序,用户常会忘了把首行改成unix下ruby的路径)

3. 如何在Bluehost上安装GIT?答案在这里

    注意的是因为Bluehost的防火墙的原因,GitHub的URL无法访问,比如

git://github.com/bsag/tracks.git

    就是无法访问的,不过可以把git改成http就ok了。

http://github.com/bsag/tracks.git

4. Capistrano基本上按照官网的文档一步一步走就OK了。要注意的是:

    如果你在windows下开发而git又没有放到path里面的话,走到 cap deploy:update 这一部可能出现错误。在GIT Bash里面进行就不会出错了。另外,在deploy.rb里面要多写如下一些:

set :branch, "master"  #因为GITHub的原因

namespace :deploy do
  desc "This is here to overide the original :restart"
  task :restart, :roles => :app do
    # do nothing but overide the default
    # Bluehost的fcgi模式不需要重启Mongrel
  end

  # 不想把database.yml放到scm中去
  # 从Advanced Rails Recipes里面找到的。
  task :copy_database_configuration do
    production_db_config = "~/rails/production.database.yml"
    run "cp #{production_db_config} #{release_path}/config/database.yml"
  end
  after "deploy:update_code" , "deploy:copy_database_configuration"

  # 修改public和tmp两个目录的权限
  #(好像Capistrano把log目录做了符号链接,所以没加log)
  task :change_dir_permissions do
    run "chmod -R 755 #{release_path}/public"
    run "chmod -R 755 #{release_path}/tmp"
  end
  after "deploy:symlink", "deploy:change_dir_permissions"
end
Feb13th

Linux统计目录下文件个数命令

cowoo Notes Read on

快享转载:

查看某文件夹下文件的个数
ls -l |grep "^-"|wc -l

find ./company -type f | wc -l

查看某文件夹下文件的个数,包括子文件夹里的。
ls -lR|grep "^-"|wc -l
查看某文件夹下文件夹的个数,包括子文件夹里的。
ls -lR|grep "^d"|wc -l

说明:
ls -l
长列表输出该目录下文件信息(注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等)
grep "^-"
这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d
wc -l
统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于
一行信息对应一个文件,所以也就是文件的个数。

Dec28th

Git与GitHub

cowoo Notes Read on

最近发现一个开源的GTD Web应用,名字叫Tracks,用Ruby on Rails开发的。很感兴趣,于是想掺和一下。发现从1.7开始,这个项目的版本控制工具从SVN转到了Git,心想有点意思。于是查了一下相关的资料,算是有点了解了。

自从Rails从SVN转向了Git之后,Git仿佛成了Rails社区的一个风尚。Git是所谓的分布式版本控制系统,每一个人的本地都维护了一个完整的repository,以及分支。这样就可以在本地自由地建立分支,提交,而不用担心影响到其他人的工作。等本地的工作完成的差不多了,再提交到统一的主干中。更多原理见Why Git is Better than X :) 不过这东西嘛,见仁见智咯。如果集中开发,模块划分的好,CVS一样用起来没什么问题。

另外值得一提的就是GitHub了。InfoQ上有一篇文章介绍GitHub。使用流程基本是这样:

1. 看到一个好项目,fork出来。比如我看到bsag / tracks,就fork一份出来,相当于在我名下建立一个副本,即cowoo/tracks

2. 安装了Git 的Windows版本之后,就可以把项目Clone到本地。

git clone git@github.com:cowoo/tracks.git

3. 进行一些修改,可以在本地Stage,Commit,建立分支等。

4. 提交到我在Github上的Clone。

git push master origin

5. 如果我觉得某个feature开发的不错,可以要求bsag把我的这个feature合并到主分支里面去。点那个”pull request”就可以了。不过俺还没有尝试过。

初次使用笔记。

Dec24th

阅读笔记 12/24/2008

cowoo Notes Read on

订了不少Blog的RSS,但是怎么消费是一个问题。在Google Reader里加一个星标?感觉还是不够,那样只是有一个模糊的印象。那就写下来吧,边写边思考,也是不错的形式。

昨天ReadWriteWeb上有一个关于Ping.fm的报道,没仔细看。今天看到台湾的Mr6也在Blog上写了,发现不错。越来越多的SN确实是个让人头疼的问题,Ping.fm也算解决了问题,自然有人愿意使用。这也是中文社区的一个机会。

Zapproved这个网站帮助人们把结构化的问卷送到人们的信箱,算是Email的一个创新。最近各家在Email上的动作不小。Gmail不停的往Labs里面加东西,Yahoo准备开放Email插件。再加上一年之前看到的Xobni。大家以为没什么可做的Email领域其实还有很多可以挖掘的地方啊。比如腾讯最近的明信片服务就很可爱。

最近还看到一堆主机或者自称云计算的服务提供商,准备整理整理放到Cloud那个页面中去。

Dec23rd

Bluehost上部署Rails应用

本来以前就部署过,不过每次相隔时间都比较长,于是每次都Google一遍,实在太浪费时间,还是自己记下来比较好。

主要参考的是Radiant这个用rails写的内容管理系统的wiki文章,讲如何在Bluehost上部署Radiant。我觉得关键有这么几点:

1. 修改.htaccess文件

把Handler那几行改成:

# General Apache options
AddHandler fcgid-script .fcgi
# AddHandler cgi-script .cgi
# Options +FollowSymLinks +ExecFCGI

2.修改dispatch.fcgi

加上这么几句:

ENV['RAILS_ENV'] = 'production'
ENV["GEM_HOME"]= "/home/[USER_NAME]/ruby/gems"
ENV["GEM_PATH"]= "/home/[USER_NAME]/ruby/gems:/usr/lib/ruby/gems/1.8" 

不过我觉得后面两句应该用处不大,是跟他前面的相呼应的,如果你用到一些自己安装的gems,就应该follow这篇文章。

3. 修改文件夹权限

我是把public,tmp和log三个文件夹的权限都变成了755。cd到rails应用根目录下,比如说rails/yourapp:

chmod -R 755 public

chmod -R 755 tmp

chmod -R 755 log

4. 建立符号链接

把rails/yourapp/public链接到public_html里面的一个子目录:

ln -s ~/radiant_app_folder_name/public ~/public_html/website_name

但是我这么弄了之后还是不行,后来找到Rails Google Group里面的讨论也有点用。正好我是要把应用作为账户的根目录使用,于是

$ mv ~/public_html ~/original_public_html

$ ln -s ~/rails-apps/myapp/public ~/public_html

然后就可以访问了:http://www.flexgtd.com

值得说明一下的是,bluehost上cpanel里面那个ruby on rails的安装向导一点也不好用,不要用那个来部署。我被搞得晕头转向也没搞明白怎么弄,而且觉得它的灵活性太差。

Dec20th

Python 日期时间处理笔记

昨天写到日期和时间的处理,需要输入日期和时间,存储到GAE的DataStore中。

GAE有三个与日期时间有关的Property:

DateTimeProperty
DateProperty
TimeProperty

这三个Property,其实最终都是以datetime.datetime存储,但是使用的时候又有一点不同。

Python中有很棒的解析字符串到时间对象的方法:time.strptime(string[, format]),这个方法会把字符串按照你想要的格式解析进来,放到一个时间对象中。返回值是一个struct_time。解析了之后还要存到GAE的DataStore对象中去,暂时找到了下面的方法:

tDate = time.strptime(self.request.get(’getup_date’),’%m/%d/%Y’)
record.recordDate = datetime.date(tDate.tm_year, tDate.tm_mon, tDate.tm_mday)
tGetup = time.strptime(self.request.get(’getup_at’), ‘%H:%M’)
record.getupAt = datetime.time(tGetup.tm_hour,tGetup.tm_min)
tSleep = time.strptime(self.request.get(’sleep_at’), ‘%H:%M’)
record.sleepAt = datetime.time(tSleep.tm_hour,tSleep.tm_min)

这样就能把12/20/2008这样的日期,以及07:30这样的时间存成想要的对象了。注意如果直接把解析的结果赋给TimeProperty和DateProperty的话会出错。

另外,time.strftime(formart[, t])能够很好的将时间日期对象换成你想要的格式。

Dec18th

Google App Engine (Django) 模板之疑

昨天晚上试验Google App Engine (GAE),要在页面上显示一个时间的估计。我原本设计是在数据库中只存一个字段,即估计的分钟数,然后在页面上计算一下来显示,却被折腾了好几个小时,第一次试验有点失败,特记之。

我传到页面上的是一个对象数组,那么在页面上就得这么写:

{% for m in messages %}

  <li> {{m.name}} – {{m.estimateMinutes}} 分钟 </li>

{% endfor %}

嗯,运行没有错误,很高兴。接下来我想大家还是比较习惯看小时:分钟的方式呈现,于是改了一下逻辑。

{% for m in messages %}

  <li> {{m.name}} –

         {% if m.estimateMinutes >= 60 %}

             {{m.estimateMinutes/60}} 小时

         {% endif %}

         {% if m.estimateMinutes%60 >= 0 %}

             {{m.estimateMinutes%60}} 分钟

         {% endif %}

  </li>

{% endfor %}

这下问题来了,死活在比较大小和除法这些地方报错。根据以前使用JSTL、Ruby的RHTML等模板的经验,似乎没有问题啊。看了JavaEye上hideto翻译的TheDjangoBook第四章,也没找到关于这个问题的解释。后来换了几个关键字搜索也无果,于是到官方文档上仔细查看,终于在Philosophy里找到这么一句:

The Django template system provides tags which function similarly to some programming constructs – an if tag for boolean tests, a for tag for looping, etc. – but these are not simply executed as the corresponding Python code, and the template system will not execute arbitrary Python expressions.

原来模板是不支持数学运算的……枉费我这么时间。不过也算有收获,做东西之前还是不要急吼吼开工,基本的文档最好还是先溜一遍,特别是什么哲学之类的。

功能还是要完成啊,你让我在后台算完了贴上来?那岂不是太麻烦?还得在后台对所有的message做循环。我真的觉得这个哲学洁癖过分,显得有点蠢。后来在GAE Cookbook上看到可以把Jinja2 (另一个模板引擎) 整合到GAE中来,赶紧试验,不过发现似乎还不支持中文,渲染的时候会出错,还是过段时间吧。

好吧,算这个模板比较狠,我改数据库。添了一个estimateHours之后,世界清静了:

{% for m in messages %}

  <li> {{m.name}} –

         {% ifnotequal m.estimateHours 0 %}

             {{m.estimateHours}} 小时

         {% endifnotequal %}

         {% ifnotequal m.estimateMinutes 0 %}

             {{m.estimateMinutes}} 分钟

         {% endifnotequal %}

  </li>

{% endfor %}

但是,加上equal/notequal这些东东还不是引入了逻辑?我有点疑惑了。想一想模板的后果,是让我修改了模型层,难道模板的设计者还有让我们的模型层设计更加合理这种初衷?而且我也不知道这两种方法格外有多大的不同啊,囧。

好了,疑惑就疑惑到这里,还是要认真学习。而且模板也是在发展嘛,说不定GAE开发团队听到了开发者的心声就把这一点改掉了呢:)

hideto同学很勤奋,他翻译的The Django Book应该好好看看,尤其是:

第四章:Django模板系统

第十章:深入模板引擎

Dec16th

JQuery初体验

最近在做一个基于AppEngine的小东西,Web应用嘛,不可避免地用到一些Javascript的组件。开始找了YUI,不过前两天通过Remindr发现了JQuery,如获至宝,赶紧把YUI替换掉了。昨天晚上一般看一边做,发现果然强大。

最开始吸引我的是Datepicker,很简单的两句话,就可以做非常棒的日期选择,很不错。

clip_image002[10]

$(document).ready(function(){

     $(’#example’).datepicker();

});

这里面,$(‘#example’)是选择id为example的input。这就是JQuery中的Selector。Selector的功能很强大,除了能很轻松的选择某一个元素以外,还能选择某一个元素内的某种元素,以及直接子元素等等。甚至还包括了一些循环语句,很强大。

比如我要给一个id为items的ul内的li加上鼠标移过时高亮的特征。只需要

$(’#items >li’).hover(function(){

    $(this).css(’background’, ‘#eeff00′)

    }, function(){

    $(this).css(’background’, ‘#fff’)

});

这样就不用在html里面添加这些元素,维护起来就比较轻松了。

另外,常用的一些隐藏、显示、拖拽的功能也很强大,进一步试用中。

Dec15th

云计算:云端计算机之外

今天ReadWriteWeb出了一篇文章,叫做“Cloud Computing Is More Than a Computer in the Cloud”。这篇文章讲了很多关于云计算的现状,很多这个行业专家的意见,以及包含了众多有用的链接,值得一读。

摘几个要点:

1. 云计算在提供计算资源,像集中供电一样集中供应计算之外,又有所不同。计算资源与电网、期望、铁路网之间的不同网络效应(Network Effects)需要区别对待和考量。

“Actually, unless there are some large network effects, quite a lot stops single companies ruling entire industries. For a start, without network effects, economies of scale tend to run out: the curve is usually U-shaped. Telecoms, gas, rail companies have strong network effects from their infrastructure — it makes little sense to have duplicate rail networks or gas networks in a country. Utility computing does not have this advantage because the distribution network is not owned by them.”

“The history of computing has been a history of falling prices (and consequently expanding uses). But the arrival of cloud computing — which transforms computer processing, data storage, and software applications into utilities served up by central plants — marks a fundamental change in the economics of computing. It pushes down the price and expands the availability of computing in a way that effectively removes, or at least radically diminishes, capacity constraints on users. A PC suddenly becomes a terminal through which you can access and manipulate a mammoth computer that literally expands to meet your needs. What used to be hard or even impossible suddenly becomes easy.”

2. 云计算除了提供计算资源之外,更重要的是数据。(Welcome to the Data Cloud ?

另外,Tim O’Reilly给出了非常棒的描述

“I want to emphasize one more point: the heart of my argument about Web 2.0 is that the network effects that matter today are network effects in data. My thought process (outlined in ‘The Open Source Paradigm Shift‘ and then in ‘What is Web 2.0?,’ went something like this:

  1. The consequence of IBM’s design of a personal computer made out of commodity, off-the-shelf parts was to drive attractive margins out of hardware and into software, via Clayton Christensen’s ‘law of conservation of attractive profits.’ Hardware became a low margin business; software became a very high margin business.
  2. Open-source software and the standardized protocols of the Internet are doing the same thing to software. Margins will go down in software, but per the law of conservation of attractive profits, this means that they will go up somewhere else. Where?
  3. The next layer of attractive profits will accrue to companies that build data-backed applications in which the data gets better the more people use the system. This is what I’ve called Web 2.0.

It’s network effects (perhaps more simply described as virtuous circles) in data that ultimately matter, not network effects per se.”
(my emphasis)

也就是说,IBM对于电脑硬件的标准化,开源软件和互联网协议的标准化导致了整个行业的变迁,这对于Open Standard的研究是很好的启示啊。那么接下来的世界里,数据就是更重要的资产?谁能在数据上玩出更多花样来谁就是老大?这也跟我前两天写云计算的时候的感觉一样,数据果然是很重要的。这也是很好玩的研究课题。

另外,从实践的角度来看,云计算的三个阶段以及开放源代码对于云计算的影响都是很好的分析,那么接下来是不是会有厂商帮助你在不同的云计算平台上进行数据的转换?因为之前我的担心就是在不同厂商之间转换的困难程度。这里面又有一个问题,厂商可以采取策略把用户锁定在自己的平台上,在有开放平台的情况下,厂商之间的竞争和收益会有什么不同?这个跟前一段时间听的Private Software和Open Source Software之间的竞争以及锁定策略的博弈分析差不多,应该很有意思。

Calendar

  • March 2010
    M T W T F S S
    « Mar    
    1234567
    891011121314
    15161718192021
    22232425262728
    293031