Swift Practices & Perls (2)


下文部分内容成于2018年


本文继续上一篇Swift Practices & Perls (1), 记录标准库学习过程中的技巧.

标准库拾遗

Swift 标准库提供的 API 强大而优雅. 这里归纳总结了一些网上不常见的点.

String和其他类型之间的转换

一方面, 标准库中存在多个 protocol, 来关联自定义类型和String. 通常, 在需要按文本格式打印某个对象, 或涉及到用文本进行序列化/反序列化时, 可能会使用到这些 protocol.

  • ExpressibleByStringLiteral (旧名StringLiteralConvertible). 遵循该 protocol 的类型, 支持使用 string literal 初始化.
  • CustomStringConvertibleCustomDebugStringConvertible. 支持最基本的输出到一个String.
  • LosslessStringConvertible. 该 protocol 继承自 CustomStringConvertible. 与后者不同的是, 该 protocol 的遵循者必须提供和String之间双向的精确转化. 因此某种意义上说, 遵循本 protocol 的类型转化成的String可用范围更广, 不限于 debug/print. 因为不用担心2个不同的对象对应到同一个String.
  • TextOutputStreamable. 支持按流式增量添加到已有的 stream 的末尾. 因为支持增量添加, 所以遵循者实际实现时, 可能和其他输出String的 protocol 相比, 内存占用上可以有一些优化.

另一方面, String本身也存在好几种 initializer. 标准库建议我们使用String的各种初始化方法, 而不要直接调用上面各个 protocol 定义的方法.

  • init<T>(_ value: T, radix: Int = default, uppercase: Bool = default). 把Int按某个进制转换成String.
  • init<T>(_ value: T) where T : LosslessStringConvertible.
  • init<Subject>(describing: Subject). 优先使用TextOutputStreamable的实现, 最后使用CustomDebugStringConvertible的实现, 偏向精准性.
  • init<Subject>(reflecting: Subject). 优先使用CustomDebugStringConvertible, 最后使用TextOutputStreamable, 偏向debug.

Comparisons

在STL中, 并非所有可比的对象都直接遵循Comparable, 但一定要求最终的底层 element 对象是遵循的.
对于不直接遵循Comparable的类型来说, 他们比较各自对象的方式无外乎通过 operator 或 method.

Read More

Image Orientation


原文成于2018年12月


背景

为什么存在 Image Orientation

传统相机

  • 传统相机横向拍摄, 胶卷和照片也按横向方位固定尺寸.
  • 拍竖直方向的景的时候, 摄影师把相机旋转90度, 拍到的原始照片是横向的.
  • 要正确还原现场的情况, 需要手动把照片旋转90度.

DSLR

  • 用户的持相机方式和需求没有本质变化.
  • 仍然需要外部额外信息来帮助确定怎么旋转拍得的图像.
    • 用户使用相机上的 UI, 手动输入旋转信息.
    • 根据硬件的重力加速计自动确定方向.
  • 基于性能和效率原因, 并不会把 raw data 进行旋转生成一张新图片, 而是加上一个 tag, 这个 tag 就表示 image orientation.
  • 各端显示这样的图片时, 需要读取这个 tag, 并在渲染时给 raw data 加上一个 transform.

对图像算法的影响

当对某个图像执行某些算法时, 除了必要的图像 data 信息, 还可能需要已知的 orientation 信息. 例如很多人脸检测算法, 在有先验的 orientation 知识时, 通常能有更好的效果. 例如, Apple 的 CoreImage 支持人脸检测, 其 API 接受 orientation 参数.

Read More

Computer Security Notes


原文成于2019年


密码学概念

  • 对称加密
    • 需要 private 通道传递密钥.
  • 非对称加密
    • 实现 encryption (保证发送的东西没有别人知道): 传递方用接收方发布的公钥加密, 接收方用私钥解密.
    • 实现 authentication (保证发送的人不会是别人): 传递把 message 用自己的私钥加密, 作为 signature 和 message 一起发给接收方, 接收方收到后用传递方早前公开提供的公钥对 signature 进行解密, 验证能还原到 message.
  • 混合加密: 用对称秘钥加密明文, 并用非对称秘钥加密对称秘钥.

Read More