IT技术精华 http://it.taocms.org/ 聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长 2018-12-10 IT技术精华 14556 不用矿机也能爆块 BHEX超级公会与比特币爆块机制一模一样 在区块链领域,比特币的POW是备受大家任何的价值产生方式,通过矿机自身的算力,根据公平的原则来进行爆块。让参与的每台矿机都有同样的机会获得奖励。

 

而最近,新一代金融级去中心化加密资产托管交易平台BHEX也在其产品超级公会中推出了一模一样的爆块奖励模式。

 

超级公会就是让任何用户都可以创建自己的交易社群,每个会员通过一些行为获得算力,而这个算力可以参与爆块奖励。算力越高,获得爆块的机率越大,同时,超级公会就像矿池一样,可以集合很多人的算力,提升爆块机率,并且根据算力对所获得奖励在公会内进行分配。

 

据悉,超级公会最近即将爆块出三个大奖,分别价值100万的BHT。BHT是BHEX交易平台的平台Token,已经被52家全球知名投资机构所持有。据神秘人士介绍,100万BHT的价值接近10个BTC。

 

除了超级公会的爆块奖励外,会员还可以在其中获得交易策略分享,及时的行业资讯,丰富个人的行业信息来源。

作者:superyan 发表于 2018/11/27 16:08:58 原文链接 [sourcelinkurl]
阅读:0

立即购买:淘宝网]]>
IT技术精华 2018-11-27 22:11:11
14555 在 Linux 上自定义 bash 命令提示符

众所周知,bash(the Bourne-Again Shell)是目前绝大多数 Linux 发行版使用的默认 shell。本文将会介绍如何通过添加颜色和样式来自定义 bash 命令提示符的显示。尽管很多插件或工具都可以很轻易地满足这一需求,但我们也可以不使用插件和工具,自己手动自定义一些基本的显示方式,例如添加或者修改某些元素、更改前景色、更改背景色等等。

在 Linux 中自定义 bash 命令提示符

在 bash 中,我们可以通过更改 $PS1 环境变量的值来自定义 bash 命令提示符。

一般情况下,bash 命令提示符会是以下这样的形式:

在上图这种默认显示形式当中,“sk” 是我的用户名,而 “ubuntuserver” 是我的主机名。

只要插入一些以反斜杠开头的特殊转义字符串,就可以按照你的喜好修改命令提示符了。下面我来举几个例子。

在开始之前,我强烈建议你预先备份 ~/.bashrc 文件。

$ cp ~/.bashrc ~/.bashrc.bak

更改 bash 命令提示符中的 username@hostname 部分

如上所示,bash 命令提示符一般都带有 “username@hostname” 部分,这个部分是可以修改的。

只需要编辑 ~/.bashrc 文件:

$ vi ~/.bashrc

在文件的最后添加一行:

PS1="ostechnix> "

将上面的 “ostechnix” 替换为任意一个你想使用的单词,然后按 ESC 并输入 :wq 保存、退出文件。

执行以下命令使刚才的修改生效:

$ source ~/.bashrc

你就可以看见 bash 命令提示符中出现刚才添加的 “ostechnix” 了。

再来看看另一个例子,比如将 “username@hostname” 替换为 “Hello@welcome>”。

同样是像刚才那样修改 ~/.bashrc 文件。

export PS1="Hello@welcome> "

然后执行 source ~/.bashrc 让修改结果立即生效。

以下是我在 Ubuntu 18.04 LTS 上修改后的效果。

仅显示用户名

如果需要仅显示用户名,只需要在 ~/.bashrc 文件中加入以下这一行。

export PS1="u "

这里的 u 就是一个转义字符串。

下面提供了一些可以添加到 $PS1 环境变量中的用以改变 bash 命令提示符样式的转义字符串。每次修改之后,都需要执行 source ~/.bashrc 命令才能立即生效。

显示用户名和主机名

export PS1="uh "

命令提示符会这样显示:

skubuntuserver

显示用户名和完全限定域名

export PS1="uH "

在用户名和主机名之间显示其它字符

如果你还需要在用户名和主机名之间显示其它字符(例如 @),可以使用以下格式:

export PS1="u@h "

命令提示符会这样显示:

sk@ubuntuserver

显示用户名、主机名,并在末尾添加 $ 符号

export PS1="u@h$ "

综合以上两种显示方式

export PS1="u@h> "

命令提示符最终会这样显示:

sk@ubuntuserver>

相似地,还可以添加其它特殊字符,例如冒号、分号、星号、下划线、空格等等。

显示用户名、主机名、shell 名称

export PS1="u@h>s "

显示用户名、主机名、shell 名称以及 shell 版本

export PS1="u@h>sv "

bash 命令提示符显示样式:

显示用户名、主机名、当前目录

export PS1="u@hw "

如果当前目录是 $HOME ,会以一个波浪线(~)显示。

在 bash 命令提示符中显示日期

除了用户名和主机名,如果还想在 bash 命令提示符中显示日期,可以在 ~/.bashrc 文件中添加以下内容:

export PS1="u@h>d "

在 bash 命令提示符中显示日期及 12 小时制时间

export PS1="u@h>d@ "

显示日期及 hh:mm:ss 格式时间

export PS1="u@h>dT "

显示日期及 24 小时制时间

export PS1="u@h>dA "

显示日期及 24 小时制 hh:mm:ss 格式时间

export PS1="u@h>dt "

以上是一些常见的可以改变 bash 命令提示符的转义字符串。除此以外的其它转义字符串,可以在 bash 的 man 手册 PROMPTING 章节中查阅。

你也可以随时执行以下命令查看当前的命令提示符样式。

$ echo $PS1

在 bash 命令提示符中去掉 username@hostname 部分

如果我不想做任何调整,直接把 username@hostname 部分整个去掉可以吗?答案是肯定的。

如果你是一个技术方面的博主,你有可能会需要在网站或者博客中上传自己的 Linux 终端截图。或许你的用户名和主机名太拉风、太另类,不想让别人看到,在这种情况下,你就需要隐藏命令提示符中的 “username@hostname” 部分。

如果你不想暴露自己的用户名和主机名,只需要按照以下步骤操作。

编辑 ~/.bashrc 文件:

$ vi ~/.bashrc

在文件末尾添加这一行:

PS1="W> "

输入 :wq 保存并关闭文件。

执行以下命令让修改立即生效。

$ source ~/.bashrc

现在看一下你的终端,“username@hostname” 部分已经消失了,只保留了一个 ~> 标记。

如果你想要尽可能简单的操作,又不想弄乱你的 ~/.bashrc 文件,最好的办法就是在系统中创建另一个用户(例如 “user@example”、“admin@demo”)。用带有这样的命令提示符的用户去截图或者录屏,就不需要顾虑自己的用户名或主机名被别人看见了。

警告:在某些情况下,这种做法并不推荐。例如像 zsh 这种 shell 会继承当前 shell 的设置,这个时候可能会出现一些意想不到的问题。这个技巧只用于隐藏命令提示符中的 “username@hostname” 部分,仅此而已,如果把这个技巧挪作他用,也可能会出现异常。

为 bash 命令提示符着色

目前我们也只是变更了 bash 命令提示符中的内容,下面介绍一下如何对命令提示符进行着色。

通过向 ~/.bashrc 文件写入一些配置,可以修改 bash 命令提示符的前景色(也就是文本的颜色)和背景色。

例如,下面这一行配置可以令某些文本的颜色变成红色:

export PS1="u@

[e[31m]

h

[e[m]

"

添加配置后,执行 source ~/.bashrc 立即生效。

你的 bash 命令提示符就会变成这样:

类似地,可以用这样的配置来改变背景色:

export PS1="u@

[e[31;46m]

h

[e[m]

"

添加 emoji

大家都喜欢 emoji。还可以按照以下配置把 emoji 插入到命令提示符中。

PS1="W ♤ >"

需要注意的是,emoji 的显示取决于使用的字体,因此某些终端可能会无法正常显示 emoji,取而代之的是一些乱码或者单色表情符号。

自定义 bash 命令提示符有点难,有更简单的方法吗?

如果你是一个新手,编辑 $PS1 环境变量的过程可能会有些困难,因为命令提示符中的大量转义字符串可能会让你有点晕头转向。但不要担心,有一个在线的 bash $PS1 生成器可以帮助你轻松生成各种 $PS1 环境变量值。

就是这个网站

EzPrompt

只需要直接选择你想要的 bash 命令提示符样式,添加颜色、设计排序,然后就完成了。你可以预览输出,并将配置代码复制粘贴到 ~/.bashrc 文件中。就这么简单。顺便一提,本文中大部分的示例都是通过这个网站制作的。

我把我的 ~/.bashrc 文件弄乱了,该如何恢复?

正如我在上面提到的,强烈建议在更改 ~/.bashrc 文件前做好备份(在更改其它重要的配置文件之前也一定要记得备份)。这样一旦出现任何问题,你都可以很方便地恢复到更改之前的配置状态。当然,如果你忘记了备份,还可以按照下面这篇文章中介绍的方法恢复为默认配置。

这篇文章是基于 ubuntu 的,但也适用于其它的 Linux 发行版。不过事先声明,这篇文章的方法会将 ~/.bashrc 文件恢复到系统最初时的状态,你对这个文件做过的任何修改都将丢失。

感谢阅读!

 

在 Linux 上自定义 bash 命令提示符,首发于文章 - 伯乐在线


立即购买:淘宝网]]>
IT技术精华 2018-11-27 21:11:07
14554 FEX 技术周刊 - 2018/11/26 业界会议

第二届 VUE Confhttps://vue.w3ctech.com/
围观下 VUE 的最新实践成果。

深阅读

The State of JavaScript 2018
https://2018.stateofjs.com/
That’s where the State of JavaScript survey comes in: this year, we surveyed over 20,000 JavaScript developers to figure out what they’re using, what they’re happy with, and what they want to learn. And the result is a unique collection of stats and insights that will hopefully help you make your own way through the JavaScript ecosystem. 另附:Most Popular Node.js Frameworks in 201810 things to learn for becoming a solid full-stack JavaScript developer.

Why React Hooks, and how did we even get here?
https://medium.freecodecamp.org/why-react-hooks-and-how-did-we-even-get-here-aa5ed5dc96af
Hooks have learned from the trade-offs of mixins, higher order components, and render props to bring us new ways to create contained, composable behaviors that can be consumed in a flat and declarative manner.

Experimenting with brain-computer interfaces in JavaScript
https://medium.com/@devdevcharlie/experimenting-with-brain-computer-interfaces-in-javascript-8d6cb891fda8
For the past couple of years, I’ve had a growing interest in neurotechnology. This blog post is about sharing the things I’ve learnt along the way and hopefully help people who want to get started!

Using a headless browser to capture page screenshots
https://bitsofco.de/using-a-headless-browser-to-capture-page-screenshots/
Headless browsers are useful for automating tests of websites as it allows us to navigate to a page and perform actions without having to manually open up a browser and click around. Another great use of headless browsers is to take screenshots of web pages dynamically.

WebSockets - A Conceptual Deep-Dive
https://www.ably.io/concepts/websocketsThe WebSocket protocol elevated the possibilities of communication over the internet and gave way to a truly realtime web. This article is all about building a deeper understanding of what WebSockets are, how they came to be and what’s actually going on under the hood of applications using WebSockets. This article contains details as per the time of it’s writing.

年终回顾,为你汇总一份「前端技术清单」
https://juejin.im/post/5bdfb387e51d452c8e0aa902
结合工作体会抽象出了一些前端基础技术能力,并将这段时间学习或产出的一些不错的内容根据这些能力进行整理,形成了一份前端技术清单,包含很多今年不错的文章。

SVG vs Image, SVG vs Iconfont
https://aotu.io/notes/2018/11/23/SVG_vs_Image_vs_iconfont/index.html
SVG vs Image:除开复杂图像,选择 Inline SVG 或者 <img/> 标签的方式引入 SVG,会比使用 独立图像 或 组合图像 (CSS sprite) 的方式更好。SVG vs Iconfont:选择 Inline SVG 或许是一个不错地选择去替代 Iconfont 的使用方式。

Hades:移动端静态分析框架
https://tech.meituan.com/hades.html
大众点评静态分析框架 Hades,取名源于古希腊神话中的冥王。冥王 Hades 公正无私,能够审视灵魂的是非善恶。Hades 框架支持语义分析能力,我们希望这种能力不仅仅能够去实现一个传统的 Lint 工具,而且能成为创造更多能力的基础,可以帮助我们更轻松地审视代码,理解把控大型项目。

[译]Google Photos Web UI 完善之旅
https://zhuanlan.zhihu.com/p/50280008
几年前我有幸以工程师的身份加入 Google Photos 团队,并参与了 2015 年发布的第一个版本。我所负责的是 Web UI 部分,更精确点来说,我负责了照片的网格布局。我们立下雄心壮志,要做出完美的布局方案:支持全屏自适应、保证原图比例、交互便捷(比如用户可以跳转到指定的位置)、既展现海量图片又保证页面的高性能和高速加载。当时,市面上还没有任何相册产品能实现以上所有效果。据我所知,到目前为止也尚未出现能和 Google Photos 相媲美的产品。特别是在页面布局和图片比例上,大部分产品依然将图片裁剪成正方形以保证布局优美。下面我将会分享我们是如何完成这些挑战,以及 Web 版的 Google Photos 中的一些技术细节。

[译]2019年前端面试都聊啥?
https://mp.weixin.qq.com/s/e-IC588SZPJK2QRBm3KuHA
面试是催生变革和汇聚人才的好方式。作为面试官的你,如果仅仅把面试当成「面试」,那么你只能自我膨胀,最终一无所获。要使一场面试成功,必须对其进行讨论。它必须是一个交换思想的地方。它应该引发人们思考并客观地分析给定的问题。它要能帮助我们理解人们做决策的过程。它要能帮助我们了解一个人对技术和解决问题的热情。它意味着要了解未来可能的同事。所有那些谜题,tricks 或 typeof null 都不能真正称为面试。以下是我们在面试讨论中提出的一些问题。我们希望它可以帮助面试官和面试者准确地看清期望,需求和现实。

Why Angular Made Me Quit Web Dev
https://hackernoon.com/why-angular-made-me-quit-web-dev-f63b83a157af
Angular. Its mere name is a hostile form on the tongue. Pronounce it slowly. /’eŋgjəlɚ/. The throat itself contorts around the hideous alien shape of this word, which means ugly, sharp, and artificial. Test subjects across the globe overwhelmingly associate the same three words with the same three shapes. Here, I will illustrate the various ways in which my psyche was irreversibly traumatized by this pandemonium of demon-droppings, Google’s brainchild: the ANGULAR WEB DEVELOPMENT FRAMEWORK.

Braces to Pixels
https://alistapart.com/article/braces-to-pixels
Doesn’t CSS seem like magic? Well, in this third installment of “URL to Interactive” we’ll look at the journey that your browser goes through to take your CSS from braces to pixels. As a bonus, we’ll also quickly touch on how end-user interaction affects this process. We have a lot of ground to cover, so grab a cup of <insert your favorite drink’s name here>, and let’s get going.

Web workers vs Service workers vs Worklets
https://bitsofco.de/web-workers-vs-service-workers-vs-worklets/
Web workers, service workers, and worklets are all scripts that run on a separate thread. So what are the differences between these three types of workers?

Electrode Confippet
https://medium.com/walmartlabs/electrode-confippet-85bafe1c9a42
Electrode, an open sourced platform by WalmartLabs, is used for building powerful web and mobile applications. Electrode Confippet is one of the many modules available in Electrode Web and is used for managing configurations for Node.js applications. In this blog post, we will take a deeper look at Electrode Confippet.

Steal this Dashboard! Every Insights Chart Type in One Dashboard
https://blog.newrelic.com/product-news/steal-this-dashboard/
To illustrate the capabilities of New Relic Insights dashboards, we’ve built one that includes every possible way to visualize your APM data and pageview data—what we call the All Chart Types dashboard. These visualizations, or charts, come in a variety of formats, or widgets, and they are built using New Relic Query Language (NRQL) queries.

Some notes about HTTP/3
https://blog.erratasec.com/2018/11/some-notes-about-http3.html#.W_p2ZGQzanc
HTTP/3 is going to be standardized. As an old protocol guy, I thought I’d write up some comments.

Flutter: the good, the bad and the ugly
https://medium.com/asos-techblog/flutter-vs-react-native-for-ios-android-app-development-c41b4e038db9
Having created my first app using Flutter, I weigh up the technology’s pros and cons against the other big cross-platform development contender — React Native. 另附:Google releases Dart programming language version 2.1, teases Flutter 1.0

Dynamic configuration at Twitter
https://blog.twitter.com/engineering/en_us/topics/infrastructure/2018/dynamic-configuration-at-twitter.html
In this blog post, we will describe ConfigBus, Twitter’s dynamic configuration system. ConfigBus is made up of a database for storing configurations, a pipeline to distribute the configurations to machines in Twitter’s data centers, and APIs and tools to read and update them.

A Pragmatic Approach to Tech Debt Reduction
https://developers.soundcloud.com/blog/a-pragmatic-approach-to-tech-debt-reduction
My SoundCloud team, the Content Team, looks after a large number of legacy systems, along with a number of large systems that are difficult to understand and work with. Topics such as “Tech debt constantly increases development time” and “We have too much tech debt” come up frequently at our team retrospectives. We have just completed a project that was almost exclusively about tech debt reduction. This post is a series of lessons learned about how to engage in this process (and when to decide not to).

The Serverless Sea Change
https://www.infoq.com/articles/serverless-sea-change
Most of the writing on serverless applications either lacks enough detail to understand exactly why serverless has any real advantages over other methods of building software, or is far too in-the-weeds to understand how the particular discussion would be better than an alternate implementation that was not serverless. This article defines and explains how serverless is different from other application architectures and then walks through a “proof” of sorts to show that serverless application architectures, when done properly, are superior to non-serverless architectures. Finally, it concludes with a number of rules of thumb to help architects and developers realize the benefits of serverless.

Amazon Redshift and the art of performance optimization in the cloud
https://www.allthingsdistributed.com/2018/11/amazon-redshift-performance-optimization.html
The Amazon Redshift team has delivered remarkable gains using a few simple engineering techniques: Leveraging fleet telemetry; Verifying benchmark claims; Optimizing performance for bursts of user activity.

Slow Software
https://www.inkandswitch.com/slow-software.html
You spend lots of time waiting on your computer. You pause while apps start and web pages load. Spinner icons are everywhere. Hardware gets faster, but software still feels slow. What gives? If you use your computer to do important work, you deserve fast software. Too much of today’s software falls short. At the Ink & Switch research lab we’ve researched why that is, so that we can do better. This article shares we’ve learned.

新鲜货

Node.js - November 2018 Security Releases
https://nodejs.org/en/blog/vulnerability/november-2018-security-releases/
Node.js will release new versions of all supported release lines on, or shortly after, November 27th, 2018 UTC. These releases will incorporate a number of security fixes specific to Node.js, as well as the updates to OpenSSL that were released today, November 20th, 2018. OpenSSL 1.0.2q and 1.1.0j include fixes for previously disclosed low-severity timing vulnerabilities.

GitLab 11.5 released
https://about.gitlab.com/2018/11/22/gitlab-11-5-released/
With 11.5, the Group Security Dashboard pulls together all of the information security personnel need into one place, so folks like CISOs, CIOs, and application security leaders get a specific view designed for them. The group dashboard has a redesigned look and new visualizations, bringing together security information across multiple projects and providing a high-level view while also enabling the ability to drill down into specific reports. With 11.5, we’re starting with SAST reports, and we’ll be adding more to the group dashboard in the future.

Decentralizing Social Interactions with ActivityPub
https://hacks.mozilla.org/2018/11/decentralizing-social-interactions-with-activitypub/
ActivityPub, a W3C standard protocol that describes ways for different social network sites (loosely defined) to talk to and interact with one another. You might remember the heyday of RSS, when a user could subscribe to almost any content feed in the world from any number of independently developed feed readers. ActivityPub aims to do for social network interactions what RSS did for content.

HTM - Hyperscript Tagged Markup
https://github.com/developit/htm
JSX alternative using standard tagged templates, with compiler support. Develop with React/Preact directly in the browser, then compile htm away for production. It’s built using Tagged Templates and the browser’s HTML parser.

nivo
https://github.com/plouc/nivo
nivo provides supercharged React components to easily build dataviz apps, it’s built on top of d3. Several libraries already exist for React d3 integration, but just a few provide server side rendering ability and fully declarative charts.

Mega Project List
https://github.com/karan/Projects
A list of practical projects that anyone can solve in any programming language (See solutions). These projects are divided in multiple categories, and each category has its own folder.

The Google Cemetery
https://gcemetery.co/
List of dead Google products and why they died.

Elementary OS
http://www.daemonology.net/hn-daily/2018-11-17.html
The fast, open, and privacy-respecting replacement for Windows and macOS.

Amp - A complete text editor for your terminal
https://amp.rs/
Amp is inspired by Vim’s modal approach to text editing, which is reflected in several of its default key bindings. That similarity aside, there are several key differences. Above all else, Amp aims to keep things as simple as possible. There are already plenty of highly-configurable editors available. At its core, Amp aims to minimize configuration and provide a great out-of-the-box experience. The following sections describe some of the ideas central to the design of Amp that differentiate it from other options.

nnn - The fastest terminal file manager ever written
https://github.com/jarun/nnn
nnn is probably the fastest and most resource-sensitive file manager you have ever used. It integrates seamlessly with your DE and favourite GUI utilities, has a unique navigate-as-you-type mode with auto-select, disk usage analyzer mode, bookmarks, contexts, application launcher, familiar navigation shortcuts, subshell spawning and much more.

设计

Butterick’s Practical Typography
https://practicaltypography.com/
Typography is the visual component of the written word. Thus, being a publisher of the written word necessarily means being a typographer. This book will make you a better typographer.

Doodle Master
https://github.com/karanchahal/DoodleMaster
The Doodle Master seeks to turn your UI mockups into real code. Currently this repository just serves to demonstrate a Proof Of Concept of Artificially Intelligent Design Tools. The demo supports the detection of 4 classes of UI components: TextViews, Headers, ImageViews, Buttons.

Art vs. Design – A Timeless Debate
https://www.toptal.com/designers/creative-direction/art-vs-design
Spend any amount of time working among professional designers and you learn that equating art with design is a surefire way to stir the pot and hear bold statements like: “Design is not art. Design has to function.”; “Art is meant to provoke thought and emotions, but it doesn’t solve problems.”; “Artists primarily work off instinct, whereas designers employ a methodical, data-driven process.” Unfortunately, the designer vs. artist discussion often deteriorates into ranting and raving. Lines are drawn, battle flags are raised, and productive dialogue becomes impossible.

Understand your future role, be a product designer
https://uxplanet.org/understand-your-future-role-be-a-product-designer-dc3ad0e70f5f
The word “product designer” is not a new word at all but we don’t know when and to whom we have to use this word. We have to get our knowledge by collaborating with other designers who are in the same field and use these types of processes to explain and come to an understanding of what standards have to be put together to create a better environment to the future product designers to get established and create a better experience to the users. 另附:10 skills that make a great designer.

Minimalism vs. Maximalism: Which Trend Fits Best for E-Commerce Websites?
https://blog.marvelapp.com/minimalism-vs-maximalism-which-trend-fits-best-for-e-commerce-websites/
Minimalism and Maximalism are two polar opposites, the Yin and Yang, two concepts that tie into every aspect or known field of work including literature, art, scientific researches, and media. More recently, these two elements have become rather essential and relevant to the business and commerce industry with many applications in marketing and advertising sectors.

产品及其它

AI Artist Gives “Perfect” TED Talk As Cyborg
https://www.artnome.com/news/2018/11/15/ai-artist-gives-perfect-ted-talk-as-cyborg
In an effort to help people better understand AI, we at Artnome are doing a series of interviews with artists who are exploring AI’s potential through art. In this post, we speak with artist Alexander Reben, whose work focuses on human/machine collaboration using emerging technologies. He sees these technologies as new tools for expression, and most recently trained an AI to give a TED Talk through a robotic mask on stage.

微软亚研院的二十年:一所一流研究院的自身修养和边界突破
https://www.geekpark.net/news/235273
从微软的弹药库、智囊团、中国互联网的「黄埔军校」,再到开放技术的平台,从闭环走向开放,二十年,微软亚洲研究院除了力主科研,也在探索自身角色的边界,以及寻找一所一流研究院的定义。

中型创业公司陷阱
https://mp.weixin.qq.com/s?__biz=MjM5ODIyMTE0MA==&mid=2650971794&idx=1&sn=6366a5abe73299e76f4cd1d6e70cb572
作为管理者需要不断的去识别团队不必要做的事情,并且要把这些不必要做的事情砍掉或者优化,把资源投入能提高业绩的事情上来,然后你可能发现,公司不需要那么多人,尤其是不需要那么多所谓的管理者。如果你的主要收入来自销售,那么就把销售的事情做到极致,而不是非要去搞线下活动。哪怕你线下活动能做出花样来,又能怎么样呢?另附:创业中的快与慢

2018,创业黄金时代结束的一年
https://mp.weixin.qq.com/s?__biz=MzI2NDk5NzA0Mw==&mid=2247525721&idx=1&sn=e274a0348e7b990ce347aee05f4fb5a9
在宏观环境去杠杆的大背景下,沙滩上的裸泳者越来越多。P2P爆雷、长租公寓爆雷、九鼎跌落,币圈也没钱了……融资变得艰难,风口转瞬即逝,投资狂潮造就的创业公司高估值,没有获得二级市场的广泛认可,估值倒挂的现象直接导致大量公司因融资问题难以为继。36氪通过问卷调查等形式采访了100多位创业者,聆听他们真实的故事。若干年后我们再回首,2018将成为中国新商业的里程碑——全民创业10年大潮,影响中国商业和社会形态至深;在高速增长的另一面,则是狂欢之后的狼狈。另附:王慧文 - 觉得公司值钱,有的时候只是种妄念美团方法论

– THE END –


立即购买:淘宝网]]>
IT技术精华 2018-11-26 16:11:13
14553 网络应用优化——时延与带宽 1. 用户感知的“速度”
用户体验能给网站带来更多的收益,因此人们也投入了更多精力去研究它。用户体验中,除了好的交互,精美的界面,用户感知的“速度”也是重要的一环。从网络角度来说,时延(latency)和带宽(bindwidth)是决定“速度”的重要环节。
不同的应用对时延和带宽需求的侧重点往往不同:
  • 网络游戏需要更低的时延。在一些对抗激烈的FPS、MOBA类的游戏中,单次数据传输的量并不大,因此带宽要求不高。但是若你顶着延迟和别人进行对抗,那么这局比赛可能已经输了一半;
  • 流媒体需要更高的带宽。高速带宽能让你观看高清电影,而延时就显得不那么重要,带来问题无非是在加载前等待一段时间罢了;
  • 视频聊天需要更低的时延。更低的时延意味着你能看到更流畅的实时画面,而不会掉帧。也许只有当你想要切换更高清晰度的时候才需要选择更高的带宽。
  • 浏览网页需要更低的时延。因为没人愿意在一个空白页面上花上几秒钟。更高的带宽常常无关紧要,除非你需要流量高分辨率的图片或者高清的视频。

2. 时延与带宽

2.1.糖果包装问题

某厂某天生产了N颗糖果,需要进行包装和验收。流水线一端的工人A负责包装,包装速度为N1颗/小时,另一端B的验收速度为N2颗/小时,两者通过协调达成某一相同的速度MIN(N1,N2)颗/小时。通过传送带传送到目的地。传送带长L米,速度为V 米/小时。从A开始计时到B验收完成,所需时间T为多少?
答:T = L / V + N / MIN(N1,N2) + 1 / MIN(N1,N2)
时间T反映了完成糖果包装并验收完成的总时间。如果糖果想象成可以需要传输的文件,那么就可以把糖果包装问题转换为一个简化的网络传输问题。
假设服务器A向用户B发送一个大小为100KB的图片(假设HTTP连接已经建立),服务器上行带宽为1Mbps,用户所在下行带宽为100Mbps。已知端对端物理距离为2000 km,光信号在光纤中的传播速度是200000 km/s,求图片从A发出到B完整接收的时间T。代入公式可得: T = 2000/200 + 100 * 8 / 1 = 810 ms(最后一项太小可以被忽略)
这个时间就是时延,具体的说是单向时延,即一个数据文件从传输到完整接收所花费的时间。

2.2.时延是什么

2.1中图片传输的时间叫做时延。时延并没有一个确切的定义。多数情况下是指单向时延,就是在数据通信过程中从A发送数据的第一个比特开始到B接受到数据的最后一个比特为结束产生的时间消耗,在某些场景下也指双向时延,即从网络请求发出到收到完整响应为结束经历的时间。时延常以毫秒为单位来衡量。数据包的大小、链路上传下行速率、通信距离、通信介质的种类、路由器的处理能力都会影响时延。常说的时延是下列这些不同时延的总和:
  • 传播时延。信号在信道中传输的时间=通信距离/传播速度。
  • 处理时延。路由器路由、差错控制以及数据包头信息处理的时间。
  • 队列时延。数据包在队列中等待路由器处理的时间。
  • 发送时延。将数据包发送到信道中的时间=数据包大小/信道带宽。
减少时延往往比增加带宽需要更多的成本。2015年9月,Hibernia网络公司为了最大程度上确保纽约和伦敦的通信延时,部署了一条名为“Hibernia Express”的海底光缆,总计耗费达3亿美元。采用新光缆之后,纽约伦敦两地的延时为58.95ms,比现存的所有大西洋光缆少了5ms。这意味着节约的每1毫秒,价值近6千万美元。

2.3.带宽是什么

带宽是指数据通信最大的吞吐量,根据传输方向的不同可以分为上行带宽和下行带宽,常用Mbps来进行衡量。对于互联网上的用户,运营商(ISP)提供的带宽就是数据通信的最大吞吐量,并且上下行带宽往往不对称。如中国电信百兆宽带最大下行速度为100Mbps,而最大上行速度只有20Mbps。
一般来说,核心网络(如海底光缆)的带宽往往可以达到几百Tbps。而终端用户实际可用的带宽,往往是网络服务所在服务器的上行带宽与用户下行带宽的最小值。
若某一网站部署在上行带宽为1Mbps服务器上,那么即使访问者拥有100Mbps的下行带宽,用户仍然只能以1Mbps的速度下载网页上的内容。

2.4.联系与区别

对终端用户而言,延时可以理解为某一网络服务的响应速度,而带宽可以理解为上传下载文件的最大速度,而实际可用的带宽,往往又是由网络服务所在服务器的上行带宽与用户下行带宽的最小值所决定。
以浏览网页为例子,若响应速度快,用户实际可用的带宽(见2.3节的定义)小,就可能导致页面上的图片以肉眼可见的速度一点点显示出来;若响应速度慢,用户实际可用的带宽大,就可能导致页面上的内容需要等待很久才能有显示,在此之前都是空白。但是当响应完成,会立即显示网页内容。
有人说带宽和时延没有关系,这句话是有问题的。因为在2.2节中介绍了发送延时,它通常由服务器的上行带宽与用户下行带宽的最小值所决定。准确的说是,目前现实场景中大部分的时延不是由带宽决定,而往往是由传播距离、网络状况等所决定。

3.性能优化

了解了带宽和时延,那么就可以更好地理解网站性能优化背后的本质——减少延时,增加带宽。常见的性能优化的方式有合并请求和建立内容分发网络(CDN):
合并请求。从优化角度来说,合并请求就是在减少总时延。一个100KB的文件和 10个10KB大小的文件大小相同。若D为传播时延,T为发送10KB文件的发送时延,那么一次发送100KB文件的时延为 D + 10T,而发送10次单个10KB文件的延时为 10D+10T。相同情况下,请求次数越少,总时延就越少。
建立内容分发网络。内容分发网络通过将网站内容服务器分布在靠近用户的位置,从而使用户就近获取所需内容,减少传播延时,进而显著提升网站的响应速度。
举例来说,高质量的视频网站必须租用高速的上行带宽,确保能够承担大规模的视频流量,因为没人愿意等待几分钟缓冲一个流媒体视频。同时它也要在各地建立大规模的内容分发网络(CDN)来降低视频内容的传播延迟,这样才不会让用户等待很久才能获得网站的响应。

4.总结

本文网络应用优化中最重要的两个目标:时延与带宽。通过定义并区分两者的关系,并引申出网络服务优化的几种基本方法。和所有的教程一样,本文不可能涵盖到网络优化的所有细节,但是若能对你有所启发,那就是再好不过了。

5.参考链接

Primer on Latency and Bandwidth
Bandwidth vs. Latency: What is the Difference?

网络应用优化——时延与带宽,首发于文章 - 伯乐在线


立即购买:淘宝网]]>
IT技术精华 2018-11-22 21:11:09
14552 Hades:移动端静态分析框架

只有通过别人的眼睛,才能真正地了解自己 ——《云图》

Hades Logo

背景

作为全球最大的互联网 + 生活服务平台,美团点评近年来在业务上取得了飞速的发展。为支持业务的快速发展,移动研发团队规模也逐渐从零星的小作坊式运营,演变为千人级研发军团协同作战。

在公司蓬勃发展的大背景下,移动项目架构也有了全新的演进方向:需要支持高效的集成策略,支持研发流程自动化等等,最终提升研发效能,加速产品迭代和交付能力。

虽然高效的研发交付体系帮助 App 项目缩短了迭代周期,但井喷式的模块发版和频繁的项目集成,使得纯人工的项目维护和质量保证变得“独木难支”。

静态分析需求

上图漫画中,列举了大型项目在持续优化和维护过程中较为常见的几类需求。这些需求主要包括以下几个方面:

  1. 在 CI 流程中加入静态准入检查,避免繁琐的人工 Review 以及减少人工 Review 可能带来的失误。
  2. 为了推进项目的优化过程,需要方法数监控、宏定义分析等代码分析报表和监控。
  3. 零 PV 报表、依赖分析和头文件引用规范、无用代码分析等项目优化方案。

不难发现,这些需求的本质是:借助代码静态分析能力,提升项目可持续发展所需要的自动化水平。针对 C/Objective-C 主流的静态分析开源项目包括:Static Analyzer、Infer、OCLint 等。但是,这些分析工具对我们而言存在一些问题:

  • 开发成本高,收益有限,研发参与积极性不够。
  • 针对局部代码分析,跨编译单元以及全局性分析较难。
  • 增量分析困难,CI 静态检查效率低下。
  • 工具性较强,大部分只作代码规范检查,应用范畴局限。
  • 接入和维护成本高,难以平台化。

针对以上背景和现有方案的不足,我们决定自研基于语义的静态分析框架。

Hades 项目简介

大众点评静态分析框架 Hades,取名源于古希腊神话中的冥王。冥王 Hades 公正无私,能够审视灵魂的是非善恶。

Hades 框架支持语义分析能力,我们希望这种能力不仅仅能够去实现一个传统的 Lint 工具,而且能成为创造更多能力的基础,可以帮助我们更轻松地审视代码,理解把控大型项目。

Hades 方案选型

文本处理方式

首先,最简单的静态分析是字符匹配和文本处理。这种方式虽然实现简单,但是存在能力上限,也不可能在语义理解上有足够的把控力。另外,以正则匹配为核心建立的工具栈难以得到持续优化。为了分析项目的依赖关系,我们需要判断代码中的符号含义以及符号间关系(如包含哪些类,类中有哪些方法等),分析过程的正则表达式如下图所示。

正则匹配模式

由此可见,繁琐的文本匹配不仅可读性差,也存在容易分析出错的问题。

基于编译器的静态分析方案

我们需求的本质是对代码进行分析,而在源代码编译过程中,语法分析器会创建出抽象语法树(Abstract Syntax Tree 缩写为 AST)。AST 是源代码的抽象语法结构的树状表现形式,树上的每个节点都表示源码的一种结构。

AST 描述

以上图为例,代码块区域是用 Objective-C 和 TypeScript 编写的一个简单条件语句源码,下面是其对应的抽象语法结构表达。这种树状的结构表达,省略了一些细节(比如:没有生成括号节点),从图中的这种映射关系中我们也可以发现:

  • 源码的语法结构是可以通过明确的数据结构表示的。
  • 大多数编程语言都可以用相似的 AST 表达的。

对于 C/Objective-C 而言,主流编译器是 Clang/LLVM(Low Level Virtual Machine)的,它是一个开源的编译器架构,并被成功应用到多个应用领域。Clang(发音为/klæŋ/,不是C浪)是 LLVM的一个编译器前端,它目前支持 C, C++, Objective-C 等编程语言。Clang 会对源程序进行词法分析和语义分析,将分析结果转换为 AST。现有方案中不少 Lint 工具便是基于 Clang 的,Clang 包含了以下特点:

  • 编译速度快:Clang 的编译速度远快于 GCC。
  • 占用内存小:Clang 生成的 AST 所占用的内存是 GCC 的五分之一左右。
  • 模块化设计:Clang 采用基于库的模块化设计,易于 IDE 集成及其他用途的重用。

因此,借助 Clang 的模块化设计和高效编译等诸多优点,Hades 也将更容易开发和升级维护。Clang 对源码强有力的分析能力也是主流静态分析工具的不二之选。

Clang AST 初识

Clang 项目非常庞大。仅仅是 Clang AST 相关代码就超过 10W+ 行代码。如何利用 Clang 实现 AST 分析工作,这里可以参考官网提供的文档 Choosing the Right Interface for Your Application ,以下是三种方式:

  • LibClang

    提供 C 语言的稳定接口,支持Python Binding。AST 并不完整,不能完全掌控 Clang AST。

  • Clang Plugins

    提供 C++ 接口,更新快,不能保留上下文信息。插件的存在形式是一个动态链接库,不能在构建环境外独立存在。

  • LibTooling

    提供 C++ 接口,更新快,可以通过标准的 main() 函数作为入口,可独立运行,能够完全掌控 AST,相比 Plugin 更容易设置。

这里我们选择可独立运行并且能完全掌控 AST 的 LibTooling 作为 Hades 的基础。

在使用 Clang 的学习过程中,基本的概念便是表示 AST 的节点类型,这里重要的几点是:

  • ASTContext。

    ASTContext 是编译实例用来保存 AST 相关信息的一种结构,也包含了编译期间的符号表。我们可以通过 TranslationUnitDecl * getTranslationUnitDecl(): 方法得到整个翻译单元的 AST 的入口节点。

  • 节点类型。

    AST 通过三组核心类构建:Decl (declarations)、Stmt (statements)、Type (types)。其它节点类型并不会从公共基类继承,因此,没有用于访问树中所有节点的通用接口。

  • 遍历方式。

    为了分析 AST,我们需要遍历语法树。Clang 提供了两种方式:RecursiveASTVisitor 和 ASTMatcher。RecursiveASTVisitor 能够让我们以深度优先的方式遍历 Clang AST 节点。我们可以通过扩展类并实现所需的 VisitXXX 方法来访问特定节点。

    ASTMatcher API 提供了一种域特定语言(DSL)来构建基于 Clang AST 的谓词,它能高效地匹配到我们感兴趣的节点。

    除了这两种方式外,LibClang 也提供了 Cursors 来遍历 AST。更多细节内容可以前往 :clang.llvm.org

常用开源工具的不足

通过上一章节的介绍,我们大致了解了 Clang 的基本特点。 但是在实践开发过程中发现:通过 Clang API 去遍历和分析 AST 的源码树形结构较为复杂。现有静态分析方案(如:OCLint),大多是直接给出封装好的 Lint 工具,扩展方面也是提供脚手架生成 Rule 文件,然后在 Rule 中编写访问特定 AST 节点的方法(例如:VisitObjCMethodDecl 方法用来访问 Objective-C 的方法定义)。

因此,现有方案大多数只提供了直接访问 AST 的方式,而且这种方式较为“局部”。每实现一个实际需求需要耗费大量精力去理解如何从 AST 分析映射到源码的语义逻辑。

但是,Code Review 时我们并不会将目标代码转换为 AST 然后再去分析代码的语义如何,更多的是直接理解代码的具体逻辑和调用关系。AST 树状结构分析的复杂性容易带来理解上的差异鸿沟。因此,这也不利于调动业务研发团队的积极性,很多基于源码分析工作也难以落地。

Hades 核心实现

为了让分析过程更清晰,我们需要在 AST 的基础之上再进行一次抽象。本章节主要内容包含:Hades 的整体架构、为什么要定义语义模型、定义什么样的语义模型、如何输出语义模型以及模型的序列化和持久化。

Hades 总体架构

按照 Hades 的架构目标进行基础方案选型以后,我们来看下 Hades 的整体技术框架,可以用下图所示的四层架构表示:

Hades 整体架构图

下面简述下这几层的不同职责。

编译器架构层。Clang 的诸多优势前文已经提到,这也是 Hades 的基础依赖。

Hades 核心层。在编译器架构层,我们借助 Clang 得到了代码的抽象语法结构表示 AST。而 Hades 核心层的职责便是将 AST 解析成人们更容易理解的,更高层级的语义模型。

Hades 接口封装层。抽象出的模型,能够像 Clang 提供丰富 AST 访问接口那样,为开发者提供丰富的模型访问接口。

静态分析应用。通过 Hades 接口封装,我们无需清楚底层模型是如何生成的,在这一层我们可以制作 Lint 或者其它监控、分析工具。

为什么 Hades 的架构设计是这样的呢?下面我们将一一道来。

为何要定义语义模型 ?

首先,正如「常用开源工具的不足」章节所述,大多现有方案是直接通过编译器前端提供的接口实现对 AST 的操作,从而达到静态分析的目的。

当然,除了现有方案的不足以外,在业务研发过程中出现的 Case ,其原因大多数并不是违反了现有的 Lint 工具中所定义的基本语法规范,这些规则分析的往往是“常识”类问题。在静态分析中,更多的是对象的错误方法调用和非法的继承/复写关系等问题,即便具备良好的编码规范也会疏忽。这里乍一看没太大区别,但是从着重点来说,Hades 的设计理念上会存在本质区别。

其他静态分析模式

如上图所示,现有方案如 OCLint 或者 Clang Static Analyser 等,其核心原理是在编译器将源码生成 AST 时,通过分析节点和节点间的关系,从而达到静态分析的目的。这种方式不利于跨编译单元分析,自然对项目级别的理解分析存在局限性。

所以,这里可以借助 AST 针对每个编译单元建立更直观的、更容易理解的结构化表达。我们将这个更高层级的语义表达称为 HadesModel。

定义什么样的语义模型 ?

建立 HadesModel 以后的静态分析中,我们的着重点变化如下图所示:
Hades分析模式

下面我们可以简单描述需要设计的 HadesModel 的基本特点:

  • HadesModel 可以结构化表达源码的语义。它能够表达一个编译单元定义了哪些接口声明、实现了哪些类/类别的方法、定义和展开了哪些宏定义、对象的方法调用和函数使用情况等等。
  • HadesModel 使我们不需要了解 Clang 编译器以及 AST 如何表达源码。
  • HadesModel 以一个完整的编译单元为单位,支持 JSON 格式表达。
  • 对于 Objective-C ,分析过程不必强依赖于 xcodebuild 编译构建过程。

通过以上几点特征描述,我们得到了 HadesModel 更清晰的表述:

HadesModel 是基于 AST 的更高层级语义表达,它能够序列化为 JSON 格式并描述完整的编译单元,这种结构化信息使得静态分析能更接近于开发者阅读理解源码的思维习惯。

在介绍完 HadesModel 的基本目标后,我们用下面一段简单的 Objective-C 代码为例来明确 HadesModel 的具体表达形式:

Hades测试代码

在示例代码中,我们简单了解下包含的语义逻辑:

  • 这是一段 Objective-C 代码,实现文件名为 HadesViewController.m
  • 在实现文件中,定义了一个名为 HadesMacro 的宏定义。
  • 实现文件中包含了 HadesViewController 类的实现部分,HadesViewControllerUIViewController 的子类。
  • HadesViewController 类中包含了两个方法实现。其中第一个方法名为 sayHello ,里面包含了局部对象 testView 的初始化以及对象的方法调用,另外还包含了宏定义的使用。

可以发现,HadesModel 能够表达开发者对语义信息的直观理解即可。

如何生成语义模型:HadesModel ?

接下来介绍 Hades 基本架构图中 HadesCore 的核心实现,重点在如何生成前文所述的 HadesModel。

这里 HadesCore 借助 Clang LibTooling 分析源码的 AST,然后将我们所需的语义信息抽象成 HadesModel。将数据抽象和转换过程用以下简要流程表示:

Hades 模型转换

下面将从一个流程图来看看 HadesCore 是如何生成 HadesModel 的实现细节:

Hades 模型生成流程

流程图中主要包括以下几点内容:

1. 构建编译数据库

首先,Hades 是基于 Clang 的模块化设计开发,所以它可以独立运行,因此,可以利用 RubyGem 的方式将模型生成过程封装并提供命令行工具。对于需要得到 HadesModel 的编译单元.m,首先需要作为源文件集成到 workspace (iOS 可以用 CocoaPods),然后利用 Xcode 提供的 xcodebuild 结合 xcpretty 编译得到项目的编译数据库 compile_commands.json。编译数据库用来指定每个编译单元的命令行参数。

2. 创建 HadesDriver

在创建驱动器之前,可以使用 Clang 提供的 CommonOptionsParser 类,它将负责解析与编译数据库和输入相关的命令行参数,然后将其作为驱动器的输入。驱动器控制整个模型生成周期,它的输出结果便是 HadesModel。

3. 构建 HadesModel

在 HadesDriver 的驱动下,首先需要创建编译器实例,执行编译前可以分析宏定义和头文件展开等预处理信息,并将这些内容初始化到 HadesModel 对象。接着,在编译器实例中将 FrontendAction 接口作为扩展编译过程的执行入口,利用 Clang LibTooling 提供的 ASTVistor 访问 AST 节点(更多 Clang 技术细节见:Clang 8 documentation),最终将所有翻译单元的“元数据”填充到 HadesModel。

以前文的 HadesViewController.m 为例,我们得到 HadesModel 并序列化为 JSON 数据以后,如下图所示:

测试代码模型生成结果

显然,示例 HadesModel 已经能够表达开发者 Code Review 时,绝大多数“直白”的语义信息了。

HadesModel 的序列化/持久化

由于 HadesModel 最终需要以 JSON 格式作为提供静态分析的原始数据类型,所以需要保证 HadesModel 具备序列化的能力。

JSON 格式使 Hades 具备了全局分析能力,也符合设计之初的分析和平台、语言无关的要求。再者,JSON 类型也方便利用具备较好类型系统的语言作为分析接口层。

实践中,以 iOS 常用的 CocoaPods 的 Pod 为单位,在私有 Pod 发版时生成模型数据然后打包存储在 Maven 中,以便于增量分析

在 CI 系统中,特别是大型项目持久化的模型存储非常重要。CI 中为了加快集成速度,不得不使用部分二进制的集成方式,但是这样将无法对静态库进行源码分析。利用 Hades 的模型缓存,我们可以解决二进制集成的局限性。缓存数据也不需要再次编译、模型生成等耗时操作,所以接入 Hades 后基本不影响集成项目的集成速度。

Hades 应用案例(1):制作 Lint 工具

在这一章,我们将介绍 Hades 架构中的接口层,以及在 Lint 工具上的应用。

HadesLint 架构描述

HadesLint 是基于 Hades 框架制作的静态分析工具。作为平台标准的 Lint 工具,目前在持续集成有了广泛应用(详情见此篇文章:MCI:大众点评千人移动研发团队怎样做持续集成?)。

HadesLint 开发语言是 TypeScript。它具备完善的类型系统,结合 VSCode 的智能补全和完善的 Debug 能力,使得 HadesLint 具备良好的开发体验。

HadesLint 的实现细节如下图所示:

HadesLint 实现

在接入 HadesLint 的项目后,我们将项目以 Pod 为单位,从 Maven 中读取缓存模型 Zip 包。如果不存在缓存,那么将利用前文所述封装好的 HadesGem 通过编译数据库实时生成每个编译单元的 HadesModel。

由于我们的项目较大,模型数据量也非常庞大,为了防止分析过程内存泄露的危险,提升分析性能,可以通过Lazy.js进行惰性求值,渐进加载有效解决了模型数据庞大的问题。

被 Lazy.js 加载的 JSON 对象,需要通过 TypeScript 声明来保证 HadesModel 具备类型。这样,我们就可以在 VSCode 中编写代码时,享受自动补全、类型推断,从而保证编写过程更加安全、高效。借助 VSCode 对 TypeScript 的良好支持,在编写分析过程中方便地 Debug。

最后 HadesLint Driver 会加载每个规则对象,在规则中分析 HadesModel 然后确定检查项是否合法。

当然,如果希望程序执行效率更高些,也可以尝试 OCaml+ATD 来构建 Lint 项目。

HadesLint 应用案例:打印项目中的类名

需求描述:我们需要找到项目中定义的所有类名。

我们只需要通过脚手架创建新的规则,然后编写以下代码:

this.hadesModels.each((hadesModel: HadesModel.HModel) => {
  hadesModel.class_list.forEach((occlass: HadesNode.Class) => {
    console.log(occlass.name);
  })
});

编写代码以后,可以在 VSCode 的 Debug 面板中开启调试:

编写 HadesLint

当然,除了以上简单的查询功能以外,我们也可以定制相对复杂的检查规则,比如继承链管控、方法复写检查、非空检查等。

在引出方法复写管控之前,开发者往往会通过随意继承的方式复写代码,或者通过不合理扩展方式来满足当前需求。但是,人工 Review 代码很难保证集成项目中,这些扩展或者子类在运行时的行为。因此,对继承链管控的需求非常有必要。我们的 App 之前就出现了扩展同名方法,意外导致方法复写,从而在程序运行时出现问题,甚至导致 Crash。

为此,我们在集成准入检查中加入了方法覆盖检查。当然,如果父类设计之初本身是希望子类复写,我们在 Lint 过程中通常会忽略这些合法的复写情况。

对于这类跨编译单元的分析需求,如果我们按照 Clang Static Analyser 是较难分析的,但是 Hades 就可以非常轻松地做到,因为 Hades 可以轻松获取整个继承链以及每个类的实现定义。

Hades 应用案例(2):构建 HadesDB

HadesModel 是结构化数据,因此,我们也可以将这些模型数据以 Document 的形式存储到文档型数据库中,例如:CouchDB。

在 CouchDB 的基础上建立模型数据库,这样便能够方便地通过 Map-Reduce 建立视图文档(Design Documents),然后,我们可以获取项目中包含的类及其方法列表、分析每个 Document 的字段按需输出结果。

例如,存储建立完整的项目 HadesModel 数据后,在 CouchDB 中建立 Design Document,然后在 Map Function 中编写以下代码:

function (doc) {
  if (doc.extracontext.macro_list !== null) {
    emit(doc._id, doc.extracontext.macro_list);
  }
}

CouchDB 支持 JS 代码编写 map-reduce,以上代码表示在当前的数据库中,对于每个 HadesModel Document 判断是否存在宏定义,如果存在,那么输出宏定义作为 Design Document 的结果。

最后,通过 CouchDB 接口返回可以获取如下结果:

App 项目中源码中使用的所有宏定义信息:
{
  "total_rows": xxx,
  "offset": 0,
  "rows": [
    {
      "id": "NVShopInfoBlackPearlMultiDealCell",
      "key": "NVShopInfoBlackPearlMultiDealCell",
      "value": [
        {
          "name": "NVActionSheet",
          "expanded": true,
          "expandstr": "UIResponder<NVActionSheetDelegate> *",
          "location": ${path_location},
          ...
        }
      ]
    },
    ...
 ]
}

有了 HadesDB 以后,我们能赋予代码语义分析更大的想象空间。比如,可以利用 HadesDB 制作 Web 项目,通过 Web 页面搜索、查询我们所需要知道的语义信息和分析数据。

总结

本文介绍了在美团点评业务快速发展背景下,针对大型移动项目的静态分析需求,结合开源项目利弊,最终设计实现的静态分析框架 Hades。

Hades 作为大众点评移动研发的基础设施之一,在实践中得到了广泛的应用,为大型 App 项目的日常维护、代码分析提供支持。基于 HadesModel 的静态分析易上手,开发接入成本低,能够理解代码语义,具备全局分析能力等诸多优点。

最后,我们也希望 Hades 的设计是赋予创造能力的能力,而不仅仅是作为传统意义上的 Lint 辅助工具,这也是我们为什么不取名为“工具”,而是称之为“框架”的原因。当然,基于 Hades 我们也是能够很方便地制作出 Lint 工具的。

Hades 是否开源?不久将会开源,敬请期待。如果对我们平台感兴趣,欢迎小伙伴们加入大众点评的大家庭。

参考资料

[1] Clang 8 documentation
[2] Infer static analyzer
[3] Clang Tidy
[4] OCLint static analyzer
[5] Apache CouchDB
[6] TypeScript
[7] ATD
[8] Lazy.js
[9] xcpretty
[10] Visual Studio Code

作者简介

吴达,大众点评 iOS 技术专家,Hades 项目开发者。目前专注于移动 CI 研发,静态分析和点评 App 业务研发。

智聪,移动信息组件负责人,大众点评 iOS 高级专家。专注于移动工具链开发,对移动持续集成、静态分析平台建设有深刻理解和丰富的实践经验。

招聘信息

大众点评移动研发中心,Base 上海,为美团提供移动端底层基础设施服务,包含网络通信、移动监控、推送触达、动态化引擎、移动研发工具等。同时团队还承载流量分发、UGC、内容生态、个人中心等业务研发工作,长年虚位以待专注于移动端研发的各路英雄豪杰。欢迎投递简历:dawei.xing@dianping.com。


立即购买:淘宝网]]>
IT技术精华 2018-11-22 21:11:48
14551 美团餐饮娱乐知识图谱——美团大脑揭秘 前言

“ I’m sorry. I can’t do that, Dave.” 这是经典科幻电影《2001: A Space Odyssey》里HAL 9000机器人说的一句话,浓缩了人类对终极人工智能的憧憬。让机器学会说这样简单一句话,需要机器具备情感认知、自我认识以及对世界的认识,来辅助机器处理接收到的各种信息,了解信息背后的意思,从而生成自己的决策。而这些认知模块的基础,都需要机器具备知识学习组织推理的能力,知识图谱就是为实现这些目标而生。

今年5月,美团NLP中心开始构建大规模的餐饮娱乐知识图谱——美团大脑,它将充分挖掘关联各个场景数据,用AI技术让机器“阅读”用户评论数据,理解用户在菜品、价格、服务、环境等方面的喜好,挖掘人、店、商品、标签之间的知识关联,从而构建出一个“知识大脑”。美团大脑已经在公司多个业务中初步落地,例如智能搜索推荐、智能金融、智能商户运营等。

此前,《美团大脑:知识图谱的建模方法及其应用》一文,介绍了知识图谱的分类及其具体应用,尤其是常识性知识图谱及百科全书式知识图谱分别是如何使用的。之后我们收到非常多的反馈,希望能进一步了解“美团大脑”的细节。为了让大家更系统地了解美团大脑,NLP中心会在接下来一段时间,陆续分享一系列技术文章,包括知识图谱相关的技术,美团大脑背后的算法能力,千亿级别图引擎建设以及不同应用场景的业务效果等等,本文是美团大脑系列的第一篇文章。

迈向认知智能

海量数据和大规模分布式计算力,催生了以深度学习为代表的第三次(1993-目前)人工智能高潮。Web 2.0产生的海量数据给机器学习和深度学习技术提供了大量标注数据,而GPU和云计算的发展为深度学习的复杂数值计算提供了必要算力条件。深度学习技术在语音、图像领域均取得了突破性的进展,这表示学习技术成果使得机器首次在感知能力上达到甚至超越了人类的水平,人工智能已经进入感知智能阶段。

然而,随着深度学习被广泛应用,其局限性也愈发明显。

  • 缺乏可解释性:神经网络端到端学习的“黑箱”特性使得很多模型不具有可解释性,导致很多需要人去参与决策,在这些应用场景中机器结果无法完全置信而需要谨慎的使用,比如医学的疾病诊断、金融的智能投顾等等。这些场景属于低容错高风险场景,必须需要显示的证据去支持模型结果,从而辅助人去做决策。
  • 常识(Common Sense)缺失:人的日常活动需要大量的常识背景知识支持,数据驱动的机器学习和深度学习,它们学习到的是样本空间的特征、表征,而大量的背景常识是隐式且模糊的,很难在样本数据中进行体现。比如下雨要打伞,但打伞不一定都是下雨天。这些特征数据背后的关联逻辑隐藏在我们的文化背景中。
  • 缺乏语义理解。模型并不理解数据中的语义知识,缺乏推理和抽象能力,对于未见数据模型泛化能力差。
  • 依赖大量样本数据:机器学习和深度学习需要大量标注样本数据去训练模型,而数据标注的成本很高,很多场景缺乏标注数据来进行冷启动。

Alt text|center|550x0

图1 数据知识驱动AI能力对比

从人工智能整体发展来说,综上的局限性也是机器从感知智能向认知智能的迁跃的过程中必须解决的问题。认知智能需要机器具备推理和抽象能力,需要模型能够利用先验知识,总结出人可理解、模型可复用的知识。机器计算能力整体上需要从数据计算转向知识计算,知识图谱就显得必不可少。知识图谱可以组织现实世界中的知识,描述客观概念、实体、关系。这种基于符号语义的计算模型,一方面可以促成人和机器的有效沟通,另一方面可以为深度学习模型提供先验知识,将机器学习结果转化为可复用的符号知识累积起来。

知识究竟是什么呢?知识就是有结构的信息。人从数据中提取有效信息,从信息中提炼有用知识,信息组织成了结构就有了知识。知识工程,作为代表人工智能发展的主要研究领域之一,就是机器仿照人处理信息积累知识运用知识的过程。而知识图谱就是知识工程这一领域数十年来的代表性研究方向。在数据还是稀有资源的早期,知识图谱的研究重点偏向语义模型和逻辑推理,知识建模多是自顶向下的设计模式,语义模型非常复杂。其中典型工作,是在1956年人工智能学科奠基之会——达特茅斯会议上公布的“逻辑理论家”(Logic Theorist)定理证明程序,该程序可以证明《数学原理》中的部分定理。伴随着Web带来前所未有的数据之后,知识图谱技术的重心从严谨语义模型转向海量事实实例构建,图谱中知识被组织成<主,谓,宾>三元组的形式,来表征客观世界中的实体和实体之间的关系。比如像名人的维基百科词条页面中,Infobox卡片都会描述该名人的国籍信息,其结构就是<人,国籍,国家>这样的三元组。

Alt text|center|600x0

图2 互联网公司知识图谱布局

目前,知识图谱已被广泛应用在问答、搜索、推荐等系统,已涉及金融、医疗、电商等商业领域,图谱技术成为“兵家必争”之地。微软于2010年开始构建Satori知识图谱来增强Bing搜索;Google在2012年提出 Knowledge Graph概念,用图谱来增强自己的搜索引擎;2013年Facebook发布Open Graph应用于社交网络智能搜索;2015年阿里巴巴开始构建自己的电商领域知识图谱;2016年Amazon也开始构建知识图谱。

Alt text|center

图3 美团大脑

2018年5月,美团点评NLP中心开始构建大规模的餐饮娱乐知识图谱——美团大脑。美团点评作为中国最大的在线本地生活服务平台,覆盖了餐饮娱乐领域的众多生活场景,连接了数亿用户和数千万商户,积累了宝贵的业务数据,蕴含着丰富的日常生活相关知识。在建的美团大脑知识图谱目前有数十类概念,数十亿实体和数百亿三元组,美团大脑的知识关联数量预计在未来一年内将上涨到数千亿的规模。

美团大脑将充分挖掘关联各个场景数据,用AI技术让机器“阅读”用户评论和行为数据,理解用户在菜品、价格、服务、环境等方面的喜好,构建人、店、商品、场景之间的知识关联,从而形成一个“知识大脑”。相比于深度学习的“黑盒子”,知识图谱具有很强的可解释性,在美团跨场景的多个业务中应用性非常强,目前已经在搜索、金融等场景中初步验证了知识图谱的有效性。近年来,深度学习和知识图谱技术都有很大的发展,并且存在一种互相融合的趋势,在美团大脑知识构建过程中,我们也会使用深度学习技术,把数据背后的知识挖掘出来,从而赋能业务,实现智能化的本地生活服务,帮助每个人“Eat Better, Live Better”。

知识图谱技术链

Alt text

图4 知识图谱技术链

知识图谱的源数据来自多个维度。通常来说,结构化数据处理简单、准确率高,其自有的数据结构设计,对数据模型的构建也有一定指导意义,是初期构建图谱的首要选择。世界知名的高质量的大规模开放知识库如Wikidata、DBPedia、Yago是构建通用领域多语言知识图谱的首选,国内有OpenKG提供了诸多中文知识库的Dump文件或API。工业界往往基于自有的海量结构化数据,进行图谱的设计与构建,并同时利用实体识别、关系抽取等方式处理非结构化数据,增加更多丰富的信息。

知识图谱通常以实体为节点形成一个大的网络,图谱的Schema相当于数据模型,描述了领域下包含的类型(Type),与类型下描述实体的属性(Property),Property中实体与实体之间的关系为边(Relation),实体自带信息为属性(Attribute)。除此之外Schema也会描述它们的约束关系。

美团大脑围绕用户打造吃喝玩乐全方面的知识图谱,从实际业务需求出发,在现有数据表之上抽象出数据模型,以商户、商品、用户等为主要实体,其基本信息作为属性,商户与商品、与用户的关联为边,将多领域的信息关联起来,同时利用评论数据、互联网数据等,结合知识获取方法,填充图谱信息,从而提供更加多元化的知识。

知识获取

知识获取是指从不同来源、不同结构数据中,抽取相关实体、属性、关系、事件等知识。从数据结构划分可以分为结构化数据、半结构化数据和纯文本数据。结构化数据指的关系型数据库表示和存储的的二维形式数据,这类数据可以直接通过Schema融合、实体对齐等技术将数据提取到知识图谱中。半结构化数据主要指有相关标记用来分隔语义元素,但又不存在数据库形式的强定义数据,如网页中的表格数据、维基百科中的Infobox等等。这类数据通过爬虫、网页解析等技术可以将其转换为结构化数据。现实中结构化、半结构化数据都比较有限,大量的知识往往存在于文本中,这也和人获取知识的方式一致。对应纯文本数据获取知识,主要包括实体识别、实体分类、关系抽取、实体链接等技术。

实体作为知识图谱的核心单位,从文本中抽取实体是知识获取的一个关键技术。文本中识别实体,一般可以作为一个序列标注问题来进行解决。传统的实体识别方法以统计模型如HMM、CRF等为主导,随着深度学习的兴起,BiLSTM+CRF[1]模型备受青睐,该模型避免了传统CRF的特征模版构建工作,同时双向LSTM能更好地利用前后的语义信息,能够明显提高识别效果。在美团点评-美食图谱子领域的建设中,每个店家下的推荐菜(简称店菜)是图谱中的重要实体之一,评论中用户对店菜的评价,能很好地反映用户偏好与店菜的实际特征,利用知识获取方法,从评论中提取出店菜实体、用户对店菜的评价内容与评价情感,对补充实体信息、分析用户偏好、指导店家进行改善有着非常重要的意义。

Alt text|center|480x400

图5 BiLSTM+CRF模型

实体分类则是对抽取出的实体进行归类。当从文本中发现一个新的实体,给实体相应的Type是实体概念化的基本目标。比如用该实体的上下文特征与其他Type下的实体特征进行对比,将新实体归入最相似的Type中。此外,在Schema不完善的情况下,对大量实体进行聚类,进而抽象出每个簇对应的Type,是自底向上构建图谱的一个常用方法,在补充Type层的同时,也顺便完成了实体归类。

关系抽取,是从文本中自动抽取实体与实体之间的特定的语义关系,以补充图谱中缺失的关系,例如,从“干酪鱼原来是奶酪做的”中抽取出<干酪鱼,食材,奶酪>。关系抽取可以通过定义规则模版来获取,如匹配某种表达句式、利用文法语义特征等,但规则类方法消耗大量人力,杂质较多。基于Bootstrap Learning的方法利用少量种子实例或模版抽取新的关系,再利用新的结果生成更多模版,如此迭代,KnowItAll[2]、TextRunner[3]基于这类思想;远程监督(Distant Supervision)方法[4]把现有的三元组信息作为种子,在文本中匹配同时含有主语和宾语的信息,作为关系的标注数据。这两种方法解决了人力耗费问题,但准确率还有待提高。近期的深度学习方法则基于联合模型思想,利用神经网络的端对端模型,同时实现实体识别和关系抽取[5][6],从而避免前期实体识别的结果对关系抽取造成的误差累积影响。

知识校验

知识校验贯穿整个知识图谱的构建过程。在初期的Schema设计过程中,需要严格定义Type下的Property,Property关联的是属性信息还是实体,以及实体所属的Type等等。Schema若不够规范,会导致错误传达到数据层且不易纠错。在数据层,通过源数据获取或者通过算法抽取的知识或多或少都包含着杂质,可以在Schema层面上,添加人工校验方法与验证约束规则,保证导入数据的规范性,比如对于<店A,包含,店菜B>关系,严格要求主语A的Type是POI,宾语B的Type是Dish。而对于实体间关系的准确性,如上下位关系是否正确、实例的类型是否正确,实例之间的关系是否准确等,可以利用实体的信息与图谱中的结构化信息计算一个关系的置信度,或看作关系对错与否的二分类问题,比如<店A, 适合, 情侣约会>,对于“情侣约会”标签,利用店A的信息去计算一个权重会使得数据更有说服力。此外,如果涉及到其他来源的数据,在数据融合的同时进行交叉验证,保留验证通过的知识。当图谱数据初步成型,在知识应用过程中,通过模型结果倒推出的错误,也有助于净化图谱中的杂质,比如知识推理时出现的矛盾,必然存在知识有误的情况。

知识融合

知识融合主要解决多源异构数据整合问题,即从不同来源、不同结构但表达统一实体或概念的数据融合为一个实体或概念。融入来自多源数据的知识,必然会涉及知识融合工作,实体融合主要涉及Schema融合、实体对齐、实体链接等技术。

Schema是知识图谱的模型,其融合等价于Type层的合并和Property的合并。在特定领域的图谱中,Type与Property数量有限,可以通过人工进行合并。对于实例的对齐,可以看作一个寻找Top匹配的实例的排序问题,或者是否匹配的二分类问题,其特征可以基于实体属性信息、Schema结构化信息、语义信息等来获取。

实体对齐是多源数据融合中的重要过程。当数据来自于不同的知识库体系,需要分辨其描述的是同一个实体,将相关信息融合,最终生成该知识库中唯一的实体。这通常是一个求最相似问题或判断两个实体是否是同一个的二分类问题,实体名称、实体携带属性以及其结构化信息,都可以作为有用特征。同时,通过Type或规则限制,缩小匹配的实体范围。

一旦图谱构建完成,如何从文本中准确匹配上图谱中相应的实体,进而延伸出相关的背景知识,则是一个实体链接问题。实体链接[7] 主要依赖于实体Entity与所有Mention(文本文档中实体的目标文本)的一个多对多的映射关系表, 如 “小龙虾”这个Mention在图谱中实际对应的实体Entity可能是“麻辣小龙虾”的菜,也可能是“十三香小龙虾”的菜。对于从文本中识别出的Mention,利用上下文等信息,对其候选Entity进行排序,找出最可能的Entity。实体链接可以正确地定位用户所提实体,理解用户真实的表达意图,从而进一步挖掘用户行为,了解用户偏好。

Alt text|center|450x0

图6 实体链接(Entity Linking)

美团大脑也参考并融入了多源的数据信息,知识融合是构建图谱的一个重要步骤。以美食领域子图谱为例,该图谱是由结构化数据和文本挖掘出来的知识融合而成,首要任务是将图谱中已构建的菜品通过菜名、口味、食材等方面的相似度将菜品与文本挖掘出来的菜品知识进行关联,其次还要对无法关联的菜品知识聚类抽象成一个菜品实体。知识的融合很大程度上增加了菜品的数量,丰富了菜品信息,同时为实体链接的映射关系表提供了候选对,有助于我们在搜索过程中,支持更多维度(如口味、食材)的查询。

知识表示

知识表示是对知识数据的一种描述和约定,目的是让计算机可以像人一样去理解知识,从而可以让计算机进一步的推理、计算。大多数知识图谱是以符号化的方法表示,其中RDF是最常用的符号语义表示模型,其一条边对于一个三元组<主语Subject,谓语Predicate,宾语Object>,表达一个客观事实,该方法直观易懂,具备可解释性,支持推理。

而随着深度学习的发展,基于向量表示的Embedding算法逐渐兴起,其为每个实体与关系训练一个可表征的向量,该方法易于进行算法学习,可表征隐形知识并进一步发掘隐形知识。常用的Embedding模型有Word2Vec与Trans系列[8][9],将会在之后的系列文章里进一步讲解。美团大脑参考Freebase的建模思想,以< Subject,Predicate,Object>的三元组形式将海量知识存储在分布式数据仓库中,并以CVT(Compound Value Type)设计承载多元数据,即抽象一个CVT的实例来携带多元信息,图为一个知识表示的例子。与此同时,美团大脑基于上亿节点计算Graph Embedding的表征,并将结果应用到搜索领域中。

Alt text|center|400x0

图7 美团大脑知识表示

知识推理

基于知识图谱的推理工作,旨在依据现有的知识信息推导出新知识,包括实体关系、属性等,或者识别出错误关系。可以分为基于符号的推理与基于统计的推理,前者一般根据经典逻辑创建新的实体关系的规则,或者判断现有关系的矛盾之处,后者则是通过统计规律从图谱中学到新的实体关系。

利用实体之间的关系可以推导出一些场景,辅助进行决策判断。美团大脑金融子图谱利用用户行为、用户关系、地理位置去挖掘金融领域诈骗团伙。团伙通常会存在较多关联及相似特性,图谱中的关系可以帮助人工识别出多层、多维度关联的欺诈团伙,再利用规则等方式,识别出批量具有相似行为的客户,辅助人工优化调查,同时可以优化策略。

Alt text|center|550x0

图8 知识推理在金融场景应用

知识赋能

知识图谱含有丰富的语义信息,对文本有基于语义的更为深入的理解,在推荐、搜索、问答等领域能提供更加直接与精确的查询结果,使得服务更加智能化。

个性化推荐通过实体与实体之间的关系,利用用户感兴趣的实体,进一步扩展用户偏好的相似的实体,提供可解释性的推荐内容。一方面,图谱提供了实体在多个维度的特征信息,另一方面,表示学习向量带有一定的语义信息,使得寻找推荐实体更接近目标实体或更偏向用户喜好。

语义搜索,是指搜索引擎对Query的处理不再拘泥于字面本身,而是抽象出其中的实体、查询意图,通过知识图谱直接提供用户需要的答案,而不只是提供网页排序结果,更精准的满足用户的需求。当前Google、百度、神马搜索都已经将基于知识图谱的语义搜索融入到搜索引擎中,对于一些知识性内容的查找,能智能地直接显示结果信息。

美团大脑的业务应用

依托深度学习模型,美团大脑充分挖掘、关联美团点评各个业务场景公开数据(如用户评价、菜品、标签等),正在构建餐饮娱乐“知识大脑”,并且已经开始在美团不同业务中进行落地,利用人工智能技术全面提升用户的生活体验。

智能搜索:帮助用户做决策

知识图谱可以从多维度精准地刻画商家,已经在美食搜索和旅游搜索中应用,为用户搜索出更适合Ta的店。基于知识图谱的搜索结果,不仅具有精准性,还具有多样性,例如:当用户在美食类目下搜索关键词“鱼”,通过图谱可以认知到用户的搜索词是“鱼”这种“食材”。因此搜索的结果不仅有“糖醋鱼”、“清蒸鱼”这样的精准结果,还有“赛螃蟹”这样以鱼肉作为主食材的菜品,大大增加了搜索结果的多样性,提升用户的搜索体验。并且对于每一个推荐的商家,能够基于知识图谱找到用户最关心的因素,从而生成“千人千面”的推荐理由,例如在浏览到大董烤鸭店的时候,偏好“无肉不欢”的用户A看到的推荐理由是“大董的烤鸭名不虚传”,而偏好“环境优雅”的用户B,看到的推荐理由就是“环境小资,有舞台表演”,不仅让搜索结果更具有解释性,同时也能吸引不同偏好的用户进入商家。

Alt text|center|450x320

图9 知识图谱在点评搜索中应用

对于场景化搜索,知识图谱也具有很强的优势,以七夕节为例,通过知识图谱中的七夕特色化标签,如约会圣地、环境私密、菜品新颖、音乐餐厅、别墅餐厅等等,结合商家评论中的细粒度情感分析,为美团搜索提供了更多适合情侣过七夕节的商户数据,用于七夕场景化搜索的结果召回与展示,极大的提升了用户体验和用户点击转化。

在NLP中心以及大众点评搜索智能中心两个团队的紧密合作下,依赖知识图谱技术和深度学习技术对搜索架构进行了整体的升级。经过5个月时间,点评搜索核心指标在高位基础上,仍然有非常明显的提升。

ToB商户赋能:商业大脑指导店老板决策

美团大脑正在应用于SaaS收银系统专业版,通过机器智能阅读每个商家的每一条评论,可以充分理解每个用户对于商家的感受,针对每个商家将大量的用户评价进行归纳总结,从而可以发现商家在市场上的竞争优势/劣势、用户对于商家的总体印象趋势、商家的菜品的受欢迎程度变化。进一步,通过细粒度用户评论全方位分析,可以细致刻画商家服务现状,以及对商家提供前瞻性经营方向。这些智能经营建议将通过美团SaaS收银系统专业版定期触达到各个商家,智能化指导商家精准优化经营模式。

传统给店老板提供商业分析服务中主要聚焦于单店的现金流、客源分析。美团大脑充分挖掘了商户及顾客之间的关联关系,可以提供围绕商户到顾客,商户到所在商圈的更多维度商业分析,在商户营业前、营业中以及将来经营方向,均可以提供细粒度运营指导。

在商家服务能力分析上,通过图谱中关于商家评论所挖掘的主观、客观标签,例如“服务热情”、“上菜快”、“停车免费”等等,同时结合用户在这些标签所在维度上的Aspect细粒度情感分析,告诉商家在哪些方面做的不错,是目前的竞争优势;在哪些方面做的还不够,需要尽快改进。因而可以更准确地指导商家进行经营活动。更加智能的是,美团大脑还可以推理出顾客对商家的认可程度,是高于还是低于其所在商圈的平均情感值,让店老板一目了然地了解自己的实际竞争力。

在消费用户群体分析上,美团大脑不仅能够告诉店老板来消费的顾客的年龄层、性别分布,还可以推理出顾客的消费水平,对于就餐环境的偏好,适合他们的推荐菜,让店老板有针对性的调整价格、更新菜品、优化就餐环境。

金融风险管理和反欺诈:从用户行为建立征信体系

知识图谱的推理能力和可解释性,在金融场景中具有天然的优势,NLP中心和美团金融共建的金融好用户扩散以及用户反欺诈,就是利用知识图谱中的社区发现、标签传播等方法来对用户进行风险管理,能够更准确的识别逾期客户以及用户的不良行为,从而大大提升信用风险管理能力。

在反欺诈场景中,知识图谱已经帮助金融团队在案件调查中发现并确认多个欺诈案件。由于团伙通常会存在较多关联及相似特性,关系图可以帮助识别出多层、多维度关联的欺诈团伙,能通过用户和用户、用户和设备、设备和设备之间四度、五度甚至更深度的关联关系,发现共用设备、共用Wi-Fi来识别欺诈团伙,还可在已有的反欺诈规则上进行推理预测可疑设备、可疑用户来进行预警,从而成为案件调查的有力助手。

未来的挑战

知识图谱建设过程是美团第一次摸索基于图的构建/挖掘/存储/应用过程,也遇到了很多挑战,主要的挑战和应对思路如下:

(1)数据生成与导入

  • 难点:Schema构建和更新;数据源多,数据不一致问题;数据质检。
  • 应对思路:通过针对不同的数据进行特定清洗,元数据约束校验、业务逻辑正确性校验等,设置了严格的数据接入和更新规范。

(2)知识挖掘

  • 难点:知识的融合、表征、推理和验证。
  • 应对思路:通过借鉴文本中的词向量表征,为知识建立统一的语义空间表征,使得语义可计算,基于深度学习和知识表示的算法进行推理。

(3)百亿图存储及查询引擎

  • 难点:数据的存储、查询和同步,数据量极大,没有成熟开源引擎直接使用。
  • 应对思路:构建分层增量系统,实时增量、离线增量、全量图三层Merge查询,减少图更新影响范围。同时建设完整的容灾容错、灰度、子图回滚机制。基于LBS等业务特点合理切分子图View,构建分布式图查询索引层。

(4)知识图谱应用挑战

  • 难点:算法设计,系统实现难和实时应用。
  • 应对思路:知识图谱的应用算法则需要有效融合数据驱动和知识引导,才能提升算法效果和提供更好的解释性,属于研究前沿领域。百亿甚至千亿关系规模下,需要设计和实现分布式的图应用算法,这对算法和系统都有重大的挑战。

总而言之,为打造越来越强大的美团大脑,NLP中心一方面利用业界前沿的算法模型来挖掘关联以及应用知识,另一方面,也在逐步建立国内领先的商业化分布式图引擎系统,支撑千亿级别知识图谱的实时图查询、图推理和图计算。在未来的系列文章中,NLP中心将一一揭秘这背后的创新性技术,敬请期待。

参考文献

[1] Huang, Zhiheng, Wei Xu, and Kai Yu. "Bidirectional LSTM-CRF models for sequence tagging." arXiv preprint arXiv:1508.01991 (2015).
[2] Etzioni, Oren, et al. "Unsupervised named-entity extraction from the web: An experimental study." Artificial intelligence165.1 (2005): 91-134.
[3] Banko, Michele, et al. "Open information extraction from the web." IJCAI. Vol. 7. 2007.
[4] Mintz, Mike, et al. "Distant supervision for relation extraction without labeled data." Proceedings of the Joint Conference of the 47th Annual Meeting of the ACL and the 4th International Joint Conference on Natural Language Processing of the AFNLP: Volume 2-Volume 2. Association for Computational Linguistics, 2009.
[5] Zheng, Suncong, et al. "Joint entity and relation extraction based on a hybrid neural network." Neurocomputing 257 (2017): 59-66.
[6] Zheng, Suncong, et al. "Joint extraction of entities and relations based on a novel tagging scheme." arXiv preprint arXiv:1706.05075 (2017).
[7] Shen, Wei, Jianyong Wang, and Jiawei Han. "Entity linking with a knowledge base: Issues, techniques, and solutions." IEEE Transactions on Knowledge and Data Engineering 27.2 (2015): 443-460.
[8] Bordes, Antoine, et al. "Translating embeddings for modeling multi-relational data." Advances in neural information processing systems. 2013.
[9] Wang, Zhen, et al. "Knowledge Graph Embedding by Translating on Hyperplanes." AAAI. Vol. 14. 2014.

作者简介

仲远,博士,美团AI平台部NLP中心负责人,点评搜索智能中心负责人。在国际顶级学术会议发表论文30余篇,获得ICDE 2015最佳论文奖,并是ACL 2016 Tutorial “Understanding Short Texts”主讲人,出版学术专著3部,获得美国专利5项。此前,博士曾担任微软亚洲研究院主管研究员,以及美国Facebook公司Research Scientist。曾负责微软研究院知识图谱、对话机器人项目和Facebook产品级NLP Service。

富峥,博士,美团AI平台NLP中心研究员,目前主要负责美团大脑项目。在此之前,博士在微软亚洲研究院社会计算组担任研究员,并在相关领域的顶级会议和期刊上发表30余篇论文,曾获ICDM2013最佳论文大奖,出版学术专著1部。 张富峥博士曾担任ASONAM的工业界主席,IJCAI、WSDM、SIGIR等国际会议和TKDE、TOIS、TIST等国际期刊的评审委员。

王珺,博士,美团AI平台NLP中心产品和数据负责人。在此之前,王珺在阿里云负责智能顾问多产品线,推动建立了阿里云智能服务体系。

明洋,硕士,美团AI平台NLP中心知识图谱算法工程师。2016年毕业于清华大学计算机系知识工程实验室。

思睿,硕士,美团AI平台NLP中心知识图谱算法专家。此前在百度AIG知识图谱部负责知识图谱、NLP相关算法研究,参与了百度知识图谱整个构建及落地过程。

一飞,负责AI平台NLP中心知识图谱产品。目前主要负责美团大脑以及知识图谱落地项目。

梦迪,美团AI平台NLP中心知识图谱算法工程师,此前在金融科技公司文因互联任高级工程师及开放数据负责人,前清华大学知识工程实验室研究助理,中文开放知识图谱联盟OpenKG联合发起人。

招聘信息

美团点评 NLP 团队招聘各类算法人才,Base 北京上海均可。NLP 中心使命是打造世界一流的自然语言处理核心技术和服务能力,依托 NLP(自然语言处理)、Deep Learning(深度学习)、Knowledge Graph(知识图谱)等技术,处理美团点评海量文本数据,打通餐饮、旅行、休闲娱乐等各个场景数据,构建美团点评知识图谱,搭建通用 NLP Service,为美团点评各项业务提供智能的文本语义理解服务。我们的团队既注重AI技术的落地,也开展中长期的NLP及知识图谱基础研究。目前项目及业务包括美团点评知识图谱、智能客服、语音语义搜索、文章评论语义理解、美团点评智能助理等。真正助力于“帮大家吃得更好,生活更好”企业使命的实现,优化用户的生活体验,改善和提升消费者的生活品质。欢迎各位朋友推荐或自荐至 hr.ai@meituan.com。

算法岗NLP算法工程师/专家/研究员知识图谱算法工程师/专家/研究员

工程岗C++/Java研发专家/工程师AI平台研发工程师/专家

产品岗AI产品经理/专家(NLP、数据方向)


立即购买:淘宝网]]>
IT技术精华 2018-11-22 21:11:44