Around Alias

Ruby 中的环绕别名 (around Alias) 带来的一系列 Google 先来看一段代码,体验一下什么是环绕别名 (around Alias) : class String alias :old_length :length def length "Length of'#{self}'is: #{old_length}" end end "abc".length #=> "Length of'abc'is: 3" 后面去 RubyChina 学习发现这是一种 Alias method chain pattern, 在 Rails3 中使用非常广泛,在 Rails5 上面被 prepend 替代了。在 Ruby 2.0 出来之前,Alias method chain pattern 这种做法在 Rails3 ActiveSupport 提供了 alias_method_chain 来辅助实现。 归根结底: 通过环绕别名,既修改了自己的逻辑,又不需要调用者更改自己的代码 什么是 alias_method_chain 很多人都很迷茫,不知道这个方法怎么用,所以栈爆网有这么一个问题: Ruby on Rails: alias_method_chain, what exactly does it do? when would you use alias_method_chain and why?……

阅读全文

Best Practice about ROR

[TOC] About ruby 带 block 遍历数组应该使用 each 而不是 for before: 这里需要遍历数组并且打印 for elem in [1, 2, 3, 4, 5] puts elem end Ruby 里面使用 each 带一个 block是一个更有效率的做法 after: [1, 2, 3, 4, 5].each do |elem| puts elem end 还可以变得更简单一点: [1, 2, 3, 4, 5].each { |elem| puts elem } 收集结果(遍历数组元素的处理结果)使用 map 而不是 each + << 这里希望收集数组中特定元素的大写形式 before: result = [] ['biology', 'english', 'Math'].each do |major| next if major.……

阅读全文

初步了解使用 go AST 知识

最近遇到一个需求需要解析 Golang 项目中的 interface 并且自动生成 gomock 相关的文件。 第一个版本简单粗暴,但是我这只菜鸡不会写 shell :( sed -n 's/^type \([A-Z][^[:space:]]*\) interface .*/\1/p' "interfaces.go" 第二个版本: 使用 go AST 解析 go file 自动生成,轮子可以看 代码 下面进入正题,什么是 AST,这个包使用的背景和基本知识有哪些,请先看看以下文档: go/ast - goc AST wiki AST 是什么? AST 是 抽象语法树(Abstract Syntax Tree)缩写,在计算机科学中,是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于 if-condition-then 这样的条件跳转语句,可以使用带有两个分支的节点来表示。 当我们对源代码语法分析时,其实我们是在程序设计语言的语法规则指导下才能进行的。我们使用语法规则描述该语言的各种语法成分的是如何组成的,通常用前后文无关文法或与之等价的Backus-Naur 范式(BNF) 将相应程序设计语言的语法规则准确的描述出来。 了解 Go 对应的语法规则,就能对 Go 代码进行语法分析,当然完成最上面的需求就很简单了 Go 的 AST 是什么? 一般来说,需要词法分析,然后进行语法分析。Go 的 AST library 能够将 Go 文件 或者 包含 Go 文件目录 作为输入,使用 Scaner 分析生成 token,然后将 token 送进 Parser 变成语法树……

阅读全文

Kubectl wiki

基于 kubernetes v1.14.3 版本 1. basic kubectl 命令行语法: $ kubectl [command] [TYPE] [NAME] [flags] 1) command: 子命令,用于操作 K8s 集群资源对象的命令,例如 create/delete/describe/get/apply 2) TYPE: 资源对象的名称,区分大小写,能以单数形式、复数形式或者简写形式表示 以下 3 种 TYPE 是等价的: - kubectl get pod pod1 - kubectl get pods pod1 - kubectl get po pod1 3) NAME: 资源对象的名称,区分大小写。如果不指定名称,则系统将返回属于 TYPE 的全部对象列表 4) flags: kubectl 子命令的可选参数 获取 kubectl 可操作的资源对象列表: kubectl api-resources NAME SHORTNAMES APIGROUP NAMESPACED KIND bindings true Binding componentstatuses cs false ComponentStatus configmaps cm true ConfigMap endpoints ep true Endpoints events ev true Event limitranges limits true LimitRange namespaces ns false Namespace nodes no false Node persistentvolumeclaims pvc true PersistentVolumeClaim persistentvolumes pv false PersistentVolume pods po true Pod podtemplates true PodTemplate replicationcontrollers rc true ReplicationController resourcequotas quota true ResourceQuota secrets true Secret serviceaccounts sa true ServiceAccount services svc true Service mutatingwebhookconfigurations admissionregistration.……

阅读全文

new 与 make 的差别

Go语言中new和make是内建的两个函数,主要用来创建分配类型内存 new(T) 返回的是 T 的指针 这是 new 函数的注释: // The new built-in function allocates memory. The first argument is a type, // not a value, and the value returned is a pointer to a newly // allocated zero value of that type. func new(Type) *Type new(T) 为一个 T 类型新值分配空间并将此空间初始化为 T 的零值,返回的是新值的地址,也就是 T 类型的指针 *T,该指针指向 T 的新分配的零值 对于有哪些零值可以看看 之前的博客 里面有基础类型的零值 make make 函数的注释: The make built-in function allocates and initializes an object of type slice, map, or chan (only).……

阅读全文

Go 内存排布

Go 内存布局 了解对象内存布局,有助于深入理解 Go 语言本身,写出更漂亮的代码 基本类型 类型 长度 默认值 说明 bool 1 false byte 1 0 uint8 rune 4 0 Unicode point, int32 int/uint 4⁄8 0 32位/64位 int8/uint8 1 0 -128~127, 0~255 Int16/uint16 2 0 -32768~32767, 0~65535 Int32/uint32 4 0 -21亿~21亿, 0~42亿 Int64/uint64 8 0 float32 4 0.……

阅读全文

DNS 域名系统

DNS (Domain Name System)的作用,就是根据域名查出 IP 地址,是把 www.example.com 等域名转换成 IP 地址。 域名系统是分层次的,一些 DNS 服务器位于顶层。当查询(域名) IP 时,路由或 ISP 提供连接 DNS 服务器的信息。较底层的 DNS 服务器缓存映射,它可能会因为 DNS 传播延时而失效。DNS 结果可以缓存在浏览器或操作系统中一段时间,时间长短取决于 存活时间 TTL。 CloudFlare 等平台提供管理 DNS 的功能。某些 DNS 服务通过集中方式来路由流量: 加权轮询调度 防止流量进入维护中的服务器 在不同大小集群间负载均衡 A/B 测试 基于延迟路由 基于地理位置路由 一些缺陷: 虽说缓存可以减轻 DNS 延迟,但连接 DNS 服务器还是带来了轻微的延迟 虽然它们通常由政府,网络服务提供商和大公司管理,但 DNS 服务管理仍是复杂的 DNS 服务最近遭受 DDoS 攻击,阻止不知道 Twitter IP 地址的用户访问 Twitter 延伸阅读: DNS 架构 DNS wiki 关于 DNS 的文章 查询过程 虽然只需要返回一个 IP 地址,但是 DNS 的查询过程非常复杂,分成多个步骤。……

阅读全文

从入门到放弃 - Raft

根据 Raft 中文翻译和各种来源,按照自己更好理解的方式进行重新组织和增加一些说明 [TOC] TL;DR 根据作者的话来说,Raft 算法是为了 寻找一种易于理解的一致性算法,作为管理复制日志的一致性算法,提供了和 Paxos 算法相同的功能和性能。(顺带吐槽 Paxos 难以理解) Raft 算法为了能够更佳方便理解,采用两种通常适用的技术: Raft 算法被分成领导人选举,日志复制,安全性和角色改变几个部分 通过减少状态的数量来简化需要考虑的状态空间,使得系统更加连贯并且在可能的时候消除不确定性 1. 复制状态机 一致性算法是从复制状态机的背景下提出的。一组服务器上的状态机产生相同状态的副本,并且在一些机器宕掉的情况下也可以继续运行。复制状态机在分布式系统中被用于解决很多容错的问题 大规模的系统中通常都有一个集群领导者,像 GFS、HDFS 和 RAMCloud,典型应用就是一个独立的的复制状态机去管理领导选举和存储配置信息并且在领导人宕机的情况下也要存活下来。比如 Chubby 和 ZooKeeper。 图 1 :复制状态机的结构。一致性算法管理着来自客户端指令的复制日志。状态机从日志中处理相同顺序的相同指令,所以产生的结果也是相同的 复制状态机通常都是基于复制日志实现的,如图 1。每一个服务器存储一个包含一系列指令的日志,并且按照日志的顺序进行执行。每一个日志都按照相同的顺序包含相同的指令,所以每一个服务器都执行相同的指令序列。因为每个状态机都是确定的,每一次执行操作都产生相同的状态和同样的序列 保证复制日志相同就是一致性算法的工作了。在一台服务器上,一致性模块接收客户端发送来的指令然后增加到自己的日志中去。它和其他服务器上的一致性模块进行通信来保证每一个服务器上的日志最终都以相同的顺序包含相同的请求,尽管有些服务器会宕机。一旦指令被正确的复制,每一个服务器的状态机按照日志顺序处理他们,然后输出结果被返回给客户端。因此,服务器集群看起来形成一个高可靠的状态机 实际系统中使用的一致性算法通常含有以下特性: 安全性保证(绝对不会返回一个错误的结果):在非拜占庭错误情况下,包括网络延迟、分区、丢包、冗余和乱序等错误都可以保证正确。 可用性:集群中只要有大多数的机器可运行并且能够相互通信、和客户端通信,就可以保证可用。因此,一个典型的包含 5 个节点的集群可以容忍两个节点的失败。服务器被停止就认为是失败。他们当有稳定的存储的时候可以从状态中恢复回来并重新加入集群。 不依赖时序来保证一致性:物理时钟错误或者极端的消息延迟只有在最坏情况下才会导致可用性问题。 通常情况下,一条指令可以尽可能快的在集群中大多数节点响应一轮远程过程调用时完成。小部分比较慢的节点不会影响系统整体的性能 2. Raft 一致性算法 Raft 算法将系统中的角色限定为: 领导者(Leader)、跟从者(Follower)和候选人(Candidate) Raft 通过选举一个领导者,然后给予他全部的管理复制日志的责任来实现一致性。领导人从客户端接收日志条目,把日志条目复制到其他服务器上,并且当保证安全性的时候告诉其他的服务器应用日志条目到他们的状态机中。拥有一个领导人大大简化了对复制日志的管理。 领导人可以决定新的日志条目需要放在日志中的什么位置而不需要和其他服务器商议,并且数据都从领导人流向其他服务器 一个领导人可以宕机,可以和其他服务器失去连接,这时一个新的领导人会被选举出来 Raft 算法通过领导人的方式,将一致性问题分解成了三个相对独立的子问题: 领导选举(Leader election):一个新的领导人需要被选举出来,当现存的领导人宕机的时候 日志复制(Log replication):领导人必须从客户端接收日志然后复制到集群中的其他节点,并且强制要求其他节点的日志保持和自己相同。 安全性(Safety):在 Raft 中安全性的关键是状态机安全:如果有任何的服务器节点已经应用了一个确定的日志条目到它的状态机中,那么其他服务器节点不能在同一个日志索引位置应用一个不同的指令。 为了一些可用性问题,额外考虑了:……

阅读全文

知名公司工程博客

Airbnb Engineering Atlassian Developers Autodesk Engineering AWS Blog Bitly Engineering Blog Box Blogs Cloudera Developer Blog Dropbox Tech Blog Engineering at Quora Ebay Tech Blog Evernote Tech Blog Etsy Code as Craft Facebook Engineering Flickr Code Foursquare Engineering Blog GitHub Engineering Blog Google Research Blog Groupon Engineering Blog Heroku Engineering Blog Hubspot Engineering Blog High Scalability Instagram Engineering Intel Software Blog Jane Street Tech Blog LinkedIn Engineering Microsoft Engineering Microsoft Python Engineering Netflix Tech Blog Paypal Developer Blog Pinterest Engineering Blog Quora Engineering Reddit Blog Salesforce Engineering Blog Slack Engineering Blog Spotify Labs Twilio Engineering Blog Twitter Engineering Uber Engineering Blog Yahoo Engineering Blog Yelp Engineering Blog Zynga Engineering Blog ……

阅读全文

Linux 常用命令 find

查找指定文件名的文件(不区分大小写) find -iname [filename] 对找到的文件执行某个命令 find -iname [filename] -exec md5sum {} \; 查找目录下的所有空文件 find [dir] -empty 按照文件权限来查找文件 find [dir] -perm [mode] –print 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前 find [dir] -mtime -5 –print 查找更改时间比文件file1新但比文件file2旧的文件 find [dir] -newer file1 ! file2 根据类型查找 -type find [dir] -type d –print b - 块设备文件 d - 目录 c - 字符设备文件 p - 管道文件 l - 符号链接文件 f - 普通文件 忽略某个目录……

阅读全文