QCon上海2017观后感 – 意识

前一篇介绍了这次QCon上海中感受到的当前的风口走向,这篇则将介绍几个在多个演讲中交叉出现的一些东东,这些不是具体的框架、技术,而是更泛泛的经验和意识。

产品意识

技术团队如何从跟随业务到驱动业务?微盟的CTO结合他的实践经验,尝试对此进行了些探讨。

在业务上要勤于思考:

  • 核心目标客户群是什么?
  • 他们的痛点是什么,当前需要我们给他们提供些什么

Eric Ries曾在《精益创业实战》中提出MVP(minimum viable product)概念,意即“最简可行产品”——用最快、最简明的方式建立一个可用的产品原型,这个原型要表达出你产品最终想要的效果,然后通过迭代来完善细节。

图片

很多人都赞同MVP理论,但是实际操作起来却比听上去的要难的多:

继续阅读

QCon上海2017观后感 – 风口

AI的发展离不开场景,而AI最丰富的场景都在中国。如今AI除了下围棋、开汽车,还能做很多的事,实际上,现在每个领域后台、前台都需要考虑跟人工智能的结合,否则可能会失去先机。现在是AI站上风口的时代。

这次去听了两天QCon,除了广告很多以外,最大感受就是不知不觉的,机器学习、人工智能、AR等技术已经渗透到了各类业务中。但对于一个只在本科PRP项目里用SVM做微博情感分析的人来说,其实基本都听不懂的。。

所以下面就捡点我听懂了的说= =

增长黑客

将机器学习应用于个性化推荐上去,是目前很多内容为主的互联网公司都在做的事情,包括百度-feed流、B站-推荐视频等,意图让内容展现更合用户胃口,提升用户粘性。

Pinterest是一家为用户提供在线收藏和分享Pinterest视觉艺术图片服务的初创社交网站,它的机器学习主管工程师就介绍了Pinterest如何利用机器学习实现两亿月活跃用户,其通过在个性化主页中大规模使用机器学习,上线的一系列线性,迭代决策树和深度学习模型让 Pinterest 活跃用户数突飞猛进。
图片

继续阅读

【野路子实验室】移动端H5页面加载时间获取方法

本篇文章已经发表在了公众号上,这边再同步下。

======================================

先说两句

  1. 本文将介绍笔者近期实验的2种自动化获取移动端H5页面加载时间的方法,可能和大家平时一般使用的方式不同,在此抛砖引玉了。
  2. H5页面在Android Chrome浏览器中加载时,可以利用Chrome DevTools Protocol获取页面loading时长、所有加载的url、页面当前资源树等数据,也可以进行截图和模拟不同网络情况。
  3. 对于非Chrome非Native浏览器下,可以通过离线分析手机操作录屏,基于机器视觉进行网页动态加载过程的分析,获取每个加载事件的开始帧和结束帧,从而计算加载时间。

继续阅读

Web App新趋势——PWA

本篇文章已经发表在了公众号上,这边再同步下。

======================================

TL;DR

  1. PWA(Progressive Web Apps,渐进式网页应用)是Google推出的一种Web App形态,意图让 Web 在保留其本质(开放平台、易于访问、可索引)的同时, 在离线、交互、通知等方面达到类似 App 的用户体验。
  2. Web App测试的页面性能指标正逐渐转变为基于用户感知(e.g. First Paint、First Meaningful Paint、Time to Interactive、Time to Interactive),而不再是以往大家都习以为常的基于Web Event(e.g. load time、DomContentLoaded time)的指标。
  3. 国内特殊的移动网络环境对PWA并不算友好,但Web的开放和自由让我们愿意相信和等待PWA的春天。

移动Web的现状

首先,让我们来看几个数据:

  • 手机用户每个月使用的APP数量大约为27个,而每月访问Web网页的数量一般会超过100家…
  • 部分APP获得市场绝对优势地位之后,就会形成头部效应,前几名的APP占据了用户80%的使用时间,而其他的中小型APP则共同消耗了剩余20%…
  • 很多人需要非常有说服力的理由才会尝试一款新的APP,实际上移动用户每月安装APP的平均数量不到1个…

通过 adb logcat 查看日志

Android 日志系统提供了收集和查看系统debug输出信息的机制。

语法:

[adb] logcat [<option>] ... [<filter-spec>] ...

adb logcat 命令参数

参数:

  • adb logcat -b <buffer> – 加载一个可使用的日志缓冲区供查看,例如eventsradio。Android系统中有4个日志缓冲区:systemmaineventsradio,它们分别对应/dev/log文件夹下的4个日志文件。系统默认的是systemmain。该选项可以出现多次,用来指定多个日志缓冲区。

    Huis-MacBook:~ hui$ adb logcat -b system -b main -b events -b radio
    --------- beginning of radio
    --------- beginning of events
    --------- beginning of main
    --------- beginning of system
    ...

  • adb logcat -c – 清除所有日志并退出
  • adb logcat -d – 输入日志到屏幕上并退出
  • adb logcat -f <filename> – 输出日志到设备文件中,默认是stdout。如果想要输出到本机的话,可以采用如下形式:
    adb logcat > test.log

    这样日志就输出在命令执行的当前目录的test.log文件中

  • adb logcat -g – 打印指定的日志缓冲区的大小并退出
  • adb logcat -n <count> – Sets the maximum number of rotated logs to. The default value is 4. Requires the -r option.
  • adb logcat -r <kbytes> – Rotates the log file every of output. The default value is 16. Requires the -f option.
  • adb logcat -s – 设置默认过滤级别为silent,也就是tag默认不显示。系统把tag的默认过滤级别是Verbose。
  • adb logcat -v <format> – 设置日志输出格式,默认是brief

Android性能测试之网络流量

本篇文章已经发表在了 微信公众号搜狐号里,小站这边也再同步下。

============

APP的网络流量消耗对于用户来说是较为敏感的,因为有可能会和钱挂钩。若APP开发时在这方面没有控制好,很有可能会给用户带来不好的体验。

上周我们介绍了CPU相关的性能测试,那这次我们就将简要介绍下网络流量相关的统计。

名词解释

网络流量是指,能够连接网络的设备在网络上所产生的数据流量。

性能数据给出的网络流量性能数据可以区分接收流量和发送流量:

  • 接收流量:应用运行期间,网卡的下行流量,单位是字节
  • 发送流量:应用运行期间,网卡的上行流量,单位是字节

在Gitlab-CI中持续集成Xcode工程

本文主要研究了如何在Gitlab-CI系统中集成Xcode工程的方法,主要包含以下内容:

  • 项目实施的环境及搭建方法.
  • 使用shell脚本构建Xcode工程.
  • 构建前预处理.
  • 构建后发布测试.
  • Gitlab-CI的集成.

项目背景及环境

Gitlab与Gitlab-CI的介绍.

CI端配置:

Runner端配置:

  • Mac OSX 10.10.3
  • gitlab-ci-multi-runner 0.3.3 (dbaf96f), 安装及配置
  • Xcode 6.3.2 (6D2105)

继续阅读

Hubot插件开发:井字游戏

Hubot插件开发:井字游戏

此项目实施的主要目的:

此项目实现的主要目标:

  • Slack上与Robot或者好友进行TicTacToe的对战.

此文主要记录项目实施的过程与结果,适合小白用户阅读.

搭建项目环境

已有基础环境

  • 操作系统: Mac OSX 10.10.4
  • Node.JS:0.12.2
  • npm:2.7.5
  • redis-server:3.0.0

第一步,我们创建本项目所使用的文件根目录

mkdir tttgame cd tttgame 

第二步,创建hubot-tictactoe项目,参考官方Example结构:

mkdir hubot-tictactoe cd hubot-tictactoe npm init 

第三步,我们直接创建一个本项目专用的tttbot(Hubot完整安装使用方式请参见官网):

mkdir tttbot cd tttbot yo hubot 

第四步,在tttbot中安装hubot-tictactoe脚本:

cd tttbot npm link ../hubot-tictactoe 

第五步,编辑 tttbot/external-scripts.json, 增加hubot-tictactoe.
继续阅读

web开发学习中踩过的坑

web开发新人一枚,记录下自学过程中踩过的坑和小tip

前端

【CSS】

1. px不是绝对单位,是相对长度单位
px不是绝对单位,是相对长度单位,是相对于显示器屏幕分辨率而言的;
不是所有的地方都用px,line-height就不是,应该类似 line-height: 90%

2. float:left/right 或者 position: absolute 后不需要写 display:block,画蛇添足

3.子浮动会导致父元素高度塌陷,需要闭合浮动

4. 不要全篇div,要注意标签语义化,将div用在定义页面的主要框架结构(头部、内容、边栏、底部等结构)

【javascript】

1. 用form.submit(); 提交时报错:Uncaught TypeError: object is not a function
原因:
表单存在元素id为submit,form.submit()进行表单提交时,实际选中的就是id为submit的object,
可以通过console.log(form.submit); 查看

form是一个HTML Collection object,是 a list of nodes,可以通过index或者id或元素的name来引用这些节点
所以,最初造成object is not a function的原因是,form.submit的这个节点元素对象,把form的submit方法覆盖了,
id名和方法冲突后,将form.submit认作是操作了id为submit的这个元素。

解决方法:将id为submit的换成其他id名
或者将在submit处的onclick事件响应换到form处的onsubmit响应。
继续阅读

Hadoop排序工具用法小结

Hadoop用于对key的排序和分桶的设置选项比较多和复杂,目前在公司内主要以KeyFieldBasePartitioner和KeyFieldBaseComparator被hadoop用户广泛使用。

基本概念:

Partition:分桶过程,用户输出的key经过partition分发到不同的reduce里,因而partitioner就是分桶器,一般用平台默认的hash分桶也可以自己指定。
Key:是需要排序的字段,相同分桶&&相同key的行排序到一起。

下面以一个简单的文本作为例子,通过搭配不同的参数跑出真实作业的结果来演示这些参数的使用方法。
假设map的输出是这样以点号分隔的若干行:

d.1.5.23
e.9.4.5
e.5.9.22
e.5.1.45
e.5.1.23
a.7.2.6
f.8.3.3

我们知道,在streaming模式默认hadoop会把map输出的一行中遇到的第一个设定的字段分隔符前面的部分作为key,后面的作为value,如果输出的一行中没有指定的字段分隔符,则整行作为key,value被设置为空字符串。 那么对于上面的输出,如果想用map输出的前2个字段作为key,后面字段作为value,并且不使用hadoop默认的“\t”字段分隔符,而是根据该文本特点使用“.”来分割,需要如何设置呢

bin/hadoop streaming -input /tmp/comp-test.txt -output /tmp/xx -mapper cat -reducer cat \
-jobconf stream.num.map.output.key.fields=2 \
-jobconf stream.map.output.field.separator=. \
-jobconf mapred.reduce.tasks=5

继续阅读