mysql my.cnf 详解

Mysql my.ini 配置文件详解
#BEGIN CONFIG INFO
#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大
#TYPE: SYSTEM
#END CONFIG INFO
#
# 此mysql配置文件例子针对4G内存
# 主要使用INNODB
#处理复杂队列并且连接数量较少的mysql服务器
# 
# 将此文件复制到/etc/my.cnf 作为全局设置,
# mysql-data-dir/my.cnf 作为服务器指定设置
# (@localstatedir@ for this installation) 或者放入
# ~/.my.cnf 作为用户设置.
#
# 在此配置文件中, 你可以使用所有程序支持的长选项.
# 如果想获悉程序支持的所有选项
# 请在程序后加上"--help"参数运行程序.
#
# 关于独立选项更多的细节信息可以在手册内找到
#
#
# 以下选项会被MySQL客户端应用读取.
# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容.
# 如果你想你自己的MySQL应用程序获取这些值
# 需要在MySQL客户端库初始化的时候指定这些选项
#
[client]
#password = [your_password]
port = @MYSQL_TCP_PORT@
socket = @MYSQL_UNIX_ADDR@
# *** 应用定制选项 ***
#
#  MySQL 服务端
#
[mysqld]
# 一般配置选项
port = @MYSQL_TCP_PORT@
socket = @MYSQL_UNIX_ADDR@
# back_log 是操作系统在监听队列中所能保持的连接数,
# 队列保存了在MySQL连接管理器线程处理之前的连接.
# 如果你有非常高的连接率并且出现"connection refused" 报错,
# 你就应该增加此处的值.
# 检查你的操作系统文档来获取这个变量的最大值.
# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果
back_log = 50
# 不在TCP/IP端口上进行监听.
# 如果所有的进程都是在同一台服务器连接到本地的mysqld,
# 这样设置将是增强安全的方法
# 所有mysqld的连接都是通过Unix sockets 或者命名管道进行的.
# 注意在windows下如果没有打开命名管道选项而只是用此项
# (通过 "enable-named-pipe" 选项) 将会导致mysql服务没有任何作用!
#skip-networking
# MySQL 服务所允许的同时会话数的上限
# 其中一个连接将被SUPER权限保留作为管理员登录.
# 即便已经达到了连接数的上限.
max_connections = 100
# 每个客户端连接最大的错误允许数量,如果达到了此限制.
# 这个客户端将会被MySQL服务阻止直到执行了"FLUSH HOSTS" 或者服务重启
# 非法的密码以及其他在链接时的错误会增加此值.
# 查看 "Aborted_connects" 状态来获取全局计数器.
max_connect_errors = 10
# 所有线程所打开表的数量.
# 增加此值就增加了mysqld所需要的文件描述符的数量
# 这样你需要确认在[mysqld_safe]中 "open-files-limit" 变量设置打开文件数量允许至少4096
table_cache = 2048
# 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响
# 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!) 
# 或者你在文件层面上使用了其他一些软件依赖来锁定MyISAM表
#external-locking
# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)
# 每个连接独立的大小.大小动态增加
max_allowed_packet = 16M
# 在一个事务中binlog为了记录SQL状态所持有的cache大小
# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能. 
# 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中
# 如果事务比此值大, 会使用磁盘上的临时文件来替代. 
# 此缓冲在每个连接的事务第一次更新状态时被创建
binlog_cache_size = 1M
# 独立的内存表所允许的最大容量. 
# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.
max_heap_table_size = 64M
# 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序
# 如果排序后的数据无法放入排序缓冲, 
# 一个用来替代的基于磁盘的合并分类会被使用
# 查看 "Sort_merge_passes" 状态变量.
# 在排序发生时由每个线程分配
sort_buffer_size = 8M
# 此缓冲被使用来优化全联合(full JOINs 不带索引的联合). 
# 类似的联合在极大多数情况下有非常糟糕的性能表现,
# 但是将此值设大能够减轻性能影响.
# 通过 "Select_full_join" 状态变量查看全联合的数量
# 当全联合发生时,在每个线程中分配
join_buffer_size = 8M
# 我们在cache中保留多少线程用于重用
# 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,
# 则客户端线程被放入cache中. 
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)
thread_cache_size = 8
# 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.
# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).
# 你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值
thread_concurrency = 8
# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果. 
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.
# 查看 "Qcache_lowmem_prunes" 状态变量来检查是否当前值对于你的负载来说是否足够高.
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,
# 查询缓冲也许引起性能下降而不是性能提升.
query_cache_size = 64M
# 只有小于此设定值的结果才会被缓冲
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.
query_cache_limit = 2M
# 被全文检索索引的最小的字长.
# 你也许希望减少它,如果你需要搜索更短字的时候.
# 注意在你修改此值之后,
# 你需要重建你的 FULLTEXT 索引
ft_min_word_len = 4
# 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的mysql在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被swapping out
# 此选项对于性能有益
#memlock
# 当创建新表时作为默认使用的表类型,
# 如果在创建表示没有特别执行表类型,将会使用此值
default_table_type = MYISAM
# 线程使用的堆大小. 此容量的内存在每次连接时被预留.
# MySQL 本身常不会需要超过64K的内存
# 如果你使用你自己的需要大量堆的UDF函数
# 或者你的操作系统对于某些操作需要更多的堆,
# 你也许需要将其设置的更高一点.
thread_stack = 192K
# 设定默认的事务隔离级别.可用的级别如下:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = REPEATABLE-READ
# 内部(内存中)临时表的最大大小
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.
# 此限制是针对单个表的,而不是总和. 
tmp_table_size = 64M
# 打开二进制日志功能.
# 在复制(replication)配置中,作为MASTER主服务器必须打开此项
# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.
log-bin=mysql-bin
# 如果你在使用链式从服务器结构的复制模式 (A->B->C), 
# 你需要在服务器B上打开此项. 
# 此选项打开在从线程上重做过的更新的日志,
# 并将其写入从服务器的二进制日志.
#log_slave_updates
# 打开全查询日志. 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询) 
# 都会被记录下来. 这对于调试非常有用, 在生产环境中常常关闭此项.
#log
# 将警告打印输出到错误log文件.  如果你对于MySQL有任何问题
# 你应该打开警告log并且仔细审查错误日志,查出可能的原因. 
#log_warnings
# 记录慢速查询. 慢速查询是指消耗了比 "long_query_time" 定义的更多时间的查询.
# 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.
# 如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,
log_slow_queries
# 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.
# 不要在这里使用"1", 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).
long_query_time = 2
# 在慢速日志中记录更多的信息.
# 一般此项最好打开.
# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里
log_long_format
# 此目录被MySQL用来保存临时文件.例如,
# 它被用来处理基于磁盘的大型排序,和内部排序一样.
# 以及简单的临时表.
# 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好
# 另一种选择是你也可以将其放置在独立的磁盘上. 
# 你可以使用";"来放置多个路径
# 他们会按照roud-robin方法被轮询使用.
#tmpdir = /tmp
# ***  复制有关的设置
# 唯一的服务辨识号,数值位于 1 到 2^32-1之间. 
# 此值在master和slave上都需要设置.
# 如果 "master-host" 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.
server-id = 1
# 复制的Slave (去掉master段的注释来使其生效)
#
# 为了配置此主机作为复制的slave服务器,你可以选择两种方法:
#
# 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) -
#    语法如下:
#
#    CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,
#    MASTER_USER=, MASTER_PASSWORD= ;
#
#    你需要替换掉 , ,  等被尖括号包围的字段以及使用master的端口号替换 (默认3306).
#
#    例子:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# 或者
#
# 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下,
#     例如如果你输入错密码在master-password字段并且slave无法连接), 
#    slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略
#    并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务.
#    由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替
#
# 所需要的唯一id号位于 2 和 2^32 - 1之间
# (并且和master不同)
# 如果master-host被设置了.则默认值是2
# 但是如果省略,则不会生效
#server-id = 2
#
# 复制结构中的master - 必须
#master-host = 
#
# 当连接到master上时slave所用来认证的用户名 - 必须
#master-user = 
#
# 当连接到master上时slave所用来认证的密码 - 必须
#master-password = 
#
# master监听的端口.
# 可选 - 默认是3306
#master-port = 
# 使得slave只读.只有用户拥有SUPER权限和在上面的slave线程能够修改数据.
# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据
#read_only
#*** MyISAM 相关选项
# 关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.
# 不要将其设置大于你可用内存的30%, 
# 因为一部分内存同样被OS用来缓冲行数据 
# 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.
key_buffer_size = 32M
# 用来做MyISAM表全表扫描的缓冲大小.
# 当全表扫描需要时,在对应线程中分配.
read_buffer_size = 2M
# 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道. 
# 如果你增高此值,可以提高很多ORDER BY的性能.
# 当需要时由每个线程分配
read_rnd_buffer_size = 16M
# MyISAM 使用特殊的类似树的cache来使得突发插入
# (这些插入是,INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., 以及 LOAD DATA
# INFILE) 更快. 此变量限制每个进程中缓冲树的字节数. 
# 设置为 0 会关闭此优化.
# 为了最优化不要将此值设置大于 "key_buffer_size".
# 当突发插入被检测到时此缓冲将被分配.
bulk_insert_buffer_size = 64M
# 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.
# 这在每个线程中被分配.所以在设置大值时需要小心.
myisam_sort_buffer_size = 128M
# MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)
myisam_max_sort_file_size = 10G
# 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.
# 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.
myisam_max_extra_sort_file_size = 10G
# 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.
# 这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.
myisam_repair_threads = 1
# 自动检查和修复没有适当关闭的 MyISAM 表.
myisam_recover
# 默认关闭 Federated 
skip-federated
# *** BDB 相关选项 ***
# 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事.
skip-bdb
# *** INNODB 相关选项 ***
# 如果你的MySQL服务包含InnoDB支持但是并不打算使用的话,
# 使用此选项会节省内存以及磁盘空间,并且加速某些部分
#skip-innodb
# 附加的内存池被InnoDB用来保存 metadata 信息
# 如果InnoDB为此目的需要更多的内存,它会开始从OS这里申请内存.
# 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.
# SHOW INNODB STATUS 命令会显示当先使用的数量.
innodb_additional_mem_pool_size = 16M
# InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM. 
# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%
# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. 
# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,
# 所以不要设置的太高.
innodb_buffer_pool_size = 2G
# InnoDB 将数据保存在一个或者多个数据文件中成为表空间.
# 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.
# 其他情况下.每个设备一个文件一般都是个好的选择.
# 你也可以配置InnoDB来使用裸盘分区 - 请参考手册来获取更多相关内容
innodb_data_file_path = ibdata1:10M:autoextend
# 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.
# 默认保存在MySQL的datadir中.
#innodb_data_home_dir = 
# 用来同步IO操作的IO线程的数量. This value is
# 此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.
innodb_file_io_threads = 4
# 如果你发现InnoDB表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.
# 从1开始并且增加此值知道你能够成功的导出表.
#innodb_force_recovery=1
# 在InnoDb核心内的允许线程数量. 
# 最优值依赖于应用程序,硬件以及操作系统的调度方式. 
# 过高的值可能导致线程的互斥颠簸.
innodb_thread_concurrency = 16
# 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,
# 这提供了完整的ACID行为.
# 如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O
# 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘. 
# 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.
innodb_flush_log_at_trx_commit = 1
# 加速InnoDB的关闭. 这会阻止InnoDB在关闭时做全清除以及插入缓冲合并.
# 这可能极大增加关机时间, 但是取而代之的是InnoDB可能在下次启动时做这些操作.
#innodb_fast_shutdown
# 用来缓冲日志数据的缓冲区的大小.
# 当此值快满时, InnoDB将必须刷新数据到磁盘上.
# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)
innodb_log_buffer_size = 8M
# 在日志组中每个日志文件的大小.
# 你应该设置日志文件总合大小到你缓冲池大小的25%~100%
# 来避免在日志文件覆写上不必要的缓冲池刷新行为.
# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.
innodb_log_file_size = 256M
# 在日志组中的文件总数.
# 通常来说2~3是比较好的.
innodb_log_files_in_group = 3
# InnoDB的日志文件所在位置. 默认是MySQL的datadir.
# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能
#innodb_log_group_home_dir
# 在InnoDB缓冲池中最大允许的脏页面的比例.
# 如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.
# 这是一个软限制,不被保证绝对执行.
innodb_max_dirty_pages_pct = 90
# InnoDB用来刷新日志的方法.
# 表空间总是使用双重写入刷新方法
# 默认值是 "fdatasync", 另一个是 "O_DSYNC".
#innodb_flush_method=O_DSYNC
# 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.
# InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.
# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎
# 那么一个死锁可能发生而InnoDB无法注意到.
# 这种情况下这个timeout值对于解决这种问题就非常有帮助.
innodb_lock_wait_timeout = 120
[mysqldump]
# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# 仅仅允许使用键值的 UPDATEs 和 DELETEs .
#safe-updates
[isamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
# 增加每个进程的可打开文件数量.
# 警告: 确认你已经将全系统限制设定的足够高! 
# 打开大量表需要将此值设高
open-files-limit = 8192

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/106704/showart_2124313.html

psyco 真的很神奇

测试代码
http://www.timestretch.com/FractalBenchmark.html#e7142f2f73f8eb4245f1b25aa6340470

没有使用 psyco 3.4 左右,生成 pyc 3.14 ,用了 psyco 0.34
真是太强大了,

freebsd 安装 psyco

cd /usr/ports/devel/py-psyco
make install clean

开启

import psyco
psyco.full()

VBoxManage命令详解

VBoxManage命令详解
本人对vboxmange命令按我个人的理解作了解释,由于本人水平有限难免有错误的地方,希望大家帮我指正。

VBoxManage [-v|-version] 显示virtualbox的版本号
VBoxManage -nologo 隐藏logo
VBoxManage -convertSettings 允许自动转换设置文件
VBoxManage -convertSettingsBackup 允许自动转换设置文件,并在转换前作备份
VBoxManage -convertSettingsIgnore 允许自动转换设置文件,但是不保存结果

VBoxManage list vms|runningvms 显示列表虚拟机|正在运行的虚拟机
|ostypes|hostdvds virtualbox支持的系统类型|宿主机的光盘驱动器
|hostfloppies 宿主机的软盘驱动器
|hostifs|hostinfo 宿主机的网络接口|宿主机的信息
|hdds|dvds 已注册的虚拟硬盘|已注册的虚拟光盘
|floppies|usbhost 已注册的虚拟软盘|宿主机的USB设备
|usbfilters USB筛选器
|systemproperties 虚拟机的基本信息

VBoxManage showvminfo | 显示指定虚拟机的信息
[-details] 显示详细信息
[-statistics] 显示统计信息
[-machinereadable] 以清晰的格式显示虚拟机信息

VBoxManage registervm 将指定文件所在的虚拟机添加到列表

VBoxManage unregistervm | 从虚拟机列表清除指定的虚拟机
[-delete] 从虚拟机列表删除指定的虚拟机

VBoxManage createvm -name 创建指定名称的虚拟机
[-register] 将创建的虚拟机添加到列表
[-basefolder 指定虚拟机的基础目录
[-settingsfile ] 指定虚拟机配置文件的基础目录
[-uuid ] 创建指定uuid的虚拟机

VBoxManage modifyvm 编辑指定的虚拟机的配置
[-name ] 修改虚拟机的名称
[-ostype ]修改虚拟机的操作系统类型
[-memory ] 修改虚拟机的内存大小
[-vram ] 修改虚拟机的显存大小
[-acpi on|off] 启动或禁止acpi电源管理接口
[-ioapic on|off] 启动或禁止I/O APIC电源管理接口
[-pae on|off] 启动或禁止CPU的PAE支持,PAE是
Physical Address Extension : 物理地址扩展
[-hwvirtex on|off|default]启动或禁止CPU的硬件虚拟化支持
[-nestedpaging on|off] 开启或关闭CPU的嵌套页面列表支持
[-monitorcount ] 设置显示器数目,VRDP多用户模式时 [-bioslogofadein on|off] 开启或关闭bioslogo渐显效果
[-bioslogofadeout on|off] 开启或关闭bioslogo渐隐效果
[-bioslogodisplaytime ]设置bioslogo显示时间(以毫秒为单位)
[-bioslogoimagepath ]设置bioslogo图像路径,用于自定义bioslogo
[-biosbootmenu disabled| 设置是否显示bios启动菜单 关闭
menuonly| 只菜单
messageandmenu] 信息和菜单
[-biossystemtimeoffset ] 设置bios系统时间补偿(以毫秒为单位)
[-biospxedebug on|off] 打开或关闭biospxe调试
[-boot<1-4> none|floppy|dvd|disk|net>] 设置启动顺序
[-hd none||] 为虚拟机添加三个IDE设备之一(第2个主盘被vm保留作为光驱,不能占用)在三个IDE中,你可以指定(硬盘)的vdi文件名或者它的UUID
[-idecontroller PIIX3|PIIX4] 设置IDE控制器的类型
[-sata on|off] 开启或关闭SATA硬盘控制器
[-sataportcount <1-30>] 设置虚拟机最多支持的SATA控制器数目
[-sataport<1-30> none| 没有硬盘连接到SATA控制器
| 指定uuid的硬盘连接到SATA控制器
] 指定文件名的硬盘连接到SATA控制器
[-sataideemulation<1-4> <1-30>] 指定一个SATA设备工作在IDE兼容模式,IDE设备编号是1-4,SATA设备编号是1-30
[-dvd none| 不连接DVD光驱
| 指定UUID的DVD光驱连接
| 将指定的光盘映像文件挂接到DVD光驱
host:] 将宿主机的DVD光驱挂接到虚拟机的DVD光驱
[-dvdpassthrough on|off]打开|关闭虚拟机里光盘的刻录功能
[-floppy disabled| 不连接软驱
empty| 连接软驱但不插入软盘
| 指定UUID的软驱连接
| 将指定的软盘映像文件挂接到软驱驱
host:] 将宿主机的软驱驱挂接到虚拟机的软驱
[-nic<1-N> none| 虚拟机不添加网卡
null| 虚拟机有网卡但不连接
nat| 网络连接使用NAT模式
hostif| 网络连接使用桥接模式
intnet] 网络连接使用内部网络模式
[-nictype<1-N> Am79C970A| 虚拟机连接AMD PCNet PCI II网卡
Am79C973| 虚拟机连接AMD PCNet FAST III网卡(默认)
82540EM| 虚拟机连接Intel PRO/1000 MT Desktop网卡
82543GC] 虚拟机连接Intel PRO/1000 T Server网卡
[-cableconnected<1-N> on|off]插入或拔出网线
[-nictrace<1-N> on|off] 开启或关闭网络追踪
[-nictracefile<1-N> ] 将网络流量追踪数据保存到文件
[-nicspeed<1-N> ] 设置网络连接的速度
[-hostifdev<1-N> none| 不连接到主机网络接口
] 桥接模式下连接到指定的主机接口
[-intnet<1-N> ] 内网模式下为虚拟机指定内部网络名称
[-natnet<1-N> | 配置NAT网络接口的地址
default] 默认NAT网络接口的地址是10.0.x.0/24
[-macaddress<1-N> auto| 自动生成虚拟网卡的MAC地址
] 指定虚拟网卡的MAC地址
[-uart<1-N> off| 不启用虚拟串口
]启用虚拟串口,并设置虚拟串口的I/O参数和IRQ参数
[-uartmode<1-N> disconnected| 启用虚拟串口,但不连接到宿主机的串口
server | 在宿主机创建PIPE通道,并将虚拟机串口连接到这个通道
client | 不创建PIPE通道,而是将虚拟机串口连接到已存在的通道
] 将虚拟机串口连接到宿主机的串口
[-gueststatisticsinterval ] 配置虚拟机静态时间间隔
[-audio none| 虚拟机不连接声卡
null| 将虚拟机的声卡连接到空的声音设备
dsound] 将虚拟机的声卡连接到宿主机的声卡
[-audiocontroller ac97| 将虚拟机声卡虚拟为ICH AC97声卡
sb16] 将虚拟机声卡虚拟为soundblaster 16声卡
[-clipboard disabled| 不共享剪贴板
hosttoguest| 将宿主机的剪贴板共享给虚拟机
guesttohost| 将虚拟机的剪贴板共享给宿主机
bidirectional] 宿主机和虚拟机共使用一个剪贴板
[-vrdp on|off] 开启|关闭virtualbox内置的VRDP服务器
[-vrdpport default| 使用默认的vrdp端口3389 ] 指定vrdp端口
[-vrdpaddress ] 指定VRDP主机地址
[-vrdpauthtype null| 不用授权,任何客户机都可以连接到VRDP服务器
external| 只有宿主机的用户才可以连接到VRDP服务器
guest] 只有虚拟机的用户才可以连接到VRDP服务器
[-vrdpmulticon on|off] 打开|关闭VRDP多用户连接模式
[-vrdpreusecon on|off] 打开|关闭VRDP断线重连
[-usb on|off] 打开|关闭虚拟USB控制器
[-usbehci on|off] 打开|关闭虚拟USB2.0控制器
[-snapshotfolder default| 将系统快照保存到默认文件夹 ] 将系统快照保存到指定文件夹

VBoxManage startvm | 开启指定UUID|名称的虚拟机
[-type gui|vrdp] 设置虚拟机标准显示设备GUI界面|VRDP

VBoxManage controlvm | 改变正在运行的虚拟机的状态
pause| 暂停,这时虚拟机窗口显示灰色
resume| 恢复暂停的虚拟机
reset| 复位
poweroff| 强行关闭
acpipowerbutton| 关机
acpisleepbutton| 使虚拟机处于睡眠状态
savestate| 保存状态然后关闭,相当于休眠
keyboardputscancode [ …] 键盘扫描码设置
setlinkstate<1-4> on|off 连接|断开网络连接
usbattach |

连接到指定UUDI|地址的USB设备
usbdetach |
断开指定UUDI|地址的USB设备
dvdattach none| 不连接虚拟DVD光驱
| 连接到指定UUID的DVD光驱
| 连接到指定名称的DVD映像文件
host: 连接到宿主机的DVD光驱
floppyattach none| 不连接虚拟软驱
| 连接到指定UUID的虚拟软驱
| 连接到指定名称的软盘映像文件
host: 连接到宿主机的软驱

setvideomodehint 设置虚拟机的屏幕分辨率 水平像素
垂直像素
颜色深度
[display] 刷新频率
setcredentials 指定VRDP自动连接参数 用户名 密码

[-allowlocallogon ] 允许|禁止本地登陆

VBoxManage discardstate | 丢弃指定UUID|名称的虚拟机的保存状态

VBoxManage adoptstate | 将虚拟机从指定的保存状态中恢复

VBoxManage snapshot | 为指定的虚拟机拍快照
take 为快照取名
[-desc ]| 给快照添加描述
discard | | 丢弃指定的快照
discardcurrent -state| 恢复到最近的快照
-all | 恢复到倒数第二个快照
edit || 编辑指定的快照
-current 编辑当前快照
[-newname ] 修改快照名称
[-newdesc ] 修改快照描述
showvminfo | 显示快照的虚拟机信息

VBoxManage registerimage disk|dvd|floppy 注册硬盘、光盘、软盘映像文件
[-type normal| 注册为普通类型(可创建快照,可读写)
immutable| 注册为只读类型(相当于加了硬盘卡)
writethrough] 注册为可写类型(这种类型不能创建快照)
(disk only) (注册类型选项只适用于硬盘)

VBoxManage unregisterimage disk| 从虚拟介质管理器删除指定的硬盘
dvd| 从虚拟介质管理器删除指定的DVD光盘
floppy 从虚拟介质管理器删除指定的软盘
| 删除时指定UUID
删除时指定映像文件

VBoxManage showvdiinfo | 显示指定UUID|名称虚拟硬盘的信息

VBoxManage createvdi -filename 创建指定名称的虚拟硬盘
-size 指定虚拟硬盘的大小(以兆为单位)
[-static] 创建固定大小的虚拟硬盘
[-comment ] 添加一段解释性文字
[-register] 注册新创建的虚拟硬盘
[-type normal| 注册类型 普通(可以创建快照)
writethrough] 注册类型 可写(不能创建快照)
(default: normal) 默认是普通类型
VBoxManage modifyvdi | compact 压缩指定的虚拟硬盘

VBoxManage clonevdi | 克隆指定的VDI虚拟硬盘

VBoxManage convertdd [-static] 将raw硬盘转换成vdi虚拟硬盘
VBoxManage convertdd [-static] stdin 将标准输入参数指定的设备转换成vdi虚拟硬盘,比如:dd if=/dev/sda1 | VBoxManage convertdd
=======================================================================
VBoxManage addiscsidisk -server | 通过指定服务器名称|ip地址添加ISCSI硬盘
-target 指定对象名称字符串
[-port ] 指定ISCSI对象的服务端口号
[-lun ] 指定对象资源的逻辑单元编号
[-encodedlun ] 指定另一种格式的对象资源的逻辑单元编号
[-username ] 指定连接ISCSI对象的用户名
[-password ] 指定连接ISCSI对象所需的密码
[-comment ] 为这个连接添加一段描述性文字
比如:VBoxManage addiscsidisk -server 10.200.2.30 -target iqn.2000-12.com.acme:storage.lun0 -lun 0

VBoxManage createhostif 在宿主机添加一个指定名称的虚拟网络接口
VBoxManage removehostif | 从宿主机删除指定UUID|名称的虚拟网络接口

VBoxManage getextradata global| 获取全局设置信息
| 获取指定UUID的虚拟机的信息
获取指定名称的虚拟机的信息
| 获取与指定键值相关联的数据信息
enumerate 列举信息
比如:VBoxManage getextradata xp installdate 用于获取虚拟机XP的安装时间

VBoxManage setextradata global| 设置全局信息
| 设置指定UUID的虚拟机的信息
设置指定名称的虚拟机的信息
指定要添加信息的键
[] 给上面的键添加键值(必须指定键值)
比如:VBoxManage setextradata xp installdate 2006.01.01 设置虚拟机xp的安装时间为2006年1月1日

VBoxManage setproperty vdifolder default| 在全局设定里设置vdi目录为默认
| 在全局设定里设置指定vdi目录
machinefolder default| 在全局设定里设置虚拟机目录为默认
| 在全局设定里指定虚拟机目录
vrdpauthlibrary default| 在全局设定里设置VRDP证书为默认的证书 | 在全局设定里指定其他的VRDP证书
websrvauthlibrary default| 在全局设定里设置Web服务证书为默认的证书
null| 在全局设定里设置web服务证书为空 | 在全局设定里指定其他的Web服务证书
hwvirtexenabled yes|no 在全局设定里设置是|否支持硬件虚拟化
loghistorycount 在全局设定里设置日志数目,编号从0开始

VBoxManage usbfilter add 添加usb筛选器并设置它在筛选器列表中的位置
-target | 添加usb筛选器到指定UUID的虚拟机
| 添加usb筛选器到指定名称的虚拟机
global 添加全局usb筛选器
-name 给usb筛选器指定名称
-action ignore| 不允许虚拟机连接到筛选器
hold 允许虚拟机连接到筛选器(全局筛选器时)
[-active yes|no] 筛选器是|否生效(默认是生效)
[-vendorid ] 给usb筛选器指定vendorid(厂商标志)
[-productid ] 给usb筛选器指定productid(产品标志号)
[-revision ] 给usb筛选器指定revision(修订版本号)
[-manufacturer ] 给usb筛选器指定manufacturer(制造商)
[-product ] 给usb筛选器指定product(产品标志)
[-remote yes|no] 指定usb筛选器是|否在远程登陆时有效
[-serialnumber ] 给usb筛选器指定serialnumber(序列号)
[-maskedinterfaces ]
VBoxManage usbfilter modify 修改usb筛选器在列表中的顺序
-target | 修改指定UUID的虚拟机的usb筛选器
| 修改指定名称的虚拟机的usb筛选器
global 修改全局设置的usb筛选器
[-name ] 修改筛选器名称
[-action ignore| 不允许虚拟机连接到筛选器
hold] 允许虚拟机连接到筛选器(全局筛选器时)
[-active yes|no] 筛选器是|否生效(默认是生效)
[-vendorid |””] 给usb筛选器指定vendorid(厂商标志)
[-productid |””] 给usb筛选器指定productid(产品标志号)
[-revision |””] 给usb筛选器指定revision(修订版本号)
[-manufacturer |””] 给usb筛选器指定manufacturer(制造商)
[-product |””] 给usb筛选器指定product(产品标志)
[-remote yes|no] 指定usb筛选器是|否在远程登陆时有效
[-serialnumber |””] 给usb筛选器指定serialnumber(序列号)
[-maskedinterfaces |””]

VBoxManage usbfilter remove 删除指定序号的usb筛选器
-target | 删除指定UUID的虚拟机的usb筛选器
| 删除指定名称的虚拟机的usb筛选器
global 删除全局usb筛选器

VBoxManage sharedfolder add | 添加共享文件夹到指定名称的虚拟机
添加共享文件夹到指定uuid的虚拟机
-name 指定共享文件夹名称
-hostpath 指定共享文件夹所在的主机路径
[-transient] 设置临时共享
[-readonly] 设置共享为只读

VBoxManage sharedfolder remove | 从指定名称的虚拟机删除共享文件夹
从指定UUID的虚拟机删除共享文件夹
-name 删除指定名称的共享文件夹
[-transient] 临时删除

VBoxManage vmstatistics | 统计指定名称的虚拟机的运行状态信息
统计指定UUID的虚拟机的运行状态信息
[-reset] 复位统计信息
[-pattern ] 设置信息的显示格式
[-descriptions] 在统计信息中显示描述信息

VBoxManage guestproperty get | 获取指定名称的虚拟机的预先设定的属性值
获取指定UUID的虚拟机的预先设定的属性值 获取指定属性的预先设定的值
[-verbose] 以冗长的格式显示

VBoxManage guestproperty set | 给指定名称的虚拟机设置属性值
给指定UUID的虚拟机设置属性值 要设定值的属性
[ 给属性设定的值
[-flags ]] 设置一个标志

VBoxManage guestproperty enumerate | 列举指定名称的虚拟机的属性值
列举指定UUID的虚拟机的属性值
[-patterns ] 列举属性值时采用的格式
VBoxManage metrics list [*| 显示性能计数器
收集的所有系统资源的监测数据
host| 显示性能计数器
收集的宿主机的系统资源的监测数据
显示性能计数器
收集的虚拟机的系统资源的监测数据
[]] 要显示的性能计数器列表

VBoxManage metrics setup 设置性能计数器
[-period ] 设置性能计数器的显示周期
[-samples ] 设置性能计数器抽样统计数
[*| 对所有资源设置设置性能计数器
host| 对宿主机资源设置设置性能计数器
对虚拟机资源设置设置性能计数器
[]] 性能计数器列表
例如:VBoxManage metrics setup -period 1 -samples 5 host CPU/Load,RAM/Usage

VBoxManage metrics query [*| 查找并显示所有资源当前的性能计数器
host| 查找并显示宿主机当前的资源的性能计数器
查找并显示虚拟机当前的资源的性能计数器
[]] 性能计数器列表
例如:VBoxManage query host CPU/Load/User,CPU/Load/Kernel

VBoxManage metrics collect 收集性能计数器信息
[-period ] 设置性能计数器信息显示的刷新周期
[-samples ] 设置性能计数器抽样统计数
[-list] 显示当前可以收集信息的性能计数器
&

要从命令行创建虚拟机,你可以执行以下三步,我们以 Ubuntu 9.10 为例:

1.

创建一个新的虚拟机,虚拟机的名称通过 –name 选项指定:

VBoxManage createvm –name “Ubuntu 9.10” –register
2.

创建该虚拟机所用的虚拟硬盘,用 –filename 指定虚拟硬盘的名称,–size 选项指定虚拟硬盘的大小,本例为 5 GB:

VBoxManage createhd –filename “Ubuntu910.vdi” –size 5000 –remember
3.

修改虚拟机的选项设置:

VBoxManage modifyvm “Ubuntu 9.10” –memory “512MB” –hda “Ubuntu910.vdi” –dvd /home/linuxtoy/karmic-desktop-i386.iso –acpi on –accelerate3d on –boot1 dvd –nic1 nat

其中,

* –memory 指定内存的大小
* –hda 指定所用的虚拟硬盘
* –dvd 指定所用的 ISO 映像
* –acpi on 启用 ACPI
* –accelerate3d on 启用 3D 加速
* –boot1 引导次序
* –nic1 网络设置

如果你愿意,那么现在便可以通过 VBoxManage startvm “Ubuntu 9.10” 来启动虚拟机。

http://zhang-ly520.javaeye.com/blog/300606
http://www.svn8.com/linux/glpz/20090915/9470.html

php tokyo_tyrant扩展安装

tokyo_tyrant 还是beta 版,freebsd 的 ports 还没有,有点不爽,用 pecl 安装吧,

pecl install tokyo_tyrant

pecl: Command not found.

先安装 pear 呵呵

cd /usr/ports/devel/pear
make install clean
pecl install tokyo_tyrant
Failed to download pecl/tokyo_tyrant within preferred state "stable", latest release is version 0.1.2, stability "beta", use "channel://pecl.php.net/tokyo_tyrant-0.1.2" to install
install failed

还是不行,要加入beta 才行哦

pecl install tokyo_tyrant-beta
ee /usr/local/etc/php/extensions.ini
加入 
extension=tokyo_tyrant.so

OK 安装完成 重起php进程,用phpinfo 查看一下 freebsd 真是太强大了,喜欢哦!

用pngencoder php(AMFPHP) 保存图片

转自:http://hi.baidu.com/harry1299/blog/item/d7a64e323ec976f01b4cff3a.html

1.Flash端,通过adobe的类包,将BitmapData数据Encoder成ByteArray .然后,通过http或者amfphp发送到服务器端。
Code:

var bd:BitmapData = new   BitmapData(canvas.width,canvas.height);
bd.draw(canvas); 
var jpgEncoder : PNGEncoder = new PNGEncoder(); 
var jpgBytes:ByteArray = PNGEncoder.encode(bd);

2.服务端的工作(针对amfphp而言):接受ByteArray ,注意,php是直接支持ByteArray类型的,然后通过fwrite或者file_put_contents,写数据,并且输出文件,ok搞定
Code:

public function createSavePngFile($ba,$savePoint)
{
       date_default_timezone_set('Asia/Shanghai');
  
       $now = date("YmdHis"); 
       $path = "resource/shareVideo/"; 
       $fileName = $path.$now.".png";
       $data = $ba->data;
   
       if(!file_exists($path.$now.".png"))
       {         
             $input = file_put_contents( $fileName, $data);//写入二进制数据
    
              if($input != 0 && $input != -1)
             {
                   return $this->serverPoxy->updateShareInfo($savePoint,$fileName);
            }
             else
            {
                   return false;
            }
       }
      return false;
}

注意:file_put_contents( $fileName, $data);中第二个参数是:$ba->data,而不是$ba,这是php的数据结构的规范。我就是搞错了这个,浪费了大侠我整个一个上午的时间,可恶^_^.
ok.如果还有什么问题,请联系我,E-Mail:harry_1299@163.com
附上关于AMFPHP网站的参考资料:
Send and Receive ByteArray to AMFPHP(http://www.sephiroth.it/tutorials/flashPHP/amfphp_bytearray/)
Code:

output_dir) || !is_writeable($this->output_dir))
            trigger_error ("please create a 'temp' directory first with write access", E_USER_ERROR);

        $data = $ba->data;
         if($compressed)
         {
             if(function_exists(gzuncompress))
             {
                $data = gzuncompress($data);
             } else {
                trigger_error ("gzuncompress method does not exists, please send uncompressed data", E_USER_ERROR);
             }
         }
        file_put_contents($this->output_dir . "/rawdata.jpeg", $data);
         return $this->server_url . $this->output_dir . "/rawdata.jpeg";
     }

    /**
      * Save file from a given bytearray
      * and return a ByteArray from the saved file
      */
    function SaveAsByteArray($ba, $compresses = false)
     {
         if(!file_exists($this->output_dir) || !is_writeable($this->output_dir))
            trigger_error ("please create a 'temp' directory first with write access", E_USER_ERROR);

        $data = $ba->data;
         if($compressed)
         {
             if(function_exists(gzuncompress))
             {
                $data = gzuncompress($data);
             } else {
                trigger_error ("gzuncompress method does not exists, please send uncompressed data", E_USER_ERROR);
             }
         }
        file_put_contents($this->output_dir . "/rawdata.rgb", $data);
         return new ByteArray(file_get_contents($this->output_dir . "/rawdata.rgb"));
     }
}

?>

memcachedb

memcachedb是为了持久化而产生的一个分布式 “key-value”存储系统,你可以认为是memcached+berkeley DB+sina的一些东西的一个集成,这个东西主要是为了提高持久化对象的访问效率,而不是一个缓存,他的特点是:

比传统的RDBMS速度快效率高
高并发环境下访问安全可靠,效率很不错
存储的数据比较小

总之:高效、安全的事物机制、memcached的分布式协议支持
是他的几大亮点.

你可以将一些数据量不大,读写却很频繁的数据放再这里面,而不用往mysql等数据库里写,据说“sohu”的在线用户是存在这里面的,可见这东西还是挺可靠的。
在官方文档里明确指出,只提倡用此数据库保存如下类型的数据:
Index, Counter, Flags
Identity Management(Account, Profile, User config info, Score)
Messaging
Personal domain name
meta data of distributed system
Other non-relatonal data
…………………..

即,要求访问数据快、数据量不大,并且需要持久化到数据库中,却不需要sql查询的数据.

下面我们来说应用:
如果你看过了上一片文章,并且已经成功安装memcachedb的话,那么,现在请启动你的memcachedb,命令如下:
memcachedb -p21201 -d -r -u root -f 21201.db -H /data1/demo -N -P /data1/logs/21201.pid
参数说明如下:

‘-p ’ TCP port number to listen on (default: 21201) tcp侦听端口

‘-l ’ interface to listen on, default is INDRR ANY 这个不要管他

‘-d’ run as a daemon 作为隐藏的线程运行

‘-r’ maximize core file limit
‘-u ’ assume identity of (only when run as root) 用户名

‘-c ’ max simultaneous connections, default is 1024
‘-b ’ max item buffer size in bytes, default is 1KB
‘-v’ verbose (print errors/warnings while in event loop)
‘-vv’ very verbose (also print client commands/reponses)
‘-P ’ save PID in , only used with -d option

‘-m ’ in-memmory cache size of BerkeleyDB in megabytes, default
is 64MB
‘-f ’ filename of database, default is
/data1/memcachedb/default.db
‘-H

’ env home of database, default is /data1/memcachedb
‘-L ’ log buffer size in kbytes, default is 32KB
‘-C ’ do checkpoint every XX seconds, 0 for disable, default is 60s
‘-D ’ do deadlock detecting every XXX millisecond, 0 for disable,
default is 100ms
‘-N’ enable DB TXN NOSYNC to gain big performance
improved, default is off

如果你想要将数据保存再特定的目录可以使用-H 但是你必须首先要创建该目录,否则数据库将不可启动
现在我们来测试下memcachedb是否已经启动了:
输入 telnet ‘your ip’ 端口号 (默认21201)
telnet 127.0.0.1 21201
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ’^]’.
如果可以连接,证明已经启动,现在我们可以来联系下memcached的命令了,呵呵.

以下是memcachedb支持的命令:
‘get’ Retrieval of one or multiple items
‘set’ ”Store this data”
‘add’ ”Store this data, but only if the server *doesn’t* already
hold data for this key”
‘replace’ ”Store this data, but only if the server *does* already hold
data for this key”
‘delete’ deletes one item based a key
‘incr/decr’ Increment or decrement a numeric value. It’s atomic!
‘stats’ shows the status of current deamon. ’stats’, ’stats malloc’,
’stats maps’
Steve

‘db checkpoint’ does a checkpoint manuanlly.
‘db archive’ removes log files that are no longer needed.
‘stats bdb’ shows the status of BerkeleyDB.
‘rep ismaster’ shows whether the site is a master.
‘rep whoismaster’ shows which site is a master.
‘rep set priority’ sets the priority of a site for electing in replication.
‘rep set ack policy’ sets ACK policy of the replication.
‘rep set ack timeout’ sets ACK timeout value of the replication .
‘rep set bulk’ Enable bulk transfer or not in replication.
‘rep set request’ sets the minimum and maximum number of missing
log records that a client waits before requesting
retransmission.
‘stats rep’ shows the status of Replication.

by http://www.cnblogs.com/eoiioe/archive/2008/11/11/1331242.html

freebsd下python程序打包工具 ── cx_Freeze

cx_Freeze是一个类似py2exe的工具,它们区别是py2exe是将python程序打包成windows下可以执行的exe文件的,而cx_Freeze则是将python程序打包为linux下可以直接执行的ELF格式的二进制可执行文件(看说明好像也能生成windows的可执行文件,号称跨平台)。
cx_Freeze的作用就是让你的python程序可以脱离python运行环境,在没有安装python的微型linux系统(例如cdlinux、tinycore等)里,方便地运行你的python程序。从功能上来说,也可以将其理解为一个python程序的编译器,将你的源码隐藏起来。

安装

cd /usr/ports/devel/cx_Freeze
make install clean

打包程序

cxfreeze 你的程序文件.py --target-dir dist

Python date测试

import datetime, calendar   
   
today = datetime.date.today()   
oneday = datetime.timedelta(days=1)   
   
# loop back to most recent Friday (could be today)   
# takes care of end of month and even leap years   
   
friday = today   
while friday.weekday() != calendar.FRIDAY:   
     friday -=oneday   
   
oneweek = datetime.timedelta(days=7)   
nextweek = today + oneweek   
nextyear = today.replace(year=today.year+1)   
   
print "Today (year-month-day) = ", today   
print "Most recent Friday = ", friday   
print "One week from today = ", nextweek   
print "One year from today = ", nextyear   
print "Current time = ", datetime.datetime.now().time() # just the time   
print "Lunchtime = ", datetime.time(12,00) #12:00:00   
   
print '-'*50   
   
# a typical birthday year, month, day   
birthday = datetime.date(1977,4,27)   
# three diffeerent ways to present a date   
# 1977-04-27   
print "Birthday format1: ", birthday   
# 04/27/77   
print "Birthday format2: ", birthday.strftime("%m/%d/%y")   
# 01Apr1977   
print "Birthday format3: ", birthday.strftime("%d %b %Y")   
   
age = today - birthday   
print "You are ", age.days, "days old today!"   
   
# extract the year from todays date   
thisyear = int(today.strftime("%Y")[0:4])   
   
# party message (include date and time)   
rightnow = datetime.datetime.today()   
bparty = datetime.datetime(thisyear, 4, 27, 14, 30)   
# check if you can still make it to the party ...   
if bparty > rightnow:   
    print "Birthday party", bparty   
else:   
    print "Mised this year's birthday party!"   
   
print '-'*50   
   
# calculate days till xmas of this year   
xmas = datetime.date(thisyear, 12, 25)   
tillXmas = xmas - today   
print "There aere %d days till xmas!" % tillXmas.days   
   
print '-'*50   
   
# add days to a given date   
delta = datetime.timedelta(days=77)   
addDays = today + delta   
print "Today 's date is               :", today.strftime("%d%b%Y")   
print "77 days from today it will be :", addDays.strftime("%d%b%Y")   
   
print '-'*50   
   
Weekday = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',    
    'Saturday', 'Sunday']   
   
print "Today is ", Weekday[datetime.date.weekday(today)] 

转自 http://hi.baidu.com/10428/blog/item/d351fa364d2f11360b55a9f2.html

當Deferred遇上Thread

當Deferred遇上Thread
Deferred不會自動實現將阻塞過程轉為非阻塞過程,雖然它已經有那樣的機制但還是要你去多走一步。要將阻塞過程轉為真正的非阻塞過程,那 只有借用線程。但至於線程調用你不用太擔心,twisted已為你準備好一個方便的用法。就是將Deferred綁在Thread上,這樣就有了deferToThread,味道不比牛奶加巧克力差。
deferToThread在twisted文檔的說明,洋墨水喝得比較少,就不照字面翻譯了。大概意思是將函數f放在線程裡並作為Deferred返回,args和kwargs是函數f的參數。也就是使用deferToThread返回的是一個帶線程的Deferred,並自動使用callback調用指定的函數f。相當於在線程中運行下面的代碼
d=defer.Deferred().addCallback(f)
d.callback(result)

def deferToThread(f, *args, **kwargs): (source)
Run a function in a thread and return the result as a Deferred. Parameters f The function to call.

*args positional arguments to pass to f.

**kwargs keyword arguments to pass to f.
Returns A Deferred which fires a callback with the result of f, or an errback with a twisted.python.failure.Failure if f throws an exception.

#!/usr/bin/env python
#coding=utf-8

from twisted.internet import protocol,reactor,defer
from twisted.internet.threads import deferToThread
from twisted.protocols import basic
import time,sys
syscode='big5'

class muProtocol(basic.LineReceiver):

	def connectionMade(self):
		print 'connectionMade'
		self.factory.clients[self]={}
		self.factory.clients[self]['isblankly']=True

def lineReceived(self,data):
	self.factory.clients[self]['isblankly']=False
	self.transport.write(self.factory.getSomething(data))
	if data=='q':
		self.transport.loseConnection()
		self.factory.kungfuTea(data)

class muFactory(protocol.ServerFactory):
	protocol=muProtocol

	def __init__(self):
		reactor.callLater(1,self.timeout)
		self.clients={}

	def timeout(self):
		sys.stdout.write('.')
		sys.stdout.flush()
		reactor.callLater(1,self.timeout)

	def getSomething(self,data):
		return '\n\rServer say: %s\n\r' % data

	def goodTaste(self,data):
		print u'%s:耍下太極,仲加埋嘆下功夫茶,都有排等羅。'.encode(
		syscode,'replace') % data
		time.sleep(10)
		print u'%s,打完收功。'.encode(syscode,'replace') % data
		return data

	def wrongTaste(self,data):
		print u'%s:好味道盡在kung fu tea。'.encode(syscode,'replace') % data

	def kungfuTea(self,data):
		return deferToThread(self.goodTaste,data
		).addBoth(self.wrongTaste)

reactor.listenTCP(20190,muFactory())
reactor.run()

分析下上面的代碼。
當接收到數據後調用self.factory.kungfuTea(data)
def lineReceived(self,data):
self.factory.kungfuTea(data)
工廠中的kungfuTea只是使用deferToThread將真正處理數據的過程轉goodTaste為一個線程的Deferred,剩下的東西就和Deferred操作無異。

牛奶加巧克力不錯,老板再來一杯!

原文 http://sites.google.com/site/mypynotes/twisted-1/defertothread

Deferred筆記一

Deferred的簡單套路

從twisted的文檔入手,將Deferred獨立出來簡單的說明作用與使用方法,這樣更能快速對Deferred有深刻的了解。

一、學習資料
1、主要參考資料
官方文檔 http://twistedmatrix.com/projects/core/documentation/howto/deferredindepth.html
關聯譯文 http://wiki.woodpecker.org.cn/moin/twistedTUT00?action=AttachFile&do=get&target=deferred_tutorial.html(此鏈接將會下載離線文檔)

2、關聯資源
http://wiki.woodpecker.org.cn/moin/TwistedTUT

二、Deferred的作用
Deferred的主要作用可以用一句話比較形象說明,“不要打電話給我,我會打給你的(Don’t Call Us, We’ll Call You)”。相當於做好計劃後,執行交給Deferred,完成後再找我,我可要到一邊Happy去了。
它會根據callback運行結果(正常、發生例外)從callback鏈表中選擇執行已註冊的相應的callback函數,從而實現事件方式來驅動程序。
callback的運行不影響主程序的運行,Deferred.callback執行後馬上返回。(這點有待在後面證明)

三、Deferred實例
from twisted.internet import defer
d=defer.Deferred()
實例化後就可以對Deferred進行操作。

四、callback鏈表
鏈表是用來放置callback函數,鏈表中的函數可以響應三類事件,正常結束、例外結束、任意(包括前面兩者),它們分別用addCallback、addErrback、addBoth註冊到鏈表中。也就是說函數正常結束返回調用addCallback註冊的函數,發生例外則調用addErrback註冊的函數,使用addBoth註冊的函數無論返回什 結果都會被調用。

五、callback函數註冊
除了上面提過的addCallback、addErrback、addBoth三個註冊函數外,還有另外一個addCallbacks可以同時註冊處理正常結束和例外結束的函數。

1
2
3
4
5
6
def deferredExample():
d = defer.Deferred()
d.addCallback(failAtHandlingResult)
d.addCallbacks(yesDecision, noDecisionPassthru)
d.addCallback(handleResult) # – A –
d.addErrback(handleFailure)

上面代碼中第4行的addCallbacks效果如同
d.addCallback(yesDecision)
d.addErrback(noDecisionPassthru)

另外,我們也可以將註冊過程寫成下面形式。
d=refer.Deferred().addCallback(failAtHandlingResult).addCallbacks(yesDecision, noDecisionPassthru).addCallback(handleResult).addErrback(handleFailure)

六、callback鏈執行順序
Deferred的鏈表是按順序從第一個註冊函數開始直到最後一個函數。如果發生例外時,有多個例外處理函數,則會調用發生例外函數下面第一個例外處理函數。後面的例外處理函數將不會被調用,除非第一個例外處理函數將這個例外向下傳遞。

七、其它一些特性
Deferred實例中還有另外一些函數,如pause,unpause,setTimeout,timeoutCall,chainDeferred,這些將留作下一步的測試。
另外還沒涉及到的是Deferred上一級的defer庫中的函數及其它類的使用,從一些代碼看來這些函數將會進一步有利於Deferred的應用,但這也有待後面的進上步學習。

八、總結
經過Deferred are beautiful一節學習,了解Deferred的使用方法及其事件響應機制。

創建於2009年8月31日

原文
http://sites.google.com/site/mypynotes/twisted-1/deferred
可以被gw了