Vue 小贴士

1. 使用 Vue + Webpack 开发 2. 使用 CDN 加载依赖 3. 在开发阶段尽量不要使用压缩的文件,一边取得尽量全面的错误信息

书说简短:

  1. 使用 Vue + Webpack 开发
  2. 使用 CDN 加载依赖
  3. 在开发阶段尽量不要使用压缩的文件,一边取得尽量全面的错误信息

继续阅读“Vue 小贴士”

Safari 下 Date 不支持”2018-01-01 00:00:00“

Chrome 可以支持非标准格式时间如 2018-01-01 00:00:00,safari 不支持,所以有时会导致错误。

前两天发现一个小程序的问题,Android 正常,iPhone 出错。我们都知道,Debug 的关键在定位,如果是某些特殊环节,不常见的错误,就会浪费很多时间。

这个 Bug 也是如此,反复拉锯之后终于发现,问题出在下面这句:

let a = new Date(`${date} 00:00:00`);

date 是服务器端返回的值,我是把它和后面的 00:00:00 连起来,记作某天零点零刻,和今天的零点零刻做减法,计算日期差,并按照日期差来决定接下来的逻辑。这段代码在开发工具(包括 Mac)、Android 手机上运行都正常,只有在 iPhone 上不正常,于是我打开 Safari——苹果这点做得不错,桌面版 Safari 环境和 iOS 几乎没有差别,该出的问题一定会出——果然复现了这个问题。

按照规范,中国的日期格式是:“2018/01/01”,Safari 只支持这个格式。而 2018-01-012018-01-01T00:00:00 ISO 格式,Safari 也支持,但是会以格林威治时间为准,和我们有8小时的时差。Chrome 和 Android 内嵌的 WebView(基于 Blink 或者 Webkit)则都支持,所以在本地和 Android 手机上没有问题。

日本@九州@福冈

回到福冈,准备回家。福冈跟其它大城市差不多,体验也差不多,值得一提的是门司港的九州铁道博物馆,很值得一去。

转了一圈,我们又回到福冈。查看地图的话,我们的行程是逆时针在北九州转一圈;只是因为想乘坐“SL人吉”号,所以往南九州走了一小截。

福冈是九州最大的城市,基本上,大城市嘛,就那个样子。可能不太一样的地方,就是干净、整洁,交通文明(说到这个,刚回来两天真是路怒啊,各种瞎MB开的)。按照既定计划,我们要在福冈待三晚,主要任务是逛街,穿和服拍照。可惜汇率不给力,老婆的逛街热情被消磨殆尽,索性带着小朋友去观摩九州铁道博物馆。

九州铁道博物馆位于门司港,本来还想着能坐到“阿苏Boy”号特色火车,结果国庆节又突然改线路,只好坐普通火车去。门司港是 JR 九州分部创立的地方,不远处就是关门大桥,曾经是连接九州与本州的要道,后来修通海底隧道之后,变成一节阑尾样的断头路。从福冈过来最简单的走法是做山阳新干线,不过我们用北九州 JR Pass 是不行的,所以只有先坐到小仓,然后换乘短途电车,其实也很方便,同台换乘,冲过去就开车,免费送惊险刺激。

博物馆不算大,不过玩的东西不少,对于小小火车迷来说各种火车头大火车小火车轨道车模拟驾驶仿古车厢,以及随便玩的火车玩具,简直如天堂一般。门票300日元,小朋友免费,也的确不贵。美中不足,就是我们完全不懂日文,本来当天有期间限定的“小小列车长”活动,小朋友们在整个博物馆寻找答题牌,答对问题盖章,然后就能获得纪念品,还能穿上专门制作的小号制服,去体验开火车的乐趣。这些不懂日文是玩不到了。不过小朋友不知道,其实也还好。

第二天就是和服拍照。到日本租和服拍照应该是常规项目,比较巧的是我们入住的酒店后面就有一家,通过邮件预订,到时候去就是了,大人4000,小朋友2500,做头发500,加起来7000日元,我觉得还可以。提供的和服也还不错,我觉得放到商场也得几千块。然则,走到櫛田神社,正准备大拍特拍,结果赶上本地望族办婚礼和相亲,到场的女士都穿着和服,年轻的姹紫嫣红,年长的黑底金丝刺绣,都特别漂亮,连小朋友的都很耀眼。比起来就是,我们好不容易穿上 Only 艾格,结果碰上穿 Chanel Prada 的……不知道租身那种档次的要多少钱。

晚上我还专门跑去吃有名的屋台。在河边,原本以为规模会很大,没想到翻来覆去就找到3家,而且似乎不打算接待外国游客,既没有中英文菜单,老板也完全不懂中英文的样子。于是我只是凑合点了几个关东煮、烧烤和拉面,味道还不错。


第二天,起床收拾一下,就回家咯,第一次日本之行,到此结束。

MySQL 的编码问题

解决字符集为 utf8_general_ci 的表里无法存储表情符号的问题。

前几天朋友的小程序遇到点问题,同样的代码,有些人就是注册不上,有些人就没问题。让我帮忙看。

看代码应该没问题,我自己试也没问题,很诡异。后来我发现,说注册不上的一个截图里,昵称里有一个雨滴的符号。我们知道,传统的编码是没有表情符号的,表情符号是 Unicode 后期才加进去的,那么会不会是数据库字段的问题?看了一眼,Laravel 默认创建的数据库,字符类型是 utf8mb4_unicode_ci,而他们数据库是 utf8_general_ci,Google 一下,找到下面这篇文章:

為什麼MYSQL要設定用UTF8MB4編碼 UTF8MB4_UNICODE_CI

里面提到:

當資料庫需要儲存或處理以下資料:emoji (手機端常用的表情字符)

应该使用 utf8mb4_unicode_ci,因为它会用更多的空间存储字符。基本锁定是字符集的问题。然后看到梦康大的一篇博文:直接使用 mysql utf8 存储 超过三个字节的 emoji 表情 ( 不使用 utf8mb4 ),决定参考他的方案,毕竟改库改表不是小事情。

不过时过境迁,梦康文中的 func_overload 已经可以用 mb_strlen($str, '8bit') 来替代,所以最后的代码大约是这样的:

// 替换
protected function encodeEmoji($input) {
  $length = mb_strlen($input, 'utf-8');
  $result = '';

  for ($i = 0; $i < $length; $i++) {
    $tmp = mb_substr($input, $i, 1, 'utf-8');
    if (mb_strlen($tmp, '8bit') >= 4) {
      $result .= '[[Emoji:' . rawurlencode($tmp) . ']]';
    } else {
      $result .= $tmp;
    }
  }
  return $result;
}

// 替换回
protected function decodeEmoji($nickname) {
  return preg_replace_callback('~\[\[Emoji:(.*?)\]\]~', function ($matches) {
    return rawurldecode($matches[1]);
  }, $nickname);
}

所以说,程序员心态要保持年轻,步调要跟年轻人保持一致,这样才更容易发现新问题,所以我的昵称已经改成“肉山🎩”了。

Poker 2 修好了!

Poker 2 有时候会自己把自己的固件刷掉,这个时候就要下载官方工具刷回来……简直弱智……

很早之前在淘宝上买了一块 Poker2 60 青轴,主要为尝试不同轴。这个键盘有两个问题,第一没有方向键,对于用惯了方向的我来说有点不太适应;第二个问题,就是时不时就挂了……

前两次挂,寄回去修了;第三次没顾得上(当时键盘已经比较多了),拖了几天,再找店家,店家不理我了……

然后这块键盘就在旁边扔了两年,我屡次想把它修好,都不得其法。今天不知道为啥,突然又想试一下,结果竟然被我找到了解决方案:

应该是这块键盘有一些设计上的问题,导致它会在某些情况下自己刷自己的固件,然后刷空,结果失效;解决方案就是下链接二里面的工具,刷默认固件,然后就可以了。

啊,既然归队了就用两天吧,不过青轴只能在自己家用,在公共场合会被打的……

肉山小课堂线下版开张

肉山小课堂线下版开张了,广州的同学们有空的话欢迎光临,在天河区奥体南路6号东澳创意小镇11栋 Coffee Foru,计划每周四开工。可以看我的视频,咨询问题。免费。

前几日写的我的知识变现 2017,及2018年计划中,号称今年要把“肉山小课堂”办到线下,结果第一周就因为家里有事放了鸽子。

如今回到广州,得还愿了。明天,我将在天河区奥体南路6号东澳创意小镇11栋Coffee Foru办公一下午(大约 1:00~5:00 pm),期待大家光临。

为表诚意,前三位光临的同学我请咖啡。

我会带一个 iPad,可以用来看我的视频。我会现场解答关于前端、Web 开发、职业生涯的各种问题。不收费。(当然,真想给我也不拒绝)。

我希望可以把这个活动坚持下去,办成一个小沙龙,甚至定期分享一些题目。所以不出意外的话我每个周四都会在那里。

我的知识变现 2017,及2018年计划

过去一年,我尝试转换赛道,投身培训和分享领域,效果不够好,不足以养家糊口。我总结再三,认为非头部的我,面对如此细分狭窄的市场,势难做出想要的结果,于是放弃,继续全职工作。2018年,我将继续分享,做一个兴趣使然的分享者。

2016 年年底,我供职5年之久的前司遭遇经营问题,开始裁员缩编,我也在被裁之列。回到家左思右想,觉得工作十年了,也该换换赛道试试了。正巧从2015年底开始听罗辑思维,对知识服务知识变现很感兴趣,眼看身边的小额付费如火如荼,不仅心里痒痒的。于是决定尝试花一年时间做开发培训,录视频做直播。

结果并不理想。我总结反思过很多次,关于细分、关于硬知识软知识、关于头部效应,等等,可以参看我去年写的一批文章。简而言之,我觉得对我个人(可能也是大部分普通开发者)而言,知识变现很难做,原因有三:

  1. 从细分领域来说,编程是一门非常垂直的技术,需要很多周边知识打底。这个行业的人,或者自驱能力强,有足够强的信息获取能力,比如我,不太需要付费购买知识;或者只是被较高的薪资吸引,本身不太适合从事这个行业,需要的是更系统更可信(更能忽悠)的培训教程。
  2. 从软硬来说,编程是一门非常硬的技术。学到的知识可以通过实践检验效果;进行实践也几乎是取得成就感的唯一途径。因为无法成为谈资,所以很多人,包括我认识的一些老程序员,都是业务驱动,自己对技术无甚追求,够用即可。
  3. 从头部来说,大部分的流量和注意力都集中在这个行业的头部资源上。知识服务是信息类的产品,本身可复制性极强、流动速度极快,这和我熟悉的工程师领域不同。为生产足够多的实用类产品,必然需要足够多的工程师;而生产足够多的信息类产品,只需要少数头部生产者和方便的分发渠道即可。

所以我从8月份开始,打算放弃这条赛道;刚好看到现司的招聘启事,觉得挺有前途,就投了简历,然后继续全职工作。

收获

去年最大的收获是一个 QQ 群,里面大概集中了150名听过我的课的同学。感谢有他们的陪伴我才能坚持那么久。

收入方面,大约是这么一个样子

平台 收入
SegmentFault 6230.53
GitChat 839.98
在行 1394
斗鱼 87.69
总计 8552.2

聊胜于无,差不多可以覆盖掉我的喝掉的咖啡。

新年计划

放弃以培训维持生计不意味着放弃分享知识,只不过要转换一下方向。首先,继续抱紧平台大腿,SF 在各方面都很好,来年还是它了。其次,增加线下,面对面聊。再其次,不指望挣钱,以帮助新人,贡献社区为主。

给来年定一个计划吧:

  1. 每天在 SF 上回答一个问题
  2. 每周四在旧雨咖啡坐一下午,欢迎广州的同学来找我。我提供:
    1. 观看所有我的课程
    2. 前端技术答疑
    3. 其它问题讨论
    4. 不定期组织内容分享。比如我有个朋友正在研究小程序游戏开发,我准备委托他做一次分享
    5. 预约的话,我可以带一些书来给大家看
  3. 每个月做一次直播分享,本年度的计划包括以下各项,如果各位同学有想法,请告诉我。
    1. 组件开发系列填坑(x2)
    2. 前端面试攻略:避免非战斗减员
    3. Grid 布局十八掌
  4. 尬聊会,不出意外的话,每周至少一次。
    1. 先讲《JavaScript 设计模式》,不准备幻灯片,以临场发挥为主
    2. 间或插一些别的主题
    3. 讲完后再找别的主题
  5. 把所有视频录下来,找人/雇人/请人剪辑拼接成视频,发布出去。发布平台暂定 B 站、YouTube、斗鱼。

新年目标

这里的目标仅就知识分享方面。

  1. 完成上面的计划
  2. 出版第一本书
  3. 微博粉丝达到 1000
  4. 小课堂群(628056148)250人
  5. 分享收入达到 ¥13000,比去年提高 50%
  6. 填完所有的坑
  7. 与小课堂群分享收益,形成大约50人的松散分享组织

2017年过去了,我很怀念它。2018年来了,我对它很期待。


PS:本周在重庆,周四不确定能不能回到广州。