2018年11月

对关键应用的选择不容许丝毫错误。

你或许会遇到需要选择合适的开源数据库的情况。但这无论对于开源方面的老手或是新手,都是一项艰巨的任务。

在过去的几年中,采用开源技术的企业越来越多。面对这样的趋势,众多开源应用公司都纷纷承诺自己提供的解决方案能够各种问题、适应各种负载。但这些承诺不能轻信,在开源应用上的选择是重要而艰难的,尤其是数据库这种关键的应用。

凭借我在 Percona 和其它公司担任 IT 专家的经验,我很幸运能够指导其他人在开源技术的选择上做出正确的决策,因为需要考虑的重要因素太多了。希望通过这篇文章能够向大家分享这方面的一些技巧。

有一个明确的目标

这一点看似简单,但在和很多人聊过 MySQL、MongoDB、PostgreSQL 之后,我觉得这一点才是最重要的。

面对繁杂的开源数据库,更需要明确自己的目标。无论这个数据库是作为开发用的标准化数据库后端,抑或是用于替换遗留代码中的原有数据库,这都是一个明确的目标。

目标一旦确定,就可以集中精力与开源软件的提供方商讨更多细节了。

了解你的工作负载

尽管开源数据库技术的功能越来越丰富,但这些新加入的功能都不太具有普适性。譬如 MongoDB 新增了事务的支持、MySQL 新增了 JSON 存储的功能等等。目前开源数据库的普遍趋势是不断加入新的功能,但很多人的误区却在于没有选择最适合的工具来完成自己的工作 —— 这样的人或许是一个自大的开发者,又或许是一个视野狭窄的主管 —— 最终导致公司业务上的损失。最致命的是,在业务初期,使用了不适合的工具往往也可以顺利地完成任务,但随着业务的增长,很快就会到达瓶颈,尽管这个时候还可以替换更合适的工具,但成本就比较高了。

例如,如果你需要的是数据分析仓库,关系数据库可能不是一个适合的选择;如果你处理事务的应用要求严格的数据完整性和一致性,就不要考虑 NoSQL 了。

不要重新发明轮子

在过去的数十年,开源数据库技术迅速发展壮大。开源数据库从新生,到受到质疑,再到受到认可,现在已经成为很多企业生产环境的数据库。企业不再需要担心选择开源数据库技术会产生风险,因为开源数据库通常都有活跃的社区,可以为越来越多的初创公司、中型企业甚至 500 强公司提供开源数据库领域的支持和第三方工具。

Battery Ventures 是一家专注于技术的投资公司,最近推出了一个用于跟踪最受欢迎开源项目的 BOSS 指数 。它提供了对一些被广泛采用的开源项目和活跃的开源项目的详细情况。其中,数据库技术毫无悬念地占据了榜单的主导地位,在前十位之中占了一半。这个 BOSS 指数对于刚接触开源数据库领域的人来说,这是一个很好的切入点。当然,开源技术的提供者也会针对很多常见的典型问题给出对应的解决方案。

我认为,你想要做的事情很可能已经有人解决过了。即使这些先行者的解决方案不一定完全契合你的需求,但也可以从他们成功或失败的案例中根据你自己的需求修改得出合适的解决方案。

如果你采用了一个最前沿的技术,这就是你探索的好机会了。如果你的工作负载刚好适合新的开源数据库技术,放胆去尝试吧。第一个吃螃蟹的人总是会得到意外的挑战和收获。

先从简单开始

你的数据库实际上需要达到多少个 9 的可用性?对许多公司来说,“实现高可用性”仅仅只是一个模糊的目标。当然,最常见的答案都会是“它是关键应用,我们无论多短的停机时间都是无法忍受的”。

数据库环境越复杂,管理的难度就越大,成本也会越高。理论上你总可以将数据库的可用性提得更高,但代价将会是大大增加的管理难度和性能下降。所以,先从简单开始,直到有需要时再逐步扩展。

例如,Booking.com 是一个有名的旅游预订网站。但少有人知的是,它使用 MySQL 作为数据库后端。 Booking.com 高级系统架构师 Nicolai Plum 曾经发表过一次演讲,讲述了他们公司使用 MySQL 数据库的历程。其中一个重点就是,在初始阶段数据库可以被配置得很简单,然后逐渐变得复杂。对于早期的数据库需求,一个简单的主从架构就足够了,但随着工作负载和数据量的增加,数据库引入了负载均衡、多个读取副本,还使用 Hadoop 进行分析。尽管如此,早期的架构仍然是非常简单的。

有疑问,找专家

如果你仍然不确定数据库选择的是否合适,可以在论坛、网站或者与软件的提供者处商讨。研究各种开源数据库是否满足自己的需求是一件很有意义的事,因为总会发现你从不知道的技术。而开源社区就是分享这些信息的地方。

当你接触到开源软件和软件提供者时,有一件重要的事情需要注意。很多公司都有开放的核心业务模式,鼓励采用他们的数据库软件。你可以只接受他们的部分建议和指导,然后用你自己的能力去研究和探索替代方案。

总结

选择正确的开源数据库是一个重要的过程。很多时候,人们都会在真正理解需求之前就做出决定,这是本末倒置的。


via: https://opensource.com/article/18/10/tips-choosing-right-open-source-database

作者:Barrett Chambers 选题:lujun9972 译者:HankChow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

学习使用 systemd 创建启动你的游戏服务器的定时器。

之前,我们看到了如何手动的、在开机与关机时、在启用某个设备时、在文件系统发生改变时 启用与禁用 systemd 服务。

定时器增加了另一种启动服务的方式,基于……时间。尽管与定时任务很相似,但 systemd 定时器稍微地灵活一些。让我们看看它是怎么工作的。

“定时运行”

让我们展开本系列前两篇文章中你所设置的 Minetest 服务器作为如何使用定时器单元的第一个例子。如果你还没有读过那几篇文章,可以现在去看看。

你将通过创建一个定时器来“改进” Minetest 服务器,使得在服务器启动 1 分钟后运行游戏服务器而不是立即运行。这样做的原因可能是,在启动之前可能会用到其他的服务,例如发邮件给其他玩家告诉他们游戏已经准备就绪,你要确保其他的服务(例如网络)在开始前完全启动并运行。

最终,你的 minetest.timer 单元看起来就像这样:

# minetest.timer
[Unit]
Description=Runs the minetest.service 1 minute after boot up

[Timer]
OnBootSec=1 m
Unit=minetest.service

[Install]
WantedBy=basic.target

一点也不难吧。

如以往一般,开头是 [Unit] 和一段描述单元作用的信息,这儿没什么新东西。[Timer] 这一节是新出现的,但它的作用不言自明:它包含了何时启动服务,启动哪个服务的信息。在这个例子当中,OnBootSec 是告诉 systemd 在系统启动后运行服务的指令。

其他的指令有:

  • OnActiveSec=,告诉 systemd 在定时器启动后多长时间运行服务。
  • OnStartupSec=,同样的,它告诉 systemd 在 systemd 进程启动后多长时间运行服务。
  • OnUnitActiveSec=,告诉 systemd 在上次由定时器激活的服务启动后多长时间运行服务。
  • OnUnitInactiveSec=,告诉 systemd 在上次由定时器激活的服务停用后多长时间运行服务。

继续 minetest.timer 单元,basic.target 通常用作 后期引导服务 late boot services 的 同步点 synchronization point 。这就意味着它可以让 minetest.timer 单元运行在安装完 本地挂载点 local mount points 或交换设备,套接字、定时器、路径单元和其他基本的初始化进程之后。就像在第二篇文章中 systemd 单元里解释的那样,targets 就像 旧的运行等级 old run levels 一样,可以将你的计算机置于某个状态,或像这样告诉你的服务在达到某个状态后开始运行。

在前两篇文章中你配置的 minetest.service 文件最终看起来就像这样:

# minetest.service
[Unit]
Description= Minetest server
Documentation= https://wiki.minetest.net/Main_Page

[Service]
Type= simple
User=

ExecStart= /usr/games/minetest --server
ExecStartPost= /home//bin/mtsendmail.sh "Ready to rumble?" "Minetest Starting up"

TimeoutStopSec= 180
ExecStop= /home//bin/mtsendmail.sh "Off to bed. Nightie night!" "Minetest Stopping in 2 minutes"
ExecStop= /bin/sleep 120
ExecStop= /bin/kill -2 $MAINPID

[Install]
WantedBy= multi-user.target

这儿没什么需要修改的。但是你需要将 mtsendmail.sh(发送你的 email 的脚本)从:

#!/bin/bash
# mtsendmail
sleep 20
echo $1 | mutt -F /home/<username>/.muttrc -s "$2" my_minetest@mailing_list.com
sleep 10

改成:

#!/bin/bash
# mtsendmail.sh
echo $1 | mutt -F /home/paul/.muttrc -s "$2" [email protected]

你做的事是去除掉 Bash 脚本中那些蹩脚的停顿。Systemd 现在来做等待。

让它运行起来

确保一切运作正常,禁用 minetest.service:

sudo systemctl disable minetest

这使得系统启动时它不会一同启动;然后,相反地,启用 minetest.timer:

sudo systemctl enable minetest.timer

现在你就可以重启服务器了,当运行 sudo journalctl -u minetest.* 后,你就会看到 minetest.timer 单元执行后大约一分钟,minetest.service 单元开始运行。

 title=

图 1:minetest.timer 运行大约 1 分钟后 minetest.service 开始运行

时间的问题

minetest.timer 在 systemd 的日志里显示的启动时间为 09:08:33 而 minetest.service 启动时间是 09:09:18,它们之间少于 1 分钟,关于这件事有几点需要说明一下:首先,请记住我们说过 OnBootSec= 指令是从引导完成后开始计算服务启动的时间。当 minetest.timer 的时间到来时,引导已经在几秒之前完成了。

另一件事情是 systemd 给自己设置了一个 误差幅度 margin of error (默认是 1 分钟)来运行东西。这有助于在多个 资源密集型进程 resource-intensive processes 同时运行时分配负载:通过分配 1 分钟的时间,systemd 可以等待某些进程关闭。这也意味着 minetest.service 会在引导完成后的 1~2 分钟之间启动。但精确的时间谁也不知道。

顺便一提,你可以用 AccuracySec= 指令修改误差幅度。

你也可以检查系统上所有的定时器何时运行或是上次运行的时间:

systemctl list-timers --all

 title=

图 2:检查定时器何时运行或上次运行的时间

最后一件值得思考的事就是你应该用怎样的格式去表示一段时间。Systemd 在这方面非常灵活:2 h,2 hours 或 2hr 都可以用来表示 2 个小时。对于“秒”,你可以用 seconds,second,sec 和 s。“分”也是同样的方式:minutes,minute,min 和 m。你可以检查 man systemd.time 来查看 systemd 能够理解的所有时间单元。

下一次

下次你会看到如何使用日历中的日期和时间来定期运行服务,以及如何通过组合定时器与设备单元在插入某些硬件时运行服务。

回头见!

在 Linux 基金会和 edx 上通过免费课程 “Introduction to Linux” 学习更多关于 Linux 的知识。


via: https://www.linux.com/blog/learn/intro-to-linux/2018/7/setting-timer-systemd-linux

作者:Paul Brown 选题:lujun9972 译者:LuuMing 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Altair 8800 是 1975 年发布的自建家用电脑套件。Altair 基本上是第一台个人电脑(PC),虽然 PC 这个名词好几年前就出现了。对 Dell、HP 或者 Macbook 而言它是亚当(或者夏娃)。

有些人认为为 Z80(与 Altair 的 Intel 8080 密切相关的处理器)编写仿真器真是太棒了,并认为它需要一个模拟 Altair 的控制面板。所以如果你想知道 1975 年使用电脑是什么感觉,你可以在你的 Macbook 上运行 Altair:

Altair 8800

安装它

你可以从这里的 FTP 服务器下载 Z80 包。你要查找最新的 Z80 包版本,例如 z80pack-1.26.tgz。

首先解压文件:

$ tar -xvf z80pack-1.26.tgz

进入解压目录:

$ cd z80pack-1.26

控制面板模拟基于名为 frontpanel 的库。你必须先编译该库。如果你进入 frontpanel 目录,你会发现 README 文件列出了这个库自己的依赖项。你在这里的体会几乎肯定会与我的不同,但也许我的痛苦可以作为例子。我安装了依赖项,但是是通过 Homebrew 安装的。为了让库能够编译,我必须确保在 Makefile.osx 中将 /usr/local/include添加到 Clang 的 include 路径中。

如果你觉得依赖没有问题,那么你应该就能编译这个库(我们现在位于 z80pack-1.26/frontpanel):

$ make -f Makefile.osx ...
$ make -f Makefile.osx clean

你应该会得到 libfrontpanel.so。我把它拷贝到 libfrontpanel.so。

Altair 模拟器位于 z80pack-1.26/altairsim 下。你现在需要编译模拟器本身。进入 z80pack-1.26/altairsim/srcsim 并再次运行 make:

$ make -f Makefile.osx ...
$ make -f Makefile.osx clean

该过程将在 z80pack-1.26/altairsim 中创建一个名为 altairsim 的可执行文件。运行该可执行文件,你应该会看到标志性的 Altair 控制面板!

如果你想要探究,请阅读原始的 Altair 手册

如果你喜欢这篇文章,我们每两周更新一次!在 Twitter 上关注 [@TwoBitHistory]​​6 或订阅 RSS 源了解什么时候有新文章。


via: https://twobithistory.org/2017/12/02/simulating-the-altair.html

作者:Two-Bit History 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

截图是我工作的一部分,我先前使用深度截图工具来截图,深度截图是一个简单、轻量级且非常简洁的截图工具。它自带许多功能例如窗口识别、快捷键支持、图片编辑、延时截图、社交分享、智能存储以及图片清晰度调整等功能。今天我碰巧发现了另一个具备多种功能的截图工具,它就是 Flameshot ,一个简单但功能丰富的针对类 Unix 系统的截图工具。它简单易用,可定制并且有选项可以支持上传截图到在线图片分享网站 imgur 上。同时 Flameshot 有一个 CLI 版本,所以你也可以从命令行来进行截图。Flameshot 是一个完全免费且开源的工具。在本教程中,我们将看到如何安装 Flameshot 以及如何使用它来截图。

安装 Flameshot

在 Arch Linux 上:

Flameshot 可以从 Arch LInux 的 [community] 仓库中获取。确保你已经启用了 community 仓库,然后就可以像下面展示的那样使用 pacman 来安装 Flameshot :

$ sudo pacman -S flameshot

它也可以从 AUR 中获取,所以你还可以使用任意一个 AUR 帮助程序(例如 Yay)来在基于 Arch 的系统中安装它:

$ yay -S flameshot-git

在 Fedora 中:

$ sudo dnf install flameshot

在 Debian 10+ 和 Ubuntu 18.04+ 中,可以使用 APT 包管理器来安装它:

$ sudo apt install flameshot

在 openSUSE 上:

$ sudo zypper install flameshot

在其他的 Linux 发行版中,可以从源代码编译并安装它。编译过程中需要 Qt version 5.3 以及 GCC 4.9.2 或者它们的更高版本。

使用

可以从菜单或者应用启动器中启动 Flameshot。在 MATE 桌面环境,它通常可以在 “Applications -> Graphics” 下找到。

一旦打开了它,你就可以在系统面板中看到 Flameshot 的托盘图标。

注意:

假如你使用 Gnome 桌面环境,为了能够看到系统托盘图标,你需要安装 TopIcons 扩展。

在 Flameshot 托盘图标上右击,你便会看到几个菜单项,例如打开配置窗口、信息窗口以及退出该应用。

要进行截图,只需要点击托盘图标就可以了。接着你将看到如何使用 Flameshot 的帮助窗口。选择一个截图区域,然后敲回车键便可以截屏了,点击右键便可以看到颜色拾取器,再敲空格键便可以查看屏幕侧边的面板。你可以使用鼠标的滚轮来增加或者减少指针的宽度。

Flameshot 自带一系列非常好的功能,例如:

  • 可以进行手写
  • 可以划直线
  • 可以画长方形或者圆形框
  • 可以进行长方形区域选择
  • 可以画箭头
  • 可以对要点进行标注
  • 可以添加文本
  • 可以对图片或者文字进行模糊处理
  • 可以展示图片的尺寸大小
  • 在编辑图片是可以进行撤销和重做操作
  • 可以将选择的东西复制到剪贴板
  • 可以保存选区
  • 可以离开截屏
  • 可以选择另一个 app 来打开图片
  • 可以上传图片到 imgur 网站
  • 可以将图片固定到桌面上

下面是一个示例的视频:

http://www.ostechnix.com/wp-content/uploads/2018/09/Flameshot-demo.mp4

快捷键

Frameshot 也支持快捷键。在 Flameshot 的托盘图标上右击并点击 “Information” 窗口便可以看到在 GUI 模式下所有可用的快捷键。下面是在 GUI 模式下可用的快捷键清单:

快捷键描述
←、↓、↑、→移动选择区域 1px
Shift + ←、↓、↑、→将选择区域大小更改 1px
Esc退出截图
Ctrl + C复制到粘贴板
Ctrl + S将选择区域保存为文件
Ctrl + Z撤销最近的一次操作
鼠标右键展示颜色拾取器
鼠标滚轮改变工具的宽度

边按住 Shift 键并拖动选择区域的其中一个控制点将会对它相反方向的控制点做类似的拖放操作。

命令行选项

Flameshot 也支持一系列的命令行选项来延时截图和保存图片到自定义的路径。

要使用 Flameshot GUI 模式,运行:

$ flameshot gui

要使用 GUI 模式截屏并将你选取的区域保存到一个自定义的路径,运行:

$ flameshot gui -p ~/myStuff/captures

要延时 2 秒后打开 GUI 模式可以使用:

$ flameshot gui -d 2000

要延时 2 秒并将截图保存到一个自定义的路径(无 GUI)可以使用:

$ flameshot full -p ~/myStuff/captures -d 2000

要截图全屏并保存到自定义的路径和粘贴板中使用:

$ flameshot full -c -p ~/myStuff/captures

要在截屏中包含鼠标并将图片保存为 PNG 格式可以使用:

$ flameshot screen -r

要对屏幕 1 进行截屏并将截屏复制到粘贴板中可以运行:

$ flameshot screen -n 1 -c

你还需要什么功能呢?Flameshot 拥有几乎截屏的所有功能:添加注释、编辑图片、模糊处理或者对要点做高亮等等功能。我想:在我找到它的最佳替代品之前,我将一直使用 Flameshot 来作为我当前的截图工具。请尝试一下它,你不会失望的。

好了,这就是今天的全部内容了。后续将有更多精彩内容,请保持关注!

Cheers!


via: https://www.ostechnix.com/flameshot-a-simple-yet-powerful-feature-rich-screenshot-tool/

作者:SK 选题:lujun9972 译者:FSSlc 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

学习如何用 Markdown 管理章节引用、图像、表格以及更多。

这篇文章对于使用 Markdown 语法做一篇调研论文进行了一个深度体验。覆盖了如何创建和引用章节、图像(用 Markdown 和 LaTeX)和参考书目。我们也讨论了一些棘手的案例和为什么使用 LaTex 是一个正确的做法。

调研

调研论文一般包括对章节、图像、表格和参考书目的引用。Pandoc 本身并不能交叉引用这些,但是它能够利用 pandoc-crossref 过滤器来完成自动编号和章节、图像、表格的交叉引用。

让我们从重写原本以 LaTax 撰写的 一个教育调研报告的例子 开始,然后用 Markdown(和一些 LaTax)、Pandoc 和 Pandoc-crossref 重写。

添加并引用章节

要想章节被自动编号,必须使用 Markdown H1 标题编写。子章节使用 H2-H4 子标题编写(通常不需要更多级别了)。例如一个章节的标题是 “Implementation”,写作 # Implementation {#sec: implementation},然后 Pandoc 会把它转化为 3. Implementation(或者转换为相应的章节编号)。Implementation 这个标题使用了 H1 并且声明了一个 {#sec: implementation} 的标签,这是作者用于引用该章节的标签。要想引用一个章节,输入 @ 符号并跟上对应章节标签,使用方括号括起来即可: [@ sec:implementation]

在这篇论文中, 我们发现了下面这个例子:

we lack experience (consistency between TAs, [@sec:implementation]).

Pandoc 转换:

we lack experience (consistency between TAs, Section 4).

章节被自动编号(这在本文最后的 Makefile 当中说明)。要创建无编号的章节,输入章节的标题并在最后添加 {-}。例如:### Designing a game for maintainability {-} 就以标题 “Designing a game for maintainability”,创建了一个无标号的章节。

添加并引用图像

添加并引用一个图像,跟添加并引用一个章节和添加一个 Markdown 图片很相似:

![Scatterplot matrix](data/scatterplots/RScatterplotMatrix2.png){#fig:scatter-matrix}

上面这一行是告诉 Pandoc,有一个标有 Scatterplot matrix 的图像以及这张图片路径是 data/scatterplots/RScatterplotMatrix2.png。{#fig:scatter-matrix} 表明了用于引用该图像的名字。

这里是从一篇论文中进行图像引用的例子:

The boxes "Enjoy", "Grade" and "Motivation" ([@fig:scatter-matrix]) ...

Pandoc 产生如下输出:

The boxes "Enjoy", "Grade" and "Motivation" (Fig. 1) ...

添加及引用参考书目

大多数调研报告都把引用放在一个 BibTeX 的数据库文件中。在这个例子中,该文件被命名为 biblio.bib,它包含了论文中所有的引用。下面是这个文件的样子:

@inproceedings{wrigstad2017mastery,
    Author =       {Wrigstad, Tobias and Castegren, Elias},
    Booktitle =    {SPLASH-E},
    Title =        {Mastery Learning-Like Teaching with Achievements},
    Year =         2017
}

@inproceedings{review-gamification-framework,
  Author =       {A. Mora and D. Riera and C. Gonzalez and J. Arnedo-Moreno},
  Publisher =    {IEEE},
  Booktitle =    {2015 7th International Conference on Games and Virtual Worlds
                  for Serious Applications (VS-Games)},
  Doi =          {10.1109/VS-GAMES.2015.7295760},
  Keywords =     {formal specification;serious games (computing);design
                  framework;formal design process;game components;game design
                  elements;gamification design frameworks;gamification-based
                  solutions;Bibliographies;Context;Design
                  methodology;Ethics;Games;Proposals},
  Month =        {Sept},
  Pages =        {1-8},
  Title =        {A Literature Review of Gamification Design Frameworks},
  Year =         2015,
  Bdsk-Url-1 =   {http://dx.doi.org/10.1109/VS-GAMES.2015.7295760}
}

...

第一行的 @inproceedings{wrigstad2017mastery, 表明了出版物 的类型(inproceedings),以及用来指向那篇论文的标签(wrigstad2017mastery)。

引用这篇题为 “Mastery Learning-Like Teaching with Achievements” 的论文, 输入:

the achievement-driven learning methodology [@wrigstad2017mastery]

Pandoc 将会输出:

the achievement- driven learning methodology [30]

这篇论文将会产生像下面这样被标号的参考书目:

引用文章的集合也很容易:只要引用使用分号 ; 分隔开被标记的参考文献就可以了。如果一个引用有两个标签 —— 例如: SEABORN201514 和 gamification-leaderboard-benefits—— 像下面这样把它们放在一起引用:

Thus, the most important benefit is its potential to increase students' motivation
and engagement [@SEABORN201514;@gamification-leaderboard-benefits].

Pandoc 将会产生:

Thus, the most important benefit is its potential to increase students’ motivation
and engagement [26, 28]

问题案例

一个常见的问题是所需项目与页面不匹配。不匹配的部分会自动移动到它们认为合适的地方,即便这些位置并不是读者期望看到的位置。因此在图像或者表格接近于它们被提及的地方时,我们需要调节一下那些元素放置的位置,使得它们更加易于阅读。为了达到这个效果,我建议使用 figure 这个 LaTeX 环境参数,它可以让用户控制图像的位置。

我们看一个上面提到的图像的例子:

![Scatterplot matrix](data/scatterplots/RScatterplotMatrix2.png){#fig:scatter-matrix}

然后使用 LaTeX 重写:

\begin{figure}[t]
\includegraphics{data/scatterplots/RScatterplotMatrix2.png}
\caption{\label{fig:matrix}Scatterplot matrix}
\end{figure}

在 LaTeX 中,figure 环境参数中的 [t] 选项表示这张图用该位于该页的最顶部。有关更多选项,参阅 LaTex/Floats, Figures, and Captions 这篇 Wikibooks 的文章。

产生一篇论文

到目前为止,我们讲了如何添加和引用(子)章节、图像和参考书目,现在让我们重温一下如何生成一篇 PDF 格式的论文。要生成 PDF,我们将使用 Pandoc 生成一篇可以被构建成最终 PDF 的 LaTeX 文件。我们还会讨论如何以 LaTeX,使用一套自定义的模板和元信息文件生成一篇调研论文,以及如何将 LaTeX 文档编译为最终的 PDF 格式。

很多会议都提供了一个 .cls 文件或者一套论文应有样式的模板;例如,它们是否应该使用两列的格式以及其它的设计风格。在我们的例子中,会议提供了一个名为 acmart.cls 的文件。

作者通常想要在他们的论文中包含他们所属的机构,然而,这个选项并没有包含在默认的 Pandoc 的 LaTeX 模板(注意,可以通过输入 pandoc -D latex 来查看 Pandoc 模板)当中。要包含这个内容,找一个 Pandoc 默认的 LaTeX 模板,并添加一些新的内容。将这个模板像下面这样复制进一个名为 mytemplate.tex 的文件中:

pandoc -D latex > mytemplate.tex

默认的模板包含以下代码:

$if(author)$
\author{$for(author)$$author$$sep$ \and $endfor$}
$endif$
$if(institute)$
\providecommand{\institute}[1]{}
\institute{$for(institute)$$institute$$sep$ \and $endfor$}
$endif$

因为这个模板应该包含作者的联系方式和电子邮件地址,在其他一些选项之间,我们更新这个模板以添加以下内容(我们还做了一些其他的更改,但是因为文件的长度,就没有包含在此处):

latex
$for(author)$
    $if(author.name)$
        \author{$author.name$}
        $if(author.affiliation)$
            \affiliation{\institution{$author.affiliation$}}
        $endif$
        $if(author.email)$
            \email{$author.email$}
        $endif$
    $else$
        $author$
    $endif$
$endfor$

要让这些更改起作用,我们还应该有下面的文件:

  • main.md 包含调研论文
  • biblio.bib 包含参考书目数据库
  • acmart.cls 我们使用的文档的集合
  • mytemplate.tex 是我们使用的模板文件(代替默认的)

让我们添加论文的元信息到一个 meta.yaml 文件:

---
template: 'mytemplate.tex'
documentclass: acmart
classoption: sigconf
title: The impact of opt-in gamification on `\\`{=latex} students' grades in a software design course
author:
- name: Kiko Fernandez-Reyes
  affiliation: Uppsala University
  email: [email protected]
- name: Dave Clarke
  affiliation: Uppsala University
  email: [email protected]
- name: Janina Hornbach
  affiliation: Uppsala University
  email: [email protected]
bibliography: biblio.bib
abstract: |
  An achievement-driven methodology strives to give students more control over their learning with enough flexibility to engage them in deeper learning. (more stuff continues)

include-before: |
      \` ``{=latex}
      \copyrightyear{2018}
      \acmYear{2018}
      \setcopyright{acmlicensed}
      \acmConference[MODELS '18 Companion]{ACM/IEEE 21th International Conference on Model Driven Engineering Languages and Systems}{October 14--19, 2018}{Copenhagen, Denmark}
      \acmBooktitle{ACM/IEEE 21th International Conference on Model Driven Engineering Languages and Systems (MODELS '18 Companion), October 14--19, 2018, Copenhagen, Denmark}
      \acmPrice{XX.XX}
      \acmDOI{10.1145/3270112.3270118}
      \acmISBN{978-1-4503-5965-8/18/10}

      \begin{CCSXML}
      <ccs2012>
      <concept>
      <concept_id>10010405.10010489</concept_id>
      <concept_desc>Applied computing~Education</concept_desc>
      <concept_significance>500</concept_significance>
      </concept>
      </ccs2012>
      \end{CCSXML}

      \ccsdesc[500]{Applied computing~Education}

      \keywords{gamification, education, software design, UML}
      \` ``
figPrefix:
  - "Fig."
  - "Figs."
secPrefix:
  - "Section"
  - "Sections"
...

这个元信息文件使用 LaTeX 设置下列参数:

  • template 指向使用的模板(mytemplate.tex)
  • documentclass 指向使用的 LaTeX 文档集合(acmart)
  • classoption 是在 sigconf 的案例中,指向这个类的选项
  • title 指定论文的标题
  • author 是一个包含例如 name、affiliation 和 email 的地方
  • bibliography 指向包含参考书目的文件(biblio.bib)
  • abstract 包含论文的摘要
  • include-before 是这篇论文的具体内容之前应该被包含的信息;在 LaTeX 中被称为 前言。我在这里包含它去展示如何产生一篇计算机科学的论文,但是你可以选择跳过
  • figPrefix 指向如何引用文档中的图像,例如:当引用图像的 [@fig:scatter-matrix] 时应该显示什么。例如,当前的 figPrefix 在这个例子 The boxes "Enjoy", "Grade" and "Motivation" ([@fig:scatter-matrix])中,产生了这样的输出:The boxes "Enjoy", "Grade" and "Motivation" (Fig. 3)。如果这里有很多图像,目前的设置表明它应该在图像号码旁边显示 Figs.
  • secPrefix 指定如何引用文档中其他地方提到的部分(类似之前的图像和概览)

现在已经设置好了元信息,让我们来创建一个 Makefile,它会产生你想要的输出。Makefile 使用 Pandoc 产生 LaTeX 文件,pandoc-crossref 产生交叉引用,pdflatex 构建 LaTeX 为 PDF,bibtex 处理引用。

Makefile 已经展示如下:

all: paper

paper:
        @pandoc -s -F pandoc-crossref --natbib meta.yaml --template=mytemplate.tex -N \
         -f markdown -t latex+raw_tex+tex_math_dollars+citations -o main.tex main.md
        @pdflatex main.tex &> /dev/null
        @bibtex main &> /dev/null
        @pdflatex main.tex &> /dev/null
        @pdflatex main.tex &> /dev/null

clean:
        rm main.aux main.tex main.log main.bbl main.blg main.out

.PHONY: all clean paper

Pandoc 使用下面的标记:

  • -s 创建一个独立的 LaTeX 文档
  • -F pandoc-crossref 利用 pandoc-crossref 进行过滤
  • --natbib 用 natbib (你也可以选择 --biblatex)对参考书目进行渲染
  • --template 设置使用的模板文件
  • -N 为章节的标题编号
  • -f 和 -t 指定从哪个格式转换到哪个格式。-t 通常包含格式和 Pandoc 使用的扩展。在这个例子中,我们标明的 raw_tex+tex_math_dollars+citations 允许在 Markdown 中使用 raw_tex LaTeX。 tex_math_dollars 让我们能够像在 LaTeX 中一样输入数学符号,citations 让我们可以使用 这个扩展。

要从 LaTeX 产生 PDF,按 来自bibtex 的指导处理参考书目:

@pdflatex main.tex &> /dev/null
@bibtex main &> /dev/null
@pdflatex main.tex &> /dev/null
@pdflatex main.tex &> /dev/null

脚本用 @ 忽略输出,并且重定向标准输出和错误到 /dev/null ,因此我们在使用这些命令的可执行文件时不会看到任何的输出。

最终的结果展示如下。这篇文章的库可以在 GitHub 找到:

结论

在我看来,研究的重点是协作、思想的传播,以及在任何一个恰好存在的领域中改进现有的技术。许多计算机科学家和工程师使用 LaTeX 文档系统来写论文,它对数学提供了完美的支持。来自社会科学的研究人员似乎更喜欢 DOCX 文档。

当身处不同社区的研究人员一同写一篇论文时,他们首先应该讨论一下他们将要使用哪种格式。然而如果包含太多的数学符号,DOCX 对于工程师来说不会是最简便的选择,LaTeX 对于缺乏编程经验的研究人员来说也有一些问题。就像这篇文章中展示的,Markdown 是一门工程师和社会科学家都很轻易能够使用的语言。


via: https://opensource.com/article/18/9/pandoc-research-paper

作者:Kiko Fernandez-Reyes 选题:lujun9972 译者:dianbanjiu 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在我们发布了 Linux 中国的社区通证 LCCN 之后,我们又在通证经济建设方向迈出了一步。通证作为一个经济体系中流转的价值凭证,其不但可以根据社区成员的行为进行精细的通证分发,而且还需要建立通证的流通渠道。

按照我们之前的设计,我们流通 LCCN 的通道有二:

  1. 社区提供通证的 B2C 消费渠道
  2. 通证持有者个人的通证消费渠道

作为社区,我们可以将社区所拥有的大部分资源,比如媒体资源、客户置换资源、定制礼品等以 LCCN 兑换的方式提供给社区成员。比如这次,我们就将官方网站的广告位、认证微信的文章推送、认证微博的转发等资源开放给社区来兑换。我们也同时将从合作伙伴中置换和赞助来的资源(如兑换券、书籍等)。

此外,我们也小规模组织了二手物品的交换群,可供大家用 LCCN 交换其他人手中的闲置物品。目前已经发生了多笔交易,交易了包括手机、树莓派、书籍等物品,最高交易额高达 Ⓛ28800。

这次上线的“Linux 中国通证商城”—— https://shop.linux.cn ,是基于 WooCommerce 所构建的,并专门自行开发了支持 ERC20 通证的插件,以支持我们的 LCCN 通证的链上支付。当然,作为开源社区,我们的插件同样遵循开源精神,开源到了 GitHub 上。

我们的通证商城的上线,得到了人民邮电出版社、UCloud、刘遄老师等的大力支持。其中刘遄老师捐献了其畅销书《Linux 就该这么学》 多达 30 册。由衷感谢各位伙伴的支持!

欢迎大家体验和参与贡献,也欢迎各位合作伙伴参与我们的生态建设。