2008年12月30日星期二

emacs outline

outline 有 major-mode 和 minor-mode 两种
一般major-mode,很少应用.通常我们用c-mode,lisp 等作为主模式, outline作为 minor-mode 来使用
默认的minor-mode 下的命令前缀 C-c @ ,比较傻,可做如下设置

(setq outline-minor-mode-prefix [(control o)])
(global-set-key [(meta o)] 'open-line)

可以挂到其他主模式下使用
(add-hook 'php-mode-hook
'(lambda ()
(c-set-style "Stroustrup")
(outline-minor-mode "t")))



sublevels ( C-c @ C-q.
This collapses the whole tree, showing only the topmost heading lines. Given a numeric prefix, this command shows deeply nested sublevels. M-3 C-c @ C-q thus shows the top most heading lines and two more levels of heading lines.

body ( C-c @ C-t.
This hides all the body lines of the document--that is, showing only the heading lines. This is a very convenient way to get an overview of the whole document.

other ( C-c @ C-o.
This hides everything except the body lines in which point is located and the branches above it. The body lines of the branches above the line with point are also hidden. Note this does not seem to work in GNU Emacs 20.


Hide--Subtree

entry ( C-c @ C-c.
This hides the body lines of the given headline, but not its subbranches.

leaves ( C-c @ C-l.
This hides all the body lines of the subtree rooted in the given headline, but not the branches. This is equivalent to hide body described previously, but only for the given subtree.

subtree ( C-c @ C-d.
This hides all body lines and branches in the subtree located at the given headline.


Show--Whole Document

all ( C-c @ C-a.
This shows the whole tree. That is, it unfolds anything hidden by any of the outline functions.


Show--Subtree

entry ( C-c @ C-e.
This shows the body lines of the given headline. That is, neither the branches nor any of their content.

children ( C-c @ C-i.
This shows the immediate branches of this headline. Section heading lines will be shown for a chapter, but subsections, subsubsections, and body lines are not shown.

branches ( C-c @ C-k.
This shows all branches in the subtree for the given headline.

subtree ( C-c @ C-s.
This shows the whole subtree for the given headline. That is, all heading lines and body lines below the given headline.

emacs 配置编写顺序问题

(setq load-path
(cons "~/Configurations"
(cons "~/Extensions" load-path)))
(load "macros") ;;宏定义文件
(load "modes")
(load "extensions");; 扩展配置
(load "emacs-std") ;; 标准配置
(load "bindings") ;; 绑定键
(setq outline-minor-mode-prefix [(control o)])

扩展配置放到了标准配置之前, 可今天遇到一个灵异问题 (setq outline-minor-mode-prefix [(control o)]),怎么都无效. 无奈之下 采用分段测试发, 一段段执行 找到问题...

在配置中有调用 org-mode(放在extensions.el中), (setq outline-minor-mode-prefix [(control o)]) 放在加载org-mode 之前有效而置后无效. 究其原因是因为 org-mode 是以outline-mode 为基础扩展的. 具体细节不得而知

需要重新思考 配置的加载顺序 是否要将 emacs-std 加载 拉到前边去

2008年12月29日星期一

基于Sphinx+MySQL全文检索架构设计(转)

原文:http://blog.s135.com/read.php/360.htm
参考:http://blog.s135.com/post/385.htm
前言:

本文阐述的是一款经过生产环境检验的千万级数据全文检索(搜索引擎)架构。本文只列出前几章的内容节选,不提供全文内容。

在DELL PowerEdge 6850服务器(四颗64 位Inter Xeon MP 7110N处理器 / 8GB内存)、RedHat AS4 Linux操作系统、MySQL 5.1.26、MyISAM存储引擎、key_buffer=1024M环境下实测,单表1000万条记录的数据量(这张MySQL表拥有int、datetime、varchar、text等类型的10多个字段,只有主键,无其它索引),用主键(PRIMARY KEY)作为WHERE条件进行SQL查询,速度非常之快,只耗费0.01秒。

出自俄罗斯的开源全文搜索引擎软件 Sphinx ,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

基于以上几点,我设计出了这套搜索引擎架构。在生产环境运行了一周,效果非常不错。有时间我会专为配合Sphinx搜索引擎,开发一个逻辑简单、速度快、占用内存低、非表锁的MySQL存储引擎插件,用来代替MyISAM引擎,以解决MyISAM存储引擎在频繁更新操作时的锁表延迟问题。另外,分布式搜索技术上已无任何问题。

一、搜索引擎架构设计:

1、搜索引擎架构图:



2、搜索引擎架构设计思路:

(1)、调用方式最简化:

-----------------------------
补充:
亿级数据的高并发通用搜索引擎架构设计[原创] http://blog.s135.com/post/385.htm

尽量方便前端Web工程师,只需要一条简单的SQL语句“SELECT ... FROM myisam_table JOIN sphinx_table ON (sphinx_table.sphinx_id=myisam_table.id) WHERE query='...';”即可实现高效搜索。

(2)、创建索引、查询速度快:

①、Sphinx Search 是由俄罗斯人Andrew Aksyonoff 开发的高性能全文搜索软件包,在GPL与商业协议双许可协议下发行。

Sphinx的特征:

Sphinx支持高速建立索引(可达10MB/秒,而Lucene建立索引的速度是1.8MB/秒)
高性能搜索(在2-4 GB的文本上搜索,平均0.1秒内获得结果)
高扩展性(实测最高可对100GB的文本建立索引,单一索引可包含1亿条记录)
支持分布式检索
支持基于短语和基于统计的复合结果排序机制
支持任意数量的文件字段(数值属性或全文检索属性)
支持不同的搜索模式(“完全匹配”,“短语匹配”和“任一匹配”)
支持作为Mysql的存储引擎
②、通过国外《High Performance MySQL》专家组的测试可以看出,根据主键进行查询的类似“SELECT ... FROM ... WHERE id = ...”的SQL语句(其中id为PRIMARY KEY),每秒钟能够处理10000次以上的查询,而普通的SELECT查询每秒只能处理几十次到几百次:



③、Sphinx不负责文本字段的存储。假设将数据库的id、date、title、body字段,用sphinx建立搜索索引。根据关键字、时间、类别、范围等信息查询一下sphinx,sphinx只会将查询结果的ID号等非文本信息告诉我们。要显示title、body等信息,还需要根据此ID号去查询MySQL数据库,或者从Memcachedb等其他的存储中取得。安装SphinxSE作为MySQL的存储引擎,将MySQL与Sphinx结合起来,是一种便捷的方法。

创建一张Sphinx类型表,将MyISAM表的主键ID和Sphinx表的ID作一个JOIN联合查询。这样,对于MyISAM表来所,只相当于一个WHERE id=...的主键查询,WHERE后的条件都交给Sphinx去处理,可以充分发挥两者的优势,实现高速搜索查询。

(3)、按服务类型进行分离:

为了保证数据的一致性,我在配置Sphinx读取索引源的MySQL数据库时,进行了锁表。Sphinx读取索引源的过程会耗费一定时间,由于MyISAM存储引擎的读锁和写锁是互斥的,为了避免写操作被长时间阻塞,导致数据库同步落后跟不上,我将提供“搜索查询服务”的和提供“索引源服务”的MySQL数据库进行了分开。监听3306端口的MySQL提供“搜索查询服务”,监听3406端口的MySQL提供“索引源服务”。

(4)、“主索引+增量索引”更新方式:

一般网站的特征:信息发布较为频繁;刚发布完的信息被编辑、修改的可能性大;两天以前的老帖变动性较小。

基于这个特征,我设计了Sphinx主索引和增量索引。对于前天17:00之前的记录建立主索引,每天凌晨自动重建一次主索引;对于前天17:00之后到当前最新的记录,间隔3分钟自动重建一次增量索引。

(5)、“Ext3文件系统+tmpfs内存文件系统”相结合:

为了避免每3分钟重建增量索引导致磁盘IO较重,从而引起系统负载上升,我将主索引文件创建在磁盘,增量索引文件创建在tmpfs内存文件系统“/dev/shm/”内。“/dev/shm/”内的文件全部驻留在内存中,读写速度非常快。但是,重启服务器会导致“/dev/shm/”内的文件丢失,针对这个问题,我会在服务器开机时自动创建“/dev/shm/”内目录结构和Sphinx增量索引。

(6)、中文分词词库:

我根据“百度早期中文分词库”+“搜狗拼音输入法细胞词库”+“LibMMSeg高频字库”+... 综合整理成一份中文分词词库,出于某些考虑暂不提供。你可以使用LibMMSeg自带的中文分词词库。

2008年12月28日星期日

smarty 学习

一周断断续续的, 终于将smarty.class.php 余 smarty 编译器 没看. 看完就可以写语法分析的东东了. 这个还是后置吧.

2008年12月25日星期四

smarty 调试方法

这两天看smarty代码有所得
对于smarty 调试有三种方法
1.$smarty->debugging=true
2.$smarty->debugging_ctrl = 'URL'; URL表示当关键词SMARTY_DEBUG出现在QUERY_STRING(查询字符串)中时,针对此脚本的调用,调试被启动 例如 http://127.0.0.1/test.php?SMARTY_DEBUG
3.第二种的扩展
$smarty->debugging_ctrl = 'URL'; 在QUERY_STRING 里加入 SMARTY_DEBUG=on 调试开启,加入SMARTY_DEBUG=off. 它的实现方法为 在cookie 做个标记

桌面快捷 偷懒大法

launch + hotkey magic

狗屁同学聚会

狗屁同学聚会,打开封尘的记忆 一起yy,那倒是人生不错的美事. 可世俗的世界给人以打击, 攀比 炫耀 虚伪 和 更加虚伪的舞台,每每 举措无措的与大堆似熟非熟的面孔 大吹特吹 反过头来又心怀愧疚,tmd 又不知道扯了些啥
三两昔日好友小聚 畅谈 小酌 才够惬意...

系统构架学习计划

1. smarty 学习 看完 余 smarty complie以后再看
2. 缓存学习
3. make 学习

2008年12月23日星期二

emacs 下tab 变空格

    By default, Emacs inserts tabs in place of multiple spaces when it formats a region. (For example, you might indent many lines of text all at once with the indent-region command.) Tabs look fine on a terminal or with ordinary printing, but they produce badly indented output when you use TeX or Texinfo since TeX ignores tabs.

The following turns off Indent Tabs mode:

;;; Prevent Extraneous Tabs
(setq-default indent-tabs-mode nil)
Note that this line uses setq-default rather than the setq command that we have seen before. The setq-default command sets values only in buffers that do not have their own local values for the variable.

在php下我想按此进行设置..

照方抓药,通常来讲 (setq-default indent-tabs-mode nil), 这样设置就ok.
按此方法,依然无效. 仔细看过以前的配置, 原来是以前 抄来的配置中的问题
(defun my-c-common-hook()
(setq tab-width 4)
(define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key c++-mode-map "\C-ce" 'c-comment-edit)
;; (setq c++-auto-hungry-initial-state 'none)
(setq c++-delete-function 'backward-delete-char)
(setq c++-tab-always-indent t)
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq compile-command "make"))
(add-hook 'c-mode-common-hook 'my-c-common-hook)

php-mode 是依赖c-mode-common-hook 的, 在上段配置中的设置如下 (setq tab-width 4),按照默认 tab是生效的,把 (setq-default indent-tabs-mode nil) 给覆盖了. 因此在php-mode 下依然失效. 改为 (setq tab-width 4 indent-tabs-mode nil) 一切ok

2008年12月18日星期四

转载:科学家证实,巧妙加入第3个选项可左右人们决定

转载: http://blog.sina.com.cn/s/blog_514cf21c0100bkob.html

印度网站昨天刊出一篇由印度裔科学家在美国所做的研究成果,引用一篇在《Journal of Marketing Research》行销专业期刊的报导。行销的一个基本范例称为「吸引力效应」(attraction effect,注意,和「吸引力法则」并无关连),只是从前从未以实验来证明过。

科学家找来一群志愿者,给他们几样东西做选择,并同时用fMRI脑部扫描,看看他们脑部的状况。在第一阶段的实验里,科学家先给他们看A物、B物两个东西,两个都差不多好,难以决定,科学家硬就要他们二者选一,这时候,科学家发现这些人的脑部出现异常活动,有一个叫「amygdala」的部位呈现出「受惊扰」 (irritation)的模样,这个区块是脑部掌管负面情绪的部位,也就是说,当这两个「差不多」的物品到了实验者面前,叫他作一个选择,这位实验者在考虑的过程中,会感到焦躁、不安,在好多个因素中层层抽丝剥茧,试图揪抽出A、B之中较佳的那个选择。发布帖子

有趣的是,这个困境远比想像中还要容易解决。到了第二阶段实验,科学家只要再给他们「第三样东西」,暂且称为「C物」。这个C物和刚刚的B物很相似,但明显的比B还「烂」。这时候,这位实验者一次要在A、B、C中选一,应该「更烦躁」才对不是吗?两个都选不完了,更何况多了第三个!奇妙的是,在C出现后,有如「拯救」了大脑,他们脑中同区块的那些惊扰的运动竟然就无缘无故的消失了。实验者也在这时候表情自在的,做出了他们的决定。

那个决定,正是B物!

刚刚的A物竟被无缘无故的丢弃了。

科学家将这奇妙的「第三个选项」C物,直接称为「诱饵」(decoy),它存在的目的,只是要诱发这个人对先前两个选项的其中一个。换句话说,若善用这个「C物」,就能巧秒的左右别人的决定!

行销最厉害的,就是改变人的动作,这也是最好玩的地方。我们平常不见得要卖产品才要改变人的动作,许多时候,我们或许想改变自己,或者想改变朋友、改变老板、改变同事…都可以用这个可怕的招术。其实,像这样有趣的「选择」境况,在行销学中,共有三种已知的效应:

一种叫「相似效应」(Similarity Effect),当你有两双鞋,一双尖头,一双平头,难以选择,这时候,若再给你一双也还不错的平头鞋,大脑会将两双平头鞋混成「同一个选项」,突然间,你选早先那双平头鞋的机率会「减半」,由新的平头鞋来瓜分。

第二种叫「妥协效应」(compromise effect),当你眼前有两双鞋,一双尖头,一双平头,难以选择。这时候突然出现一双材质和刚刚两双差不多的新鞋,不过它的头是介于尖头和平头之间,假设也蛮好看的,那你的大脑会自动将尖头与平头全部归类成「极端」,你的大脑会自动叫你尽量选一个不极端,也就是新的。

第三种则正是现在刚介绍的、经过科学实验证明的「吸引效应」(attraction effect)。

你比较这三种效应,就知道为何「吸引效应」会这么的有意思!因为,它是这三种效应中唯一能改变你现在的两个选项的,所以可以导入一些策略。现在科学家更证实吸引力效应的威力,的确让大脑「立刻决定」,这是人类大脑难得的一个「大漏洞」,大家可以好好的思考,如何在适当时机运用!

举个例子,你想帮一个女性朋友牵红线,介绍某位男士认识一下,这位朋友有学问、有涵养,是个很不错的家伙,但这女生呢,听说目前同时也刚认识一位「听说」是帅帅、高高、壮壮的超级型男,两位男士都在追求这位热门美女,怎么办?这时候,你约这名女生出来,再介绍另外一名同样是有点学问、有点涵养,但就显然比A君还更逊一点的家伙。这个动作,很有可能马上让这名女生转而选择你这个眼镜男!

再举个比较邪恶的例子,今天你在和某一个同事抢升迁,你是女生,他是男生;你的学经历尚资浅但能言善道、工作能力强,那个男生经验丰富、业界人脉广。好,现在你可以想办法「推荐」一个和自己同质性很高,同样是能言善道、工作能力强,但比你更资浅了五年,且说话与工作都没有你强,这样工作了半年后,很有可能下一个拿到升迁机会的!

人性的漏洞除了这些外还有很多,适度的科学研究,让某些人有如得到强大武器。多知道一点,永远比少知道的好。

2008年12月17日星期三

smarty 插件

对于smarty 的几种不同插件 我一直都有混淆
前两日, 有个需求. 用smarty 直接在php setting里取值,并作为判断依据. 因为概念混淆,绕了些弯路,先后用了四种方法

在我的概念里  smarty是无法嵌套的, 因此首先是通过<{getconfg var="kk" value="point.policy"}> 从系统中将 poing.policy 变量取出赋值给 $kk, 然后再<{if $kk...}>...<{/if}>.

1. compiler 插件
      缺点: 1)编译型插件,必须先 删掉编译文件,不适合软件升级  2)编译型的优先级高于template function 类型的插件.
      因为编译型插件的选择, 不爽. 之后找到了解决办法 $smarty->_tpl_vars[$k], 这么简单的就解决了
     缺点: 必须先赋值, 然后才能使用.  不能够直接在 <{if ..}>..<{/if}>中使用
3.将smarty 作为积累的扩展方法
      采用第二种方法后, 舒服了不少, 可还是不爽. 于是想在  内置的 if  标签上做文章
      在smarty 类中有
    var $security_settings  = array(
                                    'PHP_HANDLING'    => false,
                                    'IF_FUNCS'        => array('array', 'list',
                                                               'isset', 'empty',
                                                               'count', 'sizeof',
                                                               'in_array', 'is_array',
                                                               'true', 'false', 'null'),
                                    'INCLUDE_ANY'     => false,
                                    'PHP_TAGS'        => false,
                                    'MODIFIER_FUNCS'  => array('count'),
                                    'ALLOW_CONSTANTS'  => false
                                   );
   IF_FUNCS 是smarty 所支持的能够在 if 中使用的函数.  在IF_FUNCS 加入一个函数 getconf
   就可以这样用了  <{if getconf("fdf")==1}>  

   缺点: 非常规做法,乖乖的
4. modifier 
   有兄弟提醒  modifier 是可以在 if 标签里套用的, md 圈子绕大了
   这样就解决了<{if $kk|getconf eq 1}>



    

2008年12月15日星期一

js mootools 小问题一记

test

function test(obj){
obj = $(obj);
}

当将this 传递到函数时, 需要显性的将dom对象 转换成mootools 对象, 否则会在ie6的情况下报错. ie7 firefox 正常

js sort 问题

sort函数, 一定要返回三个状态 0 -1 1... 否则会出错. 有一些js文档言之 只返回一个状态和两个状态是错误的 会出问题的
divs.sort(function($1,$2){
    var _$1=$E('input[name^=num[]',$1).value.toInt(),
    _$2=$E('input[name^=num[]',$2).value.toInt();
    if(_$1>_$2)return 1;
    if(_$1<_$2)return -1
    if(_$1==_$2)return 0;
});

2008年12月13日星期六

emacs 文件对比 合并

M-x ediff-buffers
M-x ediff-files
M-x ediff-windows-linewise

比对模式
?  帮助
n 跳到下一处不同
p 跳到上一处不同
4j 跳到第4处不同
a/b copy A/B's region to B/A
ra/rb 如果你觉得之前的修改有问题可以 restore 一下 A/B
! 重新刷新
## You might often want to skip the diffs that contain only differences in the number of white spaces. To do this, press ## (two hash marks). Emacs then simply skips these regions
v 向下翻页
V 向上翻页

有一个很强大的应用,是在使用svn时, 你修改了一个文件. 突然发现有点问题, 想与修改改的代码做一个本地的比对.
这个时候可以应用 ediff-files A文件对应 有问题的文件, B文件对应 A文件所在目录下./svn/text-base/[A文件名].svn-base
------------------------------------------------
ediff-buffers3 and ediff-files3 同时比对3文件
ca 拷贝c处的变更到A处
------------------------------------------------
Merging Files
M-x ediff-merge-buffers
M-x ediff-merge-files
用法跟 文件比较差不多,
+ 将两边差异合并
r 恢复
------------------------------------------------
多文件merge
M-x ediff-directories
M-x ediff-directories3
M-x ediff-merge-directories

会将所有文件的异同做个列表
M 回到列表上去

这个功能可以用在 公司和家里边的 configure 文件的同步上
------------------------------------------------
M-x eregistry This brings you to a buffer called *Ediff Registry* 查看当前所有的 Ediff
session

2008年12月11日星期四

每个人都很寂寞

      都有自己的无奈 自己的忐忑,只是处理的方式 发泄的形态不同而已. 心灵孤岛

sed 替换tab

一位仁兄的做法:
$ cat tab.txt 
col1    col2    col3
i am big.
col1 col2 col3

1.2sed脚本
$ cat sedscr.tab 
s/      />/gp

1.3sed替换命令
$sed -nf sedscr.tab tab.txt 
col1>col2>col3
好一点的办法是:
c-v-tab 直接在终端上打出tab 符   
应该还有其他解决方案:
貌似\t 才是正解    来天测一下
------------------------------------------------------
后续:2008-12-14
在o'reilly sed and awk 书详细介绍了sed awk所支持的正则表达式
[:alnum:] Printable characters (includes whitespace) [:alpha:] Alphabetic characters [:blank:] Space and tab characters [:cntrl:] Control characters [:digit:] Numeric characters [:graph:] Printable and visible (non-space) characters [:lower:] Lowercase characters [:print:] Alphanumeric characters [:punct:] Punctuation characters [:space:] Whitespace characters [:upper:] Uppercase characters [:xdigit:] Hexadecimal digits

emacs下实用搜索命令

emacs 具有强大的搜索功能:
常用的有
1. 文件内搜索可以用 rgrep lgrep
2. dired mode 搜索文件可以用  find-dired, 很强大 但需要自己写参数
The most general command in this series is M-x find-dired, which lets you specify any condition that find can test. It takes two minibuffer arguments, directory and find-args; it runs find in directory, passing find-args to tell find what condition to test. To use this command, you need to know how to use find.
3.find-grep  通过 find grep 进行搜索,帮你拼好 常用的命令行,自己添参数
4.find-library   mmd 以前还傻乐吧唧的自己找lisp library中的el 文件. 靠一个find-library 要什么来什么 不亦乐乎
5.其余的有待研究

rgrep lgrep 比较傻之外 其余都要自己 添写参数. 也便于熟悉一下 find  和 grep 的用法. 免得学了忘 忘了再学的兜圈子

第二阶段 工作重点

时间上放到 2009年 3月份开始,之前 加紧学习emacs 并初涉elisp
elisp 学习入门 http://learn.tsinghua.edu.cn:8080/2005211356/elispintro/HelloWorld.html
还需要一本好书 暂订 elisp manul http://www.gnu.org/software/emacs/manual/elisp.html

之后语言如下, 具体时间另行计划
1. c++
2. python
3.lisp
4.erlang Erlang 程序设计

2008年12月10日星期三

清华的emacs 氛围

       有感于emacs强劲的学术气息. 
       一些经典的艰深的叙述感极强的技术都有一批人在研究,形成了一定范围的圈子,他们之间或许并不熟识,或许仅仅是仰慕 或者互相敬佩的关系. 却通过个人的博客在做着学术上的传承. 
       近来发现搜索中文emacs资料已经不再是很困难的事情,从中学到了很多技巧...  但毕竟中文资料还相当有限. 进一步的学习还是一样要啃 e 文了

2008年12月9日星期二

2008.12.10 需整理学习item

language:
erlang 了解一下
mysql:
http://www.jianzhaoyang.com/database/mysql_join_buffer_nested_loop_implement
http://www.jianzhaoyang.com/database/mysql_group_by_implement

emacs ibuffer

       自以为是
       ibuffer 是个我一直忽略掉的模式 ,虽然每天都在用, 但也不过略用皮毛而已. 
       今天突然想把所有 php 的文件标志出来, 并一切删除.  本打算用 宏来小试身手 却始终不够方便. 随意的 c-h m 看了下帮助, 才知道她的强大,  小看她了
       有点小感悟想写写,  未避免雷同 google 一下, 想写的已被人写的详尽, 那不如借他山之石以攻玉了
      Emacs中Ibuffer.el的使用 http://www.0-dong.com/blog/rewrite.php/read-473.html

补充:
     1.   所有ibuffer模式下的功能氛围  5大类
          +  在标记的buffer上的操作
          + 标记命令                 
          + 过滤命令
          + 过滤组命令
          + 其他命令   
   2.  / / 删除 所有过滤器..   这个很常用
        / a   +  [saved filters]
   3.  求人不如求己, 不会用了 c-h m 一下, 才是最方便的

我的地盘我做主

      这里将作为我的垃圾场 宣泄地. 畅所欲言  无所顾忌 胡说八道 的乐土

抓图工具 hyperSnap

有时候自己有点小白, 除了系统键的抓屏, 居然没有一款顺手的抓图工具, 也好让自己写blog时, 可以秀一下 emacs什么的....
hyperSnap 貌似比较强 比较傻, 先用起来

短期 技术规划

emacs
研究 svn 及插件
pgsql

2008年12月8日星期一

emacs hi-lock-mode

有些小中意的玩意. 可以在emacs 中 指点江山, 把需要的文字打上不同的颜色.  很是方便

1. 使用方法:

M-x hi-lock-mode 就可以启动这个mode,随后呢, C-x w h REGEXP FACE 就可以指定一个正则表达式(REGEXP),和一个颜色(FACE)来高亮显示之。


emacs 23.1 特性冻结

考虑安排时间 小玩一下. 再计划 真正实际使用

emacs 中显示todo

(defun task-list() 
(interactive) 
(occur "TODO"))

批量去掉bom头

windows下 find ./core -type f -name "*.php" -exec sed -i '1s/^\xef\xbb\xbf//' {} ;
linux 下 find ./core -type f -name "*.php" -exec sed -i '1s/^\xef\xbb\xbf//' {}  \;
bsd 下的sed比较奇怪 需要研究一下. 
bsd7.0下测试正常

emacs macro

emacs 宏,专干脏活累活 重复性的劳动

C-x ( (start-kbd-macro) to tell Emacs to start recording your macro.
C-x ) (end-kbd-macro) to tell Emacs to stop recording the macro.
C-x e (call-last-kbd-macro).
1. 记录宏开始用 c-x ( 记录结束用 c-x ) . 执行用c-x e ,执行一遍 c-u 10 c-x e 执行10遍.
2. 在一个范围内应用宏用 M-x sams-apply-macro-on-region .
3. 为宏起名 用 M-x name-last-kbd-macro
4. 将宏插入到一个地方用 M-x insert-kbd-macro. 通常可以专门建立一个 macros.el 专门存放 宏. 在.emacs中 (load "macros") 就成了

sams-apply-macro-on-region 在 sams-lib.el 中

可以绑定在适合自己的快捷上
(global-set-key [(shift f9)] 'sams-apply-macro-on-region)
(global-set-key [(shift f1)] 'call-last-kbd-macro)
(global-set-key [(shift f2)] 'name-last-kbd-macro)
(global-set-key [(control f2)] 'insert-kbd-macro)

进阶:
C-x q (kbd-macro-query) 使macro暂停,在当前位置提示确认是否继续
C-u C-x q. 直接中断macro ,如要继续按 C-M-c.... 录制完宏后 使用时也是这般...

M-x edit-kbd-macro 编辑特定的宏
1. c-x e 编辑最近设定的宏
2. M-x 按照为宏所设置的名称查找, 并编辑
3. C-h-l This lets you use the latest 100 keystrokes as the macro. When you save your editing, it is saved as the macro available through C-x e. (按照字面理解没有啥意思 未深究)

Mysql配置的优化方法

mysql如果是默认配置,肯定发挥不到最好。针对MySQL的原理,数据库安装后针对MyISAM引擎的配置应注意以下几项:

key_buffer_size -- 这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%。当然这是纯数据库服务器的较理想设置。key_buffer_size合理的值取决于索引大小、数据量以及负载,一般数据库里所有的.MYI的大小和就是应该设置的buffer大小。根据实际情况也可以不需要设置非常精确。 key_buffer_size的值最大4G。同时MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。另外如果.MYI 文件值的和只有 1GB,而 key_buffer 却设置为 4GB 的实在太浪费了。如果你很少使用MyISAM表,那么也应保留默认的key_buffer_size 以适应给予磁盘的临时表索引所需。通过系统状态变量可以查看当前buffer是否合理使用。如Key_reads /Key_read_requests=1/1000左右最合适,至少要1/100以上。可用show status来观察这两个变量。

table_cache -- 因为数据库打开一个表的开销可能很大。例如MyISAM使用.MYI的文件头标志来表示该表正在使用中。这种操作太频繁肯定影响效率,所以通常要加大缓存数量,使得最大限度地缓存打开的表。这个配置需要用到操作系统的资源,比如内存,对当前的硬件配置来说当然不是什么问题了。如果你有200多个表的话,那么设置为 1024 也许比较合适(每个线程都需要打开表),如果连接数比较大那么就加大它的值。因为table_cache与max_connections有关。例如,对于200个并行运行的连接,应该让表的缓存至少有200 * N,这里N是执行查询的一个联接中表的最大数量。

thread_cache_size -- 线程的创建和销毁的开销可能很大,因为每个线程的连接/断开都需要。我通常至少设置为16。如果应用程序中有大量的跳跃并发连接并且status里面的 Threads_Created 的值也比较大,那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程,而用缓存来重新开启连接。1G->8 ;2G->16 3G->32(参考)

query_cache_size -- 如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通常设置为 32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,如果缓存命中率太低了,就启用它。Qcache_hits(表示sql查询在缓存中命中的累计次数)低,Qcache_lowmem_prunes(意味着很多缓存因为内存不够而被释放)和Qcache_not_cached(意味着没有用到缓存)高,就可以综合考虑加大它的值。

注意:就像你看到的上面这些全局表量,它们都是依据硬件配置以及不同的存储引擎而不同(以上主要针对MyISAM),但是session变量通常是根据不同的负载来设定的。如果你只有一些简单的查询,那么就无需增加 sort_buffer_size 的值了,尽管你有 64GB 的内存。搞不好也许会降低性能。sort_buffer_size默认2M。很少有人增加该值超过8M。除非有非常频繁,非常复杂的SQL排序语句。

Mysql建表和索引使用规范

Mysql建表和索引使用规范

一、 MySQL建表,字段需设置为非空,需设置字段默认值。

二、 MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。

三、 MySQL建表,如果字段等价于外键,应在该字段加索引。

四、 MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。

五、 MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段类型都可以索引,多列索引的属性最多15个。

六、 如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引,索引唯一值最高的索引。

七、 建立索引index(part1,part2,part3),相当于建立了 index(part1),index(part1,part2)和index(part1,part2,part3)三个索引。

八、 MySQL针对like语法必须如下格式才使用索引:

        SELECT * FROM t1     WHERE key_col LIKE 'ab%' ; 

九、 SELECT COUNT(*) 语法在没有where条件的语句中执行效率没有SELECT COUNT(col_name)快,但是在有where条件的语句中执行效率要快。

十、 在where条件中多个and的条件中,必须都是一个多列索引的key_part属性而且必须包含key_part1。各自单一索引的话,只使用遍历最少行的那个索引。

十一、 在where条件中多个or的条件中,每一个条件,都必须是一个有效索引。

十二、 ORDER BY 后面的条件必须是同一索引的属性,排序顺序必须一致(比如都是升序或都是降序)。

十三、 所有GROUP BY列引用同一索引的属性,并且索引必须是按顺序保存其关键字的。

十四、 JOIN 索引,所有匹配ON和where的字段应建立合适的索引。

十五、 对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。

十六、 定期ANALYZE TABLE tbl_name为扫描的表更新关键字分布 。

十七、 定期使用慢日志检查语句,执行explain,分析可能改进的索引。

十八、 条件允许的话,设置较大的key_buffer_size和query_cache_size的值(全局参数),和sort_buffer_size的值(session变量,建议不要超过4M)。


备注

主键的命名采用如下规则:

主键名用pk_开头,后面跟该主键所在的表名。主键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。主键名用小写的英文单词来表示。


外键的命名采用如下规则:

外键名用fk_开头,后面跟该外键所在的表名和对应的主表名(不含t_)。子表名和父表名自己用下划线(_)分隔。外键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。外键名用小写的英文单词来表示。


索引的命名采用如下规则:

1)索引名用小写的英文字母和数字表示。索引名的长度不能超过30个字符。

2)主键对应的索引和主键同名。

3)唯一性索引用uni_开头,后面跟表名。一般性索引用ind_开头,后面跟表名。

4)如果索引长度过长,可对表名进行缩写。缩写规则同表名的缩写规则

emacs perl编程设置

http://search.cpan.org/src/YEWENBIN/Emacs-PDE-0.2.16/lisp/doc/QuickStart.html

emacs 学习计划 加入新站(IDE)

http://www.ibm.com/developerworks/cn/aix/library/0811_yangbh_emacs2/
http://kyle.bloghome.cn/posts/180858.html                 Visual Studio tricks in Emacs
当前的emacs  还不适合c++ 的编写. 建立一个舒适的环境 需要花些时间在上面 

http header 研究

emacs abbrev 献给懒人的利器

      缩写模式

If you want the abbreviation to exist from one session to the next, you must insert the following line into your .emacs file:
(read-abbrev-file) 

When this line is in the .emacs file, abbreviations are loaded during startup of Emacs; when Emacs exits they are written. If you want the abbreviations to be saved as soon as they are defined, insert the following into your .emacs file:

(sams-write-abbrev-at-once) 

C-x a i g (inverse-add-global-abbrev)
C-x a i l (inverse-add-mode-abbrev
M-x edit-abbrevs   然后可以直接编辑 php-mode-abbrev-table 这一块

emacs info

    emacs 是个庞大的东东 入门者往往找不到头绪.
    其实它的自帮助系统已足够强大.
    基本的变量 函数 快捷键 查询的函数 可以 通过C-h ? 找到对应的方法
    常用的有:
    C-h-v  查询变量
    C-h-f   查询函数
    C-h-i   info(下文会详细叙述)
    C-h-k  查询快捷键
    C-h-l   显示最后应用的100 操作 快捷+按键
    C-h-?  所有帮助查询函数的列表
    C-h-m 当前主模式的快捷键帮助
   
    而最强大的莫过于它自身带的info模式, 里边有详细的emacs 手册和你新加的插件的一些 手册
If you press C-h i (info), you are taken to a whole new world of information. If you use a new Linux distribution, you can find info pages for most of the programs on your machine. Otherwise you can at least find information about Emacs.
C-h-i   进入info模式   如果感觉不会用 ,这时便可以应用上文所讲的 c-h-m 来看看在这个模式下如何玩
        M-x info-apropos      在info 中进行模糊搜索



   

2008年12月7日星期日

register

register 与bookmarks 混用,效果特佳. bookmarks 作为书签. 长久的习惯, register 属于临时性的享受跳跃的快感. 尤其是在想临时复制几个东西 到不同地点的时候, 可以应用 copy-to-register  insert-register
---------------------------------------------------------

Emacs中的register

在多个文件中逛的时候,我们常常需要快速切换到先前访问的某个位置。因此,我们需要把文件及其光标位置暂时存放在某个地方。

在Emacs中,我们可以使用register暂时性保存这些信息。

将当前光标所在位置保存入一个register中:

C-x r SPACE + register名(一个字符,比如a吧)
然后我们就可以到处瞎逛,若要回到保存的register a位置,我们可以输入:

C-x r j a
挺好用的吧:)

如果你记性和我一样不好,恐怕会常常想看看自己保存了哪些register,我们可以输入:

M-x view-register    查看某一个register
M-x list-registers   查看所有的register
其实我常用的就是以上功能,为了使笔记稍微完整一点,下面开始Copy 《GNU Emacs Manual》的相关章节:

在下面,我们使用r来命名所有的register:

Save Positions in Registers

C-x r SPC r
    Save position of point in register r (point-to-register). 
C-x r j r
    Jump to the position saved in register r (jump-to-register).
Saving Text in Registers

C-x r s r
    Copy region into register r (copy-to-register). 
C-x r i r
    Insert text from register r (insert-register). 
M-x append-to-register RET r
    Append region to text in register r. 
M-x prepend-to-register RET r
    Prepend region to text in register r.
Saving Rectangles in Registers

C-x r r r
    Copy the region-rectangle into register r (copy-rectangle-to-register). With numeric argument, delete it as well. 
C-x r i r
    Insert the rectangle stored in register r (if it contains a rectangle) (insert-register).
Saving Window Configurations in Registers

C-x r w r
    Save the state of the selected frame's windows in register r (window-configuration-to-register). 
C-x r f r
    Save the state of all frames, including all their windows, in register r (frame-configuration-to-register).
Keeping Numbers in Registers

C-u number C-x r n r
    Store number into register r (number-to-register). 
C-u number C-x r + r
    Increment the number in register r by number (increment-register). 
C-x r g r
    Insert the number from register r into the buffer.

bookmarks

C-x r m (bookmark-set)
C-x r b (bookmark-jump)
M-x (list-bookmarks)

bookmarks会自动保存在$HOME/.emacs.bmk, 这个地址是可以变更的. 详细请参见 info 内的相关说明

默认情况下bookmarks 只有当emacs 结束时才会保存. 如果你希望在更改bookmark 后及时生效,可进行如下设置
(setq bookmark-save-flag 1)

我的设置如下:
(global-set-key [(f8)] 'bookmark-jump)
(global-set-key [(shift f8)] 'bookmark-set)
(global-set-key [(control f8)] 'list-bookmarks)

2008年12月5日星期五

Linux中find命令-path -prune用法详解

Linux中find命令-path -prune用法详解

在Windows中可以在某些路径中查找文件,也可以设定不在某些路径中查找文件,下面用Linux中的find的命令结合其-path -prune参数来看看在Linux中怎么实现此功能。

假如在当前目录下查找文件,且当前目录下有很多文件及目录(多层目录),包括dir0、dir1和dir2 ...等目录及dir00、dir01...dir10、dir11...等子目录。

1. 在当前目录下查找所有txt后缀文件

    find ./ -name *.txt

2.在当前目录下的dir0目录及子目录下查找txt后缀文件

    find ./ -path './dir0*' -name *.txt

3.在当前目录下的dir0目录下的子目录dir00及其子目录下查找txt后缀文件

    find ./ -path '*dir00*' -name *.txt

4.在除dir0及子目录以外的目录下查找txt后缀文件

    find ./ -path './dir0*' -a -prune -o -name *.txt -print

说明:-a 应该是and的缩写,意思是逻辑运算符‘或’(&&); -o应该是or的缩写,意思是逻辑运算符‘与’(||), -not 表示非.

命令行的意思是:如果目录dir0存在(即-a左边为真),则求-prune的值,-prune 返回真,‘与’逻辑表达式为真(即-path './dir0*' -a -prune 为真),find命令将在除这个目录以外的目录下查找txt后缀文件并打印出来;如果目录dir0不存在(即-a左边为假),则不求值-prune ,‘与’逻辑表达式为假,则在当前目录下查找所有txt后缀文件。

5.在除dir0、dir1及子目录以外的目录下查找txt后缀文件

    find ./ \( -path './dir0*' -o -path './dir1*' \) -a -prune -o -name *.txt -print

注意:圆括号()表示表达式的结合。即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。由于命令行不能直接使用圆括号,所以需要用反斜杠'\'进行转意(即'\'转意字符使命令行认识圆括号)。同时注意'\(','\)'两边都需空格。

6.在dir0、dir1及子目录下查找txt后缀文件

    find ./ \( -path './dir0*' -o -path './dir1*' \) -a -name *.txt -print

-----------------------

另附一篇 转载自:http://www.liamdelahunty.com/tips/linux_find_exclude_multiple_directories.php

Linux Find Exclude Multiple Directories

find . -type d \( -name media -o -name images -o -name backups \) -prune -o -print

find . - Find all files in this directory (.)

-type d - directory or folder

-prune - ignore the proceding path of ...

\( -name media -o -name images -o -name backups \) - The -o simply means OR

-o -print - Then if no match print the results, (prune the directories and print the remaining results)

As always in Linux there are many ways to achieve the same result, and the patient may prefer to build up the find command using the path attribute. Please note that you may need to specify the path with a prefix of "./" and no trailing slash.

find . -path './media' -prune -o -path './images' -prune -o -path './backups' -prune -o -print

An important difference here is that the first command will prune ANY directory in the path that matches the name, such as './media' and './public/media', where as the second format will only prune the explict path './media'.


------

http://www.linuxsir.org/main/?q=node/137Linux文件查找命令find,xargs详述

1.重温 emacs 24 hours . 把有用的东西重拾一下

1.重温 emacs 24 hours . 把有用的东西重拾一下
2.重点学习一下这个blog 上的所有 emacs 技巧
迷惑中的 Kyle M. Lee http://kyle.bloghome.cn
http://infolab.stanford.edu/~manku/dotemacs.html
http://learn.tsinghua.edu.cn:8080/2005211356/stdlib/Ibuffer.html http://www.0-dong.com/blog/rewrite.php/read-473.html
http://docs.huihoo.com/homepage/shredderyin/emacs_elisp.html
http://learn.tsinghua.edu.cn:8080/2002315162/emacs_coding.html
http://blog.chinaunix.net/u1/50920/showart_410997.html
http://learn.tsinghua.edu.cn:8080/2005211356/emacs/wikisource/PerlProg.muse

3.使org 模式试用 与gtd...

emacs 文件搜索

一直都傻了, 通常用cscope 定位函数 类, 虽然写了生成cscope.files 的脚本, 但是必须按时执行才可以生成,在bsd 下可以通过 crontab 定期生成,但在windows下总要手动执行 烦不胜烦. 看来用grep 貌似是一个好的解决方案

转自:http://kyle.bloghome.cn/posts/181213.html

当偶厌倦了各个tag搜索工具的时候,发现grep才是偶的最爱。每每M-x grep RET输入一堆东西,才可以搜索到自己心仪的东东,确实麻烦。下面介绍下,在emacs中,各种grep相关的设置。如何可以让一位C++程序员比较方便的使用。

  • 基础命令设置

首先进入 Customize Group Grep 分组中,

名称数值说明
Grep Window Height14可以调整grep结果窗口的大小
Grep Commandgrep -rinH -e ../*设置grep的默认命令,使其默认从上一层目录开始递归搜索
Grep Find Commandfind ../* -iname "*.cpp" -type f -print0 | xargs -0 -e grep -nH -e从上一层目录开始递归搜索,所有cpp文件的内容,常用于搜索代码中被引用的变量或者函数
  • 高级命令用法

上面的只是一些雕虫小技。其实更好用的grep命令有如下几个。

命令使用简介特色说明
rgrepM-x rgrep RET后,首先输入的是需要搜索的内容,回车后,提示目标文件的类型,此时可以输入各个别名,比如ch,搜索所有的C++源码文件,随后输入的是搜索开始的目录。递归搜索目录中的内容,支持一些预定义的别名,比如ch表示所有的c++代码文件,hh表示所有的c++头文件等等。这个估计是写程序时,最好用的grep命令。
lgrepM-x lgrep RET后,提示内容与rgrep的都一样,唯一不同的是,lgrep只搜索当前指定目录中的内容,不会对子目录进行递归搜索。lgrep中的l应该是表示本层目录的(local)。对于在很大的,有很多子目录的文件夹中,只想搜索限定目录中,限定文件类型的时候,这个命令很方便。
igrepM-x igrep后,会自动根据当前所在文件的扩展名作为文件过滤条件(也可以修改),随后,会弹出UI提示选择目录(貌似在win32上,没有什么作用),一路回车,就可以搜索了。

emacs 专注模式

虽然emacs可以在一个窗口里工作的很好,可是否在某些情况下希望能够在一个不受干扰的独立窗口中打开某些文件,
这时可用到 专注frame.   例如某些帮助. 会让你很舒服 切换只需要用 c-x 5 o 就可以了

emacs 可以设置哪些文件可以定义为用专注窗口打开

(setq special-display-buffer-names '("*Help*" "*Apropos*"
                                     "*compilation*" "*grep*" "*igrep*")) 

  • sams-find-file-dedicated-frame, which asks for a filename, loads this file into a buffer, and shows this buffer in a dedicated frame.

  • sams-switch-buffer-dedicated-frame, which asks for a buffer name and loads this buffer into a dedicated frame.



自动调整 minibuffer大小

windows 环境下
(setq resize-mini-windows t)
之前应用 (setq resize-mini-windows t) 一直无效, 尚未确认此种写法是否应用于linux/unix 环境下

第五项修炼

《第五项修炼——学习型组织艺术与实务》

 

这是一本开拓性地倡导学习型组织管理思想的巨作。该书问世后不久,便以其革命性的创新获得了1992年世界企业学会最高荣誉的开拓者奖。同年,美国《商业周刊》将该书作者彼得·圣吉推崇为“当代最杰出的新管理大师”。

本书作者彼得·圣吉PeterM.Senge1947年出生于芝加哥,1970年于史丹福大学完成航空及太空工程学士学位后,进入麻省理工史隆管理学院读研究所,旋即被佛睿思特(JayForrester)教授的系统动力学整体动态搭配的管理新观念所吸引;1978年获得博士学位。彼得·圣吉在研究中发现,1970年名列美国《财富》杂志“500强”排行榜的大公司,到了20世纪80年代已有13销声匿迹。这些不寻常的现象引起了彼得·圣吉的思考。通过深入研究,他发现,是组织的智障妨碍了组织的学习和成长,并最终导致组织的衰败。组织智障,顾名思义,指的是组织或团体在学习及思维方面存在的障碍。这种障碍最明显地表现在:组织缺乏一种系统思考的能力。在思维中,人类总是习惯于将问题加以分解,把世界拆成片断来理解,但是无形中,我们付出了巨大的代价———全然失掉对整体的连属感。这个障碍对组织来说是致命的,许许多多的企业因此走向衰落。彼得·圣吉认为,要使企业茁壮成长,必须建立学习型组织,即将企业变成一种学习型的组织,以此来克服组织智障。至今十余年来,彼得·圣吉博士和麻省理工学院的一群工作伙伴及企业界人士,孜孜不倦地致力于将系统动力学与组织学习、创造原理、认知科学、群体深度对话与模拟演练游戏融合,发展出一种人类梦寐以求的组织蓝图,在其中,人们得以由工作中得出生命的意义、实现共同愿望的“学习型组织”。

  《第五项修炼——学习型组织艺术与实务》这部巨著便是他们研究成果的结晶。该书于1992年荣获世界企业学会(World Business Academy)最高荣誉的开拓者奖(PathfinderAward),以表彰其开拓管理新典范的卓越贡献。美国商业周刊也于同年推崇他为当代最杰出的新管理大师之一。美国《财富》杂志也由此认为,彼得·圣吉所致力探讨的管理科学新技术,是未来最具竞争力的管理技术,因为“学习型组织”概念的提出和一整套修炼单位的确立,使得整个管理范式已经发生了转移。由于其创新价值,并由于其已在无数美国企业中得到了成功的应用,如今愈来愈引起理论界及企业的浓厚兴趣,该书也被喻为“21世纪的管理圣经”。

目 录

 

序:一扇重新看世界的窗

序:伟大的时代先驱

中文版序:为人类找出一条新路

导读:再造组织的无限生机

第一部 全面体检你的组织

    第一章 重圆破镜

    第二章 你的组织有学习智障吗?

    第三章 从啤酒游戏看系统思考

第二部 新思考、新视野

    第四章 第五项修炼的微妙法则

    第五章 新眼睛看世界

    第六章 以简驭繁的智慧

附录 系统基模

    第七章 纵观全局掌握重点

    第八章 见树又见林的艺术

第三部 四项核心修炼

    第九章 自我超越

    第十章 心智模式

    第十一章 共同愿景

    第十二章 团体学习

第十三章 掌握修炼的进阶

第四部 进入学习时代

    第十四章 超越办公室政治

    第十五章 无为而为的有机管理

    第十六章 不再与时间为敌

    第十七章 工作与家庭之间

    第十八章 微世界:学习实验室巡礼

    第十九章 领导者新角色

第五部余响

    第二十章 第六项修炼?

第二十一章 重写思考法则

    第二十二章 不可分割的整体

2008年12月4日星期四

LANG,LC_ALL,local详解(转)

locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
2008-10-08 13:30
例如zh_CN.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白这些古里古怪的表达方式。这个外星表达式规定了什么东西呢?这个问题稍后详述,现在只需要知道,这是locale的表达方式就可以了。 

locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

[oracle@game ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
[oracle@game ~]$ 

locale把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是: 

1、语言符号及其分类(LC_CTYPE) 
2、数字(LC_NUMERIC) 
3、比较和排序习惯(LC_COLLATE) 
4、时间显示格式(LC_TIME) 
5、货币单位(LC_MONETARY) 
6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES) 
7、姓名书写方式(LC_NAME) 
8、地址书写方式(LC_ADDRESS) 
9、电话号码书写方式(LC_TELEPHONE) 
10、度量衡表达方式 (LC_MEASUREMENT) 
11、默认纸张尺寸大小(LC_PAPER) 
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。


所以说,locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据这几大类的习惯定义的,这些locale定义文件放在/usr/share/i18n/locales目录下面,例如en_US, zh_CN and de_DE@euro都是locale的定义文件,这些文件都是用文本格式书写的,你可以用写字板打开,看看里边的内容,当然出了有限的注释以外,大部分东西可能你都看不懂,因为是用的Unicode的字符索引方式。

[oracle@game ~]$ cd /usr/share/i18n/locales
[oracle@game locales]$ ls
aa_DJ        ar_YE       el_GR       es_ES       fr_CH           iso14651_t1 ne_NP       so_ET                  translit_hangul
aa_ER        az_AZ       el_GR@euro es_ES@euro fr_FR           it_CH        nl_BE       so_KE                  translit_narrow
aa_ER@saaho be_BY       en_AU       es_GT       fr_FR@euro      it_IT        nl_BE@euro so_SO                  translit_neutral
aa_ET        bg_BG       en_BW       es_HN       fr_LU           it_IT@euro   nl_NL       sq_AL                  translit_small
af_ZA        bn_BD       en_CA       es_MX       fr_LU@euro      iw_IL        nl_NL@euro sr_CS                  translit_wide
am_ET        bn_IN       en_DK       es_NI       ga_IE           ja_JP        nn_NO       st_ZA                  tr_TR
an_ES        br_FR       en_GB       es_PA       ga_IE@euro      ka_GE        no_NO       sv_FI                  tt_RU
ar_AE        br_FR@euro en_HK       es_PE       gd_GB           kk_KZ        oc_FR       sv_FI@euro             uk_UA
ar_BH        bs_BA       en_IE       es_PR       gez_ER          kl_GL        om_ET       sv_SE                  ur_PK
ar_DZ        byn_ER      en_IE@euro es_PY       gez_ER@abegede kn_IN        om_KE       ta_IN                  uz_UZ
ar_EG        ca_ES       en_IN       es_SV       gez_ET          ko_KR        pa_IN       te_IN                  uz_UZ@cyrillic
ar_IN        ca_ES@euro en_NZ       es_US       gez_ET@abegede kw_GB        pl_PL       tg_TJ                  vi_VN
ar_IQ        cs_CZ       en_PH       es_UY       gl_ES           lg_UG        POSIX       th_TH                  wa_BE
ar_JO        cy_GB       en_SG       es_VE       gl_ES@euro      lo_LA        pt_BR       ti_ER                  wa_BE@euro
ar_KW        da_DK       en_US       et_EE       gu_IN           lt_LT        pt_PT       ti_ET                  wal_ET
ar_LB        de_AT       en_ZA       eu_ES       gv_GB           lv_LV        pt_PT@euro tig_ER                 xh_ZA
ar_LY        de_AT@euro en_ZW       eu_ES@euro he_IL           mi_NZ        ro_RO       tl_PH                  yi_US
ar_MA        de_BE       es_AR       fa_IR       hi_IN           mk_MK        ru_RU       translit_circle        zh_CN
ar_OM        de_BE@euro es_BO       fi_FI       hr_HR           ml_IN        ru_UA       translit_cjk_compat    zh_HK
ar_QA        de_CH       es_CL       fi_FI@euro hu_HU           mn_MN        se_NO       translit_cjk_variants zh_SG
ar_SA        de_DE       es_CO       fo_FO       hy_AM           mr_IN        sid_ET      translit_combining     zh_TW
ar_SD        de_DE@euro es_CR       fr_BE       i18n            ms_MY        sk_SK       translit_compat        zu_ZA
ar_SY        de_LU       es_DO       fr_BE@euro id_ID           mt_MT        sl_SI       translit_font
ar_TN        de_LU@euro es_EC       fr_CA       is_IS           nb_NO        so_DJ       translit_fraction
[oracle@game locales]$ 

对于de_DE@euro的一点说明,@后边是修正项,也就是说你可以看到两个德国的locale:/usr/share/i18n/locales/de_DE@euro和/usr/share/i18n/locales/de_DE。打开这两个locale定义,你就会知道它们的差别在于de_DE@euro使用的是欧洲的排序、比较和缩进习惯,而de_DE用的是德国的标准习惯。 

上面我们说到了zh_CN.GB18030的前半部分,后半部分是什么呢?大部分Linux用户都知道是系统采用的字符集。 


zh_CN.GB2312到底是在说什么? Locale是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]。所以说呢,locale总是和一定的字符集相联系的。下面举几个例子: 

1、我说中文,身处中华人民共和国,使用国标2312字符集来表达字符。zh_CN.GB2312=中文_中华人民共和国+国标2312字符集。 

2、我说中文,身处中华人民共和国,使用国标18030字符集来表达字符。zh_CN.GB18030=中文_中华人民共和国+国标18030字符集。 

3、我说中文,身处中华人民共和国台湾省,使用国标Big5字符集来表达字符。zh_TW.BIG5=中文_台湾.大五码字符集 

4、我说英文,身处大不列颠,使用ISO-8859-1字符集来表达字符。 en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1字符集 

5、我说德语,身处德国,使用UTF-8字符集,习惯了欧洲风格。
de_DE.UTF-8@euro=德语_德国.UTF-8字符集@按照欧洲习惯加以修正,注意不是de_DE@euro.UTF-8,所以完全的locale表达方式是 [语言[_地域][.字符集] [@修正值]。 

其中,与中文输入关系最密切的就是LC_CTYPE,LC_CTYPE规定了系统内有效的字符以及这些字符的分类,诸如什么是大写字母,小写字母,大小写转换,标点符号、可打印字符和其他的字符属性等方面。而locale定 义zh_CN中最最重要的一项就是定义了汉字(Class“hanzi”)这一个大类,当然也是用Unicode描述的,这就让中文字符在Linux系统中成为合法的有效字符,而且不论它们是用什么字符集编码的。 

怎样设定locale呢? 

设定locale就是设定12大类的locale分类属性,即12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:LC_ALL > LC_* >LANG可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。 

1、如果你设定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG设定成什么值,它们都会被强制服从LC_ALL的设定,成为 zh_CN.UTF-8。 

2、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*=en_US.UTF-8,并且没有设定LC_ALL的话,那么系统的locale设定以LC_*=en_US.UTF-8。 

3、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*,和LC_ALL均未设定的话,系统会将LC_*设定成默认值,也就是LANG的值zh_CN.UTF-8。 

4、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_CTYPE=en_US.UTF-8,其他的LC_*,和LC_ALL均未设定的话,那么系统的locale设定将是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均会采用默认值,也就是 LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。 

所以,locale是这样设定的: 

1、如果你需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG=zh_CN.XXXX都可以,当然你可以两个都设定,但正如上面所讲,LC_ALL的值将覆盖所有其他的locale设定,不要作无用功。 

2、如果你只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定 LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX就可以了。这样LC_CTYPE=zh_CN.XXXX,而LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。 

3、假如你高兴的话,可以把12个LC_*一一设定成你需要的值,打造一个古灵精怪的系统: LC_CTYPE=zh_CN.GBK/GBK(使用中文编码内码GBK字符集); LC_NUMERIC=en_GB.ISO-8859-1(使用大不列颠的数字系统) LC_MEASUREMEN=de_DE@euro.ISO-8859-15(德国的度量衡使用ISO-8859-15字符集) 罗马的地址书写方式,美国的纸张设定……。估计没人这么干吧。 

4、假如你什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。


另外LANG和LANGUAGE有什么区别呢?

LANG - Specifies the default locale for all unset locale variables
LANGUAGE - Most programs use this for the language of its interface
LANGUAGE是设置应用程序的界面语言。而LANG是优先级很低的一个变量,它指定所有与locale有关的变量的默认值,

refer:http://blog.chinaunix.net/u2/60913/showart_1161340.html

2008年12月3日星期三

转:sambap配置

转载自:http://hi.baidu.com/hywangyc/blog/item/e1e7ae6469af0ef0f736548e.html
SAMBA服务器配置实例分析
2006年12月19日 星期二 15:24

实验一:配置带用户验证的共享目录
1、创建一个samba的共享目录,并将其权限设定为所有者、组用刻户和其他用户可对其进行读写::
#mkdir /samba
#ls -l
#chmod 777 /samb
2、修改/etc/samba/smb.conf配置文件
在[global]部分做如下修改:
security=user //如果是user,则通过windows访问将要求输入用户名与密码
encrypt passwdords=yes;如果默认是这样就不用改了。
smb passwd file = /etc/samba/smbpasswd(密码文件的位置)
在文件末尾添加如下内容:
[samba]
comment=This is my samba server;这是注释行,可以不写东西
path=/samba
read only=no
create mode=0664;这是文件权限
directory mode=0777;这是目录权限
3、创建一个samba用户[该用刻户在windows下有没有都无所谓]
#useradd smbuser
#passwd smbuser
然后创建samba帐户
#smbpasswd -a smbuser [-a必须加,为了生成密码文件smbpasswd],该密码是windows登陆Linux的smbuser用户密码
4、重新启动samba服务
#service smb restart
#pstree |grep smb;观察服务是否启动
5、进行测试
如果想从远程windows机器原“网上邻居”中访问/samba目录,就会要求输入用户名和密码。这里的用户是指上述第3步创建的samba用户当然也可以运行中输入
\\samba服务器ip地十进行访问

******************************************************************************************************************************
实验二:除了上述提到的设置外,进行目录共享时还可以有更多的选项。
如下:
[smb]
comment=This is the second samba
path=/smb
read only=no
create mode=0664
directory mode=0775
deny host=192.168.2.;拒绝所有2网段上的机器访问
allow host=192.168.2.11;允许这台机器访问
public=yes;连接时不需要用户名和密码,这和guest ok=yes等同,
这只应用于该目录,但如果把security=share,则会开放所有目录
browseable=no;禁止显示目录,相当于windows 2000下的隐藏目录
max connection=2;并发用户连接数

实验三:smbclient的使用
查看本机或者远程机器的共享情况
1、使用命令smbclient -L localhost杳看机共享情况:
#smbclient -L localhost
2、如果要在linux下访问windows下的共享资源,则使用命令:
#smbclient //192.168.1.100/share_dir -u administrator
如果成功则进入:smb:\>

实验四:smbmount的使用
#smbmount //win_ip/win_share /mnt/d -o username=administrator
将远程windows目录挂载到本地目录/mnt/d下

##############################################################################################################

Samba 服务器配置

以RedHat 8.0为例进行Samba 服务器配置:实现 windows98    windows2000    windowsxp    windowsme 与Linux系统在网络上的文件共享!
在安装RedHat 8.0系统后Samba 服务器软件包已经安装到你的系统中了,你可以直接使用!这里就不多说了

1.        建立想要共享的目录。如:/home/public     任何用户都可以进行读写操作
                           /home/software   任何用户只可以进行读操作
                           /home/support     目录只对指定用户可以访问
建立共享目录后要对目录进行系统权限的设定:
             chmod   777   public
                          chmod   777   software
                          chmod   777   support
2.        这一步是进行Samba系统文件的配置:/etc/samba/smb.conf
vi smb.conf  下面是smb.conf 文件的详细信息

[global]  这个段是控制整个samba服务器的参数
Netbios = linux  指定在windows网上邻居中显示的名字
Workgroup = workgroup  指定所属的工作组的名字,最好与windows系统在同一个工作组中,便于访问
Server string = %h Samba Server %v  指定本机的备注
hosts allow = 192.168.0.  192.168.1. 127.  指定允许访问samba的网段
guest account = nobody  访问都默认的登录用户,nobody 是系统自带的用户
Security = user  指定安全级别,一般用 user
encrypt passwords = yes  是否以加密的形式验证口令
smb passwd file = /etc/samba/smbpasswd  指定对samba 用户口令校验的密码文件


[homes]  当用户请求一个共享时,服务器将在存在的共享资源段中去寻找,如果找到匹配的共享资源段, 就使用这个共享资源段。如果找不到,就将请 求的共享名看成是用户的用户名,并在本地的 password文件里找这个用户,如果用户名存在且用户提供的密码是正确的,则以这个home段克隆出一个 共享提供给用户。这个新的共享的名称是用户的用户名,而不是homes,如果home段里没有指定共享路径,就把该用户的宿主目录 (home directory)作为共享路径。 

comment = weboa's home directories
browseable = no
writable = yes


[public]  在客房端显示的共享名
comment = public areas   注视
path = /home/public  指定共享的目录
browseable = yes  表示是否在浏览器中列出共享目录
guest ok = yes  以guest 用户身份访问
public = yes  是否允许公共访问
writable = yes  是否可以进行写操作,这里要提到的就是系统的目录权限永远大于samba设定的权限!这是设的是可写的权限,但这个目录权限是不可写的用户在访问的时候是不能写入的!


[software]
comment = software
path = /home/software
browseable = yes
guest ok =yes
public = yes
# writable = yes
read only = yes


[support]
comment = support
path = /home/software
valid users = userone usertwo userthree  指定可访问目录的用户名可以是多个用户
browseable = yes
public = no    不允许公共访问 
writable = yes


[cdrom] 
  comment = Server Cdrom 
  path = /mnt/cdrom 
  public = yes 
  browseable = yes 
  root preexec = /bin/mount -t iso9660 /dev/cd0 /mnt/cdrom 
  root postexec = /bin/umount /mnt/cdrom 


3.        建立samba用户
useradd userone
passwd userone    设置口令
smbpasswd -a userone  设置samba用户口令,最好与系统用户口令一样
4.启动samba服务器
 cd   /etc/rc.d/init.d/
  ./smb start    启动
  ./smb restart  重新启动
5.        Samba检测程序
Smbclient  -L  主机名
Testparm    自动查找配置文件中的错误  /etc/samba/smb.conf
Smbstatus   查看在线的用户

启动工作站的一台windows系统,在网上邻居里就可以看到 linux的机器了。
常见的问题:
a.        在win98中可以看到LINUX但击进入的时候要输入中令,b.        可是什么口令都提示口令错误!
98以上的系统默认的是以加密的形式发送口令,samba服务器必须以加密的形式接收口令。
要在[gloabl]中加入 encrypt passwords = yes

另一种可能就是,98在登录的时候要以要用samba用户的身份登录,这样访问的时候就不用输入口令了!
c.        在winxp 系统中进入samba服d.        务器一定有一个用户的身份进入,e.        否则不f.        能登录

好了,现在你可以从windows系统上登录samba了!

2008年12月2日星期二

jfs 小略

转:

JFS 概述

日志文件系统如何缩短系统重启时间

developerWorks
文档选项
将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送


级别: 初级

Steve Best (sbest@us.ibm.com)IBM

2000 年 1 月 01 日

如果发生系统崩溃,JFS 提供了快速文件系统重启。通过使用数据库日志技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态,而非日志文件系统却要花上几小时甚至几天才能完成。本白皮书对 JFS 体系结构作了概述,并且描述了可在 developerWorks 网站上找到的 JFS 技术的设计特性、潜在限制以及管理实用程序。

日志文件系统 (JFS) 提供了基于日志的字节级文件系统,该文件系统是为面向事务的高性能系统而开发的。它具有可伸缩性和健壮性,与非日志文件系统相比,它的优点是其快速重启能力:JFS 能够在几秒或几分钟内就把文件系统恢复到一致状态。

虽然 JFS 主要是为满足服务器(从单处理器系统到高级多处理器和群集系统)的高吞吐量和可靠性需求而设计的,JFS 还可用于想得到高性能和可靠性的客户机配置。

体系结构和设计

JFS 体系结构可从磁盘布局特性的角度进行说明。

逻辑卷 
所有文件系统讨论的基础是某种类型的逻辑卷。这可以是一个物理磁盘,或物理磁盘空间的某个子集,例如:一个 FDISK 分区。逻辑卷也称为磁盘分区。

聚集和文件集 
文件系统创建实用程序 mkfs,创建了完全包含在分区内的聚集。聚集是包含一种特定格式的磁盘块阵列,其格式包括超级块和分配映射表。超级块将分区标识成 JFS 聚集,而分配映射表描述聚集内每个数据块的分配状态。格式还包括描述它所必需的初始文件集和控制结构。文件集是可安装的实体。

文件、目录、inode 与寻址结构 
文件集包含文件和目录。文件和目录由 inode 持续表示;每个 inode 描述文件或目录的属性,并作为查找磁盘上文件或目录数据的起始点。JFS 还使用 inode 来表示其它文件系统对象,如描述文件集中每个 inode 的分配状态和磁盘位置的映射表。

目录将用户特定的名称映射到为文件和目录所分配的 inode 上,并且形成传统的命名层次。文件包含用户数据,用户数据中没有隐含任何限制或格式。也就是说,JFS 将用户数据看成是未解释的字节流。根植于 inode 基于盘区的寻址结构用来将文件数据映射到磁盘。聚集超级块和磁盘分配映射表、文件描述符和 inode 映射表、inode、目录以及寻址结构一起表示了 JFS 控制结构或元数据。

日志 
在每个聚集中维护 JFS 日志,并且用来记录元数据的操作信息。日志有一种同样由文件系统创建实用程序设置的格式。聚集内多个安装的文件集可以同时使用一个日志。





回页首


设计特性

JFS 从一开始就设计成完全集成了日志记录,而不是在现有文件系统上添加日志记录。JFS 的许多特性使之区别于其它文件系统。

日志处理 
JFS 提供了改进的结构化一致性和可恢复性,以及比非日志文件系统(例如:HPFS、ext2 和传统 UNIX 文件系统)快得多的系统重启时间。发生系统故障时非日志文件系统容易崩溃,是由于一个逻辑写文件操作通常占用多个媒体 I/O 来完成,且在任何给定时间,可能没有完全反映在媒体上。这些文件系统依靠重启实用程序(也就是 fsck),fsck 检查文件系统的所有元数据(例如:目录和磁盘寻址结构)以检测和修复结构完整性问题。这是一个耗时并且容易出错的过程,在最糟糕的情况下,它还可能丢失或放错数据。

相反,JFS 使用原来为数据库开发的技术,记录了文件系统元数据上执行的操作(即原子事务)信息。如果发生系统故障,可通过重放日志并对适当的事务应用日志记录,来使文件系统恢复到一致状态。由于重放实用程序只需检查文件系统最近活动所产生的运行记录,而不是检查所有文件系统的元数据,因此,与这种基于日志的方法相关的文件系统恢复时间要快得多。

基于日志恢复的其它几个方面也值得注意。首先,JFS 只记录元数据上的操作,因此,重放这些日志只能恢复文件系统中结构关系和资源分配状态的一致性。它没有记录文件数据,也没有将这些数据恢复到一致状态。因此,恢复后某些文件数据可能丢失或失效,对数据一致性有关键性需求的用户应该使用同步 I/O。

面对媒体出错,日志记录不是特别有效。特别地,在将日志或元数据写入磁盘的期间发生的 I/O 错误,意味着在系统崩溃后,要将文件系统恢复到一致状态,需要耗时并且有可能强加的全面完整性检查。这暗示着,坏块重定位是任何驻留在 JFS 下的存储管理器或设备的一个关键特性。

JFS 日志记录的语义如下:当涉及元数据更改的文件系统操作--例如,unlink()--返回成功执行的返回码时,操作的结果已经提交到文件系统,即使系统崩溃了也可以发现。例如,一旦成功删除了文件,即使系统崩溃然后重启,它仍然是删除的并且不会再重新出现。

日志记录风格将同步写入日志磁盘引入每个修改元数据的 inode 或 vfs 操作。(对数据库专家而言,这是一种使用非剥夺缓冲区策略的仅重做的、物理残留映象、提前写的日志记录协议。)在性能方面,与依赖(多个)谨慎的同步元数据写操作以获得一致性的许多非日志文件系统相比,这种方法较好。但是,与其它日志文件系统相比,它在性能上处于劣势。其它日志文件系统,如 Veritas VxFS 和 Transarc Episode,使用不同的日志风格并且缓慢地将日志数据写入磁盘。在执行多个并行操作的服务器环境中,通过将多个同步写操作组合成单一写操作的组提交来减少这种性能损失。JFS 日志记录风格随着时间推移而得到不断改进,现在提供了异步日志记录,异步日志记录提高了文件系统的性能。

基于盘区的寻址结构 
JFS 使用基于盘区的寻址结构,连同主动的块分配策略,产生紧凑、高效、可伸缩的结构,以将文件中的逻辑偏移量映射成磁盘上的物理地址。盘区是象一个单元那样分配给文件的相连块序列,可用一个由 <逻辑偏移量,长度,物理地址> 组成的三元组来描述。寻址结构是一棵 B+ 树,该树由盘区描述符(上面提到的三元组)填充,根在 inode 中,键为文件中的逻辑偏移量。

可变的块尺寸 
按文件系统分,JFS 支持 512、1024、2048 和 4096 字节的块尺寸,以允许用户根据应用环境优化空间利用率。较小的块尺寸减少了文件和目录中内部存储碎片的数量,空间利用率更高。但是,小块可能会增加路径长度,与使用大的块尺寸相比,小块的块分配活动可能更频繁发生。因为服务器系统通常主要考虑的是性能,而不是空间利用率,所以缺省块尺寸为 4096 字节。

动态磁盘 inode 分配 
JFS 按需为磁盘 inode 动态地分配空间,同时释放不再需要的空间。这一支持避开了在文件系统创建期间,为磁盘 inode 保留固定数量空间的传统方法,因此用户不再需要估计文件系统包含的文件和目录最大数目。另外,这一支持使磁盘 inode 与固定磁盘位置分离。

目录组织 
JFS 提供两种不同的目录组织。第一种组织用于小目录,并且在目录的 inode 内存储目录内容。这就不再需要不同的目录块 I/O,同时也不再需要分配不同的存储器。最多可有 8 个项可直接存储在 inode 中,这些项不包括自己(.)和父(..)目录项,这两个项存储在 inode 中不同的区域内。

第二种组织用于较大的目录,用按名字键控的 B+ 树表示每个目录。与传统无序的目录组织比较,它提供更快的目录查找、插入和删除能力。

稀疏和密集文件 
按文件系统分,JFS 既支持稀疏文件也支持密集文件。

稀疏文件允许把数据写到一个文件的任意位置,而不要将以前未写的中间文件块实例化。所报告的文件大小是已经写入的最高块位处,但是,在文件中任何给定块的实际分配,只有在该块进行写操作时才发生。例如,假设在一个指定为稀疏文件的文件系统中创建一个新文件。应用程序将数据块写到文件中第 100 块。尽管磁盘空间只分配了 1 块给它,JFS 将报告该文件的大小为 100 块。如果应用程序下一步读取文件的第 50 块,JFS 将返回填充了 0 的一个字节块。假设应用程序然后将一块数据写到该文件的第 50 块,JFS 仍然报告文件的大小为 100 块,而现在已经为它分配了两块磁盘空间。稀疏文件适合需要大的逻辑空间但只使用这个空间的一个(少量)子集的应用程序。

对于密集文件,将分配相当于文件大小的磁盘资源。在上例中,第一个写操作(将一块数据写到文件的第 100 块)将导致把 100 个块的磁盘空间分配给该文件。在任何已经隐式写入的块上进行读操作,JFS 将返回填充了 0 的字节块,正如稀疏文件的情况一样。





回页首


JFS 内部(潜在)限制

JFS 是完全 64 位的文件系统。所有 JFS 文件系统结构化字段都是 64 位大小。这允许 JFS 同时支持大文件和大分区。

文件系统大小 
JFS 支持的最小文件系统是 16M 字节。最大文件系统的大小是文件系统块尺寸和文件系统 元数据结构支持的最大块数两者的乘积。JFS 将支持最大文件长度是 512 万亿字节(TB)(块尺寸是 512 字节)到 4 千万亿字节(PB)(块尺寸是 4K 字节)

文件长度 
最大文件长度是主机支持的虚拟文件系统最大文件长度。例如:如果主机只支持 32 位,则这就限制了文件长度。

可移动媒体 
JFS 不支持把软盘作为基本文件系统设备。





回页首


标准管理实用程序

JFS 提供创建和维护文件系统的标准管理实用程序。

创建文件系统 
这个实用程序提供 mkfs 命令的 JFS 特定部分,用来在指定的驱动器上初始化 JFS 文件系统。该实用程序在较低级别上操作,并假设文件系统所存在的任何卷的创建/初始化由更高级别的另一个实用程序处理。

检查/修复文件系统 
这个实用程序提供 fsck 命令的 JFS 特定部分。该命令检查文件系统的一致性,修复发现的问题。它也重放日志,把提交的改动应用到文件系统元数据,如果由于日志重放而声明文件系统是干净的,就不会再采取进一步操作。如果文件系统不认为是干净的,这意味着由于某种原因没有完整和正确地重放日志,或者文件系统不能单靠重放日志来恢复到一致状态,那么,就对文件系统执行一遍完整检查。

当执行全部完整性检查时,检查/修复实用程序首要目的是要达到可靠的文件系统状态,以防止将来文件系统崩溃或故障,第二个目的就是面对崩溃时保存数据。这意味着为了达到文件系统的一致性,实用程序可能丢弃数据。具体而言,当实用程序在不做假设的情况下,无法获得所需信息以将结构上不一致的文件或目录恢复到一致状态时,就会废弃数据。当遇到不一致的文件或目录时,就废弃整个文件或目录,而不再试图保存任何部分。任何由删除受损目录所孤立起来的文件或子目录,都放在文件系统根下的 lost+found 目录中。

文件系统检查/修复实用程序重点考虑的因素之一是所需虚存数量。通常,这些实用程序所需的虚存数量由文件系统的大小决定,这是由于所需虚存主要用于跟踪文件系统中个别块的分配状态。随着文件系统增大,块的数量增多,用来跟踪这些块所需的虚存数量也随之增加。

JFS 检查/修复实用程序的设计区别在于其虚存需求由文件系统中文件和目录的数量(而不是由块的数量)所决定。对 JFS 检查/修复实用程序而言,每个文件或目录的虚存大约为每个文件或目录 32 字节,或者对于包含百万个文件和目录的文件系统而言,不论其文件系统大小,虚存需求都是大约 32 兆字节。如同所有其它的文件系统,JFS 实用程序需要跟踪块分配状态,但避免使用虚存方法,而是使用位于实际文件系统中的一小块保留工作区来实现。





回页首


结束语

因为在系统崩溃时,JFS 能提供快速文件系统重启时间,所以它是因特网文件服务器的关键技术。使用数据库日志处理技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态。而在非日志文件系统中,文件恢复可能花费几小时或几天。大部分文件服务器用户不能容忍与非日志文件系统相关的停机时间。只有通过转移到日志技术,这些文件系统才能避免需要检查文件系统的所有元数据才能验证文件系统或将其恢复到一致状态这一耗时的过程。



参考资料



关于作者

Steve Best 在德克萨斯州奥斯汀 IBM Software Solutions & Strategy Division 工作,是文件系统开发部门的成员之一。Steve 以前从事操作系统上文件系统、国际化以及安全性领域的开发。目前,Steve 正从事将 JFS 移植到 Linux 的工作。可通过 sbest@us.ibm.com 与他取得联系。