Docker保存当前容器镜像

当我们在容器里面安装了一些软件或者修改一些设置之后,我们希望能把修改同步到相关的镜像,下次用这个镜像生成容器的时候,可以略过搭建环境这一步了。

比如我现在有一个容器叫centos

$ docker ps
b58e39dca53d        centos              "/bin/bash"         3 minutes ago       Up 3 minutes        0.0.0.0:4000-4100->4000-4100/tcp   centos-huchao

进入容器

docker exec -it /bin/bash centos-huchao

安装一些软件之后,通过docker commit 容器名称 镜像名称 命令将我们的修改保存的新的镜像。

docker commit centos-huchao centos:web

上面的镜像名称我加了一个标签。

Go中使用json.Unmarshal interface{}之后的数据类型

有时候设计不好的情况下,一个json类型很难用固定的数据结构去表示,因此我们会用interface{}去表示它。

在使用inteface的时候,需要了解json的数据类型对应的go的默认类型,使用才会不会出现疑惑,它们的类型关系对应如下

JSONGo
booleanbool
数值float64
字符串string
array[]interface{}
objectmap[string]interface{}
nullnil

了解他们默认的类型转换,使用时候就不会出问题了。

mysql varchar类型探秘

mysql中varchar能够存储可变长度的字符串。过去我做的诸多业务中,一般存储短字符串的需求,都会使用varchar类型,并且定义长度为255,也就是varchar(255)。

不过为了探究varchar这种类型到底是怎么存储的,它的最大长度能达到多少,我决定区翻一下mysql文档学习一下。

varchar怎么存储

经过一番了解,varchar最大能存储的长度为65535字节。存储字符串的时候,会将字符串的长度存在首部,接着才是内容。

当varchar存储的字符个数小于或等于255的时候,首部需要一个字节来记录字符的个数。当内容大于255的字符的时候,首部需要2个自己来保存长度。

varchar能存的最大字符长度

理论上,varchar能够存储65535个字节,但是由于首部会占用两个字节,因此这会让varchar可用的存储空间变成了65533字节。如果定义的列是非空话,那最大是65533,如果定义的列允许NULL,那么null会占用一个额外的字节,因此最大只能存储65532个字节。

字节并不等于字符长度,varchar括号里面跟着的是字符长度,如果字符集是utf8的话,每一个字符统一会占用3个字节的长度,不管是汉子还是英文字符,因此最大能够存储的长度是65533/3 = 21844。如果字符集是utf8mb4那最大存储长度就更小了,为65533/4=16383。

(更多…)

ubuntu apt 更换为国内源

安装软件的时候,默认的源速读太慢,更换为国内的源吧!更换之前首先备份一下。

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

将国内的源粘贴到 /etc/apt/sources.list

vim /etc/apt/sources.list

下面是阿里的源,粘贴即可。

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

另外可选择的还有几个比较好的源。

清华的源

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

替换完毕执行apt-get update更新即可。

mysql慢查询

mysql满查询有助于让我们发现系统中瓶颈所在。

如何开启

默认情况满查询应该关闭,如果需要分析则需要手动开启。

mysql> show variables like '%slow_query_log%';
 +---------------------+--------------------------------------+
 | Variable_name       | Value                                |
 +---------------------+--------------------------------------+
 | slow_query_log      | OFF                                  |
 | slow_query_log_file | /var/lib/mysql/01f03cd2e279-slow.log |
 +---------------------+--------------------------------------+
 2 rows in set (0.01 sec)

开启慢查询语句如下

mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.00 sec)

使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,MySQL重启后则会失效。如果需要永久开启则需要修改配置,不过大部分情况也用不着,这里就不介绍了

开启了之后还需要设置一个时间限制,超过多少时间我们才记录呢?这个配置值是long_query_time

设置慢查询超时时间

mysql> show variables like 'long_query_time%';
 +-----------------+-----------+
 | Variable_name   | Value     |
 +-----------------+-----------+
 | long_query_time | 10.000000 |
 +-----------------+-----------+
 1 row in set (0.01 sec)

可以看到默认情况是10s,通常会修改这个值。改成0.5s试试

mysql> set global long_query_time=0.5;
Query OK, 0 rows affected (0.00 sec)

请注意,设置之后需要重新开启会话才能看到效果。再次查看还是原来的值。

设置慢查询日志存放的位置

mysql> set global slow_query_log_file="日志存放的位置";

日志存放的位置mysql必须有可写的权限,否则会出现

ERROR 1231 (42000): Variable 'slow_query_log_file' can't be set to the value of...

怎么查看

这个参数用于指定慢查询日志的存放路径,缺省情况是host_name-slow.log文件

mysql> show variables like 'slow_query_log_file';
 +---------------------+--------------------------------------+
 | Variable_name       | Value                                |
 +---------------------+--------------------------------------+
 | slow_query_log_file | /var/lib/mysql/01f03cd2e279-slow.log |
 +---------------------+--------------------------------------+
 1 row in set (0.00 sec)

这个文件记录了慢查询,可以打开该文件查看慢查询日志。

如何验证

select sleep(3)

之后查看slow_query_log_file里面有没有慢查询日志。

休眠后mac点击wifi图标卡死的解决方法

最近遇到一些问题,休眠后的mac点击wifi图标导致整个顶部的导航栏全部卡死,十分崩溃。

最开始分析是导航栏的问题,想着重启一下导航栏。

killall SystemUIServer

然而并不管用,导航栏是不卡死了,但是点击wifi图标依旧会卡死。那就重启一下网络吧。

ps -ef | grep airportd

然后sudo kill 掉就可以了。不过mac还有一个比较简单的killall命令

sudo killall airportd

使用expect之后无法使用rz和sz的解决方法

在机器太多的时候,我们会使用expect来自动化登录,然而使用expect之后就不能使用rz和sz了。

经过一番寻找之后,发现有一个解决方案,在脚本之前增加一个

export LC_CTYPE=en_US

注意,这个语句放到登录脚本里面就可以了,不要放到.bash_profile里面,如果放到bash_profile里面可能你当前的终端语言都变了,中文可能会乱码。

这个缺点是远程机器里面的中文可能会乱码了,如果有更好的解决方案,我会在这里更新。

SQLAlchemy介绍

SQLAlchemy是python下十分流行的orm(对象关系映射)框架。官方的介绍是这样的:

SQLAlchemy将数据库视为关系代数引擎,而不仅仅是表的集合。行不仅可以从表中选择,还可以选择连接其他的选择语句; 这些单元中的任一个可以组成更大的结构。SQLAlchemy的核心表达语言正是基于这个概念。

SQLAlchemy以其对象关系映射器(ORM)而闻名,它提供一个数据映射器模式的可选组件,其中可以通过多种方式将类映射到数据库,实际上对象模型和数据库模式从一开始就可以完整分离。

SQLAlchemy的对这些问题的总体思路来源于其它优秀的 SQL/ORM 工具,植根于所谓的完全不同complimentarity-导向的方法; 而不是隐藏SQL并将对象的关系细节隐藏在自动化的墙壁之后,所有进程都被完全暴露在一系列可组合的透明工具中。该库负责自动执行冗余任务,而开发人员仍然可以控制数据库的组织方式以及SQL的构建方式。

SQLAlchemy的主要目标是改变您对数据库和SQL的思考方式!

Sublime 自定义快捷键

sublime插件丰富,当我们安装了诸多插件之后,发现要使用其中的功能还得用鼠标去点,这岂不是太麻烦了,让我们来自定义快捷键吧!

写在前面

在写这篇文章之前,我也为自定义快捷键感到无从下手,而在网上搜索千篇一律的都是打开Preferences->key bindings user,添加一些东西进去,比如等等,这个command是什么玩意?

比如下面

{ "keys": ["ctrl+alt+down"], "command":"duplicate_line" },

等等,这个command是什么?我要去哪儿找?我安装了一个新的插件,能使用快捷键吗?等等一系列的疑问,从未有人解答过,可能一些文章都是抄袭拼凑吧。

如何查找Commands

比如我安装了一个php code sniffer,想要使用一个快捷键来对代码进行检测,然而这个command是什么?看来只能去查看官方文档。 (更多…)

中文分词词性对照表

汉语词性对照表[北大标准/中科院标准]

词性编码
词性名称
注 解

Ag

形语素 形容词性语素。形容词代码为 a,语素代码g前面置以A。

a

形容词 取英语形容词 adjective的第1个字母

ad

副形词 直接作状语的形容词。形容词代码 a和副词代码d并在一起。

an

名形词 具有名词功能的形容词。形容词代码 a和名词代码n并在一起。

b

区别词 取汉字“别”的声母。

c

连词 取英语连词 conjunction的第1个字母。
dg
副语素 副词性语素。副词代码为 d,语素代码g前面置以D。

d

副词 取 adverb的第2个字母,因其第1个字母已用于形容词。

e

叹词 取英语叹词 exclamation的第1个字母。

f

方位词 取汉字“方”

g

语素 绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。

h

前接成分 取英语 head的第1个字母。

i

成语 取英语成语 idiom的第1个字母。

j

简称略语 取汉字“简”的声母。

k

后接成分

l

习用语 习用语尚未成为成语,有点“临时性”,取“临”的声母。

m

数词 取英语 numeral的第3个字母,n,u已有他用。

Ng

名语素 名词性语素。名词代码为 n,语素代码g前面置以N。

n

名词 取英语名词 noun的第1个字母。

nr

人名 名词代码 n和“人(ren)”的声母并在一起。

ns

地名 名词代码 n和处所词代码s并在一起。

nt

机构团体 “团”的声母为 t,名词代码n和t并在一起。

nz

其他专名 “专”的声母的第 1个字母为z,名词代码n和z并在一起。

o

拟声词 取英语拟声词 onomatopoeia的第1个字母。

p

介词 取英语介词 prepositional的第1个字母。

q

量词 取英语 quantity的第1个字母。

r

代词 取英语代词 pronoun的第2个字母,因p已用于介词。

s

处所词 取英语 space的第1个字母。

tg

时语素 时间词性语素。时间词代码为 t,在语素的代码g前面置以T。

t

时间词 取英语 time的第1个字母。

u

助词 取英语助词 auxiliary

vg

动语素 动词性语素。动词代码为 v。在语素的代码g前面置以V。

v

动词 取英语动词 verb的第一个字母。

vd

副动词 直接作状语的动词。动词和副词的代码并在一起。

vn

名动词 指具有名词功能的动词。动词和名词的代码并在一起。

w

标点符号

x

非语素字 非语素字只是一个符号,字母 x通常用于代表未知数、符号。

y

语气词 取汉字“语”的声母。

z

状态词 取汉字“状”的声母的前一个字母

un

未知词 不可识别词及用户自定义词组。取英文Unkonwn首两个字母。(非北大标准,CSW分词中定义)