Fengxiaoping's bubble

  • (30 hackdays day 18) Dexlabs – 有语言的逆向分析服务

    10月 27th, 2014

    以前我做过一段时间的Android逆向,当时是为了检查广告检查病毒,后来用来找到公开的intent跳转到应用内做搜索,再后来为了找到这些应用都跟哪些API打交道,从而统计SDK和产品之间的关联度。之后就再也没接触过这些了。不过前两天发现我还在订阅apk analyze的Google alert邮件,所以就决定再回来看看现在这领域都在玩哪些新玩意儿啦~(其实是找不到新API了吧…)

    android-apktool

    绝对的老牌选手了,从10年开始就在维护。貌似现在是Connor Tumbleson这家伙在维护。这家伙是Techcom Worldwide的程序员,看起来一直很专注在Android OS这块,以至于他的Vibe里只有两个Tag:Technology, Android OS。对比一下我的…唉,惭愧。(为毛会有粤语…)
    图片描述
    图片描述

    丫做了一堆网站,看了下觉得都挺好玩的。另外最近他把Wordpress换成了Ghost,太酷了!有没有Ghost的博客托管平台啊!顺便再膜拜一下Brut.alll!

    • http://leafapp.co
    • http://ibotmodz.net
    • http://ibotpeaches.com
    • http://connortumbleson.com
    • https://keybase.io/ibotpeaches

    图片描述

    先看看2.0.0RC2的样子。好久没用过apktool了,第一眼看到的区别就是-advance这个参数,高级信息…是个啥…其他的,似乎跟上次见到的时候无甚差别。不过根据文章介绍,ApkTool终于支持Java7了。

    具体的逆向过程我就不讲啦,因为以前做过这个。

    dexlabs

    主角儿来啦。当我说Reverse engineer的时候,你应该就想到了Reverse engineer as a Service吧~是的,Dexlab就是这样一个产品。看名字就很明白啦,这是个以分析APK为生的公司。

    图片描述

    里面又碰到一个第一眼不认识的词儿Heuristics(这是要改成30天速成英语四级么…)。好吧,一会儿再看这到底是啥高级功能。

    这产品使用很简单,注册个账号,上传个apk,等它告诉你分析完了,就可以开始看结果啦。所以这是个编辑都会干的活儿(没有贬低的意思=.=)。因为是静态分析,所以也不用指望有什么很突破的功能。通过首页的示例基本就可以看出其中一个很重要的功能应该就是类似IDA pro的关联分析静态分析功能。

    GMS

    普通的小应用不值得分析,让我们直接上大招,Google Mobile Service。这是一套Google在Android上的核心服务,在国产手机上基本不能有。

    上传完以后就开始分析,着进度条晃啊晃啊的烦死了,既然你丫不知道进度就谦逊一点嘛!大概4分钟以后分析完了(27MB确实比较大,以前的经验来说这种程序如果是java的就会跑崩了…)。好,下面是大图!可以很快的划过去。

    bigfile

    这就是这个庞大的GMS的基本信息,就是APKTool能分析出来的那些。重点是看右边的那个Package Deps。好吧,完全看不出来啥了…基本也就能看出几种基本服务类型,Ad啊location啊啥的。

    图片描述

    最有意思的,是他们还为程序静态分析设计了一套类似SQL的语言,DXQL – Dexter Query Language。不过,通过他们在twitter上的这只推来看(只有一个retweet),应该不会有其他地方使用这种语言…

    哦对,其实,这个平台主推的应该还是协作分析的功能。邀请他人来一起分析某个APK,听起来就跟搅基是同义词~

    最后,我一直在寻找的API,在FAQ里找到了…

    Which extraction/export interfaces does Dexter offer?
    None yet. However we want to implement a SDK which can run on the user’s client computer for further analysis. If you contact us about that, it might help to schedule our priorities ;)
    

    事实上,他们对很多功能的回复都是这个: If you contact us about…好吧,这是第一个没有API的XaaS。下次我尽量不那么水…

  • (30 hackdays day 17) AngelList – IT桔子啥时候开放API

    10月 26th, 2014

    最近在做的事情需要收集创业公司的信息,所以这次我介绍一个获取Startup信息的API。AngelList,是一个为创业公司提供投资,招聘等服务的平台。

    AngelList现在号称”Over $10,000,000 invested online this month”,我数了下数字,差不多一个月1000万刀的投资。但…logo为毛做的这么二…

    图片描述

    废话不多说直接看API https://angel.co/api/

    第一眼望去看到的是OAuth,第二眼望去就看到一个不认识的词儿,Accreditation。看起来好像是得到认证过的投资信息。不管了,不用到暂时。

    先看一个综合的搜索Search API。按名字来搜索公司,用户,地理Tag等。这个不需要认证就可以访问。比如我们找个叫leap motion的公司

    GET https://api.angel.co/1/search?query=leap%20motion&type=Startup
    

    就可以得到一堆跟leap motion有关的公司。可是,前两个名字都叫Leap motion…不过根据AngelList的排行,第一名应该还是比较靠谱的,而且第一个还有pic这个域。

    {
        "id":6343,
        "pic":"https://d1qb2nb5cznatu.cloudfront.net/startups/i/6343-3704fb09e9b74996b5826f5cc1ab5a00-thumb_jpg.jpg?buster=1369156838",
        "url":"https://angel.co/leap-motion",
        "name":"Leap Motion",
        "type":"Startup"
    }
    

    这里面的信息很少,想要详细信息就得访问另外的Startups API。

    Startups API也是个很综合性的接口。除了获得某个Startup的信息以外,还能得到它的评论,以及Startup的排行榜和具有某个tag的所有Startup。
    我们用刚才拿到的ID来访问Leap motion的公司信息。

    GET https://api.angel.co/1/startups/6343
    

    就能拿到一个挺全面的公司基本信息啦。包括公司首页,公司logo,产品描述等等,公司涉及领域等。

    另外一个可以用来窥探公司方向的API事Jobs API。看看Leap motion在什么。

    GET https://api.angel.co/1/startups/6343/jobs
    

    可以看到他们在招Software Engineer,期权,薪水,技能都有描述。他们用了一个Array的Tag来描述技能,工作地点之类的,这个用法还是挺好玩的。

    图片描述

    看,Leap motion在招会用C++写算法的软件工程师哈。再见…
    最后,某些牛逼投资人的following也是很有价值的,那就是Follows API

  • (30 hackdays day 16) Filepicker – 上传文件如此简单

    10月 25th, 2014

    基本上,各种产品都会用到一个很普通,但又很难实现的很漂亮的功能——文件上传。比较早期的一些Web框架还特地为File Upload做了专用的组件来方便开发者上传以及在后端处理上传的文件。这次我就介绍一个帮助大家超轻松实现文件上传功能的服务,Filepicker。

    logo

    Filepicker.io

    Filepicker做的事情很简单:帮助你用最少的代码把文件传到你想要的地方。我们直接看一个最简单的例子,使用Filepicker提供的Drag-Drop Pane widget来上传图片。

    filepicker.makeDropPane($('#exampleDropPane'), {
      multiple: true,
      onSuccess: function(Blobs) {
        $("#exampleDropPane").text("Done, see result below");
        console.log(JSON.stringify(Blobs));
      },
      onError: function(type, message) {
        $("#localDropResult").text('('+type+') '+ message);
      },
      onProgress: function(percentage) {
        $("#exampleDropPane").text("Uploading ("+percentage+"%)");
      }
    });
    

    只要在页面上加一个id是exampleDropPane的div,它就会变成一个可以往进拖拽文件并上传的控件。上传成功以后,onSuccess里就可以得到上传以后的文件信息,比如如下。

    [{"url":"https://www.filepicker.io/api/file/n4Ba7BdNSJyaLZfu2Qm5","filename":"logo-primary.png","mimetype":"image/png","size":8452,"isWriteable":false}]
    

    返回信息里包括文件URL,mime(filepicker帮你分析出来的,我测试了下apk也可以分析的出来,挺不错的)和一起其他信息。

    也许你会很奇怪,这文件没有传到我的服务器上呀?是的,Filepicker不光帮你写前端代码,也帮你搞定了文件存储(默认情况)。这意味着一个前端工程师,使用BaaS类服务,加上Filepicker就可以超容易的做出一个允许用户上传文件的WebApp——在onSuccess里在BaaS里创建一个文件对象,把url指向Blobs.url就可以啦。

    如果你很在意用其他数据存储服务,比如S3,Azure,Dropbox,Rackspace。可以简单的在makeDropPane里添加选项location:’dropbox’就可以啦。在Developer Portal里你可以配置如上几种服务的各种Key。

    Filepicker.io   Developer Portal   fxp007 gmail.com.png

    还有一种情况,你的App需要把数据存在用户自己的某类存储账号中,比如用户自己的Box,用widget就可以很容易enable这个功能。

    API

    Filepicker支持各种终端,并提供SDK(当然有Javascript的)。

    Filepicker SDK

    btw. Meteor的发展速度真是猛啊!

    CDN

    如果你的网站是个IO集中型的,换言之很在乎CDN的,可以使用Amazon的CloudFront和Filepicker.io一起使用。

    Price

    Filepicker帮你保存文件,提供一行代码添加uploader,可以存在各种地方,你觉得得多少钱?只需要29或者99!刀…价目表很清楚,我感觉对于小公司也是超值的。另外就是,我很好奇最牛逼方案里20GB大文件是咋搞…
    Filepicker.io   Easy  Powerful File Uploads.png

    ok,抱歉又水了一篇,太困了,晚安~

    想了解这个30 hackdays可以查看这篇文章。也欢迎访问我的墙外站

  • (30 hackdays day 15) Bonsai + LeanCloud – 要有Search!

    10月 24th, 2014

    LeanCloud(原AVOScloud,还是喜欢这名字哈)是国内数一数二的BaaS产品。但由于还在快速发展期,所有还是缺少不少基本功能,比如搜索。好,问题来啦,搜索技术哪家强?Google?Bing?他们肯帮你的产品做搜索吗?Google Site Search?嗯,他们可以帮你定制一个好看的搜索结果页,可以输出XML。但,除非你用他家的服务器,否则它不能用你的数据直接做搜索。假如你想要一个只搜数据库里某张表里的数据,又不想让自己的服务器,或者BaaS平台变成阻碍。那就应该试试这个产品。

    Bonsai

    我们接触了各种XaaS,Search as a Service也是理所当然的啦。只是这种搜索即服务也有各种形式:

    • 三温暖全套服务。Site Search那种我帮你爬网页,帮你分词索引,帮你做Ranking,最后你告诉我个关键词我就给你返回页面URL。
    • 某些特定平台下的搜索。比如Wordpress各种”better search, search everything”。
    • 针对数据库的搜索引擎。数据库固然有内置的搜索功能,Mongodb等等的document数据库也正需要靠这个挣钱。但始终是不能满足startup简单,快速,暴力的开发标准。尤其是搜索并不是产品的核心功能,但又是必须的情况下。

    也许还有别的哈。第三种Search as a Service更适合API Mashup起来的新产品,它不会因为你的页面改变而需要重爬网站,也可以快速的让搜索引擎感知到内容的变化。
    总之,搜索这事儿也是花钱就可以快速搞定的~让我们看看怎么把Bonsai和Leancloud结合起来。

    logo.png

    为什么要选择Bonsai?这得从Elasticsearch说起。Elasticsearch是一个基于Lucene的搜索引擎,它最大的特点就是提供且只提供了一套标准的Schema-less的RESTful API。这套API是这个搜索引擎的全部接口。所以,我们可以把Elasticsearch看成一个黑盒,一个搭好就能用HTTP API往里扔数据,往外Query结果的傻瓜搜索引擎。用BugSense的例子来看。

    tumblr_mddwolK0jO1qhxx40.png

    BugSense把从手机上收集到的Crashlog扔到Google的BigTable里(Google storage类服务),然后再扔到ElasticSearch里,最后输出给一个前端应用一个用复杂搜索结果组成的Report。

    LeanCloud + Bonsai

    我要做的也是类似的,我有个小爬虫,跑在LeanCloud的云代码里,每次被调用都会爬一次网页,把结果保存在数据库里,假设这个保存的东西的Class叫Page。

    AV.Cloud.define("doCrawl", function(request, response) {
      // Something like request("http://www.google.com")
      page.save().then(function(page){
        response.success({"title":"Google blahblahblah"});
      });
    });
    

    好,这时候我就想能搜到title里有Google的Page,那就得看看Bonsai咋玩啦。
    登陆首页bonsai.io注册一个账号,创建一个新的Cluster。

    图片描述

    这时候你肯定在寻找美妙的Get Started!但…但这里没有“十分钟入门”…因为…因为做Bonsai的人在首页就说了。

    图片描述

    // I have to...
    console.log("We're developers, too")
    

    好吧,现在去学学怎么玩ElasticSearch吧。我就不推荐啥快速入门文章啦,请自行Google “tutorial elasticsearch”之类的(tutorial是个特别好的关键词,我都想搞个自动帮你填上这个词儿的搜索引擎了…)。
    总之,我们可以很轻易的通过RESTful API来向Bonsai创建出来的ElasticSearch服务器灌数据。ElasticSearch中,创建数据通常也意味着索引数据。

    curl -X PUT http://[SERVER]/[appname]/[mydatatype]/[object_id] -d '{  }'
    

    Bonsai简化了这个过程,在刚才的界面里,选择PUT,右边写上path,下面写上数据的具体的内容(当然是JSON格式的)。点击Run,数据就进区啦。

    图片描述

    我们想搜一下有啥数据里有ohuihui的话,只要写一个Query DSL,POST到想要搜索的数据类型下,就能得到JSON的结果啦~

    POST /testapp/testdata/_search
    {
        "query":{
            "query_string": {
                "query": "ohuihui"
            }
        }
    }
    

    图片描述

    够简单吧?同样,只要用上面的Cluster URL作为baseurl,用任何一种语言都很容易通过HTTP API可以向Bonsai里添加数据~
    好,现在的问题就是,怎么让我们在AVOS的数据进到Bonsai里呢?还好,AVOS的云代码提供了Hook功能。在每一个数据创建的时候,都可以由AVOS自动调用一段你的代码。比如

    AV.Cloud.afterSave("Page", function(request) {
      // Post the page(request.object) to Bonsai
    });
    

    这样,每次有新的Page保存到AVOS里的时候,Bonsai里就会被自动添加上这个数据。然后就可以再写一个云代码来访问Bonsai获得用户某个query的结果。

    AV.Cloud.define("search", function(request, response) {
      // Something like
      var queryBody = {
          "query":{
            "query_string": {
              "query": request.params['query']
        };
      request.post({
        url: "http://xxx.bonsai.io/testapp/testdata/_search",
        json: true,
        body: JSON.stringify(queryBody)
      })
    });
    

    That’s it. 整个结构很简单,如下图。以后你想自己做搜索了,自己搭一个ElasticSearch,重新倒一遍数据,改一下search那个云函数里的BaseURL就好啦~

    图片描述

    Good night, hope you like it!
    
  • (30 hackdays day 14) Muse – 了解自己

    10月 23rd, 2014

    Muse是一款Electroencephalography(EEG)。跟Mindwave和Emotiv一样,佩戴上以后人们就能得到各种脑波数据。现在的主要用处是用来获取用户的专注度。

    图片描述

    怂恿之下,在Mindwave,Mindwave mobile,Emotiv之后,又入手了一副Muse。本不抱太大希望的(民用级的EEG也就Emotiv这样了),但经过简单的试用以后发现Muse真是一款挺不错的新产品~连接稳定(好,写到文章最后我决定去掉这个特性…),有刘海的情况下还算隐蔽,5个主要传感区域,戴上不像科学怪人,对佩戴要求并不高。

    需要翻墙的App

    要想使用他们的Sample App,居然需要翻墙(包括注册账户)…原因是他们的Server是在Google App Engine,存储静态文件也是在Google App Engine Storage里。就连他们的document也是放在Google site下的。(真幸福…)

    痛苦的SDK

    Muse的SDK是几个EEG里装起来最麻烦的(貌似把它整个toolchain都当了一遍…),差不多耗时1个半小时,但还好这过程没出任何错误。通过执行muse-io可以判断SDK是否安装成功。

    图片描述

    奇怪的是,似乎本地的测试程序每次只能拿到一个数据,然后就死在那了…

    MuseIOReceiver

    有一种数据叫OSC,是用来在电脑,各种多媒体设备间进行通信的开放协议。

    Open Sound Control (OSC) is an open, transport-independent, message-based protocol developed for communication among computers, sound synthesizers, and other multimedia devices.
    

    Muse基于OSC来进行数据传输(事实上,Muse还采用了Protobuf来存储数据)。所以甚至还像模像样的提供了oscdump工具。

    MuseIOReceiver是用来接收Muse家的OSC数据的。给出的Sample代码可以给出delta, theta, alpha, beta and gamma值(好吧,原来还有这么多值…)然后他们提供了Android和iOS两个版本的源码。

    原本的计划是我想拿到这实时数据,但这程序似乎不那么好用…再加上今天超困超困…以后再补上~

  • (30 hackdays day 13) Bancbox – 只是金钱的搬运工

    10月 22nd, 2014

    今天介绍一个没法测试的API,Bancbox Invest。按照官网的说法

    图片描述

    Bancbox builds apps that move money.
    
    Bancbox不创造钱,Bancbox只做金钱的搬运工
    

    Bancbox是一个2008年创建的公司,做事儿很专注:”把钱挪来挪去”。一共有三个服务:投资托管,减税代理(我也不知道是啥…),自动交易。与其他服务最大的区别呢,就是他们提供API!(btw 网页做的很漂亮,字体也不错,Egyptienne URW Light)

    为啥”搬运工”要提供API呢?按照Techcrunch去年的文章里提到的创始人的话

    the first independent escrow service aimed at crowdfunding portals that operate on equity, debt or revenue share models
    
    Bancbox的第一个独立产品瞄准的是股权,债券和收入分成(??)类的众筹平台。
    

    当时已经跟三个如上类产品进行合作了99Funding, SoMoLend, Localstake。作为一个纯小白,根据文章描述看起来似乎是Bancbox可以帮助原来那些受法律规定,必须提供第三方担保账户的众筹项目,减少大量的paper work,从而更加关注在本身的业务上(就是“骗钱”)。

    $$$

    让我们来看看一个例子(如果理解错误请见谅,如果觉得不烦的话请指教哈)。

    图片描述

    假设有个众筹平台,比如蝌蚪众筹~,想为一堆项目(Issuer是那些找投资的公司)做股权众筹。这时候肯定会需要每个项目有一个银行账户来保存这些众筹来的钱。似乎由于一些政策原因,这些钱不能流过众筹平台本身。那这个账号就需要由一个第三方来保管(除去Crowd funding platform和Issuer以外)。
    另外,每个众筹项目都要经由Issuer和众筹平台的一些文书签名确认就可以创建一个第三方托管账号。这个过程结束之后,托管账号会被激活。众筹平台就可以开始为项目募款了。

    下面的图讲的是一个天使投资人如何投资一个项目。每个方块代表了一个或多个API。创建天使投资人,转移投资款到托管账号,创建投资项目,投资,收回投资。
    图片描述

    APIs

    看看人家文档,直接给程序员curl…

    curl -k -v https://sandbox-api.bancboxcrowd.com/crowd/v0/cfp/withdrawFunds \
    -d api_key=someApiKey \
    -d secret=someSecret \
    -d method=ACH \
    -d investor_id=someInvestorId \
    -d investor_reference_id=someInvestorReferenceId \
    -d amount=50 \
    -d text="I authorize Bancbox to make this transaction" \
    -d client_ip_address=127.0.0.1 \
    -d submit_timestamp="2013-11-10 01:31:00" \
    -d bank_account_number=someBankAccountNumebr \
    -d bank_account_type=SAVING \
    -d bank_account_holder=John \
    -d bank_account_routing=someBankRoutingNumber
    

    创建投资人,创建投资项目,开户啥的都有API。我们要看什么呢…嗯…看看API设计吧…

    POST https://sandbox-api.bancboxcrowd.com/crowd/v0/cfp/createInvestor
    

    在二级域名区分的sandbox-api下(这样比AVOS那样在API的body里更方便一些,切BaseURL就好了),crowd是产品名,然后是API版本,然后是cfp, crowd founding platform,(这么看来还有给其他终端的API,比如后台管理,统计之类的吧),行为。不过,createInvestor这显然不RESTful哈,做成POST …/investors会不会更好些呢。

    再看看Response

    {
        "request_id": 85748180313,
        "status": 1,
        "api_status": 1,
        "id": 99909063016,
        "event_id": 641159
    }
    

    status指的是业务层面的状态,api_status是指的本次API调用的情况(我喜欢这个)。如果遇到Warning或者Error(我很少见过HTTP API里面设计Warning的,你知道这帮家伙不鸟那玩意儿的…),会在结果根下添加。errorCode这类东西变成了一个W-014这样的string。

    "warning": {
        "type": "W-014",
        "message": "BBX admin will need to manually verify this Investor. Please check your email."
    }
    

    当然Bancbox也支持Webhook来获得各种事件(也就是类似ping++的回调)。

    好啦,Bancbox就介绍这么多,因为很多流程都是美国的,所以基本在中国用不了。但鉴于中国各种众筹如此蓬勃,明年又传说是“投资冬天”,还有目前众筹方面的各种风险。中国版的Bancbox也许是个不错的方向。

  • (30 hackdays day 12) Cine/Twilio – 第三方FaceTime/FaceTime Audio

    10月 21st, 2014

    视频直播,是不是挺起来就有技术难度?各种压缩,各种广播多播协议啥的?嗯,今天介绍一个超简单的视频直播服务,Cine

    图片描述

    7行代码的广播端

    var streamId = '543de35085130b0800ecf111'
      , password = 'cleff32'
      , domId = 'publisher-example';
    
    var publisher = CineIO.publish(
      streamId, password, domId
    );
    
    publisher.start();
    

    img

    其中domId就是…随便一个dom的…id…不必是个video啥的。因为…因为…丫是基于flash的…哎,瞬间就感觉这文章没得写了。好吧,这次买一送一!

    Twilio

    图片描述
    这是一个让你的应用可以打电话的服务。嗯是的,在你的App里打电话。可以打给另一个装了这个SDK的App,也可以打给一个手机或者一个座机。
    一句Curl就可以打电话,是他们的一大特点,来看看咋做的。

    curl -X POST https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Calls \ 
    --data-urlencode "To=+14155551212" \ 
    --data-urlencode "From=+14158675309" \ 
    --data-urlencode "Url=http://www.drawtheowl.com/ahoy.php" \
    -u {AccountSid}:{AuthToken}
    

    具体的body呢,如果想用程序控制发一段话就这样

    Yo holly shit!
    

    想播放一段音频给对方就发这个命令。收发短信,收发电话,都ok。

     audio to the caller just by passing the URL of the audio file.
    

    也可以加WebHook哦~(好吧,我还不知道能干啥用…)

    嗯,心情不好,就写这么多吧。抱歉敷衍了。晚安。

  • (30 hackdays day 11) Woopra – 你的用户在胡搞瞎搞

    10月 20th, 2014

    对于追踪用户行为来说,有很多工具都可以实现,比如国内的友盟,老牌的Google Analytics,近些年很火的Mixpanel。但如果你很想实时看到你的用户在你的产品里如何玩耍的话,你应该试试Woopra。

    logo

    WooPra

    Woopra不算是新产品了,2008年起就在提供服务了。产品也很低调,2011年起就没有出现在Startup新闻里。似乎也没找到近些年的投资纪录。按照CrunchBase的描述,Woopra是一个为销售和市场提供客户实时分析服务的产品。

    Woopra is a real-time customer analytics service providing solutions for sales, service, marketing and product teams.
    

    不过按Alexa的数据来看,Woopra最近的日子并不好过,流量一直在下降。

    图片描述

    然而Bounce Rate,Daily Pageviews per Visitor都在上升。看来用户忠诚度还是蛮高的。

    用户纬度行为跟踪

    从首页的Banner就可以看出,Woopra可以帮你把用户在应用里的行为转换为用户本身的行为时间线。
    图片描述

    免费用户也是能注册的,不过仅限30000次行为每月的数量,确实比起Mixpanel就差太多了。不过,实时也许是个好玩且值得的体验。

    Setup

    很简单,贴一段JS到head里。跟Mixpanel一样,Woopra可以允许你把自己系统里的用户对应到Woopra的用户。只需要执行一句

    woopra.identify({
      email: '{{ account.email }}',
      name: '{{ account.name }}'
    });
    

    然后就可以在各种地方执行事件记录代码啦

    woopra.track('wanshua', {
      with: '王铁锤',
      activity: '羞羞'
    });
    

    只要一执行trace函数,在后台就能看到这个事件。包括你所有的事件细节。还有用户地点(翻墙到日本)以及浏览器,系统。

    图片描述

    当然,跟Mixpanel一样,Woopra也提供report,funnel,retention这类的report。不过我觉得最酷的也只有他家的Dashboard了,实时的呦。

    图片描述

    AppConnect

    他们最近的新动作就是AppConnect,允许Woopra介入第三方应用。嗯,它的接入的含义就是,Woopra可以将统计数据输出到各种第三方服务中。比如把你的report输出到Dropbox保存为文件。把用户做了啥当作消息输出到Slack。想象一下你的slack会跟你说,“用户王大锤和蛋蛋搞基了,本周的第10次”。

    不过我觉得更明智的做法是用Zapier,让你的信息可以跟几乎所有暴露API的服务互通。

  • (30 hackdays day 10) Material design – 可用的Material

    10月 19th, 2014

    Google的Material Design出来一阵子了,但是不是感觉还是个看不见摸不着的概念?按照Google的说法

    Material Design is a specification for a unified system of visual, motion, and interaction design that adapts across different devices.
    

    Material应该是一个跨平台的,统一视觉,动画和交互设计的基本模型。好吧,工程师思维作祟,为什么听起来像bootstrap呢。还有,什么Material is the metaphor,Swift out,到底咋实现呀…

    于是,几个Ionic Framework和AngularJS的核心开发者站了出来,开始了一个酷酷的项目Material。这个项目目前还处于初期高度活跃时期,所以最好不要在自家成熟系统上玩耍。

    写过Angular跟很多现有控件打交道的人都会体会到它们之间的“代沟”。除了各种$scope.$apply以外,Angular崇尚的组件复用,Directive等经常会反而成为整合的绊脚石。所以很早就有个项目Angular-UI试图把一些常用的,跟Angular整合很好的组件统计在一起,让大家各取所需。但后来不知为何,这网站并没有成为Angular Directive的集散地。

    后来Polymer,Dart出来了,感觉Google下决心要彻底改造前端技术了。但囿于之前GWT的失败,我总觉得Google也就适合做做新语言,Compiler之类的,直接做前端界面总是会被骂碎。

    但这次看了Material这个项目的Demo(好多东西)以后,我真心感到,Google工程师审美提高了…

    Material组成

    按照作者所说

    Our goal is to deliver a lean, lightweight set of AngularJS-native UI elements that implement the material design system for use in Angular SPAs.
    

    Material项目的目的是提供一系列实现了Material设计系统的Angular原生的UI控件(想象一下再也不用$scope.$apply来让这世界刷新了)。Component里面有目前提供的控件列表。其中,Card,mdToast,TextField都是做的比较好玩的(想象一下一个页面也能用Android的Toast)。

    写了个小登陆框,用了md-card, md-text-float, md-button。用了几个Directive就搞定了。虽然感觉还是比Bootstrap写的麻烦一些,但出来这些交互还是挺爽的。

    图片描述

    其实Firstname应该是粉红色,很漂亮的粉红色。然后点击TextField以后Firstname会上去,空出位置来,动画也是挺赞的。

    另外,赞一下他们的文档。他们的文档是用dgeni写的。需要装一下然后build一下就能看到。Demo里获取例子的源码也方便了很多,点击右上角的Source就可以。直接看Angular出来的HTML就是作死。

    最后,这个Google的家伙是这个项目里的一员:https://plus.google.com/+NaomiBlack/posts/bCS9DSPdVug

    嗯,我知道今天的文章很水…但…也算写了好吗!

  • (30 hackdays day 9) Rekognition – 借我借我一双慧眼吧

    10月 18th, 2014

    我们知道前段时间有报道说Facebook说他们的人脸识别技术达到,甚至超过了人类识别人脸的能力。很酷是不是。今天介绍个可以直接用的更酷的东西:物体识别。

    Concept Recognition

    如果你想让程序知道这张图大概是讲什么的,怎么办?Rekognition(是的,破名字…)就可以做到。他们家提供了最普通的人脸识别以外,还提供了场景识别,明星识别,以及今天要讲的概念识别。
    先直观感受一下Demo。通过这张图,Rek可以识别出70%概率这张图讲的是beach。
    图片描述

    This image is about :
    beach:70.65%
    cloud:66.57%
    sky:33.56%
    island:10.88%
    shore:7.56%
    

    “丫绝对是找了个special case!”,是的我也这么想的。好,我决定用我的narrative拍的照来测试下。这是我18号在路上的一张照片。其中很明显的有两种东西:汽车和路牌。

    图片描述

    分析结果如下

    basketball court:60.2%
    car:31.89%
    street sign:29.07%
    motor scooter:20.09%
    pop bottle:12.09%
    

    看到第一个失望了吧。篮球个毛啊,哪只眼睛看到篮球了…但往后看就觉得我靠,还挺准。汽车,路牌,小摩托。

    我整天都在跟什么玩意儿打交道

    自动我买了Narrative以后,就一直在思考怎么把这些图片数据用起来。那就让我用Rekognition的Concept API来下手吧。API很简单,如果不传图片信息而用URL来表示,就用GET就ok了。
    遇到一个问题:如果按Docs填写jobs参数就永远没有结果,只能照抄Demo页面里的参数,Concept的jobs写scene_understanding_3。
    我用15张照片做了一个批处理,算出这15张照片对应的Concept的数据,都添加到一个统一的results里。

    var request = require('request'),
        qs = require('querystring');
    
    
    var pictures = [
        'xxx.jpg',
        'xxxx.jpg',
    ];
    
    var results = {};
    
    for (var i = 0; i < pictures.length; i++) {
        processImg(pictures[i]);
    }
    
    function processImg(pic) {
        calculate('http://xxx.qiniudn.com/' + pic,
            function (info) {
                for (var i = 0; i < info.scene_understanding.matches.length; i++) {
                    var match = info.scene_understanding.matches[i];
                    if (results[match.tag]) {
                        results[match.tag] += match.score;
                    } else {
                        results[match.tag] = match.score;
                    }
                }
            })
    }
    
    
    function calculate(url, cb) {
        var params = {
            api_key: "4321",
            api_secret: "8765",
            name_space: "apiDemo",
            user_id: "apiDemo",
            jobs: "scene_understanding_3",
            urls: url
        };
        request.get({
                url: 'http://rekognition.com/func/api/?' + qs.stringify(params)
            }, function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    var info = JSON.parse(body);
                    if (cb) cb(info);
                }
            }
        )
    }
    

    照片存在七牛了,每次传一个URL就ok。最后得到的结果如下。

    {
      "awning":0.0556,
      "architecture":0.0099,
      "dorm room":0.11510000000000001,
      "people":0.0508,
      "face":0.1062,
      "finger":0.1521,
      "jeans":0.1502,
      "cat":0.0189,
      "pet":0.0087,
      "seat belt":0.21689999999999998,
      "document":0.0095,
      "human":0.0722,
      "flare":0.0093,
      "laptop":0.3152,
      "batting helmet":0.0095,
      "desk":0.0174,
      "molding":0.1219,
      "pc":0.1488,
      "television":0.0394,
      "flight":0.0098,
      "person":0.0095,
      "loudspeaker":0.0295,
      "apartment room":0.0094,
      "rat":0.1126,
      "lecture":0.0112,
      "aquarium":0.0104,
      "underpants":0.0089
    }
    

    其中最高的是0.3152,是…laptop…=.=|||。你丫是猴子派来黑我的吗!
    第二名是比较奇怪的seat belt。第三名是手指(不不不,我只放算了几张白天的照片!)。后面还有牛仔裤,PC等等。基本还是可以判定通过这少量数据就能一定程度判定一个人整天在跟什么玩意儿混。
    让我有点奇怪的是里面居然没有手机,于是去浏览了一遍那几张图,真的没有。

    哎,再让我伤心一会儿…

←上一页
1 2 3 4 5 6 … 9
下一页→

Blog at WordPress.com.

 

正在加载评论...