分类 default 下的文章

MacOS 的安全和隐私指南
Mac使用技巧
在mac 上安装abd
去掉window的缓存
Mac系统如何显示隐藏文件?

macOS历史版本
https://apps.apple.com/cn/app/macos-mojave/id1398502828?mt=12
https://www.cnblogs.com/mldonkey/p/13540481.html

快捷键

黑苹果:

win+z 撤回
win+Shift+z 反撤回

列出你的网卡

networksetup -listallnetworkservices

USB 10/100/1000 LAN
Wi-Fi
Bluetooth PAN
关闭ipv6

networksetup -setv6off “你网卡名字”

networksetup -setv6off "USB 10/100/1000 LAN"

设置ip地址

networksetup -setmanual “网卡名字” 192.168.31.2 255.255.255.0 192.168.1.1

networksetup -setmanual "USB 10/100/1000 LAN" 10.25.0.66 255.255.255.0 10.25.0.254

如果QQ可以连接,但网页打不开,说明 DNS 有问题,重新配置DNS

重新启用IPv6
直接在”高级“ > “TCP/IP” 下 IPv6 选自动选项

Command + Shift + 5: 录屏



ThinkPHP

官网:http://www.thinkphp.cn/ && GitHub
手册:https://www.kancloud.cn/@manual && 5.1
ThinkPHP5.1完全开发手册

ThinkCMF

https://www.thinkcmf.com/ && GitHub
插件
模板
手册 && 5.1
ThinkCMF FAQ
ThinkCMF5.1开发手册

GitHub

thinkcmf
demos
thinkcmfapi
mall

教程视频

https://chuanke.baidu.com/s4472461.html
https://study.163.com/courses-search?keyword=ThinkCMF

https://www.qdcrazy.cc/
http://www.crazys.pub/

thinkcmf 重置密码

<?php
// +----------------------------------------------------------------------
// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2019 http://www.thinkcmf.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 老猫 <thinkcmf@126.com>
// +----------------------------------------------------------------------
namespace app\portal\controller;

use cmf\controller\HomeBaseController;

class IndexController extends HomeBaseController
{
    public function index()
    {    
        echo cmf_password('adminadmin');//引号内密码自行设置;
        exit;
        $this->display(":index");
        // return $this->fetch(':index');
    }
}
\app\portal\controller\IndexController.php 

https://github.com/thinkcmf/demos
repository for ThinkCMF5.1 app, api, theme, plugin demos
演示应用、插件、模板和api,方便开发者学习 thinkcmf.

在thinkcmf5中实现为各个分类下的文章添加自定义字段的想法




广州到厦门交通:
从12306 App 上看直达厦门的普通火车时间不是很好,只能中转!

A.广州南站到厦门

广州南站深圳北站深圳北站厦门北站厦门站

B.广州南站到厦门

广州南站潮汕站潮汕站厦门北站厦门站
或其他

厦门交通

的士:一般为滴滴作为出行交通工具。
地铁:厦门的交通目前只有一条地铁(1号线,从镇海路站岩内站,截至2019.05.05)
鼓浪屿游渡:散客的轮渡从岛内到鼓浪屿只能走散客通道(还有市民通道)
单车:摩拜等

轮渡订票

支付宝:朋友,搜“厦门轮渡有限公司”,绑定个人信息,订票(可提前14天预定)即可。
例如厦门邮轮中心厦鼓码头(轮渡站)到鼓浪屿,具体看自己的时间和行程安排。

PS:厦门节假日都是塞车,高德地图看到飘红的都是塞车路段。

厦大

需要提前预约,在公众号,U厦大 > 我要预约,可提前72小时预约,
例如5.1的8:00可以预约5.4的8:00~13:00的;
然后在这个时间段内去厦大(两个大门入口:群贤校门,大南校门),
当然出来时间似乎不受限制!

景点门票

如果行程时间安排妥当,可以买联票(五大景点联票90元,只限当天有效),优惠!

厦门住所

在厦门住所一般都是民宿,可以下载美团或艺龙之类的APP。

使用工具

出行:12306 APP, 微信,飞猪等。
攻略:下载小红书,可以查看出游攻略。

5.1的行程:

最迟出门:08:28(五一节假日人多,时间要准备充裕,早点出门)
广州南站:10:28 ~ 深圳北站:10:57(G6507 03车 历时29分)
深圳北站:11:49 ~ 厦门北站:15:28(D2318 07车 历时3小时39分)
厦门轮渡有限公司(支付宝,朋友搜):
航线:邮轮中心厦鼓码头-三丘田码头,登船口1
航班时间:2019-05-01 17:30
节假日人多建议提前60分钟进行安检,带身份证,可身份证进站,返程时间5.3,返程免费且时间不限。
如果返程是去中山路,建议搭厦门轮渡码头

5.4的行程

厦门北站:16:06 ~ 深圳北站: 19:48(D2319 07车 历时3小时42分)
深圳北站:20:31 ~ 广州南站:21:07 (G6514 14车 历时36分)

特别注意

1.节假日出行,一般提前一个月订票为佳,
例如动车火车提前一个月订票来回的车票机票等,所以节假日出行需要提前起码一个月做好规划行程。
在美团上订房,如果出行有变可提前一个星期100%退款(具体以实际条款为准);

2.不要被一些民宿的人骗了,说你的时间(或其他说法)赶不上,到鼓浪屿的轮渡坐不了,给你40%的退款之类的!
只要你的行程不变,不要相信就对了,要特别小心。

3.厦门很多黑的,他们会搭去门票很贵的景点,这些景点不在自己的行程内,所以很多人不了解情况被坑!
一定要坐车,滴滴就好!



婚姻是人生中的大事,男人有一个原始的意义就是找个女人生个娃,女人也一样,然后为传宗接代,光宗耀祖活一辈子

婚姻是否能走久远,主要在于地理距离和经济的支撑,其次才是感情。女人的虚荣心比男人的强的多,她总是为了面子和生活的优沃而不停的物色新的男人。太多的时候,距离不能产生爱,而是背叛和分手

这些或许就是古代讲究的门当户对,金屋藏娇,婚姻中难免有买卖关系存在。感情就是举案齐眉,从一而终吧

我个人的建议

在女方工作的地方有居所,或者你们能在同一城市生活,不久有自己的房子,这是婚姻的关键

你和她处于差不多的社会层面,或者你的工作收入比她高。

如果你和她是这样的,她的家人阻止影响不大,也没有意义,毕竟将来在一起生活的是你们而不是和她的家人。如果不是这样,你们还是早点拉倒,强行走在一起,有你们受的。

婚姻不是儿戏,决不能做出搞大人家的肚子后一走了之的高智商的事

via: http://www.hostloc.com/thread-449127-1-1.html


https://nodejs.org/dist/

《Node.js 调试指南》

@ruanyf
Chrome 浏览器允许将任意 HTTP 请求,转成 curl 命令的形式,从而在命令行发出这个请求。
这里还有一个小工具,可以将 curl 请求转成 Node 脚本。https://curl.trillworks.com/#node

版本号

使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。

语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。

如果只是修复bug,需要更新Z位。
如果是新增了功能,但是向下兼容,需要更新Y位。
如果有大变动,向下不兼容,需要更新X位。
版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。

NPM支持的所有版本号范围指定方式可以查看官方文档
Node 调试工具入门教程

node的http服务器

var http = require('http');
var fs = require('fs');
var documentRoot = 'D:/20180626/code'; //设置文件的根目录,可以修改为个人的自定义目录。
var server = http.createServer(function(req,res) {
    var url = req.url;
    var file = documentRoot + url;
    console.log(url);
    fs.readFile(file,function(err,data) {
        if(err){
            res.writeHeader(404,{
                'content-type':'text/html;charset="utf-8"'
            });
            res.write('<h1>404错误</h1><p>你要找的页面不存在</p>');
            res.end();
        }else{
            res.writeHeader(200,{
                'content-type':'text/html;charset=utf-8"'
            });
            res.write(data);
            res.end();
        }
    });
}).listen(8888);//设置的端口号,建议为6000以上。
console.log('服务器开启成功');



请输入图片描述
以上图来自这里
各位程序猿们,如果你觉得老板 10 天要你们上线一个 App 是一个丧心病狂的事情,
那么可以多想想这位哥。
Youtube 上有位哥的采访,你可以听听大神当年的故事。
https://www.youtube.com/watch?v=IPxQ9kEaF8c
当然,码农和大神的区别在于:遇到这种事情,10 天以后码农死掉了,而大神成功了。
只是但凡这种极速上线的事情,都会留下一堆的坑,大神和码农的的区别,也就是水洼和天坑的区别。

作者:罗志宇
链接:https://www.zhihu.com/question/31415286/answer/58022648
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

js混淆

https://javascriptobfuscator.herokuapp.com/
http://www.jsfuck.com/
移动时代的前端加密
从零开始的webpack生活-0x004:js压缩混淆
https://www.v2ex.com/t/381946
https://www.v2ex.com/t/392624
https://www.v2ex.com/t/363167

JavaScript

前端程序员经常忽视的一个JavaScript的面试试题
妙味课堂 JS 实战开发课程大纲
JavaScript (脚本之家)
JavaScript教程 (廖雪峰)
React.js-demo (阮一峰)(GitHub)
webpack-demos (阮一峰)
react-babel-webpack-boilerplate (阮一峰)
ECMAScript的兼容 && 兼容包
ECMAScript5.1中文版 + ECMAScript3 + ECMAScript(合集) && 英文版
30分钟掌握ES6/ES2015核心内容(上)
30分钟掌握ES6/ES2015核心内容(下)
ECMAScript 6 入门 (阮一峰)(GitHub)
ES6 全套教程 ECMAScript6 (原著:阮一峰)
JavaScript 标准参考教程(alpha) (阮一峰)(GitHub) 新地址 https://wangdoc.com/
悟透JavaScript
原生态纯JavaScript 100大技巧大收集
前端日常:JavaScript验证
JS实战实例教程
前端代码异常日志收集与监控
stylus中文版参考文档之综述
JavaScript深入系列(15篇)、JavaScript专题系列、ES6系列、React系列
Awesome JavaScript

递归

js 递归、非递归生成树
https://www.cnblogs.com/ygunoil/p/12524806.html

浮点型数据使用注意事项
JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。

所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定:
var x = 0.1;
var y = 0.2;
var z = x + y // z 的结果为 0.3
if (z == 0.3) // 返回 false
为解决以上问题,可以用整数的乘除法来解决:
var z = (x 10 + y 10) / 10; // z 的结果为 0.3

不推荐使用 TAB 键来缩进,因为不同编辑器 TAB 键的解析不一样。

关于js三元表达式,多个判断条件的写法
以两个判断条件为例,直接上代码:

var a = 3;
var b = a === 1 ? '是1' : (a === 2 ? '是2' : '不是1也不是2')
console.log(b); //不是1也不是2

Bridge

https://github.com/wendux/DSBridge-Android
https://github.com/wendux/DSBridge-IOS
原生与 JS 交互,里面有demo 例子

模块化规范

js模块化编程之彻底弄懂CommonJS和AMD/CMD!
CommonJS、requirejs、ES6的对比
Js apply call方法 详解
javascript 六种数据类型(一)
10 个技巧,让你更专业地使用 console 进行 JS 调试
High performance JavaScript templating engine

零碎

从谷歌的JavaScript编写风格中,13 点值得我们注意的! && google jsguide
不会Object.defineProperty你就out了 && MDN

聊聊函数节流(throttle)和函数去抖(debounce)

https://unpkg.com/browse/vue@2.6.10/
https://cdn.jsdelivr.net/npm/vue/
在 unpkg 和 cdnjs 上获取

https://github.com/lodash/lodash/ && 中文文档地址 && 中文文档2
https://www.npmjs.com/package/ramda && 中文
Lodash,你正在使用的JavaScript库
轻量高效的开源JavaScript插件和库

http://www.freejs.net/

节流 (throttle) 让一个函数不要执行的太频繁,减少执行过快的调用,叫节流
去抖 (debounce) 去抖就是对于一定时间段的连续的函数调用,只让其执行一次
https://segmentfault.com/a/1190000025137536
防抖与节流 ,优化

屏蔽F12

<script type="text/javascript">
window.onload = function() {
    document.onkeydown = function() {
       var e = window.event || arguments[0];
       //屏蔽F12
       if(e.keyCode == 123) {
           return false;
           //屏蔽Ctrl+Shift+I
       } else if((e.ctrlKey) && (e.shiftKey) && (e.keyCode == 73)) {
           return false;
         //屏蔽Ctrl+Shift+J
       } else if((e.ctrlKey) && (e.shiftKey) && (e.keyCode == 74)) {
           return false;
           //屏蔽Shift+F10
       } else if((e.shiftKey) && (e.keyCode == 121)){
           return false;
       } else if(event.ctrlKey  &&  window.event.keyCode==83 ){
           return false;
       }
   };
   //屏蔽右键单击
   document.oncontextmenu = function() {
       return false;
   }

   //debugger
   var hasDebugger = false;
    var start = new Date();
    try {
    // 新建一个匿名函数,这样 debugger 得不到任何信息
        (function() {}).constructor('debugger')()
        if (new Date() - start > 200) {
            hasDebugger = true;
            window.close(); //关闭当前窗口(防抽)
            window.location="about:blank"; //将当前窗口跳转置空白页
        }
    } catch(e) {
        //alert(hasDebugger)
        window.close(); //关闭当前窗口(防抽)
        window.location="about:blank"; //将当前窗口跳转置空白页
    }
}
</script>

语言排名

排名

总结

EventUtil——跨浏览器的事件对象
JavaScript 的 this 原理
JS前端开发联盟群
javascript学习思维导图(收藏)
[转] js async await 终极异步解决方案

显示多少帧
https://www.testufo.com/

const showFPS = (function () {

// noinspection JSUnresolvedVariable, SpellCheckingInspection
const requestAnimationFrame =

window.requestAnimationFrame || // Chromium window.webkitRequestAnimationFrame || // Webkit window.mozRequestAnimationFrame || // Mozilla Geko window.oRequestAnimationFrame || // Opera Presto window.msRequestAnimationFrame || // IE Trident? function (callback) { // Fallback function window.setTimeout(callback, 1000 / 60); };
let dialog;
let container;
let fps = 0;
let lastTime = Date.now();
function setStyle(el, styles) {

for (const key in styles) { el.style[key] = styles[key]; }
}

function init() {

dialog = document.createElement('dialog'); setStyle(dialog, { display: 'block', border: 'none', backgroundColor: 'rgba(0, 0, 0, 0.6)', margin: 0, padding: '4px', position: 'fixed', top: 0, right: 'auto,', bottom: 'auto', left: 0, color: '#fff', fontSize: '12px', textAlign: 'center', borderRadius: '0 0 4px 0' }); container.appendChild(dialog);
}

function calcFPS() {

let offset = Date.now() - lastTime; fps += 1; if (offset >= 1000) { lastTime += offset; displayFPS(fps); fps = 0; } requestAnimationFrame(calcFPS);
}

function displayFPS(fps) {

const fpsStr = `${fps} FPS`; if (!dialog) { init(); } if (fpsStr !== dialog.textContent) { dialog.textContent = fpsStr; }
}
return function (parent) {

container = parent; calcFPS();
};
}());
showFPS(document.body);



来自 https://www.v2ex.com/t/353778

首先感谢 91yun 的 linhua :
https://www.91yunbbs.com/discussion/comment/1382/#Comment_1382

2 个相关链接:
https://www.netdevconf.org/2.1/session.html?tazaki
https://github.com/lkl/linux

教程从这里开始

先去 VPS 的 Panel 里打开 TUN/TAP 功能

创建一个 tap0

ip tuntap add tap0 mode tap
ip addr add 10.0.0.1/24 dev tap0
ip link set tap0 up

打通 tap0 和 host 之间的网络

iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o venet0 -j MASQUERADE

假设我们准备在 443 端口开启 BBR

iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.2

安装 haproxy ,并禁止开机自启

apt-get install haproxy
update-rc.d haproxy disable

新建一个 /root/haproxy/haproxy.cfg

假设你原来的 server 监听的是 12580 端口, BBR 的端口开在 443 。

defaults
mode tcp
timeout connect 5s
timeout client 60s
timeout server 60s

listen shadowsocks
bind 10.0.0.2:443
server server1 10.0.0.1:12580

下载 Linux Kernel Library ,解压到 /root/haproxy

https://drive.google.com/file/d/0ByqeeKN198fcdDVLMmVKakl5VE0/view?usp=sharing

tar -xzvf liblkl-hijack.so.tgz

是时候开启 haproxy 为 BBR 过桥了,以下命令必须一行打完

LD_PRELOAD=/root/haproxy/liblkl-hijack.so LKL_HIJACK_NET_QDISC="root|fq" LKL_HIJACK_SYSCTL='net.ipv4.tcp_congestion_control="bbr";net.ipv4.tcp_wmem="4096 65536 67108864"' LKL_HIJACK_NET_IFTYPE=tap LKL_HIJACK_NET_IFPARAMS=tap0 LKL_HIJACK_NET_IP=10.0.0.2 LKL_HIJACK_NET_NETMASK_LEN=24 LKL_HIJACK_NET_GATEWAY=10.0.0.1 LKL_HIJACK_OFFLOAD="0x8883" haproxy -f /root/haproxy/haproxy.cfg

大功告成!

现在可以用客户端连上试试看了
12580 是原来 server 的端口
443 是开启 BBR 以后的端口

后记

如果需要把原来 12580 端口的 UDP 协议也转发到 443 端口,可以添加以下命令

iptables -t nat -A PREROUTING -i venet0 -p udp --dport 443 -j REDIRECT --to-port 12580

补充一个安全性的更新,感谢 @BOYPT ,原来的 haproxy 是以 root 用户启动,建议在 haproxy.cfg 文件顶部增加如下内容。
global
user haproxy
group haproxy

顺便再推荐一个个人认为不错的应用场合。
将 nginx 的 80 和 443 端口改为 10080 和 10443 ,让开了 BBR 的 haproxy 监听 80 和 443 端口,配置文件里将这 2 个端口指向 10080 和 10443 。就能让你的网站享受 BBR 带来的加成了。
第 2 条附言 · 71 天前
教程中最后一大行参数中有一个参数格式写错了,正确的格式如下,感谢 @weyou 指出。

LKL_HIJACK_SYSCTL="net.ipv4.tcp_congestion_control=bbr;net.ipv4.tcp_wmem=4096 65536 67108864"
第 3 条附言 · 70 天前

既然你们都喜欢快餐,那我提供一个脚本吧。

手动调试成功后,就可用下面脚本设置开机自启。

安装 supervisor ,添加配置文件,用于开机自启

/etc/supervisor/conf.dhaproxy-lkl.conf

[program:haproxy-lkl]
command=/root/haproxy/haproxy-lkl-start
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/root/haproxy/haproxy-lkl_stdout.log
stdout_logfile_maxbytes=1MB
stderr_logfile=/root/haproxy/haproxy-lkl_stderr.log
stderr_logfile_maxbytes=1MB

haproxy 配 Linux Kernel Library 的启动脚本。

原来的服务监听 12580 端口。开启 BRR 后,新的监听端口在 443 。

/root/haproxy/haproxy-lkl-start

!/bin/sh

ip tuntap add tap0 mode tap
ip addr add 10.0.0.1/24 dev tap0
ip link set tap0 up

iptables -P FORWARD ACCEPT

iptables -t nat -D PREROUTING -i venet0 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.2
iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.2

iptables -t nat -D PREROUTING -i venet0 -p udp --dport 443 -j REDIRECT --to-port 12580
iptables -t nat -A PREROUTING -i venet0 -p udp --dport 443 -j REDIRECT --to-port 12580

export LD_PRELOAD=/root/haproxy/liblkl-hijack.so
export LKL_HIJACK_NET_QDISC="root|fq"
export LKL_HIJACK_SYSCTL="net.ipv4.tcp_congestion_control=bbr;net.ipv4.tcp_wmem=4096 65536 67108864"
export LKL_HIJACK_NET_IFTYPE=tap
export LKL_HIJACK_NET_IFPARAMS=tap0
export LKL_HIJACK_NET_IP=10.0.0.2
export LKL_HIJACK_NET_NETMASK_LEN=24
export LKL_HIJACK_NET_GATEWAY=10.0.0.1
export LKL_HIJACK_OFFLOAD="0x8883"
export LKL_HIJACK_DEBUG=1

haproxy -f /root/haproxy/haproxy.cfg

Enjoy~~~



PHP脚本

<?php
$data=file_get_contents('http://directspace.net/vps_dedicated.htm');
$available=strpos($data,"Available October 28th");
if (!$available) {
        mail ("yourmail@gmail.com", "WoW! DS2$ Available!", "DS2$ Available,GOGO!");
}
?>

<?php
$data=file_get_contents('https://directspace.net/eportal/cart.php?a=add&pid=173');
$available=strpos($data,"Out of Stock");
if (!$available) {
        mail ("yourmail@gmail.com", "WoW! DS2$ Available!", "DS2$ Available,GOGO!");
}
?>

Crontab这样写

*/5 * * * * /usr/local/php/bin/php /home/wwwroot/dsmonitor.php

这就行了,如果crontab不能执行,可能是你的系统不支持*/5这样的写法,那你就0,5,10,15,20.....55这样写
from http://www.hostloc.com/thread-32575-1-1.html

2.from http://www.hostloc.com/forum.php?mod=viewthread&tid=370961&page=2#pid4666780

<?php
    ignore_user_abort();
    set_time_limit(0);
        
    while(true)
    {
        $f = file_get_contents("http:xxxxx");
        $m = md5($f);

        $hash = file_get_contents("hash.txt");
        if($hash!=$m)
        {
            file_put_contents("hash.txt",$m);
            mail("aaa@qq.com","发生变化","内容。。。");       //mail 函数如果使用过多,有些邮箱会让他直接进垃圾邮件或者拒收,本质是调用linux的sendmail 之类发送。
                
        }
            
        echo "执行了一次<br>";
        sleep(60*15);    //休眠15分钟
            
    }