swift 03

今天介绍的是元组(tuples),如何去理解?

我们先来考虑这样一个问题,如果在方法中返回2个以上的变量?

第一个想起来的恐怕是->对象

使用对象有问题吗?我们恐怕要define好多没有特殊含义的类,仅仅是为了组合多的数据类型返回。

Swift 和 Python 都为我们提供了语法级别的支持-元组

下面我们来详细了解下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 定义一个元组(声明key和不声明key)
// with key
let registrationResult = (isRegistration:true, nickName: "hackingangle", gender: "man")
// not with key
let connectionResult = (404, "not found")
// 解开没有key的元组
let (connectionStatus, connectionMsg) = connectionResult
connectionStatus
connectionMsg
connectionResult.0
connectionResult.1
// 使用_忽略部分
let (connectionStatus2, _) = connectionResult
connectionStatus2
if connectionStatus == 404 {
print("return status 404")
}

swift 02

选择语句if,真-true,假-false

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let flag = true
let flagB = false
if flag {
print("flag true")
}
let check = 1+1 == 2
if flagB {
print("flag b")
} else if check {
print("1+1=2")
} else {
print("defalut")
}
var val1:Int = 1
// swift中强类型,整型不可以当作Bool类型,异常提示:'Int' is not convertible to 'Bool'
if val1 {
print("check val int as logical")
}

swift 01

任务

目标

成为full stack engineer.

详情

  • swift基础语法

swift基础语法

开始学习一门语言的语法,无外乎从数据类型开始,常见的类型:整型、浮点型、字符串。

从语言本身区分:强类型语言和弱类型语言,强类型语言通常要求我们在使用变量之前去声明变量的类型。

变量本身分为两种:一种能够修改值,一种不能够修改值,能修改的叫变量;不能修改的叫常量

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
//: Playground - noun: a place where people can play
// 声明常量
let maxNum = 1000
// 声明变量
var userName = "hackingangle"
// 声明多个变量
var x = 0.0, y = 0.0, z = 0.0
// 强类型语言,如何来声明类型呢?看下面的演示
var d1, d2, d3 : Double;
// 赋值给一个常量值会报错:Cannot assign to vale:'maxNum' is 'let' constant
// maxNum = 100
// 变量可以被修改值
userName = "root"
// swift是类型安全的,赋值给一个初始化为字符串的变量整型,会报错:Cannot assign value of type 'int' to type 'String'
// userName = 1000
// 整型演示
let decimalInt:Int = 17
let binaryInt:Int = 0b10001
let octalInt:Int = 0o21
let hexadecimalInt:Int = 0x11
// 浮点型
let floatA = 0.012
let floatB = 1.2e-2
// 强制类型转换
let changeFloatA:Float = 1
// 由于丢失了精度,会报错:Cannot convert value of type 'Double' to specified type 'Int'
// let changeIntA:Int = 1.2
// 可以强制类型转化(在开发者明确的情况下丢掉一些精度)
let changeIntB:Int = Int(1.2)
let addA:Int = 3
let addB:Double = 0.1415926
// 由于精度不一样,会有报警:Binary operator '+' cannot be applied to operands of type 'Double' and 'Int'
let sumA:Double = addB + Double(addA)
// 整型
let intA = 1000000
// 更人性化的表示法
let intB = 1000_000
let intC = 10_0000
// 变量可以使用中文,全面支持unicode字符
var 姓名 = "hackingangle"
var 欢迎语 = "您好"
var 一句话 = 欢迎语 + "," + 姓名

IOS开发 oc swift

我做了5年web开发工程师,了解前端和后端(php)的开发环境。

这篇文章表明:笔者正要进入IOS开发的大门,HelloWorld!HelloIOS!

两个语言都要学习啊(object-c 和 swift),比较学习。

php7安装

走入php开发的世界,我们先要下载一个php解析器,尽情的站在巨人的肩膀上吧!

我们假设的开发环境是OSX系统,做php开发有个macbook真的很好用。快来入坑!

废话少说,开始搭建环境吧。准备:

  1. homebrew
  2. php7

homebrew

面向OSX下的包管理工具。

安装

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

使用

  • 已安装列表
    • brew list
  • 搜索
    • brew search XXX
  • 安装
    • brew install XXX
  • 删除
    • brew uninstall XXX

Log::

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
☁ hackingangle.github.io [master] ⚡ brew
Example usage:
brew search [TEXT|/REGEX/]
brew (info|home|options) [FORMULA...]
brew install FORMULA...
brew update
brew upgrade [FORMULA...]
brew uninstall FORMULA...
brew list [FORMULA...]
Troubleshooting:
brew config
brew doctor
brew install -vd FORMULA
Brewing:
brew create [URL [--no-fetch]]
brew edit [FORMULA...]
https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Formula-Cookbook.md
Further help:
man brew
brew help [COMMAND]
brew home

php7

安装php7

1
2
3
4
5
# 搜索线上包
brew search php7
## 根据搜索结果继续安装
brew install homebrew/php/php70

LOG

1
2
3
4
5
6
==> Installing php70 from homebrew/php
==> Installing dependencies for homebrew/php/php70: freetype
==> Installing homebrew/php/php70 dependency: freetype
==> Downloading https://homebrew.bintray.com/bottles/freetype-2.6.5.el_capitan.bottle.ta
######################################################################## 100.0%
==> Pouring freetype-2.6.5.el_capitan.bottle.tar.gz

使用php7

1
2
3
4
☁ hackingangle.github.io [master] ⚡ php -v
PHP 7.0.9 (cli) (built: Jul 21 2016 14:50:47) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

架构师的focus点

相关领域内技术把控力度

  • 领域下架构的具体细节

代码细节封装能力

  1. 什么样的封装是好的?

好的封装是什么样子的?熟知设计模式基础上,通读流行框架源码。

Design Patterns

常玩技术深挖点

  1. linux
  2. nginx
  3. php
  4. openresty
  5. mysql
  6. memcached
  7. redis
  8. ssdb
  9. elasticsearch

产品sense

  • 当今流行领域,领域前景分析

保持新鲜事物的热情

  • trending

php内置九种排序

讲解

排序,在这里是针对array而言的。

让我们先来总结一下,这九种排序:

排序方向 正常 字典v 字典k
sort asort ksort
rsort arsort krsort
自定义 usort uasort uksort

PS:正常丢失字典结构

  • sort

    可以一般的排序,如果是k-v数据,会丢失关系

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
<?php
$nums = [90, 83, 100, 99, 78, 61];
$nums = [
'zhangsan' => 90,
'lisi' => 83,
'wanger' => 100,
'zhanghui' => 99,
'xuelong' => 78,
'zhangjian' => 61,
];
var_dump($nums);
sort($nums);
var_dump($nums);
// OUTPUT
// array(6) {
// ["zhangsan"]=>
// int(90)
// ["lisi"]=>
// int(83)
// ["wanger"]=>
// int(100)
// ["zhanghui"]=>
// int(99)
// ["xuelong"]=>
// int(78)
// ["zhangjian"]=>
// int(61)
// }
// array(6) {
// [0]=>
// int(61)
// [1]=>
// int(78)
// [2]=>
// int(83)
// [3]=>
// int(90)
// [4]=>
// int(99)
// [5]=>
// int(100)
// }
// 结论:丢失了k-v关系
  • asort

    问:sort排序不能保持k-v关系,那有没有能保持的?
    答:asort就可以满足了保持k-v关系,对v排序。

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
<?php
$nums = [90, 83, 100, 99, 78, 61];
$nums = [
'zhangsan' => 90,
'lisi' => 83,
'wanger' => 100,
'zhanghui' => 99,
'xuelong' => 78,
'zhangjian' => 61,
];
var_dump($nums);
asort($nums);
var_dump($nums);
// OUTPUT
// array(6) {
// ["zhangsan"]=>
// int(90)
// ["lisi"]=>
// int(83)
// ["wanger"]=>
// int(100)
// ["zhanghui"]=>
// int(99)
// ["xuelong"]=>
// int(78)
// ["zhangjian"]=>
// int(61)
// }
// array(6) {
// ["zhangjian"]=>
// int(61)
// ["xuelong"]=>
// int(78)
// ["lisi"]=>
// int(83)
// ["zhangsan"]=>
// int(90)
// ["zhanghui"]=>
// int(99)
// ["wanger"]=>
// int(100)
// }
// 结论:保持了k-v关系,对v排序
  • ksort

    问:既然asort能对v排序,有没有能对k排序的?
    答:当然了,我们只需要比较k就行了,这就是ksort

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
<?php
$nums = [90, 83, 100, 99, 78, 61];
$nums = [
'zhangsan' => 90,
'lisi' => 83,
'wanger' => 100,
'zhanghui' => 99,
'xuelong' => 78,
'zhangjian' => 61,
];
var_dump($nums);
ksort($nums);
var_dump($nums);
// OUTPUT
// array(6) {
// ["zhangsan"]=>
// int(90)
// ["lisi"]=>
// int(83)
// ["wanger"]=>
// int(100)
// ["zhanghui"]=>
// int(99)
// ["xuelong"]=>
// int(78)
// ["zhangjian"]=>
// int(61)
// }
// array(6) {
// ["lisi"]=>
// int(83)
// ["wanger"]=>
// int(100)
// ["xuelong"]=>
// int(78)
// ["zhanghui"]=>
// int(99)
// ["zhangjian"]=>
// int(61)
// ["zhangsan"]=>
// int(90)
// }
// 结论:保持k-v关系,对k排序

我们已经介绍了sort,asort,ksort,他们的区别是是否保留k-v关系,是比较k还是比较v
除此之外,一个排序算法,我们还再意,是升序还是降序。
我们这里说一下降序的三个对应:rsort,arsort,krsort

  • rsort
  • arsort
  • krsort

  • usort

    问:上述我们提到了升序降序问题,什么控制了升降?
    答:在排序时候的比较算法,对于复杂结构,我们是否可以自定义比较算法,这就是usort了。

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
<?php
/**
* sort 分为9种
* sort,asort,ksort
* rsort,arsort,krsort
* usort,uasort,uksort
*/
$users = [
[
'username' => 'zhangsan',
'age' => 32,
],
[
'username' => 'lisi',
'age' => 26,
],
[
'username' => 'wangermazi',
'age' => 90,
],
[
'username' => 'zhaosixiaojie',
'age' => 20,
]
];
function cmpAge($prefix, $suffix)
{
// echo "compare doing:", $prefix['age'], ',', $suffix['age'], "\n";
$attr = 'age';
if ($prefix[$attr] > $suffix[$attr]) {
return true;
}
if ($prefix[$attr] < $suffix[$attr]) {
return false;
}
return 0;
}
var_dump($users);
usort($users, 'cmpAge');
var_dump($users);
//OUTPUT
//array(4) {
// [0]=>
// array(2) {
// ["username"]=>
// string(8) "zhangsan"
// ["age"]=>
// int(32)
// }
// [1]=>
// array(2) {
// ["username"]=>
// string(4) "lisi"
// ["age"]=>
// int(26)
// }
// [2]=>
// array(2) {
// ["username"]=>
// string(10) "wangermazi"
// ["age"]=>
// int(90)
// }
// [3]=>
// array(2) {
// ["username"]=>
// string(13) "zhaosixiaojie"
// ["age"]=>
// int(20)
// }
// }
// array(4) {
// [0]=>
// array(2) {
// ["username"]=>
// string(13) "zhaosixiaojie"
// ["age"]=>
// int(20)
// }
// [1]=>
// array(2) {
// ["username"]=>
// string(4) "lisi"
// ["age"]=>
// int(26)
// }
// [2]=>
// array(2) {
// ["username"]=>
// string(8) "zhangsan"
// ["age"]=>
// int(32)
// }
// [3]=>
// array(2) {
// ["username"]=>
// string(10) "wangermazi"
// ["age"]=>
// int(90)
// }
// }
// 结论:定义方法,作为相邻元素的比较方法

那么,usort是否对应了逆序哪?
Of course not.usort的比较算法,本身就控制了是否逆序

我们还需要知道,是否需要对k-v结果保留,以及比较的方法:

  • uasort
  • uksort

总结

正序:sort, asort, ksort
逆序:rsort, arsort, krsort
控制:usort, uasort, uksort

都需要关注:k-v是否保留,是比较k,还是比较v

3-laravel-route

路由

一切的开始

web程序功能的最直观体现是什么?

URL

对了,就是URL。路由就是为URL指定要执行的程序。

使用

最简单路由

想象到吗?一个最简单的闭环就可以提供路由。

1
2
3
Route::get('hi', function () {
return 'Hi, World';
});

访问URL:

http://localhost:8000/hi

可以获取返回结果:

Hi, World

一类路由

一类路由有共同的某些特征,为了避免重复定义,’laravel’提供了此特性。

1
2
3
4
5
6
7
8
/**
* namespace:类namespace
* prefix:url前缀
* middleware:自动执行动作
*/
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => ['web']], function () {
Route::get('welcome', 'WelcomeController@index');
});

RESTFUL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 指定method
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
// 快捷指定method
Route::match(['get', 'post'], '/', function () {
//
});
// 任意匹配
Route::any('foo', function () {
//
});

执行的特定上下文

请通过参数来传递命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 必选
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
// 可选
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});

2-laravel-configuration

配置

哪里开始?

config 文件夹,这里主要配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ config [master] ⚡ ll
total 128
-rw-r--r-- 1 hackingangle staff 8.0K 1 25 14:05 app.php
-rw-r--r-- 1 hackingangle staff 2.2K 11 15 15:52 auth.php
-rw-r--r-- 1 hackingangle staff 1.4K 11 15 15:52 broadcasting.php
-rw-r--r-- 1 hackingangle staff 2.1K 11 15 15:52 cache.php
-rw-r--r-- 1 hackingangle staff 983B 11 15 15:52 compile.php
-rw-r--r-- 1 hackingangle staff 4.0K 11 15 15:52 database.php
-rw-r--r-- 1 hackingangle staff 2.5K 11 15 15:52 filesystems.php
-rw-r--r-- 1 hackingangle staff 4.3K 11 15 15:52 mail.php
-rw-r--r-- 1 hackingangle staff 2.6K 11 15 15:52 queue.php
-rw-r--r-- 1 hackingangle staff 985B 11 15 15:52 services.php
-rw-r--r-- 1 hackingangle staff 5.2K 11 15 15:52 session.php
-rw-r--r-- 1 hackingangle staff 1.0K 11 15 15:52 view.php

  • app
    • web程序的公共,service注册,时区设置,语言设定,debug模式开关,加密随机串,加密算法,别名,日志
  • database
    • 数据库:mysql,sqlite,pgsql,sqlsrv,redis
    • 返回类型:array|object
    • migrations路径

访问配置,用起来吧

1
2
3
4
5
6
7
// 获取时区
$value = config('app.timezone');
// 运行时,内存级改变
config([
'app.timezone' => 'UTC',
]);

让敏感信息躲在暗处

laravel 当前版本支持把数据库连接信息,加密随机串等敏感信息隐秘起来。所谓的隐秘,就是不让这些信息走版本控制。

env 来干活

1
env('DB_CONNECTION', 'mysql');

上面的话被引用自config/database.php用来从.env文件中读取DB_CONNECTION。版本控制中隐藏掉.env文件

运行环境

运行环境概念,允许区分线上、线下以及一些特殊的环境下的不同配置。

1
2
3
4
5
6
7
8
9
10
11
12
// App
$environment = App::environment();
// instance
$environment = app()->environment();
// 判断
if (App::environment('local')) {
// 环境为local执行
}
if (App::environment('local', 'staging')) {
// 环境为local 或 staging执行
}

线上优化

合并配置文件,被framework快速加载

1
php artisan config:cache

维护模式

维护模式重定向到resources/views/errors/503.blade.php

1
2
3
4
# 关闭维护模式
php artisan up
# 开启维护模式
php artisan down