一个无敌的下载站点:msdn I tell you,作什么用就不说了,谁用谁知道

http://msdn.itellyou.cn/?lang=zh-cn 传送门

windows系列操作系统,microsoft sql server服务器,ms office,share point,visual stuido....msdn里有的,这里都有,ed2k下载。

使用方法,选择你所需要的软件,点右侧“复制所先的项”,得到ed2k下载链接,然后你懂得。

只是可惜,ed2k下载有些资源/有时不稳定,有可能根本下载不动

现在有一个更好的办法:通过百度云网盘的离线下载功能

msdn.itellyou.cn里面都有什么东西,看图,不说话

msdn_itellyou_cap_1 msdn_itellyou_cap_2baidu-pan-down

百度网盘已经离线过N多文件,只要有人下载过,那么你再下载就只要0秒钟!你没看错,是0秒钟

centos/redhat/fedora下rpm安装nload监测网卡流量/非手工编译/linux实时带宽监控

nload 是linux下简单易用的带宽流量监测工具,基于字符界面的动态图形显示网卡当前的流量。

不过centos官方源里并没有它,不能直接使用yum安装。我们可以到第三方rpm发布平台上下载,推荐使用 下面的源,它发布多个rpm包

http://pkgs.repoforge.org/nload/

安装方法:

1. 找合适版本:截止本文写作时间2013-6-7最新版本为0.7.4,centos6对应的版本是 el6, 32位系统使用i686的。我的linode vps, 32位 centos6,选择的是nload-0.7.4-1.el6.rf.i686.rpm

2. 切换到root用户直接运行rpm安装,即

rpm -ivh http://pkgs.repoforge.org/nload/nload-0.7.4-1.el6.rf.i686.rpm

3. 切回到普通用户,运行nload,即看到基于字符的动态图形,很简洁。按方向键切换下一块网卡。

手工编译内核安装virtualbox出错提示Please install the build and header files for your current Linux kernel

核心提示:

检查/lib/module/{内核版本号}/kernel/目录下的文件(符号链接) header,及source是否有效,它们应该链到你的内核编译目录里

使用centos 6.x的linux,嫌自带内核太老,自己编译的内核3.0.32.

virtualbox长期没更新,今天更新一下,到vbox官方下载安装包VirtualBox-4.2.12-84980-Linux_x86.run,sh 运行之,但得到提示:

[root@fsc download]# sh VirtualBox-4.2.12-84980-Linux_x86.run
Verifying archive integrity... All good.
Uncompressing VirtualBox for Linux installation............
VirtualBox Version 4.2.12 r84980 (2013-04-12T10:19:13Z) installer
Please install the build and header files for your current Linux kernel.
The current kernel version is 3.0.32
Problems were found which would prevent VirtualBox from installing.
Please correct these problems and try again.

印象中编译内核时安装装过header,要不然上次是不可能安装成功的。

思考原因,是否因为内核某些地方出错了原因,如某些环境变量或者什么东西,实在不想再次重新编译内核,麻烦,好像还得另外下载并编译网卡驱动。于是考虑找个别人编译好的rpm包装上,找到了一个叫 ELRepo 的项目,提供一系列的内核rpm包 http://elrepo.org/linux/kernel/el6/i386/RPMS/ 看上去还是相当不错的,可以安装他们的yum源。

正准备下载,突然想到,机器换固态硬盘了,是直接使用cp带-p参数拷过来的,而家目录里的很多文件在机械硬盘上,通过符号链接链到~/opdata,当时的内核文件就在其中。联想到/lib/module/`uname -r`/目录里有两个符号链接,是链接到编译内核的目录里的。是否安装kernel-header其实并没有将相应文件拷到某个目录里,而只是符号链接过去。去检查一下。

[root@fsc download]# cd /lib/modules/3.0.32/kernel/
[root@fsc kernel]# ls -alh ..
总用量 3.8M
drwxr-xr-x.  4 root root 4.0K 12月  2 11:05 .
dr-xr-xr-x. 16 root root 4.0K 6月   2 10:47 ..
lrwxrwxrwx.  1 root root   39 5月  26 2012 build -> /home/feng/software/kernel/linux-3.0.32
drwxr-xr-x. 12 root root 4.0K 6月  24 2012 kernel
......
-rw-r--r--.  1 root root 964K 12月  2 11:05 modules.usbmap
lrwxrwxrwx.  1 root root   39 6月  24 2012 source -> /home/feng/software/kernel/linux-3.0.32

果然,build, source两个链接文件,还是链接到原来的位置,而且被shell以红背景提示是“死链接”。

删除这两个链接文件,并重建有效的链接

rm build source
ln -s /home/feng/optdata/software/kernel/linux-3.0.32/ build
ln -s /home/feng/optdata/software/kernel/linux-3.0.32/ source

再次运行sh VirtualBox-4.2.12-84980-Linux_x86.run,virtualbox顺利安装。

Microsoft SQL server性能优化必备工具

这里说的工具并不一定是独立软件

1 查看sql语句执行花费的时间、IO开销

在mssql客户端执行sql语句时,先在当前会话里执行下面语句

SET STATISTICS IO ON
SET STATISTICS TIME ON
也可一次性执行
set statistics io,time on

然后再执行sql语句,运行完成的消息框里将给出如下统计信息

SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 4 毫秒。

(100 行受影响)
表 'your_table'。扫描计数 2,逻辑读取 165 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

http://msdn.microsoft.com/zh-cn/library/ms190356.aspx

mysql对大表执行update速度慢时,试试改用insert可能会有意想不到的发现

实例:需要根据用户日志的ip地址计算出其地理地址

表结构:

用户日志表(200万条记录),其中address是待填充的字段:

CREATE TABLE `tmp_open_ip` (
  `email` varchar(60) NOT NULL DEFAULT '',
  `address` varchar(50) NOT NULL DEFAULT '',
  `ip` int(10) unsigned NOT NULL DEFAULT '0',
  KEY `email` (`email`),
  KEY `ip` (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

另ip地址数据库表(44万条记录)

CREATE TABLE `ip` (
`s` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '开始ip',
`e` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '结束ip',
`a` varchar(50) NOT NULL DEFAULT '',
KEY `s` (`s`),
KEY `e` (`e`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

需要根据用户日志表 tmp_open_ip 里的 ip字段到ip地址数据库表里查询出对应的地理地址,将地址填充到address字段。

使用如下update语句执行:

UPDATE tmp_open_ip AS u 
INNER JOIN ip 
ON u.ip BETWEEN ip.s AND ip.e 
SET u.address = ip.a

在笔者的电脑上运行了速度非常之慢,执行了一个多小时(4500s)都没有完,也不知道还要多久。

实在看不过去,于是想到使用insert 是否会快一些,于是重新导一张表 tmp_open_log 与tmp_open_log完全一致。

创建一张表 tmp_open_address,是insert的目标表,为了速度更快,没建索引:

CREATE TABLE `tmp_open_address` (
`email` varchar(60) NOT NULL DEFAULT '',
`address` varchar(50) NOT NULL DEFAULT '',
`ip` int(10) unsigned NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8

执行insert 语句

insert into tmp_open_address (email,address,ip)
select l.email,ip.a,l.ip
 from  tmp_open_log as l inner join ip on l.ip between ip.s and ip.e ;
/* Affected rows: 2,543,124  Found rows: 0  Warnings: 0  Duration for 3 queries: 16.922 sec. */

不到17s!本来还想去倒杯水、稍事休息一下,结果已经执行完毕。

到本文写完时,前面的update语句已经执行了5000s,结束仍是遥遥无期。

所以,对于大数据量执行update时,可以考虑改用insert 语句实现,可能麻烦一些,但高速带来的收益远大于麻烦!

后记:

直接杀死了update进程,去看看update执行了多少:运行

SELECT * FROM `tmp_open_ip` where address!=''

结果只有 11,373 ,照这个速度,要运行N天....

mysql join查询时,参与join的字段字符集编码不同,对性能影响是巨大的

本文一直以来都只是个标题,在三个月后的今天,熬夜补上内容。

直接上代码:

建utf-8编码的表 t1:

CREATE TABLE IF NOT EXISTS `t1` (
  `name` varchar(50) NOT NULL DEFAULT '',
  KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

随便插入些数据,数量大一点,后面实验结果更清晰,偷个懒,构造随机字符串插入语句

insert into t1(name) 
select concat(
char(round((rand())*25)+97),
char(round((rand())*25)+65),
char(round((rand())*25)+65),
char(round((rand())*25)+97),
char(round((rand())*25)+65),
char(round((rand())*25)+65),
char(round((rand())*25)+97),
char(round((rand())*25)+65)
)

每次执行插入一条记录,用你熟悉的脚本(python,php,shell等都行)写个循环,执行一万次以上。

将该表复制成一个新表t2,删除一部分数据,1000条左右即可。(推荐使用phpMyAdmin)

再将t2复制为t3,并将字段改为gb2312编码。

使用一个left join语句,写一个语句,查出t2/t3比t1少了哪些记录。

语句很简单,如下:

SELECT SQL_NO_CACHE t1.name, t2.name
FROM t1
LEFT JOIN t2 ON t1.name = t2.name
WHERE t2.name IS NULL 
LIMIT 0 , 30

注意加入 SQL_NO_CACHE ,禁用mysql缓存。

先看编码一致的t2表,phpMyAdmin里执行结果:

显示行 0 - 29 ( 1,129 总计, 查询花费 0.0010 秒)

平均耗时大概为0.0010秒

SELECT SQL_NO_CACHE t1.name, t3.name
FROM t1
LEFT JOIN t3 ON t1.name = t3.name
WHERE t2.name IS NULL 
LIMIT 0 , 30

phpMyAdmin执行结果:

显示行 0 - 29 ( 30 总计, 查询花费 0.1871 秒)

差两个数量级!

查询语句解释:

t2

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL name 152 NULL 11129 Using index
1 SIMPLE t2 ref name name 152 test.t1.name 1 Using where; Using index; Not exists

t3

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL name 152 NULL 11129 Using index
1 SIMPLE t3 index NULL name 102 NULL 10000 Using where; Using index; Not exists

附带上本次实验的三个表及数据
实验用表导出备份test.sql

 

使用wget抓取网页内容,常规用法及有用参数

环境:linux系统(各种发行版皆可),windows下强烈推荐cygwin环境

常规用法:

  1. 直接下载一个文件,默认按最后一级文件名保存到本地: wget {your-url}
  2. 如需自定义保存文件名则增加参数 -O 指定保留文件路径: wget -O {save-file-name} {your-url}
  3. 下载一批文件,把文件路径放到一个文本文件中,每行一个: wget -i {file-name-of-your-filelist}
  4. 下载一个页面及页面中图片等元素,wget -p {your-url}   ,即增加参数 --page-requisites (缩写为-p)
  5. 按网址中目录及文件名存储下载文件,即与源站同样的目录结构,增加参数 --force-directories-x

一些有用参数设置

  1. 指定user-agent 参数: -U {agent-string}--user-agent={agent-string}
  2. 批量下载时设置请求间隔:--wait={秒数}-w {秒数}
  3. 请求随机间隔,增加 --random-wait 参数,将以wait指定秒数0.5-1.5倍随机等待:
  4.  递归下载 -r ,一般还要同时指定--domains, --exclude-domains, --level 等限制下载内容
  5. 同时下载http页面中的图片等元素--page-requisites 缩写为-p
  6. 支持断点续传 -c
  7. 维持请求间的cookie参数 --save-cookies={saved_file_name} ,如需要同时追踪session的cookie,则增加 --keep-session-cookies,如需要加载以前wget保存的cookie,可使用--load-cookies={saved_file_name}
  8. 指定自定义的http头 --header={header-line},多个头则多次指定该参数
  9. 设置网络超时 --timeout={秒数}-T,设置后 --dns-timeout, --connect-timeout, --read-timeout 也将一起设置,当然也可以另外为它们单独设置。

设置代理

wget不支持socks代理,支持http,https,ftp三类代理,分别为https_prox, /http_proxy, ftp_proxy,下面示例只以http_proxy为例。为wget指定代理有三种方法,推荐第三种

  • 设置环境变量 export http_proxy=http://127.0.0.1:8080
  • 配置文件 /etc/wgetrc或 ~/.wgetrc
  • 在wget 命令行中通过 -e参数(临时设置环境变量)-e参数本身是执行命令,与wgetrc中的设置效果相同。示例:-e "http_proxy=http://127.0.0.1:8080"

更多参考

修订于 2019/12/09

--------- 后面是以前的2013年以前的版本,没啥用,不用看了 ------

需要采集一批数据,是一网站上的产品信息,产品本身信息很简单,使用火车采集器轻松实现;但产品价格数据是ajax响应数据,使用firebug + live http headers抓到该请求,并测试重发,发现该ajax请求必须带一个http头“X-Requested-With: XMLHttpRequest”,没有就返回404错误。

gnu/linux下有大量的杀手级工具,这种情况,要动用其中的wget. wget有很多参数,这里需要使用其中两个:-O,--header. 其中:

-O, 把请求结果保存到指定文件,但我们要使用的却是一个特殊的值:“-”,它可以将结果输出到标准输出

--header, 结http请求加上自定义的头(http header)

于是对于每条产品数据,都发送这样的请求:

wget --header="X-Requested-With: XMLHttpRequest" -O save_123.txt "http://www.website.com/request/path/?Id=123"

这样每条产品都保存到save_123.txt,save_124.txt,save_125.txt....这样的一系列文件中。不过有个问题是,每条数据一个文件,后期分析不方便。所以将其存储到单一的文件里。

方案:先将wget结果指向到标准输出,然后再使用重定向符 >> 定向到单一的文件里。

不过,还有一个问题,每个http响应里没有产品id号,数据跟采集到的产品信息对不上号。于是在每写一笔采集结果前,往文件里先写入该产品的id号。

这里使用echo 命令,要用到echo 的参数:-e, 作用是使用转义符输出换行。示例:echo -e "aaa\nbbb"

于是构造这样的bash脚本:

echo -e "\n"10011"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10011" >>data.log; 
echo -e "\n"10012"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10012" >>data.log; 
echo -e "\n"10013"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10013" >>data.log; sheep 1;
echo -e "\n"10014"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10014" >>data.log; 
echo -e "\n"10015"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10015" >>data.log; 
echo -e "\n"10016"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10016" >>data.log; sheep 1;

第三行加一个sheep 1, 即每采三条暂停1秒钟,作用是防止请求过于密集而影响服务器响应,暂停秒数按实际情况设置。

所有数据都保存到data.log文件里,里面格式如下

10011    
{"data":.....}
10012    
{"data":.....}
10013    
{"data":.....}
10014    
{"data":.....}

每两行一笔数据,其中第一行是产品id号,第二行是采集到的数据。这样就可以方便的提取其中数据了。

其实,对于而需要提取的数据,完全可以通过grep从定向到标准输出的wget结果里提取。只是这里不么做了。

ms sql server 查看服务器当前的连接会话及会话信息(客户端ip地址,协议,时间,读写情况等)

ms sql server 查看服务器当前的连接会话及会话信息(客户端ip地址,协议,时间,读写情况等)

select * from sys.dm_exec_connections

这实际上是master数据库里的一个系统视图,读出来后有不少字段,如client_net_address, protoco_type, connect_time, num_read, num_write等,很明白,就不多说了。

btw,master数据库里有很多系统视图,如:dm_exec_sessions, dm_fts_memory_pools, dm_os_hosts, dm_os_memory_allocations, dm_os_memory_objects, dm_os_threads, sql_logins, types等,很有参考意义