易栈网-膘叔

浏览模式: 标准 | 列表 | 图文

Objective-C入门

Objective-C是一种简单的计算机语言,设计为可以支持真正的面向对象 编程。Objective-C通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的ANSI C语言。类的语法和设计主要是基于Smalltalk,最早的面向对象编程语言之一。

如果你以前使用过其他面向对象编程语言,那么下面的信息可以帮助你学习Objective-C的基本语法。许多传统的面向对象概念,例如封装,继承 以及多态,在Objective-C中都有所体现。这里有一些重要的不同,但是这些不同在这文章会表现出来,而且如果你需要还有更多详细的信息存在。

如果你从来没有使用任何编程语言编过程序,那么你至少需要在开始之前,对相关概念进行一些基础的了解。对象的使用和对象对象架构是iPhone程序 设计的基础,理解他们如何交互对创建你的程序非常重要。想了解面向对象概念的,请参看使用Objective-C进行面向对象编程。此外,参看Cocoa 基础指南可以获得Cocoa中的面向对象设计模式的信息。

想了解更多Objective-C语言和语法的细节介绍,请参看Objective-C 2.0编程语言。

Objective-C: C的超集

Objective-C是ANSI版本C编程语言的超集,支持C的基本语法。在C代码中,你定义头文件和源代码文件,从代码实现细节分离公共声明。Objective-C头文件使用的文件名列在表1中。

表1 Objective-C代码的文件扩展名

扩展名 内容类型
.h 头文件。头文件包含类,类型,函数和常数的声明。
.m 源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。
.mm 源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名。


当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方 法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使 用#import,你的代码也应该是这样的。

字符串

作为C语言的超集,Objective-C支持C语言字符串方面的约定。也就是说,单个字符被单引号包括,字符串被双引号包括。然而,大多数 Objective-C通常不使用C语言风格的字符串。反之,大多数框架把字符串传递给NSString对象。NSString类提供了字符串的类包装, 包含了所有你期望的优点,包括对保存任意长度字符串的内建内存管理机制,支持Unicode,printf风格的格式化工具,等等。因为这种字符串使用的 非常频繁,Objective-C提供了一个助记符可以方便地从常量值创建NSString对象。要使用这个助记符,你需要做的全部事情,是在普通的双引 号字符串前放置一个@符号,如下面的例子所示:

NSString*  myString = @"My String\n"; NSString*  anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];  // 从一个C语言字符串创建Objective-C字符串 NSString*  fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding];

类

如同所有其他的面向对象语言,类是Objective-C用来封装数据,以及操作数据的行为的基础结构。对象就是类的运行期间实例,它包含了类声明 的实例变量自己的内存拷贝,以及类成员的指针。Objective-C的类规格说明包含了两个部分:接口和实现。接口部分包含了类声明和实例变量的定义, 以及类相关的方法。实现部分包含了类方法的实际代码。图1展现了声明一个叫做MyClass的类的语法,这个类继承自NSObject基础类。类声明总是 由@interface编译选项开始,由@end编译选项结束。类名之后的(用冒号分隔的)是父类的名字。类的实例(或者成员)变量声明在被大括号包含的 代码块中。实例变量块后面就是类声明的方法的列表。每个实例变量和方法声明都以分号结尾。

6f1a7c87b6ea08fa3a5082aec66619ec

列表1展现了前面例子中MyClass类的实现。类同与类声明,类实现的位置也由两个编译选项确定,@implementation和@end。这 些选项给编译器提供了要将方法和对应类联系起来,所需的范围信息。因此方法的定义和接口中对应的声明是匹配的,只是多了个代码块而已。

列表1 类实现

@implementation MyClass      - (id)initWithString:(NSString *) aName {     if (self = [super init]) {         count count = 0;         data = nil;         name = [aName copy];         return self;     } }    + (MyClass *)createMyClassWithString: (NSString *) aName {     return [[[self alloc] initWithString:aName] autorelease]; } @end

注意: 虽然前面的类只声明了方法,但是类可以声明属性。想了解更多关于属性的信息,参看“属性”。

当用变量保存对象的时候,始终应该使用指针类型。Objective-C对变量包含的对象支持强弱两种类型。强类型指针的变量类型声明包含了类名。 弱类型指针使用id作为对象的类型。弱类型指针常用于类的集合,在集合中对象精确的类型可以是未知的。如果你用过强类型语言,你也许觉得使用弱类型变量可 能会带来问题,但是他们实际上给了Objective-C程序巨大的灵活性,而且使它更强大。

下面的例子里,展示了MyClass类的强类型和弱类型声明变量:

MyClass*  myObject1;    // Strong typing id        myObject2;    // Weak typing

方法

Objective-C中的类可以声明两种类型的方法:实例方法和类方法。实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。而类方法,比较起来,也就是说,不需要你创建一个实例。

方法声明包括方法类型标识符,返回值类型,一个或多个方法标识关键字,参数类型和名信息。图2展示insertObject:atIndex:实例 方法的声明。声明由一个减号(-)开始,这表明这是一个实例方法。方法实际的名字(insertObject:atIndex:)是所有方法标识关键的级 联,包含了冒号。冒号表明了参数的出现。如果方法没有参数,你可以省略第一个(也是唯一的)方法标识关键字后面的冒号。本例中,这个方法有两个参数。

73f79a3bacd339f20bfd5b4ae3c830de

当你想调用一个方法,你传递消息到对应的对象。这里消息就是方法标识符,以及传递给方法的参数信息。发送给对象的所有消息都会动态分发,这样有利于 实现Objective-C类的多态行为。也就是说,如果子类定义了跟父类的具有相同标识符的方法,那么子类首先收到消息,然后可以有选择的把消息转发 (也可以不转发)给他的父类。

消息被中括号( [ 和 ] )包括。中括号中间,接收消息的对象在左边,消息(包括消息需要的任何参数)在右边。例如,给myArray变量传递消息insertObject:atIndex:消息,你需要使用如下的语法:

[myArray insertObject:anObj atIndex:0];

为了避免声明过多的本地变量保存临时结果,Objective-C允许你使用嵌套消息。每个嵌套消息的返回值可以作为其他消息的参数或者目标。例 如,你可以用任何获取这种值的消息来代替前面例子里面的任何变量。所以,如果你有另外一个对象叫做myAppObject拥有方法,可以访问数组对象,以 及插入对象到一个数组,你可以把前面的例子写成如下的样子:

[[myAppObject getArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];

虽然前面的例子都是传递消息给某个类的实例,但是你也可以传递消息给类本身。当给类发消息,你指定的方法必须被定义为类方法,而不是实例方法。你可以认为类方法跟C++类里面的静态成员有点像(但是不是完全相同的)。

类方法的典型用途是用做创建新的类实例的工厂方法,或者是访问类相关的共享信息的途径。类方法声明的语法跟实例方法的几乎完全一样,只有一点小差别。与实例方法使用减号作为方法类型标识符不同,类方法使用加号( + )。

下面的例子演示了一个类方法如何作为类的工厂方法。在这里,arrayWithCapacity是NSMutableArray类的类方法,为类的新实例分配内容并初始化,然后返回给你。

NSMutableArray*   myArray = nil;    // nil is essentially the same as NULL  // Create a new array and assign it to the myArray variable. myArray = [NSMutableArray arrayWithCapacity:0];

属性

属性是用来代替声明存取方法的便捷方式。属性不会在你的类声明中创建一个新的实例变量。他们仅仅是定义方法访问已有的实例变量的速记方式而已。暴露 实例变量的类,可以使用属性记号代替getter和setter语法。类还可以使用属性暴露一些“虚拟”的实例变量,他们是部分数据动态计算的结果,而不 是确实保存在实例变量内的。

实际上可以说,属性节约了你必须要些的大量多余的代码。因为大多数存取方法都是用类似的方式实现的,属性避免了为类暴露的每个实例变量提供不同的 getter和setter的需求。取而代之的是,你用属性声明指定你希望的行为,然后在编译期间合成基于声明的实际的getter和setter方法。

属性声明应该放在类接口的方法声明那里。基本的定义使用@property编译选项,紧跟着类型信息和属性的名字。你还可以用定制选项对属性进行配置,这决定了存取方法的行为。下面的例子展示了一些简单的属性声明:

@property BOOL flag; @property (copy) NSString* nameObject;  // Copy the object during assignment. @property (readonly) UIView* rootView;  // Create only a getter method.

使用属性另外的好处就是你可以在代码中访问他们的时候,使用点语法,如下面的例子所示:

myObject.flag = YES; CGRect   viewFrame = myObject.rootView.frame;

虽然前面例子里面的对象和属性名是故意这么取的,他们还是展现了属性的灵活性。点语法实际上隐藏了对应的方法调用。每个可读的属性由一个与属性同名 的方法支持。每个可写属性由一个叫做“set属性名”的额外方法来支持,属性名的第一个字母要大写。(这些方法是属性的实际实现方式,也是你可以声明一个 没有任何实例变量支持的属性声明的原因。)如果用方法来代替前面代码中的属性,你就要下下面的代码:

[myObject setFlag:YES]; CGRect   viewFrame = [[myObject rootView] frame];

要了解更多关于如何声明属性的信息,参看Objective-C 2.0编程语言的属性一章。

协议和代理

协议声明了可以被任何类实现的方法。协议不是那些类本身。他们仅是定义一个接口,其他的对象去负责实现。你实现了协议里面的方法,就叫做符合协议。

在iPhone OS中协议常用来实现委托对象。委托对象就是一个对象以其他的对象的模式行事。了解协议,委托和对象最好的办法就是看一个例子。

UIApplication类实现了一个程序需要的行为。如果想接收程序当前状态的简单消息,并不需要强制你创建UIApplication的一个 子类,反之UIApplication类通过调用委托对象的指定方法来分发这些通知消息。实现UIApplicationDelegate方法的对象都可 以接受这样的通知,并进行响应的反应。

协议的声明跟类接口的声明很像,只是协议没有父类,而且他们不会定义任何实例变量。下面的例子展示了一个有一个方法的协议声明:

@protocol MyProtocol 		- (void)myProtocolMethod; @end

在大多数委托协议情况下,使用某种协议仅仅是简单的实现协议定义的方法而已。 有些协议要求你明确的表明你支持这种协议,协议可以指定必须或者可选的方法。在你深入开发的过程中,你应该花点时间学习协议以及他们的用途,请阅读 Objective-C 2.0编程语言的协议章节。

更多的信息

前面的信息是为了让你对Objective-C语言的基础所有了解。本文提到的语言特性,你可以在阅读完整文档的时候找到。但是这个语言不仅仅有这些特性,所以最好请仔细阅读文档Objective-C 2.0编程语言。

参考:http://tiny4cocoa.com/doc/xcode-doc/learn-objective-c

某人辞职报告中的8点体会

某人辞职报告中的8点体会

博客园中的某人的所谓的非辞职报告的辞职报告,在洋洋洒洒几百字中,我把他的所谓的几点体会贴出来了。
原文比较乱。用评论的话说,大家现在看到的已经是整理过的。原来的,居然连段落都没有。
OK,原文地址是:http://www.cnblogs.com/zjyuan/archive/2011/09/12/2174237.html
在这里我不贴了。我只贴其中的几点体会 :

做事要考虑后果,做事情前一定要考虑最佳途径,不可以想当然就可以想当然,而是要考虑整个团队的进度与计划。
一定要考虑问题的全面性,不要管窥全豹。
说出你的进度,说出你的计划,说出你的问题,说出你的思路,商讨全面的解决方案。
职责必须明确,自己工作范围内的事,一定要把它做好,让别人替你做,这是缺乏责任感的表现。
做功能一定要先理清需求,梳理脉络,画图或是写文档,把问题考虑全面,然后再编码,编码完成后,一定要详细仔细的自测一遍,确定没有问题后在提交。
做软件,不是玩游戏,你做出的产品是给用户用的,人家用你系统,你就要负责任,不仅是对用户负责任,还要对自己负责任。
我们是一个团队,要考虑整体的进度,以最佳的任务分配方案,最快速的完成任务!
要分析用户提出的问题,然后整理思路,概括脉络,最后细化回复邮件的言辞,统一邮件格式,正确使用标点符号,完成之后来来回回一定要检查几遍,确定无错误后在发送。

好吧。我这里不多作评价但很多还是可以借鉴的。

来自cnbeta:2011年度程序员节快乐

来自cnbeta:2011年度程序员节快乐

看到这个新闻才发现,原来还真有程序员节?。。。。。
cnbeta上的网址是:http://www.cnbeta.com/articles/154851.htm
亲爱的开发者们(Dear Hackers/Engineers/Programmers),距离上一次程序员节又是一年了, 这一年中我们辛苦的编写着代码,我们为无数死气沉沉的软件注入灵魂,我们(Programmer)在无数的夜晚编写着代码,我们(Engineer)为了 软件架构的问题(选择适合的自由软件代码和思考是否亲自实现某些模块)绞尽脑汁,当然我们也和酱缸教的老板们展开了有趣的博弈。 不管怎么样,过去一年的经 历让我们变得更加的强壮。在过去的一年里Linux kernel走过了20年,id software也走过了20年(无数的hacker正在等着Doom III源代码去创造更多的游戏),Phrack走过了25年...

但愿在新的一年里我们继续沿着代码和框架的hacking之路前进,不论前方的敌人有多么强大,创造强大敌人的设计者会站在我们的一边。外星人说:”程序设计是神圣的职业,因为是我们为地球人创造了她。“

注:程序员节日是俄罗斯官方的节日,每年的第256(0x100th)天,通常是9月13日,如果是闰年就是9月12日。"
---------
原来我们还真有这样的节日,只是这个节日为什么是俄罗斯的呢?真有意思

Sublime Text 2 简介

Sublime Text 2 简介

之前在vrphperz群里咨询苹果下哪个编辑器稍微好一点。一群装B犯说textmate之类的,还有人说VIM,这些都直接无了。后来有人说了sublimetext2,于是下载了看看。发现是要钱的,但不是付钱也可以使用。于是心安理得的先用了起来。实在是买不起,好贵,比PD都贵上两三倍。。。(过两天介绍一下我用的parallels desktop)
使用sublimetext2的过程中,发现他的响应速度也很快,右边也有一种类似于整页编码缩略图的概念,配色也相对比较容易适应,于是就开始使用了。
经验不足,纯粹是当成editplus之类的工具在用的。于是看到这篇文章的时候,复制了一下(其实我对zencoding不太感兴趣,虽然好象现在很多编辑器都内置 了,比如我用的phpstorm也内置了支持。。。)我对文章最后的三个链接比较感兴趣
原文来自:http://shawphy.com/2011/09/sublime-text-2.html
最近试用了一款新的编辑器 Sublime Text 2,跨平台,据说他是仿TextMate的,没用过TextMate,不知道后者有多厉害。然而 Sublime Text 2 我一用就爱上他了。
ea4dfae6ee21d84e1aad71021d6fcd48
一开始是由于他的迷你地图模式而吸引我的注意力的,这个迷你地图可以概览整个文件。实现快速跳转。这个是个亮点,在其他编辑器中都没有见过此类功能。然而 试用了之后我很快发现,迷你地图功能可能未必好用,但真正让我觉得舒服的是,他的zencoding支持的非常完美,直接有实时预览功能。

此外他的窗口分组、项目管理、扩展工具、代码折叠方面都非常不错。他还直接支持vim模式呢!
我之前在微博上推荐 Sublime Text 2 后,引来好多vimer的鄙视。说比vim差多了。我也无意参与这类争论。一个是现代兵器,一个是上古神器。自己用的爽就行了,何必与人争呢。

总之这个编辑器非常适合我这样喜欢vim的快捷键,又不喜欢vim复杂的配置的人。轻松上手功能强大。

如果你也心动了,可以点下面的地址来下载最新的开发版。Sublime Text 2是收费软件,但目前可以无限期试用。

http://www.sublimetext.com/dev

另外建议依次拜读 Lucifr 的三篇博客
Sublime Text 2 入门及技巧
ZenCoding in Sublime Text 2
Sublime Text 2 实用快捷键[Mac OS X]

--------------
如果你仅仅当成editplus之类的小工具用,那就无所谓了。如果你想当成一些高级编辑器,那就好好学习吧

十年

十年

在今天这样的日子里,我只想唱一首歌,陈奕迅的《十年》
十年之前。。。。

懂的人自然懂,不懂的人说了也没用。
只是斯人已逝,无法再多说什么,纪念刘和珍君也没用了,药也卖完了。剩下一群看客,继续讨论着一些无聊的话题

免费而又强大的文件比较工具:DiffMerge

免费而又强大的文件比较工具:DiffMerge

在windows下面有N多文件比较工具,很多时间我们都用了beyondcompare,在linux下面也有很多命令行的工具,苹果下面用什么呢?
我问了一下google,果然他就给了我答案:diffmerge
嗯。因为他是免费的。。。
官网地址:http://www.sourcegear.com/diffmerge/index.html
generate_graph.pl
既支持文件、目录比较。也支持合并。其实不要太复杂,就足够了。
用下来好象对UTF-8的支持一般般。。但代码主体不是UTF-8的。已经很满足了

position : static | absolute | fixed | relative 的意思

position : static | absolute | fixed | relative 的意思

position : static | absolute | fixed | relative
取值:
static : 默认值。无特殊定位,对象遵循HTML定位规则
absolute : 将对象从文档流中拖出,使用 left , right , top , bottom 等属性相对于其最接近的一个最有定位设置的父对象进行绝对定位。如果不存在这样的父对象,则依据 body 对象。而其层叠通过 z-index 属性定义
fixed : 未支持。对象定位遵从绝对(absolute)方式。但是要遵守一些规范
relative : 对象不可层叠,但将依据 left , right , top , bottom 等属性在正常文档流中偏移位置

看到static的时候不知道干嘛。

mysql_pconnect的水挺深,apache下的数据库长连接

PHP中的mysql_pconnect一直是大家所拿过来做比较的,但对于很多开发者来说,只知道一件事情,那就是mysql_pconnect是长连接,而mysql_connect是普通的连接。既然PHP没有所谓的连接池,那为什么又会有mysql_pconnect的功能呢?
本文是网上而来的,也是我难得看到一篇关于mysql_pconnect的文章。所以摘抄下来
原文来自:mysql_pconnect的水挺深,apache下的数据库长连接

  php的mysql持久化连接,美好的目标,却拥有糟糕的口碑,往往令人敬而远之。这到底是为啥么。近距离观察后发现,这家伙也不容易啊,要看apache的脸色,还得听mysql指挥。

  对于做为apache模块运行的php来说,要实现mysql持久化连接,首先得取决于apache这个web服务器是否支持Keep-Alive。

  Keep-Alive是什么东西?它是http协议的一部分,让我们复习一下没有Keep-Alive的http请求,从客户在浏览器输入一个 有效url地址开始,浏览器就会利用socket向url对应的web服务器发送一条tcp请求,这个请求成功一次就得需要来回握三次手才能确定,成功以 后,浏览器利用socket tcp连接资源向web服务器请求http协议,发送以后就等着web服务器把http返回头和body发送回来,发回来后浏览器关闭socket连接, 然后做http返回头和body的解析工作,最后呈现在浏览器上的就是漂亮的页面了。这里面有什么问题呢?tcp连接需要三次握手,也就是来回请求三次方 能确定一个tcp请求是否成功,然后tcp关闭呢?来回需要4次请求才能完成!每次http请求就3次握手,4次拜拜,这来来回回的不嫌累啊,多少时间和 资源都被浪费在socket连接关闭上了,能不能一次socket tcp连接发送多次http请求呢?于是Keep-Alive就应运而生,http/1.0里需要客户端自己在请求头加入 Connection:Keep-alive方能实现,在这里我们只考虑http1.1了,只需要设置一下apache,让它默认就是Keep- Alive持久连接模式(apache必须1.2+才能支持Keep-Alive).在httpd.conf里找到KeepAive配置项,果断设置为 On,MaxKeepAliveRequests果断为0(一个持久tcp最多允许的请求数,如果过小,很容易在tcp未过期的情况下,达到最大连接,那 下次连接就又是新的tcp连接了,这里设置0表示不限制),然后对于mysql_pconnect最重要的选项KeepAliveTimeout设置为 15(表示15秒).

  好了,重启apache,测试一下,赶紧写行东西

<?php
echo "Apache进程号:".getmypid();
?>

很简单,获取当前php执行者(apache)的进程号,用浏览器浏览这个页面,看到什么?对,有看到一串进程号数字,15秒内,连续刷新页面,看 看进程号有无变化?木有吧?现在把手拿开,交叉在胸前,度好时间,1秒,2秒,3,...15,16。好,过了15秒了,再去刷新页面,进程号有没有变 化?变了!又是一个新的apache进程了,为什么15秒后就变成新的进程了?记得我们在apache里设置的KeepAliveTimeout吗?它的 值就是15秒.现在我们应该大致清楚了,在web服务器默认打开KeepAlive的情况下,客户端第一次http成功请求后,apache不会立刻断开 socket,而是一直监听来自这一客户端的请求,监听多久?根据KeepAliveTimeout选项配置的时间决定,一旦超过这一时间,apache 就会断开socket了,那么下次同一客户端再次请求,apache就会新开一个进程来相应。所以我们之前15内不停的刷新页面,看到的进程号都是一致 的,表明是浏览器请求给了同一个apache进程。

  浏览器是怎么知道不需要tcp连接就可以直接发送http请求呢?因为http返回头里就会带上Connection:keep- alive,Keep-alive:15两行,意思就是让客户端浏览器明白,这次socket连接我这边还没关闭呢,你可以在15内继续使用这个连接,并 发送http请求,于是乎浏览器就知道应该怎么做了.

  那么,php的mysql连接资源是怎么被hold住的呢,这需要查看php的mysql_pconnect的函数代码,我看了下,大概的做法 就是mysql_pconnect根据当前apache进程号,生成hash key,找hash表内有无对应的连接资源,没有则推入hash表,有则直接使用。有些代码片段可以说明(具体可查看php5.3.8源码 ext/mysql/php_mysql.c文件690行php_mysql_do_connect函数)

#1.生成hash key
user=php_get_current_user();//获取当前php执行者(apache)的进程唯一标识号
hashed_details_length = spprintf(&hashed_details, 0, "mysql__%s_", user);//hashed_details就是hash key
#2.如果未找到已有资源,就推入hash表,名字叫persistent_list,如果找到就直接使用
/* try to find if we already have this link in our persistent list */
if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) { /* we don't */
...
...
/* hash it up(推入hash表) */
Z_TYPE(new_le) = le_plink;
new_le.ptr = mysql;
if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) {
...
...
}

}else{/* The link is in our list of persistent connections(连接已在hash表里)*/
...
...
mysql = (php_mysql_conn *) le->ptr;//直接使用对应的sql连接资源
...
...

}

zend_hash_find比较容易看明白,原型是zend_hash_find(hash表,key名,key长,value);如果找到,value就有值了。

  说完Keep-Alive,该到mysql家串串门了,说的是mysql_pconnect,怎么能绕开mysql的设置。

  影响mysql_pconnect最重要的两个参数就是wait_timeout和interactive_timeout,它们是什么东西?先撇一边,首先让我们把上面的代码改动一下php代码

<?php
$conn = mysql_pconnect("localhost","root","123456") or die("Can not connect to mysql");
echo "Mysql线程号:".mysql_thread_id($conn)."<br/>";
echo "Apache进程号".getmypid();
?>
以上的代码没啥好解释的,让我们用浏览器浏览这个页面,看到什么?看到两个显眼的数字。一个是mysql线程号,一个是apache进程号,好 了,15秒后再刷新这个页面,发现这两个id都变了,因为已经是新的apache进程了,进程id是新的,hash key就变了,php只好重新连接mysql,连接资源推入persistent list。如果15内刷新呢?apache进程肯定不变,mysql线程号会变吗?答案得问mysql了。首先这个mysql_thread_id是什么 东西?shell方式登录mysql后执行命令'show processlist;',看到了什么?
mysql> show processlist;
+-----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------+------+---------+------+-------+------------------+
| 348 | root | localhost | NULL | Query | 0 | NULL | show processlist |
| 349 | root | localhost | NULL | Sleep | 2 | | NULL |
+-----+------+-----------+------+---------+------+-------+------------------+

,发现了很重要的信息,这个processlist列表就是记录了正在跑的线程,忽略Info列为show processlist那行,那行是你当前shell登录mysql的线程。php连接mysql的线程就是Id为349那行,如果读者自己做测试,应该 知道这个Id=349在你的测试环境里是另外一个值,我们把这个值和网页里输出的mysql_thread_id($conn)做做比较,对!他们是一样 的。接下来最重要的是观察Command列和Time列,Command = Sleep,表明什么?表明我们mysql_pconnect连接后就一直在sleep,Time字段就告诉我们,这个线程Sleep了多久,那么 Sleep了多久这个线程才能作废呢?那就是wait_timeout或者interactive_timeout要做的工作了,他们默认的值都是8小 时,天啊,太久了,所以如果说web服务器关掉KeepAlive支持,那个这个processlist很容易就被撑爆,就爆出那个Too many connections的错误了,max_connectiosns配置得再多也没用。为了观察这两个参数,我们可以在mysql配置文件my.cnf里 设置这两个值,找到[mysqld]节点,在里面设置多两行

interactive_timeout = 60
wait_timeout = 30
配置完后,重启mysql,shell登录mysql,这时候show processlist可以发现只有当前线程。然后运行那个带有mysql_pconnect的php页面,再回来mysql端show processlist可发现,多了一个Commond为Sleep的线程,不停的show processlist(方向键上+enter键)观察Time列的变化2,5,10..14!,突然那个Sleep线程程被kill掉了,咋回事,还没 到30秒呢,噢!忘了修改一下apache keepalive的参数了,把KeepAliveTimeOut从15改成120(只为观察,才这么改),重启apache.刷新那个页面,好,开始不 停的show processlist,2..5..10..14,15,..20...26....28,29!线程被kill,这次是因为wait_timeout 起了作用,浏览器那边停了30秒,30内如果浏览器刷新,那这个Time又会从0开始计时。这种连接不属于interactive connection(mysql shell登录那种连接就属于interactive connection),所以采用了wait_timeout的值。如果mysql_pconnect的第4个参数改改呢
<?php
$conn = mysql_pconnect('localhost','root','123456',MYSQL_CLIENT_INTERACTIVE);
echo "Mysql线程号:".mysql_thread_id($conn)."<br/>";
echo "Apache进程号:".getmypid();
?>
刷新下页面,mysql那边开始刷show processlist,这回Time > 30也不会被kill,>60才被kill了,说明设置了MYSQL_CLIENT_INTERACTIVE,就会被mysql视为 interactive connection,那么这次php的mysql连接在60秒内未刷新的情况下,何时作废将取决于mysql的interactive_timeout 的配置值。

  总结:php的mysql_pconnect要达到功效,首先必须保证apache是支持keep alive的,其次KeepAliveTimeOut应该设置多久呢,要根据自身站点的访问情况做调整,时间太短,keep alive没啥意义,时间太长,就很可能为一个闲客户端连接牺牲很多服务器资源,毕竟hold住socket监听进程是要消耗cpu内存的.最后 apache的KeepAliveTimeOut配置得和mysql的time out配置要有个平衡点,联系以上的观察,假设mysql_pconnect未带上第4个参数,如果apache的KeepAliveTimeOut设置 的秒数比wait_timeout小,那真正对mysql_pconnect起作用的是apache而不是mysql的配置.这时如果mysql的 wait_timeout偏大,并发量大的情况下,很可能就一堆废弃的connection了,mysql这边如果不及时回收,那就很可能Too many connections了.可以如果KeepAliveTimeOut太大呢,又回到之前的问题,所以貌似Apache.KeepAliveTimeOu 比Mysql.wait_timeout 稍大,或者相等是比较好的方案,这样可以保证keep alive过期后,废弃的mysql连接可以及时被回收.

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

文章不算太长,看看即可,毕竟现在大多数项目 都开始用PDO了,但这样深究的文章还是有值得学习的地方的

MAC的快捷键

MAC的快捷键

尝试用mac的时候,有些都不太习惯。比如切换输入法,是command+space,而在windows下,是ctrl+space。
比如关闭窗口,是ctrl+w,而mac是command+w,退出程序还好。几乎都是command+q。这个倒习惯了

最大的不习惯是在写代码的时候,突然发现。。。没有home键和end键了。以前靠这个来快速定位到首部和尾部的。。。一下子纠结了。找了点资料才发现,原来是fn+left和fn+right可以当成home和end用。所以。。。猜测了一下delete的功能是通过fn+delete实现,结果,果然如此。。。默认的delete其实就是win键盘上的Backspace。。。慢慢慢慢就习惯了很多

找到一篇文章介绍快捷键的,备份一下:http://www.diybl.com/course/6_system/apple/200861/119083.html
在以下的列表中,「opt」为键盘上「Option键」的简称、「cmd」是「Command键」、 「ctrl」则是「Control键」的简称。作者表示所有按键都经过实验,但译者并没有亲自使用过所有的按键组合,所以本文内容仅供参考;如果您要尝试 没有使用过的按键组合,请自己小心。

一、开机时按下……

滑鼠按键 弹出抽取式媒介(2.4f1版以前的Boot ROM可能不包括退出CD片)
opt键 在配备「New World」韧体系统的机种上叫出「Open Firmware」开机系统选择功能。
cmd-opt键 按住这两个键,直到电脑发出二次声响,就会改以Mac OS 9开机。
cmd-x(有时只按住x键) 如果Mac OS 9和Mac OS X在同一个开机用的硬碟区段(partition)上,按这个键会强迫以OS X开机。
cmd-opt-shift-delete 跳过原定的启动磁碟,改以外接磁碟(或光碟机)开机。这个按键的主要作用,其实是强迫电脑不要从预设的启动磁碟读入系统档案,所以会产生从其他磁碟开机的 「副作用」。如果您的Mac是配备SCSI介面的机种,它会从编号(ID)最高的磁碟机往下搜寻,直到找出可以开机的磁碟区段为止。至於在配备IDE介面 的机种上则不确定它的搜寻顺序。
cmd-opt-shift-delete-# 从指定ID的SCSI磁碟开?#代表SCSI编号)。
cmd-opt-p-r 清除系统参数记忆体(PRAM),必须按住不放,等发出两次响声之后再放开。
cmd-opt-n-v 清除NV RAM,类似在Open Firmware中做「重置全部」(reset-all)的动作。
cmd-opt-o-f 开机时进入open firmware。
cmd-opt-t-v 强制Quadra AV机种使用外接电视机当作显示器。
cmd-opt-x-o 以唯读记忆体中所烧录的系统软体开机(仅适用於Mac Classic机种)。
cmd-opt-a-v 强制电脑辨识苹果AV显示器。
c 使用光碟开机。如果原先设定由OS X开机,但光碟机里没有放置开机光碟,则可能会改由OS 9开机。
d 强制以内建磁碟机开机。
n 按住n键直到萤幕上出现Mac标志,电脑会尝试透过BOOTP或TFTP以网路伺服器开机。
r 强制PowerBook重置萤幕设定。
t 强制配备FireWire介面的机种进入外接磁碟模式(FireWire Target Disk mode)。
shift 关闭所有延伸功能(OS 9或OS X之下的Classic环境)。
shift 关闭登入项目,同时也会关闭所有不必要的程式核心(kernel)延伸功能(也就是所谓安全开机模式,仅适用OS X 10.1.3或更新的系统版本)。
cmd 开机时关闭虚拟记忆体(Virtual Memory,仅适用OS 9或OS X之下的Classic环境)。
空白键 开机时启动延伸功能管理程式(OS 9或OS X之下的Classic环境)。
cmd-v 开机过程中显示控制台讯息(仅适用OS X)。
cmd-s 开机后进入单一使用者模式(仅适用OS X)。
cmd-opt-c-i 先将系统时钟设定为日期1989年9月20日,然后以这个按键组合开机,就可以看到萤幕上显示特殊的系统小秘密(仅适用於Mac IIci机种)。
cmd-opt-f-x 先将系统时钟设定为日期1990年3月19日,然后以这个按键组合开机,就可以看到萤幕上显示特殊的系统小秘密(仅适用於Mac IIfx机种)。

二、萤幕上出现小Mac笑脸时按下……

空白键 开机时启动延伸功能管理程式(OS 9或OS X之下的Classic环境)。
shift 关闭包括MacsBug(一种程式设计师工具程式)在内的所有延伸功能(OS 9或OS X之下的Classic环境)。
shift-opt 关闭除了MacsBug之外的所有延伸功能(OS 9或OS X之下的Classic环境)。
ctrl 中断开机过程,进入MacsBug除错模式。

三、系统画面出现后按下……

cmd-opt 当OS 9或OS X中的Classic环境连接磁碟机时,可以重建磁碟机的桌面档案。
opt 不要开启任何系统视窗(Mac OS 9)。
shift 在系统档案(Finder)启动时暂时不要开启系统视窗。这些视窗并没有被真的关闭,只要您重新开机,这些视窗都就会照常出现(Mac OS X)。
shift 不要执行任何「启动项目」软体(Mac OS 9)。

四、在系统画面中按下……

按住opt键,再以滑鼠游标
按视窗上的关闭方块 关闭所有的系统视窗(除了弹出式视窗之外);按cmd-opt-w键也可以获得一样的效果。
cmd-shift-opt-w 关闭所有的系统视窗(包括弹出式视窗)。
cmd-右箭头键 在档案视窗以列表模式显示时,开启一个档案夹。
cmd-opt-右箭头键 在档案视窗以列表模式显示时,重复开启档案夹、以及其下所包含的多层档案夹。
cmd-左箭头键 在档案视窗以列表模式显示时,关闭一个档案夹。
cmd-opt-左箭头键 在档案视窗以列表模式显示时,重复关闭档案夹、以及其下所包含的多层档案夹。
cmd-上箭头键 开启上一层档案夹。在Mac OS X中,如果事先并未选定档案夹、而且没有开启任何视窗,这个按键会开启现在使用者的专属目录。
cmd-opt-上箭头键 开启上一层档案夹,并关闭现用档案夹。
cmd-opt-shift-上箭头键 将桌面变成现用视窗,并且选择最上层磁碟机。
cmd-下箭头键 开启选取的项目。在Mac OS X中,如果事先并未选定档案夹、而且没有开启任何视窗,这个按键会开启桌面档案夹。
cmd-opt-下箭头键 开启选取的项目,并关闭现用的档案夹。
opt-滑鼠按键 按条列档案视窗中的小三角形图像时,可以显示或隐藏下层档案夹中的内容。
tab键 选择名称以下一个英文字母开头的档案夹。
shift-tab键 选择名称以上一个英文字母开头的档案夹。
cmd-delete 把选取的项目搬进垃圾桶

五、在系统画面中的「视窗」选单中……

cmd-选取项目 关闭视窗。
cmd-shift-选取项目 将弹出式视窗归位。
cmd-opt-选取项目 展开选取的视窗,并关闭其他所有视窗。
ctrl-选取项目 展开选取的视窗,并隐藏其他视窗的内容。
·ctrl-opt-选取项目 启动选取视窗,并展开所有的其他视窗。

六、系统启动完毕之后……

在有电源按钮的机种上
电源按钮 在萤幕上显示包括「关机」、「睡眠」、以及「重新开机」按钮的对话框(请参阅下一节)。
cmd-ctrl-电源按钮 强制重新开机。这种方式非必要不建议使用,因为有可能损坏磁碟上的资料内容。
ctrl-cmd-opt-电源按钮 快速关机。
cmd- 电源按钮 启动程式除错软体(如果已事先安装的话)。较早期的Mac(例如Mac II时代的机器)需要先安装由Paul Mercer所写的除错延伸功能(debugger init)来使用这个功能;不过这个功能在配备68040处理器的Mac机种上,已经成为系统韧体内容的一部份。
cmd-opt-电源按钮 让后期型式的PowerBook和桌上型Mac进入睡眠状态。
cmd-opt-ctrl-电源按钮 重新设定电源管理程式(Power Manager;仅适用PowerBook 500系列)。
shift-fn-ctrl-电源按钮 重新设定电源管理程式(Power Manager;仅适用PowerBook G3与G4系列)。

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

以上内容不可全信,因为到lion的时候,很多快捷键都换掉了。一些界面、常见操作都和雪豹不太一样了啦

最后再附上一年所谓的隐藏快捷键:http://jaylan.anyday.com.tw/?p=212

以下是For Mac OSX用的快速鍵
1. Apple Logo 
快速鍵 : Option-Shift-K

2. Zero Brightness~馬上把螢幕亮度切至無亮度
快速鍵 : Control-Shift-Eject
Note. Instantly turn your display off without logging out from the system.

3. Adjust Volume Bar~微調音量,可將原本一格的音量調整再細分為四等份,作四分之一的微調
快速鍵 : Option-Shift-F4 / Option-Shift-F5
Note. Increase/decrease your volume bar by a quarter each time it’s invoked. This is particularly useful for fine tuning Mac with bombastic sound system.

4. Double Buffer~Control-K可剪下游標後方的整段文字(不需反白),Control-Y可將用Control-K剪下的文字貼上,類似Copy & Paste的功能
快速鍵 : Control-K (Kill) and Control-Y (Yank)
Note. Like, Cut and Paste, combination of Kill and Yank can help you organize your text easily. Cut followed by Kill grants you double text buffer.

5. Home and End~將游標移至文章的首字及尾字
快速鍵 : Control-A (Home) and Control-E (End)

Note. This is pretty much the substitution for Windows button HOME and END. Pressing Command-← or Command-→ performs the same action.

6. Delete and Backspace~就是Delete 跟 Backspace的快速鍵,這個Delete(Control-D)的快速鍵筆使用筆電時可按的fn+delete好按得多
快速鍵 : Control-D (Delete) and Control-H (Backspace)
Note. In Windows, we’ve got two buttons for this : DEL and BACKSPACE. You can use Fn-Delete to perform forward deletion while the button Delete acts as Backspace.

7. Related Messages~在Mail裡使用的快速鍵~方便回信時用
快速鍵 : Command-Shift-K
Note. Selects all related messages in the same mailbox.

8. Open Address in New Tab~在新分頁中開啟網址
快速鍵 : Command-Enter
Note. While highlighting address bar, pressing this shortcut will bring up new tab of that selected address.

9. Google Search Box~在Safari與Firefox瀏覽器中可將游標快速移至搜尋bar中(按Command-L是前往網址列)
快速鍵 : Command-Option-F
Note. Quickly jumps your cursor to Google Search Box. Saving your mouse click as well as your precious ticks of seconds.

10. Zoom~放大或縮小螢幕的功能(也可利用Control+滑鼠滾輪,但需要在偏好設定中開啟此功能)
快速鍵 : Command-Option-[+] (Zoom In) or Command-Option-[-] (Zoom Out)
Note. Zoom in/out your display; making tiny objects looks huge.

轉載原文於此:Unveiling 10 Hidden OS X Shortcuts
-----EOF-----
其实第一个输入苹果的快捷键真的挺好玩。。。