2009年7月28日星期二

php调用sqlite


2007-07-10 13:30:03 建议使用php5.0.0以上版本

1.建立测试php文件sqlitetest.php,代码如下:
<?php

//建立数据库连接
$db = @sqlite_open("C:\\wamp\\sqlitemanager\\dbtest.db");

//异常处理
if(!$db) die("Connection Sqlite failed.\n");

//add a table
@sqlite_query($db, "CREATE TABLE table1(id int(4),name varchar(20))");

//add  records
@sqlite_query($db, "INSERT INTO table1 VALUES(1,'zhang')");
//query records
$result = @sqlite_query($db, "SELECT * from table1");

//打印结果
print_r(sqlite_fetch_array($result));

?>

我们看到的输出结果是:

Array ( [0] => 1 [id] => 1 [1] => zhang [name] => zhang )


<?php
/**
 * 文件:sqlite.php
 * 功能:对sqlite数据库的处理
 * 作者:bjllm
 * 时间:2007-7-10
 */

define("LN", _LINE_); //行号
define("FL", _FILE_); //当前文件
define("DEBUG", 0);   //调试开关

$db_name = "C:\\wamp\\sqlitemanager\\dbtest.db";

//创建数据库文件
if(!file_exists($db_name))
{
  if(!($fp = fopen($db_name, "w+")))
  {
    exit(error_code(-1, LN));
  }
  fclose($fp);
}

//打开数据库文件
if(!($db = sqlite_open($db_name)))
{
  exit(error_code(-2, LN));
}

//产生数据表结构
if (!sqlite_query($db, "DROP TABLE test")) {        //有test表,不一定要创建结构
 exit(error_code(-3, LN));
}


if (!sqlite_query($db, "CREATE TABLE test (id integer primary key,name varchar(10) UNIQUE)")) {
 exit(error_code(-3, LN));
}

//插入两条数据
if(!sqlite_query($db, "INSERT INTO test(name) VALUES('holly')"))
{
  exit(error_code(-4, LN));
}
if(!sqlite_query($db, "INSERT INTO test(name) VALUES('orang')"))
{
  exit(error_code(-4, LN));
}

//删除数据
if(!sqlite_query($db, "DELETE FROM test WHERE name = 'holly' "))
{
  exit(error_code(-4, LN));
}

//修改数据
if(!sqlite_query($db, "UPDATE test SET NAME = 'tom' WHERE name = 'orang' "))
{
  exit(error_code(-4, LN));
}

//检索数据
if(!($result = sqlite_query($db, "SELECT * FROM test")))
{
  exit(error_code(-5, LN));
}

//获取检索数据并显示
while($array = sqlite_fetch_array($result))
{
  echo "ID: ". $array[id]."&nbsp;&nbsp;Name: ". $array[name]."<br>";
}

/*错误信息代码函数*/
function error_code($code, $line_num, $debug = DEBUG)
{
  if($code < -6 || $code > -1)
  {
    return false;
  }
  switch($code)
  {
    case -1: $errmsg = "Create database file error.";
      break;
    case -2: $errmsg = "Open sqlite database file failed.";
      break;
    case -3: $errmsg = "Create table failed, table already exist.";
      break;
    case -4: $errmsg = "Insert data failed.";
      break;
    case -5: $errmsg = "Query database data failed.";
      break;
    case -6: $errmsg = "Fetch data failed.";
      break;
    case -7: $errmsg = "";
      break;
    default: $errmsg = "Unknown error.";
  }

  $m = "<b>[ Error ]</b><br>File: ". basename(FL) ." <br>Line: ". LN ."<br>Mesg: ".$errmsg ."";
 if (!$debug)
 {
  ($m = $errmsg);
 }
 return $m;
}
?>

[PHP] ADODB入门

[PHP] ADODB入门

本文链接:
http://www.openphp.cn/index.php/article/3/154/index.html

1. 前言

ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件。现在 SFS3 系统 (校园自由软件交流网学务系统) 计划的主持人陈莹光老师,决定采用此一组件,为了让更多有心参与该项目的伙伴们能够顺利加入发展的行列,小弟认为有必要把 ADODB 的中文入门介绍写出来,以方便伙伴们参考备查。

虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据库的功能,一直未能标准化,每一种数据库,都使用另一种不同且不兼容的应用程序接口(API)。为了填补这个缺憾,因此才有 ADODB 的出现。一旦存取数据库的接口予以标准化,就能隐藏各种数据库的差异,若欲转换至其它不同的数据库,将变得十分容易。

目前 ADODB 支持的数据库种类非常地多,例如:MySQL, PostgreSQL, Interbase, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, DB2 以及一般的 ODBC (其中 PostgreSQL、Informix、Sybase 的driver 是由自由软件社群发展之后贡献出来的)。

使用 ADODB 最大的优点之一是:不管后端数据库如何,存取数据库的方式都是一致的,开发设计人员不必为了某一套数据库,而必须再学习另一套不同的存取方法,这大大减轻开发人员的知识负担,过去的知识往后仍可继续使用,转移数据库平台时,程序代码也不必做太大的更动。

其实 ADODB 这样的发展理念,并不是首创的,DBI 比 ADODB 出现得更早,它提供 Perl 存取数据库时,使用一致的 API 呼叫接口。相信用过 Perl + DBI 的朋友,再来用 ADODB 时,会有一种似曾相识的感觉。

另外,ADODB 对用过 ASP 的人而言,应该不陌生,这类朋友对 ADODB 应该很容易接受。

我们来看一下,ADODB 的简单用法:

<?php
    // 引入 adodb 的 inc 档,才能呼叫 adodb 提供的函式
    include('adodb/adodb.inc.php');

    // 选择连接的数据库种类,以建立联机对象,
    // 一旦对象建立,即可使用其成员函式来处理数据库。
    // 以下 $conn 即此一物件(object)
    $conn = &ADONewConnection('mysql');

    // 要不要显示侦错讯息,false 不要,true 要。
    // $conn->debug = false;
   
    $conn->debug = true;

    // 连接数据库
    // 用法:$conn->Connect('主机', '使用者', '密码', '数据库');
    // 用例:
    $conn->Connect('localhost', 'piza', 'ooo123', 'test');

    // 若欲采用持续性连接,上式可换用 PConnect:
    // $conn->PConnect('localhost', 'piza', 'ooo123', 'test');

    // 设定 sql 命令
    $sql = "insert into t values ('abcde', 18)";

    // 执行 sql 命令
    $rs = $conn->Execute($sql);

    // 检查执行结果,若 $rs == false,则呼叫 $conn 对象的成员函式 ErrorMsg()
    if (!$rs) print $conn->ErrorMsg(); else print "OK!";

?>


结果如下:

---------------------------------------------
(mysql): insert into t values ("abcde",18)
---------------------------------------------
OK!


若把侦错关掉,即 $conn->debug=false,则结果如下:

OK!


以下,逐步为各位介绍:使用 ADODB 的重点方法。

2. 安装

ADODB 的首页在:http://php.weblogs.com/ADOdb,目前(2002/10/24)最新版是:2.42 版,可至 ADODB 下载或至台南县教网中心 FTP 下载。

安装 ADODB 的方法超极简单,只要下载、解压、放入适当位置,即可完成 ! 如下所示:

1. 下载:

$ ncftp ftp.tnc.edu.tw

  cd sysop/ADODB

  get adodb242.tgz

2. 解压:

假设我把 adodb242.tgz 放入 /var/www/html 中

$ cp adodb242.tgz /var/www/html

$ tar xvzf adodb242.tgz

如下所示:

adodb/adodb-cryptsession.php
adodb/adodb-csvlib.inc.php
adodb/adodb-errorhandler.inc.php
adodb/adodb-errorpear.inc.php
adodb/adodb-lib.inc.php
adodb/adodb-pager.inc.php
....以下省略....


现在,您在 /var/www/html/adodb 已安装好 ADODB 了。

3. 引入 ADODB

一旦安装好 ADODB,使用前,应把 ADODB 相关的含入文件引入您的程序中。adodb 目录放在任何位置无所谓,只要能指向正确路径文件名即可。一般而言,您的程序代码只须引入 adodb.inc.php。

作法如下:

在您的 PHP 程序中:

include('路径/adodb/adodb.inc.php');

include_once('路径/adodb/adodb.inc.php');


例:

若您的程序和 adodb 在同一目录下:

.
..
adodb/
something.php*


则:

include('adodb/adodb.inc.php');

即可。

若位置是在某一个目录 somedir 中:

.
..
adodb
somedir/something.php


则必须使用:

include('../adodb/adodb.inc.php');


除了 adodb.inc.php 这个含入档,ADODB 还提供许多 adodb-*.inc.php 的含入档,这些多半是为驱动某些数据库的特殊用法而设的。

若是引入 adodb-session.php 则可让您将 session 存入数据库中来维护运用。

若是引入 adodb-pager.inc.php,可方便您做分页显示。

若是引入 adodb-errorhandler.inc.php,可让您自订错误处理讯息。

若是含入 adodb-pear.inc.php,可让您使用 PHP4 的 PEAR DB 语法来使用 ADODB。此时,尚可使用 DSN 连接数据库的字符串设定。如 $dsn="mysql://piza:ooo123@localhost/test";

若是引入 tohtml.inc.php,可帮您在程序代码中,方便将取出的记录,转成 HTML 的表格(table)来显示。

若是引入 toexport.inc.php,可让您方便地输出 CSV 档或以 tab 分隔字段的数据文件。

若是引入 rsfilter.inc.php,可让您在使用记录之前,预做过滤处理。

若是引入 pivottable.inc.php,可让您使用 pivot table 功能(俗称 cross-tabulations)。

注意 ! adodb.inc.php 是一定要引入的,其它,则视您要使用那一个功能,再引入该含入档即可。

4. 选用数据库种类,建立联机对象

由于 ADODB 使用对象导向的作法,因此您在引入档之后,接着请视您后端数据库的种类,建立一个联机对象。作法如下:

以 MySQL 数据库为例:

    $conn = &ADONewConnection('mysql');

注:NewADOConnection 和 ADONewConnection 是一样的,二者皆可使用。


上例中的 'mysql' 是指数据库的 drvier 的种类,ADODB 会据此呼叫对应的数据库 driver。

其它常用的 driver 有:access、ado、ado_access、ado_mssql、db2、vfp、ibase、borland_ibase、informix、 imformix72、mssql、oci8、odbc、postgres、postgres64、postgres7、sqlanywhere、 sybase....等等。

我们称建立的对象 $conn 为一 ADOConnection 对象,它代表与数据库的连接事务,皆透过这个对象来处理。ADOConnection 对象会提供许多处理的方法,以对象导向的说法,这些方法称为成员函式,这是外界存取此一对象的接口。

一旦联机对象建立之后,就有许多对象函式可供您使唤啦 ! 请看下一节的介绍。

5. 侦错模式

程序开发的过程,为了方便查出出现问题可能的地方,通常我们会打开侦错模式,俟程序功能确实稳定之后,再将它关闭。ADODB 提供侦错模式,存取数据库时,能显示其运作方式。

打开侦错模式,使用法:

$conn->debug=true


关闭侦错模式,使用法:

$conn->debug=false

6. 连接数据库

接着,使用 $conn 联机对象的 Connect 或 PConnect 函式来连接特定的数据库,此时必须提供 DSN (Data Source Names)相关数据,DSN 可能包括:主机名称、数据库使用者、数据库密码、数据库名称。不同的数据库种类,DSN 可能可以省略其中若干项。以 MySQL 而言,则上述四者都要提供。

该函式会传回 true 或 false,用以表示是否连接成功。

用例:

// 格式:$conn->Connect('主机', '使用者', '密码', '数据库');

    $conn->Connect('localhost', 'piza', 'ooo123', 'test');

或者,采持续性连接:

// 格式:$conn->PConnect('主机', '使用者', '密码', '数据库');

    $conn->PConnect('localhost', 'piza', 'ooo123', 'test');
 

若欲探查是否有联机成功,可用一个变量来接取传回值:

$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

$cok = $conn->Connect($mch, $user, $pwd, $database);

或者,采持续性连接:

$cok = $conn->PConnect($mch, $user, $pwd, $database);

if (!$cok) { echo "无法连接数据库 $database"; exit; }

7. 设定 sql 命令语法、执行 sql 命令

接下来,您就可以设计您要执行的 sql 命令语法,然后付诸执行。

$sql = "这里放 SQL 的命令语法";

$rs = $conn->Execute($sql);


其中,$rs 为回传的结果,若 $rs == false,则表示执行失败,您必须仔细检查一下。

您不一定要把命令语法放在 $sql 变量中,也可以直接放入 Execute( ) 括号中。若命令较短无妨,若命令较长,我建议您还是用一个变量 $sql 来设定命令字符串吧 !

下一节开始,为各位介绍 SQL 的基本命令,如:Insert、Select、Update、Delete 等等的用法。

8. 插入记录(Insert)

Insert 的用法如下:

// $name 为字符串,$year 为数字
$name='abcde';
$year=18;

// 插入一笔记录,命令的大小写无妨,但数据表 t 及变量则大小写有分别 !
$sql = "INSERT INTO t VALUES ('$name', $year)";

// $sql = "insert into t values ('$name', $year)"; 亦可。

// 执行
$rs = $conn->Execute($sql);

// 检查执行结果,进行错误处理;若正常,则继续其它动作....
if (!$rs) print $conn->ErrorMsg();

....以下省略....


ErrorMsg() 是错误显示的函式,它会取出错误讯息,并显示出来。

另外,ADODB 提供一种 记录集(RecordSet) 函式 GetInsertSQL(),可帮您产生 Insert 的语法。

例子如下:

<?php

// 引入 ADODB
include('adodb/adodb.inc.php');

// 建立联机对象
$conn = &ADONewConnection('mysql');

// 侦错
$conn->debug=true;

// DSN 四项基本数据设定
$mch="localhost";
$user="root";
$pwd="jack168";
$database="test";

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 产生一笔空记录
$sql = "select * from t where year=-1";

$rs = $conn->Execute($sql);


// 用一个空数组来装要更新的数据
$r = array();

$r['name']='john';
$r['year']=28;

// 用 GetInsertSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $insertSQL 中
$insertSQL = $conn->GetInsertSQL($rs, $r);

// 执行插入
$conn->Execute($insertSQL);

$conn->Close();
?>


侦错讯息如下:

-----------------------------------------------------------
(mysql): select * from t where year=-1
-----------------------------------------------------------
(mysql): INSERT INTO t ( name, year ) VALUES ( 'john', 28 )
-----------------------------------------------------------
   

9. 取出记录(Select)

Select 的用法如下:

<?php

// 引入 ADODB
include('adodb/adodb.inc.php');

// 建立联机对象
$conn = &ADONewConnection('mysql');

// 不侦错
$conn->debug=false;

// DSN 四项基本数据设定
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 执行 Select 由表格 t 取出数据,
// 它会传回一个 ADORecordSet 记录集对象 $rs (RecordSet)
// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录(row 或称 record),
// 该记录的所有字段数据的内容,存放在 fields 这个数组之中
// ,以数字为索引,第一个由 0 开始
$rs = &$conn->Execute('select * from t');

// 若 $rs 为 false,则秀出错误讯息
if (!$rs) {
    print $conn->ErrorMsg();
} else {

// 当尚未到达 记录集 $rs 的结束位置(EOF:End Of File)时,(即:还有记录尚未取出时)
    while (!$rs->EOF) {
        // 秀出所有字段,$FieldCount() 会传回字段总数
    for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
        print $rs->fields[$i] . " ";
    }

        // 移至下一笔记录
    $rs->MoveNext();
   
    // 换列
    echo "<br>\n";
    }
}

$rs->Close(); // 可不用
$conn->Close(); // 可不用
?>


$rs->fields[] 数组是由 PHP 的数据库扩展功能产生的,某些扩展功能并不支持使用字段名称当作索引。

若欲使用名称当作索引,也就是俗称的 hash 或 associative arrays,则需使用全域变量 $ADODB_FETCH_MODE 加以指定。

以下设定:使用数字索引 $ADODB_FETCH_MODE= ADODB_FETCH_NUM;


以下设定:使用名称索引 $ADODB_FETCH_MODE= ADODB_FETCH_ASSOC;


下面是使用名称索引的例子:

<?php

// 引入 ADODB
include('adodb/adodb.inc.php');

// 建立联机对象
$conn = &ADONewConnection('mysql');

// 不侦错
$conn->debug=false;

// DSN 四项基本数据设定
$mch="localhost";
$user="root";
$pwd="jack168";
$database="test";

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 执行 sql 之前,指定使用名称索引
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

// 执行 Select,它会传回一个 ADORecordSet 记录集对象 $rs
// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录内容,
// 该记录存放在 fields 这个数组之中
$rs = &$conn->Execute('select * from t');

// 若 $rs 为 false,则秀出错误讯息
if (!$rs) {
    print $conn->ErrorMsg();
} else {

// 当尚未到达记录集结束位置(EOF)时,
    while (!$rs->EOF) {
        // 秀出所有字段

    print $rs->fields['name'] . " " . $rs->fields['year'];

        // 移至下一笔记录
    $rs->MoveNext();
   
    // 换列
    echo "<br>\n";
    }
}

$rs->Close();  // 可不用
$conn->Close(); // 可不用
?>

10. 取出记录(使用 FetchRow)

这里示范 FetchRow 的用法:

$sql = "select * from t";

$rs = $conn->Execute($sql);

if ($rs) {
    while( $ar = $rs->FetchRow() ) {
        print $ar['name'] ." " . $ar['year'];
        print "<br>\n";
    }

}


FetchRow() 会将取出的记录传回,您可用一个 array 来接取。

注意 ! 使用 FetchRow() 就不必再用 MoveNext(),FetchRow 内部会自动完成移至下一笔记录的动作。

11. 更新记录(Update)

您可以用传统的方式:

$sql ="UPDATE t SET name='john', year=28 WHERE year=18";
$conn->Execute($sql);


也可以用以下这种方式:

<?php

// 引入 ADODB
include('adodb/adodb.inc.php');

// 建立联机对象
$conn = &ADONewConnection('mysql');

// 侦错
$conn->debug=true;

// DSN 四项基本数据设定
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 选择要更新的那一笔记录
$sql = "select * from t where year=18";

$rs = $conn->Execute($sql);


// 用一个空数组来装要更新的数据
$r = array();

$r['name']='john';
$r['year']=28;

// 用 GetUpdateSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $updateSQL 中
$updateSQL = $conn->GetUpdateSQL($rs, $r);

// 执行更新
$conn->Execute($updateSQL);

$conn->Close();
?>


侦错讯息如下:

-------------------------------------------------------------
(mysql): select * from t where year=18
-------------------------------------------------------------
(mysql): UPDATE t SET name = 'john', year = 28 WHERE year=18
-------------------------------------------------------------

12. 删除记录(Delete)

删除记录很简单,采传统方式即可: $sql = "DELETE FROM t WHERE year=18";

$rs = $conn->Execute($sql);

13. 使用字段对象(Field Objects)

这里示范字段对象 FetchField 的用法,用以取得字段名称及字段型态:

$sql = "select * from t";

$rs = &$conn->Execute($sql);

if ($rs) {
   while (!$rs->EOF) {
    // 取出第二个字段
    $f = $rs->FetchField(1);

    // 印出字段名称 及 字段型态
    print $f->name . ":" . $f->type;

    $rs->MoveNext();

    print "<br>\n";
   }
}
 

另外,ADODB 提供一个 RecordSet 函式 MetaType(),可将原始的字段型态转成一般型态代码:

C : 字符
X : text
B : blob
D : 日期
T : timestamp
L : 布尔值或位
I : 整数
N : 数字型态,包括:自动增加、数值、浮点数、实数及整数
R : serial、自动增加


用例: 

    $f = $rs->FetchField(1);

    // 印出字段名称 及 字段型态的代码
    print $f->name . ":" . $rs->MetaType($f->type);

14. 简单分页(Pager)

ADODB 提供一种简单分页显示记录的方法,使用前,要将 adodb-pager.inc.php 引入。

<?php

include('adodb/adodb.inc.php');

// 引入分页功能
include('adodb/adodb-pager.inc.php');

// 启动 session
session_start();

$db = ADONewConnection('mysql');

$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

$db->Connect($mch, $user, $pwd, $database);

$sql = "select * from t";

// 产生 pager 对象
$pager = new ADODB_Pager($db, $sql);

// 每一页秀 5 笔记录
$pager->Render($rows_per_page=5);

?>


结果如下:

Figure 1. 简单分页功能


每页显示记录的数目是由 Render() 来控制的,若没有传入指定的 row 数给 Render(),默认值每页秀 10 笔。

另外,字段名称也可以改变,如下示范:

<?php

include('adodb/adodb.inc.php');

// 引入分页功能
include('adodb/adodb-pager.inc.php');

// 启动 session
session_start();

$db = ADONewConnection('mysql');

$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

$db->Connect($mch, $user, $pwd, $database);

$sql = "select name as '姓名', year as '年纪' from t";

// 产生 pager 对象
$pager = new ADODB_Pager($db, $sql);

// 每一页秀 5 笔记录
$pager->Render($rows_per_page=5);
?>


结果如下:

Figure 2. 改变字段名称


15. 输出 CSV 档

ADODB 提供输出 CSV 档的方法,使用前,要将 toexport.inc.php 引入。

<?php

include('adodb/adodb.inc.php');

// 引入输出 CSV 文件功能
include('adodb/toexport.inc.php');

$db = ADONewConnection('mysql');

$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

$db->Connect($mch, $user, $pwd, $database);

$sql = "select name as '姓名', year as '年纪' from t";

$rs = $db->Execute($sql);

// 秀出 CSV 格式
print rs2csv($rs);
?>


结果如下:

姓名,年纪
abcde,45
yyy,20
ppp,34
mmm,13
hhh,41
rrr,65
kkk,29
miso,154
sss,89
abc,18
abcde,0
uyt,58
john,28


也可用 tab 分隔字段,使用 rs2tab 方法如下:

print rs2tab($rs, false);

注: false 表示不显示字段名称

结果如下:

abcde  45
yyy    20
ppp    34
mmm    13
hhh    41
rrr    65
kkk    29
miso   154
sss    89
abc    18
abcde  0
uyt    58
john   28

若是 print rs2tab($rs, true);
结果如下:

姓名    年纪
abcde   45
yyy     20
ppp     34
mmm     13
hhh     41
rrr     65
kkk     29
miso    154
sss     89
abc     18
abcde   0
uyt     58
john    28


也可以将结果由标准输出(STDOUT)显示,使用 rs2tabout 方法如下:

print rs2tabout($rs);


执行结果如下:

Figure 1. 在console中显示结果


也可以存成 CSV 档:

// 档案路径
$path = "/tmp/test.csv";

// 开档供写入
$fhd = fopen($path, "w");

// 若开档成功
if ($fhd) {

   // 则写入 CSV
   rs2csvfile($rs, $fhd);

   // 也可以使用 rs2tabfile($rs, $fhd);

   // 关档
   fclose($fhd);
}

结果如下:

[ols3@p web]$ cat /tmp/test.csv
姓名,年纪
abcde,45
yyy,20
ppp,34
mmm,13
hhh,41
rrr,65
kkk,29
miso,154
sss,89
abc,18
abcde,0
uyt,58
john,28

16. 取出一定笔数的记录 (使用 SelectLimit)

ADODB 提供一个 ADOConnect 函式 SelectLimit,可供您取出一定笔数的记录,用法如下:

$conn->Connect($mch, $user, $pwd, $database);

rs = $conn->SelectLimit("Select * from t", 3, 1);
//                             取出 3 笔、在第 1 笔之后

// 秀出这 3 笔记录
if ($rs) {
    while( $ar = $rs->FetchRow() ) {
        print $ar['name'] ." " . $ar['year'];
        print "<br>\n";
    }

}


上式是说:在第 1 笔记录之后,取出 3 笔,也就是第 2、3、4 笔记录。

结果如下:

--------------------------------------
(mysql): select * from t LIMIT 1,3
--------------------------------------

注意 ! SelectLimit 的写法刚好和 MySQL 语法相反 !

17. 结语

本讲义,主要是为:有心参与 SFS3 (sfs.wpes.tcc.edu.tw) 计划的伙伴们而写的。做为一份入门文件,以上这些介绍,应该是足够让您了解 ADODB 并且能把它应用在 SFS3 或其它有意义的地方了吧? 若果真如此,小弟就心满意足了 !

ref. 参考资源

ADODB 网站

ADODB 手册

PHP 对象导向入门

2009年7月26日星期日

FLASH实用代码大全(二)

转载:http://blog.sina.com.cn/s/blog_48fb2e9701000c6n.html~type=v5_one&label=rela_nextarticle


30.问: 如何优化Flash动画,使文件更小,播放更流畅?
答: Flash作为Macromedia公司出品的网页制作与动画创作的专业软件,操作简便,功能
强大,现已成为交互式矢量图形和Web动画事实上的标准。
  但是,如果制作的Flash电影文件较大,动辄几百k的话,常常会让网上浏览者在不断
等待中失去耐心。对Flash电影进行优化就显得很有必要了,但前提是我们不能有损电影的
播放质量。
  1.多使用符号(Symbol)。如果电影中的元素有使用一次以上者,则应考虑将其转换
为符号。重复使用符号并不会使电影文件明显增大,因为电影文件只需储存一次符号的图
形数据。
  2.尽量使用渐变动画。只要有可能,应尽量以“移动渐变”(Create Motion Tween
)的方式产生动画效果,而少使用“逐帧渐变”(-By-)的方式产生动画。
关键帧使用得越多,电影文件就会越大。
  3.多采用实线,少用虚线。限制特殊线条类型如短划线、虚线、波浪线等的数量。由
于实线的线条构图最简单,因此使用实线将使文件更小。
  4.多用矢量图形,少用位图图像。矢量图可以任意缩放而不影响Flash的画质,位图
图像一般只作为静态元素或背景图,Flash并不擅长处理位图图像的动作,应避免位图图像
元素的动画。
  5.多用构图简单的矢量图形。矢量图形越复杂,CPU运算起来就越费力。可使用菜单
命令Modify (修改)/Curves(曲线)/Optimize(优化),将矢量图形中不必要的线条删
除,从而减小文件。
  6.导入的位图图像文件尽可能小一点,并以JPEG方式压缩。
7.音效文件最好以MP3方式压缩。MP3是使声音最小化的格式,应尽量使用。
  8.限制字体和字体样式的数量。尽量不要使用太多不同的字体,使用的字体越多,电
影文件就越大。尽可能使用Flash内定的字体。
  9.不要包含所有字体外形。如果包含文本域,则应考虑在Text Field Properties(
文本域属性)对话框中选中Include Only Specified Font Outlines(只包括指定字体外
形),而不要选择Include All Font Outlines (包括所有字体外形)。
  10.尽量不要将字体打散(菜单命令为Modify / Break Apart)。字体打散后就变成
图形了,这样会使文件增大。
  11.尽量少使用过渡填充颜色。使用过渡填充颜色填充一个区域比使用纯色填充区域
要多占50字节左右。
  12.尽量缩小动作区域。限制每个关键帧中发生变化的区域,一般应使动作发生在尽
可能小的区域内。
  13.尽量避免在同一时间内安排多个对象同时产生动作。有动作的对象也不要与其它
静态对象安排在同一图层里。应该将有动作的对象安排在各自专属的图层内,以便加速Fl
ash动画的处理过程。
  14.用Load Movie命令减轻电影开始下载时的负担。若有必要,可以考虑将电影划分
成多个子电影, 然后再通过主电影里的Load Movie、Unload Movie命令随时调用、卸载子
电影。
15.使用预先下载画面。如果有必要,可在电影一开始时加入预先下载画面(Preloader)
,以便后续电影画面能够平滑播放。较大的音效文件尤其需要预先下载。
  16.电影的长宽尺寸越小越好。尺寸越小,电影文件就越小。可通过菜单命令Modify
(修改)/Movie(电影),调节电影的长宽尺寸。
  17.先制作小尺寸电影,然后再进行放大。为减小文件,可以考虑在Flash里将电影的
尺寸设置小一些,然后导出迷你SWF电影。接着将菜单File(文件)/Publish Settings…
(发布设置…)中HTML选项卡里的电影尺寸设置大一些,这样,在网页里就会呈现出尺寸
较大的电影,而画质丝毫无损、依然优美。
  在进行上述修改时,不要忘记随时测试电影的播放质量、下载情况和查看电影文件的
大小。
31.问:为什么在用flash做“沿轨迹运动”时总是沿直线运动,和教程对照了一下,做法完全一样,怎么不行?
答:这个问题似乎总会困扰初学者,但实际上问题很简单。首尾2帧中心位置没有放准在轨迹上。一个简单的检查办法:你把屏幕大小设定为4 00%或更大,察看图形中间出现的圆圈是否对准了运动轨迹。
32。问:为什么我在 FLASH 中做旋转为什么总是转不快。有什么办法可以转快一点呢?
答:你把播放速度调快,比如38祯/秒,方法:主菜单->modify(修改)->movies(影片),加大 rate(影格速度)的值便可
33。问:请问制作按钮时,“hit"是用来做什么的?什么时候需要用到?很多教程都没具体讲解"hit"的用法。
答:hit是指定按纽的激发区域。在HIT内设定的区域在播放时是不会显示出来的。如果没有指定HIT区域,一般FLASH会默认你的按纽区域作为激发区域。比如:用文字做按钮时,最好能定义一个矩形来做触发区,而不是系统默认的文字内容。
34。问:如何把flash放到FP2000、FP98中去?
答:FP98和FP2000对FLASH的支持较差,不能直接在其中插入FLASH动画,解决办法是在SWF文件发布、原代码生成后,把HTML文件中的< ; ;OBJECT>部分拷过去便可。建议使用DREAMWEAVE来制做FLASH动画网页,会方便很多。
35。问:如何把一个fla文件输出成和swf一样的gif文件
答:先在Publish settings(发布设置)->format(格式)->Gif image(gif 影像),并对其进行相应的设置之后,用Publish(发布)功能便可输出GIF文件。如果FLA文件中含有MC,那么GIF文件中将不会包含MC中的动画,而将只将M C的第一桢转化为GIF。
36。问:把做好的一个只有十几K的FLASH放入网页中后,预览网页时,为什么要等好长时间FLASH才能被显示。
答:检查SWF文件的名字.路径是否正确,如果不正确系统会试图长时间等待。
37。问:如何设置FLASH的背景?
答:设定背景颜色可以按Ctrl+M,选color项里的BACKGROUND(背景),如果想用一幅图形做背景只需在最下的一个层import(输入)一幅图像便可。
38。问:在FLASH中,怎样画一个圆圈,如何修改圆圈的颜色?
答:画圆的时候把填充色(颜色设定的左上角选项)设为无就可以了!把边框的颜色设定为相应颜色便可。
39。问:怎样做到字列成环型并围绕圆心转动?
答:你可以用CORELDRAW软件或者相关软件来做好了,再导入到FLASH中便可!
40。问:外部导入txt如何变字体的颜色?
答:在设定文本框时,设定字体的颜色。
41。问:才打开FLASH4时使用铅笔工具画圆时还可以,但再次新建一个时用铅笔工具画圆时(模式是平滑)画出来的却不是一个圆或者椭圆!这是怎么回事?
答:按住Shift的同时画圆,你能画的更圆!
42。问:我做出来的文字与图形总是很难对齐,请问如何对齐目标,并把它们放到你想要的位置。
答:选中目标,然后从主菜单->windows(窗口)->inspector(查看窗)->object(对象)然后便可以调节它的高(h)、宽(w )、起始位置(x,y)和是否中心对齐(use center)。
43。问:FLASH4的多个场景之间如何调整播放次序?
答:主菜单->windows(窗口)->inspector(查看窗)->Scene(场景),可以对场景进行调整播放次序、改名、删除等操作。
44。问:请问在Linux下如何观看flash动画,有插件for Linux的么?
答:http://www.openswf.org/有
46。问:如何将fla文件直接生成exe文件?
答:带有标题栏的swf文件可以通过菜单直接生成exe,是在Flash Player打开swf文件,然后选择file(文件)->creat projector(建立项目)。如果加上了FS命令将文件全屏显示后标题栏没了,便可用CTRL+F热键来生成。生成的执行文件内置了播放器,将比SWF文件大二百多K。
47。问:请问如何把做好的flash转换成屏幕保护程序?
答:用SWF browser 2.8或者screensaver。http://iching.topcool.net/有下载
48。问:请问如何借用别人作品中的内容。是否可以将SWF文件完全解码成FLA文件。
答:用SWF browser 2.8可以解开别人的SWF文件,将其中的图像.声音取出保存。到目前为止还没有任何一个软件可以将SWF文件完全反变换成FLA文件。
49。问:如何在FLASH中实现3D效果。
答:在FLASH中不能其接生成3D的动画,需借助其它的软件才行。比如3D MAX,然后再安装上vecta3D或者Illustrate! 4.0(4.1)插件便可以直接输出swf格式的动画了。
50。问:FLASH的动画背景可以是透明的吗?如何设置?
答:当然可以,在发布设定中的HTML栏中有一项是窗口模式,选透明的窗口一项就OK。若是在html中引用flash可在html文件中的前加上下面的语句:“透明Flash的使用方法:在插入flash的代码中插入<param name="wmode" value="transparent">即可实现flash背景透明 ” 。不过透明只能在IE中可以,在NC中便失效了。
51。问:有什么方法能把普通位图图片转换成矢量图片呢?
答:用AdobeStreamline软件,http://iching.topcool.net/有软件下载并有一简单教程,或用FreeHand8转换亦可。
52。问:请问那种格式(后缀)为矢量图?请问用那个软件可以浏览这些矢量图?
答:*.ai *.eps *.wmf *.cdr,其中前面三种可以在FLASH中直接引用。cdr格式需转换成前三种格式方可引用。如果你安装了CORLDRAW 便可以在资源管理器中直接预览CDR格式的图形。其他格式的还没有软件能够象ACDSee浏览普通图片一样大量浏览。
53。问:在SWF中,怎样去掉点击鼠标右键所出现的内容?
答:在publish settings里面有show menu的勾选。但是对于网页上的flash它始终会出现flash字样。如果你把它做成exe文件的话,就什么也没有了。
54。问:如何让双击SWF文件时可以直接满屏播放?
答:在最后一桢的ACTION里选FSCOMMOND一项,然后在右边选中fullscreen,true,便可!
55。问:如何制作音乐开关?
思路:将音乐放入MC,用Tell Target来控制这个MC的播放和停止。
相关文章或源文件: www.flashempire.com/tutorial/tutor/t3.html 作者:边城浪子 netschool.cpcw.com/homepage/tool/flas h4/advanced/advanced20.htm 56。问:请问如何调节音量
答:用纯粹的FLASH不能连续调节音量,只能分段调节。
http://netschool.cpcw.com/homepage/tool/flash4/advanced/advanced21.htm有小东瓜写的教程。
57。问:如何在文件中加可控制的背景音乐
答:天极网有教程。http://sh.cpcw.com/netschool/homepage/tool/flash4/index.htm
作者:starwind
58。问:在网页中如何分帧来控制FLASH动画
答:晨曦空间有教程。http://starwind.yeah.net作者:newfish
60。问:怎样才能截取音乐?
答:闪光地带(http://zippy.yeah.net)里面有SoundForge,用内录的方法录制,效果非常好,如果音量变小了,用effect 里面的dynamic--graphic--expand可以扩大。另外CoolEdit、GoldWave 也是很不错的选择。
61。问:我想在一个CD 或 VCD 里面保存一个声音文件是怎么样保存的呢? 我想我所保存的声音可以导出在FLASH 里面使用。请问Flash中如何加入.mp3?
答:用sthvcd,vcdcutter或其他东东剪下来就可以了。Flash中不能加入mp3,若为mp3格式,可通过winamp或其它软件转成wav,然后要编辑的话用s oundforge 4.5。
62。问:那里有Sound Forge 4.5的教程?
答:http://yongong.topcool.net/音乐编辑那个栏目
63。问:请问如何把midi转换成wav?
答:MIDI转EAV的方法如下:
1。用WINGROOVE这个软波表直接转换,不过音色是WINGROOV自带的,没有得选择余地的!
所以这是最简单最原始的方法,效果一般!这个软件在h ttp://www.cc.rim.or.jp/~hiro
ki/english有下载。
2。用两个声卡,一个放一个录。放的那边用软波表,如YAMAHA100等或者声卡自带的硬波
表,录音后还可以降噪!此方法还可以!但是如果结合下面的方法就更好了!
3。用软音源软件,如REALITY或者GIGASAMPLER等代替波表,使用专门的音色库来转,这样
只要一个声卡就解决问题了!此方法可以使用你认为最好的音色,音质也是几乎没得挑剔
的,W AV的质量接近下面的 方法了!
4。如果你钱很多的话,就用专门的音源和硬盘录音机吧!
64。问:如何才能将文字或图画做变形?
答:Ctrl+B把动作的头和尾打散后即可!symbol是不能做shape的。
65。问:如何制作边缘模糊的MASK效果?

答:在做好MASK效果后再在其上面加一层有模糊边缘的色块。
66。问:怎么做出象电视受干扰时的雪花啊?
答:先画一些短的白线条(细一点,稍微有点灰度),然后做几个关键帧,每帧里随机的放一些,连续播放一下就有效果了。
67。问:请问如何将文字或图镂空?
答:打散字或者图形,先用涂边框工具将它的边缘上色,然后再选中中间部分将之删除便可。
68。问:如何通过按钮给别人发E-mail.
答:get url:mailto:flash8@flash8.net
69。问:如何用GET URL功能打开一个窗口
答:在get url中输入java:op('dongua.htm',550,400),get url支持简单的ja
va语句,这种方法跟选择_blank不同。
71。问:关键帧中的脚本里stop后的脚本会不会起作用?
答:stop语句只停止帧的播放,并不能停止该STOP所在关键帧的ACTION语句的执行。
72。问:我如可才能把“别人网页”中的SWF文件下载到自已的硬盘上呢?
答:方法1、在FLASH动画上单机鼠标右键,选目标另存为……OK!
方法2、在你的浏览器缓冲目录里面有你看过FLASH的SWF文件!一般情况下系统的默认目录
是:
windows->Temporary Internet Files,查找swf文件,其中保存的swf文件数量跟浏览器设
定的缓存空间有关,然后将它COPY出来便可。
73。问:请问一串字或一幅图由模糊变清晰的效果怎样做?
答:刚开始的时候将ALPHA(透明度)设小一些,最后位置的ALPHA=100%,关键祯之间用MOTION变化。注意,是SYMBOL才能MOTION,除了用a lpha外,最关键的还是要用相同内容不同的层来错开,做出模糊的效果!
74。问:打字的效果是怎么做的(就是字一个一个地出来)需要把每个字都转换成组件吗
?
答:
方法1、为每一个字建立一个MC,然后在第一帧中引用第一个字,隔两至三祯,按F6,复制
关键祯,再引用第二个字,再隔两,三祯,按F 6,引用第三个,以此类推。如果加上打字
的音效,效果会更好。本方法适于字数较少的地方。
方法2、如果你只是简单地让它们出现,可以在字上加一层,然后用底色做一个矩形,把字
遮住。并将矩形设定为MC,给实体命一个名字(i nstance name),然后用Set Property
语句编程实现矩形的跳着移动便可。这种办法适于字数较多的地方。
75。问:如何计算sin、cos等函数?
思路:利用有关的数学公式将函数转换
相关文章或源文件: www.flashempire.com/tutorial/tutor/t12.html 作者:小魔女 dongua.163.net/flash4/fla/.fla 东瓜茶轩
76。问:要得到a值除以b值所得到的余数,其表达式该怎么写?
答:a-b*int(a/b)便可!
77。问:如何在FLASH中重复播放部分影格N次然后再跳转?
答:Set Variable: "i" = 1
Set Variable: "time" = 5
comment:time表示重复次数。
comment:以下是想重复的内容帧名为repeat
…………
If (i<=time)
Set Variable: "i" = i+1
Go to and Play (repeat)
End If
便可。
78。问:如何制作鼠标跟随动画?
答:思路:利用Start Drag语句让一个MC随鼠标运动,再利用该MC的x、y坐标等属性产生相应的变化相关文章或源文件: www.flashempire.com/tutorial/tutor/t5.html 作者:边城浪子 w
ww.flashempire.com/tutorial/tutor/t9.html 作者:Jimbob 202.106.124.57/~eastecho/fbbs/Forum7/HTML/00002 9.html
79。问:如何使用FScommand制作时钟?
答:在天极网有相关教程 netschool.cpcw.com/homepage/tool/flash4/advanced/advanced18.htm 作者:newfish
80。问:如何进行碰撞检测?
答:思路:1、用get property检测运动MC的位置;
2、对于一些和鼠标跟随有关的碰撞检测,可以用_droptarget
相关文章或源文件:

www.flashempire.com/tutorial/tutor/t19.html 作者:FlashGun
202.106.124.57/~eastecho/fbbs/Forum2/HTML/00021 5.html
81。问:返回值中或者需load进入动画的文本文件中如何表示空格和其他特殊字符?
答:用"+"代替空格 “name= 小东瓜”写为:“name=+小东瓜”
在异景空间(http://iching.topcool.net/)有相对应特殊字符的转换表。
82。问:如何调用一个.exe的可执行文件,比如:我用vc编好的可执行文件。
答:用fscommand("exec","执行文件名")便可。需注意此时执行文件的路径是否正确。

83。问:如何禁止菜单、Zoom In(Out)功能,如何完成双击SWF文件时直接全屏
答:在第一桢中输入下面命令:
全屏->FS Command ("fullscreen", true)
禁止缩放->FS Command ("allowscale", False)
禁止菜单->FS Command ("showmenu", False)
84。问:怎样在音乐完成后执行一个动作?
答:http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/000382.html
85。问:如何载入外部动画(*.swf),如何控制载入动画的位置?
答:相关文章或源文件:

202.106.124.57/~eastecho/fbbs/Forum7/HTML/00000 9.html
202.106.124.57/~eastecho/fbbs/Forum2/HTML/00057 2.html 202.106.124.57/~eastecho/fbbs/Forum2/HTML/00015 9.html
86。问:如何在网页中判断是否已安装插件?
答:http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/000753.html有详说明。
87。问:flash4是怎么样制作聊天室?
答:需要cgi的支持。比如:asp、perl、php等。国内专门介绍CGI与FLASH联合编程的站点较少,你可以去国外的一些站点看看。
88。问:如何制作留言板?
答:分成上、下两篇。用Asp+Flash实现。 www.flashempire.com/tutorial/tutor/t15.html 作者:边城浪子 www.flashempire.com/tutorial/tutor/t16.html 作者:边城浪子

89。问:如何做计数器?
答:主要是用cgi程序(asp,perl,php等)将数值写入文本文件中,然后利用FLASH的读文本文件的功能将数字读出来并显示。
90。问:如何制做烟花效果?
答:

http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/000590.html作者:boat

91。问:如何动态改变颜色?
答:思路如下:
1、做好不同颜色的帧或MC调用;
2、使用RGB或者CMYK或者其他的色彩模式来进行改变,利用一个具有不同TINT属性的符号
并且动态改变ALPHA属性进行叠加。
相关文章或源文件如下:

202.106.124.57/~eastecho/fbbs/Forum2/HTML/00014 2.html
203.39.170.10/http/movies/zips/colour.zip 作者:Richard James Rose 203.39.170.10/http/movies/zips/cmyk.zip 作者:Martyn van Beek
92。问:如何制作Loading?
答:使用_sloaded、_totals两个变量可以完成
相关文章或源文件:

www.flashempire.com/tutorial/tutor/t4.html 作者:边城浪子 w
ww.flashempire.com/tutorial/tutor/t10.html 作者:小东瓜
93。问:如何判断载入外部swf的进度?
答:可以使用被载入swf的_sloaded、_totals两个变量,加上被载入动画的名
字。
相关文章或源文件:

202.106.124.57/~eastecho/fbbs/Forum2/HTML/00051 6.html
94。问:如何把FLASH中的输入的文本存到另一个文本文件!
答:FLASH自己不行!需要与其他软件联合编程来完成。比如:ASP,PERL。
95。问:经常听到别人说到路径,到底FLASH中的路径起到一个什么作用?
答:如果你用过DOS,您就可以很容易理解FLASH的路径。简单地说,路径就是在FLASH编程时能够找到变量或者符号(symbol)所经过的路。其方式跟D OS一样,分成相对的和绝对的两种。
可以看一看下面两个地址中介绍的内容: 202.106.124.57/~eastecho/fbbs/Forum7/HTML
/00000 9.html 202.106.124.57/~eastecho/fbbs/Forum2/HTML/00052 5.html
96。问:flash编程用什么工具软件较好
答:用ActionClip1.4,你先在任何一个文本编辑软件中写完程序之后,将程序部分COPY至剪贴板,然后运行ActionClip将之转化,然后到f lash中将之PASTE便可。这个工具很小巧,在闪光地带(http:/zippy.yeah.net)有一个更好一点的工具Flash Action Tool Beta2 注册版下载,支持所有的FLASHW命令,可生成一些简单的程序。
97。问:将.fla文件转成.avi文件文件的方法
答:可以转成mov格式,没办法直接转成avi,可以通过转成gif序列,再经过其它软件转成avi(比如premiere)
98。问: 如何在本机上测试LOADING?
答: 在播放(Test Movie)时,再次按Ctrl+Enter,或者是选择菜单View>Show Streaming还可以打开Bandwidth Profiler
99。问: Flash5中,怎样才能消除导入图像的锯齿?
答: 请用BMP图象或矢量图。由于点阵问题,所以你在导入图象之前先看看这个图的像素有多大,然后将它转为BMP格式后,再到FLASH中用"modify-->trace bitmap"命令优化图象!
100。问: 请问如何在每次刷新页面时随即显示几个不同的 SWF 中的某一个动画?
答: LoadmovieNum("movie"+random(5)+".swf")
假设有6个swf,分别命名为
movie0.swf,movie1.swf,……movie5.swf
像上边那样,每刷新一次,出现的界面就可能不一样。
101。问: 如何屏蔽按钮BUTTON的手型,我只要箭头!
答: 可以使用mouse.hide();,然后再用startDrag命令让一个箭头形的MC被拖动就可以了。
102. 问:如何让一个MC调用另一个MC里设置的一个变量?
在mc里输入此语句:(a b 均为变量名,mcname为mc的实体名)
a = _root.mcname.b;
此语句是使本mc的变量a调用_root.mcname这个mc里的变量b
103.问: 在Flash中如何打开Word文档?
Flash不支持调用Word文件,但浏览器可以直接打开.doc文档,那么就用getURL来解决即可,路径用绝对地址http://www..../word.doc
104. 问:在Flash中如何调用mpeg文件?
Flash中不支持调用mpeg文件,首先要安装一个三方软件,名字为Swiffcanvas1.0;接着打开fla文件,如果mpeg文件的目录为aa,mpeg文件名字为bb,那么就可以就添加下面的语句:
FS Command ("exec", "SwiffEXEC(LOCAL:aaa\111.mpeg) ");
然后把fla文件输出为exe文件 ,并用Swiffcanvas打开这个exe文件,然后在Swiffcanvas里设置完成自己的要求。最后再输出为.exe文件,就可以了。
105。问: 在Action的编辑窗口中怎么输入中文?
可以更换Flash的字体,也就是删除Windows\Fonts\Modern.fon,这样,编辑窗口的字体就好看多了。
105.问: Flash如何与数据库连接?
答:只能通过后台文件,如CGI脚本,Active Server Pages (ASP),或 Personal Home Page (PHP)等。传递值到flash中,实现数据库的操作。
106. 问:在用FsCommand中可以调用java吗?
答:FsCommand可以调用JS函数MovieName_DofsCommand装入Flash动画。MovieName是Flash动画的名字由 Embed标签的Name属性或是Object标签的ID属性指定,如果FlashPlayer的名字为MYMOVIE,应该调用JS函数名字为 MYMOVIE_DOFSCOMMAND。
107。问:如何学习Flash(阿文)
bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=14205&h=1&bpg=1&age=-1
108。问:如何实现FLASH背景颜色的随机变换 (erik168)
bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=16519&h=1&bpg=1&age=-1
109:问:Flash 5.0 Actions 一览! (djsgh)
答:http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=7607&h=1&bpg=1&age=-1
 110。问:如何制作动作连贯的小黑人(拾荒)
答:http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=35539&h=1&bpg=1&age=-1
111。问:初学者如何人打好ACTION基础(小晶)
答:http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=15164&h=1&bpg=1&age=-1
112。问:如何实现画中画效果(木桫椤)
答:http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=7552&h=1&bpg=1&age=-1
 
113。问:FLASH如何与后台连接?[源码]
答:使用LoadVars()对象的sendAndLoad()方法来发送和接收数据
114。问:如何实现声音的暂停/播放效果?
答:在执行stop()命令时可以用sound对象的position属性取得当前声音文件的播放时间(
毫秒),然后用start(time,loop)在当前位置播放即可。
115。问:如何定义二维数组?
答:下面定义一个20*20的二维数组,值全部为0
sarray = [];
for (var i = 0; i<=19; i++)
sarray[ i] = [];
for (var j = 0; j<=19; j++) {
sarray[ i][j] = 0;
{}
}
116。问:如何打开指定属性的窗口?[源码][/color]
答:先JS在HTML页面中定义函数,然后在FLASH中用getURL()调用
117。问:如何通过MC中的按钮跳转场景?
答:在要跳转的桢上加标签,通过标签跳转:gotoAndStop("yourlable")
118。问:如何随机设置MC颜色?
答:MC实例名为"mc"
mycolor=new Color("mc")
mycolor.setRGB(random(0xffffff))
119。问:如何实现双击效果?
答:把下面的代码放到按钮上:
on (press)
time = getTimer()-down_time;
if (time<300) {
trace("ok");
{}
down_time = getTimer();
}
(turbine)
120。问:如何使MC始终跟随鼠标旋转

答:先计算MC横纵坐标与鼠标横纵坐标的差值,然后用Math.atan2()来计算旋转角度。
m_x = _root._xmouse-mc._x;
m_y = _root._ymouse-mc._y;
mc._rotation = PI=180/Math.PI*Math.atan2(m_y, m_x);

121。问:如何做鼠标跟随效果
答:基础代码如下,a为步长
mc._x+=(_root._xmouse-mc._x)/a
mc._y+=(_root._ymouse-mc._y)/a
(turbine)
122。问:如何在AS中创建类的继承?
答:创建一个MC的继承类
myClass=()
……
{}
myClass.prototype = new MovieClip();
(turbine)
122.问:能否详细讲解loadmovie
答:loadmovie的问题,然后就是加载之后属性的设置。。
loadMovieNum(url,level,method);
url 就是你要加载的SWF文件的相对或绝对URL. 如"snow.swf"或"http://go8.163.com/6s
now9/myflash/snow.swf",强烈建议把要加载的swf都放在同一目录下
level指定被加载的swf放入到哪个层级(level)里,范围为0---n吧   


 

FLASH实用代码大全

外部调用swf
on (release) {
loadMovieNum("service.swf", 1);
}
外部调用数据
loadVariablesNum("about.txt", 0);
System.useCodepage = true;//中文
音乐加入
mySound = new Sound();
mySound.attachSound("1");
mySound.start();
关闭指定音乐
mySound.stop("1");
外部调用音乐
mySound=new Sound();
mySound.loadSound("music.mp3",true);
mySound.start(0,100)
关闭音乐
mySound.stop();
链接场景:
on (release) {
gotoAndStop("猫的历史",1);
}
清空文本框
_root.text=""
On(Release)
  Set Variable:"input" = ""
  Set Variable:"output" = ""
  End On

轻松实现Flash的全屏播放
  许多人都看过这样的效果:把光盘放入光驱后,光盘自动运行,接着便是一段Flash制
作的开场动画,动画是全屏播放的,且右键点击无效,动画播放结束后,出现“关闭”按
钮,单击该按钮后,全屏动画关闭。
  其实上面提到的全屏播放以及取消右键菜单等效果都是靠Fscommand指令在发挥作用。
Fscommand指令主要是用来控制Flash影片播放器的,但也可以用来打开其它的应用程序。
Fscommand指令只有在Flash影片播放器执行时才有效(.swf和.exe),在Flash制作过程中,按“Ctrl+Enter”预览动画,以及把动画发布成网页文件时,此指令无法发挥它的功能。
  Fscommand指令使用的语法是:Fscommand("command","arguments")�
  Command是指令的相关命令,arguments是命令的参数。
  下面我们就来讲讲如何通过Fscommand指令来实现全屏播放、取消Flash播放时的右键
菜单以及关闭Flash动画。
  1、全屏播放Flash
  “Fullscreen”是全屏的意思,在默认的情况下,Flash动画不是以全屏播放(false
),如果需要让动画以全屏状态播放,就必须把Fullscreen命令设置为True,写为:
  Fscommand ("Fullscreen","True");
  根据需要,我们可以把它写到帧、按钮、MC(Movie Clip)中。
  2、取消右键菜单
  Showmenu命令是用来设置是(True)否(false)显示Flash动画播放器的快捷菜单的
全部指令,即右击鼠标时弹出的菜单,默认为True,如果要取消弹出的菜单,必须在第一
帧这样设置:
  Fscommand ("showmenu","false");
  3、关闭动画
  quit命令是用来关闭播放器的.swf和.exe文件,该命令没有参数,写为:
  fscommand ("quit");
  如果你想在flash动画结束时出现一个关闭动画的按钮,可以按下面的步骤做。
  执行“Insert”下的“New Symbol”(或按Ctrl+F8),在弹出的窗口中选Button,然
后制作一个简单的按钮,回到场景中,选中最后一帧,从“Library”中把刚刚建立的按钮
拖到场景中,因为该按钮在动画的最后才显示。
  给按钮写上如下代码,则实现按下按钮即关闭flash动画。
  on (release)
   {
    fscommand ("quit");�
  }

一、几种Action命令
1.影片的播放与停止:
Play( );//播放命令 stop( );//停止命令
2.改变流向命令
gotoAndPlay() //跳到指定的画面并连续播放。
gotoAndStop() //跳到指定的画面并停止播放。
gotAndplay(“场景名称”,)//跳到指定场景帧并连续播放。
gotoAndStop(“场景名称:,frlme)//跳到指定场景帧并停止播放。
next( );//跳到下一帧播放;
PrevPrame( );//跳到上一帧播放。
3.控制影片剪辑的播放与停止:tellTarget命令
如:tellTarget(“C1”)
{gotoAndStop(2);}//跳影片剪辑实例C1的第2帧并停止。
二、几种功能元件的制作方法
1.计时器的制作
单击菜单Insert/new symbol,在弹出的对话框中输入插入的符号名称(如:计时器),确
定后选择文字工具,属性为动态(Dynamic text),在第一帧中画两个文本框。分别设置变
量名为munite和timer,在两个文本框之间画一个形如冒号的圆点(这两个圆点可以做成一个
符号,类型为电影片段,每秒闪动一次.然后拖入到两文本框之间。在第二帧插入帧。在
第一帧输入动作脚本(Action)如下:
//设置时间的初值
if(!started) {
start_time=getTimer();
started=true;
timer=0;
i=o;
munite=0;
}
x=getTimer()-start_time;//计算时间的变化
x=int(x/1000); //时间的单位为1000分之一秒
y=x-60*i
if (y>59)
{i=i+1;munite=munite+1
timer=timer+1:
}
else
{timer=y}
该符号制作完毕后。将其拖入主场景中即可。
2.智能判断速择题,并作正误提示
单击菜单Insert/new symbo1,在弹出的对话框中输入插入的符名称。如:“对错提示”。
符号类型为“电影片段”。在第一帧输入文本“在括号内输入答案,按enrer键确定“ 在
该帧上输入动作脚本:
_root.flah=false;_root.ans=" ";gotoAndStop(1);在第16帧插入空关键帧。在该帧上
画一个形如“x”的图或输入文本“x”,在第30帧插入关键帧,帧AAction为_root.ans="
 ":gotoAndStop(31);在第31帧插人空白关键帧,在该帧上输人静态文本“请重作,按e
nter键确定。“在该帧输入脚本:“stop();”至此,该符号制作主或:例如:
第1题:1十1十( )
A.2 B.3 C.4 D.0
在上例括号位置插入动态文本框,不输入任何内容。该文本框变量名为:ans。在该帧适当
位置插入电影“对错提示”,该电影片断名属性为“ql”,在该电影片断上输人脚本:

//键盘事件控制程序
onClipEvent(keyDown)
}
//取得按键的键值
keycode=Key.getCode();
//判断是否为Enter键
if(keycode==Key.ENTER) {
//判断输入的答案是否正确
//answer=Number(A)
if(_root,ans=="A" or _root.ans=="a"{
//显示“答对了”信息
tellTsrget(_root.q1) {
gotoAndPlay(2);
}
} else {
//显示“答错了”信息
tellTarget(_root.q1) {
gotoAndplay(16)
}
}
}
}
3.声音的加载和控制
插入一段音乐:在Pile/Import to Library中,找到要插入的音乐(如战马奔腾),打开符
号库,找到“战马奔腾”符号,单击右键,在弹出的菜单中单击Linkage…命令,再在弹出
的菜单中选中Export for ActionSc选项,在Indentify框内输入标识符:如music。
在需要播放的帧插入如下脚本:
soun=new Sound();//创建声音实例
sound.attachSound("music");//将音乐music链接到sound实例
sound.start(0,2);//播放音乐2遍
sound.setVolume(70):该音乐的音量为70%。
以上加载音乐通过帧加载,也可以通过按钮加载。
停止音乐的方法:制作一个按钮,在按钮上输人脚本:
on(release)
{
sound.stop();
}
4.如何用键盘控制帧的跳转
有的教师喜欢用键盘进行操作,如何使这类操作方使自如呢?用Flash MX制作的方法如下:

制作一个符号(如“知识回顾”),符号类型为“电影片段”。在这个符号中将需要回顾的
知识点逐帧展示,每帧动作脚本为:stop()回到主场景,在需要的帧插入该符号,该帧脚
本为:stop();插入后.单击该符号.输人脚本:
onClipEvent(Key Down) {//键盘响应,按下任一键时响应该命令
next();
}
这样即实现了按任一键便可跳转到指定帧的效果。此例仅仅是一种基本方法,读者朋友在
应用时可以有更多的扩展。
5.鼠标指向显示填空题答案
显示一些问题的答案,可以将这一答案制成—个按钮,在这一按钮的Up帧可以为空白关键
帧,其它帧为答案内容。在问题的答案处插入该按钮,在该帧输入脚本:
on(release) {
gotoAndStop;//第i帧将答案固定显示在屏幕上

flash场景之间相互跳转的实现方法


在制作flash动画的时候,可能会有有很多的mc
有时会把它放到几个场景中,那么在场景中的跳转如何实现呢?
1.
方法一:(使用telltarg...
方法一:(使用telltarget命令)
按钮上的as为:
on (release) {
tellTarget ("/") {
gotoAndPlay ("场景 1", 1);
}
}
2.
方法二(用gotoandpla...
方法二(用gotoandplay命令)
主场景2中的mc放到场景2的时间轴上
按钮的as: 
on release {
gotoAndPlay("场景1",1)
}
并且在最后一帧加stop()
问题就可以解决了:
3.
方法三(利用路径_root.g...
方法三(利用路径_root.gotoandplay())
第二个场景2里面只有一个mc,在这个mc的最后一帧是stop和一个replay按

按钮的as:_root.gotoAndPlay(1)
【即告知按钮回到场景1的第一帧】

4.
方法四(给场景起不同的名字) ...
方法四(给场景起不同的名字)
如果你的as这样写:
第二个sence里面只有一个mc,在这个mc的最后一帧是stop和一个repl
ay按钮
按钮的as: 
on release {
gotoAndPlay("sence1",1)

结果按下后却是从这个mc的第一帧开始播放,而不是从sence1的第一帧
这是因为主场景的名字默认为senceN
MC里也可以有多个场景,而mc也是默认为senceN
所以当你在MC用上gotoAndPlay ("scene1", 1);时,指的是所在场景中MC里的第一帧,而
不是主场景
解决的方法,就是给场景定义不同的名字
scene1我们改名为:主场景
scene2我们改名为:次场景1
正确的as应该为:
on (release) {
tellTarget (_root) {
gotoAndPlay (1);
}
}
如果想实现按钮点击后从次场景播放就可以在按钮上写上:
on (release) {
tellTarget (_root.次场景) {
gotoAndPlay (1);
}
}
5.
方法五(利用标签label) ...
方法五(利用标签label)
我们在控制动画的时候一般也不是从开始播放, 可能是希望从某个场景的某一个关键帧开
始播放,那么标签是
最好的实现方法;
例如我们希望点击上面的按钮的时候让动画从主场景中的label1开始 播放,那么按钮上的
as应该为:
on (release) {
tellTarget (_root) {
gotoAndPlay ("label1");
}
例如有3个场景,我们希望点击上面的按钮的时候让动画从次场景1中的label4开始播放,
那么按钮上的as应该为:
on (release) {
tellTarget (_root) {
gotoAndPlay ("次场景 1", "label4");
}
}
}
}
如果想实现按钮点击后从次场景播放
就可以在按钮上写上:
on (release) {
tellTarget (_root.次场景) {
gotoAndPlay (1);
}
}

3,什么叫矢量图?
矢量图可以任意缩放而不影响Flash的画质,位图图像一般只作为静态元素或背景图,Fla
sh并不擅长处理位图图像的动作,应避免位图图像元素的动画。
4,如何迅速地对齐不同中的物件?
用 Inspector “Ctrl+Alt+I” 直接输入坐标。
或是工具栏〉〉窗口〉〉面板〉〉排列“Ctrl+K” 调出排列面板来。图例
5,怎样调节一个Symbol/MC地透明度?
选中Symbol/MC,菜单栏找到Modify(修改) 〉〉 Instance (实例)〉〉Color effect (效果
)〉〉 Alpha(透明度) 调整就可以了
6,做好地Flash放在html上面以后,它老是循环,怎么能够让它不进行循环?
最后一个祯地Action设置成Stop(停止)
7,怎样给我的FLASH做一个预加载地LOADING?
用Action语法地if is loaded来实现,新建一层,这层专门放Action,
第一帧,
ifLoaded ("场景", ) //假如场景中地祯数已经载入
goto and play() //跳至并播放某某祯(自己设定)
{}
第二帧,
goto and play("场景1", 1)//跳至并播放第一祯循环
再加上一个load地MC循环播放在这两帧的中间,就OK了。

8,怎样点击一个按钮打开一个页面html而不是一个祯.
制作一个按钮,上面地AS直接写:
on (release)
getURL ("***.html");
{}
这里地***.html就是你要打开地页面文件名,当然也可以是某某URL地址,比如说http://www.flash8.net
9,我在按钮地OVER祯放置了一个很大地MC,为什么我要没有点击到按钮鼠标就变成了手地状态?
按钮真正激活区是在HIT(按下)祯地位置,如果想控制按钮的位置为一定值,可以在HIT祯绘制一个透明地图形来判断.
10,如果屏蔽鼠标右键?FS命令都是什么意思?
fscommand ("fullscreen", "true/false");(全屏设置,TRUE开,FALSE关)
fscommand ("showmenu", "true/false");(右键菜单设置,TRUE显示,FALSE不显示)

fscommand ("allowscale", "true/false");(缩放设置,TRUE自由缩放,FALSE调整画面
不影响影片本身的尺寸)
fscommand ("trapallkeys", "true/false");(快捷键设置,TRUE快捷键开,FALSE快捷键
关)
fscommand ("exec");(EXE程序调用)
fscommand ("quit");(退出关闭窗口)
11,在FLASH中的字体总是很模糊,用变清晰地办法吗?
写好文本以后CTRL+T打开文本设置面板,在最后地文本框选项那里框选使用设计字体就行了.(注意最好使用宋体,尺寸为12或者8,这样比较工整)
12,我想做一个MTV,怎么导入声音呀?
很简单,CTRL+R导入你地声音文件就行了.
13,我制作地MTV声音和歌词总是不同步.
CTRL+F打开祯控制面板,右边找到声音选项卡,调整声音地同步效果为STREM(音频数据流)模式就行了.
16,怎样可以做出很漂亮地字体特效?
用第三方软件Swish和Swfx这些,闪吧地软件资源有下载.
19,如何加载一个SWF文件
添加一个空地MC。实体名为ok,

ACTION: loadMovie("dr/test.swf", "_root.ok");
控制这个MC的位置,大小等相对属性(Property)就会影响调入SWF的位置和大小。
setProperty ("mc", _xscale, "****");
setProperty ("mc", _yscale, "****");
setProperty ("mc", _x, "****");
setProperty ("mc", _y, "****");
setProperty ("mc", _Alpha, "****"); ............
20,如何导入一个背景透明度效果比较好地位图?
推荐使用PNG格式(FIREWORK),FLASH对PNG位图地融合透明效果支持相当好。
21.问: 如何用action将页面设为首页和加入收藏夹?
答: 一,用getURL的方法:
设为首页:
on (release)
getURL(";void links[0].setHomePage('http://www.flashempire.com/);", "_se
lf", "POST");
{}
加入收藏夹:
on (release)
getURL(" external.AddFavorite('http://www.flash8.net,'闪
吧');", "_self", "POST");
{}
二,用fscommand的方法,有点复杂
1,先在flash的按钮上添加代码:
首页:
on (release)
fscommand("setHomePage", "http://www.flash8.net);
{}
收藏夹:
on (release)
fscommand("addFavorite", "http://www.flash8.net|闪吧);
{}
然后在发布设置中选择flash with fscommand,发布成html
2,修改html:
找到
// Handle all the the FSCommand messages in a Flash movie
sethomepage_DoFSCommand(command, args)
{}
这一段,修改成:
// Handle all the the FSCommand messages in a Flash movie
sethomepage_DoFSCommand(command, args)
var sethomepageObj = InternetExplorer ? sethomepage : sethomepage;
if (command == "setHomePage") {
links[0].style.behavīor = "url(#default#homepage)";
links[0].setHomePage(args);
{} else if (command == "addFavorite")
args = args.split("|");
external.AddFavorite(args[0], args[1]);
{}
}
最后,如果html里一个链接都没有,还需?lt; LANGUAGE=java>这句的前面添
加一句<a href="/"></a>
22.问: 怎么让动画放完后自动关闭?
答: 在最后一桢的ACTION里选FSCOMMOND一项,然后在右边选中QUIT,就可以了
24。问: 如何在Flash中打开一个定制的浏览器新窗口?
答: 这个问题,很常见,也讨论过无数次,以前的一些有用的帖子找不到了,现在重新整理如下:
常用也是很简单的方法是用类似
Get URL (";")
这样的一句,但有很多问题,比如打开了新窗口后,原窗口的内容也被替代了。
1、在Flash中需要执行打开新窗口动作的地方插入以下语句:
FS Command ("open_window", "filename.htm;newwin;toolbar=no,location=no,status=
no,
menubar=no,scrollbars=no,resizable=no,width=320,height=200")
其中Arguments:
filename.htm 要打开的文件名
newwin 新窗口的名字
toolbar=no,location=no,status=no,
menubar=no,scrollbars=no,resizable=no,width=320,height=200 新窗口的有关属性,包括尺寸 注意以上三部分要用分号";"分隔
2、在File>Publish setting...中设定
HTML中的Tempalte : Flash with FSCommand
发布
3、编辑发布生成的html文件,找到以下一段:
code:< LANGUAGE=java>
<!--
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
// Handle all the the FSCommand messages in a Flash movie
Movie1_DoFSCommand(command, args)
var Movie1Obj = InternetExplorer ? Movie1 : Movie1;
//
// Place your code here...
//
{}
...

改为:
code:< LANGUAGE=java>
<!--
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
// Handle all the the FSCommand messages in a Flash movie
Movie1_DoFSCommand(command, args)
var Movie1Obj = InternetExplorer ? Movie1 : Movie1;
// Place your code here...
if (command == "open_window")
{
arg_array=args.split(";");
open(arg_array[0],arg_array[1],arg_array[2]);
{}
}
...

OK!
如果是插入现有的html页,可以先发布,再copy相应的代码到html文件。
25。问: 如何用action控制倒放?
答: 做一个mc放在合适的地方,里面有两帧
第一帧:
If (GetProperty ("/a",_current)<=1)
Begin Tell Target ("/a")
Go to and Stop (GetProperty ("/a",_totals))
End Tell Target
Else
Begin Tell Target ("/a")
Go to and Stop (GetProperty ("/a",_current)-1)
End Tell Target
End If
第二帧:
Go to and Play (1)
这样就可以让/a倒放
但是还有一个问题无法解决:
如果我只想停一段呢?[/color]
比如说,我在第十个关键帧处加了一个STOP,在第三十个关键帧处加了一个STOP,现在想
倒到STOP处停下来,却没有办法做到。
If (GetProperty ("/a",_current)<=1)
Begin Tell Target ("/a")
Go to and Stop (GetProperty ("/a",_totals))
End Tell Target
Else
Begin Tell Target ("/a")
Go to and Stop (GetProperty ("/a",_current)-1)
End Tell Target
End If
第二帧:
Go to and Play (1)
这一段肯定放在一个mc 里,
假设这个mc为/b
在/a需要停止的帧理设置
Begin Tell Target ("/b")
stop
End Tell Target
stop
就可以了
26。问: 内部声音角色与外部声音角色有何差异?
答: 没什么太大的区别
外部文件如果导如的话可以降低文件的大小
在发布的时候或者做成光盘的时候需要和DCR文件一起走,并且始终保持相对路径不变

还有一个流式播放的问题
如果导入的声音文件过大就会影响同步效果,声音滞后。(因为Director在播放内部声音
之前就将其预栽到RAM中)外部声音文件是流式的,一边播放,一边下载。但要注意连接路
径问题。
27。问: 如何使声音无限循环?
答: 将声音的循环次数定义成足够大,如果你的音乐设为STREM(音频数据流)那你的swf文
件也会足够大。
28。问: 如何控制声音的播放及停止
答: 在library 里右健点击声音文件,选linkage…
设置Export This Symbol
entifier:
取名为"sound"
然后就可以在stage里面设置了
s = new Sound();
s.attachSound("sound");
要让声音sound关掉只须
执行:
s.stop();
要让他开始播放就是
s.start();
29.问: 如何调入SWF文件及控制它的大小和位置?
答: 一、如何调入一个SWF文件:
调入一个SWF置给一个层loadMovieNum ("path/movieFile.swf", 0);
其“path/movieFile.swf”为要调入文件的地址,“0”为层号,“0”为第0层;
调入一个SWF置给一个MC
loadMovie ("path/movieFile.swf", "MC_Name");其“path/movieFile.swf”为要调入文
件的地址,“MC_Name”是MC的名字。
二、如何改变调入后的SWF大小:
setProperty ("MC_Name", _xscale, size_x);
setProperty ("MC_Name", _yscale, size_y);
“MC_Name”顾名思义是那个MC的名字了,“_xscale”和“_yscale”是指这个MC的X与Y点
的位置,这个位置是用来控制MC大小的。其“size_x”和“size_y”为设定这个MC具体大小的数值。
三、如何改变其位置:
一个简单的方法是,我们可以来移动那个已给置入MOVIE文件的MC,就像我们用来改变一张
图的位置那样用鼠标拖动它。
另一个方法是利用setProperty来进行改变这个MC的位置。
setProperty ("MC_Name", _x, "position_x");
setProperty ("MC_Name", _y, "position_y");
“MC_Name”是MC的名字,“_x”和“_y”指的是X坐标和Y坐标点,而“position_x”与“
position_y”是位置具体的数值。

30.问: 如何优化Flash动画,使文件更小,播放更流畅?
答: Flash作为Macromedia公司出品的网页制作与动画创作的专业软件,操作简便,功能
强大,现已成为交互式矢量图形和Web动画事实上的标准。
  但是,如果制作的Flash电影文件较大,动辄几百k的话,常常会让网上浏览者在不断
等待中失去耐心。对Flash电影进行优化就显得很有必要了,但前提是我们不能有损电影的
播放质量。
  1.多使用符号(Symbol)。如果电影中的元素有使用一次以上者,则应考虑将其转换
为符号。重复使用符号并不会使电影文件明显增大,因为电影文件只需储存一次符号的图
形数据。
  2.尽量使用渐变动画。只要有可能,应尽量以“移动渐变”(Create Motion Tween
)的方式产生动画效果,而少使用“逐帧渐变”(-By-)的方式产生动画。
关键帧使用得越多,电影文件就会越大。
  3.多采用实线,少用虚线。限制特殊线条类型如短划线、虚线、波浪线等的数量。由
于实线的线条构图最简单,因此使用实线将使文件更小。
  4.多用矢量图形,少用位图图像。矢量图可以任意缩放而不影响Flash的画质,位图
图像一般只作为静态元素或背景图,Flash并不擅长处理位图图像的动作,应避免位图图像
元素的动画。
  5.多用构图简单的矢量图形。矢量图形越复杂,CPU运算起来就越费力。可使用菜单
命令Modify (修改)/Curves(曲线)/Optimize(优化),将矢量图形中不必要的线条删
除,从而减小文件。
  6.导入的位图图像文件尽可能小一点,并以JPEG方式压缩。
7.音效文件最好以MP3方式压缩。MP3是使声音最小化的格式,应尽量使用。
  8.限制字体和字体样式的数量。尽量不要使用太多不同的字体,使用的字体越多,电
影文件就越大。尽可能使用Flash内定的字体。
  9.不要包含所有字体外形。如果包含文本域,则应考虑在Text Field Properties(
文本域属性)对话框中选中Include Only Specified Font Outlines(只包括指定字体外
形),而不要选择Include All Font Outlines (包括所有字体外形)。
  10.尽量不要将字体打散(菜单命令为Modify / Break Apart)。字体打散后就变成
图形了,这样会使文件增大。
  11.尽量少使用过渡填充颜色。使用过渡填充颜色填充一个区域比使用纯色填充区域
要多占50字节左右。
  12.尽量缩小动作区域。限制每个关键帧中发生变化的区域,一般应使动作发生在尽
可能小的区域内。
  13.尽量避免在同一时间内安排多个对象同时产生动作。有动作的对象也不要与其它
静态对象安排在同一图层里。应该将有动作的对象安排在各自专属的图层内,以便加速Fl
ash动画的处理过程。
  14.用Load Movie命令减轻电影开始下载时的负担。若有必要,可以考虑将电影划分
成多个子电影, 然后再通过主电影里的Load Movie、Unload Movie命令随时调用、卸载子
电影。
15.使用预先下载画面。如果有必要,可在电影一开始时加入预先下载画面(Preloader)
,以便后续电影画面能够平滑播放。较大的音效文件尤其需要预先下载。
  16.电影的长宽尺寸越小越好。尺寸越小,电影文件就越小。可通过菜单命令Modify
(修改)/Movie(电影),调节电影的长宽尺寸。
  17.先制作小尺寸电影,然后再进行放大。为减小文件,可以考虑在Flash里将电影的
尺寸设置小一些,然后导出迷你SWF电影。接着将菜单File(文件)/Publish Settings…
(发布设置…)中HTML选项卡里的电影尺寸设置大一些,这样,在网页里就会呈现出尺寸
较大的电影,而画质丝毫无损、依然优美。
  在进行上述修改时,不要忘记随时测试电影的播放质量、下载情况和查看电影文件的
大小。

2009年7月22日星期三

日全食观测方式大全

1.用电焊护目镜看

电焊护目镜本就是在强光下保护眼睛的,用它直接看太阳就可以。

优点:拿来就能用。

缺点:不好找,还很重,很容易就拿累手了。

2.用废胶片看

把新买的胶片完全曝光,两片以上的胶片叠在一起看太阳。

优点:较为简便,好像有点浪费。

缺点:手拿胶片很累。

注意:一定要两片以上,不然还是很危险!

3.用烧黑的玻璃片看

用蜡烛把玻璃片烤黑,可以用来对着看太阳。

优点:无。

缺点:玻璃片不好找,需明火,未全烤黑仍危险,最好有蜡烛。

注意:出现在玻璃上的黑色物质是燃烧不充分的炭粒,煤气、天然气燃烧得很充分,不产生这种物质。

4.用水盆看


在水盆里滴适量墨汁,搞成黑水,借太阳的倒影看日食。

优点:简便,安全。

缺点:水会波动,观赏效果较差,还要找水盆和墨水。

5.小孔成像法


两张白纸,一张白纸上穿一个整齐的圆形小孔,一张对着太阳,一张放在小孔后面,让太阳光通过小孔在另一张白纸上成像。

优点:仅用手拿图像不稳定,不便于观察,建议用支架支撑两张硬纸。

6.树荫观察法

在日食的时候,树荫的缝隙就会成为天然的小孔,在树荫底下的小亮点都是太阳的小孔成像,在日食的过程中,你可以看到那些小亮点由圆到亏,每一个小亮点都是一个小小的日食影像,地上,你的胳膊上,旁边散步的狗狗身上,全是这些小小的日食影像。

7.用日食眼镜看

淘宝上很多日全食眼镜出售。

8.望远镜投影法


手可不要乱晃,否则太阳的影子会来回跑。并且千万不要拿着望远镜直接看太阳,如果用望远镜直接看太阳,一定要用滤光镜。

9.用照相机看

注意,如果没有滤光片,直接从取景框中观察日食也会伤害眼睛,千万不要尝试。拍摄的时候最好使用三脚架,如果要拍到清晰的日食图像,还需要望远镜头。

10.另类方法:用耳朵听日食

因为日食时地球电离层会发生很大变化,所以通过短波业余电台信号强度的变化可以“听”到日 食。你也可以通过一般的收音机“听”到日食:收听一个日食地区的短波广播电台,“听”日食,最理想的是从陕西省蒲城发射的国家授时中心BPM标准时间标准 频率信号,频率是2.5MHz、5.0MHz。日食前后,它的声音会突然增大或减小。不过这种方法对一般人没什么意思,对专业人士也不会使用。

(本文来自www.riquanshi.org)

 

2009年7月2日星期四

20年嵌入式领域开发经验精华(慢慢看,新人会发现提高很快)(转)

来源:www.armjishu.com
作者:jesse
转载请注明出处

      我写这篇文章的目的,是用本人20年的嵌入式经验来告诉大家,没有明确的目标,成功将无从谈起。做任何事的第一步必须明确目标。

    与日常生活中的大多数事务一样,设计一个嵌入式产品的过程也必须从确定目标开始,对生产的产品进行明确定义。对产品进行定义主要是对产品是什么和能有什么功能进行描述,其次是在我们的整个开发过程中,应该要撰写一些开发文档,大概的框架的如下:

1)产品需求文档:描述产品的特性
2)功能需求文档:描述产品必须具备的功能
3)工程说明文档:描述系统实现的方法和满足需求的手段
4)硬件说明文档:对有关硬件进行描述
5)软件或固件说明文档:描述特定处理器下设计微程序以及固件的方法
6)测试说明文档:描述必须测试的项目和验证系统正常运行的方法

1.需求定义

    需求定义用来描述产品的基本功能,对于公司来说,需求一般由该公司的市场销售部门或该公司的主要客户来制定;而对小公司或爱好者(就像armjishu.com里的爱好者一样),技术人员可以自己负责定义需求,并撰写成文档。

通常需求定义是围绕以下几个因素而来:

1)系统的用途(定义需要系统实现的各种功能)

2)实际输入输出是何种方式实现的(为元器件的选型做参考)

3)系统是否需要操作界面(涉及软件层操作系统的选型)

    其实对小型的嵌入式产品来说,定义需求是非常关键的,因为需求清楚了,就可以避免后续开发过程中出现的诸如随机存储器(RAM)容量不足或所选的CPU速度不能满足处理的需要等一系列问题。

----------------------------------------------------------------------------------------------------------
下面举个简单的实际例子,供大家来参考:

系统描述:用于从化温泉的水泵换水系统
电源输入:使用来自于变压器的9V~12V直流电
水泵功率:375W
1)使用单相交流电机,由机械电气进行控制
2)如果温泉池处于低水位,则输入开关闭合信号,以禁止水泵继续运行
3)用户可以自由设置水泵运行或关闭的时间长度
4)除了自动设置控制外,还需要提供一种人工装置来允许维护人员灵活控制水泵进行维修
5)水泵开启/关闭/人工干预的时间可以30分钟为单位,在30分钟到23小时的范围内进行调节
6)显示设备可以指示水泵的开关状态,剩余时间,以及水泵是否处于人工干预模式
7)具备监视低水位的功能,并显示在屏幕上

    如果需要商用,那么除了上面给出的功能要求外,其设计文档中还要包括电磁干扰(EMI)和电磁兼容性(EMC)认证、安全认证以及使用环境(包括环境温度、湿度、盐雾腐蚀等)等方面的需求。

实际上,以上的需求确定之后,接下来就是要考虑选择一款合适的CPU来满足和实现系统的功能,那么我们就要将上述7点用户能够理解的需求转化成我们专业领域的需求,转化如下,大家可以参考一下:

a.处理或更新输入输出信号的速率究竟需要多快?
解释:目前嵌入式处理器的主频一般都在几十兆到几百兆不等,单片机的主频一般是几十兆,ARM处理器可以到几百兆;我们主要看这个产品是否需要对大量数据 进行处理,或是否需要对缓冲区进行频繁操作,是否有类似的占用CPU资料的工作要做,这就决定我们要选择一款合适的处理器来让该产品得到最佳的性能。

b.是否可使用单片集成电路(专用IC)或FPGA来完成数据处理?
解释:如果可以的话,就不一定要选择处理器来做,用这些专业芯片就能替代

c.系统是否有大量的用户输入输出操作(如对开关和显示设备进行频繁操作)?
解释:如果有的话,要在处理器选型的时候考虑这些因素,选择一款能够满足以上要求的CPU

d.系统与其他外部设备之间需要使用何种接口?
解释:这也是需要评估处理器的一个关键问题,选择具备这些接口功能的处理器会方便于我们的电路设计以及软件编程

e.设计完成后是否有可能需要进行改动,或在设计过程中系统需求是否可能出现变化?我们的设计是否能适应系统需求的变化?
解释:要避免选择的处理器刚好满足当前要求,这样当以后事务要求逐渐提高,处理器性能如果还有一定空间的话,那么就可以重用目前的产品;第二个就是要选择 不会即将停产的芯片,很多处理器用得很广乏,可以借鉴的资料也很多,但是很可能这款芯片已经在市场上流行很长时间了,芯片厂商已经推出更新换代的替代品 了,如果你选择了这款芯片,很可能1,2年后就买不到这款处理器芯片了,导致不得不重新选择新的处理器,重新设计产品,这样的既耗费时间,金钱,更消耗人 力,延误市场的战机。
----------------------------------------------------------------------------------------------------------

2.处理器的选择

1.1.需要使用的I/O管脚数量

  多数处理器都是使用内存和外部管脚来控制输入输出设备的,通常处理器都会有内置ROM和RAM的,如果内置的内存就已经满足需要,那么处理器就可以节省产 生引用外部存储器信号的引脚,这样处理器可为输入输出提供较多的设备管脚(某些处理器支持外部RAM或ROM的使用,但对外部存储器进行访问时,处理器一 般需要占用8条到10条I/O管脚)。

  还有,有些处理器带有专用的内部定时时钟,这类时钟也需要使用一个端口管脚来实现某些定时功能;某些处理器中还具有漏极输出和高电流输出能力,可以方便的直接驱动继电器或电磁铁线圈,而不再需要额外驱动硬件的支持。

  当对处理器I/O管脚进行计数时,我们一定要把使用处理器内部功能(如串行接口和定时器等)时限制使用的某些管脚考虑在内。

1.2.需要使用的接口数量
 
  嵌入式处理器的主要功能是与应用环境中的硬件进行交互操作,这不仅需要外部硬件对接口具有实时处理能力,而且还要求处理器必须以足够快的速度对接口数据进行有效处理。

  举例来说,AT91RM9200是ATMEL公司出品的一款工业级ARM9微处理器,它基于ARM920T核心,处理速度可达200MIPS,同时处理器 内部配置了USB、Ethernet 、支持RS485的红外串口、IIC、SPI、SSC等输出接口,其目的是更方便的利用这些接口开发出嵌入式产品。

  需要注意的是,由于许多处理器具有的局限性没有在处理器技术资料中给予足够的说明,因此一定要仔细阅读处理器的指标说明。例如,在阅读资料的过程中发现, 该资料可能会说明其串行接口可以在最高波特率下工作,但仔细研究该处理器的指标数据时,可能会发现并非该串口接口的所有操作模式都可以在最大波特率下运 行。

  深入了解并明确接口要求的方法:可以自己动手编写一些程序来对接口进行实际测试,以确认某种处理器是否可以满足应用的要求;因为,确认某个处理器是否可以满足接口要求并非是一件简单的任务。

1.3.需要使用的内存容量

  决定内存容量的大小是嵌入式产品设计过程中的一个基本步骤,如果对所需内存容量估计过高,那么我们就有可能会选择成本较高的解决方案;反之,如果低估了所需内存容量,就有可能因系统需要重新设计而导致项目不能按时完工。

  a.RAM和ROM的区别:存储器分为随机存储器(RAM)和只读存储器(ROM)两种。其中ROM通常用来固化存储一些生产厂家写入的程序或数据,用于 启动电脑和控制电脑的工作方式。而RAM则用来存取各种动态的输入输出数据、中间计算结果以及与外部存储器交换的数据和暂存数据。设备断电后,RAM中存 储的数据就会丢失。

  b.随即存储器(RAM)的选择:RAM容量的预测是比较直观的,我们只需把所有变量数目与所有内部缓冲区的容量以及先入先出(FIFO)队列长度和堆栈长度直接相加,就能得到所需RAM容量的总数。
    如果所需内存容量超出这类处理器的寻址范围,那么只能通过增加外部RAM来满足需求;然而,增加外部RAM的同时将会占用一定数量的I/O管脚来对扩展内存进行寻址,这种扩展往往会影响到处理器来实现应用的初衷。
    需要注意的一个问题是,某些微处理器限制RAM的使用,这种限制的目的是为了借用部分内存存储器作为内部寄存器组使用。除了以上因素外,所使用的开发语言也对所需RAM容量有一定的影响,某些效率较低的编译程序可能会占用大量宝贵的RAM空间。

  c.只读存储器(ROM)的选择:系统所需ROM的大小应该是系统程序代码与所有基于ROM的数据表容量之和。预测所需ROM空间容量比较困难的部分是预测程序代码的长度,解决这类问题的方法只能是随着经验的逐步积累来提高预测精度。
    然而,最重要的并不是精确计算程序的代码长度,而是要清楚地估算代码长度的上限。根据经验,如果80%的ROM空间被代码占用的话,那么就太拥挤了,除非能确保系统需求不会有任何变化,否则至少要为可能发生的变化保留足够的备用ROM空间。
    在多数情况下,我们可以试着在ROM中写入一部分程序代码,以便观察代码占用空间的情况,对于带有内部ROM的微处理器系统来说,系统程序都只能占用有限的程序存储器空间。

  d.经验之谈:ROM与RAM使用情况相类似,程序代码长度与所选用的开发语言有关。举例来说,使用汇编语言编制的程序要比使用C语言编制的程序占用少得多的空间。
    对于追求低成本的小型系统来说,一般不提倡使用高级程序设计语言;这是因为虽然高级语言在使用、调试以及维护方面来的比较容易,但同时这类语言需要占用更多的内存空间和大量的处理器时钟周期。
    如果开发语言选择不当,其后果可能是把一个简单、低成本的单片机系统变为一个需要使用配置若干兆字节RAM空间的64位嵌入式处理器系统。

1.4.需要使用的中断数量

  中断的主要用途是向中央处理器通报当前发生的某类特殊事件,这类事件包括诸如定时器超时事件、硬件引发的事件等。

  需要强调的是,多数系统设计师经常过多地使用中断功能,实际上,中断的主要作用只是中断现行程序的执行,中断最适用于必须要求中央处理器立即提供服务的事件。

  在需要设计和使用中断的情况下,一定要首先确认实际需要的中断数量,然后必须考虑到系统内部占用的中断资源,如果需要使用的中断资源超出了处理器可以接收的中断数量,我们就应借助于某些特殊手段来减少所需中断信号的数量。

1.5.实时处理方面的考虑
 
  实时处理是一个涉及范围很广的题目,其主要内容与系统的处理速度有密切联系,实时事件是嵌入式微处理器需要关注的主要任务。

  例如:处理器跟串口进行通信时,通常通过上层软件(为了保证实时性,进行任务切换的时间足够短),然后再占用处理器去执行从串口拿数据的任务,并且要保证 处理器的速率比串口速率快,那么处理器可以以最快的速度反应并处理串口的相关的任务,这样就可以达到最大的实时性;

  另一方面,如果处理器本身就内置了串口控制器、或DMA、或LCD的控制器等,那么它就可以保证直接使用这些处理器内置的接口去控制串口、液晶屏等对象,以达到最大的实时性能。

1.6.该厂商是否提供好的开发工具和环境

    选择一款新的处理器,很可能就要使用一个新的开发工具和开发环境,包括软件的编译环境等;对于开发日程安排比较紧张的项目来说,开发人员往往无法抽出专门的时间来研究,熟悉新的开发工具,从而也无法全面掌握开发工具的使用技巧。

  并且,有的开发工具价格也比较昂贵,而且很可能只能从制造商那里购买,还有仿真工具也是需要付费的,这些对我们在选择一款处理器的时候,是都应该考虑进去的成本因素。

1.7.处理器速度方面的考虑

  主要考虑几个细节问题:
  1)处理器速度与处理器时钟之间的关系

      例:单片机8031为例,由该处理器可以适应12MHz频率的输入时钟,因此就可以认为它是一个速度为12MHz的处理器了吗?不是,实际上,由于该处理 器内部逻辑电路执行每条指令需要多种不同频率的时钟脉冲,因此该处理器内部时钟电路要对输入的12MHz时钟12分频处理;最终为处理器提供的只是 1MHz主频。
   
      有的时候,80MHz主频的处理器(80MHz输入时钟,80MHz执行速度)要比200MHz主频的处理器(200MHz输入时钟,50MHz执行速度)执行速度要快得多。

  2)处理器指令系统

      如果不需要执行复杂数学运算的应用,那么RISC指令集的处理器要快;如果执行比较复杂的操作,则CISC指令集的处理器速度要更快。

  3)芯片结构体系

      现在有的芯片是将多个不同功能的核封装到一个芯片IC中,定制某种特定的功能,比如DSP,其中包括用于实现数字解码、乘法运算的硬件乘法器和移相器等; 然而,这类处理器也由其自身局限,往往在执行某些普通操作之前必须要使用额外的指令来把RAM中的数据放入内部寄存器,相比之下,一般处理器只允许对 RAM中的数据进行直接访问。

1.8.只读存储器(ROM)的选择

  多数工程项目在其开发阶段一般使用可擦写可编程只读存储器(EPROM)或快速存储器(Flash Memory);这类可擦写可重复写入存储器的主要优点是可多次使用。一旦产品研制完毕,就可以用一次写入设备(OTP)来取代EPROM存储器,一次性 写入器件的外观与封装几乎与EPROM完全一样,惟一不同之处就是其表面没有擦出窗口,并且价格要比EPROM低很多。

  但是,另外一种情况,如果该产品今后需要升级固件,或在线编程,那么我们还是应该选择可擦写可编程的存储器。

  还有一种是非易失的存储器,例如制造一台电视机,就有可能需要该设备具有记忆上次观看最后一个频道的功能,即使在切断电源后,该频道信息也不会丢失。

总结:所以,根据不同的产品选择不同的存储器也是一门很讲究的学问。

1.9.电源的要求
 
  在某些设计中方案中,电源根本不存在问题,对电源唯一的要求就是可以为电路正常供电;实际上,选择电源主要要考虑三个方面的问题:

  1)要注意设计方案中是否对电源的供电方式有所限制,例如,是否像大多数家用电器那样需要使用屋内墙上的电源插座供电,或是是使用USB接口供电

  2)看系统是否需要使用电池供电方式,如果这样,我们就要考虑选择那种对驱动电流要求不高的处理器,然后再为其选择合适的电池。

  3)休眠电流:许多微处理器都支持低功率运行模式,在这种模式下,系统的CPU处理器将处于休眠状态,同时所有外部设备的电源供电都被暂时切断,以便减少 系统的电能消耗;某些微处理器在这种方式下需要的维持电流极小,但也有一些微处理器在这种方式下并不能节省多少功率;不管怎样,我们都要对系统在节点模式 下的工作时间有一个估测,以便对具体情况选择使用的电池。

总之,无论哪种情况,我们都要对系统需要的供电总功率做到心中有数。


1.10.设备工作环境的要求

  环境要求主要内容是考虑温度,湿度等;如果系统必须在温度范围较大的环境下运行,诸如用于军事设备或汽车的控制系统,那么处理器可选择的范围就要小得多;

  并且由于大范围温度变化的设备通常比较昂贵,因此在设计过程中就不能再根据一般工业级器件的价格来制定预算。

1.11.使用周期成本
 
  如果我们的产品是mp3,在一般情况下,可以不必考虑在用户现场对mp3程序进行修改的问题,也不用为是否可以得到设备备件而着急,这是因为mp3是一种消费产品;

  换句话说,如果我们的产品是价值几万块的工业设备并且需要常年不断地运行,那么我们在产品设计过程中就必须从长计议了:

  a.首先,我们需要选择一种处理器或存储体系结构都可以升级的器件
  b.考虑到程序升级的可能,我们还要选择较大容量的内存
  c.最后要注意的则是所选处理器是否可以长期供货,这一点的重要性远远大于处理器的价格

  除了上面的考虑之外,使用周期成本也是在设计之初要考虑的因素。总的来说,生产的部件越多,则可以接受的前期开发成本也就越大。如果产品是mp3,我们可能会选择一个低价微处理器,同时投入一大笔钱来开发控制mp3的软件。

  但如果我们的产品是价格昂贵的工业用设备,那么在产品的使用期内,该设备的销售量将只有几百台,毫无疑问,开发这种产品最重要的就是降低开发成本(降低开 发成本而不是硬件成本!!!);除此之外,工业产品的成本也不像家用电器或消费电子产品那么敏感。综上所述,开发工业产品当然要选择一种便于进行开发并且 有助于缩短开发过程的处理器。

1.12.处理器相关资料是否丰富

    如果该款处理器在市场上已经用得很广了,那么我们可以获取更多的相关资料,观察人家的产品是如何使用处理器的,也能在网络上找到不少的相关的设计资料以及相关技术主题,这样就进一步降低了技术门槛,确保了使用该处理器做产品可行性,减低了风险;
 
    反之,如果是厂商全新推出的处理器,因为市场上还没有可以借鉴的产品,我们就只能从全英文的芯片手册开始阅读,了解这款芯片,这样开发周期不仅变长,而且不可预知的风险也很大。

3.开发成本的预测和估计

  大多数项目或产品都有专人负责预测整个过程的开发成本,对于任何项目来说,其开发成本主要包括人力和材料开销。

  预测开发成本在很大程度上需要根据经验,这也是为什么大型公司一般指定有经验的高级工程师来完成这一任务的原因,除了人力和材料的开销之外,总结下来,还有以下的开销:

  1)人力成本(开发人员、管理人员、销售人员、其他行政等辅助人员)的开销

  2)材料(硬件物料和损耗,有时候需要投几次PCB版才把产品稳定下来)的开销

  3)开发系统和开发工具软件的开销

  4)硬件工具的开销(例如示波器、仿真器等)

  对于整个项目来说,上述的开销将直接可能导致产品成本增加,其中人力成本最为关键,尤其是在中国,呵呵


4.产品开发设计文档(需要包括硬件和软件两个方面)

4.1 硬件文档撰写思路

    1)首先是需求定义或产品规格:

      如果这些是产品最终目标的话,那么产品对硬件和软件的要求就是技术方案的最终目标;对硬件和软件的要求是从定义用户界面和系统功能开始的。

  2)其次,根据需求,系统整体定义文档中给出硬件接口的具体定义:

      定义硬件最有效的方法是从需求开始描述,由于硬件必须支持系统定义的所有功能,因此硬件定义是与系统说明不可分割的;
      例如,我们设计一个定时器(事先需求说明定时器不能与个人电脑连接,故无法使用CRT显示时间),我们只有两种选择:一种是使用发光二极管(LED),另 一种是使用液晶显示器件(LCD);尽管LCD的显示效果比较好,但考虑到定时器要常年位于户外,并且早期LCD显示器不能在低温下工作,最终还是选择 LED设备(这整个过程描述了我们硬件选型时的一个思路,这个是密切跟需求挂钩的)

    3)一旦完成了系统整体说明文档,就开始进行系统设计:

      首先要对硬件说明的内容进行细化,包括添加能让工程师理解的设计意图,以及软件工程师围绕硬件进行程序设计时需要使用的硬件信息等。
      完成硬件电路板说明文档后,我们还要在该文档中增加一个用来描述系统的原始要求的前言部分,包括说明方案的设计思路和方法,除此之外,还要附上软件工程师用来对硬件进行控制所需的各类信息,这类信息主要包括如下内容(软件工程所需信息):
      -----内存和I/O端口地址(如果需要,还可以提供内存映射图)
      -----可用内存容量
      -----状态寄存器每一位的定义
      -----每个端口管脚的用途
      -----外部设备的驱动方法(例如,说明输入定时器电路的时钟频率等)
      -----其他有管软件人员设计程序需要了解的信息

      对于比较复杂的系统来说,硬件文档中经常使用两个独立的部分来进行说明;其第一部分用来描述硬件指标和工作原理,第二部分则主要为软件人员提供程序设计需要的信息。


4.2 软件文档撰写思路

      1) 软件文档与硬件文档的组织方法类似,软件要求文档的主要内容则是定义软件要实现的功能;一种是在简单项目设计过程中,软件定义也可以只对一种电路板使用的 软件给予描述;对较复杂的项目来说,由于参与这种项目的软件人员分别负责设计驱动不同硬件部分的代码(同一电路板),因此每个软件人员可能会为自己的设计 代码指定不同的定义,这类软件说明需要提供下列的内容:

      -----论述包括需求定义、工程指标、硬件参数等实施项目需要的内容
      -----说明软件之间、处理器之间或处理器与其内部器件之间使用的通信协议:其内容应包括对缓冲区接口机制、命令/应答协议、信号控制等协议的具体说明。
      -----借助流程图、伪代码或者其他可能的方法来描述软件的实现方法和过程

      2) 软件与硬件所考虑的不同之处(此经验方便技术总监或其他相关管理者参考,因为无论是多高深的技术管理者,要么是硬件出身,要么是软件出身,要么就是非技术出身)

      a. 软件的灵活性远远大于硬件,要让软件人员搞清楚某个软件的内部格式是非常困难的任务,解决的办法:详细定义其他程序员需要了解的编程接口具体内容,以及其他工程人员在实施开发项目过程中需要使用的技术细节信息。

      b. 软件工程师只有在收到硬件说明文档后,才有可能知道如何对系统硬件进行操作;而硬件人员一般不需要了解软件程序的技术细节。

      c. 由于软件易于更改,因此程序内容经常会按销售人员提供的要求发生变更,在某些情况下,软件文档的内容无法及时反映程序的最新变化。

      d. 软件经常是工程项目最后完成的部分,因此其文档也经常因时间不够而欠缺完整。实际上,软件文档是否详细、完整,在某种程度上是与公司或客户的要求有关的。例如,军事或国家工程一般要求开发商就其所有软件实现的功能提供全面详细的文档

      e. 有个潜规则,对软件的要求越复杂,则需求的正确可能性就越小,这个是经验之谈了,我们需要把准需求这个准绳来做文章,而不是陷入个人主义以及对软件要求而凭空发挥自己不切实际的想象。

      f. 我们可以先硬件设计,接着围绕该硬件编制软件。虽然实际系统的实现过程可能是软硬件并行开发,但软件人员基本上也是围绕着已经实现的硬件来进行程序设计的;对于更为复杂的系统来说,开发过程可能会出现重复。

      例如,某个项目的硬件工程师和软件工程师可能会坐下来开会,共同决定使用哪种硬件来实现某种功能;软件人员可能提出需要为数据缓冲区口冲内存容量,也可能要求提供某种外部设备接口,以便充分利用现成接口程序提供的各种驱动代码。

      总的来说,必须在提高软件开发效率与硬件系统的复杂性与成本之间进行权衡.

5.嵌入式高手对技术的理解(含辛茹苦这么多年的精华体验)

  有很多人认为:嵌入式系统性能的核心因素是软件功能,其实,如果按照这种逻辑,系统设计中存在的问题就应由软件人员来负责;其实这个观点实际上反映了设计 嵌入式产品时如何考虑划分硬件和软件各自应实现的功能,也就是这个功能是软件实现,还是考虑用硬件来实现(硬件实现:需要购买处理该功能的硬件芯片,从而 增加成本;软件实现:无需增加硬件成本,但会占用处理器以及内存的资源)。

  例如:我们在这里设计的基于ARM的mp3嵌入式产品,我们可以使用专业的解码芯片来负责mp3音乐文件的解码和播放功能,也可以使用另一种方法来解码 mp3语音文件,让ARM处理器利用软件控制寄存器来驱动耳机或音响,处理器通过对mp3语音文件解码之后再将解码后的数据流按照一定协议格式送给音频输 出的硬件接口进行播放。

  优点:这种方案在硬件方面节省了一个器件,降低了成本,并且该功能还方便调试(因为是软件实现的)。

  缺点:从另一个角度来看,虽然节省了一块语音解码芯片,但同时要在三个方面增加成本。
        首先,要在程序中增加语音协议解码的代码;
        其次,可能要把增加ROM来存放语音解码的协议,这样可以增加速度;
        最后,运行该程序将占用处理器的时间和资源。

  其实,话又说回来,对于本案例来说,上述成本的节约并不会引发任何问题,包括驱动程序增加也只需少量的,我们讨论这个mp3产品的案例的目的在于说明如何对软件硬件的功能进行合理划分。

  总的来说,交给软件实现的功能越多,则产品的成本就越低,当然这就要处理器必须有足够的处理速度和内存空间来实现设计指定的功能;常言说得好,天下没有免 费的午餐;把功能分配给软件来实现,会增加软件的复杂性、开发时间、以及程序的调试时间;然而,随着处理器的处理能力的不断提高,可以预见,越来越多的功 能将会由软件来实现。

  虽然在软件中实现各种功能会增加开发成本,但如果把功能移植到硬件中实现,则会增加产品的成本,这类开销是在构造每个系统组件时不可避免的。在低成本设计 方案中,增加任何额外的硬件都会对产品成本产生显著的影响,因此软硬件功能划分就是一个决定产品成本的大问题。在诸如大众消费产品这一类对成本非常敏感的 设计方案中,一般都会把无法通过软件实现的功能排除在外的。

完整的全文:http://www.armjishu.com/bbs/viewtopic.php?id=1312

2009年7月1日星期三

IT精英,必须掌握的命令行

一,ping   

  它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用 的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以 确定目标主机的存在,可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧,在DOS窗口中键入:ping /? 回车,。所示的帮助画面。在此,我们只掌握一些基本的很有用的参数就可以了(下同)。   

  -t 表示将不间断向目标IP发送数据包,直到我们强迫其停止。试想,如果你使用100M的宽带接入,而目标IP是56K的小猫,那么要不了多久,目标IP就因为承受不了这么多的数据而掉线,呵呵,一次攻击就这么简单的实现了。   

  -l 定义发送数据包的大小,默认为32字节,我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用,会有更好的效果哦。   

  -n 定义向目标IP发送数据包的次数,默认为3次。如果网络速度比较慢,3次对我们来说也浪费了不少时间,因为现在我们的目的仅仅是判断目标IP是否存在,那么就定义为一次吧。   

  说明一下,如果-t 参数和 -n参数一起使用,ping命令就以放在后面的参数为标准,比如"ping IP -t -n 3",虽然使用了-t参数,但并不是一直ping下去,而是只ping 3次。另外,ping命令不一定非得ping IP,也可以直接ping主机域名,这样就可以得到主机的IP。   

  下面我们举个例子来说明一下具体用法。   

  这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒,从这里可以判断网络连接速度的大小 。从TTL的返回值可以初步判断被ping主机的操作系统,之所以说"初步判断"是因为这个值是可以修改的。这里TTL=32表示操作系统可能是 win98。

  (小知识:如果TTL=128,则表示目标主机可能是Win2000;如果TTL=250,则目标主机可能是Unix)

  至于利用ping命令可以快速查找局域网故障,可以快速搜索最快的QQ服务器,可以对别人进行ping攻击……这些就靠大家自己发挥了。   

二,nbtstat   

  该命令使用TCP/IP上的NetBIOS显示协议统计和当前TCP/IP连接,使用这个命令你可以得到远程主机的NETBIOS信息,比如用户名、所属的工作组、网卡的MAC地址等。在此我们就有必要了解几个基本的参数。   

  -a 使用这个参数,只要你知道了远程主机的机器名称,就可以得到它的NETBIOS信息(下同)。   

  -A 这个参数也可以得到远程主机的NETBIOS信息,但需要你知道它的IP。

  -n 列出本地机器的NETBIOS信息。   

  当得到了对方的IP或者机器名的时候,就可以使用nbtstat命令来进一步得到对方的信息了,这又增加了我们入侵的保险系数。   

三,netstat

  这是一个用来查看网络状态的命令,操作简便功能强大。   

  -a 查看本地机器的所有开放端口,可以有效发现和预防木马,可以知道机器所开的服务等信息,如图4。   

  这里可以看出本地机器开放有FTP服务、Telnet服务、邮件服务、WEB服务等。用法:netstat -a IP。

  -r 列出当前的路由信息,告诉我们本地机器的网关、子网掩码等信息。用法:netstat -r IP。
四,tracert

  跟踪路由信息,使用此命令可以查出数据从本地机器传输到目标主机所经过的所有途径,这对我们了解网络布局和结构很有帮助。如图5。   

  这里说明数据从本地机器传输到192.168.0.1的机器上,中间没有经过任何中转,说明这两台机器是在同一段局域网内。用法:tracert IP。   

五,net   

  这个命令是网络命令中最重要的一个,必须透彻掌握它的每一个子命令的用法,因为它的功能实在是太强大了,这简直就是 微软为我们提供的最好的入侵工具。首先让我们来看一看它都有那些子命令,键入net /?回车如图6。

  在这里,我们重点掌握几个入侵常用的子命令。   

  net view   

  使用此命令查看远程主机的所以共享资源。命令格式为net view \IP。  

  net use

  把远程主机的某个共享资源影射为本地盘符,图形界面方便使用,呵呵。命令格式为net use x: \IP\sharename。上面一个表示把192.168.0.5IP的共享名为magic的目录影射为本地的Z盘。下面表示和192.168.0.7 建立IPC$连接(net use \IP\IPC$ "password" /user:"name"),   

  建立了IPC$连接后,呵呵,就可以上传文件了:copy nc.exe \192.168.0.7\admin$,表示把本地目录下的nc.exe传到远程主机,结合后面要介绍到的其他DOS命令就可以实现入侵了。   

  net start

  使用它来启动远程主机上的服务。当你和远程主机建立连接后,如果发现它的什么服务没有启动,而你又想利用此服务怎么办?就使用这个命令来启动吧。用法:net start servername,如图9,成功启动了telnet服务。   

  net stop

  入侵后发现远程主机的某个服务碍手碍脚,怎么办?利用这个命令停掉就ok了,用法和net start同。   

  net user

  查看和帐户有关的情况,包括新建帐户、删除帐户、查看特定帐户、激活帐户、帐户禁用等。这对我们入侵是很有利的,最重要的,它为我们克隆帐户提供了前提。键入不带参数的net user,可以查看所有用户,包括已经禁用的。下面分别讲解。

  1,net user abcd 1234 /add,新建一个用户名为abcd,密码为1234的帐户,默认为user组成员。

  2,net user abcd /del,将用户名为abcd的用户删除。

  3,net user abcd /active:no,将用户名为abcd的用户禁用。

  4,net user abcd /active:yes,激活用户名为abcd的用户。

  5,net user abcd,查看用户名为abcd的用户的情况  

  net localgroup

  查看所有和用户组有关的信息和进行相关操作。键入不带参数的net localgroup即列出当前所有的用户组。在入侵过程中,我们一般利用它来把某个帐户提升为administrator组帐户,这样我们利用这个帐户 就可以控制整个远程主机了。用法:net localgroup groupname username /add。   

  现在我们把刚才新建的用户abcd加到administrator组里去了,这时候abcd用户已经是超级管理员了,呵呵,你可以再使用net user abcd来查看他的状态,和图10进行比较就可以看出来。但这样太明显了,网管一看用户情况就能漏出破绽,所以这种方法只能对付菜鸟网管,但我们还得知 道。现在的手段都是利用其他工具和手段克隆一个让网管看不出来的超级管理员,这是后话。有兴趣的朋友可以参照《黑客防线》第30期上的《由浅入深解析隆帐 户》一文。   

  net time

  这个命令可以查看远程主机当前的时间。如果你的目标只是进入到远程主机里面,那么也许就用不到这个命令了。但简单的入侵成功了,难道只是看看吗?我们 需要进一步渗透。这就连远程主机当前的时间都需要知道,因为利用时间和其他手段(后面会讲到)可以实现某个命令和程序的定时启动,为我们进一步入侵打好基 础。用法:net time \IP。   

六,at

这个命令的作用是安排在特定日期或时间执行某个特定的命令和程序(知道net time的重要了吧?)。当我们知道了远程主机的当前时间,就可以利用此命令让其在以后的某个时间(比如2分钟后)执行某个程序和命令。用法:at time command \computer。   

  表示在6点55分时,让名称为a-01的计算机开启telnet服务(这里net start telnet即为开启telnet服务的命令)。   
七,ftp   

  大家对这个命令应该比较熟悉了吧?网络上开放的ftp的主机很多,其中很大一部分是匿名的,也就是说任何人都可以登陆上去。现在如果你扫到了一台开放 ftp服务的主机(一般都是开了21端口的机器),如果你还不会使用ftp的命令怎么办?下面就给出基本的ftp命令使用方法。

  首先在命令行键入ftp回车,出现ftp的提示符,这时候可以键入"help"来查看帮助(任何DOS命令都可以使用此方法查看其帮助)。   

  大家可能看到了,这么多命令该怎么用?其实也用不到那么多,掌握几个基本的就够了。   

  首先是登陆过程,这就要用到open了,直接在ftp的提示符下输入"open 主机IP ftp端口"回车即可,一般端口默认都是21,可以不写。接着就是输入合法的用户名和密码进行登陆了,这里以匿名ftp为例介绍。   

  用户名和密码都是ftp,密码是不显示的。当提示**** logged in时,就说明登陆成功。这里因为是匿名登陆,所以用户显示为Anonymous。   

  接下来就要介绍具体命令的使用方法了。   

  dir 跟DOS命令一样,用于查看服务器的文件,直接敲上dir回车,就可以看到此ftp服务器上的文件。

  cd 进入某个文件夹。

  get 下载文件到本地机器。

  put 上传文件到远程服务器。这就要看远程ftp服务器是否给了你可写的权限了,如果可以,呵呵,该怎么 利用就不多说了,大家就自由发挥去吧。

  delete 删除远程ftp服务器上的文件。这也必须保证你有可写的权限。

  bye 退出当前连接。

  quit 同上。
  

八,telnet

  功能强大的远程登陆命令,几乎所有的入侵者都喜欢用它,屡试不爽。为什么?它操作简单,如同使用自己的机器一样,只要你熟悉DOS命令,在成功以 administrator身份连接了远程机器后,就可以用它来干你想干的一切了。下面介绍一下使用方法,首先键入telnet回车,再键入help查看 其帮助信息。   

  然后在提示符下键入open IP回车,这时就出现了登陆窗口,让你输入合法的用户名和密码,这里输入任何密码都是不显示的。   

  当输入用户名和密码都正确后就成功建立了telnet连接,这时候你就在远程主机上具有了和此用户一样的权限,利用DOS命令就可以实现你想干的事情了。这里我使用的超级管理员权限登陆的。  

  到这里为止,网络DOS命令的介绍就告一段落了,这里介绍的目的只是给菜鸟网管一个印象,让其知道熟悉和掌握网络DOS命令的重要性。其实和网络有关 的DOS命令还远不止这些,这里只是抛砖引玉,希望能对广大菜鸟网管有所帮助。学好DOS对当好网管有很大的帮助,特别的熟练掌握了一些网络的DOS命 令。

  另外大家应该清楚,任何人要想进入系统,必须得有一个合法的用户名和密码(输入法漏洞差不多绝迹了吧),哪怕你拿到帐户的只有一个很小的权限,你也可 以利用它来达到最后的目的。所以坚决消灭空口令,给自己的帐户加上一个强壮的密码,是最好的防御弱口令入侵的方法。

  最后,由衷的说一句,培养良好的安全意识才是最重要的。

=========================================
开始→运行→命令集锦
winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构(WMI)
wupdmgr--------windows更新程序
wscript--------windows脚本宿主设置
write----------写字板
winmsd---------系统信息
wiaacmgr-------扫描仪和照相机向导
winchat--------XP自带局域网聊天

mem.exe--------显示内存使用情况
Msconfig.exe---系统配置实用程序
mplayer2-------简易widnows media player
mspaint--------画图板
mstsc----------远程桌面连接
mplayer2-------媒体播放机
magnify--------放大镜实用程序
mmc------------打开控制台
mobsync--------同步命令

dxdiag---------检查DirectX信息
drwtsn32------ 系统医生
devmgmt.msc--- 设备管理器
dfrg.msc-------磁盘碎片整理程序
diskmgmt.msc---磁盘管理实用程序
dcomcnfg-------打开系统组件服务
ddeshare-------打开DDE共享设置
dvdplay--------DVD播放器

net stop messenger-----停止信使服务
net start messenger----开始信使服务
notepad--------打开记事本
nslookup-------网络管理的工具向导
ntbackup-------系统备份和还原
narrator-------屏幕"讲述人"
ntmsmgr.msc----移动存储管理器
ntmsoprq.msc---移动存储管理员操作请求
netstat -an----(TC)命令检查接口

syncapp--------创建一个公文包
sysedit--------系统配置编辑器
sigverif-------文件签名验证程序
sndrec32-------录音机
shrpubw--------创建共享文件夹
secpol.msc-----本地安全策略
syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
services.msc---本地服务设置
Sndvol32-------音量控制程序
sfc.exe--------系统文件检查器
sfc /scannow---windows文件保护

tsshutdn-------60秒倒计时关机命令
tourstart------xp简介(安装完成后出现的漫游xp程序)
taskmgr--------任务管理器

eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打开资源管理器


packager-------对象包装程序
perfmon.msc----计算机性能监测程序
progman--------程序管理器

regedit.exe----注册表
rsop.msc-------组策略结果集
regedt32-------注册表编辑器
rononce -p ----15秒关机
regsvr32 /u *.dll----停止dll文件运行
regsvr32 /u zipfldr.dll------取消ZIP支持

cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盘检查
certmgr.msc----证书管理实用程序
calc-----------启动计算器
charmap--------启动字符映射表
cliconfg-------SQL SERVER 客户端网络实用程序
Clipbrd--------剪贴板查看器
conf-----------启动netmeeting
compmgmt.msc---计算机管理
cleanmgr-------垃圾整理
ciadv.msc------索引服务程序

osk------------打开屏幕键盘
odbcad32-------ODBC数据源管理器
oobe/msoobe /a----检查XP是否激活
lusrmgr.msc----本机用户和组
logoff---------注销命令


iexpress-------木马捆绑工具,系统自带

Nslookup-------IP地址侦测器

fsmgmt.msc-----共享文件夹管理器

utilman--------辅助工具管理器

gpedit.msc-----组策略