2017年6月

 title=

品牌是营销的重要组成部分。完成了品牌的塑造并形成一定的影响力之后,一个简单的 Logo (比如说耐克旋风一样) 就会成为这个品牌的强大广告。如果你常常在美国各州之间穿梭,你将会看各种描述品牌的标志符号,如麦当劳的 金色拱门 golden arches 。即便是没有任何文字或图像的简单色彩组合也是可以用来作为一个品牌的,比如美国弗吉尼亚理工大学的栗色和橙色,这种独特的色彩结合是很难被认错的。

所以,现在的问题是:品牌对于开源社区是否真的那么重要呢?

对于我和其他很多的人来说,是的,非常重要。开源软件要与付费软件进行竞争,那么它必须要将自己定义为切实可行的替代品。并且,它也必须要让人容易记住以及形成一定程度的影响力。如果某个开源软件项目以一种设计难看的 Logo、糟糕的口号、前后矛盾的信息来表现自己的话,那它就很难引起大众的注意、难以记住和得到广泛使用。

现有很多项目这方面做得很好,我们可以从中寻找灵感和指导方法。以下是我最喜欢的六个开源品牌。

六大开源品牌

Linux

 title=

这个可爱的 Linux 企鹅叫做 Tux,人们通常将其称为吉祥物,而非 Logo。

Tux 是 Larry Ewing 在 1996 年使用 GIMP 0.54 创建出来的。按 Jeff Ayers 讲述的故事:自从 Linus Torvalds 1993 年在澳大利亚的某个动物园被一只企鹅咬了一口之后,他就特别的钟爱它们。Torvalds 当时正在为 Linux 寻找一个有趣的形象,他觉得一个饱食后正在休息的胖企鹅是一个不错的选择。Tux 同时也出现在视频游戏和麦片广告中,它甚至还有一个叫做 Gown 的异性同伴。正如 Mac 用户熟知那个被咬了一口的苹果、Windows 用户熟知那个飘动的窗口那样,作为 Linux 用户,你肯定也非常熟悉 Tux。

Mozilla

 title=

Mozilla 基金会是一个非营利组织和 自由软件社区

近期,它完成了品牌重建行动,其创意团队负责人 Tim Murray 这样写道:“该项目的核心就是应让人们更好地理解 Mozilla 自身的目的和商标的需求而生。我们的品牌标识,包括 Logo、口号及其设计,是我们用以传递我们自身的信仰和所做的工作的重要信号。”

以真正的开源方式,Mozilla 邀请所有的人来为项目贡献自己的力量。“数千个电子邮件、数百场会议、几十种理念,以及之后的三轮讨究,我们把自己的想法都分享了出来。”但是,他们仍然遵循指导方针进行,还需要你参与到贡献中来。

Firefox

 title=

Firefox 是 Mozilla 开发的一款旗舰级软件产品,是一个非常受欢迎的 web 浏览器

Firefox 中的 "fox" 实际上是一只小熊猫(亦称“ 红熊猫 Red Panda ”、“火狐”),这是一种中国本土的像猫一样的真实动物。故事是这样的:Firefox 原本有个 "Phoenix" 的别称,表明它是由 Netscape 浏览器发展而来的。但在经历了 Phoenix 科技的商标起诉之后,它更名为 Mozilla Firebird。然后,Firebird RDMS 项目说它给其自己项目带来了歧义,其名称最终在 2004 年 02 月变更为 Mozilla Firefox。

平面设计师 Steve Garrity 对 Firefox 和 Phoenix 早期的 Logo 作出了批评,在“品牌化 Mozilla:走向 Mozilla 2.0”一文中详细阐述了各种缺陷。所以,Mozilla 邀请 Garrity 来领导更好的品牌化工作。新的形象是由 silverorange 开发出来的,但最终的渲染却是 Jon Hicks 完成的,他同时也为 Camino、MailChimp 和 Opera 进行过品牌化工作。

早在 2013 年,Jeopardy! 上边关于询问 Firefox 使用哪个动物做 Logo 的帖子则成了最后的线索。三位回答者都不知道答案就是一个小熊猫,而是回答了 “su”、 “raccoon” 和 “Excel”。

GIMP

 title=

GIMP 的 Logo 是由 Tuomas Kuosmanen 在 1997 年 09 月 25 日创建的 Wilber the GIMP

GIMP 是 GNU 图像处理程序 GNU Image Manipulation Program 的缩写,主要用于相片修整和图像处理。Wilber 现在已经有了一些配饰,比如 Simon Budig 设计的一顶安全帽、Raphaël Quintet 设计的巫师帽。根据 GIMP 的“链接到我们” 页面,它高度鼓励人们使用 Wilber,你甚至可以在源代码中的 /docs/Wilber_Construction_Kit.xcf.gz 获得 Wilber 的构建素材。

那么,Wilber 到底是那一种生物呢?很显然,这是一个值得热烈讨论的问题。在 gimper.net 上的一个论坛众说纷纭:一种产于北美大草原的 小狼 coyote 、熊猫、狗,或者 “高飞” Goofy 的一种衍生形象,仅举几例。而 GimpChat.com 上一位叫做 TheWarrior 的用户直接发邮件给 Wilber 的创造者 Kuosmanen,被告知说 “Wilber 是一种独立物种的动物 —— 就叫 ‘GIMP’。什么是 GIMP,这是个玩笑,因为人们一直在问,说它是一只狗、狐狸或者其他什么的就太没意思了。我设计的这一个形象的时候,在我脑袋中并没有特定哪种动物原型。”

PostgreSQL

 title=

正如你所见和熟悉的一样,使用动物头像来做 Logo 非常普遍。

一只名为 Slonik 的大象就是 PostgreSQL 的 Logo 的一部分,这是一个开源的关系型数据库管理系统 (RDMS)。Patrycja Dybka 在 Vertabelo 上写过博文,解释了这一名称是由俄语单词的大象(slony)演化而来的。Oleg Bartunov 也说过,这个 Logo 是在一个邮件讨论中初步形成的。在讨论里,在费城圣约瑟夫大学的 David Yang 建议使用大象:“……但如果你想要一个动物头像的 Logo,那么使用某种大象如何? 毕竟就像阿加莎·克里斯蒂(侦探小说家 Agatha Christie)说的那样,大象让人印象深刻。”

VLC 媒体播放器

 title=

该 Logo 不再是动物主题了,而是交通锥筒。

VLC 是一款无处不在的媒体播放器,它神奇地出现在很多人的桌面电脑上,让很多人体验到了开源,即使不知道它是开源的。VLC 是由总部在法国的 VideoLAN 组织所支持的 VideoLAN 项目的一款产品。VideoLAN 源自 1996 年在法国中央理工大学的一个学生项目。根据维基百科的描述,这个交通锥标图标参考了由法国中央理工大学的网络学生协会收集自巴黎街道上的交通锥筒。最初的手绘 Logo 在 2006 年由 Richard Oistad 重新进行了渲染。

一些有趣的花絮:

  • Seamus Islwyn 的帖子 “VLC 中的交通锥表达了哪些含义?” 告诉我们:在十二月的时候,VLC 锥筒会戴着一顶圣诞帽,但在 12 月 31 日它就会消失不见,恢复原样的锥筒。
  • 有人说,VLC 的意思是 “ 非常大的锥筒 Very Large Cone ” 或者选用它仅仅是为了和法国那些交通锥筒相关联而已。
  • “官方” 的故事背景是否准确?在 VLC 的 jean-baptiste Kempf 和用户在 VideoLAN 论坛 上的交流似乎表明,交通锥筒收集说法以及漏斗、建筑区、扩音器和其他一些说法,可能是不正确的。

我们是否完全解答了 VLC 的交通锥筒起源的问题了呢?我个人觉得:那就是 “星期六夜现场” 的尖头外星人。他们就是来自法国的,记得吗?确切地说是来自 Remulak 星球。

我很期待看到你关于自己喜欢、讨厌以及为它所代表的品牌而倍感激动的那些开源 Logo 的评论。

(题图:opensource.com)


作者简介:

Jeff Macharyas - 他有多年的出版和印刷工作经验,他曾担任过快速印刷、美国观察家、USO 巡逻、今天校园和其他出版物的艺术总监以及项目经理、编辑和发行经理。杰夫持有佛罗里达州立大学的通信信息、罗格斯大学的社会媒体营销研究生证书以及 Utica 学院的网络安全与计算机取证硕士学位。


译者简介:

GHLandy —— 另一种生活中,有属于你也适合你的舞台。或许有你狠心放弃的专业,或者不必上妆,不用摆出另外一副面孔。—— 摘自林特特《以自己喜欢的方式过一生》


via: https://opensource.com/article/17/2/six-open-source-brands

作者:Jeff Macharyas 译者:GHLandy 校对:wxy

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

在该系列的第一部分,我们写了一个小的进程启动器,作为我们调试器的基础。在这篇博客中,我们会学习在 x86 Linux 上断点是如何工作的,以及如何给我们工具添加设置断点的能力。

系列文章索引

随着后面文章的发布,这些链接会逐渐生效。

  1. 准备环境
  2. 断点
  3. 寄存器和内存
  4. Elves 和 dwarves
  5. 源码和信号
  6. 源码层逐步执行
  7. 源码层断点
  8. 调用栈
  9. 读取变量 10.之后步骤

断点是如何形成的?

有两种类型的断点:硬件和软件。硬件断点通常涉及到设置与体系结构相关的寄存器来为你产生断点,而软件断点则涉及到修改正在执行的代码。在这篇文章中我们只会关注软件断点,因为它们比较简单,而且可以设置任意多断点。在 x86 机器上任一时刻你最多只能有 4 个硬件断点,但是它们能让你在读取或者写入给定地址时触发,而不是只有当代码执行到那里的时候。

我前面说软件断点是通过修改正在执行的代码实现的,那么问题就来了:

  • 我们如何修改代码?
  • 为了设置断点我们要做什么修改?
  • 如何告知调试器?

第一个问题的答案显然是 ptrace。我们之前已经用它为我们的程序设置跟踪并继续程序的执行,但我们也可以用它来读或者写内存。

当执行到断点时,我们的更改要让处理器暂停并给程序发送信号。在 x86 机器上这是通过 int 3 重写该地址上的指令实现的。x86 机器有个 中断向量表 interrupt vector table ,操作系统能用它来为多种事件注册处理程序,例如页故障、保护故障和无效操作码。它就像是注册错误处理回调函数,但是是在硬件层面的。当处理器执行 int 3 指令时,控制权就被传递给断点中断处理器,对于 Linux 来说,就是给进程发送 SIGTRAP 信号。你可以在下图中看到这个进程,我们用 0xcc 覆盖了 mov 指令的第一个字节,它是 init 3 的指令代码。

断点

谜题的最后一个部分是调试器如何被告知中断的。如果你回顾前面的文章,我们可以用 waitpid 来监听被发送给被调试的程序的信号。这里我们也可以这样做:设置断点、继续执行程序、调用 waitpid 并等待直到发生 SIGTRAP。然后就可以通过打印已运行到的源码位置、或改变有图形用户界面的调试器中关注的代码行,将这个断点传达给用户。

实现软件断点

我们会实现一个 breakpoint 类来表示某个位置的断点,我们可以根据需要启用或者停用该断点。

class breakpoint {
public:
    breakpoint(pid_t pid, std::intptr_t addr)
        : m_pid{pid}, m_addr{addr}, m_enabled{false}, m_saved_data{}
    {}

    void enable();
    void disable();

    auto is_enabled() const -> bool { return m_enabled; }
    auto get_address() const -> std::intptr_t { return m_addr; }

private:
    pid_t m_pid;
    std::intptr_t m_addr;
    bool m_enabled;
    uint64_t m_saved_data; //data which used to be at the breakpoint address
};

这里的大部分代码都是跟踪状态;真正神奇的地方是 enabledisable 函数。

正如我们上面学到的,我们要用 int 3 指令 - 编码为 0xcc - 替换当前指定地址的指令。我们还要保存该地址之前的值,以便后面恢复该代码;我们不想忘了执行用户(原来)的代码。

void breakpoint::enable() {
    m_saved_data = ptrace(PTRACE_PEEKDATA, m_pid, m_addr, nullptr);
    uint64_t int3 = 0xcc;
    uint64_t data_with_int3 = ((m_saved_data & ~0xff) | int3); //set bottom byte to 0xcc
    ptrace(PTRACE_POKEDATA, m_pid, m_addr, data_with_int3);

    m_enabled = true;
}

PTRACE_PEEKDATA 请求告知 ptrace 如何读取被跟踪进程的内存。我们给它一个进程 ID 和一个地址,然后它返回给我们该地址当前的 64 位内容。 (m_saved_data & ~0xff) 把这个数据的低位字节置零,然后我们用它和我们的 int 3 指令按位或(OR)来设置断点。最后我们通过 PTRACE_POKEDATA 用我们的新数据覆盖那部分内存来设置断点。

disable 的实现比较简单,我们只需要恢复用 0xcc 所覆盖的原始数据。

void breakpoint::disable() {
    ptrace(PTRACE_POKEDATA, m_pid, m_addr, m_saved_data);
    m_enabled = false;
}

在调试器中增加断点

为了支持通过用户界面设置断点,我们要在 debugger 类修改三个地方:

  1. debugger 添加断点存储数据结构
  2. 添加 set_breakpoint_at_address 函数
  3. 给我们的 handle_command 函数添加 break 命令

我会将我的断点保存到 std::unordered_map<std::intptr_t, breakpoint> 结构,以便能简单快速地判断一个给定的地址是否有断点,如果有的话,取回该 breakpoint 对象。

class debugger {
    //...
    void set_breakpoint_at_address(std::intptr_t addr);
    //...
private:
    //...
    std::unordered_map<std::intptr_t,breakpoint> m_breakpoints;
}

set_breakpoint_at_address 函数中我们会新建一个 breakpoint 对象,启用它,把它添加到数据结构里,并给用户打印一条信息。如果你喜欢的话,你可以重构所有的输出信息,从而你可以将调试器作为库或者命令行工具使用,为了简便,我把它们都整合到了一起。

void debugger::set_breakpoint_at_address(std::intptr_t addr) {
    std::cout << "Set breakpoint at address 0x" << std::hex << addr << std::endl;
    breakpoint bp {m_pid, addr};
    bp.enable();
    m_breakpoints[addr] = bp;
}

现在我们会在我们的命令处理程序中增加对我们新函数的调用。

void debugger::handle_command(const std::string& line) {
    auto args = split(line,' ');
    auto command = args[0];

    if (is_prefix(command, "cont")) {
        continue_execution();
    }
    else if(is_prefix(command, "break")) {
        std::string addr {args[1], 2}; //naively assume that the user has written 0xADDRESS
        set_breakpoint_at_address(std::stol(addr, 0, 16));
    }
    else {
        std::cerr << "Unknown command\n";
    }
}

我删除了字符串中的前两个字符并对结果调用 std::stol,你也可以让该解析更健壮一些。std::stol 可以将字符串按照所给基数转化为整数。

从断点继续执行

如果你尝试这样做,你可能会发现,如果你从断点处继续执行,不会发生任何事情。这是因为断点仍然在内存中,因此一直被重复命中。简单的解决办法就是停用这个断点、运行到下一步、再次启用这个断点、然后继续执行。不过我们还需要更改程序计数器,指回到断点前面,这部分内容会留到下一篇关于操作寄存器的文章中介绍。

测试它

当然,如果你不知道要在哪个地址设置,那么在某些地址设置断点并非很有用。后面我们会学习如何在函数名或者代码行设置断点,但现在我们可以通过手动实现。

测试你调试器的简单方法是写一个 hello world 程序,这个程序输出到 std::err(为了避免缓存),并在调用输出操作符的地方设置断点。如果你继续执行被调试的程序,执行很可能会停止而不会输出任何东西。然后你可以重启调试器并在调用之后设置一个断点,现在你应该看到成功地输出了消息。

查找地址的一个方法是使用 objdump。如果你打开一个终端并执行 objdump -d <your program>,然后你应该看到你的程序的反汇编代码。你就可以找到 main 函数并定位到你想设置断点的 call 指令。例如,我编译了一个 hello world 程序,反汇编它,然后得到了如下的 main 的反汇编代码:

0000000000400936 <main>:
  400936:   55                      push   %rbp
  400937:   48 89 e5                mov    %rsp,%rbp
  40093a:   be 35 0a 40 00          mov    $0x400a35,%esi
  40093f:   bf 60 10 60 00          mov    $0x601060,%edi
  400944:   e8 d7 fe ff ff          callq  400820 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
  400949:   b8 00 00 00 00          mov    $0x0,%eax
  40094e:   5d                      pop    %rbp
  40094f:   c3                      retq

正如你看到的,要没有输出,我们要在 0x400944 设置断点,要看到输出,要在 0x400949 设置断点。

总结

现在你应该有了一个可以启动程序、允许在内存地址上设置断点的调试器。后面我们会添加读写内存和寄存器的功能。再次说明,如果你有任何问题请在评论框中告诉我。

你可以在这里 找到该项目的代码。


via: http://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/

作者:Simon Brand 译者:ictlyh 校对:jasminepeng

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

学习以 LaTeX 文本标记语言排版文档

 title=

LaTeX(读作 lay-tech )是使用纯文本创建文档的方法,使用与 HTML/CSS 或 Markdown 类似的标记标签进行风格化。 LaTeX 最常用于为学术界(如学术期刊)创建文档。 在 LaTeX 中,作者不必直接对文档进行风格化,就像在 Microsoft Word,LibreOffice Writer 或 Apple Pages 等文字处理程序中一样; 而是用纯文本编写代码,这些代码必须经过编译才能生成 PDF 文档。

起步

要想使用 LaTeX 来书写文档,首先你必须要安装一个 LaTeX 编辑器。我用的是一款自由开源软件(FOSS),其在学术界也是大受欢迎,叫做 TexStudio,它可以运行在 Windows、Unix/Linux、BSD 和 Mac OS X 上。同时你还需要安装一个 Tex 排版系统的分发版。因为我都是在 MacOS 上书写文档,所以我使用的分发版是 MacTex 或 BasicTex。对于 Windows 用户你可以使用 MiKTex,而且 Linux 用户也可以在软件库中找到它。

当你完成了 TexStudio 和某个 LaTeX 的分发版的下载,你就可以开始对你的文档进行排版了。

创建你的第一个文档

在这个简短的教程里,我们会创建一个简单的文章,包括一个大标题、一个子标题和两个段落。

在启动 TexStudio 后,保存一份新的文档。 (我将其保存为 helloworld.tex ,因为我正在编写本教程的 Hello,World!文档。这是编程的一个传统。)接下来,你需要在你的 .tex 文件顶部添加一些样板代码用于指定文档的类型和大小。 这与 HTML5 文件中使用的样板代码类似。

我的代码(如下方)将会把页面大小设置为 A4,文本大小设置为 12pt 。 你可以直接把这些代码放入 TexStudio,并指定你自己的页面大小、字体大小、名称、标题和其他详细信息进行编辑:

\documentclass[a4paper,12pt]{article}
\begin{document}
\title{Hello World! My first LaTeX document}
\author{Aaron Cocker}
\date{\today}
\maketitle

content will go here 

\end{document}

接下来,点击那个大的绿色箭头来编译该文档。就是下方截图中的中间的那个按钮。

 title=

如果这期间发生了什么错误,它将显示在底部的对话框里。

在你编译了这个文档之后,你可以看到它就像一个 PDF 一样显示在程序的 WYSIWYG (所见即所得)预览区域中。记住一旦你修改了代码就必须重新编译,就像我们在 C++ 中编程一样。

通过点击 Tools > Commands > View PDF 可以来预览你的文档,如下截图所示。

 title=

PDF 的输出将会显示在右侧,就像这样:

 title=

现在你可以添加一个段落。首先先通过 \section{} 命令来写一个子标题。在命令的大括号中输入你的子标题;我写的是 Introduction

\section{Introduction}

现在你已经给你的段落标记了一个子标题,是时候来写一个段落了。在这个例子中,我使用了 Lipsum 的 lorem ipsum 生成器。要创建一个段落,要使用 \paragraph{} 命令, 将你的文本插入到 \maketitle\end{document} 之间的 \paragraph{} 大括号下方,而不是中间。

以下就是我创建的段落的代码:

\section{Introduction}

\paragraph{}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lorem nisi, tincidunt tempus sem nec, elementum feugiat ipsum. Nulla in diam libero. Nunc tristique ex a nibh egestas sollicitudin. 

\paragraph{}
Mauris efficitur vitae ex id egestas. Vestibulum ligula felis, pulvinar a posuere id, luctus vitae leo. Sed ac imperdiet orci, non elementum leo. Nullam molestie congue placerat. Phasellus tempor et libero maximus commodo.

现在你的文档就已经完成了,你可以将其通过 Save As 选项导出并保存为一个 PDF 文档(和大多数程序一样)。

这是一个我已经完成的文档及其相应的代码:

 title=

本教程所有的代码如下所示:

\documentclass[a4paper,12pt]{article}
\begin{document}
\title{Hello World! My first LaTeX document}
\author{Aaron Cocker}
\date{\today}
\maketitle

\section{Introduction}

\paragraph{}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lorem nisi, tincidunt tempus sem nec, elementum feugiat ipsum. Nulla in diam libero. Nunc tristique ex a nibh egestas sollicitudin. 

\paragraph{}
Mauris efficitur vitae ex id egestas. Vestibulum ligula felis, pulvinar a posuere id, luctus vitae leo. Sed ac imperdiet orci, non elementum leo. Nullam molestie congue placerat. Phasellus tempor et libero maximus commodo.

\end{document}

更多

在 LaTeX 撰写的数以千计的优秀资源中,大多数大学制作的指南是可索引的,同时也可以在 Google 搜索中找到。 普林斯顿大学 提供了一个很好的扩展教程,为了更深入的了解,普林斯顿大学的导师 Donald Knuth 提供了 The TexBook,这是关于 LaTeX 的最好的教程。

(题图 : opensource.com)


作者简介:

Aaron Cocker - 一名在英国上大学的计算机学士。我是一个有抱负的数据科学家。我最喜欢的语言是 Python。 你可以随时通过邮箱联系我 : [email protected] 或者访问我的个人网站 : https://aaroncocker.org.uk


via: https://opensource.com/article/17/6/introduction-latex

作者:Aaron Cocker 译者:chenxinlong 校对:wxy

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

ps\_mem 是一个可以帮助我们精确获取 Linux 中各个程序核心内存使用情况的简单 python 脚本。虽然在 Linux 上有很多可用于查看内存使用情况的工具,比如 freevmstatsmemtop 等,但这个工具和其它的区别在于其精确显示核心内存使用情况。

它会分别计算一个程序私有内存总量和共享内存总量,并以更准确的方式给出了总的内存使用量。很明显的,它将帮助大家知道系统中哪个程序正在占用更多的内存。

你可以通过包管理器、pip 、或直接运行 ps_mem.py 脚本等多种方式来安装 ps_mem 工具。需要注意的是:需要有 root 权限。

另外,推荐阅读以下内存工具:

通过包管理器安装 ps\_mem

基于 RHEL 的系统默认仓库就包含 ps\_mem 工具,所以我们可以简单地通过包管理器进行安装。

对于 RHEL/CentOS ,使用 yum 包管理器 安装 ps_mem 包:

$ sudo yum install ps_mem

对于Fedora ,使用 dnf 包管理器 安装 ps\_mem 包:

$ sudo dnf install ps_mem

对于 Arch Linux ,使用 pacman 包管理器 安装 ps\_mem 包:

$ sudo pacman -S ps_mem

通过 pip 安装 ps\_mem

pip 是在 Linux 上推荐使用的一种安装 Python 包的工具。可以使用 pip 命令而不是包管理器去获取最新的版本。使用 pip 包前,请确保你的系统上已安装过 pip 包。否则,先使用发行版本的包管理器安装 python-pip 包。

对于基于 Debian 的系统:

$ sudo apt-get install python-pip

对于基于 RHEL/CentOS 的系统:

$ sudo yum install python-pip

对于 Fedora

$ sudo dnf install python-pip

对于 openSUSE

$ sudo zypper install python-pip

对于基于 Arch Linux 的系统:

$ sudo pacman -S python-pip

最后,在 Linux 上运行 pip 工具安装 ps_mem

$ sudo pip install ps_mem

直接运行 ps\_mem.py 脚本

我们也可以从开发者 github 页面下载文件,并直接运行 ps_mem.py 脚本。

$ git clone https://github.com/pixelb/ps_mem.git && cd ps_mem
$ sudo python ps_mem.py

ps\_mem 使用方法

不带任何参数直接运行 ps_mem 以精确获取每个程序的的核心内存使用情况。

$ sudo ps_mem
 Private  +   Shared  =  RAM used   Program

  1.6 MiB + 438.5 KiB =   2.1 MiB   packagekitd
  1.7 MiB + 498.0 KiB =   2.1 MiB   indicator-application-service
912.0 KiB +   1.3 MiB =   2.2 MiB   window-stack-bridge
  2.0 MiB + 350.5 KiB =   2.3 MiB   gnome-keyring-daemon
  1.8 MiB + 575.0 KiB =   2.3 MiB   whoopsie
  2.4 MiB + 304.5 KiB =   2.7 MiB   systemd-journald
  2.7 MiB + 157.5 KiB =   2.8 MiB   ibus-engine-simple
  2.7 MiB + 182.0 KiB =   2.9 MiB   ibus-dconf
  2.7 MiB + 332.5 KiB =   3.0 MiB   NetworkManager
  3.1 MiB + 169.5 KiB =   3.2 MiB   polkitd
  1.9 MiB +   1.7 MiB =   3.6 MiB   systemd (2)
  3.4 MiB + 172.5 KiB =   3.6 MiB   deja-dup-monitor
  2.9 MiB + 685.0 KiB =   3.6 MiB   zeitgeist-datahub
  2.9 MiB + 848.0 KiB =   3.7 MiB   python2.7
. . . . . .
222.1 MiB +   9.4 MiB = 231.5 MiB   compiz
286.2 MiB +  11.8 MiB = 298.0 MiB   firefox
---------------------------------
                          1.3 GiB
=================================

输出中打印出全路径:

$ sudo ps_mem -s
 Private  +   Shared  =  RAM used   Program

  3.2 MiB + 951.0 KiB =   4.1 MiB   /usr/lib/evolution/evolution-addressbook-factory
  3.7 MiB + 826.5 KiB =   4.5 MiB   /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
  3.7 MiB + 853.0 KiB =   4.6 MiB   /usr/lib/unity-settings-daemon/unity-fallback-mount-helper
. . .  . . .
131.9 MiB + 168.0 KiB = 132.1 MiB   /usr/sbin/mysqld
222.1 MiB +   9.4 MiB = 231.5 MiB   /usr/bin/compiz
286.2 MiB +  11.8 MiB = 298.1 MiB   /usr/lib/firefox/firefox
---------------------------------
                          1.3 GiB
=================================

只显示特定的 PID 列表的内存使用情况:

$ sudo ps_mem -p 2886,4386
 Private  +   Shared  =  RAM used   Program

 13.5 MiB +   2.9 MiB =  16.4 MiB   gnome-terminal-server
286.2 MiB +  11.8 MiB = 298.0 MiB   firefox
---------------------------------
                        314.4 MiB
=================================

每 N 秒打印进程内存。以下命令每 2 秒报告一次内存使用情况:

$ sudo ps_mem w 2

只显示内存总量:

$ sudo ps_mem -t
1329884160

via: http://www.2daygeek.com/ps_mem-report-core-memory-usage-accurately-in-linux/

作者:2DAYGEEK 译者:xllc 校对:wxy

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

Linus Torvalds 和 VMware 开源负责人 Dirk Hohndel 上周在中国 LinuxCon 上进行了一次“炉边聊天”。

周一,Linus Torvalds 首次来到中国参加在北京召开的 LinuxCon + ContainerCon + CloudOpen。在近 2000 名观众面前,Linus Torvalds 和 VMware 开源负责人 Dirk Hohndel 进行了进行了一次“炉边聊天”,谈及是什么在惊讶和激励着他,以及有志的开源开发者们该如何上手。下面是他们谈话中的一些亮点。

Linux 开发中有什么令人惊讶的事情?

“我觉得有趣的是我认为已经稳定的代码仍然在不断的得到改进,有些东西我们已经很多年没有碰了,然后有人来改进了它们,或者在我以为根本就不会有人用的东西上提交了 Bug 报告。我们有了新的硬件,开发了新的功能,但是 25 年后,我们仍然有老的、非常基础的东西,并且人们依然在关心和改善着它们。”

什么在激励着他

“我真的很喜欢我正在做的事情。我喜欢醒来时有一个在技术上有趣而富有挑战性并且不太紧张的工作,因此我可以长时间的为此工作;或者做一些我感觉我正在做一个真正有影响的事情,做一些不仅仅是对我来说有意义的事情。

“我偶尔在工作中休息一下,例如我在 Git 上工作两到三周的时候就开始休息了。但是每次休息的时间比较长我都会感到无聊厌倦。当我出去潜水一周,就想着要回来,我从没有感觉我需要一个更长的假期。”

(LCTT 译注:此处“在 Git 上工作” 是指 Linus 在 Git 版本仓库里面开发 Linux 内核,而非开发 Git 软件——事实上,Linus 在早期开发完 Git 的原型之后,主要的 Git 开发已经有别人接手了,虽然他被称之为 Git 之父。而“潜水”是真的指潜水运动,Linus 喜好玩潜水运动。)

Linux 的未来领导力

“我们的工作进程不会只是 25 年,我们仍然有非常强大的维护团队。我们常常抱怨我们没有足够的维护者 - 这是真的,我们只有数十名顶级维护者做日常合并的工作,这对于一个开源项目来说是一个非常强大的团队。而且随着这些顶级维护者慢慢变老变胖,我们不断有新人进来。一个新人成长为一个顶级维护者需要几年的时间,因此我不觉得我们应该为 Linux 的下一个 20 年担心。”

Linux 会被替代吗?

“或许会有一些新的项目将来会并且表明他们比我们做的更好,但是我不担心这个。有很多非常成功的 Linux 的分支(fork),人们不会把它们看作是分支是因为他们很和谐。如果有人想要改变一切并且让内核变得更好,我的感觉是,干吧,证明你自己。我可能觉得那是一个坏主意,但是你可以证明我是错的。”

(LCTT 译注:此处所说的分支,应该是指类似 Android、AGL 等 Linux 分支并没有分裂 Linux 生态,而是彼此补充。)

对 Git 的想法

“我对 Git 的广泛传播感到非常的惊讶。显然我非常高兴,它验证了我对分布式开发的看法。然而那时,已经有如此之多的源码版本控制工具,很难再去推出一个新的版本控制系统。我预计它主要限于内核开发 - 因为它是针对我们所做的。”

“在刚开始的三到四年里,关于 Git 的抱怨是它如此的与众不同,难以使用。大约五年前,事情发生了改变。有足够多的项目和开发者开始使用 Git ,它变得不再与众不同;人们习惯于使用 Git 。他们开始利用这种开发模式,使用 Git 的安全感,意味着任何东西都不会损坏或者丢失。”

“在某些方面,Git 比 Linux 更为人所知。Linux 常常被隐藏起来,例如安卓手机就运行在 Linux 之上,但是你并不知道。但是使用 Git 时,你确切地知道你在使用 Git 。”

分支 Linux

“当我坐下来开始写 Git ,一个首要的原则就是你应该能 fork 并且在此基础上做你自己的事情。如果你有友好的 fork(能证明我错了,并且能够改进内核),在这种情况下,人们可以回来说我们实际上改进了内核,这没有什么不好的感觉。我会采纳你的改进并且将其合并进来。这就是为什么你应该鼓励 fork 。你也想让良好的回馈变得很简单。”

开源开发者应该如何开始

“于我而言,我总是自我激励,知道自己想要做什么,我从来没有被告知要去做什么。我不确定我的例子是否适合人们效仿。如果你是一个新手程序员,你可以从成千上万的开源项目中找到你所感兴趣的,你可以长期关注这个项目,去了解它的代码,以至于你可以在某个部分的代码上可以成为专家,不需要是整个项目。没有人是整个内核的专家,但是你可以很好地了解其中的一个领域。”

“如果你能成为社区的一份子,能提交补丁,那将不仅仅是编程,而是有开源社会方面的意义。你作为一个程序员提升了你自己并且和外界联系了起来。你基本上可以向外展示 - 我做了这些改进,我有能力在我的社区或者工作上走得更远。你不得不花费一定的时间来学习一个项目,但是你将有一个巨大的上升空间 - 不仅仅是从职业方面,而且在你的生活中有一个惊人的项目。”


via: https://www.linux.com/blog/event/lc3-china/20176/6/linus-torvalds-explains-how-linux-still-surprises-and-motivates-him

作者:Linux 基金会 译者:rieonke 校对:wxy

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