2015-04-02 Thursday 23:16:18

自动给文件的某个pattern前加上某段文本

在cnzz.com上注册了个帐号,想统计一下这个博客的访问流量。需要给每个html文件加上一段代码,肯定不能手动呀,首先想到用 sed

$ sed -i '/regexpattern/ i text' index.html

然后希望写到makefile中,每次生成完html文件后就执行这条sed命令。但是不知道怎么在makefile里跨行执行shell代码。于是退而求其次,写到了一个外部脚本里,然后在makefile的all规则中加上这个脚本的名字。还有如果要插入的文本是在另一个文件中,需要:

$ sed -i '/regexpattern/ r text.txt' index.html

命令行自动登录校园网

最开始尝试了用 curl -F 做表单提交,但是没有成功。网上搜到了说用 Firefox 的 Firebug 和 Firecurl 插件,可以得到每一步对应的curl命令。然后到 Firecurl 的下载页面又说:don’t use this — use Chrome Developer Tools' "Copy as cURL", which is much more complete

可是最终这种方法的到的curl命令也不能成功登录。

继续Google,找到了github上有人三年前写的https://github.com/tianyang-li/TUNET[Python脚本],挺简单的,没有用表单提交,直接跟cgi交互。

于是写了个 shell 版的。。

#!/bin/bash
case "$1" in
	login)
		username=${2:wdd13}
		password=$(echo -n $3 | md5sum | cut -d' ' -f1)
		curl -d "username=${username}&password=${password}&drop=0&type=1&n=100" http://net.tsinghua.edu.cn/cgi-bin/do_login
		;;
	logout)
		curl http://net.tsinghua.edu.cn/cgi-bin/do_logout
		;;
	*)
		curl -d 'action=check_online' http://net.tsinghua.edu.cn/cgi-bin/do_login
		;;
esac

2015-04-04 Saturday 19:58:45

HTTP2

  • 官方博客

  • https handshake

  • http/2和SPDY协议传的是二进制的,而http/1.1传的是文本。快速。

  • TLS everywhere

  • http/1.1是应用层协议,而http/2是会话层和应用层协议,不是完全替代1.1,而是进行了扩展。

  • HPACK

  • http/2的header压缩协议

  • 没有前缀匹配,(为了安全)

  • 名称和值对于算法来说是不透明的

  • 编码端决定哪一部分被压缩

  • 静态表,动态表,huffman

  • 不选用gzip是为了防止 CRIMECRIME会引诱浏览器把不同的文本内容发给目标网站,观察压缩后的header变化,如果对于某个特定的内容,header变小了,说明注入的内容中有与用户的cookies相同的部分,据此来推测出用户的cookie,劫持用户的会话。

  • 一些边界情况

  • 处理大的header

  • 作为http/1.1的代理

  • 负载均衡时的优势。

  • Server push。预测用户的需要,在client发出请求前就做出回应。

  • 减少了TCP连接,使服务器能够处理更多的并发。

  • FAQ上的问题

    • http/1.1的问题是,一个http请求会导致多个TCP连接同时发送请求。

    • 与十几年前相比,现在的网页包含了更多的内容,例如js脚本,css信息,多媒体资源,而现在的http/1.1只能允许TCP一次发出一个资源请求。

    • 以SPDY为基础。

    • http/1.1中,浏览器会为每个来源网站建立四到八个连接,如果一个网站包含多个来源,连接可能会更多,这些连接容易触发TCP的拥塞控制和重传。http/2只需要一个连接。

    • 关于server push,目前的情况是,客户端先收到html文档,解析后,如果其中有嵌入的JS脚本或者CSS样式,则再次发出请求。

2015-04-09 Thursday 09:49:58

Java和C\++的new

Java中没有指针的概念,可以在new的时候初始化,C++似乎不可以。

int a[] = new int [] {8, 0, 5, 1}
[source, C]
int *a = new int[4];

Bash中的方括号

单层方括号是标准的shell,bash会支持双层方括号,功能更多。http://mywiki.wooledge.org/BashGuide/Practices#Bash_Tests

var=''
[ "$var" == '' ] && echo True
[[ $var == '' ]] && echo True
[[ $var =~  pre+ ]] && echo True
[[ $var = pre*  ]] && echo True

2015-04-11 Saturday 15:23:15

php简单运行

<?php
$input = $_GET["param"];
echo "<div>".$input."</div>"
?>

存为a.php,然后进入到该目录下,运行 php -S localhost:8000 ,然后在浏览器中输入 localhost:8000/a.php?param=Hello PHP localhost:8000/a.php?param=<script>alert(/xss/)<script>

Cookies

Ctrl+Shift+i 调出浏览器的控制台,然后可以执行JavaScript脚本,例如查看当前的页面的Cookie: document.cookie * 修改document.cookie ** document.cookie是一个string,以分号隔开的 key=value 值对。直接给它赋值并不会覆盖掉之前的值,而是添加到原来值之后。例如cookie里本来有一个 name=bigeast 的值,想要删除或者修改它,需要知道Set-Cookie时,它的一些属性信息,例如domain, path等,这些信息在document.cookie中是看不到的,但可以通过调试窗口找到。要删除一个cookie,只需设置好正确的domain, path, 然后把它的expires值设成过去的一个时间就可以了。

document.cookie = "name=whatever; domain=.google.com; path=/; expires=Thu, 2 Aug 2001 20:47:11 UTC;"

Set-Cookie时如果加上HttpOnly字段,则该cookie不能被JavaScript读取。

top

top命令的显示结果跟以前不一样已经有一段时间了,有了颜色,还有跟 htop 类似的CPU占用率动态显示,但我之前经常用的 C, M 将进程按cpu占用率或者内存占用排序的功能不在了。今天终于忍不住查了下到底怎么回事。原来这个变化是去年11月份, procps-ng 的一次升级后开始的。

4888:[2014-11-17 09:33] [PACMAN] upgraded procps-ng (3.3.9-3 -> 3.3.10-1)

wiki上有https://bbs.archlinux.org/viewtopic.php?id=189757帖子讨论这个,而且有人给出了恢复到原来配置的方案:

remove your ~/.toprc (if any)
start "top"
press z
press V
press 1
press y
press m m
press t t t
press W
this will write a ~/.toprc fairly similar to what you are used to.

查看了下 procps-ng 下的命令,原来 pgreppkill 都是,还有 free pidof pmap ps pwdx uptime vmstat watch 等。 pwdx 之前没见过,是查看一个进程的当前工作目录的。

ngrep

查看http头,可以用万能的 tcpdump, 还有更合适的 ngrep

# To print all IPv4 HTTP packets to and from port 80, i.e. print only packets that contain data, not, for example, SYN and FIN
# packets and ACK-only packets.  (IPv6 is left as an exercise for the reader.)
$ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
$ ngrep -q -W byline "GET|POST HTTP"
$ ngrep -q -W byline tsinghua.edu.cn tcp port 80

JavaScript

js-beautify, js24 。网站中的JS脚本一般都是经过模糊处理的,就是把变量名替换成单字符的,单行,这种工具叫做 JavaScript Obfuscator

2015-04-17 Friday 09:43:15

i3wm + Virtualbox + Windows7 多屏显示

现在有两台显示器,已经用xrandr做了多屏显示:

~/.xinitrc
xrandr --output DVI-0 --mode 1280x1024 &
xrandr --output DVI-1 --mode 1920x1080 &
xrandr --output DVI-0 --left-of DVI-1 &

但是最后一条命令好像不起作用,每次都要手动运行一遍,两台显示器才显示不同的内容。

由于我现在需要用Windows中的VS来debug,通常是开两个VS窗口,一个编码端,一个解码端,然后两边同时F10看哪里开始不一样。虽然27寸的显示器可以显示两个,如果Virtualbox支持多屏就好了。一查果然有这个功能,需要在设置里的Video选项中选定窗口个数,然后进入Windows虚拟机后,在桌面右键,然后选择分辨率,设置另外一个显示器的参数就好了。

然后可以把其中的一个通过i3的命令移到另外一个显示器上,这样虽然会有i3的border,但是已经大体上已经差不多算是多屏了吧!

对了,今天才注意到Virtualbox的 Host 键,就是切换键盘事件在主机和虚拟主机之间的分配,例如要把Virtualbox窗口用i3的快捷键移动到另外一个显示器上,快捷键会先被虚拟机捕获,所以命令是无效的。这时就按一下右边的 Ctrl 键,再运行i3快捷键就好了。

还有Virtualbox的多屏其实还是一个屏做了扩展,例如Windows的任务栏只会在一个里面显示。先这么着吧。

urxvt里用tmux多屏,桌面i3多屏,虚拟机Virtualbox多屏,再多我就吃不消了。。

发现一个特性,如果screen1, screen2上都有好几个i3标签页,而且各有Virutalbox的多窗口中的一个,如果鼠标screen1的Virtualbox窗口移动到screen2时,会自动定焦到screen2中的Virtualbox窗口!

另外!Virtualbox的多个窗口可以从左边可右边拖动窗口到另外一个中去,只是一边是连续地进入,另一边有点不连续但是可以做到!!

只是两个窗口时,Host + f 全屏模式不好用了。

SIGINT, SIGTERM, SIGQUIT, SIGKILL

  • SIGINT Ctrl-c

  • SIGTERM 程序终止,可以等待程序关闭临时文件。

  • SIGQUIT Ctrl-\ 退出前保存coredump文件。

  • SIGKILL 不可捕获,立即终止。

2015-04-19 Sunday 10:45:38

获取本机的外部IP

可以通过一些外部的服务,例如:

$ curl icanhazip.com
$ curl ifconfig.me

但是这些服务可能并不稳定,而OpenDNS就比较让人放心一些,速度也比较快:

$ dig +short myip.opendns.com @resolver1.opendns.com

还有一个 ifcfg.me 的服务,提供user-agent, method等信息的查询。

$ curl 'ifcfg.me/?'
$ curl ifcfg.me/all
$ curl ifconfig.me/all.json

还有个查询显示器分辨率的服务: whatismyresolution.com,这个是什么原理呢?

最常用的命令

history | awk '{CMD[$4]++;count++;} END { for (a in CMD )print CMD[ a ]" " CMD[ a ]/count*100 "% " a }' | grep -v "./" | column -c3 -s " " -t |sort -nr | nl | head -n20

其中的$4跟history的输出格式有关,就是让这个指向命令所在的域就好了。

2015-04-24 Friday 21:22:16

xinitrc

xinitrc里的配置其实一直是有问题的,例如 setxkbmap -option caps:escape & 总是无效,还有xrandr命令也不能正确配置显示器,每次都要手动。今天解决了一下。

~/.xinitrc
exec setxkbmap -optioin caps:escape &

要加上 exec 。但是有的命令不需要,例如 fcitx , goldendict , xcompmgr ,还有设置桌面背景的 feh 。所以还是搞不懂,先这么着吧。

然后xrandr是加了exec也不会正常工作的,要在 /etc/X11/xorg.conf.d/ 下面加一个文件:

55-xrandr.conf
Section "Monitor"
	Identifier "DVI-1"
	Option "PreferredMode" "1920x1080"
	Option "Primary" "true"
EndSection


Section "Monitor"
	Identifier "DVI-0"
	Option "PreferredMode" "1280x1024"
	Option "LeftOf" "DVI-1"
EndSection

Virtualbox的问题

再次更新后出错!! dkms的问题,之前都不知道它是什么也没出现什么问题啊!

回退,失败。无数次失败后,还是看了日志,里面有一条是:

00:00:00.302028 ERROR [COM]: aRC=NS_ERROR_FAILURE (0x80004005) aIID={431685da-3618-4ebc-b038-833ba829b4b2} aComponent={ExtPack} aText={Failed to locate the module 'VDPluginCrypt' in extension pack 'Oracle VM VirtualBox Extension Pack'}, preserve=false

但是这个扩展包我都没有听说过,到Archlinux的wiki上搜,才知道是AUR中的一个包,装好后就可以了。但是为什么之前从来没有这个包的时候也没出现过问题呢!!

2015-04-28 Tuesday 00:20:36

GDB

coolshell.cn博客上干货还是挺多的,重要的是上面会有很多作者自己翻译过来重新整理的文章。

逆向调试,就是不小心next过了,可以返回。 * GDB的 Reversable Debugging * VS的 Historical Debugging * bash脚本调试

$ bash -x script.sh #但是 man bash 没有找到 -x 选项。
$ pacman -S bashdb
  • ldd的安全问题

autopep8

pep8能够检查python代码的风格是否符合PEP8规范,但是不能自动纠正。