<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_杨鑫奇的技术博客</title><subtitle type="text">热衷开源,积极分享！</subtitle><id>http://feed.cnblogs.com/blog/u/22996/rss</id><updated>2012-01-21T07:15:53Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/22996/rss"/><entry><id>http://www.cnblogs.com/scotoma/archive/2012/01/21/2328554.html</id><title type="text">回首这一年,其实我还是一样！</title><summary type="text">年终了写个总结，给自己一个展望，其实不管生活如何，最终在于自己对生活的体验，自己想的好，才是真的好!控制自己，做自己想做的事情，幸福感就会增加了，开心起来所有的都会变的很好！</summary><published>2012-01-21T07:15:00Z</published><updated>2012-01-21T07:15:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2012/01/21/2328554.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2012/01/21/2328554.html"/><content type="html">&lt;p&gt;回首这一年,其实我还是一样！&lt;/p&gt;&#xD;
&lt;p&gt;又是一年的年终总结，明天就是除夕了，写写年终总结，总结总结下今年自己所想所做的，为自己做一个规划吧！&lt;/p&gt;&#xD;
&lt;p&gt;回首这一年，其实我还是一样，性格没有变，做事方式也是，工作是为了生活，生活总体来说还是可以的，可以给自己的幸福指数打个60分！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;梦想这东西&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;今年一年自己做的事情中，最值得欣慰的事情就是发布了buddy framework虽然没有正式名义上的发布，但是对于我来说，还是感觉它是我最大的成果&lt;br /&gt;做为程序员，能够积累自己的代码，进行总结，能够作出自己想要的功能，而且能够有好的工作效率，这些就足够了。&lt;/p&gt;&#xD;
&lt;p&gt;在则就是基于buddy框架之上的我是买家，我是买家到现在已经快三年了，3年里面上了2个版本，开源了代码，离正式的运作也越来越近了，它是我一直以来倾力所为之努力的东西，也是梦想的载体。&lt;br /&gt;现在的我是买家，有170+的朋友在关注它，关注它的发展，也有不少朋友加入了我是买家的虚拟团队，在支持着我是买家项目，这个是对我最大的认可，我会继续把这个事情做下去的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;生活就是这么的匪夷所思&lt;/strong&gt;&lt;br /&gt;今年我结婚了，老婆是老家的，虽然认识只有1年，还是进行跨国的恋爱，但是福清人特有的气质和想法已经深深的融合了，让我们走到了一起。没有计划的今年结婚，终于也成家了，其实遇到对的人，就会有幸福的感觉。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;人生的路口&lt;/strong&gt;&lt;br /&gt;今年也做了一个重要的决定，离开北京，出国，义无反顾的去了，做好准备，好好的出发吧！&lt;br /&gt;从2012年起，一切的一切又要重新开始了，但是今年我有了目标，之前所经历过的一切已不在重要，其他的，做了很多也学到了，交了很多的学费，学费是高昂的但是也明白了很多。&lt;br /&gt;其实语言还是很重要的，专业技术能力也要依赖于语言才能很好的发挥出来，这样就能够将自己的状态发挥到最好了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;工作&lt;/strong&gt;&lt;br /&gt;对于工作，今年没有什么好说的了，最终的选择是离开，经过这一年多来的经历已经深深的感受到了。一年间换了4个部门，做的项目也是一直在换，貌似技术上也没有什么提升，决定了就走出来，走自己的路了。&lt;br /&gt;深刻的感受到开发者只是一种工具的悲哀，其实依然还是那样的，做自己不喜欢做的事情，最终只有离开。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;新年展望&lt;/strong&gt;&lt;br /&gt;头等大事&lt;br /&gt;宝宝顺利的生下来，我会好好的教你的，会让你每天快快乐乐的。&lt;/p&gt;&#xD;
&lt;p&gt;接下来&lt;br /&gt;我的签证能够顺利的下来，所想的路线能够一步一步的走好。&lt;/p&gt;&#xD;
&lt;p&gt;接下来&lt;br /&gt;学好英语和日语，在大一的时候，教我的计算机老师沈建荣老师就告诫过我，说技术其实真的不重要，你的社交能力和你的外语才是最重要的，他在上学的时候同班的女同学技术不好但是语言能力好，现在在美国大公司做一个高管，可是自己却在这边一直研究技术做一个副教授，一直到现在。差距是很大的，那个时候就已经告诫过我了，可是这么多年来，其实我都隐隐的意识到这些问题，可是我还是依旧沉溺与技术之中，写一个类，写一些东西，然后拿出去分享，会感觉到由衷的高兴。&lt;br /&gt;也许这个就是技术人员的偏执吧！现在真的应该清醒了，应该现在去努力还来得及。&lt;/p&gt;&#xD;
&lt;p&gt;接下来&lt;br /&gt;我是买家项目正式上线进入实际的运营阶段，经过近3年的积累，不管是用户的关注度，还是一直和我一起奋斗的大家，我都会好好的把这个网站做起来的不会辜负大家对我的期望的。&lt;/p&gt;&#xD;
&lt;p&gt;接下来&lt;br /&gt;我会继续的写文章，今年的文章数是少之又少，我会继续努力的，将自己的所学分享出来，感谢技术上指导过我的大家，我会尽自己的能力，去帮助需要帮助的人，今年也做的不错，在QQ上帮助了20+以上的朋友解决了他们遇到的问题，我做的事情还是有价值的。&lt;/p&gt;&#xD;
&lt;p&gt;最后，感谢帮助我的兄弟们，光哥，振哥，琛，彭兄，还有我的父母,弟弟和老婆，感谢大家，我会很努力很努力的去做事情的!你们的幸福是我一直的追求！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/2328554.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2012/01/21/2328554.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/scotoma/archive/2011/12/05/2276291.html</id><title type="text">[智能架构系列]Buddy框架图片文件云存储模块实现</title><summary type="text">Buddy智能框架图片文件云存储模块实现,使用云存储,降低运维费用,提供站点图片的访问速度,那就快点使用upyun.com吧！HTTP REST接口方便存储且价格还算低廉,推荐使用！</summary><published>2011-12-04T16:31:00Z</published><updated>2011-12-04T16:31:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2011/12/05/2276291.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2011/12/05/2276291.html"/><content type="html">&lt;p&gt;&lt;br /&gt;[智能架构系列]Buddy框架图片文件云存储模块实现&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;引子&lt;br /&gt;最近很久没有写文章了，主要是忙于公司的项目，也给自己一个深度挖掘的方向，另外生活也出现了很大的变动，现在终于憋不住了。订阅技术博文是技术者必须做的一件事情，每天打开google reader总是会有所发现有所惊喜继而是感慨。本次主要来介绍下图片的云存储方面的技术实现，不管是对于云技术实践，还是降低相关的运维成本，都是很有效果的，不信就往下看吧！&lt;/p&gt;&#xD;
&lt;p&gt;关键字：图片云存储 又拍云存储 PHP图片存储 廉价高速图片存储&lt;/p&gt;&#xD;
&lt;p&gt;正文&lt;br /&gt;上周看了磊哥的文章 又拍云实战 &lt;a href="http://www.blogkid.net/archives/2782.html" target="_blank"&gt;http://www.blogkid.net/archives/2782.html&lt;/a&gt; 后很有收获就觉得去试试又拍云存储的服务&lt;a href="http://www.upyun.com/" target="_blank"&gt;http://www.upyun.com/&lt;/a&gt;，就去注册然后申请试用了。&lt;br /&gt;本次upyun.com的认证方式很让我意外，竟然是客服打电话过来确认，这点服务感觉还是挺好的，从这里感觉还是蛮重视用户的。特别要说的是，今天是星期天我又在这里宣传upyun.com的服务，就和同事说了下，结果他去注册了，竟然在半小时后就接到了客服人员的电话了，感觉这个确认还是很及时的，体验很好，这点感觉还是很不错的。&lt;br /&gt;试用就开始吧，为什么要试用又拍云存储服务呢？这点磊哥的文章中就已经说的很清楚了，这里我做归纳补充下：&lt;br /&gt;1,图片服务器的托管及运维费用挺高的,而且峰值带宽觉得了大部分成本，且运维的软硬成本增大&lt;br /&gt;2，单机达不到CDN功效，需要CDN支持的话，花费就更大了&lt;br /&gt;3，图片的处理及图片的缓存，需要配置nginx的静态缓存图片，需要做系统设计扩展图片类的保存图片及缩略图功能&lt;br /&gt;4，图片的备份，对于图片的备份是个问题需要用rsync同步到备份机器，添加了运维成本和开发成本&lt;/p&gt;&#xD;
&lt;p&gt;基于以上原因，自己开发及部署图片服务的代价还是很大的，所以这个也是极力推荐使用又拍云存储www.upyun.com的原因了，至于大家说的upyun.com是否稳定，磊哥提到的猛买网用了2个月还是没问题的，我也相信@gofeeling和又拍的技术实力的。&lt;br /&gt;如何申请及开通就请详细参看磊哥的博文吧，本篇主要更细致化的讲解技术实现。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;首先，设计表结构&lt;br /&gt;id,filename,desc,createtime,status,remoteurl,url,model,user_id&lt;br /&gt;本次主要用到的字段有 filename 及 model &lt;br /&gt;构造图片的访问地址 $staticUrl / $model / $filename &lt;br /&gt;例如： http://img001.img.woshimaijia.com/user/testuser.jpg&lt;br /&gt;考虑到图片表可能进行分表，这里的id使用了 17位的bigint 时间递增&lt;/p&gt;&#xD;
&lt;p&gt;其次，完善图片类&lt;br /&gt;首先图片的处理流程分为如下&lt;br /&gt;1.用户从表单中上传的图片&lt;br /&gt;2.已经上传的图片&lt;br /&gt;现在这2部分的图片都需要迁移到又拍云存储中，而且都需要做本地进行备份。&lt;br /&gt;所以处理的逻辑如下&lt;br /&gt;用户上传 --&amp;gt; 图片保存到WebServer --&amp;gt; 调用ImageUpload类将图片上传到upyun.com --&amp;gt; 更新数据库表&lt;br /&gt;图片读取 --&amp;gt; 获取图片id集合 --&amp;gt; 调用getImage方法拼接URL --&amp;gt; 返回图片URL&lt;/p&gt;&#xD;
&lt;p&gt;下午调试了下实现了一些HTTP REST的图片使用类，主要包含了&lt;br /&gt;上传，下载，删除，查看使用空间&lt;br /&gt;具体代码如下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;?php&#xD;
// +----------------------------------------------------------------------&#xD;
// | Buddy Framework&#xD;
// +----------------------------------------------------------------------&#xD;
// | Copyright (c) 2011 http://buddy.woshimaijia.com All rights reserved.&#xD;
// +----------------------------------------------------------------------&#xD;
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )&#xD;
// +----------------------------------------------------------------------&#xD;
// | Author: xinqiyang &amp;lt;xinqiyang@gmail.com&amp;gt;&#xD;
// +----------------------------------------------------------------------&#xD;
/**&#xD;
 * Image Upload service&#xD;
 * use upaiyun.com image service&#xD;
 * 使用了又拍云存储的图片服务&#xD;
 * @author xinqiyang&#xD;
 *&#xD;
 */&#xD;
class ImageUpload&#xD;
{&#xD;
	protected $_config = array();&#xD;
	public function __construct()&#xD;
	{&#xD;
		$this-&amp;gt;_config = C('imageservice');&#xD;
	}&#xD;
&#xD;
	/**&#xD;
	 * update file to upaiyun.com&#xD;
	 * 上传图片保存到又拍云存储网&#xD;
	 * @param unknown_type $object&#xD;
	 * @param unknown_type $filename&#xD;
	 * @param unknown_type $path&#xD;
	 */&#xD;
	public function put($object,$filename,$path)&#xD;
	{&#xD;
		$postField = file_get_contents((realpath($path)));&#xD;
		$process = curl_init($this-&amp;gt;_config['api'].'/'.$this-&amp;gt;_config['bucketname'].'/'.$object.'/'.$filename);&#xD;
		curl_setopt($process, CURLOPT_POST, 1);&#xD;
		curl_setopt($process, CURLOPT_POSTFIELDS, $postField);&#xD;
		curl_setopt($process, CURLOPT_USERPWD, $this-&amp;gt;_config['username'].':'.$this-&amp;gt;_config['userpass']);&#xD;
		curl_setopt($process, CURLOPT_HTTPHEADER, array('Expect:', "Mkdir:true"));&#xD;
		curl_setopt($process, CURLOPT_HEADER, 0);&#xD;
		curl_setopt($process, CURLOPT_TIMEOUT, 30);&#xD;
		curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);&#xD;
		curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);&#xD;
		$result = curl_exec($process);&#xD;
		$code = curl_getinfo($process, CURLINFO_HTTP_CODE);&#xD;
		curl_close($process);&#xD;
		return array('code'=&amp;gt;$code,'info'=&amp;gt;$result);&#xD;
	}&#xD;
&#xD;
	public  function get($object,$filename)&#xD;
	{&#xD;
		$process = curl_init($this-&amp;gt;_config['api'].'/'.$this-&amp;gt;_config['bucketname'].'/'.$object.'/'.$filename);&#xD;
		curl_setopt($process, CURLOPT_USERPWD, $this-&amp;gt;_config['username'].':'.$this-&amp;gt;_config['userpass']);&#xD;
		curl_setopt($process, CURLOPT_HEADER, 0);&#xD;
		curl_setopt($process, CURLOPT_TIMEOUT, 30);&#xD;
		curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);&#xD;
		curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);&#xD;
		$result = curl_exec($process);&#xD;
		$code = curl_getinfo($process, CURLINFO_HTTP_CODE);&#xD;
		curl_close($process);&#xD;
		return array('code'=&amp;gt;$code,'info'=&amp;gt;$result);&#xD;
	}&#xD;
&#xD;
	public  function delete($object,$filename)&#xD;
	{&#xD;
		$process = curl_init($this-&amp;gt;_config['api'].'/'.$this-&amp;gt;_config['bucketname'].'/'.$object.'/'.$filename);&#xD;
		curl_setopt($process, CURLOPT_CUSTOMREQUEST, 'DELETE');&#xD;
		curl_setopt($process, CURLOPT_USERPWD, $this-&amp;gt;_config['username'].':'.$this-&amp;gt;_config['userpass']);&#xD;
		curl_setopt($process, CURLOPT_HEADER, 0);&#xD;
		curl_setopt($process, CURLOPT_TIMEOUT, 30);&#xD;
		curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);&#xD;
		curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);&#xD;
		$result = curl_exec($process);&#xD;
		$code = curl_getinfo($process, CURLINFO_HTTP_CODE);&#xD;
		curl_close($process);&#xD;
		return array('code'=&amp;gt;$code,'info'=&amp;gt;$result);&#xD;
	}&#xD;
&#xD;
	public  function usage()&#xD;
	{&#xD;
		 $process = curl_init($this-&amp;gt;_config['api'].'/'.$this-&amp;gt;_config['bucketname'].'?usage'); &#xD;
		 curl_setopt($process, CURLOPT_USERPWD, $this-&amp;gt;_config['username'].':'.$this-&amp;gt;_config['userpass']);&#xD;
		 curl_setopt($process, CURLOPT_HEADER, 0); &#xD;
		 curl_setopt($process, CURLOPT_TIMEOUT, 30); &#xD;
		 curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); &#xD;
		 $result = curl_exec($process);&#xD;
		$code = curl_getinfo($process, CURLINFO_HTTP_CODE);&#xD;
		curl_close($process);&#xD;
		return array('code'=&amp;gt;$code,'info'=&amp;gt;$result);&#xD;
	}&#xD;
	&#xD;
	/**&#xD;
	 * save file or image to upaiyun.com then update db&#xD;
	 * 先保存数据到又拍云存储，然后在更新数据库&#xD;
	 * @param string $model&#xD;
	 * @param string $filename   保存文件名&#xD;
	 * @param mixed $streamFile  流文件或者是图片路径&#xD;
	 * @param bigint $id ID&#xD;
	 * @param bigint $user_id userid&#xD;
	 */&#xD;
	public  function save($model,$filename='',$streamFile='',$id='',$user_id)&#xD;
	{&#xD;
		$result = $this-&amp;gt;put($model, $filename,$streamFile);&#xD;
		$id = empty($id) ? objid() : $id;&#xD;
		$filename = empty($filename) ? $id : $filename;&#xD;
		if($result['code'] == 200)&#xD;
		{&#xD;
			$array = array(&#xD;
				'id'=&amp;gt;$id,&#xD;
				'filename'=&amp;gt;$filename,&#xD;
				'model'=&amp;gt;$model,&#xD;
				'status'=&amp;gt; 0,&#xD;
				'user_id'=&amp;gt;$user_id,&#xD;
			);&#xD;
			return ImageService::add($array);&#xD;
		}&#xD;
		return $result;&#xD;
	}&#xD;
	&#xD;
	//从缓存获取image表中的 model filename 然后拼接成url 返回&#xD;
	public  function  display($id)&#xD;
	{&#xD;
		$url = $this-&amp;gt;_config['url'];&#xD;
		return $this-&amp;gt;_config['url'].ImageService::getImage($id);&#xD;
	}&#xD;
&#xD;
&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;结语&lt;br /&gt;其实使用API的方式操作其实会比现在的繁琐一些，保存做WebServer上的文件只是作为一个备份文件的形式存在，等同步到备份地址后删除即可，对于同步到备份服务器后即可进行缩略图的操作，或者是通过upyun的url将用到的图片做download一份到备份服务器即可，另外又拍的存储的价格现在看来还是挺实惠的，感觉非常的不错，推荐大家试用。其他国内更多的靠谱的云产品的出现！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/2276291.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2011/12/05/2276291.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/scotoma/archive/2011/10/17/2215553.html</id><title type="text">[智能架构系列]什么是Buddy智能开发框架</title><summary type="text">buddy框架,智能具有商业价值的框架,从项目的角度来规约开发,提供一个项目的模版来给展现各种应用的实现方案</summary><published>2011-10-17T08:33:00Z</published><updated>2011-10-17T08:33:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2011/10/17/2215553.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2011/10/17/2215553.html"/><content type="html">&lt;p&gt;buddy框架，秉承国内优秀框架THINKPHP的优点并增加了很多的商业特性和集成了全版本的商业项目模块，提供给创业者一个最好的选择&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;组建图:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011101716310469.jpg" alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/2215553.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2011/10/17/2215553.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/scotoma/archive/2011/07/29/2120518.html</id><title type="text">互联网产品的本质思考及架构实现探讨</title><summary type="text">理解产品的本质，才能够把握住细节，从产品设计的角度，将产品的特性都能够展现给用户，本文从产品设计者的角度来阐述现实中的人及物之间的关联关系在系统架构设计中的映射，来阐明产品的本质，并在架构设计的时候注意现实生活中的关联关系，体现系统的特性！</summary><published>2011-07-28T16:36:00Z</published><updated>2011-07-28T16:36:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2011/07/29/2120518.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2011/07/29/2120518.html"/><content type="html">&lt;p&gt;作者：杨鑫奇&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;互联网产品的本质是什么？&lt;/p&gt;&#xD;
&lt;p&gt;作为系统的设计者，什么样的产品什么样的产品线才能够给使用者带来真正的价值呢？&lt;/p&gt;&#xD;
&lt;p&gt;最近两年来一直在思考这个问题，现在终于有一些沉淀，写下来，和大家一起探讨！&lt;/p&gt;&#xD;
&lt;p&gt;当某个时候通过一个方式页面被我们打开了，当然这里指的页面是广义上的页面，就是说我们所看到的，看到的最多的莫过于电脑上的页面，手机上的页面的页面还有其他的比如ipad等的页面，当我们看到这些的时候会想到什么我们会怎么做？我们来分析下这个过程！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先提取出这个过程中的元素&lt;/p&gt;&#xD;
&lt;p&gt;人&lt;/p&gt;&#xD;
&lt;p&gt;页面的载体（电脑/手机/ipad....)&lt;/p&gt;&#xD;
&lt;p&gt;页面，屏幕上展现出来的页面&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其次提取页面的关联关系&lt;/p&gt;&#xD;
&lt;p&gt;页面 包含了以下图示中的内容 &amp;nbsp;主要有：&lt;/p&gt;&#xD;
&lt;p&gt;载体（站点、产品、品牌、话题、群组等等）&lt;/p&gt;&#xD;
&lt;p&gt;页面中主要表现的元素，比如导航站主要是站点， 电子商务网站是商品，微博站点的话题等等&lt;/p&gt;&#xD;
&lt;p&gt;关联状态&lt;/p&gt;&#xD;
&lt;p&gt;关联状态主要是人和载体感受，比如感受 &amp;nbsp;人喜欢视频，比如人喜欢Iphone4,人购买了iphone4&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;TAG&lt;/p&gt;&#xD;
&lt;p&gt;载体和载体之间的关联，iphone4 关联关键字iphone,apple,苹果,手机 &amp;nbsp; 这样就可以实现载体和载体之间的关联&lt;/p&gt;&#xD;
&lt;p&gt;沟通&lt;/p&gt;&#xD;
&lt;p&gt;人和人之间的沟通，比如人去淘宝里面购物，需要打开旺旺和卖家沟通，或者是有客服页面，人打开客服QQ进行聊天&lt;/p&gt;&#xD;
&lt;p&gt;时间&lt;/p&gt;&#xD;
&lt;p&gt;时间维度是最重要的维度之一，随着时间的流逝，系统中会有很多的动作，需要把这些用户的动作记录下来&lt;/p&gt;&#xD;
&lt;p&gt;区域&lt;/p&gt;&#xD;
&lt;p&gt;地区维度也是最重要的维度之一，根据用户的地域区别来对数据及载体进行分类，针对地域性的规则定制&lt;/p&gt;&#xD;
&lt;p&gt;行动&lt;/p&gt;&#xD;
&lt;p&gt;用户看到载体及介绍的内容之后的行动，鼠标的滚动（拉下来看更多的信息/点击其他的按钮比如顶，赞等），键盘的输入（发布评论），跳转到其他的载体&lt;/p&gt;&#xD;
&lt;p&gt;扩展&lt;/p&gt;&#xD;
&lt;p&gt;扩展，留点扩展，让大家开动脑筋来更好的思考&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011072900033948.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我认为如果系统中能够实现以上说讲到的7个关联中的若干就能够提醒出价值，对于用户的价值。&lt;/p&gt;&#xD;
&lt;p&gt;因为在这个过程中用户能够得到想要获取的信息，能够表达出他/她想表达的思想，能够引导到用户想去的地方。&lt;/p&gt;&#xD;
&lt;p&gt;这个时候站点上也可以让用户提留，当用户在站点停留的时间越长就越体现出站点的价值。&lt;/p&gt;&#xD;
&lt;p&gt;这点是对于用户的价值，但是站在站点设计方的角度，怎么样能够在这个用户的停留的过程中，通过引导用户的行动来带来商业价值。&lt;/p&gt;&#xD;
&lt;p&gt;以上从各个关联及维度来分析，现在就来聊聊如何实现的：&lt;/p&gt;&#xD;
&lt;p&gt;架构设计图，晚上没有带工作PC回家，就用家里的电脑画了个图，大家明白就好别笑话我：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011072901271145.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;从以上图中可以看出，服务器部署主要有：&lt;/p&gt;&#xD;
&lt;p&gt;WebServer&amp;nbsp;WEB服务器，通过调用API接口来实现数据的访问， 客户端POST/GET服务到WEB服务器，调用Validate::validate() 方法进行验证，验证通过后请求到API的接口返回结果，将结果返回客户端，现实页面调用RES资源服务器和IMG图片服务器 来实现页面&lt;/p&gt;&#xD;
&lt;p&gt;WapServer WAP服务器，通过调用API接口来实现数据的访问， 客户端POST/GET服务到WAP服务器，调用Validate::validate() 方法进行验证，验证通过后请求到API的接口返回结果，将结果返回客户端&lt;/p&gt;&#xD;
&lt;p&gt;MisServer MIS运营/客服管理服务器 &amp;nbsp;通过调用API服务器的接口来实现管理&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;ApiServer&lt;/strong&gt; API服务器，站点业务逻辑部署在API服务器上面，其他的服务器调用API服务器的逻辑&lt;/p&gt;&#xD;
&lt;p&gt;WebServer/WapServer/MisServer/手机客户端 &amp;nbsp;通过访问APIServer来获取，手机客户端通过验证数据来传输，WEB/WAP/MIS服务器使用IP白名单来控制访问权限，尽量简化，提高安全性。APIServer对外提供 HTTP GET 方式来传输数据，其他前端服务器通过CURL方法访问API服务器的接口来返回数据，数据是使用json_decode后传输，后将数据返回客户端，直接返回API的直接结果。&lt;/p&gt;&#xD;
&lt;p&gt;API服务器是当前最重要的服务器，绝大部分的逻辑都是存在在API服务器，通过前端Web/Wap服务器的请求API服务器，一个WEB请求，对应N个API请求（N&amp;gt;1),所以这里需要使用CURL的multi_execute方法来执行同一次多个请求，使用CURL来进行GET请求比较稳定高效。&lt;/p&gt;&#xD;
&lt;p&gt;ResServer 资源服务器，存放 css/js/images/logo/ico图片等 2台&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;ImgServer &amp;nbsp;存储图片服务器，N台&lt;/p&gt;&#xD;
&lt;p&gt;BackEnd 后端服务，这里主要有PHP的后端服务和C的后端服务，这里也有部分逻辑，如果是PHP实现的主要逻辑就放到API中，如果是C实现的就部署在MIS服务器上，或者使用单独的服务器部署&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;后记：&lt;/p&gt;&#xD;
&lt;p&gt;谈了这么多想法和架构，最重要的就是要去实现，用事实说话，光说不做是没有用的。现在开始逐步的实现以上所说的，具体看woshimaijia 开源项目，地址：&lt;a href="https://github.com/xinqiyang/woshimaijia"&gt;https://github.com/xinqiyang/woshimaijia&lt;/a&gt;&amp;nbsp; ,实现了基本的架构基础，开发语言PHP/C 。架构要实现的是快速开发，能够实现商业价值，高性能，能够自动部署，减少运维成本等。在开发的过程中，也能够随着自己的思想不断的深入对业务的认识，从而能够螺旋的迭代，在产品的生命周期里面能够在合适的时间点上线，并开展运营，实现真正的价值。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/2120518.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2011/07/29/2120518.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/scotoma/archive/2011/07/21/2112600.html</id><title type="text">[智能架构系列]PHP获取用户IP所在地的信息</title><summary type="text">最近项目中用到了获取用户IP所在地的信息，主要是为了从IP去判断用户所在的城市，现在的城市信息基本上有分几种一种是用ID编号来关联城市的，还有使用缩写的代码来关联城市的。我们通过IP去获取所在的用户的  城市的详细信息，比如运行以下的结果得到的是 "福建省福州市 电信"可以得到用户的 省市及所使用的网络接入的信息</summary><published>2011-07-21T03:30:00Z</published><updated>2011-07-21T03:30:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2011/07/21/2112600.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2011/07/21/2112600.html"/><content type="html">&lt;div&gt;//update 20120112&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;本篇文章所涉及到的代码已经更新到了&lt;a href="http://www.cnblogs.com/scotoma/admin/%20http:/code.google.com/p/buddy/"&gt; http://code.google.com/p/buddy/&lt;/a&gt; 项目中了，大家可以从这个项目中获取代码。&lt;/div&gt;&#xD;
&lt;div&gt;Buddy 你身边的伙伴, 旨在减少我们开发者的工作,让我们有更多的时间来学感兴趣的技术,让我们有更多的时间来陪陪家人！&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;最近发现百度提供的API已经下线了，无法从API中获取地域信息了，很是郁闷，只有依赖于纯真IP库了。以下贴出代码和方法，希望对大家有所帮助&lt;/div&gt;&#xD;
&lt;div&gt;这个需要下载存在IP库，然后将在构造方法里面修改文件所在的位置就好了&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&amp;lt;?php&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; +----------------------------------------------------------------------&lt;br /&gt;// | Buddy Framework &lt;br /&gt;// +----------------------------------------------------------------------&lt;br /&gt;// | Copyright (c) 2011 http://buddy.woshimaijia.com/ All rights reserved.&lt;br /&gt;// +----------------------------------------------------------------------&lt;br /&gt;// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )&lt;br /&gt;// +----------------------------------------------------------------------&lt;br /&gt;// | Author: xinqiyang &amp;lt;xinqiyang@gmail.com&amp;gt;&lt;br /&gt;// +----------------------------------------------------------------------&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt; *  IP location Query class &lt;br /&gt; *  &amp;lt;code&amp;gt;&lt;br /&gt; *  $ip = Iplocation::instance();&lt;br /&gt; *    $r = $ip-&amp;gt;getlocation('123.120.1.160');&lt;br /&gt; *    &amp;lt;/code&amp;gt;&lt;br /&gt; *    &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Iplocation&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * QQWry.Dat file point&lt;br /&gt;     *&lt;br /&gt;     * @var resource&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #800080;"&gt;$fp&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * first ip &lt;br /&gt;     *&lt;br /&gt;     * @var int&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #800080;"&gt;$firstip&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * last address&lt;br /&gt;     *&lt;br /&gt;     * @var int&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #800080;"&gt;$lastip&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * total ip count&lt;br /&gt;     *&lt;br /&gt;     * @var int&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #800080;"&gt;$totalip&lt;/span&gt;;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * construct&lt;br /&gt;     *&lt;br /&gt;     * @param string $filename&lt;br /&gt;     * @return IpLocation&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; __construct(&lt;span style="color: #800080;"&gt;$filename&lt;/span&gt;='QQWry.Dat') {&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp = 0;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; ((&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp = &lt;span style="color: #008080;"&gt;fopen&lt;/span&gt;(&lt;span style="color: #008080;"&gt;dirname&lt;/span&gt;(&lt;span style="color: #ff00ff;"&gt;__FILE__&lt;/span&gt;).DIRECTORY_SEPARATOR.'Resource/'.&lt;span style="color: #800080;"&gt;$filename&lt;/span&gt;, 'rb')) !== &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;) {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;firstip = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong();&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;lastip = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong();&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;totalip = (&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;lastip - &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;firstip) / 7;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * getlong&lt;br /&gt;     *&lt;br /&gt;     * @access private&lt;br /&gt;     * @return int&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; getlong() {&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$result&lt;/span&gt; = &lt;span style="color: #008080;"&gt;unpack&lt;/span&gt;('Vlong', &lt;span style="color: #008080;"&gt;fread&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, 4));&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;$result&lt;/span&gt;['long'];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * return 3 bit&lt;br /&gt;     * @access private&lt;br /&gt;     * @return int&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; getlong3() {&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$result&lt;/span&gt; = &lt;span style="color: #008080;"&gt;unpack&lt;/span&gt;('Vlong', &lt;span style="color: #008080;"&gt;fread&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, 3).&lt;span style="color: #008080;"&gt;chr&lt;/span&gt;(0));&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;$result&lt;/span&gt;['long'];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * return packip address&lt;br /&gt;     *&lt;br /&gt;     * @access private&lt;br /&gt;     * @param string $ip&lt;br /&gt;     * @return string&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; packip(&lt;span style="color: #800080;"&gt;$ip&lt;/span&gt;) {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #008080;"&gt;pack&lt;/span&gt;('N', &lt;span style="color: #008080;"&gt;intval&lt;/span&gt;(&lt;span style="color: #008080;"&gt;ip2long&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$ip&lt;/span&gt;)));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * return read string&lt;br /&gt;     *&lt;br /&gt;     * @access private&lt;br /&gt;     * @param string $data&lt;br /&gt;     * @return string&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; getstring(&lt;span style="color: #800080;"&gt;$data&lt;/span&gt; = "") {&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$char&lt;/span&gt; = &lt;span style="color: #008080;"&gt;fread&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, 1);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (&lt;span style="color: #008080;"&gt;ord&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$char&lt;/span&gt;) &amp;gt; 0) {        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; string store use c formate use \0 end &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #800080;"&gt;$data&lt;/span&gt; .= &lt;span style="color: #800080;"&gt;$char&lt;/span&gt;;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; link the string&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #800080;"&gt;$char&lt;/span&gt; = &lt;span style="color: #008080;"&gt;fread&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, 1);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;$data&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * return area info&lt;br /&gt;     *&lt;br /&gt;     * @access private&lt;br /&gt;     * @return string&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; getarea() {&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$byte&lt;/span&gt; = &lt;span style="color: #008080;"&gt;fread&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, 1);    &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (&lt;span style="color: #008080;"&gt;ord&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$byte&lt;/span&gt;)) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; 0:                    &lt;br /&gt;                &lt;span style="color: #800080;"&gt;$area&lt;/span&gt; = "";&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; 1:&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; 2:                     &lt;br /&gt;                &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong3());&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$area&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getstring();&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:                 &lt;br /&gt;                &lt;span style="color: #800080;"&gt;$area&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getstring(&lt;span style="color: #800080;"&gt;$byte&lt;/span&gt;);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;$area&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * return ip location info &lt;br /&gt;     * $r['contry']  $r['area']&lt;br /&gt;     * @access public&lt;br /&gt;     * @param string $ip&lt;br /&gt;     * @return array&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; getlocation(&lt;span style="color: #800080;"&gt;$ip&lt;/span&gt;='') {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;          &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;empty&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$ip&lt;/span&gt;)) &lt;span style="color: #800080;"&gt;$ip&lt;/span&gt; = getip();&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['ip'] = &lt;span style="color: #008080;"&gt;gethostbyname&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$ip&lt;/span&gt;);  &lt;br /&gt;        &lt;span style="color: #800080;"&gt;$ip&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;packip(&lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['ip']); &lt;br /&gt;        &lt;span style="color: #800080;"&gt;$l&lt;/span&gt; = 0;                         &lt;br /&gt;        &lt;span style="color: #800080;"&gt;$u&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;totalip;           &lt;br /&gt;        &lt;span style="color: #800080;"&gt;$findip&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;lastip;      &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$l&lt;/span&gt; &amp;lt;= &lt;span style="color: #800080;"&gt;$u&lt;/span&gt;) {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$i&lt;/span&gt; = &lt;span style="color: #008080;"&gt;floor&lt;/span&gt;((&lt;span style="color: #800080;"&gt;$l&lt;/span&gt; + &lt;span style="color: #800080;"&gt;$u&lt;/span&gt;) / 2);&lt;br /&gt;            &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;firstip + &lt;span style="color: #800080;"&gt;$i&lt;/span&gt; * 7);&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$beginip&lt;/span&gt; = &lt;span style="color: #008080;"&gt;strrev&lt;/span&gt;(&lt;span style="color: #008080;"&gt;fread&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, 4));&lt;br /&gt;         &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$ip&lt;/span&gt; &amp;lt; &lt;span style="color: #800080;"&gt;$beginip&lt;/span&gt;) {&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$u&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$i&lt;/span&gt; - 1;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;                &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong3());&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$endip&lt;/span&gt; = &lt;span style="color: #008080;"&gt;strrev&lt;/span&gt;(&lt;span style="color: #008080;"&gt;fread&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, 4));&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$ip&lt;/span&gt; &amp;gt; &lt;span style="color: #800080;"&gt;$endip&lt;/span&gt;) {&lt;br /&gt;                    &lt;span style="color: #800080;"&gt;$l&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$i&lt;/span&gt; + 1;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;                    &lt;span style="color: #800080;"&gt;$findip&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;firstip + &lt;span style="color: #800080;"&gt;$i&lt;/span&gt; * 7;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$findip&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['beginip'] = &lt;span style="color: #008080;"&gt;long2ip&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong());&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$offset&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong3();&lt;br /&gt;        &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$offset&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['endip'] = &lt;span style="color: #008080;"&gt;long2ip&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong());&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$byte&lt;/span&gt; = &lt;span style="color: #008080;"&gt;fread&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, 1);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (&lt;span style="color: #008080;"&gt;ord&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$byte&lt;/span&gt;)) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; 1:&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$countryOffset&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong3();&lt;br /&gt;                &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$countryOffset&lt;/span&gt;);&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$byte&lt;/span&gt; = &lt;span style="color: #008080;"&gt;fread&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, 1);&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (&lt;span style="color: #008080;"&gt;ord&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$byte&lt;/span&gt;)) {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; 2:&lt;br /&gt;                        &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong3());&lt;br /&gt;                        &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['country'] = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getstring();&lt;br /&gt;                        &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$countryOffset&lt;/span&gt; + 4);&lt;br /&gt;                        &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['area'] = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getarea();&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&lt;br /&gt;                        &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['country'] = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getstring(&lt;span style="color: #800080;"&gt;$byte&lt;/span&gt;);&lt;br /&gt;                        &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['area'] = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getarea();&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; 2:&lt;br /&gt;                &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getlong3());&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['country'] = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getstring();&lt;br /&gt;                &lt;span style="color: #008080;"&gt;fseek&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp, &lt;span style="color: #800080;"&gt;$offset&lt;/span&gt; + 8);&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['area'] = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getarea();&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['country'] = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getstring(&lt;span style="color: #800080;"&gt;$byte&lt;/span&gt;);&lt;br /&gt;                &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['area'] = &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;getarea();&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['country'] == " CZ88.NET") { &lt;br /&gt;            &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['country'] = "Unknow";&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['area'] == " CZ88.NET") {&lt;br /&gt;            &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['area'] = "";&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;change gbk to utf8&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['country'] = mb_convert_encoding(&lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['country'], 'UTF8','GBK');&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['area'] = mb_convert_encoding(&lt;span style="color: #800080;"&gt;$location&lt;/span&gt;['area'], 'UTF8','GBK');&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;$location&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;   &lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;     * excute complete then close file handler&lt;br /&gt;     *&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; __destruct() {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp) {&lt;br /&gt;            &lt;span style="color: #008080;"&gt;fclose&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #800080;"&gt;$this&lt;/span&gt;-&amp;gt;fp = 0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;最近项目中用到了获取用户IP所在地的信息，主要是为了从IP去判断用户所在的城市，现在的城市信息基本上有分几种&lt;/div&gt;&#xD;
&lt;div&gt;一种是用ID编号来关联城市的，还有使用缩写的代码来关联城市的。&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;我们通过IP去获取所在的用户的 &amp;nbsp;城市的详细信息，比如运行以下的结果得到的是&amp;nbsp;"福建省福州市 电信"&lt;/div&gt;&#xD;
&lt;div&gt;可以得到用户的 省市及所使用的网络接入的信息&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;这里调用的是百度的开放查询接口，通过网页的方式去查询然后从返回的结果中去匹配我们所需要的信息，效果还行，代码在下面，还是能凑合着用的。&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;var_dump(getAddress('202.101.98.54','福州'));&#xD;
&#xD;
function getAddress($ip=null,$address='') {&#xD;
        $url = "http://open.baidu.com/ipsearch/s?wd={$ip}&amp;amp;tn=baiduip";&#xD;
        $res = mb_convert_encoding(HttpRequest($url), 'UTF-8', 'GBK');&#xD;
	//var_dump($res);&#xD;
        if ( preg_match('#来自：&amp;lt;b&amp;gt;(.+)&amp;lt;/b&amp;gt;#Ui', $res, $m) ) {&#xD;
                if (is_int(strpos($m[1], $address))) {&#xD;
                        return $m[1];&#xD;
                }&#xD;
        }&#xD;
}&#xD;
&#xD;
&#xD;
function HttpRequest($url, $data=array()) {&#xD;
                $ch = curl_init();&#xD;
                if (is_array($data) &amp;amp;&amp;amp; $data) {&#xD;
                        $formdata = http_build_query($data);&#xD;
                        curl_setopt($ch, CURLOPT_POST, true);&#xD;
                        curl_setopt($ch, CURLOPT_POSTFIELDS, $formdata);&#xD;
                }&#xD;
                curl_setopt($ch, CURLOPT_URL, $url);&#xD;
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&#xD;
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);&#xD;
                curl_setopt($ch, CURLOPT_TIMEOUT, 2);&#xD;
                return curl_exec($ch);&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/2112600.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2011/07/21/2112600.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/scotoma/archive/2011/07/14/2106779.html</id><title type="text">&amp;quot;我在赶集网的两个月“ 看后想写点什么！</title><summary type="text">对于“我在赶集的2个月”的文章写的自己的感触,很欣慰的是国内聪明人还是很多的，很悲伤的事情是,现在大多聪明的人都太浮躁了,最终都难成大业!对于聪明人更是要忍辱负重,坚强的以结果为导向,一直对自己的目标坚持不懈最终实现自己的目标,祝福这位GLX同学了！</summary><published>2011-07-14T13:13:00Z</published><updated>2011-07-14T13:13:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2011/07/14/2106779.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2011/07/14/2106779.html"/><content type="html">&lt;p&gt;今天很意外的看到了园字里面发的&amp;rdquo;&lt;a href="http://kb.cnblogs.com/page/108441/" target="_blank"&gt;我在赶集网的两个月&lt;/a&gt;&amp;ldquo;，文章挺长的就粗略的看了下,有看到了微博上,很多同事和朋友写的对这篇文章所提到的这个人和这件事情的看法,遂自己也很有冲动的想写点什么,表达下自己的想法。就有了这篇博文了！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一般对于分析一个事件都会提取出里面的元素进行讨论,我们从文章中去抓取下关键的元素&lt;/p&gt;&#xD;
&lt;p&gt;我,文章的作者&amp;nbsp;CLX&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;GL 销售部运营经理 (ps:20110715 更新，突然想起他是我的前同事)&lt;/p&gt;&#xD;
&lt;p&gt;YT 销售总监&lt;/p&gt;&#xD;
&lt;p&gt;企业：赶集 / 58 / baidu&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;先谢谢感触,昨天部门会议介绍了部门里面各个组来的新人,新人这次来的挺多的,介绍下来有10来个吧，当然了名牌大学里面的同学占的比较多,也听到了研一,研二,大三的来实习的,看到了最后一个大二的女生就出来实习了感觉比较惊讶！就事论事,现在找工作确实不容易,在大学里面能不能学到东西,读过了就知道了,其实很多的时候感觉学校里面学习的东西在出了社会后变化很大的,很多东西都要去重新学习,甚至都换了自己的专业了,做的事情更是如此.本次提到的是CLX同学本身是学习计算机的可是后来就弄销售的事情了,后来又甚至到对公司的部门流程及架构进行修改,从文中可以看出很多的.总结下我自己想说的 &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;用人,用有能力的人,无可厚非&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;GLX原先在百度实习,后来又想到赶集实习,对于在百度我想知道百度的销售人员经常打电话给同样的客户就知道了,可能和商务搜索有关系的部门的了,想想会写PHP的话在百度应该是个做技术的吧！后来到赶集转成销售方面的去了,这点还是比较奇怪的,不过从前面GLX同学对于58的分析还是很值得鼓励的,一个人能够做到走出去,自己去实践自己的想法,然后对相关的数据通过科学的手段进行分析得出结论,从这点可以看出GLX同学是很有能力的一个同学,这里很值得称赞的.我个人认为有能力的人,在等待的只是机会而已,所以GLX同学拿着他的分析结果去了赶集了,得到了GL的认可这个是无可后非的,是我是管理者我也会用一个有能力的人的.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;制度是不可能因为一个人而去做改变的,特别是在大的公司里面&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;每个公司里面都有自己的制度,对于一个实习生对公司作出突出贡献是值得称赞的,但是对于能力和对组织带来的冲击是必须经过权衡的.虽然GLX对赶集作出了很多的贡献,从分析对手到后面的电话营销等方式,这些虽然对公司带来了很大好处但是也会影响到现有的组织和人员,这些会给别人带来了很多的工作压力,虽然说从科学的方式来说对于很多数据的分析处理是否是正确的,但是这个不大可能从短期看出来,其实对于数据分析而言,没有100%的可靠性的,都是能够大体展示结果不出现大的问题就算是可以的。而GLX这样做导致了内部人员对他的诸多看法,而且会让别人不好过,遂YL提醒不要功高盖主这点真的是很有道理的,给你表现的机会后该收手的时候就收手即可,你现在还不是乔大爷还没有能力左右公司的命运,所以才华锋芒外露必然会遭受很多的非议这个也是可以理解的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;把技术的价值体现出来了,但是没有考虑到后果&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于抓取分析其他的网站的事情,这件事情直接导致了竞争对手的防御,对于分析和获取竞争对手,这样太赤裸裸的了,在中国这样一个讲究文化的社会里面,这么野蛮的做法最终会导致很严重的后果的,最后赶集网的所有IP都被58给封了,这个是很正常的事情,做事情不能这样。虽然2家公司是竞争关系，但是对于都拿到风险投资的公司来说,还是不会对业绩起到很大的波动的,只是有一定的细微的影响而已.这样做直接恶化了2家公司的竞争关系,这样导致的是 做数据分析的给弄的很难堪了,GLX这样做简直是狗拿耗子多管闲事,得到的结果就是这样的，多管闲事&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;找投资你也得有个东西哪怕是一个粗糙的东西也行&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;从去找投资充分可以说明了GLX同学的激进及自大,现在所谓的年轻人创业的很多,我自己弄的我是买家的开源项目后就有很多同学也在用程序修改打算创业,有几个很年轻就想开始出来做事情的了,可是以你现在的能力拿到风投后你能做好什么呢,这样的性格和处事能力是不可能受到风投的欢迎的,太不够稳重的了,想想在中国的土地上想学习美国的创业方式太不可思意了,也是不现实的,北GL等人鄙视是很正常的,异想天开自大的人现在很多,碰到的就很多,已经很习惯了,在此我想说的是这些小孩心这么浮躁能成功么？成功是要讲究综合实力的,但是首先人品不行就是一个很大的问题了,况且还是孩子,另外几个一起去的同学估计也是打酱油的吧！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;没有职业素养的人是很难有大成就的&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;打字也打累了,用微博上看d 评论来写个结尾吧!没有职业操守的人,把很多数据和公司里面的信息都暴露出来是很不理智的行为。不知道你这么写是处于什么原因但是你这样做真的是不可取的.在说很多事情急于求成,不管是gaiji,baidu还是58都是结果很多年发展起来的,改变是必须的,但是肯定不能用很暴力的方式来处理的.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最终看到这篇文章,很欣慰的是国内聪明人还是很多的，很悲伤的事情是,现在大多聪明的人都太浮躁了,最终都难成大业!&lt;/p&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/2106779.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2011/07/14/2106779.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/scotoma/archive/2011/06/11/2078295.html</id><title type="text">架构分享--微博架构的回顾</title><summary type="text">架构设计上对于高并发的情况下都会涉及到存储和接口，但是目前对于存储很少人使用新技术！架构方面只有自己去开发了才会去深入，这篇博文会一直更新。</summary><published>2011-06-11T04:46:00Z</published><updated>2011-06-11T04:46:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2011/06/11/2078295.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2011/06/11/2078295.html"/><content type="html">&lt;p&gt;最近这段时间工作上的变动有点大,五月份也闲了下来一直在思考自己接下来的方向,并对这一年来的学习进行总结.&lt;/p&gt;&#xD;
&lt;p&gt;对于架构上的深入是这一年多来最主要的沉淀,从小公司到大公司,从小流量的站点的架构设计到大流量乃至超大流量的架构设计,记录下来,分享出来。&lt;/p&gt;&#xD;
&lt;p&gt;在分享自己的那点料之前,先来分享下大神Tim Yang的关于微博的架构设计：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011061112181239.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里主要从 存储和接口角度来讲&lt;/p&gt;&#xD;
&lt;p&gt;对于大流量系统的架构设计，对于写入方面是特别需要注意的，基本上现在遇到的系统都是对于主数据库的写入，然后对于从数据库实现流量的分发。&lt;/p&gt;&#xD;
&lt;p&gt;对于存储，记得公司老大说过，对于BD的项目的架构如果从设计上可以达到20PB的存储规模不出什么大的问题，就说明这个架构设计是合格的。&lt;/p&gt;&#xD;
&lt;p&gt;对于存储，新浪微博使用了redis的部分功能,主要用在用户信息方面的使用,现在只有单机设计,但是对于现在的单机完全可以提供大量的内存比如32G以上，完全可以达到存储数据的要求。&lt;/p&gt;&#xD;
&lt;p&gt;对于MYSQL这里所涉及到的就是设计规范和分库分表，最大的感触是大家为了便利就直接用自增的ID来进行，对于唯一ID的设计也是我一直注意的，因为唯一的设计是涉及到全局的。&lt;/p&gt;&#xD;
&lt;p&gt;将将自己最近总结的PHP和微博架构方面：&lt;/p&gt;&#xD;
&lt;p&gt;1.进行快速开发的过程中，订好规范，按照规范执行是非常的重要的，涉及到的沟通会比较少，其实和其他人联调是很费时间的。&lt;/p&gt;&#xD;
&lt;p&gt;2.对于性能跟踪方面使用使用xhprof来跟踪PHP的执行过程及性能问题，可以初略的估计出来。&lt;/p&gt;&#xD;
&lt;p&gt;3.对于核心代码的复用程度及核心的代码量的把握，核心要灵活可扩展而且保持小&lt;/p&gt;&#xD;
&lt;p&gt;4.技术选型比如对于使用memcache扩展和memcached的扩展还是很重要的&lt;/p&gt;&#xD;
&lt;p&gt;5.对于代码的目录结构和命名还是挺重要的,php的autoload不要搜索太多的目录会比较好&lt;/p&gt;&#xD;
&lt;p&gt;6.考虑下工具类的复用，一直在造轮子每次都重写一遍，这个不是很郁闷的事情，怎么样让这些类不要耦合的太紧？设计很重要&lt;/p&gt;&#xD;
&lt;p&gt;7.对于有些服务是PHP做起来不合适的,比如spam模块的高危词过滤还是用C/C++模块来处理比较好。&lt;/p&gt;&#xD;
&lt;p&gt;8.微博技术的应用Inbox/Outbox/Timeline/Following/Follows/Feed/MQS&lt;/p&gt;&#xD;
&lt;p&gt;9.推荐算法和消息推送的处理，各种高并发的处理&lt;/p&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/2078295.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2011/06/11/2078295.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/scotoma/archive/2011/05/13/2045693.html</id><title type="text">结网读书笔记-从产品经理的角度看产品</title><summary type="text">结网，一部很好的产品经理的入门书籍，作为研发工程师来看也是很不错的入门书，本次从半年来项目失败的情况，以一个产品人员的观点来看产品失败的原因，列了几点欢迎讨论。</summary><published>2011-05-13T09:07:00Z</published><updated>2011-05-13T09:07:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2011/05/13/2045693.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2011/05/13/2045693.html"/><content type="html">&lt;p&gt;一直从事技术开发的工作,在工作中,经常的和产品经理接触,在这半年里面,经历了一个产品从出生到发展到最后终结的全过程.&lt;/p&gt;&#xD;
&lt;p&gt;体会甚多,从这次暂时的修整中,利用闲余时间好好的看了下产品经理方面的书《结网》，这本出自腾讯的人的书写的还是很全面,写了很多产品经理方面的感触及工作中遇到的问题及处理方法是一本入门笔记好的书,遂做下读书笔记,结合这半年来的产品来谈产品的概念到设计到开发到运营的过程。&lt;/p&gt;&#xD;
&lt;p&gt;对于一个技术人员,如果可以站在产品的角度来做产品,也是件很欢快的事情,最起码不会感觉到是为了任务而任务,而是可以真正的投入其中。&lt;/p&gt;&#xD;
&lt;p&gt;以下从几个方面来看到这个问题&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;从团队角度来看&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;团队是一个产品的引擎，没有它产品就没法跑起来，团队需要有自己的目标，而这半年来，我们的团队一直没有目标，探索性的尝试是不可能有什么好结果的，探索是肯定正确的但是不能冒进，冒着很大的风险，总有一天会迷失的。&lt;/p&gt;&#xD;
&lt;p&gt;当一个团队没有共识，这里是产品和开发人员和运营人员直接，如果没有共识的话，那么就会各自为政了，为了达到自己的目的，有小组织化的操作，直接导致产品的失败，举例，运营人员直接对开发人员而忽略了产品人员，直接对产品进行修改，导致了职责不明，而很多运营新增的功能只是为了短期的利益考虑而没有考虑到长期的结果及对产品带来的影响。&lt;/p&gt;&#xD;
&lt;p&gt;节奏感，产品及开发及运营都要有各自的节奏感，配合紧密一步一步的向前走，谁的冒进都可能导致严重的后果，本次开发过程中发现，运营人员忽略产品而直接对开发进行功能设计的情况非常的严重。而开发这边也没有把握节奏和QA的关系处的非常的不好，也是目前存在的主要问题。&lt;/p&gt;&#xD;
&lt;p&gt;人才&lt;/p&gt;&#xD;
&lt;p&gt;对于团队而言，这半年来，新进了不少同事，现在处的来的同事还是比较多的，但是真的配合的很好的还是比较少，半年来的磨合可以锻炼一支很有战斗力的团队。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;从公司角度&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于在大的盈利公司中做研发，不需要考虑到很多现金流的问题，因为公司的薪资和福利都很规范，不会担心这些问题。但是对产品的总体把握上，公司应该从大的战略层来看，这个产品在公司战略中的位置，并进行有效的资源整合来推进产品，但是这半年来，公司对于产品的关注度很不够，对于产品细节，在VP级别没有很好的重视，连大BOSS都没有认真的看过这款产品，导致了对于团队领导及公司领导中对产品的发展有很多的争议，这个也是主要存在的问题。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;从产品经理的角度&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;产品经理每天的工作，为产品进行管理及营销并负责开发新的功能，这块本次产品的产品经理表现的很不尽人意。&lt;/p&gt;&#xD;
&lt;p&gt;从时间跨度上来看，本次团队的产品经理没有从战略的角度来布局产品，这个主要的原因是由于从公司到总监级别都是认为是个探索性的产品而没有对产品进行长期的战略布局，不清楚产品的发展轨迹，这个是最大的失败的地方。对于阶段性的工作，本次产品团队忽略产品文档而主要以原型为主，这样给开发和测试人员带来了很大的工作量，对逻辑考虑的不到位及对产品的把握不够导致了阶段性的活动没有开展，产品经理没有和运营进行直接的沟通领导运营，而是沦为了运营人员的工具来按照运营人员的思想来进行产品的路线及产品设计，没有自己的主观建议。对于商业计划完全忽视，认为我们的产品根本没有盈利的可能性而完全的靠公司输血进行维持。对于成本及用户教育及竞争对手方面的重视很不够，采取的做法是直接忽视。产品经理都没有对KPI进行有效的理解并有效的执行。&lt;/p&gt;&#xD;
&lt;p&gt;对于下图列到的法则更是没有去很好的运用和执行，对于产品经理而言，本次团队的产品经理收到了来自上层的巨大压力也没有发挥出自己的足够的优势，显得比较可惜，对于最后的失败只能说，失败后还不意识到自己错了的话，是没有可能成功的，失败是注定了的.&lt;/p&gt;&#xD;
&lt;p&gt;上张图书笔记：结网读书笔记&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011051317053217.jpg" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/2045693.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2011/05/13/2045693.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/scotoma/archive/2011/03/28/1997378.html</id><title type="text">读书笔记：番茄工作法,时间管理从现在做起</title><summary type="text">番茄工作法,时间管理从现在做起,认真的规划时间,做好日程安排,对于时间进行25分钟工作划分,处理好内部打断和外部打断,提高自己的估测能力,使学习工作更要效率</summary><published>2011-03-27T18:31:00Z</published><updated>2011-03-27T18:31:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2011/03/28/1997378.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2011/03/28/1997378.html"/><content type="html">&lt;p&gt;一直以来自己的时间管理还是有的,而且还是一直在坚持,可是一直一来都是感觉时间利用率不高,工作的效率也不高.&lt;/p&gt;&#xD;
&lt;p&gt;看了番茄工作法之后总结了下,主要由一下几点：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;集中自己的注意力,减少被打断的次数&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在自己对于各种打断的处理很差，具体指工作中的IM工具的使用上打断主要有：baiduhi群,QQ群,日程体现,邮件体现,别人来需求/技术问题等处理方法,对于现在的及时IM,每个25分钟查看一次消息,并对消息进行处理&lt;/p&gt;&#xD;
&lt;p&gt;&lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;&#xD;
&lt;strong&gt;对于日程工作项目的时间片进行划分&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;原先的日程工作项都是比较粗的估计的，占用了多个时间片,每个是30分钟使用了番茄工作法后以25分钟为单位对任务进行划分,工作25分钟休息5分钟现在有很多直接的沟通,可以对沟通的时间进行统一的处理比如集中在上午分出一个时间片来出来处理外部的打断&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;每天晚上对当天的日程做一次总结&lt;/strong&gt;&lt;span&gt;	&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;现在基本没对自己的日程进行总结，需要对这块晚上睡觉之前进行一次总结现在基本没对自己的日程进行总结&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;配置手机的日程和电脑日程的同步&lt;/strong&gt;&lt;span&gt;	&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;现在配置下电脑日程google calendar 和手机日程的同步现在配置下电脑日程google calendar 和手机日程的同步&lt;/p&gt;&#xD;
&lt;p&gt;上下读书笔记&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011032802280641.jpg" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/1997378.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2011/03/28/1997378.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/scotoma/archive/2011/03/21/1990880.html</id><title type="text">Ubuntu 10.10 64bit 安装完成秀下PP</title><summary type="text">捣鼓下Ubuntu 10.10 64bit,换了theme后感觉真的很不一样,还是用官方推荐的,果然发现与众不同！其实有的时候真的可以换换风格,用了WIN7用,用下Ubuntu你会发现其实你也一样可以拥有很多！更自由,想要什么都有什么！～</summary><published>2011-03-21T15:58:00Z</published><updated>2011-03-21T15:58:00Z</updated><author><name>JonathanYoung</name><uri>http://www.cnblogs.com/scotoma/</uri></author><link rel="alternate" href="http://www.cnblogs.com/scotoma/archive/2011/03/21/1990880.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/scotoma/archive/2011/03/21/1990880.html"/><content type="html">&lt;p&gt;Ubuntu 10.10 64bit 安装完成秀下PP&lt;/p&gt;&#xD;
&lt;p&gt;这段时间一直在用自己的电脑,发现和公司到本还是差距很大的,硬件性能的差距直接影响到用户体验了,遂就将电脑换过来了！&lt;/p&gt;&#xD;
&lt;p&gt;由于WIN7不给力,就下了一个很艰难的决定把WIN7也毙了,现在就只有一个ubuntu了,还是喜欢唯一....&lt;/p&gt;&#xD;
&lt;p&gt;安装过程比较顺利,下了ISO后使用的ubuntu自带的disk creator刻录到U盘,安装很快就完成了！&lt;/p&gt;&#xD;
&lt;p&gt;接下来就是更新系统了,么317M的大小更新了整整一个上午,家里到网速让人很崩溃,更新OK后又折腾开发环境,终于到今天顺手了！放几张PP出来吧！&lt;/p&gt;&#xD;
&lt;p&gt;表达一下对Ubuntu的爱意！&lt;/p&gt;&#xD;
&lt;p&gt;简洁的桌面................................&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011032123475118.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;安装过程中遇到的编译错误,悲剧的PHP 5.2.17 &amp;nbsp;没办法就升级到5.3.6了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011032123485243.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;升级成功后的php5.3.6&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011032123500677.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;安装完成后配置了gtalk到sina微薄那唠叨唠叨,可惜发现丢失消息的现象还是比较严重的,发了3条就保存了最后一条&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/19437/2011032123535058.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;贴出安装的软件列表...................&lt;/p&gt;&#xD;
&lt;p&gt;1.install system (64bit) set root pass (sudo passwd root) &amp;nbsp;update vim&lt;/p&gt;&#xD;
&lt;p&gt;2.update system &amp;nbsp;(choose the theme)&lt;/p&gt;&#xD;
&lt;p&gt;3.install chrome and firefox 4 rc&lt;/p&gt;&#xD;
&lt;p&gt;4.install ubuntu tweak&lt;/p&gt;&#xD;
&lt;p&gt;5.install visualbox 4&lt;/p&gt;&#xD;
&lt;p&gt;6.install xmind&lt;/p&gt;&#xD;
&lt;p&gt;7.install Awn the start setting&lt;/p&gt;&#xD;
&lt;p&gt;8.downloading lnmp0.6-full and install it (nginx + php + mysql + memcached + redis )&lt;/p&gt;&#xD;
&lt;p&gt;9.install flash plugin&lt;/p&gt;&#xD;
&lt;p&gt;10.install netbeans&lt;/p&gt;&#xD;
&lt;p&gt;11.install xchm&lt;/p&gt;&#xD;
&lt;p&gt;12.install git&lt;/p&gt;&#xD;
&lt;p&gt;小建议：&lt;/p&gt;&#xD;
&lt;p&gt;安装完成后配置自己喜欢到快捷键,这样启动程序就很快的了，按着下自己常用的软件,提高开发效率&lt;/p&gt;&#xD;
&lt;p&gt;喜欢自由就彻底丢掉WIN7吧！投入UBUNTU的怀抱！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/scotoma/aggbug/1990880.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/scotoma/archive/2011/03/21/1990880.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
