奔驰事件与 996

Apr 15, 2019

4S 店之所以敢贪得无厌、明目张胆,我想很大一部分原因是来自于普通人想要维权实在是太过困难了。想要维权,那就相当于:

  1. 你得放弃很大一部分的工作时间(甚至丢掉工作)
  2. 你得付出前期的诉讼成本
  3. 你得面对来自各方的压力(家庭与社会)
  4. 你得面对可能最终维权失败的结果

再结合最近热议的 996,再来看这件事,对于普通人来说实在是太难了。生活与工作本身已经如此不易,要是再来这么一出,谁顶得住啊。也难怪绝大多数人在受到欺负之后最终只能无奈选择忍气吞声。毕竟大多数国人都是很「精明」的,就算维权成功,带来的收益也可能远不如其负面影响,那么为什么要维权呢?

996 其实也是同样的道理。公司敢于非法压榨员工,员工却无可奈何,只能通过在 Github 发声聊以自慰。近期互联网大佬频频发声,大谈创业艰难史,可是始终是避重就轻,你想奋斗没有人拦着你,但逼别人奋斗是怎么回事呢?问题的关键是「强制」而不是「996」,没有一人提及。最可笑的是马云的「你要来谈法律,那法律有规定这么齐全的设备吗?有规定这么好的食堂吗?」,可以看出这些站在企业顶端的人都是些什么嘴脸。求求你把这些都撤了,给我发合法的加班费好吗?当然这是不可能的,大佬们会跟你谈梦想,谈兄弟,这些都不成,那您请滚吧。

可是有多少人经受得住这种后果呢?一旦维权,即使成功,你也可能被列入行业黑名单,就算他们无法可依。这种事情不是没有先例,我印象中见过好多了。说了一堆废话,最终问题的根源到底在哪里,相信大家都懂的。

代码的艺术:koa 源码精读

Apr 4, 2019

Node.js 界大名鼎鼎的 koa,不需要多废话了,用了无数次,今天来拜读一下它的源码。

Koa 并不是 Node.js 的拓展,它只是在 Node.js 的基础上实现了以下内容:

  • 中间件式的 HTTP 服务框架 (与 Express 一致)
  • 洋葱模型 (与 Express 不同)

一统天下级别的框架,只包含了约 500 行源代码。极致强大,极致简单。大概这就是码农与码神的区别,真正的代码的艺术吧。

Read more »

Parcel 初体验

Apr 2, 2019

Parcel Bundler 发布了这么久,终于有机会体验了一次。在一个新的基于 jQuery 的小项目中尝试了这个打包器。结合它的宣传点,整体来说最大的感受是:

  1. 确实比 Webpack 快很多
  2. 确实「基本上」不需要配置

虽然没有太多其它的亮点,但这不妨碍它用起来就是比 Webpack 「爽」。

关于「快」

就我的感受而言,Parcel 的快大多是要基于它的文件系统缓存的,这也是 Webpack 没有的东西(也许将来会有也说不定)。从体验上来说,应用启动以后「热重载」的速度基本上差不多,就算有差距也可以忽略不计,因为基本两者都是秒速。但是「重启」就不一样了。得益于它的文件系统缓存,Parcel 要比 Webpack 快两到三倍,甚至五倍十倍,我觉得一点都不夸张。这在日常开发中体现的优势还是相当明显的。

关于「零配置」

说零配置是有些夸张了,应该说 90% 的场景都不需要写配置。比如说 Webpack 必写的 babel-loader / css-loader 等东西,它都已经给内置了。开发者需要做的东西仅仅是把它安装下来而已。比如说:

  1. 我需要使用 Babel,则安装 @babel/core 就好了
  2. 我需要使用 Less 预编译 CSS,则安装 less 就好了
  3. 我需要使用 Pug 预编译 HTML,则安装 pug 就好了

事实上,你可能甚至不用做「安装」这一步。当它检测到你输入了某个类型的文件而需要安装某种依赖才能进行时,它会自动安装。

这种做法给人的感觉是,它并不是真正的零配置,而是所有的配置其实都已经写好了,内置了,然后它会检测你输入的文件类型,去匹配现有的规则,该干嘛干嘛。所以,这并不是什么黑科技,只是「约定大于配置」的一种体现。

吐槽点

在日常开发中,确实 90% 的场景下都不需要写配置,那么另外的那 10% 呢?

真正用下来会发现,Parcel 在带来方便的同时,也会带来一些问题:任何事物都是有两面性的。某些在 Webpack 下很稀松平常的任务,比如 js 代码混淆,加多一个 loader,配多一个规则就能解决的事情,在 Parcel 的世界里,对不起,做不到。你得自己想办法。

当然这也许是我对 Parcel 的了解还不够深入,不知道如何定制。但 Parcel 的文档里面确实没有提及任何相关的可定制化的东西。所以,真的要说到「可靠性」,「安全感」的话,可能我还是往 Webpack 这边站。但是,毋庸置疑的是 Parcel 确实为小项目提供了一个非常棒的选择。

另外再吐槽一点,Parcel 的文档强制给我跳转中文版,然而中文版文档更新滞后,缺斤少两,我选了英文以后,下次再打开还是中文,这一点太不友好了。

ReactNative WebView 接入支付宝与微信支付

Mar 14, 2019

在 ReactNative App 的 WebView 中接入支付宝与微信支付其实很简单。首先前提是:使用 H5 网页提前做好了支付相关的动作,ReactNative 方面只负责展示 H5 页面,以及调起相应的 App 来完成支付,不需要接入底层相关的 SDK 或其它代码。

对于 Android 平台来说,经过一番研究,发现 ReactNative 方不需要添加任何额外代码即可达成目的,通过 WebView 拉起支付 App 完成相应支付功能,并在支付成功后返回原 App,体验完美。但是有一点要注意的是,不要随意修改 WebView 的 UserAgent,如果需要修改的话最好使用追加的方式,因为支付宝的支付页面如果检测不到 Android 相关的 UserAgent 则不会拉起 App,只能在网页上支付。

iOS 使用以下代码来达到拉起 App 的目的。但有一个问题是,从 App 完成支付动作后,系统会打开浏览器来显示支付结果,而不是回到原 App,这个缺陷应该是使用 WebView 方式无法避免的。

onShouldStartLoadWithRequest = ({url}) => {
  // 实际上应该不需要判断, 因为 onShouldStartLoadWithRequest 只支持 iOS,但是保险起见
  if (Platform.OS !== 'ios') {
    return;
  }
  const isAlipay = url && url.startsWith('alipay'); // 支付宝支付链接为 alipay:// 或 alipays:// 开头
  const isWxPay = url && url.startsWith('weixin'); // 微信支付链接为 weixin:// 开头
  const isPay = isAlipay || isWxPay;
  if (isPay) {
    // 检测客户端是否有安装支付宝或微信 App
    Linking.canOpenURL(url)
      .then(supported => {
        if (supported) {
          Linking.openURL(url); // 使用此方式即可拉起相应的支付 App
        } else {
          console.log(`请先安装${isAlipay ? '支付宝' : '微信'}客户端`);
        }
      });
    return false; // 这一步很重要
  } else {
    return true;
  }
};

Case insensitive auto-complete in OSX Terminal

Nov 23, 2018

在 Mac OSX 终端里面由于默认 Home 下面的文件夹都是大写开头,如 Downloads / Desktop 等,cd 的时候比较烦。解决方法:

$ echo "set completion-ignore-case On" >> ~/.inputrc

然后重启终端即可。

使用 Puppeteer 自动输入京东滑动验证码

Nov 5, 2018

京东网页端登录有时候需要输入滑动验证码,就像这样:

jd-verify

在做自动签到脚本的时候遇到这个很不舒服,如果不处理的话就只能每次弹出浏览器手动登录,因此稍微研究了下。下面是一个非常简单,但成功率很高(达到80%)的自动识别并输入方案,使用 puppeteer 实现。

总体思路:通过图像特征识别出滑块缺口的位置,然后通过模拟用户点击将滑块拖动到该处。

Read more »

React node starter

Oct 10, 2018

出于某种需求搭建了一个非常简单的、基于 React / Node / Express / MongoDB 的 starter 工程:wxsms/react-node-starter,旨在简化小型或中小型项目开发流程,关注实际业务开发。

目前所实现的内容有:

  • 前后端完全分离
  • 热重载
  • 用户注册、登录

麻雀虽小,五脏俱全。下面记录搭建过程。

Read more »

Unicode substring

Sep 6, 2018

最近遇到一个问题:在做字符串截取操作时,如果字符串中包含了 emoji 字符(一个表情占多个 unicode 字符),而碰巧又把它截断了,程序会出错。在 ReactNative App 下的具体表现就是崩溃。由于以前做的是网页比较多,基本没有输入表情字符的案例,而在手机上就不一样了,因此这个问题还是第一次发现。

比如说:

'😋Emoji😋'.substring(0, 2) // 😋

因此,如果对这个字符串做 substring(0, 1) 操作,就会截取到一个未知字符。

Read more »

失望

Aug 8, 2018

今年的 TI 本子到目前为止已经充了 ¥850 左右,770 级。

  • 不朽 1 没有开到极其珍稀(PA),其它齐全
  • 不朽 2 齐全,一件极其珍稀(黑鸟)
  • 不朽 3 没有开到极其珍稀(巫医),其它齐全
  • 宝瓶 1 一轮,一件稀有额外(术士)
  • 宝瓶 2 一轮,一件稀有额外(大屁股)

战绩可以说非常不尽人意。虽然中途 V 社承认自己失误(被迫?)发了一次补偿,但依然没我。

现在每周就肝肝幽穴风云,肝肝代币,箱子开了马上又是一次轮回,感觉除了中看不中用的等级以外什么都没留下。想要的东西永远开不到,除了失望以外说不出别的感受来。

今天中午又开了一个箱子,依然是熟悉的啥都没有,突然就觉得好累,有点不想肝了。人生啊。

Gitlab CI Setup

Jul 19, 2018

Gitlab 有一套内置的 CI 系统,相比集成 Jenkins 来说更加方便一些,用法也稍为简单。以下是搭建过程。

前置准备:须要准备一台用来跑 CI 任务的机器(可以是 Mac / Linux / Windows 之一)。

Read more »