如果你在股票市场做投资，那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受的风险，时间层面的长短和资金盈利的目标去为你量身打造的一种投资计划。鉴于这类软件的重要性，因此从来不会缺乏商业性的 app 和股票行情检测软件，每一个都可以兜售复杂的投资组合以及跟踪报告功能。对于我们这些 Linux 爱好者们，我也找到了一些好用的开源投资组合管理工具，用来在 Linux 上管理和跟踪股票的投资组合，这里高度推荐一个基于 java 编写的管理软件 JStock。如果你不是一个 java 粉，也许你会放弃它，JStock 需要运行在沉重的 JVM 环境上。但同时，在每一个安装了 JRE 的环境中它都可以马上运行起来，在你的 Linux 环境中它会运行的很顺畅。“开源”就意味着免费或标准低下的时代已经过去了。鉴于 JStock 只是一个个人完成的产物，作为一个投资组合管理软件它最令人印象深刻的是包含了非常多实用的功能，以上所有的荣誉属于它的作者 Yan Cheng Cheok！例如，JStock 支持通过监视列表去监控价格，多种投资组合，自选/内置的股票指标与相关监测，支持27个不同的股票市场和跨平台的云端备份/还原。JStock 支持多平台部署（Linux, OS X, Android 和 Windows），你可以通过云端保存你的 JStock 投资组合，并通过云平台无缝的备份/还原到其他的不同平台上面。现在我将向你展示如何安装以及使用过程的一些具体细节。在 Linux 上安装 JStock因为 JStock 使用Java编写，所以必须安装 JRE才能让它运行起来。小提示，JStock 需要 JRE1.7 或更高版本。如你的 JRE 版本不能满足这个需求，JStock 将会运行失败然后出现下面的报错。Exception in thread "main" java.lang.UnsupportedClassVersionError: org/yccheok/jstock/gui/JStock : Unsupported major.minor version 51.0 在你的 Linux 上安装好了 JRE 之后，从其官网下载最新的发布的 JStock，然后加载启动它。$ wget https://github.com/yccheok/jstock/releases/download/release_1-0-7-13/jstock-1.0.7.13-bin.zip $ unzip jstock-1.0.7.13-bin.zip $ cd jstock $ chmod +x jstock.sh $ ./jstock.sh 教程的其他部分，让我来给大家展示一些 JStock 的实用功能监视监控列表中股票价格的波动使用 JStock 你可以创建一个或多个监视列表，它可以自动的监视股票价格的波动并给你提供相应的通知。在每一个监视列表里面你可以添加多个感兴趣的股票进去。之后在“Fall Below”和“Rise Above”的表格里添加你的警戒值，分别设定该股票的最低价格和最高价格。例如你设置了 AAPL 股票的最低/最高价格分别是 $102 和 $115.50，只要在价格低于 $102 或高于 $115.50 时你就得到桌面通知。你也可以设置邮件通知，这样你将收到一些价格信息的邮件通知。设置邮件通知在“Options”菜单里，在“Alert”标签中国，打开“Send message to email(s)”，填入你的 Gmail 账户。一旦完成 Gmail 认证步骤，JStock 就会开始发送邮件通知到你的 Gmail 账户（也可以设置其他的第三方邮件地址）。管理多个投资组合JStock 允许你管理多个投资组合。这个功能对于你使用多个股票经纪人时是非常实用的。你可以为每个经纪人创建一个投资组合去管理你的“买入/卖出/红利”用来了解每一个经纪人的业务情况。你也可以在“Portfolio”菜单里面选择特定的投资组合来切换不同的组合项目。下面是一张截图用来展示一个假设的投资组合。你也可以设置付给中介费，你可以为每个买卖交易设置中介费、印花税以及结算费。如果你比较懒，你也可以在选项菜单里面启用自动费用计算，并提前为每一家经济事务所设置费用方案。当你为你的投资组合增加交易之后，JStock 将自动的计算并计入费用。使用内置/自选股票指标来监控如果你要做一些股票的技术分析，你可能需要基于各种不同的标准来监控股票（这里叫做“股票指标”）。对于股票的跟踪，JStock提供多个预设的技术指示器 去获得股票上涨/下跌/逆转指数的趋势。下面的列表里面是一些可用的指标。平滑异同移动平均线（MACD）相对强弱指标 (RSI)资金流向指标 (MFI)顺势指标 (CCI)十字线黄金交叉线，死亡交叉线涨幅/跌幅开启预设指示器能需要在 JStock 中点击“Stock Indicator Editor”标签。之后点击右侧面板中的安装按钮。选择“Install from JStock server”选项，之后安装你想要的指示器。一旦安装了一个或多个指示器，你可以用他们来扫描股票。选择“Stock Indicator Scanner”标签，点击底部的“Scan”按钮，选择需要的指示器。当你选择完需要扫描的股票（例如， NYSE, NASDAQ）以后，JStock 将执行该扫描，并将该指示器捕获的结果通过列表展现。除了预设指示器以外，你也可以使用一个图形化的工具来定义自己的指示器。下面这张图例用于监控当前价格小于或等于60天平均价格的股票。通过云在 Linux 和 Android JStock 之间备份/恢复另一个非常棒的功能是 JStock 支持云备份恢复。Jstock 可以通过 Google Drive 把你的投资组合/监视列表在云上备份和恢复，这个功能可以实现在不同平台上无缝穿梭。如果你在两个不同的平台之间来回切换使用 Jstock，这种跨平台备份和还原非常有用。我在 Linux 桌面和 Android 手机上测试过我的 Jstock 投资组合，工作的非常漂亮。我在 Android 上将 Jstock 投资组合信息保存到 Google Drive 上，然后我可以在我的 Linux 版的 Jstock 上恢复它。如果能够自动同步到云上，而不用我手动地触发云备份/恢复就更好了，十分期望这个功能出现。如果你在从 Google Drive 还原之后不能看到你的投资信息以及监视列表，请确认你的国家信息与“Country”菜单里面设置的保持一致。JStock 的安卓免费版可以从 Google Play Store 获取到。如果你需要完整的功能（比如云备份，通知，图表等），你需要一次性支付费用升级到高级版。我认为高级版物有所值。写在最后，我应该说一下它的作者，Yan Cheng Cheok，他是一个十分活跃的开发者，有bug及时反馈给他。这一切都要感谢他！！！关于 JStock 这个投资组合跟踪软件你有什么想法呢？via: http://xmodulo.com/stock-portfolio-management-software-Linux.html作者：Dan Nanni 译者：ivo-wang 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
开源新闻速递：Parabola GNU/Linux-libre 2016.07.27 ISO 镜像发布
今日关注基于 Arch Linux 的 Parabola GNU/Linux-libre 2016.07.27 ISO 镜像发布。这一最新版本中涵盖了所有最近的安全更新以及最新版本的软件。有 Main ，MATE 和 TalkingParabola这三个版本，可以支持32位和64位机。在该发布版本中，将LightDM作为默认的显示管理器，实现了对Home目录更好的读写控制权限。一部分wheel组用户默认拥有sudo权限可以执行任何命令。图文摘要Wireshark 2.0.5 发布。作为全球最流行的网络协议分析工具，安全专家们可以使用Wireshark来分析并解决网络问题。最新版本修复了20多个问题，更新了对内置的802.11 Radiotap, BGP, CAN, CANopen, H.248 Q.1950, IPv4, IPv6等协议的支持。Enlightenment 0.20 系列的最后一个版本 0.20.10 发布。不过希望用户能更新到最新、最稳定的Enlightenment 0.21.0 版本。System76 PC 机用户需要立即更行到 Ubuntu 16.04.1 LTS 了。在7.28号，Canonical也宣布不再对 Ubuntu 15.10 进行安全和软件更新。因此，如果你在System76的机器上安装的是Ubuntu 15.10，那就需要尽快更新到Ubuntu 16.04.1 LTS了。
如何在 Ubuntu Linux 16.04上安装开源的 Discourse 论坛
Discourse 是一个开源的论坛，它可以以邮件列表、聊天室或者论坛等多种形式工作。它是一个广受欢迎的现代的论坛工具。在服务端，它使用 Ruby on Rails 和 Postgres 搭建, 并且使用 Redis 缓存来减少读取时间 , 在客户端，它使用支持 Java Script 的浏览器。它非常容易定制，结构良好，并且它提供了转换插件，可以对你现存的论坛、公告板进行转换，例如： vBulletin、phpBB、Drupal、SMF 等等。在这篇文章中，我们将学习在 Ubuntu 操作系统下安装 Discourse。它以安全作为设计思想，所以发垃圾信息的人和黑客们不能轻易的实现其企图。它能很好的支持各种现代设备，并可以相应的调整以手机和平板的显示。在 Ubuntu 16.04 上安装 Discourse让我们开始吧 ! 最少需要 1G 的内存，并且官方支持的安装过程需要已经安装了 docker。 说到 docker，它还需要安装Git。要满足以上的两点要求我们只需要运行下面的命令：wget -qO- https://get.docker.com/ | sh 用不了多久就安装好了 docker 和 Git，安装结束以后，在你的系统上的 /var 分区创建一个 Discourse 文件夹（当然你也可以选择其他的分区）。mkdir /var/discourse 现在我们来克隆 Discourse 的 Github 仓库到这个新建的文件夹。git clone https://github.com/discourse/discourse_docker.git /var/discourse 进入这个克隆的文件夹。cd /var/discourse 你将看到“discourse-setup” 脚本文件，运行这个脚本文件进行 Discourse 的初始化。./discourse-setup 备注： 在安装 discourse 之前请确保你已经安装好了邮件服务器。安装向导将会问你以下六个问题：Hostname for your Discourse? Email address for admin account? SMTP server address? SMTP user name? SMTP port [587]: SMTP password? []: 当你提交了以上信息以后, 它会让你提交确认, 如果一切都很正常，点击回车以后安装开始。现在“坐等放宽”，需要花费一些时间来完成安装，倒杯咖啡，看看有什么错误信息没有。安装成功以后看起来应该像这样。现在打开浏览器，如果已经做了域名解析，你可以使用你的域名来连接 Discourse 页面 ，否则你只能使用IP地址了。你将看到如下信息：就是这个，点击 “Sign Up” 选项创建一个新的账户，然后进行你的 Discourse 设置。结论它安装简便，运行完美。 它拥有现代论坛所有必备功能。它以 GPL 发布，是完全开源的产品。简单、易用、以及特性丰富是它的最大特点。希望你喜欢这篇文章，如果有问题，你可以给我们留言。via: http://linuxpitstop.com/install-discourse-on-ubuntu-linux-16-04/作者：Aun 译者：kokialoves 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
今日关注基于最新 Arch Linux 技术的 ArchEX Build 160724 发布，在这个发行版中包括了最新的软件包，比如Linux内核4.6.4。据该操作系统开发者 Arne Exton 称，这一版本在几乎所有机器上运行是最快的，鉴于Arch Linux是最轻量级、高度定制并且拥有一大批用户的操作系统，采用的LXDE桌面环境即便是在旧的PC机上也是运行最快的，我们有理由相信Arne Exton的话。图文摘要openSUSE Tumbleweed 的用户目前已经可以使用最新的 KDE Plasma 5.7 桌面环境以及KDE应用16.04软件套件了，Linux内核也更新到了4.6.4。Linux Kernel 4.4.16 LTS 发布，进行了150多处改动。Solus系统的用户已经可以优先进行更新了。Ubuntu Budgie Remix 16.04.1 发布，在这一版本中，采用了最新的Solus' Budgie桌面环境，还可以对全部磁盘进行加密，也可以对Home文件夹进行加密。另外，也可以选择任何你熟悉的语言来进行安装。还有一个好消息，这一版本引入了对快照打包的支持。
每个 Fedora 系统都运行着一个内核。许多代码片段组合在一起使之成为现实。每个 Fedora 内核都起始于一个来自于上游社区的基线版本——通常称之为 vanilla 内核。上游内核就是标准。（Fedora 的）目标是包含尽可能多的上游代码，这样使得 bug 修复和 API 更新更加容易，同时也会有更多的人审查代码。理想情况下，Fedora 能够直接获取 kernel.org 的内核，然后发送给所有用户。现实情况是，使用 vanilla 内核并不能完全满足 Fedora。Vanilla 内核可能并不支持一些 Fedora 用户希望拥有的功能。用户接收的 [Fedora 内核] 是在 vanilla 内核之上打了很多补丁的内核。这些补丁被认为“ 不在树上 （ out of tree ） ”。许多这些位于补丁树之外的补丁都不会存在太久。如果某补丁能够修复一个问题，那么该补丁可能会被合并到 Fedora 树，以便用户能够更快地收到修复。当内核变基到一个新版本时，在新版本中的补丁都将被清除。一些补丁会在 Fedora 内核树上存在很长时间。一个很好的例子是，安全启动补丁就是这类补丁。这些补丁提供了 Fedora 希望支持的功能，即使上游社区还没有接受它们。保持这些补丁更新是需要付出很多努力的，所以 Fedora 尝试减少不被上游内核维护者接受的补丁数量。通常来说，想要在 Fedora 内核中获得一个补丁的最佳方法是先给 Linux 内核邮件列表（LKML） 发送补丁，然后请求将该补丁包含到 Fedora 中。如果某个维护者接受了补丁，就意味着 Fedora 内核树中将来很有可能会包含该补丁。一些来自于 GitHub 等地方的还没有提交给 LKML 的补丁是不可能进入内核树的。首先向 LKML 发送补丁是非常重要的，它能确保 Fedora 内核树中携带的补丁是功能正常的。如果没有社区审查，Fedora 最终携带的补丁将会充满 bug 并会导致问题。Fedora 内核中包含的代码来自许多地方。一切都需要提供最佳的体验。via: https://fedoramagazine.org/makes-fedora-kernel/作者：Laura Abbott 译者：ChrisLeeGit 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在上篇中，我们已经创建了一个 shell 主循环、切分了命令输入，以及通过 fork 和 exec 执行命令。在这部分，我们将会解决剩下的问题。首先，cd test_dir2 命令无法修改我们的当前目录。其次，我们仍无法优雅地从 shell 中退出。步骤 4：内置命令“cd test_dir2 无法修改我们的当前目录” 这句话是对的，但在某种意义上也是错的。在执行完该命令之后，我们仍然处在同一目录，从这个意义上讲，它是对的。然而，目录实际上已经被修改，只不过它是在子进程中被修改。还记得我们分叉（fork）了一个子进程，然后执行命令，执行命令的过程没有发生在父进程上。结果是我们只是改变了子进程的当前目录，而不是父进程的目录。然后子进程退出，而父进程在原封不动的目录下继续运行。因此，这类与 shell 自己相关的命令必须是内置命令。它必须在 shell 进程中执行而不是在分叉中（forking）。cd让我们从 cd 命令开始。我们首先创建一个 builtins 目录。每一个内置命令都会被放进这个目录中。yosh_project |-- yosh |-- builtins | |-- __init__.py | |-- cd.py |-- __init__.py |-- shell.py 在 cd.py 中，我们通过使用系统调用 os.chdir 实现自己的 cd 命令。import os from yosh.constants import * def cd(args): os.chdir(args[0]) return SHELL_STATUS_RUN 注意，我们会从内置函数返回 shell 的运行状态。所以，为了能够在项目中继续使用常量，我们将它们移至 yosh/constants.py。yosh_project |-- yosh |-- builtins | |-- __init__.py | |-- cd.py |-- __init__.py |-- constants.py |-- shell.py 在 constants.py 中，我们将状态常量都放在这里。SHELL_STATUS_STOP = 0 SHELL_STATUS_RUN = 1 现在，我们的内置 cd 已经准备好了。让我们修改 shell.py 来处理这些内置函数。... ### 导入常量 from yosh.constants import * ### 使用哈希映射来存储内建的函数名及其引用 built_in_cmds = {} def tokenize(string): return shlex.split(string) def execute(cmd_tokens): ### 从元组中分拆命令名称与参数 cmd_name = cmd_tokens[0] cmd_args = cmd_tokens[1:] ### 如果该命令是一个内建命令，使用参数调用该函数 if cmd_name in built_in_cmds: return built_in_cmds[cmd_name](cmd_args) ... 我们使用一个 python 字典变量 built_in_cmds 作为 哈希映射 （ hash map ） ，以存储我们的内置函数。我们在 execute 函数中提取命令的名字和参数。如果该命令在我们的哈希映射中，则调用对应的内置函数。（提示：built_in_cmds[cmd_name] 返回能直接使用参数调用的函数引用。)我们差不多准备好使用内置的 cd 函数了。最后一步是将 cd 函数添加到 built_in_cmds 映射中。... ### 导入所有内建函数引用 from yosh.builtins import * ... ### 注册内建函数到内建命令的哈希映射中 def register_command(name, func): built_in_cmds[name] = func ### 在此注册所有的内建命令 def init(): register_command("cd", cd) def main(): ###在开始主循环之前初始化 shell init() shell_loop() 我们定义了 register_command 函数，以添加一个内置函数到我们内置的命令哈希映射。接着，我们定义 init 函数并且在这里注册内置的 cd 函数。注意这行 register_command("cd", cd) 。第一个参数为命令的名字。第二个参数为一个函数引用。为了能够让第二个参数 cd 引用到 yosh/builtins/cd.py 中的 cd 函数引用，我们必须将以下这行代码放在 yosh/builtins/__init__.py 文件中。from yosh.builtins.cd import * 因此，在 yosh/shell.py 中，当我们从 yosh.builtins 导入 * 时，我们可以得到已经通过 yosh.builtins 导入的 cd 函数引用。我们已经准备好了代码。让我们尝试在 yosh 同级目录下以模块形式运行我们的 shell，python -m yosh.shell。现在，cd 命令可以正确修改我们的 shell 目录了，同时非内置命令仍然可以工作。非常好！exit最后一块终于来了：优雅地退出。我们需要一个可以修改 shell 状态为 SHELL_STATUS_STOP 的函数。这样，shell 循环可以自然地结束，shell 将到达终点而退出。和 cd 一样，如果我们在子进程中分叉并执行 exit 函数，其对父进程是不起作用的。因此，exit 函数需要成为一个 shell 内置函数。让我们从这开始：在 builtins 目录下创建一个名为 exit.py 的新文件。yosh_project |-- yosh |-- builtins | |-- __init__.py | |-- cd.py | |-- exit.py |-- __init__.py |-- constants.py |-- shell.py exit.py 定义了一个 exit 函数，该函数仅仅返回一个可以退出主循环的状态。from yosh.constants import * def exit(args): return SHELL_STATUS_STOP 然后，我们导入位于 yosh/builtins/__init__.py 文件的 exit 函数引用。from yosh.builtins.cd import * from yosh.builtins.exit import * 最后，我们在 shell.py 中的 init() 函数注册 exit 命令。... ### 在此注册所有的内建命令 def init(): register_command("cd", cd) register_command("exit", exit) ... 到此为止！尝试执行 python -m yosh.shell。现在你可以输入 exit 优雅地退出程序了。最后的想法我希望你能像我一样享受创建 yosh （your own shell）的过程。但我的 yosh 版本仍处于早期阶段。我没有处理一些会使 shell 崩溃的极端状况。还有很多我没有覆盖的内置命令。为了提高性能，一些非内置命令也可以实现为内置命令（避免新进程创建时间）。同时，大量的功能还没有实现（请看 公共特性 和 不同特性）。我已经在 https://github.com/supasate/yosh 中提供了源代码。请随意 fork 和尝试。现在该是创建你真正自己拥有的 Shell 的时候了。Happy Coding!via: https://hackercollider.com/articles/2016/07/06/create-your-own-shell-in-python-part-2/作者：Supasate Choochaisri 译者：cposture 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在这篇文章中，我们会点评一些可以在 Linux 上安装使用的最好的 Markdown 编辑器。 你可以在 Linux 平台上找到非常多的 的 Markdown 编辑器，但是在这里我们将尽可能地为您推荐那些最好的。Best Linux Markdown Editors对于不了解 Markdown 的人做个简单介绍，Markdown 是由著名的 Aaron Swartz 和 John Gruber 发明的标记语言，其最初的解析器是一个用 Perl 写的简单、轻量的同名工具。它可以将用户写的纯文本转为可用的 HTML（或 XHTML）。它实际上是一门易读，易写的纯文本语言，以及一个用于将文本转为 HTML 的转换工具。希望你先对 Markdown 有一个稍微的了解，接下来让我们逐一列出这些编辑器。1. AtomAtom 是一个现代的、跨平台、开源且强大的文本编辑器，它可以运行在 Linux、Windows 和 MAC OS X 等操作系统上。用户可以在它的基础上进行定制，删减修改任何配置文件。它包含了一些非常杰出的特性：内置软件包管理器智能自动补全功能提供多窗口操作支持查找替换功能包含一个文件系统浏览器轻松自定义主题开源、高度扩展性的软件包等Atom Markdown Editor for Linux访问主页: https://atom.io/2. GNU EmacsEmacs 是 Linux 平台上一款的流行文本编辑器。它是一个非常棒的、具备高扩展性和定制性的 Markdown 语言编辑器。它综合了以下这些神奇的特性：带有丰富的内置文档，包括适合初学者的教程有完整的 Unicode 支持，可显示所有的人类符号支持内容识别的文本编辑模式包括多种文件类型的语法高亮可用 Emacs Lisp 或 GUI 对其进行高度定制提供了一个包系统可用来下载安装各种扩展等Emacs Markdown Editor for Linux访问主页: https://www.gnu.org/software/emacs/3. RemarkableRemarkable 可能是 Linux 上最好的 Markdown 编辑器了，它也适用于 Windows 操作系统。它的确是是一个卓越且功能齐全的 Markdown 编辑器，为用户提供了一些令人激动的特性。一些卓越的特性：支持实时预览支持导出 PDF 和 HTML支持 Github Markdown 语法支持定制 CSS支持语法高亮提供键盘快捷键高可定制性和其他Remarkable Markdown Editor for Linux访问主页: https://remarkableapp.github.io4. HaroopadHaroopad 是为 Linux，Windows 和 Mac OS X 构建的跨平台 Markdown 文档处理程序。用户可以用它来书写许多专家级格式的文档，包括电子邮件、报告、博客、演示文稿和博客文章等等。功能齐全且具备以下的亮点：轻松导入内容支持导出多种格式广泛支持博客和邮件支持许多数学表达式支持 Github Markdown 扩展为用户提供了一些令人兴奋的主题、皮肤和 UI 组件等等Haroopad Markdown Editor for Linux访问主页: http://pad.haroopress.com/5. ReTextReText 是为 Linux 和其它几个 POSIX 兼容操作系统提供的简单、轻量、强大的 Markdown 编辑器。它还可以作为一个 reStructuredText 编辑器，并且具有以下的特性：简单直观的 GUI具备高定制性，用户可以自定义语法文件和配置选项支持多种配色方案支持使用多种数学公式启用导出扩展等等ReText Markdown Editor for Linux访问主页: https://github.com/retext-project/retext6. UberWriterUberWriter 是一个简单、易用的 Linux Markdown 编辑器。它的开发受 Mac OS X 上的 iA writer 影响很大，同样它也具备这些卓越的特性：使用 pandoc 进行所有的文本到 HTML 的转换提供了一个简洁的 UI 界面提供了一种 专心 （ distraction free ） 模式，高亮用户最后的句子支持拼写检查支持全屏模式支持用 pandoc 导出 PDF、HTML 和 RTF启用语法高亮和数学函数等等UberWriter Markdown Editor for Linux访问主页: http://uberwriter.wolfvollprecht.de/7. Mark My WordsMark My Words 同样也是一个轻量、强大的 Markdown 编辑器。它是一个相对比较新的编辑器，因此提供了包含语法高亮在内的大量的功能，简单和直观的 UI。下面是一些棒极了，但还未捆绑到应用中的功能：实时预览Markdown 解析和文件 IO状态管理支持导出 PDF 和 HTML监测文件的修改支持首选项设置MarkMyWords Markdown Editor for-Linux访问主页: https://github.com/voldyman/MarkMyWords8. Vim-Instant-Markdown 插件Vim 是 Linux 上的一个久经考验的强大、流行而开源的文本编辑器。它用于编程极棒。它也高度支持插件功能，可以让用户为其增加一些其它功能，包括 Markdown 预览。有好几种 Vim 的 Markdown 预览插件，但是 Vim-Instant-Markdown 的表现最佳。9. Bracket-MarkdownPreview 插件Brackets 是一个现代、轻量、开源且跨平台的文本编辑器。它特别为 Web 设计和开发而构建。它的一些重要功能包括：支持内联编辑器、实时预览、预处理支持及更多。它也是通过插件高度可扩展的，你可以使用 Bracket-MarkdownPreview 插件来编写和预览 Markdown 文档。Brackets Markdown Plugin Preview10. SublimeText-Markdown 插件Sublime Text 是一个精心打造的、流行的、跨平台文本编辑器，用于代码、markdown 和普通文本。它的表现极佳，包括如下令人兴奋的功能：简洁而美观的 GUI支持多重选择提供专心模式支持窗体分割编辑通过 Python 插件 API 支持高度插件化完全可定制化，提供命令查找模式SublimeText-Markdown 插件是一个支持格式高亮的软件包，带有一些漂亮的颜色方案。SublimeText Markdown Plugin Preview结论通过上面的列表，你大概已经知道要为你的 Linux 桌面下载、安装什么样的 Markdown 编辑器和文档处理程序了。请注意，这里提到的最好的 Markdown 编辑器可能对你来说并不是最好的选择。因此你可以通过下面的反馈部分，为我们展示你认为列表中未提及的，并且具备足够的资格的，令人兴奋的 Markdown 编辑器。via: http://www.tecmint.com/best-markdown-editors-for-linux/作者：Aaron Kili 译者：Locez 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
欢迎来到“Fedora 中的容器技术”系列！本文是该系列文章中的第一篇，它将说明你可以怎样使用 Fedora 中各种可用的容器技术。本文将学习 systemd-nspawn 的相关知识。容器是什么？一个容器就是一个用户空间实例，它能够在与托管容器的系统（叫做宿主系统）相隔离的环境中运行一个程序或者一个操作系统。这和 chroot 或 虚拟机 的思想非常类似。运行在容器中的进程是由与宿主操作系统相同的内核来管理的，但它们是与宿主文件系统以及其它进程隔离开的。什么是 systemd-nspawn？systemd 项目认为应当将容器技术变成桌面的基础部分，并且应当和用户的其余系统集成在一起。为此，systemd 提供了 systemd-nspawn，这款工具能够使用多种 Linux 技术创建容器。它也提供了一些容器管理工具。systemd-nspawn 和 chroot 在许多方面都是类似的，但是前者更加强大。它虚拟化了文件系统、进程树以及客户系统中的进程间通信。它的吸引力在于它提供了很多用于管理容器的工具，例如用来管理容器的 machinectl。由 systemd-nspawn 运行的容器将会与 systemd 组件一同运行在宿主系统上。举例来说，一个容器的日志可以输出到宿主系统的日志中。在 Fedora 24 上，systemd-nspawn 已经从 systemd 软件包分离出来了，所以你需要安装 systemd-container 软件包。一如往常，你可以使用 dnf install systemd-container 进行安装。创建容器使用 systemd-nspawn 创建一个容器是很容易的。假设你有一个专门为 Debian 创造的应用，并且无法在其它发行版中正常运行。那并不是一个问题，我们可以创造一个容器！为了设置容器使用最新版本的 Debian（现在是 Jessie），你需要挑选一个目录来放置你的系统。我暂时将使用目录 ~/DebianJessie。一旦你创建完目录，你需要运行 debootstrap，你可以从 Fedora 仓库中安装它。对于 Debian Jessie，你运行下面的命令来初始化一个 Debian 文件系统。$ debootstrap --arch=amd64 stable ~/DebianJessie 以上默认你的架构是 x86\_64。如果不是的话，你必须将架构的名称改为 amd64。你可以使用 uname -m 得知你的机器架构。一旦设置好你的根目录，你就可以使用下面的命令来启动你的容器。$ systemd-nspawn -bD ~/DebianJessie 容器将会在数秒后准备好并运行，当你试图登录时就会注意到：你无法使用你的系统上任何账户。这是因为 systemd-nspawn 虚拟化了用户。修复的方法很简单：将之前的命令中的 -b 移除即可。你将直接进入容器的 root 用户的 shell。此时，你只能使用 passwd 命令为 root 设置密码，或者使用 adduser 命令添加一个新用户。一旦设置好密码或添加好用户，你就可以把 -b 标志添加回去然后继续了。你会进入到熟悉的登录控制台，然后你使用设置好的认证信息登录进去。以上对于任意你想在容器中运行的发行版都适用，但前提是你需要使用正确的包管理器创建系统。对于 Fedora，你应使用 DNF 而非 debootstrap。想要设置一个最小化的 Fedora 系统，你可以运行下面的命令，要将“/absolute/path/”替换成任何你希望容器存放的位置。$ sudo dnf --releasever=24 --installroot=/absolute/path/ install systemd passwd dnf fedora-release 设置网络如果你尝试启动一个服务，但它绑定了你宿主机正在使用的端口，你将会注意到这个问题：你的容器正在使用和宿主机相同的网络接口。幸运的是，systemd-nspawn 提供了几种可以将网络从宿主机分开的方法。本地网络第一种方法是使用 --private-network 标志，它默认仅创建一个回环设备。这对于你不需要使用网络的环境是非常理想的，例如构建系统和其它持续集成系统。多个网络接口如果你有多个网络接口设备，你可以使用 --network-interface 标志给容器分配一个接口。想要给我的容器分配 eno1，我会添加选项 --network-interface=eno1。当某个接口分配给一个容器后，宿主机就不能同时使用那个接口了。只有当容器彻底关闭后，宿主机才可以使用那个接口。共享网络接口对于我们中那些并没有额外的网络设备的人来说，还有其它方法可以访问容器。一种就是使用 --port 选项。这会将容器中的一个端口定向到宿主机。使用格式是 协议:宿主机端口:容器端口，这里的协议可以是 tcp 或者 udp，宿主机端口 是宿主机的一个合法端口，容器端口 则是容器中的一个合法端口。你可以省略协议，只指定 宿主机端口:容器端口。我通常的用法类似 --port=2222:22。你可以使用 --network-veth 启用完全的、仅宿主机模式的网络，这会在宿主机和容器之间创建一个虚拟的网络接口。你也可以使用 --network-bridge 桥接二者的连接。使用 systemd 组件如果你容器中的系统含有 D-Bus，你可以使用 systemd 提供的实用工具来控制并监视你的容器。基础安装的 Debian 并不包含 dbus。如果你想在 Debian Jessie 中使用 dbus，你需要运行命令 apt install dbus。machinectl为了能够轻松地管理容器，systemd 提供了 machinectl 实用工具。使用 machinectl，你可以使用 machinectl login name 登录到一个容器中、使用 machinectl status name检查状态、使用 machinectl reboot name 启动容器或者使用 machinectl poweroff name 关闭容器。其它 systemd 命令多数 systemd 命令，例如 journalctl, systemd-analyze 和 systemctl，都支持使用 --machine 选项来指定容器。例如，如果你想查看一个名为 “foobar” 的容器的日志，你可以使用 journalctl --machine=foobar。你也可以使用 systemctl --machine=foobar status service 来查看运行在这个容器中的服务状态。和 SELinux 一起工作如果你要使用 SELinux 强制模式（Fedora 默认模式），你需要为你的容器设置 SELinux 环境。想要那样的话，你需要在宿主系统上运行下面两行命令。$ semanage fcontext -a -t svirt_sandbox_file_t "/path/to/container(/.*)?" $ restorecon -R /path/to/container/ 确保使用你的容器路径替换 “/path/to/container”。对于我的容器 "DebianJessie"，我会运行下面的命令：$ semanage fcontext -a -t svirt_sandbox_file_t "/home/johnmh/DebianJessie(/.*)?" $ restorecon -R /home/johnmh/DebianJessie/ via: https://fedoramagazine.org/container-technologies-fedora-systemd-nspawn/作者：John M. Harris, Jr. 译者：ChrisLeeGit 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
我很想知道一个 shell （像 bash，csh 等）内部是如何工作的。于是为了满足自己的好奇心，我使用 Python 实现了一个名为 yosh （Your Own Shell）的 Shell。本文章所介绍的概念也可以应用于其他编程语言。（提示：你可以在这里查找本博文使用的源代码，代码以 MIT 许可证发布。在 Mac OS X 10.11.5 上，我使用 Python 2.7.10 和 3.4.3 进行了测试。它应该可以运行在其他类 Unix 环境，比如 Linux 和 Windows 上的 Cygwin。）让我们开始吧。步骤 0：项目结构对于此项目，我使用了以下的项目结构。yosh_project |-- yosh |-- __init__.py |-- shell.py yosh_project 为项目根目录（你也可以把它简单命名为 yosh）。yosh 为包目录，且 __init__.py 可以使它成为与包的目录名字相同的包（如果你不用 Python 编写的话，可以忽略它。）shell.py 是我们主要的脚本文件。步骤 1：Shell 循环当启动一个 shell，它会显示一个命令提示符并等待你的命令输入。在接收了输入的命令并执行它之后（稍后文章会进行详细解释），你的 shell 会重新回到这里，并循环等待下一条指令。在 shell.py 中，我们会以一个简单的 main 函数开始，该函数调用了 shell\_loop() 函数，如下：def shell_loop(): # Start the loop here def main(): shell_loop() if __name__ == "__main__": main() 接着，在 shell_loop() 中，为了指示循环是否继续或停止，我们使用了一个状态标志。在循环的开始，我们的 shell 将显示一个命令提示符，并等待读取命令输入。import sys SHELL_STATUS_RUN = 1 SHELL_STATUS_STOP = 0 def shell_loop(): status = SHELL_STATUS_RUN while status == SHELL_STATUS_RUN: ### 显示命令提示符 sys.stdout.write('> ') sys.stdout.flush() ### 读取命令输入 cmd = sys.stdin.readline() 之后，我们 切分命令 （ tokenize ） 输入并进行 执行 （ execute ） （我们即将实现 tokenize 和 execute 函数）。因此，我们的 shell\_loop() 会是如下这样：import sys SHELL_STATUS_RUN = 1 SHELL_STATUS_STOP = 0 def shell_loop(): status = SHELL_STATUS_RUN while status == SHELL_STATUS_RUN: ### 显示命令提示符 sys.stdout.write('> ') sys.stdout.flush() ### 读取命令输入 cmd = sys.stdin.readline() ### 切分命令输入 cmd_tokens = tokenize(cmd) ### 执行该命令并获取新的状态 status = execute(cmd_tokens) 这就是我们整个 shell 循环。如果我们使用 python shell.py 启动我们的 shell，它会显示命令提示符。然而如果我们输入命令并按回车，它会抛出错误，因为我们还没定义 tokenize 函数。为了退出 shell，可以尝试输入 ctrl-c。稍后我将解释如何以优雅的形式退出 shell。步骤 2： 命令切分 （ tokenize ） 当用户在我们的 shell 中输入命令并按下回车键，该命令将会是一个包含命令名称及其参数的长字符串。因此，我们必须切分该字符串（分割一个字符串为多个元组）。咋一看似乎很简单。我们或许可以使用 cmd.split()，以空格分割输入。它对类似 ls -a my_folder 的命令起作用，因为它能够将命令分割为一个列表 ['ls', '-a', 'my_folder']，这样我们便能轻易处理它们了。然而，也有一些类似 echo "Hello World" 或 echo 'Hello World' 以单引号或双引号引用参数的情况。如果我们使用 cmd.spilt，我们将会得到一个存有 3 个标记的列表 ['echo', '"Hello', 'World"'] 而不是 2 个标记的列表 ['echo', 'Hello World']。幸运的是，Python 提供了一个名为 shlex 的库，它能够帮助我们如魔法般地分割命令。（提示：我们也可以使用正则表达式，但它不是本文的重点。）import sys import shlex ... def tokenize(string): return shlex.split(string) ... 然后我们将这些元组发送到执行进程。步骤 3：执行这是 shell 中核心而有趣的一部分。当 shell 执行 mkdir test_dir 时，到底发生了什么？（提示： mkdir 是一个带有 test_dir 参数的执行程序，用于创建一个名为 test_dir 的目录。）execvp 是这一步的首先需要的函数。在我们解释 execvp 所做的事之前，让我们看看它的实际效果。import os ... def execute(cmd_tokens): ### 执行命令 os.execvp(cmd_tokens[0], cmd_tokens) ### 返回状态以告知在 shell_loop 中等待下一个命令 return SHELL_STATUS_RUN ... 再次尝试运行我们的 shell，并输入 mkdir test_dir 命令，接着按下回车键。在我们敲下回车键之后，问题是我们的 shell 会直接退出而不是等待下一个命令。然而，目录正确地创建了。因此，execvp 实际上做了什么？execvp 是系统调用 exec 的一个变体。第一个参数是程序名字。v 表示第二个参数是一个程序参数列表（参数数量可变）。p 表示将会使用环境变量 PATH 搜索给定的程序名字。在我们上一次的尝试中，它将会基于我们的 PATH 环境变量查找mkdir 程序。（还有其他 exec 变体，比如 execv、execvpe、execl、execlp、execlpe；你可以 google 它们获取更多的信息。）exec 会用即将运行的新进程替换调用进程的当前内存。在我们的例子中，我们的 shell 进程内存会被替换为 mkdir 程序。接着，mkdir 成为主进程并创建 test_dir 目录。最后该进程退出。这里的重点在于我们的 shell 进程已经被 mkdir 进程所替换。这就是我们的 shell 消失且不会等待下一条命令的原因。因此，我们需要其他的系统调用来解决问题：fork。fork 会分配新的内存并拷贝当前进程到一个新的进程。我们称这个新的进程为子进程，调用者进程为父进程。然后，子进程内存会被替换为被执行的程序。因此，我们的 shell，也就是父进程，可以免受内存替换的危险。让我们看看修改的代码。... def execute(cmd_tokens): ### 分叉一个子 shell 进程 ### 如果当前进程是子进程，其 `pid` 被设置为 `0` ### 否则当前进程是父进程的话，`pid` 的值 ### 是其子进程的进程 ID。 pid = os.fork() if pid == 0: ### 子进程 ### 用被 exec 调用的程序替换该子进程 os.execvp(cmd_tokens[0], cmd_tokens) elif pid > 0: ### 父进程 while True: ### 等待其子进程的响应状态（以进程 ID 来查找） wpid, status = os.waitpid(pid, 0) ### 当其子进程正常退出时 ### 或者其被信号中断时，结束等待状态 if os.WIFEXITED(status) or os.WIFSIGNALED(status): break ### 返回状态以告知在 shell_loop 中等待下一个命令 return SHELL_STATUS_RUN ... 当我们的父进程调用 os.fork() 时，你可以想象所有的源代码被拷贝到了新的子进程。此时此刻，父进程和子进程看到的是相同的代码，且并行运行着。如果运行的代码属于子进程，pid 将为 0。否则，如果运行的代码属于父进程，pid 将会是子进程的进程 id。当 os.execvp 在子进程中被调用时，你可以想象子进程的所有源代码被替换为正被调用程序的代码。然而父进程的代码不会被改变。当父进程完成等待子进程退出或终止时，它会返回一个状态，指示继续 shell 循环。运行现在，你可以尝试运行我们的 shell 并输入 mkdir test_dir2。它应该可以正确执行。我们的主 shell 进程仍然存在并等待下一条命令。尝试执行 ls，你可以看到已创建的目录。但是，这里仍有一些问题。第一，尝试执行 cd test_dir2，接着执行 ls。它应该会进入到一个空的 test_dir2 目录。然而，你将会看到目录并没有变为 test_dir2。第二，我们仍然没有办法优雅地退出我们的 shell。我们将会在下篇解决诸如此类的问题。via: https://hackercollider.com/articles/2016/07/05/create-your-own-shell-in-python-part-1/作者：Supasate Choochaisri 译者：cposture 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
简介: 这个新手指南会向你展示如何在 Ubuntu Linux 中修改默认程序对于我来说，安装 VLC 多媒体播放器是安装完 Ubuntu 16.04 该做的事中最先做的几件事之一。为了能够使我双击一个视频就用 VLC 打开，在我安装完 VLC 之后我会设置它为默认程序。作为一个新手，你需要知道如何在 Ubuntu 中修改任何默认程序，这也是我今天在这篇指南中所要讲的。在 Ubuntu 中修改默认程序这里提及的方法适用于所有的 Ubuntu 12.04，Ubuntu 14.04 和Ubuntu 16.04。在 Ubuntu 中，这里有两种基本的方法可以修改默认程序：通过系统设置通过右键菜单1.通过系统设置修改 Ubuntu 的默认程序进入 Unity 面板并且搜索 系统设置 （ System Settings ） ：在 系统设置 （ System Settings ） 中，选择 详细选项 （ Details ） ：在左边的面板中选择 默认程序 （ Default Applications ） ，你会发现在右边的面板中可以修改默认程序。正如看到的那样，这里只有少数几类的默认程序可以被改变。你可以在这里改变浏览器、邮箱客户端、日历、音乐、视频和相册的默认程序。那其他类型的默认程序怎么修改？不要担心，为了修改其他类型的默认程序，我们会用到右键菜单。2.通过右键菜单修改默认程序如果你使用过 Windows 系统，你应该看见过右键菜单的“打开方式”，可以通过这个来修改默认程序。我们在 Ubuntu 中也有相似的方法。右键一个还没有设置默认打开程序的文件，选择“ 属性 （ properties ） ”从右键菜单中选择属性在这里，你可以选择使用什么程序打开，并且设置为默认程序。在 Ubuntu 中设置打开 WebP 图片的默认程序为 gThumb小菜一碟不是么？一旦你做完这些，所有同样类型的文件都会用你选择的默认程序打开。我很希望这个新手指南对你在修改 Ubuntu 的默认程序时有帮助。如果你有任何的疑问或者建议，可以随时在下面评论。via: https://itsfoss.com/change-default-applications-ubuntu/作者：Abhishek Prakash 译者：Locez 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出