Open Flash Chart是一个优秀的报表图形工具,由ActionScript 3.0语言开发的。通过它可以很简单的实现线状图、柱状图(包括3D)、饼图等。同时它提供了基于PHP, Perl, Python, Ruby, .NET, Google Web Toolkit 以及 JAVA来生成数据的库文件。
项目的主页:http://teethgrinder.co.uk/open-flash-chart-2,可以在http://teethgrinder.co.uk/open-flash-chart-2/downloads.php下载到最新版本,本文下载的是版本是:Version 2 Lug Wyrm Charmer(似乎这个版本是2009年发布,以后就没有再更新了),作者提供了AS3的源代码,我们可以通过源代码重新编译生成新的swf。
需要下载的工具有FlashDevelop和Flex SDK
FlashDevelop 下载地址:http://www.flashdevelop.org/community/viewforum.php?f=11
Flex SDK 下载地址:http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3
下载安装上述软件后就可以动手编译了,本人是在windows下编译,FlashDevelop版本为3.0,Flex SDK版本为3.2。
Open Flash Chart的源代码位于压缩包(open-flash-chart-2-Lug-Wyrm-Charmer.zip)中的open-flash-chart文件夹里,解压下载的压缩包,进入open-flash-chart文件夹,点击open-flash-chart.as3proj,此时项目就通过FlashDevelop打开了,要编译前还需要指定一下Flex SDK位置,步骤为:Tools –> program settings,在出来的对话框左边的Plugins下面点击AS3Context,然后再右边的language下面可以看到Flex SDK Location,把它指定为本机安装的路径,我的是C:\Tools\Adobe\Flex Builder 3 Plug-in\sdks\3.2.0。至此,就可以自己重新编译Open Flash Chart了。
Mysq支持单行和多行这两种注释代码的方式,单行使用两个减号,多行使用/* */
-- 单行注释
/*
多行注释,第一行
第二行
第三行
*/
曾经碰到过在本机window的mysql客户端下可以顺利创建存储过程,拿到linux服务器的客户端中创建的时候老是提示存储过程有错误,错误的原因就是因为单行注释造成,在大部分linux(至少我所接触过的所有linux中)的mysql客户端下单行注释符号和注释的内容之间至少要有一个空格,不能使用tab代替空格。
为了保证存储过程的兼容性,在使用单行注释的时,在注释符号后增加两个空格。
把查询结果赋值到变量,大部分情况下使用游标来完成,但是如果明确知道查询结果只有一行(例如统计记录的数量,某个字段求和等),其实可以使用set或into的方式来实现赋值。示例代码:
drop table if exists test_tbl;
create table test_tbl (name varchar(20), status int(2));
insert into test_tbl values('abc', 1),('edf', 2),('xyz', 3);
drop procedure IF EXISTS pro_test_3;
delimiter //
create procedure pro_test_3()
begin
-- 方式 1
DECLARE cnt INT DEFAULT 0;
select count(*) into cnt from test_tbl;
select cnt;
-- 方式 2
set @cnt = (select count(*) from test_tbl);
select @cnt;
-- 方式 3
select count(*) into @cnt1 from test_tbl;
select @cnt1;
-- 多个列的情况下似乎只能用 into 方式
select max(status), avg(status) into @max, @avg from test_tbl;
select @max, @avg;
end
//
delimiter ;
call pro_test_3();
下面存储过程原本是想根据传入的status值来更新对应列的name,代码如下:
drop table if exists test_tbl;
create table test_tbl (
name varchar(20),
status int(2)
);
insert into test_tbl values
('abc', 1),
('edf', 2),
('xyz', 3);
drop procedure IF EXISTS pro_test_1;
delimiter //
create procedure pro_test_1(in status int(2))
begin
update test_tbl set name = concat(name, '_new') where test_tbl.status = status;
end
//
delimiter ;
call pro_test_1(1);
select * from test_tbl;
调用上述存储过程后发现所有记录的name都被更新了,存储过程就只有一个update语句,而且执行了,问题出在where条件上,原意是where的第一个status为表的列名,第二个是参数,此处被存储过程都理解为参数,所以where条件永远是true。因此一定要注意列名和参数名相同问题,否则在执行delete或update时会酿成大祸。解决方法有3中,一是修改参数的名字,二是在字段前加上表名,第三种是update使用预处理语句的方式。代码如下:
第二种方法代码:
update test_tbl set name = concat(name, '_new') where status = status;
修改为:
update test_tbl set name = concat(name, '_new') where test_tbl.status = status;
第三种方法代码:
set @t = status;
PREPARE STMT FROM "
update test_tbl set name = concat(name, '_new') where status = ?
";
EXECUTE STMT USING @t;
另外定义游标时候可能也会出现这样的问题,解决方法跟上面类似,注意游标在申明前不能使用set,示例代码:
drop table if exists test_tbl;
create table test_tbl (
name varchar(20),
status int(2)
);
insert into test_tbl values
('abc', 1),
('edf', 2),
('xyz', 3);
drop procedure IF EXISTS pro_test_2;
delimiter //
create procedure pro_test_2(in status int(2))
begin
DECLARE done INT DEFAULT 0;
DECLARE na varchar(50) DEFAULT NULL;
DECLARE cur CURSOR FOR
select name from test_tbl where test_tbl.status = status;
-- 或
-- select name from test_tbl t where t.status = status;
-- 再或, 注意后面需要为 @s 赋值
-- select name from test_tbl where test_tbl.status = @s;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- set @s = status;
open cur;
REPEAT
FETCH cur INTO na;
if not done then
select na;
end if;
UNTIL done END REPEAT;
CLOSE cur;
end
//
delimiter ;
call pro_test_2(1);
当一个nginx服务器中运行着多个虚拟主机,如果把这些虚拟主机的配置都放在主配置文件(nginx.conf)中,造成主配置文件很大,对日后的维护带来不便。其实可以把每个虚拟主机的配置信息存放在一个单独文件,然后使用include指令把该文件嵌入到主配置文件中即可。
假设有两个虚拟主机:www.netingcn.com和www.netingcn.net,分别为其创建配置文件为www_netingcn_com.conf和www_netingcn_net.conf,在nginx默认存放配置文件的目录下(/usr/local/nginx/conf/)建立一个vhost目录,把上述创建的两个文件存放在此目录中,并把虚拟主机相应的配置移到配置文件中。然后在nginx的主配置文件中添加如下配置即可:
include /usr/local/nginx/conf/vhost/www_netingcn_com.conf;
include /usr/local/nginx/conf/vhost/www_netingcn_net.conf;
freemarker数字格式化可以在两个地方设置,一个是全局的,即在freemarker.properties文件中设置number_format,还有一个是使用string指令来控制数据的输出格式。例如:
${num?string('0.00')}
如果小数点后不足两位,用 0 代替
${num?string('#.##')}
如果小数点后多余两位,就只保留两位,否则输出实际值
输出为:1239765.46
${num?string(',###.00')}
输出为:1,239,765.46
整数部分每三位用 , 分割,并且保证小数点后保留两位,不足用 0 代替
${num?string(',###.##')}
输出为:1,239,765.46
整数部分每三位用 , 分割,并且小数点后多余两位就只保留两位,不足两位就取实际位数,可以不不包含小数点
${num?string('000.00')}
输出为:012.70
整数部分如果不足三位(000),前面用0补齐,否则取实际的整数位
${num?string('###.00')}
等价于
${num?string('#.00')}
输出为:12.70
整数取实际的位数
关于string指令的更多用法,可以访问官方文档:http://freemarker.sourceforge.net/docs/ref_builtins_number.html#ref_builtin_string_for_number
mysql的存储过程可以很方便使用游标来实现一些功能,存储过程的写法大致如下:
先创建一张表,插入一些测试数据:
DROP TABLE IF EXISTS netingcn_proc_test;
CREATE TABLE `netingcn_proc_test` (
`id` INTEGER(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20),
`password` VARCHAR(20),
PRIMARY KEY (`id`)
)ENGINE=InnoDB;
insert into netingcn_proc_test(name, password) values
('procedure1', 'pass1'),
('procedure2', 'pass2'),
('procedure3', 'pass3'),
('procedure4', 'pass4');
下面就是一个简单存储过程的例子:
drop procedure IF EXISTS test_proc;
delimiter //
create procedure test_proc()
begin
-- 声明一个标志done, 用来判断游标是否遍历完成
DECLARE done INT DEFAULT 0;
-- 声明一个变量,用来存放从游标中提取的数据
-- 特别注意这里的名字不能与由游标中使用的列明相同,否则得到的数据都是NULL
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
-- 声明游标对应的 SQL 语句
DECLARE cur CURSOR FOR
select name, password from netingcn_proc_test;
-- 在游标循环到最后会将 done 设置为 1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 执行查询
open cur;
-- 遍历游标每一行
REPEAT
-- 把一行的信息存放在对应的变量中
FETCH cur INTO tname, tpass;
if not done then
-- 这里就可以使用 tname, tpass 对应的信息了
select tname, tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur;
end
//
delimiter ;
-- 执行存储过程
call test_proc();
需要注意的是变量的声明、游标的声明和HANDLER声明的顺序不能搞错,必须是先声明变量,再申明游标,最后声明HANDLER。上述存储过程的例子中只使用了一个游标,那么如果要使用两个或者更多游标怎么办,其实很简单,可以这么说,一个怎么用两个就是怎么用的。例子如下: 阅读全文…
nslookup最简单的用法就是能够查询出域名对应的IP地址,适用于A记录或CNAME记录。如果需要知道域名的解析服务器是谁,也可以使用nslookup,但是需要加参数,这个命令是window、linux自带的,但是在参数的表述上有些不相同,例如:
//用法:
nslookup 参数 域名
//window 用法
nslookup -qt=ns netingcn.com
//linux 用法
nslookup -type=ns netingcn.com
注意:如果不带参数,就是查询域名对应的IP,查询域名解析服务器的域名是自己顶级域名,不要加www。
默认情况下,使用mysqldump备份出来的表记录都是在一条insert语句,这样对于导入来说效率要高些,但是遇到记录很多的大表,可能会超过缓存区的大小,从而导致备份失败,可以使用参数实现一条记录一个insert语句,例如:
mysqldump -uroot -p --skip-opt dbname > bak.sql
可以使用Mongodb自带的mongodump和mongorestore工具来实现数据库的备份和恢复。其用法比较简单,可以使用如下命令来获取帮助信息:
mongodump --help
mongorestore --help
备份使用命令mongodump,如果执行该命令不带任何参数,会把本机上运行的在默认端口的mongodb中的除local数据库外的所有数据库备份下来,存放在当前执行命令的目录下的dump(如果不存在该目录会自动创建)目录中,并按照数据库的名字存放在不同的不同的目录下,例如有个数据库名为test,那么其备份的文件存放的位置为./dump/test目录下。大部分情况下,我们可能不会这么干,那么可以通过-d来指定需要备份的数据,-o来指定备份存放的位置,同时可以使用-h来指定需要备份的主机地址。例如:
mongodump -h 127.0.0.1:27017 -d atagdata -o /data/dump
或
mongodump -h 127.0.0.1 --port 27017 -d atagdata -o /data/dump
备份本机上的atagdata数据库中的所有collections到/data/dump目录中
每个collections都是以一个文件独立存在,存放路径为/data/dump/atagdata/collections_name.bson
mongodump -h 192.168.1.211 --port 27017 -d atagdata -o /data/dump
备份远程数据库到本地
mongodump -h 127.0.0.1:27017 -d atagdata -c log_01 -o /data/dump
备份atagdata数据库中collections名为log_01的数据
注意:备份不能一次指定多个数据库,也不能一次指定多个collections,也就是说,要么一次备份下来所有数据库,要么一次只备份一个指定的库,同理,在指定了数据库的情况下,要么全部备份该库下的所有collections,要么只备份指定的一个collections,所以要想只备份几个指定的库或collections时,可以多次执行备份命令,修改其数据库名或collections名即可。另外如果数据库需要认证,可以使用-u和-p来指定用户名和密码。
上述用mongodump备份下来的文件,可以通过mongorestore来进行恢复。可以mongodb实例没有启动的情况下执行恢复操作,这个时候必须使用dbpath来指定存放恢复数据的目录,另外可以使用directoryperdb来指定数据库的数据文件是否按文件夹来区分;当然在mongodb已经启动情况下,也是可以执行恢复操作的,这时候dbpath参数不是必须的,如果指定dbpath,那么dbpath不能指定为当前mongodb实例相同的dppath,反之mongorestore会根据当前运行的实例获取dbpath、directoryperdb信息,把备份数据恢复当前的mongodb的dbpath中。例如:
mongorestore /data/dump/
把/data/dump/下所有数据库恢复到当前mongodb中,数据库名字跟备份时名字相同
mongorestore -d test /data/dump/test
恢复test数据库到当前mongodb中test数据库
mongorestore -d new_test /data/dump/test
恢复test数据库到当前mongodb中,并且数据库的名字为new_test
mongorestore -d test --drop /data/dump/test
使用drop参数,在恢复前会删除已有的collections
mongorestore --dbpath /data/db_1 --directoryperdb --drop /data/dump/
把/data/dump/下所有数据库恢复到/data/db_1目录中,数据库名字跟备份时名字相同