1. Go并发编程基础(译)

    原文:Fundamentals of concurrent programming

    译者:youngsterxyf

    本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖:

    • 运行期并发线程(goroutines)
    • 基本的同步技术(管道和锁)
    • Go语言中基本的并发模式
    • 死锁和数据竞争
    • 并行计算

    在开始阅读本文之前,你应该知道如何编写简单的Go程序。如果你熟悉的是C/C++、Java或Python之类的语言,那么 Go语言之旅 能提供所有必要的背景知识。也许你还有兴趣读一读 为C++程序员准备的Go语言教程为Java程序员准备的Go语言教程

    1. 运行期线程

    Go允许使用go语句开启一个新的运行期线程,即 goroutine,以一个不同的、新创建的goroutine来执行一个函数。同一个程序中的所有goroutine共享同一个地址空间。

    Goroutine非常轻量,除了为之分配的栈空间,其所占用的内存空间微乎其微。并且其栈空间在开始时非常小,之后随着堆存储空间的按需分配或释放而变化。内部实现上,goroutine会在多个操作系统线程上多路复用。如果一个goroutine阻塞了一个操作系统线程 …

    标签: 翻译 Golang
  2. 中心化日志记录架构(译)

    原文:Centralized Logging Architecture

    译者:youngsterxyf

    中心化日志记录一文中,我介绍了几个工具,用于解决中心化日志记录的问题。但这些工具一般仅能解决这个问题的一部分, 这意味着需要综合使用几个工具来构建一个健壮的解决方案。

    你需要解决问题的这几个主要方面:收集传输存储、以及分析。某些特殊的应用场景下,也许还希望具备告警的能力。

    收集

    应用程序以不同的方式产生日志,一些是通过syslog,其他一些是直接写到文件。考虑一个运行在linux主机上的典型web应用,在/var/log目录会有十几个甚至更多的日志文件, 如果一些应用指定日志存放在HOME目录或者其他位置,则这些目录下也是如此。

    如果你正在运营一个基于web的应用,开发人员或者运维同事需要快速地访问日志数据以便对线上问题进行排错,那么就需要一个能够近乎实时监控日志文件变化的方案。 如果使用基于日志拷贝的方式 --- 文件以固定的时间间隔拷贝到一台中心服务器上,那么仅能检查与复制操作频率相同的新增日志数据。当站点已经挂掉,而你正在等待相关日志数据的复制, 那么一分钟一次的 rsync cron 任务也许还不够快。

    从另外一个角度来看,如果需要分析线下日志数据,计算各种度量指标,或者其他批量的工作 …

    标签: 翻译 日志 架构
  3. 流行PHP项目的phpmetrics分析(译)

    原文:phpmetrics of popular php projects

    译者:youngsterxyf

    之前我偶然发现一个名为phpmetrics的新工具,可用于计算及展示php的度量指标。我当时立马喜欢上了这个工具,并决定用它分析我认为重要的一些php项目。 我知道这个项目列表还远远不够完善,但应该仍然值得一看。我特别喜欢其中的“可维护性”报告,我发现视觉上那些红色的斑点就和丑陋的代码一样令人厌恶。

    这个工具貌似还有点小bug,我会尽力尽快修复这个工具项目的这些小问题。

    一些重要的说明

    • 目前我还无法得到Cakephp和Typo3的分析报告,之后我会尽快调查一下这个问题。
    • 我是在完整的代码库或下载的源码包上执行这个工具的,这意味着某些情况下还分析了项目的外部依赖库。之后我可能会调整,但目前不在计划之内。
    • 有些项目包含很多代码库,所以我无法确保测试的都是正确的那个代码库。Joomla尤其可能这样。
    • 某些项目并非非常知名,但在github上呈现关注度上升趋势。
    • dm-mailer这个项目无足轻重,只是我最新的个人兴趣项目。我将它与phpmetrics一起归到Backfire一节。
    • 注意:php-yaf和phalcon都是非常有意思的php框架,但多数代码是C实现的,因此没有包含进来。

    说明:阅读该报告的一点小提示:

    • 更多的斑点只是意味着更多的类
    • 红色意味着不可维护,黄色表示可接受,绿色则表明良好、可维护的代码。

    分析结果 …

    标签: 翻译 PHP
  4. 面向分布式系统工程师的分布式系统理论(译)

    原文:Distributed systems theory for the distributed systems engineer

    译者:youngsterxyf

    Gwen Shapira,大腕级的解决方案架构师(SA),如今 Cloudera 的全职工程师,在 Twitter 上提的一个问题引起了我的思考。

    如果是以前,我可能会回答“嗯,这里有篇 FLP 论文,这里有篇 Paxos 论文,这里还有篇拜占庭将军问题的论文...”,我会罗列一箩筐重要的材料,如果你一头扎进去,至少花费 6 个月的时间才能过一遍这些材料。然而我已逐渐明白推荐大量的理论性的论文通常恰恰是着手学习分布式系统理论的错误方式(除非你在做一个 PhD 项目)。论文通常比较深入难懂,需要认真地研习,通常还需要大量的时间投入(significant experience)来理清这些论文的重要贡献,以及在整个理论体系中的位置。要求工程师具备这样的专业水平又有多大的意义呢 …

  5. Windows命令提示符中统计行数(译)

    原文:Counting lines in Windows command prompt

    译者:youngsterxyf

    使用内置工具FIND统计cmd.exe输出的行数非常方便!

    在命令行环境中工作时,能够统计不同工具的输出结果的行数有时会非常有用。许多Unix/Linux操作系统都包含带有许多功能选项的wc 工具,Windows则没有内置一样的替代品,但是Windows命令提示符(cmd.exe)原生支持了部分相同功能。

    本文将讲述在cmd.exe中我们可以如何使用FIND工具来统计行数。工具find,有些类似于Unix上的grep,自MS-DOS以来就一直存在, 使用简单。

    假设我们有一台Windows服务器,想看看当前有多少个活跃的TCP会话。这可以使用netstat命令,并且通过管道连接FIND来查找已建立的会话。

    netstat -ano | find /i "estab"

    established-TCP-2.png

    这行命令的输出可能会有几百行以至于占满整个命令提示符窗口,而我们可能仅仅关心会话的数目。通过在这行命令之后增加一个/c开关选项, 我们就能得到打开的TCP会话的数目。

    我们仍然使用上一个命令的过滤规则(通过查找字符串“estab”来找到包含ESTABLISHED状态的行)但带有 …

    标签: Windows 翻译
  6. 如何实现Golang的http请求处理中间件(译)

    原文:Golang Http Handlers as Middleware

    译者:youngsterxyf

    大多数现代Web组件栈允许通过栈式/组件式中间件“过滤”请求,这样就能干净地从web应用中分离出横切关注点(译注:面向方面程序设计中的概念?)。 本周我尝试在Go语言的http.FileServer中植入钩子,发现实现起来十分简便,让我非常惊讶。

    让我们从一个基本的文件服务器开始说起:

    func main() {
        http.ListenAndServe(":8080", http.FileServer(http.Dir("/tmp")))
    }
    

    这段程序会在端口8080上开启一个本地文件服务器。那么我们该如何在这其中植入钩子从而能够在文件请求处理之前执行一些代码?来看一下http.ListenAndServe的方法签名:

    func ListenAndServe(addr string, handler Handler) error
    

    看起来http.FileServer返回了一个Handler …

  7. 为何Goroutine的栈空间可以无限大?(译)

    原文:Why is a Goroutine's stack infinite?

    译者:youngsterxyf

    Go编程新手可能会偶然发现Go语言---与一个Goroutine可用栈空间大小相关---的一个古怪特性。这通常是由于程序员 无意间构造了一个无限递归函数调用而产生的。为了阐明这个特性,以如下代码(有点刻意设计的)为例。

    package main
    
    import "fmt"
    
    type S struct {
        a, b int
    }
    
    // String implements the fmt.Stringer interface
    func (s *S) String() string {
        return fmt.Sprintf("%s", s)     // Sprintf will call s.String()
    }
    
    func …
    标签: Golang 翻译

Page 2 / 5