技术

一个小问题: Golang可执行程序的退出码

本周因为工作上的遍历需要, 用Go语言写了一个用于批量文本解析的命令行工具。由于这个工具是要嵌入shell脚本中运行的,所以在写该工具的异常处理时突然意识到一个问题: Go语言可执行程序的异常退出码该怎么设置?

于是带着这个非常细节的问题,稍稍调查了一下,结果发现还是有不少东西可说道说道的…

双剑合璧——当PG的FDW遇上GO(之三)

由于对Golang以及PostgreSQL(下文简称PG)的FDW(Foreign Data Wrapper)两个技术的双重喜爱,因此我利用假期用Golang实现了一个访问douban API的FDW. 同时也借此机会总结了一下 PG的FDW技术并分享一下使用Golang实现FDW的一些经验。

全文索引如下:

双剑合璧——当PG的FDW遇上GO(之二)

由于对Golang以及PostgreSQL(下文简称PG)的FDW(Foreign Data Wrapper)两个技术的双重喜爱,因此我利用假期用Golang实现了一个访问douban API的FDW. 同时也借此机会总结了一下 PG的FDW技术并分享一下使用Golang实现FDW的一些经验。

全文索引如下:

双剑合璧——当PG的FDW遇上GO(之一)

由于对Golang以及PostgreSQL(下文简称PG)的FDW(Foreign Data Wrapper)两个技术的双重喜爱, 因此我利用假期用Golang实现了一个访问douban API的FDW. 同时也借此机会总结了一下 PG的FDW技术并分享一下使用Golang实现FDW的一些经验。

FDW Metaphor

全文索引如下:

记一次面向线程栈的防爆栈机制的实现探索

爆栈(stack overflow), 众所周知是一种软件的致命错误, 一旦发生程序就core了。根据维基百科的描述,当代码中有以下三种情形时会引发爆栈

  1. 无限递归
  2. 函数调用链展开过深
  3. 函数内申请过大的局部变量

其中1.和2.本质上是相同的,不管是否递归,只要函数调用链过深,压栈过多就会引发爆栈。只不过在实践中,由递归更容易引发爆栈。

可是在很多时候,我们无法避免递归。比如数据库在对SQL语句的执行实现中,伴随着输入的SQL语句的复杂性,间接递归通常是可以预见的。但是无论哪种情况,我们都不能容忍一个用户输入导致程序爆栈,因此这种情况下,我们就需要一个防爆栈机制

下文通过介绍我经手的一个防爆栈机制的实现过程,分享一下有关程序设计的教训与心得:

揭秘PG —— 无处不在的OID

由于手头当前的工作是基于PostgreSQL(以下简称PG)做二次开发,因此目前对PG的源码也或多或少地读了一些,因此便想到了在博客里分享一些关于阅读PG源码所获得的KnowHow。

在国内的PG技术圈内,提到PG源码解读自然首推武汉大学的两位彭老师所著的《PostgreSQL数据库内核分析》。不过这本书的着眼点是对PG源码的整体架构,以及SQL引擎,存储系统,事务处理等等这些实现机制&算法的介绍,而我则主要想分享一些PG代码中的一些有意思的小细节/小功能。虽然只是PG那几百万行源码中的沧海一粟,不过从这些小细节中解读程序设计的匠心也是颇有意思的。

PostgreSQL Logo

第一篇就从PG中无处不在的OID开始吧

[译文]Python为何会成为机器学习领域的主流语言

Python Logo

最近因为在改PostgreSQL的相关的一些代码,因此在自学Perl语言。虽然和Python一样,它也是门解释型语言,然而这门语言真的是比较奇葩,因此无比地怀念Python.

Python是我2015年自学的,虽然没用它做过什么正经的项目,但是小东西还是写了不少。只可惜自己终究还是修行不够,否则在目前这个被”人工智能”,“机器学习”等概念刷屏的年代,借助Python这门深受机器学习领域欢迎的语言,我说不定也能包装成一个年薪百万的大咖~

不过,为什么机器学习领域会如此欢迎Python?之前在一个日文网站上看到一篇文章说这个事情,我觉得写得有点意思,所以就把它翻译了一下…

如何为PostgreSQL创建一个内置函数?

这篇文章我已经酝酿颇久了,诱因是因为PingCAP团队为了推广他们的TiDB而在知乎专栏发了一篇文章《TiDB 增加 MySQL 内建函数》。受此文启发,我在网上搜索了一下PostgreSQL(以下略称”PG”)中定制内置函数(Built-in Function)相关的文章,果然没有搜到什么像样的中文文章。其实为PG添加内置函数并不难,可能是相对于hacking它的SQL引擎或者存储引擎等等话题而言,加一个内置函数的逼格实在是太Low吧。不过TiDB这个诞生还没多久的数据库产品都知道通过先利用内置函数这个话题来由简入深地吸引广大开发者为它贡献代码,PG作为一个诞生了已有20年的开源数据库老大哥却没有一篇像样文章,也难怪PG的普及率不高了。

以上就作为这篇分享的「意味づけ」吧…

主线程等待子线程结束的各语言实现

在涉及到并发编程的情况下,经常性地会碰到一种场景:

由一个线程开启了多个线程并发执行多个任务,之后由该线程(so called “主线程”)等待多个线程都结束后汇总结果.

这种场景下,主线程在其创建的子线程执行期间内需要阻塞,直到其他子线程都执行完毕。由于这类场景已经在不同语言的开发中遇到多次,所以汇总一下这些语言的常用实现方法,以后查起来也方便~

C语言程序通过函数指针调用Go函数的方法

在github上关于cgo的wiki中,有一章节专门介绍了如何利用cgo技术通过函数指针调用Golang的函数实现. 不过,仔细观察这个章节的代码示例可以发现,它所要解决的其实是以下的场景:

在Golang中想要调用一个已有的C语言函数,但是该C语言函数要求一个函数指针作为参数时应该怎么办?

如果将这个场景稍微改变一下,改成以下场景,对应的解法又该是什么?

在一个C语言实现的已有系统中,对于一个要求函数指针的函数,如何传入一个Golang实现的回调函数以实现“用Golang扩展C语言系统”的目的。

我基于wiki中已有的代码简单探索了一下方法,结果分享如下:

一见如故的Go语言

从去年接触Go语言(以后简称”Golang”)到现在,已经有1年的时间了。感觉随着使用经验的积累,越发地喜爱这么编程语言。作为一个以C, C#语言出道,并自学了Java, Python, Golang的无证程序员,使用 了一段时间Go语言后,最明显的感觉就是:“这正式我所期盼的语言”。特别是写多了C语言代码,虽然感叹于C语言在语言上的简洁与性能上的高效,但是对于现实中C语言在开发方面的低效也总是吐槽不断。遭遇了Go语言之后,认为这门语言是C语言的最好传人(不要提C++)。

Gopher

以下分享一些我认为Golang做的比较值得推崇的地方: