Blog
Blog copied to clipboard
# OkHttp3 Cache 标签(空格分隔): OkHttp3 --- `okhttp3.internal.http.StatusLine.toString()` `result.append(this.protocol == Protocol.HTTP_1_0?"HTTP/1.0":"HTTP/1.1");` 所以即使网络请求使用了`HTTP/2`,启用了Cache之后,如果服务器使用`HTTP/2`响应`304`,那么Client接收到的依然是`Http/1.1`,`code == 200`的Response。 目前HTTP/2中关于Cache的地方我只发现了可以通过Server Push的方法主动推送资源给Client,其他地方没有改动,所以304响应在OkHttp中可以直接按照Http/1.1返回给上层200,反正这个Lib其实也不是像浏览器一样需要让上层知道304的,上层只需要知道获取资源成功,200即可,其他全部交给OkHttp来处理就好了。 查找源码参照了[TragedyGo](http://www.jianshu.com/p/066e3730ba30)的简书
# docker-nginx-letsencrypt 标签(空格分隔): Docker Nginx LetsEncrypt --- 申请了一个域名,自己配了DNS解析,搞了一个Nginx服务器,顺便加上了LetsEncrypt的HTTPS证书。 好多技术,要是不能自己亲手操作一遍,理解总是会有偏差。 freedom的网站有点诡异哦,看不到注册的入口,只有挑好了想要的域名之后一路下一步,最后就能到注册页面。 在域名提供商处申请好域名后,需要给域名指定要使用的NameServer,就是DNS解析数据的提供商啦。一般的话,默认就使用了域名提供商自己的NameServer了。 NameServer我用了DnsPod的。填写信息的时候发现域名输入没有限制诶,愿意的话输一个`www.baidu.com`也没问题的哦。后来发现输入的是主机记录(域名前缀)。要添加域名的时候则提示已经被占用,注册者的联系方式可以通过WhoIs来查出来。所以想要购买一个已经被占有的域名的时候,可以去WhoIs查查看。 [知乎 · 为什么域名根服务器只能有13台呢?](https://www.zhihu.com/question/22587247)。 之前错误的以为13组域名根服务器里存储了所有的域名信息,犯过这次错才发现不是这样子的,13组根服务器起到的是指路的作用。 不想装LetsEncrypt的CertBot,使用Docker包装一下就省的以后还要考虑卸载什么的。 找到一个自动HTTPS证书自动续期的方案 [Github](https://github.com/gilyes/docker-nginx-letsencrypt-sample) 测试部署的时候可以在Environment里添加`LETSENCRYPT_TEST = true`或`ACME_CA_URI=https://acme-staging.api.letsencrypt.org/directory` 主要方案就是使用Nginx反向代理,启动一个Nginx的容器监听80,443端口,同时,这个Nginx实例还被用来实现实现签发HTTPS证书。 实际的WebContainer运行起来之后,Host的80端口被占用了,每次指定一个不冲突的端口也比较麻烦,直接Expose,容器启动后随机分配一个Host端口,但是这样又给反向代理的配置造成了麻烦,所幸有[Docker-gen](https://github.com/jwilder/docker-gen)可以用来解决这个问题。通过动态生成Nginx配置文件解决了这个问题。 本来我还有一个想法是想在更新HTTPS证书的时候不要中断服务,但是看起来即便使用这个方案,也是可能中断一下服务的。 ``` docker_kill "${_nginx_proxy_container}" SIGHUP ```...
# ArrayMap 和 SparseArray 标签(空格分隔): Android --- 看了好多次,能看懂,但始终不能理解其中设计的精妙。 HashMap是JDK提供的,有一个内部类Node实现了Map.Entry,并且因为要hash的缘故,默认0.75的负载率,让它在内存使用率上是比较低的,优势在于计算一次Hash值,就可以找到数据Index,访问的时候很快。空间换时间。 Android上要考虑的内存效率更高一些,所以HashMap很多时候大材小用了。所以出来一个ArrayMap,使用两个数组保存数据,一个存hash,一个存key和value,查找的时候使用二分法在hash数组查index,找到后使用index去访问数据。因为使用了二分法查找,所以找数据的时候耗时比HashMap多,但是优势是没有Entry包装,内存使用效率更高,因为实现了Map接口,在使用Collection的时候还是需要包装Entry的。 ArrayMap虽然提高了内存的使用效率,但是还有一个问题是使用泛型包装,在操作的时候会有Java的自动拆装箱操作,于是有了SparseArray,针对key是int的情况,避免了自动拆装箱,效率更高,但是适用范围就小了很多。 内存效率是层层递进的,可能是因为这个数据结构使用频率比较高的原因,一直在尝试压榨性能,这样追求极致的态度是值得学习的。
# SourceTree 中创建Bitbucket的PullRequest的一个小BUG 标签(空格分隔): SourceTree --- 前几天发现使用SourceTree里面新建PullRequest的时候,有些情况会跳转错Repo。比如本来是Team的Repo,结果跳转的时候跳到了当前用户,结果就404了。还有本来是Team的一个Repo,Fork了一个Repo也属于Team,但是跳转创建PullRequest的时候跳到了upstream。反正各种不正常。 试试编辑远程仓库,扩展集成那里根据情况配置一下,看看能不能行。 不知道是不是SourceTree的Bug。
# Android External Storage 权限问题 标签(空格分隔): Android --- 4.4以上读写External Storage下的`Android/data/packageName/`是不需要声明权限的。哪怕是使用`new File("/storage/emulated/0/Android/data/packageName", "fileName")`也没有问题。需要注意的是这个文件夹是在调用`getExternalFilesDir()`的时候创建的,如果直接使用File去访问的话是没有这个文件夹的。自己手动建目录也是可以的。卸载这个软件的时候,整个`Android/data/packageName/`都会被删掉。看官方文档有歧义。 > When the user uninstalls your app, the system removes your app's files from here only if you...
# awk 理解 标签(空格分隔): shell --- 团队使用Git在一个Repo中协同开发的时候,使用PR来提交合并请求,合并完开发分支之后,有时候会忘记删除这个分支,所以想找一个批量删除远程分支的方法。 - 删除命令 `git push origin :branch` eg: `git push origin :eric_test`意思就是把一个空的分支推送到`origin`对应的远端仓库的`eric_test`分支,也就是删除啦。 `git push -d origin eric_test` 功能和上边一样的啦 现在的问题就是怎么把要删除的远程分支过滤出来。 [StackOverflow](https://stackoverflow.com/questions/10555136/delete-multiple-remote-branches-in-git)说用`awk`。 `git branch --remote`可以显示远程分支。 使用grep可以筛选出包含特定pattern的分支名,但是会多出remote仓库的别名,比如`origin`。...
# Folat 不能精确表示小数 标签(空格分隔): 基础 --- 计算机界流传着这么一个区别AI与人类的方法: 问: `0.2 + 0.1 = ?` 如果是AI,答案就不是刚刚好0.3。 当然,不是说用电脑的计算器程序算这个结果,而是在编程的时候直接输出`0.1 + 0.2`。 大学学基础课的时候曾经提到过这一点,当时也没有仔细研究,就当是基础概念记住了,小数在计算机中存储会有误差,有些小数不能准确表达。 目前的计算机是使用二进制来存储和表达数据的,十进制的数据在计算机中会被转换为二进制的数据。 整数部分,十进制能表示的最小有效单位是1,二进制也是,我们可以用几个1来表达整数部分, 比如十进制的123,用十进制表达,就是 `1 * 10^2 + 2 * 10^1 + 3...
# Android requestPermission PackageManager.NameNotFoundException 标签(空格分隔): Android Permission --- 父类`BaseActivity`中调用`customMeshod()`然后`requestPermission(...)`,然而子类`XXXActivity`中Override了`customMethod`,在`customMethod`中`finish()`,就会导致申请权限的时候发生`PackageManager.NameNotFoundException`。 如果不是关掉Logcat的Filter,还真不好发现这个问题。
# Android requestLayout 标签(空格分隔): Android Layout --- 1. EditText在ScrollView中,在Focus状态,滑出可视范围。 2. 调用requestLayout的时候 3. 会自动ScrollTo到这个EditText处。 --- [FloatingActionButton取消`layoutDependsOn`SnackBar](https://android.googlesource.com/platform/frameworks/support/+/26c07a84cf70ddf44516f7009fe4ce3b5ed65513%5E%21/#F2) Support 24.2.0 中: > CoordinatorLayout now supports defining inset views, and specifying that other views...
# Android Bitmap与内存 标签(空格分隔): Android 优化 Bitmap 内存 --- 前段时间看到Bugly团队的[Android 内存优化总结&实践](http://chuansong.me/n/1699662351521),里面有一句话是这么说的: > 优化方式:我们通过将这三张图从xhdpi挪动到xxhdpi(当然这里需要看下图片显示效果有没很大的影响),以及在闪屏显示过后回收闪屏图片。 当时没有搞明白为什么资源文件放到不同的文件夹就能导致加载占用内存不同。问了群里的同学,找到了一个关键词`density`。 [Android性能优化之Bitmap的内存优化](http://zhengxiaoyong.me/2016/02/23/Android%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%B9%8BBitmap%E7%9A%84%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96/)中提到了`关于Density、分辨率、-hdpi等res目录之间的关系`。我有一个地方不明白,DensityDPI和分辨率怎么能有直接对应关系呢,毕竟 > densityDpi 是屏幕每英寸对应多少个点(不是像素点) [Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?](http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=403263974&idx=1&sn=b0315addbc47f3c38e65d9c633a12cd6&scene=0#wechat_redirect), 大分辨率也能做到小密度,小分辨率也能做到大密度,和屏幕尺寸相关的呀。 回到问题,这里的关键点其实是`inDensity 和 inTargetDensity`。 从[官方文档](https://developer.android.com/guide/practices/screens_support.html?hl=zh-cn)能获取到res目录和density之间的关系。 > 注意到其中有个 density...