Gutenberg 编辑器很难用啊

这个月缺失 13 天

2018-11-30

缩进到底是 tab 好还是 space 好呀?求各位大神解答。

后来我想了想,觉得还是用空格好,没有特殊要求还是用空格。

https://eslint.org/docs/rules/indent#enforce-consistent-indentation-indent

2018-11-29

VueConf 2018 杭州(第二届 Vue.js 开发者大会)于2018年11月24日在杭州举办,本视频为 Vue.js 作者的演讲视频。

https://www.bilibili.com/video/av36787459/

继续阅读“Gutenberg 编辑器很难用啊”

segfault

今天上班遇到了一个问题,就是php的一个错误:segmentation fault。我是第一次遇到,面对这个单词的时候,还陌生,总是发音完全——“segmentation”,但是有经验的人会简称为“segfault”。 比如这个链接描述的:https://github.com/ezyang/htmlpurifier/issues/79 。 那就分享一个库:htmlpurifier。 我在github上问了这个作者为什么会造成segfault,结果是因为php版本的原因,php语言本身的bug,也是第一次意识到了php版本低所造成的问题。在github上第一次有开源作者答复我的issue,开心。介绍一下htmlpurifier的基本用法:

  1. 基本用法:/** * 过滤掉html里的class属性,没有协议的href属性 * @param string $html 输入的html * @return string 输出的html */ public function checkMore($html) { include_once ‘htmlpurifier/HTMLPurifier.auto.php’; $config = HTMLPurifier_Config::createDefault();$config->set(‘Attr.AllowedClasses’,’someClassesNotExists’); $config->set(‘AutoFormat.Linkify’,true);$purifier = new HTMLPurifier($config);$html = $purifier->purify($html);return $html; }
  2. 其中的‘.’是什么意思:

$config->set(‘HTML.Allowed’, $value);和$config->set(‘HTML’, ‘Allowed’, $value);是一个意思。 具体细节自己去看。

五月六月

大一入学军训的时候,我们班助是一个大四的师兄,他跟我们说:你们现在还大一,很年轻,有很多机会,而我马上要毕业了。他的声音里不住地流露出的伤感和凄凉,触使我在下面接了一句(我只在完全放得开的环境下才会接话,不过这不是一个好习惯):我们很快也毕业了。这句话被很多人记住了。

今天,这句话终于成真,昔日站在军训队伍里的男男女女现在都来到了这个时节,这件事情足以看出我的先见之明。再分享一个预测的小诀窍:比如你今年是20岁,你可以预言再过十年,你就是30岁。这个先见之名不在我之下,跟时间过招,你只有顺着它的意,才永远不会输。

从2016年的5月份开始,我回到学校,和室友一起去五食堂吃饭吃粉不吃包子。用餐后,他建议我们给这顿饭打一个分数,没想到室友慷慨的给出了高分,这个分数远比我们毕业答辩老师给我们评的成绩要高。在五月六月的时候,我们吃完饭的对话是这样:

“你给这份酸菜扣肉打多少分?”

“100分。你呢?你的西红柿鸡蛋番茄,看起来也相当nice。”

“我给60分,及格分数,做人不要追求满分,要知足,对不对?”

对话有点酸了,我想我们真的开始在留恋学校的生活了,不管别人说这是一个三流城市的五流学校还是我大学四年最大的遗憾是没有去复读,这一刻,我们真的要走了,估计是永远别过学校生活和学生生涯。我再怎么故作坚强,我还是矫情了,大学四年戎马倥偬白驹过隙,但依稀历历在目尽在眼前。

大一的我立志走上仕途,深感中国的未来应该交给我这种充满抱负和理想的年轻人手上,我去学生会面试,对方却因为我穿着拖鞋而拒绝了我,意思是穿拖鞋的我侮辱了穿皮鞋的他;我积极响应党支部的号召写入党申请书,结果团支书告诉我,我不是班干部,这一次没有我的份,等来年的机会。

后来我跻身新闻界,成为团组织的喉舌,领导开会我积极响应跟在后面写会议记录,一个字一分钱,1000个字被编辑改得只剩下100个,但是文章依然是1000个字,半个学期下来也能赚个半百。这让我后来看柴静的《看见》真是深有体会。

大二开始学习编程,跟着老师同学做东西,非常开心,时间也过得飞快。大三的一年,当我回到宿舍的时候,室友已经睡下,当我起来的时候,室友依旧在睡着。这段时光非常难得,促使我即使临近毕业,我也依然能够找到工作。大四实习了半年后,回到学校就准备毕业了。

25号,我还在学校,我把他们一个一个都送走了。我送任修修的时候,他哭了;送吴硕硕的时候,他也哭了;送覃道道和范佳佳的时候,他们强忍着不哭。还有很多人我没有送到,如果我去送了,估计他们也是要哭的。毕业了,你们都走了,我还在这里坚守。

 

支付宝

多年以来, 我一直希望做一个自由职业者,能够靠写写代码和文章,  一家人也能过的不错。 然而, 我什么也没有做好, 只学会了给出我的可以扫描的二维码支付宝账号。

.gitignore文件的作用

在团队开发中,不是所有的文件都需要共享的,比如数据库配置文件。你和别人在本地开发时,数据库密码可能会不一样,生产环境和测试环境的数据库密码也会不一样。这时.gitignore文件就可以帮你忽略这些更新,比如在.gitignore文件里加入这么一行:

database.config

来忽略你的数据库配置。 另外再值得一提的是,我们一般会配置一些常量,这时最好将数据库常量和其它常量分开,因为上面就提到数据库连接的问题了。

笔者当然经历过调试bug很久,最后发现是git pull下来后数据库常量值变了的苦逼情况。 来看看.gitignore文件的匹配模式是怎样的?

空白行不会匹配任何文件,所以一般为了可读性作为分隔符。

#开头表示注释一行。 连续的两个**号匹配一切文件夹,**/foo/bar匹配一切foo下的bar文件夹,abc/**匹配abc的一切文件和文件夹,但是这些匹配都是相对于当前的.gitignore文件位置来说的。 a/**/b匹配a/b, a/x/b, a/x/y/b。 /*.c会匹配cat-file.c,但是不会匹配mozilla-sha1/sha1.c

/* !/foo /foo/* !/foo/bar 这个感叹号的意思可以看做是不包括,它是对上一条规则的重新定义,比如/*忽略一切文件和文件夹,但是!/foo表示不忽略foo里面的文件和文件夹。

最后我们不要忘记在.git/info/exclude文件里也是添加忽略文件的。

毕业实习报告

终于要毕业了。第一次参加这么长的社会实习,也算不得“社会”二字,毕竟同事也是学校的老师和同学,但是算得上幸运。因为公司是老师和学生开的,大家在一个桌子上共事了许久。

读书十六载,用到“载”字,估计语气也沉重了许多。这次毕业不像小学毕业、初中毕业或者高中毕业,这次毕业很有可能意味着是我学生时代的终结。读了这么多年的书,终于要换一个环境,或者说终究要换一个环境,以后都不再踏入校园,心情多少回有点不一样。 还是说我的毕业实习的情况。 一:早点起床。 上班的日子,让我最印象深刻的是要勤奋。如果你今天8:30起床,那么你明天就会8:30之后起床,这样就会增大上班迟到的风险。同时,如果你早上8:30起床的前天晚上睡觉时间是12:00,那么你就更有可能在下次睡觉时间推迟到1:00,这样一来总有迟到的那一天。迟到了一天,如果一个人知道警醒,就会做出调整,如果这个人不是never learn,那么这一次调整就是最后一次调整。不过我重点要说的还是要早点起床,回到一日之计在于晨这句话,只有早点起床才会有更大的发挥空间。 比如说,早上起来可以看《道德经》,在实习期间,我不只一次想早起看《道德经》,但最终因为道德品质太差起床太晚导致读经失败。说到读经,有下面一段有意思的文字:

顾栋高先生复初,清康熙辛丑进士,性倨慢不合时,仅三载即归田。深于经学,自幼至老,未尝一日不读书,于五经皆有发明。

掌教淮阴时,夏月坚闭重门,解衣裸体,寸丝不挂,手执一卷,高读不辍。客至,自门隙窥之,大笑。

先生仓皇著衣而出。谈者传为笑柄云。

我也可以这样。 二:早点吃饭。

大家知道一到吃饭点,人们就会出公司吃饭,这个时候人会巨多,需要排队等候,排队往往会浪费更多时间,看起来因提早吃饭而破坏公司规矩,但是实际上是获得了更好的体验并且赢得了时间。 吃饭的哲学在于细嚼慢咽,而饭菜的哲学是体现食物原来的味道。最恨那种吃饭赶着去投胎,没吃之前你等他半天,吃完了他抹鼻子走人不等你的人;而饭菜,最恨是放了一堆调料,吃不出猪肉和鱼肉的区别。 吃饭有个难点,就是不知道在哪里吃?去这家店子吃了两个月,如果想要换一家反而自己觉得做了亏心事。做顾客做到这样良心发现,估计这家店的味道要变差了。 三:慢的哲学。 代码写的越慢质量越高。如果要得出这样的结论,可能要加上一些故事前缀:

我写代码多年,有一天夜里,我满身大汗醒来,梦到了阿兰·图灵和冯·若依曼对着我说:你写代码太快了,都是bug。

代码之道在于精益求精,而只有“慢”,才能让你写出能运行更久的代码。戏谑者称,代码之道在于慢,以后所有的编码人员都会对着电脑发呆,双手放在裆下,美其名曰:思考未来。 四:不可说的秘密。 我虽然因为起床太晚,没有完全看完《道德经》,所以只记得“道可道,非常道”,实习中的其它体会同样也是不可说的,说出来就没有意思了。 人完全有这样的一种情绪,很微妙,让自己快乐也让自己哀愁,这种情绪是不能袒露的,它的全部意义在于情绪的所有者。

五:想想未来。 哈,这种思考双手不用放在裆下。学生时代的结束,是打工仔时代的开始,这也许是我们每人美好生活的开始。

四点记录

没看过什么书,没什么工作经验,浅谈。 我想团队协作的基本原则是沟通顺利和互不影响各方的工作,如此一来就会面对工作同步或者滞后的问题。

刚刚开始没有经验的团队,一般流程是出设计稿、编码、测试,甚至是出设计稿、编码、出设计稿、改码、出设计稿……,永远不知道什么时候是测试时间,有一天老板心血来潮要体验产品,结果一堆bug,产品实现人员被骂得狗血淋头。 好像一开始就扯远了文不对题了,好,开始数点。 1.前后端如何配合 前后端的配合主要是数据获取和操作的问题。一般的做法的是各方自己写自己的,前端需求有了问题或者API调用不对头,后端改一下。很明显,这样并不好,会导致沟通成本增加(不要太简单的理解沟通成本)。 既然这样有问题,你可能会问那前后端在工作开始就确定API的调用接口不就好了?这样其实是没有什么用的,因为你还没有进行编码工作,你对这个产品并不了解或者细节了解的不深,双方的沟通是没有深度和不清晰的,即使一开始沟通了,后来还是再次沟通。

前端其实一开始不需要数据,可以自己模拟一些数据来实现界面设计的实现,这个时候后端编码人员也在同步进行API设计。

界面快要完成了,前端和后端编码人员进行API的核对和商讨,这个时候,编码人员对整体的架构都有清晰的认识,沟通就比较高效。

工作上也谁都不耽搁。 我这么说不是否定沟通,而是如何进行高效沟通。

2.面向对象编程如何设计你的类 在数据驱动的产品中,用户的所有的操作都是操作他的数据,一个类的设计也应该围绕数据操作来进行,如果有一个user表,那你的代码肯定也有一个user模型,围绕增删改查来组织你的代码,无论你的c层的逻辑如何,m层的代码实现也不会受影响。 这样的好处是m层和c层的代码耦合度很低,以后改起来很方便。以前写代码没有经验,写了很多难维护的代码,也不优雅。 3.作为一个编码人员的基本素养是什么 在目前,我只能简单的理解为你要对你的代码负责,负责包括写好注释,测试代码的功能和使用流程。

当然,我也问过很多人这个问题,他们都说不知道,这个问题了太难了。反过来想,有答案不见得是好事,追求答案的状态才是重要的。

一个编码人员在不同阶段对素养的理解和追求应该也是变化的。

只能说,我要做一个有职业素养的人。 4.2015的总结 上了半年班,可能是人生最后的寒暑假没有了,我心里很不情愿,我还没有做好心理准备,lol还没有上大师,心有不甘。

但是我是适应能力很强的人,所以没有上的大师以后再上。 说到最后都是感谢。如果有两个关键字的话,我想一个是拒绝一个是迎合,无论我得到的是拒绝还是迎合,我都学到很多东西,特别是那些我去实现和追求某些东西能开导我的道理,感谢你们。

怪谈“观察者模式”

对于代码的设计模式,我用的不多,又不甘心说自己是乱说,所以只能取个“怪谈”的名字。

观察者—我对这个名字充满了好感,如果你也像我一样,对这个名字多念了几次,就能读出世态炎凉人情冷暖的味道来。

所谓观察者模式,就是“冷眼旁观”的写程序,我在一旁盯着,老板说这个功能不要了,那好,我撤销一个观察者;过了一些时日,老板又说,你再加个功能,很简单,我再加一个观察者。在这样的情况下,无论老板怎么虐我,我都能快速的组织代码,实现功能。

不过大家不要误会,我拿老板做例子,不是总是树立雇佣双方的矛盾,在实际开发中,需求改变在所难免。

观察者模式的代码实现具体是怎样的呢?

abstract class Observer { abstract function update(); } class Observer1 extends Observer { public function update(){ echo “我是第一个观察者<br>”; } } class Observer2 extends Observer { public function update() { echo “我是第二个观察者<br>”; } } class Eventer { private $observers = array(); public function addObserver($observer){ $this->observers[] = $observer; } public function trigger(){ foreach ($this->observers as $observer) { $observer->update(); } } } $eventer = new Eventer(); $eventer->addObserver(new Observer1()); $eventer->addObserver(new Observer2()); $eventer->trigger();

上面的代码串的意思是使用了一个叫做“Eventer”的观察者类,来管理继承了“Observer”这个父类的类,通过Eventer观察者来处理操作监听Observer类的状态,反正思想大致如此,具体实现随便玩。

有时,我为了强用设计模式,甚至写出这样的代码来记录一个日志:

interface Observer { public function addLog(); } class LogObserver implements Observer{ private $file_path = “./error.log”; private $message; private $special_message; public function __construct($special_message) { $this->message = date(“Y-m-d H:i:s”).”===”; $this->special_message = $special_message.PHP_EOL; } public function addLog() { error_log($this->message.$this->special_message,3,$this->file_path); } } class LogMaster{ function __construct(Observer $observer) { $observer->addLog(); } } new LogMaster(new LogObserver(‘log info’));

有人说,上班久了,无聊了,要开始炫技了。