可可熊D窝

Keep it simple, stupid


  • 首页

  • 关于

  • 标签182

  • 分类8

  • 归档359

  • 搜索

看一段python的代码

发表 2008-04-29 | 分类 编程相关 | 评论数:
| 字数: 435 | 阅读 ≈ 1 分钟
def xselections(items, n):
    if n == 0:
        yield []
    else:
        for i in xrange(len(items)):
            for ss in xselections(items, n-1):
                yield [items[i]] + ss
for l in xselections(xrange(10), 3):
    print l

上面这段代码实现了从x数中取出y个数的全排列,xselections的实现用到了递归和yield,yield这个语句比较有意思:
“yield跟return一样会返回值,但是不一样的是return之后就退出函数了,而yield在丢出一次值给调用者之后还会返回继续运行生成器函数,并随着yield的再次调用丢出随后的生成值”

Comments

luguo: 恩,以前见识过yield的威力了~~

折腾办公室的电脑

发表 2008-04-28 | 分类 Life | 评论数:
| 字数: 1.2k | 阅读 ≈ 1 分钟

第一天来公司就一直折腾电脑了,刚开始是安装Feodra8时硬盘不能识别,应该是主板较新的缘故,没办法只得从虚拟机安装,没想到刚装了一会儿显示器就没有信号输入了,以为是刚才装机的时候没有把信号线插好,又重新插了一遍。结果再次装的时候问题又出现了,中间跑去电子商城换了块主板(原来是昂达780G主板A78GT,板载128M显存,后来换了一块技嘉的780G主板MA78GM-S2H),又等了半天的时间,本来想着回去马上把系统装好,没想到回去后又出现新的问题,没用多久就开始蓝屏,一看时间都下班了,公司也没人了,只好把机子撂在那里回学校了。

今天一大早去公司又把系统重新装了一遍,问题依旧,后来把两根内存全换了,这下问题解决了,真是奇怪,那内存在别人机子上用着好好的,拿我这里就不行了,郁闷,折腾了两天。不过依然不能直接装Fedora8,只好用vmware安装Fedora8。中间安装时没把grub安装,只好手动安装grub:

从光盘启动,选择rescuse模式,在接下来的提示中挂载上硬盘(默认挂载到了/mnt/sysimage/,注意这里需要挂载为可写模式,默认就是可写模式),然后使用命令chroot切换到硬盘文件系统:

chroot /mnt/sysimage/

安装grub:

/sbin/grub-install /dev/sda

重启虚拟机后可以进入grub,手动启动系统:

root (hd0,0)
setup (hd0,0)
kernel /boot/vmlinuz-……
initrd /boot/initrd-……
boot
[/text]
进入系统后,手动建立/boot/grub/grub.conf文件:
[text]
default=0
timeout=0
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora8
        root (hd0,0)
        kernel /boot/vmlinuz-……
        initrd /boot/initrd-……

做个链接:
ln -s /boot/grub/grub.conf /etc/grub

重启以后就好了。

这几天人品真差,我都吃了一个多星期的素了,佛祖也不给我加点人品……

Comments

crazyfranc: 小公司未必就不是好公司啊! 也不给咱透个气!

草儿: 要信道,别信那个外来的垃圾佛教,盗版咱们原创的道教。

Fred: …… 比较典型的 精力充沛型

kongove: 不管那里,好好干。 我坚信真正的人才是埋没不了的!

wind: 你活该!!!!!!

luguo: dp同学跑啥公司去了??

cocobear: A small company.

Ext2到Ext3转换

发表 2008-04-26 | 分类 Linux | 评论数:
| 字数: 6.1k | 阅读 ≈ 6 分钟

在U盘上进行一次完整的文件系统创建转换,很多人应该没有用过mkfs.ext2(其实是mke2fs这个命令)这个命令来创建文件系统,大多数的时候都是在安装系统时已经完成了文件系统的创建,下面先看看如何使用mkfs.ext2来创建文件系统(这里需要root权限):

[cocobear@cocobear minix]$ sudo mkfs.ext2 /dev/sdb 
mke2fs 1.40.4 (31-Dec-2007)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
31360 inodes, 125440 blocks
6272 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
16 block groups
8192 blocks per group, 8192 fragments per group
1960 inodes per group
Superblock backups stored on blocks: 
        8193, 24577, 40961, 57345, 73729

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

从Filesystem label= 开始解释,mkfs.ext2可以通过-L来指定文件系统的卷标,这里我们没有指定,因此为空;
OS type: Linux:mkfs.ext2在创建文件系统时检查操作系统的类型;
Block size=1024 (log=0):ext2文件系统是由一个个的block组成,这里给出来新创建的block的大小,1024bytes,当然也可以使用-b选项手动指定block的大小,一般情况下block大小为1024bytes或4096bytes;
Fragment size=1024 (log=0):fragment在这里是没有意义的,因为ext2文件系统不支持fragment,我们可以直接忽略。
31360 inodes, 125440 blocks:总共生成的inodes与blocks的数量,block数量我们可以通过U盘的大小来计算出来,首先使用fdisk来得到U盘的大小,该U盘的大小为:128450560 bytes,因为我们使用的block大小为1024 bytes,因此总block数为:128450560 bytes / 1024 =125400。

6272 blocks (5.00%) reserved for the super user:在ext2文件系统的创建时候默认会为root用户保留5%的空间,这个可以-m选项来指定。

First data block=1:表示数据从第一个block开始。

Maximum filesystem blocks=67371008:一个文件系统

16 block groups:一共有16个block分组;

8192 blocks per group, 8192 fragments per group:每个分组有8192个block;

1960 inodes per group:每个组有1960个inode;

Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
超级块在以前这几个block上进行了备份。

当然在文件系统创建好后也可以使用dumpe2fs或者tune2fs来获得上面的信息,tune2fs正是我们下面需要使用的转换工具。

[cocobear@cocobear ~]$ sudo dumpe2fs /dev/sdb 
dumpe2fs 1.40.4 (31-Dec-2007)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          d8d7cb8e-4cc0-4d91-b7e3-dcbc3f403345
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      resize_inode dir_index filetype sparse_super
Filesystem flags:         signed directory hash 
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              31360
Block count:              125440
Reserved block count:     6272
Free blocks:              119925
Free inodes:              31349
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         1960
Inode blocks per group:   245
Filesystem created:       Sat Apr 26 08:13:03 2008
Last mount time:          Sat Apr 26 17:13:06 2008
Last write time:          Sat Apr 26 17:13:06 2008
Mount count:              1
Maximum mount count:      31
Last checked:             Sat Apr 26 08:13:03 2008
Check interval:           15552000 (6 months)
Next check after:         Thu Oct 23 08:13:03 2008
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Default directory hash:   tea
Directory Hash Seed:      f8b3e365-54e7-43b1-ad25-b3270db87684

Group 0: (Blocks 1-8192)
  Primary superblock at 1, Group descriptors at 2-2
  Reserved GDT blocks at 3-258
  Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
  Inode table at 261-505 (+260)
  7673 free blocks, 1949 free inodes, 2 directories
  Free blocks: 520-8192
  Free inodes: 12-1960
………………

首先卸载掉U盘,然后使用下面的命令:

[cocobear@cocobear ~]$ sudo tune2fs -j /dev/sdb
tune2fs 1.40.4 (31-Dec-2007)
Creating journal inode: done
This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

然后我们再来看一下文件系统信息:

[cocobear@cocobear ~]$ sudo dumpe2fs  /dev/sdb
dumpe2fs 1.40.4 (31-Dec-2007)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          d8d7cb8e-4cc0-4d91-b7e3-dcbc3f403345
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal resize_inode dir_index filetype sparse_super
Filesystem flags:         signed directory hash 
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              31360
Block count:              125440
Reserved block count:     6272
Free blocks:              115812
Free inodes:              31348
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         1960
Inode blocks per group:   245
Filesystem created:       Sat Apr 26 08:13:03 2008
Last mount time:          Sat Apr 26 17:13:06 2008
Last write time:          Sat Apr 26 17:55:15 2008
Mount count:              1
Maximum mount count:      31
Last checked:             Sat Apr 26 08:13:03 2008
Check interval:           15552000 (6 months)
Next check after:         Thu Oct 23 08:13:03 2008
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            12
Default directory hash:   tea
Directory Hash Seed:      f8b3e365-54e7-43b1-ad25-b3270db87684
Journal size:             4113k

Group 0: (Blocks 1-8192)
  Primary superblock at 1, Group descriptors at 2-2
  Reserved GDT blocks at 3-258
  Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
  Inode table at 261-505 (+260)
  5113 free blocks, 1948 free inodes, 2 directories
  Free blocks: 520-5632
  Free inodes: 13-1960

从这里“Filesystem features: has_journal resize_inode dir_index filetype sparse_super”我们可以看到已经加入了ext3的日志功能。

Comments

luguo: tune2fs很强大嘛~~没用过的说~!

kongove: 我前两天刚在Unix技术手册上看过这个,我准备在虚拟机上创建一第二块硬盘练习一下。

Linux下以模块方式安装卸载文件系统

发表 2008-04-25 | 分类 Linux | 评论数:
| 字数: 2.8k | 阅读 ≈ 3 分钟

以Fedora8下面安装minix文件系统为例:

为了保证与系统内核相匹配,首先得获得相应版本的minix源代码,首先通过uname -r查询本机的内核版本:

[cocobear@cocobear ~]$ uname -r
2.6.24.4-64.fc8

在Kernel.org主页上可以获得2.6.24.4-64内核的源代码,其实我们只需要其中linux-2.6.24.4/fs/minix/目录中的代码。因为我们不需要对整个内核进行重新编译,因此我们只需要在linux-2.6.24.4/fs/minix/目录下写一个Makefile,生成相应的minix.ko就可以了。

在开始写Makefile之前要确认系统已经安装了以下的包:
[cocobear@cocobear ~]$ rpm -qa | grep kernel
kernel-devel-2.6.24.4-64.fc8
kernel-headers-2.6.24.4-64.fc8
kernel-2.6.24.4-64.fc8

在模块编译的过程中需要用到。
在源代码中已经有一个Makefile:
#

# Makefile for the Linux minix filesystem routines.
#

obj-$(CONFIG_MINIX_FS) += minix.o

minix-objs := bitmap.o itree_v1.o itree_v2.o namei.o inode.o file.o dir.o

修改该文件为:

#
# Makefile for the Linux minix filesystem routines.
# make minix fs as kernel module

obj-m += minix.o

minix-objs := bitmap.o itree_v1.o itree_v2.o namei.o inode.o file.o dir.o

KERNELDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)

default:

        make -C $(KERNELDIR)  M=$(PWD) modules

clean:
        rm -rf *.o *.mod.c *.ko *.symvers

这里简单的解释一下,obj-m表示该文件将以模块的方式编译;因为本模块由多个文件组成,采用模块名加 –objs(minix-objs)后缀的形式来定义模块的组成文件。KERNELDIR定义了代码树的位置,PWD定义了当前文件夹位置;而make命令中-C选项指定了代码树的位置(由KERNELDIR给出),M=$(PWD)指定了在当前目前进行构建工作。

最后一行清理编译过程产生的文件。

完成了Makefile后我们就可以开始编译这个文件系统模块了,直接输入make就开始编译了:
[cocobear@cocobear minix]$ make
make -C /lib/modules/2.6.24.4-64.fc8/build M=/home/cocobear/minix modules
make[1]: Entering directory /usr/src/kernels/2.6.24.4-64.fc8-i686' CC [M] /home/cocobear/minix/bitmap.o CC [M] /home/cocobear/minix/itree_v1.o CC [M] /home/cocobear/minix/itree_v2.o CC [M] /home/cocobear/minix/namei.o CC [M] /home/cocobear/minix/inode.o CC [M] /home/cocobear/minix/file.o CC [M] /home/cocobear/minix/dir.o LD [M] /home/cocobear/minix/minix.o Building modules, stage 2. MODPOST 1 modules CC /home/cocobear/minix/minix.mod.o LD [M] /home/cocobear/minix/minix.ko make[1]: Leaving directory/usr/src/kernels/2.6.24.4-64.fc8-i686’

编译结束后会面当前目前下生成minix.ko文件,这就是我们需要的东西,使用insmod命令就可以安装这个minix文件系统模块了。当然这里需要有root权限。我们来演示一下minix模块的加载:

[cocobear@cocobear minix]$ cat /proc/modules | grep minix
[cocobear@cocobear minix]$ 

这里可以看到minix并没有被加载,我们使用insmod minix.ko命令:
[cocobear@cocobear minix]$ sudo insmod minix.ko
[cocobear@cocobear minix]$ cat /proc/modules | grep minix
minix 28676 0 - Live 0xd0e7d000

insmod后我们从上面的信息可以看到minix模块已经被加载,如果不需要使用这个模块我们同样可以很方便的把它卸载:

[cocobear@cocobear minix]$ sudo rmmod minix.ko
[cocobear@cocobear minix]$ cat /proc/modules | grep minix
[cocobear@cocobear minix]$ 

到此我们顺利的完成了文件系统的编译、安装以及卸载。

BTW:中间遇到了点问题写了Makefile后输入make提示:”make: Nothing to be done for `default’.“,在网上找到了原因,在make命令前要使用tab,而不是空格,而我的刚好的空格,郁闷,以前就似乎遇到过的。

Comments

luguo: 晕,那竟然是空格的问题~~邮件里看不出来啊~!不过用tab是每个makefile教程里都有的!

cocobear: 以前也记得,不知道怎么竟然忘掉了。

Python-Challenge-2

发表 2008-04-24 | 分类 编程相关 | 评论数:
| 字数: 1.3k | 阅读 ≈ 1 分钟

第五关:
不多说什么了,点点图片就可以发现了,直接贴代码上来:

#!/usr/bin/env python

from urllib import urlopen
import re

id = 12345

while id:
        url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s" % id
        page = urlopen(url)
        text = page.read()
        print text
        id = ''.join(re.findall('and the next nothing is ([0-9].*)',text))
        print id

中间停了一下,出来个提示“Yes. Divide by two and keep going.”,刚开始还以为是分成两组,其实是除以2然后继续,那就手动把上面的id初始化为92118/2=46059。再运行一次程序就得到下一关的地址:peak.html。

第六关:
网页的源码中有一个提示“peak hell sounds familiar ”,我读了半天也没觉得熟悉,后来作了个弊,查了一下Python的函数,发现了pickle这个函数,peak,hell连读一下就是pickle了,这都可以。把网页改为pickle.html,会提示“yes! pickle!”,看来函数是找到了。然后在源代码中找到banner.p,获得这个文件里的内容,看起来乱七八糟的一些东西,其实就是使用pickle生成对象的一个序列,可以直接保存在文件里,关于pickle这里有一个简单的介绍,我也是现学的,贴代码:

#!/usr/bin/env python

import pickle
import sys

f = file('banner.p')
p = pickle.load(f)

print p
for a in p:
        for b in a:
                x,y = b
                while y:
                        sys.stdout.write(x)
                        y=y-1
        print
f.close()

从文件中会得到一个很长的list,仔细看看又是由好多个list组成,而这些list中数字之和都为95,根据banner.p这个文件名可以想到这是个字符图片,在上面的程序中我打印出了这个图片(有一点需要注意,你得把终端可显示的字符设置为至少95,不然会提前自动折行,这样就没办法看到这个banner了):
得到下一关地址:channel.html

1…282930…72
cocobear

cocobear

爱折腾的技术宅一枚

359 日志
8 分类
182 标签
RSS
GitHub E-Mail Twitter 豆瓣
友情链接
  • 王聪
  • 老大
0%
© 2007 – 2020 cocobear | 521k | 7:54
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v6.7.0
Hosted by GitHub Pages