2008年10月31日星期五

令人无语、恶心的迅雷

我试图不带任何感情色彩去写下这篇日志,但发现是多么的困难——迅雷,你真的让我无语了。按照鲁迅先生的原话“已经出离愤怒了”

以前下载一直使用经典的flashget1.73版本(之后的版本那个广告也太多了,多到我刚装上就卸载掉),最近想换换口味,装上了ayu去广告的迅雷。结果今天开机后发现CPU始终占用率99%,我就纳闷难道我也会中毒或是木马?

打开任务管理器一看,nod32的进程独占99%,估计是扫描硬盘的定期计划任务吧,就没太在意了;原以为半个小时能够扫描完,结果上网浏览非常困难,实在受不了于是打开nod32的监控,发现不停地在扫描一个exe文件;打开outpost也发现迅雷打开了500多条连接——迅雷已经完成下载任务,现在空闲啊。

仔细查看那个exe文件的信息,是前段时间下载的游戏安装文件约570M。难道就是传说中的迅雷的偷偷上传——把迅雷彻底关掉再用outpost一查,果然500多条连接没有了,nod32也马上变为0%的CPU占用。

神啊,原来以为迅雷只是偷偷上传BT任务!原来这仅是我的一厢情愿,原谅我的天真,阿门!你不仁,我不义,网上下载一个迅雷喊疼工具xldiy,把迅雷阉割掉。你偷传得也太WS+YD了,迅雷大叔!你偷偷上传就算了,还上传得这么嚣张;嚣张就算了,还害得我差点以为中招。

若迅雷在安装协议里面涉及了相关条款,我就认了是我粗心,迅雷你狠!要是没有,我要对迅雷开发者和市场运营者说一句:代我问候你全家人!你们生的XX没有排泄器官!

原创文章若转载请注明:转载自imac的博文@http://imac-macheng.blogspot.com/

2008年10月28日星期二

温家宝:多项措施保国内经济增长(讲话全文)

注:红字部分为笔者标注,但是扩大内需还是没有有效的政策工具,情况依旧
国务院的总理温家宝,星期一晚间抵达俄罗斯之后,对中国驻俄使馆人员发表讲话,他指出应对全球金融危机,中国适时调整了宏观经济政策,并且将坚决贯彻扩大内需的方针。

温家宝:大约在今年6月份,我们就调整了宏观经济政策,实行了(领导)经济政策以应对世界出现的金融危机,例如我们两次降低利率和下调准备金率,我们适时的两次提高出口退税率,特别是最近这一次,我们提高的出口退税率,达到3400多项,占整个对外出口商品的25%。

我们还提出了大约十项扩大内需的措施,包括增加低收入者的收入,提高最低保障费的水平。大家可能不一定注意的一件事情,就是我们把农村的发展和农民生活的提高摆在了突出的位置。
大家知道我们粮食五年连续丰收,今年还可以创历史最高水平,也就是超过就是1.03万亿斤,我们历史最高的水平,这样我们一方面把人们吃的问题解决了,通货膨胀占有较大比重的食品价格连续几个月下降,到九月份我们的消费物价指数已经降到4.6%了

另一方面,我们又提高农民的粮食的最低保护价,因为我们粮食市场是放开的,说起来也怪,前一段世界粮食紧缺价格上涨,这一段粮食又下跌,在这种情况下,我们必须把粮价扶起来,大约最低把物价提高10%到15%。一方面稳定了农业的基础;另一方面提高了农民的收入。手中有粮,心中不慌,13亿人口的吃饭问题和基本生活问题,就可以得到解决。

第二我们一月份到九月份,这三个季度,虽然外贸出口有所减少,就是增长幅度有所减少,但是我们的企业韧性很大,在极端困难的情况下,外贸的增长还是达到20%以上,说起来也是个负担,9月份的外贸顺差又创历史新高,10月份前20天,我把数字从外关又调出来,前20天顺差已经达到291亿。

我昨天看了一篇《新华社》的内参,那篇内参就写,浙江省绍兴市纺织城纺织服装行业如何应对金融危机,我看后,非常的受鼓舞我就写了一段话,我说在世界金融危机这种寒冷的侵袭下,这则消息给我们带来了温暖的气息,我说中国的纺织服装业是支柱产业,国家应该给予支持,我们的企业也一定能够克服困难,渡过难关,得到更大的发展和提高当然这就需要创新,来提高竞争能力,今天《人民日报》把这篇报导登了。

其实像这样有韧性的企业很多、很多,我们准备认真贯彻扩大内需的方针,外部需求减少了,你比如说我们的汽车很好,物美价廉,像新锐牌子,但有些国家就不让你进,那么我们自己就想法扩大内需吧,是坚决贯彻扩大内需的方针,特别是扩大消费需求。

我可以跟同志们讲,我们具备这个条件,很多国家不具备这个条件。为什么呢?因为中国有13亿人口,收入分配不均衡、地区发展不均衡、城乡发展不均衡,我们广大的农村还有很大的发展潜力、还有很广阔的市场,包括我们的中西部地区,我们可以很快的推出医疗医药卫生体制改革,跟大家说一声,我们没有宣传的太好,其实我们方案做的不错,我们有五个具体方案,而且财政已经留了700亿在那儿放着,就是要解除群众的后顾之忧,使大家敢于花钱继续消费,这是时候了。我们还有不少矿山的工人,住在(蓬户)区,我们可以实行大规模的(蓬户)区的改造,我们应该很好的落实保障用房建设的制度,(租建)廉租房、经济适用房,满足群众的要求。

我想我们想做的事情很多,包括我们的铁路,新开通的京沪线在保证质量的前提下可以加快进度,最近我们在新疆又开了几条铁路新线,我们的南水北调工程,最近国务院决定要加快进度,我们原定三年要基本实现的灾区重建目标,要花一万亿,我们可以推进让它提前实现,这些都是中国的内需,是外国不具备的,因此我常讲,我说我们的回旋余地大。

原创文章若转载请注明:转载自imac的博文@http://imac-macheng.blogspot.com/

三张图片:很黄很暴力,很好很强大,很傻很天真

第一幅图:很黄很暴力

第二幅图:很好很强大
很好很强大
第三幅图:很傻很天真
很傻很天真

让我感叹的一则新闻

今天看到一则新闻,让我震惊了一会。新闻标题及链接如下:
浙江明年底前取消暂住证制度 实行居住证
如果政策能够实施到位的话,那么意味着在浙江的外省打工人员将减轻很大的负担。
  1. 首先是医疗和社保。在有正式合同的前提下,打工者不会再被区别、歧视对待;
  2. 子女读书问题。中国是非常奇怪的,越穷读书反而越贵!很多夫妇把孩子带在身边,方便在打工的时候照顾,往往孩子读书就成了大难题:户口问题,择校金问题,赞助费问题——外来人员子女的读书基本支出是相当庞大的开支。
不过中国往往“上有政策,下有对策”,再说这项政策实行起来不需要到明年底吧,效率可以提高一些。不过这样一则新闻还是让人非常感叹和振奋,值得拭目以待,希望到2010年不会忘记此时写过的这篇博文。

原创文章若转载请注明:转载自imac的博文@http://imac-macheng.blogspot.com/

2008年10月27日星期一

游标的效率以及case的妙用

此文章并非原创,但是注释部分是笔者自行添加的.

CREATE TABLE [#tmp](px int IDENTITY(1,1),value int)

大约有10000条记录,value 字段是一个随机的值,现要求是输入的一个值M,要找出前N条记录,且N条记录value的总和刚好不大M(意思是再多一条记录都会大于M)。

要求:语句运行时间要求在1秒种内完成
/*最后实验的时候我自己使用的50W条数据的记录,M值也取得很大*/

示例数据为:
px value
----------
5 5
4 12
7 9
1 3
3 6
6 23
2 15
则,录入20,找出:
px value
----------
1 3
2 15

1、
select a.* from #tmp a where (select sum(value) from #tmp where px<=a.px)<=@m --此法选数据其实很快,但却是流水作业,因此效率不高.结果在50W条测试数据的压力测试下,整个查询历时2m41s,与效率要求相去甚远 2、 于是,转而通过遍历表的方式实现查询: declare @px int,@s bigint,@m int set @s=0 set @m=20 update a set @px=case when @s<=@m then px else @px end, @s =@s+value from #t1 a select * from #t1 where px<@px order by px --此法对log有很大影响.虽然在50W条测试数据的情况下,效率基本满意,但是又出现了新的问题,一旦px字段不是按升序排列,查询的结果就不正确 3、 declare @px int,@value int,@sum int,@m int,@px1 int set @sum=0 set @m=20 declare t_cursor cursor for select px,value from #tmp order by px open t_cursor fetch next from t_cursor into @px,@value while @@fetch_status=0 begin if(@sum>@m)
break
set @sum=@sum+@value
set @px1=@px
fetch next from t_cursor into @px,@value
end
close t_cursor
deallocate t_cursor;
select * from #tmp where px<@px1 order by px;
--此法效率很高,但是看执行计划是非常非常慢的.起码说明了游标在特定情况下是有效率的,除了select * from tb

4、
declare @px int,@s int,@m int
set @s=0
set @m=20
select
@px=case when @s<=@m then px else @px end,
@s =@s+case when @s<=@m then value else 0 end
from
(select top 100 percent * from #tmp order by px) a
select * from #tmp where px<@px order by px
--效率很不错,其实是对方法2的改进
--利用case语句将update巧妙地换成select:@px=case when @s<=@m then px else @px end这句,select @px=@px其实是结束

2008年10月26日星期日

单一记录表的主从记录查询

/*数据库的需求真是千差万别,今天遇到的要求比较奇怪,客户数据库是2k版本*/

--测试数据,从数据来看是原来设计者没有考虑周全,主从关系最好设置两个字段sid(SelfID)和pid(ParentID)

if not object_id('tempdb..#T') is null
drop table #T
if not object_id('tempdb..#') is null
drop table #
create table #T(id int identity(1,1),name char(3),state char(4),time char(8),value decimal(5,2))
insert into #T
select 'AAA' as name,'PASS' as state,'20081023' as time,null as value union all
select 'FGH','FAIL',null,88.9 union all
select 'GHE','PASS',null,32 union all
select 'ABC','FAIL','20080930',null union all
select 'WRH','FAIL',null,2 union all
select 'BBB','PASS','20080101',null union all
select 'CCC','PASS','20080101',null union all
select 'ERT','PASS',null,33
go

--将初步的数据插入临时表#
select a.id,a.name,a.state,a.time,b.id as subid,b.name as subname,b.state as substate,b.value into #
from #T a left join #T b on a.value is null and b.time is null and a.idtb.id)

--results
AAA PASS 20081023 FGH FAIL 88.90
AAA PASS 20081023 GHE PASS 32.00
ABC FAIL 20080930 WRH FAIL 2.00
CCC PASS 20080101 ERT PASS 33.00

/*上述部分是老需求,现在要把没有子节点的父节点选出来
试验了很久,最终还是只有用cursor,以后有好方法了再更新吧 */

if not object_id('tempdb..#T') is null
drop table #T
go
if not object_id('tempdb..#') is null
drop table #
go
create table #T(id int identity(1,1),name char(3),state char(4),time char(8),value decimal(5,2))
go
create table #(name char(3),state char(4),time char(8),subname char(3),substate char(4),value decimal(5,2))
go
insert into #T
select 'AAA' as name,'PASS' as state,'20081023' as time,null as value union all
select 'FGH','FAIL',null,88.9 union all
select 'GHE','PASS',null,32 union all
select 'ABC','FAIL','20080930',null union all
select 'WRH','FAIL',null,2 union all
select 'BBB','PASS','20080101',null union all
select 'CCC','PASS','20080101',null union all
select 'ERT','PASS',null,33
go
--select * from #T

declare @id int,@time char(8),@name char(3),@state char(4),@value decimal(5,2),@px int;
set @px=1;
declare tb_cursor cursor LOCAL FORWARD_ONLY KEYSET READ_ONLY for
select id,time,name,state,value from #T
OPEN tb_cursor
FETCH tb_cursor into @id,@time,@name,@state,@value

WHILE @@FETCH_STATUS = 0
BEGIN
--是父节点,而且与上一父节点不相连
if(@time is not null and @id-@px<>1)
begin
set @px=@id
end
--是父节点,与上一父节点相连
else if (@time is not null and @id-@px=1)
begin
insert into # select name,state,time,null,null,null from #T where id=@px
set @px=@id
end
--子节点
else
begin
insert into # select a.name,a.state,a.time,subname=@name,substate=@state,value=@value from #T a where id=@px
end

FETCH tb_cursor into @id,@time,@name,@state,@value
END

--关闭并删除cursor
CLOSE tb_cursor
DEALLOCATE tb_cursor

--查询语句
select * from #

--result
AAA PASS 20081023 FGH FAIL 88.90
AAA PASS 20081023 GHE PASS 32.00
ABC FAIL 20080930 WRH FAIL 2.00
BBB PASS 20080101 NULL NULL NULL
CCC PASS 20080101 ERT PASS 33.00

/*终于有了BBB这条记录*/
BBB PASS 20080101 NULL NULL NULL

原创文章若转载请注明:转载自imac的博文@http://imac-macheng.blogspot.com/

XP开关机速度慢的原因及解决办法

电脑用久了自然变得越来越慢。尤其开关机时要花费5-6分钟甚至更多,这是无法让人忍受。

开机速度的问题。

主要是加载的程序及服务多少引起的问题,可以分别通过msconfig工具和net start命令行来修改,不再赘述。还有一些情况明明开机没有几个程序和服务偏偏慢的要死,这就是user profile的问题,MS有开机预读的技术,随着时间的推移,user profile越来越大,冗余或无效(卸载后有残留信息)文件多,需要用到ccleaner/优化大师/超级兔子等第三方工具来删除,然后再借用Bootvis这个MS官方工具来追踪并优化开机速度,具体的软件、工具请自行google

关机速度的问题。

由于关机是windows需要保存程序及服务信息以及整理页面文件,可以人工干预的不多,可以尝试手动关闭所有程序然后关机(一些非核心服务或程序拥有自我保护机制的可以采用命令行ntsd -c q -p PID强行结束)。

或是借用任务管理器+Ctrl来瞬间关机。不过MS出过一个官方的关机补丁UPHClean,作为服务常驻内存,能大为缩短关机时间。笔者原来关机需要接近一分钟在出现注销画面,使用该补丁后仅需4s。

原创文章若转载请注明:转载自imac的博文@http://imac-macheng.blogspot.com/

SQL日志清理总结

先是一种复杂的方法压缩日志及数据库文件如下:

1.清空日志
  DUMP TRANSACTION 库名 WITH NO_LOG (在2000以后的版本直接进入第2步,即可清空事务日志)

2.截断事务日志:
  BACKUP LOG 数据库名 WITH NO_LOG

3.收缩数据库文件(如果不压缩,数据库的文件不会减小
  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
  也可以用SQL语句来完成
  --收缩数据库
  DBCC SHRINKDATABASE(客户资料)
  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
  DBCC SHRINKFILE(1)

4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
  a.分离数据库:
  企业管理器--服务器--数据库--右键--分离数据库
  b.在我的电脑中删除LOG文件
  c.附加数据库:
  企业管理器--服务器--数据库--右键--附加数据库
  此法将生成新的LOG,大小只有500多K
  或用代码:
  下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
  a.分离
  E X E C sp_detach_db @dbname = 'pubs'
  b.删除日志文件
  c.再附加
  E X E C sp_attach_single_file_db @dbname = 'pubs',
  @physname = 'c:Program FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'

5.为了以后能自动收缩,做如下设置:
  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"
  --SQL语句设置方式:
  E X E C sp_dboption '数据库名', 'autoshrink', 'TRUE'

6.如果想以后不让它日志增长得太大
  企业管理器--服务器--右键数据库--属性--事务日志
  --将文件增长限制为xM(x是你允许的最大数据文件大小)
  --SQL语句的设置方式:
  alter database 数据库名 modify file(name=逻辑文件名,maxsize=20)

特别注意:
  请按步骤进行,未进行前面的步骤,请不要做后面的步骤
  否则可能损坏你的数据库.
  一般不建议做第4,6两步
  第4步不安全,有可能损坏数据库或丢失数据
  第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.

另外一种更简单的方法,本人屡试不爽,建议大家使用。
更简单的方法:
  1. 右建数据库属性窗口--故障还原模型--设为简单
  2. 右建数据库所有任务--收缩数据库
  3. 右建数据库属性窗口--故障还原模型--设为大容量日志记录
最后一种方法,定期备份日志,定期删除