云计算的几个名词

刚看了中移动研究院院长黄晓庆的一个视频,算是稍微对云计算有个初步的概念了
Google的

BigTable  结构化海量数据管理
MapReduce 并行数据处理
Chubby    分布式锁服务
GFS       分布式文件系统
BORG      集群管理和调度系统

相应的开源解决方案

HDFS(GFS)
MapReduce、PIG(SAWZALL)
Hbase(BigTable)
Zookeeper(Chubby)

设置PHP的默认时区

自 PHP 5.1.0 起(此版本日期时间函数被重写了),如果时区不合法则每个对日期时间函数的调用都会产生一条 E_NOTICE 级别的错误信息,如果使用系统设定或 TZ 环境变量则还会产生 E_STRICT 级别的信息。

不像Unix/Linux平台还有一个 TZ 环境变量可以用,在WIN32平台下, 不设置时区,那么时间都是按照格林威治标准时间走的。比如“北京时间上午10点”,在你的脚本里就会认为是凌晨2点(减8小时)。

PHP的默认时区,可以通过修改php.ini的 date.timezon 值来设定。

date_default_timezone_get()函数可以得到你的脚本中所有日期时间函数所使用的默认时区。如果它返回的是UTC,则说明没有被设置一个默认的时区。除了修改php.ini文件,我们还可以在脚本中用 date_default_timezone_set()函数来进行默认时区的设置。

下面这些,都是设置为北京时间(GMT+8)的

date_default_timezone_set(‘Asia/Chongqing’); //重庆
date_default_timezone_set(‘Asia/Chungking’); //重庆
date_default_timezone_set(‘Asia/Harbin’);//哈尔滨
date_default_timezone_set(‘Asia/Hong_Kong’);//香港
date_default_timezone_set(‘Asia/Macau’);//澳门
date_default_timezone_set(‘Asia/Macao’);//澳门
date_default_timezone_set(‘Asia/Shanghai’);//上海
date_default_timezone_set(‘Asia/Taipei’);//台北
date_default_timezone_set(‘Asia/Urumqi’);//乌鲁木齐

参见:date_default_timezone_get() date_default_timezone_set PHP所支持时区列表

php+nginx实现的文件下载

发送X-Accel-Redirect头实现直接定位成静态下载

$root_path = ‘/web/www’; //网站根目录
$file_path = ‘/data/t.txt’;  //文件路径

//发送下载的头信息
header(“Content-type: application/x-octet-stream”);
header(“Accept-Ranges: bytes”);
header(“Content-Disposition: attachment; filename=”.basename($file_path));
header(“Content-Length: “.filesize($root_path.$file_path));

//发送文件定位,是相对网站目录的路径
header(“X-Accel-Redirect: “.$file_path);

windows下导入postgresql的数据库备份文件

在linux下面用pg_dump导出一个数据库到文本文件,在windows下面如果用这个命令导入的话,会因为字符集的问题在某些地方失败:

psql my_db < backup.sql

但是,如果通过这个命令导入,就会成功,并且数据是完全正确的:

psql -d my_db -f backup.sql

上面的两种导入方式,在linux下面都是没有问题的。至于为什么windows下出问题,完全不知道……

被《红河》咬到手指了

在床上翻来覆去好半天,就是睡不着。决定起来把刚下完的《红河》给看喽。

对这片子,之前一点不了解,完全因为verycd的推荐,看完之后,完全的惊艳!

真的很久没有看到拍的这么美这么纯得电影了,清澈的红河、翠盈盈的越南小调、湿热暧昧的空气、还有水到渠成的爱情。章家瑞真是把云南拍绝了。现在感觉张静初这娃还真是挺漂亮挺可爱的,她刻画这类所谓的问题女性,貌似是越来越专业了。

就像片子里瑶族的婚俗一样,用牙齿狠狠地咬上心上人的手指就表明爱上了对方,我被《红河》咬到手指了:)

强烈感觉这片子还有张静初会弄到点什么奖。

真困了,睡觉!

ProFTPD搭载sqlite3,简单配置轻量级FTP服务器

所谓简单,是因为ProFTPD的一些复杂功能都没有写进来,比如用户磁盘空间配额、上传下载速率限制等。
所谓轻量级,是因为配这个平台,是为了公司内部使用,用户有限。更复杂的配置,日后再说吧:)

网上的很多关于ProFTPD搭载数据库进行管理的文章,大多用的都是MySQL(搜baidu的结果)和PostgreSQL(搜google的结果),可是单单为了一个公司内部使用的这么一个小平台,使用这么两个重量级的数据库,是在有点杀鸡用牛刀的感觉。对于我的需求,Sqlite这个轻量级的嵌入式数据库,显然是最最合适的选择。在网上跑来跑去找了1个多小时,也没有一篇像样的配置文档,甚至连ProFTPD的官方doc里,提起sqlite也是只言片语。没办法,只有自己对着英文的Howto,自己摸索了。

1,Install Sqlite3 and ProFTPD
下载安装Sqlite3最新版:http://www.sqlite.org/

#tar -zxf sqlite-amalgamation-3.6.13.tar.gz
#cd sqlite-3.6.13/
#./configure
#make
#make install

下载安装ProFTPD最新版:http://www.proftpd.org/
ProFTPD对于数据库的支持,并不是通过linux的PAM方式来实现的
而是内置了模块,这点曾经让我走了很多弯路,TMD居然没有文章提及这点。使用sqlite模块:

#tar -zxf proftpd-1.3.2.tar.gz
#cd proftpd-1.3.2
#./configure –prefix=/usr/local/proftpd –with-modules=mod_sql:mod_sql_sqlite
#make
#make install

2,配置ProFTPD
编辑/usr/local/proftpd/etc/proftpd.conf文件,加入下面列出来的这一大坨参数。
这里只说说跟Sqlite3有关的参数,其他比较有用的参数配置说明,满世界都是。完整配置文件放在最后。
其实除了SQLBackend和SQLConnectInfo两个参数之外,剩下的一些参数在配置其他数据库时也会用到
我在配置这些数据库相关参数的时候,走了很多弯路,查了很多文档,记下来也给自己脑子备个份。

#首先来说这俩,定义proftpd以什么身份来运行,跟apache里的是一个意思
#我是习惯了apache定义为www用户和www组,配置proftpd也就这样了
#以什么身份运行,我个人感觉没啥特别意义,关键是虚拟用户对实体用户的映射!
User www
Group www

#sqlite2跟3差别较大,各软件平台对其支持也是分开来的,比如PHP
#这里就是指明,使用sqlite3
SQLBackend sqlite3
#数据库文件的绝对路径,一定要绝对
SQLConnectInfo /home/www/ftpd.db
#数据库内虚拟用户的密码认证方式
#我认为Backend的意思就是数据库自己的认证方式,比如mysql的password方案
#该方案可以指定多种,使用空格隔开,按照先后,依次try
#下面这句的意思就是“先用sqlite自己的认证方式(我用的明文,其他解决方案没研究)
#如果不行,再使用crypt(3)的方案”,实际配置文件里我只要了一个Backend
SQLAuthTypes Backend Crypt
#自定义存放用户信息的表和字段
#下面这句的意思就是
#users表 里的 字段:用户名 密码 系统映射uid 系统映射gid 主目录 shell路径
#切记:表和字段的名字可以随便起(跟实际数据库中的表和字段相对应),但顺序不可乱
#按照我对英文howto的理解,前4个字段名是必须要设置的,后两个如果自己用不上
#必须使用NULL来填补,这样mod_sql模块就不会去检索这俩字段了
SQLUserInfo users user_name user_passwd uid gid home_dir NULL
#如果主目录字段名设置为NULL,那么这里这个就必须要定义
#这个是用来定义那些没有“主目录定义的用户”的主目录,有点绕口:P
#SQLDefaultHomedir “/tmp”
#这个参数设置为off的意思,是不让proftpd去检查该FTP用户映射到系统里的用户的shell
#就是说,有没有shell,我都让你登陆。特别是上面的字段,将shell路径这个设置为了NULL
RequireValidShell off
#组信息,没啥意思,就这么放着吧,意思跟上面那个SQLUserInfo一样
#表名 组名 组id 成员
SQLGroupInfo groups group_name gid members
#这里是用户身份认证的程度,只验证user,连带group啥的都验证
#图简单,我这里只验证user这一层
SQLAuthenticate users
#设置ProFTPD允许登陆的最小UID,这个UID是映射到linux系统内实际用户的UID,小于这个值将不允许登陆
#这个值如果不设置,系统默认的是999,在很多国内的文章里,uid和gid都是设置5000多
#所以即使不管这个值,也不会有问题,可是如果你跟我一样,映射用户的uid和gid都小于999了,就要注意它了
#我的www用户的uid和gid都是504,在这里,卡了我有一个多小时,TNND
SQLMinUserUID 500
#这两个的意思,是所有未在数据库中定义uid和gid的用户的默认uid及gid
SQLDefaultUID 504
SQLDefaultGID 504

我的完整的proftpd.conf文件

http://rui7905.googlecode.com/svn/trunk/proftpd_sqlite3

3,建立数据库及用户表
#sqlite3 /home/www/ftpd.db 数据库就建好了,简单吧~
其实理论上,这个文件的路径,是放在哪里都可以的。我配置完这个平台后,又用php写了一个简单的管理平台
为了方便我的apache运行用户www读写数据库,就放在了www的主目录下。。
在sqlite3环境下,用下面这个语句建立数据表

CREATE TABLE “users” (“user_name” varchar(20), “user_passwd” varchar(50), “uid” int(11) NOT NULL DEFAULT 504, “gid” int(11) NOT NULL DEFAULT 504, “home_dir” varchar(200), “shell” varchar(200))

下面创建一个新用户:

INSERT INTO “users” VALUES(‘test’,’test’,504,504,’/home/www/ftp/test’,NULL);

表的uid和gid的默认值都设置为了504,即www用户在系统内的uid和gid的值。新添加字段时,这两个字段我也设置了。www用户和组在我系统内是早就建好的,uid和gid分别都是504。通过这两个字段的值,就完成了proftpd内的虚拟用户跟系统内实体用户的映射。具体到自己,请根据实际情况来设置这两个字段的默认值,及新添加记录的值。
4,最后
到现在,整个配置应该是完成了,使用这个命令来启动ProFTPD:

/usr/local/proftpd/sbin/proftpd -c /usr/local/proftpd/etc/proftpd.conf &

参考资料:
ProFTPD Howto:SQL and mod_sql:
http://www.proftpd.org/docs/howto/SQL.html
ProFTPD module mod_sql:
http://www.proftpd.org/docs/contrib/mod_sql.html
ProFTPD module mod_sql_sqlite:
http://www.proftpd.org/docs/contrib/mod_sql_sqlite.html
Configuration Directive List:
http://www.proftpd.org/docs/directives/linked/by-name.html
Simple MySQL Authentication:
http://www.proftpd.org/docs/configs/mysql_simple.conf