Fix Permission Denied when access mounted volume inside container

I'm using Fedora 23 and also usually use docker to run a Fedora container so that I can have a ready-to-use environment quickly to run something, for example verifying a RPM by installing it simply. Volume is a much useful for sharing data between host and container, but without some magic, mounted volume inside container is not accessible, that is Permission Denied even if just ls.

This is related to the SELinux actually. I'm not a SELinux expert. I can't give any deeper explanation why this happens. All what I knew and learned is from this great article Using Volumes with Docker can Cause Problems with SELinux. The solution is to add suffix either z or Z. For example,

docker run --rm -i -t -v /path/to/host/dir:/path/to/container/dir:Z fedora:24 /bin/bash

Volume Labels actually already describes the functionality of Z. But, it mentions nothing that is related to this issue and SELinux. I suspect, in Docker's documentation, Z is described in general for kinds of Linux distributions including those that don't use SELinux at all. Anyway, hopefully, this is useful for you to solve your problem. Happy hacking! :)

Read More ...

Ensure ABI compliance with fedabipkgdiff

In the past days, I have been hacking on libabigail to write a tool named fedabipkgdiff. That came from a cool idea of Dodji Seketeli who is the author of libabigail and is built on top of the powerful libabigail framework. Just imagine, if you are a Fedora developer or packager, when you want to ensure the new version software is ABI-compatible with previous version or versions, how would you do that? If there are already built builds in Koji, if you want to see what ABI differences they have, then how to do that? fedabipkgdiff is able to make your life easier.

fedabipkgdiff is designed to be as smart as possible to find necessary RPMs from local or Koji, and run ABI check automatically on behalf of you. All you need to do is just to specify

  • from where to find RPMs, which defaults to Koji obviously
  • what RPMs are needed, to select RPMs from latest build of a distribution such as Fedora 24, 25, or from a specific build with N-V-R such as httpd-2.4.23-4.fc24
  • how RPMs will be compared, that means you have a chance to let fedabipkgdiff do not compare with development package, you can also tell it to compare without loading suppression file

Okay, now I'll show you some examples to see what fedabipkgdiff can do.

First, I want to compare package httpd selected from latest build built for Fedora 24 and 25. Run this command

Read More ...

Firefox的GNOME3皮肤很棒

自Firefox 29采用了新的界面设计后,很多人都吐槽这个酷似Chrome,但又不像的新设计。 我也是其中一员。尽管用了一段时间以后,逐渐适应了新风格,但仍旧时常感觉不爽。很怀念 之前的标签风格。偶然间,发现了一个新皮肤GNOME 3。 安装之后的效果如下图所示。

Firefox with GNOME3 theme

这个皮肤是由GNOME Integration团队制作的。可以说,运行的效果非常棒。与GNOME 3的 整体风格浑然一体。

结合使用GNOME Theme Tweak, 能够让你调整皮肤中默认的界面元素的效果。

Read More ...

GTG的Bugzilla插件被重新实现为同步服务了

最近,完成了对Bugzilla插件的重写,重新实现为GTG的同步服务(Synchronization Service)。不得而知是何原因需要做这个转换。 您可以从Bug 494967略之一二。

原始的插件实现提供了基本的Bug信息同步功能。在用户输入一个Bug链接后,Bugzilla插件会得到GTG的通知,根据URL中提供的远程Bugzilla服务的信息, 与之通信读取Bug信息并替换任务的主题和内容。同时,会把Bug的Component作为任务的标签。除了这些基本功能外,在我看来,有一点不足非常明显,即可配置程度不高。 它体现在几个方面。

一是,所支持的Bugzilla服务是不可配置的。这些服务是写死在代码里的,导致用户无法添加一个GTG尚未知晓的Bugzilla服务。

二是,标签同步的来源是不可配置的。标签的来源也是在代码里写死。用户没有任何选择的权力。Priority、Severity等Bug属性都是可以用作标签的很好的选择。 如果有用户需要使用它们作为标签,则必须身体力行地亲自修改代码才行。另外,如果用户想指定额外的名称作为标签,要么同样亲力亲为,要么就只能指望GTG的开发者实现了。 显然这不够理想。

在开始重新实现为同步服务之前,我希望尽可能地不对原始的同步行为和结果做任何改动,以便保持用户原有的用户体验。此外,既然是重新实现, 也正好是重新思考如何实现一个更好的同步功能的好机会,借机改进Bugzilla同步服务,修改掉一些已知的问题。下面几点是重写过程中所保持的和做出的改进。

Read More ...

在VIM中常用的正则表达式

" Tip 1: Add extra characters before the first character of each line
s/^(.)/- \1/

" Tip 1.1: Comment lines of code s/^(.)/# \1/

" Tip 1.2: Comment lines by adding # before the first letter s/^( +)(.)/\1# \2/

" Tip 2: remove all trailing white space characters s/\s+$//

" Tip 3: search class and method definition ^\(class\| *def\) \+\w\+

Read More ...

如何在Fedora中运行BOINC

Fedora中运行BOINC有两个方法,可以从官方网站下载二进制安装包,然后在本地安装。

sh boinc_7.2.42_x86_64-pc-linux-gnu.sh

截至写这些文字的时候,7.2.42是最新的版本。有一点提示的是,安装过程会在执行此条命令的目录中创建 BOINC子目录,所有必需的文件都将安装在这个目录中。

然而,这第一种方法,我没有成功。在启动boincmgr总是出现程序库错误,无法运行。此时,就需要另外 一种,BOINC的Wiki中也记载的方式。即使用特定的Linux发行版本的包管理器安装。

对于Fedora,使用下面的命令。

sudo yum install boinc-client boinc-manager

BOINC管理器允许管理多台计算机上的boinc计算进程。首次启动管理器后,需要手动地连接到某一台计算机上。步骤如下,

  1. 通过菜单进入计算机选择对话框 Advanced -> Select Computer
  2. Host name中,输入127.0.0.1
  3. 以root用户身份打开文件/var/lib/boinc/gui_rpc_auth.cfg,将其中地完整内容拷贝到Password

如果已经添加了至少一个分布式计算项目,你将会看到类似如下图所示的界面。

BOINC Manager Sample

Read More ...

参与SETI@Home项目已经14年了

一晃,参与SETI@Home项目已经14年多了。SETI@Home项目首先提出并实践了利用全球空闲的CPU资源实现 全球范围内的分布式计算思想。在这过去的14年中,逐渐演变成了BOINC通用的分布式计算平台。伴随着 SETI@Home项目的蓬勃发展,众多的分布式计算项目孕育而生,包含各个领域的研究课题。我也参与了几个 非常喜欢和感兴趣的项目。下面这张表是对过去的贡献的一个总结。

Project Total credit Average credit Since
World Community Grid 64,783 0 15 Nov 2005
CAS@home 1,486 0 23 Mar 2011
Rosetta@home 11,941 0 29 May 2006
climateprediction.net 35,409 0 15 Nov 2005
Einstein@Home 170,252 0 25 Feb 2005
SETI@home 788,562 0 3 Aug 2000

Read More ...

Concurrency和Parallelism

这两天特别趁着假期再次学习一下并发(Concurrency)和并行(Parallelism)。学习的主要内容是这两 者之间的区别。很多人,包括我自己在内,对并发和并行的区别了解的并不是很清晰和准确。需要说明的一点是, 这篇短文不是阐述并发和并行的理论文章。

Concurrency完全不同于Parallelism。计算机系统本身就是一个Concurrency模型。各种中断充斥在计算机系统的运行过程中,这是一个典型的基于事件的处理模型。在一个CPU上并行地执行多个任务。人的大脑是一个Concurrency模型。

像SETI@home项目,把一个巨大的任务分成一系列小的可以被独立的在世界各地的个人计算机上运算的数据包。这个模型是Parallelism。特点是,

  • 它需要多个独立存在的运算处理单元(每一台个人计算机)
  • 计算可以在每一个运算处理单元中重复的计算并得到相同的结果
  • 每一个运算单元之间不需要任何形式的通信以完成运算
  • 每一个运算单元都有自己的完成运算任务的环境(或者叫上下文环境)

学习资料

Read More ...

这个函数定义会让你抓狂吗?

这个函数定义是从libsolv中看到的。当你看到它的时候,会有中抓狂的感觉吗?

char
pool_tmpjoin(Pool pool, const char str1, const char str2, const char *str3)
{
}

str[1..3]这三个参数是干什么用的,传什么参数,函数连个注释都没有。我去,不得不从代码里面找答案。

Read More ...

在Mac OS里安装QT

这是很简单的一篇记录文章。偶然间在reddit中看到了一个回复,提到QT的跨平台特性优于GTK+。由此忽然间想到,前段时间在Mac上编译安装GTK+是多么麻烦的一件事情。虽然不复杂,但还是费了不少周折。于是,搜索到QT官方文档,详细的描述了如何在Mac中安装QT。有点小兴奋。凡事怕比较。QT的优势又一次显现出来。无外乎两个步骤,而且都是常规的UNIX软件包安装方法。第一步,./configure && make && make install。第二步,设置环境变量。

详细的内容您自个儿瞧吧,:) 《Installing Qt for Mac OS

Read More ...

我的Python代码或许在多数时候都得不了100分

在Python社区中,开发人员能够使用pep8pyflakespylint来检查自己的代码是否符合PEP8所描述的指导规范,同时还能够检查出来哪些变量是我们定义了,但是没有用到的,等等。在这些工具中,pylint无非是(似乎是)最受社区推崇的一个。OpenStack使用它做代码检查,Sonar除了支持自己默认的检查规则外,也就只支持pylint了。

话说pylint功能强大,在默认配置的控制下,它检查Python代码的方方面面。最后得到的评分也许会让自己大跌眼镜。我第一次用的时候就是这个感受。难道我写代码的水平这么差劲吗?!:)

Read More ...

用GnuCash管理个人财务数据

生活不易,工作不易,为了生活赚钱更不易。在日常的生活中,有必要对我们的收入和支出有比较清晰的跟踪。个中目的,相信每个人都有自己的打算。收支平衡很重要。对于我来说,对自己财务数据的管理的目的,无非就是在有限的收入中,能够对其有所规划,在保持一定生活水平的同时,也能够留出适当的一部分做投资、做保险等等,为未来的生活做准备。

国外的金融危机让很多外国人都已经开始重新审视自己的消费观。有计划的,节省不必要的开支成为他们的财务管理过程中很重要的一部分。从lifehacker站点的有关财务管理的文章中能看到某些端倪。对此我必须要做一点声明,我没有在西方社会生活的经历,并不是非常了解西方社会普遍的消费观念。我是通过新闻媒体的报道,以及阅读一些文章后了解到的信息。某些人在某种程度上所崇拜和学习的,西方式的超前的、看似很前卫的消费方式,其实并不是认为的那样。他们也很精打细算。

管理个人财务,首先要有个地方记录每一笔种类的开支,其次最好还能够做一些统计,最好好用很重。虽然记录数据要花时间,生活中多了一个必须完成的任务。但是,我可不想它成为一个巨大的负担,不要为了记录一两条简单的花费而大费周折。

Read More ...

如何查询个人信用记录

查询个人信用记录非常方便。这篇文章以我个人查询本人信用记录的经历为参照,给你提供一个快捷的参考。如果你是查询自己的信用记录,那么按照下面的步骤即可轻松完成。

  • 仔细阅读申请流程。到中国人民银行征信中心网站,仔细阅读本人查询信用报告流程
  • 下载个人信用报告本人查询申请表。在本人查询信用报告流程的页面中,下载个人信用报告本人查询申请表。填好里面相关的所有信息。别忘了签字。
  • 去中国人民银行营业管理部办理查询。办理查询需要携带本人的身份证和身份证的正反面复印件。如果你填写了那个申请表,也一并带着。地址在网站首页的顶部已经给出。坐地铁的话,6号线在车公庄西站出,沿展览馆路往南,过两个有红绿灯的路口就能到了。就在路边上,一眼就能看到。

办理的流程非常简单。到那凭身份证、身份证复印件和申请表领号。然后等着叫号,到指定的窗口办理即可。非常快,核对信息后,信用报告即可就能打印出来。

有几点提示。首先,办理查询业务的人很多,尽量早去。其次,能够提前复印身份证和填写申请表的话,就事先把这两件东西都准备好。到那直接拿号,节省时间。

门口咨询台的服务人员态度很好,非常耐心地解答各种问题。祝你顺利。

Read More ...

如何在GTG插件中读取和存储用户偏好数据

每一个插件都可以管理自己的用户偏好数据。这些数据存储在插件自己的配置目录中,彼此独立,互不影响。在GTG中,用户偏好数据被存储到一个字典对象中,使用pickel将其序列化到指定的文件中,此文件位于插件自己的专属目录中,其名称由开发者决定,并通过参数传递给用户偏好数据操作接口。插件API提供了两个方法用于读取和存储用户偏好数据,它们分别是load_configuration_objectsave_configuration_object,接口定义如下。

def load_configuration_object(self, plugin_name, filename,
                              basedir=xdg_config_home,
                              default_values=None):
    '''Load preference'''

def save_configuration_object(self, plugin_name, filename, item, basedir=xdg_config_home): '''Store preference'''

这两个接口均接受插件名称(plugin_name)和文件名(filename)两个参数。GTG不提供默认的文件名。推荐使用名称preference。存储用户偏好数据的字典对象传递给参数item

接口非常简单,写到这就可以结束了。Notification Area插件实现提供了很好的代码参考。

Read More ...

rejectUnauthorized的默认值变了

这个变化发生在0.9.2版本中。下面的代码片段摘录自tls.js

var defaults = {
  rejectUnauthorized: '0' !== process.env.NODE_TLS_REJECT_UNAUTHORIZED
};

从与0.9.1版本的对比来看,在新版本中,允许使用环境变量来控制参数rejectUnauthorized。上面的代码则使得默认值从false变更为true。在tls模块的文档中记录了这个变化,遗憾的是Node的Changelog则没有记录。

为了确保代码能够在Node的各个版本间保持兼容性,在options参数中明确地给rejectUnauthorized设置所期望的值,而不使用默认值。

Read More ...

及时释放Backbone对象占用的资源

Backbone对象?是的,此文中提到的Backbone对象指的就是View,Model和Collection。他们占用什么资源呢?在一个使用了Backbone、socket.ioioBind的项目中,会在DOM层、Model和Collection,以及socket三个层面注册大量的事件处理函数实现用户功能。这些事件监听就是最大的一个资源占用。不仅仅消耗内存,还会导致在反复创建同一个Model或者Collection的对象的情况下事件响应的泛滥。因此,在什么时候释放这些资源,以及如何释放非常值得关注。为了回答这两个问题,先通过代码来看看典型的应用方式。

var BaseModel = Backbone.Model.extend({
  idAttribute: "_id",
  socket: window.socket,
  urlRoot: undefined,

url: function() { return "/" + this.urlRoot + "/" + this.id; },

initialize: function (attributes, options) { this.on('modelCleanup', this.modelCleanup, this); this.ioBind('update', this.serverChange, this); this.ioBind('delete', this.serverDelete, this); },

serverChange: function(data) {} serverDelete: function(data) {} modelCleanup: function(data) {} });

var Checklist = BaseModel.extend({ urlRoot: "checklist",

initialize: function (attributes, options) { this.itemCollection = new ChecklistItemCollection; BaseModel.prototype.initialize.apply(this, arguments); } });

var ChecklistItem = Backbone.Model.extend({ urlRoot: "checklistitem" });

var BaseCollection = Backbone.Collection.extend({ url: undefined, model: undefined, socket: window.socket,

initialize: function(models, options) { _.bindAll(this, "serverCreate"); this.ioBind("create", this.socket, this.serverCreate, this); },

serverCreate: function(data) {} });

var ChecklistCollection = BaseCollection.extend({ url: "/checklist", model: Checklist });

var ChecklistItemCollection = BaseCollection.extend({ url: "/checklistitem", model: ChecklistItem });

Read More ...

我的第一个Node软件包nsignal

写于2013年5月28日晚

用Javascript写程序已经有段时间了。在Node的环境下,Javascript充分发挥了起长期以来被忽视的强大力量。随着写的Javascript代码越来越多,对这门语言有了更加深入的理解。与此同时,在不断地使用和阅读第三方Node软件包的过程中,越发的感觉到Javascript的潜力无限和未来发展的各种无限可能。你愿意使用Javascirpt写日常的脚本程序吗,写GUI程序吗,开发网络应用吗?

今天花了一点时间,把目前项目中的一个简单的组件剥离了出来,把它放到了github上,同时也快速体验了一把Node软件包分发。

使用下面的命令从Node软件仓库npm中的安装,

npm install nsignal

Read More ...

给Python软件包打RPM包用的SPEC模板

这个模板可作为为Python软件包制作RPM包的一个起点。它提供了能够成功完成一个RPM包的所有必要的信息。 同时,预留了一些需要根据使用者的实际情况替换的信息。我使用了$var的格式来表明哪些需要用真实值来替 换。

模板遵循Fedora社区的RPM包打包规范。例如,Python软件包对应的RPM包通常加上python-前缀。 如果你是在为一个django框架的扩展包打包,那么前缀应该使用django-

%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
%global pkg_name $name

Name: python-%{pkg_name} Version: $version Release: 1%{?dist} Summary: $summary

Group: Development/Languages License: $license URL: $url Source0: %{pkg_name}-%{version}.tar.gz BuildArch: noarch

# BuildRequires section here if necessary

# Requires section here if necessary

%description

%prep %setup -q -n %{pkg_name}-%{version}

%build %{__python} setup.py build

%install rm -rf $RPM_BUILD_ROOT %{__python} setup.py install -O1 --skip-build --root $RPM_BUILD_ROOT

%clean rm -rf $RPM_BUILD_ROOT

%files %defattr(-,root,root,-) %doc CHANGES.txt LICENSE.txt MANIFEST.in README.rst TODO.txt VERSION.txt %{python_sitelib}/%{pkg_name}/ %{python_sitelib}/%{pkg_name}-%{version}-py*.egg-info/

%changelog

Read More ...

失眠

写于2013年4月最后一天,凌晨3点。

失眠了。第一次这么严重的睡不着。我想,肯定是失眠了。身体躺在床上翻来覆去始终找不到一个舒服的入睡的姿势。脑子里跟过火车似的,满脑子都是事情。像泉水一样,往外冒。根本就不再自己的控制范围之内。现在在硬撑着敲这些字。脑袋发沉,倦意已浓,希望一会儿能尽快入睡。鼻炎不再影响今天的睡眠。第一次失眠了,让我学会了一个单词,insomnia

晚安!

Read More ...

开始用jekyll在Github Pages上写东西

写于2013年4月最后一天凌晨

经过一个下午的尝试,终于把jekyll搞定。熟悉jekyll的使用方法后,发布文章会变得非常轻松。没有什么更多的可说的了。Github的发展方向让人充满想象。任 何可以用git管理的东西都可以在Github上托管。以至于可以遇见的到,任何我想要与他人分享的内容都可以借助于这个公共的平台。内容管理完全自足,自由,没有任 何限制。只不过,发布之前自己的先做好审核。否则,一不小心你的小秘密就公之于众了。

Read More ...