使用gdb和虚拟机调试内核

调试内核很麻烦,即使是有了虚拟机的帮助。在这里记下一些关键的东西,以备忘 。

#  编译内核后, 用新内核启动系统失败,报错 “unable to mount fs ….” 之类.

需要用 update-initramfs 生成initram。

# 对于grub2,我增加了一个自定义的grub开机启动项用来调试内核,如下:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
echo "Add Debugging entry"
cat << EOF
menuentry "Debian debug 3.7.4"{
set root=(hd0,1)
linux /boot/vmlinuz-3.7.4 root=/dev/vda1 ro quiet kgdboc=ttyS0,115200 kgdbwait
initrd /boot/initrd.img-3.7.4
}
EOF

/////////

the above grub configuration file resides in /etc/grub.d/

# client在虚拟机里启动后在内核调试断点处停下。这时在host机用gdb调试.

# gdb vmlinux

set remotebaud 115200

target remote /dev/pts/0

此时gdb输入continue命令让客户机的系统继续运行。如果想断下正在运行的client内核,在client机中使用magic SysR:  echo "g" > /proc/sysrq-trigger

 

Okular是linux下最好用的pdf阅读工具

我记得对于大多数Gnome桌面环境,Evince是默认的pdf阅读软件。今天不知道怎么回事,发现evince没有了。当时我不记得evince这个名字了,就apt-cache search pdf 随便装上了xpdf-viewer。太他妈难用了啊~~就卸载了,然后google: The Best PDF Viewer on Linux。找到了Okular,也是免费软件,装上一用。不错哈哈哈.贴一张网络上的图片:

另外今天才知道, Adobe也有出linux下的pdf阅读软件。

显示Gnome3任务栏

Gnome3桌面较之Gnome2有了非常大的区别~

第一眼看上去有惊艳的感觉~多用了一点时间,发现没有任务栏真是相当的不方便啊。我觉得最方便的还是Win7的方式。

那怎么把Gnome3消失的任务栏找回来呢?通过安装一个安装包搞定。

我用的是Debian 6.06 Wheazy

zausiu@accolade:~$ cat /etc/debian_version
6.0.6

对于Debian家族的ubuntu应该也是适用的。

# apt-get install tint2

$ tint2 &

于是久违的gnome任务又回来了~

Gnome的任务栏又回来了
Gnome的任务栏又回来了

 

Let the Universal Access Preferences Taskbar Icon Disappear让统一访问首选项在任务栏上消失

我用的是Debian Wheezy Stable系统。今天不知道怎么搞得,把任务栏上面弄出个 配置Universal Access Preferences的图标。右链点击也没有让我选择退出的选项。

搜索了一下,知道用 gnome-keyboard-properties 把这个该死的图标去掉。

1. alt+F2  输入 gnome-keyboard-properties

2. 选中Accessibility ,取消 Accessibility features can be toggled with keyboard shortcuts.

这几天调linux内核源代码,好困难好困难。

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 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 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 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 ykyi.net

中山大学离散数学考试试题

《离散数学》期末试题(A卷)

ykyi.net

(考试形式:闭卷  考试时间:2小时)

《中山大学授予学士学位工作细则》第六条

考试作弊不授予学士学位

方向:                       姓名:                   学号:            

出卷:                      复核:            

1. (10 points)  A, B and C are sets, prove or disprove the following statements.

(1). if A – B = A – C, then B = C

(2). if A ´ B = A ´ C, A ¹ Æ, then B = C

2. (10 points)  Write each of the following statements in terms of propositional variables, predicates, quantifiers and logical connectives. You can choose any propositional variables and predicates freely.

(1). If I like the course or the teacher, I will attend the class. (statement and its negation)

(2). For all students of our school, someone studies hard and has good score, someone studies hard and does not have good score.

Note: The first question is expressed in propositional logic, the second is expressed in predicate logic.

3. (15 points) Let A={a,b,c,d,e}, a relation R on A is {(a,b), (b,b), (b,c), (b,d), (c,d), (d,d), (d,e), (e,d)}.

(1) Give the digraph and matrix of relation R;

(2) Compute R2, reflexive closure r(R) and symmetric closure s(R).

4. (15 points) Let SÎZ+ and A=S×S. Define the following relation R on A:

(a,b) R (a′,b′) if and only if ab′=a′b

(1) Show that R is an equivalent relation;

(2) Let S={1,2,3,4,5,6,7,8,9}, compute the equivalent class [(2,4)].

5. (10 points) Let function f(x, y)=( x+3y, 2x+y), (x, y)ÎR×R, prove that f is bijection.

6. (15 points) Let A={2, 4, 5, 6, 8, 10, 12, 20, 120}, R is the relation of divisibility on A.

(1) Draw the Hasse diagram of the poset <A, R>;

(2) Find all the minimal elements, the maximal elements, the least element and the greatest element of the poset <A, R> if they exist;

(3) Let B = {2, 4, 6}, find the upper bound, the lower bound, the least upper bound and the greatest lower bound of B if they exist.

 

7. (15 points) Use the labeling algorithm (Ford-Fulkerson’s) to find a maximum flow for the following transport network in Fig. 1. Use of figures is required to show the variety of flows during the procedure.

 

labeling algorithm (Ford-Fulkerson’s) to find a maximum flow for the following transport network

 

 

8. (10 points) Use Kruskal’s algorithm to find a minimal spanning tree of graph in Fig. 2. The sequence of edges-selecting is ordered to be shown up.

Use Kruskal’s algorithm to find a minimal spanning tree of graph.

ykyi.net

什么是MediaWiki的Gadget(小部件)

 

译自MediaWiki的官网,URL: http://www.mediawiki.org/wiki/Extension:Gadgets

Gadget简介:

MediaWiki,为用户提供了一种方法,使用户方便使用其它用户基于Javascript或者CSS创建的小部件Gadget.

 

Gadget是由Javascript或者CSS代码片断组成的,被放置在MediaWiki名字空间里(对于MediaWiki的名字空间的概念请参看其它文章)。每一个Gadget都在MediaWiki:Gadgets-definition中占用一行,用来定义这个gadget。定义包括这个Gadget的名字,和描述以及组成这个Gadget的Javascript和CSS代码。

 

因为Gadget被放置在MediaWiki名字空间里,只有系统管理员可以编辑Gadget。这很容易理解:只有充分被信任的用户才可以编辑被其它更多用户使用的Javascript代码。Javascript代码是把双刃剑,如果被用来做坏事,会很容易被用来实现劫持账号或者监视用户的功能。

 

下载Gadget:

从https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Gadgets.git;a=tree 可以下载到Gadget,或者也可以用git工具clone一份gadget,如下:

git clone https://gerrit.wikimedia.org/r/p/mediawiki/extensions/Gadgets.git

 

如何安装:

把Gadget目录复制到你安装MediaWiki的扩展目录(Extensions Folder)。然后在localSetting.php文件中,接近文件末尾的地方加上一行:

require_once( "$IP/extensions/Gadgets/Gadgets.php" );

 

使用Gadget:

可以使用的Gadget定义在MediaWiki:Gadgets-definion。只要有一个有效的Gadget在MediaWiki:Gadgets-define被定义,就能在每个用户的Special:Preference的Gadgets节选择是否启用这个Gadget(小部件)。在Special:Gadgets也能浏览Gadgets的列表,并有链接指向各自的系统消息(System Message),以方便编辑。

 

定义Gadget的格式:

在MediaWiki:Gadgets-definition中的每个Gadget的定义都以一个或者多个"*"开始,必须符合下面的格式定义。

 * Gadget的名字 [ 选项(可以忽略) ] | 页名字

 (* gadget_name [options (can be omitted)] | page names)

第一个域,Gadget的名字指的是gadget的内部名字。这隐含了一个系统消息的引用(System Message)。此例中,如果你定义了内部名为 my_gadget_name 这样一个gadget,则在MediaWiki:Gadget-my_gadget_name有一个使用wiki语法的关于这个gadget的简短描述。

 

注意,gadget的内部命令规则:必须以字母起头,后面可以接26个字母的大小写或者数字,以及连字符“-”,下划线“_”,冒号“:”,点号“.”。

 

选项的格式:

[option1 | option2 | … optionN]

空格将被忽略。每一个选项可以包括一个选项名,或者选项名还能被赋值,这些值以逗号隔开。如: option = value1, value2, value3

 

举一些Gadget定义的例子:

 * mygadget|mygadget.js|mygadget.css

or

 * mygadget[ResourceLoader]|mygadget.js|mygadget.css

or

* mygadget[rights=foo,bar]|mygadget.js|mygadget.css

or

* mygadget[ ResourceLoader | rights=foo, bar ] | mygadget.js | mygadget.css

 

选项的说明:

选项名

参数

描述

ResourceLoader

None

注明Gadget与ResourceLoader兼容。

dependencies

用逗号分隔开的ResourceLoader模块名

这里有默认依赖的模块列表.如果当前的gadget没有与ResourceLoader兼容的资源,这个选项将失效。

rights

用逗号分隔开的权限名

权限名列表在这里 privileges.

skins

用逗号分隔开的皮肤名

皮肤名列表在这里 skins.

default

注明对每个用户,包括匿名用名默认启用的gadget。不过注册用户仍然可以在它们的使用偏好设定中禁用gadget.

你可以为你的gadget指定额外的依赖,如:

* mygadget[ResourceLoader|dependencies=jquery.ui, jquery.effects.clip]|mygadget.js|mygadget.css

 

此例中,我们请求RescourceLoader与mygadget一起加载jquery.ui和jquery.effects.clip模块。注意只有在ResourceLoader中注册中的模块可以被设置成依赖项。

 

下面是设定gadget只对有某些权限的用户生效:

* ImprovedDeletion [rights=delete] | ImprovedDeletion.js 

此例中,我们设定gadget只有对有权限删除页面的用户有效。注意权限指点是这里的 permissions, 而不是像 administrators 一样的用户组。下面再给出一些例子:

modrollback[ResourceLoader|rights=rollback]|modrollback.js

UTCLiveClock[ResourceLoader|rights=purge]|UTCLiveClock.js

Ajax_sysop[ResourceLoader|rights=patrol,rollback,markbotedits,delete]|Ajax_sysop.js

 

ResourceLoader:

所有的gadget的css总是通过ResourceLoader被加载的。但是,一些老旧的javascript写法经常与ResourceLoader不兼容,所以每一个gadget必须被显式地注明兼容性才能被ResourceLoader加载。

否则,会使用旧式的写法 <script src="/w/index.php?title=MediaWiki:Gadget-gadget_name.js&action=raw"> 。

 

页面:

Gadget的定义行后面部分提定了组成gadget的Javascript或者css代码的文件,这些代码文件被放置在系统消息中(System Message)。所以的文件都必须以.js或者.css为扩展名。每个gadget都可以使用任意多个系统消息。一些共用的功能可以被多个Gadget使用。如下:

 * frobinator|commonStuff.js|frob.js|frob.css|pretty.css

 * l33t|commonStuff.js|tools.js|l33t.js

 

节(Sections):

定义在MediaWiki:Gadgets-definition中的gadget列表可以被分成多个节。每个节用两个或者多个"="号起头和结尾,“=”中间指定节的名字。如:

 == interface-gadgets ==

这样就定义了一个节(Section),标题在 MediaWiki:Gadget-section-interface-gadgets 页面中定义。

copyright ykyi.net