├── .gitignore ├── README.md ├── _config.yml ├── _includes ├── footer.html ├── head.html ├── header.html └── searchbox.html ├── _layouts ├── default.html ├── indexpage.html ├── page.html └── post.html ├── _posts ├── c │ ├── 2004-12-27-acm.markdown │ ├── 2004-12-28-hacker.markdown │ ├── 2004-12-29-ugly.markdown │ ├── 2004-12-30-c-environment.markdown │ └── 2004-12-31-c.markdown ├── configuration │ ├── 2003-12-01-terminal-life.markdown │ ├── 2003-12-24-process-manager.markdown │ ├── 2003-12-25-utc.markdown │ ├── 2003-12-26-drives.markdown │ ├── 2003-12-27-grub.markdown │ ├── 2003-12-28-video-card.markdown │ ├── 2003-12-29-desktop-environment.markdown │ ├── 2003-12-30-qq.markdown │ ├── 2003-12-31-ime.markdown │ └── 2003-12-31-install-softwares.markdown ├── development │ ├── 2007-12-22-docset.markdown │ ├── 2007-12-23-backend.markdown │ ├── 2007-12-24-frontend.markdown │ ├── 2007-12-25-github.markdown │ ├── 2007-12-26-android-dev.markdown │ ├── 2007-12-27-gui.markdown │ ├── 2007-12-28-script.markdown │ ├── 2007-12-29-ide.markdown │ ├── 2007-12-30-editor.markdown │ ├── 2007-12-31-development-software.markdown │ └── 2007-12-31-vim-and-emacs.markdown ├── entertainment │ ├── 2006-12-25-twitter-and-facebook-register.markdown │ ├── 2006-12-27-wine.markdown │ ├── 2006-12-28-fun-command.markdown │ ├── 2006-12-30-musicvideo.markdown │ └── 2006-12-31-game.markdown ├── future │ └── 2010-12-31-test.markdown ├── mac │ ├── 2011-12-29-tools.markdown │ ├── 2011-12-30-port.markdown │ └── 2011-12-31-mac.markdown ├── network │ ├── 2008-12-20-g-f-w.markdown │ ├── 2008-12-21-capture.markdown │ ├── 2008-12-22-net-commands.markdown │ ├── 2008-12-23-maintenance.markdown │ ├── 2008-12-24-wifi.markdown │ ├── 2008-12-25-cms.markdown │ ├── 2008-12-26-cloud.markdown │ ├── 2008-12-27-download.markdown │ ├── 2008-12-28-network-error.markdown │ ├── 2008-12-29-ap.markdown │ ├── 2008-12-30-webserver.markdown │ └── 2008-12-31-remote.markdown ├── novice │ ├── 2001-12-25-google.markdown │ ├── 2001-12-26-edit.markdown │ ├── 2001-12-27-warning.markdown │ ├── 2001-12-28-view.markdown │ ├── 2001-12-29-material.markdown │ ├── 2001-12-30-how-to-ask.markdown │ └── 2001-12-31-001.markdown ├── others │ ├── 2012-12-30-dos-emulator.markdown │ └── 2012-12-31-genymotion.markdown ├── toy │ ├── 2009-12-26-temp-monitor-arduino.markdown │ ├── 2009-12-26-temp-monitor.markdown │ ├── 2009-12-27-arduino2048.markdown │ ├── 2009-12-28-gpio.markdown │ ├── 2009-12-29-other-toys.markdown │ ├── 2009-12-30-arduino.markdown │ └── 2009-12-31-raspberry-pi.markdown ├── try │ ├── 2002-12-27-room.markdown │ ├── 2002-12-28-terminal.markdown │ ├── 2002-12-29-vm.markdown │ ├── 2002-12-30-install-with-win8.markdown │ ├── 2002-12-31-install.markdown │ └── 2002-12-31-prepare.markdown └── work │ ├── 2005-12-26-flash.markdown │ ├── 2005-12-27-illustrator.markdown │ ├── 2005-12-28-photoshop.markdown │ ├── 2005-12-29-math.markdown │ ├── 2005-12-30-latex.markdown │ ├── 2005-12-31-office.markdown │ └── 2005-12-31software.markdown ├── _sass ├── _back-to-top.scss ├── _base.scss ├── _header.scss ├── _layout.scss ├── _sidebar-content.scss └── _syntax-highlighting.scss ├── back.md ├── categorites.html ├── css ├── bootstrap.min.css └── main.scss ├── feed.xml ├── images ├── development │ ├── Nagasakibomb.jpg │ └── gayhub.png ├── entertainment │ └── fun │ │ ├── banner.png │ │ ├── blinkenlights.png │ │ ├── cmatrix.png │ │ ├── cowsay.png │ │ ├── figlet.png │ │ ├── lolcat.png │ │ ├── sl.png │ │ ├── toilet.png │ │ └── xeyes.png ├── novice │ ├── bluescreen.png │ ├── ctrl-alt-delete.jpg │ └── how-to-ask.png ├── toy │ ├── Raspberry_Pi_2.jpg │ └── arduino2048sketches.png └── work │ ├── fbx.jpg │ ├── latex1.png │ └── sfexpress.jpg ├── index.html ├── js ├── anchor.min.js ├── callout.js ├── faq.js ├── index.js └── search.js ├── search.html └── static └── js ├── index.js ├── search.js └── share.js /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | .sass-cache 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # intro 2 | 3 | [upclinux.github.io/intro](https://upclinux.github.io/intro) 4 | 5 | 网站上总结了一些新手常见的问题。 6 | 7 | 注意本项目的名字是入门指“引”,不是指“导”。为了使 Linux 新手不会太受折磨,又不会打消折腾电脑的乐趣,我们只列一些有关“思路”、“注意事项”的东西。具体操作仍需自己探索或找搜索引擎。 8 | 9 | 本网站不打算成为百科全书。可以访问 [Deepin Wiki](http://wiki.deepin.org),这是一个很好的手册。 10 | 11 | # 如何编辑本网站 12 | 13 | 见[这里](https://github.com/upclinux/upclinux.github.io),进去之后往下看。 14 | 15 | 需要注意的是,本 Repo 的分支不是 master,而是 gh-pages,说明这是个子页面。在本地调试的时候,网址应该是 `http://127.0.0.1:4000/intro/` 并且尾部的斜线不能丢。 16 | 17 | # 本网站的黑科技 18 | 19 | 本网站仍然采用 Jekyll 博客系统。但这次毕竟不是博客,因此还要重新设计主题,使其看起来更像个帮助系统。 20 | 21 | ## 如何保证顺序 22 | 23 | 我们仍然使用博客的“分类”来组织文章,不过这次分类和文章都是有顺序的,所以文章的“发布时间”是有要求的。按照“规定的时间”来发布文章,产生的结果才是按照顺序的。 24 | 25 | 1. 目前有 11 个分类,具体名字和对应目录可以看 `_config.yml`。顺序是确定的,但是为了路径整齐,第一个分类的“发布时间”应该是 2001 年,第二个分类的“发布时间”应该是 2002 年……以此类推。 26 | 2. 在每个分类下面有若干文章。文章的排列顺序是从最新到最旧,所以把第一篇文章的发布日期设定成了 12 月 31 日,第二篇是 12 月 30 日…… 27 | 28 | 除了改文件名,还需要修改文件头部的日期,因为 Jekyll 看的是文件内容而不是文件名。 29 | 30 | ## 如何才能被 FAQ “收录” 31 | 32 | 首页有个 FAQ,收录了一些常见问题,点击之后会跳到对应页面。这是自动生成的。 33 | 34 | 博客正文头部会有一段信息,写着标题、日期什么的。这个是可以定制的,所以加了一个 faq 属性。faq 是个数组,数组内容就是 FAQ 中应该收录的问题。 35 | 36 | 下面是一个会被 FAQ 收录的例子: 37 | 38 | --- 39 | layout: post 40 | title: "从何开始" 41 | date: 2001-12-31 00:00:00 42 | faq: ["第一个问题?", "第二个问题?"] 43 | --- 44 | 45 | # 编辑注意事项 46 | 47 | (不完全参考维基百科) 48 | 49 | ## 原则 50 | 51 | 注意版权:不要抄袭、复制他人的劳动果实。如果确实需要复制,请标明来源。公有领域和确实属于自己的作品除外。 52 | 53 | ## 内容 54 | 55 | 1. 启发思路:作为“入门指引”,我们更多的是让读者意识到“是什么”、“有什么”和“能够做什么”。一般不用写特别详细的操作步骤。 56 | 2. 说明书:对于一些特殊的问题,例如“如何安装QQ”是一个不需要点拨的问题,直接告诉读者详细操作即可。 57 | 3. 原创研究:维基百科反对原创研究,但是我们不反对,只要你的研究成果确实有利于读者的学习。 58 | 4. 内容清晰:要让文字内容条理清晰。没有人喜欢杂乱无章的内容,而且,在手机时代没有人喜欢看一个又长又枯燥的段落。 59 | 5. 适度幽默(恶搞):适度幽默,或者采用一些打比方的形式有助于读者理解一些复杂概念。为什么不用呢? 60 | 61 | ## 观点 62 | 63 | 1. 由于读者一般是经验比较少的新手,因此给出合理的观点可能更有利于学习。 64 | 2. 避免谈政治问题。 65 | 66 | ## 论述 67 | 68 | 1. 请尽量以中立的第三人称视角来书写文章。这意味着,使用“我”、“你”、“我们协会”都是不恰当的。 69 | * 文字当然可以使用“我”。在这种情况下,请标清作者是谁(ID 也可)。 70 | 2. 在论述过程中,应该认为自己不属于任何一个团体,也就是说—— 71 | * 你没有身份。虽然读者可能基本上都是大学生,但是不要认为你自己也是大学生。 72 | * 没有 “Linux 协会” 这个组织。所以提及 Linux 协会,提及协会人员及事务都是不恰当的。 73 | * 不要提及“石油大学”的事物,因为读者不一定是石油大学的。 74 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Site settings 2 | title: UPC Linux 3 | email: upclinux@163.com 4 | footnote: > # this means to ignore newlines until "baseurl:" 5 | © 2015 中国石油大学 (华东) Linux 协会
自豪地采用 GitHub Pages 和 Jekyll 6 | baseurl: "/intro" # the subpath of your site, e.g. /blog/ 7 | url: "https://upclinux.github.io" # the base hostname & protocol for your site 8 | permalink: /:short_year/:title 9 | # twitter_username: jekyllrb 10 | github_username: upclinux 11 | qqqun_name: "QQ 群 (279310694)" 12 | qqqun_idkey: e47c6b546d3373c09f7eaa8d4173728a513975ed2d0ec20106e83cfb11a3bf08 13 | 14 | host: 0.0.0.0 15 | 16 | # force https 17 | force_https: upclinux.github.io 18 | 19 | # Gems 20 | gems: 21 | - jemoji 22 | 23 | # Build settings 24 | markdown: kramdown 25 | 26 | defaults: 27 | - 28 | scope: 29 | path: "" 30 | type: "posts" 31 | values: 32 | layout: "page" 33 | comments: "true" 34 | - 35 | scope: 36 | path: "novice" 37 | values: 38 | category: "我是新手" 39 | icon: "fa fa-github-alt" 40 | - 41 | scope: 42 | path: "try" 43 | values: 44 | category: "准备接触 Linux" 45 | icon: "fa fa-linux" 46 | - 47 | scope: 48 | path: "configuration" 49 | values: 50 | category: "配置系统" 51 | icon: "fa fa-cogs" 52 | - 53 | scope: 54 | path: "c" 55 | values: 56 | category: "just for C 语言" 57 | icon: "fa fa-bug" 58 | - 59 | scope: 60 | path: "work" 61 | values: 62 | category: "工作与学习" 63 | icon: "fa fa-graduation-cap" 64 | - 65 | scope: 66 | path: "entertainment" 67 | values: 68 | category: "娱乐" 69 | icon: "fa fa-gamepad" 70 | - 71 | scope: 72 | path: "development" 73 | values: 74 | category: "开发者" 75 | icon: "fa fa-code" 76 | - 77 | scope: 78 | path: "network" 79 | values: 80 | category: "网络" 81 | icon: "fa fa-wifi" 82 | - 83 | scope: 84 | path: "toy" 85 | values: 86 | category: "Linux 玩具" 87 | icon: "fa fa-puzzle-piece" 88 | - 89 | scope: 90 | path: "future" 91 | values: 92 | category: "深入学习" 93 | icon: "fa fa-book" 94 | - 95 | scope: 96 | path: "mac" 97 | values: 98 | category: "苹果" 99 | icon: "fa fa-apple" 100 | - 101 | scope: 102 | path: "others" 103 | values: 104 | category: "其他" 105 | icon: "fa fa-smile-o" 106 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% if site.force_https %} 7 | 14 | {% endif %} 15 | 16 | {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 33 | 34 | -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 |
2 | 65 |
66 | -------------------------------------------------------------------------------- /_includes/searchbox.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% include head.html %} 4 | 5 | {% include header.html %} 6 |
7 | {{ content }} 8 |
9 |
10 | 11 |
12 |
13 |
14 |
15 | {% include footer.html %} 16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /_layouts/indexpage.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% include head.html %} 4 | 5 | {% include header.html %} 6 | {{ content }} 7 |
8 | 9 |
10 |
11 |
12 |
13 | {% include footer.html %} 14 |
15 | 16 | 17 | -------------------------------------------------------------------------------- /_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 |
6 | 15 |

{{ page.title }}

16 |
17 |
18 |
19 | {{ content }} 20 |
21 |
22 | 23 |
24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 |
6 | {% for default in site.defaults %} 7 | {% assign title = default.values.category %} 8 | {% assign tag = title | downcase %} 9 | {% if page.categories[0] == tag %} 10 | {% assign c = default.scope.path %} 11 | {% assign t = title %} 12 | {% break %} 13 | {% endif %} 14 | {% endfor %} 15 | 24 |

{{ page.title }}

25 |
26 |
27 |
28 | {{ content }} 29 |
30 | 31 |
32 |
33 |
34 | 45 | 46 |
47 |
48 |
49 | 50 |
51 |
52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /_posts/c/2004-12-27-acm.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "算法竞赛简介" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 算法竞赛,指的是以算法(和数据结构)为核心主题的编程竞赛。算法竞赛一般要求在规定时间内做若干道题目,并以编程的方式解决问题,可以使用 C/C++/Pascal/Java 等语言(视比赛要求而定)。竞赛规则 9 | 10 | 算法竞赛胜利的目标不尽相同,但是,如果你能在规定时间内正确解答所有题目,那么你肯定是赢家。 11 | 12 | # 线下竞赛 13 | 14 | ## NOI 系列(中学生) 15 | 16 | NOI 系列比赛是初中生和高中生参加的比赛。高中五大学科竞赛分别是数学、物理、化学、生物、信息学,其中信息学就是这个系列的比赛。 17 | 18 | 最底的比赛是分区联赛(NOIP)。NOIP 分普及组和提高组,普及组是初中生参加的,提高组是高中生参加的。NOIP 分初赛(笔试)和复赛(上机)。初赛晋级之后进入复赛。 19 | 20 | 关心竞赛的,初赛一般都能过。所以不需要担心什么了。 21 | 22 | 复赛的一些比赛情况(这里是 2014 年的情况): 23 | 24 | * 个人赛 25 | * 时间和题量:一般是 11 月的第三个周末。NOIP 复赛分两天进行,每天三道题。每道题 100 分,故总分 600 分。 26 | * 编程语言:使用 C/C++/Pascal 语言。因为是算法竞赛,所以不需要学习类和类库的用法。 27 | * 编程要求:每道题会有题目要求、输入输出格式和范例。你需要根据题目要求编程,严格按要求从文件中读取数据,进行处理,并严格按照要求输出答案。你需要按照要求将程序代码保存到电脑的指定路径。 28 | * 反馈:比赛结束之前不会有任何反馈。 29 | * 测评:比赛全部结束之后,程序会交到指定单位进行统一测评。每道题一般有 10 个固定的数据点,每个数据 10 分(有的题目是 20 个数据,每个数据 5 分)。测评系统会让你的程序读入这些数据,并检查你程序输出的结果是否与答案一致。 30 | * 测评结果:对于每个数据,存在以下几种状态。只有数据通过才能得分,错了不会额外扣分。假如一道题 10 个数据点你的程序通过了 6 个,那么这道题得 60 分。 31 | * 通过:你的程序输出的结果与答案一致,该数据点得分。 32 | * 编译错误:程序无法通过编译。由于有些省份不采用标准环境,所以很有可能在头文件上出问题。 33 | * 答案错误:答案错误,或者你的程序没有严格按照要求来输入输出数据。 34 | * 超时:你的程序没有在规定时间之内结束。不能得分。 35 | * 运行时错误:你的程序崩溃,同样不能得分。 36 | * 成绩:你最后知道的是通过的数据点累计的总分。分数越高越好。获得国家级一等奖之后有机会晋级,参加省队,从而继续参加更高级的比赛。最高级别是世界奥林匹克。 37 | * 因为现在参加奥赛不加分不保送,所以参加人数减少。只要你不生在变态的省份,拿一等奖其实不难。 38 | * 其他: 39 | * **不能携带参考资料。** 40 | * 因为是黑盒测试,所以骗分合法。例如某题不会做,但是题目中有一句“如果无解,请输出-1”,那么你直接让程序输出 -1 也有可能得分。 41 | 42 | ## ACM/ICPC 系列(大学生) 43 | 44 | ACM/ICPC 本是美国的编程比赛。现在全世界都流行了(没错,朝鲜人也参加)。 45 | 46 | ACM 比赛是大学生参加的比赛。与 NOIP 相比,ACM 的线下比赛比较多(学校举办的、省里举办的、某个学校的邀请赛……)。 47 | 48 | ACM 比赛的情况: 49 | 50 | * 团体赛:三人共用一台电脑。 51 | * 时间和题量:5 个小时,10 道题左右。题量很大。 52 | * 编程语言:使用 C/C++/Java 语言。因为是算法竞赛,所以不需要学习类和类库的用法。 53 | * 编程要求:一般情况下题目是**全英文**的。每道题会有题目要求、输入输出格式和范例。你需要根据题目要求编程,严格按要求读取数据,进行处理,并严格按照要求输出答案。完成编程之后,可以立即提交代码并获得反馈信息。 54 | * 反馈:在提交代码之后立刻得到反馈。比赛期间可随时查看其他队伍的完成情况。最后一小时封榜(状态不再更新)。 55 | * 测评:提交代码之后立刻测评。一般情况下,测评系统会让你的程序读入一些标准数据,并检查你程序输出的结果是否与答案一致。 56 | * 测评结果:一般情况下,每道题会有以下几种状态。只有完全通过(Accepted)的题目才算完成。 57 | * 通过(Accepted):你的程序通过了所有的数据点,和答案全部一致。(和 NOIP 不同) 58 | * 编译错误(Compile Error) 59 | * 答案错误(Wrong Answer):答案错误,或者你的程序没有严格按照要求来输入输出数据。 60 | * 超时(Time Limit Exceeded):你的程序没有在规定时间之内结束。不能得分。 61 | * 运行时错误(Runtime Error):你的程序崩溃,同样不能得分。 62 | * 成绩:完成的题目越多,排名越靠前。完成题目同样多的话,总用时越少的排名越靠前。 63 | * 总用时是所有已完成题目的用时之和。每个题目的用时为实际用时加罚时。有一次不通过的提交,罚时就加 20 分钟。假如 A 题前三次提交不通过,第四次提交才通过,此时距离比赛开始已经 40 分钟,那么此题用时是 40+20x3=100 分钟。 64 | * 未通过的题目不计入总用时。 65 | * 其他: 66 | * 可以携带不限数量的纸质资料,不能带电子资料。因此许多参赛队伍会提前把一些常用的算法和数据结构的代码打印出来以节省编程时间。 67 | * 三个人只有一台电脑,团队之间要配合好。此外,在正式比赛中可通过打印服务打印代码。 68 | * 校外比赛一般都是校队的才有机会参加。 69 | 70 | # 线上竞赛 71 | 72 | ## Online Judge 73 | 74 | 很多在线测评网站不仅是题库,而且会不定期地办一些在线比赛。 75 | 76 | 比赛不一定有奖励,但是按照正式比赛的时间、正式比赛的要求去参加这些在线比赛会对提高比赛水平有很大帮助。 77 | 78 | ## Codeforces 79 | 80 | Codeforces(行内简称 CF)是俄罗斯一个著名的 Online Judge 网站,之所以将其单列出来,是因为它有一套独特的比赛规则。 81 | 82 | * 时间和题量:Codeforces 的比赛为 2 小时 5 道题。 83 | * 由于 Codeforces 采用的时区和中国不同,因此中国人常常需要熬夜(半夜 11 点或 12 点)参加比赛。 84 | * 分组:一般情况下,每场 Codeforces 比赛有两组(Div 1 和 Div 2),分别供积分(Rating)超过 1700 和不足 1700 的选手参加。新用户的积分是 1500。 85 | * 如果确实分为了 Div 1 和 Div 2,那么 Div 1 的 ABC 三题和 Div 2 的 CDE 三题是一样的。 86 | * Room:选择 Div 之后你会被随机分到一个房间(Room)中,一个房间大约 30 人。 87 | * 编程:同样是按照要求输入输出。**可以使用各种主流编程语言** ,如 Python。 88 | * 测评:比赛期间系统只用前几组标准数据进行测评(实际上数据有几十甚至上百个)。如果这一小部分通过,那么被称作“Pretest Passed”。比赛结束后会使用全部数据进行统一测评,这被称作“System Test”。 89 | * 计分:如果某题通过,那么得分为当前分数减去 50 x 不成功的提交次数。某道题的分数是由比赛开始时的分数随时间线性减少得到的。最终得分以 System Test 为准。 90 | * Hack:这是 Codeforces 的特色之一。当某道题 Pretest Passed 之后,你可以选择锁定代码。锁定之后即可查看同房间内其他人的代码,并从中寻找漏洞,构造使其出错的数据。如果你的数据使对手的程序出错,那么就被称作“Successful hacking attempt”,你得 100 分。但是 Hack 失败,你会被扣 50 分。 91 | * 不管你是否锁定代码,只要其他人锁定了自己的代码,就可以 Hack 你。 92 | * Hack 成功的数据会被加入到标准数据中。 93 | 94 | 由于 Codeforces 的比赛模式很新颖,因此已经被 HDU 和 ACdream 等网站学习。题目质量也不错。 95 | 96 | ## 商业公司比赛 97 | 98 | 很多商业公司也会举办有奖竞赛,例如 TopCoder、百度程序之星等。 99 | 100 | # ACM 社团 101 | 102 | 想参加 ACM 比赛,当然要参加自己学校的 ACM 社团了,要不然哪里有去校外比赛的资格? 103 | 104 | 只要坚持到退役,你一定不会感到后悔。 105 | 106 | # 辅导书 107 | 108 | 经典教材非《算法竞赛入门经典》(刘汝佳,清华大学出版社)莫属。最新版是第二版,封面以紫色为主色调。可从当当网上在线购买。 109 | 110 | 《算法艺术与信息学竞赛》也是刘汝佳的经典教材,不过难度很大,是给高手看的。 111 | 112 | 此外还有很多专为算法竞赛编写的竞赛书籍、算法与数据结构书籍,不妨多读一读。 113 | 114 | # 在线测评网站 115 | 116 | 在线测评网站就是在网上做题、提交程序,然后查看反馈情况。有的够意思的网站会把详细情况告诉你,有的则不会。 117 | 118 | 很多题目可以到网上搜到题解,在想不出如何解决的情况下可以看一眼。 119 | 120 | 以下都是经典的在线测评网站。欢迎多刷题: 121 | 122 | * [POJ](http://poj.org):北京大学 OJ。 123 | * [UVa](http://uva.onlinejudge.org):《算法竞赛入门经典》、《算法竞赛入门经典-训练指南》的练习题都在这里。网站辅助工具有 [uHunt](http://uhunt.felix-halim.net)、[uvatoolkit](http://www.uvatoolkit.com)。 124 | * [HDU (杭电ACM)](http://acm.hdu.edu.cn):杭州电子科技大学 OJ。刷题时请从第 11 页开始刷。 125 | * [ZOJ](http://acm.zju.edu.cn):浙江大学 OJ。 126 | * [Codeforces (CF)](http://codeforces.com):俄罗斯的网站。可以用 Python 等语言编程。Codeforces 的比赛也很有特色。 127 | * [ACdream](http://acdream.info):这是一个社区组织的群和 OJ。 128 | * [Virtual Judge](http://vjudge.net):Virtual Judge 不是真正的在线测评,因为它的题目是通过机器人抓过来的,而且提交都是通过机器人到对应的网站去交。网站本身没有数据。Virtual Judge 还有一大特色就是“模拟参加”,也就是原比赛早已结束,但是整个过程看起来就像是你和其他用户“同时”竞技。由于 Virtual Judge 比赛质量差别很大,所以要谨慎对待。 129 | * [USACO Training](http://train.usaco.org):美国官方训练教材。循序渐进(必须按顺序做题),并给详细数据和解析。 130 | -------------------------------------------------------------------------------- /_posts/c/2004-12-28-hacker.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "C 语言很简单吗?" 4 | date: 2004-12-29 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | # C 语言杰作 10 | 11 | 下面这些程序都用到了 C 语言: 12 | 13 | * Unix 14 | * [gcc](https://github.com/gcc-mirror/gcc)(没错,C 语言编译器就是用 C 语言编译器来编译的) 15 | * [Linux 内核](https://github.com/torvalds/linux) 16 | * …… 17 | 18 | 这几个软件的作者在计算机发展史上都具有重要地位。 19 | 20 | # C 语言竞赛 21 | 22 | OI 系列 (信息学奥赛) 和 ACM 系列分别是高中生和大学生参加的重要算法竞赛。与此相关的还有由商业公司举办的比赛。这些比赛的重点的数据结构与算法,而 C/C++/Java/Pascal 仅仅是实现算法的工具,因此对数学的要求很高,但是对语言层面的要求不高。 23 | 24 | 此外还有一个著名的比赛——[IOCCC](http://ioccc.org) (国际混乱 C 语言代码大赛)。这是针对语言本身的竞赛。 25 | -------------------------------------------------------------------------------- /_posts/c/2004-12-29-ugly.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "C 语言程序太丑陋" 4 | date: 2004-12-29 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | C 语言由 B 语言演化而来,最初的应用就是重写 Unix 系统。可见 C 语言是为了写操作系统和底层程序的。 10 | 11 | 大学的 C 语言教学讲的是最基础的语法,而 ACM 竞赛只是将 C 语言作为工具 (ACM 竞赛的核心是数据结构与算法),因此绝大多数人是无法用 C 语言写出操作系统的。 12 | 13 | [% callout style=danger %] 14 | 15 | #### 以下是玩笑 16 | 17 | 实际上,大家完全有能力开发操作系统的某些组件,例如 Linux/Unix 系统里的 true 命令: 18 | 19 | int main(void) { return 0; } 20 | 21 | 除此之外,还有 false 命令: 22 | 23 | int main(void) { return 1; } 24 | 25 | 因此大家一定要有自信,不要质疑自己的能力。 26 | 27 | [% endcallout %] 28 | 29 | 说正经的。C 语言程序总是在一个黑乎乎的窗口里,从上到下地输出文字,看着太丑陋,能否改善一下? 30 | 31 | # 彻底变得高大上 32 | 33 | C 语言写窗口对话框? 34 | 35 | 不是写不出来,而是不合适,因为基于 C 语言的框架很少。 36 | 37 | 因此最好换个语言,例如 Visual Basic、Visual C++、Qt C++ 等。 38 | 39 | # 必须用 C 语言! 40 | 41 | 必须要用 C 语言来写有界面的程序,怎么办?给出三种思路: 42 | 43 | 1. 找到一个用 C 语言的图形界面类库。 44 | 2. Windows API 45 | 3. 让黑窗口看起来也高大上。 46 | 47 | ## 图形界面类库 48 | 49 | 目前最成熟的、基于 C 语言的框架为 `GTK+`。大量的基于 Linux 系统的图形界面程序都是用 GTK+ 库开发的。 50 | 51 | GTK+ 也支持 Windows 和 OS X,GIMP 就是一个很好的例子。 52 | 53 | 因为学习一个类库特别是图形界面类库的学习成本比较高,而且 GTK+ 在非 Linux 系统中的配置比较麻烦,因此,没有人愿意采用类似解决方案来完成 C 语言大作业。 54 | 55 | ## Windows API 56 | 57 | 这一条和上一条是类似的,只不过 GTK+ 是封装好的,而 Windows API 是没经过封装的接口。 58 | 59 | 可以通过 Windows API 来实现一些图形界面功能(例如通过 GetOpenFileName 函数来显示“打开文件”对话框)。当然仅限于 Windows 系统。 60 | 61 | 如果有人使用 Windows API 来实现完整的图形界面功能,那么他有可能疯了。 62 | 63 | ## 让黑窗口高大上 64 | 65 | 如果能在黑窗口里画出各种方框,把文字排列好,效果也是不错的。不过,我们只打算告诉你应该从哪儿入手,具体如何编程还需自己搜代码自己仿写。 66 | 67 | 这个东西是和操作系统有关的: 68 | 69 | ### Windows 70 | 71 | 需要一个 Windows 专属的头文件—— 72 | 73 | #include 74 | 75 | 具体有哪些函数呢?快去问度娘。 76 | 77 | 如果想对黑窗口本身做点修改,可以去百度`mode`、`color`等命令的用法。 78 | 79 | ### Linux 80 | 81 | 这个东西叫 `ncurses`。用起来会比 Windows 那个轻松很多,因为你不需要自己画框了。 82 | -------------------------------------------------------------------------------- /_posts/c/2004-12-30-c-environment.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "C 语言学习环境 (全平台)" 4 | date: 2004-12-30 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 如何在各种操作系统环境下练 C 语言?本文将给你一些提示—— 10 | 11 | # Windows 12 | 13 | * 有些老师会推荐 Visual C++ 6.0,不过它是那个曾经流行 98 的年代的产物,现在的操作系统不兼容(Windows 8/8.1/10 甚至可能无法启动)。所以,有条件的话应该使用新版,比如 Visual Studio 2015。 14 | * 有些老师会推荐 Code::Blocks。值得注意的是,这个软件有两种版本,一种安装包 20 多 MB (不带编译器),另一种安装包 90 多 MB (带编译器)。要选择那个`体积较大`的,否则你即使写完代码也无法运行程序,因为 Windows 系统没有自带编译器。 15 | 16 | # Linux 17 | 18 | 多数 Linux 发行版自带 C 语言编译器,所以说只需要一个合适的编程软件。 19 | 20 | * Visual C++ 6.0:虽然可以通过黑科技 (wine) 运行,但是实际效果不好。 21 | * Code::Blocks:这是一个比较好用的 IDE。对于 Ubuntu 系统,可通过以下命令安装: 22 | 23 | sudo apt-get install codeblocks 24 | 25 | 如果不愿意敲命令,也可以去“软件中心”里面找。但是,事实上可能敲命令会更轻松一些。 26 | 27 | # OS X 28 | 29 | OS X 既不带 C 语言编译器又不带 IDE,所以都要自己装。 30 | 31 | ## 安装编译器 32 | 33 | 在“终端”中输入下面命令(别忘了敲回车): 34 | 35 | xcode-select --install 36 | 37 | 如果提示 38 | 39 | xcode-select: error: command line tools are already installed, use "Software Update" to install updates 40 | 41 | 那么说明编译器已经装好,可以直接把窗口关掉了。如果弹出一个对话框并且要求你安装一些东西,那么你需要点击“安装”。安装过程需要联网下载软件。 42 | 43 | ## IDE 44 | 45 | App Store 里有 Xcode,价格免费。但是对于 C 语言学习而言,数 GB 大小的 Xcode 显得非常重,因此可以换成轻型的 Code::Blocks。 46 | 47 | Code::Blocks 同时支持 Windows、Linux、OS X 三个平台。由于版权问题,App Store 不提供 Code::Blocks 的下载,所以要自己搜索下载。 48 | 49 | # Android 50 | 51 | [% callout %] 52 | 53 | #### 以下是吐槽 54 | 55 | 很多导员要求大一不能带电脑(某些丧心病狂的甚至要求大二都不能带),但是学校没有类似规定,于是把需要电脑的课全都挤到大一开…… 56 | 57 | [% endcallout %] 58 | 59 | 说正经的。解决方案——c4droid 60 | 61 | 去百度贴吧找 `c4droid吧`,置顶帖就有下载地址。安装的时候要装两个 apk,一个 GCC for c4droid(编译器,装完打不开),另一个是 c4droid 本身。 62 | 63 | # iOS 64 | 65 | 应该没有人愿意因为一个实际上很不好用的软件而付钱。 66 | 67 | # 其他系统 68 | 69 | 此时此刻应该考虑机房和网吧。 70 | -------------------------------------------------------------------------------- /_posts/c/2004-12-31-c.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "C 语言好难" 4 | date: 2004-12-31 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 都说 C 语言难学。本文给一点点提示,希望大家看完之后能受点启发。 10 | 11 | # C 语言的来源 12 | 13 | 建议大家去维基百科里了解一下 [C 语言](https://zh.wikipedia.org/wiki/C%E8%AF%AD%E8%A8%80)。 14 | 15 | 这个语言诞生于 20 世纪 60 年代末,本来是为了写`操作系统`的。 16 | 17 | 非计算机专业的为什么也要学 C 语言?谁让你不幸生在了中国…… 18 | 19 | # C 语言难在哪儿 20 | 21 | 根据大家的反馈,C 语言难在以下几个方面: 22 | 23 | 1. 语法 24 | 2. 谭浩强 C 25 | 3. 数组、指针、字符串 26 | 4. 像 ACM (程序设计竞赛) 一样的算法 27 | 28 | 下面逐个分析一下。 29 | 30 | ## 语法 31 | 32 | 感觉语法困难,说明不熟悉计算机语言的套路。计算机语言是人类与计算机的“最大公约数”。“代码”就是既能让人看懂,又能让计算机看懂的东西,所以当然要遵循一定的语法。 33 | 34 | 解决语法问题,从以下几方面入手: 35 | 36 | 1. 把书上代码和老师讲的代码`读懂`。就像读英文文章一样,把该翻译的都翻译一遍。 37 | 2. `留意每一个细节`。注意每一个符号,注意大小写,注意空格,注意全角半角…… 38 | 3. 以现有的程序为基础进行`改写`。在计算机上`反复试验`。 39 | 40 | ## 谭浩强 C 41 | 42 | [谭浩强](https://www.baidu.com/s?wd=谭浩强)是清华大学出版社的一位同志,他曾经为编程语言 (BASIC) 在中国的普及做出了一定的贡献。 43 | 44 | 但是谭浩强本人对 C/C++ 的理解存在一些问题,因此谭浩强主编的 C/C++ 语言教材也存在问题。谭书的问题主要体现在以下几个方面: 45 | 46 | 1. 概念理解有误; 47 | 2. 应该详细讲的,可能讲得不详细;有些不难理解的可能讲得很多; 48 | 3. 代码风格拙劣; 49 | 4. 错误地分析未定义行为 (“未定义行为”由 C 语言标准规定,即使代码能正常运行也没有任何意义,例如“a=a++;”。); 50 | 5. 有些示例程序可能无法完全达到预期目的。 51 | 52 | 因此应该多准备一本教材。 53 | 54 | ## 数组、指针、字符串 55 | 56 | 因为数据都存在了内存里,而内存是个很抽象的东西,所以在编程初期大家应该多编编程序(废话),`拿草纸画些方格`来模仿内存。 57 | 58 | 数组和字符串在内存中是连续排列的,所以才让你画方格来模拟。把每一步操作,尤其是循环,在方格上面用`手`走一遍,感觉应该会好一些。 59 | 60 | ## 算法 61 | 62 | 有些学校的 C 语言教学受到了算法竞赛的影响。由于算法竞赛难度很大,因此教学过程主要是“形似”。 63 | 64 | 对于算法类问题,最好的办法还是先听人把思路讲一遍,然后再结合代码理解思路。对于确实难以理解,但是考试还有要求的算法,最有效的学习方法就是背。单纯记忆效果可能不好,因此要结合电脑实践。 65 | 66 | 举个例子——这种代码看不懂就背: 67 | 68 | int gcd(int a, int b) 69 | { 70 | return b ? gcd(b, a%b) : a; 71 | } 72 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-01-terminal-life.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "在纯文本终端中生活" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 有些人喜欢一直在命令行里,就像 DOS 年代那样,颇有极客范! 9 | 10 | Linux 就可以很好地满足你的需求——因为 DOS 系统太旧,已经没有人愿意用,而 Linux 是一个现代化以至于在计算机行业有着重要地位的操作系统。 11 | 12 | 纯文本终端的快捷键是Ctrl-Alt-F1,如果没反应 (F1 正好是图形界面),可以试试 F2~F7。总之可以按出六个不同的纯文本终端。 13 | 14 | # 配置终端 15 | 16 | 和 DOS 一样,Linux 的纯文本终端也不支持汉字——出来的都是扑克牌里的方块。因此首先要配置一下中文环境。 17 | 18 | Linux 常用的中文环境为 fbterm。以 Ubuntu 为例: 19 | 20 | sudo apt-get install fbterm 21 | sudo apt-get install fcitx fcitx-frontend-fbterm 22 | sudo adduser $USER video 23 | sudo chmod u+s /usr/bin/fbterm 24 | 25 | 接下来修改 ~/.fbtermrc: 26 | 27 | font-names=Monaco,Consolas 28 | font-size=15 29 | text-encodings=utf8 30 | input-method=fcitx-fbterm 31 | 32 | 其中 Monaco 是一个来自 Mac 的字体,而 Consolas 是来自 Windows 的字体。这两种字体比较好看,所以可以到网上下载下来并安装。 33 | 34 | 之后便可以通过 `fbterm` 命令启动中文终端环境。 35 | 36 | ## 小小输入法 37 | 38 | 除了 fcitx,还有一个比较好用的输入法——小小输入法(yong) 39 | 40 | 首先要下载 yong 安装包并解压,然后(假如当前目录为 yong 解压后的所在目录): 41 | 42 | sudo mv yong /usr/local 43 | cd /usr/local/yong 44 | sudo ./yong-tool.sh --install 45 | 46 | 64 位系统是 --install64。 47 | 48 | 然后修改 ~/.fbtermrc: 49 | 50 | input-method=yong 51 | 52 | 接下来修改 /usr/local/yong/yong.ini。这是输入法本身的偏好设置。 53 | 54 | ## 自动启动中文环境 55 | 56 | 每次都输入 fbterm 命令,太麻烦。所以可以让它自动启动。 57 | 58 | 如果你用的 shell 为 bash,那么可以在 ~/.bashrc 里添加一句: 59 | 60 | if [ "$TERM" == "linux" ]; then 61 | fbterm 62 | fi 63 | 64 | # 应用 65 | 66 | Emacs 被人称作“一个伪装成文本编辑器的操作系统”。所以,如果会用 Emacs 那是最好的。 67 | 68 | 以下均为软件包名称: 69 | 70 | * 音乐播放器:moc(软件名 mocp) 71 | * 视频播放器:mplayer 72 | * 文件管理:vifm 73 | * 浏览网页:w3m 和 w3m-img(如果无法正常工作,需要将 fbterm 换成 jfbterm) 74 | * 文本编辑:当然是 Vim 或 Emacs。如果不会用,nano 也不错。 75 | * 图片查看:fbi(必须退出 fbterm 才能工作) 76 | * 截图:fbcat(软件名 fbgrab) 77 | * 分屏:tmux 78 | * IRC:irssi 79 | 80 | # 开机不进图形界面 81 | 82 | ## 旧系统 83 | 84 | 旧版本的 Ubuntu 系统 (Ubuntu 13.10 及以前) 使用 upstart 作为启动管理。upstart 和 inittab 都采用启动级别,因此把启动级别由 5 改成 3 即可不进图形界面。 85 | 86 | ## 新系统 87 | 88 | Ubuntu 14.04 及以后、Fedora 不太旧的版本、CentOS 7.x 均使用 systemd 作为启动管理。 89 | 90 | 所以开机禁止图形界面的命令很简单: 91 | 92 | sudo rm /etc/systemd/system/display-manager.service 93 | 94 | 恢复自启动 (假如桌面管理器是 lightdm): 95 | 96 | sudo ln -s /lib/systemd/system/lightdm.service /etc/systemd/system/display-manager.service 97 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-24-process-manager.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Linux 的任务管理器" 4 | faq: ["Linux 的任务管理器在哪儿?"] 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 在 Windows 里,按 Ctrl+Alt+Delete 可以调出“任务管理器”。但是在 Linux 里按同样的按键是注销(图形界面)/重启(文本界面)。怎么管理进程和杀进程? 10 | 11 | # ps 12 | 13 | ps 是一个用来查看进程列表的命令。和 Windows 的 tasklist 类似。 14 | 15 | 一般情况下,使用 ps 时后面要跟一些参数。常用的是 `ps -aux` 和 `ps -lax`。 16 | 17 | ps 和后面提到的命令都有很多附加参数。可以通过搜索引擎,或者 man 命令(如 man ps)获得帮助。 18 | 19 | ## pstree 20 | 21 | pstree 可以以进程树的形式列出当前进程。 22 | 23 | # kill 24 | 25 | kill 可以杀死指定 PID 的进程。假如通过 ps 查到要杀死的进程 PID 为 1234,那么可通过`kill 1234`结束进程。 26 | 27 | killall 是通过进程名来杀死进程的命令。 28 | 29 | ## xkill 30 | 31 | xkill 是 X 环境的杀进程命令。只要输入 xkill,鼠标轻轻一点,鼠标指向的窗口(对应的进程)就立马被杀死了。 32 | 33 | # top 34 | 35 | top 是一个交互式任务管理器。当然,纯文本界面的。 36 | 37 | top 命令可以查看 CPU、内存等资源占用的实时状态,并且进行进程管理。 38 | 39 | 按“<”和“>”键翻页,按“k”然后输入进程 PID 可以杀死进程,按“q”退出。其余功能可看手册。 40 | 41 | ## htop 42 | 43 | htop 是一个类似的命令,不过 htop 比 top 现代多了。例如,htop 支持颜色,htop 支持鼠标…… 44 | 45 | # 注意 46 | 47 | Unix 进程和 Windows 进程有一些不同之处,在杀进程时候务必注意一下。 48 | 49 | ## 进程树 50 | 51 | 在 Unix 和 Linux 中,进程之间具有父子关系。一旦父进程结束,子进程也会随之结束,这一点和 Windows 是很不一样的。 52 | 53 | ### 防止“连带”关系 54 | 55 | 这个技巧常用于远程连接。在远程连接过程中可能会执行一些耗时间的任务,一旦中断连接,负责远程连接的 shell 进程结束,它的子进程也就是我们的任务也会随之结束,因此要设法防止发生“连带关系”。 56 | 57 | 另外,耗时间的任务也会占用终端输入输出,所以有时候我们也希望它不要影响自己。 58 | 59 | 假如 python myprog.py 是一个很耗时的脚本: 60 | 61 | * `python myprog.py &`:在命令后面加个“&”,可让命令在后台运行。(进程仍然存在父子关系) 62 | * `nohup python myprog.py &`:前面加“nohup”,后面加“&”,命令在后台运行,进程无父子关系。 63 | * Ctrl+Z:如果命令已在前台运行,按 Ctrl+Z 可将其休眠(暂停)。输入“jobs”查看已经休眠的进程,输入“fg”使进程恢复前台运行,输入“bg”使进程转入后台运行(父子关系不变),输入“exit”强制结束这些被休眠的进程。 64 | * disown:如果命令已在前台运行,但是还需要退出终端,那么可以将进程休眠,通过 disown 命令使其脱离关系。disown 命令的参数与 jobs 的输出有关。 65 | 66 | ## 信号 67 | 68 | Unix 和 Linux 有信号的概念。信号可以控制进程的运行。 69 | 70 | 如果想手动发送信号,可通过 kill 命令(因此 kill 不完全是一个杀进程的命令)。例如: 71 | 72 | * `kill -STOP pid`:发送 SIGSTOP 信号,停止进程但不消灭进程。 73 | * `kill -CONT pid`:发送 SIGCONT 信号,重新开始已停止的进程。 74 | * `kill -KILL pid`:发送 SIGKILL 信号,强迫进程停止。这个命令可以用于对付无法正常结束的进程。 75 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-25-utc.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "(双系统)电脑时间总差 8 个小时,怎么回事儿?" 4 | faq: ["(双系统)电脑时间总差 8 个小时,怎么回事儿?"] 5 | --- 6 | 7 | 原因:Windows 和 Linux 采用不同的时间管理办法。Windows 认为 BIOS 的时间就是真正的时间(GMT+8),而 Linux 认为那是 GMT+0 的时间,因此两个系统的时间差了 8 小时。 8 | 9 | 所以有两种解决方法: 10 | 11 | ## 让 Linux 服从 Windows 12 | 13 | 直接在 Linux 中输入以下命令: 14 | 15 | sudo sed -i 's/UTC=yes/UTC=no/' /etc/default/rcS 16 | 17 | (命令解释:将 /etc/default/rcS 文件里的“UTC=yes”改成“UTC=no”。) 18 | 19 | 重启之后重新对时即可解决问题。 20 | 21 | ## 让 Windows 服从 Linux 22 | 23 | 开始,运行,regedit,启动“注册表编辑器”。找到 `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation`。在其中添加一个名为`RealTimeIsUniversal`的 REG_DWORD 类型的值,并设置为 1。重启后时间恢复正常。 24 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-26-drives.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[未完成]我的 CDEF 盘去哪儿了?" 4 | faq: ["我电脑的 C、D、E、F 盘去哪儿了?"] 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 大家应该都知道Windows用字母来区分不同分区——C盘、D盘、E盘…… 10 | 11 | 路径的形式也就类似于“C:\\Windows\\explorer.exe” 12 | 13 | 但是Unix和Linux不是这样。在Linux中,从路径中根本看不出分区。 14 | 15 | Linux的路径是这个样子“/usr/bin/natilus”,没有CDEF盘,斜杠是正斜杠(Unix的历史比DOS早)。 16 | 17 | 玩过Android的可能知道,/data/、/mnt/sdcard/、/system/就是截然不同的三个分区。光从路径上可看不出来。 18 | 19 | # Linux/Unix 怎么表示分区和路径 20 | 21 | ## 路径 22 | 23 | 与 Windows 不同,Linux 和 Unix 不用 CDEF 表示盘符。而且路径用“/”分隔(Windows 是“\\”)。 24 | 25 | 以下均是 Linux 和 Unix 风格的文件名: 26 | 27 | /usr/bin/gcc 28 | /home/ubuntu/a.jpg 29 | /var/www/html/index.html 30 | 31 | 上面三个文件分别是: 32 | 33 | * 根目录之下的 usr 目录(相当于“文件夹”)中的 bin 目录中的 gcc 文件 34 | * 根目录之下的 home 目录中的 ubuntu 目录中的 a.jpg 文件 35 | * 根目录之下的 var 目录中的 www 目录中的 html 目录中的 index.html 文件 36 | 37 | 安卓和苹果(OS X、iOS)也是这样表示的。 38 | 39 | ### 扩展名 40 | 41 | 顺便提一下,Linux 和 Unix 的文件也有扩展名,和 Windows 是相通的。不过一般情况下可执行文件等一般不加扩展名。 42 | 43 | ## 分区 44 | 45 | Linux/Unix 不使用盘符表示分区。分区(实体)是一些文件(Unix 哲学:一切都是文件)。 46 | 47 | 一般情况下, 48 | 49 | * 第一块硬盘为“/dev/sda”,即根目录之下 dev 目录里的名为 sda 的文件。 50 | * 第一块硬盘的第一个主分区是“/dev/sda1”,是另一个文件。 51 | * 第一块硬盘的第二个主分区是“/dev/sda2”……以此类推。 52 | * 第一块硬盘的第一个逻辑分区是从 sda5 开始的。所以在不知道第二个分区(D 盘)是什么分区的情况下,可以用`ls /dev/sd*`命令看一下第二个分区到底是几。 53 | 54 | 同样道理,第二块硬盘是“/dev/sdb”。第二块硬盘第一个分区是“/dev/sdb1”…… 55 | 56 | [% callout %] 57 | 58 | #### Windows 59 | 60 | 事实上 Windows 也在以文件的形式来操作分区实体,如`\Device\Harddisk0\Partition0`同 Linux 中的`/dev/sda1`。 61 | 62 | [% endcallout %] 63 | 64 | # 挂载 65 | 66 | 很明显,Windows 不会把`\Device\Harddisk0\Partition0`用到路径里,当然 Linux 也不会把`/dev/sda1`用到路径里。 67 | 68 | Linux 和 Unix 采用的是一个名为“挂载”的方法:如果把 69 | 70 | ## mount 71 | 72 | ## fstab 73 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-27-grub.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "GRUB" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | GRUB是绝大多数Linux发行版的默认启动器。也就是说,那个紫色背景的(Ubuntu 是紫色,其他系统是黑色的)开机等多少秒选系统、选哪些系统、默认系统是哪个都是由 GRUB 控制的。 9 | 10 | #关于配置文件 11 | 12 | 一般来说,配置文件是 `/boot/grub/grub.cfg`(有些是`/boot/grub2/grub.cfg`) 。但是,有些系统的grub“不按套路出牌”(例如Fedora)。因此,如果你没找到,可以试试像这样 13 | 14 | find / -name grub.cfg 15 | 16 | 不过呢,由于这个文件是自动生成的,因此,如果直接改这个文件的话,更新的时候会把你的修改“刷掉”,所以,你可以通过修改/etc/grub.d/下面的文件以及/etc/default/grub来改一些默认设定。 17 | 18 | 接下来,你就可以按照自己的意愿,定制自己的配置了。 19 | 20 | **友情提示:请一定在修改配置文件之前,先备份!备份!备份!!!** 21 | 22 | #习惯看英文 23 | 24 | 由于各种Linux发行版都是老外做出来的(Deepin除外),因此,各种好用的文档、配置文件、man手册,都是英文的。所以你必须习惯于看英文文档。 25 | 26 | # 改启动时间 27 | 28 | 启动时间的参数在`/etc/default/grub`里,直接修改其中的GRUB_TIMEOUT参数,然后按照这个文件开头的说明,更新一下即可。 29 | 30 | #改启动顺序 31 | 32 | ##简单的办法 33 | 34 | 直接修改`grub.cfg`文件,找到里面的启动菜单项,它们看起来应该像这样: 35 | 36 | {% highlight bash %} 37 | menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-3b52b7ed-7ed3-4c13-9b09-bd8f4d4d8356' { 38 | recordfail 39 | load_video 40 | gfxmode $linux_gfx_mode 41 | insmod gzio 42 | insmod part_gpt 43 | insmod ext2 44 | set root='hd0,gpt6' 45 | if [ x$feature_platform_search_hint = xy ]; then 46 | search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt6 --hint-efi=hd0,gpt6 --hint-baremetal=ahci0,gpt6 91195ca7-f2eb-4681-a087-58e7f8fefa21 47 | else 48 | search --no-floppy --fs-uuid --set=root 91195ca7-f2eb-4681-a087-58e7f8fefa21 49 | fi 50 | linux /vmlinuz-linux root=UUID=3b52b7ed-7ed3-4c13-9b09-bd8f4d4d8356 ro quiet splash $vt_handoff 51 | initrd /initramfs-linux.img 52 | } 53 | {% endhighlight %} 54 | 55 | 如果想调换两个启动项的顺序,直接将菜单的位置对调即可。 56 | 57 | ##缺点 58 | 59 | 很显然,如果你执行了grub-mkconfig命令,你自己的修改就被系统覆盖掉了…… 60 | 61 | # 关于主题 62 | 63 | ##加载主题 64 | 65 | 一般来说,默认的grub其实是有主题的。不过呢,默认并没有加载,需要手动添加代码。像这样: 66 | 67 | {% highlight bash %} 68 | loadfont ($root)/boot/grub/fonts/unicode.pf2 69 | set theme=($root)/boot/grub/themes/starfield/theme.txt 70 | export theme 71 | {% endhighlight %} 72 | 73 | 一般来说,与主题相关的文件放在/boot/grub/themes下。如果没这个目录,可以按照上述方法,手动搜索一下themes文件夹即可。 74 | 75 | ##定制主题 76 | 77 | themes文件夹下面有几个“不一定是什么的文件夹”,代表这里面放了什么主题。显然,这里面放了和主题相关的东西。当然,图片和文字怎么修改,就要发挥你个人的想象力了。而主题所使用的参数都在theme.txt里,想要改字体、颜色、位置等参数都在里面找即可。 78 | 79 | # 修复 GRUB 80 | 81 | 如果你把GRUB玩坏了,那么恭喜你,你已经很接近Linux大法了:ghost:不作死不玩Linux 82 | 83 | ##Ubuntu下的简单方法 84 | 85 | 如果你用的是ubuntu,有个工具叫boot-repair,可以方便地修复grub。 86 | 87 | 在这之前,你需要有一个启动盘。关于启动盘如何制作,可以自己在百度上找找(此时百度基本够用了)。当然,如果你有兴趣,可以去制作一个“[万能盘](https://github.com/D-e-e-m-o/grub)”。 88 | 利用启动盘进入Ubuntu的Livecd,然后按Ctrl+Alt+t打开终端,一次键入如下命令: 89 | 90 | {% highlight bash %} 91 | sudo add-apt-repository ppa:yannubuntu/boot-repair 92 | sudo apt-get update 93 | sudo apt-get install boot-repair 94 | sudo boot-repair 95 | {% endhighlight %} 96 | 97 | 然后根据软件提示往下做就行了。 98 | 99 | ##如果你用的是其他发行版 100 | 101 | 你需要手动重装grub。同样地,你需要一个启动盘。进入Livecd之后,请参照[这里](https://github.com/D-e-e-m-o/grub/blob/master/install_grub_in_usb.md)重装grub。 102 | 103 | #学会搜索 104 | 105 | 当然,上述并没有把所有的东西都交代了出来。如果你对于上面交代的东西有不明白的地方,欢迎询问传说中不存在的搜索引擎。如果有错误,欢迎在下方留言或者直接提交issue。 106 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-28-video-card.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "显卡驱动" 4 | --- 5 | 6 | 一般情况下,装完 Linux 系统,除了一些不常用的硬件(指纹识别、读卡器)和显卡,其他硬件的驱动其实都装好了。 7 | 8 | 但是,就是因为(双)显卡的驱动可能没装好,所以电脑的发热量可能特别大,而且耗电量也很大。 9 | 10 | [% callout style=danger %] 11 | 12 | #### 避免官方驱动 13 | 14 | 尽管在 Windows 里,装官方驱动是一个安全的选择。但是在 Linux 里,装官方显卡驱动是最危险的选择,因为官方显卡驱动照顾不了那么多的发行版,安装之后容易出现问题导致系统无法正常使用。因此应该优先使用发行版提供的显卡驱动。 15 | 16 | [% endcallout %] 17 | 18 | # Intel 核显 19 | 20 | 因为 Intel 很支持 Linux 所以 Intel 核显的驱动都装好了,不需要再干预。 21 | 22 | # Nvidia 独显 23 | 24 | (Linus 曾因为 Nvidia 不支持 Linux 而竖起中指大骂 Nvidia。) 25 | 26 | Linux 对 Intel + Nvidia 双显卡切换支持不好。如果不打游戏,可以在 BIOS 中把独显关掉,解决发热和耗电的问题。 27 | 28 | ## bumblebee 29 | 30 | bumblebee 是一个能够实现手动切换双显卡的软件。 31 | 32 | 新版本的 Linux (例如 Ubuntu 14.04) 的软件仓库已经包含这个软件,可以直接安装。如果没有(以 Ubuntu 为例): 33 | 34 | sudo add-apt-repository ppa:bumblebee/stable 35 | sudo apt-get update 36 | sudo apt-get install bumblebee bumblebee-nvidia 37 | 38 | 默认情况下独显会被关掉。如果需要开启独显,用 optirun 命令,例如: 39 | 40 | optirun wine C:\cod\iw4sp.exe 41 | 42 | # AMD 独显 43 | 44 | 从 BIOS 中关掉独显是最简单的办法。 45 | 46 | 如果不行,在 Ubuntu 中,AMD 显卡驱动的名字叫 fglrx,可以直接安装。 47 | 48 | # 判断独显是否打开 49 | 50 | 在终端中输入 `lspci`,在列表中找到独显。如果后面的文字是“rev ff”,说明独显关闭,否则就是打开的。 51 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-29-desktop-environment.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "桌面环境" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | Windows 或苹果用户可能不太熟悉“桌面环境”的概念,而这个概念在 Linux 系统中非常常见。如何理解这个词呢?你知道安卓手机里有“GO桌面”、“小米桌面”、“XXX桌面”、“YYY桌面”……吧,“桌面环境”就是类似这样的东西。 9 | 10 | Linux 系统有很多种桌面环境,而且只要你愿意就可以随便更换,因为不同发行版软件包不同,这里不再给出安装方法。大家应该自行找搜索引擎,例如“Ubuntu安装KDE”。有闲工夫的话,大家不妨多装几个试一下,看看自己更喜欢哪个桌面环境。 11 | 12 | # 轻量级桌面环境 13 | 14 | “轻量级”指体积、内存占用等比较小,适合低配置电脑、嵌入式设备或虚拟机。 15 | 16 | 常见的有 Xfce、LXDE、MATE。这些界面风格都比较传统。 17 | 18 | 此外还有一个“小清新”的桌面环境叫做 Cinnamon。这是 Linux Mint——一个“小清新”系统默认的桌面环境。 19 | 20 | # “重量级”桌面环境 21 | 22 | 注意:低配置电脑和虚拟机勿试! 23 | 24 | 常见的有 GNOME 3、Unity、KDE。 25 | 26 | KDE 是一个看起来非常时髦的桌面环境,而且可定制程度高到“事无巨细”的程度。与其他桌面环境不同的是,KDE 采用 Qt 框架,因此给人一种现代化的和不一样的感觉。KDE 支持大量插件。 27 | 28 | GNOME 3 简直像是给平板电脑设计的。GNOME 3 有一个官方插件库,不过很多设置需要自己手动安装一个叫做 GNOME Tweak Tool 的软件之后才能更改。 29 | 30 | Unity 是 Ubuntu 自带的而且目前只支持 Ubuntu 系统。可定制的选项比较少而且需要安装一个叫做 Unity Tweak Tool 的软件。Unity 的搜索框可以同时搜索本地内容和在线内容,可惜由于中国国情特殊,这个功能达不到它应有的效果。 31 | 32 | 此外“国产”深度系统 Deepin 也有一套自己的桌面环境。经历了 Linux Deepin 2013、Deepin 2014、Deepin 2015,深度团队正努力开发一个既好看又好用的全新的桌面环境。 33 | 34 | # 其他 35 | 36 | ## Elementary OS (操作系统) 37 | 38 | 处在看脸的时代,Elementary OS 系统就在致力于提高自己的“颜值”。因为与其他桌面环境差别比较大,所以建议大家直接装这个系统——反正都是基于 Ubuntu 的系统,用起来应该不会有什么大问题。 39 | 40 | ## Cairo-Dock 41 | 42 | Cairo-Dock 是一个酷炫的模仿 Mac 系统的 Dock 的软件。它的功能非常多,而且可定制程度很高,可以自由更换主题。 43 | 44 | ## Conky 45 | 46 | Conky 是一个又漂亮又颇有极客范的系统监视软件,并且它把各种信息直接刷到桌面上。因为 Conky 可以高度定制,因此只要懂配置文件,就可以搞出很装13炫的效果。 47 | 48 | # 自定义 49 | 50 | ## 如何安装字体 51 | 52 | 直接用字体查看器安装,或者将字体复制到 ~/.fonts 目录里即可。不存在的话可以创建一个目录。 53 | 54 | ## 如何换主题 55 | 56 | 对于基于 GTK+ 的桌面环境,可到 [GNOME-Look](http://gnome-look.org) 中下载主题,并解压到 ~/.themes 目录中。不存在的话创建一个即可。 57 | 58 | 对于 KDE 等桌面环境,可以直接通过它的“设置”程序来下载、更换主题,很方便(不过可能会撞墙)。 59 | 60 | ## 更换登录画面 61 | 62 | 常见的桌面管理器有 gdm、kdm、lightdm 等。通过更换显示管理器,可以更换登录画面。 63 | 64 | ## 特效 65 | 66 | 不同桌面环境有不同的特效管理器,因此不要混用。 67 | 68 | 对于 Ubuntu 的 Unity 桌面环境,可以安装 CCSM 和相关插件,然后就可以搞出很多酷炫的效果了。(其他桌面环境勿试,否则很可能会崩溃!) 69 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-30-qq.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "QQ" 4 | date: 2003-12-30 00:00:00 5 | faq: ["QQ!"] 6 | --- 7 | * content 8 | {:toc} 9 | 10 | 某公司为了商业利益,放弃了 QQ for Linux 的开发。但是中国人又不得不用 QQ,于是 Linux 世界出现了四种解决方案: 11 | 12 | # 虚拟机 13 | 14 | 当然可以装个虚拟机,在里面跑 QQ。 15 | 16 | 不过,除了模拟 Windows,我们也可以模拟 Android——安装 GenyMotion,然后通过“手机”登 QQ。[详情看这里]({{ site.baseurl }}/12/genymotion/)。 17 | 18 | # Smart QQ 19 | 20 | WebQQ 已停止开发。现在是 [Smart QQ](http://w.qq.com)。 21 | 22 | Smart QQ 可以被窗口化,从而看起来像是“原生”应用。Firefox、Chrome 均有窗口化插件。此外,在 Unity 桌面环境中,有一个叫 fogger 的程序也可以实现窗口化。 23 | 24 | 事实上,Ubuntu 手机的 QQ 就是 Smart QQ 的“本地化”版本。 25 | 26 | # 分析协议并实现 27 | 28 | 有人分析了 QQ 协议 (一般是 WebQQ 因为更容易分析) 并开发了替代品。但是由于风险较大 (容易被认定为“异常登录”),所以不推荐。 29 | 30 | # wineQQ 31 | 32 | wineQQ 不稳定但是功能最全,因为它设法直接让 Windows 版 QQ 运行。 33 | 34 | 目前最稳定的 wineQQ 是由[深度团队](http://packages.linuxdeepin.com/deepin/pool/non-free/d/deepinwine-qq/)制作的。不过软件包只针对 Deepin 系统,无法直接在其他系统中安装。因此需要一些黑科技。 35 | 36 | 以下是详细操作步骤: 37 | 38 | ## 更新 wine 39 | 40 | 因为 Ubuntu 的 wine 比较旧,所以需要将 wine 更新到 1.7 版: 41 | 42 | sudo add-apt-repository ppa:ubuntu-wine/ppa 43 | sudo apt-get update 44 | sudo apt-get install wine1.7 45 | 46 | 其他系统可以略过。 47 | 48 | ## 下载和安装 WineQQ 49 | 50 | 深度 WineQQ 是个 deb 安装包,但是因为用到了深度专有的软件包,所以 Ubuntu 等系统无法直接安装。 51 | 52 | 先把它[下载](http://packages.linuxdeepin.com/deepin/pool/non-free/d/deepinwine-qq/)下来,当然,不要直接安装。 53 | 54 | 使用解压缩软件解压,再将名为 control 的包解压(有的软件识别 deb 格式,看见的就是直接识别出来的内容),将其中的 opt/cxoffice/support/Deepin-QQ 目录解压到某个目录,例如 ~/Deepin-QQ。 55 | 56 | 最后,运行命令:`WINEPREFIX=~/Deepin-QQ wine "C:\Program Files\Tencent\QQ\Bin\QQ.exe"`,WineQQ 就弄好了。 57 | 58 | 为了方便,可以将这条命令制作成脚本或启动器。 59 | 60 | ### 启动器 61 | 62 | 假如 Deepin-QQ 目录是 /home/ubuntu/Deepin-QQ。 63 | 64 | 想办法弄一张 QQ 的图片,保存到 /home/ubuntu/Deepin-QQ/qq.png。这张图将作为启动器(以及应用程序菜单中)的图标。 65 | 66 | 建立一个文件 ~/.local/share/applications/qq.desktop,用文本编辑器将其打开,并输入 67 | 68 | {% highlight ini %} 69 | [Desktop] 70 | Type=Application 71 | Categories=Network;InstantMessaging; 72 | Comment= 73 | Terminal=false 74 | Name=QQ 75 | Exec=/usr/bin/env WINEPREFIX=/home/ubuntu/Deepin-QQ wine "C:\Program Files\Tencent\QQ\Bin\QQ.exe" 76 | Icon=/home/ubuntu/Deepin-QQ/qq.png 77 | {% endhighlight %} 78 | 79 | 保存之后就可以在应用程序菜单中找到 QQ 了。 80 | 81 | ### QQ 卡死的处理 82 | 83 | 毕竟是 wine,而且是腾讯不支持的项目,卡死崩溃都是正常现象。一旦卡死,可用以下命令结束所有 QQ 进程: 84 | 85 | WINEPREFIX=/home/ubuntu/Deepin-QQ wineserver -k 86 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-31-ime.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "输入法" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 在 Linux 系统中,中文输入曾经是一个极大的问题,虽然自带拼音输入法,但是不如现代输入法好用,而且 Ubuntu 14.04 自带输入法有一个无法调全拼只能双拼的 bug(在后续版本得到了修复)。 9 | 10 | # 中州韵 (Rime) 11 | 12 | 中州韵是一款非常适合极客的中文输入法,并且是开源软件。中州韵既支持 iBus 框架,也支持 Fcitx 框架。可以到[官网](http://rime.im)查看更多说明。 13 | 14 | [% callout %] 15 | Rime 的不同名称 16 | 17 | Rime 在不同系统中有不同名称,在 Windows 中叫做“小狼毫 (Weasel)”,在 Linux 中叫做“中州韵 (Rime)”,在 OS X 中叫做“鼠须管 (Squirrel)”。 18 | [% endcallout %] 19 | 20 | Rime [在文档中总结了](https://github.com/rime/home/wiki/RimeWithIBus)不同发行版的安装方法。 21 | 22 | 以 Ubuntu 系统为例。如果系统不太旧,那么基于 iBus 平台的可以通过下面一条命令安装: 23 | 24 | sudo apt-get install ibus-rime 25 | 26 | 如果是 fcitx 平台,则为 27 | 28 | sudo apt-get install fcitx-rime 29 | 30 | 根据自己实际情况敲命令就行了,非常方便。 31 | 32 | 此外也可以通过编译源码的方法来安装。 33 | 34 | # iBus 换 fcitx 35 | 36 | Ubuntu 和很多发行版默认的输入法平台都是 iBus(“中国化”的 UbuntuKylin 已经换成了 fcitx)。如果想从 iBus 改成 fcitx,可以按照以下步骤操作: 37 | 38 | sudo apt-get install fcitx 39 | 40 | 然后通过`im-switch`命令(其他系统可能叫im-config或imsettings-switch什么的)切换默认输入平台。注销之后更换成功。 41 | 42 | ## 搜狗拼音输入法 43 | 44 | 如果愿意支持国产,也可以尝试搜狗团队的搜狗输入法。在 Ubuntu 系列系统中,可以按照下面方法安装搜狗拼音输入法: 45 | 46 | 1. 下载[搜狗拼音输入法](http://pinyin.sogou.com/linux/)安装包。注意处理器位数。 47 | 2. 如果你的 Ubuntu 系统比较旧(12.04),按照下载页的说明更新软件源。 48 | 3. 直接安装安装包。 49 | 4. 如果原来的输入法是 iBus(原生 Ubuntu 默认是 iBus),在命令行中运行 `im-switch`,把默认输入法改成 `fcitx`。 50 | 5. 注销之后即可使用。 51 | 52 | 对于在非 Ubuntu 系统中安装的情况,可以参考[这篇文章](https://vjudge1.github.io/2014/04/02/type-chinese-in-linux/)来解决。 53 | 54 | # Qt 程序无法输入中文 55 | 56 | 部分 Qt 应用可能会无法调出中文输入法,即无法输入中文。可以参考[这篇文章](https://vjudge1.github.io/2014/04/02/type-chinese-in-linux/)来解决。 57 | -------------------------------------------------------------------------------- /_posts/configuration/2003-12-31-install-softwares.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "如何装软件?" 4 | faq: ["Linux 如何装软件?"] 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 刚入Linux,很多人会发现一个重大问题——怎么装软件? 10 | 11 | # 软件中心 12 | 13 | Windows 8 终于想到“软件中心”这个功能,虽然这个中心里没有多少有用的软件…… 14 | 15 | Windows 8 是 2012 年发布的,而 Linux 和 Mac 早就有“软件中心”这个东西了,并且里面有很多用得到的软件。 16 | 17 | 如果系统没有软件中心,怎么办?往下看。 18 | 19 | ## 软件包管理器(图形界面) 20 | 21 | 很多时候,别人都是告诉你安装什么什么“软件包”而不是软件。 22 | 23 | 其实大多数 Linux 都是拿“软件包”堆出来的。可以这样说,操作系统好比一件工业产品,一个软件包就好比一个零件。只不过考虑到新手不熟悉这些概念,所以就用“软件中心”把这些概念隐藏起来了。 24 | 25 | 有的时候我们就是想了解一些详细的信息,所以这时候就需要“软件包管理器”了。 26 | 27 | 由于 Linux 版本太多,用的软件包管理器也就乱七八糟。所以只能介绍两大类主流系统的,至于其他系统的管理器——谷歌或百度会告诉你。 28 | 29 | * Ubuntu 系列系统主要有两个:一个叫新立得软件包管理器(synaptic),另外一个叫 aptitude。很明显新立得更友好一些(当然 aptitude 也不错),因为 aptitude 是在黑窗口命令行里操作的。 30 | * Fedora/CentOS 的叫 yumex。 31 | 32 | 一个软件需要几个组件,而那些组件又需要另外一些组件……这就是软件包的依存关系,和产品组装有点类似。所以新手可能会被那些列表吓到,以为是 360 举家来袭。事实上 360 还没严重到让你猝不及防的程度,所以不必害怕。 33 | 34 | # 软件包管理器(命令行) 35 | 36 | 不是每个系统都会给你预备一个方便的 App Store,因为他们可能觉得你是高手,不屑于用这种东西。所以有时候还是要敲命令的。 37 | 38 | 敲命令看起来挺吓人,其实就一句话。假如我要装一个软件包名为vim的软件,那么命令就是—— 39 | 40 | sudo apt-get install vim 41 | 42 | 这是 Ubuntu 系列系统的。如果敲完提示 apt-get 不存在,那你就应该试试 yum(Fedora/CentOS),或者到网上查查到底应该用什么命令。 43 | 44 | 新立得软件包管理器叫 synaptic。如果你有 apt-get,那么可以 45 | 46 | sudo apt-get install synaptic 47 | 48 | 毕竟对于新手来说点鼠标比敲命令方便。高手感觉正好相反。 49 | 50 | 如果想卸载,直接 51 | 52 | sudo apt-get remove vim 53 | 54 | 换 yum 则是 55 | 56 | sudo yum erase vim 57 | 58 | [% callout style=warning %] 59 | 60 | #### 新手务必注意 61 | 62 | 卸载软件没有任何限制,也就是说,你甚至可以直接把系统关键组件通通删干净。所以卸载之前务必确认所要删除的东西,一旦卸载列表占了大半屏幕,就应该停下来,仔细检查这些东西到底是不是系统关键组件。 63 | 64 | [% endcallout %] 65 | 66 | 如果想做其他事情,apt-get --help,慢慢看帮助吧。 67 | 68 | ## 软件源 69 | 70 | 装软件的时候要联网,不要欠网费,因为系统要到有关单位去下载软件包,回来之后再给你安装。 71 | 72 | [% callout %] 73 | 74 | #### 备注 75 | 76 | 不是说什么时候都要联网。比方说你事先把软件包下载好了,或者知道dpkg或rpm命令。 77 | 78 | [% endcallout %] 79 | 80 | 这些有关单位不是新闻联播里面那些能上天下地入海的单位,而是一堆事先把软件包保存好的网站。这些网站就是软件源。 81 | 82 | 因为很多软件源是外国的,都要经过中国那个神奇的、越来越高的你懂得的东西,所以(不一定有因果关系吧……)有时候下载速度会很慢。因此,有时候你需要手动更换一下软件源。 83 | 84 | 那么软件源怎么更换呢?不同系统不一样,你得问问谷歌。总之,都是修改有关文件,把外国网址换成中国网址。这就是换软件源。 85 | 86 | 对于 apt-get,换完之后需要做一点事情。刚装好的系统也要做一下: 87 | 88 | sudo apt-get update 89 | 90 | 换完之后除了网速不一样,其他方面几乎完全相同。 91 | 92 | 那么国内的软件源会不会像某些公司那样随便捆绑呢?当然不会了,因为光从技术上讲就是费力不讨好的事儿…… 93 | 94 | ## 软件装哪儿去了 95 | 96 | 在 Windows 里安装软件,总会问你装到哪儿。出于节省系统盘空间、提高系统速度,很多人会把路径改成别的盘…… 97 | 98 | 也就 Windows 有这茬。那么 Linux 的软件到底都装哪儿去了? 99 | 100 | 答案:被拆散然后被吹得满地都是。比如可执行文件被吹到 /usr/bin,库文件是 /usr/lib,资源文件(图片音乐什么的)到了 /usr/share…… 101 | 102 | 那么,安装时候弄得这么零散,卸载时候能卸载干净吗? 103 | 104 | 答案:软件包是官方和社区维护的,即使想让它卸不干净,也会有人维护成可以卸干净的。因此没有什么可担心的。 105 | 106 | [% callout %] 107 | 108 | #### 当然 Linux 也有例外 109 | 110 | Qt 是一个典型的有安装向导的软件。而且由于权限原因,你没准不能直接双击安装运行。最常见的情况就是去终端给文件加个可执行权限,并且用 sudo 运行,然后才能顺利装上。 111 | 112 | [% endcallout %] 113 | 114 | ## 新系统必备 115 | 116 | * flashplugin-installer:浏览器 Flash 插件。虽然 Adobe 有点想放弃 Linux,不过插件目前至少还能用。 117 | * ubuntu-restricted-addons:主要是一些因版权原因不能预装的软件,如音乐、视频的解码器。 118 | * ttf-mscorefonts-installer:微软字体。同样由于版权原因,不能预装。 119 | * samba:和 Windows 系统共享文件。SMB 协议速度和稳定性不如 FTP、HTTP,因此会架 FTP 或 HTTP 服务器的可以无视。 120 | * 解压软件:unace unrar zip unzip p7zip-full p7zip-rar sharutils rar uudeview mpack lha arj cabextract file-roller 121 | 122 | 稍稍提示一下,sudo apt-get install 后面可以跟一串软件包的名字,软件包之间空格隔开。很多 Unix/Linux 命令都可以这样。 123 | 124 | * playonlinux gnome-exe-thumbnailer:其实就是 Wine(在 Linux 上运行 Windows 程序)。 125 | * synaptic/aptitude:你不觉得软件中心难用吗? 126 | 127 | # 源码安装 128 | 129 | Linux 就是自由开放。那些软件也跟着贯彻 GNU 精神,所以很多软件可以直接把程序代码搞到手。 130 | 131 | 以下几种情况你会考虑到源码安装: 132 | 133 | 1. 我要最新版本的软件! 134 | 2. 我要对软件进行修改! 135 | 3. 软件包管理器找不到这个软件,但是我有程序代码! 136 | 4. 我要完成操作系统老师布置的作业! 137 | 138 | 源码安装的套路都是一样的: 139 | 140 | 1. 把代码下载下来,找个解压缩软件解压。 141 | 2. 看看程序用什么语言写的,确认 binutils 和编译器什么的装没装好。 142 | 3. 有没有特殊要求(编译参数)。如果不需要,敲命令就可以肆无忌惮了。 143 | 4. 在终端里 cd 到代码的目录,进行三部曲: 144 | 145 | ./configure 146 | make 147 | make install 148 | 149 | 源码安装经常在半路发生错误。幸运的是,多数情况都只是 C 语言缺头文件——这时候你需要到网上搜一搜这些头文件是哪部分的,是哪个软件包带的,然后用 apt-get 之类软件包管理器补上,然后重新 make。 150 | 151 | # QQ 152 | 153 | QQ 是 Linux 用户的眼中钉。因为 154 | 155 | 1. 用以上提到的任何方法都无法安装 QQ, 156 | 2. 因为 QQ 根本不开发 Linux 版本, 157 | 3. 而且 QQ 不容忍那些模拟 QQ 协议的客户端,基本没有替代品, 158 | 4. 最关键的是,在中国,人们不是用 QQ 就是用微信,你和程序猿朋友一般都能躲开,但是你的男朋友和女朋友肯定不会放弃 QQ、微信。 159 | 160 | 特事特办,[这里]({{ site.baseurl }}/03/qq/)有一个有关 Linux 里面跑 QQ 的简介。当然没有人保证它好用,毕竟腾讯官方是拒绝的。 161 | -------------------------------------------------------------------------------- /_posts/development/2007-12-22-docset.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "码农必备的随身参考手册" 4 | --- 5 | 6 | 作为码农,每天当然要接触各种语言和各种库,还有各种框架。因为库和框架总会有一大堆类一大堆函数,而很多编辑器不像 Visual Studio 那样能够 IntelliSense,并且有些函数即使知道签名也不见得会用,所以当然需要一个参考手册—— 7 | 8 | * Mac/iOS:Dash 是非常好用的参考手册,支持各种主流语言、类库和框架,支持代码片段管理,支持与主流编辑器集成。App Store 上可免费下载但付费后才能自由使用。 9 | * Windows:Dash 的 Windows 版叫 [Velocity](http://velocity.silverlakesoftware.com)。虽然是付费软件,但是如果你不嫌它跳出烦人的提示框的话,可能需要也可以不掏钱。 10 | * Linux:Dash 不出 Linux 版,所以有人开发了 [Zeal](http://zealdocs.org)。自由软件,与Dash文档兼容,不过功能稍微少点。 11 | * Android:[LovelyDocs](http://lovelydocs.io),也要掏钱。 12 | * 在线:[DevDocs](http://devdocs.io),免费,只不过它的 CDN 被墙了,所以…… 13 | 14 | 作为中国人,都应该知道怎样付钱用软件吧…… 15 | -------------------------------------------------------------------------------- /_posts/development/2007-12-23-backend.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "网站开发(后端)" 4 | date: 2007-12-23 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 本文介绍一些常用的网站开发语言和框架。之所以介绍一些,而不是一个,是因为不同选择有不同的优缺点——没有一种能够“放之四海而皆准”的语言。 10 | 11 | [% callout %] 12 | 建立一个干净的开发环境 13 | 14 | 如果想建立一个干净的开发环境,可以使用虚拟机。幸运的是,有人开发了一个基于虚拟机的构建软件 [Vagrant](https://www.vagrantup.com),这样就可以轻松构建干净的开发环境,甚至在团队中使用相同开发环境了。 15 | 16 | 该软件有 for VirtualBox 和 for VMware 两个版本。因为 VMware 和 Vagrant for VMware 都是要掏钱的,所以建议用 VirtualBox。 17 | [% endcallout %] 18 | 19 | # 1. PHP 20 | 21 | PHP 是最流行的 Web 服务器语言。PHP 语言最容易学习,也最容易部署,基于 PHP 的解决方案也最多——例如博客系统 WordPress、论坛系统 Discuz!、微信后台系统 WeiPHP…… 22 | 23 | 很多时候你甚至都不需要再从头制作网站了,只要找到一个接近自身需求的,稍微改改代码,然后就可以拿去用了!这种行为叫做“二次开发”,所以只要不侵犯版权就不必觉得太内疚:smirk:——至于自由软件那就更不用说了。 24 | 25 | ## 流行框架 26 | 27 | ### 解决方案 28 | 29 | 既然有身经百战见得多了的应用,为什么不拿来稍微改改就投入生产呢?一般开源项目的安全性、功能和效率要比自己写的好多了。 30 | 31 | * 博客:WordPress、Typecho 32 | * 论坛:Discuz! 33 | * CMS(内容管理系统):Joomla!、Drupal(需要大量学习)等 34 | * 百科系统:MediaWiki 35 | * 微信后台:多到罄竹难书,随便捡一个都能用。**决定使用之前先考察一下安全性如何,免得因为漏洞被爆!** 36 | 37 | ### 起步 38 | 39 | 开发一个产品,纯粹从零开始,如果自身经验不足,为什么不用一些成熟的东西呢? 40 | 41 | 常用的就是 MVC(模型-视图-控制器)架构的框架,例如 Lavarel、CodeIgniter、CakePHP 等。这些框架都吸收了其他设计模式的长处,适合敏捷开发。 42 | 43 | 从零开始当然可以,不过一定要认真设计一下系统的结构,免得在扩展功能的时候瘫坐在地上哭。 44 | 45 | ## 缺点 46 | 47 | 因为 PHP 非常容易上手,所以新手很容易写出能够实现功能,但存在安全漏洞并且难以维护的代码。因此**强烈建议新手**注意以下几个问题: 48 | 49 | 1. 尽量使用经受检验的现有框架和应用。 50 | 2. 如果自己开发,尽量学习如何写出一个前后端分离的程序。可以借鉴优秀作品的思路。 51 | 3. 务必注意安全性问题。 52 | 53 | PHP 本身不支持多线程,也不支持实时系统,有此类需求的应当使用其他语言。 54 | 55 | # 2. JSP 56 | 57 | Java 也非常流行——从桌面应用、网站、嵌入式设备(手机)都有 Java 的影子,可见 Java 无处不在。JSP 自然就是用 Java 开发了。 58 | 59 | 基于 Java 的 MVC 框架有 Spring 等。 60 | 61 | 因为 Java 支持 socket,所以可以用 Java 开发实时应用。 62 | 63 | ## 缺点 64 | 65 | Java 有一个重要缺点就是对硬件要求比较高,内存占用比较大,速度稍慢。但是 Java 伸缩性非常好,如果需要一个巨大的系统,不妨使用 Java 开发。 66 | 67 | 此外,JSP 新手也容易写出有一堆安全漏洞的东西。 68 | 69 | # 3. ASP.NET 70 | 71 | ASP 和 ASP.NET 是微软的东西(在有些人例如 Linuxer 眼里,微软的东西往往是"另类")。ASP 已经过时,所以自然要用新一代的 ASP.NET。ASP.NET 一般用 C# 语言开发。C# 是一个可以和 Java 竞争的语言,尤其是在 .Net 部分开源,以及 ASP.NET 开源之后…… 72 | 73 | ASP.NET 和 JSP 功能都很强大,使用领域类似,而且 ASP.NET 也容易学习。 74 | 75 | ASP.NET 有一个致命缺点,就是它一般需要在 Windows 服务器上运行。虽然它开源了,别忘了 SQL Server 还需要 Windows…… 76 | 77 | # 4. Node.js 78 | 79 | Node.js 是服务器端的 JavaScript。创造 Node.js 就是为了解决高并发的问题,因此 Node.js 更适合高并发的应用。 80 | 81 | Node.js 采用事件驱动、异步执行的模式。这种与众不同的设计方式使得它有良好的高并发支持。 82 | 83 | Node.js 擅长的领域有: 84 | 85 | 1. JSON API 86 | 2. 实时系统(如聊天室) 87 | 3. I/O 密集应用 88 | 4. 单页应用 89 | 5. 工具 90 | 91 | 比较流行的框架有 ExpressJS 等。 92 | 93 | 此外 Node.js 也可以用于基于浏览器的桌面应用的开发——例如 Atom 编辑器就是一个基于浏览器的桌面应用。 94 | 95 | # 5. Python 96 | 97 | Python 是轻巧的脚本语言,对网络功能有良好的支持,因此可以被用于服务器端的开发。 98 | 99 | 值得一提的是,Python 除了可以架网站,也适合用于执行一系列耗时和需要定时执行的后台任务,例如抓取数据或者数据维护。因此可以使用其他语言制作网站,然后用 Python 脚本来“干活”。 100 | 101 | 流行的基于 Python 框架有 Django 等。 102 | 103 | # 6. Ruby on Rails 104 | 105 | Ruby on Rails 是基于 Ruby 语言开发的框架。虽然 Ruby on Rails 也比较火,但是在国内并不如其他语言流行,甚至很少有能够直接部署 Ruby on Rails 应用的应用引擎。 106 | 107 | Rails 是一个 MVC 框架,适合敏捷开发。正是因为 Rails 的出现,带动了 Ruby 使用者的增长。 108 | 109 | 不幸的是,Ruby 对 Windows 非常不友好——在 Windows 中安装 Rails 就是在浪费生命,而且很可能失败。即使安装成功,运行速度也让人难以忍受。因此不建议狂热的 Windows 爱好者使用 Ruby 开发应用。因为 Ruby 是日本人创造的东西,所以粪青们一定要抵制一切和 Ruby 有关的东西,包括在系统里预置了 Ruby 的苹果手机和苹果电脑。 110 | 111 | # 7. Go 112 | 113 | Go 是谷歌创造的一门编译型语言,它的特点是开发快、性能高、稳定性好,适合分布式系统。有人说 Go 是“网络时代的 C 语言”。 114 | 115 | Go 比较适合 API 类应用的开发。 116 | 117 | 常用的框架有 Revel、beego 等。 118 | 119 | # 8. CGI 120 | 121 | 纯粹的 CGI 效率并不高,而且服务器解决方案那么多,什么时候会用纯 CGI 呢?答案:嵌入式系统。 122 | 123 | 由于嵌入式设备本身性能不高,网页后台甚至会用 C 语言开发。但是 C 语言的字符处理能力很差,并不适合处理这些不难但是比较麻烦的东西,所以有人开发了 cgic 库,可以节省不少精力。 124 | 125 | 除了 C 语言之外,也可使用 lua 开发。典型的例子是 OpenWrt 的设置页面。 126 | -------------------------------------------------------------------------------- /_posts/development/2007-12-24-frontend.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "网站开发(前端)" 4 | date: 2007-12-24 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 网页前端,指的就是用户“看得见”的、浏览器呈现给用户的那一部分。与之对应的、用户看不见的用于数据处理的部分是后端。 10 | 11 | 一个良好的设计应该将前后端充分分离——这样程序猿可以专注于后端的功能实现,而设计狮可以专注于前端的设计。 12 | 13 | # 前端语言 14 | 15 | 前端有且只有三种语言:HTML、CSS、JavaScript。尽管看起来很多,实际上每一样都不难学——它们是互相配合使用的。 16 | 17 | * HTML 用于描述“网页里有什么东西”。最新的标准是 HTML5。 18 | * CSS 用于描述“网页的东西长什么样”。最新的标准是 CSS3。 19 | * 为了支持一些动态语言功能,例如变量,人们在 CSS 的基础上进行了改进。常见的有两种语言:LESS、Sass。LESS 和 Sass 均会把它们的代码“翻译”成对应的 CSS 代码。但是,通过这两种“动态”语言,开发者可以维护良好的编码风格,从而提高生产力。 20 | * JavaScript 是一种脚本语言,主要用于操作网页上的元素 (DOM)。也可用于客户端的计算,例如在客户端的表单验证。 21 | * 派生语言:CoffeeScript、TypeScript 等,它们均吸收了其他语言的长处,避免了 JavaScript 的某些弊端。它们可以将自己的代码编译成合法的 JavaScript 代码。 22 | 23 | # 注意 24 | 25 | 前端和后端的开发有很大区别——前端更专注于漂亮而又交互良好的用户界面。 26 | 27 | 在设计时要考虑到不同浏览器的差异: 28 | 29 | * 桌面浏览器 30 | * 不支持 HTML5 和 CSS3 的 IE6/7/8 31 | * IE 9/10/11 32 | * Chrome 33 | * Firefox 34 | * Safari 35 | * Opera 36 | * 移动设备(手机/平板) 37 | * Android 内置浏览器 38 | * Firefox 39 | * Chrome 40 | * Safari 41 | * 应用内浏览器:如 QQ、微信 42 | 43 | 尤其是 JavaScript 代码,如果未充分考虑浏览器兼容性,网站的功能会大打折扣。 44 | 45 | 设计时还应该考虑不同尺寸(分辨率)的差异,例如小屏和大屏手机、平板、1024x768、1366x768、1600x900、Retina 屏等。 46 | 47 | # 流行框架 48 | 49 | 对于个人而言,从零开始设计网页是不明智的,特别是在需要兼顾移动设备的情况下。因此采用一些框架可以节省很多时间。 50 | 51 | HTML5 Boilerplate 是一个良好的开始。 52 | 53 | Bootstrap 和 Foundation 等都是一套设计好的样式,并且提供了很多可以直接使用的组件。因为这些样式用得太滥了,所以你可能更愿意重新设计样式(或者仅仅换个配色)。 54 | 55 | 至于 JavaScript,现在有大量封装好的 JavaScript 库,可用于动画、DOM 操作、AJAX、MVC 等各个方面,如 jQuery、Prototype.js、AngularJS、Backbone.js。 56 | 57 | # 编辑器 58 | 59 | 如果前后端在一起,推荐 Jetbrains 家的产品——IntelliJ IDEA、WebStorm、PHPStorm……它们的价格非常贵,所以可以使用社区版本或学生优惠(不要钱)。 60 | 61 | 如果只写前端,推荐 Adobe Brackets。值得一提的是它的 Live Preview 功能,可以一边改代码一边看效果——有两个显示器那么工作就更轻松了。 62 | -------------------------------------------------------------------------------- /_posts/development/2007-12-25-github.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[码农必知]GitHub" 4 | date: 2007-12-25 00:00:00 5 | --- 6 | * contents 7 | {:toc} 8 | 9 | [% callout %] 10 | 11 | #### 程序猿幽默 12 | 13 | 本文就是在恶搞[程序猿#程序员]。为了照顾不懂幽默的读者和[维基人#一本正经的人],请把鼠标放到[蓝色文字#蓝色文字]上面,或者 14 | 15 | 16 | 17 | 维基百科上面有一个恶搞 GitHub 的用户页,详见[这里](https://zh.wikipedia.org/wiki/User:Vjudge1/GitHub)。 18 | 19 | [% endcallout %] 20 | 21 | [GitHub](https://github.com) 是全球最大的[同性交友#社交编程]网站,也是最活跃的[搞基场所#基于 Git 版本控制软件的空间]。 22 | 23 | # 价格 24 | 25 | 注册账户不收费,[搞基#编程]也不收费,但[整个搞基过程都是公开的#默认代码仓库都是公开仓库,任何人都可以浏览代码]。如果想[开私密房间#建立私有代码仓库],你就只能掏钱了。 26 | 27 | 如果你是个老总,GitHub 提供了私人定制服务,这样就可以[足不出户在自己公司和自己公司的员工搞比利了#在自己的服务器上进行版本控制工作]。 28 | 29 | # 功能 30 | 31 | 知乎上面有人总结了 GitHub 的基本功能: 32 | 33 | * [同性交友#GitHub 是社交网站,具有和社交网站相同的好友、评论、赞、讨论等功能。] 34 | * [真人约会#任何人均可参与其他人的代码仓库的开发。(当然不能直接改人家的代码。)] 35 | * [排解寂寞#协同开发与编程,而且支持互相评论。] 36 | * [释放压力#通过 Git 版本控制系统来提高生产力。] 37 | 38 | ![github]({{ site.baseurl }}/images/development/gayhub.png) 39 | 40 | 这是知乎里面的一张图(其实知乎还是比较严肃的,这张图是个例外),内容是一个用户页。每个用户都可以[约#Follow]其他人,其他人也可以[约#Follow]用户。[约#Follow]了别人之后,你就可以从首页上看到他的[约会动态#开发动态]。 41 | 42 | 为了[搞基#开发程序],你需要[开个房间#建立代码仓库 (Repository)]。点击“New Repository” ([开房#建立代码仓库]) 建立[房间#代码仓库]。 43 | 44 | 下面将详细介绍如何在自己或别人[房间#代码仓库]里[搞基#编程]。 45 | 46 | # 在自己[房间#代码仓库] 47 | 48 | 毕竟不是旅馆,所以总得知道怎样在[房间#代码仓库]里[玩耍#操作],然后才能[玩得开心#顺利开发]吧? 49 | 50 | [% callout %] 51 | 52 | #### 提醒 53 | 54 | 你可以随便在自己的空间内做实验。反正不要钱,而且玩够了可以直接到代码仓库的“Settings”里面删除。 55 | 56 | [% endcallout %] 57 | 58 | 大部分[搞基准备工作#开发工作]都是在本地完成的。在[搞#开发]到一定程度的时候应该记录 (Commit) 一下,这样,在遇到问题的时候就可以有效地追踪[变化#改动],方便[吃后悔药#回退 (Revert) 错误更改]。 59 | 60 | ## 客户端 61 | 62 | 为了[方便偷懒#少敲一堆命令],GitHub 开发了 Windows 和 Mac [客户端](https://desktop.github.com/)。虽然界面也是英语的,但是一看英语就头疼的人应该不会去编程,所以基本上不耽误事儿。 63 | 64 | [% callout %] 65 | 66 | #### 邮箱 67 | 68 | Git 有个关于邮箱的配置。一定要写上自己在 GitHub 上注册时的邮箱,否则提交之后动态也不算你的。 69 | 70 | [% endcallout %] 71 | 72 | [% callout style=warning %] 73 | 74 | #### 关于 Linux 用户 75 | 76 | 因为用 Linux 的是[高手和宅男#少数人],因此 GitHub 没有 Linux 客户端。既然是高手,那么在 Linux 中[当然#只能]用 git 命令。[这里](http://www.bootcss.com/p/git-guide/)有个又简单又醒目的入门教程。 77 | 78 | 在用户认证方面,建议使用 SSH key,这样可以少敲 N 次密码。需要进入 GitHub 网站的用户设置,找到 SSH Key 并且把生成的 key 复制到里面。 79 | 80 | [% endcallout %] 81 | 82 | ## [开房#建立代码仓库] 83 | 84 | “[房间#仓库] (Repository,简称 Repo)”是[搞基#存放源代码]的地方。[进出#存取、修改]、[闲谈#评论](Issues)都是在这里完成的。 85 | 86 | 所以,想[开房#建立代码仓库]的时候,就应该点击“New repository”按钮,然后起一个名字。名字只支持英文字母数字和符号。 87 | 88 | 默认情况下,建立的[房间#仓库]都是公开的,反正不要钱。只有付费用户才能[享受 VIP 高档私人房间#建立私有仓库],价格 $7/月。 89 | 90 | ## [玩耍#编辑] 91 | 92 | 在继续之前,先对仓库所处位置进行一个区分:一个是在 GitHub 网站上面的,一个是在自己电脑上面的。当然,只有把改动上传到网站上面才算数(备注:其实只要 Commit 就算数)。 93 | 94 | 你不能直接(不能直接当然就是间接)把你搞的东西提交上去,因为[你不能证明那是从 GitHub 搞过来的#本地代码缺少 Git 信息]。你需要让本地仓库里面存在有关 GitHub 的信息(Git 信息)。 95 | 96 | 一个简单省事儿的办法是: 97 | 98 | 1. 先到网站上面,进入到[房间#仓库],然后点击页面右下角的“Clone in Desktop”。不用理会上面的 “clone URL”,反正那是给[宅男#敲命令的人]用的。接下来,GitHub 客户端会自动启动,并询问你将代码保存到什么位置。如果没启动,那你应该先把客户端装好。 99 | 2. 把你弄好的乱七八糟的东西都拽到刚保存的文件夹中。 100 | 101 | 需要注意的是,页面上有个“Download ZIP”按钮,那个不是给开发者用的,而是给那些希望[抄袭代码然后拿大奖#直接下载]的人用的(后面会详细介绍)。因为下载完的压缩包里也没有 GitHub 信息。 102 | 103 | ## 提交和同步改动 104 | 105 | Git(不是 GitHub)记录的是改动,因此 Git 更适合纯文本文件。如果主要工作在 Word、Excel、PowerPoint 上面,那么就不应该用 GitHub,而是应该用软件自带的“协作”功能,顺便还能[聊天](http://www.baidu.com/link?url=nsg0Z7UCflcHUx0IAh3JKNkCXkVk_GaJhQ5SQcoOZ-qat6xkpoZCbFi1nKF8957_q60JATi0JLFj-DY-zNKd_BSAsOn_baEaY4LYTYAZUmW&wd=&eqid=a1a8467700016cfa0000000355deadd2)。 106 | 107 | [搞#编辑]到一定程度,例如完成了一个功能,应该确认 (Commit) 一下改动,以方便追踪。[没有人想和一个一问三不知的人搞基#没有人愿意和不做任何记录和版本控制的码农合作]。 108 | 109 | 打开 GitHub 客户端(不是网站,因为改动还在本地),找到自己的仓库,客户端会列出你所进行的改动。你需要决定标记哪些文件,然后填写说明,并确认 (Commit) 改动。 110 | 111 | 注意,Commit 之后改动仍然在本地,而网站上面并不能看到这些改动。点击“Sync”按钮之后才能在网站上面看到最新动态。 112 | 113 | 还要注意,你不能直接[闯进别人的房间里#提交对别人的软件仓库的编辑],除非别人[是你基友,允许你这样做#在仓库设置中把你设置为“合作者 (Collaborators)”]。 114 | 115 | ## 分支 (Branch) 116 | 117 | 一个软件有很多功能。如果你[玩得够大#程序功能很多],可以通过分支 (Branch) 来分割项目,从而做到各司其职。 118 | 119 | ## 发布 (Release) 120 | 121 | 当你的[糟糕物成熟#程序稳定]之后,你可以决定将其发布 (Release),这样别人就可以直接下载体验现成的二进制文件了。发布之后还有一个好处——很容易找“1.0”、“1.1”、“2.0”版本,免得乱套。 122 | 123 | ## README.md 124 | 125 | README.md 是个纯文本文件,用 Markdown 语言书写——不要以为所有的编程语言都像 C 语言那样难学,Markdown 就很好学,几分钟就能学会,而且就算你[笨到根本学不会#有极其严重的代码恐惧症(那还来 GitHub 做甚)],当作纯文本也能用。 126 | 127 | 如果你在[房间#代码仓库]根目录下放了一个 README.md 文件,写了[“欢迎来搞基,这个房间是用来……的”文字#程序简要说明],那么别人路过你的[房间#代码仓库]的时候就不会一头雾水了。 128 | 129 | ## Wiki 130 | 131 | 不要一看到 Wiki 就想到维基百科 (Wikipedia) 或者伪基百科。Wiki 是一种文档系统,用在[房间#代码仓库]上面,当然就是用来写有关[搞基#程序]手册的了! 132 | 133 | 在 GitHub 网站,进入[房间#代码仓库],看右面,然后你就能发现“Wiki”了。 134 | 135 | # 去别人[房间#代码仓库] 136 | 137 | 当你有了知识水平和一点人生的经验之后,你就可以到别人那里[寻欢作乐#参与开发]了! 138 | 139 | ## [聊天灌水#评论] (Issue) 140 | 141 | 打开 GitHub 网站,进入一个[房间#代码仓库],你会看到右面有个“Issues”。这就是让你[灌水#评论]的地方。 142 | 143 | 你可以选择发起一个新对话,也可以跟楼排队形。可以随便[发发牢骚#报告 bug],[表达不满#提出建议意见]。 144 | 145 | [% callout style=danger %] 146 | 147 | #### 严正声明 148 | 149 | 尽管本文的恶搞版本将“Issue”称作“聊天”、“灌水”,但是你不应该在 GitHub 的评论中写与程序无关的东西,不要发不合适的内容,更不要连着发帖。因为你每灌一次水,程序作者和关注 (Watch) 这个程序的人就会收到一封垃圾邮件。 150 | 151 | 你应该只发与程序有关的、有建设性的、语言表达客气得体的文字,共同维护良好的气氛。 152 | 153 | [% endcallout %] 154 | 155 | Issue 支持 Markdown 语法,也支持发图片。如果你对 Markdown 不熟,Issue 支持在线预览。 156 | 157 | ## 分支 (Fork) 、提交 (Pull)、合并 (Merge) 158 | 159 | [直接闯入别人房间是不对的#你不能直接修改别人的代码],但这不代表你不能[闯#修改],只不过你需要间接地来。 160 | 161 | 为了[大大方方的从正门去别人家搞基#将你的改动反映到对方代码仓库中],你需要先迂回一下,在对方[房间#代码仓库页面]右上角点击“Fork”,将其分支出来。这时候你就[把人家房间复制成自己的了#有了一个副本],这个副本是可以按照自己意愿随便改动的。 162 | 163 | 当你感觉自己[恶搞#修改]得很漂亮的时候,你就可以去对方[房间门口敲门#申请合并]了。这时你需要点击页面右面的“Pull requests” ([合作#合并]请求),然后点击“New pull request”([合作#合并]!)按钮。 164 | 165 | 此时 GitHub 会帮你分析你都做了哪些[恶搞#修改],你也可以顺便看一下自己的东西好不好看。感觉 OK 之后,到页面下方写点评论(你都做了哪些[坏事儿#贡献]),然后点击“Comment”(评论)。接下来就可以等对方同意了。 166 | 167 | 在你评论之后,对方会收到一封邮件,[搞基过度有害健康#因为对方不可能一直在线去看 GitHub]。对方点击相同的“Pull requests”时会看到你发的帖子,然后可自行决定是否[合作#合并] (Merge)。如果对方决定 Merge,那么你就成功地[和对方搞基#为对方代码做出贡献]了。不管对方同意还是拒绝还是不做回应,对方都可以进行评论,这样双方就[可以先增进感情#互相就程序问题进行讨论]。 168 | 169 | 在正式[合作#合并]之前,你的[恶搞#改动],不管是发起申请之前的,还是申请之后的,都会算到 Pull request 之中。这也是[增进感情#进行互动]的需求。 170 | 171 | 有时候大家[搞得很融洽#代码没有冲突],[合作#合并]过程就很顺利。但是有时候[手乱伸就容易冲突#改动会发生冲突],这时就需要[对方#程序作者]决策,手工解决冲突,然后再[合作#合并]。 172 | 173 | [% callout %] 174 | 175 | #### 合作者 (Collaborators) 176 | 177 | 如果你和[基友#合作者]一块[搞基#开发],那么你可以考虑将[基友#合作者]设置为“合作者” (Collaborators),这样他就不用麻烦地 Fork 和 Pull 了。 178 | 179 | 合作者设置在[房间#代码仓库]设置里。在页面右面的“Settings”中。 180 | 181 | 如果合作者太多,可以考虑成立一个组织 (Organization)。 182 | 183 | [% endcallout %] 184 | 185 | ## 组织 (Organization) 186 | 187 | GitHub 里建立组织是合法的,想建立多少就可以建立多少,而且不用备案登记。 188 | 189 | 既然是一个组织,那么就可以设置管理员,并且各路[基友#开发者]就可以一起[玩 >3 Players 的游戏#协同开发]。 190 | 191 | 组织的地位和用户是平等的,除了你不能[约#Follow]一个组织,组织也不能[约#Follow]你。 192 | 193 | [% callout style=danger %] 194 | 195 | #### 不要反党! 196 | 197 | GitHub 是用于软件开发的网站,也是中国很多软件公司保持运转的重要工具。没有人希望 GitHub 只是因为里面有一点不恰当的政治内容就被墙了。同样,没有人喜欢被有关部门请去喝茶。 198 | 199 | [% endcallout %] 200 | 201 | 虽然 GitHub 不用备案登记,不过,如果你做了反动的事儿,[水表和快递#警察叔叔]还是要来的。 202 | 203 | # 其他 204 | 205 | ## 搜索 (Search) 206 | 207 | 既然全世界的码农都到这个网站[搞基#编程],那么, 208 | 209 | 在你准备开发一个应用的时候,为什么不先搜索一下,找一个类似的项目借鉴借鉴呢? 210 | 211 | 这里有一个 Search 的经典案例:有人到 GitHub 里抄袭代码,然后就[获奖](https://github.com/iiordanov/remote-desktop-clients/issues/39)了,而且是最高奖!所以,你为什么还不趁着 GitHub 没被墙的时候抄一个大奖回来? 212 | 213 | 因为想拿奖的人太多了,所以 GitHub 页面顶端就有一个搜索栏。搜索之后还可以根据语言来筛选。 214 | 215 | ## Octocat 216 | 217 | 注意!喵星人来袭,[点这里抵御攻击!](https://octodex.github.com) 218 | 219 | [% callout style=warning %] 220 | 221 | #### 关于抄袭 222 | 223 | 在天朝,抄袭一点创意,copy 一点素材都是无所谓的。不过,得等到 GitHub 彻底被墙之后再说。因为,复旦在 2015 年制作宣传片时抄袭了一些没有被墙的东西,结果连续两次引发了群众的强烈不满……(相关新闻:复旦[第一次抄袭](http://ent.sina.com.cn/m/c/2015-05-28/doc-icpkqeaz5906836.shtml)、[第二次抄袭](http://news.sohu.com/20150531/n414143642.shtml)) 224 | 225 | [% endcallout %] 226 | 227 | ## Gist 228 | 229 | 有时候,因为[没什么基情#只有一些代码片段],不值得[开房搞基#建立代码仓库],所以 GitHub 提供了另一个服务——GitHub Gist。 230 | 231 | Gist 的功能和 GitHub 类似,不过里面都是[段子#代码片段],规模比较小,小到在线就可以编辑。当然仍然可以用 Git 来进行版本控制,只要你不嫌麻烦。 232 | 233 | 在中国,虽然墙娘不敢再随便欺负[小猫#GitHub],但是 GitHub Gist 仍然被墙,所以: 234 | 235 | 192.30.252.142 gist.github.com 236 | 199.27.74.133 gist-assets.github.com 237 | 238 | ## Pages 239 | 240 | GitHub Pages 是免费的静态空间服务,可以架设静态网站,包括静态博客。 241 | 242 | 常用的静态博客系统有 Jekyll、Hexo 等。其中 Jekyll 是受 Pages 官方支持的。常用的评论系统有 Disqus 和多说。 243 | 244 | 因为静态空间实现不了多大功能,而且静态博客系统不支持 Windows,因此乡民们更愿意在 GitHub 搞基,而不是喝茶写博客。 245 | 246 | ## GayHub 247 | 248 | 2015 年 6 月 26 日,美国最高法宣布同性婚姻合乎宪法。为表示庆祝,GitHub 将网站 logo 换成了彩虹背景。不过毕竟不能排斥异性恋,所以后来又把 logo 换回来了。 249 | 250 | 251 | 286 | -------------------------------------------------------------------------------- /_posts/development/2007-12-26-android-dev.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "构建 Android 开发环境" 4 | date: 2007-12-26 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | iOS 应用只能用 Mac/Xcode 开发,Windows Phone 应用只能在 Windows/VS 下开发,所以它们没什么麻烦事儿。但是,因为 Android 本身就比较乱,而且是谷歌搞的,有一个你懂得的问题,所以…… 10 | 11 | 因为 Android 开发环境配置比较麻烦,为了节省大家的时间,大家照着本文操作即可。 12 | 13 | # 配置环境 14 | 15 | 过去常用的软件是 Eclipse+ADT 插件,不过 ADT 已经停止支持,所以当然要用官方新推出的 Android Studio。 16 | 17 | Android Studio 基于 IDEA 平台,因此用过 IntelliJ IDEA、WebStorm、PyCharm 等等软件的人一定会感到非常熟悉。反过来也一样。 18 | 19 | ## Android Studio 20 | 21 | 因为 Android 官网被墙,因此有人专门将其汇总了,提供了国内的镜像。我们可以从[http://www.androiddevtools.cn](http://www.androiddevtools.cn)下载。 22 | 23 | 截止到这里,只下载一个 Android Studio 就可以了,其他组件我们可以通过 Android Studio 来安装。 24 | 25 | [% callout %] 26 | 网络测试 27 | 28 | 打开命令提示符,输入: 29 | 30 | ping dl.google.com 31 | 32 | 如果能 Ping 得通(IP 可能是 203.208.41.\*),那么我们就可以直接通过官方源来安装组件了。 33 | [% endcallout %] 34 | 35 | ## 安装组件 36 | 37 | ### 如果 dl.google.com 没被墙 38 | 39 | 第一次启动 Android Studio 时,软件会提醒你安装 Android SDK。既然 dl.l.google.com(dl.google.com) 没有被墙,那么直接“下一步”就可以了。如果被墙,软件当然会提示“无法下载”。 40 | 41 | [% callout %] 42 | 2015年11月3日的情况 43 | 44 | * dl.l.google.com 能正常访问,所以大多数组件都能正常下载。 45 | * dl-ssl.google.com 被墙,所以谷歌眼镜 SDK 无法下载。 46 | 47 | 虽然事实上很多 Google IP 都能保证网站正常访问,但是 Android Studio 会认为证书不正确(事实上是正确的)从而拒绝下载。 48 | [% endcallout %] 49 | 50 | 确保你安装了以下组件: 51 | 52 | 1. SDK:因为 SDK 是向下兼容的,所以只装一个最新版就可以了。 53 | 2. Android SDK Build Tools 54 | 3. Android SDK Tools 55 | 4. Android SDK Platform-Tools 56 | 57 | 如果没装全,可以进入“设置”,找到“System Settings”->“Android SDK”然后下载安装。 58 | 59 | ### 如果被墙…… 60 | 61 | 如果被墙,你需要手动下载以下组件: 62 | 63 | 1. SDK Tools 64 | 2. SDK Platform-Tools 65 | 3. Build-Tools 66 | 4. SDK(只需选最高的那个版本) 67 | 5. Android SDK Extras 和 Support Library 68 | 69 | 把它们放到同一个目录中,然后到 Android Studio 的设置中把 Android SDK 的目录指定成你刚解压的位置。 70 | 71 | ## 模拟器 72 | 73 | Android SDK 自带模拟器,只要你不嫌卡,当然可以随便用。 74 | 75 | 此外再推荐一个——GenyMotion。详细说明可以看[这里]({{site.baseurl}}/12/genymotion/)。 76 | 77 | 除了模拟器,必须安装 VirtualBox 才能启动。为了方便,可以在 Android Studio 中安装 GenyMotion 插件。当然,因为 Android Studio 本身就可以在线查找下载安装插件,所以一点都不麻烦,更不用自己跑官网上去下载。 78 | 79 | 虽然 GenyMotion 也可以免费用(当然功能少很多),但是用于商业用途的话是需要掏钱的。 80 | 81 | # Hello world 82 | 83 | 按照国际惯例,把编程软件安装好之后,当然要用 Hello world 测试一下。 84 | 85 | 新建一个项目,命名为 HelloAndroid。 86 | 87 | * 带不带 Activity 呢?当然要带一个了。 88 | 89 | 打开 res/layout/activity_main.xml,应该能看到一个可视化编辑器。我们往里面添一个 Plain Text 和一个 Button,分别把 id 设置为 nameText 和 helloButton。 90 | 91 | 在代码中找到 MainActivity,把 onCreate() 改成: 92 | 93 | {% highlight java %} 94 | @Override 95 | protected void onCreate(Bundle savedInstanceState) { 96 | super.onCreate(savedInstanceState); 97 | setContentView(R.layout.activity_main); 98 | 99 | Button helloButton = (Button) findViewById(R.id.helloButton); 100 | helloButton.setOnClickListener(new View.OnClickListener() { 101 | @Override 102 | public void onClick(View v) { 103 | EditText nameText = (EditText) findViewById(R.id.nameText); 104 | String name = nameText.getText().toString(); 105 | 106 | AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 107 | builder.setTitle("Hello world"); 108 | builder.setMessage("Hello, " + name); 109 | builder.show(); 110 | } 111 | }); 112 | } 113 | {% endhighlight %} 114 | 115 | 在前面一堆 import 中加入 116 | 117 | {% highlight java %} 118 | import android.view.View; 119 | import android.widget.Button; 120 | import android.widget.EditText; 121 | import android.app.AlertDialog; 122 | {% endhighlight %} 123 | 124 | 把手机的 USB 调试打开,跟电脑连上,然后点击运行…… 125 | 126 | 如果感觉不错,想打包发布,那么只需要点击 Build 菜单里的 Generate Signed APK,然后按照向导操作签名即可。 127 | -------------------------------------------------------------------------------- /_posts/development/2007-12-27-gui.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "编写图形界面程序 (PC/Mac)" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 虽然现在 Web 应用非常火,但是有的时候,一个本地的应用程序还是很有用处的,例如一个小工具或者一个大项目。 9 | 10 | 在若干年前,如果想快速地写一个图形界面程序,VB6 和易语言都是不错的选择。很可惜,本文是 2015 年写的,那些东西早就过时了。为了能在新的操作系统上跑起来,我们也该与时俱进。 11 | 12 | # 很“重”的框架 13 | 14 | “重”只是一种大致的感觉——或者是体积太大,或者“工程味儿”太重,不见得适合写一个随手就能用的小程序。 15 | 16 | ## MFC 17 | 18 | 编程软件:Visual Studio 19 | 20 | VS 有商业版和免费的社区版。如果是个人或小团队,不打算开发商业软件,用社区版足矣。 21 | 22 | 写 Windows 桌面应用,首选 Visual C++,毕竟是官方的东西。 23 | 24 | [% callout %] 25 | VC6 还是有用途的 26 | 27 | 某气功组织开发了两个著名的软件。为了兼容更多的系统,包括 Wine,他们就一直在用 VC6。 28 | [% endcallout %] 29 | 30 | ## Cocoa 31 | 32 | 编程软件:Xcode 33 | 34 | 果粉专用,而且 Xcode 也是个用起来很舒服的 IDE。当然,别去百度云上下载那个藏有病毒的 Xcode。 35 | 36 | ## .Net(Windows Forms / WPF) 37 | 38 | 编程软件:Visual Studio 39 | 40 | C#/VB 都是不错的选择——Visual Studio 功能强大,当然适合项目开发,也适合随手写个小程序。 41 | 42 | 当然写完了只能在 Windows 系统里头跑。不过要是目标受众的系统都在 Windows 7 以上,那么就可以放心地用 VS 写程序了。 43 | 44 | ## Qt 45 | 46 | 编程软件:Qt Creator 47 | 48 | *跨平台* 49 | 50 | Qt 分为商业版本和社区版本。 51 | 52 | Qt 也是一个强大的 C++ 框架,而且 Qt 是跨平台的——甚至连嵌入式设备都在广泛使用。Qt 自带一套集成开发环境,既适合大型项目,又适合小型程序。 53 | 54 | # 不太重 55 | 56 | ## AWT/Swing 57 | 58 | Java 是*跨平台*的,用 Java 写的 GUI 程序也是。 59 | 60 | 值得注意的是,Java 的 IDE 非常多,但是并不是所有 IDE 都有界面设计器。如果需要界面设计器,可以考虑 NetBeans 或 MyEclipse。 61 | 62 | ## Gtk# 63 | 64 | 编程软件:Xamarin Studio(MonoDevelop) 65 | 66 | *跨平台* 67 | 68 | 既然 C# 是个优秀的语言,当然不能只让它在 Windows 上面跑——Mono 项目。 69 | 70 | 虽然 C# 和 .Net 是开源的,但是 Windows Forms 等是针对 Windows 而且还不开源,因此即使用 C# 编程也需要用其他框架。 71 | 72 | ## Lazarus 73 | 74 | 编程软件:Lazarus IDE 75 | 76 | *跨平台* 77 | 78 | 若干年前,Delphi 是一个很火的编程软件,可惜后来淡出了人们的视线(不过 Delphi 一直在开发)。 79 | 80 | Lazarus 是社区开发的编程软件和框架,也处于活跃状态,而且是自由软件。而且 Lazarus 尽量兼容 Delphi,所以直接找本 Delphi 的教材就可以进行学习了。 81 | 82 | Lazarus 和 Delphi 都是快速开发工具,就像 VB 和易语言那样。 83 | 84 | ## PyQt/PySide 85 | 86 | *跨平台* 87 | 88 | PyQt = Python + Qt 89 | 90 | 除了把编程语言换成了 Python 以外,其他东西都是一样的。 91 | 92 | # zenity 93 | 94 | 在 Linux 系统中,可以通过 `zenity` (基于 GTK+ 的桌面环境) 和 `kdialog` (KDE 桌面环境) 命令来编写带有对话框的脚本。如果在写脚本,而且只是需要一些简单的交互界面,这两个就够用了。 95 | 96 | # 其他 97 | 98 | 目前 Web 开发非常火,有人就把同样的东西搬到了桌面系统上—— 99 | 100 | 例如 Atom 编辑器,把 Node.js 作为后端,精简的浏览器作为主体,界面和功能就可以像开发 Web 应用一样进行开发了。 101 | 102 | 这样的框架也有很多,不妨到 Google 上面搜一搜。 103 | 104 | 以下是一个简单的总结: 105 | 106 | 框架/库 | 编程软件 | 编程语言 | 跨平台支持 | 界面设计器 107 | -----------|------------------|-------------|----------------|--------------- 108 | Qt C++ | Qt Creator | C++ | 是 | 内置 109 | GTK+ | Anjuta 等 | C 语言* | 是 | 有 (Glade) 110 | AWT/Swing | Eclipse | Java | 是 | 需要插件** 111 | wxWidgets | | C++ | 是 | 有 (wxGlade 等) 112 | Gtk# | MonoDevelop、
Xamarin Studio | C# | 是 | 内置 113 | Free Pascal| Lazarus | Pascal | 是 | 内置 114 | Gambas | Gambas | Basic | 否 | 内置 115 | PyQt | | Python | 是 | 附带 Qt Designer 116 | PyGTK | | Python | 是 | Glade 117 | 118 | 119 | \* 经过封装,Python、Perl、PHP 等语言也可以使用 GTK+ 库。
120 | ** 有些 Java 的 IDE,例如 NetBeans 或 MyEclipse 自带界面设计器。
121 |
122 | -------------------------------------------------------------------------------- /_posts/development/2007-12-28-script.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "系统自带的脚本语言 (Windows/Linux/OS X)" 4 | date: 2007-12-28 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 操作系统都应该支持一些脚本语言(除了那个和 Mac OS X 无关的 Mac OS,没有命令提示符),可以写写批处理之类的东西。 10 | 11 | 所以说,作为已经成为,或者准备成为电脑高手的人,不会写几句脚本,怎么能说得过去呢? 12 | 13 | [% callout %] 14 | 15 | #### GitHub Gist 16 | 17 | 本文的代码均存放在 GitHub Gist 中。因为 Gist 被墙,所以需要事先改一下 hosts: 18 | 19 | 192.30.252.142 gist.github.com 20 | 199.27.74.133 gist-assets.github.com 21 | 22 | 具体位置可到搜索引擎上搜索,随便找个文本编辑器就能改过来了。 23 | 24 | [% endcallout %] 25 | 26 | [% callout %] 27 | 28 | #### 猜数字 29 | 30 | [这里](https://gist.github.com/vjudge1/4504eb8c1a280dec55c0)是用本文提到的大多数语言编写的“猜数字”。 31 | 32 | [% endcallout %] 33 | 34 | # Windows 35 | 36 | 因为大多数 Windows 用户都是电脑新手,而且 DOS/Windows(在技术上与 Linux 比)确实不怎么地,所以 Linuxer 经常对 Windows 有偏见。本节文字要消除 Linuxer 的偏见。 37 | 38 | ## Batch (批处理) 39 | 40 | 很多人觉得 Windows 的批处理功能不够强大,实际上,确实不够强大(因为照那个伟大的 Unix “抄”的东西远远不够……) 41 | 42 | 但是,Batch 又不像很多人想象的那样弱——只不过是因为语法比较生僻,或者需要一些 Trick,知道的人不够多而已。 43 | 44 | 实在不行,还可以和 VBScript 配合完成工作,这样就好多了。 45 | 46 | 例如,[这里](https://gist.github.com/vjudge1/8f802503ab360689569a)是一个和 VBScript 配合实现 sudo 功能的程序。 47 | 48 | ## VBScript 49 | 50 | 在网页设计领域,VBScript 是一个连亲爹 IE 都已经彻底放弃的脚本语言。 51 | 52 | 在系统操作领域,VBScript 却是一个看起来没什么用,其实功能多到罄竹难书的脚本语言,不信你可以问问 slmgr.vbs。 53 | 54 | [% callout %] 55 | 56 | #### 黑历史 57 | 58 | VBScript 始终保持生命力,关键在于 CreateObject 函数。有了这个函数,你甚至可以只用记事本让 Excel 给你做点事儿(当然,脚本文件需要你自己双击运行)。不信的话看[这里](https://gist.github.com/vjudge1/3d84d0c41e69446f1607)。 59 | 60 | [% endcallout %] 61 | 62 | ## PowerShell 63 | 64 | 微软发现 Unix 的命令行太强大了,强大到那些用 Unix 的人都瞧不起 Windows,于是再次向 Unix 致敬学习。因为现在软件开发都讲究“面向对象编程”。所以,微软顺便给 PowerShell 加了面向对象的功能。 65 | 66 | 面向对象这一点,sh/bash/\*sh 就只能望尘莫及了,毕竟几十年前刚诞生的时候不会想到要加这个东西。 67 | 68 | 因为 PowerShell 既面向对象,又和 .Net Framework 完美集成,所以 PowerShell 的功能更是多到罄竹难书。 69 | 70 | [这个程序](https://gist.github.com/vjudge1/d0018a0b0909636aaf93)可在黑暗之中冒出一个带有按钮的窗口。 71 | 72 | 你看看,PowerShell 里的“$”、“ls”、“pwd”什么的,明显是照 Unix 学习过来的! 73 | 74 | # Linux/OS X 75 | 76 | Windows 用户可以不会写脚本,因为 Windows 就不是为写命令而设计的。不过,换成 Linux 和成功骗到 Unix 认证的 OS X…… 77 | 78 | ## shell 79 | 80 | shell 相当于 Windows 的批处理。shell 种类有很多——sh、bash、ksh、csh……默认情况下,OS X 和 Linux 使用 bash。 81 | 82 | 因为 shell 本身和操作系统没有太大关系,因此你可以随便借一本书来入门,Linux 和 Unix 的也可以,只要是敲 Unix 命令的都可以。 83 | 84 | 使用 shell 语言的程序多到罄竹难书。不信你可以随便下载一个软件的源代码,里面的 configure 就是一个只有上帝才能一口气写出来的 shell 脚本。 85 | 86 | ### awk 87 | 88 | awk 以及后面提到的 grep、sed、bc 都是 Linux/Unix 系统的一个命令。不过它们潜伏得非常深——因为它们各属一种语言。 89 | 90 | awk 是三位著名计算机科学家 (Alfred Aho、Peter Weinberger、Brian Kernighan) 姓氏首字母的合称,是一个强大的`文本处理工具`,也是一门编程语言。 91 | 92 | ### grep 93 | 94 | grep 最早由 Ken Thompson 写成。它用于文本的`正则表达式匹配`。 95 | 96 | 下面命令可以从进程列表中寻找 httpd: 97 | 98 | ps ax | grep httpd 99 | 100 | ### sed 101 | 102 | ed 是一个文本编辑器,所以 sed 的意思是“流编辑器”。 103 | 104 | sed 可以进行`文本编辑`、`正则匹配`和`替换`。它和 vi 的某些语法是类似的。 105 | 106 | ### bc 107 | 108 | bc 是一个`高精度计算器`。由于 shell 不支持小数,所以可以以管道到 bc 的方式进行计算: 109 | 110 | num=$(echo "scale=6; 5/3" | bc) 111 | 112 | 除了计算,bc 也支持条件语句、循环语句、函数等功能。 113 | 114 | ## Python 115 | 116 | Python 是流行的脚本语言,语法非常简单,功能很强大。 117 | 118 | Python 的设计哲学是“优雅”、“明确”、“简单”。Python 开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。 119 | 120 | Python 有两大类,一类是 Python 2,另一类是 Python 3。尽管 Python 2 已经很旧但是仍然被广泛使用,Linux 和 OS X 自带的也是 Python 2。 121 | 122 | 可以使用 `pip` 命令安装软件包 (OS X 需手动安装)。 123 | 124 | ## Ruby 125 | 126 | Ruby 也是一个脚本语言,受 Perl、Smalltalk 等语言启发。 127 | 128 | Ruby 的理念是“减少编程时候的不必要的琐碎时间,令编写程序的人高兴”,不过,因为 Ruby 比 Python 慢,而且多人协作时不容易统一编码风格,所以只有用 Ruby on Rails(网站框架)的程序员才真正高兴。 129 | 130 | GitHub 最早是 Ruby 的社区,GitHub 本身有很多组件使用 Ruby 语言进行开发。 131 | 132 | 可以使用 `gem` 命令安装软件包。 133 | 134 | [% callout %] 135 | 136 | #### 你懂得 137 | 138 | 由于你懂得的网络原因,你需要做点事儿才能正常安装软件包。 139 | 140 | * 第一种办法——将软件源设置成[淘宝](http://ruby.taobao.org) (没错,就是淘宝)。 141 | * 第二种办法 142 | 143 | 23.235.40.249 rubygems.global.ssl.fastly.net 144 | 145 | [% endcallout %] 146 | 147 | ## Perl 148 | 149 | Perl 借用了 C、sed、awk、shell 脚本以及很多其他编程语言的特性。最重要的是,Perl 集成了正则表达式的功能。Perl 更擅长`文本处理`。 150 | 151 | Perl 的中心思想是:“There's More Than One Way To Do It. (不只一种方法来做一件事。)” 所以同样一个程序可能有 N 种写法。 152 | 153 | 和 Python 类似,Perl 5 和 Perl 6 也有很大区别。 154 | 155 | 可以使用 `cpan` 命令安装软件包。 156 | 157 | ## PHP 158 | 159 | PHP 是流行的脚本语言,非常适合`网络开发`。它的语法和 C 语言、Java 及 Perl 类似,非常容易学习。 160 | 161 | OS X 自带 PHP。但是无论是 Linux 还是 OS X,都需要一些配置才能通过 Web Server 调用 PHP。 162 | 163 | PHP 和以上几种语言相比,还有一个区别——PHP 可以轻松地直接和网页混在一块儿运行,虽然成熟的程序员讨厌这样做。 164 | 165 | 可以使用 `pear` 命令安装软件包 (需手动安装)。 166 | 167 | ## Makefile 168 | 169 | make 是一个`自动化构建软件`。虽然 IDE 可以轻松完成同样的事儿,但是在 Linux 中 make 仍然是一个常用的工具。 170 | 171 | 在 Makefile 里面写好`规则`(依赖关系、编译器调用等),执行 make 命令后,make 会读取该文件并按照规则进行编译。 172 | 173 | 如果觉得写 Makefile 没有意义,那是因为你的程序规模不够大。 174 | 175 | ## AppleScript 176 | 177 | AppleScript 当然只支持 OS X。它可以用来`控制 OS X 的程序`。 178 | -------------------------------------------------------------------------------- /_posts/development/2007-12-29-ide.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[大全]IDE" 4 | date: 2007-12-29 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | [% callout %] 10 | 选择综合症 11 | 12 | 如果想马上选择一个感觉不错的,可以[看这里]({{site.baseurl}}/07/development-software/)。 13 | [% endcallout %] 14 | 15 | 本文介绍一些常用的 IDE(当然包括好用的 Visual Studio)。如果犯了选择综合症,请到维基百科去[治疗](https://en.wikipedia.org/wiki/Comparison_of_integrated_development_environments)。 16 | 17 | 选择 IDE 和选择文本编辑器不同——你总得知道自己用什么编程语言,然后才能找到正确的 IDE 吧? 18 | 19 | # C/C++ 20 | 21 | C/C++ 是非常常见的语言。不过,因为很多时候用的是开发框架,并不是纯 C/C++ 语言,因此要根据实际情况选择合适的环境。 22 | 23 | 下面是专门针对特定框架的 IDE: 24 | 25 | * Microsoft Visual Studio ([w]):功能非常强大的 IDE,专门针对 Windows 编程——Win32 和 MFC 等框架。 26 | 27 | VS 有两类版本,一类是商业版本,需要付费使用,功能强大;另一类是社区版本,可免费使用。 28 | * Visual C++ Express:Express 版是免费的精简版本,不支持跨语言集成,没有 MFC。 29 | * Visual C++ 6.0:这是一个很过时的软件。除了老师要求和怀旧以外,已经没有人愿意用了。 30 | * Qt Creator ([w] [l] [m]):功能强大的 IDE,专门针对 Qt C++。 31 | 32 | Qt C++ 支持多种系统,如 Windows、Linux(包括嵌入式系统)、OS X、iOS、Android 等。 33 | 34 | Qt 有两种授权,一种可用于开发不开源的商业软件,但需付费使用;另一种可免费使用,基于 LGPL 协议,用于开发自由软件。此外商业版本功能更多。 35 | * C++ Builder ([w]):C++ Builder 是一个可视化集成开发工具,具有快速的可视化开发环境。C++ Builder 本身只能在 Windows 中运行,但是可为 OS X、iOS、Android 系统编译程序。 36 | * Anjuta ([l]):Anjuta 是一个在 Linux 中常用的集成开发环境,和界面设计器 Glade 配合,可方便地开发基于 GTK+ 的程序。 37 | 38 | Anjuta 是自由软件。在 Linux 中可通过软件包管理器直接安装。 39 | * Code::Blocks ([w] [l] [m]):初学者常用 IDE。尽管很多人只用于写纯 C/C++ 代码,但实际上 Code::Blocks 有一套针对 wxWidgets 框架的工具,例如界面设计器。 40 | 41 | Code::Blocks 是基于 GPL 的自由软件。在 Linux 中可通过软件包管理器直接安装,在其他系统中可免费下载。由于 Windows 没有 C 语言编译器,Code::Blocks 提供了集成 MinGW 的版本。 42 | 43 | wxWidgets SDK 需要额外下载安装。 44 | * Xcode ([m]):苹果官方的开发工具,专门用于开发 OS X/iOS 应用。绝大多数人都拿它写 Objective-C(现在又多了一个 Swift)。虽然也可以用来写 C 语言,不过貌似没有人愿意为了写一个只有几 KB 的程序而下载一个高达几 GB 的软件(毕竟一般电脑才 128GB,划给 Windows 之后就没地方了)。 45 | 46 | 下面是一些比较纯的 C/C++ 开发环境。注意,与上面列表有重复: 47 | 48 | 开发环境 | 授权 | 操作系统 | 单文件支持 | 调试器 | 集成工具链 | 代码自动完成 | 代码分析 | 测试 | 备注 49 | -------------|--------|-------------|----------|-------|----------|------------|---------|-----|--------- 50 | Anjuta | GPL | [l] | [x] | [v] | [v] | [v] | [v] | [x] | 51 | Code::Blocks | GPL | [w] [l] [m] | [v] | [v] | [v] | [v] | [v] | [v] | 支持多种编译器 52 | Dev-C++ | GPL | [w] | [v] | [v] | [v] | [v] | [v] | [x] | 官方停止维护 53 | Eclipse CDT | EPL | [w] [l] [m] | [x] | [v] | [v] | [v] | [v] | [v] | Eclipse 插件 54 | KDevelop | GPL | [l] [m] | [x] | [v] | [v] | [v] | [v] | [v] | 55 | MonoDevelop | LGPL | [w] [l] [m] | [x] | [v] | [v] | [v] | [x] | [x] | 56 | 57 | # C# 58 | 59 | C# 是微软主导的语言,因此最好用的当然是微软的 Visual Studio。 60 | 61 | Mono 项目是 .Net 开源替代品,并且已受微软支持,因此在 Linux 或 Mac 环境中开发与使用 C#(ASP.NET)也是有可能的。 62 | 63 | * MonoDevelop 是一个跨平台的 C# 开发环境,可用于开发 ASP.NET、Gtk# 等应用。 64 | * 微软自己也开发了一个跨平台的 Visual Studio Code。这是一个文本编辑器,但对 C# 有着更多的支持。 65 | 66 | # Java 67 | 68 | Java 开发环境有很多,例如 Eclipse、MyEclipse(私有)、IntelliJ IDEA(开源/私有)等。 69 | 70 | 由于 Java 本身是跨平台的,并且很多 Java 开发环境都是用 Java 写成,因此它们基本上都跨平台。 71 | 72 | # Web 语言 (PHP/Python/Ruby/Node.js) 73 | 74 | 因为 PHP、Python、Ruby、Node.js 都和网站有关系,所以,一般情况下这四种语言的 IDE 同样适合网页前端语言。 75 | 76 | 这些是常见的开发环境: 77 | 78 | 软件 | 授权 | 操作系统 | 支持的后端语言 | 支持 CSS/JS 变体? | 备注 79 | ------------------|-------|--------------|----------------------|--------------------------|---------- 80 | Adobe Dreamweaver | 私有 | [w] [m] | ASP/ASP.NET/JSP/PHP | [x] | 后端语言只有编辑功能 81 | Adobe Brackets | MIT | [w] [l] [m] | [x] | LESS/Sass | 快速编辑功能 82 | PyCharm | 私有/Apache | [w] [l] [m] | Python | LESS/Sass/CoffeeScript | 83 | PyDev (Eclipse) | EPL | [w] [l] [m] | Python | [x] | Eclipse 插件 84 | Aptana Studio | GPL/私有 | [w] [l] [m] | PHP/Ruby/Python | [x] | 有独立版本和 Eclipse 插件版 85 | Eclipse PDT | EPL | [w] [l] [m] | PHP | [x] | 86 | PHPStorm | 私有 | [w] [l] [m] | PHP | LESS/Sass/CoffeeScript | 87 | Zend Studio | 私有 | [w] [l] [m] | PHP | [x] | 88 | Eclipse DLTK Ruby Plugin | EPL | [w] [l] [m] | Ruby | [x] | 89 | RubyMine | 私有 | [w] [l] [m] | Ruby | LESS/Sass/CoffeeScript | 90 | WebStorm | 私有 | [w] [l] [m] | Node.js | LESS/Sass/CoffeeScript | 91 | 92 | * [这里](https://en.wikipedia.org/wiki/HTML_editor)有一个更详细的网页设计器列表。 93 | * PyCharm、PHPStorm、RubyMine、WebStorm 基于 IntelliJ IDEA。 94 | * Aptana Studio、Zend Studio 基于 Eclipse。 95 | 96 | ## 其他 97 | 98 | * IDLE 是 Python 的官方 IDE。 99 | * Python Tools for Visual Studio 是 VS 的一个插件。 100 | 101 | # LaTeX 102 | 103 | LaTeX(含 XeLaTeX)的编辑器有很多种。下面是比较好用的、集成了编译调试功能的 LaTeX 编辑器: 104 | 105 | * WinEdt ([w]):WinEdt 是 CTEX 套装自带的编辑器,属于共享软件。由于 WinEdt 收费而且对 UTF-8 支持不好,因此不建议使用。 106 | * TexMaker ([w] [l] [m]) 和 TexStudio ([w] [l] [m]):这两个是功能比较全面的 LaTeX 编辑器。TexStudio 是 TexMaker 分支出来的项目。 107 | * TeXlipse ([w] [l] [m]):TeXlipse 是 Eclipse 的一个插件,功能比较全面。 108 | 109 | 以下编辑器在安装插件后可以有较好的 LaTeX 支持: 110 | 111 | * Vim (vim-latexsuite) 112 | * GEdit 113 | * Sublime Text (LaTeXing) 114 | * Eclipse (TeXlipse) 115 | 116 | 此外还有一个编辑器 LyX。LyX 不是源码编辑器,而是类似于 Word 的“可见即可得”的编辑器。 117 | 118 | # Pascal 119 | 120 | * 不带界面设计器的开发环境有 Free Pascal IDE ([w] [l] [m])。 121 | * 带界面设计器的开发环境有 Delphi ([w] [m]) 以及仿照 Delphi 的开源的 Lazarus ([w] [l] [m]) 等。 122 | 123 | # Basic 124 | 125 | 事实上没有人愿意用 Basic 语言编程。如果只管 Windows 系统的话,倒是有一些用 Visual Basic 编程的。 126 | 127 | * 只管 Windows 的话,Visual Studio 当然是最好用的 IDE。 128 | * Gambas ([l])、Xojo ([w] [l] [m]) 都采用了类似 Basic 的语言。不过没有人愿意用。 129 | 130 | # 其他 131 | 132 | 听说过“易语言” ([w]) 吗? 133 | 134 | 150 | -------------------------------------------------------------------------------- /_posts/development/2007-12-30-editor.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[大全]文本编辑器" 4 | date: 2007-12-30 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | [% callout %] 10 | 选择综合症 11 | 12 | 如果想马上选择一个感觉不错的,可以[看这里]({{site.baseurl}}/07/development-software/)。 13 | [% endcallout %] 14 | 15 | * 值得注意的是,像 Eclipse、Visual Studio 等软件包括了开发所需要的一系列工具链,应该算作 IDE(集成开发环境)。[这里]({{ site.baseurl }}/07/ide/)列举的是常见的 IDE。 16 | * 关于具有完整功能的网页编辑器,以及 LaTeX 编辑器,参见 IDE。 17 | 18 | # 简朴的编辑器 19 | 20 | ## Notepad 21 | 22 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 23 | ----|------|------|--------|-------------|------------ 24 | 私有 | 免费 | 图形 | [x] | [x] | [w] 25 | 26 | Windows 自带的“记事本”。 27 | 28 | 使用联通手机和联通宽带的不要用 Notepad,因为在 Notepad 里输入“联通”两个字,保存,再打开……“联通”二字消失了! 29 | 30 | 移动和电信用户不受此影响。 31 | 32 | ## Leafpad 33 | 34 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 35 | ----|------|------|--------|-------------|------------ 36 | 私有 | 免费 | 图形 | [x] | [x] | [l] 37 | 38 | Xfce 或 LXDE 桌面环境附带的“记事本”。界面明显抄袭 Windows 的 Notepad,但是它绝不会拒绝联通用户。 39 | 40 | ## TextEdit 41 | 42 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 43 | ----|------|------|--------|-------------|------------ 44 | 私有 | 免费 | 图形 | [x] | [x] | [m] 45 | 46 | OS X 自带的文本编辑器。写在这里是凑篇幅用的——用 TextEdit 打开 html 文件可能会出“bug”。 47 | 48 | ## nano 49 | 50 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 51 | ----|------|------|--------|-------------|------------ 52 | GPL | 免费 | 文本 | [x] | [x] | [w] [l] [m] 53 | 54 | 在纯文本模式,除了 vi,一般还会有 nano。nano 是一个操作方式“比较正常”的编辑器,不过实际的(编辑)功能比看起来多。 55 | 56 | ## ed 57 | 58 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 59 | ----|------|-------|--------|-------------|------------ 60 | ? | 免费 | 行文本 | [x] | [x] | [w] [l] [m] 61 | 62 | Ken 创造的编辑器,只不过,现在没有人愿意用——就算愿意用 ed,那也——sed! 63 | 64 | # 不那么简朴的编辑器 65 | 66 | ## vi 67 | 68 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 69 | -----------|------|------|--------|-------------|------------ 70 | BSD / CDDL | 免费 | 文本 | [x] | [x] | [w] [l] [m] 71 | 72 | vi 是“编辑器之神”,但是功能不如其改进版 Vim 丰富。 73 | 74 | 由于它是几乎所有 Linux 系统自带的编辑器,而且是 initramfs(内核启动后、正式挂载系统分区之前的临时内存盘)钦点的编辑器,因此掌握 vi 的用法对救急非常有意义。 75 | 76 | 有些发行版已经把 vi 换成精简版 Vim。 77 | 78 | ## Notepad2 79 | 80 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 81 | ----|------|------|--------|-----------|------------ 82 | BSD | 免费 | 图形 | [x] | [x] | [w] 83 | 84 | Windows 自带的 Notepad 太简朴了,于是有人让它的功能稍微丰富了一些。用 Notepad2 虽然不一定能舒服地编程,但至少能看出来是在编程了。 85 | 86 | ## gedit 87 | 88 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 89 | ----|------|------|--------|-------------|------------ 90 | GPL | 免费 | 图形 | [v] | 插件 | [l] 91 | 92 | Linux 自带的“记事本”,不知比 Windows 的记事本高到哪里去了,当然更让人愿意谈笑风生。 93 | 94 | gedit 支持插件。可以通过 shell 脚本来定制“外部工具”。 95 | 96 | ## Kate 97 | 98 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 99 | ----|------|------|--------|---------------|------------ 100 | GPL | 免费 | 图形 | [v] | 插件 | [l] 101 | 102 | KDE 桌面环境优秀的文本编辑器。支持插件,支持 Vim 编辑方式。 103 | 104 | # 强大的编辑器 105 | 106 | ## Notepad++ 107 | 108 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 109 | ----|------|------|--------|-----------|------------ 110 | GPL | 免费 | 图形 | [v] | [v] | [w] 111 | 112 | Notepad++ 是一个功能强大的文本编辑器。Notepad++ 的特色如下(有些需要插件支持): 113 | 114 | * 多种编码和操作系统支持 115 | * 多文档搜索 116 | * 支持正则表达式(包括多行) 117 | * 分屏编辑、数据比较等 118 | * 代码补全、函数列表 119 | * 项目管理器 120 | * 书签 121 | * FTP 浏览器 122 | * 一些编辑工具(如排序、折叠、编码转换) 123 | * **宏** 124 | 125 | ## BBEdit 126 | 127 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 128 | ----|------|------|--------|------------|------------ 129 | 私有 | $50 | 图形 | [v] | [v] | [m] 130 | 131 | BBEdit 一直是为 Mac 而开发的一个编辑器。BBEdit 特色如下: 132 | 133 | * 多文件搜索,支持 Perl 风格正则表达式 134 | * HTML 预览和验证 135 | * 文件比较 136 | * 版本控制系统支持 137 | * 支持 AppleScript 138 | * 作为其他开发工具的插件 139 | 140 | BBEdit 有一个免费版本 TextWrangler,当然功能逊色许多。 141 | 142 | ## UltraEdit 143 | 144 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 145 | ----|------|------|--------|------------|------------ 146 | 私有 | $80 | 图形 | [v] | [v] | [w] [l] [m] 147 | 148 | UltraEdit 是一款强大的文本编辑器,同时也是十六进制编辑器。UltraEdit 是共享软件。UltraEdit 的特色如下: 149 | 150 | * 大文件 (甚至大于 4GB) 支持 151 | * 多重选择、块模式编辑等 152 | * 多文件搜索/替换 153 | * 代码补全等 154 | * 主题 155 | * **十六进制编辑器** 156 | * 文件加密/解密 157 | * 项目管理 158 | * 书签 159 | * 宏 160 | 161 | ## Atom 162 | 163 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 164 | ----|------|------|--------|------------|------------ 165 | MIT | 免费 | 图形 | [v] | ? | [w] [l] [m] 166 | 167 | [Atom](https://atom.io) 是 GitHub 推出的开源文本编辑器。 168 | 169 | Atom 的特色如下: 170 | 171 | * Atom 采用 Electron 框架,本质上是个本地化的 Web App。 172 | * 高级文本编辑功能 173 | * 跨平台支持 174 | * 模块化 175 | * 支持插件、主题定制等 (可使用 CoffeeScript 开发插件) 176 | * 支持 GitHub 177 | * 免费 (Sublime Text 收费) 178 | * 命令列表 179 | * 大量操作技巧 180 | 181 | ## Sublime Text 182 | 183 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 184 | ----|------|------|--------|------------|------------ 185 | 私有 | $59 | 图形 | [v] | [v] | [w] [l] [m] 186 | 187 | [Sublime Text](https://www.sublimetext.com) 一个非常有名的和受欢迎的编辑器。此编辑器的授权费为 $59 (可以无限期试用)。最新版本是 Sublime Text 3。 188 | 189 | Sublime Text 的特色如下: 190 | 191 | * 跨平台支持 192 | * 高级文本编辑功能 193 | * 配置文件和插件支持 (Python) 194 | * 类似软件包管理器的插件管理器,可在线下载安装插件 195 | * 快速定位 196 | * 代码地图 197 | * 代码片段 198 | * 代码补全(自动扫描符号) 199 | * 大量操作技巧 200 | * 命令面板 201 | 202 | ## Visual Studio Code 203 | 204 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 205 | ----|------|------|--------------|------------|------------ 206 | 私有 | 免费 | 图形 | ? (目前不支持) | ? | [w] [l] [m] 207 | 208 | [Visual Studio Code](https://code.visualstudio.com) 是微软推出的支持三大操作系统的、免费的文本编辑器。这也是微软为数不多的支持 Linux 的软件之一。不过,此软件有抄袭 Atom 的嫌疑。 209 | 210 | Visual Studio Code 仍处于预览版,因此不清楚将来是否会支持插件。目前 (0.3.0) 的特色如下: 211 | 212 | * 跨平台支持 213 | * 原生支持 ASP.NET 和 node.js 的调试功能。 214 | * 对 C# 而言支持上下文补全等功能。 215 | * 集成 Git 支持。 216 | * 大量操作技巧 217 | 218 | # 最强大的编辑器 219 | 220 | ## Vim & Emacs 221 | 222 | 授权 | 价格 | 界面 | 插件支持 | 脚本 (宏) 支持 | 操作系统 223 | ----|------|------------|--------|------------|------------ 224 | GPL | 免费 | 文本 & 图形 | [v] | [v] | [w] [l] [m] 225 | 226 | “编辑器之神”和“神的编辑器”,还需要解释吗? 227 | 228 | [% callout style=danger %] 229 | 230 | #### 禁忌 231 | 232 | 千万不要问 Vim 和 Emacs 到底更强大,否则…… 233 | 234 | 235 | 236 | 237 | 238 | [% endcallout %] 239 | 240 | 241 | 257 | -------------------------------------------------------------------------------- /_posts/development/2007-12-31-development-software.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[就是这么简洁]常用编程软件" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 本文将用最简洁的语言向新手推荐好用的编程软件—— 9 | 10 | # 编辑器 11 | 12 | [% callout %] 13 | 说好的简洁呢 14 | 15 | “编程”本来就是个很宽泛的概念,所以,对于下面的内容,需要什么就去找什么,不需要的不要看。这样就很简洁了。:neutral_face: 16 | [% endcallout %] 17 | 18 | * 新手:学 C/C++ 语言用 `CodeBlocks`,考二级用 `Visual C++ 6.0`。考试通过之后就可以通通卸载了目前似乎只有二级考试和某气功还在用 VC6.0:smirk:。 19 | * 桌面程序: 20 | * 只管 Windows 的话,应用当然用 `Visual Studio`(可以选择 C# 或 Visual C++,不是 C++)。不过 `Qt` 也不错。 21 | * 只管苹果的话,当然 `Xcode`。找教程的话要找“Swift”(推荐)或“Objective-C”,因为 Xcode 是软件的名字,这两个才是编程语言。 22 | * `Qt`也是个基于 C++ 的框架,同样非常棒,并且同时支持三大系统。只不过,在 Linux 里 Qt 程序经常敲不了汉字。 23 | * 如果用 Java:`IntelliJ IDEA` 或 `Eclipse`。 24 | * 移动应用: 25 | * Android:当然`Android Studio`。官网被墙了,所以可以从[这里](http://www.androiddevtools.cn)下载。不过,更新 SDK 的时候是正常的。 26 | * iOS:当然`Xcode`。如果没钱买苹果那就装黑苹果吧。 27 | * Windows Phone:`Visual Studio`(没有人会买 WP 的) 28 | * 如果做游戏,事实上已经有现成的跨平台框架,例如 Cocos2d-x 和 Unity。Unity 自带开发工具,而 Cocos2d-x 框架游戏一般用 Visual Studio 开发。 29 | * 最近 M$ 也改变战略,支持用 C# 语言开发 Android/iOS 应用了,甚至可以在 Linux 或 Mac 中进行开发——这个编程软件叫做 `Xamarin Studio`。只不过要花点钱才能生成正式版本的应用。 30 | * 网站(前后端兼备): 31 | * PHP(++):`PHPStorm` 32 | * Python(+):`PyCharm`(做网站一般用框架,例如 Django) 33 | * Java(++):`IntelliJ IDEA` 或 `Eclipse`(for EE)。 34 | * Node.js(+):`WebStorm` 35 | * Ruby:`RubyMine`(做网站一般用 Ruby on Rails 框架) 36 | 37 | 以上几个软件除了 Eclipse 都是同一个公司做的,所以破解的方法都一样——直接搜注册码。 38 | 39 | * ASP.Net:`Visual Studio`(如果你坚持用 Linux 或苹果那么可以用 `Visual Studio Code`),记得用 C# 编程,因为用 VB 会被人笑话。 40 | * ASP:如果真的想用经典的 ASP,那么当然要用旧版的 Visual Studio。 41 | * 有钱买主机的可以无视此条:以上有“++”标记表示很容易找到一个部署的空间,“+”表示比较容易,其他的不好找。 42 | * C:能想到拿纯 C 语言做网站的,想必应该很熟悉嵌入式 Linux 那一套了——Makefile。如果真的不知道,可以学学 cgic 库的用法。 43 | * 网站(纯粹前端):虽然总有人推荐 Dreamweaver 但是它跟以下软件比起来简直是小巫见大巫。(推荐 FrontPage 的可以去:hankey:了) 44 | * 编辑器——可以随便挑一个然后装插件:`Sublime Text`、`WebStorm`、`Brackets`、`Atom` 45 | 46 | Brackets 是 Adobe 开发的,说明连 Adobe 自己都觉得 Dreamweaver 难用了…… 47 | 48 | * 调试工具:Firefox+Firebug 或 Chrome+Chrome Dev Tools 49 | * 通用编辑器:`Vim`(编辑器之神)、`Emacs`(神的编辑器)、`Notepad++`、`Sublime Text`、`Atom`…… 50 | * [这里]({{site.baseurl}}/07/editor/)有更详细的介绍。 51 | * Vim 和 Emacs 的历史非常悠久了。当年人们愿意花时间把它们配置成类似 IDE 的东西,但是现在人们更倾向于当作快速的文本编辑器来用。 52 | * 这些编辑器都支持插件,用起来当然顺手了。 53 | * ACM:ACM 比赛当然用 `CodeBlocks` 和 `Eclipse`,因为你根本没时间配置 Vim 和 Emacs。 54 | * LaTeX:如果用 LaTeX 写论文或什么东西,推荐 `TexStudio`。 55 | * 给领导工作的秘书:wink::`Excel` 够用了,如果不够,加个 VBA(宏)就够了。其实女秘书需要的根本不是编程软件。 56 | 57 | # 版本控制与团队协作 58 | 59 | 如果几人小组合作编程,还在互相用 QQ 传代码,那就太:dog:了!所以说当然要找个更高效的工具——目前最火最流行的当然是 GayHub[GitHub](https://github.com) 啦。 60 | 61 | (所以 GitHub 成为了一个不管有多么大“问题”都不敢被墙的网站:joy:) 62 | 63 | # 编程参考手册 64 | 65 | 如果你没有把各种对象属性方法背得滚瓜烂熟,那么随手预备一个参考手册是非常有意义的。 66 | 67 | * Mac/iOS:当然是 Dash。 68 | * App Store 上可免费下载,但是只有掏一大笔钱后才能随便使用,所以总有人找破解版。 69 | * Windows:Dash 的 Windows 版叫 [Velocity](http://velocity.silverlakesoftware.com)。当然也要掏钱才行。 70 | * Linux:Dash 不出 Linux 版,所以有人开发了 [Zeal](http://zealdocs.org)。自由软件,与 Dash 文档兼容,不过功能稍微少点。可能是因为高手用不着这些东西。 71 | * Android:[LovelyDocs](http://lovelydocs.io),也要掏钱。 72 | * 在线:[DevDocs](http://devdocs.io),免费。 73 | * 如果在用 M$ 的编程语言和开发工具(Visual Studio),当然找 [MSDN](https://msdn.microsoft.com/library) 了。 74 | -------------------------------------------------------------------------------- /_posts/development/2007-12-31-vim-and-emacs.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "编辑器之神 & 神的编辑器" 4 | date: 2007-12-31 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 作为计算机高手,有两个顶级编辑器,即使你不用,你也一定要知道它们是什么—— 10 | 11 | * 编辑器之神——Vim 12 | * 神的编辑器——Emacs 13 | 14 | 这两个是世界上最顶级的文本编辑器,而且几十年前就是。 15 | 16 | [% callout style=danger %] 17 | 18 | #### 禁忌 19 | 20 | 不要问 Vim 和 Emacs 到底哪个好用。有一个词语叫做[“编辑器之战”](https://zh.wikipedia.org/wiki/编辑器之战),指的是这两个编辑器的用户互相取笑对方所用编辑器的事情。 21 | 22 | [% endcallout %] 23 | 24 | # 优势 25 | 26 | 如果你经常写代码,建议你去稍微了解一下背景,挑`其中一个`来进行学习。 27 | 28 | 这两种编辑器的特点都是一开始很不好学,但是一旦学会,就很可能习惯了。 29 | 30 | 当你熟悉这两种编辑器之后,建议你去查一下如何写配置文件、如何装插件。通过自己的定制来使编辑器更加顺手。 31 | 32 | [% callout %] 33 | 与时俱进 34 | 35 | 时代在不断变化,对于现代的软件项目,Emacs 和 Vim 用户可能需要花大量的时间进行配置才能达到其他现代化编辑器(如 Sublime Text)的效果。所以,我们不妨换个思路——在现代化编辑器里装 Emacs/Vim 编辑风格的插件——例如在 Visual Studio 中安装 VsVim。 36 | [% endcallout %] 37 | 38 | # Vim 39 | 40 | ## 安装 41 | 42 | * Linux 自带精简版 Vim。需要手动装一下 Vim 才能有完整的体验。GUI 版则是另外的软件包,例如 `vim-gnome`。 43 | * OS X 自带完整的 Vim。如果想要 GUI 版,可以装个 `MacVim`。 44 | * Windows 需要手动[下载](http://www.vim.org)和安装。建议把 Vim 所在目录添加到 PATH 环境变量中。 45 | 46 | ## 学习 47 | 48 | 对于 Linux/Unix 系统,只需在“终端”中输入 49 | 50 | vimtutor 51 | 52 | 对于 Windows 系统,则是到“开始”菜单中去找“Vim tutor”图标。 53 | 54 | ## Windows 的编码问题 55 | 56 | Vim 在 Windows 中可能会遇到编码问题(不能正确读取 UTF-8 编码的文件)。所以可以编辑`$VIM/_vimrc`并加入 57 | 58 | let &termencoding=&encoding 59 | set fileencodings=utf-8,gbk,ucs-bom,cp936 60 | 61 | # Emacs 62 | 63 | ## 安装 64 | 65 | * Linux 下需要手动安装 Emacs。 66 | * OS X 有纯文本模式的 Emacs,不过版本有些旧。可以通过软件包管理器(例如 MacPorts)安装新版本的 Emacs。 67 | * Windows 需要手动[下载](http://ftp.gnu.org/gnu/emacs/)和安装。建议把 Emacs 所在目录添加到 PATH 环境变量中。 68 | 69 | ## 学习 70 | 71 | 打开 Emacs,按 C-h t (先按 Ctrl-H,松手,再按字母 t。OS X 是 Control-H) 进入教程。 72 | 73 | # Emacs 和 Vim 曾经是一种信仰 74 | 75 | Emacs 最早于 1975 年由 Richard Stallman 等人开发。vi 最早于 1976 年于 Bill Joy 开发,其改进版 Vim 最早于 1991 年由 Bram Moolenaar 开发。 76 | 77 | Emacs 和 Vim 仍然经久不衰,其重要原因在于强大的文本编辑功能。现在很多流行的编辑器都有 Emacs 和 Vim 编辑风格的插件。 78 | 79 | 它们是黑客创造出的东西,本身蕴含着黑客精神,因此它们更像是一种信仰、一种宗教。在 Linux/Unix 社区里嘲笑或鄙视这两种编辑器,后果可能非常严重。 80 | -------------------------------------------------------------------------------- /_posts/entertainment/2006-12-25-twitter-and-facebook-register.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "如何注册 Google、Twitter、Facebook 和维基百科账户?" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 很多人关心如何才能顺利访问这些网站,不过这不是本文要考虑的问题。本文假设你已经顺利地解决了那个问题。 9 | 10 | 本文考虑的是如何顺利注册一个账户。 11 | 12 | # Google 13 | 14 | 注册 Google 账户非常简单,只需要有一个能收短信手机,就能通过验证。 15 | 16 | Youtube 已经归 Google 所有所以没什么可说的。 17 | 18 | # Twitter 19 | 20 | Twitter 强制要求用户通过手机验证。可惜的是,Twitter 不支持中国联通、中国移动和中国电信的手机号,其他运营商差不多都可以。(废话,中国大陆除了这三个运营商难道还有第四个?) 21 | 22 | 貌似不管你用什么方式注册,都需要验证手机。而手机无法通过验证,就无法关注、无法发推。那怎么办? 23 | 24 | 答案——到 Help Center 里面[申诉](https://support.twitter.com/forms/general?subtopic=suspended)! 25 | 26 | 申诉不需要太多理由,只需要大致描述一下“我确实有手机,但是确实无法通过验证,所以无法blahblah……”。不需要四六级的写作水平,只需要把话说明白。正常情况下,几个小时之内就会有人处理。 27 | 28 | 如果申诉失败,不妨重新组织语言继续申诉。按理说申诉是可以通过的。 29 | 30 | # Facebook 31 | 32 | Facebook 注册之后要求用户上传身份验证信息,否则账户不可使用。 33 | 34 | 因此,注册的时候要使用自己的真实姓名。 35 | 36 | 验证也不难,只要把自己身份证拍清楚点,按照说明把照片发过去,几天之内就有人受理了。 37 | 38 | 需要注意的是,在刚通过验证不久,尽量先加一些真实的好友,不要一次性关注太多公共账户,否则会被封号。 39 | 40 | # 维基百科 41 | 42 | 维基百科不要求身份验证。但是,维基百科封禁了大部分代理服务器。也就是说,处在代理环境中是无法编辑词条的。 43 | 44 | 因此,在不得不进行代理的情况下,可以注册一个账户,然后申请 [IP 封禁例外](https://zh.wikipedia.org/wiki/Wikipedia:IP封禁例外)。 45 | -------------------------------------------------------------------------------- /_posts/entertainment/2006-12-27-wine.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "在 Wine 中打游戏" 4 | date: 2006-12-27 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | [% callout style=warning %] 10 | 11 | #### 腾讯的游戏 12 | 13 | 因为腾讯的网游喜欢用反作弊系统,而这个反作弊系统需要往系统中安装驱动,因此,如果找不到免保护版本的腾讯游戏,就不用考虑在 Wine 中玩了。 14 | 15 | [% endcallout %] 16 | 17 | 事实上,很多不太新的(单机为主)游戏都可以比较稳定的在 Wine 中被玩。一般情况下,只需要安装最新版 Wine,并且安装以下两个组件即可游戏: 18 | 19 | 1. DirectX 7/8/9 20 | 2. Visual C++ 运行时 21 | 22 | 很多游戏下载网站会提供这两个组件的安装包。当然,从 winetricks 中安装也可以。 23 | 24 | 如果出现黑屏等现象,可以参考[这里](http://telarapedia.gamepedia.com/Wine#Troubleshooting)。 25 | 26 | 此外,有一个软件叫 PlayOnLinux,它提供了很多游戏的解决方案,不过可能需要正版游戏(包括 Steam 上的正版——因为不是所有游戏都打算支持 Linux)才能继续。 27 | -------------------------------------------------------------------------------- /_posts/entertainment/2006-12-28-fun-command.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "有点意思的命令" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 对于以下命令,如果敲完之后提示“命令未找到”,那么需要安装一下。 9 | 10 | # 恶搞 11 | 12 | ## sl 13 | 14 | ls 是一个非常常用的命令。因为经常敲,所以很有可能就敲错了。不小心打反了,会发生什么事儿呢…… 15 | 16 | ![sl]({{ site.baseurl }}/images/entertainment/fun/sl.png) 17 | 18 | 一辆火车开过 19 | 20 | `sl -l` 是个小车,`sl -F` 火车会飞起来。 21 | 22 | 可以趁人不注意,在他的电脑上装个 sl,然后输入:`alias ls=sl` 23 | 24 | ## tac 25 | 26 | cat 是显示文件内容的命令。那么,既然 tac 是把 cat 倒着写的,那么这个命令当然就会把文件内容倒着输出了。 27 | 28 | (这不是恶搞——把日志倒着输出就非常有用) 29 | 30 | ## dd 31 | 32 | 虽然说 dd 有时候很危险,但是其实有时候也可以无公害地恶搞一下。 33 | 34 | 进入纯文本终端(Ctrl-Alt-F1),登录之后输入: 35 | 36 | sudo dd if=/dev/urandom of=/dev/fb0 37 | 38 | 因为 /dev/urandom 是随机数发生器,所以每次执行的结果都不一样。 39 | 40 | ## fork 炸弹 41 | 42 | 去找个苹果电脑的体验店,打开终端(按 Control-Space 然后输入 Terminal),输入以下命令。记住,按下回车之后赶紧走人: 43 | 44 | :() { :|: & };: 45 | 46 | 你应该知道不赶快走人的后果(专卖店的人发现你把电脑搞死机了……)。 47 | 48 | ## yes 49 | 50 | 输入 yes 之后会显示满屏幕的 y。可以通过管道到 yes 来对付很多 y/n 的程序。 51 | 52 | 如果自己想仿写一个,那也很简单: 53 | 54 | {% highlight c %} 55 | #include 56 | 57 | int main(int argc, char *argv[]) 58 | { 59 | char *s = (argc>1) ? argv[1] : "y"; 60 | while (1) printf("%s\n", s); 61 | return 0; 62 | } 63 | {% endhighlight %} 64 | 65 | ## xeyes 66 | 67 | ![xeyes]({{ site.baseurl }}/images/entertainment/fun/xeyes.png) 68 | 69 | 一只眼睛盯着鼠标。不知 X11 为什么会内置这么一个无聊的东西? 70 | 71 | 还有一个更无聊的——xlogo。除了一个丑陋的 X,什么功能都没有了。 72 | 73 | ## xkill 74 | 75 | 想当一把死神吗? 76 | 77 | 输入 xkill,鼠标会变成“x”形,然后你点哪个窗口,哪个进程就直接被叉了。 78 | 79 | 和任务管理器比,xkill 真是又快又准。 80 | 81 | (备注:因为是 X 的程序,所以在 OS X 中只对 X11 环境的应用有效。) 82 | 83 | ## thefuck 84 | 85 | 人类是机器的主人。不小心输了错误的命令,但是机器不客气地回复错误信息,我们当然生气了。 86 | 87 | 现在,我们骂它一句,它就得乖乖地承认自己的错误,把敲错的命令改成正确的…… 88 | 89 | [这里是项目主页](https://github.com/nvbn/thefuck)。按照说明安装之后,以后再敲错命令——直接骂一句“fuck”! 90 | 91 | 温馨提示:不要对人说脏话,这是很不礼貌的行为。 92 | 93 | # 彩蛋 94 | 95 | ## moo 96 | 97 | 这是 apt-get 的彩蛋。 98 | 99 | 直接输入:`apt-get moo` 100 | 101 | 还有一个:`apt-build moo` 102 | 103 | “本 APT 有超级牛力!” 104 | 105 | ## 没有彩蛋 106 | 107 | 需要安装 aptitude。当然,使用 deb 系列系统的才有机会看到。 108 | 109 | aptitude moo 110 | 111 | aptitude 会提示没有彩蛋。不要上当,继续输入: 112 | 113 | aptitude -v moo 114 | aptitude -vv moo 115 | aptitude -vvv moo 116 | aptitude -vvvv moo 117 | aptitude -vvvvv moo 118 | aptitude -vvvvvv moo 119 | aptitude -vvvvvvv moo 120 | 121 | 经过我们软磨硬泡,aptitude 投降了。 122 | 123 | ## cal 124 | 125 | `cal 9 1752`:谁说今天是 9 月 2 日,明天就一定是 9 月 3 日? 126 | 127 | # ASCII 艺术 128 | 129 | ## 大字报 130 | 131 | ### figlet 132 | 133 | ![figlet]({{ site.baseurl }}/images/entertainment/fun/figlet.png) 134 | 135 | ### toilet 136 | 137 | toilet 可不是厕所,而是…… 138 | 139 | ![toilet]({{ site.baseurl }}/images/entertainment/fun/toilet.png) 140 | 141 | ### banner 142 | 143 | ![banner]({{ site.baseurl }}/images/entertainment/fun/banner.png) 144 | 145 | 这些才叫大字报。 146 | 147 | ## cowsay 148 | 149 | ![cowsay]({{ site.baseurl }}/images/entertainment/fun/cowsay.png) 150 | 151 | * `cowsay "Hello world"`: 一头奶牛在说话 152 | * 试试把 cowsay 换成 cowthink:一头奶牛在思考 153 | * `cowsay -l`查看有哪些动物——`cowsay -f tux "Hello world"`:奶牛变成了 Tux。 154 | * 安装 fortune,并且执行 `fortune | cowsay`:一头有哲理的奶牛。 155 | * 安装 fortune-zh,执行 `fortune | cowsay`:会背古诗的奶牛。 156 | 157 | ## bb 158 | 159 | 光用 ASCII 显示图片就太 low 了。bb 演示的是动画(而且是三维的!),并且附带音乐。 160 | 161 | ## 黑客帝国 162 | 163 | cmatrix: 164 | 165 | ![cmatrix]({{ site.baseurl }}/images/entertainment/fun/cmatrix.png) 166 | 167 | ## telnet 168 | 169 | 如果有网络: 170 | 171 | telnet towel.blinkenlights.nl 172 | 173 | 一部 ASCII 电影。 174 | 175 | ![blinkenlights]({{ site.baseurl }}/images/entertainment/fun/blinkenlights.png) 176 | 177 | 如果你有 IPv6 连接,那么网站会为你提供更多场景,而且会变成彩色的。 178 | 179 | ## asciiquarium 180 | 181 | ASCII 水族馆 182 | 183 | ## lolcat 184 | 185 | 用渐变色显示文本。 186 | 187 | ![lolcat]({{ site.baseurl }}/images/entertainment/fun/lolcat.png) 188 | 189 | lolcat 是 Gem 包,因此用 gem 命令安装。如果遭遇墙的错误(超时/连接重置),可以换一下[软件源](https://ruby.taobao.org)。 190 | 191 | # 其他 192 | 193 | ## factor 194 | 195 | `factor 60`:分解质因数 196 | 197 | ## oneko 198 | 199 | 一只小猫跟着鼠标跑。按 Ctrl-C 停止。 200 | 201 | ## Python 202 | 203 | 不用学编程,只需要: 204 | 205 | python -m SimpleHTTPServer 206 | 207 | 如果想通过局域网分享个大文件,这是个又快又省事儿的方法……当然别忘了先 cd 到文件所在的目录里去。 208 | -------------------------------------------------------------------------------- /_posts/entertainment/2006-12-30-musicvideo.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "音视频软件" 4 | date: 2006-12-30 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | # 音乐播放软件 10 | 11 | 比较流行的有 Rhythmbox、Amarok、Audacious、Banshee 等。不过它们都缺少在线选歌、歌词显示等功能。 12 | 13 | 如果愿意折腾,可以尝试移植深度音乐。 14 | 15 | # 视频播放软件 16 | 17 | 当然是 MPlayer 和 VLC。而且这两个软件是跨平台的。 18 | 19 | MPlayer 没有图形界面。它有很多好用的图形界面前端,如 SMPlayer。 20 | 21 | # 音频编辑软件 22 | 23 | 建议回到 Windows/Mac,用 Adobe Audition。如果非要在 Linux 中编辑音频,可以考虑 Audacity 或 Ardour。 24 | 25 | # 视频编辑软件 26 | 27 | 建议回到 Windows 或 Mac。Linux 里实在缺少功能强大的视频编辑软件。 28 | -------------------------------------------------------------------------------- /_posts/entertainment/2006-12-31-game.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "游戏" 4 | date: 2006-12-31 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 因为 Linux 的用户和 Windows 比(或者跟 Mac 比),太少了,所以没有人愿意给 Linux 系统开发游戏。毕竟一个游戏的成本高到罄竹难书。 10 | 11 | # Steam 12 | 13 | V 社(Valve)还是比较给力的,Steam 平台上面的 Linux 游戏越来越多。如果你买了正版游戏,而且游戏支持 Linux,那太棒了! 14 | 15 | [% callout %] 16 | 17 | #### 写给买不起正版的玩家 18 | 19 | Steam 平台中很多游戏(特别是 V 社自己的游戏)经常打折扣,折扣最低可以打到只有一折。所以,只要你肯等,一般游戏都能以一个能够接受的价格买下来。此外 Steam 支持支付宝,所以付钱不是一件太麻烦的事儿。 20 | 21 | [% endcallout %] 22 | 23 | # Wine 24 | 25 | 很多不太新的游戏是可以通过 wine 运行的。[这里]({{ site.baseurl }}/06/wine/)有详细说明。 26 | 27 | # Flash 小游戏 28 | 29 | 因为 Linux 至少还有 Flash 插件,所以目前还是可以玩的。 30 | 31 | # DosBox 32 | 33 | DosBox 是 DOS 模拟器,安装之后就可以去玩 DOS 游戏了。 34 | 35 | 维基百科中列举了更多[类似的模拟器](https://zh.wikipedia.org/wiki/Linux游戏)。 36 | 37 | # Linux 原生游戏 38 | 39 | Linux 原生游戏中很多是小游戏,也有一些大的,还有一些是移植的。 40 | 41 | 不同人口味不同,因此,选游戏最好的方法是去软件中心逛一逛,或者到搜索引擎上面搜搜,亲自玩一玩,然后就知道哪个游戏好玩了。 42 | 43 | * 在 Google 中搜索“Linux 游戏”可以看到一系列支持 Linux 的有名的游戏,例如 Counter-Strike、Portal、Left 4 Dead(求生之路)、Dota 2、Minecraft(我的世界)…… 44 | * 维基百科上面列出了一些[有名的开源游戏](https://zh.wikipedia.org/wiki/开源游戏列表)。 45 | -------------------------------------------------------------------------------- /_posts/future/2010-12-31-test.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "测试" 4 | date: 2010-12-31 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | -------------------------------------------------------------------------------- /_posts/mac/2011-12-29-tools.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "OS X 自带的一些工具" 4 | date: 2011-12-29 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 相信 Linuxer 们知道本文在讲什么事儿。 10 | 11 | 以下版本号来自 OS X 10.10.3。 12 | 13 | * BSD 命令行工具 14 | * Shell: bash (3.2.57)、csh (6.17.00)、ksh (93u+)、zsh (5.0.5) 15 | * Apache2 (2.4.10) 16 | * PHP (5.5.20) 17 | * Ruby (2.0.0p481) 18 | * Perl (5.16.3) 19 | * Python (2.7.6) 20 | * nano (2.0.6) 21 | * Vim (7.3) 22 | * Emacs (22.1.1, 纯文本模式) 23 | * Git (2.3.2) 24 | * SVN (1.8.13) 25 | * …… 26 | 27 | 部分软件比较老了,所以可能需要安装新版才能玩得更 Hi。这时候软件包管理器 (MacPorts / Homebrew) 就派上用场了。 28 | 29 | gcc 和 clang 不是系统自带的。在第一次输入 gcc 或 clang 时,系统会提示你是否下载安装。 -------------------------------------------------------------------------------- /_posts/mac/2011-12-30-port.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "OS X 的软件包管理器" 4 | date: 2011-12-30 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | OS X 的内核叫做 Darwin,也是一个 BSD 系统。 10 | 11 | 用过 Linux/BSD 的应该知道,那些系统一般都带个软件包管理器,例如 Ubuntu 的 apt 与 dpkg、Red Hat 的 yum 与 rpm、FreeBSD 的 Ports…… 12 | 13 | 苹果系统没带这个东西。但是如果还想像 Ports 一样装些软件,怎么办? 14 | 15 | 推荐两个软件包管理器:一个是 MacPorts,另一个是 Homebrew。 16 | 17 | 装完之后,也可以像 Linux 系统那样装一些自由软件了…… 18 | -------------------------------------------------------------------------------- /_posts/mac/2011-12-31-mac.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "MacBook 仅仅是奢侈品吗" 4 | date: 2011-12-31 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 有些人买了苹果笔记本,第一件事儿就是装了一个 Windows 系统。一看这种人就把苹果当作奢侈品了。 10 | 11 | 以 MacBook、MacBook Air 和 MacBook Pro 的配置来看,它们绝对不值那个价格——同等价格当然可以买到配置更高的笔记本电脑。 12 | 13 | 即使把苹果电脑顶级的做工算上,恐怕也不值那个价格。(苹果是硬件公司,所以苹果的软件系统一般都作为硬件的附属品。从 OS X 10.9 开始,苹果宣布 OS X 系统免费。) 14 | 15 | 那为什么还有那么多人,特别是开发者,特别是外国的开发者都选择苹果电脑呢? 16 | 17 | 这个原因有很多,不能一概而论。但是,其中一个原因肯定是苹果电脑附带的 OS X 操作系统。 18 | 19 | Mac OS X 和之前的 Mac OS 有着根本的区别,因为 Mac OS X 是个 Unix 系统。从 Unix 家谱图上可以看到,Linux 系统在边上(因为 Linux 是仿照 Unix 重新设计,不是 Unix 的分支),而 Mac OS X 是其中一个分支。 20 | 21 | 本文不再继续说什么了,希望有苹果本子的同学少用 Windows,多用原生系统。实践证明,那些折腾 Linux 的同学,一旦把黑苹果配置好,他们基本上就不换系统了。 -------------------------------------------------------------------------------- /_posts/network/2008-12-20-g-f-w.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[科普]你懂得的网络故障" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 既然有人作死地科普了有关知识, 9 | 10 | :cop:叔叔,就是[这篇文章](https://vjudge1.github.io/2015/09/26/g-f-w/),快去:police_car:他! 11 | -------------------------------------------------------------------------------- /_posts/network/2008-12-21-capture.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[未完成]抓包与模拟" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | # 抓包 9 | 10 | ## Wireshark 11 | 12 | ## Charles 13 | 14 | # 模拟 15 | 16 | 这里只提模拟 HTTP 协议。 17 | 18 | ## curl 19 | 20 | ## PHP 21 | 22 | ## Python 23 | -------------------------------------------------------------------------------- /_posts/network/2008-12-22-net-commands.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "网络诊断命令" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 以下是一些系统自带的、常用的网络相关的命令。有趣的是,其中有很多命令是在 Windows、Linux 和 Mac 中通用的——用法基本相同。 9 | 10 | # ifconfig/ipconfig 11 | 12 | ipconfig 是 Windows 的命令,ifconfig 是 Linux/Mac 的命令。 13 | 14 | 这两个命令可以查看本机网络配置(网卡数量、MAC 地址、IP 地址等)。 15 | 16 | 如果有 root 权限,ifconfig 命令可以控制网卡的开闭、更改本机 IP 和 MAC 地址等。但 Windows 的 ipconfig 只能查看不能修改。 17 | 18 | 在 Linux/Mac 系统中,网关需要用 route 命令查看。DNS 配置在 /etc/resolv.conf 文件中。而 Windows 的 ipconfig 会把这些信息都显示出来。 19 | 20 | # ping 21 | 22 | ping 是一个非常常用的命令。判断一个主机(网站等)能否连通,只需拿 ping 命令试一下,例如: 23 | 24 | ping www.baidu.com 25 | 26 | ping 会不断尝试(Windows 系统只尝试四次,除非有相关参数),如果能够连通,会显示来自对方的回应(响应时间、TTL),否则显示错误信息。 27 | 28 | 如果连通而且响应时间不高,说明网络连接状况*应该*很好。如果出现错误,说明自己或对方的网络可能出现问题(网络故障、网络不稳定、运营商故意丢包、被墙等)。 29 | 30 | 此外 TTL 值可用于简单地分辨操作系统,如 Windows 的 TTL 大约在 100~130 之间,Unix/Linux 大约在 240~255 之间。 31 | 32 | 在 Linux/Mac 系统中,IPv6 的 ping 叫做 ping6,而 Windows 系统中则是 ping -6。 33 | 34 | [% callout %] 35 | ping 不是万能的 36 | 37 | 主机或防火墙可以过滤 ping 流量,因此“ping 不通”不代表连接不上。同样,连接得上也不见得 ping 得通。 38 | 39 | 由于长城可以封锁指定端口,如 22、443,因此能 Ping 通国外 IP 也不代表一定能连接上。 40 | [% endcallout %] 41 | 42 | [% callout %] 43 | ping 不是武器 44 | 45 | ICMP Flood 是一种攻击方式,但是操作系统自带的 ping 工具(以及相关 API)对发包能力做了限制——攻击效果就像挠痒痒一样。因此需要发动攻击的时候要使用其他工具。 46 | [% endcallout %] 47 | 48 | # traceroute 49 | 50 | 备注:IPv6 的版本叫做 traceroute6,而在 Windows 系统中,IPv4 和 IPv6 都是 tracert。 51 | 52 | traceroute 会追踪路上经过的所有路由器列表。通过尝试不同跳数,可以用来确定网络问题是发生在网关还是主机等。 53 | 54 | 注意,“\* \* \*”不一定表示连不通,有可能是数据包被防火墙过滤了。 55 | 56 | # nslookup 57 | 58 | nslookup 用于查询 DNS 记录。可用于查看域名解析是否正常是否被污染。 59 | 60 | 常见的用法有: 61 | 62 | 查询域名的 A 记录: 63 | 64 | nslookup www.baidu.com 65 | nslookup www.baidu.com 114.114.114.114 66 | 67 | 查询其他记录: 68 | 69 | nslookup -qt=CNAME dl.google.com 70 | 71 | 查询缓存: 72 | 73 | nslookup -d www.baidu.com 74 | 75 | # netstat 76 | 77 | netstat 可以列出系统上所有的套接字连接情况,包括哪些处于监听状态。常用于查看端口监听和占用情况,例如查看 Apache 是否启动并进行监听。 78 | 79 | 例如: 80 | 81 | * `netstat -a`:列出所有连接 82 | * `netstat -an`:禁止反向域名解析,提高查询速度。 83 | * `netstat -t`:只查看 TCP 连接(-u 是 UDP 连接) 84 | * `netstat -nl`:只列举监听中的连接 85 | * 查看哪个进程占用了端口:Linux 为 `netstat -nlp`,Windows 为 `netstat -b`。 86 | 87 | # hostname 88 | 89 | 该命令可以查看和修改主机名。 90 | 91 | 不过在 Windows 系统中这个命令只能查看不能修改。 92 | 93 | # arp 94 | 95 | arp 命令用于查看和修改本机 ARP 缓存。 96 | 97 | # route 98 | 99 | route 命令用于查看和修改路由表。此命令在 Windows、Linux、Mac 用法各不相同。 100 | 101 | 以 Ubuntu 为例,如果未设置网关,可通过以下命令设置: 102 | 103 | route add default gw 192.168.1.1 104 | 105 | # ftp、tftp、telnet 106 | 107 | 一些客户端而已。 108 | 109 | # 实例:判断网络故障 110 | 111 | 1. 检查网络连接是否正确。 112 | 2. `ifconfig`、`route`、`cat /etc/resolv.conf`(Linux/Mac)或`ipconfig`(Windows),观察 IP、网关、DNS 等配置是否正确。 113 | 3. `ping 114.114.114.114`,观察能否联网。 114 | 4. `traceroute 114.114.114.114`,如果无法联网,观察在哪个路由器处发生错误。 115 | 5. `nslookup www.baidu.com`,观察目标域名是否被正确解析。 116 | 6. `ping www.baidu.com`,观察目标是否能 ping 通。注意,ping 不通不代表连不通。 117 | 7. `curl -Iv https://www.baidu.com`(Windows 需要自己安装 curl),观察网站的访问过程,判断是否出现故障。 118 | 119 | # 实例:判断是否被墙 120 | 121 | 总有人说“xxx被墙了”(或者“xxx能访问了”),但其他人却能正常使用(不能访问),所以在下结论之前,应该收集一些证据。 122 | 123 | 1. 首先把所有翻墙工具关掉,屏蔽 hosts,以免得出错误结论。 124 | 2. 刷新 DNS 缓存。Windows 用`ipconfig /flushdns`(需要管理员权限),Linux 用`sudo /etc/init.d/nscd restart`,Mac 则是`sudo dscacheutil -flushcache`。 125 | 3. 充分条件:`curl -vI https://www.google.com`(Windows 需要自己安装 curl) 126 | 127 | 以下只是必要条件: 128 | 129 | 1. `ping www.google.com`:最直接判断方法是 ping。 130 | 2. 如果处于教育网等环境,应同时测试`ping6 www.google.com`(Linux/Mac)或`ping -6 www.google.com`(Windows),查看 IPv6 下的连接情况。 131 | 3. `nslookup www.google.com`,观察 IP 解析结果是否正确。对于互联网大佬来说,往往一个域名可以解析出多个 IP,并且有 IPv6 地址。如果只是个简单的“159.106.121.75”(一个常用的污染 IP),说明可能被 DNS 污染了。 132 | 4. 到在线查询网站上查询所得的 IP 是否为目标网站的 IP。 133 | 5. 如果 IP 正确,不妨多 ping 几次,并使用 traceroute 跟踪,查看是否有掉包的情况。 134 | 135 | 由于很多大佬都采用了多播技术,这就意味着,只要有一个 IP 好使,服务就能使用。可以在支持英文搜索的搜索引擎上寻找“online nslookup”,找到可用 IP。 136 | -------------------------------------------------------------------------------- /_posts/network/2008-12-23-maintenance.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "【未完成】网站维护的一点经验" 4 | --- 5 | * content 6 | {:toc} 7 | -------------------------------------------------------------------------------- /_posts/network/2008-12-24-wifi.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "如何蹭网" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 看到 Wifi,有密码,而且没有人告诉你密码,怎么办? 9 | 10 | 最文明的办法是礼貌地询问“密码是多少”。如果对方拒绝回答,我们就只能当一把恶人了——破解! 11 | 12 | 为了进行破解,你需要一个带无线网卡、装有 Linux 系统的电脑。破解工作必须在 Linux 中进行(不管是虚拟机还是实体机,反正无线网卡必须直接归 Linux 管),不能用 Windows 或 Mac。为了节省时间,可以直接下载 [Kali Linux](https://www.kali.org) 并刻录成系统启动盘,这样不用安装即可直接使用。 13 | 14 | [% callout %] 15 | 信号增强 16 | 17 | 如果嫌信号太弱,我们可以去电脑城购买一个叫做“卡皇”的东西——加装大天线,效果更好。只不过卡皇违法 18 | [% endcallout %] 19 | 20 | # Wifi 万能钥匙 21 | 22 | 过去的 Wifi 万能钥匙是很“够意思”的,但现在的版本不够意思了——不告诉你密码是多少(只能连接上),而且换 Wifi 的时候会把已经保存的热点删除。 23 | 24 | 那么,我们怎么看密码呢? 25 | 26 | 对于 Android 手机(需要 ROOT),其实密码就在 /data/misc/wifi/wpa_supplicant.conf 中。找个文件管理器把这个文件打开,就能看见密码了。 27 | 28 | # WEP 加密的 Wifi 29 | 30 | 如果能看到这样的 Wifi,那真是太美好了——最多半个小时,密码就能被破解了。 31 | 32 | 破解工具有 aircrack-ng、spoonwep2。由于 spoonwep2 是一个傻瓜式工具,而且 WEP 加密的热点已经不常见,所以大家可以自己到搜索引擎上搜索它们的用法。 33 | 34 | # WPA/WPA2 加密的 Wifi (支持 WPS) 35 | 36 | 如果热点支持 WPS(Wi-Fi Protected Setup,不是那个国产办公软件),那么恭喜你,那个热点的密码其实根本就是一个纯八位数字! 37 | 38 | 这个破解工具的名字是 reaver,具体操作步骤可见[这里](https://linux.cn/article-2335-1.html)。 39 | 40 | 此攻击对信号强度要求非常高。如果信号强度够好,运气不好的话十个小时也能破解了。如果隔着一两堵墙,那么谁也不能保证一定能破解出来。 41 | 42 | # WPA/WPA2 加密的 Wifi 43 | 44 | 如果热点未启用 WPS,那么很不幸,这种热点只能靠跑字典爆破。这样的话,破解难度和时间都是不可预料的——取决于字典质量——对目标的“量身定制”的精准程度。如果人品不好,结果就是两个字——失败! 45 | 46 | 破解工具也是 aircrack-ng,具体操作步骤可见[这里](http://blog.csdn.net/kibaamor/article/details/42979863)。只不过,需要花多长时间、能不能成功都要看字典的质量——如果不采用社会工程学方法那就只能看人品了。 47 | -------------------------------------------------------------------------------- /_posts/network/2008-12-25-cms.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "想开网站?不要造车轮了!" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 很多种类网站都已经有现成的解决方案了。如果不是为了练习编程,就不要自己造车轮了。 9 | 10 | [% callout style=warning %] 11 | 应用引擎 12 | 13 | 因为像 SAE、BAE 那样的应用引擎不支持文件系统的写入,所以,对于可以在线安装的网站(如 WordPress),需要采用一些技巧才能装上。可以到搜索引擎上获取更详细的信息。 14 | [% endcallout %] 15 | 16 | [% callout style=warning %] 17 | 结论 18 | 19 | 本文就一个主题:如果不是为了练习编程,需要啥直接到百度上面搜一搜就行了。 20 | [% endcallout %] 21 | 22 | # 博客 23 | 24 | 最有名的非 WordPress 莫属。只要有服务器,把 WordPress 解压到网站某个目录,就可以在线安装了。 25 | 26 | 还有一个轻型的博客叫做 Typecho。虽然体积小,功能同样强大。 27 | 28 | 这两个博客均采用 PHP 开发,支持插件。 29 | 30 | ## 静态博客 31 | 32 | GitHub Pages 是一个免费的网络空间,不过只支持静态网页。既然 GitHub Pages 提倡在里面放博客,那么怎么实现呢? 33 | 34 | 有两个选择: 35 | 36 | * 一是 GitHub Pages 官方支持的 Jekyll。使用 Ruby 开发,可以直接把基于 Jekyll 系统的博客源代码放进去。 37 | * 另一个是 Hexo。使用 Node.js 开发,所以只能把生成好的博客放到 Pages 里。 38 | 39 | # 百科系统 40 | 41 | 最有名的是维基百科所采用的 MediaWiki。采用 PHP 开发。 42 | 43 | 服务器经过一系列配置之后可以显示数学公式(需要安装 LaTeX 等软件)。 44 | 45 | # CMS(内容管理系统) 46 | 47 | 搜一下“CMS系统”,简直罄竹难书: 48 | 49 | 先是国内的—— 50 | 51 | * PHPCMS 52 | * DedeCMS(后台比较乱) 53 | * PHP168(适合快速建立门户网站) 54 | * SupeSite 55 | * 帝国CMS 56 | * AKCMS(轻量级) 57 | * VeryCMS 58 | 59 | 还有国外的—— 60 | 61 | * Joomla!(用户广泛但是对中文支持不太好) 62 | * Drupal(不太好入门) 63 | * Plone(自备服务器、对 CSS 支持良好) 64 | * WordPress 65 | 66 | # SNS(社会化网络系统) 67 | 68 | * UCenter Home 69 | * SpaceBuilder(ASP.NET) 70 | * ThinkSNS 71 | * NetSNS(ASP.NET) 72 | * BoonEx 73 | * openpne 74 | * Community Server 75 | * …… 76 | 77 | # Online Judge(程序设计竞赛系统) 78 | 79 | * HustOJ:是使用最广泛的 Online Judge 系统。使用 PHP 开发。 80 | * Moodle 插件:Moodle 虽然不是程序测评系统,但是加入在线测评插件之后即可实现 Online Judge 功能。使用 PHP 开发。 81 | * Virtual Judge:是一个专门抓取其他 OJ 网站试题并到对应网站测评抓取测评结果的网站。使用 Java 开发。可从 GitHub 上获取[源代码](https://github.com/trcnkq/virtual-judge)。 82 | * ACdream:ACdream 自行开发了一套 OJ,使用 Node.js,可以从 GitHub 上面获取[源代码](https://github.com/KIDx/ACdream)。 83 | 84 | 需要注意的是,这些 Online Judge 系统只支持 Linux 服务器。 85 | 86 | # 微信公众号后台 87 | 88 | 因为微信公众号很火,所以后台也很火,并且有很多掏钱就派专业人士维护的服务。 89 | 90 | 如果自行开发,推荐微擎,因为支持插件、高级关键词匹配(正则表达式)等功能。 91 | 92 | [% callout style=warning %] 93 | 小心!! 94 | 95 | 在正式投入使用和二次开发之前,先考察一下系统有没有(明显和不明显的)安全漏洞,以免未来遭受损失,追悔莫及。 96 | [% endcallout %] 97 | 98 | # 参考资料 99 | 100 | * [国内外php主流开源cms、SNS、DIGG、RSS、Wiki汇总](http://blog.csdn.net/hili2006/article/details/6116538) 101 | -------------------------------------------------------------------------------- /_posts/network/2008-12-26-cloud.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "常见的云服务器" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 本文根据[课戴表王晨宇](http://wangchenyu.net.cn)的经验整理而成。 9 | 10 | # 云主机 11 | 12 | 网上很多人评论阿里云的硬盘速度慢,不过实际上网站的速度决定于 CPU 运算时间长短,还有内存够不够用——除非你有别的用处。 13 | 14 | ## 阿里云 15 | 16 | * 价格:512M 单核一年只需 288,但是流量费用另计。不过感觉起来是要比腾讯云划算。 17 | * 操控性:可以随意的升级、降级、按月付费。 18 | * 网速:下载东西峰值 1~1.5MB/s 良心。学校在青岛,选择青岛区域机房,ping 值在 10 以下,有时候宿舍甚至是 2ms、1ms。而,腾讯云的共享核只能选广东。 19 | * 系统:可以选择 Debian 5 32 位。建议选 CentOS,一方面 yum 功能很强大,另一方面阿里云特别优化了 CentOS,装好后启动内存只占 14M。镜像市场比腾讯云丰富的多,甚至有预装了 hhvm 的镜像。 20 | * 客服:只能电话或者工单。不过工单一般一天内就回复了,而技术类的几分钟就回复。 21 | * 赠品:云盾是个好东西,能真的帮忙拦截 Web 攻击和 ssh 攻击。不过 ssh 攻击只要主机优化好了也没啥;送 128M 的 OCS(完全兼容 memcached)也是一个大礼,尤其是对于 512M 内存的服务器,简直是雪中送炭。通过 ACE 还可以开通免费的 RDS(RDS 可能将来会收费)。 22 | 23 | ## 腾讯云 24 | 25 | * 价格,一年360块钱的共享核能凭借低价吸引很多人。 26 | * 操控性:买了以后不能升级、不能退款,只能以年为单位续费。不过也有一个比较鸡肋的优点,就是可以直接在后台给 Linux 服务器挂载 SSH 密钥。 27 | * 网速:下载东西时 1M 宽带峰值 1~1.5MB/s 良心。 28 | * 系统:后台可选择的系统不多,至少没有“专门针对小内存主机”的Debian 32位系统。好在服务市场里面免费环境很多。 29 | * 客服:比较垃圾。联系很多次有时候等一天都排不上个队。 30 | 31 | ## DigitalOcean 32 | 33 | 网上大批的 do 的评测文章,因为邀请一个人注册送 $10。 34 | 35 | * 网速:虽然网速可以达到满但是延迟200~300太高,不适合放网站。(如果网站不放和谐内容,可以使用百度云加速等服务。) 36 | * 操控性:提供的系统非常全面,而且可以细分到很多。 37 | * 价格:512M 的,$5一个月已经算是非常便宜了。而且推荐别人注册还能送钱。 38 | * 客服:全英文,不过很友好,回答速度也很快。 39 | 40 | ## Amazon AWS 41 | 42 | * 网速:下载速度可以到满速,但是 Oregon 和 San Francisco 到国内延迟就很高,有时候还丢包。东京的很满意,ping 值有时候 100 左右,而且网速也比较稳定。 43 | * 操控性:非常好。可以搜到其他用户共享出来的镜像,所以基本上你想得到的都有。镜像市场更是非常全面。 44 | * 客服:一般提交 Ticket 以后就会有客服来打电话,说的英语很标准,而且也很热心。 45 | * 赠品:非常多,RDS 20G、S3 储存 5G(S3 已经被墙),SSD 磁盘 30G…… 46 | 47 | 现在注册以后是不能直接用东京节点的服务器的,只能发邮件申请,而且时间相当漫长,好像要一星期。 48 | 49 | ## 其他 50 | 51 | * Linode (需要信用卡) 52 | * Windows Azure(分国内和国外版本,国内由世纪互联代理) 53 | * vps.me 54 | * HapHost 55 | * Conoha.jp 56 | 57 | ## 免费空间 58 | 59 | vps.me 和 HapHost 都是免费的,性能很垃圾。现在 haphost 已经没了,都并入 host1plus 了。 60 | 61 | vps.me 上没有开放 IPv4,需要做端口映射,只给了 IPv6。 62 | 63 | Conoha.jp 国内速度可以。操作系统给的很全。因为用的是 KVM,所以可以直接重装系统啊什么的,理论上还能挂一个 Windows 镜像玩玩。只支持信用卡付款。客服没接触过,官网日语难懂,翻译了也难懂。还好系统都是英语的。 64 | 65 | 此外在推荐两个免费空间: 66 | 67 | 一个是 freehostia.com(注册登陆需要翻墙,但是申请到的空间不需翻墙),另一个是summerhost.info(完全开放给国人)。summerhost.info 和 byethost.com 很类似,都很稳定,不删用户。 68 | 69 | # 应用引擎 70 | 71 | ## 国内 72 | 73 | 比较有名的是新浪的 SAE 和 百度的 BAE。此外还有阿里的 ACE(目前内测免费)、京东的 JAE、腾讯的 CEE、盛大的 CAE。 74 | 75 | 值得一提的是,SAE 和 BAE 都支持 Python,BAE 还支持 Node.js。但是不支持 Ruby。 76 | 77 | ## 国外 78 | 79 | 据说 SAE 和 BAE 是照 GAE(谷歌引用引擎)抄袭的。GAE 实际上可以挂网站,但是因为 IP 和域名早就被墙了,所以现在常用来做你懂得的 GoAgent。 80 | 81 | * Openshift:用的就是亚马逊的服务器,但是网址被墙了。幸运的是 IP 没被墙,所以直接 ping 出来 IP 然后用一个 CDN 就能做网站,直接用 IP 连 ssh 就能……(你懂的)。提供 1.5G RAM 和 3G 的硬盘空间,无限流量。一个用户可以创建 3 个免费的应用。 82 | * 和 Openshift 相似但是没有被墙的有 phpcloud、appfog,还有一个大家都知道的 SourceForge。 83 | * uhurucloud 支持 .Net 84 | * Heroku 85 | 86 | 需要注意的是,这些免费版(除了 GAE)一般不允许 24 小时连续开机,需要手动启动,除非付钱。 87 | 88 | 此外还有一些: 89 | 90 | * Snapphq:ASP、PHP、MySQL 91 | * Jelastic:Java、PHP、MySQL 92 | * CloudBees:Java、PHP、MySQL 93 | * Cumulogic:Java、PHP、MySQL 94 | * MoPaaS:Java、Ruby、PHP、MySQL 95 | * Another Service 96 | * phpfog、Orchestra、cloudcontrol、dotcloud、pagodabox:PHP、MySQL 97 | * Appharbor、Webweb:ASP、ASP.NET 98 | * Softlayer 99 | 100 | # 在线开发平台 101 | 102 | 然后就是在线开发平台,比如 cloud9.io、coding.net、nitrous.io、Heroku、uhurucloud。值得一提的是这些基本上都支持 Node.js。 103 | -------------------------------------------------------------------------------- /_posts/network/2008-12-27-download.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "【未完成】下载/BT/电驴" 4 | date: 2008-12-27 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | ## 下载 10 | 11 | ### uGet 12 | 13 | ### wine 迅雷 14 | 15 | ## BT 16 | 17 | ### Transmission 18 | 19 | 这是个 BT 下载软件,开源、跨平台,听说过 PT 站点的人应该都知道这软件,而且几乎所有 PT 站点都支持这软件。 20 | 21 | 顺便提一下,有一个 PT 站点叫六维空间,可以让你快速拿到最新出种的高清电影(包括蓝光原盘),而且下载速度超快(这取决于做种人数、相互的连接性、带宽等多种因素),还有各种破解软件。但是该网站已经不接受新用户。 22 | 23 | ### Azureus 24 | 25 | 现在叫 Vuze,也是一个 BT 下载软件。因为某人在 6ver 的站点用 Transmission 出问题了,于是就换了这个软件。用起来还不错,功能丰富,不过有些站点不支持这个软件。 26 | 27 | Azureus 可以把自己当成一个 Tracker。 28 | 29 | ## 电驴 30 | 31 | ### aMule 32 | -------------------------------------------------------------------------------- /_posts/network/2008-12-28-network-error.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "网络故障" 4 | date: 2008-12-28 00:00:00 5 | faq: ["断网了!"] 6 | --- 7 | * content 8 | {:toc} 9 | 10 | 本文给出一个诊断网络故障的思路,仅供参考。 11 | 12 | [% callout style=info %] 13 | 14 | #### 排除浏览器问题 15 | 16 | 本文假设你电脑系统和浏览器是正常的。但是,确实存在因系统组件错误而导致浏览器本身出现异常的情况。 17 | 18 | [% endcallout %] 19 | 20 | 一般人会以以下两种方式上网: 21 | 22 | 1. 连接到 (自己架设的) 路由器。 23 | 2. 直接 (或通过交换机) 连接到公共网络。 24 | 25 | # 已连接但无法上网 26 | 27 | [% callout style=info %] 28 | 29 | #### 排除驱动问题 30 | 31 | 既然能够连接到网络,那么本文假设你电脑的驱动没有问题。不过确实存在因驱动不正确或驱动不稳定而导致网络故障的情况。 32 | 33 | [% endcallout %] 34 | 35 | 36 | 首先应该检查交换机、路由器等接口是否插紧,如果接口正常,对应的指示灯应该闪烁。 37 | 38 | 其次要确认不是网络供应商出现的问题。 39 | 40 | 41 | ### 确认电脑到路由器是否正常 42 | 43 | 未使用路由器的请跳过本节。 44 | 45 | [% callout style=info %] 46 | 47 | #### 默认配置假设 48 | 49 | 本节假设你的路由器没有进行特别的设置,例如修改了路由器 IP,拉了黑名单或者开了限速。如果不清楚的话,最好问一下安装路由器的人。 50 | 51 | [% endcallout %] 52 | 53 | 一般情况,路由器的 IP 是 192.168.0.1 或 192.168.1.1。那到底是哪个呢?看路由器铭牌。 54 | 55 | 在浏览器中输入路由器的 IP,如果能进去,说明电脑到路由器之间是正常的,否则电脑和路由器之间有问题。 56 | 57 | #### 检查电脑问题 58 | 59 | 一般存在以下两种情况: 60 | 61 | 1. 电脑被设置了错误的静态 IP。 62 | 2. 电脑未获取到 IP。 63 | 64 | 对于第一种情况:在图形界面中找到网络设置和对应的接口 (一般是 eth0 或 wlan0),将 IPv4 的获取地址方法设置为 DHCP (或自动获取)。具体操作与桌面环境有关。如果希望手动修改配置文件,请找 `/etc/network/interfaces` (不同系统可能不一样)。 65 | 66 | 对于第二种情况:先重启。如果重启后仍不正常,可能是系统 DHCP 程序出现问题,当然也存在路由器出现问题的情况。如果连接到其他路由器也出现故障,那就是电脑的问题。 67 | 68 | #### 检查路由器问题 69 | 70 | 检查路由器各项配置是否正确。如果不能确定,最简单粗暴的方法——按住路由器上的 RESET 按钮,从头开始,重新配置。 71 | 72 | ### 确认是否能访问到外部网络 73 | 74 | 百度的 IP 是 `202.108.22.5`。在浏览器输入这个 IP,应该能看到百度首页。 75 | 76 | 如果能看到百度但是仍然无法正常上网,那就是 DNS 的问题。 77 | 78 | ### 确认 DNS 是否正常 79 | 80 | [% callout style=info %] 81 | 82 | #### 重点 83 | 84 | 多数人遇到网络故障,都是因为 DNS 未正确配置。 85 | 86 | [% endcallout %] 87 | 88 | 可以根据实际情况来选择对应的 DNS,也可以干脆使用 `114.114.114.114`。 89 | 90 | 首先应该尝试在图形界面中找到网络配置,并修改 DNS 地址。如果没有图形界面或者找不到配置,可以修改 `/etc/resolv.conf`,并加入 91 | 92 | namespace 114.114.114.114 93 | 94 | ## 无线网卡不可用 95 | 96 | 目前 Linux 对无线网卡的支持比过去好多了——虽然不一定支持丰富的扩展功能,但是最起码能联网了。 97 | 98 | 如果无线网卡不可用,那么可能存在两种情况:一种是未安装驱动 (例如需要安装私有驱动),另一种是无线开关被错误地关闭。 99 | 100 | ### 未安装驱动 101 | 102 | 很多无线网卡驱动都已经集成到 Linux 内核中,但是 Boardcom 牌的无线网卡的驱动就没有。 103 | 104 | 因此要设法通过有线网卡连接到网络,然后安装 `firmware-b43-installer` 或 `firmware-b43legacy-installer` 或类似的软件包。 105 | 106 | 这两个软件可以安装以下型号的无线网卡: 107 | 108 | * BCM4301 109 | * BCM4306 110 | * BCM4311 111 | * BCM4318 112 | * BCM4321 113 | * BCM4322 (只有 14e4:432b); 114 | * BCM4312 115 | 116 | 如果不是这些型号的,那么还是换网卡吧。 117 | 118 | ### 无线开关 119 | 120 | 这个问题不常见,因此目前还总结不出东西。 121 | -------------------------------------------------------------------------------- /_posts/network/2008-12-29-ap.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "笔记本开热点" 4 | date: 2008-12-29 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 本节讲述在 Linux 系统中让笔记本开无线热点时应注意的问题。[Archlinux Wiki (e 文)](https://wiki.archlinux.org/index.php/Software_access_point) 内有一个比较详细的说明。尽管操作系统不一样,但是思路是一样的。 10 | 11 | 12 | [% callout style=danger %] 13 | 14 | #### 很可能会失败 15 | 16 | 尽管在 Windows 系统中建立热点很容易,并且成功率很高,但是在 Linux 系统中并不是这样。因为 Linux 系统很多无线网卡驱动是社区开发的,受官方支持的程度有限。因此, 17 | 18 | * 有些型号的无线网卡**无解**。“无解”意味着你没有必要为了寻找解决方案而继续浪费时间。 19 | * 很多型号无线网卡不支持混合模式,也就是一边连着热点,一边开热点。 20 | 21 | 对于以上两种情况,你只能换回 Windows,或者买 (换) 一个对 Linux 系统支持良好的无线网卡,或者买一个路由器。mini PCI-E 或 USB 无线网卡的价格一般在 30 元左右。 22 | 23 | [% endcallout %] 24 | 25 | # 判断是否能开热点 26 | 27 | ## 是否能开热点 28 | 29 | 在命令行中输入 30 | 31 | iw list 32 | 33 | (如果提示“未找到命令”,那么请手动装一下叫 iw 的软件包。) 34 | 35 | 如果在列表的“Supported interface modes”中看到“AP”,那么说明可以开热点,否则**无解**。 36 | 37 | 如果嫌输出文字太多,可以用 grep 过滤一下: 38 | 39 | iw list | grep -A 10 "Supported i" 40 | 41 | 这样输出结果就会直接以这一行开头。 42 | 43 | ## 是否支持混合模式 44 | 45 | 如果支持混合模式,这就意味着,你可以一边连着 Wifi 一边开热点,否则你只能一头插网线另一头开热点。 46 | 47 | 在命令行中输入 48 | 49 | iw list | grep -A 5 "valid" 50 | 51 | 如果看到“valid interface combinations”那么很有希望。详见 [Archlinux Wiki 的有关说明](https://wiki.archlinux.org/index.php/Software_access_point)。 52 | 53 | # hostapd 54 | 55 | hostapd 是一个用来开热点的软件。但是,需要注意两个问题: 56 | 57 | 1. 它只管开热点,不负责连接热点之后如何获取 IP (DHCP) 等问题。因此,第一次配置好的时候,给设备分配静态 IP 是应该能连接的。但是为了使设备直接连接,还要做一系列配置。 58 | 2. RTL8192CU (芯片) 的无线网卡需要使用定制的 hostapd。 59 | 3. 网上有些配置文件写的是“wpa=3”,这样建立的热点可能无法正确连接。改成“wpa=2”就行了。 60 | 61 | # 网络共享 62 | 63 | 仅仅用 hostapd 开了热点,设备是无法正常连接的 (无法获取 IP),也无法连接网络。这时有两种解决问题的思路,一个是网桥,一个是 NAT (DHCP 服务器 + 转发)。 64 | 65 | ## 网桥 66 | 67 | 网桥的配置比较简单。详见[这里 (往底下看)](http://blog.sina.com.cn/s/blog_6fae25d40100uatn.html)。 68 | 69 | ## NAT 70 | 71 | [这里](https://vjudge1.github.io/2015/05/16/wi-fi-hotspot-on-banana-pro-1/)有一个详细的操作步骤。因为这篇文章讲的是在一个嵌入式开发板中架设热点的过程,所以不要看有关装系统的部分。 72 | -------------------------------------------------------------------------------- /_posts/network/2008-12-30-webserver.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "【未完成】架设网站" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 本文简单介绍如何架设网站。注意,本文不讨论运营网站的问题。 9 | 10 | # 首要问题 11 | 12 | 首先你需要知道以下几个问题: 13 | 14 | * 网站是用什么语言写的。 15 | * 需要什么样的数据库。 16 | * 什么服务器。 17 | 18 | 不知道的话,就需要寻求帮助了: 19 | 20 | * 如果程序还没写出来,可以看[这里]({{ site.baseurl}}/07/backend/)决定用什么编程语言和框架。 21 | * 如果犯了选择综合症,建议用 PHP+MySQL。 22 | 23 | 关于服务器,也有一些问题: 24 | 25 | * 如果只是想测试,可以把服务器装在自己电脑上,或者装到虚拟机里(免得把自己电脑搞得乱七八糟)。 26 | * 在生产环境当然不能用普通电脑。[这里]({{ site.baseurl }}/08/cloud/)是一个靠谱的服务器列表。 27 | 28 | # 部署 29 | 30 | 由于网上有很多教授具体操作步骤的资料,所以本文只是提示一下应该做什么事儿。 31 | 32 | ## PHP 33 | 34 | 流行的两个组合有: 35 | 36 | * LAMP: Linux + Apache + MySQL + PHP 37 | * LNMP: Linux + Nginx + MySQL + PHP (php-fpm) 38 | 39 | 此外还有 WAMP (Windows 环境)。可以用 WAMPServer 或 XMAPP 在 Windows 系统中快速搭建测试环境。 40 | 41 | 注意: 42 | 43 | * 在有些发行版中(包括 OS X),Apache 被称作 httpd。 44 | * Mac 自带 Apache 和 PHP,不带 MySQL。默认情况下 Apache 和 PHP 都不可用,所以要改一些配置文件。 45 | 46 | ## Java(未完成) 47 | 48 | 需要安装 Java 环境。Linux 中常用 OpenJDK。 49 | 50 | 使用 Apache Tomcat 作为网页服务器。 51 | 52 | 数据库常用 MySQL。 53 | 54 | ## ASP.NET(未完成) 55 | 56 | ### Windows 57 | 58 | 需要安装以下组件: 59 | 60 | 1. IIS 61 | 2. .Net Framework 62 | 3. SQL Server (如果数据库是 SQL Server) 63 | 64 | ### Linux 65 | 66 | ASP.NET (C#) 可以在 Linux 中部署。.Net Framework 在 Linux 中的替代品为 Mono。 67 | 68 | SQL Server 没有替代品,因此仍然需要换数据库服务器。 69 | 70 | ## Python 71 | 72 | ## Node.js 73 | 74 | ## Ruby 75 | -------------------------------------------------------------------------------- /_posts/network/2008-12-31-remote.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "远程控制" 4 | date: 2008-12-31 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 首先要对“服务器”和“客户端”的概念有个理解。对于本文而言,被控制的电脑是服务器,进行控制的电脑使用客户端。 10 | 11 | 本文指的不是黑客的远程控制,而是正常情况下 Linux 用户或管理员用的远程控制。 12 | 13 | # 命令行 14 | 15 | ## 服务器端 16 | 17 | Linux/Unix 使用 ssh 进行远程登录。 18 | 19 | Linux 一般都自带并且开启了 ssh,所以无需额外配置。 20 | 21 | OS X 也自带 ssh,但是需要手动开启。在“系统偏好设置”中找到“共享”,然后开启“远程登录”。 22 | 23 | 为了提高安全性,可以限制 ssh 的访问范围,或者采用一次性密码本。配置文件可能是 `/etc/sshd_config` 或 `/etc/ssh/sshd_config` 一类的文件。 24 | 25 | ## 客户端 26 | 27 | * Windows 中有 PuTTY、SecureCRT 等软件。 28 | * Linux/OS X 系统可使用自带的 ssh 命令进行连接,也可以找一些软件。 29 | 30 | 假设服务器端 IP 为 192.168.1.100,那么登录到 root 账户的命令为: 31 | 32 | ssh root@192.168.1.100 33 | 34 | # 图形界面 (ssh) 35 | 36 | ssh 有一个很好玩的特性——X11 forwarding。 37 | 38 | 为什么说它很好玩呢?Windows 的远程桌面只能远程整个屏幕,而 Linux 可以只远程一个窗口! 39 | 40 | ## 服务器端 41 | 42 | 因为苹果不用 X,所以这个当然仅适用于 Linux 系统。 43 | 44 | 其实什么都不用做,而且不用必须开启图形界面。当然,你的系统得安装过图形界面。 45 | 46 | ## 客户端 47 | 48 | 首先要安装 X Server: 49 | 50 | * Windows 可以装 Xming。 51 | * Linux 当然不用装了。 52 | * OS X 需要安装 XQuartz。过去 X11 是系统自带的,但是现在要手动安装一下。 53 | 54 | 然后在远程连接时要开启 X11 forwarding。 55 | 56 | * Windows:以 PuTTY 为例,Connection->SSH->X11->Enable X11 forwarding 57 | * Linux/OS X: 58 | 59 | ssh -XY root@192.168.1.100 60 | 61 | 接下来随便启动一个图形界面程序——一个来自远程的窗口。 62 | 63 | # 图形界面 (VNC) 64 | 65 | ## 服务器端 66 | 67 | OS X 比较简单,系统偏好设置->共享->屏幕共享。如果想开多个不同会话,在登录时不要选择同一用户。 68 | 69 | 继续说 Linux 的问题: 70 | 71 | VNC 服务器有很多种,例如 TightVNC、X11vnc、RealVNC 等。有的支持新会话 (TightVNC),有的只能控制当前桌面 (X11vnc)。应该根据实际需要来进行选择。 72 | 73 | 在配置好 VNC 服务器之后要设置访问密码。 74 | 75 | 因为第一次配置一般都比较啰嗦,所以网上有很多配置教程。大家应该根据自己的系统进行搜索。 76 | 77 | 值得注意的是,某些桌面环境,例如 Ubuntu 的 Unity,使用开启新会话的 VNC 服务器可能会遇到错误。只能用 X11vnc 了。 78 | 79 | ## 客户端 80 | 81 | 有一个比较好用的客户端是 VNC Viewer,同时支持 Windows、Linux 和 OS X 三大系统。 82 | 83 | OS X 系统自带一个 VNC 客户端——假如服务器为 192.168.1.100:1,那么在 Finder 中按Command+K (连接服务器),输入 `vnc://192.168.1.100:5901` 然后就可以用了。 84 | 85 | # 注意事项 86 | 87 | 1. 在远程控制过程中,尽量避免更改网络设置。如果必须更改,在确认之前要确保设置正确,因为一旦网络参数错误,你会和电脑失去连接。 88 | 2. 如果服务器端安装了防火墙,那么必须要开放特定端口,否则外界是访问不到的。 89 | * ssh: 22 90 | * VNC: 5900、5901、5902…… 91 | * RDP: 3389 92 | 3. 事实上端口是可以更改的。更改之后,连接时要把端口明确指出来。 93 | 94 | # 安全性 95 | 96 | 把服务器暴露在公网中,而且允许任意人远程连接,那么将会带来极大的安全隐患。实践证明,只要在公网中出现,很快就会有人过来扫描和探测。 97 | 98 | 因此可以考虑一些防御措施: 99 | 100 | 1. 换端口,避开常用端口号。但是,注意,端口是可以扫描的,而且端口对应服务是可以探测出来的,所以其他措施也很重要。 101 | 2. 配置防火墙,限制只有指定 IP 能够访问。 102 | 3. 经常查看日志,确保没有人在暴力试探你的服务器。安装 fail2ban,自动封杀尝试爆破的人。 103 | 4. 使用更安全的认证方式,如 SSH Key 和一次性密码本。 104 | 5. 不使用时将远程连接服务器关掉。当然 SSH 还得留着,要不然联系就中断了。 105 | -------------------------------------------------------------------------------- /_posts/novice/2001-12-25-google.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[必读]养成随时 Google 的习惯" 4 | --- 5 | 6 | 不管和哪门子科学打交道,遇到问题都是一件非常正常的事儿。 7 | 8 | 你会发现, 9 | 10 | * 你会遇到很多不认识的词语; 11 | * 或者不知道如何去做某些事儿; 12 | * 或者系统、程序发生了故障不能正常运行; 13 | * …… 14 | 15 | 如果遇到所有问题都去问别人,而且不知道[提问的技巧]({{site.baseurl}}/01/how-to-ask/),那么不仅浪费自己和大家的时间,而且还会给人留下非常不好的印象。 16 | 17 | 因此,求人不如靠自己,一定要学会使用搜索引擎。 18 | 19 | 遇到问题时使用搜索引擎,不仅不会麻烦任何人,而且还有助于更好地在 QQ 群等社区内装 13。 20 | 21 | 以下是一些技巧: 22 | 23 | * 遇到不认识的单词,直接搜索。 24 | * 不知道如何操作,例如安装软件,不妨试试`Linux 如何安装软件`或者`Ubuntu 如何安装软件`。 25 | * 不知道软件的用法,例如 Git(一个版本管理软件),可以搜`Git教程`。 26 | * 程序错误,把**错误信息**作为关键词,并且/或者根据搜索情况,把操作系统名称与软件名称加上。 27 | * 中文内容搜不到,换成**英文**接着搜。 28 | * 适当变换关键词,增加具体环境,或者删除一些单词,或者加空格…… 29 | 30 | 总之,不是所有内容都能一下子搜索到,因此要不断尝试。如果失败了,不要害怕,这时候就应该找一个合适的社区提问。 31 | 32 | 最后一个问题,也是最关键的问题,到底应该用哪个搜索引擎搜呢? 33 | 34 | 因为能看这篇文章的基本都是和 Linux 打交道,而 Linux 多少有点“技术含量”,所以…… 35 | 36 | 1. 首选 [Google](https://www.google.com)。 37 | 2. 因为 Google 被墙了,所以你可能想读[这篇文章](https://vjudge1.github.io/2015/06/19/gfw)解决墙的问题。 38 | 3. 因为有时解决墙的问题比较麻烦,所以,可以找替代品,例如谷粉搜搜,或者用必应。因为这些搜索引擎最起码还能搜到很多英文东西。 39 | 4. 走投无路的时候,还有一个百度。不过没有人能保证你一定可以搜到有用信息。 40 | -------------------------------------------------------------------------------- /_posts/novice/2001-12-26-edit.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "如何对本网站做贡献 (如何编辑)" 4 | date: 2001-12-26 00:00:00 5 | --- 6 | * contents 7 | {:toc} 8 | 9 | 本网站是静态网站,所以和那些 CMS (内容管理系统) 有着天壤之别。 10 | 11 | * 最大的区别——没有数据库。所以,对本网站进行 SQL 注入是没有意义的。 12 | * 重要的区别——没有后台。所以要用其他方法来进行编辑。 13 | * 由此产生了最大的困难——需要掌握 GitHub 的用法。 14 | 15 | # 网站由谁托管 16 | 17 | 本网站使用 GitHub Pages,所以在编辑本网站之前,需要掌握 Git 和 GitHub 的用法。 18 | 19 | GitHub 的特性决定了本网站的一切都是开放的,没有隐藏内容。任何地方都可以进行编辑,包括主题和文本。 20 | 21 | # 如何编辑 22 | 23 | 首页上有个大大的按钮“GitHub 项目主页”,实际上就是本网站的内容。 24 | 25 | 编辑方法和其他 GitHub 仓库是一样的:Fork,修改 & 调试,Pull 26 | 27 | 本网站的 GitHub 仓库里附带一个 README,具体内容都已经写出来了。对于程序猿来说,这种编辑模式看起来更 Geek 一些。 28 | 29 | # 好像很麻烦 30 | 31 | 如果未能成功建立编辑环境,但是还希望做点什么,那么可以到 GitHub 仓库中提交 Issue。 32 | -------------------------------------------------------------------------------- /_posts/novice/2001-12-27-warning.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "写给老手的" 4 | date: 2001-12-27 00:00:00 5 | --- 6 | * contents 7 | {:toc} 8 | 9 | 当你有了一些经验,甚至是丰富的经验的时候,看看下面的忠告: 10 | 11 | 1. 时刻保持谦虚。 12 | 13 | 敢和 C 语言之父 `ken` 和 `dmr`,或者和自由软件之父 `rms` 比吗?他们才是真正的黑客。 14 | 15 | 2. 不要嘲笑新手。 16 | 17 | 很可能下个月人家就比你厉害了。 18 | 19 | 3. 不要像诸葛先生辅佐阿斗那样事无巨细。 20 | 21 | 只把应该告诉的东西告诉新手,剩下的让他自己探索就好。就像这个网站一样。 22 | 23 | 4. 即使对方做了愚蠢的事情,也不要嘲笑和否定对方。 24 | 25 | 虽然 Linus 大叔经常出口成脏,但是这不代表你也可以。 26 | 27 | 5. 不管你是不是计算机专业的,你都应该去学自己的专业课。 28 | 29 | 毕竟天朝人还在坚持用 XP。 30 | 31 | 如果你是新手,被人嘲笑了,可以把这篇文档的链接给他们发一份。 -------------------------------------------------------------------------------- /_posts/novice/2001-12-28-view.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "开拓视野" 4 | date: 2001-12-28 00:00:00 5 | faq: ["你们好像啥都知道!"] 6 | --- 7 | * contents 8 | {:toc} 9 | 10 | “你们好像啥都知道!” 11 | 12 | 那么如何开阔自己的视野呢? 13 | 14 | 1. 给自己开阔视野的机会——让自己折腾折腾电脑,从而产生开阔视野的需求。 15 | 2. 去论坛等地方转转,看看别人在讨论什么东西。 16 | 3. 浏览维基百科等网站,不要回避英文。国内百科词条质量很差,因此不推荐。 17 | 4. 去图书馆转转,看看那些计算机类的书都在讲什么东西。 18 | 19 | [% callout style=info %] 20 | 21 | #### 我看不懂他们在说什么 22 | 23 | 你很可能不知道他们到底在说什么。事实上,很多情况下他们讨论的是某些工具的使用。搞清楚那些工具叫什么名字,去搜索引擎上查查工具的作用,从而决定是否要把它学会。 24 | 25 | [% endcallout %] 26 | -------------------------------------------------------------------------------- /_posts/novice/2001-12-29-material.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "获取资料" 4 | date: 2001-12-29 00:00:00 5 | --- 6 | * contents 7 | {:toc} 8 | 9 | 想学习 Linux 或者相关知识了,应该怎么获取资料呢? 10 | 11 | # 一切的前提 12 | 13 | 不管获取哪方面的资料,你必须要掌握`English`! 14 | 15 | 虽然你的英语水平不用高到通过四六级、托福或雅思到程度,也不需要成天背单词,但是,你需要认识一些常用的计算机单词。 16 | 17 | 如果英语水平好的话,建议你多读一些英文资料。很多时候,英文资料的水平比中文资料的水平高多了。尤其是技术问题,谷歌英语搜索和百度中文搜索的结果往往有着天壤之别。 18 | 19 | # 书 20 | 21 | 关于书本,大家要认识一对基本矛盾: 22 | 23 | 1. 在互联网时代,技术的更新是非常迅速的。所以说书本上讲的东西往往有点旧。Linux 的图形界面就属于这一类。 24 | 2. 但是基础的东西,例如命令行或者服务器运维那些东西,变化又不会太大。 25 | 26 | 建议借一些从外文翻译过来的书,因为往往是那些作者的水平更高、经验更丰富。 27 | 28 | [% callout style=warning %] 29 | 30 | #### 还需认识一些问题 31 | 32 | * Linux 分很多种发行版 (例如 Ubuntu、Red Hat)。这些发行版的图形界面操作可能有很大区别,但是除了安装软件等情况,敲命令的时候是没有太大区别的。 33 | * Unix 不是 Linux。不过,有关 Unix 的书也可以看,但是不能全信。 34 | 35 | [% endcallout %] 36 | 37 | # 帮助文档 38 | 39 | 用过 Windows 的应该都知道系统自带的帮助几乎没有任何作用,其实 Linux 或 OS X 也一样。但是你要知道这不代表官方文档的质量很差。 40 | 41 | 此外可以关注一下 Wiki: 42 | 43 | * [Ubuntu Wiki](https://wiki.ubuntu.com) 44 | * [中文 Ubuntu Wiki](http://wiki.ubuntu.org.cn)。这里很多地方已经有些旧了,要注意批判地阅读。 45 | * [Deepin Wiki](http://wiki.deepin.org)。它是国产 Deepin 系统的,不过很多地方的原理和 Ubuntu 一样。 46 | * 维基百科:维基百科不会教你“xxx 怎样用”,但是它可以告诉你“xxx 是什么”。 47 | 48 | # “教程” 49 | 50 | 通过搜索引擎,我们可以找到数不清的教程。很多教程可能质量并不太高,但毕竟是前人经验,应该能够帮助你快速入门。 51 | 52 | 不必总是想着找一份覆盖全面的资料。很多时候你可以在遇到某些问题之后,专门找那一方面的东西。 53 | 54 | 在阅读教程时要注意结合自身实际,而且,有些教程很可能过时了。 55 | 56 | # “导师” 57 | 58 | 尽量不要找“老师”。很多东西是可以自己探索明白的,而且每个人都有自己的事情,所以尽量不要用一些简单的东西来浪费别人的时间。 59 | 60 | 但是在遇到麻烦时,找一下身边认识的、有经验的朋友也未尝不可,但是**最好还是先尝试自己解决**。 61 | 62 | # 在线学习网站 63 | 64 | 有很多在线学习网站,例如[实验楼](http://www.shiyanlou.com)。 65 | -------------------------------------------------------------------------------- /_posts/novice/2001-12-30-how-to-ask.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[必读]提问的技巧" 4 | date: 2001-12-30 00:00:00 5 | faq: ["为什么我问问题,要么没人理我,要么有人鄙视我?"] 6 | --- 7 | * content 8 | {:toc} 9 | 10 | 无论是用 Linux 还是用 Windows,或者是 OS X,遇到问题都是很正常的。当然,如果是新手的话,在 Linux 那里遇到的问题会更多一些。 11 | 12 | 遇到问题不可怕,因为大多数问题都是可以解决的。 13 | 14 | 有些人确实很“好问”,“但是问来问去的问题啊,too simple,sometimes naïve *(幼稚)*!” 结果是,要么没人回答*(当然也可能是没人会用)*,要么被人鄙视,提问者浪费了很多时间。 15 | 16 | 所以,在提问之前,了解一下提问的技巧也是很有必要的。 17 | 18 | 点此查看 19 | 20 | 有些人觉得《提问的技巧》图片太大,下面是简化版本: 21 | 22 | 1. 先去找谷歌解决。([这里]({{ site.baseurl }}/01/google/)讲述的是搜索引擎的事儿。) 23 | 2. 选择合适的提问地点。简而言之,就是不要到新手群里问高难问题,不要到高手群里问初级问题。 24 | 3. 准确描述自己的问题,让人一看就感觉有条理,值得提供帮助。 25 | 4. 提供一些与问题相关的**有用**信息,例如详细的异常现象、自己的尝试。(例如,不要说“开不开机”,而是说开机时看到了什么异常的文字……) 26 | 5. 尊重对方。没有人有解答问题的义务,所以说话要客气一些。 27 | 28 | 良好的提问可以互相提高水平,失败的提问只能浪费大家的时间。 29 | -------------------------------------------------------------------------------- /_posts/novice/2001-12-31-001.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "从何开始" 4 | date: 2001-12-31 00:00:00 5 | faq: ["我是新手,怎么开始?"] 6 | --- 7 | * content 8 | {:toc} 9 | 10 | ![bluescreen]({{site.baseurl}}/images/novice/bluescreen.png) 11 |
Linux 从来不会蓝屏死机!Linux 崩溃叫 Kernel Panic 12 | 13 | ![ctrl-alt-delete]({{site.baseurl}}/images/novice/ctrl-alt-delete.jpg) 14 |
只有 Windows 才需要这个容易导致骨折的组合键 15 | 16 | # 不知道 Linux 17 | 18 | [如何才能知道呢?点这里就知道怎样才能知道了!]({{site.baseurl}}/01/google/) 19 | 20 | # 试水 Linux 21 | 22 | 以下是新人接触 Linux 之后可能产生的结果: 23 | 24 | 1. “什么破东西”、“都是命令、代码”——直接放弃 25 | 2. 虽然还在用 Windows,不过思想已经受 Linux 影响,用上了一些“新东西”。 26 | 3. 除了特殊情况,已经不用 Windows 了。 27 | 28 | 到底会出现哪些结果呢?这取决于你对电脑有多么大的兴趣了! 29 | 30 | ## 女生 31 | 32 | 一般情况下,女生根本不关心那些东西。那么,干嘛非要换系统呢?我们也可以尝试一些自由的软件嘛……即使这样也拦不住她们使用毁图秀秀 33 | 34 | # 结论 35 | 36 | 不管是工作需要,还是感兴趣,都需要改变一下自己的思维习惯,找到合适的入门教材,善于使用搜索引擎。 37 | 38 | 总之,自己动手,丰衣足食。 39 | -------------------------------------------------------------------------------- /_posts/others/2012-12-30-dos-emulator.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "DOS 模拟器——DOSBox" 4 | --- 5 | 6 | DOS 是一款很古董的系统了。虽然和 Unix 一样是敲命令的,但是 DOS 就是比 Unix 逊色很多(不在一个档次上面)。 7 | 8 | 那为什么还要 DOS 模拟器呢? 9 | 10 | * 见证人类发展的历史 11 | * 怀旧者 12 | * 装个 Windows 3.1 玩玩 13 | * 玩 DOS 游戏(恐怕这个才是重点) 14 | 15 | DOSBox 是一个非常好用的 DOS 模拟器,而且在上面可以正常运行 Windows 3.1(但是稍微有些兼容性问题)。 16 | 17 | DOSBox 支持 Windows/Linux/Mac 三大系统,是采用 GPL 协议的自由软件。因此可以直接 apt-get 安装。 18 | -------------------------------------------------------------------------------- /_posts/others/2012-12-31-genymotion.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Android 模拟器——GenyMotion" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | GenyMotion 是一款比官方 Android 模拟器还快的模拟器,并且支持 Windows/Linux/Mac 三大系统。 9 | 10 | GenyMotion 有两种授权:一个是免费版本,一个是付费版本。付费版本比免费版本多很多功能,例如屏幕录像、模拟电话/短信等,不过,如果仅仅是当手机使,这些功能当然用不到,因此免费版本也够用了。 11 | 12 | 使用 GenyMotion 时需要注意以下几点: 13 | 14 | 1. GenyMotion 虽然可以免费下载,但是需要注册一个账号才能下载和使用虚拟系统。 15 | 2. GenyMotion 需要 VirtualBox(虚拟机)才能启动。这里还有一个笑话:因为从 360 软件中心装 GenyMotion 时会顺便安装 VirtualBox,因此绝大多数用(xiao)户(bai)认为 VirtualBox 是流氓软件,并且在 VirtualBox 的页面里给了多到罄竹难书的差评。 16 | 3. GenyMotion 里的 Android 是 x86 的,所以需要下载并安装一个 ARM 库(GenyMotion-ARM-Translation)才能正常用大多数应用。 17 | 4. 从 GenyMotion 登录微信会被封号。 18 | -------------------------------------------------------------------------------- /_posts/toy/2009-12-26-temp-monitor-arduino.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[未完成][Arduino]在线温度监控" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 这是一个简单的 Arduino 小玩具,意在通过一个网页查看温度的变化情况。 9 | 10 | # 材料 11 | 12 | * Arduino + 以太网盾板 (盾板需要几十块钱)、DS18B20 温度传感器 (几块钱一个)、4700Ω 电阻、杜邦线若干 13 | * 需要局域网,因此还需要路由器和网线。 14 | 15 | # 操作 16 | 17 | ## 安装 DS18B20 库 18 | 19 | ## 编码 20 | 21 | # 延伸 22 | 23 | 单片机更适合用作采集装置(客户端 Client),数据处理的事儿交给服务器就好了。 24 | -------------------------------------------------------------------------------- /_posts/toy/2009-12-26-temp-monitor.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[未完成][树莓派]在线温度监控" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 这是一个简单的树莓派小玩具,意在通过一个网页查看温度的变化情况。 9 | 10 | # 材料 11 | 12 | * 树莓派、DS18B20 温度传感器 (几块钱一个)、4700Ω 电阻、杜邦线若干 13 | * 需要局域网,因此还需要路由器和网线。 14 | 15 | # 操作 16 | 17 | ## 安装 Python 和 GPIO 库 18 | 19 | ## 编码 20 | 21 | # 延伸 22 | 23 | ## 使用框架来建站 24 | 25 | ## 可视化 26 | 27 | Chart.js 28 | -------------------------------------------------------------------------------- /_posts/toy/2009-12-27-arduino2048.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[Arduino]2048" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 本文将带你做一个小游戏机——2048。 9 | 10 | # 材料 11 | 12 | * Arduino、LCD12864 屏 (大约 30 块钱)、普通按钮x4、杜邦线若干 13 | 14 | 因为四个按钮代表四个方向,所以也可以弄一个摇杆形的按钮。 15 | 16 | # 电路 17 | 18 | 按照下图接线。 19 | 20 | ![2048]({{site.baseurl}}/images/toy/arduino2048sketches.png) 21 | 22 | 四个按钮从左到右分别是左、下、上、右(和 Vim 的 hjkl 是一致的)。可以按照自己意愿来改顺序。 23 | 24 | # 操作 25 | 26 | ## 安装 LCD 库 27 | 28 | 有人把屏幕的操作封装好了,所以,直接拿来用就可以了。这个封装好的库叫做 U8glib,[点击这里](https://github.com/olikraus/U8glib_Arduino/releases)下载。 29 | 30 | 下载之后,将其解压到“我的文档”(Linux/Mac 类似)里的 Arduino/libraries 目录中。假如“我的文档”目录为`~/Documents`,那么头文件的路径应该是`~/Documents/Arduino/libraries/U8glib/U8glib.h`。 31 | 32 | ## 编码 33 | 34 | 源代码摘自[这里](https://vjudge1.github.io/2015/05/11/the-2048-game-on-arduino/)。如果发现 bug 记得评论一下。 35 | 36 | {% highlight c++ %} 37 | #include 38 | 39 | typedef unsigned char uchar; 40 | 41 | // SCK=3, MOSI=9, CS=8 42 | U8GLIB_ST7920_128X64_1X lcd(3, 9, 8); 43 | 44 | #define UP 6 45 | #define DOWN 5 46 | #define LEFT 4 47 | #define RIGHT 7 48 | 49 | uchar board[4][4] = {0}; 50 | boolean gameOver = false; 51 | 52 | char number[][5] = {"", "2", "4", "8", "16", "32", "64", "128", 53 | "256", "512", "1024", "2048", "4096", "8192", "####" 54 | }; 55 | 56 | void paintBoard() 57 | { 58 | uchar left = 1; 59 | uchar top = 5; 60 | uchar spanV = 1, spanH = 1; 61 | uchar textHeight = 10, textWidth = 7; 62 | 63 | lcd.firstPage(); 64 | lcd.setFont(u8g_font_7x14); 65 | lcd.setFontPosTop(); 66 | do { 67 | // 绘制边框 68 | for (uchar i=0; i<=4; i++) 69 | lcd.drawHLine(left + spanH, 70 | top + spanV*(2*i+1) + textHeight*i + 1*i, 71 | 10*spanH + 16*textWidth + 1*5 - spanH*2); 72 | for (uchar i=0; i<=4; i++) 73 | lcd.drawVLine(left + spanH*(2*i+1) + textWidth*4*i + 1*i, 74 | top + spanV, 75 | spanV*10 + textHeight*4 + 1*5 - spanV*2); 76 | 77 | // 绘制文本 78 | for (uchar i=0; i<4; i++) 79 | { 80 | for (uchar j=0; j<4; j++) 81 | { 82 | uchar x=left + spanH*2*(j+1) + textWidth*j*4 + 1*(j+1); 83 | uchar y=top + spanV*2*(i+1) + textHeight*i + 1*(i+1) - 2; 84 | lcd.drawStr(x, y, number[board[i][j]]); 85 | } 86 | } 87 | } while (lcd.nextPage()); 88 | } 89 | 90 | boolean move(uchar direction, boolean fake = false) 91 | { 92 | uchar temp[4][4]; 93 | boolean changed = false; 94 | memcpy(temp, board, sizeof(board)); 95 | 96 | switch (direction) 97 | { 98 | case UP: 99 | for (char j=0; j<4; j++) 100 | { 101 | char p = 0, q = 0; 102 | for (q=0; q<4; q++) 103 | if (temp[q][j]) 104 | { 105 | if (p!=q) changed=true; 106 | temp[p++][j]=temp[q][j]; 107 | } 108 | for (; p<4; p++) temp[p][j] = 0; 109 | } 110 | 111 | for (char j=0; j<4; j++) 112 | for (char i=0; i<3; i++) 113 | if (temp[i][j] && temp[i][j]==temp[i+1][j]) 114 | { 115 | temp[i][j]++; 116 | temp[i+1][j]=0; 117 | changed=true; 118 | } 119 | 120 | for (char j=0; j<4; j++) 121 | { 122 | char p = 0, q = 0; 123 | for (q=0; q<4; q++) if (temp[q][j]) temp[p++][j]=temp[q][j]; 124 | for (; p<4; p++) temp[p][j] = 0; 125 | } 126 | break; 127 | 128 | case DOWN: 129 | for (char j=0; j<4; j++) 130 | { 131 | char p = 3, q = 0; 132 | for (q=3; q>=0; q--) 133 | if (temp[q][j]) 134 | { 135 | if (p!=q) changed=true; 136 | temp[p--][j]=temp[q][j]; 137 | } 138 | for (; p>=0; p--) temp[p][j] = 0; 139 | } 140 | 141 | for (char j=0; j<4; j++) 142 | for (char i=3; i>0; i--) 143 | if (temp[i][j] && temp[i][j]==temp[i-1][j]) 144 | { 145 | temp[i][j]++; 146 | temp[i-1][j]=0; 147 | changed=true; 148 | } 149 | 150 | for (char j=0; j<4; j++) 151 | { 152 | char p = 3, q = 0; 153 | for (q=3; q>=0; q--) if (temp[q][j]) temp[p--][j]=temp[q][j]; 154 | for (; p>=0; p--) temp[p][j] = 0; 155 | } 156 | break; 157 | 158 | case LEFT: 159 | for (char i=0; i<4; i++) 160 | { 161 | signed p = 0, q = 0; 162 | for (q=0; q<4; q++) 163 | if (temp[i][q]) 164 | { 165 | if (p!=q) changed=true; 166 | temp[i][p++]=temp[i][q]; 167 | } 168 | for (; p<4; p++) temp[i][p] = 0; 169 | } 170 | 171 | for (char i=0; i<4; i++) 172 | for (char j=0; j<3; j++) 173 | if (temp[i][j] && temp[i][j]==temp[i][j+1]) 174 | { 175 | temp[i][j]++; 176 | temp[i][j+1]=0; 177 | changed=true; 178 | } 179 | 180 | for (char i=0; i<4; i++) 181 | { 182 | signed p = 0, q = 0; 183 | for (q=0; q<4; q++) if (temp[i][q]) temp[i][p++]=temp[i][q]; 184 | for (; p<4; p++) temp[i][p] = 0; 185 | } 186 | break; 187 | 188 | case RIGHT: 189 | for (char i=0; i<4; i++) 190 | { 191 | signed p = 3, q = 0; 192 | for (q=3; q>=0; q--) 193 | if (temp[i][q]) 194 | { 195 | if (p!=q) changed=true; 196 | temp[i][p--]=temp[i][q]; 197 | } 198 | for (; p>=0; p--) temp[i][p] = 0; 199 | } 200 | 201 | for (char i=0; i<4; i++) 202 | for (char j=3; j>0; j--) 203 | if (temp[i][j] && temp[i][j]==temp[i][j-1]) 204 | { 205 | temp[i][j]++; 206 | temp[i][j-1]=0; 207 | changed=true; 208 | } 209 | 210 | for (char i=0; i<4; i++) 211 | { 212 | signed p = 3, q = 0; 213 | for (q=3; q>=0; q--) if (temp[i][q]) temp[i][p--]=temp[i][q]; 214 | for (; p>=0; p--) temp[i][p] = 0; 215 | } 216 | break; 217 | } 218 | 219 | if (!fake) memcpy(board, temp, sizeof(temp)); 220 | return changed; 221 | } 222 | 223 | void generateNumber() 224 | { 225 | uchar emptyBlock[16], n; 226 | n=0; 227 | for (uchar i=0; i<4; i++) 228 | for (uchar j=0; j<4; j++) 229 | if (board[i][j] == 0) 230 | emptyBlock[n++] = i*4+j; 231 | 232 | if (n) 233 | { 234 | uchar p = random(0, n); 235 | uchar x, y; 236 | x = emptyBlock[p]/4; 237 | y = emptyBlock[p]%4; 238 | board[x][y] = 1; 239 | } 240 | } 241 | 242 | void detectGameOver() 243 | { 244 | if (move(LEFT, true) || 245 | move(RIGHT, true) || 246 | move(UP, true) || 247 | move(DOWN, true)) 248 | return; 249 | 250 | gameOver = true; 251 | 252 | lcd.firstPage(); 253 | lcd.setFont(u8g_font_ncenB14); 254 | lcd.setFontPosTop(); 255 | do { 256 | lcd.drawStr(3,23,"GAME OVER"); 257 | } while(lcd.nextPage()); 258 | } 259 | 260 | void setup() 261 | { 262 | pinMode(4, INPUT_PULLUP); 263 | pinMode(5, INPUT_PULLUP); 264 | pinMode(6, INPUT_PULLUP); 265 | pinMode(7, INPUT_PULLUP); 266 | 267 | memset(board, 0, sizeof(board)); 268 | gameOver = false; 269 | 270 | randomSeed(analogRead(0)); 271 | 272 | generateNumber(); 273 | generateNumber(); 274 | 275 | lcd.begin(); 276 | paintBoard(); 277 | } 278 | 279 | void loop() 280 | { 281 | if (!gameOver) 282 | { 283 | for (uchar i=4; i<=7; i++) 284 | { 285 | if (digitalRead(i) == LOW) 286 | { 287 | if (move(i, true)) 288 | { 289 | move(i); 290 | generateNumber(); 291 | paintBoard(); 292 | detectGameOver(); 293 | delay(200); 294 | } 295 | } 296 | } 297 | } 298 | } 299 | {% endhighlight %} 300 | 301 | # 延伸 302 | 303 | 2048 是静态画面,太简单。不妨做个 Flappy Bird 玩玩? 304 | -------------------------------------------------------------------------------- /_posts/toy/2009-12-28-gpio.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[树莓派]玩电路必读" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 在准备玩树莓派(或单片机)之前,应该注意一些问题,以免给自己带来不必要的损失。 9 | 10 | # 电路知识 11 | 12 | [% callout style=danger %] 13 | 毁灭只在一瞬间! 14 | 15 | 注意!很多电气元件有着严格的电流和电压限制,一旦电路连接错误(例如短路或电压超限),元件将会**瞬间烧毁**,没有后悔的余地!因此,在使用电气元件之前要注意电气参数,仔细检查电路连接! 16 | [% endcallout %] 17 | 18 | ## 初学者 19 | 20 | 其实,一个初学者并不需要懂太多电路知识就可以玩得很 Hi。 21 | 22 | 树莓派有两个 5V 输出和两个 3.3V 输出,GPIO 电平 3.3V…… 23 | 24 | 在这个“大众创业,万众创新”的年代,很多元件或传感器都是已经被人封装好的`模块`,只要注意电压等基本电气参数,不把电路接错,剩下的都是编程的事儿了。只不过很多模块比自己元件自己焊贵多了。 25 | 26 | 因此建议新手谨慎买零散电子元件,一方面是可能用不到,另一方面是可能电气参数对应不上。 27 | 28 | ## 高手 29 | 30 | 如果仅仅为了玩得“有意思”,实际上并不需要懂太多电路知识。然而,如果想做成实用产品,你必须多懂很多电路知识——你很可能需要自己选芯片自己做板子——没有人愿意要一个元件零散各处、接线乱七八糟的东西的产品吧? 31 | 32 | # GPIO 库 33 | 34 | 如果想把树莓派当作一个控制电路,除了硬件支持,当然需要软件支持。 35 | 36 | Linux 系统提供了 sysfs,即把硬件抽象成文件,编程时使用文件操作代码即可操作硬件。但是这种方法比较底层不雅,而且不适合 PWM 等高频电路。 37 | 38 | 很多使用 C 语言或 Python 语言来进行电路控制——它们都有专门针对树莓派设计的类库。C 语言类库叫作`wiringPi`,Python 类库叫做`RPi.GPIO`。需要在树莓派中安装 gcc 编译器,然后才能安装类库进行编程。 39 | 40 | 值得一提的是,wiringPi 受 Arduino 影响,所以很多函数至少“看起来一样”。 41 | -------------------------------------------------------------------------------- /_posts/toy/2009-12-29-other-toys.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "[未完成]类似的玩具" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | 现在是“大众创业,万众创新”的时代。 9 | 10 | 树莓派和 Arduino 只是创客所用的众多原型板的一种,此外还有很多类似的产品。 11 | 12 | 如果是为了制作一个产品(无论是否用于生产),那么就应该根据实际需求选择合适的板子。 13 | 14 | # 能跑 Linux 的 15 | 16 | ## BeagleBone Black 17 | 18 | ## pcDuino 19 | 20 | # 不能跑 Linux 的 21 | 22 | ## 51 单片机 23 | 24 | ## STM32 25 | 26 | # 更上一层楼 27 | -------------------------------------------------------------------------------- /_posts/toy/2009-12-30-arduino.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Arduino" 4 | date: 2009-12-30 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | Arduino 不仅仅是全球最流行的开源硬件,也是一个优秀的硬件开发平台。如果想玩单片机,并且不希望学那些高深的东西,可以通过 Arduino 快速入门。当然,高手同样也可以用 Arduino 来制作原型产品。 10 | 11 | # 比 51 单片机优秀的地方 12 | 13 | 1. 开发环境跨平台:Arduino IDE 支持 Windows、Linux 和 OS X。 14 | 2. 简单清晰:不需要太多的单片机基础。只需简单的学习即可快速开发。当然也可以方便地深入学习(AVR)。 15 | 3. 开放性:Arduino 的硬件原理图、电路图、IDE 软件及核心库文件都是开源的,Arduino 的处理器也很好买,因此可用作创客的原型板。 16 | 4. 用户广泛:全世界都有 Arduino 的用户。 17 | 18 | # 入手 19 | 20 | Arduino 有很多种类,最经典的应该还是 Arduino UNO 了。建议从 UNO 或 Leonardo 开始 (Leonardo 支持模拟键盘鼠标操作)。 21 | 22 | 可以去淘宝直接购买 Arduino 入门套装,价格不会超过 150 元。套装会包含常见的电子元件。 23 | 24 | Arduino UNO R3 本身在 30 元左右。 25 | 26 | # 支持 Linux 系统的 Arduino 27 | 28 | 那些入门级 Arduino 不支持现代操作系统。不过有些开发板采用 ARM 或 MIPS 指令集的处理器,也可以运行 Linux 系统,例如 Arduino Yún。 29 | 30 | Arduino Yún 的价格比较昂贵,价格远高于一些单板电脑,所以要谨慎入手。 31 | -------------------------------------------------------------------------------- /_posts/toy/2009-12-31-raspberry-pi.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "树莓派" 4 | date: 2009-12-31 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 树莓派当然不是零食了。树莓派是一个银行卡大小、支持 Linux 和 Windows 10 的`卡片电脑`。 10 | 11 | ![树莓派2]({{site.baseurl}}/images/toy/Raspberry_Pi_2.jpg) 12 | 13 | 就是这个样子(图片来自维基百科) 14 | 15 | # 产品定位 16 | 17 | 树莓派使用 ARM 处理器。 18 | 19 | * 树莓派的定位是儿童电脑。 20 | * 但是,树莓派事实上已经成为了全世界 Geek 的玩具。 21 | 22 | [% callout style=warning %] 23 | 树莓派不适合以下人 24 | 25 | 1. 想学习 ARM 处理器——树莓派处理器技术资料不开放。 26 | 2. 创客,想拿树莓派当作原型板——树莓派的处理器在市场上买不到。 27 | 28 | [% endcallout %] 29 | 30 | # 硬件配置 31 | 32 | 通过搜索引擎就能很容易地搜索到树莓派的配置。 33 | 34 | 下面是最新版树莓派 2 的一些配置: 35 | 36 | * 处理器:BCM2836 处理器 (ARMv7) 37 | * 内存:1GB。 38 | * 接口:4 个 USB、一个以太网、一个 HDMI、一个 3.5mm(声音输出/模拟视频输出)。供电口为 microUSB。 39 | * GPIO:普通 I/O 接口、一个串口、一个 SPI、一个 I2C、一个 PWM。 40 | 41 | [% callout style=warning %] 42 | 43 | #### 不要盲目追求配置 44 | 45 | 树莓派的配置与其他单板电脑相比是有些低的,但是,树莓派的资料远比其他开发板的资料丰富的。所以,对于初学者而言,不要盲目地追求高配置,以免遇到更多问题。 46 | 47 | [% endcallout %] 48 | 49 | # 优势 50 | 51 | * 与其他开发板和单板电脑相比,树莓派的资料特别丰富,因此在探索过程中应该不会遇到太大困难。 52 | * 树莓派既能像单片机一样用,又能运行 Linux 系统,因此可以进行物联网实验。 53 | * 树莓派有 wiringPi (C 语言) 和 RPi.GPIO (Python 语言) 两个类库,对单片机控制技术要求不高,所以学习难度比单片机小很多。 54 | 55 | # 功能 56 | 57 | 全世界有数不清的人在使用树莓派制作作品。根据树莓派官方 Twitter 介绍,树莓派甚至被送入太空进行实验。 58 | 59 | # 价格 60 | 61 | 如果只买树莓派和保证正常运行的配件,只需要 300 多元。可以去淘宝购买,价格更便宜: 62 | 63 | * 树莓派:目前最新版是`树莓派 2代 B型`,价格 240 元左右。 64 | * 存储卡:8GB 即可。可用 Kingston 牌 Class 10 的存储卡。30 元左右。 65 | * 电源:需要一个 5V 2A 电源 (USB 接口) 和一根安卓手机充电线。电源应该不到 20 元。设计室外项目的时候也可以使用充电宝。 66 | 67 | 还可以买一些扩展配件: 68 | 69 | * USB 无线网卡:树莓派不带无线网卡。需要的话可以买一个 USB 无线网卡。注意,一定要留意无线网卡的芯片,买支持 Linux 系统的型号,否则事情会变得极其麻烦。 70 | * 散热片:一个 1cm×1cm,一个 2cm×2cm。 71 | * 外壳:定制外壳有很多种,可以看情况购买。 72 | * 风扇:超频必备。注意要和外壳配合好。 73 | * HDMI 线:如果有支持 HDMI 的显示器那太好了。树莓派没有 VGA 接口。 74 | * HDMI 转 VGA 线:不需要像网上说的那样“必须买有源线”。无源线也可以,而且比有源线便宜。但是值得注意的是,不是所有转接线都可以“插上就能用”,有的插上之后黑屏,所以,慎拍! 75 | * USB 转 TTL 线:如果既没有显示屏,又不能通过有线组建局域网,那么只能通过串口操作树莓派。 76 | 77 | 建议预备一些常用的电子元件以及杜邦线。至于高级的电子元件,可以考虑实验室或向他人借用,也可以自己买。 78 | 79 | 在准备购买电子元件的时候,最好先咨询一下有经验的人,以免花冤枉钱。 80 | 81 | # 入手 82 | 83 | 买到树莓派之后,去[树莓派官网](https://raspberrypi.org)下载系统映像,按照网上的教程烧录好。 84 | 85 | 把存储卡装到树莓派里,通电,之后就可以当作一个 Linux 电脑来操作了。 86 | 87 | # 没有显示器,如何操作 88 | 89 | ## ssh 90 | 91 | 如果有网线,那么可以先和电脑组成局域网,通过 ssh 来连接到树莓派系统中。可以通过 X11 forwarding 或者 VNC (需要手动安装) 来远程操作图形界面程序。 92 | 93 | 如何确定 IP 呢? 94 | 95 | 如果使用路由器,那最简单了,只要到路由器的设置界面中 (例如“客户端列表”) 仔细找一找,就应该能找到。如果不嫌麻烦,也可以用`nmap`寻找 IP。 96 | 97 | ## 串口 98 | 99 | 没有网线,或者无法直接确定 IP 地址,怎么办? 100 | 101 | 首先你需要一个 [USB 转 TTL](http://detail.tmall.com/item.htm?id=23592092178&spm=a1z09.2.9.181.mM4LCO&_u=d1vptc864fc0)。有的是 USB 转 TTL 线,有的是 USB 转 TTL 模块,反正就是那种差不多的东西。 102 | 103 | 确定这个东西的芯片是什么,然后到电脑上装驱动 (备注:Linux 免驱)。 104 | 105 | 去网上搜一下“树莓派B+ GPIO 图” (也就是树莓派上那 40 根针的示意图)。接线时这样接: 106 | 107 | 1. 模块的 GND (如果是刷机线,则为黑线) 接树莓派任意一个 GND。 108 | 2. 模块的 RX (如果是刷机线,可能是白线) 接树莓派的 TX。 109 | 3. 模块的 TX (如果是刷机线,可能是绿线) 接树莓派的 RX。 110 | 4. 模块上面写有 VCC (刷机线红线) 或 3.3V、5V 字样的千万不要接线,否则可能会把模块烧毁。 111 | 112 | 将模块插入到电脑上, 113 | 114 | * Windows 默认是 COM3,可以从“设备管理器”中确定。用 PuTTY、SecureCRT 等软件进行操作。 115 | * Linux 默认是 /dev/ttyUSB0,用 PuTTY、minicom、screen 等软件进行操作。 116 | * OS X 默认是 /dev/tty.usbserial,自带 screen 命令,也可以用 SecureCRT 等软件进行操作。 117 | -------------------------------------------------------------------------------- /_posts/try/2002-12-27-room.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "在机房体验 Linux" 4 | faq: ["新生上学没带电脑,如何体验?"] 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 很多学校(或明文或习惯)规定大一新生不能带电脑。那么,怎样才能体验 Linux 系统呢? 10 | 11 | 如果机房有,那当然再好不过了。不过,除了把计算机作为主业的学校,貌似没有多少使用 Linux(以及苹果)的机房。 12 | 13 | # 树莓派 14 | 15 | 树莓派是一个卡片大小的卡片电脑。这台“电脑”可以跑一些 Linux 发行版。 16 | 17 | 如果准备入手,建议先看[这里]({{site.baseurl}}/09/raspberry-pi/),然后向一些懂电子的人咨询,以免被坑。 18 | 19 | 因为新生不能带电脑,所以正好可以带着串口到机房使用,通过串口远程控制。 20 | 21 | [% callout style=warning %] 22 | 注意 23 | 24 | 拔网线非常有可能会违反机房的有关规定。注意安全。 25 | [% endcallout %] 26 | 27 | # 虚拟机 28 | 29 | 如果机房有虚拟机,如 VMware 或 VirtualBox,那么可以尝试在虚拟机中安装系统。 30 | 31 | 很多 Linux 发行版可以在不安装的前提下进行使用。有些机房安装了还原卡,并且有些机房电脑的配置并不高,这样的话,可以考虑不安装而直接体验。 32 | 33 | 新手一般从 Ubuntu 开始,但 Ubuntu 桌面在低配置电脑中可能会非常卡。如果真的很卡,不妨换成使用轻量级桌面的版本,如 Xubuntu。 34 | 35 | # LiveUSB 36 | 37 | [% callout style=warning %] 38 | 注意 39 | 40 | 这样做可能会违反机房的有关规定。体验时注意安全。 41 | [% endcallout %] 42 | 43 | 如果机房电脑可以通过 USB 启动,那太棒了。可以下载 Universal USB Installer,把系统映像刻到 U 盘中。然后,重启,从 U 盘启动电脑…… 44 | 45 | 当然,重启之前建议留意一下电脑的网络配置,以免进新系统之后无法上网。 46 | 47 | # 实验楼 48 | 49 | 实验楼是一个 IT 在线教育网站,他们提供了装有 Xfce 桌面的 Ubuntu 系统。可以一边学知识一边体验系统。不过,如果想保存虚拟机状态,:moneybag:。 50 | -------------------------------------------------------------------------------- /_posts/try/2002-12-28-terminal.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "如何敲命令?" 4 | date: 2002-12-28 00:00:00 5 | faq: ["去哪里敲命令?", "不小心进全屏的命令行了,怎么返回?"] 6 | --- 7 | * content 8 | {:toc} 9 | 10 | 接触到 Linux 之后,敲命令是经常的事儿,但是新手一开始可能不知道到哪儿去敲命令…… 11 | 12 | # 图形界面 13 | 14 | Linux (图形界面) 和 OS X 敲命令的地方是`“终端”` (Terminal),可以到应用程序列表里仔细找一下。 15 | 16 | 在某些系统,例如 Ubuntu,可以按 Ctrl+Alt+T 快速叫出“终端”。这个快捷键也可以到“系统设置”的“键盘”设置里进行调整。 17 | 18 | # 纯文本模式 19 | 20 | 很多 Linux 发行版在启动图形界面之后还会带 6 个纯文本终端。按 Ctrl+Alt+F1Ctrl+Alt+F7 在图形界面和这些终端中切换。 21 | 22 | 如果“不慎”进到了全屏的命令行,也可以尝试 Ctrl+Alt+F1 到 Ctrl+Alt+F7 中的一个按键返回图形界面。 23 | 24 | ## 中文问题 25 | 26 | 纯文本模式对中文支持相当有问题——所有汉字都变成了方块! 27 | 28 | 如果愿意在纯文本终端下使用电脑,可以安装 `fbterm` 或 `jfbterm` 来解决这个问题。配合 `yong` 输入法 (即小小输入法) 即可正常输入汉字。 29 | 30 | # 敲命令时的常见问题 31 | 32 | ## 常犯的错误 33 | 34 | Linux 和 Unix 系统中没有“C 盘”的概念,并且路径分隔符为“/”而不是 Windows 中的 “\”。[这里]({{ site.baseurl }}/03/drives/)有一些详细的解释。 35 | 36 | 以下是新手常犯的一些错误,希望能引起新手注意: 37 | 38 | * 忘记空格。例如把 `mount -o remount,rw /` 敲成 `mount-o remount,rw/`。 39 | * 符号拼错,例如把逗号打成句点,或者反过来把句点打成逗号,或者使用中文标点符号。 40 | * 照抄路径。有些时候要把教程中的路径换成文件 (目录) 路径,不能照敲。 41 | 42 | ## 如何求助 43 | 44 | 以 ls 命令为例: 45 | 46 | * `ls --help`:命令后面跟“--help”(两条短线),回车后显示命令参数的简要说明。 47 | * `man ls`:查看详细的命令手册。 48 | * 去搜索引擎上面查“ls命令”。 49 | -------------------------------------------------------------------------------- /_posts/try/2002-12-29-vm.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "虚拟机" 4 | date: 2002-12-29 00:00:00 5 | faq: ["如何在不造成任何影响的前提下试用 Linux?"] 6 | --- 7 | * content 8 | {:toc} 9 | 10 | 虚拟机最适合试验,特别是破坏性试验。可以在虚拟机里尝试一些未知的和危险的东西。 11 | 12 | 很多人只是想见见 Linux 长什么样,并不打算真正使用 Linux。这种情况下,虚拟机是一个可行的方案。 13 | 14 | [% callout style=warning %] 15 | 16 | #### 虚拟机性能 17 | 18 | 某些操作系统,如 Ubuntu (Unity 桌面环境)、Kubuntu (KDE 桌面环境)、Deepin (Deepin 桌面环境),其桌面环境**在虚拟机上面表现很差**,经常卡顿。这是因为这些系统对虚拟机显卡(不是电脑显卡)支持不好。 19 | 20 | 因此建议将它们刻录成启动 U 盘,通过从 U 盘启动来进行体验。这些系统可以在不安装、不对电脑造成影响的前提下进行试用。 21 | 22 | 如果坚持用虚拟机进行体验,建议换用对显卡要求不高的发行版(如 Ubuntu MATE),或者提高虚拟机的显卡配置。 23 | 24 | [% endcallout %] 25 | 26 | [% callout style=warning %] 27 | 28 | #### 虚拟机工具与 Linux 29 | 30 | 为了增强虚拟机的体验(例如与主机文件共享、任意分辨率、鼠标直接拖拽等),使用虚拟机之后一般会安装虚拟机增强工具。 31 | 32 | 但是,由于 Linux 3.17、3.19 和 4.0 的 API 发生了重大变化,所以安装虚拟机增强工具有可能会失败。如果失败,请下载和安装最新版本的增强工具。 33 | 34 | [% endcallout %] 35 | 36 | 由于在天朝不得不用一些 Windows 软件(例如必须用 QQ、Word、IE 浏览器等),因此装完 Linux 系统之后很可能需要一个带有 Windows 系统的虚拟机。从性能角度来讲,Windows XP 性价比最高,如果电脑条件允许,也可以安装更高版本系统。 37 | 38 | # 常用虚拟机软件 39 | 40 | ## Windows 41 | 42 | Windows 和 Linux 中最常用的虚拟机软件是 `VMware Workstation`。这是个收费软件,所以你需要搞到一个序列号。有一个免费版本是 `VMware Player` (Workstation 自带),但是功能很少。 43 | 44 | 还有一个软件叫 `VirtualBox`,这是一个自由软件,不要钱。 45 | 46 | [% callout %] 47 | 48 | #### Windows 自带的虚拟机 49 | 50 | Windows 7 有可选组件 Windows Virtual PC,而 Windows 8/8.1 有可选组件 Hyper-V。前者不支持 Linux 系统,后者对 Linux 系统的支持有限,用户体验不太好。 51 | 52 | [% endcallout %] 53 | 54 | ## Linux 55 | 56 | VMware Workstation 和 VirtualBox 都有 Linux 版。 57 | 58 | 由于 VirtualBox 是自由软件,所以很容易通过系统的软件包管理器进行安装。 59 | 60 | [% callout %] 61 | 62 | #### VirtualBox 63 | 64 | 一般情况下,VirtualBox 可能会出现无法加载 USB 设备的问题。这是因为你没有权限,所以需要: 65 | 66 | sudo addgroup yourusername vboxusers 67 | 68 | 其中“yourusername”要换成你的用户名。 69 | 70 | [% endcallout %] 71 | 72 | 此外还有一个虚拟机叫做 QEMU,它被用于解决方案 KVM 中。QEMU 神奇之处在于可以模拟在其他处理器 (如 ARM) 上运行的系统。但是 QEMU 对现代操作系统的支持可能不好。 73 | 74 | ## OS X 75 | 76 | VMware 和 VirtualBox 都支持苹果系统,但是 VMware 的名字叫做 `VMware Fusion`。 77 | 78 | 除此之外,OS X 有一个和系统集成度更高、用户体验更好的虚拟机软件,叫做 `Parallels Desktop`。它和 VMware Fusion 都是付费软件。 79 | 80 | # 虚拟机服务器 (Linux) 81 | 82 | 如果拥有一些服务器,想尝试像云计算基础设施一样架设虚拟机服务器,可以考虑以下软件: 83 | 84 | * VMware vSphere Hypervisor 85 | * VirtualBox 86 | * KVM 87 | 88 | 这些软件可以在纯文本模式下运行。不过使用解决方案是更好的: 89 | 90 | * OpenVZ (即将过时) 91 | * OpenStack 92 | -------------------------------------------------------------------------------- /_posts/try/2002-12-30-install-with-win8.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "电脑拒绝引导 U 盘" 4 | date: 2002-12-30 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 有的电脑,在使用 U 盘启动时,电脑会提示“禁止引导”、“拒绝引导”一类的提示语,然后又重新进入了 Windows 8。 10 | 11 | 这是因为电脑开启了 `Secure Boot` 功能。这个功能会使电脑拒绝引导除 Windows 8 (及更高版本) 以外的一切操作系统。 12 | 13 | 如何关闭 Secure Boot?按照以下步骤操作: 14 | 15 | 1. 在 Windows 8 中,`按住 Shift 键`,点击“重启”。 16 | 2. 这时电脑没有直接重启,而是显示一个蓝色画面。选择“疑难解答”、“高级选项”、“UEFI 固件设置”,然后屏幕会提示重启后进入设置。 17 | 3. 重启后会自动进 BIOS 设置。定位到 “Boot” 页面,找到 “Secure Boot”,将其关闭。 18 | 4. 保存退出。这时就可以引导自己的启动 U 盘了。 19 | 20 | 某些电脑无法直接禁用 Secure Boot。可以尝试给 BIOS 管理员设置一个密码。(关闭之后再把密码清除。) 21 | 22 | 关闭 Secure Boot 不会对 Windows 造成影响。 -------------------------------------------------------------------------------- /_posts/try/2002-12-31-install.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "安装 Linux 系统" 4 | date: 2002-12-31 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | # 装哪个系统 10 | 11 | 装哪个系统?那要看你处理什么事情了…… 12 | 13 | * 学生实验——Ubuntu。 14 | * 嫌桌面不好看(用)——换 Linux Mint / Ubuntu GNOME / Kubuntu 15 | * 换成 Fedora 也无妨。 16 | * 电脑配置不好——Xubuntu、Lubuntu、UbuntuMATE……貌似没有人电脑配置不好。 17 | * 努力工作——CentOS[有钱也可以买 Red Hat,省心] 18 | * 其实 Debian 也可以。 19 | * Ubuntu LTS 或 Ubuntu Server 也可以。不过没有人能保证你的前途。 20 | * Linux 恐惧症——FreeBSD[这真不是 Linux] 21 | * 纯新手——UbuntuKylin[至少装完能打汉字]或 Deepin[算是真正国产了] 22 | * 黑客——Kali[省事儿] 23 | 24 | 注意,在工作场合用以下系统可能会给你带来不良后果: 25 | 26 | * 刷软件版本号——Fedora[软件全是新的] 27 | * 装酷——ArchLinux 或 Gentoo[一切自己动手] 28 | * 装酷以至于走火入魔——LFS 29 | * 有钱人直接用 Mac,当然,不要装 Windows[Linux 近亲] 30 | 31 | [% callout %] 32 | 33 | #### LiveCD 34 | 35 | 众所周知,Windows 是“先安装再使用”,不过,很多 Linux 发行版可以“先使用再安装”(如果嫌丑可以不安装,反正对自己电脑也没影响,除了费了一点电)。这就是 LiveCD/LiveDVD/LiveUSB,具体叫什么名字,取决于你用了什么型号的安装盘。 36 | 37 | [% endcallout %] 38 | 39 | # 基本思路 40 | 41 | 1. 下载系统安装映像 42 | 2. 刻录启动 U 盘 43 | 3. 从 U 盘启动电脑 44 | 4. 运行安装程序,给 Linux 系统分区,并且将系统挂载到指定分区上。 45 | 5. 系统安装完成,进行安装后配置。 46 | 47 | ## 下载系统安装映像 48 | 49 | 我们电脑的操作系统一般分为 32 位和 64 位。只要电脑别太古老,基本上都是 64 位处理器,所以,如果没有特殊要求的话,装 64 位系统即可。 50 | 51 | ## 刻录启动 U 盘 52 | 53 | 在 Windows 系统中使用 `Universal USB Installer` 刻录启动 U 盘。 54 | 55 | 虽然界面都是英文,但是日后还要经常和英语打交道,所以不要害怕。 56 | 57 | [% callout style=warning %] 58 | 59 | #### 注意数据备份 60 | 61 | 尽管 Universal USB Installer 不会破坏 U 盘数据,但是为了防止万一,最好备份 U 盘文件。 62 | 63 | [% endcallout %] 64 | 65 | ## 从 U 盘启动电脑 66 | 67 | 不同电脑操作方法不同,所以要根据自己电脑实际情况进行操作。 68 | 69 | 如果实在不会操作,请到搜索引擎中搜索“*(此处是你的电脑型号)*从 U 盘启动”,或者询问有经验的人。 70 | 71 | 一般情况下是电脑刚通电之后按 F12。 72 | 73 | [% callout style=warning %] 74 | 75 | #### 如果电脑拒绝引导 76 | 77 | 有些电脑会**拒绝**启动 U 盘,这是因为电脑开启了 Secure Boot 功能。进入 BIOS 设置将其关闭即可引导。关闭 Secure Boot 不会对 Windows 造成影响。 78 | 79 | [% endcallout %] 80 | 81 | [% callout style=info %] 82 | 83 | #### 苹果电脑 84 | 85 | 苹果电脑和普通电脑类似,但是苹果电脑只有 EFI。苹果电脑选择启动磁盘的方法是开机时按 Option 键。GRUB 2 启动器可以直接引导原生苹果系统。 86 | 87 | [% endcallout %] 88 | 89 | ## 运行安装程序 90 | 91 | 安装程序采用中文提示,但是仍然有很多值得新手注意的要点: 92 | 93 | [% callout style=info %] 94 | 95 | #### 建议先断网 96 | 97 | 最好不要连接到网络,因为在正式配置好之前,安装程序会在国外的软件源中下载文件。我们完全可以等系统装好之后让它从国内软件源下载文件,加快下载速度。 98 | 99 | [% endcallout %] 100 | 101 | ### 安装选项 102 | 103 | 在“安装选项”处会遇到第一个大问题: 104 | 105 | * 如果有“和 Windows 共存”一项,那么可以直接选择此项以降低难度。在划分分区的时候,Ubuntu 系统在图的左侧,划 20GB 即可。 106 | * 如果没有“和 Windows 共存”一项,应该选择“其他选项”。 107 | 108 | **务必认真阅读说明,错误的操作会导致整个电脑数据丢失!** 109 | 110 | ### 分区 111 | 112 | 在安装程序中选择“其他选项”之后,会进入分区画面。在这里可以进行无损分区。 113 | 114 | Linux 分区表示法和 Windows 不同。在 Linux 中,分区以文件的形式存在。第一个磁盘的第一个分区叫 /dev/sda1……以此类推。 115 | 116 | [% callout style=info %] 117 | 118 | #### 最保险的区分法 119 | 120 | 由于不同电脑的分区情况可能相差非常大,所以建议通过`磁盘容量`、`已用空间`和`剩余空间`来判断到底是哪个磁盘分区。也可以考虑事先在 Windows 系统中将分区分割好然后再运行安装程序。 121 | 122 | [% endcallout %] 123 | 124 | [% callout style=danger %] 125 | 126 | #### 更改立刻生效 127 | 128 | 在安装程序中对分区的修改 (添加、删除、分割分区等) 会立刻生效,因此在进行破坏性操作之前务必仔细确认! 129 | 130 | [% endcallout %] 131 | 132 | 找到要分割的分区,点击“编辑”,然后更改容量的数字并点击“应用”,安装程序就会把分区分割开。改动立刻生效。 133 | 134 | 可以只划分两个分区:一个用作“Ext4 文件系统” (20GB) 即系统分区,另一个用作“交换分区” (2GB) 作为备用虚拟内存。 135 | 136 | [% callout style=info %] 137 | 138 | #### 分区方案 139 | 140 | 网上有很多关于分区方案的讨论。有的人会划出接近十个分区,有的人划几个分区,而有的人只划一个或两个分区。这些分区分割方案都有道理。考虑到个人电脑无需过于关心稳定性,因此不必划分太多分区,以免难于管理。 141 | 142 | 此外,交换分区的容量也容易引发争论。一般而言,服务器的交换分区会非常大,需要使用“休眠”功能电脑的交换分区接近内存。由于 Ubuntu 的休眠功能不正常,并且交换分区很少被使用,因此不必划分太大空间以至于造成浪费。 143 | 144 | [% endcallout %] 145 | 146 | 在编辑分区的时候,对话框中会有“用作”和“挂载点”两个选项。 147 | 148 | * “用作”即文件系统。系统分区要选择“Ext4 日志系统”,而交换分区直接选择“交换分区”。其他分区不用管。 149 | * 至于“挂载点”,系统分区的挂载点是“/” (只有一个斜杠),其他分区都不用填。 150 | 151 | ### 启动器 152 | 153 | 在“其他选项”底下有一个“启动器”。应该选择那个不带数字的分区 (/dev/sda)。如果有两块硬盘,可以根据具体的分区来判断到底应该选哪个,但是,不管选哪个,路径上面肯定没有数字。 154 | 155 | [% callout style=info %] 156 | 157 | #### UEFI 启动 158 | 159 | 对于某些电脑 (UEFI 启动),选择启动器安装位置之后可能仍然无法安装,并且要求挂载“/boot/efi”。如果出现此情况,你需要找到磁盘开头容量不太大(几百 MB)的、使用 FAT32 文件系统的分区 (即 ESP 分区),点击编辑,将其挂载为 /boot/efi。 160 | 161 | [% endcallout %] 162 | -------------------------------------------------------------------------------- /_posts/try/2002-12-31-prepare.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "准备工作——吃一颗定心丸" 4 | date: 2002-12-31 00:00:00 5 | faq: ["安装 Linux 系统会不会对自己电脑造成影响?"] 6 | --- 7 | * content 8 | {:toc} 9 | 10 | 因为装系统是一个有危险性的活动,所以,在装系统之前,一定要先对这个东西有一个了解。 11 | 12 | # 常见问题 13 | 14 | 1. 双系统会不会对电脑造成影响? 15 | 16 | 对电脑基本上不会造成任何影响,除了新系统要单独占个分区。当然,如果你装完双系统之后对另一系统进行破坏,这个问题要另外考虑了。 17 | 18 | 2. 软件能不能共用? 19 | 20 | 当然不能。多个 Linux 系统之间除外。 21 | 22 | 3. 应该装哪个 Linux 系统? 23 | 24 | 新手可以考虑装 UbuntuKylin。不喜欢“国产”标签的可以装 Ubuntu。当你有一定水平的时候,你自然会知道你想装哪个系统。 25 | 26 | 4. 应该留多大分区? 27 | 28 | 如果个人使用,20GB 系统盘 + 2GB 交换分区足矣。**不用按网上教程那样把自己电脑硬盘分得七零八落,免得麻烦。** 29 | 30 | 5. 有没有“……软件”? 31 | 32 | 建议以下人不要装 Linux: 33 | 34 | * 不打算学太多电脑知识:换了一个全新的系统,当然要学很多新知识了。 35 | * 怕折腾:Linux 对初学者不友好。经过一番折腾之后才能用得舒服。 36 | * 代码恐惧症患者:不与代码和命令打交道怎么玩 Linux? 37 | * 经常玩(尤其是腾讯的)游戏:要是不做其他事儿,那还是接着用 Windows 吧。 38 | * 写公文的:除非对格式要求不太死。Microsoft Office 没有 Linux 版。即使是官方的 Mac 版其“兼容性”也不如 Windows。 39 | * 做音乐和视频的:Linux 缺少专业视频软件。 40 | 41 | 6. EFI 模式能装吗? 42 | 43 | Linux 也是现代系统,当然要支持一些新技术规范了。 44 | -------------------------------------------------------------------------------- /_posts/work/2005-12-26-flash.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Flash (Flash 制作软件)" 4 | date: 2005-12-26 00:00:00 5 | --- 6 | 7 | 现在不建议大家学习和使用 Flash,因为: 8 | 9 | 1. Flash 是 Adobe 公司的专有格式。 10 | 2. 在很多领域(例如交互式动画),Flash 有被 HTML5 和 CSS3 取代的趋势。 11 | 3. Flash 对 Linux 有限支持,有放弃支持的趋势。 12 | 4. 移动设备不支持 Flash。 13 | 14 | 由于 Flash 是专有格式,因此它没什么代用品。幸运的是,Flash 可以在 Wine 中较好的运行,而且 Flash 不需要安装,只需要把它从一个装好的电脑中复制过来,双击就能运行。 15 | -------------------------------------------------------------------------------- /_posts/work/2005-12-27-illustrator.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Illustrator (矢量图软件)" 4 | date: 2005-12-27 00:00:00 5 | --- 6 | 7 | Illustrator 是功能强大的矢量图绘制软件。 8 | 9 | # Wine 10 | 11 | Illustrator 可以通过 Wine 运行,但是高版本(例如 CS4 或更高)可能不稳定,甚至直接崩溃。 12 | 13 | 可以考虑安装最新版 Wine,然后下载 Illustrator 绿色版。建议不要用太高的版本。 14 | 15 | # 代用品——Inkscape 16 | 17 | Inkscape 是一个强大矢量图绘制软件,支持 Windows/Linux/Mac。因为是自由软件,因此与 Illustrator 相比性价比极高(免费但功能不差)。 18 | 19 | Inkscape 的操作与 Illustrator 根本不同,需要重新学习。 20 | -------------------------------------------------------------------------------- /_posts/work/2005-12-28-photoshop.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Photoshop" 4 | date: 2005-12-28 00:00:00 5 | --- 6 | 7 | Photoshop 是功能最强大的照片合成软件。可惜的是,它有 Windows 版和 Mac 版,但是没有 Linux 版。 8 | 9 | # Wine 10 | 11 | Photoshop 可以通过 Wine 运行,但是高版本(例如 CS4 或更高)可能不稳定。 12 | 13 | 如果仍然想在 Linux 中用 Photoshop,而且不希望用虚拟机,可以考虑安装最新版 Wine,然后下载 Photoshop 绿色版。正常情况下 Photoshop 应该可以运行。 14 | 15 | # 代用品——GIMP 16 | 17 | GIMP 是一个功能强大的合成软件,被称作“Linux中的Photoshop”。GIMP 是跨平台的软件,支持 Windows/Linux/Mac。因为 Photoshop 价格昂贵,因此,GIMP 的性价比极高(免费但功能不差)。 18 | 19 | 事实上,习惯了 Photoshop 的人会觉得 GIMP 很难用,而且会觉得 GIMP 缺少很多功能。但总体上并不差多少。 20 | -------------------------------------------------------------------------------- /_posts/work/2005-12-29-math.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "常用数学软件" 4 | date: 2005-12-29 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | # 软件列表 10 | 11 | 下面是一些常见的商业数学软件。对于天朝子民来说,花俩大洋用正版应该不成问题。但是如果有坚持用自由和开源软件的强迫症,不妨试试替代品。 12 | 13 | 商业软件 | 是否支持 Linux | 是否支持 OS X | 开源/免费替代品 14 | ------------|---------------|-------------|---------- 15 | Excel | 否 | 是 | LibreOffice Calc (开源),WPS (闭源)…… 16 | MATLAB | 是 | 是 | Octave、QtOctave (图形界面版本)
Scilab
GNUplot (绘图软件,不开源) 17 | Mathematica | 是 | 是 | Mathics 18 | Maple | 是 | 是 | Maxima 19 | SPSS | 是 | 是 | GNU PSPP 20 | S-Plus | 是 | ? | GNU R 21 | Origin | 否 | 是 | qtiplot、GNUplot (闭源) 22 | Lingo | 否 | 是 (目前无破解版) | 无 23 | 24 | 此外,写论文的时候可能会用一些软件: 25 | 26 | 商业软件 | 开源/免费替代品 27 | ------------|------------------ 28 | Word | LibreOffice Writer (开源)、WPS (闭源)
LaTeX 29 | PowerPoint | LibreOffice Impress、WPS (闭源)
LaTeX (beamer) 30 | MathType | MathMagic Lite (MathMagic 免费版) 31 | Endnote | JabRef、Mendeley 32 | Photoshop | GIMP 33 | Illustrator | Inkscape 34 | 35 | R 和 LaTeX 是两种语言。除了下载对应的编译器 (解释器),还需要相关的编辑器或什么软件,例如 R 语言有 RStudio,LaTeX 语言有 TexStudio。 36 | 37 | # 软件简介 38 | 39 | ## Matlab 40 | 41 | Matlab 全称“矩阵实验室”。估计大学生对这软件都有耳闻,大物老师上课会时不时地提起这东西,(几乎)是数学建模必不可少的东西。这软件跨平台,不过都是收费。 42 | 43 | 安装 MATLAB 之前需要替换一个文件,然后再安装,否则你需要掏几万美元。一般会附带安装说明。 44 | 45 | ## Mathematica 46 | 47 | 也是数学运算相关的一款软件,和 Matlab 有一定区别。Matlab 侧重数值计算,Mathematica 侧重符号计算。支持 Windows/Linux/Mac。 48 | 49 | Mathematica 使用算号器激活。Windows 系统的算号器可以激活其他系统的 Mathematica (甚至包括 ARM Linux 版)。低版本算号器 (8/9) 也可以用于高版本的激活,不过成功率会稍微低一些(如果激活失败,多试几次就可以了)。 50 | 51 | ## Maple 52 | 53 | Maple 也是一款强大的数学软件。侧重点也是符号计算。 54 | 55 | Maple 也通过替换文件破解。 56 | 57 | ## SPSS 58 | 59 | SPSS 全称“统计产品与服务解决方案”。SPSS 的强项是统计、数据分析、图表分析。 60 | 61 | SPSS 通过替换文件来破解。 62 | 63 | ## GNU R 64 | 65 | R 语言是用于统计分析、绘图的语言和操作环境。GNU R 功能非常强大,所以有需求的话就又需要学习一门语言了。 66 | 67 | 既然是 GNU 的重要产品,当然不要钱了。不过最好再配一个开发环境。 68 | 69 | ## Lingo 70 | 71 | LINGO 全称“交互式的线性和通用优化求解器”。可以用于线性规划、非线性规划,也可以用于一些线性和非线性方程组的求解等,是求解优化模型的最佳选择。 72 | 73 | LINGO 一般使用“万能”许可文件来破解。LINGO 在不破解的情况下也能使用,但是只能计算小规模的数据。 74 | 75 | ## GNUplot 76 | 77 | GNUplot 是一个功能强大的绘图软件,支持二维和三维图形。 78 | 79 | 因为它是个命令行工具,使用一套脚本语言,所以…… 80 | 81 | GNUplot 的名字虽然带“GNU”但它不是 GNU 的,也不是自由软件。还好它是免费的。 82 | 83 | ## LaTeX 84 | 85 | 见[这里]({{ site.baseurl }}/05/latex/)。 86 | 87 | ## MathType 88 | 89 | MathType 是强大的公式编辑器。Word 2003 以及 WPS Office 附带的公式编辑器就是 MathType 的精简版本。 90 | 91 | 所以 MathType 功能当然比“公式编辑器”多。值得一提的是,MathType 支持以 LaTeX 格式输入公式,也支持将公式复制成 LaTeX 格式。因此,写文章时如果遇到复杂数学公式可以用 MathType “作弊”。 92 | 93 | 只需要找到注册码即可使用。 94 | -------------------------------------------------------------------------------- /_posts/work/2005-12-30-latex.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "LaTeX (排版系统)" 4 | date: 2005-12-30 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 如果经常用 Word 写大型文档,你一定很清楚—— 10 | 11 | * 即使使用了“样式”,拿 Word 维护格式仍然很麻烦; 12 | * 即使使用了“交叉引用”,维护序号和引用关系也有些麻烦;参考文献也一样; 13 | * 数学公式简直就是噩梦。 14 | * …… 15 | 16 | LaTeX 是一个强大的排版语言,它最擅长的就是有一大堆数学公式的学术论文——以代码的形式书写论文,书写的时候只需要关注正文内容,而格式、编号、引用什么的会由系统自动生成,而且论文的样式非常漂亮。 17 | 18 | ![论文]({{site.baseurl}}/images/work/latex1.png) 19 | 20 | 用 LaTeX 写的美国数学建模比赛论文(截图) 21 | 22 | 此外 LaTeX 也可以用于制作学术用途的幻灯片,既简洁又质朴。 23 | 24 | [% callout %] 25 | TeX 的起源 26 | 27 | 上个世纪 70 年代的时候,大牛高德纳(Donald Ervin Knuth)发现自己的大作《计算机程序设计艺术》(The Art of Computer Programming)印刷水平实在烂到渣。作为一个黑客,这当然令他无法忍受,于是他自己动手写了一个排版软件——TeX。 28 | 29 | TeX 是一个很少有 bug 的软件。而且有趣的是,TeX 的版本号是逐步向圆周率靠近的——最新版是 3.1415926。 30 | 31 | 因为 TeX 的代码比较原始,写起来容易头大,所以后来有人对 TeX 进行了一些封装,简化了许多语法,即 LaTeX。 32 | [% endcallout %] 33 | 34 | 在国外,有很多教授或学术机构不接受,或者不愿意接受 Word 格式的文件,这时候你当然要用 LaTeX 编辑然后生成一份 PDF 文件发给他们了。国内盗版流行,所以没有人会在乎 Word 要多少钱。 35 | 36 | 在本文,我们不打算区分 TeX、LaTeX、LaTeX2e、AMSLaTeX、XeLaTeX、TexLive、MikTeX……的概念。我们会直接用 `LaTeX` 来指代这些东西。 37 | 38 | # LaTeX 的配置 39 | 40 | LaTeX 也是编译器,所以需要安装和配置才能用。而且,这个软件很大,安装时一定要有耐心。 41 | 42 | ## Windows 43 | 44 | Windows 下的配置是最轻松的: 45 | 46 | 1. 下载并安装 [CTEX](http://www.ctex.org/CTeXDownload)。建议下载完整版,免得麻烦。 47 | 2. CTEX 附带的两个编辑器很不好用,其中一个还要钱 (不仅要钱而且对 UTF-8 支持还很差劲),所以你可以自己下载 `TexStudio`。 48 | 49 | ## Linux 50 | 51 | 以 Ubuntu 为例。 52 | 53 | 1. 安装 `texlive-full` 软件包。 54 | 2. 安装 `texstudio` 软件包。 55 | 3. 这时候可以编译英文文档了,但是中文文档还不可以,因为缺中文字体。 56 | * 到 Windows 系统盘的 Windows\Fonts 目录中找到宋体 (SIMSUN.ttc)、楷体 (SIMKAI.ttf)、黑体 (SIMHEI.ttf)、仿宋 (SIMFANG.ttf) 四种字体。 57 | * 把这四种字体复制到 `/usr/share/texlive/texmf-dist/fonts/truetype/public` 中,不要改名。 58 | * 运行 `sudo texconfig`,选择其中的 `REHASH`,使系统检测到刚复制的四个字体。 59 | 60 | ## OS X 61 | 62 | 1. 下载并安装 `MacTex`。 63 | 2. 下载并安装 `TexStudio`。 64 | 3. 同样要把四种中文字体的问题解决。下面是对 ctex 宏包本身进行修改的方案—— 65 | 66 | 打开 `/usr/local/texlive/2014/texmf-dist/tex/latex/ctex/fontset/ctex-xecjk-winfonts.def`,做以下改动: 67 | 68 | {% highlight latex %} 69 | \setCJKmainfont[BoldFont={STHeiti},ItalicFont={Kaiti SC}] 70 | {Songti SC} 71 | \setCJKsansfont{Songti SC} 72 | \setCJKmonofont{STFangsong} 73 | 74 | \setCJKfamilyfont{zhsong}{Songti SC} 75 | \setCJKfamilyfont{zhhei}{STHeiti} 76 | \setCJKfamilyfont{zhkai}{Kaiti SC} 77 | \setCJKfamilyfont{zhfs}{STFangsong} 78 | 79 | \newcommand*{\songti}{\CJKfamily{zhsong}} % 宋体 80 | \newcommand*{\heiti}{\CJKfamily{zhhei}} % 黑体 81 | \newcommand*{\kaishu}{\CJKfamily{zhkai}} % 楷书 82 | \newcommand*{\fangsong}{\CJKfamily{zhfs}} % 仿宋 83 | \endinput 84 | {% endhighlight %} 85 | 86 | # LaTeX 入门 87 | 88 | 如果有代码恐惧症,一定要记住:当你不理解代码用途的时候,可以看看别人怎么写的,照着改。 89 | 90 | * 如果是写论文,可以去找`《112 分钟学会 LaTeX》`。因为不需要深奥的编程思想,而且不需要记住所有语句,所以很快就能入门。 91 | * 如果是做幻灯片,首先你要知道一般人都用`beamer`宏包。 92 | 93 | 如果真的要写论文了,不妨先搜一搜模板,然后再动手。一个合适的模板可以事半功倍。因为做模板那个人已经事倍功半了。 94 | 95 | # 中文问题 96 | 97 | 很多教程是从外文翻译过来的,所以对于中日韩三个国家的人来说就麻烦了。 98 | 99 | 在文档的导言区加一句: 100 | 101 | {% highlight latex %} 102 | \usepackage[UTF8,hyperref]{ctexcap} 103 | {% endhighlight %} 104 | 105 | 然后就能输出中文了。 106 | 107 | 中文解决方案有很多,例如 CCT、CJK……如果你碰到了这些字样,建议你直接无视它们,因为只要上面一行代码,问题就已经直接解决了。 108 | 109 | 编译的时候,建议大家用 XeLaTeX。这个对中文的支持更好。 110 | 111 | # 辅助 112 | 113 | ## 模板 114 | 115 | 尽管 LaTeX 可以让你专注于内容的书写,然而 LaTeX 认为默认样式是最合适的,若无必要,不必修改,因此在 LaTeX 修改样式实在是非常费劲。 116 | 117 | 如果论文有严格的格式要求,那么最好找一个合适的模板(例如哈尔滨工业大学的学士学位论文模板),在他的基础上进行修改。这样可以节省不少时间。 118 | 119 | ## 宏包 120 | 121 | 默认功能总会是有限的。幸运的是,LaTeX 有着良好的扩展性——通过一个叫做“宏包”的东西来扩展功能。 122 | 123 | 前文提到的“ctexcap”就是一个处理中文支持问题的宏包。 124 | 125 | 有了宏包,我们可以轻松地解决很多问题,例如绘制电路图、有机物的结构式、贴一段程序代码……只要你知道宏包叫啥,知道怎样使用就行。 126 | 127 | ## 图象 128 | 129 | LaTeX 并不擅长绘制图形。所以有以下几种方案: 130 | 131 | * 使用 TikZ:TikZ 是一个强大的用于绘图的宏包。只要给指令他就能绘出图形。简单图形可以用这个宏包。 132 | * 使用 GNUplot:数学图象,不管是 2D 还是 3D 的,可以用 GNUplot 绘制。只不过 GNUplot 也是一堆代码…… 133 | * 使用绘图软件(例如 MATLAB、Photoshop、Illustrator):LaTeX 支持 jpg、png、eps、svg、pdf 等格式。为了提高印刷质量,建议保存成矢量图(eps、svg、pdf 等)。 134 | 135 | ## 参考文献 136 | 137 | BibTeX 是用来写参考文献的,可以和 LaTeX 配合使用。通过一个叫做 JabRef 的软件,即可专门管理参考文献。 138 | 139 | Google 学术可以直接将参考文献导出成 LaTeX 格式。遗憾的是,国内的数据库和软件对 LaTeX 不太友好,所以仍然需要其他文献管理软件来将其转换成 TeX 格式。 140 | 141 | # 作弊 142 | 143 | 如果公式、图形或表格非常复杂,那么与其苦苦研究和调试 LaTeX 语句,不如找个简单方法直接解决问题。毕竟天朝人有钱,不怕商业软件价格贵。 144 | 145 | ## 数学公式 146 | 147 | 如果 LaTeX 刚入门,你很可能解决不了复杂数学公式的输入。这时候我们就需要 `MathType` 了。MathType 可以直接以 LaTeX 格式来输入公式,也可以把公式直接复制成 LaTeX 格式。对于不容易或者不会写成代码的复杂数学公式来说,非常方便。 148 | 149 | [% callout %] 150 | 提醒 151 | 152 | 一些常用的语法,例如`$x^2$`(x的平方)、`$\sqrt{a+1}$`(√(a+1)))、`$\sin\frac{\pi}{3}=\frac{\sqrt{3}}{2}$`(sinπ/3=√3/2),用得多了自然就能记住…… 153 | [% endcallout %] 154 | 155 | ## 复杂图形 156 | 157 | 最简单的办法——用 MATLAB、Illustrator 等软件把图画好,保存成 pdf 或 svg 格式,然后插入到文档中。 158 | 159 | ## 复杂表格 160 | 161 | 对于非常复杂的表格,我们可以拿 Word 做好,保存成 PDF 格式,用 Illustrator 或其他矢量图软件进行适当处理,然后作为图片插入到文档中。 162 | 163 | 但是这样做有一个小问题——字体不一样,怎么办? 164 | 165 | 一个伟大的解决方法是:去 LaTeX 安装目录里找 `texgyrepagella` 字体,把它装上,然后到 Word 里把字体设成 `TeX Gyre Pagella`。然后他们看起来就没什么明显区别了。 166 | 167 | ## Lyx 168 | 169 | Lyx 是一个类似 Word 的可视化编辑软件,但是仍然遵循 LaTeX 的规范,所以格式不会像 Word 那样被调得乱七八糟。 170 | 171 | Lyx 基于 LaTeX,用 Lyx 编辑的文本也使用 LaTeX 编译,因此 Lyx 适合“代码恐惧症”患者。 172 | -------------------------------------------------------------------------------- /_posts/work/2005-12-31-office.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Office" 4 | --- 5 | * content 6 | {:toc} 7 | 8 | Microsoft Office 有 Windows 版和 Mac 版,就是没有 Linux 版,所以……只有替代品。 9 | 10 | [% callout style=danger %] 11 | 12 | #### 官僚主义的公文 13 | 14 | 尽管替代品的兼容性不会太差,但是,如果你在编辑来自上级行政部门的公文,请回到 Windows,用那个永远不会出现格式问题的 Microsoft Office 2003。 15 | 16 | [% endcallout %] 17 | 18 | [% callout style=danger %] 19 | 20 | #### 论文 21 | 22 | 如果导师允许使用 LaTeX 写论文,那么当然要用 LaTeX 了,因为除了 Windows 版 Microsoft Office,其他软件都会出现所谓的“格式问题”。 23 | 24 | [% endcallout %] 25 | 26 | # 国产替代品 27 | 28 | 虽然很多时候都是“外国的月亮圆”,但是在办公软件方面,倒是国产软件的兼容性更好。 29 | 30 | * 兼容性最好的是 WPS Office。不过目前还没有严格的正式版本,并且 WPS 表格的图表功能还无法使用。 31 | * 此外还有一个永中 Office,似乎不更新了,因为最新版是 2013。兼容性也不错。 32 | 33 | # 外国替代品 34 | 35 | * LibreOffice 是 Ubuntu 自带的办公软件。兼容性一般。LibreOffice 支持 Windows/Linux/Mac 三大系统。 36 | * KDE 官方的办公软件是 KOffice。兼容性一般。 37 | * GNOME 官方的办公软件是 Abiword 和 Gnumeric(没有 PowerPoint 的替代品)。兼容性不好。 38 | 39 | # LaTeX 40 | 41 | 如果能够学会 LaTeX,那么有时候就不需要 Word 和 PowerPoint 了。 42 | 43 | # Wine 44 | 45 | 如果安装了 PlayOnLinux,可以尝试通过 Wine 安装和运行 Microsoft Office,只不过没有人能保证它稳定运行。 46 | -------------------------------------------------------------------------------- /_posts/work/2005-12-31software.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "软件列表" 4 | date: 2005-12-31 00:00:00 5 | --- 6 | * content 7 | {:toc} 8 | 9 | 10 | 11 | 12 | 13 | ## Telegram 14 | 15 | 跨平台的聊天软件,而且据说,在里面不管说什么,都不会被水表。。。缺点是 Linux 版没办法直接输入中文,只能在别处复制过去(哎,谁叫它是基于Qt呢)。 16 | 17 | ## GParted 18 | 19 | 有图形界面的分区编辑器,非常好用,折腾 Linux 的必备神器。 20 | -------------------------------------------------------------------------------- /_sass/_back-to-top.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Back to top 3 | */ 4 | #top { 5 | position: fixed; 6 | right: 25px; 7 | bottom: 10px; 8 | width: 60px; 9 | height: 60px; 10 | background-color: #f0f0f0; 11 | border-radius:7px; 12 | opacity: 0.8; 13 | display: none; 14 | z-index: 888; 15 | } 16 | 17 | #top .arrow { 18 | margin:0 auto; 19 | padding-top:11px; 20 | width: 0; 21 | height: 0; 22 | border-right: 15px solid transparent; 23 | border-left: 15px solid transparent; 24 | border-bottom: 15px solid #c1c1c1; 25 | } 26 | 27 | #top .stick { 28 | margin: 0 auto; 29 | padding-bottom: 21px; 30 | width: 13px; 31 | border-bottom: 13px solid #f0f0f0; 32 | background-color: #c1c1c1; 33 | } -------------------------------------------------------------------------------- /_sass/_base.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Reset some basic elements 3 | */ 4 | body, h1, h2, h3, h4, h5, h6, 5 | p, blockquote, pre, hr, 6 | dl, dd, ol, ul, figure { 7 | margin: 0; 8 | padding: 0; 9 | } 10 | 11 | 12 | 13 | /** 14 | * Basic styling 15 | */ 16 | body { 17 | font-family: $base-font-family; 18 | font-size: $base-font-size; 19 | line-height: $base-line-height; 20 | font-weight: 300; 21 | color: $text-color; 22 | background-color: $background-color; 23 | -webkit-text-size-adjust: 100%; 24 | } 25 | 26 | 27 | 28 | /** 29 | * Set `margin-bottom` to maintain vertical rhythm 30 | */ 31 | h1, h2, h3, h4, h5, h6, 32 | p, blockquote, pre, 33 | ul, ol, dl, figure, 34 | %vertical-rhythm { 35 | margin-bottom: $spacing-unit / 2; 36 | } 37 | 38 | 39 | 40 | /** 41 | * Images 42 | */ 43 | img { 44 | max-width: 100%; 45 | vertical-align: middle; 46 | } 47 | 48 | 49 | 50 | /** 51 | * Figures 52 | */ 53 | figure > img { 54 | display: block; 55 | } 56 | 57 | figcaption { 58 | font-size: $small-font-size; 59 | } 60 | 61 | 62 | 63 | /** 64 | * Lists 65 | */ 66 | ul, ol { 67 | margin-left: $spacing-unit; 68 | } 69 | 70 | li { 71 | > ul, 72 | > ol { 73 | margin-bottom: 0; 74 | } 75 | } 76 | 77 | 78 | 79 | /** 80 | * Headings 81 | */ 82 | h1, h2, h3, h4, h5, h6 { 83 | font-weight: 300; 84 | } 85 | 86 | 87 | 88 | 89 | /** 90 | * Blockquotes 91 | */ 92 | blockquote { 93 | color: $grey-color; 94 | border-left: 4px solid $grey-color-light; 95 | padding-left: $spacing-unit / 2; 96 | font-size: 18px; 97 | letter-spacing: -1px; 98 | font-style: italic; 99 | 100 | > :last-child { 101 | margin-bottom: 0; 102 | } 103 | } 104 | 105 | 106 | 107 | /** 108 | * Code formatting 109 | */ 110 | pre, 111 | code { 112 | font-size: 14px; 113 | // border: 1px solid $grey-color-light; 114 | // border-radius: 3px; 115 | // background-color: #f8f8f8; 116 | } 117 | 118 | code { 119 | padding: 1px 5px; 120 | border: 1px solid $grey-color-light; 121 | border-radius: 3px; 122 | background-color: #f8f8f8; 123 | } 124 | 125 | pre > code { 126 | border: 0; 127 | // padding-right: 0; 128 | // padding-left: 0; 129 | display: block; 130 | overflow-x: auto; 131 | padding: 0.5em; 132 | color: #333; 133 | background: #f8f8f8; 134 | } 135 | 136 | /* 137 | .highlight pre code { 138 | display: block; 139 | overflow-x: auto; 140 | padding: 0.5em; 141 | color: #333; 142 | background: #f8f8f8; 143 | } 144 | */ 145 | 146 | 147 | 148 | 149 | /** 150 | * Clearfix 151 | */ 152 | %clearfix { 153 | 154 | &:after { 155 | content: ""; 156 | display: table; 157 | clear: both; 158 | } 159 | } 160 | 161 | 162 | 163 | /** 164 | * Icons 165 | */ 166 | .icon { 167 | 168 | > svg { 169 | display: inline-block; 170 | width: 16px; 171 | height: 16px; 172 | vertical-align: middle; 173 | 174 | path { 175 | fill: $grey-color; 176 | } 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /_sass/_header.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Site header 3 | */ 4 | .navbar-default { 5 | min-height: 50px; 6 | border-radius: 0px; 7 | 8 | box-shadow: 0px 1px 2px #828282; 9 | 10 | .navbar-brand { 11 | font-size: 19px; 12 | height: 50px; 13 | padding: 15px 15px; 14 | } 15 | 16 | .navbar-toggle { 17 | margin-top: 7px; 18 | margin-bottom: 5px; 19 | } 20 | } 21 | 22 | @media screen and (min-width: $on-palm) { 23 | .navbar-nav > li > a { 24 | font-size: 15px; 25 | padding: 15px 15px; 26 | } 27 | } 28 | 29 | .jumbotron { 30 | margin-top: -20px; 31 | padding-top: 56px; 32 | padding-bottom: 15px; 33 | line-height: 1.5; 34 | 35 | h1 { 36 | font-size: 55px; 37 | padding-bottom: .5em; 38 | } 39 | p { 40 | font-size: 22px; 41 | color: $grey-color; 42 | } 43 | small { 44 | font-size: 12px; 45 | color: lighten($grey-color, 20%); 46 | } 47 | 48 | .logo { 49 | font-size: 50px; 50 | font-family: Menlo,Monaco,Consolas,"Courier New",monospace; 51 | background-color: $navbar-dark; 52 | padding: 8px; 53 | border-radius: 10px; 54 | color: #fff; 55 | box-shadow: 0px 0px 4px $navbar-dark; 56 | } 57 | 58 | @include media-query($on-palm) { 59 | h1 { 60 | font-size: 36px; 61 | } 62 | .logo { 63 | font-size: 32px; 64 | } 65 | p { 66 | font-size: 15px; 67 | } 68 | } 69 | } 70 | 71 | .breadcrumb-header { 72 | min-height: 41px; 73 | margin-bottom: 19px; 74 | border-bottom: 1px solid $grey-color-medium; 75 | } 76 | 77 | .breadcrumb-header .breadcrumb { 78 | margin: 0px; 79 | padding-left: 0px; 80 | overflow: hidden; 81 | z-index: 1; 82 | background-color: transparent; 83 | border: none; 84 | width: 75%; 85 | 86 | @include media-query($on-palm) { 87 | width: 100%; 88 | } 89 | } 90 | 91 | .breadcrumb-header .searchbox { 92 | width: calc(25% - 20px); 93 | position: absolute; 94 | right: 15px; 95 | top: 7px; 96 | z-index: 2; 97 | line-height: 1; 98 | 99 | .search-icon { 100 | margin-top: 4px; 101 | margin-left: 4px; 102 | font-size: 18px; 103 | position: absolute; 104 | color: $grey-color-medium; 105 | } 106 | 107 | input[type="text"] { 108 | padding: 7px 7px 7px 23px; 109 | width: 100%; 110 | height: 27px; 111 | font-size: 13px; 112 | border: 1px solid $grey-color-medium; 113 | border-radius: 2px; 114 | 115 | &:focus { 116 | border: 1px solid $highlight-color; 117 | box-shadow: 0 0 3px $highlight-color; 118 | outline: none; 119 | } 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /_sass/_layout.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Site footer 3 | */ 4 | .site-footer { 5 | border-top: 1px solid $grey-color-light; 6 | padding: $spacing-unit 0; 7 | font-size: 15px; 8 | color: $grey-color; 9 | } 10 | 11 | .contact-list { 12 | list-style: none; 13 | margin-left: 0; 14 | } 15 | 16 | .social-media-list { 17 | list-style: none; 18 | } 19 | 20 | /** 21 | * Posts 22 | */ 23 | .list-group-item { 24 | padding: 6px 15px; 25 | } 26 | 27 | .category-header { 28 | border-bottom: 1px solid #c1c1c1; 29 | padding-bottom: .15em; 30 | a { 31 | color: $grey-color-dark; 32 | font-size: 20px; 33 | 34 | i.fa { 35 | padding-right: .4em; 36 | color: $grey-color; 37 | } 38 | } 39 | } 40 | 41 | .post-title { 42 | font-size: 36px; 43 | letter-spacing: -1px; 44 | line-height: 1.5; 45 | 46 | @include media-query($on-laptop) { 47 | font-size: 36px; 48 | } 49 | } 50 | 51 | .post-content { 52 | margin-bottom: $spacing-unit; 53 | 54 | h1, h2 { 55 | padding-bottom: $spacing-unit / 4; 56 | } 57 | 58 | h3, h4, h5, h6 { 59 | padding-bottom: $spacing-unit / 8; 60 | } 61 | 62 | h1 { 63 | font-size: 28px; 64 | border-bottom: 1px solid $grey-color-medium; 65 | } 66 | 67 | h2 { 68 | font-size: 22px; 69 | } 70 | 71 | h3 { 72 | font-size: 18px; 73 | } 74 | } 75 | 76 | .callout { 77 | padding: 20px; 78 | margin: 20px 0; 79 | border: 1px solid #eee; 80 | border-left-width: 5px; 81 | border-radius: 3px; 82 | 83 | h4 { 84 | margin-top: 0; 85 | margin-bottom: 5px; 86 | } 87 | 88 | ol, ul, dl, pre, .highlight, p { 89 | margin-bottom: 0px; 90 | } 91 | } 92 | 93 | .callout-primary { 94 | border-left-color: $primary-color; 95 | h4 { 96 | color: $primary-color; 97 | } 98 | } 99 | 100 | .callout-success { 101 | border-left-color: $success-color; 102 | h4 { 103 | color: $success-color; 104 | } 105 | } 106 | 107 | .callout-info { 108 | border-left-color: $info-color; 109 | h4 { 110 | color: $info-color; 111 | } 112 | } 113 | 114 | .callout-warning { 115 | border-left-color: $warning-color; 116 | h4 { 117 | color: $warning-color; 118 | } 119 | } 120 | 121 | .callout-danger { 122 | border-left-color: $danger-color; 123 | h4 { 124 | color: $danger-color; 125 | } 126 | } 127 | 128 | /** 129 | Others 130 | */ 131 | .btn-inverse { 132 | border-color: $navbar-dark; 133 | background-color: transparent; 134 | color: $navbar-dark; 135 | 136 | &:hover { 137 | background-color: $navbar-dark; 138 | color: white; 139 | } 140 | } 141 | 142 | .anchorjs-link { 143 | color: $grey-color; 144 | &:hover { 145 | color: $grey-color; 146 | text-decoration: none; 147 | } 148 | } 149 | 150 | .external-link { 151 | color: $grey-color; 152 | padding: 0 .3em; 153 | font-size: $small-font-size * 0.75; 154 | } 155 | 156 | .blackout { 157 | background-color: $text-color; 158 | } 159 | -------------------------------------------------------------------------------- /_sass/_sidebar-content.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * 文章目录相关 3 | */ 4 | #content { 5 | max-width: 392px; 6 | 7 | .content-text { 8 | padding: 10px 0; 9 | } 10 | 11 | .affix { 12 | position: fixed; 13 | top: 20px; 14 | } 15 | 16 | .affix-bottom { 17 | position: absolute; 18 | } 19 | } 20 | 21 | #content ul { 22 | padding-left: 0px; 23 | 24 | > li { 25 | font-size: 15px; 26 | margin-top: 1px; 27 | margin-bottom: 1px; 28 | } 29 | 30 | li a { 31 | color: $grey-color; 32 | &:hover { 33 | background-color: transparent; 34 | border-left: 1px solid $highlight-color; 35 | color: $highlight-color; 36 | } 37 | } 38 | 39 | li.active { 40 | > a { 41 | border-left: 2px solid $highlight-color; 42 | color: $highlight-color; 43 | font-weight: 700; 44 | } 45 | 46 | > ul { 47 | display: block; 48 | li { 49 | font-size: 13px; 50 | ul { 51 | display: none; 52 | } 53 | } 54 | } 55 | } 56 | 57 | li > a { 58 | padding: .2em 20px; 59 | &:hover { 60 | padding: .2em 19px; 61 | } 62 | } 63 | 64 | > li.active > a { 65 | padding: .2em 18px; 66 | } 67 | 68 | li ul { 69 | display: none; 70 | margin-left: 0; 71 | list-style: none; 72 | 73 | > li a { 74 | padding: .2em 40px; 75 | &:hover { 76 | padding: .2em 39px; 77 | text-decoration: none; 78 | } 79 | } 80 | 81 | > li.active a { 82 | padding: .2em 38px; 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /_sass/_syntax-highlighting.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Syntax highlighting styles 3 | */ 4 | .highlight { 5 | background: #fff; 6 | @extend %vertical-rhythm; 7 | 8 | .c { color: #998; font-style: italic } // Comment 9 | .err { color: #a61717; background-color: #e3d2d2 } // Error 10 | .k { font-weight: bold } // Keyword 11 | .o { font-weight: bold } // Operator 12 | .cm { color: #998; font-style: italic } // Comment.Multiline 13 | .cp { color: #999; font-weight: bold } // Comment.Preproc 14 | .c1 { color: #998; font-style: italic } // Comment.Single 15 | .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special 16 | .gd { color: #000; background-color: #fdd } // Generic.Deleted 17 | .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific 18 | .ge { font-style: italic } // Generic.Emph 19 | .gr { color: #a00 } // Generic.Error 20 | .gh { color: #999 } // Generic.Heading 21 | .gi { color: #000; background-color: #dfd } // Generic.Inserted 22 | .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific 23 | .go { color: #888 } // Generic.Output 24 | .gp { color: #555 } // Generic.Prompt 25 | .gs { font-weight: bold } // Generic.Strong 26 | .gu { color: #aaa } // Generic.Subheading 27 | .gt { color: #a00 } // Generic.Traceback 28 | .kc { font-weight: bold } // Keyword.Constant 29 | .kd { font-weight: bold } // Keyword.Declaration 30 | .kp { font-weight: bold } // Keyword.Pseudo 31 | .kr { font-weight: bold } // Keyword.Reserved 32 | .kt { color: #458; font-weight: bold } // Keyword.Type 33 | .m { color: #099 } // Literal.Number 34 | .s { color: #d14 } // Literal.String 35 | .na { color: #008080 } // Name.Attribute 36 | .nb { color: #0086B3 } // Name.Builtin 37 | .nc { color: #458; font-weight: bold } // Name.Class 38 | .no { color: #008080 } // Name.Constant 39 | .ni { color: #800080 } // Name.Entity 40 | .ne { color: #900; font-weight: bold } // Name.Exception 41 | .nf { color: #900; font-weight: bold } // Name.Function 42 | .nn { color: #555 } // Name.Namespace 43 | .nt { color: #000080 } // Name.Tag 44 | .nv { color: #008080 } // Name.Variable 45 | .ow { font-weight: bold } // Operator.Word 46 | .w { color: #bbb } // Text.Whitespace 47 | .mf { color: #099 } // Literal.Number.Float 48 | .mh { color: #099 } // Literal.Number.Hex 49 | .mi { color: #099 } // Literal.Number.Integer 50 | .mo { color: #099 } // Literal.Number.Oct 51 | .sb { color: #d14 } // Literal.String.Backtick 52 | .sc { color: #d14 } // Literal.String.Char 53 | .sd { color: #d14 } // Literal.String.Doc 54 | .s2 { color: #d14 } // Literal.String.Double 55 | .se { color: #d14 } // Literal.String.Escape 56 | .sh { color: #d14 } // Literal.String.Heredoc 57 | .si { color: #d14 } // Literal.String.Interpol 58 | .sx { color: #d14 } // Literal.String.Other 59 | .sr { color: #009926 } // Literal.String.Regex 60 | .s1 { color: #d14 } // Literal.String.Single 61 | .ss { color: #990073 } // Literal.String.Symbol 62 | .bp { color: #999 } // Name.Builtin.Pseudo 63 | .vc { color: #008080 } // Name.Variable.Class 64 | .vg { color: #008080 } // Name.Variable.Global 65 | .vi { color: #008080 } // Name.Variable.Instance 66 | .il { color: #099 } // Literal.Number.Integer.Long 67 | } 68 | -------------------------------------------------------------------------------- /back.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 博客 3 | externalurl: / 4 | --- 5 | -------------------------------------------------------------------------------- /categorites.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | comments: false 4 | permalink: /categorites/ 5 | --- 6 |
7 |
8 | 15 |
16 |
17 | 24 | 25 | {% for default in site.defaults %} 26 | {% if default.scopes.path == "" %}{% continue %}{% endif %} 27 | {% assign tag = default.scope.path %} 28 | {% assign title = default.values.category %} 29 | {% assign cate = title | downcase %} 30 | 39 | {% endfor %} 40 |
41 | 42 |
43 |
44 | -------------------------------------------------------------------------------- /css/main.scss: -------------------------------------------------------------------------------- 1 | --- 2 | # Only the main Sass file needs front matter (the dashes are enough) 3 | --- 4 | @charset "utf-8"; 5 | 6 | // Our variables 7 | $base-font-family: Helvetica, Microsoft YaHei, WenQuanYi Micro Hei, Arial, sans-serif; 8 | $base-font-size: 16px; 9 | $small-font-size: $base-font-size * 0.875; 10 | $base-line-height: 1.5; 11 | 12 | $spacing-unit: 30px; 13 | 14 | $text-color: #111; 15 | $background-color: #fdfdfd; 16 | 17 | $grey-color: #828282; 18 | $grey-color-light: lighten($grey-color, 40%); 19 | $grey-color-medium:lighten($grey-color, 30%); 20 | $grey-color-dark: darken($grey-color, 25%); 21 | 22 | // Width of the content area 23 | $on-palm: 768px; 24 | $on-laptop: 992px; 25 | $on-large-screen: 1200px; 26 | 27 | $navbar-dark: #2c3e50; 28 | $highlight-color: #18bc9c; 29 | 30 | $primary-color: #2c3e50; 31 | $success-color: #128f76; 32 | $info-color: #3498db; 33 | $warning-color: #f39c12; 34 | $danger-color: #e74c3c; 35 | 36 | @mixin media-query($device) { 37 | @media screen and (max-width: $device) { 38 | @content; 39 | } 40 | } 41 | 42 | // Import partials from `sass_dir` (defaults to `_sass`) 43 | @import 44 | "base", 45 | "layout", 46 | "header", 47 | "sidebar-content", 48 | "syntax-highlighting", 49 | "back-to-top" 50 | ; 51 | -------------------------------------------------------------------------------- /feed.xml: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | 6 | 7 | {{ site.title | xml_escape }} 8 | {{ site.description | xml_escape }} 9 | {{ site.url }}{{ site.baseurl }}/ 10 | 11 | {{ site.time | date_to_rfc822 }} 12 | {{ site.time | date_to_rfc822 }} 13 | Jekyll v{{ jekyll.version }} 14 | {% for post in site.posts %} 15 | 16 | {{ post.title | xml_escape }} 17 | {{ post.content | xml_escape }} 18 | {{ post.date | date_to_rfc822 }} 19 | {{ post.url | prepend: site.baseurl | prepend: site.url }} 20 | {{ post.url | prepend: site.baseurl | prepend: site.url }} 21 | {% for tag in post.tags %} 22 | {{ tag | xml_escape }} 23 | {% endfor %} 24 | {% for cat in post.categories %} 25 | {{ cat | xml_escape }} 26 | {% endfor %} 27 | 28 | {% endfor %} 29 | 30 | 31 | -------------------------------------------------------------------------------- /images/development/Nagasakibomb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/development/Nagasakibomb.jpg -------------------------------------------------------------------------------- /images/development/gayhub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/development/gayhub.png -------------------------------------------------------------------------------- /images/entertainment/fun/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/entertainment/fun/banner.png -------------------------------------------------------------------------------- /images/entertainment/fun/blinkenlights.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/entertainment/fun/blinkenlights.png -------------------------------------------------------------------------------- /images/entertainment/fun/cmatrix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/entertainment/fun/cmatrix.png -------------------------------------------------------------------------------- /images/entertainment/fun/cowsay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/entertainment/fun/cowsay.png -------------------------------------------------------------------------------- /images/entertainment/fun/figlet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/entertainment/fun/figlet.png -------------------------------------------------------------------------------- /images/entertainment/fun/lolcat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/entertainment/fun/lolcat.png -------------------------------------------------------------------------------- /images/entertainment/fun/sl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/entertainment/fun/sl.png -------------------------------------------------------------------------------- /images/entertainment/fun/toilet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/entertainment/fun/toilet.png -------------------------------------------------------------------------------- /images/entertainment/fun/xeyes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/entertainment/fun/xeyes.png -------------------------------------------------------------------------------- /images/novice/bluescreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/novice/bluescreen.png -------------------------------------------------------------------------------- /images/novice/ctrl-alt-delete.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/novice/ctrl-alt-delete.jpg -------------------------------------------------------------------------------- /images/novice/how-to-ask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/novice/how-to-ask.png -------------------------------------------------------------------------------- /images/toy/Raspberry_Pi_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/toy/Raspberry_Pi_2.jpg -------------------------------------------------------------------------------- /images/toy/arduino2048sketches.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/toy/arduino2048sketches.png -------------------------------------------------------------------------------- /images/work/fbx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/work/fbx.jpg -------------------------------------------------------------------------------- /images/work/latex1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/work/latex1.png -------------------------------------------------------------------------------- /images/work/sfexpress.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/upclinux/intro/563b89756137ff6e062db0cb22bd0bd62c9820b2/images/work/sfexpress.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: indexpage 3 | --- 4 |
5 |
6 |

入门指引

7 |

有些时候,你只是需要一点点提示,剩下的可以自己探索

8 |

GitHub 项目主页
9 | 最后更新: {{ site.time | date: "%Y-%m-%d" }}

10 |
11 |
12 | 13 |
14 |
15 |
16 | 17 | 18 |
19 |
20 | 21 |
22 | 23 |
24 |
25 |
26 |
27 | 28 |

FAQ

29 |
30 | 43 |
44 |
45 |
46 | 47 |
48 | 49 |
50 |
51 | 58 | 59 | {% for default in site.defaults %} 60 | {% if default.scope.path == "" %}{% continue %}{% endif %} 61 | {% assign tag = default.scope.path %} 62 | {% assign title = default.values.category %} 63 | {% assign icon = default.values.icon %} 64 | {% assign cate = title | downcase %} 65 | {% assign u = "/categorites/?c=" | prepend: site.baseurl | append: tag %} 66 |

{% if icon %}{% endif %}{{ title }}

67 |
    68 | {% for post in site.categories[cate] %} 69 | {% if post.url %} 70 |
  • 71 | {{ post.title }} 72 |
  • 73 | {% endif %} 74 | {% endfor %} 75 |
76 | {% endfor %} 77 |
78 | 79 |
80 |
81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /js/anchor.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * AnchorJS - v1.1.1 - 2015-05-23 3 | * https://github.com/bryanbraun/anchorjs 4 | * Copyright (c) 2015 Bryan Braun; Licensed MIT 5 | */ 6 | function AnchorJS(A){"use strict";this.options=A||{},this._applyRemainingDefaultOptions=function(A){this.options.icon=this.options.hasOwnProperty("icon")?A.icon:"",this.options.visible=this.options.hasOwnProperty("visible")?A.visible:"hover",this.options.placement=this.options.hasOwnProperty("placement")?A.placement:"right",this.options.class=this.options.hasOwnProperty("class")?A.class:""},this._applyRemainingDefaultOptions(A),this.add=function(A){var e,t,o,n,i,s,a,l,c,r,h,g,B,Q;if(this._applyRemainingDefaultOptions(this.options),A){if("string"!=typeof A)throw new Error("The selector provided to AnchorJS was invalid.")}else A="h1, h2, h3, h4, h5, h6";if(e=document.querySelectorAll(A),0===e.length)return!1;for(this._addBaselineStyles(),t=document.querySelectorAll("[id]"),o=[].map.call(t,function(A){return A.id}),i=0;i',B=document.createElement("div"),B.innerHTML=g,Q=B.childNodes,"always"===this.options.visible&&(Q[0].style.opacity="1"),""===this.options.icon&&(Q[0].style.fontFamily="anchorjs-icons",Q[0].style.fontStyle="normal",Q[0].style.fontVariant="normal",Q[0].style.fontWeight="normal"),"left"===this.options.placement?(Q[0].style.position="absolute",Q[0].style.marginLeft="-1em",Q[0].style.paddingRight="0.5em",e[i].insertBefore(Q[0],e[i].firstChild)):(Q[0].style.paddingLeft="0.375em",e[i].appendChild(Q[0]))}return this},this.remove=function(A){for(var e,t=document.querySelectorAll(A),o=0;o\s*?\[%\s*?callout\s*?%\]\s*?<\/p>/g, '
'); 10 | reg = /

\s*?\[%\s*?callout\s*?%\]\s*?(.*?)<\/p>/; 11 | while (style=reg.exec(text)) { 12 | text=text.replace(reg, '

'+style[1]+'

'); 13 | } 14 | 15 | reg = /

\s*?\[%\s*?callout\s+?style\s*?=\s*?["]{0,1}(.*?)["]{0,1}\s*?%\]\s*?<\/p>/; 16 | var reg2 = /

\s*?\[%\s*?callout\s+?style\s*?=\s*?["]{0,1}(.*?)["]{0,1}\s*?%\]\s*?(.*?)<\/p>/; 17 | while (style=reg.exec(text)) { 18 | text=text.replace(reg, '

'); 19 | } 20 | while (style=reg2.exec(text)) { 21 | text=text.replace(reg2, '

'+style[2]+'

'); 22 | } 23 | 24 | // endcallout 25 | text = text.replace(/

\s*?\[%\s*?endcallout\s*?%\]\s*?<\/p>/g, '

'); 26 | text = text.replace(/\s*?\[%\s*?endcallout\s*?%\]\s*?<\/p>/g, '

'); 27 | 28 | ele.innerHTML = text; 29 | })(); 30 | -------------------------------------------------------------------------------- /js/faq.js: -------------------------------------------------------------------------------- 1 | var panel_status = true; 2 | 3 | // for hidden-xs 4 | if ($('#faq-list').css("display").indexOf("none") > -1) { 5 | panel_status = false; 6 | $('#faq-list').hide(); 7 | $('#faq-panel-arrow').removeClass('fa-angle-up').addClass('fa-angle-down'); 8 | } 9 | $('#faq-list').removeClass('hidden-xs'); 10 | 11 | function update_panel() { 12 | if (panel_status) { 13 | $('#faq-panel-arrow').removeClass('fa-angle-down').addClass('fa-angle-up'); 14 | $('#faq-list').slideDown(200); 15 | } else { 16 | $('#faq-panel-arrow').removeClass('fa-angle-up').addClass('fa-angle-down'); 17 | $('#faq-list').slideUp(200); 18 | } 19 | } 20 | 21 | $('#faq-panel-heading').click(function() { 22 | panel_status = !panel_status; 23 | update_panel(); 24 | }); 25 | -------------------------------------------------------------------------------- /js/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Thanks for http://www.cnblogs.com/xufeiyang/articles/3247623.html for request 3 | Thanks for Gaohaoyang, at https://github.com/Gaohaoyang/gaohaoyang.github.io 4 | */ 5 | 6 | $.request = (function () { 7 | var apiMap = {}; 8 | function request(queryStr) { 9 | var api = {}; 10 | if (apiMap[queryStr]) { return apiMap[queryStr]; } 11 | api.queryString = (function () { 12 | var urlParams = {}; 13 | var e, 14 | d = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")); }, 15 | q = queryStr.substring(queryStr.indexOf('?') + 1), 16 | r = /([^&=]+)=?([^&]*)/g; 17 | while (e = r.exec(q)) urlParams[d(e[1])] = d(e[2]); 18 | return urlParams; 19 | })(); 20 | api.getUrl = function () { 21 | var url = queryStr.substring(0, queryStr.indexOf('?') + 1); 22 | for (var p in api.queryString) { url += p + '=' + api.queryString[p] + "&"; } 23 | if (url.lastIndexOf('&') == url.length - 1) { return url.substring(0, url.lastIndexOf('&')); } 24 | return url; 25 | } 26 | apiMap[queryStr] = api; 27 | return api; 28 | } 29 | $.extend(request, request(window.location.href)); 30 | return request; 31 | })(); 32 | 33 | $(document).ready(function() { 34 | generateContent(); 35 | backToTop(); 36 | fixTables(); 37 | //}).bind('DOMNodeInserted', function() { 38 | fixLinks(); 39 | }); 40 | 41 | /** 42 | * 回到顶部 43 | */ 44 | function backToTop() { 45 | // 滚页面才显示返回顶部 46 | $(window).scroll(function() { 47 | if ($(window).scrollTop() > 100) { 48 | $("#top").fadeIn(500); 49 | } else { 50 | $("#top").fadeOut(500); 51 | } 52 | }); 53 | // 点击回到顶部 54 | $("#top").click(function() { 55 | $("html,body").animate({ 56 | scrollTop: "0" 57 | }, 500); 58 | }); 59 | 60 | // 初始化 tip 61 | $(function() { 62 | $('[data-toggle="tooltip"]').tooltip(); 63 | }); 64 | } 65 | 66 | /** 67 | * 侧边目录 68 | */ 69 | function generateContent() { 70 | $('#markdown-toc').addClass('hidden-md').addClass('hidden-lg'); 71 | if (typeof $('#markdown-toc').html() === 'undefined') { 72 | $('#content').hide(); 73 | } else { 74 | $('#content').html(''); 75 | $('body').scrollspy({ target: '#content' }); 76 | $('#myaffix').affix({ 77 | offset: { 78 | top: function () { 79 | return $('#content').data('index') ? 80 | 370 + $('#faq').outerHeight(true) 81 | : 200; 82 | }, 83 | bottom: function () { 84 | return (this.bottom = $('footer').outerHeight(true) + 150); 85 | } 86 | } 87 | }); 88 | } 89 | } 90 | 91 | /** 92 | * 防止页面太小 93 | */ 94 | function requireFillScreen() { 95 | $('html,body').css('height','100%'); 96 | $('#main').css('height', 'auto').css('min-height', '60%'); 97 | } 98 | 99 | /** 100 | * 处理文章内表格 101 | */ 102 | function fixTables() { 103 | $('.post-content table').each(function() { 104 | if (!$(this).hasClass('table')) 105 | $(this).addClass('table table-striped table-bordered'); 106 | }); 107 | } 108 | 109 | /** 110 | * 处理页面链接 111 | */ 112 | function fixLinks() { 113 | $('a[href^="http"]').each(function() { 114 | $(this).attr('target', '_blank'); 115 | }); 116 | 117 | $('article a[href^="http"]').each(function() { 118 | var h = $(this).html(); 119 | $(this).html(h + ''); 120 | }); 121 | } 122 | -------------------------------------------------------------------------------- /js/search.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Thanks for liberize (https://github.com/liberize/liberize.github.com) 3 | */ 4 | requireFillScreen(); 5 | 6 | var entries = null; 7 | var keyword = $.request.queryString['s']; 8 | 9 | $('#keyword').text(keyword); 10 | $('#searchbox1').val(keyword); 11 | $('#searchbox2').val(keyword); 12 | $('#searchlist').hide(); 13 | 14 | $('#more_google').attr('href', 'https://www.google.com.hk/search?q=' + keyword); 15 | $('#more_gfsoso').attr('href', 'http://www.jwss.cc/?q=' + keyword); 16 | $('#more_bing').attr('href', 'https://cn.bing.com/search?q=' + keyword); 17 | $('#more_baidu').attr('href', 'https://www.baidu.com/s?wd=' + keyword); 18 | 19 | function htmlEscape(s) { 20 | return String(s).replace(/[&<>"'\/]/g, function(s) { 21 | var entityMap = { 22 | "&": "&", 23 | "<": "<", 24 | ">": ">", 25 | '"': '"', 26 | "'": ''', 27 | "/": '/' 28 | }; 29 | return entityMap[s]; 30 | }); 31 | } 32 | 33 | function findEntries(q) { 34 | var matches = []; 35 | var rq = new RegExp(q, 'im'); 36 | for (var i = 0; i < entries.length; i++) { 37 | var entry = entries[i]; 38 | var title = $(entry.getElementsByTagName('title')[0]).text(); 39 | var link = $(entry.getElementsByTagName('link')[0]).text(); 40 | var content = $(entry.getElementsByTagName('description')[0]).text(); 41 | if (rq.test(title) || rq.test(content)) { 42 | matches.push({'title': title, 'link': link, 'content': content}); 43 | } 44 | } 45 | var html = ''; 46 | for (var i = 0; i < matches.length; i++) { 47 | var match = matches[i]; 48 | html += '
  • '; 49 | html += '' + htmlEscape(match.title) + ''; 50 | html += '
  • '; 51 | } 52 | $('#searchlist').html(html); 53 | $('#searchlist').show(); 54 | } 55 | 56 | $.get('/intro/feed.xml?r=' + (Math.random() * 99999999999), function(data) { 57 | entries = data.getElementsByTagName('item'); 58 | findEntries(keyword); 59 | }); -------------------------------------------------------------------------------- /search.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | comments: false 4 | permalink: /search/ 5 | --- 6 |
    7 |
    8 | 15 |
    16 | 17 |
    18 |
      19 |
    20 |
    21 | 22 |
    23 |

    更多结果

    24 | 30 |
    31 |
    32 | 33 | -------------------------------------------------------------------------------- /static/js/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Thanks for http://www.cnblogs.com/xufeiyang/articles/3247623.html for request 3 | Thanks for Gaohaoyang, at https://github.com/Gaohaoyang/gaohaoyang.github.io 4 | */ 5 | 6 | $.request = (function () { 7 | var apiMap = {}; 8 | function request(queryStr) { 9 | var api = {}; 10 | if (apiMap[queryStr]) { return apiMap[queryStr]; } 11 | api.queryString = (function () { 12 | var urlParams = {}; 13 | var e, 14 | d = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")); }, 15 | q = queryStr.substring(queryStr.indexOf('?') + 1), 16 | r = /([^&=]+)=?([^&]*)/g; 17 | while (e = r.exec(q)) urlParams[d(e[1])] = d(e[2]); 18 | return urlParams; 19 | })(); 20 | api.getUrl = function () { 21 | var url = queryStr.substring(0, queryStr.indexOf('?') + 1); 22 | for (var p in api.queryString) { url += p + '=' + api.queryString[p] + "&"; } 23 | if (url.lastIndexOf('&') == url.length - 1) { return url.substring(0, url.lastIndexOf('&')); } 24 | return url; 25 | } 26 | apiMap[queryStr] = api; 27 | return api; 28 | } 29 | $.extend(request, request(window.location.href)); 30 | return request; 31 | })(); 32 | 33 | $(document).ready(function() { 34 | generateContent(); 35 | categoryDisplay(); 36 | backToTop(); 37 | fixTables(); 38 | }).bind('DOMNodeInserted', function() { 39 | fixLinks(); 40 | }); 41 | 42 | /** 43 | * 分类展示 44 | * 点击右侧的分类展示时 45 | * 左侧的相关裂变展开或者收起 46 | * @return {[type]} [description] 47 | */ 48 | function categoryDisplay() { 49 | /*show category when click categories list*/ 50 | $('.item').click(function() { 51 | var cate = $(this).data('cate'); //get category's name 52 | 53 | $('.post-list[data-list-cate!=' + cate + ']').hide(250); 54 | $('.post-list[data-list-cate=' + cate + ']').show(400); 55 | 56 | $('#categorization').text(cate); 57 | }); 58 | 59 | var s=$.request.queryString['c']; 60 | if (s) { 61 | $('.item[data-cate='+s+']').click(); 62 | } 63 | } 64 | 65 | /** 66 | * 回到顶部 67 | */ 68 | function backToTop() { 69 | // 滚页面才显示返回顶部 70 | $(window).scroll(function() { 71 | if ($(window).scrollTop() > 100) { 72 | $("#top").fadeIn(500); 73 | } else { 74 | $("#top").fadeOut(500); 75 | } 76 | }); 77 | // 点击回到顶部 78 | $("#top").click(function() { 79 | $("html,body").animate({ 80 | scrollTop: "0" 81 | }, 500); 82 | }); 83 | 84 | // 初始化 tip 85 | $(function() { 86 | $('[data-toggle="tooltip"]').tooltip(); 87 | }); 88 | } 89 | 90 | /** 91 | * 侧边目录 92 | */ 93 | function generateContent() { 94 | $('#markdown-toc').addClass('hidden-md').addClass('hidden-lg'); 95 | if (typeof $('#markdown-toc').html() === 'undefined') { 96 | $('#content').hide(); 97 | } else { 98 | $('#content').html(''); 99 | $('body').scrollspy({ target: '#content' }) 100 | $('#myaffix').affix({ 101 | offset: { 102 | top: 250, 103 | bottom: function () { 104 | return (this.bottom = $('footer').outerHeight(true) + $('#disqus_thread').outerHeight(true) + 150); 105 | } 106 | } 107 | }); 108 | } 109 | } 110 | 111 | /** 112 | * 处理文章内表格 113 | */ 114 | function fixTables() { 115 | $('.post-content table').each(function() { 116 | if (!$(this).hasClass('table')) 117 | $(this).addClass('table table-striped table-bordered'); 118 | }); 119 | } 120 | 121 | /** 122 | * 处理页面链接 123 | */ 124 | function fixLinks() { 125 | $('a[href^="http"]').each(function() { 126 | $(this).attr('target', '_blank'); 127 | }); 128 | } 129 | -------------------------------------------------------------------------------- /static/js/search.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Thanks for liberize (https://github.com/liberize/liberize.github.com) 3 | */ 4 | 5 | var entries = null; 6 | var keyword = $.request.queryString['s']; 7 | 8 | $('#keyword').val(keyword); 9 | $('#keyword2').val(keyword); 10 | $('#keywordlabel').text(keyword); 11 | 12 | function htmlEscape(s) { 13 | return String(s).replace(/[&<>"'\/]/g, function(s) { 14 | var entityMap = { 15 | "&": "&", 16 | "<": "<", 17 | ">": ">", 18 | '"': '"', 19 | "'": ''', 20 | "/": '/' 21 | }; 22 | return entityMap[s]; 23 | }); 24 | } 25 | 26 | function formatDate(date) { 27 | var matches = date.match(/(\d{1,2}) ([A-Za-z]{3}) (\d{4})/); 28 | return matches[2] + ' ' + matches[1] + ', ' + matches[3]; 29 | } 30 | 31 | function findEntries(q) { 32 | var matches = []; 33 | var rq = new RegExp(q, 'im'); 34 | for (var i = 0; i < entries.length; i++) { 35 | var entry = entries[i]; 36 | var title = $(entry.getElementsByTagName('title')[0]).text(); 37 | var link = $(entry.getElementsByTagName('link')[0]).text(); 38 | var content = $(entry.getElementsByTagName('description')[0]).text(); 39 | if (rq.test(title) || rq.test(content)) { 40 | var updated = formatDate($(entry.getElementsByTagName('pubDate')[0]).text()); 41 | matches.push({'title': title, 'link': link, 'date': updated, 'content': content}); 42 | } 43 | } 44 | var html = ''; 45 | for (var i = 0; i < matches.length; i++) { 46 | var match = matches[i]; 47 | html += '
  • '; 48 | html += '' + match.date + ''; 49 | html += '

    ' + htmlEscape(match.title) + '

    '; 50 | html += '
  • '; 51 | } 52 | $('#searchlist').html(html); 53 | $('#searchlist').show(); 54 | } 55 | 56 | $.get('/feed.xml?r=' + (Math.random() * 99999999999), function(data) { 57 | entries = data.getElementsByTagName('item'); 58 | findEntries(keyword); 59 | }); -------------------------------------------------------------------------------- /static/js/share.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | var shareurl = encodeURIComponent(window.location.href); 3 | var title = encodeURIComponent($('#post-title').text()); 4 | $('.share').tooltip({ container : 'body'}); 5 | $('.share').each(function () { 6 | $(this).bind('click', $(this).data('target'), function(e) { 7 | var url; 8 | switch (e.data) { 9 | case 'twitter': 10 | url='https://twitter.com/intent/tweet?text=' + title + '%20' + shareurl; 11 | break; 12 | case 'facebook': 13 | url='https://www.facebook.com/sharer/sharer.php?u=' + shareurl + '&t=' + title; 14 | break; 15 | case 'linkedin': 16 | url='https://www.linkedin.com/shareArticle?source=&title=' + title + '&summary=&mini=true&url=' + shareurl; 17 | break; 18 | case 'weibo': 19 | url='http://service.weibo.com/share/share.php?url=' + shareurl + '&title=' + title; 20 | break; 21 | case 'copyurl': 22 | if (window.clipboardData) { 23 | window.clipboardData.setData("Text", window.location.href); 24 | } else { 25 | window.prompt('You are not using IE so you need to copy it yourself.', window.location.href); 26 | } 27 | return; 28 | default: 29 | return; 30 | } 31 | window.open(url); 32 | }); 33 | }); 34 | }); --------------------------------------------------------------------------------