<commit_before>### 5w MyDiary SAE

# 背景知识
* PaaS - Platform as a Service平台即服务
    * [wiki](https://en.wikipedia.org/wiki/Platform_as_a_service)
    * 一种云计算服务
    * 用户可以在平台上面开发,运行,管理web application,用户不需要管理和控制基础设施
    * 比如Google App Engine
* SAE - Sina App Engine[新浪云应用](http://www.sinacloud.com/doc/sae/python/index.html)
    * 国内最大PaaS
* KVDB - [分布式key-value database](http://www.sinacloud.com/doc/sae/python/kvdb.html)
    * 可扩展NoSQL键值数据库服务
* [NoSQL](https://en.wikipedia.org/wiki/NoSQL) - Non SQL
    * 不使用传统的关系型数据库
    * 不使用SQL作为查询语言
    * 数据存储不需要固定的表格模式
    * 使用硬盘，或者把随机存储器作存储载体

---

# 任务记录
## 1.sae本地环境部署
* [安装sae](http://www.sinacloud.com/doc/sae/python/tools.html)
	* ```$ pip install sae-python-dev```
	* 或者github下载源码安装
* 在本地开发目录新建index.wsgi和config.yaml [参考](http://www.sinacloud.com/doc/sae/python/tutorial.html)
	* 应用配置文件config.yaml内容如下:
```
name: helloworld
version: 1
```	
	* 使用bottle的index.wsgi内容如下:
```python
from bottle import Bottle, run

import sae

app = Bottle()

@app.route('/')
def hello():
    return "Hello, world! - Bottle"

application = sae.create_wsgi_app(app)
```
* 在本地开发目录下运行测试
```$ dev_server.py```
* 访问http://localhost:8080就可以访问应用了

## 2.改写4w代码
### 使用kvdb替代本地txt文件

* [kvdb文档](http://www.sinacloud.com/doc/sae/python/kvdb.html)
* kvdb类似python的dict data type

```python
import sae
import sae.kvdb
kv=sae.kvdb.Client()
```

* 参考小赖的设计:
	* key值为key1,key2,key3....即有几条日记就是key#
		* key值必须为string
		* 一开始尝试直接设置数字为key,然后有新diary就```key+=1```,报错```key must be str```
	* value就是每条日记是一个dict
	```python
	diary = {'time':edit_time, 'diary':newdiary}
	```
	* diary也可以设计为list,```[<time>,<diary>]```,但若增加其他的tag,author之类的功能之后,获取数据的时候会需要知道index,没有dict读取方便简洁
* 测试kvdb的几项基本功能
	* 设置key的值是value ```kv.set(key,diary)```
	* 获取key的值```kv.get(key)```返回的是diary的内容
	* ```kv.get_by_prefix('key')```是查找前缀是'key'的key/value pair,返回的是一个generator,例如可以在循环中返回(key,value)的tuple

### 改写```read_diary```和```write_diary```
* 一开始设想是```write_diary(newdiary,count)``` 把count设置为计数用,即可以加在key后作为key值,写进diary更新了database,在函式最后```count +=1 ```后```return count```就可以知道下次写新日记的时候是第几条.以及```read_diary(count)```也可以用个小循环一条条读取diary ([版本记录](https://github.com/bambooom/OMOOC2py/commit/bd8a31c675e86f52db2fe473be22e4b497ab5bd1))
* 然后想到可以用```kv.get_by_prefix('key')```循环,就不需要count作为```read_diary()```的参数了,仅作为key值的计数即可.
* 另外```read_diary()```本来设置读取的log是一个list,因为list可以很容易的用```len()```知道有多少条日记,但因为使用bottle的template返回的html需要string的参数,所以同时增加了一个string的log.([版本记录]((https://github.com/bambooom/OMOOC2py/commit/f6aeedafb81bc36edc019cf617d7632bb13b217c))

## 3.增加tag输入
* 先在template内添加tag的输入框 ```标签: <input type="text" name="tag" size="30"/>```<commit_msg>update 5wdiarysae.md<commit_after>### 5w MyDiary SAE

# 背景知识
* PaaS - Platform as a Service平台即服务
    * [wiki](https://en.wikipedia.org/wiki/Platform_as_a_service)
    * 一种云计算服务
    * 用户可以在平台上面开发,运行,管理web application,用户不需要管理和控制基础设施
    * 比如Google App Engine
* SAE - Sina App Engine[新浪云应用](http://www.sinacloud.com/doc/sae/python/index.html)
    * 国内最大PaaS
* KVDB - [分布式key-value database](http://www.sinacloud.com/doc/sae/python/kvdb.html)
    * 可扩展NoSQL键值数据库服务
* [NoSQL](https://en.wikipedia.org/wiki/NoSQL) - Non SQL
    * 不使用传统的关系型数据库
    * 不使用SQL作为查询语言
    * 数据存储不需要固定的表格模式
    * 使用硬盘，或者把随机存储器作存储载体

---

# 任务记录
## 1.sae本地环境部署
* [安装sae](http://www.sinacloud.com/doc/sae/python/tools.html)
	* ```$ pip install sae-python-dev```
	* 或者github下载源码安装
* 在本地开发目录新建index.wsgi和config.yaml [参考](http://www.sinacloud.com/doc/sae/python/tutorial.html)
	* 应用配置文件config.yaml内容如下:
```
name: helloworld
version: 1
```	
	* 使用bottle的index.wsgi内容如下:

```python
from bottle import Bottle, run

import sae

app = Bottle()

@app.route('/')
def hello():
    return "Hello, world! - Bottle"

application = sae.create_wsgi_app(app)
```

* 在本地开发目录下运行测试

```$ dev_server.py```

* 访问http://localhost:8080就可以访问应用了

## 2.改写4w代码
### 使用kvdb替代本地txt文件

* [kvdb文档](http://www.sinacloud.com/doc/sae/python/kvdb.html)
* kvdb类似python的dict data type

```python
import sae
import sae.kvdb
kv=sae.kvdb.Client()
```

* 参考小赖的设计:
	* key值为key1,key2,key3....即有几条日记就是key#
		* key值必须为string
		* 一开始尝试直接设置数字为key,然后有新diary就```key+=1```,报错```key must be str```
	* value就是每条日记是一个dict
	```python
	diary = {'time':edit_time, 'diary':newdiary}
	```
	* diary也可以设计为list,```[<time>,<diary>]```,但若增加其他的tag,author之类的功能之后,获取数据的时候会需要知道index,没有dict读取方便简洁
* 测试kvdb的几项基本功能
	* 设置key的值是value ```kv.set(key,diary)```
	* 获取key的值```kv.get(key)```返回的是diary的内容
	* ```kv.get_by_prefix('key')```是查找前缀是'key'的key/value pair,返回的是一个generator,例如可以在循环中返回(key,value)的tuple

### 改写```read_diary```和```write_diary```
* 一开始设想是```write_diary(newdiary,count)``` 把count设置为计数用,即可以加在key后作为key值,写进diary更新了database,在函式最后```count +=1 ```后```return count```就可以知道下次写新日记的时候是第几条.以及```read_diary(count)```也可以用个小循环一条条读取diary ([版本记录](https://github.com/bambooom/OMOOC2py/commit/bd8a31c675e86f52db2fe473be22e4b497ab5bd1))
* 然后想到可以用```kv.get_by_prefix('key')```循环,就不需要count作为```read_diary()```的参数了,仅作为key值的计数即可.
* 另外```read_diary()```本来设置读取的log是一个list,因为list可以很容易的用```len()```知道有多少条日记,但因为使用bottle的template返回的html需要string的参数,所以同时增加了一个string的log.([版本记录]((https://github.com/bambooom/OMOOC2py/commit/f6aeedafb81bc36edc019cf617d7632bb13b217c))
* 学习了template里使用循环打印出日记,比较结构化,也就不需要string的log了.

## 3.增加tag输入
* 先在template内添加tag的输入框 ```标签: <input type="text" name="tag" size="30"/>```
{'fraction_non_alphanumeric': 0.17998111425873464, 'fraction_numerical': 0.02322946175637394, 'mean_word_length': 6.195652173913044, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 8, 'lorem ipsum': 0, 'www.': 10, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '873841', 'n_tokens_mistral': 3014, 'n_tokens_neox': 3062, 'n_words': 235}