- 博客(0)
- 资源 (7)
- 收藏
- 关注
Node.js实战 高清中文文字版
目录:
第一部分 Node基础
第1章 欢迎进入Node.js世界 2
1.1 构建于JavaScript之上 3
1.2 异步和事件触发:浏览器 4
1.3 异步和事件触发:服务器 5
1.4 DIRT程序 6
1.5 默认DIRT 8
1.5.1 简单的异步程序 9
1.5.2 Hello World HTTP服务器 10
1.5.3 流数据 10
1.6 小结 11
第2章 构建有多个房间的聊天室程序 12
2.1 程序概览 12
2.2 程序需求及初始设置 15
2.2.1 提供HTTP和WebSocket服务 15
2.2.2 创建程序的文件结构 16
2.2.3 指明依赖项 16
2.2.4 安装依赖项 17
2.3 提供HTML、CSS和客户端JavaScript的服务 18
2.3.1 创建静态文件服务器 19
2.3.2 添加HTML和CSS文件 21
2.4 用Socket.IO处理与聊天相关的消息 23
2.4.1 设置Socket.IO服务器 24
2.4.2 处理程序场景及事件 25
2.5 在程序的用户界面上使用客户端JavaScript 29
2.5.1 将消息和昵称/房间变更请求传给服务器 29
2.5.2 在用户界面中显示消息及可用房间 30
2.6 小结 34
第3章 Node编程基础 35
3.1 Node功能的组织及重用 36
3.1.1 创建模块 37
3.1.2 用module.exports微调模块的创建 39
3.1.3 用node_modules重用模块 40
3.1.4 注意事项 41
3.2 异步编程技术 42
3.2.1 用回调处理一次性事件 43
3.2.2 用事件发射器处理重复性事件 46
3.2.3 异步开发的难题 53
3.3 异步逻辑的顺序化 54
3.3.1 什么时候使用串行流程控制 55
3.3.2 实现串行化流程控制 56
3.3.3 实现并行化流程控制 58
3.3.4 利用社区里的工具 60
3.4 小结 61
第二部分 用Node开发Web程序
第4章 构建Node Web程序 64
4.1 HTTP服务器的基础知识 64
4.1.1 Node如何向开发者呈现HTTP请求 65
4.1.2 一个用“Hello World”做响应的HTTP服务器 67
4.1.3 读取请求头及设定响应头 67
4.1.4 设定HTTP响应的状态码 67
4.2 构建RESTful Web服务 68
4.2.1 用POST请求创建资源 69
4.2.2 用GET请求获取资源 71
4.2.3 用DELETE请求移除资源 72
4.3 提供静态文件服务 73
4.3.1 创建一个静态文件服务器 73
4.3.2 处理服务器错误 77
4.3.3 用fs.stat()实现先发制人的错误处理 77
4.4 从表单中接受用户输入 78
4.4.1 处理提交的表单域 78
4.4.2 用formidable处理上传的文件 81
4.4.3 计算上传进度 84
4.5 用HTTPS加强程序的安全性 85
4.6 小结 86
第5章 存储Node程序中的数据 87
5.1 无服务器的数据存储 88
5.1.1 内存存储 88
5.1.2 基于文件的存储 88
5.2 关系型数据库管理系统 91
5.2.1 MySQL 91
5.2.2 PostgreSQL 99
5.3 NoSQL数据库 100
5.3.1 Redis 101
5.3.2 MongoDB 105
5.3.3 Mongoose 107
5.4 小结 109
第6章 Connect 110
6.1 搭建一个Connect程序 111
6.2 Connect的工作机制 112
6.2.1 做日志的中间件 112
6.2.2 响应“hello world”的中间件 113
6.3 为什么中间件的顺序很重要 114
6.3.1 中间件什么时候不调用next() 114
6.3.2 用中间件的顺序执行认证 115
6.4 挂载中间件和服务器 115
6.4.1 认证中间件 116
6.4.2 显示管理面板的中间件 117
6.5 创建可配置中间件 118
6.5.1 创建可配置的logger中间件组件 119
6.5.2 构建路由中间件组件 120
6.5.3 构建一个重写URL的中间件组件 122
6.6 使用错误处理中间件 123
6.6.1 Connect的默认错误处理器 124
6.6.2 自行处理程序错误 124
6.6.3 使用多个错误处理中间件组件 125
6.7 小结 129
第7章 Connect自带的中间件 130
7.1 解析cookie、请求主体和查询字符串的中间件 131
7.1.1 cookieParser():解析HTTP cookie 131
7.1.2 bodyParser():解析请求主体 134
7.1.3 limit():请求主体的限制 135
7.1.4 query():查询字符串解析 137
7.2 实现Web程序核心功能的中间件 138
7.2.1 logger():记录请求 138
7.2.2 favicon():提供favicon 140
7.2.3 methodOverride():伪造HTTP方法 141
7.2.4 vhost():虚拟主机 143
7.2.5 session():会话管理 144
7.3 处理Web程序安全的中间件 148
7.3.1 basicAuth():HTTP基本认证 148
7.3.2 csrf():跨站请求伪造防护 150
7.3.3 errorHandler():开发错误处理 150
7.4 提供静态文件服务的中间件 152
7.4.1 static():静态文件服务 152
7.4.2 compress():压缩静态文件 154
7.4.3 directory():目录列表 156
7.5 小结 157
第8章 Express 158
8.1 生成程序骨架 160
8.1.1 安装Express的可执行程序 161
8.1.2 生成程序 162
8.1.3 探索程序 162
8.2 配置Express和你的程序 164
8.3 渲染视图 166
8.3.1 视图系统配置 167
8.3.2 视图查找 169
8.3.3 把数据输出到视图中 171
8.4 处理表单和文件上传 175
8.4.1 实现照片模型 175
8.4.2 创建照片上传表单 176
8.4.3 显示上传照片列表 178
8.5 创建资源下载 179
8.5.1 创建照片下载路由 179
8.5.2 实现照片下载路由 180
8.6 小结 182
第9章 Express进阶 183
9.1 认证用户 184
9.1.1 保存和加载用户 184
9.1.2 注册新用户 189
9.1.3 已注册用户登录 194
9.1.4 用户加载中间件 197
9.2 先进的路由技术 199
9.2.1 校验用户内容提交 199
9.2.2 特定路由中间件 202
9.2.3 实现分页 205
9.3 创建一个公开的REST API 208
9.3.1 设计API 208
9.3.2 添加基本的认证 209
9.3.3 实现路由 209
9.3.4 启用内容协商 212
9.4 错误处理 214
9.4.1 处理404错误 215
9.4.2 处理错误 217
9.5 小结 220
第10章 测试Node程序 221
10.1 单元测试 222
10.1.1 assert模块 222
10.1.2 Nodeunit 225
10.1.3 Mocha 227
10.1.4 Vows 232
10.1.5 should.js 234
10.2 验收测试 235
10.2.1 Tobi 236
10.2.2 Soda 237
10.3 小结 239
第11章 Web程序模板 240
11.1 用模板保持代码的整洁性 240
11.2 嵌入JavaScript的模板 244
11.2.1 创建模板 245
11.2.2 用EJS过滤器处理模板数据 246
11.2.3 将EJS集成到你的程序中 249
11.2.4 在客户端程序中使用EJS 250
11.3 使用Mustache模板语言与Hogan 251
11.3.1 创建模板 251
11.3.2 Mustache标签 252
11.3.3 微调Hogan 254
11.4 用Jade做模板 255
11.4.1 Jade基础知识 256
11.4.2 Jade模板中的逻辑 258
11.4.3 组织Jade模板 260
11.5 小结 264
第三部分 在Node中更进一步
第12章 部署Node程序并维持正常运行时间 266
12.1 安置Node程序 266
12.1.1 专用的和虚拟私有服务器 267
12.1.2 云主机 268
12.2 部署的基础知识 269
12.2.1 从Git存储库部署 270
12.2.2 让Node保持运行 270
12.3 让正常运行时间和性能达到最优 271
12.3.1 用Upstart维护正常运行时间 272
12.3.2 集群API:利用多核的优势 273
12.3.3 静态文件及代理 275
12.4 小结 277
第13章 超越Web服务器 278
13.1 Socket.IO 278
13.1.1 创建一个最小的Socket.IO程序 279
13.1.2 用Socket.IO触发页面和CSS的重新加载 281
13.1.3 Socket.IO的其他用法 283
13.2 深入TCP/IP网络 284
13.2.1 处理缓冲区和二进制数据 284
13.2.2 创建TCP服务器 286
13.2.3 创建TCP客户端 289
13.3 跟操作系统交互的工具 290
13.3.1 单例的全局process对象 291
13.3.2 使用文件系统模块 293
13.3.3 繁衍外部进程 296
13.4 开发命令行工具 301
13.4.1 解析命令行参数 301
13.4.2 处理stdin和stdout 302
13.4.3 添加彩色的输出 304
13.5 小结 306
第14章 Node生态系统 307
14.1 给Node开发人员的在线资源 308
14.1.1 Node和模块的参考资料 308
14.1.2 Google群组 309
14.1.3 IRC 309
14.1.4 GitHub问题列表 310
14.2 GitHub 310
14.2.1 GitHub入门 311
14.2.2 添加一个项目到GitHub中 312
14.2.3 用GitHub协作 314
14.3 为npm库做贡献 316
14.3.1 准备包 317
14.3.2 编写包规范 317
14.3.3 测试和发布包 318
14.4 小结 320
附录A 安装Node和社区附加组件 321
附录B 调试Node 329
附录C Express的扩展及配置 336
2018-04-28
RabbitMQ实战 高效部署分布式消息队列完整版带书签
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
2018-04-28
progit 教程 官方版
本想免费,但是没找到免费方法,可以自行下载
https://github.com/progit/progit2-zh/releases/download/2.1.9/progit_v2.1.9.pdf
2018-04-17
与孩子一起学编程中文版
与孩子一起学编程(中文完整版).pdf
一本老少咸宜的编程入门奇书!一册在手,你完全可以带着自己的孩子,跟随Sande父子组合在轻松的氛围中熟悉那些编程概念,如内存、循环、输入和输出、数据结构和图形用户界面等。这些知识一点儿也不高深,听起来备感亲切,书中言语幽默风趣而不失真义,让学习过程充满乐趣。细心的作者还配上了孩子们都喜欢的可爱漫画和经过运行测试的程序示例,教你用最易编写和最易理解的Python语言,写出你梦想中的游戏程序。, “Hello, World!我来了!”编程乐趣无穷,起点就在脚下,请引导你的孩子走进这奇妙的世界。无论是中小学生还是其他初学者,都可以跟随本书学习Python编程,并过渡到任何其他语言,重要的是你将学会思考问题和解决问题的方法。
2018-04-16
流畅的 python 中文版
前言 xvii
第一部分 序幕
第1章 Python 数据模型 2
1.1 一摞 Python 风格的纸牌 3
1.2 如何使用特殊方法 6
1.2.1 模拟数值类型 7
1.2.2 字符串表示形式 9
1.2.3 算术运算符 10
1.2.4 自定义的布尔值 10
1.3 特殊方法一览 10
1.4 为什么 len 不是普通方法 12
1.5 本章小结 12
1.6 延伸阅读 13
第二部分 数据结构
第2章 序列构成的数组 16
2.1 内置序列类型概览 17
2.2 列表推导和生成器表达式 18
2.3 元组不仅仅是不可变的列表 22
2.4 切片 28
2.5 对序列使用 + 和 * 31
2.6 序列的增量赋值 33
2.7 list.sort 方法和内置函数 sorted 36
2.8 用 bisect 来管理已排序的序列 37
2.9 当列表不是首选时 41
2.10 本章小结 49
2.11 延伸阅读 50
第3章 字典和集合 54
3.1 泛映射类型 54
3.2 字典推导 56
3.3 常见的映射方法 57
3.4 映射的弹性键查询 61
3.5 字典的变种 65
3.6 子类化 UserDict 65
3.7 不可变映射类型 67
3.8 集合论 68
3.9 dict 和 set 的背后 73
3.10 本章小结 80
3.11 延伸阅读 81
第4章 文本和字节序列 83
4.1 字符问题 84
4.2 字节概要 85
4.3 基本的编解码器 88
4.4 了解编解码问题 89
4.5 处理文本文件 94
4.6 为了正确比较而规范化 Unicode 字符串 99
4.7 Unicode 文本排序 105
4.8 Unicode 数据库 108
4.9 支持字符串和字节序列的双模式 API 109
4.10 本章小结 112
4.11 延伸阅读 113
第三部分 把函数视作对象
第5章 一等函数 118
5.1 把函数视作对象 119
5.2 高阶函数 120
5.3 匿名函数 122
5.4 可调用对象 122
5.5 用户定义的可调用类型 123
5.6 函数内省 124
5.7 从定位参数到仅限关键字参数 126
5.8 获取关于参数的信息 127
5.9 函数注解 131
5.10 支持函数式编程的包 132
5.11 本章小结 137
5.12 延伸阅读 137
第6章 使用一等函数实现设计模式 141
6.1 案例分析:重构“策略”模式 142
6.2 “命令”模式 150
6.3 本章小结 151
6.4 延伸阅读 152
第7章 函数装饰器和闭包 154
7.1 装饰器基础知识 155
7.2 Python 何时执行装饰器 156
7.3 使用装饰器改进“策略”模式 157
7.4 变量作用域规则 159
7.5 闭包 161
7.6 nonlocal 声明 164
7.7 实现一个简单的装饰器 165
7.8 标准库中的装饰器 168
7.9 叠放装饰器 172
7.10 参数化装饰器 173
7.11 本章小结 177
7.12 延伸阅读 178
第四部分 面向对象惯用法
第8章 对象引用、可变性和垃圾回收 182
8.1 变量不是盒子 183
8.2 标识、相等性和别名 184
8.3 默认做浅复制 187
8.4 函数的参数作为引用时 190
8.5 del 和垃圾回收 195
8.6 弱引用 196
8.7 Python 对不可变类型施加的把戏 199
8.8 本章小结 201
8.9 延伸阅读 201
第9章 符合 Python 风格的对象 205
9.1 对象表示形式 206
9.2 再谈向量类 206
9.3 备选构造方法 208
9.4 classmethod 与 staticmethod 209
9.5 格式化显示 210
9.6 可散列的 Vector2d 213
9.7 Python 的私有属性和“受保护的”属性 218
9.8 使用 __slots__ 类属性节省空间 220
9.9 覆盖类属性 222
9.10 本章小结 224
9.11 延伸阅读 225
第10章 序列的修改、散列和切片 229
10.1 Vector 类:用户定义的序列类型 230
10.2 Vector 类第1 版:与 Vector2d 类兼容 230
10.3 协议和鸭子类型 232
10.4 Vector 类第2 版:可切片的序列 233
10.5 Vector 类第3 版:动态存取属性 237
10.6 Vector 类第4 版:散列和快速等值测试 240
10.7 Vector 类第5 版:格式化 244
10.8 本章小结 251
10.9 延伸阅读 251
第11章 接口:从协议到抽象基类 256
11.1 Python 文化中的接口和协议 257
11.2 Python 喜欢序列 258
11.3 使用猴子补丁在运行时实现协议 260
11.4 Alex Martelli 的水禽 262
11.5 定义抽象基类的子类 266
11.6 标准库中的抽象基类 267
11.7 定义并使用一个抽象基类 270
11.8 Tombola 子类的测试方法 278
11.9 Python 使用 register 的方式 281
11.10 鹅的行为有可能像鸭子 281
11.11 本章小结 283
11.12 延伸阅读 284
第12章 继承的优缺点 289
12.1 子类化内置类型很麻烦 289
12.2 多重继承和方法解析顺序 292
12.3 多重继承的真实应用 296
12.4 处理多重继承 298
12.5 一个现代示例:Django 通用视图中的混入 301
12.6 本章小结 304
12.7 延伸阅读 304
第13章 正确重载运算符 307
13.1 运算符重载基础 308
13.2 一元运算符 308
13.3 重载向量加法运算符 + 310
13.4 重载标量乘法运算符 * 315
13.5 众多比较运算符 318
13.6 增量赋值运算符 321
13.7 本章小结 325
13.8 延伸阅读 326
第五部分 控制流程
第14章 可迭代的对象、迭代器和生成器 330
14.1 Sentence 类第1 版:单词序列 331
14.2 可迭代的对象与迭代器的对比 334
14.3 Sentence 类第2 版:典型的迭代器 337
14.4 Sentence 类第3 版:生成器函数 339
14.5 Sentence 类第4 版:惰性实现 343
14.6 Sentence 类第5 版:生成器表达式 344
14.7 何时使用生成器表达式 345
14.8 另一个示例:等差数列生成器 346
14.9 标准库中的生成器函数 349
14.10 Python 3.3 中新出现的句法: yield from 357
14.11 可迭代的归约函数 358
14.12 深入分析 iter 函数 359
14.13 案例分析:在数据库转换工具中使用生成器 360
14.14 把生成器当成协程 362
14.15 本章小结 362
14.16 延伸阅读 363
第15章 上下文管理器和 else 块 368
15.1 先做这个,再做那个: if 语句之外的 else 块 369
15.2 上下文管理器和 with 块 370
15.3 contextlib 模块中的实用工具 374
15.4 使用 @contextmanager 375
15.5 本章小结 378
15.6 延伸阅读 378
第16章 协程 381
16.1 生成器如何进化成协程 382
16.2 用作协程的生成器的基本行为 382
16.3 示例:使用协程计算移动平均值 385
16.4 预激协程的装饰器 386
16.5 终止协程和异常处理 388
16.6 让协程返回值 391
16.7 使用 yield from 393
16.8 yield from 的意义 398
16.9 使用案例:使用协程做离散事件仿真 403
16.10 本章小结 410
16.11 延伸阅读 411
第17章 使用期物处理并发 416
17.1 示例:网络下载的三种风格 416
17.2 阻塞型 I/O 和 GIL 424
17.3 使用 concurrent.futures 模块启动进程 424
17.4 实验 Executor.map 方法 426
17.5 显示下载进度并处理错误 429
17.6 本章小结 437
17.7 延伸阅读 438
第18章 使用 asyncio 包处理并发 442
18.1 线程与协程对比 443
18.2 使用 asyncio 和 aiohttp 包下载 450
18.3 避免阻塞型调用 454
18.4 改进 asyncio 下载脚本 456
18.5 从回调到期物和协程 462
18.6 使用 asyncio 包编写服务器 466
18.7 本章小结 475
18.8 延伸阅读 476
第六部分 元编程
第19章 动态属性和特性 482
19.1 使用动态属性转换数据 483
19.2 使用特性验证属性 498
19.3 特性全解析 500
19.4 定义一个特性工厂函数 504
19.5 处理属性删除操作 506
19.6 处理属性的重要属性和函数 507
19.7 本章小结 510
19.8 延伸阅读 510
第20章 属性描述符 514
20.1 描述符示例:验证属性 514
20.2 覆盖型与非覆盖型描述符对比 526
20.3 方法是描述符 531
20.4 描述符用法建议 533
20.5 描述符的文档字符串和覆盖删除操作 534
20.6 本章小结 535
20.7 延伸阅读 536
第21章 类元编程 538
21.1 类工厂函数 539
21.2 定制描述符的类装饰器 541
21.3 导入时和运行时比较 543
21.4 元类基础知识 547
21.5 定制描述符的元类 552
21.6 元类的特殊方法 __prepare__ 554
21.7 类作为对象 556
21.8 本章小结 557
21.9 延伸阅读 557
结语 560
附录 A 辅助脚本 563
Python 术语表 588
作者简介 600
关于封面 600
2018-04-05
PYTHON自然语言处理【中文版】
自然语言处理(natural language processing,nlp)是计算机科学领域与人工智能领域中的一个重要方向。它研究能够实现人与计算机之间用自然语言进行有效通信的各种理论和方法,涉及所有用计算机对自然语言进行的操作。
《python自然语言处理》是自然语言处理领域的一本实用入门指南,旨在帮助读者学习如何编写程序来分析书面语言。本书基于python编程语言以及一个名为nltk的自然语言工具包的开源库;但并不要求读者有python编程的经验。全书共11章,按照难易程度顺序编排。第1章到3章介绍了语言处理的基础,讲述如何使用小的python程序分析感兴趣的文本信息。第4章讨论结构化程序设计,以巩固前面几章中介绍的编程要点。第5章到第7章介绍语言处理的基本原理,包括标注、分类和信息提取等。第8章到第10章介绍了句子解析、句法结构识别和句意表达方法。第11章介绍了如何有效管理语言数据。后记部分简要讨论了nlp领域的过去和未来。
《python自然语言处理》的实践性很强,包括上百个实际可用的例子和分级练习。本书可供读者用于自学,也可以作为自然语言处理或计算语言学课程的教科书,或是人工智能、文本挖掘、语料库语言学等课程的补充读物。
《python
自然语言处理》
第1章 语言处理与python 1
1.1 语言计算:文本和词汇 1
1.2 近观python:将文本当做词链表 10
1.3 计算语言:简单的统计 17
1.4 回到python:决策与控制 24
1.5 自动理解自然语言 29
1.6 小结 35
1.7 深入阅读 36
1.8 练习 37
第2章 获得文本语料和词汇资源 41
2.1 获取文本语料库 41
2.2 条件频率分布 55
2.3 更多关于python:代码重用 60
2.4 词典资源 63
2.5 wordnet 72
2.6 小结 78
2.7 深入阅读 79
2.8 练习 80
第3章 处理原始文本 84
3.1 从网络和硬盘访问文本 84
3.2 字符串:最底层的文本处理 93
3.3 使用unicode进行文字处理 100
3.4 使用正则表达式检测词组搭配 105
3.5 正则表达式的有益应用 109
3.6 规范化文本 115
3.7 用正则表达式为文本分词 118
3.8 分割 121
3.9 格式化:从链表到字符串 126
3.10 小结 132
3.11 深入阅读 133
3.12 练习 134
第4章 编写结构化程序 142
4.1 回到基础 142
4.2 序列 147
4.3 风格的问题 152
4.4 函数:结构化编程的基础 156
4.5 更多关于函数 164
4.6 程序开发 169
4.7 算法设计 175
4.8 python库的样例 183
4.9 小结 188
4.10 深入阅读 189
4.11 练习 189
第5章 分类和标注词汇 195
5.1 使用词性标注器 195
5.2 标注语料库 197
5.3 使用python字典映射词及其属性 206
5.4 自动标注 216
5.5 n-gram标注 221
5.6 基于转换的标注 228
5.7 如何确定一个词的分类 230
5.8 小结 233
5.9 深入阅读 234
5.10 练习 235
第6章 学习分类文本 241
6.1 监督式分类 241
6.2 监督式分类的举例 254
6.3 评估 258
6.4 决策树 263
6.5 朴素贝叶斯分类器 266
6.6 最大熵分类器 271
6.7 为语言模式建模 275
6.8 小结 276
6.9 深入阅读 277
6.10 练习 278
第7章 从文本提取信息 281
7.1 信息提取 281
7.2 分块 284
7.3 开发和评估分块器 291
7.4 语言结构中的递归 299
7.5 命名实体识别 302
7.6 关系抽取 306
7.7 小结 307
7.8 深入阅读 308
7.9 练习 308
第8章 分析句子结构 312
8.1 一些语法困境 312
8.2 文法的用途 316
8.3 上下文无关文法 319
8.4 上下文无关文法分析 323
8.5 依存关系和依存文法 332
8.6 文法开发 336
8.7 小结 343
8.8 深入阅读 344
8.9 练习 344
第9章 建立基于特征的文法 349
9.1 文法特征 349
9.2 处理特征结构 359
9.3 扩展基于特征的文法 367
9.4 小结 379
9.5 深入阅读 380
9.6 练习 381
第10章 分析语句的含义 384
10.1 自然语言理解 384
10.2 命题逻辑 391
10.3 一阶逻辑 395
10.4 英语语句的语义 409
10.5 段落语义层 422
10.6 小结 428
10.7 深入阅读 429
10.8 练习 430
第11章 语言数据管理 434
11.1 语料库结构:案例研究 434
11.2 语料库生命周期 439
11.3 数据采集 443
11.4 使用xml 452
11.5 使用toolbox数据 459
11.6 使用olac元数据描述语言资源 463
11.7 小结 466
11.8 深入阅读 466
11.9 练习 467
后记 470
参考文献 476
2018-04-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人