页面

分类

Posts in category ‘计算机技术’.

LXC容器内使用sshfs

2019年5月11日星期六, by wingfire ; 分类: 计算机技术; 0 comments

为了避免所做的设置分散化,我设置了一个lxc容器专门用于管理工作,这样避免了不同机器之间到处相互可以登录。我可以在管理机器上做好配置,然后下发到各工作机器。但是有时候又确实需要在工作机之间传递数据,scp又不支持从一个远程机器复制到另一个远程机器,这时将其中一台机器通过sshfs挂载到本地就会方便很多。

lxc默认没有fuse设备,需要手动创建:

mknod -m 666 /dev/fuse c 10 229

在lxc的config中也许可以指定创建,但是我觉得不应该采用bind选项,这里只是想独立地mount到管理容器中,而不想干扰host机器。

Cppcms数据库迁移

2019年4月25日星期四, by wingfire ; 分类: 计算机技术; 0 comments

这个blog和wiki原来的数据库是sqlite,一直打算迁移到了postgresql上,拖到现在才搞。

使用的迁移工具是pgloader,非常方便。这篇也可以参考,有其他数据库迁移到Postgres的指导。

    pgloader SOURCE TARGET
    pgloader wikipp.db postgresql://user:password@host/database

值得一提的是postgresql 连接URL格式,可以参考https://stackoverflow.com/questions/3582552/postgresql-connection-url。这种url格式新版本的libpq才能支持。

另一个值得一提的是经SSL连接postgres。我之前的一个做法是让Postgres只监听loopback地址,再通过SSH隧道转发,这么做的优点是客户端可以用ssh的密钥而无需密码登录,但搞得有点复杂。今天顺带开了一下Postgres直接支持SSL连接。

首先编辑postgresql.conf, 打开ssl:

    ssl = on
    ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
    ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'

文档 说key文件的权限必须是600,但是我的机器上实际是640.

编辑pg_hba.conf,添加:

    hostssl    database  user  address  auth-method  [auth-options]

并且把相应的host行删除,具体参考这里

客户端的连接字符串也要相应修改,添加 sslmode=require

Wikipp的迁移很顺利,但是Cppblog创建新blog失败。查了一下,源码的bug,应该是键入错误,修复很简单。

另一个问题是发现Markdown的支持有问题,没有支持Github风格的块代码。最后还是查了源代码搞定的。看源码还是终极的手段,相关源码其实并不复杂,比看网上文档还来得省力。 这几篇可以参考:

  1. Discount 实际用的Markdown的库、命令行工具就是来自这个项目。名字实在无法让人联想到Markdown,以至于我一开始误以为找错了。这里面有libmarkdown2中所有flag的定义和解释,遗憾的是没有给出数值。另外,这也是一篇不错的Markdown扩展语法测参考。吐槽一下,libmarkdown2的man页面太简略了,还不如直接看头文件。
  2. GitHub Flavored Markdown Spec Github的扩展语法。
  3. php Markdown Extra php扩展的列表语法。
  4. Discount Markdown Syntax 相当完整的Discount Markdown的语法。末尾的特殊字符表很有参考价值。

于是给Blog扩展了一下Markdown的支持:

const int K_markdown_flags = 
0x00000004|     //MKD_NOPANTS 
0x01000000|     //MKD_DLEXTRA 
0x02000000|     //MKD_FENCEDCODE  
0x08000000|     //MKD_GITHUBTAGS  
0x40000000|     //MKD_LATEX 
0;

修改后的代码:

向量平行快速判定

2018年9月6日星期四, by wingfire ; 分类: 计算机技术; 2 comments

向量a・b点积若为0,则相互垂直,但是判断是否平行,则一般需要计算|a||b|,比较耗时。

对于二维向量,可以通过判断a1b2=b1a2,但对于多维向量,要判断 a1/b1=a2/b2=a3/b3=...=an/bn, 考虑到bi可能为0,代码写起来比较麻烦。这里想到的一个办法.

  1. 设i为0
  2. 若ai和bi不都为0, 转4
  3. ++i <n 转2,否则返回true
  4. 若bi为0,return all_of(bi, bn, equal_to(0))
  5. k = ai/bi
  6. return all_of([i -> n], k*bi == ai)

善用sort命令

2018年1月2日星期二, by wingfire ; 分类: 计算机技术; 0 comments

文本处理的时候难免需要排序,sort就是用来排序的工具.然而如果对sort不够熟悉,那很多时候不免觉得sort也力不从心.了解这些功能,可以让sort的能力更上一个台阶,见下表.

选项长度描述
-b--ignore-leading-blanks默认情况下,对整行进行排序,从每行的第一个字符开始。这个选项导致 sort 程序忽略 每行开头的空格,从第一个非空白字符开始排序。
-f--ignore-case让排序不区分大小写。
-n--numeric-sort基于字符串的数值来排序。使用此选项允许根据数字值执行排序,而不是字母值。
-r--reverse按相反顺序排序。结果按照降序排列,而不是升序。
-k--key=field1[,field2]对从 field1到 field2之间的字符排序,而不是整个文本行
-m--merge把每个参数看作是一个预先排好序的文件。把多个文件合并成一个排好序的文件,而没有执行额外的排序
-o--output=file把排好序的输出结果发送到文件,而不是标准输出
-t--field-separator=char定义域分隔字符。默认情况下,域由空格或制表符分隔

大部分很很好理解.-n可以按照实际数字排序,而没有的话就是按照字典排序.有了-n就可以避免11排在9前面这种尴尬了.-k对于多字段文本特别有用,比如让ls的结果按照文件大小排序,可以这么写:

ls -l /usr/bin | sort -nr -k 5

我有时还需要按照字段的特定方式排序,例如对于MM/DD/YYYY格式的日期,想按照时间排序,sort也可以做到:

Ubuntu         8.10  10/30/2008

sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt

上面例子中的3表示第三个字段,.7表示字段的第7个字符开始,因为同时指定了-n,-k 3.7n 合起来就是第3个字段的地7个字符开始的数值.多个-k表示先按第一个k指定的字段排,在相同值的情况下再按后面的k指定字段排序.

通常sort以空白作为字段的分隔符,但是也可以用-t指定其他的分隔符.

-m可以用来合并多个已经排好序的文件到一个文件中

还有个-u参数,可以对排好序的结果做uniq,不必再调用uniq命令去重.

bash 重定向技巧

2017年12月28日星期四, by wingfire ; 分类: 计算机技术; 0 comments

重定向的顺序安排非常重要,例如:

>ls-output.txt 2>&1

重定向标准错误到文件 ls-output.txt,但是如果命令顺序改为:

2>&1 >ls-output.txt

则标准错误定向到屏幕。

现在的 bash 版本提供了第二种方法,更精简合理的方法来执行这种联合的重定向:

ls -l /bin/usr &> ls-output.txt

下一页