作者存档

自己动手编译Open Flash Chart

2012年3月11日 没有评论

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了。

Mysql 存储过程注释问题

2012年3月9日 没有评论

Mysq支持单行和多行这两种注释代码的方式,单行使用两个减号,多行使用/* */

--  单行注释

/*
   多行注释,第一行
   第二行
   第三行
*/

曾经碰到过在本机window的mysql客户端下可以顺利创建存储过程,拿到linux服务器的客户端中创建的时候老是提示存储过程有错误,错误的原因就是因为单行注释造成,在大部分linux(至少我所接触过的所有linux中)的mysql客户端下单行注释符号和注释的内容之间至少要有一个空格,不能使用tab代替空格。

为了保证存储过程的兼容性,在使用单行注释的时,在注释符号后增加两个空格。

Mysql 存储过程查询结果赋值到变量的方法

2012年3月9日 没有评论

把查询结果赋值到变量,大部分情况下使用游标来完成,但是如果明确知道查询结果只有一行(例如统计记录的数量,某个字段求和等),其实可以使用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();

Mysql存储过程参数名和表列明相同引起的问题

2012年3月9日 1 条评论

下面存储过程原本是想根据传入的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 include 指令

2012年3月8日 没有评论

当一个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;
分类: Linux, nginx 标签:

freemarker 数字格式化

2012年3月8日 没有评论

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 存储过程中使用多游标

2012年3月2日 没有评论

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查询域名服务器

2012年2月29日 没有评论

nslookup最简单的用法就是能够查询出域名对应的IP地址,适用于A记录或CNAME记录。如果需要知道域名的解析服务器是谁,也可以使用nslookup,但是需要加参数,这个命令是window、linux自带的,但是在参数的表述上有些不相同,例如:

//用法:
nslookup 参数 域名

//window 用法
nslookup -qt=ns netingcn.com

//linux 用法
nslookup -type=ns netingcn.com

注意:如果不带参数,就是查询域名对应的IP,查询域名解析服务器的域名是自己顶级域名,不要加www。

mysqldump 每条记录都用insert

2012年2月28日 没有评论

默认情况下,使用mysqldump备份出来的表记录都是在一条insert语句,这样对于导入来说效率要高些,但是遇到记录很多的大表,可能会超过缓存区的大小,从而导致备份失败,可以使用参数实现一条记录一个insert语句,例如:

mysqldump -uroot -p --skip-opt dbname > bak.sql

Mongodb 备份与恢复

2012年2月23日 没有评论

可以使用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目录中,数据库名字跟备份时名字相同

无觅相关文章插件,快速提升流量