Netflix公司技术堆栈
网上看到张Netflix(国内称为”奈飞”)的开发技术栈,和国内企业常规比较,感觉也差不多。
1、移动端和WEB端
Netflix 使用适用于 iOS 的 Swift 和适用于 Android 平台的 Kotlin 构建本机移动应用程序。
对于 Web 应用程序,它依赖于流行的 React 框架。
2、前后端通信
Netflix 使用 GraphQL 来优化前端和服务器之间的通信,增强灵活性和效率。
3、后端服务
后端服务由 ZUUL 和 Eureka 等工具组合提供支持,这些工具有助于路由和服务发现。
Spring Boot 框架广泛用于构建健壮的微服务。
4、数据库
数据库方面包括了用于缓存的 EV 缓存、用于可扩展和分布式数据存储的 Cassandra 以及用于全局一致性的 CockroachDB。
5、消息和数据流
也使用的常规Apache Kafka 和 Apache Flink,这两个在管理消息传递和实时数据流方面的作用不用质疑的。
6、视频存储
Netflix 利用 Amazon S3 存储其庞大的视频内容库,确保高可用性和持久性。
CDN方面 ...
Android资源public.xml的使用
开发Android的朋友都知道每个资源都有一个唯一的 ID,是个常量,在打包成apk的时候就已经固定了的。但是工具 apktool 在重新打包 apk 的时候会对资源重新编译 ,编译资源的时候自然需要对所有资源ID进行重新编排,这是一个随机的过程。试想假设原包里面 drawable/a.png id=0x7f020003, 那么重新编排资源ID后就可能是 0x7f020004。又假设原包 0x7f020004 对应图片 b.png,那你重新打包后的 apk 当显示 a.png 的时候就会替换成 b.png,这还好不会出错,倘若生成的一个 id 原包不存在,那会导致程序崩溃的!
到这里,为了解决这个问题,public.xml就派上用场了,它的作用就是固定资源R的ID值。
平时应用开发时候基本看不到这个文件,只有使用apktool后,在 res/values/目录下会自动生成一个 public.xml文件,里边的值就与R文件、资源相关。
在 framework 开发时候,遇到一些资源要固定 ID,就可以用 /frameworksbase/core/res/res/values/public ...
安卓调整power键连击事件
在framework中找到 PhoneWindowManager.java,具体文件:
1base/services/core/java/com/android/server/policy/PhoneWindowManager.java
然后找到有个专门处理多次点击关机按钮事件的方法 powerMultiPressAction,然后根据自己需要调整代码。
123456789101112131415161718192021222324252627282930313233343536private void powerMultiPressAction(long eventTime, boolean interactive, int behavior) { // LXB PATCH BEGIN switch (behavior) { case MULTI_PRESS_POWER_NOTHING: break; case MULTI_PRESS_POWER_THEATER_MODE: ...
Kotlin各种主构造函数区别
12345class MyClass constructor(i:Int) // 1class MyClass(i:Int) // 2class MyClass(val i:Int) // 3class MyClass(var i:Int) // 4class MyClass(private val i:Int) // 5
以上是 Kotlin 主构造函数的几种写法,区别在于:
1、1和2写法是一个意思,平时为方便,基本都用第二种,但在一些特定情况下,必须使用第一种,比如有注释限定符(如@Inject等)、可见性修饰符(如private等)。
2、3和4写法也是一样的,除了属性getter和setter生成区别。var表示该属性可以被修改,val表示该属性不能被修改,所以对应的 val i:Int 只会生成 getter 方法,var i:Int 会同时生成getter 和 setter 方法。
3、2与3/4的区别在于: class MyClass(i:Int) 这种写法的参数 i 只能在构造期间使用,你可以 ...
NumPy函数速查表(markdown)
内容整理自Numpy API 速查表 - 知乎 (zhihu.com),整理成MD文档。
1、创建数组1.1 用1和0创建数组
empty(shape[, dtype, order])
返回给定形状和类型的新数组,而不初始化条目。
empty_like(a[, dtype, order, subok])
返回与给定数组形状和类型相同的新数组。
eye(N[, M, k, dtype, order])
返回对角线上为1、别处为0的二维数组。
identity(n[, dtype])
返回标识数组。
ones(shape[, dtype, order])
返回给定形状和类型的新数组,其中填充了一个。
ones_like(a[, dtype, order, subok])
返回与给定数组形状和类型相同的数组。
zeros(shape[, dtype, order])
返回给定形状和类型的新数组,用零填充。
zeros_like(a[, dtype, order, subok])
返回与给定数组形状和类型相同的零数组。
full(shape, f ...
Android开发常见问题记录
Logcat 频繁 “Unexpected EOF!”这是由于 Logcat 的缓存区写满了导致的查看 Logcat 缓存区大小:
1adb logcat -g
修改 Logcat 缓存区大小:
1adb logcat -G 2M
这里我将其指定为 2M,这个值可根据自己的需要设置。
Android用命令行查看手机架构
电脑连接上手机,直接输入:
1adb shell getprop ro.product.cpu.abi
如果你想查看该手机支持的全部架构,则输入:
1adb shell getprop ro.product.cpu.abilist
查看结果如下:
用adb命令添加、替换Android系统应用
用adb名了添加或者替换系统应用,首先是要拿到root权限,然后安装的应用必须签名和系统应用签名一致。
这里可以将下边的命令写成一个bat脚本文件,需要时候直接双击执行即可。
1234567891011121314adb connect x.x.x.xadb rootadb remountadb shellcd /system/apprm -r XXX.apkexitadb rootadb remountadb push ./XXX_X.apk /system/appadb shellcd /system/appchmod 777 XXX_X.apkreboot