模块目录
1 | //相当于 npm i 模块名 -g |
项目目录
1 | npm link 模块名 |
解除link
1 | // 模块目录&项目目录 |
ID 卡属于低频卡,工作频率一般是 125KHz-1000Khz。ID 卡不可写入数据,其记录内容(卡号)只可由芯片生产厂一次性写入,开发商只可读出卡号加以利用。
IC 卡一般是 13.56MHz 的高频卡,跟手机 NFC 工作频率一样。所以手机 NFC 可以模拟未加密的 IC 卡,不能模拟 ID 卡。
M1
M1 卡容量 1K 字节,每张卡片都有一个 4 字节的全球唯一序列号,0 扇区不可以修改,其他扇区可反复擦写,卡上数据保存期为 10 年,可改写 10 万次,读无限次。日常使用的电梯卡、门禁卡等智能卡发卡商所使用的都是 M1 卡,可以理解为物业发的原卡(母卡)。常见校园卡、公交卡等也是 M1 卡。M1 卡仅仅适合发卡方发新卡使用。
UID
普通 IC 复制卡,可以重复擦写所有扇区。UID 可被重复修改,响应后门指令(意味着可被使用后门指令检测是否为克隆卡的机器发现),遇到带有防火墙的读卡器就会失效。
CUID
UID 的升级版,可擦写防屏蔽卡,可以重复擦写所有扇区,不响应后门指令(意味着不容易被反克隆系统发现),可以绕过防火墙。
FUID 卡
不可擦写防屏蔽卡,此卡的特点 0 扇区只能写入一次,写入一次后变成 M1 卡,不能重复利用,修改后和 M1 卡完全一样,很难被屏蔽检测。
UFUID 卡
高级 IC 复制卡,可以理解为是 UID 和 FUID 的合成卡,需要封卡操作,不封卡就是 UID 卡,封卡后就变为 M1 卡。
CPU 卡
CPU 卡芯片内含有一个微处理器,配合操作系统即片上 OS,可以达到金融级别的安全等级。适用于金融、保险、交警、政府行业等多个领域。CPU 卡由 CPU 部分 7K 以及 M1 部分 1K 组成,最多破解其中 M1 部分,CPU 区域数据无法破解。实际上由于 CPU 部分和 M1 部分的数据会交互,所以基本上 CPU 卡无法破解。
刚发现npm 有一个自动完成命令补全的功能
1 | npm i git+https://github.com/willnewii/vue-lib.git#version |
1 | //修改最新一条 |
1 | git rebase -i HEAD~2 |
transform span 无效
transform适用于:所有块级元素及某些内联元素
calc sass 语法
1
2
3
4 $width : 10px ;
.a {
width:calc(100% - #{$width})
}
]]>Vue项目,build以后,-webkit-box-orient: vertical 会消失.
1
2
3
4
5
6 new OptimizeCSSPlugin({
cssProcessorOptions: {
safe: true,
autoprefixer: false <== 添加改行
}
})
在开发中遇到了一个’奇怪’的问题.在页面中通过条件判断显示三个同样的组件.但是组件2和组件3无论如何都不发生改变.1
2
3
4
5
6
7
8
9<div v-show="index === 1">
<component :data='1'></component>
</div>
<div v-else-if="index === 2">
<component :data='2'></component>
</div>
<div v-else-if="index === 3">
<component :data='3'></component>
</div>
查找文档后发现该章节.原来在不特殊指明的情况下,vue会复用组件,此时又不触发created,而component组件的付值操作是在created中完成的.所以就会出现组件显示正常,但是内容不会变化的的情况.
而vue给出的方案是在不需要复用的组件上添加唯一key.1
2
3
4
5
6
7
8
9<div v-if="index === 1">
<component :data='1' key='1'></component>
</div>
<div v-else-if="index === 2">
<component :data='2' key='2'></component>
</div>
<div v-else-if="index === 3">
<component :data='3' key='3'></component>
</div>
1 | ; |
我们以京东商品详情页为例.通过puppeteer,获取商品标题和售价.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 ;
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://item.m.jd.com/ware/view.action?wareId=3719293');
let data = await page.evaluate(() => {
return {
jdPrice: document.querySelector('#jdPrice-copy').innerText,
jdTitle: document.querySelector('.title-text').innerText
};
});
console.log(data);
await browser.close();
})();
//log { jdPrice: '998.00',jdTitle: '【新年货】荣耀 畅玩6X 4GB 32GB 全网通4G手机 高配版 冰河银' }
1 | await page.setRequestInterception(true); |
有些页面数据是通过接口请求获取的.如果能直接处理接口返回数据,当然要比通过查询页面元素获取内容更方便和直接.
还拿jd商品详情页举例,通过分析得知有个版块,京东问答的数据是由接口返回,那么假设我们现在要获取当前商品问答数据.1
2
3
4
5
6//处理响应内容
await page.on('response', async response => {
if (response.url().indexOf('https://item.m.jd.com/question/questionList.json') === 0) {
console.log(await response.text());
}
});
1 | ; |
首先我们来约定一个选项对象 baseOptions,后面的代码会用到.1
2
3
4
5
6
7
8
9
10
11
12
13let options = {
template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
data: function () {
return {
firstName: 'Walter',
lastName: 'White',
alias: 'Heisenberg'
}
},
created(){
console.log('onCreated-1');
}
};
实例化一个组件.
1 | new Vue(baseOptions); |
Vue.component 是用来注册或获取全局组件的方法,其作用是将通过 Vue.extend 生成的扩展实例构造器注册(命名)为一个组件.全局注册的组件可以在所有晚于该组件注册语句构造的Vue实例中使用.
1
2
3
4
5 Vue.component('global-component', Vue.extend(baseOptions));
//传入一个选项对象(自动调用 Vue.extend),等价于上行代码.
Vue.component('global-component', baseOptions);
// 获取注册的组件(始终返回构造器)
var MyComponent = Vue.component('my-component')
当我们需要在其他页面‘扩展’或者叫‘混合’baseOptions时,Vue中提供了多种的实现方式:extend,mixins,extends.
可以扩展 Vue 构造器,从而用预定义选项创建可复用的组件构造器。
1
2
3
4
5
6
7
8
9
10
11 let BaseComponent = Vue.extend(baseOptions);
//基于基础组件BaseComponent,再扩展新逻辑.
new BaseComponent({
created(){
//do something
console.log('onCreated-2');
}
//其他自定义逻辑
});
// -> onCreated-1
// -> onCreated-2
mixins 选项接受一个混合对象的数组。这些混合实例对象可以像正常的实例对象一样包含选项,他们将在 Vue.extend() 里最终选择使用相同的选项合并逻辑合并。
1
2
3
4
5
6
7
8
9
10 new Vue({
mixins: [baseOptions],
created(){
//do something
console.log('onCreated-2');
}
//其他自定义逻辑
});
// -> onCreated-1
// -> onCreated-2
这和 mixins 类似,区别在于,组件自身的选项会比要扩展的源组件具有更高的优先级.
官方文档是这么写的,除了优先级,可能就剩下接受参数的类型吧,mixins接受的是数组.
1 | new Vue({ |
从结果上看,三种方式都能实现需求,但是形式却有不同.
从源码来看通过extend,extends和mixins三种方式接收的options,最终都是通过mergeOptions进行合并的.差异只是官方文档中提到的优先级不同extend > extends > mixins. 所以,如果是简单的扩展组件功能,三个方式都可以达到目的.
而这三种方式使用场景上细化的区分,目前我也蒙圈中…
//几种方式的不同示例:
https://jsfiddle.net/willnewii/dzks1r4d/
上面提到的选项对象,是在mergeOptions中按照一定策略进行合并的.
打印Vue.config.optionMergeStrategies,你会看默认的optionMergeStrategies如下:
mergeAssets合并方法里,用到了原型委托.他会先把父组件的属性放在创建的新对象的原型链上.然后扩展新对象
对象里查找属性的规则 :举个例子,当查找一个属性时,如 obj[a] ,如果 obj 没有 a 这个属性,那么将会在 obj 对象的原型里找,如果还没有,在原型的原型上找,直到原型链的尽头,如果还没有找到,返回 undefined。
1 | function extend (to, _from) { |
如果按照优先级去理解,当你需要继承一个组件时,可以使用Vue.extend().当你需要扩展组件功能的时候,可以使用extends,mixins.但目前为止还没有碰到完美诠释他们的场景,抱歉,能力有限😂
href 属性用于保持光标形状为正常的手形,也可以使用 css 实现
1 | <a href="javascript:void(0);" @click="currentView = 'home'"> |
FOUC Flash Of Unstyled Content 文档样式闪烁
首先我们在正常情况下build
当前流行的UI框架如iview,muse-ui,Element UI都支持按需加载,只需稍微改动一下代码.
修改前:1
2
3
4import MuseUI from 'muse-ui'
import 'muse-ui/dist/muse-ui.css'
import 'muse-ui/dist/theme-light.css'
Vue.use(MuseUI)
修改后:1
2
3
4
5
6
7
8
9import appBar from 'muse-ui/src/appBar'
import toast from 'muse-ui/src/toast'
import drawer from 'muse-ui/src/drawer'
import popup from 'muse-ui/src/popup'
Vue.component(appBar.name, appBar);
Vue.component(toast.name, toast);
Vue.component(drawer.name, drawer);
Vue.component(popup.name, popup);
这里有点麻烦的就是你要把整个项目用到的muse-ui组件都注册一遍,当然你也可以只在用到的页面做局部引用.
让我们来看看使用按需加载后的效果🤓
在当前项目引用了16个muse-ui组件的情况下 css减少了80kb,js减少了快200kb.
这一步并没有对项目产出的文件进行什么优化.而是优化了构建速度.
DllPlugin 预编译模块.有点像android开发中的lib Module,或者iOS的framework.
我们可以对项目中用到的vue,vue-router,axios,muse-ui 这些固定的,基本不变动的模块进行预编译. 具体操作不在赘述,可以看一下这篇文章,也是我写的,但是觉得自己没讲利索😂 .
看一下构建时间的结果对比:
before:38291ms
after :10089ms
项目中多了core.dll.css和core.dll.js 他们就是划分出来的固定的,基本不变的模块,所以只需要编译一次,以后引用就好.有点library的感觉.这样每次构建省去了构建固定模块的时间. 时间有38s降到了10s,如果你构建比较频繁,应该还是很有用的.
官方文档是这么介绍的:
在大型应用中,我们可能需要将应用拆分为多个小模块,按需从服务器下载。为了让事情更简单, Vue.js 允许将组件定义为一个工厂函数,动态地解析组件的定义。Vue.js 只在组件需要渲染时触发工厂函数,并且把结果缓存起来,用于后面的再次渲染。
修改router
before:1
2
3
4
5
6import search from './search.vue'
{
path: '/search',
name: 'search',
component: search
}
after:1
2
3
4
5
6const search = resolve => require(['./search.vue'], resolve);
{
path: '/search',
name: 'search',
component: search
}
具体我们来看看改造后的效果:
因为我的项目目前只有7个页面,即使把页面都做成异步加载,效果并不是很’喜人’,整体缩小了30kb.
再使用别人的组件时,上手教程都会提示让你在main.js里注册一下就好.当然这是最省事的办法.
但是根据项目情况,比如我的项目用到了vue-baidu-map.
如果你按照默认的加载方式,vue-baidu-map是会被打在vendor.js .但其实这个组件我只有某个二级页面才使用.所以让我们来调整一下加载位置看看.把注册的vue-baidu-map放在真正使用它的地方.
这样,verdor.js 又小了56kb.因为首页根本用不到vue-baidu-map. 当然这样会带来一个问题:当多个页面使用vue-baidu-map,会出现多个页面重复打包.
怎么异步加载插件,这个我还没搞明白…
webpack-bundle-analyzer是用来分析 Webpack 生成的包体组成并且以可视化的方式反馈给开发者的工具.你可以通过命令:1
npm run build --report
来查看依赖关系.然后再根据具体情况划分代码块.效果图就是上面那张花里胡哨的图…它清楚的告诉你了打包时模块划分的情况.
638.7kb vs 286.2kb
这还是在未开启gzip的情况下.
新增一张开启gzip的截图,84.8kb,相对最后的优化结果286.2kb是70%的压缩比…哈哈
如果你能看到这,十分感谢你赏脸听一个android开发bb前端开发🤗 .
一般我们可以把项目分为三部分.
分类 | 说明 | 变动频率 |
---|---|---|
vendor_library | 核心库 | 低 |
vendor | 一般项目依赖 | 中等 |
code | 业务逻辑 | 高 |
vendor_library:比如vue,vue-router,axios 这些变动频率极低的文件可以利用 DllPlugin 和 DllReferencePlugin 进行预编译.
vendor,code在开发阶段,每次构建都需要编译.但是一旦完成该次开发任务,应该调整vendor 是否加入vendor_library.
BundleAnalyzerPlugin 是分析 Webpack 生成的包体组成并且以可视化的方式反馈给开发者的插件。
vue已经默认集成了该插件. 如果你运行 npm run build –report.就能看到当前项目的依赖情况.然后做出相应调整.
分类 | 耗时 | muse-ui | iview |
---|---|---|---|
before | 13256ms | 234KB | 337KB |
after | 43211ms | 79KB | 75KB |
先看结果...你没看错,'优化后',时间竟然变长了...😂.不过这也正常,之前的依赖直接获取的是dist目录的文件,现在需要在src目录下获取.增加了编译的过程.
但是文件大小的减少还是喜人的.当然,这取决于项目中对模块的使用程度.在我们这个项目中iview只使用了的四个控件.结果上看,显然还是按需加载比较划算.不过这个不算是时间上的优化,只是因为dll可以解决构建时间问题,使按需加载变的更好用.
Dll这个概念应该是借鉴了Windows系统的dll。一个dll包,就是一个纯纯的依赖库,它本身不能运行,是用来给你的app引用的。
打包dll的时候,Webpack会将所有包含的库做一个索引,写在一个manifest文件中,而引用dll的代码(dll user)在打包的时候,只需要读取这个manifest文件,就可以了。
这么一来有几个好处:
Dll打包以后是独立存在的,只要其包含的库没有增减、升级,hash也不会变化,因此线上的dll代码不需要随着版本发布频繁更新。
App部分代码修改后,只需要编译app部分的代码,dll部分,只要包含的库没有增减、升级,就不需要重新打包。这样也大大提高了每次编译的速度。
假设你有多个项目,使用了相同的一些依赖库,它们就可以共用一个dll。
网上抄的… 其实意思就是我们可以把项目的公共模块,基本不会改动的模块.想我们刚才说的定义为vendor_library的内容,进行预编译编译.以后在项目构建过程中,vendor_library部分直接引用,就不需要再编译了.
这也是为什么按需加载可以得到更好的使用,正常构建流程,因为使用了按需加载,会导致每次的构建都比使用全量加载用时要长.而使用dll,核心库只需要编译一次,以后直接引用即可.
先来看一下改进结果:
分类 | 耗时 |
---|---|
before | 57192ms |
after | 7890ms |
哈哈,有没有快到飞起!!!
1 | //webpack.dll.conf.js |
其实这就是一个正常的构建文件.根据你的项目进行修改即可.唯一不同的是在plugins多了一个DllPlugin.他会生成一个描述依赖对应关系的json文件.
static目录如下:1
2
3
4
5|____dll
| |____fonts
| |____vendor-mainfest.json
| |____vendor.dll.css
| |____vendor.dll.js
修改模板index.html 根据你的构建结果做修改.
1 | //head 标签 |
修改webpack.base.conf.js
1 | plugins: |
执行
1 | webpack --config ./build/webpack.dll.conf.js |
你也可以将该语句放入npm run 中.’build:dll:report’ 是为了优化dll依赖关系,添加的另外一条命令.上文已经提过,我们可以借用BundleAnalyzerPlugin插件查看当前包的依赖情况,和包体组成情况.1
2
3
4
5//package.json
"scripts":{
"build:dll": "webpack --config ./build/webpack.dll.conf.js",
"build:dll:report": "npm run build:dll --report"
}
Adblock Plus
可用于在网页浏览时过滤视频网站广告、弹出窗口、网页横幅广告和其他显眼位置广告。润物细无声的插件.装上了你也不知道他是干嘛的…直到我用别人的电脑浏览网页,那满屏的广告…
crxMouse Chrome Gestures
鼠标手势,装机必备(^__^)
simple undo close
这个简单的弹出可让您轻而易举的撤销关闭的标签!
Neater Bookmarks
弹出式书签栏.装机必备.个人习惯会把默认的书签栏隐藏.
the-great-suspender
节省内存利器。它可以休眠掉那些你暂时不用的 Chrome 标签,从而释放出更多的内存和资源
tampermonkey
一款用户脚本管理器,可以通过挂载 js 脚本以实现某些页面功能。你可以在 GreasyFork、 OpenUserJS 等脚本资源网站下载你需要的脚本,来丰富你的浏览器访问的网站功能。比如解决百度云大文件下载限制、跳过网站等待验证码及登录、令 Google 直接链接至搜索结果网页,无须重定向等。
stylish
tampermonkey是让你可以在指定的网站运行js,这个就是让你运行自定义的样式.比如,去掉百度首页的干扰元素,新浪微薄的广告等
anything-to-qrcode
通过右键菜单或地址栏按钮将当前页面地址、选中的文本、链接、图片地址等文本内容生成二维码,也可以解析页面中的二维码图片,完全离线可用,不依赖任何远程文件和服务,内存占用小,不常驻后台,界面简洁。
Bookmark Manager
Google出品,material design风格书签管理器.据说本来是要替代自带的书签管理器.后来又被换回去了.个人觉得还好,主要是好看!~
Vimium
用vim的快捷键操作浏览器,基本上不用摸鼠标了…
阅读模式
提供与Safari阅读模式功能一致的插件,浏览文章页时候可进入友好的阅读模式,并自定义阅读功能。 如果你经常浏览资讯或者看长文章,强烈推荐!
Send to Kindle (by Klip.me)
炒鸡方便.可以设置你的多看或者kindle推送邮箱.看到喜欢的文章点一下,发送.
JSON-handle
对JSON格式的内容进行浏览和编辑,以树形图样式展现JSON文档,并可实时编辑。
Octotree
查看代码的时候如果目录很深你需要一个一个点.这个插件会在左边直接生成一个树状文件目录.还可以直接下载单个文件.
蓝牙快速开发框架,使用回调方式处理:scan、connect、notify、indicate、write、read等一系列蓝牙操作。-FastBle
一个长按扫描 View 上的二维码的工具库。webView 也可以。
提供多达8种最常见的App通知接口,支持Android 5.0悬浮式通知样式-NotifyUtil
安装 安装过程中会报一堆错误,不过貌似不影响安装.
1 | npm install -g homebridge-gpio-wpi |
修改homebridge的config文件
1 | { |
duration 节点应该删除,不然会报错.issue#1
set-gpio.sh
code
1 | gpio export 4 out |
具体操作可以看node-dht-sensor的README.
针脚图 安装过wiringpi 你可以通过命令’gpio readall’打印出来1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | OUT | 1 | 7 || 8 | 0 | IN | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | OUT | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 0 | OUT | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
1 | 硬件信息: |
安装git 和 make
1 | sudo apt-get install git make |
安装Node
方法1(下载链接可能已经变动,需要去官网查看)
1 | wget https://nodejs.org/dist/v4.3.2/node-v4.3.2-linux-armv6l.tar.gz |
方法2(这种更简单….)
1 | curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - |
安装Avahi
1 | sudo apt-get install libavahi-compat-libdnssd-dev |
安装homebridge和依赖
1 | sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp |
Run
1 | homebridge |
至此,虽然树莓派还没有连接上什么实质性设备,但是打开系统是iOS10以上的设备,应该能看到一个叫homebridge的模块.连接试试看~
这样,第一步就算完成了.
启动的时候会有这些WARNING.作者已经说了,不影响使用,可以忽略.但是呢赶巧在办公室的时候手机死活发现不了设备.折腾了半天,后来回家,换了个wifi就好了…
1 | *** WARNING *** The program 'nodejs' uses the Apple Bonjour compatibility layer of Avahi |
Error: dns_sd.DNSServiceRegister dns service error: unknown #613 .运行后有可能会报这个错误.
1 | sudo apt-get install avahi-daemon avahi-discover libnss-mdns libavahi-compat-libdnssd-dev |
1 | apt-get upgrade 和 apt-get dist-upgrade 本质上是没有什么不同的。 |
HomeKit是苹果在2014年推出的智能家居平台.
然后没有然后了…我在网上找了半天也没有通俗定义homekit的话.个人理解就是一个苹果指定的智能家居标准.
直到今年的iOS10. HomeKit 才变得不那么抽象,因为他有了新的入口,‘家庭’app.
今年iOS更新以后,有没有发现手机里多了一个跟Watch/视频 一样“没用”的app 叫 家庭.
来看看官方的定义
简单来说,你可以通过家庭这个app.控制你家里的电器.比如:
目前我能想到的使用场景:
再来看一张图
在以后,iPhone会成为你房子的遥控器.
再来看一张图
这应该是个装逼利器吧… 对这siri说,把灯关了…他就给关了.
PS:苹果还可以通过一个常驻家中的设备(装有 tvOS 10 的 Apple TV(第 4 代)或者装有 iOS 10 的 iPad),作为家居中枢。这样你就可以通过自己的手机远程控制家里的设备了.当然,这些目前看起来更像是痒点,还不是痛点.
而这些只需要一点点配置.苹果都会为你准备好.我不是果粉…但不得不说,在这个墙内,你要有逼格,你要有生态,还要有体验,还要有足够智能.好像苹果是上佳的选择.(小米的没有体验过,所以就不说是唯一啦)
如果你是土豪,后面的不用看了.去苹果官网选官方配件吧…
Homebridge是一个轻量级NodeJS服务器。可以在您的家庭网络上运行,模拟iOS HomeKit API。它支持插件,为数以千计的模块提供了一个从HomeKit到各种第三方’智能家居’设备制造商的桥梁.
小米就可以通过它,来接入到homekit中.
而安装了HomeBridge的树莓派,在配合树莓派的GPIO能力,就能玩出很多花样.
快捷键 | 备注 |
---|---|
j | 向下细微滚动窗口 |
k | 向上细微滚动窗口 |
d | 向下滚动半个屏幕 |
u | 向上移动半个屏幕 |
g+g(连续按两下g | 回到顶部 |
G | 到达页面底部 |
f | 将当前网页上的所有可见链接/输入框分配一个快捷键,输入后就可以打开或者跳转到对应的输入框。如果按的是F,那么将在新窗口中打开页面 |
快捷键 | 备注 |
---|---|
J | 下一个标签页 |
K | 上一个标签页 |
x | 关闭当前页面 |
X | 恢复刚刚关闭的页面 |
H | 后退 |
L | 前进 |
r | 刷新 |
在搜索方法的时候,有时候会把dist目录里的方法显示出来.可以在preferences->Directories 里把不相关的目录过滤掉(excluded).
移动到行号位置,右键选择annotate.
alt+cmd+v 变量抽取
alt+cmd+f 成员变量抽取
alt+cmd+m 方法 抽取
1 | //先写你关心的,再写动词 |
名称 | 快捷键 | 位置 | |
---|---|---|---|
跳转到父类 | cmd+u | Navigate->Super method | |
跳转到定义 | cmd+b | Navigate->declaration | |
跳转到实现 | cmd+alt+b | Navigate->implementation(s) | |
返回 | cmd+[ | Navigate->Back | |
显示文件路径 | alt+cmd+F12 | Navigate->File Path | 不用再目录里右键Reveal in Finder |
double shift | search Everywhere | ||
code | |||
增强选择-扩大 | Edit->extend selection | ||
增强选择-收缩 | Edit->shrink selection | ||
显示参数信息 | cmd+p | View->Paramaeter Info | |
提取 | |||
变量提取 | alt+cmd+v | Refactor->Extract->Variable | |
方法提取 | alt+cmd+m | Refactor->Extract->Method | |
移动 | |||
单词移动 | alt | ||
行尾首 | cmd |
add:2016-12-02
名称 | action | 快捷键 | 备注 |
---|---|---|---|
复制当前行 | duplicate Line or block | cmd+d | |
删除当前行 | delete line | cmd+backspace | |
上下移动当前行 | move line up/down | alt+shift+up/down | |
移动到指定行 | Line | cmd+g | |
多文本选择 | add selection for next occurrence | Ctrl+G | |
列选择 | Alt+MouseDrag | ||
当前文件方法列表 | File Structure | cmd+F12 | |
合并行和文字 | join lines | ctrl+shift+j | |
代码提示 | basic | ctrl+/ | 记得按tab… |
显示文件路径 | File Path | alt+cmd+F12 | 不用再目录里右键Reveal in Finder |
路径中查找 | Find in Path | shift+ctrl+F | 有个预览功能,屌 |
方法调用路径 | ctrl+alt+h | ||
显示参数信息 | Parameter Info | cmd+p | 显示方法需要的参数 |
打开文件 | class | cmd+o | |
重写方法列表 | override method | cmd+n | |
快速查看定义 | quick definition | cmd+shift+i | |
扩大/收缩选中部分 | Collapse | cmd+ -/+ | |
大小写转换 | Unshelve | cmd+shift+u |
名称 | action | 快捷键 | 备注 |
---|---|---|---|
最近打开的文件 | Recent Files | cmd+e | |
最近编辑的文件 | Recently Changed Files | cmd+shift+e | |
显示使用的地方 | Find Usage | alt+F7 cmd+alt+F7 | |
跳到声明 | declaration | cmd+b | |
跳到实现 | implementation | cmd+alt+b | |
跳到类型声明 | Type declaration | cmd+shift+b | |
跳到父类 | Super Method | cmd+u |
名称 | action | 快捷键 | 备注 |
---|---|---|---|
格式化代码 | Reformat Code | cmd+alt+l | |
移动方法 | Move Statement | cmd+delete+up/down | |
包裹代码块 | Surround With | cmd+alt+t | 添加包裹代码块(if、for、try等) |
反向包裹代码块 | Surround With | cmd+shift+delete | 删除包裹的代码块 |
选择于 | alt+F1 | select Target,可用于快速打开文件目录 | |
弹出VCS操作 | VCS Operations Popup | Ctrl+V | |
查找方法 | Find Action | cmd+shift+a | |
隐藏所有面板 | hide all tool windows | cmd+shift+F12 |
名称 | action | 快捷键 | 备注 |
---|---|---|---|
开关书签 | Toggle Bookmark | F3 | |
用助记符开关书签 | Toggle Bookmark with Mnemonic | cmd+f3 | |
显示书签 | Show Bookmark | shift+F3 |
名称 | 下载 | 备注 | |
---|---|---|---|
CodeGlance | https://github.com/Vektah/CodeGlance | 代码地图 | |
adb-idea | https://github.com/pbreault/adb-idea | 快速清空应用缓存,删除,重新启动,停止 | |
GsonFormat | https://github.com/zzz40500/GsonFormat | json转换对象 |
add:215-11-25
首先在你的username.github.io项目页面,点击settings.Options->GitHub Pages->Custom domain 填写上你需要绑定的域名,然后save. 设置完,你在访问原pages域名应该会自动跳转的你刚填写的域名上,但是没有东西…因为你还没有添加映射.
打开你的域名管理页面.添加一条解析记录.
这样设置完,你就可以通过自己的域名进行访问了.
这个设备提供了2个雷电口(因为有一个雷电口要连接主机,其实只有一个),1个hdmi,3个usb,还有耳机口.
本来是以为可以通过1个HDMI连接一台显示器,再通过一个雷电口转接线,再连接另外一个显示器.谁知道结果是只有一个显示器工作.本来是因为连接线或者显示设备的问题.就一个搜索,后来在thunderbolt-2-dock-TS2(另外一款同类型产品)的官网找到了解释.
要同时支援两个屏幕输出的先决条件为,其中一台必需是Thunderbolt显示器,而另一台则是非Thunderbolt显示器(HDMI, DVI, mDP)。如果想要同时使用两台非Thunderbolt的显示器时,则必须确定在同一个菊链群组中除了TS2还有其他的Thunderbolt设备,再藉由此设备的连接埠串联第二台非Thunderbolt显示器。 (例如,电脑+CalDigit TS2+另一部Thunderbolt设备。)
大致意思就是要想外接两个屏幕有两个方案
总结:单凭一个dock,外接两个显示器,基本上不可行(要不你有苹果显示器,要不你用两个dock组一个群组).而且,这个结论应该是针对同类型的dock,而不止belkin一家.最新款的Thunderbolt™ 3 Express Dock HD with Cable,不再讨论范围内,
这是在一顿查找过程中看到的第二个类型的dock.基于DisplayLink(百度百科)技术.
DisplayLink是一个通过USB接口实现显示器连接到电脑的连接技术,可以非常简单、方便的连接电脑和多个显示设备。该技术可以通过USB接口扩展虚拟的电脑的桌面。目前DisplayLink技术最多可以支持6台显示器同时显示32位色彩的任意分辨率画面。
跟贝尔金们相比,一个是基于雷电接口,一个是基于USB.听起来是low了好多…不过没有连接上的限制.而且目前以前的方案就这两种.于是就入手了一台.
今天刚到货,通过两个HDMI接口,连接两台显示器,然后一个usb连接测试手机,一个usb连接键盘,一个耳机口.基本完成了我之前对belkin所预期的任务.而且现在air还空出来了一个雷电口,爽~
PS:在网上看到说,USB在数据传输上本来不如雷电的,在扩展出去可能会更慢,甚至影响使用.如果你只是需要一个快速传输数据的hub,应该belkin们更适合.
]]>美国当地时间2011年2月24日,英特尔正式发布了已经宣传数月的英特尔实验室产品代号为“Light Peak”技术,并将其命名为“Thunderbolt(雷电)”。Thunderbolt的研发初衷是为了替代并统一目前电脑上数量繁多性能参差不齐的扩展接口,比如SCSI, SATA, USB, FireWire和 PCI Express。Thunderbolt 是苹果与英特尔(Intel)的合作产物,由Intel开发,通过和苹果的技术合作推向市场。
原来不是苹果独家
Thunderbolt连接技术融合了PCI Express数据传输技术和DisplayPort显示技术,由一颗Intel专用控制芯片进行驱动,通过PCI Express x4、DisplayPort总线与系统芯片组相连。其中PCI Express用于数据传输,DisplayPort则用于显示信号传输,亦可通过直接连接英特尔处理器集成图形核心进行DisplayPort显示输出。
所以他可以传输图像,又可以传输数据
Thunderbolt和USB同样是数据端口。英特尔周二宣布,Thunderbolt 3将改变其形式与USB Type-C统一端口。将不再使用以前的方块式的接口,而是兼容USB3.1的标准,但是仍会保留标志性的闪电logo。
Thunderbolt3兼容USB Type-C,就是长的像Type-C 的Thunderbolt3
像给自己的air连接两台显示器.Macbook Air 能否连双显示器(非苹果显示器)?