2007年10月27日星期六

一些记录

1.tar可以自动分辨格式的,用tar xvf就可以解压.tar.bz2文件与.tar.gz文件。(不用指定z或j)

  原来tar只负责打包不负责压缩,而压缩是由gzip或者bzip2来完成的。后来为了方便添加加了z和j参数。

2./etc/init.d/下有各种系统服务的启动程序

service nfs restart , 可以用/etc/init.d/nfs restart 代替,后者可以补全,而前者不可。

3.设置系统服务,命令行方式可用chkconfig.  setup命令有个简易的图形界面。

4.改DNS,可以使用vi /etc/resolv.conf,不用重启。

5../etc/inittab文件结构

每行由四部分组成

  1. ID          用于标识该配置项的 id,长度为 1~4 个字符
  2. 运行级    列出在哪些运行级时执行该配置项的命令。
  3. 动作       指示该条命令应该如何执行。
  4. 进程       执行该项时需要启动的可执行文件名及其参数
常见动作有:
  • initdefault:     指定系统的默认运行级。
  • respawn:         该配置项所指定的进程如果被结束,则重新启动该进程。
  • wait:                该配置项指定的进程在运行结束之前不要执行下一条配置项。
  • once :               切换到对应的运行级之后,仅执行指定的进程一次。
  • sysinit:            无论以什么运行级启动,系统启动时都要执行该配置项指定的进程。
  • boot:                仅在系统启动时执行一次。
  • bootwait:         仅在系统启动时执行一次,在执行结束之前不执行下一条配置项
  • powerfail:        当接收到UPS的断电通知时执行该项指定的进程。
  • powerwait:      与powerfail相同,但init会等待进程执行结束。
  • powerokwait:  接收到UPS的供电通知时执行。
  • ctrlaltdel :       当用户同时按下 Ctrl+Alt+Del 时执行该项指定的进程
6. MBR
    MBR: Master Boot Record,主引导记录.
   位于第一块硬盘的第一个扇区,大小为512字节。其中前 446 字节为引导程序,之后的 64 字节为分区表,最后的两字节为结束标记。
   dd if=/dev/hda of=/root/mbr bs=1 count=512   备份MBR
7.长蓝平二
长尾理论&蓝海战略&世界是平的&web2.0
8.top命令详解
   http://tech.idv2.com/2006/08/16/top-command/
9.LAMP OpenSource Web  Platform
  Linux+Apache+Mysql+(PHP/Perl/Python)
 另外,webserver -lighttpd
           sqlserver  -postgresql,splite
           p - ruby,RoR

2007年10月20日星期六

转圈赋值矩阵问题

北电笔试的一个改错题。
打印如下矩阵:
   1   2   3   4   5
  16  17  18  19   6
  15  24  25  20   7
  14  23  22  21   8
  13  12  11  10   9

直接把正确程序贴上来吧。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

void PrintMatrix(int *matrix,int size)
{
  //  output the matrix
  int i;
    for(i=0;i<size;i++)
      { int j;
        for( j=0;j<size;j++)
          {
            printf("%4d",matrix[i*size+j]);
          }
        printf("\n");
      }
  return;
}

void FillMatrix(int *matrix,int size)
{
  int upperBound,lowerBound;
  int index1=0,index2=0;
  int direction=1;
  int number=1;
  int dimensionFlag=0;

  upperBound=size;
  lowerBound=0;
  while(upperBound>=lowerBound)
    {
      int i;
      for( i=0;i<4;i++)
        {
          int j;
          for(  j=lowerBound;j<upperBound;j++)
            {
              matrix[index1*size+index2]=number;
              number++;
              if(j==upperBound-1)
                {
                  dimensionFlag=!dimensionFlag;
                  if(i%2==1)
                    {
                      direction=-direction;
                    }
                }

              if(dimensionFlag)
                index1+=direction;
              else
                index2+=direction;

            }
              if(i%2==0)
                {
                  if(i%4==0)
                    {
                      lowerBound++;
                    }
                  else
                    {
                      upperBound--;
                    }
                }
            }
        }
      return;

}


  int main()
  {
    int MATRIX_SIZE=5;
    int *matrix;
    matrix=(int *)malloc(sizeof(int)*MATRIX_SIZE*MATRIX_SIZE);
    FillMatrix(matrix,MATRIX_SIZE);
    PrintMatrix(matrix,MATRIX_SIZE);
    return 0;
  }

i从0到3对应4个方向,
针对每个方向有dimensionFlag,directrion标识index1,index2该如何前进。
lowerBound,upperBound表明每行或者每列未填充的矩阵元素上下边界。

2007年10月17日星期三

泰鼎的一道笔试题:结构体相关

在中括号里补充语句,使程序完整
typdedef struct _A{
    ...  ... // some definitions
    int x;
    ...  ... // some definitions
    int y;
}A

void foo(int *px)
{
    //print the value of y
   【                    】
}

void main()
{
    A *a = ( A *) malloc (sizeof(A));

    if ( a == NULL )
       return ;
    foo( &(a->x));
}

此处的问题是如何通过结构体内一个成员变量的地址,找到另一个成员变量的地址。
当时没有思路。
下来看别人讨论才知道怎么回事,
可以再定义一个A b;
那么 &b.y-&b.x即y与x之间的偏移。
printf("%d",*(px+(&b.y-&b.x)));
就可以打印出y的值。

在 C语言中有个offsetof函数
用来计算结构体中成员变量的偏移,

下面一段内容来自 http://www.2.newsmth.net/bbscon.php?bid=332&id=390&ftype=3&num=39
start
5. offsetof
常见的 offset 定义
#define offsetof(s, m) ((unsigned) &((s*)0)->m)
问题1:标准要求 offsetof 的结果是 size_t 类型,unsigned 不一定等同于 size_t
即便改成用 size_t
#define offsetof(s, m) ((size_t) &((s*)0)->m)
在 C++ 中,由于 & 运算符可以被重载,因此这样的 offsetof 得到的结果仍然可能是
错的。

gcc 3 给的答案颇为复杂:
#ifndef __cplusplus
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#else
/* The cast to "char &" below avoids problems with user-defined
   "operator &", which can appear in a POD type.  */
#define offsetof(TYPE, MEMBER)                  \
  (__offsetof__ (reinterpret_cast <size_t>          \
                 (&reinterpret_cast <const volatile char &> \
                  (static_cast<TYPE *> (0)->MEMBER))))

2007年10月8日星期一

GNU Screen:介绍和新手教程

GNU Screen:介绍和新手教程

原文出处:未知

原文作者: jeduthun

授权许可:未知

翻译人员:MillenniumDark, leal

校对人员:leal

适用版本:all



大多數現代Unix类操作系統(比如Linux,、MacOS X和BSD等)都帶有一個叫做GNU Screen的終端模式下的小工具。如果把終端比作戰士,那GNU Screen就是戰士手中強有力的武器,對於文本模式下的人機交互而言,它是一把名副其实的瑞士軍刀。

僅管這一工具用处很大,却被很多人所忽视。原因何在?因为它的存在几乎少有人知,即便是那些知道的人也很少能理解它要解决的问题!在這 篇文章中,我將解釋screen會為你做什么,并且提供一些使用screen完成基本任務的簡單介紹。本文目标读者是那些能熟练使用命令行,但对 screen本身只有很少或几无经验的人。

screen之作用

一言以蔽之,screen是个终端的多路复用器。借助screen,你可以在单个终端内運行任意数量的基于終端的應用程序,如交互的命令 shell,基于curses的應用程序,文本編輯器等等。做到這點的渴望正是大多數人迷上screen的原因。过去我登录到系统后,常常得打开六七个终 端模拟器:一个用来读邮件,一个用来编辑代码,一个来编译代码,一个用来阅读新闻,一个用作登录web主机的shell,等等。现如今,我只要启动一个终 端模拟器,然后在其中运行screen。Ok,一切搞定。

screen另一个很酷的主要特性是它能使运行着的程序脱离终端模拟器。也就是说即使你不小心关闭终端模拟器,screen也能让程序 继续运行;甚至在你注销之后,它也能让程序在你下次登录后从上次中断处继续执行。也就意味着,所谓的“会话”——你在期间运行大量终端程序——是个自由流 动的实体,你可以把它绑定到任意处的任意终端上,甚至根本不绑定,只要你愿意。

screen新手上路:启动以及在程序间进行切换

在你最爱的命令shell提示符下键入screen即可启动screen。也许会收到一条欢迎信息,任意键略过该信息,就会进入一个空白终端,只包含一个shell提示符,一切和你启动screen之前实在是差不多。那究竟暗藏了什么?

在screen下運行的每個程序在各自窗口内運行,每個窗口都有一个独一无二的数字标志号。Screen建立一个新窗口,标记为0,并在窗口内启动一个命令shell。试着在新窗口里输入些东西,以便过会儿你切换回到该窗口时能认出它来。

現在再建立一個窗口;那會是窗口1。按C-a c即可建立新窗口;详细步骤为,先按下Ctrl-a,然后按c(即创建create窗口)。

現在你有兩個窗口了,试着在两者之间进行切换。具体动作为按C-a C-a,它会切换到当前窗口之前你使用的窗口。如果你打算运行两个以上的程序,你会需要如下一些有用的窗口切换方法:

  • 使用C-a n和C-a p切换至窗口列表里的下一个或上一个窗口,按窗口号排序。
  • 使用C-a N——N为0到9之間的數字——切换至相应窗口。
  • 使用C-a " 來獲得一份全屏的窗口列表。你可以使用箭頭鍵(或者vi風格的j和k)瀏覽列表,在某窗口项处于高亮显示时,按回车键可激活该窗口。C-a w会显示一个小型、不能交互的窗口列表。

使用一個窗口的時候,按C-a A可以給它起名。這個名字將显示在窗口列表里,当你使用大量窗口时,它可帮助你回想起自己在每个窗口里干吗来着。

退出一個窗口中的最後一個程序后,该窗口便自行消失。你也可以用C-a K來殺死那些反常的程序。

卸下和重新附加:终端分离之妙

如果你确实做了上面的練習,那你已成功建立了一個screen會話。你可以按C-a d卸下這個會話,此外关闭包含该会话的终端模拟器也可以卸下会话。不过,请记住,上述两种方法实际上都没有终止你的会话。它们只是解开你的会话和当前终端 的绑定,你所启动的运行在screen里的所有程序仍在运行之中,千真万确。

試試這個:關閉你用來做上述練習的所有終端模擬器,然后只要你愿意,甚至可以注销,重新登录。启动一个新的终端模拟器,鍵入screen -r(這里的R自然是代表reattach),你會回到上次卸下會話的状态。

你大可以想象一下這帶來的一大堆好處。你可以一次性啟動所有自己喜愛的控制台程序,然後让它们运行在一个持续的screen会话里。有些人甚至让screen在那儿工作数月。

卸下和重新附加的另一個大用场是用作控制台模式的“远程桌面”。你可以卸下一个上班时的screen会话,在家用shell登录那台机器,然后重新附加。非常,非常好用。再加点努力,你甚至可以把多个终端全都附加到同一个会话里,对协同工作和会议而言奇妙无比。

复制,粘貼,以及回滾緩沖

Screen會記下回滾行數(行数可配置),它能派上用场,因为在运行screen时你将无法使用终端模拟器的回滚功能。键入C-a [进入“copy mode”,你便可以访问回滚缓存。你可以给回滚缓冲里任意处的文本打上记号,并用C-a ]进行粘贴。Screen还能把日志写入文件中,不过该主题已超出本指南讨论范围。

監視沉默和活動

在screen里運行一大團程序的不足之一是你无法同時監視所有程序,因為一般來說,你每次只能看見一個。(事實上,你可以分割屏幕,一次看到多 个,此属高级用法,不在本指南讨论范围之内)為了減少這一麻煩,Screen提供了如下特性,你可以监视一个窗口的沉默,比如用于获悉编译何时完成;或者 监视一个窗口是否活跃,比如用于获悉某人最后在你喜欢的IRC频道上的谈话时间。

開始或停止監視當前的窗口的30秒沉默了30秒,按C-a _ ;開始或停止監視當前的窗口的活動,按C-a M。

和screen说拜拜

如卸下和重新附加一节所述,screen不易杀死(退出)。你不能只是关掉包含它的终端。(实际上,你可以这么做,不过所有进程仍会在系统中运行,等待被重新附加。)在screen里没有“quit”(退出)一键,那又该怎样才能完全退出screen呢?

据我所知,体面(即不是通过发送恶意的信号给进程而退出)退出screen的唯一途径是关闭每个screen窗口。退出每个screen运行的程序或shell,它们就会乖乖走开。当screen里运行的最后一个程序退出之时,screen本身也就“一命呜呼”了。

其它资料

Screen之能力远多于我上面所描述的功能,不过本文所写已足够你上手之用。身在screen里时,你可以键入C-a ?获取一份简要的命令列表。screen的man页也有大量信息,如有疑问,你还可以参考下列web资源:

Yahoo GNU Screen讨论组 screen邮件列表更新相当快,潜伏着许多高手。

Sven Guckes的 Screen页面 另一个概要页面;比本文更为简洁。

screen官方主页 无需赘言,该页对细节所述少的可怜。

screen man页 排版相当棒,组织成多个小节。很不错的参考手册。一定不要错过关于如何使用.screenrc定制screen的几个小节。

Screen FAQ 新手不宜,但实为解决疑难杂症、居家旅行(别扔臭鸡蛋……,纯粹kidding,译注)之必备用品。