Capistrano发布WordPress主题

July 19, 2010

以前写好的用Capistrano发布Wordpress的配置文件丢了,无奈重新写过。

看了Capistrano的文档,应该蛮简单的,结果还是折腾了半天。最后的配置文件如下(放这里备查,注意事项在注释里):

set :application, "Productivelife.cn Theme"
set :repository,  "http://www.svnchina.com/svn/项目路径/"

# 文档里是svn+ssh://www.svnchina.com这样的,但是有的服务器可能不支持。

set :scm, :subversion
set :scm_username, "你的SVN用户名" #这个要填才行
set :scm_password, "你的SVN" #仿佛这个也必须放在配置文件里
set :checkout, "export"

set :deploy_to, "/home/customer/wp_themes"
set :user, "customer"
set :use_sudo, false

role :web, "productivelife.cn"                      

发布的时候先Setup:

cap deploy:setup

然后再Check和Update:

cap deploy:check

cap deploy:update

因为不是Rails应用,所以不需要其他的命令。这里update里面包含了update_code和symlink,对我的wordpress主题来说够用了。

CSS纵向对齐技巧

July 16, 2010

今天做一个Calendar的小方块,里面的文字死活顶到最上面,后来找了一篇"Vertical Centering With CSS",终于解决,就是把line-height设成100%。不过对于多行文字未测试。

<div id="content">
    Content here
</div>

 

#content {height:100px; line-height:100px;}

在Rails环境之外引用Active Support

March 27, 2009

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

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

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

Git,Bluehost以及Capistrano

February 18, 2009

昨天配置好了用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

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

February 13, 2009

快享转载:

查看某文件夹下文件的个数
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
统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于
一行信息对应一个文件,所以也就是文件的个数。

Git与GitHub

December 28, 2008

最近发现一个开源的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”就可以了。不过俺还没有尝试过。

初次使用笔记。

阅读笔记 12/24/2008

December 24, 2008

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

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

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

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

Bluehost上部署Rails应用

December 23, 2008

本来以前就部署过,不过每次相隔时间都比较长,于是每次都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的安装向导一点也不好用,不要用那个来部署。我被搞得晕头转向也没搞明白怎么弄,而且觉得它的灵活性太差。

Python 日期时间处理笔记

December 20, 2008

昨天写到日期和时间的处理,需要输入日期和时间,存储到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])能够很好的将时间日期对象换成你想要的格式。

Google App Engine (Django) 模板之疑

December 18, 2008

昨天晚上试验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模板系统

第十章:深入模板引擎

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org