« 类别 程序&程序设计 下的文章

ruby中的信号

在unix/linux中,进程之间传递信息是用信号的方式,(不清楚 ?=》google : linux singal 信号机制),ruby也支持这种方式。

  ri trap

代码:

trap :INT do
  puts
  puts 'Bye'
  exit
end

print 'Say something: '
STDOUT.flush
puts "You said: #{STDIN.gets}"

当运行这段代码时,如果按^C即control+c,这样会传递一个SIGINT信号给该进程。可以尝试*nux下的信号表的其它信号,
还是比较有趣的。HOHO~

《web cache》(译)- 1.介绍

翻译出于个人意愿,一为对技术的兴趣,二为对英语的学习,过英语三级以上者还请去阅读英语原版,切勿自误。

————————————————————————————————————————————–

1. 介绍

术语缓存出至法译,字面上的意思,就是存储。作为一个数据处理的术语,缓存是指计算机储存最近读取的信息,以备将来访问。存储的信息可以使用或不使用,所以只有当存储量低于读取量时,缓存才是有益的。

缓存的概念几乎在计算机和网络系统每一个方面的都有应用。CPU中有数据和指令缓存,计算机操作系统有硬盘和文件系统的缓冲存储器缓存。分布式(网络)文件系统,如:NFS和AFS的良好性能也依赖缓存。网络路由器缓存最近使用的路由。域名系统(DNS)服务器缓存主机名到地址的查询及其他查询。

对某些数据块的请求可能同时发起。CNN的主页的请求通常伴随着该页面的所有图片请求。缓存基于之前的访问数据来预测随后的访问。当预测是正确的,会有显着的性能改善。在实践中,这种技术的好处,使得我们难以忍受计算机系统中,没有内存和磁盘高速缓存之缓慢。几乎所有的数据处理任务中读取的地方都能从高速缓存中受益。

当请求的数据在缓存中存在,我们称它为命中。同理,访问数据没有被缓存称为未命中。缓存提供性能改进的主要依据,是在服务时间上缓存命中率和未命中率的比较。所有的请求,命中的比例是所谓的命中率。

任何使用缓存的系统必须支持缓存一致性机制。这是缓存保持更新的过程。我们说缓存的数据,是新的或过时的。缓存可以立即重用新鲜的副本,但通常需要验证数据是否过时。保持一致性的算法可强可弱。弱一致性意味着缓存有时会返回过时的信息。强的一致性,意味着缓存的数据始终是先验证,然后再使用它。CPU和文件系统缓存需要很强的一致性。然而,某些类型比如:路由器和DNS解析器缓存,即使他们返回过时的信息仍是有效的。

我们知道,在现代计算机的内存和磁盘系统中,缓存起着重要作用。在WEB中,能同样成功么?问不同的人,你可能会得到不同的答案。一些缓存使Web可用是至关重要的。其他看法是缓存非常不利于用于web中。一小部分可能认为这只是一般不利于[图克斯伯里,1998]。

在这本书中,我将谈Web应用缓存技术,并试图说服你,Web缓存是一项好的技术。我们将看到如何使用Web缓存的工作原理,如何与客户端和服务器交互,和HTTP扮演的角色。您将了解用于构建缓存集群和层次的协议。除了有关技术方面的问题,我也花了很多时间在讨论分岐问题上面。由于Web高度分散的性质,介绍了一些其它有趣的问题。

当你读完本书,你应该能够为您所属机构设计和评估缓存代理解决方案。也许你将在你的防火墙安装一个独立的缓存代理,或也许你需要位于整个网络的各种缓存。此外,你应该做好准备,从缓存操作了解和诊断任何可能出现的问题或故障。如果你是一个内容提供商,那么我相信你增加你提供的信息的缓冲能力。

《web cache》(译)- 目录

翻译出于个人意愿,一为对技术的兴趣,二为对英语的学习,过英语三级以上者还请去阅读英语原版,切勿自误。

————————————————————————————————————————————–

目录
1.介绍
1.1 网络架构
1.2 网络传输协议
1.3 为什么要缓存网页?
1.4 为什么不缓存网页?
1.5 网络缓存的类型
1.6 缓存代理特征
1.7 网格、集群、层次
1.8 产品

修改validation中错误信息的字段名

在rails的activerecord中,如果对字段进行验证,出错信息中,往往会把表中的字段名显示成主语,比如:

class Person < ActiveRecord::Base
  validates :name, :presence => true
end

出错时显示的是:”Name can’t be blank”,其中”can’t be blank”是rails默认的信息,我们可以通过候改I18n,轻易的改成中文,但在以前的rails版本中,想把字段名(这里是name)友好化,那很麻烦。
不过现在也可以通过修改I18n配置文件来自定义你的字段描述了:

cn:
  activerecord:
    attributes:
      person:
        name: "姓名"

是不是很简单呢,嘎嘎。

修改form_for生成的提交按钮文字

  <%= form_for @post do |f| %>
    <%= f.submit %>
  <% end %>

这段代码会生成一个表单,而提交按钮默认值是英文,根据你的模型生成新增或更新字样,比如在上面这个例子中,如果@post是新记录,它将用”Creat Post”,如果不是新记录,会生成”Update post”字样。
这些值能通过I18n自定义,在helpers.submit键中允许使用 %{model} 做为翻译引用表单使用的模型名字:

  en:
    helpers:
      submit:
        create: "Create a %{model}"
        update: "Confirm changes to %{model}"
      post:
        create: "Add %{model}"

所以当我们使用中文时候可以建一个cn.yml

  cn:
    helpers:
      submit:
        create: "新建"
        update: "修改"
      post:
        create: "添加"

ExecJS::RuntimeUnavailable

好吧,这个错误我碰了好几次了。记录一下吧。
修改Gemfile,加上:
gem ‘execjs’
gem ‘therubyracer’

出错原因:

It does not show that it is running Ruby 1.9.1. Because the standard library changed very little between 1.9.1 and 1.9.2, the same path is used for both of them. You will notice this is not just on Heroku.

It looks like execjs is expecting to have a JS runtime installed on the system. Apparently Celadon Cedar does have one (NodeJS), but it won’t work until rails 3.1rc5 arrives.

gem 安装不了 rails

WARNING:  RubyGems 1.2+ index not found for

当出现以上错误时,有几种原因,网速过慢、gem服务器太慢、被墙了。
解决方案有几种,一种是自己一个一个下载gem包,本地安装,不过太麻烦。
另一种是修改源地址:
先查看一下当前源地址

gem env
gem sources list

一般默认是:http://rubygems.org/
增加几个源路径:

sudo gem sources -a http://gems.rubyforge.org
sudo gem sources -a http://gems.github.com

问题应该解决了。关于gem sources的用法可以看帮助:gem help sources

django初体验…

第一次使用django,我也不确定以后会用上它,不过不管什么第一次都是有意义的。。虽然是跟着文档的First steps写的,还是决定记录一下,以记念这一刻。。

model.py:

from django.db import models
import datetime

# Create your models here.
class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def was_published_today(self):
        return self.pub_date.date() == datetime.datetime.today()
    was_published_today.short_description = 'Published today?'

    def __unicode__(self):
        return self.question

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()

    def __unicode__(self):
        return self.choice

view.py

# Create your views here.
#from django.template import Context, loader
#from django.http import HttpResponse, Http404
from django.core.context_processors import csrf
from django.shortcuts import render_to_response,get_object_or_404
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from mydjango.polls.models import Poll, Choice

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    #t = loader.get_template('index.html')
    #c = Context({
    #    'latest_poll_list':latest_poll_list,
    #})
    #return HttpResponse(t.render(c))

    return render_to_response('index.html' ,
        {'latest_poll_list': latest_poll_list})

def detail(request, poll_id):
    #try:
    #    p = Poll.objects.get(pk=poll_id)
    #except Poll.DoesNotExist:
    #    raise Http404
    p = get_object_or_404(Poll, pk=poll_id)
    c = {'poll': p}
    c.update(csrf(request))
    return render_to_response('detail.html', c)

def vote(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)

    try:
        selected_choice = p.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render_to_response('detail.html',{
            'poll': p,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        #return HttpResponseRedirect(reverse('mydjango.polls.views.results', args=(p.id,)))
        return HttpResponseRedirect(reverse('poll_results', args=(p.id,)))

def results(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    return render_to_response('results.html', {'poll':p})

使python支持mysql

今天玩了一下django,在建立数据库连接时候出了点问题,本以为挺简单,没想到一波三折,从夜里12点搞到凌晨2:30…终于弄完,打铁得趁热,虽然很想赶紧睡觉,还是把解决方法记录下来。

首先,如果你的UBUNTU玩家,且你很‘懒’,你没时间的话,请:

apt-get install python-mysqldb

下面的你就不用看,也不用尝试了,你可以利用这大把大把的时间去把妹,利用你的青春去推倒更多的妹纸,去繁衍更多的下一代..去…

如果你认为源码更可控,你觉得有必要和我一样装逼的话,那来吧。。。

1.安装python-dev

sudo apt-get install python-dev

2.安装libmysqlclient-dev

sudo apt-get install libmysqlclient-dev

3.安装setuptools

下载地址:http://pypi.python.org/pypi/setuptools#downloads,选择从源码安装:
tar zxvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py build
python setup.py install

如果有权限问题,请sudo,下面不再重复这个问题

4.安装MYSQL FOR PYTHON (MYSQLdb):
下载地址:http://sourceforge.net/projects/mysql-python/

tar zxvf MySQL-python-1.2.3.tar.gz
$ cd MySQL-python-1.2.3
$ #如果有必要的话,编辑 site.cfg 其中mysql_config的路径正确,详情可以看README
$ python setup.py build
$ sudo python setup.py install

一切无误的话,可以测试一下了:
$ python
>>>import MYSQLdb

如果你也和我一样杯摧的报这个错的话:
ImportError: libmysqlclient.so.18: cannot open shared object file: No such file or directory

那你要找到你的libmysqlclient.so.18这个文件,建个链接:

ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18

总之。。真TMD累!

			

高性能建站指南

今天上班昏昏欲睡,于是本着鞭策自己、鞭打别人的原则,又把高性能建站指南那几条指导方针重温了一下,好记性不如烂笔头啊。。人老色衰,就连记忆力也不行了。岁月是一个魂淡啊!

  • 减少HTTP请求
  • 添加Expires头
  • 压缩组件
  • 将样式表放在顶部
  • 将脚本放在底部
  • 避免CSS表达式
  • 使用外部Javascript和CSS
  • 精简Javascript
  • 避免重定向
  • 移除重复脚本
  • 配置或移除Etag
  • 使Ajax可缓存
  • 使用内容发布网络(CDN)
  • 减少DNS查找