Oct
23
用Google的第一大烦恼是随时被墙。
番羽土啬吧。
用Google的第二大烦恼是,点击的链接总要过一道Google的统计。比如搜索test,第一条是www.test.com,但是点击的时候,打开的页面是
http://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=1&ved=0CCoQFjAA&url=http%3A%2F%2Fwww.test.com%2F&ei=LHuGUMSUDKf-iAeg7YCAAg&usg=AFQjCNH21KLjC0CBkjon2DwD_CZ0HApLMw
经常发生的事情是,一直卡在这个链接上,不管是否番羽土啬,反正总是跳不过去;而大部分情况下,目标网页不需要番羽土啬也是可以顺利打开的。
至于Google呢,他才不管你是不是总卡死在这个链接,反正他们要的是你这次点击的数据。
这个问题,可以借助一个叫"Don't Track Me Google"的grease monkey脚本来实现:
http://userscripts.org/scripts/show/121923
对于Firefox,需要安装Grease Monkey插件,而Chrome用户则方便了,直接可以作为插件使用。
页面右上方有个不起眼的 Install 按钮,点一下,会下载一个 xxxx.user.js ,旧版本的chrome就直接当插件安装上去了,新版本的会提示你,不能这么安装非官方来源的插件。解决方法是:打开扩展管理页面,把这个 js 文件拖进去,会问你是否要安装,点击“添加”,done。
番羽土啬吧。
用Google的第二大烦恼是,点击的链接总要过一道Google的统计。比如搜索test,第一条是www.test.com,但是点击的时候,打开的页面是
http://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=1&ved=0CCoQFjAA&url=http%3A%2F%2Fwww.test.com%2F&ei=LHuGUMSUDKf-iAeg7YCAAg&usg=AFQjCNH21KLjC0CBkjon2DwD_CZ0HApLMw
经常发生的事情是,一直卡在这个链接上,不管是否番羽土啬,反正总是跳不过去;而大部分情况下,目标网页不需要番羽土啬也是可以顺利打开的。
至于Google呢,他才不管你是不是总卡死在这个链接,反正他们要的是你这次点击的数据。
这个问题,可以借助一个叫"Don't Track Me Google"的grease monkey脚本来实现:
http://userscripts.org/scripts/show/121923
对于Firefox,需要安装Grease Monkey插件,而Chrome用户则方便了,直接可以作为插件使用。
页面右上方有个不起眼的 Install 按钮,点一下,会下载一个 xxxx.user.js ,旧版本的chrome就直接当插件安装上去了,新版本的会提示你,不能这么安装非官方来源的插件。解决方法是:打开扩展管理页面,把这个 js 文件拖进去,会问你是否要安装,点击“添加”,done。
Oct
19
经常是用vim打开了某个/etc下的文件,使用 :w 保存的时候提示 "E45: 'readonly' option is set (add ! to override)",而 :w! 则提示 "E212: Can't open file for writing"。通常的解决方案是 :q! 然后 sudo !! 再次编辑,然后保存。
虽然挺麻烦,但是一直也就将就用了。今天有人在SegmentFault.com提出了这个问题,于是仔细考虑了下,的确还是有办法实现的:
:%!sudo bash -c "cat > '%'" #为了防止文件名中的空格之类特殊字符,最好在后一个%前后加上引号
:w !sudo tee % #另一个回答给出的这个方法更简洁,出自 http://vim.wikia.com/wiki/Su-write
其实最初的想法是 :%!sudo cat > % ,但是由于权限的问题(vim打开的shell没法清空当前文件),所以还是得请shell进来掺和一脚:先用sudo给shell提权,然后shell再执行cat将stdin的内容输出到%。
p.s. 顺便给不了解 :%! 这个含义的同学普及一下, :!xxx 是执行 xxx 命令, :%!xxx 则是把当前缓冲区的所有内容当成 stdin 去执行 xxx 命令,然后将xxx的stdout再替换当前缓冲区的内容。比较常见的用法是 :%!sort 给文件所有的行排序,然后 :%!uniq 去重。另外%可以用范围来代替(同 :s 命令的范围)。
虽然挺麻烦,但是一直也就将就用了。今天有人在SegmentFault.com提出了这个问题,于是仔细考虑了下,的确还是有办法实现的:
引用
:w !sudo tee % #另一个回答给出的这个方法更简洁,出自 http://vim.wikia.com/wiki/Su-write
其实最初的想法是 :%!sudo cat > % ,但是由于权限的问题(vim打开的shell没法清空当前文件),所以还是得请shell进来掺和一脚:先用sudo给shell提权,然后shell再执行cat将stdin的内容输出到%。
p.s. 顺便给不了解 :%! 这个含义的同学普及一下, :!xxx 是执行 xxx 命令, :%!xxx 则是把当前缓冲区的所有内容当成 stdin 去执行 xxx 命令,然后将xxx的stdout再替换当前缓冲区的内容。比较常见的用法是 :%!sort 给文件所有的行排序,然后 :%!uniq 去重。另外%可以用范围来代替(同 :s 命令的范围)。
Sep
26
尽管 https://dynamic.12306.cn/otsweb 的 jsessionid 有效期是一年,但是如果不几分钟发个请求的话,照样会被T出来。
所以写了这么个小代码,可以每隔一段时间自动“点”一下重新查询按钮。
=== update @ 16:40 ===
其实简单一点,按下F12,在console里面执行这个就行了...
=== OLD ===
所以写了这么个小代码,可以每隔一段时间自动“点”一下重新查询按钮。
用法:在chrome下打开订票页面,按F12,在框架内找个地方把这段代码扔进去,确定,然后在页面上点击多出来Run按钮,这样就会被个30s自动“点击”一次 [重新查询] 按钮。
所以写了这么个小代码,可以每隔一段时间自动“点”一下重新查询按钮。
=== update @ 16:40 ===
其实简单一点,按下F12,在console里面执行这个就行了...
var f=document.getElementById('main'); var btn=f.contentDocument.getElementById('submitQuery'); setInterval("btn.click()", 30000);
=== OLD ===
所以写了这么个小代码,可以每隔一段时间自动“点”一下重新查询按钮。
<div>
<textarea id="code">
var x=setInterval("document.getElementById('submitQuery').click();", 30000);alert(x);
</textarea>
<input type="button" value="run" onclick="javascript:try{eval(document.getElementById('code').value);}catch(e){alert(e);}"/>
</div>
<textarea id="code">
var x=setInterval("document.getElementById('submitQuery').click();", 30000);alert(x);
</textarea>
<input type="button" value="run" onclick="javascript:try{eval(document.getElementById('code').value);}catch(e){alert(e);}"/>
</div>
用法:在chrome下打开订票页面,按F12,在框架内找个地方把这段代码扔进去,确定,然后在页面上点击多出来Run按钮,这样就会被个30s自动“点击”一次 [重新查询] 按钮。
Sep
23
Sep
3
#!/bin/bash
API=https://dnsapi.cn/Record.Ddns
IP_FILE=/tmp/dnspod_ip
function get_old_ip()
{
ip=
if [ -e "$IP_FILE" ]; then
ip=`cat $IP_FILE`
fi
echo $ip
}
function save_ip()
{
echo -n $1 > $IP_FILE
}
function get_new_ip()
{
echo `nc ns1.dnspod.net 6666`
}
email=帐号邮箱
password=帐号密码 #dnspod就不能搞成个secret_key么!明文密码让人很不舒服啊。
domain_id=XXXXX #使用Domain.List API获取
record_id=YYYYY #使用Record.List API获取
sub_domain="zzz" #DDNS的二级域名
new_ip=`get_new_ip`
old_ip=`get_old_ip`
if [ "$new_ip" != "$old_ip" ];
then
curl $API -d "format=json&login_email=$email&login_password=$password&domain_id=$domain_id&record_id=$record_id&sub_domain=$sub_domain&record_line=默认"
save_ip $new_ip
fi
API=https://dnsapi.cn/Record.Ddns
IP_FILE=/tmp/dnspod_ip
function get_old_ip()
{
ip=
if [ -e "$IP_FILE" ]; then
ip=`cat $IP_FILE`
fi
echo $ip
}
function save_ip()
{
echo -n $1 > $IP_FILE
}
function get_new_ip()
{
echo `nc ns1.dnspod.net 6666`
}
email=帐号邮箱
password=帐号密码 #dnspod就不能搞成个secret_key么!明文密码让人很不舒服啊。
domain_id=XXXXX #使用Domain.List API获取
record_id=YYYYY #使用Record.List API获取
sub_domain="zzz" #DDNS的二级域名
new_ip=`get_new_ip`
old_ip=`get_old_ip`
if [ "$new_ip" != "$old_ip" ];
then
curl $API -d "format=json&login_email=$email&login_password=$password&domain_id=$domain_id&record_id=$record_id&sub_domain=$sub_domain&record_line=默认"
save_ip $new_ip
fi
然后加入crontab,每隔15分钟跑一次进行更新
*/15 * * * * ~/bin/dnspod.sh
Aug
24
:set formatoptions+=m "允许对multi_byte字符换行(否则默认只能空格或者英文标点,详见set breakat=)
:set textwidth=80 "换行的长度
ggVG "选中全文
gq "应用到选中文本
p.s. 最后两句也可以缩写成 gggpG (少一个字符)..
:set textwidth=80 "换行的长度
ggVG "选中全文
gq "应用到选中文本
p.s. 最后两句也可以缩写成 gggpG (少一个字符)..
Aug
22
可能很多同学不知道Windows是自带这个功能的。至少从WinXP开始就有。操作要领:
0. 批量重命名的文件应该在一个文件夹内。
1. 选择所有需要被重命名的文件。全选(CTRL+A),或拖动/用shift选择选择一个区间,或按住CTRL一个一个点,都可以。
2. 使用鼠标右键选择你希望被重命名的第一个文件,输入新的文件名。注意,新的文件名如果不带编号(如a.txt),那么会按顺序改成 a.txt, a (1).txt ... a (5).txt,如果带编号(如 b (3).txt,注意编号只能用圆括号包起来),则编号会按顺序增加:b (3).txt, b (4).txt ... b (11).txt。
3. 回车,OVER。
功能很贴心,但是半残,有时候不满足要求,在没有安装额外的语言的情况下,可以用类似如下的vbs来应急:
0. 批量重命名的文件应该在一个文件夹内。
1. 选择所有需要被重命名的文件。全选(CTRL+A),或拖动/用shift选择选择一个区间,或按住CTRL一个一个点,都可以。
2. 使用鼠标右键选择你希望被重命名的第一个文件,输入新的文件名。注意,新的文件名如果不带编号(如a.txt),那么会按顺序改成 a.txt, a (1).txt ... a (5).txt,如果带编号(如 b (3).txt,注意编号只能用圆括号包起来),则编号会按顺序增加:b (3).txt, b (4).txt ... b (11).txt。
3. 回车,OVER。
功能很贴心,但是半残,有时候不满足要求,在没有安装额外的语言的情况下,可以用类似如下的vbs来应急:
Set a= WScript.createObject("WScript.Shell")
WScript.sleep 1000
For i = 1 to 23
j = i
If i < 10 Then
j = "0" & i
End If
a.sendkeys "{DOWN}{F2}" '向下,F2(重命名)
a.sendkeys "TBBTs02e" & j '文件名, win7下就不用再 & ".rmvb" 了,但是xp需要
a.sendkeys "~" '回车
WScript.sleep 200
Next
WScript.sleep 1000
For i = 1 to 23
j = i
If i < 10 Then
j = "0" & i
End If
a.sendkeys "{DOWN}{F2}" '向下,F2(重命名)
a.sendkeys "TBBTs02e" & j '文件名, win7下就不用再 & ".rmvb" 了,但是xp需要
a.sendkeys "~" '回车
WScript.sleep 200
Next
Aug
17
对ssh用得比较多的同学应该知道通过建立信任关系来免除输入密码的麻烦:
在A机器上执行:
$ ssh-keygen -t rsa (各种回车)
$ ssh-copy-id -i ~/.ssh/id_rsa.pub USER@B_ip
然后在A机器上 ssh USER@B_ip 就可以免密码使用USER用户登录B机器了。
实际上第二步操作是将 A 机器该用户的公钥(id_rsa.pub)追加到B机器的 ~/.ssh/authorized_keys 文件末尾中去。
当A机器访问B时,如果B机器的sshd能够在/home/USER/.ssh/authorized_keys中找到对应的公钥,就认为A机器具有B机器的USER用户访问权限,于是就直接让A机器以USER身份登录。
但是上周在线上某台机器进行操作时却发现这一机制失效了。通过该机制,A=>B可登录,但是B=>A失败,甚至A=>A也失败(B=>B却成功)。虽然问题很奇怪,但说明问题出在A机器上。
首先是 diff 了A、B两台机器的 /etc/ssh ,发现完全相同,所以不是配置的问题。
然后查看 ssh -vv localhost
而在B机器上,we sent a public key packet, wait for reply 之后则是紧跟着"debug1: Server accepts key: pkalg ssh-rsa blen 279"。由此可以看出,是A机器的sshd不认可publickey。
至于为什么不认可,在google上查了许多,毫无头绪,直到使用类似“ssh publickey ignore debug diagnose”这样的关键词,发现这个页面,其中的第二条和第六条给出了解答:
通过执行 /usr/sbin/sshd -d -p 2222 (在2222端口启动一个带debug输出的sshd) ,然后 ssh -vv localhost -p 2222 ,可以看到sshd输出了一行
正好与那第六条相对应,再检查一下 /home/felix021 ,其权限是其他组可写。
最终解决方案:将用户home目录的权限改为0755,登录成功。
在A机器上执行:
$ ssh-keygen -t rsa (各种回车)
$ ssh-copy-id -i ~/.ssh/id_rsa.pub USER@B_ip
然后在A机器上 ssh USER@B_ip 就可以免密码使用USER用户登录B机器了。
实际上第二步操作是将 A 机器该用户的公钥(id_rsa.pub)追加到B机器的 ~/.ssh/authorized_keys 文件末尾中去。
当A机器访问B时,如果B机器的sshd能够在/home/USER/.ssh/authorized_keys中找到对应的公钥,就认为A机器具有B机器的USER用户访问权限,于是就直接让A机器以USER身份登录。
但是上周在线上某台机器进行操作时却发现这一机制失效了。通过该机制,A=>B可登录,但是B=>A失败,甚至A=>A也失败(B=>B却成功)。虽然问题很奇怪,但说明问题出在A机器上。
首先是 diff 了A、B两台机器的 /etc/ssh ,发现完全相同,所以不是配置的问题。
然后查看 ssh -vv localhost
引用
....
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/felix021/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /home/felix021/.ssh/id_dsa
debug1: Trying private key: /home/felix021/.ssh/id_ecdsa
debug2: we did not send a packet, disable method
debug1: Next authentication method: password
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/felix021/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /home/felix021/.ssh/id_dsa
debug1: Trying private key: /home/felix021/.ssh/id_ecdsa
debug2: we did not send a packet, disable method
debug1: Next authentication method: password
而在B机器上,we sent a public key packet, wait for reply 之后则是紧跟着"debug1: Server accepts key: pkalg ssh-rsa blen 279"。由此可以看出,是A机器的sshd不认可publickey。
至于为什么不认可,在google上查了许多,毫无头绪,直到使用类似“ssh publickey ignore debug diagnose”这样的关键词,发现这个页面,其中的第二条和第六条给出了解答:
引用
2. Debugging on the remote host by running sshd in debug mode: Run ‘/usr/sbin/sshd -d -p 2222′ on the remote host and connect to it. ’2222′ here is the port number of the sshd process you started on the remote host.
6. Check the permissions on your home directory, .ssh directory, and the authorized_keys file: If your ssh server is running with ‘StrictModes on’, it will refuse to use your public keys in the ~/.ssh/authorized_keys file. Your home directory should be writable only by you, ~/.ssh should be 700, and authorized_keys should be 600.
6. Check the permissions on your home directory, .ssh directory, and the authorized_keys file: If your ssh server is running with ‘StrictModes on’, it will refuse to use your public keys in the ~/.ssh/authorized_keys file. Your home directory should be writable only by you, ~/.ssh should be 700, and authorized_keys should be 600.
通过执行 /usr/sbin/sshd -d -p 2222 (在2222端口启动一个带debug输出的sshd) ,然后 ssh -vv localhost -p 2222 ,可以看到sshd输出了一行
引用
Authentication refused: bad ownership or modes for directory /home/felix021
正好与那第六条相对应,再检查一下 /home/felix021 ,其权限是其他组可写。
最终解决方案:将用户home目录的权限改为0755,登录成功。