Objective-C中的一些特殊的数据类型

Apr302008
0 评论

在Objective-C中,有一些我们之前并不熟悉但是经常见到的数据类型,比如id、nil、Nil、SEL等等。在很多文章里,我们都见过这些数据类型的介绍,但是都没有说的太清楚。

 

这篇文章从最底层的定义开始,介绍一下这些类型到底是怎么定义的,这会帮助我们更加深入地了解Objective-C。

 

原文作者为Greg Miller,文章地址在:

http://unixjunkie.blogspot.com/2006/02/nil-and-nil.html

 

Objective-C中有一些很有趣的数据类型经常会被错误地理解。他们中的大多数都可以在/usr/include/objc/objc.h或者这个目录中的其他头文件中找到。下面是从objc.h中摘录的一段,定义了一些数据类型:

 

  1. // objc.h
  2.  
  3. typedef struct objc_class *Class;
  4.  
  5. typedef struct objc_object {
  6.   Class isa;
  7. } *id;
  8.  
  9. typedef struct objc_selector  *SEL;
  10. typedef id      (*IMP)(idSEL, …);
  11. typedef signed char   BOOL;
  12.  
  13. #define YES             (BOOL)1
  14. #define NO              (BOOL)0
  15.  
  16. #ifndef Nil
  17. #define Nil 0   /* id of Nil class */
  18. #endif
  19.  
  20. #ifndef nil
  21. #define nil 0   /* id of Nil instance */
  22. #endif

 

我们在这里解释一下它们的细节:

 

id

 

id和void *并非完全一样。在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id是一个指针,所以你在使用id的时候不需要加星号。比如id foo=nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id *foo=nil则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向NSObject的一个子类。

 

nil

 

nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。

 

Nil

 

首字母大写的Nil和nil有一点不一样,Nil定义一个指向空的类(是Class,而不是对象)。

 

SEL

 

这个很有趣。SEL是“selector”的一个类型,表示一个方法的名字。比如以下方法:

 

-[Foo count] 和 -[Bar count] 使用同一个selector,它们的selector叫做count

 

在上面的头文件里我们看到,SEL是指向 struct objc_selector的指针,但是objc_selector是什么呢?那么实际上,你使用GNU Objective-C的运行时间库和NeXT Objective-C的运行运行时间库(Mac OS X使用NeXT的运行时间库)时,它们的定义是不一样的。实际上Mac OSX仅仅将SEL映射为C字符串。比如,我们定义一个Foo的类,这个类带有一个- (int) blah方法,那么以下代码:

 

  1. NSLog (@"SEL=%s"@selector(blah));

 

 

会输出为 SEL=blah。

 

说白了SEL就是返回方法名。

 

IMP

 

从上面的头文件中我们可以看到,IMP定义为 id (*IMP) (idSEL, …)。这样说来, IMP是一个指向函数的指针,这个被指向的函数包括id(“self”指针),调用的SEL(方法名),再加上一些其他参数。

 

说白了IMP就是实现方法。

 

Method

 

在objc/objc-class.h中定义了叫做Method的类型,是这样定义的:

 

  1. typedef struct objc_method *Method;
  2. struct objc_method {
  3.   SEL method_name;
  4.   char *method_types;
  5.   IMP method_imp;
  6. };

 

 

 

这个定义看上去包括了我们上面说过的其他类型。也就是说,Method(我们常说的方法)表示一种类型,这种类型与selector和实现(implementation)相关。

 

Class

 

从上文的定义看,Class(类)被定义为一个指向struct objc_class的指针,在objc/objc-class.h中它是这么定义的:

 

  1. struct objc_class {
  2.   struct objc_class *isa;
  3.   struct objc_class *super_class;
  4.   const char *name;
  5.   long version;
  6.   long info;
  7.   long instance_size;
  8.   struct objc_ivar_list *ivars;
  9.   struct objc_method_list **methodLists;
  10.   struct objc_cache *cache;
  11.   struct objc_protocol_list *protocols;
  12. };

 

Emacs23 on Arch

Apr272008
0 评论

首个kernel driver

0 评论

所使用的命令:make -C /usr/src/linux-* SUBDIRS=$PWD modules
查看那消息:dmesg | tail -5

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{

printk(KERN_ALERT "Hello, world\n");

return 0;

}
static void hello_exit(void)
{

printk(KERN_ALERT "Goodbye, cruel world\n");

}
module_init(hello_init);
module_exit(hello_exit);

水木里发的一个帖子

Apr202008
0 评论

发信人: jjgod (while(!asleep()) sheep++;), 信区: Apple
标 题: Re: textMate的pyMate设置
发信站: 水木社区 (Sun Apr 20 11:44:35 2008), 站内

PyMate 的判断方式:

def executable; @hashbang || ENV['TM_PYTHON'] || 'python' end

(http://github.com/kballard/textmate-bundles/tree/
b8f5019654079eb2b9a07024bb5a57ce78cf7e0b/Bundles/
Python.tmbundle/Support/PyMate/pymate.rb)

所以,你有三种办法:

1. 修改 TextMate 的搜索路径,把你自己装的 python 所在路径提前,
See Also: http://macromates.com/textmate/manual/shell_commands

2. 在 #! 后面指定带版本号的 python,比如 macports 安装的 python
一般叫 python2.4 或者 python2.5。

3. 用 TM_PYTHON 变量来覆盖。

其实简单的 Google 'PyMate' 就能找到你这个问题的答案,所以显然
你根本没有仔细找过:
http://lists.macromates.com/pipermail/textmate/2007-March/018168.html
【 在 karpar (karpar) 的大作中提到: 】
: 请问怎么改变pyMate里面调用的python版本?
: tiger里默认有个python2.3,但是我自己装了一个python2.5,
: 每次我直接在textMate里运行pyMate就是使用系统内置的python,
: ...................

--

※ 来源:·水木社区 newsmth.net·[FROM: 221.219.14.*]

pyMate漂亮得不得了!!!

Apr192008
0 评论

不学点python就快成土人了

Apr082008
0 评论

How to win friends and influence people

Apr072008
0 评论

Here’s a summary of Dale Carnegie’s outstanding book (with the same title as this post), which has been a top-selling communications book for the past 70 years. These techniques don’t sound terribly original or mind-blowing. Instead, they are elegant and straightforward, which makes them easy to remember. I’ll also tell you which principles I think are the most important.

Fundamental techniques in handling people

  1. Don’t criticize, condemn or complain.
  2. Give honest and sincere appreciation.
  3. Arouse in the other person an eager want.

These ideas lay the groundwork for everything else. The overall focuses of the entire book are:

  • Encourage the positive things people do, instead of disparaging the negative.
  • Talk about what other people want, instead of what you want.

6 ways to make people like you

  1. Become genuinely interested in other people.
  2. Smile.
  3. Remember that a person’s name is to that person the sweetest and most important sound in any language.
  4. Be a good listener. Encourage others to talk about themselves.
  5. Talk in terms of the other person’s interests.
  6. Make the other person feel important–and do it sincerely.

The most important points from this group are 1 (be interested in others) and 5 (talk in terms of their interests).

12 ways to win people to your way of thinking

  1. The only way to get the best of an argument is to avoid it.
  2. Show respect for the other person’s opinions. Never say, “You’re wrong.”
  3. If you are wrong, admit it quickly and emphatically.
  4. Begin in a friendly way.
  5. Get the other person saying “yes, yes” immediately.
  6. Let the other person do a great deal of the talking.
  7. Let the other person feel that the idea is his or hers.
  8. Try honestly to see things from the other person’s point of view.
  9. Be sympathetic with the other person’s ideas and desires.
  10. Appeal to the nobler motives.
  11. Dramatize your ideas.
  12. Throw down a challenge.

Important points here are 3 (admit your mistakes), 4 (begin friendly), and 8 (step in their shoes).

9 ways to change people without giving offense or arousing resentment

  1. Begin with praise and honest appreciation.
  2. Call attention to other’s mistakes indirectly.
  3. Talk about your own mistakes before criticizing the other person.
  4. Ask questions instead of giving direct orders.
  5. Let the other person save face.
  6. Praise the slightest improvement and praise every improvement. Be “hearty in your approbation and lavish in your praise.”
  7. Give the other person a fine reputation to live up to.
  8. Use encouragement. Make the fault seem easy to correct.
  9. Make the other person happy about doing the thing you suggest.

The first 5 points here are the most important, although all of these ones are important.

Conclusion

Best of luck to you in applying these principles to your own life!

Gcc Compiler Architecture

Apr042008
0 评论




深入问题本身

Apr022008
0 评论

很 多做research的朋友喜欢top-down approach,包括我自己。就是说,在开始一个topic的时候,在第一时间就设定了大体的formulation,model又或者 methodology。至于选择哪种设定,往往取决于研究者本身的偏好,知识背景,或者对问题的第一反应。

接下来的事情就顺理成章 了,推导数学模型和相关公式以及算法步骤,然后设计程序进行实验。当然少不了再拉上几个相关工作,比较一番。如果自己的设计很幸运地有明显的 improvement,于是非常满意,开始写paper(在不少情况下,paper的理论部分甚至提前写好了)。可是,如果不work呢? 通常大家会采取下面一些方法中的一种或者几种:

  • 观察实验结果,猜想几个不work的原因,然后回头局部调整模型和算法;
  • 换一下数据集,看看能不能work
  • 祭起“终极法宝”——调参数,人工修改或者写脚本遍历,直到找到一组work的参数为止。不过,那些作为“绿叶”用的参照算法,通常是没有这种待遇了。

无论如何,你总算把实验搞定了。但是,为什么work呢?除了几条曲线,你总得找一些“让人信服”的理由。在我所在的领域,有一些理由几乎是万能的,因而普遍出现在paper里面:

  • 以前的算法,不考虑某某因素,而这个因素是很重要的,我的算法考虑了,所以效果更好
  • 以前的算法,把某些因素分开考虑,但是它们实际上是相关联了,我的算法把它们结合在一起,体现了这种关联关系,所以更好
  • 以前的算法是线性的,但是这个问题本身明显是非线性的,我这里用了非线性的方法,所以更符合实际。为了进一步解释清楚,还画出一些二维或者三维的toy samples,显示出线性和非线性有“多么巨大的差别”
  • 以前的方法用的是参数化模型(比如高斯分布),而现实世界明显不是这样子,我这里采用非参数化模型,能更准确地逼近实际分布
  • 主流方法大都采用某某算法完成某个步骤,或者某某特征来描述某个方面,其实这个算法或者特征在这里不太适合,我换了一个更适合的或者更“先进”的。

还 有很多,不一而足。总体来说,就是增加了某方面的复杂性,推广了模型,或者把某些部分变得更加时髦,数学更深。正因为多了东西可以调节,只要花上足够时间 去设定参数,还是有很大机会能找到一组能得到improvement的参数的。可是,这种improvement是不是真正有意义呢?是不是足够 significant,以至于所增加的复杂性是值得的呢?

我们的世界总是无限复杂的,和无数的因素相关,这些因素又总是有某种联系。我们的前辈们留给我们的最好的方法,就是从问题中分离出最关键的要素,和最重要的关系,而非不断地增加价值不大的因素,建立意义不大的联系。

我 并不是一个完全拒绝复杂,但是我个人觉得对复杂性的增长应该慎重。每增加一个要素,都应该是基于对问题的深入分析,而不是先入为主的设想和冠冕堂皇的理 由。这不完全是知识能力的问题,更多的是一种治学态度——是不是愿意安心下来对问题本身进行深入细致的解剖,找出问题本身的关键所在,而不是脱离问题预先 构想某种“漂亮”模型或者“巧妙”方法,并且通过上面所述的种种方法推销出去。

研究是一种创新的过程,广拓思路是必须的。但是真正有价 值的novelty应该是建立在对问题本身的深入理解,确实发现了别人忽略的关键因素,或者主流算法的真正不足,并且创造性地提出解决方法。这需要持之以 恒的努力。真正经得起考验的学术价值,源于解决还没有被解决的问题,而不是使用了某种所谓别人没用过的“新颖”方法来解决本来已经解决的问题,又或者给模 型加入某个要素来取得非实质性的性能改进。

上面所说的这些问题,几乎都发生在我的身上。而汤老师的很多建议,其实正是指出了这些问题, 却没有被我认真思考,反而总是以为只要理论做得高深,模型设计得精巧,就是好的工作。来了MIT之后,更多地阅读一些有历史价值的文章(现在看CVPR反 而比较少了),接触一些更加solid的工作。许多有重要贡献的工作,往往未必有很炫的方法和模型,但是,其对于问题本身的深入发掘和洞察却令我惭愧。

要做真正的学问,首先要戒除浮躁。

http://dahua.spaces.live.com/blog/cns!28AF4251DF30CA42!2310.entry#comment

编译了一个上午,终于见到了,Qtopia

0 评论

关于Qt和Qtopia

Apr012008
0 评论

Qt是一个跨平台的开发环境。Qt/E用于嵌入式平台下的GUI程序的开发。我想应该可以这么理解,Qt的库比较丰富,比较大,所以不适合嵌入式的特点,所以才有了一个 Qt/E.Qt/E也可以在x86的Linux下进行开发,其程序的运行结果可以通过qvfb来显示。这样是为了节省嵌入式开发的时间,不用每次都进行交 叉编译和烧到终端中去测试。暂时用得Qt/E是低版本的,他的Makefile用tmake工具自动生成。所以也必须安装tmake。 那Qtopia有时用来干什么的呢?这个问题困扰我好几天的,一直迷迷糊糊的也没怎么搞清楚。因为开始一直把Qtopia理解成一个开发工具,所以怎么想 也想不明白。现在的理解是他其实是一个软件集,也可以理解成一个嵌入式的窗口系统。类似于x86上的X11。他只是提供了一个桌面环境。而Qtopia是 建立在Qt/E的库之上的,所以交叉编译Qtopia之前要交叉编译Qt/E。 所以为了进行嵌入式的软件开发就要对上面的软件进行x86上的编译和交叉编译。

数学符号及其发音

0 评论

这里这里

序号大写小写英文注音国际音标注中文注音意义
1Ααalphaa:lf阿尔法角度;系数
2Ββbetabet贝塔磁通系数;角度;系数
3Γγgammaga:m伽马电导系数(小写)
4Δδdeltadelt德尔塔变动;密度;屈光度
5Εεepsilonep`silon伊普西龙对数之基数
6Ζζzetazat截塔系数;方位角;阻抗;相对粘度;子序数
7Ηηetaeit艾塔磁滞系数;效率(小写)
8Θθthetθit西塔温度;相位角
9Ιιiotaiot约塔微小,一点儿
10Κκkappakap卡帕介质常数
11Λλlambdalambd兰布达波长(小写);体积
12Μμmumju磁导系数;微(千分之一);放大因数(小写)
13Ννnunju磁阻系数
14Ξξxiksi克西 
15Οοomicronomik`ron奥密克戎 
16Ππpipai圆周率=圆周÷直径=3.1416
17Ρρrhorou电阻系数(小写)
18Σσsigma`sigma西格马总和(大写),表面密度;跨导(小写)
19Ττtautau时间常数
20Υυupsilonjup`silon宇普西龙位移
21Φφphifai佛爱磁通;角
22Χχchiphai西 
23Ψψpsipsai普西角速;介质电通量(静电力线);角
24Ωωomegao`miga欧米伽欧姆(大写);角速(小写);

1 Α α alpha a:lf 阿尔法 角度;系数
2 Β β beta bet 贝塔 磁通系数;角度;系数
3 Γ γ gamma ga:m 伽马 电导系数(小写)
4 Δ δ delta delt 德尔塔 变动;密度;屈光度
5 Ε ε epsilon ep`silon 伊普西龙 对数之基数
6 Ζ ζ zeta zat 截塔 系数;方位角;阻抗;相对粘度;原子序数
7 Η η eta eit 艾塔 磁滞系数;效率(小写)
8 Θ θ thet θit 西塔 温度;相位角
9 Ι ι iot aiot 约塔 微小,一点儿
10 Κ κ kappa kap 卡帕 介质常数
11 ∧ λ lambda lambd 兰布达 波长(小写);体积
12 Μ μ mu mju 缪 磁导系数;微(千分之一);放大因数(小写)
13 Ν ν nu nju 纽 磁阻系数
14 Ξ ξ xi ksi 克西  
15 Ο ο omicron omik`ron 奥密克戎  
16 ∏ π pi pai 派 圆周率=圆周÷直径=3.14159 26535 89793
17 Ρ ρ rho rou 肉 电阻系数(小写)
18 ∑ σ sigma `sigma 西格马 总和(大写),表面密度;跨导(小写)
19 Τ τ tau tau 套 时间常数
20 Υ υ upsilon jup`silon 宇普西龙 位移
21 Φ φ phi fai 佛爱 磁通;角
22 Χ χ chi phai 西
23 Ψ ψ psi psai 普西 角速;介质电通量(静电力线);角
24 Ω ω omega o`miga 欧米伽 欧姆(大写);角速(小写);角