用Briss批量切除pdf文件的白边

这段时间准备论文,要看好多电子资料。比如中国知网下载的N多论文还有N多RFC的pdf。已经忍无可忍成天对住台电脑看资料,于是入手了一部kindle4。这下问题又来了,pdf(Portable Document Format)是专门为打印设计的,在页面的四个方向都预留了白边。对于kindle4本来就不大的屏幕来说,pdf显示在kindle4的屏幕上,字小的同乌蝇一样,比用电脑看还要费眼。于是想到去掉白边,在网络上搜索了一下,发现了好几种软件,最后哥选了briss,真的非常的酷喔~~可以把白边删除得干干净净。

不过问题又来了,我有好多pdf文件呀!但是briss的操作界面只支持一次处理一个文件。看Briss的帮助文件的时候发现Briss支持用控制台操作~~如下:

================

 

Command line usage(使用命令行)

If you prefer command line and trust the basic automatic detection algorithm use it this way (can be batched!):

如果你喜欢用命令行并信任白边自动推测算法,可以用以下命令操作(支持批处理)。

java -jar briss-0.0.13.jar -s [SOURCEFILE] [-d [DESTINATIONFILE]]

Example:

java -jar briss-0.0.13.jar -s dogeatdog.pdf -d dogcrop.pdf
java -jar briss-0.0.13.jar -s dogeatdog.pdf 

================

到此,就非常好办了。我的电脑装了UNIX工具链在windows平台下的移植版:cygwin,于是我只用写一行unix命令就把我的一个目录夹下面所有的pdf文件都切边了。命令如下:

 

zausiu@enigma /cygdrive/e/kindle4/ipv6_en             // 当前目录 e://kindle4/ipv6_en 下面存放了所有待切白边的pdf文件.
$ ls *.pdf | xargs -I'{}' -n1 java -jar d:/Program\ Files\ \(x86\)/briss-0.0.13/briss-0.0.13.jar -s '{}'    // 用来把该目录下面所有.pdf文件去白边的命令。
 
我的pdf文件很多,随便贴出一点命令的输出。
 
Since no destination was provided destination will be set to  : E:\kindle4\ipv6_en\draft-itojun-ipv6-transition-abuse-01_cropped.pdf
Clustering PDF: draft-itojun-ipv6-transition-abuse-01.pdf
Created 2 clusters.
Starting to render clusters…..finished!
Calculating crop rectangles.
Starting to crop files.
Cropping succesful. Cropped to:E:\kindle4\ipv6_en\draft-itojun-ipv6-transition-a=buse-01_cropped.pdf
 
Since no destination was provided destination will be set to  : E:\kindle4\ipv6_en\layer2_attacks_and_mitigation_t_cropped.pdf
Clustering PDF: layer2_attacks_and_mitigation_t.pdf
Created 2 clusters.
Starting to render clusters……….finished!
Calculating crop rectangles.
Starting to crop files.
Cropping succesful. Cropped to:E:\kindle4\ipv6_en\layer2_attacks_and_mitigation_t_cropped.pdf
 
大概的意思是,我的命令没有提供切白边后新pdf文件的文件名,于是自动取了一个名字。然后程序分析pdf文件,开始切边,最后切边成功。
由于我写的命令是用了Unix Shell的语法,所以如果你的机器没有装cygwin是运行不了这个命令的。可以把它用windows批处理的语法改写,但是哥不会windows批处理的语法哈~~~
 

 

Linux内核Makefiles教程(二)

接第一篇 

3.3.可加载模块目标 obj-m (Loadable module goals – obj-m)

obj-m指定将被构建为可加载内核模块的对象文件(object file)。

一个模块可以从一个源文件构建或者从多个源文件构建。如果模块仅仅从一个源文件构建,kbuild makefile仅仅把对象文件加到obj-m。如下:

       #drivers/isdn/i4l/Makefile

        obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o

在这个例子中,$(CONFIG_ISDN_PPP_BSDCOMP)被求值为m.

If a kernel module is built from several source files, you specify that you want to build a module in the same way as above.

如果一个内核模块需要从多个源文件构建,你也是按照刚才提到的那一行指定。不过,除此之外,还要额外地指定,你的内核模块需要哪些对象文件。所以还需要设置<模块名>-objs变量。如下:

       #drivers/isdn/i4l/Makefile

        obj-$(CONFIG_ISDN) += isdn.o

        isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o

在这个例子中,模块名是 isdn 。Kbuild将编译isdn-objs列出的所有对象文件,然后运行$(LD) –r把这些对象文件链接成一个文件isdn.o。

Kbuild用-objs后缀或者-y后缀识别构成复合对象文件(composite objects)的对象文件。这样,Makefile就可以使用CONFIG_* 符号来确定一个对象文件是不是一个复合对象文件的一部分。如下:

       #fs/ext2/Makefile

        obj-$(CONFIG_EXT2_FS)        += ext2.o

        ext2-y                       := balloc.o bitmap.o

        ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o

在上例中,如果$(CONFIG_EXT2_FS_XATTR)求值为y,则xattr.o是复合对象文件ext2.o的组成部分。

当然,如果你要把对象文件编译进入内核映象文件。也可以应用上述语法。比如,如果CONFIG_EXT2_FS=y,kbuild就会构建一个ext2.o文件,如你所想,再把这个文件链接到build-in.o。

3.4. 导出符号的对象文件

并不需要在Makefile中为模块使用特殊的标记来导出符号。

3.5. 库文件目标(Library file goals – lib-y)

在obj-*中指定的对象文件列表或者被用来构建内核模块,或者被内建到内核映象文件之中。Makefile还能指定创建库文件的对象文件。所有在lib-y中指定的对象文件会被用来在对应文件夹下创建一个库文件。注意已经在obj-y中列出过的对象文件,如果再在lib-y中列出,则不会被用来创建库文件,因为这些对象文件将是全局可见的。为了一致性,lib-m中列出的对象文件会被包含到lib.a。

注意,同一个kbuild makefile会同时指定被内建到内核映象中的对象文件,也会指定用来创建库文件的对象文件。因此,在同一个文件夹下面有可能同时存在built-in.o和lib.a文件。

       #arch/i386/lib/Makefile

        lib-y    := checksum.o delay.o

上例中,会基于checksum.o和delay.o创建一个库文件lib.a。为了让kbuild意识到该目录下有lib.a库文件被创建,这个目录需要被列入到libs-y。本教程将在6.3节”列出需要遍历的路径”中详述。

lib-y的使用通常受限于 lib/ 和 arch/*/lib。

3.6. 深入遍历子目录夹

每个Makefile文件只负则在当前文件夹下面构建对象。在子目录下面的构建则由子目录下面的对象Makefile负责。不过你需要使用使用obj-y或者obj-m告诉kbuild系统将进入哪些子目录。比如话:当前目录是fs/,ext2/是当前目录下面的一个子目录,为了告诉kbuild进入ext2/目录,使用以下的语句:

        #fs/Makefile

        obj-$(CONFIG_EXT2_FS) += ext2/

如果CONFIG_EXT2_FS被求值为y(内建)或者m(模块),那么obj-*变量就会告诉kbuild需要进入ext2/子目录继续编译。

Kbuild仅仅使用这个信息来通知是否进入某个子目录,而进入后的子目录下面是用内建方式编译还是编译成模块则是由子目录下面的Makefile文件指定。最好像上例那个使用CONFIG_*变量。这样的好处是,如果CONFIG_*变量的求值既不是y也不是m,那么kbuild就完全可以忽略掉某子目录了。

3.7. 编译选项/标识

EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS

所有的EXTRA_VARIABLES仅仅作用于它们被赋值的kbuild makefile,应用于所有该makefile文件中执行的命令。

$(EXTRA_CFLAGS)指定了编译C文件的C编译器的编译选项。

Example:

        # drivers/sound/emu10k1/Makefile

        EXTRA_CFLAGS += -I$(obj)

        ifdef DEBUG

            EXTRA_CFLAGS += -DEMU10K1_DEBUG

        endif

变量$( EXTRA_CFLAGS)是必要的,因为最上级的Makefile定义的$(CFLAGS)作用于整个linux内核代码树。

而$(EXTRA_AFLAGS)的作用域则是每个文件夹下面单独的Makefile。

比如下面的例子编译汇编语言程序。

        #arch/x86_64/kernel/Makefile

        EXTRA_AFLAGS := -traditional

$(EXTRA_LDFLAGS) 用于当前Makefile文件中的$(LD)。

$(EXTRA_ARFLAGS) 则用于当前Makefile文件中的$(AR)。

Example:

        #arch/m68k/fpsp040/Makefile

        EXTRA_LDFLAGS := -x

未完待续

copyright blog.ykyi.net

Linux内核Makefiles教程(一)

 

Linux内核Makefiles

本教程描述了了Linux内核的Makefile是如何工作的。

1. 概述

Linux内核的Makefile包括五个部分。

Makefile

最上层Makefile

.config

内核配置文件。

arch/$(ARCH)/Makefile

CPU架构相关Makefile

scripts/Makefile.*

对于所有Kbuild Makefile的公共方法。.

kbuild Makefiles

有将近500个kbuild Makefiles。

最上层Makefile读取.config文件。.config文件是由内核配置过程生成的。

最上级的Makefile负责生成linux的内核映象文件vmlinux和其它所有的模块。最上级Makefile递归地进入内核代码树的各级子目录分别执行子目录下的Makefile。究竟要进入哪些子目录是由内核配置阶段决定的,即配置在.cncfig文件中。最上级Makefile提定了一个路径为arch/$(ARCH)/Makefile的子目录Makefile。这个Makefile中定义了与处理器架构紧密相关的信息。

每一个子目录下面都有一个kbuild Makefile,这里都定义了一些makefile命令和变量可以被更下级的Makefile继承。Kbuild Makefile使用来自.config配置的信息生成各种文件列表用来构建内建的或者模块化的目标文件。Scripts/Makefile.*包括了很多被其它Makefile使用定义和规则。

2. 谁使用内核Makefile

内核Makefile的使用者可以大致分为四种。

用户(Userse)

这类使用者仅仅敲入一些命令,如“make menuconfig”或者“make”。他们很少会阅读甚修改内核Makefile和源代码文件。

一般开发者(Normal Developers)

一般开发者一般编写一些设备驱动程序,文件系统,网络协议。他们需要维护他们编写的代码涉及的子系统的kbuild Makefiles。为了工作地更有效率,他们甚至还需要对整个内核的Makefile有全局的把握,包括对kbuild的公共接口的详尽了解。

处理器架构开发者(Arch Developers)

这部分开发者关心与某个处理器架构紧密相关的代码部分,比如PC上最广泛使用的x86,以及IA64,还有ARM,Sparc,PowerPC,Alpha,s390,MIPS。Linux支持几百种处理器架构。从内核2.6.24开始,i386和x86_64合并为x86。

KBuild的开发者(KBuild Developers)

KBuild的开发者就是维护内核构建系统的开发者,他们需要知道内核Makefile的各个方面。

——

本篇教程主要面向第二类开发者和第三类开发者。即一般开发者和处理器体系架构开发者。

3. kbuild文件

大多数内核Makefile文件是kbuild Makefile文件,它们使用不同于一般make文件的kbuild语法。下面会介绍kbuild makefile的语法。Kbuild文件一般被命名为Mafile,但是也可以使用Kbuild名字。如果已经存在一个Makefile文件了,那么就只好用Kbuild名字了。

3.1节 "目标定义"是一个快速简介,更详细的介绍会在下面的章节陆续介绍并有真实的例子。

3.1. 目标定义(Goal Definitions)

目标定义是kbuild Makefile的最重要的部分。它们定义了哪些文件会被构建,并指定一些特殊的选项组合以及将递归进入到哪些子目录。

最最简单的makefile只有一行代码,如:

       obj-y += foo.o

这行代码告诉kbuild系统当前目录下有一个目标要构建,它的名字是foo.o。foo.o将从foo.c或者foo.S生成。

 

如果foo.o需要被构建成一个内核模块,那么应该使用obj-m。因此一般使用下面的模式:

       obj-$(CONFIG_FOO) += foo.o

$(CONFIG_FOO)是一个makefile变量,在makefile执行时被替换为y(如果内建到内核)或者m(如果构建成模块)。如果CONFIG_FOO既不是y也不是m,那个这一行代码会被忽略,指定的文件不会被编译也不会被链接。

 

3.2 内建的对象目标(object goals) obj-y

Kbuild Makefile通过obj-y列表为linux内核映象vmlinux指定目标文件(.o)。究竟是哪些目标文件则取决于内核配置。Kbuild系统会编译所有obj-y列表中的文件。然后Kbuild系统会调用$(LD) -r把所有的这系文件合并到一个built-in.o文件。跟住呢,built-in.o被最上级Makefile链接到linux内核映象文件vmlinux。

在obj-y列表中指定的文件顺序是很重要的。列表中的重复项也是被充许的。首先出现的会被首先链接到built-in.o,后面的重复项会被忽略。

链接的顺序当然也是有重要意义的。因为一些函数调用,如module_init(),_initcall会在系统启动阶段按照他们被链接的先后顺序被调用。所以改变链接的顺序当然会造成意义重大的影响。比如:会改变SCSI控制器被内核发现的先后顺序,因此磁盘的编号则会改变。

       #drivers/isdn/i4l/Makefile

        # Makefile for the kernel ISDN subsystem and device drivers.

        # Each configuration option enables a list of files.

        obj-$(CONFIG_ISDN)             += isdn.o

        obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o

(第一篇完)   第二篇

copyright blog.ykyi.net

 

中山大学软件工程专业Java语言课作业

这是11年中山大学软件工程硕士研究生java必修课的大作业,授课老师是温武少~ 讨厌写java代码。代码写得不好~不过,需要的童鞋可以拿过去改改。 下载源代码!!!

下面是作业要求:

面向对象程序设计课程项目

基于JAVA银行管理系统设计(Case 2,3,4)

 

注意:如果发现全部或者部分copy程序,双方都将会被部分或者全部扣分。本课程是必修课,70分是通过线。

    系统将依据3-tier架构设计银行管理系统。要求所有的项目用JAVA语言编程。设计的系统将是简化的银行管理系统。 

 

项目二:银行管理系统Business Logic 设计 (中程检查:10月31日(40%);上交11月7日 (60%), 当堂运行+ftp上交)

 

    所有的用户输入都是由命令行输入。项目必须提供设计文档、测试和运行报告。在线提交程序源程序。 

 

1. 银行用户分类: 普通个人用户,个人贵宾用户(VIP),企业用户

   对所有的用户必须支持以下功能:开户、存款、取款、查询、转账、改密码、销户等七项工作。所有对账户的操作都要产生日志。 所有的数据都要永久化(存到硬盘)。系统重新启动时要能恢复数据。

(1)开户:调研银行管理系统需要存储的账户信息。

     开户时需要身份证号码,决定开的账户类型,存款的初始金额。银行生成用户的帐号,用户输入初始密码。系统给出开户的时间日志。

(2)存款:

   存款时需要给银行提供自己的账号,密码以及要存款的金额;银行系统反馈用户帐户的余额以及存款的日志。

(3)取款:

   取款时需要给银行提供自己的账号、密码以及要取的金额;系统判断是否有足够余额以供取款。取款后给出用户帐户的余额,产生取款日志。

(4)查询:

    查询时用户需要给银行提供自己的身份证、账号和密码;银行方面给出用户帐户的余额以及查询的日志。用户还可以查询一段时间所有的操作(流水)。

(5)转帐:(对不同用户转账有限制,请看账户类型说明)

    用户转帐时需要判断是否能够满足转账条件。如满足,需要给银行提供转出帐户的账号、身份证号码、密码和用户名称及转入帐户的帐号和用户名称,用户也需要提供转账金额。系统方面将产生转账日志、转出用户帐户的余额等信息。

(6)改密码:

用户到银行改密码时需要给银行提供身份证、帐号、以及密码,并且输入新的密码。系统方面将产生相关日志。

(7)销户:

用户到银行销户时需要给银行提供身份证、帐号以及密码,并且把帐户的余额全部取出。系统方面将产生相关日志。

 

不同类型用户的特别限制和权限:

(1) 所有的用户可开两种账户—活期和定期。用户的活期和定期账号之间可以转账。

(2) 普通用户不能产生透支。

(3) VIP用户的初始存款额(包括活期和定期)要求大于100万, 每月平均日余额要求不低于10万。如果连续2个月月平均日余额要低于10万, 将收取每月1000元的管理费。VIP用户将能够透支最多 10万元。 但要求透支的款项在规定的时间(30天)内归还。如不归还,账户将被冻结。

(4) 转账只能在个人用户之间进行,或在企业用户之间进行。

(5) 普通用户只能接收转账转入,不能转钱到别人的账户。但普通用户可以在他自己的账号内转账。VIP和企业用户容许转入、转出。

(6) 企业用户容许多个账号操作人。 我们指定其中的一到两个人作为账户超级用户,可以要求增加账户操作人。不同账户操作人必须使用不同密码。 

(7) 企业用户不容许透支。要求账面存款余额总数(包括所有的账户)不小于1万元。

 

2.   银行雇员分类: 前台操作员, 银行经理,银行业务总管、系统管理员。 他们各自的职责:

系统必须能存储所有的雇员信息(自己调研)。银行经理管理一个或多个前台操作员,同时他可以做所有的前台操作员操作。银行业务总管管理一个或多个银行经理,他可以做所有的银行前台操作员及银行经理的工作。

 

银行雇员操作:

(1) 前台操作员:对账户所有的操作。雇员本身所作的操作的日报,月报,季度报和年报(包括数据和日志)。前台操作员向一个银行经理报告。

(2) 银行经理:作为前台操作员的所有操作,部门操作的日报,月报,季度报和年报(包括数据和日志, 及每个成员的报告)。银行经理必须较容易查到他部门人员总数及具体情况。银行经理向银行业务总管报告。 

(3) 银行业务总管(包括个人账户和企业账户两类):作为前台操作员和部门经理的所有操作,整个银行相关业务操作的日报,月报,季度报和年报(包括数据和日志, 及每个成员的报告,每个部门的报告)。银行业务总管应较容易查到他所管人员总数及具体情况。

(4) 系统管理员:雇员管理。 产生整个银行的总报表和总日志(日报,月报,季度报和年报)。

 

3. (加分 20%) 银行系统网络接口

  提供外面银行在线操作要求(必须提供通过网络提供各种操作需要的信息)。在线操作必须产生专用的日志。

 

项目三:银行管理系统后台数据库及接口设计(上交11月21日,当堂运行+ftp上交)

    数据存储采用数据库(建议用MYSQL.把business logic 层修改以支持数据库。

项目四: 银行管理系统UI设计(开放设计,上交11月28日,当堂运行+ftp上交)

所用的用户输入和输出采用GUI。

 

说明: 项目总成绩计算:项目1: 20%

                       项目2: 50%

                       项目3: 15%

                       项目4: 15% 

更多说明:

1.运行报告主要是指:系统所实现的所有功能的运行截图;

2.所谓“冻结”的意思是:只能查询余额,不能进行存款、取款的操作;不要求实现“解冻”,也就是这个账号一旦被冻结,这辈子就“冻”死了;

3.所谓“日报”:只要在txt文件下,随便输出几行文本,知道今天做了哪些事就可以了;月报、年报类似;

4.所有的定期与活期,分别使用各自固定的利率就可以:例如所有定期的利率为3%,所有活期的利率为2%;

5.银行业务总管(包括个人账户和企业账户两类)的意思是:银行业务总管只需要两个:一个“个人账户业务总管”,一个“企业账户业务总管”;

6.前台操作员向一个银行经理报告:意思是银行经理能查到他部门人员的日报,月报,季度报和年报;银行经理向银行业务总管报告的含义类似。

//////////////////////

copyright blog.ykyi.net

 

 

 

 

三分钟Qt Quick入门

Qt Quick是一种设计用户界面的新方法。

在介绍Qt Quick之前,让我们先看一下现念的用户界面UI是什么样的。在桌面操作系统下,标准的按钮,文本框,窗体仍然能满足要求。但是这些千篇一律的灰色单调的控件渐渐让用户感到厌倦了。用户们更想看到平滑观感的,光泽的,动态的的用户界面。Qt Quick就是为了实现这些的目标。

Qt Quick包括两个部分。第一部分是QtDeclarative模块。这个模块负责把Qt Quick集成到Qt应用程序中。第二部分是一种界面描述语言:QML。使用QtDeclarative使得开发者能够在C++和QML之间共享数据对象,也可以把C++类插入到QML之中,等等。QML是个全新的语言,专门为设计用户界面设计,在其它的开发中也有用武之地。

迫不及待了吧。让我们看一个简单的例子:

import Qt 4.6

Rectangle {
width: 200
height: 200

Text {
text: "hello! blog.ykyi.net"
font.pointSize: 10
font.bold: true

anchors.centerIn: parent
}
}

读完这断代码,再尝试在Qt Creator中运行它。不用我多费口舌,你就恍然大悟了。每一个以大写字母开头的单词定义了一个新的对象。最外面的矩形则是主窗体,可以给它设置属性。比如anchors属性把Text限定在窗体的中央。这样,即使窗体放大了,文本仍然显示在窗体正中央。

前文,我有说过平滑观感的,光泽的,动态的的用户界面。那么Qt Quick怎么做到呢?简单!看看下面的代码,编辑Text的属性,设置rotation:NumberAnimation。不可思议的事情就发生了!

rotation: NumberAnimation {
to: 360;
duration: 1500;
running: true;
repeat: true;
}

现在,指定的文本疯狂的转动起来。我们已经看到在Qt Quick中开发有物资的界面是多么简单。我们所展示的只是Qt Quick特效的凤毛一角,最终能创造出什么样的奇幻效果只受限于你的想象力。

copyright blog.ykyi.net

Barebox介绍

从裸机上电开始启动计算机的过程听起来是相当复杂的。在PC的世界里,BIOS统治这个领域已经几十年了。不过,哲学上讲任何世界都是从出生,到繁荣,再后到死亡的过程。BIOS的寿命也即将迎来终结。BIOS的掘墓者即是EFI。对于MAC用户来说,EFI的使用已经有好长一段时间了。而在嵌入式Linux的世界里,u-boot则在长时间里扮演着老大哥的角色。

U-boot,或者来自DENX的das U-boot提供了非常丰富的功能。如:网络,脚本,支持FLASH(这里的flash是存储方面的flash,而不是adobe的那个flash)。一般的嵌入式系统工程序师需要的工具,都提供好了。

还是那句话,对于万事万物,都是生生死死的过程啊。u-boot的功能越来越强大。催生了新的事物的诞生。它的名字就是:Barebox。

Barebox最开始被称之为:u-boot-v2,它是一个像u-boot一样野心勃勃的bootloader。不过Barebox更有Linux的味道一些。它的发展抛弃了u-boot而越来越像Linux。它有文件系统,有基本的shell,甚至还有与Linux近似的驱动模块。

Barebox的另一个创新即是,bootloader可以被构建成一个用户空间的应用程序。这样的好处是显而易近的,你可以更方便的开方和调试Barebox。

说了这么多,看看Barebox是个什么样子呢?

uboot:/

uboot:/ ls
. .. dev env
 

和Linux一样,dev目录夹下面放了系统的设备文件。比如,mem设备文件描述了计算机的内存。

再回到u-boot,它有一个特殊的命令:md。md命令可以查看内存的内容。对于Barebox,提供了同样的工具。不过这个工具是以一种POSIX的方式实现的:打开/dev/mem设备,lseek移动文件指针,read读出文件内容。这样的实现方式不仅仅提升了代码结构,它还使得md命令可以不需修改就应用到其它设备上,比如flash存诸器。

如果你想测试一下Barebox到底如何。你可以有两种方法。

  • 第一:你可以下载Barebox的沙盒功能即把它构建成一个Linux的用户空间的应用。来自Barebox官方的解释是:

Sandbox:
If you develop features for Barebox, you can use the 'sandbox' target which compiles Barebox as a POSIX application in the Linux userspace: it can be started like a normal command and even has network access (tun/tap). Files from the local filesytem can be used to simulate devices.   如果你要为Barebox开发功能,你可以使用'沙盒'。这种方式把Barebox构建成一个Linux的用户空间程序。它像一般的命令一样,而且还有网络功能。来自文件系统的文件可以被用来模拟设备。

  • 第二:不说你也知道,把Barebox安装到真真正正的硬件上吧!对于我,我就尝试过在PC机的一块旧式的主板上安装Barebox。 

最后,Barebox的官方网站是: http://barebox.org/

copyright blog.ykyi.net