1. ? !! !
val str:String! = “” //无法声明,临时变量,说明这是Kotlin调用Java代码产生的,如果要使用,最好用可空类型
val str:String? = “” //可空类型
val str:String!! = “” //1.强制转换;2.不能为空
提取签名jar xf HelloWorld.apk META-INF/CERT.RSA
打印签名keytool -printcert -file CERT.RSA
打印公钥,签名用的公钥keytool -printcert -file CERT.RSA -rfc
,或者导出到一个文件keytool -printcert -file CERT.RSA -rfc > my_pub.key
相同的签名的不同版本APK应用相同的md5,sha1,sha256指纹,代表同一个公钥签名。
指纹就是用散列算法计算公钥的文本,rfc格式(带有
-----BEGIN CERTIFICATE-----
和-----END CERTIFICATE-----
)。
使用上面步骤得到的my_pub.key,验证md5。实际工作中不需要,工具都帮我们做好了。
1 | openssl x509 -noout -fingerprint -md5 -inform pem -in my_pub.key |
keystore中有多个公钥秘钥对,一个对就是一个alias, 每个的访问密码不同。
keytool -list -keystore my.keystore -alias myAlias
输入库密码可以看到公钥的指纹。
jarsigner -verbose -keystore my.keystore -signedjar ma_app_signed.apk my.apk myAlias
默认Android Stuido Debug时会自动签名(这个是IDE生成的,gradle命令行不会自动生成签名),用的keystore是没有密码的,但是有时候我们调试第三方登录,需要固定的签名,所以就自己生成签名,覆盖默认的Debug的签名。
$ keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "C=US, O=Android, CN=Android Debug"
https://gist.github.com/henriquemenezes/70feb8fff20a19a65346e48786bedb8f
这里需要注意的是,如果用的JDK8里面的keytool生成的keystore是没有问题的。但是用JDK11里面的keytll生成keystore会报错:Invalid keystore forma。两种方案:
1 | function Foo(a){ |
我记得构造函数首字母要大写,但是发现现在不大写也可以,最好大写吧。
new 的作用:
__proto__
的属性指向构造函数的protoType
js中的继承是原型链,就是GrandFather grandFather<-Father father<-Son son
.它们之间靠__proto__联系在一起。就是
1 | son.__proto__ === Son.ProtoType |
由于js查找属性时,按照这个原型链去查,一直能查到祖父。
__proto__
1 | var p ={ |
js的属性分为自己的(Object.getOwnerPropety()
)和继承的(Object.getPrototypeOf()
)
循环遍历属性有几个特殊的地方:
1 | // 使用上面的b这个例子 |
1 | Object.keys(b) //只会打印 isHuman, name |
我很少写原生的js了,大部分是用TS,写多了TS,这些都忘记了。
我用系统升级的提示框升级了,看到了升级了mysql-server到5.7,然后apt-get autoremove时,发现mysql-server的配置错了,在/etc/mysql/
下有一个debian.cnf
的配置文件,这个是mysql的维护用户,可以用来做profile的。按照里面的配置去mysql的数据库更新下密码就正常了。
注意mysql的密码插件的强度提示,可以手工降低后再修改密码。
1 | # 首先登陆mysql命令行 |
之后还是手工升级保险一点。
由于phantomjs发现不了exports,所以需要把转换后文件的第一行去掉。方法是在ts文件最上面加上export = 0;
。
//issue: don’t add Object.defineProperty(exports, “__esModule”, { value: true });
//https://github.com/Microsoft/TypeScript/issues/14351
"noEmit":true
这个配置就不会产生输出文件了。
1 | { |
当我们import xx from ‘module’时,等价于var xx = require(‘module’).default。
当我们import {A,B,C} from ‘module’时,等价于 var {A,B,C} = require(‘module’)
当我们export modue时,等价于 export.module = module
当我们export default module时, 等价于 export.default = module
当我们export = module时, 就是最特殊的情况,因为没有default了,也没有其它的export.xx了。
总结一下,node legacy没有那个default的概念,但是用TypeScript时有了这个default的概念,为了保持兼容性,就把这个esModuleInterop
设置为true,起的效果就是当遇到没有default的情况,给它用{deault: moduel}包装下,那么都会有default这个值了,避免了default是undefined的情况。
使用brew
1 | brew install emacs --with-cocoa |
C-h t # 打开tutorial
原来是用的prelude,后来发现太重,反应有点慢。因为我主要是为了python,所以重新配置。参考了几篇文章:
1 | (setq python-shell-interpreter "ipython" |