Fengxiaoping's bubble

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

    2月 17th, 2022

    学习内容 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)

    2月 16th, 2022

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

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

    好啦,我颠儿了。

    生成自 deepdreamgenerator.com
  • Saleor开源电商框架

    2月 5th, 2022

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

    2月 11th, 2019

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

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

    DSC01935

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

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

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

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

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

    IMG_0584
    DSC01950
    IMG_0587
    DSC01960
    Frame-11-02-2019-12-10-15
    IMG_0596
    DSC01956
    IMG_0585
    IMG_0590

     

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

    male-zombie-vector-clipart

     

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

    download

  • 创业者们(1)

    12月 11th, 2017

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

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

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

    老板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先生描述的业务场景还相距十万八千里。

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

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

  • 《说好的脑洞呢》

    10月 4th, 2015

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

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

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

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

    wKgDbVYMCcijPhKwAABuDRjbKRw148_mobile_large

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

    3月 10th, 2015

    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

    2月 26th, 2015

    今天嘛…本来想写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

    2月 25th, 2015

    咳咳,今天遍寻各处都想不到写个啥。于是只能假装我没玩过这个“新鲜”的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

    2月 24th, 2015

    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呀

1 2 3 … 9
下一页→

Blog at WordPress.com.

 

正在加载评论...