impressjs 与 introjs 的整合(部分改进)

之前曾尝试对 impressjs 和 introjs 进行整合,不过很不幸,整合后存在很多问题。

一个主要的问题是两者都重度使用了 transform 属性,造成很多冲突。最近浏览了一下 introjs 的 github 主页,在它的 issue 页面上,我尝试搜索了一下 transform 相关的 issue,果然有不少相关的帖子在说这个问题。

其中还有一位 fork 了这个项目的人提了一个 PR,说修复了 transform 的冲突,我看了下他的描述,感觉挺符合我目前碰到的情况。

不过他也改动了不少代码,包括 css 方面,原作者暂时也没有接受他的 PR 的合并。

于是去到他 fork 的分支下下载了他那个版本的 introjs 下来,试了下,发现还是有问题,不过原页面至少没有移动了。

不过被遮罩元素的位置还是没有算准确,导致偏离了遮罩框,文字跑到左边去了。另外在发生缩放时位置也还会偏移。

总之还是算有一点点改进吧,以后再看看计算的问题。

另外,原来那些 tip 框中的 button 都是显示英文,也顺便改成了中文;最后还设置了 introjs 中的一个 scrollToElement 属性,也避免了在后面几条 step 中页面发生偏移的情况。

总之也还不算是很好,不过跟之前类似,既然弄了,就先这样了,以后再看看能否进一步改进。具体参见:

//exp.xiaogd.net/demo/tour/v2/impressjs_features_tour.html

在 centos 7 上安装 oracle jdk 8

简要介绍了在 centos 7 上安装 oracle jdk 8 的过程

本文简要介绍了在 centos 7 上安装 oracle jdk 8 的过程。具体分为下载,安装,验证及附加的添加 JAVA_HOME 环境变量等设置。

下载

首先要下载,oracle 的 jdk 不同于 openJdk,没法直接通过 yum 等手段安装。

你也可以选择安装 openJDK,会比较简单些,也能兼容。

下载页面:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

在页面上,先选择“接受协议”,这样下载链接才会出来,再在相应链接上:右键--复制链接地址(注意,每次的地址可能有所不同)

image

以上选择了 64 位 rpm 包。如果是 32 位可以选择 i586 的。

然后在 shell 中使用以下命令下载:

wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm

其中:--header "Cookie: oraclelicense=accept-securebackup-cookie" 选项类似于手动的“接受协议”。后面的则是在上一步骤中得到的下载地址。

注意:因为文件较大,下载可能需要较长的时间,请耐心等候。

安装

下载完成后,就可以安装了。使用 yum localinstall 命令:

sudo yum localinstall jdk-8u131-linux-x64.rpm

文件名请自行调整为实际下载到本地的真实文件名。如果安装过程中弹出询问,选择“y”表示 yes 同意,然后回车继续。

验证

安装完成后,缺省会在 /usr/java 位置上,可以使用 ls 命令查看:

ls /usr/java

还可以查看版本:

java –version

如果输出了相应的版本信息,说明安装成功了。

设置 JAVA_HOME 环境变量

此步骤是可选的,较好的实践是把它设置上,因为有些应用可能会使用这一变量。

编辑 .bash_profile 文件,增加两行 export 输出:

export JAVA_HOME=/usr/java/jdk1.8.0_131 export JRE_HOME=/usr/java/jdk1.8.0_131/jre

修改 PATH 的值,在其后追加 $JAVA_HOME/bin(注意:多个选项间用冒号隔开):

PATH=$PATH:$HOME/bin:$JAVA_HOME/bin

使用 source 命令使修改生效:

source .bash_profile

使用 echo 输出以验证:

echo $JRE_HOME echo $JAVA_HOME echo $PATH

关于在 centos 7 上安装 oracle jdk 8 的介绍就到这里,以上步骤主要参考自:https://www.mkyong.com/java/how-to-install-oracle-jdk-8-on-centos/ 这篇文章,文中最后还介绍了安装多个 jdk 的情况,以及如何用 alternatives 来设置一个缺省的 jdk 及如何在它们间切换。有需要的同学可以参考,此处从略。

Mysql 的示例数据库 Sakila 介绍

介绍了 mysql 的示例数据库 sakila,包括安装,下载,导入,以及业务和结构的简要介绍。

在自学或者在一些个人项目上实践一些新特性时,经常需要有数据库的配合,但通常,公司的数据库是不能拿来私用的,这时如果有一些示例数据库就好办多了。

虽然也可以自行构建一个数据库并插入数据,但通常是一件较为麻烦的事,特别是准备那些有意义的数据。

Sakila 示例数据库简介

Sakila 是 mysql 中的一个示例数据库(sample database),提供了一个标准的方案,可用于自学,写书,教程,文章以及示例等等。

此示例数据库还展示了 mysql 的一些最新特性,比如视图(Views),存储过程(Stored Procedures),触发器(Triggers)等。

下载与安装

较新的 mysql 安装包通常带有这个示例数据库,只要在安装时选择完全安装,或者在自定义安装时注意勾选示例数据库即可。

也可以到 https://dev.mysql.com/doc/index-other.html 这个页面下载,或点击这个链接 http://downloads.mysql.com/docs/sakila-db.zip 直接下载。

下载的安装包中包含三个文件:sakila-schema.sql,sakila-data.sql 和 sakila.mwb。其中:

sakila-schema.sql 是数据库的建表语句等,

sakila-data.sql 是数据,

sakila.mwb 是 mysql Workbench 数据结构模型文件。(可忽略)

导入数据库

假如把上述文件放到了 C:/temp/sakila-db/ 下,则先通过

shell> mysql -u root –p

进入数据库,再通过以下语句导入 schema 定义:

mysql> SOURCE C:/temp/sakila-db/sakila-schema.sql;

再通过以下语句导入数据:

mysql> SOURCE C:/temp/sakila-db/sakila-data.sql;

你也可以通过一些数据库管理工具导入,此处不再介绍。

Sakila 数据库业务与结构

它是一个关于 DVD(电影)租赁店业务的数据库。包含的一些表比如有:

actor(演员),film(电影),category(类别),inventory(库存),customer(顾客),rental(租赁信息)等。

应该说这个业务也是较为常见,也较容易理解的。一个完整的表关系图如下:

image

此图即来自上述文件 sakila.mwb。

关于 sakila 示例数据库的介绍就到这里。

Java 大法好,GC 保平安——关于性能权衡(tradeoff)的一些思考

Java 之父 James Gosling 在一次接受采访谈到 C 语言时说:C 语言的一个大问题之一是“一切都会尖叫着停止”,"Everything comes to a screeching halt" is one of the big issues in C, because of the way that they do pointers……

语言的鄙视链是一直存在的,有人会以自己使用的语言更灵活,更底层,效率更高而自豪乃至鄙视其它一些语言的使用者,比如 C 语言的使用者可能看不上 Java 语言的使用者。Java 之父有一次谈到了 Java 与 C 语言的对比,他是怎么说的呢?

从 C 语言的一个大问题说起

Java 语言之父 James Gosling(高司令) 在一次接受采访谈到 C 语言时说:

C 语言的一个大问题之一是:“一切都会尖叫着停止”,源于它们使用指针的方式……

"Everything comes to a screeching halt" is one of the big issues in C, because of the way that they do pointers.

image

图片来自 wiki,为挪威表现派画家爱德华·蒙克(Edvard Munch)的作品《尖叫》(The Scream

以上言论来自《编程之魂:与27位编程语言创始人对话》Java 部分:

image

可以在 china-pub 网上免费看到 Java 的这一章节:

http://images.china-pub.com/ebook195001-200000/196657/ch12.pdf

英文版参见:https://archive.org/stream/MastermindsOfProgramming/Masterminds%20of%20Programming_djvu.txt

看待性能的一个新角度

我们经常能看到一些对于 Java 语言性能的诘难,但如果你只是看到它失去了一些性能,却无视它因此得到了什么;又或者你只看到自己喜欢的语言有很好的性能,对于它因此失去了什么却视而不见,那么这样的对比是没有意义的。

关于性能,我曾经读到过一个很不错的观点,它来自于 MIT 公开课《算法导论》中那位光头佬教授。他是这么说的:

performance is like money, it’s like currency...performance is what you use to pay for user-friendliness,it’s what you pay for security...so that’s why you want performance, because you can use it to pay these other things that you want...

性能就像钱或者说货币那样……性能可以用来换取用户友好性,可以用于换取安全……所以这就是我们追求性能的原因,因为它可以用于换取一些其它我们想要的东西……

关于性能与体验的一个具体事例

的确,单独追求性能是没有什么意义的。比如,单纯地从 0.01 秒提升到了 0.001 秒,对于用户的感受来说,他是觉得没有什么区别的,都是“一眨眼”的事情,他的体验还是一样的,0.01 秒对于他已经是足够快了。

当然,这绝不是说,性能的提升是多余的。提升到 0.001 秒后,我们可以用这点性能**交换(tradeoff)**到一些东西。

比方说,原来是命令行窗口,现在就能上 GUI 的图形界面了。这样一来呢,性能又下降了,响应时间可能又从 0.001 秒降到了 0.01 秒,不过用户操作依然感觉很顺畅,但另一方面,从命令行到图形界面,用户体验却得到了极大提升。

从某种意义上说,我们“牺牲”了性能,换来了体验更好的用户界面。这种牺牲是值得的,也是我们想要的。

当然,它的前提是性能的提升。如果在 0.01 秒时就强行上图形界面,那么响应时间可能掉到了 0.1 秒,用户就可能觉察到卡顿了,虽然提升了体验,但操作的顺畅度却下降了,可能得不偿失。

所以,这就是所谓的性能的货币效应。

牺牲部分性能,Java 换来了什么?

那么,从 Java 语言的角度看,它也确实做了很多这种交换。

像垃圾收集(GC: garbage collection)这种就不必说了,可以使得用户从繁琐的内存管理中解脱出来。

又比如数组,Java 额外做了边界检查,牺牲了一些性能,但却使得程序更为安全。如果有人无视这一点而抨击它的性能不如一些语言,则显然是不公平的。

另一方面,许多没有这种检查的语言经常饱受溢出攻击的困扰。

有些人可能会对自己的技术能力有着盲目的自信,他们会说,“我们写的程序都是很严谨的,只有小白写的程序才会出问题。”

可是,他们真的能拍着胸脯说,他们写的程序永远都不会出问题吗?没有问题也许是暂时没有被频繁使用所以没有暴露,又或者是被攻击的价值不大,没人有兴趣去挖掘那些漏洞而已。

又或者说:“没有能力才会去依靠 Java 这种傻瓜的语言”。看到越来越多的菜鸟,甚至门外汉涌入编程世界,他们觉得有些不满又带有些不屑。

在我看来,这种情绪是没有必要的。软件的极大繁荣,却恰恰在于有越来越多简单的语言拉低了编程的门槛。

如果今天还在用汇编语言,以它的高门槛,很难想象我们今天打开手机就有如此丰富多彩甚至过剩的软件可用的局面。

至于说这些语言不够轻量,不够底层,效率不高?这些都不是问题,主不在乎,消费者不在乎,你的老板也不在乎。

我们已经说过,单纯的性能其实是没有意义的。如果我们不能综合地去看待,片面地纠结一个方面的问题,自然只会得出有失偏颇的结论。

mysql 创建本地用户并赋予数据库权限示例

简要介绍了在 mysql 中如何创建一个本地用户并赋予相应数据库权限。

在安装 mysql 时通常会生成一个超级用户 root,很多人之后就一直沿用这一个用户,虽然这会很方便,但超级用户权限太大,在所有地方使用它通常是一个安全隐患。

这一点跟操作系统的用户管理也是类似的,多数人贪图方便都直接使用 administrator 或 root 用户,其实是一种不建议的做法。

那么,要如何在 mysql 中创建 root 之外的用户并赋予相应权限呢?我们直接来看一个示例:

CREATE USER 'golden'@'localhost' IDENTIFIED BY 'gd2017'; GRANT ALL ON myapp.* TO 'golden'@'localhost'; FLUSH PRIVILEGES;

对上述语句,这里简单解析一下:

1、create user 语句用于创建用户(及密码)。

其中 golden 是用户名,gd2017 是密码。localhost 则表明是本地用户。

2、grant 语句用于对用户进行赋权。

其中,all 表示所有的权限,包括对数据的增删改查及更改数据库;myapp 为具体某个数据库名,myapp.* 表示该数据库下所有的表(以及视图等);golden 则为刚才所建立的用户名。

3、flush 语句使更改生效。

通常,以上设置能满足一般的需求了,更细化的配置,可以参考 mysql 官方在线文档(5.7 版):https://dev.mysql.com/doc/refman/5.7/en/create-user.htmlhttps://dev.mysql.com/doc/refman/5.7/en/grant.html