2006年04月26日

一,英语每天一小时,以唱片为主,《跟我学》。

二,毛笔字每天临摹各一篇,大字一篇,亦可一大一小两篇。

三,每日写日记一篇,一般百字,一周一篇五百字。

四,星期天读范文一篇,(一周背一篇),诗五首。

五,作业按时做,错题本两个(语文、算术)。

六,晨跑20分钟。

七,饭后散步半小时。

2006年03月13日

 一个在线的设计系统,选择喜欢的样式,并调整图形阵列参数,就可以完成一个独特的设计。打印出来折叠就得到一个时尚的包装盒了。站点地址

2006年02月08日

分页结果集是用于高效显示查询结果集的常用技术。最著名的例子或许就是 Google 搜索结果页面底部的“结果页码”。
在本方法文档中,您将学习如何使用 PHP 和 Oracle 实施分页结果集,以及用于显示大型数据集的高效技术。

分页结果集的必要性

基于 Web 的应用程序不像桌面 GUI 那样,当用户执行向上滚动或向下滚动操作时可以使结果游标在会话中保持打开状态,它们受到 HTTP 协议的无状态请求/响应生命周期的限制,也就是说,请求完成后,会话随即终止。此外,如果一次在 HTML 表中发送数千行信息,最终用户将明显受到影响 – 底层基础架构就更不用说了。

解决此问题的一个切实可行的方法就是为用户提供“页面”这一抽象概念,它为用户提供结果集中的相对位置。可以通过 URL 传递页码,从而保持 HTTP 的无状态性 – 这是 Rasmus Lerdorf 在他的文章“Do You PHP?”中所描述的不共享体系结构的重要部分。在服务器端,请求的页码映射为结果集中行的相应子序列,然后发布给用户。用于实施分页结果集的 Sample Data As 示例数据。在本方法文档中,您将使用 Feedster Top 500 Blog 数据,http://top500.feedster.com/top500.tab 提供了此数据,数据的格式易于分析。将该数据存储在下表中:

CREATE TABLE feedster_top_blogs (

rank NUMBER PRIMARY KEY,
name VARCHAR2(200),
url VARCHAR2(200),
links NUMBER
);

实施分页结果集将涉及应用程序的所有“层”。首先创建 SELECT 查询,该查询返回一个只包含给定页面的行的结果游标,从而最大限度地减少了 Web 与数据库服务器之间的通信量。您还需要在用户界面中提供“pager”来浏览结果集。最后,您需要编写一些将页码转换为结果集中的相应行号的逻辑。

用户界面

假设您要允许用户使用“页码”标识他们要查看的结果集部分。他们请求的页码将通过 URL(如 http://example.com/results.php?page=5)传递。该方法体现了无状态性 – 任何人只需通过输入正确的 URL 便可以将他们的浏览器指向“第 5 页”。当然,如果底层数据随时间而改变,那么针对任何给定页面显示的结果也将有所不同(请参见下面的读取一致性部分)。

同时,为帮助用户浏览结果集,您需要在显示中提供一个“pager”元素,用于提供到其他页面的链接。假设您要支持任意数量的页面(可能有很多页面),pager 元素需要将自身限制为一定数量的页面的“滑动窗口”,显示在在数据集中当前页面的两侧。这可以避免因显示过多的信息而为用户带来负担,并可以更加简便地在浏览器中控制布局。

在本示例中,您将在活动页面的两侧最多显示五个页面。除了“滑动窗口”以外,还将提供指向数据集第一页和最后一页的链接以及上一页和下一页的链接。

以下代码使用一个 PHP 函数来绘制 pager“组件”,可将任意 URL 传递给该函数,该函数将根据该 URL 输出包含链接(指向结果集中的页面)的 HTML:

<?php
function draw_pager($url, $total_pages, $current_page = 1) {
   
if ( $current_page <= 0 || $current_page > $total_pages ) {
$current_page = 1;
    }
   
if ( $current_page > 1 ) {
printf( "<a href=’$url?page=%d’>[Start]</a> \n" , 1);
printf( "<a href=’$url?page=%d’>[Prev]</a> \n" , ($current_page-1));
    }
   
for( $i = ($current_page-5); $i <= $current_page+5; $i++ ) {
       
if ($i < 1) continue;
if ( $i > $total_pages ) break;
       
if ( $i != $current_page ) {
printf( "<a href=’$url?page=%1\$d’>%1\$d</a> \n" , $i);
} else {
printf("<a href=’$url?page=%1\$d’><strong>%1\$d</strong></a> \n",$i);
        }
       
    }
   
if ( $current_page < $total_pages ) {
printf( "<a href=’$url?page=%d’>[Next]</a> \n" , ($current_page+1));
printf( "<a href=’$url?page=%d’>[End]</a> \n" , $total_pages);
    }
   
}
?>

如果在数据集总共包含 50 个页面并且当前页面为 15 的情况下调用此函数:
draw_pager(‘http://example.com/results.php’,50,15);

它将绘制以下 HTML:
<a href=’http://example.com/results.php?page=1′>[Start]</a>
<a href=’http://example.com/results.php?page=14′>[Prev]</a>
<a href=’http://example.com/results.php?page=10′>10</a>
<a href=’http://example.com/results.php?page=11′>11</a>
<a href=’http://example.com/results.php?page=12′>12</a>
<a href=’http://example.com/results.php?page=13′>13</a>
<a href=’http://example.com/results.php?page=14′>14</a>
<a href=’http://example.com/results.php?page=15′><strong>15</strong></a>
<a href=’http://example.com/results.php?page=16′>16</a>
<a href=’http://example.com/results.php?page=17′>17</a>
<a href=’http://example.com/results.php?page=18′>18</a>
<a href=’http://example.com/results.php?page=19′>19</a>
<a href=’http://example.com/results.php?page=20′>20</a>
<a href=’http://example.com/results.php?page=16′>[Next]</a>
<a href=’http://example.com/results.php?page=50′>[End]</a>

此 HTML 的作用将类似于 Amazon 的 A9 搜索页面。相比之下,Google 的实施通过 URL 传递起始行号(而非抽象页码),而“pager”采用另一种方式,即显示链接 1-10、11-20(依此类推),而非一组根据当前页面变化的页面。
以上的 draw_pager() 函数存在一个问题,即它无法巧妙地修改传递的 URL。如果要为它传递一个如下所示的基础 URL:

http://example.com/results.php?orderby=name

它将生成如下所示的 URL:

http://example.com/results.php?orderby=name?page=5

相反,它将生成如下所示的 URL(如果已经使用了一个现有的 GET 查询参数):

http://example.com/results.php?orderby=name&page=5

要解决此问题,您会发现 PHP 的 parse_url() 函数很有用。但切勿将 &page 附加到一个已经具有该参数并在将所有输入参数以 HTML 的形式输出之前对其进行验证或清除的 URL;否则,应用程序将受到 XSS 漏洞的威胁。

页面到行计算

在注意以上 pager 的同时,您现在需要进行两个计算:确定页面总数并将页码转换为行号。为此,您需要确定一个值来表示将在单个页面上显示的行数。(在更复杂的实施中,也可以允许用户更改该值。)

在决定每页的行数后,以下 PHP 函数 total_pages() 输出总页数:

function total_pages($total_rows, $rows_per_page) {
if ( $total_rows < 1 ) $total_rows = 1;
return ceil($total_rows/$rows_per_page);
}

总行数将为要分页的结果集中所有行的计数。对于本文的示例数据,您知道总行数正好为 500 行,但在行数已经更改的表中,您将需要查询数据库以获取该值。(请参见读取一致性部分。)您可能要向 total_pages() 中添加一个设置,即对要显示的最大页数设置限制。(请参见最大页数部分。)
要将给定的页码转换为结果集中的行号,可以使用以下函数:

function page_to_row($current_page, $rows_per_page) {
$start_row = ($current_page-1) * $rows_per_page + 1;
return $start_row;
}

它返回与 $current 页面相对应的结果集中的第一个行号。
读取一致性

根据前面介绍的 HTTP 和 Web 的无状态本质,此处假设数据集的分页显示是无状态的。也就是说,如果当用户正在浏览数据集时插入或删除了行或所做的更新更改了行的相对顺序,那么将出现不一致性,如行存在于多个页面中、数据已经在 HTTP 请求之间更改以及总页面数出现变化。

对于极少更改的数据集,这可能算不上是一个严重问题,因为用户很少注意到这样的不一致性。但对于易失的数据以及用户必须收到一致视图的情况而言,可以考虑使用定期的数据集“快照”(或许是通过 URL 传递其他“快照时间”。该方法使您可以保持无状态性,但在保存的数据数量和保存时间方面存在问题。

一个可选解决方案是使用用户会话存储数据集的静态副本,从而使数据集具有状态性。利用该方法,您可以为每个用户提供一致的视图,而不会使实施细节(如数据集的存在时间)为他们带来麻烦。同时,使用会话很容易产生存储问题,这是因为每个用户都在其会话存在期间获取各自的数据集副本 – 在用户数量很多的情况下,将出现问题。一个可以最大限度地降低存储要求的优化方法是假设大多数用户将只关注于数据集的前几个页面,因此只需要保留此数据。

将数据实际存储到什么位置将取决于特定的要求和环境,在某些情况下最简单的方法是序列化 PHP 数据结构或利用服务数据对象扩展,而在其他情况下则可以考虑使用多个表来保存快照。

通常情况下,应避免尝试采用有状态的方式实施数据集(除非绝对有必要这样做),这是因为这样做将增大应用程序逻辑的复杂性,使管理数据变得更困难并增大服务器在负载很高的情况下出现故障的风险。

行计数

在给定以上两个函数的情况下,您需要一个 SELECT 语句来确定整个结果集中的总行数,并需要另一个语句只返回当前页面的这些行。

要计算给定的 SELECT 语句将选择的行数,可以将该语句嵌套到其他对行进行计数的语句,如以下 PHP 函数所示:

function count_rows(& $conn, $select) {
$sql = "SELECT COUNT(*) AS num_rows FROM($select)";
$stmt = oci_parse($conn,$sql);
oci_define_by_name($stmt,"NUM_ROWS",$num_rows);
oci_execute($stmt);
oci_fetch($stmt);
return $num_rows;
}

但使用 COUNT 可能并不是一个有效的解决方案,这是因为仅当您迭带到最后一行时才能了解结果游标返回的总行数。换言之,该可选方法就是使用 SELECT 选择并遍历整个结果集,这样做的效率将低很多。
请注意 John Lim 在“优化 PHP 和 Oracle”中介绍的有关使用单独表通过 INSERT 和 DELETE 触发器跟踪总行数的提示。如果您知道数据不经常更改,则请使用另一个解决方案,即在短期内将结果缓存到 Web 服务器上。

count_rows() 的限制之一是它假设传递的 SELECT 语句不需要绑定任何参数。如果您需要绑定参数(尤其是那些将更改总行数的参数),则可以考虑对其进行扩展,方法是接受参数名称的散列作为 count_rows()(您将在调用 oci_bind_by_name 时对其进行遍历)的第三个参数。

您可能还需要让该函数限制返回给最大值的值以禁止分页到大结果集的结尾。(请参见下面的最大页数部分。)

注意,在某些设计中,如果您知道将要处理大量数据,则可以考虑忽略行计数逻辑。注意,您可以对可用的最大页数设置限制(请再次参见下面的最大页数),可以让上面的 count_rows() 为已知大于 50 页的数据集返回任意大的数字,同时为用户提供一个类似“Your search returned more than 50 pages of data”的消息。

获取数据集页面

要实际上使用 SELECT 选择特殊页面所需的行,可以使用类似的“SQL 包装”函数,例如:

function & paged_result(& $conn, $select, $start_row, $rows_per_page) {

$sql = "SELECT
            *
FROM
            (
SELECT
r.*, ROWNUM as row_number
FROM
( $select ) r
WHERE
ROWNUM <= :end_row
            )
WHERE :start_row <= row_number";
   
$stmt = oci_parse($conn,$sql);
   
oci_bind_by_name($stmt, ‘:start_row’, $start_row);
   
// Calculate the number of the last row in the page
$end_row = $start_row + $rows_per_page – 1;
oci_bind_by_name($stmt, ‘:end_row’, $end_row);
   
oci_execute($stmt);
   
// Prefetch the number of rows per page
oci_set_prefetch($stmt, $rows_per_page);
   
return $stmt;

}

注意此处的两个子 SELECT 语句。内部的子 SELECT 首先检索 $end_row 之前的所有行,而外部的子 SELECT 滤掉 $start_row 之前的所有行。这是访问您所关注的行的最高效方法,因为它只搜索到 $end_row 之前,而不是先准备整个结果集。
您可能很想知道使用 BETWEEN 子句是否更简单,如:

$sql = "SELECT
            *
FROM
            (
SELECT
r.*, ROWNUM as row_number
FROM:
( $select ) r
            )
WHERE row_number BETWEEN :start_row AND :end_row";

该方法存在这样一个问题:它首先检索结果集中的所有行,然后应用一个过滤器将该结果集缩小至一个相关的、更小的范围,这样做的效率要低很多。
还应注意,我调用了 oci_set_prefetch() 函数,并向它传递每页的行数。这有助于减少 Web 服务器与数据库之间的通信量。(John Lim 在以前引用的文章中更详细介绍了预取。)

与上面的 count_rows() 一样,此 paged_result() 还假设不绑定任何参数。可以在 ADOdb 和 PEAR::DB 库中找到解决此问题的实施。

最大页数

但上面的 paged_result() 函数使用的方法具有潜在的严重缺陷:通常情况下,所搜索的结果集的范围越大,该结果集的速度就越慢,因为它必须先找到 $end_row,然后滤掉 $start_row 之前的行。如果有一个大型结果集和高通信量站点,那么用户请求大量页码的效果无异于拒绝服务。

为避免发生此问题,可以考虑使用固定的最大页码,并拒绝为大于它的页码提供结果。对于容易验证的搜索函数,如果搜索无法找到几个页面之后的结果,则用户应明确地改进他们的搜索。或者,应提供可以帮助用户找到在几个页面中所需的内容的列排序功能。

综合全部

如果在单独的名为 pager_functions.php 的 PHP 脚本中包含以上所有函数,则使用它们浏览 Feedster 数据的代码可能如下所示:

<?php
$conn = OCILogon(’scott’, ‘tiger’) or die ("Unable to connect to db");

require_once ‘pager_functions.php’;

$rows_per_page = 20;
$url = ‘feedster_top500.php’; // URL to this script
$sql = ‘SELECT * FROM feedster_top_blogs ORDER BY rank ASC’; // The unfiltered SELECT

// Get the total page count from the number of rows
$total_rows = count_rows($conn,$sql);
$total_pages = total_pages($total_rows, $rows_per_page);

// Make sure the page number is a sane value
if ( !isset($_GET['page']) ||
!preg_match(‘/^[0-9]+$/’,$_GET['page']) ||
$_GET['page'] < 1 ) {
   
$_GET['page'] = 1;
} else if ( $_GET['page'] > $total_pages ) {
$_GET['page'] = $total_pages;
}

// Translate the page number into a starting row number
$start_row = page_to_row($_GET['page'], $rows_per_page);

// Filter to a single page of rows
$stmt = & paged_result($conn, $sql, $start_row, $rows_per_page);
?>

<table width="600">
<caption>Feedster Top 500 Blogs [#<?php echo $_GET['page']; ?>]</caption>
<thead>
<tr>
<th>Rank</th>
<th>Blog</th>
<th>Inbound Links</th>
</tr>
</thead>
<tbody>
<?php while (OCIFetchinto($stmt,$row,OCI_ASSOC)) { ?>
<tr valign="top">
<td align="right"><?php echo htmlspecialchars($row['RANK']); ?></td>
<td>
<a href="<?php echo htmlspecialchars($row['URL']); ?>">
<?php echo htmlspecialchars($row['NAME']); ?>
)</a>
</td>
<td align="right"><?php echo htmlspecialchars($row['LINKS']); ?></td>
</tr>
<?php } ?>
</tbody>
<tfoot>
<tr>
<td colspan="3" align="center">
<?php echo draw_pager($url, $total_pages, $_GET['page']); ?>
</td>
</tr>
</tfoot>
</table>
http://www.oracle.com/technology/global/cn/pub/articles/oracle_php_cookbook/index.html

2005年12月27日

下载:Flashget

输入法:拼音加加

浏览器:Firefox

压缩:Winrar

文字处理:Wps

文本编辑:UE

Pdf Reader:Foxit

IM:QQ、MSN Messanger、Popo、Gtalk、Skype

PIM:WinOrganizer、EssentialPIM、Sunbird

Telnet:SecureCRT、PuTTY

媒体播放:RealPlayer、ffdshow、VobSub

安全:M$ AntiSpyware

快捷方式管理:Turbo Launch

磁盘空间管理:DiskState

虚拟光驱:Alcohol 120%

开发环境:

Php

JDK6.0

IntelliJ IDEA

Zend Studio

Dreamweaver、Nvu

Firework

数据库:Mysql、PhpMyAdmin

SCM:TortoiseSVN

CSS:TopStyle

MindMap:MindManager

概念图:IHMC

2005年12月20日

   只要踏入在我们IT这个行业, 过不了几年身体就是亚健康状态,过渡的话就可能会“过劳死”,要想防止“过劳死”,就必须了解身体为我们发出的“过劳死”信号。

    研究者认为:在这27项症状和因素中占有7项以上,即是有过度疲劳危险者,占10项以上就可能在任何时候发生“过劳死”。同时,在第1项到第9项中占两项以上或者在第10项到18项中占3项以上者也要特别注意,这27项症状和因素分别是:

  1.经常感到疲倦,忘性大;

  2.酒量突然下降,即使饮酒也不感到有滋味;

  3.突然觉得有衰老感;

  4.肩部和颈部发木发僵;

  5.因为疲劳和苦闷失眠;

  6.有一点小事也烦躁和生气;

  7.经常头痛和胸闷;

  8.发生高血压、糖尿病,心电图测试结果不正常;

  9.体重突然变化大,出现“将军肚”;

  10.几乎每天晚上聚餐饮酒;

  11.一天喝5杯以上咖啡;

  12.经常不吃早饭或吃饭时间不固定;

  13.喜欢吃油炸食品;

  14.一天吸烟30支以上;

  15.晚上10时也不回家或者12时以后回家占一半以上;

  16.上下班单程占2小时以上;

  17.最近几年运动也不流汗;

  18.自我感觉身体良好而不看病;

  19.一天工作10小时以上;

  20.星期天也上班;

  21.经常出差,每周只在家住两三天;

  22.夜班多,工作时间不规则;

  23.最近有工作调动或工作变化;

  24.升职或者工作量增多;

  25.最近以来加班时间突然增加;

  26.人际关系突然变坏;

  27.最近工作失误或者发生不和。

  相关链接 如何摆脱过度疲劳

  针对如何摆脱过度疲劳,何永成博士开出如下处方:

  消除脑力疲劳法:适当参加体育锻炼和文娱活动,积极休息。如果是心理疲劳,千万不要滥用镇静剂、安眠药等,应找出引起感情忧郁的原因,并求得解脱。病理性疲劳,应及时找医生检查和治疗。

  饮食补充法:注意饮食营养的搭配。多吃含蛋白质、脂肪和丰富的B族维生素食物,如豆腐、牛奶、鱼肉类,多吃水果、蔬菜,适量饮水。

  休息恢复法:每天都要留出一定的休息时间。听音乐、绘画、散步等有助解除生理疲劳。

  科学健身方法:一是有氧运动,如跑步、打球、打拳、骑车、爬山等;二是腹式呼吸,全身放松后深呼吸,鼓足腹部,憋一会儿再慢慢呼出;三是做保健操;四是点穴按摩。

       哥们, 上面27条在你身上出现几条症状了?  怕怕吧? 

  建议哥们们每天早上和傍晚各抽出一小时锻炼身体,毕竟身体是革命的本钱!

2005年12月02日
注意:如果结果的长度大于服务器参数max_allowed_packet,字符串值函数返回NULL

2005年11月26日
2005年11月14日

 1. 如何查看ORACLE的隐含参数?   

  ORACLE的显式参数,除了在INIT.ORA文件中定义的外,在svrmgrl中用"show parameter *",可以显示。但ORACLE还有一些参数是以“_”,开头的。如我们非常熟悉的“_offline_rollback_segments”等。

  这些参数可在sys.x$ksppi表中查出。   

  语句:“select ksppinm from x$ksppi where substr(ksppinm,1,1)=’_'; ”   

  2. 如何查看安装了哪些ORACLE组件?   

  进入${ORACLE_HOME}/orainst/,运行./inspdver,显示安装组件和版本号。

  3. 如何查看ORACLE所占用共享内存的大小?

  可用UNIX命令“ipcs”查看共享内存的起始地址、信号量、消息队列。   

  在svrmgrl下,用“oradebug ipc”,可看出ORACLE占用共享内存的分段和大小。

  example:   

  SVRMGR> oradebug ipc

  ————– Shared memory ————–   

  Seg Id Address Size

  1153 7fe000 784

  1154 800000 419430400

  1155 19800000 67108864   

  4. 如何查看当前SQL*PLUS用户的sid和serial#?   

  在SQL*PLUS下,运行:   

  “select sid, serial#, status from v$session   

  where audsid=userenv(’sessionid’);”   

  5. 如何查看当前数据库的字符集?   

  在SQL*PLUS下,运行:

  “select userenv(‘language’) from dual;”   

  或:   

  “select userenv(‘lang’) from dual;”   

  6. 如何查看数据库中某用户,正在运行什么SQL语句?   

  根据MACHINE、USERNAME或SID、SERIAL#,连接表V$SESSION和V$SQLTEXT,可查出。   

  SQL*PLUS语句:

  “SELECT SQL_TEXT FROM V$SQL_TEXT T, V$SESSION S WHERE T.ADDRESS=S.SQL_ADDRESS   

  AND T.HASH_VALUE=S.SQL_HASH_VALUE  

  AND S.MACHINE=’XXXXX’ OR USERNAME=’XXXXX’ — 查看某主机名,或用户名   

  /”   

  7. 如何删除表中的重复记录?   

  例句:   

  DELETE

  FROM table_name a

  WHERE rowid > ( SELECT min(rowid)

  FROM table_name b

  WHERE b.pk_column_1 = a.pk_column_1

  and b.pk_column_2 = a.pk_column_2 );   

  8. 手工临时强制改变服务器字符集   

  以sys或system登录系统,sql*plus运行:“create database character set us7ascii;".

  有以下错误提示:

  * create database character set US7ASCII

  ERROR at line 1:

  ORA-01031: insufficient privileges

  实际上,看v$nls_parameters,字符集已更改成功。但重启数据库后,数据库字符集又变回原来的了。

  该命令可用于临时的不同字符集服务器之间数据倒换之用。

  9. 怎样查询每个instance分配的PCM锁的数目   

  用以下命令:   

  select count(*) "Number of hashed PCM locks" from v$lock_element where bitand(flags,4)<>0   

  /

  select count(*) "Number of fine grain PCM locks" from v$lock_element

  where bitand(flags,4)=0   

  /   

  10. 怎么判断当前正在使用何种SQL优化方式?   

  用explain plan产生EXPLAIN PLAN,检查PLAN_TABLE中ID=0的POSITION列的值。

  e.g.

  select decode(nvl(position,-1),-1,’RBO’,1,’CBO’) from plan_table where id=0

  /   

  11. 做EXPORT时,能否将DUMP文件分成多个?   

  ORACLE8I中EXP增加了一个参数FILESIZE,可将一个文件分成多个:   

  EXP SCOTT/TIGER FILE=(ORDER_1.DMP,ORDER_2.DMP,ORDER_3.DMP) FILESIZE=1G TABLES=ORDER;   

  其他版本的ORACLE在UNIX下可利用管道和split分割:

  mknod pipe p

  split -b 2048m pipe order & #将文件分割成,每个2GB大小的,以order为前缀的文件:   

  #orderaa,orderab,orderac,… 并将该进程放在后台。

     若您之前不曾使用过全萤幕的编辑器,那麽您可能连一些简单的编辑都有问题.
     如此您可能要找一个已经稍微了解vi使用的人来带领您.
 
     vi是一个萤幕编辑器,这表示了vi几乎用去了萤幕上的
     每一行空间来展示档案的内容,除了萤幕上的最後一行.
     这一行是用来让您发号命令给vi及vi给你一些相关档案资讯时用的.
    
     其他您必须了解的是vi是一个模式型编辑器.举例来说:
     你能输入文字或者是执行命令,但是你必须在正确的模式才能够执行.
    
     您一刚开始编辑一个档案时,您处在命令模式(command  mode).
     有一些命令能够让您切换到输入模式(input mode).
     然而,只有一个键能够让您离开输入模式,那就是键盘左上的<Esc>键
     若您不了解您目前处於何种模式,您可以持续的按,直到vi发出声音警告您,
     如此您已经回到命令模式.当您尝试做了一些vi所不允许的事情,
     正常来说vi会发出"哔"声(本机操作时)
          
     要开始编辑一个档案您可以这样做:
       $ vi file_name <按enter键>
     
     然後输入 :set verbose mode
     然後vi会提醒您:
     :set the mode option may never be turn on
     
     :虽说如此 但对初学者来说 有多些讯息提示总比没有好
        放心 离开vi後就会恢复原先的noverbose mode
        
     如此可以让vi当你产生错误时给予你多一些的讯息并当您猛按<Esc>键时
     ,会在萤幕的最下端显示如下的讯息,提醒您已在命令模式.
     Already in comman mode 
     
     :命令皆需要在命令模式下实行.
     
    △简易移动命令
          h      将标往左移动一个字元.

          j      将标往下移动一行.

          k      将标往上移动一行.

          l      将标往右移动一个字元.

       <方向键>  上下左右键也应该可以发挥作用.
     
          :若纯粹使用windows 内建的telent方向键无法使用..
             所以知道hjkl的用处也不错啦..
    
    △简易搜寻命令
         /text   搜寻text字串
                 若今天我要搜寻panda则是 /panda , / 为搜寻命令.
                
    △模式切换       

         a      在标後可以新增开始新增

         i      在标前可以开始新增文字

         o      在标的下方新增一行,并可以开始输入文字.

         O      在标的上方新增一行,并可以开始输入文字.

       <Esc>    当你今天用a,i,o,O进入输入模式,可以用<Esc>键回到命令模式.

          :经个人使用发现 模式切换只要记住几个就好 依照一般输入习惯,
             建议初学者记住a,O就好 (虽然到最後您会在不知不觉中全部记下)
             尤其是O看似没有o好用,但是今天若您想要在最上方新增一行时,
             记得O这个指令真是方便阿..
     
    △文字处理命令        
       : 
             yy     标所在行.
             p      在标所在的下一行贴上所的资料.

       删除:
             dd     将标所在行删除.
             x      将标所在的那个字元删除.

       储档:
             :w     以原档案名称储存档案.
             :w file_name   另存新档,档名为file_name

       离开:
            :q      离开编辑及vi,若您已经编辑过档案vi会拒绝您离开. 
            :q!     强制离开vi 不论情况

       : 所谓的一行 有可能在萤幕上是很多行(因为萤幕的一行摆放不下)
           只要没有换行符号产生 那就称之为一行,用标移动您就会明.

◎ex, vi, view – text editors

  ◎SYNOPSIS 
   
     vi [-eFGlRrSv] [-c cmd] [-t tag] [-w size] [file ...]
     ex [-eFGRrSsv] [-c cmd] [-t tag] [-w size] [file ...]
      
  ◎DESCRIPTION
  
     ex和vi是相同程式但不同介面,ex是一行处理的(line-oriented),
     vi是以全萤幕为基准的(screen oriented).二者能相互切换.
    
     View相当於vi使用-R(唯读)参数
    
  ◎OPTIONS

       -e     以ex模式开始编辑,如同用ex编辑一般。
              vi -e filename 等同於 ex filename

       -F     当第一次编辑时,不要让vi整个档案。
              (预设是整个档案,以避免当您在编辑时,他人更改这个档案。)

       -R     以唯读模式开启,如同以vipw开启档案,或在命令列中设定readonly参数。

       -r     重新取得某个特定档案,若没有指定档案,档案表列会被重新取得。
              若没有该指定档案,档案会被视为没有-r参数编辑。

       -S     以安全编辑模式启动,不允许所有的外部程式存取。

       -s     进入batch模式,只能应用在ex编辑。batch模式在执行ex scripts非常有用。
              一些及时资讯及其他使用者导向的讯息被忽略(不显示),
              没有开始档案或环境变数被读取。

       -w     设定基本的视窗大小,用以定义显示的行数。

       -v     以vi模式开始编辑,如同vi 或view命令。

       ex/vi从标准输入读取讯息,在vi介面, 若标准输入不是一个终端机,会产生错误。
       在ex介面,若标准输入不是终端机,无论如何ex会试着从他读取命令。
       然而,此时会以batch模式进行,如同-s参数被指定。

◎VI COMMANDS
       
       以下命令皆在vi命令模式下执行。
       为避免ex:符号与ex命令混淆 所有要输入的指令皆用蓝色表示
       不显示ex:(举例说明的英文缩写)
      
       :   <control+A>     表示先按住ctrl键再按A
          有些命令小写也可以用
    
    移动命令:
       <control+A>     往下移动到这个字下次一出现的地方。

       <control+B>     标向上移动一个萤幕。

       <control+D>     标往下移动数行(约12行)。

       <control+E>     将萤幕往上一行,但标位置不变。

       <control+F>     标往下移动一个萤幕。

           +         标往下移动到下一行第一个非空白字元。
     
       <control+U>   标往上移动数行(约12行)。

       <control+Y>   将萤幕往上动,但标位置不变.
                     CTRL+Y 每移动一次 Y就按一次
                     (当然您的标须位在至少能够向上动的位置)

           $         将标移动到该行尾.

           (         标往上移动到下一句子.

           )         标往下移动到下一句子.

           -         标移动到上一行第一个非空白字元.

           0(数字)   移动标到该行的第一个字元(包含空白).

           <         移动该行向左移动一个tab键距离,按第二次後开始动作.

           >         移动该行向右移动一个tab键距离,按第二次後开始动作.

           B         往上移动标到下一个字的开始.

           E         标往後移动到下一个字的最後一个字元.

           nG        移动到某行,n为行数,若没有指定则为档案的最後一行.

           H         移动标到档案第一行行首.

           L         将标移动到萤幕的最下一行.

           M         将标移动到萤幕的中间行.

           W         往下移动标到下一个字的开始.

           ^         移到该行第一个非空白字元.

           e         移动到该字的最後一字母.

           f<字元>   行中向後搜寻该字母并移动标到该位置.
                      移动到a字母的位置fa

           t<字元>   行中向後搜寻该字母并移动标到该字元前一个位置.

           {         往上移动到前一段落.

           }         往下移动到後一段落.

    档案命令:
    
       <control+G>     显示档案的资讯。
                       显示出目前档案是否更改,所在行的位置.
                       file_name: unmodified : line 1 of 380 [0%]

       <control+L>   重画萤幕。

       <control+R>   重画萤幕。
       
       <control+Z>   暂停编辑 回到shell,可用fg回到编辑画面

       <control+^>   切换到最近编辑的档案.
                     vi file_name file_name2 
                     用此命命可以在两个档案中切换.

           ZZ        将文件存档并离开vi
           
    编辑命令:
       
       输入:
           I         移动标道行首的第一个字元并开始接受输入.

           R         以取代模式进入输入模式.
                  
       :
           Y         该行到暂存区
       
       删除:
           D         从标目前位置道行尾的所有字元删除..

           S         将该行清除并进入输入模式.

           X         删除标之前的一个字元
       
       取代:
       !shell命令    !後接shell comd ,并以shell cmd 执行结果取代标该行.
                     !panda
                     用以下讯息取代原有行的内容
                     bash: panda: command not found

           r         按r後接着按某字元,以取代标所在的该字元.

           ~         切换标所在字元的大小写
       重:
           &         在该行重之前的规则表示式.
                     前提是需要之前有执行过规则表示式.
                     用panda取代a  :s/a/panda/
                     若之前没有任何表示式 则系统会显示如下讯息
                     No previous regular expression

           .         重上一个更改文件内容的vi命令.

           n         搜寻之前所搜寻过的字串
                     若先执行 /BSD
                     再执行   n     等同於执行 /BSD
                     若先前没有搜寻任何东西 会有如下讯息
                     No previous search pattern.

       复原:
           U         恢复状态到标起初接触此行的状态
           
           u         复原前一个动作产生的效果(也就是回复)

       其他:
           :         执行ex 命令

           J         将下一行与此行合.

           Q         离开vi模式并切换到ex模式.

.tar.gz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
———————————————
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
———————————————
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
———————————————
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
———————————————
.tgz
解压:tar zxvf FileName.tgz
压缩:未知
.tar.tgz
解压:tar zxvf FileName.tar.tgz
压缩:tar zcvf FileName.tar.tgz FileName
———————————————
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
———————————————
.rar
解压:rar a FileName.rar
压缩:r ar e FileName.rar


rar请到:http://www.rarsoft.com/download.htm 下载!
解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp rar_static /usr/bin/rar
———————————————
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName

lha请到:http://www.infor.kanazawa-it.ac.jp/…/lhaunix/下载!
>解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp lha /usr/bin/
———————————————
.rpm
解包:rpm2cpio FileName.rpm | cpio -div
———————————————
.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh 
.lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
解压:sEx x FileName.*
压缩:sEx a FileName.* FileName

sEx只是调用相关程序,本身并无压缩、解压功能,请注意!
sEx请到: http://sourceforge.net/projects/sex下载!
解压后请将sEx拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp sEx /usr/bin/