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 问题”

SegmentFault 社区访谈 | Meathill:从业 10 余年的年轻 Developer

本周接受了 SF 的线下访谈,这里是全文。

上期访谈了重量级的 iView 作者 Aresn ,这次的访谈对象同样是重量级的– Meathill。不只是体重,如果你常逛我们的讲堂板块 ,你会经常在我们的热门推荐讲座中看到他的身影。

先不说 Meathill 10 年多的从业史,清蒸简单地说下个人对 Meathill 的一个非技术印象吧:声正、直爽(原因此处不做详说,有兴趣评论区见)、年轻。虽然 Meathill 从业已 10 余年、看问题一针见血,但是心态尤其的年轻:爱玩、爱吃,还撸剧…

下面递 🎤 给 @Meathill 让大家对他有个技术和非技术的认识~

阅读全文

继续阅读“SegmentFault 社区访谈 | Meathill:从业 10 余年的年轻 Developer”

阪京白奈十日游记

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

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

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

放弃友言

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

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

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

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

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