diff --git a/chapters/01-start-project.md b/chapters/01-start-project.md index e8c1fbb..bc54ff5 100644 --- a/chapters/01-start-project.md +++ b/chapters/01-start-project.md @@ -1,32 +1,56 @@ 创建开源项目 === -人们创建 +人们出于不同的目的来创建开源项目,可不论目的是什么,过程都是一样的。 + +1. 首先,我们需要为我们的项目取一个名字。 +2. 然后,为我们的开源项目选择一个合适的 LICENSE +3. 然后再去创建项目 取一个好的名字 --- -### 保持命令规则 +取名字,从来就不是一件容易的事。 -个性化,如同 ID 一般。 +因此,我就长话短说,一般就是取一个有意义的名字,当然没有意义也没有任何问题。 + +通常而言,如果自己计划有一系列的开源项目,那么我们可以保持一定的命令规则。 挑选好 LICENSE --- -事实上,在我们看到的一些外版书籍上,如果拥有代码。那么作者一般就会在前言或者类似的位置里,指明书中代码的版权所属。 +> 在二十世纪而七十年代末和八十年代初,为了防止自己的软件被竞争对手所使用,大多数厂家停止分发其软件源代码,并开始使用版权和限制性软件许可证,来限制或者禁止软件源代码的复制或再分配。随后,Richard Matthew Stallman(Richard Matthew Stallman)发起了自由软件运动,他开创了 Copyleft 的概念:使用版权法的原则来保护使用、修改和分发自由软件的权利,并且是描述这些术语的自由软件许可证的主要作者。最为人所称道的是GPL(被z广泛使用的自由软件协议)。[^rms] -如: +(PS:关于自由软件及 RMS 的更多信息、历史,可以阅读《若为自由故:自由软件之父 - 理查德 斯托曼传》) -> 也许你需要在自己的程序或文档中用到本书的代码,但除非大篇幅地使用,否则不必与我们联系取得授权。例如,用本书中的几段代码编写程序无需请求许可,blabla。 +[^rms]: https://zh.wikipedia.org/wiki/%E7%90%86%E6%9F%A5%E5%BE%B7%C2%B7%E6%96%AF%E6%89%98%E6%9B%BC + +随后,便诞生了开源软件的概念,开源的要求比自由软件宽松一些[^gnu_gpl]。迄今发布的自由软件源代码都是开源软件,而并非所有的开源软件都是自由软件。这是因为不同的许可(协议)赋予用户不同的权利,如 GPL 协议强制要求开源修改过源码的代码,而宽松一点的 MIT 则不会有这种要求。 + +[^gnu_gpl]: https://www.gnu.org/philosophy/open-source-misses-the-point.zh-cn.html + +如下是不同开源许可证的市场占有率及使用情况。  +又比如,在我们看到的一些外版书籍上,如果拥有代码。那么作者一般就会在前言或者类似的位置里,指明书中代码的版权所属。如:``也许你需要在自己的程序或文档中用到本书的代码,但除非大篇幅地使用,否则不必与我们联系取得授权。例如,用本书中的几段代码编写程序无需请求许可,blabla``。 + +于是,选择一个合理的 LICENSE,就变成了一个有趣的话题。为此,笔者做了一个如何进行开源协议选型的流程图: + +[](https://github.com/phodal/licenses) + +简单地来说,这些 License 之间是一些权利的区别,如当你把代码放置到公有领域,就意味着任何人可以修改,并且不需要标明出注;可如果你想要别人标明出处及作者,你就需要 MIT 协议;而你希望别人闭源的话,那么你就需要 MPL 协议等等。 + +那么,下面让我们简单地介绍一下不同的几个协议。 + ### 公有领域 > WTFPL(Do What The Fuck You Want To Public License,中文译名:你他妈的想干嘛就干嘛公共许可证)是一种不太常用的、极度放任的自由软件许可证。它的条款基本等同于贡献到公有领域。[^wtfpl] [^wtfpl]: https://zh.wikipedia.org/wiki/WTFPL +这就意味着,对于拿到这些代码的其他人,他们想怎么修改就可以怎么修改。 + 这取决于 ### GPL @@ -39,23 +63,23 @@ 因此,一般而言,我使用的是 MIT 协议。至少我保留了一个署名权,即你可以修改我的代码,但是在 LICENSE 里必须加上我的名字。 +选用 MIT 特别有意思,特别是在最近几年里,发生过: + + - [iView “抄袭” Element UI 事件](https://zhuanlan.zhihu.com/p/25739512) + - [AndroidTVLauncher “抄袭” 事件](https://github.com/JackyAndroid/AndroidTVLauncher/issues/22) + +等等。这告诫了我们,如果你不想要有这种经历,那么就不要用 MIT 了。 + ### Creative Commons 是的,当我写 Markdown 的时候,考虑到未来会以纸质书的形式出现,便会使用 CC-BY-NC-ND 协议: - - cc -> Creative Commons - - by -> 署名(英语:Attribution,by) + - CC -> Creative Commons + - BY -> 署名(英语:Attribution,by) - NC -> 非商业性使用(英语:NonCommercial) - - 禁止演绎 ->(英语:NoDerivs)。 + - ND -> 禁止演绎(英语:NoDerivs)。 即,任何人可以使用我写的电子书来自由复制、散布、展示及演出,但是不得用于商业用途(作者本人可以)。它可以随意地放在他的博客上,他的各个文章里。但是必须标明出自,并且不得改变、转变或更改本作品。 如果你不介意的话,你可以使用公有领域(Public Domain)。可是这样一来,万一有一天,别人直接拿的作品出书,你就骂爹了。 -官方主页 ---- - -一个好的例子是 GitHub Pages - - -然后,创建 diff --git a/chapters/03-build-github-project.md b/chapters/03-build-github-project.md index 95f193d..bfbe0bd 100644 --- a/chapters/03-build-github-project.md +++ b/chapters/03-build-github-project.md @@ -1,10 +1,10 @@ -# 构建GitHub项目 +# 构建 GitHub 项目 -## 如何用好GitHub +## 如何用好 GitHub -如何用好GitHub,并实践一些敏捷软件开发是一个很有意思的事情.我们可以在上面做很多事情,从测试到CI,再到自动部署. +如何用好 GitHub,并实践一些敏捷软件开发是一个很有意思的事情.我们可以在上面做很多事情,从测试到CI,再到自动部署. -###敏捷软件开发 +### 敏捷软件开发 显然我是在扯淡,这和敏捷软件开发没有什么关系。不过我也不知道瀑布流是怎样的。说说我所知道的一个项目的组成吧: diff --git a/chapters/05-create-project-documents.md b/chapters/05-create-project-documents.md index 09d65d2..ba1978a 100644 --- a/chapters/05-create-project-documents.md +++ b/chapters/05-create-project-documents.md @@ -38,7 +38,7 @@ README通常会显示在GitHub项目的下面,如下图所示: * 如何参与贡献 * 协议 -## 在线文档 +## 官方首页与在线文档 很多开源项目都会有自己的网站,并在上面有一个文档,而有的则会放在[https://readthedocs.org/](https://readthedocs.org/)。 diff --git a/github-roam.md b/github-roam.md index 32cd337..9820f71 100644 --- a/github-roam.md +++ b/github-roam.md @@ -83,32 +83,56 @@ 创建开源项目 === -人们创建 +人们出于不同的目的来创建开源项目,可不论目的是什么,过程都是一样的。 + +1. 首先,我们需要为我们的项目取一个名字。 +2. 然后,为我们的开源项目选择一个合适的 LICENSE +3. 然后再去创建项目 取一个好的名字 --- -### 保持命令规则 +取名字,从来就不是一件容易的事。 -个性化,如同 ID 一般。 +因此,我就长话短说,一般就是取一个有意义的名字,当然没有意义也没有任何问题。 + +通常而言,如果自己计划有一系列的开源项目,那么我们可以保持一定的命令规则。 挑选好 LICENSE --- -事实上,在我们看到的一些外版书籍上,如果拥有代码。那么作者一般就会在前言或者类似的位置里,指明书中代码的版权所属。 +> 在二十世纪而七十年代末和八十年代初,为了防止自己的软件被竞争对手所使用,大多数厂家停止分发其软件源代码,并开始使用版权和限制性软件许可证,来限制或者禁止软件源代码的复制或再分配。随后,Richard Matthew Stallman(Richard Matthew Stallman)发起了自由软件运动,他开创了 Copyleft 的概念:使用版权法的原则来保护使用、修改和分发自由软件的权利,并且是描述这些术语的自由软件许可证的主要作者。最为人所称道的是GPL(被z广泛使用的自由软件协议)。[^rms] -如: +(PS:关于自由软件及 RMS 的更多信息、历史,可以阅读《若为自由故:自由软件之父 - 理查德 斯托曼传》) -> 也许你需要在自己的程序或文档中用到本书的代码,但除非大篇幅地使用,否则不必与我们联系取得授权。例如,用本书中的几段代码编写程序无需请求许可,blabla。 +[^rms]: https://zh.wikipedia.org/wiki/%E7%90%86%E6%9F%A5%E5%BE%B7%C2%B7%E6%96%AF%E6%89%98%E6%9B%BC + +随后,便诞生了开源软件的概念,开源的要求比自由软件宽松一些[^gnu_gpl]。迄今发布的自由软件源代码都是开源软件,而并非所有的开源软件都是自由软件。这是因为不同的许可(协议)赋予用户不同的权利,如 GPL 协议强制要求开源修改过源码的代码,而宽松一点的 MIT 则不会有这种要求。 + +[^gnu_gpl]: https://www.gnu.org/philosophy/open-source-misses-the-point.zh-cn.html + +如下是不同开源许可证的市场占有率及使用情况。  +又比如,在我们看到的一些外版书籍上,如果拥有代码。那么作者一般就会在前言或者类似的位置里,指明书中代码的版权所属。如:``也许你需要在自己的程序或文档中用到本书的代码,但除非大篇幅地使用,否则不必与我们联系取得授权。例如,用本书中的几段代码编写程序无需请求许可,blabla``。 + +于是,选择一个合理的 LICENSE,就变成了一个有趣的话题。为此,笔者做了一个如何进行开源协议选型的流程图: + +[](https://github.com/phodal/licenses) + +简单地来说,这些 License 之间是一些权利的区别,如当你把代码放置到公有领域,就意味着任何人可以修改,并且不需要标明出注;可如果你想要别人标明出处及作者,你就需要 MIT 协议;而你希望别人闭源的话,那么你就需要 MPL 协议等等。 + +那么,下面让我们简单地介绍一下不同的几个协议。 + ### 公有领域 > WTFPL(Do What The Fuck You Want To Public License,中文译名:你他妈的想干嘛就干嘛公共许可证)是一种不太常用的、极度放任的自由软件许可证。它的条款基本等同于贡献到公有领域。[^wtfpl] [^wtfpl]: https://zh.wikipedia.org/wiki/WTFPL +这就意味着,对于拿到这些代码的其他人,他们想怎么修改就可以怎么修改。 + 这取决于 ### GPL @@ -121,26 +145,26 @@ 因此,一般而言,我使用的是 MIT 协议。至少我保留了一个署名权,即你可以修改我的代码,但是在 LICENSE 里必须加上我的名字。 +选用 MIT 特别有意思,特别是在最近几年里,发生过: + + - [iView “抄袭” Element UI 事件](https://zhuanlan.zhihu.com/p/25739512) + - [AndroidTVLauncher “抄袭” 事件](https://github.com/JackyAndroid/AndroidTVLauncher/issues/22) + +等等。这告诫了我们,如果你不想要有这种经历,那么就不要用 MIT 了。 + ### Creative Commons 是的,当我写 Markdown 的时候,考虑到未来会以纸质书的形式出现,便会使用 CC-BY-NC-ND 协议: - - cc -> Creative Commons - - by -> 署名(英语:Attribution,by) + - CC -> Creative Commons + - BY -> 署名(英语:Attribution,by) - NC -> 非商业性使用(英语:NonCommercial) - - 禁止演绎 ->(英语:NoDerivs)。 + - ND -> 禁止演绎(英语:NoDerivs)。 即,任何人可以使用我写的电子书来自由复制、散布、展示及演出,但是不得用于商业用途(作者本人可以)。它可以随意地放在他的博客上,他的各个文章里。但是必须标明出自,并且不得改变、转变或更改本作品。 如果你不介意的话,你可以使用公有领域(Public Domain)。可是这样一来,万一有一天,别人直接拿的作品出书,你就骂爹了。 -官方主页 ---- - -一个好的例子是 GitHub Pages - - -然后,创建 # Git基本知识与GitHub使用 @@ -360,13 +384,13 @@ CLA即Contributor License Agreement,在为一些大的组织、机构提交Pul 他们都要求我签署CLA。 -# 构建GitHub项目 +# 构建 GitHub 项目 -## 如何用好GitHub +## 如何用好 GitHub -如何用好GitHub,并实践一些敏捷软件开发是一个很有意思的事情.我们可以在上面做很多事情,从测试到CI,再到自动部署. +如何用好 GitHub,并实践一些敏捷软件开发是一个很有意思的事情.我们可以在上面做很多事情,从测试到CI,再到自动部署. -###敏捷软件开发 +### 敏捷软件开发 显然我是在扯淡,这和敏捷软件开发没有什么关系。不过我也不知道瀑布流是怎样的。说说我所知道的一个项目的组成吧: @@ -1037,7 +1061,7 @@ README通常会显示在GitHub项目的下面,如下图所示: * 如何参与贡献 * 协议 -## 在线文档 +## 官方首页与在线文档 很多开源项目都会有自己的网站,并在上面有一个文档,而有的则会放在[https://readthedocs.org/](https://readthedocs.org/)。 diff --git a/img/licenses.png b/img/licenses.png new file mode 100644 index 0000000..066b5f2 Binary files /dev/null and b/img/licenses.png differ diff --git a/index.html b/index.html index 8e11196..a7653ca 100644 --- a/index.html +++ b/index.html @@ -77,16 +77,13 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
如果我们想创造出更好、强大地框架时,那么认识更多的人可能会带来更多的帮助。有时候会同上面那一点一样的效果
人们创建
+人们出于不同的目的来创建开源项目,可不论目的是什么,过程都是一样的。
+个性化,如同 ID 一般。
+取名字,从来就不是一件容易的事。
+因此,我就长话短说,一般就是取一个有意义的名字,当然没有意义也没有任何问题。
+通常而言,如果自己计划有一系列的开源项目,那么我们可以保持一定的命令规则。
事实上,在我们看到的一些外版书籍上,如果拥有代码。那么作者一般就会在前言或者类似的位置里,指明书中代码的版权所属。
-如:
-+也许你需要在自己的程序或文档中用到本书的代码,但除非大篇幅地使用,否则不必与我们联系取得授权。例如,用本书中的几段代码编写程序无需请求许可,blabla。
+在二十世纪而七十年代末和八十年代初,为了防止自己的软件被竞争对手所使用,大多数厂家停止分发其软件源代码,并开始使用版权和限制性软件许可证,来限制或者禁止软件源代码的复制或再分配。随后,Richard Matthew Stallman(Richard Matthew Stallman)发起了自由软件运动,他开创了 Copyleft 的概念:使用版权法的原则来保护使用、修改和分发自由软件的权利,并且是描述这些术语的自由软件许可证的主要作者。最为人所称道的是GPL(被z广泛使用的自由软件协议)。1
(PS:关于自由软件及 RMS 的更多信息、历史,可以阅读《若为自由故:自由软件之父 - 理查德 斯托曼传》)
+随后,便诞生了开源软件的概念,开源的要求比自由软件宽松一些2。迄今发布的自由软件源代码都是开源软件,而并非所有的开源软件都是自由软件。这是因为不同的许可(协议)赋予用户不同的权利,如 GPL 协议强制要求开源修改过源码的代码,而宽松一点的 MIT 则不会有这种要求。
+如下是不同开源许可证的市场占有率及使用情况。

又比如,在我们看到的一些外版书籍上,如果拥有代码。那么作者一般就会在前言或者类似的位置里,指明书中代码的版权所属。如:也许你需要在自己的程序或文档中用到本书的代码,但除非大篇幅地使用,否则不必与我们联系取得授权。例如,用本书中的几段代码编写程序无需请求许可,blabla。
于是,选择一个合理的 LICENSE,就变成了一个有趣的话题。为此,笔者做了一个如何进行开源协议选型的流程图:
+ +简单地来说,这些 License 之间是一些权利的区别,如当你把代码放置到公有领域,就意味着任何人可以修改,并且不需要标明出注;可如果你想要别人标明出处及作者,你就需要 MIT 协议;而你希望别人闭源的话,那么你就需要 MPL 协议等等。
+那么,下面让我们简单地介绍一下不同的几个协议。
-+WTFPL(Do What The Fuck You Want To Public License,中文译名:你他妈的想干嘛就干嘛公共许可证)是一种不太常用的、极度放任的自由软件许可证。它的条款基本等同于贡献到公有领域。1
+WTFPL(Do What The Fuck You Want To Public License,中文译名:你他妈的想干嘛就干嘛公共许可证)是一种不太常用的、极度放任的自由软件许可证。它的条款基本等同于贡献到公有领域。3
这就意味着,对于拿到这些代码的其他人,他们想怎么修改就可以怎么修改。
这取决于
由于 GPL 的传染性,便意味着,他人引用我们的代码时,其所写的代码也需要使用 GPL 开源。即:GPL 是有 “传染性” 的 “病毒” ,因为 GPL 条款规定演绎作品也必须是 GPL 的。
而如果我们只针对的是,他人可以使用库,而不开源,则可以用 LGPL。但是修改库则不适用。
因此,一般而言,我使用的是 MIT 协议。至少我保留了一个署名权,即你可以修改我的代码,但是在 LICENSE 里必须加上我的名字。
+选用 MIT 特别有意思,特别是在最近几年里,发生过:
+ +等等。这告诫了我们,如果你不想要有这种经历,那么就不要用 MIT 了。
是的,当我写 Markdown 的时候,考虑到未来会以纸质书的形式出现,便会使用 CC-BY-NC-ND 协议:
即,任何人可以使用我写的电子书来自由复制、散布、展示及演出,但是不得用于商业用途(作者本人可以)。它可以随意地放在他的博客上,他的各个文章里。但是必须标明出自,并且不得改变、转变或更改本作品。
如果你不介意的话,你可以使用公有领域(Public Domain)。可是这样一来,万一有一天,别人直接拿的作品出书,你就骂爹了。
-一个好的例子是 GitHub Pages
-然后,创建
从一般开发者的角度来看,git有以下功能:
@@ -596,9 +609,9 @@ git push -u origin master
他们都要求我签署CLA。
-如何用好GitHub,并实践一些敏捷软件开发是一个很有意思的事情.我们可以在上面做很多事情,从测试到CI,再到自动部署.
+如何用好 GitHub,并实践一些敏捷软件开发是一个很有意思的事情.我们可以在上面做很多事情,从测试到CI,再到自动部署.
显然我是在扯淡,这和敏捷软件开发没有什么关系。不过我也不知道瀑布流是怎样的。说说我所知道的一个项目的组成吧:
很多开源项目都会有自己的网站,并在上面有一个文档,而有的则会放在https://readthedocs.org/。
Read the Docs 托管文档,让文档可以被全文搜索和更易查找。您可以导入您使用任何常用的版本控制系统管理的文档,包括 Mercurial、Git、Subversion 和 Bazaar。 我们支持 webhooks,因此可以在您提交代码时自动构建文档。并且同样也支持版本功能,因此您可以构建来自您代码仓库中某个标签或分支的文档。查看完整的功能列表 。
@@ -1356,16 +1369,16 @@ str = tableHandler(str编写测试->功能代码->修改测试->重构上次在和buddy聊天的时候,才知道测试在功能简单的时候是后行的,在功能复杂不知道怎么下手的时候是先行的。
开始之前请原谅我对于Java语言的一些无知,然后,看一下我写的Main函数:
-package com.phodal.learing; +package com.phodal.learing; public class Main { - public static void main(String[] args) { + public static void main(String[] args) { int c=new Cal().add(1,2); int d=new Cal2().sub(2,1); - System.out.println("Hello,s"); - System.out.println(c); - System.out.println(d); + System.out.println("Hello,s"); + System.out.println(c); + System.out.println(d); } }代码写得还好(自我感觉),先不管Cal和Cal2两个类。大部分都能看懂,除了c,d不知道他们表达的是什么意思,于是。
@@ -1377,16 +1390,16 @@ str = tableHandler(str把光标移到int d中的d,按下shift+f6,输入result_sub于是就有
-package com.phodal.learing; +package com.phodal.learing; public class Main { - public static void main(String[] args) { + public static void main(String[] args) { int result_add=new Cal().add(1,2); int result_sub=new Cal2().sub(2,1); - System.out.println("Hello,s"); - System.out.println(result_add); - System.out.println(result_sub); + System.out.println("Hello,s"); + System.out.println(result_add); + System.out.println(result_sub); } }Extract Method
@@ -1398,16 +1411,16 @@ str = tableHandler(str在弹出的窗口中输入mprint于是有了
-public static void main(String[] args) { +public static void main(String[] args) { int result_add=new Cal().add(1,2); int result_sub=new Cal2().sub(2,1); - System.out.println("Hello,s"); + System.out.println("Hello,s"); mprint(result_add); mprint(result_sub); } private static void mprint(int result_sub) { - System.out.println(result_sub); + System.out.println(result_sub); }似乎我们不应该这样对待System.out.println,那么让我们内联回去
Inline Method
@@ -1419,12 +1432,12 @@ str = tableHandler(str选中Inline all invocations and remove the method(2 occurrences) 点确定然后我们等于什么也没有做了~~:
-public static void main(String[] args) { +public static void main(String[] args) { int result_add=new Cal().add(1,2); int result_sub=new Cal2().sub(2,1); - System.out.println("Hello,s"); - System.out.println(result_add); - System.out.println(result_sub); + System.out.println("Hello,s"); + System.out.println(result_add); + System.out.println(result_sub); }似乎这个例子不是很好,但是够用来说明了。
Pull Members Up
@@ -1464,7 +1477,7 @@ str = tableHandler(str重构之前过多的临时变量会让我们写出更长的函数,函数不应该太多,以便使功能单一。这也是重构的另外的目的所在,只有函数专注于其功能,才会更容易读懂。
以书中的代码为例
-import java.lang.System; +# Top languages. n += 4 - for k, v in results[7]: - if k in langs: + for k, v in results[7]: + if k in langs: points[n + langs.index(k)] = float(v) / total else: # Unknown language. @@ -3016,7 +3029,9 @@ pipe.execute()import java.lang.System; public class replaceTemp { public void count() { @@ -1482,7 +1495,7 @@ str = tableHandler(strReplace Temp With Query 便会返回
-import java.lang.System; +@@ -1546,9 +1559,9 @@ public class replaceTemp { return res.end('Unauthorized'); }import java.lang.System; public class replaceTemp { public void count() { @@ -1509,9 +1522,9 @@ str = tableHandler(strpublic class replaceTemp { public void method() { - String str = "str"; - String aString = returnString().concat(str); - System.out.println(aString); + String str = "str"; + String aString = returnString().concat(str); + System.out.println(aString); } }可是除了HTTP协议,还有MQTT和CoAP。对于MQTT协议来说,那还算好,毕竟自带授权,如:
-+mosquitto_pub -u root -P root -h localhost -d -t lettuce -m "Hello, MQTT. This is my first message."mosquitto_pub -u root -P root -h localhost -d -t lettuce -m "Hello, MQTT. This is my first message."便可以让我们简单地完成这个功能,然而有的协议是没有这样的功能如CoAP协议中是用Option来进行授权的。现在的工具如libcoap只能有如下的简单功能
-+coap-client -m get coap://127.0.0.1:5683/topics/zero -Tcoap-client -m get coap://127.0.0.1:5683/topics/zero -T于是,先写了个测试脚本来验证功能。
points[0] = 1.0 / (total + 1) # Week means. - for k, v in results[1].iteritems(): + for k, v in results[1].iteritems(): points[1 + int(k)] = float(v) / total # Event types. n = 8 - for k, v in results[2]: + for k, v in results[2]: points[n + evttypes.index(k)] = float(v) / total # Number of contributions, connections and languages. @@ -2345,8 +2358,8 @@ pipe.execute()var coap = require('coap'); var request = coap.request; @@ -1951,7 +1964,7 @@ Set up your git name and email, this is important so that your commits can be id重写了一个新的方法用于计算提交数,直至后面才意识到其实我们可以算行数就够了,但是方法上有点hack2014年1月1日零时到一时,用户在github上的操作,这里的用户指的是很多。。一共有4814条数据,从commit、create到issues都有。
数据解析
import json -for line in open(jsonfile): +for line in open(jsonfile): line = f.readline()然后再解析json
import dateutil.parser @@ -1964,23 +1977,23 @@ date = dateutil.parser.parse(lin[" dataarray = [] datacount = 0 - for line in open(jsonfile): + for line in open(jsonfile): line = f.readline() lin = json.loads(line) date = dateutil.parser.parse(lin["created_at"]) datacount += 1 dataarray.append(date.minute) - minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)] + minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)] f.close() return minuteswithcount下面这句代码就是将上面的解析为
-+minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)]minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)]这样的数组以便于解析
[(0, 92), (1, 67), (2, 86), (3, 73), (4, 76), (5, 67), (6, 61), (7, 71), (8, 62), (9, 71), (10, 70), (11, 79), (12, 62), (13, 67), (14, 76), (15, 67), (16, 74), (17, 48), (18, 78), (19, 73), (20, 89), (21, 62), (22, 74), (23, 61), (24, 71), (25, 49), (26, 59), (27, 59), (28, 58), (29, 74), (30, 69), (31, 59), (32, 89), (33, 67), (34, 66), (35, 77), (36, 64), (37, 71), (38, 75), (39, 66), (40, 62), (41, 77), (42, 82), (43, 95), (44, 77), (45, 65), (46, 59), (47, 60), (48, 54), (49, 66), (50, 74), (51, 61), (52, 71), (53, 90), (54, 64), (55, 67), (56, 67), (57, 55), (58, 68), (59, 91)]Matplotlib
开始之前需要安装``matplotlib
-+sudo pip install matplotlibsudo pip install matplotlib然后引入这个库
import matplotlib.pyplot as plt如上面的那个结果,只需要
@@ -2006,14 +2019,14 @@ date = dateutil.parser.parse(lin[" dataarray = [] datacount = 0 - for line in open(jsonfile): + for line in open(jsonfile): line = f.readline() lin = json.loads(line) date = dateutil.parser.parse(lin["created_at"]) datacount += 1 dataarray.append(date.minute) - minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)] + minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)] f.close() return minuteswithcount @@ -2022,7 +2035,7 @@ date = dateutil.parser.parse(lin[" x = [] y = [] mwcs = parse_data(files) - for mwc in mwcs: + for mwc in mwcs: x.append(mwc[0]) y.append(mwc[1]) @@ -2076,7 +2089,7 @@ draw_date("data/2014-01-01-0.json")def get_minutes_counts_with_id(jsonfile): datacount, dataarray = handle_json(jsonfile) - minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)] + minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)] return minuteswithcount @@ -2085,7 +2098,7 @@ draw_date("data/2014-01-01-0.json")= [] datacount = 0 - for line in open(jsonfile): + for line in open(jsonfile): line = f.readline() lin = json.loads(line) date = dateutil.parser.parse(lin["created_at"]) @@ -2107,7 +2120,7 @@ draw_date("data/2014-01-01-0.json") :rtype : object """ monthdaycount = [] - for i in range(1, 20): + for i in range(1, 20): if i < 10: filename = 'data/2014-02-0' + i.__str__() + '-0.json' else: @@ -2142,43 +2155,43 @@ draw_date("data/2014-01-01-0.json")= 0 userinfo = [] condition = 'select * from userinfo where owener = \'' + str(username) + '\'' - for zero in c.execute(condition): + for zero in c.execute(condition): count += 1 userinfo.append(zero) return count, userinfo当我查询
-gmszone的时候,也就是我自己就会有如下的结果+(u'gmszone', u'ForkEvent', u'RESUME', u'TeX', u'https://github.com/gmszone/RESUME') -(u'gmszone', u'WatchEvent', u'iot-dashboard', u'JavaScript', u'https://github.com/gmszone/iot-dashboard') -(u'gmszone', u'PushEvent', u'wechat-wordpress', u'Ruby', u'https://github.com/gmszone/wechat-wordpress') -(u'gmszone', u'WatchEvent', u'iot', u'JavaScript', u'https://github.com/gmszone/iot') -(u'gmszone', u'CreateEvent', u'iot-doc', u'None', u'https://github.com/gmszone/iot-doc') -(u'gmszone', u'CreateEvent', u'iot-doc', u'None', u'https://github.com/gmszone/iot-doc') -(u'gmszone', u'PushEvent', u'iot-doc', u'TeX', u'https://github.com/gmszone/iot-doc') -(u'gmszone', u'PushEvent', u'iot-doc', u'TeX', u'https://github.com/gmszone/iot-doc') -(u'gmszone', u'PushEvent', u'iot-doc', u'TeX', u'https://github.com/gmszone/iot-doc') -109(u'gmszone', u'ForkEvent', u'RESUME', u'TeX', u'https://github.com/gmszone/RESUME') +(u'gmszone', u'WatchEvent', u'iot-dashboard', u'JavaScript', u'https://github.com/gmszone/iot-dashboard') +(u'gmszone', u'PushEvent', u'wechat-wordpress', u'Ruby', u'https://github.com/gmszone/wechat-wordpress') +(u'gmszone', u'WatchEvent', u'iot', u'JavaScript', u'https://github.com/gmszone/iot') +(u'gmszone', u'CreateEvent', u'iot-doc', u'None', u'https://github.com/gmszone/iot-doc') +(u'gmszone', u'CreateEvent', u'iot-doc', u'None', u'https://github.com/gmszone/iot-doc') +(u'gmszone', u'PushEvent', u'iot-doc', u'TeX', u'https://github.com/gmszone/iot-doc') +(u'gmszone', u'PushEvent', u'iot-doc', u'TeX', u'https://github.com/gmszone/iot-doc') +(u'gmszone', u'PushEvent', u'iot-doc', u'TeX', u'https://github.com/gmszone/iot-doc') +109一共有109个事件,有
Watch,Create,Push,Fork还有其他的, 项目主要有iot,RESUME,iot-dashboard,wechat-wordpress, 接着就是语言了,Tex,Javascript,Ruby,接着就是项目的url了。值得注意的是。
-+-rw-r--r-- 1 fdhuang staff 905M Apr 12 14:59 userdata.db-rw-r--r-- 1 fdhuang staff 905M Apr 12 14:59 userdata.db这个数据库文件有905M,不过查询结果相当让人满意,至少相对于原来的结果来说。
Python自带了对SQLite3的支持,然而我们还需要安装SQLite3
-+brew install sqlite3brew install sqlite3或者是
-+sudo port install sqlite3sudo port install sqlite3或者是Ubuntu的
-+sudo apt-get install sqlite3sudo apt-get install sqlite3openSUSE自然就是
-+sudo zypper install sqlite3sudo zypper install sqlite3不过,用yast2也很不错,不是么。。
数据导入
需要注意的是这里是需要python2.7,起源于对gzip的上下文管理器的支持问题
def handle_gzip_file(filename): userinfo = [] with gzip.GzipFile(filename) as f: - events = [line.decode("utf-8", errors="ignore") for line in f] + events = [line.decode("utf-8", errors="ignore") for line in f] - for n, line in enumerate(events): + for n, line in enumerate(events): try: event = json.loads(line) except: @@ -2187,7 +2200,7 @@ draw_date("data/2014-01-01-0.json")= event["actor"] attrs = event.get("actor_attributes", {}) - if actor is None or attrs.get("type") != "User": + if actor is None or attrs.get("type") != "User": continue key = actor.lower() @@ -2207,7 +2220,7 @@ draw_date("data/2014-01-01-0.json")= 2014 month = 3 - for day in range(1,31): + for day in range(1,31): date_re = re.compile(r"([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]+)\.json.gz") fn_template = os.path.join("march", @@ -2215,7 +2228,7 @@ draw_date("data/2014-01-01-0.json")= {"year": year, "month": month, "day": day, "n": "*"} filenames = glob.glob(fn_template.format(**kwargs)) - for filename in filenames: + for filename in filenames: c.executemany('INSERT INTO userinfo VALUES (?,?,?,?,?)', handle_gzip_file(filename)) conn.commit() @@ -2241,11 +2254,11 @@ pipe = pipe = r.pipeline() pipe.zscore('osrc:user',"gmszone") pipe.execute()系统返回了
-227.0,试试别人。+>>> pipe.zscore('osrc:user',"dfm") -<redis.client.StrictPipeline object at 0x104fa7f50> ->>> pipe.execute() -[425.0] ->>>>>> pipe.zscore('osrc:user',"dfm") +<redis.client.StrictPipeline object at 0x104fa7f50> +>>> pipe.execute() +[425.0] +>>>看看主要是在哪一天提交的
r = redis.StrictRedis(host='localhost', port=6379, db=0) no_pipe = False - if pipe is None: + if pipe is None: pipe = pipe = r.pipeline() no_pipe = True @@ -2328,12 +2341,12 @@ pipe.execute()>>> pipe.hgetall('osrc:user:gmszone:day') <redis.client.StrictPipeline object at 0x104fa7f50> @@ -2272,7 +2285,7 @@ pipe.execute()