大漫匠 小恶魔Lilith

4月底的时候逛阿B的会员购偶然看到了这个景品手办,想着表情和体态都挺色气,价格也不贵就剁手下单了。后面忙起来其实我也忘记这回事了,周二的时候居然来短信说可以给补款了,遂直接拿下。收到货之后被惊艳到了,真的好漂亮啊,而且好大一只,199元真的是性价比拉满了。不过由于有点奔放我实在是没信心摆在工位上,只好放在公寓的电脑旁了,望着小恶魔,感觉工作起来都更有劲了。

JS 代理模式实践

背景

最近在工作中遇到了需要对Module中导出的方法统一做预处理,在特殊场景下需要增加阻断执行并提示开发者不应该在该场景中使用该方法的提示。

思考

这里一开始的想法其实是在每个方法的入口分别增加一个阻断的判断逻辑:

如果只有一两个方法其实这么做倒还好,但现在的问题是,我手上有30多个方法都要加这个阻断逻辑,手搓阻断逻辑实在是太傻逼了,这么加不知道得加到猴年马月去。

后面我又看到Module的export default,想着能不能在这里做一下文章。

研究了一下之后,其实还是可以搞的,大致思路如下:

在ES6中,javascript引入了代理函数,从而实现对象基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)[1]。通过利用其拦截的特性,我们可以借此在module上实现代理模式。在外部函数获取method的时候做一些特殊逻辑。

实现

通过该方法,我们可以优雅的在module层面对method进行统一的前置操作(比如数据上报、逻辑阻断等操作),提升开发效率的同时还能使得代码更加简洁易维护。

兼容性

通过查阅caniuse,可以说这个接口已经100%兼容可用了。另外由于ES5的特殊性,Proxy是没有完整支持的polyfill的,因此如果碰到实在不兼容的用户,就积极引导用户去升级机器吧,没必要去钻这个牛角尖。

Android外网基本上只有电视盒子还是在4.4.4,手机几乎找不到4.0的机器,就算有看着0.08%的用户占比感觉可以直接忽略了。

[日常碎碎念] 周末打卡COA

缘起🏠

师弟这个月开始在深圳实习了,刚好他也可以喝酒,终于有酒搭子,能陪我去香港打卡心心念念的COA了。

特色🌺

COA是一家主打龙舌兰作为基酒的酒吧,正如其特点,COA的名字其实就是意指收割龙舌兰所用的类似于铲子的农具,店里各处都充斥着龙舌兰的装饰,加上墨西哥风格的BGM,特别有喝酒的氛围。

奖项🏆

#1 Asia’s 50 Best Bars 2022 by 50 best bars

#1 Asia’s 50 Best Bars 2021 by 50 best bars

#7 The World’s 50 Best Bars 2021 by 50 best bars

#8 The World’s 50 Best Bars (Highest Climber) 2020 by 50 best bars

酒水🍷

这次去主要喝了两杯酒:

1. Three Salt Magarita

来到主打龙舌兰作基酒的酒吧,怎么能够不喝Magarita呢?COA比较有趣的其实是盐的部分,这里使用了三种盐:海盐、虫盐和蚯蚓盐,海盐就是经典风味,虫盐和蚯蚓盐主要的区别是有一点点的烟熏味,还挺好喝的,主打的就是一个猎奇。

2. Smacked Cucumber Salad

顾名思义,就是通过酒水在口腔中复刻了一道拍黄瓜。入口先是酸,随后是黄瓜的清香,接着是点睛之笔的麻油味与香菜味,最后才是Tequila的酒味,酸咸辣香,四种味道融合的非常棒,特别惊喜的一款特调。

零食🥔

附赠的零食是一碗品客的洋葱奶酪薯片,特别酥脆,搭配Smacked Cucumber Salad回味无穷。

服务💁

无论是Bartender还是Waiter都支持普粤英三种语言的交流,扬手即响应,不会因为你只讲普通话就给臭脸你看,秒杀外面一众香港餐厅。酒水出品飞快,即使只有2个bartender,我们的酒水在10分钟内就能给到👍。

不过最好是懂英文去,不然连最基础的特调酒单可能都会看的一头雾水。(搞不懂为啥不整一个中文备注,全英文看着着实有点费力)我去的那天外场有个应该是土耳其裔的Waiter只会说英文,这种时候如果不会英文的话就只能找其他服务员了。

价格💵

120HKD/杯+10%服务费

说实话不便宜,但在香港港岛这边其实就还好,不算很离谱,算是物有所值。

总结

如果不用排队或者第二轮就能进去(排队1小时内),我还是很愿意经常去的,毕竟真的很好喝,但超过一个小时,感觉就完全没必要了,换别的喝喝其实也不错。

如何判断一个JS方法的兼容性?

背景

由于业务的原因,我们的H5页面必须兼容一些比较老的webview版本,因此在开发中难免会遇到不支持的JS语法,因此在这里总结了一个切实可行的方法来提高自己确认接口兼容性的效率。

方法

通过caniuse.com查询方法兼容性

例子

假如需要使用Proxy方法来统一代理所有的接口,但是我不确定系统兼容性,怎么办?

1.访问caniuse.com

2.查询对应的方法名

3.查询iOS的兼容性

4.查询Android的兼容性

5.如果查询到的最低支持版本在需要的版本内则可以使用,另外在使用前最好在方法外套一层try...catch避免出现不支持的意外情况

WebAudio使用小结🧭

背景

最近在负责游戏项目的开发,不免需要接触到音频相关能力的开发。在移动端实践后才了解到,iOS下的AudioDOM并没有被完全实现,比如iOS下就无法直接通过JS控制AudioDOM的音量大小,只能控制其是否被静音,另外静音拨杆的优先级比音量键的优先级要高。如果用户通过拨杆打开了静音模式,AudioDOM默认是没办法控制音量的。

尝试解决问题

由于需要实现通用能力中规划的音频的响度控制,搜索一圈后发现可以引入WebAudio来解决问题。(https://stackoverflow.com/questions/27296391/is-there-any-possibility-to-control-html5-audio-volume-on-ios

改造前音频架构

初始化阶段的时候,通用组件会检查DOM树是否存在AudioDOM,如果不存在就会尝试创建一个新的AudioDOM并挂载到DOM树上。状态操作也是直接对DOM树上的AudioDOM操作。

改造后音频架构

WebAudio支持多种方式创建音频输入,即可以直接通过AudioBuffer获得音频输入,也可以通过createMediaElementSource从已有的AudioDOM上创建音频输入。此处我使用的是后者,通过在AudioDOM与扬声器之间创建了一个“代理层”,将音频输出通过GainNode(增益器节点)处理了一下。通过GainNode我们可以设置音频的响度,间接的实现了iOS的音量控制。

错误上报

不幸的是,测试的Testcase还不够完善,业务被发布后,错误量激增,告警拉满😂。

经过梳理后主要是以下三种问题:

  1. Failed to construct ‘AudioContext’: The number of hardware contexts provided (6) is greater than or equal to the maximum bound (6).
  2. The provided value is non-finite
  3. undefined is not a constructor (evaluating ‘new(window.AudioContext||window.webkitAudioContext)’)

1.AudioContext只能创建6个实例

Webview版本小于66中只能创建小于等于6个的AudioContext,会导致页面无法继续播放音频。(https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)

解决办法:

1. 增加全局AudioContext池,通过一个实例来管理最大音频对象数量。

2. 不使用的AudioContext需要被及时释放,避免占用音频对象资源。

2.音频节点提供的不是有限值

在某些环境中,JS的除运算计算出来的值不是一个有限值,直接赋值给WebAudio的节点会报该错误。

解决办法:

赋值前通过isFinite函数检查是否是有限值,如果不是则使用一个固定的值作为兜底即可。

3.window.AudioContext不存在

按道理来说AudioContext在执行JS代码之前就应该被挂载到window上了。但遗憾的是,iOS15之后的WKWebview会经常出现,执行JS代码的时候AudioContext仍然未被挂载到window上,导致执行构造函数的时候报错。

解决办法:

捕获错误并且定时重试,一般第一次失败的2-3秒后就能创建成功了。

Model Y or 宝马Z4?

上周中午吃完饭在公司附近散步,偶然瞥见了一台敞篷的MX-5,感觉真的好Sexy好好看,搜索了一下价格貌似是40上下。主要戳中我的内心的是敞篷的概念,我也好想要敞篷汽车呀。但年初的时候其实我还许下愿望希望可以买一台Model Y的,算了一下年底拿下其实是最稳妥的时候了。我现在其实最纠结的点是,我是不是应该继续存钱买个小敞篷呢,又或是继续践行目标买个Model Y就算了呢?真的好纠结。

本来说是MX-5的,不过搜索了一圈,MX5的空间对于身高1米9的我来说貌似不太友好,回头如果路过宝马的4S店去看看Z4,如果合适就拿下。

周末去家附近的宝马4S店看了一下,没现车要预约试驾才有XD,只好下次再看了。毕竟现在我还做不到直接掏出这么多钱,估计只能作为25岁的生日礼物了(不过一想到自己能买到喜欢的东西就好期待啊)

这两天其实我再思考了一下买个25i就够了。另外买个车其实并不能让我工作日快乐起来,最多只能让我的周末更快乐。工作日真的好枯燥,每天就是上班+备战考研,啥时候会是个尽头呢?

上周末去家附近的4S店试乘了一下,对于190cm的我来说,空间绰绰有余,并不会感觉很拥挤,大约就是modelY小一点点,各个方面都很棒。(特别是敞篷的部分太太太帅了)另外也问了深圳的落地价,算了一下手上的存款+股票+现金刚好明年就可以下订了,最后就决定是Z4了。我这次看上的是新出的紫配白,真的是太Sexy了,不过就是要等大约5个月后才能到货。明年10月下单,刚好25年3月到,趁着春天开一下,爽啦。

一锤定音了,家人也同意了我的想法,只要是花自己钱的前提下就可以买了,明年年底拿下是肯定可以的了LOL。

最近上汽名爵准备发布cyberster电动Roaster感觉这个也可以考虑一下,挺帅的。(关键是不用燃油指标,就很爽)。

2024年1月15日,最近在B站上搜了一下,MX5坐不下190身高的我,太小了,果断放弃。目前就是在Model3、Cyberster和Z4之间抉择了。