今天一天连续遇到奇怪的事情,先是早上电脑突然无法联网,各种问题排查一遍,重启电脑,拔网线,最后发现可能是 /etc/network/interfaces
配置问题.
然后中午就遇到了这个诡异的错误,那就是在使用 git pull
拉取代码的时候,突然就 hangs 挂住了。什么都没有反应,所以用
ssh -vvvT git@github.com
来查看了一下发现
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 134217728 blocks
日志卡在了这几行,后面就不动了。经过一番搜索之后发现可能是和 ssh-agent 有关系,git 无法连接到 SSH Agent , 然后导致了卡住。
解决方案:
SSH_AUTH_SOCK= ssh git@github.com
总结一些 Rime 下韩语输入方案。
韩文字母输入键盘布局有 Dubeolsik(두벌식, 2-set), Sebeolsik Final (세벌식 최종, 3-set) , Sebeolsik 390, Sebeolsik Noshift
简称 2-set, 这可能是使用最为广泛的一种键盘布局了,南韩从 1969 年起就开始使用。该键盘布局非常有特点,辅音 Consonants 在左边,元音 vowels 在右边。所以能非常轻松地做到左右开工。
标准的 2-set 键盘布局已经成为了主流标准,在如今的移动设备中这个键盘布局也已经称为了事实标准。
对于这个键盘布局,突出的特点就是左右子音和母音的划分。具体的使用可以参考这篇文档.
而对于这个键盘布局 Rime 的方案可以参考这里
韩文键盘布局:A=ㅁ,B=ㅠ,C=ㅊ,D=ㅇ,E=ㄷㄸ,F=ㄹ,G=ㅎ,H=ㅗ,I=ㅑ,J=ㅓ,K=ㅏ,L=ㅣ,M=ㅡ,N=ㅜ,O=ㅐㅒ,P=ㅔㅖ,Q=ㅂㅃ,R=ㄱ ㄲ,S=ㄴ,T=ㅅㅆ,U=ㅕ,V=ㅍ,W=ㅈㅉ,X=ㅌ,Y=ㅛ,Z=ㅋ 要打出紧音只需要按住 shift 在按相应的松音键就可以了,比如按 Q 键显示ㅂ,按住 shift 再按 Q 就会打出ㅃ。
左手辅音、右手元音
紧音指的是ㄲ/ㄸ/ㅃ/ㅆ/ㅉ 五个音
ㄲ :shift + ㄱ ㄸ: shift +ㄷ ㅃ: shift +ㅂ ㅆ: shift +ㅅ ㅉ: shift +ㅈ
Sebeolsik 390 (세벌식 390; 3-set 390) 发布于 1990 年,它基于 Dr. Kong Byung Woo 早期的工作,这个键盘布局充分利用了 QWERTY 键盘的空间,四行键盘都布满了韩文元音与辅音,所以数字被挤压到右手边三行。按照音节划分,Syllable-initial(起始音节)部分在右边绿色部分,syllable-final(结束音节)部分在左边红色部分。 Wiki 上称该布局更加 ergonomic (符合人体工程学)但是这个键盘布局并没有广为接受。
Sebeolsik Final (세벌식 최종; 3-set Final) 这是上一个布局的最终成果,和上一布局的区别在于数字布局变成了两行,并且所有的音节都在键盘中,不需要额外按键既可以输入所有音节。和 390 布局一样,起始音节在右边,结束音节在左边。虽然该布局经过了精心设计不过依然没有被广泛接受。
最后还有中 Noshift 布局,设计的目的就是不需要 Shift 使用,对一些无法同时按住两个键的残疾人该键盘有一定优势。
当然如果要了解其他布局,韩语的键盘布局还有这么这么多
这是遵循韩文罗马化标准 GongjinCheong 的输入法。
GongjinCheong 和下方的 HNC 有些许的差异。
这一套输入法其实遵循着 McCune-Reischauer Romanization 罗马化方案,是西方世界最早将韩文罗马化的方案。也是目前非常流行的韩文转写方案。12
单母音 모은
ㅣ i ㅡ w
ㅏ a ㅜ u ㅓ e ㅗ o
ㅑ ya ㅠ yu ㅕ ye ㅛ yo
双母音
ㅐ ai ㅔ ei
ㅒ yai ㅖ yei
ㅘ oa ㅙ oai ㅚ oi
ㅝ uo ㅞ uei ㅟ ui
ㅢ wi
单子音 자은
ㄱ g ㅋ k ㄴ n
ㄷ d ㅌ t ㄹ r/l
ㅂ b ㅍ p ㅁ m
ㅅ s ㅈ j ㅊ c
ㅇ x ㅎ h
双子音
ㄲ gg ㄸ dd ㅃ bb ㅆ ss ㅉ jj
Rime 的韩语转写方案非以上提交的任何标准,不过最像后面两种罗马化方案,有一些微小的差别,但是却非常的好用。
和 HNC 的主要差别在于 w 和 y 的差异,在 HNC 键盘中 w 是 ㅡ
而 Rime 方案中则是 ㅜ
,而另外一个 y ,HNC 是 ㅣ
, Rime 的方案则是 ㅡ
,实际使用上来看 ,而二者区别几乎可以忽略不计。
Rime 解决方案: https://github.com/einverne/rime-hangul
韩语打字练习推荐
要介绍 PostgreSQL 通过几个关键词就可以,开源,对象关系型数据库。本文主要是学习过程中的一些笔记,都是基础内容,大部分都是看得基础入门书籍和官方的文档内容,老手请直接跳过。
PostgreSQL 发展历程可以追溯到 1986 年,加州伯克利分校开发了一个名叫 Postgres 的关系型数据库服务器,这份代码被 Illustra 公司发展成为了一个商业化产品。到 1994 年, Andrew Yu 和 Jolly Chen 向 Postgres 中增加了 SQL 语言解释器 —- Postgres95,随后公布了其源码,成为一个开放源码数据库。
到 1996 年,Postgres95 被改名 PostgreSQL,支持查询语言标准,同时版本号从 6.0 开始迭代。
2011 年 9 月 12 日,PostgreSQL 9.1 发布,提供了强大的更新,同步复制,最近相邻索引,外部数据封装等功能。
这张图 充分的可以说明 PostgreSQL 的发展及流行程度。
在 Linux Mint 19,或者其他 Debian/Ubuntu 系列上安装:
sudo apt install postgresql postgresql-contrib
brew install postgresql
To migrate existing data from a previous major version of PostgreSQL run:
brew postgresql-upgrade-database
This formula has created a default database cluster with:
initdb --locale=C -E UTF-8 /usr/local/var/postgres
For more details, read:
https://www.postgresql.org/docs/12/app-initdb.html
To have launchd start postgresql now and restart at login:
brew services start postgresql
Or, if you don't want/need a background service you can just run:
pg_ctl -D /usr/local/var/postgres start
PostgreSQL 安装之后会在系统上新增一个 postgres 用户,通过该用户来运行服务。
检查版本
sudo -u postgres psql -c "SELECT version();"
会输出 PostgreSQL 的版本
PostgreSQL 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit
PostgreSQL 默认端口是 5432,可以通过 sudo netstat -tupln
来查看服务是否启动。
PostgreSQL 默认用户名是 postgres,默认数据库也是 postgres,没有默认密码。
PostgreSQL 的配置文件在 /etc/postgresql/10/main/postgresql.conf
打开配置文件 sudo vi /etc/postgresql/10/main/postgresql.conf
, 然后找到如下一行,并配置
listen_addresses = '*'
然后重启服务
sudo systemctl restart postgresql
检查服务启动
ss -nlt | grep 5432
然后修改 sudo vi /etc/postgresql/10/main/pg_hba.conf
文件
# TYPE DATABASE USER ADDRESS METHOD
# The user test_user will be able access all databases from all locations using a md5 password
host all test_user 0.0.0.0/0 md5
# The user test_user will be able access only the test_db from all locations using a md5 password
host test_db test_user 0.0.0.0/0 md5
# The user test_user will be able access all databases from a trusted location (192.168.43.106) without a password
host all test_user 192.168.1.134 trust
管理 PostgreSQL 可以通过命令行,也可以通过 GUI 工具,市场上现在 GUI 工具已经非常成熟,有开源方案,也有商业方案。这里就介绍一下 pgAdmin,其他工具可以自行了解。
详情见官网: https://www.pgadmin.org/download/
安装方式也都特别简单,略过。
PostgreSQL 只能在 postgres 用户下管理,所以可以切换到该用户操作
sudo su - postgres
然后使用 psql 命令登录 PostgreSQL 控制台
psql
此时相当于用 postgres 用户以同名身份登录了数据库,默认没有密码,系统提示符会变成 postgres=#
.
为用户设置密码 \password
.
\password postgres
然后输入密码。
创建其他用户,并为这些用户设定密码
CREATE USER your_username WITH PASSWORD 'your_password';
创建用户数据库
CREATE DATABASE sample_db OWNER your_username;
赋予用户所有权限,读写操作
GRANT ALL PRIVILEGES ON DATABASE sample_db to your_username;
退出控制台
\q
如果不想在控制台也可以直接从 shell 中设定
sudo -u postgres createuser --superuser your_username
sudo -u postgres psql
\password your_username
\q
sudo -u postgres createdb -O your_username sample_db
/usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start
在 PostgreSQL 中,超级用户角色连接到数据库允许绕过所有数据库权限检查,登录权限除外。因此不要轻易使用超级用户权限,PostgreSQL 文档建议将大多数数据库作为非超级用户角色管理。
上面演示了如何创建用户及数据库,那么在 shell 中可以以如下方式来登录数据库
psql -U your_username -d sample_db -h 127.0.0.1 -p 5432
然后输入 your_username 的密码即可登录控制台。注意这里的 -d
参数是必须的。
对数据库的基本操作,和 MySQL 类似,只要懂得 SQL 基本就可以略过下面大部分的内容。
创建
CREATE DATABASE sample_db;
CREATE DATABASE sample_db OWNER username;
修改数据库
ALTER DATABASE sample_db RENAME TO new_sample_db;
ALTER DATABASE new_sample_db OWNER TO postgres;
ALTER DATABASE new_sample_db WITH CONNECTION LIMIT = 10;
删除数据库
DROP DATABASE sample_db[, ...n];
大部分都是 SQL 相关的内容,这里就做过引子,具体还是去学习 SQL
创建表
create table tb_demo1 (
id int PRIMARY KEY,
name varchar(25),
age int,
salary float
);
create table tb_demo2 (
id int,
name varchar(25) NOT NULL,
age int,
salary float,
PRIMARY KEY(id, name)
);
CREATE TABLE dep (
id INT,
name VARCHAR(25)
)
创建外键关联,在表 demo5 中添加外键约束 fk_dep
将表 depId 列关联到 dep 表 id。
CREATE TABLE demo5 (
id INT PRIMARY KEY,
name VARCHAR(25) NOT NULL,
age int,
depId INT,
CONSTRAINT fk_dep FOREIGN KEY(depId) REFERENCES dep(id)
)
修改表结构
ALTER TABLE old_table_name RENAME TO new_table_name;
ALTER TABLE table_name ALTER COLUMN column_name TYPE VARCHAR(30);
ALTER TABLE table_name RENAME old_column_name TO new_column_name new_type;
ALTER TABLE table_name ADD COLUMN new_column new_type;
ALTER TABLE table_name ADD COLUMN new_column new_type NOT NULL;
ALTER TABLE table_name DROP column_name;
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
删除表
DROP TABLE [IF EXISTS] table1, table2 ...;
psql -U your_username -d sample_db -h 127.0.0.1 -p 5432 < backup_external.sql
\h explain sql, such as \h select
\? help
\l list all db
\c [database_name] connect to db
\d list all tables of current db
\d [table_name] show table structure, like describe table in mysql
\du list all user
\e open text editor
\conninfo print database and connection infomation
类型 | 字节数 | 说明 | 取值范围 |
---|---|---|---|
SMALLINT | 2 字节 | 小整数 | -32768 ~ 32767 |
INT | 4 字节 | 整数 | -2147483648 ~ 2147483647 |
BIGINT | 8 字节 | 大整数 | -92233720368547758089 ~ 9223372036854774807 |
类型 | 字节数 | 说明 | 取值范围 |
---|---|---|---|
REAL | 4 | 6 位十进制数字精度 | 1E-37 ~ 1E+37 |
DOUBLE PRECISION | 8 | 15 位十进制数字精度 | 1E-307 ~ 1E+308 |
PostgreSQL 支持 SQL 标准表示,float 和 float(p) 声明非精确的数值类型。p 声明以二进制表示的最低可接受精度。
范围之外的 p 值将导致错误,没有声明精度的 float 将被当作 DOUBLE PRECISION。
NUMERIC 表示数值是任意精度,使用 NUMERIC(M, N)
表示,M 称为精度,总位数,N 表示标度,表示小数的位数。比如 123.456 ,精度是 6, 标度是 3
超出精度则四舍五入处理。
TIME, DATE, TIMESTAMP 和 INTERVAl,每一个类型都有合法取值范围,当不合法时会以零值插入到数据库。
类型 | 字节数 | 说明 | 取值范围 |
---|---|---|---|
TIME | 8 字节 | 一天内时间 | 00:00:00 - 24:00:00 插入 HHMMSS 字符串会自动转成时间 HH:MM:SS |
DATE | 4 字节 | 日期 | YYYY-MM-DD |
TIMESTAMP | 8 字节 | 日期和时间 | YYYY-MM-DD HH:MM:SS |
字符串类型
类型 | 字节数 | 说明 | 取值范围 |
---|---|---|---|
CHAR(n)/CHARACTER(n) | 固定长度非二进制,不足补空白 | 由 n 决定 | |
VARCHAR(n)/CHARACTER VARYING(n) | 变长非二进制,有长度限制 | n 决定 | |
TEXT | 变长非二进制,无长度限制 | 由字符串决定 |
PostgreSQL 提供 BYTEA 类型,用来存储二进制字符串,BYTEA 类型存储空间位 4 字节加上实际的二进制字符串。
CREATE TABLE tmp ( b BYTEA );
INSERT INTO tmp VALUES (E'\\000');
SELECT * from tmp;
PostgreSQL 提供 BOOLEAN 布尔类型,用一个字节来存储,有 TRUE,FALSE 两个值。
其他有效文本,可以代替 TRUE 或者 False。比如 ‘t’, ‘true’, ‘y’, ‘yes’, ‘1’, 或者 ‘f’, ‘false’, ‘n’, ‘no’, ‘0’
PostgreSQL 允许将字段定义成变长或者变长的一维或者多维数组,数组类型可以是基本类型或者是用户定义类型。
声明数组
numbs INT[],
zz TEXT[4][4]
对于一维数组也可以
arr_column INT ARRAY[5]
插入数组
CREATE TABLE tmp (bt int[]);
INSERT INTO tmp VALUES('\{\{1,1,1\}, \{2,2,2\}, \{3,3,3\}\}');
SELECT * FROM tmp;
除开这些基础类型,PostgreSQL 还支持非常多的复杂类型,比如 json, xml 等等,具体可以参考官网 , 这些复杂类型的使用可以单开一篇文章来讲了,初识篇就到此。
之前就写过文章介绍这款跨平台的开源输入解决方案 Rime,所有的配置以及同步方法都在之前的文章中有介绍。这篇文章主要介绍如何制作 Rime 的扩展词库。虽然目前网上也有一些非常不错的词库,但是很多内容还是需要自己慢慢培养的。
从 2.4 版本起支持加密的搜狗词库了,直接导出搜狗词库,然后转成 Rime 的格式即可。
安装 dotnet:
macOS 下直接 brew install dotnet-sdk
下载 release 对应版本,然后运行:
dotnet ImeWlConverterCmd.dll -?
在 macOS 下使用 dotnet ImeWlConverterCmd.dll "-?"
.
具体转换命令,比如导入一个搜狗细胞词库成 Rime 词库,则命令为:
dotnet ImeWlConverterCmd.dll -ct:pinyin -os:linux -i:scel ./input.scel -o:rime ./rime.txt
ImeWlConverterCmd.dll
工具的其他重要参数,对于输出为 rime 的 -ct:pinyin/wubi/zhengma
,也可以通过 -os:windows/macos/linux
来指定操作系统。
安装 opencc
繁简转换工具
sudo apt install opencc
然后运行装换
opencc -i source.txt -o dest.txt
会将 source.txt
文本内容全部转换成 dest.txt
繁体的文本。
然后将文本内容全部拷贝到 luna_pinyin.mywords.dict.yaml
文件中,并添加文件头:
---
name: luna_pinyin.mywords
version: "0.0.1"
sort: by_weight
use_preset_vocabulary: true
...
说明:
sort: by_weight
,词条的排序方式,可选填 by_weight
按照词频高到低,original
保持原码表中的顺序use_preset_vocabulary: true
表示是否导入预设的词汇表,当词库中没有定义拼音和词频的时候开启然后找到 luna_pinyin.extended.dict.yaml
,打开文件导入新的词库
import_tables:
- luna_pinyin.mywords
下载对应的细胞词库:
然后使用上面的方法转换。
dotnet ImeWlConverterCmd.dll -ct:pinyin -os:linux -i:sgpybin ./input.bin -o:rime ./rime.txt
包含了 IT, 财经,成语,地名,历史名人,诗词,医学,饮食,法律,汽车,动物,等几大类词库。
我所有的通讯录都在 Google 通讯录 中保存着,页面上可以很方便的导出 csv 文件。有了这个文本文件就可以快速制作通讯录姓名的词库。
简单观察一下通讯录 csv 的结构就知道第一列就是姓名,解析一下文件然后将第一列弄出来。和上面的流程一直,制作一个 luna_pinyin.contacts.dict.yaml
文件保存这些通讯录名字,然后将该词库添加到 extended 中。部署即可生效。
dotnet ImeWlConverterCmd.dll -ct:pinyin -os:linux -i:word ~/Downloads/entry.csv -o:rime ./rime-.txt
通过扩展来导入词库,纯文本管理,
同步后在同步的文件夹中能找到纯文本保存的词库。
Linux Mint 19 不支持 MDM 显示管理器,您需要安装 LightDM
检查当前显示管理
cat /etc/X11/default-display-manager
如果输出 mdm 则需要更换
sudo apt install lightdm lightdm-settings slick-greeter
sudo dpkg-reconfigure lightdm
这里的 mdm 和 lightdm 值得都是 Linux Login manager,或者也被叫做 Linux Display Manager。更多的选择可以看这里
显示配置
/usr/sbin/lightdm --show-config
Linux Mint 下系统自带壁纸在
/usr/share/backgrounds/
更多的配置参考: https://wiki.debian.org/LightDM
我们都知道 Ubuntu 系列的软件仓库可以通过 /etc/apt/sources.list
以及 /etc/apt/sources.list.d/*.list
来配置。
sources.list 的格式大部分情况下都是
deb http://site.example.com/debian distribution component1 component2 component3
deb-src http://site.example.com/debian distribution component1 component2 component3
这几部分可以划分为这几类:
deb
表示二进制内容,会使用仓库中的二进制预编译软件包,可以直接通过 apt 来安装deb-src
表示源代码,在使用 apt 时会根据源代码来进行安装,通常可以使用 apt source $pacakge
来下载然后编译在配置中的 url 一般为仓库的地址,世界各地会有不同的镜像,选择一个比较快的镜像即可。
不同版本的系统有着不同的代号,比如 Ubuntu
跟在发行版之后的就是软件包的具体分类了,可以有一个或多个
在运行 apt update
时会发现在输出的没一行前面会有 GET, HIT 等等字符的出现,这几个字符有着其自身的含义:
无论在那个系统下,输入法几乎是必备的软件,在 Linux 下有两大主要的输入法支持框架 fcitx 和 IBus,当然有些还有 XIM ,scim 等等。Linux 下本来没有多少用起来非常舒服的中文输入法,有出名很久的 rime, 也有搜狗开发的输入法,不过也是不久之前的事情。
但是稍微注意一下就是知道,搜狗使用的是 fcitx, 而 rime 声称二者都支持,但是 fcitx-rime 已经很久没有更新,主要的更新还在 IBus 那边。那这就需要一个抉择,因为 Linux 下无法将二者并存。
fcitx 是 Free Chinese Input Toy for X 的简称。
源代码托管在 Gitlab
在 Debian/Ubuntu 下可以使用
apt install fcitx
apt install fcitx-pinyin # 汉语拼音方案
apt install fcitx-googlepinyin
apt install fcitx-hangul # 韩语
apt install fcitx-rime # 小狼毫
配置文件内容在
/usr/share/fcitx/data/
~/.config/fcitx/
在看 fcitx 的一些历史 不经唏嘘,如今 2019 年已经过去 12 年 fcitx 依然健在,而那些说 fcitx 不好的人却不知道在哪里。
一个非常漂亮的 fcitx 主题
IBus 是 Intelligent Input Bus 的简称。
IBus 下也有 rime
sudo apt install ibus-rime
切换输入法可以使用如下命令:
im-config -s fcitx
如果要查看当前可用的输入法可以使用 im-config -l
,更多查看 man im-config
或者在界面搜索 input method
OS X 下的配置管理工具
经常看到的 Ubuntu 16.04 或者 18.04 都是 Ubuntu 长期支持版本
A Long Term Support release or LTS release, means that Ubuntu will support the version for five years.
如果要从 16.04 升级到 18.04 包括两个部分,一是将当前安装的程序及 lib 升级到 18.04 兼容的版本,另外一个就是将系统升级到 18.04.
sudo apt update && sudo apt upgrade
sudo apt autoremove
sudo apt dist-upgrade
运行 apt dist-upgrade
会升级所有 packeges 到想要升到的 Ubuntu 版本,而 sudo do-release-upgrade
会将 Ubuntu 升级到新版本。大部分情况下不需要手动触发 sudo apt dist-upgrade
,因为在运行 sudo do-release-upgrade
会自动先运行 dist-upgrade
。预先将所有的应用程序都更新到最新版本避免兼容性问题。
最后进行升级 Do upgrade
sudo do-release-upgrade
要注意該命令无法回滚,做好相应的备份工作,或者知道如何处理失败。
sudo add-apt-repository ppa:embrosyn/cinnamon
sudo apt update && sudo apt install cinnamon
Remove
sudo apt-get install ppa-purge
sudo ppa-purge ppa:embrosyn/cinnamon
编辑 /etc/update-manager/release-upgrades
并设置
Prompt=normal
然后再运行 sudo do-release-upgrade
前两天重启服务器之后发现 fail2ban 启动失败,出现如下错误:
/etc/init.d/fail2ban restart
[....] Restarting fail2ban (via systemctl): fail2ban.service
Job for fail2ban.service failed because the control process exited with error code. See "systemctl status fail2ban.service" and "journalctl -xe" for details.
failed!
检查日志
journalctl -xe
查看具体错误
/usr/bin/fail2ban-client -v -v start
看到结果:
fail2ban.service: Failed with result 'start-limit-hit'.
具体错误一目了然。其实重要的就是 Debug 的内容。