mirror of
https://github.com/phodal/github
synced 2026-05-22 08:38:23 +00:00
[T] compile
This commit is contained in:
parent
413ff8d804
commit
31ec4e508b
2 changed files with 86 additions and 86 deletions
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
#前言
|
||||
|
||||
我的GitHub主页上写着加入的时间——``Joined on Nov 8, 2010``,那时才大一,在那之后的那长日子里我都没有过到。也许是因为我学的不是计算机,到了今天——``2015.3.9``,我也发现这其实是程序员的社交网站。
|
||||
我的GitHub主页上写着加入的时间——``Joined on Nov 8, 2010``,那时才大一,在那之后的那么长的日子里我都没有登录过。也许是因为我学的不是计算机,到了今天——``2015.3.9``,我才发现这其实是程序员的社交网站。
|
||||
|
||||
过去,曾经有很长的一些时间我试过在GitHub上连击,也试着去了解别人是如何用好这个工具的。当然粉丝在GitHub上也是很重要的。
|
||||
|
||||
|
|
@ -9,9 +9,9 @@
|
|||
|
||||
##我与GitHub的故事
|
||||
|
||||
在我大四找工作的时候,试图去寻找一份硬件、物联网相关的工作(ps: 专业是电子信息工程)。尽管简历上写得满满的各种经历、经验,然而并没有卵用。跑了几场校园招聘会后,十份简历(ps: 事先已经有心里准备)一个也没有投出去——因为学校直接被拒。我对霸面什么的一点兴趣都没有,千里马需要伯乐。后来,我加入了Martin Flower所在的公司,当然这是后话了。
|
||||
在我大四找工作的时候,试图去寻找一份硬件、物联网相关的工作(ps: 专业是电子信息工程)。尽管简历上写得满满的各种经历、经验,然而并没有卵用。跑了几场校园招聘会后,十份简历(ps: 事先已经有心里准备)一个也没有投出去——因为学校直接被拒。我对霸面什么的一点兴趣都没有,千里马需要伯乐。后来,我加入了[Martin Flower](https://martinfowler.com/)所在的公司,当然这是后话了。
|
||||
|
||||
这是一个残酷的世界,在学生时代,如果你长得不帅不高的话,那么多数的附加技能都是白搭(ps: 通常富的是看不到这篇文章的)。在工作时期,如果你上家没有名气,那么将会影响你下一份工作的待遇。而,很多东西却会改变这些,GitHub就是其中一个。
|
||||
这是一个残酷的世界,在学生时代,如果你长得不帅不高的话,那么多数的附加技能都是白搭(ps: 通常富的是看不到这篇文章的)。在工作时期,如果你上家没有名气,那么将会影响你下一份工作的待遇。而,很多东西却可以改变这些,GitHub就是其中一个。
|
||||
|
||||
注册GitHub的时候大概是大一的时候,我熟悉的时候已经是大四了,现在已经毕业一年了。在过去的近两年里,我试着以几个维度在GitHub上创建项目:
|
||||
|
||||
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
没有测试的项目是很扯淡的,除非你的项目只有一个函数,然后那个函数返回``Hello,World``。
|
||||
|
||||
如果你的项目代码有上千行,如果你能保证测试覆盖率可以达到95%以的话,那么我想你的项目不会有太复杂的函数。假使有这样的函数,那么他也是被测试覆盖住的。
|
||||
如果你的项目代码有上千行,如果你能保证测试覆盖率可以达到95%以的话,那么我想你的项目不会有太复杂的函数。假使有这样的函数,那么它也是被测试覆盖住的。
|
||||
|
||||
如果你在用心做这个项目,那么你看到代码写得不好也会试着改进,即重构。当有了一些,你的技能会不断提升。你开始会试着接触更多的东西,如stub,如mock,如fakeserver。
|
||||
|
||||
|
|
@ -61,7 +61,7 @@
|
|||
|
||||
###方便工作
|
||||
|
||||
我们可以从中获取到不同的知识、内容、信息。每个人都可以从别人的代码中学习,当我们需要构建一个库的时候我们可以在上面寻找不同的库和代码来实现我们的功能。如当我在实现一个库的时候,我会在GitHub上到相应的组件:
|
||||
我们可以从中获取到不同的知识、内容、信息。每个人都可以从别人的代码中学习,当我们需要构建一个库的时候,我们可以在上面寻找不同的库和代码来实现我们的功能。如当我在实现一个库的时候,我会在GitHub上找到相应的组件:
|
||||
|
||||
- Promise 支持
|
||||
- Class类(ps:没有一个好的类使用的方式)
|
||||
|
|
@ -1162,7 +1162,7 @@ req.end();
|
|||
|
||||
或许你应该知道了,重构是怎样的,你也知道重构能带来什么。在我刚开始学重构和设计模式的时候,我需要去找一些好的示例,以便于我更好的学习。有时候不得不创造一些更好的场景,来实现这些功能。
|
||||
|
||||
有一天,我发现当我需要我一次又一次地重复讲述某些内容,于是我就计划着把这些应该掌握的技能放到GitHub上,也就有了[Artisan Stack](https://github.com/artisanstack) 计划。
|
||||
有一天,我发现当我需要我一次又一次地重复讲述某些内容,于是我就计划着把这些应该掌握的技能放到GitHub上,也就有了[Artisan Stack](https://github.com/phodal-archive/artisanstack.github.io) 计划。
|
||||
|
||||
每个程序员都不可避免地是一个Coder,一个没有掌握好技能的Coder,算不上是手工艺人,但是是手工人。
|
||||
|
||||
|
|
@ -1283,7 +1283,7 @@ str = tableHandler(str, execStr, strict);
|
|||
}
|
||||
```
|
||||
|
||||
然后你也看到了,上面有一堆重复的代码,接着让我们用JavaScript的``奇技浮巧``,即apply方法,把上面的重复代码变成。
|
||||
然后你也看到了,上面有一堆重复的代码,接着让我们用JavaScript的``奇技淫巧``,即apply方法,把上面的重复代码变成。
|
||||
|
||||
```javascript
|
||||
['code', 'headline', 'lists', 'tables', 'links', 'mail', 'url', 'smlinks', 'hr'].forEach(function (type) {
|
||||
|
|
@ -1994,7 +1994,7 @@ if __name__ == '__main__':
|
|||
plt.show()
|
||||
```
|
||||
|
||||
蓝色的是第一周,绿色的是第二周,蓝色的是第三周就有了上面的结果。
|
||||
蓝色的是第一周,绿色的是第二周,红色的是第三周就有了上面的结果。
|
||||
|
||||
我们还需要优化方法,以及多线程的支持。
|
||||
|
||||
|
|
@ -2446,7 +2446,7 @@ def get_points(usernames):
|
|||
|
||||

|
||||
|
||||
``在停地造轮子的过程中,也不停地造车子。``
|
||||
``在不停地造轮子的过程中,也不停地造车子。``
|
||||
|
||||
在那篇连续冲击365天的文章出现之前,我们公司的大大([https://github.com/dreamhead](https://github.com/dreamhead))也曾经在公司内部说过,天天commit什么的。当然这不是我的动力,在连击140天之前
|
||||
|
||||
|
|
@ -2732,7 +2732,7 @@ def get_points(usernames):
|
|||
|
||||
组合相比于创造过程是一个更有挑战性的过程,我们需要在这过程去设计胶水来粘合这些代码,并在最终可以让他工作。这好比是我们在平时接触到的任务划分,每个人负责相应的模块,最后整合。
|
||||
|
||||
想似的我在写[lan](https://github.com/phodal/lan)的时候,也是类似的,但是不同的是我已经设计了一个清晰的架构图。
|
||||
我在写[lan](https://github.com/phodal/lan)的时候,也是类似的,但是不同的是我已经设计了一个清晰的架构图。
|
||||
|
||||

|
||||
|
||||
|
|
|
|||
152
index.html
152
index.html
|
|
@ -208,12 +208,12 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
|
|||
</ul>
|
||||
</nav>
|
||||
<h1 id="前言">前言</h1>
|
||||
<p>我的GitHub主页上写着加入的时间——<code>Joined on Nov 8, 2010</code>,那时才大一,在那之后的那长日子里我都没有过到。也许是因为我学的不是计算机,到了今天——<code>2015.3.9</code>,我也发现这其实是程序员的社交网站。</p>
|
||||
<p>我的GitHub主页上写着加入的时间——<code>Joined on Nov 8, 2010</code>,那时才大一,在那之后的那么长的日子里我都没有登录过。也许是因为我学的不是计算机,到了今天——<code>2015.3.9</code>,我才发现这其实是程序员的社交网站。</p>
|
||||
<p>过去,曾经有很长的一些时间我试过在GitHub上连击,也试着去了解别人是如何用好这个工具的。当然粉丝在GitHub上也是很重要的。</p>
|
||||
<p>在这里,我会试着将我在GitHub上学到的东西一一分享出来。</p>
|
||||
<h2 id="我与github的故事">我与GitHub的故事</h2>
|
||||
<p>在我大四找工作的时候,试图去寻找一份硬件、物联网相关的工作(ps: 专业是电子信息工程)。尽管简历上写得满满的各种经历、经验,然而并没有卵用。跑了几场校园招聘会后,十份简历(ps: 事先已经有心里准备)一个也没有投出去——因为学校直接被拒。我对霸面什么的一点兴趣都没有,千里马需要伯乐。后来,我加入了Martin Flower所在的公司,当然这是后话了。</p>
|
||||
<p>这是一个残酷的世界,在学生时代,如果你长得不帅不高的话,那么多数的附加技能都是白搭(ps: 通常富的是看不到这篇文章的)。在工作时期,如果你上家没有名气,那么将会影响你下一份工作的待遇。而,很多东西却会改变这些,GitHub就是其中一个。</p>
|
||||
<p>在我大四找工作的时候,试图去寻找一份硬件、物联网相关的工作(ps: 专业是电子信息工程)。尽管简历上写得满满的各种经历、经验,然而并没有卵用。跑了几场校园招聘会后,十份简历(ps: 事先已经有心里准备)一个也没有投出去——因为学校直接被拒。我对霸面什么的一点兴趣都没有,千里马需要伯乐。后来,我加入了<a href="https://martinfowler.com/">Martin Flower</a>所在的公司,当然这是后话了。</p>
|
||||
<p>这是一个残酷的世界,在学生时代,如果你长得不帅不高的话,那么多数的附加技能都是白搭(ps: 通常富的是看不到这篇文章的)。在工作时期,如果你上家没有名气,那么将会影响你下一份工作的待遇。而,很多东西却可以改变这些,GitHub就是其中一个。</p>
|
||||
<p>注册GitHub的时候大概是大一的时候,我熟悉的时候已经是大四了,现在已经毕业一年了。在过去的近两年里,我试着以几个维度在GitHub上创建项目:</p>
|
||||
<ol type="1">
|
||||
<li>快速上手框架来实战,即demo</li>
|
||||
|
|
@ -240,14 +240,14 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
|
|||
<li>更多的、更多的、更多的测试</li>
|
||||
</ol>
|
||||
<p>没有测试的项目是很扯淡的,除非你的项目只有一个函数,然后那个函数返回<code>Hello,World</code>。</p>
|
||||
<p>如果你的项目代码有上千行,如果你能保证测试覆盖率可以达到95%以的话,那么我想你的项目不会有太复杂的函数。假使有这样的函数,那么他也是被测试覆盖住的。</p>
|
||||
<p>如果你的项目代码有上千行,如果你能保证测试覆盖率可以达到95%以的话,那么我想你的项目不会有太复杂的函数。假使有这样的函数,那么它也是被测试覆盖住的。</p>
|
||||
<p>如果你在用心做这个项目,那么你看到代码写得不好也会试着改进,即重构。当有了一些,你的技能会不断提升。你开始会试着接触更多的东西,如stub,如mock,如fakeserver。</p>
|
||||
<p>有一天,你会发现你离不开测试。</p>
|
||||
<p>然后就会相信: <strong>那些没有写测试的项目都是在耍流氓</strong></p>
|
||||
<h2 id="为什么你应该深入github">为什么你应该深入GitHub</h2>
|
||||
<p>上面我们说的都是我们可以收获到的东西,我们开始尝试就意味着我们知道它可能给我们带来好处。上面已经提到很多可以提升自己的例子了,这里再说说其他的。</p>
|
||||
<h3 id="方便工作">方便工作</h3>
|
||||
<p>我们可以从中获取到不同的知识、内容、信息。每个人都可以从别人的代码中学习,当我们需要构建一个库的时候我们可以在上面寻找不同的库和代码来实现我们的功能。如当我在实现一个库的时候,我会在GitHub上到相应的组件:</p>
|
||||
<p>我们可以从中获取到不同的知识、内容、信息。每个人都可以从别人的代码中学习,当我们需要构建一个库的时候,我们可以在上面寻找不同的库和代码来实现我们的功能。如当我在实现一个库的时候,我会在GitHub上找到相应的组件:</p>
|
||||
<ul>
|
||||
<li>Promise 支持</li>
|
||||
<li>Class类(ps:没有一个好的类使用的方式)</li>
|
||||
|
|
@ -1123,9 +1123,9 @@ React.render(
|
|||
<span class="cf">return</span> <span class="va">res</span>.<span class="at">end</span>(<span class="st">'Unauthorized'</span>)<span class="op">;</span>
|
||||
<span class="op">}</span></code></pre></div>
|
||||
<p>可是除了HTTP协议,还有MQTT和CoAP。对于MQTT协议来说,那还算好,毕竟自带授权,如:</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="ex">mosquitto_pub</span> -u root -P root -h localhost -d -t lettuce -m <span class="st">"Hello, MQTT. This is my first message."</span></code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">mosquitto_pub</span> -u root -P root -h localhost -d -t lettuce -m <span class="st">"Hello, MQTT. This is my first message."</span></code></pre></div>
|
||||
<p>便可以让我们简单地完成这个功能,然而有的协议是没有这样的功能如CoAP协议中是用Option来进行授权的。现在的工具如libcoap只能有如下的简单功能</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="ex">coap-client</span> -m get coap://127.0.0.1:5683/topics/zero -T</code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">coap-client</span> -m get coap://127.0.0.1:5683/topics/zero -T</code></pre></div>
|
||||
<p>于是,先写了个测试脚本来验证功能。</p>
|
||||
<div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> coap <span class="op">=</span> <span class="at">require</span>(<span class="st">'coap'</span>)<span class="op">;</span>
|
||||
<span class="kw">var</span> request <span class="op">=</span> <span class="va">coap</span>.<span class="at">request</span><span class="op">;</span>
|
||||
|
|
@ -1280,7 +1280,7 @@ beforeEach(function() {
|
|||
<hr />
|
||||
<h1 id="重构">重构</h1>
|
||||
<p>或许你应该知道了,重构是怎样的,你也知道重构能带来什么。在我刚开始学重构和设计模式的时候,我需要去找一些好的示例,以便于我更好的学习。有时候不得不创造一些更好的场景,来实现这些功能。</p>
|
||||
<p>有一天,我发现当我需要我一次又一次地重复讲述某些内容,于是我就计划着把这些应该掌握的技能放到GitHub上,也就有了<a href="https://github.com/artisanstack">Artisan Stack</a> 计划。</p>
|
||||
<p>有一天,我发现当我需要我一次又一次地重复讲述某些内容,于是我就计划着把这些应该掌握的技能放到GitHub上,也就有了<a href="https://github.com/phodal-archive/artisanstack.github.io">Artisan Stack</a> 计划。</p>
|
||||
<p>每个程序员都不可避免地是一个Coder,一个没有掌握好技能的Coder,算不上是手工艺人,但是是手工人。</p>
|
||||
<p>艺,需要有创造性的方法。</p>
|
||||
<h2 id="为什么重构">为什么重构?</h2>
|
||||
|
|
@ -1358,7 +1358,7 @@ str <span class="op">=</span> <span class="at">listHandler</span>(str<span class
|
|||
<span class="cf">while</span> ((execStr <span class="op">=</span> <span class="va">regExpObject</span>.<span class="va">tables</span>.<span class="at">exec</span>(str)) <span class="op">!==</span> <span class="kw">null</span>) <span class="op">{</span>
|
||||
str <span class="op">=</span> <span class="at">tableHandler</span>(str<span class="op">,</span> execStr<span class="op">,</span> strict)<span class="op">;</span>
|
||||
<span class="op">}</span></code></pre></div>
|
||||
<p>然后你也看到了,上面有一堆重复的代码,接着让我们用JavaScript的<code>奇技浮巧</code>,即apply方法,把上面的重复代码变成。</p>
|
||||
<p>然后你也看到了,上面有一堆重复的代码,接着让我们用JavaScript的<code>奇技淫巧</code>,即apply方法,把上面的重复代码变成。</p>
|
||||
<div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript">[<span class="st">'code'</span><span class="op">,</span> <span class="st">'headline'</span><span class="op">,</span> <span class="st">'lists'</span><span class="op">,</span> <span class="st">'tables'</span><span class="op">,</span> <span class="st">'links'</span><span class="op">,</span> <span class="st">'mail'</span><span class="op">,</span> <span class="st">'url'</span><span class="op">,</span> <span class="st">'smlinks'</span><span class="op">,</span> <span class="st">'hr'</span>].<span class="at">forEach</span>(<span class="kw">function</span> (type) <span class="op">{</span>
|
||||
<span class="cf">while</span> ((stra <span class="op">=</span> regexobject[type].<span class="at">exec</span>(str)) <span class="op">!==</span> <span class="kw">null</span>) <span class="op">{</span>
|
||||
str <span class="op">=</span> that[(type <span class="op">+</span> <span class="st">'Handler'</span>)].<span class="at">apply</span>(that<span class="op">,</span> [stra<span class="op">,</span> str<span class="op">,</span> strict])<span class="op">;</span>
|
||||
|
|
@ -1381,16 +1381,16 @@ str <span class="op">=</span> <span class="at">tableHandler</span>(str<span clas
|
|||
<pre><code>编写测试->功能代码->修改测试->重构</code></pre>
|
||||
<p>上次在和buddy聊天的时候,才知道测试在功能简单的时候是后行的,在功能复杂不知道怎么下手的时候是先行的。</p>
|
||||
<p>开始之前请原谅我对于Java语言的一些无知,然后,看一下我写的Main函数:</p>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">package</span><span class="im"> com.phodal.learing;</span>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">package com.phodal.learing;</span>
|
||||
|
||||
<span class="kw">public</span> <span class="kw">class</span> Main {
|
||||
|
||||
<span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {
|
||||
<span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(String[] args) {
|
||||
<span class="dt">int</span> c=<span class="kw">new</span> <span class="fu">Cal</span>().<span class="fu">add</span>(<span class="dv">1</span>,<span class="dv">2</span>);
|
||||
<span class="dt">int</span> d=<span class="kw">new</span> <span class="fu">Cal2</span>().<span class="fu">sub</span>(<span class="dv">2</span>,<span class="dv">1</span>);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Hello,s"</span>);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(c);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(d);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Hello,s"</span>);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(c);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(d);
|
||||
}
|
||||
}</code></pre></div>
|
||||
<p>代码写得还好(自我感觉),先不管Cal和Cal2两个类。大部分都能看懂,除了c,d不知道他们表达的是什么意思,于是。</p>
|
||||
|
|
@ -1402,16 +1402,16 @@ str <span class="op">=</span> <span class="at">tableHandler</span>(str<span clas
|
|||
<li>把光标移到int d中的d,按下shift+f6,输入result_sub</li>
|
||||
</ul>
|
||||
<p>于是就有</p>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">package</span><span class="im"> com.phodal.learing;</span>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">package com.phodal.learing;</span>
|
||||
|
||||
<span class="kw">public</span> <span class="kw">class</span> Main {
|
||||
|
||||
<span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {
|
||||
<span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(String[] args) {
|
||||
<span class="dt">int</span> result_add=<span class="kw">new</span> <span class="fu">Cal</span>().<span class="fu">add</span>(<span class="dv">1</span>,<span class="dv">2</span>);
|
||||
<span class="dt">int</span> result_sub=<span class="kw">new</span> <span class="fu">Cal2</span>().<span class="fu">sub</span>(<span class="dv">2</span>,<span class="dv">1</span>);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Hello,s"</span>);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(result_add);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(result_sub);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Hello,s"</span>);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(result_add);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(result_sub);
|
||||
}
|
||||
}</code></pre></div>
|
||||
<h3 id="extract-method">Extract Method</h3>
|
||||
|
|
@ -1423,16 +1423,16 @@ str <span class="op">=</span> <span class="at">tableHandler</span>(str<span clas
|
|||
<li>在弹出的窗口中输入mprint</li>
|
||||
</ul>
|
||||
<p>于是有了</p>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(String[] args) {
|
||||
<span class="dt">int</span> result_add=<span class="kw">new</span> <span class="fu">Cal</span>().<span class="fu">add</span>(<span class="dv">1</span>,<span class="dv">2</span>);
|
||||
<span class="dt">int</span> result_sub=<span class="kw">new</span> <span class="fu">Cal2</span>().<span class="fu">sub</span>(<span class="dv">2</span>,<span class="dv">1</span>);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Hello,s"</span>);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Hello,s"</span>);
|
||||
<span class="fu">mprint</span>(result_add);
|
||||
<span class="fu">mprint</span>(result_sub);
|
||||
}
|
||||
|
||||
<span class="kw">private</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">mprint</span>(<span class="dt">int</span> result_sub) {
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(result_sub);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(result_sub);
|
||||
}</code></pre></div>
|
||||
<p>似乎我们不应该这样对待System.out.println,那么让我们内联回去</p>
|
||||
<h3 id="inline-method">Inline Method</h3>
|
||||
|
|
@ -1444,12 +1444,12 @@ str <span class="op">=</span> <span class="at">tableHandler</span>(str<span clas
|
|||
<li>选中Inline all invocations and remove the method(2 occurrences) 点确定</li>
|
||||
</ul>
|
||||
<p>然后我们等于什么也没有做了~~:</p>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(String[] args) {
|
||||
<span class="dt">int</span> result_add=<span class="kw">new</span> <span class="fu">Cal</span>().<span class="fu">add</span>(<span class="dv">1</span>,<span class="dv">2</span>);
|
||||
<span class="dt">int</span> result_sub=<span class="kw">new</span> <span class="fu">Cal2</span>().<span class="fu">sub</span>(<span class="dv">2</span>,<span class="dv">1</span>);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Hello,s"</span>);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(result_add);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(result_sub);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Hello,s"</span>);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(result_add);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(result_sub);
|
||||
}</code></pre></div>
|
||||
<p>似乎这个例子不是很好,但是够用来说明了。</p>
|
||||
<h3 id="pull-members-up">Pull Members Up</h3>
|
||||
|
|
@ -1489,7 +1489,7 @@ str <span class="op">=</span> <span class="at">tableHandler</span>(str<span clas
|
|||
<h4 id="重构之前">重构之前</h4>
|
||||
<p>过多的临时变量会让我们写出更长的函数,函数不应该太多,以便使功能单一。这也是重构的另外的目的所在,只有函数专注于其功能,才会更容易读懂。</p>
|
||||
<p>以书中的代码为例</p>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">import</span><span class="im"> java.lang.System;</span>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">import java.lang.System;</span>
|
||||
|
||||
<span class="kw">public</span> <span class="kw">class</span> replaceTemp {
|
||||
<span class="kw">public</span> <span class="dt">void</span> <span class="fu">count</span>() {
|
||||
|
|
@ -1507,7 +1507,7 @@ str <span class="op">=</span> <span class="at">tableHandler</span>(str<span clas
|
|||
<img src="./img/replace.jpg" alt="Replace Temp With Query" /><figcaption>Replace Temp With Query</figcaption>
|
||||
</figure>
|
||||
<p>便会返回</p>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">import</span><span class="im"> java.lang.System;</span>
|
||||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">import java.lang.System;</span>
|
||||
|
||||
<span class="kw">public</span> <span class="kw">class</span> replaceTemp {
|
||||
<span class="kw">public</span> <span class="dt">void</span> <span class="fu">count</span>() {
|
||||
|
|
@ -1534,9 +1534,9 @@ str <span class="op">=</span> <span class="at">tableHandler</span>(str<span clas
|
|||
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">public</span> <span class="kw">class</span> replaceTemp {
|
||||
|
||||
<span class="kw">public</span> <span class="dt">void</span> <span class="fu">method</span>() {
|
||||
<span class="bu">String</span> str = <span class="st">"str"</span>;
|
||||
<span class="bu">String</span> aString = <span class="fu">returnString</span>().<span class="fu">concat</span>(str);
|
||||
<span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(aString);
|
||||
String str = <span class="st">"str"</span>;
|
||||
String aString = <span class="fu">returnString</span>().<span class="fu">concat</span>(str);
|
||||
System.<span class="fu">out</span>.<span class="fu">println</span>(aString);
|
||||
}
|
||||
|
||||
}</code></pre></div>
|
||||
|
|
@ -1720,7 +1720,7 @@ public class replaceTemp {
|
|||
<p><strong>2014年1月1日零时到一时,用户在github上的操作,这里的用户指的是很多。。一共有4814条数据,从commit、create到issues都有。</strong></p>
|
||||
<h3 id="数据解析">数据解析</h3>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="im">import</span> json
|
||||
<span class="cf">for</span> line <span class="kw">in</span> <span class="bu">open</span>(jsonfile):
|
||||
<span class="cf">for</span> line <span class="op">in</span> <span class="bu">open</span>(jsonfile):
|
||||
line <span class="op">=</span> f.readline()</code></pre></div>
|
||||
<p>然后再解析json</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="im">import</span> dateutil.parser
|
||||
|
|
@ -1733,23 +1733,23 @@ date <span class="op">=</span> dateutil.parser.parse(lin[<span class="st">"
|
|||
dataarray <span class="op">=</span> []
|
||||
datacount <span class="op">=</span> <span class="dv">0</span>
|
||||
|
||||
<span class="cf">for</span> line <span class="kw">in</span> <span class="bu">open</span>(jsonfile):
|
||||
<span class="cf">for</span> line <span class="op">in</span> <span class="bu">open</span>(jsonfile):
|
||||
line <span class="op">=</span> f.readline()
|
||||
lin <span class="op">=</span> json.loads(line)
|
||||
date <span class="op">=</span> dateutil.parser.parse(lin[<span class="st">"created_at"</span>])
|
||||
datacount <span class="op">+=</span> <span class="dv">1</span>
|
||||
dataarray.append(date.minute)
|
||||
|
||||
minuteswithcount <span class="op">=</span> [(x, dataarray.count(x)) <span class="cf">for</span> x <span class="kw">in</span> <span class="bu">set</span>(dataarray)]
|
||||
minuteswithcount <span class="op">=</span> [(x, dataarray.count(x)) <span class="cf">for</span> x <span class="op">in</span> <span class="bu">set</span>(dataarray)]
|
||||
f.close()
|
||||
<span class="cf">return</span> minuteswithcount</code></pre></div>
|
||||
<p>下面这句代码就是将上面的解析为</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python">minuteswithcount <span class="op">=</span> [(x, dataarray.count(x)) <span class="cf">for</span> x <span class="kw">in</span> <span class="bu">set</span>(dataarray)]</code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python">minuteswithcount <span class="op">=</span> [(x, dataarray.count(x)) <span class="cf">for</span> x <span class="op">in</span> <span class="bu">set</span>(dataarray)]</code></pre></div>
|
||||
<p>这样的数组以便于解析</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python">[(<span class="dv">0</span>, <span class="dv">92</span>), (<span class="dv">1</span>, <span class="dv">67</span>), (<span class="dv">2</span>, <span class="dv">86</span>), (<span class="dv">3</span>, <span class="dv">73</span>), (<span class="dv">4</span>, <span class="dv">76</span>), (<span class="dv">5</span>, <span class="dv">67</span>), (<span class="dv">6</span>, <span class="dv">61</span>), (<span class="dv">7</span>, <span class="dv">71</span>), (<span class="dv">8</span>, <span class="dv">62</span>), (<span class="dv">9</span>, <span class="dv">71</span>), (<span class="dv">10</span>, <span class="dv">70</span>), (<span class="dv">11</span>, <span class="dv">79</span>), (<span class="dv">12</span>, <span class="dv">62</span>), (<span class="dv">13</span>, <span class="dv">67</span>), (<span class="dv">14</span>, <span class="dv">76</span>), (<span class="dv">15</span>, <span class="dv">67</span>), (<span class="dv">16</span>, <span class="dv">74</span>), (<span class="dv">17</span>, <span class="dv">48</span>), (<span class="dv">18</span>, <span class="dv">78</span>), (<span class="dv">19</span>, <span class="dv">73</span>), (<span class="dv">20</span>, <span class="dv">89</span>), (<span class="dv">21</span>, <span class="dv">62</span>), (<span class="dv">22</span>, <span class="dv">74</span>), (<span class="dv">23</span>, <span class="dv">61</span>), (<span class="dv">24</span>, <span class="dv">71</span>), (<span class="dv">25</span>, <span class="dv">49</span>), (<span class="dv">26</span>, <span class="dv">59</span>), (<span class="dv">27</span>, <span class="dv">59</span>), (<span class="dv">28</span>, <span class="dv">58</span>), (<span class="dv">29</span>, <span class="dv">74</span>), (<span class="dv">30</span>, <span class="dv">69</span>), (<span class="dv">31</span>, <span class="dv">59</span>), (<span class="dv">32</span>, <span class="dv">89</span>), (<span class="dv">33</span>, <span class="dv">67</span>), (<span class="dv">34</span>, <span class="dv">66</span>), (<span class="dv">35</span>, <span class="dv">77</span>), (<span class="dv">36</span>, <span class="dv">64</span>), (<span class="dv">37</span>, <span class="dv">71</span>), (<span class="dv">38</span>, <span class="dv">75</span>), (<span class="dv">39</span>, <span class="dv">66</span>), (<span class="dv">40</span>, <span class="dv">62</span>), (<span class="dv">41</span>, <span class="dv">77</span>), (<span class="dv">42</span>, <span class="dv">82</span>), (<span class="dv">43</span>, <span class="dv">95</span>), (<span class="dv">44</span>, <span class="dv">77</span>), (<span class="dv">45</span>, <span class="dv">65</span>), (<span class="dv">46</span>, <span class="dv">59</span>), (<span class="dv">47</span>, <span class="dv">60</span>), (<span class="dv">48</span>, <span class="dv">54</span>), (<span class="dv">49</span>, <span class="dv">66</span>), (<span class="dv">50</span>, <span class="dv">74</span>), (<span class="dv">51</span>, <span class="dv">61</span>), (<span class="dv">52</span>, <span class="dv">71</span>), (<span class="dv">53</span>, <span class="dv">90</span>), (<span class="dv">54</span>, <span class="dv">64</span>), (<span class="dv">55</span>, <span class="dv">67</span>), (<span class="dv">56</span>, <span class="dv">67</span>), (<span class="dv">57</span>, <span class="dv">55</span>), (<span class="dv">58</span>, <span class="dv">68</span>), (<span class="dv">59</span>, <span class="dv">91</span>)]</code></pre></div>
|
||||
<h3 id="matplotlib">Matplotlib</h3>
|
||||
<p>开始之前需要安装``matplotlib</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="fu">sudo</span> pip install matplotlib</code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">sudo</span> pip install matplotlib</code></pre></div>
|
||||
<p>然后引入这个库</p>
|
||||
<pre><code> import matplotlib.pyplot as plt</code></pre>
|
||||
<p>如上面的那个结果,只需要</p>
|
||||
|
|
@ -1775,14 +1775,14 @@ date <span class="op">=</span> dateutil.parser.parse(lin[<span class="st">"
|
|||
dataarray <span class="op">=</span> []
|
||||
datacount <span class="op">=</span> <span class="dv">0</span>
|
||||
|
||||
<span class="cf">for</span> line <span class="kw">in</span> <span class="bu">open</span>(jsonfile):
|
||||
<span class="cf">for</span> line <span class="op">in</span> <span class="bu">open</span>(jsonfile):
|
||||
line <span class="op">=</span> f.readline()
|
||||
lin <span class="op">=</span> json.loads(line)
|
||||
date <span class="op">=</span> dateutil.parser.parse(lin[<span class="st">"created_at"</span>])
|
||||
datacount <span class="op">+=</span> <span class="dv">1</span>
|
||||
dataarray.append(date.minute)
|
||||
|
||||
minuteswithcount <span class="op">=</span> [(x, dataarray.count(x)) <span class="cf">for</span> x <span class="kw">in</span> <span class="bu">set</span>(dataarray)]
|
||||
minuteswithcount <span class="op">=</span> [(x, dataarray.count(x)) <span class="cf">for</span> x <span class="op">in</span> <span class="bu">set</span>(dataarray)]
|
||||
f.close()
|
||||
<span class="cf">return</span> minuteswithcount
|
||||
|
||||
|
|
@ -1791,7 +1791,7 @@ date <span class="op">=</span> dateutil.parser.parse(lin[<span class="st">"
|
|||
x <span class="op">=</span> []
|
||||
y <span class="op">=</span> []
|
||||
mwcs <span class="op">=</span> parse_data(files)
|
||||
<span class="cf">for</span> mwc <span class="kw">in</span> mwcs:
|
||||
<span class="cf">for</span> mwc <span class="op">in</span> mwcs:
|
||||
x.append(mwc[<span class="dv">0</span>])
|
||||
y.append(mwc[<span class="dv">1</span>])
|
||||
|
||||
|
|
@ -1845,7 +1845,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
<p>重写了一个新的方法用于计算提交数,直至后面才意识到其实我们可以算行数就够了,但是方法上有点hack</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="kw">def</span> get_minutes_counts_with_id(jsonfile):
|
||||
datacount, dataarray <span class="op">=</span> handle_json(jsonfile)
|
||||
minuteswithcount <span class="op">=</span> [(x, dataarray.count(x)) <span class="cf">for</span> x <span class="kw">in</span> <span class="bu">set</span>(dataarray)]
|
||||
minuteswithcount <span class="op">=</span> [(x, dataarray.count(x)) <span class="cf">for</span> x <span class="op">in</span> <span class="bu">set</span>(dataarray)]
|
||||
<span class="cf">return</span> minuteswithcount
|
||||
|
||||
|
||||
|
|
@ -1854,7 +1854,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
dataarray <span class="op">=</span> []
|
||||
datacount <span class="op">=</span> <span class="dv">0</span>
|
||||
|
||||
<span class="cf">for</span> line <span class="kw">in</span> <span class="bu">open</span>(jsonfile):
|
||||
<span class="cf">for</span> line <span class="op">in</span> <span class="bu">open</span>(jsonfile):
|
||||
line <span class="op">=</span> f.readline()
|
||||
lin <span class="op">=</span> json.loads(line)
|
||||
date <span class="op">=</span> dateutil.parser.parse(lin[<span class="st">"created_at"</span>])
|
||||
|
|
@ -1876,7 +1876,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
<span class="co"> :rtype : object</span>
|
||||
<span class="co"> """</span>
|
||||
monthdaycount <span class="op">=</span> []
|
||||
<span class="cf">for</span> i <span class="kw">in</span> <span class="bu">range</span>(<span class="dv">1</span>, <span class="dv">20</span>):
|
||||
<span class="cf">for</span> i <span class="op">in</span> <span class="bu">range</span>(<span class="dv">1</span>, <span class="dv">20</span>):
|
||||
<span class="cf">if</span> i <span class="op"><</span> <span class="dv">10</span>:
|
||||
filename <span class="op">=</span> <span class="st">'data/2014-02-0'</span> <span class="op">+</span> i.<span class="fu">__str__</span>() <span class="op">+</span> <span class="st">'-0.json'</span>
|
||||
<span class="cf">else</span>:
|
||||
|
|
@ -1896,7 +1896,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
plt.plot(results.<span class="fu">__getslice__</span>(<span class="dv">14</span>, <span class="dv">21</span>), label<span class="op">=</span><span class="st">"third week"</span>)
|
||||
plt.legend()
|
||||
plt.show()</code></pre></div>
|
||||
<p>蓝色的是第一周,绿色的是第二周,蓝色的是第三周就有了上面的结果。</p>
|
||||
<p>蓝色的是第一周,绿色的是第二周,红色的是第三周就有了上面的结果。</p>
|
||||
<p>我们还需要优化方法,以及多线程的支持。</p>
|
||||
<p>让我们分析之前的程序,然后再想办法做出优化。网上看到一篇文章<a href="http://www.huyng.com/posts/python-performance-analysis/" class="uri">http://www.huyng.com/posts/python-performance-analysis/</a>讲的就是分析这部分内容的。</p>
|
||||
<h2 id="存储到数据库中">存储到数据库中</h2>
|
||||
|
|
@ -1911,43 +1911,43 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
count <span class="op">=</span> <span class="dv">0</span>
|
||||
userinfo <span class="op">=</span> []
|
||||
condition <span class="op">=</span> <span class="st">'select * from userinfo where owener = </span><span class="ch">\'</span><span class="st">'</span> <span class="op">+</span> <span class="bu">str</span>(username) <span class="op">+</span> <span class="st">'</span><span class="ch">\'</span><span class="st">'</span>
|
||||
<span class="cf">for</span> zero <span class="kw">in</span> c.execute(condition):
|
||||
<span class="cf">for</span> zero <span class="op">in</span> c.execute(condition):
|
||||
count <span class="op">+=</span> <span class="dv">1</span>
|
||||
userinfo.append(zero)
|
||||
|
||||
<span class="cf">return</span> count, userinfo</code></pre></div>
|
||||
<p>当我查询<code>gmszone</code>的时候,也就是我自己就会有如下的结果</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">(</span><span class="ex">u</span><span class="st">'gmszone'</span>, u<span class="st">'ForkEvent'</span>, u<span class="st">'RESUME'</span>, u<span class="st">'TeX'</span>, u<span class="st">'https://github.com/gmszone/RESUME'</span><span class="kw">)</span>
|
||||
<span class="kw">(</span><span class="ex">u</span><span class="st">'gmszone'</span>, u<span class="st">'WatchEvent'</span>, u<span class="st">'iot-dashboard'</span>, u<span class="st">'JavaScript'</span>, u<span class="st">'https://github.com/gmszone/iot-dashboard'</span><span class="kw">)</span>
|
||||
<span class="kw">(</span><span class="ex">u</span><span class="st">'gmszone'</span>, u<span class="st">'PushEvent'</span>, u<span class="st">'wechat-wordpress'</span>, u<span class="st">'Ruby'</span>, u<span class="st">'https://github.com/gmszone/wechat-wordpress'</span><span class="kw">)</span>
|
||||
<span class="kw">(</span><span class="ex">u</span><span class="st">'gmszone'</span>, u<span class="st">'WatchEvent'</span>, u<span class="st">'iot'</span>, u<span class="st">'JavaScript'</span>, u<span class="st">'https://github.com/gmszone/iot'</span><span class="kw">)</span>
|
||||
<span class="kw">(</span><span class="ex">u</span><span class="st">'gmszone'</span>, u<span class="st">'CreateEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'None'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="kw">(</span><span class="ex">u</span><span class="st">'gmszone'</span>, u<span class="st">'CreateEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'None'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="kw">(</span><span class="ex">u</span><span class="st">'gmszone'</span>, u<span class="st">'PushEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'TeX'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="kw">(</span><span class="ex">u</span><span class="st">'gmszone'</span>, u<span class="st">'PushEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'TeX'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="kw">(</span><span class="ex">u</span><span class="st">'gmszone'</span>, u<span class="st">'PushEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'TeX'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="ex">109</span></code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">(u</span><span class="st">'gmszone'</span>, u<span class="st">'ForkEvent'</span>, u<span class="st">'RESUME'</span>, u<span class="st">'TeX'</span>, u<span class="st">'https://github.com/gmszone/RESUME'</span><span class="kw">)</span>
|
||||
<span class="kw">(u</span><span class="st">'gmszone'</span>, u<span class="st">'WatchEvent'</span>, u<span class="st">'iot-dashboard'</span>, u<span class="st">'JavaScript'</span>, u<span class="st">'https://github.com/gmszone/iot-dashboard'</span><span class="kw">)</span>
|
||||
<span class="kw">(u</span><span class="st">'gmszone'</span>, u<span class="st">'PushEvent'</span>, u<span class="st">'wechat-wordpress'</span>, u<span class="st">'Ruby'</span>, u<span class="st">'https://github.com/gmszone/wechat-wordpress'</span><span class="kw">)</span>
|
||||
<span class="kw">(u</span><span class="st">'gmszone'</span>, u<span class="st">'WatchEvent'</span>, u<span class="st">'iot'</span>, u<span class="st">'JavaScript'</span>, u<span class="st">'https://github.com/gmszone/iot'</span><span class="kw">)</span>
|
||||
<span class="kw">(u</span><span class="st">'gmszone'</span>, u<span class="st">'CreateEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'None'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="kw">(u</span><span class="st">'gmszone'</span>, u<span class="st">'CreateEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'None'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="kw">(u</span><span class="st">'gmszone'</span>, u<span class="st">'PushEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'TeX'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="kw">(u</span><span class="st">'gmszone'</span>, u<span class="st">'PushEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'TeX'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="kw">(u</span><span class="st">'gmszone'</span>, u<span class="st">'PushEvent'</span>, u<span class="st">'iot-doc'</span>, u<span class="st">'TeX'</span>, u<span class="st">'https://github.com/gmszone/iot-doc'</span><span class="kw">)</span>
|
||||
<span class="kw">109</span></code></pre></div>
|
||||
<p>一共有109个事件,有<code>Watch</code>,<code>Create</code>,<code>Push</code>,<code>Fork</code>还有其他的, 项目主要有<code>iot</code>,<code>RESUME</code>,<code>iot-dashboard</code>,<code>wechat-wordpress</code>, 接着就是语言了,<code>Tex</code>,<code>Javascript</code>,<code>Ruby</code>,接着就是项目的url了。</p>
|
||||
<p>值得注意的是。</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="ex">-rw-r--r--</span> 1 fdhuang staff 905M Apr 12 14:59 userdata.db</code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">-rw-r--r--</span> 1 fdhuang staff 905M Apr 12 14:59 userdata.db</code></pre></div>
|
||||
<p>这个数据库文件有<strong>905M</strong>,不过查询结果相当让人满意,至少相对于原来的结果来说。</p>
|
||||
<p>Python自带了对SQLite3的支持,然而我们还需要安装SQLite3</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="ex">brew</span> install sqlite3</code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">brew</span> install sqlite3</code></pre></div>
|
||||
<p>或者是</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="fu">sudo</span> port install sqlite3</code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">sudo</span> port install sqlite3</code></pre></div>
|
||||
<p>或者是Ubuntu的</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="fu">sudo</span> apt-get install sqlite3</code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">sudo</span> apt-get install sqlite3</code></pre></div>
|
||||
<p>openSUSE自然就是</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="fu">sudo</span> zypper install sqlite3</code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">sudo</span> zypper install sqlite3</code></pre></div>
|
||||
<p>不过,用yast2也很不错,不是么。。</p>
|
||||
<h3 id="数据导入">数据导入</h3>
|
||||
<p>需要注意的是这里是需要python2.7,起源于对gzip的上下文管理器的支持问题</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="kw">def</span> handle_gzip_file(filename):
|
||||
userinfo <span class="op">=</span> []
|
||||
<span class="cf">with</span> gzip.GzipFile(filename) <span class="im">as</span> f:
|
||||
events <span class="op">=</span> [line.decode(<span class="st">"utf-8"</span>, errors<span class="op">=</span><span class="st">"ignore"</span>) <span class="cf">for</span> line <span class="kw">in</span> f]
|
||||
events <span class="op">=</span> [line.decode(<span class="st">"utf-8"</span>, errors<span class="op">=</span><span class="st">"ignore"</span>) <span class="cf">for</span> line <span class="op">in</span> f]
|
||||
|
||||
<span class="cf">for</span> n, line <span class="kw">in</span> <span class="bu">enumerate</span>(events):
|
||||
<span class="cf">for</span> n, line <span class="op">in</span> <span class="bu">enumerate</span>(events):
|
||||
<span class="cf">try</span>:
|
||||
event <span class="op">=</span> json.loads(line)
|
||||
<span class="cf">except</span>:
|
||||
|
|
@ -1956,7 +1956,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
|
||||
actor <span class="op">=</span> event[<span class="st">"actor"</span>]
|
||||
attrs <span class="op">=</span> event.get(<span class="st">"actor_attributes"</span>, {})
|
||||
<span class="cf">if</span> actor <span class="kw">is</span> <span class="va">None</span> <span class="kw">or</span> attrs.get(<span class="st">"type"</span>) <span class="op">!=</span> <span class="st">"User"</span>:
|
||||
<span class="cf">if</span> actor <span class="op">is</span> <span class="va">None</span> <span class="op">or</span> attrs.get(<span class="st">"type"</span>) <span class="op">!=</span> <span class="st">"User"</span>:
|
||||
<span class="cf">continue</span>
|
||||
|
||||
key <span class="op">=</span> actor.lower()
|
||||
|
|
@ -1976,7 +1976,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
year <span class="op">=</span> <span class="dv">2014</span>
|
||||
month <span class="op">=</span> <span class="dv">3</span>
|
||||
|
||||
<span class="cf">for</span> day <span class="kw">in</span> <span class="bu">range</span>(<span class="dv">1</span>,<span class="dv">31</span>):
|
||||
<span class="cf">for</span> day <span class="op">in</span> <span class="bu">range</span>(<span class="dv">1</span>,<span class="dv">31</span>):
|
||||
date_re <span class="op">=</span> re.<span class="bu">compile</span>(<span class="vs">r"([0-9]</span><span class="sc">{4}</span><span class="vs">)-([0-9]</span><span class="sc">{2}</span><span class="vs">)-([0-9]</span><span class="sc">{2}</span><span class="vs">)-([0-9]+)\.json.gz"</span>)
|
||||
|
||||
fn_template <span class="op">=</span> os.path.join(<span class="st">"march"</span>,
|
||||
|
|
@ -1984,7 +1984,7 @@ draw_date(<span class="st">"data/2014-01-01-0.json"</span>)</code></pr
|
|||
kwargs <span class="op">=</span> {<span class="st">"year"</span>: year, <span class="st">"month"</span>: month, <span class="st">"day"</span>: day, <span class="st">"n"</span>: <span class="st">"*"</span>}
|
||||
filenames <span class="op">=</span> glob.glob(fn_template.<span class="bu">format</span>(<span class="op">**</span>kwargs))
|
||||
|
||||
<span class="cf">for</span> filename <span class="kw">in</span> filenames:
|
||||
<span class="cf">for</span> filename <span class="op">in</span> filenames:
|
||||
c.executemany(<span class="st">'INSERT INTO userinfo VALUES (?,?,?,?,?)'</span>, handle_gzip_file(filename))
|
||||
|
||||
conn.commit()
|
||||
|
|
@ -2010,11 +2010,11 @@ pipe <span class="op">=</span> pipe <span class="op">=</span> r.pipeline()
|
|||
pipe.zscore(<span class="st">'osrc:user'</span>,<span class="st">"gmszone"</span>)
|
||||
pipe.execute()</code></pre></div>
|
||||
<p>系统返回了<code>227.0</code>,试试别人。</p>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="op">>>></span> <span class="ex">pipe.zscore</span>(<span class="st">'osrc:user'</span>,<span class="st">"dfm"</span>)
|
||||
<span class="op"><</span><span class="ex">redis.client.StrictPipeline</span> object at 0x104fa7f<span class="op">50></span>
|
||||
<span class="op">>>></span> <span class="ex">pipe.execute</span>()
|
||||
[<span class="ex">425.0</span>]
|
||||
<span class="op">>>></span></code></pre></div>
|
||||
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">>>></span> <span class="kw">pipe.zscore</span>(<span class="st">'osrc:user'</span>,<span class="st">"dfm"</span>)
|
||||
<span class="kw"><redis.client.StrictPipeline</span> object at 0x104fa7f<span class="kw">50></span>
|
||||
<span class="kw">>>></span> <span class="kw">pipe.execute</span>()
|
||||
[<span class="kw">425.0</span>]
|
||||
<span class="kw">>>></span></code></pre></div>
|
||||
<p>看看主要是在哪一天提交的</p>
|
||||
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="op">>>></span> pipe.hgetall(<span class="st">'osrc:user:gmszone:day'</span>)
|
||||
<span class="op"><</span>redis.client.StrictPipeline <span class="bu">object</span> at <span class="bn">0x104fa7f50</span><span class="op">></span>
|
||||
|
|
@ -2041,7 +2041,7 @@ pipe.execute()</code></pre></div>
|
|||
|
||||
r <span class="op">=</span> redis.StrictRedis(host<span class="op">=</span><span class="st">'localhost'</span>, port<span class="op">=</span><span class="dv">6379</span>, db<span class="op">=</span><span class="dv">0</span>)
|
||||
no_pipe <span class="op">=</span> <span class="va">False</span>
|
||||
<span class="cf">if</span> pipe <span class="kw">is</span> <span class="va">None</span>:
|
||||
<span class="cf">if</span> pipe <span class="op">is</span> <span class="va">None</span>:
|
||||
pipe <span class="op">=</span> pipe <span class="op">=</span> r.pipeline()
|
||||
no_pipe <span class="op">=</span> <span class="va">True</span>
|
||||
|
||||
|
|
@ -2097,12 +2097,12 @@ pipe.execute()</code></pre></div>
|
|||
points[<span class="dv">0</span>] <span class="op">=</span> <span class="fl">1.0</span> <span class="op">/</span> (total <span class="op">+</span> <span class="dv">1</span>)
|
||||
|
||||
<span class="co"># Week means.</span>
|
||||
<span class="cf">for</span> k, v <span class="kw">in</span> results[<span class="dv">1</span>].iteritems():
|
||||
<span class="cf">for</span> k, v <span class="op">in</span> results[<span class="dv">1</span>].iteritems():
|
||||
points[<span class="dv">1</span> <span class="op">+</span> <span class="bu">int</span>(k)] <span class="op">=</span> <span class="bu">float</span>(v) <span class="op">/</span> total
|
||||
|
||||
<span class="co"># Event types.</span>
|
||||
n <span class="op">=</span> <span class="dv">8</span>
|
||||
<span class="cf">for</span> k, v <span class="kw">in</span> results[<span class="dv">2</span>]:
|
||||
<span class="cf">for</span> k, v <span class="op">in</span> results[<span class="dv">2</span>]:
|
||||
points[n <span class="op">+</span> evttypes.index(k)] <span class="op">=</span> <span class="bu">float</span>(v) <span class="op">/</span> total
|
||||
|
||||
<span class="co"># Number of contributions, connections and languages.</span>
|
||||
|
|
@ -2114,8 +2114,8 @@ pipe.execute()</code></pre></div>
|
|||
|
||||
<span class="co"># Top languages.</span>
|
||||
n <span class="op">+=</span> <span class="dv">4</span>
|
||||
<span class="cf">for</span> k, v <span class="kw">in</span> results[<span class="dv">7</span>]:
|
||||
<span class="cf">if</span> k <span class="kw">in</span> langs:
|
||||
<span class="cf">for</span> k, v <span class="op">in</span> results[<span class="dv">7</span>]:
|
||||
<span class="cf">if</span> k <span class="op">in</span> langs:
|
||||
points[n <span class="op">+</span> langs.index(k)] <span class="op">=</span> <span class="bu">float</span>(v) <span class="op">/</span> total
|
||||
<span class="cf">else</span>:
|
||||
<span class="co"># Unknown language.</span>
|
||||
|
|
@ -2212,7 +2212,7 @@ pipe.execute()</code></pre></div>
|
|||
<figure>
|
||||
<img src="./img/longest-streak.png" alt="Longest Streak" /><figcaption>Longest Streak</figcaption>
|
||||
</figure>
|
||||
<p><code>在停地造轮子的过程中,也不停地造车子。</code></p>
|
||||
<p><code>在不停地造轮子的过程中,也不停地造车子。</code></p>
|
||||
<p>在那篇连续冲击365天的文章出现之前,我们公司的大大(<a href="https://github.com/dreamhead" class="uri">https://github.com/dreamhead</a>)也曾经在公司内部说过,天天commit什么的。当然这不是我的动力,在连击140天之前</p>
|
||||
<ul>
|
||||
<li>给过google的<code>ngx_speed</code>、<code>node-coap</code>等项目创建过pull request</li>
|
||||
|
|
@ -2446,7 +2446,7 @@ pipe.execute()</code></pre></div>
|
|||
<p><strong>创造是一种知识的再掌握过程。</strong></p>
|
||||
<p>回顾一下写echoesworks的过程,一开始我需要的是一个网页版的PPT,当然这类的东西已经有很多了,如impress.js、bespoke.js等等。分析一下所需要的功能:markdown解析器、键盘事件处理、Ajax、进度条显示、图片处理、Slide。我们可以在GitHub上找到各式各样的模块,我们所要做的就是将之结合在一样。在那之前,我试着用类似的原理写(组合)了<a href="https://github.com/phodal/lettuce">Lettuce</a>。</p>
|
||||
<p>组合相比于创造过程是一个更有挑战性的过程,我们需要在这过程去设计胶水来粘合这些代码,并在最终可以让他工作。这好比是我们在平时接触到的任务划分,每个人负责相应的模块,最后整合。</p>
|
||||
<p>想似的我在写<a href="https://github.com/phodal/lan">lan</a>的时候,也是类似的,但是不同的是我已经设计了一个清晰的架构图。</p>
|
||||
<p>我在写<a href="https://github.com/phodal/lan">lan</a>的时候,也是类似的,但是不同的是我已经设计了一个清晰的架构图。</p>
|
||||
<figure>
|
||||
<img src="./img/lan-iot.jpg" alt="Lan IoT" /><figcaption>Lan IoT</figcaption>
|
||||
</figure>
|
||||
|
|
|
|||
Loading…
Reference in a new issue