Hi, this is Alice Home


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 公益404

Mac RAR 解压

发表于 2017-12-01 | 分类于 Mac

Mac 下使用命令行压缩和解压缩 rar 文件方法

step 1. 下载工具

https://www.rarlab.com/download.html

step 2. 解压,并进入 rar 目录

step 3. 安装 rar 和 unrar 工具

1
2
3
4
5
#rar
$sudo install -c -o $USER rar /usr/local/bin/

#unrar
$sudo install -c -o $USER unrar /usr/local/bin

step 4. 解压,测试

1
2
unrar x file.rar
rar a file

Swift Apprentice

发表于 2017-10-14 | 分类于 Swift

Chapter 11: Structures

在写 Objective-C 代码的时候,使用结构体的时候非常少的,但是对于 Swift 而言,结构体却是经常会用到

结构体简介

Chapter 14: Class

创建类

  • 必须要有初始化方法
  • 所有的属性必须在初始化方法之前有个初始值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person {
var firstName: String
var lastName: String

init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}

var fullName: String {
return "\(firstName) \(lastName)"
}
}

let erik:Person = Person(firstName: "Erik", lastName: "Keber")
print(erik.fullName)

引用类型

类创建的对象是一种引用类型,也就是说当我们通过如下代码创建一个对象的时候

1
2
3
4
5
6
7
class  Employee {
let name: String
init(name: String) {
self.name = name
}
}
var var1:Employee = Employee(name: "Jack")

实际上,变量存储的是该对象的地址,如果我们通过

1
var var2 = var1

将该变量赋值给另一个变量,此时内存中只有一个对象,两个变量存放着相同的内存地址

而结构体则是一种值类型,也就是变量存放的不再是地址,而是当前结构体实例的值

1
2
3
4
struct Employee1 {
let name: String
}
var var1 = Employee1(name: "Jack")

如果我们通过赋值给另一个变量,其实 copy 了一份新的值给另一个变量

1
var var2 = var1

堆 vs. 栈

当我们创建一个对象(reference type) 的时候,实际上是存放到了内存的堆区上面,而结构体(value type)则是存放到内存的栈区上面,除非这个 value type 类型的值是对象的一部分。
堆区和栈区都是编程中必不可可少的部分,认识堆和栈可以帮助我们了解类和结构体:

  • 系统使用栈(stack)存放临时的东西,栈里的东西有系统自动管理和优化。比如一个变量在函数开始的时候声明,并存储到栈中,当函数结束的时候这个变量在栈区中的内存就会被自动回收。因此,栈的管理高效、方便、快速
  • 系统对堆(heap)的管理与栈不同,堆中存放得是一些应用的类型。一般堆的存储都比较大,而且需要应用自己申请和自己释放,当然优化工作也是需要应用自己来处理。所以与栈相比较而言,堆相对比较麻烦和慢。

到这里有件事情很清晰了:

  • 通过类创建对象的时候,实际上是通过类的初始化方法在堆中申请了一块内存空间来存放 firstName 和 lastName。而变量和对象的地址则是存放到栈上
  • 通过结构体创建实例只是在栈上申请空间,与堆区没有任何关系

LLVM 以及 BitCode 泛谈 - Chris Lattner 访谈录

发表于 2017-08-26 | 分类于 iOS

这是看了LLVM之父 Chris Lattner 访谈录,做的小结,只关注LLVM这块。
LLVM 起源
LLVM(Low Level Virtual Machine)

LLVM: 一个模块化和可重用的编译器和工具链技术的集合,Clang是LLVM子项目,是C,C++和Objective-C编译器,因为多模块的复用,所以提供了惊人的编译速度,比GCC快 3 倍。

LLVM 的 byteCode 和 Apple 现在的 bitCode区分
LLVM开始是开源的,将所有代码转换成二进制时就叫做 bytecode – Java 当年也是这么叫的。然而这部分问题很多,然后就有了LLVM2.0,而 2.0 采用的就是BitCode机制。
LLVM 2.0 将所有的代码以比特流(bit stream)而不是字节流(byte stream)的形式编码。

Bitcode 优势:

  1. 因为Bitcode机制,编译器可以通过编译不同代码来存储各种优化方法,这样下次再遇到类似的代码,编译器就会自动启动相关优化机制,使得效率提升。
  2. LLVM 可以让芯片的兼容性变的更好。因为Apple每年都会在芯片上推陈出现,它们转化成二进制的规则不尽相同,LLVM只要每次重新编码并传输成比特流就好了(没听懂)

Bitcode 缺陷: 不能解决 32 位的APP在 64 位机器上的兼容问题。而 Chris Lattner 说这个问题其实应该依靠代码逻辑来解决。
问题:如何通过代码逻辑来解决 32 位 APP 在 64 位机器上的兼容问题。

LLVM三层结构
第一层: Clang 编译器,负责编译各种语言;
第二层:代码优化器,通过模块化操作优化代码,是Bitcode逻辑的主要部分;
第三层:代码翻译器,针对不同平台和GPU将代码翻译成机器语言。

LLDB 一个有着REPL的特性和C++、python插件的开源调试器。LLDB绑定在Xcode内部,存在于主窗口底部的控制台中。

libc++,libc++ ABI: 高性能C++标准库实现,支持C++11

compiler-rt: 为 LLVM和Clang设计的编译器扩展函数库。针对 _fixunsdfdi 和其他目标机器上没有一个核心IR对应的短原生指令序列时(Oh,my god 这是什么),提供高度调优过的底层代码生成支持。

ABI是什么?
Application Binary Interface,应用二进制接口,是APP和操作系统、其应用之间的二进制接口。

—-*参考——
Chris Lattner 访谈录(上)
Transcript of episode 205, an interview of Chris Lattner on January 17, 2017

Network (二)

发表于 2017-07-24 | 分类于 Network

我是demo

上一篇通过 Node JS 和 NSURLSession 实现了简单的 GET 请求,这一篇实现 POST 请求

Server

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
var http = require('http')
var queryString = require('querystring')

//创建服务器
var server = http.createServer(function(req, res) {
console.log(req.url)
console.log(req.method.toLocaleLowerCase())
if (req.method.toLocaleLowerCase() === 'post') {

var alldata = ''
req.on('data', function(chunk) {
alldata += chunk
})

req.on('end', function() {
res.end('Success')
var dataString = alldata.toString()
var dataObjc = queryString.parse(dataString)
console.log(dataObjc)
console.log(dataObjc.username)
console.log(dataObjc.password)
})

}
})


server.listen(9000, function() {
console.log('server is running ')
})

Server 地址: http://127.0.0.1:9000
POST 请求格式: username=’maple’&password=’xxxx’

Client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)update {

//构造 Request 对象,设置 url 和 POST 请求方法 以及请求体
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:9000"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[@"username=maple&password=xxx" dataUsingEncoding:NSUTF8StringEncoding]];
//构造网络请求
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@ %@ %@ %@", data, response, error, [NSThread currentThread]);
}];
//启动任务
[task resume];
}

这里是通过 NSURLSession 实现 POST 请求,所以需要做的事情有:

  1. 创建可变的请求对象;
  2. 设置 url requestWithURL:;
  3. 设置请求方法 setHTTPMethod:;
  4. 设置请求体:setHTTPBody:;
  5. 创建 session,通过 shareSession 单例实现;
  6. 通过 dataTaskWithRequest: completionHandler: 实现网络构造;
  7. resume 启动

Process

当客户端发起请求的时候,在 Node 服务端,通过

1
2
3
console.log(dataObjc)
console.log(dataObjc.username)
console.log(dataObjc.password)

输出:

1
2
3
{ username: 'maple', password: 'xxx' }
maple
xxx

结束,这就是一个完整的 POST 请求过程

Network(一)

发表于 2017-07-23 | 分类于 Network

我是demo

iOS 7.0 之后,苹果推出了新的网络 API —— NSURLSession。 NSURLSession supports the HTTP/1.1, SPDY, and HTTP/2 protocols. 从文档这句话中可以看出,新的网络库支持 HTTP 1.0 和 2.0 以及 Google 的 SPDY 网络协议。从这些特性上来讲,目前开发的 APP 都应该将网络库替换成 NSURLSession 了。首先探索下该网络库的使用。

Node JS 启动后台服务

网络请求就是客户端发起请求,服务端做出响应。作为 iOS 开发,如果没有后台数据的支持,只能到网络上找 API 了,但是我们可以通过 Node JS 实现简单的数据返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var http = require('http')
var server = http.createServer()

server.on('request', function(req, res) {
var jsonData = [{
name:'Jack',
age: 12
},
{
name:'Rose',
age: 13
}]
res.end(JSON.stringify(jsonData))
})

server.listen(9000,function(){
console.log('server is running ...')
})

上面这段代码解释为:
接口:http://127.0.0.1:9000
数据:

1
2
3
4
5
6
7
8
[{
name:'Jack',
age: 12
},
{
name:'Rose',
age: 13
}]

通过 curl 验证:

1
2
3
# maple @ iMac in ~/Maple [8:53:14]
$ curl http://127.0.0.1:9000
[{"name":"Jack","age":12},{"name":"Rose","age":13}]%

OK, 目前为止服务端的数据已经有了。

NSURLSession Tour

1
2
3
4
5
6
7
8
9
10
11
12
- (void)loadData {
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:9000"];
NSURLSessionDataTask *task = [session dataTaskWithURL:url
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

id obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves
error:nil];
NSLog(@"%@ %@ %@ %@", obj, response, error, [NSThread currentThread]);
}];
[task resume];
}

通过 NSURLSession 请求网络的步骤:

Step1:创建 NSURLSession 对象;
Step2:构造 url;
Step3:通过 NSURLSession 的实例方法 dataTaskWithURL: completionHandler: 构造网络请求,返回 NSURLSessionDataTask 对象
Step3: NSURLSessionDataTask 对象通过 resume 方法启动网络请求

这里 id obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 实现了 JSON 数据的序列化,obj 的类型是数组。

操作非常的简单,当然上面的请求是 GET 请求,下一篇看一下 POST 请求。

carthage Tour

发表于 2017-06-13 | 分类于 carthage

carthage iOS 第三方管理工具,本来不打算学习这个东西了,但是最近在看一些工程总是会遇到它,索性在这里记录下如何去使用 carthage 。

目标

  • Mac 构建 carthage 环境 & 了解 carthage
  • carthage 引入第三方
  • 初步了解 carthage 的原理
  • carthage 限制
  • carthage 与 CocoaPods 同时使用

搭建 carthage 环境

因为 Mac 有 brew 神器,闭着眼也知道怎么安装了 brew install carthage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ brew install carthage
$ which carthage
/usr/local/bin/carthage
$ carthage help
Available commands:

archive Archives built frameworks into a zip that Carthage can use
bootstrap Check out and build the project's dependencies
build Build the project's dependencies
checkout Check out the project's dependencies
copy-frameworks In a Run Script build phase, copies each framework specified by a SCRIPT_INPUT_FILE environment variable into the built app bundle
fetch Clones or fetches a Git repository ahead of time
help Display general or command-specific help
outdated Check for compatible updates to the project's dependencies
update Update and rebuild the project's dependencies
version Display the current version of Carthage

Python2.x 过渡到 Python3.x 的那些错误

发表于 2017-06-03 | 分类于 Python

在写 Python 的过程中,因为有些时候参考的代码是 Python2 写的,所以在 3.x 的环境中就容易抛出一些异常信息,在这里进行记录

类型异常

byte 和 string

在写 socket 的程序的时候, recv() 函数返回值在 2.x 中是字符串的格式,但是在 3.x 之后是 byte 的格式,这样在 print() 函数中输出 recv() 的结果的时候就会报异常信息:

1
TypeError: must be str, not bytes

解决方案:
通过 byte() 函数进行转换

1
2
byte = sk.recv(1024)
byte('utf-8')

算法C描述之数据结构

发表于 2017-03-04 | 分类于 算法

自定义组件

数组

数组是一组相同类型数据的固定集合,它们的存储空间相邻,可以通过索引访问。 C 语言中索引非负且小于数组大小。

埃拉托色尼筛选

链表

字符串

符合数据结构

NSFoundation-NSInvocation

发表于 2017-02-02 | 分类于 NSFoundation

NSInvocation继承自NSObject。

参考
NSInvocation API

Foundation-MapTable

发表于 2017-01-01 | 分类于 NSFoundation

NSMapTable 是 iOS 6 之后, 苹果公开出的一个集合类。NSMapTable 与 NSDictionary/NSMutableDictionary 类似,可以对比学习。
NSMapTable 具有以下特性:

  • NSMapleTable 对 键或者值得应用可以是弱引用,即其中之一被移除,那么在Map中存储的这一项也会被移除掉;
    -

使用:

参考:

NSMaptable API
NSMapTable: more than an NSDictionary for weak pointers

1…10111213
Alice

Alice

The Loneliest Whale in the World

121 日志
35 分类
30 标签
© 2021 Alice
由 Hexo 强力驱动
主题 - NexT.Pisces