Go 的 fmt
包提供了类似 C 标准库中的 scanf 和 printf 的系列输入输出函数。
// 输入 N*N 矩阵
var G [N][N]int
for i := 0; i < N; i++ {
for j := 0; j < N; j++ {
fmt.Scan(&G[i][j])
}
}
但是 C 的标准输入输出默认是带缓冲的, 而 Go 的不带。
当有大量 I/O 时, 效率较低。 解决的办法是用 bufio
中带缓冲的类型。
in := bufio.NewReader(os.Stdin)
for i := 0; i < N; i++ {
for j := 0; j < N; j++ {
fmt.Fscan(in, &G[i][j])
}
}
同理, 可用 bufio.Writer
对输出进行缓冲,
但是记得在程序退出前调用 Flush()
清空缓冲区。
继续阅读 →我手头有一些 jpg 格式的图像文件。 我想把他们打印成 A5 尺寸的小册子。
如果打印机附带了将图像打印成小册子的功能, 那么直接使用即可。
否则, 比较方便的办法是将 jpg 汇集在一个 PDF 文件中, 拼版后交给打印机进行打印。
拼版之前需要确保每个页面的大小为 148mm x 210mm。 对于 300dpi 的图像而言, 即为
1748 x 2480。 可以使用 ImageMagick 对图像进行缩放:
$ magick img.jpg -set density 300 \
-resize 1748x2480 \
-unsharp 0x5+0.3+0 \
img-300dpi.jpg
其中, -unsharp
选项用于对缩放后的图像进行钝化遮罩 (Unsharp Mask) 处理,
简单地说就是锐化图像, 抵消缩放所产生的模糊感。
使用 Acrobat 软件可以将若干张图像合成为单个 PDF。
观察一下小册子的印刷方式。 每张纸上印刷的页面并不是按照顺序排列的。
例如, 对于一份 8 页的小册子, 第一张纸正面印的是第 8 页和第 1 页,
反面印的是第 2 页和第 7 页; 第二张纸正面印的是第 6 页和第 3 页,
反面印的是第 4 页和第 5 页。 这样,将这两张纸叠在一起,
第 1 页的反面是第 2 页, 第 2 页和第 3 页恰好相对, 等等。
将所有纸张叠好, 并在中间装订, 然后对折,就构成了一本小册子。
对于上述的小册子, Acrobat 可以直接打印出来。 打开合成的 PDF 文件并按 “打印”,
在打印对话框中选择 “小册子”, 即可。
如果要用 A4 纸制作 A6 大小的小册子, 那么一张纸上需要拼 8 个版面。
仍以 8 页的小册子为例, 这时只需一张纸即可: 正面布置的版面为
, 反面布置的版面为 。
将这张纸正面朝外对折, 则反面的第 2、 3 页相对, 第 6、 7 页相对。
用一把裁纸刀沿着折痕将纸裁开, 保持对折时页面的相对位置,
然后令第 1、 8 页朝外, 将两个叠好的半张纸再次对折, 在折痕处装订,
就构成了小册子。
继续阅读 →
Duane Bibby 为 TeXbook 绘制的插图 (来自 http://ctan.org/lion)

上色后的效果
继续阅读 →XeTeX 是 TeX 排版系统的扩展,增加了对 Unicode 和 OpenType(R) 的支持。因此可被用于中文排版。
我写了 typezh,用于在 Plain TeX 的基础上编写中文文档。可以参考其中的 readme.tex 了解其用法。或者,更好地,使用
xetex readme.tex 将说明文件编译成 PDF,然后查看。
继续阅读 →Vultr是和DigitalOcean类似的VPS服务提供商。它比后者多一个功能:挂载任意ISO镜像。这样就可以安装任意操作系统了。
我用这个功能安装Gentoo。主要参考这篇文章,以及Gentoo的官方手册。
我没有用Gentoo安装盘,而是用了Vultr的ISO library中已有的ArchLinux安装盘。这样省去了上传ISO镜像的步骤。而且事实上ArchLinux的安装盘好用得多。
分区、格式化、下载和解包stage3……等等步骤,都没有太多需要注意的地方。chroot之前要记得复制/etc/resolv.conf
,否则之后无法连网。然后就是emerge一些东西,也没什么难度。
值得注意的是内核编译选项。文章中明显提到了要启用VIRTIO_PCI
和VIRTIO_MMIO
,实际上还要启用VIRTIO_BLK
和VIRTIO_NET
,才能访问硬盘和网络。很多其它硬件驱动都可以禁用。
最后按照文章里写的配置好系统就可以了。安装GRUB启动器,如果/dev
等虚拟目录没有正确挂载到chroot的根目录下也会安装失败。重启之前记得运行passwd
设置root密码。
继续阅读 →makeindex是用来编制索引的工具。在文档中,用\index
在文中标记索引,排版时将生成相应的.idx
文件,每一个\index
命令对应一行。
makeindex对.idx
文件进行排序和格式化,然后生成.ind
文件,该文件就是索引部分的代码。之后只需再运行一次程序即可将索引包含在文档内。
这个过程本身已经有些复杂了,现在遇到一件更麻烦的事:怎样编制中文索引。汉字没有明确的排序依据,通用的做法是按拼音或者笔画排序。zhmakeindex提供了这些功能。
继续阅读 →在工程领域中,复数被用来指代一个有效值为,初相位为的正弦量。这样的复数常被称作相量(phasor),通常会用更简便的Steinmetz记号表示,并且使用角度制。
继续阅读 →我一直用一个简单的近似公式来估算一个数的平方根:
例如我想估算10的算术平方根,心中默想,于是。这个方法非常简单有效。
我不知道以前的算术课程是否要讲授笔算开方的方法。反正自从电子计算器普及,这些技术就无人问津了。有一种竖式方法可以用来做任意位数的开方运算,如下图所示:
继续阅读 →Golang Project页面右侧有一张图片:

一只gopher拿着游标卡尺,工程师的经典工具。另一只gopher拿的东西现在很少见了,叫做计算尺(slide rule)。它曾经也是科学技术人员必备的工具,可以不打草稿进行乘除运算,常见的有3位有效数字,能满足一般的工程需要。
自从1972年手持式科学计算器HP-35面市,计算尺迅速被淘汰。科学计算器运算速度快、精度高、功能丰富,各方面指标完胜已有的计算工具。现在已经没有厂家生产计算尺;它已成为一种收藏品。
另一个同样被淘汰的工具是算盘。这个工具在中国非常流行。有意思的是,算盘是数字式的,它本身只能处理离散值,不存在失真的问题,精度高。相比之下计算尺是模拟式的,理论上有无限的精度,但是因为存在加工精度限制、装配误差等,实际上精度并不高。电子计算器普及后,算盘也被淘汰了。耐人寻味的是,现在仍然有厂家生产算盘。
这里还要提一个因科学计算器普及而变得过时的技术:常用对数表。对数可以把乘法变成加法,指数变成乘法,因此简化了计算。
继续阅读 →货币的时间价值是利息的(理论)来源。利息的计算是一个很有意思的问题。单利和复利属于比较简单的计算。
设一笔资金的现值是,每期利率是,那么期之后,按照复利计算,它的价值
这就是著名的复利公式。
当每期都有新投入的现金时,就变得复杂起来。举个例子:银行贷款提供两种分期还款的方式:等额本息和等额本金。怎样计算每期应当偿还的金额?
等额本息
等额本息,即在每期末偿还一笔相同的金额(也有在每期初还款的,暂不讨论这种情况),其中一部分是上期余额产生的利息,剩下的是偿还的本金。上期余额扣除本期偿还的本金后,成为本期余额……这个过程看起来挺复杂,其实利用货币的时间价值很容易算出:把每期支付的金额归算为现值:
将它们相加,总的现值
这也就是你每期支付的情况下,银行愿意贷款给你的金额。反过来说,如果你打算贷款,就可以根据此式算出每期的还款额
继续阅读 →