<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Whaomian的博客</title>
	<atom:link href="http://whaomian.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://whaomian.wordpress.com</link>
	<description>和自己对话。</description>
	<lastBuildDate>Fri, 30 Sep 2011 04:59:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='whaomian.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Whaomian的博客</title>
		<link>http://whaomian.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://whaomian.wordpress.com/osd.xml" title="Whaomian的博客" />
	<atom:link rel='hub' href='http://whaomian.wordpress.com/?pushpress=hub'/>
		<item>
		<title>iOS中利用OAuth实现新浪微博账户登录</title>
		<link>http://whaomian.wordpress.com/2011/09/30/ios%e4%b8%ad%e5%ae%9e%e7%8e%b0%e5%88%a9%e7%94%a8%e6%96%b0%e6%b5%aa%e5%be%ae%e5%8d%9a%e8%b4%a6%e6%88%b7%e7%99%bb%e5%bd%95/</link>
		<comments>http://whaomian.wordpress.com/2011/09/30/ios%e4%b8%ad%e5%ae%9e%e7%8e%b0%e5%88%a9%e7%94%a8%e6%96%b0%e6%b5%aa%e5%be%ae%e5%8d%9a%e8%b4%a6%e6%88%b7%e7%99%bb%e5%bd%95/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 04:57:00 +0000</pubDate>
		<dc:creator>whaomian</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-C]]></category>
		<category><![CDATA[技术总结]]></category>

		<guid isPermaLink="false">http://whaomian.wordpress.com/?p=45</guid>
		<description><![CDATA[首先声明，这篇博客是写给本人自己看的，其目的只在于记录我在研究新浪微博账户登录以及OAuth的一些过程，仅作为本人的知识积累，而不在于知识传播。所以里面的很多细节实现不会赘述。如果你想从头到尾学习这个过程，可以继续百度其他文章，或者加新浪微博（@小刚WHM）咱们私下交流。 在一个开放的互联网时代，创业者最大的好处是不用辛辛苦苦从头到尾培养用户，在国外，只要你在网站或手机应用登录界面放上facebook或者twitter（你不知道这两个网站？那不能怪我，怪GFW）登录标志，你就立即拥有过亿的用户。这在三年前是无法想象的。这两个登录标志在国外网站已经是标配了。回到咱们中国，虽然大家都在吐槽说中国的互联网是假开放，但是不可否认的是，你还是可以让用户利用新浪微博或者qq或者豆瓣等等账户登录你的网站。所以，我们弱小的互联网创业者在创业的时候，除了要感谢党，感谢CCTV，还是得感谢一下新浪和企鹅。 这篇文章具体谈谈在iOS上如何通过新浪微博账户登录应用。 在讨论这个之前，不得不说到OAuth。这是个什么玩意呢？按照官方的说法，OAuth是：An open protocol to allow secure API authorization in a simple and standard method from desktop and &#8230;<p><a href="http://whaomian.wordpress.com/2011/09/30/ios%e4%b8%ad%e5%ae%9e%e7%8e%b0%e5%88%a9%e7%94%a8%e6%96%b0%e6%b5%aa%e5%be%ae%e5%8d%9a%e8%b4%a6%e6%88%b7%e7%99%bb%e5%bd%95/">Continue reading &#187;</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=45&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>首先声明，这篇博客是写给本人自己看的，其目的只在于记录我在研究新浪微博账户登录以及OAuth的一些过程，仅作为本人的知识积累，而不在于知识传播。所以里面的很多细节实现不会赘述。如果你想从头到尾学习这个过程，可以继续百度其他文章，或者加新浪微博（<a href="http://weibo.com/whaomian">@小刚WHM</a>）咱们私下交流。</p>
<p>在一个开放的互联网时代，创业者最大的好处是不用辛辛苦苦从头到尾培养用户，在国外，只要你在网站或手机应用登录界面放上facebook或者twitter（你不知道这两个网站？那不能怪我，怪GFW）登录标志，你就立即拥有过亿的用户。这在三年前是无法想象的。这两个登录标志在国外网站已经是标配了。回到咱们中国，虽然大家都在吐槽说中国的互联网是假开放，但是不可否认的是，你还是可以让用户利用新浪微博或者qq或者豆瓣等等账户登录你的网站。所以，我们弱小的互联网创业者在创业的时候，除了要感谢党，感谢CCTV，还是得感谢一下新浪和企鹅。</p>
<p>这篇文章具体谈谈在iOS上如何通过新浪微博账户登录应用。</p>
<p>在讨论这个之前，不得不说到OAuth。这是个什么玩意呢？按照官方的说法，OAuth是：An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications.</p>
<p>大概意思是说OAUTH是一种开放的协议，为桌面程序或者基于BS的web应用提供了一种简单的，标准的方式去访问需要用户授权的API服务。</p>
<p>也就是说，通过OAuth，应用或者网站服务可以获取用户的授权，但又不会获取到用户的账户信息（比如登录名和密码）。这里的授权包括：允许向用户发送某些信息，允许向用户提供访问网站的权限等等。</p>
<p><span style="color:#ff0000;">其实，对于大部分应用来说，只需要验证用户是否属于新浪微博用户，如果属于，那也自动是我的用户，如果不属于，那么请用户就地注册一个账户。换句话说，你将新浪微博的几亿用户自动承认成为你的网站用户，而不需要这几亿用户通过注册才能使用你的应用。所以，这是典型的一种YY思想，YY你瞬间获得了几亿用户！！</span></p>
<p>既然OAuth是一个协议，那么就需要用编程语言去实现它。目前，各种版本的OAuth基本都可以在google code下载到，包括C，C++，C#，JS，PHP等等。当然，肯定会有objective-C，否则，我也不会写这篇文章了。</p>
<p>OK，假设已经有了一个版本的Objective-C的OAuth的实现。下面就利用它来实现微博账户在iOS上的登录。</p>
<p>第一步：注册应用。</p>
<p>可以通过新浪微博的<a href="http://open.weibo.com/development">开放平台</a>去注册一个应用。之后你会得到一个App Key和一个App Secret。拥有它们，你才可以申请权限。</p>
<p>假设你的App Key是“1234567890”，App Secret是“abcdefghijklmnopqrstuvwxyz&#8221;</p>
<p>第二步：写代码。</p>
<p>将获取到的OAuth的objective-C版本加入你的project中。将你申请到的Key和Secret做为两个变量定义并赋值。</p>
<p>对于OAuth来说，很多细节不需要我们去关注的，只要知道几个重要的步骤即可：</p>
<p>1. 创建一个request，这个request包含key和secret的信息，用于向新浪微博申请获得对应用户的权限。</p>
<p>2. 通过request向新浪微博发出请求，告诉新浪微博说：我是一个合法的注册过的应用，现在准备向大人您申请获得用户的权限，请您高抬贵手。</p>
<p>3. 获得未授权的 Request Key。这个获得未授权的 Request Key就相当于放行条，也就是新浪微博允许你开始获取用户的权限。</p>
<p>4. 根据这个Request Key的内容，获得一个url地址，这个地址页面就是想登录你应用的用户输入用户名和密码的地方。注意的是，这个url是属于新浪微博为你的这个应用创建的，是属于新浪微博的。调用iOS的接口，从浏览器打开这个url界面。</p>
<p>5. 用户在上述登录界面输入自己的用户名和密码，成功登录之后（其实是新浪微博认证此用户是注册了新浪微博的用户），你可以获得已授权的 Access KEY。这个Access Key就包含了用户多登录信息（包括昵称、用户ID等等，这里的昵称是指用户显示在新浪微博上的名字，而不是用户的登录名）。</p>
<p>6. 到目前为止，你已经确定用户是新浪微博的用户了，自然也是你的应用的用户（继续YY），所以接下去，你就赶紧允许用户登录成功，进入你的应用主界面，享受你的应用程序了。还愣着干嘛，翠花，上酸菜！！</p>
<p>整个过程就是这几步。如果你觉得读到这里你还是不懂，那么恭喜你，你是正常人。因为我这篇文章是给懂的人（包括我自己看的）。不过有个方法可以让不懂的你也能懂，就是找到一个objective-c实现的OAuth，并且对着每一步（第六步除外，第六步是在你自己的project中实现。你总不能让OAuth给你上酸菜吧），找到实现每一步功能的函数，然后加入你自己的project中。</p>
<p>OK，正式开始YY你的几亿用户吧。</p>
<p><a href="http://whaomian.files.wordpress.com/2011/09/clec_cartoon.gif"><img class="alignnone size-full wp-image-46" title="CLEC_cartoon" src="http://whaomian.files.wordpress.com/2011/09/clec_cartoon.gif?w=462&#038;h=342" alt="" width="462" height="342" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/whaomian.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/whaomian.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/whaomian.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/whaomian.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/whaomian.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/whaomian.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/whaomian.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/whaomian.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/whaomian.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/whaomian.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/whaomian.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/whaomian.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/whaomian.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/whaomian.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=45&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://whaomian.wordpress.com/2011/09/30/ios%e4%b8%ad%e5%ae%9e%e7%8e%b0%e5%88%a9%e7%94%a8%e6%96%b0%e6%b5%aa%e5%be%ae%e5%8d%9a%e8%b4%a6%e6%88%b7%e7%99%bb%e5%bd%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cee44f6882b5b5bf69f1470ee782bbd2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">whaomian</media:title>
		</media:content>

		<media:content url="http://whaomian.files.wordpress.com/2011/09/clec_cartoon.gif" medium="image">
			<media:title type="html">CLEC_cartoon</media:title>
		</media:content>
	</item>
		<item>
		<title>找准你的目标用户群，然后hold住！</title>
		<link>http://whaomian.wordpress.com/2011/09/27/40/</link>
		<comments>http://whaomian.wordpress.com/2011/09/27/40/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 03:48:50 +0000</pubDate>
		<dc:creator>whaomian</dc:creator>
				<category><![CDATA[创业思考]]></category>

		<guid isPermaLink="false">http://whaomian.wordpress.com/?p=40</guid>
		<description><![CDATA[上周末参加了李治国（口碑网创始人 @李治国_姜子芽）的一个创业分享会。过程中，他分享了很多关于创业的东西，很受用。 其中最让我印象深刻的是有关产品定位的一句话。大概意思是：要想清楚你的产品的目标用户是谁？他们需要什么？即使一开始你只是提供了A服务，不一定十分成功。但不久你发现其实他们喜欢B服务，那因为你目标用户没有变，那么，你再提供B就好了。这不矛盾。或者说由于你推出A，大获成功，积累了大量的目标用户群。之后，其他公司推出了另外一种服务B，他们的目标用户群也是你的目标用户群（注意，这里不一定是你的竞争对手，只不过他发现了你的目标客户群的另外一种需求），也大受欢迎，那么你也推出同样的服务B，就十分水到渠成了，甚至比那家公司更容易推广。 这句话意思是说，只要你牢牢把握住你的目标用户群，你始终能找到一个服务是他们喜欢的。 下面举几个业界的例子吧： 先是国外的。 Facebook一出来的时候面向的用户群是大学生，一开始推出的功能就是为了比较哪个女的比较漂亮，为了能够了解朋友的动态。在很长一段时间，它的目标用户群都没有变，都是在校的大学生。并以此用户群，不断推出其他的增强社交的功能。 Instagram一开始做的是基于地理位置的分享。他们的目标客户群是那些喜欢利用智能手机随时随地分享的人。他们提供了很多很多的分享功能。但是在内部测试的时候，他们发现，最常用的分享其实就是照片分享，所以他们干脆就推出只能进行照片分享的版本，就是现在的Instagram，大获成功。 国内的。 大众点评网，它的目标客户群是那些喜欢到处找馆子吃饭的人。所以团购火起来，大众点评一进入，就能很轻易获得成功（至少目前看来是这样），成为投入最少，销售过亿时间最短，黏度最好的团购网站（没有之一）。在这里，团购网站并不是大众点评网的竞争对手，只不过他们的目标用户群相似而已。 最近有个比较高调的应用，幸会。他们的目标客户群是那些参加会议的人，一开始应用提供的是方便与会者交换名片。现在，他们提供更多更方便的会议管理和互动功能，比交换名片有用多了。 等等等等。 总而言之，言而总之，确定你的目标用户群，不断给他们需要的东西，而不是每换一个产品，就换一批目标用户群。就如欧莱雅的广告：总有一款适合你。对于这批用户群来说，总有一款服务适合他们。当然，前提是，你的目标用户群要足够大，才能有试错的余地，才能忽悠到投资者不断给你钱，一直到你找到那个杀手应用为止。 对于我们的自助游产品来说，我们的目标用户群当然是那些喜欢自助游的人，也就是所谓的驴友。对于这些人来说，他们的特点有： 1. 喜欢旅游。（废话？不，自助游的人都喜欢旅游。跟团游的人不一定喜欢旅游。你懂的。） 2. 崇尚自由。（废话？个个人都崇尚自由。不过，我这里指的是狭义的自由，也就是喜欢自己掌控时间。） 3. 崇尚省钱，崇尚经济实惠。但是会为好东西付钱。 &#8230;<p><a href="http://whaomian.wordpress.com/2011/09/27/40/">Continue reading &#187;</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=40&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>上周末参加了李治国（口碑网创始人 @李治国_姜子芽）的一个创业分享会。过程中，他分享了很多关于创业的东西，很受用。</p>
<p>其中最让我印象深刻的是有关产品定位的一句话。大概意思是：要想清楚你的产品的目标用户是谁？他们需要什么？即使一开始你只是提供了A服务，不一定十分成功。但不久你发现其实他们喜欢B服务，那因为你目标用户没有变，那么，你再提供B就好了。这不矛盾。或者说由于你推出A，大获成功，积累了大量的目标用户群。之后，其他公司推出了另外一种服务B，他们的目标用户群也是你的目标用户群（注意，这里不一定是你的竞争对手，只不过他发现了你的目标客户群的另外一种需求），也大受欢迎，那么你也推出同样的服务B，就十分水到渠成了，甚至比那家公司更容易推广。</p>
<p>这句话意思是说，只要你牢牢把握住你的目标用户群，你始终能找到一个服务是他们喜欢的。</p>
<p>下面举几个业界的例子吧：</p>
<p>先是国外的。</p>
<p>Facebook一出来的时候面向的用户群是大学生，一开始推出的功能就是为了比较哪个女的比较漂亮，为了能够了解朋友的动态。在很长一段时间，它的目标用户群都没有变，都是在校的大学生。并以此用户群，不断推出其他的增强社交的功能。</p>
<p>Instagram一开始做的是基于地理位置的分享。他们的目标客户群是那些喜欢利用智能手机随时随地分享的人。他们提供了很多很多的分享功能。但是在内部测试的时候，他们发现，最常用的分享其实就是照片分享，所以他们干脆就推出只能进行照片分享的版本，就是现在的Instagram，大获成功。</p>
<p>国内的。</p>
<p>大众点评网，它的目标客户群是那些喜欢到处找馆子吃饭的人。所以团购火起来，大众点评一进入，就能很轻易获得成功（至少目前看来是这样），成为投入最少，销售过亿时间最短，黏度最好的团购网站（没有之一）。在这里，团购网站并不是大众点评网的竞争对手，只不过他们的目标用户群相似而已。</p>
<p>最近有个比较高调的应用，幸会。他们的目标客户群是那些参加会议的人，一开始应用提供的是方便与会者交换名片。现在，他们提供更多更方便的会议管理和互动功能，比交换名片有用多了。</p>
<p>等等等等。</p>
<p>总而言之，言而总之，确定你的目标用户群，不断给他们需要的东西，而不是每换一个产品，就换一批目标用户群。就如欧莱雅的广告：总有一款适合你。对于这批用户群来说，总有一款服务适合他们。当然，前提是，你的目标用户群要足够大，才能有试错的余地，才能忽悠到投资者不断给你钱，一直到你找到那个杀手应用为止。</p>
<p><a href="http://whaomian.files.wordpress.com/2011/09/jlnn126l-1-jpg.png"><img class="alignnone size-full wp-image-42" title="jlnn126l-1.jpg" src="http://whaomian.files.wordpress.com/2011/09/jlnn126l-1-jpg.png?w=345&#038;h=400" alt="" width="345" height="400" /></a></p>
<p>对于我们的自助游产品来说，我们的目标用户群当然是那些喜欢自助游的人，也就是所谓的驴友。对于这些人来说，他们的特点有：</p>
<p>1. 喜欢旅游。（废话？不，自助游的人都喜欢旅游。跟团游的人不一定喜欢旅游。你懂的。）</p>
<p>2. 崇尚自由。（废话？个个人都崇尚自由。不过，我这里指的是狭义的自由，也就是喜欢自己掌控时间。）</p>
<p>3. 崇尚省钱，崇尚经济实惠。但是会为好东西付钱。</p>
<p>4. 喜欢分享。</p>
<p>5. 一部分会是摄影爱好者。</p>
<p>6. 喜欢（一点点）与众不同。</p>
<p>7. 80后多一点。</p>
<p>8. 喜欢艳遇（哈哈哈，你别不承认）。</p>
<p>9. 。。。。。。</p>
<p>所以，我们的自助游产品提供的不是攻略，而是旅游的快乐和惊喜。你懂的。</p>
<p><a href="http://whaomian.files.wordpress.com/2011/09/cartoon10-500x375.jpg"><img class="alignnone size-full wp-image-41" title="cartoon10-500x375" src="http://whaomian.files.wordpress.com/2011/09/cartoon10-500x375.jpg?w=500&#038;h=375" alt="" width="500" height="375" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/whaomian.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/whaomian.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/whaomian.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/whaomian.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/whaomian.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/whaomian.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/whaomian.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/whaomian.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/whaomian.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/whaomian.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/whaomian.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/whaomian.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/whaomian.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/whaomian.wordpress.com/40/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=40&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://whaomian.wordpress.com/2011/09/27/40/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cee44f6882b5b5bf69f1470ee782bbd2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">whaomian</media:title>
		</media:content>

		<media:content url="http://whaomian.files.wordpress.com/2011/09/jlnn126l-1-jpg.png" medium="image">
			<media:title type="html">jlnn126l-1.jpg</media:title>
		</media:content>

		<media:content url="http://whaomian.files.wordpress.com/2011/09/cartoon10-500x375.jpg" medium="image">
			<media:title type="html">cartoon10-500x375</media:title>
		</media:content>
	</item>
		<item>
		<title>iPhone地图应用开发以及自定义Annotation</title>
		<link>http://whaomian.wordpress.com/2011/09/25/31/</link>
		<comments>http://whaomian.wordpress.com/2011/09/25/31/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 11:07:47 +0000</pubDate>
		<dc:creator>whaomian</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-C]]></category>
		<category><![CDATA[技术总结]]></category>

		<guid isPermaLink="false">http://whaomian.wordpress.com/?p=31</guid>
		<description><![CDATA[之前写了一篇关于获取当前位置的文章。现在这篇文章将探讨一下，如何用地图显示地理信息，以及我们怎么自定义地图的Annotation，也就是地图图钉。 接下来的叙述都是为了实现下面的效果： 上图显示的内容包括： 1. 在界面显示一副地图； 2. 在地图上显示一个“笑脸”图标，笑脸所在的位置就是你的当前位置，或者你自己任意设定的地理位置； 3. 点击“笑脸”图标之后，会弹出一个类似标签（Annotation）的东西，标签上有三种内容：左边一副蝙蝠侠的图片，中间文字内容，以及最右边的按钮。 其中2和3都是属于自定义地图Annotation。 下面我们就一步步来实现上图的效果吧。 ===显示地图=== 第一步： 首先在你的工程的frameworks下面加入Mapkit.framework。至于如何加入一个framework，请参考之前的一篇文章。 加入Mapkit.framework之后，在需要用到地图的类的头文件中加入“#import &#60;MapKit/MapKit.h&#62;”。这时候便可以使用所有关于地图的功能了。 显示地图十分简单，只要在xib文件里面，将一个MKMapView拖进容纳这幅地图的View当中即可。这时候进行调试，将出现一个全球的地图。原因是因为你没有给地图一个显示的地理信息，所以初始化的地图只能显示一个全球的范围。 那么下一步便是将地图跳转到你需要显示的地理位置。加入你通过之前文章的阅读，已经获取到了当前位置，保存到checkinLocation（一个CLLocation的指针）当中了。 第二步： 在需要显示地图的View类中定义一个mapView：IBOutlet &#8230;<p><a href="http://whaomian.wordpress.com/2011/09/25/31/">Continue reading &#187;</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=31&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>之前写了一篇关于获取当前位置的<a href="http://whaomian.wordpress.com/2011/09/23/利用corelocation获取地理位置以及如何在模拟器进行调试/">文章</a>。现在这篇文章将探讨一下，如何用地图显示地理信息，以及我们怎么自定义地图的Annotation，也就是地图图钉。</p>
<p>接下来的叙述都是为了实现下面的效果：</p>
<p><a href="http://whaomian.files.wordpress.com/2011/09/a3c2976f-197c-4048-bbcc-df9007034f85.jpg"><img class="alignnone size-full wp-image-32" title="A3C2976F-197C-4048-BBCC-DF9007034F85" src="http://whaomian.files.wordpress.com/2011/09/a3c2976f-197c-4048-bbcc-df9007034f85.jpg?w=248&#038;h=174" alt="" width="248" height="174" /></a></p>
<p>上图显示的内容包括：</p>
<p>1. 在界面显示一副地图；</p>
<p>2. 在地图上显示一个“笑脸”图标，笑脸所在的位置就是你的当前位置，或者你自己任意设定的地理位置；</p>
<p>3. 点击“笑脸”图标之后，会弹出一个类似标签（Annotation）的东西，标签上有三种内容：左边一副蝙蝠侠的图片，中间文字内容，以及最右边的按钮。</p>
<p>其中2和3都是属于自定义地图Annotation。</p>
<p>下面我们就一步步来实现上图的效果吧。</p>
<p>===显示地图===</p>
<p>第一步：</p>
<p>首先在你的工程的frameworks下面加入Mapkit.framework。至于如何加入一个framework，请参考之前的一篇<a href="http://whaomian.wordpress.com/2011/09/23/利用corelocation获取地理位置以及如何在模拟器进行调试/">文章</a>。</p>
<p>加入Mapkit.framework之后，在需要用到地图的类的头文件中加入“#import &lt;MapKit/MapKit.h&gt;”。这时候便可以使用所有关于地图的功能了。</p>
<p>显示地图十分简单，只要在xib文件里面，将一个MKMapView拖进容纳这幅地图的View当中即可。这时候进行调试，将出现一个全球的地图。原因是因为你没有给地图一个显示的地理信息，所以初始化的地图只能显示一个全球的范围。</p>
<p>那么下一步便是将地图跳转到你需要显示的地理位置。加入你通过之前<a href="http://whaomian.wordpress.com/2011/09/23/利用corelocation获取地理位置以及如何在模拟器进行调试/">文章</a>的阅读，已经获取到了当前位置，保存到checkinLocation（一个CLLocation的指针）当中了。</p>
<p>第二步：</p>
<p>在需要显示地图的View类中定义一个mapView：IBOutlet MKMapView *mapView。并且在xib中将之前拖进来的MKMapView和这个mapView成员变量建立outlets的关系（什么？不懂？那就从头学一下xcode吧）。</p>
<p>在类的实现文件（.m)中加入以下代码（方法名自己起吧，我这里起的是initMapView）：</p>
<div>
<ol start="1">
<li>- (void) initMapView {</li>
<li>    MKCoordinateSpan theSpan;</li>
<li>    //设置地图的范围，越小越精确</li>
<li>    theSpan.latitudeDelta = 0.02;</li>
<li>    theSpan.longitudeDelta = 0.02;</li>
<li>    MKCoordinateRegion theRegion;</li>
<li>    theRegion.center = [checkinLocation coordinate]; //让地图跳到之前获取到的当前位置checkinLocation</li>
<li>    theRegion.span = theSpan;</li>
<li>    [mapView setRegion:theRegion];</li>
<li>}</li>
</ol>
</div>
<p>然后，你在显示这个View的时候（比如在viewDidLoad函数中）调用initMapView，地图便可以跳到你要显示的位置了。这里关键的函数是setRegion，已经被MKMapView类封装好了。</p>
<p>至此，你的应用就可以显示地图，并且跳到你设定的任何位置了。是不是特简单？简直简单到我在怀疑我是否有写这篇文章的需要了。不过，废话少说。下面还是来看看如何自定义Annotation吧。</p>
<p>===自定义Annotation===</p>
<p>如果不采取自定义的Annotation，ios默认的是一个图钉的形状，如下图（一个紫色的图钉）：</p>
<p><a href="http://whaomian.files.wordpress.com/2011/09/6c0423f3-96bf-4bca-8bd3-394b94eb0f26.jpg"><img class="alignnone size-full wp-image-33" title="6C0423F3-96BF-4BCA-8BD3-394B94EB0F26" src="http://whaomian.files.wordpress.com/2011/09/6c0423f3-96bf-4bca-8bd3-394b94eb0f26.jpg?w=162&#038;h=124" alt="" width="162" height="124" /></a></p>
<p>当然，千里执行始于足下，我们还是首先来看看如何在特定的位置显示以上的默认的小图钉吧。</p>
<p>第一步：</p>
<p>先定义一个自己的Annotation的类：</p>
<div>
<ol start="1">
<li>@interface MyMapAnnotation : NSObject&lt;MKAnnotation&gt; {</li>
<li>    CLLocationCoordinate2D location;</li>
<li>    NSString *title;</li>
<li>    NSString *subtitle;</li>
<li>    NSString *headImage;</li>
<li>}</li>
<li>@property CLLocationCoordinate2D location;</li>
<li>@property (nonatomic, copy) NSString *title;</li>
<li>@property (nonatomic, copy) NSString *subtitle;</li>
<li>@property (nonatomic, copy) NSString *headImage;</li>
<li>@end</li>
</ol>
</div>
<p>从上面代码可以看到，MyMapAnnotation类继承于MKAnnotation。里面包含四个成员变量。其中location保存要显示这个Annotation的位置。其他三个变量对应我们之前那个效果图的几点内容：头像、文字内容。</p>
<p>这个类的实现文件（.m)文件很简单，就定义好dealloc和init方法就好，这里不再赘述。</p>
<p>第二步：</p>
<p>在要显示地图的View类中实现MKMapViewDelegate，并实现viewForAnnotation函数，代码如下：</p>
<div>
<ol start="1">
<li>- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation {</li>
<li>    if ([annotation isKindOfClass:[MKUserLocation class]])</li>
<li>        return nil;</li>
<li>    // 处理我们自定义的Annotation</li>
<li>    if ([annotation isKindOfClass:[MyMapAnnotation class]]) {</li>
<li>        static NSString* travellerAnnotationIdentifier = @&#8221;TravellerAnnotationIdentifier&#8221;;</li>
<li>        MKPinAnnotationView* pinView = (MKPinAnnotationView *)</li>
<li>        [mapView dequeueReusableAnnotationViewWithIdentifier:travellerAnnotationIdentifier];</li>
<li>        if (!pinView)</li>
<li>        {</li>
<li>            // if an existing pin view was not available, create one</li>
<li>            MKAnnotationView* customPinView = [[[MKAnnotationView alloc]</li>
<li>                                                initWithAnnotation:annotation reuseIdentifier:travellerAnnotationIdentifier] autorelease];</li>
<li>            customPinView.pinColor = MKPinAnnotationColorPurple;</li>
<li>            customPinView.animatesDrop = YES;  //如果不需要这个从天而降的效果，设置为NO即可。</li>
<li>            customPinView.canShowCallout = NO;</li>
<li>            return customPinView;</li>
<li>        }</li>
<li>        else</li>
<li>        {</li>
<li>            pinView.annotation = annotation;</li>
<li>        }</li>
<li>        return pinView;</li>
<li>    }</li>
<li>    return nil;</li>
<li>}</li>
</ol>
</div>
<p>这段代码将实现默认的一个图钉的效果。</p>
<p>细心地你会发现，上面的代码似乎没有涉及到地理位置，那么地图将怎么知道将这个Annotation放到合适的位置呢？稍安勿躁，稍候将会介绍如何设置Annotation的位置，同时设置Annotation的其他内容（还记得Annotation的定义里面有位置信息，还有几项内容信息吧）。</p>
<p>如果我不喜欢图钉，我想把它换成之前效果图中的笑脸呢？那就把上述代码改成如下：</p>
<div>
<ol start="1">
<li>- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation {</li>
<li>    if ([annotation isKindOfClass:[MKUserLocation class]])</li>
<li>        return nil;</li>
<li>    if ([annotation isKindOfClass:[TravellerMapAnnotation class]]) {</li>
<li>        static NSString* travellerAnnotationIdentifier = @&#8221;TravellerAnnotationIdentifier&#8221;;</li>
<li>        MKPinAnnotationView* pinView = (MKPinAnnotationView *)</li>
<li>        [mapView dequeueReusableAnnotationViewWithIdentifier:travellerAnnotationIdentifier];</li>
<li>        if (!pinView)</li>
<li>        {</li>
<li>            // if an existing pin view was not available, create one</li>
<li>            MKAnnotationView* customPinView = [[[MKAnnotationView alloc]</li>
<li>                                                initWithAnnotation:annotation reuseIdentifier:travellerAnnotationIdentifier] autorelease];</li>
<li>            UIImage *image = [UIImage imageNamed:@"smileFace.png"];</li>
<li>            customPinView.image = image;  //将图钉变成笑脸。</li>
<li>            [image release];</li>
<li>            return customPinView;</li>
<li>        }</li>
<li>        else</li>
<li>        {</li>
<li>            pinView.annotation = annotation;</li>
<li>        }</li>
<li>        return pinView;</li>
<li>    }</li>
<li>    return nil;</li>
<li>}</li>
</ol>
</div>
<p>从上述代码看出，也就是将定义pinColor的代码段去掉，换成设置image的代码：customPinView.image = image.</p>
<p>同样很简单吧。哎，我还有没有写下去的必要呢。（画外音：废话少说！！！）</p>
<p>第三步：</p>
<p>正如之前的疑问，哪里定义Annotation的地理位置以及其他内容呢？不仅仅如此，还有，怎么让用户点击笑脸（或者图钉）之后，弹出一个标签，显示定义好的内容呢。下面我们先看看最后一个问题，怎么让用户点击笑脸（或者图钉）之后，弹出一个标签，显示定义好的内容呢？</p>
<p>还是上面那段代,将它进一步改成：</p>
<div>
<ol start="1">
<li>- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation {</li>
<li>    if ([annotation isKindOfClass:[MKUserLocation class]])</li>
<li>        return nil;</li>
<li>    if ([annotation isKindOfClass:[TravellerMapAnnotation class]]) {</li>
<li>        // try to dequeue an existing pin view first</li>
<li>        static NSString* travellerAnnotationIdentifier = @&#8221;TravellerAnnotationIdentifier&#8221;;</li>
<li>        MKPinAnnotationView* pinView = (MKPinAnnotationView *)</li>
<li>        [mapView dequeueReusableAnnotationViewWithIdentifier:travellerAnnotationIdentifier];</li>
<li>        if (!pinView)</li>
<li>        {</li>
<li>            // if an existing pin view was not available, create one</li>
<li>            MKAnnotationView* customPinView = [[[MKAnnotationView alloc]</li>
<li>                                                initWithAnnotation:annotation reuseIdentifier:travellerAnnotationIdentifier] autorelease];</li>
<li>            customPinView.canShowCallout = YES;  //很重要，运行点击弹出标签</li>
<li>            UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];</li>
<li>            [rightButton addTarget:self</li>
<li>                            action:@selector(showDetails:)  //点击右边的按钮之后，显示另外一个页面</li>
<li>                            forControlEvents:UIControlEventTouchUpInside];</li>
<li>            customPinView.rightCalloutAccessoryView = rightButton;</li>
<li>            MyMapAnnotation *travellerAnnotation = (TravellerMapAnnotation *)annotation;</li>
<li>            UIImageView *headImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:travellerAnnotation.headImage]];</li>
<li>            customPinView.leftCalloutAccessoryView = headImage; //设置最左边的头像</li>
<li>            [headImage release];</li>
<li>            UIImage *image = [UIImage imageNamed:@"smileFace.png"];</li>
<li>            customPinView.image = image;</li>
<li>            customPinView.opaque = YES;</li>
<li>            [travellerImage release];</li>
<li>            return customPinView;</li>
<li>        }</li>
<li>        else</li>
<li>        {</li>
<li>            pinView.annotation = annotation;</li>
<li>        }</li>
<li>        return pinView;</li>
<li>    }</li>
<li>    return nil;</li>
<li>}</li>
</ol>
</div>
<p>上面的代码很容易理解（加上我的注释之后），有点objective-C以及cocoa基础的朋友都会看懂。如果你看不懂，拜托，我这里不负责扫盲啊。</p>
<p>也许你有个疑问，似乎没见到设置文字信息呀。其实，之前自定义的MyMapAnnotation继承自MKAnnotation，所以只要你给一个MyMapAnnotation对象的title和subtitle填上内容之后，它会自动显示，不需要你手动让它显示。</p>
<p>下面我们就来看看如何添加MyMapAnnotation的内容吧。</p>
<p>其实这也十分简单，就是创建一个新的MyMapAnnotation，然后往里面添加内容即可。比如：</p>
<div>
<ol start="1">
<li>TravellerMapAnnotation *travellerAnnotation = [[TravellerMapAnnotation alloc] init];</li>
<li>travellerAnnotation.location = checkinlocation.coordinate;</li>
<li>travellerAnnotation.title = [travellerNames objectAtIndex:i];</li>
<li>travellerAnnotation.subtitle = [scores objectAtIndex:i];</li>
<li>travellerAnnotation.headImage = [headImages objectAtIndex:i];</li>
</ol>
</div>
<p>现在还残留的一个问题是（这是历史遗留的问题，由于某种原因，我们暂时忽略了它。。。！跑题了吧，大叔。。。）：</p>
<p>如何将创建好的一个或者多个甚至成千上万个MyMapAnnotation加入地图并显示它呢。</p>
<p>这个问题更加简单。加入建立了100个MyMapAnnotations，并且全部存进了一个NSArray中，MyMapAnnotationsArray，那么我们需要做的就十分简单了：</p>
<p>mapView addAnnotations:MyMapAnnotationsArray</p>
<p>也就是调用MKMapView的addAnnotations方法将所有创建好的Annotations加进来即可。</p>
<p>至此（真的是至此了），所有的工作都完成了。调试，便可看到一开头展示的那个效果了。（呼，好累）。</p>
<p>基础性的技术文章不好写，写得详细太累人，写得简单怕误导别人，sigh。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/whaomian.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/whaomian.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/whaomian.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/whaomian.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/whaomian.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/whaomian.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/whaomian.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/whaomian.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/whaomian.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/whaomian.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/whaomian.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/whaomian.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/whaomian.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/whaomian.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=31&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://whaomian.wordpress.com/2011/09/25/31/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cee44f6882b5b5bf69f1470ee782bbd2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">whaomian</media:title>
		</media:content>

		<media:content url="http://whaomian.files.wordpress.com/2011/09/a3c2976f-197c-4048-bbcc-df9007034f85.jpg" medium="image">
			<media:title type="html">A3C2976F-197C-4048-BBCC-DF9007034F85</media:title>
		</media:content>

		<media:content url="http://whaomian.files.wordpress.com/2011/09/6c0423f3-96bf-4bca-8bd3-394b94eb0f26.jpg" medium="image">
			<media:title type="html">6C0423F3-96BF-4BCA-8BD3-394B94EB0F26</media:title>
		</media:content>
	</item>
		<item>
		<title>当google满足不了你的时候</title>
		<link>http://whaomian.wordpress.com/2011/09/24/%e5%bd%93google%e6%bb%a1%e8%b6%b3%e4%b8%8d%e4%ba%86%e4%bd%a0%e7%9a%84%e6%97%b6%e5%80%99/</link>
		<comments>http://whaomian.wordpress.com/2011/09/24/%e5%bd%93google%e6%bb%a1%e8%b6%b3%e4%b8%8d%e4%ba%86%e4%bd%a0%e7%9a%84%e6%97%b6%e5%80%99/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 04:33:14 +0000</pubDate>
		<dc:creator>whaomian</dc:creator>
				<category><![CDATA[创业思考]]></category>

		<guid isPermaLink="false">http://whaomian.wordpress.com/?p=19</guid>
		<description><![CDATA[前几天偶然间发现了一个专门搜索书籍的网站：whichbook，十分有趣。在whichbook上，用户可以根据书的不同属性，或者根据自己的口味，来综合搜索某一本（或一些）你不知道名字，但知道大概的剧情或者类型的书。具体的搜索方式如下： 根据用户口味来搜索： 上图直接截取自网站。从上图来看，它将一本书的情节属性分为12类。比如暴力程度，色情程度，感情色彩等等。然后允许用户选择并调整其中的四项。如上图所示，我选择了悲伤/喜乐程度，可预知程度（最不可预知的当然是侦探小说），暴力程度，以及色情程度（Yeah！！我选的是相当色情）。用户做出这些选择之后，便可以提交选择（或者说用户的口味）进行选择。下面的两个结果是根据我的口味搜索到的（一共有几十条结果）： 当然，由于都是英文书籍，这些书我都没有看过，所以我也不知搜索结果是否十分准确。 从返回结果也可以看出它们目前的一个盈利模式是：用户可以通过搜索结果直接进行购买（链接到亚马逊书店），然后进行提成（这是我猜的）。 更进一步，它还提供给用户根据书中的人物角色、情节、进行搜索。比如根据人物角色，就分为人种、年龄、性取向以及性别： 不过根据我上面的选择，搜索结果为0（神马！！哪尼！！我有那么重口味么）。 总而言之，这个网站的搜索特点，也就是和google（你可以说百度）最大的不同是：用户可以搜索到他不知道不知道的东西（这里没有打错，就是不知道不知道）。也就是说，用户可以搜索到他彻底不知道的东西。对于google搜索来说，搜一本书，你必须知道这本书的名字或者作者，或者一些大概的剧情，或者书中人物的名字。也就是说你心目中必须有那本书的意向，它是某本具体的书籍。但如果你彻底没看过某本书，或者说你心中根本没有一本书的意向，你就是想找一本超级暴力超级色情的重口味的书，那google就帮不了你了（当然，你可以直接搜索：史上最暴力的书籍，也可以出来一些结果）。 对于这类搜索，有个说法叫做：搜索用户不知道他不知道的内容。google是搜索用户知道他知道（比如搜索具体的一本书名）以及知道他不知道（比如搜索某个他不懂的算法）。对于不知道他知道的内容，这个就没必要搜索了。 但我个人（引用请交版权费）把这类搜索叫做：模糊的具体搜索（或者说不确定的确定搜索）。什么是模糊（不确定），也就是用户心目中没有一个特定的具象，他只有模模糊糊某些意向。什么是具体（确定），那就是用户心目中肯定有些具体的条件（或者说要求），就以我上述的例子来说，用户想找暴力色情内容，这就是具体的，但是他对最后的结果是没有特定的具象的。 国内有没有做这种搜索的公司呢，狭义来说是没有的，广义来说，这种“搜索”做得最好、大家都用过或者听说过的网站，就是豆瓣（神马，你没有听说过，这让阿北情何以堪啊）。当然，豆瓣的形式不是搜索（所以我称之为广义上的），它是通过推荐。基于推荐（好友的推荐，根据你自己口味的推荐）是解决搜索用户不知道他不知道的内容（确定的不确定的搜索）的最好的手段之一。原因在于，用户这种不确定性的搜索可以根据他个人的喜好来进行一定的限定，这样的搜索结果最符合用户的需求。因为搜索的本质就是为了找到自己想要的东西，即使这个东西是你之前完全不知道的。 聪明的IT从业人士（对了，比如我）来说，从这个网站肯定会想到可以扩展到很多方面的搜索，比如whichmovie（搜索电影，属性跟搜书差不多），whichrestaurant（根据个人口味搜索餐厅），whichperson（搜索异性、搜索人才）等等等等。 当然这些东西空手起家来做比较难，但如果一些大的互联网公司来做就水到渠成（当然，他们不一定会做）。比如豆瓣可以做搜书搜电影，大众点评可以搜餐厅，婚恋网站搜异性（目前根据一些具体条件来搜索就差不多有这么个意思），招聘网站搜索人才等等等等。 至于本人的创业项目，一个基于移动互联网的个人自助游产品（暂定名字叫马蹄网），从某种意义来说，也属于这种搜索，因为我们的产品能够向用户提供他在一个陌生的城市他所不知道的，但对他或许有用、他或许感兴趣的旅游信息。敬请期待。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=19&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>前几天偶然间发现了一个专门搜索书籍的网站：<a href="http://www.whichbook.net/">whichbook</a>，十分有趣。在whichbook上，用户可以根据书的不同属性，或者根据自己的口味，来综合搜索某一本（或一些）你不知道名字，但知道大概的剧情或者类型的书。具体的搜索方式如下：</p>
<p>根据用户口味来搜索：</p>
<p><a href="http://whaomian.files.wordpress.com/2011/09/95b63126-5c02-445c-a87c-b34f6b997f3a2.jpg"><img class="alignnone size-full wp-image-27" title="95B63126-5C02-445C-A87C-B34F6B997F3A" src="http://whaomian.files.wordpress.com/2011/09/95b63126-5c02-445c-a87c-b34f6b997f3a2.jpg?w=330&#038;h=517" alt="" width="330" height="517" /></a></p>
<p>上图直接截取自网站。从上图来看，它将一本书的情节属性分为12类。比如暴力程度，色情程度，感情色彩等等。然后允许用户选择并调整其中的四项。如上图所示，我选择了悲伤/喜乐程度，可预知程度（最不可预知的当然是侦探小说），暴力程度，以及色情程度（Yeah！！我选的是相当色情）。用户做出这些选择之后，便可以提交选择（或者说用户的口味）进行选择。下面的两个结果是根据我的口味搜索到的（一共有几十条结果）：</p>
<p><a href="http://whaomian.files.wordpress.com/2011/09/701bc078-3657-4ff5-a3ec-96758b217e321.jpg"><img class="alignnone size-full wp-image-28" title="701BC078-3657-4FF5-A3EC-96758B217E32" src="http://whaomian.files.wordpress.com/2011/09/701bc078-3657-4ff5-a3ec-96758b217e321.jpg?w=578&#038;h=572" alt="" width="578" height="572" /></a></p>
<p>当然，由于都是英文书籍，这些书我都没有看过，所以我也不知搜索结果是否十分准确。</p>
<p>从返回结果也可以看出它们目前的一个盈利模式是：用户可以通过搜索结果直接进行购买（链接到亚马逊书店），然后进行提成（这是我猜的）。</p>
<p>更进一步，它还提供给用户根据书中的人物角色、情节、进行搜索。比如根据人物角色，就分为人种、年龄、性取向以及性别：</p>
<p><a href="http://whaomian.files.wordpress.com/2011/09/e33c41e0-5b7b-4ae0-98a1-b4efa9974f6e.jpg"><img class="alignnone size-full wp-image-26" title="E33C41E0-5B7B-4AE0-98A1-B4EFA9974F6E" src="http://whaomian.files.wordpress.com/2011/09/e33c41e0-5b7b-4ae0-98a1-b4efa9974f6e.jpg?w=322&#038;h=246" alt="" width="322" height="246" /></a></p>
<p>不过根据我上面的选择，搜索结果为0（神马！！哪尼！！我有那么重口味么）。</p>
<p>总而言之，这个网站的搜索特点，也就是和google（你可以说百度）最大的不同是：用户可以搜索到他不知道不知道的东西（这里没有打错，就是不知道不知道）。也就是说，用户可以搜索到他彻底不知道的东西。对于google搜索来说，搜一本书，你必须知道这本书的名字或者作者，或者一些大概的剧情，或者书中人物的名字。也就是说你心目中必须有那本书的意向，它是某本具体的书籍。但如果你彻底没看过某本书，或者说你心中根本没有一本书的意向，你就是想找一本超级暴力超级色情的重口味的书，那google就帮不了你了（当然，你可以直接搜索：史上最暴力的书籍，也可以出来一些结果）。</p>
<p>对于这类搜索，有个说法叫做：搜索用户不知道他不知道的内容。google是搜索用户知道他知道（比如搜索具体的一本书名）以及知道他不知道（比如搜索某个他不懂的算法）。对于不知道他知道的内容，这个就没必要搜索了。</p>
<p>但我个人（引用请交版权费）把这类搜索叫做：模糊的具体搜索（或者说不确定的确定搜索）。什么是模糊（不确定），也就是用户心目中没有一个特定的具象，他只有模模糊糊某些意向。什么是具体（确定），那就是用户心目中肯定有些具体的条件（或者说要求），就以我上述的例子来说，用户想找暴力色情内容，这就是具体的，但是他对最后的结果是没有特定的具象的。</p>
<p>国内有没有做这种搜索的公司呢，狭义来说是没有的，广义来说，这种“搜索”做得最好、大家都用过或者听说过的网站，就是豆瓣（神马，你没有听说过，这让阿北情何以堪啊）。当然，豆瓣的形式不是搜索（所以我称之为广义上的），它是通过推荐。基于推荐（好友的推荐，根据你自己口味的推荐）是解决搜索用户不知道他不知道的内容（确定的不确定的搜索）的最好的手段之一。原因在于，用户这种不确定性的搜索可以根据他个人的喜好来进行一定的限定，这样的搜索结果最符合用户的需求。因为搜索的本质就是为了找到自己想要的东西，即使这个东西是你之前完全不知道的。</p>
<p>聪明的IT从业人士（对了，比如我）来说，从这个网站肯定会想到可以扩展到很多方面的搜索，比如whichmovie（搜索电影，属性跟搜书差不多），whichrestaurant（根据个人口味搜索餐厅），whichperson（搜索异性、搜索人才）等等等等。</p>
<p>当然这些东西空手起家来做比较难，但如果一些大的互联网公司来做就水到渠成（当然，他们不一定会做）。比如豆瓣可以做搜书搜电影，大众点评可以搜餐厅，婚恋网站搜异性（目前根据一些具体条件来搜索就差不多有这么个意思），招聘网站搜索人才等等等等。</p>
<p>至于本人的创业项目，一个基于移动互联网的个人自助游产品（暂定名字叫马蹄网），从某种意义来说，也属于这种搜索，因为我们的产品能够向用户提供他在一个陌生的城市他所不知道的，但对他或许有用、他或许感兴趣的旅游信息。敬请期待。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/whaomian.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/whaomian.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/whaomian.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/whaomian.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/whaomian.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/whaomian.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/whaomian.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/whaomian.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/whaomian.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/whaomian.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/whaomian.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/whaomian.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/whaomian.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/whaomian.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=19&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://whaomian.wordpress.com/2011/09/24/%e5%bd%93google%e6%bb%a1%e8%b6%b3%e4%b8%8d%e4%ba%86%e4%bd%a0%e7%9a%84%e6%97%b6%e5%80%99/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cee44f6882b5b5bf69f1470ee782bbd2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">whaomian</media:title>
		</media:content>

		<media:content url="http://whaomian.files.wordpress.com/2011/09/95b63126-5c02-445c-a87c-b34f6b997f3a2.jpg" medium="image">
			<media:title type="html">95B63126-5C02-445C-A87C-B34F6B997F3A</media:title>
		</media:content>

		<media:content url="http://whaomian.files.wordpress.com/2011/09/701bc078-3657-4ff5-a3ec-96758b217e321.jpg" medium="image">
			<media:title type="html">701BC078-3657-4FF5-A3EC-96758B217E32</media:title>
		</media:content>

		<media:content url="http://whaomian.files.wordpress.com/2011/09/e33c41e0-5b7b-4ae0-98a1-b4efa9974f6e.jpg" medium="image">
			<media:title type="html">E33C41E0-5B7B-4AE0-98A1-B4EFA9974F6E</media:title>
		</media:content>
	</item>
		<item>
		<title>利用CoreLocation获取地理位置以及如何在模拟器进行调试</title>
		<link>http://whaomian.wordpress.com/2011/09/23/%e5%88%a9%e7%94%a8corelocation%e8%8e%b7%e5%8f%96%e5%9c%b0%e7%90%86%e4%bd%8d%e7%bd%ae%e4%bb%a5%e5%8f%8a%e5%a6%82%e4%bd%95%e5%9c%a8%e6%a8%a1%e6%8b%9f%e5%99%a8%e8%bf%9b%e8%a1%8c%e8%b0%83%e8%af%95/</link>
		<comments>http://whaomian.wordpress.com/2011/09/23/%e5%88%a9%e7%94%a8corelocation%e8%8e%b7%e5%8f%96%e5%9c%b0%e7%90%86%e4%bd%8d%e7%bd%ae%e4%bb%a5%e5%8f%8a%e5%a6%82%e4%bd%95%e5%9c%a8%e6%a8%a1%e6%8b%9f%e5%99%a8%e8%bf%9b%e8%a1%8c%e8%b0%83%e8%af%95/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 16:07:38 +0000</pubDate>
		<dc:creator>whaomian</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-C]]></category>
		<category><![CDATA[技术总结]]></category>

		<guid isPermaLink="false">http://whaomian.wordpress.com/?p=17</guid>
		<description><![CDATA[LBS是移动应用的一个大热点。很多App都允许（或者说要求）获取用户的地理位置。这篇文章将简要谈谈如何利用CoreLocation来获取地理位置，并且会涉及到如何在iPhone的模拟器进行调试。 要利用CoreLocation，必须在frameworks里面加入“CoreLocation.framework”。在最新版本的Xcode（4.x）中加入新的framework步骤如下： 单击项目的target =&#62;在出来的xcodeproj面板中点击“Link Binary With Libraries” =&#62;点击“+”，然后选择需要的framework即可。 加入“CoreLocationframework”之后，就可以在类中import &#60;CoreLocation/CoreLocation.h&#62;，这样就可以使用所有与CoreLocation相关的类了。 下面开始在项目里面实现获取当前地理位置： 第一步： 先在类中定义两个成员变量： CLLocationManager *locationManager; CLLocation *checkinLocation; 这两个变量，locationManaager用于获取位置，checkinLocation用于保存获取到的位置信息。 第二步： 在类中实现CLLocationManagerDelegate，并实现以下方法： - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation                         fromLocation:(CLLocation *)oldLocation {     checkinLocation = newLocation; &#8230;<p><a href="http://whaomian.wordpress.com/2011/09/23/%e5%88%a9%e7%94%a8corelocation%e8%8e%b7%e5%8f%96%e5%9c%b0%e7%90%86%e4%bd%8d%e7%bd%ae%e4%bb%a5%e5%8f%8a%e5%a6%82%e4%bd%95%e5%9c%a8%e6%a8%a1%e6%8b%9f%e5%99%a8%e8%bf%9b%e8%a1%8c%e8%b0%83%e8%af%95/">Continue reading &#187;</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=17&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>LBS是移动应用的一个大热点。很多App都允许（或者说要求）获取用户的地理位置。这篇文章将简要谈谈如何利用CoreLocation来获取地理位置，并且会涉及到如何在iPhone的模拟器进行调试。</p>
<p>要利用CoreLocation，必须在frameworks里面加入“CoreLocation.framework”。在最新版本的Xcode（4.x）中加入新的framework步骤如下：</p>
<p>单击项目的target =&gt;在出来的xcodeproj面板中点击“Link Binary With Libraries” =&gt;点击“+”，然后选择需要的framework即可。</p>
<p>加入“CoreLocationframework”之后，就可以在类中import &lt;CoreLocation/CoreLocation.h&gt;，这样就可以使用所有与CoreLocation相关的类了。</p>
<p>下面开始在项目里面实现获取当前地理位置：</p>
<p>第一步：</p>
<p>先在类中定义两个成员变量：</p>
<div>
<ol start="1">
<li>CLLocationManager *locationManager;</li>
<li>CLLocation *checkinLocation;</li>
</ol>
</div>
<p>这两个变量，locationManaager用于获取位置，checkinLocation用于保存获取到的位置信息。</p>
<p>第二步：</p>
<p>在类中实现CLLocationManagerDelegate，并实现以下方法：</p>
<div>
<ol start="1">
<li>- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation</li>
<li>                        fromLocation:(CLLocation *)oldLocation {</li>
<li>    checkinLocation = newLocation;</li>
<li>    //do something else</li>
<li>}</li>
</ol>
</div>
<p>从代码可以看到，运行到这个方法的时候，locationManager已经得到了当前的位置，所以在这个方法中应该把获取到的当前位置保存到变量checkinLocation中。</p>
<p>第三步：</p>
<p>在第二步实现的方法其实是被CLLocationManager中的方法startUpdatingLocation调用的，也就是说，当程序运行 locationManager.startUpdatingLocation的时候，第二步实现的方法就会被调用。</p>
<p>假设点击按钮checkIn的时候，程序会获取当前位置，那么就需要在这个checkIn按钮对应的动作方法（假设是方法名就叫做checkIn）中调用locationManager.startUpdatingLocation。具体如下：</p>
<div>
<ol start="1">
<li>- (void) setupLocationManager {</li>
<li>    self.locationManager = [[[CLLocationManager alloc] init] autorelease];</li>
<li>    if ([CLLocationManager locationServicesEnabled]) {</li>
<li>    NSLog( @&#8221;Starting CLLocationManager&#8221; );</li>
<li>    self.locationManager.delegate = self;</li>
<li>    self.locationManager.distanceFilter = 200;</li>
<li>        locationManager.desiredAccuracy = kCLLocationAccuracyBest;</li>
<li>    [self.locationManager startUpdatingLocation];</li>
<li>    } else {</li>
<li>        NSLog( @&#8221;Cannot Starting CLLocationManager&#8221; );</li>
<li>        /*self.locationManager.delegate = self;</li>
<li>    self.locationManager.distanceFilter = 200;</li>
<li>        locationManager.desiredAccuracy = kCLLocationAccuracyBest;</li>
<li>    [self.locationManager startUpdatingLocation];*/</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p>在上面的代码中，程序首先判断机器（iPhone/iPad）是不是开启了地理位置的服务（locationServicesEnabled）。如果开启了，那么就开始进行定位（[self.locationManager startUpdatingLocation];）。在定位之前要设置一些有关位置的属性，比如distanceFilter，desiredAccuacy等等。至于这些属性有什么用，可以查看xcode的文档，这里就不在赘述。值得注意的是，一定要设置locationManager的delegate是类本身，这样startUpdatingLocation运行的时候才会调用第二步实现的方法。</p>
<p>如果机器没有开启地理位置的服务，那么就不需要做多余的动作。注意到上面代码中有一部分代码被注释掉了，这部分代码这是为了能够在模拟器中调试程序。</p>
<p>下面谈谈如何在模拟器中调试获取当前地理位置的程序。</p>
<p>如果程序在真机中调试，只要真机开启了定位功能（GPS或者无线定位），那么就可以调试成功的。但是如果在模拟器中调试，就要做点额外功夫。由于在模拟器中是无法开启地理位置的服务（locationServicesEnabled总是等于false），所以需要将当前位置（或者任意位置）hardcode进程序当中，以便调试。</p>
<p>将下面的代码添加进类中（实现了获取当前位置的代码所在的类文件），添加的位置在import代码段的后面：</p>
<div>
<ol start="1">
<li>@implementation CLLocationManager (TemporaryHack)</li>
<li>- (void)hackLocationFix</li>
<li>{</li>
<li>    //CLLocation *location = [[CLLocation alloc] initWithLatitude:42 longitude:-50];</li>
<li>    float latitude = 26.876812;</li>
<li>    float longitude = 100.22569199999998;  //这里可以是任意的经纬度值</li>
<li>    CLLocation *location= [[[CLLocation alloc] initWithLatitude:latitude longitude:longitude] autorelease];</li>
<li>    [[self delegate] locationManager:self didUpdateToLocation:location fromLocation:nil];</li>
<li>}</li>
<li>- (void)startUpdatingLocation</li>
<li>{</li>
<li>    [self performSelector:@selector(hackLocationFix) withObject:nil afterDelay:0.1];</li>
<li>}</li>
<li>@end</li>
</ol>
</div>
<p>添加完这段代码之后，同时将第三步实现的方法中被注释掉的代码恢复，也就是即使locationServicesEnabled等于false也调用startUpdatingLocation方法，这样程序就可以在模拟器中正常运行了。但是注意的是，这时候获取的当前位置就是是上面代码中你自己所设定的经纬度值。</p>
<p>整个过程都十分简单，因为大部分工作都被封装起来了。</p>
<p>获得当前位置之后，就可以在地图上显示，下篇文章将会谈谈如何用地图显示地理信息，包括自定义Annotation。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/whaomian.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/whaomian.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/whaomian.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/whaomian.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/whaomian.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/whaomian.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/whaomian.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/whaomian.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/whaomian.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/whaomian.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/whaomian.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/whaomian.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/whaomian.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/whaomian.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=17&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://whaomian.wordpress.com/2011/09/23/%e5%88%a9%e7%94%a8corelocation%e8%8e%b7%e5%8f%96%e5%9c%b0%e7%90%86%e4%bd%8d%e7%bd%ae%e4%bb%a5%e5%8f%8a%e5%a6%82%e4%bd%95%e5%9c%a8%e6%a8%a1%e6%8b%9f%e5%99%a8%e8%bf%9b%e8%a1%8c%e8%b0%83%e8%af%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cee44f6882b5b5bf69f1470ee782bbd2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">whaomian</media:title>
		</media:content>
	</item>
		<item>
		<title>《getting real》摘抄之一</title>
		<link>http://whaomian.wordpress.com/2011/09/23/%e3%80%8agetting-real%e3%80%8b%e6%91%98%e6%8a%84%e4%b9%8b%e4%b8%80/</link>
		<comments>http://whaomian.wordpress.com/2011/09/23/%e3%80%8agetting-real%e3%80%8b%e6%91%98%e6%8a%84%e4%b9%8b%e4%b8%80/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 02:58:35 +0000</pubDate>
		<dc:creator>whaomian</dc:creator>
				<category><![CDATA[创业思考]]></category>
		<category><![CDATA[文章转载]]></category>

		<guid isPermaLink="false">http://whaomian.wordpress.com/?p=12</guid>
		<description><![CDATA[在项目没有进展没有头绪，在和整个team做头脑风暴做到精疲力尽的时候，开始读读《getting real》。 《getting real》是大名鼎鼎的软件工作室37signals的工作笔记的总结。之所以我将之成为他们的工作笔记，是因为整本书是以他们多个成功的软件作为阐述的例子。这些都是活生生的例子，很不错。 我并不是全部赞同里面的所有观点，但是对于绝大部分，对于我们这个十分十分小的创始团队来说，是十分正确的，特别是当我们遵循“less”原则不断砍去我们产品中看似很酷其实毫无必要的功能从而慢慢看到一丝产品的希望时。 下面是对一部分《getting real》的一部分摘抄，觉得是对我们团队有用的。当然，对你，对你们团队可能毫无用处。 《getting real》摘抄之一： 那怎样才是有效的方法呢？答案是：做少。靠做得比对方少来打败他。解决简单的问题，把繁复困难棘手的问题留给大众。不做更多，相反的我们做的更少。不赶超，相反的我们试着退一步，守后。 &#8212;&#8212;- 一个很好的做软件的方式就是一开始用它来解决你自己的问题。由于你自己变成了软件的目标受众因此你会知道什么是重要的什么不是。这样做下去将会是推出一个突破性产品的伟大起始点。 当你在做软件解决你自己问题的时候，你创造的工具是你对之有激情的。那激情就是关键所在。激情意味着你真正去用这个软件，去关心这个软件。这是能感动他人并一起为之所动的最好的方式。 &#8212;&#8212;- 做一个比预计要小巧些的好东西比做一个庞大平庸而又漏洞百出的东西要现实的多。 范围缩小些。做半个产品比做半拉子的产品好。 &#8212;&#8212;- 你能从敌人那里得到的一个好处就是：一个非常清晰的营销理念。人们很容易被冲突对立挑动。并且通过把一个产品和另一个作比较能更多地了解这个产品。选中了这么一个敌人，你给人们灌输了他们想要知道的对立的信息。这样一来，他们不仅能更好更快地认识你的产品，也会站到你的这边。这是一个吸引注意力和引发产品倾向性的一个万无一失的方法。过分地去分析其他产品会慢慢限制你的思维想像力。很快地看一下他们在做什么，然后就要回到你自己地理念和理想上来。 &#8212;&#8212;- 如果你做这个软件一点不兴奋，那就是什么地方出了问题了。如果你只为了赶紧抢点钱做掉它，那这种影响会出现在最终产品上。同样地，如果你满怀热情地去做它，结果也会反映在产品上。人们是能够分辨出个中的区别的。 &#8230;<p><a href="http://whaomian.wordpress.com/2011/09/23/%e3%80%8agetting-real%e3%80%8b%e6%91%98%e6%8a%84%e4%b9%8b%e4%b8%80/">Continue reading &#187;</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=12&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>在项目没有进展没有头绪，在和整个team做头脑风暴做到精疲力尽的时候，开始读读<a href="http://gettingreal.37signals.com/">《getting real》</a>。</p>
<p>《getting real》是大名鼎鼎的软件工作室<a href="http://37signals.com/">37signals</a>的工作笔记的总结。之所以我将之成为他们的工作笔记，是因为整本书是以他们多个成功的软件作为阐述的例子。这些都是活生生的例子，很不错。</p>
<p>我并不是全部赞同里面的所有观点，但是对于绝大部分，对于我们这个十分十分小的创始团队来说，是十分正确的，特别是当我们遵循“less”原则不断砍去我们产品中看似很酷其实毫无必要的功能从而慢慢看到一丝产品的希望时。</p>
<p>下面是对一部分《getting real》的一部分摘抄，觉得是对我们团队有用的。当然，对你，对你们团队可能毫无用处。</p>
<p><img src="http://gettingreal.37signals.com/images/homecover.jpg" alt="" /></p>
<p>《getting real》摘抄之一：</p>
<h2>那怎样才是有效的方法呢？答案是：做少。靠做得比对方少来打败他。解决简单的问题，把繁复困难棘手的问题留给大众。不做更多，相反的我们做的更少。不赶超，相反的我们试着退一步，守后。</h2>
<p>&#8212;&#8212;-</p>
<h2>一个很好的做软件的方式就是一开始用它来解决你自己的问题。由于你自己变成了软件的目标受众因此你会知道什么是重要的什么不是。这样做下去将会是推出一个突破性产品的伟大起始点。</h2>
<p>当你在做软件解决你自己问题的时候，你创造的工具是你对之有激情的。那激情就是关键所在。激情意味着你真正去用这个软件，去关心这个软件。这是能感动他人并一起为之所动的最好的方式。</p>
<p>&#8212;&#8212;-</p>
<p>做一个比预计要小巧些的好东西比做一个庞大平庸而又漏洞百出的东西要现实的多。</p>
<p>范围缩小些。做半个产品比做半拉子的产品好。</p>
<p>&#8212;&#8212;-</p>
<p>你能从敌人那里得到的一个好处就是：一个非常清晰的营销理念。人们很容易被冲突对立挑动。并且通过把一个产品和另一个作比较能更多地了解这个产品。选中了这么一个敌人，你给人们灌输了他们想要知道的对立的信息。这样一来，他们不仅能更好更快地认识你的产品，也会站到你的这边。这是一个吸引注意力和引发产品倾向性的一个万无一失的方法。过分地去分析其他产品会慢慢限制你的思维想像力。很快地看一下他们在做什么，然后就要回到你自己地理念和理想上来。</p>
<p>&#8212;&#8212;-</p>
<p>如果你做这个软件一点不兴奋，那就是什么地方出了问题了。如果你只为了赶紧抢点钱做掉它，那这种影响会出现在最终产品上。同样地，如果你满怀热情地去做它，结果也会反映在产品上。人们是能够分辨出个中的区别的。</p>
<p>&#8212;&#8212;-</p>
<p>改变是你最好的朋友，改变的代价越大，你越不可能做出改变。如果你的竞争对手可以比你更快的改变，你会处于一个很大的劣势。如果改变变得过于昂贵，你已经死了。</p>
<p>请记住：所有的现金，所有的营销策略，所有的世界上的优秀人物，都买不到小带来的敏捷。</p>
<p>对于产品的1.0版本，请从只有三个人开始。三是一个魔力数字，提供足够人力的同时允许你保持流畅和敏捷。从一个开发者，一个设计者，和一个清道夫（一个可以在开发和设计中随意切换的人）开始。</p>
<p>&#8212;&#8212;-</p>
<p>竭尽全力将你的软件定位在一个点上。你的软件代表的是什么？它到底是有关什么的？在你开始设计或写任何代码之前你必须清楚地知道你做这个产品的目的 — 它的前景。把理想放大些。为什么要有它？它和其他类似产品不同的地方在哪里？</p>
<p>你的理念必须是简洁的。应该一句话就能把想法传达到。</p>
<p>&#8212;&#8212;-</p>
<p>别在第一周就担心标题字体的大小。不需要在第二周就搞定什么是最佳的绿色的色调。更不用在第三周就要把“提交”按钮向右移动三个像素。先把该放的东西放上去。然后去用它。保证它是可用的。最后才去把它调整到完美。</p>
<p>细节是在你使用的过程中才会显露出来的。只有在使用中你才能看到什么需要进一步关注。在使用中你才会感到缺了些什么。常常走路绊倒脚你才会清楚地上什么坑洼是需要填补的。那些是当你被迫要留意的时候才需要的细节，不是一想到细节就去搞定它。</p>
<p>永远，都要从大到小去做。</p>
<p>&#8212;&#8212;-</p>
<p>找到你产品的核心市场然后就专注进去</p>
<p>顾客并不总是对的。现实中你要能分辨出谁是你该针对的顾客，谁是你该放弃的。庆幸的是，互联网使得发掘有共识的顾客的过程变得无比容易。</p>
<p>如果你想讨好每个人那么你什么人也讨好不了。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/whaomian.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/whaomian.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/whaomian.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/whaomian.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/whaomian.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/whaomian.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/whaomian.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/whaomian.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/whaomian.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/whaomian.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/whaomian.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/whaomian.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/whaomian.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/whaomian.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=12&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://whaomian.wordpress.com/2011/09/23/%e3%80%8agetting-real%e3%80%8b%e6%91%98%e6%8a%84%e4%b9%8b%e4%b8%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cee44f6882b5b5bf69f1470ee782bbd2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">whaomian</media:title>
		</media:content>

		<media:content url="http://gettingreal.37signals.com/images/homecover.jpg" medium="image" />
	</item>
		<item>
		<title>如何利用Delegate来实现两个View之间的传值</title>
		<link>http://whaomian.wordpress.com/2011/09/23/%e5%a6%82%e4%bd%95%e5%88%a9%e7%94%a8delegate%e6%9d%a5%e5%ae%9e%e7%8e%b0%e4%b8%a4%e4%b8%aaview%e4%b9%8b%e9%97%b4%e7%9a%84%e4%bc%a0%e5%80%bc/</link>
		<comments>http://whaomian.wordpress.com/2011/09/23/%e5%a6%82%e4%bd%95%e5%88%a9%e7%94%a8delegate%e6%9d%a5%e5%ae%9e%e7%8e%b0%e4%b8%a4%e4%b8%aaview%e4%b9%8b%e9%97%b4%e7%9a%84%e4%bc%a0%e5%80%bc/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 02:56:16 +0000</pubDate>
		<dc:creator>whaomian</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-C]]></category>
		<category><![CDATA[技术总结]]></category>

		<guid isPermaLink="false">http://whaomian.wordpress.com/?p=10</guid>
		<description><![CDATA[两个View之间的传值可以有多种方式。但本人觉得最合理最自然并且最安全的方式是通过Delegate方式。 设想一个场景： 1. 有两个View，分别是A和B。 2. 点击A中的某个按钮，出来B。 3. 对B做某些操作（比如输入文字到textField，选择picker等等）。 4. 然后点击B中的确定按钮，将在B中进行的操作所产生的数据传递给A。 这种应用场景在编写iPhone App应用的时候是十分常见的，比如利用modelview来进行某些条件的选择，进行注册操作等等。下面具体说说利用Delegate是如何将View B中的数据传递回View A。 第一步： 在B类的类定义之前加入一下代码，定义一个delegate： @protocol ViewBControllerDelegate &#60;NSObject&#62; - (void) viewAWillDoThisAction:(UIViewController *) currentView; @end 这个delegate定义了一个方法，所有实现了这个delegate的类都必须实现这个方法。 &#8230;<p><a href="http://whaomian.wordpress.com/2011/09/23/%e5%a6%82%e4%bd%95%e5%88%a9%e7%94%a8delegate%e6%9d%a5%e5%ae%9e%e7%8e%b0%e4%b8%a4%e4%b8%aaview%e4%b9%8b%e9%97%b4%e7%9a%84%e4%bc%a0%e5%80%bc/">Continue reading &#187;</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=10&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>两个View之间的传值可以有多种方式。但本人觉得最合理最自然并且最安全的方式是通过Delegate方式。</p>
<p>设想一个场景：</p>
<p>1. 有两个View，分别是A和B。</p>
<p>2. 点击A中的某个按钮，出来B。</p>
<p>3. 对B做某些操作（比如输入文字到textField，选择picker等等）。</p>
<p>4. 然后点击B中的确定按钮，将在B中进行的操作所产生的数据传递给A。</p>
<p>这种应用场景在编写iPhone App应用的时候是十分常见的，比如利用modelview来进行某些条件的选择，进行注册操作等等。下面具体说说利用Delegate是如何将View B中的数据传递回View A。</p>
<p>第一步：</p>
<p>在B类的类定义之前加入一下代码，定义一个delegate：</p>
<div>
<div></div>
<ol start="1">
<li>@protocol ViewBControllerDelegate &lt;NSObject&gt;</li>
<li>- (void) viewAWillDoThisAction:(UIViewController *) currentView;</li>
<li>@end</li>
</ol>
</div>
<p>这个delegate定义了一个方法，所有实现了这个delegate的类都必须实现这个方法。</p>
<p>然后再在B类的类定义中添加一个member，加入以下代码：</p>
<div>
<div></div>
<ol start="1">
<li>NSObject&lt;FilterSpotsViewControllerDelegate&gt; *view_A;</li>
</ol>
</div>
<p>从名字来看，就知道待会这个值会被赋予View A。</p>
<p>第二步：</p>
<p>让A类实现ViewBControllerDelegate：</p>
<div>
<ol start="1">
<li>@interface ViewAController : UIViewController &lt;ViewBControllerDelegate&gt;</li>
</ol>
</div>
<p>并且让A类实现方法viewAWillDoThisAction：</p>
<div>
<ol start="1">
<li>- (void) viewAWillDoThisAction:(UIViewController *) view_B {</li>
<li>   //利用view_B来传值。如self.a = view_B.a;</li>
<li>}</li>
</ol>
</div>
<p>上面代码中，将会在B类中将B类自己（self）的指针传递给view_B（见下面第四步）。这样就可以把B类的数据传递给A类了。</p>
<p>第三步：</p>
<p>就如我之前所说的，View A点某个按钮之后，出现View B。假设这个按钮对应的方法是“-(void) pushViewB: (id) sender&#8221;。那么应在这个方法中将A类自身的指针（self）传递给之前第一步在B类中定义的成员变量View_A：</p>
<div>
<ol start="1">
<li>-(void) pushViewB: (id) sender {</li>
<li>    //初始化一个B类，view_B</li>
<li>    view_B.view_A = self;   //赋值</li>
<li>    //推出View B</li>
<li>}</li>
</ol>
</div>
<p>第四步：</p>
<p>在B类，假设在View B中做完所有操作之后，点击确定按钮，返回View A，并将数据传回给view A。假设这个确定按钮的方法是-(void)done: (id) sender。那么需要在这个方法中调用A类实现的viewAWillDoThisAction：</p>
<div>
<ol start="1">
<li>-(void) done: (id) sender {</li>
<li>[self.view_A viewAWillDoThisAction:self];</li>
<li>//返回View A</li>
<li>}</li>
</ol>
</div>
<p>上面代码注意两个问题：第一是调用view A的实现了delegate的方法，第二是将自身的指针传递给view A的方法，以方便view A能取到view B的数据。</p>
<p>以上就是整个利用delegate机制来进行两个view之间的传值的过程。这里注意一点：这两个view之间是有关系的（view A推出view B，从view B推出view A）。对于两个完全没有关系的view，如何传值呢？理论上利用delegate也是可以的，但并不是最好的方法。最好的方法是利用NSNotification，留到日后再说。</p>
<p>多嘴一点，其实说是利用delegate的方式来传值，其本质是传递类的指针来进行类成员的传值（实现了delegate的类A将自身传给了类B，然后类B又将自身传回去给类A），之所以用到delegate的机制，只不过是为了说明这个顺序：当B进行了某个操作的时候，需要A去做另外一件事。这就是delegate的本质。也就是我文章开头所说“最合理最自然”的原因。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/whaomian.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/whaomian.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/whaomian.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/whaomian.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/whaomian.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/whaomian.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/whaomian.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/whaomian.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/whaomian.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/whaomian.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/whaomian.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/whaomian.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/whaomian.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/whaomian.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=10&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://whaomian.wordpress.com/2011/09/23/%e5%a6%82%e4%bd%95%e5%88%a9%e7%94%a8delegate%e6%9d%a5%e5%ae%9e%e7%8e%b0%e4%b8%a4%e4%b8%aaview%e4%b9%8b%e9%97%b4%e7%9a%84%e4%bc%a0%e5%80%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cee44f6882b5b5bf69f1470ee782bbd2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">whaomian</media:title>
		</media:content>
	</item>
		<item>
		<title>记录创业路上的点点滴滴</title>
		<link>http://whaomian.wordpress.com/2011/09/23/8/</link>
		<comments>http://whaomian.wordpress.com/2011/09/23/8/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 02:52:13 +0000</pubDate>
		<dc:creator>whaomian</dc:creator>
				<category><![CDATA[创业思考]]></category>

		<guid isPermaLink="false">http://whaomian.wordpress.com/?p=8</guid>
		<description><![CDATA[八月一号正式全职创业。 有关自助游的一个移动互联网产品。 这个博客将记录创业路上的点点滴滴。包括创业的思考，包括技术的总结，等等等等。 希望做到每日一博。 无论创业成败与否，至少能给自己留点足迹。 如果这些文章能对他人有所帮助，哪怕是小小的帮助，那就更好不过了。 另外，博客页面的headimage会是我看过的比较喜欢的电影海报，会不定期更换。说不定还可以找到知音。第一幅便是我这三年看过的觉得是最好的五步电影之一《batman-the dark knight》。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=8&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>八月一号正式全职创业。</p>
<p>有关自助游的一个移动互联网产品。</p>
<p>这个博客将记录创业路上的点点滴滴。包括创业的思考，包括技术的总结，等等等等。</p>
<p>希望做到每日一博。</p>
<p>无论创业成败与否，至少能给自己留点足迹。</p>
<p>如果这些文章能对他人有所帮助，哪怕是小小的帮助，那就更好不过了。</p>
<p>另外，博客页面的headimage会是我看过的比较喜欢的电影海报，会不定期更换。说不定还可以找到知音。第一幅便是我这三年看过的觉得是最好的五步电影之一《batman-the dark knight》。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/whaomian.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/whaomian.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/whaomian.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/whaomian.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/whaomian.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/whaomian.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/whaomian.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/whaomian.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/whaomian.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/whaomian.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/whaomian.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/whaomian.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/whaomian.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/whaomian.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=whaomian.wordpress.com&amp;blog=10580780&amp;post=8&amp;subd=whaomian&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://whaomian.wordpress.com/2011/09/23/8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cee44f6882b5b5bf69f1470ee782bbd2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">whaomian</media:title>
		</media:content>
	</item>
	</channel>
</rss>
