首页
好物推荐
薅羊毛领红包
好看壁纸
更多
隐私政策
友情链接
时光机
搜索
1
使用 docker 快速安装 Home Assistant
6,125 阅读
2
Ipad mini2 降级到IOS10.3.3系统
4,120 阅读
3
Home Assistant集成OpenWrt
3,553 阅读
4
华为手机开启ADB进行WIFI远程调试
3,487 阅读
5
小米电视开机广告和乐播投屏广告Hosts屏蔽列表
3,291 阅读
无分类
智能家居
心得随想
文档教程
登录
Search
标签搜索
Linux
JS
教程
CSS
HTML
配置
NodeJS
Docker
解决方案
文档
Git
Java
技术培训
Hadoop
Mac
Windows
RiotJS
Python
VPS
Home Assistant
DONG HAO
累计撰写
154
篇文章
累计收到
59
条评论
首页
栏目
无分类
智能家居
心得随想
文档教程
页面
好物推荐
薅羊毛领红包
好看壁纸
隐私政策
友情链接
时光机
搜索到
31
篇与
教程
的结果
2018-10-11
HG6201M的光猫超级管理员获取
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,第一行和第二行 就是用户名和密码了
2018年10月11日
1,862 阅读
1 评论
1 点赞
2018-02-07
一个经典的JS事件监听触发,进程通信例子
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: --- // 子进程收到来自主进程的消息
2018年02月07日
145 阅读
0 评论
0 点赞
2017-12-26
在docker上部署mongodb分布式分片副本集群
使用 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" : "PRIMARY", "uptime" : 7799, "optime" : { "ts" : Timestamp(1482224415, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2016-12-20T09:00:15Z"), "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1482224414, 1), "electionDate" : ISODate("2016-12-20T09:00:14Z"), "configVersion" : 1, "self" : true }, { "_id" : 1, "name" : "192.168.31.82:20002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 71, "optime" : { "ts" : Timestamp(1482224415, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2016-12-20T09:00:15Z"), "lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"), "lastHeartbeatRecv" : ISODate("2016-12-20T09:01:15.376Z"), "pingMs" : NumberLong(1), "syncingTo" : "192.168.30.200:20001", "configVersion" : 1 }, { "_id" : 2, "name" : "192.168.31.82:20003", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 71, "lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"), "lastHeartbeatRecv" : ISODate("2016-12-20T09:01:11.334Z"), "pingMs" : NumberLong(0), "configVersion" : 1 } ], "ok" : 1 } 创建2个分片服务(shardsvr),每个shardsvr包含3个副本,其中1个主节点,1个从节点,1个仲裁节点。docker run -d -p 30001:30001 --privileged=true -v db30001:/data/db --name rs2_c1 mongo:latest --shardsvr --port 30001 --dbpath /data/db --replSet rs2docker run -d -p 30002:30002 --privileged=true -v db30002:/data/db --name rs2_c2 mongo:latest --shardsvr --port 30002 --dbpath /data/db --replSet rs2docker run -d -p 30003:30003 --privileged=true -v db30003:/data/db --name rs2_c3 mongo:latest --shardsvr --port 30003 --dbpath /data/db --replSet rs2任意选择rs2分片的一个副本mongo --port 30001切换数据库use admin写配置文件config = {_id:"rs2",members:[ {_id:0,host:"192.168.31.82:30001"}, {_id:1,host:"192.168.31.82:30002"}, {_id:2,host:"192.168.31.82:30003",arbiterOnly:true} ] }初始化副本集配置rs.initiate(config)如果已经初始化过,使用下面的强制配置rs.reconfig(config,{force:true})查看副本集状态rs.status()创建2个路由服务(mongos)docker run -d -p 50001:50001 --privileged=true --name ctr50001 mongo:latest mongos --configdb crs/192.168.31.82:40001,192.168.31.82:40002,192.168.31.82:40003 --port 50001 --bind_ip 0.0.0.0docker run -d -p 50002:50002 --privileged=true --name ctr50002 mongo:latest mongos --configdb crs/192.168.31.82:40001,192.168.31.82:40002,192.168.31.82:40003 --port 50002 --bind_ip 0.0.0.0通过mongos添加分片关系到configsvr。选择路由服务mongo --port 50001切换数据库use admin添加sharddb.runCommand({addshard:"rs1/192.168.31.82:20001,192.168.31.82:20002,192.168.31.82:20003"})db.runCommand({addshard:"rs2/192.168.31.82:30001,192.168.31.82:30002,192.168.31.82:30003"})查询结果 [仲裁节点不显示]db.runCommand({listshards:1}){ "shards" : [ { "_id" : "rs1", "host" : "rs1/192.168.31.82:20001,192.168.31.82:20002" }, { "_id" : "rs2", "host" : "rs2/192.168.31.82:30001,192.168.31.82:30002" } ], "ok" : 1 } 测试示例设置数据库、集合分片 [说明:并不是数据库中所有集合都分片,只有设置了shardcollection才分片,因为不是所有的集合都需要分片。]db.runCommand({enablesharding:"mydb"}) db.runCommand({shardcollection:"mydb.person", key:{id:1, company:1}})测试分片use mydb for (i =0; i<10000;i++){ db.person.save({id:i, company:"baidu"})}测试结果db.person.stats()
2017年12月26日
612 阅读
0 评论
0 点赞
2017-12-05
URL Scheme收集大全
支付宝 扫码 alipayqr://platformapi/startapp?saId=10000007 付款码 alipayqr://platformapi/startapp?saId=20000056 微信 扫码 weixin://dl/scan
2017年12月05日
108 阅读
0 评论
0 点赞
2017-11-15
JS函数节流(throttle)与函数去抖(debounce)
在浏览器中,往往由于事件频繁被触发,因而频繁执行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);
2017年11月15日
136 阅读
0 评论
0 点赞
2017-10-23
JS插件的几种写法
做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 DifferebceDay = tmpTimeDifference / day; var DifferebceHour = tmpTimeDifference / hour; var DifferebceMinute = tmpTimeDifference / minute; if (DifferebceMonth >= 1) { return tmpTime; } else if (DifferebceWeek >= 1) { ansTimeDifference = parseInt(DifferebceWeek) + "个星期前"; } else if (DifferebceDay >= 1) { ansTimeDifference = parseInt(DifferebceDay) + "天前"; } else if (DifferebceHour >= 1) { ansTimeDifference = parseInt(DifferebceHour) + "个小时前"; } else if (DifferebceMinute >= 1) { ansTimeDifference = parseInt(DifferebceMinute) + "分钟前"; } else { ansTimeDifference = "刚刚"; } return ansTimeDifference; }; });
2017年10月23日
307 阅读
0 评论
0 点赞
2017-08-16
Slack之incoming-webhook集成教程
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 即可
2017年08月16日
780 阅读
0 评论
0 点赞
2017-07-11
让整个网站变成灰色的做法
方法一,html {-webkit-filter: grayscale(100%);filter:progid:DXImageTransform.Microsoft.BasicImage(graysale=1);} <!-- 可以是整个网站变成灰色的 --> 方法二,html { filter:progidXImageTransform.Microsoft.BasicImage(grayscale=1); } 使用方法:这段代码可以变网页为黑白,将代码加到CSS最顶端就可以实现素装。 如果网站没有使用CSS,可以在网页/模板的HTML代码和 之间插入:<style> html{filter:progidXImageTransform.Microsoft.BasicImage(grayscale=1);} </style> 有一些站长的网站可能使用这个css 不能生效,是因为网站没有使用最新的网页标准协议<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> 请将网页最头部的替换为以上代码。有一些网站FLASH动画的颜色不能被CSS滤镜控制,可以在FLASH代码的<object …>和之间插入:最简单的把页面变成灰色的代码是在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);}
2017年07月11日
67 阅读
0 评论
0 点赞
2017-07-10
java试题
一、判断题: 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.show(b); D d = new D(); b.show(d); } static int i = 1; public static void print(String msg) { System.out.println(i + " = " + msg); i++; } }
2017年07月10日
83 阅读
0 评论
0 点赞
2017-07-06
基础培训-前端初探
前端最最基本的三个核心技能: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数据进行操作无效时,在这个函数里面写是可以起到效果的 });
2017年07月06日
70 阅读
0 评论
0 点赞
2017-07-05
基础培训-餐评系统开发
这次的java基础培训我们将学到一个午餐点评网站完整的开发,这里会学到Spring Boot+Mybatis+freemarker+swagger+druid等技术,希望本次培训对大家有所帮助。脚手架代码码云 http://git.oschina.net/dhso/springboot-startkit [点击访问]Spring Boot介绍Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot 官方文档 [点击访问]Mybatis介绍MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。Mybatis 官方文档 [点击访问]FreeMarker模板引擎FreeMarker 官方文档 [点击访问]Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为Java程序员提供的一个开发包,或者说是一个类库,它不是面向最终用户的,而是为程序员提供了一款可以嵌入他们开发产品的应用程序。虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)##FreeMarker特性 1. 通用目标 能够生成各种文本:HTML、XML、RTF、Java源代码等等 易于嵌入到你的产品中:轻量级;不需要Servlet环境 插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等 你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器 2. 强大的模板语言 所有常用的指令:include、if/elseif/else、循环结构 在模板中创建和改变变量 几乎在任何地方都可以使用复杂表达式来指定值 命名的宏,可以具有位置参数和嵌套内容 名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突 输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换 3. 通用数据模型 FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示 你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰 4. 为Web准备 在模板语言中内建处理典型Web相关任务(如HTML转义)的结构 能够集成到Model2 Web应用框架中作为JSP的替代 支持JSP标记库 为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员 5. 智能的国际化和本地化 字符集智能化(内部使用UNICODE) 数字格式本地化敏感 日期和时间格式本地化敏感 非US字符集可以用作标识(如变量名) 多种不同语言的相同模板 6. 强大的XML处理能力 <#recurse> 和<#visit>指令(2.3版本)用于递归遍历XML树 在模板中清楚和直接的访问XML对象模型 SwaggerSwagger 官方网站 [点击访问]Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。Swagger 的总体目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。本项目脚手架已经集成了swagger,可访问路径http://127.0.0.1:8080/swagger-ui.html 查看DruidDruid Wiki文档Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池。 SQLParser sql解析处理 Druid可以做什么? 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。 SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。 本项目脚手架集成了druid,可访问http://127.0.0.1:8080/druid/login.html 查看。
2017年07月05日
177 阅读
0 评论
0 点赞
2017-07-05
基础培训-项目的正确打开方式
在我们拿到Git代码后,应该怎么去正确使用呢?这篇文章就是讲如何导入一个maven项目。将代码下载到workspace我们将Git项目在sourcetree里面的本地路径改成eclipse的workspace路径,补上项目名称比如叫做projectOne,然后执行克隆,将代码下载到eclipse的workspace中。将代码导入到eclipse中在eclipse左侧Project Explorer里右击空白处,选择菜单import...然后在import向导里面选择maven > Exisiting Maven Project选择browse...,选择将要导入的项目文件夹,然后就能看到pom文件信息。点击Finish完成。然后就可以看到底下的进度条,等待项目导入成功。maven项目的初始化拿到maven项目,我们先要确保项目的jdk版本是否正确。选择Build Path > Configure Build Path然后检查下jdk版本是否正确如果没有看到正常的项目结构。我们可以使用 Update Project 功能。在项目的根目录上右击选择 maven > Update Project 等待maven build完成。然后我们使用Maven clean ,Maven install来初始化项目。在项目的根目录上右击选择 Run as > Maven clean && Maven install然后等待maven依赖下载完成。ok,项目就可以运行了。
2017年07月05日
83 阅读
0 评论
0 点赞
2017-07-05
Css display & background-
how to make a circle for a element by css.1. see code:.user { display: inline-block; width: 150px; height: 150px; border-radius: 50%; background-repeat: no-repeat; background-position: center center; background-size: cover; } 2. description:2.1. display: inline-block; CSS 定位属性(Positioning)inline 默认。此元素会被显示为内联元素,元素前后没有换行符。 inline-block 行内块元素。(CSS2.1 新增的值)会换行2.2. border-radius: 50%; CSS 边框属性(Border 和 Outline)border-radius 属性是一个简写属性,用于设置四个 border-*-radius 属性. 提示: 该属性允许您为元素添加圆角边框! 语法: border-radius: 1-4 length|% / 1-4 length|%; length: 定义圆角的形状。 % : 以百分比定义圆角的形状。test it: css_border-radiusexample: border-radius:2em; 等价于border-top-left-radius:2em; border-top-right-radius:2em; border-bottom-right-radius:2em; border-bottom-left-radius:2em; see details: border-radius2.3. background-repeat: no-repeat; CSS 背景属性(Background) 定义和用法: background-repeat 属性设置是否及如何重复背景图像。 默认地,背景图像在水平和垂直方向上重复 详细说明: background-repeat 属性定义了图像的平铺模式 从原图像开始重复,原图像由 background-image 定义,并根据 background-position 的值放置。 提示和注释 提示:背景图像的位置是根据 background-position 属性设置的。如果未规定 background-position 属性,图像会被放置在元素的左上角。 可能的值 2.4. background-position: center center; CSS 背景属性(Background) 定义和用法 background-position 属性设置背景图像的起始位置。 这个属性设置背景原图像(由 background-image 定义)的位置,背景图像如果要重复,将从这一点开始。 提示:您需要把 background-attachment 属性设置为 "fixed",才能保证该属性在 Firefox 和 Opera 中正常工作。 { background-image:url('/i/eg_bg_03.gif'); background-repeat:no-repeat; background-attachment:fixed; background-position:center; } 可能的值 2.5. background-size: cover; CSS 背景属性(Background)background-size 属性规定背景图像的尺寸。 cover: 把背景图像扩展至足够大,以使背景图像完全覆盖背景区域。 背景图像的某些部分也许无法显示在背景定位区域中.see details : background-size
2017年07月05日
173 阅读
0 评论
0 点赞
2017-07-04
基础培训-使用git及可视化工具sourcetree
Git Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。 Git 与 SVN 区别GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。 如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。Git 与 SVN 区别点: 1、GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。 2、GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。 3、GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。 4、GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。 5、GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。 Git一些名词解释克隆(clone):从远程仓库URL加载创建一个与远程仓库一样的本地仓库 提交(commit):将暂存文件上传到本地仓库(我们在Finder中对本地仓库做修改后一般都得先提交一次,再推送) 检出(checkout):切换不同分支 添加(add):添加文件到缓存区 移除(remove):移除文件至缓存区 暂存(git stash):保存工作现场 重置(reset):回到最近添加(add)/提交(commit)状态 合并(merge):将多个同名文件合并为一个文件,该文件包含多个同名文件的所有内容,相同内容抵消 抓取(fetch):从远程仓库获取信息并同步至本地仓库 拉取(pull):从远程仓库获取信息并同步至本地仓库,并且自动执行合并(merge)操作,即 pull=fetch+merge 推送(push):将本地仓库同步至远程仓库,一般推送(push)前先拉取(pull)一次,确保一致 分支(branch):创建/修改/删除分枝 标签(tag):给项目增添标签 工作流(Git Flow):团队工作时,每个人创建属于自己的分支(branch),确定无误后提交到master分支 终端(terminal):可以输入git命令行 Git简明指南[链接]http://www.runoob.com/manual/git-guide/Git 完整命令手册 SourceTreeSourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作。同时它也是Mercurial和Subversion版本控制系统工具。支持创建、提交、clone、push、pull 和merge等操作。SourceTree下载[[官网链接]https://www.sourcetreeapp.com/](https://www.sourcetreeapp.com/)SourceTree实践登陆github,在欢迎页点击“+ New repository“创建我们的仓库或点击右上角的“+”,然后再New repository亦可 按照个人需要填写仓库名、仓库描述等,建议勾选“Initialize this repository with a README”,填写完成后点击Create repository 至此,我们的仓库已经创建成功。创建成功后,我们在页面的右下角找到链接,点击复制 打开我们的SourceTree,点击:“+新仓库”,选择:“从URL克隆” 粘贴我们的仓库链接至源URL,SourceTree会自动帮我们生成目标路径(本地仓库路径)以及名称,点击克隆 克隆成功后,SourceTree会为我们自动打开我们刚才克隆的仓库,选择master选项,这里我们可以看到我们仓库里的所有文件 接下来我们想要上传一个项目至我们的远程Github仓库内。我们点击右上角“在Finder/在文件夹”中显示。然后SourceTree会帮我们打开我们的本地仓库,我们将需要上传的项目复制到本地的文件夹内,然后关闭文件夹,回到主页面。我们会发现工作副本出现了更改提示 我们点击工作副本,然后我们发现我们刚才上传的文件都在未暂存文件当中,此时,我们勾选“未暂存文件” 发现我们的文件变成了已暂存文件。此时,我们可以输入更新信息,然后,点击提交按钮 我们切换回master分支,会发现master分支以及推送(Push)按钮,都出现了更改提示。这表示SourceTree已经将我们刚才添加的文件成功提交到本地仓库,而本地仓库的内容则比远程仓库超前了一个版本。我们这个时候点击推送(Push)即可将本地仓库的内容同步至远程仓库。 点击推送(push),等待完成后,我们刚才本地仓库的文件已经成功推送到远程仓库
2017年07月04日
195 阅读
0 评论
0 点赞
2017-06-29
搬瓦工VPS购买教程
搬瓦工VPS,一款性价比极高的便宜VPS主机方案,有提供洛杉矶QNET、洛杉矶MACOM、纽约、凤凰城、佛罗里达、荷兰、弗里蒙特数据中心便宜年付OpenVZ VPS方案,开放功能比较全。适合我们基础建站、搭建环境以及各种折腾应用,而且支持支付宝购买续费。 搬瓦工官方网站 https://bandwagonhost.com/aff.php?aff=16054 注册 点击上面的链接, 选择右上角的 Register 进行注册操作。 这样的话我们以后登录就可以看到自己的机器列表。 用户管理 选择右上角的 Client Area 进入用户管理界面,如果没有登录,输入 用户名(注册邮箱)和 密码 进行登录。 服务器购买 点击VPS Hosting ,可以看到服务器列表 如果仅仅用来翻墙或者玩玩,可以购买最小化配置(最便宜,人民币120左右),建议kvm的机器。 我们然后会看到上图所示的界面,根据图示我们需要确定选择的方案以及时间,默认是洛杉矶机房,我们也可以选择其他的几个机房之一,点击ADD TO CART添加购物车。 在promotional code里面还可以输入优惠码来获得折扣,优惠码如下 服务器优惠码(可能会失效,逐个尝试) 优惠码 折扣 BWH1ZBPVK(6%) BWH1XZOBK(5.5%) BWH1NJJHL(4.5%) BWH1GFWZP(3.5%) BWH1FOXXE(3%) 输入后点击validate code,优惠码可用的话就可以看到折扣后价格。 核对我们选择方案的价格,没有问题后点击CHECKOUT结账。 然后我们就可以愉快的使用支付宝支付了。 [rihide] 客户端软件 Windows: shadowsocks-win Mac:ShadowsocksX-NG 或者命令行安装 pip install shadowsocks brew install shadowsocks-libev cpan Net::Shadowsocks Linux: Shadowsocks-Qt5 或者命令行安装 pip install shadowsocks apt-get install shadowsocks-libev cpan Net::Shadowsocks Android: shadowsocks-android iOS: Wingy OpenWRT: [shadowsocks-libev](opkg install shadowsocks-libev) SS配置 参照 https://teddysun.com/357.html [/rihide]
2017年06月29日
343 阅读
0 评论
0 点赞
2017-06-23
如何在windows下升级node & npm
upgrade nodenode有一个模块叫n,是专门用来管理node.js的版本的。 第一步:安装n模块: npm install -g n第二步: 升级node.js到最新稳定版 n stableBut,这在我的windows环境下报错: Google了一圈: (敲黑板!!)As stated in the readme file of that module, the module does not support Windows, hence the error you are getting. If you would like to update Node.js on Windows you can find binaries at https://nodejs.org/en/download/current/.于是乖乖去nodejs网站上下载.msi并安装,command line下成功,顺带着npm也一并更新了:
2017年06月23日
345 阅读
0 评论
0 点赞
2017-06-21
CSS 3- &:nth-child(n)
:nth-child(n) 选择器匹配属于其父元素的第 N 个子元素,不论元素的类型。n 可以是数字、关键词或公式.举个例子: 在样式为audience-icon-controls下中子节点,第一个子节点right:81px, 第二个子节点right:54pxcode example: .audience-icon-controls { .span { position: absolute; &:nth-child(1) { right: 81px; } &:nth-child(2) { right: 54px; } &:nth-child(3) { right: 27px; } &:nth-child(4) { right: 0; } } } 1 Odd 和 even 是可用于匹配下标是奇数或偶数的子元素的关键词(第一个子元素的下标是 1)在这里,我们为奇数和偶数 p 元素指定两种不同的背景色:p:nth-child(odd) { background:#ff0000; } p:nth-child(even) { background:#0000ff; } 2 使用公式 (an + b)。描述:表示周期的长度,n 是计数器(从 0 开始),b 是偏移值。在这里,我们指定了下标是 3 的倍数的所有 p 元素的背景色: 但是,这里有一个缺点:如果子节点顺序颠倒的话,那么对应的样式生效则失败,所以建议还是以子节点中的class的方式渲染其style.p:nth-child(3n+0) { background:#ff0000; }
2017年06月21日
119 阅读
0 评论
0 点赞
2017-06-19
CSS3 Properties
CSS3 word-wrap PropertyProperty ValuesValue : Description normal : Break words only at allowed break points break-word : Allows unbreakable words to be broken initial : Sets this property to its default value. Read about initial inherit : Inherits this property from its parent element. Read about inherit 1. break-word Allow long words to be able to break and wrap onto the next line: p.test { word-wrap: break-word; } 2. normal Only break words at allowed break points. p.test { word-wrap: normal; }
2017年06月19日
72 阅读
0 评论
0 点赞
2017-06-09
ghost使用pm2管理启动
以前运行ghost使用forever管理启动,但是现在发现pm2管理nodejs程序更好,遂尝试改造代码如下pm2.json{ "apps": [{ "name": "ghost", "script": "index.js", "cwd": "/data/wwwroot/blog.minws.com", "exec_mode": "cluster", "instances": 0, "max_memory_restart": "256M", "autorestart": true, "node_args": [], "args": [], "env": { "NODE_ENV": "production" } }] } 启动pm2 start pm2.json<br/>
2017年06月09日
253 阅读
0 评论
0 点赞
2017-06-08
Angluarsjs 2 学习笔记一
(转)# *** 初识Angular 2**1. 引入Angular2预定义类型import {Component, View, bootstrap} from “angular2/angular2”; import 是ES6的关键字,用来从模块中引入类型定义。Here, We will 引入三个类型from angular2模块库中:Component类, View类和bootstrap函数。2. 实现一个Angular2组件实现一个Angular2组件也很简单,定义一个类,然后给这个类添加注解:[@Component](/user/Component)({selector:"ez-app"}) [@View](/user/View)({template:"<h1>Hello,Angular2</h1>"}) class EzApp{} class也是ES6的关键字,用来定义一个类。@Component 和 @View都是给类EzApp附加的元信息,被称为注解/Annotation。 @Component最重要的作用是通过selector属性(值为CSS选择符),指定这个组件渲染到哪个DOM对象上。 @View最重要的作用是通过template属性,指定渲染的模板。 渲染组件到DOM 将组件渲染到DOM上,需要使用自举/bootstrap函数: bootstrap(EzApp); 这个函数的作用就是通知Angular2框架将EzApp组件渲染到DOM树上。 ** 知识点:** 1. 注解/Annotation@Component和@View到底是怎么回事。看起来像其他语言(比如python) 的装饰器,是这样吗?ES6规范里没有装饰器。这其实利用了traceur的一个实验特性:注解。给一个类 加注解,等同于设置这个类的annotations属性//注解写法 [@Component](/user/Component)({selector:"ez-app"}) class EzApp{...} 等同于:class EzApp{...} EzApp.annotations = [new Component({selector:"ez-app"})]; 很显然,注解可以看做编译器(traceur)层面的语法,但和python的装饰器不同, 注解在编译时仅仅被放在annotation里,编译器并不进行解释展开 - 这个解释的工作是 Angular2完成的: 据称,注解的功能就是Angular2团队向traceur团队提出的,这不是traceur的默认选项, 因此你看到,我们配置systemjs在使用traceur模块时打开注解:System.config({ map:{traceur:"lib/traceur"}, traceurOptions: {annotations: true} }); 小结如果你了解一点Angular1.x的bootstrap,可能隐约会感受到Angular2中bootstrap的一些 变化 - 我指的并非代码形式上的变化。以组件为核心在Angular1.x中,bootstrap是围绕DOM元素展开的,无论你使用ng-app还是手动执行bootstrap()函数,自举过程是建立在DOM之上的。而在Angular2中,bootstrap是围绕组件开始的,你定义一个组件,然后启动它。如果没有一个组件, 你甚至都没有办法使用Angular2!支持多种渲染引擎以组件而非DOM为核心,意味着Angular2在内核隔离了对DOM的依赖 - DOM仅仅作为一种可选的渲染引擎存在:上面的图中,DOM Render已经实现,Server Render正在测试,iOS Render和Android Render 是可预料的特性,虽然我们看不到时间表。这有点像React了。(@hadong 是不是用React写过代码?)
2017年06月08日
64 阅读
0 评论
0 点赞
1
2