分类 其他 下的文章

rfc1738 page 18 - page 19 中定义了 URL 中允许出现的字符

摘录如下:

lowalpha       = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" |
                 "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" |
                 "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" |
                 "y" | "z"
hialpha        = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
                 "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
                 "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"

alpha          = lowalpha | hialpha
digit          = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
                 "8" | "9"
safe           = "$" | "-" | "_" | "." | "+"
extra          = "!" | "*" | "'" | "(" | ")" | ","
national       = "{" | "}" | "|" | "\" | "^" | "~" | "[" | "]" | "`"
punctuation    = "<" | ">" | "#" | "%" | <">


reserved       = ";" | "/" | "?" | ":" | "@" | "&" | "="
hex            = digit | "A" | "B" | "C" | "D" | "E" | "F" |
                 "a" | "b" | "c" | "d" | "e" | "f"
escape         = "%" hex hex

unreserved     = alpha | digit | safe | extra
uchar          = unreserved | escape
xchar          = unreserved | reserved | escape
digits         = 1*digit

写成正则是这样的

^[a-zA-Z\d$-_.+!*'(),{}|\^~[]`<>#%";/?:@&=]+&

参考资料:http://www.rfc-editor.org/rfc/rfc1738.txt

先上代码

$a = 123;
$b = 45;

$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;

echo $a, '  ', $b, PHP_EOL;

就酱紫,两个数字相同也是可以成功交换的。

先说两个事实

  1. 两个相同的数异或总是 0
  2. 任意数字与 0 做异或值不变

交换流程

  1. $a = $a ^ $b
  2. $b = $a ^ $b
    要注意此时等号右边的 $a 已经等于 $a ^ $b
    所以上的面等式可以转化为 $b = $a ^ $b ^ $b = $a
  3. $a = $a ^ $b
    此时 $a 等于 $a ^ $b $b 已经等于 $a 的初始值
    所以上的面等式可以转化为 $a = $a ^ $b ^ $a = $b

成功交换两个数

理解上述流程可以类比下列交换 a b 值的方式
a = a + b
b = a - b
a = a - b

网上有几个帖子没说清楚,里面提到不能交换两个相同的数,注意这个说法是错误的!
仅仅是不能交换指向同一个地址空间的两个数

如果 a b 两个变量指向同一个地址空间这样做是不行的

$c = 45;

$a = &$c;
$b = &$c;

$a = $a^$b;
$b = $a^$b;
$a = $a^$b;

echo $a, '  ', $b, PHP_EOL;

相当于每次都是两个相同的数字做异或,最终结果都是 0

这只是一种解题思路,看起来很巧妙,但是并不一定快,通常我们都是采用中间变量的形式来交换。
现在的编译器很聪明,对我们写的代码做了很多优化,所以不要以为异或的方式交换更快。
具体论证可以看这里

ios 9.3.2
header 值带空格
setRequestHeader 时会报错 DOM Exception 12

比如
采用 token 认证方式时 一般会给 Authorization 设置 'Bearer ' + token
如果用户尚未登录,这是 token 值为空
Authorization 的值就为 'Bearer '
就有可能遇到上述的奇怪问题

出现于稍旧的 safari 内核浏览器

大致流程请看这里已经非常详细了,感谢原博主的教程和资源。
这里介绍安装和使用中遇到的几个问题

启动遇到的问题

如果你的服务器只有 1G 内存,使用默认配置是启动不了的,因为默认配置的内存占用比较大。
首先要修改配置
vi /opt/atlassian/confluence/bin/setenv.sh
搜索 CATALINA_OPTS
找到

CATALINA_OPTS="$CATALINA_OPTS -Xms1024m -Xmx1024m -XX:MaxPermSize=256m -XX:+UseG1GC"

-Xms 表示最低内存限制 -Xmx 表示最大内存限制。改成

CATALINA_OPTS="$CATALINA_OPTS -Xms256m -Xmx512m -XX:MaxPermSize=256m -XX:+UseG1GC"

就可以勉强跑起来了。建议 1G 内存的服务器就不要装了,跑不动。。
对于这个问题的官方回复请看这里

mysql 版本的问题

Ubuntu 16.04 安装的 mysql 版本是 5.7,与这个 confluence 版本不兼容,可以在这里下载兼容 mysql 5.7 的 jar 包,替换 mysql-connector-java-5.1.39-bin.jar 就可以啦!
对于这个问题的官方回复请看这里

设置数据库连接的问题

要在默认连接字符串后面加上这个:&useUnicode=true&characterEncoding=utf8&autoReconnect=true
否则中文会乱码

修改 baseUrl

使用 admin 账号在网站的后台管理中修改 baseUrl 并没有什么卵用,点到应用商店还是会提示 baseUrl 不匹配,需要在 /opt/atlassian/confluence/conf/server.xml 中做相应的修改。如果使用 nginx 或者 apache 做代理的话,还需要修改几处地方,具体修改方式查看这里这里