Decorative image frame

Ubuntu使用Shell脚本实现DNSPOD动态域名解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/bin/sh

#################################################
# AnripDdns v3.08.09
# 基于DNSPod用户API实现的动态域名客户端
# 作者: 若海[mail@anrip.com]
# 介绍: http://www.anrip.com/ddnspod
# 时间: 2013-08-08 23:25:00
#################################################

# 全局变量表
arPass=arMail=""

# 获得外网地址
arIpAdress() {
local inter="http://members.3322.org/dyndns/getip"
wget --quiet --no-check-certificate --output-document=- $inter
}

# 查询域名地址
# 参数: 待查询域名
arNslookup() {
local dnsvr="114.114.114.114"
nslookup ${1} $dnsvr | tr -d '\n[:blank:]' | sed 's/.\+1 \([0-9\.]\+\)/\1/'
}

# 读取接口数据
# 参数: 接口类型 待提交数据
arApiPost() {
local agent="AnripDdns/3.08(mail@anrip.com)"
local inter="https://dnsapi.cn/${1:?'Info.Version'}"
local param="login_email=${arMail}&login_password=${arPass}&format=json&${2}"
wget --quiet --no-check-certificate --output-document=- --user-agent=$agent --post-data $param $inter
}

# 更新记录信息
# 参数: 主域名 子域名
arDdnsUpdate() {
local domainID recordID recordRS recordCD
# 获得域名ID
domainID=$(arApiPost "Domain.Info" "domain=${1}")
domainID=$(echo $domainID | sed 's/.\+{"id":"\([0-9]\+\)".\+/\1/')
# 获得记录ID
recordID=$(arApiPost "Record.List" "domain_id=${domainID}&sub_domain=${2}")
recordID=$(echo $recordID | sed 's/.\+\[{"id":"\([0-9]\+\)".\+/\1/')
# 更新记录IP
recordRS=$(arApiPost "Record.Ddns" "domain_id=${domainID}&record_id=${recordID}&sub_domain=${2}&record_line=默认")
recordCD=$(echo $recordRS | sed 's/.\+{"code":"\([0-9]\+\)".\+/\1/')
# 输出记录IP
if [ "$recordCD" == "1" ]; then
echo $recordRS | sed 's/.\+,"value":"\([0-9\.]\+\)".\+/\1/'
return 1
fi
# 输出错误信息
echo $recordRS | sed 's/.\+,"message":"\([^"]\+\)".\+/\1/'
}

# 动态检查更新
# 参数: 主域名 子域名
arDdnsCheck() {
local postRS
local hostIP=$(arIpAdress)
local lastIP=$(arNslookup "${2}.${1}")
echo "hostIP: ${hostIP}"
echo "lastIP: ${lastIP}"
if [ "$lastIP" != "$hostIP" ]; then
postRS=$(arDdnsUpdate $1 $2)
echo "postRS: ${postRS}"
if [ $? -ne 1 ]; then
return 0
fi
fi
return 1
}

###################################################

# 设置用户参数
arMail="${DNSPOD_USERNAME}"
arPass="${DNSPOD_PASSWORD}"

# 检查更新域名
arDdnsCheck "domain-1.com" "XXX-a"
arDdnsCheck "domain-1.com" "XXX-b"
arDdnsCheck "domain-1.com" "XXX-c"
arDdnsCheck "domain-1.com" "XXX-d"
arDdnsCheck "domain-2.com" "XXX-a"
arDdnsCheck "domain.2.com" "www"
arDdnsCheck "domain.2.com" "git"
arDdnsCheck "domain.2.com" "svn"

Javascript事件委托

事件委托对于web应用程序的性能有如下几个优点:

1.需要管理的函数变少了
2.占用的内存少了
3.javascript代码和Dom结构之间的关联更少了
4.在改变DOM结构中的innerHTML时,不需要改动事件处理函数

Read More...

利用子进程实现NodeJS程序退出后自动重启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

var child_process = require('child_process');

function start(nodefile) {
if (typeof start !== 'string') {
console.log('Has none file. like this: start("app.js")');
}

console.log('Master process is running.');

var proc = child_process.spawn('node', [nodefile]);

proc.stdout.on('data', function (data) {
console.log(data.toString());
});

proc.stderr.on('data', function (data) {
console.log(data.toString());
});

// 监测退出事件,删除原进程并重启新进程
proc.on('exit', function (code) {
console.log('child process exited with code ' + code);
delete(proc);
setTimeout(start, 5000);
});
}

module.exports = start;

Javascript事件模拟

事件是用来描述网页中某一特定有趣时刻的,众所周知事件通常是在由用户和浏览器进行交互时触发,其实不然,通过Javascript可以在任何时间触发特定的事件,并且这些事件与浏览器创建的事件是相同的。这就意味着会有适当的事件冒泡,并且浏览器会执行分配的事件处理程序。这种能力在测试web应用程序的时候,是非常有用的,在DOM 3级规范中提供了方法来模拟特定的事件,IE9 chrome FF Opera 和 Safari都支持这样的方式,在IE8及以前的办法的IE浏览器有他自己的方式来模拟事件。 Read More...

利用openssl完成X509证书和PFX证书之间的互转

完成两种格式的数字证书的互转,只需要几条openssl的命令,很方便。

1.将X509格式的数字证书转换成微软的PFX格式

1
openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx

2.将微软的PFX数字证书转换成X509格式

1
2
3
openssl pkcs12 -in server.pfx -nodes -out server.pem # 生成明文所有内容
openssl rsa -in server.pem -out server.key # 取 key 文件
openssl x509 -in server.pem -out server.crt # 取证书

Javascript函数扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
- 扩展Function原型
*/
Function.prototype.bind = Function.prototype.bind || function() {
var func = this,
target = arguments[0],
args = Array.prototype.slice.call(arguments, 1);

return function() {
var argsMerged = Array.prototype.concat.apply(args, arguments);
return func.apply(target, argsMerged);
}
}

魔都沦陷

夜里十点,徐家汇终于沦陷
苍茫的夜空里,风早已撤退
上亿吨PM2.5占领了整座城市
他们笼罩在公路和广场上面
在楼宇之间缓缓挪动、盘旋
汽车灯光浸透在粘稠的雾里
昏黄的路灯如同被羽化的火团
霓虹灯微弱的光在朦胧中
被压得快要窒息,我仿佛听见
它急促的呼吸和沉闷的呐喊
港汇和美罗城黯然成了蜃楼

我怜悯的看了一眼这座城市
心中不禁暗暗后怕起来
在垃圾桶旁掐掉手中燃烧的烟
仓忙的走进地下通道
这里早已布满他们的哨岗
出口、入口和通道里面早已爆满
一股股PM2.5在人流里穿梭
川流的人们表情无比凝重
仿佛一场险恶的生化战已然上演

各种颜色和形状的口罩
像守卫城堡的英勇士兵
紧紧护卫着女人娇艳的容颜
地上褴褛的流浪者抬起头
眨了眨他布满血丝的双眼
干裂的嘴角露出一丝快意的笑
自言自语:终究有了这一天

解决iframe在iPad内不能滚动的问题

在iPad1及iPad2里面浏览含有iframe的Web页面,会出现一个很抓狂的问题,就是iframe内引用的页面内容不能上下滑动(滚动),测试了一下其他的设备,这个问题也同样出现在了Android平台的浏览器上,大部分移动设备都存在这个问题,我估计开发商的初衷是为了方便用户浏览页面,而使iframe的宽度和高度自动匹配其内容尺寸,但是对于iframe内的touch事件却支持不完善,因此出现了iframe滑动无响应的现象。 Read More...