(30 gadget day 8) 你爱我有几分 — Mindwave mobile

Mindwave EEG

Mindwave mobile EEG是一个一直以来我觉得Dev friendly做的最好的产品。
虽然开发起来依然不如Estimote,MYO之类的新Gadget那么方便,带maven带gradle,但就凭这么多年,当年的代码在android 5.0上依然可以跑,就足以欣喜啦。

那究竟它可以做什么?EEG是啥我就不说了,见Wiki。Mindwave mobile提供的SDK基于基础的alpha,beta数据,提供更有价值的注意力,冷静度,甚至眨眼的数据。当然,alpha,beta也是可以通过SDK获取的原始数据。

下面是官方应用的截图。
图片描述

client

这东西的开发很简单,尤其是android端。下载官方的SDK,把jar扔到你的项目里,就可以写代码啦。代码也很简单,拿到蓝牙Adapter,设置一个处理事件的Handler,连上设备。

    btAdapter = BluetoothAdapter.getDefaultAdapter();
    if (btAdapter != null) {
        tgDevice = new TGDevice(btAdapter, handler);
        tgDevice.connect(true);
    }

在发生了连接事件以后,启动设备以获取各种类型的脑波数据。除了设备状态转变以外,其他数据就都是业务数据了。其中也有两类:设备本身的数据质量,数据本身。数据质量里有一种很重要的MSG_POOR_SIGNAL,用来表示当前信号质量,这个数据主要用来描述EEG和大脑之间的接触良好成都。

private final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == TGDevice.MSG_STATE_CHANGE) {
            switch (msg.arg1) {
                case TGDevice.STATE_CONNECTED:
                    Log.i(TAG, "connected");
                    tgDevice.start();
                    break;
                ...
        } else {
            switch (msg.what) {
                    case TGDevice.MSG_POOR_SIGNAL:
                        signalTextView.setText(String.valueOf(100 - msg.arg1));
                    case TGDevice.MSG_ATTENTION:
                        Log.v(TAG, "Attention: " + msg.arg1);
                    ...

        }

你爱我有几分

前几天听到一个笑话:某工程师的妹子问他“你爱我有几分?”,答曰“8.5分”,“你爱你前女友几分?”,答曰“9分”。

但不说情商为何物,只缘分数还有小数点。不过从科学角度,我们倒是可以把注意力当做一种衡量标准。比如某PM问用户“你爱我们产品有几分?”,这时,用户的注意力就可以当做一种比较“本质”的回答。

Attention driven design

所以也许,用户的大脑状态可以是另外一种产品设计的基础。例如,我希望用户看到我的产品之后两分钟内都能保持高度注意力,那就可以用这样的技术来测试,甚至在产品设计阶段做简单的用户调研。

比如下面的图是我在写程序时候的注意力分布图。如果采用WakaTime类似的技术记录下我所有在IDE里的操作,就能够分析出IDE里每个功能的使用对应我的注意力,从而对功能设计作出调整。

图片描述

当然,根据每一条代码对应的注意力,也许就能作为代码检查的另外一种依据。“糊涂的代码”是个认真的说法。

Mindwave in cloud

作为QS的支持者,我当然希望我的所有数据都能数据化并保存下来。Mindwave mobile给我提供了很大的便利,很容易的将我简单的脑波数据保存下来。

具体的用处嘛,既然Apple watch都出了ResearchKit,就不用解释啦~但另一个可能的用处,也许就是我可以“出卖”我的数据。比如A网站是个codeshool类的产品,产品想知道某些教学视频到底做的好不好,有没有趣味,作为真实用户的我就可以根据需求用我真实的,具有严格时间戳的脑波数据来换取一部分好处。

我管它叫Cloudmind,目前是基于Leancloud+chartjs,可以持续积累数据。但由于没啥内容外加代码太惨,暂时就不扔出来啦。

关于这个功能我是认真的。所以,如果有哪个产品想获得我使用时的脑波数据以用于产品设计,请联系我哈~

最后,来看看我眨眼的样子:)

图片描述

图片描述

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

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!

在WordPress.com的博客.

向上 ↑