2010年9月25日

rails的表示方式

app/view/name.html.erb -- 中文叫做视图,其实只作显示的一堆页面罢了。它们只显示app/controller/name_controller.rb里面函数的输出信息。name_controller.rb也就一堆函数罢了,只是把结果传给app/view/name.html.erb让它来显示,它们不可以做出任何显示的内容。它们俩是对应的,两者缺一不可。文件名也一定要对应起来!
它们的关系是: controller -----------> view -----------> 浏览器
而解析过程就是:
---------->config/routes.rb ----------->app/controller/name_controller.rb --------------------------> app/view/name.html.erb,
当app/view/name.html.erb没有内容时,浏览器会报下面的错误信息的:

Missing template main/name with {:locale=>[:en, :en], :formats=>[:html], :handlers=>[:rxml, :builder, :erb, :rjs, :rhtml]} in view paths "/data/photo/app/views"

从错误信息上面看得出,原来app/views/里面的东西都只一些模板,而内容呢就是app/controller/name_controller.rb里面的东西。这样可以拿一部手机去比喻它们间的关系:我手机上那几寸大的屏幕就是app/view/name.html.erb, 而手机后面的芯片组就是app/controller/nmae_controller!

Controller前面还有一层,那就是模型层。模型层是代码与数据库之间的那道门。除非通过模型,否则应用程序无法从数据库获得任何东西,当然也无法把任何东西写回数据库。

2010年9月20日

标准输出

无论在哪些环境里面(如进入mysql里执行的命令,在Terminal里运行命令后的输出,输入程序得出的输出)的输出,都可认为是标准输出,都是可以进行处理(如使用sed, awk, grep, cut.......)的。

2010年9月13日

lighttpd与nginx的性能比较

以下的测试是使用http_load来进行测试。
http_load的一些参数:
-parallel/-p N:并发的用户进程数。
-fetches/-f N: 总计的访问次数
-rate/-p N: 每秒的访问频率
-seconds/-s N: 总计的访问时间

下面是简单测试后的结果:

IN[~]>>>http_load -parallel 5 -fetches 1000 url.txt
1000 fetches, 5 max parallel, 3.7365e+07 bytes, in 20.0007 seconds
37365 mean bytes/connection
49.9981 fetches/sec, 1.86818e+06 bytes/sec
msecs/connect: 0.097766 mean, 1.208 max, 0.043 min
msecs/first-response: 0.691867 mean, 2.7 max, 0.443 min
HTTP response codes:
code 200 -- 1000
结果说明1000 fetches,获得1000个请求,5个并发的进程,20.0007秒内在一共传输了3.7365e+07 bytes。每个进程的传输数据量的大小为37365bytes.每秒有49.9981个请求和1.86818e+06 bytes的数据。每一连接的响应时间为0.097766毫秒,最大响应时间为1.208毫秒,最小响应时间为0.043毫秒。第一次响应时间为0.691867毫秒,最大的响应时间为2.7毫秒,最小的响应时候为0.443毫秒。响应页面的类型是200. 1000请求都为200!
IN[~]>>>http_load -parallel 5 -fetches 1000 urls.txt
1000 fetches, 5 max parallel, 3.7365e+07 bytes, in 39.9998 seconds
37365 mean bytes/connection
25.0001 fetches/sec, 934129 bytes/sec
msecs/connect: 0.129849 mean, 1.714 max, 0.047 min
msecs/first-response: 0.623193 mean, 4.695 max, 0.37 min
HTTP response codes:
code 200 -- 1000
结果说明1000 fetches,获得1000个请求,5个并发的进程,39.9998秒内在一共传输了3.7365e+07 bytes。每个进程的传输数据量的大小为37365bytes.每秒有25.0001个请求和934129 bytes的数据。每一连接的响应时间为0.129849毫秒,最大响应时间为1.714毫秒,最小响应时间为0.047毫秒。第一次响应时间为0.623193毫秒,最大的响应时间为4.695毫秒,最小的响应时候为0.37毫秒。响应页面的类型是200. 1000请求都为200!
IN[~]>>>http_load -rate 5 -seconds 10 url.txt
49 fetches, 1 max parallel, 1.83088e+06 bytes, in 10.0164 seconds
37365 mean bytes/connection
4.89197 fetches/sec, 182788 bytes/sec
msecs/connect: 0.226449 mean, 0.706 max, 0.179 min
msecs/first-response: 0.233184 mean, 0.786 max, 0.194 min
HTTP response codes:
code 200 -- 49
IN[~]>>>http_load -rate 5 -seconds 10 urls.txt
49 fetches, 1 max parallel, 1.83088e+06 bytes, in 10.0106 seconds
37365 mean bytes/connection
4.8948 fetches/sec, 182894 bytes/sec
msecs/connect: 0.332449 mean, 1.048 max, 0.274 min
msecs/first-response: 0.196571 mean, 0.305 max, 0.167 min
HTTP response codes:
code 200 -- 49

而url.txt和urls.txt的内容分别是
url.txt (nginx)
http://localhost:8080/

urls.txt (lighttpd)
http://localhost/


它们的配置文件如下:

lighttpd1.5

server.modules = (
"mod_access","mod_accesslog" )
server.document-root = "/data/"
server.errorlog = "/var/log/lighttpd.error.log"
index-file.names = ( "index.php", "index.html")

server.pid-file = "/var/run/lighttpd.pid"
server.tag = "Lighttpd"
server.username = "www"
server.groupname = "www"
# mimetype mapping
mimetype.assign = (
,
".gif" => "image/gif",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".dtd" => "text/xml",
".xml" => "text/xml"
)
accesslog.filename = "/var/log/lighttpd.access.log"
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )


nginx0.8.49

user www www;
worker_processes 1;
error_log /var/log/nginx.error.log info;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx.access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
location / {
root /data;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
}
}


从这里可以简单的看到,nginx的性能比lighttpd真的好一点,不过我发现了几个nginx不足的地方:
1 日志文件过于简单.我刚配置的时候,nginx无法支持php,我查看错误日志,错误日志只显示1051 directory index of "/data/blog/" is forbidden这个信息,并没指出错误所在,这一点就不够lighttpd了。其实nginx的错误日志有几种格式,我试过几个都不行!
2 启动后内存有点大。启动后nginx所占的内存比lighttpd大了快一倍。我想应该是nginx在启动后就加载了所有的模块,而lighttpd对模块的加载是可选的

上面只是我刚开始玩nginx的片面之谈。其实nginx有很多lighttpd无法比拟的地方。

2010年9月8日

N900导出短信

在终端里面输入:

echo "<TABLE>" > /home/user/MyDocs/output.html
sqlite3 -html /home/user/.rtcom-eventlogger/el-v1.db "SELECT start_time,service_id,event_type_id,free_text, remote_uid FROM Events ORDER BY
start_time DESC;" >> /home/user/MyDocs/output.html
echo "</TABLE>" >> /home/user/MyDocs/output.html


在这里可以看到,N900将短信(就是我发出去和收到的)储存在/home/user/.rtcom-eventlogger/el-v1.db这个数据库文件里面。通过sqlite3可以导出这些数据

这样子的导出格式是html格式的,这样方便可以通过浏览器去查看这些信息。

2010年9月3日

varnish函数

下面我是理解的8个函数的用法。varnish是通过这些函数来对数据进行缓存或不缓存的。

Vcl_recl: 将匹配的数据放到varnish中

Vcl_fetch: 后端已获得数据并对其进行处理,并将处理后的数据返回给Browser是的操作。

Vcl_hash: 确定找到request的已使用的哈希key就进行的操作。

Vcl_miss: 当无法在缓存里面找到相应请求,这个就是SA对Varnish的操作,并不在后端和用户的范围内。

Vcl_pass: 将转换为最小的缓存服务不可处理的数据然后调给后端。这样做的原因是为了减轻后端的负担。

Vcl_hit: 在缓存服务器上可以直接找到数据然后就返回给用户,并不需要经过后端。

Vcl_deliver: 在(来自于缓存或后端web服务的)应答对象送到客户端前的操作。

Vcl_pipe: 不经过缓存服务器,直接去到后端让后端进行处理。