为DirectAdmin站点开启HTTPS

自从把博客切成静态站点后访问速度秒WordPress几条街,所以顺势也就把网站上了HTTPS,目前看来效果不错,看着浏览器的绿🔓感觉莫名的安心。

本文介绍如何为部署在DirectAdmin上的站点开启HTTPS访问。

申请SSL证书

既然是免费SSL证书,第一个想到的就是Let's Encrypt,DirectAdmin在1.5版本开始就集成了Let's Encrypt服务,所以在面板上点点就能拿到一个永久的SSL证书,对于在VPS上部署DirectAdmin的人来说真是lucky。

然而我的站点还架在老版本DirectAdmin的虚拟空间上,只能自己找SSL证书了……

目前了解到的BAT三家、七牛等国内云服务商都可以申请到1年免费的SSL证书,来自Symantec。对于个人站点来说,使用这类免费证书都是推荐的。要注意有一些免费的证书提供商今年因为安全等原因相继被各个浏览器弃用,所以申请的时候要优先考虑公信力高的品牌和机构。

Discourse国内建站攻略

最近帮朋友建了个关于数据科学的交流论坛。说实话,近几年运营社区相当不易,网站推广、内容筛选、站务管理一堆麻烦事,不免勾起了学生时代论坛撕逼的黑历史,而当年技术圈的“知名”论坛,现在很多沦为了广告集中地,内容质量已大不如前,操作习惯上也还停留在十年前,体验和SEO都很糟糕。

一开始我是拒绝的,直到某土豪一言不合的买ECS,后来心想不如借此熟悉下ECS和Discourse,一番折腾后论坛上线了:DataGeekers

当然本文只记录建站方法,不讲论坛😶

database/sql包使用须知

Golang的database/sql包为SQL类数据库提供了通用的API操作,它简化了对不同数据库driver的依赖,总体来说是使用简单、操作可靠同时维持了代码的扩展性,不过在使用过程中仍然有一些陷阱和误区,本文就记录下使用database/sql过程中的一些注意点,穿插一部分实现。文中部分例子来自database/sql的使用说明,示例Go版本1.6。

database/sql包的结构其实就分为驱动接口(driver)和DB操作(sql)两部分。源码并没有实现任何一种数据库的驱动,提倡以实现database/sql/driver包的形式来注册第三方的DB驱动,对开发者尽可能的屏蔽特定数据库的feature,算是go的一贯风格吧;如果你使用的SQLite、MySQL、PG这样的数据库,直接使用database/sql就可以完成绝大部分DB操作。

关于驱动

如上,数据库的驱动是第三方实现的,在Go里面,通过匿名导入的方式注册一个附加的driver这种方式很常见,下面就是MySQL的注册方式:

Gopher China 2016参会有感

周六日两天参加了Gopher China 2016大会,这次是第二届,去年一次是在上海,我是第一次参加。

大会分享的topic和嘉宾表现说实话远超我的预期,这里要感谢谢大和土豪赞助商。

下面从我关注的几个方面来说下:

业内应用

这两年Golang在互联网企业被很多开发者选用,从参会人员来看,绝大部分都是互联网业内开发者,用Go的还确实有点多。

这次国内gopher分享涉及多个方向,周知的有云计算/虚拟化(依然是docker)、分布式文件系统/数据库(BFS/TiDB)、大规模网络调度/中间层(CDN/Proxy…)。分享嘉宾也来自不同规模的互联网公司,可以说Golang在多个领域的实践是经得起考验的。同时, 今年还多了AI和MOBILE领域应用的分享。

AI方向的分享确实有点标题党,不过分享者陈辉本人的wukong、zerg项目很有学习价值,跟风关注了一波。

移动端这次讲了将Go代码应用到跨平台SDK开发中的实践,心动网络的演示是将Go代码以静态链接库形式编译到android、ios以及桌面端,虽然这里面仍有诸如runtime性能,扩展性等方面的问题点值得商榷,不过确实对Go在其他领域拓展提供了一种参考,不妨一试。

阅读mysqld_safe

前几天读了下mysqld_safe脚本,个人感觉收获挺大,其中细致的交代了MySQL数据库的启动流程,包括查找MySQL相关目录,解析配置文件以及最后如何调用mysqld程序来启动实例等,对理解MySQL的启动过程有一定参考意义。

当然这个脚本中涉及了很多shell编程中的小技巧,像变量解析,sed替换转义,进程优先级的判断以及无处不在test结构等等,当作Linux shell的学习素材也是非常合适的。

直接看代码吧,一遍基本就能懂:

Rownum分页方法

在MySQL中,我们通常都使用limit来完成数据集获取的分页操作,而在Oracle数据库中,并没有类似limit一样的方便方法来实现分页,因此我们通常都是直接在SQL语句中完成分页,这里就需要借助于rownum伪列或row_number()函数了,本文将分别展示使用rownum伪列和row_number()分析函数来完成Oracle数据分页操作的具体使用方法,并分析和比较两者的性能优劣。

半连接与反连接(Oracle)

当两张表进行联结的时候,如果表1中的数据行是否出现在结果集中需要根据表2中出现或不出现至少一个相匹配的数据行来判断,这种情况就会发生半联结;而反联结便是半联结的补集,它们会作为数据库中常见的联结方法如NESTED LOOPS,MERGE SORT JOIN,HASH JOIN的选项出现。

实际上半联结和反联结本身也可以被认同是两种联结方法;在CBO优化模式下,优化器能够根据实际情况灵活的转换执行语句从而实现半联结和反联结方法,毕竟没有什么SQL语法可以显式的调用半联结和反联结,它们只是SQL语句满足某些条件时优化器可以选择的选项而已,不过仍然有必要深入这两种选项在特定情况下带来的性能优势。

Oracle索引访问方式初探

本文主要讨论以下几种索引访问方法:

  • 索引唯一扫描(INDEX UNIQUE SCAN)
  • 索引范围扫描(INDEX RANGE SCAN)
  • 索引全扫描(INDEX FULL SCAN)
  • 索引跳跃扫描(INDEX SKIP SCAN)
  • 索引快速全扫描(INDEX FAST FULL SCAN)

索引唯一扫描(INDEX UNIQUE SCAN)

通过这种索引访问数据的特点是对于某个特定的值只返回一行数据,通常如果在查询谓语中使用UNIQE和PRIMARY KEY索引的列作为条件的时候会选用这种扫描;访问的高度总是索引的高度加一,除了某些特殊的情况,如另外存储的LOB对象。

Oracle查询转换初探

在执行计划的开发过程中,转换和选择是两个不同的任务。如在一个查询进行完语法和权限检查后,首先发生通称为“查询转换”的步骤,这里会进行一系列查询块的转换,然后才是“优选”(优化器为了决定最终的执行计划而为不同的计划计算成本)。

我们知道查询块是以SELECT关键字区分的,查询的书写方式决定了查询块之间的关系,各个查询块通常都是嵌在另一个查询块中或者以某种方式与其相联结,例如:

select * from employees where department_id in (select department_id from departments)

就是嵌套的查询块,不过它们的目的都是去探索如果改变查询写法会不会提供更好的查询计划。

这种查询转换的步骤对于执行用户可以说是完全透明的,要知道转换器可能会在不改变查询结果集的情况下完全改写你的SQL语句结构,因此我们有必要重新评估自己的查询语句的心理预期,尽管这种转换通常来说都是好事,为了获得更好更高效的执行计划。

现在来讨论一下几种基本的转换:

  • 视图合并
  • 子查询解嵌套
  • 谓语前推
  • 物化视图查询重写

OEM12C-IaaS自助服务配置

两周前才把OEM的自助服务折腾完,很长一段时间都是纠结于各种各样的小问题,一直也没信心把它搞完,从Oracle VM 3.0.2版本就开始用,到现在3.2.1,体验一塌糊涂。

总结一下OEM12C的自助服务门户配置流程,当是对自己这段时间耗费的精力的补偿吧!

目标

使用自助服务用户登录OEM云平台,可以在自助服务门户上创建自己的虚拟机。(最基本的需求了)

先决要求

省略前面纷繁复杂的安装和配置OEM服务器过程,基本的环境我们需要

  1. 至少一台Oracle VM Server,一台安装Oracle VM Manager的服务器和一台配置好的OEM主机
  2. 已经完成OVMM注册到OEM的过程,在OEM上至少有一个可用于自助服务的ZONE

参考我的环境如下: