Rust 引用变量的生命周期,编译器的借用检查器确保你的代码安全可靠

后端开发网站管理员 Published the article • 0 comments • 36 views • 2019-07-28 16:47 • 来自相关话题

## Rust lifetime

### Borrow Checker 借用检查器

#### 代码块

Rust编译器会在编译的时候比较作用域变量的生命周期。
Rust官方文档中有如下示例:
```rust
{
let r; // ---------+-- 'a
// |
{ // |
let x = 5; // -+-- 'b |
r = &x; // | |
} // -+ |
// |
println!("r: {}", r); // |
}
```

从中我们可以看出,里面括号里的代码块,变量x的作用域局限在里面的括号里,所以它的生命周期明显只有在这个括号里,对比变量r,r的生命周期要比x长,这个时候又将x的引用赋值给r,编译器会报错,因为后面的`println!("r: {}", r);`打印的r,其实是x。

### 在函数中分配生命周期

函数传参数,参数为引用,为什么要传引用呢?不想让函数拥有参数的所有权。

```rust
&i32 // 这是一个引用
&'a i32 // 这是一个有着详细生命周期的引用
&'a mut i32 // 这是一个有着详细生命周期的可变引用

fn longest &'a str {
x
}

// 错误案例
fn longest 查看全部

## Rust lifetime

### Borrow Checker 借用检查器

#### 代码块

Rust编译器会在编译的时候比较作用域变量的生命周期。
Rust官方文档中有如下示例:
```rust
{
let r; // ---------+-- 'a
// |
{ // |
let x = 5; // -+-- 'b |
r = &x; // | |
} // -+ |
// |
println!("r: {}", r); // |
}
```

从中我们可以看出,里面括号里的代码块,变量x的作用域局限在里面的括号里,所以它的生命周期明显只有在这个括号里,对比变量r,r的生命周期要比x长,这个时候又将x的引用赋值给r,编译器会报错,因为后面的`println!("r: {}", r);`打印的r,其实是x。

### 在函数中分配生命周期

函数传参数,参数为引用,为什么要传引用呢?不想让函数拥有参数的所有权。

```rust
&i32 // 这是一个引用
&'a i32 // 这是一个有着详细生命周期的引用
&'a mut i32 // 这是一个有着详细生命周期的可变引用

fn longest<'a>(x: &'a str, y: &str) -> &'a str {
x
}

// 错误案例
fn longest<'a>(x: &str, y: &str) -> &'a str {
let result = String::from("really long string");
result.as_str()
}
```
为什么的个函数`longest`会报错呢?原因是result的生命周期要比`'a`短。

### 在结构体定义里标记生命周期

### 哪些规则不需要为引用声明生命周期(lifetime elision rules)生命周期省略

每一个引用都有一个生命周期

在函数或者方法参数中,生命周期被称作输入生命周期,相反,返回值的被称作输出生命周期。

#### 生命周期省略规则

第一条适用于输入生命周期,后面两条则适用于输出生命周期。适用于`fn`和`impl`块。
只有满足如下三点,就可以不用声明生命周期。

1. 每一个引用参数都有自己的一个生命周期。
2. 如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数。
3. 多个输入生命周期参数,`&self`或`&mult self`,self的生命周期被赋给所有输出生命周期参数。




【Rust Lang进击之路】如何入门Rust,从配置环境和阅读官方文档开始

后端开发网站管理员 Published the article • 0 comments • 55 views • 2019-07-27 00:28 • 来自相关话题

### 如何入门rust-lang,从官方文档阅读开始

为什么要学习Rust?Rust学习曲线高,入门也不简单,看看Rust的自荐。

> 一门赋予每个人
> 构建可靠且高效软件能力的语言。

1. 高性能
- Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。

2. 可靠性
- Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。

3. 生产力
- Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具 —— 包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。


#### 官方文档

- [中文文档](https://www.rust-lang.org/zh-CN/)
- [英文文档](https://www.rust-lang.org/learn)

#### 安装rust-lang IDE

Jetbrains是一家开发IDE的公司,旗下有很多优秀的IDE,phpstorm、goland、webstore、pyCharm等,今天我们要用到的是Intellij,然后我们可以在他的插件管理器中下载rust的插件,安装完毕之后,我们可以重启IDE,创建rust应用程序。

如果需要研究阅读插件的源代码,跟进插件的特性,可以[在github上](https://intellij-rust.github.io/)讨论。

#### 关于rust-lang的环境配置

官方提供了很优秀的解决方案,[Install Rust](https://www.rust-lang.org/tools/install),不知道从什么时候开始,学习东西喜欢从它的官方文档先开始研究。
> It looks like you’re running macOS, Linux, or another Unix-like OS. To download Rustup and install Rust, run the following in your terminal, then follow the on-screen instructions.
官方提供的方法其实很简单,是一个自动化安装的shell脚本,curl下载shell脚本,一键部署安装环境,十分的简单方便。

```bash
curl https://sh.rustup.rs -sSf | sh
```

#### 阅读文档,从`Hello world`程序开始我们的rust

开始我们的rust`hello world`程序之旅,不得不提一下cargo,rust的包管理工具(Rust's package manager)。

##### 首先我们需要通过`cargo`创建一个rust的项目

在命令行执行`cargo new hello-world`,然后cargo管理器就为我们创建了一个hello-world的目录,这个目录如下:
```
.
├── Cargo.lock
├── Cargo.toml
└── src
└── main.rs
```

其实`cargo new`,会直接给我们自动生成一个hello world的程序,代码如下
```rust
fn main() {
println!("Hello, world!");
}
```
然后我们只需要执行如下脚本,cargo会帮我们自动生成可执行文件,并且执行输出结果。
```bash

cargo run
# Compiling hello-demo v0.1.0 (/Users/demo/project/hello-demo)
# Finished dev [unoptimized + debuginfo] target(s) in 0.78s
# Running `target/debug/hello-demo`
# Hello world
```

##### 使用Rustc编译.rs文件

```bash
Rustc src/main.rs
./main

# Hello world
```

### Rust HelloWorld程序分析

Rust可执行程序一定需要一个入口文件,和C/C++一样,需要一个`manin`函数,关键词`fn`表示函数,宏`println!`可以帮助我们打印输出。
为什么说长得像函数的`println!`是宏,如果你观察仔细的话,你会发现宏是在函数后面增加了一个感叹号`!`,这个标识标识它就是宏。
关于宏的介绍,后面我会弄个专栏来介绍它。宏不管是在C还是Rust中,都十分的强大。相信你也会喜欢这门语言的。 查看全部
### 如何入门rust-lang,从官方文档阅读开始

为什么要学习Rust?Rust学习曲线高,入门也不简单,看看Rust的自荐。

> 一门赋予每个人
> 构建可靠且高效软件能力的语言。

1. 高性能
- Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。

2. 可靠性
- Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。

3. 生产力
- Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具 —— 包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。


#### 官方文档

- [中文文档](https://www.rust-lang.org/zh-CN/)
- [英文文档](https://www.rust-lang.org/learn)

#### 安装rust-lang IDE

Jetbrains是一家开发IDE的公司,旗下有很多优秀的IDE,phpstorm、goland、webstore、pyCharm等,今天我们要用到的是Intellij,然后我们可以在他的插件管理器中下载rust的插件,安装完毕之后,我们可以重启IDE,创建rust应用程序。

如果需要研究阅读插件的源代码,跟进插件的特性,可以[在github上](https://intellij-rust.github.io/)讨论。

#### 关于rust-lang的环境配置

官方提供了很优秀的解决方案,[Install Rust](https://www.rust-lang.org/tools/install),不知道从什么时候开始,学习东西喜欢从它的官方文档先开始研究。
> It looks like you’re running macOS, Linux, or another Unix-like OS. To download Rustup and install Rust, run the following in your terminal, then follow the on-screen instructions.
官方提供的方法其实很简单,是一个自动化安装的shell脚本,curl下载shell脚本,一键部署安装环境,十分的简单方便。

```bash
curl https://sh.rustup.rs -sSf | sh
```

#### 阅读文档,从`Hello world`程序开始我们的rust

开始我们的rust`hello world`程序之旅,不得不提一下cargo,rust的包管理工具(Rust's package manager)。

##### 首先我们需要通过`cargo`创建一个rust的项目

在命令行执行`cargo new hello-world`,然后cargo管理器就为我们创建了一个hello-world的目录,这个目录如下:
```
.
├── Cargo.lock
├── Cargo.toml
└── src
└── main.rs
```

其实`cargo new`,会直接给我们自动生成一个hello world的程序,代码如下
```rust
fn main() {
println!("Hello, world!");
}
```
然后我们只需要执行如下脚本,cargo会帮我们自动生成可执行文件,并且执行输出结果。
```bash

cargo run
# Compiling hello-demo v0.1.0 (/Users/demo/project/hello-demo)
# Finished dev [unoptimized + debuginfo] target(s) in 0.78s
# Running `target/debug/hello-demo`
# Hello world
```

##### 使用Rustc编译.rs文件

```bash
Rustc src/main.rs
./main

# Hello world
```

### Rust HelloWorld程序分析

Rust可执行程序一定需要一个入口文件,和C/C++一样,需要一个`manin`函数,关键词`fn`表示函数,宏`println!`可以帮助我们打印输出。
为什么说长得像函数的`println!`是宏,如果你观察仔细的话,你会发现宏是在函数后面增加了一个感叹号`!`,这个标识标识它就是宏。
关于宏的介绍,后面我会弄个专栏来介绍它。宏不管是在C还是Rust中,都十分的强大。相信你也会喜欢这门语言的。

Daily Tips: the function array_reduce, which can calculate the sum of the multidimensional array.

PHP网站管理员 Published the article • 0 comments • 29 views • 2019-07-26 00:35 • 来自相关话题

Sometimes, if you need to calculate the sum of an array, you may use the function `array_sum` in PHP.

> But this is the multidimensional array, like following:

### For example
```php 查看全部
Sometimes, if you need to calculate the sum of an array, you may use the function `array_sum` in PHP.

> But this is the multidimensional array, like following:

### For example
```php
$array = [
[
'quantity' => 2,
],
[
'quantity' => 4,
],
[
'quantity' => 5,
],
];

var_dump(array_sum($array)); // the result is 0, incorrect
```

This is incorrect, when you use the function `array_sum` to calculate the array, you will get the result `0`.

For this moment, the function `array_reduce` will help us to calculate the multidimensional array.

### The correct usage
```php
$sum = array_reduce($array, function($init, $datum) {
return $init + $datum['quantity'];
});
var_dump($sum); // int(11)
```

the function `array_reduce` has a callback function, which function has two parameters.

>The first parameter to the callback is an accumulator where the result-in-progress is effectively assembled. If you supply an $initial value the accumulator starts out with that value, otherwise, it starts out null.
The second parameter is where each value of the array is passed during each step of the reduction.
The return value of the callback becomes the new value of the accumulator. When the array is exhausted, array_reduce() returns accumulated value.

### Reference

1. [array_reduce](https://www.php.net/manual/zh/ ... ce.php)

How to merge multiple git commits into a new branch?

Linux网站管理员 Published the article • 0 comments • 113 views • 2019-07-24 15:40 • 来自相关话题

### We will use the following git command:

#### git log

#### git cherry-pick

> git-log - Show commit logs

```bash
git log [] [] [[--] …​]
```

1. `--author` match the author
2. `--after` after this time's commits
3. `--before` before this time's commits
4. `--no-merges` filter the merge commits

The official's introductions

> git-cherry-pick - Apply the changes introduced by some existing commits

```bash
git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
[-S[]] …​
git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort
```

### Step 1

Get all git commits, which you want to merge to a new branch. Then, we will use the git command `git cherry-pick` to do combine.

```bash
git log --author="phantom\|ydl" \
--after="2019-07-23" \
--before="2019-07-25" --no-merges \
| grep -oP "commit\s.+" | sed 's/commit /./g' | tr "\n" "." | sed 's/^.//g' | sed 's/.$//g'
```

Using this shell command, We will the commits, split by `..`, Like following:
`f560394908449057afa7e200a85052c26a58b181..aab71d9ac104cd1513fe5ac55de28211ec807c8e..be22dbb41a7ea4bc8aac147023645638f0777f3d`.

### Step2

Using git command `git cherry-pick`, pick the commits string.

```bash
git cherry-pick $(git log --author="phantom\|ydl" \
--after="2019-07-23" \
--before="2019-07-25" --no-merges \
| grep -oP "commit\s.+" | sed 's/commit /./g' | tr "\n" "." | sed 's/^.//g' | sed 's/.$//g')
```

Maybe we need to deal with the conflict between commits, and add a new commit, push to the new branch.

### Reference

1. [Git Offical Document git cherry-pick](https://git-scm.com/docs/git-cherry-pick)
2. [Git Offical Document git log](https://git-scm.com/docs/git-log) 查看全部

### We will use the following git command:

#### git log

#### git cherry-pick

> git-log - Show commit logs

```bash
git log [] [] [[--] …​]
```

1. `--author` match the author
2. `--after` after this time's commits
3. `--before` before this time's commits
4. `--no-merges` filter the merge commits

The official's introductions

> git-cherry-pick - Apply the changes introduced by some existing commits

```bash
git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
[-S[]] …​
git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort
```

### Step 1

Get all git commits, which you want to merge to a new branch. Then, we will use the git command `git cherry-pick` to do combine.

```bash
git log --author="phantom\|ydl" \
--after="2019-07-23" \
--before="2019-07-25" --no-merges \
| grep -oP "commit\s.+" | sed 's/commit /./g' | tr "\n" "." | sed 's/^.//g' | sed 's/.$//g'
```

Using this shell command, We will the commits, split by `..`, Like following:
`f560394908449057afa7e200a85052c26a58b181..aab71d9ac104cd1513fe5ac55de28211ec807c8e..be22dbb41a7ea4bc8aac147023645638f0777f3d`.

### Step2

Using git command `git cherry-pick`, pick the commits string.

```bash
git cherry-pick $(git log --author="phantom\|ydl" \
--after="2019-07-23" \
--before="2019-07-25" --no-merges \
| grep -oP "commit\s.+" | sed 's/commit /./g' | tr "\n" "." | sed 's/^.//g' | sed 's/.$//g')
```

Maybe we need to deal with the conflict between commits, and add a new commit, push to the new branch.

### Reference

1. [Git Offical Document git cherry-pick](https://git-scm.com/docs/git-cherry-pick)
2. [Git Offical Document git log](https://git-scm.com/docs/git-log)

MySQL5.7 supports a native JSON data type, and how to use it?

数据结构与算法网站管理员 Published the article • 0 comments • 134 views • 2019-07-11 15:52 • 来自相关话题

mysql5.7已经支持JSON的数据结构,意味着我们可以更加方便的对JSON结构的数据进行增删改成

### 什么是JSON?

> JSON: JavaScript Object Notation(JavaScript 对象表示法)
> JSON 是存储和交换文本信息的语法。类似 XML。
> JSON 比 XML 更小、更快,更易解析。
> JSON 具有自我描述性,更易理解

### 建立表,添加JSON的数据结构字段col

建表qtest,然后添加col的字段,其数据类型为JSON,插入一条JSON字符串,然后发现添加不是json结构的数据
mysql会给我们报如下错误```ERROR 3140 (22032) at line 2: Invalid JSON text:```,表明我们插入的是非法JSON。

```json
{"mascot": "Our mascot is a dolphin named \"Sakila\"."}
```

```mysql
mysql> CREATE TABLE qtest (col JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"mascot": "Our mascot is a dolphin named \"Sakila\"."}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
```

### 如何查询JSON的某个字段

1. 字段指向一个字符串,由```$.name```组成,美元符号+字段名称

```mysql
mysql> SELECT col->"$.mascot" FROM qtest;
+---------------------------------------------+
| col->"$.mascot" |
+---------------------------------------------+
| "Our mascot is a dolphin named \"Sakila\"." |
+---------------------------------------------+
1 row in set (0.00 sec)
```

2. 查询数组```$[0]```,美元符号+中括号及数组索引

```mysql
mysql> select *from sourcedev;
+----+------------------------------+-----------+
| id | category | tags |
+----+------------------------------+-----------+
| 1 | {"id": 1, "name": "sourcedev.cc"} | [1, 2, 3] |
+----+------------------------------+-----------+
1 row in set (0.00 sec)

mysql> select id, category->'$.id', tags->'$[0]' from sourcedev;
+----+------------------+--------------+
| id | category->'$.id' | tags->'$[0]' |
+----+------------------+--------------+
| 1 | 1 | 1 |
+----+------------------+--------------+
1 row in set (0.00 sec)
```

### mysql5.7 JSON相关函数

1. JSON_TYPE JSON类型,ARRAY、STRING
所有的Json type类型如下
```
BLOB
BIT
OPAQUE
DATETIME
TIME
DATE
BOOLEAN
ARRAY
OBJECT
STRING
INTEGER, DOUBLE
NULL
```

2. JSON_ARRAY ```SELECT JSON_ARRAY('a', 1, NOW());```

```mysql
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW()) |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
```

3. JSON_OBJECT
```mysql
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"} |
+---------------------------------------+
```
4. 等等


### 引用

1. [百度百科 #https://baike.baidu.com/item/JSON/2462549](https://baike.baidu.com/item/JSON/2462549)
2. [mysql5.7官方文档 #https://dev.mysql.com/doc/refman/8.0/en/json.html](https://dev.mysql.com/doc/refman/8.0/en/json.html) 查看全部

mysql5.7已经支持JSON的数据结构,意味着我们可以更加方便的对JSON结构的数据进行增删改成

### 什么是JSON?

> JSON: JavaScript Object Notation(JavaScript 对象表示法)
> JSON 是存储和交换文本信息的语法。类似 XML。
> JSON 比 XML 更小、更快,更易解析。
> JSON 具有自我描述性,更易理解

### 建立表,添加JSON的数据结构字段col

建表qtest,然后添加col的字段,其数据类型为JSON,插入一条JSON字符串,然后发现添加不是json结构的数据
mysql会给我们报如下错误```ERROR 3140 (22032) at line 2: Invalid JSON text:```,表明我们插入的是非法JSON。

```json
{"mascot": "Our mascot is a dolphin named \"Sakila\"."}
```

```mysql
mysql> CREATE TABLE qtest (col JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"mascot": "Our mascot is a dolphin named \"Sakila\"."}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
```

### 如何查询JSON的某个字段

1. 字段指向一个字符串,由```$.name```组成,美元符号+字段名称

```mysql
mysql> SELECT col->"$.mascot" FROM qtest;
+---------------------------------------------+
| col->"$.mascot" |
+---------------------------------------------+
| "Our mascot is a dolphin named \"Sakila\"." |
+---------------------------------------------+
1 row in set (0.00 sec)
```

2. 查询数组```$[0]```,美元符号+中括号及数组索引

```mysql
mysql> select *from sourcedev;
+----+------------------------------+-----------+
| id | category | tags |
+----+------------------------------+-----------+
| 1 | {"id": 1, "name": "sourcedev.cc"} | [1, 2, 3] |
+----+------------------------------+-----------+
1 row in set (0.00 sec)

mysql> select id, category->'$.id', tags->'$[0]' from sourcedev;
+----+------------------+--------------+
| id | category->'$.id' | tags->'$[0]' |
+----+------------------+--------------+
| 1 | 1 | 1 |
+----+------------------+--------------+
1 row in set (0.00 sec)
```

### mysql5.7 JSON相关函数

1. JSON_TYPE JSON类型,ARRAY、STRING
所有的Json type类型如下
```
BLOB
BIT
OPAQUE
DATETIME
TIME
DATE
BOOLEAN
ARRAY
OBJECT
STRING
INTEGER, DOUBLE
NULL
```

2. JSON_ARRAY ```SELECT JSON_ARRAY('a', 1, NOW());```

```mysql
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW()) |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
```

3. JSON_OBJECT
```mysql
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"} |
+---------------------------------------+
```
4. 等等


### 引用

1. [百度百科 #https://baike.baidu.com/item/JSON/2462549](https://baike.baidu.com/item/JSON/2462549)
2. [mysql5.7官方文档 #https://dev.mysql.com/doc/refman/8.0/en/json.html](https://dev.mysql.com/doc/refman/8.0/en/json.html)


wepy1.x升级wepy2.x,wepy如何实现大的版本升级升级

小程序网站管理员 Published the article • 0 comments • 317 views • 2019-07-06 14:20 • 来自相关话题

要从wepy1.x升级到2.x这是一件比较困难的事情,因为框架的整个语法都发生了变化。正如官方所言:

> WePY 2 并不是基于 WePY 1 作的版本升级,而是完全重新开发的全新版本。因为实现原理完全不一样,因些比较难实现完全的向下兼容。

与其苦苦纠结如何升级,不如拥抱全新的版本,2.x实现了对typescript的支持,所以我们可以更加愉快的写代码

### 关于wepy1.x和wepy2.x的差异

> 1. 入口申请调整,WePY 1 使用类的继承方式 export default class MyPage extends wepy.page {} 在 WePY 2 中调整为 wepy.page({})。将实例化的过程放在生命周期事件中。

> 2. 数据绑定机制调整,WePY 1 使用脏检查进行数据绑定,却让开发者不知道使用时候去调用 $apply() 方法。在 WePY 2 中使用了 Vue Observer 实现数据绑定,告别$apply()。

> 3. 基于原生组件,WePY 1 是通过文件编译创建的静态组件在动态循环遍历时会出现一些问题,WePY 2 直接基于的小程序原生的组件去实现,避免了这一类问题。

> 4. Vue 模板语法,WePY 2 中推荐使用 HTML 代替 wxml 来写 template,支持除 filter 之外的所有 Vue 模板语法。

> 5. 编译方式改变,WePY 2 从基于文件编译调整为基于入口编译,因此对于图片等静态资源需要指定 static 选项 。


### 引用

[wepy官方2.x文档](https://wepyjs.github.io/wepy-docs/2.x/#/) 查看全部

要从wepy1.x升级到2.x这是一件比较困难的事情,因为框架的整个语法都发生了变化。正如官方所言:

> WePY 2 并不是基于 WePY 1 作的版本升级,而是完全重新开发的全新版本。因为实现原理完全不一样,因些比较难实现完全的向下兼容。

与其苦苦纠结如何升级,不如拥抱全新的版本,2.x实现了对typescript的支持,所以我们可以更加愉快的写代码

### 关于wepy1.x和wepy2.x的差异

> 1. 入口申请调整,WePY 1 使用类的继承方式 export default class MyPage extends wepy.page {} 在 WePY 2 中调整为 wepy.page({})。将实例化的过程放在生命周期事件中。

> 2. 数据绑定机制调整,WePY 1 使用脏检查进行数据绑定,却让开发者不知道使用时候去调用 $apply() 方法。在 WePY 2 中使用了 Vue Observer 实现数据绑定,告别$apply()。

> 3. 基于原生组件,WePY 1 是通过文件编译创建的静态组件在动态循环遍历时会出现一些问题,WePY 2 直接基于的小程序原生的组件去实现,避免了这一类问题。

> 4. Vue 模板语法,WePY 2 中推荐使用 HTML 代替 wxml 来写 template,支持除 filter 之外的所有 Vue 模板语法。

> 5. 编译方式改变,WePY 2 从基于文件编译调整为基于入口编译,因此对于图片等静态资源需要指定 static 选项 。


### 引用

[wepy官方2.x文档](https://wepyjs.github.io/wepy-docs/2.x/#/)

为什么我建议使用Medium来学习技术,练习英语?

随想录网站管理员 Published the article • 0 comments • 102 views • 2019-07-04 15:52 • 来自相关话题

Medium是国外的一个写作平台,每个月有一定的免费阅读文章的机会,但是如果超过限制,需要升级账号,每个月5每刀,一年是50美刀,折扣10美刀,大概需要支付人民币333每年。

Medium的运营模式被国内的一些平台模仿, 但是很难做到它的精髓,怎么说呢?

国内抄袭比较严重,如果涉及到利益的话,很容易滋生灰色产业,洗稿文章满天飞。

为什么建议在Medium上学习文章呢?Medium有很多的大牛,而且文章内容涉及的领域十分的广泛。这是一个不错的的平台,可以帮助我们学习技术和练习英语,如果我们有翻译的兴趣的话,可以将这些文章翻译之后分享到国内的平台,增加自己的影响力,同时也提升了自身的阅读和翻译能力,也学习了前沿的技术。 查看全部
Medium是国外的一个写作平台,每个月有一定的免费阅读文章的机会,但是如果超过限制,需要升级账号,每个月5每刀,一年是50美刀,折扣10美刀,大概需要支付人民币333每年。

Medium的运营模式被国内的一些平台模仿, 但是很难做到它的精髓,怎么说呢?

国内抄袭比较严重,如果涉及到利益的话,很容易滋生灰色产业,洗稿文章满天飞。

为什么建议在Medium上学习文章呢?Medium有很多的大牛,而且文章内容涉及的领域十分的广泛。这是一个不错的的平台,可以帮助我们学习技术和练习英语,如果我们有翻译的兴趣的话,可以将这些文章翻译之后分享到国内的平台,增加自己的影响力,同时也提升了自身的阅读和翻译能力,也学习了前沿的技术。

js从Excel拿到日期是一个浮点小数,时间格式问题怎么转换为时间戳?

前端网站管理员 Published the article • 0 comments • 206 views • 2019-06-20 15:23 • 来自相关话题

### 背景

js从excel中拿到的时间是一个浮点的天数,时间是1900-01-01开始到现在的天数

### 解决思路
1. 首先我们需要处理时区的问题,```getTimezoneOffset()```得到距离UTC的分钟时间差
2. 然后将时间转换为毫秒级时间戳,传入```new Date()```中,初始化对象
3. 由于时间戳开始时间是1970-01-01,所以```getFullYear()```要减去70年,得到UTC年份
4. 毫秒转换为时间戳除以1000即可得到,然后对其取整。

### js代码实例

```js
let value = 4564;
value = value + (new Date()).getTimezoneOffset() / 60 / 24;
let date = new Date((value - 1) * 24 * 3600000 + 1);
date.setUTCFullYear(date.getFullYear() - 70);
return parseInt('' + date.getTime() / 1000);
``` 查看全部

### 背景

js从excel中拿到的时间是一个浮点的天数,时间是1900-01-01开始到现在的天数

### 解决思路
1. 首先我们需要处理时区的问题,```getTimezoneOffset()```得到距离UTC的分钟时间差
2. 然后将时间转换为毫秒级时间戳,传入```new Date()```中,初始化对象
3. 由于时间戳开始时间是1970-01-01,所以```getFullYear()```要减去70年,得到UTC年份
4. 毫秒转换为时间戳除以1000即可得到,然后对其取整。

### js代码实例

```js
let value = 4564;
value = value + (new Date()).getTimezoneOffset() / 60 / 24;
let date = new Date((value - 1) * 24 * 3600000 + 1);
date.setUTCFullYear(date.getFullYear() - 70);
return parseInt('' + date.getTime() / 1000);
```

windows PE header数据结构分析

数据结构与算法网站管理员 Published the article • 0 comments • 101 views • 2019-06-18 10:44 • 来自相关话题

如何获取PE(Protable Executable)格式的header,PE的结构在winnt.h中可以获得,该头文件里定义了大量的PE数据结构体,方便我们对可执行文件数据结构进行分析。
如果我们不知道这些结构,我们可能需要逆向工程的技术对其结构进行分析猜想,还是包含一定的工作量。

PEheader的定义如下:

WORD的数据类型是short的无符号整型,```e_magic```是DOS签名,```e_lfanew```是NT的偏移量。一般的PE文件e_magic为```0x5a4d```。


### WORD的定义
```
typedef unsigned short WORD;
```

### PE header

```
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic;
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew;
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
```

### 示例代码

```c
#include
#include
#include

int main() {
FILE *file;
IMAGE_DOS_HEADER header;
file = fopen("cmake-build-debug\\c_demo.exe", "r");
fread(&header, sizeof(header), 1, file);
fclose(file);

printf("doc: 0x%x\n", header.e_magic);
return 0;
}
``` 查看全部

如何获取PE(Protable Executable)格式的header,PE的结构在winnt.h中可以获得,该头文件里定义了大量的PE数据结构体,方便我们对可执行文件数据结构进行分析。
如果我们不知道这些结构,我们可能需要逆向工程的技术对其结构进行分析猜想,还是包含一定的工作量。

PEheader的定义如下:

WORD的数据类型是short的无符号整型,```e_magic```是DOS签名,```e_lfanew```是NT的偏移量。一般的PE文件e_magic为```0x5a4d```。


### WORD的定义
```
typedef unsigned short WORD;
```

### PE header

```
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic;
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew;
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
```

### 示例代码

```c
#include
#include
#include

int main() {
FILE *file;
IMAGE_DOS_HEADER header;
file = fopen("cmake-build-debug\\c_demo.exe", "r");
fread(&header, sizeof(header), 1, file);
fclose(file);

printf("doc: 0x%x\n", header.e_magic);
return 0;
}
```

淘小铺邀请码URLF

PHP网站管理员 Published the article • 0 comments • 139 views • 2019-05-22 19:37 • 来自相关话题

今天朋友圈大家都在分享淘小铺,这是阿里巴巴推出的一个分销应用,用来和拼多多抗衡

今天朋友圈大家都在分享淘小铺,这是阿里巴巴推出的一个分销应用,用来和拼多多抗衡