From e5ffe94f00175a9e81cc71f5c6dd39efad23dcf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Tue, 24 Feb 2015 15:43:06 +0100 Subject: [PATCH 001/432] GitBook Example --- .gitignore | 16 ++++++++++++++++ README.md | 4 ++++ SUMMARY.md | 3 +++ chapter1.md | 3 +++ 4 files changed, 26 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 SUMMARY.md create mode 100644 chapter1.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..1a366fb0b --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# Node rules: +## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +## Dependency directory +## Commenting this out is preferred by some people, see +## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git +node_modules + +# Book build output +_book + +# eBook build output +*.epub +*.mobi +*.pdf \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..d2145ed99 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +My Awesome Book +======= + +This file file serves as your book's preface, a great place to describe your book's content and ideas. diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 000000000..84616cd78 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,3 @@ +# Summary + +* [First Chapter](chapter1.md) diff --git a/chapter1.md b/chapter1.md new file mode 100644 index 000000000..c0e22c649 --- /dev/null +++ b/chapter1.md @@ -0,0 +1,3 @@ +# First Chapter + +GitBook allows you to organize your book into chapters, each chapter is stored in a separate file like this one. From d8c86ff834aafe090f11eaa085561068214da384 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 14:40:12 +0800 Subject: [PATCH 002/432] 1st ci --- README.md | 26 +++++++++++++++++++++----- book.json | 19 +++++++------------ 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 7bf92a499..080995988 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,24 @@ -# 开智学院 编程课程 Python 入门班 私人教程 -~ 提供给学员一个有序的开始,作为脚手架,作为起点 +为什么有这本书 +======= +本书作为在开智学院编程课程学习文档书籍 记录自己的学习 经历 体验 -提供: +学习是个积累的过程 踏踏实实地走 路上难免跌倒 入坑 +记录自己的学习过程 是一个输出的过程 是巩固的过程 是自我反馈激励的过程 +所以有了这本书 持续成长 看见成长的自己 -- 一个 gitbook 最小图书框架 -- 一个 配合课程每周开发任务的目录树 +- 明确一点 应该是**教程** 能教会6个月前 那个不会的自己 `*`增补 + +## 作者 + +- [入学三问](https://github.com/JeremiahZhang/gopython/blob/master/PY-StarTrek-Prepare/2015-9-10-T2-%E5%85%A5%E5%AD%A6%E4%B8%89%E9%97%AE.md) +- Leiyu ([雷雨Jeremiah](http://weibo.com/1784386944/profile?topnav=1&wvr=6)) +- 个人成长博客 [Renew Mind](http://jeremiahzhang.github.io/) + + +## 目标 + + +## ( ̄▽ ̄) + +10/9/2015 `*`增补 diff --git a/book.json b/book.json index df19e9765..6f6cca560 100644 --- a/book.json +++ b/book.json @@ -1,13 +1,8 @@ -{"title": "开智学院 编程课程 Python 入门班 私人教程模板", - "version": "15.9.18,2020", - "description": "OMOOC.py tutorial for teching", - "author": "OMOOC-support ", - - "plugins": [ - "disqus" - ], +{ + "plugins": ["disqus"], "pluginsConfig": { - "shortName": "Openmindclub" - } -} - + "disqus": { + "shortName": "LeiyuZhang" + } + } +} \ No newline at end of file From c026b1aaa6d03d9b68774c69045d69139b53c69f Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 15:08:43 +0800 Subject: [PATCH 003/432] mod summary 1st --- SUMMARY.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/SUMMARY.md b/SUMMARY.md index cc52ebea0..addedc79b 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,8 +1,23 @@ # Summary +- [Tools](toolssupport/README.md) + - [Windows Setting](toolssupport/win7.md) + - [Learn Git](toolssupport/learngit.md) + - [windows setting](toolssupport/win7.md) + - [Gitbook](toolssupport/gitbook.md) + - [ST2与Py环境配置](toolssupport/SubPy.md) + - [双推](toolssupport/doublepush.md) - [教学反转](0MOOC/README.md) + - [week_1_交互](04_task/week01_interact.md) - [基础旋进](1sTry/README.md) + - [week_0](1sTry/week_0.md) + - [42行代码](1sTry/0wd0-task-42-code-fundamental-problem.md) + - [从源开始](1sTry/0wd1-reflection.md) + - [Sth New](1sTry/0wd2-New-things-to-learn.md) + - [苟日新](1sTry/0wd3-step-by-step-4_7-8.md) - [迭代作品](2nDev/README.md) - [人生首秀](3rDemo/README.md) +- [人如何学习的](4learn/README.md) + - [Renewminding](4learn/0wd4-OpenCourse-Note.md) - [代码 (_src)](_src/README.md) - [素材 (draft)](draft/README.md) + [教程该怎么写](draft/how2tutorial.md) From 6374696d0a5a8cef2655f849ddcbc9f625bc2a7b Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 15:19:33 +0800 Subject: [PATCH 004/432] transfer from pybeginner 1st ci --- 0MOOC/SubPy.md | 1 + 0MOOC/doublepush.md | 1 + 0MOOC/gitbook.md | 1 + 0MOOC/learngit.md | 1 + 0MOOC/win7.md | 1 + .../0wd0-task-42-code-fundamental-problem.md | 81 ++++++++++++ 1sTry/0wd1-reflection.md | 30 +++++ 1sTry/0wd2-New-things-to-learn.md | 76 +++++++++++ 1sTry/0wd3-step-by-step-4_7-8.md | 40 ++++++ 1sTry/bottle.md | 12 -- 1sTry/kvdb.md | 12 -- 1sTry/nose.md | 12 -- 1sTry/qpy.md | 12 -- 1sTry/requests.md | 12 -- 1sTry/restful.md | 12 -- 1sTry/sae.md | 12 -- 1sTry/sqlite.md | 12 -- 1sTry/week_0.md | 22 +++ 2nDev/week01_interact.md | 1 + 4Learn/0wd4-OpenCourse-Note.md | 125 ++++++++++++++++++ 4Learn/README.md | 21 +++ SUMMARY.md | 18 +-- 22 files changed, 410 insertions(+), 105 deletions(-) create mode 100644 0MOOC/SubPy.md create mode 100644 0MOOC/doublepush.md create mode 100644 0MOOC/gitbook.md create mode 100644 0MOOC/learngit.md create mode 100644 0MOOC/win7.md create mode 100644 1sTry/0wd0-task-42-code-fundamental-problem.md create mode 100644 1sTry/0wd1-reflection.md create mode 100644 1sTry/0wd2-New-things-to-learn.md create mode 100644 1sTry/0wd3-step-by-step-4_7-8.md delete mode 100644 1sTry/bottle.md delete mode 100644 1sTry/kvdb.md delete mode 100644 1sTry/nose.md delete mode 100644 1sTry/qpy.md delete mode 100644 1sTry/requests.md delete mode 100644 1sTry/restful.md delete mode 100644 1sTry/sae.md delete mode 100644 1sTry/sqlite.md create mode 100644 1sTry/week_0.md create mode 100644 2nDev/week01_interact.md create mode 100644 4Learn/0wd4-OpenCourse-Note.md create mode 100644 4Learn/README.md diff --git a/0MOOC/SubPy.md b/0MOOC/SubPy.md new file mode 100644 index 000000000..911e01129 --- /dev/null +++ b/0MOOC/SubPy.md @@ -0,0 +1 @@ +# ST2与Py环境配置 diff --git a/0MOOC/doublepush.md b/0MOOC/doublepush.md new file mode 100644 index 000000000..a07f8bf83 --- /dev/null +++ b/0MOOC/doublepush.md @@ -0,0 +1 @@ +# 双推 diff --git a/0MOOC/gitbook.md b/0MOOC/gitbook.md new file mode 100644 index 000000000..32be37ba4 --- /dev/null +++ b/0MOOC/gitbook.md @@ -0,0 +1 @@ +# Gitbook diff --git a/0MOOC/learngit.md b/0MOOC/learngit.md new file mode 100644 index 000000000..b38dc9366 --- /dev/null +++ b/0MOOC/learngit.md @@ -0,0 +1 @@ +# Learn Git diff --git a/0MOOC/win7.md b/0MOOC/win7.md new file mode 100644 index 000000000..e07692709 --- /dev/null +++ b/0MOOC/win7.md @@ -0,0 +1 @@ +# Windows Setting diff --git a/1sTry/0wd0-task-42-code-fundamental-problem.md b/1sTry/0wd0-task-42-code-fundamental-problem.md new file mode 100644 index 000000000..4350b5d03 --- /dev/null +++ b/1sTry/0wd0-task-42-code-fundamental-problem.md @@ -0,0 +1,81 @@ +# 那42行 + +## 现象 ## + +- 根据 [极简Python上手导念](http://wiki.zoomquiet.io/pythonic/MinimalistPyStart) 中的一页解说了 Python 代码 + - ![42 coder](http://wiki.woodpecker.org.cn/moin/ZqQuickIntoPy?action=AttachFile&do=get&target=coffeeghost-q-in-py.png) +- 会解说了 但是如何去运用 将其功能化呢?[代码解说](https://github.com/JeremiahZhang/pybeginner/blob/master/_src/om2py0w/0wex0/main.py) +- 这42行代码: + + 包含80%左右的 py 代码常见情景 + + 常见情景是什么? + + main 函数 调用 循环 print 等等 + + 是不是类似 欧式几何 中 那些 定义 公设 公理 + + 用**常见情景**(定义 公设 公理) 去 实现(证明)其他功能(命题)呢? + +---------- + +## 问题 ## + +任务是 将那42行 功能化 + +- 那么如何去功能化? ( 用怎么去证明其他命题思路去想) + +## 分析 ## + +- 什么功能化? + + 总要确定命题 才能证明吧 + + 寻找 探寻 +- 如何实现? + + 参考 运用 那 42行代码 + +## 方案 ## + +- 构思功能 +- 去实现功能 +- 教程 + + 功能设计 + + 技术要点 + + 实现难点 + + 涉及知识 + + etc + +---------- + +## 执行 + +- 构思功能 + + 到底是什么功能呢? + + 视野不广 去扩宽 + + 知识不够 去学习 + + github 是个好地方 小程序功能去找 find this repo [Show me the code](https://github.com/Show-Me-the-Code/python) + + OK show me the code as Linus says + + 题目:[0000](https://github.com/JiYouMCC/python-show-me-the-code/tree/master/0000) + > 第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果 +- 构思过程 + + 思维导图 +- 执行 + + code [the code](https://github.com/JiYouMCC/python-show-me-the-code/blob/e0c7c1c37ccba38671078e0b0ff6238992a11499/0000/0000.py) + + Python Image Library install + + choose and install [Pillow 3.0.0](https://pypi.python.org/pypi/Pillow/2.2.1) 由此参考回答[Installing PIL with pip](http://stackoverflow.com/questions/20060096/installing-pil-with-pip)对于小白的我 这个需要使用命令行 我用babun + + $ pip install Pillow + + 安装之后如何使用呢?因为只有`from PIL import Image`是没有用的 error 显示找不到图片 搜了好多 最后在此处 [The Image Module](http://effbot.org/imagingbook/image.htm) 发现答案 【先从help -> google key word is very important】 + + 没有在当前工作目录中 放入所用的图片【掉入的坑 好久才爬出来 适当休息】 + + 图像是在当前工作目录中的 + + save 的也是 + + 关于Image可以在[这里](http://effbot.org/imagingbook/image.htm)找到help + + run successed as below + + ![narresult](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_src/om2py0w/0wex1/nar_result.png) ++ 收获 + + 库的安装 使用 及其查询 + + PIL Python Image Library Pillow + + the image module + + help 文档检索为先 ++ 总 + + 在运行别人的代码 + + 发现问题 自己理解 + + 但是如何去自行编码独立完成呢? 需要一步步积累 + +代码:[https://github.com/JeremiahZhang/pybeginner/tree/master/_src/om2py0w/0wex1](https://github.com/JeremiahZhang/pybeginner/tree/master/_src/om2py0w/0wex1 "今日代码") + +10/11/2015 3h \ No newline at end of file diff --git a/1sTry/0wd1-reflection.md b/1sTry/0wd1-reflection.md new file mode 100644 index 000000000..dae787ccf --- /dev/null +++ b/1sTry/0wd1-reflection.md @@ -0,0 +1,30 @@ +# 从源头开始 # + +- if python then coding +- 从 [官方python tutorial](https://docs.python.org/2/tutorial/) 以前总是二手的教程 blog开始 最好的教程 应该是源头的教程 官方的 + + chapter 1-3 coding and end reading + + codes is in my pybeginner + + 难度不大 就是在练习技术 + + 掌握 核心数据类型 + + numbers + + strings + + unicode strings + + list + + time 近 6个蕃茄 +- summary + + 挑战级别2颗星 和昨天的那个 show me the code 0000 题相比 + + 大多数在那42行代码中运行到了 只是在填充数 构建python结构框架 + + 接下来 + - [] py tutorial + - [x] statements `if` `for` `break` `continue` `pass` + - [x] `else` clauses On Loops + - [x] `range()` function + - [] `def` function + - argument + - [] coding style + - [] 完成简单工程行为 + +代码:[https://github.com/JeremiahZhang/pybeginner/tree/master/_src/om2py0w/0wex2](https://github.com/JeremiahZhang/pybeginner/tree/master/_src/om2py0w/0wex2) + +10/12/2015 9:39:25 PM +10/13/2015 9:18:46 PM 完成 以上3个x diff --git a/1sTry/0wd2-New-things-to-learn.md b/1sTry/0wd2-New-things-to-learn.md new file mode 100644 index 000000000..5b1ca20f2 --- /dev/null +++ b/1sTry/0wd2-New-things-to-learn.md @@ -0,0 +1,76 @@ +# New Things to Learn # + +- coding through [2.7.10 tutorial](https://docs.python.org/2/tutorial/) +- Something Learned + - `if` statement + - `for` statement + - the `range()` function + - `range(5, 10, step)` 值得注意的是取数乃是这样的 范围[ ) step 默认为1 + - `range()` 与list的结合 + + 简化为:`for i, v in enumerate(['Mary', 'had', 'a', 'litter', 'lamb']):` + - `break` and `continue` statement + - break 是哪里 打破 最近的 Loops + - continue 又是继续的哪里 最近的 Loops + - `else` 不要受制于 matlab 的`else` Python的`else`可用于Loops + - `pass` statement + - Define functions 与c中的类似 + + default argument values + + Keyword arguments 这个比较鲜活 + +## 新知 ## + + def cheeseshop(kind, *arguments, **keywords): + print '-- do you have any', kind, "?" + print "-- I am sorry, we're all out of", kind + for arg in arguments: + print arg + print '-' * 40 + keys = sorted(keywords.keys()) + for kw in keys: + print kw, ":", keywords[kw] + + cheeseshop("limburger", "it's very runny, sir.", "It's really very, Very runny, sir.", shopkeeper = 'Michael Palin', client = 'John Cleese', sketch = 'cheese shop sketch') + +- `*name01` 与 `**name02` 先后顺序 +- 涉及 dictionary 还未细看 下一步着手 +- `keys = sorted(keywords.keys())` +- 看输出结果 + + -- do you have any limburger ? + -- I am sorry, we're all out of limburger + it's very runny, sir. + It's really very, Very runny, sir. + + client : John Cleese + shopkeeper : Michael Palin + sketch : cheese shop sketch + + 明白 + + 但是为什么呢? + + kind 参数 只能是第一个 "limburger" + + *arguments 参数 "it's very runny, sir.", "It's really very, Very runny, sir. + + **keywords 参数 其他剩余 + + `keys = sorted(keywords.keys())` 不明白 进一步需要了解 Dic 再回来 看这个 confused codes +- When ? +- How to use them? + +## Next## + +- [] dictionary dive in 官方help and [问题](http://stackoverflow.com/questions/17677523/python-keyword-output-interpretation) +- [] 4.7.3 Arbitrary Argument Lists +- [] 4.7.4 Unpacking Argument Lists +- [] 4.7.5. Lambda Expressions +- [] 4.7.6. Documentation Strings +- [] 4.8 Intermezzo: Coding Style + +---------- + +## SUM ## + +- Coding 下去 +- 7个蕃茄学习 1个蕃茄整理 +- 反思 + + 代码练了 没有去完成一个项目 自定义的项目 发现还是不怎么入脑 + + 那么的思考 完成一个 怎样有趣的项目 如同show me the code的 learn by doing + + 这么个循序渐进额可以 + +[今日代码](https://github.com/JeremiahZhang/pybeginner/tree/master/_src/om2py0w/0wex2) \ No newline at end of file diff --git a/1sTry/0wd3-step-by-step-4_7-8.md b/1sTry/0wd3-step-by-step-4_7-8.md new file mode 100644 index 000000000..e3745d6a8 --- /dev/null +++ b/1sTry/0wd3-step-by-step-4_7-8.md @@ -0,0 +1,40 @@ +# step by step # + +- [x] dictionary dive in 官方help and [问题](http://stackoverflow.com/questions/17677523/python-keyword-output-interpretation) + + `dict{}` + + 其中 key 顺序无关紧要 + + 也有长度 + + 排序好玩 + + `key` 的熟悉 + + dict.viewkeys + + dict.viewvalues + + 可删 +> 对dictionary熟悉了 只是在什么时候用 就不太清楚了 + +- [x] 4.7.3 Arbitrary Argument Lists +- [x] 4.7.4 Unpacking Argument Lists +- [x] 4.7.5. Lambda Expressions +- [x] 4.7.6. Documentation Strings +- [x] 4.8 Intermezzo: Coding Style + - 使用4-space来缩进 而非tabs 得改 + - wrap lines 代码行长度不要超过79character + + 就像matlab代码中 有一条竖线来提醒 要将代码控制在竖线左边 + + 好读代码 + - [x] 空白行分割 函数 class 在函数内部等等 + - [x] comment 注释 + - 使用docstrings 在 4.7.6中提到 + + 第一行 summary 精简 + + 第二行 空行 + + 第三行 writting + - [x] 在 `=` `+` etc operators 与 `,` 之后使用空格 + - 这个已成习惯 + - 如 `a = 1`, `b = a` + - 只是在用一个结构中 不需要就需注意了 + - `a=f(1,2)+g(3,4)`. + - [] Name your classes and functions consistently + - Always use self as the name for the first method argument + - [] Don’t use fancy encodings if your code is meant to be used in international environments. Plain ASCII works best in any case + +代码在此 [2015-10-14 codes](https://github.com/JeremiahZhang/pybeginner/tree/master/_src/om2py0w/0wex3) + +10/14/2015 10:40:03 PM 4+1蕃茄 but 3h \ No newline at end of file diff --git a/1sTry/bottle.md b/1sTry/bottle.md deleted file mode 100644 index 5e1cb5549..000000000 --- a/1sTry/bottle.md +++ /dev/null @@ -1,12 +0,0 @@ -# bottle 私人教程 - -## 背景 - -## 安装 - -## 配置 - -## 使用 - -## 体验 - diff --git a/1sTry/kvdb.md b/1sTry/kvdb.md deleted file mode 100644 index b599b22ca..000000000 --- a/1sTry/kvdb.md +++ /dev/null @@ -1,12 +0,0 @@ -# kvdb 私人教程 - -## 背景 - -## 安装 - -## 配置 - -## 使用 - -## 体验 - diff --git a/1sTry/nose.md b/1sTry/nose.md deleted file mode 100644 index 7cf22565f..000000000 --- a/1sTry/nose.md +++ /dev/null @@ -1,12 +0,0 @@ -# nose 私人教程 - -## 背景 - -## 安装 - -## 配置 - -## 使用 - -## 体验 - diff --git a/1sTry/qpy.md b/1sTry/qpy.md deleted file mode 100644 index 7d6edf2ac..000000000 --- a/1sTry/qpy.md +++ /dev/null @@ -1,12 +0,0 @@ -# qpy 私人教程 - -## 背景 - -## 安装 - -## 配置 - -## 使用 - -## 体验 - diff --git a/1sTry/requests.md b/1sTry/requests.md deleted file mode 100644 index 207595df9..000000000 --- a/1sTry/requests.md +++ /dev/null @@ -1,12 +0,0 @@ -# requests 私人教程 - -## 背景 - -## 安装 - -## 配置 - -## 使用 - -## 体验 - diff --git a/1sTry/restful.md b/1sTry/restful.md deleted file mode 100644 index 27f51b02c..000000000 --- a/1sTry/restful.md +++ /dev/null @@ -1,12 +0,0 @@ -# restful 私人教程 - -## 背景 - -## 安装 - -## 配置 - -## 使用 - -## 体验 - diff --git a/1sTry/sae.md b/1sTry/sae.md deleted file mode 100644 index e7ca6ad8c..000000000 --- a/1sTry/sae.md +++ /dev/null @@ -1,12 +0,0 @@ -# sae 私人教程 - -## 背景 - -## 安装 - -## 配置 - -## 使用 - -## 体验 - diff --git a/1sTry/sqlite.md b/1sTry/sqlite.md deleted file mode 100644 index f2438c7f9..000000000 --- a/1sTry/sqlite.md +++ /dev/null @@ -1,12 +0,0 @@ -# sqlite 私人教程 - -## 背景 - -## 安装 - -## 配置 - -## 使用 - -## 体验 - diff --git a/1sTry/week_0.md b/1sTry/week_0.md new file mode 100644 index 000000000..d95108809 --- /dev/null +++ b/1sTry/week_0.md @@ -0,0 +1,22 @@ +# week_0 + +- 配置学习环环境 + - github + - gitbook + +主要任务 + +- 根据 极简 Python 上手导念 中的一页解说 Python 代码 +- 录入为个人仓库中的 _src/om2py0w/0wex0/main.py +- 并将其功能化, 即: + - 基于现有 42 行代码涉及的能力 + - 设计一个可用的小功能 + - 并完成对应的开发教程,包含: + + 功能设计 + + 技术要点 + + 实现难点 + + 涉及知识 + + ... + - `嗯哼`: 运用 RDD(小黄鸭调试法) 面向半年前的自己述说过程中各种磨难就对了! +- 确保每一个可运行版本,都及时 push 到个人仓库中 +- (**提醒:** 过程中的各种中间版本非常重要,一定要及时 push 入仓库) \ No newline at end of file diff --git a/2nDev/week01_interact.md b/2nDev/week01_interact.md new file mode 100644 index 000000000..9e326420c --- /dev/null +++ b/2nDev/week01_interact.md @@ -0,0 +1 @@ +# week_1_交互 diff --git a/4Learn/0wd4-OpenCourse-Note.md b/4Learn/0wd4-OpenCourse-Note.md new file mode 100644 index 000000000..eaa99f0f8 --- /dev/null +++ b/4Learn/0wd4-OpenCourse-Note.md @@ -0,0 +1,125 @@ +# Rewminding in Coding and Everything + +10/15/2015 11:53:50 PM 听完大妈的公开课 总括是 + +- **编程思维**的培养必须要**编程** +- **靠谱行为**的基础只能是**靠谱** +- **提问**是获得技能的唯一起点 +- 教练价值源自你**真诚**的行动 +- **合意阻滞**是学习的最佳动力 + +> 开智五品 + +> - 勤奋 +> - 专注 +> - 持久 +> - 创意 +> - 良善 + +任务如下 + +- 前提: 参加 0wd4 公开课,或是看过回放 +- 时限: 1wd0 20:20 前 +- 行动: 回复此 Issue 给出对应笔记的 URL +- 内容: + + 公开课对自己触动最大的 top 3 内容 + + 对比自己过往行动, 应该有哪些可以应用以上三点建议进行改进的? + + 给出具体改进的方案来 + + 方案描述尽可能包含所有 5W1H 要素 + +10/16/2015 12:06:37 AM + +![mindmap手绘思维导图](https://raw.githubusercontent.com/JeremiahZhang/gopython/master/_image/0wd4_C2T2_novie_advice.jpg) + +---------- + +## 触动点 ## + +- 断言 +- 慎独 +- 视而不见 + +## 1-那个断言 ## + +在大妈昨天(10月15日)晚上的公开课中 大妈断言 “不会提问 就学不会编程” 被这个断言深深击中 怪不得大妈在课程刚开始的时候 贴了多次的 [提问的智慧](wiki.woodpecker.org.cn/moin/AskForHelp) 且还说道 当我们自己懂得提问的时候 大部分问题 我们就可以自己解决了 + +学习编程 其实是发现问题 解决问题的过程 而程序员就是以最小代价解决问题 但我该如何升级 在编程学习中 如专业or专家级程序员一样 去以最小代价解决问题呢? So in the beginning I should ask for help smartly. + +学会提问 编程思维习得的门槛 + +不会提问 其实是思维懒惰的表现 是要不得的 思维的懒惰 会造成行动的懒惰 所以学会不编程 + +我在最近的编程学习中 跟着官方Tutorial走(并[记录所学](https://github.com/JeremiahZhang/gopython/tree/master/PY-StarTrek-Enterprise/0w))总有一个想法就是习得的是python的术 而不是编程的道 从大妈的断言看来 编程的道起步就是**学会提问** 之前也学过VB 学过C 但是总体而言 没有习得编程思维 就因为没有真正学会提问 当看到技术问题提问时 一大堆的内容 就有点害怕 问个问题 还要那么多自己尝试那么多 还问问题干嘛 **原来学会问问题就是在自己解决问题** 现在才慢慢get到 被学校教育所奴役的! 后怕啊! + +- 行动 + - 不懂就问 但是在提问之前 请学会提问 参考 提问的智慧 + - 提问之前做好准备 叙述好自己的问题 + - 知道自己问的什么 描述清晰 + - 自己的分析如何 内容过程 + - 做了多少尝试 尝试的内容 尝试的结果如何 + - 为什么最终没有成功 + - 最后再去提问 + - 问题解决 简要说明 + - 要真诚(自己真的经过一番分析 尝试 而不是一上来 就把问题扔给前辈们) + - 要谦卑 要谦卑 要谦卑 + +---------- + +### 2-如孩子般慎独 ### + +大妈提到 小孩子的慎独 似乎是 + +- 独自一人时 要小心谨慎 +- 比喻 无监督学习 +- 例子 小孩的慎独 自玩泥巴 自得其乐 + +> 在无人监督的时候 自己跟自己的问题 自己跟自己的问题搏斗 + +当大妈讲到学校的教育的时候 想到 +其实学校成为了一个**屠宰场** 抹杀了孩子的兴趣 天性 +学校想培养的是顺从的羔羊 + +回忆自己小学时候 放学回家 用硬纸板去制作各种类似抽屉的事情 然后去放文具什么的 还乐意给同学做 完全是在无监督下学习 玩耍的 哈哈 + +上了快20年的学 发现自己的这种无监督学习的天性 消失了 在学校为了成绩争竞 为了奖学金而学习 即使有自己想学的 比如本科时候的日语 也因为没有坚持 在没有监督的情况下 放弃了 + +**慎独** 在学习的时候回归小孩子般的慎独 同时拥成人的成熟 去体会其中的乐趣 而不是那做给别人看 输出令自己满意的作品 能打动自己的作品 然后再去打动别人 + +> 去与自己的问题 与 思想 搏斗吧 +> 在独处时能谨慎不苟 + +---------- + +### 3-那么多视而不见 ### + +大妈在本次公开课中 提到好多次的视而不见 其中我一次在issue中的回答就被拿出来和大妈的回复举例 当初也想到 + +- 咦 为什么大妈的回复下面总有那么多摘引 然后就没有然后了 这是我思维的一个漏洞 只有为什么 没有解决的方案 似乎问题就解决自己了 其实是自己思维的懒惰 感谢大妈的多次提醒 + +在讲座后发现 原来 大妈是用email来回复的 自己也将Github的primary邮件改为Gmail,发现原来Github配合email就和邮件列表类似了 这就是Github生态中的一环 + +开课到如今 有好多视而不见了 反省下来 + +- 想想为什么 + - 思维上 认为不怎么重要 但大妈多次提到视而不见 想想 + - 大妈每一次邮件or任务内容中给的link连接 都是有他之用意的 要不他也不会浪费时间将无用的link去发了 这个需要get到 +- How + - 注意大妈每一次提问 回答的方式 + - 注意大妈email中的link + - 先简单浏览 + - 对自己发现问题 解决问题有用之处 特别审视之 + +---------- + +## 总 ## + +- 学会提问 是思维的变更 解决编程问题 也可解决生活中的问题 +- 慎独 不断与自己搏斗 +- 不再视而不见 乃是信任导师 + +谢谢ZQ大妈的公开课[0wd4 C2T2](http://openmindclub.qiniudn.com/res/tapes/omooc/omooc2py/151015_0wd4/index.html) +修补自己思维的漏洞 还得细听 继续修补 不断更新自己 + +> Rewminding in Coding and Everything in My Life + +10/16/2015 11:37:30 AM 3个蕃茄 \ No newline at end of file diff --git a/4Learn/README.md b/4Learn/README.md new file mode 100644 index 000000000..1d7b7bbfc --- /dev/null +++ b/4Learn/README.md @@ -0,0 +1,21 @@ +# 人如何学习的 + +《构建之法》 中 作者提到人是如何学习的 + +- **知识体系** 自己构建 +- 人的**认知模型改变** 需要循序渐进 (更多需要去了解认知科学相关领域内容) +- **提问** 帮助构建 知识体系 +- **沉浸** 学习 全身心投入是学习的关键 要有一定工作量 + +Learn By Doing + +- **关注情景** 在各种情境中 + + 实践 + + 提问 + + 总结 + +---------- + +## ( ̄▽ ̄) ## + +10/9/2015 Build \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md index addedc79b..590491cb4 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,13 +1,12 @@ # Summary - [Tools](toolssupport/README.md) - - [Windows Setting](toolssupport/win7.md) - - [Learn Git](toolssupport/learngit.md) - - [windows setting](toolssupport/win7.md) - - [Gitbook](toolssupport/gitbook.md) - - [ST2与Py环境配置](toolssupport/SubPy.md) - - [双推](toolssupport/doublepush.md) - [教学反转](0MOOC/README.md) - - [week_1_交互](04_task/week01_interact.md) + - [Windows Setting](0MOOC/win7.md) + - [Learn Git](0MOOC/learngit.md) + - [windows setting](0MOOC/win7.md) + - [Gitbook](0MOOC/gitbook.md) + - [ST2与Py环境配置](0MOOC/SubPy.md) + - [双推](0MOOC/doublepush.md) - [基础旋进](1sTry/README.md) - [week_0](1sTry/week_0.md) - [42行代码](1sTry/0wd0-task-42-code-fundamental-problem.md) @@ -15,9 +14,10 @@ - [Sth New](1sTry/0wd2-New-things-to-learn.md) - [苟日新](1sTry/0wd3-step-by-step-4_7-8.md) - [迭代作品](2nDev/README.md) + - [week_1_交互](2nDev/week01_interact.md) - [人生首秀](3rDemo/README.md) -- [人如何学习的](4learn/README.md) - - [Renewminding](4learn/0wd4-OpenCourse-Note.md) +- [人如何学习的](4Learn/README.md) + - [Renewminding](4Learn/0wd4-OpenCourse-Note.md) - [代码 (_src)](_src/README.md) - [素材 (draft)](draft/README.md) + [教程该怎么写](draft/how2tutorial.md) From 6ceeeac8336c35afdb8e53a71799e487616c9476 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 15:20:44 +0800 Subject: [PATCH 005/432] mod sum --- SUMMARY.md | 1 - 1 file changed, 1 deletion(-) diff --git a/SUMMARY.md b/SUMMARY.md index 590491cb4..167bae91e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,5 +1,4 @@ # Summary -- [Tools](toolssupport/README.md) - [教学反转](0MOOC/README.md) - [Windows Setting](0MOOC/win7.md) - [Learn Git](0MOOC/learngit.md) From 244412516c2186c50a789b08b0bc568d911b9f4a Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 15:22:54 +0800 Subject: [PATCH 006/432] add _src codes after 1st transfer --- _src/om2py0w/0wd0/Q.md | 42 +++++++ _src/om2py0w/0wd0/__init__.py | 2 + _src/om2py0w/0wd0/coffeeghost-q-in-py.png | Bin 0 -> 77993 bytes _src/om2py0w/0wd0/fibo.py | 14 +++ _src/om2py0w/0wd0/main.py | 67 ++++++++++ _src/om2py0w/0wd0/mainresult.py | 27 ++++ _src/om2py0w/0wd0/print.py | 8 ++ _src/om2py0w/0wd1/__init__.py | 0 _src/om2py0w/0wd1/imshow | 3 + _src/om2py0w/0wd1/main.py | 25 ++++ _src/om2py0w/0wd1/nar.png | Bin 0 -> 19595 bytes _src/om2py0w/0wd1/nar_result.png | Bin 0 -> 19708 bytes _src/om2py0w/0wd1/nar_result100.png | Bin 0 -> 20212 bytes _src/om2py0w/0wd1/result.png | Bin 0 -> 19708 bytes _src/om2py0w/0wd1/result100.png | Bin 0 -> 20212 bytes _src/om2py0w/0wd2/__init__.py | 0 _src/om2py0w/0wd2/ask_ok_test.py | 25 ++++ _src/om2py0w/0wd2/main.py | 0 _src/om2py0w/0wd2/tutor00num.py | 27 ++++ _src/om2py0w/0wd2/tutor01string.py | 72 +++++++++++ _src/om2py0w/0wd2/tutor02unicodestring.py | 7 ++ _src/om2py0w/0wd2/tutor03Lists.py | 51 ++++++++ _src/om2py0w/0wd2/tutor03ListsResult.py | 32 +++++ _src/om2py0w/0wd2/tutor04-1if.py | 27 ++++ _src/om2py0w/0wd2/tutor04-3range.py | 20 +++ _src/om2py0w/0wd2/tutor04-4break.py | 29 +++++ _src/om2py0w/0wd2/tutor04-6def.py | 20 +++ .../tutor04-7-1-default-argument-values.py | 55 ++++++++ .../tutor04-7-2-keywords-argument-values.py | 39 ++++++ _src/om2py0w/0wd2/tutor04Fob.py | 12 ++ _src/om2py0w/0wd3/tutor-4-7-2-dictionary.py | 74 +++++++++++ _src/om2py0w/0wd3/tutor-4-7-4-arbitrary.py | 46 +++++++ _src/om2py0w/0wd3/tutor-4-7-6-Doc-Strings.py | 20 +++ _src/om2py0w/0wd6/search_taobao.py | 16 +++ _src/om2py0w/0wd6/search_taobao_error.py | 12 ++ _src/om2py0w/0wd6/test_learn.py | 2 + _src/om2py0w/0wex0/__init__.py | 2 + _src/om2py0w/0wex0/conti_test.py | 49 ++++++++ _src/om2py0w/0wex0/diary_final_test.txt | 3 + _src/om2py0w/0wex0/diary_name.txt | 4 + .../0wex0/find_and_print_files_test.py | 14 +++ _src/om2py0w/0wex0/input_test.py | 16 +++ _src/om2py0w/0wex0/invoking_test.py | 8 ++ _src/om2py0w/0wex0/main.py | 67 ++++++++++ _src/om2py0w/0wex0/main_test.py | 118 ++++++++++++++++++ _src/om2py0w/0wex0/open_read_test.py | 10 ++ _src/om2py0w/0wex0/test ask date.txt | 1 + _src/om2py0w/0wex0/test.txt | 5 + _src/om2py0w/0wex0/test_str.txt | 3 + _src/om2py0w/README.md | 16 ++- 50 files changed, 1089 insertions(+), 1 deletion(-) create mode 100644 _src/om2py0w/0wd0/Q.md create mode 100644 _src/om2py0w/0wd0/__init__.py create mode 100644 _src/om2py0w/0wd0/coffeeghost-q-in-py.png create mode 100644 _src/om2py0w/0wd0/fibo.py create mode 100644 _src/om2py0w/0wd0/main.py create mode 100644 _src/om2py0w/0wd0/mainresult.py create mode 100644 _src/om2py0w/0wd0/print.py create mode 100644 _src/om2py0w/0wd1/__init__.py create mode 100644 _src/om2py0w/0wd1/imshow create mode 100644 _src/om2py0w/0wd1/main.py create mode 100644 _src/om2py0w/0wd1/nar.png create mode 100644 _src/om2py0w/0wd1/nar_result.png create mode 100644 _src/om2py0w/0wd1/nar_result100.png create mode 100644 _src/om2py0w/0wd1/result.png create mode 100644 _src/om2py0w/0wd1/result100.png create mode 100644 _src/om2py0w/0wd2/__init__.py create mode 100644 _src/om2py0w/0wd2/ask_ok_test.py create mode 100644 _src/om2py0w/0wd2/main.py create mode 100644 _src/om2py0w/0wd2/tutor00num.py create mode 100644 _src/om2py0w/0wd2/tutor01string.py create mode 100644 _src/om2py0w/0wd2/tutor02unicodestring.py create mode 100644 _src/om2py0w/0wd2/tutor03Lists.py create mode 100644 _src/om2py0w/0wd2/tutor03ListsResult.py create mode 100644 _src/om2py0w/0wd2/tutor04-1if.py create mode 100644 _src/om2py0w/0wd2/tutor04-3range.py create mode 100644 _src/om2py0w/0wd2/tutor04-4break.py create mode 100644 _src/om2py0w/0wd2/tutor04-6def.py create mode 100644 _src/om2py0w/0wd2/tutor04-7-1-default-argument-values.py create mode 100644 _src/om2py0w/0wd2/tutor04-7-2-keywords-argument-values.py create mode 100644 _src/om2py0w/0wd2/tutor04Fob.py create mode 100644 _src/om2py0w/0wd3/tutor-4-7-2-dictionary.py create mode 100644 _src/om2py0w/0wd3/tutor-4-7-4-arbitrary.py create mode 100644 _src/om2py0w/0wd3/tutor-4-7-6-Doc-Strings.py create mode 100644 _src/om2py0w/0wd6/search_taobao.py create mode 100644 _src/om2py0w/0wd6/search_taobao_error.py create mode 100644 _src/om2py0w/0wd6/test_learn.py create mode 100644 _src/om2py0w/0wex0/conti_test.py create mode 100644 _src/om2py0w/0wex0/diary_final_test.txt create mode 100644 _src/om2py0w/0wex0/diary_name.txt create mode 100644 _src/om2py0w/0wex0/find_and_print_files_test.py create mode 100644 _src/om2py0w/0wex0/input_test.py create mode 100644 _src/om2py0w/0wex0/invoking_test.py create mode 100644 _src/om2py0w/0wex0/main_test.py create mode 100644 _src/om2py0w/0wex0/open_read_test.py create mode 100644 _src/om2py0w/0wex0/test ask date.txt create mode 100644 _src/om2py0w/0wex0/test.txt create mode 100644 _src/om2py0w/0wex0/test_str.txt diff --git a/_src/om2py0w/0wd0/Q.md b/_src/om2py0w/0wd0/Q.md new file mode 100644 index 000000000..04a6c71b0 --- /dev/null +++ b/_src/om2py0w/0wd0/Q.md @@ -0,0 +1,42 @@ +# Q # + +## 环境 ## + +- win7 +- ST2 + - sublimeREPL F5运行 + - fibo.fib2(100) 没有结果 +- python 2.7.8 + +### 分析 ### + +- 环境问题 ST2 与Python 用 shell 来解决一下 + +---------- + +## 教会我自己 那42行代码 ## + +![42 coder](http://wiki.woodpecker.org.cn/moin/ZqQuickIntoPy?action=AttachFile&do=get&target=coffeeghost-q-in-py.png) + +- mian() 主函数 + + print 使用 + + string + + string % (value, value) % string interpolation + + string + ... % (string concatenation) + + string repeation + + 函数调用 与 matlab 类似 a = f(10) and so on + + 内置函数使用 + + 计数 + + 从0开始 + + lists + + 循环 + + for 循环 + + 条件 + + `if :` + + `elif:` + + `else:` + + 布尔运算 ++ 调试主函数 + + + diff --git a/_src/om2py0w/0wd0/__init__.py b/_src/om2py0w/0wd0/__init__.py new file mode 100644 index 000000000..907aee669 --- /dev/null +++ b/_src/om2py0w/0wd0/__init__.py @@ -0,0 +1,2 @@ +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/_src/om2py0w/0wd0/coffeeghost-q-in-py.png b/_src/om2py0w/0wd0/coffeeghost-q-in-py.png new file mode 100644 index 0000000000000000000000000000000000000000..e99d4902076694e2bb394c723edcb7dc4dfc3f45 GIT binary patch literal 77993 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 F{|_$jaGwAG literal 0 HcmV?d00001 diff --git a/_src/om2py0w/0wd0/fibo.py b/_src/om2py0w/0wd0/fibo.py new file mode 100644 index 000000000..d512462b9 --- /dev/null +++ b/_src/om2py0w/0wd0/fibo.py @@ -0,0 +1,14 @@ +# Fibonacci numbers module from python doc +def fib(n): # fibonacci series up to n + a, b =0, 1 + while b < n: + print b, + a, b = b, a+b + +def fib2(n): # return fibonacci series up to n + result = [] + a, b = 0, 1 + while b < n: + result.append(b) + a, b = b, a+b + return result \ No newline at end of file diff --git a/_src/om2py0w/0wd0/main.py b/_src/om2py0w/0wd0/main.py new file mode 100644 index 000000000..332332ef6 --- /dev/null +++ b/_src/om2py0w/0wd0/main.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# 注释 +# 第一行注释为了可以中文输出 如 print just like this print down +# print "我爱python编程 我在学好编程的路上" +import os +# fibo.fib(100) # according to py 2.7.10 doc +# fibo.fib2(1000) # here is no answer in ST2 how to slove + +def main(): # 主程序 主“函数” 注意下一行的缩进 注意()中没有参数 + # refer to the name “main” is just a convention not a requirement + print 'Hello World!' # 这里是英文 就用 单 '' + + print "This is Alice's greeting." # 这里出现了 Alice's 以免混淆 就用 双 "" + print 'This Bob\'s greeting.' + # 这里bob's 在写的时候 加了\' 以区分 就可以用 单'' 可以与上一行对比 + + foo(5, 10) # 调用函数 foo + + print '=' * 10 # print 字符串 可以用 这样的形式 嗯 + print '0' * 30 + + print 'Current working directory is ' + os.getcwd() # os木块调用 注意 这里中间为 + + # 用 % 试过出错 --- % 不能将两个参数连起来 如下 + # TypeError: not all arguments converted during string formatting + counter = 0 + counter += 1 # 计数 + + food = ['apple', 'oranges', 'cats'] # list 字符串 + + for i in food: # for 循环 + print i # 看看 i 嗯 这里就是 和下面一样 + print 'I like to eat ' + i # + 与 % 区别 + + print 'Count to ten: ' + for i in range(10): # 爱从0开始 + print i + +def foo(param1, secondParam): + res = param1 + secondParam + + print '%s plus %s is equal to %s' % (param1, secondParam, res) # %s 代表string + + if res < 50: + print 'foo' + + elif (res >= 50) and ((param1 == 42) or (secondParam == 24)): # and or 布尔运算 + print 'bar' + + else: + print 'moo' # know + + return res # thsi is a one line comment. 不明白return 我去掉这行 也可以运行 + # The return statement returns with a value from a function. + # return without an expression argument returns None. + # Falling off the end of a function also returns None + '''A multi- +line string, but can also be a multi-line comment.''' # 多行注释 用'''comment''' + +if __name__ == '__main__': # 这个原来不知道是什么 将其注释掉 发现 + main() # 没有任何结果产生 说明 是调用主函数 main() + # 为什么会这样 本来就这样吧 + # 执行程序 cause a script to run main() + # 单独使用 无法使用 OK 就是放在脚本结尾的 + +# 我自己人工能得出结果 +# 编写注意 def if for 这种需要最后 : 不要遗漏 +# print 多种形式 尤其是 '%s plus %s is equal to %s' % (param1, secondParam, res) \ No newline at end of file diff --git a/_src/om2py0w/0wd0/mainresult.py b/_src/om2py0w/0wd0/mainresult.py new file mode 100644 index 000000000..4b2317dc8 --- /dev/null +++ b/_src/om2py0w/0wd0/mainresult.py @@ -0,0 +1,27 @@ +Hello World! +This is Alice's greeting. +This Bob's greeting. +5 plus 10 is equal to 15 +foo +========== +000000000000000000000000000000 +Current working directory is E:\BaiduYunPan\gitbook\pybeginner\_src\om2py0w\0wex0 +apple +I like to eat apple +oranges +I like to eat oranges +cats +I like to eat cats +Count to ten: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 + +***Repl Closed*** diff --git a/_src/om2py0w/0wd0/print.py b/_src/om2py0w/0wd0/print.py new file mode 100644 index 000000000..7d537886f --- /dev/null +++ b/_src/om2py0w/0wd0/print.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +print "i like Python Star Trek" +print "我爱Python星际迷航之探索" +print "hello world" +print "中国" +# 这里是注释 +# debug的时候 请倒过来 检查 +# 倒着读 代码 避免大脑跟随每一段代码 \ No newline at end of file diff --git a/_src/om2py0w/0wd1/__init__.py b/_src/om2py0w/0wd1/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/_src/om2py0w/0wd1/imshow b/_src/om2py0w/0wd1/imshow new file mode 100644 index 000000000..7cc7b9788 --- /dev/null +++ b/_src/om2py0w/0wd1/imshow @@ -0,0 +1,3 @@ +from PIL import Image +im = Image.open('nar.png') +im.rotate(45).show() \ No newline at end of file diff --git a/_src/om2py0w/0wd1/main.py b/_src/om2py0w/0wd1/main.py new file mode 100644 index 000000000..c1e706279 --- /dev/null +++ b/_src/om2py0w/0wd1/main.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# using PIL https://pypi.python.org/pypi/Pillow/2.2.1 +# fork this https://github.com/JiYouMCC/python-show-me-the-code/blob/e0c7c1c37ccba38671078e0b0ff6238992a11499/0000/0000.py +from PIL import Image +from PIL import ImageFont +from PIL import ImageDraw + +def write_number(image_file_name_in_current_dir, number = 1): + img = Image.open(image_file_name_in_current_dir) # open image + font_size = img.size[0] if img.size[0] < img.size[1] else img.size[1] # img.size(width, height) + font_size = font_size / 4 # 字体 数字 尺寸 取小 + number_txt = str(number) + ' ' if number < 100 else '99+' # 数字文本 + + font = ImageFont.truetype("arial.ttf", size = font_size) # creat a font object + if font.getsize(number_txt)[0] > img.size[0] or font.getsize(number_txt)[1] > img.size[1]: + return img # font.getsize(text) -> (width, height) 字比图片大了 不行 + position = img.size[0] - font.getsize(number_txt)[0] # 字体位置 + ImageDraw.Draw(img).text((position, 0), number_txt, (255, 0, 0), font) + # draw.text(position, string, options) + return img + +# need an image 'nar.png' +write_number('nar.png').save('nar_result.png') # 调用 并 保存 与 当前文件夹 +# if number > 100, shows '99+' +write_number('nar.png', 100).save('nar_result100.png') \ No newline at end of file diff --git a/_src/om2py0w/0wd1/nar.png b/_src/om2py0w/0wd1/nar.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0f59e15d8c360c0582e7df38b29150d1fd604b GIT binary patch literal 19595 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 literal 0 HcmV?d00001 diff --git a/_src/om2py0w/0wd1/nar_result.png b/_src/om2py0w/0wd1/nar_result.png new file mode 100644 index 0000000000000000000000000000000000000000..672db2dcb46a0da2b3cb4d7d21cdbfd91cdb4242 GIT binary patch literal 19708 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 P00000NkvXXu0mjf7K&_l literal 0 HcmV?d00001 diff --git a/_src/om2py0w/0wd1/nar_result100.png b/_src/om2py0w/0wd1/nar_result100.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b837ed92645fd0630b0bfb3585ffcd4b579360 GIT binary patch literal 20212 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 literal 0 HcmV?d00001 diff --git a/_src/om2py0w/0wd1/result.png b/_src/om2py0w/0wd1/result.png new file mode 100644 index 0000000000000000000000000000000000000000..672db2dcb46a0da2b3cb4d7d21cdbfd91cdb4242 GIT binary patch literal 19708 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 P00000NkvXXu0mjf7K&_l literal 0 HcmV?d00001 diff --git a/_src/om2py0w/0wd1/result100.png b/_src/om2py0w/0wd1/result100.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b837ed92645fd0630b0bfb3585ffcd4b579360 GIT binary patch literal 20212 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 literal 0 HcmV?d00001 diff --git a/_src/om2py0w/0wd2/__init__.py b/_src/om2py0w/0wd2/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/_src/om2py0w/0wd2/ask_ok_test.py b/_src/om2py0w/0wd2/ask_ok_test.py new file mode 100644 index 000000000..c5123c274 --- /dev/null +++ b/_src/om2py0w/0wd2/ask_ok_test.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +def ask_ok(prompt, retries = 4, complaint = 'yes or no, please!'): + while True: + ok = raw_input(prompt) + if ok in ('y', 'ye','yes'): # in + return True # return + if ok in ('n', 'no', 'nop', 'nope'): + break + retries = retries - 1 + if retries < 0: + raise IOError('Refuseink user') + print complaint + +# ask_ok('你真的想退出么?', 2000) + +def ask_over(prompt): + while True: + over = raw_input(prompt) + print over + if over in ('yes', 'ye', 'y'): + break + elif over in ('n', 'no', 'nop', 'nope'): + + diff --git a/_src/om2py0w/0wd2/main.py b/_src/om2py0w/0wd2/main.py new file mode 100644 index 000000000..e69de29bb diff --git a/_src/om2py0w/0wd2/tutor00num.py b/_src/om2py0w/0wd2/tutor00num.py new file mode 100644 index 000000000..9741aa09b --- /dev/null +++ b/_src/om2py0w/0wd2/tutor00num.py @@ -0,0 +1,27 @@ +# -*- coding:utf-8 -*- +print 17 / 3 # int / int -> int +print 17 / 3.0 # int / float -> float +print 17 // 3.000 # 舍弃小数部分 +print 17 % 3 # 整除 +print 5*3 + 2 # mess + +print '*' * 20 +print 'powers of numbers' +print 5 ** 2 +print 2 ** 7 + +print '*' * 20 +print 'assign a value to a variable' +width = 20 +height = 5 * 9 +print width * height + +print '*' * 20 +tax = 12.5 / 100 +print tax +price = 100.50 +print price +print price * tax + +price += price +print price \ No newline at end of file diff --git a/_src/om2py0w/0wd2/tutor01string.py b/_src/om2py0w/0wd2/tutor01string.py new file mode 100644 index 000000000..8966edbd3 --- /dev/null +++ b/_src/om2py0w/0wd2/tutor01string.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +the_world_is_flat = 1 +if the_world_is_flat : + print 'Be careful not to fall off!' + +# this is the 1st comment +spam = 1 # and this is the 2nd comment + # ... and now a 3rd! +text = "# this is not a comment because it's inside quotes." +text_diff = '# this is not a comment because it\'s inside quotes. Ple notice the diff' +print spam +print text +print text_diff + +print '*' * 20 +print 'i need to defined a variable before assign a value' + +print '*' * 20 +print 'c:\user\name' # note this +print r'c:\user\name' # notice the r before + +print '*' * 20 +print """"\ +Usage: thingy [options] # muti-line to comment like this + -h Display this usage message + -H hostname Hostname to connect to +""" + +print '*' * 20 +print 'Jesus' + 'love' * 3 + 'you' + 'forever' +print 'py' 'thon' + +print '*' * 20 +print 'concatenate variables and a literal use +' +prefix = 'py' +print prefix + 'thon' + +print '*' * 20 +word = 'python' +print word +print "1st letter of python: " + word[-6] +print 'the last letter of python: ' + word[-1] +print '1st letter of python: ' + word[0] +print 'the last letter of python: ' + word[5] +print "'1st letter of python: + word[6] is wrong because out of range" +print "please notice the above!" + +print '*' * 20 +print word[0:2] +print "here 2 index is exclued" +print word[2:5] +print 'same as above' + +print '*' * 20 +print word[:2] +print "same as above. but notice the below" +print word[4:] +print "here 4 is include!" + +print '*' * 20 +print "word[42] is out of range but this one below is useful" +print word[2:42] +print word[42:] + +print '*' * 20 +print "python string cannot changed like this" +print "word[0] = J but like this below" +print 'J' + word[1:] # this is just concatenate +s = 'ilovejesus' +print len(s) +ss = 'i love jesus ' +print len(ss) \ No newline at end of file diff --git a/_src/om2py0w/0wd2/tutor02unicodestring.py b/_src/om2py0w/0wd2/tutor02unicodestring.py new file mode 100644 index 000000000..61e84bc3a --- /dev/null +++ b/_src/om2py0w/0wd2/tutor02unicodestring.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +print u'hello world!' +print u'hello\u0020world !' +print u'adc' +print str(u'adc') +# encode +# unicode \ No newline at end of file diff --git a/_src/om2py0w/0wd2/tutor03Lists.py b/_src/om2py0w/0wd2/tutor03Lists.py new file mode 100644 index 000000000..2b7a774ee --- /dev/null +++ b/_src/om2py0w/0wd2/tutor03Lists.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +squares = [1, 4, 9, 16, 25] +print squares +# tri = [1 8 27] so this is invalid syntax 语法错了 就像英文语法错误一样 he girl +print squares[0] +print squares[-1] + +print "*" * 20 +print squares[-3:] + +print '-' * 20 +print squares[:] + +print '>o<'*10 +squares = squares + [36, 49, 64, 81, 100] +print squares + +print "it...then... 执行意图 + >= 3倍" +cubes = [1, 8, 27, 65, 125] # did you fine the wrong num? +print cubes +print 'change 65 -> 64' +cubes[3] = 4 ** 3 +print cubes +print 'o-o' * 10 +print 'append means what like this' +cubes.append(216) +print cubes +cubes.append(6 ** 3) # append() items at the end of the list +print cubes +cubes.append(7 **3) +print cubes +print '()' * 10 +print 'if python then coding' +letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] +print letters +letters[2:5] = ['C', 'D', 'E'] +print letters +letters[2:5] = [] +print letters +letters[:] = [] +print letters +letters =['a', 'b', 'c', 'd'] +print len(letters) +inner_letter_list = ['a', 'b', 'c'] +inner_num_list = ['1', '2', '3'] +mess_letter_num_list_lists = [inner_letter_list, inner_num_list] +print mess_letter_num_list_lists +print mess_letter_num_list_lists[0] +print mess_letter_num_list_lists[0][1] +print '模仿 实践 创意' +print "have fun in python star trek" \ No newline at end of file diff --git a/_src/om2py0w/0wd2/tutor03ListsResult.py b/_src/om2py0w/0wd2/tutor03ListsResult.py new file mode 100644 index 000000000..cd3e7f63e --- /dev/null +++ b/_src/om2py0w/0wd2/tutor03ListsResult.py @@ -0,0 +1,32 @@ +[1, 4, 9, 16, 25] +1 +25 +******************** +[9, 16, 25] +-------------------- +[1, 4, 9, 16, 25] +>o<>o<>o<>o<>o<>o<>o<>o<>o<>o< +[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] +it...then... 执行意图 + >= 3倍 +[1, 8, 27, 65, 125] +change 65 -> 64 +[1, 8, 27, 64, 125] +o-oo-oo-oo-oo-oo-oo-oo-oo-oo-o +append means what like this +[1, 8, 27, 64, 125, 216] +[1, 8, 27, 64, 125, 216, 216] +[1, 8, 27, 64, 125, 216, 216, 343] +()()()()()()()()()() +if python then coding +['a', 'b', 'c', 'd', 'e', 'f', 'g'] +['a', 'b', 'C', 'D', 'E', 'f', 'g'] +['a', 'b', 'f', 'g'] +[] +4 +[['a', 'b', 'c'], ['1', '2', '3']] +['a', 'b', 'c'] +b +模仿 实践 创意 +have fun in python star trek + +***Repl Closed*** diff --git a/_src/om2py0w/0wd2/tutor04-1if.py b/_src/om2py0w/0wd2/tutor04-1if.py new file mode 100644 index 000000000..e4adf3bf0 --- /dev/null +++ b/_src/om2py0w/0wd2/tutor04-1if.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +x = int(raw_input('please enter an interger: ')) +if x < 0: + x = 0 + print "负数则变为0" +elif x == 0: + print "零" +elif x == 1: + print 'single' +else: + print 'more' + +print 'I love python! ' +print '-' * 20 +words = ['cat', 'window', 'defenestrate'] +for w in words: + print w, len(w) +print '-' * 20 +print 'for statement' +for w in words[:]: + if len(w) > 6: + words.insert(0,w) # 将字长大于6的放入words list中的第一个 + elif len(w) < 6: + words.insert(4,w) +print words +print 'the length of the words list now is %s' % len(words) # len()是num 所以 不能用 + 而是 % 来 +print 'the length of the words list now is', len(words) # same as above diff --git a/_src/om2py0w/0wd2/tutor04-3range.py b/_src/om2py0w/0wd2/tutor04-3range.py new file mode 100644 index 000000000..9cd37ad99 --- /dev/null +++ b/_src/om2py0w/0wd2/tutor04-3range.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +x = range(10) +print x +y = range(5, 10) +print 'please notice the range,', y +z = range(1, 10, 3) +print z +a = range(-10, -100, -30) +print a + +aa = ['Mary', 'had', 'a', 'litter', 'lamb'] +for i in range(len(aa)): + print i, aa[i] +print '# 使用 enumerate 枚举 same as above let see' +for i, v in enumerate(['Mary', 'had', 'a', 'litter', 'lamb']): + print i, v +print 'Lets see another thats fun' +for i, v in enumerate(['I', 'LOVE', 'PYTHON']): + print i, v \ No newline at end of file diff --git a/_src/om2py0w/0wd2/tutor04-4break.py b/_src/om2py0w/0wd2/tutor04-4break.py new file mode 100644 index 000000000..c332a4b60 --- /dev/null +++ b/_src/om2py0w/0wd2/tutor04-4break.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +print 2 % 2 +for n in range(2, 13): + for x in range(2, n): + if n % x == 0: + print n, 'equals', x, '*', n/x + break # break 的是 最近的for statement 此处是 for x... OR while loop而不是 if + # 要不 12 = 2*6 还有 12 = 3 * 4 or 12=4*3 + # so break() breaks out of the smallest enclosing for or while LOOP + else: # here else: clause belongs to the for loop not if + # 这是突破我以前认识的 不同之处 + # 没有找到因子 + # for loop else clause + print n, 'is a prime number 素数' +for num in range(2,10): + if num % 2 == 0: + print '找到一个偶数', num + # continue # 继续的下一次 for loop + break # 若用break 则for loop 结束了 + print '找到一个数', num + pass # pass statement doing noting 可以用来comment 就像我现在做的一样 + +while True: + pass # busy wait for keyboard interrupt (ctrl+c) +class MyEmptyClass: + pass # this is commonly used to creating minimal classes + # 什么是最小 class 再学习class 的时候用 关注 +def initlog(*args): + pass # remember to implement this! 我不知道这个用法是什么的? diff --git a/_src/om2py0w/0wd2/tutor04-6def.py b/_src/om2py0w/0wd2/tutor04-6def.py new file mode 100644 index 000000000..13ac47df5 --- /dev/null +++ b/_src/om2py0w/0wd2/tutor04-6def.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +def fib(n): + a, b = 0, 1 + while a < n: + print a, # , 是为了一行输出 + a, b = b, a+b + pass +print fib(2000) +f = fib +print f(100) + +def fib2(n): # 输出list 形式结果 斐波那契数列 + result = [] + a, b = 0, 1 + while a < n: + result.append(a) + a, b = b, a+b + return result +f100 = fib2(100) +print f100 \ No newline at end of file diff --git a/_src/om2py0w/0wd2/tutor04-7-1-default-argument-values.py b/_src/om2py0w/0wd2/tutor04-7-1-default-argument-values.py new file mode 100644 index 000000000..874ca44ba --- /dev/null +++ b/_src/om2py0w/0wd2/tutor04-7-1-default-argument-values.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +print 'argument values' +def ask_ok(prompt, retries=4, complaint='yes or no, please!'): + while True: + ok = raw_input(prompt) + if ok in ('y', 'ye','yes'): # in + return True # return + if ok in ('n', 'no', 'nop', 'nope'): + return False + retries = retries - 1 + if retries < 0: + raise IOError('Refuseink user') + print complaint +ask_ok('你真的想退出么?', 2000) + +print "-o-"*10 +"""The defult valeus are evaluated at the point of function definition in +the defining scope, so that the codes below will print 5""" +i = 5 +def f(arg = i): + print arg + pass +i = 6 +print f() +"""调用的时候 输出还是5 默认是5 第一次i = 5 +调用的时候没有输入参数 所以默认还是5""" +print f(10) +print f() +print 'Important Warning: the default value is evaluated only one' +'''以上 此时 默认还是先前的 i=5 +arg =i ''' + +print "-o-"*10 +print "请注意 这里 mutable object such as a list,dictionary, or instances of most classes" +def f(a, L=[]): + L.append(a) + return L +print f(1) +print f(2) +print f(3) + +print "---"*10 +print "then look at this below can you understand what does it do?" +def f(a, L=None): + if L is None: + L = [] + L.append(a) + return L + # when i change return L to single return + # I understand what does it mean when return +"""return without an expression argument returns +None.""" +print f(1) +print f(2) +print f(3) \ No newline at end of file diff --git a/_src/om2py0w/0wd2/tutor04-7-2-keywords-argument-values.py b/_src/om2py0w/0wd2/tutor04-7-2-keywords-argument-values.py new file mode 100644 index 000000000..0d4212b78 --- /dev/null +++ b/_src/om2py0w/0wd2/tutor04-7-2-keywords-argument-values.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +def parrot(voltage, state = 'a stiff', action = 'voom', type = 'Norwegian Blue'): + print "-- This parrot wouldnot", action, + print "if you put", voltage, "volts through it." + print "-- Lovely plumage, the", type + print "-- It's", state, "!" +parrot(1000) # 根据位置 确定参数 +print "+"*20 +parrot(voltage=1000) # 根据 1 个 keyword arg +print "-"*20 +parrot(voltage=1000000, action='V00000000M') # 根据2个keyword arg +print "+"*20 +parrot(action='V00000000M', voltage=1000000) # 根据2个keyword arg 顺序可以改变 +print "-"*20 +parrot('a million', 'bereft of life', 'jump') # 3个位置 arg +print '+'*20 +parrot('a thousand', state = 'pushing up the daisies') # 1个位置arg 1个keyword arg +print '+'*20 +# parrot() +# error parrot(voltage=5.0, 'dead') +parrot(voltage=5, state = 'dead') +print '+'*20 +# error parrot(110, voltage=220) + +def cheeseshop(kind, *arguments, **keywords): + print '-- do you have any', kind, "?" + print "-- I am sorry, we're all out of", kind + for arg in arguments: + print arg + print '-' * 40 + print keywords + keys = sorted(keywords.keys()) # 将keywords中的字母按首字母排序的 a b c d等顺序 + for kw in keys: + print kw, ":", keywords[kw] +cheeseshop("limburger", + "it's very runny, sir.", "It's really very, Very runny, sir.", + shopkeeper = 'Michael Palin', client = 'John Cleese', sketch = 'cheese shop sketch') + +# 现在我已经理解了 这里的coding \ No newline at end of file diff --git a/_src/om2py0w/0wd2/tutor04Fob.py b/_src/om2py0w/0wd2/tutor04Fob.py new file mode 100644 index 000000000..711381f09 --- /dev/null +++ b/_src/om2py0w/0wd2/tutor04Fob.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# 下面是斐波那契数列 +# 一个数前两个数的和 开始的两个数为 1, 1 +a, b = 0, 1 +while b < 10: + print b + a, b = b, a + b + pass + +i = 256*256 +print 'the vaules of i is', i +print 'the values of i is\n', i \ No newline at end of file diff --git a/_src/om2py0w/0wd3/tutor-4-7-2-dictionary.py b/_src/om2py0w/0wd3/tutor-4-7-2-dictionary.py new file mode 100644 index 000000000..c449e5b92 --- /dev/null +++ b/_src/om2py0w/0wd3/tutor-4-7-2-dictionary.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +a = dict(one=1, two=2, three=3) # values containing Numeric types +f = dict(one=1, three=3, two=2) +b = {'one': 1, 'two': 2, 'three': 3} # +c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) +d = dict([('two', 2), ('one', 1), ('three', 3)]) # lists +e = dict({'three': 3, 'one': 1, 'two': 2}) # dictionarys +g = dict({1: 'one', 2: 'two', 3: 'three'}) + +# position change but the same +# so the keyword is important in dic +if a == b == c == d == e == f: + print 'true' +else: + print 'false' + +if f == g: + print 'true' +else: + print '0' + +print len(a) +print len(d) + +# 什么是dict 中的key key到底是什么? +# d[key] +print d['one'] +print """then i know key in dict d is 'one', 'two', 'three', +but one, two, three is not the key """ +print "*" * 20 +print a['one'] +print "a[one] is not ok, cause NameERROR" +a['one'] += 1 +print a['one'] +print "*" * 20 +class Counter(dict): + def __missing__(self, key): + return 0 +ccc = Counter() +print ccc['red'] +ccc['red'] += 1 +print ccc['red'] + + +print '*' * 20 +for kw in a: + print kw + +print '*' * 20 +keys = sorted(a) # 这里的sort 是按照key的首字母 +for kw2 in keys: + print kw2 + +print 'x' * 20 +dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500} +keys = dishes.viewkeys() # 可以从字面来理解 viewkeys +values = dishes.viewvalues() # viewvalues() +n = 0 +for val in values: + n += val +print(n) +print n + +print '*' * 20 +# keys and valus are iterated over in the same order +print list(keys) +print list(values) + +print '*' * 20 +# view objects are dynamic and reflect dict changes +del dishes['eggs'] +del dishes['sausage'] +print list(keys) # the values and keys are del at the same time +print list(values) # 从这里可以看出 动态的变化 values 是跟着变化的 \ No newline at end of file diff --git a/_src/om2py0w/0wd3/tutor-4-7-4-arbitrary.py b/_src/om2py0w/0wd3/tutor-4-7-4-arbitrary.py new file mode 100644 index 000000000..7337924e0 --- /dev/null +++ b/_src/om2py0w/0wd3/tutor-4-7-4-arbitrary.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +def write_multiple_item(file, separator, *args): # arbitrary argument Lists + file.write(separator.join(args)) +print '*' * 20 +print range(3,6) +print "this below is a list do you know?" +args = [3, 6] +print args +print range(*args) +print "can you see the meaning of this code above? yes" + +print '*' * 20 +def parrot(voltage, state='a stiff', action='voom'): + print "this parrot would not", action, + print 'if you put', voltage, 'volts through it.', + print 'E\'s', state, '!' +d = {"voltage": "FOUR million", "state": "bleedin' demised", "action": "V00M"} +parrot(d) +parrot(**d) + +print """ ** operator can deliver keyword +arguments in dictionaries""" + +print '*' * 20 +print "lets know the lambda expressions" +def make_incrementor(n): + return lambda x: x + n +f = make_incrementor(42) +print f(0) +print f(1) +print f(42) + +def make_sum(n): + return lambda a, b: a + b + n +ff = make_sum(42) +print ff(0, 0) +print ff(1, 1) + +print '*' * 20 +pairs = [(2, 'two'), (1, 'one'), (3, 'three'), (4, 'four')] +print pairs +pairs.sort(key=lambda pair: pair[0]) # I think pair[0] mean the 1st value in lists +print pairs # 此处就是按 list中的 ()中 第一位 value 排序 按数字 +pairs.sort(key=lambda pair: pair[1]) # 此处 ()中 字母排序 abcde的顺序 +print pairs +print "print pair[1] display error: name 'pair' is not defined" \ No newline at end of file diff --git a/_src/om2py0w/0wd3/tutor-4-7-6-Doc-Strings.py b/_src/om2py0w/0wd3/tutor-4-7-6-Doc-Strings.py new file mode 100644 index 000000000..e7bcebccc --- /dev/null +++ b/_src/om2py0w/0wd3/tutor-4-7-6-Doc-Strings.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +def my_function(): + """ Do nothing, but document it. + + No, really, it doesnot do anything. + """ + pass +print my_function.__doc__ + +print "*" * 20 +print """文本说明 + + 1-简洁明了 第一行是summary + 2-多行显示 中间空行 + 3-第三行开始正文 + +end +""" +if a in b : + pass \ No newline at end of file diff --git a/_src/om2py0w/0wd6/search_taobao.py b/_src/om2py0w/0wd6/search_taobao.py new file mode 100644 index 000000000..d4cffb9b7 --- /dev/null +++ b/_src/om2py0w/0wd6/search_taobao.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# ref to https://wp-lai.gitbooks.io/learn-python/content/0MOOC/taobao.html +# 代码所在文件夹 进行命令行输入 python search_taobao.py keyword-1 keyword-2 ... +# win 可在 shell中使用 +import sys +import webbrowser + +keywords = sys.argv[1:] # argument from your keyword-1 and keywords-2 etc + +url = "https://s.taobao.com/search?q=" # search url from taobao +for i in keywords: + url += i + "+" + print url +url = url[:-1] # remove the last "+" +webbrowser.open(url) +print "mission completed" \ No newline at end of file diff --git a/_src/om2py0w/0wd6/search_taobao_error.py b/_src/om2py0w/0wd6/search_taobao_error.py new file mode 100644 index 000000000..297965409 --- /dev/null +++ b/_src/om2py0w/0wd6/search_taobao_error.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# 在win shell 中 无法打开 +import os +import sys + +keywords = sys.argv[1:] + +url = "https://s.taobao.com/search?q=" +for i in keywords: + url += i + "+" +url = url[:-1] +os.system.open(url) \ No newline at end of file diff --git a/_src/om2py0w/0wd6/test_learn.py b/_src/om2py0w/0wd6/test_learn.py new file mode 100644 index 000000000..5d0989495 --- /dev/null +++ b/_src/om2py0w/0wd6/test_learn.py @@ -0,0 +1,2 @@ +ani = "cat" +print ani[:0] \ No newline at end of file diff --git a/_src/om2py0w/0wex0/__init__.py b/_src/om2py0w/0wex0/__init__.py index e69de29bb..907aee669 100644 --- a/_src/om2py0w/0wex0/__init__.py +++ b/_src/om2py0w/0wex0/__init__.py @@ -0,0 +1,2 @@ +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/_src/om2py0w/0wex0/conti_test.py b/_src/om2py0w/0wex0/conti_test.py new file mode 100644 index 000000000..cf48cf63c --- /dev/null +++ b/_src/om2py0w/0wex0/conti_test.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +import sys +from time import localtime, strftime + +reload(sys) # 必须 reload +sys.setdefaultencoding('utf-8') + +script_statement = """ # 脚本说明: + + 1.这是每日日志书写脚本 + 2.请按照提示进行 日志书写 + + 祝您书写愉快! + """ + +print(script_statement.encode(sys.stdout.encoding)) + +diary_name = raw_input("请输入日志名: ".encode(sys.stdout.encoding)) + '.txt' + +yes_list = ['yes', 'yep', 'ye', 'y', 'YES','YEP', 'YE', 'Y'] +no_list = ['no', 'n', 'NO', 'N'] + +def ask_date(prompt): + ok = raw_input(prompt) + if ok in yes_list: + ur_date = strftime("%Y-%m-%d %H:%M:%S", localtime()) # 这里可以调用模块 time 参考 + if ok in no_list: + ur_date = "\n" + return ur_date + +writer = open(diary_name, "w") # if the textfile exist it'll be erased + +done = False +textInput = "" + +while (done == False): + nextInput = raw_input("Please input ur words: ") + "\n" + if nextInput == "end" + "\n": # must add "\n" + inputDate = ask_date("Do you want add date, yes or no?") + writer.write('\n' + inputDate) + break + else: + textInput += nextInput + print nextInput + writer.write(nextInput) # write into textfile.txt and start a new line + +writer.close() + +print ("Here is ur diary: " + textInput) \ No newline at end of file diff --git a/_src/om2py0w/0wex0/diary_final_test.txt b/_src/om2py0w/0wex0/diary_final_test.txt new file mode 100644 index 000000000..3dac56fe8 --- /dev/null +++ b/_src/om2py0w/0wex0/diary_final_test.txt @@ -0,0 +1,3 @@ +һռǽ + +2015-10-20 11:57:15 \ No newline at end of file diff --git a/_src/om2py0w/0wex0/diary_name.txt b/_src/om2py0w/0wex0/diary_name.txt new file mode 100644 index 000000000..19ad73103 --- /dev/null +++ b/_src/om2py0w/0wex0/diary_name.txt @@ -0,0 +1,4 @@ +Ľű README ʾ +Ҫʹ˽ 뵥 end + +2015-10-20 13:58:29 \ No newline at end of file diff --git a/_src/om2py0w/0wex0/find_and_print_files_test.py b/_src/om2py0w/0wex0/find_and_print_files_test.py new file mode 100644 index 000000000..de30d2dce --- /dev/null +++ b/_src/om2py0w/0wex0/find_and_print_files_test.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +import sys, os, glob +# print sys.getdefaultencoding() +reload(sys) # 必须 reload +sys.setdefaultencoding('utf-8') + +current_dir = os.getcwd() +print type(current_dir) +os.chdir(current_dir) + +for file in glob.glob("*.txt"): + print(file) + file_content = open(file, "r") + print file_content.read() \ No newline at end of file diff --git a/_src/om2py0w/0wex0/input_test.py b/_src/om2py0w/0wex0/input_test.py new file mode 100644 index 000000000..a5acf65d0 --- /dev/null +++ b/_src/om2py0w/0wex0/input_test.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +s = raw_input("--> ") +print (s, type(s)) + + +name = input("what's your name? Please include your name into quotes: ") +print ("nice to meet you " + name + "!") + + +age = raw_input("ur age?") +print ("so you are already " + str(age) + " years old, " + name + "!") + +ur_diary = raw_input("Plase input your diary: ") + +print type(ur_diary) +print ("here is your diary:" + ur_diary) \ No newline at end of file diff --git a/_src/om2py0w/0wex0/invoking_test.py b/_src/om2py0w/0wex0/invoking_test.py new file mode 100644 index 000000000..97e540a77 --- /dev/null +++ b/_src/om2py0w/0wex0/invoking_test.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +import sys +reload(sys) # 必须 reload +sys.setdefaultencoding('utf-8') +print ('我爱python'.encode(sys.stdout.encoding)) +keywords = sys.argv[:] +for words in keywords: + print words, \ No newline at end of file diff --git a/_src/om2py0w/0wex0/main.py b/_src/om2py0w/0wex0/main.py index e69de29bb..3d5697ef6 100644 --- a/_src/om2py0w/0wex0/main.py +++ b/_src/om2py0w/0wex0/main.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +import sys, os, glob +from time import localtime, strftime + +reload(sys) # 必须 reload +sys.setdefaultencoding('utf-8') + +yes_list = ['yes', 'yep', 'ye', 'y', 'YES','YEP', 'YE', 'Y'] +no_list = ['no', 'n', 'NO', 'N'] + +def main(): + keywords = sys.argv[1:] # 调用外部数据 + for words in keywords: + print words, + print "\n" + + current_dir = os.getcwd() # 打印之前日志 + os.chdir(current_dir) + + for file in glob.glob("*.txt"): + print(file) + file_content = open(file, "r") + print file_content.read() + + script_statement = """ # 脚本说明: + + 1.这是每日日志书写脚本 + 2.以上打印的是脚本所在文件夹所有日志(txt格式)名称及内容 + 3.请按照提示进行 日志书写 + 4.想要结束日志写作?最后一行请单独输入:end + + 祝您书写愉快! + """ + print(script_statement.encode(sys.stdout.encoding)) + + # ******* 写日志 ******* + done = False + textInput = "" + + diary_name = raw_input("请输入日志名: ".encode(sys.stdout.encoding)) + ".txt" + diary_writer = open(diary_name, "w") + + while (done==False): + nextInput = raw_input("Please input your diary words: ") + if nextInput == "end": + inputDate = ask_date("Wanna add diary date time? yes or no! ") + diary_writer.write("\n" + inputDate) + break + else: + textInput += nextInput + "\n" + diary_writer.write(nextInput + "\n") + + diary_writer.close() + print ("Here is your " + inputDate +" diary: " + textInput) + +# ******* date time function ******* +def ask_date(prompt): # 是否添加时间 + ok = raw_input(prompt) + if ok in yes_list: + your_datetime = strftime("%Y-%m-%d %H:%M:%S", localtime()) + if ok in no_list: + your_datetime = "\n" + + return your_datetime + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/_src/om2py0w/0wex0/main_test.py b/_src/om2py0w/0wex0/main_test.py new file mode 100644 index 000000000..09a4e93e8 --- /dev/null +++ b/_src/om2py0w/0wex0/main_test.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +import sys, os, glob +# print sys.getdefaultencoding() +reload(sys) # 必须 reload +sys.setdefaultencoding('utf-8') + +# ===========调用脚本 外部数据 中英文 +keywords = sys.argv[1:] # The list of command line arguments passed to a Python script +# 命令行中 除脚本名 以外的所有参数都保存在 keywords 中 + +print keywords +print type(keywords) # 查看keyword 它是list 输入英文 print 英文 + +for words in keywords: + # words = unicode(words, "ascii") + # print words + # print type(words) + print words, + +current_dir = os.getcwd() +print type(current_dir) +os.chdir(current_dir) + +for file in glob.glob("*.txt"): + print(file) + file_content = open(file, "r") + print file_content.read() + +print """Congratulations: You have invoked the script main.py + +-- I love coding in Python! +-- Do you love it? + +Have fun in Python Star Trek!""" # + +# name = raw_input("请输入日志名: ".encode(sys.stdin.encoding)) + '.txt' # succeed +name = raw_input("请输入日志名: ".encode(sys.stdout.encoding)) + '.txt' # succeed +# name = raw_input("请输入日志名: ".decode('utf-8')) + ".txt" +# name = raw_input("Glad to write today's diary" +# "\n Please give the name first:") + '.txt' +# 以上 提示中文 是乱码 pshell 会出现乱码 cat 我的日志.txt +# 以上 这输入中文名 也是乱码 +# 待解决 第二日 reboot之后 就自然解决了 amazing +# win 的 reboot 真是强 + +yes_list = ['yes', 'yep', 'ye', 'y', 'YES','YEP', 'YE', 'Y'] +no_list = ['no', 'n', 'NO', 'N'] + +def ask_date(prompt, retries=3, friendly_warn='Please input yes or no'): + ok = raw_input(prompt) + if ok in yes_list: + ur_date = raw_input("Please add date: ") # 这里可以调用模块 time + if ok in no_list: + ur_date = "\n" + + retries += -1 + if retries < 0: + raise IOError('Refuselink user') + print friendly_warn + + return ur_date + +writer = open(name, "w") # if the textfile exist it'll be erased + +done = False +textInput = "" + +while (done == False): + nextInput = raw_input("Please input ur words: ") + if nextInput == "end": + inputDate = ask_date("Do you want add date, yes or no?") + writer.write('\n' + inputDate) + break + else: + textInput += nextInput + print nextInput + writer.write(nextInput + "\n") # write into textfile.txt and start a new line + +writer.close() + +print ("Here is ur diary: " + textInput) + +# ==================== 调用脚本 及其关键字 + + +# 交互 +# ========== 调用 python脚本 +# ========== 中文输入 +# 在 pshell cmd line 中输入中文 如 我爱python +# 问题: 中文 我爱 这部分 输出的是 一种编码形式 解决之 +# 分析: 传递参数(中文字符)后 再次输出 可能没有解码还原为中文字符 +# 方案: google search 原来 在最初运用了 utf-8 编码 输出的时候 没有 unicoding +# keywords = unicode(keywords, "utf-8") +# 但是不能解码list error need string or buffer +# utf 解码错误 +# words = words.defcode("ascii").encode("utf-8") +# 在没有修改默认编码是 以上设置 也是错的 +# 参考 http://www.kryptosx.info/archives/391.html +# ===========持续交互 +# while +# =========== 输出文件 +# - 换行 +# - 日期 +# - 中文编码 +# + 中文编码问题 +# + name = raw_input("请输入日志名: ") + '.txt' 在pshell中 乱码 +# + 分析 +# UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 0: invalid start byte +# 本身 sys.setdefaultencoding('utf-8') 是utf-8 编码的 在pshell中 raw_input("请输入日志名:") 中 +# 双引号中的 请输入日志名 出现乱码 璇疯緭鍏ユ棩蹇楀悕 +# =========== 回读文本 +# - 自动将过往日志打印? +# http://stackoverflow.com/questions/3964681/find-all-files-in-directory-with-extension-txt-with-python +# + 如何找到日志文件 +# + 如何打开 +# + 如何读取 +# + 如何输出日志 +# + 中文OK么 \ No newline at end of file diff --git a/_src/om2py0w/0wex0/open_read_test.py b/_src/om2py0w/0wex0/open_read_test.py new file mode 100644 index 000000000..4643e4d10 --- /dev/null +++ b/_src/om2py0w/0wex0/open_read_test.py @@ -0,0 +1,10 @@ +import os, glob + +current_dir = os.getcwd() +print type(current_dir) +os.chdir(current_dir) + +for file in glob.glob("*.txt"): + print(file) + file_content = open(file, "r") + print file_content.read() \ No newline at end of file diff --git a/_src/om2py0w/0wex0/test ask date.txt b/_src/om2py0w/0wex0/test ask date.txt new file mode 100644 index 000000000..ee2aabdd3 --- /dev/null +++ b/_src/om2py0w/0wex0/test ask date.txt @@ -0,0 +1 @@ +ֻ diff --git a/_src/om2py0w/0wex0/test.txt b/_src/om2py0w/0wex0/test.txt new file mode 100644 index 000000000..76305d6db --- /dev/null +++ b/_src/om2py0w/0wex0/test.txt @@ -0,0 +1,5 @@ +timeʹò +ϴʹõʱʱ +βʹñʱ + +2015-10-20 10:16:27 \ No newline at end of file diff --git a/_src/om2py0w/0wex0/test_str.txt b/_src/om2py0w/0wex0/test_str.txt new file mode 100644 index 000000000..dd7ca6b91 --- /dev/null +++ b/_src/om2py0w/0wex0/test_str.txt @@ -0,0 +1,3 @@ +this is file to test string and find "\n" + +2015-10-20 11:29:11 \ No newline at end of file diff --git a/_src/om2py0w/README.md b/_src/om2py0w/README.md index 1511d4a76..6add68d38 100644 --- a/_src/om2py0w/README.md +++ b/_src/om2py0w/README.md @@ -1,7 +1,21 @@ # OMOOC.py 周任务代码试作 -## 0w +## 0w 日记交互系统 - py 调用 + - 拷贝 or clone 代码 [main.py](https://github.com/JeremiahZhang/pybeginner/blob/master/_src/om2py0w/0wex0/main.py) 到您的文件目录中 比如 `usr/om2py0w/0wex1/` + - win 7 系统 Powershell 打开上面的文件目录 使用 `cd` + - 执行 `python mian().py 我爱 python` + + pshell 第一行就打印 外部数据(关键字) `我爱 python` - CLI: + 交互 + + 在上一步调用脚本 打印外部数据后 会显示脚本说明 请按着脚本说明进行 + + 按住说明进行 日志写作(文件自动保存为txt格式) 每写完一行 回车进行下一行书写 + + 如何结束? 单行输入 `end` + + 会询问是否添加日期时间,请输入以下list中的任何一个英文字符或字符串 比如 `yes` 或者 `no` + + 代表添加日期时间的string list: `yes_list = ['yes', 'yep', 'ye', 'y', 'YES','YEP', 'YE', 'Y']` + + 代表不添加日期时间string list: `no_list = ['no', 'n', 'NO', 'N']` + + 最后会打印你刚刚写作的所有内容(不包括时间) + + shell中打开文件 `cat diary_name.txt` 会日志内容 + + 演示 + ![演示](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/05_readme_pre.JPG) From 810a0fb45dd57e2a7122a71d38e0c14ec3b4b1b1 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 15:24:49 +0800 Subject: [PATCH 007/432] 1w task --- 2nDev/week01_interact.md | 296 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 295 insertions(+), 1 deletion(-) diff --git a/2nDev/week01_interact.md b/2nDev/week01_interact.md index 9e326420c..0628ba940 100644 --- a/2nDev/week01_interact.md +++ b/2nDev/week01_interact.md @@ -1 +1,295 @@ -# week_1_交互 +# week_1 日志交互系统 + +## 背景 ## + +第一周的任务:交互-101 + +- 极简交互式日记系统 + - 一次接受一行日记 + - 保存为本地文件 + - 再次运行系统时 能打印过往所有日记 + +### 任务分解 ### + +在芝麻星系统中 学习卡片已经分解完 + +1. 脚本调用 +2. 调用参数 +3. 输入中文 +4. 持续交互 +5. 输出为文件 +6. 回读文本数据 + +我一上来 看完交互任务 分析的时间是比较短的 没有冷静的去分析 而是直接看一个个已经拆解好的子任务卡片了 然后等完成任务的时候 发现卡片还可以翻页 后面就是提示 然而。。。我已经完成。。。 **欲速则不达** 保持冷静 保持冷静 不要太着急 慢慢来 这是**自我探索 分析的旅程** 谨记 + +---------- + +## 1-脚本调用 ## + +- 什么是脚本 + - 脚本:就是你写代码的容器 你在哪里写代码的,那个文件就是脚本,python的脚本是**.py**格式的文件 +- 如何调用 + - win 系统 打开[powershell](https://en.wikipedia.org/wiki/Windows_PowerShell) + - python脚本所在本件目录 比如我的`mian.py`在E:\usr\pybeginner\_src\om2py0w\0wex0中 then 在 shell 中输入`cd E:\usr\pybeginner\_src\om2py0w\0wex0` + - 调用脚本: `python main.py` + +以上 可成功调用 python脚本 + +## 2-调用参数 ## + +- 什么参数 + - 就是外部数据 + - 在shell中输入的数据 + - 可以被main.py脚本调用 + +之前在看 @小赖同学 [淘宝搜索](https://wp-lai.gitbooks.io/learn-python/content/0MOOC/taobao.html)教程的时候 了解到原来在shell中输入 + + python mian.py keywords1 keywords2 ... + +就可以使 main.py 脚本调用 外部数据(参数 关键字词)keywords1 和 keywords2 + +- 调用外部数据 如 + - `python invoking_test.py i love python` +- 分析: + - 使用sys模块(System-specific parameters and functions) 之前已经了解 仍查询help文档: +> This module provides access to some variables used or maintained by the interpreter and to functions that interact strongly with the interpreter. It is always available. +> 可获得编译器中变量和与交互时所需用的函数 + +### 1.代码 ### + # -*- coding: utf-8 -*- + import sys + keywords = sys.argv[:] + print keywords + print type(keywords) +- 注意 + - 通过`sys.argv`将shell中的参数keywords**传递**到python脚本中 + - sys.argv[0]代表的是python脚本的名字 `invoking_test.py` + - sys.argv[1] 为 keywords1 + +shell 执行 `python invoking_test.py i love python` 果效: + + ['invoking_test.py', 'i', 'love', 'python'] + + +---------- + +## 3-输入中文 ## + +### 问题1 ### + +invoking_test.py 代码 + + # -*- coding: utf-8 -*- + import sys + print '我爱python' + keywords = sys.argv[:] + print keywords +shell调用 + + python invoking_test.py 我 爱 python +结果 + + 鎴戠埍python + ['invoking_test.py', '\xce\xd2', '\xb0\xae', 'ptyhon'] +可见 `我` 和 `爱`两个外部数据 使用被脚本调用之后 print 在shell中不正常显示中文 + +但是直接Sublime Text 直接运行是可以 `我爱python`是正常显示的 + +### 分析 ### + +- keywords1 和 keywords2 等是中文的怎么办? + - 这个和编码相关 折腾下来 发现中文坑 + - 最好写代码的时候 首次全部用英文完成 + - 然后测试中文 + - 要不会很混乱 + - shell与st2编码又是不同的。。。。 + - 不是有`# -*- coding: utf-8 -*-`申明了么?怎么还是没有用 + - 申明只对脚本中的有用 + - 而shell调用脚本 输出就需要解码啦 print '我爱python' 出现乱码 + - 鎴戠埍python + - 查看官方文档 unicode 然后 + - google search到 [http://www.kryptosx.info/archives/391.html](http://www.kryptosx.info/archives/391.html "python中文编码问题") + + +### 尝试 +代码 + + # -*- coding: utf-8 -*- + import sys + reload(sys) # 必须 reload + sys.setdefaultencoding('utf-8') # 默认编码 + + print ('我爱python'.encode(sys.stdout.encoding)) # 编码 输出 + keywords = sys.argv[:] + for words in keywords: + print words, +shell 果效 + + 我爱python + invoking_test.py 我 爱 ptyhon +ST2中也正常 +done + +---------- + +## 4-5 持续交互 + 输出为文件 ## + +- 运行等待输入 + - while 循环 +- 退出脚本 + - 是否退出 日志写完以 `end` 结尾代表退出 + - 退出时 是否添加时间 `def ask_date()` +- 输出为文件 + - txt + - 打开文件`open()` 写入`write()` + +代码 + + yes_list = ['yes', 'yep', 'ye', 'y', 'YES','YEP', 'YE', 'Y'] + no_list = ['no', 'n', 'NO', 'N'] + + def ask_date(prompt): # 退出时是否添加时间 + ok = raw_input(prompt) + if ok in yes_list: + ur_date = raw_input("Please add date: ") + if ok in no_list: + ur_date = "\n" + return ur_date + + done = False + textInput = "" + + writer = open(diary_name, "w") # if the textfile exist it'll be erased + + while (done == False): # 持续输入日志 + nextInput = raw_input("Please input ur words: ") + if nextInput == "end": + inputDate = ask_date("Do you want add date, yes or no?") # 询问退出的时候添加日期 + writer.write('\n' + inputDate) + break + else: + textInput += nextInput + print nextInput + writer.write(nextInput + "\n") # write into textfile.txt and start a new line + + writer.close() + print ("Here is ur diary: " + textInput) # 你的日志内容 + +### 问题 ### + +时间是手动输入的 是否可以询问之后 自动输入呢? + +search stackoverflow [http://stackoverflow.com/questions/415511/how-to-get-current-time-in-python](http://stackoverflow.com/questions/415511/how-to-get-current-time-in-python "datetime") + +使用 time 模块 + + from time import gmtime, strftime + strftime("%Y-%m-%d %H:%M:%S", gmtime()) +help文档中 `time.gmtime` 使用UTC(世界标准时间)的时间 +进而改为`localtime()` + +### 执行 ### + +添加模块 `from time import localtime, strftime` + +修改 `ask_date()` 中的代码 + + if ok in yes_list: + ur_date = strftime("%Y-%m-%d %H:%M:%S", localtime()) + +果效 + +![datetim vic](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/01_time_test.JPG) + +---------- + +## 6 回读文本数据 ## + +- 可以将过往的日志比如txt文件打印出来 +- 让脚本可以对电脑中(操作系统)的文件进行-寻找-打开 + - 使用`os`: `Miscellaneous operating system interfaces` + - 打开当前目录 `current_dir = os.getcwd()` `os.chdir(current_dir)` + - 找到txt文件:`glob`模块 `glob.glob(*.txt)` +- 7.2. Reading and Writing Files + - 打开 `open(filename,mode)` mode常用如下: + - "r" : 可读 + - "w" : 可写 + - "a" : append 附加在文件后面 + - 读取 `read()` + +代码: + + import os, glob + current_dir = os.getcwd() + print type(current_dir) + os.chdir(current_dir) + + for file in glob.glob("*.txt"): + print(file) + file_content = open(file, "r") + print file_content.read() +pshell 执行,可以成功读取代码所在文件夹中所有的txt文件 并打印 果效: +![open_read_print](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/02_open_read_print.JPG) + +---------- + +## 整合 ## + +以上6个子任务 整合成一个完整的脚本 [main.py](https://github.com/JeremiahZhang/pybeginner/blob/master/_src/om2py0w/0wex0/main.py) + +win pshell 中调用 `python main.py 我 爱 Python` + +果效: +![diarylog](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/03_all_done.JPG) + +---------- + +## 使用 ## + +- 模块 + - sys + - os + - glob + - time +- build function + - open() + - file.read() + - 模块中的func + - sys.setdefaultencoding('utf-8') + - sys.argv[] + - string.encode(sys.stdout.encoding) + - os.getcwd() + - glob.glob() + - strftime() + +## 反思 ## + +第一周任务下来 先将任务完成了 最后在写教程的时候 又对代码进行了测试 因为都写在了一个脚本中 所以再次测试的时候 就重新来过 消耗了无谓的时间 缺少**全局观** **调正** + +完成任务时: + +- 分析 +- 然后 google site:stackoverflow 进行关键字搜索 对应模块 函数 +- help document 查询 + +PS + +- **淡定自在** 任务发布的时候 简单看了一下任务 没有进行太多的分析 总在想赶着完成任务似的 这是不可行 也不可持久的 记住是探索 +- **水平** 高手和新手的一个区别 任务分解能力 + + 学会分析问题 拆解问题 解决问题 + + Keep calm Keep Thinking Smartly +- **关于教程** 发现自己写的比较冗余?如何改进写教程呢? +- **改进** + - 遇见问题 或 项目 + - 分析是**什么** + - **怎么**做 分解问题 拆解项目 + - 循序渐进 + - 实践 模仿 创意 + - 子项 + - 一个个脚本编写 + - 测试 + - 整合 + - 不要一股脑儿就在 一个脚本中 进行 + + + \ No newline at end of file From 85c04e7089b028b15c332473c2f6644f0b8e7661 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 15:28:10 +0800 Subject: [PATCH 008/432] 0mmooc --- 0MOOC/SubPy.md | 168 ++++++++++++++++++++++++++++++++ 0MOOC/doublepush.md | 109 +++++++++++++++++++++ 0MOOC/gitbook.md | 100 +++++++++++++++++++ 0MOOC/learngit.md | 230 +++++++++++++++++++++++++++++++++++++++++++- 0MOOC/win7.md | 106 +++++++++++++++++++- 5 files changed, 711 insertions(+), 2 deletions(-) diff --git a/0MOOC/SubPy.md b/0MOOC/SubPy.md index 911e01129..252cedb62 100644 --- a/0MOOC/SubPy.md +++ b/0MOOC/SubPy.md @@ -1 +1,169 @@ # ST2与Py环境配置 + +- Sublime Text 2 插件使用和Python环境设置 + +> [Sublime Text](http://www.sublimetext.com/)是一套跨平台的文本编辑器,支持基于Python的插件。Sublime Text 是专有软件,可通过包(Package)扩充本身的功能。大多数的包使用自由软件授权发布,并由社区建置维护。 [详见wiki](https://zh.wikipedia.org/wiki/Sublime_Text) + +嗯 就是超级好用的文本编辑器 为什么就来看看英文版的说服力吧: + +> Sublime Text is a sophisticated text editor for code, markup and prose. +You'll love the slick user interface, extraordinary features and amazing performance. + +系统:win7 +之前就捣腾过 Py2.7.8 安装就不再进行了 + +- ST2 基础设置 +- Package Control(插件管理 下载) +- ST2 中配置Python开发环境 +- 我的常用快捷键 + + `ctrl+shift+p` 去install package + + `ctrl+alt+a` 对齐代码 + + 本来 `ctrl + b` 可以进行编译 现在设置 `f5` 进行编译 + + `ctrl+shift+c` Stop 终止程序 + +---------- + +## 基础设置 ## + +- Sublime Text 2 进入 菜单 `Preferences -> Settings - User` +- 在编辑器窗口中编辑 进行我的相关配置 + + `"draw_white_space": "all", // 显示空白字符, 比如 空格 tab` + `"font_size": 13.0, // 字体大小` + `"scroll_past_end": true, // 当文件到末尾时还能继续滚动` + `"trim_automatic_white_space": false // 关闭自动删除每行前后空格` + +---------- + +## Package Control ## + +[Package Control](https://packagecontrol.io/installation#st2)用来管理 Sublime Text 2 插件的插件. 当然需要第一个安装 + +- 利用快捷键 ctrl+` or 点击菜单栏进入 + + `View > Show Console` +- 直接去官网Copy 代码 paste the appropriate Python code for your version of Sublime Text into the console. + + import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation') +- 重启生效 菜单下有 `Preferences -> Package Settings` 选项 +- 以上亦可以手动设置 [参考官网](https://packagecontrol.io/installation#Manual) + +### 使用Package control ### + +[官网Usage](https://packagecontrol.io/docs/usage) 提供了相关描述 + +> To open the palette, press ctrl+shift+p (Win, Linux) or cmd+shift+p (OS X). All Package Control commands begin with Package Control:, so start by typing Package. +> The command palette will now show a number of commands. Most users will be interested in the following: + +- windows下`ctrl+shift+p`快捷键进入Package Control 命令行 +- 安装插件 + + 输入`install package` + + 输入我想要装的插件 如 [Alignment](http://wbond.net/sublime_packages/alignment) 选择安装 + * Alignment 这个插件用于对齐代码赋值语句 例如 + + var name = "sublime" + var version = "2.0.1" + var title = "sublime text" + * 按快捷键 可在`Preferences -> Package Settings -> Alignment -> Key Bindings defult` 中查看 + * 嗯 设置完之后 **请 restart 再使用快捷键** 这里我死后被坑了 一直找不到原因 后来 restart 就 ok 了 请注意 若设置好快捷键请 restart 嗯 Alignment 效果如下 + + var name = "sublime" + var version = "2.0.1" + var title = "sublime text" + +以上参考 [Sublime Text 常用插件和设置](https://wido.me/sunteya/sublime-text-packages-and-settings/) + +### 教训 ### + +> - 嗯 Package 之后 直接去 官网进行查询相关插件 安装使用效率会比查别人高很多 吸取了教训 +> - 以后 多用官方文档 +> - 比如 我要search markdown [PC markdown](https://packagecontrol.io/search/markdown) 就有许多插件了 安装可以直接看源文档的 更快捷高效 + +- 安装[Markdown Preview](https://packagecontrol.io/packages/Markdown%20Preview) 使用 一目了然 + +---------- + +## 配置Python开发环境 ## + +- 也就是如何在Sublime text 2中运行Python code + + `Tools -> Build System -> (choose) Python` + + 打开 `.py` Python代码文件 + + `Ctrl + B` 运行 or 编译 +- 如遇到死循环或中途需要停止程序 该如何操作 + + `Ctrl + Break` or `Tools -> Cancel Build` + + 我也可以自己设置 stop 快捷键 + + 进入菜单栏 `Preferences -> Key Bindings - User` + + 将如下代码贴入 + + {"keys": ["ctrl+shift+c"], "command": "exec", "args": {"kill": true} } + + 以上 就可以用 `ctrl+shift+c` 来代替 `Ctrl + Break` 终止程序运行 + +参考 [stack overflow](http://stackoverflow.com/questions/8551735/how-do-i-run-python-code-from-sublime-text-2) + +### 问题 ### + +- 我写了一段代码 如下 + + name = raw_input('Enter your name: ') + print 'Are you really', name, '?' + print 'Are you really' + name + '?' +- `Ctrl + B` 编译 +- 显示 error + + name = raw_input('Enter your name: ') + EOFError: EOF when reading a line + +> 代码中如果使用了input等函数进行交互的时候,直接使用Ctrl+B进行编译时,运行信息栏内无法输入交互信息,程序会提示报错。 + +- 解决 安装插件 + + [SublimeREPL](https://github.com/wuub/SublimeREPL) run an interpreter inside ST2 用来编译(运行)我的py程序 在工具栏 `Tools -> SublimeREPL -> python -> RUN current file` + + **优化之快捷键设置** SublimeREPL安装之后没有快捷键 每次运行程序必须用鼠标去点工具栏 增添效率 就给 SublimeREPL 添加快捷键 `Preferences -> Key Bindings - User` + + {"keys":["f5"], + "caption": "SublimeREPL: Python - RUN current file", + "command": "run_existing_window_command", "args": + { + "id": "repl_python_run", + "file": "config/Python/Main.sublime-menu" + } + } +> - 注意 在添加快捷键的时候 因为我之前添加过一次快捷键 所以 再次添加时 需要在上一个快捷键代码行的最后加上一个 comma 而且要是 英文的comma 否则会出错 系统也会提示 +> - 查看 SublimeREPL [所有Python方法的名称及id](https://github.com/wuub/SublimeREPL/blob/master/config/Python/Default.sublime-commands) 进行快捷键设置 我这里只设置了 `SublimeREPL: Python - RUN current file` 命令 + +- 果效 + - `f5`键 可以快速进行调试和交互的程序了 + - 例如 `f5`键 运行起初的 `raw_input` 那段代码 可以进行交互 如图所示 +![REPL](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/0-REPL.JPG) + +---------- + +### 其他插件 ### + +- [SublimeCodeIntel](https://github.com/SublimeCodeIntel/SublimeCodeIntel) +> SublimeCodeIntel 可以支持代码的自动补全以及成员/方法提示等功能,安装此插件后,Sublime Text 2就有点IDE的感觉了。 + +- [SublimeLinter](https://github.com/SublimeLinter/SublimeLinter-for-ST2) +> SublimeLinter 是用来在写代码时做代码检查的,可以检查Python代码是否符合[PEP8](https://www.python.org/dev/peps/pep-0008/)的要求。 + +这两个可能太高级 嗯 入门阶段 暂时先不用这两个 虽然也装了 + +参考 [基于Sublime Text搭建Python IDE](http://loosky.net/2967.html) + +---------- + +## 总 ## + +当完成以上配置 并记录好后 才发现 大妈的模板是 + +- 现象 +- 问题 +- 分析 +- 方案 +- 执行 + +嗯 我看看自己的过程 总是没有大的框架在那 然后 走到随性而走 不好 得补这个缺 + +---------- + +## 进展 + +- 10/8/2015 雷雨创建 \ No newline at end of file diff --git a/0MOOC/doublepush.md b/0MOOC/doublepush.md index a07f8bf83..93a2ebe2d 100644 --- a/0MOOC/doublepush.md +++ b/0MOOC/doublepush.md @@ -1 +1,110 @@ # 双推 + +## 背景 ## + +在完成第一周任务的时候 每天code之后 push到github 与 gitbook中 都要使用: + + $ git push hub master + $ git push book master + +来实现[双推](https://jeremiahzhang.gitbooks.io/pybeginner/content/toolssupport/gitbook.html) 有嫌麻烦 但是一直没去改变 程序员是需要精简的 + +触动 @小赖同学 在Issue中 发表 双推的代码 + +嗯是该动起来 不能再每日都如上面上面一样的双推了 + +## 方案 + +根据 @小赖同学 提供的[stackoverflow问答](http://stackoverflow.com/questions/849308/pull-push-from-multiple-remote-locations) 去解决 + +1.使用: + + git remote set-url origin --push --add + git remote set-url origin --push --add + +2.修改 本地目录(local repo)中的.git/config + +## 执行 + +1.从.git/config获得自己github与gitbook的远程库`ssh`或`http` url (每个github 远程库都有自己的url 每一本gitbook书籍也一样)因为之前已经设置了两个 remote : hub (代表github中的remote repo)与 book (代表gitbook书籍 remote repo) + + [remote "hub"] + url = git@github.com:JeremiahZhang/pybeginner.git + [remote "book"] + url = https://https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + +**注**apitoken在gitbook[用户设置](https://www.gitbook.com/@jeremiahzhang/settings) + +2.根据`git remote set-url origin --push --add ` 添加 remote 设置 添加 gitbook remote repo `http` url to [hub]中(gitbook的`ssh`我没有尝试 因为之前实现[双推](https://jeremiahzhang.gitbooks.io/pybeginner/content/toolssupport/gitbook.html)的时候没有用) + + git remote set-url remote_name --push --add jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + +**注** remote_name 必须是我现有的 remote (此处我选择自己的remote为 `hub` )可以在.git/config查看 也可以直接在git bash 中运行 git remote查看 + +添加之后 .git/config 中出现: + + [remote "hub"] + url = git@github.com:JeremiahZhang/pybeginner.git + fetch = +refs/heads/*:refs/remotes/hub/* + pushurl = https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + +新增了 + + pushurl = https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + +3.以防万一 直接在hub中添加自己原先的ssh + + git remote set-url remote_name --push --add git@github.com:JeremiahZhang/pybeginner.git + +同样.git/config的变化可查看: + + [remote "hub"] + url = git@github.com:JeremiahZhang/pybeginner.git + fetch = +refs/heads/*:refs/remotes/hub/* + pushurl = jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + pushurl = git@github.com:JeremiahZhang/pybeginner.git + +4.修改.git/config的 alias 【alias就是git 命令的 昵称或绰号】 + + [alias] + co = checkout + ci = commit -m + st = status + br = branch + pu = push hub master + pl = pull + ad = add --a + hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short + type = cat-file -t + dump = cat-file -p + rf = reflog +5.修改本地文件内容 `git ad` `git ci`后 `git pu` 就实现双推 立即化简了上面 需要两次 `git push` 了 + +## 修改 ## + +考虑到 hub 已经是一个 remote 名字 就修改 添加一个新的 remote origin + +1-直接在.git/config中添加如下代码: + + [remote "origin"] + pushurl = https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + pushurl = git@github.com:JeremiahZhang/pybeginner.git + +2-[alias]中 修改push的绰号 + + pu = push hub master + +3-测试 git pu 成功 + +## 反思 ## + +- DRP记住 不要重复我自己 所以当发现重复复杂的行为的时候 立即思考 搜索没有有精简的办法 +- 其实一切以上只要修改.git/config文件中代码就行了 不过还是进行命令行的可操行和拓展性更强 就像之前群里说的160推 +- 看看接下来能不能实现160推 。。。推 拓展 big picture + +10/19/2015 9:51:59 PM 添加 + + + + + diff --git a/0MOOC/gitbook.md b/0MOOC/gitbook.md index 32be37ba4..8be4cd27e 100644 --- a/0MOOC/gitbook.md +++ b/0MOOC/gitbook.md @@ -1 +1,101 @@ # Gitbook + +*增补 + +是什么 + +> GitBook是一个基于 [Node.js](https://nodejs.org/en/) 的命令行工具,可使用 Github/Git 和 [Markdown](http://baike.baidu.com/view/2311114.htm) 来制作精美的电子书,GitBook 并非关于 Git 的教程。 + +为什么 + +- 制作教程 教会半年前的自己 教是最好的学 +- 获得反馈 +- 可输出多种格式文件PDF epub mobi + + +## 现象 + +- gitbook 升级后, 关联 github 有问题 + +## 分析 + +- gitbook 服务升级, github 的 hook 没有对应升级 +- 虽然增加了 [webhook](https://help.gitbook.com/github/index.html#webhooks) 但是还是出现 github与gitbook不同步现象 即 push to github 而 gitbook 没有对应改变 或者 改变较慢(当然自己自己目前发现 我的add webhook过程见 [webhook setup](https://jeremiahzhang.gitbooks.io/gitbookguide/content/build/webhookssetup.html)) 只能用double push **增补** + + push to github + + push to gitbook + +## 问题 + +- 多个仓库的自动化同步,官方不支持了. + +## 方案 + +~ 作为不折腾会死星人,当然有姿势解决所有问题... + +### 双推 double push *增补 + +所谓双推 就是将本地working directory(or我称其为Local Repo)的内容 即push到 Github 仓库 又推送到 Gitbook + +#### 实现 #### + +一推 github + +- 我在Github Fork(相当于复制为我所用)[学员模板仓库](https://github.com/OpenMindClub/OMOOC.py) 我要基于该模板仓库建立自己学习开智编程课的教程 并改名为pybeginner 该远程库ssh为 `git@github.com:JeremiahZhang/pybeginner.git` +- 在我的电脑端本体建立文件目录(文件夹) 比如我建立的是名为pybeginner的文件夹(我称其为Local Repo 本地仓库) + + `git init` 初始化 以便与远程Repo连接 + + `git remote add hub git@github.com:JeremiahZhang/pybeginner.git` 此处我将Local Repo与Github Repo远程仓库建立连接 这里hub是我定义Github repo的名字 而ssh值我add的是代表**Github上的pybeginner仓库** + + `git branch --track hub master` + + `git pull hub master` 以上将我的 github repo pybeginner拉回(传送 如星际迷航中的瞬间传送)本地local repo + + `git merge hub` [合并分支](https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6) + + `git br -d hub` 删除分支 hub + + 以后我只要在local repo编辑内容 再push 到github 就OK了 + + 如 `git add README.md` 修改了README.md文件 通过 git add 添加到[staging area](https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80#%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%89%E7%A7%8D%E7%8A%B6%E6%80%81) + + `git commit -m "modified README.md"` 提交到[git repository](https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80#%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%89%E7%A7%8D%E7%8A%B6%E6%80%81) + + `git push -u hub master` 推到github + +> 已经推到了Github这是一推 下面需要另一推才能形成二推 + +二推 gitbook + +- Gitbook网页建立我的书籍 [Python Beginner Guide For Leiyu](https://www.gitbook.com/book/jeremiahzhang/pybeginner/details) 并找到 该书的 Git url 在书籍主页右下角 Setup 中 比如本书的git url为`https://git.gitbook.com/jeremiahzhang/pybeginner.git` +- $`git remote add book https://username:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git` 建立Local repo与gitbook repo的连接 其中username为gitbook的名称 apitoken是每个Gitbook账户特有的 可以在Account setting中找到 book为对应gitbook repo名字 可以自己命名的 +- `git push -u book master` 将Local repo 推送到 gitbook + +以上就是 双推 double push + +## Disqus 评论 *增补 + +> gitbook 还支持许多插件,用户可以从 [NPM](https://www.npmjs.com/) 上搜索 gitbook 的插件,[gitbook 文档](https://github.com/GitbookIO/plugin) 推荐插件的命名方式为: +> +- gitbook-plugin-X: 插件 +- gitbook-theme-X: 主题 +> +所以,可以通过以上两种方式来搜索 gitbook 的插件或者主题 + +作为一个非常流行的为网站集成评论系统的工具,Gitbook可以集成Disqus 便于和读者进行交流 好形成反馈 + +- 1 首先注册Disqus 参考[配置 Disqus](https://openmindclub.gitbooks.io/omooc-py/content/support/Disqus_Setup.html) +- 2 install disqus plugin + + `$ npm install gitbook-plugin-disqus -g` +- 3 增加book.json文件 代码如下 + + { + "plugins": ["disqus"], + "pluginsConfig": { + "disqus": { + "shortName": "XXXXXXX" + } + } + } +- 效果 + - 在每一个页面都出现一下Disqus评论窗口 + +![disqus01](https://raw.githubusercontent.com/JeremiahZhang/gitbookguide/master/_images/disqus-01.JPG) + +详细可参考我的 [折腾GitbookGuide](https://www.gitbook.com/book/jeremiahzhang/gitbookguide/details) + +## 进展 + +- 150317 大妈创建 +- 151007 雷雨增补 \ No newline at end of file diff --git a/0MOOC/learngit.md b/0MOOC/learngit.md index b38dc9366..6d384ac23 100644 --- a/0MOOC/learngit.md +++ b/0MOOC/learngit.md @@ -1 +1,229 @@ -# Learn Git +# Learn Git # + +- 1-version control +- 2-历史版本 + - 版本回退 +- 3-设置版本标签 +- 4-小技巧:设置alias +- 5-撤销本地修改(before staging) +- 6-撤销已添加到缓存区的修改(before commit) +- 7-撤销commit到远程库(git revert) +- 8-git pull将远程库拉到本地 +- 9-删除远程库 git remote rm +- 10-git clone < git url > 思想clone之意 就已明了 + +## 1-Push a new local repo to Github ## + +已经有一个origin repo了,现在新建一个新的local repo(用以记录机器学习的学习历程),然后推送到github上: + +- 创建版本库 + - 在自己的电脑文件夹中新建了my machine learning journey的文件夹 + - 然后直接git init here + - git init + - 添加readme文件和机器学习的文件夹 +- 远程仓库设置 + - creat a new repo + - copy the SSH of the new repo + - git add --a + - git commit -m "add new repo" + - git remote add learnml <-my SSH clone URL add-> + - git push -u learnml master + +---------- + +## 2-git 基础 ## + +- working directory:工作区,本地目录,你可以对里面的文件进行操作 +- staging area +- .git directory(Repository) + +we need to know that: + +- changes, not files + - **Git works with changes, not files**. so when I modify the file in the working directory and git add this file,this modifier will be add to the staging area. After that I use the "git commit" to commit this change to repository. + - SO use "git add" to track the changes, and then git commit to repo. +- **History** 历史 + - git log + - git log --pretty=oneline: 用一行来显示git 快照下来的commit历史或版本历史 + - git reflog + - git log --pretty=oneline --max-count=2 : 显示最开始的两个 + - git log --pretty=oneline --since='5 minutes ago' + - git log --pretty=oneline --until='5 minutes ago' + - git log --pretty=oneline --author= + - git log --pretty=oneline --all + - git log --all --pretty=format:'%h %cd %s (%an)' --since='7 days ago':查看最近一周的修改变化。” + - git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short:以另一种显示方式来呈现 +- **版本回退** + - git log or git reflog + - git reset --hard <使用git log or git reflog中的hash值 前7位就可以了> + - cat :来显示文件内容 + +> note 在unix 和mac os中版本回退的命令与window的是同的 + +---------- + +## 3-Tagging Version ## + +- 给commit的版本贴个标签tag:**git tag v1** +- 使用tag name来check out 回退:**git checkout v1^** +- 查看使用的标签 **git tag** +- 查看标签列表 **git hist master --all** + +> Learn how to tag commits with names for future reference + +### 实践 ### + +- 我新建了一个hello.md文件,并添加内容为【# Hello world】 +- **git add** 之后 +- **git commit** 之后 +- **git tag v1** +- **git checkout v1^** +- **cat hello.md** 之后显示 + + cat:hello.md: No such file or directory + +> - 也就是说 git tag v1 是将commit的快照下的那个版本打上标签v1,便于以后回退 +> - 那么 v1^ (或v1~1)是表示的是 v1上一个版本或上一代 + +- **git checkout v1** 之后 +- **cat hello.md** 之后 我的文件又回来了,真的太棒了 + + # Hello world + +- git tag 查看所使用的 tag +- git hist master --all + +> So cool, I can see the tag. + +---------- + + +## 4-小技巧 ## + +- alias:修改git普通命令,使用别名在.gitconfig中修改如,使用起来更方便 + - co = checkout + - ci = commit + - st = status + - br = branch + - hist = log --pretty=oneline + - type = cat-file -t + - dump = cat-file -p + - rf = reflog + +---------- + +## 5-撤销本地修改undoing local changes(before staging) ## + +> - Learn how to revert changes in the working directory. +> - 若我本地工作目录中修改了文件hello.md, 但是我并没有提交add 到缓存区中,更没有commit到远程库中,那么我该如何回退或撤销? +> - git checkout + +- 我在hello.md文件中添加了 + - I want to learn how to revert changes in the working directory. + + # Hello world + + - I want to learn how to revert changes in the working directory. + +- 确定上一次的提交是在master上 + - git checkout master + - 这个使用使得我之前commit的撤回了,回退到我上上会的版本处 + - 比如最近的版本是 v1 + - 使用上面的命令后,回到了上上个版本v1^处 +- git status + - 提示我修改了hello.md文件,但是没有add 和commit +- git checkout hello.md +- git status +- cat hello.md 之后就只剩下了如下内容,说明我撤销了最近一次的本地修改 + + # Hello world + + +> It is so cool. I love Git. + +---------- + +## 6-撤销已添加到缓存区的修改 ## + +> Learn how to revert changes that have been staged. + +- **git reset HEAD ** +- git checkout 用来撤销工作区文件修改 + +修改的文件,已经git add 添加到缓存区,但是没有commit到远程库repo,如何撤销本次的添加到缓存区呢? + +- 简单修改文件hello.md,内容如下 + + # Hello world + - I want to learn how to revert changes in the working directory. Got it. + - Undoing staged changes(before committing) +- git add hello.md + - 将文件添加到了缓存区 + - 但是没有 commit +- cat hello.md + - 查看文件内容 +- git status + - 可以发现提示 **modified hello.md 一行** 是蓝色的,说明已经将文件添加到缓存区 +- git reset HEAD hello.md + - 撤销本次add添加到缓存区 + - 【note】:reset命令不会修改工作目录中的文件内容 +- git status + - 发现此时 **modified hello.md 一行** 是红色的,说明已经撤销了git add(上传到缓存区) +- cat hello.md + - 文件内容没有改变 +- git checkout hello.md + - 此时就撤销了在工作目录中hello.md内容的修改 +- cat hello.md + + # Hello world + - I want to learn how to revert changes in the working directory. Got it. + +回到了修改前状态。 + +> It is so cool. I love Git. + +### 问题来了 ### + +- 那么我该如何再回到我修改后的状态呢? + - 因为本次我没有commit + - 不可使用版本回退 + - git log 后没有hash值所以不可使用 git reset --hard <前7位hash值,但不包括挂号> + +---------- + +## 7-Undoing commit changes ## + +- git add +- git commit -m "..." +- git revert HEAD + +> 学习在commit之后,撤销此次的commit。 +> but 在window中出现vim底层界面。 + +## 8-git pull ## + +- 问题:我在远程库repo中进行了文件的修改,与我本地目录中的文件出现了不同 +- git push 提示不成功,需要git pull +- then 操作 + - git remote add learnml ../...git 【这个之前设置过了就不用再设置了】 + - git branch --track learnml master + - git pull learnml master + +> 这个流程过程和git push 正好可逆。 +> - git push 之前先要 add 与commit +> - git pull 之前,先要将分支track一下 + +## 9-git remote rm * ## + +远程库重名了 或需要删除 用此命令 +注意 git branch -d 是删除branch分支的 +不要混淆 + +10/8/2015 + +---------- + +## 进展 ## + +- 1-8 与开课前就已经学习 并创建 +- 带`*`的是增补 10/8/2015 雷雨增补 \ No newline at end of file diff --git a/0MOOC/win7.md b/0MOOC/win7.md index e07692709..99d0a840a 100644 --- a/0MOOC/win7.md +++ b/0MOOC/win7.md @@ -1 +1,105 @@ -# Windows Setting +# windows setting + +win7配置 +只有win系统的电脑 嗯 要用win系统 就不能用Ubuntu了 怎么办 google search windows shell + +- [我的windows软件](https://www.zfanw.com/blog/windows-software-i-use.html) + +---------- + +## 1-iTerm2 或同级别强力 Shell 托管环境 ## + +- Babun +- ConEmu +- Tmux [官网](https://tmux.github.io/) [使用参考](http://foocoder.com/blog/zhong-duan-huan-jing-zhi-tmux.html/) + +---------- + + +刚开始想到的windows 下的Powershell + +- Youtube [Introduction to Windows PowerShell Part 1](https://www.youtube.com/watch?v=bEOq-S3veiA) +- [易學易用的 Windows PowerShell](https://www.microsoft.com/taiwan/technet/columns/profwin/28-monad.mspx) + +windows 的shell 不想用 去找替代 果然谷歌大法好 嗯 + +Get [Babun,一个开箱即用的 Windows Shell](http://blog.jamespan.me/2015/04/09/babun-the-shell/) +官网的下载速度比较慢 也不急 慢慢来 + +预测有许多坑 嗯 还需要填坑 + +- 0 [Babun官网](http://babun.github.io/) +- 1 [windows下搭建类linux环境](http://borghan.com/archives/windows-build-lunix-like-environment.html) + - 在修改中文乱码时 不知道如何进行指令操作了 unix不熟悉 返回default设置 + - 在修改的时候 一个根据提示在babun.bash中修改 + - 一个 直接 `vi .oh-my-zsh/custom/babun.zsh-theme` 进入vi 命令模式修改 +- 2 [配置](http://www.rxna.cn/post/wiki/babun-pei-zhi) +- 3 [Windows 的 SHELL 程序 Babun](http://my.oschina.net/blogshi/blog/268031) + +默认的shell 是 The zsh (with .oh-my-zsh) is the default babun’s shell. + +- bash shell /bin/zsh +- bash shell /bin/bash + + +带下载好 进行配置 + +### 总 ### + +- cd # cd /usr/spool/mail +- pwd : present working directory + +参考 [shell命令](http://www.lampweb.org/linux/2/2.html) + +- [整合ConEmu](https://www.52os.net/articles/windows-install-unix-like-command-tools.html) + + [下载ConEmu](https://github.com/Maximus5/ConEmu) + + 注意 需要将 `C:\CMD.babun\cygwin\bin\mintty.exe -t C:\CMD.babun\cygwin\etc\minttyrc` 修改 修改为自己babun所在的文件目录 + +> 在conEmu窗口右上角右键--settings--startup--tasks,点“+”号添加一个新task,task parameters留空,也按照babun官网介绍中配置图标等信息,在下面的commands中加入: +C:\CMD.babun\cygwin\bin\mintty.exe -t C:\CMD.babun\cygwin\etc\minttyrc + + + 意外 使用 babun 还是出现乱码 + +> conEmu 是window下的多标签命令行工具,可以方便的新建cmd、cmd admin、powershell、powershell admin多种命令行,设置很多,功能强大 + +---------- + +## Dash 或同类文档查询应用/服务/环境 ## + +Dash是OS X 系统下的 那么寻找替代 + +- [Velocity](http://velocity.silverlakesoftware.com/) + +---------- + +## 文本编辑器 ## + +- [Sublime Text 2](http://www.sublimetext.com/2) + +## 自动化 ## + +- [AutoHotkey](http://www.autohotkey.com/) + + +---------- + +## Babun ## + +Problem + +- 当我再次重启电脑 再次使用babun时 出现问题 zsh 2064 child_info_fork 嗯 google search got [this same problem](https://www.cygwin.com/ml/cygwin/2013-01/msg00020.html) + - 尝试reboot ok 没问题了 + + +---------- + +## VI ## + +- 指令模式 Esc +- 输入模式 a/A i/I o/O 6个键 任选一个 我选择i + + - [vi指令说明](http://www2.nsysu.edu.tw/csmlab/unix/vi_command.htm) +- :wq 保存 退出 +- :q 直接退出 +- :q 不保存退出 + +10/2/2015 From 70e3bdd20e720e58bffd629f52a625b2f060eaf9 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 15:34:07 +0800 Subject: [PATCH 009/432] readme mod --- 0MOOC/SubPy.md | 169 -------------------------------- 0MOOC/doublepush.md | 110 --------------------- 0MOOC/gitbook.md | 101 ------------------- 0MOOC/learngit.md | 229 -------------------------------------------- 0MOOC/win7.md | 105 -------------------- README.md | 7 +- 6 files changed, 5 insertions(+), 716 deletions(-) delete mode 100644 0MOOC/SubPy.md delete mode 100644 0MOOC/doublepush.md delete mode 100644 0MOOC/gitbook.md delete mode 100644 0MOOC/learngit.md delete mode 100644 0MOOC/win7.md diff --git a/0MOOC/SubPy.md b/0MOOC/SubPy.md deleted file mode 100644 index 252cedb62..000000000 --- a/0MOOC/SubPy.md +++ /dev/null @@ -1,169 +0,0 @@ -# ST2与Py环境配置 - -- Sublime Text 2 插件使用和Python环境设置 - -> [Sublime Text](http://www.sublimetext.com/)是一套跨平台的文本编辑器,支持基于Python的插件。Sublime Text 是专有软件,可通过包(Package)扩充本身的功能。大多数的包使用自由软件授权发布,并由社区建置维护。 [详见wiki](https://zh.wikipedia.org/wiki/Sublime_Text) - -嗯 就是超级好用的文本编辑器 为什么就来看看英文版的说服力吧: - -> Sublime Text is a sophisticated text editor for code, markup and prose. -You'll love the slick user interface, extraordinary features and amazing performance. - -系统:win7 -之前就捣腾过 Py2.7.8 安装就不再进行了 - -- ST2 基础设置 -- Package Control(插件管理 下载) -- ST2 中配置Python开发环境 -- 我的常用快捷键 - + `ctrl+shift+p` 去install package - + `ctrl+alt+a` 对齐代码 - + 本来 `ctrl + b` 可以进行编译 现在设置 `f5` 进行编译 - + `ctrl+shift+c` Stop 终止程序 - ----------- - -## 基础设置 ## - -- Sublime Text 2 进入 菜单 `Preferences -> Settings - User` -- 在编辑器窗口中编辑 进行我的相关配置 - - `"draw_white_space": "all", // 显示空白字符, 比如 空格 tab` - `"font_size": 13.0, // 字体大小` - `"scroll_past_end": true, // 当文件到末尾时还能继续滚动` - `"trim_automatic_white_space": false // 关闭自动删除每行前后空格` - ----------- - -## Package Control ## - -[Package Control](https://packagecontrol.io/installation#st2)用来管理 Sublime Text 2 插件的插件. 当然需要第一个安装 - -- 利用快捷键 ctrl+` or 点击菜单栏进入 - + `View > Show Console` -- 直接去官网Copy 代码 paste the appropriate Python code for your version of Sublime Text into the console. - - import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation') -- 重启生效 菜单下有 `Preferences -> Package Settings` 选项 -- 以上亦可以手动设置 [参考官网](https://packagecontrol.io/installation#Manual) - -### 使用Package control ### - -[官网Usage](https://packagecontrol.io/docs/usage) 提供了相关描述 - -> To open the palette, press ctrl+shift+p (Win, Linux) or cmd+shift+p (OS X). All Package Control commands begin with Package Control:, so start by typing Package. -> The command palette will now show a number of commands. Most users will be interested in the following: - -- windows下`ctrl+shift+p`快捷键进入Package Control 命令行 -- 安装插件 - + 输入`install package` - + 输入我想要装的插件 如 [Alignment](http://wbond.net/sublime_packages/alignment) 选择安装 - * Alignment 这个插件用于对齐代码赋值语句 例如 - - var name = "sublime" - var version = "2.0.1" - var title = "sublime text" - * 按快捷键 可在`Preferences -> Package Settings -> Alignment -> Key Bindings defult` 中查看 - * 嗯 设置完之后 **请 restart 再使用快捷键** 这里我死后被坑了 一直找不到原因 后来 restart 就 ok 了 请注意 若设置好快捷键请 restart 嗯 Alignment 效果如下 - - var name = "sublime" - var version = "2.0.1" - var title = "sublime text" - -以上参考 [Sublime Text 常用插件和设置](https://wido.me/sunteya/sublime-text-packages-and-settings/) - -### 教训 ### - -> - 嗯 Package 之后 直接去 官网进行查询相关插件 安装使用效率会比查别人高很多 吸取了教训 -> - 以后 多用官方文档 -> - 比如 我要search markdown [PC markdown](https://packagecontrol.io/search/markdown) 就有许多插件了 安装可以直接看源文档的 更快捷高效 - -- 安装[Markdown Preview](https://packagecontrol.io/packages/Markdown%20Preview) 使用 一目了然 - ----------- - -## 配置Python开发环境 ## - -- 也就是如何在Sublime text 2中运行Python code - + `Tools -> Build System -> (choose) Python` - + 打开 `.py` Python代码文件 - + `Ctrl + B` 运行 or 编译 -- 如遇到死循环或中途需要停止程序 该如何操作 - + `Ctrl + Break` or `Tools -> Cancel Build` - + 我也可以自己设置 stop 快捷键 - + 进入菜单栏 `Preferences -> Key Bindings - User` - + 将如下代码贴入 - - {"keys": ["ctrl+shift+c"], "command": "exec", "args": {"kill": true} } - + 以上 就可以用 `ctrl+shift+c` 来代替 `Ctrl + Break` 终止程序运行 - -参考 [stack overflow](http://stackoverflow.com/questions/8551735/how-do-i-run-python-code-from-sublime-text-2) - -### 问题 ### - -- 我写了一段代码 如下 - - name = raw_input('Enter your name: ') - print 'Are you really', name, '?' - print 'Are you really' + name + '?' -- `Ctrl + B` 编译 -- 显示 error - - name = raw_input('Enter your name: ') - EOFError: EOF when reading a line - -> 代码中如果使用了input等函数进行交互的时候,直接使用Ctrl+B进行编译时,运行信息栏内无法输入交互信息,程序会提示报错。 - -- 解决 安装插件 - + [SublimeREPL](https://github.com/wuub/SublimeREPL) run an interpreter inside ST2 用来编译(运行)我的py程序 在工具栏 `Tools -> SublimeREPL -> python -> RUN current file` - + **优化之快捷键设置** SublimeREPL安装之后没有快捷键 每次运行程序必须用鼠标去点工具栏 增添效率 就给 SublimeREPL 添加快捷键 `Preferences -> Key Bindings - User` - - {"keys":["f5"], - "caption": "SublimeREPL: Python - RUN current file", - "command": "run_existing_window_command", "args": - { - "id": "repl_python_run", - "file": "config/Python/Main.sublime-menu" - } - } -> - 注意 在添加快捷键的时候 因为我之前添加过一次快捷键 所以 再次添加时 需要在上一个快捷键代码行的最后加上一个 comma 而且要是 英文的comma 否则会出错 系统也会提示 -> - 查看 SublimeREPL [所有Python方法的名称及id](https://github.com/wuub/SublimeREPL/blob/master/config/Python/Default.sublime-commands) 进行快捷键设置 我这里只设置了 `SublimeREPL: Python - RUN current file` 命令 - -- 果效 - - `f5`键 可以快速进行调试和交互的程序了 - - 例如 `f5`键 运行起初的 `raw_input` 那段代码 可以进行交互 如图所示 -![REPL](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/0-REPL.JPG) - ----------- - -### 其他插件 ### - -- [SublimeCodeIntel](https://github.com/SublimeCodeIntel/SublimeCodeIntel) -> SublimeCodeIntel 可以支持代码的自动补全以及成员/方法提示等功能,安装此插件后,Sublime Text 2就有点IDE的感觉了。 - -- [SublimeLinter](https://github.com/SublimeLinter/SublimeLinter-for-ST2) -> SublimeLinter 是用来在写代码时做代码检查的,可以检查Python代码是否符合[PEP8](https://www.python.org/dev/peps/pep-0008/)的要求。 - -这两个可能太高级 嗯 入门阶段 暂时先不用这两个 虽然也装了 - -参考 [基于Sublime Text搭建Python IDE](http://loosky.net/2967.html) - ----------- - -## 总 ## - -当完成以上配置 并记录好后 才发现 大妈的模板是 - -- 现象 -- 问题 -- 分析 -- 方案 -- 执行 - -嗯 我看看自己的过程 总是没有大的框架在那 然后 走到随性而走 不好 得补这个缺 - ----------- - -## 进展 - -- 10/8/2015 雷雨创建 \ No newline at end of file diff --git a/0MOOC/doublepush.md b/0MOOC/doublepush.md deleted file mode 100644 index 93a2ebe2d..000000000 --- a/0MOOC/doublepush.md +++ /dev/null @@ -1,110 +0,0 @@ -# 双推 - -## 背景 ## - -在完成第一周任务的时候 每天code之后 push到github 与 gitbook中 都要使用: - - $ git push hub master - $ git push book master - -来实现[双推](https://jeremiahzhang.gitbooks.io/pybeginner/content/toolssupport/gitbook.html) 有嫌麻烦 但是一直没去改变 程序员是需要精简的 - -触动 @小赖同学 在Issue中 发表 双推的代码 - -嗯是该动起来 不能再每日都如上面上面一样的双推了 - -## 方案 - -根据 @小赖同学 提供的[stackoverflow问答](http://stackoverflow.com/questions/849308/pull-push-from-multiple-remote-locations) 去解决 - -1.使用: - - git remote set-url origin --push --add - git remote set-url origin --push --add - -2.修改 本地目录(local repo)中的.git/config - -## 执行 - -1.从.git/config获得自己github与gitbook的远程库`ssh`或`http` url (每个github 远程库都有自己的url 每一本gitbook书籍也一样)因为之前已经设置了两个 remote : hub (代表github中的remote repo)与 book (代表gitbook书籍 remote repo) - - [remote "hub"] - url = git@github.com:JeremiahZhang/pybeginner.git - [remote "book"] - url = https://https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git - -**注**apitoken在gitbook[用户设置](https://www.gitbook.com/@jeremiahzhang/settings) - -2.根据`git remote set-url origin --push --add ` 添加 remote 设置 添加 gitbook remote repo `http` url to [hub]中(gitbook的`ssh`我没有尝试 因为之前实现[双推](https://jeremiahzhang.gitbooks.io/pybeginner/content/toolssupport/gitbook.html)的时候没有用) - - git remote set-url remote_name --push --add jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git - -**注** remote_name 必须是我现有的 remote (此处我选择自己的remote为 `hub` )可以在.git/config查看 也可以直接在git bash 中运行 git remote查看 - -添加之后 .git/config 中出现: - - [remote "hub"] - url = git@github.com:JeremiahZhang/pybeginner.git - fetch = +refs/heads/*:refs/remotes/hub/* - pushurl = https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git - -新增了 - - pushurl = https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git - -3.以防万一 直接在hub中添加自己原先的ssh - - git remote set-url remote_name --push --add git@github.com:JeremiahZhang/pybeginner.git - -同样.git/config的变化可查看: - - [remote "hub"] - url = git@github.com:JeremiahZhang/pybeginner.git - fetch = +refs/heads/*:refs/remotes/hub/* - pushurl = jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git - pushurl = git@github.com:JeremiahZhang/pybeginner.git - -4.修改.git/config的 alias 【alias就是git 命令的 昵称或绰号】 - - [alias] - co = checkout - ci = commit -m - st = status - br = branch - pu = push hub master - pl = pull - ad = add --a - hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short - type = cat-file -t - dump = cat-file -p - rf = reflog -5.修改本地文件内容 `git ad` `git ci`后 `git pu` 就实现双推 立即化简了上面 需要两次 `git push` 了 - -## 修改 ## - -考虑到 hub 已经是一个 remote 名字 就修改 添加一个新的 remote origin - -1-直接在.git/config中添加如下代码: - - [remote "origin"] - pushurl = https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git - pushurl = git@github.com:JeremiahZhang/pybeginner.git - -2-[alias]中 修改push的绰号 - - pu = push hub master - -3-测试 git pu 成功 - -## 反思 ## - -- DRP记住 不要重复我自己 所以当发现重复复杂的行为的时候 立即思考 搜索没有有精简的办法 -- 其实一切以上只要修改.git/config文件中代码就行了 不过还是进行命令行的可操行和拓展性更强 就像之前群里说的160推 -- 看看接下来能不能实现160推 。。。推 拓展 big picture - -10/19/2015 9:51:59 PM 添加 - - - - - diff --git a/0MOOC/gitbook.md b/0MOOC/gitbook.md deleted file mode 100644 index 8be4cd27e..000000000 --- a/0MOOC/gitbook.md +++ /dev/null @@ -1,101 +0,0 @@ -# Gitbook - -*增补 - -是什么 - -> GitBook是一个基于 [Node.js](https://nodejs.org/en/) 的命令行工具,可使用 Github/Git 和 [Markdown](http://baike.baidu.com/view/2311114.htm) 来制作精美的电子书,GitBook 并非关于 Git 的教程。 - -为什么 - -- 制作教程 教会半年前的自己 教是最好的学 -- 获得反馈 -- 可输出多种格式文件PDF epub mobi - - -## 现象 - -- gitbook 升级后, 关联 github 有问题 - -## 分析 - -- gitbook 服务升级, github 的 hook 没有对应升级 -- 虽然增加了 [webhook](https://help.gitbook.com/github/index.html#webhooks) 但是还是出现 github与gitbook不同步现象 即 push to github 而 gitbook 没有对应改变 或者 改变较慢(当然自己自己目前发现 我的add webhook过程见 [webhook setup](https://jeremiahzhang.gitbooks.io/gitbookguide/content/build/webhookssetup.html)) 只能用double push **增补** - + push to github - + push to gitbook - -## 问题 - -- 多个仓库的自动化同步,官方不支持了. - -## 方案 - -~ 作为不折腾会死星人,当然有姿势解决所有问题... - -### 双推 double push *增补 - -所谓双推 就是将本地working directory(or我称其为Local Repo)的内容 即push到 Github 仓库 又推送到 Gitbook - -#### 实现 #### - -一推 github - -- 我在Github Fork(相当于复制为我所用)[学员模板仓库](https://github.com/OpenMindClub/OMOOC.py) 我要基于该模板仓库建立自己学习开智编程课的教程 并改名为pybeginner 该远程库ssh为 `git@github.com:JeremiahZhang/pybeginner.git` -- 在我的电脑端本体建立文件目录(文件夹) 比如我建立的是名为pybeginner的文件夹(我称其为Local Repo 本地仓库) - + `git init` 初始化 以便与远程Repo连接 - + `git remote add hub git@github.com:JeremiahZhang/pybeginner.git` 此处我将Local Repo与Github Repo远程仓库建立连接 这里hub是我定义Github repo的名字 而ssh值我add的是代表**Github上的pybeginner仓库** - + `git branch --track hub master` - + `git pull hub master` 以上将我的 github repo pybeginner拉回(传送 如星际迷航中的瞬间传送)本地local repo - + `git merge hub` [合并分支](https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6) - + `git br -d hub` 删除分支 hub - + 以后我只要在local repo编辑内容 再push 到github 就OK了 - + 如 `git add README.md` 修改了README.md文件 通过 git add 添加到[staging area](https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80#%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%89%E7%A7%8D%E7%8A%B6%E6%80%81) - + `git commit -m "modified README.md"` 提交到[git repository](https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80#%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%89%E7%A7%8D%E7%8A%B6%E6%80%81) - + `git push -u hub master` 推到github - -> 已经推到了Github这是一推 下面需要另一推才能形成二推 - -二推 gitbook - -- Gitbook网页建立我的书籍 [Python Beginner Guide For Leiyu](https://www.gitbook.com/book/jeremiahzhang/pybeginner/details) 并找到 该书的 Git url 在书籍主页右下角 Setup 中 比如本书的git url为`https://git.gitbook.com/jeremiahzhang/pybeginner.git` -- $`git remote add book https://username:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git` 建立Local repo与gitbook repo的连接 其中username为gitbook的名称 apitoken是每个Gitbook账户特有的 可以在Account setting中找到 book为对应gitbook repo名字 可以自己命名的 -- `git push -u book master` 将Local repo 推送到 gitbook - -以上就是 双推 double push - -## Disqus 评论 *增补 - -> gitbook 还支持许多插件,用户可以从 [NPM](https://www.npmjs.com/) 上搜索 gitbook 的插件,[gitbook 文档](https://github.com/GitbookIO/plugin) 推荐插件的命名方式为: -> -- gitbook-plugin-X: 插件 -- gitbook-theme-X: 主题 -> -所以,可以通过以上两种方式来搜索 gitbook 的插件或者主题 - -作为一个非常流行的为网站集成评论系统的工具,Gitbook可以集成Disqus 便于和读者进行交流 好形成反馈 - -- 1 首先注册Disqus 参考[配置 Disqus](https://openmindclub.gitbooks.io/omooc-py/content/support/Disqus_Setup.html) -- 2 install disqus plugin - - `$ npm install gitbook-plugin-disqus -g` -- 3 增加book.json文件 代码如下 - - { - "plugins": ["disqus"], - "pluginsConfig": { - "disqus": { - "shortName": "XXXXXXX" - } - } - } -- 效果 - - 在每一个页面都出现一下Disqus评论窗口 - -![disqus01](https://raw.githubusercontent.com/JeremiahZhang/gitbookguide/master/_images/disqus-01.JPG) - -详细可参考我的 [折腾GitbookGuide](https://www.gitbook.com/book/jeremiahzhang/gitbookguide/details) - -## 进展 - -- 150317 大妈创建 -- 151007 雷雨增补 \ No newline at end of file diff --git a/0MOOC/learngit.md b/0MOOC/learngit.md deleted file mode 100644 index 6d384ac23..000000000 --- a/0MOOC/learngit.md +++ /dev/null @@ -1,229 +0,0 @@ -# Learn Git # - -- 1-version control -- 2-历史版本 - - 版本回退 -- 3-设置版本标签 -- 4-小技巧:设置alias -- 5-撤销本地修改(before staging) -- 6-撤销已添加到缓存区的修改(before commit) -- 7-撤销commit到远程库(git revert) -- 8-git pull将远程库拉到本地 -- 9-删除远程库 git remote rm -- 10-git clone < git url > 思想clone之意 就已明了 - -## 1-Push a new local repo to Github ## - -已经有一个origin repo了,现在新建一个新的local repo(用以记录机器学习的学习历程),然后推送到github上: - -- 创建版本库 - - 在自己的电脑文件夹中新建了my machine learning journey的文件夹 - - 然后直接git init here - - git init - - 添加readme文件和机器学习的文件夹 -- 远程仓库设置 - - creat a new repo - - copy the SSH of the new repo - - git add --a - - git commit -m "add new repo" - - git remote add learnml <-my SSH clone URL add-> - - git push -u learnml master - ----------- - -## 2-git 基础 ## - -- working directory:工作区,本地目录,你可以对里面的文件进行操作 -- staging area -- .git directory(Repository) - -we need to know that: - -- changes, not files - - **Git works with changes, not files**. so when I modify the file in the working directory and git add this file,this modifier will be add to the staging area. After that I use the "git commit" to commit this change to repository. - - SO use "git add" to track the changes, and then git commit to repo. -- **History** 历史 - - git log - - git log --pretty=oneline: 用一行来显示git 快照下来的commit历史或版本历史 - - git reflog - - git log --pretty=oneline --max-count=2 : 显示最开始的两个 - - git log --pretty=oneline --since='5 minutes ago' - - git log --pretty=oneline --until='5 minutes ago' - - git log --pretty=oneline --author= - - git log --pretty=oneline --all - - git log --all --pretty=format:'%h %cd %s (%an)' --since='7 days ago':查看最近一周的修改变化。” - - git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short:以另一种显示方式来呈现 -- **版本回退** - - git log or git reflog - - git reset --hard <使用git log or git reflog中的hash值 前7位就可以了> - - cat :来显示文件内容 - -> note 在unix 和mac os中版本回退的命令与window的是同的 - ----------- - -## 3-Tagging Version ## - -- 给commit的版本贴个标签tag:**git tag v1** -- 使用tag name来check out 回退:**git checkout v1^** -- 查看使用的标签 **git tag** -- 查看标签列表 **git hist master --all** - -> Learn how to tag commits with names for future reference - -### 实践 ### - -- 我新建了一个hello.md文件,并添加内容为【# Hello world】 -- **git add** 之后 -- **git commit** 之后 -- **git tag v1** -- **git checkout v1^** -- **cat hello.md** 之后显示 - - cat:hello.md: No such file or directory - -> - 也就是说 git tag v1 是将commit的快照下的那个版本打上标签v1,便于以后回退 -> - 那么 v1^ (或v1~1)是表示的是 v1上一个版本或上一代 - -- **git checkout v1** 之后 -- **cat hello.md** 之后 我的文件又回来了,真的太棒了 - - # Hello world - -- git tag 查看所使用的 tag -- git hist master --all - -> So cool, I can see the tag. - ----------- - - -## 4-小技巧 ## - -- alias:修改git普通命令,使用别名在.gitconfig中修改如,使用起来更方便 - - co = checkout - - ci = commit - - st = status - - br = branch - - hist = log --pretty=oneline - - type = cat-file -t - - dump = cat-file -p - - rf = reflog - ----------- - -## 5-撤销本地修改undoing local changes(before staging) ## - -> - Learn how to revert changes in the working directory. -> - 若我本地工作目录中修改了文件hello.md, 但是我并没有提交add 到缓存区中,更没有commit到远程库中,那么我该如何回退或撤销? -> - git checkout - -- 我在hello.md文件中添加了 - - I want to learn how to revert changes in the working directory. - - # Hello world - - - I want to learn how to revert changes in the working directory. - -- 确定上一次的提交是在master上 - - git checkout master - - 这个使用使得我之前commit的撤回了,回退到我上上会的版本处 - - 比如最近的版本是 v1 - - 使用上面的命令后,回到了上上个版本v1^处 -- git status - - 提示我修改了hello.md文件,但是没有add 和commit -- git checkout hello.md -- git status -- cat hello.md 之后就只剩下了如下内容,说明我撤销了最近一次的本地修改 - - # Hello world - - -> It is so cool. I love Git. - ----------- - -## 6-撤销已添加到缓存区的修改 ## - -> Learn how to revert changes that have been staged. - -- **git reset HEAD ** -- git checkout 用来撤销工作区文件修改 - -修改的文件,已经git add 添加到缓存区,但是没有commit到远程库repo,如何撤销本次的添加到缓存区呢? - -- 简单修改文件hello.md,内容如下 - - # Hello world - - I want to learn how to revert changes in the working directory. Got it. - - Undoing staged changes(before committing) -- git add hello.md - - 将文件添加到了缓存区 - - 但是没有 commit -- cat hello.md - - 查看文件内容 -- git status - - 可以发现提示 **modified hello.md 一行** 是蓝色的,说明已经将文件添加到缓存区 -- git reset HEAD hello.md - - 撤销本次add添加到缓存区 - - 【note】:reset命令不会修改工作目录中的文件内容 -- git status - - 发现此时 **modified hello.md 一行** 是红色的,说明已经撤销了git add(上传到缓存区) -- cat hello.md - - 文件内容没有改变 -- git checkout hello.md - - 此时就撤销了在工作目录中hello.md内容的修改 -- cat hello.md - - # Hello world - - I want to learn how to revert changes in the working directory. Got it. - -回到了修改前状态。 - -> It is so cool. I love Git. - -### 问题来了 ### - -- 那么我该如何再回到我修改后的状态呢? - - 因为本次我没有commit - - 不可使用版本回退 - - git log 后没有hash值所以不可使用 git reset --hard <前7位hash值,但不包括挂号> - ----------- - -## 7-Undoing commit changes ## - -- git add -- git commit -m "..." -- git revert HEAD - -> 学习在commit之后,撤销此次的commit。 -> but 在window中出现vim底层界面。 - -## 8-git pull ## - -- 问题:我在远程库repo中进行了文件的修改,与我本地目录中的文件出现了不同 -- git push 提示不成功,需要git pull -- then 操作 - - git remote add learnml ../...git 【这个之前设置过了就不用再设置了】 - - git branch --track learnml master - - git pull learnml master - -> 这个流程过程和git push 正好可逆。 -> - git push 之前先要 add 与commit -> - git pull 之前,先要将分支track一下 - -## 9-git remote rm * ## - -远程库重名了 或需要删除 用此命令 -注意 git branch -d 是删除branch分支的 -不要混淆 - -10/8/2015 - ----------- - -## 进展 ## - -- 1-8 与开课前就已经学习 并创建 -- 带`*`的是增补 10/8/2015 雷雨增补 \ No newline at end of file diff --git a/0MOOC/win7.md b/0MOOC/win7.md deleted file mode 100644 index 99d0a840a..000000000 --- a/0MOOC/win7.md +++ /dev/null @@ -1,105 +0,0 @@ -# windows setting - -win7配置 -只有win系统的电脑 嗯 要用win系统 就不能用Ubuntu了 怎么办 google search windows shell - -- [我的windows软件](https://www.zfanw.com/blog/windows-software-i-use.html) - ----------- - -## 1-iTerm2 或同级别强力 Shell 托管环境 ## - -- Babun -- ConEmu -- Tmux [官网](https://tmux.github.io/) [使用参考](http://foocoder.com/blog/zhong-duan-huan-jing-zhi-tmux.html/) - ----------- - - -刚开始想到的windows 下的Powershell - -- Youtube [Introduction to Windows PowerShell Part 1](https://www.youtube.com/watch?v=bEOq-S3veiA) -- [易學易用的 Windows PowerShell](https://www.microsoft.com/taiwan/technet/columns/profwin/28-monad.mspx) - -windows 的shell 不想用 去找替代 果然谷歌大法好 嗯 - -Get [Babun,一个开箱即用的 Windows Shell](http://blog.jamespan.me/2015/04/09/babun-the-shell/) -官网的下载速度比较慢 也不急 慢慢来 - -预测有许多坑 嗯 还需要填坑 - -- 0 [Babun官网](http://babun.github.io/) -- 1 [windows下搭建类linux环境](http://borghan.com/archives/windows-build-lunix-like-environment.html) - - 在修改中文乱码时 不知道如何进行指令操作了 unix不熟悉 返回default设置 - - 在修改的时候 一个根据提示在babun.bash中修改 - - 一个 直接 `vi .oh-my-zsh/custom/babun.zsh-theme` 进入vi 命令模式修改 -- 2 [配置](http://www.rxna.cn/post/wiki/babun-pei-zhi) -- 3 [Windows 的 SHELL 程序 Babun](http://my.oschina.net/blogshi/blog/268031) - -默认的shell 是 The zsh (with .oh-my-zsh) is the default babun’s shell. - -- bash shell /bin/zsh -- bash shell /bin/bash - - -带下载好 进行配置 - -### 总 ### - -- cd # cd /usr/spool/mail -- pwd : present working directory - -参考 [shell命令](http://www.lampweb.org/linux/2/2.html) - -- [整合ConEmu](https://www.52os.net/articles/windows-install-unix-like-command-tools.html) - + [下载ConEmu](https://github.com/Maximus5/ConEmu) - + 注意 需要将 `C:\CMD.babun\cygwin\bin\mintty.exe -t C:\CMD.babun\cygwin\etc\minttyrc` 修改 修改为自己babun所在的文件目录 - -> 在conEmu窗口右上角右键--settings--startup--tasks,点“+”号添加一个新task,task parameters留空,也按照babun官网介绍中配置图标等信息,在下面的commands中加入: -C:\CMD.babun\cygwin\bin\mintty.exe -t C:\CMD.babun\cygwin\etc\minttyrc - - + 意外 使用 babun 还是出现乱码 - -> conEmu 是window下的多标签命令行工具,可以方便的新建cmd、cmd admin、powershell、powershell admin多种命令行,设置很多,功能强大 - ----------- - -## Dash 或同类文档查询应用/服务/环境 ## - -Dash是OS X 系统下的 那么寻找替代 - -- [Velocity](http://velocity.silverlakesoftware.com/) - ----------- - -## 文本编辑器 ## - -- [Sublime Text 2](http://www.sublimetext.com/2) - -## 自动化 ## - -- [AutoHotkey](http://www.autohotkey.com/) - - ----------- - -## Babun ## - -Problem - -- 当我再次重启电脑 再次使用babun时 出现问题 zsh 2064 child_info_fork 嗯 google search got [this same problem](https://www.cygwin.com/ml/cygwin/2013-01/msg00020.html) - - 尝试reboot ok 没问题了 - - ----------- - -## VI ## - -- 指令模式 Esc -- 输入模式 a/A i/I o/O 6个键 任选一个 我选择i - + - [vi指令说明](http://www2.nsysu.edu.tw/csmlab/unix/vi_command.htm) -- :wq 保存 退出 -- :q 直接退出 -- :q 不保存退出 - -10/2/2015 diff --git a/README.md b/README.md index 1445e1b58..a8eb60110 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ## 作者 - [入学三问](https://github.com/JeremiahZhang/gopython/blob/master/PY-StarTrek-Prepare/2015-9-10-T2-%E5%85%A5%E5%AD%A6%E4%B8%89%E9%97%AE.md) -- Leiyu ([雷雨Jeremiah](http://weibo.com/1784386944/profile?topnav=1&wvr=6)) +- [雷雨Jeremiah](http://weibo.com/1784386944/profile?topnav=1&wvr=6)) - 个人成长博客 [Renew Mind](http://jeremiahzhang.github.io/) @@ -20,8 +20,11 @@ ## ( ̄▽ ̄) +Transferd From [Python Beginner Guide For Leiyu](https://jeremiahzhang.gitbooks.io/pybeginner/content/) + +10/20/2015 Transfered -10/9/2015 `*`增补 ======= My Awesome Book ======= + From dcc72af6d35a23903ae839d3bb6da83ee5b152f2 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 15:35:17 +0800 Subject: [PATCH 010/432] add --- 0MOOC/SubPy.md | 169 ++++++++++++++++++++++++++++++++ 0MOOC/doublepush.md | 110 +++++++++++++++++++++ 0MOOC/gitbook.md | 101 +++++++++++++++++++ 0MOOC/learngit.md | 229 ++++++++++++++++++++++++++++++++++++++++++++ 0MOOC/win7.md | 105 ++++++++++++++++++++ 5 files changed, 714 insertions(+) create mode 100644 0MOOC/SubPy.md create mode 100644 0MOOC/doublepush.md create mode 100644 0MOOC/gitbook.md create mode 100644 0MOOC/learngit.md create mode 100644 0MOOC/win7.md diff --git a/0MOOC/SubPy.md b/0MOOC/SubPy.md new file mode 100644 index 000000000..252cedb62 --- /dev/null +++ b/0MOOC/SubPy.md @@ -0,0 +1,169 @@ +# ST2与Py环境配置 + +- Sublime Text 2 插件使用和Python环境设置 + +> [Sublime Text](http://www.sublimetext.com/)是一套跨平台的文本编辑器,支持基于Python的插件。Sublime Text 是专有软件,可通过包(Package)扩充本身的功能。大多数的包使用自由软件授权发布,并由社区建置维护。 [详见wiki](https://zh.wikipedia.org/wiki/Sublime_Text) + +嗯 就是超级好用的文本编辑器 为什么就来看看英文版的说服力吧: + +> Sublime Text is a sophisticated text editor for code, markup and prose. +You'll love the slick user interface, extraordinary features and amazing performance. + +系统:win7 +之前就捣腾过 Py2.7.8 安装就不再进行了 + +- ST2 基础设置 +- Package Control(插件管理 下载) +- ST2 中配置Python开发环境 +- 我的常用快捷键 + + `ctrl+shift+p` 去install package + + `ctrl+alt+a` 对齐代码 + + 本来 `ctrl + b` 可以进行编译 现在设置 `f5` 进行编译 + + `ctrl+shift+c` Stop 终止程序 + +---------- + +## 基础设置 ## + +- Sublime Text 2 进入 菜单 `Preferences -> Settings - User` +- 在编辑器窗口中编辑 进行我的相关配置 + + `"draw_white_space": "all", // 显示空白字符, 比如 空格 tab` + `"font_size": 13.0, // 字体大小` + `"scroll_past_end": true, // 当文件到末尾时还能继续滚动` + `"trim_automatic_white_space": false // 关闭自动删除每行前后空格` + +---------- + +## Package Control ## + +[Package Control](https://packagecontrol.io/installation#st2)用来管理 Sublime Text 2 插件的插件. 当然需要第一个安装 + +- 利用快捷键 ctrl+` or 点击菜单栏进入 + + `View > Show Console` +- 直接去官网Copy 代码 paste the appropriate Python code for your version of Sublime Text into the console. + + import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation') +- 重启生效 菜单下有 `Preferences -> Package Settings` 选项 +- 以上亦可以手动设置 [参考官网](https://packagecontrol.io/installation#Manual) + +### 使用Package control ### + +[官网Usage](https://packagecontrol.io/docs/usage) 提供了相关描述 + +> To open the palette, press ctrl+shift+p (Win, Linux) or cmd+shift+p (OS X). All Package Control commands begin with Package Control:, so start by typing Package. +> The command palette will now show a number of commands. Most users will be interested in the following: + +- windows下`ctrl+shift+p`快捷键进入Package Control 命令行 +- 安装插件 + + 输入`install package` + + 输入我想要装的插件 如 [Alignment](http://wbond.net/sublime_packages/alignment) 选择安装 + * Alignment 这个插件用于对齐代码赋值语句 例如 + + var name = "sublime" + var version = "2.0.1" + var title = "sublime text" + * 按快捷键 可在`Preferences -> Package Settings -> Alignment -> Key Bindings defult` 中查看 + * 嗯 设置完之后 **请 restart 再使用快捷键** 这里我死后被坑了 一直找不到原因 后来 restart 就 ok 了 请注意 若设置好快捷键请 restart 嗯 Alignment 效果如下 + + var name = "sublime" + var version = "2.0.1" + var title = "sublime text" + +以上参考 [Sublime Text 常用插件和设置](https://wido.me/sunteya/sublime-text-packages-and-settings/) + +### 教训 ### + +> - 嗯 Package 之后 直接去 官网进行查询相关插件 安装使用效率会比查别人高很多 吸取了教训 +> - 以后 多用官方文档 +> - 比如 我要search markdown [PC markdown](https://packagecontrol.io/search/markdown) 就有许多插件了 安装可以直接看源文档的 更快捷高效 + +- 安装[Markdown Preview](https://packagecontrol.io/packages/Markdown%20Preview) 使用 一目了然 + +---------- + +## 配置Python开发环境 ## + +- 也就是如何在Sublime text 2中运行Python code + + `Tools -> Build System -> (choose) Python` + + 打开 `.py` Python代码文件 + + `Ctrl + B` 运行 or 编译 +- 如遇到死循环或中途需要停止程序 该如何操作 + + `Ctrl + Break` or `Tools -> Cancel Build` + + 我也可以自己设置 stop 快捷键 + + 进入菜单栏 `Preferences -> Key Bindings - User` + + 将如下代码贴入 + + {"keys": ["ctrl+shift+c"], "command": "exec", "args": {"kill": true} } + + 以上 就可以用 `ctrl+shift+c` 来代替 `Ctrl + Break` 终止程序运行 + +参考 [stack overflow](http://stackoverflow.com/questions/8551735/how-do-i-run-python-code-from-sublime-text-2) + +### 问题 ### + +- 我写了一段代码 如下 + + name = raw_input('Enter your name: ') + print 'Are you really', name, '?' + print 'Are you really' + name + '?' +- `Ctrl + B` 编译 +- 显示 error + + name = raw_input('Enter your name: ') + EOFError: EOF when reading a line + +> 代码中如果使用了input等函数进行交互的时候,直接使用Ctrl+B进行编译时,运行信息栏内无法输入交互信息,程序会提示报错。 + +- 解决 安装插件 + + [SublimeREPL](https://github.com/wuub/SublimeREPL) run an interpreter inside ST2 用来编译(运行)我的py程序 在工具栏 `Tools -> SublimeREPL -> python -> RUN current file` + + **优化之快捷键设置** SublimeREPL安装之后没有快捷键 每次运行程序必须用鼠标去点工具栏 增添效率 就给 SublimeREPL 添加快捷键 `Preferences -> Key Bindings - User` + + {"keys":["f5"], + "caption": "SublimeREPL: Python - RUN current file", + "command": "run_existing_window_command", "args": + { + "id": "repl_python_run", + "file": "config/Python/Main.sublime-menu" + } + } +> - 注意 在添加快捷键的时候 因为我之前添加过一次快捷键 所以 再次添加时 需要在上一个快捷键代码行的最后加上一个 comma 而且要是 英文的comma 否则会出错 系统也会提示 +> - 查看 SublimeREPL [所有Python方法的名称及id](https://github.com/wuub/SublimeREPL/blob/master/config/Python/Default.sublime-commands) 进行快捷键设置 我这里只设置了 `SublimeREPL: Python - RUN current file` 命令 + +- 果效 + - `f5`键 可以快速进行调试和交互的程序了 + - 例如 `f5`键 运行起初的 `raw_input` 那段代码 可以进行交互 如图所示 +![REPL](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/0-REPL.JPG) + +---------- + +### 其他插件 ### + +- [SublimeCodeIntel](https://github.com/SublimeCodeIntel/SublimeCodeIntel) +> SublimeCodeIntel 可以支持代码的自动补全以及成员/方法提示等功能,安装此插件后,Sublime Text 2就有点IDE的感觉了。 + +- [SublimeLinter](https://github.com/SublimeLinter/SublimeLinter-for-ST2) +> SublimeLinter 是用来在写代码时做代码检查的,可以检查Python代码是否符合[PEP8](https://www.python.org/dev/peps/pep-0008/)的要求。 + +这两个可能太高级 嗯 入门阶段 暂时先不用这两个 虽然也装了 + +参考 [基于Sublime Text搭建Python IDE](http://loosky.net/2967.html) + +---------- + +## 总 ## + +当完成以上配置 并记录好后 才发现 大妈的模板是 + +- 现象 +- 问题 +- 分析 +- 方案 +- 执行 + +嗯 我看看自己的过程 总是没有大的框架在那 然后 走到随性而走 不好 得补这个缺 + +---------- + +## 进展 + +- 10/8/2015 雷雨创建 \ No newline at end of file diff --git a/0MOOC/doublepush.md b/0MOOC/doublepush.md new file mode 100644 index 000000000..93a2ebe2d --- /dev/null +++ b/0MOOC/doublepush.md @@ -0,0 +1,110 @@ +# 双推 + +## 背景 ## + +在完成第一周任务的时候 每天code之后 push到github 与 gitbook中 都要使用: + + $ git push hub master + $ git push book master + +来实现[双推](https://jeremiahzhang.gitbooks.io/pybeginner/content/toolssupport/gitbook.html) 有嫌麻烦 但是一直没去改变 程序员是需要精简的 + +触动 @小赖同学 在Issue中 发表 双推的代码 + +嗯是该动起来 不能再每日都如上面上面一样的双推了 + +## 方案 + +根据 @小赖同学 提供的[stackoverflow问答](http://stackoverflow.com/questions/849308/pull-push-from-multiple-remote-locations) 去解决 + +1.使用: + + git remote set-url origin --push --add + git remote set-url origin --push --add + +2.修改 本地目录(local repo)中的.git/config + +## 执行 + +1.从.git/config获得自己github与gitbook的远程库`ssh`或`http` url (每个github 远程库都有自己的url 每一本gitbook书籍也一样)因为之前已经设置了两个 remote : hub (代表github中的remote repo)与 book (代表gitbook书籍 remote repo) + + [remote "hub"] + url = git@github.com:JeremiahZhang/pybeginner.git + [remote "book"] + url = https://https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + +**注**apitoken在gitbook[用户设置](https://www.gitbook.com/@jeremiahzhang/settings) + +2.根据`git remote set-url origin --push --add ` 添加 remote 设置 添加 gitbook remote repo `http` url to [hub]中(gitbook的`ssh`我没有尝试 因为之前实现[双推](https://jeremiahzhang.gitbooks.io/pybeginner/content/toolssupport/gitbook.html)的时候没有用) + + git remote set-url remote_name --push --add jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + +**注** remote_name 必须是我现有的 remote (此处我选择自己的remote为 `hub` )可以在.git/config查看 也可以直接在git bash 中运行 git remote查看 + +添加之后 .git/config 中出现: + + [remote "hub"] + url = git@github.com:JeremiahZhang/pybeginner.git + fetch = +refs/heads/*:refs/remotes/hub/* + pushurl = https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + +新增了 + + pushurl = https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + +3.以防万一 直接在hub中添加自己原先的ssh + + git remote set-url remote_name --push --add git@github.com:JeremiahZhang/pybeginner.git + +同样.git/config的变化可查看: + + [remote "hub"] + url = git@github.com:JeremiahZhang/pybeginner.git + fetch = +refs/heads/*:refs/remotes/hub/* + pushurl = jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + pushurl = git@github.com:JeremiahZhang/pybeginner.git + +4.修改.git/config的 alias 【alias就是git 命令的 昵称或绰号】 + + [alias] + co = checkout + ci = commit -m + st = status + br = branch + pu = push hub master + pl = pull + ad = add --a + hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short + type = cat-file -t + dump = cat-file -p + rf = reflog +5.修改本地文件内容 `git ad` `git ci`后 `git pu` 就实现双推 立即化简了上面 需要两次 `git push` 了 + +## 修改 ## + +考虑到 hub 已经是一个 remote 名字 就修改 添加一个新的 remote origin + +1-直接在.git/config中添加如下代码: + + [remote "origin"] + pushurl = https://jeremiahzhang:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git + pushurl = git@github.com:JeremiahZhang/pybeginner.git + +2-[alias]中 修改push的绰号 + + pu = push hub master + +3-测试 git pu 成功 + +## 反思 ## + +- DRP记住 不要重复我自己 所以当发现重复复杂的行为的时候 立即思考 搜索没有有精简的办法 +- 其实一切以上只要修改.git/config文件中代码就行了 不过还是进行命令行的可操行和拓展性更强 就像之前群里说的160推 +- 看看接下来能不能实现160推 。。。推 拓展 big picture + +10/19/2015 9:51:59 PM 添加 + + + + + diff --git a/0MOOC/gitbook.md b/0MOOC/gitbook.md new file mode 100644 index 000000000..8be4cd27e --- /dev/null +++ b/0MOOC/gitbook.md @@ -0,0 +1,101 @@ +# Gitbook + +*增补 + +是什么 + +> GitBook是一个基于 [Node.js](https://nodejs.org/en/) 的命令行工具,可使用 Github/Git 和 [Markdown](http://baike.baidu.com/view/2311114.htm) 来制作精美的电子书,GitBook 并非关于 Git 的教程。 + +为什么 + +- 制作教程 教会半年前的自己 教是最好的学 +- 获得反馈 +- 可输出多种格式文件PDF epub mobi + + +## 现象 + +- gitbook 升级后, 关联 github 有问题 + +## 分析 + +- gitbook 服务升级, github 的 hook 没有对应升级 +- 虽然增加了 [webhook](https://help.gitbook.com/github/index.html#webhooks) 但是还是出现 github与gitbook不同步现象 即 push to github 而 gitbook 没有对应改变 或者 改变较慢(当然自己自己目前发现 我的add webhook过程见 [webhook setup](https://jeremiahzhang.gitbooks.io/gitbookguide/content/build/webhookssetup.html)) 只能用double push **增补** + + push to github + + push to gitbook + +## 问题 + +- 多个仓库的自动化同步,官方不支持了. + +## 方案 + +~ 作为不折腾会死星人,当然有姿势解决所有问题... + +### 双推 double push *增补 + +所谓双推 就是将本地working directory(or我称其为Local Repo)的内容 即push到 Github 仓库 又推送到 Gitbook + +#### 实现 #### + +一推 github + +- 我在Github Fork(相当于复制为我所用)[学员模板仓库](https://github.com/OpenMindClub/OMOOC.py) 我要基于该模板仓库建立自己学习开智编程课的教程 并改名为pybeginner 该远程库ssh为 `git@github.com:JeremiahZhang/pybeginner.git` +- 在我的电脑端本体建立文件目录(文件夹) 比如我建立的是名为pybeginner的文件夹(我称其为Local Repo 本地仓库) + + `git init` 初始化 以便与远程Repo连接 + + `git remote add hub git@github.com:JeremiahZhang/pybeginner.git` 此处我将Local Repo与Github Repo远程仓库建立连接 这里hub是我定义Github repo的名字 而ssh值我add的是代表**Github上的pybeginner仓库** + + `git branch --track hub master` + + `git pull hub master` 以上将我的 github repo pybeginner拉回(传送 如星际迷航中的瞬间传送)本地local repo + + `git merge hub` [合并分支](https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6) + + `git br -d hub` 删除分支 hub + + 以后我只要在local repo编辑内容 再push 到github 就OK了 + + 如 `git add README.md` 修改了README.md文件 通过 git add 添加到[staging area](https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80#%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%89%E7%A7%8D%E7%8A%B6%E6%80%81) + + `git commit -m "modified README.md"` 提交到[git repository](https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80#%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%89%E7%A7%8D%E7%8A%B6%E6%80%81) + + `git push -u hub master` 推到github + +> 已经推到了Github这是一推 下面需要另一推才能形成二推 + +二推 gitbook + +- Gitbook网页建立我的书籍 [Python Beginner Guide For Leiyu](https://www.gitbook.com/book/jeremiahzhang/pybeginner/details) 并找到 该书的 Git url 在书籍主页右下角 Setup 中 比如本书的git url为`https://git.gitbook.com/jeremiahzhang/pybeginner.git` +- $`git remote add book https://username:apitoken@git.gitbook.com/jeremiahzhang/pybeginner.git` 建立Local repo与gitbook repo的连接 其中username为gitbook的名称 apitoken是每个Gitbook账户特有的 可以在Account setting中找到 book为对应gitbook repo名字 可以自己命名的 +- `git push -u book master` 将Local repo 推送到 gitbook + +以上就是 双推 double push + +## Disqus 评论 *增补 + +> gitbook 还支持许多插件,用户可以从 [NPM](https://www.npmjs.com/) 上搜索 gitbook 的插件,[gitbook 文档](https://github.com/GitbookIO/plugin) 推荐插件的命名方式为: +> +- gitbook-plugin-X: 插件 +- gitbook-theme-X: 主题 +> +所以,可以通过以上两种方式来搜索 gitbook 的插件或者主题 + +作为一个非常流行的为网站集成评论系统的工具,Gitbook可以集成Disqus 便于和读者进行交流 好形成反馈 + +- 1 首先注册Disqus 参考[配置 Disqus](https://openmindclub.gitbooks.io/omooc-py/content/support/Disqus_Setup.html) +- 2 install disqus plugin + + `$ npm install gitbook-plugin-disqus -g` +- 3 增加book.json文件 代码如下 + + { + "plugins": ["disqus"], + "pluginsConfig": { + "disqus": { + "shortName": "XXXXXXX" + } + } + } +- 效果 + - 在每一个页面都出现一下Disqus评论窗口 + +![disqus01](https://raw.githubusercontent.com/JeremiahZhang/gitbookguide/master/_images/disqus-01.JPG) + +详细可参考我的 [折腾GitbookGuide](https://www.gitbook.com/book/jeremiahzhang/gitbookguide/details) + +## 进展 + +- 150317 大妈创建 +- 151007 雷雨增补 \ No newline at end of file diff --git a/0MOOC/learngit.md b/0MOOC/learngit.md new file mode 100644 index 000000000..6d384ac23 --- /dev/null +++ b/0MOOC/learngit.md @@ -0,0 +1,229 @@ +# Learn Git # + +- 1-version control +- 2-历史版本 + - 版本回退 +- 3-设置版本标签 +- 4-小技巧:设置alias +- 5-撤销本地修改(before staging) +- 6-撤销已添加到缓存区的修改(before commit) +- 7-撤销commit到远程库(git revert) +- 8-git pull将远程库拉到本地 +- 9-删除远程库 git remote rm +- 10-git clone < git url > 思想clone之意 就已明了 + +## 1-Push a new local repo to Github ## + +已经有一个origin repo了,现在新建一个新的local repo(用以记录机器学习的学习历程),然后推送到github上: + +- 创建版本库 + - 在自己的电脑文件夹中新建了my machine learning journey的文件夹 + - 然后直接git init here + - git init + - 添加readme文件和机器学习的文件夹 +- 远程仓库设置 + - creat a new repo + - copy the SSH of the new repo + - git add --a + - git commit -m "add new repo" + - git remote add learnml <-my SSH clone URL add-> + - git push -u learnml master + +---------- + +## 2-git 基础 ## + +- working directory:工作区,本地目录,你可以对里面的文件进行操作 +- staging area +- .git directory(Repository) + +we need to know that: + +- changes, not files + - **Git works with changes, not files**. so when I modify the file in the working directory and git add this file,this modifier will be add to the staging area. After that I use the "git commit" to commit this change to repository. + - SO use "git add" to track the changes, and then git commit to repo. +- **History** 历史 + - git log + - git log --pretty=oneline: 用一行来显示git 快照下来的commit历史或版本历史 + - git reflog + - git log --pretty=oneline --max-count=2 : 显示最开始的两个 + - git log --pretty=oneline --since='5 minutes ago' + - git log --pretty=oneline --until='5 minutes ago' + - git log --pretty=oneline --author= + - git log --pretty=oneline --all + - git log --all --pretty=format:'%h %cd %s (%an)' --since='7 days ago':查看最近一周的修改变化。” + - git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short:以另一种显示方式来呈现 +- **版本回退** + - git log or git reflog + - git reset --hard <使用git log or git reflog中的hash值 前7位就可以了> + - cat :来显示文件内容 + +> note 在unix 和mac os中版本回退的命令与window的是同的 + +---------- + +## 3-Tagging Version ## + +- 给commit的版本贴个标签tag:**git tag v1** +- 使用tag name来check out 回退:**git checkout v1^** +- 查看使用的标签 **git tag** +- 查看标签列表 **git hist master --all** + +> Learn how to tag commits with names for future reference + +### 实践 ### + +- 我新建了一个hello.md文件,并添加内容为【# Hello world】 +- **git add** 之后 +- **git commit** 之后 +- **git tag v1** +- **git checkout v1^** +- **cat hello.md** 之后显示 + + cat:hello.md: No such file or directory + +> - 也就是说 git tag v1 是将commit的快照下的那个版本打上标签v1,便于以后回退 +> - 那么 v1^ (或v1~1)是表示的是 v1上一个版本或上一代 + +- **git checkout v1** 之后 +- **cat hello.md** 之后 我的文件又回来了,真的太棒了 + + # Hello world + +- git tag 查看所使用的 tag +- git hist master --all + +> So cool, I can see the tag. + +---------- + + +## 4-小技巧 ## + +- alias:修改git普通命令,使用别名在.gitconfig中修改如,使用起来更方便 + - co = checkout + - ci = commit + - st = status + - br = branch + - hist = log --pretty=oneline + - type = cat-file -t + - dump = cat-file -p + - rf = reflog + +---------- + +## 5-撤销本地修改undoing local changes(before staging) ## + +> - Learn how to revert changes in the working directory. +> - 若我本地工作目录中修改了文件hello.md, 但是我并没有提交add 到缓存区中,更没有commit到远程库中,那么我该如何回退或撤销? +> - git checkout + +- 我在hello.md文件中添加了 + - I want to learn how to revert changes in the working directory. + + # Hello world + + - I want to learn how to revert changes in the working directory. + +- 确定上一次的提交是在master上 + - git checkout master + - 这个使用使得我之前commit的撤回了,回退到我上上会的版本处 + - 比如最近的版本是 v1 + - 使用上面的命令后,回到了上上个版本v1^处 +- git status + - 提示我修改了hello.md文件,但是没有add 和commit +- git checkout hello.md +- git status +- cat hello.md 之后就只剩下了如下内容,说明我撤销了最近一次的本地修改 + + # Hello world + + +> It is so cool. I love Git. + +---------- + +## 6-撤销已添加到缓存区的修改 ## + +> Learn how to revert changes that have been staged. + +- **git reset HEAD ** +- git checkout 用来撤销工作区文件修改 + +修改的文件,已经git add 添加到缓存区,但是没有commit到远程库repo,如何撤销本次的添加到缓存区呢? + +- 简单修改文件hello.md,内容如下 + + # Hello world + - I want to learn how to revert changes in the working directory. Got it. + - Undoing staged changes(before committing) +- git add hello.md + - 将文件添加到了缓存区 + - 但是没有 commit +- cat hello.md + - 查看文件内容 +- git status + - 可以发现提示 **modified hello.md 一行** 是蓝色的,说明已经将文件添加到缓存区 +- git reset HEAD hello.md + - 撤销本次add添加到缓存区 + - 【note】:reset命令不会修改工作目录中的文件内容 +- git status + - 发现此时 **modified hello.md 一行** 是红色的,说明已经撤销了git add(上传到缓存区) +- cat hello.md + - 文件内容没有改变 +- git checkout hello.md + - 此时就撤销了在工作目录中hello.md内容的修改 +- cat hello.md + + # Hello world + - I want to learn how to revert changes in the working directory. Got it. + +回到了修改前状态。 + +> It is so cool. I love Git. + +### 问题来了 ### + +- 那么我该如何再回到我修改后的状态呢? + - 因为本次我没有commit + - 不可使用版本回退 + - git log 后没有hash值所以不可使用 git reset --hard <前7位hash值,但不包括挂号> + +---------- + +## 7-Undoing commit changes ## + +- git add +- git commit -m "..." +- git revert HEAD + +> 学习在commit之后,撤销此次的commit。 +> but 在window中出现vim底层界面。 + +## 8-git pull ## + +- 问题:我在远程库repo中进行了文件的修改,与我本地目录中的文件出现了不同 +- git push 提示不成功,需要git pull +- then 操作 + - git remote add learnml ../...git 【这个之前设置过了就不用再设置了】 + - git branch --track learnml master + - git pull learnml master + +> 这个流程过程和git push 正好可逆。 +> - git push 之前先要 add 与commit +> - git pull 之前,先要将分支track一下 + +## 9-git remote rm * ## + +远程库重名了 或需要删除 用此命令 +注意 git branch -d 是删除branch分支的 +不要混淆 + +10/8/2015 + +---------- + +## 进展 ## + +- 1-8 与开课前就已经学习 并创建 +- 带`*`的是增补 10/8/2015 雷雨增补 \ No newline at end of file diff --git a/0MOOC/win7.md b/0MOOC/win7.md new file mode 100644 index 000000000..99d0a840a --- /dev/null +++ b/0MOOC/win7.md @@ -0,0 +1,105 @@ +# windows setting + +win7配置 +只有win系统的电脑 嗯 要用win系统 就不能用Ubuntu了 怎么办 google search windows shell + +- [我的windows软件](https://www.zfanw.com/blog/windows-software-i-use.html) + +---------- + +## 1-iTerm2 或同级别强力 Shell 托管环境 ## + +- Babun +- ConEmu +- Tmux [官网](https://tmux.github.io/) [使用参考](http://foocoder.com/blog/zhong-duan-huan-jing-zhi-tmux.html/) + +---------- + + +刚开始想到的windows 下的Powershell + +- Youtube [Introduction to Windows PowerShell Part 1](https://www.youtube.com/watch?v=bEOq-S3veiA) +- [易學易用的 Windows PowerShell](https://www.microsoft.com/taiwan/technet/columns/profwin/28-monad.mspx) + +windows 的shell 不想用 去找替代 果然谷歌大法好 嗯 + +Get [Babun,一个开箱即用的 Windows Shell](http://blog.jamespan.me/2015/04/09/babun-the-shell/) +官网的下载速度比较慢 也不急 慢慢来 + +预测有许多坑 嗯 还需要填坑 + +- 0 [Babun官网](http://babun.github.io/) +- 1 [windows下搭建类linux环境](http://borghan.com/archives/windows-build-lunix-like-environment.html) + - 在修改中文乱码时 不知道如何进行指令操作了 unix不熟悉 返回default设置 + - 在修改的时候 一个根据提示在babun.bash中修改 + - 一个 直接 `vi .oh-my-zsh/custom/babun.zsh-theme` 进入vi 命令模式修改 +- 2 [配置](http://www.rxna.cn/post/wiki/babun-pei-zhi) +- 3 [Windows 的 SHELL 程序 Babun](http://my.oschina.net/blogshi/blog/268031) + +默认的shell 是 The zsh (with .oh-my-zsh) is the default babun’s shell. + +- bash shell /bin/zsh +- bash shell /bin/bash + + +带下载好 进行配置 + +### 总 ### + +- cd # cd /usr/spool/mail +- pwd : present working directory + +参考 [shell命令](http://www.lampweb.org/linux/2/2.html) + +- [整合ConEmu](https://www.52os.net/articles/windows-install-unix-like-command-tools.html) + + [下载ConEmu](https://github.com/Maximus5/ConEmu) + + 注意 需要将 `C:\CMD.babun\cygwin\bin\mintty.exe -t C:\CMD.babun\cygwin\etc\minttyrc` 修改 修改为自己babun所在的文件目录 + +> 在conEmu窗口右上角右键--settings--startup--tasks,点“+”号添加一个新task,task parameters留空,也按照babun官网介绍中配置图标等信息,在下面的commands中加入: +C:\CMD.babun\cygwin\bin\mintty.exe -t C:\CMD.babun\cygwin\etc\minttyrc + + + 意外 使用 babun 还是出现乱码 + +> conEmu 是window下的多标签命令行工具,可以方便的新建cmd、cmd admin、powershell、powershell admin多种命令行,设置很多,功能强大 + +---------- + +## Dash 或同类文档查询应用/服务/环境 ## + +Dash是OS X 系统下的 那么寻找替代 + +- [Velocity](http://velocity.silverlakesoftware.com/) + +---------- + +## 文本编辑器 ## + +- [Sublime Text 2](http://www.sublimetext.com/2) + +## 自动化 ## + +- [AutoHotkey](http://www.autohotkey.com/) + + +---------- + +## Babun ## + +Problem + +- 当我再次重启电脑 再次使用babun时 出现问题 zsh 2064 child_info_fork 嗯 google search got [this same problem](https://www.cygwin.com/ml/cygwin/2013-01/msg00020.html) + - 尝试reboot ok 没问题了 + + +---------- + +## VI ## + +- 指令模式 Esc +- 输入模式 a/A i/I o/O 6个键 任选一个 我选择i + + - [vi指令说明](http://www2.nsysu.edu.tw/csmlab/unix/vi_command.htm) +- :wq 保存 退出 +- :q 直接退出 +- :q 不保存退出 + +10/2/2015 From 21e5434c7e0f84cf98edded3ae9883395d1839c5 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 16:07:03 +0800 Subject: [PATCH 011/432] main beta2.0 --- _src/om2py0w/0wex0/main.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/_src/om2py0w/0wex0/main.py b/_src/om2py0w/0wex0/main.py index 3d5697ef6..f1320a6ef 100644 --- a/_src/om2py0w/0wex0/main.py +++ b/_src/om2py0w/0wex0/main.py @@ -13,7 +13,23 @@ def main(): for words in keywords: print words, print "\n" + + script_statement = """ # 脚本说明: + 1.这是每日日志书写脚本 + 2.首先打印的是脚本所在文件夹所有日志(txt格式)名称及内容 + 3.请按照提示进行 日志书写 + 4.想要结束日志写作?最后一行请单独输入:end + + 祝您书写愉快! + """ + + print(script_statement.encode(sys.stdout.encoding) + "\n") + + read_diary() + write_diary() + +def read_diary(): current_dir = os.getcwd() # 打印之前日志 os.chdir(current_dir) @@ -22,18 +38,7 @@ def main(): file_content = open(file, "r") print file_content.read() - script_statement = """ # 脚本说明: - - 1.这是每日日志书写脚本 - 2.以上打印的是脚本所在文件夹所有日志(txt格式)名称及内容 - 3.请按照提示进行 日志书写 - 4.想要结束日志写作?最后一行请单独输入:end - - 祝您书写愉快! - """ - print(script_statement.encode(sys.stdout.encoding)) - - # ******* 写日志 ******* +def write_diary(): done = False textInput = "" @@ -53,7 +58,6 @@ def main(): diary_writer.close() print ("Here is your " + inputDate +" diary: " + textInput) -# ******* date time function ******* def ask_date(prompt): # 是否添加时间 ok = raw_input(prompt) if ok in yes_list: From 9847fcadeb552641577fc2fd7de51707e6a3d009 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 16:11:56 +0800 Subject: [PATCH 012/432] beta 2.0 mod --- _src/om2py0w/0wex0/diary_name.txt | 5 ++--- _src/om2py0w/0wex0/main.py | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_src/om2py0w/0wex0/diary_name.txt b/_src/om2py0w/0wex0/diary_name.txt index 19ad73103..58a4522a4 100644 --- a/_src/om2py0w/0wex0/diary_name.txt +++ b/_src/om2py0w/0wex0/diary_name.txt @@ -1,4 +1,3 @@ -Ľű README ʾ -Ҫʹ˽ 뵥 end + beta2.0 -2015-10-20 13:58:29 \ No newline at end of file +2015-10-20 16:11:18 \ No newline at end of file diff --git a/_src/om2py0w/0wex0/main.py b/_src/om2py0w/0wex0/main.py index f1320a6ef..c9ef496d1 100644 --- a/_src/om2py0w/0wex0/main.py +++ b/_src/om2py0w/0wex0/main.py @@ -14,6 +14,8 @@ def main(): print words, print "\n" + read_diary() + script_statement = """ # 脚本说明: 1.这是每日日志书写脚本 @@ -26,7 +28,6 @@ def main(): print(script_statement.encode(sys.stdout.encoding) + "\n") - read_diary() write_diary() def read_diary(): @@ -36,7 +37,7 @@ def read_diary(): for file in glob.glob("*.txt"): print(file) file_content = open(file, "r") - print file_content.read() + print file_content.read() + "\n" def write_diary(): done = False From 948df407790952c08a67c18189d38cbfcdea055c Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 16:16:32 +0800 Subject: [PATCH 013/432] 1w task tutorial mod --- 2nDev/week01_interact.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/2nDev/week01_interact.md b/2nDev/week01_interact.md index 0628ba940..cd7b25398 100644 --- a/2nDev/week01_interact.md +++ b/2nDev/week01_interact.md @@ -1,5 +1,8 @@ # week_1 日志交互系统 +- [Latest code](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py0w/0wex0/main.py) +- [使用说明](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py0w/README.md) + ## 背景 ## 第一周的任务:交互-101 From 32635c1f12251f19f2a2768882ca5eedd09e13df Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 16:18:59 +0800 Subject: [PATCH 014/432] mod diary readme --- _src/om2py0w/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_src/om2py0w/README.md b/_src/om2py0w/README.md index 6add68d38..7040f73de 100644 --- a/_src/om2py0w/README.md +++ b/_src/om2py0w/README.md @@ -16,6 +16,6 @@ + 代表添加日期时间的string list: `yes_list = ['yes', 'yep', 'ye', 'y', 'YES','YEP', 'YE', 'Y']` + 代表不添加日期时间string list: `no_list = ['no', 'n', 'NO', 'N']` + 最后会打印你刚刚写作的所有内容(不包括时间) - + shell中打开文件 `cat diary_name.txt` 会日志内容 - + 演示 + + shell中打开文件 `cat diary_name.txt` 会打印日志内容 + + 演示 ![演示](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/05_readme_pre.JPG) From f44a7455b6ee953fe5c8f64f60f486435427153c Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 17:08:48 +0800 Subject: [PATCH 015/432] git new change --- 0MOOC/learngit.md | 328 ++++++++++++++++++++-------------------------- SUMMARY.md | 2 +- 2 files changed, 145 insertions(+), 185 deletions(-) diff --git a/0MOOC/learngit.md b/0MOOC/learngit.md index 6d384ac23..7c4560f2f 100644 --- a/0MOOC/learngit.md +++ b/0MOOC/learngit.md @@ -1,229 +1,189 @@ # Learn Git # -- 1-version control -- 2-历史版本 - - 版本回退 -- 3-设置版本标签 -- 4-小技巧:设置alias -- 5-撤销本地修改(before staging) -- 6-撤销已添加到缓存区的修改(before commit) -- 7-撤销commit到远程库(git revert) -- 8-git pull将远程库拉到本地 -- 9-删除远程库 git remote rm -- 10-git clone < git url > 思想clone之意 就已明了 - -## 1-Push a new local repo to Github ## - -已经有一个origin repo了,现在新建一个新的local repo(用以记录机器学习的学习历程),然后推送到github上: - -- 创建版本库 - - 在自己的电脑文件夹中新建了my machine learning journey的文件夹 - - 然后直接git init here - - git init - - 添加readme文件和机器学习的文件夹 -- 远程仓库设置 - - creat a new repo - - copy the SSH of the new repo - - git add --a - - git commit -m "add new repo" - - git remote add learnml <-my SSH clone URL add-> - - git push -u learnml master +- Version Control 版本控制 +- Git + - git basic 3大区 + - 配置工具 + - 本地与远程库联通 +- 常用命令 + + 版本回溯 + + Tag标签 commit + + branch 分支 +- 小技巧 ----------- +## Version Control ## + +- 什么是[版本控制](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control) + +> - Version control is a system that records changes to a file or set of files over time so that you can recall specific versions later. -## 2-git 基础 ## - -- working directory:工作区,本地目录,你可以对里面的文件进行操作 -- staging area -- .git directory(Repository) - -we need to know that: - -- changes, not files - - **Git works with changes, not files**. so when I modify the file in the working directory and git add this file,this modifier will be add to the staging area. After that I use the "git commit" to commit this change to repository. - - SO use "git add" to track the changes, and then git commit to repo. -- **History** 历史 - - git log - - git log --pretty=oneline: 用一行来显示git 快照下来的commit历史或版本历史 - - git reflog - - git log --pretty=oneline --max-count=2 : 显示最开始的两个 - - git log --pretty=oneline --since='5 minutes ago' - - git log --pretty=oneline --until='5 minutes ago' - - git log --pretty=oneline --author= - - git log --pretty=oneline --all - - git log --all --pretty=format:'%h %cd %s (%an)' --since='7 days ago':查看最近一周的修改变化。” - - git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short:以另一种显示方式来呈现 -- **版本回退** - - git log or git reflog - - git reset --hard <使用git log or git reflog中的hash值 前7位就可以了> - - cat :来显示文件内容 - -> note 在unix 和mac os中版本回退的命令与window的是同的 +版本控制是记录文件内容变化的系统 可以帮助我在将来某一天都能查看以前某个文件某个版本的修订情况 + +- 举个例子 + - 从2015年9月1日开始 我每天写硕士论文 直到今天 嗯 我是在word中写的 + - 每一天写完一点 我都保存好了 但是还是在原来的文件在保存的 直接`ctrl+s` + - 假如我想知道我每天写的不用内容 我就得每日都另存为`ctrl+shift+s`一个版本 并命名时间2015-09-30版什么的 这样30天下来 我就有30个不同版本的硕士论文 查看我每一天所写的内容 + - 但有了版本控制系统 我只要用几个简单的命令 就可以记录那30个不同的论文版本 并且最终的文件 还是只有1个而已 我想回溯到30天内任何一天的写作内容 都可以 + +以上只是一个简单的例子 +版本控制还有很多有用之处呢 ---------- -## 3-Tagging Version ## +## Git ## -- 给commit的版本贴个标签tag:**git tag v1** -- 使用tag name来check out 回退:**git checkout v1^** -- 查看使用的标签 **git tag** -- 查看标签列表 **git hist master --all** +- 什么是[Git](https://git-scm.com/) +> Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency -> Learn how to tag commits with names for future reference +Git是一个免费且开源的[分布式版本控制系统](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control#Distributed-Version-Control-Systems) -### 实践 ### +![分布式版本控制](https://git-scm.com/book/en/v2/book/01-introduction/images/distributed.png) -- 我新建了一个hello.md文件,并添加内容为【# Hello world】 -- **git add** 之后 -- **git commit** 之后 -- **git tag v1** -- **git checkout v1^** -- **cat hello.md** 之后显示 - - cat:hello.md: No such file or directory +如图 分布式版本控制系统中 服务器中的文件库(远程库)如同"大树树根"一样 树枝A和B(本地电脑A-B)可以从"树根"获取远程库内容 并在本地修改之后 再次传输给“树根” 而A-B可以同时对同一个文件库中的内容进行操作 A-B也可以进行互相协作 -> - 也就是说 git tag v1 是将commit的快照下的那个版本打上标签v1,便于以后回退 -> - 那么 v1^ (或v1~1)是表示的是 v1上一个版本或上一代 +### Git Basic ### -- **git checkout v1** 之后 -- **cat hello.md** 之后 我的文件又回来了,真的太棒了 +3大区 - # Hello world +- 工作区 working directory + - 你可以认为是 本地仓库 Local Repository + - 也是-本地目录-本地文件夹 + - 在其中可进行操作:如我在一个文件夹中建立一个md文档等等 +- 暂存区 staging area + - 这个区 可以看作是一个虚拟区 +- .git directory (Remote Reposiroty 远程仓库) + - 代表着 [Github](https://github.com/) 远程仓库 -- git tag 查看所使用的 tag -- git hist master --all +### 配置工具 ### -> So cool, I can see the tag. +- 注册github + - 用户名 + - 邮箱地址 ----------- +首先下载Git全平台版 [http://git-scm.com](http://git-scm.com) +- 配置所有本地仓库的用户信息 (相当于配置确认你本地计算的用户ID 可以与远程仓库进行联通) + - `$ git config --global username` + - `$ git config --global email_address` + - 说明 + + username 是 我在github上注册的 用户名 + + email_address 是 我在github注册 用户名 时的 邮箱地址 +- 这样设置好 我就可以和Github 远程库 进行自由联通了 怎么联通 请继续看 -## 4-小技巧 ## +### 本地与远程库联通 ### -- alias:修改git普通命令,使用别名在.gitconfig中修改如,使用起来更方便 - - co = checkout - - ci = commit - - st = status - - br = branch - - hist = log --pretty=oneline - - type = cat-file -t - - dump = cat-file -p - - rf = reflog +- 创建远程库 gopython + - creat a new repo 新建完库之后 注意出现的代码 尤其是ssh连接 + - copy the SSH of the new repo 也可以使用其url 后面会使用 +- 在本地文件夹中创建一个新的仓库 + + 我在D盘中创建一个文件夹名为 gopython + + 我右击gopython文件夹名 再点击`git bash here` 我就对gopython文件夹进行git bash 命令行操作了 + + `$ git init` git 默认此时branch为master + + 在【gopython文件夹】中添加 README.md和 SUMMARY.md 文件 +- 远程仓库设置 + - `git add --a` + - `git commit -m "1st commit"` + - `git remote add name [the gopyhon SSH 或url 任选一]`注意`[]`不需要的 `name` 自定义远程库的名字 + - `git push -u name master` 将远程库内容 ---------- -## 5-撤销本地修改undoing local changes(before staging) ## +## 常用命令 ## +1-代码库clone到本地文件目录 -> - Learn how to revert changes in the working directory. -> - 若我本地工作目录中修改了文件hello.md, 但是我并没有提交add 到缓存区中,更没有commit到远程库中,那么我该如何回退或撤销? -> - git checkout + git clone {remote ssh or http link} +2-在本地目录添加远程库 -- 我在hello.md文件中添加了 - - I want to learn how to revert changes in the working directory. - - # Hello world + git remote add remote_name {remote ssh or http link} +3-将远程库文件pull到本地 - - I want to learn how to revert changes in the working directory. - -- 确定上一次的提交是在master上 - - git checkout master - - 这个使用使得我之前commit的撤回了,回退到我上上会的版本处 - - 比如最近的版本是 v1 - - 使用上面的命令后,回到了上上个版本v1^处 -- git status - - 提示我修改了hello.md文件,但是没有add 和commit -- git checkout hello.md -- git status -- cat hello.md 之后就只剩下了如下内容,说明我撤销了最近一次的本地修改 + git pull remote_name {remote ssh or http link} +4-本地新增or修改的文件添加到working dir - # Hello world + git add --a #添加所有 +5-添加之后 需要commit到staging area 暂存区 + git commit -m "simple tag this commit" +6-推送到github -> It is so cool. I love Git. + git push remote_name {remote ssh or http link} +7-查看Local repo所有变化修改 + + git status +8-查看远程库 ----------- + git remote + git remote rm remote_name # 删除远程库 -## 6-撤销已添加到缓存区的修改 ## - -> Learn how to revert changes that have been staged. - -- **git reset HEAD ** -- git checkout 用来撤销工作区文件修改 - -修改的文件,已经git add 添加到缓存区,但是没有commit到远程库repo,如何撤销本次的添加到缓存区呢? - -- 简单修改文件hello.md,内容如下 - - # Hello world - - I want to learn how to revert changes in the working directory. Got it. - - Undoing staged changes(before committing) -- git add hello.md - - 将文件添加到了缓存区 - - 但是没有 commit -- cat hello.md - - 查看文件内容 -- git status - - 可以发现提示 **modified hello.md 一行** 是蓝色的,说明已经将文件添加到缓存区 -- git reset HEAD hello.md - - 撤销本次add添加到缓存区 - - 【note】:reset命令不会修改工作目录中的文件内容 -- git status - - 发现此时 **modified hello.md 一行** 是红色的,说明已经撤销了git add(上传到缓存区) -- cat hello.md - - 文件内容没有改变 -- git checkout hello.md - - 此时就撤销了在工作目录中hello.md内容的修改 -- cat hello.md - - # Hello world - - I want to learn how to revert changes in the working directory. Got it. - -回到了修改前状态。 - -> It is so cool. I love Git. - -### 问题来了 ### - -- 那么我该如何再回到我修改后的状态呢? - - 因为本次我没有commit - - 不可使用版本回退 - - git log 后没有hash值所以不可使用 git reset --hard <前7位hash值,但不包括挂号> +### 版本回溯 ### +1-查看版本历史 + + git log + git log --pretty=oneline # 用一行来显示git 快照下来的commit历史或版本历史 ----------- +2-版本回退 + + git reflog # git log + git reset --hard {使用git log or git reflog中的hash值 前7位} +3-查看所有commit历史 + + git hist master --all -## 7-Undoing commit changes ## +### Tag 标签 commit ### -- git add -- git commit -m "..." -- git revert HEAD +1-给刚commit的版本贴个标签 tag:好记 -> 学习在commit之后,撤销此次的commit。 -> but 在window中出现vim底层界面。 + git commit -m "" + git tag v1 + git checkout v1 # 直接使用tag回退 v1^的话 表示上一个版本 commit +2-查看所有标签 + + git tag -## 8-git pull ## +### git branch ### +1-**查看**所有本地repo中所有分支 默认为master -- 问题:我在远程库repo中进行了文件的修改,与我本地目录中的文件出现了不同 -- git push 提示不成功,需要git pull -- then 操作 - - git remote add learnml ../...git 【这个之前设置过了就不用再设置了】 - - git branch --track learnml master - - git pull learnml master + git branch +2-**创建分支** + + git branch {branch_name} +创建分支后 HEAD(相当于一个指针) 就指向正在工作的本体分支了 branch_name的分支 +3-HEAD 指针回到原来的master分支 -> 这个流程过程和git push 正好可逆。 -> - git push 之前先要 add 与commit -> - git pull 之前,先要将分支track一下 + git checkout master +4-**新建并切换到分支** branch_test -## 9-git remote rm * ## + git checkout -b branch_test +5-**合并分支** 与master合并 + + git checkout master + git merge branch_test +6-**删除分支** + + git branch -d branch_test # 合并好之后 branch_test分支可以删除了 -远程库重名了 或需要删除 用此命令 -注意 git branch -d 是删除branch分支的 -不要混淆 +---------- + +## 小技巧 ## -10/8/2015 +文件目录中 修改.git/config中的命令**绰号** 如 + + [alias] + co = checkout + ci = commit -m + st = status + br = branch + pu = push origin master + pl = pull + ad = add --a + hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short + type = cat-file -t + dump = cat-file -p + rf = reflog +设置好之后 `git st` 就代表 `git status` ---------- -## 进展 ## +10/20/2015 + -- 1-8 与开课前就已经学习 并创建 -- 带`*`的是增补 10/8/2015 雷雨增补 \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md index 167bae91e..07b8ed2b6 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,7 +1,7 @@ # Summary - [教学反转](0MOOC/README.md) - [Windows Setting](0MOOC/win7.md) - - [Learn Git](0MOOC/learngit.md) + - [Git](0MOOC/learngit.md) - [windows setting](0MOOC/win7.md) - [Gitbook](0MOOC/gitbook.md) - [ST2与Py环境配置](0MOOC/SubPy.md) From bdfa2a633b0df4ee8065b053c8ef3704c1dd7b68 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 17:25:08 +0800 Subject: [PATCH 016/432] mod 1w task diary readme --- 0MOOC/learngit.md | 10 +++++++++- _src/om2py0w/README.md | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/0MOOC/learngit.md b/0MOOC/learngit.md index 7c4560f2f..ead83a9af 100644 --- a/0MOOC/learngit.md +++ b/0MOOC/learngit.md @@ -84,7 +84,8 @@ Git是一个免费且开源的[分布式版本控制系统](https://git-scm.com/ - `git add --a` - `git commit -m "1st commit"` - `git remote add name [the gopyhon SSH 或url 任选一]`注意`[]`不需要的 `name` 自定义远程库的名字 - - `git push -u name master` 将远程库内容 + - `git pull name [the gopyhon SSH 或url 任选一]` # 现将github上远程库拉到本地 才能推送 + - `git push -u name master` 推送到.git 远程库 ---------- @@ -162,6 +163,13 @@ Git是一个免费且开源的[分布式版本控制系统](https://git-scm.com/ git branch -d branch_test # 合并好之后 branch_test分支可以删除了 +#### 分支管理 #### + + git branch # 产看当前所以分支 + git branch -v # 查看各个分支最后一次commit对象信息 + git branch --merged # 已合并分支 + git branch --no-merged # 尚未合并分支 + ---------- ## 小技巧 ## diff --git a/_src/om2py0w/README.md b/_src/om2py0w/README.md index 7040f73de..4eed20426 100644 --- a/_src/om2py0w/README.md +++ b/_src/om2py0w/README.md @@ -1,5 +1,9 @@ # OMOOC.py 周任务代码试作 +- 系统 win7 +- 命令行使用Powershell工具 +- python version 2.7.8 + ## 0w 日记交互系统 - py 调用 From d071fdc8a104b1af6876fd2bae51c4433011df86 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 19:29:09 +0800 Subject: [PATCH 017/432] mod book readme --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a8eb60110..8347fbc47 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,15 @@ ## 目标 - +- 探索未知领域, Self Mining +- 习得编程思维 + - 像程序员或黑客一样解决问题 ## ( ̄▽ ̄) +[如何成为一名黑客](http://translations.readthedocs.org/en/latest/hacker_howto.html#id3) +> 你必须建立对于自己学习能力的信念——就算你掌握的知识不足以解决当前的问题,如果你从问题的一小部分下手并从中学习,你将学到足够的知识用来解决下一部分——以此类推,直到整个问题都被你解决为止。 + + Transferd From [Python Beginner Guide For Leiyu](https://jeremiahzhang.gitbooks.io/pybeginner/content/) 10/20/2015 Transfered From 17171d06d8058ff9921570fbdeee0fdfbc9631ee Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 19:59:33 +0800 Subject: [PATCH 018/432] readme --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8347fbc47..8341f1d64 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,14 @@ [如何成为一名黑客](http://translations.readthedocs.org/en/latest/hacker_howto.html#id3) > 你必须建立对于自己学习能力的信念——就算你掌握的知识不足以解决当前的问题,如果你从问题的一小部分下手并从中学习,你将学到足够的知识用来解决下一部分——以此类推,直到整个问题都被你解决为止。 +[The Glider: A Universal Hacker Emblem ](http://www.catb.org/~esr/hacker-emblem/) -Transferd From [Python Beginner Guide For Leiyu](https://jeremiahzhang.gitbooks.io/pybeginner/content/) +![Glider](http://www.catb.org/~esr/hacker-emblem/glider.png) + +---------- + +## Renew ## +Transfered From [Python Beginner Guide For Leiyu](https://jeremiahzhang.gitbooks.io/pybeginner/content/) 10/20/2015 Transfered From a94b75b831378cf0668dd97dd2fcf9a9a6fb7d3b Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 20:00:49 +0800 Subject: [PATCH 019/432] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8341f1d64..3710843fd 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ## 作者 - [入学三问](https://github.com/JeremiahZhang/gopython/blob/master/PY-StarTrek-Prepare/2015-9-10-T2-%E5%85%A5%E5%AD%A6%E4%B8%89%E9%97%AE.md) -- [雷雨Jeremiah](http://weibo.com/1784386944/profile?topnav=1&wvr=6)) +- [雷雨Jeremiah](http://weibo.com/1784386944/profile?topnav=1&wvr=6) - 个人成长博客 [Renew Mind](http://jeremiahzhang.github.io/) From fe5c5772389992776825cc17fdafcc6d6b1c49cf Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 20:07:32 +0800 Subject: [PATCH 020/432] readme --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3710843fd..37fae1e47 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,9 @@ ## 作者 - [入学三问](https://github.com/JeremiahZhang/gopython/blob/master/PY-StarTrek-Prepare/2015-9-10-T2-%E5%85%A5%E5%AD%A6%E4%B8%89%E9%97%AE.md) -- [雷雨Jeremiah](http://weibo.com/1784386944/profile?topnav=1&wvr=6) -- 个人成长博客 [Renew Mind](http://jeremiahzhang.github.io/) +- 新浪微博:[@雷雨Jeremiah](http://weibo.com/1784386944/profile?topnav=1&wvr=6) +- Github:[@JeremyZhang](https://github.com/JeremiahZhang) +- 个人博客:[Renew Mind](http://jeremiahzhang.github.io/) ## 目标 From 82c7ddb4e4abc7bdf929bfa03c3c6ec711f8e8b5 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 21:36:42 +0800 Subject: [PATCH 021/432] package install md --- SUMMARY.md | 2 ++ _src/om2py0w/0wex1/main.py | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/SUMMARY.md b/SUMMARY.md index 07b8ed2b6..95ae7420d 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -12,6 +12,8 @@ - [从源开始](1sTry/0wd1-reflection.md) - [Sth New](1sTry/0wd2-New-things-to-learn.md) - [苟日新](1sTry/0wd3-step-by-step-4_7-8.md) +- [Learn by Doing](1tDoing/README.md) + - [Python Package Install](1tDoing/MoudleInstall.md) - [迭代作品](2nDev/README.md) - [week_1_交互](2nDev/week01_interact.md) - [人生首秀](3rDemo/README.md) diff --git a/_src/om2py0w/0wex1/main.py b/_src/om2py0w/0wex1/main.py index e69de29bb..bcebbbcc9 100644 --- a/_src/om2py0w/0wex1/main.py +++ b/_src/om2py0w/0wex1/main.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +import twill +go("https://mp.weixin.qq.com/") + +fv("1", "email-email", "ste.jeremy@163.com") +fv("1", "password-clear", "focusonstudy@4") + +submit("0") From abd04543a91efc3adb8bdc180999cfe16cfbb475 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 22:06:47 +0800 Subject: [PATCH 022/432] package install lessson --- 1tDoing/MoudleInstall.md | 44 ++++++++++++++++++++++++++++++++++++++++ 1tDoing/README.md | 10 +++++++++ 2 files changed, 54 insertions(+) create mode 100644 1tDoing/MoudleInstall.md create mode 100644 1tDoing/README.md diff --git a/1tDoing/MoudleInstall.md b/1tDoing/MoudleInstall.md new file mode 100644 index 000000000..64106af0c --- /dev/null +++ b/1tDoing/MoudleInstall.md @@ -0,0 +1,44 @@ +# Python Package Install + +## 背景 ## + +有一个微信公众号 每次写点内容 总要输入密码 浏览器记录了也没有用 +所以想写一个python脚本 直接调用 登录微信公众号网页[https://mp.weixin.qq.com/](https://mp.weixin.qq.com/) + +## 探索 + +- 经过 Google Search [http://stackoverflow.com/questions/2910221/how-can-i-login-to-a-website-with-python](http://stackoverflow.com/questions/2910221/how-can-i-login-to-a-website-with-python) 要安装 automating Web browsing Package [twill](http://twill.idyll.org/) + + 根据 [easy install](http://peak.telecommunity.com/DevCenter/EasyInstall#downloading-and-installing-a-package) 安装 twill 不行啊 + + 不知其他package行不行 还待验证 +- 居然没有直接去 the Python Package Index [PyPI](https://pypi.python.org/pypi)网页去找 **教训** +- 醒悟过来后 找到[twill-1.8.0](https://pypi.python.org/pypi/twill) +- 安装遇到问题 回归 help文档 Installing Python Modules + +## 安装 ## + +### 方案-1 ### + +在[PyPI](https://pypi.python.org/pypi)下载对应的Package 一般package 有说明怎么安装 安装说明来也可以 +但是也可以下载 package 使用python进行安装 + +- 从PyPI下载Packege文件 如[twill-1.8.0](https://pypi.python.org/pypi/twill) gar.gz文件到目录C:\temp +- 解压package压缩包 可以在文件目录中 `C:\temp\twill-1.8.0` 有个setup.py脚本 +- 使用Python安装 (window Powershell中) + + C:\temp\twill-1.8.0 + python setup.py install +可以成功安装 + +### 方案-2 ### + +若在PyPI中的package有安装说明 就直接用command line安装 + +## 总 ## + +- 需求外部 python package +- 直接从PyPI中寻找Package + - 若直接有安装说明 就用cmd line命令安装 +- 下载压缩文件 解压 +- 安装 window shell中 `python setup.py install` 安装 + +10/20/2015 10:06:09 PM diff --git a/1tDoing/README.md b/1tDoing/README.md new file mode 100644 index 000000000..20a4ecbd8 --- /dev/null +++ b/1tDoing/README.md @@ -0,0 +1,10 @@ +# Learn by Doing + +- 刻意练习 +- 在做中学 + +本目录主要收集 实践Python中的学习旅程 + +## ( ̄▽ ̄) ## + +10/20/2015 Jeramiah 创建 From 0728c5c0d704b3f8186d5cd8f8e1d9515b53e83b Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 22:44:11 +0800 Subject: [PATCH 023/432] twill module install finished --- 1tDoing/MoudleInstall.md | 25 +++++++++++++++++++++++-- _src/om2py0w/0wex1/main.py | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/1tDoing/MoudleInstall.md b/1tDoing/MoudleInstall.md index 64106af0c..a8cf61ee9 100644 --- a/1tDoing/MoudleInstall.md +++ b/1tDoing/MoudleInstall.md @@ -16,6 +16,9 @@ ## 安装 ## +### 方案-0 Pip install ### + pip install package_name + ### 方案-1 ### 在[PyPI](https://pypi.python.org/pypi)下载对应的Package 一般package 有说明怎么安装 安装说明来也可以 @@ -26,19 +29,37 @@ - 使用Python安装 (window Powershell中) C:\temp\twill-1.8.0 + python setup.py build python setup.py install 可以成功安装 +在使用Twill过程发现 + + ImportError: No module named lxml +缺少 `lxml` module 安装 Package [lxml](https://pypi.python.org/pypi?%3Aaction=search&term=lxml&submit=search)使用babun安装 + + pip install lxml +执行 `from twill.commands import *`提示缺少requests模块 No module named requests go on + + pip install requests +执行 又提示 + + cssselect seems not to be installed. See http://packages.python.org/cssselect/ +继续 + + pip instal cssselect +总算完工 + ### 方案-2 ### 若在PyPI中的package有安装说明 就直接用command line安装 ## 总 ## -- 需求外部 python package +- 需求外部 python package babun中 直接`pip install` - 直接从PyPI中寻找Package - 若直接有安装说明 就用cmd line命令安装 - 下载压缩文件 解压 -- 安装 window shell中 `python setup.py install` 安装 +- 安装 window shell中 安装 10/20/2015 10:06:09 PM diff --git a/_src/om2py0w/0wex1/main.py b/_src/om2py0w/0wex1/main.py index bcebbbcc9..a88b2d024 100644 --- a/_src/om2py0w/0wex1/main.py +++ b/_src/om2py0w/0wex1/main.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import twill +from twill.commands import * go("https://mp.weixin.qq.com/") fv("1", "email-email", "ste.jeremy@163.com") From 4aa2c5ad29b900d61f88e1d3994664bd2cce5432 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Tue, 20 Oct 2015 23:58:53 +0800 Subject: [PATCH 024/432] twill --- _src/om2py0w/0wex1/.twill-history | 5 +++++ _src/om2py0w/0wex1/main.py | 8 +++----- _src/om2py0w/0wex1/twill_browser.py | 7 +++++++ _src/om2py0w/0wex1/twill_test.py | 7 +++++++ 4 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 _src/om2py0w/0wex1/.twill-history create mode 100644 _src/om2py0w/0wex1/twill_browser.py create mode 100644 _src/om2py0w/0wex1/twill_test.py diff --git a/_src/om2py0w/0wex1/.twill-history b/_src/om2py0w/0wex1/.twill-history new file mode 100644 index 000000000..a4d171f89 --- /dev/null +++ b/_src/om2py0w/0wex1/.twill-history @@ -0,0 +1,5 @@ +? +go http://www.slashdot.org/ +show +showforms +showhistory diff --git a/_src/om2py0w/0wex1/main.py b/_src/om2py0w/0wex1/main.py index a88b2d024..ee52f55cd 100644 --- a/_src/om2py0w/0wex1/main.py +++ b/_src/om2py0w/0wex1/main.py @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- from twill.commands import * -go("https://mp.weixin.qq.com/") -fv("1", "email-email", "ste.jeremy@163.com") -fv("1", "password-clear", "focusonstudy@4") - -submit("0") +from twill.commands import * +go("http://www.python.org/") +showforms() \ No newline at end of file diff --git a/_src/om2py0w/0wex1/twill_browser.py b/_src/om2py0w/0wex1/twill_browser.py new file mode 100644 index 000000000..0953a1975 --- /dev/null +++ b/_src/om2py0w/0wex1/twill_browser.py @@ -0,0 +1,7 @@ +from twill import get_browser +b = get_browser() + +b.go("http://www.python.org/") +b.showforms() + +# To talk to the Web browser directly, call the get_browser function: \ No newline at end of file diff --git a/_src/om2py0w/0wex1/twill_test.py b/_src/om2py0w/0wex1/twill_test.py new file mode 100644 index 000000000..3fc97aa8d --- /dev/null +++ b/_src/om2py0w/0wex1/twill_test.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# import all of the commands in commands.py and use them directly from Python +from twill.commands import * + +from twill.commands import * +go("http://www.python.org/") +showforms() \ No newline at end of file From 3bffe988c277c697826e8c21a128f661d6623174 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Wed, 21 Oct 2015 17:05:18 +0800 Subject: [PATCH 025/432] diary beta 2.0 --- _src/om2py0w/0wex0/main_beta_2.py | 72 +++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 _src/om2py0w/0wex0/main_beta_2.py diff --git a/_src/om2py0w/0wex0/main_beta_2.py b/_src/om2py0w/0wex0/main_beta_2.py new file mode 100644 index 000000000..f17e960bd --- /dev/null +++ b/_src/om2py0w/0wex0/main_beta_2.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +import sys, os, glob +from time import localtime, strftime + +reload(sys) # 必须 reload +sys.setdefaultencoding('utf-8') + +def main(): + keywords = sys.argv[1:] # 调用外部数据 + for words in keywords: + print words, + print "\n" + + read_diary() + + print welcome_statement.__doc__ + + write_diary() + +def welcome_statement(): + """ # Dear, welcome abord in Diary Ship + + 1. Please input your words as following prompt + 2. Wanna Leave? Please input the word "end" alone + 3. Thanks, Hope you have fun in writing. > < + + Let's Start. GO + """ + +def read_diary(): + current_dir = os.getcwd() # 打印之前日志 + os.chdir(current_dir) + + for file in glob.glob("*.txt"): + print(file) + file_content = open(file, "r") + print file_content.read() + "\n" + +def write_diary(): + done = False + textInput = "" + + diary_name = raw_input("请输入日志名: ".encode(sys.stdout.encoding)) + ".txt" + diary_writer = open(diary_name, "w") + + while (done==False): + nextInput = raw_input("Please input your diary words: ") + if nextInput == "end": + inputDate = ask_date("Wanna add diary date time? yes or no! ") + diary_writer.write("\n" + inputDate) + break + else: + textInput += nextInput + "\n" + diary_writer.write(nextInput + "\n") + + diary_writer.close() + print ("Here is your " + inputDate +" diary: " + textInput) + +def ask_date(prompt): # 是否添加时间 + yes_list = ['yes', 'yep', 'ye', 'y', 'YES','YEP', 'YE', 'Y'] + no_list = ['no', 'n', 'NO', 'N'] + + ok = raw_input(prompt) + if ok in yes_list: + your_datetime = strftime("%Y-%m-%d %H:%M:%S", localtime()) + if ok in no_list: + your_datetime = "\n" + + return your_datetime + +if __name__ == '__main__': + main() \ No newline at end of file From 8d4646c0a3052f0ff3a845c0bf591d7db5f0608b Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Wed, 21 Oct 2015 17:05:38 +0800 Subject: [PATCH 026/432] list exercise --- _src/om2py0w/0wex0/aa.txt | 0 _src/om2py1w/1wd3/__init__.py | 0 _src/om2py1w/1wd3/list_test.py | 89 ++++++++++++++++++++++++++++++++++ _src/om2py1w/1wd3/main.py | 23 +++++++++ 4 files changed, 112 insertions(+) create mode 100644 _src/om2py0w/0wex0/aa.txt create mode 100644 _src/om2py1w/1wd3/__init__.py create mode 100644 _src/om2py1w/1wd3/list_test.py create mode 100644 _src/om2py1w/1wd3/main.py diff --git a/_src/om2py0w/0wex0/aa.txt b/_src/om2py0w/0wex0/aa.txt new file mode 100644 index 000000000..e69de29bb diff --git a/_src/om2py1w/1wd3/__init__.py b/_src/om2py1w/1wd3/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/_src/om2py1w/1wd3/list_test.py b/_src/om2py1w/1wd3/list_test.py new file mode 100644 index 000000000..08895b39a --- /dev/null +++ b/_src/om2py1w/1wd3/list_test.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +from collections import deque + +a = [1, 2 ,3 , 4] +x = [-1, 0] +a.append(x) # x is list so list x inside list a +print a +print a.index(x) +print a.pop() # removes and returns the last item in list a +print """ list.pop([i]) can returns the item + the square bracket denote the parameter + is opitional +""" + +print a +a.remove(4) +print a +print a.count(2) + +b = [-1, 0, 3, -3] +print "b:" + str(b) +b.sort() # sorted item +print "b.sort(): " + str(b) +b.reverse() # reverse +print "b.reverse(): " + str(b) +print "List objects and the method" +print """> method insert remove sort modify the list + and have no return value printed-- + they return the default None. + + list.insert + list.remove + list.sort + list.append + + + funny list! + cool ha! + """ + +print "-"*30 +print "## Using List as Stacks 堆客栈" +print "three peeple have lived in stack 客栈" +stack = [3, 4, 5] +print stack.append(6) +print "入客栈 订房 先订先住" +print "6 is the first " + str(stack.append(6)) +print "7 is the second" + str(stack.append(7)) +print stack + +print "出客栈 退房了 后订 先退" +print stack.pop() +print stack.pop() +print stack + +print "*"*30 +print "using lists as queues" +queue = deque(["Eric", "John", "Michael"]) +queue.append("Teery") +queue.append("Graham") +print queue.popleft() +print queue +print queue.popleft() +print queue + +queue = deque(['Eric', 'John', 'Michael']) +queue.append('Teery') +print queue +print "Dont care the "" or the '' in the list" + +print '*'*30 +print "Functional Programming Tools" + +def f(x): return x%3==0 or x%5==0 +def g(x): + if x%3==0 or x%5==0: + return g + +print filter(f, range(2, 25)) +print filter(g, range(2, 25)) + +print type(range(2,5)) + + + + + + + diff --git a/_src/om2py1w/1wd3/main.py b/_src/om2py1w/1wd3/main.py new file mode 100644 index 000000000..d5889a0f2 --- /dev/null +++ b/_src/om2py1w/1wd3/main.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +a = [1, 2 ,3 , 4] +x = [-1, 0] +a.append(x) # x is list so list x inside list a +print a +print a.index(x) +print a.pop() # removes and returns the last item in list a +print """ list.pop([i]) can returns the item + the square bracket denote the parameter + is opitional +""" + +print a +a.remove(4) +print a +print a.count(2) + +b = [-1, 0, 3, -3] +print "b:" + str(b) +b.sort() # sorted item +print "b.sort(): " + str(b) +b.reverse() # reverse +print "b.reverse(): " + str(b) \ No newline at end of file From 2f336bb0a689df84b1f0a2d1986e867fcd7d064b Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Wed, 21 Oct 2015 17:07:18 +0800 Subject: [PATCH 027/432] rename diary 2.0 --- _src/om2py0w/0wex0/{main_beta_2.py => diary_beta_2.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _src/om2py0w/0wex0/{main_beta_2.py => diary_beta_2.py} (100%) diff --git a/_src/om2py0w/0wex0/main_beta_2.py b/_src/om2py0w/0wex0/diary_beta_2.py similarity index 100% rename from _src/om2py0w/0wex0/main_beta_2.py rename to _src/om2py0w/0wex0/diary_beta_2.py From 754586edeacbcd94e3d13779409f156751a2f234 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Wed, 21 Oct 2015 17:10:40 +0800 Subject: [PATCH 028/432] readme mod --- _src/om2py0w/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_src/om2py0w/README.md b/_src/om2py0w/README.md index 4eed20426..167686605 100644 --- a/_src/om2py0w/README.md +++ b/_src/om2py0w/README.md @@ -2,7 +2,7 @@ - 系统 win7 - 命令行使用Powershell工具 -- python version 2.7.8 +- python version 2.7.10 ## 0w 日记交互系统 @@ -23,3 +23,5 @@ + shell中打开文件 `cat diary_name.txt` 会打印日志内容 + 演示 ![演示](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/05_readme_pre.JPG) +- [更新](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py0w/0wex0/diary_beta_2.py) +- [开发日志](https://jeremiahzhang.gitbooks.io/omooc2py/content/2nDev/week01_interact.html) From 075fd3587e10c741af3d5f30327a905d74baba07 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Wed, 21 Oct 2015 17:18:02 +0800 Subject: [PATCH 029/432] update diary 2.0 --- 2nDev/week01_interact.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/2nDev/week01_interact.md b/2nDev/week01_interact.md index cd7b25398..db68b7f05 100644 --- a/2nDev/week01_interact.md +++ b/2nDev/week01_interact.md @@ -1,6 +1,7 @@ # week_1 日志交互系统 -- [Latest code](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py0w/0wex0/main.py) +- [Diary_1.0](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py0w/0wex0/main.py) +- [Diary_2.0](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py0w/0wex0/diary_beta_2.py) - [使用说明](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py0w/README.md) ## 背景 ## @@ -245,6 +246,22 @@ win pshell 中调用 `python main.py 我 爱 Python` 果效: ![diarylog](https://raw.githubusercontent.com/JeremiahZhang/pybeginner/master/_image/03_all_done.JPG) +## 更新 ## + +- Diary_1.0 将以上个部分整合 并用function来调用 其中各个子功能 + - read_diary() + - write_diary() +- Diary_2.0 将脚本说明 使用 a multi-line docstring 形式 + + def my_function() + """Do nothing, but document it. + + No, really, it doesn't do anything. + """ + pass + + print my_function.__doc__ + ---------- ## 使用 ## From 0c87bb6b325d56acd00fe83dacfcd59b74066d88 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Wed, 21 Oct 2015 22:01:13 +0800 Subject: [PATCH 030/432] list --- SUMMARY.md | 2 + _src/om2py1w/1wd3/list_compre.py | 87 ++++++++++++++++++++++++++++++++ _src/om2py1w/1wd3/list_test.py | 20 ++++++++ 3 files changed, 109 insertions(+) create mode 100644 _src/om2py1w/1wd3/list_compre.py diff --git a/SUMMARY.md b/SUMMARY.md index 95ae7420d..f7d6fbbba 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -12,6 +12,8 @@ - [从源开始](1sTry/0wd1-reflection.md) - [Sth New](1sTry/0wd2-New-things-to-learn.md) - [苟日新](1sTry/0wd3-step-by-step-4_7-8.md) + - [week_1](1sTry/week_1.md) + - [Date Structures List](1sTry/1wd3_list.md) - [Learn by Doing](1tDoing/README.md) - [Python Package Install](1tDoing/MoudleInstall.md) - [迭代作品](2nDev/README.md) diff --git a/_src/om2py1w/1wd3/list_compre.py b/_src/om2py1w/1wd3/list_compre.py new file mode 100644 index 000000000..c004adc48 --- /dev/null +++ b/_src/om2py1w/1wd3/list_compre.py @@ -0,0 +1,87 @@ +# -8- coding: utf-8 -*- +from math import pi +print '*'*30 +print "List comprehensions" +squares = [] +for x in range(10): + squares.append(x**2) + +print squares + +squares = [x**2 for x in range(10)] +print squares + +squares = map(lambda x: x**2, range(10)) + +a = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y] +print a + +combs = [] +for x in [1, 2, 3]: + for y in [3, 1, 4]: + if x != y: + combs.append((x, y)) + + +print combs + +print "如果有嵌套的话 list 注意()使用" + +vec = [-4, -2, 0, 2, 4] +a = [x*2 for x in vec] +print a +b = [x for x in vec if x >= 0] +print b +c = [abs(x) for x in vec] +print c + +freshfruit = [' banana', ' loganberry', ' passion fruit ' ] +d = [weapon.strip() for weapon in freshfruit] +print d + +print """string.strip(s[, characters]) + + 1- Return a copy of the string with leading and trailing characters removed. + 2- If chars is omitted or None, whitespace characters are removed. + 3- If given and not None, chars must be a string; + the characters in the string will be stripped from the both ends of the string this method is called on. + + """ +e = [(x, x**2) for x in range(6)] +# e = [ x, x**2 for x in range(6)] is error +print e + +vec = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] +f = [num for elem in vec for num in elem] # 两层嵌套 list in list 相当于matrix +print f + +string_pi = [str(round(pi, i)) for i in range(1, 6)] +print string_pi + +matrix = [ + [1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12], +] + +sth = [[row[i] for row in matrix] for i in range(4)] # 从 i 循环先开始 +# row[i] in matrix +print sth + +equal_sth = [] +for i in range(4): + equal_sth.append([row[i] for row in matrix]) # 注意这里面的嵌套 + +print equal_sth + +equal_sth_2 = [] +for i in range(4): + equal_row = [] + for row in matrix: + equal_row.append(row[i]) + equal_sth_2.append(equal_row) + +print equal_sth_2 + +print zip(matrix) #zip 替代了上面的所有 +print zip(*matrix) \ No newline at end of file diff --git a/_src/om2py1w/1wd3/list_test.py b/_src/om2py1w/1wd3/list_test.py index 08895b39a..f66bd5d09 100644 --- a/_src/om2py1w/1wd3/list_test.py +++ b/_src/om2py1w/1wd3/list_test.py @@ -81,9 +81,29 @@ def g(x): print type(range(2,5)) +print '*'*30 +print "map(function, sequence)" +def cube(x): return x*x*x +a = map(cube, range(1, 11)) +print a +print '*'*30 +print "reduce(function, sequence)" +def add(x,y): return x+y +b = reduce(add, range(1, 11)) +print b + +print '*'*30 +print "a third argument can be passed to indicate the starting value" +def sum(seq): + def add(x,y): return x+y + return reduce(add, seq, 1) +c = sum(range(1, 11)) +print c +d = sum([]) +print d \ No newline at end of file From 6195b3c0739d291adecac2dc6ae67ffdea7bce79 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Wed, 21 Oct 2015 22:19:22 +0800 Subject: [PATCH 031/432] list new mod --- 1sTry/1wd3_list.md | 15 +++++++++++++++ 1sTry/week_1.md | 3 +++ 2 files changed, 18 insertions(+) create mode 100644 1sTry/1wd3_list.md create mode 100644 1sTry/week_1.md diff --git a/1sTry/1wd3_list.md b/1sTry/1wd3_list.md new file mode 100644 index 000000000..74e38ea36 --- /dev/null +++ b/1sTry/1wd3_list.md @@ -0,0 +1,15 @@ +# Date Structures List + +- list method +- 用于 + - 进出`客栈` + - `排队` 结合 `collenctions`模块的`deque` + - `函数工具` `filter(function, seque)`, `map(function, seque)`, `reduce(function, seque)` +- 更多理解 + - 直接用list 简化 一个循环赋值 + - `squares = [x**2 for x in range(10)]` + - 嵌套 注意主次 加() + - 矩阵表示 提取 + - zip() + +[代码1wd3]() \ No newline at end of file diff --git a/1sTry/week_1.md b/1sTry/week_1.md new file mode 100644 index 000000000..cf42690c1 --- /dev/null +++ b/1sTry/week_1.md @@ -0,0 +1,3 @@ +# week_1 + +1w练习 From 98c250a19433cbf1fbede985364c28852d66c73e Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Wed, 21 Oct 2015 22:24:57 +0800 Subject: [PATCH 032/432] book in list mod --- 1sTry/1wd3_list.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/1sTry/1wd3_list.md b/1sTry/1wd3_list.md index 74e38ea36..3df7121ff 100644 --- a/1sTry/1wd3_list.md +++ b/1sTry/1wd3_list.md @@ -11,5 +11,13 @@ - 嵌套 注意主次 加() - 矩阵表示 提取 - zip() +- PS `lambda` expression 相当于 一个函数 -[代码1wd3]() \ No newline at end of file +> the expression lambda arguments: expression yields a function object. + + lambda_expr ::= "lambda" [parameter_list]: expression + + def name(arguments): + return expression + +[代码1wd3](https://github.com/JeremiahZhang/OMOOC2py/tree/master/_src/om2py1w/1wd3) \ No newline at end of file From ccbe2a1a593845addf073472b64019627dce45bd Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Wed, 21 Oct 2015 22:29:03 +0800 Subject: [PATCH 033/432] transfer daily log --- SUMMARY.md | 1 - {1sTry => _src/om2py1w}/1wd3_list.md | 0 2 files changed, 1 deletion(-) rename {1sTry => _src/om2py1w}/1wd3_list.md (100%) diff --git a/SUMMARY.md b/SUMMARY.md index f7d6fbbba..b98a4aa83 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -13,7 +13,6 @@ - [Sth New](1sTry/0wd2-New-things-to-learn.md) - [苟日新](1sTry/0wd3-step-by-step-4_7-8.md) - [week_1](1sTry/week_1.md) - - [Date Structures List](1sTry/1wd3_list.md) - [Learn by Doing](1tDoing/README.md) - [Python Package Install](1tDoing/MoudleInstall.md) - [迭代作品](2nDev/README.md) diff --git a/1sTry/1wd3_list.md b/_src/om2py1w/1wd3_list.md similarity index 100% rename from 1sTry/1wd3_list.md rename to _src/om2py1w/1wd3_list.md From 3619d339b4655cd0493620717782fd9ffb7e676b Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Thu, 22 Oct 2015 14:57:04 +0800 Subject: [PATCH 034/432] tuple and set test --- 0MOOC/learngit.md | 26 +++++++++++++++- _src/om2py1w/1wd4/sets_test.py | 27 +++++++++++++++++ _src/om2py1w/1wd4/tuple_test.py | 54 +++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 _src/om2py1w/1wd4/sets_test.py create mode 100644 _src/om2py1w/1wd4/tuple_test.py diff --git a/0MOOC/learngit.md b/0MOOC/learngit.md index ead83a9af..130d04156 100644 --- a/0MOOC/learngit.md +++ b/0MOOC/learngit.md @@ -10,6 +10,7 @@ + Tag标签 commit + branch 分支 - 小技巧 +- Quick setup from Github ## Version Control ## @@ -192,6 +193,29 @@ Git是一个免费且开源的[分布式版本控制系统](https://git-scm.com/ ---------- -10/20/2015 +## Quick setup from Github ## + +> create a new repository on the command line + + echo # test >> README.md + git init + git add README.md + git commit -m "first commit" + git remote add origin git@github.com:JeremiahZhang/test.git + git push -u origin master + +> push an existing repository from the command line + + git remote add origin git@github.com:JeremiahZhang/test.git + git push -u origin master + +> import code from another repository + +You can initialize this repository with code from a Subversion, Mercurial, or TFS project. + +当在Github上创建好一个Repo 就有4个提示 视而不见的后果就会造成很多弯路 花很多笨功夫 之前学习的时候 看这别人的教程 却忽略元知识 笨功夫啊 + +10/20/2015 +10/22/2015 diff --git a/_src/om2py1w/1wd4/sets_test.py b/_src/om2py1w/1wd4/sets_test.py new file mode 100644 index 000000000..a30907234 --- /dev/null +++ b/_src/om2py1w/1wd4/sets_test.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +import math +# sets have no duplicate elements, USE in +# - membership testing +# - eliminating duplicate entries. +# set() +# set(list) + +basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] +fruit = set(basket) # no duplicate +print fruit +print 'orange' in fruit +print 'berry' in fruit + +apple = set('appleappleappleapple') +bear = set('bearbearbear') +print apple +print bear + +print apple - bear + +print apple|bear +print apple&bear +print apple^bear + +a = {x for x in 'apple' if x not in "bear"} +print a \ No newline at end of file diff --git a/_src/om2py1w/1wd4/tuple_test.py b/_src/om2py1w/1wd4/tuple_test.py new file mode 100644 index 000000000..833ae507d --- /dev/null +++ b/_src/om2py1w/1wd4/tuple_test.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +a = [-1, 1, 66.25, 333, 333, 1234.5] +print a.count(333) + +del a[0] +print a + +a.pop() +print a + +del a[:1] +print a +del a + +t = 12345, 54321, 'hello!' +print t + +u = t, (1, 2, 3, 4, 5) +print u + +a = [t, (1, 2, 3, 4, 5)] +print a # tuples in list + +# tuples are immutables + +s = [1, 2, 3] # but lists are mutable like this +s[0] = 4 +print s + +# but tuples can contain mutable object +list1 = [1, 2, 3] +list2 = [3, 2, 1] + +v = (list1, list2) +print v + +empty = () +print len(empty) + +singleton = "hello", # tuple +print len(singleton) +print singleton + +singleton = "hello" # string +print len(singleton) +print singleton + +cool = "i", "love", "python!" +print cool +x = "i" +y = "love" +z = "python!" +x, y, z = cool +print cool # cool is the same as above \ No newline at end of file From 6d6b3febef576653c6a8b718827b828008b8a78f Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Thu, 22 Oct 2015 16:34:56 +0800 Subject: [PATCH 035/432] today's code --- _src/om2py1w/1wd4/dict_test.py | 28 ++++++++++++++++++++++++ _src/om2py1w/1wd4/loop_test.py | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 _src/om2py1w/1wd4/dict_test.py create mode 100644 _src/om2py1w/1wd4/loop_test.py diff --git a/_src/om2py1w/1wd4/dict_test.py b/_src/om2py1w/1wd4/dict_test.py new file mode 100644 index 000000000..c14fe1566 --- /dev/null +++ b/_src/om2py1w/1wd4/dict_test.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# dicts are index by keys, +# are not like sequence indexed by numbers +# what +# - keys in dict are immutable +# - 字符和数字都可使是keys +# - 包括字符or数字ortuple的tuple也可使是keys +# - 但是若tuple包含mutable object 则不可以用作 keys +# - 所以 list 是不能用作 key的 +# - 配对的 男:女 +# - 如果后面添加keys 存在了 则会覆盖掉(遗忘以前的) +# .... +# keys() +# sorted() 排序 + +tel = {'jack':137, "sape":9801} +tel['guido'] = 9366 +print tel +print tel["jack"] + +del tel['sape'] +print tel +print tel.keys() + +dict([('jeremy', 13798019366), ('jesus', 5201314)]) +print dict +print {x:x**2 for x in (2, 4, 6)} +dict(jeremy=13798019366, jesus=5201314) \ No newline at end of file diff --git a/_src/om2py1w/1wd4/loop_test.py b/_src/om2py1w/1wd4/loop_test.py new file mode 100644 index 000000000..0166781ae --- /dev/null +++ b/_src/om2py1w/1wd4/loop_test.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# 枚举 enumerate() +import math +for i, v in enumerate(['tic', 'tac', 'toe']): + print i, v + +questions = ['name', 'quest', 'fav color'] +answers = ['jesus', 'the holy father', 'red'] +for q, a in zip(questions, answers): + print 'what is your {0}? Its {1}.'.format(q, a) # 配对输出 nice + +for i in reversed(xrange(1,10,2)): + print i + +basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] +for f in sorted(set(basket)): + print f + +bible = {'lord': 'jesus', 'saint': 'paul'} +for b, v in bible.iteritems(): + print b, v + +raw_data =[56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8] +filtered_data = [] +for value in raw_data: + if not math.isnan(value): + filtered_data.append(value) + +print filtered_data + +# in # not in check out the values +# is # is not check out the object +# compares + +print (1, 2, 3) < (1, 2, 4) +print [1, 2, 3] < [1, 2, 4] +print "ABC" < "C" < "Pascal" < 'python' +print (1, 2, 3, 4) < (1, 2, 4) +print (1, 2, ('aa', 'ab')) < (1, 2, ("abc", 'a')) \ No newline at end of file From e990177cb851ff014ca90ad645028240bc62ca86 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Thu, 22 Oct 2015 20:43:21 +0800 Subject: [PATCH 036/432] update --- 1sTry/0wd1-reflection.md | 6 +++--- 1sTry/0wd2-New-things-to-learn.md | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/1sTry/0wd1-reflection.md b/1sTry/0wd1-reflection.md index dae787ccf..2542f60a2 100644 --- a/1sTry/0wd1-reflection.md +++ b/1sTry/0wd1-reflection.md @@ -15,13 +15,13 @@ + 挑战级别2颗星 和昨天的那个 show me the code 0000 题相比 + 大多数在那42行代码中运行到了 只是在填充数 构建python结构框架 + 接下来 - - [] py tutorial + - [x] py tutorial - [x] statements `if` `for` `break` `continue` `pass` - [x] `else` clauses On Loops - [x] `range()` function - - [] `def` function + - [x] `def` function - argument - - [] coding style + - [x] coding style - [] 完成简单工程行为 代码:[https://github.com/JeremiahZhang/pybeginner/tree/master/_src/om2py0w/0wex2](https://github.com/JeremiahZhang/pybeginner/tree/master/_src/om2py0w/0wex2) diff --git a/1sTry/0wd2-New-things-to-learn.md b/1sTry/0wd2-New-things-to-learn.md index 5b1ca20f2..89f0ed5c4 100644 --- a/1sTry/0wd2-New-things-to-learn.md +++ b/1sTry/0wd2-New-things-to-learn.md @@ -55,12 +55,12 @@ ## Next## -- [] dictionary dive in 官方help and [问题](http://stackoverflow.com/questions/17677523/python-keyword-output-interpretation) -- [] 4.7.3 Arbitrary Argument Lists -- [] 4.7.4 Unpacking Argument Lists -- [] 4.7.5. Lambda Expressions -- [] 4.7.6. Documentation Strings -- [] 4.8 Intermezzo: Coding Style +- [x] dictionary dive in 官方help and [问题](http://stackoverflow.com/questions/17677523/python-keyword-output-interpretation) +- [x] 4.7.3 Arbitrary Argument Lists +- [x] 4.7.4 Unpacking Argument Lists +- [x] 4.7.5. Lambda Expressions +- [x] 4.7.6. Documentation Strings +- [x] 4.8 Intermezzo: Coding Style ---------- From 83b3631aaaba0c22014c633ec4e69e02d9500613 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Thu, 22 Oct 2015 20:55:47 +0800 Subject: [PATCH 037/432] 1wd4 --- _src/om2py1w/1wd4_del_tuple_set_dict_loops.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 _src/om2py1w/1wd4_del_tuple_set_dict_loops.md diff --git a/_src/om2py1w/1wd4_del_tuple_set_dict_loops.md b/_src/om2py1w/1wd4_del_tuple_set_dict_loops.md new file mode 100644 index 000000000..538c7dce1 --- /dev/null +++ b/_src/om2py1w/1wd4_del_tuple_set_dict_loops.md @@ -0,0 +1,11 @@ +# Data Stracture # + +Python tutorial 5.2-5.8 + +- del statement +- tuples and sequences +- sets +- dictionaries +- Looping Tech +- Conditions +- Comparing Sequences and Other Types \ No newline at end of file From 2b75f01e081f551607e286d85dfd57f7d45791ae Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Thu, 22 Oct 2015 22:26:38 +0800 Subject: [PATCH 038/432] auto login src --- _src/om2py1w/try_auto_login.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 _src/om2py1w/try_auto_login.md diff --git a/_src/om2py1w/try_auto_login.md b/_src/om2py1w/try_auto_login.md new file mode 100644 index 000000000..1051b4831 --- /dev/null +++ b/_src/om2py1w/try_auto_login.md @@ -0,0 +1,27 @@ +# 自动登录网页 # + +## 背景 ## + +- 实际需求:微信公众号网页每次登录需要密码 没有记住密码功能 +- 想着写个脚本 调用 可自动登录 + +## 想法 ## + +- 1.open the website through webbrowser like FireFox and Chrome +- 2.input user_name and password in python script to login the website + +## 尝试 ## + +- google到 twill 模块 [http://twill.idyll.org/](http://twill.idyll.org/) 发现花了笨功夫 + - 没有仔细阅读twill文档 (笨功夫 需谨慎) +> twill is a simple language that allows users to browse the Web from a command-line interface. + +- then 在stackoverflow上又有说requests模块 + - 简单浏览 requests 文档 也不是我所理想的[http://docs.python-requests.org/en/latest/#testimonials](http://docs.python-requests.org/en/latest/#testimonials) +- 发现姿势不对 + - then re-search got this [https://www.google.co.jp/search?q=open+browser+auto+login+python&ie=utf-8&oe=utf-8&gws_rd=cr&ei=U-EoVuTWJ4PpmAXo3IOADg](https://www.google.co.jp/search?q=open+browser+auto+login+python&ie=utf-8&oe=utf-8&gws_rd=cr&ei=U-EoVuTWJ4PpmAXo3IOADg) + - got Selenium Client Driver [http://selenium-python.readthedocs.org/installation.html](http://selenium-python.readthedocs.org/installation.html) + - [PiPY](https://pypi.python.org/pypi/selenium) + +### 探索-开始挖硒 ### + From bd2296be85aaeb56aa5185922ceab779160f29aa Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Fri, 23 Oct 2015 15:28:38 +0800 Subject: [PATCH 039/432] auto login webpage --- 1tDoing/01Gowechat.md | 187 ++++++++++++++++++ SUMMARY.md | 1 + _src/om2py1w/1wd5autologin/ex01.py | 15 ++ _src/om2py1w/1wd5autologin/go_facebook.py | 27 +++ _src/om2py1w/1wd5autologin/go_google.py | 27 +++ _src/om2py1w/1wd5autologin/go_wechat.py | 22 +++ .../1wd5autologin/python_org_search.py | 13 ++ _src/om2py1w/try_auto_login.md | 27 --- 8 files changed, 292 insertions(+), 27 deletions(-) create mode 100644 1tDoing/01Gowechat.md create mode 100644 _src/om2py1w/1wd5autologin/ex01.py create mode 100644 _src/om2py1w/1wd5autologin/go_facebook.py create mode 100644 _src/om2py1w/1wd5autologin/go_google.py create mode 100644 _src/om2py1w/1wd5autologin/go_wechat.py create mode 100644 _src/om2py1w/1wd5autologin/python_org_search.py delete mode 100644 _src/om2py1w/try_auto_login.md diff --git a/1tDoing/01Gowechat.md b/1tDoing/01Gowechat.md new file mode 100644 index 000000000..15db4ada6 --- /dev/null +++ b/1tDoing/01Gowechat.md @@ -0,0 +1,187 @@ +# 自动登录网页 # + +## 背景 ## + +- 实际需求:微信公众号网页每次登录需要密码 没有记住密码功能 +- 想着写个脚本 调用 可自动登录 + +## 想法 ## + +- 1.open the website through webbrowser like FireFox and Chrome +- 2.input user_name and password in python script to login the website + +## 尝试 ## + +- google到 twill 模块 [http://twill.idyll.org/](http://twill.idyll.org/) 发现花了笨功夫 + - 没有仔细阅读twill文档 (笨功夫 需谨慎) +> twill is a simple language that allows users to browse the Web from a command-line interface. + +- then 在stackoverflow上又有说requests模块 + - 简单浏览 requests 文档 也不是我所理想的[http://docs.python-requests.org/en/latest/#testimonials](http://docs.python-requests.org/en/latest/#testimonials) +- 发现姿势不对 + - then re-search got this [https://www.google.co.jp/search?q=open+browser+auto+login+python&ie=utf-8&oe=utf-8&gws_rd=cr&ei=U-EoVuTWJ4PpmAXo3IOADg](https://www.google.co.jp/search?q=open+browser+auto+login+python&ie=utf-8&oe=utf-8&gws_rd=cr&ei=U-EoVuTWJ4PpmAXo3IOADg) + - got Selenium Client Driver [http://selenium-python.readthedocs.org/installation.html](http://selenium-python.readthedocs.org/installation.html) + - [PiPY](https://pypi.python.org/pypi/selenium) + +## 探索-开始挖硒 ## + +- **安装** 因为在神奇的win 所以只能下载在本地目录 在本地目录使用 + + python setup.py install +安装好库之后就开始实践了 + +### **实践-1 自动打开浏览器 进行google搜索** ### + +代码: go_google.py + + # -*- coding: utf-8 _*- + from selenium import webdriver + from selenium.webdriver.common.keys import Keys + + print """ Example 1: + ========== + + * open a new Firefox browser + * load the google homepage + * search for "github" + """ + + browser = webdriver.Firefox() # 打开火狐浏览器 + browser.get("http://www.google.com") # 打开url网页链接 + assert 'Google' in browser.title # 确认是Google + + elem = browser.find_element_by_name('q') # 找到搜素栏 name = "q" 在google网页源码的 search field + elem.send_keys('github' + Keys.RETURN) # 在搜索栏中输入输入关键字github后 执行搜索 Keys 相当于键盘keyboard + # The Keys class provide keys in the keyboard like RETURN, F1, ALT etc. +执行: 在shell中 + + python go_google.py + +效果: +1.自动打开Firefox浏览器 +2.进入google主页 +3.自动键入关键字 gihub +4.跳到搜索结果 + +OK 这个你可以拓展下 +1.你可以输入外部数据 python go_google.py keyword01 keyword02 +2.....你可以继续构思呢 + + +### 实践-2 登录facebook ### + +代码:go_facebook.py + + # -*- coding: utf-8 _*- + from selenium import webdriver # 导入模块 + from selenium.webdriver.support import ui + from selenium.webdriver.common.keys import Keys + + def page_is_loaded(driver): # 测试 网页是否加载好了 + return driver.find_element_by_tag_name("body") != None + + driver = webdriver.Firefox() # 启动FireFox浏览器 + driver.get("https://facebook.com/") # 浏览器进入facebook页面 + + wait = ui.WebDriverWait(driver, 10) # 等待网页加载完毕 + wait.until(page_is_loaded) + + email_field = driver.find_element_by_id("email") # 找到facebook登录帐号栏 + email_field.send_keys("user_email@email.com") # 键入 user_email + + password_field = driver.find_element_by_id("pass") # 找到facebook密码输入栏 + password_field.send_keys("your_password") # 键入 your password + password_field.send_keys(Keys.RETURN) # enter 确认 +shell 执行 + + python go_facebook.py +效果: +1- 打开Firefox并 +2- 转到Fackbook页面 +3- 自动登录 facebook + +### 实践3-登录微信公众号 ### + +从上面facebook的例子 我可以解决我最初自动登录微信公众号的问题了 + +- 将 go_facebook.py 中的代码 改个url链接 + + driver.get("https://mp.weixin.qq.com/") + +- 改下email与password +- 但是你得注意 需要根据 [https://mp.weixin.qq.com/](https://mp.weixin.qq.com/) 网页源码 修改` email_field = driver.find_element_by_id("email")` `password_field = driver.find_element_by_id("pass")`这两处 + - 如何看网页源代码?你需要右击鼠标 点击`查看网页源代码` + - 你需要确定 网页 `账户输入栏`的 `id` 与 `密码输入栏` 的 `id` 如在微信公众号网页源码中 你可以找到登录的源码 + +

+其中 账户输入栏 部分源码: + + +其中 id="account" +所以 改 email_field = driver.find_element_by_id("account") + +同理 密码输入栏 部分源码: + + + +改 password_field = driver.find_element_by_id("pwd") + +经过修改之后 代码在此 go_wechat.py (只要修改一下你的账户与密码)执行 可自动登录 + +这回你只要用shell调用 go_wechat.py脚本就可以自动微信公众号了 再也不用每次都要输入密码了 真cool + +## 总 + +- 发现了真的什么是笨功夫了 在最初探索的时候 在twill上 因为没有认真看文档 漏了一个关键 就直接白花了近2个小时的时间 +- 想法 尽量用英文 然后关键字 search +- 还可以继续 比如登入芝麻星 + - 登录芝麻星 [http://beta.iomooc.com/](http://beta.iomooc.com/) 也是够烦的了 + + 连接github 每次都显示白板 + 一行代码 然后刷新才能登录 + - 嗯 这回可以自动登录了 + - 这个已经解决 你只要注册账户 + - 简单修改脚本并调用 + - 如何不注册账户 + - 自动连接github + - 登入 + - 这个你该如何解决呢? + +10/23/2015 diff --git a/SUMMARY.md b/SUMMARY.md index b98a4aa83..c7366fa10 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -15,6 +15,7 @@ - [week_1](1sTry/week_1.md) - [Learn by Doing](1tDoing/README.md) - [Python Package Install](1tDoing/MoudleInstall.md) + - [自动登录网页](1tDoing/01Gowechat.md) - [迭代作品](2nDev/README.md) - [week_1_交互](2nDev/week01_interact.md) - [人生首秀](3rDemo/README.md) diff --git a/_src/om2py1w/1wd5autologin/ex01.py b/_src/om2py1w/1wd5autologin/ex01.py new file mode 100644 index 000000000..05ed146f3 --- /dev/null +++ b/_src/om2py1w/1wd5autologin/ex01.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 _*- +from selenium import webdriver + + +print """ # function: + + 1- open a new Firefox browser + 2- load the webpage at the given URL + + HAVE FUN + +""" + +browser = webdriver.Firefox() +browser.get("http://seleniumhq.org/") \ No newline at end of file diff --git a/_src/om2py1w/1wd5autologin/go_facebook.py b/_src/om2py1w/1wd5autologin/go_facebook.py new file mode 100644 index 000000000..a91bdb64c --- /dev/null +++ b/_src/om2py1w/1wd5autologin/go_facebook.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 _*- +from selenium import webdriver +from selenium.webdriver.support import ui +from selenium.webdriver.common.keys import Keys + +def page_is_loaded(driver): + return driver.find_element_by_tag_name("body") != None + +driver = webdriver.Firefox() +driver.get("https://facebook.com/") + +wait = ui.WebDriverWait(driver, 10) +wait.until(page_is_loaded) + +email_field = driver.find_element_by_id("email") +email_field.send_keys("user_email@email.com") # user_email + +password_field = driver.find_element_by_id("pass") +password_field.send_keys("your_password") # your password +password_field.send_keys(Keys.RETURN) + +print """Mission Completed! + + Find your new things in Facebook! + + See you later! + " \ No newline at end of file diff --git a/_src/om2py1w/1wd5autologin/go_google.py b/_src/om2py1w/1wd5autologin/go_google.py new file mode 100644 index 000000000..35ddbbf1c --- /dev/null +++ b/_src/om2py1w/1wd5autologin/go_google.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 _*- +from selenium import webdriver +from selenium.webdriver.common.keys import Keys + +print """ Example 1: + ========== + + * open a new Firefox browser + * load the google homepage + * search for "github" + * close the browser + +""" + +browser = webdriver.Firefox() # open your firefox browser + +browser.get("http://www.google.com") # go to google webpage +assert 'Google' in browser.title # confirm that title has “Google” word in it + +# browser.get("http://www.google.com") +# assert 'google' in browser.title + +elem = browser.find_element_by_name('q') # name = "q" is in the search field of the google webpage source code +elem.send_keys('github' + Keys.RETURN) # search keyword Keys.RETURN like keyboard enter or Go +print "Mission Completed!" + +# browser.quit() \ No newline at end of file diff --git a/_src/om2py1w/1wd5autologin/go_wechat.py b/_src/om2py1w/1wd5autologin/go_wechat.py new file mode 100644 index 000000000..7f42c4cc1 --- /dev/null +++ b/_src/om2py1w/1wd5autologin/go_wechat.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 _*- +from selenium import webdriver +from selenium.webdriver.support import ui +from selenium.webdriver.common.keys import Keys + +def page_is_loaded(driver): + return driver.find_element_by_tag_name("body") != None + +driver = webdriver.Firefox() +driver.get('https://mp.weixin.qq.com/') + +wait = ui.WebDriverWait(driver, 10) +wait.until(page_is_loaded) + +wechat_account = driver.find_element_by_id("account") +wechat_account.send_keys("user@email.com") # input your email address or your wechat account + +your_password = driver.find_element_by_id("pwd") +your_password.send_keys("balabalabala") # your password instead of balabalabala +your_password.send_keys(Keys.RETURN) + +print "Mission Completed! Write your new article.-->" \ No newline at end of file diff --git a/_src/om2py1w/1wd5autologin/python_org_search.py b/_src/om2py1w/1wd5autologin/python_org_search.py new file mode 100644 index 000000000..e0af67a7f --- /dev/null +++ b/_src/om2py1w/1wd5autologin/python_org_search.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +from selenium import webdriver +from selenium.webdriver.common.keys import Keys + +driver = webdriver.Firefox() +driver.get("http://www.python.org") +assert "Python" in driver.title + +elem = driver.find_element_by_name("q") +elem.send_keys("pycon") +elem.send_keys(Keys.RETURN) +assert "No results found." not in driver.page_source +driver.close() \ No newline at end of file diff --git a/_src/om2py1w/try_auto_login.md b/_src/om2py1w/try_auto_login.md deleted file mode 100644 index 1051b4831..000000000 --- a/_src/om2py1w/try_auto_login.md +++ /dev/null @@ -1,27 +0,0 @@ -# 自动登录网页 # - -## 背景 ## - -- 实际需求:微信公众号网页每次登录需要密码 没有记住密码功能 -- 想着写个脚本 调用 可自动登录 - -## 想法 ## - -- 1.open the website through webbrowser like FireFox and Chrome -- 2.input user_name and password in python script to login the website - -## 尝试 ## - -- google到 twill 模块 [http://twill.idyll.org/](http://twill.idyll.org/) 发现花了笨功夫 - - 没有仔细阅读twill文档 (笨功夫 需谨慎) -> twill is a simple language that allows users to browse the Web from a command-line interface. - -- then 在stackoverflow上又有说requests模块 - - 简单浏览 requests 文档 也不是我所理想的[http://docs.python-requests.org/en/latest/#testimonials](http://docs.python-requests.org/en/latest/#testimonials) -- 发现姿势不对 - - then re-search got this [https://www.google.co.jp/search?q=open+browser+auto+login+python&ie=utf-8&oe=utf-8&gws_rd=cr&ei=U-EoVuTWJ4PpmAXo3IOADg](https://www.google.co.jp/search?q=open+browser+auto+login+python&ie=utf-8&oe=utf-8&gws_rd=cr&ei=U-EoVuTWJ4PpmAXo3IOADg) - - got Selenium Client Driver [http://selenium-python.readthedocs.org/installation.html](http://selenium-python.readthedocs.org/installation.html) - - [PiPY](https://pypi.python.org/pypi/selenium) - -### 探索-开始挖硒 ### - From 689a83da28e3f64151088083daf55565955b5709 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Fri, 23 Oct 2015 15:33:15 +0800 Subject: [PATCH 040/432] link code --- 1tDoing/01Gowechat.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1tDoing/01Gowechat.md b/1tDoing/01Gowechat.md index 15db4ada6..09c95327a 100644 --- a/1tDoing/01Gowechat.md +++ b/1tDoing/01Gowechat.md @@ -32,7 +32,7 @@ ### **实践-1 自动打开浏览器 进行google搜索** ### -代码: go_google.py +代码: [go_google.py](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py1w/1wd5autologin/go_google.py) # -*- coding: utf-8 _*- from selenium import webdriver @@ -70,7 +70,7 @@ OK 这个你可以拓展下 ### 实践-2 登录facebook ### -代码:go_facebook.py +代码:[go_facebook.py](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py1w/1wd5autologin/go_facebook.py) # -*- coding: utf-8 _*- from selenium import webdriver # 导入模块 @@ -165,7 +165,7 @@ shell 执行 改 password_field = driver.find_element_by_id("pwd") -经过修改之后 代码在此 go_wechat.py (只要修改一下你的账户与密码)执行 可自动登录 +经过修改之后 你可以参见代码 [go_wechat.py](https://github.com/JeremiahZhang/OMOOC2py/blob/master/_src/om2py1w/1wd5autologin/go_wechat.py)(只要修改一下你的账户与密码)执行 可自动登录 这回你只要用shell调用 go_wechat.py脚本就可以自动微信公众号了 再也不用每次都要输入密码了 真cool From a3863ec45fcc151394d9c33f618916f87eea85fe Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Fri, 23 Oct 2015 15:49:46 +0800 Subject: [PATCH 041/432] mod --- 1tDoing/01Gowechat.md | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/1tDoing/01Gowechat.md b/1tDoing/01Gowechat.md index 09c95327a..d1ba1f5ff 100644 --- a/1tDoing/01Gowechat.md +++ b/1tDoing/01Gowechat.md @@ -5,11 +5,15 @@ - 实际需求:微信公众号网页每次登录需要密码 没有记住密码功能 - 想着写个脚本 调用 可自动登录 +---------- + ## 想法 ## - 1.open the website through webbrowser like FireFox and Chrome - 2.input user_name and password in python script to login the website +---------- + ## 尝试 ## - google到 twill 模块 [http://twill.idyll.org/](http://twill.idyll.org/) 发现花了笨功夫 @@ -23,6 +27,8 @@ - got Selenium Client Driver [http://selenium-python.readthedocs.org/installation.html](http://selenium-python.readthedocs.org/installation.html) - [PiPY](https://pypi.python.org/pypi/selenium) +---------- + ## 探索-开始挖硒 ## - **安装** 因为在神奇的win 所以只能下载在本地目录 在本地目录使用 @@ -97,7 +103,7 @@ shell 执行 python go_facebook.py 效果: 1- 打开Firefox并 -2- 转到Fackbook页面 +2- 转到Fackbook页面 3- 自动登录 facebook ### 实践3-登录微信公众号 ### @@ -147,33 +153,44 @@ shell 执行 -其中 账户输入栏 部分源码: +其中 `账户输入栏` 部分源码: - From 518975e85e868f3b7b74e390ea913fdf47ec6af7 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Sat, 12 Dec 2015 15:13:55 +0800 Subject: [PATCH 430/432] note 8wd6 --- _src/om2pyItem/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_src/om2pyItem/README.md b/_src/om2pyItem/README.md index 87d0f5334..4766babac 100644 --- a/_src/om2pyItem/README.md +++ b/_src/om2pyItem/README.md @@ -37,7 +37,7 @@ - [x] 页面的 layout html - [x] 添加图片 - [x] 实现图片添加功能 - - [] 添加图片的显示 + - [x] 添加图片的显示 - [] 保存功能 截图 > 这里面思路是 使用jinja2 使用父模板和子模板 来实现 现在 就是在攻克这个问题:(在这里卡壳了 技术还不够) @@ -93,6 +93,10 @@ - [] HTML 和 CSS 美化 这个可以挪到最后 恩 - [] 退出和保存 - [] 保存截图 + - [X] 确定 [PILLOW](https://pillow.readthedocs.org/en/3.0.x/handbook/tutorial.html) + - [] 功能实现 + - [] layout save button + - [] 截图 route 并返回 index html 页面 ## 8-10w From 4ec83bee05b6a8e433993c480cdace7d3ba66f96 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Thu, 21 Jan 2016 11:40:55 +0800 Subject: [PATCH 431/432] review 0w --- 5Review/0w.md | 37 +++++++++++++++++++++++++++++++++++++ 5Review/10w.md | 1 + 5Review/1w.md | 1 + 5Review/2w.md | 1 + 5Review/3w.md | 1 + 5Review/4w.md | 1 + 5Review/5w.md | 1 + 5Review/6w.md | 1 + 5Review/7w.md | 1 + 5Review/8w.md | 1 + 5Review/9w.md | 1 + 5Review/README.md | 16 ++++++++++++++++ SUMMARY.md | 12 ++++++++++++ fabfile.py | 17 +++++++++++++++++ 14 files changed, 92 insertions(+) create mode 100644 5Review/0w.md create mode 100644 5Review/10w.md create mode 100644 5Review/1w.md create mode 100644 5Review/2w.md create mode 100644 5Review/3w.md create mode 100644 5Review/4w.md create mode 100644 5Review/5w.md create mode 100644 5Review/6w.md create mode 100644 5Review/7w.md create mode 100644 5Review/8w.md create mode 100644 5Review/9w.md create mode 100644 5Review/README.md create mode 100644 fabfile.py diff --git a/5Review/0w.md b/5Review/0w.md new file mode 100644 index 000000000..88196a2c9 --- /dev/null +++ b/5Review/0w.md @@ -0,0 +1,37 @@ +# 0w + +来到 week 0 jump into python programming + +## 3点 + +> Python 是拿来用的 +初级知识 需要对高级知识深入了解才能真正深入了解 + +编程是在表述web的世界,python 作为一种编程语言,就是用来表述这个web世界的。python不用学,要去用,全身心**沉浸**。在用的过程中累积自己的经验,别人想夺也夺不走。这个学习过程是螺旋式上升的过程。 + +所以開智的编程课,是每周一个任务来让我去习得编程思维,虽然课程已经结束,已经形成一种用的思维,算是一种实用主义来习得编程思维。 + +> 以最小代价解决问题 + +大妈以自己的工程师经验告诉:不求完美解决问题,乃是及格或者是42%,并且是以最小代价的方式。 +在我的课程经历中,发现自己会下意识的去完美解决问题,这个开头就**忽视**和没有明白**以最小代价解决问题**啊! + +> 最大的错误: +1- 花了太多时间学习那些**不是特别需要**的东西上 +2- 没有**立即**开始写代码 + +web的世界中,别人有时候是为了炫耀,将一堆不是特别需要的资料放在那里,不要迷失在这些东西上。立即开始写代码! + +## 改进 + +1. 避免最大错误,**立即**开始写代码![ImgBookNote](https://github.com/JeremiahZhang/ImgBookNote) +2. 最小代价解决问题 + + 60% 不求完美先 + - 参考 aJie 童鞋的 [问题的问题](https://ajiea.gitbooks.io/miss-python-and-the-holy-geeks/content/2015-11-29.html) +3. 其他如**立即**开始写论文 + +Thursday, 21. January 2016 11:35AM + + + + diff --git a/5Review/10w.md b/5Review/10w.md new file mode 100644 index 000000000..97697f017 --- /dev/null +++ b/5Review/10w.md @@ -0,0 +1 @@ +# 10w diff --git a/5Review/1w.md b/5Review/1w.md new file mode 100644 index 000000000..3a8c5831d --- /dev/null +++ b/5Review/1w.md @@ -0,0 +1 @@ +# 1w diff --git a/5Review/2w.md b/5Review/2w.md new file mode 100644 index 000000000..a8720ee93 --- /dev/null +++ b/5Review/2w.md @@ -0,0 +1 @@ +# 2w diff --git a/5Review/3w.md b/5Review/3w.md new file mode 100644 index 000000000..fc3bc9ab2 --- /dev/null +++ b/5Review/3w.md @@ -0,0 +1 @@ +# 3w diff --git a/5Review/4w.md b/5Review/4w.md new file mode 100644 index 000000000..45bd6a0f4 --- /dev/null +++ b/5Review/4w.md @@ -0,0 +1 @@ +# 4w diff --git a/5Review/5w.md b/5Review/5w.md new file mode 100644 index 000000000..405c08bc4 --- /dev/null +++ b/5Review/5w.md @@ -0,0 +1 @@ +# 5w diff --git a/5Review/6w.md b/5Review/6w.md new file mode 100644 index 000000000..b439dcec0 --- /dev/null +++ b/5Review/6w.md @@ -0,0 +1 @@ +# 6w diff --git a/5Review/7w.md b/5Review/7w.md new file mode 100644 index 000000000..d401f1689 --- /dev/null +++ b/5Review/7w.md @@ -0,0 +1 @@ +# 7w diff --git a/5Review/8w.md b/5Review/8w.md new file mode 100644 index 000000000..749f09e39 --- /dev/null +++ b/5Review/8w.md @@ -0,0 +1 @@ +# 8w diff --git a/5Review/9w.md b/5Review/9w.md new file mode 100644 index 000000000..764a45e11 --- /dev/null +++ b/5Review/9w.md @@ -0,0 +1 @@ +# 9w diff --git a/5Review/README.md b/5Review/README.md new file mode 100644 index 000000000..73eb204a6 --- /dev/null +++ b/5Review/README.md @@ -0,0 +1,16 @@ +# Review + +## 缘起 + +開智PY2编程课早就已经结束,虽然自己最后的项目没有做好,但一路走过来,有自己的课程记录gitbook,还有大妈ZQ的语音记录,来重新review一下,记录在此。得逼这自己进步。 + +## 怎么做 + +- 阅读gitbook记录 +- 回听大妈语音记录 + +## 怎么输出 + +- 3点关键触动 +- 如何改进 具体的 +- 反馈(push 到 OMOOC 微信群) \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md index 049981241..d45cb2037 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -47,6 +47,18 @@ - [Star Upgrade](4Learn/5wd4_upgrade.md) - [Mind Trek](4Learn/5wd4_mindtrek.md) - [Star 去除心障](4Learn/6wd4_brokenthewall.md) +- [Review](5Review/README.md) + - [0w](5Review/0w.md) + - [1w](5Review/1w.md) + - [2w](5Review/2w.md) + - [3w](5Review/3w.md) + - [4w](5Review/4w.md) + - [5w](5Review/5w.md) + - [6w](5Review/6w.md) + - [7w](5Review/7w.md) + - [8w](5Review/8w.md) + - [9w](5Review/9w.md) + - [10w](5Review/10w.md) - [代码 (_src)](_src/README.md) - [素材 (draft)](draft/README.md) + [教程该怎么写](draft/how2tutorial.md) diff --git a/fabfile.py b/fabfile.py new file mode 100644 index 000000000..1766ad5fc --- /dev/null +++ b/fabfile.py @@ -0,0 +1,17 @@ +# - * - coding:utf-8 -*- + +from fabric.api import local + +# fab post: your-post-name +def post(name): + local("./scripts/newpost %s" % name) + +# fab tag +def tag(): + local("./scripts/generate-tags") + +# please use: fab pu:'discribation' +def pu(discribation): + local("git ad") + local("git ci -m '%s' " % discribation) + local("git pu") \ No newline at end of file From 9da55889959dbad25601e7b9a91bf9e64b074717 Mon Sep 17 00:00:00 2001 From: JeremiahZhang Date: Mon, 1 Jan 2001 00:50:21 +0800 Subject: [PATCH 432/432] mod --- SUMMARY.md | 1 - 1 file changed, 1 deletion(-) diff --git a/SUMMARY.md b/SUMMARY.md index d45cb2037..149d3bb4b 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -36,7 +36,6 @@ - [Trek07 慢下来了](2nDev/week06_thought.md) - [StarTrek08 日志交互移动版](2nDev/week07_qpy.md) - [星际大会](3rDemo/README.md) - - [Renew Mind in Galaxy](4Learn/README.md) - [Star 開智编程入门体验](4Learn/2015-9-26-HiddenMission.md) - [Star Renewminding](4Learn/0wd4-OpenCourse-Note.md)