2018 shadowsocks部署

更新一篇

目前来说ss的部署已经很方便了,以debian 9 为例,shadowsocks-libev已经可以通过apt-get直接安装

sudo apt-get install apt-get install shadowsocks-libev

然后设置密码,端口和加密方式

sudo vi /etc/shadowsocks-libev/config.json
{
"server":"0.0.0.0",
"server_port":80,
"local_address":"127.0.0.1",
"password":"这里是密码",
"timeout":300,
"method":"aes-256-cfb"
}

其中server建议改为0.0.0.0,如果确定服务器公网IP就写公网IP,端口看自己喜好,加密方式(method)推荐chacha20/aes-256-cfb 兼容范围较广且够用,如果确定设备支持改为xxxx-ief-poly1305更佳.

重启ss服务

service shadowsocks-libev restart

可通过

service shadowsocks-libev status

查看启动状态,Active: active (running)  既启动成功.权限管的比较严的服务器记得加上sudo

另外启动bbr协议参见这篇:https://hceasy.com/2018/08/linode-debian-9-%e5%bc%80%e5%90%afbbr%e6%94%af%e6%8c%81/


linode Debian 9 开启BBR支持

实际上linode已经支持了BBR.运行

sysctl net.ipv4.tcp_available_congestion_control

返回里面没BBR是因为启动方式不对.在linode后台中Dashboard选项下点击edit启动参数.

Boot Settings-Kernel 中的具体内核版本改为 GRUB2 -重启

接下来就是网上普遍的教程

//写入配置
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
//保存生效
sysctl -p
//重启
reboot
查看是否启用
sysctl net.ipv4.tcp_available_congestion_control
//返回中包含bbr
net.ipv4.tcp_available_congestion_control = bbr cubic reno
//是否启用
lsmod | grep bbr
//返回
tcp_bbr                20480  14


JavaScript 精确计算函数

/**
 ** 加法函数,用来得到精确的加法结果
 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
 ** 调用:accAdd(arg1,arg2)
 ** 返回值:arg1加上arg2的精确结果
 **/
function accAdd(arg1, arg2) {
    var r1,
        r2,
        m,
        c;
    try {
        r1 = arg1.toString().split('.')[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split('.')[1].length;
    } catch (e) {
        r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = Math.pow(10, Math.max(r1, r2));
    if (c > 0) {
        var cm = Math.pow(10, c);
        if (r1 > r2) {
            arg1 = Number(arg1.toString().replace('.', ''));
            arg2 = Number(arg2.toString().replace('.', '')) * cm;
        } else {
            arg1 = Number(arg1.toString().replace('.', '')) * cm;
            arg2 = Number(arg2.toString().replace('.', ''));
        }
    } else {
        arg1 = Number(arg1.toString().replace('.', ''));
        arg2 = Number(arg2.toString().replace('.', ''));
    }
    return (arg1 + arg2) / m;
}
/**
 ** 减法函数,用来得到精确的减法结果
 ** 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。
 ** 调用:accSub(arg1,arg2)
 ** 返回值:arg1加上arg2的精确结果
 **/
function accSub(arg1, arg2) {
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
/**
 ** 乘法函数,用来得到精确的乘法结果
 ** 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
 ** 调用:accMul(arg1,arg2)
 ** 返回值:arg1乘以 arg2的精确结果
 **/
function accMul(arg1, arg2) {
    var m = 0,
        s1 = arg1.toString(),
        s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length;
    } catch (e) {}
    try {
        m += s2.split(".")[1].length;
    } catch (e) {}
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
/**
 ** 除法函数,用来得到精确的除法结果
 ** 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
 ** 调用:accDiv(arg1,arg2)
 ** 返回值:arg1除以arg2的精确结果
 **/
function accDiv(arg1, arg2) {
    var t1 = 0,
        t2 = 0,
        r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length;
    } catch (e) {}
    try {
        t2 = arg2.toString().split(".")[1].length;
    } catch (e) {}
    r1 = Number(arg1.toString().replace(".", ""));
    r2 = Number(arg2.toString().replace(".", ""));
    return (r1 / r2) * Math.pow(10, t2 - t1);
}

将footer固定在底部

看完这篇文章后决定用第三个方法,其实很想用jq的,方便灵活,咨询了好多老前辈后,得知Js控制DOM在性能上影响比较大,能用css和html解决就不要用js了。

HTML

<div id="container">
<div>.........</div>
</div>
<div class="push"><!-- not put anything here --></div>
<div id="footer">Footer Section</div>

CSS

html,
body{
    height: 100%;
    margin:0;
    padding:0;
}
#container {
    min-height: 100%;
    height: auto !important;
    height: 100%;
    margin: 0 auto -330px;/*margin-bottom的负值等于footer高度*/
}
.push,
#footer {
    height: 330px;
    clear:both;
}
  1. html和body标签:html,body标签和前两种方法一样,需要设置“height:100%”并重置“margin”和“padding”为0;
  2. div#container:方法三关键部分就在于div#container的设置,首先需要设置其最小高度(min-height)为100%,为了能兼容好IE6,需要对min-height进行兼容处理(具体处理方法看前面或代码)另外这里还有一个关键点在div#container容器上需要设置一个margin-bottom,并且给其取负值,而且值的大小等于div#footer和div.push的高度,如果div#footer和div.push设置了padding和border值,那么div#container的margin-bottom负值需要加上div#footer和div.push的padding和border值。也就是说“div#container{margin-bottom:-[div#footer的height+padding+border]或者-[div.push的height+padding+border]}”。一句话说:div#container的margin-bottom负值需要和div#footer以及div.push的高度一致(如果有padding或border时,高度值需要加上他们);
  3. div.push:在div.push中我们不应该放置任何内容,而且这个div必须放置在div#container容器中,而且是最底部,并且需要设置其高度值等于div#footer的值,最好加上clear:both来清除浮动。div.push容器在此处所起的作用就是将footer往下推。
  4. div#footer容器:div#footer容器和方法二一样,不能放到div#container内部,而和div#container容器同级,如果需要设置元素和footer之间的间距,最好使用padding来代替margin值。

Firefox 打开链接就卡死的解决办法

我会告诉你是迅雷插的原因么……
我会告诉你是迅雷插的原因么……
我会告诉你是迅雷插的原因么……
我会告诉你是迅雷插的原因么……
我会告诉你是迅雷插的原因么……
我会告诉你是迅雷插的原因么……
我会告诉你是迅雷插的原因么……
………………
关闭什么硬件加速跟Flansh沙盒根本没效果有没有。
点击谷歌搜索结果秒卡啊有没有
赶紧打开插件管理器卸载了迅雷插件吧
据说是那个插件一直在检测鼠标点击的链接是否可以下载的原因
不管你信不信,反正我卸载了之后立马流畅了
渣雷啊。。。

MOTO X 国行 解锁、移除BL警告

moto终于回归了,那个激动。第一部手机就是女朋友给我买的moto e398。刷机root想必是安卓用户的一大乐趣,微信上咨询过moto的客服,被明确告知官方不支持解锁bl,root等操作,也不建议这么做。当时心都凉了一半,语音服务在大陆被修改成那样也就算了,不能刷机不能拿来做什么,后续官方不维护的话纯靠民间团队做系统更新啊。我从mi2上深深感受到了这一点的重要性。mi2比nexus 5更新正式版要快多了。不过最终还是没能抵挡住全网通的诱惑,从京东上买了一个32G 黑檀木。


好了,废话不多说,回归正题,其实解锁bl没什么难度。
友情提示:解锁BL会失去质保,三思啊。我是抱着以后出了毛病自己换零件的态度解锁的。反正又没什么难度。
下载moto驱动 https://motorola-global-zn-ch.custhelp.com/app/answers/detail/a_id/91628
下载adb工具包 http://pan.baidu.com/s/1pJxAq8N
驱动安装的话直接下一步即可。
然后解压moto.zip 那个工具包,建议放到D盘或者C盘,总之是根目录
手机上系统里面:设置-开发者选项(如果没有的话请在关于手机里面猛戳最后的版本号)-启用OEM解锁,勾上
关机,同时按电源键和音量减两个按钮,进入FASTBOOT界面,接上USB数据线到电脑。
进工具包目录里(刚刚你自己解压到哪里来着),点那个CMD的快捷方式.
运行命令

fastboot oem get_unlock_data

可以得到类似这样的代码

 waiting for device >
...
3A354XXXXXXXXXXX#54413039303033
XXXXXXXXXXXXXXXX3835000000#B19D
XXXXXXXXXXXXXXXX8746BE4649F42DE
XXXXX#XXXXXXXXXX000000000000000
0000000
OKAY [  0.041s]
finished. total time: 0.042s

注:其中xxx较多的部分是我隐去的,你得到的不会有这么多X
找个记事本把代码中的换行空格什么的都去掉,连成一串。到这个网站上提交 https://motorola-global-portal.custhelp.com/app/standalone/bootloader/unlock-your-device-b
图片就不发了,总共只有一个你能输入的地方,同意下面的协议,点下一步后解锁码会发到你邮箱里。中间可能需要账号注册什么的,自行解决。
然后继续在那个工具里面执行

fastboot oem unlock XXXXXXXXXX

XXXX 即为你的解锁码。
如果你操作的姿势足够正确的话,手机会重启,然后你会看到一个“警告,启动引导程序解锁……”的画面,而且这个画面以后每次开机都会有,是不是好恶心。
这时候手机应该开机了,开发者选项里面勾上usb调试。
下载 http://pan.baidu.com/s/1ntyuvyT
解压里面的logo.bin,跟刚刚的工具包放在同一个目录下,运行

adb reboot bootloader 
fastboot flash logo logo.bin #这条等到手机重启进入fastboot了再运行

然后,像以前一样正常开机吧。
正在体验牛叉中,心情很激动,如果上文有错别字请告知。

Discuz! X3.2 补充个人信息任务插件修改

想更改补充信息的条件找不到选项有没有。。。
位置

source/class/task/task_profile.php

关键句

$fields = array('realname', 'gender', 'birthyear', 'birthmonth','birthday','bloodtype','affectivestatus','birthprovince','birthcity','resideprovince', 'residecity');

把红字换成必须完成的字段即可。
下面是对照表

('realname', 1, 0, 0, '真实姓名', '', 0, 0, 0, 0, 0, 0, 1, 'text', 0, '', '');
('gender', 1, 0, 0, '性别', '', 0, 0, 0, 0, 0, 0, 1, 'select', 0, '', '');
('birthyear', 1, 0, 0, '出生年份', '', 0, 0, 0, 0, 0, 0, 1, 'select', 0, '', '');
('birthmonth', 1, 0, 0, '出生月份', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('birthday', 1, 0, 0, '生日', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('constellation', 1, 1, 0, '星座', '星座(根据生日自动计算)', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('zodiac', 1, 1, 0, '生肖', '生肖(根据生日自动计算)', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('telephone', 1, 1, 0, '固定电话', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('mobile', 1, 1, 0, '手机', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('idcardtype', 1, 1, 0, '证件类型', '身份证 护照 驾驶证等', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '身份证\n护照\n驾驶证', '');
('idcard', 1, 1, 0, '证件号', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('address', 1, 1, 0, '邮寄地址', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('zipcode', 1, 1, 0, '邮编', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('nationality', 0, 0, 0, '国籍', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('birthprovince', 1, 0, 0, '出生省份', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('birthcity', 1, 0, 0, '出生地', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('birthdist', 1, 0, 0, '出生县', '出生行政区/县', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('birthcommunity', 1, 0, 0, '出生小区', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('resideprovince', 1, 0, 0, '居住省份', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('residecity', 1, 0, 0, '居住地', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('residedist', 1, 0, 0, '居住县', '居住行政区/县', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('residecommunity', 1, 0, 0, '居住小区', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '');
('residesuite', 0, 0, 0, '房间', '小区、写字楼门牌号', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('graduateschool', 1, 0, 0, '毕业学校', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('education', 1, 0, 0, '学历', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '博士\n硕士\n本科\n专科\n中学\n小学\n其它', '');
('company', 1, 0, 0, '公司', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('occupation', 1, 0, 0, '职业', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('position', 1, 0, 0, '职位', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('revenue', 1, 1, 0, '年收入', '单位 元', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('affectivestatus', 1, 1, 0, '情感状态', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('lookingfor', 1, 0, 0, '交友目的', '希望在网站找到什么样的朋友', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('bloodtype', 1, 1, 0, '血型', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, 'A\nB\nAB\nO\n其它', '');
('height', 0, 1, 0, '身高', '单位 cm', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('weight', 0, 1, 0, '体重', '单位 kg', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('alipay', 1, 1, 0, '支付宝', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('icq', 0, 1, 0, 'ICQ', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('qq', 1, 1, 0, 'QQ', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('yahoo', 0, 1, 0, 'YAHOO帐号', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('msn', 1, 1, 0, 'MSN', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('taobao', 1, 1, 0, '阿里旺旺', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('site', 1, 0, 0, '个人主页', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('bio', 1, 1, 0, '自我介绍', '', 0, 0, 0, 0, 0, 0, 0, 'textarea', 0, '', '');
('interest', 1, 0, 0, '兴趣爱好', '', 0, 0, 0, 0, 0, 0, 0, 'textarea', 0, '', '');
('field1', 0, 1, 0, '自定义字段1', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('field2', 0, 1, 0, '自定义字段2', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('field3', 0, 1, 0, '自定义字段3', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('field4', 0, 1, 0, '自定义字段4', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('field5', 0, 1, 0, '自定义字段5', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('field6', 0, 1, 0, '自定义字段6', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('field7', 0, 1, 0, '自定义字段7', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');
('field8', 0, 1, 0, '自定义字段8', '', 0, 0, 0, 0, 0, 0, 0, 'text', 0, '', '');