远离你身边的煤气灯人 发布于 一月 04, 2022 今天讲个煤气灯人的故事,这可不是一个关于张牙舞爪的喷火小木偶的恐怖故事。 我想说的远比恐怖故事惊悚多了。 它毁人心智,杀人于无形。 何为煤气灯人?如果你感觉这个词很陌生,那么朋友,你听说过PUA吗? PUA(Pick-up Artist,把妹达人),一个近年来广为人知的群体,与其相关的理论亦称为“泡学”。 大量不善交际的尝试者,几经辗转购入高价PUA课程,并将其珍若江湖两性秘笈。但同时在更多人眼中,PUA群体也沦为过街之鼠,人人喊打。甚至还有人故意在人际交往中,突显自己的直男直女本性,与“套路”二字划清界限。 但你真以为自己能摆脱PUA吗——Nope,甚至也许 你就是正在进行“情感操纵”的PUA本A 。 01. PUA,其实就是一种煤气灯人 现今意义上的PUA,上可追溯至1944年,由美国导演乔治·库克执导的一部惊悚片 《煤气灯下》(Gaslight) 中的主角安东。 在电影中,钢琴师安东(CharlesBoyer饰)为了将妻子宝拉(Ingrid Bergman饰)所要继承的大额财产据为己有,一面将自己伪装成潇洒体贴的丈夫,另一面又不断使用各种心理战术,联合家中的女佣企图将妻子逼疯。 在丈夫缜密的心理操纵下,宝拉逐渐变得神经兮兮,怀疑现实、质疑自己,最后在精神上几乎完全依附于安东。 这种试图破坏他人对现实的感知的情感操纵,也因该电影而得名为 Gaslighting(煤气灯操纵) 。下面我挑选了几个经典的Gaslighting片段让大家品品: Part 1 信息封锁:在一段时间内不断重复强调某一信息 安东和宝拉新婚满三个月时,外出去伦敦塔游玩。出门前安东送给妻子一枚小巧的白色胸针,声称是母亲去世前留给他的,并嘱咐宝拉把它收好。 此时安东略显刻意地强调了一句: “你可能会弄丢,你知道的,你经常丢三落四” 。这是电影中安东第一次对宝拉实施Gaslighting,也是宝拉初步对自己产生怀疑。 但是在二人离去之后,两位女佣之间的对话又再次佐证了,宝拉从未体现出任何异常。但是男主人安东,却不断向他们传输“女主人生病了”这一信息。 如果说此时,仆人们还对女主人生病一事尚有所怀疑。那么接下来的事情,就令他们对于这一言论深信不疑了。 当天的游玩结束后,安东便以饰物常年未佩戴、需要修理为由,向宝拉索要胸针。由于安东从一开始就并未将胸针放入宝拉的手包,而是偷偷将其藏在手心转移至别处,... 阅读全文
高可用用户中心设计 发布于 五月 09, 2020 概述 我们公司现在的账户体系比较混乱,每个系统都有一套自己的账户体系,没有办法进行统一的账户管理,比如统计一个人在哪个系统有账号,这样操作是比较麻烦的,还有就是我们如何进行用户行为分析,最终综合用户的信息进行用户的画像。这些都是需要解决的问题。 常规的用户设计是统一账号和统一登录验证,统一注册等信息。但是结合我们公司的实际,发现这样的话我们的系统可能会出问题,我们无法屏蔽很多细节。我们的现状是: 系统需要向用户隐藏是同一个公司的这个事实。也就是说我们做了用户中心的设计,但是不能让用户感知这个系统的存在。也就是说多个系统之间的登录都是需要隔离的。离论上不能做统一账号的登录,但是可以做统一账号的验证。 同一个系统可能有多个马甲app,我想马甲app之间也需要登录隔离,虽然他们调用的是同一个后台系统,那么我们不得不面对一个问题,同一个用户同时下单的逻辑处理,需要后台做这种处理,否则就会出现严重的并发错误,而开发人员可能都没有注意到这个事实的存在,从而导致一些稀奇古怪的事情出现。 web端与app端应该是需要同时登录的,我们好像没有web的要求,但是好像有微信的web端的事情。假如我们有web端的登录,那么问题来了,我们要不要实现二维码登录web。目前看是可以先不实现的,但是作为设计考量我们不得不考虑这些。 第三方账户的登录,我们是通过手机号作为唯一标识,那么不太好实现第三方的登录注册。但是我们可以后期实现,如果实现第三方的登录注册,那么问题来了,我们的设计貌似不支持,需要改动,就是改掉手机作为唯一标识的问题,但是想想好像是不影响的,只要数据能插入问题就不大,因为没有手机号,这些用户是不能登录需要手机的app,但是有的系统可以做特殊处理,从而支持第三方账户的登录注册。但是这样做也有缺点,就是用户利用多种方式进行注册,也就是说我们不得不解决一个问题就是用户可能存在多个账户的可能性。加入用户有微信注册的账户,然后又用手机登录,绑定微信,这个时候我们可能需要去系统中用微信的unionId或者openId查找一下是否有用户,有就不能绑定,没有才能绑定。如果有我们可能也知道了这个人有重复号的可能性。这个可能需要在做的时候处理。 验证保密问题,公司居然都没有人提到这点。不过也对我们是通过手机号进行验证的。但是如果以后我们不在使用手机号,可能我们需要验证问题。还需要判断用户的活动记录... 阅读全文
关于博客内嵌入bilibili视频 发布于 九月 23, 2021 一、原理 使用iframe标签,更改其中src对应bilibili视频的aid和cid,组装新的HTML源码,即可在文章内嵌入bilibili视频。 二、获取aid和cid aid为视频的av号,但是每个av号下不一定只有1p,所以B站用cid来管理视频的真正id,那么也可以说如果视频只有1p,那么cid就无用了,我测试直接填1也是可以的。 这里介绍两种获取aid和cid的方法: 方法一 先观察视频的URL 1 https: //www.bilibili.com/video/av84267566?from=search&seid=13400362594908841480 其中84267566就是av号。 或者直接点右键——查看网页源代码——ctrl+f——搜索'aid='、‘cid=’ 就可以了。 方法二(推荐) 我们在转发视频的时候直接可以看到嵌入代码 这是官方准备的嵌入代码,可以直接拿来用,但是显示效果不是很理想,样式不是我们希望的,需要调整一下。 < iframe src ="//player.bilibili.com/player.html?aid=84267566&cid=145147963&page=1" scrolling ="no" border ="0" frameborder ="no" framespacing ="0" allowfullscreen ="true" > </ iframe > 从嵌入代码中我们直接得到了aid和cid 我们重新设置一下功能、大小、样式,得到可用的HTML代码 < iframe src ="//player.bilibili.com/player.html?aid=84267566&cid=145147963&page=1" frameborder ="no" scrolling ="no" width ="95%" height ="600" ></ ifr... 阅读全文
Matomo API 官方接口详情 发布于 六月 24, 2021 API接口 你可以通过调用Matomo的分析接口将数据集成到其他应用中去。这些数据包括访问数,页面网址、网页标题、用户设置、搜索引擎、关键词、推荐网站、用户浏览器 其中的请求参数和返回值需要对照官方手册来 未定义 ## API `未定义` ## Annotations `未定义` ## Contents `未定义` ## CoreAdminHome `未定义` ## CustomDimensions `未定义` ## CustomJsTracker `未定义` ## CustomVariables `未定义` ## DBStats `未定义` ## Dashboard `未定义` ## Events `未定义` ## Feedback `未定义` ## Goals `未定义` ## ImageGraph `未定义` ## LanguagesManager `未定义` ## Login `未定义` ## Marketplace `未定义` ## MobileMessaging `未定义` ## PagePerformance `未定义` ## Provider `未定义` ## SEO `未定义` ## SitesManager `未定义` ## TagManager `未定义` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Actions 动作(行为) Actions.get 访客分析-概述-访客概览(右边一列) Actions.getPageUrls 行为-页面 Actions.getPageUrlsFollowingSiteSearch Actions.getPageTitlesFollowingSiteSearch Actions.getEntryPageUrls 行为-进入页面 Actions.getExitPageUrls 行为-退出页面 Actions.getPageUrl 行为-通过页面的PageUrl查看详情(获取单条记录) Actions.getPageTitles 行为-页面标题 Actions.getEntryPageTitles 行为-页面标题-进入页面标题 Actions.getExitPageTitles 行为-页... 阅读全文
终极学习法:费曼学习方法 发布于 一月 07, 2021 像我们这种,孩子要N年以后才会高考的,也忍不住掺和一下。伸着脖子,想打听一点学霸的成功经验。 听来听去,除了天赋、努力之外,反复被提到的一个关键词即是:学习方法。 之前,分享过写的超好的一篇文章,反复强调的也是类似的观点,排名前 1% 的学生靠的不是天赋也不是努力,而是更高阶的思维和学习习惯…… 那究竟什么才是好的学习方法? 带着这样的疑问,开始了搜寻,后来找到了它。 先说说它的神奇。 一个叫Scott Young的加拿大人,用它在几天之内学完了线性代数,一年的时间里自学完成了麻省理工全部计算机学课程。一共33门课程,这意味他平均通过一门课程也就花了一周半左右。 不卖关子啦,它就是 著名的费曼学习法。 知乎上很多人怒赞“费曼学习法”,还将其称为是“终极学习法”。 P.S.,它还能解释,为啥相比老二、老三,老大更加聪明,很神奇吧? 1费曼,你是谁? “费曼学习法”来源于20世纪美国物理学家、 教育 家、音乐家——理查德·费曼。 “男神”费曼是不是很帅~ 如果说20世纪全世界第一伟大的科学家是爱因斯坦,那么排名第二的可能就是费曼先生了。 他不仅获得1965年的 诺贝尔 物理学奖,还参与过美国的原子弹项目”曼哈顿计划“,同时也是第一位提出纳米概念的人。 这样一位史诗级人物,对学习方法他有着自己的独特一面:学完了,再教一下他人。 这个方法伴随了他一生,也成就了他一生,而要追溯到他最开始的学习,则是归功于他的父亲对他思维方式的引导和积淀。 费曼和 爸爸妈妈 的合影。 费曼的父亲是一位推销制服的销售,文化程度并不高,但就是这样一位普通人,却在跟费曼一起读书的时候,逐渐教会了他怎样去理解和思考。 比如,一起读《大英百科全书》,父亲不是照本宣科,而是用更加形象的方式让小费曼真正理解。 有一次,他们讲到了霸王龙。书上说:”霸王龙有20英尺高,头有6英尺宽。“很准确,但是很抽象的表述。 父亲很巧妙地用“它的头想伸到窗户外,但是却伸不出去,因为它的头太宽了”的话语,让抽象变的具象。 这让费曼不仅理解了霸王龙的庞大,更加理解了20英尺高、6英尺宽是一个什么概念。 正是通过这种方式,小费曼不仅对科学产生了浓厚的兴趣,还认识到无论学什么,都要去理解它背后真正的含义,而不仅仅停留在表面。 不要小看这句话,因为这也正是“费曼学习法”的精髓所在。 2费曼学习方法的精髓是啥? 在介绍“费曼学习法”之前... 阅读全文
图像识别在测试中的应用 sikuli 发布于 十一月 25, 2019 提起 ui 自动化大家首先想到的就是基于控件的自动化,比如常见的 xpath、id、css 选择器等手段进行元素定位并进行结果判断。但是在实际应用中,无论是 web 端还是移动端,仍有很多时候需要根据页面内容、页面中的图像进行定位及判定,是这些手段所达不到的,这里我们来介绍一下关于图像识别在测试中的应用。 在具体进行讲解之前先介绍一下图像识别在测试中能够想到的引用场景: 测试过程中,通过对待测软件进行屏幕截图,采用图像识别算法识别截图中是否包含预定义的可操作控件,如果存在,则触发控制指令,达到了图像识别引导测试过程的目的; 测试结果的验证,通过对待测软件的界面进行截图操作,利用图像识别技术将截图与期望的结果进行匹配,从而自动获取测试结果。 通过图像识别对比来进行性能测试,比如 app 测试中常见的响应时间的测试 首先分享一下图形识别在自动化测试中的应用,目前比较流行的就是 sikuli, 其中关于 sikuli 的安装在这里就不多说了,官网有具体的介绍( https://launchpad.net/sikuli/+download) 原理 Sikuli 脚本是由 jython 通过图像识别的方式来模拟键盘和鼠标事件,从而实现 ui 层面的自动化测试。Sikuli 脚本的核心是一个 java 库主要由两部分组成: java.awt.Robot 这个部分主要是讲键盘和鼠标事件传送给指定的位置,具体的位置是由 c++ 引擎(基于 opencv 模块)通过脚本中的目标图片去屏幕上搜索并定位。C++ 引擎与 java 的 JNI 链接并且进行编译来适应不同的平台。在 java 的上层是一个简单的应用层就是我们开发脚本用的,这层给最终用户提供了一套简单易用的命令。 函数介绍 Find(x) 在屏幕上找到相对于的图片,比如选定一个手机 示例代码: findall(x) 在屏幕上找到所有的相同图片 x,比如可以关注多个手机(一次性把所有的图片的坐标选定,如果选定后再刷新桌面背景有可能出现之前的坐标和之前的功能点对应不上,达不到测试效果) 示例代码: wait(x,10) 等待图片 x 在屏幕上或者指定的区域中出现,超时时间 10 秒 示例代码: waitVanish(x,10... 阅读全文
小程序自动化测试总结 miniprogram-automator 发布于 四月 20, 2021 一、缘起-为什么要进行小程序自动化测试 微信小程序生态日益完善,很多小程序项目页面越来越多,结构越来越复杂,业务逻辑也更加多样。以腾讯课堂小程序为例,目前腾讯课堂小程序部分页面结构和不同业务场景下的表现如下图所示: 可以看到在核心功能上主要页面对于不同业务场景有众多不同的表现,因此在开发与发布的过程中需要手动验证大量测试用例以保证小程序按预期表现运行,善于利用工具的程序员当然会想: 这种重复的工作能不能交给程序自动进行呢? web开发中对于这类测试问题已经有了很多自动化解决方案比如Selenium、Puppeteer,思路大体相同,都是让浏览器按照指定顺序自动在页面上完成点击、输入等操作,再将操作后的页面表现与想要得到的结果进行比较得到测试结论(断言)。那小程序中有没有一种方案能够按照这种思路实现自动化操作并提供页面信息用于断言呢?为了微信底层安全考虑,小程序环境一直比较封闭,留给开发者操作的余地很小,自动化操作基本无法实现,但5月底出现了 miniprogram-automator 工具,给了小程序开发者希望。 二、缘遇-初试miniprogram-automator 基于miniprogram-automator的文档描述简单总结一下,当通过命令打开开发版微信开发者工具的自动化接口并连接自动化接口后,此工具可提供以下能力: MiniProgram :获取小程序信息(页面堆栈、系统信息、页面内容),控制小程序(跳转页面、切换tab、调用方法) Page :获取页面信息(路径、元素、数据、结构),控制页面(设置渲染数据、调用方法) Element :获取元素信息(属性、样式、内容、位置),操控元素(点击、长按、调用方法) 所以小程序自动化控制的实现依赖于开发版小程序开发者工具以及miniprogram-automator工具。小程序开发者工具命令行用来打开指定自动化操作服务端口。(开发者工具版本需高于v1.02.1906042)。miniprogram-automator工具用来操作开发者工具中运行的小程序并获取所需的信息。对于测试需求可以结合jest框架进行测试用例的组织和断言。 不多废话,看完文档用一下: Ø 调用开发者工具命令行打开项目与指定自动化操作服务端口 PS D:\programs\内测\微信web开发者工具> ./c... 阅读全文
微信小程序小总结 发布于 十月 30, 2019 微信小程序使用起来感觉像写h5一样,对于新手估计会有比较多疑惑,如果撇去这些想法应该是很快就能上手的一套开发方案。 但是它自身的限制也比较大,如不提供window对象会导致一些功能实现起来比较麻烦。我这次开发的小程序就遇到了,虽然比较快找到解决办法(可能都是比较标准化的东西),希望之后不会有其他大坑。 需要其实比较简单,就是两页文章列表及文章详情页,刚上手却遇到下面的坑: 无法利用window对象解析xml 不支持HTML标签的使用 怎样兼容Promise和generator异步 刚开始一脸懵逼...后来赶紧去github看看各大牛例子及一些工具就解决了。 解析xml问题 由于比较多的解析插件都是基于 window.DOMParser 处理的,在小程序却无用武之地。找到问题就好解决,我要的是 DOMParser 而不是window找找应该有代替品,然后找到这个 xmldom 引入代替掉 DOMParser 就解决,然后把xml转成json处理了。 评论有问道如何改,这里我已经把这个整合到 这库 了。 解析html问题 现在比较成熟的是 wxParse 这货,的确大部分的html标签均能解析渲染,但是我这边程序录入的富文本内容却掺杂了些奇奇怪怪的标签,解析时还是会出错,内容解析到一半就停了...既然它做不到忽略,咋整?那把那些垃圾都过滤掉吧!!!马上用上 js-xss 这个来处理问题,能控制过滤的标签及标签能拥有的属性,方便得很。 const xss = require ( '../lib/js-xss/xss' ) const WxParse = require ( '../../lib/wxParse/wxParse.js' ) //把style及class添加到白名单。 Object .keys(xss.whiteList).forEach( name => xss.whiteList[name] = xss.whiteList[name].concat([ 'style' , 'class' ])) let content = xss( '<div>HTML文本</div>' , ... 阅读全文
Yaf framework 相关项目骨架 发布于 八月 06, 2019 在 yaf 的源码目录,附带了一个工具 tools 目录, 下面有个 cg/yaf_cg 工具,是通过模版生成 yaf 项目骨架的工具。 Usage: ./yaf_cg ApplicationName [ApplicationPath] 项目目录 ├── application │ ├── Bootstrap .php │ ├── controllers │ ├── library │ ├── models │ ├── plugins │ └── views ├── conf │ └── application .ini └── index .php index.php 程序的入口文件 application 主要的应用程序代码目录。 2.1 可以通过 application.directory 这个配置来修改。 2.2 application 目录下的目录(controllers、models、plugins、views)是默认的代码结构目录,yaf 会根据相关的类名称,去相关目录下加载相关的文件,例如 IndexController extends Yaf\Controller_Abstract 这个文件,yaf 就会到 controllers 目录下查找 Index.php、类 UserModel 就会到 models 目录下查找 User.php(可以定制文件后缀或前缀模式,如 ModelUser 就是前缀模式)。 2.3 除了 library 目录以外,其它目录都是在框架编译的时候确定的,library 目录主要是存放一些本地库文件例如我有个 Helper_Html (名称空间模式 Helper\Html) 类,通过注册本地类名称空间 Yaf_Loader::registerLocalNamespace("Helper") 来加载,文件的存储结构是 library/helper/Html.php 需要注意的就是要开启名称空间,使用 namespace 的类名称和不使用 namespace 的 classname 有些差异。 2.4 Bootstrap.php 是框架的引导类 (可以没有),继承自 Yaf\Bootst... 阅读全文
小程序框架全面测评 发布于 十月 28, 2019 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一些疑惑:这些框架都有什么优缺点?到底应该用哪个? 作为 Taro 开发团队一员,笔者想在本文尽量站在一个客观公正的角度去评价各个框架的选型和优劣。但宥于利益相关,本文的观点很可能是带有偏向性的,大家可以带着批判的眼光去看待,权当抛砖引玉。 那么,当我们在讨论多端框架时,我们在谈论什么: 多端 笔者以为,现在流行的多端框架可以大致分为三类: 1. 全包型 这类框架最大的特点就是从底层的渲染引擎、布局引擎,到中层的 DSL,再到上层的框架全部由自己开发,代表框架是 Qt 和 Flutter。这类框架优点非常明显:性能(的上限)高;各平台渲染结果一致。缺点也非常明显:需要完全重新学习 DSL(QML/Dart),以及难以适配中国特色的端:小程序。 这类框架是最原始也是最纯正的的多端开发框架,由于底层到上层每个环节都掌握在自己手里,也能最大可能地去保证开发和跨端体验一致。但它们的框架研发成本巨大,渲染引擎、布局引擎、DSL、上层框架每个部分都需要大量人力开发维护。 2. Web 技术型 这类框架把 Web 技术(JavaScript,CSS)带到移动开发中,自研布局引擎处理 CSS,使用 JavaScript 写业务逻辑,使用流行的前端框架作为 DSL,各端分别使用各自的原生组件渲染。代表框架是 React Native 和 Weex,这样做的优点有: 开发迅速 复用前端生态 易于学习上手,不管前端后端移动端,多多少少都会一点 JS、CSS 缺点有: 交互复杂时难以写出高性能的代码,这类框架的设计就必然导致 JS 和 Native 之间需要通信,类似于手势操作这样频繁地触发通信就很可能使得 UI 无法在 16ms 内及时绘制。React Native 有一些声明式的组件可以避免这个问题,但声明式的写法很难满足复杂交互的需求。 由于没有渲染引擎,使用各端的原生组件渲染,相同代码渲染的一致性没有第一种高。 3. JavaScript 编译型 这类框架就是我们这篇文章的主角们: Taro 、 WePY 、 uni-app 、 mpvue 、 chameleon ,它们的原理也都大同小异:先以 JavaScript 作为基础选定一个 DSL 框架... 阅读全文
评论