Home

Go modules镜像代理服务-goproxy.io

goproxy.io是 Go modules 镜像代理服务,采用 CDN 加速服务为开发者提供依赖下载。可以解决国内用户下载Go依赖时的经常遇到的timeout问题,省去了翻墙的麻烦,并且由于采用了CDN,下载速度很快。实乃Go语言开发者必备服务。

使用方法很简单:

Go 版本1.13 及以上 (推荐)

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
# 设置不走 proxy 的私有仓库,多个用逗号相隔(可选)
go env -w GOPRIVATE=*.corp.example.com

设置完上面几个环境变量后,您的 go 命令将从公共代理镜像中快速拉取您所需的依赖代码了。

Read more

Shell中按指定分隔符读取文件字段

在很多情况下我们要对文本文件进行读取操作,Shell中读取文件的方法有很多种。比如简单的按行读取:

#!/bin/bash

for line in `cat file.txt`
do
    echo $line
done

每一次循环会读入一行文件内容放入$line变量中。

另外一种情况下,我们要读取像csv类似的文件,每行的字段按指定的分隔符分隔,该如何处理呢? 可以利用IFS环境变量来指定分隔符并用read命令来读取各个字段。

Read more

《代码之美》-- 正则表达式

在《代码之美》一书中,作者展示了一段大约30行的C代码,实现了一个正则表达式匹配器。

该正则表达式提供了如下匹配模型:

字符 含义
c 匹配任意字母c
. 匹配任意单个字符
^ 匹配输入字符串的开头
$ 匹配输入字符串的结尾
. 匹配前一个字符的零个或多个出现

这是非常有用的匹配器,基本上可以解决95%左右的正则匹配问题。这段代码写的紧凑 、优雅、高效并且实用。这段代码充分展示了c指针的强大功能,以及递归的极佳示例。

你可以自己动手实现一下上面的功能,然后再来对比一下书中这段代码,看看是否也能实现的如此精简高效。

Read more

博客更换域名

之前用了很久的博客域名: linuxsong.org,用的是aws国外的服务器,在国内访问速度实在是太慢了,于是想切回到阿里云,但是近来org的域名现在已经不允许备案了。没办法只好申请了一个新的域名: topbyte.cn, 服务器换成了阿里云的。

从今天开始启用新的域名,之前的linuxsong.org以后会暂停使用了。

Read more

Linus Torvalds 提及的关于代码的"good taste"

在一个关于 Linus Torvalds 的一个访谈中, Linus Torvalds 举了一个关于什么是代码好的品味的例子(视频14:20左右)。

他先是展示了一个C代码片断。

poor taste code example

这段代码的作用是删除链表中的一个节点, Linus 认为这不是一段具有好品味的代码。原因是循环后面的 if 判断,删除链表节点时需要考虑两种不同的情况,一种是删除的是链表的head节点,另外一种是删除的中间节点或者尾部节点。

接下来, Linus 又展示了另外一段具有好品味的代码,和上面的一段代码实现的是同样的功能。

Read more

A*算法的JavaScript实现

A* (A-Star)算法是一种路径搜索和图形遍历算法,它有较好的性能和准确度。

A*的算法公式:f(n) = g(n) + h(n)

f(n)是节点n的综合优先级。当我们选择下一个要遍历的节点时,我们总会选取综合优先级最高(值最小)的节点。g(n) 是节点n距离起点的代价。h(n)是节点n距离终点的预计代价,这也就是A*算法的启发函数。

A*算法在运算过程中,每次从优先队列中选取f(n)值最小(优先级最高)的节点作为下一个待遍历的节点。

另外,A*算法使用两个集合来表示待遍历的节点,与已经遍历过的节点,这通常称之为open_set和close_set。

完整的算法描述如下:

* 初始化open_set和close_set;
* 将起点加入open_set中,并设置优先级为0(优先级最高);
* 如果open_set不为空,则从open_set中选取优先级最高的节点n:
    * 如果节点n为终点,则:
        * 从终点开始逐步追踪parent节点,一直达到起点;
        * 返回找到的结果路径,算法结束;
    * 如果节点n不是终点,则:
        * 将节点n从open_set中删除,并加入close_set中;
        * 遍历节点n所有的邻近节点:
            * 如果邻近节点m在close_set中,则:
                * 跳过,选取下一个邻近节点
            * 如果邻近节点m也不在open_set中,则:
                * 设置节点m的parent为节点n
                * 计算节点m的优先级
                * 将节点m加入open_set中

根据上面的算法描述,用js实现了一个算法演示。

Read more

二进制文件的十六进制文本转储与反向转换

如何把一个二进制文件以十六进制打印出来呢?

我们知道在 Linux 中有一个命令 hexdump 可以将文件以十六进制输出,但是这个命令不能对已经输出的十六进制还原成原来的格式。如果想要能让 dubmp 出来的文本还原成之前的格式,可以用 xxd 这个命令来解决。

xxd 的作用可以将给定的文件或数据以十六进制形式输出,并且可以将输出的十六进制格式还原成之前的二进制格式,输出之后的内容可以“邮件安全”的ASCII码形式传输,比如你可以把一个二进制的可执行程序利用xxd 转换成十六进制,以邮件文本的形式传输,并且可以完整的还原成可执行文件。

举例说明,比如想把/usr/bin/make 文件输出十六进制:

xxd /usr/bin/make outfile

还原:

xxd -r outfile make2

如果想要转储的文件小一些可以用-p 改变输出格式:

xxd -p /usr/bin/make outfile

还原时保证相同格式即可:

xxd -p -r outfile make2

对于转储后的十六进制文件, 甚至可以进行一些修改,达到给程序打补丁的目的。当然前提条件是要知道修改的数据的具体位置。

这个命令在 mac 下也是可以用的,对于 xxd 的其它一些参数,请参见 man 手册。

Read more

Flutter开发的2048游戏

Flutter是Google推出的移动UI开发框架,是开源和免费的。可以快速在iOS和Android上构建高质量的原生用户界面。最早在今年2月份的可Google开发者大会上推出了第一个Beta版。现在已经有越来越多的开发者和公司在使用。

Flutter自从推出以来就受到了广泛的关注,目前在 Github 上已经有37000多 Star 了,国内的很多公司也开始尝试使用了Flutter,像阿里的闲鱼团队已经将商品的详情页改用Flutter来开发了。

Flutter 的主要优点:

  • 运行速度快,最终会编译成原生代码运行,不像 React Native 需要 Javascript 来桥接。

  • 热重载(Hot Reload),修改代码保存后可以立即看到修改效果,极大的缩短了开发和调试的时间。

为了了解Flutter 的使用和开发,用 Flutter 实现了一个简单的2048的游戏,对 Flutter 有了一个初步的了解,由此感觉 用 Flutter 进行开发还是非常容易上手的。

游戏截图如下

代码详见: Github

关于Flutter 的开发文档可以看官方文档,中文文档可以参见Flutter中文网

Read more