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. JavaScript 设计模式(x8)
  4. 尬聊会,暂定两周一次,没人来我就直播写代码

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


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

Laravel 开发笔记:环境搭建

记录 Laravel 的一些笔记,随时更新。

文档

英文官网:https://laravel.com/
英文文档:https://laravel.com/docs/5.5
中文文档:https://d.laravel-china.org/docs/5.5/packages

建议两边都打开,对比阅读。

配合 PHPStorm 使用

Laravel 里面定义了很多别名,直接放在 PHPStorm 里会有很多黄色曲线,看起来非常不爽。关键是影响代码补全,所以最好用一个库来搞一下。

安装 barryvdh/laravel-ide-helper:

composer require --dev barryvdh/laravel-ide-helper

注册服务。编辑 app/Providers/AppServiceProvider.php:

public function register() {
  if ($this->app->environment() !== 'production') {
    $this->app->register(IdeHelperServiceProvider::class);
  }
}

生成 meta 文件:

php artisan ide-helper:meta

诡异的 Mac + PHP + Nginx 问题

前两天又遇到一个诡异的问题,以上是解决手段。

问题描述

这次是微信公众号开发,本身就有很多问题,也严重加剧了我调试的难度。正在做一个 WordPress 插件,功能是将公众号文章和 WordPress 互相同步。之前一切正常,突然有用户反馈抓不到公众号上的文章了。

顺便说下,插件地址:https://github.com/meathill/wp-plugin-weixin 目前支支持手动部署,完成二维码之后开始做发布版。

继续阅读“诡异的 Mac + PHP + Nginx 问题”

阪京白奈十日游记

今年是全日空30周年,票价相当给力,所以很早就计划再去一趟。因为年初才去过北海道滑雪,至少要隔半年,夏天似乎没啥好玩的,所以干脆选择11月去,可以看枫叶。于是定行程、订机票酒店,然后成行,玩、吃、看,终于今天返回广州。简单总结一下。

今年是全日空30周年,票价相当给力,所以很早就计划再去一趟。因为年初才去过北海道滑雪,至少要隔半年,夏天似乎没啥好玩的,所以干脆选择11月去,可以看枫叶。于是定行程、订机票酒店,然后成行,玩、吃、看,终于今天返回广州。简单总结一下。

继续阅读“阪京白奈十日游记”

放弃友言

告别友言,回归 WordPress 评论框。

WordPress 内嵌评论,不过不算太好用;当时也有其它用第三方评论的需求,所以就分别注册了友言和多说,游戏泡泡用多说,博客用友言。一直到现在。

多说前阵子关了,搜了一下发现网易云跟帖也要关了。国内硕果仅存的可能就是搜狐畅言了,不过搜狐嘛,老态龙钟,也不让人放心。最后决定,还是上外国的吧。

友言从我用开始就半死不活的样子,竟然坚持到现在,也挺难得。不过估计他们团队已经放弃这块业务了,Bug 多,功能少,各种服务失效。其实我早就想换,不过一直犯懒。现在 https 已经上了,友言也废了,提前切吧。

然后发现友言不支持评论导出……好吧,谢谢友言,有缘再见。

上 HTTPS

现在工具链如此成熟,上 https 简直容易到死。

为啥

  1. 更安全。现在经常在公共场合工作,如果登录博客走 http,太不安全。
  2. 更稳定。国内运营商劫持简直丧心病狂,只能 https 解燃眉之急。
  3. 更有逼格。好歹是个工作十几年的老油条,自己博客连个 https 都没,浏览器一直报告“不安全”,看着太低端。

怎么上

简直容易到死。我之所以选在这个时间上 https,就是想等工具链成熟。现在何止成熟,简直傻瓜。

  1. 免费证书有好几家,我选择 Let’s Encrypt,无他,他们家名字好记。
  2. 进入官网,选择 “Get Started” 进入下一页
  3. 简单阅读一下,他们建议使用命令行工具 Certbot
  4. 听人劝吃饱饭,那就用,进入官网,选择 Software -> Nginx,System -> Ubuntu 17.04,自动跳转到使用步骤。
  5. 然后安装 Certbot
  6. certbot --nginx(其实不带参数也行,它会自动检查),启动配置向导,跟着一步一步来。它会自动配置证书、自动修改 nginx、还可以更新证书,基本上一路回车就行。
  7. 修改 /etc/crontab,配置自动更新。按理说证书有效期为90天,差不多3个月更新就行。然而 crontab 只能按月配置,这样算起来一年有好几天会出问题,所以我干脆配置奇数月的第一天更新。

问题

  1. 七牛云需要独立的证书,申请中。
  2. 友言也挂了,看来要用回 WordPress 自己的评论,或者干脆 Disqus。