Good Good Study, Day Day Up!

Happy Life, Happy Money!

打算完全用命令行工作-大纲

背景:看完徐宥的“完全用命令行工作”的系列文章后,打算打造个自己的专属平台。

idea:分为日常、编程、学习 大类。

日常:邮件、上网、媒体、游戏

学习:阅读

编程:

 

根据上面大纲,整理一系列的文章。

 

--EOF--

个人邮件解决方案

http://hi.baidu.com/%CB%BC%BF%C6%CD%F8%C2%E7%D1%A7%D4%BA/blog/item/e80c4243a7f6e81672f05d3f.html

背景:E-mail是信息社会中最重要的通信工具之一,也是各种Unix系统上最基本的组件之一。由于最早的E-mail就是在Unix系统上发展出来的,Unix上的E-mail解决方案非常丰富,Linux也继承了这一优点。
对于多数人而言,第一次使用的E-mail工具可能是微软的Outlook Express或者Foxmail。Linux上的E-mail软件非常丰富,除了各种图形界面的E-mail软件如Evolution、Mozilla Thunderbird之外,还有很多字符界面的E-mail工具,如Mutt、Pine等。

相关概念:MTA、MUA和MDA

MUA:(Mail User Agent)顾名思义,MUA就是“邮件用户代理”。邮件需要代理,这是由于通常Client端的计算机无法直接寄信(不然为什么要邮件主机?),所以,需要通过MUA帮我们传递信件,不论是送信还是收信,Client端用户都需要通过各个操作系统提供的MUA才能够使用邮件系统。举个例子,Windows里的OutLook Express、Netscape里的mail功能与KDE里的Kmail都是MUA。MUA主要的功能就是接收邮件主机的电子邮件,并提供用户浏览与编写邮件的功能。

MTA:(Mail Transfer Agent)MUA是用在Client端的软件,而MTA是用在邮件主机上的软件,它也是主要的邮件服务器。MTA就是“邮件传送代理”的意思,既然是“传送代理”,那么用户寄信与收信时,都找MTA就对了!因为它负责帮用户传送。基本上,MTA的功能如下。接收外部主机寄来的信件:既然是邮件主机,接收信件自然是主要功能,只要这个信件里有MTA内部账号,这封信就会被MTA收下来; 帮用户发(寄出)信:既然可以收信,自然也可以发信,只要用户具有合法的使用MTA的权力,就可以利用这台MTA主机把信传送出去!不过要注意,MTA会将信件送给目的地的MTA而不是目的地的MUA。不要搞错了!

MDA: (Mail Delivery Agent)“邮件投递代理”主要的功能就是将MTA接收的信件依照信件的流向(送到哪里)将该信件放置到本机账户下的邮件文件中(收件箱),或者再经由MTA将信件送到下个MTA。如果信件的流向是到本机,这个邮件代理的功能就不只是将由MTA传来的邮件放置到每个用户的收件箱,它还可以具有邮件过滤(filtering)与其他相关功能。

Mailbox:“收件箱”,说穿了就是主机上一个目录下某个人专用来接收信件的文件!举个例子,系统管理员root在默认情况下会有个信箱,默认的文件就是/var/spool/mail/root文件(每个账号都会有一个自己的信箱),然后,当MTA收到root的信时,就会将该信件存到/var/spool/mail/root文件中,用户可以通过程序将这个文件里的信件数据读取出来。

原理:

发信的步骤:

Step 1 用户利用MUA寄信到MTA。通常我们使用MUA(例如Outlook express)写信时,要写明几个项:
发信人与发信网站:必须有这个信息。发信网站就是下面Step 2接收信件的那个MTA;
收信人与收信网站:以
account@e-mail.server 的形式给出,其中,account就是该e-mail.server里的账号。      在图20-1左上角的那台机器上,也就是“本地客户端使用的电脑”,利用MUA功能(如Outlook express)写好信之后,按下MUA的“发送”按钮,MUA就会依据你所定义的主机地址将信发送到MTA上。
Step 2 MTA收到信件,交由MDA发送到该账号的MailBox中。如果在Step 1收到的信件中,那个e-mail.server就是MTA自己,此时MTA会将该信件交由MDA处理,将信件放置在收信者的信箱中。
Step 3 MTA将信再转送出去。如果由Step 1发来的信件的收件人并不是MTA的内部账号,那么该信将被再次转送出去!Step 1及Step 3的动作,我们也称为Relay(邮件转发)功能。
Step 4 远程MTA收到本地MTA发出的邮件。远程MTA会收到我们这台MTA的信件,并将该信件交给它的MDA处理(Step 5),此时,信件会存放在远程MTA上,等待用户登录读取或下载。

NewImage

 

收信的步骤:

远程用户使用的计算机直接连接到它的MTA,向MTA请求查看自己的收件箱是否有信件,而MTA通过MDA去检查,如果有 信件,就会将它传送给用户的MUA,同时,根据MUA的不同设置,MTA会选择将该信件从收件箱清除或继续保留!若继续保留,那么下次用户再次接收信件 时,保留的信件会再次被下载,因此,通常用户MUA都是默认删除MTA的收件箱中的内容。

NewImage

 

正式配置:

采用的方案:MTA(esmtp,fetchmail)、MUA(mutt)、MDA(procmail)

esmtp的简单配置:

vi .esmtprc,添加以下内容:

identity kpshare@163.com     #此项一定要有,否则会运行错误,网上有些参考资料就没有写此项
hostname smtp.163.com:25     #端口号一定要写
username "kpshare"
password "******"
mda="/usr/bin/procmail -d %T"

完成后chmod 600 ~/.esmtprc

如果有多个帐号可以继续按模版添加。

fetchmail的简单配置:

vi .fetchmailrc,添加以下内容:

poll pop.163.com          #收件服务器地址
proto pop3                #收件服务器协议
uidl                      #只下载新的邮件
username "kpshare"        #用户名
password "******"         #密码,在*号里输入邮箱密码

完成后chmod 600 .fetchmailrc     #一定要改权限,否则无法使用

配置好后,用fetchmail -a 命令来尝试收取邮件。

mutt的简单配置:

vi .muttrc,添加以下内容:
set sendmail = "/usr/bin/esmtp -v -X ~/.esmtplog"    #指定esmtp发送邮件
set fast_reply = yes            #在回复邮件的时候,不用自己输入地址和标题
set folder = ~/Mail             #邮件存放目录
set include = yes               #回信时是否包含原文
my_hdr From: kpshare<kpshare@163.com>            #这俩行一定要写,否则你的信件会以
my_hdr Reply-To: kpshare<kpshare@163.com>        #root@localhost这样的地址发送出去,

procmail的简单配置:

# 设置邮件存放目录,处理从Fetchmail转发过来的邮件
# 更多细节可参考man和文末参考资料

LOGFILE=$HOME/procmail.log
MAILDIR=$HOME/Mail

:0
* .*
default

 

最终测试:

echo "xxxx" |mutt -s "test" negatlov@xxx.com -a /home/negatlvo/xxxx.pdf

fetchmail -v

mutt

 

ps:

.muttrc config file


#编辑器 直接在 Mutt 的终端里使用非图形界面的 Emacs (emacs -nw)
set editor="emacs -nw"

#设置邮件发送程序
set sendmail="/usr/bin/msmtp"

#建立信箱
set folder="~/mail"
set mbox="~/mail/inbox/"
set mbox_type=maildir
set spoolfile="~/mail/inbox/"
set postponed="~/mail/postponed"
set record="~/mail/sent"

# 让mutt监视下面几个邮箱,并随时报告新邮件
mailboxes "+inbox"
mailboxes "+ags"
mailboxes "+rockwell"
mailboxes "+gmail"

set check_new = yes
set timeout = 600

#set alternates="xxx@mail.ustc.edu.cn" 
#这是一个格式字符串,用来控制你的index的列表显示。它的缺省定义是

set index_format="%4C %Z %{%b %d} %-15.15L (%4l) %s"
#指定你有那些信箱文件。当你按 "c" 切换信箱时,再按 Tab 键,这些信箱就可供你选择
#mailboxes Mailbox sent-mail 
#这是一个 bool 型变量。它表明你在回信时引用原文是否加入原文的邮件头。
set header=no 
#可以设置为 yes, no, ask-yes, 或者 ask-no. 这是说,当你按q退出时,是否提示你(ask-yes,ask-no),
#还是直接就退出了(yes),还是根本不理你(no)。
set quit=ask-yes
#html类型的附件是允许直接通过 .mailcap 浏览的?
#doc类型的附件通过wvware转成html 浏览
auto_view text/html application/msword
# " "(空): 表示这封邮件的 To: 和 Cc: Bcc: 都没有你的地址,很多垃圾邮件都有这个特征。
# +: 表示你是收件人(To: 是你的地址之一),而且是唯一的收件人。
# T: 表示你是收件人(To: 包括了你的地址之一),但是你不是唯一的收件人。这是一封群体信件。
# C: 表示你的地址出现在 CC:,但是你不是唯一的被抄送的人。
# F: 表示这封邮件是你发出去的。
# L: 表示这是一封你已经加入的邮件列表寄来的。

#这也是一个提示性变量。它是确定当你退出时,是否提示你把信件从 spool 移动到的 mbox 文件。
set move=no
#当 Mutt 用 thread 方式显示时,是否用纯 ascii 表示树状列表。
set ascii_chars=yes
#回信时是否包含原文。
set include
#回信的引文之前插入那个符号?
set indent_str="> "
#设置你自己的邮件头。
my_hdr From: shine_zhong@ags.com
#打分
#新信件+4分,主题包含“通知”的+2,主题包含 “Circulation” +3, 已经标记删除的 -5,上次没有读的 +1,包含 “believe”的 -10(垃圾广告!)。
score "~N" +4
score "~s 通知" +2
score "~s Circulation" +3
score "~D" -5
score "~O" +1
score "~s believe" -10
#排序方式。
set sort=score
#当用 thread 排序方式时,我们对各个 thread 的相对排序顺序。
set sort_aux=date
#如果翻到最后,再按往下翻也不会翻到下一封信件
set pager_stop
#如果设置,当你按 "r" 回信时,就不会再提示你输入回信地址和主题,直接进入编辑模式。
set fast_reply
#当你按 "t" 或者 "D" 之类的标记操作时,是否自动把光标移动到下一封信件。
set resolve=yes
#地址簿
source ~/.mutt.alias
#当你在 index 里按 "a" 为来信者取别名时,使用哪一个别名文件保存这个别名。
set alias_file=/home/lixuebai/.mutt.alias
#你发出的邮件保存到那个信箱文件?比如可以像我这样每个月发出的信件放在不同的文件里。
set record="~/mail/=sent-mail-`date +%Y-%m`"
#你的终端支持哪一种编码的显示?这个必须和你的终端编码一样。推荐用utf8
set charset="utf8"
#send_charset
set send_charset="us-ascii:iso-8859-1:gb2312:utf-8"
#外部程序退出时,是否要求用户按一个键才返回。这在察看某些shell命令输出时是比要的,
#否则它们一下就消失了。
set wait_key=yes
#当你要把信件存到另一个信箱,而这个信箱已经存在时,是否提示附加?
set noconfirmappend
#是否把邮件头也放在编辑器里可以修改?
set edit_headers=no
#当你在用 pager 看信件时,在 index 留出多少行显示邮件列表?
set pager_index_lines=4
#告诉 Mutt 你已经订阅了那些邮件列表(mailing-list).
#subscribe fvwm@fvwm.org

#mutt显示日期为中文
set locale="zh_CN"
#有些没有设置字符编码时
charset-hook ^us-ascii$ gb2312
#Chinaren 等服务器发出来的信件使用了 quoted-printable 的 subject,
#而且设置编码为 "iso8859-1",这显然是错误的。
#对付这个错误的办法是把 iso-8859-1 变成 gb2312 的别名
charset-hook ^iso-8859-1$ gb2312
# evolution 发过来的 subject 为 utf-8 编码的邮件标题乱码!
#那就把不是 utf-8 的编码都映射到 gb2312
charset-hook !utf-8 gb2312

# mutt进行pop3收信,当然之前要查看$ mutt -v 编辑情况的确编辑了pop3了。
# 以后进入mutt按G就可以收信了。
#set pop_user=xxx@mail.ustc.edu.cn
#set pop_pass="xxxxxx"
#set pop_host=202.38.64.8
#现在不用mutt直接收信了。

#把mutt发送的from域作为sendmail发送邮件的sender(否则会用user@localdomian)
set envelope_from=yes

macro index G "!getmail\n" "Invoke getmail"
macro pager G "!getmail\n" "Invoke getmail"




Mutt处理Html附件
首先需要安装lynx,aptitude install lynx 配置 ~/.mailcap
text/html; lynx --dump %s; nametemplate=%s.html; copiousoutput
在 ~/.muttrc 加入:
auto_view text/html
Mutt处理Doc附件
需要安装wv, aptitude install wv 配置 ~/.mailcap
application/msword; wvHtml --charset=gb2312 %s - | lynx --dump -stdin; nametemplate=%s.html; copiousoutput
在~/.muttrc中加入
auto_view text/html application/mswordp
.procmailrc config file


PATH=/bin:/sbin:/usr/bin:/usr/sbin
SHELL=/bin/bash
MAILDIR=$HOME/mail
DEFAULT=$MAILDIR/inbox/
LOGFILE=$MAILDIR/.procmaillog

:0
* ^From:.*@ags.com
ags/

:0
* ^From:.*@ra.rockwell.com
rockwell/

:0
* ^From:.*@gmail.com 
gmail/

:0  #最后的这个配置就是指如果上面分类剩下的信件全扔到inbox里
* .* 
inbox/

# 黑名单(垃圾邮件)
#:0:
#* ^From.*badguy
#/dev/null

 

2层交换设备是如何分割冲突域的_beta1

主要的机制:2层交换机内部维护一个过滤表,类似于3层设备维护一个路由表。

原理:

交换机的每个接口是个冲突域。我们可以用2层交换机将局域网分割为不同的网段(例如A、B网段)。
A网段有台主机向B网段某台主机发送数据。则先ARP全网广播,交换机A接口收到帧,发现MAC地址为广播地址,则将帧广播 到相邻的全网段上。B网段上某台主机收到消息后还回一条帧消息,将自己的MAC地址发送给A网段的主机。在这个过程中,交换机收到B网段主机的帧后,查询自己的过滤表,看有没有目的MAC地址(即A中主机地址)。如果有,则帧就只会发送到A网段(这里是肯定有的,因为前一步广播的时候已经确认了),这种技术叫做透明桥接;如果没有,就会转发帧到所有相邻网段上,待目的主机反应后,根据收到的帧地址来更新过滤表。

通过这种透明桥接的技术很好的分割了冲突域,2个不同网段间主机通信就不会影响除此外其它网段的主机。

资料:

当帧通过网络传输时.网桥和交换机会读取每一帧。第 2层 设各会在过滤表中放入源 硬件地址,并跟踪帧被哪一个端口接收。这种信息(记录在网桥或交换机的过滤表屮)能够 帮助机器决定特定发送设备的位置。

在第2层设各中,当过滤表被创建之后,它只将帧转发到目的硬件地址所指定的网段。 如果日的没备与帧在同一个网段上,第 2层 设各将封锁帧,不让它被转发到任何其他网段 上。如果目的地与帧在不同的网段 H,帧 就只被转发到那个网段c这 种技术被称为II透明桥 接”。

当交换机接口收到带目的硬件地址的帧,rl且在交换机的过滤表中找不到这个口的硬 件地址时.它将把该帧转发到所有相连的网段上。如果发送 ̈神秘帧”的末知设备响应这个 转发行动.交换机就更新其过滤表,添加对此没各的定位:但 如果发送的帧的目的地址为广 播地址,默认时交换机将转发昕有的广播到相连的每个网段 卜:

利用软路由验证了下静态路由表

背景:Mac OS X 10.6.7 、 VMware Fusion 3

路由系统:海蜘蛛v8 免费版

实验平台setup步骤:

1  给OS X系统添加一块虚拟网卡(loopback)供软路由桥接用(贴图麻烦,在网络偏好中设置)。

2  设置VMware。 随意创建个linux适用的虚拟机,注意内存设置别太小200M左右。硬盘(设成IDE最好)大小可以只用100M。多添加几块虚拟网卡,其中有块桥接到上一步设置的loopback网卡,其他的网卡可以只选为host-only。

NewImage

3  安装海蜘蛛路由操作系统,注意最后ip配置的时候要保证和你设置的loopback网卡在同一网段。例如笔者给loopback网卡ip设为192.168.2.3/24,安装海蜘蛛后配置的ip为192.168.2.4/24。

4  完成后打开browser, 输入192.168.2.4:880即可进入海蜘蛛登入界面:

NewImage

5  默认帐号密码都为admin,进入路由操作界面后。接下来绑定网卡,给其它两个接口设置任意你想测试的ip地址。笔者设置了192.168.10.1和192.169.2.1。

NewImage

6  在OS X中添加静态路由项:
开启terminal后 输入 sudo route add 192.168.10.0/24 192.168.2.4  和 sudo route add 192.169.2.0/24 192.168.2.4。
完成后输入ping 192.168.10.1 和 ping 192.169.2.1都能通畅。

 

--EOF--

LFS & FHS.学习

虽然已经完成LFS的编译,但是关于LFS的学习还没到位,暂时不去探索BLFS了。而且关于FHS也并未完全弄明白记住。

接下来打算学习LFS结合FHS来研究整个LFS系统,目前先看VTC关于Ubuntu Server的视频教程。晚点加入笔记~

一些有用的command line.(会保持更新~)

1. bchunk
转换bin文件to iso文件:
linux/unix下有个bchunk命令,利用bin, cue文件转换为iso。
示例:bchunk -v 1.bin 1.cue 1.iso

2. sync
将内存中内容更新保存到硬盘中,shutdown, reboot命令默认执行该操作~

 

 

完成LFS的安装

很累人的个事情,在第一次编译LFS失败的情况下,再接再厉终于完成在OS X下Vmware Fusion平台下的LFS 6.8。

现在知道其实第一次编译败在了最后的内核编译上,内核一直失败来说,加上当时用的lvm文件系统,搞的有点麻烦。 最后狠心下来认真重新来过,终于搞定~

遇到问题与解决:

Q1: Glibc-2.13在第二次编译的时候,测试过程中出现[/sources/glibc-build/rt/tst-cpuclock2.out] Error 1 错误提示。

A1: 原因很简单,swap空间不足,其实有1G 的说。 
建立一个512M空白文件(dd if=/dev/zero of=/home/swap bs=1024 count=512000) ,将其加载为swap分区(mkswap /home/swap),激活分区(swapon /home/swap)。 可以用free -m查看当前内存和分区大小。

Q2:  没有编译网卡驱动。

A2: 在内核编译过程中,关于选择驱动的问题,发现了一个比较好的方法。 cp 宿主系统boot目录下的config文件,然后利用make menuconfig生成一个最基本的.config文件,都导出,并利用对比工具 对比分析。 其中一个很好的os x下的对比工具就是Changes了,很不错。 另外,在宿主系统中运行lspci -v命令,可以查看详细的当前加载的驱动模块,利用搜索功能搜索config文件,确保每个驱动都得到选择。

 

 

补充:

内核删除方法:
删除该新内核的步骤如下: (1)、修改/etc/grub/menu.lst ,删除那些不想要的内核选项。 (2)、删除 /lib/modules/相对应的内核版本的目录 (3)、删除 /boot/相对应的内核版本的文件

charset and encoding理解

在学习TeX的基础东西,但是今天看font的时候关于encoding到底是神马彻底的无语。于是有了仔细学习下的想法。现在有所得,在此总结和记录下。

 

主要参考文章:
http://blog.csdn.net/zhh157/archive/2008/11/08/3249260.aspx

 

个人总结:

关于TextEdit程序读取文本文件的时候涉及有关charset和encoding的步骤猜想:

1 在电脑中以二进制形式存储的文本文件;

2 TextEdit读取此文件,将1010数据通过相应的上下文(这里是以utf-8encoding为例)理解。

3 更具一个简单的算法,提取出对应于uincode charset的字符序号(为了区分编码,用序号代替,例如0x7E就表示的是字符‘z’。)

4 根据该序号,在font文件中找到该字形图像(根据参考文章所说,font文件中也包含一个unicode编码索引),然后显示出来。

 

为了验证前面3个步骤,做了点小实验,以Unicode(UTF-8)为例:

1 输入字符 ‘我’,存储为utf-8编码格式,文件名为:u8.txt
NewImage 2 用HexFriend工具打开该文件,显示如图:
NewImage
该16进制数转为二进制为:1110 0110 _ 1000 1000 _ 1001 0001。根据参考文章中所描述的规则,可以确定其所表示的相应的unicode字符编码(字符集中的字符序号)为:0110 0010 0001 0001(6411)。

3 现在我们做相反的事情:我们查到符号NewImage对应的unicode编码为:U+25CE。其中25CE转换为二进制为:0010 0101 1100 1110。为了能够使这个符号在TextEdit中显示出来,我们在此必须转成ut8编码机制能识别的二进制,得到:1110 0010 1001 0111 1000 1110(E2978E)。

4 我们将E2978E输入到HexFriend中并保存。
NewImage

5 刷新TextEdit,可以得到如下结果:
NewImage

 

6 ok, 完工。其实可以举一反三, ascii编码,GBk编码(想对应的GBK字符集)啥的,都可以 实验的。 UTF-16编码的话文件会以0xFFFE开始哦~~。

 

 

 

PS: 欢迎反馈错误~

 

Applescript--实现窗口平铺

这段代码花的时间较长。虽然功能没问题,但是代码结构很乱。算beta1版吧,之后applescript系统学习后在补充点功能,完善下代码。

 

以下代码供参考,支持错误修正与建议。 可以举一反三实现窗口左右,上下移动等等。

set front_app to (path to frontmost application as Unicode text)

tell application front_app

activate

if (count document) is equal to 0 then

set win_num to count window

else

set win_num to count document

end if

--count numbers of window

(*

--保存原窗口配置

set win_save to {}

repeat with a from 1 to win_num

set b to get bounds of window a

set win_save to win_save & {b}

end repeat

*)

set sqr_win_num to win_num ^ 0.5

if (sqr_win_num mod 1) is equal to 0 then

set y_num to sqr_win_num

set x_num to y_num

else

set y_num to sqr_win_num div 1

set x_num to y_num + 1

repeat while win_num is greater than (x_num * y_num)

set x_num to x_num + 1

end repeat

end if

set bounds of window 1 to {0, 0, 1280, 800}

set max_win_size to get bounds of window 1

set x_l_point to item 1 of max_win_size

set x_r_point to item 3 of max_win_size

set y_u_point to item 2 of max_win_size

set y_d_point to item 4 of max_win_size

set x_win_size to x_r_point - x_l_point

set y_win_size to y_d_point - y_u_point

--get each small window's size

set each_x_win_size to x_win_size / x_num

set each_y_win_size to y_win_size / y_num

-- set tmp to 0

set all to 0

repeat with j from 1 to y_num

repeat with i from 1 to x_num

set b to i - 1

set c to j - 1

set all to (all + 1)

set bounds of window all to {(x_l_point + b * each_x_win_size), (y_u_point + c * each_y_win_size), each_x_win_size * i, y_u_point + each_y_win_size * j}

end repeat

end repeat

--activate window 3

-->set bounds of window 1 to {x_l_point, y_u_point, , 700}

(*

repeat with a from 1 to win_num

set b to item a of win_save

set bounds of window a to b

end repeat

*)

end tell

Applescript--实现桌面的隐藏

 

tell application "Finder"
 -- insert actions
 set desktop_folder to folder "Desktop" of home

 set item_count to count item in desktop_folder
 if item_count is greater than 0 then

 do shell script "chflags hidden ~/Desktop/*"
 else
 
 do shell script "chflags nohidden ~/Desktop/*"
 end if
end tell
很简单的代码,但是applescript不熟悉,结果很是花了点时间。