一系列git技巧:bash下让git支持命令自动完成etc

bash下让git支持命令自动完成

下载git源码,解压缩,将其中文件 contrib/completion/git-completion.bash 拷到一个符合你习惯的位置,我个人放在 ~/script/git/ 里。

个人习惯在把一些供个人使用的脚本放在家目录下的script目录,这里为git建一个单独的目录,将上述文件放进去。

然后修改~/.bashrc文件,加入一行

. ~/script/git/git-completion.bash

重新登录,在bash下,你的git就支持自动补完了,输入 git com,然后按两次tab键,即见效。

不重新登录,也可以立即生效。当前的bash里运行上述命令. ~/script/git/git-completion.bash即可。

其他小技巧

git diff 忽略dos与unix换行符的差异:git diff  --ignore-space-at-eol

Hyper-V虚拟机启动报错:IDE/ATAPI 帐户没有足够的权限

使用windows hyper-v虚拟机,因一个虚拟机机出了点问题,又没有做快照。于是把硬盘文件改名,然后把以前备份的硬盘文件拷过来,改成虚拟机用的硬盘文件的名。

但启动时报错:“ide/atapi 账号没有足够的权限”。比对两个硬盘文件的权限,发现新拷过来的文件少了一个用户的权限,这个用户没有名字,显示为一大串字符串。想找到这个用户赋权限给他,但找不到。

经过google查询得知,在hyper-v 管理里,将该硬盘文件从本虚拟机上删除,然后“应用”,再加上该硬盘文件,“确定”即可。这样hyper-v就为该文件赋上了这个“幽灵用户”的权限。

猜测,这应该是hyper自己搞的一个隐藏用户(或用户组),正常情况下在windows里看不到,所以...

一个无敌的下载站点: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

 

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ... 45 46 47 Next