urlencode的用途就是编码字符串,把原字符串中所有除”-_”以为的非所有字母数字字符替换成百分号(%)后跟两位十六进制数,但是需要注意:由于历史原因会把空格替换+号。rawurlencode其实和urlencode一样,也是用来编码字符串的,唯一的不同是它是使用RFC1738 编码,也就是会把空格替换成%20。
它们对应的解码函数是urldecode和rawurldecode。参考官方网站的说明,urldecode解码给出的已编码字符串中的任何%##,加号(’+')被解码成一个空格字符;rawurldecode解码字符字符串中百分号(%)后跟两位十六进制。有两点区别,一是urldecode解码是对百分号(%)后任意两位字符都去会进行解码,例如%MN也会解码,但是会失败;rawurldecode则只会对百分号(%)后两位是十六进制(0-9A-F)的字符才会解码,二是urldecode会把+号解码为空格。
通过上面对解码函数的描述,可以推论,使用urlencode或rawurlencode编码的都可以使用urldecode进行解码,但是如果原字符串中含有空格,使用urlencode编码后的字符串使用rawurlencode解码后获得的字符串会和原字符串不同。
mysql中内置函数date_add和date_sub能对指定的时间进行增加或减少一个指定的时间间隔,语法如下:
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
其中date是指定的日期,INTERVAL为关键词,expr是具体的时间间隔,type是时间单位。注意:type可以复合型的,比如YEAR_MONTH。如果type不是复合型的,DATE_ADD和DATE_SUB其实可以通用,因为expr可以为一个负数。可用的type如下表:
MICROSECOND |
间隔单位:毫秒 |
SECOND |
间隔单位:秒 |
MINUTE |
间隔单位:分钟 |
HOUR |
间隔单位:小时 |
DAY |
间隔单位:天 |
WEEK |
间隔单位:星期 |
MONTH |
间隔单位:月 |
QUARTER |
间隔单位:季度 |
YEAR |
间隔单位:年 |
SECOND_MICROSECOND |
复合型,间隔单位:秒、毫秒,expr可以用两个值来分别指定秒和毫秒 |
MINUTE_MICROSECOND |
复合型,间隔单位:分、毫秒 |
MINUTE_SECOND |
复合型,间隔单位:分、秒 |
HOUR_MICROSECOND |
复合型,间隔单位:小时、毫秒 |
HOUR_SECOND |
复合型,间隔单位:小时、秒 |
HOUR_MINUTE |
复合型,间隔单位:小时分 |
DAY_MICROSECOND |
复合型,间隔单位:天、毫秒 |
DAY_SECOND |
复合型,间隔单位:天、秒 |
DAY_MINUTE |
复合型,间隔单位:天、分 |
DAY_HOUR |
复合型,间隔单位:天、小时 |
YEAR_MONTH |
复合型,间隔单位:年、月 |
对应复合型的type,需要使用引号对两个参数进行引用起来,中间用任何非数字字符作为间隔即可,并且不能使用负数。但是时间间隔只指定了一个值,那么也能正常工作,但是对应XXX_YYY使用的单位为YYY,也就相当于单一单位的type,同时可以使用负数。复合型的用法如下:
mysql> select date_add('2013-01-18', interval '1 2' YEAR_MONTH);
+-----------------------------------------------------+
| date_add('2013-01-18', interval '1 2' YEAR_MONTH) |
+-----------------------------------------------------+
| 2014-03-18 |
+-----------------------------------------------------+
mysql> select date_add('2013-01-18', interval '1-2' YEAR_MONTH);
+----------------------------------------------------+
| date_add('2013-01-18', interval '1-2' YEAR_MONTH) |
+----------------------------------------------------+
| 2014-03-18 |
+----------------------------------------------------+
mysql> select date_add('2013-01-18', interval '1,2' YEAR_MONTH);
+---------------------------------------------------+
| date_add('2013-01-18', interval '1,2' YEAR_MONTH) |
+---------------------------------------------------+
| 2014-03-18 |
+---------------------------------------------------+
mysql> select date_add('2013-01-18', interval 1 YEAR_MONTH);
+-----------------------------------------------+
| date_add('2013-01-18', interval 1 YEAR_MONTH) |
+-----------------------------------------------+
| 2013-02-18 |
+-----------------------------------------------+
mysql> select date_add('2013-01-18', interval -1 YEAR_MONTH);
+------------------------------------------------+
| date_add('2013-01-18', interval -1 YEAR_MONTH) |
+------------------------------------------------+
| 2012-12-18 |
+------------------------------------------------+
mysql内置的ifull函数可以用在查询时候为NULL值字段给一个默认值,例如:
select ifnull(col1, 'default-value'), col2 from test;
当test表的col1字段为NULL时,数据库返回的结果就为default-value,否则就返回本身的值。但是当col1字段的值为空字符串(”),由于空字符不是NULL,因此返回的结果还是空字符串。如果需要把空字符串或NULL值都用default-value代替,显然ifnull是不行,不过使用case when语句能搞定,示例如下:
select c1,
(case when c2 = '' or c2 is null then 'default-value' else c2 end)
from test;
今天执行一个php脚本的时候得到如题的警告信息,原因是在调用function的时候在参数前面加了符号”&”,这种做法已经没php遗弃了。参数前加符号”&”,就是相当于传地址,function内部可以修改此变量。那么如何去掉此警告的同时且达到function内部能对参数进行修改呢?答案就是在定义function的时候使用”&”符号。例如:
function foo(&$var) {
$var = 321;
}
$var = 123;
foo($var);
echo $var; // 输出为 321
以前写shell脚本或修改某些配置文件(如:nginx)时,由于没有块注释,只能一行一行的来加注释,甚是麻烦。今天无意中发现了vim中的快操作,使用此功能能很方便的实现块注释。
在非insert模式使用组合键 ctrl + v 来开启块模式,这时在窗口左下角显示“ — VISUAL BLOCK — ”,可以通过方向键或h、j、k、l来选择需要操作的块。可以对选择的块进行编辑、复制、粘贴、删除等操作。
例如注释nginx配置文件中的某一段,具体操作是:先把光标移动到需要注释的开始行的最前面,使用 ctrl + v 开启块模式,使用j向下移动光标,可以看到被选取的块,在使用 shift + i (即大写的I)进入插入模式(注意此时插入点会自动回到开启块模式的位置),输入注释符#,ESC 退出插入模式,稍等片刻,刚才选取的块自动被填充了#,就达到了快速注释一段配置的目的。操作示例如下:
由于现在AJAX的流行,页面的上a标签的功能可能不仅仅是作为一个链接跳转,还可能是用作触发一个ajax请求,即用上a标签的onclick事件。a标签是通过属性href来指定链接地址的,如果用做ajax的button,可能会把href的属性值设置为#,例如:
<a href="#" onclick="doAjax()">Btn</a>
这样做其实是没有错的,但是当点击此链接后,页面会跑到顶端,特别的,当页面设置了 时候,会跳出另外一个页面,所以在用户体验上不是很好。
如何解决这样的问题呢?其实很简单,给href属性赋值一个javascript空函数即可,例如:
<a href="javascript:void(0)" onclick="doAjax()">Btn</a>
启动vim打开多个文件并分屏显示:
vim -on file1 file2
o为小写字母,上下分,n是分屏的个数,后面是待打开的文件
vim -On file1 file2
O为大写字母,左右分,n是分屏的个数,后面是待打开的文件
在已经打开的vim中对文件进行分屏
对光标所在的窗口进行上下分屏
:sp
ctrl + w s
对光标所在的窗口进行左右分屏
:vsp
ctrl + w v
不同窗口间的移动
移动到光标左边的窗口
ctrl + w h
ctrl + w
移动到光标上边的窗口
ctrl + w k
ctrl + w ↑
移动到光标下边的窗口
ctrl + w j
ctrl + w ↓
关闭当前窗口
ctrl + w c
ctrl + w q
:q
使用vim时无意间触碰到q键,左下角出现“recording”这个标识,觉得好奇,遂在网上查了一下,然后这是vim的一个强大功能。他可以录制一个宏(Macro),在开始记录后,会记录你所有的键盘输入,包括在insert模式下的输入、正常模式下使用的各种命令等。
具体使用:
第一步:在正常模式下(非insert模式、非visual模式)按下q键盘
第二步:选择a-z或0-9中任意一个作为缓冲器的名字,准备开始录制宏
第三步:正常的操作,此次所有的操作都会被记录在上一步中定义的缓冲器中
第四步:在非insert模式下输入q停止宏的录制
第五步:使用@ + 第二步中定义的缓冲器的名字即可。
例如想把下面的文字
line1
line-2
line3-1
l4
变成如下的文字
System.out.println(line1);
System.out.println(line1);
System.out.println(line-2);
System.out.println(line3-1);
System.out.println(L4);
观察可以发现他们的规律,在每行文字的开头添加“System.out.println(”,结尾添加“);”就变成下面的信息了。下面简单介绍一下如何使用recording来完成这样的操作。
首先把光标移动line1上,输入qt,准备开始录制,缓冲器的名字为t,录制的动作为:shift + ^ 回到行首、按下i键进入insert模式、输入“System.out.println(”、按下esc键回到正常模式、shift + $ 回到行尾部、按下i键进入insert模式、输入“);”按下esc键回到正常模式,按下q停止录制。然后把光标移动到下面一行的任意位置输入 @ + t 即可。
recording还可以和查询结合起来使用,例如想把一个文件中含有特定字符串的行注释,可以通过这样的宏来实现。在正常模式下输入/search string + enter、shift + ^、i、#、esc、shift + $。
让定制的宏自动执行多次的方法是先输入一个数字,然后在输入@ + 缓冲器的名字。 例如 100@t,表示执行100次。
使用linux的少不了玩命令行,掌握一下快捷键可以让你做事达到事半功倍的效果。用的最多的应该是属于Tab键,功能是自动补齐。主要用在命令本身名字和进入目录查看文件,有了它就不需要一字一字的输出命令的完整名字,只要输入前面几个字符,然后Tab一下就可以了,如果存在多个它会全部提示出来;进入一个很深的目录时候,使用Tab也能快速进入。下面列举一些我常用的组合快捷键。
- ctrl + a 回到命令行的行首
- ctrl + e 回到命令行的行尾
- ctrl + c 取消当前行输入的命令,并重新到下一行
- ctrl + r 出现命令历史记录搜索提示,输入字符后会自动匹配命令
- ctrl + b 向后退一个字符,相当于向左方向键
- ctrl + f 向前进一个字符,相当于向右方向键
- alt + b 向后跳一个字
- alt + f 向前进一个字
- ctrl + p 向上翻以前的输入命令,相当于向上方向键
- ctrl + n 向下翻以前的输入命令,相当于向下方向键
- ctrl + w 从光标位置向后删除一个字
- ctrl + y 粘贴最后一个删除的字
- ctrl + d 删除当前光标位置的一个字符
- ctrl + u 从光标当前位置删除所有字符至行首
- ctrl + k 从光标当前位置删除所有字符至行尾,相当于长按ctrl + d
玩过Linux的人应该都知道,如果想让一个程序在后台运行,只要在执行命令的末尾加上一个&符号就可以了。但是这种方式不是很保险,有些程序当你登出终端后它就会停止。那么如何让一个程序真正永远在后台执行呢。答案就是使用 nohub 命令,格式为:
nohup 执行程序的命令 &
如果程序有输出,它会试着把输出写入执行上述命令的当前文件夹下的 nohup.out 文件中,当写入失败,就会写当前用户的$HOME目录下的nohup.out 中。