-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match

-Dmaven.multiModuleProjectDirectory=$M2_HOME

Eclipsse settings

QQ20170228-141525@2x.png

Charles https

环境:

Charles 3.10.1、OS X 10.11.4、IOS 10.2.1

1.安装证书

58b01076ac58f

2.SSL proxy设置

58b0106b330c2
58b0106894c82

到此为止电脑上浏览器代理设置好后,是能代理https了,但是手机端呢?下面是手机设置

3.手机端https代理设置

手机已将Charles设置为了代理

58b010783e27c
58b0107b29ab7

用Safari访问http://charlesproxy.com/getssl下载安装证书,如果没有将Charles设置为代理将无法下载安装证书。

Hexo deploy rsync

First step: intall rsync on your server

1
yum install rsync -y

Second step: set the configuration file

Edit _config.yml

1
2
3
4
5
6
7
8
9
10
11
12
deploy:
- type: git
repo: [email protected]:xjliao/xjliao.github.io.git
branch: master
- type: rsync
host: 0.0.0.0
user: xjliao
root: /home/xjliao/blogserver/html
port: 22
delete: true
verbose: true
ignore_errors: false

Install Supervisor on CentOS

CentOS default repository is very limited, and even if you install EPEL you will get old packages, in my case I needed to install Supervisor to manage my Django application, after trying to do it manually and through EPEL I ended up with the following setup.

Install Needed Package

1
2
3
4
sudo yum install python-setuptools
sudo easy_install pip
sudo pip install supervisor
Setup Supervisor

We’ve already installed “Supervisor” globally, but we need to create its configuration, luckily it comes with default config:

1
2
3
4
5
6
7
8
9
10
echo_supervisord_conf > supervisord.conf
sudo cp supervisord.conf /etc/supervisord.conf
sudo mkdir /etc/supervisord.d/
sudo vim /etc/supervisord.conf
:
[include]
files = /etc/supervisord.d/*.conf
:

Next we need to set “Supervisor” to run automatically every time you restart your machine, we need to create /etc/rc.d/init.d/supervisord with the following content:

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
60
61
62
63
sudo vi /etc/rc.d/init.d/supervisord
#!/bin/sh
#
# /etc/rc.d/init.d/supervisord
#
# Supervisor is a client/server system that
# allows its users to monitor and control a
# number of processes on UNIX-like operating
# systems.
#
# chkconfig: - 64 36
# description: Supervisor Server
# processname: supervisord
# Source init functions
. /etc/rc.d/init.d/functions
prog="supervisord"
prefix="/usr/"
exec_prefix="${prefix}"
prog_bin="${exec_prefix}/bin/supervisord"
PIDFILE="/var/run/$prog.pid"
start()
{
echo -n $"Starting $prog: "
daemon $prog_bin --pidfile $PIDFILE
[ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog startup"
echo
}
stop()
{
echo -n $"Shutting down $prog: "
[ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac

Then make sure CentOS knows about it:

1
2
3
4
sudo chmod +x /etc/rc.d/init.d/supervisord
sudo chkconfig --add supervisord
sudo chkconfig supervisord on
sudo service supervisord start

Sample Supervisor App

Here is a sample of Django App to be controlled and monitored by Supervisor, just put it:

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo vi /etc/supervisord.conf
:
[program:shadowsocks-server]
command=/home/xjliao/goworkspace/bin/shadowsocks-server -c /etc/shadowsocks.json
autostart=true
autorestart=true
[program:nginx-blogserver]
command=/home/xjliao/blogserver/sbin/nginx
autostart=true
autorestart=true
:

from:
https://rayed.com/wordpress/?p=1496

Linux yum install last stable version for nginx

1
vim /etc/yum.repos.d/nginx.repo

Centos

1
2
3
4
5
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

RHEL

1
2
3
4
5
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/rhel/$releasever/$basearch/
gpgcheck=0
enabled=1

from:
http://wiki.nginx.org/Install

Deploy shadowsocks-goalang server

Get golang and set golang path

1
2
3
4
5
wget https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz
tar -zxvf /home/xjliao/go1.5.1.linux-amd64.tar.gz
mkdir /home/xjliao/goworkspace
sudo vim /etc/profile
go

Use go cmd to test.

add

1
2
3
4
5
6
GOROOT=$HOME/go
GOPATH=$HOME/goworkspace
PATH=$PATH:$GOROOT/bin
export GOROOT GOPATH PATH

Get shadowsocks-goalang

1
go get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-server

And then. We can look for a execute file at $GOPATH/bin name’s shadowsocks-server.
Ok. We need a configuration file to run the shadowsocks-server command.
So….

1
sudo vim /etc/shadowsocks.json

add

1
2
3
4
5
6
7
8
9
10
11
{
"server":"0.0.0.0",
"local_address": "127.0.0.1",
"local_port":1080,
"port_password":{
"8383":"1"
},
"timeout":600,
"method":"aes-128-cfb",
"fast_open": false
}

Execute shadowsocks-server command. if do right steps, it will run at listener your set port and work well.

1
/home/xjliao/goworkspace/bin/shadowsocks-server/ -c /etc/shadowsocks.json

Make it autostart when system start or reboot.

Install supervisor and edit configuration file.

1
2
3
sudo yum install supervisor
sudo vim /etc/supervisord.conf
sudo chkconfig supervisord on

Add

1
2
3
4
[program:shadowsocks-server]
command=/home/xjliao/goworkspace/bin/shadowsocks-server -c /etc/shadowsocks.json
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)

Linux nginx autostart scripts

Should work on RHEL, Fedora, CentOS. Tested on CentOS 5.

Save this file as [/etc/init.d/nginx]

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
# Your nginx config
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
# Your nginx config
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
1
2
3
sudo chmod +x /etc/init.d/nginx
sudo chkconfig --add /etc/init.d/nginx
sudo chkconfig nginx on

from:
http://wiki.nginx.org/RedHatNginxInitScript

Golang 交叉编译

在此之前假设你的Golang环境已经设置好了

mac 二进制包安装golang默认可以使用linux/windows/freebsd, GOARCH为amd64的交叉编译, 386需要手动添加

准备目标平台的包和工具文件

以下过程不是重新编译,安装go,而是添加对其他平台的支持。

方式一

1
2
3
4
$ cd /usr/local/go/src
$ CGO_ENABLED=0 GOOS=linux GOARCH=386 ./make.bash
$ CGO_ENABLED=0 GOOS=windows GOARCH=386 ./make.bash
$ CGO_ENABLED=0 GOOS=freebsd GOARCH=386 ./make.bash

CGO_ENABLED=0 表示交叉编译禁用cgo
如果go文件夹是owner为root, 请使用sudo

如果需要提高编译速度,加入。

1
./make.bash --no-clean

方式二

1
brew install --cross-compile-all go

安装完成后,我们可以看到 Go的安装目录下 多了这个平台特有的几个命令行工具。

各平台的GOOS和GOARCH参考



OS ARCH OS version
linux 386 / amd64 / arm >= Linux 2.6
darwin 386 / amd64 OS X (Snow Leopard + Lion)
freebsd 386 / amd64 >= FreeBSD 7
windows 386 / amd64 >= Windows 2000

编译成对应平台下的执行文件

到源代码目录下执行:

1
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

不带前面参数的 go build 只是编译出开发环境适用的执行文件。

golang-crosscompile工具

下载地址
github.com/davecheney/golang-crosscompile
使用方法
http://dave.cheney.net/2012/09/08/an-introduction-to-cross-compilation-with-go

下载脚本

1
2
$ git clone git://github.com/davecheney/golang-crosscompile.git
$ source golang-crosscompile/crosscompile.bash

编译支持所有平台

1
$ go-crosscompile-build-all

这个时间要花个几分钟

查看平台的包

1
$ ls -1 $(go env GOROOT)/pkg

使用交叉编译

1
$ go-linux-arm build

要不同平台的编译,替换即可, 如:go-windows-386 build

为方面以后使用,将下面的加入到.bashrc或.zshrc

1
2
3
$ mkdir ~/.golang-crosscomplie
$ cp golang-crosscompile/crosscompile.bash ~./golang-crosscomplie
$ source ~/.zshrc

Golang 快速入门 方法 接口

Golang 快速入门 方法 接口

内容来自https://tour.golang.org/

格式说明:

// 正常注释
//——-依赖关系
//—>关联关系

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
package main
import "os"
import "time"
import (
"fmt"
"image"
"io"
"log"
"math"
"net/http"
"strings"
)
//--- 方法
type Vertex struct {
X, Y float64
}
//Go 没有类。然而,仍然可以在结构体类型上定义方法。
//方法接收者 出现在 func 关键字和方法名之间的参数中。
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
//---
//-- 方法(续)
//你可以对包中的 任意 类型定义任意方法,而不仅仅是针对结构体。
//但是,不能对来自其他包的类型或基础类型定义方法。
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
//---
// 接收者为指针的方法
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
// 接口
//接口类型是由一组方法定义的集合。
//接口类型的值可以存放实现这些方法的任何值。
type Abser interface {
Abs() float64
}
// 隐式接口
//类型通过实现那些方法来实现接口。 没有显式声明的必要;所以也就没有关键字“implements“。
//隐式接口解藕了实现接口的包和定义接口的包:互不依赖。
//因此,也就无需在每一个实现上增加新的接口名称,这样同时也鼓励了明确的接口定义。
type Reader interface {
Read(b []byte) (n int, err error)
}
type Writer interface {
Write(b []byte) (n int, err error)
}
type ReadWriter interface {
Reader
Writer
}
//---
// Stringers 与java的toString()方法类似
// 在打印或format时生效
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}
//---
// 错误
// Go 程序使用 error 值来表示错误状态
type MyError struct {
When time.Time
What string
}
func (e *MyError) Error() string {
return fmt.Sprintf("at %v, %v", e.When, e.What)
}
func run() error {
return &MyError{
time.Now(),
"it didn't work",
}
}
//---
// Web服务器
type Hello struct{}
func (h Hello) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello")
}
func main() {
//--> 方法
v := &Vertex{3, 4}
fmt.Println(v.Abs())
//--> 方法续
f := MyFloat(-math.Sqrt2)
fmt.Println(f.Abs())
//--> 接收者为指针的方法
v.Scale(5)
fmt.Println(v, v.Abs())
//--> 接口
var a Abser
f1 := MyFloat(-math.Sqrt2)
v1 := Vertex{3, 4}
// a MyFloat 实现了Abser
a = f1
// a *Vertext 实现了Abser
a = &v1
// 下面一行,v1是一个 Vertex(而不是 *Vertex)
// 所以没有实现 Abser。
//a = v1
fmt.Println(a.Abs())
//-->隐式接口
var w Writer
w = os.Stdout
fmt.Fprintf(w, "Hello, writer\n")
//-->Stringers
p1 := Person{"xjliao", 25}
p2 := Person{"lllou", 25}
fmt.Println(p1, p2)
// 错误
if err := run(); err != nil {
fmt.Println(err)
}
// Readers
r := strings.NewReader("Hello, Reader!")
br := make([]byte, 8)
for {
n, err := r.Read(br)
fmt.Printf("n = %v err = %v br=%v\n", n, err, br)
fmt.Printf("br[:n] = %q\n", br[:n])
if err == io.EOF {
break
}
}
//--> 图片
m := image.NewRGBA(image.Rect(0, 0, 100, 100))
fmt.Println("m.Bounds=", m.Bounds())
fmt.Println(m.At(0, 0).RGBA)
//--> Web服务器
var h Hello
err := http.ListenAndServe("localhost:4000", h)
if err != nil {
log.Fatal(err)
}
}

Golang 快速入门 slice array map 函数闭包

Golang 快速入门 slice array map 函数闭包

内容来自https://tour.golang.org/

格式说明:

// 正常注释
//——-依赖关系
//—>关联关系

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
package main
import (
"fmt"
"math"
)
// 结构体
type Vertex struct {
X int
Y int
}
// 字面结构体
var (
v1 = Vertex{1, 2}
v2 = Vertex{X: 1}
v3 = Vertex{}
p = &Vertex{1, 2}
)
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
// map
type Location struct {
Lat, Long float64
}
var m map[string]Location
// 字面map
var mi = map[string]Location{
"Bell Labs": {34.34499, -89.09492},
"Google": {34.34123, -123.34321},
}
// 字面map(续)
// 如果顶级的类型只有类型名的话,可以在文法的元素中省略键名。
// 这里的类型名是指Location
var mj = map[string]Location{
"Bell Labs": {34.34499, -89.09494},
"Google": {34.34123, -123.34321},
}
func main() {
//指针
i, j := 42, 8000
p := &i
fmt.Println(p)
*p = 21
fmt.Println(i)
fmt.Println(p)
fmt.Println(&i)
p = &j
*p = *p / 2
fmt.Println(j)
//-->结构体
fmt.Println(Vertex{1, 2})
// 结构体字段
v := Vertex{3, 4}
v.X = 5
fmt.Println(v.X)
// 结构体指针
q := &v
q.X = 1000
fmt.Println(v)
//-->字面结构体
fmt.Println(v1, p, v2, v3)
// 数组
var a [2]string
a[0] = "Hello"
a[1] = "World"
fmt.Println(a[0], a[1])
fmt.Println(a)
// 片
s := []int{2, 3, 5, 7, 11, 13}
fmt.Println("s==", s)
for i := 0; i < len(s); i++ {
fmt.Printf("s[%d] == %d\n", i, s[i])
}
// 对slice切片
// 从下标1开始到4,但不包含4 fmt.Println("s[1:4] ==", s[1:4])
// 省略下标从0开始到3,但不包含3
fmt.Println("s[:3] ==", s[:3])
// 省略上标 len(s)结束
fmt.Println("s[4:] ==", s[4:])
// 构造切片
a1 := make([]int, 5)
printSlice("a1", a1)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[:2]
printSlice("c", c)
d := c[2:5]
printSlice("d", d)
// nil slice, slice 的零值是nil
// 一个 nil 的 slice 的长度和容量是 0。
var z []int
fmt.Println(z, len(z), cap(z))
if z == nil {
fmt.Println("nil!")
}
// 像slice添加元素
z = append(z, 0)
printSlice("z", z)
z = append(z, 1)
printSlice("z", z)
z = append(z, 2, 3, 4)
printSlice("z", z)
// range 范围
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
// range 范围续
pow1 := make([]int, 10)
for i := range pow1 {
pow1[i] = 1 << uint(i)
}
// 如果不适用_, 则value默认是rang的index值
for _, vlaue := range pow1 {
fmt.Printf("value=%d\n", vlaue)
}
//-->map
m = make(map[string]Location)
m["Bell Labs"] = Location{
40.99922, -73.94391,
}
fmt.Println(m["Bell Labs"])
//-->字面map
fmt.Println(mi)
//-->字面map(续)
fmt.Println(mj)
// 修改map
mk := make(map[string]Location)
mk["liaoxinjian"] = Location{120.00, -110.00}
mk["loulihua"] = Location{120.00, -110.00}
fmt.Println("mk=", mk)
// 删除
delete(mk, "loulihua")
fmt.Println("loulihua.location", mk["loulihua"])
// 通过双赋值检测某个键存在
v1, ok := m["loulihua"]
fmt.Println("value=", v1, " Present?", ok)
// 函数值
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(3, 4))
//-->函数的闭包
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}
// 函数的闭包
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x)
}

Golang 快速入门 流程控制语句

Golang 快速入门 流程控制语句

内容来自https://tour.golang.org/

格式说明:

// 正常注释
//——-依赖关系
//—>关联关系

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package main
import (
"fmt"
"math"
"runtime"
"time"
)
func sqrt(x float64) string {
// if
if x < 0 {
return sqrt(-x) + "i"
} else {
fmt.Printf("x < 0")
}
return fmt.Sprint(math.Sqrt(x))
}
// if 便捷语句
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
}
return lim
}
func main() {
// for
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
// for 续
sumb := 1
for sumb < 1000 {
sumb += sumb
}
fmt.Println(sumb)
// while 用for表示, 所以没有while了
sumc := 1
for sumc < 1000 {
sumc += sumc
}
fmt.Println(sumc)
// 无限循环 这里先注释掉, 要不然后面无法执行
//for {
//
//}
//-->if else
fmt.Println(sqrt(2))
//-->if 便捷语句
fmt.Println(pow(3, 2, 10))
// switch 当符合
// fallthrough 这个关键字的作用和java的switch 不加break的
// 执行顺序有上而下,匹配成功停止
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "linux":
fmt.Println("Linux.")
case "darwin":
fmt.Println("OS X")
// 当进入这里时,使用fallthrough,还会执行defluat
fallthrough
default:
// freebsd, openbsd,
fmt.Println("%s", os)
}
// 没有条件的switch
// 和 switch true {
//case:
//default:
//}
// 一样
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning.")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
// defer 延迟函数的执行直到上层函数返回
// 延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用
defer World()
fmt.Println("hello")
// defer 栈
fmt.Println("counting.....")
for i := 0; i < 100; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}
func World() {
fmt.Println("world")
}

Golang 快速入门 基础 包 变量 函数

Golang 快速入门 基础 包 变量 函数

内容来自https://tour.golang.org/

格式说明:

// 正常注释
//——-依赖关系
//—>关联关系

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// 包
package main
// 导入方式1
import "fmt"
// 导入方式2
import (
"math"
"math/cmplx"
)
// 多值返回
func swap(lastname string, firstname string) (string, string) {
return firstname, lastname
}
// 命名返回值
func split(sum int) (x, y, sm int) {
sm = sum
x = sum * 4 / 9
y = sum - x
return
}
// 变量
var c, python, java bool
var x int
// 初始化变量
var v, u int = 2, 1
// 变量组
var (
// Go 基本数据类型
// bool, string, int, int8, int16, int32, int64,
// uint, uint8, uint16, uint32, uint64, uintptr,
// byte(unit8的别名), rune(int32的别名,代表一个Unicode码)
// float32, float64
ToBe bool = false
MaxInt uint64 = 1<<64 - 1
z complex128 = cmplx.Sqrt(-5 + 12i)
)
// 常量(常量不能使用 := 语法定义)
const Pi = 3.14
//-----
//数值常量(数值常量是高精度的值)
const (
Big = 1 << 100
Small = Big >> 99
)
func needInt(x int) int {
return x*10 + 1
}
func needFloat(x float64) float64 {
return x * 0.1
}
//-----
func main() {
//-->多值返回&命名返回值
lastname, firstname := swap("jian", "liaoxin")
fmt.Println(lastname, firstname)
fmt.Println(split(100))
//-->变量
var i int
var y int
fmt.Println(i, c, python, java, x, y)
fmt.Println(v, u)
// 短声明变量,只能在函数内使用,函数外的必须以关键字var, func 等等开头
k := 100
fmt.Println(k)
//-->Go基本数据类型
fmt.Println(ToBe, MaxInt, z)
//零值
var q int
var f float64
var w bool
var s string
fmt.Printf("%v %v %v %q\n", q, f, w, s)
// 类型转换
var x, g int = 3, 4
var r float64 = math.Sqrt(float64(x*x + g*g))
var z int = int(r)
fmt.Println(x, g, z)
// 类型推导
v := 42
fmt.Printf("v的类型是%T\n", v)
//-->常量
const World = "世界"
fmt.Println("你好", World)
fmt.Println("原周率Pi=", Pi)
const Truth = true
fmt.Println("Go rules?", Truth)
//-->数值常量
fmt.Println(needInt(Small))
fmt.Println(needFloat(Small))
fmt.Println(needFloat(Big))
}

python 替换指定文件夹内所有文件的指定内容

code

a.py
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
import os
import os.path
old_str = "old_str"
new_str = "new_str"
inws = "/Users/xjliao/Desktop/tmep"
def is_md(f):
hz_list = ['.md']
test_str = f.lower()
for hz in hz_list:
if test_str.endswith(hz):
return(True)
return(False)
def main():
for wroot, wdirs, wfiles in os.walk(inws):
for wfile in wfiles:
infile = os.path.join(wroot, wfile)
if is_md(infile) == False:
continue
cnts=file(infile).read()
if old_str in cnts:
outfile = infile
fo = open(outfile, 'w')
cnts_new = cnts.replace(old_str, new_str)
fo.write(cnts_new)
fo.close()
print(wfile)
else:
pass
if __name__ == '__main__':
main()

Golang

参考资料:

Golang 官网
英文 中文
Learning Go
Network programming with Go
Go by Example
Programming in Go
国内社区
golanghome.com
golangtc.com
视频教程
http://study.163.com/course/courseMain.htm?courseId=306002

1
import "fmt"

Mac vim7.3 update to vim7.4

转自:Mac中安装Vim7.4

Mac上的Vim

Mac本身其实是预装了Vim的,但是目前的系统中都是Vim7.3版本的,而最新的Vim已经是7.4版了,因此为了能够使用最新版的vim,必须要对Mac中的vim要么升级,要么重装。在折腾过程中,遇到了一些问题,这里记录,以鉴后人。

可选方案

升级原生的Vim7.3

这种方法貌似是最”干净”的,不会引入其他任何多余的东西,对于有洁癖的人这应该是一种比较好的方案。但是,这个方案也有缺点,那就是它会覆盖原生的Vim,会改变系统的默认设置,并且一旦升级过程中出现了问题,那你就再也没有可用的vim了。另外一个问题是,以后当你系统升级的时候,很有可能你自己的vim又会被新系统的vim给覆盖,这样会比较麻烦。

使用MacVim

这是一种比较好的方案,Vim官网上也是推荐使用这种方案的,MacVim是针对Mac系统特别定制的Vim版本,安装过程也很简单,网上一搜一大把。它功能上和vim完全一致,不会有任何的问题。要说这种方案其实已经算是一个完美的解决方案了,但是它有一点不太方便的地方,那就是不能直接在终端中使用vim,每次使用MacVim的时候都会单独开启一个窗口,有点类似于windows中的gvim。而我个人是比较习惯在终端中写代码的,因此这个方案还是不能满足我的需求。

自己编译

这是一种终极的方案,但是自己编译的时候注意要手动更改默认的安装目录,不然它就会覆盖原生的vim7.3,这样就会变成第一种方案了。将vim7.4安装在其他目录,然后在.bash_profile中添加一个vim命令的别名,将其指向新安装的vim7.4的目录,而不是原生的vim7.3目录。这个方案就能在终端中直接使用vim7.4了,并且不会对原生的vim7.3又任何影响。这个方案唯一的缺点大概就是会在系统中产生两个不同版本的vim了,这也许对一些有洁癖的人是难以接受的。

我自己最终选择了第三套方案,也就是自己编译新版本的vim.

重新编译

好了,现在让我们开始折腾吧。

首先上vim的官网下载vim7.4的源文件,地址是:http://www.vim.org/sources.php

新建目录/opt/loacl,这个目录就是用来存放我们新安装的vim7.4的,你也可以建立其他的目录,这里只是一个示例。

进入vim的源文件目录中,在终端中运行命令:

1
./configure --with-features=huge --enable-pythoninterp=yes --enable-cscope --enable-fontset --enable-perlinterp --enable-rubyinterp --with-python-config-dir=/usr/lib/python2.6/config --prefix=/opt/local

这个命令是完成对vim的一些配置选项,启用了python和ruby的支持特性,这还是比较重要的,因为vim中有些插件会使用python和ruby的,如果没有开启这些特性,有些插件是无法运行的。在这些配置命令中,最后一个—prefix=/opt/local是用来指明安装目录的,你也可以修改成你自己的目录。

在写配置命令的时候,需要注意的是,不能写上—enable-gui,这是开启gui特性的,但是我们是在终端环境下安装的,因此不能开启这个特性,否则会出现编译错误。

在终端中执行make命令.在make过程中,会出现一个错误,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
:info:build os_unix.c:830:46: warning: declaration of 'struct sigaltstack' will not be visible outside of this function [-Wvisibility]
:info:build extern int sigaltstack __ARGS((const struct sigaltstack *ss, struct sigaltstack *oss));
:info:build ^
:info:build ./os_unix.h:88:21: note: expanded from macro '__ARGS'
:info:build # define __ARGS(x) x
:info:build ^
:info:build os_unix.c:830:13: error: conflicting types for 'sigaltstack'
:info:build extern int sigaltstack __ARGS((const struct sigaltstack *ss, struct sigaltstack *oss));
:info:build ^
:info:build /usr/include/signal.h:89:5: note: previous declaration is here
:info:build int sigaltstack(const stack_t * __restrict, stack_t * __restrict) __DARWIN_ALIAS(sigaltstack);
:info:build ^
:info:build 1 warning and 1 error generated.
:info:build make[1]: *** [objects/os_unix.o] Error 1
:info:build make[1]: *** Waiting for unfinished jobs….)

解决方案也很简单,只需要在os_unix.h中加上#include 就可以了。

执行make install.执行完成之后,vim7.4就安装完成了。

添加vim命令的别名,在.bash_profile中添加一行alias vim=’/opt/local/bin/vim’,然后在终端中执行source ~/.bash_profile

好了,现在你的Mac系统已经安装好了vim7.4了,现在可以开始愉快的工作了。

Cordova 初步脚手架

官方教程

http://cordova.apache.org/docs/en/4.0.0/guide_platforms_ios_webview.md.html#iOS%20WebViews

Cordova debugging

Cordova debugging

Debugging your Application

With the desktop browser, you can leverage the browser’s debugging tools. In a WebKit browser, you can open WebInspector to inspect the DOM and debug JavaScript. Most other browsers have an equivalent debugging tool.

Additional Tools

PhoneGap Emulator uses Ripple to emulate the PhoneGap API.
Ripple Emulator emulates the PhoneGap API.
ScreenQueri.es to preview exact device screen sizes.
thumbs.js is a TouchEvent polyfill.
PhoneGap Desktop is a mocking library for the PhoneGap API.

Remote Web Inspector

After you’ve developed the first stage of your application with your desktop browser, you will want to test it on a mobile device. The main hurdle with testing on a mobile device is that you will not have access to WebInspector. This is where a remote web inspector steps in.

Safari Remote Debugging

If you are doing iOS PhoneGap debugging and have the Safari Develop Menu enabled, you can access the currently active session through the built-in Safari Web Inspector. To activate, go to Develop -> (iPad || iPhone) Simulator (normally, the third menu item) and click the active session you want to connect to. Voila!

Chrome Remote Debugging

If you are doing Android PhoneGap debugging and have an Android 4.4 device and Chrome 30+, you can use the new WebView Debugging tools added in Android 4.4. If you are using Cordova 3.3 or higher, this is already supported, and only requires the Debuggable flag in your AndroidManifest.xml. For Cordova 3.2, you will need to enable WebView debugging using some code, or by use of a plugin.

GapDebug

A complete iOS and Android debugging experience for PhoneGap and Cordova apps, debug on both Windows and Mac platforms. Automated plug-and-go debugging with no requirement to build debug support into your app. GapDebug integrated versions of the Safari Webkit Inspector for iOS debugging and Chrome Dev Tools for Android debugging. GapDebug is maintained by Genuitec and is a always free tool.

Try GapDebug here.

Weinre

Weinre is a remote WebInspector that will debug any browser remotely. It is not quite a full-fledged debugger, but gives you a live view of the DOM and access to the JavaScript lang:bash. Unfortunately, no breakpoints or stack traces are available, but the JavaScript lang:bash can lend clues about errors.

You can run Weinre locally or use debug.phonegap.com.

WebKit’s Remote Web Inspector

WebKit has the ability to connect it’s WebInspector to remote WebKit browsers, although few mobile platform support this feature.

BlackBerry supports Remote Web Inspector
iOS has unofficial support for Remote Web Inspector
jsHybugger

jsHybugger is a (commercially available) tool that lets you debug PhoneGap apps on Android using Chrome DevTools. A plugin for PhoneGap 3.x and library for PhoneGap 2.x is available. Install jsHybugger from GitHub with the following command. This adds the plugin to your PhoneGap 3.x application.

phonegap local plugin add https://github.com/jsHybugger/cordova-plugin-jshybugger.git
After installing and starting the app on the device, you can use Chrome DevTools on a desktop machine to debug the app.

Example workflow

phonegap create
cd
phonegap local plugin add https://github.com/jsHybugger/cordova-plugin-jshybugger.git
phonegap build android
phonegap run android —device
See the jsHybugger home page for details.

Additional Debugging Resources

JSBin

Log Messages

When all else fails, you can always use lang:bash.log(‘…’); or alert(‘…’); to mobile web application. I know it’s not pretty, but it can help when you’re in a jam.

Advanced log message handling can be found on Exception Log Handling.

Android

On Android, all lang:bash.log(‘…’); messages will appear as printouts in the command-line tool logcat, which is bundled with the Android SDK and integrated into the Android Eclipse plugin.

BlackBerry

On BlackBerry, all lang:bash.log(‘…’); are printed to the BlackBerry’s Event Log. The Event Log can be accessed by pressing ALT + LGLG.

iOS

On iOS, all lang:bash.log(‘…’); are output to the Xcode Debug Area lang:bash.

Enable the Safari debug menu Web Browsers

Enable the Safari debug menu Web Browsers

While I look around Safari binary code, I found there is a hidden Debug menu. Type the following command in Terminal (while Safari is NOT running):
% defaults write com.apple.Safari IncludeDebugMenu 1
Then launch Safari, and enjoy the new Debug menu.

[Editor’s note: The debug menu has some useful options on it, so you may find this a very useful hack. If you ever wish to disable it again, just repeat the command with a “0” instead of a “1”.]

玩 Raspberry

官网:http://www.raspberrypi.org/

安装

下载地址:http://www.raspberrypi.org/downloads/
推荐下载RASPBIAN版本
zip文件下载:http://downloads.raspberrypi.org/raspbian_latest
种子下载:http://downloads.raspberrypi.org/

需要一个大一点的内存卡(8G以上最好,分区格式为fat32)
假如你的内存卡电脑已被识别
(在mac上)

查看设备:

1
diskutil list

记住设备号,下面的例子假设查看得到的设备为:disk1

卸载设备

1
diskutil unmountDisk /dev/disk1

刻入镜像

`bash sudo dd bs=4m if=2014-09-09-wheezy-raspbian.img of=/dev/risk1(这里第disk1替换为rdisk1原始设备号,刻录速度会更快)

等一会吧 刻录完成会有提示信息

连接

在这里首页你要得有跟网线连接上路由了,而且路由设置了dhcp

ssh默认开启,这里通过ssh连接上系统.
账号:pi 密码:raspberry

ip查看这里可以通过进入路由器查看dhcp列表,会有一台叫raspberrypi的机器,对应的ip就是了.这样我们就可以连接上了
反正不管你用啥办法,都要搞到ip

eclipse 代码注释模板

导入或手动设置模板:Window->Preference->Java->Code Style->Code Template

已配置好模板codetepmplate

自动注释快捷键:选中类,变量,方法, alt+shift+J

Android Button 按键音

Android Button 按键音

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MainActivity extends Activity {
private SoundPool sp;// 声明一个SoundPool
private int music;// 定义一个整型用load();来设置
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 第一个参数为同时播放数据流的最大个数,第二数据流类型,第三为声音质量
sp = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
//把你的声音素材放到res/raw里,第2个参数即为资源文件,第3个为音乐的优先级
music = sp.load(this, R.raw.dot_audio, 1);
}
// 打点操作, 这个方法名要和xml布局文件<Button>属性android:onClick="dotBtnClick"一样
public void dotBtnClick(View v) {
// 打点声音
sp.play(music, 1, 1, 0, 0, 1);
}
@Override
protected void onStop() {
super.onStop();
}
}

Git 常用命令

git book

http://git-scm.com/book/zh/v1

需求:在服务器上创建一个项目版本库

1
2
3
4
5
6
7
8
9
10
11
12
13
//在服务器上创建一个裸仓库
git init --bare --shared project.git
//初始化本地, 加入版本控制
git init
//添加刚刚创建的服务器地址, 使用的ssh命令, 需要在服务器上创建git账户, 推送需要输入git密码,或者将本地公钥上传到服务器git账户下的~/.ssh/authorized_keys授权文件里面,实现无密码提交
git remote add origin [email protected]:/home/git/project.git
//加入添加/修改文件
git add -A
//本地提交
git commit -m 'init'
//推送到服务器
git push origin master

Mac os 技巧

显示或隐藏文件

1
2
显示:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏:defaults write com.apple.finder AppleShowAllFiles -bool false

禁用或启用自动生成.DS_STORE文件

1
2
禁止.DS_store生成:defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE
恢复.DS_store生成:defaults delete com.apple.desktopservices DSDontWriteNetworkStores

Android toast 不显示

问题很简单Toast.show()不显示toast,一开始以为是UI线程问题后来检查了发现在oncreate方法里调用也不弹出toast,但其他项目能正常显示很纠结。各种方法找尽了最后定位为手机问题。后来在网友的提醒发现原来是设置里面显示通知关闭了,开启后一切正常。设置见下图

toast_no_show.png

参考资料:http://blog.sina.com.cn/s/blog_783ede030101hj4r.html

ssh连接闲置超时,被踢出, 解决方案

方案一:在客户端设置

在客户端电脑上编辑(需要root权限)/etc/ssh/ ssh_config,并添加如下一行:

1
ServerAliveInterval 60

此后该系统里的用户连接SSH时,每60秒会发一个KeepAlive请求,避免被踢。

方案二:在服务器端设置

如果有相应的权限,也可以在服务器端设置,即编辑/etc/ssh/ sshd_config,并添加:

1
2
ClientAliveInterval 300
ClientAliveCountMax 3

按以上的配置的含义就是 SSH每5分钟秒向客户端发送一次心跳 ,连续发送3次没有收到客户端道应答,则断开客户端。系统默认是ClientAliveInterval为15,ClientAliveCountMax 为3,所以SSH会在45秒之后断开。
保存设置并重载配置文件
1
sudo /etc/init.d/sshd restart

vpn 国内外智能分流

chnroutes

利用来自APNIC的数据生成路由命令脚本,让VPN客户端在连接时自动执行。通过这些路由脚本,可以让用户在使用VPN作为默认网关时,不使用VPN访问中国国内IP,从而减轻VPN负担,并提高访问国内网站的速度。

基本约定

在使用这些脚本之前,请确保你在自己的电脑上已经成功配置好一个VPN(PPTP或OpenVPN),并且让之以默认网关的方式运行(通常是默认配置),即VPN连接之后所有网络流量都通过VPN。

注意事项

  • 因为这些IP数据不是固定不变的,建议每隔一个月更新一次;
  • 使用此法之后,可能导致Google Music等服务无法访问,因为连上VPN之后,使用的DNS也是国外的,因此google.cn解析出的是国外的IP。

OpenVPN

如安装有iproute2软件包,请尽量使用此方式。自带方式在路由表条目较多时执行极慢。

iproute2

  1. 执行python chnroutes.py,这将生成vpn-up.shvpn-down.sh两个文件;
  2. 将这两个文件移入/etc/openvpn/
  3. 在OpenVPN配置文件中加入:

    1
    2
    3
    script-security 2
    up vpn-up.sh
    down vpn-down.sh
  4. 重新连接VPN,观察日志测试。

自带方式

  1. 执行python chnroutes.py -p old, 这将生成routes.txt文本文件;
  2. 将该文件内容加在OpenVPN配置文件的尾部;
  3. 重新连接VPN,观察日志测试。

PPTP

Mac OS X

  1. 在终端中执行python chnroutes.py -p mac,这将生成ip-upip-down两个文件;
  2. 将这两个文件移入/etc/ppp/
  3. 重新连接VPN,观察测试。

Linux

  1. 执行python chnroutes.py -p linux,这将生成ip-pre-upip-down两个文件;
  2. ip-pre-up移入/etc/ppp/ip-down移入/etc/ppp/ip-down.d/
  3. 重新连接VPN,观察测试。

Windows

  1. 在命令提示符中执行python chnroutes.py -p win,这将生成vpnup.batvpndown.bat两个文件;
  2. 在拨号前手动执行vpnup.bat文件设置路由表;在断开VPN后,可运行vpndown.bat清理路由表。

基于Linux的第三方系统的路由器

一些基于Linux系统的第三方路由器系统如OpenWRT、DD-WRT、Tomato都带有VPN(PPTP/OpenVPN)客户端的,也就是说,我们只需要在路由器进行VPN拨号,并利用本项目提供的路由表脚本就可以把VPN针对性翻墙扩展到整个局域网。当然,使用这个方式也是会带来副作用,即局域网的任何机器都不适合使用Emule或者BT等P2P下载软件。但对于那些不使用P2P,希望在路由器上设置针对性翻墙的用户,这方法十分有用,因为只需要一个VPN帐号,局域网内的所有机器,包括使用Wi-Fi的手机都能自动翻墙。详细配置方式请参考Autoddvpn项目。

信息反馈

本项目的脚本都是在使用路由器进行拨号的情况下测试通过的,如果在其它拨号方式下,脚本不能运作,请添加新的Issue。另外,在配合OpenVPN使用的时候,可能会出现因为网络质量不好,OpenVPN非主动断开,这时候vpn-down.sh脚本也会被自动调用,但重新连上之后,可能会找不到默认路由而添加失败,这时候你可以通过停止OpenVPN,并手动设置好原来的默认路由再重新进行OpenVPN拨号。

参考github开源项目:https://github.com/jimmyxu/chnroutes

No resource found that matches the given name [email protected]/Theme.AppCompat.Light'

what are the steps for that? where is AppCompat located?
To download

http://developer.android.com/tools/support-library/setup.html

If use eclipse

Goto windows android sdk manager. Under extras check Android Support Library and click install.
vghlq.png
enter image description here

After that the AppCompat Can be found at

android-sdk/extras/android/support/v7/appcompat
You need to reference this AppCompat in your android project.

Import the library to eclipse.

Right click on your android project. Goto Properties. goto andorid. Click Add Library and reference the same.

Clean and Rebuild your project

解决方案:
http://stackoverflow.com/questions/21059612/no-resource-found-that-matches-the-given-name-style-theme-appcompat-light

linux 命令行下载jdk

1
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.rpm"

……jdk/7u71-b14/jdk-7u71-linux-x64.rpm这段地址需要根据自己的版本设置

Android中 ImageView 顶部,底部出现一段空白区间, 不填充

1、在XML文件中设置:

android:adjustViewBounds="true"  

2、在Java代码中进行设置:

mImageView.setAdjustViewBounds(true);

The Import android.support.v7 cannot be resolved

I tried the answer described here but it doesn´t worked for me. I have the last Android SDK tools ver. 23.0.2 and Android SDK Platform-tools ver. 20

The support library android-support-v4.jar cause this conflict, just delete the library under /libs folder of your project, don´t be scared, the library is already contained in the library appcompat_v7, clean and build your project, and your project will work like a charm!

详见资料:
http://stackoverflow.com/questions/24998368/the-import-android-support-v7-cannot-be-resolved