对Stack Overflow的思考

我大约在2015年的年末注册了Stack Overflow(下面简称SO)。那时候正在学Python,在Google上搜索编程方面的问题,跳出来的很多结果都是SO上面的,于是顺便注册了一个账号。直到最近才开始使用它,发现这不是一个普通的网站。

Stack Overflow是什么?

简单的说,这是一个问答网站(包括StackExchange),有人提出关于编程的问题,然后有人来回答。

每一个用户在SO都有一个Reputation值(声誉),类似于积分。你回答的问题得到了vote up(+10),或是被提问者接受(+15),你会获得相应的reputation。而如果你做了坏事,乱写答案被vote down(-2),发表不友善的内容被六个人标记(-100),你会被减掉相应的reputation。一定的reputation可以解锁Privileges(特权),privileges控制着你在SO上的权限。简单列举几个:

  • 15个reputation可以vote up;
  • 50个reputation可以对问题进行评论;
  • 125个reputation可以vote down(同时减掉一个reputation);
  • 1500个reputation可以创建标签;
  • 2000个reputation可以修改别人的问题和答案;
  • 25000个reputation可以获得里程碑特权(Milestone Privilege),这时你可以接触到网站的内部数据。

这样的声誉系统和特权系统带来的是什么呢?一个由社区用户们运行和管理的,有着良好的秩序、效率和氛围的问答网站。 除此之外,SO还有成就系统和影响力数据。一共有金银铜三种勋章,当你完成了特定的任务后就可以获得。而影响力是你的答案帮到了多少人,和你的其他活动数量:投票,标记和修改。

Stack Overflow的介绍

Stack Overflow的介绍

和知乎的对比

既然是问答网站,免不了想把知乎拿来比一比。知乎上的太多问题(缺点)在SO上都能找到相应的解决方案。在网站内容上,SO不欢迎任何讨论性的,非Problem-Solving类的问题。而知乎上的内容过于混杂,几乎所有值得不值得讨论的问题都有。很多问题仅仅是为了引起一些讨论,而不是要解决什么问题。比如典型的“如何看待XXX”。经常看到的现象是,有相同观点和价值观的人在这里抱成一团,一起打压和攻击其他意见。

知乎上的赞成和反对更多的是用户基于对答案里的观点和价值观的(主观)喜好来判断的(这两个词本身就能说明一些问题)。对于提问者来说的好答案可能还没有取悦观众们的差答案票数高。

知乎的社区管理却是实在的短板,新用户可以随便的投反对票,修改答案,攻击侮辱别人,发表充满恶意的评论。对回答也没有限制,任何人都可以发言,不管你有没有在回答问题。而在SO上,你要做这些事情,得先解决别人的问题,然后获得reputation来解锁这些权限。在SO上,你几乎看不到攻击,批评和嘲笑。因为你的任何非善意的答案和评论都会被别人标记,当你收到六个垃圾信息标记或攻击性标记时,你的reputation将会被减去100(你的回答被接受才得到15个reputation!)。当你提的问题太宽泛,不涉及具体的问题,或是太简单时会很快被关闭,当你的回答不合适时也会有人来提醒和投票删除,或是vote down。而你的没有帮助的回答,和自我营销式的信息(知乎上很多见)会被投票删除,或是vote down。

在SO的帮助中心里,有这样的文章:

在帮助中心的《Be Nice》的末尾是这样写的:

We’re proud to be a large, user-driven space on the internet where name-calling, harassment, and other online nastiness are almost non-existent. It’s up to all of us to keep it that way.

In summary, have fun, and be good to each other.

(我们感到骄傲的是,作为一个庞大的,用户驱动的网络空间里,在这里,辱骂、骚扰和其他网络污秽几乎不存在。是我们大家一起维护着这个良好的环境。

综上,找点乐子,互相友好。)

不完美的完美

SO的创建人之一(Jeff Atwood)在博客里写了这些话:

Stack Overflow is you. This is the scary part, the great leap of faith that Stack Overflow is predicated on: trusting your fellow programmers. The programmers who choose to participate in Stack Overflow are the “secret sauce” that makes it work. You are the reason I continue to believe in developer community as the greatest source of learning and growth. You are the reason I continue to get so many positive emails and testimonials about Stack Overflow. I can’t take credit for that. But you can. I learned the collective power of my fellow programmers long ago writing on Coding Horror. The community is far, far smarter than I will ever be. All I can ask — all any of us can ask — is to help each other along the path. And if your fellow programmers decide to recognize you for that, then I say you’ve well and truly earned it.

当然,SO并不完美。这个SO用户是top 2%的用户(24898 reputation),他写了一篇文章叫Why I no longer contribute to StackOverflow(为什么我不再为Stack Overflow社区贡献),文章里讲了很多SO的问题。比如过于严格的内容控制,不合理的奖励机制,授人以鱼式的教育等等。

这些问题的确存在,但相对来说,SO是个很棒的社区,值得我去做点什么。

我的资料页

这是我的账号:lihui

Markdown——简单的世界

Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber)。它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档”。
—— 维基百科

很早就接触到Markdown,但投入使用是从用Github和Stack Overflow开始的。使用Markdown,你不用再和难用的编辑器纠缠,手也不用离开键盘,这让你更专注于内容本身。

 

基本用法

Phrase Emphasis

*italic*   **bold**
_italic_   __bold__

Links

Inline:

An [example](http://url.com/ "Title")

Reference-style labels (titles are optional):

An [example][id]. Then, anywhere
else in the doc, define the link:

  [id]: http://example.com/  "Title"

Images

Inline (titles are optional):

![alt text](/path/img.jpg "Title")

Reference-style:

![alt text][id]

[id]: /url/to/img.jpg "Title"

Headers

Setext-style:

Header 1
========

Header 2
--------

atx-style (closing #’s are optional):

# Header 1 #

## Header 2 ##

###### Header 6

Lists

Ordered, without paragraphs:

1.  Foo
2.  Bar

Unordered, with paragraphs:

*   A list item.

    With multiple paragraphs.

*   Bar

You can nest them:

*   Abacus
    * answer
*   Bubbles
    1.  bunk
    2.  bupkis
        * BELITTLER
    3. burper
*   Cunning

Blockquotes

> Email-style angle brackets
> are used for blockquotes.

> > And, they can be nested.

> #### Headers in blockquotes
> 
> * You can quote a list.
> * Etc.

Code Spans

`<code>` spans are delimited
by backticks.

You can include literal backticks
like `` `this` ``.

Preformatted Code Blocks

Indent every line of a code block by at least 4 spaces or 1 tab.

This is a normal paragraph.

    This is a preformatted
    code block.

Horizontal Rules

Three or more dashes or asterisks:

---

* * *

- - - - 

Manual Line Breaks

End a line with two or more spaces:

Roses are red,   
Violets are blue.

 

其他规则

  • 支持HTML标签,可以自由的插入HTML。
  • 自动转义特殊字符:“&”和“<”。
  • 如果你想显示一个被用作标记的符号,使用反斜线进行转义。比如下面这行将不会加粗文本,而只是显示出两个星号。
\*literal asterisks\*
  • 可以被转义的符号:
\   backslash
`   backtick
*   asterisk
_   underscore
{}  curly braces
[]  square brackets
()  parentheses
#   hash mark
+   plus sign
-   minus sign (hyphen)
.   dot
!   exclamation mark

 

编辑器

大部分编辑器都能实现即时预览和PDF、HTML文件输出。下面的推荐来自维基百科的Markdown词条页面

  • Cmd Markdown Cmd Markdown 编辑阅读器,支持实时同步预览,区分写作和阅读模式,支持在线存储,分享文稿网址。
  • Dillinger.io 一个在线Markdown编辑器,提供实时预览以及到 GitHubDropbox 的拓展连接。
  • notepag 另一个在线Markdown编辑器,支持实时预览,提供临时网址和和密码,可以分享给其他人。
  • 简书 一个在线Markdown编辑器与阅读社区,支持实时预览,提供分享网址。
  • Mou 一个Mac OS X上的Markdown编辑器。
  • MacDown OS X 上的 Markdown 开源编辑器,作者称其深受 Mou 启发。
  • MarkdownPad Windows上的全功能Markdown编辑器。
  • WMD a Javascript “WYSIWYM” editor for Markdown (from AttackLab)
  • PageDown 一个Javascript写的 “WYSIWYM”(所见即所得)Markdown编辑器 (来自 StackOverflow)
  • IPython Notebook 以IPython为后台,利用浏览器做IDE,支持Markdown与LaTex公式。

 

参考链接

2016下半年计划

生活里有很多内容和细节,让人很容易沉浸。在某一方面这是好事,这是心理学上的精神贯注和心流(Flow)。但如果贯注的对象是错的,那就不是件好事了。如果你对盗版没有道德判断,又缺乏自律,那么网上有无数的电影,音乐,资料,足以让你变成下载狂。如果你贯注的对象是金钱,那么你很容易变成唯利是图的人。

这就是为什么人需要计划。计划让你远离不重要的细节和琐碎,让你不再关注电脑换什么壁纸、拖鞋买什么颜色、最近出了什么新手机。(如果你是开鞋店和手机店的,那当我没说。:)

不知道怎么做计划?先认识和了解自己,找到你的目标,找到对自己来说生活中最重要的事情。分解你的目标,关注你的重点。然后列出计划来。

 

主要目标

  1. 完成写作计划(100篇)
  2. 用Flask做一个网站
  3. 找到Python方面的实习

 

一、编程

重点

  1. 学习Flask
  2. 完成《Python核心编程》的习题
  3. 100Words网页版
  4. 翻相册网站

 

其他

  1. ManyHead
  2. HowMany
  3. Shakeword
  4. 完善其他项目
  5. CS50
  6. 做本地和网页端的小程序练手
    1. 计算器
    2. 邮箱客户端
    3. 聊天软件
    4. 翻译软件
    5. RSS阅读器
    6. TODO清单(web)
    7. 便签本(web)
    8. 计时器(web)

 

学习和了解

  1. C
  2. SQL
  3. Bootstrap
  4. JavaScript
  5. Linux
  6. Vim/Emacs
  7. Java

 

二、阅读

预期数量:20本
主要主题:计算机、文学

  1. Learn C The Hard Way
  2. Think Java
  3. 编码
  4. 重读幸福之路
  5. 重读写作这回事
  6. 黑客与画家
  7. 世界是平的
  8. 文学回忆录(下)
  9. 怎样解题
  10. 雪国
  11. 银河系漫游指南
  12. ……

 

三、写作

至少完成45篇

 

四、英语

主要工作:大量听读输入,朗读练习

  1. 重读语法书《文法俱乐部》
  2. 完成口语教材《American Accent Training》
  3. 每天朗读20分钟
  4. 每天听20分钟
  5. 每天阅读30分钟

 

五、技能

  1. 学习并使用双拼
  2. 魔方
  3. 继续练习羽毛球
  4. 学习游泳

 

六、其他

  1. 学习并通过三门自考课程
  2. 拍大量照片
  3. 健身重点:腹肌,下肢和背部
  4. 养成使用英文关键词搜索的习惯
  5. 多喝牛奶和吃水果,避免零食和饮料
  6. 避免发牢骚,或在文章里发泄对别人的情绪
  7. 练习宽容和礼貌
  8. 和气或虚心的对待不同意见和反对意见
  9. 清理不必要的物品
  10. 养成和改掉一些习惯

 

七、时间计划

(以天为单位)

  1. 编程:约240小时(2小时/天)
  2. 阅读:约120小时(1小时/天)
  3. 写作:约60小时(30分钟/天)
  4. 英语:约120小时(1小时/天)
  5. 运动:约60小时(30分钟/天)(每周三次去健身房,周末打羽毛球或游泳)
  6. 娱乐:不超过100小时(不超过1小时/天)

typing.js——打字机效果

前一段时间,无意间在某个人的个人页面看到一个很有趣的打字机效果,可以自动的打出一段文字,删掉,然后打出另一段文字。经过半天的尝试,自己写了一个出来。因为没有系统学过JavaScript(只看过一本JavaScript编程精解……),写出来的代码不够简洁和优雅,嵌套了太多if语句。欢迎到Github上提交修改。

GitHub项目地址: https://github.com/greyli/typing.js

DEMO

打字机效果很适合用在个人页面和主页的头部,下面是几个示例。

用法

首先把CSS和JS文件放到相应的目录下,然后在HTML文件里分别引入这两个文件:

CSS

<link href="typing.css" rel="stylesheet">

JS

<script src="typing.js"></script>

在需要放置的地方插入下面这行

<span id="words"></span><span id="cursor">|</span>

cursor是文字后面闪烁的光标,你可以更换它。

最后在末尾设置你要定义的字段和相关的设置。首先你需要定义一个数组,然后写入单个或多个字段。

<script>
  var strings = new Array("一段文字"); // 单个字段
</script>
<script>
  var strings = new Array("文段1", "文段2"); // 多个字段
</script>

可选的设置有打字速度和删除速度,是否循环(默认为循环)等。

<script>
  var strings = new Array("文段1", "文段2") ; // multi words
  var typingSpeed = 100; // 打出每个字的间隔时间
  var deleteSpeed = 40; // 删除每个字的间隔时间
  var isLoop = true; // 是否循环,true/false
  var waitTime = 800; // 打完一个字段后的等待时间
</script>

最后

如果你在使用这个JS库,那么请让我知道,我会把你加入DEMO里。 

2016暑假总结

和前几个暑假一样,两个月很快就过去了。回过头来看,七月几乎没有多少成果,八月才开始稳定的学习和工作。

现在还能回想起来和家人相处的快乐:妈和奶奶做的好吃的菜;安静的晚上;和弟弟玩的游戏;和瑶瑶在楼顶看的星空。希望以后还能有能力和时间来制造这样快乐的回忆。

阅读(完成度:75%)

  1. 撒冷镇
  2. 牛鬼蛇神录
  3. 程序员修炼之道(注重实效的程序员)
  4. Powerful Sleep
  5. The Element of Style
  6. 少有人走的路(重读*2
  7. Flask Web开发
  8. JavaScript 编程精解
  9. 一滴泪

未完成:

  • Learn C The Hard Way :完成了10%。
  • Python Cookbook:当做工具书用了。
  • Python核心编程:这本书在暑假前就已经读完,不过习题只完成到十三章,计划年底完成全书的习题。

写作(完成度:85%)

  1. 2016暑假计划
  2. 小说和改编电影
  3. 《撒冷镇》笔记
  4. 通过这12个问题认识自己
  5. 大学应该怎么度过?
  6. 写作的乐趣
  7. AutoHotkey——自动化你的生活
  8. AutoHotkey——进阶实践与思考
  9. 如何获得优质的睡眠?
  10. Tkinter效果总结
  11. 我的信息处理系统:收集
  12. 日常快捷键配置:daily.ahk
  13. 告别盗版
  14. SimpleWords——幻灯片生成器
  15. 100Words
  16. 十个初级Python练习题
  17.  2016暑假总结

未完成:三篇

编程(完成度:56%)

未完成:

  • 翻相册(网站、Windows程序):虽然看了Flask Web开发,也跟着作者敲了书中所有的样例代码,还是把web编程想的太简单了,还需要一些时间。
  • 俯卧撑俱乐部(网站、文章)

知识和技能(完成度:78%)

  • Google搜索技术
  • 打字标准指法
  • 英语EnglishPod60
  • Java基本知识
  • C基本知识
  • JavaScript基本知识
  • Git常用命令
  • MarkDown语法
  • AutoHotkey基本知识

未完成:

  • 英语跟读:虽然没有每天抽出单独的时间来练习,听播客的时候有跟读。
  • 练字:练了大概有一周时间,没能坚持下来。
  • 双拼:形成了标准指法打字,但没有继续学习双拼。排进下半年的计划里。

其他(完成度:28%)

  • 电影若干
  • 游戏传送门系列

未完成:

  • 腹肌:虽然每周三次锻炼腹肌,但肌肉还是没有很明显,不过已经形成雏形了……
  • 十幅涂鸦
  • 浏览教材:计算机网络原理 —— 完成40%
  • 浏览教材:JAVA语言程序设计 —— 完成70%
  • 浏览教材:高数

时间

  • 编程:79小时22分钟
  • 写作:39小时50分钟
  • 阅读:64小时19分钟
  • 英语学习:16小时24分钟
  • 运动:29小时6分钟
  • 娱乐:143小时10分钟

娱乐太多了,达到了143小时(其中有104小时是七月的数据),主要原因是因为七月的不稳定的生活。下面是相应的时间数据饼图:

七月   

七月时间数据

七月时间数据

八月

八月时间数据

八月时间数据

总完成度:85%

虽然达到了计划的指标,但目前的完成度统计是用项目数量作为计算依据的,还不算太准确。未来会慢慢完善这种统计的准确性。

最后一个暑假结束了。

10个Python练习题

从开始学Python以来,接触了不少练习题。下面十个练习题,是我做出来的和想做出来的题里比较有趣的,现在按照难度由低到高排列。欢迎到Github上提交你的答案。

Github地址:https://github.com/lihuii/PythonExercises

 

一、猜数字

经典的猜数字游戏,几乎所有人学编程时都会做。

功能描述:随机选择一个三位以内的数字作为答案。用户输入一个数字,程序会提示大了或是小了,直到用户猜中。

 

二、FizzBuzz

另一道经典编程题。

功能描述:遍历并打印0100,如果数字能被3整除,显示Fizz;如果数字能被5整除,显示Buzz;如果能同时被35整除,就显示FizzBuzz。结果应该类似:0,1,2Fizz4Buzz6……14FizzBuzz16……

 

三、猜数字的AI

和猜数字一样,不过这次是设计一个能猜数字的AI

功能描述:用户输入一个单位以内的数字,AI要用最少的次数猜中,并且显示出猜的次数和数字。

 

四、整点报时

老式挂钟会在整点的报时,响铃的次数和时间相等。我们设计一个在电脑上运行的报时器。

功能描述:运行后,在每一个整点长响一声,半个整点短响两声。实现睡眠模式,晚上十二点到早上六点不响铃。

 

五、敏感词审查

一向痛恨网络审查的你成了某网站的审查员,要求审查网络上违反上头规定的名词。

功能描述:要审查的帖子在这个文本文档【todo】里,要求将所有的和谐,三个代表,言论自由,64替换为“*”号。

 

六、文字冒险游戏

你想做个清新脱俗的文字游戏,只在命令行的黑框里运行。

功能描述:尽量参考回合制RPG游戏的模式,游戏剧情自编,要有战斗模式,主角有HP属性,战斗和吃东西会对HP有相应的增减效果。

 

七、词频统计

你想分析某个英语写作者的写作风格,你想先从他使用词语的频率入手。

功能描述:分析这个文本文档【todo】里的词频,按照出现频率由高到低排列结果,不区分大小写,过滤掉标点(可以使用正则表达式)。结果类似ok234play122funny78

 

八、Markdown转换器

你一向喜欢在Windows的记事本里写文章,为了能方便的生成网页,你使用Markdown的格式写了篇文章,现在需要一个把Markdown转换成HTML格式的程序。

功能描述:将这个文本文档【todo】里的内容转换成HTML文档。要尽可能的支持Markdown标签,越多越好。建议使用正则表达式。

 

九、邮件轰炸机

你的一个朋友生日快到了,你决定搞个恶作剧——用邮件塞满他的邮箱。

功能描述:首先去注册十个邮箱,然后用这是个邮箱轮流发送随机生成的邮件内容给你的朋友。调整发送的频率,以免被服务器拒绝。

 

十、用邮件控制电脑

你的电脑放在宿舍,这时你在教室上课,你又决定搞个恶作剧吓吓装病请假在宿舍玩游戏的室友。

功能描述:使用邮件发送特定的命令,让电脑上的程序判断发信方是否为控制邮箱,如果是就执行发送过来的命令。通过不同的方式实现尽可能多的功能。

 

想要更多的挑战?可以去这里看看:http://www.pythonchallenge.com/

注:上面的几个文本还没有弄好>_<。

100Words

一开始我学Python下面的GUItkinter的时候,尝试着做了一个记事本程序,然后就实现了100words。现在是100Words1.1版。和之前相比,新版的100words增加了查单词,计时和字数统计功能,界面上也更加美观。

介绍

100words是一个英语写作练习软件,特点只有一个:如果想要保存,就得写满100个单词。

这个软件可以作为英语学习辅助使用。假如你正在学习英语,每天都有一定量的输入,比如说阅读或是听播客,那么你可以使用它来进行复习和回顾。每天一百个单词也许很少,但是通过长久的积累,同时搭配语法的学习和大量语料的输入,写作水平就会得到指数级的提高。

新旧版对比

新版界面

100Words v1,1

100Words v1,1

旧版界面

100old

100Words v1.0

新特性

查词

使用微软翻译实现,可以翻译词语和句子。

tran

计时

目前还没有添加到统计数据里,比较鸡肋。只能用来测试自己的写作速度。未来的版本会把时间数据做成折线图。

time

字数统计

参考了PythonCookbook里的计时器的实现方法。文本输入框上面的数字标签会实时显示当前的字数。

words

 

其他特性

你可以在File-Analysis下看到你所有的写作数据(目前只有日记数量)

data

 

使用说明

  1. 下载文件;
  2. 解压,取出可执行文件(100Words.exe)和字体文件(Purisa.ttf),其他可删除;
  3. 双击安装字体文件,然后把可执行文件复制到桌面上;
  4. 这时双击图标可以打开了。

总结

虽然目前功能上还不完善,最重要的拼写检查功能没有实现。但还是会有接下来的版本的:)

SimpleWords——幻灯片生成器

介绍

SimpleWords是一个HTML幻灯片生成工具,你只需要按照格式把幻灯片写在文本文档里,就可以轻松生成一个HTML幻灯片(使用浏览器打开)。SimpleWords支持Markdown和HTML标签,可以设置背景颜色。支持两种样式:

  • pure:它适用于制作简单的概括性的幻灯片:每页只有少量的文字或关键词;每页只放一张图片,或是一个视频。这种样式没有页面边框,文字和元素将居中显示。
  • rich:适合更复杂的页面布局。有页面边框,文字和元素靠左对齐。

GitHub 地址:https://github.com/greyli/simplewords

用法

设置样式

在文档第一行设置页面的样式,默认为pure样式。在两个百分号后面写上样式名称(pure或rich),独占一行,小写:

%%pure

%%rich

设置背景颜色或图片

在文档的最后一行设置背景颜色,默认为灰色。在两个美元符号后接上你要设置的颜色,RGB值,如下所示:

$$red

$$rgb(123, 45, 45)

需要注意的是,所有的字符都要是英文半角字符。所以不应该出现¥¥或是()。

文件结构

SimpleWords\
– js\
– css\
– images\
– videos\
– words.txt
– slide.py
– slide.html

  • 根目录下的words.txt是你写幻灯片的地方。
  • 你要插入的图片和视频要分别放在images和videos文件夹内。
  • slides!.py是生成你的幻灯片的程序。
  • slides.html是你的幻灯片,点击它就可以打开你的幻灯片了。

幻灯片分隔符

每一张幻灯片的分隔方式有两种:第一种,使用独占一行的五个横线分隔“—–”;第二种,使用换行符作为分隔,即一行代表一张幻灯片。两种分隔方式不可混用。当没有发现横线换行符时,采用默认的行分隔。

注意:设置样式和背景颜色的语句同样需要使用分隔符!

文字效果

支持Markdown和HTML两种标记语言(可以混用),所以你可以方便的为你的幻灯片实现你想要的效果。比如下面是一些常用的Markdown标签:

# 这是H1
## 这是H2
### 这是H3
这是一个段落。 
*这是斜体*
**这是粗体** 
***这是粗体+斜体***
一段文字后打上两个空格表示另起一行  

了解更多有关HTML和Markdown的信息:MDN HTML文档Markdown

添加图片和视频

图片:

![alt text](images/photo.jpg) 

<img src="images/photo.jpg" height="600">

视频:

<video width="800" height="600" controls><source src="videos/movie.mp4"></video>

注意:当使用行分隔时,不要让标签分行。建议不要让height值超过600。

版权声明

SimpleWords基于简化了的impress.js生成。

 

告别盗版

说起来羞愧,我直到最近才真正脱离了盗版。虽然很早就开始使用Steam,但电脑里大部分的电影,音乐,资料仍然是盗版的。现在,我终于迈出了这一步。在七月的一天里,删除了所有下载的电影,音乐专辑,电子书,英语资料和破解软件。

一直到大学之前,我都和大部分人一样,毫无版权意识。也没有太多机会接触盗版资源。有了电脑之后,我才逐渐意识到版权这个问题。虽然意识到了,但却没有停止这种毫无负罪感和安全风险的偷盗行为。因为大家都这么做,而几乎没人会因为你下载电影和音乐而说你不道德。大部分人不知道自己的行为属于盗版,甚至不觉得盗版有什么不对。

正因为它如此容易,在大多数环境下几乎没有人觉得你在偷,你也就认为自己不是偷了。但是盗版的本质就是偷,无论怎么解释和辩驳都没法改变这个事实。无论你有多穷,软件有多贵,有多少人这么做,都不能为你的偷盗增加任何合理性。

 

为什么大多数人不觉得盗版可耻?

盗版盛行的一个主要原因就是版权保护相关的法律的缺失。用道德来维系秩序本身就是低效率和不可靠的,何况盗版这种事情在当前的道德环境下并不算是严重的过错,这种轻微的道德感不能给人带来约束。你要是告诉你身边的人在网上下载电影和音乐(在有版权的网站除外)不道德,他一定会感觉诧异。更多的人知道你花钱买游戏和软件后,很可能还会觉得你有病。

教育体系也要负一定的责任(往后算账还要落到政治制度头上)。教育制度的死板和僵化要为这个社会的大部分问题负责任。学校几乎不给带来什么常识性,社会性的教育。之前既没有接触过,也没有了解过。大学倒是有了机会,而这时老师们又开始教你怎么用盗版软件了。(也许是因为我没上过好学校的缘故?)

 

盗版的危害

盗版对产业和原创者的伤害之大,自然不必说。但对我们自己也未必只有好处。

不付出代价就获得的东西让人不会珍惜。点两下鼠标就下载下来一张音乐专辑,听起来肯定没有用自己的生活费买来正版CD的虔诚和快乐。当一切来得太容易,你就不再愿意付出看起来似乎是多余的努力。新出了电影,你就去找资源,来了场考试,你就去找答案。慢慢的,你的生活的根基变成了虚假的东西,站在谎言上的你会收获一个快乐的未来吗?面对孩子时不会感到心虚吗?

盗版的方便激发出人的贪欲,但大多数人疯狂下载的资源只是躺在硬盘里睡觉罢了。过多的内容等待着你去消化,这让你的生活缺乏控制,因为你随时都会沉溺在丰富的内容里。一个囤积粮食的老鼠,眯着眼盯着发着光的屏幕,看起来浮躁又可怜。你下载一堆游戏,怎么玩都不好玩,要么画面太烂,要么对白太长。你骂了句操,因为过场动画没有提供跳过按键。你下载一堆烂片,不停的快进,去找到下一场打斗和爆炸,或是又一个短暂的性爱镜头。你想去看会儿书,可是怎么也看不进去,不停的点击手机,希望看到下一个紧张刺激的描写。

慢慢的,你干所有的事情都像是看毛片,没有干脆直接的刺激你干不来,你找最好笑的图片,最刺激的电影,最流行的音乐,最炫酷的运动。最后你什么都不想干,只想看无码的毛片你变成了一个暴躁虚伪的家伙,对生活里的一切都性冷淡。又一个大脑迟钝,心灵粗糙的现代人!

每一个不拒绝盗版的人的生活都面临着失控的危险。

 

正版的途径

许多人说他们盗版是因为没有买正版的途径,他们在说谎。而且大部分他们口中的贵的要死的软件,都有优惠的教育版。下面是一些常见的正版途径以及一些软件的优惠购买方式。

书店
亚马逊(纸质书或kindle电子书)

 

电影

亚马逊(DVD)
在各大视频网站上付费在线观看

 

音乐*

亚马逊(CD)
网易云音乐

豆瓣FM
(具体正版服务商名单见文末)

 

软件、游戏

Steam
微软商城
微软DreamSpark(教育免费软件)
AutoCAD(免费教育许可产品)
数码荔枝
赛尔校园先锋

 

*中国大陆地区得到IFPI认可的正版数字音乐供应商:<http://www.pro-music.org/legal-music-services-asia.php>

 

日常快捷键配置:daily.ahk

这是我学习AHK以来逐渐修改形成的一个日常快捷键集合。这个脚本让我用一种高效的方式使用我的电脑。

如果你还不熟悉AutoHotkey,可以先读一下前两篇文章:

借由这个脚本,我可以:

1、删掉桌面上几乎所有的快捷方式图标,然后把桌面当成一个inbox来使用,所有当前需要的文件都放在上面。
2、减少鼠标的过度使用;避免手指的不合理操作,比如编程时右手扭曲着按方向键移动光标。
3、减少重复劳动,把选中文字——复制——点开浏览器——打开网站——粘贴——回车简化成了选中文字,按下快捷键。同时不再重复输入常用的字符。
4、玩游戏时不会被开始键和输入法打扰。
5、这个脚本还在不断完善和增加中。
6、编程,让生活更美好。

 /*
我的日常快捷键 daily.ahk
by 李辉(greyli.com)

目录
一、打开常用软件、文件和网页
二、发送常用字符
三、常用操作与组合键
四、小工具
*/


;;;;;;;; 一、打开常用软件、文件、文件夹和网页

;;;; 1、程序

;QQ Lite
:://qq::
Run D:\Program Files (x86)\Tencent\QQLite\Bin\QQ.exe
return

;Picasa 3
:://pi::
Run C:\Program Files (x86)\Google\Picasa3\Picasa3.exe
return

;Chrome
:://c::
IfWinExist ahk_exe chrome.exe
WinActivate
else
Run C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
return

;Steam
:://st::
Run D:\Program Files (x86)\Steam\Steam.exe
return

;PotPlayer
:://pl::
IfWinExist ahk_exe PotPlayerMini64.exe
WinActivate
else
Run C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe
return

;OneNote
:://o::
IfWinExist ahk_exe OneNote.exe
WinActivate
else
Run C:\Program Files (x86)\Microsoft Office\root\Office16\ONENOTE.EXE
return

;PyCharm
:://p::
IfWinExist ahk_exe pycharm64.exe
WinActivate
else
Run D:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.5.4\bin\pycharm64.exe
return

;Vmware Player
:://v::
IfWinExist ahk_exe vmplayer.exe
WinActivate
else
Run C:\Program Files (x86)\VMware\VMware Player\vmplayer.exe
return

;ConEmu
:://ce::
Run C:\Program Files\ConEmu\ConEmu64.exe
return

;Everything
:://e::
Run C:\Program Files\Everything\Everything.exe
return

;Gimp
:://gi::
Run C:\Program Files\GIMP 2\bin\gimp-2.8.exe
return

;Evernote
:://en::
Run C:\Program Files (x86)\Evernote\Evernote\Evernote.exe
return

;Xmind
:://xm::
Run C:\Program Files (x86)\XMind\XMind.exe
return

;任务管理器
:://t::
Run taskmgr.exe
return

;控制台
:://cmd::
Run cmd
return

;截图
:://j::
Run C:\Windows\system32\SnippingTool.exe
return


;;;; 2、文件和文件夹

;桌面的inbox.txt
#i::
IfWinExist Inbox - 记事本
WinActivate
else
Run C:\Users\Administrator\Desktop\inbox.txt
return

;桌面的goals.txt
#g::
IfWinExist Goals - 记事本
WinActivate
else
Run C:\Users\Administrator\Desktop\Goals.txt
return

;Python文档
:://pd::
Run C:\Python27\Doc\python2711rc1.chm
return

;AHK文档
:://ad::
Run C:\Program Files\AutoHotkey\AutoHotkey_zh.chm
return

;下载文件夹
:://dl::
Run D:\Documents\Downloads
return

;回收站
:://hs::
Run ::{645ff040-5081-101b-9f08-00aa002f954e}
return

;projects
:://pr::
Run D:\projects
return

/*
秘密文件夹。
你可以把一个不想让别人看到的文件夹藏在很深的地方(比如下面的地址),然后使用一串热字符来打开它。
下面的字符只是个示例:P
*/
:://open::
Run C:\Program Files\CMAK\Support45\fpg\asd\secret\
return

;;;; 3、网页

;我的博客
:://hui::
Run http://greyli.com
return

;豆瓣
:://dou::
Run https://douban.com
return

;豆瓣fm
:://dfm::
Run https://fm.douban.com
return

;知乎
:://zhi::
Run https://zhihu.com
return

;gmail
:://gma::
Run https://gmail.com
return

;维基百科
:://wiki::
Run https://zh.wikipedia.org
return

;;hacker news
:://hack::
Run https://news.ycombinator.com/
return

;github
:://git::
Run https://github.com/lihuii
return

;Twitter
:://twi::
Run https://twitter.com/pestear
return



;;;;;;;; 二、常用字符

;;;; 1、邮箱

::@g::
Send withlihui@gmail.com
return

::@o::
Send withlihui@outlook.com
return

;;;; 2、密码(有一定的安全风险,最好不要和账号放在一起)

::@pwd1::
Send wodemima1
return

::@pwd2::
Send wodemima2
return

::@pwd3::
Send wodemima3
return


;;;; 3、其他文字

;发送当前日期
:://now::
FormatTime, CurrentDateTime,, yyyy-M-d
Send %CurrentDateTime%
return

;手机号
:://phone::
Send 1234****
return

;地址和邮编
:://addr::
Send 江苏省南京市*****(2346***)
return

;身份证号码
:://sfz::
Send 320382****
return

;银行卡号
:://bank::
Send ***
return

;我的博客
:://blog::
Send www.greyli.com
return


;;;;;;;; 三、常用操作

;用Google搜索选中的文字
!g:: 
Send ^c 
Run http://www.google.com/search?q=%clipboard% 
return 

;用淘宝搜索选中的文字
!b:: 
Send ^c 
Run http://s.taobao.com/search?q=%clipboard% 
return 

;打开一个空白记事本
!n:: 
If WinExist Untitled - Notepad 
WinActivate 
else 
Run Notepad 
return 

;使用灵格斯翻译选中的文字
!t::
Send ^c
Send !q
Send ^v{Enter}
return 

;将选中的文字发送到桌面上的Inbox.txt,然后关闭记事本
!z:: 
Send ^c
Send #i
WinWaitActive Inbox - 记事本
Send ^v{Enter}
Send ^s
WinClose Inbox - 记事本
return 

;使用Alt+j、k、l、i上下左右移动光标
!j:: Send {Left}
!l:: Send {Right}
!i:: Send {Up}
!k:: Send {Down}

;选中一行文字
!o:: Send {Home}+{End}

;选择当前位置到行首的文字 
!y:: Send +{Home} 

;选择当前位置到行末的文字 
!p:: Send +{End} 

;Alt+鼠标中键删除
^MButton:: Send {Delete}


;;;;;;;; 四、小工具

;计时器
#c:: 
InputBox UserInput, Counter, Enter a number(minutes):
IfEqual, Errorlevel, 0
{ 
 sleep UserInput * 60000
 SoundBeep
 MsgBox 时间到!
}
return

;定时关机
:://sd::
InputBox UserInput, Counter, 输入计划关机的时间(分钟):
Run cmd
WinWaitActive ahk_class ConsoleWindowClass
time := UserInput * 60
send ^{Space} ;设置英文输入
Send shutdown{Space} -s{Space}-t{Space}%time%{Enter}
return

;取消定时关机
:://stop::
Run cmd
WinWaitActive ahk_class ConsoleWindowClass
send ^{Space} ;设置英文输入
Send shutdown{Space} -a{Space}{Enter}
return

;立刻关机
:://sdn:: 
Shutdown, 1
return

;游戏模式
;禁用Windows键,保持大写锁定
#v::
Run D:\Documents\game.ahk
;game.ahk的内容如下,退出游戏时关闭这个脚本
;LWin::return
;SetCapsLockState, AlwaysOn

/*
*last edited by 李辉 2016/08/29
*/
 

我的信息处理系统:收集

我们日常接触的信息影响我们的思想、眼界和决策,也进一步影响了我们的生活。所以说学会筛选和获取信息至关重要。

我的信息处理方式包括三部分:

收集——处理——输出

另外两篇:
我的信息处理系统:处理(写作中)
我的信息处理系统:输出(写作中)

 

主动收集

你要收集什么样的信息,得看你要在哪一个学科或专业上有所成就。这也是一个重要的原则:让目标驱动行为。一般来讲,在菜鸟阶段可以广泛的接触一些网站和媒体,慢慢对比和筛选。慢慢的,可以只关注筛选下来的优质信息源。但是无论你学什么学科,都不要用刷社交网站来获取信息(娱乐就是娱乐,不要扯上学习),刷这个词让人联想到漫无目的和消遣。你在Twitter上关注的牛人和名企能帮你提高编程能力?

与学科无关的碎片信息当然有必要,社交网站里也有很多有价值的信息(虽然常常藏在一堆垃圾里面)。但要注意把被动接受的碎片信息控制在一定水平下,主要的时间用在搜索和查找上(主动),而不是刷(被动)。更要把这些有用的信息放进一个完整的处理流程:收集——处理——输出。要不然,信息只是从你的脑袋里进来又出去,什么也没留下。

 

书是最优选

想要深入了解某一个主题时,书是最优选择也是最终选择(当然得是好书)。可以到网上去看别人的推荐,参考豆瓣和购物网站上的评价,结合自身的水平,然后再买来读。如果只想大概了解一下,那么可以读别人的文章,相关书的笔记。

 

可靠性

网上的信息要注意来源,优先选择权威的机构和权威的作者发布的信息。普通信息要注意甄别软文和假象,往往要综合数量,样本集合(人群类别)数量来判断信息的可靠性。举两个例子:

1、比较小众的书或电影,其数据往往缺乏参考价值。大部分人不知道的作品,反过来说,知道的人往往是粉丝,所以评价可能会虚高。

2、在网上搜索某个普通的笔记本的质量好坏,往往都是差评,这并不一定说明电脑质量不好。假设电脑有1%的故障率(正常的),五万台中的500台出了问题。这500台用户很有可能到网上评价和发牢骚,而没有故障的人却不大可能写文章来夸他的电脑很正常,所以搜索到的大多是差评。

 

适用性

网上的大部分(优质的,学科类的)碎片信息只是通过书或其他途径获得相关知识的人的输出,这个输出本身就代表着筛选和过滤,没有多少基础内容,而只是书里的结论或个人的总结。我们仅仅读别人的文章,通常会缺乏深层次的认识,但同时却有一种了如指掌的感觉。另一方面,权威人士的建议和指导未必适合每一个人,所以也不能迷信权威。

假如你想获得什么知识和能力,那么就认真对待,通过踏实的阅读、思考和实践来获得它,而不是奢望通过一两篇文章就能入了门。了解了入门的感觉并不能让你入门;了解了成功者的快乐和心酸,即使你为之唏嘘和感叹,觉得感同深受,你可能还是个loser

 

资料下载狂

没有付出任何代价就获得的东西不会让人珍惜。这一点不仅适用于物品,也适用于人际交往和生活。人们通常会对得不到的,花费巨大代价得到的,得到又失去的东西付出感情。付出代价,不仅让你更加认真对待,也更容易给你带来快乐和收获。为知识买单,不光是对别人的劳动成果的尊重,也是对你自己人格的珍惜。如果不尊重版权,那么你很容易就会变成资料收藏家和下载狂。贪欲让人变得盲目,自己不需要的东西,下载下来也多半躺在硬盘里面睡觉。这是收集资料时要注意的,有两个方法可以避免上面的问题:一、只收集自己需要的资料。二、购买正版。

 

收集的工具

Inbox:各种灵感念头和想法以及要临时记录的内容,待了解的内容。放到纸质笔记本,手机(拍照、录音、便签),电脑桌面上的inbox.txt里。定期清理。

RSS阅读器:订阅大部分需要的内容,将信息归到一处,统一处理。比如你喜欢豆瓣知乎的内容,你可以订阅豆瓣一刻和知乎日报,而不用下载单独的APP。每天定时阅读和清理,即使没读完也要清零,不要累积未读条目(控制订阅的数量)。

电脑:用来看视频,做搜索工作。查找和下载需要的资料以及买书。

Pocket:上面大部分信息的流向地,等待进一步处理。用来收集上网时搜索或浏览的信息,RSS阅读器里发现的优质内容。

 

优秀的的信息源

后面几个网站偏社交化,需要挖掘和筛选优质信息。还有一些公众号、博客和新闻类网站,类别杂乱就不写出了。有时间再整理一下我订阅的RSS源。

 

Tips

  • 使用Google搜索,学会使用搜索引擎。
  • 优先选择书。
  • 优先选择英文媒体和网站。
  • 优先选择专业权威的信息来源。

 

 

Tkinter效果总结

Tkinter是Python附带的标准GUI工具包。它易于使用,但支持的部件较少。其他的比较有名的GUI工具包有wxPytohn,PyQt,PyGTK。下面总结了一些常用的GUI效果的实现方式。

 

Splash

Splash就是程序启动界面(主界面显示前的界面),比如手机APP打开后显示的LOGO画面(大多是广告),splash通常可用来放品牌logo或公司信息。

# import Tkinter
def splash():
    root = Tkinter.Tk()
    root.overrideredirect(True)
    width = root.winfo_screenwidth()
    height = root.winfo_screenheight()
    root.geometry('%dx%d+%d+%d' % (width*0.8, height*0.8,
                                   width*0.1, height*0.1))
    # 保存成gif格式。(但是没法显示动图,待解决。)
    image_file = "hi.gif"
    #assert os.path.exists(image_file)
    # use Tkinter's PhotoImage for .gif files
    image = Tkinter.PhotoImage(file=image_file)
    canvas = Tkinter.Canvas(root, height=height*0.8, 
                            width=width*0.8, bg="white")
    canvas.create_image(width*0.8/2, height*0.8/2, image=image)
    canvas.pack()
    # 设置splash显示的时间,单位是毫秒(milliseconds)
    root.after(4000, root.destroy)
    root.mainloop()

在主程序启动前调用splash()

splash效果

某软件的启动界面(splash)

 

无边框

只需要加入下面一行代码。

root.overrideredirect(True)

 

无边框效果

某个简陋的无边框软件……

 

 

 多标签面板

首先定义一个类,建议把它保存成单独的文件,然后把它放在系统环境变量里,这样可以方便调用。

from Tkinter import *
class Notebook(object):
    def __init__(self, master, side=LEFT):
        self.active_fr = None
        self.count = 0
        self.choice = IntVar(0)
        if side in (TOP, BOTTOM): self.side = LEFT
        else: self.side = TOP
        self.rb_fr = Frame(master, borderwidth=2, relief=RIDGE)
        self.rb_fr.pack(side=side, fill=BOTH)
        self.screen_fr = Frame(master, borderwidth=2, relief=RIDGE)
        self.screen_fr.pack(fill=BOTH)
 
    def __call__(self):
        return self.screen_fr
 
    def add_screen(self, fr, title):
        b = Radiobutton(self.rb_fr, text=title, indicatoron=0,
                        variable=self.choice, value=self.count,
                        command=lambda: self.display(fr))
        b.pack(fill=BOTH, side=self.side)
        if not self.active_fr:
             fr.pack(fill=BOTH, expand=1)
             self.active_fr = fr
        self.count += 1
 
    def display(self, fr):
        self.active_fr.forget()
        fr.pack(fill=BOTH, expand=1)
        self.active_fr = fr

下面是一个示例:

from Tkinter import *
from notebook import * # 如果notebook类在同一个文件就省去这行
# 生成一个顶层窗口,放入notebook
root = Tk()
root.geometry("400x400+500+300")
nb = Notebook(root, TOP) # 标签的位置可选:LEFT、TOP

# 每一个框架(Frame)代表一个标签面板
f1 = Frame(nb())
b1 = Button(f1, text="Button 1")
e1 = Entry(f1)

b1.pack(fill=BOTH, expand=1)
e1.pack(fill=BOTH, expand=1)
# 在将框架添加到记事本之前,先把部件放进去
# 不要单独放入框架

f2 = Frame(nb())
b2 = Button(f2, text="Button 2")
iconImage = Tkinter.PhotoImage(master=f2, data=icon)
Tkinter.Button(image=iconImage).pack()
b3 = Button(f2, image=iconImage)
 
b2.pack(fill=BOTH, expand=1)
b3.pack(fill=BOTH, expand=1)

f3 = Frame(nb())
lb1 = Label(f3, text="欢迎来到标签3...")

lb1.pack()
# 添加标签面板和面板名称
nb.add_screen(f1, "标签 1") 
nb.add_screen(f2, "标签 2") 
nb.add_screen(f3, "标签 3")

root.mainloop() 

标签面板示例

 

 

新手备注

在Python中使用文件时要把文件的完整路径写出来。或者在调用前使用os模块的chdir函数。

import os
os.chdir("C:\photos\")
os.chdir(os.getcwd()) # better

如果要发布给别人用,那就使用相对路径。使用下面这个函数包裹你要使用的文件路径(相对于程序根目录的路径),这样即使你换了文件夹,文件还是会得到正确的调用。

import os
import sys

def resource_path(relative_path):
    """
    定义一个读取相对路径的函数
    1、引用文件用如下格式:resource_path('resources/complete.wav')
    你只需要填入相对于程序根目录的文件路径。
    2、打包exe的说明:在生成的.spec文件exe = EXE()中加入下面这行:
    [('resources/complete.wav',r'C:\Users\Administrator\resources\complete.wav','music'),],
    列表中的三项分别为代码中的引用,文件实际的地址,类别
    这样打包后文件会被正确引用。
    """
    if hasattr(sys, "_MEIPASS"):
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

 

注:标签面板的代码来自《Python Cookbook》