Becomin' Charles

算法 | LNMP | Flutter | Mac

Becomin' Charles

如果数据库只有一份,那就是数据存储的单点,对于要求可靠性的服务来说,就存在一个单点故障的可能性,这个时候,我们就要通过复制镜像,来解决单点故障。复制还有一个额外的好处,就是可以根据主从,做读写分离,这样,就不会在写入的时候,因为锁表,而降低MySQL的并发性能,所以MySQL复制是MySQL中非常基础的一种操作。

怎么配置

配置Master

首先,要做的是确定一个Master,对于充当Master的MySQL Server来说,需要一些特定的配置才能实现,一个是开启binlog,另一个是要设置server-id。

[mysqld] log_bin = mysql-bin server-id = 1

配置Slave

配置Slave,对于Slave来说,要配置的就是一个唯一的server-id。这个id不能跟Master相同,而且,多个Slave也不能相同。配置完毕后重启。

[mysqld] server-id = 2

创建User

在Master创建一个user,专门用于进行复制用途的。因为在Slave上,user和password会被用明文存储,所以,这个user的权限要尽可能的小,一定要不同于超级用户。

create user repl@'your.domain' identified by 'password'; grant replication slave on *.* to repl@'your.domain';

注意,这里第2句,grant语句,必须是赋权限给*.*的,因为replication slave权限是一个global privileges,所以,必须这样,如果想要限制权限在一个比较小的范围,不想复制所有的db的话,可以在my.cnf增加配置项replicate-do-db和binlog-do-db来限定数据库的范围。

获取Master的位置

在Master的数据库上,知行flush tables with read lock;语句,然后知行show master status;这时候,就可以看到当前的binlog文件名和当前知行的sql语句位置。将文件名和执行的位置都记录下来。

这时候,如果Master的数据库的内容非空的话,应该做的事情,就是使用mysqldump来导出数据。空数据库的话,就没必要做什么事情了。

建立连接

在上文空数据库的情况下,是很简单的,stop slave,直接在slave上使用change master to语句,将各项参数设置完毕后,就可以执行start slave了。

如果Master原来有数据,应该把刚才生成的dump文件,传送到slave上,然后首先stop slave,然后导入dump的数据,然后执行change master to语句,将刚刚dump前记录的bin文件和位置都设置正确,然后才能start slave,其实也不麻烦。

状态检查

在比较理想的世界里,到这里,我们的工作就结束了,但是,世界是不理想的,因为各种原因,这种replication的联系,经常会中断的。所以要时不时检查这个联系。

在Master上可以执行show master status看到的东西和上面看到的是一样的。

在Slave上可以执行show slave status,可以看到很多的信息和错误提示。一般情况下是没错的,一旦发生错误了,就应该从这里获取相应的信息来解决问题。

http://quercus.caucho.com/

昨天晚上,仅仅是出于好奇的搜了一下,竟然真的有这种项目的存在,在JVM之上,实现了一个PHP。人类已经不能阻挡Java的节奏了啊。

关于这个,要在以前的我一定会嗤之以鼻,这算什么东西呢,不伦不类的。但是现在的话,也不得不静下心来想想,为什么。

PHP的门槛低,这个主要体现在,第一,程序员多,因为PHP的成功,为全世界培养了海量的程序员,不敢说多靠谱,至少数量多的,那么对于某些企业来说,招聘PHP程序员会比Java容易一些;第二,部署容易,PHP之所以流行,这也是至关重要的一个原因,只要拷贝文件即可;第三,成熟的应用很多,现在Web产品里,面向个人的应用里,很多都是PHP开发的,如果想直接运营这么个产品,直接拿过来,是很理智的。

Java技术成熟,Java的技术太过悠久了,积累了无数的可以使用的类库,还有就是中间件。做这么一个东西,也是一个合理的想法吧,博采众家之长嘛,至少可以融汇Java和PHP的优点。

提高性能,PHP是解释执行的,但是Java是编译执行的,至少是存储成中间码再执行。两者结合的话,PHP可以从解释执行,进化到字节码执行。号称Drupal可以这个平台上,性能提高4X。并非没有可能,如果再左以连接池啊等等东西的话。

当然了,银弹是没有的,但是我觉得这还是一个很好的尝试!而且我看2014年竟然还发布版本了,至少这个还是保持活跃的。知道一下这个东西也好,或许哪天会用到。

这是一个交互案例,很多时候,我们可能就是需要一种交互来完成一个操作,但是我们就是没法想出来很好的解决方案,这种的案例,我遇到不胜枚举,但是每次,我都没有把这种奇葩交互给记录下来,今次,我就想到了要记录下来这个事情,以便今后查倒的时候,可以有据可凭。

为什么

不知道多少人,看了我的标题,能理解出来我要做的是个什么交互?其实场景是这样的,我写了一个 WordPress 的插件,功能是显示博客的文章归档,名字叫 Better Extended Live Archive,这个插件目前能提供三个 tab,每个 tab 一种归档的纬度,来展示用户博客的文章列表,比如按照时间纬度,按照分类纬度,按照 tag 的纬度。

从上图中,我们可以看到,有三个 tab,分别是 By Category,By Date,By Tag,这三个 tab 的显示与否,是可以在后台配置的,同时,这三个 tab 的显示顺序,也是可以可以配置的。所以本文的问题就来了,怎么样让用户决定显示与否以后,再决定其显示顺序?

我想出来的方案

其实,要实现这个根本不难,你肯定会这么说对不?左边一个列表框,右边一个列表框,然后右边代表“待选”,左边代表“选中”,然后加一个上下按钮,来调整顺序,这其实就是用标准的 HTML 组件拼装这个交互的例子了,但是,如果我写插件的时候那么去实现,工作量要大好多,第一个,我要用 PHP 去渲染两个列表框,这就很麻烦了,第二,我要再页面上写一堆 js,来实现左右移动的,上下调序的交互,太累。

而实际上,从本质上,一个列表框,就能包含这两重含义了,第一,multiselect,可以让列表框多选,就可以表达选中这层含义;第二,列表本身是有顺序的,就可以表达顺序,那么为什么一个控件能表达的东西,我却要花那么大力气去实现呢?

所以,第一版的时候,我就真的放了一个列表框在那里,可以多选,选中一项点保存后,就会优先显示被选中的,将没被选中的 tab 接到列表的末尾。提交的时候呢,因为只提交选中的项,所以,被提交的顺序,是列表显示的顺序。只有一个单一列表的时候,这个列表通过这么个简单处理,就可以完成我说的两重任务。先显示选中项,这就表示,通过选中某个并保存,可以调整列表显示顺序。也即,通过若干次选中,并保存后,我可以用一个单选框,模拟出任何我要的选中状态和顺序。

最终采纳的方案

通过论证和实验后,我真的把这样一个版本给提交发布了。因为我认为它在功能上是完备的,完全可以表达我想要表达的逻辑了,当然了,使用这样的东西,还是需要技巧和逻辑的基础的。充其量,这是一个 60 分的功能,能用,但是难理解,难用而已。不是坏的。

当然了,如你想见,你不能总是交给一个用户仅仅能用的东西。在第二个版本中,我就改进了这个设计。它需要的不仅仅是完备,而且要好用。就好像图灵机很就牛逼了,那又怎么样,我还是需要 iPad。作为读者,如果我不做个动画,估计你们光从文字描述都看不懂我在说什么,不过没关系,你只要知道我最终采用那个方案就行了。

我通过搜索“select and sort”这样的关键词,竟然真的找到了解决方案,而且同样不需要我花多大的力气。主要是有人在 StackOverflow 上问了这个问题,最佳答案里,竟然也给出了让我相当满意的答卷

是一个叫 jQueryUI Multiselect 的插件,很赞!第一,我仍然只需要一个列表框就行了,因为我分析过了,一个列表框显然可以表达两重意思,只是交互不友好而已;第二,交互通过 js 完全补全了,而且是渐进式增强式的,就是说,没有这个 js,或者 js 不起作用,就退化到我原来的方案,其作用了,就变得很好用。Perfect!

总结

作者能想出来这个插件,并按照这样的方式去构建,简直让我拍案叫绝。真是英雄所见略同,但是我比他懒!

我自己想了想,貌似只有很傻的办法呢:

  1. 创建一个新的空数组,插好要的数据,然后把原来的数组接在后面,用foreach可以,但是弱爆了,不如用+。
1
2
3
4

1, 'b' => 2);
$new = array('c' => 3) + $original;

  1. 先将原数组 array_reverse 一下,然后用 array_push,然后再 array_reverse,不错,不如第一个效率高。

你们想想看啊?

OAuth1.0Core

现在已经是OAuth2.0的时代了,整个中国互联网圈子,基本都在使用OAuth2.0了,但是我们可以看到,Twitter,这个曾经引领 了互联网开放平台的先驱,依然固执得坚持着使用OAuth1.0,而且现如今都在使用OAuth2.0的这些中国互联网平台们,也都经历过 OAuth1.0的历史阶段。了解历史才能展望未来,就让我们来看一下什么是OAuth1.0吧~

阅读全文 »

OAuth-cartoon

最早的OAuth诞生于2006年11月,当时,程序猿布莱恩·库克(Blaine Cook)正在实现Twitter的OpenID。与此同时,Ma.gnolia(一个社会化书签服务2005.12.25~2009.1.30)需要一 个解决方案,允许使用OpenID的成员,授权Dashboard Widgets(Mac系统的桌面小挂件)访问它的服务。这样库克、克里斯·梅西纳(Chris Messina)和来自Ma.gnolia的拉里·哈尔夫(Larry Halff)与戴维·雷科尔顿(David Recordon)会面,讨论在Twitter和Ma.gnolia API上使用OpenID进行委托授权。他们的讨论,得出一个结论,没有开放标准完成API访问的委托。

阅读全文 »

好吧,我必须要承认,我是一个标题党来的。本文英文名称意思比较准确。什么?你没看到英文名称在哪?不是写给你看的,你当然看不到。

在Web开发过程中,你总是因为各种理由,需要跟服务器打交道,因为各种理由需要承担一点点运维工作,哪怕你需要运维自己的blog,比如用Linode这种东西。那么服务器运行,就少不了log,log不少,就不得不翻滚,就是rotate,不知道中文是啥……

阅读全文 »

我所在的团队负责研发一款企业应用,在其管理后台,需要用到日期选择器,因为是这种企业软件,所以很多场景需要用到报表,报表按照月查看,按照年查看的很多,所以在使用日期选择器的时候,就需要按月选择和按年选择的场景。

但是 jQueryUI 只提供了标准的 DatePicker 进行日期选择,却没有提供专门选择月和年的选择器。所以,这时候各种交互设计和前端设计师开始各县神通了,各种自己发明的交互方式。

https://github.com/eternicode/bootstrap-datepicker

这个项目是我通过 Google 搜索的一个老外发明的,深得我心,感觉保持交互的一致性和美观性。推荐给诸君。

很多年了,谈这个问题的人太多了。不过我觉得,恐怕方法科学,结论也科学的不多。

先来说几个方向,从网站优化的一般处着手。博客也就是个内容站。关于内容站,我们可以做点什么呢?

Web 服务器,选什么?我推荐还是 Apache,目前公认最稳定的服务器,没有之一。这是题外话。那么 Web 服务器的配置,正确么?注意我没问是不是最优,就先问正确不?MPM 至少有三种模式,你用哪种?为什么?这种模式的参数配的多少?是推荐值么?最佳要自己测,但推荐数值还是有的。有人说应该把 AllowOverride 关掉,你关了没?为啥关,为啥没关?

伺服静态文件的能力不行,是否考虑前面套一层 Nginx?

接着是 php,apc 装了没?

然后,该整数据库了,那么,MySQL 是否配置正确了?查询缓存配置了没有?配了多大?索引缓存配了没有?配了多大?不是越大越好噢…

到这里,差不多,都正确了,我们再来看,是否优化了。说到这里,就不得不谈指标,抛开指标谈优化,就是耍流氓。很多优化文章你可以看看,有没提这个。比如优化目标是什么?降低负载,不降,虚拟主机就禁止我用;提高首页访问速度,用户至上;

在这个目标基础上,指标是什么?CPU 占用降低一半?首页呈现短于 1 秒?

这时候,需要闭环反馈了,我调了个什么,产生什么结果?你能立刻知道么?通过什么知道?别说是目测,那不准。

为什么谈了半天,没说 WordPress?因为你要西瓜,不要芝麻。有些小事,效果很好;有些费劲,效果很差。说到 WordPress 就是后者。你要相信,WordPress 再怎么差劲,全球几百万人用着,不会想不起来优化,所以里面不敢说最优,绝对跟慢,差劲,这几个字眼挂不上钩。有人说,太重,说得是功能,你要简单,搞静态页啊,那个肯定快。

怎么搞 WordPress?首先能有办法纯静态么?有个 cos-html 的插件,全站静态化,那速度,没得说。

不行?那缓存能搞么?super cache 这种插件就好一点了。

还不行?最麻烦,效果最小的东西来了,上 xhprof,做分析,有些,能看出来,有些看不出来,看不出来的情况居多