0%

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
93> let color = ["red","orange","yellow","green"]
color: [String] = 4 values {
[0] = "red"
[1] = "orange"
[2] = "yellow"
[3] = "green"
}
94> color[0]
$R36: String = "red"
95> color[1]
$R37: String = "orange"
96> color[2]
$R38: String = "yellow"
97> color[3]
$R39: String = "green"

字典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
126> var dict = ["name":"hello", "age":"10", "sex":"Female"]
dict: [String : String] = 3 key/value pairs {
[0] = {
key = "name"
value = "hello"
}
[1] = {
key = "age"
value = "10"
}
[2] = {
key = "sex"
value = "Female"
}
}

数组的数组

1
var array [String : [String]]

创建空数组

1
2
3
4
142> var empty_array : Array<Int> = []
empty_array: [Int] = 0 values
143> var empty_array = [Int]()
empty_array: [Int] = 0 values

创建空字典

1
2
151> var empty_dictionary = Dictionary<String,Double>()
empty_dictionary: [String : Double] = 0 key/value pairs

REPL

执行下面的命令可以进入Swift的交互终端。

1
2
3
4
$ xcrun swift

Welcome to Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42). Type :help for assistance.
1>

然后可以输入:help打印帮助信息,:quit来退出交互环境。

常量 与 变量

1
2
let x = 12 // 常量
var y = 12.3 // 常量

类型

类型 特征
Bool true或者false
Int/Int32/Int64 32/64位整数
Int8/Int16 8/16位整数
UInt/UInt32/UInt64 32/64位正整数
UInt8/UInt16 8/16位正整数
Float/Double 可正可负的浮点数
Character 用双引号括起的单个字符、数字或者其他符号
String 用双括号括起的一系列字符

检查上限和下限

1
2
3
4
5
6
15> Int8.max
$R3: Int8 = 127
16> Int16.max
$R4: Int16 = 32767
17> UInt8.max
$R5: UInt8 = 255

显式地声明类型

1
2
22> var number : Double = 3
number: Double = 3

数值表示

各种进制

1
2
3
4
5
48> let b = 0b110 // 二进制
b: Int = 6
49> let b = 0o11 // 八进制
b: Int = 9
50> let b = 0x11 // 十六进制

大数字表示法

1
2
53> let big = 1_000_000_000
big: Int = 1000000000

轻松显示

1
2
3
4
5
6
7
8
9
10
59> let city = "shanghai"
city: String = "shanghai"
60> let food = "noodle"
food: String = "noodle"
61> let restaurant = "KFC"
restaurant: String = "KFC"
62> let year = 5
year: Int = 5
63> print ("When I visited \(city) \(year) years ago, I went to \(restaurant) and ordered \(food)")
When I visited shanghai 5 years ago, I went to KFC and ordered noodle

使用类型别名

1
2
3
4
5
6
72> typealias EightBits = UInt8
73> var reg : EightBits = 0
reg: EightBits = 0
74> typealias NewBits = UInt8
75> var reg : NewBits = 0
reg: NewBits = 0

元祖

1
2
3
4
5
6
7
8
9
10
11
12
79> let car = (2014,"Mercedes-Benz","S-Class")
car: (Int, String, String) = {
0 = 2014
1 = "Mercedes-Benz"
2 = "S-Class"
}
80> car.0
$R28: Int = 2014
81> car.1
$R29: String = "Mercedes-Benz"
82> car.2
$R30: String = "S-Class"

可选类型

在swift显示的类型说明中,有一个问号,可以表明变量的类型是可选类型。

1
2
3
4
5
6
7
8
83> var s="123"
s: String = "123"
84> Int(s)
$R31: Int? = 123
85> var s="abc"
s: String = "abc"
86> Int(s)
$R32: Int? = nil

MacOSX 如何安装hexo

安装Node.js环境

因为Hexo是基于Node.js环境的,所以我们需要安装Node.js.

下载和安装Node.js

命令行安装

1
2
3
brew install npm
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
nvm install stable

部署且安装Hexo博客

安装Hexo

1
2
3
4
5
6
7
8
9
10
11
12
npm install -g hexo-cli
npm install hexo-generator-index --save
npm install hexo-generator-archive --save
npm install hexo-generator-category --save
npm install hexo-generator-tag --save
npm install hexo-server --save # server独立出来了,需要单独安装
npm install hexo-deployer-git --save
npm install hexo-generator-search --save
npm install hexo-renderer-marked@0.2 --save
npm install hexo-renderer-stylus@0.2 --save
npm install hexo-generator-feed@1 --save
npm install hexo-generator-sitemap@1 --save

这里采用npm方式来部署hexo静态博客。

部署文件夹

这里我们可以先建立一个文件夹,用来安装hexo

1
2
mkdir hexo
cd hexo

初始化Hexo

1
hexo init

生成静态页面

1
hexo generate

本地预览

1
hexo server

此时就可以打开浏览器输入http://localhost:4000来预览了。

网络配置的大拿 ip

Linux ip 命令与 ifconfig 命令类似,但比 ifconfig 命令更加强大,主要用于显示或设置网络设备。

已经在Linux 2.2 加入到了内核。所以ip是加强版的网络配置工具,用来替代ifconfig并强化其他功能。

官方定义为:

ip - show / manipulate routing, devices, policy routing and tunnels

对于这个命令,命令集是相当的多。先说一些基础的,其他就要自己摸索了。

使用方法为:

1
2
3
4
5
6
7
8
9
$ ip [ OPTIONS ] OBJECT { COMMAND | help }

$ ip [ -force ] -batch filename

# OBJECT的取值
# OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token | macsec }

# OPTIONS的取值
# OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -d[etails] | -r[esolve] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link } | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -rc[vbuf] [size] | -t[imestamp] | -ts[hort] | -n[etns] name | -a[ll] | -c[olor] }

COMMAND的值主要取决于OBJECT,可能有所不同,一般可以使用adddeleteshow(或者list),均可以输入help来进行查询。

OBJECT中常用的为:

  • link 网络设备
  • address 设备上的协议地址
  • -s, -stats, -statistics 统计化输出

显示网络设备

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
# 显示网络设备
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

# 显示IP等更多信息
$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.1.123/24 brd 192.168.254.255 scope global noprefixroute eno1
valid_lft forever preferred_lft forever
inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global noprefixroute
valid_lft forever preferred_lft forever
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

命令中的show为默认,也可以直接使用ip link或者ip address,结果一致。

设置IP地址

可以通过ip addr add/del xxx.xxx.xxx.xxx dev interface 来设置或者删除IP地址。

如下设置or删除eth0的IP地址。

1
2
3
4
5
# 设置IP地址
$ ip addr add 192.168.0.1/24 dev eth0

# 删除IP地址
$ ip addr del 192.168.0.1/24 dev eth0

启动关闭网卡

与ifconfig类似,也使用up与down来进行启动和关闭,具体如下:

1
2
3
4
5
# 开启网卡
$ ip link set eth0 up

# 关闭网卡
$ ip link set eth0 down

统计方便阅读

选项-s可以统计一些信息方便我们阅读,如下看看网络的情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
871883256468 251700492 0 0 0 0
TX: bytes packets errors dropped carrier collsns
871883256468 251700492 0 0 0 0
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
64930085920632 50955323447 0 613156 0 472190933
TX: bytes packets errors dropped carrier collsns
17534345850354 17448077191 0 0 0 0
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0

可以看到对输出进行了一些格式化,看起来更直观。

Linux ip命令

Linux ip 命令与 ifconfig 命令类似,但比 ifconfig 命令更加强大,主要用于显示或设置网络设备。

已经在Linux 2.2 加入到了内核。所以ip是加强版的网络配置工具,用来替代ifconfig并强化其他功能。

官方定义为:

ip - show / manipulate routing, devices, policy routing and tunnels

对于这个命令,命令集是相当的多。先说一些基础的,其他就要自己摸索了。

使用方法为:

1
2
3
4
5
6
7
8
9
$ ip [ OPTIONS ] OBJECT { COMMAND | help }

$ ip [ -force ] -batch filename

# OBJECT的取值
# OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token | macsec }

# OPTIONS的取值
# OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -d[etails] | -r[esolve] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link } | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -rc[vbuf] [size] | -t[imestamp] | -ts[hort] | -n[etns] name | -a[ll] | -c[olor] }

COMMAND的值主要取决于OBJECT,可能有所不同,一般可以使用adddeleteshow(或者list),均可以输入help来进行查询。

OBJECT中常用的为:

  • link 网络设备
  • address 设备上的协议地址
  • -s, -stats, -statistics 统计化输出

显示网络设备

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
# 显示网络设备
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

# 显示IP等更多信息
$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.1.123/24 brd 192.168.254.255 scope global noprefixroute eno1
valid_lft forever preferred_lft forever
inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global noprefixroute
valid_lft forever preferred_lft forever
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

命令中的show为默认,也可以直接使用ip link或者ip address,结果一致。

设置IP地址

可以通过ip addr add/del xxx.xxx.xxx.xxx dev interface 来设置或者删除IP地址。

如下设置or删除eth0的IP地址。

1
2
3
4
5
# 设置IP地址
$ ip addr add 192.168.0.1/24 dev eth0

# 删除IP地址
$ ip addr del 192.168.0.1/24 dev eth0

启动关闭网卡

与ifconfig类似,也使用up与down来进行启动和关闭,具体如下:

1
2
3
4
5
# 开启网卡
$ ip link set eth0 up

# 关闭网卡
$ ip link set eth0 down

统计方便阅读

选项-s可以统计一些信息方便我们阅读,如下看看网络的情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
871883256468 251700492 0 0 0 0
TX: bytes packets errors dropped carrier collsns
871883256468 251700492 0 0 0 0
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
64930085920632 50955323447 0 613156 0 472190933
TX: bytes packets errors dropped carrier collsns
17534345850354 17448077191 0 0 0 0
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0

可以看到对输出进行了一些格式化,看起来更直观。

#TODO

OBJECT 取值含义如下:

  • addrlabel:协议地址选择的标签配置
  • route:路由表条目
  • rule:路由策略数据库中的规则

OPTIONS 为常用选项,值可以是以下几种:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
ip link set eth0 promisc on      # 开启网卡的混合模式
ip link set eth0 promisc offi # 关闭网卡的混个模式
ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
ip link set eth0 mtu 1400 # 设置网卡最大传输单元

ip route show # 显示系统路由
ip route add default via 192.168.1.254 # 设置系统默认路由
ip route list # 查看路由信息
ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
ip route add default via 192.168.0.254 dev eth0 # 设置默认网关为192.168.0.254
ip route del 192.168.4.0/24 # 删除192.168.4.0网段的网关
ip route del default # 删除默认路由
ip route delete 192.168.1.0/24 dev eth0 # 删除路由

用 ip 命令显示网络设备的运行状态:

1
2
3
4
5
6
7
[root@localhost ~]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff

显示核心路由表:

1
2
3
4
5
6
7
[root@localhost ~]# ip route list 
112.124.12.0/22 dev eth1 proto kernel scope link src 112.124.15.130
10.160.0.0/20 dev eth0 proto kernel scope link src 10.160.7.81
192.168.0.0/16 via 10.160.15.247 dev eth0
172.16.0.0/12 via 10.160.15.247 dev eth0
10.0.0.0/8 via 10.160.15.247 dev eth0
default via 112.124.15.247 dev eth1

显示邻居表:

1
2
3
[root@localhost ~]# ip neigh list
112.124.15.247 dev eth1 lladdr 00:00:0c:9f:f3:88 REACHABLE
10.160.15.247 dev eth0 lladdr 00:00:0c:9f:f2:c0 STALE

获取主机所有网络接口炫技

1
ip link | grep -E '^[0-9]' | awk -F: '{print $2}'
   -h, -human, -human-readable
          output statistics with human readable values followed by suffix.

   -b, -batch <FILENAME>
          Read commands from provided file or standard input and invoke them.  First failure will cause termination of ip.

   -force Don't terminate ip on errors in batch mode.  If there were any errors during execution of the commands, the application return code will be non zero.




-d, -details
Output more detailed information.

   -l, -loops <COUNT>
          Specify maximum number of loops the 'ip address flush' logic will attempt before giving up. The default is 10.  Zero (0) means loop until all addresses are
          removed.

   -f, -family <FAMILY>
          Specifies the protocol family to use. The protocol family identifier can be one of inet, inet6, bridge, ipx, dnet, mpls or link.  If this option is not present,
          the protocol family is guessed from other arguments. If the rest of the command line does not give enough information to guess the family, ip falls back to the
          default one, usually inet or any.  link is a special family identifier meaning that no networking protocol is involved.


​ -o, -oneline
​ output each record on a single line, replacing line feeds with the ‘' character. This is convenient when you want to count records with wc(1) or to grep(1) the
​ output.

-r, -resolve use the system’s name resolver to print DNS names instead of host addresses.


​ -n, -netns
​ switches ip to the specified network namespace NETNS. Actually it just simplifies executing of:

ip netns exec NETNS ip [ OPTIONS ] OBJECT { COMMAND | help }

              to

              ip -n[etns] NETNS [ OPTIONS ] OBJECT { COMMAND | help }

       -a, -all
              executes specified command over all objects, it depends if command supports this option.

       -c, -color
              Use color output.

       -t, -timestamp
              display current time when using monitor option.

       -ts, -tshort
              Like -timestamp, but use shorter format.

       -rc, -rcvbuf<SIZE>
              Set the netlink socket receive buffer size, defaults to 1MB.

       -iec   print human readable rates in IEC units (e.g. 1Ki = 1024).

IP - COMMAND SYNTAX
   OBJECT

       addrlabel
              - label configuration for protocol address selection.

       l2tp   - tunnel ethernet over IP (L2TPv3).

       maddress
              - multicast address.

       monitor
              - watch for netlink messages.

       mroute - multicast routing cache entry.

       mrule  - rule in multicast routing policy database.

       neighbour
              - manage ARP or NDISC cache entries.

       netns  - manage network namespaces.

       ntable - manage the neighbor cache's operation.


​ route - routing table entry.

rule - rule in routing policy database.

   tcp_metrics/tcpmetrics
          - manage TCP Metrics

   token  - manage tokenized interface identifiers.

   tunnel - tunnel over IP.

   tuntap - manage TUN/TAP devices.

   xfrm   - manage IPSec policies.

   The names of all objects may be written in full or abbreviated form, for example address can be abbreviated as addr or just a.

PyQt5简介

在软件设计过程中,图形用户界面(GUI)特别重要,漂亮、简介的用户界面可以增加软件的使用量,减少对终端不熟悉的人员的学习曲线。

Python作为目前超级火的语言,虽然本身不具备GUI功能,但是其强大的胶水特性,可以通过PyQt、Tkinter、wxPython等来扩展GUI功能。

PyQt是一个用于创建GUI应用程序的跨平台工具包,将Python编程语言和Qt库融合在一起。发挥出强强联合的特点。

而PyQt5是Qt5的python扩展,以前还有PyQt4,不过已经不在更新,不建议使用。

Linux sed

grep和sed替换文件中的字符串

1
sed -i s/"str1"/"str2"/g `grep "str1" -rl --include="*.[ch]" ./`

将当前目录下的所有.c、.h文件中的str1字符串替换为str2字符串。

参数解释:
sed:

  • -i 表示操作的是文件,``括起来的grep命令,表示将grep命令的的结果作为操作文件
    s/“str1”/“str2”/表示查找str1并替换为str2,后面跟g表示一行中有多个str1的时候,都替换,而不是仅替换第一个

grep

  • -r表示查找当前目录以及所有子目录
  • -l表示仅列出符合条件的文件名,传给sed命令做替换操作
  • –include=”*.[ch]” 表示仅查找.c、.h文件

注:如果不需要查找子目录,仅需要在当前目录替换,可直接用sed命令:

1
sed -i s/"str1"/"str2"/g ./*.[ch]

使用sed删除文件前N行

  • 删除首行: sed -i '1d' filename.txt
  • 删除1到100行: sed -i '1,100d' filename.txt
  • 删除尾行: sed -i '$d' filename.txt

使用sed删除文件中包含字符hello的行

sed ‘/hello/d’ filename.txt

sockaddr 与 sockaddr_in

在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:

1
2
3
4
5
typedef unsigned short sa_family_t;
struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
}

在linux环境下,结构体struct sockaddr_in在/usr/include/netinet/in.h中定义,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* Structure describing an Internet socket address. */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */

/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
/* 字符数组sin_zero[8]的存在是为了保证结构体struct sockaddr_in的大小和结构体struct sockaddr的大小相等 */
};

struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。

一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。

下面是struct sockaddr_in中用到两个数据类型,具体定义如下:

1
2
3
4
5
6
7
/* Type to represent a port. */
typedef uint16_t in_port_t;

struct in_addr其实就是32位IP地址
struct in_addr {
unsigned long s_addr;
};

BSD网络软件中包含了两个函数,用来在二进制地址格式和点分十进制字符串格式之间相互转换,但是这两个函数仅仅支持IPv4。

1
2
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);

功能相似的两个函数同时支持IPv4和IPv6

1
2
const char *inet_ntop(int domain, const void *addr, char *str, socklen_t size);
int inet_pton(int domain, const char *str, void *addr);

通常的用法是:

1
2
3
4
5
6
7
8
9
10
11
12
13
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);

my_addr.sin_family = AF_INET; /* 主机字节序 */
my_addr.sin_port = htons(MYPORT); /* short, 网络字节序 */

my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");

bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
//memset(&my_addr.sin_zero, 0, 8);

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

Windows 搜索利器 Everything

MacOSX上好用的工具不少,相信大家对 spotlightalfred 印象很深刻。

今天推荐一款在Windows上使用的软件 Everything,用过MacOSX的童鞋应该都知道Spotlight的绚丽功能,至少这个功能我是一直在使用的,快速的搜索,方便(捉急)的快捷键,把输入法切换给占用了。

这个也是为数不多经常给大家推荐提高工作效率的软件。

Everything应该是为唯一一个民用的Haskell编写的软件,其他都是军用的^_^。

Everything体积小巧,界面简洁易用,快速建立索引,快速搜索,同时占用极低的系统资源,实时跟踪文件变化,并且还可以通过http或ftp形式分享搜索。

在搜索框输入文字,它就会只显示过滤后的文件和目录。Everything搜索只基于文件和文件夹的名称,所以它创建数据库很快。

快到啥程度呢,官方的说明是一个刚安装完的Windows XP SP2系统(约20,000份文件),需要一秒钟。索引一百万份文件则需要一分钟。

我积攒到现在接近600多GB的数据,400多万个文件,第一次索引只用了2分钟,确实快如闪电。

最关键的是,这个软件只有几百KB,只有几百KB,最新版本不倒500KB,你晓得什么概念吧。。。。你估计不晓得什么概念,21世纪初的软盘可以放几份拷贝在上面。

一句话, Everything是速度最快的文件搜索软件,和windows自带搜索功能相比,简直是一个天上一个地下了。当然也可以使用 Total Commander 或其他 ,不过我还是会推荐这款体积小巧、免安装、免费、速度极快(比Locate32更快)的文件搜索工具Everything.

常用的普通搜索就可以了,进阶版的可以使用正则表达式。

搜索技巧

可以通过正则表达式更加高效地使用Everything,比如下面的一些技巧。

比如我希望找到一个2016年访问过的,文件超过1GB大小的视频,该视频包含了family字样,就可以用下面的搜索技巧搜索:

1
video: size:>1GB dateaccessed:2016 family

其他一些比较常用的为:

操作符

  • hello world : 将搜索包含hello 和 world的文件或文件夹
  • hello | world : 将搜索包含hello 或 world的文件或文件夹
  • hello !world : 将搜索包含hello 不包含world 的文件或文件夹

通配符

  • 20??01 :因为?表示一个字符,所以这个表示搜索包含20??01的文件或文件夹,其中20与01之间包含2个字符
  • 20*01:因为*表示匹配0或多个字符,所以搜索的范围比较广

有一些有用的宏,比较方便使用,如下:

  • audio: 搜索音频文件
  • zip: 搜索压缩文件.
  • doc: 搜索文档文件.
  • exe: 搜索可执行文件.
  • pic: 搜索图片文件.
  • video: 搜索视频文件.

修饰符

  • case: 区分大小写.
  • file: 仅匹配文件.
  • folder: 仅匹配文件夹.
  • nocase: 不区分大小写.
  • path: 匹配路径和文件名.
  • regex: 启用正则表达式.
  • wholefilename: 匹配完整文件名.

几个常用函数

  • dateaccessed:<date> 搜索指定访问时间的文件和文件夹.
  • datecreated:<date> 搜索指定创建日期的文件和文件夹.
  • datemodified:<date> 搜索指定修改日期的文件和文件夹.
  • size:<size> 搜索指定大小的文件 (以字节为单位),可以指定为kb,mb和gb

接下来的就是开始下载使用吧。

开发利器之PyCharm

在没有遇到Jetbrains的开发套件之前,其实我是犹豫的,比如我会用着成为利器之神的VIM,然后成为神之利器的Emacs,偶尔在用下号称编码人员最爱的Sublime,直到遇到Jetbrains开发套件,套不犹豫地购买License,开始徜徉在Jetbrains的海洋中,云淡风轻,与世无争。

悄悄告诉你一件事情,其实有些套件是有Community版本的,没有License的限制,但是相应地功能也会少一些,可以先试用,感觉性价比可以了在购买。

为什么呢,因为Jetbrains各个系列都拥有高度一致的开发GUI,集成了VIM,让我效率很高,集成了Git,让我在一个开发环境中可以完成需要切换N个终端才能完成的事情,还有自动代码格式化,代码完成、重构,等等。

待我细细讲来。

先来个预览吧,

screenshot

Pycharm

Pycharm特点

如所有其它 JetBrains 集成开发环境一样,PyCharm 具有智能代码编辑器,能理解 Python 的特性并提供卓越的生产力推进工具:自动代码格式化、代码完成、重构、自动导入和一键代码导航等。这些功能在先进代码分析程序的支持下,使 PyCharm 成为 Python 专业开发人员和刚起步人员使用的有力工具。

这些够了吗,这些还不够,还有:

  • 针对 Django 开发的高级支持,包括智能代码完成、检查、重构和特定代码导航
  • 综合 Python 调试器和图形单元测试工具
  • 支持先进 Python 开发工具链,包括 virtualenv 和 buildout
  • 版本控制系统整合——针对 Mercurial、Git、SVN、Perforce 和 CVS 等大多数版本控制系统的统一用户界面 (UI)
  • Google App Engine 支持,能到 App Engine 服务器上运行和部署用户的应用,同时确保代码满足沙盒环境需求
  • REPL 和 Django 控制台,具备胜过标准控制台的众多优势:运行中语法检查;括号和引号匹配和自动配对;以及代码完成。
  • 还有跨平台,通杀三大主流平台Windows,MacOSX和Linux,当然我觉得MacOSX上吗的体验最好。

Pycharm快捷键

调出快捷键的方法很简单,入下图所示:

shortcut

列出的快捷键如下面所示:

shortcut-all

其实我们用到的快捷键远远没有那么多啦,不过作为一个辣么牛的编辑器,一句话,别人可以不用,但是你不能没有,意思就是:

有没有是你的态度,用不用是我的权利。

这一点标明Jetbrains的态度那是杠杠滴OK。

用到的快捷键就那下面几个,一一说来。

代码基本完成快捷键

这个功能但凡能存活到现在的编辑器,都会具有这个功能,就是看代码完成的效率问题了。

这里有一个比较悲催的事情,就是Jetbrains默认的快捷键总是会跟输入法切换键有冲突,所以这个是我们需要比较注意的,我们需要改变这个快捷键,如何修改参考下面的修改默认快捷键,因为默认的快捷键比较多,可以在搜索区域输入basic即可。不要用你使用最多的键,比如可以改为**Ctrl + ,**,这个目前看来还没有跟其他什么主流软件有冲突,所以培养用户的习惯还是很重要的。

其实这个功能我用的不是特别多,这是为什么呢,因为在你输入的过程中,Jetbrains已经会比较快捷方便地给你提示了。如下所示:

hello

霸气的TAB

如果在Linux里面你还是照旧所有的字符都输入进入,我只能说佩服,还有不屑,因为在节省时间的问题上,为什么不用下Tab键呢?

Jetbrains也有这个很好的传统,有两种情况:

  1. 当你什么也没有输入的时候,Tab默认是4个空格的缩进
  2. 但是当你输入前几个字母的时候,Jetbrains会智能地列出所有的候选项,这时候你只要按下Tab,就会默认选择第一个候选项,这对于双手不离开键盘而言,是很好的提高输入速度,以及保证流畅思考编程的一个小技巧。

Shift+Enter 智能换行

如果鼠标位于class function():的任何一个位置,此时(ˇˍˇ) 想~写下一行代码了,小case,直接Shift+Enter切换到下一行正确的位置写代码即可。

修改默认快捷键

打开Preference,或者快捷栏中看起来像扳手的tool图标,会打开如下所示的界面,在左侧中选择keymap即可。

keymap

PyCharm插件

如何安装插件

同样跟修改快捷键一样,这次要找的是Plugins,顺便力推几个插件。

plugin

VIM插件

效果就是PyCharm的编辑器就是一个VIM开启的终端,各种赞。

顺便提供一个vim的快捷键,供参考。

vim

支持Markdown

写作如果现在你还在用富文本编辑器,估计会被鄙视的,高大上一点,最重要的是有效率一点,那就妥妥滴Markdown吧,会自动解析Markdown的各种标记。

markdown

支持Docker

我下载了一个docker,打开工程的时候,会提示:

docker