Swift 笔记:闭包


Apple-Swift-logo

闭包是自包含的函数代码块,可以在代码中被传递和使用。闭包可以捕获和存储其所在上下文中任意常量和变量的引用,被称为包裹常量和变量。

闭包采取如下三种形式之一:

  • 全局函数是一个有名字但不会捕获任何值的闭包
  • 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
  • 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包

继续阅读 “Swift 笔记:闭包”

Swift 笔记:函数


Apple-Swift-logo

函数是一段完成特定任务的独立代码片段。在 Swift 中,每个函数都有一个由函数的参数值类型和返回值类型组成的类型。函数的定义可以写在其他函数定义中,这样可以在嵌套函数范围内实现功能封装。

函数的定义与调用

定义一个函数时,可以定义一个或多个有名字和类型的值,作为函数的输入,称为参数,也可以定义某种类型的值作为函数执行结束时的输出,称为返回类型。要使用一个函数时,用函数名来“调用”这个函数,并传给它匹配的输入值(称作实参),函数的实参必须与函数参数表里参数的顺序一致。

func sayHello(name: String) -> String {
    return "Hello, " + name + "!"
}
print(sayHello(name: "Ryan"))

继续阅读 “Swift 笔记:函数”

Swift 笔记:控制流


Apple-Swift-logo

Swift提供了多种流程控制结构,包括 for-in 循环、while 循环、if 语句、guard 语句、switch 语句、break 语句、continue 语句等。

For-In 循环

for-in 循环可以遍历一个集合中的所有元素:

let names = ["Anna", "Brain", "Jack", "Ryan"]
for name in names {
    print("Hello, \(name)!")
}

for-in 循环也可通过遍历一个字典来访问它的键值对:

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}

for-in 循环可以使用数字范围:

for index in 1...5 {
    print("\(index) times 5 is \(index*5)")
}

如果不需要区间序列内每一项的值,可以使用下划线(_)替代变量名来忽略这个值。

继续阅读 “Swift 笔记:控制流”

Swift 笔记:集合类型


Apple-Swift-logo

Swift 语言提供数组(Arrays)、集合(Sets)和字典(Dictionaries)三种基本的集合类型来存储数据。数组是有序数据的集,集合是无序无重复数据的集,字典是无序的键值对的集。

CollectionTypes-intro

Arrays、Sets、Dictionaries 中存储的数据值类型必须明确,不能把不正确的数据类型插入其中。如果创建一个集合并分配为变量,那么这个集合将会是可变的;如果分配成变量,那么这个集合就是不可变的,它的大小和内容都不能被改变。 继续阅读 “Swift 笔记:集合类型”

Swift 笔记:字符串与字符


Apple-Swift-logo

字符串(String)是有序的字符(Character)类型的值的集合。Swift 中 String 和 Character 类型提供了快速和兼容 Unicode 的方式供代码使用。

字符串字面量

字符串字面量是由一对双引号包裹着的具有固定顺序的字符集:

let someStr = "Hello, Swift!"
var someStr2:String = "Hello, Swift!"
var someStr3 = String("Hello, Swift!")

多行字符串字面量是由一对三个双引号包裹着的具有固定顺序的文本字符集:

let quotation = """
This is a multiline string.
This is a multiline string, too.
"""

初始化空字符串

要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量:

var emptyStr = ""
var anotherEmptyStr = String()

可以使用 isEmpty 属性来检查字符串是否为空:

if emptyStr.isEmpty {
    print("Nothing to see here")
}

继续阅读 “Swift 笔记:字符串与字符”

Swift 笔记:基础运算符


Apple-Swift-logo

Swift 支持大部分标准 C 语言的运算符,且改进许多特性来减少常规编码错误。Swift 中赋值运算(=)不能返回值,以防止与判断相等运算符(==)混淆。

运算符分为一元、二元和三元运算符。一元运算符对单一对象操作,分前置运算符和后置运算符,运算符与操作对象间不能加空格,必须紧密相连;二元运算符操作两个对象,是中置的;Swift 三元运算符只有一个,即三目运算符 a ? b : c

赋值运算符

赋值运算符(a = b),表示用 b 的值来初始化或更新 a 的值。需要注意的是 Swift 的赋值不返回值,不能做如下的判断:

if a = b {
    // 此句错误, 因为 x = y 并不返回任何值
}

算术运算符

Swift 中所有数值类型都支持基本的四则算术运算和求余运算:

  • 加法(+)
  • 减法(-)
  • 乘法(*)
  • 除法(/)
  • 求余(%)

加法运算符也可用于 String 的拼接。

组合赋值运算符

Swift 也提供把其他运算符和赋值运算(=)组合的组合赋值运算符,组合加运算(+=)是其中一个例子: 继续阅读 “Swift 笔记:基础运算符”

配置生阿里云 LEMP 产环境(二)


alibaba-cloud-logo

配置生产环境

配置网站目录

首先需要在 ECS 实例上创建我们网站的根目录,使用 mkdir -p 命令进行,比如我网站的根目录路径为 /public_html/iiryan.com

mkdir -p /public_html/iiryan.com

完成后,可以目录下新建一个 phpinfo.php 的文件,以方便我们后续测试,文件内容为:

<?php phpinfo(); ?>

配置 Nginx

在 Nginx 的配置目录 /etc/nginx/conf.d 下,新建一个名为 default.conf 的配置文件,文件内容为:

server {
        listen          80;
        server_name     iiiryan.com;
        root            /public_html/iiryan.com;
        index           index index.html index.php;

        location / {
                 try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include fastcgi_params;
        }       
}

上面配置信息中,服务器地址、文件目录可以根据实际情况自己设置。完成后重新加载 Nginx:

systemctl reload nginx

因为,之前已经建了一个 phpinfo.php 的文件,我们可以在浏览器中打开:http://iiiryan.com/phpinfo.php ,如果能够正常打开 PHP 的信息页面,就说明配置成功了。 继续阅读 “配置生阿里云 LEMP 产环境(二)”

配置生阿里云 LEMP 产环境(一)


alibaba-cloud-logo

网站最终需要运行到正式生产环境上,我们需要一台云服务器,比如阿里云 ECS(https://aliyun.com)。搭建正式的生产环境与在本地流程基本一致,除此之外,还需要对服务器作一些安全性设置。

前提

  • 购买阿里云(或其他云服务器)ECS 实例
  • 实例系统为 CentOS 7.3 64位
  • 购买域名(国内节点需要完成备案)
  • 域名解析至服务器

初始化安全设置

购买完成后,可以在阿里云 ECS 实例控制台页面,实例的管理界面,在这个页面中可以看到实例的 ID/名称、所有可用区、IP 地址、配置信息以及一些控制操作(启动、停止、重启、重置密码、远程连接等等)。

本地化语言设置

默认情况下安装的 CentOS 系统语言为英文,为了使用方便可以将系统语言变量改为中文,系统配置文件的路径为 /etc/locale.conf

vi /etc/locale.conf

LANG=en_US.UTF-8 修改为:LANG=zh_CN.UTF-8

完成后重启实例,配置生效。

SSH 连接

我们可以直接使用控制台中的远程连接在浏览器中管理浏览器,但我们最常用的方式还是使用 SSH 工具连接控制,在终端执行:

ssh root@111.222.333.444

完成后会提示输入密码,此处密码为购买实例时设置的 root 账号密码(忘记密码可以控制台页面重置密码)。

输入密码,连接成功后,会返回信息:

Welcome to Alibaba Cloud Elastic Compute Service !

添加新用户并分配 root 权限

root 作为服务器的超级管理员账号,一般不建议作为常用账号,为此我们需要新建一个常用用户,并给这个用户分配 root 权限:

adduser test

完成后,为新用户设置登录密码,执行:

passwd test

按照提示给新用户设置密码后,将用户加入到 wheel 用户组中,这样 ryan 这个用户就可以使用 sudo 命令来获得 root 权限了:

gpasswd -a test wheel

完成后,之后就可以使用新创建的用户登录服务器了。

不过,在执行完上述设置后,会发现每次执行 sudo 命令时,都会提示需要输入密码,如果我们不想每次都输入密码,可以修改 sudo 配置文件:

vi /etc/sudoers

在配置文件中找到代码:

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

%wheel 前面的注释符号 # 删除,之后就执行 sudo 命令就不需要再输入密码了。

使用公钥身份验证:无密码登录

为服务器配置使用公钥进行身份验证,这样登录时就不需要密码了。

在本机使用 ssh-keygen 命令生成一组密钥,如果之前生成过可以查看用户主目录下的 .ssh 目录。

生成密钥后将 id_rsa.pub 文件中的内容复制到服务器用户主目录下的 .ssh/authorized_keys 文件中。

除了手动将公钥添加到服务器公钥文件中,也可以使用一个 ssh-copy-id 的小工具,在本机电脑中可以使用 Homebrew 来安装:

brew install ssh-copy-id

安装完成后,就可以使用 ssh-copy-id 命令来添加公钥到服务器中去了,执行:

ssh-copy-id test@111.222.333.444

根据提示输入密码,完成后就可以使用公钥身份验证登录服务了。

禁止 root 用户远程登录

禁止 root 用户远程登录,可以使我们的服务器更安全一些。为此需要对 SSH 进行一些配置,配置文件的路径为:/etc/ssh/sshd_config

使用 vi 来编辑这个配置文件:

vi /etc/ssh/sshd_config

在文件的最后,找到 PermitRootLogin yes,将其中的 yes 修改为 no

完成后,重新加载 SSH 使配置生效:

sudo systemctl reload sshd

禁止 SSH 使用密码登录服务器

因为我们已经设置了使用公钥进行身份验证,为了更安全一些,可以将 SSH 密码登录禁用。

使用 vi 来编辑 SSH 配置文件:

vi /etc/ssh/sshd_config

在文件的最后,找到 PasswordAuthentication yes,将其中的 yes 修改为 no

完成后,重新加载 SSH 使配置生效。

修改 SSH 服务的端口号

SSH 默认使用的端口为 22,我们可以使用一个不常用的端口来替换默认的端口 22,这样服务器会更安全一些。

使用 vi 来编辑 SSH 配置文件:

vi /etc/ssh/sshd_config

在文件中找到 #Port 22,将前面的注释符号 # 删除,然后将 22 修改为你想要的端口号(0-65536)。

完成后,使用命令 systemctl reload sshd 重新加载 sshd,使配置生效。

这样之后再连接 SSH 时,需要在 IP 地址后面加一个 -p 选项,指定端口号。

P.S. 需要先在实例控制台设置好安全组端口规则。

安全组

阿里云为了用户能更好的提高用户网络控制的灵活度。在操作系统上层提供了安全组功能。安全组类似虚拟防火墙功能,用于设置单个或多个 ECS 实例的网络访问控制,它是重要的安全隔离手段。

完整的安全组用户指南可以参考:https://help.aliyun.com/

常用的协议类型与端口关系:

协议类型 端口范围 应用场景
全部 显示为 -1/-1,表示不限制端口 可用于完全互相信任的应用场景
全部 ICMP 显示为 -1/-1,表示不限制端口 可用于检测实例所处的网络连接状况
自定义 TCP 自定义端口范围,有效的端口值是 1−65536,端口范围的合法格式是 开始端口/结束端口 可用于允许或拒绝一个或几个连续的端口
SSH 显示为 22/22。默认为 22 端口 用于 SSH 远程连接到 SSH 实例
HTTP 显示为 80/80 实例作为网站或 Web 应用的服务器
HTTPS 显示为 443/443 实例作为网站或 Web 应用的服务器,而且需要支持 HTTPS 协议

安装生产环境

正式生产环境的搭建与本地基本上是一样,此处正式生产环境也使用 LEMP 环境。

安装第三方仓库

为服务安装一些必需的包,需要先安装第三方仓库,一般我们使用 ius 和 epel 即可:

sudo yum install https://centos7.iuscommunity.org/ius-release.rpm

ius 的安装链接可以参考:Getting Started – IUS,epel 是 ius 仓库依赖的一个仓库,所以安装 ius 的时候也是 epel 一起安装好了。

安装 Nginx 服务器

执行以下命令,安装 Nginx 服务器:

sudo yum install nginx

启动 Nginx,并设置开机启动:

systemctl start nginx

systemclt enable nginx

安装 MySQL/MariaDB

我们使用 MariaDB(10.1) 代替 MySQL:

yum install mariadb101u mariadb101u-server

安装完成后启动 MariaDB,并且设置开机启动:

service mariadb start
systemctl enable mariadb.service

完成后,使用 mysql_secure_installation 进行安全设置。

安装 PHP-FPM

此处以安装 PHP7.1 为例:

sudo yum install php71u-fpm

完成后,可以继续安装一些常用的 PHP 扩展:

sudo yum install php71u-cli php71u-xml php71u-xmlrpc php71u-gd php71u-mysqlnd php71u-pdo php71u-mcrypt php71u-mbstring php71u-json

安装完成后启动 PHP-FPM,并设置开机启动:

service php-fpm start
systemctl enable php-fpm.service

安装配置 phpMyAdmin


phpmyadmin

为了更好的管理 MySQL/MariaDB 数据库,我们一般需要给服务器安装一个数据库图形管理界面,使用 WEB 页面管理数据库,phpMyAdmin 就是这样一个工具。

如果系统中安装了 epel 仓库,可以直接使用 yum install phpmyadmin 命令安装,不过这样直接安装会提示与之前安装的 php 有依赖冲突,所以建议使用手工安装方法。

安装 phpMyAdmin

官网 上可以找到 phpMyAdmin 的下载链接,使用 curl 命令下载它:

curl -O https://files.phpmyadmin.net/phpMyAdmin/4.7.6/phpMyAdmin-4.7.6-all-languages.zip

使用 unzip 命令解压刚下载的 zip 文件:

unzip phpMyAdmin*.zip

解压完成之后,之前下载的 zip 安装包就可使用 rm -rf phpMyAdmin*.zip 命令删除了。

我们需要将 phpMyAdmin 移动到 nginx 定义的服务根目录下,同时为了安全,可以给它修改成一个常用的名字(我配置有服务器目录为:/vagrant/www/public):

mv phpMyAdmin* /vagrant/www/public/phpMyAdmin

完成后,在浏览器中输入 Nginx 服务器绑定的主机名,加面加 /phpMyAdmin,如果正常的话,就能会看到 phpMyAdmin 的登陆界面了。 继续阅读 “安装配置 phpMyAdmin”

配置安装 WordPress


wordpress-install-config

一般情况下,我们可以在官网(https://wordpress.org)下载好 WordPress 安装包,然后上传到服务器安装,除了这个方法,我们也可以使用 WordPress 命令行工具 WP-CLI 用命令行安装。

配置服务器

首先需要为 WordPress 配置一个主机地址。

在电脑 hosts 文件中添加一条新记录:

192.168.33.10 iiiryan.dev

意思是将 iiiryan.dev 这个主机名指向我们虚拟机的 IP 地址,这样在配置 Nginx 时可以添加一个新的 server

然后我们在 Nginx 服务中配置文件目录中新建一个配置文件:iiiryan.dev.conf,配置内容为:

server {
  listen       80;
  server_name  iiiryan.dev;
  root         /vagrant/www/wordpress;
  index        index.php index.html index.htm;

  location / {
     try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include fastcgi_params;  
  }
}

/vagrant/www/wordpress 是网站的根目录,完成后重新加载 Nginx。

下载 WordPress

进行到上面设置的网站根目录下,执行命令:

wp core download

这个命令后可以使用 --locale--version 选项,指定下载的语言和版本。

创建数据库

如果已经安装了 phpMyAdmin,可以直接使用浏览器访问数据库管理页面,创建数据库,也可以使用命令行创建数据库。

先登录到 MySQL:

mysql -u root -p

登录后创建一个名为 wordpress 的数据库:

create database wordpress;

给数据库设定用户名、密码:

grant all grant all privileges on wordpress.* to 'ryan'@'localhost' identified by 'password';

为了安全,可以使用 openssl 生成一个随机密码。

完成后,退出 MySQL 控制台。

安装 WordPress

现在就可以直接在浏览器中输入我们设置的地址访问网站,并随着系统提示一步一步的进行安装了。

也可以使用 WP-CLI 命令行安装,首先需要设置 WordPress 的配置文件 wp-config.php

wp core config --dbname=wordpress --dbuser=ryan --password --dbhost=localhost --dbprefix=wp_ --locale=zh_CN

如果正常,返回信息:

Success: Generated wp-config.php file.

配置文件设置完成后就可使用 wp core install 命令进行安装了:

wp core install --url=http://iiiryan.dev --title='WordPress' --admin_user=ryan --admin_password=1234 --admin_email=mail@mail.com

成功后,返回信息:

Success: WordPress installed successfully.

如果一切顺利,在浏览器中输入设定的网址:http://iiiryan.dev 就能正常访问了。