0%

swift已经支持ubuntu,也可以在debian上安装

下载

下载ubuntu 15.10版本的安装包

1
$ wget https://swift.org/builds/swift-2.2-release/ubuntu1510/swift-2.2-RELEASE/swift-2.2-RELEASE-ubuntu15.10.tar.gz

解压重新打包

1
2
3
4
$ tar zxvf swift-2.2-RELEASE-ubuntu15.10.tar.gz
$ cd swift-2.2-RELEASE-ubuntu15.10
$ tar czvf swift-2.2.tar.gz usr
$ sudo alien -v swift-2.2.tar.gz

会生成deb安装包swift_2.2-2_all.deb

安装

1
$ sudo dpkg -i swift_2.2-2_all.deb

测试

新建main.swift文件

1
print("hello swift")

编译

1
$ swiftc main.swift -o main.s

查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ file main.s
main.s: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked,
interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32,
BuildID\[sha1\]=9ed9fa8e5accc18cd0a4482b465aecf814a2a114, not stripped

$ ldd main.s
linux-vdso.so.1 (0x00007ffe06af4000)
libswiftCore.so => /usr/lib/swift/linux/libswiftCore.so (0x00007fc4d764f000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc4d72bc000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc4d6fbd000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc4d6da7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc4d6a03000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc4d67e5000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc4d65e1000)
libicuuc.so.55 => /usr/lib/x86_64-linux-gnu/libicuuc.so.55 (0x00007fc4d624d000)
libicui18n.so.55 => /usr/lib/x86_64-linux-gnu/libicui18n.so.55 (0x00007fc4d5dea000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fc4d5bd4000)
/lib64/ld-linux-x86-64.so.2 (0x0000557356b81000)
libicudata.so.55 => /usr/lib/x86_64-linux-gnu/libicudata.so.55 (0x00007fc4d411c000)

也可以动态解释执行

1
2
3
4
5
$ swift
Welcome to Swift version 2.2 (swift-2.2-RELEASE). Type :help for assistance.
1> print("hello, swift")
hello, swift
2> :q

===
[erq]

python有两个队列实现,分别是queue.Queue和mulitiprocess.Queue。

queue.Queue是线程安全的,用于线程间数据同步,而mulitiprocess.Queue是用于多进程间数据通讯的。如果在多进程间使用queue.Queue是无法共享数据的,每个进程会有一个单独的队列副本。

因为queue.Queue用于多线程数据同步,而mulitiprocess.Queue用于多进程数据同步。

python3中线程队列的名字为queue,而python2中其名字为Queue。

python中的list和dict不是线程安全的。

task_done与join

queue.Queue有一个join方法可以阻塞当前线程,直到队列中所有的item都处理完成了,所以需要每处理一个队列的item,调用一次队列的task_done方法,当队里的所有元素都标记为处理过了,join方法会从等待中返回。

如果不调用join方法,也就无需调用task_done方法了。

mulitiprocess.Queue并没有join特性,如需要此特性,应该使用multiprocessing.JoinableQueue队列

===
[erq]

配置文件访问无线网络

在/etc/network/interfaces文件可以配置要默认访问的无线热点:

动态获取ip:

1
2
3
4
5
# wireless
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ESSID/SSID
wpa-psk pre-shared-key

配置静态ip:

1
2
3
4
5
6
7
8
9
10
# wireless
auto wlan0
iface wlan0 inet static
address 192.168.1.110
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
wpa-ssid ESSID/SSID
wpa-psk pre-shared-key

重新启动网络服务即可连接到默认的热点。

命令行手动扫描并连接到热点

扫描热点:

1
2
# iwlist wlan0 scan
# iw dev wlan0 scan

连接到热点:

1
# wpa_supplicant -i wlan0 -c <(wpa_passphrase ESSID pre-shared-key) -B

动态获取ip:

1
# dhclient wlan0

设置静态ip:

1
2
# ip addr add 192.168.1.110/24 dev wlan0
# ip route add default via 192.168.1.1

===
[erq]

如果有中文字符,并且输出的csv文件没有BOM标志,M$ Excel打开会出现乱码。所以输出utf-8编码的csv时,为了兼容性要输出BOM.
很简单,只要在open函数中指定文件编码即可,无需额外的操作:

1
2
with open('foobar.csv', 'w', encoding='utf-8-sig') as f:
...

因为指定的编码为utf-8-sig,sig就是signature,所以不但文件的编码为utf-8格式,同时还会自动输出utf-8的BOM标志0xEFBBBF。这样生成的csv可用用M$ Excel正确打开导入。

或者更简单点儿,指定encoding为’gb18030’。

References:
[1]UTF8最好不要带BOM,附许多经典评论

===
[erq]

这次又试了一下wine安装QQ,发现wine已今非昔比,已堪大用。

添加i386架构

因为debian早已是mutiarch架构,所以添加intel子架构i386是很简单的:

1
$ sudo dpkg --add-architecture i386

安装wine

1
$ sudo apt-get install wine wine64 wine32

安装cabextract

因为下面的安装会下载cab格式文件并解压缩安装,所以需要安装cabextract包

1
$ sudo apt-get install cabextract

安装winetricks-zh
这是大名顶顶的winetricks的修改版,支持常见的一些中文windows应用。

1
2
3
4
5
$ cd ~
$ git clone https://github.com/hillwoodroc/winetricks-zh.git
$ cd winetricks-zh
$ sudo cp winetricks-zh /usr/local/bin
$ cd verb

安装QQ轻聊版(QQLight)

确认位于下载的winetricks-zh的子目录verb中,执行:

1
$ winetricks-zh qqlight

会下载很多东西,耐心等待安装完成

菜单项小问题
默认生成的桌面菜单项是~/.local/share/applications/wine/Programs/腾讯软件/QQ轻聊版/QQ轻聊版.desktop,打开此文件可以发现Exec项的可执行文件路径有问题,修正为如下:

1
Exec=env WINEPREFIX=/home/guoqiang/.local/share/wineprefixes/qqlight wine "C:\\Program Files (x86)\\Tencent\\QQLite\\Bin\\QQScLauncher.exe"

可正常执行QQ轻聊版。

经简单试用发现十分稳定。wine进步真的很大。

**注:**如果QQ文本输入框内输入的中文显示为方块,将显示模式从“气泡模式”更改为“文本模式”则可以正常显示中文。

References:
[1]winetricks-zh
[2]Wine的中文显示与字体设置

===
[erq]

Nautilus可以自动挂装smb共享目录,但是mount命令却看不到共享目录的挂载点。

nautilus使用gvfs来自动挂载smb共享,需要安装gvfs-fuse来提供本地文件系统视图:

1
$ sudo apt-get install gvfs-fuse

系统重新启动

当前debian系统nautilus自动将共享目录挂载到/run/user/$UID/gvfs下,形如:

1
smb-share:server=server_name,share=foobar

===
[erq]

安装了oracle instant client,执行sqlplus时,找不到库文件:

1
2
3
dyld: Library not loaded: /ade/dosulliv_sqlplus_mac/oracle/sqlplus/lib/libsqlplus.dylib
Referenced from: /opt/oracle/instantclient_11_2/sqlplus
Reason: image not found

Mac的库路径环境变量与linux不同,其名字为DYLD_LIBRARY_PATH
bashrc中设置此变量:

1
export DYLD_LIBRARY_PATH=$ORACLE_HOME:$DYLD_LIBRARY_PATH

问题解决。

References:
[1] 环境变量LIBRARY_PATH的设置

===
[erq]

下载安装instantclient-sdk包,这个包里有编译需要的头和库文件

1
2
3
4
5
6
$ sudo unzip instantclient-sdk-linux.x64-12.1.0.2.0.zip -d /opt/oracle
```

不然会有错误提示:
```js
oci.h: No such file or directory

安装cx_Oracle

1
$ sudo pip3 install cx_oracle

会有错误提示:

1
2
3
4
5
usr/bin/ld: cannot find -lclntsh

collect2: error: ld returned 1 exit status

error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

是因为找不到libclntsh库,创建一个符号连接:

1
2
3
4
$ cd /opt/oracle/instantclient_12_1
$ sudo ln -sf libclntsh.so.12.1 libclntsh.so
$ sudo ln -sf libclntshcore.so.12.1 libclntshcore.so
$ sudo ln -sf libocci.so.12.1 libocci.so

重新安装就可以了。

如果安装过程中提示找不到oracle安装,要注意sudo是在root用户的环境下执行pip3安装,要在root用户下设置相应的oracle环境变量。

python3连接oracle

1
2
3
4
5
>>> import cx_Oracle
>>> conn = cx_Oracle.connet('user/passwd@db')
>>> print(conn.version)
10.2.0.4.0
>>> conn.close()

===
[erq]

zabbix是开源的企业级监控平台,可以用来监控服务器、网络设备以及网络服务等的健康状况和运行状态。

安装

1
$ sudo apt-get install zabbix-server-pgsql zabbix-frontend-php

创建数据库

创建数据库及角色

1
2
$ sudo -u postgres createdb zabbix
$ sudo -u postgres createuser -SDRP zabbix # 根据提示输入密码

初始化数据库

1
$ zcat /usr/share/zabbix-server-pgsql/{schema,images,data}.sql.gz psql -h localhost zabbix zabbix

修改配置文件,添加如下参数:

1
DBPassword=zabbix # 以实际的数据库用户密码为准

启动服务

/etc/default/zabbix文件中,设置START=yes,然后启动服务:

1
$ sudo service zabbix-servere start

有错误提示:

1
Job for zabbix-server.service failed because the control process exited with error code. See "systemctl status zabbix-server.service" and "journalctl -xe" for details.

执行

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo systemctl status zabbix-server.service
● zabbix-server.service - Zabbix Server (PostgreSQL)
Loaded: loaded (/lib/systemd/system/zabbix-server.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2015-12-24 03:37:10 EST; 6s ago
Docs: man:zabbix_server
Process: 1014 ExecStart=/usr/sbin/zabbix_server (code=exited, status=1/FAILURE)

Dec 24 03:37:10 zabbix systemd\[1\]: Starting Zabbix Server (PostgreSQL)...
Dec 24 03:37:10 zabbix zabbix_server\[1014\]: zabbix_server \[1014\]: /etc/zabbix/zabbix_server.conf.d: \[2\] No such file or directory
Dec 24 03:37:10 zabbix systemd\[1\]: zabbix-server.service: Control process exited, code=exited status=1
Dec 24 03:37:10 zabbix systemd\[1\]: Failed to start Zabbix Server (PostgreSQL).
Dec 24 03:37:10 zabbix systemd\[1\]: zabbix-server.service: Unit entered failed state.
Dec 24 03:37:10 zabbix systemd\[1\]: zabbix-server.service: Failed with result 'exit-code'.

创建目录,重新启动

1
2
$ sudo mkdir /etc/zabbix/zabbix_server.conf.d
$ sudo service zabbix-server start

配置php前端

确认已安装依赖libapache2-mod-php5,如果使用postgresql数据库,还需要安装依赖php5-pgsql

配置apache2虚拟主机:

1
2
$ sudo ln -s /usr/share/doc/zabbix-frontend-php/examples/apache.conf /etc/apache2/conf-available/zabbix.conf
$ sudo a2enconf zabbix

修改php配置文件:

1
2
3
4
5
post_max_size = 16M 
max_execution_time = 300
max_input_time = 300
always_populate_raw_post_data = -1
date.timezone = Asia/Shanghai

重新启动apache2

配置前端运行环境:

浏览器访问http://zabbix_server_ip/zabbix根据提示填写相关信息,最后生成zabbix前端配置文件zabbix.conf.php
如果提示无权限写入配置文件,则将文件下载,拷贝到/etc/zabbix目录下,前端配置完成。

重新访问http://zabbix_server_ip/zabbix,用默认管理员账户Admin/zabbix登入即可。

===
[erq]

概念

cassandra通过为数据目录下所有的SSTable磁盘文件制作快照来备份数据。当系统在线时,可以为所有的keyspace、单独的keyspace或者单独的表制作快照。如果使用并行ssh工具,比如pssh,可以为整个集群制作快照。

虽然制作快照时并不能保证节点与其复制节点保持一致,但当快照恢复后,依靠cassandra的一致性机制,最终还是会达到一致状态。

快照支持增量备份机制。

Cassandra通过硬链接(需要JNA,当前版本默认打开JNA)来制作快照,因此成本还是比较低的。

查看快照

1
2
3
4
5
6
7
8
$ nodetool listsnapshots

Snapshot Details:
Snapshot name Keyspace name Column family name True size Size on disk
1541832995400 reis image_increment 0 bytes 13 bytes
1541832995400 reis image 1.23 GB 1.73 TB

Total TrueDiskSpaceUsed: 1.23 GB

制作快照

制作快照时会先将内存数据刷写到硬盘,然后硬链接SSTable文件到备份目录。快照会创建到data_directory_location/keyspace_name/table_name-UUID/
snapshots/snapshot_name/目录下,里面有许多的.db文件记录了快照制作时的数据。
快照制作完成后,一般应将其拷贝到另外的存储空间单独存放。

使用以下命令来制作快照:

1
2
3
$ nodetool snapshot foo
Requested creating snapshot(s) for \[foo\] with snapshot name \[1450876735125\]
Snapshot directory: 1450876735125

foo这里是keyspace的名字,如果不指定keyspace则默认制作所有keyspaces的快照。

应为只是创建硬链接,因此快照速度飞快,无论节点有多大的容量,但是拷贝快照到另外的机器另当别论。

可以看到table_name-UUID/snapshots目录下多了一个以快照名命名的目录1450876735125,其内容即为方才制作的快照。

之后将快照归档,然后删除掉快照目录即可。

删除快照

快照会阻止删除已经无用的数据文件,因此保留快照会占用额外的存储空间。

删除所有的快照:

1
2
$ nodetool clearsnapshot
Requested clearing snapshot(s) for \[all keyspaces\]

或者单独删除某个keyspace的所有快照:

1
2
$ nodetool clearsnapshot foo
Requested clearing snapshot(s) for \[foo\]

增量备份

Cassandra支持增量备份,但默认配置没有打开。需要在cassanda.yaml文件中将incremental_backups设置为true以打开增量备份。
打开增量备份后,Cassandra会将每一个写入磁盘的SSTable制作一个硬链接写入data_directory_location/keyspace_name/table_name-UUID/backups目录下。

这样快照加上增量备份就可以提供一个可靠活的备份机制。

但是有一点儿需要注意,增量备份目录/backups下的文件Cassandra并不会自动删除,移除这些硬链接是用户的责任。因此应该在制作快照之前删除掉backups目录下的所有文件。

其实,增量备份并不依赖于快照。

快照恢复

恢复快照,需要表的所有快照文件以及可能有的增量备份文件。
在恢复快照之前应该先truncate表。如果在删除某些数据前制作快照,然后在删除后没有truncate表的情况下恢复数据,那些删除的数据并不会恢复回来。因为cassandra删除数据时并不会真正删除原始的数据,而是生成一个带有墓碑标志的一样的行来标记删除了某行,原始行和标记删除行存在于不同的SSTable中。因此恢复原始的数据,并不能去掉数据的删除标记,从来数据看起来仍然是被删除掉的。

快照恢复时需要表的schema已经存在,因此快照恢复之前需要重建表的schema。

快照恢复有多种方法:

  • 使用sstableloader
  • 拷贝所有的快照文件及增量备份文件到data_directory_location/keyspace/table_name-UUID目录下,然后通过JConsole调用column family MBean 中的JMX方法loadNewSSTables(),或者调用nodetool refresh命令。
  • 重启节点的方式
    如果恢复一个节点,需要关闭该节点,如果要恢复整个集群,则需要关闭集群内所有的节点。
  1. 关闭节点
  2. 删除commitlog目录下的所有文件
    debian包安装方式,commitlog所在目录为
    1
    /var/lib/cassandra/commitlog
  3. 删除*.db文件
    删除data_directory_location/keyspace_name/table_name-UUID目录下的所有*.db文件
  4. 拷贝最新快照及增量备份文件
    将需要恢复的快照文件拷贝到data_directory/keyspace_name/table_name-UUID目录
  5. 拷贝增量备份文件
    如果有增量备份文件,同样拷贝到data_directory/keyspace_name/table_name-UUID目录
  6. 重启节点
  7. 运行nodetool repair

快照恢复到新集群

假设需要从三个节点的集群(256 tokens)拷贝SSTable快照数据文件,然后将其恢复到一个新创建的三节点集群(256 tokens)上,新集群节点的token范围必须手动指定以与原始集群相匹配。

恢复过程:

  1. 获取节点tokens
    从原始集群中的每个节点上执行如下命令,获取其负责的tokens
    1
    $ nodetool ring grep ip_address_of_node awk '{print $NF ","}' xargs
  2. 配置新集群节点
    新集群每个节点的cassandra.ymal文件中,initial_token参数分别设置为上一步获取的tokens。新集群节点要使用与旧集群节点相同的num_tokens参数,同时新旧集群节点的其他参数也要相匹配。
  3. 清除新集群节点的system数据
    新集群每个节点执行:
    1
    $ sudo rm -rf /var/lib/cassandra/data/system/*
  4. 拷贝节点数据
    将旧集群节点的快照数据拷贝到新集群节点的相同的数据目录下,三个节点分别一一对应进行。
  5. 启动新集群
    依次分别启动新集群的节点。

References:
[1]cassandra 2.2 document
[2]Restoring a snapshot into a new cluster

===
[erq]