python 格式化输出

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from __future__ import print_function
from __future__ import with_statement

format print http://python.jobbole.com/82292/

for subprocess
self.cmd = (self.EXE + ” ” + self.PARAMS).split() if platform.system() == “Windows” else [self.EXE + ” ” + self.PARAMS]
subprocess.check_output(self.cmd, shell=True)

or:
self.cmd = (self.EXE + ” ” + self.PARAMS).split() # for Both Linux and Windows
subprocess.check_output(self.cmd, shell=False)

print( “%02d” % 10) # 0010
print(“{num:02d}”.format(num=1)) #01
str(1).zfill(5) # “00001”
str(1).rjust(5, ‘0’) #”00001″
str(1).ljust(5, ‘0’) #”10000″
str(1).center(5, ‘0’) #”00100″

format string output
“{val:%02d}”.format(val=10)
“{f:3.2f}”.format(f=f)
“{0:3.2f}”.format(3.2323)
“%3.2f”.format(3.2323)
“{f:2.4s}”.format(f=”adsfadsf”)

import math
#default
print “PI = %f” % math.pi
#width = 10,precise = 3,align = left
print “PI = %10.3f” % math.pi
#width = 10,precise = 3,align = rigth
print “PI = %-10.3f” % math.pi
#前面填充字符
print “PI = %06d” % int(math.pi)

#输出结果
#PI = 3.141593
#PI = 3.142
#PI = 3.142
#PI = 000003
#浮点数的格式化,精度、度和

#precise = 3
print “%.3s ” % (“jcodeer”)
#precise = 4
print “%.*s” % (4,”jcodeer”)
#width = 10,precise = 3
print “%10.3s” % (“jcodeer”)
#输出结果:
#jco
#jcod
# jco
#同于字符串也存在精度、度和。

import re
pattern = “.*-\d*\.ts”
if re.match(pattern, fn):
return False
else:
return True

print(“{tcost:<6.2f}sec cost for heatmap: i={i: <4d} t={t: <6.2f}”.format(tcost=tcost, t=t, i=i))

python: numpy

pip3 install jupyter

ipython or jupyter notebook
“`

import numpy as np

from matplotlib.pyplot import imshow, title
import matplotlib.pylot as plt
from scipy.misc import imread, imsave, imresize

xs = np.arange(-np.pi, np.pi, 0.01)
xs = np.linspace(-np.pi, np.pi, 100)

xs, ys = np.meshgrid(xs, xs)
xs = np.arange(12).reshape(3, 4)
mat = np.random.random((2, 3))

z = np.sqrt(xs ** 2 + ys ** 2)
plt.imshow(z); plt.colorbar()
plt.title(“pic”)
plt.show()
“`

refs:
– http://cs231n.github.io/python-numpy-tutorial/

大文件处理

由于系统的开发、配置,网络动态变化等各方面原因,大文件处理、下载、上传、分发往往更容易失败。

 

git 传输:

git config –global http.postBuffer 524288000

 

niginx 上传

http region: client_max_body_size 1024m;

其它:

server region:

proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

最简单git服务器


远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7×24小时开机并交换大家的修改。

GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。

搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。

假设你已经有sudo权限的用户账号,下面,正式开始安装。

第一步,安装git

$ sudo apt-get install git

第二步,创建一个git用户,用来运行git服务:

$ sudo adduser git

第三步,创建证书登录:

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库:

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

$ sudo git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git

$ sudo chown -R git:git sample.git

第五步,禁用shell登录:

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.

剩下的推送就简单了。

管理公钥

如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。

这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。

ssh-copy-id git@server-ip

管理权限

有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。

这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。

管理权限

push已有代码到仓库中

git remote add shock git@hk.shockjiang.vip:~/sample.git
git push shock master

 


remarks, 最后推荐一款带web界面的轻量级git系统:gitea, 范例: http://git.shockjiang.vip

 

FIFO 读写

ref: http://blog.csdn.net/erlian_beijing/article/details/46698401

FIFO文

#include <sys/types.h>

#include <sys/stat.h>

int mkfifo( const char*pathname, mode_t mode);

参数:

pathname:FIFO的路径名+文件名。

mode:mode_t类型的权限描述符,同open的参数。

返回值:

成功:返回0

失败:如果文件已经存在,则会出错且返回-1。

 

操作FIFO文件时的特点:

系统调用的I/O函数都可以作用于FIFO,如open、close、read、write等。

 

打开FIFO时,非阻塞标志(O_NONBLOCK)产生下列影响:

特点一:不指定O_NONBLOCK(即open没有位或O_NONBLOCK)

1、open以只读方式打开FIFO时,要阻塞到某个进程为写而打开此FIFO

2、open以只写方式打开FIFO时,要阻塞到某个进程为读而打开此FIFO。

3、open以只读、只写方式打开FIFO时会阻塞,调用read函数从FIFO里读数据时read也会阻塞。

4、调用write函数向FIFO里写数据,当缓冲区已满时write也会阻塞。

5、通信过程中若写进程先退出了,则调用read函数从FIFO里读数据时不阻塞;若写进程又重新运行,则调用read函数从FIFO里读数据时又恢复阻塞。

6、通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会(收到SIGPIPE信号)退出。

特点二:指定O_NONBLOCK(即open位或O_NONBLOCK)

1、先以只读方式打开:如果没有进程已经为写而打开一个FIFO, 只读open成功,并且open不阻塞。

2、先以只写方式打开:如果没有进程已经为读而打开一个FIFO,只写open将出错返回-1。

3、read、write读写命名管道中读数据时不阻塞。

4、通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会(收到SIGPIPE信号)退出。

 

注意:

open函数以可读可写方式打开FIFO文件时的特点:open不阻塞,可以这样理解:因为其本身以可读可写的方式打开,所以不需要别的进程帮其打开。

 

注:关于非阻塞方式或非阻塞打开FIFO,read时返回值的问题:

 

若某个FIFO的最后一个写进程终止了或关闭了该FIFO,那么将为FIFO的读进程产生一个文件结束标志。如果 read()读数据时第一个读到的是文件结束标志,那么就返回0。

 

1、阻塞方式:

1) 写进程未退出,read阻塞,等待写端的输入

2) 写进程终止了或关闭了该FIFO,read非阻塞,为FIFO的读进程产生一个文件结束标志,read的返回值为0。

 

2、非阻塞方式:

假设一个进程以非阻塞读方式打开一个FIFO.该FIFO之前已经被以写方式被其他进程打开,但无数据被写入,那么此时读进程需要立刻返回,那么应该返回什么呢?
我们知道 如果 read()读数据时第一个读到的是文件结束标志,那么就返回0。如果像 我们想的那样 没有数据读应该返回0 ,那么这个0就具有二义性。因为我们不知道是没有数据造成的返回0还是写端关闭造成的返回0.

所以POSIX.1要求,对一个非阻塞的描述符如果无数据可读,则read返回-1,而且 errno被设置为 EAGAIN。

1) 如果在随后调用read函数之前,如果另一个进程已经以写方式打开了该FIFO,并写入了数据,那么正常读取数据。

2) 如果在随后调用read函数之前,如果另一个进程已经以写方式打开了该FIFO,但是并未写入数据,read调用会立刻出错返回-1, 并设置 errnno为EAGAIN。

3)如果在随后调用read函数之前,没有其他进程以写方式打开该FIFO,或是曾经有但是在read读时已经关闭了,那么read返回0,表示读到文件结束标志。

error while loading shared libraries: xxxx.so.x

http://www.cnblogs.com/Anker/p/3209876.html

 

error while loading shared libraries: xxx.so.x” 错误的原因和解决办法

今天在执行一个protobuf程序时,提示error while loading shared libraries: libprotobuf.so.8: cannot open shared object file: No such file or directory错误。google了一下,是由于找不到lib这个文件。

解决办法:

一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:

tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

原因一般有两个, 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可.

另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.

所以安装共享库后要注意共享库路径设置问题, 如下:

1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令

ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.

2) 如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它”非/lib或/usr/lib”目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:

# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo “/usr/local/lib” >> /etc/ld.so.conf
# ldconfig

3) 如果共享库文件安装到了其它”非/lib或/usr/lib” 目录下,  但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库. 

LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下, 其中有一大堆库文件在/usr/local/mysql/lib下面, 则可以在.bashrc或.bash_profile或shell里加入以下语句即可:

export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH

一般来讲这只是一种临时的解决方案, 在没有权限或临时需要的时候使用.

compiling: gcc/make/ldd

ldd:
/etc/ld.so.conf.d
pkg-config: locate pkgconfig for managed lib

check the gcc include path:
echo | cpp -Wp,-v
or short cpp -v
or gcc -xc -v – (for c), gcc -xc++ -v – (for c++)

 

ldconfig is used to find the shared library when executing a program
ldconfig search the /etc/ld.so.conf which then defines the searching path
LD_LIBRARY_PATH is used to specify the search path

add addtional include path:
export C_INCLUDE_PATH=/opt/local/include
export CPLUS_INCLUDE_PATH=/opt/local/include
add addtional library path
export LIBRARY_PATH=/opt/local/lib
搜索的先后顺序是:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

 

CPATH
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
OBJC_INCLUDE_PATH

find the which header files are included:
gcc -M main.cpp -I/opt/local/include

ignore the system header files:
gcc -M main.cpp
or gcc -H main.cpp

linux:
sudo ldconfig (will refresh the ldconfig’s cache)
ldconfig -p: list all managed lib (/etc/ld.so.conf)
ldconfig -n /opt/dummy/lib #add new lib to ldconfig links, may not permantly

 

ldd APP: to show its linked lib
if ldd APP found “not found XX”, this may cause by ldconfig, which is called by ldd

pkg-config –cflags –libs libass

echo $PKG_CONFIG_PATH together with /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfig and /usr/local/share/pkgconfig
gcc program.c $(pkg-config –cflags –libs gnomeui)

CMake Module path
/usr/share/cmake-3.5/Modules

 

find the head file:
echo ‘#include <stdbool.h>’ | cpp -H
or: locate stdbool.h

locate
sudo updatedb to refresh locate cache

mac osx
otool -L APP # ldd’s equipvalent
or dyldinfo -dylibs APP

 

查看.a文件都包含了那些文件
ar -t xxx.a
查看.so文件接口
nm -D xxx.so

查看库支持的CPU体系结构
readelf -h libxslt.a/so

 

ffmepg:
–extra-libs=’/usr/local/lib/libTransform360.a -lstdc++ -L/usr/local/lib’

git tutorial

linux: git config credential.helper ‘cache –timeout=3600000’
windows: git config credential.helper winstore
git config –global credential.helper wincred
https://github.com/anurse/git-credential-winstore/downloads
git config –global credential.helper store
it config –unset credential.helper

git config -l

http://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server

git ls-files -o -i –exclude-standard

git review:
git push gerrit HEAD:refs/for/master

git commit –amend –author “Shock Jiang <shock.jiang@gmail.com>”

#remove file in the repository but keep local copy
git rm –cached shock-rsp/abc

git push remote localbranch:remotebranch
git push -f remote localbranch:remotebranch

git reset –hard remote/branch

 

git diff HEAD~1
git diff HEAD~1 main.tex

#check pull/push
git remote -v

 

#remove file from last commit
git reset HEAD~1 — FILE
git checkout FILE
git commit –amend
git rm doc/\*.txt #recursive remove all *.txt under doc

git branch -vv
git push -u origin new_branch
git branch -u origin/foo foo
git branch –set-upstream my_branch origin/my_branch

#replace origin with new url
git remote set-url origin https://github.com/USERNAME/OTHERREPOSITORY.git
git push -u origin master
git remote set-url origin http://git.oschina.net/shockjiang/shock-data

remove a branch:
git branch -D <name-of-branch>
git branch -D -r origin/<name-of-branch>
git push origin :<name-of-branch>

#on server’s computer
#===================
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

#on server’s computer
$ mkdir project.git

git 一部分
mkdir gitSparse
cd gitSparse/
git init
git remote add -f origin https://github.com/bestswifter/MySampleCode.git
ls
git config core.sparsecheckout true
echo “CornerRadius” >> .git/info/sparse-checkout
cat ./.git/info/sparse-checkout
git pull origin master
$ cd project.git
$ git init –bare

 

on client’s computer
====================
$ cd myproject
$ git init
$ git add .
$ git commit -m ‘initial commit’
$ git remote add origin git@gitserver:/opt/git/project.git
$ git push origin master

 

push code to a remote server (with public IP) from local:
You could push the changes to the web server, instead of trying to pull them:

Set up a repos on the web server:

cd /somedir
git init –bare
Push to that repos from your dev machine:

git remote add web user@web:/somedir
git push web master

vim turtorial

set expandtab
set tabstop=4
set shiftwidth=4
set autoindent
set smartindent
set nu

:retab to allow the converting

 

移动光标 hjkl 左上下右; 对应emacs 中的 Ctrl-b Ctrl-p Ctrl-n Ctrl-f

O: 向上插入一行并跳转

move the current line to top/middle/bottom of the screen:
z-t: top
z-z or z-. : middle
z-b: bottom

列模式
ctrl-v 进入列模式, Shift-Ctrl-A eclipse with mouse to select text
移动光标,选择对应的修改区域
r-进入修改模式 I-进入行首编辑模式 A-进入行末插入模式-
ESC 退出列模式

Shift-j: merge/join two line

针对粘贴时候太多缩进的问题,粘贴之前: set paste
完成之后: set nopaste

全文替换
:1, $s / old / new / g
我们知道%等价于1,$,所以上行命令也可以这样写:
:% s / old / new / g