首页
好物推荐
薅羊毛领红包
好看壁纸
更多
隐私政策
友情链接
时光机
搜索
1
使用 docker 快速安装 Home Assistant
6,125 阅读
2
Ipad mini2 降级到IOS10.3.3系统
4,121 阅读
3
Home Assistant集成OpenWrt
3,553 阅读
4
华为手机开启ADB进行WIFI远程调试
3,488 阅读
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
条评论
首页
栏目
无分类
智能家居
心得随想
文档教程
页面
好物推荐
薅羊毛领红包
好看壁纸
隐私政策
友情链接
时光机
搜索到
124
篇与
无分类
的结果
2017-04-12
iptables开启DNS解析服务端口
使用dnsmasq搭建dns解析服务器需要开启53的UDP端口操作如下:iptables -I INPUT -p udp --dport 53 -j ACCEPT iptables -I OUTPUT -p udp --sport 53 -j ACCEPT /etc/init.d/iptables save service iptables restart
2017年04月12日
277 阅读
0 评论
0 点赞
2017-04-11
Sqlite的js编辑库-sql.js
npm安装npm install sql.jsnpm地址https://www.npmjs.com/package/sql.jsgithub&文档地址Github Document示例const path = require('path') const fs = require('fs'); const sql = require('sql.js'); function getPath() { let pathArr = Array.prototype.slice.call(arguments); pathArr.unshift(__dirname); return path.join(pathArr.join('/')); } /** SQL **/ function sql(path) { this.path = path; this.db; } sql.prototype = { init: function() { let filebuffer = fs.readFileSync(this.path); let database = new sqljs.Database(filebuffer); this.db = database; }, find: function(_sql, _params) { let stmt = this.db.prepare(_sql), res = []; stmt.bind(_params); while (stmt.step()) { res.push(stmt.getAsObject()); } stmt.free(); return res; }, findOne: function(_sql, _params) { return this.find(_sql, _params)[0]; }, run: function(_sql, _params) { return this.db.run(_sql, _params);; } }; (function() { const SQL = new sql(getPath('data', 'app.sqlite')); SQL.init(); let res = SQL.find("select * from user"); console.log(res); })();
2017年04月11日
144 阅读
0 评论
0 点赞
2017-04-07
js面向对象编程之继承
引用文章来源: Javascript面向对象编程(二):构造函数的继承 Javascript面向对象编程(三):非构造函数的继承 构造函数的继承现在有一个"动物"对象的构造函数function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数function Cat(name,color){ this.name = name; this.color = color; } 使"猫"继承"动物"的五种方法:构造函数绑定第一种方法也是最简单的方法,使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象构造函数中加一行:function Cat(name,color){ Animal.apply(this, arguments); this.name = name; this.color = color; } var cat1 = new Cat("大毛","黄色"); console.log(cat1.species); // 动物 prototype模式如果"猫"的prototype对象,指向一个Animal的实例,那么所有"猫"的实例,就能继承Animal了。Cat.prototype = new Animal(); Cat.prototype.constructor = Cat; var cat1 = new Cat("大毛","黄色"); console.log(cat1.species); // 动物 Cat.prototype = new Animal(); 我们将Cat的prototype对象指向一个Animal的实例,它相当于完全删除了prototype 对象原先的值,然后赋予一个新值。Cat.prototype.constructor = Cat; 任何一个prototype对象都有一个constructor属性,指向它的构造函数。加了这一行以后,Cat.prototype.constructor指向Animal。 如果没有Cat.prototype = new Animal();这一行 Cat.prototype.constructor是指向Cat的。 console.log(Cat.prototype.constructor == Animal); //true 每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性。 console.log(cat1.constructor == Cat.prototype.constructor); // true cat1.constructor也指向Animal! 这显然会导致继承链的紊乱(cat1明明是用构造函数Cat生成的),因此我们必须手动纠正,将Cat.prototype对象的constructor值改为Cat。这就是第二行的意思。 直接继承prototype第三种方法是对第二种方法的改进。由于Animal对象中,不变的属性都可以直接写入Animal.prototype。所以,我们也可以让Cat()跳过 Animal(),直接继承Animal.prototype。 现在,我们先将Animal对象改写:function Animal(){ } Animal.prototype.species = "动物"; 然后,将Cat的prototype对象,然后指向Animal的prototype对象,这样就完成了继承。Cat.prototype = Animal.prototype; Cat.prototype.constructor = Cat; var cat1 = new Cat("大毛","黄色"); console.log(cat1.species); // 动物 与前一种方法相比,这样做的优点是效率比较高(不用执行和建立Animal的实例了),比较省内存。缺点是 Cat.prototype和Animal.prototype现在指向了同一个对象,那么任何对Cat.prototype的修改,都会反映到Animal.prototype。所以,上面这一段代码其实是有问题的。请看第二行Cat.prototype.constructor = Cat; 这一句实际上把Animal.prototype对象的constructor属性也改掉了!console.log(Animal.prototype.constructor); // Cat 利用空对象作为中介由于"直接继承prototype"存在上述的缺点,所以就有第四种方法,利用一个空对象作为中介。var F = function(){}; F.prototype = Animal.prototype; Cat.prototype = new F(); Cat.prototype.constructor = Cat; F是空对象,所以几乎不占内存。这时,修改Cat的prototype对象,就不会影响到Animal的prototype对象。console.log(Animal.prototype.constructor); // Animal function extend(Child, Parent) { var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.uber = Parent.prototype; } 拷贝继承上面是采用prototype对象,实现继承。我们也可以换一种思路,纯粹采用"拷贝"方法实现继承。简单说,如果把父对象的所有属性和方法,拷贝进子对象,不也能够实现继承吗?这样我们就有了第五种方法。首先,还是把Animal的所有不变属性,都放到它的prototype对象上。function Animal(){} Animal.prototype.species = "动物"; 然后,再写一个函数,实现属性拷贝的目的。function extend2(Child, Parent) { var p = Parent.prototype; var c = Child.prototype; for (var i in p) { c[i] = p[i]; } c.uber = p; } 这个函数的作用,就是将父对象的prototype对象中的属性,一一拷贝给Child对象的prototype对象。使用的时候,这样写:extend2(Cat, Animal); var cat1 = new Cat("大毛","黄色"); alert(cat1.species); // 动物 非构造函数的继承现在有一个对象,叫做"中国人"。var Chinese = { nation:'中国' }; 还有一个对象,叫做"医生"。var Doctor ={ career:'医生' } 让"医生"去继承"中国人",这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。object()方法function object(o) { function F() {} F.prototype = o; return new F(); } 这个object()函数,其实只做一件事,就是把子对象的prototype属性,指向父对象,从而使得子对象与父对象连在一起。使用的时候,第一步先在父对象的基础上,生成子对象:var Doctor = object(Chinese); 然后,再加上子对象本身的属性:Doctor.career = '医生'; 这时,子对象已经继承了父对象的属性了。console.log(Doctor.nation); //中国 浅拷贝除了使用"prototype链"以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承下面这个函数,就是在做拷贝:function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } c.uber = p; return c; } 使用的时候,这样写:var Doctor = extendCopy(Chinese); Doctor.career = '医生'; console.log(Doctor.nation); // 中国 但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。现在给Chinese添加一个"出生地"属性,它的值是一个数组。Chinese.birthPlaces = ['北京','上海','香港']; 通过extendCopy()函数,Doctor继承了Chinese。var Doctor = extendCopy(Chinese); 然后,我们为Doctor的"出生地"添加一个城市:Doctor.birthPlaces.push('厦门'); 这样,Chinese的"出生地"也被改掉了!console.log(Doctor.birthPlaces); //北京, 上海, 香港, 厦门 console.log(Chinese.birthPlaces); //北京, 上海, 香港, 厦门 所以,extendCopy()只是拷贝基本类型的数据,我们把这种拷贝叫做"浅拷贝"。这是早期jQuery实现继承的方式。深拷贝所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。function deepCopy(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] === 'object') { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c; } 使用的时候这样写:var Doctor = deepCopy(Chinese); 现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性:Chinese.birthPlaces = ['北京','上海','香港']; Doctor.birthPlaces.push('厦门'); 这时,父对象就不会受到影响了。console.log(Doctor.birthPlaces); //北京, 上海, 香港, 厦门 console.log(Chinese.birthPlaces); //北京, 上海, 香港 目前,jQuery库使用的就是这种继承方法。
2017年04月07日
133 阅读
0 评论
0 点赞
2017-04-07
jquery观察者模式
观察者模式又叫做发布-订阅模式观察者模式主要应用于对象之间一对多的依赖关系,当一个对象发生改变时,多个对该对象有依赖的其他对象也会跟着做出相应改变,使程序更易于扩展和维护。观察者模式代码实现(function($) { var o = $({}); $.each({ trigger: 'publish', on: 'subscribe', off: 'unsubscribe' }, function(key, val) { jQuery[val] = function() { o[key].apply(o, arguments); }; }); })(jQuery); 观察者模式应用//订阅错误信息 $.subscribe('app.error', function(e, data) { alert('错误:' + data); }); //发布错误信息 $.ajax({ ..... error:function(){ $.publish('app.error','ajax请求错误!'); } }); //发布错误信息 if(!object){ $.publish('app.error','未找到对象!'); return false; }
2017年04月07日
129 阅读
0 评论
0 点赞
2017-04-05
centos端口相关指令
列出所有端口netstat -ntlp 查看端口占用的进程lsof -i tcp:80 查看iptables状态/etc/init.d/iptables status 开启iptables端口iptables -I INPUT -p tcp --dport 3306 -j ACCEPT /etc/init.d/iptables save service iptables restart 关闭iptables端口iptables -I INPUT -p tcp --dport 3306 -j DROP /etc/init.d/iptables save service iptables restart 修改iptables规则iptables -R INPUT 3 -j DROP //将第三条INPUT规则修改掉 删除iptables规则iptables -D INPUT 1 //INPUT 规则表 //1 查看iptables状态的第几条 设置filter表INPUT默认规则是 DROP//注意:必须先将22端口加入到input规则,否则将ssh链接不上 //iptables -I INPUT -p tcp --dport 22 -j ACCEPT iptables -P INPUT DROP 干净配置/sbin/iptables -P INPUT ACCEPT /sbin/iptables -F /sbin/iptables -X /sbin/iptables -Z /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT /sbin/iptables -A INPUT -p tcp -s 自己的公网ip -j ACCEPT /sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT /sbin/iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT /sbin/iptables -P INPUT DROP
2017年04月05日
35 阅读
0 评论
0 点赞
2017-03-14
JS监听页面键盘按下事件
document.onkeydown = function(e){ switch (e.which){ case 37: console.log('键盘左方向'); break; case 39: console.log('键盘右方向'); break; } }
2017年03月14日
25 阅读
0 评论
0 点赞
2017-03-14
JS判断页面是否滚动到底部
document.onscroll = function(e){ console.log((document.documentElement.scrollTop + document.body.scrollTop) == ($(document).height() - $(window).height())); //到底部返回true }
2017年03月14日
99 阅读
0 评论
0 点赞
2017-03-09
js获取URL参数
//function function getUrlParam(url, key) { var reg = new RegExp("(^|&|\\?)" + key + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象 var r = url.match(reg); //匹配目标参数 if (r != null) return unescape(r[2]); return null; //返回参数值 } //eg https://www.google.com/?gws_rd=ssl var res = getUrlParam('https://www.google.com/?gws_rd=ssl', 'gws_rd'); console.log(res); ==> print 'ssl'
2017年03月09日
70 阅读
0 评论
0 点赞
2017-03-09
js合并json数据
var json1 = { a:1, b:2 } var json2 = { c:3, d:4 } var json = mergeObject(json1, json2); //result { a:1, b:2, c:3, d:4 } function mergeObject(destination, source) { for (var property in source) destination[property] = source[property]; return destination; }
2017年03月09日
70 阅读
0 评论
0 点赞
2017-02-14
嵌入页面js插件式写法
LazyLoad = (function(doc) { var env, head, pending = {}, pollCount = 0, queue = { css: [], js: [] }, styleSheets = doc.styleSheets; function createNode(name, attrs) { var node = doc.createElement(name), attr; for (attr in attrs) { if (attrs.hasOwnProperty(attr)) { node.setAttribute(attr, attrs[attr]); } } return node; } function finish(type) { var p = pending[type], callback, urls; if (p) { callback = p.callback; urls = p.urls; urls.shift(); pollCount = 0; if (!urls.length) { callback && callback.call(p.context, p.obj); pending[type] = null; queue[type].length && load(type); } } } function getEnv() { var ua = navigator.userAgent; env = { async: doc.createElement('script').async === true }; (env.webkit = /AppleWebKit\//.test(ua)) || (env.ie = /MSIE|Trident/.test(ua)) || (env.opera = /Opera/.test(ua)) || (env.gecko = /Gecko\//.test(ua)) || (env.unknown = true); } function load(type, urls, callback, obj, context) { var _finish = function() { finish(type); }, isCSS = type === 'css', nodes = [], i, len, node, p, pendingUrls, url; env || getEnv(); if (urls) { urls = typeof urls === 'string' ? [urls] : urls.concat(); if (isCSS || env.async || env.gecko || env.opera) { // Load in parallel. queue[type].push({ urls: urls, callback: callback, obj: obj, context: context }); } else { // Load sequentially. for (i = 0, len = urls.length; i < len; ++i) { queue[type].push({ urls: [urls[i]], callback: i === len - 1 ? callback : null, obj: obj, context: context }); } } } if (pending[type] || !(p = pending[type] = queue[type].shift())) { return; } head || (head = doc.head || doc.getElementsByTagName('head')[0]); pendingUrls = p.urls.concat(); for (i = 0, len = pendingUrls.length; i < len; ++i) { url = pendingUrls[i]; if (isCSS) { node = env.gecko ? createNode('style') : createNode('link', { href: url, rel: 'stylesheet' }); } else { node = createNode('script', { src: url }); node.async = false; } node.className = 'lazyload'; node.setAttribute('charset', 'utf-8'); if (env.ie && !isCSS && 'onreadystatechange' in node && !('draggable' in node)) { node.onreadystatechange = function() { if (/loaded|complete/.test(node.readyState)) { node.onreadystatechange = null; _finish(); } }; } else if (isCSS && (env.gecko || env.webkit)) { if (env.webkit) { p.urls[i] = node.href; pollWebKit(); } else { node.innerHTML = '@import "' + url + '";'; pollGecko(node); } } else { node.onload = node.onerror = _finish; } nodes.push(node); } for (i = 0, len = nodes.length; i < len; ++i) { head.appendChild(nodes[i]); } } function pollGecko(node) { var hasRules; try { hasRules = !!node.sheet.cssRules; } catch (ex) { pollCount += 1; if (pollCount < 200) { setTimeout(function() { pollGecko(node); }, 50); } else { hasRules && finish('css'); } return; } finish('css'); } function pollWebKit() { var css = pending.css, i; if (css) { i = styleSheets.length; // Look for a stylesheet matching the pending URL. while (--i >= 0) { if (styleSheets[i].href === css.urls[0]) { finish('css'); break; } } pollCount += 1; if (css) { if (pollCount < 200) { setTimeout(pollWebKit, 50); } else { finish('css'); } } } } return { css: function(urls, callback, obj, context) { load('css', urls, callback, obj, context); }, js: function(urls, callback, obj, context) { load('js', urls, callback, obj, context); } }; })(this.document); //api see -> https://github.com/rgrove/lazyload (function(doc, load) { load.css(['main.css'], function() { console.log('css files have been loaded'); }); load.js(['jquery-1.12.4.min.js'], function() { console.log('jquery have been loaded'); createDom(); }); function createDom(){ $('body').append('<div class="bg-red"></div>'); } })(this.document, LazyLoad);
2017年02月14日
268 阅读
0 评论
0 点赞
2017-01-11
chrome登录无限崩溃的解决方案
现象点击右上角的头像,然后chrome就崩溃闪退 解决1.在地址栏输入 chrome://chrome-signin/?source=2 并回车进入 2.输入用户名密码登录,成功后便自动开始同步
2017年01月11日
99 阅读
0 评论
0 点赞
2017-01-05
js对URL处理方法
封装代码var urlKit = { domain : function(_url){ return _url?urlKit.pure(_url).replace(/https|http|ftp|rtsp|mms|:|\//g,''):document.domain; }, hostname : function(){ return location.hostname; }, pathname : function(){ return location.pathname; }, port : function(){ return location.port; }, protocol : function(){ return location.protocol; }, pure : function(_url){ var match = _url.match(/((https|http|ftp|rtsp|mms):\/\/)?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+\/?)/g); if(match && match.length > 0){ return match[0]; } return urlKit.domain(); } } 使用$('a').each(function(i,e){ if(urlKit.domain()!= urlKit.domain($(e).attr('href')) && $(e).attr('target')!='_blank'){ $(e).attr('target','_blank'); } });
2017年01月05日
72 阅读
0 评论
0 点赞
2016-12-21
easyui扩展方法之获得tree-node所在层级
扩展方法$.extend($.fn.tree.methods, { getLevel:function(jq,target){ var l = $(target).parentsUntil("ul.tree","ul"); return l.length+1; } }); 使用var node = $(treeid).tree("getSelected"); var lv = $(treeid).tree("getLevel",node.target);
2016年12月21日
77 阅读
0 评论
0 点赞
2016-12-16
去掉链接<a>标签点击产生的虚线
在css中加入如下代码:a:focus { outline: none; blr: expression(this.onFocus = this.blur ()); }
2016年12月16日
125 阅读
0 评论
0 点赞
2016-12-15
使用LazyLoad动态加载js/css文件
LazyLoad 介绍LazyLoad是一个简单的动态加载js/css资源文件的js库,可以在需要的页面去加载需求js/css资源,达到页面加载的简洁以及效率。Github 地址https://github.com/rgrove/lazyload/资源下载lazyload.js 下载地址如何使用// 加载js文件,当加载完成后执行回调函数 LazyLoad.js('http://example.com/foo.js', function () { alert('foo.js has been loaded'); }); // 加载多个js文件,当全部加载完成后执行回调函数 LazyLoad.js(['foo.js', 'bar.js', 'baz.js'], function () { alert('all files have been loaded'); }); // 加载css文件,当加载完成后执行回调函数 LazyLoad.css('foo.css', function (arg) { alert(arg); }, 'foo.css has been loaded'); // 加载多个css文件,当全部加载完成后执行回调函数 LazyLoad.css('foo.css', function () { alert(this.foo); // displays 'bar' }, null, {foo: 'bar'}); 浏览器兼容性 Firefox 2+ Google Chrome Internet Explorer 6+ Opera 9+ Safari 3+ Mobile Safari Android
2016年12月15日
186 阅读
0 评论
0 点赞
2016-12-13
html5教程
文档类型声明<!DOCTYPE HTML>H5 meta全解声明文档使用的字符编码<meta charset='utf-8'>优先使用 IE 最新版本和 Chrome<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>页面描述<meta name="description" content="不超过150个字符"/>页面关键词屏幕的缩放<meta name="viewport" content="width=device-width,height=device-height, user-scalable=no,initial-scale=1, minimum-scale=1, maximum-scale=1,target-densitydpi=device-dpi ">width viewport的宽度[device-width | pixel_value]width如果直接设置pixel_value数值,大部分的安卓手机不支持,但是ios支持; <p>height viewport 的高度 (范围从 223 到 10,000 )</p> <p>user-scalable [yes | no]是否允许缩放</p> <p>initial-scale [数值] 初始化比例(范围从 > 0 到 10)</p> <p>minimum-scale [数值] 允许缩放的最小比例</p> <p>maximum-scale [数值] 允许缩放的最大比例</p> <p>target-densitydpi 值有以下(一般推荐设置中等响度密度或者低像素密度,后者设置具体的值dpi_value,另外webkit内核已不准备再支持此属性)<br /> -- dpi_value 一般是70-400//没英寸像素点的个数<br /> -- device-dpi设备默认像素密度<br /> -- high-dpi 高像素密度<br /> -- medium-dpi 中等像素密度<br /> -- low-dpi 低像素密度</p> <pre><code>####忽略电话号码和邮箱 `<meta name="format-detection" content="telphone=no, email=no"/>` ####设置作者姓名及联系方式 `<meta name="author" contect="hadong, dhso@163.com" />` ####搜索引擎抓取 `<meta name="robots" content="index,follow"/>` ####启用360浏览器的极速模式(webkit) `<meta name="renderer" content="webkit">` ####避免IE使用兼容模式 `<meta http-equiv="X-UA-Compatible" content="IE=edge">` ####不让百度转码 `<meta http-equiv="Cache-Control" content="no-siteapp" />` ####针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 `<meta name="HandheldFriendly" content="true">` ####微软的老式浏览器 `<meta name="MobileOptimized" content="320">` ####UC强制竖屏 `<meta name="screen-orientation" content="portrait">` ####UC强制全屏 `<meta name="full-screen" content="yes">` ####UC应用模式 `<meta name="browsermode" content="application">` ####QQ强制竖屏 `<meta name="x5-orientation" content="portrait">` ####QQ应用模式 `<meta name="x5-page-mode" content="app">` ####添加 RSS 订阅 `<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/>` ####添加 favicon icon `<link rel="shortcut icon" type="image/ico" href="/favicon.ico"/>` ####SNS 社交标签 </code></pre> <meta property="og:type" content="类型" /> <meta property="og:url" content="URL地址" /> <meta property="og:title" content="标题" /> <meta property="og:image" content="图片" /> <meta property="og:description" content="描述" />Windows 8 磁贴颜色<meta name="msapplication-TileColor" content="#000"/>Windows 8 磁贴图标<meta name="msapplication-TileImage" content="icon.png"/>windows phone 点击无高光<meta name="msapplication-tap-highlight" content="no">IOS 开启全屏显示<meta name="apple-mobile-web-app-capable" content="yes">IOS 改变顶部状态条的颜色<meta name="apple-mobile-web-app-status-bar-style" content="black" /> 在 web app 应用下状态条(屏幕顶部条)的颜色, 默认值为 default(白色),可以定为 black(黑色)和 black-translucent(灰色半透明);Safari 设置'添加到主屏幕图标'<link rel="apple-touch-icon-precomposed" href="/apple-touch-icon-57x57-precomposed.png"/>Safari 设置桌面图标的标题<meta name="apple-mobile-web-app-title" content="标题">判断浏览器<!--[if lt IE 7 ]><html class="oldie ie ie6"> <![endif]--> <!--[if IE 7 ]><html class="oldie ie ie7"> <![endif]--> <!--[if IE 8 ]><html class="ie ie8"> <![endif]--> <!--[if (gte IE 9)|!(IE)]><!--><html> <!--<![endif]-->H5 在移动应用开发的总结转到网易UEDCH5 一些移动应用框架MUI-最接近原生APP体验的高性能前端框架MUI DEMO IONIC-The top open source framework for building amazing mobile apps. Jingle SUI-轻量,小巧且精美的UI库 方便迅速搭建手机H5应用 framework7-特色的HTML框架 可以创建精美的iOS应用 weui-微信原生视觉体验一致的基础样式库 frozenui-简单易用,轻量快捷,为移动端服务的前端框架
2016年12月13日
157 阅读
0 评论
0 点赞
2016-12-06
SublimeText安装install package control
sublime text 编辑器安装install package control使用快捷键ctrl+` 或者 选择 View > Show Console打开命令控制台sublime text 2import urllib2,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' + '1e3d39e33b79698005270310898eea76'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation') sublime text 3import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' + '1e3d39e33b79698005270310898eea76'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
2016年12月06日
156 阅读
0 评论
0 点赞
2016-12-06
Sublime Text 2注册码
----- BEGIN LICENSE -----Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC99798F 942194A6 02396E98 E62C9979 4BB979FE 91424C9D A45400BF F6747D88 2FB88078 90F5CC94 1CDC92DC 8457107A F151657B 1D22E383 A997F016 42397640 33F41CFC E1D0AE85 A0BBD039 0E9C8D55 E1B89D5D 5CDB7036 E56DE1C0 EFCC0840 650CD3A6 B98FC99C 8FAC73EE D2B95564 DF450523 ------ END LICENSE ------
2016年12月06日
113 阅读
0 评论
0 点赞
2016-12-06
Ubuntu Meta网络图标丢失解决方案
现象:在终端里面输入nm-applet,错误提示如下:(nm-applet:3338): Gdk-CRITICAL **: gdk_window_thaw_toplevel_updates: assertion 'window->update_and_descendants_freeze_count > 0' failed 问题分析:应该是权限不足导致的任务不能启动。解决方案:我是将当前登录用户加入root组,即可看到图标。
2016年12月06日
119 阅读
0 评论
0 点赞
2016-12-05
Git提交改动到远程分支
git statusgit add src/main/thrift/streaming_deliverer.thrift git commit -m 'remove duplicate operation_type' git push origin adroll_deletions
2016年12月05日
62 阅读
0 评论
0 点赞
1
...
4
5
6
7