Quantcast
Channel: IT社区推荐资讯 - ITIndex.net
Viewing all 11857 articles
Browse latest View live

[开源软件] 首个智能运维项目开源!腾讯织云 Metis,用算法替代人为指定规则

$
0
0

10 月 20 日,腾讯织云 Metis 智能运维学件平台在 OSCAR 开源先锋日上宣布,正式对外开源。Metis 是 AIOps ( Algorithmic IT Operations ),即智能运维领域的首个开源产品。智能运维主张通过算法从海量运维数据中学习摸索规则,逐步降低对人指定规则的依赖,进而减少人为失误。

OSCAR 开源先锋日由中国信息通信研究院主办,中国信通院云大所所长何宝宏,中国信通院云大所云计算部副主任栗蔚,腾讯云副总裁赵建春,腾讯云运营部总经理肖世广共同参与 Metis 开源发布仪式。

腾讯云副总裁赵建春表示:“人工智能与运维的结合有了 AIOps 的新概念,如何在智能运维领域寻求到新的突破,从传统 API 转向运维学件,将腾讯海量数量训练出来的模型贡献开源社区和业内,我想这就是织云 Metis 智能运维学件开源的意义,和大家共建 AI 运维场景,让人工智能和运维紧密结合。”

在“腾讯织云 Metis 智能运维学件平台”这一命名中,“学件”的概念由南京大学周志华教授提出。学件 = 模型 + 规约,具有可重用、可演进、可了解的特性。在此基础上,腾讯云副总裁赵建春先生进一步提出“运维学件”的概念,亦称 AI 运维组件,强调其具备对运维场景智能化解决方案的记忆能力。

“织云”指的是腾讯智能一体化运维平台,而“ Metis ”取名自希腊神话中的智慧女神墨提斯。随着互联网业务的急剧膨胀和服务类型的多样化发展,人为指定规则的不足之处逐渐凸显,促使近两年来智能运维领域的高速发展。织云 Metis 是聚焦在智能运维的应用实践集合,旨在通过一系列基于机器学习的算法,对运维数据进行分析、决策,从而实现自动化运维的更高阶段。

由于社交类业务种类丰富、规模庞大的特点,腾讯搭建了充足的 IT 基础设施,为实现多维度、深层次地运维公司各类业务在发展交互过程中产生的海量运维数据,Metis 应运而生。

如今,Metis 在运维质量、效率、成本三个方面都落地了众多智能运维实践,逐步构建出成熟的智能化运维场景,具体表现为质量保障、效率提升、成本管理、智能检测、通用模型和规则学习 6 个方面。

质量保障: 利用机器学习技术,进行异常检测、故障定位、瓶颈分析等,可在无人工干预下,智能地保障业务稳定运行。如无阈值智能监控、DLP 生死指标监控、多维根因分析。

效率提升:基于自然语言处理、机器学习技术,进行智能问答、智能变更、智能决策,可显著提升运维效率。如 Metis 的智能咨询机器人、舆情监控、集群智能负载均衡、数据库参数调优、容量预测。

成本管理:基于大数据智能分析技术,进行资源(设备、带宽、存储)管理,可迅速分析资源使用的明细,并通过横向大数据对比识别可优化点。如硬盘生命周期预测。本次 Metis 率先开源的无阈值智能监控学件,是从无监督+有监督学习的角度来解决时序数据的智能检测问题。

智能检测:运维人员不需要再去设置监控阈值,模型能够对异常情况做智能判决,直观告知检测结果是正常还是异常。通常而言,阈值的监控包含最值、同比、环比等维度设置,此检测方案在检测初期效果较好,但是随着业务发展和规模壮大,就会需要付出较高的人力成本去维护合适的阈值范围,对于大规模发展性业务得不偿失。智能检测的方案是基于统计判决、无监督和有监督学习对时序数据进行联合检测,通过统计判决、无监督算法进行首层判决,输出疑似异常,其次进行有监督模型判决,得到最终检测结果。这个过程就摒弃了阈值方式带来的问题。

通用模型:智能检测的模型由腾讯织云多元化的海量业务样本训练而成,比较适合复用在互联网行业的时间序列检测中。有监督的检测效果取决于标注样本的准确性和种类丰富性,通过样本库管理功能积累了大量的正负样本、分为测试集和训练集,通用模型是经过海量训练集的样本数据训练而来,涵盖较全面的样本分类。可以帮助一些用户避免掉缺乏训练数据所带来的难点,用户可直接加载通用模型进行检测。

规则学习:实践过程中也会遇到较个性的业务场景,千人千面,不同的用户对异常的判断标准也不尽一致,因此支持标注反馈功能,用户可根据标注信息进行训练,生成新的检测模型,进而掌握新的业务规则。

Metis 无阈值智能监控学件在腾讯内部已承载了超过 240 万个业务指标的异常检测,它经过海量监控数据的打磨,在异常检测和运维监控领域具有广泛的应用性,可取代传统的阈值检测方式,达到智能检测时序数据的异常,还能结合业务策略对异常数据进行告警推送。

秉承腾讯开源的理念,Metis 将打造一个开放的学件平台,陆续开源时间序列指标预测、主机异常智能分析、MySQL 异常智能分析、硬盘生命周期预测等其它智能运维学件,集合广大用户在智能运维领域的建设经验和实践,丰富完善针对质量、效率、成本三个方面的 AI 学件,搭建完备的运维场景,并将在未来兼容其它监控领域的开源产品,如 Zabbix、Nagios、Open-Falcon 等。

近年来,腾讯在开源社区越发活跃,自 2010 年起,腾讯对内采取“开放、共享、合力开发”的研发模式;对外实现自主开源,并积极参与社区工作,相继加入 Hyperledger、LF Networking 和开放网络基金会,成为 LF 深度学习基金会首要创始成员及 Linux 基金会白金会员。本次 Metis 开源,于腾讯,是其开放战略在技术领域的又一实践;于行业,则将填补智能运维领域的开源空白,并汇聚众力,促进运维技术的突破与发展。


重新改造 Android 的中国手机厂商

$
0
0

从过去大半年的情况来看,中国手机厂商已经推出了不少让人印象深刻的 Android 手机设备,但在欧美地区,许多用户仍然不愿意将它们作为主力机使用。

其中很重要一点原因是系统和软件的问题。对他们而言,中国的 Android 手机系统过于花哨,而且功能臃肿,预装软件的类型和数量也和其它地区的不太相同。

为什么会有这种现象?

近期,The Verge 的编辑 Sam Byford  便发表了一篇题为《 How China rips off the iPhone and reinvents Android》的文章,以国外用户的视角,向我们描述了小米、vivo 和一加等中国手机厂商定制 Android 系统的现状,以及存在的一些问题。

很凑巧的是,这三者,也代表了目前中国三种主流的开发思路。

没有 Google,中国手机厂商只能做自己的服务

如果你想在中国制造 Android 手机,必须要面对一个现实问题:在这片土地,你没法使用和 Google 有关的大部分服务。

这意味着只要不通过特殊手段,大部分人没办法建立自己的 Google 账号,用不了 Google 地图,更不要说从 Play Store 上购买付费应用了。

在这种情形下,大部分中国手机厂商只能借助名为「AOSP」的 Android 开源项目,保留 Android 系统底层的同时开发自己软件功能,打造独立的账号体系,甚至是每家都有自己的应用商店。

而小米,便选择在一个恰当的时机进入市场,它通过 MIUI 起家,用互联网产品的节奏做好了一个 Android 定制系统。

▲ 图片来自: The Verge

Sam Byford 采访了英国的小米设计师 Robin,在他看来,智能手机的硬件和软件设计有着明显的不同,如果说硬件 ID 是关乎空间,那么软件设计就是关乎时间。

当设计一个大屏幕手机时,我们会寻求屏幕尺寸与手机体积之间的平衡,比如说让屏幕做的更薄一些。如果是软件,则要从用户体验和各种操作流程中来体现。

Robin 举了一个例子,当你启动应用前,你必须要先经历点亮屏幕并解锁手机的的过程,而 MIUI 则对过程中的动画和设计进行了修改,使其变得更简洁和精美,同样的,你在 MIUI 中也看不到原生 Android 中的应用抽屉设计。

事实上,这些定制功能对小米用户十分重要,他们喜欢在计算器中做各种换算,又或者是标注陌生来电,还有快速调用第三方应用接口的「传送门」,这可以看作是中国版的「Now on Tap」功能。

为了扩展海外市场,如今小米在开发 MIUI 系统时还要对中国用户和海外用户进行区分。比如在印度,小米就选择和当地的电商巨头 Paytm 合作提供二维码扫描,同时还和购物网站 Flipkart 合作的提供了直接从短信页面跳转到购物网站查看订单的特性。

而在拍照上,考虑到亚太地区的用户更喜欢磨皮等美颜效果,欧美地区则更追求自然,在服务好中国用户的同时,小米也要开发另一套方案。

让用户提出需求,并深入参与到软件设计过程中,实现软件系统的快速迭代,是小米手机和 MIUI 能够快速成长的一个重要原因。不可否认的是,它已经由当初的小众玩物变成了一个稳定可靠的大众系统,但伴随着版本数的不断迭代,MIUI 也需要面对臃肿和复杂的问题。

为什么要把系统做得和 iOS 一样?

中国并不是只有「小米模式」的存在,Sam Byford 还提及了 vivo 打造的 Funtouch OS。在他看来,vivo 更倾向于打造出色的硬件,但在软件系统层面却很少会进行核心功能的打造。

正因如此,即便 vivo 在今年打造出了一款“非常疯狂”的 NEX 手机,可它的系统里还是有 iOS 的影子。比如上滑的控制中心,已经不能用「纯属巧合」来形容了,这也不止是一家厂商的问题。

不过,考虑到中国数亿 iPhone 用户基数,vivo 仍然有这么做的理由。

▲ 图片来自: The Verge

一名 vivo 产品经理向 Sam Byford 表示,vivo 不会为了创新而创新,核心目标还是满足客户对最佳手机体验的需求,这自然就包含了使用微信,浏览网页,或是拍照听音乐等

vivo 目前的表现,是我们愿意倾听并理解消费者行为的结果,比如说相机,它的 UI 设计也要根据消费者的习惯来决定,最终通过测试找到最有效率的设计方法。

但这种决策并无法摆脱苹果的影子,更何况,这个所谓的「最佳手机体验」,很可能也是将 iOS 作为参照物的,毕竟苹果就是用出色的软件体验来辅助硬件差异化,这是苹果商业模式的关键。

基于这点,将产品的操作界面尽可能的模仿 iPhone,从商业层面考虑也确实有一定的意义。

一加 CEO 刘作虎就认为,很多厂商打造一个和 iOS 类似交互的系统,或许只是想让用户的换机门槛变得更低,这样就算是从 iPhone 换成一台 Android,交互逻辑还是一样的。

而小米的 Robin 也表示,苹果在这个行业拥有足够大的权威,更何况它也总是能创造出足够人性化的产品。

还有一点原因可能和微信有关。Ben Thompson 曾在去年撰写的《 Apple’s China Problem》中提及,在其它国家,让一名核心 iPhone 用户切换到 Android 品牌的手机是很困难的事,这意味着他要放弃很多苹果生态圈独有的体验。

可在中国地区,智能手机不存在太多的「换机成本」。中国的手机用户和微信绑定得很深,以至于这个绿色聊天应用更像是手机的系统核心,而不是 iOS 或 Android。

不过,最终是否要在 UI 和交互上摆脱掉 iOS 系统的影子,这依旧是一个值得思考的问题。

追求原生的可能性

在系统开发上,一加则代表了中国 Andorid 厂商的第三种方向——追求和 Google 相近的原生系统体验,即不会对功能做太多的修改以及自定义。刘作虎在接受 Sam Byford 采访中说:

我们希望提供一种无负担的体验,所以在系统层面会更追求轻便、流畅的部分,而不是盲目地加新功能,除非我们认为这项功能可以为用户增添更多价值。

事实也证明,这个理念同样能成为 Android 差异化的卖点。虽然一加手机在中国地区的销量不算很高,但在欧美地区却特别受欢迎。

对比三星 LG 等传统大牌厂商,一加手机可以在同等配置下给出更优惠的价格,而简洁流畅的 Oxygen OS 也是成功的关键因素。

▲ 图片来自: CNET

在中国,一加选择开发了更加本土化的「氢OS」,在保留接近原生 Android 体验的同时,也包含了一些定制化的功能服务。

尽管一加的风格和其它厂商大相迳庭,但在刘作虎看来,中国用户对于手机系统的使用习惯已经发生了变化,这和其它地区的趋势是一致的:「大家都会对快速、流畅的体验提出更细分的要求,而不仅仅只是差异化或是个性化。」

只不过,变化是否真的会到来还不好说,这需要等待,也需要时间。

题图来源: Android Headlines

#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。

爱范儿 |原文链接· 查看评论· 新浪微博


centos7使用lldb调试netcore应用转储dump文件 - czd890 - 博客园

$
0
0

centos7下安装lldb,dotnet netcore 进程生成转储文件,并使用lldb进行分析

随着netcore应用在linux上部署的应用越来越多,碰到cpu 100%,内存暴涨的情况也一直偶有发生,在windows平台下进程管理器右键转储,下载到本地使用windbg或者直接vs分析都比较方便。而在linux平台下因为一直接触的不深,所以对这一块也一直没有比较好的了解。所以接下来的文章将对在centos7下安装lldb,生成转储以及调试分析进行一些简单说明。
还有就是一般产线的机器也不太会有可以直接调试的机会,所以真出现问题也只能在产线机器dump进程,然后下载到本地来慢慢分析。

环境说明:
os:centos7
dotnet :2.1.1。查看官方文档2.0.0只能使用lldb 3.6;2.1以上必须是3.9.0;所以特别要注意版本问题,一个是createdump 2.0的有bug会失败。二个是dotnet版本和lldb版本要匹配
被调试分析的应用也是用2.1跑起来的。

测试目标程序

yum install dotnet-sdk-2.1
dotnet new mvc
vi /mvc.csproj
#netcoreapp2.0 to netcoreapp2.1
#PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" to Version="2.1.1"
dotnet restore
dotnet build
dotnet ./bin/Debug/netcoreapp2.1/mvc.dll

centos7 升级GCC,安装cmake

centos7 升级GCC版本到7.3.0
centos7 安装cmake

centos7下安装lldb调试工具

最开始直接使用给力网友的脚本进行安装(脚本地址查看文章结尾参考资料),后发现3.9.1不能调试分析netcore应用,必须要3.9.0,所以在给力网友的脚本上略作修改后使用。修改后脚本地址 https://github.com/czd890/shell/blob/master/llvm_clang_lldb/3.9.0/llvm_clang_install.sh。主要修改几个地方:把lldb,libunwind移动到build_llvm_toolchain中,一次性安装。check_and_download方法中检查本地是否已下载源码包的检查略作修改,只判断指定版本,编译的时候修改为make -j8(我本地机器8核)。

脚本大概思路就是下载如下所表示的组件所有源码,除llvm外的其他组件源代码解压到llvm/tools目录下,这样子源代码就全部准备好
BUILD_TARGET_COMPOMENTS="llvm clang compiler_rt libcxx libcxxabi clang_tools_extra lldb lld libunwind";
接下来就是编译的过程了。

#安装一些必要的依赖组件
yum install libedit-devel libxml2-devel ncurses-devel python-devel swig
#执行根据给力网友的脚本修改后的脚本

当然如果脚本下载速度慢,也是可以自己下载后上传的目录的。具体下载地址查看文章尾部参考资料 llvm,clang,lldb源代码下载地址(3.9.0)
准备源代码差不多就如下图。然后 sh llvm_clang_install.sh开始执行脚本;
默认安装目录在 PREFIX_DIR=/usr/local/llvm-$LLVM_VERSION;。也就是是 /usr/local/llvm-3.9.0;可以在脚本的最开始对此进行修改。

开始执行,又是一段漫长的等待时间,8核并发编译,耗费了估计得有1-2个小时。

刀片机的CPU都跑满了!!!

出去吃完饭后回来,就看到完成拉。具体的path路径可以选择加不加都可以,加的话,直接/etc/profile export PATH=$PATH:llvm-path/bin即可

lldb安装完成,我们的工作就完成一大半拉。

dotnet netcore应用如何生成内存转储文件

/usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1/createdump 9364


具体命令解释
createdump [options] pid
-f, --name - dump path and file name. The pid can be placed in the name with %d. The default is "/tmp/coredump.%d"
-n, --normal - create minidump (default).
-h, --withheap - create minidump with heap.
-t, --triage - create triage minidump.
-u, --full - create full core dump.
-d, --diag - enable diagnostic messages.

使用lldb调试分析netcore应用内存转储文件

#官方文档上是这样写的。
/usr/local/llvm-3.9.0/bin/lldb -O "settings set target.exec-search-paths /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1"  \
  -o "plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1/libsosplugin.so" \
   --core /opt/dump\_file/mvcdumpmindump /usr/share/dotnet/dotnet

 #网友调试参考博客上是这样写的。
 /usr/local/llvm-3.9.0/bin/lldb dotnet \
  -c /opt/dump\_file/mvcdumpmindump \
  -o "plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1/libsosplugin.so"

2种写法都是可行的。然后具体的调试分析指令什么的都在 coreclr调试说明指导文档有说明。

参考资料:
coreclr调试说明指导文档
https://github.com/dotnet/coreclr/blob/master/Documentation/building/debugging-instructions.md
coreclr生成dmp说明指导文档
https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md
llvm,clang,lldb源代码下载地址(3.9.0)
http://releases.llvm.org/download.html#3.9.0
lldb源码安装指导文档
http://lldb.llvm.org/build.html#BuildingLldbOnLinux
llvm源码安装指导文档
http://releases.llvm.org/3.9.0/docs/GettingStarted.html
网友centos7安装llvm,clang,lldb等给力脚本
https://github.com/owent-utils/bash-shell/blob/master/LLVM%26Clang%20Installer/3.9/installer.sh
网友调试参考博客文章
使用SOS调试工具检查应用程序状态

Profiling a .NET Core Application on Linux | All Your Base Are Belong To Us

$
0
0

In the same vein of  my previous post on analyzing core dumps of .NET Core applications on Linux, let’s take a look at what it takes to do some basic performance profiling. When starting out, here are a few things I wrote down that would be nice to do:

  • CPU profiling (sampling) to see where the CPU bottlenecks are
  • Grabbing stacks for interesting system events (file accesses, network, forks, etc.)
  • Tracing memory management activity such as GCs and object allocations
  • Identifying blocked time and the block and wake-up reasons

With this task list in mind, let’s get started!

Collecting Call Stacks of .NET Core Processes

Generally speaking, a .NET Core application runs as a regular Linux process. There’s nothing particularly fancy involved, which means we can use  perf and ftrace and even  BPF-based tools to monitor performance. There’s just one catch: resolving symbols for call stacks. Here’s what happens when we profile a CPU-intensive application, running with defaults, using perf:

# perf record -F 97 -ag
^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.364 MB perf.data (789 samples) ]
# perf report

As you can see, debugging symbols are missing for pretty much everything under the dotnet process, so we only get addresses rather than method names. Fortunately, .NET Core ships with a knob that can be turned in order to get a perf map file generated in /tmp, which perf can then find and use for symbols. To turn on the knob,  export COMPlus_PerfMapEnabled=1:

$ export COMPlus_PerfMapEnabled=1
$ dotnet run &
[1] 23503

$ ls /tmp/perf*
/tmp/perf-23503.map  /tmp/perf-23517.map  /tmp/perfinfo-23503.map  /tmp/perfinfo-23517.map

$ head -2 /tmp/perfinfo-23517.map
ImageLoad;/usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Private.CoreLib.ni.dll;{14b5688c-fe9a-4a0d-a0d1-b3af5439e23b};
ImageLoad;/home/vagrant/Runny/bin/Debug/netcoreapp1.1/Runny.dll;{ebb3ede4-dc41-44f4-93d3-152cd0b54ac0};

$ head -2 /tmp/perf-23517.map
00007FABB90D4480 2e instance bool [System.Private.CoreLib] dynamicClass::IL_STUB_UnboxingStub()
00007FABB90D44D0 2e instance System.__Canon /* MT: 0x00007FABB8F60318 */ [System.Private.CoreLib] dynamicClass::IL_STUB_UnboxingStub()

Equipped with these files, we can repeat the perf recording and then the report looks a bit better, with symbols starting to appear, such as  ConsoleApplication.Primes::CountPrimes. Note that because the .NET process wrote the perf map file, you might need to tell perf to ignore the fact that it’s not owned by root by using the -f switch ( perf report -f), or simply chown it.

Although, who reads perf reports anyway — let’s generate a flame graph!

Getting a Flame Graph

Well,  a flame graph is a flame graph, nothing special about .NET Core here once we have the right data in our perf files. Let’s go:

# git clone --depth=1 https://github.com/BrendanGregg/FlameGraph
...
# perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > flame.svg

Here’s a part of the generated flame graph, looking pretty good:

If you look closely, you’ll notice that some symbols are still missing — notably, we don’t have any symbols for libcoreclr.so. And that’s just the way it is:

$ objdump -t $(find /usr/share/dotnet -name libcoreclr.so)
/usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/libcoreclr.so:     file format elf64-x86-64

SYMBOL TABLE:
no symbols

If you build .NET Core from source, you can build with debug information, but that’s not what we get by default from the  Microsoft package repository.

Stacks For Other Events

Now that we have the necessary building blocks for getting symbols resolved, we can of course move on to other events (and use other tools, too).  For example, let’s trace context switches to see where our threads are getting blocked:

# perf record -e sched:sched_switch -ag
...
# perf report -f

(This is a fairly typical stack for where the thread gets preempted to let another thread run, even though it hasn’t called any blocking API.)

Or, let’s try some of my favorite tools from  BCC. For example, let’s trace file opens:

# opensnoop
PID    COMM               FD ERR PATH
1      systemd            17   0 /proc/955/cgroup
24675  dotnet              3   0 /etc/ld.so.cache
24675  dotnet              3   0 /lib/x86_64-linux-gnu/libdl.so.2
24675  dotnet              3   0 /lib/x86_64-linux-gnu/libpthread.so.0
24675  dotnet              3   0 /usr/lib/x86_64-linux-gnu/libstdc++.so.6
...
24689  dotnet             47   0 /home/vagrant/Runny/perfcollect
24689  dotnet             47   0 /home/vagrant/Runny/opens.txt
24689  dotnet             47   0 /home/vagrant/Runny/project.lock.json
24689  dotnet             47   0 /home/vagrant/Runny/.Program.cs.swp
24689  dotnet             47   0 /home/vagrant/Runny/Program.cs
24689  dotnet             -1  13 /home/vagrant/Runny/perf.data.old

We can conclude that everything more or less works. I dare say this is even a little easier than the JVM situation, where we need an external agent to generate debugging symbols. On the other hand, you have to run the .NET Core process with the  COMPlus_PerfMapEnabled environment variable at initialization time — you can’t generate the debugging information after the process has already started without it.

But then I tried one more thing. Let’s try to aggregate file read stacks by using the  stackcount tool from  BCC to probe  read in libpthread (which is where .NET Core’s syscalls are routed through on my box). The result is not very pretty:

$ stackcount pthread:read -p 29751
Tracing 1 functions for "pthread:read"... Hit Ctrl-C to end.
  read
  [unknown]
  [unknown]
  [unknown]
  [unknown]
  void [Runny] ConsoleApplication.Program::Main(string[])
  [unknown]
  [unknown]
  [unknown]
  [unknown]
  [unknown]
  coreclr_execute_assembly
  coreclr::execute_assembly(void*, unsigned int, int, char const**, char const*, unsigned int*)
  run(arguments_t const&)
  corehost_main
... snipped for brevity ...
    16

The [unknown] frames prior to Main are not very surprising — this is libcoreclr.so, and we already know it doesn’t ship with debuginfo. But the top-most frames are disappointing — this is a managed assembly, with managed frames, and there’s no reason why we shouldn’t be able to trace them.

To figure out where these frames are coming from, I’m going to need addresses. With the -v switch,  stackcountprints addresses in addition to symbols:

# stackcount pthread:read -v -p 29751
Tracing 1 functions for "pthread:read"... Hit Ctrl-C to end.
^C
  7f77b10b1680     read
  7f773651f267     [unknown]
  7f773651e8d5     [unknown]
  7f773651e880     [unknown]
  7f773651846a     [unknown]  7f77364bfb5d     void [Runny] ConsoleApplication.Program::Main(string[])
...

All right, so which module is 7f773651f267 in, for example? Let’s take a look at the loaded modules (I’m keeping only executable regions):

$ cat /proc/29751/maps | grep 'xp '
...
7f77364bf000-7f77364c6000 rwxp 00000000 00:00 0
7f7736502000-7f7736530000 r-xp 00003000 fd:00 787585                     /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Console.dll
7f7736534000-7f7736564000 r-xp 00003000 fd:00 787603                     /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.IO.FileSystem.dll
7f7736577000-7f7736578000 r-xp 00002000 fd:00 787665                     /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Threading.Thread.dll
7f773657a000-7f7736587000 r-xp 00002000 fd:00 787606                     /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.IO.dll
7f773658a000-7f773659a000 r-xp 00002000 fd:00 787668                     /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Threading.dll
7f773659d000-7f773659e000 r-xp 00002000 fd:00 787658                     /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Text.Encoding.dll
...

OK, so we seem to be making progress — the desired address is clearly in the range that belongs to System.Console.dll. But, being a managed assembly, we’re not going to find any debug information in it:

$ file /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Console.dll
/usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Console.dll: PE32+ executable (DLL) (console) Mono/.Net assembly, for MS Windows

$ objdump -tT /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Console.dll
objdump: /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Console.dll: File format not recognized

Hmpf. So how are we supposed to get symbolic information for these addresses?

If you look online, you’ll find that there’s a tool on the .NET Core repos called perfcollect — essentially a Bash script for collecting performance information from .NET Core processes running on Linux. Let’s take a look.

The perfcollect Tool

The  perfcollect tool is fairly self-contained, and installs its own dependencies, most notably perf and  lttng — .NET Core on Linux uses LTTng to generate various events, including garbage collections, object allocations, thread starts, assembly loads, and many others. Then, perfcollect follows your instructions and runs perf and lttng to collect CPU sampling events, package them up to a big zip file, and hand that to you.

What are you supposed to do with that zip file?  Open it on Windows, apparently, using PerfView. Now,  I love PerfView, but a face palm is the only reasonable reaction to hearing this. What’s more, perfcollect does a bunch of work that you don’t really need if you plan to analyze the results on the same machine. But there’s  one thing it does which sounds very relevant:

WriteStatus "Generating native image symbol files"

# Get the list of loaded images and use the path to libcoreclr.so to find crossgen.
# crossgen is expected to sit next to libcoreclr.so.
local buildidList=`$perfcmd buildid-list | grep libcoreclr.so | cut -d ' ' -f 2`

That definitely sounds good! Turns out that .NET Core writes out an additional map file, named /tmp/perfinfo-$PID.map, which contains a list of image load events for your application’s assemblies. perfcollect then parses that list and invokes the crossgen tool to generate an additional perf map for each assembly, which can be fed into PerfView on the Windows side. Here’s what the perfinfo file looks like:

$ head -4 /tmp/perfinfo-29751.map
ImageLoad;/usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Private.CoreLib.ni.dll;{14b5688c-fe9a-4a0d-a0d1-b3af5439e23b};
ImageLoad;/home/vagrant/Runny/bin/Debug/netcoreapp1.1/Runny.dll;{319d161b-f17e-44f6-a210-f297df920194};
ImageLoad;/usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Runtime.dll;{819d412e-d773-4dbb-8d01-20d412b6cf09};
ImageLoad;/usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/mscorlib.dll;{080dac22-6a0e-41ae-85fb-fb79cc07911b};

Now, that’s what crossgen is  supposed to do. And according to the comment above, crossgen is also  supposed to be in the same folder as libcoreclr.so. But it isn’t:

$ find /usr/share/dotnet -name crossgen

That’s right, no results. Looking online, it seems that crossgen is generated as part of a .NET Core build, and part of the CoreCLR runtime NuGet package, but it’s not part of the pre-packaged binaries you get from the Microsoft package repositories. But with a little effort  borrowed from the corefx repo, we can fetch our own crossgen:

$ export CoreClrVersion=1.1.0
$ export Rid=$(dotnet --info | sed -n -e 's/^.*RID:[[:space:]]*//p')
$ echo "{\"frameworks\":{\"netcoreapp1.1\":{\"dependencies\":{\"Microsoft.NETCore.Runtime.CoreCLR\":\"$CoreClrVersion\", \"Microsoft.NETCore.Platforms\": \"$CoreClrVersion\"}}},\"runtimes\":{\"$Rid\":{}}}" > project.json
$ dotnet restore ./project.json --packages .
... output omitted for brevity ...
$ ls ./runtime.$Rid.Microsoft.NETCore.Runtime.CoreCLR/$CoreClrVersion/tools
crossgen

All right! So we have crossgen, at which point we can try it out to generate debug information for System.Console.dll, or any other assembly we need, really. Here goes:

$ crossgen /Platform_Assemblies_Paths /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0 \
           /CreatePerfMap . /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Console.dll

Microsoft (R) CoreCLR Native Image Generator - Version 4.5.22220.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Successfully generated perfmap for native assembly '/usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Console.dll'.

What does this perfmap file look like? The same as any other perfmap, except the addresses are not absolute — they are offsets from the load address of that module:

$ head -4 System.Console.ni.\{3b33b403-e8c1-44af-a7fb-369b2603f2a3\}.map
0000000000017590 58 void [System.Console] Interop::ThrowExceptionForIoErrno(valuetype Interop/ErrorInfo,string,bool,class [System.Runtime]System.Func`2<valuetype Interop/ErrorInfo,valuetype Interop/ErrorInfo>)
00000000000175F0 4d void [System.Console] Interop::CheckIo(valuetype Interop/Error,string,bool,class [System.Runtime]System.Func`2<valuetype Interop/ErrorInfo,valuetype Interop/ErrorInfo>)
0000000000017640 82 int64 [System.Console] Interop::CheckIo(int64,string,bool,class [System.Runtime]System.Func`2<valuetype Interop/ErrorInfo,valuetype Interop/ErrorInfo>)
00000000000176D0 17 int32 [System.Console] Interop::CheckIo(int32,string,bool,class [System.Runtime]System.Func`2<valuetype Interop/ErrorInfo,valuetype Interop/ErrorInfo>)

Well, let’s see if we can at least resolve our desired address by using this approach. If you go back above, we were chasing the address 7f773651f267, loaded into System.Console.dll. First, let’s find the base address where System.Console.dll is loaded:

$ cat /proc/29751/maps | grep System.Console.dll | head -1
7f77364ff000-7f7736500000 r--p 00000000 fd:00 787585                     /usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Console.dll

The offset, then, is:

$ echo 'ibase=16;obase=10;7F773651F267-7F77364FF000' | bc
20267

So now we need to look for this offset in the System.Console map file. The closest match is here:

0000000000020150 286 instance valuetype System.ConsoleKeyInfo [System.Console] System.IO.StdInReader::ReadKey(bool&)

With that, we have one frame resolved! There are only a few more   This process begs to be automated. It would be great to automatically run crossgen, generate the map files with the relative addresses, convert them to absolute addresses, and merge them with the main /tmp/perf-PID.map file that other tools know and love. Read on!

dotnet-mapgen.py

Well, I wrote  a small script called dotnet-mapgen.py that automates the above steps and produces a single, unified map file that contains both JIT-compiled addresses and addresses that lie in crossgen’d (AOT-compiled) modules, such as System.Console.dll. The script has two modes:

$ ./dotnet-mapgen.py generate $(pgrep -n dotnet)
couldn't find crossgen, trying to fetch it automatically...
crossgen succesfully downloaded and placed in libcoreclr's dir
crossgen map generation: 15 succeeded, 2 failed

In the “generate” mode, the script first locates crossgen (downloading it if necessary, using the NuGet restore approach shown above), and then runs crossgen on all the managed assemblies loaded into the target process. The 2 failures in the above output are for assemblies that weren’t AOT-compiled. Note that this generation step can be done once, and the map files retained for subsequent runs — unless you change the set of AOT-compiled assemblies loaded into your process.

$ ./dotnet-mapgen.py merge $(pgrep -n dotnet)
perfmap merging: 14 succeeded, 3 failed

In the “merge” mode, the script calculates absolute addresses for all the symbols generated in the previous step, and concatenates this information to the main /tmp/perf-PID.map file for the target process.

There’s just one final problem. Turns out, perf refuses to use the map file for symbols that are in memory regions that belong to a module (in our case above, System.Console.dll). And there’s no way to convince perf that it should try to resolve such addresses using the map file. Fortunately, I have a bit more control over BCC tools, so I proposed a  PR for retrying symbol resolution using a map file if the symbol wasn’t resolved using the original module. With this patch, here’s  stackcount‘s output:

# stackcount ... pthread:read
Tracing 1 functions for "pthread:read"... Hit Ctrl-C to end.
^C
  read
  instance valuetype System.ConsoleKeyInfo [System.Console] System.IO.StdInReader::ReadKey(bool&)
  instance string [System.Console] System.IO.StdInReader::ReadLine(bool)
  instance string [System.Console] System.IO.StdInReader::ReadLine()
  string [System.Console] System.Console::ReadLine()
  void [Runny] ConsoleApplication.Program::Main(string[])
...
  16

Note how all symbols are now resolved to managed frames: the JIT-compiled Program::Main, and the AOT-compiled Console::ReadLine, StdInReader::ReadLine, and everything else.

Once this support lands in BCC, we can also do full-fidelity profiling with the  profile tool, stack tracing with  traceand  stackcount, blocked time analysis using  offcputime/ offwaketime, and a variety of other tools. For most purposes, the perf-based workflow shown in the beginning of the post is a poorer alternative, if you can run a recent-enough kernel with BPF support.

So Where Are We?

  • We can use a variety of Linux performance tools to monitor .NET Core processes on Linux, including perf and BCC tools
  • To resolve stacks and symbols in general, the COMPlus_PerfMapEnabled environment variable needs to be set to 1 prior to running the .NET Core process
  • Some binaries still ship out of the box with no debug information (notably libcoreclr.so)
  • Some managed assemblies aren’t included in the dynamic /tmp/perf-PID.map file because they were compiled ahead-of-time (using crossgen), and don’t contain debugging information
  • For these assemblies, crossgen can generate map files that are sort-of useful, but can’t be used directly with perf
  • The dotnet-mapgen script can automate the process of generating map files for AOT-compiled assemblies and merging them into the main map file for analysis
  • BCC tools will be updated to support this scenario and enable full-fidelity tracing

In a subsequent post, I also plan to explore the LTTng traces to see if we can trace garbage collections, object allocations, managed exceptions, and other events of interest.


[原]如何高效的主持会议

$
0
0

达利欧《原则》谈到“如果由你主持会议,应把握好对话”,深有感触,主持好会议不容易,这需要各种综合能力:时间管理、冲突管理、同理心、对企业文化的理解、集体心理学、强大的逻辑分析能力等。这里我以达利欧的建议为主线,谈谈我的个人理解。

1、明确主持人及会议服务对象

会议一定要以实现负责人的某个目标为目的!比如,我有一个方案,但我不确定它是否足够完备、合理,那么我的目的就是找持有不同意见的权威人士坐下来,以开放式辩论的方法达成目标;或者我希望把我的方案明确的表述给实现者,那么会议就应当以讲清楚方案、达成共识为主。

如果会议没有主持人,或者主持人没有明确的目标,那么这个会议一定是效率低下的。

2、表达要清晰准确,不要造成语言上的困惑

不同于编程语言是上下文无关的,我们的自然语言是有上下文相关性的。这个相关性不只是紧挨着的句子,还可能会跨度很长,还会包含大量的常识。所以,会议中的口头表达,要求与会者必须具备相应的上下文理解能力。请确保表达务必是清晰的。

在会议邀请(或者事后的会议纪要)的电子邮件中,把问题(及答案)清晰的记录下来是有必要的。

3、根据目标及优先级确定沟通方式

如果你需要开放式辩论,请务必挑选合适的参会者。因为辩论极其耗时,而且随着参与者人数的增多,耗时会成几何级数上升!所以一定要挑对人,这些参会者对你目标的完成最有帮助!挑选专业方向权威且与你观念不同的人是个好主意!在开放式辩论会议中,出现大家都不发言表达独立观点、或者个人拒不接受不同观点都是非常糟糕的。

如果A群体对目标实现的帮助非常大,B群体则可能有一些帮助,我不建议把A、B两群人放在一场开放式辩论会议中,而应该第一场先与A群体进行会议,第二场再与B群体。这会大大提高效率。

4、主持讨论时要果断、开明

所谓果断,就是判断一场讨论可能会耗时很久,但达成的结论对会议的目标达成没多少帮助,那么就应该果断停止讨论!例如产品评审会上,因为市场调研数据不足,可能出现研发挑战方案的执行意义,此时主持人必须快速判定这次讨论对完成方案落地的帮助有多大。有时参会者因为经验缺乏,他提出的问题主持人在剖析他提出的逻辑时有助于帮助他深化理解,如果时间允许这是值得的。

人的系统一(或者叫快系统,或者叫情绪系统,或者叫潜意识)总是倾向拒绝不同的意见(这很能提升内心自洽),主持人以及参与讨论的人必须牢记: 与负责任的权威不同意见交锋,对自己是最有收获的。

5、在不同层面的讨论对话中穿梭对照

会议讨论中会有两类问题:一类是具体问题,另一类则是方法论、原则。前者是一个萝卜一个坑,后者则是会对今后一类相似问题持续产生影响。所以后者明显更重要,后者应该持续的在工作中加以改进。在讨论中一定不时在这两类问题中转换,我们必须飞快的意识到当下究竟是在讨论具体问题还是方法论原则,如果是后者优先级应当更高,结论也需要更慎重。

6、谨防“跑题”

会议中出现长时间跑题一定是会议主持者的锅!就参会者来说,“跑题”是必不可免的,所以主持者有责任提醒、管理当前正在进行的讨论。有必要的话,可以通过投影仪或者白板把会议所有议题展示给所有参会者,包括已经达成共识和未达成共识的议题(已经达成共识的结论被参会者再刨出来讨论是极浪费时间的)。

7、坚持对话的逻辑性

出现冲突的双方为了维护自身的内心自洽很容易启动情绪攻击,此时很难做到对事不对人。相对来说,如果我们始终保持自己表达的意见是有内在逻辑性的,则很容易避免情绪影响共识达成的情形。一般在会议中,有参会者表达“我觉得···”并且接下来把这一假设事实当成其他结论的论据,那么这一定是缺乏逻辑性的。比如,“我觉得有些用户会觉得我们的产品···,所以我们的产品不应该···”,这种讨论一定会引发冲突!

讨论务必要建立在事实的基础上!

8、防止“责任分散效应”

有些共识在会议中达成了共识,可是会议主持人却没有把工作分解并分配到个人,他可能默认参会者既然一致达成了结论,那么就会各自知道承担怎样的责任。这是错误的,心理学中有“责任分散效应”,这在1964年美国的一起杀人案里首次发现。纽约深夜一位酒吧工作归来的女性,在公寓下被歹徒用刀刺死,案发过程持续三十分钟,有38位邻居发现却无一人报警。事后对美国引发了巨大的震动,大家都在讨论大城市的人性冷漠,而记者采访这38位邻居得到的回答是:每个人都以为别人会报警,所以见死不救并不会引发内心的罪恶感。心理学家后续做了大量类似的实验,发现当个体认为责任是群体的,最终是没有人负责的。

因此 主持人有义务分派、明确参会者个体的责任。

9、运用两分钟法则避免表述被持续打断

有些讨论激烈的会议中,可能出现有人的表达频繁被别人打断的场景。此时,主持者有义务让每位意见表达者至少拥有2分钟的时间,可以完整的表述清楚自己的想法。

10、注意气场强大的“快嘴王”

有的参会者对自己的观点坚信不疑,且他们很难被人说服,说话语速快,而且可以把这些特点外放表现出,强力推动会议进程,不给其他人认真思考和质疑的机会。此时主持人必须回到自己的目的上来,会议的目标达成有没有被阻碍?快嘴王很容易对语速慢、担心出错出丑的参会者产生影响。主持人应确保参会者能够畅通的提出疑问。

11、让每一个议题有始有终

如果议题的讨论持续很久却没有达成任何结论,这是对大家时间的极大浪费。即使议题的最终结论未达成,也应该记录下中间结果。所以,对议题的总结是必不可少的,也应当以会议纪要的方式发送给全体参会者。

12、活用各种沟通手段

沟通是耗时的,挨个一对一私下沟通是低效的。并不是除了一对一私下沟通外,只能通过在会议中沟通,就像第2点所说,会议时间几乎是与参与辩论者数量的平方成正比的。我们可以善用公司内的沟通工具,例如wiki、论坛、邮件、公告等,把握信息分享的有效性。

 

无论大小公司里,总会遇到低效的会议(大公司里会更多),参加这样的会议我总是感觉自己以及多数参会者在 浪费生命,时间就是生命嘛!但是,人又不适合一心多用,我们的大脑带宽是很低的,如果同时处理多件事,比如又在听会议发言,又在写代码,还在回邮件,一定是每件事都做不好,而且会感受很疲劳!企业文化应当扼杀这样的会议。

做一个高效的会议主持者并不容易,既要达成目的,也要少浪费大家的生命,故而特意写了这篇文章,希望与大家共勉!

作者:russell_tao 发表于 2018/10/21 17:32:03 原文链接 https://blog.csdn.net/russell_tao/article/details/83243269
阅读:1

更快“燃烧我的卡路里”,科技健身会是你的菜吗?

$
0
0

健身是人类的刚需,但很长一段时间以来,国内的健身业态发展缓慢,几乎一成不变,虽屡有新健身品牌进入市场,但总体而言换汤不换药。

与人性博弈,传统健身房套路深

传统健身房的年卡制度和靠规模取胜商业模式,意味着需要更频繁的铺店,销售出售的年卡越多,会员办的年数越久,健身房前期收获的现金流就越大。

这决定了其与会员之间存在一种长久的心理博弈,健身房赌的是你的恒心和毅力,不幸的是获胜的一方绝大时候都是健身房。

“游泳、健身了解一下”,大部分人被舌灿莲花的销售安利办卡后,会想着自己很快就可以拥有八块腹肌或翘臀、马甲线,但理想很丰满,现实很骨感,坚持一个月的有,两个月少。

有3年健身经验的Allen告诉我们,自己近三年就办过三张健身卡,因为时间原因,或者是太懒,前前后后去的次数并不多,其中两张过期白白浪费了,一张目前正打算低价转让给朋友。

《经济学人》在一篇文章中曾提到过一个很惊人的数字, 60%的健身房会籍持有者,在入会后第二个月就放弃了自己的健身大业。

意料之外,也是情理之中,国内实现情况可能比60%还要高,深圳中心区某健身教练表示,自己所在的健身房很少有人会坚持一年以上,大部分人在办卡来过一两次之后就很难再见到。

囿于传统健身本身的反人性设计,消费者去健身房需消耗大量时间和精力来达到健身效果,加上价格不菲的私教课,让人望而怯步,大多人的健身计划都虎头蛇尾,难以付诸行动。


科技让健身更简单?来头不小的EMS健身

实际上,按次售卖的精品健身工作室近年来也屡见不鲜,但依旧解决不了人性(懒惰)的问题,目前这种模式也很难成气候。

不过,这种现状目前正在被慢慢改变,中国的健身创业者们试图在传统健身房的运营模式之外,尝试更多种可能。

与精品健身工作室的不愠不火相比,近年流行起来的科技健身来头不小, 用高科技设备满足人们健身的心理需求和实现健身效果。

有网友在小红书日记中分享, 在上海新天地逛街时体验过一次ZESPEED的EMS健身后,回来她在朋友圈表示“很简单的动作,但做完浑身酸痛到连走路都难,出了好多汗,酸爽”。

据介绍,EMS(Electrical Muscle Stimulation 肌肉电刺激)健身的核心是一套高科技健身设备,依靠发出模拟人体大脑生物电来信号,将中低频率脉冲电流导入到运动神经,通过调控脉冲电流的强度、频率、间歇时间等因素刺激肌肉协同工作,来加速血液循环,提高健身效率。

EMS最早的起源是防止肌肉萎缩,在国外运动康复领域已有几十年的应用,据临床试验证明,其增肌效果十分显著。

在健身教练的指导下配合有氧和无氧动作,主要以拉伸、深蹲、高抬腿等基本动作配合正确的吐纳为主,EMS健身在对运动量以及动作的要求不高的基础上就能够达到同时训练到全身各部位肌肉群的目的,从而达到减脂塑形的目的。

实际上,类似ZESPEED的EMS健身最大的卖点是健身20分钟相当于常规3-4小时的运动效果,省时、省力,对于像Allen这样的都市年轻人来说是一种新选择。

不过,患有严重的神经疾病、癫痫、血液循环障碍、肺结核糖尿病患者,以及肝脏疾病和对电极敏感的人群不可使用EMS训练。


国内EMS健身品牌生存现状

自2016年国内EMS健身品牌ZESPEED把德国EMS设备和技术引入国内后,直接推动和引领了国内EMS健身行业的快速发展,从最初的寥寥数家,今年已出现十几家EMS品牌。

目前,国内以EMS为核心的健身品牌且获得资本投资的有ZESPEED、安体倍力、K-EMS。

ZESPEED 为一普体育旗下的EMS健身品牌,除了ZESPEED外, 一普体育还拥有高端健身品牌 ZPLUS 和健身教育机构一普学院。

ZESPEED所使用的设备品牌为德国的Miha Bodytec,以直营店为主,同时还有合伙人店和共创空间店。

一普体育于2016年在FIBO与Miha Bodytec签订协议,将EMS正式引入中国,成立ZESPEED做科技健身市场的引领者

其标准化的ZE极速运动站,单店配备两台设备,五个教练,100平米场地,即可实现全时段的营业,用户按月卡购买,线上预约,单次价格在300-400不等,店内同时配置储物柜和淋浴间。

为打破场地空间约束,多场景的呈现,ZESPEED最小的门店可以做到30平米,2台机器,从单店模式上看,规模化复制裂变能力更强。

目前,ZESPEED在上海、北京等地开店11家,未来布局会从一线城市上海与北京的直营,经由合伙人与技术授权模式的推广进入二三线城市,计划三年开店到1000家,目前其大部分门店已达到盈亏平衡点。

据透露,ZESPEED已于今年7月份获得数千万PreA轮投资,目前正在进行A轮融资。

另一品牌安体倍力于18年获得天使轮投资1000万,其使用的EMS设备品牌为德国的Amplitrain,运营品牌为Fastall,目前上海和北京各有一家直营门店。

目前,EMS健身虽然发展迅速,但相比整个巨大的健身市场,还有很大的市场空间等待挖掘。


鱼龙混杂,健身业新贵们面临的新挑战

从游泳健身了解一下,到20分钟相当于常规3、4小时的运动效果,科技在健身中起到的作用越来越重要。

但不可否认的是,EMS在为健身行业带来革新的同时,也暴露出诸多问题。

目前,国内EMS健身行业存在的主要问题是市场教育和公众认知,EMS健身虽在国外已得到了临床与市场验证,但对国人来说,还属于新鲜的舶来品,人们对此的疑虑尚未解除。

失去了运动健身的真正乐趣,有消费者表示还是更喜欢去传统的健身房撸铁,在他看来,EMS健身虽然省时省力但失去了健身的乐趣。

实际上,类似这样对新技术抱怀疑情绪的人不在少数,在网上有人就对电脉冲健身的安全性表示担忧,会不会有什么风险。

不容忽视的事实是,在国内的EMS健身行业,从兴起到快速发展,越来越多的品牌和资本都参与其中,成熟品牌较少,行业口碑不一。

一个首要的风险是设备的安全性问题,市场上EMS健身设备良莠不齐,缺乏较成熟的经过医学验证的国产设备。

可以预见的是,设备标准和质量不一,消费者的安全将存在很大隐患,从长远来看,这对于整个行业发展有很大阻碍作用。

目前,国际上较权威的EMS设备制造商有德国Miha Bodytec公司,其在运动与医疗相关器械已经有40多年历史,有超过12年的专业运动设备研发生产经验,是全球最大的EMS设备品牌。

Miha Bodytec公司与德国大学建立EMS健身运动教学与培训体系,建立全球EMS行业标准,其旗下EMS产品Miha bodytec在德国有超过1000家工作室与俱乐部使用在欧洲市场占有率超过85%, 使用国家超过45个。

对于EMS健身来讲,另一个需要突破的难题是,相比于传统健身的互动氛围浓厚,EMS健身的内容单一也是阻碍人们积极尝鲜的一个重要原因。

网上有体验过EMS健身的部分网友表示,虽然EMS健身的时间很短,效果不错,但和之前健身房的动感单车或者团体操相比的话,总感觉略显枯燥。

对此,国内很多品牌目前的解决方案是,拓展更多的健身内容和课程,以满足消费者的需求。

以行业领头羊ZESPEED为例,教研团队根据不同健身人群的特征推出6类不同的课程,包含辣妈课程、美臀课程、跑者课程、腰腹课程、下背舒展课程以及中老年强化课程,所有EMS课程都经过国际第三方百年权威机构认证。

ZESPEED首创太空舱已申请外观设计专利

工作人员表示,今后随着用户数据的持续收集与需求的深入挖掘,平台会对这6类课程做更新迭代,研发更多课程内容。

此外,ZESPEED还从数据维度切入,为用户提供了“基因检测”与“便携式EMS设备”。

面对业态的变化和市场的需求,在行业诸多问题面前,EMS健身品牌们面临的是一场持久考验,这更多挑战的是品牌的运营能力。

在吸引更大规模的用户参与进来之前,EMS品牌们首先要解决的是如何统一设备的标准,规范和统一课程的权威认证,以及开发出更多好玩、实用的内容,能否解决这些问题,将是决定EMS健身能否走的更远的关键。


全民健身已来,科技健身方兴未艾

今年是第10个全民健身日,在魔性健身歌声“燃烧我的卡路里”伴奏下,想要健身塑型的人越来越多。

早在2016年,国务院就印发了《国务院关于印发全民健身计划(2016—2020年)的通知》,将全民健身上升为国家战略。

以上通知提到,到2020年全国体育消费总规模将达到1.5万亿元,全民健身成为促进体育产业发展、拉动内需和形成新的经济增长点的动力源。

随着健身市场越来越大,健身产业的发展也百花齐放,可以肯定的是,在ABC(AI、Big Data、Cloud Computing)时代,科技健身将扮演一个越来越重要的角色。

但类似于EMS这样的朝阳健身项目,在得到资本市场的认可后,如何在商业市场得到大众的普遍认可还有很长的一段路要走。

[职业生涯] “工农产品价格剪刀差”在苏联和中国的形成

$
0
0
发信人: MrFen (史上第一胖), 信区: WorkLife
标 题: “工农产品价格剪刀差”在苏联和中国的形成
发信站: 水木社区 (Mon Oct 22 16:59:41 2018), 站内

“工农产品价格剪刀差”在苏联和中国的形成
  (一)、“工农产品价格剪刀差”在苏联的形成
  苏联经济学家普列奥布拉任斯基(1924)提出了“社会主义原始积累”理论。该理论主张通过不平等交换牺牲非国营成份实现工业发展所需要的积累资金。同非社会主义经济成分进行不等价交换,是最重要的积累方法。而国家工业品和非社会主义经济成分主要是农产品进行不等价交换。为了建设工业化,苏联政府对工业品定高出其价值的价格,对农产品定低于其价值的价格。这就是“工农业产品价格剪刀差”的由来。斯大林指出,在一定时期内不能立刻消除“工农业产品价格剪刀差”,否则就会阻碍国家工业化。苏联在1953年以前农产品采购价格很低。从三十年代初实行义务交售之后,义务交售价在1935年提高18%,以后十六、七年没有变动过,以致造成采购价格比成本低得多。1953年谷物义务交售价仅为成本的10%,1952年牛肉义务交售价为成本的5%,猪肉为6%,牛奶为22%。
  事实证明,苏联政府采取的“工农产品价格剪刀差”措施,不仅损害了农民的劳动积极性,也阻碍了农业的发展,为苏联以后的产业失衡埋下伏笔。
  (二)、“工农产品价格剪刀差”在中国的形成
  1949年中华人民共和国宣告成立,中国人民从此站起来了。对于建设国家,建国时期的中国共产党可以说没有任何经验。当时的领导人做出了走苏联模式的社会主义道路的抉择。
  在一九五三年冬天,我国政府开始实行对粮、棉、油主要农产品的统购统销,并采取了强制性的分摊任务和低价收购、低价供应政策。对于农产品,国家所定价格低于其自身价值。从此,国家从工业、农业两类不同产品的交换差价中,赚大量资金用于工业建设,实现我国工业化的“原始积累”。
“农业税”其实既不是所得税、地租或资产税,也与“农业”没有实质的联系。它更像是一种身份性贡赋,是无优免特权的臣民交纳的“皇粮国税”。1949年新中国成立后,为保证国家政权稳定和推进工业化建设,农业税在相当长时期内一直是国家财政的重要来源。建国初期,农业税的收入占国家税收的39%。从1949年至2000年的52年间,农民给国家缴纳了7000多亿公斤粮食。全国累计征收农业税达3945.66亿元。

走出腾讯:一个80后技术人的信仰

$
0
0

栏目简介:激荡六十年,人工智能已经起航。然而在未来面前,我们都还是孩子。究竟是“奇点临近”?还是泡沫行将破灭?为了解惑,《AI名人堂》将汇聚领航者智慧,和你一起探索前行的方向。

记者 | 杨丽

出品 | AI科技大本营(ID:rgznai100)

18 年前,如果没有 Foxmail 卖给博大,博大后又被腾讯收购,或许也就没有李明强如今的模样。

从 2005 年到 2012 年期间,偏居广州的张小龙团队四处突围,QQ 邮箱由死向生,微信从零至一。

没有人质疑,李明强作为 QQ 邮箱技术负责人和微信创始团队成员之一的确定性。

成功有点始料不及。那时候,张小龙像是一面鲜明的旗帜,吸引了不少年轻人的加入,他们如今成为了腾讯的重要中坚力量。这段经历也一直被媒体津津乐道。写了又写,传了又传。但又有多少人曾注意到站在张小龙身旁身后的人呢?那段日子里,成为张小龙的“弟子”,他的光环是夺目的,却又是刺眼的。

而徒弟们也确实想证明自己:没有了张小龙的光环,离开了腾讯这个平台,自己究竟还能有多厉害?在腾讯,李明强也算经历过大大小小项目的生与死,如果还不折腾或许就真折腾不起了。

搏一个可以做十年的事情

2012 年年底,正值微信平台用户迎来第一波大规模喷涌的高峰期,李明强却头也不回地走出了腾讯广州研发中心的大楼。

2014 年,单飞企鹅俱乐部发布的《腾讯系创业风云榜》上,李明强和他创办的图普科技的名字赫然在列。

在此期间,李明强的另一个创业项目——最美搜衣失败了,“我觉得选择一个产品没有什么对与错,但当时在当时处理内部管理架构这个角度上来讲,是走过弯路的。”采访中,当 AI科技大本营(ID:rgznai100)记者希望李明强总结自己创业6年以来遇到过的哪些坑时,他谈起了这个项目。

“不要将鸡蛋放在一个篮子里”,这也促使他可以很快重振旗鼓。

“从技术来讲,图像识别一直是一个没有被打开的应用场景,就像在微信上,很多内容是以图片形式呈现。那时短视频还不算很多,但我们已经看到很多已经基于图片、语音的形式出现了。”那时,李明强把目标立得很大,希望做一个可以颠覆百度、谷歌那种纯文字搜索的图文类搜索引擎,搏一个可以做十年的事情。

于是,最美搜衣之后,2014 年引发舆论热议的“快播”事件让李明强看到了机会。图普科技,也因而从互联网用户提供鉴黄服务起家,直到最近一年,相继拓展到了泛安防、新零售等行业。不过短短 4 年,图普科技的行业能力在不断拓宽的同时,也反映出单纯提供鉴黄服务所存在的天花板。

鉴黄服务从来都不是终点

那段时间,中国的互联网直播平台呈现了一种爆发趋势,从底层的云服务提供商,到上层的应用开发商纷纷涌现,基于图像识别等技术的内容审核平台由此涌现。 

简单来讲,就是通过截取视频流各个环节的图片,利用机器学习引擎对图片中的关键信息与特征库里的特征进行相似度匹配,并给出色情、正常、性感等不同维度的权重值,由此判断并筛选出疑似涉黄信息。同时,对于系统无法识别或无法作出最终判断的内容,直接交由人工审核。

目前业内普遍的涉黄检测准确率已达到 99 %以上,而早在那时,图普科技结合人工审核的方式将这一数字提升到了 99.5 %,可极大提高企业运营效率和降低开支。这也直接让国内众多头部直播平台、视频云服务商与图普科技建立了合作关系。

2017 年初“一寸明言”贺乾明的一篇文章中指出:“借助直播业务的发展,图普科技的日订单量从每天 3 亿张上涨到 9 亿张。与之合作的阿里云提供的接口报价,每万张图片在 20-25 元之间。粗略算来,每天营收可达 180 万……”

而实际上,似乎用云服务来提供 AI 技术能力,具有天然的逻辑和优势。以近日阿里AI鉴黄语音反垃圾服务的上线公测为例,除识别色情图片、色情视频和色情文字外,涉黄语音也可以通过 AI 识别了。如今,包括阿里、腾讯在内也早已形成了在图像识别方面的技术和服务能力。

“我们应该是国内最大的独立图象识别云服务商,”李明强强调。相比之下,据了解,阿里、腾讯很大程度上是为生态内的产品提供服务。

优化零售场景里的数据分析

实际上,将业务全部押注于某一类型的客户,本身就是带有风险性的。2017 年底,政府出台的相关政策驱动下,视频直播的风口开始回落,用户需求的变化也促使李明强开始改变打法。

今年上半年,李明强详述了商业智能产品,帮助传统零售门店实现智能化升级。通过图像识别技术融合线下门店运营策略,对店外客流、进店客流、购买客流和复买客流提供不同的数据统计和分析的功能。

基于多模型组合的行人再识别技术,捕捉商场或门店内的任意顾客图像,甚至模糊、被遮挡情况下的行人也可以识别出来,并且区分不同身份的店员和顾客。

不同于传统意义上的数据分析公司,图普科技擅长的不仅是基于 SaaS 的服务模式,更多定位的是在 AI 技术上的能力。“新零售很多业态还在探索中,我们赋能的是传统零售,加上 AI 的功能或工具,让它变成新零售。”

在零售、商业智能方面,这个行业已经有了不少的创新。这又是一个新的市场。虽然图普早就已经准备好了与各大互联网公司连接的第一步,开始往图像增值服务这个方向发展,但能否突出重围还要看接下来的产品和动作。

如何看待同行选做 AI 芯片?

李明强曾表示图普会在成熟工业体系的芯片上承载自己的算法,这一方面是基于初创公司的量力而行,也是对整个行业的冷静思考。不久前,商汤科技、旷视科技依靠自身雄厚的资本支持,联合上游 SOC 芯片制造商联合生产芯片。

在李明强看来,现在的 AI 芯片更像是现有芯片的升级,做这个事情一定要找相应的平衡点。不然,第四次工业革命带来的,一定是社会化大分工。现在做的芯片技术含量真得说不是那么高,真正难的是复杂高端芯片以及生态上的维护。

“我们在成熟的工业体系里面去选择成熟的芯片的话,是处在一个我们对客户的价值最大化这个角度去考虑这些问题的。”李明强补充。

资本疯狂背后的危机

盯着用户需求,而非对手,不然你会最终发现自己无路可走。

2017 年以来,业界封称的“ CV 四兽”依靠资本的力量快速成长和发展起来。 4 月,商汤宣布获 6 亿美元 C 轮融资,5 月底,宣布再获 6.2 亿美元 C+ 轮融资,10 月又宣布获得软银投资的 10 亿美元融资,估值超过 60 亿美元;

6 月中旬,依图宣布完成 2 亿美元 C+ 轮融资,一个月后又宣布获得 1 亿美元战略融资;

7 月,旷视获得阿里巴巴等资本方在内的 6 亿美元 D 轮融资;

10 月,据公开消息披露,云从科技再次获得 10 亿元 B+轮融资。

这个行业因巨额资本的注入,马太效应明显,甚至有唱衰者认为对于创业公司而言,视觉行业战争已经结束。

李明强深感资本力量的强大影响。

“我觉得说大部分创业的人工智能公司,都应该要把握好自己的节奏,不能太冒进,但也不能太悲观,要知道自己沉淀下来的有价值的东西究竟是什么。”创业即将进入第七个年头,李明强,一个 80 后技术人,从走出腾讯的那一刻起,就已把此生芳华献给了技术。

【完】

2018 AI开发者大会

只讲技术,拒绝空谈

2018 AI开发者大会是一场由中美人工智能技术高手联袂打造的AI技术与产业的年度盛会!是一场以技术落地为导向的干货会议!大会设置了10场技术专题论坛,力邀15+硅谷实力讲师团和80+AI领军企业技术核心人物,多位一线经验大咖带你将AI从云端落地。

大会日程以及嘉宾议题请查看下方海报

(点击查看大图)

点击 「阅读原文」,查看大会更多详情。2018 AI开发者大会——摆脱焦虑,拥抱技术前沿。


扎根七年,旷视安防的原则与野望

$
0
0

旷视科技CEO印奇曾说,“2018将是行业整合的一年,输赢到今年结束就能看得清楚。”

在距离2018年结束还有两个多月的今天,旷视科技安防事业部技术总经理那正平再次肯定了印奇的“预判”。

“在经历了众多大大小小的“战役”之后,这个行业内的玩家基本已经固定了,尤其是安防领域,无论是传统安防厂商还是AI创业公司,那些没有掌握行业的核心技能且管理水平欠佳的公司一定会出局,而其他的创业者们再想入局也难度极大。”

拥有15年IT从业经历的那正平,自2003年硕士毕业后,一直任职大唐电信,历任开发部门经理、公司副总经理等职务。其对公安、消防、政府应急管理信息化及应急指挥信息化了解透彻,并于2017年加入旷视科技,负责制定智能安防技术架构及发展战略。

身为一位行业老兵,那正平亲身经历了海康威视、大华股份等如今安防巨头们的成长过程。

“那个时候大唐电信正值发展巅峰时期,而海康、大华还嗷嗷待哺,所以双方一直都有接触、合作,但没想到他们发展的太快了,短短数十年就获得了傲视群雄的行业地位。”

看到技术对于行业的改变如此之大、之快,久坐传统深院的那正平心中也有了几丝起伏,可惜他一直未能发现一个让他眼前一亮以足矣让其做出改变的技术点。

直到去年,他真正感受到AI时机已至,自己多年的项目、行业经验可以帮助企业走得更远,帮助自己实现更高目标,于是毅然辞职选择加盟顶尖AI计算机视觉创业公司——旷视科技。

彼时,头部几家AI创业公司做安防业务算法足够、粮草齐备,可以说什么都不缺,最缺的就是像那正平那样对技术、业务、产品、项目都非常熟悉的全才,所以在人工智能领域形成了人才卖方市场,企业的待遇、成长空间和发展潜力都成为人才流向的关键因素。

怎么选呢?这是摆在那正平面前的一道难题。

作为一位在垂直行业扎根多年、负责过多个国家级重大项目的专家,他最终选择了旷视科技。

他说,眼下的AI赛道鱼龙混杂,市场上的AI初创公司如果单纯只做图像、语音识别这些通用技术,指望通过SDK获利,未来的路只会越来越窄。

相反,找到一个最适合自己的垂直领域,深扎进去做端到端的解决方案,把技术转化为产品,然后销售出去实现商业变现,再通过客户反馈更多的数据,从而夯实自身技术的途径,才是最现实的。

而就这一点而言,在安防领域能够做到的AI创企屈指可数,而旷视可以说是其中相对较好的一家。

七年经营,产品矩阵全面展开

提到旷视安防,行业内的人应该都有所耳闻。 

目前整体估值超过35亿美元的旷视科技是国内第一批将AI技术应用落地到传统安防行业中的独角兽企业。 

七年前,AI还未成风口,创业公司也没几家,VC圈尚不认可,那个年头,做AI已经要有难得的孤注一掷的情怀,不曾想入场后不久,旷视便瞄准了行业公认的硬骨头:安防市场。 

人们疑惑、不解甚至是嘲笑。毕竟彼时行业内更多的观点认为AI不过是新壶装老酒,老生常谈,落地应用乃至于商业化会有个漫长的过程,技术应用泡沫巨大。也有一些行业客户认为既然在十年前上了人脸识别的当,以后再也不会相信这一套玩意儿。 

旷视对此并未理会,在这一垂直领域扎下根去。当旷视用一个接一个的战果证明技术已经成熟了的时候,行业才真正地认识到:AI时代真的来了。 

经历,折射出一个嗷嗷待哺的创业公司从婴儿到长大最真实的样子,而当他呱呱坠地时,商业画卷也便渐渐展开。

技术落地前期,他的一哭一笑、一举一动、一吵一闹都被人们等待着,都被时代注视着,也被历史画卷记录着,时代的声音勾勒着他们的轮廓,越来越细,越来越多。 

终于在他成熟之际,那幅画的线稿也就清晰地展示在人们面前。 

今天,旷视安防所研发的产品矩阵涉及人、车、物特征识别等多个领域;业务线涉及 云、边、端三大版块。 

在云端,旷视利用大数据和深度学习算法,研发出集成数据可视化功能和轨迹追踪功能的城市天眼2.0系统及洞鉴5.0系统,相当于为行业用户搭建了云端研判平台。例如,结合城市安防、城市治理、城市交通、虚拟化治理和社会化服务五大场景,旷视的天眼系统可以帮助城市管理者实现智能、高效的管控。

在边缘计算领域,为满足安防实战场景的现实需求,旷视也在持续研发、优化算法以适配边缘计算的要求,将计划在2018年安博会期间推出全新的适配轻量云计算的近十款边缘生态展示方案和蕴含旷视优质算法算力的产品。这其中便包含具备4K分辨率超高清画质的4K结构化相机,和能够进行300人脸高并发抓拍的高密人脸抓拍平台,以及具备深度学习能力的敏观抓拍识别一体机和集抓取、识别、对比报警能力为一体的“最强大脑魔方”B3单芯片16路视频分析盒。 

而在终端,旷视为了满足各类复杂场景的实际需求打造出了形态各异的智能硬件产品,例如旷视敏观系列全结构化相机C4N-888,据说是业界首款能够实现人车识别的结构化相机;还有被旷视内部成为“快捕”系列的便携2.0——一种可机箱分离式升级版警务处理布控设备,以及集成旷视最新人脸识别算法而研发的“锐眸”系列智能眼镜等。 

可以说,在传统安防拥抱人工智能的当下,旷视正在用软硬一体的方式打造涵盖“算法、技术、硬件产品、解决方案、数据”在内的全价值链。

“这些产品矩阵都是实际存在的,也都是会经受市场考验的,2018年北京安博会上,针对以上三大块,旷视会分别集中展示并现场测试。”那正平说道。 

“毫不夸张地说,现在已经有多个省市都适配了旷视科技基于视频结构化技术的智能视频侦查系统,我们帮助公安部门抓获了在逃人员和犯罪嫌疑人数千名,AI技术正被越来越多行业人所认可。”

之所以能够在不长的时间内获得较为不错的成绩,在那正平看来,原因非常多元,最为重要的因素有两条: 

一是做事情的人,想要做好智能安防业务需要将传统安防人、AI人、互联网人都聚集在一起,之后,企业要有良好的机制将这三类人更好地融合在一起。 

比如互联网人C端思维比较明显,传统安防人更趋向市场驱动技术,而AI人更倾向技术驱动市场。当各类人由于思维不同出现观点碰撞时,领导层需要充分利用这三类人的思维成果并反馈出一个最有可能成功的信息,为用户打造技术更精、更优也更符合需求的产品。

二是原创技术领先性。从算法角度来说,太多依靠开源框架微创新,然后采用低价策略抢占市场,导致整个行业丧失了做基础原创技术创新动力的案例。 

坚持自研是一条漫长且艰苦的路,没人知道数年的努力能不能换得一次数量级的提升,也没人知道高投入后是否得到与之相匹配的回报。 

毕竟AI技术研发周期长,投入大,落地难,市场需从无到有进行培训,而最后的商业化也只能听天由命,大概率成了先烈还赔了岁月。

幸好,旷视花了七年时间让原本心存鄙见的人都转头做了AI、让原本不温不火的市场瞬间热情四涨、让更多人知道了AI,让人们知道了安防还可以这样玩。 

可以说,在安防领域取得的巨大成功已经可以看做是旷视高新科技成功转化的一个优秀案例。

持续原创,解锁更多AI场景

在AI火遍大江南北之后,当原创AI技术的领先性一次又一次地冲击着传统安防的敏感神经时,“点到为止”技术论又频频出现。

支持者认为,基于安防行业自身天然的高试错率,小数点后的算法精度数量级提升对于项目的最终归属没有大的改变。

在那正平看来,“现阶段,与安防相关的AI技术精准度还远远没有达到天花板,基于安防场景的不断变化,其对算法迭代的要求一定是非常严苛且上升的。

在这个市场中,谁能够看到算法精度提升解锁的更多场景,并根据场景的变化做到最为快速且精准的反应,谁就能在未来竞比中走得更远。”

眼下,AI在安防领域的研究应用主要针对几个核心问题:分别是分类检测、分割、以及对整个图像区域分类。 

以往来看,AI神经网络中激活函数、非线性单元、权重矩阵的应用形成了非常高维的非线性函数,从而可以完成非常复杂的任务;与此同时,在这基础之上,GPU的出现让神经网络的发展如虎添翼。

即便如此,相关AI技术在安防市场上的应用还存有几个挑战: 

认知问题相较感知问题较难解决。感知问题可以用神经网络函数逼近,相比之下认知问题解决起来比较棘手。 

比如如何教会机器辨识一把椅子。如果定义为四条腿,很多椅子并不满足此描述;如果定义为可以坐的物体,如此也行不通。所以说简单的检测物体问题上,背后都蕴含着更深层次的认知问题,如今很多问题还尚未解决。

在弱线索、遮挡、模糊、对象追踪等情况下,人类在识别的过程中通常会依据常识,并加入丰富的想象及推理。但是想要将这些能力传授给机器便非常困难;即使实现,识别能力与人类相比也相差甚远。

计算机视觉技术带给机器的能力不只是用来观察世界,而是需要与世界建立联系,从而一起做交互。在某个机器人去解决一件重要的问题需要用到手眼协同时,需要连续的关键决策,而不停地观察、决策和控制,这是机器智能目前非常难做到的事情。 

随着安防行业的多元化发展,未来很多细分场景对于精度要求之高势必让人咂舌,基于背景知识的图像内容描述,挑战都非常巨大。

也就是说,AI在安防行业的探索才刚刚开始,如果仅具备应用于现有部分场景中的技术和产品储备,接下来在这个市场比拼中会比较被动。

鉴于此,旷视所坚持的战略是通过原创的深度学习和智能感知技术构建基于人工智能核心技术的行业物联网和城市大脑。针对安防业务中的典型场景和实战诉求,旷视创新提出了覆盖“情、指、勤”全业务流程的“端到端”立体业务设计,针对每个环节的特点和痛点研发对应的产品及解决方案,建设以人工智能技术为核心的的智能安防基础物联感知体系,帮助传统安防实现数字化、智能化转型。

旷视安防的野望

“智能安防市场发展越来越快,各个甲方在选型时也会往AI上靠拢。传统安防公司大都往后端做,而AI公司则大力往前做,未来针对这个市场的比拼会非常精彩。”

今天的安防开足了马力,从原来的幕后自然生长,变成了台前极速狂奔。同时,今天的安防本质已经发生变化,它再也不局限于监控,而延伸到医疗、政务、教育各个领域。 

以AI技术为代表的高新技术的发展为人们提供了越来越多的可能性,而用户也出现了需求个性化的趋势。 

作为领先的科技赋能者,旷视科技正在两者之间找到一个平衡,利用技术将两者更加紧密地结合在一起,打造一个数字化、智能化的商业世界。

“在安防这条赛道上,眼下各个玩家跑的都非常快,需要注意的是,创业公司从0到1的发展过程中,一定要知道什么是自己该做的,什么是自己坚决不能碰的,一定要有差异化,尽量减少犯错。”

就安防来说,那正平坦言,旷视也有自己严格的业务底线与标准:做收敛型业务,发散性业务不做;做强AI业务,弱AI业务不做;可以体现差异化的做,体现不了差异化的不做。 

“为什么旷视科技能够七年如一日保持创新、一直进步?”我问。 

“旷视一直坚持技术信仰和价值务实。作为一家以人工智能技术为核心的创业公司,我们既要保持对AI技术的赤子之心,也要保持对应用场景的好奇与探索,真正让技术实现落地,持续为客户和社会交付价值。”

那正平答道。雷锋网雷锋网雷锋网

刚采访了一个大学霸,他的秘诀是预习(学霸开豆瓣啦)

$
0
0

刚才学霸邮件回复了我,我复制下来了:

他的账号是: https://www.douban.com/people/186212171/?dt_dapp=1

想和他交流的朋友可以关注哈。

——————————————

今天因为工作需要采访了一个top1学府的尖子学霸。期间他的很多话深深的震撼了我:

“其实我也不聪明,我很蠢的,我就是靠预习。”

“具体是怎么预习呢?”

“就是小学五六年级就开始看初一到初三的课程和作业,初中看高中的,以此类推。”

“!!!,所以你上初中的时候就在学高中的教材了?”

“对,也会做高中的习题作业、考卷。”

“为什么没选择跳级呢?”

“不能跳级,平时听课还是要帮我巩固和解惑的,比方说自学的时候一些想不通的问题,还是要考上课消化。”

“还是会有自己学不懂的问题?”

“当然了,很多很多,想不通的地方会让我睡不着觉,所以经常整理好问题去问老师或者高年级的同学,慢慢吃透。”

“因为预习,自己的成绩好,和班里的普通同学对比,会不会有某种优越,或者说会骄傲?”

“不会,我成绩好只是花费了更多的时间而已,并没有什么天赐的技能。而且,我很喜欢给同学讲题,这样我又可以复习一遍。”

“………………”

(我的妈呀!我跟我一起采访的同事直接听呆了!这根本超越了预习的定义啊!!

学霸的境界太震撼了,终于明白了自己学习不好一点都不冤枉呀555555)

🌟看大家感兴趣 我再放一段其他震撼的内容🌟

“现在大.学期间,还是会坚持这么预习吗?”

“理念上任然在坚持,但是大.学已经跳脱了基础教育那种传统的考试制度,所以我不是很看重教材了。主要就是在自己专业课上追赶最尖端的研究成果。”

“国外的论.文,报告之类?”

“对,虽然教授要求不高,也是简单让我们大概了解,但是我更喜欢深入研究,甚至找机会重现一些实验,这个过程会理解的非常透彻。”

“现在你们班同学都是这种状态吗?”

“不是,我在班里并不耀眼,就是努力追赶才能维持吧。上了大.学才发现有的人真的聪明到让你无法企及,思维和反应非常敏捷,学东西毫不费力。面对这样的人,会有巨大的挫折感,我只能拼命追赶。”

“你对自己要求很高啊。”

“其实不是的,我只是一直觉得,不懂的东西就一定弄明白,我不喜欢似是而非,似是而非倒不如什么都不学。这其实让我很困扰。”

“困扰?有什么你现阶段困扰的事情吗?”

“比如说有些论.文是从德语翻译过来,我总担心有细节是错的,所以最近在努力学德语,希望能直接看原版。当然,学习上可能还有路径克服吧,但是找不到女朋友很让我困扰(笑)”

“喜欢什么类型的女孩子?”

“爱笑的,我其实有点呆板,不太会说话,生活上是很笨拙的人。我喜欢像八九点钟暖阳那样的女孩。”

“你这么优秀,没有女孩子主动追求你吗?”

“没有。很遗憾。我长得有些不好看,也不懂什么情调,挺惭愧的。”

“但还是会憧憬谈恋爱?”

“是的。我喜欢极致的美,科学上的真理、确定性是极致的美,其实有一些女孩子也是呀(笑)。不是简单说外表,而是她们站在我身边笑着,我就觉得很美了。”

🌟有人感兴趣他的时间管理,我整理出来了🌟

“听你所有的描述,你是很自律的人,平时怎么管理时间?”

“我在时间管理上没有特别严格的规矩,因为我觉得太细化刻板的日程安排,有时候会加重拖延。只有一个准则,就是每天保证有10个小时是在摄入状态就可以。”

“10个小时?连续的学习吗?”

“不是,当然还是尽量保证有大段专注的学习,但是拆分开的话也可以接受。因为之前看到过说法国top1学府的学生,很多回每天学14个小时,我有点做不到,所以先从10个小时开始。”

“怎么理解摄入状态?”

“不一定是看书或者实验,看看纪录片、比较轻松的分析报告都算,有时偷懒的话也会看小说(笑)。”

“你不像会偷懒的人啊?”

“我会懈怠的。人生理上确实也很难一直保持良好的状态,所以有时候白天忽然犯懒的话,就会换个时间段再看书。”

“你怎么克服行动力不足的情况?”

“恩,这个问题似乎很多人都有,我也看过一些这方面的论.文,说实话,实用性都有些不足。我的方法是直接去做,不管这个事情有多难多烦躁,先做五分钟看看。会跟自己这样说。”

“很有效果?”

“对,因为一旦开始做了,就会发现并没有那么困难,思路会打开,五分钟过去会想继续做下去。我有一个父亲送给我的手表,薄薄的,每次要开始做事情的时候就把手表摘下来,藏到我要看的书中间,一直把书看到我藏手表的那一页,五分钟就过去很多了。而且,躺着看书手表会掉下来,所以还能要求自己端端正正地看书。总之,是很傻的方法。”

“有什么时间管理的小技巧分享吗?”

“刚好有,最近在尝试五点起床,起床后做一点拉伸,稍微吃一点东西就开始看书,看到宿舍同学起床,大概八点多吧。这样会感觉自己多出来三个小时时间,也不去碰电脑或者手机,脑袋清醒许多。”

“五点起床,要很早睡吧?”

“差不多我11点左右睡觉,目前尝试了一周左右,还没有感觉到精力上的透支,如果有我还是会再做调整的。

另外就是,可以多给自己设立一些挑战。比方说国外有一个阅读马拉松的活动,就是24小时不间断的读书,看看自己能读多少。我有时候没有任何安排的时候,就试着挑战一下自己。”

“感觉你的重心完全在学习上,生活娱乐的时间被压缩甚至牺牲掉了,你会有这种感觉吗?”

“高.考结束那个假期我自己做了一次骑行,大概一个月时间吧,那段时间很难过,因为觉得自己和别人比起来,是没有青春的人。”

“真的会这么想吗?”

“是的,从未有过什么热烈的情感。不过现在不会了,人不可能什么都有吧,我可以坦然面对这些了。而且,学到一个新东西的快乐也会让我兴奋到起鸡皮疙瘩(笑),只能,只能这样安慰自己。”

“有时候,会不会觉得自己是异类?”

“很少。因为把人分类,或者贴上标签,都是为了便于理解而创造的形式,我可以理解被贴上“书呆子”,“理想主义”之类的标签,并不介意,但是我不会这样理解自己。谁能真的理解自己呢?”

“最近有什么学习之外的爱好吗?”

“听音乐吧。”

“会听些什么音乐?”

“没有特别固定的。我只是被一件事情困扰,就是为什么相同的乐器可以表达出完全不同的情感,它们是怎么做到的?于是我就会去探索。比如说最近在研究唢呐,很多人觉得唢呐的音色是很哀伤的,但是如果你去听《日出峨眉》《将军令》这样的武侠音乐,唢呐会变成另一种感情,难以复制的浩然正气。

二胡也是这样。明明观感上是很悲伤的乐器,但是还能传达非常灵动的情感,比如贾鹏芳的《空山鸟语》,鸟语花香,太美了。我就想,节奏,力度的变化可以有这么神奇的区别?这让我感到非常有趣。有时间的话想要认真学习一些乐理知识。”

“目前的理想是什么?”

“啊,我没有理想,或者说暂时没有,因为这个问题我还没有想好,想得清楚明白。硬要说的话,我想理解这个世界。好傻的理想,哈哈。”

“在这么高精尖的专业学习,不会有想要影响行业,或者影响世界的志向吗?”

“没有,我真的没有。带来影响这样的想法我是尊重的,只是我更喜欢理解的过程吧。另一方面,想要去影响反而会带来过度的自负,自负会堵住一个人的好奇心,好奇心死了,人也就死了。”

🌟最后整理了一些乱七八糟的采访问题🌟

“平时刷手机,都会用什么app?”

“苹果自带的播客最多,走路或者吃饭的时候打开听一听历史类、语言类的节目,这种碎片时间利用起来很重要。另外比较喜欢看b站,主要刷纪录片区。还有ibook,自带的日历用的也最多。剩下主要是词典翻译类了。通讯比较喜欢用telegram。

我蛮土的其实,不太了解比较火的软件。手机对我来说不像通讯工具,更像学习那种,儿童点读机(笑)。自带的app好好利用是非常强大的,比如日历,我会用这个来做块状课程安排,网上有很多这个教程。”

“抖.音、weibo之类的也不刷吗?”

“听说过,但是我没有用过。因为如果你用一个看起来什么功能都有平台,负面作用是会最大程度拆散你的注意力。如果平时的需求是看新闻,那就只用新闻类软件就好了。另外,不知怎么,在巨大的社交环境下,我总会感觉到孤独。尤其你看到别人在狂欢的时候,会因为不知道如何融入而对自己怀恨在心。”

“上课和看书的时候会做笔记吗?”

“会,不过我对笔记没有什么系统的方法论。自己看懂就好,笔记目的是去让你的知识有结构,如果投入过多的精力,效率并不高,反而变成了自我感动。”

“有没有你特别喜欢的一句话?”

“有的,这句话写在我每本教科书第一页:智慧带我们回到童年。来自帕斯卡尔。”

“对于我们这样的学渣,你有什么建议吗?”

“首先就是不要叫自己学渣(笑)。我坚信一切技能都是工具和手段,最终的目的是满足你的好奇。既然是工具,那么只要愿意花费时间和精力去学习,一定可以学好,只是时间长短的问题。

其次,建议多多写作。写作是一个最好的梳理自己思维的方式,写给自己,不要有压力。”

“接下来对自己有什么期望?”

“两方面,第一是不要太自我。我总沉溺于探索自己,还是希望有更多的责任感,不管是学业上还是生活上。第二是,(笑),能稍微时尚一点吧。”

“哈哈,为什么想时尚一点?”

“还是有一点点虚妄的想要吸引女孩子的注意。此外,莎士比亚说过一个人没有第二次给他人第一印象的机会。把外表当作一种技能的话,我相信自己还是能在能力范围内,习得基本的常识。”

“你的爱情启蒙是什么?”

“歌德的《少年维特的烦恼》,那时候,第一次了解到了爱是一个炙热的概念,一个温度单位。其实我真的,真的羡慕可以完完全全融化在某一种情绪里的人,至少有一瞬间,这种灵与肉的合体是超越一切的。不过,我没有体验过,也可能我是错的。”

“会更钟情文科女孩还是理科女孩?”

“嗯…我一直觉得,分科这件事是不对的,自然科学也好,人文科学也好,并没有绝对意义上的割裂,两者都具备逻辑之美。所以我不会在意这个女孩的学科背景,思维方式是我更感兴趣的。”

“有想过未来有机会约会女孩子的话,会做些什么吗?”

“其实我学唱了一首歌,我很想唱给未来喜欢的女孩听。但是五音不全就比较不好意思拿的出手了。如果能每天给她分享我在阅读时傻乐的片段,她也能被触动,就非常满足了。”

“冒昧问一句,学的是什么歌呀?”

(这部分我直接给大家放链接吧,不知为什么,听着这首歌重看采访,我忽然热泪盈眶,这样纯粹的人,真的好棒:My Chemical Romance的单曲《Summertime》 http://music.163.com/song/21162546/?userid=266328590

谢谢大家对这次采访和学霸的喜爱和支持!大家的评论我已经转达给他了,不过他似乎一直在学习还没回复我😂

谷歌最强 NLP 模型 BERT 解读

$
0
0

雷锋网 AI 科技评论按:本文是追一科技潘晟锋基于谷歌论文为 AI 科技评论提供的解读稿件。

最近谷歌研究人员通过新的BERT模型在11项NLP任务中夺得STOA结果,这在自然语言处理学界以及工业界都引起了不小的热议。作者通过在33亿文本的语料上训练语言模型,再分别在不同的下游任务上微调,这样的模型在不同的任务均得到了目前为止最好的结果,并且有一些结果相比此前的最佳成绩得到了幅度不小的提升。作者的这一研究其实是今年深度学习在自然语言处理中一个新热点方向的延续,故事还得从更早一点说起。

BERT的“前任”们

早在2015年的时候,微软研究院的何恺明和他的同事们发表了残差网络的论文,第一次通过残差的方式将卷积神经网络推进到了100层以上,并在图像识别的任务上刷新了当时的最高纪录。自那以后起,随着网络不断地加深,效果也在不断提升。然而大量的数据训练出来的大型网络虽然效果更好,但随着网络的加深以及数据集的不断扩大,完全重新训练一个模型所需要的成本也在不断地增加。

因此在计算机视觉处理中,人们越来越多地采用预训练好的大型网络来提取特征,然后再进行后续任务。目前这种处理方式已经是图像处理中很常见的做法了。

相比之下,自然语言处理目前通常会使用预训练的词向量来进行后续任务。但词向量是通过浅层网络进行无监督训练,虽然在词的级别上有着不错的特性,但却缺少对连续文本的内在联系和语言结构的表达能力。因此大家也希望能像图像领域那样,通过大量数据来预训练一个大型的神经网络,然后用它来对文本提取特征去做后续的任务,以期望能得到更好的效果。其实这一方向的研究一直在持续,直到今年的早些时候AllenAI提出的[ELMo](https://arxiv.org/pdf/1802.05365.pdf)由于其在后续任务上的优异表现获得了不小的关注。

在CMRC2018阅读理解比赛中,追一科技的参赛方案就运用了ELMo模型的预训练方式,并做了相应的改进。因为原本的ELMo当中对英文进行了字符级别的编码,但这对中文并不适用。我们在此基础上改进为笔画级别的编码,同时结合原有的词级别编码一起通过双层LSTM变换来进行语言模型预训练。经过实验验证,最后选择了512维的词级别ELMo向量进行后续任务。

在ELMo获得成功以后不久FastAI就推出了[ULMFiT](https://arxiv.org/abs/1801.06146),其大体思路是在微调时对每一层设置不同的学习率。此后OpenAI又提出了[GPT](https://blog.openai.com/language-unsupervised/)。预训练的语言模型是在百度15亿词文本的语料上进行的,模型参数选择了12层,12head的Transformer结构。然后采用此模型直接在子任务上微调来进行后续任务。

从上面提及的这些论文的结果以及学界和工业界的反馈来看,这种使用大量的语料进行预训练,然后再在预训练好的模型上进行后续任务训练,虽然训练方式各有不同,但在后续任务都有不同程度的提高。

而谷歌提出的BERT就是在OpenAI的GPT的基础上对预训练的目标进行了修改,并用更大的模型以及更多的数据去进行预训练,从而得到了目前为止最好的效果。

Trransformer的编码器结构

BERT的主体结构和创新点

BERT模型沿袭了GPT模型的结构,采用[Transfomer](https://arxiv.org/abs/1706.03762)的编码器作为主体模型结构。Transformer舍弃了RNN的循环式网络结构,完全基于注意力机制来对一段文本进行建模。

Transformer所使用的注意力机制的核心思想是去计算一句话中的每个词对于这句话中所有词的相互关系,然后认为这些词与词之间的相互关系在一定程度上反应了这句话中不同词之间的关联性以及重要程度。因此再利用这些相互关系来调整每个词的重要性(权重)就可以获得每个词新的表达。这个新的表征不但蕴含了该词本身,还蕴含了其他词与这个词的关系,因此和单纯的词向量相比是一个更加全局的表达。

Transformer通过对输入的文本不断进行这样的注意力机制层和普通的非线性层交叠来得到最终的文本表达。

Transformer的注意力层得到的词-词之间关系

GPT则利用了Transformer的结构来进行单向语言模型的训练。所谓的语言模型其实是自然语言处理中的一种基础任务,其目标是给定一个序列文本,预测下一个位置上会出现的词。

模型学习这样的任务过程和我们人学习一门语言的过程有些类似。我们学习语言的时候会不断地练习怎么选用合适的词来造句,对于模型来说也这样。例如:

  > 今天天气不错,我们去公园玩吧。

这句话,单向语言模型在学习的时候是从左向右进行学习的,先给模型看到“今天天气”两个词,然后告诉模型下一个要填的词是“不错”。然而单向语言模型有一个欠缺,就是模型学习的时候总是按照句子的一个方向去学的,因此模型学习每个词的时候只看到了上文,并没有看到下文。更加合理的方式应该是让模型同时通过上下文去学习,这个过程有点类似于完形填空题。例如:

  >今天天气 { },我们去公园玩吧。

通过这样的学习,模型能够更好地把握“不错”这个词所出现的上下文语境。

而BERT对GPT的第一个改进就是引入了双向的语言模型任务。

此前其实也有一些研究在语言模型这个任务上使用了双向的方法,例如在ELMo中是通过双向的两层RNN结构对两个方向进行建模,但两个方向的loss计算相互独立。追一科技在文本意图模型中,也加入了通过上下文预测某个词的辅助任务,通过实验发现在做意图分类的同时加入这个辅助任务能够让编码器尽可能的包含输入文本的全局信息,从而提高意图判断的准确率。

而BERT的作者指出这种两个方向相互独立或只有单层的双向编码可能没有发挥最好的效果,我们可能不仅需要双向编码,还应该要加深网络的层数。但加深双向编码网络却会引入一个问题,导致模型最终可以间接地“窥探”到需要预测的词。这个“窥探”的过程可以用下面的图来表示:

从图中可以看到经过两层的双向操作,每个位置上的输出就已经带有了原本这个位置上的词的信息了。这样的“窥探”会导致模型预测词的任务变得失去意义,因为模型已经看到每个位置上是什么词了。

为了解决这个问题,我们可以从预训练的目标入手。我们想要的其实是让模型学会某个词适合出现在怎样的上下文语境当中;反过来说,如果给定了某个上下文语境,我们希望模型能够知道这个地方适合填入怎样的词。从这一点出发,其实我们可以直接去掉这个词,只让模型看上下文,然后来预测这个词。但这样做会丢掉这个词在文本中的位置信息,那么还有一种方式是在这个词的位置上随机地输入某一个词,但如果每次都随机输入可能会让模型难以收敛。

BERT的作者提出了采用MaskLM的方式来训练语言模型

通俗地说就是在输入一句话的时候,随机地选一些要预测的词,然后用一个特殊的符号来代替它们。尽管模型最终还是会看到所有位置上的输入信息,但由于需要预测的词已经被特殊符号代替,所以模型无法事先知道这些位置上是什么词,这样就可以让模型根据所给的标签去学习这些地方该填的词了。

然而这里还有一个问题,就是我们在预训练过程中所使用的这个特殊符号,在后续的任务中是不会出现的。

因此,为了和后续任务保持一致,作者按一定的比例在需要预测的词位置上输入原词或者输入某个随机的词。当然,由于一次输入的文本序列中只有部分的词被用来进行训练,因此BERT在效率上会低于普通的语言模型,作者也指出BERT的收敛需要更多的训练步数。

BERT另外一个创新是在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务。这个任务的目标也很简单,就是预测输入BERT的两端文本是否为连续的文本,作者指出引入这个任务可以更好地让模型学到连续的文本片段之间的关系。在训练的时候,输入模型的第二个片段会以50%的概率从全部文本中随机选取,剩下50%的概率选取第一个片段的后续的文本。

除了模型结构,模型大小和数据量都很重要

以上的描述涵盖了BERT在模型结构和训练目标上的主要创新点,而BERT的成功还有一个很大的原因来自于模型的体量以及训练的数据量。

BERT训练数据采用了英文的开源语料BooksCropus 以及英文维基百科数据,一共有33亿个词。同时BERT模型的标准版本有1亿的参数量,与GPT持平,而BERT的大号版本有3亿多参数量,这应该是目前自然语言处理中最大的预训练模型了。

当然,这么大的模型和这么多的数据,训练的代价也是不菲的。谷歌用了16个自己的TPU集群(一共64块TPU)来训练大号版本的BERT,一共花了4天的时间。对于是否可以复现预训练,作者在 [Reddit](https://www.reddit.com/r/MachineLearning/comments/9nfqxz/r_bert_pretraining_of_deep_bidirectional)上有一个大致的回复,指出OpenAI当时训练GPT用了将近1个月的时间,而如果用同等的硬件条件来训练BERT估计需要1年的时间。不过他们会将已经训练好的模型和代码开源,方便大家训练好的模型上进行后续任务。

虽然训练的代价很大,但是这个研究还是带来了一些思考和启发。例如双向语言模型的运用,多任务对预训练的帮助以及模型深度带来的收益。相信在未来的一段时间,自然语言处理中预训练的神经网络语言模型会得到更多的关注和运用。

论文原文: https://arxiv.org/abs/1810.04805

使用Thread Pool不当引发的死锁

$
0
0

简介

  • 多线程锁定同一资源会造成死锁
  • 线程池中的任务使用当前线程池也可能出现死锁
  • RxJava 或 Reactor 等现代流行库也可能出现死锁

死锁是两个或多个线程互相等待对方所拥有的资源的情形。举个例子,线程 A 等待 lock1,lock1 当前由线程 B 锁住,然而线程 B 也在等待由线程 A 锁住的 lock2。最坏情况下,应用程序将无限期冻结。让我给你看个具体例子。假设这里有个  Lumberjack(伐木工) 类,包含了两个装备的锁:

import com.google.common.collect.ImmutableList;
import lombok.RequiredArgsConstructor;
import java.util.concurrent.locks.Lock;
@RequiredArgsConstructor
class Lumberjack {
    private final String name;
    private final Lock accessoryOne;
    private final Lock accessoryTwo;
    void cut(Runnable work) {
        try {
            accessoryOne.lock();
            try {
                accessoryTwo.lock();
                work.run();
            } finally {
                accessoryTwo.unlock();
            }
        } finally {
            accessoryOne.unlock();
        }
    }
}

每个  Lumberjack(伐木工)需要两件装备: helmet(安全帽) 和  chainsaw(电锯)。在他开始工作前,他必须拥有全部两件装备。我们通过如下方式创建伐木工们:

import lombok.RequiredArgsConstructor;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@RequiredArgsConstructor
class Logging {
    private final Names names;
    private final Lock helmet = new ReentrantLock();
    private final Lock chainsaw = new ReentrantLock();
    Lumberjack careful() {
        return new Lumberjack(names.getRandomName(), helmet, chainsaw);
    }
    Lumberjack yolo() {
        return new Lumberjack(names.getRandomName(), chainsaw, helmet);
    }
}

可以看到,有两种伐木工:先戴好安全帽然后再拿电锯的,另一种则相反。谨慎派( careful())伐木工先戴好安全帽,然后去拿电锯。狂野派伐木工( yolo())先拿电锯,然后找安全帽。让我们并发生成一些伐木工:

private List<Lumberjack> generate(int count, Supplier<Lumberjack> factory) {
    return IntStream
            .range(0, count)
            .mapToObj(x -> factory.get())
            .collect(toList());
}

generate()方法可以创建指定类型伐木工的集合。我们来生成一些谨慎派伐木工和狂野派伐木工。

private final Logging logging;
//...
List<Lumberjack> lumberjacks = new CopyOnWriteArrayList<>();
lumberjacks.addAll(generate(carefulLumberjacks, logging::careful));
lumberjacks.addAll(generate(yoloLumberjacks, logging::yolo));

最后,我们让这些伐木工开始工作:

IntStream
        .range(0, howManyTrees)
        .forEach(x -> {
            Lumberjack roundRobinJack = lumberjacks.get(x % lumberjacks.size());
            pool.submit(() -> {
                log.debug("{} cuts down tree, {} left", roundRobinJack, latch.getCount());
                roundRobinJack.cut(/* ... */);
            });
        });

这个循环让所有伐木工一个接一个(轮询方式)去砍树。实质上,我们向线程池( ExecutorService)提交了和树木数量( howManyTrees)相同个数的任务,并使用  CountDownLatch 来记录工作是否完成。

CountDownLatch latch = new CountDownLatch(howManyTrees);
IntStream
        .range(0, howManyTrees)
        .forEach(x -> {
            pool.submit(() -> {
                //...
                roundRobinJack.cut(latch::countDown);
            });
        });
if (!latch.await(10, TimeUnit.SECONDS)) {
    throw new TimeoutException("Cutting forest for too long");
}

其实想法很简单。我们让多个伐木工( Lumberjacks)通过多线程方式去竞争一个安全帽和一把电锯。完整代码如下:

import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@RequiredArgsConstructor
class Forest implements AutoCloseable {
    private static final Logger log = LoggerFactory.getLogger(Forest.class);
    private final ExecutorService pool;
    private final Logging logging;
    void cutTrees(int howManyTrees, int carefulLumberjacks, int yoloLumberjacks) throws InterruptedException, TimeoutException {
        CountDownLatch latch = new CountDownLatch(howManyTrees);
        List<Lumberjack> lumberjacks = new ArrayList<>();
        lumberjacks.addAll(generate(carefulLumberjacks, logging::careful));
        lumberjacks.addAll(generate(yoloLumberjacks, logging::yolo));
        IntStream
                .range(0, howManyTrees)
                .forEach(x -> {
                    Lumberjack roundRobinJack = lumberjacks.get(x % lumberjacks.size());
                    pool.submit(() -> {
                        log.debug("{} cuts down tree, {} left", roundRobinJack, latch.getCount());
                        roundRobinJack.cut(latch::countDown);
                    });
                });
        if (!latch.await(10, TimeUnit.SECONDS)) {
            throw new TimeoutException("Cutting forest for too long");
        }
        log.debug("Cut all trees");
    }
    private List<Lumberjack> generate(int count, Supplier<Lumberjack> factory) {
        return IntStream
                .range(0, count)
                .mapToObj(x -> factory.get())
                .collect(Collectors.toList());
    }
    @Override
    public void close() {
        pool.shutdownNow();
    }
}

现在,让我们来看有趣的部分。如果我们只创建谨慎派伐木工( careful Lumberjacks),应用程序几乎瞬间运行完成,举个例子:

ExecutorService pool = Executors.newFixedThreadPool(10);
Logging logging = new Logging(new Names());
try (Forest forest = new Forest(pool, logging)) {
    forest.cutTrees(10000, 10, 0);
} catch (TimeoutException e) {
    log.warn("Working for too long", e);
}

但是,如果你对伐木工( Lumberjacks)的数量做些修改,比如,10 个谨慎派( careful)伐木工和 1 个狂野派( yolo)伐木工,系统就会经常运行失败。怎么回事?谨慎派( careful)团队里每个人都首先尝试获取安全帽。如果其中一个伐木工取到了安全帽,其他人会等待。然后那个幸运儿肯定能拿到电锯。原因就是其他人在等待安全帽,还没到获取电锯的阶段。目前为止很完美。但是如果团队里有一个狂野派( yolo)伐木工呢?当所有人竞争安全帽时,他偷偷把电锯拿走了。这就出现问题了。某个谨慎派( careful)伐木工牢牢握着安全帽,但他拿不到电锯,因为被其他某人拿走了。更糟糕的是电锯所有者(那个狂野派伐木工)在拿到安全帽之前不会放弃电锯。这里并没有一个超时设定。那个谨慎派( careful)伐木工拿着安全帽无限等待电锯,那个狂野派( yolo)伐木工因为拿不到安全帽也将永远发呆,这就是死锁。

如果所有伐木工都是狂野派( yolo)会怎样,也就是说,所有人都首先去尝试拿电锯会怎样?事实证明避免死锁最简单的方式就是以相同的顺序获取和释放各个锁,也就是说,你可以对你的资源按照某个标准来排序。如果一个线程先获取 A 锁,然后是 B 锁,但第二个线程先获取 B 锁,会引发死锁。

线程池自己引发的死锁

这里有个与上面不同的死锁例子,它证明了单个线程池使用不当时也会引发死锁。假设你有一个  ExecutorService,和之前一样,按照下面的方式运行。

ExecutorService pool = Executors.newFixedThreadPool(10);
pool.submit(() -> {
    try {
        log.info("First");
        pool.submit(() -> log.info("Second")).get();
        log.info("Third");
    } catch (InterruptedException | ExecutionException e) {
        log.error("Error", e);
    }
});

看起来没什么问题 —— 所有信息按照预期的样子呈现在屏幕上:

INFO [pool-1-thread-1]: First
INFO [pool-1-thread-2]: Second
INFO [pool-1-thread-1]: Third

注意我们用  get() 阻塞线程,在显示“ Third”之前必须等待内部线程( Runnable)运行完成。这是个大坑!等待内部任务完成意味着需要从线程池额外获取一个线程来执行任务。然而,我们已经使用到了一个线程,所以内部任务在获取到第二个线程前将一直阻塞。当前我们的线程池足够大,运行没问题。让我们稍微改变一下代码,将线程池缩减到只有一个线程,另外关键的一点是我们移除  get() 方法:

ExecutorService pool = Executors.newSingleThreadExecutor();
pool.submit(() -> {
    log.info("First");
    pool.submit(() -> log.info("Second"));
    log.info("Third");
});

代码正常运行,只是有些乱:

INFO [pool-1-thread-1]: First
INFO [pool-1-thread-1]: Third
INFO [pool-1-thread-1]: Second

两点需要注意:

  • 所有代码运行在单个线程上(毫无疑问)
  • “Third”信息显示在“Second”之前

顺序的改变完全在预料之内,没有涉及线程间的竞态条件(事实上我们只有一个线程)。仔细分析一下发生了什么:我们向线程池提交了一个新任务(打印“ Second”的任务),但这次我们不需要等待这个任务完成。因为线程池中唯一的线程被打印“ First”和“ Third”的任务占用,所以这个外层任务继续执行,并打印“ Third”。当这个任务完成时,将单个线程释放回线程池,内部任务最终开始执行,并打印“ Second”。那么死锁在哪里?来试试在内部任务里加上  get() 方法:

ExecutorService pool = Executors.newSingleThreadExecutor();
pool.submit(() -> {
    try {
        log.info("First");
        pool.submit(() -> log.info("Second")).get();
        log.info("Third");
    } catch (InterruptedException | ExecutionException e) {
        log.error("Error", e);
    }
});

死锁出现了!我们来一步一步分析:

  • 打印“First”的任务被提交到只有一个线程的线程池
  • 任务开始执行并打印“First”
  • 我们向线程池提交了一个内部任务,来打印“Second”
  • 内部任务进入等待任务队列。没有可用线程因为唯一的线程正在被占用
  • 我们阻塞住并等待内部任务执行结果。不幸的是,我们等待内部任务的同时也在占用着唯一的可用线程
  • get() 方法无限等待,无法获取线程
  • 死锁

这是否意味单线程的线程池是不好的?并不是,相同的问题会在任意大小的线程池中出现,只不过是在高负载情况下才会出现,这维护起来更加困难。你在技术层面上可以使用一个无界线程池,但这样太糟糕了。

Reactor/RxJava

请注意,这类问题也会出现在上层库,比如  Reactor

Scheduler pool = Schedulers.fromExecutor(Executors.newFixedThreadPool(10));
Mono
    .fromRunnable(() -> {
        log.info("First");
        Mono
                .fromRunnable(() -> log.info("Second"))
                .subscribeOn(pool)
                .block();  //VERY, VERY BAD!
        log.info("Third");
    })
    .subscribeOn(pool);

当你部署代码,它似乎可以正常工作,但很不符合编程习惯。根源的问题是相通的,最后一行的  subscribeOn() 表示外层任务( Runnable)请求了线程池( pool)中一个线程,同时,内部任务( Runnable)也试图获取一个线程。如果把基础的线程池换成只包含单个线程的线程池,会发生死锁。对于 RxJava/Reactor 来说,解决方案很简单——用异步操作替代阻塞操作。

Mono
    .fromRunnable(() -> {
        log.info("First");
        log.info("Third");
    })
    .then(Mono
            .fromRunnable(() -> log.info("Second"))
            .subscribeOn(pool))
    .subscribeOn(pool)

防患于未然

并没有彻底避免死锁的方法。试图解决问题的技术手段往往会带来死锁风险,比如共享资源和排它锁。如果无法根治死锁(或死锁并不明显,比如使用线程池),还是试着保证代码质量、监控线程池和避免无限阻塞。我很难想象你情愿无限等待程序运行完成,如同  get() 方法和  block() 方法在没有设定超时时间的情况下执行。

感谢阅读!

相关文章

Spring中@Transactional与读写分离

$
0
0

    本文主要介绍如何使用Spring @Transactional基于JDBC Replication协议便捷的实现数据库的读写分离。 项目环境准备:

    1)Spring 4.x + 环境

    2)mysql connector-j 5.1.38+

    3)tomcat-jdbc-pool连接池

    4)spring @Transaction使用与JDBC Replcation协议。请参考 【replication协议】

 

    核心特性:

    1)所有操作默认请求从库,包括write、read,且无事务开启。

    2)如果期望请求主库,必须使用@Transactional或者使用编程式事务transactionManager(template)等开启事务。

    3)代码分层符合规范,合理设计事务开启的时机和范围。我们尽量将事务开启控制在manager或者dao层。

 

 

一、Spring配置(摘要)

 

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"
default-autowire="byName"><bean id="commonDataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.jdbc.ReplicationDriver"></property><property name="url" value="jdbc:mysql:replication://127.0.0.1:3306,127.0.0.1:4306,127.0.0.1:5306/mydb?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=false&amp;useSSL=false&amp;failOverReadOnly=true&amp;loadBalanceStrategy=random&amp;readFormMasterNoSlaves=true"></property><property name="username" value="test"></property><property name="password" value="test"></property><property name="maxTotal" value="12"></property><property name="maxIdle" value="2"></property><property name="minIdle" value="2"></property><property name="maxWaitMillis" value="30000"></property><property name="defaultAutoCommit" value="true"></property><property name="defaultReadOnly" value="true"></property><!-- 必须为false,否则@transactional中的readOnly将无法正常工作 --></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="commonDataSource" /><property name="configLocation" value="classpath:sqlmap-config.xml"></property><!-- <property name="dataSource" ref="dataSource" /> --></bean><bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="commonDataSource"/></bean><bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"><property name="transactionManager" ref="transactionManager" /><property name="isolationLevelName" value="ISOLATION_READ_COMMITTED"/><property name="timeout" value="30"/></bean><!-- core api,必须为prototype --><bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype"><constructor-arg index="0" ref="sqlSessionFactory" /></bean><!-- 非常重要,否则@transactional将无法生效 --><tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/></beans>
 

 

 

 

    2、TestDao

 

@Component
public class TestDaoImpl extends BaseDao implements TestDao {

    @Override
    public TestDO get(int id) {
        return this.sqlSessionTemplate.selectOne("TestMapper.get",id);
    }

    @Override
    @Transactional(readOnly = false)
    public void update(TestDO test) {
        this.sqlSessionTemplate.update("TestMapper.update",test);
    }

}
 

 

    4、TestManager

 

@Component
public class TestManagerImpl implements TestManager {

    @Autowired
    private TestDao testDao;

    @Autowired
    private Test2Dao test2Dao

    @Override
    public TestDO get(int id) {
        return this.testDao.get(id);
    }
 
    @Override
    @Transactional(readOnly = false)
    public void update(TestDO test) {
        this.testDao.update(test);
        this.test2Dao.insert(test);//事务中执行
    }

}
 

 

二、@Transactional使用

    @Transactional注解配合Spring事务管理器,作用等同于“在方法级别手动开启事务”、“aspectj基于XML在方法级别切入拦截”。

    @Transactional参数列表:

    1)readOnly:限定connection级别read/write特性,默认为false,表示此连接支持读写。如果为true,表示此连接只能进行read操作(如果写操作将会抛出底层错误)。

    2)timeout:如果开启了事务,则事务超时的时长。超时则回滚。默认为-1,永不超时。

    3)propagation:传播级别,默认为REQUIRED,表示read/write操作都需要在事务中执行。如果不希望此操作主动开启新事务,事务由上下文决定,那么可以将此值设置为SUPPORTS,比如一个纯粹的read操作。

 

    @Transactional工作原理:

    1)默认请求将会访问从库,此特性由DataSourcePool中“ defaultReadOnly=true”决定。此时,在不使用@Transactional时和@Transactinal(readOnly=true)时在读写分离效果是一致的。

    2)使用@Transactional时,在进入修饰方法之前,默认开启事务并从DataSourcePool中获取一个connection(然后设置connection的readOnly和autoCommit参数值)。如果当前请求中,为只读操作,则不使用@Transactional。

    不使用@Transactional  <等价于> @Transactional(readOnly=true,propagation=Propagation.SUPPORTS),即不开始事务。但是@Transactional仍然触发获取连接。

    3)如果操作是write或者期望此操作访问主库,则必须显示声明@Transactional。(readOnly参数保持默认,或者设置为false,对于事务传播级别,按需)。

    4)无论如何,最终connection级别的readOnly参数值才是决定replication协议选择“读”、“写”库的最终依据。

 

 

三、@Transactional原理 

     当Spring Bean调用@transactional注释的方法时,将被拦截器拦截且通过反射机制方式执行(注释最终都是由拦截器驱动,参见TransactionInterceptor),且开启事务,如果readOnly为false时将会强制设置autocommit=false,在方法调用结束后,事务被自动提交。

 

    1)Spring基于反射机制拦截@Transactionnal,开启事务(SpringManagedTransaction),并根据@Transactional设定事务的属性,并将此事务TransactionInfo绑定在当前线程。(TransactionInteceptor)

    2)根据DataSource创建链接Connection,并将此链接绑定在当前线程(ConnectionHolder)。(DataSourceTransactionManager.doBegin())

    3)每个sqlSessionTemplate实例内部都有个代理实例sqlSessionProxy,即通过sqlSessionTemplate执行的方法均由此代理实例执行;在执行操作之前,首先获取sqlSession实例,并将sqlSession绑定在当前线程(SqlSessionHolder,ThreadLocal)。

    4)ibatis中使用此sqlSession执行数据库操作,sqlSession执行操作所使用的链接是从ConnectionHolder获取的。(DefaultSqlSession,SpringManagedTransaction)

    5)如果@Transactional方法中有多个dao层方法调用,则继续循环3)~5),此过程中,所有的方法均公用一个sqlSession实例。

    6)和1)对应,将TransactionInfo从当前线程解绑,并提交事务。

    7)和3)对应,将SqlSessionHolder从当前线程解绑,并关闭sqlSession。

    8)与2)对应,将ConnectionHolder从当前线程中解绑,并将Connection释放到连接池中。

 

    每调用一个@Transactional方法,都会按照上述过程执行;即如果你一个方法中调用了多个@Transactional方法,这意味着它们在不同的事务中执行、使用不同的sqlSession实例、可能使用不同的Connection。

 

    对于使用transactionTemplate方式手动开启事务的,过程稍微有些不同,在内部类doTransaction方法调用之前,将由spring创建事务、准备connection等与上述保持一致,并在方法执行后提交事务(如果抛出异常在rollback);doInTransaction中所调用的方法上的@Transactional将被忽略,所有的dao层方法均使用同一个sqlSession和Connection实例。

 



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



360周鸿祎:IOT时代的信息安全 六挑战三原则

$
0
0

360周鸿祎:IOT时代的信息安全 六挑战三原则

 

    



    前一段时间我干了很多和安全关系不大的事情,看到了很多传统行业的老大如何患上“互联网焦虑症”,他们害怕互联网成为传统价值的毁灭者,其实这些是对于互联网的一些误解,所以我还写了一本书,讲我的互联网方法论。

很多人问我互联网思维是什么?如果用一个词总结是什么?我想了想是在过去的20年里互联网最大的力量就是实现了“网聚人的力量”,互联网把我们很多人连接起来。

在互联网第一代的时候是PC互联网,我们每个人的电脑连接起来,这时候安全问题还OK,当时的防病毒和查杀流氓软件,以及我们很多边界和防火墙的防御技术;但到了互联网的新阶段,我们每个人都用手机了,今天手机已经变成我们每个人手上的一个器官,我们每个人有一种新的病,几分钟不看手机就觉得心里很失落,手机变成了一个新的连接点。手机打破了我们原来对边界的定义,手机更多和我们的个人隐私信息联接在一起,所以,安全的问题变得更加严重。

有一个好消息,也是一个坏消息,手机互联网之后,下一个五到十年我们的互联网将会往何处去?

其实我觉得一个最重要的时代可能要开始那就是IoT——Internet of Things,万物互联。

美国的硅谷现在非常流行IoT这个词,Internet of Things,我早些时候提出来有些人质疑是“物联网”的翻版,但是我认为并不是。物联网被翻译成传感器网络,而IoT网络是万物互联的。

    来IoT时代,所有设备都将内置一个智能芯片和智能OS,所有设备都能通过各种网络协议进行通信,而且是7 x 24小时的相连,能够产生真正海量的大数据;并且,伴随大数据应用的逐步升级,也会让机器变得更加智能,甚至具备自己的意识。我认为,IOT时代的信息安全其实也是大数据的安全问题,而且至少要面临六方面的挑战。

 

首先,当所有的设备都变成智能化,都接入网络以后,边界的概念将会进一步被削弱,也就是说接入点越多,可以被攻破的这种可能的入口就会越多。过去,我们很信奉“隔离”、“切断”,我们可以把电脑放在一个屋子里,我们可以把一个网络进行隔离,但今天你会发现越来越多的不起眼设备都支持Wi-Fi和蓝牙,这里面有太多可以被别人攻击的接入点,而且攻击点越多,对防守的挑战就会越大。

 

第二,未来企业都将成为互联网企业,企业信息安全面临更大的挑战。过去我们很多企业可能不太重视企业的安全,我们很多时候买防火墙是为了合规,是上级要求和行业要求。过去我们企业的发展,可能把自己割裂在一个安全的孤岛上,但你要变成互联网企业之后,你不可避免要把自己的核心业务系统接入到互联网上。

但当所有的企业都变成互联网企业之后,企业安全一定要提高到一个更重要的优先级上,也就是说当你的服务器或你的网络被攻破之后,可能不意味着仅仅是你内部数据的泄露,可能意味着用户数据的灾难。

 

第三个问题,大数据污染。就是大数据中如果被人为加入了各种无效、错误的数据,人为操作和注入修改虚假信息,在数据传输存储过程中出现了问题,那么根据大数据所做的一切行业指导和趋势分析,都可能面临灾难性的后果。

 

第四,智能设备IoT被控制之后的灾难,这种危害或者会比电脑手机更大。

    过去大家都记得,你的电脑中毒了、有问题了,大家最多觉得“今天给老板交的报告写不出来了”,所以我电脑中毒了经常成为工作完不成的一个借口。机出问题了呢,无非你们看到最近多了很多“艳照”,不小心照片上传了;然今天手机和支付系统连在一起,可能当你的通信录被盗用了,就会收到一些诈骗短信。包括前面讲到的那个木马之所以会得逞,就是因为它盗用了你的通信录的地址本,熟人发来的短信,大家都会连接。

    但IoT是可被控制的,不是一个单纯的网络,这个被控制了带来的风险就大了。

    前段时间中国人崇拜完乔布斯之后,因为中国的假乔布斯太多了,他们又开始崇拜美国另外一个人,号称钢铁侠,他造了一部汽车叫做特斯拉,他上次来中国的时候,我有幸和他们大家一起吃了晚餐。我问了一个他很恼怒的问题,我说你的汽车会被人骇客吗?他说不会,我们所有的应用都是自己写的,我们不会安装任何第三方应用,所以不会有任何问题。我就提了两个问题,第一个你的汽车是有Wi-Fi和蓝牙,我可能骇客不了你的汽车,但你用手机接入的话,我可以骇客你的手机,我一样可以通过手机骇客这个汽车。自然你是一个智能汽车,它就像一个大手机一样,一定要和云端通信,所以如果有人下发了你的通信协议或者破解了你的云端的网络,我一样可以控制你的汽车。

    我们后来在全国征得了很多有识之士,有人成功破解了对特斯拉的协议,成功实现了对汽车的控制。所以,中国汽车厂要生产智能汽车,我给他们说最重要的不是边开汽车边看互联网影视,最重要的是老百姓敢不敢开你的车,如果半路上突然死机了,突然蓝屏了,突然弹出一个大窗口说你必须下载一个什么玩意儿,这样的汽车不会有人开的,一旦出现问题就会非常的严重。

 

第五个问题,当大数据产生了人工智能之后,很可能人类技术发展会到达一个新的“奇点”。

    比如说以后的机器人和智能汽车,我有一个断言,它未必是由这个设备里的智能系统单独做智能判断,它一定是和云端一个更大的智能系统相连。

    比如真正的智能驾驶,你何止需要这一部汽车的数据才能做判断,可能需要路边很多传感器和很多其他汽车发来的信息,你需要在云端进行高速的分析,再反馈过去。所以,将来有一天可能不仅仅是这台车上的电脑在指挥,很有可能是云端的一个机器在指挥。

    因此,各种各样无论是专用机器人还是通用机器人,在几年以后也会越来越普及,都会和互联网相连,甚至它们再反过来对各种设备进行反向控制。

    这样,当真正云端安全出现问题以后,机器智能带来的转换,这是我们下一个五到十年必须要考虑的问题。

 

第六个问题,也是最重要的一个挑战就是对用户隐私的挑战。

    如果说IOT时代,各种传感器让每个人的数据维度更加丰富了,而且产生的数据都记录在云端,所以IOT时代的大数据下每个人都是透明的,一旦出现泄露后果也是极其严重的。

    而且值得深思的是,在对用户隐私信息的保护,现行的法律和规则的制定都是落后的,有很多问题是不清楚的,怎样在这种情况下更好的去保护我们个人的隐私?除非不用任何先进设备、不接入网络,否则用户的个人隐私信息永远都是安全挑战。

    就像前几天我看到美国有一家公司,只要给他的试管吐一口吐沫,就可以免费测出用户的基因组。未来基因的检测的成本会更低,而这样的公司他直接拿到了用户的最隐秘数据——基因。

       所以说,IOT时代可以是某些企业的黄金时代,但同样对信息安全的保护却变得无比脆弱。对于这六个方面的挑战,有些已经在发生,有些是即将发生。在此, 我也提出一个新的想法,在大数据时代,如何保护用户信息的三原则。

 

第一,数据应该是用户的资产,这是必须明确的。虽然未来将有大量的信息存在互联网服务商的服务器上,但是用户数据的所有权必须明确,所有数据与信息都是属于用户的个人资产。

第二,任何企业都需要把收集到的用户数据进行安全存储和安全的传输,这是企业的责任和义务。

不仅仅是提供互联网服务的公司,包括所有暂时存储着用户数据的想做互联网业务的公司,都要提高公司安全能力,都要有加强安全防护水平的责任和义务;既然你们要收集用户数据,就必须解决传输、存储的基本安全问题。

第三,用户信息的使用,一定要保障用户的知情权和选择权,平等交换、授权使用。

存有用户数据的企业,在使用这些数据之前,一定要遵循平等交换,授权使用的原则,不能未经许可采集和滥用。更重要的是,要保障用户说“不”的权力:还有很多用户可以选择,当不需要某项服务时,可以把它关掉,可以拒绝采集数据,用户一定要有这种选择权。

    不论是现在,还是未来,这些数据在未经用户授权的情况下进行了交易牟利,这不仅要被视作不道德的行为,更应该视为是非法的。

    所以有了这三原则,在我们进入IoT时代时,我们才能让用户对下一代互联网感觉更放心,才能更好的使用。

    只有安全的互联网才有美好的互联网,所以在互联网上最重要的就是安全第一。


 

工信部:我国移动基站总数近640万个 3G/4G基站占比75%

$
0
0

根据工信部发布的《2018年9月份通信业经济运行情况》显示,截至9月末,我国移动通信基站达639万个,其中3G/4G基站总数达到479万个,占比达74.9%。数据还显示,我国互联网宽带接入端口数量达8.58亿个,同比增长12.6%。基础电信企业继续加快“光进铜退”进程,光纤接入(FTTH/0)端口达到7.47亿个。xDSL端口总数下降至1822万个。

2016年9月末-2018年9月末互联网宽带接入端口数发展情况

2016年9月末-2018年9月末移动电话基站数发展情况

另据报告,前三季度,我国新建光缆线路350万公里,光缆线路总长度达到4130万公里,同比增长14.5%。接入网光缆、本地网中继光缆和长途光缆线路所占比重分别为65.9%、31.5%和2.6%。


一份完整App运营推广计划方案 - 简书

$
0
0


一、App运营推广概念


引用百度百科的概念:对运营过程的计划、组织、实施和控制,是与产品生产和服务创造密切相关的各项管理工作的总称。从另一个角度来讲,运营管理也可以指为对生产和提供公司主要的产品和服务的系统进行设计、运行、评价和改进的管理工作。细细思考下,其实,APP运营推广无非是产品想盈利模式,而运营去实践盈利模式。

任何运营都围绕“用户”展开,包括“吸引用户”和“留住用户”,说白了就是:让用户过来,并留下。

运营的三个阶段:吸引用户、把用户留住、让用户掏钱。

运营三大核心目标:扩大用户群、寻找合适的盈利模式以增加收入、提高用户活跃度。

我们把运营的分工和种类进行细分,运营可以分为:

1.基础运营: 维护产品正常运作的最日常最普通的工作。

2.用户运营: 负责用户的维护,扩大用户数量提升用户活跃度。对于部分核心用户的沟通和运营,有利于通过他们进行活动的预热推广,也可从他们那得到第一手的调研数据和用户反馈。

3.内容运营: 对产品的内容进行指导、推荐、整合和推广。给活动运营等其他同事提供素材等。

4.活动运营: 针对需求和目标策划活动,通过数据分析来监控活动效果适当调整活动,从而达到提升KPI,实现对产品的推广运营作用。

5.渠道运营: 通过商务合作、产品合作、渠道合作等方式,对产品进行推广输出。通过市场活动、媒介推广、社会化媒体营销等方式对产品进行推广传播。

二、App产品运营推广要做哪些事情?


前期的准备工作:

1.保证产品能正常运行。

2.明确产品定位和目标。

3.选择合适的推广渠道和方式,协调内外部的资源并制定详细的计划。

4.确定团队分工并执行。

上线初期的工作:

1.保障产品的正常使用

2.根据运营状况,阶段性的跳转优化产品

3.上线初期的推广策略(请见 CP干货:如何选择推广渠道与推广的技巧)

后期的日常工作:

1.产品的更新

2.内容运营

3.活动策划

4.用户运营

5.数据分析

6.意见反馈

如何为你的App定制合适的推广渠道和方式?

第一考虑:产品定位 第二考虑:目标群体习惯和属性 第三考虑:公司资源

三、运营推广过程中需要重点关注哪些数据指标


在APP运营推广过程中哪些数据指标可以更好的指导我们工作呢?下载量 、用户数、留存率、转化率、活跃用户数、活跃时长、付费率是很多公司作为数据指标的一个考核,也是改进优化工作的一个依据。

当然,产品阶段的不同,我们关注的数据指标肯定不同。例如APP初期,我们更加关注下载量和用户数。之后,我们又会比较关注活跃用户、留存率、转化率等等的数据。所以,运营阶段的不同,我们所关注数据的侧重点也会有所不同。

目前,市场上的APP数据统计分析工具比较多,比较出名的有:友盟、百度统计、谷歌统计、talkingdata等

相关数据指标分析:

1、留存用户和留存率:

留存用户和留存率通常反映了不同时期获得的用户流失的情况,分析这个结果往往是为了找到用户流失的具体原因。

APP获得一定用户以后,刚开始用户会比较多,随着时间的推移会不断有用户流失,留存率随时间推移逐步下降,一般在3~5个月后达到稳定。其中阅读资讯、社交沟通、系统工具是留存率最高的三类应用,在4个月以后的留存率稳定在10%左右。 留存率提高了,才会有更多的用户留下来,真正使用APP的用户才会越来越多。

次日留存:因为都是新用户,所以结合产品的新手引导设计和新用户转化路径来分析用户的流失原因,通过不断的修改和调整来降低用户流失,提升次日留存率,通常这个数字如果达到了40%就表示产品非常优秀了。

周留存:在这个时间段里,用户通常会经历一个完整的使用和体验周期,如果在这个阶段用户能够留下来,就有可能成为忠诚度较高的用户。

渠道留存:因为渠道来源不一,用户质量也会有差别,所以有必要针对渠道用户进行留存率分析。而且排除用户差别的因素以后,再去比较次日,周留存,可以更准确的判断产品上的问题。

2、活跃用户

用户每天既会不断新增,也会不断流失,如果单独只看每日活跃用户数,是很难发现问题的本质的,所以通常会结合活跃率和整个APP的生命周期来看。活跃率是指活跃用户/总用户,通过这个比值可以了解你的用户的整体活跃度,但随着时间周期的加长,用户活跃率总是在逐渐下降的,所以经过一个长生命周期(3个月或半年)的沉淀,用户的活跃率还能稳定保持到5%-10%,则是一个非常好的用户活跃的表现,当然也不能完全套用,得视产品特点来看。

3、付费率

指一个app付费用户相对总用户的占比。即充值人数/注册人数 *100%

注册用户付费率 = 总注册 / APA

平均在线付费率 = ACU / APA

活跃用户付费率 = UV / APA

总结:

一个好的运营首先要从产品出发,要明确产品的定位,其次是明确用户群的定位。接下来才是进行推广,经过合理对推广运营从而达到留住用户的目的。最后通过数据统计以印证自己推广是切实有效的。正如上面所说的任何运营都围绕“用户”展开,最终目的就是让用户留下来;

一个App从开始运营到结束,要做的事情:


1.APP运营阶段

2.APP定位

2.1 定义APP所属关键词

2.2 组织对会员(厂家企业)有价值的内容或是服务

2.3APP会员(厂家)卖点

3.APP启动(2014年10月-2014年11月)

3.1人员配制

3.2收集潜在会员、厂家资料

3.3进行线下的推广营销

3.4 APP编辑的工作

4.团队建设(1-2个月)

5. App推广(从产品正式版开始,大规模推广从A轮融资开始)

5.1行业APP广告交换

5.3产品关建词竞价排名

5.4行业网站广告直投

5.5软文宣传

5.6长尾关键词优化

5.7效果分析,经验总结

5.8流量分析

6.APP盈利(A轮到B轮要开始考虑盈利)

6.1 通知组织活动来搞人气

6.2 通过会员费或是增值服务

6.3 展会服务、广告代理

6.4 B2B

6.5 APP广告

7. 执行计划表

8. 软文推广说明

8.1 软文推广的作用

8.2 软文写作参考标准

一)、标题

二)、主题

三)、内容

9. 论坛推广说明

9.1 何为论坛推广

9.2 论坛推广的效用

9.3论坛营销推广四步

10.网络广告说明

10.1 网络广告概述

10.2 网络广告媒体选择策略

10.3 媒体选择范围

10.4 广告形式确定策略

11. EDM营销推广说明

11.1 邮件营销的优势分析

11.2  APP邮件的注意事项

12.APP收费标准

总则:结合自身优势资源,一切以吸引行业相关企业作为行网会员为目的。

APP运营阶段


APP定位->APP启动–>APP宣传->APP建设 ->APP赢利

APP定位

1 定义APP所属关键词

跟行业相关,跟产品相关的,写出10个以上(例如:上游产业、下游产业等),长尾关键词跟以后编辑文章以及做SEO优化、ASO优化、线上广告推广有密切关系,同时需要考虑主营业务、APP内容、以及受众、和搜索量。关键是尽可能多的写出多一些,到时可以做一些筛选。

2 组织对会员(厂家企业)有价值的内容或是服务

选出方向和卖点:每一个APP都有主要的运营方向和定位。前期不建议定太多的方向和服务,以防以后精力受限做不好等于不做。所以建议前期先择一到二个服务方去做,内容的话如果有精力和资源可以都放一些,如果没有精力的话也是选突破一到二个方向。前期也可以做一些了解,那些目标会员或是客户希望得到哪些资料和内容,针对性去做这样会好一点。

3 APP会员(厂家)卖点

这是核心问题,把之前的事情做完了,就需要把特产行业了解一下,把那些优势和卖点形成书面资料或是广告资料或是电话脚本。这样子就可以去做下一步的事情了。

APP启动


1.人员配制

(一名编辑)编辑要求:经常上APP,会使用Office,会对HTML进行排版编辑,有一定的互联网经验,有一定的文笔。

编辑:主要负责APP内容维护及线上推广工作;

2.收集潜在会员、厂家资料

收集行业相关的企业(配套行业、行业、)等资料:

1.(客户资料,包括但不限于邮箱、电话、传真、具体地位)

2.通过线下关系收集

3.通过阿里巴巴企业库

4.通过搜索引擎

5.收集邮件是有专门的,可以让它不断在网上找,然后收集起来。

6.通过腾讯qq空间,微信,微博,客户端等超大流量社交网站进行资料采集。

3.进行线下的推广营销

前期主要是吸引厂家加盟,这时需要列出所以针对厂家加盟的卖点,然后进行会员广告的销售!最好是写出电话营销脚本或是宣传单页。

a)先将有一定关系的厂家或是经销商拉进来,然后通过客服人员进行线上或是线下营销将大量相关厂家拉进来。因为厂家是免费加盟的,可以尽可能多的拉一些,对于重点厂家可以赠送一些门户广告位。

b)主要是吸引会员加盟,前期可以是免费的,主要将一些网站会员的卖点价值提高一下,对潜在客户进行宣传,方式可以有:电话、传真,Email,纸制宣传单信件手段来做,同时统计一下每一种宣传效果,选出一种最有效的宣专方式,然后就可以大量以这种方式去操作,给客服人员每日做出量化考核。评估工作效率。

4.APP编辑的工作

1)围绕APP关键词收集相关,或是从线下渠道收集资料发布在行业网站上,要注意突出关键词以及产品。

2)互联网一直是以内容为王,如何吸引用户还是以优秀的内容为主,所以尽可能的能发布一些实用的,有价值的行业文章。保持更新,每天每个栏目都能得到新发布的文章。

3)关键词优化,尽可在内文能突出关键词,做好锚点

团队建设


在原有基本上添加一名客服和项目经理;

分工明确,责权落实

人员考评,尽可能的科学,公平,合理

根据业务需要增配人员,工作量加大时需要及时补充人员

提升相关人员的专业知识,业务能力,人员素质

有长远的人员规划以及激励方案

APP推广


1.行业网站广告交换

当APP有一定的流量时,可以找一些相同规模的同行APP交换广告,即在你的APP上做对方的广告,在对方APP上做你的广告。这样可以不用花钱即可得到一定的广告效果。

2.产品关建词竞价排名(SEM)

你可以有效控制预算来做广告。

3.行业APP广告直投

找出一些有流量,有影响力的相关行业网或是相关网站,在他们网站上直接投放广告。

4.软文宣传

让专业写手为APP一到三篇专业软文,同时发布到专业到APP上。

5.长尾关键词优化(网站SEO)

根据APP的定位列出尽可能多的长尾关键词,这些关键词必须跟APP的方向、产品或是服务相关,相结合,然后我们可以针对这些关键词做一些SEO优化。

通过关系网直接或是间接宣传行业门户

群发、定阅、报纸等手段

专业杂志报刊广告

6.效果分析,经验总结

对活动效果进行跟踪,统计做出一些数据分析,总归一些经验。

对活动的宣传效果进行分析统计(主要依靠流量统计)

对于参与厂家进行回访了解情况

对于不足之外需要讨论如查改进

7.流量分析

流量分析可以让你知道你的客户从哪里来,关心什么内容等,对APP运营是一个很好的数据参考。我们主要可以分析以下数据:

a.每天的关注数据,它代表着来你APP的独立用户和点击量,关注数据可以理解成为每个用户到APP的翻看量,而翻看量越大,说明APP的吸引力越大,也就是粘性强。如果这个值小于4那就要注意内容建设了。

b.来路流量:可以看看客户从哪些平台点过来,哪些平台的链接比较有效果。这里同时也经常被用做广告效果分析,看一看投放哪种广告的效果比较好一些。对于些来没有什么来流的广告,就可以考虑撤消了。

c.搜索引擎:可以看看对哪些搜索引擎的优化效果好。

d.关键词:看看用户关心什么,以及哪些关键词优化做得好。

e.查看/浏览页面:看看用户看得最多的页面是哪个?这里是不是可以挖掘些有用的价值。因为有些页面流量是有时效性的,当时间过了,流量也降下去了,可以让你抓住在流量高的时候抓住商机。

f.入口页,这些页面经常是被直链或是优化做得比较理想的页面,可以学习或是在这些入口页面上做一些营销上的事情。

g.根据流量数据,我们可以对推广方式以及APP内容做一定的调整。

等APP的人气和知名度上来以后,我们可以偿试提供一些收费服务。

8.信息流广告

一是社交信息流,社交信息流包括腾讯广点通;在腾讯的QQ空间和微信里展现的一些广告,但微信公众号文章底部的不算信息流。你在QQ空间里面看到的广告就是信息流广告,QQ空间里面信息流展现的位置和友好度都是很好的,所以说广告好不好看广告展现的方式。还有新浪粉丝通,在新浪微博里面和QQ空间是类似的。陌陌也推出了自己的信息平台陌陌信息流。还有比较传统的天涯,可能有很多90后不知道天涯,在传统PC时代天涯基本上有一段时间就是社交的代名词,相当于现在的微博微信,而天涯的群体年龄基本上在30岁-50岁之间。

二是新闻信息流里,有腾讯智慧推,新浪扶翼、今日头条、UC,UC给人印象比较深的是浏览器,经过最近改版之后已经变成了一个浏览器+新闻头条的产品。UC在移动端的用户量相当大,前4个是目前在市场上量比较大的。

网站盈利


APP的赢利有多种方式方法,但是需要找到适合自己的那一种,当APP人气上去以后,其实APP的赢利是水到渠成之事。下面有几个方面可以去考虑。

1 通知组织活动来搞人气

活动本身就是可以赢利的项目,如果操作得好,活动可以成为APP的一道招牌菜,在全国各地全面开花,光是这些,估计都可以赚不少钱。而且可以将APP分支不断延伸,公司影响力不断提升。而且这样一来,APP人气就可以有效得到提升。

2 通过会员费或是增值服务

会员本身也是赚钱的项目,只要能提供会员们感兴趣的内容或是服务,让他们在其中可以获利,那么从他们那里收取少部份的服务费是非常容易,当会员数据成长到一定程序,赢利变得很自然而稳定的事情了。以后我们还可以想出一些个性化的增值服务来进一步提升APP赢利能力

3 展会服务、广告代理

由于APP自已的活动举办的好,可以光以这个项目为线下企业组织各种活动,或是展会,或是以APP名义在做展位和宣传,相信可以帮助到线下成员企业。同时广告代理也是可以操作的,在前期在一些专业性网站或是媒体投放广告,积累一定的操作经验以后,以网站名义可以帮助线下会员企业做一些广告宣传的项目。

4 B2B

直接通过APP卖产品,不管是卖谁的,赚钱方式是直接的,关键是APP需要有一定的人气和知名度。

5 APP广告

APP如果能达到一定的知名度和公信力,APP广告应该是最容易操作的一个赢利项目了。这时候,应该对APP广告位进行一些规化,排版。对每一个广告位的广告效果进行一些测试,然后定出每一个广告的报价。广告位在空余的时候尽可能做一些自己的广告或是公益性的广告,不要让它空着。但是仍然需要做出一个广告报价页面,以及说明那些广告位是可以投放的说明。前期广告位可以以赠送、配送等方式先放上去,后来可以先以低价方式做一些尝试,如果APP人气上来了,知度度上来了,APP上的广告更多是一种知名度,实力,形象的宣传了,这时候价格就可以提上来了。

软文推广说明


软文营销推广是中小企业现阶段赖以发展和对外推广的最优选择,通过软文推广能够带动企业销量的快速增长。通过软文营销推广创建的是企业品牌价值,这样带来的客户比一般推广方式更有黏性,如果你的产品或服务很好,通过客户的口碑传播还会带来更多销量。

A. 软文推广的作用

软文推广是硬广告的有效补充

软文是以引导性的思想传达,润物无声地将产品信息灌输到消费者的头脑中。以目标受众容易接受的方式切入消费者内心,并在消费者经常密集的地方进行软文教育,打动消费者,最终促进消费行为的一种“软”营销。软文营销的成本远低于硬性广告,但综合效果与性价比却远高于硬性广告。进行企业宣传和推广时,如果软文推广与硬广形成有效互补,往往能够起到更好的宣传效果。王老吉、必胜客等便是非常好的例证。

软文推广在抢占消费者心理方面独具优势

软文是抢占消费者心理的最佳途径。原因是,软文形成之前必定是经过不断分析、调研、研究消费者的需求特征,根据需求提炼产品或者服务的核心价值和卖点,寻求切入点,将产品、服务信息更巧妙地植入文章中,这样的软文才能更好的发挥销售优势,带动消费者的消费行为。

创口碑,树品牌

在互联网时代,口碑的作用越来越明显。当人们对铺天盖地的APP广告熟视无睹,审美疲劳时,通过口碑传播在一定程度上会降低消费者对漫天广告的不适感。好的软文不仅吸引消费者浏览和阅读,甚至可以在不知不觉中广泛传播,从而形成巨大的口碑效应。随着数字技术和网络传播的演进,网络中的邮件、聊天室、论坛、网站、博客等一方面加快了口碑传播的速度,另一方面消费者有目的地搜索,有很强的针对性,既避免了不可预期的时效障碍,又使口碑传播有了质的飞跃。

软文能带动群体效应,便于打开市场

如果APP用户在一个地方看到企业的相关报道,在不知不觉很多地方都看到同样的相关报道,包括服务、产品、企业文化、市场流行等各方面的报道。众口铄金,消费者想不相信都很难,自然留下了深刻印象,这样就形成了群体效应,在积累大量消费群体同时,也打开了销售的大市场。

B. 软文写作参考标准

一)、标题

软文的标题要紧贴主题,突出核心内容和表达意图,要具体不要抽象,要简洁不要繁杂。以下总结了几种比较引人注目的标题形式:

1、热门关键词式标题

用热门关键词造势的软文标题,直接点明文章内容的中心。例如:“阿里巴巴集团宣布将口碑网资产注入淘宝网”、“全新百度统计系统福尔摩斯正式推出”等等。

2、数字式标题

在标题里加入一些匪夷所思的数字容易引起别人的注意。例如:“100篇2014年最流行的软文模板”,“揭密你为何不能网络赚钱的10大原因”等等。

3、经验分享式标题

别人的成功经验很容易引起人们的关注和学习。一般以如何、怎么样、浅淡、揭密、秘决、经验、忠告、某某方法技巧等开头或结尾的文章。例如:“教你如何选择价廉物美的****产品”。

4、借用名人、名站效应

例如“奥巴马访华衣着有技巧” 行业精英、政要富商、体育明星、网络热门人物都是人们炒作的重要对象。

5、提问式标题

通过提出问题来引起关注,从而使消费者发生兴趣,启发他们思考,产生共鸣,留下印象。例如:“京东为何越亏越不怕?”

二)、主题

写文章一定要有中心,要有主题。选好切入点,把需要宣传的网站、产品、服务、企业形象等信息嵌入到文章内容中。一个好的切入点才能让整篇软文看起来浑然一体,把软性广告做到极致,宣传效果才会出来。

三)、内容

逻辑性强

文章内容条理清晰、一目了然,紧扣标题进行表述。层级要分明,段落要清晰,重点要突出。文章正文要从不同方面反映主题,可以采取添写小标题的方式,分段叙述,这样才能使文章有条有理,脉络清晰。

真实性

软文最忌漫无目的的混乱编写。有号召力的软文,语气措词必须礼貌,既要使人感到亲切,又要迎合消费者的心理。口气平和的广告往往易于被消费者接受。

不要硬性植入广告

软文最好的方式是把宣传的意思自然融入到文章中,硬性植入网址和链接只会让消费者更反感。插入文章里的链接,一定要选择一个过渡的句子进行协调,不要太直白地插入网站链接。

论坛推广说明


1、何为论坛推广

论坛推广就是企业利用论坛这种网络交流的行网,通过文字、图片、视频等方式发布企业产品和服务的信息,从而让目标客户更深刻地了解企业的产品和服务。最终达到宣传企业品牌、加深市场认知度的网络营销活动。

成功的论坛推广如同核裂变的源泉,数以亿计的网民在论坛上自由发表个人观点、看法,而民众言论组成的浪潮通过网络往往可以产生类似病毒传播、 甚至山洪涌泄的效果,因此论坛被认为是 “营销新媒体”,具有极强的低投入高产出的营销优势。

2 论坛推广的效用

l用论坛推广的是商品,它能引导销售。在论坛推广的时候要根据商品的特性选择论坛进行推广,这样目标群体就会精准很多,也就会提高销售量;

l如果帖子够吸引人,能快速给网站带来较大的流量和访问量;

l论坛互动性强,通过论坛传播,可提高企业曝光率,提高网民对产品和企业的认知度;

l论坛都是按照主题分类,产品与用户定位明确,因而在相对应论坛开展推广可提高营销效率与转化率。

3.论坛营销推广四步

第一步:客户分析

怎样不露痕迹地抓住手机用户的心是论坛营销的关键所在。企业在进行论坛推广之前,首先要进行目标客户分析,要研究客户属性,了解目标客户经常去哪些论坛、 对哪些主题比较感兴趣。企业只有从客户的角度出发进行主题策划和论坛选择,通过论坛跟客户互动才能有的放矢。

第二步:提炼传播点

卖点不等于有效传播点,产品的优势或卖点不一定可以通过论坛很好地传递。例如某款笔记本的卖点是外形时尚,但如果仅将“外形时尚”作为传播话题组织论坛软文,恐怕不会有多少关注。有效传播点其实就是论坛的噱头,有噱头的帖子被搜索引擎收录以后点击量会非常大。凡是标题中带有 “现场”、“震惊”、“最牛”、“惊爆”等词的帖子,会首先吸引网友的眼球,而 “草根”、“原创( YC)”、“实录”都是他们最喜欢的一类帖子。

第三步:创造话题

针对目前社会或APP流行热门的话题,在论坛组织专题讨论,并组织人力、物力进行文章的整理和发布,形成某个热门话题的关键讨论地,那么搜索引擎有可能会认为你的网页很有价值,搜索排位自然也会靠前了。

一、以生活为题材,如生活奇闻逸事、亲情关系;

二、以明星、 关键人物为题材,切入点可大可小;

三、以新闻和社会热点为题材。如房价波动、金融危机、企业过冬等皆可,也可利用新产品试用或礼品赠送等方式激励APP用户参与。

第四步:选择阵地

在选择论坛的时候,应该关注该论坛的人气和流量,也就是论坛的权重,比如天涯论坛,百度贴吧都是很不错的发帖站点。不同的论坛各有其特点,需要了解其规则和营销底线。权盈根据客户网站的特点和推广需求,选择推广的精准目标论坛和板块。具体资源列表参见“附五:论坛行网列表”。

网络广告


1.网络广告概述

网络广告就是利用网站上的广告横幅、文本链接、多媒体的方法,在互联网刊登或发布广告,通过网络传递到互联网用户的一种广告运作方式。网络广告以其价格便宜、统计准确、互动交流、跨越时空、图形生动等特点,正以迅雷不及掩耳之势,渗透到现代生活的各个方面,展示出魅力无穷的网上商机。

目前网络广告的市场正在以惊人的速度增长,网络广告发挥的效用越来越重要,已成为继传统四大媒体(电视、广播、报纸、杂志)之后的第五大媒体。

2.网络广告媒体选择策略

所谓网络广告媒体选择就是对你所要发布信息站点的确定,甚至包括具体页面位置的确定。不同的站点有不同的受众对象,所以媒体的选择对网络广告的最终效果影响很大。

广告媒体选择策略:

Ø具有较高的目标受众比例;

Ø具有较高的品牌知名度,形成品牌互补;

Ø广告表现可承载性;

Ø广告效果的可监控性;

3. 媒体选择范围

a、综合门户网站的相关频道,利用综合性网站的大流量优势,在短时间内提高品牌知名度和产品知晓度;

b、社区网站,利用这些颇受社区人员欢迎SNS网站的受众集中特征,辅以高频次的广告播放,极有针对性的向精确目标受众传递广告信息,有效地提高了广告到达率;

c、各大论坛,这是网民发表自己意见的主要行网,在社区上很容易形成对某个产品或企业评论的较强“声音”,从而对消费者的消费选择产生导向作用。

4. 广告形式确定策略

网络广告具体形式有新闻组式广告、条幅广告、游戏式广告、背景品牌式广告、交流式广告、弹出式广告、旗帜广告等。网络广告形式多种多样,每一种形式都有其各自的特点和长处,因此选择恰当的广告形式对吸引网络浏览者、提高浏览率,树立企业及产品形象、建立声誉,促使潜在顾客购买起着重要作用。

l根据广告目标选择网络广告的形式。如果企业的广告目标是品牌推广,可以选用旗帜广告、按钮广告等形式;如果企业广告目标是树立企业形象和产品声誉,要选用微型网站广告和主页型广告;如果企业广告目标是商品促销,选择游动式广告。

l根据广告对象选择网络广告形式。如果广告对象是以年青人为主,可选用互动性较强的游戏互动式广告;如果是企业的忠诚客户,则选用制作屏幕保护程序广告或墙纸广告。

l根据广告费用预算选择网络广告形式。如果预算充裕,可选用丰富媒体广告,预算紧张,选用文字链接式广告。

l根据竞争对手情况选择网络广形式。通常竞争对手采用什么形式的网络广告,企业也应采用相应形式的广告,并且最好还要有所创新,这样才富有新意和吸引力。

EDM营销推广说明


一、邮件营销的优势分析

最近几年是邮件营销(EDM)市场爆发的序曲阶段,邮箱普及和EDM的自身优势,成为EDM市场被看好的主要原因。来自第三方调查机构的数据显示,个人邮箱数在2010年达到5亿,而全球企业邮箱数也达到5.7亿。范围广、成本低、效率高、精准度高,这些优势使得邮件营销成为网络营销手段中最常用、最实用的方法。

邮件群发可以在短时间内把您的产品信息投放到海量的客户邮件地址内。让您的企业品牌名扬中外,让您订单倍增且零成本、高效率,使企业在竞争激烈的市场中占尽先机!

1、 Email营销的成本优势

Email营销最重要的特点就在于成本低廉而效果显著。

2、Email营销可获得连续推销的机会

Email营销可以让企业与客户保持常效联系,公司一旦有新产品,就可以通过邮件的方式进行宣传。而且邮件具有直效针对性,针对不同消费群体,发送不同的营销收件,针对性强,效果也就更佳!这比任何一种方式都简单和划算。如果用户是因为某个关键词来到你的网站,有可能浏览几下就走了,并且不会再来,也不会记得你网址是什么,这样就白白损失了一个潜在的用户。如果用户来到你的网站,你通过一些礼品券或者书之类的礼物送给他,前提是让他注册邮件,那么他会很愿意。

3、建立稳定的客户关系

与一般的产品(或服务)促销手段不同,Email营销在实现促销职能的同时,能够明显促进与顾客的关系。以常用的刊物为例,有研究表明,网站上提供的刊物比网站本身的营销效果更好,这其中的重要原因在于刊物和用户之间不仅仅是单向的信息传递,同时也在网站和用户之间建立起一个互相交流的渠道。通过刊物直接将信息发送到用户的邮箱中,会产生用户和网站长期互动的关系。

4、满足用户个性化需求

Email营销可以为用户提供个性化的服务信息,用户可以根据自己的兴趣预先选择有用的信息,当不需要这些信息时,还可以随时退出,不再继续接收。因此,在Email营销中,用户拥有主动的选择权,正是因为用户自己选择的信息与自己的兴趣和需要相关,因而对接收到的信息关注程度更高,这是Email营销获得较好效果的基本原因。正是因为这些优点,Email不仅成为重要的网络营销手段,有助于品牌推广和促进销售,同时也成为维持和改善顾客关系、开展顾客服务的重要工具。

5、有针对性的目标客户群

邮件营销的客户一般都是较精准的部分人群,他们来到你的网站一般都是和这个行业有直接或者间接关系。再者,能填写邮件地址并允许企业发送邮件的人一般都较关心该行业的产品走势或新闻动态。他们是潜在消费者,我们要做的只是选择合适的时机把合适的信息传递给他们就可以了。这类客户一旦成功购买第一次,往往就会成为你的忠实用户,并且他还会去影响身边的人,免费为你宣传。

综上所述,邮件营销以其成本低、投递速度快、精准性、个性化易操作等优势成为最有效的营销手段之一。在经济低迷、市场预算紧张的当下,邮件营销对许多企业就更加有吸引力了,而企业邮箱也自然成了企业和现有客户沟通最常用的渠道之一。

二、网站邮件的注意事项

A、邮件主题

1、邮件主题中要体现出邮件内容的精华、品牌或者产品信息;

2、邮件主题中要包含丰富的关键词;

3、一般说来,邮件主题保持在8-20个汉字范围内是比较合适的。

B、邮件内容

1、将公司logo固定在同一位置,可以是Email顶部的显眼处(但不要太大,占据整个屏幕);

2、尽量使用统一字体;

3、简洁明了,重点突出,注意不要强加给客户太多文本信息;

4、巧用图片作为内容补充。在选择图片时,要挑选那些简单、易于理解,并且与正文内容有直接关联的图片;

5、邮件信息内容要有针对性,是客户关心和感兴趣的内容。

App盈利模式


1、广告费: 首页广告(2-3万/年)、频道广告(1-2万/年)、标王广告(10000/年)、内页广告(5000/年以内)等 (成熟平台:几万/天,刚开始几百一天/位)

2、会员费: 高级VIP会员(2000元/年)、VIP会员(1580元/年)、采购通会员(580元/年)普通会员(免费) (阿里巴巴会员收费情况,诚信通:1688元/年、3688元/年,国际几万到几十万不等  其他平台几千到几万不等)

3、竞价搜索:按关键词搜索时,竞价点击付费;排第一位付多少,排第二位多少等 (如:百度、谷歌等)

4、关键词连接:关键词直达会员商铺或会员网站服务

5、名家访谈:对知名企业、企业家进行宣传报道(几千到几万不等)

6、贸易:行业网站是以第三方身份出现的,平台上所有的供求信息第一个知道的就是本企业;可以为本企业带来客户。

7、授牌费:针对手机门户网站的会员,单独授牌;提高会员的荣誉感。

8、后期杂志:杂志广告费、文章报道费等

9、吸纳风投:会员达到一定数量,可找风险投资商入驻。

10、上市或整体转让(套现走人)

史上最全最详细的APP运营推广策划方案

$
0
0

一款成功的应用,开发APP只是第一步,比前者更重要的是APP运营,APP就像是一个需要不断包装和投入的“明星”,需要不断制造“话题”来吸引用户,靠一版版的优化升级和足够的内容、活动来支撑,否则很快就会泯灭于人们的视野中,因此,比APP开发更难的是后续的运营和推广。

史上最全最详细的APP运营推广策划方案-马海祥博客

目前市场上,大家都没有非常清晰的APP推广渠道和方式,目前,大家都在摸索的阶段,除了常规的安卓和苹果市场以外,其余的推广渠道和方式各公司因为资源的不同而不同,在此,马海祥特意为大家整理了最全最详细的APP运营推广策划方案。

一、竞品分析

APP分析方法和分析任何一款产品时做的竞品分析是一样的,这里把之前总结过的一些竞品分析的内容整理了下,内容比较适合新人,分享给大家。

1、选择竞品,做好定位

一般来说,竞品分析选择两个产品最好,最多三个,那么我们该如何获取竞品呢?

A、百度搜索类似产品关键词,假设你的产品是一款三国主题的卡牌游戏,你可以输入主要关键词“三国 ”,一般排在自然排名前面,百度竞价推广前面的产品都是竞品。

B、各大移动应用市场上用关键词查找,如应用市场,应用宝,豌豆荚等。

C、行业网站上查找最新信息。

D、咨询类网站如艾瑞、DCCI、Alexa等是相对靠谱渠道。

还有其他的方法,如通过参加行业展会,同行交流等渠道获取竞争对手信息,这里不一一介绍了。

2、竞品分析,得出结论

选择恰当的分析方法来分析,根据分析得出结论,一般来说,比较全面的竞品分析要从用户,市场趋势,功能设计,运营推广策略等方面来展开,这里我们把它细化成以下几个维度:

(1)、市场趋势、业界现状。

(2)、竞争对手的企业愿景、产品定位及发展策略。

(3)、目标用户。

(4)、市场数据。

(5)、核心功能。

(6)、 交互设计

(7)、产品优缺点。

(8)、运营及推广策略。

(9)、总结&行动点。

对于移动互联网部门市场推广总监来讲,可以只关心市场部分,功能及设计这块可以忽略,如从1,2,3,4,7,8这几部分对竞品进行分析,重点关注市场数据及运营推广策略。

这里拿一款移动旅游APP来说,运营数据可从下载量、用户数、留存率、转化率、活跃用户数、活跃时长等来进行竞品分析。

运营及推广策略可从竞品的渠道管理来分析,如应用市场投放,移动论坛,市场活动,软文投放,社交化媒体表现等(具体可查看马海祥博客《 APP营销推广的渠道、策略和方法技巧》的相关介绍)。

3、根据结论,得出建议

通过对上述竞品分析,可以大致得出一个比较有市场商业价值的结论,然后跟结论制定一个合理的APP运营推广方案。

二、产品定位

将产品定位单独一个篇幅来讨论可见其重要性,清晰的产品定位,目标用户群定位是运营推广的基石,目标用户群分析的越透彻,越清晰,对于后期产品推广起关键性助推作用。

1、产品定位

一句话清晰描述你的产品,用什么样的产品满足用户或者用户市场,比如:

陌陌:一款基于地理位置的移动社交工具。

QQ空间:一个异步信息分享和交流的平台,是QQ即时通讯工具的补充。

91运营网:分享互联网产品, 电子商务运营干货。

酷social:关注移动社交发展趋势,探讨移动社交商业价值。

2、产品核心目标

产品目标往往表现为解决目标用户市场一个什么问题,这个问题分析的越透彻,产品核心目标越准确。

如:360安全卫士解决用户使用电脑的安全问题;微信为用户提供流畅语音沟通的移动应用。

3、目标用户定位

一般按照年龄段,收入,学历,地区几个维度来定位目标用户群体。

4、目标用户特征

常用用户特征:年龄,性别,出生日期,收入,职业,居住地,兴趣爱好,性格特征等。

用户技能:熟练电脑办公,外语能力强。

与产品相关特征:

a、电子商务类:购物习惯,年度消费预算等。

b、交友类:是否单身,择偶标准。

c、游戏类:是否喜欢3D游戏,是否有同类型游戏经验。

5、用户角色卡片

根据目标用户群体围绕目标用户特征建立用户角色卡片。

6、用户使用场景

用户使用场景是指将目标用户群投放到实际的使用场景中。

还是以上APP为例,张三每天来到了万达商场某体育用品店,看到了科比二代球鞋售价1400元,顿时心动想入手,他用比价APP进行二维码扫描发现京东售价800,淘宝售价810,APP主动提示建议在京东购买,张三迅速浏览了商品的高清图片和产品说明,因为店家可以包邮,所以张三放弃了在线下购买。

三、推广方案

移动互联网行业, 创业公司市场则适合多面出击,把能够想到的各种途径方式都去尝试,用最小的投入把品牌效果最大化(具体可查看马海祥博客《 企业该如何通过APP营销树立品牌》的相关介绍)。

在想到的100种方法里,不断测试出一种最有效的方法,剔除掉其中99个,集中火力把手里的资源集中在一个可能爆发的点上,不断放大,不断分析,等待爆发。最终吸引更多的注册用户,提高自己的市场份额。

1、渠道推广

APP运营都离不开推广,要学会从运营中找的问题,总结良好经验,做优质渠道,改良产品,对于渠道推广,有以下几点可供大家参考:

(1)、线上渠道

A、基础上线:各大下载市场、应用商店、大平台、下载站的覆盖Android版本发布渠道,因为在马海祥看来,推广的第一步是要上线,这是最基础的,无需砸钱,只需最大范围的覆盖。

下载市场:安卓、机锋、安智、应用汇、91、木蚂蚁、N多、优亿、安机、飞流等。

应用商店:geogle商店、HTC商城、历趣、十字猫、开奇、爱米、我查查、魅族商店、联想开发者社区、oppo应用商店等。

大平台:MM社区、沃商店、天翼空间、华为智汇云、腾讯应用中心等。

客户端:豌豆荚手机精灵、91手机助手、360软件管家等。

wap站:泡椒、天网、乐讯、宜搜等。

web下载站:天空、华军、非凡、绿软等。

iOS版本发布渠道:AppStore、91助手、pp助手、网易应用中心、同步推、快用苹果助手、itools、限时免费大全。

B、运营商渠道推广:中国移动,中国电信,中国联通

用户基数较大,可以将产品预装到运营商商店,借力于第三方没有的能力,如果是好的产品,还可以得到其补助和扶植。

市场部门要有专门的渠道专员负责与运营商沟通合作,出方案进行项目跟踪。

C、第三方商店:上述A类都属于第三方商店

由于进入早,用户积累多,第三方商店成为了很多APP流量入口,全国有近百家第三方应用商店,渠道专员要准备大量素材,测试等与应用市场对接。各应用市场规则不一,如何与应用市场负责人沟通,积累经验与技巧至关重要。

资金充足的情况下,可以投放一些广告位及推荐等。

D、手机厂商商店

大厂家都在自己品牌的手机里预装商店,如联想乐商店,HTC市场,oppo nearme,魅族市场,moto智件园等,渠道部门需要较多运营专员来跟手机厂商商店接触(具体可查看马海祥博客《 关于App推广运营的8条隐藏技巧》的相关介绍)。

E、积分墙推广

“积分墙”是在一个应用内展示各种积分任务(下载安装推荐的优质应用、注册、填表等),以供用户完成任务获得积分的页面,用户在嵌入积分墙的应用内完成任务,该应用的开发者就能得到相应的收入。

积分墙起量快,效果显而易见,大部分是采用CPA形式,价格1-3元不等。但以活跃用户等综合成本考量,成本偏高,用户留存率低。

业内公司有tapjoy,微云,有米,万普等。

积分墙适合大型有资金,需要尽快发展用户的团队。

F、刷榜推广

这种推广乃非正规手段,但是在国内非常的受欢迎,毕竟绝大部分苹果手机用户都会实用APP Store去下载APP,如果你的APP直接都在前几名的位置,当然可以快速获得用户的关注,同时获得较高的真实下载量。

不过,刷榜的价格是比较高的,国内榜top25名的价格在每天1万元左右,top5的价格每天需要两万多。由于这种推广成本比较高,所以一般会配合新闻炒作一起搞,这样容易快速的出名(具体可查看马海祥博客《 详解APP应用分发平台的榜单推荐和搜索排名规则》的相关介绍)。

G、社交平台推广

目前主流的智能手机社交平台,潜在用户明确,能很快的推广产品,这类推广基本采用合作分成方式,合作方法多样,业内公司有微云,九城,腾讯,新浪等。

如2010年6月非诚勿扰的交友软件,在微云社交平台上自传播自推广,上线第一个月用户达到32万。

H、广告平台

起量快,效果显而易见,但成本较高,以目前主流平台为例,CPC价格在0.3-0.8元,CPA在1.5元-3元之间。

不利于创业融资前的团队推广使用。

业内公司有admob,多盟,微云,有米,亿动等。

I、换量

对于换量,马海祥了解到的主要有两种方式:

①、应用内互相推荐

这种方式可以充分利用流量,增加曝光度和下载量,量级不大,但曝光度不错,有内置推荐位的应用可以相互进行换量,但这需要以一定的用户量作为基础。

②、买量换量

如果自身无法给某一应用带量或者量很小,可以找网盟跑量,以换取应用商店优质的资源位或者折算成钱进行推广,这种方式也是比较实用的方式,包括应用宝、小米等在内的商店都可以换量,通过某些代理,还能跟360等进行换量,可能会比直接在360做CPT有更好的效果,商店:CP一般以2:1的方式进行换量。

(2)、线下渠道

A、手机厂商预装

出厂就存在,用户转化率高,最直接发展用户的一种方式(具体可查看马海祥博客《 如何利用线下预装推广使APP立刻拥有千万用户》的相关介绍)。

用户起量周期长,从提交测试包测试-过测试-试产-量产-销售到用户手中需要3-5个月时间。

推广成本:应用类产品预装量付费价格在0.5-1元不等,CPA方式价格在1.5-4元不等。游戏类产品,采取免费预装,后续分成模式,CPA价格在2-3元之间。

业内公司:华为,中兴,酷派,TCL,波导,OPPO,魅族,海信等。

操作难点:品牌众多,人员层级多,产品项目多,需要有专业的团队进行针对性的推荐与维护关系。

B、水货刷机

起量快,基本上2-4天就可以看到刷机用户,数量大,基本上一天可以刷几万台。

重刷现象严重,基本上一部手机从总批到渠道到店面会被刷3-5次,推广成本剧增,用户质量差,不好监控。

基本上刷机单一软件CPA在1-2元,包机一部机器价格在5-10元之间。

业内公司:XDA,酷乐,乐酷,刷机精灵。

C、行货店面

用户质量高,粘度高,用户付费转化率高,见用户速度快。

店面多,店员培训复杂,需要完善的考核及奖励机制。

基本上CPA价格在1.5-3元之间,预装价格在0.5-1元之间。

业内公司:乐语,中复,天音,中邮,苏宁等。

案例:2010底微云与国内知名连锁手机卖场进行合作试点,将合作的光盘放到店面进行打包销售给用户,8万套光盘激活用户达到了一半。

2、新媒体推广

接下来,马海祥就重点来说一下App推广方式中的新媒体推广,具体包括以下几个方面:

(1)、内容策划

内容策划前需做好受众定位,分析得出核心用户特征。

坚持原创内容的产出,在内容更新上保持一天三条左右有趣的内容。

抓住当周或当天的热点跟进。

创意,还是创意,让你的产品讲故事,拟人化(具体可查看马海祥博客《 8个奇葩且好玩的国外APP应用案例》的相关介绍)。

(2)、品牌基础推广

百科类推广:在百度百科,360百科建立品牌词条。

问答类推广:在百度知道,搜搜问答,新浪爱问,知乎等网站建立问答。

(3)、论坛,贴吧推广

机锋、安卓、安智……,在手机相关网站的底端都可以看到很多的行业内论坛。

马海祥建议推广者以官方贴、用户贴两种方式发帖推广,同时可联系论坛管理员做一些活动推广。

发完贴后,应当定期维护好自己的帖子,及时回答用户提出的问题,搜集用户反馈的信息,以便下个版本更新改进。

第一阵容:机锋论坛、安卓论坛、安智论坛。

第二阵容:魔趣网、安卓论坛、魅族论坛。

第三阵容:风暴论坛、木蚂蚁论坛、DOSPY论坛。

(4)、微博推广

内容:将产品拟人化,讲故事,定位微博特性,坚持原创内容的产出,在微博上抓住当周或当天的热点跟进,保持一定的持续创新力,这里可以参考同行业运营比较成功的微博大号,借鉴他们的经验。

互动:关注业内相关微博账号,保持互动,提高品牌曝光率。

活动:必要时候可以策划活动,微博转发等。

(5)、微信推广

微信公众号的运营推广需要一定时间沉淀,这里可以参考几步曲:

内容定位:结合产品做内容聚合推荐,内容不一定要多,但是一定要精并且符合微信号的定位。

种子用户积累:初期可以给定个KPI指标,500个粉丝一个门槛,种子用户可以通过同事好友,合作伙伴推荐,微博引流,官网引流等。

小号积累:开通微信小号,每天导入目标客户群。

小号导大号:通过小号的粉丝积累推荐微信公众号,将粉丝导入到微信公众号。

微信互推:当粉丝量达到一定预期后,可以加入一些微信互推群(关于微信推广经验分享,这里不再展开讨论了,具体可查看马海祥博客《 微信公众号该如何做营销推广》的相关介绍,也可以加入我的微信公众号mahaixiangboke交流)。

(6)、PR传播

PR不是硬广告,学会在对的途径讲一个动人的故事是非常重要的,互联网时代人人都是传播源,无论微博Kol、微信公众号、媒体网站的专栏或各大社交网站,我得去研究如何利用这些平台来讲述一个好的品牌的故事,反之,这些平台也会是用户对品牌产生UGC的最好渠道。

在初创公司,作为PR需要把公司每一个阶段的方向都了解透彻,然后学会向市场、投资人、用户传递一个有力的声音,这个声音并不是生硬的广而告之,而是抛出一个话题让大家对你的故事所感兴趣,并带动大家如何把兴趣引到你的产品上来,最好形成行业的热议话题。

以下有几个策略:

①、用日常稿件保持稳定的曝光

我们会定期做一张传播规划表,每个月要根据公司和产品的变化来决定该向外界传递什么声音,恰当的表达和持续的内容产出会让公司的曝光度及行业的关注度逐渐提高。

②、维护好已有的媒体资源,积极扩展新资源

对于自己原来熟识的记者和媒体,我仍会保持续的沟通和交流,告诉他们,我们的团队在做怎么样的一件事,深信只有反复的沟通,才会把故事的闪光点打磨得抓住人心,而作为PR也更能及时嗅到媒体关注的兴趣点,为下一次的报道梳理做好充分准备。

在创业公司对PR的经费并不是非常充足的情况下,我们需要仔细去分析,在什么样的发展阶段和进度,需要利用的什么样的途径和资源去支撑公司的发声和观点,所以我们对自己的要求是每周都有计划的去拓展一些新的媒体资源,这样能为之后做事件输出时能有合适的渠道的进行支撑。

③、选择的渠道决定了传播的效果

说什么故事,用哪种方式呈现传播效果会最佳,这对于渠道的选择就显得尤为重要,比如对于公司创始人的一些采访,我们可能更倾向于行业及财经相关的权重高的纸媒,有利于大面积的带动传播。

对于产品的发声,我们更倾向于科技类的新媒体,在行业内能引起更快速的关注力,而对于事件话题性的新闻,我们更青睐于选择大型门户类网站。

对于自媒体这领域,实力参差不齐,选择有中立观点和实力派的自媒体发声,不失为好的选择,但是成本对创业公司来说,并不是性价比最高的。而对于电视媒体,选择对和你潜在用户相吻合的节目,是一个能快速让产品呈爆发式增长的途径。

最后,要记得做好对营销传播效果的评估,这些可能包括人群的覆盖率、点击量、阅读量,点赞量等。每一次的数据,都会告诉你下一次的内容应该怎样做得更赞。

而PR作为连接内外的桥梁,最好也要藏身于用户中间,在深度沟通中突出品牌的个性。

(7)、事件营销

事件营销绝对是个体力活和脑力活,这需要整个团队保持敏锐的市场嗅觉,此外还需要有强大的执行力,配合一定的媒体资源,事件才得以在最快的速度推出去。

事件营销的前提必须是团队成员需要每天接触大量新鲜的资讯,把这些信息整合,也需要养成随时记录下一些闪现的灵感创意并和成员们及时分享碰撞。

对于能贴上产品的创意点结合点,我们会马上进行头脑风暴,对事件的始终进行推理,若确定方案可行,那么马上做出与之匹配的传播计划,开始做项目预算并一边准备好渠道资源。

(8)、数据分析

每周花一些时间去认真分析每一条微博、微信、每一个渠道背后的数据,你一定会发现传播度高的内容背后的契合点和关联性,这样非常有利于自己官方微博、微信内容质量的提升,运营起来也更接地气(具体可查看马海祥博客《 App运营必须关注的5个数据指标》的相关介绍)。

3、线下推广

利用宣传经费印制纸质宣传单和各种海报,做宣传。

(1)、介绍海报:在人流量多且可免费宣传的地方张贴海报宣传。

(2)、宣传单:与合作商家商议,将宣传单曝光于商家跟用户接触的地方。

(3)、地推卡传单:制作精美传单,在办公区域相对集中的地方、商场发布传单。

四、推广预算

根据以上推广方案对各渠道做预算配比,与老板敲定最后的第一期投放预算。

史上最全最详细的APP运营推广策划方案-马海祥博客

五、制定目标

对于一款APP,马海祥觉得由两方面决定关注指标:

1、产品运营阶段

A、种子期:主要目的在于收集用户行为数据,与产品设计时的用户模型做对比,有目的性调优。

主要关注数据有:页面路径转化,按钮点击,启动次数,启动时间段,停留时长等。

这个阶段数据量不求大,但求真实,用户来源的话,可以先做免费渠道,如果能有一些首发资源更好了。

B、推广期:主要目的在于扩大影响,吸收用户。

主要关注数据有:新增,活跃,留存以及渠道数据。

在这个阶段如果能够配合各种资源多管齐下,用户量能有爆发是最好的了(具体可查看马海祥博客《 APP常用的推广方法》的相关介绍)。

C、营收期:主要目的在于通过各种活动运营、增值服务创造营收。

主要关注的找数据有:付费用户数、付费金额、付费路径转化、ARPU等。

2、产品类型

如工具类,启动次数很重要;社区类,活跃用户和UGC很重要;游戏,在线人数和arpu值是关键;移动电商主要关注成交转化率,包括订单转化率和金额转化率,根据APP产品类型及所处运营阶段,制定APP数据指标考核表,如下图显示:

史上最全最详细的APP运营推广策划方案-马海祥博客

这里有一张整理过的图来说明一下吧,很早以前在网上收集的一些数据指标,感觉比较实用,制作方案的时候可以参考。

史上最全最详细的APP运营推广策划方案-马海祥博客

六、关于APP数据指标分析

APP的数据指标体系主要分为五个维度,包括用户规模与质量、参与度分析、渠道分析、功能分析以用户属性分析。用户规模和质量是APP分析最重要的维度,其指标也是相对其他维度最多,产品负责人要重点关注这个维度的指标。

1、留存用户和留存率

留存用户和留存率通常反映了不同时期获得的用户流失的情况,分析这个结果往往是为了找到用户流失的具体原因。

APP获得一定用户以后,刚开始用户会比较多,随着时间的推移会不断有用户流失,留存率随时间推移逐步下降,一般在3-5个月后达到稳定。其中阅读资讯、社交沟通、系统工具是留存率最高的三类应用,在4个月以后的留存率稳定在10%左右。

留存率提高了,才会有更多的用户留下来,真正使用APP的用户才会越来越多(具体可查看马海祥博客《 如何计算并提高APP用户留存率》的相关介绍)。

次日留存:因为都是新用户,所以结合产品的新手引导设计和新用户转化路径来分析用户的流失原因,通过不断的修改和调整来降低用户流失,提升次日留存率,通常这个数字如果达到了40%就表示产品非常优秀了。

周留存:在这个时间段里,用户通常会经历一个完整的使用和体验周期,如果在这个阶段用户能够留下来,就有可能成为忠诚度较高的用户。

月留存:通常移动APP的迭代周期为2-4周一个版本,所以月留存是能够反映出一个版本的用户留存情况,一个版本的更新,总是会或多或少的影响用户的体验,所以通过比较月留存率能够判断出每个版本更新是否对用户有影响。

渠道留存:因为渠道来源不一,用户质量也会有差别,所以有必要针对渠道用户进行留存率分析,而且排除用户差别的因素以后,再去比较次日,周留存,可以更准确的判断产品上的问题。

2、活跃用户

用户每天既会不断新增,也会不断流失,如果单独只看每日活跃用户数,是很难发现问题的本质的,所以通常会结合活跃率和整个APP的生命周期来看。

活跃率是指活跃用户/总用户,通过这个比值可以了解你的用户的整体活跃度,但随着时间周期的加长,用户活跃率总是在逐渐下降的,所以经过一个长生命周期(3个月或半年)的沉淀,用户的活跃率还能稳定保持到5%-10%,则是一个非常好的用户活跃的表现,当然也不能完全套用,得视产品特点来看。

七、团队架构

这个篇幅简单介绍移动互联网运营推广团队的组织架构及成员工作职责,具有一定的普遍性,总体概括来说,这个市场运营部门架构大概是:一个带头的,一个做渠道和流量,一个玩社交媒体的,一个天马星空写文案的,再辅助一些打杂的。

1、市场运营总监

工作职责:

(1)、负责公司开发的移动互联网产品的内容整体规划和运营策略的制定及执行。

(2)、负责制定每季度、月运营计划。

(3)、整理各产品运营渠道数据报表,并定期收集分析同类竞品情报。完成活动的策划执行,并做好跟踪记录。

(4)、构建和完善App推广和分销渠道,促进App的下载和使用(具体可查看马海祥博客《 史上最全的APP推广模式及方法技巧》的相关介绍)。

(5)、网络媒体、网站联盟、博客、论坛、社区营销、SNS等各种互联网营销渠道的拓展和维护。

(6)、负责和移动互联网领域各传播媒体有效沟通,调动各种资源,促进公司互联网产品和相关渠道及媒体的联合推广,以提高公司产品的市场知名度。

(7)、负责通过微博,微信等网络推广方式,开展公司自有产品的运营和推广活动,收集相关营销成功案例并进行分析。

(8)、负责制作内容及话题,能够结合热点事件开展推广活动,及时监控和处理产品运营活动过程中的各类正负面事件。

(9)、跟踪运营推广效果,分析数据并反馈,分享推广经验;挖掘和分析目标用户使用习惯、情感及体验感受,即时掌握新闻热点。

(10)、策划、组织、评估和优化推广计划。

(11)、分析App运营数据,根据分析结果不断优化运营方案。

岗位点评:从工作职责要点来说,市场总监应该是负责内容规划,运营策略及计划制定,渠道构建和监督,新媒体推广实施跟踪,APP运营数据分析,团队建设和管理。

2、文案策划

工作职责:

(1)、清晰项目目标,快速了解客户需求,并密切与相关协同部门合作,提供快速、精准、精彩的案头支持。

(2)、负责宣传推广文案及宣传资料文案的撰写。

(3)、负责创意内容撰写,为线上活动、广告传播、线上公关稿件撰写相关文案内容。

(4)、沉淀创意产出和内容撰写的经验,形成知识管理,供其他项目借鉴。

岗位点评:文案策划岗位是文字输出岗位,需要文字功底好,有创意,对热点有嗅觉,最好在事件营销传播方面有成功案例。

3、渠道经理(BD拓展)

工作职责:

(1)、深入研究公司产品与所属行业,制定适应公司发展战略的拓展计划。

(2)、根据公司业务发展需求,寻找、挖掘有利于公司的合作资源。

(3)、负责商务拓展及合作,与其他客户端及推广渠道(各大市场)建立良好的业务合作关系。

(4)、对推广数据进行分析,有针对性的调整推广策略,提高下载量、安装量及活跃度等(具体可查看马海祥博客《 盘点那些不为人知的App推广技巧》的相关介绍)。

(5)、辅助APP产品的运营和推广,整体规划和专题策划。

岗位点评:渠道经理顾名思义就是拓展各互联网流量渠道,一切有助于APP流量提升的渠道合作都属于工作范畴,渠道经理的工作职责就是制定渠道拓展计划,带领BD专员拓展各市场,分析数据,完成运营总监制定的流量指标。

4、新媒体推广经理

工作职责:

(1)、有互联网信仰,最好是重度使用者,制定新媒体推广计划,执行力强。

(2)、熟悉新媒体,对微博、微信如数家珍,熟悉大号,运营过微博草根号、微信公众号更好!

(3)、有判断力,对热点事件能分析,知道如何借势,有自嘲精神,可以黑人兼适度自黑。

(4)、有战斗经验,没混过论坛没耍过微博刷过微信的就算了,不管明骚闷骚,永不放弃!

岗位点评:这个岗位要求“离了手机就不能活并且认为它比性更重要”那种,能配合文案玩转各社交媒体渠道,在事件营销及热点引爆有嗅觉和实操经验。

八、绩效考核

每个公司绩效考核指标不同,对于移动互联网公司市场部门来说,各个岗位指标也不尽相同,这里只罗列出有共性的一些考核点。

1、市场运营总监

这个岗位背负团队整体KPI指标,如APP运营数据指标,销售指标等,如何将团队指标有效分解到每周,每天、每个人,这是市场运营总监每天都要思考问题。

2、文案策划

A、文案撰写能力:写作功底深厚,表达能力强、思维逻辑清晰、具有独特敏捷的创意思维。

B、创意能力:能根据公司品牌定位, 完成有创意的文案策划,为产品销售及运营推广带来很大飞跃。

C、对接能力:与渠道部门,设计部门,推广部门,客户等沟通协调及分配工作能力。

D、工作态度:纪律性,团队协作意识,工作责任感。

根据这几个考核指标做分数配比,适当提高AB两项指标分数。

3、渠道经理

渠道考核指标直接跟APP运营数据挂钩,这个数据指标可参考上篇中app运营目标中数据。

那么在APP运营推广过程中哪些数据指标,可以更好的指导我们工作呢?比如:下载量、每日新增用户数、留存率、活跃用户数、平均用户收益(ARPU)、使用时间、活跃时长是很多公司作为数据指标的一个考核,也是改进优化工作的一个依据。

当然,产品阶段的不同,我们关注的数据指标肯定不同。例如APP初期,我们更加关注下载量和用户数。之后,我们又会比较关注活跃用户、留存率、转化率等等的数据,所以运营阶段的不同,我们所关注数据的侧重点也会有所不同。

4、新媒体推广经理

新媒体推广由于渠道不同考核指标也不同,微博、微信、豆瓣、知乎、其他软文推广渠道等,运营总监可以根据渠道设立不同考核指标,这里以微博和微信为案例:

(1)、微博考核指标

微博营销涉及的数据大致有微博信息数、粉丝数、关注数、转发数、回复数、平均转发数、平均评论数。

微博信息数:每日发布的微博数量,10条/天。

平均转发数:每条信息的转发数之和/信息总数量,一般计算日平均转发数或月平均转发数,平均回复数原理类似。平均转发数(评论数)与粉丝总数和微博内容质量相关,粉丝总数越高,微博内容越符合用户需求,转发数和评论数就会越高,所以这个数据可以反应粉丝总数、内容和粉丝质量的好坏,粉丝基数越大,理论上转发会提高,内容越契合用户,或者粉丝中你的目标人群越多,这个数据都会上升。

以A公司品牌微博为例,4月1日只有1.4万左右,5月结束有2.6万!

史上最全最详细的APP运营推广策划方案-马海祥博客

从这个表中可以看到4、5月的增长情况,两个月的粉丝增量差不多,微博信息数量5月增加36%,但是转发总数增长近100%倍,评论增长了64%,搜索结果数也是增加了。应该说针对4月的微博内容分析之后,5月份作了一些调整,更加注重用户需求,所以在总量增加的同时微博的平均转发数和回复数都上升了,可以说明该微博5月份比4月份是有进步的,而且搜索结果数直接增加曝光率,说明了营销效果。

总结:平均转发数和评论数可以衡量自身微博运营状态好坏;搜索结果数可以作为品牌传播的考核;只有综合所有数据来看才可以指导微博营销。

(2)、微信考核指标

文章考核指标:送达率、图文阅读率、原文页阅读率、转发率、收藏率。

订阅粉丝量,有三个指标:新关注数、取消关注数以及净增关注数。

刚开微信的企业,我们可以用1个月的时间,设定目标完成500个用户的订阅,接下来的每个月,逐步增长。每天订阅粉丝超过20个,1月就是600个。

用户互动量:该用户在微信上和你的互动,我指的是有意义的互动,比如马海祥博客(微信号mahaixiangboke),当你添加微信时,自动回复写的是:输入1获取移动互联网干货,输入2获取电子商务运营干货,输入3获取产品策划干货,这其实就是很好的一个规则。

用户转化量:该用户最后通过你的规则输入相关词后,我们的跟进情况,以及成交情况。

九、团队管理

这个篇幅侧重于团队运营管理,不只是针对移动互联网,同样适合互联网公司团队管理,以马海祥个人经验分享来说,互联网团队运营管理应重点关注三方面:执行力,目标管理,团队凝聚力。

1、执行力

关于执行力的案例,腾讯是很多互联网公司学习榜样,马化腾凌晨4点发出邮件,运营团队下午就能给出实现计划。

很多创业型互联网小公司发展速度快,因为执行力强,当公司发展到一定规模后,变态的层层审批机制阻碍了项目的实施。马海祥原来在一家传统企业转型互联网的公司呆过,深有体会,一个很简单的推广页面,本来当天就可以决策通过,还要经过总监--副总--老板几个层级审核,一周过去了,才通过,结果好好的项目被时间给拖死了。

所以,在大的公司,马海祥还是比较推崇项目负责制,扁平化管理。

2、目标管理

运营总监从拿到KPI那天起,脑海里都是数据化管理,从年目标,季度目标,月目标,周目标层层分解,一个没有数据量化目标的运营团队会跟无头苍蝇一样乱窜,运营总监团队管理过程其实就是一个目标管理流程。

3、凝聚力

保持一个高效、快乐、有活力的工作环境,让整个运营团队保持凝聚力,是每个运营总监职责所在,团队成员频繁跳槽,稳定性差将不利于项目的进展,所以如何保持项目核心成员稳定性至关重要。

马海祥博客点评:

企业APP营销推广需注意运营方案的策划,随着移动互联网领域的白热化,平板电脑和智能手机已经占了大半的PC市场,APP的第三方应用程序变得格外重要,而开发出的APP软件,想在电子市场营销,必须要有一套完善的APP运营方案才行,不然就会得不偿失。

本文为 马海祥博客原创文章,如想转载,请注明原文网址摘自于http://www.mahaixiang.cn/App/1499.html,注明出处;否则,禁止转载;谢谢配合!

智慧园区成安防领域蓝海市场, 依图推出软硬件解决方案

$
0
0

一年一度的安防产业界盛会——中国国际社会公共安全博览会今天在北京开幕,新、旧派安防厂商将在这段时间密集推出新品,其中智慧园区正在成为智能安防领域迅速被开拓的蓝海市场。

相较智慧城市、雪亮工程等城市级大规模的安防项目,智慧园区覆盖及管理区域更为集中,物业公司、地厂商等客户类型更为广泛,具备更强的市场灵活性和商业化程度。

依图智慧园区业务线负责人向机器之心表示,智慧园区市场正在呈现高速增长的趋势, 2018 年AI 产品覆盖到的智慧园区市场规模预计在 20 亿元以上。

10 月 23 日机器之心消息,依图科技推出智慧园区端到端解决方案,全系列均为自研方式,产品方案包括「云悉明眸」智慧管理平台、智能人脸识别门禁终端、智能人脸识别闸机版终端、智能人脸抓拍摄像机系列等数款基于人脸识别的产品,面向智慧园区、智能楼宇等建筑类场景。据悉,这是依图首次通过端到端的产品解决方案切入智慧园区市场。

依图科技智慧园区营销总监陈静锋现场介绍业务布局

针对依图此次发布的产品内容与智慧园区市场战略,机器之心与依图智慧园区产品线负责人进行交流。

系统层面,「云悉明眸」园区智慧管理平台以「决策模组」为核心,能够实现系统级的主动安防、人员准入及运营分析等任务,满足用户在系统层面上的数据汇总、物物互联的需求。

在园区管理中,以人脸为 ID,规避被冒充的风险,保证了 ID 的唯一性。结合依图在人像识别领域的技术优势,以推动智慧园区的管理升级。

「目前整套系统已经实现跟传统的监控系统、门禁系统无缝集成,同时通过标准接口与园区既有运营大平台实现融合。」依图方面介绍道。

依图智慧园区业务线负责人向机器之心表示,智慧园区市场正在呈现高速增长的趋势,AI 产品覆盖智慧园区市场的规模 2018 年预计在 20 亿元以上。

方案整体采用开放式架构,支持公有云和私有云,从架构上覆盖最多的园区、建筑类场景要求。同时,通过人脸识别这一技术手段,增加安防维度,「洞察」更多潜在危险、「发现」那些需要关注的人群,方便用户获得更好的服务。

比如:充分利用依图人脸识别技术的高速、精准的特点,实现「无感考勤」;帮助安保人员及时处理园区异常人员情况,进行「黑名单报警」;以人像为主轴,通过时间、空间碰撞,串联起不同人在园区内行为路线的「人员轨迹地图」,帮助园区实现进一步的主动安防或主动服务。

依图方面表示,团队很早就开始研究智慧园区的需求和发展,从最早期的数字园区,完成从模拟到网络化的转变;从数字到智能,完成系统间数据互联的基本定义与集成;如今园区已经进入智慧化时代,更多的是通过物物联网,实现大数据集成,通过多维度的数据汇集与分析,更好的为用户服务。

谈到智慧园区升级后将带来的经济价值,依图智慧园区产品线负责人向机器之心据介绍,传统的智慧园区主要采用空间、时间维度提供数据,而基于 AI 的智慧园区方案,我们提供精准的、实时的人像身份数据,提高了数据维度。更重要的是,方案将人的身份识别作为第一维度,即当任何人进去园区,客户就能迅速判断人员身份,从而进行进一步的主动安防或主动服务的工作,这个是传统园区方案无法比拟的。

对于智慧园区场景下的数据价值,依图方面表示,基于人像数据,原本被动的园区管理、园区安防体系将会更为主动,能够让园区运营者将「时间、地点、人物」在第一时间串接起来,真正形成数据链条,园区拿着这些数据可以实现园区运营状况实时分析、流量精准分析、VIP 客户个性化服务等;同时长期的数据汇聚和分析,有利于园区调整自身营运结构、根据不同的人采取不同的策略,这些策略是通过大量的身份管理数据基础上总结获得的。

事实上,依图智慧园区的系列解决方案在今年早些时候已经成功产品化落地。在活动现场,依图科技分别展示了在上海市世界外国语小学、太平洋资产管理有限公司、上海宝地广场、中建八局等应用案例。

在上海宝地广场项目中,依图科技落地的智慧楼宇解决方案包括智能刷脸进出、智能访客登记、智能安全防控等能力。上海宝地仲量联行物业服务有限公司总经理金立新在接受采访时说:「物业管理是劳动密集型行业,每年人力成本的支出占到 70% 以上。人工智能引入后,从安保、清洁到执行、管理,人力成本都将大大节约,带来巨大效益。」

在上海世界外国语小学项目中,依图的产品和技术除了在通行管理、教职工考勤、校园安保方面「执勤」外,未来还将扩展到校车管理,学生上车识别、位置、时间数据汇聚推送;校园餐厅管理,学生教职工刷脸就餐;公安联动,共建平安校园等方方面面。

此外,方案还包括智能抓拍摄像头、智能人脸识别闸机版等终端产品。依图方面表示,其产品逻辑在于整个系统是以人为轴,从人的动线考虑。在平面空间维度,用门禁和闸机伴侣在通道口、大门针对管理人员的进出;在立体空间层面,用摄像头从上至下监控整个空间的动态。同时,将动态数据传送至后端平台,提供端到端整体解决方案。

据机器之心了解,这是依图首次通过端到端的产品线切入泛安防领域的智慧园区市场,同时也是以 AI 能力为强项的技术公司少有的产品模式。因为安防市场本质仍是一块相对传统和成熟的 B 端市场,从已经成型的硬件设备市场直接切入可能面临来自传统公司的大量竞争。

我们面临的竞争是非常激烈的,依图智慧园区产品线负责人向机器之心表示,不仅传统传统的安防厂商,新的 AI 厂商都在智能终端这块发力。但是依图凭借领先的算法,警转民的高安全技术、数据加密技术等,相信可以在市场上杀出一条属于依图的成功之路。

面向智能抓拍摄像头市场,依图推出了 200 万像素的枪型、半球型两款产品,抓拍准确率保证在 99%。与后端的应用结合可完成布控、查看人员轨迹、签到等功能。其中,半球型摄像机整体比较小,可以用在对美观度要求比较高的场景,比如办公室,酒店,商场等场景。枪型摄像机可以搭配室外护罩在纯室外条件下使用,更适用于园区,楼宇边界的布控。

200万像素智能人脸抓拍半球网络摄像机

相较于普通安防摄像头,智能抓拍摄像头最大的优势在于功能前置,将算法直接嵌入在前端,从人脸的捕获,抓拍,到图片质量优选,前端可直接输出最好的抓拍结果给后端,节省后端的算力,降低用户总体成本。

目前,智能摄像机采用依图自研前端捕获算法,提供适合人脸识别场景的优化性能,配合后端世界级的算法平台,实现端到端的,最精准及快速的识别体验。此外,依图还兼容对其他品牌的抓拍摄像机单元,节省用户侧投资。

依图科技业务发展副总裁程刚

依图科技业务发展副总裁程刚表示,对于跟用户的自身业务密切相关,难以标准化的需求,依图还将与众多合作伙伴一起行动,建立新的产品机制,基于平台全维度的接口,通过建立产品体系生态圈政策,解决客户最后「50 米」的需求。

除了此次推出的智慧园区解决方案,依图针对泛安防市场已经完成的布局还包括商业楼宇的解决方案、工业园区解决方案以及校园解决方案等多个解决方案,目标市场包括金融园区、酒店、文旅景区等。

依图方面表示,此前依图从智能城市的安防建设构建城市公共区域的防护网,现在依图开始进入园区市场,形成园区方案,这样无论是城市公共区域、还是封闭性的园区,依图真正意义地提供了「城市级」的解决方案。依图智慧园区产品线负责人透露,端到端的产品将会依图未来的方向之一。

从依图的整体业务布局来看,主要包括智能安防、智能医疗、智慧金融、智慧城市、智能硬件等五大业务板块。其中此次推出的智慧园区方案属于智能安防(泛安防)业务板块,其主要突破口在于智能硬件及其系统解决方案。

据公开消息显示,依图最近一轮融资结束于今年 6 月,C+轮 3 亿美金,投资方包括高成资本、工银国际、浦银国际投资。

面向智慧园区解决方案市场,除了海康威视、大华、宇视等传统安防巨头布局,芯片公司比特大陆等也在近期推出了相关方案。

[译] OpenCV vs Dlib 人脸检测比较分析

$
0
0

点击我爱计算机视觉标星,更快获取CVML新技术



人脸检测是计算机视觉最典型的应用之一,早期OpenCV的logo就是Haar人脸检测的示意图。


很多人的第一个OpenCV学习目标就是跑通Haar级联人脸检测,Dlib库在业内开始流行很大程度上是因为其HOG-SVM人脸检测比OpenCV Haar的好,而近年来OpenCV和Dlib均已包含基于深度学习的人脸检测算法实现。


Haar-Cascade,HOG-SVM,深度学习正是代表着人脸检测乃至目标检测的三个时代。


昨天Learn OpenCV网站博主Vikas Gupta博士发表文章,对OpenCV与Dlib中四种人脸检测算法实现进行了比较分析,包含C++/Python的代码示例,且对精度和速度都进行了量化。


先来看看作者发布的视频:


1. OpenCV Haar Cascade人脸检测

算法无需赘言。

代码示例:

优点

1)几乎可以在CPU上实时工作;

2)简单的架构;

3)可以检测不同比例的人脸。

缺点

1)会出现大量的把非人脸预测为人脸的情况;

2)不适用于非正面人脸图像;

3)不抗遮挡。


2. OpenCV DNN 人脸检测

从OpenCV3.3版本后开始引入,算法出自论文《SSD: Single Shot MultiBox Detector》(https://arxiv.org/abs/1512.02325)。使用ResNet-10作为骨干网。

OpenCV提供了两个模型:

1)原始Caffe实现的16位浮点型版本(5.4MB);

2)TensorFlow实现的8位量化版本(2.7MB)。

Vikas Gupta的代码包含了这两种模型。

模型加载代码示例:


检测测试代码示例:


优点

1)在这四种方法中是最准确的;

2)在CPU上能够实时运行;

3)适用于不同的人脸方向:上,下,左,右,侧面等。

4)甚至在严重遮挡下仍能工作;

5)可以检测各种尺度的人脸。

缺点

作者认为没有什么大的缺点^_^

(52CV君不敢妄提缺点,但认为不能使用NVIDIA GPU绝对是个遗憾)


3. Dlib HoG人脸检测

代码示例:


优点

1)CPU上最快的方法;

2)适用于正面和略微非正面的人脸;

3)与其他三个相比模型很小;

4)在小的遮挡下仍可工作。


缺点

1)不能检测小脸,因为它训练数据的最小人脸尺寸为80×80,但是用户可以用较小尺寸的人脸数据自己训练检测器;

2)边界框通常排除前额的一部分甚至下巴的一部分;

3)在严重遮挡下不能很好地工作;

4)不适用于侧面和极端非正面,如俯视或仰视。


4. Dlib CNN人脸检测

算法来自论文《Max-Margin Object Detection》(https://arxiv.org/abs/1502.00046)。

代码示例:


优点

1)适用于不同的人脸方向;

2)对遮挡鲁棒;

3)在GPU上工作得非常快;

4)非常简单的训练过程。

缺点

1)CPU速度很慢;

2)不能检测小脸,因为它训练数据的最小人脸尺寸为80×80,但是用户可以用较小尺寸的人脸数据自己训练检测器;

3)人脸包围框甚至小于DLib HoG人脸检测器。


5. 四种方法精度比较

作者在FDDB数据库中测评了四种人脸检测算法实现的精度,结果如下:

可以看到Dlib的两种方法效果都不怎么好,作者发现原来Dlib训练使用的数据集的人脸包围框较小,导致按照FDDB的评价标准不公平。



另外,Dlib无法检测小脸也拉低了分数。


6. 速度比较

软硬件环境:

Processor : Intel Core i7 6850K – 6 Core

RAM : 32 GB

GPU : NVIDIA GTX 1080 Ti with 11 GB RAM

OS : Linux 16.04 LTS

Programming Language : Python

图像大小300*300,测试结果如下:

可以看到除了MMOD 其他方法都达到实时,而MMOD方法的GPU计算是最快的。


7. 分情况检测结果示例

7.1跨尺度检测



7.2 非正面人脸








7.3 遮挡





8 总结推荐

如何在应用中选择人脸检测算法呢?作者认为应该首先尝试OpenCV DNN方法与Dlib HOG方法,然后再做决定。


一般情况

在大多数应用程序中,我们无法知道图像中人脸尺寸的大小。因此,最好使用OpenCV-DNN方法,因为它非常快速且非常准确,即使对于小尺寸的人脸也是如此。它还可以检测各种角度的人脸。所以OpenCV-DNN是首选。


中到大尺寸的图像

Dlib HOG是CPU上最快的方法。但它不能检测到小脸(<70x70)。因此,如果知道程序不会处理非常小的人脸(例如自拍照),那么基于HOG的人脸检测器是更好的选择。

此外,如果你可以使用GPU(NVIDIA家的),那么MMOD人脸检测器是最好的选择,因为它在GPU上非常快,并且还提供各种角度的检测。


高分辨率图像

由于在高分辨率图像中,这些算法的速度都会很慢,而如果缩小图像尺寸,HOG/MMOD可能会失败,同时OpenCV-DNN却可以检测小脸,所以对于高分辨率图像推荐缩小图像再使用OpenCV-DNN的方法。


原文链接:

https://www.learnopencv.com/face-detection-opencv-dlib-and-deep-learning-c-python/


代码数据下载:

在“我爱计算机视觉”微信公众号对话界面回复“人脸检测比较”,即可收到该文代码、模型与使用数据百度云下载地址。


人脸检测开源技术众多,除了OpenCV和Dlib,你还有什么推荐吗?欢迎留言~


长按关注我爱计算机视觉

【点赞与转发】就是一种鼓励

2018安防安博会丨第一天

$
0
0

2018年的安博会,虽继续延续2017年AI大势,但热度跟北京初秋的天气一样,稍微降温,今年很多企业提出了“新安防”的声音,有AI新锐,有传统企业。显然,新安防代表着新趋势,新技术及新格局,他们一方面认为安防需要技术升级,另外一方面也希望市场格局发生变化。在AI技术和BATH企业冲击下,海康,大华今年“入冬说”引起广泛关注和讨论。传统安防企业市值不断降低的同时,形成鲜明对比的是AI独角兽的估值纷纷打破200亿、300亿,“新安防,新格局、新时期”趋势逐步明显。



从算法、芯片起步的企业,都看上了安防这块“唐僧肉”,所以,行业很热闹。2018安博会的关键词仍非常清晰,AI仍被大写特写,但显然从概念及算法,逐步走向产品、方案、场景、生态。人脸、动态、态势、感知、抓拍、布控、AR、结构化、大数据、研判、雪亮、社区、多维、人物画像、运营管理、运维、基础设施、公众服务,高密度人脸抓拍,超星光等词语是高频词。


当安防进入AI和大数据时代,安防已经不是安防,可以衍生很多场景及各种可能。但必须承认,通过安博会能够看到的东西越来越少,小编非常怀念多年前硬件时代各个厂商百家争鸣百花齐放的时代,当时欧美亚太及中国台湾有各种硬件创新呈现。如今,所有的摄像机都是“AI摄像机”,所有的服务器都号称“AI智能服务器”,所有的DEMO都显示在人脸识别、车辆识别、车辆轨迹、视频结构化及大数据研判方面的“酷炫”效果。



海康威视

 

讲真,海康威视今年的展台和它在资本市场的表现一样让人多少有些失望,市值跌了2000亿的海康,或许参展的心气不高,今年的主题是毫无新意的“HiKvision AI Cloud—开放协同、数据赋能”。记得去年深圳安博会前一天,海康的“AI Cloud”重磅点燃了“云、边、端”智能之路,各安防企业纷纷走此“云/边/端”分布式智能路径。今年的主题“开放、协同、数据、赋能”,在展会之前海康剧透过,反响平平。无论海康的口号如何喊,小编认为海康的开放永远是海康的开放,不会被安防行业给予厚望。


海康的展区平淡无奇,分四个主题区,分别是:AI Cloud 产品区,AI Cloud行业赋能区,AI Cloud能力开放平台区,萤石等创新业务区。产品区主要是3D人脸摄像机、8K高清、神捕家族等摄像机,及“两池一库四平台”。


 

华为安防

 

华为的展位偏安一隅,但不妨碍慕名而去的人,从E1/2长途跋涉到W4。此次安博会上华为面向安防行业发布:一个智能指数(iCAN),意欲为行业的智能化转型树立路标;两颗业界最强算力芯片(行业之前大为关注);“五星“系列摄像机,让安防行业真正走向智能、走向“看得懂”;“一片云海”解决方案架构,让AI真正落地安防。先说iCAN—安防智能指数评价框架体系—iCAN(intelligence score = f(算力Computing,算法 Algorithm,协同syNergy)),目前只有一个彩页展示,并无深入介绍,展会小哥很实在,自己了解不多,大概意思是为目前鱼龙混杂的“安防+AI”行业提供一个可测试、量化的标准,其实有必要,但看如何操作。



软件定义摄像机展台,跟之前宣传差异不大,“1托N模式”,展台小哥进行了演示,并介绍目前是“1托1”模式,可以让具有AI能力的摄像机为其他摄像机(不限厂商及品牌,但需要符合ONVIF标准)进行AI赋能,未来,自己的昇腾芯片可以实现“1托N模式”,因为自己芯片的算力够丰富。SDC(软件定义摄像机)目前有褒有贬,小编其实看好这个理念,但可能目前时机未完全成熟。 


来的安防摄像机,作为AI的边缘节点(或者端节点),重点在AI算法及AI芯片(以前的摄像机重在体力,各种镜头、传感器的比拼,以后重在脑力,即算法和芯片资源),剩下的可以交给富士康了。芯片-算力将成为衡量摄像机是否优秀的关键因素。华为此次发布的“星”系列摄像机,搭载昇腾系列芯片,基于软件定义架构,能够满足全场景使用。华为介绍抓拍密度10倍于行业平均水平(300个小脸/每帧),小编在旷视科技展台看到(300个人脸抓拍)。




大华股份

 

今年,大华推出“HOC城市之心”,据说是以全感知、全智能、全计算、全生态为能力支撑的智慧城市发展引擎,实现面向城市级、行业级和民用级“1个平台、2个中心、N类应用”(1+2+N)的新型智慧城市架构。无论从大华自己宣传的还是现场展会小哥介绍的,小编还是有些云里雾里。


小编认为,HOC有些“空洞和噱头”,从演示效果看,其非常类似阿里巴巴的城市大脑,把城市相关基础设施及人文活动信息都集到一个平台。感觉各种词华丽辞藻,“全局、智能、智慧”等堆砌成高大上的“概念”。智慧城市顶层设计和生态,阿里和华为有戏,安防企业,戏不大。



相关介绍:大华HOC不仅注重产品和解决方案的“4全”能力,更是站在全局的角度赋予网络“4全”的能力,从而驱动网络专业、高效、智能的运转。该引擎以“感知在线,数据运算,行动落地”作为顶层规划,以“场景化,标准化,案例化”为深化设计原则,同时在建设落地过程中,以大华在视频领域的“产业生态”优势,不断助力公安机关进行可持续发展的“数据生态”和“合作伙伴生态”,不断匹配公安机关作业流程,需求痛点和投资规模,从而驱动一线作战单元精准、高效、智能地运转!



宇视科技

 

宇视科技以全新宇视蓝的U形VI风格进行了展示,主题是“『守护安全美好生活』,推出根植成功商用经验的『AI Ready!安防人工智能规模部署方案』。”让小编想起博世的“科技成就生活之美”,怀念博世安防,不过无所谓,一个德国精工安防倒下去,一个滨江精工制造站起来。面对安防AI大规模落地的裂谷,传统AI三要素已经逐步演进为3+3的六要素:算法、算力、数据、产品、工程、方案。宇视通过六要素全面发力,推出AI Ready!小编认为宇视的优势在后3,即产品、工程及方案。



民间较知名的人脸识别速通门-潼关,据说识别时间从0.5秒下降到0.2秒(就是之前广为流传的兔子蹦模式都能顺利通关那款),小编现场想试一下,展台小哥让展台妹子试了一下,瞬间开门,妹子一脸“傲骄”。小编感觉不到0.2秒是如何算出来的,不过确实算是无障碍刷脸。另外,之前张学友演唱会上露脸的“函谷人脸识别摄像机+昆仑智能分析服务器”CP组合也有亮相。


 

精工产品层面,围绕宇视核心技术战略『可视智慧物联』架构,参展产品涵盖前端采集、后端应用、安全传输、中心存储、控制显示、行业平台等六大类。行业市场作为宇视高技术的源动力,展示AI明星产品和多种方案。在以中国关山命名的宇视人工智能产品序列中,展示已全国广泛部署的智能交通抓拍单元『天目』,新推出融合视图磁带云『祁连』、深度智能NVR『天山』等,覆盖前后端人工智能最新实践。




 

苏州科达

 

此次安博会,科达以“AI+大数据=X”为主题,探索AI赋能下安防的无限可能。2017年安博会,科达发布安防+AI战略,将从深度和广度两个层面推进AI实战化应用。2018安博会,科达带来了这一年多的“安防+AI”战略成果,围绕战略规划,重点做了丰富展示。

 


科达发布了更丰富的AI前端设备,包括感知型系列摄像机新品、智能行车记录仪、无线车载、无人机、人脸通系列前端、全彩星光摄像机、多光谱重载云台摄像机等;带来了更强大的大数据平台,对猎鹰、海燕、海鸥等大数据应用进行了全面升级;将AI延伸至重点单位/园区、中小企业市场等更多领域与行业;同时,为了保障视频大数据的运维与安全,科达智能运维平台与视频安全体系首次亮相。


 

云从科技

 

云从是起步于算法而快速落地“方案、产品及场景”的AI公司,其“AI国家队”及“担负国家使命”、“国家人工智能基础资源平台”几个标签,让行业刮目相看。所谓安防安防,重点应在“防”,这也是云从本次安博会的“宣传点”。基于早期落地的“云从火眼”大数据平台升级的“安防大数据平台”,包括人脸识别、轨迹跟踪及分析,而群体关系网分析及大数据事态分析,将传统事后分析变成事前“预防”事中控制。


从硬件产品角度,云从推出了800万像素AI相机,实现前端的图像采集及“结构化”过程,不过小编认为,云从的优势还是在于强大的平台层次,AI相机属于“玩票”一下,不是重点。另有3D结构光、跨境追踪、视频人脸门控机、人脸识别盒等硬件产品,此外,今年3月云从科技国内首发的3D结构光技术和打破三项世界纪录的跨镜追踪技术也值得一探。

 


云从科技此次按照六边形形状,里外双层布局。共汇聚了四大系统:实有人口管理系统,安防大数据系统,火眼人脸大数据系统,鹰眼人脸大库检索系统;三大解决方案:AI+人像大数据方案,智慧园区安防解决方案,智慧安全社区解决方案;本届安博会云从科技的主题是“定义智慧生活”。事实上,除了出展方案和平台外,各类AI设备适用于多行业、多场景。

 

 

云天励飞

 

云天励飞拥有“算法+芯片+数据”的完整产业链条,已成长为国内AI芯片“四小龙”之一,业内有“天比地寒”(云天励飞、比特大陆,地平线,寒武纪)之说。北京安博会上,基于AI动态人像识别技术,围绕“AI+新治理”、“AI+新警务”、“AI+新零售”三大主题,云天励飞重磅展出了“深目”系统、IFBOX人像识别边缘计算引擎、行人闯红灯抓拍取证系统、智慧商业解决方案等拳头产品。


其中,云天深目智能人像平台吸睛无数。深目系统集“采集、检索、布控、挖掘于一体。带有云天励飞深度学习算法的人像抓拍机,可实时检测并提取人脸,实现海量人脸数据自动采集。基于海量动态场景下的深度学习算法,有效解决开放场景下低头、侧脸、逆光、部分遮挡等问题,真正实现“亿万人脸、秒级定位”。


云天IFBOX人像识别边缘计算引擎是一款将采集、分析、识别融为一体的“三合一”小型智能分析应用服务器。IFBOX内含高性能视觉DSP,用于边缘计算的嵌入式AI引擎,无需AI摄像机。可与成像采集设备共同布点于前端,图像采集完成即可进行人脸采集与分析,使传统摄像头具备人脸抓拍比对功能。

 

 

旷视科技

 

旷视科技的展区分为了“AI in 云”、“AI in 边”、“AI in 端”三大去,展示了旷视智能安防生态布局。云端是重点,平台级,包括天眼2.0,洞鉴5.0,边缘计算主要是基于轻量云算法的边缘产品包括4K相机及分析盒子。显然,旷视科技融合了“ AI Cloud概念”及华为的“轻量云”概念,糅合在一起,形成整体解决方案,但其“边”的概念和海康不同。


 

东方网力

 

东方网力是平安城市平台的王牌企业,其VMS平台多年中国No.1, PVG平台经过多年发展,功能强大。本届安博会,东方网力的主题是“N科技 AI城市”,同时,在此次展会上,东方网力发布处于领先地位的联网平台最新版本PVG10,经过了解发现,PVG10版本重塑了技术架构,可灵活构建百万至千万规模的系统,支持多种联网模型级联。

 

在东方网力展台还可近距离体验的视频图像解析系统及实际落地案例,东方网力视频图像解析系统在全国多地完成落地应用,效果显著。受到广泛赞誉的东方网力智能安防社区系统,在便民创安双领域发挥的积极作用,通过这次展会的全景展现,小编得到了更深刻的认识。


在雪亮工程应用展区,重点展示了重塑技术架构的视云联网平台以及融合了大数据、云计算、人工智能等前沿技术的视频图像解析系统等;在智慧社区应用展区,则有在上海试点成功并得到推广应用的智能安防社区系统;在人脸识别展区,则能看到展示的人像分析系统等产品;在视频侦查应用展区,最主要的看点是现场环境信息重建系统、便携式视频时空分析仪等;还有轨道交通应用展区中的轨道交通视频监控系统等等……。

 


中星技术

 

中星技术是一个神奇的存在,同样是“中字头”公司,并被给予厚望,中星有一些作为和影响,但还远远不够。比如中星的芯片,应该在“中国芯”大势下有所作为;比如SVAC编码技术,总体感觉“振臂一呼应者寥寥”。中星本次展示了围绕GB35114标准的产品及解决方案,SVAC2.0国家标准相关技术及应用成果,SVAC物联网相关应用及平台。

 

依图科技

 

依图展示了多项新技术应用:包括结构化检索技术,软件定义摄像机(是的,就是华为同款的SDC概念),人像大数据平台及小依机器人。依图结构化检索技术首秀:据称可在2秒内完成11类结构化信息分析,包括包括戴眼镜、墨镜、口罩、帽子、性别、年龄、胡须,发型,衣服款式、颜色、打电话,并通过结构化信息给识别的人物匹配相应的标签。这些结构化信息结合依图的人脸识别算法,能够在安防实战中为公安工作提供有力线索。

 

为了满足复杂场景需求,摄像机正在从单一功能的终端,变成多应用聚合的平台。本次展会上,依图展出了出两款摄像机:依图YT-CA320和依图YT-CA321,这两款摄像机集合了四大共同特性:姿态优化;极速抓拍,采用全帧率检测,出现0.2秒即可抓拍,出现即捕获;强大的同屏人数支持能力,在同屏100人时摄像机依然能保持对快速出现人脸的敏感性。

 

天地伟业

 

天地伟业以“星光看视界,AI见未来”为主题盛装亮相展示以“见”“多”“识”“广”为亮点的人工智能解决方案。天地的超星光已经发展到4.0,独特的TVP4.0视觉处理加上AI融合,能够在夜间进行人脸识别机车辆识别,效果较好。全景+实景指挥系统,天地警戒系列,智能交通一体机(天眼)、4K结构化一体机、人脸识别NVR、K2000视频综合平台,雪亮工程及智慧水利解决方案等展示,总体感觉重在行业解决方案,AI元素融合有限。

 

 

商汤科技

 

作为AI龙头,商汤貌似没有新东西推出。商汤力图呈现从“基础设施、平台、应用、端”的安全数据闭环产品体系及完整的智慧城市解决方案。商汤的“AI超算中心”属于秀肌肉,单精度总算力据说15亿亿次,什么概念?小编没啥感觉,就像说马云有多少钱一样。SenseFoundry方舟城市级视觉开放平台,定位于可扩展至十万路级别、千亿级别非结构化特征分析的开放视觉赋能平台,平台结合商汤最新的人脸深度学习算法,主要致力于城市级公共安全(平安城市、雪亮工程、智慧城市、城市大脑等)领域。



除此之外,还有SenseCity视频结构化系统、SenseCrowd人群分析系统、SenseTotem视图情报研判系统、SenseFace人脸大数据实战平台等多方应用优化城市管理效率。。对于终端层,仍推出了SenseDLC嵌入式识别算法,这个安天下去年有过解读,但被商汤说理解有误,今年还是没太理解。


 

智慧眼

 

智慧眼呈现了以计算机视觉为代表的AI技术在公共安全领域的应用成果,通过底层算法、平台软件系统、前端智能终端、后端智能服务器等完整应用环节全方位的展示,为广大客户和合作伙伴诠释了智慧眼完整的AI安防理念。


 

视频结构化大数据研判平台:对行人属性、车辆特征、公安人物画像进行结构化处理,通过后台数据统计、系统平台运维、大数据研判等,展示了视频结构化技术在平安城市、道路交通、城市综合治理等领域的实战应用。




 

慧眼、智脑系列:在展会上智慧眼展示了自主研发的FPGA智慧安防结构化摄像机、3559A智慧交通三合一摄像机、1/2项全局曝光摄像机等“慧眼”系列摄像机以及人脸识别嵌入式服务器、行为分析嵌入式服务器、车辆结构化嵌入式服务器等模块化可拆装嵌入式“智脑”系列服务器,将智慧眼基于前端智能分析的“慧眼”系列及后端处理分析的“智脑”系列AI终端产品全面推向安防市场。


  

比特大陆

 

继前几天芯片黑马比特大陆宣布进军安防,在安博会上,比特大陆展示了构建端云一体化的数款人工智能芯片及相关产品,还首次对外公布了与合作伙伴共同为平安城市、智能园区打造的解决方案。在云端,比特大陆拥有BM1680、BM1682两代人工智能芯片,基于两款芯片研发了深度学习加速卡、智能服务器等产品。在终端,比特大陆终端AI 芯片 BM1880 于今年 7 月成功流片,此次亮相安博会的还有基于该芯片的边缘计算开发板、USB人工智能算力棒、USB 人工智能模块,网络摄像头等产品,可快速应用在各类终端设备,使其拥有强大的人工智能能力。

 

在平安城市场景下,比特大陆一方面推出了基于BM1682 芯片的算丰智能服务器 SA3,单台可提供90 路视频结构化的计算能力,路数远超同类产品;相比传统厂商依靠GPU通用图形处理器而设计的服务器,性能功耗比提升 2 倍以上;另一方面联合千视通视觉科技、深瞐科技等合作伙伴推出了整体解决方案。


 

博思廷

 

博思廷本届安博会主题“ 智慧博思廷,懂你懂视频”,主要展示“全场景超融合智能视频全栈解决方案”(算法 + 平台软件 + 硬件设备),是基于自主知识产权(充分应用了自研的72种智能算法)研发的。本次展会在智慧地铁、智慧公安、智慧校园这三个展区展示的产品都是基于“全场景超融合智能视频全栈解决方案”实现的,所有产品都充分应用了AI、大数据、云计算等一系列前沿技术,再结合用户的实际需求以及博思廷全体员工多年的行业积累研发出来的。



在智慧地铁(小编所知博思廷在地铁智能安防深耕已久,很有实力)展区,展示了视频监控基础联网系统、动态人脸识别系统、人体结构化分析系统、客流统计分析系统、安防事件检测系统、人员状态检测系统、运维管理系统等。此外,本次展会博思廷还隆重推出了门槛极低的“千家计划”之“银牌合作伙伴计划”,加盟该“银牌计划”的签约合作伙伴无需任何加盟费或保证金即可享受到相应的服务支持,进一步降低了渠道合作门槛。

 

 

以萨技术

 

安防的本质还是应用,有些规模不大的企业,在安防某个领域做行业化及精细化,并取得不错成绩。对于海量数据的融合分析,进而形成线索,以萨的AI多维数据融合方案将平安城市静态信息(身份、户籍等)及动态数据(传感器、影像等)深度融合,形成多维数据档案库,实现刻画目标DNA的目的,以实现以车找人、以人找车、以物找人等。



 

华泰科捷

 

华泰科捷,携隼目Falcon X系列产品亮相安博会,共包含智能动态人脸检测终端、智能便携式人脸布控系统在内的8个展区。华泰科捷智能动态人脸检测终端,是华泰科捷推出的全新一代人脸检测产品。基于Targetface领先的深度学习神经网络算法,搭载高性能AI专用芯片进行边缘计算。


 

智能便携式动态人脸布控系统是华泰科捷推出的基于Targetface动态人脸识别算法,结合高清视频采集、LTE通信等技,实现高清视频的无线远程传输和现场快速人脸识别布控的产品。

 

 

寒武纪

 

在本届安博会上,寒武纪展区整体将分为“静态展区”、“算力展区”及“应用展区”三大主题板块。静态展区展示寒武纪端云一体全线产品,面向嵌入式终端和云端服务器;算力展区将通过算力对比让观众直观感受寒武纪产品性能和功耗比;应用展区聚焦智慧城市、机器视觉垂直领域,围绕业务不同需求展开多维度应用,应用方案LIVE演示。



值得推荐的是,寒武纪联合星宸半导体/SigmaStar(原MStar Smart Camera事业部)和的卢深视(国内三维视觉领域新锐公司)推出了集成寒武纪终端智能处理器IP产品的系统解决方案,以芯片+场景展示实际应用。

  

触景无限

 

触景无限发布了三款基于4K级视频感知技术的产品:立足前端的瞬视前端全能抓拍机、盾悟前端4K全能感知服务器,以及立足后端的盾悟1U机柜式4K视频感知服务器。触景无限实现了对4K级视频感知模块的复用,从前端到后端实现了全面的覆盖。4K级视频感知模块除了支持对1路4K、两路400万、4路1080p的视频进行实时处理之外,还可以同时将视频中的人、机动车、非机动车的等信息进行抓拍(支可扩展更多种视频元素的抓拍),支持20×20像素小人脸、同屏75+等特性。


腾讯



百度


 

其他


 

小结:


有人说为何安天下总关注大企业,应该阳光普照雨露均沾。小编一方面认为,安博会的确大型实力企业引领并提出一些趋势、观点或者新思路,尤其是,在AI时代,小型企业如果不是在某个细分领域做深做精,而是包装自己成一个高大上“安防+AI”全生态解决方案企业,基本不太可信。



本次安博会,如果想了解安防行业最大变数,请去华为展台;如果想重温外企安防精工品质,请去宇视科技;如果想了解新一代中字头AI企业何德何能力导国家人工智能平台,请去云从科技;如果想了解AI三级火箭落地最佳案例,请去云天励飞;如果想看融合海康和华为理念较好的AI企业,请去旷视科技;如果想了解“安防+AI”在细分行业深耕情况,请去科达;如果想了解平安城市VMS王牌平台厂商在AI上的融合情况,请去东方网力;如果想了解芯片独角兽如何发力安防,请去比特大陆和寒武纪;如果想了解小而美,低调落地场景的企业,请去智慧眼和以萨;如果想了解传统IVS算法升级AI架构后的落地情况,请去博思廷;如果想重温中安消的PPT概念安防模式,请去@H的城市之心了解一下;如果想感觉下穿越回到2017安博会,请去海康威视展台,那里的AI Cloud重新帮您加热了又端上来;如果想了解国内自主编码标准SVAC,请去中星电子;如果想了解安防集成商转型“AIoT”智联网方案商,请高新兴和力维;如果想感受一下去了展台跟没去一样,请去百度和腾讯展台;如果不想去但想了解一下安防趋势,请关注本公众号;如果看完本文想骂人,请在下面畅所欲言,不吐不快。



Viewing all 11857 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>