<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>编程杂项 :: yafeng 的博客</title><link>http://yafengabc.github.io/programming-misc/index.html</link><description>编程杂项归档：Tailscale 自建 DERP、ArchLinux 安装、Web 性能对比、Cython 加速、Nim GUI 等零散编程笔记（2016–2024，从博客园迁入），按发布时间倒序排列。&#10;Go vs Nim 性能实测（一）：6 项常规算法对决 2026-09-19 Go vs Nim 性能实测（二）：大数运算与 GMP 四端 2026-09-19 Go vs Nim 性能实测（三）：6 种 GC 模式全景对比 2026-09-19 Tailscale 搭建derp中继节点，不需要域名，不需要备案，不需要申请证书（最新） 2024-12-06 重磅，Tailscale的Derp服务器开始支持IP作为HostName并支持自建证书。 2024-12-06 Nim 入门之基于对话框的简单的GUI程序的编写 2023-03-18 Python64+win10_64+cython+msys2(ming64)踩坑记 2019-08-26 用Cython加速Python程序以及包装C程序简单测试 2016-12-04 web编程速度大比拼（nodejs go python）（非专业对比） 2016-04-25 Archlinux在Btrfs分区上的安装（bios篇） 2016-01-31</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="http://yafengabc.github.io/programming-misc/index.xml" rel="self" type="application/rss+xml"/><item><title>Go vs Nim 性能实测（一）：6 项常规算法对决</title><link>http://yafengabc.github.io/programming-misc/go-vs-nim-algorithms/index.html</link><pubDate>Sat, 19 Sep 2026 12:30:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/go-vs-nim-algorithms/index.html</guid><description>用 6 项覆盖递归、整数运算、随机访问、浮点、内存带宽与小对象分配的常规算法，对比 Go 1.26 与 Nim 2.2 的真实性能：合计只差 3.5%，但单项差距最大到 4.8 倍。</description></item><item><title>Go vs Nim 性能实测（二）：大数运算与 GMP 四端</title><link>http://yafengabc.github.io/programming-misc/go-vs-nim-bigint/index.html</link><pubDate>Sat, 19 Sep 2026 12:30:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/go-vs-nim-bigint/index.html</guid><description>Go math/big 四项全胜、Nim 生态库落后最多 210 倍、自研 Karatsuba/Toom-3 库可提升一个数量级；GMP 四端 FFI 开销≈0；百万位 π 里 math/big 输在除法与开方。</description></item><item><title>Go vs Nim 性能实测（三）：6 种 GC 模式全景对比</title><link>http://yafengabc.github.io/programming-misc/go-vs-nim-gc/index.html</link><pubDate>Sat, 19 Sep 2026 12:30:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/go-vs-nim-gc/index.html</guid><description>同一份 Nim 代码分别以 refc / mark&amp;sweep / arc / orc / boehm / atomicArc 编译，与 Go GC 对照 7 项负载：没有绝对赢家，按场景选型才是正解。</description></item><item><title>Tailscale 搭建derp中继节点，不需要域名，不需要备案，不需要申请证书（最新）</title><link>http://yafengabc.github.io/programming-misc/p18591222/index.html</link><pubDate>Fri, 06 Dec 2024 17:48:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/p18591222/index.html</guid><description>既然tailscale官方derp源代码支持了IP作为HostName，当然需要测试一番。经过一番摸索，终于在阿里云，华为云成功部署。其中阿里云装的debian 12，华为云装的ubuntu 22.04.下边简单说一下步骤。&#10;首先，第一个问题就是debian/ubuntu的仓库里的golang版本是不够的。都是1.18、1.19这样的版本。需要安装最新的golang版本。golang官方最新的版本是1.23.4，tailscale需要1.23（真够激进的）所以第一件事，就是安装最新的golang。&#10;好在Debian有backport机制，ubuntu有最新的snap包，安装都很简单：&#10;apt search go-1.23 Sorting... Done Full Text Search... Done golang-1.23/stable-backports,now 1.23.3-2~bpo12+1 all [installed] Go programming language compiler - metapackage golang-1.23-go/stable-backports,now 1.23.3-2~bpo12+1 amd64 [installed,automatic] Go programming language compiler, linker, compiled stdlib 所以直接安装&#10;apt install golang-1.23 安装后需要设置一下环境变量：&#10;export PATH=$PATH:/usr/lib/go-1.23/bin 推荐写到.bashrc，以后每次登录都会加载这个环境变量。检查一下环境变量：&#10;echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/go-1.23/bin ubuntu的snap包自带最新版的golang，用下边命令安装：&#10;snap install go --classic ubuntu的snap包安装后不用任何设置就可以使用了。安装完成后运行go version看看版本号：&#10;go version go version go1.23.4 linux/amd64 这时候如果直接用go install会不成功，还是众所周知的原因，所以先配个代理：</description></item><item><title>重磅，Tailscale的Derp服务器开始支持IP作为HostName并支持自建证书。</title><link>http://yafengabc.github.io/programming-misc/p18590316/index.html</link><pubDate>Fri, 06 Dec 2024 11:17:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/p18590316/index.html</guid><description>公司使用SoftEther部署私有VPN很多年了，用来解决PLC远程在线的问题。但是近几年海外项目增多，由于众所周知的原因，国内架的VPN基本处于不可用状态，延时非常大并且丢包严重，还经常连不上。&#10;偶尔发现Tailscale支持把子网整个加入TailNet网络，所以尝试了一番，发现连国外项目还算稳定，虽然延迟也不低（孟加拉达卡的项目，在我这测试延时300ms左右）但是基本不丢包，可以比较稳定的PLC在线。&#10;但是国内就……同样因为众所周知的原因，Tailscale在国内是没有服务器的，所以用它连接国内的项目的话，如果能局域网打洞还好，距离近的话基本10ms以内的延时，如果打洞失败，那就跟孟加拉一样的待遇，300ms以上。&#10;但是TailScale支持自建derp服务器啊，正好我还有阿里云的试用资格。我就申请了一个阿里云服务器照着网上的教程搞了一番，最后成功了，但是非常麻烦的是，derp服务器需要TLS加密，所以需要配置好https，然后https需要申请证书&#10;免费证书又是一般只对域名开放的。最悲催的是，现在免费证书只有3个月时间。也就是说即使买了域名，备案了，也需要3个月就重新申请免费证书重新配置。因为域名续费比较贵，个人用的话一般是一年换一个，所以太不省心了。&#10;网上很多使用IP作为HostName的教程，这个非常好，为啥呢，因为可以用自签的证书，自签证书是可以自定义过期时间的（比如100年），所以用IP作为HostName能极大的简化部署，基本只买一个云服务器（自己有公网域名的话云服务器也省了）&#10;然后每年交云服务器的钱就行了。不用域名，不用备案，也不用证书。国内节点加速还是很明显的：&#10;走官方的东京节点，延时300多ms，而走阿里云服务器的华东节点，只需要50ms&#10;Tailscale官方是不支持IP作为HostName的，好在这货全开源，可以改源码（其实只需要改3句），改完后重新编译就可以了，但是这货更新很快，每次升级都需要改源码重新编译也不是个事。所以虽然部署成功了，但是感觉还是不太爽。&#10;所以我就抱着试试看的想法，给官方留了个言，没想到事情居然有了转机，仅仅3个小时后，官方就改了代码：&#10;给TailScale团队点赞。</description></item><item><title>Nim 入门之基于对话框的简单的GUI程序的编写</title><link>http://yafengabc.github.io/programming-misc/p17229429/index.html</link><pubDate>Sat, 18 Mar 2023 09:55:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/p17229429/index.html</guid><description>最近Golang玩的很嗨，现代的C语言不是盖的。唯一有点不爽的就是golang是专为高并发设计的，每次启动都一堆线程。在htop下看着很不爽。有没有一种写起来爽，又是编译型语言，速度也可以的语言呢？&#10;当然有，Nim算是其中之一吧。并且这个语言比较像Python，也是缩进语法的语言。先来个例子感受下语法：&#10;import time def fib(n): if n==0: return 0 if n==1: return 1 return fib(n-1)+fib(n-2) t=time.time() print(fib(40)) print(time.time()-t) 错了错了，这是python。下边才是Nim&#10;import times proc fib(n:int):int= if n==0: return 0 if n==1: return 1 return fib(n-1)+fib(n-2) var t=times.cpuTime() echo fib(40) echo times.cputime()-t 可以看到是不是有点像Golang跟python的结合体？&#10;顺便贴一下测试结果：&#10;[yafeng@SongSrv fibn]$ python fib.py 102334155 69.87282729148865 [yafeng@SongSrv fibn]$ pypy3 fib.py 102334155 13.181118726730347 [yafeng@SongSrv fibn]$ go run fib.go 102334155 1.237680831s [yafeng@SongSrv fibn]$ g++ fib.cpp &amp;&amp; ./a.out 102334155 1.99962 sec [yafeng@SongSrv fibn]$ g++ -O3 fib.cpp &amp;&amp; ./a.out秒， 102334155 0.373478 sec [yafeng@SongSrv fibn]$ nim r fib.nim 102334155 3.16008495 [yafeng@SongSrv fibn]$ nim -d:release r fib.nim 102334155 1.067569256 [yafeng@SongSrv fibn]$ nim -d:danger r fib.nim 102334155 0.017291094 python 70秒，pypy 13秒，go 1.2秒，g++不优化2秒，优化0.3秒。</description></item><item><title>Python64+win10_64+cython+msys2(ming64)踩坑记</title><link>http://yafengabc.github.io/programming-misc/p11399939/index.html</link><pubDate>Mon, 26 Aug 2019 15:56:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/p11399939/index.html</guid><description>一直在linux下用python，一直妥妥的，从没想过在windows下编译cython模块，直到昨天……&#10;过程是曲折的，解决方法是简单的，时间不多，长话短说，直接先来个传送门：&#10;https://www.jianshu.com/p/50105307dea5&#10;这里的步骤是可以的，因为我用的msys2，所以过程有一点点曲折，下边补充说明一下：&#10;msys2算是个windows下的linux系统，里边一共包含了3套工具链，&#10;比如安装GCC，可以直接安装gcc这个包，也可以安装mingw-w64-i686-gcc或者mingw-w64-x86_64-gcc&#10;这三个包不同之处在于，gcc是属于msys2系统本身的工具链，如果编译软件，会连接到/usr/lib下，也就是虽然生成的是exe，但是是没法离开msys2运行的&#10;而mingw-w64-i686-gcc与mingw-w64-x86_64-gcc实际上是个交叉工具链，编译出来的exe是只依赖宿主系统的库的，所以可以直接在windows系统下运行的&#10;甚至只要吧msys2下的mingw64/bin目录加到系统系统变量，是可以随便调用的。&#10;python配合msys2的使用方式：&#10;python也可以有3种安装方式，&#10;1，直接从python官方下载安装包安装，这是最普遍的做法，跟msys2完全没关系，可以直接通过系统环境变量调用相应的mingw32或者mingw64编译器，编译自己的包&#10;2，在msys2直接安装python，配合msys2的gcc，这样类似直接在linux安装gcc python，最方便，编译连接时也不需要指定路径，类似linux下的体验，缺点是编译生成的exe文件无法离开msys2运行&#10;3，安装mingw-w64-x86_64-gcc mingw-w64-x86_64-python这种工具链下的包，这个其实跟1类似，可以编译直接在系统下运行的exe，也可以直接在msys2下使用。&#10;因为我系统下已经安装了python3 64bit，并且安装了大量的包，所以装完msys2以后，直接安装mingw-w64-x86_64-gcc就可以在pyhon3中使用这个编译器了。&#10;pacman -S mingw-w64-x86_64-gcc 然后把mingw64加到系统环境变量比如我msys2安装在E:\linux（没错我伪装成linux了哈）下，系统环境变量就加一条E:\linux\mingw64\bin。&#10;根据传送门的教程：在python安装目录C:\Program Files\Python\Lib\distutils中新建distutils.cfg文件，内容如下：&#10;[build] compiler=mingw32 [build_ext] compiler=mingw32 注意，这地方是没错的，不要因为是mingw64就写mingw64，写mingw32是对的。&#10;这时候，编译一个cython程序，会报VC版本1900 1906之类，根据教程这么改：&#10;三、修改cygwinccompiler.py文件&#10;进入python安装目录C:\Program Files\Python\Lib\distutils中，修改cygwinccompiler.py文件，添加以下内容到get_msvcr()函数（用于解决ValueError: Unknown MS Compiler version 1900错误）。&#10;elif msc_ver == '1900': # Visual Studio 2015 / Visual C++ 14.0 # "msvcr140.dll no longer exists" return ['vcruntime140'] 因为我这报的是1906，所以就改成了&#10;elif msc_ver == '1906': # Visual Studio 2015 / Visual C++ 14.0 # "msvcr140.dll no longer exists" return ['vcruntime140'] 这一步一定要根据实际版本改。</description></item><item><title>用Cython加速Python程序以及包装C程序简单测试</title><link>http://yafengabc.github.io/programming-misc/p6130849/index.html</link><pubDate>Sun, 04 Dec 2016 15:02:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/p6130849/index.html</guid><description>用Cython加速Python程序 我没有拼错，就是Cython，C+Python=Cython!&#10;我们来看看Cython的威力,先运行下边的程序：&#10;import time&#10;def fib(n):&#10;if n0:&#10;return 0&#10;if n1:&#10;return 1&#10;return fib(n-1)+fib(n-2)&#10;t=time.time()&#10;print(fib(40))&#10;print(time.time()-t)&#10;$ python fib.py&#10;102334155&#10;59.367255449295044&#10;在我的渣渣笔记本上，用时59.3秒，差不多一分钟。当然，在你那可能比我快一点，这也很正常。&#10;好了，我们再试试Cython：&#10;$ cython fib.py –embed&#10;$ gcc -O3 fib.c -I /usr/include/python3.5m/ -lpython3.5m&#10;$ ./a.out&#10;102334155&#10;14.487313747406006&#10;嗯，快了那么一点点，4倍左右;我解释一下前边的几句代码：&#10;首先，用cython命令把python生成c文件，也就是cython fib.py会生成一个fib.c的文件&#10;–embed参数就是自动生成一个main函数，以便让gcc生成可执行程序。&#10;接下来就是用gcc把fib.c编译成了个a.out程序，运行之，结果快了4倍（从60秒减少到15秒以内）。&#10;当然，这只是小试牛刀，区区4倍而已，这也太少了！&#10;接下来我吧这个文件复制成fib.pyx，并修改了一句代码：&#10;import time&#10;cdef int fib(int n):&#10;if n0:&#10;return 0&#10;if n1:&#10;return 1&#10;return fib(n-1)+fib(n-2)&#10;t=time.time()&#10;print(fib(40))&#10;print(time.time()-t)</description></item><item><title>web编程速度大比拼（nodejs go python）（非专业对比）</title><link>http://yafengabc.github.io/programming-misc/p5431695/index.html</link><pubDate>Mon, 25 Apr 2016 17:17:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/p5431695/index.html</guid><description>C10K问题的解决，涌现出一大批新框架，或者新语言，那么问题来了:到底谁最快呢？非专业程序猿来个非专业对比。&#10;比较程序：输出Hello World！&#10;测试程序：siege –c 100 –r 100 –b&#10;例子包括：&#10;1.go用http模块实现的helloworld&#10;2.go用martini微框架实现的Helloworld&#10;3.python3 python2 pypy分别用gevent server tornado实现的Hello world&#10;4.python3 python2 pypy分别用微框架bottle+gevent实现的Hello world&#10;5.NodeJS纯JS实现的Helloworld&#10;6.NodeJS用express框架实现的Helloworld&#10;测试平台：&#10;公司老旧的奔腾平台 Pentium(R) Dual-Core CPU E6700 @ 3.20GHz&#10;内存2GB（够弱了吧）&#10;先来宇宙最快的GO的测试：&#10;package main import ( "fmt" "net/http" ) func sayhelloName(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, "hello world!") } func main() { http.HandleFunc("/", sayhelloName) http.ListenAndServe(":9090", nil) } 连续测试5次，成绩大体如下：&#10;Transactions: 10000 hits Availability: 100.00 % Elapsed time: 4.11 secs Data transferred: 0.11 MB Response time: 0.03 secs Transaction rate: 2433.09 trans/sec Throughput: 0.03 MB/sec Concurrency: 79.76 Successful transactions: 10000 Failed transactions: 0 Longest transaction: 0.20 Shortest transaction: 0.00 4.11秒，不错的成绩</description></item><item><title>Archlinux在Btrfs分区上的安装（bios篇）</title><link>http://yafengabc.github.io/programming-misc/p5172862/index.html</link><pubDate>Sun, 31 Jan 2016 09:38:00 +0800</pubDate><guid>http://yafengabc.github.io/programming-misc/p5172862/index.html</guid><description>其实本文所有的内容在Archwiki上都可以找到，并且更新更全面（只是比较零散），我所做的只是对安装流程做一个小小的总结，每一步我都会稍微解释一下，但不会说的特别详细，毕竟这只是一篇安装引导文，而不是Wiki。&#10;首先显然是下载最新的archlinux安装镜像：&#10;1，用浏览器打开archlinux源，比如mirrors.163.com,mirrors.ustc.edu.cn(这里以163为例)：（url）http://mirrors.163.com/archlinux/&#10;可以看到，有个iso目录，这就是安装镜像所在的地址了。打开后里边是这个样子的：&#10;其中latest目录下，是包含官方最新的archlive镜像，而archboot目录下，则是另一个版本的archboot镜像（以前的archlinux官方镜像，包含一个类似FreeBSD的图形化安装脚本哦，感兴趣的童鞋可以试试，感觉还是比较好用哦）。不多说了，还是进latest下载安装镜像(直接扔地址：)http://mirrors.163.com/archlinux/iso/latest/archlinux-2016.01.01-dual.iso（建还是自己进去下哦，说不定你看到本文时，2016年2月甚至2017年的镜像已经出了，建议下载最新的）&#10;600多兆，时间比较漫长，我就先八一下怎么做安装USB，要是你用linux系统，直接dd进U盘就行了（命令我不多说了我觉得linux用户应该都会，不会的google baidu一下也会了，另一个方法就是男人（man）一下dd（搞基？），咱还是策反windows下的众linux小白为主 ）。&#10;考虑到网上众基们用ultra iso做启动盘的比较多，我就顺应民意用一下这个软件：&#10;用ultra iso打开刚才下载好的镜像文件，选择启动-&gt;写入硬盘镜像&#10;并在接下来的窗口选择RAW写入：&#10;等一会儿，就写完了（要是启动失败，请移步互联网，找更靠谱的方法 ，（因为这不是重点））&#10;假设在座各位已经搞定了启动方法，下边就是安装了（我用的vbox虚拟机）&#10;嗯，现在的电脑都支持x86_64(amd64),只要电脑不太差，选这个就OK了，内存小，可以选i686可以省内存哦（上下箭头选择，回车继续，不用我教吧）。&#10;嗯嗯，看到一个命令行界面输一个lsblk看看有没认到硬盘：&#10;那个sda就是硬盘了。分区cfdisk /dev/sda,在接下来的界面选dos（也可能没这个界面）</description></item></channel></rss>