Android Bluetooth
Q1. 连续两次 writeCharacteristic 却只有第一个的回调在进行蓝牙数据读写时会设置一个状态表示正在忙碌,等待数据回调之后该状态会设置成空闲,只有空闲的时候,下一个蓝牙数据读写操作才可以进行。所以,当连续多次 writeCharacteristic 时,可能只回调了一次 onCharacteristicWrite,原因就在于上一次的 write 操作还没有回调,蓝牙处于 busy 状态,没有执行更多的蓝牙操作。
参考:http://a1anwang.com/post-18.html
dotfile
Dotfile经常会遇到以点号开头的文件或者文件夹,比如 .gitignore,.npmignore ,这类文件叫做 **dotfile**。
如果这些文件已经建好了,修改时只要打开编辑即可。但是有时候是需要自己动手创建这些文件的。而在 Windows 中创建以点号开头的文件时,会提示“必须键入文件名”的错误。
因为 Windows 并没有以点号开头文件的习惯,实际上,这样的命名习惯来源于 Linux,Unix 等系统。在这些系统中,以点号开头的文件,也就是 dotfiles,默认是隐藏的,通常作为软件的配置文件名,或者一些临时文件,如文本编辑器的备份文件、历史文件的文件名。随着软件的跨平台,以及软件开发的跨平台,一些原本只见于类 Unix 系统的命名习惯也进入了 Windows,或者说在 Windows 下,有时也需要处理一些以 Unix,Linux 的命名习惯命名的文件。如 .gitignore, .gitattributes 是版本控制系统 git 中用到的配置文件,.npmignore 是 npm 包管理工具所用到的配置文件。
最简单的在 Windows 中创建 dotfile ...
UML
UML总是记不住 UML 那些图例呀,每次要画 UML 图了,就得再上网找一番,索性自己整理一下好了,方便以后查阅。
访问修饰符表示成员变量以及方法前的访问修饰符用符号来表示:
+ 表示 public
- 表示 private
# 表示 protected
类之间的关系各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
泛化关系泛化关系表现为继承非抽象类,也就是 is-a 的关系,e.g.:汽车在现实中有实现,可用汽车定义具体的对象;汽车与 SUV 之间为泛化关系,用一条带空心箭头的直线表示,如下图表示:SUV 继承自汽车,SUV 也是一种汽车。
### 实现关系
实现关系表现为**继承抽象类**,e.g.:“车”为一个抽象概念,无法直接用来定义对象,只有指明具体的子类(汽车还是自行车),才 可以用来定义对象。实现关系用一条带空心箭头的虚线表示。
### 聚合关系
聚合关系表示整体由部分构成,也就是 `has-a` 的关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。例如一个汽车有 ...
Design Patterns
设计模式学习笔记面向对象六大设计原则:
单一职责原则(Single Responsibility Principle,简称SRP)
开闭原则(Open Close Principle,简称OCP):对扩展开放,对修改关闭。
接口隔离原则(InterfaceSegregation Principles,简称ISP):客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
里氏替换原则(Liskov Substitution Principle,简称LSP):所有引用基类的地方必须能透明地使用其子类的对象。也就是,只要父类能出现的地方,子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。
依赖倒置原则(Dependence Inversion Principle,简称DIP):模块间通过接口依赖,实现类之间不发生直接的依赖关系。面向接口编程,或者说是面向抽象编程,这里的抽象指的是接口或者抽象类。
迪米特原则(Law of Demeter,简称LOD)也称为最少知识原则(Least Knowledge Principle ...
Kotlin Study
语法糖表达式和实际调用函数对照表
Git Q&A
误输密码后一直认证失败当 SmartGit 弹出用户名密码时,输错了密码以后不会再弹出用户名密码框而一直认证失败。这时候只要到 控制面板 -> 用户账户 -> 凭据管理器 -> Windows 凭据 里找到需要修正密码的 git 服务器,编辑修改成正确的密码即可。
在 smartgit 同步 github 工程时一直弹框要求输入用户名和密码
前提是有生成 ssh 密钥对了(生成密钥对的时候不要设置密码,当然如果要设置密码的话,就要记住这个密码,后续认证或者同步的时候可能需要输这个密码),然后私钥放在本地电脑的 C:\Users\Administrator\.ssh 下,公钥添加到 github 上。
将工程地址改成 git 开头的,不要用 HTTPS 开头的地址,这样的话 smartgit 就会使用 ssh 密钥对来同步 github 上的工程。两种方式:
第一种方式:在 smartgit 中右击远程分支,选择 Preferences,将地址改成 git 开头的这个时候 smartgit 可能会要求选择私钥文件,如果生成 ssh 密钥的时候有设置密码,就要设置密码 ...
Git LFS
官网:https://docs.gitlab.com/ee/workflow/lfs/lfs_administration.html
首先需要服务端配置支持 LFS(Large File Storage)。
对于客户端:
下载安装:https://git-lfs.github.com/
定位到要支持 LFS 的工程目录下,执行 git lfs install 开启 LFS 功能
执行 git lfs track 命令进行大文件追踪,例如 git lfs track "*.png" 追踪所有后缀为 png 的文件,git 会自动生成 .gitattributes 文件并将 *.png 添加到 .gitattributes 文件中。
执行 git lfs track 可以查看当前追踪哪些类型的文件,即添加到 .gitattributes 文件中的文件类型。
将 .gitattributes 文件提交至仓库。
执行 git lfs ls-files 可以显示当前跟踪的文件列表。
将文件提交到仓库以后,LFS 跟踪的文件在 gitlab 页面上会以『LFS』的形式显示,如 ...
DUKPT
相关概念
DUKPT:Derived Unique Key Per Transaction
BDK:Base Derivation Key,DUKPT 密钥体系的根密钥
IKSN:Initial Key Serial Number
KSN:Key Serial Number,由 IKSN 和 EC 组成
EC:Encryption Counter
IPEK:Initial PIN Encryption Key
PEK:PIN Encryption Key,加密 PIN 的密钥
FK:Future Key
为什么使用 DUKPT在 DUKPT 之前,MK/SK 广泛使用,但是会有个问题,不同的终端使用不同的 MK 的话,当要布放的终端数量比较庞大时,收单行就得维护大量的 MK。DUKPT 就解决了这个问题,因为所有的 key 可以从 BDK 衍生,所以只需维护一个 BDK 就行。
密钥注入过程
Acquirer 给 POS 灌输 BDK
BDK + KSN(EC=0) 派生出 IPEK
IPEK + KSN 派生出 21 个 Future Key,分别存在 POS ...
Android FAQ
Q 1. No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android找到自己本地的 android-sdk:
打开这个目录后,查看 ndk-bundle -> toolchains 里面是否确实缺少 mips64el 相关的文件。
解决办法:
点击这里下载 NDK 包。
解压之后打开 toolchains 文件夹,跟本地 toolchains 文件夹做对比,找到其缺少的文件夹,复制过去。
Q 2. Installation failed with message Invalid File如果设备上应用明明已经卸载了,但是 AS 在 Run 这个应用的时候还是一直提示:
123Installation failed with message Invalid File: xxxx. It is possible that this issue is resolved by uninstalling an existing version of the ap ...
Navigation
向上(Up) vs 返回(Back)看 Principles of Navigation 的时候,有点不明白 Up 和 Back 按钮的区别,查了相关资料以后搞明白了:
Up 按钮用来在应用内,根据应用的逻辑层级进行导航,返回到上一个层级,如果某个屏幕已经是该应用的顶层了 (例如,应用的主页),那不需要 Up 按钮,所以 Up 按钮不会退出应用。
系统的 Back 键则用于按照切换历史返回到之前的屏幕。这种导航基于是基于时间轴的,永远是返回到上一个界面视图,而不是基于应用的逻辑层级。
如果之前的屏幕就是逻辑层次的上一层,那么 Back 和 Up 的行为是一样的。不过和 Up 不同的是,Back 可能回到主屏幕或者其他的应用,Up 回到的屏幕总是在你的应用中。