admin 发布的文章

Git基础教程1——本地单分支的版本控制工具

以前面向公司的一些代码开发人员(非专业程序员)做了一次基于Git的命令行的Git培训。
第一次培训向所有培训者介绍了Git的革新和伟大,然而不出意外,所有人的表情都是一脸懵懂的表情,然后持续到第一次培训结束。然后第二次培训的话,来的人就只有第一次培训的一半不到。
因此,在这一次的系列培训中,我将不会给你介绍Git的功能有多么高级,Git的实现由多么伟大,我只会带你切身感受Git给我们带来的开发上的便利。

首先,先问大家一个问题:你有没有手动做过版本控制?可能大家有所疑问:什么是版本控制。
给大家看一张图片:

阿里云的磁盘IO真垃圾

今天在使用阿里云的虚拟服务器(VPS)的时候,用了一个命令find /user -type d | grep "xxx"。然后令人惊讶的是,就此停留在那里,一动不动没有动静。我等了几分钟,终于忍耐不住给Ctrl+C了。

难不成我这命令天赋异于常人,于是换了台服务器测了一下这个命令,三秒时间不到结果就出来了。那么到底是什么原因呢?

我就输入top命令查看一下CPU的占用情况,好家伙 wa 那一项的占用率达到了90%+。

使用man top找到了这一项的解释:wa, IO-wait : time waiting for I/O completion

原来命令卡的问题是IO啊,不行我得看看到底卡到什么程度了,使用time dd测速命令从服务器上拷一份数据,测个速。

额,使用time dd测出来的速度居然是正常的,大概30+M/s,虽然貌似慢了点,但是还是过得去的。首先排除大文件的读写问题!

那么我们来测测小文件的读写,这个实在没有找到工具,就找了一个小文件比较多的目录直接copy了。然后果然,同样的事情发生了,在其他服务器上三秒copy完的目录在这台机器上copy了两分钟。

所以问题很大概率确定了,小文件的读写IO有问题,而find的时候需要读很多小文件,结果速度超级慢。
正准备给阿里云发工单的时候,突然情况缓解许多,估计是因为宿主机其他机器的影响。

以前经常听说阿里云的服务器IO坑太多,自己没多少感觉,毕竟我也不在上面放什么应用。但是今天却给我当头一棒,连普通的命令都卡,或许我应该换个其他的云服务商了。

如何利用SSH进行端口转发

江苏电信的网络不太好,连接linode tokyo服务器比较卡。相比而言,我在阿里云华东区的服务器连接Linode要好很多(不过阿里云的磁盘IO性能太烂了,这个还得写一篇博客)。然后,如果能利用阿里云服务器做跳板的话,相信网络一定会好很多。

因为平时使用linode tokyo的机器只是用来进行谷歌搜索的,所以对带宽的要求不是很高。正常情况下使用SSH动态转发就能满足我的需求,但是偶尔卡卡卡让人心生不爽。因此,在此介绍一种使用SSH将阿里云当成跳板机的方法。但是切记ssh是单线程的,网速仅仅能够满足网页浏览的需求,如果有视频浏览等流量较大的需求,请使用ShadowSocks等工具。

SSH提供了一种叫做端口转发的功能,详细的介绍见此文《实战 SSH 端口转发》,原理就是跳板机将目标机器的端口转发到自己的某个端口上。我们需要使用到SSH的-L参数,我们来看看SSH是如何定义这个参数的用法的:

 [-L [bind_address:]port:host:hostport]

也就是说需要跳板机的地址,跳板机的端口,服务器的地址,服务器的端口。
在这边我们需要填入的是 0.0.0.0:2017:127.0.0.1:22。

然后该在客户机上如何访问跳板机呢?使用如下命令:

ssh xxx@xxx.xxx.xxx.xxx -D xxxx -p 2017

相信大家了解了解其中的几个xxxx的含义吧,这样我们就ssh连接上的其实是目标服务器的22端口。

MySQL修改字段名称

今天需要修改一下table的某个字段名称,以前PHPmyAdmin用的比较多,较少接触alter命令,就直接查了一下,找到了这个命令:

alter table {table_name} change {old_field_name} {new_field_name} {filed_value_type};

误以为field_value_type可以省略,输了几次都报错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

真是黑人问号!不得已之下加上了field_value_type,居然执行成功了。顿时怒了,你特么不是在逗我么,我只是想改一下字段名称啊,为啥还得加上字段类型啊。

不过没办法,既然这么要求,只能这么用了。这边可以用describe {table_name}命令查看当前各字段的类型。

Clang需要注意的一些不同于其他语言的地方

1、C语言需要include对应的库的头文件,比如使用printf的时候就需要include stdio.h。库的头文件里面有函数的声明,这样编译器就可以判断函数调用的对不对了。
2、C语言里面没有字符串,只能使用字符数组来模拟字符串,如果模拟的话字符数组需要比里面所有字符还要多一位,因为最后需要添加一个“哨兵字符”。&switch检查不了任何数组,包括字符数组。
3、C语言中没有布尔值,只能用不为零的值和0两个值来模拟布尔值。
4、C语言中不会记录数组的长度,可以想象存储在内存中的数组是多么赤裸裸的样子。
5、C语言执行某个函数会有返回值,0的话代表执行成功,非0的话代表执行失败。然而在其他语言中,执行语句不会有返回值,只会当异常发生时抛出异常。
6、c语言中有指针,指针有点像对象引用。使用一个变量指针就相当于使用那个变量的复制品,不过复制品只能用*(pointer variable)的形式进行操作。
7、c语言中的数组在参数传递的时候不是copy值的,其实是退化成指针传递过去,但是函数中的参数声明不是声明一个指针啊,摔!
8、虽然《head first c》里面说sizeof(msg)结果是指针的长度,这边的msg是传递到函数中的字符数组!然而为啥在main函数里面长度好好的,这边长度就不对了,难不成main函数里面的msg不是指针?
突然想起来当年上C语言课时候老师貌似提到过,在main函数里面的msg变量会保存字符串长度,但是传递到函数之后就丢失了么?