Asymmetric Revocable Commitments 是 Lighting Network 的基础,是非对称加密技术很巧妙的应用。它用于互不信任的双方在链下通过协商完成一系列交易。最终需要提交到链上的只需要最初的创建和最后的结算两个交易,大大提高了交易处理速度。

  • 11 点睡觉,7 点起床
  • 坚持锻炼。主要是跑步,大概每周 20 公里,天气不好就玩 Just Dance 代替。游泳,大概每周 5 公里。
  • 前一天晚上做好第二天的计划。这样起床后就可以直接开始做重要的事情。
  • 将每天分成时间块,用三餐时间分隔成 1+3+3+3 共 4 块,10 小时。重要的事情在日历软件上标注出时间块。比较固定的安排
    • 早晚查两次邮件。
    • 早上学习一项对自己职业来说最重要的事情,比如学习一项新技术。
    • 上午用于工作中最重要的事情。
    • 下午是较次要技术的学习,继续工作
    • 晚上一项个人兴趣爱好
  • 优先做重要的事,看 RSS 阅读器中的文章,看新闻等琐碎的事情总会在精力不那么充沛的下午和晚上找到时间。
  • 提前为计划的事情做好准备工作。比如第二天要跑步,就把手表,MP3 充好电,衣服鞋子准备好。
  • 每天进步一点,并记录完成情况。完成条件都很宽松,关键是每天都有在做。
    • 完成一项关键项目中的任务。关键项目是对自己非常重要的事情,比如职业规划上的关键技术的学习等,个人的兴趣爱好的学习。
    • 读一页非技术书。
    • 学习一组 Flash Cards,或者用 Duolingo 学一节课。
  • 跟踪时间,知道时间花在哪里了。
  • 同类的项目,同时进行 2 项,比如同时学习两项关键技术,两个兴趣爱好,然后交叉进行,避免每天都重复同样的事情而枯燥。
  • 开始任务后计时,发现超过 1 个小时了就休息会。不会特意提前定好要坚持多久,根据精力灵活调整。
  • 工具和设备
    • OmniFocus 任务管理
    • Calendar 日历软件
    • Tyme2 手动任务计时,有时候忘了记可以通过 Timing 的记录补下。
    • Timing 自动记录电脑上各个软件的使用时间,已经不同网站的访问时间。
    • Focus 屏蔽指定软件启动,禁止访问指定网站。
    • 索尼 WS414,跑步可以不用带手机,游泳也能听歌。
    • 阅读:
      • Kindle 读 Instapaper 保存的文章,JD Read 读非技术书籍。
      • Medium 上的文章使用 Medium 的书签管理稍后读列表
      • 新闻:财新,澎湃,东方体育

最近在一个 Ruby on Rails 项目中需要集成各种支付系统。这些系统多使用 RSA 进行加密和签名验证。不过提供的 RSA Key 格式公式个样,所以把各种格式和如何在 Ruby 中读取整理了一下。

RSA 是非对称加密算法,需要 2 个 Keys, 私钥和公钥。Key 本身就是二进制字符串,不过会被编码成各种格式。

zfs 会在访问文件时记录下问题文件,也可用使用 scrub 来扫描文件,其中 poolname 是卷名。

zpool scrub poolname

问题文件可以通过 status 列出

zpool status -v

错误比较多的话,可以考虑通过镜像还原。

zfs rollback poolname/path@tag

少的话也可以手动恢复问题文件。

错误中不是 / 开头,而且带有 @tag 这样标签的是 ZFS 镜像。镜像本质是备份,备份出错了可能最简单的办法就是删除了,下面的命令用于删除镜像

zfs destroy poolname/path@tag

错误比较少,文件不重要可以删除,如果重要并且有备份可以从备份中恢复。不过被删除或者被覆盖的文件不会立即被释放,如果想请空 zpool status -v 中已删除文件的错误,可以执行 zpool scrub poolname,等几分钟再通过 zpool scrub -s poolname 停止。

iOS 的通知可以按 App 配置

  1. 是否显示图标上的未读数角标
  2. 是否显示横幅提醒
  3. 横幅提醒是自动消失还是必须要点击才会消失
  4. 是否显示在通知中心
  5. 是否播放通知提示音

我的配置是绝大多数关闭,然后根据使用场景可以把 App 划分为几类,分别配置不同的策略。

填半年前挖的坑。分享 Lua C API 中的 userdata 和 light userdata。

在编程过程中,经常会需要给一块数据分配一个唯一句柄,通过句柄能够读取或者操作这块数据。原因主要有:

  • 数据内聚性很强,封装在一起方便传递,减少参数数量。
  • 隐藏数据的内部结构,通过 API 提供操作接口。
  • 减少数据拷贝。

最典型的就是 C 中的指针了。但句柄并不一定就必须是指针,比如 Linux 系统中的 fd 可以当作是 IO 设备的句柄。

在 Lua C API 中提供了 userdata 和 light userdata 可以让 C 返回一个句柄给 Lua,而 Lua 可以将句柄再通过在 C 中注册的方法传回 C。

Lua Userdata

这是 Graylog 系列最后一篇。

日志集中保存到 Graylog 后就可以方便的使用搜索了。不过有时候还是需要对数据进行近一步的处理。主要有两个途径:

  • 直接访问 Elastic 中保存的数据
  • 通过 Graylog 的 Output 转发到其它服务

Graylog 通过 Input 搜集日志,每个 Input 单独配置 Extractors 用来做字段转换。

Graylog 中日志搜索的基本单位是 Stream,每个 Stream 可以有自己单独的 Elastic Index Set,也可以共享一个 Index Set。用 Set 是因为日志的保存会使用一个前缀然后滚动创建新的 Index。Stream 通过配置条件匹配日志,满足条件的日志添加 stream ID 标识字段并保存到对应的 Elastic Index Set 中。同一个 Input 中的日志可以属于不同的 Stream,不同 Input 中的日志可以属于同一个 Stream,就是同一条日志也可以属于多个 Stream。

系统会有一个默认的 Stream,所有日志默认都会保存到这个 Stream 中,除非匹配了某个 Stream,并且这个 Stream 里配置了不保存日志到默认 Stream。

下图是日志处理流程图

Graylog 日志处理

后文会分别分享各个步骤需要注意的一些地方。

Graylog 通过 Inputs 收集日志,方式以被动接收为主,需要在产生日志的地方将日志发送给 Graylog。比较常用的一些方式:

  • 程序中直接集成可以发送日志给 Graylog 的库,在 Github 中搜索 GELF 可以找到大量各种语言、框架、环境下的库。
  • 采用传统的文件来记录日志,在机器上启动一个 agent 程序抓取日志文件新的内容然后发给 Graylog。
  • 使用 syslog 写日志,利用 rsyslog 的转发功能把日志发给 Graylog。

服务器端日志个人推荐最后一种方式,优点有

  • 不依赖 Graylog,可以替换成任何能接收 syslog 的其它方案。
  • 容易 Fallback,rsyslog 可以配置成同时保存到本地文件和转发 Graylog。当 Graylog 出现问题至少还有本地日志文件可以用。
  • rsyslog 的日志保存,转发已经非常成熟和稳定。

缺点是 rsyslog 日志会把整条日志作为 message 字段保存。Graylog 内部每条日志是作为 Elastic 的 Document 保存的,细化出更多的字段能满足复杂查询和数据分析的需求。所以 Graylog 基于 JSON 制定了 GELF 协议,使用 GELF 协议的 Input 可以在产生日志时直接设置各种字段。不过 Graylog 还提供了 Extractor,和 fluentd, logstash 中的 filter 相似,可以从日志中提取结构化字段出来,比如 JSON Extractor 可以解析 JSON 格式日志。使用过类似工具的应该对 Grok 很熟悉,Graylog 也提供了支持。所以使用 rsyslog 也只需要制定下日志格式,然后配置下 Extractor。

Graylog 自带了丰富的 Inputs 可供使用,同时可以通过插件扩展,可以结合自己的使用场景选择合适的方式。

本文接下来会介绍日志收集需要注意的地方,以及如何基于 rsyslog 来打造集中日志系统。

如果想在已有的 Rails app 上使用其它语言加些 API,同时能直接使用 Rails 的登陆信息,最简单的就是用 Nginx 等代理将不同的服务映射到相同的域名下,其它的 App 解密 Cookie 获得登陆信息。

本文以 Ruby 代码为例说明 Rails 的 Cookie 是如何加密,然后以 Go 为例说明如何解密的。

Rails Cookie 加密