<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>阿宽技术博客 &#187; 经典收藏</title>
	<atom:link href="http://www.hengxinsoft.com/category/other/collection/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hengxinsoft.com</link>
	<description>技术交流</description>
	<lastBuildDate>Thu, 12 Jan 2012 06:17:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Mac OSX 文件系统</title>
		<link>http://www.hengxinsoft.com/2010/10/mac-osx-%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f/</link>
		<comments>http://www.hengxinsoft.com/2010/10/mac-osx-%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 09:07:32 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[3G开发]]></category>
		<category><![CDATA[iphone开发]]></category>
		<category><![CDATA[经典收藏]]></category>
		<category><![CDATA[Mac OSX 文件系统]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/?p=600</guid>
		<description><![CDATA[  OS X系统深入了解－－系统文件结构篇 OS X采用的是类UNIX的多用户系统。 通常我们在启动盘下面都只能看到应用程序、资源库、系统、用户这４个目录。但其实还有很多的隐藏目录，如bin、sbin之类的，这些都是系统的一些资源，一般是不用普通用户去访问，是些比较重要的系统文件及配置文件。 所以我这里就只是探讨一下通常在Finder中可以触及的文件项目和资源。   首先我们来了解一下OS X系统的几大组成部分： 文件系统区域： 作为了一个多用户的操作系统，控制系统资源的访问对于保证系统的稳定性是非常重要的。通过目录的设置，由当前用户的操作权限来决定该用户对每部分资源的访问。 在OS X系统中，存在以下４个文件系统区域： User:这个区域包含了登录到系统的用户可供使用的特定资源。该区域由用户的主目录来定义，在这个区域中，用户具有完全的控制权限。 Local: Local区域包括如文件、程序这些被系统中所有用户共享的资源，但它不是系统运行所必须的。Local区域没有一个相应的单独的目录，它包含于启动卷宗的多个目录中。具有系统管理员权限的用户可以添加、删除或修改此区载的项目。 Network:此区域包含了本地局域网中可被所有用户共享的资源，如文件或应用程序。该区域的代表项目在网络文件服务中的位置，并受网络管理员的控制。 System:包含由Apple安装的系统软件。这此资源是系统正常运行所必须的，位于启动卷宗中，在该区域中，用户不允许添加、删除或更改这些资源。 用户区域包含指定给一个单独的用户的资源。由当前用户的个人目录来表示。每个Mac OS X系统用户必须有一个账号，在文件系统中给每个用户账号指定一个目录空间。目录中包括了用户的应用程序、资源以及文档。用户个人目录以用户账号的短名称来命名，并且是唯一的。 用户区域可以让用户为自己定义一个合理的工作环境，当用户登录时，Finder将恢复用户的工作环境，并按预置设置为用户上次使用时的状态。同样的，应用程序及其它系统软件按程序预置、网络设置、email设置、字体设置及其它设置来进行恢复。 用户的个人目录的位置依赖于用户的账号。如果用户账号是本地账号，那么用户的个人目录则位于启动卷宗的”User”目录中，如果是一个网络账号，则个人目录位于网络服务器中。 无论用户的个人目录实际位置在哪里（实际上，我们还是可以通过终端命令更改个人目录的实际位置的），OS X都使用”~”字符来代表当前登录用户的个人目录。这个符号可以与其它路径来组合使用。 表一： ~ 当前用户目录的顶级目录，相当于”/User/当前用户名”这个目录 ~/Library/Fonts 当前用户个人目录中的字体储存位置 ~Steve 用户Steve的个人目录。 说明：这里我们需要注意的是，终端或系统中，我们其实都可以多重登录的，因此，在使用”~”的时候，连接的是“当前登录用户“的个人目录。所以，当你登录为不同的用户时，”~”所指的位置并不相当。 表二： 这里我们列出的是个人目录下一些常见的目录： Applications 包含一些只有当前用户可以使用的程序，比如我们安装了一个程序，安装时选Applications，应用程序将会默认安装到这里！ Desktop：包含当前用户显示在Finder桌面上的所有项目。 Documents：用户个人的一些文档。经常会包含一些程序使用的文件或者下载的文件，以及程序安装的纪录文件。 Library：包括应用程序设置、预置及其它用户指定的系统资源或设置（具体内容将在下一章中进行说明）。 Movies：QuickTime或其它格式的影片 Music：数字音乐文件（如.aiff, .mp3, .m4p或其它格式)，包括iTunes自动倒入的歌曲。 Pictures：图片文件，包括iPhoto自动导入的数码相机中的图片 Public：你可以把需要与其它用户共享的文件放在这个目录中，默认状态下，这个目录可以被其它所有用户访问。 Sites：用户的个人站点网页文件。在被其它用户访问之前，你必须在“系统预置－共享-Web共享“中打开共享。 当新建账号时，”Applications”目录并不会自动添加到该用户的个人目录中。用户可以自已手工建议一个”Applications”，并把自己的程序放在该目录中，系统会自动搜索该目录中的项目。 在&#8217;/User&#8217;目录中包含一个叫”Shared”的子目录，这个目录可以被本地的所有用户访问（不过请不要把应用程序放置在该目录中），所有用户都可以从该目录中读取或写入文件，用于本地用户的文件交换及共享。 本地区域包括本地计算机所使用的资源，但它不是系统运行所必须的。比较典型的包括：应用程序、实用工具、自定义字体、自定义的启动项目以及应用程序全局设置。在”Applications” 以及 “Library”目录中也包含了部分资源，这些资源仅代本地用户使用，而网络用户则无法访问。 如果希望本地所有用户共享资源，那么系统管理员可以安装资源到本地区域，苹果公司开发的应用程序都安装在”/Applications” 及 [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p><strong>OS X</strong><strong>系统深入了解－－系统文件结构篇</strong></p>
<p>OS X采用的是类UNIX的多用户系统。</p>
<p>通常我们在启动盘下面都只能看到应用程序、资源库、系统、用户这４个目录。但其实还有很多的隐藏目录，如bin、sbin之类的，这些都是系统的一些资源，一般是不用普通用户去访问，是些比较重要的系统文件及配置文件。</p>
<p>所以我这里就只是探讨一下通常在Finder中可以触及的文件项目和资源。</p>
<p> <span id="more-600"></span></p>
<p>首先我们来了解一下OS X系统的几大组成部分：</p>
<p><strong>文件系统区域：</strong></p>
<p>作为了一个多用户的操作系统，控制系统资源的访问对于保证系统的稳定性是非常重要的。通过目录的设置，由当前用户的操作权限来决定该用户对每部分资源的访问。</p>
<p>在OS X系统中，存在以下４个文件系统区域：</p>
<p>User:这个区域包含了登录到系统的用户可供使用的特定资源。该区域由用户的主目录来定义，在这个区域中，用户具有完全的控制权限。</p>
<p>Local: Local区域包括如文件、程序这些被系统中所有用户共享的资源，但它不是系统运行所必须的。Local区域没有一个相应的单独的目录，它包含于启动卷宗的多个目录中。具有系统管理员权限的用户可以添加、删除或修改此区载的项目。</p>
<p>Network:此区域包含了本地局域网中可被所有用户共享的资源，如文件或应用程序。该区域的代表项目在网络文件服务中的位置，并受网络管理员的控制。</p>
<p>System:包含由Apple安装的系统软件。这此资源是系统正常运行所必须的，位于启动卷宗中，在该区域中，用户不允许添加、删除或更改这些资源。</p>
<p>用户区域包含指定给一个单独的用户的资源。由当前用户的个人目录来表示。每个Mac OS X系统用户必须有一个账号，在文件系统中给每个用户账号指定一个目录空间。目录中包括了用户的应用程序、资源以及文档。用户个人目录以用户账号的短名称来命名，并且是唯一的。</p>
<p>用户区域可以让用户为自己定义一个合理的工作环境，当用户登录时，Finder将恢复用户的工作环境，并按预置设置为用户上次使用时的状态。同样的，应用程序及其它系统软件按程序预置、网络设置、email设置、字体设置及其它设置来进行恢复。</p>
<p>用户的个人目录的位置依赖于用户的账号。如果用户账号是本地账号，那么用户的个人目录则位于启动卷宗的”User”目录中，如果是一个网络账号，则个人目录位于网络服务器中。</p>
<p>无论用户的个人目录实际位置在哪里（实际上，我们还是可以通过终端命令更改个人目录的实际位置的），OS X都使用”~”字符来代表当前登录用户的个人目录。这个符号可以与其它路径来组合使用。</p>
<p>表一：</p>
<p>~ 当前用户目录的顶级目录，相当于”/User/当前用户名”这个目录</p>
<p>~/Library/Fonts 当前用户个人目录中的字体储存位置</p>
<p>~Steve 用户Steve的个人目录。</p>
<p>说明：这里我们需要注意的是，终端或系统中，我们其实都可以多重登录的，因此，在使用”~”的时候，连接的是“当前登录用户“的个人目录。所以，当你登录为不同的用户时，”~”所指的位置并不相当。</p>
<p>表二：</p>
<p>这里我们列出的是个人目录下一些常见的目录：</p>
<p>Applications 包含一些只有当前用户可以使用的程序，比如我们安装了一个程序，安装时选Applications，应用程序将会默认安装到这里！</p>
<p>Desktop：包含当前用户显示在Finder桌面上的所有项目。</p>
<p>Documents：用户个人的一些文档。经常会包含一些程序使用的文件或者下载的文件，以及程序安装的纪录文件。</p>
<p>Library：包括应用程序设置、预置及其它用户指定的系统资源或设置（具体内容将在下一章中进行说明）。</p>
<p>Movies：QuickTime或其它格式的影片</p>
<p>Music：数字音乐文件（如.aiff, .mp3, .m4p或其它格式)，包括iTunes自动倒入的歌曲。</p>
<p>Pictures：图片文件，包括iPhoto自动导入的数码相机中的图片</p>
<p>Public：你可以把需要与其它用户共享的文件放在这个目录中，默认状态下，这个目录可以被其它所有用户访问。</p>
<p>Sites：用户的个人站点网页文件。在被其它用户访问之前，你必须在“系统预置－共享-Web共享“中打开共享。</p>
<p>当新建账号时，”Applications”目录并不会自动添加到该用户的个人目录中。用户可以自已手工建议一个”Applications”，并把自己的程序放在该目录中，系统会自动搜索该目录中的项目。</p>
<p>在&#8217;/User&#8217;目录中包含一个叫”Shared”的子目录，这个目录可以被本地的所有用户访问（不过请不要把应用程序放置在该目录中），所有用户都可以从该目录中读取或写入文件，用于本地用户的文件交换及共享。</p>
<p>本地区域包括本地计算机所使用的资源，但它不是系统运行所必须的。比较典型的包括：应用程序、实用工具、自定义字体、自定义的启动项目以及应用程序全局设置。在”Applications” 以及 “Library”目录中也包含了部分资源，这些资源仅代本地用户使用，而网络用户则无法访问。</p>
<p>如果希望本地所有用户共享资源，那么系统管理员可以安装资源到本地区域，苹果公司开发的应用程序都安装在”/Applications” 及 “/Applications/Utilities “目录中，第三方的程序及工具也可以安装在这些目录中。其它的系统资源，如字体、预置以及插件放置在”/Library”相应的子目录中。</p>
<p>网络部分</p>
<p>网络区域包括本地局域网中的的资源。网络用户可以访问程序、文档以及其它资源，包括AplleShare及 Web共享。</p>
<p>表三：</p>
<p>/Network/Applications 包括可以被本地局域网中其它用户运行的一些应用程序。</p>
<p>/Network/Library 包含如：插件,音频文件, 文档, 框架, 色彩,及字体这些供本地局域网用户使用的资源.</p>
<p>/Network/Servers 包含本地局域网中提供的NFS文件服务的连接</p>
<p>/Network/Users/ 包括所有本地网用户的个人目录。这是个人目录默认的位置。个人目录也可以存储在其它服务器中。</p>
<p>系统区域</p>
<p>系统区域包括了Mac OS X运行所必须的资源，它全部位置于启动盘的”/System”目录中。这些资源由苹果公司提供并只有&#8217;root&#8217;用户可以修改其内容。管理员用户以及程序将不会安装任何资源在这个目录或直接修改其内容。</p>
<p>默认时，”/System”仅包括一个”Library”子目录，这个子目录包含了许多与其它Library目录相同类型的资源。</p>
<p>请不要手工添加、删除或者修改此目录的资源，否则有可能导致系统无法正常启动。</p>
<p>Library目录</p>
<p>Library目录被用来存储程序及系统特殊资源的一个特殊目录。每个文件系统都有它自己的Library目录。通常，程序可以用它来存储内部数据或临时文件，但不会存储程序本身或用户的数据文件。</p>
<p>它包括很多标准的子目录，系统通常会认为已经存在这些标准的。所以请不要删除Library中的子目录。当然，程序也可以创建新的子目录来储存程序的特殊数据。</p>
<p>Library可以位于启动盘根目录及用户的个人目录中。虽然位置不同，内容及作用大体相同。</p>
<p>唯一的区别就在于：根目录下的Library是本机所有用户的共同设置，而个人目录中的Library则只是该用户的设置。</p>
<p>下面我们将列出在Library常见的一些子目录，你可以通过这个说明来了解这些目录到底有何用途。从而来决定你要作什么。</p>
<p>Library目录中的子目录：</p>
<p>Application Support ：包括程序的特殊数据以及支持文件，如第三方插件，帮助程序、模板以及被程序使用但不允许操作的附加资源。通常所有的项目都放置在以程序命名的目录中。例如Adobe公司的程序，都将放在名叫“Adobe“的子目录中，而苹果公司的程序支持则放置在“Apple“这个子目录中。</p>
<p>Assistants：包括程序用来帮助用户设置或完成其它任务的资源。</p>
<p>    Audio：包括音频插件及设备驱动。</p>
<p>Caches：再生所必须的缓存数据。</p>
<p>ColorPickers：采集色彩时所依赖的模式的资源。例如HLS或RGB。</p>
<p>ColorSync：色彩管理预置及脚本。</p>
<p>Components：系统组织和功能扩展。</p>
<p>Contextual Menu Items：附加的系统级关联菜单插件，如阿拉丁的解压缩关联菜单、iGetter的关联菜单。</p>
<p>Desktop Pictures：桌面图片目录。</p>
<p>Documentation：文档及用户和管理员使用的苹果帮助文件包(也有的在”Help子目录中”)。</p>
<p>Extensions：包括设备驱动及其它核心功能。类似于OS 9下的”功能扩展”目录。</p>
<p>Favorites：包括经常访问的目录、文件或网站的替身，仅存在于个人目录的库目录中。</p>
<p>Fonts:显示和打印用的字体文件</p>
<p>Frameworks：框架和共享的资源库，开发者可能会安装自己的框架或资源在该目录中。</p>
<p>Image Capture：通常是扫描仪的驱动。</p>
<p>InputManagers：输入法管理，</p>
<p>Internet Plug-ins：网络浏览器使用的插件、库及过滤器。如Flash插件、Realplayer插件。</p>
<p>iTunes：第三方的iTunes的插件及库，</p>
<p>Java：如果你安装了Java，那么就会有这个目录，包括了Java的一些功能扩展及其它资源。</p>
<p>Keyboard Layouts：键盘布局</p>
<p>Keychains：系统中各个钥匙串的内容。</p>
<p>Logs：控制台及系统服务的记录文件，你可以通过：应用程序－实用程序－控制台来查看。</p>
<p>Modem Scripts：调制解调器脚本，也就是猫的驱动了。</p>
<p>Mail：用户的电子邮件内容，这只存在于每个用户的个人目录的库目录中。</p>
<p>Perl：Perl程序的功能扩展及库，比如Cocoa Conler就需要这个功能。</p>
<p>Plug-ins：系统插件，比如磁盘工具的磁盘映像。</p>
<p>PreferencePanes：系统预置插件，一般显示在系统预置的最下方。如安装阿拉丁解压缩软件时生成的StuffIt AVR.prefPane</p>
<p>Preferences：预置目录，包括系统、应用程序及用户的各种设置。通常如果预置文件损坏，会导致程序或系统的操作失常，这个时候可以通过删除相应的预置来尝试解决问题。</p>
<p>Printers：打印机驱动。PPD插件，以及配置打印机所需要的库文件。</p>
<p>QuickTime：QuickTime的插件及功能扩展。</p>
<p>Receipts：安装过的.pkg安装包的替身，但不是.pkg安装包本身。例如系统升级或安装时的.pkg。或vpc安装时的.pkg包。</p>
<p>Screen Savers：屏幕保护文件。</p>
<p>Scripting：AppleScript附加的脚本及脚本资源。</p>
<p>Sherlock Plug-ins：Sherlock兼容的插件及功能扩展。</p>
<p>Sounds：系统警告提示音</p>
<p>StartupItems：系统运行时自动启动的系统及第三方脚本或程序。一般通过系统预置－账号来进行设定。</p>
<p>User Pictures：用户账号中，用户显示的图片的文件。</p>
<p>WebServer：Web服务内容。也就是个人Web共享的内容。包括CGI脚本及网页文件。网页文件放置在Documents子目录中。</p>
<p>文件系统<br />
    从体系结构上看，Mac OS X实现了对多文件系统的支持，其中最为重要的文件系统包括有：Mac OS Extended (HFS+)，Mac OS Standard (HFS)，UFS， ISO 9660， NFS和 AFP。但从用户的角度看，文件系统又是单一的。当用户复制，移动或拖移文件和文件夹时，（会感觉似乎）只存在一个文件系统。</p>
<p>文件系统如何被组织<br />
    Mac OS X文件系统中的几乎每个文件都有其适合放置的存储这一类型文件的标准目录区域。而对用户来说，这并不意味着他们就必须把应用程序和应用程序资源放在被推荐的区域。由于应用程序最终会被打包，因此无论他们被安装在哪里，都能满足自身要求。但假如用户没有把某些内容放在系统软件期望的位置。他们有可能会丧失Mac OS X的一些优势。例如，Finder首先通过搜索应用程序的标准位置来导入应用程序数据库（见“收集应用程序信息”一节）。一旦这样做，结果有可能会造成一个隶属于某个应用程序（但不在那一区域）的文档，不能在双击时被立即打开。</p>
<p>    文件系统的层次通常被表现为一个以“根（root）”开始的分层结构，在典型的Mac OS X文件系统的根目录中（“根”用起始的“/”符号来表示），它包含以下项目：<br />
/Mac OS X/&#8211;一个特殊的卷，操作系统由它开始启动，系统文件和资源也被安装在其上。这个卷通常是一个被格式为Mac OS扩展格式（HFS+，Mac OS Extended）的卷（虽然它也可以是UFS卷）。名称“Mac OS X”是它默认的卷名，但用户也可以修改它。<br />
/Network/&#8211;作为装载到用户系统上的本地网络的根目录。无论用户是否连接到网络上，/Network/目录（其图标是一个“地球”）将始终出现。<br />
/OtherVolumes/&#8211;显示一个或多个被连接的外部设备或不是启动卷的内部设备。其中可以包括有Zip驱动器，CD-ROM驱动器，数码相机，被装载的网络服务器以及硬盘和它们的分区等。（“OtherVolumes”只是一个真实名称的代表，被连接的卷的实际名称将会是不同的）。</p>
<p>所有非启动卷在它们被装载时出现，被卸载时消失。对此有一个例外，用户的iDisk卷即使在被卸载后也不会消失。<br />
卷的物理结构与Finder向用户所显示的略有不同。假如用Terminal程序看一下目录结构，您会看到启动卷被装载在根目录层（/），而非启动卷被放在/Volumes/目录中。Finder提供了这种抽象方式，用来在基本的UNIX 系统上提供一个更加传统的Mac OS界面。</p>
<p>像/usr, /bin和/etc等目录都是标准的BSD目录，它们也存在于根目录层，但Finder向用户隐藏了它们。</p>
<p>系统域<br />
系统域包含了要求由Mac OS X来运行的资源。系统域中的所有资源被放置在启动卷上的/System目录下。这些资源由Apple提供，只有root用户可以修改这个目录的内容。管理用户和应用程序不能在系统域中安装资源或是直接修改它的内容。</p>
<p>默认情况下，/System目录仅包含了一个Library子目录。与系统中的其他Library目录一样，这个子目录中包含了许多相同类型的资源。然而在系统域中，这个目录还包含了构成Mac OS X系统的许多核心服务，框架和应用户程序。关于Library目录的更多信息，请参见“Library 目录”一节。</p>
<p>——————————————————————<br />
Library目录</p>
<p>Library是一个特殊的目录，用于存储特定的应用程序和特定的系统资源。每个文件系统域都有其自身Library目录的副本，这些Library目录具有不同的访问级别以匹配不同的域类型。虽然一个应用程序可以使用这个目录来存储内部数据或临时文件，但将应用程序的束自身或是用户数据文件存放在Library目录中将是不足取的。应用程序的束应放在一个/Applications目录中，而用户数据应放在用户的home目录中。</p>
<p>Library包含了许多标准的子目录。系统例程要求许多标准子目录必须存在，因此删除Library的子目录决不是一个好主意。然而，当需要存储特定的应用程序数据时，应用程序可以创建一个新的子目录。</p>
<p>Application Support<br />
特定应用程序的第三方插件，帮助程序，模板和其他资源。按规定，这些项目应被放置在以应用程序命名的子目录中。举个列子，应用程序MyApp的第三方资源将被放在Application Support/MyApp/中。注意，一个由应用程序开发者创建的资源应被放置在自己的应用程序包中。更多信息请参见“应用程序包”一章节。</p>
<p>Assistants<br />
帮助用户完成配置和其它任务的程序。</p>
<p>Audio<br />
声音插件和设备驱动。</p>
<p>ColorPickers<br />
根据某一模式取色的资源，例如HLS (Hue Angle, Saturation, Lightness) 取色器或RGB 取色器。</p>
<p>ColorSync<br />
ColorSync描述和脚本</p>
<p>Components<br />
系统中的插件和扩展。</p>
<p>document．tion<br />
文档文件和Apple 的帮助包（在子目录Help中），计算机上的用户和管理员可以使用它们。在本地域中，这个目录包含了Apple安装的帮助包（包括开发者文档）。</p>
<p>Extensions<br />
设备驱动和其他内部扩展（仅为系统域）。</p>
<p>Favorites<br />
时常被访问的文件夹，文件或Web站点的替身（仅为用户域）。</p>
<p>Fonts<br />
用于显示和打印的字体文件。</p>
<p>Frameworks<br />
框架和共享库。</p>
<p>Internet<br />
用于Internet的插件，库和过滤器。</p>
<p>Keyboards<br />
键盘定义。</p>
<p>Mail<br />
包含了用户的邮箱（仅为用户域）。</p>
<p>Preferences<br />
用户预置，请参见“系统预置”一章中的“用户配置”一节。</p>
<p>Printers<br />
打印驱动（由厂商提供）和PPD插件。</p>
<p>QuickTime<br />
QuickTime的插件和扩展。</p>
<p>Scripting Additions<br />
扩充了AppleScript功能的脚本及脚本资源。</p>
<p>Sherlock Plug-ins<br />
扩充了Sherlock功能的插件。</p>
<p>Sounds<br />
系统警告声。</p>
<p>StartupItems<br />
在启动时运行的系统及第三方的脚本和程序，更多信息请参见“引导和登入”一章中“启动项目”一节。</p>
<p>Web Server<br />
Web 服务器的内容，这个目录包含了CGI脚本以及所备置的Web页面。</p>
<p>——————————————————————<br />
Developer目录</p>
<p>用于开发Mac OS X软件的应用程序，工具，文档及其他资源是一个可选的软件安装包。当您安装开发工具时，安装程序会把所有软件组件放到位于启动卷（/Mac OS X）的Developer目录中。</p>
<p>Applications<br />
用户管理和建立软件项目（Project Builder），创建用户界面（Interface Builder）和执行调试程序的应用程序。</p>
<p>document．tion<br />
开发者文档</p>
<p>Examples<br />
分类组织的项目实例（Carbon，Java等等）。</p>
<p>Headers<br />
特殊的头文件，诸如：遗留的简单 Carbon头文件。</p>
<p>Java<br />
在Cocoa应用程序环境中用于Java桥接所需的文件。</p>
<p>Makefiles<br />
用于建立和改变项目所需的makefile（.make文件）和jamfile（.jam文件）。</p>
<p>Palettes<br />
Apple 提供的Interface Builder的调色板。</p>
<p>PBBundles<br />
Project Builder使用的可装载的束。</p>
<p>ProjectBuilder Extras<br />
Project Builder的模板和插件。</p>
<p>ProjectTypes<br />
Project Builder使用的项目类型的定义</p>
<p>Tools<br />
命令行开发工具，包括那些创建和生成HFS资源分支的工具。</p>
<p>Project Builder定义了一组makefile变量，当您的项目在文件系统域中指定位置时，应该会使用到它们。您应该使用这些变量而不是将目录路径硬编码，因为这些位置可能会被改变。</p>
<p>——————————————————————<br />
Classic环境的目录</p>
<p>Classic环境包含了几个用于支持Classic应用程序的目录。这些Classic环境下的目录是一个Mac OS 9安装版本中的目录。Mac OS X 需要为Classic环境安装一个 Mac OS 9.1（或更新的版本）。如果一个系统安装了一个比Mac OS 9更早的版本，用户必须安装一个更新的版本来支持Mac OS X。</p>
<p>一个系统可能有多个Mac OS 9版本安装在不同的分区上。如果是这种情况，系统预置的Classic设置面板将让用户为Classic环境选择使用其中的一个Mac OS 9版本。用户第一次启动Classic时，系统会将一些必要的文件附加到被选取的Mac OS 9卷的系统文件夹内。您也可以使用系统预置中的Classic设置面板随时启动或停止Classic运行环境。用户还可以使用“启动磁盘（Startup Disk）”系统预置来改变启动磁盘，以从Mac OS X变为直接启动进入Mac OS 9。</p>
<p>当您在一个卷上安装了Mac OS 9.1（或更新的版本）时，安装程序会创建几个目录来存储系统文件。表9-6列出了安装程序创建的目录以及关于其内容的描述。如果您已经安装了一个Mac OS X 和 Mac OS 9.1（或更新）的本版，Mac OS 9 的安装程序可能不会创建所有这些目录。</p>
<p>Applications (Mac OS 9)<br />
包含了Mac OS 9（Classic）的应用程序和实用工具。</p>
<p>document．<br />
包含了特定应用程序的信息。这个目录只能由Classic应用程序使用。Mac OS X应用程序会在适当的/Library目录中存储预置和其他应用程序文件。用户应该把他们的文档存放在他们自己的home目录当中。</p>
<p>System Folder<br />
包含了Classic环境的系统文件。</p>
<p>当您在一个已经装有Mac OS 9的系统上安装Mac OS X时，安装程序会执行一些额外的任务来支持Classic环境。尤其Mac OS X安装程序会创建一个Mac OS 9桌面文件夹的替身，并把它放在可以运行安装程序的管理员用户的桌面上。这个替身包含了在Mac OS X 安装之前Mac OS 9桌面上任何文件的链接。</p>
<p>本地化目录名</p>
<p>如果您的应用程序包安装了任何用户支持的目录，那么您不但可以为应用程序提供本地化名称，而且也可以为这些目录提供本地化名称。本地化您特定的应用程序目录名是不必要的，而且可能并不是所有情况下都是有效的。如果您想本地化您的应用程序支持的目录，您应该仅为那些您应用程序预先知晓其名称的目录进行本地化。不建议本地化“用户特定”的目录名。</p>
<p>要本地化目录名，您必须为目录名加上.localized扩展并将其默认设置为隐藏。然后在您的目录中再创建一个名为.localized的子目录。在这个子目录中，为您想支持的每个本地化版本创建一个strings文件。strings文件包含了目录名的本地化版本的单一入口。举个例子，一个用English,，Japanese和 German本地化的Release Notes目录将包含以下结构</p>
<p>Release Notes.localized/<br />
         .localized/<br />
         en.strings<br />
         de.strings<br />
         ja.strings </p>
<p>在每个strings文件当中，您要把非本地化目录名转变成本地化目录名。举个例子，要转换目录名“Release Notes”成为一个本地化目录名，每个strings文件都要包含类似以下的条目。</p>
<p>“Release Notes” = ”Localized name”</p>
<p>注意：许多系统定义的目录在他们的名称里并不包含.localized扩展名。因为这些目录在引入本地化文件系统名之前已经存在。对于这些已知的目录，Mac OS X转而在目录中查找名为.localized的空文件。如果此文件存在，那Mac OS X就会显示其本地化目录名文本。</p>
<p>——————————————————————<br />
HFS+ 和 UFS的不同点</p>
<p>在Mac OS X的两种主要文件系统：HFS+和UFS上，有着许多重要的不同点。在许多情况下，这些不同会与在Mac OS X上开发的程序有关联。以下列表总结了在这两个文件系统中的主要不同点（有些陈述既适用于HFS又适用于HFS+）：</p>
<p>大小写敏感：UFS对大小写是敏感的，而HFS+对大小写不敏感，但它可以保留大小写。</p>
<p>多分支：HFS+支持多分支（和附加的元数据）而UFS只支持单一分支（Carbon在不支持多分支的系统“如：UFS”上模似多分支结构）。</p>
<p>路径分隔符：HFS+使用冒号作为路径分隔符，而UFS中使用的则是正斜杠。系统能够在这些分隔符间进行转换。</p>
<p>修改日期：HFS+支持对文件的创建和修改日期的记录，它们将作为文件元数据被保存；而UFS只支持对文件修改日期的记录，不支持对文件创建日期的记录。如果您用一条命令来复制一个文件，这条命令将会处理修改日期，但不会处理创建日期，当它为一个副本创建一个新的文件时，这条命令将会重设其修改日期。由于这一原因，很可能会使一个文件的创建日期要比其修改日期更晚。</p>
<p>Sparse文件和零填充：UFS支持sparse文件（稀疏文件），它是一种文件系统存储文件数据的方法，其不存储分配给文件的未被使用的空间。HFS+不支持sparse文件，事实上可以用”零”为文件填充所有未使用的字节直到文件结束。</p>
<p>对文件系统项目的轻量级引用：请见“替身和符号连接”一节。</p>
<p>另外，那些已往与每种文件系统相关联的API有时会具有不同的特性。举个例子，一个使用了BSD （或来源于BSD）API的程序可以删除一个打开着的文件；而另一方面，一个Carbon程序只可以删除一个已关闭的文件。</p>
<p>——————————————————————<br />
替身和符号连接</p>
<p>替身和符号连接是对文件夹和目录的轻量级引用。替身与Mac OS标准格式（HFS）和Mac OS 扩展格式（HFS+）相关联，而符号连接是UFS文件系统的一个特征。替身和符号连接都允许对文件夹和目录多次引用，而不需要为这些项目建立多份副本。Mac OS X 10.2之前，当移动或改变一个被引用的文件或文件夹时，替身和符号连接在处理方式上会有很大不同。</p>
<p>原先，替身首先用文件夹和目录的唯一标识来定位他们，其次才是用他们的路径。如果您在同一个卷上移动一个文件，任何指向那个文件的替身仍会指向原本那个位置。假如您删除某个文件，并用一个同名的文件代替它，替身仍可以工作，因为他们可以用路径来定位文件。而从Mac OS X 10.2起，替身颠倒了其搜索顺序，先使用路径后使用文件标识。</p>
<p>因为替身和符号连接都使用一个文件系统路径来断定文件位置，因此他们都提供了类似的基本工作方式。如果您用一个同名文件替换某个文件，把旧文件移到新的位置上，替身和符号连接都将指向新的文件。然而，如果您移动某个文件而不是替换它，符号连接会产生文件中断，但替身则不会。</p>
<p>在HFS 和HFS+文件系统中，每个文件和目录都会具有一个唯一的固定标识。替身存储了这个唯一标识以及文件或目录的路径信息。如果不能通过替身中的路径信息来找到文件，替身则会试图使用其唯一标识来定位文件。如果找到了文件，替身会用新的路径信息更新其内部记录。同样，如果路径正确，而唯一标识有错误，替身也会用新文件唯一标识来更新其内部记录。</p>
<p>如今Finder和其他系统应用程序用先查找路径的方式来使用替身。然而，通过使用Alias Manager（替身管理器）的方法来处置替身时，将仍会使用先根据文件唯一标识来查找的方式。</p>
<p>如果您的应用程序支持Mac OS X 10.2以前的Mac OS X 版本，则当您修改文件时应该遵守某些准则。首先，当需要编辑文件时，可修改已有的文件。其次，如果您明显需要用一个新版本来替换某个文件，可用FSExchangeObjects来将旧的文件替换成新的。NSdocument．用一种类似的方法来更新文档文件。因此，无论何时替身都能保持有效。</p>
<p>——————————————————————<br />
下图对照早期的Mac OS系统描述了Mac OS X中资源是如何存储的。</p>
<p>虽然Apple支持“在同一文件中存储所有资源（all-resources-in-one-file）”的模式，但强烈建议开发者将他们的资源存放在各自的独立文件中。基于此的一种考虑是为了结合XML的使用来作为来指示资源的一种方式。Carbon具有基于XML的运行时工具，Interface Builder可以使用XML来输出用户界面。</p>
<p>如同应用程序一样，Mac OS X上的文档也可将其资源存放在数据分支中。其原因与应用程序把资源存放在数据分支中的原因是相同的。它使得在Macintosh系统与非Macintosh系统（包括大部分的Web服务器）间交换文档，而不丢失资源数据成为可能。</p>
<p>存放在HFS 和HFS+文件系统中的文件在独立于资源分支和数据分支以外的一个私有分支中存储了Finder属性。这些属性包含了类型代码和创建者代码。Mac OS X保留了这些属性，因为这些属性能使Finder增强用户体验。然而同时，Apple强烈鼓励开发人员选择使用文件扩展名作为识别文件类型的方法。Mac OS X在识别和处理文档扩展名方面做的非常好。正如在“Finder”一章的“复制和移动操作”一节中所描述那样，如果您复制一个HFS 或HFS+文档到不同平台（包括Web服务器）中时，文件扩展名将有助于保证文档的类型信息。</p>
<p>文件编码和字体</p>
<p>虽然Unicode被认为是Mac OS X的基本编码，但并没有一种文件编码对所有情况都是默认的。使用（或应该使用）何种文件编码，取决于您在所使用的API和底层文件系统上具体想要做什么。</p>
<p>举个列子，用于文件名的编码在不同的文件系统中是不一样的。Mac OS 扩展格式文件系统(HFS+)使用一种Unicode的特殊形式为文件名编码，即在UTF-16格式（16位编码序列）中被规范出的Unicode 2.1版本。UFS文件系统使用一种不同的Unicode格式来编码文件名。它包含了Unicode2.1或更新版本中的任何字符，但使用的是UTF-8格式（8位编码序列）。Mac OS标准格式（HFS）使用传统的Mac编码，诸如MacRoman。注意，由于实现方式不同，在HFS+卷上文件名中不正确的Unicode编码有可能会在Mac OS 9系统上正常显示，但通常在Mac OS X上又显示成混淆的字符。</p>
<p>而且，所有调用BSD系统例程的代码都应保证这些例程的const *char参数是以UTF-8编码的。所有BSD系统函数期望其字符串参数以UTF-8编码，而不能是其他的编码。另外要告诫的是文件，路径和其他文件系统实体在作为字符串参数时必须要以规范的UTF-8编码。在规范的UTF-8 Unicode的字符串参数中，所有可分解的字符会被分解；举个例子，é (0x00E9)被表示为e (0&#215;0065) + ′ (0&#215;0301)。在使用在Cocoa和 Carbon （包括Core Foundation）中定义的”文件系统表示”API时，要以规范的UTF-8编码。举个例子，在Cocoa中得到一个规范的UTF-8字符串，要使用NSString的fileSystemRepresentation方法；而对非正规的UTF-8字符串，使用NSString的UTF8String方法。</p>
<p>如果您使用常规的QuickDraw并想绘制文本，您应注意一些潜在的问题。Carbon文件管理器会产生一些返回Mac编码的调用和其他一些返回Unicode的调用。如果您有一个Unicode文本，您在用QuickDraw Text对其绘制时会有一些问题，因为其API不直接支持Unicode。另一方面，如果您得到一个Mac编码的文本并想使用Unicode Imaging (ATSUI) API中Cocoa 和 Carbon的Apple Type Services，您必须首先将其转换成Unicode。</p>
<p>通常，所使用的编码取决于您使用的API而不是字体。字体并不必须限制于特定的编码。举个例子TrueType字体声明了一组字型，他们实现并提供了在特定编码中映射那些字型为字符值的编码表。PostScript字体有类似的编码列表。操作系统的各个部分知道如何映射字符从一种编码到另一种编码。Cocoa 和ATSUI使用Unicode作为一种字体的“目的”映射。Carbon 中的QuickDraw Text使用Mac编码，它是根据字体的&#8217;FOND&#8217;资源相对应的语系来选择的。</p>
<p>安装在Mac OS X上的字体拥有大量的字符组，它们支持广泛的编码和语系。举个例子，系统字体Lucida支持扩展的拉丁语（Latin）, 希腊语（Greek）, 斯拉夫语（Cyrillic）, 阿拉伯语（Arabic）, 希伯来语（Hebrew）和泰国语（Thai）。但如果您通过QuickDraw Text来绘制文本，那您只能访问MacRoman字符表。要访问其余的部分，则您必须使用Cocoa或 ATSUI。同样日语中的Hiragino字体也有一个巨大的字符表，它超越了MacJapanese所支持的范围，它们只有通过Cocoa 或ATSUI才可以访问到。当被请求的其他字体中的字型不可用时，Cocoa 和 ATSUI会将其替代；然而，他们替代字体的算法是不同的。</p>
<p><strong>Mac OSX</strong><strong>的引导和登录</strong></p>
<p>“引导”指系统为准备投入使用而执行的一系列动作。引导流程包括许多不同的任务，例如初始化硬件、启动系统守护程序（system daemon）以及显示登录窗口。当用户登录后，系统将完成另一系列动作，用以为用户建立计算环境。</p>
<p>我在这里将对开发人员在编写软件时可能会遇到的“引导流程（boot sequence）”进行说明。也将说明如何使用各种有效的“钩子”方法来定制引导进程。</p>
<p>注意：man命令帮助页是一种联机文档，对本章所提及的大部分守护程序和实用程序都有效，您可以查阅这些文档以获取更多的信息。欲从终端应用程序显示man命令帮助页，请在命令行上输入man，接着输入程序名称：例如，&gt; man getty（此处，&gt;为提示符）。您也可从Project Builder的帮助菜单访问man命令帮助页。</p>
<p>引导流程</p>
<p>在从用户打开Mac OS X系统到登录窗口出现的这个时间段内，Mac OS X将执行一个引导流程，使系统处于准备使用状态。本节将对在此流程期间所发生的事件进行概括。</p>
<p>BootROM</p>
<p>当打开Macintosh计算机的电源后，BootROM固件是被激活的第一个代码。BootROM（它是计算机硬件的一部分） 有两个主要的职责：初始化系统硬件以及选择引导操作系统。BootROM有两个组件帮助其实现这些功能：</p>
<p>POST（Power-On Self Test，开电自检）对一些硬件接口进行初始化，并检查是否有足够的RAM存储器可供使用以及是否处于良好状态。</p>
<p>Open Firmware对其余硬件进行初始化、创建初始设备树（一个计算机相关设备的分层表示法）以及选择所使用的操作系统。</p>
<p>相同版本的BootROM可启动Mac OS 9以及Mac OS X。</p>
<p>————————————————<br />
BootX</p>
<p>当BootROM（或用户）选择Mac OS X作为引导的操作系统后，控制权就传递给了BootX 引导程序（位于/System/Library/CoreServices目录内）。BootX的主要任务是装载内核环境。当执行此任务时，BootX在屏幕上显示“booting（引导中）”图像。</p>
<p>当装载内核环境时，BootX将首先尝试为涉及引导进程的硬件装入一组预先存储的设备驱动程序（称为mkext缓存）。如果该缓存丢失或遭破坏，BootX将在/System/Library/Extensions目录内搜索驱动程序和其它的内核扩展，这些驱动程序或内核扩展的OSBundleRequired属性被设置为一种合适的引导类型（例如，本地或网络引导）的值。关于OSBundleRequired关键字以及系统引导时装载设备驱动程序的更多信息，请参阅“内核开发人员文档”。</p>
<p>一旦装载了内核以及引导所必需要的所有驱动程序，BootX就开始内核初始化进程。此时，有足够多的驱动程序被装载，以帮助内核来寻找根设备。另外从此时开始，Open Firmware将不再能被访问。</p>
<p>内核将首先初始化Mach和BSD数据结构，然后初始化I/O Kit。通过使用设备树决定链接的驱动程序，I/O Kit将装入的驱动程序与内核连接。一旦内核找到根设备，它将通知BSD。</p>
<p>最后，内核启动mach_init进程。mach_init进程是Mach引导端口服务程序，它启用Mach消息传递。</p>
<p>在安装根文件系统后，系统初始化将继续运行系统启动项目并启动所有系统守护程序（参阅“系统初始化”）。</p>
<p>系统初始化</p>
<p>mach_init进程将启动BSD init进程。后一进程的进程标识符（PID）为1，它“拥有”系统的所有其它进程。尽管具有中心地位，但init进程是简单的，它执行了四个主要任务:</p>
<p>1．确定用户想要进入单用户模式还是通过CD-ROM引导。如果其中任一情况适用，将打印一个询问，并将控制权移交给用户。</p>
<p>2． 运行完成基本初始化任务的系统初始化外壳脚本，即/etc/rc.boot和/etc/rc。详细内容请参阅“rc.boot 和rc脚本”。</p>
<p>/etc/rc脚本运行SystemStarter程序，它处理更多被指定为“启动项目”的特定初始化任务。详细内容请参阅“启动项目”。</p>
<p>3． 通过getty命令，init将启动loginwindow应用程序，它将显示登录窗口并管理用户登录过程。详细内容请参阅“管理用户会话”。</p>
<p>4．作为所有进程的父进程， init在这些系统进程终止时，将对它们进行所有必要的清理。</p>
<p>尽管init进程拥有系统的所有其它进程，但仍然可区分用户进程和系统进程。启动项目以及所有在loginwindow应用程序以前运行的应用程序构成了系统进程组。这些应用程序为系统的所有用户提供服务，它们通常是init进程的子进程。在启动loginwindow后被创建的进程构成了用户进程组。用户进程总是与一个特定的用户会话相关联，它们通常是用户会话的窗口管理器（Window Manager）进程的子进程。</p>
<p>注意：并非所有的用户进程都是窗口管理器（Window Manager）进程的子进程。用户可以是由root启动的进程和某些特殊系统进程的拥有者，这些进程是init进程的子进程。您可使用进程显示程序（Process Viewer）应用程序来确定系统任何进程的拥有者和父进程。</p>
<p>当用户注销会话时，loginwindow应用程序将终止在该用户会话期间内运行的所有进程，这是完全结束会话的必要条件。而系统进程将不受用户注销的影响，只有当系统本身关闭或重启动时系统进程才被终止。关于注销、重启动或关机流程的更多信息，请参阅“注销”。</p>
<p>————————————————<br />
rc.boot和rc脚本</p>
<p>/etc中的rc.boot和rc Bourne外壳脚本执行了基本的初始化任务。rc.boot脚本首先执行一次文件系统一致性检验（file-system consistency check ，fsck），并使存储器与文件系统同步（sync）。然后，rc脚本将完成下列动作:</p>
<p>启动设备驱动程序的装载程序（kextd）。</p>
<p>启动ATS服务程序。</p>
<p>启动窗口服务程序。</p>
<p>运行更新后台进程，它周期性地刷新文件系统缓存。</p>
<p>为虚拟存储系统创建交换文件并启动动态页面调度程序。</p>
<p>最后，rc脚本启动SystemStarter程序，处理本地与系统启动项目（请参阅“启动项目”）。</p>
<p>由于rc脚本是简单的Bourne外壳脚本，您可以直接阅读其源代码，以确切地了解所发生的事情。关于在系统安装期间所启动的守护程序的更多信息，请参阅“系统守护程序”。</p>
<p>————————————————<br />
启动项目</p>
<p>启动项目是为Mac OS X系统正常运转而在引导的最后阶段运行的过程。它们由程序（包括外壳脚本）组成，这些程序执行诸如清除临时文件和启动系统守护程序等任务。</p>
<p>Apple提供的系统启动项目位于/System/Library/StartupItems中。您不可修改在此目录中的项目。然而，您可定义自己的启动项目并将它们存放在/Library/StartupItems中。关于如何创建自己的启动项目的说明，请参阅“创建定制启动项目”。</p>
<p>SystemStarter程序是由rc脚本运行的最后程序，它协调所有启动项目的执行。了解SystemStarter的功能对理解什么是启动项目是有帮助的。启动项目是一个包含至少两个文件的文件夹:</p>
<p>一个程序（一般为一个外壳脚本），其名称与文件夹名称一致。</p>
<p>一个配置属性列表文件</p>
<p>每一个启动项目的配置属性列表都被命名为StartupParameters.plist。此属性列表指定了启动项目的名称，更重要的是，多层次地指定了启动项目间的相互依赖关系。属性列表中的值指明该启动项目可以提供何种服务，在启动该项目前应首先运行何种服务，以及该启动项目本身需要使用何种服务（如果需要）。SystemStarter使用这些相互依赖关系的信息来决定所有启动项目的启动次序。</p>
<p>SystemStarter程序并行地启动尽可能多的启动项目。将启动项目根据它们的相关性组织成不同的组。只有当同一组的项目都被启动后，下一组的项目才开始被启动。</p>
<p>关于StartupParameters.plist中键值对的更多信息，请参阅“创建定制启动项目”。关于属性列表的一般信息，请参阅“属性列表”。</p>
<p>表4-1列出了由Mac OS X提供的核心启动项目，以及关于它们功能的简要说明。其它启动项目可由第三方应用程序或由诸如QuickTime这类系统组件来安装。表中给出的次序是执行这些项目的通常次序。准确的次序由SystemStarter程序在引导时决定。</p>
<p>表4-1 核心系统启动项目</p>
<p>启动项目</p>
<p>说明</p>
<p>SystemTuning<br />
系统调制</p>
<p>基于诸如可用内存等因素，为系统设置性能参数。</p>
<p>SecurityServer<br />
安全服务</p>
<p>启动检查系统授权、验证及钥匙串（keychain）访问的安全服务程序。</p>
<p>ConfigServer<br />
配置服务</p>
<p>为依赖于configd守护程序的启动项目充当一个占位符。现在该守护程序在启动项目阶段之前就被启动，所以不推荐使用此启动项目，在今后的版本中它也可能会被删除。</p>
<p>Disks<br />
磁盘</p>
<p>启动自动磁盘装载（autodiskmount）守护程序，用于检查及安装本地磁盘。</p>
<p>Accounting<br />
帐号管理</p>
<p>启动帐号管理系统（accton），为启动的每一个进程将帐号信息写入/var/account/acct。</p>
<p>Network<br />
网络</p>
<p>根据/etc/iftab中的数据，配置本地网络接口、设置机器的主机名、配置网络路由（如果被指定）、打开或关闭IP路由（如果被指定）、在内核中设置机器的主机标识符，以及装载可在所有应用程序环境（包括Classic环境）中共享一个IP地址的共享IP内核扩展。</p>
<p>NetworkExtensions<br />
网络扩展</p>
<p>装入若干网络相关的内核扩展。</p>
<p>BIND<br />
启动本地DNS服务程序。</p>
<p>mDNSResponder<br />
启动多址广播DNS应答程序，它支持Rendezvous及Apple的零配置联网工具。</p>
<p>Portmap<br />
端口映射</p>
<p>启动端口映射（portmap）守护程序。</p>
<p>SystemLog<br />
系统日志</p>
<p>启动系统日志（syslogd）守护程序。</p>
<p>AppleTalk<br />
以路由器模式、多重连接（非路由器）模式或在单一端口（如同在/etc/hostconfig中定义的那样）运行AppleTalk启动程序。</p>
<p>CrashReporter<br />
崩溃报告</p>
<p>如果崩溃报告功能被设置为可用，则启动崩溃报告程序（CrashReporter）。</p>
<p>LDAP<br />
启动LDAP服务。</p>
<p>NetInfo<br />
启动NetInfo服务程序（netinfod和nibindd）。</p>
<p>NIS<br />
启动网络信息服务（Network Information Services）。</p>
<p>DirectoryServices<br />
目录服务</p>
<p>启动名字解析器（lookupd）守护程序</p>
<p>NetworkTime<br />
网络时间</p>
<p>启动使用网络时间协议（Network Time Protocol，NTP）的网络时间服务。</p>
<p>LoginWindow<br />
登录窗口</p>
<p>标记系统具有它需要用于启动loginwindow应用程序的服务。当SystemStarter在后台继续载入其他启动项目时，init进程将启动此应用程序。</p>
<p>SSH<br />
如果远程访问被设置为可用，则启动sshd守护程序。根据需要，此启动项目也会按需要产生安全外壳加密键（secure shell encryption key）。</p>
<p>NFS<br />
启动网络文件系统（NFS）服务，用于执行异步块I/O（nfsiod），安装远程文件系统，和启动自动装载程序（automounter），如果NetInfo数据库显示计算机应导出一使用NFS的文件系统，则启动NFS服务程序。</p>
<p>Samba<br />
启动Samba服务程序（smbd），它通过服务程序信息块（Server Message Block，SMB）协议提供网络联通。</p>
<p>AuthServer<br />
验证服务</p>
<p>启动验证服务程序。</p>
<p>AppServices<br />
应用服务</p>
<p>启动核心服务（coreservicesd）守护程序。</p>
<p>PrintingServices<br />
打印服务</p>
<p>启动CUPS打印服务（cupsd）守护程序。</p>
<p>IPServices<br />
IP服务</p>
<p>启动TCP/IP协议服务（inetd）、主机配置服务（BOOTP）以及netboot客户机管理服务程序。</p>
<p>AppleShare<br />
如果检测到网络连接，则启动AppleShare服务。</p>
<p>SendMail<br />
启动外发邮件服务（sendmail）守护程序，整理外发邮件队列目录。</p>
<p>Apache<br />
如果网络共享被设置成可用，则运行Apache HTTP服务程序httpd。</p>
<p>Cron<br />
运行cron守护程序。</p>
<p>“系统守护程序” 一节将对上表提到的一些守护程序和服务进行简要说明。</p>
<p>对于存在于/System/Library/StartupItems文件夹中的各启动项目，并不能保证它们的服务对于用户都是可用的。每个启动项目都可以通过访问/etc/hostconfig中的配置信息，并使用此信息来评估是否需要启动其服务。许多启动项目都使用此配置信息（尽管也有一些必需的启动项目并不如此），检查此配置信息的启动项目有：AppleTalk，AppleShare，AuthServer，Disks，SSH，SendMail，IP Services以及Apache。</p>
<p>————————————————<br />
系统守护程序</p>
<p>当用户登录到Mac OS X系统时，许多进程已处于运行状态。这些进程的大多数是由系统创建并运行于后台的守护程序或服务程序。少数是由loginwindow应用程序和窗口管理守护程序为用户创建的。在登录后立即启动进程显示程序(Process Viewer)（位于/Applications/Utilities），将引出一个类似图4-1中显示的窗口。</p>
<p><a href="http://www.chinamac.net/upload/forum/200511880848.gif" target="_blank">[ 相关贴图 ]</a></p>
<p>图4-1 在进程显示程序中显示的进程</p>
<p>表4-2对一些标准的守护程序和服务程序进行说明。由于取决于系统配置和用户预置，一些守护程序可能被禁用或根据需要被启动（请参阅“根据需要启动守护程序”）。相反地，由于安装了附加服务，系统也可以运行其它守护程序。</p>
<p>表4-2 常用的系统守护程序和服务程序</p>
<p>守护程序<br />
说明</p>
<p>ATSServer<br />
ATS服务</p>
<p>Apple Type Solution服务程序，启用系统范围内的字体管理。</p>
<p>autodiskmount<br />
自动磁盘装载</p>
<p>自动装载所有设备，包括硬盘及可移动介质。</p>
<p>automount<br />
自动装载</p>
<p>当NFS文件系统被首次访问时自动装载它们，而以后当它们闲置时则将它们卸载。虚拟文件系统的装载点首先作为本地文件系统的符号链接出现。读取此符号链接将触发相关远程文件系统的自动装载。</p>
<p>configd<br />
自动地配置并维持网络。</p>
<p>cron<br />
定时执行预定的命令或脚本。</p>
<p>dynamic_pager<br />
与内核默认页面调度程序通信，以创建或删除交换文件（在/private/var/vm内）；这些文件被用作为虚拟内存的后备存储器。</p>
<p>inetd<br />
用来侦听某些socket连接的互联网“超级服务程序”。当发生连接时，inetd可确定该socket符合何种服务，并调用适当的程序满足其需求。</p>
<p>init<br />
系统初始化进程。此进程是大多数系统级别进程的父进程。</p>
<p>kextd<br />
设备驱动装载程序。在系统启动期间，此守护程序装载未被BootX装入的所有剩余的设备驱动程序。启动后，kextd负责动态地装载及卸载设备驱动程序。</p>
<p>lookupd<br />
一个名字解析器，它向诸如NetInfo和DNS的网络信息服务发出查找请求。</p>
<p>mach_init<br />
Mach引导端口服务程序，通过它来启用Mach消息传递。同时，它也启动init进程。</p>
<p>mDNSResponder<br />
多址广播-DNS应答器守护程序。</p>
<p>netinfod<br />
NetInfo服务程序，为每一个域提供服务。</p>
<p>nfsiod<br />
针对一个NFS服务器的异步请求。大多数系统都具有运行此守护程序的多个实例。</p>
<p>nibindd<br />
查找、创建及清除NetInfo服务程序（请参阅“netinfo”）。</p>
<p>pbs<br />
粘贴板服务程序（类似于Mac OS 9中的剪贴板）可实现应用程序之间的数据交换。同时，它也是用于拖曳操作的数据转移机构。请参阅“剪贴板” 以获取更多信息。</p>
<p>portmap<br />
将RPC程序号转换为互联网（DARPA协议）端口号。它必须在进行PRC调用前运行。</p>
<p>syslogd<br />
记录系统错误日志和状态消息。</p>
<p>update<br />
更新</p>
<p>定时地刷新文件系统缓存，以防系统崩溃引起数据丢失。</p>
<p>Window Manager<br />
窗口管理器</p>
<p>窗口服务程序。请参阅“Quartz Compositor”以获取更多信息。此进程是大多数用户进程的父进程。</p>
<p>为获取更多的信息，请参阅“可供大多数守护程序使用的man命令帮助页”。</p>
<p>————————————————<br />
根据需要启动守护程序</p>
<p>Mac OS X为系统守护程序的随选启动提供支持，并将此特性用于一些系统启动项目中。通过推迟启动所有非急需的守护程序，随选启动可改进系统性能。即使在非活动阶段，守护程序也能被关闭以保存系统资源。</p>
<p>随选启动对于它所支持服务的客户端是透明的。当客户端将一条消息发送至当前被关闭的守护程序时，mach_init将自动地装载该守护程序所需要的任何服务，然后启动该守护程序。一旦该守护程序被启动并运行，它将用mach_init来登记，并要求对其Mach端口的接收权。一旦具有对其端口的接收权，守护程序就可对来自那些端口的消息作出正常反应。</p>
<p>由于涉及与内核的交互作用，如何创建随选守护程序已超出本书的范围。关于内核和Mach端口消息传递的更多内容，请参阅“Inside Mac OS X：Kernel Programming（内核编程）”。</p>
<p>————————————————<br />
管理用户会话</p>
<p>在系统初始化周期内，init进程将启动loginwindow应用程序来管理用户会话。loginwindow应用程序显示登录窗户，并为用户提供若干服务。本节将讨论loginwindow应用程序所提供的服务以及由loginwindow提供的用户环境。</p>
<p>————————————————<br />
登录</p>
<p>通过调用其它所需的系统服务，loginwindow应用程序将协调登录进程和用户会话。依赖于用户的登录预置，loginwindow可提示用户使用一个有效的登录名和口令，或使用缓存值来自动登录。当用户的登录名和口令被验证（请参阅“验证用户”）后, loginwindow将继续装载用户环境。</p>
<p>当用户登录时，loginwindow进行如下工作:</p>
<p>安装用户计算环境（包括预置、环境变量、设备和文件权限以及钥匙串访问等）。</p>
<p>请参阅“建立用户环境”以获取更多信息。</p>
<p>启动Dock，Finder以及SystemUIServer。</p>
<p>如果正在安装，则启动安装助手（Setup Assistant）。</p>
<p>自动启动在登录项目系统预置中指定的应用程序。</p>
<p>当所有指定的应用程序被启动及运行后，登录过程结束。</p>
<p>loginwindow应用程序使用启动服务（Launch Services）启动所有的应用程序，包括Finder, Dock，SystemUIServer以及用户指定的应用程序。用户会话中的大多数应用程序是作为窗口管理器进程的子进程（而不是作为loginwindow的子进程）来运行的。</p>
<p>如果Finder或Dock进程由于某种原因而终止，loginwindow将自动重新启动它们。同样地，如果loginwindow应用程序终止，init进程也将自动重新启动它。</p>
<p>一旦用户会话被启动并运行，loginwindow将以下列方式监视会话和用户应用程序：</p>
<p>管理注销、重启动及关闭进程。请参阅“注销系统”以获取更多的信息。</p>
<p>管理强制退出（Force Quit）窗口，它包括监视当前正在使用的应用程序、对强制退出应用程序以及重新启动Finder的用户请求作出响应。（用户可从Apple菜单或通过按Command-Option-Escape打开此窗口。）</p>
<p>从隐含的应用程序（即，看不到用户界面的应用程序）接收到通知后，即显示报警对话框。</p>
<p>将所有标准错误（stderr）输出写入一个log文件（/var/tmp/console.log）中，而控制台（Console）应用程序将以此文件作为输入。</p>
<p>————————————————<br />
验证用户</p>
<p>用户在进入系统以前，Mac OS X要求进行用户验证。尽管loginwindow应用程序管理用户验证进程，但它本身并不验证用户。loginwindow应用程序获取在登录屏幕上指定的用户信息，然后将其它传递给目录服务以作验证。一旦目录服务完成用户验证，loginwindow就将启动用户会话。</p>
<p>如果选择了“自动登录”选项， loginwindow应用程序将不为用户提示登录信息。每次只能有一个用户可以从“帐号（Accounts）”系统预置中的“用户（Users）”页中启用此选项。同时，用户也必须通过点击“设置自动登录（Set Auto Login）”控件来输入一组正确的登录口令。</p>
<p>————————————————<br />
建立用户环境</p>
<p>当用户登录到系统时，loginwindow应用程序将建立用户环境以及记录有关登录的信息。下列项目概括了由loginwindow执行的用于恢复用户会话的任务:</p>
<p>1．为了保护登录会话免遭未被授权的远程访问，系统不允许用粘贴板服务（即剪贴板）的端口来注册远程启动的应用程序。这样，对于这些进程的一些标准功能会被阻塞，例如：拷贝、剪切、粘贴、Apple事件、窗口最小化及其它服务。</p>
<p>2．将登录信息记录在系统的utmp数据库中。</p>
<p>3．为控制台终端设置所有者和权限。</p>
<p>4．重新设置包括全局系统默认值（NSRegistrationDomain）的用户预置参数。</p>
<p>5．用引导端口注册粘贴板服务程序（pbs）并启动pbs。</p>
<p>6．按照用户预置来配置鼠标、键盘及系统声音。</p>
<p>7．设置用户分组权限（gid）。</p>
<p>8．从目录服务检索用户记录并将该信息用于会话。</p>
<p>————————————————<br />
注销</p>
<p>注销、重启动系统及关闭系统的过程具有相似的语义。前台进程通常启动这些过程以响应用户从Apple菜单中选择的项目；然而，通过程序方式将一个适当的Apple事件发送至loginwindow应用程序，其进程也能启动这个过程。另外，在loginwindow应用程序执行此过程中，它会发出警报及通知来使各应用程序在关闭前有机会对它们自身进行清理。</p>
<p>一个典型的注销/重启动/关机过程如下:</p>
<p>1．用户从Apple菜单中选择注销、重启动或关机。</p>
<p>2．通过将一个Apple事件发送至loginwindow应用程序，前台应用程序启动用户请求。（关于事件列表，请参阅“应用程序职责”。）</p>
<p>3．loginwindow应用程序给要求确认此操作的用户显示一警报。</p>
<p>4．如果用户确认此操作，loginwindow将一个Quit Application Apple事件（kAEQuitApplication）发送至每个前台和后台用户进程。</p>
<p>5．loginwindow应用程序停止用户会话并继续此操作。</p>
<p>在注销操作中，loginwindow将取消事件队列中的所有事件，启动注销钩子程序（如果定义了一个的话），记录注销信息，将设备权限和用户预置参数重置为它们的默认值，并将控制权交还给登录窗口。（关于注销钩子程序的更多信息，请参阅“定制登录和注销过程”。）</p>
<p>重启动时，loginwindow将设备权限和用户预置参数设置为默认值、关闭系统，然后重新打开电源启动引导进程。</p>
<p>关机时，loginwindow关闭系统电源。</p>
<p>当接收到Quit Application事件时，前台进程也可以选择不终止。请参阅“终止进程” 以获取更多信息。</p>
<p>————————————————<br />
应用程序职责</p>
<p>为实现注销、重新启动或关机流程，前台应用程序必须将一个适当的Apple事件发送至loginwindow应用程序。一旦接收到该事件，loginwindow应用程序就开始关闭用户会话的进程。依赖于由该进程所发送的Apple事件，loginwindow可能会（也可能不会）用一个警报来通知用户，以让用户有机会中止这一流程。</p>
<p>以下所列各项是在注销、重新启动及关机过程中首选的Apple事件。这些事件不需要参数。</p>
<p>kAELogOut</p>
<p>kAEShowRestartDialog</p>
<p>kAEShowShutdownDialog</p>
<p>一旦收到其中之一的事件后，loginwindow将发出一个警报，把即将发生的动作通知用户。此时，用户可以使动作继续或中断。如果用户使动作继续，loginwindow会将一个Apple事件发送至每个请求它退出的应用程序。请参阅“终止进程”。</p>
<p>除了首选的Apple事件外，还有两个附加事件可命令loginwindow立即进行重新启动或关机流程。kAERestart和kAEShutDown Apple事件可进行温和的系统重启或关机。然而，这些事件应该被明智地使用，因为它们都不会给用户发送信息或允许用户中断流程。</p>
<p>注意</p>
<p>如果注销、重新启动或关机事件源自Classic环境中的一个应用程序，那么此事件仅仅影响Classic环境和它的应用程序。用户会话的其余部分将继续运行。</p>
<p>————————————————<br />
终止进程</p>
<p>在执行注销、重新启动或关机流程以前，loginwindow应用程序将会试图终止所有前台及后台用户进程。loginwindow应用程序给每个进程发送一个kAEQuitApplicationApple事件，以便让它们得以温和地关闭。对于前台进程，loginwindow将等候一个答复。对于后台进程，loginwindow将发送一个kill命令来终止此进程，而不管任何答复。</p>
<p>当前台进程从loginwindow收到Quit Application Apple事件（kAEQuitApplication）时，它会立即终止自身或在要求用户先做出决定时发出一警报对话框（例如，当有一个未保存的文件时）；当这些情况被解决后，应用程序既被终止。如果用户决定中断终止流程（例如通过在保存对话中点击取消按钮），应用程序将返回一个userCancelledErr错误，以对此事件作出反应。如果前台应用程序没有在45秒内作出反应或终止它自身，loginwindow将自动地中断终止流程。此安全措施将在各种状况下保护数据，例如：当应用程序正在将一个大文件保存到磁盘，以及在所分配时间内不能完成终止时。如果前台应用程序无反应且不在做任何事情，则用户必须在继续进行此过程前使用Force Quit窗口将其杀除。</p>
<p>对于链接Carbon、Cocoa或Java的用户后台进程，过程略有不同。通过给它们发送一个Quit Application Apple事件（kAEQuitApplication），Loginwindow通知即将被终止的进程。然而，它并不等待该进程的答复。Loginwindow将继续终止任何打开的后台进程，而不管任何返回的错误。</p>
<p>loginwindow应用程序不会终止驻留在系统环境中的进程。此规则适用于在引导时系统启动的所有守护程序和系统启动项目。这些进程驻留在用户会话的环境外，仅仅在重新启动或关机时才被终止。Loginwindow也不会清除独立于Carbon、Cocoa或Java的后台进程，即使它们是从用户环境中启动的。（尽管是从用户环境中启动的，当用户注销时这些进程将被系统接管。）Mac OS X不会在终止系统进程前给它们发送任何通知。</p>
<p>定制技术</p>
<p>Mac OS X引导进程包含开发人员可用来定制进程的若干切入点。开发人员可创建在引导时被启动的新的系统守护程序和服务。开发人员和系统管理员也可创建在用户登录到系统时被运行的初始化脚本。</p>
<p>创建定制启动项目</p>
<p>通过创建新的启动项目，您可把专用的功能加入引导流程。在“启动项目”中描述的启动项目是一个程序或外壳脚本，它们在首次登录会话以前执行各种服务，例如启动系统守护程序、删除旧文件或任何其它维护任务。</p>
<p>启动项目在引导流程的最后阶段运行（通过SystemStarter程序）。此时，SystemStarter在/System/Library/StartupItems和/Library/StartupItems目录中搜寻启动项目。它从每个启动项目的属性列表中收集信息，并且使用那些信息决定项目的执行次序。然后以基于项目的相关性形成的组来执行启动项目。</p>
<p>/System/Library/StartupItems目录是为Mac OS X装载的启动项目而保留的。所有其它的启动项目应被放置在/Library/StartupItems目录中。注意这个目录并非默认存在，可能需要在安装启动项目时创建。</p>
<p>为了创建一个新的启动项目，您必须创建一个程序或脚本来执行您的代码，并且必须创建一个包含启动项目信息的属性列表文件。以下几节将更详尽地描述这些技术。</p>
<p>注意</p>
<p>尽管单个启动项目能执行多个任务并启动多个守护程序，但建议您最好将一个启动项目限制于一个任务。每个项目执行一个任务可使相关性的分离更为容易，并可加快启动项目的装入。</p>
<p>————————————————<br />
创建启动项目可执行文件</p>
<p>启动项目可执行文件包含了您的启动项目的代码，它可作为命令行程序或外壳脚本来被执行。通常，仅在系统启动时才调用这些可执行文件。但实际上，SystemStarter具有在此以后调用这些可执行文件的能力（请参阅“启动和停止启动项目”）。</p>
<p>创建启动项目的步骤如下:</p>
<p>1．为启动项目创建一个目录。目录名称应与您提供的功能相符。</p>
<p>例如：MyDBServer</p>
<p>2．将可执行文件加入目录中。可执行文件的名称应与目录名称完全相同。</p>
<p>例如：MyDBServer/MyDBServer</p>
<p>3．创建名为StartupParameters.plist的属性列表并将其加入目录。请参阅“指定启动项目功能”。</p>
<p>例如：MyDBServer/StartupParameters.plist</p>
<p>4．创建安装程序，将启动项目放置在/Library/StartupItems目标系统的目录中。（安装程序可能需要首先创建此目录。）</p>
<p>Mac OS X提供一些外壳脚本代码，以简化创建启动项目的过程。文件/etc/rc.common定义了一些例程，对于处理命令行变量和收集系统设置是有用的。为使用这些例程，如下例所示，在一个外壳脚本中引用rc.common文件，并调用RunService例程，将第一个命令行参数传递给它:</p>
<p>#!/bin/sh <br />
. /etc/rc.common</p>
<p>#<br />
# Your startup item code<br />
#<br />
 RunService ”$1&#8243; </p>
<p>RunService例程在外壳脚本中搜寻StartService、StopService以及RestartService例程，根据需要来调用它们以启动、停止或重新启动您的服务。而您必须为所有三个例程提供具体实现（当然您的服务也可以不支持其中的某个例程）。</p>
<p>如果启动项目可执行文件包含可能需要一点时间完成的代码，那么您应该考虑将该代码作为守护程序或后台进程来运行。直接从脚本执行冗长的启动任务将推迟系统启动。启动项目脚本应尽可能快地执行，然后退出。</p>
<p>————————————————<br />
指定启动项目属性</p>
<p>除了启动项目可执行文件以外，每个启动项目还必须在启动项目目录中包含一名为StartupParameters.plist的属性列表。此属性列表包含启动项目信息以及此项目与其它启动项目之间的所有相关性描述。在启动任何启动项目以前，SystemStarter程序读取每个启动项目的属性列表，并且使用此相关性信息决定启动项目的启动次序。</p>
<p>表4-3列出了包含在启动项目的StartupParameters.plist文件中的键值对。所有数组和字典中都包含字符串类型的值。您可使用/Developer/Applications中的属性列表编辑器（Property List Editor）应用程序来创建此属性列表。</p>
<p>表4-3 StartupParameters.plist中的键值对</p>
<p>关键字</p>
<p>类型</p>
<p>值</p>
<p>Description</p>
<p>字符串</p>
<p>启动项目的简短说明，它可由管理工具来使用。</p>
<p>Provides</p>
<p>数组</p>
<p>由此启动项目所提供的服务。尽管一个启动项目可提供多项服务，但一般它只提供一项。</p>
<p>Requires</p>
<p>数组</p>
<p>在此启动项目启动前必须运行的其它启动项目所提供的服务。如果得不到所要求的服务，则此启动项目不能被运行。</p>
<p>Uses</p>
<p>数组</p>
<p>在此启动项目启动前应该但并非需要强制启动的其它启动项目所提供的服务。没有这些服务，此启动项目也可启动。</p>
<p>OrderPreference</p>
<p>字符串</p>
<p>对于那些具有相同执行次序（由Requires及Uses的值来决定）的启动项目，它们应被启动的相对顺序。有五个次序预置值：First，Early，None，Late以及Last，默认值为None。次序预置值只是一个建议值，可以被忽略。</p>
<p>为Requires及Uses属性指定的值应与启动项目依赖的服务名称相一致。服务名称可能并非总是与提供该服务的启动项目的名称直接对应。Provides属性指定由启动项目所提供的服务的名称。通常当此名称与启动项目的名称一致时，就没有必要再这样做了。特别需要说明的是，启动多项服务的启动项目最多只能具有其名称与启动项目相一致的一项服务。</p>
<p>如果两个启动项目提供了名称相同的一项服务，SystemStarter只运行按此名称找到的第一个启动项目。所以，除非启动代码中的codependencies绝对要求这样做，建议启动项目不要提供多项服务。</p>
<p>Requires、Uses及OrderPreference关键字的值不能保证一个特定的启动次序。</p>
<p>————————————————<br />
启动和停止启动项目</p>
<p>当SystemStarter执行启动项目时，它将一个指示所需动作的参数传递给可执行文件。启动时，SystemStarter将一个启动参数传递给可执行文件。启动后，SystemStarter也可将重新启动或终止参数传递给启动项目。启动项目的可执行文件应该检查所获得的参数，并且据此启动、重新启动或停止相应的服务。</p>
<p>如果想通过自己的脚本启动、重新启动或停止启动项目，您可用SystemStarter程序来这样做。在使用SystemStarter时，您必须使用两个参数来执行它：所需的动作以及目标启动项目所在目录的完整路径。例如，为了重新启动Apache Web服务程序，您应在命令提示符下输入：</p>
<p>/sbin/SystemStarter restart /System/Library/StartupItems/Apache <br />
     </p>
<p>注意:</p>
<p>您必须具有root用户的权限才能启动、重新启动或停止启动项目。</p>
<p>启动项目应始终考虑SystemStarter传入的参数。然而，对于那些参数作出的反应取决于启动项目。停止与重新启动选项可能在任何情况下都没有意义。通过使用现有的用于停止和启动其服务的代码，启动项目也能支持重新启动选项。</p>
<p>在运行时手动处理启动项目的应用程序也可以通过使用SystemConfiguration框架来实现这些功能。这个框架可以用来获取指向一个所需启动项目的引用，并将其执行。</p>
<p>关于启动项目的更多信息，请参阅“创建定制启动项目”。.</p>
<p>————————————————<br />
定制登录和注销过程</p>
<p>通过系统预置的“登录（Login）”页，管理员已可以配置loginwindow的若干属性。帐号系统预置的“登录选项（Login Options）”页（如图4-2所示）为计算机管理员显示了一些附加的选项。</p>
<p><a href="http://www.chinamac.net/upload/forum/200511881347.gif" target="_blank">[ 相关贴图 ]</a></p>
<p>图4-2 帐号系统参数选择的登录选项窗格</p>
<p>除了这些功能特性以外，loginwindow应用程序还提供了一组用于定制登录过程的可用于编程的钩子。在每次登录或注销时，您可使用这些钩子来运行附加的程序或脚本。与在“登录选项（Login Options）”页中所提供的选项相类似，也存在一个指向停用“重新启动（Restart）”和“关机（Shut Down）”按钮的钩子。</p>
<p>为了使用loginwindow钩子，必须修改启动loginwindow的代码（位于/etc/ttys中）。以下是此文件的程序行:</p>
<p>console ”/System/Library/CoreServices/loginwindow.app/loginwindow” <br />
     vt100 on secure <br />
     window=/System/Library/CoreServices/WindowServer <br />
     onoption=”/usr/libexec/getty <br />
     std.9600&#8243; </p>
<p>这些程序行命令init程序在控制台终端上启动loginwindow，并将WindowServer（它是连接窗口管理器进程的一个符号链接）作为视窗系统进程来使用。在这些程序行中，您可以为loginwindow进程添加附加参数。表4-4列出了当前由loginwindow支持的参数。</p>
<p>表4-4 loginwindow参数</p>
<p>参数<br />
值的说明</p>
<p>-LoginHook<br />
当用户成功登录后，所运行的脚本或工具的完整路径。</p>
<p>-LogoutHook<br />
当用户成功注销后，所运行的脚本或工具的完整路径。</p>
<p>-PowerOffDisabled<br />
若为“YES”，将不能使用登录窗口中的关机和重新启动按钮；同样，按计算机的电源按钮将注销Finder及Dock应用程序，但不会关闭系统。此特性可防止用户无意中关闭系统，而系统需要提供诸如打印服务或文件服务等这些共享服务。</p>
<p>-LoginHook和-LogoutHook参数特别有用，因为通过这个方法可以用来定制系统管理、帐号管理或安全程序，并可将它们作为登录和注销过程的一部分来运行。例如，在/etc/ttys中修改的控制台定义可能看起来会和下面的情况相类似:</p>
<p>console ”/System/Library/CoreServices/loginwindow.app/loginwindow <br />
     -PowerOffDisabled YES -LoginHook <br />
     /Users/Administrator/Scripts/mailLoginToAdmin” <br />
     vt100 on secure window=/System/Library/CoreServices/WindowServer <br />
     onoption=”/usr/libexec/getty std.9600&#8243; </p>
<p>使用环境变量</p>
<p>Mac OS X支持基于单独用户的UNIX格式的环境变量。在登录时，loginwindow应用程序将寻找一个名为environment.plist特殊的属性列表文件。此文件必须位于用户home目录根部的一个名为.Mac OSX的目录中。此文件的路径如下:</p>
<p>~/.Mac OSX/environment.plist</p>
<p>如果存在一个environment.plist文件，loginwindow将从此文件中读取关键字，并将它们作为用户环境变量来进行注册。此文件只支持环境变量的定义，您不能使用此文件执行其它形式的脚本代码。与其它属性列表文件一样，它的文件格式为XML格式，文件中的每一关键字包含一个字符串值。</p>
<p>————————————————<br />
替换Finder</p>
<p>在登录时，Mac OS X也支持启动除Finder系统应用程序以外的程序。此功能是为想在登录时启动一个不同的默认应用程序的用户而设计的。例如，在登录时您可启动终端（Terminal）应用程序来取代Finder，以显示一个命令行界面。</p>
<p>为了替换Finder系统应用程序，可使用defaults实用工具来修改loginwindow的预置参数。Loginwindow预置参数被存储在com.apple.loginwindow中。所需要更改的关键字是Finder关键字。使用下列语法为此关键字定义新值，并为所替换的应用程序指定完整路径:</p>
<p>defaults write com.apple.loginwindow Finder path</p>
<p>用户可在终端应用程序中执行这条命令，以改变当前用户的默认设置。为了使所有用户都改变此设置，必须在终端中以root用户来执行此命令。您也可修改/etc/ttys脚本或创建自己的登录钩子，这样可在每个用户登录时执行此钩子。</p>
<p>使用此命令后，并不阻止用户在登录后手动启动Finder。但如果发生意外崩溃或用户从强制退出（Force Quit）窗口中将其杀除，那么它确实可阻止loginwindow自动地重新启动Finder。</p>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/10/mac-osx-%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>四六级成绩查询</title>
		<link>http://www.hengxinsoft.com/2010/08/%e5%9b%9b%e5%85%ad%e7%ba%a7%e6%88%90%e7%bb%a9%e6%9f%a5%e8%af%a2/</link>
		<comments>http://www.hengxinsoft.com/2010/08/%e5%9b%9b%e5%85%ad%e7%ba%a7%e6%88%90%e7%bb%a9%e6%9f%a5%e8%af%a2/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 15:36:42 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[经典收藏]]></category>
		<category><![CDATA[四六级成绩查询]]></category>
		<category><![CDATA[四六级批量成绩查询]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/?p=580</guid>
		<description><![CDATA[   很讨厌99宿舍的强制广告，为什么非要让我们等三十秒才能看到结果那？很不理解，下面给出一个四六级的批量查询工具，可以一次查处一个考场的成绩，用这也挺方便，现分享给大家，如果您用这不错的话 希望你帮忙点一下本站旁边的广告 这将是对我最大的支持 ，谢谢！ 查分地址：http://www.akuan001.info/chaxun.php Copyright &#169; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></description>
			<content:encoded><![CDATA[<p>   很讨厌99宿舍的强制广告，为什么非要让我们等三十秒才能看到结果那？很不理解，下面给出一个四六级的批量查询工具，可以一次查处一个考场的成绩，用这也挺方便，现分享给大家，如果您用这不错的话 希望你帮忙点一下本站旁边的广告 这将是对我最大的支持 ，谢谢！</p>
<p>查分地址：<a href="http://www.akuan001.info/chaxun.php">http://www.akuan001.info/chaxun.php</a></p>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/08/%e5%9b%9b%e5%85%ad%e7%ba%a7%e6%88%90%e7%bb%a9%e6%9f%a5%e8%af%a2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>河南网通帐号转换器</title>
		<link>http://www.hengxinsoft.com/2010/08/%e6%b2%b3%e5%8d%97%e7%bd%91%e9%80%9a%e5%b8%90%e5%8f%b7%e8%bd%ac%e6%8d%a2%e5%99%a8/</link>
		<comments>http://www.hengxinsoft.com/2010/08/%e6%b2%b3%e5%8d%97%e7%bd%91%e9%80%9a%e5%b8%90%e5%8f%b7%e8%bd%ac%e6%8d%a2%e5%99%a8/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 16:11:48 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[原创]]></category>
		<category><![CDATA[经典收藏]]></category>
		<category><![CDATA[帐号转换器]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/?p=568</guid>
		<description><![CDATA[设置路由器上网的时候是需要把帐号转化一下的 因为客户端的帐号是加密的 下面给出转换器的地址 无毒～～放心使用  下载 Copyright &#169; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></description>
			<content:encoded><![CDATA[<p>设置路由器上网的时候是需要把帐号转化一下的 因为客户端的帐号是加密的 下面给出转换器的地址 无毒～～放心使用  <a href="http://u.115.com/file/f18a2c1e34 河南网通用户名转换.exe" target="_blank">下载</a></p>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/08/%e6%b2%b3%e5%8d%97%e7%bd%91%e9%80%9a%e5%b8%90%e5%8f%b7%e8%bd%ac%e6%8d%a2%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google暑期大学生博客分享大赛开赛</title>
		<link>http://www.hengxinsoft.com/2010/07/google%e6%9a%91%e6%9c%9f%e5%a4%a7%e5%ad%a6%e7%94%9f%e5%8d%9a%e5%ae%a2%e5%88%86%e4%ba%ab%e5%a4%a7%e8%b5%9b%e5%bc%80%e8%b5%9b/</link>
		<comments>http://www.hengxinsoft.com/2010/07/google%e6%9a%91%e6%9c%9f%e5%a4%a7%e5%ad%a6%e7%94%9f%e5%8d%9a%e5%ae%a2%e5%88%86%e4%ba%ab%e5%a4%a7%e8%b5%9b%e5%bc%80%e8%b5%9b/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 06:04:18 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[IT业界]]></category>
		<category><![CDATA[经典收藏]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/2010/07/google%e6%9a%91%e6%9c%9f%e5%a4%a7%e5%ad%a6%e7%94%9f%e5%8d%9a%e5%ae%a2%e5%88%86%e4%ba%ab%e5%a4%a7%e8%b5%9b%e5%bc%80%e8%b5%9b/</guid>
		<description><![CDATA[首届 Google 暑期大学生博客分享大赛开赛啦！快来晒一晒你和 Android 的故事吧，分享即可得到珍藏版 Android T 恤，精彩故事还有机会赢得 Android 手机！赶快来这里（http://www.google.com/intl/zh-CN/daxue/blog2010/） 参加吧，让假期更加精彩！ Google 暑期大学生博客分享大赛 2010 Android 篇 参赛对象 全日制在校大学生，包括大专生、本科生、硕士生、博士生。 博客要求 主题明确 请围绕Android手机应用分享你自己的精彩故事或者创意点子，请围绕以下主题，动手写博文分享吧！ 主题 1：分享开发 Android 手机应用的开发经验。比如晒一下你是如何在 Android 平台上一步一步开发应用程序的；比如分享一下你开发过程中，有哪些捷径或者又走过哪些弯路等等。 主题 2：分享 Android 手机应用创意或点子。如果你不具备开发能力也不要紧，只需要创意的点子也可 以。比如秀一下您心目中在 Android 手机上应该有哪些实用的或者好玩的小应用；比如说一说你觉得大学生都喜欢什么样的 Android 手机应用等等。 主题 3：体验 Android 手机的精彩小故事或者憧憬一下你心目中的 Android 手机。 讲一下你 在生活中使用 Android 手机一些不同寻常的小故事；没用过 Android 手机也没关系，可以畅想一下您心目中的 Android 手机应该是个什么样子。:) 注意：请大家在博文中加入“首届 Google 暑期大学生博客分享大赛——2010 Andriod 篇”作为本次大赛的参赛标识，谢谢！ 形式多样 [...]]]></description>
			<content:encoded><![CDATA[<div id="blogDetailDiv">
<div>
<p>首届 Google 暑期大学生博客分享大赛开赛啦！快来晒一晒你和 Android 的故事吧，分享即可得到珍藏版 Android  T 恤，精彩故事还有机会赢得 Android 手机！赶快来这里（<a href="http://www.google.com/intl/zh-CN/daxue/blog2010/" target="_blank">http://www.google.com/intl/zh-CN/daxue/blog2010/</a>） 参加吧，让假期更加精彩！</p>
<p>Google 暑期大学生博客分享大赛 2010 Android 篇</p>
<h3>参赛对象</h3>
<p>全日制在校大学生，包括大专生、本科生、硕士生、博士生。</p>
<h3>博客要求</h3>
<h4>主题明确</h4>
<p>请围绕Android手机应用分享你自己的精彩故事或者创意点子，请围绕以下主题，动手写博文分享吧！<span id="more-562"></span></p>
<ul>
<li>主题 1：<strong>分享开发 Android 手机应用的开发经验</strong>。比如晒一下你是如何在 Android  平台上一步一步开发应用程序的；比如分享一下你开发过程中，有哪些捷径或者又走过哪些弯路等等。</li>
<li>主题 2：<strong>分享  Android 手机应用创意或点子</strong>。如果你不具备开发能力也不要紧，只需要创意的点子也可 以。比如秀一下您心目中在 Android 手机上应该有哪些实用的或者好玩的小应用；比如说一说你觉得大学生都喜欢什么样的 Android  手机应用等等。</li>
<li>主题 3：<strong>体验 Android 手机的精彩小故事或者憧憬一下你心目中的 Android 手机</strong>。 讲一下你 在生活中使用 Android 手机一些不同寻常的小故事；没用过 Android 手机也没关系，可以畅想一下您心目中的 Android  手机应该是个什么样子。:)</li>
</ul>
<p>注意：请大家在博文中加入“首届 Google 暑期大学生博客分享大赛——2010 Andriod 篇”作为本次大赛的参赛标识，谢谢！</p>
<h4>形式多样</h4>
<p>文字、图片或视频形式均可，我们鼓励大家采用多种形式</p>
<h4>篇幅适当</h4>
<h4>博文能够被其他同学们正常访问</h4>
<h4>若能记录访问量、浏览量等信息，请设置此功能</h4>
<p>详细请参加大赛官网 <a href="http://www.google.com/intl/zh-CN/daxue/blog2010/index.html" target="_blank">http://www.google.com/intl/zh-CN/daxue/blog2010/index.html</a></p>
<p><strong>——————漂亮的分割线 ————————</strong></p>
<p>这里分享几个常见问题，同样，大家如果有问题需要提问，也可以到<a href="http://www.mobai.org/2010/07/16/cndaxueblog2010/" target="_blank">这 个页面</a> <a href="http://www.mobai.org/2010/07/16/cndaxueblog2010/" target="_blank">http://www.mobai.org/2010/07/16/cndaxueblog2010/</a>提问，你 的 提问和建议均会由谷歌公司朱爱民老师详细阅读并仔细回复。</p>
<p><strong>–1、我没有Android手机，可以参加吗？</strong></p>
<p>—-参与主题3，它是一个宽泛的主题，甚至：“<strong>你也可以提交这个宣传搞  或许也有T-shirt:-)” //</strong> 这可不是我说的。而且只是或许，如果你的宣传稿没有太大的创意，仅仅是简单的码上官方网站的介绍，是要被判无效的噢。或许你可以画漫画，做个flash等 等作为宣传稿，宣传稿发了之后可以把地址贴下，让朱老师看看是否可以。;-)</p>
<p><strong>–2、是否是独立博客，博客建立时间，是否收录什么的有限制吗？</strong></p>
<p>—-“完全没有，这是一个开放的大赛。”</p>
<p><strong>–3、一个人可以提交多个作品吗？</strong></p>
<p>—-“可以提交多个作品，但是要以质量为主，是否可以多得T-shirt，这个还不确定”</p>
</div>
</div>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/07/google%e6%9a%91%e6%9c%9f%e5%a4%a7%e5%ad%a6%e7%94%9f%e5%8d%9a%e5%ae%a2%e5%88%86%e4%ba%ab%e5%a4%a7%e8%b5%9b%e5%bc%80%e8%b5%9b/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Objective-C 入门（转）</title>
		<link>http://www.hengxinsoft.com/2010/07/objective-c-%e5%85%a5%e9%97%a8%ef%bc%88%e8%bd%ac%ef%bc%89/</link>
		<comments>http://www.hengxinsoft.com/2010/07/objective-c-%e5%85%a5%e9%97%a8%ef%bc%88%e8%bd%ac%ef%bc%89/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 16:01:03 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[iphone开发]]></category>
		<category><![CDATA[经典收藏]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Objective-C 入门]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/?p=555</guid>
		<description><![CDATA[大部分有一点其他平台开发基础的初学者看到XCode，第一感想是磨拳擦掌，看到 Interface Builder之后，第一感想是跃跃欲试，而看到Objective-C的语法，第一感想就变成就望而却步了。好吧，我是在说我自己。 如果你和我一样，对苹果相关的开发：Mac OS X或是iPhone有兴趣，但是第一时间看到Objective-C就会头疼并伴有发烧症状的话，疗效比较好的快速治疗方法是阅读本文。大概花二十分钟左右，而且绝不无聊的时间，你就会对Objective-C有那么一点点了解，至少读读例子不会那么头疼了。 不过假定你要有那么一点点c++、c#或是java的基础，至少能看到c++、c#或是 java的源码，能够大致明白说得是什么。 这篇文章不是一篇科技文章，希望你也不要把它当做科技文章来读。文章非常不严谨，但是我相信你能看得懂。 一、XCode、Objective-C、Cocoa 说的是几样东西？ 答案：三样东西。 XCode：你可以把它看成是一个开发环境，就好像Visual Studio或者Netbeans或者SharpDevelop一样的玩意。你可以将Interface Builder认为是Visual Studio中用来画界面的那部分功能单独提出来的程序。 Objective-C：这是一种语言，就好像c++是一种语言，Java是一种语言，c#是一种语言，莺歌历史也是一种语言一样。 Cocoa：是一大堆函数库，就好像MFC、.NET、Swing这类玩意，人家已经写好了一堆现成的东西，你只要知道怎么用就可以了。 有些人会比较容易混淆Objective-C和Cocoa，就好像有些人会混淆c#和.NET一样。这两个东西真的是两个不一样的东西。 二、Objective-C是什么？ 你可以把它认为是语法稍稍有点不一样的c语言。虽然第一眼望上去你可能会认为它是火星语，和你所认知的任何一种语言都不一样。 先简单列出一点差别： 问题一：我在程序中看到大量的减号、中括号和NS****这种东西，他们是什么玩意儿？ 1 减号（或者加号） 减号表示一个函数、或者方法、或者消息的开始，怎么说都行。 比如c#中，一个方法的写法可能是： private void hello(bool ishello) { //OOXX } 用Objective-C写出来就是 -(void) hello:(BOOL)ishello { //OOXX } 挺好懂的吧？ 不过在Objective-C里面没有public和private的概念，你可以认为全是public。 而用加号的意思就是其他函数可以直接调用这个类中的这个函数，而不用创建这个类的实例。 2 中括号 中括号可以认为是如何调用你刚才写的这个方法，通常在Objective-C里说“消息”。 比如C#里你可以这么写： this.hello(true); 在Objective-C里，就要写成： [self hello:YES]; 3 NS**** 老乔当年被人挤兑出苹果，自立门户的时候做了个公司叫做NextStep，里面这一整套开发包很是让一些科学家们喜欢，而现在Mac OS用的就是NextStep这一套函数库。 [...]]]></description>
			<content:encoded><![CDATA[<h1></h1>
<p>大部分有一点其他平台开发基础的初学者看到XCode，第一感想是磨拳擦掌，看到 Interface Builder之后，第一感想是跃跃欲试，而看到Objective-C的语法，第一感想就变成就望而却步了。好吧，我是在说我自己。</p>
<p>如果你和我一样，对苹果相关的开发：Mac OS X或是iPhone有兴趣，但是第一时间看到Objective-C就会头疼并伴有发烧症状的话，疗效比较好的快速治疗方法是阅读本文。大概花二十分钟左右，而且绝不无聊的时间，你就会对Objective-C有那么一点点了解，至少读读例子不会那么头疼了。<span id="more-555"></span></p>
<p>不过假定你要有那么一点点c++、c#或是java的基础，至少能看到c++、c#或是 java的源码，能够大致明白说得是什么。</p>
<p>这篇文章不是一篇科技文章，希望你也不要把它当做科技文章来读。文章非常不严谨，但是我相信你能看得懂。</p>
<h3><strong>一、XCode、Objective-C、Cocoa 说的是几样东西？</strong></h3>
<p><strong>答案：三样东西。</strong></p>
<p>XCode：你可以把它看成是一个开发环境，就好像Visual Studio或者Netbeans或者SharpDevelop一样的玩意。你可以将Interface Builder认为是Visual Studio中用来画界面的那部分功能单独提出来的程序。</p>
<p>Objective-C：这是一种语言，就好像c++是一种语言，Java是一种语言，c#是一种语言，莺歌历史也是一种语言一样。</p>
<p>Cocoa：是一大堆函数库，就好像MFC、.NET、Swing这类玩意，人家已经写好了一堆现成的东西，你只要知道怎么用就可以了。</p>
<p>有些人会比较容易混淆Objective-C和Cocoa，就好像有些人会混淆c#和.NET一样。这两个东西真的是两个不一样的东西。</p>
<h3>二、Objective-C是什么？</h3>
<p>你可以把它认为是语法稍稍有点不一样的c语言。虽然第一眼望上去你可能会认为它是火星语，和你所认知的任何一种语言都不一样。</p>
<p>先简单列出一点差别：</p>
<p><big>问题一：我在程序中看到大量的减号、中括号和NS****这种东西，他们是什么玩意儿？</big></p>
<p><strong>1 减号（或者加号）</strong></p>
<p>减号表示一个函数、或者方法、或者消息的开始，怎么说都行。</p>
<p>比如c#中，一个方法的写法可能是：</p>
<p>private void hello(bool ishello)</p>
<p>{</p>
<p>//OOXX</p>
<p>}</p>
<p>用Objective-C写出来就是</p>
<p>-(void) hello:(BOOL)ishello</p>
<p>{</p>
<p>//OOXX</p>
<p>}</p>
<p>挺好懂的吧？</p>
<p>不过在Objective-C里面没有public和private的概念，你可以认为全是public。</p>
<p>而用加号的意思就是其他函数可以直接调用这个类中的这个函数，而不用创建这个类的实例。</p>
<p><strong>2 中括号</strong></p>
<p>中括号可以认为是如何调用你刚才写的这个方法，通常在Objective-C里说“消息”。</p>
<p>比如C#里你可以这么写：</p>
<p>this.hello(true);</p>
<p>在Objective-C里，就要写成：</p>
<p>[self hello:YES];</p>
<p><strong>3 NS****</strong></p>
<p>老乔当年被人挤兑出苹果，自立门户的时候做了个公司叫做<strong>N</strong>ext<strong>S</strong>tep，里面这一整套开发包很是让一些科学家们喜欢，而现在Mac OS用的就是<strong>N</strong>ext<strong>S</strong>tep这一套函数库。</p>
<p>这些开发<strong>N</strong>ext<strong>S</strong>tep的人们比较自恋地把函数库里面所有的类都用<strong>N</strong>ext<strong>S</strong>tep的缩写打头命名，也就是<strong>NS</strong>****了。比较常见的比如：</p>
<p><strong>NS</strong>Log</p>
<p><strong>NS</strong>String</p>
<p><strong>NS</strong>Integer</p>
<p><strong>NS</strong>URL</p>
<p><strong>NS</strong>Image</p>
<p>…</p>
<p>你会经常看到一些教学里面会用到：</p>
<p>NSLog (@”%d”,myInt);</p>
<p>这句话主要是在 console里面跟踪使用，你会在console里面看到myInt的值（在XCode里面运行的时候打开dbg窗口即可看到）。而我们在其他开发环境里面可能会比较习惯使用MessageBox这种方式进行调试。</p>
<p>你还可以看到其他名字打头的一些类，比如CF、CA、CG、UI等等，比如</p>
<p>CFStringTokenizer 这是个分词的东东</p>
<p>CALayer 这表示Core Animation的层</p>
<p>CGPoint 这表示一个点</p>
<p>UIImage 这表示iPhone里面的图片</p>
<p>CF说的是Core Foundation，CA说的是Core Animation，CG说的是Core Graphics，UI说的是iPhone的User Interface……还有很多别的，等你自己去发掘了。</p>
<p><big>问题二、#import、@interface这类玩意说的是什么？</big></p>
<p><strong>1、#import</strong></p>
<p>你可以把它认为是#include，一样的。但是最好用#import，记住这个就行了。</p>
<p><strong>2、@interface等等</strong></p>
<p>比如你在c#中写一个抓孩子类的定义：</p>
<p>public class Kids : System</p>
<p>{</p>
<p>private string kidName=”mykid”;</p>
<p>private string kidAge=“15”;</p>
<p>private bool isCaughtKid()</p>
<p>{</p>
<p>return true;</p>
<p>}</p>
<p>}</p>
<p>当然，上面的写法不一定对，就是个用于看语法的举例。</p>
<p>在Objective-C里就得这么写：</p>
<p>先写一个kids.h文件定义这个类：</p>
<p>@interface Kids: NSObject {</p>
<p>NSString *kidName;</p>
<p>NSString *kidAge;</p>
<p>}</p>
<p>-(BOOL) isCaughtKid:;</p>
<p>@end</p>
<p>再写一个kids.m文件实现：</p>
<p>#import “kids.h”</p>
<p>@implementation Kids</p>
<p>-(void) init {</p>
<p>kidName=@”mykid”;</p>
<p>kidAge=@”15”;</p>
<p>}</p>
<p>-(BOOL) isCaughtKid:{</p>
<p>return YES;</p>
<p>}</p>
<p>@end</p>
<p>这个写法也不一定对，主要是看看语法就行了。-_-b</p>
<p><big>问题三、一个方法如何传递多个参数？</big></p>
<p>一个方法可以包含多个参数，不过后面的参数都要写名字。</p>
<p>多个参数的写法</p>
<p>(方法的数据类型) 函数名: (参数1数据类型) 参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ;</p>
<p>举个例子，一个方法的定义：</p>
<p>-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;</p>
<p>实现这个函数的时候：</p>
<p>-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName{</p>
<p>大儿子 = myOldestKidName;</p>
<p>二儿子 = mySecondOldestKidName;</p>
<p>三儿子 = myThirdOldestKidName;</p>
<p>}</p>
<p>调用的时候：</p>
<p>Kids *myKids = [[Kids alloc] init];</p>
<p>[myKids setKids: @”张大力” secondKid: @”张二力” thirdKid: @”张小力”];</p>
<p>而如果你用c#写这个方法，大致的写法可能是</p>
<p>public void setKids( string myOldestKidName, string mySecondOldestKidName, string myThirdOldestKidName)</p>
<p>{</p>
<p>…</p>
<p>}</p>
<p>调用的时候大概的写法可能是：</p>
<p>Kids myKids = new Kids();</p>
<p>myKids.setKids (“张大力”, “张二力”, “张小力”);</p>
<p>明白了吧？其实不怎么难看懂。</p>
<p>基本上，如果你能了解下面这段代码的转换关系，你Objective-C的语法也就懂了八成了：</p>
<p>[[[MyClass alloc] init:[foo bar]] autorelease];</p>
<p>转换成C#或者Java的语法也就是：</p>
<p>MyClass.alloc().init(foo.bar()).autorelease();</p>
<h3>三、其他的一些东西</h3>
<p>其实这些本站之前的文章有所提及，这里再详细解释一下。</p>
<p>1、 id：</p>
<p>Objective-C有一种比较特殊的数据类型是id。你可以把它理解为“随便”。</p>
<p>在Objective-C里，一切东西都是指针形式保存，你获取到的就是这个对象在内存的位置。那么id就是你知道这个位置，但是不知道里面是啥的时候的写法。</p>
<p>2、 同一个数组可以保存不同的对象：</p>
<p>比如一个数组NSArray，这种数组里面可以保存各种不同的对象，比如这个数组里：</p>
<p>myArray &lt;—-|</p>
<p>0: (float) 234.33f</p>
<p>1: @”我是个好人”</p>
<p>2: (NSImage *) <img src="http://www.cocoachina.com/wp-content/uploads/image/icon-jiong.png" alt="" width="43" height="32" align="absMiddle" /> (俺的美图)</p>
<p>3: @”我真的是好人”</p>
<p>这是一个由4个东西组成的数组，这个数组包括一个浮点数，两个字符串和一个图片。</p>
<p>3、BOOL，YES，NO：</p>
<p>你可以认为YES表示C#或者Java里的true，NO表示false。而实际上YES是1，NO是0，BOOL本身就是个char。</p>
<p>4、IBOutlet、IBAction是啥玩意，总能看到。</p>
<p>这两个东西其实在语法中没有太大的作用。如果你希望在Interface Builder中能看到这个控件对象，那么在定义的时候前面加上IBOutlet，在IB里就能看到这个对象的outlet，如果你希望在Interface Builder里控制某个对象执行某些动作，就在方法前面加上(IBAction)。</p>
<p>而这两个东西实际上和void是一样的。</p>
<p>5、nil。</p>
<p>Objective-C里的NULL（空）就这么写，表示空指针。</p>
<p>6、为什么是@”字符串”而不是”字符串”</p>
<p>前面加上@符号，编译器在编译的时候会在程序中给你留出位置，这样才能保证这个字符串不会丢失。反正记住，如果你要想把某些字符串写死在程序里，就要用@”字符串”，如果忘了用@，程序应该会出错。</p>
<p>superzhou大侠指正：</p>
<p>6、为什么是@”字符串”而不是”字符串”</p>
<p>”字符串”是C的字符串,@””是把 C的字符串转成NSString的一个简写.<br />
在需要NSString的地方才需要这个转化,例如NSLog里面.<br />
在需要C string的地方,还是用”字符串”的.</p>
<p>另外,@””这个转换是不支持中文的.例如NSLog(@”字符串”); 是一定输出不了中文的.</p>
<h3>四、Objective-C 2.0</h3>
<p>Objective-C 2.0是Leopard新增加的一门语言，其实和原来的Objective-C是一样的。主要是增加了属性。详细的内容这里不写了，可以参阅Allen Dang的这篇文章，写的很明白。</p>
<p><a onclick="javascript:pageTracker._trackPageview('/outbound/article/http://blog.codingmylife.com/?p=81');" href="http://blog.codingmylife.com/?p=81" target="_blank">http://blog.codingmylife.com/?p=81</a></p>
<h3>五、总结</h3>
<p>现在来总结一下怎么看Objective-C的代码和怎么开始学Objective-C吧。</p>
<p>1、记住Objective-C就是C，不是火星语，这个很关键。</p>
<p>2、记住你自己看不懂不表示脑子迟钝，大部分人第一次看Objective-C的代码可能比你还要迟钝。</p>
<p>3、把CocoaChina.com加入收藏夹，看不明白代码就来再看一遍这篇开宗明义的好文。</p>
<p>4、文档很关键，当你看不懂某些东西说的是什么的时候，先查Cocoachina，再看英文文档里面的API说明，尤其这个类是以NS开头的时候。再不行就去google搜，直接把你要查的方法贴进google，通常能找到不少人也在问同样的问题，自然也有热心人活雷锋帮助回答。</p>
<p>5、可以看hello world例子，但是不能总看，看多了真的会晕。另外，千万要放弃苹果官方的Currency Converter货币转换的例子，那个例子是毒药，刚学的时候越看越蒙。</p>
<p>6、学习一门语言最好的方法是先用，和学外语一样，当你会说的时候自然会读。给自己设立一个简单的目标，比如做一个简单的程序，然后一点点解决问题。这样学习起来比只看例子快得多。</p>
<p>这是一篇初学者写的文章，希望对同样是初学者的你有一点点帮助：）虽然只是很肤浅的一点点内容，但是应该对你迈入Objective-C的大门有一点帮助。看懂了这篇文章，回过头看Cocoachina的其他文章，你就会觉得很顺眼了。记得天天来哦。</p>
<p>另外，这篇Objective-C的参考资料也比较好，如果你有兴趣可以一读。</p>
<p><a onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.otierney.net/objective-c.html.zh-tw.big5');" href="http://www.otierney.net/objective-c.html.zh-tw.big5" target="_blank">http://www.otierney.net/objective-c.html.zh-tw.big5</a></p>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/07/objective-c-%e5%85%a5%e9%97%a8%ef%bc%88%e8%bd%ac%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iPhone手机开发平台入门介绍和教程</title>
		<link>http://www.hengxinsoft.com/2010/06/iphone%e6%89%8b%e6%9c%ba%e5%bc%80%e5%8f%91%e5%b9%b3%e5%8f%b0%e5%85%a5%e9%97%a8%e4%bb%8b%e7%bb%8d%e5%92%8c%e6%95%99%e7%a8%8b/</link>
		<comments>http://www.hengxinsoft.com/2010/06/iphone%e6%89%8b%e6%9c%ba%e5%bc%80%e5%8f%91%e5%b9%b3%e5%8f%b0%e5%85%a5%e9%97%a8%e4%bb%8b%e7%bb%8d%e5%92%8c%e6%95%99%e7%a8%8b/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 13:21:30 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[iphone开发]]></category>
		<category><![CDATA[经典收藏]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/?p=551</guid>
		<description><![CDATA[1． iPhone手机介绍 首先需要了解和破解iPhone手机，下面一个帖子介绍很详细： iPhone最权威 [入门] [破解] [扫盲] [资源] [修砖] 总汇帖 http://www.weiphone.com/thread-41690-1-1.html iPhone手机手册的中文翻译 http://down.tgbus.com/soft/16820.shtml 2． Unix常见命令 iPhone手机的操作系统是Mac OS X，内核是unix，所以可以iPhone手机上运行unix命令。 http://www.weiphone.com/thread-15894-1-1.html 3． Windows平台上iPhone开发环境搭建 见笔者的文章《Windows平台上iPhone基于cygwin开发环境的搭建方法》，文 件链接： http://canco.javaeye.com/admin/blogs/199106 4． Toolchain和iPhone SDK Toolchain与官方iPhone SDK的比较请见文章： 《比较官方iPhone SDK和开源工具链》，文章链接：http://www.cocoachina.com/index.php/archives/cocoachina_149.html iPhone SDK介绍和分析 见西西河的AllenKids先生的2篇文章： iPhoneSDK观察 &#8211; 舞姿飘忽，苹果的探戈 http://www.20ju.com/content/V19377.htm iPhone SDK 观察二：舞台宽广，才能跳得欢畅 http://www.cnbeta.com/articles/55055.htm iPhone SDK, Toolchain, Windows Mobile, SymbianOS S60的比较 http://www.rsslite.com/post/1889.html iPhone用户界面指导原则 http://www.20ju.com/content/V22381.htm 5． iPhone开发语言：Objective-C iPhone原生程序开发语言主要是用Objective-C语言，如果你熟悉C/C++语 [...]]]></description>
			<content:encoded><![CDATA[<p>1． iPhone手机介绍</p>
<p>首先需要了解和破解iPhone手机，下面一个帖子介绍很详细：</p>
<p>iPhone最权威 [入门] [破解] [扫盲] [资源] [修砖] 总汇帖</p>
<p><a href="http://www.weiphone.com/thread-41690-1-1.html">http://www.weiphone.com/thread-41690-1-1.html</a></p>
<p>iPhone手机手册的中文翻译</p>
<p><a href="http://down.tgbus.com/soft/16820.shtml">http://down.tgbus.com/soft/16820.shtml</a></p>
<p>2． Unix常见命令</p>
<p>iPhone手机的操作系统是Mac OS  X，内核是unix，所以可以iPhone手机上运行unix命令。</p>
<p><a href="http://www.weiphone.com/thread-15894-1-1.html">http://www.weiphone.com/thread-15894-1-1.html</a><span id="more-551"></span></p>
<p>3． Windows平台上iPhone开发环境搭建</p>
<p>见笔者的文章《Windows平台上iPhone基于cygwin开发环境的搭建方法》，文 件链接：</p>
<p><a href="http://canco.javaeye.com/admin/blogs/199106">http://canco.javaeye.com/admin/blogs/199106</a></p>
<p>4． Toolchain和iPhone SDK</p>
<p>Toolchain与官方iPhone SDK的比较请见文章：</p>
<p>《比较官方iPhone SDK和开源工具链》，文章链接：<a href="http://www.cocoachina.com/index.php/archives/cocoachina_149.html">http://www.cocoachina.com/index.php/archives/cocoachina_149.html</a></p>
<p>iPhone SDK介绍和分析</p>
<p>见西西河的AllenKids先生的2篇文章：</p>
<p>iPhoneSDK观察 &#8211; 舞姿飘忽，苹果的探戈</p>
<p><a href="http://www.20ju.com/content/V19377.htm">http://www.20ju.com/content/V19377.htm</a></p>
<p>iPhone SDK 观察二：舞台宽广，才能跳得欢畅</p>
<p><a href="http://www.cnbeta.com/articles/55055.htm">http://www.cnbeta.com/articles/55055.htm</a></p>
<p>iPhone SDK, Toolchain, Windows Mobile,  SymbianOS S60的比较</p>
<p><a href="http://www.rsslite.com/post/1889.html">http://www.rsslite.com/post/1889.html</a></p>
<p>iPhone用户界面指导原则</p>
<p><a href="http://www.20ju.com/content/V22381.htm">http://www.20ju.com/content/V22381.htm</a></p>
<p>5． iPhone开发语言：Objective-C</p>
<p>iPhone原生程序开发语言主要是用Objective-C语言，如果你熟悉C/C++语 言，则能很快掌握Objective-C。Objective-C语言主要要理解可变参数，Categories, Posing，  Protocols等特性。</p>
<p>Objective-C初學者指南（繁体）</p>
<p><a href="http://www.otierney.net/objective-c.html.zh-tw.big5">http://www.otierney.net/objective-c.html.zh-tw.big5</a>Objective- C语法快速参考</p>
<p><a href="http://www.cocoachina.com/index.php/archives/cocoachina_122.html">http://www.cocoachina.com/index.php/archives/cocoachina_122.html</a></p>
<p>Learn Objective-C</p>
<p><a href="http://cocoadevcentral.com/d/learn_objectivec/">http://cocoadevcentral.com/d/learn_objectivec/</a></p>
<p>The Objective-C 2.0 Programming Language</p>
<p><a href="http://developer.apple.com/iphone/">http://developer.apple.com/iphone/</a>（注： 需要注册为apple会员才可以下载）</p>
<p>6． iPhone开发书籍、文章和源代码</p>
<p>由iPhone开发和破解领路人Jonathan  Zdziarski著作，最最重要、最值得推荐和唯一的开发书籍《iPhone Open Application  Development》，可通过google下载电子版。</p>
<p>Creating an iPhone Application</p>
<p>iPhone OS Overview</p>
<p>iPhone OS Programming Guide</p>
<p>iPhone Human Interface Guidelines</p>
<p>Cocoa Fundamentals Guide</p>
<p><a href="http://developer.apple.com/iphone/">http://developer.apple.com/iphone/</a>（注： 需要注册为apple会员才可以下载）</p>
<p>Lucas Newman 的18页iPhone开发PDF教学</p>
<p><a href="http://lucasnewman.com/phonedev.pdf">http://lucasnewman.com/phonedev.pdf</a></p>
<p>學習怎樣在 iPhone/iPod Touch 上開發自制遊戲全記錄</p>
<p><a href="http://www.weiphone.com/thread-81192-1-2.html">http://www.weiphone.com/thread-81192-1-2.html</a></p>
<p>CocoaChina整理的开源iPhone程序不完全列表</p>
<p><a href="http://www.cocoachina.com/index.php/archives/cocoachina_143.html">http://www.cocoachina.com/index.php/archives/cocoachina_143.html</a></p>
<p>几个源码例子</p>
<p><a href="http://lucasnewman.com/phonedemos.zip">http://lucasnewman.com/phonedemos.zip</a></p>
<p>7． iPhone论坛和网站</p>
<p>平果开发中文站－最好的中文iPhone开发网站！</p>
<p><a href="http://www.cocoachina.com/">http://www.cocoachina.com/</a></p>
<p>苹果官方的开发网站：</p>
<p><a href="http://developer.apple.com/iphone/">http://developer.apple.com/iphone/</a></p>
<p>Weiphone</p>
<p><a href="http://www.weiphone.com/index.php">http://www.weiphone.com/index.php</a></p>
<p>苹果fans成立的网站：</p>
<p><a href="http://apple4.us/">http://apple4.us/</a></p>
<p><span style="font-family: Verdana; color: #333333;">iPhone 入门开发推荐阅读的一点资料<br />
From:http://www.rwish.cn</span></p>
<p>iPhone入门开发推荐阅读的一点资料<br />
无 论您希望使用官方SDK或是Toolchain进行iPhone开发，都需要阅读一些相关的知识以便入门，这里介绍一些推荐您阅读的资料。<br />
首先推 荐的是Lucas Newman的三宝，他最近已经被苹果招安了：<br />
18页PDF教学：简明扼要地说清楚了在iPhone上怎么开发。<br />
XCode 模板：目前不推荐使用这个了。推荐阅读：在Leopard中编译搭建非官方iPhone toolchain开发环境并整合到XCode<br />
三个例 子：分别是 翻硬币、三轴重力感应例子以及如何使用网络。<br />
然后就是苹果官方的开发网站：http://developer.apple.com /iphone/<br />
带有超多的文档和例子，包括：入门指南、入门文档、iPhone开发相关文档以及一批官方SDK的例子。<br />
Erica  Sadun的网站有关于iPhone toolchain框架的类名及方法名列表。<br />
iPhone破解领路人Jonathan  Zdziarski的网站，可以看些新消息：http://www.zdziarski.com/<br />
国外的iPhone开发论 坛：iPhoneDevDocs应该属于比较热的iPhone开发论坛之一。<br />
另外，关于中文方面的文档：<br />
dr_watson的《学习怎样 在iPhone/iPod Touch上开发自制游戏全记录》几乎是目前能找到的最好的中文iPhone开发教学。</p>
<p>但是很遗憾的，中文方面的开发相关网站除了CocoaChina、Weiphone以及台灣iPhone俱樂部之外，再很少见到关于 iPhone开发方面的资料，其他一些号称关于iPhone开发的论坛或网站也仅仅是复制一些资料，既无人气也无原创内容，这无疑是比较令人难受的事情。</p>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/06/iphone%e6%89%8b%e6%9c%ba%e5%bc%80%e5%8f%91%e5%b9%b3%e5%8f%b0%e5%85%a5%e9%97%a8%e4%bb%8b%e7%bb%8d%e5%92%8c%e6%95%99%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>记录几个常用的iPhone开发网站</title>
		<link>http://www.hengxinsoft.com/2010/06/%e8%ae%b0%e5%bd%95%e5%87%a0%e4%b8%aa%e5%b8%b8%e7%94%a8%e7%9a%84iphone%e5%bc%80%e5%8f%91%e7%bd%91%e7%ab%99/</link>
		<comments>http://www.hengxinsoft.com/2010/06/%e8%ae%b0%e5%bd%95%e5%87%a0%e4%b8%aa%e5%b8%b8%e7%94%a8%e7%9a%84iphone%e5%bc%80%e5%8f%91%e7%bd%91%e7%ab%99/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 16:46:49 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[iphone开发]]></category>
		<category><![CDATA[经典收藏]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/?p=545</guid>
		<description><![CDATA[http://cocoachina.com/ 大量iPhone开发资料，教学，经验，还有自曝。 http://www.javaeye.com/forums/board/mobile iPhone开发论坛，人气鼎盛，大量自曝，还有Android的讨论 http://developer.apple.com/iphone/ 苹果iPhone开发官方主页，提供大量实例、文档和教学视频 http://www.stanford.edu/class/cs193p/ 斯坦福大学的iPhone课程，2009年4～6月，有pdf和视频下载 http://bit.ly/RuaKq 飞机游戏iFighter的作者dr_watson写的iPhone游戏开发经典教学系列，有源码 http://www.iphoneside.com/ iPhone达人的博客，很多有价值的资源下载，新闻和教程 http://lichen1985.com/blog/ iPhone应用的作者，雨雪霏霏的iPhone博客，很多开发手记和心得 http://blog.liuhongwei.cn/category/iphone/ iPhone开发博客，提供教学文章，经验分享，还有GAE http://www.javaeye.com/topic/422948 iPhone日本市场高手的自曝贴，第1个月就赚了2千刀，大量详细的数字和图片 http://dev.iphonetw.net/ 台湾iPhone开发者论坛，有些教学文章和讨论 Copyright &#169; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></description>
			<content:encoded><![CDATA[<p>http://cocoachina.com/ 大量iPhone开发资料，教学，经验，还有自曝。</p>
<p>http://www.javaeye.com/forums/board/mobile  iPhone开发论坛，人气鼎盛，大量自曝，还有Android的讨论</p>
<p>http://developer.apple.com/iphone/ 苹果iPhone开发官方主页，提供大量实例、文档和教学视频</p>
<p>http://www.stanford.edu/class/cs193p/ 斯坦福大学的iPhone课程，2009年4～6月，有pdf和视频下载</p>
<p>http://bit.ly/RuaKq 飞机游戏iFighter的作者dr_watson写的iPhone游戏开发经典教学系列，有源码</p>
<p>http://www.iphoneside.com/ iPhone达人的博客，很多有价值的资源下载，新闻和教程</p>
<p>http://lichen1985.com/blog/ iPhone应用的作者，雨雪霏霏的iPhone博客，很多开发手记和心得</p>
<p>http://blog.liuhongwei.cn/category/iphone/ iPhone开发博客，提供教学文章，经验分享，还有GAE</p>
<p>http://www.javaeye.com/topic/422948  iPhone日本市场高手的自曝贴，第1个月就赚了2千刀，大量详细的数字和图片</p>
<p>http://dev.iphonetw.net/ 台湾iPhone开发者论坛，有些教学文章和讨论</p>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/06/%e8%ae%b0%e5%bd%95%e5%87%a0%e4%b8%aa%e5%b8%b8%e7%94%a8%e7%9a%84iphone%e5%bc%80%e5%8f%91%e7%bd%91%e7%ab%99/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>oracle 存储过程的基本语法</title>
		<link>http://www.hengxinsoft.com/2010/06/oracle-%e5%ad%98%e5%82%a8%e8%bf%87%e7%a8%8b%e7%9a%84%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/</link>
		<comments>http://www.hengxinsoft.com/2010/06/oracle-%e5%ad%98%e5%82%a8%e8%bf%87%e7%a8%8b%e7%9a%84%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 13:53:51 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[Java栏]]></category>
		<category><![CDATA[经典收藏]]></category>
		<category><![CDATA[oracle 存储过程]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/?p=536</guid>
		<description><![CDATA[1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中，可以同时将多个列存储多个变量中，必须有一条 记录，否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子： BEGIN SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; &#8230; 3.IF 判断 IF V_TEST=1 THEN BEGIN do something END; END [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: x-small;">1.基本结构 </span></p>
<p><span style="font-size: x-small;">CREATE OR REPLACE PROCEDURE 存储过程名字 </span></p>
<p><span style="font-size: x-small;">( </span></p>
<p><span style="font-size: x-small;"> 参数1 IN NUMBER, </span></p>
<p><span style="font-size: x-small;"> 参数2 IN NUMBER </span></p>
<p><span style="font-size: x-small;">) IS </span></p>
<p><span style="font-size: x-small;">变量1 INTEGER :=0; </span></p>
<p><span style="font-size: x-small;">变量2 DATE; </span></p>
<p><span style="font-size: x-small;">BEGIN </span></p>
<p><span style="font-size: x-small;">END 存储过程名字 </span></p>
<p><span style="font-size: x-small;">2.SELECT INTO STATEMENT </span></p>
<p><span style="font-size: x-small;"> 将select查询的结果存入到变量中，可以同时将多个列存储多个变量中，必须有一条 </span></p>
<p><span style="font-size: x-small;"> 记录，否则抛出异常(如果没有记录抛出NO_DATA_FOUND) <span id="more-536"></span></span></p>
<p><span style="font-size: x-small;"> 例子： </span></p>
<p><span style="font-size: x-small;"> BEGIN </span></p>
<p><span style="font-size: x-small;"> SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx; </span></p>
<p><span style="font-size: x-small;"> EXCEPTION </span></p>
<p><span style="font-size: x-small;"> WHEN NO_DATA_FOUND THEN </span></p>
<p><span style="font-size: x-small;"> xxxx; </span></p>
<p><span style="font-size: x-small;"> END; </span></p>
<p><span style="font-size: x-small;"> &#8230; </span></p>
<p><span style="font-size: x-small;">3.IF 判断 </span></p>
<p><span style="font-size: x-small;"> IF V_TEST=1 THEN </span></p>
<p><span style="font-size: x-small;"> BEGIN </span></p>
<p><span style="font-size: x-small;"> do something </span></p>
<p><span style="font-size: x-small;"> END; </span></p>
<p><span style="font-size: x-small;"> END IF; </span></p>
<p><span style="font-size: x-small;">4.while 循环 </span></p>
<p><span style="font-size: x-small;"> WHILE V_TEST=1 LOOP </span></p>
<p><span style="font-size: x-small;"> BEGIN </span></p>
<p><span style="font-size: x-small;">XXXX </span></p>
<p><span style="font-size: x-small;"> END; </span></p>
<p><span style="font-size: x-small;"> END LOOP; </span></p>
<p><span style="font-size: x-small;">5.变量赋值 </span></p>
<p><span style="font-size: x-small;"> V_TEST := 123; </span></p>
<p><span style="font-size: x-small;">6.用for in 使用cursor </span></p>
<p><span style="font-size: x-small;"> &#8230; </span></p>
<p><span style="font-size: x-small;"> IS </span></p>
<p><span style="font-size: x-small;"> CURSOR cur IS SELECT * FROM xxx; </span></p>
<p><span style="font-size: x-small;"> BEGIN </span></p>
<p><span style="font-size: x-small;">FOR cur_result in cur LOOP </span></p>
<p><span style="font-size: x-small;"> BEGIN </span></p>
<p><span style="font-size: x-small;"> V_SUM :=cur_result.列名1+cur_result.列名2 </span></p>
<p><span style="font-size: x-small;"> END; </span></p>
<p><span style="font-size: x-small;">END LOOP; </span></p>
<p><span style="font-size: x-small;"> END; </span></p>
<p><span style="font-size: x-small;">7.带参数的cursor </span></p>
<p><span style="font-size: x-small;"> CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; </span></p>
<p><span style="font-size: x-small;"> OPEN C_USER(变量值); </span></p>
<p><span style="font-size: x-small;"> LOOP </span></p>
<p><span style="font-size: x-small;">FETCH C_USER INTO V_NAME; </span></p>
<p><span style="font-size: x-small;">EXIT FETCH C_USER%NOTFOUND; </span></p>
<p><span style="font-size: x-small;"> do something </span></p>
<p><span style="font-size: x-small;"> END LOOP; </span></p>
<p><span style="font-size: x-small;"> CLOSE C_USER; </span></p>
<p><span style="font-size: x-small;">8.用pl/sql developer debug </span></p>
<p><span style="font-size: x-small;"> 连接数据库后建立一个Test WINDOW </span></p>
<p><span style="font-size: x-small;"> 在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试 </span></p>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/06/oracle-%e5%ad%98%e5%82%a8%e8%bf%87%e7%a8%8b%e7%9a%84%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>本博客参加了校园博客大赛，支持我请投我一票</title>
		<link>http://www.hengxinsoft.com/2010/05/%e6%9c%ac%e5%8d%9a%e5%ae%a2%e5%8f%82%e5%8a%a0%e4%ba%86%e6%a0%a1%e5%9b%ad%e5%8d%9a%e5%ae%a2%e5%a4%a7%e8%b5%9b%ef%bc%8c%e6%94%af%e6%8c%81%e6%88%91%e8%af%b7%e6%8a%95%e6%88%91%e4%b8%80%e7%a5%a8/</link>
		<comments>http://www.hengxinsoft.com/2010/05/%e6%9c%ac%e5%8d%9a%e5%ae%a2%e5%8f%82%e5%8a%a0%e4%ba%86%e6%a0%a1%e5%9b%ad%e5%8d%9a%e5%ae%a2%e5%a4%a7%e8%b5%9b%ef%bc%8c%e6%94%af%e6%8c%81%e6%88%91%e8%af%b7%e6%8a%95%e6%88%91%e4%b8%80%e7%a5%a8/#comments</comments>
		<pubDate>Fri, 07 May 2010 06:30:50 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[原创]]></category>
		<category><![CDATA[经典收藏]]></category>
		<category><![CDATA[博客大赛]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/?p=492</guid>
		<description><![CDATA[   写博客以有一年多的时间了吧 在这一年的时间了我承认我曾经颓废过 我曾经有过放弃的想法 ，但是我坚持下来了  一路走来 阿宽也不容易 听说学校举行了博客大赛，于是乎就报了名 但是没料票数很低 所以想请广大博友出面帮个忙 投我一票 感谢你对我的支持  投票地址 http://eee.nyist.net/ShowBlog.aspx 方法 在下拉框中选择软件学院 找 第一页 或者第二页 应该就有 Copyright &#169; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></description>
			<content:encoded><![CDATA[<p>   写博客以有一年多的时间了吧 在这一年的时间了我承认我曾经颓废过 我曾经有过放弃的想法 ，但是我坚持下来了  一路走来 阿宽也不容易 听说学校举行了博客大赛，于是乎就报了名 但是没料票数很低 所以想请广大博友出面帮个忙 投我一票 感谢你对我的支持  投票地址 <a href="http://eee.nyist.net/ShowBlog.aspx">http://eee.nyist.net/ShowBlog.aspx</a> 方法 在下拉框中选择软件学院 找 第一页 或者第二页 应该就有</p>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/05/%e6%9c%ac%e5%8d%9a%e5%ae%a2%e5%8f%82%e5%8a%a0%e4%ba%86%e6%a0%a1%e5%9b%ad%e5%8d%9a%e5%ae%a2%e5%a4%a7%e8%b5%9b%ef%bc%8c%e6%94%af%e6%8c%81%e6%88%91%e8%af%b7%e6%8a%95%e6%88%91%e4%b8%80%e7%a5%a8/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>计算机高人的心得(一)</title>
		<link>http://www.hengxinsoft.com/2010/04/%e8%ae%a1%e7%ae%97%e6%9c%ba%e9%ab%98%e4%ba%ba%e7%9a%84%e5%bf%83%e5%be%97%e4%b8%80/</link>
		<comments>http://www.hengxinsoft.com/2010/04/%e8%ae%a1%e7%ae%97%e6%9c%ba%e9%ab%98%e4%ba%ba%e7%9a%84%e5%bf%83%e5%be%97%e4%b8%80/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 03:49:40 +0000</pubDate>
		<dc:creator>akin</dc:creator>
				<category><![CDATA[Java栏]]></category>
		<category><![CDATA[经典收藏]]></category>
		<category><![CDATA[学习方法]]></category>
		<category><![CDATA[计算机学习心得]]></category>

		<guid isPermaLink="false">http://www.hengxinsoft.com/?p=470</guid>
		<description><![CDATA[我始终认为，对一个初学者来说，IT界的技术风潮是不可以追赶的，而且也没有能力去追赶。我时常看见自己的DDMM们把课本扔了，去卖些价格不菲的诸如C#, VB.Net 这样的大部头，这让我感到非常痛心。 　　而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样，“忽如一夜春风来，千树万树梨花开”，结果许多学校的信息学院成了“Web 学院”。 　　96,97级的不少大学生都去做Web了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。 几个误区 　　初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象，你可以按部就班的看看自己是不是属于其中的一种或者几种： 认为计算机技术等于编程技术: 　　有些人即使没有这个想法，在潜意识中也有这样的冲动。让我奇怪的是，许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业，与编程无关的，或者不太相关的课程他统统都不管，极端的学生只要书上没带“编程”两个字他就不看。 　　其实编程只是计算机技术应用过程中一种复杂性最低的劳动，这就是为什么IT业最底层的人是程序员（CODER）。计算机技术包括了多媒体，计算机网络，人工智能，模式识别，管理信息系统等等这些方面。 　　编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是，不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白，自己这些东西，学的时候并不比其它专业难，所以自然也不会高档到哪里去。 咬文嚼字的孔乙己作风: 　　我见过一本女生的《计算机网络原理》教材，这个女生象小学生一样在书上划满了横杠杠，笔记做得满满的，打印出来一定比教材还厚。我不明白的是，象计算机网络原理这样的课程有必要做笔记？我们的应试教育的确害了不少学生，在上《原理》这一类课程的时候许多学生象学《马列原理》一样逐字背诵记忆。 　　这乃是我见过的最愚蠢的行为。所谓《原理》，即是需要掌握它为什么这样做，学习why，而不是how（怎样做）。极端认真的学生背下以太网的网线最大长度，数据帧的长度，每个字段的意义，IP 报头的格式等等，但是忘了路由的原则，忘了TCP/IP协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。 　　在学习编程的时候这些学生也是这样，他们确切的记得C#语法的各个细节。看完了C#教程后看《Thinking in C#》（确实是好书），《Inside C#》，《C# reference》，this C#，thatC#……，然后是网上各种各样的关于C#语法的奇闻逸事，然后发现自己又忘了C#的一些语法，最后回头继续恶补……。有个师弟就跟我说： “C# 太难了，学了这里忘了那里，学了继承忘了模板。”我的回答道：“你不去学就容易了”。我并没有教坏他，只是告诉他，死抠C#的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C#语法太关心，动手编程就是了，有不记得的地方一查MSDN就立马搞定。我有个结论就是，实际的开发过程中对程序语法的了解是最微不足道的知识。这是为什么我在为同学用Basic（我以前从没有学过它）写一个小程序的时候，只花了半个小时看了看语法，然后再用半个小时完成了程序，而一个小时后我又完全忘记了Basic 的所有关键字。 不顾基础，盲目追赶时髦技术： 　　终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来，变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的，而且IT技术进步是如此的快，不跟进就是失业。但是对于初学者来说（尤其是时间充裕的大中专在校生），这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西，学习why 而不是how。时髦的技术往往容易掌握，而且越来越容易掌握，这是商业利益的驱使，为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样，越容易掌握的东西，学习的人越多，而且淘汰得越快。每一次新的技术出来，都有许多初学者跟进，这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间，而等他学会了，这种技术也快淘汰了。基础的课程，比方数据结构，操作系统原理等等虽然不能让你立马就实现一个linux（这是许多人嘲笑理论课程无用的原因），但它们能够显著的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术（比方Win32 SDK 程序的设计，DDK的编程）来说甚至是不可或缺的。 一个活生生的例子是我和我的一个同学，在大一时我还找不到开机按纽，他已经会写些简单的汇编程序了。我把大二的所有时间花在了汇编，计算机体系结构，数据结构，操作系统原理等等这些课程的学习上，而他则开始学习HTML和VB，并追赶ASP 的潮流。大三的时候我开始学习Windows 操作系统原理，学习SDK编程，时间是漫长的，这时我才能够用VC开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已，但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方：假设学习VB编程需要 4个月，学习基础课程和VC的程序设计需要1年。那么如果你先学VB，再来学习后者，时间不会减少，还是1年，而反过来，如 果先学习后者，再来学VB，也许你只需要1个星期就能学得非常熟练。 几个重要的基础课程 　　如果你是学生，或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目，这些书应该都还可以在书店买到。说实在的，我在读其他人的文章时最大的心愿就是希望作者列出一个书单。 　　大学英语——不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来，而现在的许多出版社干脆就直接把E文印刷上去。学习的方法是强迫自己看原版的教材，开始会看不懂，用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。 　　计算机体系结构和汇编语言——关于体系结构的书遍地都是，而且也大同小异，倒是《80&#215;86汇编语言程序设计教程》（清华大学出版社，黑色封面，杨季文著）。你需要着重学习386后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。 　　计算机操作系统原理——我们的开发总是在特定的操作系统上进行，如果不是，只有一种可能：你在自己实现一个操作系统。无论如何，操作系统原理是必读的。这就象我们为一个芯片制作外围设备时，芯片基本的工作时序是必需了解的。这一类书也很多，我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《Inside Windows 2000》(微软出版社，我看的是E文版的，中文的书名想必是Windows 2000 技术内幕之类吧)。 　　数据结构和算法——这门课程能够决定一个人程序设计水平的高低，是一门核心课程。我首选的是清华版的（朱战立，刘天时）。很多人喜欢买C#版的，但我觉得没有必要。C#的语法让算法实现过程变得复杂多了，而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C#的版的书是最好的。 软件工程——这门课程是越到后来就越发现它的重要，虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》（黄色，清华）。不要花太多的时间去记条条框框，看不懂就跳过去。在每次自己完成了一个软件设计任务（不管是练习还是工作）以后再来回顾回顾，每次都会有收获。 　　Windows 程序设计——《北京大学出版社，Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。 　　在这本书中，没有C++，没有GUI，没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在学完了它以后，你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC，你最好碰都不要碰。我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要。 　　上面的几门课程我认为是必学的重要课程（如果你想做Windows 程序员）。 [...]]]></description>
			<content:encoded><![CDATA[<div>我始终认为，对一个初学者来说，IT界的技术风潮是不可以追赶的，而且也没有能力去追赶。我时常看见自己的DDMM们把课本扔了，去卖些价格不菲的诸如C#, VB.Net 这样的大部头，这让我感到非常痛心。<br />
　　而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样，“忽如一夜春风来，千树万树梨花开”，结果许多学校的信息学院成了“Web 学院”。<span id="more-470"></span><br />
　　96,97级的不少大学生都去做Web了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。<br />
几个误区<br />
　　初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象，你可以按部就班的看看自己是不是属于其中的一种或者几种：<br />
认为计算机技术等于编程技术:<br />
　　有些人即使没有这个想法，在潜意识中也有这样的冲动。让我奇怪的是，许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业，与编程无关的，或者不太相关的课程他统统都不管，极端的学生只要书上没带“编程”两个字他就不看。<br />
　　其实编程只是计算机技术应用过程中一种复杂性最低的劳动，这就是为什么IT业最底层的人是程序员（CODER）。计算机技术包括了多媒体，计算机网络，人工智能，模式识别，管理信息系统等等这些方面。<br />
　　编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是，不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白，自己这些东西，学的时候并不比其它专业难，所以自然也不会高档到哪里去。<br />
咬文嚼字的孔乙己作风:<br />
　　我见过一本女生的《计算机网络原理》教材，这个女生象小学生一样在书上划满了横杠杠，笔记做得满满的，打印出来一定比教材还厚。我不明白的是，象计算机网络原理这样的课程有必要做笔记？我们的应试教育的确害了不少学生，在上《原理》这一类课程的时候许多学生象学《马列原理》一样逐字背诵记忆。<br />
　　这乃是我见过的最愚蠢的行为。所谓《原理》，即是需要掌握它为什么这样做，学习why，而不是how（怎样做）。极端认真的学生背下以太网的网线最大长度，数据帧的长度，每个字段的意义，IP 报头的格式等等，但是忘了路由的原则，忘了TCP/IP协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。<br />
　　在学习编程的时候这些学生也是这样，他们确切的记得C#语法的各个细节。看完了C#教程后看《Thinking in C#》（确实是好书），《Inside C#》，《C# reference》，this C#，thatC#……，然后是网上各种各样的关于C#语法的奇闻逸事，然后发现自己又忘了C#的一些语法，最后回头继续恶补……。有个师弟就跟我说： “C# 太难了，学了这里忘了那里，学了继承忘了模板。”我的回答道：“你不去学就容易了”。我并没有教坏他，只是告诉他，死抠C#的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C#语法太关心，动手编程就是了，有不记得的地方一查MSDN就立马搞定。我有个结论就是，实际的开发过程中对程序语法的了解是最微不足道的知识。这是为什么我在为同学用Basic（我以前从没有学过它）写一个小程序的时候，只花了半个小时看了看语法，然后再用半个小时完成了程序，而一个小时后我又完全忘记了Basic 的所有关键字。<br />
不顾基础，盲目追赶时髦技术：<br />
　　终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来，变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的，而且IT技术进步是如此的快，不跟进就是失业。但是对于初学者来说（尤其是时间充裕的大中专在校生），这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西，学习why 而不是how。时髦的技术往往容易掌握，而且越来越容易掌握，这是商业利益的驱使，为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样，越容易掌握的东西，学习的人越多，而且淘汰得越快。每一次新的技术出来，都有许多初学者跟进，这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间，而等他学会了，这种技术也快淘汰了。基础的课程，比方数据结构，操作系统原理等等虽然不能让你立马就实现一个linux（这是许多人嘲笑理论课程无用的原因），但它们能够显著的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术（比方Win32 SDK 程序的设计，DDK的编程）来说甚至是不可或缺的。<br />
一个活生生的例子是我和我的一个同学，在大一时我还找不到开机按纽，他已经会写些简单的汇编程序了。我把大二的所有时间花在了汇编，计算机体系结构，数据结构，操作系统原理等等这些课程的学习上，而他则开始学习HTML和VB，并追赶ASP 的潮流。大三的时候我开始学习Windows 操作系统原理，学习SDK编程，时间是漫长的，这时我才能够用VC开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已，但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方：假设学习VB编程需要 4个月，学习基础课程和VC的程序设计需要1年。那么如果你先学VB，再来学习后者，时间不会减少，还是1年，而反过来，如<br />
果先学习后者，再来学VB，也许你只需要1个星期就能学得非常熟练。<br />
几个重要的基础课程<br />
　　如果你是学生，或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目，这些书应该都还可以在书店买到。说实在的，我在读其他人的文章时最大的心愿就是希望作者列出一个书单。<br />
　　大学英语——不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来，而现在的许多出版社干脆就直接把E文印刷上去。学习的方法是强迫自己看原版的教材，开始会看不懂，用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。<br />
　　计算机体系结构和汇编语言——关于体系结构的书遍地都是，而且也大同小异，倒是《80&#215;86汇编语言程序设计教程》（清华大学出版社，黑色封面，杨季文著）。你需要着重学习386后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。<br />
　　计算机操作系统原理——我们的开发总是在特定的操作系统上进行，如果不是，只有一种可能：你在自己实现一个操作系统。无论如何，操作系统原理是必读的。这就象我们为一个芯片制作外围设备时，芯片基本的工作时序是必需了解的。这一类书也很多，我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《Inside Windows 2000》(微软出版社，我看的是E文版的，中文的书名想必是Windows 2000 技术内幕之类吧)。<br />
　　数据结构和算法——这门课程能够决定一个人程序设计水平的高低，是一门核心课程。我首选的是清华版的（朱战立，刘天时）。很多人喜欢买C#版的，但我觉得没有必要。C#的语法让算法实现过程变得复杂多了，而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C#的版的书是最好的。<br />
软件工程——这门课程是越到后来就越发现它的重要，虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》（黄色，清华）。不要花太多的时间去记条条框框，看不懂就跳过去。在每次自己完成了一个软件设计任务（不管是练习还是工作）以后再来回顾回顾，每次都会有收获。<br />
　　Windows 程序设计——《北京大学出版社，Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。<br />
　　在这本书中，没有C++，没有GUI，没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在学完了它以后，你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC，你最好碰都不要碰。我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要。<br />
　　上面的几门课程我认为是必学的重要课程（如果你想做Windows 程序员）。<br />
　　对于其它的课程有这样简单的选择方法：如果你是计算机系的，请学好你所有的专业基础课。如果不是<a href="http://www.xcvzb.net.cn/"><span style="color: #000000;">，</span></a>请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了<a href="http://www.hjklg.net.cn/"><span style="color: #000000;">，</span></a>请翻到书的最后，看看它的参考文献<a href="http://www.mmjidi.net.cn/"><span style="color: #000000;">，</span></a>找到它们并学习它们<a href="http://www.zcvbx.org.cn/"><span style="color: #000000;">，</span></a>再回头看这本书<a href="http://www.nigu.org.cn/"><span style="color: #000000;">。</span></a>如果一本书的书名中带有“原理”两个字<a href="http://www.juechou.org.cn/"><span style="color: #000000;">，</span></a>你一定不要去记忆它其中的细节<a href="http://www.vzbxc.net.cn/"><span style="color: #000000;">，</span></a>你应该以一天至少50页的速度掌握其要领<a href="http://www.gudebai.org.cn/"><span style="color: #000000;">。</span></a>尽可能多的在计算机上实践一种理论或者算法<a href="http://www.huachizui.cn/"><span style="color: #000000;">。</span></a><br />
　　你还可以在CSDN上阅读到许多书评<a href="http://www.youtiao.net.cn/"><span style="color: #000000;">。</span></a>这些书评能够帮助你决定读什么样的书<a href="http://www.sadamu.net.cn/"><span style="color: #000000;">。</span></a><br />
日三省乎己<br />
　　每天读的书太多<a href="http://www.xiaoguizi.org.cn/"><span style="color: #000000;">，</span></a>容易让人迷失方向<a href="http://www.rijun.org.cn/"><span style="color: #000000;">。</span></a>一定要在每天晚上想想自己学了些什么<a href="http://www.huhua.org.cn/"><span style="color: #000000;">，</span></a>还有些什么相关的东西需要掌握<a href="http://www.zbxcv.org.cn/"><span style="color: #000000;">，</span></a>自己对什么最感兴趣，在一本书上花的时间太长还是不够等等<a href="http://www.74hack.org.cn/"><span style="color: #000000;">。</span></a>同时也应该多想想未来最有可能出现的应用<a href="http://www.bxcvz.org.cn/"><span style="color: #000000;">，</span></a>这样能够让你不是追赶技术潮流而是引领技术潮流<a href="http://www.cvzbx.org.cn/"><span style="color: #000000;">。</span></a>同时<a href="http://www.klghj.net.cn/"><span style="color: #000000;">，</span></a>努力使用现在已经掌握的技术和理论去制作具有一定新意的东西<a href="http://www.lghjk.org.cn/"><span style="color: #000000;">。</span></a>坚持这样做能够让你真正成为一个软件“研发者”而不仅仅是一个CODER<a href="http://www.heart578.net.cn/"><span style="color: #000000;">。</span></a><br />
把最多的时间花在学习上<br />
　　这是对初学者最后的忠告<a href="http://www.static.org.cn/"><span style="color: #000000;">。</span></a>把每个星期玩SC或者CS的时间压缩到最少<a href="http://www.stard.net.cn/"><span style="color: #000000;">，</span></a>不玩它们是最好的。同时<a href="http://www.osle.net.cn/"><span style="color: #000000;">，</span></a>如果你的ASP技术已经能够来钱<a href="http://www.heart578.cn/"><span style="color: #000000;">，</span></a>甚至有公司请你兼职的话，这就证明你的天份能够保证你在努力的学习之后取得更好的收益<a href="http://www.dali521.cn/"><span style="color: #000000;">，</span></a>你应该去做更复杂的东西<a href="http://www.starl.com.cn/"><span style="color: #000000;">。</span></a>眼光放长远一些<a href="http://www.rudy.org.cn/"><span style="color: #000000;">，</span></a>这无论是对谁都是适用的<a href="http://www.osle.org.cn/"><span style="color: #000000;">。</span></a><br />
　　相信你已经能够决定是否学习C＃或者什么时候去学它了。<br />
学计算机的建议。</div>
<div> </div>
<hr />Copyright &copy; SITE_NAME. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement.]]></content:encoded>
			<wfw:commentRss>http://www.hengxinsoft.com/2010/04/%e8%ae%a1%e7%ae%97%e6%9c%ba%e9%ab%98%e4%ba%ba%e7%9a%84%e5%bf%83%e5%be%97%e4%b8%80/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

