月度归档: 2021 年 7 月

Jetpack Compose 1.0 发布了,移动端与桌面端分别体验如何?

24 条回复    2021-07-30 15:16:10 +08:00

3dwelcome
    1

3dwelcome   1 天前

教育机构狂喜,新技术代表新的培训项目,又能收割一批新的小白学员了。

开发者嘛,管你性能好不好,现在要开发都用三端统一的 UI 解决方案( web,android,ios),单独为安卓开发,又费钱又浪费时间,过了几年,发现自己是用爱给 Google 团队发电。

以前 XML 还能丢给美术,设计一下 UI 界面美感。现在 Compose 这种纯代码声明 UI,找哪个设计师帮你写设计代码?又不是人人都是技术美术,普通理科码农手写 UI 代码,巨丑。

nicocho
    2

nicocho   23 小时 32 分钟前

上午刚准备了解下 jetpack , 一篇文章给出的数据如下

构建时间能够 减少 29%
XML 行数大幅减少了 76%
APK 大小缩减了 41%
方法数减少了 17%

Cloud9527
    3

Cloud9527   23 小时 17 分钟前

@3dwelcome 基本没有培训 Android 的了。。。我认识一些开发还没用这个
meteor957
    4

meteor957   22 小时 32 分钟前

早几年估计是个大新闻,现在 Android 开发快要灭*的情况下,除了卖课的感觉都没啥人关注
pocarisweat
    5

pocarisweat   22 小时 6 分钟前

就算是 Java 也比 Electron 看着顺眼啊,哎
fescover
    6

fescover   21 小时 51 分钟前

哪天支持 ios 就学
tanranran
    7

tanranran   19 小时 25 分钟前

基于 canvas 的,性能上会比 xml 好一些,个人猜测,后期会和 flutter 大融合?
aabbcc112233
    8

aabbcc112233   19 小时 21 分钟前 via Android   ❤️ 1

@3dwelcome 请问哪个公司 xml 给 UI 来写????
Michelangelono
    9

Michelangelono   19 小时 17 分钟前

@nicocho apk 体积如何做到的减少?毕竟 jetpack 实际是增加了很多依赖。
coolmint
    10

coolmint   19 小时 6 分钟前 via iPhone

我在 rc1 的时候把 compose 引入到项目中来,简单重写了一个界面,感觉还是不错的,当然和纯用 compose 构建的项目还是区别比较大的,以后准备用 compose 做更多的页面进一步深度体验
3dwelcome
    11

3dwelcome   18 小时 59 分钟前 via Android

@aabbcc112233 xml 有可视化编辑器,UI 设计师来改个颜色,弄个字体大小和样式总没问题吧。
compose 可就全部都是代码了。
aabbcc112233
    12

aabbcc112233   18 小时 50 分钟前   ❤️ 2

@3dwelcome 没听说过 UI 有这个能力,也没听说过哪个公司让 UI 参与 xml 布局
Yadomin
    13

Yadomin   18 小时 46 分钟前

别的不说,用 Jetpack Compose 重写的 Idea Toolbox 已经烂了
Yadomin
    14

Yadomin   18 小时 46 分钟前

内存占用比肩 Electron
maninfog
    15

maninfog   18 小时 42 分钟前 via iPhone

体验还是不错的,将数据驱动 UI 的思想贯彻到了*致,声明式 UI 有一种用了回不去的感觉。

首先底层还是基于 Skia,还是 canvas 那一套,所以和 view 的互操作性很高,可以渐近的接入。Dialog 看了下底层还是原生的包了下。

*开始担心没有实时 preview 写起来不习惯,后面发现渐渐习惯了也还好,也会尝试着写完一个页面再调试,不再依赖预览。

如果你的设计是 MD,用 Compose 会很舒服,内置丰富的 MD 控件; Compose 处理换肤也是轻而易举,想想使用 view 时,一些换肤框架还要去 hook LayoutInflater 有点头皮发麻…

至于坑的话,个人觉得就是刚出来,还没有状态管理的*佳实践,另外就是页面组织不好的话阅读起来有点困难。

3dwelcome
    16

3dwelcome   18 小时 5 分钟前

@aabbcc112233 XML 是数据描述,是可以和内部工作流一些可视化工具桥接的。*终给 UI 展示的,就是普通 low code 设计软件操作界面。

但是 Compose 的组件都是偏手写代码,很难和工具整合。界面也代码和逻辑都混在一起,不好分离。对 UI 来说,改一点点,都异常困难。

国内的需求本来就是改的多,只有很少团队是完全按照设计稿一次成型的。

MakHoCheung
    17

MakHoCheung   18 小时 1 分钟前

@Yadomin 这个不同,compose for desktop 底层还是 基于 Swing,而且还是 alpha 阶段,不急
0bit
    18

0bit   17 小时 58 分钟前

按照折腾 SwiftUI 的教训,尽量还是多等等吧
3dwelcome
    19

3dwelcome   17 小时 30 分钟前

@maninfog “想想使用 view 时,一些换肤框架还要去 hook LayoutInflater 有点头皮发麻”

google 用 xml 的初衷应该是为了界面灵活多变,然而为了性能,*后弄了个谁都看不懂的二进制 XML 格式,还和资源强关联,想改都改不了。活生生把开发者的一些道路给堵死。

如果 LayoutInflater 用的全部都是明文 XML,也不至于沦落到今天这个尴尬的下场。

sunbreak
    20

sunbreak   9 小时 49 分钟前

@MakHoCheung 不是基于 Swing,是基于 https://github.com/JetBrains/skija/

但确实保持了和 Swing 、JavaFx 框架的互操作性: https://blog.jetbrains.com/cross-post/jetpack-compose-for-desktop-milestone-2-released/

MakHoCheung
    21

MakHoCheung   8 小时 18 分钟前

@sunbreak 我知道它是用 skija 渲染,但是你点进去看 window,还是 swing 的 window 。
ingramyang
    22

ingramyang   8 小时 7 分钟前 via Android

没有用,就是 flutter 的复制品。但是 flutter 可以做到一套 UI 代码多平台运行,可 compose 的桌面和移动端 UI 接口都不一样,所以没啥用这东西。
wobuhuicode
    23

wobuhuicode   7 小时 40 分钟前

用了 5 年 react-native 都没有一个正式版……
james2013
    24

james2013   2 小时 11 分钟前

个人觉得这个功能很垃圾,xml 能够很好的分离逻辑和界面,这个功能又把界面和逻辑搞在 java 里,复制的界面 xml 布局几百行,甚至要分几个 xml 导入,方便管理

实用!五款新型 Linux 命令行工具

在Linux/Unix系统的日常使用中,我们需要使用很多命令行工具来完成工作,以及理解和管理我们的系统,例如使用du来监视磁盘利用率、top来显示系统资源。有些工具已经有很长的历史了。例如,top于1984年首次发布,而du的首次问世可追溯至1971年。

多年来,这些工具已经过现代化的改造,并移植到了不同的系统中,但总的来说,它们仍然保留了*初的想法、外观和感觉。

这些工具都非常优秀,对于许多系统管理员的工作流程来说都是必不可少的。但近年来,开源社区开发了不少更具优势的替代工具。虽然有些工具华而不实,但有些则大大提高了实用性,成为了现代系统的*佳选择。 在本文中,我将介绍五种标准Linux命令行工具的替代品。

%title插图%num

du的替代:ncdu

 

NCurses磁盘使用率(NCurses DiskUsage,即ncdu)工具提供了与du类似的结果,但其基于curses的交互式界面可以显示消耗了大部分磁盘空间的目录。

首先Ncdu需要花一些时间分析磁盘,然后按照*常用的顺序显示目录或文件,如下所示:

  1. ncdu 1.14.2 ~ Use the arrow keys to navigate, press ? for help
  2. — /home/rgerardi ————————————————————
  3.    96.7 GiB [##########] /libvirt
  4.    33.9 GiB [###       ] /.crc
  5.     7.0 GiB [          ] /Projects
  6. .   4.7 GiB [          ] /Downloads
  7. .   3.9 GiB [          ] /.local
  8.     2.5 GiB [          ] /.minishift
  9.     2.4 GiB [          ] /.vagrant.d
  10. .   1.9 GiB [          ] /.config
  11. .   1.8 GiB [          ] /.cache
  12.     1.7 GiB [          ] /Videos
  13.     1.1 GiB [          ] /go
  14.   692.6 MiB [          ] /Documents
  15. 591.5 MiB [          ] /tmp
  16.   139.2 MiB [          ] /.var
  17.   104.4 MiB [          ] /.oh-my-zsh
  18.    82.0 MiB [          ] /scripts
  19.    55.8 MiB [          ] /.mozilla
  20.    54.6 MiB [          ] /.kube
  21.    41.8 MiB [          ] /.vim
  22.    31.5 MiB [          ] /.ansible
  23.    31.3 MiB [          ] /.gem
  24.    26.5 MiB [          ] /.VIM_UNDO_FILES
  25.    15.3 MiB [          ] /Personal
  26.     2.6 MiB [          ]  .ansible_module_generated
  27.     1.4 MiB [          ] /backgrounds
  28.   944.0 KiB [          ] /Pictures
  29.   644.0 KiB [          ]  .zsh_history
  30.   536.0 KiB [          ] /.ansible_async
  31.  Total disk usage: 159.4 GiB  Apparent size: 280.8 GiB  Items: 561540

你可以通过方向键导航到每个结果。如果在选中的结果上按下Enter,则ncdu将显示该目录的内容:

  1. — /home/rgerardi/libvirt —————————————————-
  2.                          /..
  3.    91.3 GiB [##########] /images
  4.     5.3 GiB [          ] /media

你可以深入各个目录,找出哪些文件占用的磁盘空间*多。使用左方向键可以返回到上一个目录。在默认情况下,你可以按d键删除文件,但在删除文件之前ncdu会要求确认。如果你想禁止删除操作以防止发生意外,则可以通过-r选项设置只读访问:ncdu -r。

ncdu可用于许多平台和Linux发行版。例如,你可以使用dnf从官方代码库直接将其安装在Fedora上:

$ sudo dnf install ncdu

更多有关该工具的信息,请参见:https://dev.yorhel.nl/ncdu。

%title插图%num

top的替代:htop

 

htop是一个类似于top的交互式进程浏览器,提供了更好的用户体验。在默认情况下,htop显示的各项指标与top相同,而且是漂亮的彩色。

默认的htop如下所示:

%title插图%num

与默认的top相比:

%title插图%num

此外,htop的顶部还提供了系统的概述信息,底部的命令栏则显示了功能键命令,你还可以按下F2进入设置页面来自定义界面。在设置页面中,你可以更改其颜色,添加或删除指标、更改概述栏的显示选项。

虽然top的*新版本也可以通过配置获得相似的结果,但htop提供的默认配置更为合理,作为一个进程浏览器更加易于使用。

如果想了解有关该项目的更多信息,请查看htop主页(https://hisham.hm/htop/)。

%title插图%num

man的替代:tldr

 

tldr命令行工具显示可以简化的命令文档,而且大部分文档都提供示例。它是tldr pages项目(https://tldr.sh/)的客户端。

这个工具不是man的替代品。man pages仍然是许多工具的规范以及完整的信息源。但是,在某些情况下,man的内容太多了。有时,你不需要有关命令的所有信息。你只需要记住基本选项。例如,curl命令的man page几乎有3,000行。相比之下,curl的tldr只有40行,如下所示:

  1. $ tldr curl
  2. # curl
  3.   Transfers data from or to a server.
  4.   Supports most protocols, including HTTP, FTP, and POP3.
  5.   More information: <https://curl.haxx.se>.
  6. – Download the contents of an URL to a file:
  7.   curl http://example.com -o filename
  8. – Download a file, saving the output under the filename indicated by the URL:
  9.   curl -O http://example.com/filename
  10. – Download a file, following [L]ocation redirects, and automatically [C]ontinuing (resuming) a previous file transfer:
  11.   curl -O -L -C – http://example.com/filename
  12. – Send form-encoded data (POST request of type `application/x-www-form-urlencoded`):
  13.   curl -d ‘name=bob’ http://example.com/form                                                                                            
  14. – Send a request with an extra header, using a custom HTTP method:
  15.   curl -H ‘X-My-Header: 123’ -X PUT http://example.com                                                                                  
  16. – Send data in JSON format, specifying the appropriate content-type header:
  17.   curl -d ‘{“name”:”bob”}’ -H ‘Content-Type: application/json’ http://example.com/users/1234
  18. … TRUNCATED OUTPUT

TLDR的全称是“too long; didn’tread”(太长;未读),这是一句网络流行语,表示文章太长。这个名字非常适合这个汇总工具,因为manpages虽然非常实用,但内容太长。

在Fedora中,tldr客户端是用Python编写的。你可以使用dnf安装。有关其他客户端选项,请参见tldr pages项目(https://tldr.sh/)。

通常,tldr工具需要访问互联网才能查询tldr页面。Fedora中的Python客户端允许你下载和缓存这些页面以供离线访问。

有关tldr的更多信息,请运行tldr tldr。

%title插图%num

用sed/grep查找JSON数据的替代:jq

 

jq是JSON的命令行处理器。就像sed或grep一样,但主要是为了处理JSON数据。如果你是日常任务需要使用JSON的开发人员或系统管理员,那么这是你的工具箱中必不可少的工具。

与通用文本处理工具(例如grep和sed)相比,jq的主要优点在于它了解JSON数据结构,你可以通过一个表达式创建复杂的查询。

举例说明,假设你正在尝试在下列JSON文件中查找容器的名称:

  1. {
  2.   “apiVersion”“v1”,
  3.   “kind”“Pod”,
  4.   “metadata”: {
  5.     “labels”: {
  6.       “app”“myapp”
  7.     },
  8.     “name”“myapp”,
  9.     “namespace”“project1”
  10.   },
  11.   “spec”: {
  12.     “containers”: [
  13.       {
  14.         “command”: [
  15.           “sleep”,
  16.           “3000”
  17.         ],
  18.         “image”“busybox”,
  19.         “imagePullPolicy”“IfNotPresent”,
  20.         “name”“busybox”
  21.       },
  22.       {
  23.         “name”“nginx”,
  24.         “image”“nginx”,
  25.         “resources”: {},
  26.         “imagePullPolicy”“IfNotPresent”
  27.       }
  28.     ],
  29.     “restartPolicy”“Never”
  30.   }
  31. }

如果你利用grep直接查询name,则结果为:

  1. $ grep name k8s-pod.json
  2.         “name”“myapp”,
  3.         “namespace”“project1”
  4.                 “name”“busybox”
  5.                 “name”“nginx”,

grep会返回所有包含单词name的行。你可以在grep中添加一些其他选项来限制查询结果,并通过正则表达式操作找到容器的名称。在使用jq获得所需结果时,你只需要使用一个模拟向下导航数据结构的表达式,如下所示:

  1. $ jq ‘.spec.containers[].name’ k8s-pod.json
  2. “busybox”
  3. “nginx”

该命令会返回两个容器的名称。如果你只想查看第二个容器的名称,则可以在表达式中添加数组元素索引:

  1. $ jq ‘.spec.containers[1].name’ k8s-pod.json
  2. “nginx”

因为jq能够理解数据结构,所以即使文件格式稍有变化,它也可以提供相同的结果。但对于grep和se来说,格式稍有变化提供的结果就会完全不同。

jq还有很多功能,我需要用另写一篇文章才能介绍其所有的功能。有关更多信息,请参见jq项目页面(https://stedolan.github.io/jq/)、manpages或tldr jq。

%title插图%num

find的替代:fd

 

fd是find命令的一种简单快速的替代。它的目的不是替换find的功能,而是提供一些合理的默认值,在某些情况下非常有用。

例如,在包含Git代码库的目录中搜索源代码文件时,fd会自动排除隐藏的文件和目录(包括.git目录),并忽略.gitignore文件中的模式。通常,它可以更快地查询,并提供相关度更高的结果。

在默认情况下,fd会针对当前目录执行不区分大小写的模式搜索,并输出彩色的结果。使用find进行的相同搜索时,你需要提供其他命令行参数。例如,搜索当前目录中所有的markdown文件(即.md或.MD文件),find命令如下所示:

$ find . -iname "*.md"$ find . -iname "*.md"

而如下fd搜索能够返回相同的结果:

$ fd .md

在有些情况下,fd也需要其他选项。例如,如果想让搜索包括隐藏的文件和目录,则必须使用选项-H,而find则不需要。

fd可用于许多Linux发行版。在Fedora中安装fd可使用标准代码库:

$ sudo dnf install fd-find

有关更多信息,请请见fd的GitHub代码库(https://github.com/sharkdp/fd/)。

%title插图%num

优秀的替代工具与久经考验的实用程序

 

尽管我还是习惯使用旧工具,尤其是在远程连接到服务器时,但新的替代工具提供了额外的好处,而且在许多情况下都很有帮助性。特别是帮助我在Linux台式机和笔记本电脑上管理和工作。

你是否使用其他工具来处理工作流程?请在下方留言。

原文:https://opensource.com/article/20/6/modern-linux-command-line-tools

Android adb 客户端是如何检测到自定义服务端端口的?

adb 客户端能自动发现局域网中的 adb 服务端,当我手机开启 wireless adb 后,总能收到局域网内其他客户端发出的连接请求,开始以为是通过探测默认端口 5555 实现的,但我把服务端端口改成其他后,仍然能收到连接请求,不知道这是如何实现的,难道是服务端主动向局域网内广播自己的配置?

7 条回复    2021-07-30 12:35:01 +08:00

learningman
    1

learningman   1 天前

我知道有个叫 SSDP 的协议,估计是差不多的东西吧
yukiww233
    2

yukiww233   1 天前

问下局域网内其他人(adb client)是怎么发送请求连接的呗
没准人家写了个工具遍历局域网内端口
wjploop
    3

wjploop   1 天前

有趣的问题

我也认为不是服务端自己广播自己的配置,手机不该浪费自己电量来做这事,而是客户端主动探测出来的。

客户端如何探测?

使用 nmap 工具查询当前局域网活跃的主机以及开放的端口 /服务,我下载玩了会,当手机开放无线 adbd 时确实可以检测到,且手机开放的端口很少,根据手机开放端口很少这点,客户端只要尝试连接就行了。

不知道现实中你指的客户端是谁,可能是公司的测试人员?由于 IP 动态分配的原因连上了你手机?

jim9606
    4

jim9606   1 天前   ❤️ 3

Android 的 adbd 激活无线调试后会通过 mDNS 发布一个_adb-tls-connect._tcp 服务。
adb v30 开始设置环境变量 ADB_MDNS_OPENSCREEN=1 后,adb devices 会利用 mDNS 自动发现设备。
andyskaura
    5

andyskaura   1 天前

@jim9606 感谢 涨姿势了 通过 mdns 发现设备
MLawliet
    6

MLawliet   23 小时 31 分钟前

@wjploop 目前发现是局域网中跑着 Android studio 、Unity 这类工具的设备会主动向开启无线的 adbd 发起连接请求,这些设备上肯定没有人为跑检测程序

@jim9606 非常感谢,*次知道 mDNS…

xingstar
    7

xingstar   4 小时 36 分钟前

真是学习了,感谢(⊙o⊙)…

aabbcc112233
    8

aabbcc112233   1 天前

@MLawliet AS 怎么能够向已开启无限调试的设备发起连接呢?没看到入口
MLawliet
    9

MLawliet   4 小时 22 分钟前

@aabbcc112233 自动的啊,AS 会自动执行 adb devices 命令查找局域网内开启调试的设备然后连接

开发的一个 App,在华为(HMOS)手机上被华为风险管控中心检测出病毒

开发的一个 App,在华为(HMOS)手机上被华为风险管控中心检测出病毒

大家有遇到过么?如何处理?

安装到华为手机上后,在风险管控中心报出风险应用,提示:

感染病毒:Risk/Android.E_Ads.Rogue
危险等级:中
详情:[流氓广告]应用包含影响功能正常使用或者难以关闭的流氓广告,请谨慎使用。

我们的应用非常正规,只接了几家大厂的广告 SDK,如穿山甲、百度、广点通等,无其它小厂或者不明来路的广告 SDK 。

测试也给出一个奇怪的情况:同一批打出来的渠道包,只有 sc_vivio 渠道安装后会报这个,其它渠道未有发现。

谢谢各位 V 友大神们的响应。

11 条回复    2021-07-30 03:18:26 +08:00

dorothyREN
    1

dorothyREN   3 天前

直接不兼容华为就完事了。
alfchin
    2

alfchin   3 天前 via iPhone   ❤️ 5

一看就是 vivo 渠道打包的有问题
联系 vivo 那边协调看看
luodaoyi
    3

luodaoyi   3 天前   ❤️ 2

vivo 在搞事情
tin3w5
    5

tin3w5   3 天前 via iPhone   ❤️ 2

强势点,支持好 android 和 iOS 就好了。臭毛病不能惯着当你把它养肥了,他才不会记得你的好,不像 Google 、Apple 一样用各种规则打击你这种创作者就不错了。

这也许是你唯一一次机会对强权说不——上学的时候可能被老师强迫、家里可能被父母强迫、接受教育被应试教育强迫、公司里可能还要被老板强迫 996/007 。这来之不易的机会,难道不应该好好珍惜吗?

araraloren
    6

araraloren   3 天前   ❤️ 4

@tin3w5 这边建议你不要生出来,不然就会被强迫
hxk1990
    7

hxk1990   3 天前   ❤️ 2

@dorothyREN 脑子有泡?
ETO
    8

ETO   3 天前

@dorothyREN 嗯?
iiusky
    9

iiusky   3 天前

楼上都不审题吗?都没看到只有某渠道打包出来有这个问题?和华为有毛关系?
jinhan13789991
    10

jinhan13789991   2 天前

不是,你 vivo 的渠道包为啥安装在华为手机上? 这不是矛盾吗?

tomato1111
    11

tomato1111   13 小时 45 分钟前 via Android

你是不是被 vivo 二次打包了。。。用 v2 签名了吗

何时运行 A/B 测试,亚马逊、微软、谷歌等大厂是怎么做的?

不久前,在谈及“抖音”名字是怎么来的时,字节跳动副总裁解释了这个是基于 A/B 测试排在第二的结果,而 A/B 测试到底是什么?

事实上,在产品研发及落地过程中,用户体验一直是开发商关心的重点方向之一。通常他们会基于一款产品进行 A/B 测试,即在同一时间维度,分别让组成成分相同的目标人群随机访问此产品的不同版本,继而收集用户体验数据和业务数据,*后分析、评估出*好版本,进而采纳使用。

在本文中,我们将从亚马逊、微软、谷歌的案例中学习 A/B 测试的应用。

%title插图%num

对有意运行线上对照实验的公司/机构来说,有三个关键的宗旨:

宗旨1:该机构想要进行数据驱动决策,且有正式的 OEC

很少听到一个机构的领导层说他们不追求数据驱动(乔布斯领导的苹果公司是个著名的例外,Ken Segall(乔布斯时代为苹果策划广告的创意总监)宣称:“我们不测试任何广告。印刷品、电视、广告牌、网页、零售或者任何形式的广告都不测试。”。然而测量新功能给用户带来的额外好处是有成本的,且目标测量通常会显示进展不如预期设想的顺利。很多机构不会将资源用于定义和测量进展。更简单的做法是生成一个计划并实施它,然后宣告成功。关键指标则设立为“计划实施的百分比”,而忽视新功能对关键指标是否有任何正面影响。

要做到数据驱动,机构应当定义一个在较短期间内(例如一、两星期内)能够便利测量的 OEC(综合评估标准)。大型机构也许有多个 OEC 或者多个关键指标,经细化后为不同领域所共用。难点在于找到这样的指标:短期内可测量、足够灵敏以检测到差别,并且可以以此预测长期目标。例如,“利润”不是一个好的 OEC,一个短期的操作(如提高价格)可以增加短期利润,但可能会降低长期利润。客户终生价值则是战略上很有力的 OEC。对 OEC 达成一致且以 OEC 来协调整个组织的重要性怎么强调都不过分。

有时,人们也用“数据启示”(data-informed)或“数据感知”(data-aware)来避免对仅依赖单一数据来源(如对照实验)“驱动”决策的误解。本书将数据驱动和数据启示作为同义词使用。*终,决策的形成应基于多方数据来源,包括对照实验、用户调研、新代码维护成本的预估等。数据驱动或数据启示的机构会收集各种相关的数据来驱动决策,并告知 HiPPO(Highest Paid Person’s Opinion,*高薪者的意见),而不是依靠直觉。

宗旨2:该机构愿意为运行对照实验投资基础设施和测试,并确保实验结果是可信赖的

在通过软件工程师的工作就能满足对照实验运行的必要条件的线上软件领域(网站、移动端、桌面应用和线上服务):能够可靠地随机分配用户;能够收集数据;能够相对容易地对软件进行改动,比如增加新的功能。即便是规模较小的网站也有足够的用户数量以运行必要的统计测试。

正如 Eric Ries 在《精益创业:新创企业的成长》一书中所推崇的,对照实验在与敏捷软件开发、客户开发流程以及*简可行产品(Minimum Viable Product, MVP)相结合时格外有效。

在某些其他领域,可靠地运行对照实验可能比较困难甚至完全不可行。对照实验所需的某些干预在医药领域可能是不道德的或不合法的。某些硬件设备的生产交付时间可能较长且难以修改,因此*少在新的硬件设备(例如新手机)上运行基于用户的对照实验。在这些情况下,我们可以用其他的技术,比如补充技法。

假如可以运行对照实验,那么就要确保实验结果的可信赖性。从实验中获得数据是简单的,但是获得可信赖的数据是困难的。

宗旨3:该机构意识到其无法很好地评估想法的价值

团队认为一个产品功能有用才会去开发它,然而,很多领域的大部分想法都无法提升关键指标。在微软,被测试过的想法里仅有三分之一能改善目标指标。在已经高度优化的产品领域,如必应和谷歌,想要成功就更难了,测试的成功率仅在 10%~20% 之间。

Slack 的产品生命周期总监 Fareed Mosavat 曾发推特称,在 Slack 只有 30%的商业化实验显示正向结果。“如果在一个实验驱动的团队工作,你得习惯这一点,你的工作至少有 70% 可能会被弃置。要据此建立你的工作流程。”

Avinash Kaushik 在 “Experimentation and Testing primer”一文中写道:“80% 的时间我们都搞错了客户需要什么。”Mike Moran 曾称奈飞认为他们尝试过的东西有 90% 是错的。Quicken Loans 的 Regis Hadiaris 称:“在我做实验的五年里,我猜对结果的正确率和联盟棒球手击中球的概率差不多。是的,我做了五年,只能‘猜’对33%的实验结果!”。Etsy的Dan McKinley 称“几乎所有都是失败的”,而对产品功能,他说:“我们谦虚地认识到初次尝试就成功的功能是很少见的。我强烈认为这一经验是普遍的,只是没有被普遍地意识到或承认。”*后, Colin McFarland 在 Experiment! 一书中写道:“无论你认为多么不费吹灰之力,做了多少研究,或者有多少竞争者正在做,有时候想法就是会失败,并且失败的频率比你预期的更高。”

不是所有领域的数据都是这么差,但是大多数运行对照实验的面向客户的网站和应用程序都认识到这个无法改变的现实:我们不擅长预判想法的价值。

%title插图%num

随时间推移的改进

在实践中,关键指标的改进是由很多 0.1%~2% 的小改动积累而来的。很多实验仅影响一部分用户,所以你需要将一个作用于 10% 用户的 5% 的影响稀释,从而得到一个小很多的影响(如果实验的触发群体和其他用户类似,那么稀释后的影响就是 0.5%)。正如阿尔·帕西诺在电影《挑战星期天》里所说:“……成功是一寸一寸实现的。”

1.1 谷歌广告的例子

在经历超过一年的开发和一系列的实验后,谷歌在 2011 年发布了一套经过改进的广告排序系统。工程师们在已有的广告排序系统里开发并测试了新改进的模型,以测量广告的质量分数,也开发并测试了对广告竞价系统的改动。他们开展了上百个对照实验和多次迭代,有些实验横跨多个市场,有些则在某一市场长期运行,以深度了解广告商受到的影响。这一大型的后端改动—以及运行对照实验—*终验证了规划和叠加多个改动可以通过提供更高质量的广告改善用户体验,并且高质量广告的更低价格也提升了广告商的体验。

1.2 必应关联算法的例子

必应几百人的关联算法团队每年的任务就是将单个 OEC 指标提高 2%。这 2%由当年发布给用户的所有对照实验的实验效应(即 OEC 的增量)相加而成(假设可简单相加)。由于该团队每年运行上千个实验,有些实验会因为偶然性出现正向结果,2% 的贡献取决于一种重复实验:一旦某个想法的实现在经过多次迭代和优化之后成功了,一个单对照组的认证实验就会开始运行。这个认证实验的实验效应决定了对 2% 这一目标的贡献。*近的研究建议缩减实验效应以提高精确度。

1.3 必应广告的例子

必应的广告团队每年持续地给营收带来15%~25%的增长(eMarketer 2016),但是大部分的提高都是一点一点完成的。每个月会发布一个打包了多项实验结果的“包裹”,如下图所示。多数都是小的改进,有些甚至因为空间限制或法律法规要求而给营收带来负增长。十二月左右的季节性激增很有信息量。在十二月,随着用户的购物意图显著提高,广告空间也相应增加,搜索带来的营收也随之提高。

%title插图%num

必应广告营收随时间的变化 (y 轴代表每年增长大约 20%),具体数字不重要

%title插图%num

有趣的线上对照实验实例

有趣的实验是指那些预期结果和实际结果相差很远的实验。如果你认为一件事情会发生,然后它真的发生了,那么你不会学到什么。如果你认为一件事情会发生,但没有发生,那么你会学到一些重要的东西。如果你原本认为一件事情不值一提,但它带来了惊人的或突破性的结果,那么你会学到一些非常有价值的东西。

经久的进步来自持续的实验和很多小的改进,这里介绍的几个有惊人效果的例子表明了我们有多不擅长预估想法的价值。

2.1 UI 实例:41 阶蓝

谷歌和微软的很多例子都一致显示:小的界面设计决策也可能有重大的影响。谷歌在搜索结果页面上测试过 41 个阶度的蓝色,这让当时的视觉设计负责人很受挫。然而,谷歌对配色方案的调整给用户活跃度带来了实质性的提高(谷歌没有报告单一改动的结果),并促成了之后设计团队和实验团队的高度协作关系。微软的必应也做过类似的配色改动,帮助用户更成功地完成任务,改善了任务成功需时,将美国市场的年营收提高了超过1千万美金。

这些都是微小改动带来巨大影响的很好的例子,但由于配色方案已经被广泛地测试,在更多实验中“玩”配色已不太可能带来更加显著的改进。

2.2 在正确的时机显示推广

2004 年,亚马逊在主页上放置了信用卡推广,该推广带来了可观的利润,但是点击率(Click-Through Rate, CTR)很低。团队进而运行了把该推广移至购物车页面的实验,用户把商品加入购物车后,可以看到一个简单的计算,从而对该信用卡带来的优惠额度一目了然,如下图所示。

%title插图%num

亚马逊购物车的信用卡推广

因为已经在购物车添加了商品的用户有非常明确的购物意图,所以这一推广出现在了正确的时机。对照实验显示这一简单的改动帮助亚马逊增加了数千万美金的年利润。

2.3 个性化推荐

亚马逊的 Greg Linden 做过一个产品雏形,根据用户购物车里的商品显示个性化的推荐。当你添加一件商品时,会看到一些推荐,再添加另一件商品,会看到新的推荐。Grey Linden 指出,虽然这个产品雏形看起来颇有前景,但一个市场营销高级副总裁*力反对,称它会分散用户注意力而影响结账。Greg Linden 被禁止继续这项工作。尽管如此,他还是运行了一个对照实验,并且这一新功能大幅获胜,放弃它将使亚马逊蒙受可观的损失。带着新的紧迫性,购物车推荐很快被发布了。如今,很多网站都在使用购物车推荐模型。

2.4 速度非常关键

2012 年,微软必应的一个工程师对 JavaScript 的生成方式做了改动,大大缩短了 HTML 到达客户端的时间,从而提高了性能。相应的对照实验显示了多项指标令人惊叹的改进。他们接着做了跟进实验来测量对服务器性能的影响。结果显示性能提高的同时也显著提高了关键用户指标,例如成功率和首任务成功需时,且每 10 毫秒的性能提升(眨眼速度的 1/30)足以支付雇佣一个全职工程师一年的成本。

2015 年,随着必应性能的提高,人们产生了疑问:服务器结果返回时间的 95 百分位数(即 95% 的搜索请求)已经在1秒以下,进一步提高性能是否仍有价值。必应的团队开展了跟进研究,发现关键用户指标仍旧得到了显著提高。虽然对营收的相对影响有一定程度的减弱,但由于必应的营收在那几年增长如此之多,以至于性能上每 1 毫秒的提升都比过去更有价值,每 4 毫秒的改进就能雇佣一个工程师一年!我们将在第 5 章深度剖析相关实验以及性能的重要性。

许多公司都做过性能实验,结果都显示性能多么关键。在亚马逊,一个 100 毫秒的减速实验使销售额减少了 1%。必应和谷歌的一个联合讲演展示了性能对关键指标的显著影响,包括去重搜索词条、营收、点击率、用户满意度和首点击需时。

2.5 减少恶意软件

广告是一项有利可图的生意,用户安装的“免费软件”经常包含插入广告污染页面的恶意软件。下图显示了一个含有恶意软件的必应搜索结果页面。注意有多个广告(用方框圈出)被插入这个页面。

%title插图%num

这些不相关的低质量广告不仅移除了必应自己的广告,从而侵占了微软的营收,也给用户带来了糟糕的体验,用户可能都没有意识到为什么他们会看到这么多广告。

微软对380万潜在受影响的用户运行了一个对照实验:修改文档对象模型(Document Object Model, DOM)的基本路径被覆写,只允许少数可靠来源的修改。结果显示必应所有的关键指标(包括人均会话数)都有所提高,这意味着用户访问的增加或用户流失的减少。除此之外,用户的搜索也更加成功,能更快地点击到有用的链接,必应的年营收也增加了数百万美金。前文讨论过的关键性能指标,比如页面加载需时,在受影响页面上也提升了几百毫秒。

2.6 后端改动

后端算法的改动是在运用对照实验时常常被忽视的领域,但它可能带来重大影响。我们在前文中描述过谷歌、领英和微软的团队如何一点点做改动,这里我们讨论一个来自亚马逊的实例。

回到2004年,当时亚马逊已经有了基于两个数据集的很好的推荐算法。其标志性功能本来是“买了X的用户也买了Y”,但后来被延伸为“浏览了X的用户也买了Y”和“浏览了X的用户也浏览了Y”。有人提出了一个方案,使用同样的算法推荐“搜索了X的用户也买了Y”。这个算法的支持者给出了含义不明的搜索的例子,比如“24”,多数人会联想到Kiefer Sutherland主演的电视剧。亚马逊的原算法对“24”返回的结果比较糟糕(下图左),有会24首意大利歌曲的CD、24月龄婴儿穿的衣服、24英寸的毛巾杆等。而新的算法表现比较出色(下图右),根据用户搜索“24”后实际购买的项,返回了相关电视剧的DVD和书籍的搜索结果。该算法的一个不足是返回的某些商品并没有包含搜索关键词。亚马逊运行了一个对照实验,即使有上述不足,这一改动也将亚马逊的营收提高了3%—数百万美金。

%title插图%num

提高 DevTools 控制台调试 console 的 12 种方法

很多开发人员都只是略知道一些浏览器 DevTool 调试的基础知识。

使用*多的 console.log() 对于在代码运行时输出值非常有用,通常可以帮助查明错误。

但是,还有一高级的用法还有很多人不知道,所以并未得到充分利用,更快,更容易和更有用的高级的用法,这些高级的用法可用于客户端脚本,Web 工作人员和服务工作人员。

Node.js 和 Deno 运行时控制台也支持许多功能。

%title插图%num

使用 ES6 解构输出变量名称

当监视多个值时,日志记录可能会变得很复杂。通常有必要添加更多信息,例如

  1. const x = 42;
  2. console.log(‘variableX:’, variableX);
  3. // or
  4. console.log(`variableX: ${ variableX }`);
  5. /*
  6. output:
  7. variableX: 42
  8. */

更快的选择是使用 ES6 对象销毁分配。这会将变量添加到具有匹配属性名称的对象。

换句话说,只要地方 { and } 括号一个变量来显示其名称和值:

  1. console.log({ variableX });
  2. /*
  3. output:
  4. { variableX: 42 }
  5. */

%title插图%num

使用适当的日志消息类型

console.log() 众所周知的*简单的方法:

console.log('no-frills log message');

但这不是唯一的类型。消息可以归类为信息(与相同处理 console.log() ):

console.info('this is an information message');

warnings:

console.warn('I warned you this could happen!');

errors:

console.error('I\'m sorry Dave, I\'m afraid I can\'t do that');

或更不重要的 debug 调试消息:

console.debug('nothing to see here - please move along');

console.table() 可以以更友好的格式输出对象值:

  1. const obj = {
  2.     propA: 1,
  3.     propB: 2,
  4.     propC: 3
  5.   };
  6. console.table( obj );

%title插图%num

console.table() 也可以用于一维或多维数组:

  1. const arr1 = [
  2.     [ 123 ],
  3.     [ 456 ],
  4.     [ 789 ]
  5.   ];
  6. console.table( arr1 );

%title插图%num

或对象数组:

  1. const arr2 = [
  2.     { a: 1, b: 2, c: 3 },
  3.     { a: 4, b: 5, c: 6 },
  4.     { a: 7, b: 8, c: 9 }
  5.   ];
  6. console.table( arr2 );

%title插图%num

其他选项包括:

  • console.dir( obj ) 在 JavaScript 对象中显示属性的交互式列表
  • console.dirxml( element ) 显示来自指定 HTML 或 XML 节点的后代元素的交互式树
  • console.clear() 清除控制台中所有以前的消息。

%title插图%num

过滤日志消息

浏览器以适当的颜色显示日志消息,但也可以对其进行过滤以显示特定类型。

单击 控制台 面板左上方的图标,可打开 Chrome 的侧栏:

%title插图%num

请注意,console.debug() 仅在查看 详细 选项时才会显示消息。

%title插图%num

使用 printf-type 消息

所有日志类型都可以使用 C 样式的 printf 消息格式,该格式定义带有 % 指示符的模板,该指示符用于替换变量。

例如:

  1. console.log(
  2.   ‘The answer to %s is %d.’,
  3.   ‘life, the universe and everything’,
  4.   42
  5. );
  6. // The answer to life, the universe and everything is 42.

%title插图%num

记录样式

可以使用在任何消息类型的第二个参数中作为字符串传递的标准 CSS 设置日志消息的样式。

%c 消息中的标记指示样式的应用位置,例如

  1. console.log(
  2.   ‘%cOK, things are really bad now!’,
  3.   `
  4.   font-size: 2em;
  5.   padding: 0.5em 2em;
  6.   margin: 1em 0;
  7.   color: yellow;
  8.   background-color: red;
  9.   border-radius: 50%;
  10.   `
  11. );

在 DevTools 控制台中的结果是:

%title插图%num

%title插图%num

使用类似测试的断言

console.assert() 当条件失败时,可以使用类似 test 的命令来输出消息。

可以使用条件定义断言,然后在该条件失败时输出一个或多个对象,例如

  1. console.assert(
  2.   life === 42,
  3.   ‘life is expected to be’,
  4.   42,
  5.   ‘but is set to’,
  6.   life
  7. );

或者,可以使用消息和替换值:

  1. console.assert(
  2.   life === 42,
  3.   ‘life is expected to be %s but is set to %s’,
  4.   42,
  5.   life
  6. );

当条件失败时,这两个选项都将显示断言错误:

%title插图%num

%title插图%num

运行堆栈跟踪

可以使用以下命令输出构成当前执行点的所有函数调用的日志 console.trace():

  1. function callMeTwo() {
  2.   console.trace();
  3.   return true;
  4. }
  5. function callMeOne() {
  6.   return callMeTwo();
  7. }
  8. const r = callMeOne();

跟踪显示了每个调用的行,可以在 “控制台” 窗格中折叠或展开该行:

%title插图%num

%title插图%num

组日志消息

可以 console.group( label ) 在开头和 console.groupEnd() 结尾使用来将日志消息分为命名组。

消息组可以嵌套,折叠或展开(console.groupCollapsed( label ) *初显示该组处于折叠状态):

  1. // start log group
  2. console.group(‘iloop’);
  3. for (let i = 3; i > 0; i–) {
  4.   console.log(i);
  5.   // start collapsed log group
  6.   console.groupCollapsed(‘jloop’);
  7.   for (let j = 97; j < 100; j++) {
  8.     console.log(j);
  9.   }
  10.   // end log group (jloop)
  11.   console.groupEnd();
  12. }
  13. // end log group (iloop)
  14. console.groupEnd();

%title插图%num

%title插图%num

使用性能计时器

该 time( label ) 命令启动一个计时器。timeEnd( label ) 到达关联的命令后,将报告经过的时间(以毫秒为单位)。

计时器可用于评估操作的性能-比管理自己的 Date() 计算更容易,更准确,例如

  1. // start timer
  2. console.time(‘bigloop’);
  3. for (let i = 999999999; i > 0; i–);
  4. // show elapsed time
  5. console.timeEnd(‘bigloop’);

%title插图%num

一个页面上*多可以添加 10,000 个计时器,并且该 console.timeLog( label ) 命令将报告经过的时间而不会停止计时器。

一个类似的选项是 console.count( label ) 报告命令被调用的次数。

console.countReset( label ) 将命名计数器重置为零。

%title插图%num

按名称调试和监视功能

DevTools Sources 面板(或 Firefox 中的 Debugger)允许您通过单击行号来打开文件并设置断点。

基于 Chrome 的浏览器还允许您通过 debug( functionName ) 在控制台中输入来设置断点,例如

debug( doSomething );

该函数必须在全局名称空间中可用,并且浏览器将在调用调试器后立即启动它。可以使用 undebug( functionName ) 或通过重新加载页面来取消调试。

的 monitor( functionName ) 和其相关联的 unmonitor( functionName ) 命令被以类似的方式使用。他们没有停止执行,而是记录了对函数的每次调用并显示了传递的参数:

function doSomething called with arguments: "hello"2

%title插图%num

查找并修复事件侦听器

Firefox DevTools 检查器面板在任何附加了处理程序的 DOM 元素旁边显示一个事件图标。

单击该图标以查看功能名称,然后单击左侧的箭头图标以展开代码。

另外,“在调试器中打开” 图标可在 “调试器” 窗格中找到处理程序,因此你可以设置断点:

%title插图%num

Chrome 的实现并不理想,但是您可以通过将 DOM 节点传递给 getEventListeners() 函数来查看所有事件侦听器。例如,getEventListeners( $0 ) 显示应用于“元素”面板中当前突出显示的 DOM 节点的侦听器:

%title插图%num

%title插图%num

将属性复制到剪贴板

console copy() 命令可以将任何值复制到剪贴板。它可以是原始值,数组,对象或 DOM 节点。

传递 DOM 节点后,copy() 将该元素及其所有子元素的 HTML 放置在剪贴板上。

等同于右键单击一个节点,然后选择 “复制”,然后选择 “复制外部HTML” 。

该命令将 copy( document.documentElement ) 复制整个 HTML文档。可以将其粘贴到文本编辑器中,以方便阅读标记。

*后

浏览器 DevTools 已从基本控制台演变为复杂的开发和调试环境。

console.log() 始终会很受欢迎,但其他选项可能会提供更快,更轻松的方法来实现零错误!

100到200的素数❤️

100到200的素数❤️
题目 判断101-200之间有多少个素数,并输出所有素数。
1
程序分析 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。用else可以进一步简化代码.
1
import math
for i in range(100,200):
    flag=0
    for j in range(2,round(math.sqrt(i))+1):
        if i%j==0:
            flag=1
            break
    if flag:
        continue
    print(i)
print(‘\nSimplify the code with “else”\n’)
for i in range(100,200):
    for j in range(2,round(math.sqrt(i))+1):
        if i%j==0:
            break
    else:
        print(i)

数字比大小

数字比大小
**题目:**数字比较。
1
a=int(input(‘a=’))
b=int(input(‘b=’))
if a<b:
    print(‘a<b’)
elif a>b:
    print(‘a>b’)
else:
    print(‘a=b’)

使用lambda来创建匿名函数

使用lambda来创建匿名函数
**题目:**使用lambda来创建匿名函数。
1
Max=lambda x,y:x*(x>=y)+y*(y>x)
Min=lambda x,y:x*(x<=y)+y*(y<x)
a=int(input(‘1:’))
b=int(input(‘2:’))
print(Max(a,b))
print(Min(a,b))
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速