• 大教堂与市集

    在软件工程历史上,Eric S. Raymond 于 1997 年发表的文章《The Cathedral and the Bazaar》(大教堂与市集)是一篇具有里程碑意义的重要文献。文章用“大教堂”和“市集”类比了“自上而下”和“自下而上”两种软件开发方法,深入探讨了软件开发过程中的不同方法论及其影响。这篇文章不仅对开源社区产生了深远影响,还为现代软件开发人员提供了宝贵的经验教训。大教堂与市集大教堂模式的特点是源代码在软件发行后公开,在软件的每个版本开发过程中由一个专属的团队控管。作者以...

  • How it works - Fluentd

    日志是计算机系统运行中不可或缺的一部分。随着分布式架构的广泛应用,集中的日志管理已经成为每个系统环境的必备基础设施。过去大家普遍采用的开源方案是 ELK 架构,随着时代的发展,不断地有新的工具涌现出来。Fluentd 便是新一代的日志收集工具,它使用 CRuby 开发,与笨重的 Logstash 相比,显得十分精致、高效。本文将介绍 Fluentd 的架构和功能使用。Fluentd 的基本架构Unified Logging LayerFluentd 的目标是创建统一的日志层(Unified...

  • Kubernetes 进阶使用之 Helm,Kustomize

    Declarative vs imperativeKubernetes 一个非常优秀的特点是,它是基于状态的。我们告诉 Kubernetes 我们需要运行什么样的资源( Pod, Service 等),以及这个资源对应的状态(参数,状态等),Kubernetes 帮助我们确保这些资源按我们要求的状态运行。也就是说,如果我们告诉 Kubernetes 使用 nginx:latest 镜像,运行 1 个名为 nginx-pod 的 Pod,Kubernetes 就会努力确保有且仅有 1 个 i...

  • 理解 Python 中的协程

    asyncio 是 Python 下开发 I/O 密集型应用的最佳选择,而使用 asyncio 又离不开协程。什么是协程协程是一种可以中断运行,在某个时间点再恢复运行的程序组件。这个定义和协程的字面意思一点关系没有,刚接触时,理解起来是十分晦涩的。我们先看其英文 coroutine 会更好理解一些,“co-“ 这个前缀有”一起,共同”的意思,比如 co-author 表示合著一本书的作者,coexist 表示共存。类似的我们可以把 coroutine 理解为共同,协作运行的程序组件。如何理...

  • GIS基础知识 - 坐标系、投影、EPSG:4326、EPSG:3857

    最近接手一个GIS项目,需要用到 PostGIS,GeoServer,OpenLayers 等工具组件,遇到一堆地理信息相关的术语名词,在这里做一个总结。大地测量学 (Geodesy)大地测量学 是一门量测和描绘地球表面的学科,也包括确定地球重力场和海底地形。大地水准面 (geoid)大地水准面 是海洋表面在排除风力、潮汐等其它影响,只考虑重力和自转影响下的形状,这个形状延伸过陆地,生成一个密闭的曲面。虽然我们通常说地球是一个球体或者椭球体,但是由于地球引力分布不均(因为密度不同等原因),...

  • 自动清理 Nexus 中的过期镜像

    自动清理过期镜像Nexus Repository 是一款非常好用的私有仓库,支持 Maven、Docker、Yum、PyPi等等,基本主流的类型都支持。自从使用了持续集成以后,我们会自动对新代码进行编译打包发布到开发环境中,以便尽快地对新代码进行测试。这样导致的问题就是 Nexus 中的 Docker 库占用的空间越来越大。Nexus 本身提供了 Cleanup 功能,可以将一段时间之前的镜像删除,但是如果全部按过期时间去删除,会导致一些长时间以前上传,但是还需要使用的镜像也删除。幸运的是...

  • Locale 和 LanguageTag

    “zh_CN”与“zh-CN”前段时间,在做一个国际化的项目时,关于中文语言是用 “zh_CN” 形式还是 “zh-CN” 形式来表示,团队里出现了一些分歧。借此机会,我查了相关资料,详细了解了有关规则。国际化与本地化国际化(Internationalization,通常被简称为 I18n)和本地化(Localization,通常被简称为 L10n)是两个看似熟悉但常常需要进一步查阅资料来真正理解的术语。两者虽然相关,但各有侧重点。对于软件系统来说,国际化是指在设计和开发时,通过一系列操作...

  • Linux Shell 编程

    本文源于团队内部的一次分享,对 Linux Shell 编程进行基本的介绍。基本的文件格式#!/bin/sh => 指定要运行的 shellor#!/bin/bash => bash 是功能更全的一个 shellfoo1=abc foo2=abc 123 => illegalfoo3='abc 123' foo4=1+2 echo $foo1 => abcecho $foo3 => abc 123...