最近在开发微信公众号的应用时遇到的一个现实问题,在本地运行的应用如何与微信公众号进行线上联调呢?微信公众号需要验证线上的接口有效性。此时ngrok大有作为。ngrok是一款可以使本地应用获得一个线网临时域名。

以Mac为例,将ngrok下载到本地,ngrok.zip是一个不到5M的单文件压缩包,解压之后是一个隐藏文件。用终端进入所在文件夹并用命令 “./ngrok 3000”,表示你将获得一个映射到本地localhost:3000的URL地址。启动之后,等到Tunnel Status显示为online时你会得到http和https两个映射到localhost:3000的链接,我本次获得的是“17cdaf5f.ngrok.com”,二级域名的位置字符串会随即变化,只在当次连接有效。此时你可以尝试用浏览器访问你获得的这个地址试试,神奇发生了。

除此之外,ngrok的终端窗口中还会显示该地址每次收到的请求状态,很方便测试时进行调试。如果需要退出,和其他的终端程序一样,用Ctrl+C就退出了。

Meteor是一个优秀的框架,《Discover Meteor》是一本优秀的入门书籍。只是在249页的代码中有一个逻辑bug,原文如下:

//..
	attributes: function() {
		var post = _.extend({}, Positions.findOne({postId: this._id}), this); var newPosition = post._rank * POST_HEIGHT;
		var attributes = {};
		if (_.isUndefined(post.position)) { 
			attributes.class = 'post invisible';
		} else {
			var delta = post.position - newPosition; 
			attributes.style = "top: " + delta + "px";
			if (delta === 0)
				attributes.class = "post animate" 
		}
		Meteor.setTimeout(function() {
			Positions.upsert(
				{postId: post._id},
				{$set: {position: newPosition}}
			)
		});
		return attributes; 
	}
	//..

/client/views/posts/post_item.js

如果使用了这段代码,那么页面上的post就全部消失了,因为代码将所有attributes.class都预设为‘post invisible’。这里需要调换if-else区块内的代码,变成如下即可恢复正常:

//..
	attributes: function() {
		var post = _.extend({}, Positions.findOne({postId: this._id}), this); var newPosition = post._rank * POST_HEIGHT;
		var attributes = {};
		if (_.isUndefined(post.position)) { 
			var delta = post.position - newPosition; 
			attributes.style = "top: " + delta + "px";
			if (delta === 0)
				attributes.class = "post animate" 

		} else {
			attributes.class = 'post invisible';
		}
		Meteor.setTimeout(function() {
			Positions.upsert(
				{postId: post._id},
				{$set: {position: newPosition}}
			)
		});
		return attributes; 
	}
	//..

/client/views/posts/post_item.js

今天将数据库换成MongoDB了,在切换的时候也遇到了一些官网上没说清楚的地方。后来到处找也没找到问题,不过最终我还是仔细摸索后找到了解决方案。

首先说一下我的环境 ruby-2.0.0, rails 4.1.0

最先遇到的一个疑问在官网上遇到疑惑

# 我先运行了自动配置代码
rails g mongoid:config

运行完成后,还是要按照文档要求在 myapp/config/application.rb 里删掉 require “rails/all”,并且替换成:

require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"
# require "sprockets/railtie" # Uncomment this line for Rails 3.1+

官方文档里说Rails 3.1+的版本要将第五行取消注释,实际上还应该将第三行注释。完成后的样子是这样的:

require "action_controller/railtie"
require "action_mailer/railtie"
# require "active_resource/railtie"
require "rails/test_unit/railtie"
require "sprockets/railtie" # Uncomment this line for Rails 3.1+

这个时候运行rails s还是会遇到很多问题,我遇到了method_missing’ undefined method active_record’ 这样的错误,网上大部分都会提到一个解决方案,将config/environments/development.rb 和 test.rb中的两行注释掉:

# config.active_record.mass_assignment_sanitizer = :strict
# config.active_record.auto_explain_threshold_in_seconds = 0.5

但我根本就没有这两行,后来在网上找到一个大神说出现这类错误一般和Active Record有关,所以我到config/environments/development.rb 和 test.rb里面所有带有active_record的配置项全部注释掉了,问题迎刃而解。

前一段时间发现ruby-1.9.3已经说过期了,所以安装了最新的2.1.1,结果出现各种奇葩的错误。先说一下,我用的是Mac OS X 1.9.2的系统,Xcode也已经更新到最新。

  1. Gem编译环境错误 ERROR: Failed to build gem native extension. 不管是用rails server, bundle, rake routes, gem list命令时都会出现,网上关于这个错误的讨论很多,我暂时没发现什么特别好的解释。但是用本文提供的方法就可以解决。

  2. ruby的版本切换时出现不正常 我当时有1.9.3和2.1.1两个版本,用rvm info命令,看到rails-2.1.1@global,还在编译时看到了2.1.0的Gem文件夹,反正各种混乱。比如用rvm 1.9.3 default命令时说1.9.3不存在,然后重新安装1.9.3时安装了一个全新的1.9.3, 后面带的pxxx的编号有些差异。

  3. 以上情况用加sudo命令时就没问题 这种时候让我更加纠结,难道运行个rails s也要加上sudo命令,输入个密码么?

出现了这种情况的时候,最好就是用我本文介绍的一招鲜,一了百了彻底解决。

运行下列命令

#将.rvm文件夹下的文件彻底删除
sudo rm -rf ~/.rvm/

然后重新安装rvm及你需要的ruby版本、对于ruby项目重新bundle。

做了快三年的产品经理了,最近一直在思考如何在社区型产品中寻找一条出路,想着想着找到了五块拼图,作为社区型产品的五要素吧,它们是人、行为、内容、互动、规则。

,是指产品中需要有人的属性。最容易犯的错误就是将帐号当成了人。人不是帐号,甚至可以没有帐号。比如以前的聊天室,里面只要有一个昵称,没有帐号也可以有人的属性。为了实现人的属性,通过设定头像、性别、年龄、地理位置,签名。

行为,是产品中核心的操作。例如关注、发帖、转发、点赞、评论,这些动词的功能都是行为,这些行为有的只有一个人完成,有些需要两个人完成,行为的结果可能是内容,也可能是互动。

内容,是通过文本、图片、视频、音频展现出来的信息。以豆瓣电影为例,海报、剧名、发行公司、发行年份、网友评论、剧照、预告片、标签都是内容。这些内容的来源分为从互联网上收集来,人工录入,用户创造。

互动,是人的行为的结果,例如关注后,被关注的人就能够发现自己多了一个关注者。最近火热的朋友圈,点赞就是一个行为,该行为的结果就是让对方可以收到一条提示,知道有人点赞了自己的日记。你的动作引发了我的行为,这就叫做互动。

规则,指的是前面几个元素通过一定的逻辑联系起来。一般的规则很容易理解的,可能大家都已经习以为常了,为了举例能够更有代表性,我会选择“facebook”、“Snapchat”、“Whisper”来讲解。规则是社区中最可能出现颠覆式创新的环节。

  • facebook是熟人社交,里面发帖发图片会沉淀到个人的时间线上,成为一个人在这个社交网络上的记录。
  • Snapchat只加入了一条规则——我发出来的消息阅后即焚。通过这么一条规则,原本在facebook上不会出现的内容就出现了。
  • Whisper的规则比较特别,是基于地理位置的匿名应用,你可以看到你周围的人发的帖子,但你不知道他们是谁。

如何利用上面的五个元素来分析一个社区型产品,我们看几个实例。

新浪微博,它的快速崛起与它的规则简单密不可分,关注行为是单向的互动,只要一个人发起行为,另一个人不需要做接受和拒绝的操作,即可以完成这个操作,但是关注操作会让被关注的人知道自己多了一个粉丝,并且是真正的人,这样就产生了互动。人在新浪微博里的行为除了关注以外还可以发布微博,并且转发其他人的微博。一开始微博只能发布文字类信息的,后来逐渐有了表情、图片、音频、视频类信息。但是这些丰富的内容并没有拯救微博,如果说是什么毁掉了微博,那么一定是僵尸粉和那些转发的运营工具。

人人网,人人网是抄facebook的,里面的人是用户,行为就是互相访问,他最有趣的规则就是可以看到谁来访问过自己的个人主页。发状态、发照片都是用户在产生内容,发评论、访问其他人主页会产生用户之间的互动。最后人人网逐渐消散了,是因为用户不能在上面找到更新鲜的感觉了。如果我今天还希望用一下人人网,那是我希望查一下一个出名的学妹的照片吧。

朋友圈,朋友圈是抄path的,里面的规则除非互为好友,要不然在同一个主题下的回复也互相不可见。朋友圈中的人就是微信的用户,好友关系已经由微信提供,发送的图片、文字就是内容,用户通过点赞、评论进行互动,并且会让所有和该主题有关的人都会收到。但是朋友圈里面的转发也越来越多的,还有大量的电商找片,估计不久就会成为下一个微博。

分析了三个案例,也仅仅是学会了如何去分析一个已经成型的产品。如何利用社区五元素框架来构建属于自己的产品,还需要更深厚的功力。