100DaysOfCode 阿里云工业视觉智能工程师ACP认证

学习内容 input

人工智能学习路线
阿里云人工智能工程师ACP认证课程
阿里云工业视觉智能工程师ACP认证(Alibaba Cloud Certified Professional – Industrial Visual Intelligence)

产出 output

阿里云人工智能工程师ACP认证
阿里云工业视觉智能工程师ACP认证证书

Screen Shot 2022-02-17 at 8 26 50 PM
const today = new Date();
const tomorrow = new Date();
tomorrow.setDate(today.getDate() + 100);
tomorrow
// Sat May 28 2022 20:40:25 GMT+0800 (China Standard Time)

https://github.com/fxp/gitblog/issues/2

第一个五年计划(2022 – 2027)

伴着即将出生的孩子,给自己定个目标。一年太短(怕被快速打脸),十年太长(到时再回顾恐怕也无济于事),就跟我党学个五年计划吧。写给自己的OKR,每半年总结。

  • 个人品牌
    • 领域技术
    • 投资
  • 资产
    • 被动收入总收入 > 50%
    • 创作
      • 软件产品 * 5
      • 大型项目 * 5
      • 书/课程 * 1
    • 副业成型
    • 投资交易年复合回报率达 > 15%

好啦,我颠儿了。

生成自 deepdreamgenerator.com

Saleor开源电商框架

由于项目需求,要做一个电商网站,但是要允许自定义支付(内部结算)。商品信息从另一个服务获取,有很多自定义的字段。由于个人便好,对比了各种电商框架,选了Saleor。

Saleor

  • 这是一款Headless的电商系统,也就是API-first的电商后端
  • 核心项目分成三个模块
    • Core。核心API服务,纯后台服务
    • Storefront。Saleor做的范例前端电商服务,纯前台服务
    • Dashboard。后台控制面板,纯前台服务
  • 核心API是用Python写的,GraphQL风格的API

Get Started

项目提供了一个很方便的启动项目saleor-platform,你可以用这个项目里内涵的教程很方便的创建一个自己的Saleor。这个启动项目是基于docker的,所以也需要docker-compose。

按照How to run it?部分运行就能启动起来大部分服务。但是我测试了很多遍,storefront的docker都没法启动起来。解决方法就是单独启storefront,其他的用docker-compose up就好了。

Environment

但是如果想正常用起来,还有不少配置需要的参数的。常见的有下面几个。但是这样的配置就会影响到比如创建mock数据之类的流程。

services:
  api: ...
  environment:
   - STOREFRONT_URL=http://xxx/
   - DASHBOARD_URL=http://yyy/
   - DEFAULT_CURRENCY=CNY
   - DEFAULT_COUNTRY=CN
   - ALLOWED_HOSTS=aa.bb.cc.dd
   - ALLOWED_CLIENT_HOSTS=aa.bb.cc.dd

版本

saleor-platform里的主版本现在还是2.x,2.x和3.x的API还是差别很大的。一个很大的区别是支持channel,也就是一个站可以支持不同的店铺。从API看起来,就是Saleor想要支持SaaS模式。

想要部署一个3.x的版本,需要的就是把每个项目Checkout成3.x(现在看起来都是3.0/3.1)。然后回到saleor-platform目录下build所有镜像。

GraphQL API

用这个项目比较有挑战的是,所有的核心API都是GraphQL形式的。可以看出Saleor的API文档写的还是很匆忙,每个版本的文档都各有差异,有些栏目只在某个版本的文档里有。所以如果你找不到内容,还是优先用搜索。

访问API的时候,一般都要在header里用token。这个流程按照User部分的文档里获取token部分,用tokenCreate这个mutation就可以。

总结

Saleor总体是个挺好的项目。相对比较傻瓜的headless的ecommerce。作为电商的起步也都没问题,还有一点点关于库存,支付,物流的定制流程。虽然没有测试过,但支撑大型的电商应该是需要很深度的开发的。

在家做基因编辑的生物黑客 CRISPR Kit – intro

The ODIN出了一个实验套件,让BioHacker们在家就可以做大名鼎鼎的Crisper cas9的基因编辑实验。套件在亚马逊有卖,但无法寄到中国,所以…(一个月漫长的等待)

趁假期,我和高老师(北大生物专业人士!)把这个套件玩了一下。一句话感慨,新的车库时代真的要到了。

DSC01935

整体实验流程很简单,分为三大步骤,两三天就可以完成。步骤可以通俗的表述为:培养受试者,变异受试者,检查变异者。(是不是跟很多末日美剧差不多)

实验使用的是大肠杆菌,我们要通过Kit提供的Cas9/tracrRNA/crRNA /Template DNA等把大肠杆菌转换为可以抵抗抗生素的“魔免”大肠杆菌。

我们的实验环境十分简陋,完全有菌(可以说的超不净实验室)。但最后也成功了,可见这个Kit的鲁棒性和Crisper的门槛之低。

套件本身的试剂盒耗材大概可以用来做两三次实验,所以只要不胡搞,应该可以成功的。

先放些图感受下。后面我们再介绍每个步骤的细节。

 

(希望我们的抗药大肠杆菌不会毁灭地球

male-zombie-vector-clipart

 

想购买的可以扫我的微店~

download

创业者们(1)

这是个好时代,机会多到做煎饼都可以融资。然而很可惜,我们是做“软件外包”的,我们站不到风口上。

不过,用个不恰当的比喻,”没吃过猪肉,却见过许多猪跑“。我们见证了许许多多这场浪场中的斗士,或豪,或苦,或聪明,或愚钝。

今天我们讲个中国人在美国当老板的故事。

老板D先生开了一家滑雪用品店,经营有道,在滑雪圈小有名气,几年间赚了一些钱。在一次活动中,D先生了解到了社群营销的概念,大感对味,回家后认真研习并制定了公司下一步的计划——社会化营销加扩充品类,在未来两年内做户外用品+社群营销的平台。

找到了方向的D先生立刻开始召集人手准备大干一场。多年的经商经验让他决定找一个技术负责人来负责这整个业务。故事就从这里开始了。

想到技术,D先生本能的就想到硅谷。但打听了一圈得知一个工程师的平均工资大约在十几万美元之后,他决定去二线“硅谷”找便宜一点的工程师。

几经周折,次年1月左右,C工程师被D先生相中,成为了这个项目的技术和项目负责人。C工程师打包票说这个项目没问题,并且承诺半年内项目上线。开心的D先生吩咐了人事和财务全力支持C工程师以后,就转身回去调配资源准备大干一场。

说话间就到了9月,D先生在联络了多家供货商、社群营销、物流等合作伙伴后,开始准备对接到自家研制的平台上。另他惊讶的是,开发团队居然还是C工程师一人。难道是能力太强,一人都给做完了?D先生疑虑满满之下得到了C的答复,“现在页面太丑,我需要写前端的,人事没法招到我需要的人,只要招到就搞定了”。于是D先生开始吩咐手下的亲信帮忙招人。

一个月过去了,团队依然还是C一个人。“没有达到我标准的应聘者,就差前端的人了”。

又一个月过去了,C还是这个团队的Lead和唯一的成员。D先生忍不住了,通过朋友联系到了我们,让我们帮忙做前端。

“API都Ready了,Demo页面也有了,就差写HTML+CSS的了”,“预算也都没问题!”,听起来是个不错的项目。可是,当我们看到C工程师的代码库Github的时候,一年一共30多次的代码提交,仅仅在2,3月和10月份有代码提交的提交历史还是让我们心生怀疑。

这个项目后来证明,C工程师仅在2,3月份提交了系统的基础代码,在10月份提交了一些用于演示的前端代码。距离D先生描述的业务场景还相距十万八千里。

工程师是一个当下有点过誉的职位。事实证明,大部分工程师能按时按量完成手头的任务,但并不具备推动业务发展的能力。

所以,初期的创业者,如果那位技术创业者不是“另一个会技术的你“,还是把业务牢牢握在自己手里吧。

《说好的脑洞呢》

脑洞不是个贬义词,脑洞是生物,有些可以长成小草,有些可以长成暴龙,有些可能根本无法顶出地表。

《说好的脑洞呢》是一个新的系列尝试。我们想记录,讨论并分享这些有生命的突发灵感

《脑洞》的前身是一个叫Daydream的Trello board,现在依然可以访问,欢迎加入。

加入Mail list(holesinbrain@googlegroups.com) 或者关注我们的喜马拉雅电台来支持我们吧!

wKgDbVYMCcijPhKwAABuDRjbKRw148_mobile_large

(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 gadget day 7) 姑娘,请问您的相位是多少 - SmartScope

今天嘛…本来想写structure sensor的,结果发现SDK超难用。然后想写Muse EEG,结果发现Muse的SDK需要把数据从Mac proxy过去才能用。妈蛋,你们SDK做这么烂怎么跟Mindwave拼…

最后只得挖出SmartScope。官网逛了一圈,唯一的感觉就是,这产品要挂了。完全没有人维护的社区,基本没功能的Demo app,据说ship产品以后就开源的github账号拥有0个repo。anyway,有啥东西可以用示波器来玩呢…

好吧,事先提醒下,今天没代码…

SmartScope

SmartScope当年在kickstart上众筹的时候,就让我一见倾心买了连接ipad的版本。结果几个月之后才发现他们一直在发一个mail催我补缴运费,我一直没理。好,货到了,发现ipad的连接线却没有…就这样抵运费了,真的好么…它就长这样。

图片描述

Foc.us

说到电流,立刻就想到了Foc.us,那个可以把电流注入到你大脑里的玩意儿。那就用这玩意儿看看它呗。打开Foc.us,连通,开始放电。

图片描述
图片描述

选择个正弦波。

图片描述

看这个波的样子。

图片描述

看起来只要把频率调一调就能看到一条漂亮的正弦波啦。看ze里,看ze里!

图片描述

所以结论就是…foc.us说的是实话…

naked iBeacon

好吧,文章这么短不好。我们再找个有电路的玩意儿~手头有几个没电了的Estimote,来妞儿,打开让我看看!嗯,正好有新的CR2450,来,复活吧!

图片描述

但问题来了…哪里有inspect的地方呢…好不容易找到四个触点。好吧,就让我们以猜公母结束吧,猜猜哪两个是一对儿~打开一条Math线,设置为A-B。捅来捅去吧。math线接近0的就是同一边儿的。好吧,知道你们也不在乎…

图片描述

知道为啥我不介绍其他类似decoder的功能么?因为他们还在coming soon!!!还在coming soon…

晚安~又混过去一天!

(30 gadget day 6) 主人,早上好 - iBeacon

咳咳,今天遍寻各处都想不到写个啥。于是只能假装我没玩过这个“新鲜”的gadget啦——iBeacon!

问候

办公室人少,每次去的时候都略显孤单。于是决定写一个跟自己打招呼的玩意儿,让我每次进门的时候都能收到一个“亲切的问候”,比如。

图片描述

iBeacon with Web

据说微信的JS SDK要开放iBeacon的部分了。所以嘛,先prototype一下咋用js来玩ibeacon。我先猜测下哈,微信的SDK是估计是把native的ibeacon数据通过微信转换以后bridge进H5应用里,也就是假设某个ibeacon对应的是吉野家某个门店的大门口,然后用户无论通过何种入口(摇一摇,扫二维码等),进入了一个开发者设定的H5页面里。在这个页面通过类似wx.beacons接口拿到了周围的ibeacon数据。这种数据应该是某个url,某个商家,某个门店,某个位置这样的,而不是类似UUID,major,minor这样的标准ibeacon id。

我想做的更简单一点。native app拿ibeacon数据,把数据同步给服务器,服务器确定是否要触发事件,如果需要则发给H5应用。这样的问题就是,要总连着网。so what,嗯。

iBeacon检测

家里的Estimote iBeacon都没了,只能用不熟悉的Kontakt的啦!他们长这样。

图片描述

去官网看文档,跳到Android的GetStart,直接搜“download”,果断看到“Go to the Kontakt.io Android SDK 1.0.5 on GitHub”,看到两个jar,直觉都当下来,回来看文档,都拷进去就好。

然后肯定就是加Permission啦,文档搜一搜,发现相比Estimote,Kontakt对权限分的更细一些,如果你不用他的云服务就不用加Internet权限。还有不大明白为啥针对萝莉炮要再加个Service,这都不能检测下么。

[code lang=text]
<service android:name="com.kontakt.sdk.android.manager.BeaconService" android:exported="false"/>
<service android:name="com.kontakt.sdk.android.manager.BeaconServiceL" android:exported="false"/>
[/code]

然后就是看具体怎么用啦。无非也就是创建个BeaconManager,收各种回调哈。

[code lang=text]
beaconManager = BeaconManager.newInstance(this);
beaconManager.setMonitorPeriod(MonitorPeriod.MINIMAL);
beaconManager.setForceScanConfiguration(ForceScanConfiguration.DEFAULT);
beaconManager.registerMonitoringListener(new BeaconManager.MonitoringListener() {
@Override
public void onMonitorStart() {}

@Override
public void onMonitorStop() {}

@Override
public void onBeaconsUpdated(final Region region, final List<Beacon> beacons) {}

@Override
public void onBeaconAppeared(final Region region, final Beacon beacon) {}

[/code]

这里文档有点问题,新的1.0.5的SDK里已经不是Beacon这个类而变成BeaconDevice了。connect函数里也有不一致的地方。startMonitoring的参数要清空就好了。不然就自己弄个Set,找个Everywhere的Region装进去。

[code lang=text]
private void connect() {
try {
beaconManager.connect(new OnServiceBoundListener() {
@Override
public void onServiceBound() {
try {
beaconManager.startMonitoring();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
} catch (RemoteException e) {
throw new IllegalStateException(e);
}
}
[/code]

数据中心

我一直希望把自己的各种数据尽量实时的扔到云里去,这样几十年以后就能知道现在的我是怎么活的啦。这里我也不希望搞个啥local server之类的,直接上云服务吧。以前介绍过PubNub就是个和Firebase类似的实时数据库。客户端和服务器端可以用超高抽象的handler来操纵数据。

这次我用PubNub来实现。GetStart就跳过了。看名字就知道这玩意儿是在做PubSub类似的技术。所以程序也很简单,一端Pub一端Sub。既然是手机端发现iBeacon那肯定是手机端来Pub喽。服务端就把事先知道的iBeacon都Sub上就好了。channel就用每个beacon的uuid:major:minor合起来hash一下哈。

[code lang=text]
Pubnub pubnub = new Pubnub("xxyyzz", "status");

try {
pubnub.subscribe("hello_world", new Callback() {

// 也可以直接抄一下昨天hue的api body,挺像的
pubnub.publish("xxyyzz", "{"status":"on"}" , callback);
[/code]

我来啦~

前端页面引入PubNub的库,每个设备都显示自己对应的页面,然后就Sub着就好啦。一旦有消息进来,就根据status选择性display那张图哈。

困死了困死了>.<

另外,求各种带API的硬件Gadget…库存快枯竭了…

EOF

(30 gadget day 5) 那棵灯 – HueMyo party

Philips的hue灯泡算是智能灯泡的鼻祖了,这次就来玩玩这个哈。

meethue

meethue.com是hue的门户啦,有各种的使用说明。开发者的入口在哪呢…找了半天发现右边有竖着的developer…

图片描述

好吧,进去以后直奔Get started。大概扫一圈以后发现这个hue的bridge设计的还真不错,直接通过http就能访问到api的测试后台。

图片描述

  • 认证
    只要改url和body就能直接控制灯泡。然后发现都是unauthorized。于是回来看文档,发现需要按一下bridge的button,然后立刻发个下面的请求就能认证上。之后的所有请求就都ok了。以后就可以用/api/newdeveloper/lights/1/state来控制这个id为1的灯泡啦。很标准的JSON RESTful API,设计的不错!
    不过这个不意味着我跑到任何一家有hue的地方,按一下按钮执行一个程序以后就可以躲门口随便玩他家的灯泡了…

[code lang=text]
POST http://<bridge ip address>/api
{"devicetype":"test user","username":"newdeveloper"}
[/code]

  • 修改灯泡状态
    每个灯泡都有一个url作为它的endpoint,可以对它肆意GET POST PUT。比如让它打开就curl一下。色温(sat)亮度(bri)和颜色(hue)控制起来超容易!

[code lang=text]
url -X PUT -H 'Content-Type: application/json' -d '{"on":false, "sat":255, "bri":255,"hue":10000}' http://192.168.31.xxx/api/newdeveloper/lights/1/state
[/code]

MYO控制HUE

哈,MYO又出现了!上次只拿了pose的数据,这次我想让灯泡跟着挥手变换颜色,那就要获得当前手臂的角度啦。代码的区别只是多加个回调就好啦。能拿到一个4维的数据。xyzw。

[code lang=text]
@Override
public void onOrientationData(Myo myo, long timestamp, Quaternion rotation) {
((TextView) findViewById(R.id.hello)).setText(
"Z:" + rotation.z() + " W:" + rotation.w() + " X:" + rotation.x() + " Y:" + rotation.y());

}
[/code]

通过观察发现挥手的时候变换的很多的是w轴,而且右手挥动的过程正好是-0.5到0.5的过程。好啦,现在把这个数据随时记录下来,每秒钟发个PUT过去改灯泡的状态。咱就用OkHttp搞好啦,类似这样。

[code lang=text]
String updateHue(int bright, int hue) throws IOException {
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(JSON,
"{"on":true,"bri":150}");
Request request = new Request.Builder()
.url("http://192.168.31.xxx/api/newdeveloper/lights/1/state&quot;)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
[/code]

Party!

好啦,就这样!

图片描述

Party呀

Powered by WordPress.com.

Up ↑