内核是操作系统最基本的部分。 它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。

如何获取Linux内核源代码

下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包。除非你有特别的原因需要使用旧版本的Linux内核,否则你应该总是升级到最新版本。

使用Git

由Linus领头的内核开发队伍从几年前就开始使用Git版本控制系统管理Linux内核了(参考阅读:什么是Git?),而Git项目本身也是由Linus创建的,它和传统的CVS不一样,Git是分布式的,因此它的用法和工作流程很多开发人员可能会感到很陌生,但我强烈建议使用Git下载和管理Linux内核源代码。

你可以使用下面的Git命令获取Linus内核代码树的最新“推送”版本:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

然后使用下面的命令将你的代码树与Linus的代码树最新状态同步:

$ git pull

安装内核源代码

内核包有GNU zip(gzip)和bzip2格式。Bzip2是默认和首选格式,因为它的压缩比通常比gzip更好,bzip2格式的Linux内核包一般采用linux-x.y.z.tar.bz2形式的文件名,这里的x.y.z是内核源代码的具体版本号,下载到源代码包后,解压和抽取就很简单了,如果你下载的是bzip2包,运行:

$ tar xvjf linux-x.y.z.tar.bz2

如果你下载的是gzip包,则运行:

$ tar xvzf linux-x.y.z.tar.gz

无论执行上面哪一个命令,最后都会将源代码解压和抽取到linux-x.y.z目录下,如果你使用Git下载和管理内核源代码,你不需要下载tar包,只需要运行git clone命令,它就会自动下载和解压。

内核源代码通常都会安装到/usr/src/linux下,但在开发的时候最好不要使用这个源代码树,因为针对你的C库编译的内核版本通常也链接到这里的。

Continue reading

这几天情绪很烦躁,这种时候很适合敲代码来缓解心情。

程序是用Python写的,功能是将你输入的字符和数字翻译成其对应的Morse Code,同时通过声音读出来 。

代码在这里:

https://github.com/HenryKamg/Morse_Code

下次烦躁的时候我打算让程序通过听到的声音翻译出对应的 . – 和原始字符,今天就这样吧,下午去上课刷一发存在感。

以上。

Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array.

Example:

For num = 5 you should return [0,1,1,2,1,2].

Solution:

class Solution(object):
    def countBits(self, num):
        """
        :type num: int
        :rtype: List[int]
        """
        res = [0] * (num + 1)
        before = pow2 = 1
        for i in xrange(1,num + 1):
            if i == pow2:
                before = res[i] = 1
                pow2 <<= 1
            else:
                res[i] = res[before] + 1
                before += 1
        return res

Write a function to find the longest common prefix string amongst an array of strings.

Solution:

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len( strs ) == 0:
            return ''
        if len( strs ) == 1:
            return strs[0]
        minstrslen = 9999
        index = 0
        for i in range( 0, len( strs ) ):
            if len( strs[i] ) < minstrslen:
                minstrslen = len( strs[i] )
                index = i
        ShortestString = strs[index]
        list = [0 for i in range( len( ShortestString ) )]
        for i in range(0, len( ShortestString )):
            for j in range(0, len( strs )):
                if strs[j][i] == ShortestString[i]:
                    list[i] += 1
        Prefix = ''
        for i in range(0, len( ShortestString )):
            if list[i] == len( strs ):
                Prefix += ShortestString[i]
            else:
                break
        return Prefix

heaviest star cluster

heaviest star cluster

第九季的《生活大爆炸》里有个情节,某个无聊的日子 Rajesh 带着 Sheldon 做行星猎人,Sheldon 凭借他奇妙的图形思维能力第一时间发现了一颗新行星,并以他女友 Amy 的名字命名(补偿 Raj 的代价是,他们以后的每一个孩子都要叫 Rajesh,包括女儿)。

名字不是重点,重点是!这个让平凡人也能参与寻找太阳系外行星的计划真实存在!

「行星猎人计划」由耶鲁大学、牛津大学和芝加哥阿德勒天文馆合作推出。让普罗大众加入分析 NASA 开普勒太空望远镜的资料,肉眼寻找太阳系外行星。

这让你我也有机会发现一颗新星,甚至外星人。

Ready to discover new worlds?

https://www.planethunters.org/

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Solution:

/*用pre存中序遍历时当前节点的前一个节点,方便值的大小对比,用s1,s2记录这两个不合法序列的位置,s1存较大的值,s2存较小的值。
*/
class Solution {  
public:  
    TreeNode *s1, *s2, *pre;  
    void recoverTree(TreeNode *root) {  
        if(!root) return ;  
        s1 = s2 = pre = NULL;  
        recover(root);  
        swap(s1->val, s2->val);  
    }  
    void recover(TreeNode *root)  
    {  
        if(!root) return ;  
        recover(root->left);  
        if(pre && pre->val > root->val)  
        {  
            if(s1 == NULL) s1 = pre, s2 = root;  
            else s2 = root;  
        }  
        pre = root;  
        recover(root->right);  
    }  
};

今天来总结一下Linux (mainly Debian)的启动流程,也是深入了解Linux工作原理的一个方法.

BIOS ->  读取MBR -> /boot -> init进程 -> /etc/rcN.d -> /etc/init.d -> /bin/login -> login shell --> non-login shell

Step 1  加载BIOS

打开电源之后,计算机会首先加载BIOS信息。

Step 2  读取MBR

硬盘上第0磁道第一个扇区被称为MBR(master boot record),系统找到BIOS所指定的硬盘的MBR后,就会将boot loader(lilo/grub)复制到物理内存。

Windows不支持Linux的分区格式,所以用Windows的boot.ini是查不到Linux系统的。一般我装系统都是先装 windows再装linux,然后用grub来做boot loader,grub支持Windows分区格式。

Step 3  加载kernel

操作系统接管硬件以后,首先会将/boot目录下的kernel文件加载到内存中。

Step 4  启动初始化进程

kernel文件加载以后,开始运行pid为1的程序/sbin/init,他的作用就是初始化系统环境。

接下来,读取/etc/rc.d/rc.sysinit文件,设置主机运行环境。

Step 5  init依据inittab文件确定运行级别

Linux允许不用场景分配不同的开机启动程序,这就叫做“运行级别(runlevel)”。init进程的一大任务,就是去运行这些开机启动的程序。Debian预置的七种运行级别。0是关机,1是单用户模式,6是重启,2-5都是多用户模式。

Continue reading

一次特别high的面试.

因为昨天长沙暴雨航班晚点,到酒店已经是凌晨两点钟了。抽空睡了几个小时就奔赴360大厦.

今天三面的面试官都很nice,一面面试官是360运维开发部门的大神,愉快的交流了一番Docker、KVM虚拟化技术学到了好多还加了微信;然后二面面试官又是360 IoT部门的大神,专业对口哈哈,基础部分问的都不难,两道数据结构、一个算法和一个网络;最后HR面的是一个美女姐姐,竟然没有问我准备了好久的“有没有女朋友啊?= .= ”这个经典问题,不过是HR真的厉害,把我过去的学校生活到未来职业规划都给问出来了.

五月初双创结题,我有两个项目要答辩,学院老师说不定还会拉我去当主持人。。。当初背的锅就是现在流的泪,我是程序猿不是PM2.5好吗?不想回去不想回去不想回去!T_T

由于Python3的更新,原来的MySQLdb的驱动无法使用了,所以需要使用另外一个MySQL的驱动PyMySQL.

安装PyMySQL

pip install pymysql

安装完以后测试一下

>>>
>>> import pymysql
>>> conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='**',db='mysql')
>>> cur = conn.cursor()
>>> cur.execute("SELECT * FROM user")
6
>>> for r in cur.fetchall():
...            print(r)
...            #cur.close()
...
('localhost', 'root', ***, '', '')
('127.0.0.1', 'root', ***, '', '')
('localhost', 'debian-sys-maint', ***, 0, 0, 0, 0, '', None)
('localhost', 'qiao', ***, '', None)
>>>

查询成功