0%

Mac OS X 10.11连接linux系统CUPS使用ipp(Internet Printing Protocol)协议共享的打印机时,遇到两个大坑。

系统打印机配置的坑

使用mac系统的打印机配置来连接共享打印机
从System Preferences->Printers & Scanners对话框添加ip打印机,选择IPP协议,address输入正确的共享打印机地址:

1
2
3
4
5
6
http://printer_server_ip:631/printers/HP_LaserJet_P1008
```
无论使用何种驱动,add时都会有提示:
```js
Unable to verify the printer on your network.
Unable to connect to ‘printer_server_ip’ due to an error. Would you still like to create the printer?

如果强制添加,然而并不能真的打印
事后发现mac os x 10.11系统打印机配置添加的ipp打印机访问地址是错误的,可以通过cups配置界面看到其错误的地址。

HP官方驱动的坑

一直以为官方驱动应该是最靠谱的,不过这次不行。
已经提前安装了HP Mac OS X drivers,500多M!

改用cups来添加共享打印机。
mac上的cups默认是没有打开web管理界面的,首先启用web管理界面:

1
$ cupsctl WebInterface=yes

然后访问http://127.0.0.1:631打开cups管理界面来添加远程ipp协议共享打印机。

Administration->Printer->Add Printer->Other Network Printers->Internet Printing Protocol(http)

输入ipp打印机的访问地址:

1
http://printer_server_ip:631/printers/HP_LaserJet_P1008

选择HP提供的P1008官方驱动,添加完成。

然而并不能打印!

重新修改已添加打印机配置,Printers->P1008->Modify Printer将其驱动更改为cups内置的Generic PostScript Printer

打印测试页,success!

References:
[1]Internet Printing Protocol
[2]Line Printer Daemon protocol
[3]About AirPrint
[4]PostScript Printer Description

===
[erq]

cassandra像其他RDBMS一样提供了export/import工具:

  • cqlsh命令COPY TO/FROM
    注意这不是cql命令。使用这组命令可以在cassandra与其他RDBMS或cassandra之间迁移数据。COPY TO/FROM支持CSV文件格式以及标准输出和输入。
    COPY TO/FROM命令同样支持集合数据类型。
  • sstable2json/json2sstable
    这组工具已经过时,在3.0版本中已被删除。所以不应该再使用这组工具。
  • sstableloader
    Cassandra bulk loader,可以装载外部数据到cassandra,也可以恢复snapshot,装载sstable到不同配置的cassandra集群。
    如果数据量很大,应该使用sstableloader,如果数据量比较小的话,使用COPY TO/FROM更省时省力。
  • Snapshots
    snapshots是cassandra正牌的备份恢复工具,而不是用于与其他数据库系统进行数据迁移的工具。所以严格来说它不应该算作export/import工具。
  • ETL工具
    很多第三方的ETL(Extract-Transform-Load)工具支持从其他数据库向cassandra数据库迁移数据。

COPY TO/FROM

这里只讲一下COPY TO/FROM命令。

命令格式:

1
2
3
4
5
6
7
COPY table_name ( column, ...)
FROM ( 'file_name' STDIN )
WITH option = 'value' AND ...

COPY table_name ( column , ... )
TO ( 'file_name' STDOUT )
WITH option = 'value' AND ...

COPY FROM 用于从csv文件或标准输入import数据到表,而COPY TO用于将表数据export到csv文件或标准输出。

WITH option=’value’ 用于指定csv文件的格式,分隔符,引用,转移字符,文件编码,时间格式等等,详见官方文档。

如果不指定列名,会按表元数据中记载的列顺序输出所有的列。同样,如果csv也是按相同的顺序组织数据,COPY FROM时也可以忽略所有的列名。

COPY TO/FROM时,可以只指定部分列进行部分数据的导出和导入,而且可以以任意顺序指定列名。

如果表中已经存在数据,COPY FROM不会truncate已有的数据。

导出数据的示例:

1
2
cqlsh> use test ;
cqlsh> COPY airplanes (name, mach, year, manufacturer) TO 'export.csv' ;

导入数据的示例:

1
cqlsh> COPY airplanes (name, mach, year, manufacturer) FROM 'import.csv' ;

如果使用标准输入导入数据,要使用只包含 \. 字符的单独一行来结束数据输入。

如果导入数据时出现如下错误提示:

1
2
3
4
Error starting import process:

field larger than field limit (131072)
%d format: a number is required, not NoneType

这是因为csv文件包含大容量字段,python的csv模块需要设置更大的字段尺寸限制。

修改/usr/bin/cqlsh.py文件,在导入csv模块之后,添加如下行:

1
csv.field_size_limit(sys.maxsize)

注意:含有counter列的表无法使用COPY TO/FROM来导出和导入数据。

References:
[1]Ways to Move Data To/From DataStax Enterprise and Cassandra
[2]Consider deprecating sstable2json/json2sstable in 2.2
[3]_csv.Error: field larger than field limit (131072)
[4]cassandra数据迁移

===
[erq]

GNOME环境下的GUI应用程序可以配置在GNOME初始化后自动运行。

配置自启动的位置在:

1
$HOME/.config/autostart/

简单的将/usr/share/applications目录下的.desktop文件拷贝到此目录下即可:

1
$ cp /usr/share/applications/foo.desktop ~/.config/autostart/

或者使用GNOME Tweak Tool -> Startup Applications选择一下就可以了。

References:
[1]Autostarting

===
[erq]

Dumps created by pg_dump are internally consistent, meaning, the dump represents a snapshot of
the database at the time pg_dump began running. pg_dump does not block other operations on the
database while it is working. (Exceptions are those operations that need to operate with an exclusive
lock, such as most forms of ALTER TABLE .)

手工创建oracle数据库,新建用户sqlplus登录时有错误提示信息:

1
2
3
4
5
6
7
ERROR:
ORA-00942: table or view does not exist


Error accessing PRODUCT_USER_PROFILE
Warning: Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM

可以正常登录,不影响使用。

用system用户登录数据库,执行脚本$ORACLE_HOME/sqlplus/admin/pupbld.sql可以消除此错误提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
$ sqlplus system/xxxx@orcl
SQL>@/u01/app/oracle/product/10.2.0/db_1/sqlplus/admin/pupbld.sql

DROP SYNONYM PRODUCT_USER_PROFILE
*
ERROR at line 1:
ORA-01434: private synonym to be dropped does not exist

DATE_VALUE FROM PRODUCT_USER_PROFILE
*
ERROR at line 3:
ORA-00942: table or view does not exist

DROP TABLE PRODUCT_USER_PROFILE
*
ERROR at line 1:
ORA-00942: table or view does not exist

ALTER TABLE SQLPLUS_PRODUCT_PROFILE ADD (LONG_VALUE LONG)
*
ERROR at line 1:
ORA-00942: table or view does not exist

Table created.

DROP TABLE PRODUCT_PROFILE
*
ERROR at line 1:
ORA-00942: table or view does not exist

DROP VIEW PRODUCT_PRIVS
*
ERROR at line 1:
ORA-00942: table or view does not exist

View created.

Grant succeeded.

DROP PUBLIC SYNONYM PRODUCT_PROFILE
*
ERROR at line 1:
ORA-01432: public synonym to be dropped does not exist

Synonym created.

DROP SYNONYM PRODUCT_USER_PROFILE
*
ERROR at line 1:
ORA-01434: private synonym to be dropped does not exist

Synonym created.

DROP PUBLIC SYNONYM PRODUCT_USER_PROFILE
*
ERROR at line 1:
ORA-01432: public synonym to be dropped does not exist

Synonym created.

重新登录新用户,错误提示消失。

===
[erq]

When updating to a new minor release, the safest policy is to update the standby servers first — a new minor release is more likely to be able to read WAL files from a previous minor release than vice versa. — postgresql high availability

命名格式

版本号的命名格式为:

主版本号.次版本号[-发布进程版本号]-修订版本号-发布分支头SHA1 ID

管理策略

主版本号(Major)和次版本号(Minor):

主版本号对应大的、全局功能更新,而次版本号对应小的、局部的功能更新。主、次版本号根据实际情况设定。

发布进程版本号(release):

用于标识发布进程的版本号后缀,使用alpha(内部测试),beta(公共测试)和rc(release candidate,发布候选)加上数字作为次版本号的后缀,比如alpha1,alpha2,beta1,beta2,rc1,rc2等。

修订版本号:

标识自上次标定主次版本号以来的bugfix次数。修订版本号不涉及功能更新。每次重新标定主、次版本号(还可能有发布进程版本号)之后,修订版本号重置,从0开始重新计数。

发布分支头sha1:

标识该版本对应的发布分支头提交的sha1摘要,方便通过版本号回溯git代码库中的commit。

实现

主、次、发布进程版本号,根据项目实际情况确定,确定之后在发布分支上打标签以记录版本号:

1
$ git tag -a v1.0-rc1 -m 'version 1.0 release candidate 1'

修订版本号和发布分支头sha1 id通过git命令describe来自动生成:

1
$ git describe --tags --long

最后会生成如下格式的版本号:

1
v1.0-rc1-10-g742aee8

此版本号的含义为:主版本号为1,次版本号为0,发布进程版本号为rc1,修订版本号为10,也就是主、次、发布进程版本号设定之后又进行了10次bugfix,发布分支头为742a3ee8这个commit对象。

构建

在自动构建脚本中调用git describe命令来自动生成版本号,并自动记录到应用程序中,最后发布的应用程序就有了明确的、易于追溯的版本号。

===
[erq]

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可。如果要一次推送所有本地新增的标签上去,可以使用 - -tags 选项,运行git push origin - -tags

debian官方源里的shadowsocks最近用不了了。/var/log/shadowsocks.log里出现错误提示:

1
ERROR M2Crypto is required to use aes-256-cfb, please run apt-get install python-m2crypto

但是实际上python-m2crypto已经安装了,重新安装也不行。那就换个客户端shadowsocks-qt5试试。

安装依赖

1
$ sudo apt-get install qt5-qmake qtbase5-dev libqrencode-dev libappindicator-dev libzbar-dev libbotan1.10-dev

安装libQtShadowsocks
shadowsocks-qt5依赖于libQtShadowsocks,所以先安装libQtShadowsocks。

下载或clone libQtShadowsocks,项目根目录下执行:

1
$ dpkg-buildpackage -uc -us -b

在上一级目录中生成三个deb包:

1
2
3
libqtshadowsocks_1.8.0-1_amd64.deb 
libqtshadowsocks-dev_1.8.0-1_amd64.deb
shadowsocks-libqtshadowsocks_1.8.0-1_amd64.deb

安装前两个即可

1
2
$ sudo dpkg -i libqtshadowsocks_1.8.0-1_amd64.deb 
$ sudo dpkg -i libqtshadowsocks-dev_1.8.0-1_amd64.deb

安装shadowsocks-qt5
下载或clone shadowsocks-qt5,项目根目录下执行:

1
$ dpkg-buildpackage -uc -us -b

在上一级目录中生成:

1
shadowsocks-qt5_2.6.0-1_amd64.deb

安装deb包

1
$ sudo dpkg -i shadowsocks-qt5_2.6.0-1_amd64.deb

安装完成,配置见Shadowsocks科学上网

References:
[1]shadowsocks-qt5
[2]libQtShadowsocks
===
[erq]

提供gradle访问ssh执行命令、传输文件的功能。

安装
构建脚本中添加:

1
2
3
plugins {
id 'org.hidetake.ssh' version '1.1.4'
}

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
remotes {
webServer {
host = '192.168.1.101'
port = 2022
user = 'jenkins'
identity = file('id_rsa')
}
}

task deploy << {
ssh.run {
session(remotes.webServer) {
put from: 'example.war', into: '/webapps'
execute 'sudo service tomcat restart'
}
}
}

可以使用此插件通过ssh自动部署应用程序。

tomcat热部署会持续的泄露PermGen内存,因此还是常规的部署更靠谱,不过应用程序会暂时中断。

References:
[1]gradle-ssh-plugin
[2]Deploy your App from Gradle

===
[erq]