轩辕十四

探索科技与创新的个人博客

Swift 中可选值的定义如下

1
2
3
4
enum Optional<Wrapped> {
case none
case some(wrapped)
}

因为 Optional 是枚举类型,所以有的时候可以用模式匹配来进行一些巧妙的操作:

  • 使用 if case 来进行模式匹配,对非 nil 的值做 for 循环
1
2
3
4
5
let ary = [1, 2, nil, 4, nil, 44]
for case let i? in ary {
print(i)
}
// 1, 2, 4, 44
阅读全文 »

序列(Sequence)


Sequence定义:

1
2
3
4
protocol Sequence {
associatedtype Iterator: IteratorProtocol
func makeIterator() -> Iterator
}

要实现一个Sequence,首先需要提供一个返回迭代器(iterator)makeIterator() 方法。
对于迭代器,它是一个满足 IteratorProtocol 协议的类型。

IteratorProtocol协议的定义:

1
2
3
4
protocol IteratorProtocol {
associatedtype Element
mutating func next() -> Element?
}
阅读全文 »

数组和可变性


在Swift中,数组是值类型。并且Swift中,Swift标准库中的所有集合类型都使用了“写时复制”这一技术,避免了大量副本导致性能下降。值类型的好处,不仅是性能有提高,其次就是能保证数组的不可变。

在Objective-C中,声明一个不可变的数组 NSArray 并不能保证数组的不可变。例如:

1
2
3
4
5
6
let mutableAry = NSMutableArray(array: [1, 2, 3])
/// 我们不想让 ary 被改变,声明为不可变数组
let ary: NSArray = mutableAry
/// 但是事实上它依然能够被 a 影响并改变
mutableAry.add(5)
ary // [1, 2, 3, 5]

正确的做法是,在赋值的时候,先进行拷贝:

1
2
3
4
5
let nsAry = mutableAry.copy() as! NSArray
mutableAry.add(10)

mutableAry // [1, 2, 3, 5, 10]
nsAry // [1, 2, 3, 5]
阅读全文 »

之前我一直以为,Swift是一门弱类型的语言。

判断依据:

Swift 变量不强制的指定类型,而是用 varlet 表示可变与不可变。所以,Swift是一门弱类型的语言。

但是,看了一下强弱类型的时候,才恍然大悟。其实 varlet 的特性,只是说明Swift是一门动态类型的语言。并不能指出是否是强或弱类型。

一些定义:

  • 静态类型语言:是一种编译器无法自动检测类型的语言。
  • 动态类型语言:是一种编译器能够自动检测类型的语言。
  • 强类型语言:强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。
  • 弱类型语言:弱类型语言也称为弱类型定义语言。与强类型定义相反。像vb,php,js等就属于弱类型语言。
阅读全文 »

如果你发现连不上你的 VPS了,那么有一种可能就是端口被封,我们需要改一下 VPS 端口了。

登陆服务器

如何登陆 VPS 可以参考这篇文章: SSH 免密登陆 VPS

修改 VPS 的 SSH 端口

VPS 的端口配置在文件 sshd_config 中,我们直接用如下的命令打开文件:

1
vi /etc/ssh/sshd_config

在文章的末尾你能看到 Port 字段,一般默认是 22,随意修改一个数字,建议 1000 以下。然后保存退出。重启 VPS 即可。

登陆电信光猫

打开浏览器,输入 http://192.168.1.1 ,进入光猫管理页面,用 useradmin 账户登陆。将地址栏中的连接 http://192.168.1.1/cgi-bin/content.asp 改为 http://192.168.1.1/cgi-bin/telnet.asp 。出来如下的界面:

启用 Telnet ,点击确定。

终端获取超级密码

打开 Mac 终端,输入命令

1
2
3
4
5
6
telnet 192.168.1.1

# 用户名 admin
# 密码 1234

cat /tmp/ctromfile.cfg

按住 control + s 键,保存终端内容到文件。

文件中搜索 telecomadmin ,就能看到超级密码了。

file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

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

file.close()
# 关闭文件。关闭后文件不能再进行读写操作。

file.flush()
# 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

file.fileno()
# 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

file.isatty()
# 如果文件连接到一个终端设备返回 True,否则返回 False。

file.next()
# 返回文件下一行。

file.read([size])
# 从文件读取指定的字节数,如果未给定或为负则读取所有。

file.readline([size])
# 读取整行,包括 "\n" 字符。

file.readlines([sizehint])
# 读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。

file.seek(offset[, whence])
# 设置文件当前位置

file.tell()
# 返回文件当前位置。

file.truncate([size])
# 截取文件,截取的字节通过size指定,默认为当前文件位置。

file.write(str)
# 将字符串写入文件,没有返回值。

file.writelines(sequence)
# 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py 用于标识当前文件夹是一个包。
考虑一个在 package_runoob 目录下的 runoob1.pyrunoob2.py__init__.py 文件,test.py 为测试调用包的代码,目录结构如下:

1
2
3
4
5
test.py
package_runoob
|-- __init__.py
|-- runoob1.py
|-- runoob2.py

package_runoob/runoob1.py

1
2
3
4
5
#!/usr/bin/python
# -*- coding: UTF-8 -*-

def runoob1():
print "I'm in runoob1"
阅读全文 »

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。

import 语句

模块的引入

模块定义好后,我们可以使用 import 语句来引入模块,语法如下:

1
import module1[, module2[,... moduleN]

比如要引用模块 math,就可以在文件最开始的地方用 import math 来引入。在调用 math 模块中的函数时,必须这样引用:

1
模块名.函数名
阅读全文 »

我们在进行 SSH 登陆的时候,每次都需要输入密码,就感到十分的不方便,这里可以利用 SSH Key(ssh公钥) 来验证登录,从而实现免密登陆。

通过命令生成 SSH Key

生成 SSH Key 我们需要 ssh-keygen 命令

1
2
3
4
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"  

# Generating public/private rsa key pair...
# 三次回车即可生成 ssh key

查看生成的 SSH Key

1
2
cat ~/.ssh/id_rsa.pub
# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....
阅读全文 »
0%