Category Archives: Others

[原创]浅谈移动App广告平台的设计

前言

依靠广告盈利占据了国内移动App盈利模式的半壁江山。很多App刚刚有点流量的时候都会考虑是不是做个自己的广告投放系统以支撑业务未来的需求。

笔者在工作中有幸接触到了一些有这类需求的App,这些App在自有广告系统中总有这样或那样的功能性缺失,这不可避免的会造成一些业务上的损失。
主要的功能缺陷集中在对品牌类广告主的需求满足上。相对于效果广告主来说,品牌广告主是一类让人又爱又恨的主儿。爱是因为品牌们都是有钱的主儿,能被品牌们看上也说明了自己的江湖地位。恨是因为品牌们都是事儿妈,销售和运营们7*24的伺候着不说,还总提出层出不穷匪夷所思的投放功能需求才是最让人恨的地方。

尽量使用国内服务

这一点很重要,必须先说明:不管你看到的国外的某个网站有多牛,追踪效果、报表有多酷,但是只要你的目标用户在国内,尽量使用国内的服务,原因不细说,心里明白就行。

使用WebView展示广告

从最基本的图片显示需求开始,80%的开发者首先想到的肯定都是有个尺寸,图片地址,点击地址,在App上使用一个Image View显示一下应该就足够了吧,因为业务人员往往就是这样描述他们的业务场景的。但是在实际的业务场景中往往会有很多变数:比如需要增加展示监控,增加广告关闭按钮(免得金山毒霸之类的给你的App上加一个,还有可能引发不兼容等问题)。
此外,移动领域的广告让品牌广告主非常心动的一点就是有丰富的人机互动和表现能力,比如晃动,涂抹,重力感应等。如果有这类需求开发人员会发现原来的ImageView太简陋了,而且需求不明确的情况下也没法实现开发和投放,因此基本上调研之后都会转而使用Web View来展示广告。WebView的缺点是比较消耗资源,一个WebView的创建一般都需要200ms左右,但是只要稍微做些优化,这个损耗和App3,4秒的启动速度相比就不足挂齿了,用户体验不会有明显差异。比如WebView要渲染完毕再展示,出场有个动画(这个地方的灵活性可以参考jquery的动画)就可以给用户更好的体验。
。这时候投放系统可以实现图片,文字链,视频,HTML5动画等广告展示形式,几乎无所不能了,如果仔细研究一下各家专业移动广告平台的投放,这些几乎已经是标配。

展示监控

很多品牌广告主往往一上来就指明要展示监控,说简单一些就是用户每次看到广告,需要通知广告主发生了一次展示。品牌广告主们往往不会拥有自己的系统,而是找代理商,代理商有时还会再找个第三方监控平台以示公正。这一点要是不能满足,这单估计就保不住了。做展示监控要特别注意几点:

  • 展示监控链接会有跳转行为,所以千万别访问一下就完事,要有两跳,但至多三跳。一般来说四跳非常非常少见,五跳以上基本可以认为对方的系统出问题了…;
  • 有的监控链接还会要求有动态参数,一般是用户的标识符,包括iOS的MAC地址,广告追踪ID,OpenUIDID(UDID可以不用再考虑了);Android的EMSI SIMID AndroidId等;
  • 有些情况下也可以做服务器转发,但是客户端的IP之类的信息得附带上,同时得与代理商和第三方监控提前沟通,否则转发服务器的IP会被认为是作弊;
  • 展示次数差异一般上下浮动10%是正常现象,因为国内网络复杂度及终端用户的网络质量都是不可控因素。

点击链接

点击链接与显示链接一样,可能会有参数的替换。所以在App前端的系统设计上千万不要把参数和顺序定死,最好的方式是模板式替换。如果App本身也带监控,最好是采用多线程式同时触发。可以想到如果采用顺序式触发万一某个服务挂了就会影响后续的监控。
在点击链接的跳转上,每一次跳转可能都有5%左右的损失,所以要提升到达率就需要尽可能减少跳转的次数。
不同的系统兼容性不一样,这里还有一个URLencode的坑:要注意每一个链接都是有多个参数的,拼接跳转链接时记得做URLencode处理,不要丢参数;同时每一个参数最好做一次decode的检查,特别是参数有中文的情况下,没有URLencode过的要专门处理一下。
点击之后的打开行为,一般分为应用内打开,应用外打开,其他行为三类。手机上比较独特的一点就是其他行为,包括拨打电话,发送短信,邮件,启动其他应用等,这些基本都可以通过系统调用实现,在开发的时候要特别注意。
iOS6以后有个应用内下载功能要注意集成进App,能非常大的提升App类广告的转化率。
笔者深有体会的是Android的应用外打开非常坑爹,会导致50%以上的点击丢失!原因是用户安装了两款以上的浏览器时系统会询问用户。一个非常有用的实践中得来的经验是App内置一个浏览器来打开着陆页,或者强制指定一个默认浏览器。

屏幕密度

Android上的屏幕密度问题。得益于苹果高超的工业设计和制造水准,将高清屏引入了智能手机产品当中。但悲摧的是由于Android的制造厂家众多,标准不一,在Android上要特别注意对高清屏的处理,否则 图片尺寸变形在所难免。

视频广告

视频广告虽然目前还不是主流,但还是值得一提。首先是视频的自动播放,一般广告主会要求在Banner上点击以后全屏播放,如果用着陆页直接链接视频文件的方式,可以实现自动播放,但是会无法追踪用户的后续行为。解决办法是要么在Banner上直接播放,要么自己用Native Code处理一下。其次是用户观看视频的时长追踪。举个栗子,假如一个视频有25秒,广告主如果要求提供看完视频的用户个数,看完20秒视频的用户个数,看完15秒视频的用户个数,系统得能够支持这样的追踪。而且视频广告一定要提前在不同的Android机型和系统版本上测试兼容性。

广告后台

广告后台要注意的首先就是各种定向的需求,专业广告平台的定向类型非常多,但是作为非专业的App后台,只需包含地域定向和按小时包段投递等简单定向即可。如果想更进一步深入研究广告投放系统,可以参考一下
百度广告管家(http://adm.baidu.com/index.html)
谷歌DFP(https://www.google.com/dfp/)
OpenX(http://www.openx.com/mobile)
以及师徒网的计算广告学这门课程(http://sheetoo.com/app/course/ov?course_id=200)

最后再说说广告的投放和渲染。为了节约服务器流量,投放出来的广告一般是数据加模板地址,模板放在CDN上,本地可以对模板和图片等广告物料资源进行缓存。其余诸如把模板下载到本地,然后填充数据,再使用WebView渲染等都是非常基础和具体的开发工作了,这里就不再一一细说。

千人挑战,拿福能在行动–免费50元

拿福能在2010年才进入中国,在今天(5月23日)将要举办一次“千人挑战活动”,其目的是千名博主目标的实现起到激励作用,在放入广告代码并写一篇小小的拿福能及其活动介绍,便可平分这个活动的50000元费用,点此查看活动详情。 这仅仅是个开始,当然,我也参加了。在未来的日子里,拿福能还要在中国举办各种线上、线下活动,如果你想免费看电影、认识更多博主、获得小礼品就尽快来参加吧。 不要紧张,只需简单5步,即可在活动中大展拳脚! 1、  注册。 2、  博客绑定拿福能。 3、  在博客中插入拿福能广告代码。 4、写一篇简短博文,介绍拿福能,并在文中添加本活动页面链接:http://www.nuffnang.com.cn/blog/2011/05/23/challenge-1000    

Linode支持的信用卡

 

LinodeVPS口碑非常不错,价格也适中。博得很多国内站长的好感。

但是Linode购买只能通过支持信用卡,而且是国际(Visa, Master)卡才行。

 

只要能正常支付外币的基本都可以,像中行的或者招行的。推荐大家使用招商银行的信用卡,申请方便,手续简便。

 

测试过工行的Visa卡,貌似不可以。

.htaccess权限设置不正确导致无法Rewrite

最近在配置一个php的网站程序时碰到了.htaccess文件权限设置不正确而导致Rewrite失效的情况。
起初将网站程序全部上传,运行正确,后来有一个地方读写权限碰到问题,于是鲁莽地将整个文件夹带循环方式的权限全部设置为 777
chmod -R 777 webroot
经过一番设置之后,网站运行OK了,就稍微考虑了一下SEO方面的问题,于是启用了伪静态,但是不知道为甚,伪静态不起作用,仔细检查了相关的正则表达式,完全OK,但是服务器上就是不起作用。

仔细分析了一下:同一个服务器上的另外一个程序Rewrite完全正确,表明Apache的Rewrite模块是工作正常的;后来比较这两个.htaccess的文件权限发现了情况。这个有问题的站点下的.htaccess文件权限是777,而另外一个是666。

上网查阅了一番:系统为了确保安全,对于.htaccess权限为 777 的情况下,可能会拒绝执行,于是去掉可执行属性,一切恢复正常。

ShootSearch 0.2版 [C#][开源]

ShootSearch 0.2版发布!

1.重写蜘蛛模块,多线程操作更加灵活
2.增加队列手动保存,自动保存功能,可以加载队列继续下载
3.可以随时查看队列,以及当前线程状态
4.增加远程采集所需要的处理功能,可以按照指定的模板输出html,txt,xml等各种文本格式(使用开源组件stringtemplate.net),也可以编程输出到数据库中
5.增加Lucene.Net性能优化参数
6.采用log4Net输出日志,使日志系统更加灵活
7.增加了文档,方便用户使用

平台:.Net 2.0
授权:GPL
开发工具:Visual Studio.Net 2005

猛击这里下载

如何编写支持Lucene.NET的中文分词程序

近来很多朋友都给我写信询问如何把ShootSearch中文分词组件支持dotlucene,因为杂七杂八的事太多,所以一直没顾上,这两天研究了一下,发现其实很简单。

首先说明一下dotlucene的中文分词程序。我一开始接触dotlucene时,是1.4的版本,那个版本是支持中文分词的。一开始我还不太明白,后来发现那个StandardAnalyzer对中文的处理是按字去分,而非词。原来1.3版时dotlucene是不支持处理中文的!于是我就开始搜索支持中文按词分的程序,lucene的很多,但是dotlucene的却凤毛麟角,于是就产生了写一个中文分词程序的想法,后来看了一些文章后就有了ShootSearch中文分词组件。这个分词程序是最大匹配分词。

要想写支持dotlucene的中文分词程序一定要看的是这个Lucene.Net.Analysis.Cn,它是dotlucene1.3版时处理中文的分词组件。只要继承Analyzer,TokenFilter,Tokenizer这三个类即可,最低要求是Analyzer和Tokenizer这两个类,因为TokenFilter是用来处理噪声词的(就是单个的“的”“啊”“是”之类的词),暂时可以不管它。

Analyzer的继承是最简单的,只有3,4行代码,只需覆盖一个非常简单的方法TokenStream,参考我写的ShootAnalyzer即可,Tokenizer的继承稍微复杂一点点,因为这个是处理分词过程的类,不过实际上要是你的分词部分已经写好了的话也就几行代码万事!要覆盖的方法除了构造方法就是Next()方法,它的用意是返回一个词(Token),有点像数据库的游标一样,要是返回null就表示没有词了。Token的构造方法也很简单,返回一个字符串,和前后位置即可。大家如果有耐心的话可以仔细读一下Lucene.Net.Analysis.Cn的代码,Next()一次就是返回一个字而已。稍微把Segment.cs改造一下就可以很好地处理这个问题了,目前我的方法是增加了一个Ends属性,它存储的是一个int组,内容就是每个词的结束符地址。具体代码请大家参考一下我的ShootTokenizer吧,也就10来行代码,注释基本清晰。

最后要说一下,java的lucene下面有很多支持中文的分词程序,如果有需要的话可以尝试移植一下.

所有代码请到这里下载:http://www.shootsoft.net/index.php/2010/08/shootsearch-segment-070312/