0%

for 循环及指定范围语法

1
2
3
4
5
6
7
167> for i in 0...5 { print (i) }
0
1
2
3
4
5

游乐场

对于REPL,测试简单的代码是绰绰有余的,但是对于比较复杂一点的就需要使用Xcode的新特性游乐场了playground。

数组

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

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