[Discode] 设计Discode

简介

在本篇文章中我将一步步的阐述我设计Discode的流程以及我的思考点。虽然Discode作为一种编码仍然比较稚嫩,但作为入门自己的第一个图形编码仍然是不错的例子。

目录

  • 分析现有编码的设计
  • Discode的视觉设计
  • Discode的技术指标
  • Discode的编码设计
  • 编后语
  • 版权声明

分析现有编码的设计

当前世面上各家厂商为了用户纷纷都推出了自有的编码规范,仅仅在大陆地区而言,当前能够看到的自由编码普遍是圆形二维码,也有像是QQ小程序码的变种圆形二维码。

QQ小程序码

从这四种只有编码中我们不难观察出一个规律,大家的编码样式的元素基本都是:

  1. 图形编码环绕着Logo
  2. 四点定位

图形编码环绕着Logo

这种设计有两个好处:

  1. 具有高自由度的品牌露出的能力

开发者可以自由的定义自己的图标类型,使得用户一眼就能识别出编码对应的软件信息(比如广东省的粤核酸小程序的Logo是DNA双链+号码,用户扫描前就已经可以预测到自己扫描的是一个粤核酸的小程序)。

  1. 不占用实际编码区域

现有的二维码规范中,已经通过纠错编码的能力,来实现图片覆盖二维码后仍能识别的能力。但对于一个新生的图形编码而言,设计一个出色的纠错编码并不是一件容易的事情,即使套用现有的编码规范仍有可能因为经验不足等因素导致到后来Coding过程中出现一些不可预见的限制。因此将分开显示能够极大的规避掉初期编码水平不足给自己挖坑的风险。

有好处当然也是有坏处的:

  1. 需要开发全新的生成与识别规则

环形编码意味着不能直接复用二维码已有的生成能力也不能直接识别,所有的东西都需要从0开始。

  1. 编码容量有限

环状编码的本质就是在圆圈上作文章,比如使用点、线段等作为二进制中的1,空白作为二进制中的0,实现二进制编码成图像元素。受制于圆形的特性:一圈是360度,为了视觉识别的准确性和速度,一般都会设计为每5-10度的圆弧内记录一个编码。因此单圈的能够承载的编码都是有限的,比如小程序码就是设计了36线,54线,72线的小程序码。假如我们10度编码一位信息,则一圈最多可以编码36位二进制信息。同时自定义的编码还有长度限制,因此单圈的实际编码数量肯定是远远小于36位的。

思考:如何拓展容量?

圆形编码有两种扩大容量的方式:

1.使用更密集的图形(在更小的弧度内编码信息)

比如小程序码的36线就是每10度作为一个编码区,54线就是6.6度一个编码区,72线就是5度一个编码区。

2.扩大半径(增加圈数)

比如支付宝只有3圈编码区域,AppClips则是5圈编码区

2.四点定位

以小程序码为例,分别在左上右上左下设置了Mark Point(定位点),其实右下角的Logo也是一个定位点,不过他是一个特殊的定位点,需要使用特殊的计算方式确定真实的圆心(在此不赘述),最终微信是可以通过这四点的圆心坐标,计算出对角线交线的坐标点,而这个坐标点就是小程序码的圆心。另外通过这四个点还能确定编码的实际区域,方便进行透视变换矫正图形到正确的位置。

思考:定位点是必须的吗?

虽然定位点确实能够帮助我们进行很炫酷的图形变换来矫正图形到正确的形态,但对于刚刚入门图形编码的我来说这个也太难了吧!遂开始寻找有没有不需要定位点的图形码,没想到还真的有,那就是Apple为App小程序推出的AppClips Code。

那么问题来了,为什么AppClip码可以不要定位点?那它要怎么定位圆心?机器如何对其进行纠正?通过查阅设计文档得出的答案居然是:标准限制+人工对准。

文档地址: Human Interface Guidelines > App Clips > App Clip Codes

阅读了Apple的设计规范之后,我才悟到其实我们不需要强行考虑复杂的环境,我们完全可以设计一些标准规避到复杂环境的可能,让用户遵守标准就好了,这样子就可以规避到很多问题,极大的降低工程的技术难度,为后续的继续设计奠定了基础。

Discode的视觉设计

完成上一节的市场分析后,我们就可以开始思考一下我们的Discode到底要长什么样子了。

基于市面上的圆形码,我的初步想法是:通过定位点来定位图像,同样支持品牌Logo的露出,另外也需要支持可变容量。因此原型设计中我参考了小程序码的定位点设计,出于后期编码的简单化考虑和法务风险规避的考虑,我把小程序码右下角的官方Logo去掉,替换成为了定位点。如果日后需要增加官方Logo的话,则如下图所示可以在品牌Logo的右下角增加一个官方的小Logo。

对于可变容量我也思考了两种方向,增大圈数或者加大密度,考虑到半径的动态变化可能会对识别造成一些不可规避的难点,我还是选择了减小编码区所占用的弧度,来增加编码密度实现容量的可变性。为此我同样参考了小程序码的设计并根据圆弧的弧度为360度进行平均分割,设计了36区、72区和144区的编码区密度,其分别占用10度/编码区、5度/编码区、2.5度/编码区。为了容量和设计美观度的考虑,暂定的圈数应该为3圈,确保可以将Discode印刷于一个非常小的区块中。

Discode的编码设计

图像编码中最核心的部分之一就是数据的编码规则了,通过编码规则,我们才能将二进制的数据转换成特定的图形并组合成一块就可以生成出自己的图形编码了,反过来的就是识别的流程了,不过具体怎么做我会留到接下来的生成和识别的解析文章中来讲解。

设计编码主要是遵循以下的几步:

  1. 确定编码的使用场景(决定未来的可能场景)
  2. 确定编码的宽度(决定可以容纳多少的字符)
  3. 根据编码容量来调整实际可编码的字符
  4. 分配字符到编码规则
  5. 根据视觉调整编码规则(这一步会发生在生成Discode后才会进行,在《生成Discode》中会讲到如何调整)
  6. 确定最终编码规则 & 整理成编码字典

1. 确定编码什么字符

在这一步我们先要确定我们的使用场景:

  • 可以记录网址吗?
  • 可以记录图片吗?
  • 区分大小写字符吗?
  • 可以记录邮箱吗?
  • 我们需要考虑损毁吗?
  • 我们要考虑修复能力吗?
  • 如果要修复能力我们要支持多少百分比的恢复能力呢?
  • 中文字符要考虑吗?

这些都是需要我们根据我们的未来使用场景来预设的。在我们的本次的项目周期走,我认为网址信息和邮箱信息是必须的,因为这样子才能让Discode具有实际的落地场景。图片二维码一般都是依托于Base64来实现的,存储图片这种高密度信息,显然不是Discode的长处,因此不考虑实现。中文字符可以通过UniCode字符集实现,不过其本质还是特定字符+字母,因此实现特殊字符、大小写字母和数字的编码后就可以实现,因此可以考虑作为第二目标来实现。修复能力需要依托于支持校验的编码实现,本次开发更偏向于探究如何实现,因此参考AppClips的思路,我决定使用技术规范,来规避掉损毁的可能性,在此不考虑损毁修复的能力。

综合上述的思考:Discode的初步可编码字符就显而易见了,UniCode需要的&#;,邮箱网址需要要的@.,大小写字母和数字,一共67种字符。

2. 确定编码的宽度

按照计算机的二进制规范来看,我首先还是想到熟悉的[latex]2^{n}[/latex]次方,1 Byte = 8 Bit,但是8位二进制数最大可以代表[latex]2^{8}[/latex]=256个数字,对于需求中的67个数字而言冗余空间太多了,因此要进行一下缩减,那么要不就是使用7位128个,要不就是6位64个。128对于67而言冗余空间接近翻倍,太浪费了,但6位64个又存不下全部字符着实是让我有点苦恼。最终我还是选择了6位作为最终的编码长度,其中的原因主要是有两个,第一是编码密度可以达到100%,即每一位都会用于实际的编码当中,不会有冗余空间;第二则是6恰好与360的具有倍数关系,360/6 = 60,而60也恰好与2.5、5、10之间构成倍数关系,恰好满足144位、72位、36位的需求。因此出于这两点考虑选择了6位为最终的编码宽度。

3. 根据宽度来调整可实际编码的字符

确定了6位的编码宽度后,就确定了实际的容量了,即字符表最大可以存64个字符,那么大小写字符一种52个,数字字符10个,剩余2个空位。在使用场景中我有说过我的假设场景中存在用来存储邮箱地址和网址的想法,对于邮箱而言最重要的两个字符便是邮箱根地址,即@xxx.com中的@.,因此我选择了@.作为字符表最后两个空位所要代表的符号。

4. 分配字符到编码规则中

因为这次的开发中不需要考虑到纠错校验,因此分配到字符到编码规则中就很简单了,只要把所有可能出现的数字都列成表格,再一一对应填上就好了。

其中我还是有一点小考量的,开始符我设定为了.,结束符则是@,这其实是我的个人偏好而已,一个约定俗成的设定,其实换过来也是OK的。然后小写字母从000 001一直到011 010,而大写字母则是在则是最高位(第六位)设置为1,即100 001111 010,剩余的空间就用数字填空就好了。

到这里我的Discode的专属字符表就设计完成了,其实整个过程非常的简单有趣。另外一般而言,只要我们不外泄这张实际的编码表,其实基本上没人能够逆向这个图形编码的意义。(破解方法仍然是有的,只是成本问题,只要对方知道字符表大概能存哪些字符,通过一些数学统计方法仍旧是可以逆向出来的,不过对于Discode这样子的一个开源项目,其实没啥意义去逆向破解。)

Discode的技术指标

综合视觉设计和编码设计最终可以得出Discode的最终技术指标如下:

  1. 支持图像定位
  2. 支持30位的数据
  3. 支持a-z、A-Z、0-9、”@“、”.“共64种字符
  4. 支持自定义品牌Logo

编后语

说实话,其实这篇博文我觉得更像是我的一个思路的整理集,不太像一篇文笔流畅的技术解析文章,这点我确实意识到了。不过我还是想尽力分享一下我的思路出来看看能不能帮助到更多对此感兴趣的小伙伴,因为这实在是太有趣也太有成就感了。

版权声明

本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

[Discode] 为啥要设计新的二维码系统?

这是《Discode的诞生与技术细节》系列文章的第一篇文章,分别讲述了为啥我会萌生设计一个新的图形编码系统、图形编码的技术指标以及未来的文章规划。

背景

2017年初的时候,微信小程序推出了它们自己的二维码编码系统,称作小程序码,也被大众称之为菊花码。这种新的编码系统着实是令我大开眼界,后续也了解到了Snapchat和Facebook自己也有编码系统,这些奇形怪状的图形编码系统着实吸引着我去了解它们的技术原理,但可惜的是,彼时的我恰逢高三冲刺阶段,并没有这么多的精力去学习和了解这些编码系统更深层次的技术原理,只可将其放在了自己的技术待办清单中。

起因

在2022年年初的时候,我有一天偶然在电梯间看到一个支付宝的广告,发现支付宝居然也按捺不住推出了自己的图形编码系统(支付宝小程序码介绍),这再一次勾起了我蠢蠢欲动的内心欲望:做一个属于自己的编码系统。

支付宝小程序码

成果

说干就干,由于恰逢春节期间,自己有很多的个人时间,因此可以集中比较大的一块时间进行集中的研究和开发。目前已经成功开发出了一个Demo版本的编码系统,这套编码系统我将其称作为DisCode系统,分别是Disc(光盘)和Code(编码)撮合成的一个合成词,读音类同Disco(迪斯科),之所以叫做这个名字,是因为其实际的解码过程就像是读取光盘的过程,而且图形也近似于一张光盘,因此被命名为Discode系统。下图的这个就是Discode编码,编码了v2ex.com。

Discode

技术指标

  1. 支持30Bit的数据*
  2. 支持a-z、A-Z、0-9、”@“、”.“共64种字符**
  3. 支持自定义品牌ICON

*:图像中的一个圈可以编码6Bit的数据,理论上是支持[latex]6x(x\geq 1)[/latex]Bit的数据

**:目前仅仅是设计了一一对应的原始编码,理论上是可以支持带纠错功能的编码的,这需要结合你的实际场景进行设计

计划

在接下来的三个月内,计划沉淀出两篇技术文章和完整可运行的项目来一步步的阐述我的思考、设计和编码流程:

  1. 《设计Discode》
  2. 《生成 & 识别Discode》
  3. 《Discode生成和识别源码》

希望通过这两篇文章和全流程的项目,能够帮到一部分需要开发或者想要了解这项技术的开发者或者爱好者。

版权声明

本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

日常碎碎念 2022.02.20

前言

不知不觉又迎来了新的一年,在新冠疫情背景的笼罩下,2021年彷佛”SOU~”的一下就过去了,即使回看2021年的年终总结,看到自己经历了这么多,但感觉时间依旧过的很快,好似啥都没做就过去了,不免有点无力失落感。不过光明总在未来等着我们,我们也无需过分的失落,坦然接受砥砺前行就好了啦🤷‍♂️。距离上一次的碎碎念已经过去了2个月了(果然还是打破了自己半月一更的幻想),之所以拖更了这么久,最主要的原因还是大四准备毕业设计中🎓,因此花费了较多的时间进行测试和撰写论文。(不过也仅仅停留在写完了,我还没有校对格式)

回顾

1.开发全新的二维码标签系统

自从微信小程序码出来之后,我就一直很想了解如何开发一个自己的圆形二维码系统。但比较可惜的是,无论是国内或者国外都鲜有关于这个技术的开源文章,大多还是大公司内部开发的商用型编码规范,唯一与之类似的编码系统是一个叫做ShotCode的编码系统,来自于剑桥大学。后面通过翻阅了部分的专利和文献后,开始了自己的踩坑开发之旅,并最终开发了一套全新的编码系统。(设计完成后,我才发现与抖音码高度相似😂) 我把这套全新的圆形编码系统命名为Discode。下图就是将我的博客地址编码成为了Discode的样子。

编码信息:7gugu.com

至于为什么会叫做Discode,以及如何生成如何识别。我计划在未来的3个月中,分别通过4个章节的文章来阐述,欢迎大家到时候常回来看一下。

2.回公司搬砖

做完毕设后,就一直在家里面闲着了,天天都是打游戏。母上大人看到后,就天天催我去打工赚钱补贴家用,因此就开始一起做手准备租房和入职手续。啪的一下,很快啊!我就办妥租房手续和公司入职流程回公司搬砖了。由于2月份的实习生数量比较少,值得庆幸的是,我终于有了一张大桌子了,另外也配了一台4K的外接显示器(爽歪歪),美中不足的就是M1Pro没到货,只能先用着19款的i7比较不爽。不过我最近也在内网看到,转正后貌似可以申请换一台笔记本,因此希望未来能够用上M1 Pro爽一下吧。(白嫖M1 Pro,省下14999元) Leader和Mentor还是原来的同事,大家依旧是如此的友好,感觉在这样子的工作环境下工作还是挺舒服的了,除了内部项目文档太傻逼,没啥很严重的问题了。(u1s1,文档真的是太太太拉垮了,啧)

3.春节放烟花

春节的时候回了几天乡下,令人惊喜的是,乡下居然可以放烟花🎆,这让生活在城市中的我非常的高兴了。遂探访了多家小卖部,奇怪的是居然没一家有的卖烟花,这就非常的令人疑惑了🤔,晚上像防空炮突突突的烟花,怎么哪里都找不到有的卖?一开始我还以为是因为我们的口音的问题(误以为是外乡人),后来无意中在百度地图中看到了一个烟花专门店,因此抓紧机会开车去看了一下。

没想到最后找到的这一家看起来非常不起眼的小店铺,居然是拿了烟花营业执照的专门店,令我大吃一惊😂。正是拥有执照,这家小店铺可以公开销售超多的品类烟花,另外价格也非常的公道。

现在的烟花销售真的是与时俱进,几乎每种套装级别的组合烟花都可以扫码预览效果,不满意可以继续挑到满意为止,最终我们选择了268元60发的小套装尝鲜。

在当日晚上,趁着夜色,点燃了烟花的索引,pong、pong、pong一束束的烟花在天空绽放,绚烂的烟花寄托着我们对于未来的期望,希望新的一年越来越好吧!哈哈哈😊

5.正月初二海底捞宵夜

其实早在21年的时候,我就跟朋友提出这个想法💡了,令我高兴的是,拥有这两位愿意陪我一块疯的好友,感谢🙏。海底捞春节期间宵夜依然有大学生8.8折优惠,因此约上晚上0点大家一块吃一个宵夜。正月初二大家都要先去亲戚家吃饭,但吃完饭最多也就是21点种,于是大家还是决定先去骑车消磨一下时间,再去吃宵夜。遂一起骑车去了沙面岛逛gai,22点钟的沙面岛是真的安静啊,街上没了白天时分的才会有的新婚夫妇(大家都喜欢沙面岛的欧陆风情建筑,拍婚纱照很好看),也没有了小朋友嬉戏打闹的声音,一片寂静。

骑车到23点左右开始回程,准备海底捞宵夜。令我比较惊讶的是,即使是凌晨0点时分,海底捞内居然还有不少的顾客在里面用餐,其中不乏一起出来团建的职员,兴许是刚唱完卡拉OK后出来炫一顿海底捞再回去继续唱歌吧。

最后吃到2点多,愉快的散伙回家,巴士超级冷清,整辆车就我和我朋友以及一个司机,直到家门口才有一个人上车,有点瘆人😂。

计划

  1. 好好工作攒钱买车
  2. 继续准备毕业设计
  3. 吃好喝好玩好睡好

结尾

新年新气象,深夜12点跟大家吃麻辣火锅,也是新的体验新的开始了。

[好物分享] 米家胶囊咖啡机💊☕️

背景

小时候跟父母去外地游玩,有一次酒店内的mini bar看到了一台奇怪的机器,机器旁边还放着一些杯子状的小药丸。出于对小物件的好奇,我第一次接触到了胶囊咖啡机。当时我的对于咖啡的认知还停留在包装速溶咖啡,通过胶囊做出一杯咖啡的体验是我大受震撼🤯,给我留下了很深的印象,至此之后我就把胶囊咖啡机放进了我的愿望清单里了。不过当时(2012年前后),Nespresso才刚刚进入中国市场,入门款都要上千块钱,对于那时候的我来说实在是承担不起。(虽然现在也是贵的离谱,但好歹现在有了闲鱼可以买二手)因此购入计划就被搁置下来了。

购入咖啡机

某一天晚上刷淘宝的时候,无意间我留意到米家也有自己的胶囊咖啡机了,一番了解后才知道是心想胶囊咖啡机的米家定制版,我还在愁到底要不要试一下呢?后面看大家的测评才知道,原来还兼容Nespresso胶囊系统,着实让我感到惊喜。恰逢今年元旦的时候,小米商城开启了新年的促销活动,原来399元一台的米家胶囊咖啡机,降价到了379元,于是乎果断剁手购入。

开箱试用

咖啡机本体

小米快递很快,下单的第三天我就收到货了。包装内包含了两部分:

  1. 咖啡机本体(上图)
  2. 两盒试用胶囊(心想系统与Nespresso系统)

咖啡机本体是米家祖传的灰白配色,简洁大气,十分百搭,放厨房里一点都不突兀。咖啡机通过220V供电,电源线不可拆卸。第一次使用的时候需要现在机器后部的水箱中加入适量的纯净水,之后连按两次110ml的按钮,对机器水路进行清洁🧹,之后方可使用。日常使用非常简单,仅仅需要将胶囊(下图)放到机器里,点击对应的杯量即可制作。通常做一杯Espresso(意式浓缩咖啡),仅需要10秒左右,Lungo(长杯咖啡/美式咖啡)则需要30秒左右。另外水槽是可以变更高度的,用以适配不同的杯子高度。制作咖啡的噪声不是很大,嗡嗡嗡的类似空调外机启动的声音,由于持续时间很短,因此不用太过担心扰民,隔一堵墙就没事了。

官方的试用胶囊(深烘,很拉垮)

从开机预热(30秒),到开始制作(15-30秒),到洗水槽(60秒),喝上一杯还算不错的咖啡仅需要不过3分钟的时间,实在是很不错了。早上来一杯,特惬意,大幅度提高幸福感。如果看到这里的你,居住在北方城市,空气较干燥的话,甚至不用像我一样,每天倾倒废料盒(把用完的胶囊丢掉);干燥一点的环境,每周洗一次就好了。这样子甚至可以节约60秒,每天60秒,一个月就30分钟了。

咖啡胶囊成本

由于Nespresso咖啡胶囊系统已经存在了非常多年,同时雀巢作为Nespresso的母公司,一直在为其推广。所以官方所能提供的胶囊,相较其他的纯咖啡胶囊系统(DOLCE GUSTO 多趣酷思等咖啡饮料不做讨论,毕竟咖啡饮料有自己的玩法,饮料会侧重于花样,所以会有很多奶茶、热巧克力之类的选择),比如illy、Tassimo、Lavazza等会有更多口味,更不用说Nespresso胶囊专利已经到期,现在大家都能做Nespresso胶囊。副厂胶囊百花齐放,一抓一大把,甚至前面提到的三家拥有自己咖啡胶囊系统的厂家都为Nespresso专门推出了自家的咖啡。因此单杯咖啡的成本并不高,比如官方的普通咖啡系列,3.8-4.2元一颗胶囊,限定款6-15元不等。通常我们选择3.8-4.2元的胶囊作为口粮就足够了。对于我而言,我一天通常要喝两颗,上午一杯Espresso下午一杯美式,一天的开销也就是8-10元不等。相较于瑞幸咖啡、星巴克等咖啡还是会更加省钱的。更不要说副厂的了,可以通过较低的价格喝到更多口味,我甚至有看到SOE(单一产区)的胶囊,准备下次买来试试看。

PS:SOE这种咖啡豆主要是喝的产区味道。平时的咖啡豆是通过不同产区的咖啡豆混杂,获得的一个大众接受度高的味道,优势是苦度和酸度都拿捏的非常好,比较好入口;缺点就是太平淡了,没啥特别的😂。因此选择SOE更多是为了更多的风味,比如花香水果香巧克力焦糖等味道,如果你觉得为啥要在咖啡里找这些味道,喝果汁不好吗?那么你可以简单的理解成,人们是为了偏酸一点或者偏苦一点。而这些芳香物质只是在追求酸度和苦度过程中的副产物而已。通常焦糖和巧克力味会跟苦一点的咖啡相关联;水果香或者花香的话会跟酸一点的咖啡相关联。

我买了什么胶囊?

我买了两个口味的胶囊,都是看网上测评买的:

  1. 灵感之源-佛罗伦萨阿佩奇欧咖啡
  2. 上海大杯咖啡
灵感之源-佛罗伦萨阿佩奇欧咖啡
甚至买了个比赛用的加厚Espresso杯子来喝咖啡,逼格拉满😂

风味主要是:莓果香和可可香,个人喝下来感觉可可香会更重一点,醇厚的味道(简单理解就是苦),已经作为我的早餐Espresso用了。(风味这种东西,因人而异,建议还是直接入手所有口味喝个遍,挑个喜欢且便宜的就好)

上海大杯咖啡

上海大杯咖啡是用来做Lungo的,所以会比较稀,类似美式咖啡,比较好入口,因此现在已经作为我下午的口粮咖啡了。风味是偏酸一点的果香味道,好入口,喝完无负担。

2024/07/29更新:

如果能接受果酸的话,无脑买哥伦比亚和Cosi就好了,这两个不会踩雷,其他的喝起来都一般般。

最后

接下来等把其他胶囊喝完,我就买别的口味的胶囊,挑一个我喜欢的长期喝。如果你也喜欢咖啡,但苦于身边没咖啡店或者咖啡太贵不能天天喝,建议你入手试试看,真的能够省钱提高生活幸福感的。

[SQL] 如何获取昨日每个小时的记录数量?

方法

利用左连接来实现逐小时查询(终于把数据库原理学到的知识用上了😂)

select a.click_date,ifnull(b.total,0) as total from (
SELECT date_format(date_sub(curdate(), interval 1 HOUR),'%Y-%m-%d-%H') as click_date 
union all 
SELECT date_format(date_sub(curdate(), interval 2 HOUR),'%Y-%m-%d-%H') as click_date 
union all 
SELECT date_format(date_sub(curdate(), interval 3 HOUR),'%Y-%m-%d-%H') as click_date 
union all 
SELECT date_format(date_sub(curdate(), interval 4 HOUR),'%Y-%m-%d-%H') as click_date 
union all 
SELECT date_format(date_sub(curdate(), interval 5 HOUR),'%Y-%m-%d-%H') as click_date 
union all 
SELECT date_format(date_sub(curdate(), interval 7 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 8 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 9 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 10 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 11 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 12 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 13 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 14 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 15 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 16 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 17 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 18 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 19 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 20 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 21 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 22 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 23 HOUR),'%Y-%m-%d-%H') as click_date
union all 
SELECT date_format(date_sub(curdate(), interval 24 HOUR),'%Y-%m-%d-%H') as click_date
) a 
left join (
select date_format(createTime,'%Y-%m-%d-%H') as datetime, count(*) as total from `order` where  `status` = 2 group by date_format(createTime,'%Y-%m-%d-%H')
) b 
on a.click_date = b.datetime

infull用于字段的补0,在无数据的时候可以补上0。

dateSub用于减去时间戳的时间

a主要是用来生成逐小时的时间字段

b主要是查询数据

on是用来执行left join的条件

如何在Sequel Ace中快速创建CreateTime与UpdateTime?

前言

本文章主要记录个人的开发经验,产生自最近进行的后端开发。

方法

1.切换到”结构”Tab

2.添加新的字段

3.UpdateTime字段设置为”TimeStamp”, 设置Extra为”on update CURRENT_TIMESTAMP”

4.CreateTime字段设置为”TimeStamp”, Default设置为CURRENT_TIMESTAMP

CURRENT_TIMESTAMP是MySQL自带的一个时间函数,用于生成当前的时间戳”2022-01-05T08:37:17.000Z”。

on update CURRENT_TIMESTAMP表示字段在更新时更新为当前的时间戳。

通过这样子的设定,可以将创建时间和更新时间的操作交由数据库处理,免去了开发者在后端进行额外的处理。

前端如何处理?

new Date("2022-01-05T08:37:17.000Z").getTime())

通过该方法可以快速的转换成距1970 年1 月1 日之间的毫秒数。

2021年年终总结

作者提到他的年终总结是回答了三个问题:1.今年什么事做得比较好; 2.今年哪些事做得不太好; 3.我学到了什么。

《掌控习惯》

1. 今年什么事做得比较好

1.获得腾讯音乐和阿里巴巴的实习机会

在4月份的时候,看到大家都在说准备春招,彼时的自己还在准备雅思考试,留学中介也在强调简历上有实习的经历会更容易的申请到学校。因此,自己屁颠屁颠的就跑去准备了自己人生的第一份简历,又像个愣头青似的直接开始了海投简历。一开始的自己啥都不懂,八股文、算法、简历经验啥都不懂,第一次面试甚至还选择了腾讯最难的WXG。毫无疑问,第一次就把我干下来了,不过自己也是抱着试试看的想法💡,也没太在意这次面试的失败。(我甚至感觉很平和,认为失败是必然的,事后才知道自己直接就面了最难了)多亏这一次的经历,让我及时的认识到了自己的不足,及时做了复盘记录,同时也开始了算法的复习。整个4月我都在持续面试,不管大厂小厂我都尝试投递了简历,并且也陆陆续续的获得各家的面试邀约,有顺利走完全程的阿里和TME,也有止步于一二三面的:猿辅导、PCG、网易、莉莉丝、百度、美团、DJI、小米,甚至有简历关都没过的:字节跳动、京东、PonyAI等,少说自己也海投了100多家了。最后多亏阿里和阿鹅一视同仁只看能力不看学历的态度,才最终收获到大厂实习offer,实在是欣慰和感动。

2.获得腾讯音乐的转正机会

经历7-9月3个月的实习,终于拿到了TME的转正机会,真的是很高兴也很庆幸自己能够从一所普通的院校毕业后,就能进入大厂工作,希望能够好好的把握机会,充分挖掘和发展自己的职业技能,让自己早日全款买到Model 3。

(2023年9月8日:现在自己已经攒够钱可以全款买Model 3了,不过我现在又想要敞篷了,人的贪念真的是无穷无尽的😂)

3.学习滑雪🎿

年初的时候,融创雪世界开业了,同时朋友们恰好想去滑雪,因此一拍即合同朋友组团去滑雪。在南方玩雪的感觉,真的是跟北方不一样,真的是太有趣了,虽然也摔了几次,但最终从初级滑道上滑下来的感觉真的是好开心啊。由此我也定下自己的小目标,争取在未来5年内去更多的地方滑雪玩。

4.入手M1 Macbook作为我的笔记本

我的上一台笔记本是Matebook X Pro,同样是一台挺不错的轻薄本,不过不知道是不是硬件的问题,系统总是宕机,为了更好的工作,在3月的时候入手了M1的Macbook作为我的主力开发机器。恰逢我是前端工程师,因此日常用的很多工具其实都是Base Broswer的,浏览器能跑的,我就能用,因此切换平台对于我来说并没有太多负担。高性能高续航深得我心,希望能够用至少5年以上吧。

2. 今年哪些事做得不太好

1.雅思复习

原计划是出国留学的,自从疫情反复不定之后,我就开始摆烂了,根本无心学习,导致越考越低分,实在不是学习的料,这个自认为做的是真的不好。

2.睡眠时间

最近一年都在忙着面试、开发独立项目、加班,总是缺觉,直到年底(11月-12月)才回到日均7小时30分钟的睡眠状态。之前天天6小时上下,还抑郁焦虑,真的是很难受,很孤独,最后导致自己的睡眠质量很差。不过不幸中的万幸是拥有两个很好的朋友,总是找我出来玩,舒缓了一部分的压力,实在是感谢🙏。

3. 我学到了什么

1.学校太差,经历来凑

2.投简历赶早不赶晚

3.海投简历,多试试看,总归不是坏事

4.积极寻找资源获得部门内推的机会

5.合理分配时间,多睡睡觉,身体才是革命的本钱

2022年Todo

1.毕业🎓

2.攒钱买Model 3

3.开发独立应用

4.平安喜乐,身体健康

(不爱搞虚的,放空话没用,还是订一些切实可行的计划吧,找女朋友我也想写上的,但这都是缘分吧,自己写上了22年年终总结也是要划掉的吧😂)

wTodo Watch版微软Todo客户端

背景

我是一个很喜欢用电脑记录待办事项的人,感觉不通过待办事项我很容易就记不住事情。由于原来是在华为全家桶的用户,对跨平台有强需求(Windows+Android),因此顺理成章的选择了微软Todo作为我的待办事项记录平台。说实话,即使今天我已经开始转回Apple全家桶,但Todo的工作效率还是比Apple自家出品的”提醒事项”要好用很多。(Todo添加逻辑很自然,一打开界面就可以添加编辑待办事项,没那么多繁琐的设置)。

简介

wTodo是一款为Apple Watch适配的第三方Microsoft Todo应用, 通过该应用您可以在Watch端, 操作自己的待办清单。

系统需求

  1. iOS 15.0+
  2. watchOS 8.0+

商店链接

仅售1元

应用截图

使用指南

https://w-todo-guide.vercel.app/