作者 主题: InfoQ  (阅读 151205 次)

二月 15, 2020, 10:01:16 pm
回复 #7425

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
AAAI 2020论文解读:商汤科技提出新弱监督目标检测框架

近期,商汤科技视频大数据团队发表论文《Object Instance Mining for Weakly Supervised Object Detection》,该论文被 AAAI 2020 录用。在论文中,该团队提出了一种端到端的物体实例挖掘弱监督目标检测框架,引入了基于空间图及外观图的信息传播机制,在网络迭代学习过程中,尝试挖掘每张图像中全部的物体实例。除此之外,还引入了物体实例权重调整损失函数 (reweighted loss),使网络可以同时学习到更完整的物体实例,从而让弱监督目标检测方法得到更加准确的检测框。


目标检测是计算机视觉领域长期关注的问题,在自动驾驶、图像理解、视频监控等领域都有着广泛的应用。然而基于深度学习技术的目标检测器在网络训练中需要大量精确标注的物体边界框,这些耗时耗力的标注工作阻碍了该技术在实际产品中的快速和广泛应用,同时大量的人工标注也大大提高了产品成本。为了解决这个局限性,仅使用图片级别标注(既标注仅包含图片中物体的类别)的弱监督目标检测技术在近几年受到了广泛的关注和研究,具有重要的意义。


现有的弱监督目标检测方法大多数是基于多实例学习框架的,对于每个物体类别,基于多实例学习框架的方法倾向于学习图像中该类中特征最明显的物体,并对于每张图片选取得分最大的一个物体框进行训练,其他被忽略的物体实例容易使学习网络陷入局部最优,进而影响弱监督目标检测的性能。


本论文提出了一种端到端的物体实例挖掘(Object Instance Mining, OIM)弱监督目标检测框架。该框架引入了基于空间图(Spatial Graph)及外观图(Appearance Graph)的信息传播机制,在网络迭代学习过程中,尝试挖掘每张图像中全部的物体实例。这样使得在基于多实例学习方法的网络学习过程中,特征不够显著的物体实例可以被检测到并加入训练,进而提升特征的表达能力和鲁棒性。除此之外,商汤科技视频大数据团队还引入了物体实例权重调整损失函数(reweighted loss),使网络可以同时学习到更完整的物体实例,从而让弱监督目标检测方法得到更加准确的检测框。基于物体实例挖掘(OIM)弱监督目标检测框架结构如下图所示:


物体实例挖掘(OIM)弱监督目标检测框架。


Source: AAAI 2020论文解读:商汤科技提出新弱监督目标检测框架

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 15, 2020, 10:01:16 pm
回复 #7426

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
疫情之下:金融科技企业的突围思考


众多金融科技企业在 2019 年年末做好了充足的准备,去应对监管、风控、新技术、安全合规等问题。只是不曾想到,2020 年的开端竟然是一场席卷全国的疫情爆发。这也验证了那句话:凡是能被验证的,都不是“黑天鹅”。



回顾 2019 年,金融科技领域发生了五件大事:


网贷行业方面,备案再次延期,出现数起头部平台退出事件;


银行业金融科技方面,开放银行成为了主流趋势,各银行都推出了开放银行平台;


银行再次下注金融科技子公司;


新技术方面,Facebook 主导的 Libra 再次将比特币拉回到公众视野;


小微金融方面,商业银行发力,多维数据成为小微金融业务的关键点。


疫情之下,金融行业应对风险的能力如何?金融科技公司如何突围?InfoQ 邀请了 12 家金融科技企业的专家,基于各自的研究领域,谈谈对 2020 年金融科技趋势的看法,以下是观点整理。


2020 年金融科技领域重点趋势解读


360 数据智能集团技术总监 徐皓


核心观点:银行数字化进程加速,安全和高效是核心诉求。


2019 年对于金融行业来说可谓是不平凡的一年,经历了史上最严的监管,大浪淘沙最终那些不断突破创新、良性运营的互联网金融企业坚持了下来。在当前疫情下,2020 年金融行业的技术发展趋势有以下几点:


传统银行业加速数字化转型、人工智能和云助力场景落地。今年突如其来的疫情让我们的工作和生活受到了不同程度的影响,银行业是关系到国计民生的行业,如何让其业务办理在现在的情况下尽可能不受到影响,网上银行无疑是一个最佳选择。


Source: 疫情之下:金融科技企业的突围思考

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 15, 2020, 10:01:16 pm
回复 #7427

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
李飞飞最新访谈:希望AI领域泡沫尽快消散,尤其是医疗部分


技术与人性间平衡的支点,如何寻找?



最近,Medscape《医学与机器》栏目的主持人、《深度医学(Deep Medicine)》的作者Eric J. Topol博士与李飞飞围绕“人工智能、医疗、人性”三个关键词展开了交谈。自从离开谷歌回到斯坦福,李飞飞就立即开启了一项“以人为中心的 AI 计划(Human-Centered AI Initiative,HAI)”,李飞飞曾在 twitter 上表示该项目的愿景是:推进 AI 研究、教育、政策和实践,以惠及全人类。



Eric J. Topol博士:大家好,这里是Eric Topol,也是Medscape《医学与机器》的主持人。很高兴能有机会与斯坦福大学的李飞飞教授面对面交流。她是斯坦福大学Human-Centered人工智能(HAI)研究所的负责人。多年以来,她在人工智能领域拥有巨大的影响力,同时也是我心中的巨人以及挚友。欢迎你,飞飞。


李飞飞:多谢,Eric。很高兴来到这里。其实我对你也抱有同感,你永远是我心中的医学数字化英雄。


Topol: 哈哈,太客气啦。此前,你在斯坦福大学开设了新的研究院能不能结合背景讲讲开设新研究院的原因,以及这家研究院的定位?


Source: 李飞飞最新访谈:希望AI领域泡沫尽快消散,尤其是医疗部分

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 16, 2020, 10:00:48 am
回复 #7428

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
程序原本(六):继承与混合,略谈系 统的构建方式

编者按:本文节选自周爱民著《程序原本》一书中的部分章节。


继承与混合,略谈系统的构建方式



节选自博客文章“继承与混合,略谈系统的构建方式”(2010年12月),文章讨论了对“基于对象系统进行系统构建”的认识与实现。



面向对象系统有三种对象的继承方式,即原型、类和元类。这三种方式都可以构建大型对象系统。在后续讨论之前,我们先在名词概念上做一些强调。所谓“对象系统”,是指由“一组对象构成的系统”,这些对象之间存在或不存在某种联系,但通过一些规则组织起来。所谓“面向对象系统”,是指以上述“对象系统”为基础延伸演化的系统,新系统满足前对象系统的组织规则。


所谓“对象系统的三个要素”——继承、封装与多态,即是上述组织规则的要件。孟岩同学从C/C++出发1,从另一个侧面谈论对象系统,所持的观点我相当认可。他指出,“对象范式的基本观念中不包括继承、封装与多态”,这一观点有其确切的背景与思考方法,值得一谈。


1 参见孟岩的博客文章“function/bind的救赎”:http://blog.csdn.net/myan/article/details/5928531


Source: 程序原本(六):继承与混合,略谈系 统的构建方式

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 16, 2020, 10:00:50 pm
回复 #7429

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
闲鱼端侧如何实现实时CEP引擎

闲鱼端侧如何实现实时CEP引擎


背景


用户来闲鱼,主要是为了获得自己关心的内容。随着闲鱼的体量越来越大,内容也变得越来越丰富。闲鱼基于用户画像,可以将用户关心的内容推送给用户。具体在哪些场景下才需要触发推送?我们定义了很多触发规则,包括停留时长、点击路径等。起初我们把触发规则的逻辑放在服务端(Blink)运行。但实践下来发现Blink存在诸多限制:



  • 服务端要对客户端埋点进行数据清洗,考虑到闲鱼的DAU已经突破2000w,这个量是非常庞大的,非常消耗服务端资源;

  • Blink的策略是实时执行的,同样因为资源问题,现在只能同时上线十几个策略。


如何解决这些问题呢,我们开始考虑能否将Blink的策略跑在客户端!


CEP模型


Blink,作为是Flink的一个分支,最初是阿里巴巴内部创建的,针对Flink进行了改进,所以我们这里还是围绕Flink讨论。CEP(Complex Event Process)是Flink中的一个子库,用来快速检测无尽数据流中的复杂模式。


Flink CEP


Flink的CEP的核心是NFA(Non-determined Finite Automaton),全称叫不确定的有限状态机。提到NFA,就不得不提Jagrati Agrawal等撰写的关于NFA模型的论文《Efficient Pattern Matching over Event Streams》,本篇论文中描述了NFA的匹配原理。



Source: 闲鱼端侧如何实现实时CEP引擎

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 16, 2020, 10:00:50 pm
回复 #7430

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
聊聊 Java 的几把 JVM 级锁

简介


在计算机行业有一个定律叫"摩尔定律",在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜, CPU 从单核到了多核,缓存性能也得到了很大提升,尤其是多核 CPU 技术的到来,计算机同一时刻可以处理多个任务。在硬件层面的发展带来的效率极大提升中,软件层面的多线程编程已经成为必然趋势,然而多线程编程就会引入数据安全性问题,有矛必有盾,于是发明了“锁”来解决线程安全问题。在这篇文章中,总结了 Java 中几把经典的 JVM 级别的锁。


synchronized


synchronized 关键字是一把经典的锁,也是我们平时用得最多的。在 JDK1.6 之前, syncronized 是一把重量级的锁,不过随着 JDK 的升级,也在对它进行不断的优化,如今它变得不那么重了,甚至在某些场景下,它的性能反而优于轻量级锁。在加了 syncronized 关键字的方法、代码块中,一次只允许一个线程进入特定代码段,从而避免多线程同时修改同一数据。


synchronized 锁有如下几个特点:


有锁升级过程


在 JDK1.5 (含)之前, synchronized 的底层实现是重量级的,所以之前一致称呼它为"重量级锁",在 JDK1.5 之后,对 synchronized 进行了各种优化,它变得不那么重了,实现原理就是锁升级的过程。我们先聊聊 1.5 之后的 synchronized 实现原理是怎样的。说到 synchronized 加锁原理,就不得不先说 Java 对象在内存中的布局, Java 对象内存布局如下:



如上图所示,在创建一个对象后,在 JVM 虚拟机( HotSpot )中,对象在 Java 内存中的存储布局 可分为三块:


Source: 聊聊 Java 的几把 JVM 级锁

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 16, 2020, 10:00:51 pm
回复 #7431

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
美团外卖持续交付的前世今生

0. 前言


美团外卖自2013年创建以来,业务一直在高速发展,目前日订单量已突破3000万单,已成为美团点评最重要的业务之一。美团外卖所承载的业务,从早期单一的美食业务发展成为了外卖平台业务。目前除餐饮业务外,闪购、跑腿、闪付、营销、广告等产品形态的业务也陆续在外卖平台上线。参与到美团外卖平台的业务团队,也从早期的单一的外卖团队发展成为多业务团队。每个业务团队虽然都有不同的业务形态,但是几乎都有相同的诉求:需求能不能尽快地上线?


然而,Native应用的发布依赖于应用市场的更新,周期非常长,非常不利于产品的快速迭代、快速试错。同时,作为平台方,我们需要考虑到各个业务团队的诉求,统筹考虑如何建立怎么样的模型、配套什么样的技术手段,才能实现最佳的状态,满足各业务更短周期、高质量的交付业务的诉求。本文会首先回顾美团外卖从早期的月交付,逐渐演变成双周交付,再从双周交付演变成双周版本交付配合周动态交付的过程。然后从外卖的历史实践中,浅谈一个好的持续交付需要综合考虑哪些关键因素,希望对大家有所帮助或启发。


1. 交付模型


一个需求从产生到交付再到用户的手上,要经历需求调研、需求分析、程序设计、代码开发、测试、部署上线等多个环节。在整个过程中,由于涉及到不同角色的人员,而不同角色人员的认知存在差异,不同的程序语言存在差异,不同的开发方式也存在差异。在整个交付需求的过程中,还面临着需求可能会被变更、交付周期可能会被变更等各种情况。这些情况使得需求的交付变得非常复杂、不可预期。


而软件开发的首要任务就是持续、尽早地交付有价值的软件。怎么解决这一问题,是软件工程一直在研究的话题。早在20世纪50年代,软件领域就在积极地探索设计什么样的模型可以解决这些问题。常见的包括瀑布流模型、迭代模型、螺旋模型、敏捷模型等等。由于篇幅原因,本文不再做详细的介绍。


2. 什么是持续交付


关注持续交付,不同的企业、不同的团队站在不同的角度存在不同的定义。《持续交付2.0:业务引领的DevOps精要》一书认为,站在企业的角度,将持续交付定位为一个产品价值的开发框架,是一个工具集,其中包含了一系列的原则和众多实践,帮助提升企业的内部运转速度和交付效率。


Source: 美团外卖持续交付的前世今生

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 16, 2020, 10:00:51 pm
回复 #7432

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
我写的代码与领导写的代码,有何区别?


在程序员圈子有很多有趣的等级划分规则,例如格子衬衫是程序员不能放弃的自尊心,衬衫上的格子数目越多,等级越高,技术越厉害;秃顶是尊贵身份的象征,发际线越高,等级越高,经验越丰富;而代码则是一个轮回,随着等级的变化,你会发现你写的代码又回到了“最初的美好”!



编者小贴士:本文仅供娱乐,博君一笑!


首先,我们先来看看不同级别的程序员写的代码都是怎样的?在这里我们把程序员从学生到CEO共分成了14个等级,快来看看,你和你领导写的代码,差在哪里?


初高中同学写的代码


  10 PRINT "HELLO WORLD"

  20 END


## 大学一年级同学写的代码



  program Hello(input, output)

    begin

      writeln('Hello World')

    end.

大学四年级同学写的代码


  (defun hello

    (print

      (cons 'Hello (list 'World))))


初入职场菜鸟程序员写的代码


  #include <stdio.h>

  void main(void)

  {

    char *message[] = {"Hello ", "World"};

    int i;

 

    for(i = 0; i < 2; ++i)

      printf("%s", message[i]);

    printf("\n");

  }

工作多年的资深程序员写的代码


  #include <iostream.h>

  #include <string.h>


  class string

  {

  private:

    int size;

    char *ptr;

 

  string() : size(0), ptr(new char[1]) { ptr[0] = 0; }

 

    string(const string &s) : size(s.size)

    {

      ptr = new char[size + 1];

      strcpy(ptr, s.ptr);

    }

 

    ~string()

    {

      delete [] ptr;

    }

 

    friend ostream &operator <<(ostream &, const string &);

    string &operator=(const char *);

  };

 

  ostream &operator<<(ostream &stream, const string &s)

  {

    return(stream << s.ptr);

  }

 

  string &string::operator=(const char *chrs)

  {

    if (this != &chrs)

    {

      delete [] ptr;

     size = strlen(chrs);

      ptr = new char[size + 1];

      strcpy(ptr, chrs);

    }

    return(*this);

  }

 

  int main()

  {

    string str;

 

    str = "Hello World";

    cout << str << endl;

 

    return(0);

  }


骨灰级程序员写的代码


  [

  uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)

  ]

  library LHello

  {

      // bring in the master library

      importlib("actimp.tlb");

      importlib("actexp.tlb");

 

      // bring in my interfaces

      #include "pshlo.idl"

 

      [

      uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)

      ]

      cotype THello

   {

   interface IHello;

   interface IPersistFile;

   };

  };

 

  [

  exe,

  uuid(2573F890-CFEE-101A-9A9F-00AA00342820)

  ]

  module CHelloLib

  {

 

      // some code related header files

      importheader(<windows.h>);

      importheader(<ole2.h>);

      importheader(<except.hxx>);

      importheader("pshlo.h");

      importheader("shlo.hxx");

      importheader("mycls.hxx");

 

      // needed typelibs

      importlib("actimp.tlb");

      importlib("actexp.tlb");

      importlib("thlo.tlb");

 

      [

      uuid(2573F891-CFEE-101A-9A9F-00AA00342820),

      aggregatable

      ]

      coclass CHello

   {

   cotype THello;

   };

  };
 

  #include "ipfix.hxx"

  extern HANDLE hEvent;

  class CHello : public CHelloBase

  {

  public:

      IPFIX(CLSID_CHello);


      CHello(IUnknown *pUnk);

      ~CHello();


      HRESULT  __stdcall PrintSz(LPWSTR pwszString);

 

  private:

      static int cObjRef;

  };

 
  #include <windows.h>

  #include <ole2.h>

  #include <stdio.h>

  #include <stdlib.h>

  #include "thlo.h"

  #include "pshlo.h"

  #include "shlo.hxx"

  #include "mycls.hxx"


  int CHello::cObjRef = 0;


  CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)

  {

      cObjRef++;

      return;

  }

 

  HRESULT  __stdcall  CHello::PrintSz(LPWSTR pwszString)

  {

      printf("%ws

", pwszString);

      return(ResultFromScode(S_OK));

  }


  CHello::~CHello(void)

  {

 

  // when the object count goes to zero, stop the server

  cObjRef--;

  if( cObjRef == 0 )

      PulseEvent(hEvent);

 

  return;

  }

 

  #include <windows.h>

  #include <ole2.h>

  #include "pshlo.h"

  #include "shlo.hxx"

  #include "mycls.hxx"


  HANDLE hEvent;


   int _cdecl main(

  int argc,

  char * argv[]

  ) {

  ULONG ulRef;

  DWORD dwRegistration;

  CHelloCF *pCF = new CHelloCF();

 

  hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

 

  // Initialize the OLE libraries

  CoInitializeEx(NULL, COINIT_MULTITHREADED);

 

  CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,

      REGCLS_MULTIPLEUSE, &dwRegistration);

 

  // wait on an event to stop

  WaitForSingleObject(hEvent, INFINITE);

 

  // revoke and release the class object

  CoRevokeClassObject(dwRegistration);

  ulRef = pCF->Release();

 

  // Tell OLE we are going away.

  CoUninitialize();

 

  return(0); }

 

  extern CLSID CLSID_CHello;

  extern UUID LIBID_CHelloLib;

 

  CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */

      0x2573F891,

      0xCFEE,

      0x101A,

      { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }

  };

 

  UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */

      0x2573F890,

      0xCFEE,

      0x101A,

      { 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }

  };

 

  #include <windows.h>

  #include <ole2.h>

  #include <stdlib.h>

  #include <string.h>

  #include <stdio.h>

  #include "pshlo.h"

  #include "shlo.hxx"

  #include "clsid.h"

 

  int _cdecl main(

  int argc,

  char * argv[]

  ) {

  HRESULT  hRslt;

  IHello        *pHello;

  ULONG  ulCnt;

  IMoniker * pmk;

  WCHAR  wcsT[_MAX_PATH];

  WCHAR  wcsPath[2 * _MAX_PATH];

 

  // get object path

  wcsPath[0] = '\0';

  wcsT[0] = '\0';

  if( argc > 1) {

      mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);

      wcsupr(wcsPath);

      }

  else {

      fprintf(stderr, "Object path must be specified\n");

      return(1);

      }

 

  // get print string

  if(argc > 2)

      mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);

  else

      wcscpy(wcsT, L"Hello World");

 

  printf("Linking to object %ws\n", wcsPath);

  printf("Text String %ws\n", wcsT);

 

  // Initialize the OLE libraries

  hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);

 

  if(SUCCEEDED(hRslt)) {

 

 

      hRslt = CreateFileMoniker(wcsPath, &pmk);

      if(SUCCEEDED(hRslt))

   hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);

 

      if(SUCCEEDED(hRslt)) {

 

   // print a string out

   pHello->PrintSz(wcsT);

 

   Sleep(2000);

   ulCnt = pHello->Release();

   }

      else

   printf("Failure to connect, status: %lx", hRslt);

 

      // Tell OLE we are going away.

      CoUninitialize();

      }

 

  return(0);

  }


菜鸟黑客写的代码


  #!/usr/local/bin/perl

  $msg="Hello, world.\n";

  if ($#ARGV >= 0) {

    while(defined($arg=shift(@ARGV))) {

      $outfilename = $arg;

      open(FILE, ">" . $outfilename) || die "Can't write $arg: $!\n";

      print (FILE $msg);

      close(FILE) || die "Can't close $arg: $!\n";

    }

  } else {

    print ($msg);

  }

  1;


有经验的黑客写的代码


  #include <stdio.h>

  #define S "Hello, World\n"

  main(){exit(printf(S) == strlen(S) ? 0 : 1);}


资深黑客写的代码


  % cc -o a.out ~/src/misc/hw/hw.c

  % a.out


骨灰级黑客大师写的代码


  % echo "Hello, world."


新任的初级经理写的代码


  10 PRINT "HELLO WORLD"

  20 END


中级经理写的代码


  mail -s "Hello, world." bob@b12

  Bob, could you please write me a program that prints "Hello, world."?

  I need it by tomorrow.

  ^D


高级经理写的代码


  % zmail jim

  I need a "Hello, world." program by this afternoon.


公司CEO写的代码


  % letter

  letter: Command not found.

  % mail

  To: ^X ^F ^C

  % help mail

  help: Command not found.

  % damn!

  !: Event unrecognized

  % logout


看完不同级别程序员的代码之后,你是不是也有所触动呢?上面的例子可能有点宽泛,接下来我们就集中在Go语言,看看不同级别的程序员都是怎么样写代码的?


初级Go语言程序员写的代码


package fac

func Factorial(n int) int {
res := 1

for i := 1; i <= n; i++ {
res *= i
}

return res
}


功能性Go语言程序员写的代码


package fac

func Factorial(n int) int {
if n == 0 {
return 1
} else {
return Factorial(n - 1) * n
}
}


通用Go语言程序员写的代码


package fac

func Factorial(n interface{}) interface{} {
v, valid := n.(int)
if !valid {
return 0
}

res := 1

for i := 1; i <= v; i++ {
res *= i
}

return res
}


多线程优化的Go语言程序员写的代码


 package fac

import "sync"

func Factorial(n int) int {
var (
left, right = 1, 1
wg sync.WaitGroup
)

wg.Add(2)

pivot := n / 2

go func() {
for i := 1; i < pivot; i++ {
left *= i
}

wg.Done()
}()

go func() {
for i := pivot; i <= n; i++ {
right *= i
}

wg.Done()
}()

wg.Wait()

return left * right
}

利用Go设计模式的程序员写的代码


package fac

func Factorial(n int) <-chan int {
ch := make(chan int)

go func() {
prev := 1

for i := 1; i <= n; i++ {
v := prev * i

ch <- v

prev = v
}

close(ch)
}()

return ch
}


利用成熟的Go解决方案写的代码


package fac

/**
 * @see https://en.wikipedia.org/wiki/Factorial
 */
type IFactorial interface {
CalculateFactorial() int
}

// FactorialImpl implements IFactorial.
var _ IFactorial = (*FactorialImpl)(nil)

/**
 * Used to find factorial of the n.
 */
type FactorialImpl struct {
/**
* The n.
*/
n int
}

/**
 * Constructor of the FactorialImpl.
 *
 * @param n the n.
 */
func NewFactorial(n int) *FactorialImpl {
return &FactorialImpl{
n: n,
}
}

/**
 * Gets the n to use in factorial function.
 *
 * @return int.
 */
func (this *FactorialImpl) GetN() int {
return this.n
}

/**
 * Sets the n to use in factorial function.
 *
 * @param n the n.
 * @return void.
 */
func (this *FactorialImpl) SetN(n int) {
this.n = n
}

/**
 * Returns factorial of the n.
 *
 * @todo remove "if" statement. Maybe we should use a factory or somthing?
 *
 * @return int.
 */
func (this *FactorialImpl) CalculateFactorial() int {
if this.n == 0 {
return 1
}

n := this.n
this.n = this.n - 1

return this.CalculateFactorial() * n
}


高级Go语言程序员写的代码


package fac

// Factorial returns !n.
func Factorial(n int) int {
res := 1

for i := 1; i <= n; i++ {
res *= i
}

return res
}


类似于Rob Pike宗师级程序员写的代码


package fac

// Factorial returns !n.
func Factorial(n int) int {
res := 1

for i := 1; i <= n; i++ {
res *= i
}

return res
}


原文链接:


https://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html


Source: 我写的代码与领导写的代码,有何区别?

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 16, 2020, 10:00:51 pm
回复 #7433

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
AAAI 2020论文解读: 商汤科技发布新视频语义分割和光流联合学习算法

视频语义分割的一个主要的挑战是缺少标注数据。在大多数基准数据集中,每个视频序列(20 帧)往往只有一帧是有标注的,这使得大部分监督方法都无法利用剩余的数据。为了利用视频中的时间 - 空间信息,许多现有工作使用预先计算好的光流来提升视频分割的性能,然而视频分割和语义分割仍然被看作是两个独立的任务。近日,商汤科技研究团队发表论文《Every Frame Counts: Joint Learning of Video Segmentation and Optical Flow》,该论文被 AAAI 2020 录用。


在这篇文章中,作者提出了一个新颖的光流和语义分割联合学习方案。语义分割为光流和遮挡估计提供了更丰富的语义信息,而非遮挡的光流保证了语义分割的像素级别的时序一致性。作者提出的语义分割方案不仅可以利用视频中的所有图像帧,而且在测试阶段不增加额外的计算量。


背景


视频语义分割通过利用前后帧的语义信息,往往有着比图像分割更高的准确率,因此在机器人和自动驾驶领域有着丰富的应用。然而目前的视频语义分割主要面临两个挑战:缺少标注数据和实时性的问题。一方面由于标注工作耗时耗力,一个视频片段往往只标注一帧,导致很多方法难以利用全部的数据,或者需要使用额外的数据集做预训练;另一方面由于对前后帧之间进行信息交互往往为模型引入额外的模块,导致视频分割效率低。视频分割大致可以分为两类,第一类通过利用前后帧的时序信息来为视频分割加速,如Clockwork network (Shelhamer et al. 2016) ,Deep Feature Flow (Zhu et al. 2017) 和 (Li, Shi, and Lin 2018) 等,这类模型对前一帧的特征图或者分割结果进行简单处理即可得到下一帧的分割结果了,从而大大减少视频分割中的冗余和加速,但语义分割的准确率会有所降低;第二类方法如 (Fayyaz et al. 2016) ,Netwarp (Gadde, Jampani, and Gehler 2017),PEARL (Jin et al. 2017) 等通过光流/RNN等模块将前后帧的特征进行融合或添加约束以学习到更强的表示能力,从而提高语义分割的准确率。本文的方法属于第二类。


图一,和使用特征融合(feature aggregation)的方法往往只利用标注帧附近的少数帧相比,本文通过学习的光流来为视频帧添加时序一致性约束,通过这种约束可以间接把分割标注传导到其他无标注的帧上,从而利用全部的数据。


方法概述


光流作为视频中前后帧之间像素级别的关联,在视频语义分割中一直有着重要的地位。例如 (Li, Shi, and Lin 2018; Zhu et al. 2017; Shelhamer et al. 2016) 通过光流来重新利用前一帧的特征图从而为视频分割加速;(Fayyaz et al. 2016; Jin et al. 2017; Gadde, Jampani, and Gehler 2017; Nilsson and Sminchisescu 2018; Hur and Roth 2016) 通过光流指导的特征融合来获得更好的分割准确率。然而上述方法面临两个问题,一方面其往往使用现成的在其他数据集上训练的光流模型(FlowNet),导致了分割效率的降低;另一方面上述方法往往只利用了标准帧附近的少数帧,没有充分利用整个数据集和发挥光流的作用。


Source: AAAI 2020论文解读: 商汤科技发布新视频语义分割和光流联合学习算法

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 16, 2020, 10:00:51 pm
回复 #7434

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
2020年热门编程语言的发展方向

时间行至2020年,对于编程语言的未来发展,很多人会更多的期待。因此,我们向多位编程专家征询了他们对热门编程语言的看法。


Python


今年Python最大的新闻是,其创造者和“终身仁慈独裁者(BDFL)”Guido van Rossum退休了,将Python交给了Python指导委员会(Python Steering Council)。到目前为止,权力转移还算顺利,正如《Python编程从入门到实践》(Python Crash Course)的作者Eric Matthes所认为的那样,这并不足以为奇,因为“长久以来,Guido一直都能在他自己和在社区中的角色之间保持平衡。”2020年也将终止对Python 2.7的支持,这很可能会让其反对者感到头疼。同时,Python仍然是数据科学的首选语言


对于Matthes而言,Python令人兴奋的一个方面是“在一个长期以来刻意构建其多样性的社区中,出现了各种有趣而关键的项目。”Python指导委员会的成员、CPython的核心开发人员Carol Willing也对这些项目表示了赞赏,比如Binder服务,它通过我们的Jupyter Notebooks创建一个可执行的环境来促进可重复的研究,尤其是当它们超出最初的目标时。她指出,Binder“去年被广泛用于许多Python会议的教学研讨班和教程”,Willing还对CircuitPython和Mu项目大声疾呼,问到:“谁不喜欢硬件、闪烁的LED、传感器,使用Mu,一个老少咸宜、用户友好的编辑器?”


Java


这主要是Java方面的好消息。Java Champion Ben Evans解释道,“关于Java消亡的谣言再一次被证明不过是平台批评者的一厢情愿而已。”但这也并非一帆风顺。正如我们去年所注意到的那样,2018年9月发布的Java 11带来了大量的新特性,其中许多特性为容器的使用提供了显著且明显的优势。然而,JetBrains的调查显示,这个最新版本并没有被广泛采用,超过80%的开发人员仍然使用Java 8。Evans想知道,“这是否意味着人们并没有像我们所说的那样在容器中运行Java呢?还是人们根本不知道Java 11在容器方面的优势呢?”


尽管采用速度很慢,但Java每六个月发布一次的节奏一直在不断延续:Java 12于2019年3月发布,Java 13于9月发布。据Java Champion Trisha Gee所说,它已经开始显示出它的价值了:


Source: 2020年热门编程语言的发展方向

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 16, 2020, 10:00:51 pm
回复 #7435

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
AI周报:钟南山团队与阿里云联手推进疫苗研发;百度开源业界首个口罩人脸检测及分类模型;外科手术机器人首次通过人体测试;

资讯


百度开源业界首个口罩人脸检测及分类模型


2 月 13 日,百度飞桨宣布开源业界首个口罩人脸检测及分类模型。基于此模型,可以在公共场景检测大量的人脸同时,把佩戴口罩和未佩戴口罩的人脸标注出来,快速识别各类场景中不重视、不注意防护病毒,甚至存在侥幸心理的人,减少公众场合下的安全隐患。同时构建更多的防疫公益应用。



口罩人脸检测及分类模型,由两个功能单元组成,可以分别完成口罩人脸的检测和口罩人脸的分类。经过测试,口罩人脸检测部分在准确度上达到了 98%,且口罩人脸分类部分准确率同样达到了 96.5%。同时,它做到了模型的极致轻量化,可在大部分端边云设备上实现实时处理(海思 3559 芯片耗时仅需 17ms)。百度也将持续更新这一模型,不断提升效果。


Gitee已支持OSI认证的第二版木兰开源许可MulanPSL-2.0


在木兰宽松许可证第2版(MulanPSL-2.0)通过开源促进会(OSI)认证,成为一个国际化开源许可之后,Gitee平台目前已经新增了对该版本许可的支持。


此前Gitee已经支持MulanPSL-1.0,此次新增支持的MulanPSL-2.0在MulanPSL-1.0 的基础上明确了许可证规范语言。开发者可以通过“许可证向导”轻松选用该许可。木兰宽松许可证是首个由中国开源产业界联合编制并通过OSI认证的开源软件许可证,也标志着我国开源界立足中国贡献全球方面取得突破性进展。


Source: AI周报:钟南山团队与阿里云联手推进疫苗研发;百度开源业界首个口罩人脸检测及分类模型;外科手术机器人首次通过人体测试;

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 17, 2020, 10:02:08 am
回复 #7436

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
程序原本(七):像大师们一样思考

编者按:本文节选自周爱民著《程序原本》一书中的部分章节。


像大师们一样思考——从“UML何时死掉”谈起



节选自博客文章“像大师们一样思考——从‘UML何时死掉’谈起”(2008年10月),文章是在与“UML之父”Ivar Jacobson先生座谈后的反思。



算盘用了几千年,谁问过“算盘为什么能算东西”?算珠、进位、栏,这些东西是不是基本的存储结构?用算盘的“我们”,是不是计算单元?珠算表是不是运算规则?那些珠子表达出来的“0~9”的排列,是不是输入输出的界面?


“我们+算盘”就是一个完整的计算系统。这样的计算系统的完整性,图灵用了一个假想加以说明。图灵不过是用一个假想描述了一个事实,而这个事实“看起来”能被机器实现。于是,我们的计算机时代就开始了。


图灵是否证明过“大笨象吃意大利面条为什么是一个完备的计算机系统”呢?不,最初等的问题,往往最难于证明。往往,他的证明过程,或应用过程,只是触发了一个想象。


Source: 程序原本(七):像大师们一样思考

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 17, 2020, 10:02:08 am
回复 #7437

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
如何使用Rust来构建微服务?

Rust是一门很棒的语言,也是我在2019年和2020年(截止当前)学的最多的语言。Rust几乎可以和任何语言互操作,同时对于容器和在Kubernetes上运行也非常友好。


今天,我想展示下如何使用Rust构建一个简单的微服务。本文中,我们将使用ActixTokio-Postgress和其他一些库,使用Postgres作为唯一数据源,同时为了便于开发,我们会将其运行在Docker容器中。另外,我还会使用自己开发的Barrel作为数据库迁移工具。代码将全部使用异步和非阻塞IO实现。


总体架构



这里我们采用多层架构,业务规则和REST请求定义在news-contract中实现。SOA约定定义在news-contract + news-service,数据结构(News)定义在news-contract。REST请求的endpoint和服务定义在news-service中。Postgres持久化相关功能定义在news-dao中。


代码结构



Source: 如何使用Rust来构建微服务?

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 17, 2020, 10:02:08 am
回复 #7438

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
极客邦科技合作伙伴年会:重返 20 岁

2020 年 1 月 15 日,极客邦科技合作伙伴年会在北京顺利举行,一百余位合作伙伴应邀参加,极客邦科技高管团队全程参与。



极客邦科技合作伙伴年会现场

随着极客邦科技公司业务的多元化拓展,从技术媒体到技术人社交平台,在到技术会议和在线教育产品,合作伙伴生态也随之丰富。虽是一年一度,但是今年最大的不同正在于,本次年会不仅仅一如往常地,邀请了本年度商业客户,还有部分TGO鲲鹏会会员、技术大会的会议专家、极客时间 App 的专栏作者和老师,以及一年以来值得信赖、并肩作战的各类供应商。


2019 年,有人说是资本寒冬的一年,有人说是产业大变革的中间点。极客邦科技始终相信,因为合作伙伴,所以穿越寒冬,也因为彼此信任,所以屡创新绩。


年会期间,极客邦科技创始人兼 CEO 霍泰稳做了新年度展望和祝福。在致辞中,霍泰稳(Kevin)重新阐释了极客邦科技的愿景和使命,“在追求全体奋斗者物质与精神两方面幸福的同时,整合全球优质 IT 资源,帮助技术和相关人群(企业)学习和成长,让创新技术推动社会进步。再用 12 年,到 2031 年,将极客邦科技建设成为一个全职员工万人量级,年营业收入百亿规模,产品和服务全球化的世界级 IT 知识服务平台。”也介绍了新鲜出炉的极客邦科技的用户价值主张,“面向有技能提升需求的企业和个人,提供实践驱动的,品质高的,体验好的学习产品和服务”。希望极客邦科技的小伙伴,以此为准绳,严格要求自己,以客户为中心,持续努力奋斗。


Source: 极客邦科技合作伙伴年会:重返 20 岁

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

二月 17, 2020, 10:02:08 am
回复 #7439

admin

  • Administrator
  • Newbie

  • 离线
  • *****

  • 0
  • Karma:
    +0/-0
  • 个人说明
    SoftPlus 资深程序员
    • 查看个人资料
    • http://www.softplus.org
阿里达摩院最新AI技术:新冠肺炎CT影像识别准确率达96%

近日,达摩院联合阿里云针对新冠肺炎临床诊断研发了一套全新AI诊断技术,AI可以在20秒内准确地对新冠疑似案例CT影像做出判读,分析结果准确率达到96%,大幅提升诊断效率,河南郑州小汤山已经引入该算法辅助临床诊断。


新冠疫情早期,由于确诊案例样本量少,医疗机构缺少高质量临床诊断数据,核酸检测作为病原学证据被公认为新冠肺炎诊断的主要参考标准。随着临床诊断数据的积累,新冠肺炎的影像学大数据特征逐渐清晰,CT影像诊断结果变得愈发重要。根据国家卫健委公布的诊疗方案第五版,临床诊断无需依赖核酸检测结果,CT影像临床诊断结果可作为新冠肺炎病例判断的标准。


AI自动识别新冠肺炎病例CT胸片


新冠肺炎患者的CT胸片的影像特征表现为单肺或双肺多发、斑片状或节段性磨玻璃密度影等细微变化。一位新冠肺炎病人的CT影像大概在300张左右,这给医生临床诊断带来巨大压力,医生对一个病例的CT影像肉眼分析耗时大约为5-15分钟。


达摩院医疗AI团队基于当前最新的诊疗方案、钟南山等多个权威团队发表的关于新冠肺炎患者临床特征的论文,与浙大一附院、万里云、长远佳和古珀医院等多家机构合作,突破训练数据不足的局限,基于5000多个病例的CT影像样本数据,学习训练样本的病灶纹理,研发了全新的AI算法模型。


Source: 阿里达摩院最新AI技术:新冠肺炎CT影像识别准确率达96%

InfoQ 促进软件开发领域知识与创新的传播
http://www.infoq.com/cn/
软佳科技有限公司 http://www.softplus.org
软佳医疗软件 http://www.ynhis.com
最新Linode VPS 优惠码新用户注册省10美元:Active Linode $10 Coupon

 

Sitemap 1 2 3 4 5 6 7 8 9