存档

2009年6月 的存档

zt Objective C 入门诗,iPhone程序结构

2009年6月28日 2 条评论

Objective C 快速入门诗

C没有类
这让人很疲惫
对象的说法很时髦
不就是继承封装组合人人会
右走是C++,这个大众都熟悉它
左走就是objective-c,躲在僻静僻静的麦金塔
本是同根生的C
如何高举面向对象的大旗
求同存异标新立异且听一一细分清

对象的C
是不同的C
类的处理与众不同重点要区分

不重复是我的口头禅
任何时候我只说一次告诉你我的地盘
    [@begincommand] | @end就是我的指示
        @interface classname  声明类
        @implementation classname  实现类
        @protocol interfacename  声明接口
就是这么简单,你的一定要明白

我先声明对成员变量和方法的关系有远近
    成员变量大大括在我的怀
        关系远近 public / protected / private 来区分
        若不声明全默默受着保护
        静态成员变量请不要放在此
    成员方法我不太爱
        前面拴着绳子置于类的变量列表外
            减号就是普通函数
            加号就是静态函数莫怪
        函数的声明有点怪
            我要一眼叫出名,包括函数名和参数名
            其余的类型括起来,我有空再来慢慢看
            函数名和参数名之间用:分隔开
        多个参数的函数那就是更怪
            逗号其实不是我的爱
            后续的每个参数分隔用空白
            每个参数形式如 标签:(参数类型)参数名
            其实只要把函数名看作是第一个参数标签
            你就能领悟其中的奥妙并在调用时喜爱
        成员方法太多我才懒得区分亲疏远近
            它们一律都是公之于众要好好的干活
            谁若不服胆敢出头犯上
            就踢出头文件打入冷宫永世不能露面试试看
        所有的成员方法都是虚函数
            改则重载,不改就继承
            不用任何标记请放心大胆随便使用

对象的类,在继承层次上考虑才显得重要
    所有的类最终都继承于NSObject
        因为它给你创建自己生命的方法

    不继承于NSObject的只能是接口protocol
        它没有成员变量只有方法
        它只有声明不用实现
        这点和java很相似

当然类还有一些绝活可以让你开开眼
    可以动态的扩充一个类 而不总是用继承
        @interface CClassA(Category)|@end
        @implementation CClassA (Category)|@end
        源代码外包含该 类的头文件
        就可以使用该Category中的方法

也可以动态的替换一个类
    但是只限于用继承类来替换基类功能
        [CInheritClass poseAsClass: [CBaseClass class]];
    声明之后用基类创建的对象实际上行为都是继承类

所以一个类的完整声明如下:
    @interface CClassA(Category): CBaseClass<IA,IB...>
    类别,基类,接口一一具全
    加上静态 虚函数
    所有特性和C++均可对应
    再加上所独有的特性
    这一特性编译类语言很少有
    设计得当完全可以实现动态调用dll切换功能

类的定义和使用,也有点怪
    想想看一个对象的生命周期,该是如何办
        创建很是别扭
            这样就定义了一个类对象,
            CClassName* pA = [[CClassName alloc] init];
            能且只能返回对象指针
    释放分为两种
        自动释放声明后 [pA autorelease]; 以后可以不管
        否则就必须配对 [pA release];
    注意类的构造函数init可以捕获
    但是析构函数却没有这点很让人意外

    使用类也有多种情况
        调用成员方法用中括号     int nRtn = [pA method:param1];
        而静态成员方法不需要对象 int nRtn = [CClassName method];
        调用成员变量还是C格式    pA->m_nCount = 1;

    所有的类,都可以对应一个id类型
        用来引用一个对象               id     cur = sq;
        或者用来引用一个对象指定的接口 id<IA> cur = sq;
        然后就可以调用该对象的方法和指定接口方法

Iphone APP程序结构

分类: iPhone 标签: , ,

TopCoder竞赛:C++, STL 用法快速入门

2009年6月27日 没有评论

2002年就开始参加TopCoder的算法竞赛。当时一周举行两次,每个房间12个人参加比赛,前三名都有现金奖励。有空参加一下,练练算法,给头脑保鲜。

下面总结了一些题目中常用的STL库的用法。

 
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <iostream>
 
using namespace std;
 
//递归
int GetN(int n)
{
	if (n==1) return 1;
	else return GetN(n-1);
}
 
void TestSTL_main( int argc, char* argv[] )
//void main( int argc, char* argv[] )
{
	/******** STL **********/
 
	//string的用法
	{
		string s = "mmmmm";
		string s2("ss22");
		s2.insert(2,"kkkkk"); //把"kkkkk"插到s2的第2个位置之前(位置从0开始)
		s2+=s+"44444"+'c';
		const char *pc = s.c_str();//把string转成C-style的string,以\0终了
		const char *ptr1 = s.data();;//把string转成字符串
		if (s2[2] == 'k') s2[2]='C';
		s+="jkl";
		s+='m';
		s.push_back('\n'); //把'\n'(换行符)放在s的最后一个位置
		reverse(s.begin(), s.end()); //反转
		basic_string <char>::iterator str_Iter; //遍历
		str_Iter = s.begin();
	}
 
	//vector的用法
	{
		vector<int> v;
		v.push_back(8); //向v中插入元素,元素的值是8
		int iLen = (int)v.size();
		for(int i=0;i<iLen;i++)
		{
			int k = v[0]; //k==8
		}
	}
 
	//map的用法
	{
		map<int, int> mp;
		for(int i=0;i<3;i++)
		{
			mp[i]=i*2; //通过[第一个元素]来访问第二个元素
		}
 
		int total = 100;
		map<int, int>::iterator it = mp.begin();
		for(;it!=mp.end();it++) //遍历mp
		{
			total+=it->second; //通过iterator it来访问第二个元素
		}
		cout<<"total="<<total<<endl;
	}
 
	//算法
	int n = GetN(5); //递归n!=n*(n-1)*(n-2)*…*1
	int aa=10,bb=15;
	int maxi = max(aa,bb); //最大值
	int mini = min(aa,bb); //最小值
	int absi = abs(-12); //绝对值
	vector<string> v;
	v.push_back("hello");
	v.push_back("123");
	v.push_back("no");
	sort(v.begin(),v.end()); //按照字母顺序,把v里面的元素排序
	int savei;
	sscanf(v[0].c_str(), "%d", &savei); //把字符串“123”转换成数字123
	cout<<"savei="<<savei<<endl;
	char buf[100];
	sprintf(buf,"v[1]=%d",savei); //把内容打印进字符串
	cout<<"buf="<<buf<<endl;
 
}

分类: 我的开源 标签: , ,

发布免费开源HTTPS代理:G-Proxy

2009年6月16日 16 条评论

Google App Engine Java做了G-Proxy,一个开源免费的HTTPS代理服务器,使用的正是新鲜出炉的Java版Google App Engine。从97年开始使用Java到现在也有12年了,从未感觉Java如此强大。Google的这一步很英明,Sun倒下了,Google接过了接力棒,云端Java会让Java从企业级真正走向web2.0级。任何一个熟悉企业级Java开发的人都可以在1天之内开始云计算的开发,Google一统江湖的日子不远了。

G-Proxy具有的功能:

  • 完整的代理服务器功能;
  • 自动把获取的HTML文件中的图片和链接,加上代理服务器的网址;
  • HTTPS功能,这样可以保护您的数据不被任何人看到;
  • 代理服务器不保存任何访问记录,充分保护您的隐私;
  • 暂时不支持中文编码;

从 C 到 Objective C 入门2

2009年6月14日 没有评论

Objective C入门中我们了解了如何定义类,类的实现,以及调用类函数的方式。现在再来看一看关于类的高级概念。

id,动态绑定

#import <stdio.h>
#import "Bank.h"
 
int main( int argc, const char *argv[] ) {
    Bank *bank1= [[Bank alloc] init];
    Bank *bank2= [[Bank alloc] init];
    id b; //可以把任何对象赋值给b
 
    [bank1 addAmount: 1];
    b = bank1;
    [b print]; //调用bank1的print函数
    b = bank2;
    [b print]; //调用bank2的print函数
 
    // true
    if ( [bank1 isMemberOfClass: [Bank class]] == YES ) {
        printf( "bank1是Bank类的一个对象\n" );
    }
 
    // true
    if ( [bank1 respondsToSelector: @selector( addAmount: )] == YES ) {
        printf( "bank1响应addAmount:函数\n" );
    }
 
    // free memory
    [bank1 free];
    [b free];
 
    return 0;
}

id类型可以接受各种类型的对象,然后调用对应的函数。调用函数时,Objective C在编译的时候并不会检查该对象是否有该函数,需要开发人员自己确保调用的有效。另外Objective C也提供功能,在运行时检查某对象是否具有某函数。

类的高级使用:继承、类别、扮演、协议

////////////// BankMath.h
#import "Bank.h"
@interface Bank(Math) //为类Bank定义一个类别Math
-(void) add: (int) b; //Math中的函数add
-(void) sub: (int) b; //Math中的函数sub
@end
 
@protocol Auditable //定义一个协议
-(void) audit; //其中包括一个函数audit的定义
@end
 
@interface ExBank: Bank<Auditable> //ExBank类继承Bank,同时实现Auditable协议
-(void) print; //定义一个新的函数print,覆盖父类Bank中的print函数
@end
 
////////////// 实现部分 BankMath.m
#import "BankMath.h"
@implementation Bank (Math) //Bank的类别Math的实现部分
-(void) add: (int) f {
    amount ++;
}
-(void) sub: (int) f {
    amount --;
}
@end
 
@implementation ExBank
// 实现新定义的函数print
-(void) print {
    printf("ExBank amount=%i", amount);
}
// 实现协议中包含的函数audit
-(void) audit {
    printf("audit: amount=%i", amount);
}
@end
 
////////////// main.m
#import  <stdio.h>
#import "Bank.h"
 
int main( int argc, const char *argv[] ) {
    Bank *bank = [[Bank alloc] init];
     [bank add: 10]; //直接使用Bank对象类别Math中的函数
     [bank sub: 5]; //直接使用Bank对象类别Math中的函数
     [bank print];
 
     [ExBank poseAsClass: [Bank class]]; //使用ExBank来扮演Bank
     Bank *bank2 = [[Bank alloc] init]; //对Bank的调用,就是对ExBank的调用
     [bank2 print]; //调用ExBank的print函数
    [bank2 audit]; //调用ExBank的audit函数
 
    id auditable = bank2; //为auditable赋值bank2
    [auditable audit]; //调用bank2的函数audit
    //[auditable print]; //不行,因为Auditable类型中没有该函数
 
     [bank free]; // 释放对象
    [bank2 free]; // 释放对象
 
    return 0;
}
  • 类定义@interface,相当于Java和C++中的class
  • 继承,与Java继承类似,没有C++中继承的那么多繁琐的访问范围差别
  • 类别(categories),是用来扩展类的好办法,比继承更方便,因为你不需要有源代码就可以扩充某个类。
  • 扮演(Posting),可以在运行时指定用某个类A来替代另一个类B,这样此后所有对B的调用都是对A的调用。
  • 协议(@protocol),相当于Java的接口,或C++的abstract class。定义在其中的函数只有定义而不需要实现。使用协议的时候,一个类可以实现多个协议,多个协议之间用逗号分隔列出。
分类: iPhone 标签: , ,

Javascript在线调试工具推荐:Google Code Playground

2009年6月14日 1 条评论

Google code playground

Google Code Playground提供了一个在线版的Javascript、Ajax的编辑、开发和调试环境,而且可以方便的访问相应的文档。

内置了很多常用的Google API的示例,

  • Language API
  • Blogger API
  • Calendar API
  • Earth API
  • Feeds API
  • Friend Connect
  • Javascript
  • Maps API
  • Search API
  • Visualization API
  • YouTube API

包括几个Ajax库

  • jQuery
  • jQueryUI
  • MooTools
  • Dojo
  • Prototype Scriptaculous
分类: Web2.0 标签: , ,

《Google API大全》,近7日销售排名第17

2009年6月13日 没有评论

google api bible ranking No.17 at china-pub上网第一周,《Google API大全》已经名列中国互动出版网计算机类的近7日销售排行榜第17位。

you rule
 Shameless self-promotion

中国互动出版网(China-pub)成立于2000年,是中国最早的一批网络书店,最早主营计算机图书,我买计算机方面图书的首选网络书店。现已扩展到通信、经济管理、数理化、各类专业技术、教育等领域。

从 C 到 Objective C 入门1

2009年6月10日 没有评论

进军iPhone开发,最大的难点之一就是怪异的Objective C语法了。不过,了解之后才发现,原来仅仅是形式上与C++、Java有差异,属于换汤不换药。如果有C语言基础,又用过C++、Java,2天之内掌握Objective C,没有问题,至少看例子程序会感觉顺眼很多。

Objective C脱胎于C语言,苹果版的开发编译环境就是大名鼎鼎的Xcode,其中的Cocoa就是Objective C库函数。

与C语言一致的部分

int main( int argc, const char *argv[] ) {
    printf( "hello worldn" );
    return 0;
}
  • 数据类型,表达式,各种运算符
  • 循环:for, while, do while, break, continue
  • 分支:if, else, switch

类定义@interface

#import <Foundation/NSObject.h>
 
@interface Bank: NSObject {
    NSString *name;
    int amount;
}
 
-(void) print;
-(void) addAmount: (int) a;
-(int) amount;
-(Bank *) initWithName: (NSString *) n andAmount: (int) a;
 
@end
  • 写在Bank.h中
  • #import是引入库函数
  • @interface是表明定义了一个类,冒号后面是父类类型
  • 两个大括号之间的部分就是类的成员变量,只有类函数能够直接访问
  • - 表明要定义一个类对象级别的函数;如果是+,表明要定义类级别的函数
  • 返回值与参数的类型放在()内
  • 函数定义中的: 表明后面会跟一个参数
  • 如果函数有多个参数,要写多个xxx:
  • 类的函数定义结束后,使用@end关闭

类实现@implementation

#import "Bank.h"
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
 
@implementation Bank
-(void) print {
    printf("Total amount is %i", amount);
}
 
-(void) addAmount: (int) a {
    amount += a;
}
 
-(int) amount{
    return amount;
}
 
-(Bank *) initWithName: (NSString *) n andAmount: (int) a{
    self = [super init];
    name = n;
    amount = a;
    return self;
}
 
@end
  • 写在Bank.m
  • @implementation定义函数的具体内容,后面接着类名
  • 函数头按照定义来写
  • 最后用@end来结束所有函数体

调用写好的类和类函数

#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import "Bank.h"
 
int main( int argc, const char *argv[] ) {
    //创建新对象,使用缺省初始化函数
    Bank *bankDefault = [[Bank alloc] init];
 
   //创建新对象,使用自定义初始化函数
   Bank *bank = [[Bank alloc] initWithName: @"Harry" andAmount: 28];
 
    [bank addAmount: 1];
 
    [bank print];
 
    [bank free]; // 释放对象
   [bankDefault free]; // 释放对象
 
    return 0;
}
  • 调用类函数的时候,首先创建并初始化对象。这里我们使用缺省的init和我们自定义的initWithName来分别初始化一个对象;
  • 使用[]来调用函数,按照次序分别是:对象名,函数名,: 参数值(如果有),函数名第二部分(如果有),:第二参数值(如果有);

参考:

分类: iPhone 标签: , ,

《Google API大全:编程·开发·实例》6月5日面市

2009年6月2日 2 条评论

算起来,用Google API来开发web系统已经有1年多了。一年前,参加Google开发者大会时的情景还历历在目。各大公司的会议将和讲座参加了很多,但是很少有像参加完Google大会之后这么激动。或许是被Google的创新精神所折服,或许是被Google API的强大威力所感召,不久之后,结合了Google App Engine,Google Ajax Search和Google Gadget的RankRadar Tracking 便诞生了。半年多来,RankRadar系统在Google云计算平台上,顺畅地奔跑着,每天都为用户抓取、保存、展示着数据,轻松应对大数据量的访问。Google平台的强悍可见一斑。

google-api-bible-face使用了Google API这么久,现在终于有机会把自己的经验分享出来,真是一件很荣幸的事情。我与数位Google公司的一线工程师,还有几位活跃在技术社区的开发者一起合著了《Google API大全:编程·开发·实例》这本书。6月5日,Google 2009 年开发者日大会上,将会正式发布。

我写作的章节如下:

  • 第11章 小工具开发——Google Gadgets API
  • 第26章 网络广告整合——Google AdSense API
  • 第35章 让应用支持桌面搜索——Google Desktop Search APIs

本书书如其名,确实很全,囊括了绝大多数的Google API,既提供了对Google API的全面认识,也让读者很容易的结合示例开发出自己的应用。“学习Google API,与Google一起编织互联网!”站在业界领导者的肩膀上,才能更好的专注于自己的核心业务,把网结好,从而为用户创造更多的价值。好的产品,自己会销售!祝愿读者朋友们使用了Google API,都能开辟出自己的一片天地!

本书相关的链接:

互动出版网 ,有免费
http://www.china-pub.com/195616 

豆瓣 
http://www.douban.com/subject/3764948/ 

配套源代码和相关的说明
http://code.google.com/p/google-api-broadview/ 

推荐序 
http://blog.csdn.net/bvbook/archive/2009/05/31/4227452.aspx 
http://bvbook.javaeye.com/blog/398813 

作者们的博客
http://www.gaoang.com/archives/125 
http://www.cnblogs.com/guanhe/archive/2009/06/01/1493789.html
http://diuera.blogbus.com/logs/40249425.html