董昊的个人博客 - 教程
type: channel
link: https://www.minws.com/tag/教程/
items: HG6201M的光猫超级管理员获取
items: 一个经典的JS事件监听触发，进程通信例子
items: 在docker上部署mongodb分布式分片副本集群
items: URL Scheme收集大全
items: JS函数节流（throttle）与函数去抖（debounce）
items: JS插件的几种写法
items: Slack之incoming-webhook集成教程
items: 让整个网站变成灰色的做法
items: java试题
items: 基础培训-前端初探

HG6201M的光猫超级管理员获取
type: item
date: 2018-10-11T01:35:00+08:00
description: 1. 用电脑连接你的光猫 确认你可以打开光猫的登录界面 2. 打开网址 http://192.168.1.1/cgi-bin/telnetenable.cgi?telnetenable=1 开启telnet 服务 3. 打开命令行 输入telnet 192.168.1.1 进入 telnet服务 用户名 root 密码 hg2x0 4. 查看这个文件的内容 cat /flash/cfg/agentconf/factory.conf,第一行和第二行 就是用户名和密码了

一个经典的JS事件监听触发，进程通信例子
type: item
date: 2018-02-07T07:32:18+08:00
description: master.jsvar childprocess = require('child_process'); var worker = childprocess.fork('./worker.js'); console.log('pid in master:', process.pid); //监听事件 worker.on('message', function(msg) { console.log('1:', msg); }) process.on('message', function(msg) { console.log('2:', msg); }) worker.send('---'); //触发事件 message process.emit('message', '------'); worker.jsconsole.log('pid in worker:', process.pid); process.on('message', function(msg) { console.log('3:', msg); }); process.send('==='); process.emit('message', '======'); result:$ node master.js pid in master: 22229 // 主进程创建后打印其 pid 2: ------ // 主进程收到给自己发的消息 pid in worker: 22230 // 子进程创建后打印其 pid 3: ====== // 子进程收到给自己发的消息 1: === // 主进程收到来自子进程的消息 3: --- // 子进程收到来自主进程的消息

在docker上部署mongodb分布式分片副本集群
type: item
date: 2017-12-26T15:01:00+08:00
description: 使用 Sharded cluster 时，通常是要解决如下2个问题 存储容量受单机限制，即磁盘资源遭遇瓶颈。 读写能力受单机限制（读能力也可以在复制集里加 secondary 节点来扩展），可能是 CPU、内存或者网卡等资源遭遇瓶颈，导致读写能力无法扩展。 Sharded模式图创建3个配置服务（configsvr）docker run -d -p 40001:40001 --privileged=true -v cnf40001:/data/db --name cnf_c1 mongo:latest --configsvr --port 40001 --dbpath /data/db --replSet crsdocker run -d -p 40002:40002 --privileged=true -v cnf40002:/data/db --name cnf_c2 mongo:latest --configsvr --port 40002 --dbpath /data/db --replSet crsdocker run -d -p 40003:40003 --privileged=true -v cnf40003:/data/db --name cnf_c3 mongo:latest --configsvr --port 40003 --dbpath /data/db --replSet crs任意选择crs分片的一个副本mongo --port 40001切换数据库use admin写配置文件config = {_id:"crs", configsvr:true, members:[ {_id:0,host:"192.168.31.82:40001"}, {_id:1,host:"192.168.31.82:40002"}, {_id:2,host:"192.168.31.82:40003"} ] }初始化副本集配置rs.initiate(config)如果已经初始化过，使用下面的强制配置rs.reconfig(config,{force:true})查看副本集状态rs.status()创建2个分片服务（shardsvr），每个shardsvr包含3个副本，其中1个主节点，1个从节点，1个仲裁节点。docker run -d -p 20001:20001 --privileged=true -v db20001:/data/db --name rs1_c1 mongo:latest --shardsvr --port 20001 --dbpath /data/db --replSet rs1docker run -d -p 20002:20002 --privileged=true -v db20002:/data/db --name rs1_c2 mongo:latest --shardsvr --port 20002 --dbpath /data/db --replSet rs1docker run -d -p 20003:20003 --privileged=true -v db20003:/data/db --name rs1_c3 mongo:latest --shardsvr --port 20003 --dbpath /data/db --replSet rs1任意选择rs1分片的一个副本mongo --port 20001切换数据库use admin写配置文件config = {_id:"rs1",members:[ {_id:0,host:"192.168.31.82:20001"}, {_id:1,host:"192.168.31.82:20002"}, {_id:2,host:"192.168.31.82:20003",arbiterOnly:true} ] }初始化副本集配置rs.initiate(config)如果已经初始化过，使用下面的强制配置rs.reconfig(config,{force:true})查看副本集状态rs.status()结果rs1:RECOVERING> rs.status() { "set" : "rs1", "date" : ISODate("2016-12-20T09:01:16.108Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "members" : [ { "_id" : 0, "name" : "192.168.31.82:20001", "health" : 1, "state" : 1, "stateStr" : "P…

URL Scheme收集大全
type: item
date: 2017-12-05T06:56:55+08:00
description: 支付宝 扫码 alipayqr://platformapi/startapp?saId=10000007 付款码 alipayqr://platformapi/startapp?saId=20000056 微信 扫码 weixin://dl/scan

JS函数节流（throttle）与函数去抖（debounce）
type: item
date: 2017-11-15T05:59:04+08:00
description: 在浏览器中，往往由于事件频繁被触发，因而频繁执行DOM操作、资源加载等重行为，导致UI停顿甚至浏览器崩溃。相关事件如 resize , scroll , mousemove 等。在实际场景中，需求大多为停止改变大小n毫秒后执行后续处理或者是以一定的频率执行后续处理。针对这两种需求就出现了 debounce 和 throttle 两种解决办法。throttle 节流如果将水龙头拧紧直到水是以水滴的形式流出，那你会发现每隔一段时间，就会有一滴水流出。也就是会说预先设定一个执行周期，当调用动作的时刻大于等于执行周期则执行该动作，然后进入下一个新周期。实现代码function(func, wait, options) { var timeout, context, args, result; var previous = 0; if (!options) options = {}; var later = function() { previous = options.leading === false ? 0 : new Date().getTime(); timeout = null; result = func.apply(context, args); if (!timeout) context = args = null; }; var throttled = function() { var now = new Date().getTime(); if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0 || remaining > wait) { if (timeout) { clearTimeout(timeout); timeout = null; } previous = now; result = func.apply(context, args); if (!timeout) context = args = null; } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; throttled.cancel = function() { clearTimeout(timeout); previous = 0; timeout = context = args = null; }; return throttled; } 使用代码tag.onmousemoveApplet = app.throttle(function() { console.log('1s内响应一次！'); }, 1000); debounce 去抖如果用手指一直按住一个弹簧，它将不会弹起直到你松手为止。也就是说当调用动作n毫秒后，才会执行该动作，若在这n毫秒内又调用此动作则将重新计算执行时间。实现代码function(func, wait, immediate) { var timeout, result; var later = function(context, args) { timeout = null; if (args) result = func.apply(context, args); }; var debounced = restArgs(function(args) { if (timeout) clearTimeout(timeout); if (immediate) { var callNow = !timeout; timeout = setTimeout(later, wait); if (callNow) result = func.apply(this, args); } else { timeout = _.delay(later, wait, this, args); } return result; }); debounced.cancel = function() { clearTimeout(timeout); timeout = null; }; return debounced; } 使用代码tag.onmousemoveApplet = app.throttle(function() { console.log('停下1s后响应一次！'); }, 1000);

JS插件的几种写法
type: item
date: 2017-10-23T05:28:18+08:00
description: 做JS插件非常考验自己对代码封装以及整体控制和编程思想的理解，下面我们看下JS插件的几种通用写法面向对象思想，类方式//自定义类 function plugin(){} //提供默认参数 plugin.prototype.str = "default param"; //提供方法(如果不传参,则使用默认参数) plugin.prototype.firstFunc = function(str = this.str){ alert(str); } //创建"对象" var p = new plugin(); //调用方法 p.firstFunc("Hello ! I am firstFunc");//Hello ! I am firstFunc p.firstFunc();//default param 闭包方式var plugin =(function(){ function _firstFunc(str){ alert(str); }; return{ firstFunc: _firstFunc, }; })(); 闭包方式2(function(){ //定义一些默认参数 var _options={ default_word:"default hello" } //定义一些api var _plugin_api = { function _config(opts) { if (!opts) return options; for (var key in opts) { options[key] = opts[key]; } return this; }, firstFunc:function(str = _options.default_word){ alert(str); return this;//返回当前方法 }, secondFunc:function(){ alert("secondFunc"); return this;//返回当前方法 } } //这里确定了插件的名称 this.CJPlugin = _plugin_api; })(); CJPlugin.firstFunc("hello");//hello CJPlugin.firstFunc();//default hello CJPlugin.secondFunc();//secondFunc 模块化; !function (factory) { "use strict"; if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') { var target = module['exports'] || exports; factory(target); } else if (typeof define === 'function' && define['amd']) { define(['exports'], factory); } else { factory(window['myjssdk'] = {}); } }(function (HExports) { var exports = typeof HExports !== 'undefined' ? HExports : {}; exports.v = "2.0.0 alpha"; // 基础方法 exports.timeDifference = function (tmpTime) { var mm = 1000; var minute = mm * 60; var hour = minute * 60; var day = hour * 24; var month = day * 30; var ansTimeDifference = 0; var tmpTimeStamp = tmpTime ? Date.parse(tmpTime.replace(/-/gi, "/")) : new Date().getTime(); var nowTime = new Date().getTime(); var tmpTimeDifference = nowTime - tmpTimeStamp; if (tmpTimeDifference < 0) { console.warn("开始日期大于结束日期，计算失败！"); return 0; } var DifferebceMonth = tmpTimeDifference / month; var DifferebceWeek = tmpTimeDifference / (7 * day); var Differebce…

Slack之incoming-webhook集成教程
type: item
date: 2017-08-16T07:32:20+08:00
description: Incoming Webhooks 是发送一段消息到Slack组的简单方式，它是通过HTTP发送携带特定json数据的post请求到slack服务器来实现的。 Incoming Webhooks 可用于服务器异常通知，定时任务执行通知等等应用场景。 效果演示集成方法 1.组创建人访问如下链接 https://my.slack.com/services/new/incoming-webhook/ 2.选择对应的channel或者人，点击 Add Incoming WebHooks integration 3.然后设置好自定义的一些配置 4.最后 Save Settings 即可

让整个网站变成灰色的做法
type: item
date: 2017-07-11T03:34:04+08:00
description: 方法一，html {-webkit-filter: grayscale(100%);filter:progid:DXImageTransform.Microsoft.BasicImage(graysale=1);} 方法二，html { filter:progidXImageTransform.Microsoft.BasicImage(grayscale=1); } 使用方法：这段代码可以变网页为黑白，将代码加到CSS最顶端就可以实现素装。 如果网站没有使用CSS，可以在网页/模板的HTML代码和 之间插入： 有一些站长的网站可能使用这个css 不能生效，是因为网站没有使用最新的网页标准协议 请将网页最头部的替换为以上代码。有一些网站FLASH动画的颜色不能被CSS滤镜控制，可以在FLASH代码的 和之间插入：最简单的把页面变成灰色的代码是在head 之间加 html { FILTER: gray } 方法三， html{ filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: url("data:image/svg+xml;utf8,#grayscale"); filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); -webkit-filter: grayscale(1);}

java试题
type: item
date: 2017-07-10T08:06:54+08:00
description: 一、判断题： String是最基本的数据类型。 new String(“abc”).equals(newString(“abc”)的结果为true。 new StringBuffer(“abc”).equals(newStringBuffer(“abc”)的结果为true。 接口可继承接口。 抽象类不可以实现(implements)接口。 抽象类可继承具体类(concrete class)。 抽象类中可以有静态的main方法。 抽象类不能创建实例对象和允许有abstract方法。 二、选择题：1.下列那些是正确的JAVA字符串？多选（） A. """" B. "Oxzabc" C. """ D. "\t\t\r\n" E. "boolean"52.欲构造ArrayList类的一个实例，此类继承了List接口，下列哪个方法是正确的 ？ A、 ArrayList myList=new Object(); B、 List myList=new ArrayList(); C、 ArrayList myList=new List(); D、 List myList=new List();3.下列关于Java知识点哪些说法是正确的？（） A. 局部内部类不能访问外部类的变量和方法 B. 内部类可以嵌套使用 C. 成员内部类不能定义静态内部类 D. 内部类不可以继承类三、程序题：1,将输入的数组数字从小到达进行排序并且去掉重复数据，如数组 [3,3,4,5,1,4] 排序和去重后为[1,3,4,5]。请写出代码实现:2,给定一个int 数组，求出所有元素的最大值，最小值，平均值，和值，并输出出来。3,打印:package com.acxiom.java.base; public class Exam1 { int id; Integer age; public static void main(String[] args) { Exam1 exam = new Exam1(); System.out.println(exam.id); System.out.println(exam.age); Integer a = new Integer(1); Integer b = 1; int c = 1; Integer d = 1; System.out.println("a == b ? " + (a == b)); System.out.println("a equals b ? " + (a.equals(b))); System.out.println("a == c ? " + (a == c)); System.out.println("c == b ? " + (c == b)); System.out.println("d == b ? " + (d == b)); Integer dd = 200; Integer ee = 200; System.out.println("dd == ee ? " + (dd == ee)); Integer ff = 3 + new Integer(3); Integer gg = new Integer(6); Integer hh = 6; System.out.println("ff == gg ? " + (ff == gg)); System.out.println("ff == hh ? " + (ff == hh)); } } 4,打印:package com.acxiom.java.base; public class Exam3 { static class A { public void show(C obj) { print("A + C"); } public void show(A obj) { print("A + A"); } } static class B extends A { public void show(B obj) { print("B + B"); } public void show(A obj) { print("B + A"); } } static class C extends B {} static class D extends B { } public static void main(String[] args) { A a = new A(); B b = new B(); C c = new C(); a.show(a); a.show(c); b.show(a); b.show(b); b.show(c); c.show(a); c.show(b); A a2 = new B(); a2.show(a); a2.sho…

基础培训-前端初探
type: item
date: 2017-07-06T16:20:19+08:00
description: 前端最最基本的三个核心技能：HTML、JS、CSS,其中最能代表前端的就是Javascript了。 概念前端开发入门学习有：HTML、CSS、JavaScript（简称JS）这三个部分。所以在学习之前我们需要先明确三个概念： HTML——内容层，它的作用是表示一个HTML标签在页面里是个什么角色。 CSS——样式层，它的作用是表示一块内容以什么样的样式（字体、大小、颜色、宽高等）显示。 JS——行为层，它的作用是当用户触发某些行为时，会给内容和样式带来什么样的改变。 学习路线图API快速查找工具http://devdocs.io/ 盒模型盒子模型是css中一个重要的概念，理解了盒子模型才能更好的排版。其实盒子模型有两种，分别是 ie 盒子模型和标准 w3c 盒子模型。Jquery模糊选择器1. name前缀为aa的所有div的jquery对象 $("div[name^='aa']"); 2. name后缀为aa的所有div的jquery对象 $("div[name$='aa']"); 3. name中包含aa的所有div的jquery对象 $("div[id*='aa']"); 4. input标签类型是text，name="aa"的对象 $("input:text[name='aa']") 以上返回的都是jquery的集合对象，因此都可以用each方法进行遍历。Ajax$.ajax({ type: 'GET', // 这是请求的方式 可以是GET方式也可以是POST方式, 默认是GET url: ' xxx.php ', // 这是请求的连接地址 一般情况下这个地址是后台给前端的一个连接，直接写就可以 dataType: 'json', // 这是后台返回的数据类型 一般情况下都是一个json数据， 前端遍历一下就OK async: true, // 默认为true，默认为true时，所有请求均为异步请求，如果需要发送同步请求，需设置为false, timeout: 8000, // 设置请求超时时间（毫秒）。此设置将覆盖全局设置 data: { // 要传递的参数 'xxx' : 'xxx' }, beforeSend: function () { // 在发送请求前就开始执行 （一般用来显示loading图） }， success: function (data) { // 发送请求成功后开始执行，data是请求成功后，返回的数据 }, complete: function () { //当请求完成后开始执行，无论成功或是失败都会执行 （一般用来隐藏loading图） }， error: function (xhr, textStatus, errorThrown) { // 请求失败后就开始执行，请求超时后，在这里执行请求超时后要执行的函数 } }).done(function () { // 这个函数是在ajax数据加载完之后，对数据进行的判断，在涉及到对ajax数据进行操作无效时，在这个函数里面写是可以起到效果的 });