<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/rss.xsl" type="text/xsl"?>
<rss version="2.0">
  <channel>
    <title>IT瘾programming推荐</title>
    <link>https://itindex.net/tags/programming</link>
    <description>IT社区推荐资讯 - ITIndex.net</description>
    <language>zh</language>
    <copyright>https://itindex.net/</copyright>
    <generator>https://itindex.net/</generator>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>https://itindex.net/images/logo.gif</url>
      <title>IT社区推荐资讯 - ITIndex.net</title>
      <link>https://itindex.net/tags/programming</link>
    </image>
    <item>
      <title>编程所需要的东西</title>
      <link>https://itindex.net/detail/61709-%E7%BC%96%E7%A8%8B-%E9%9C%80%E8%A6%81-%E4%B8%9C%E8%A5%BF</link>
      <description>&lt;h2&gt;前言&lt;/h2&gt;
 &lt;p&gt;本文试图通过介绍编程工作中的部分技能和知识，帮助新进入程序员职业的朋友熟悉未来的工作。特别的，本文将额外提供以Java编程语言下的Spring框架开发Web应用后端逻辑的工作相关的介绍。&lt;/p&gt;
 &lt;p&gt;因本文实在冗长，建议你结合目录挑选自己感兴趣的部分阅读。如果你想通过文本做跳板寻找优质学习资源，希望附录部分我精心挑选的网站和书籍推荐让你满意。&lt;/p&gt;
 &lt;p&gt;对读者的要求：打算把程序员作为职业，还尚未入行的朋友。&lt;/p&gt;
 &lt;h2&gt;工具&lt;/h2&gt;
 &lt;h3&gt;IDE与文本编辑器&lt;/h3&gt;
 &lt;p&gt;文件格式分两种，人能读懂的文本文件，和机器能读懂的二进制文件。源代码是文本文件。&lt;/p&gt;
 &lt;p&gt;编程其实是在用文本编辑器（Text Editor）修改一个个文本文件（源代码文件）的内容，就像你用Windows记事本打开txt文件敲一些文字一样。理论上你可以用记事本写源码，实际上，有一些电脑达人们喜欢用Linux下的  &lt;a href="https://www.vim.org"&gt;Vim&lt;/a&gt;和  &lt;a href="https://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;写源码，它们相当原始，但若用好快捷键与定制功能，它们会变得非常强大。&lt;/p&gt;
 &lt;p&gt;虽然可以，但是你往往不想用记事本写代码，因为它们不是“专业写代码”的工具软件，用起来不顺手。你需要的是专业帮手——IDE。IDE全称  &lt;a href="https://baike.baidu.com/item/%E9%9B%86%E6%88%90%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/298524"&gt;集成开发环境（Integrated Development Environment）&lt;/a&gt;，是用于提供程序开发环境的应用程序，包括代码编辑器、编译器、调试器等工具，集成了代码编写、语法分析、编译、调试等额外功能。IDE本质上是一个挂载了许多协助编程的额外功能的文本编辑器。&lt;/p&gt;
 &lt;p&gt;一款，你只需要选择并熟练使用一款文本编辑器，你便有了编写源代码的趁手工具。无所谓它是否属于IDE，自己喜欢就好，因为那些编译调试之类的工具大可以在文本编辑器外单独使用。不同文本编辑器的基本功能（即文本编辑功能）大同小异，我们在意的是附加的功能（或丰富的插件市场）、以及完备的快捷键集合（快捷键对程序员来说很重要，可以让我们手不离开键盘完成代码编写，时不时抓鼠标会减慢速度且打断思路）。&lt;/p&gt;
 &lt;p&gt;我目前用了三款文本编辑器以适应不同需求。下面我给出一些我知晓的文本编辑器供你浏览，你也可以自行搜索&amp;quot;editor for programming&amp;quot;：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;a href="https://www.vim.org"&gt;Vim&lt;/a&gt;和   &lt;a href="https://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; 这两个文本编辑器很特殊，你可能会在任意一款热门编辑器上看到这两个编辑器的快捷键替换插件。它们的狂热用户们（也同样是业内的老前辈、扛把子们）不愿意因切换文本编辑器而学习新的快捷键，因为快捷键已经变成了某种肌肉记忆，很难改变。这时你应该注意到了，快捷键是某种门派一样的东西，同时学两套快捷键会形成冲突，你只能选一套并把它变成肌肉记忆。快捷键会伴你整个职业生涯，因此慎重选择你的文本编辑器（或者直接学这两款文本编辑器之一的快捷键）。&lt;/li&gt;
&lt;/ul&gt;
 &lt;ol&gt;
  &lt;li&gt;
   &lt;p&gt;轻量级：&lt;/p&gt;
   &lt;ul&gt;
    &lt;li&gt;
     &lt;p&gt;      &lt;a href="https://notepad-plus-plus.org"&gt;Notepad++&lt;/a&gt; 它有一些用户插件来提供额外功能。因为它的启动速度很快，我用它作为最轻量级的文本编辑器，用来临时记录或粘贴一些文本。&lt;/p&gt;
&lt;/li&gt;
    &lt;li&gt;
     &lt;p&gt;      &lt;a href="https://www.sublimetext.com/"&gt;Sublime Text&lt;/a&gt; 大概是和notepad++并列的一款轻量级文本编辑器，我没用过，我有一个朋友把它作为轻量编辑器使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;中量级：&lt;/p&gt;
   &lt;ul&gt;
    &lt;li&gt;
     &lt;p&gt;      &lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt; 简称vscode，中量级的全能文本编辑器（全能指什么编程语言都支持），有丰富的插件市场，你可以把它改造成编写任何编程语言的IDE。我最近发现自己修改格式化的配置文本文件的频率变高了，因此选择了它作为中量级的编辑器，用它阅读与修改markdown（现在正在用它写这篇文章）、json、toml、yaml等格式的文件。事实上许多前端开发者使用vscode作为编写经典前端代码（HTML+CSS+JavaScript）的IDE。&lt;/p&gt;
&lt;/li&gt;
    &lt;li&gt;
     &lt;p&gt;      &lt;a href="https://atom.io"&gt;Atom&lt;/a&gt; 大概是与vscode相对的中量级编辑器，还是我的那个朋友会用它，我个人并不了解，姑且列出来。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;重量级（IDE）：&lt;/p&gt;
   &lt;ul&gt;
    &lt;li&gt;
     &lt;p&gt;      &lt;a href="https://visualstudio.microsoft.com/"&gt;Visual Studio&lt;/a&gt; 微软出品，商业产品，被戏称为宇宙第一IDE（但我没搜到原因）。据我所知可以编写.Net、C、C#、C++、Python、Android语言。体积超级大，启动超级慢，用起来…我感觉不到好在哪里，可能我没有深度使用。有插件市场。当你看到安装界面中各种数据分析、机器学习等高大上的可选项时，你会感受到这IDE真的体现了微软一如既往的商业又专业的味道。&lt;/p&gt;
&lt;/li&gt;
    &lt;li&gt;
     &lt;p&gt;      &lt;a href="https://www.jetbrains.com/"&gt;JetBrains IDEs&lt;/a&gt; JetBrains是一家公司，它旗下有诸多用于编写不同语言程序的IDE：IntelliJ IDEA，GoLand，PyCharm，WebStorm，RubyMine…用来编写Java、Go、Python、JavaScript、Ruby等主流编程语言。这些IDE基本共用一套快捷键。有插件市场。我是JetBrains的忠实用户，因为我感觉JetBrains的IDE开发者们懂得开发者需要什么，产品中的小细节和功能体现着人性化的用心。我用JetBrains IDEs作为重量级编辑器，因为它们启动要好一会。我还选择了JetBrain IDEs快捷键“门派”，还在vscode上安装了&amp;quot;IntelliJ IDEA Keybindings&amp;quot;插件。&lt;/p&gt;
&lt;/li&gt;
    &lt;li&gt;
     &lt;p&gt;      &lt;a href="https://www.eclipse.org/eclipseide/"&gt;Eclipse IDE&lt;/a&gt; 开源的多编程语言IDE，有插件市场。因为它是开源的，有不少商业第三方定制化IDE都是基于它改造的。我在大学时一直用它编写Java和C++，真的很不错，直到我在实习时试着换了IntelliJ IDEA，之后再也没启动过它。&lt;/p&gt;
&lt;/li&gt;
    &lt;li&gt;
     &lt;p&gt;      &lt;a href="https://developer.android.com/studio/install"&gt;Android Studio&lt;/a&gt; 谷歌出品，看名字就知道是编写安卓系统应用程序的IDE。我用过一点，只知道它因为时不时要连接谷歌的网站更新索引之类的什么东西，在国内想用它要配置好离线依赖。另外关于它有许多meme损它启动慢吃内存多，比如：我是安卓工程师，我每天早晨来公司先启动Android Studio，然后把咖啡壶放在机箱上煮咖啡，等我喝完整壶咖啡，我就可以开始工作了。&lt;/p&gt;
&lt;/li&gt;
    &lt;li&gt;
     &lt;p&gt;      &lt;a href="https://developer.apple.com/cn/xcode/ide/"&gt;Xcode&lt;/a&gt; 这是苹果公司推出的编写苹果各产品上的应用（现在苹果产品有了共用芯片，只需编译出一种应用）的IDE，我没有用过，也没有用它的苹果开发者朋友，所以我不知道它怎么样。按照苹果一贯的风格，也许这个IDE很顺滑，搜了下也没找到太多说xcode本身不好用的抱怨。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
 &lt;h4&gt;Java IDE&lt;/h4&gt;
 &lt;p&gt;主流Java IDE有两款，  &lt;a href="https://www.eclipse.org/eclipseide/"&gt;Eclipse IDE&lt;/a&gt;和  &lt;a href="https://www.jetbrains.com/idea/"&gt;JetBrains IntelliJ IDEA&lt;/a&gt;，而且从2018年开始，  &lt;a href="https://visualstudio.microsoft.com/"&gt;Visual Studio&lt;/a&gt;也能够（通过连接vscode）支持Java了。从上文你可以看出，我是属于IDEA派的。&lt;/p&gt;
 &lt;p&gt;在我看来，Eclipse比不过IntelliJ IDEA的关键不在功能上，它快捷键和插件市场都很完备，甚至因为是开源的，所以你可以把它DIY成符合自己习惯的专属IDE。但它败也败在开源上：没有漂亮又符合人机交互理念的界面（这需要专业的UI设计师参与，而开源项目成员中往往只有程序员）；默认配置较不合适（可定制化和开箱即用不冲突，但需要认真琢磨出厂默认配置）…细节，它败在了细节上，“The devil is in the detail”。&lt;/p&gt;
 &lt;p&gt;截至撰文我已经快三年没有用过Eclipse了，因此不了解它的近况，也许你可以给它一个机会，试用一下？还有宇宙第一IDE…也可以试一下，我猜配置会很麻烦。&lt;/p&gt;
 &lt;p&gt;另外，如果你选择使用IDEA，IDEA从2016年开始内置了一个学习快捷键的插件Learn，可以看  &lt;a href="https://blog.jetbrains.com/idea/2016/12/ide-features-trainer/"&gt;这篇官方介绍&lt;/a&gt;学习如何使用。&lt;/p&gt;
 &lt;h3&gt;浏览器、搜索引擎与搜索思维&lt;/h3&gt;
 &lt;h4&gt;浏览器&lt;/h4&gt;
 &lt;p&gt;你在用火狐（FireFox）浏览器吗？建议从Mozilla官网（https://www.mozilla.org/zh-CN/firefox/new/ ）下载，而非北京谋智火狐信息技术有限公司的网站（http://www.firefox.com.cn/ ），这两个的区别可以看  &lt;a href="https://zhuanlan.zhihu.com/p/138034888"&gt;此文章&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;你必然已会使用浏览器和搜索引擎，我在此补充几个浏览器的别样用法，也许可以帮助你更好的使用浏览器：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;p&gt;给PDF阅读材料加书签。现代浏览器内置了PDF阅读器，配合创建用读书笔记作为标题的书签，你可以为本地硬盘上的某个PDF格式的电子书建立自己的书签目录，方便以后连同互联网书签一同查阅。（遗留问题：那个PDF文件不方便随意更换位置，因为浏览器书签的地址是文件系统的路径）&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;插件市场。主流浏览器都有自己的插件市场，你可以用插件让上网体验更好。值得一提的是    &lt;a href="https://www.tampermonkey.net/"&gt;Tampermonkey&lt;/a&gt;插件，它是JavaScript脚本管理器，有自己的脚本市场。你可以把脚本理解为轻量的插件，毕竟在浏览器中就是Js脚本在操作页面。通过Tampermonkey，你可以向某个网页中添加额外的脚本来实现额外功能，而浏览器插件可以为浏览器本身添加额外功能。&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;书签功能。主流浏览器支持同时打开一个书签目录下的所有书签，这样你可以用一个目录来代表一个工作环境，需要时一键开启所有Tab。&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;浏览器快捷键。页面内查找，Tab左右切换显示，将光标置入搜索栏、切换搜索所使用的搜索引擎…&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;搜索栏。主流浏览器的搜索栏可以同时搜索书签和历史记录或使用搜索引擎。&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;历史记录。历史记录很重要，虽然它会泄露隐私，但我从不清理它。只要有历史记录，我就能搜到曾经浏览过的网页，节省了重新搜索的时间。（如果我想进行隐私上网，我会打开虚拟机中的Tor浏览器…）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;h4&gt;搜索引擎&lt;/h4&gt;
 &lt;p&gt;为什么我不使用百度？有几个原因，仅就编程方面的搜索来说，使用百度会搜索到大量  &lt;a href="https://baike.baidu.com/item/%E5%86%85%E5%AE%B9%E5%86%9C%E5%9C%BA/6651503"&gt;内容农场&lt;/a&gt;网站，浪费时间却找不到有用的信息。&lt;/p&gt;
 &lt;p&gt;我使用微软的Bing（   &lt;a href="https://cn.bing.com/"&gt;https://cn.bing.com/&lt;/a&gt; 这是国内特供版网址，Bing的通常网址是   &lt;a href="https://www.bing.com/"&gt;https://www.bing.com/&lt;/a&gt; ，猜测微软是根据GeoIP来判断该重定向到哪一个网址）。Bing搜索引擎  &lt;a href="https://help.bing.microsoft.com/apex/index/18/en-US/10002"&gt;有一些简单的高级搜索语法&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;另外Bing有两个版面：国内版和国际版，你可以简单理解为国内版搜索结果中的中文结果优先，而国际版是其他语言的结果优先。你可以轻松切换两个版面来实现同时搜索一个关键字的中文和英文搜索结果。就编程方面的搜索来说，你不能肯定一个问题在  &lt;a href="https://www.csdn.net/"&gt;CSDN&lt;/a&gt;或  &lt;a href="https://www.cnblogs.com/"&gt;博客园&lt;/a&gt;上没人写过踩坑文章，也不能肯定  &lt;a href="https://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt;上必然有现成的回答。既然我们会中文和英文两种语言，就应该利用这种优势，同时使用两种语言搜索同一个问题（用中文关键字搜中文结果，vice versa），这样找到答案的概率会更高。&lt;/p&gt;
 &lt;p&gt;用Bing搜索中文编程内容能逃避内容农场吗？不完全能。但是因为百度和Bing是两个公司单独计算网页排名，而刷排名的坏东西的目标一般是百度排名，因此Bing比百度的情况好一些。事实上不止中文搜索结果有内容农场这个坏现象，几乎所有语言的搜索结果都有，这需要搜索引擎公司们自己想办法反制。&lt;/p&gt;
 &lt;h4&gt;搜索思想&lt;/h4&gt;
 &lt;p&gt;记得把使用搜索引擎查找互联网内容的思想迁移到各个使用场景上。想找存在电脑上的文件？Windows系统可以按一下Win键打开搜索栏。想在网页内找关键字？使用浏览器的网页内搜索。想在文本编辑器里搜索本文件中的内容？文件内搜索。在IDE里搜索整个项目目录的内容？项目内搜索。&lt;/p&gt;
 &lt;p&gt;小提示，本文中所有超链接标注的名词都可以作为搜索关键字，我只是每个名词搜了一个质量差不多的网页附上链接…多花点时间应该能搜到质量更好的。&lt;/p&gt;
 &lt;p&gt;搜索的最大目的始终不变：节约寻找答案的时间，因为寻找答案过程本身没有产出。&lt;/p&gt;
 &lt;h2&gt;编程语言&lt;/h2&gt;
 &lt;blockquote&gt;
  &lt;p&gt;文本命令：“老王 吃 苹果” -&amp;gt; 执行动作：老王在客厅桌子上找到一个苹果，吃掉。&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;编程分为两个部分，人编写文本格式的  &lt;a href="https://baike.baidu.com/item/%E6%BA%90%E4%BB%A3%E7%A0%81/3969"&gt;源代码&lt;/a&gt;，编译器|解释器（下面统一使用编译器做指代，即使实际上是解释器）负责将源码编译成机器能看懂的  &lt;a href="https://baike.baidu.com/item/%E6%8C%87%E4%BB%A4%E9%9B%86/238130"&gt;指令&lt;/a&gt;。你可以为任何有结构的文本编写一个编译器，文本就是命令的内容，简单说明了要做什么事，编译器按着文本写出详细指令，计算机按着详细指令做事。举个例子：打仗，司令部传达过来的命令很简单，然后战场上的指挥官会以一两行命令为大纲来拟定详细的计划，士兵们可以按照详细计划行动。&lt;/p&gt;
 &lt;p&gt;编译器和战场指挥官一样，帮你补足你在源码中没有提到的细节。注意看上文那句老王吃苹果，源码里没有提到老王在吃苹果前需要找到苹果，也没提到如何找苹果，但最后执行的动作中是存在找苹果的步骤的。这引出了目前主流的两类  &lt;a href="https://baike.baidu.com/item/%E7%BC%96%E7%A8%8B%E8%8C%83%E5%9E%8B/1475451"&gt;编程范式&lt;/a&gt;：命令式（imperative）和声明式（declarative），按命令式编程设计的编程语言需要指明执行的细节，比较唠叨，而声明式只需要指定要做什么事，细节由编译器补足。事实上现代语言都混合了不同的编程范式，更加灵活。上面老王吃苹果的例子是偏向于声明式的。&lt;/p&gt;
 &lt;p&gt;依我看，编译器越“聪明”，越懂得从寥寥数行源代码里猜测程序员的意图并产生出程序（如JavaScript，尽一切努力不报编译错误，即使会输出很离谱的结果）；反之，编译器越“木头脑袋”，越要求源代码“符合语法语义规则”，源代码越冗长（Java，说的就是你）。要么人写源码多费功夫，要么编译器编译源码多费功夫，仅此而已。编译这门手艺的术语叫  &lt;a href="https://baike.baidu.com/item/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/4194"&gt;编译原理&lt;/a&gt;。如果你有一个无限智能的编译器，就可以用自然语言即中文英文等，去指挥计算机做事。可惜，编译器是有极限的，语言越复杂，编译器所要做的工作越多，人就越难去编写这个编译器（编译器是个特殊的程序，终究还是要人来写），最后我们折衷得到了目前这些编程语言和对应的编译器。&lt;/p&gt;
 &lt;p&gt;不同编程语言适合做不同的事，就像木匠工具箱里不同工具用来做不同的工作，没有高下之分，也没必要搞工具崇拜。因为有些编程语言底层设计特性是相互冲突的，而且现在已有这么多用得好好的不同语言编写的程序支撑着我们的世界，所以从设计理论和改造成本上看永远不会有一个全能的编程语言可以代替所有语言。顺带一提，每个编程语言的命令表达能力都是相等的，因为它们都是  &lt;a href="https://www.zhihu.com/question/20115374"&gt;图灵完备&lt;/a&gt;的，所以“一个语言可以代替另一个语言完成某个具体工作”这种论断是正确的，只是用不同语言间写源码完成相同的某功能花的力气可能差个几倍几十倍都有可能。&lt;/p&gt;
 &lt;p&gt;编程语言本身，和编程语言下的框架、第三方库，只是工具而已。它们一般有个说明书教你如何使用，你可以在网上搜索（官方教程或注释生成的API文档）。有时你能在IDE里看它们源码的注释，注释也会详细地解释这个代码要做什么，就不用搜索了。事实上，在商业编程刚刚起步时，每个程序员手边都有一本关于所用编程语言提供的库API与语法的手册，他们要像查字典一样使用这本工具书，因为那个时候没有互联网，没有在线文档。不要过多花时间在了解工具的使用上（通读文档，试图记住所有库API，类似背诵字典），有需要就用关键字去搜索，越用越熟，就能记住了。&lt;/p&gt;
 &lt;h3&gt;学一门编程语言&lt;/h3&gt;
 &lt;p&gt;自然语言有听说读写四个技能要求，编程语言是书面语言，学习一门编程语言仅要求读写两个方面，另外额外多一个：&lt;/p&gt;
 &lt;ol&gt;
  &lt;li&gt;学习它的编程思想、语法和关键字，即读法写法。&lt;/li&gt;
  &lt;li&gt;知道语言的原生库提供了哪些API（帮你省事的现成的功能），知道如何使用或去哪查如何使用这些API（小提示：库代码的注释，网上的在线文档，或教程）。&lt;/li&gt;
&lt;/ol&gt;
 &lt;p&gt;推荐一个入门图书系列——  &lt;a href="https://baike.baidu.com/item/Head%20First/13972734"&gt;Head First&lt;/a&gt;。由 O’Relly 出版社发行的一系列教育书籍，它强调以特殊的方式排版，由大量的图片和有趣的内容组合构成，而达到非疲劳的沉浸式学习效果。我读过它的  &lt;a href="https://book.douban.com/subject/2243615/"&gt;设计模式&lt;/a&gt;书，很有趣。&lt;/p&gt;
 &lt;p&gt;还有几个在线中文教程网站：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://www.ruanyifeng.com/blog/archives.html"&gt;阮一峰的网络日志&lt;/a&gt;，    &lt;a href="https://www.liaoxuefeng.com/"&gt;廖雪峰的官方网站&lt;/a&gt; 这两位为中文互联网提供了大量易懂的入门级IT方面的教程，如果你想通过中文教程了解一个新东西，可以先在搜索栏前面输上&amp;quot;阮一峰&amp;quot; “廖雪峰”+新东西关键词，看他俩有没有写过。&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://www.runoob.com/"&gt;菜鸟教程&lt;/a&gt; 特别的，如果你想通过中文教程学习某种编程语言|工具，并快速写出能跑的程序|运行环境，建议阅读这个网站上的教程，这上面基本涵盖了所有常用的编程语言和工具的快速入门教程。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;h4&gt;Java编程语言&lt;/h4&gt;
 &lt;p&gt;Java中规中矩，有一套严格的语法规则。通过学习复杂的语法规则，新手可以了解编程语言的一些共性，我还是比较推荐新手通过Java了解面向对象编程的。最近几年Java想要变年轻，迭代变快了（半年一个新版本），也  &lt;a href="https://dzone.com/articles/a-guide-to-java-versions-and-features"&gt;引入了不少其他语言中好用的特性&lt;/a&gt;。你可以把它理解为保守谨慎的，只会在一个特性被其他语言实践验证后才考虑引入。但是  &lt;a href="https://www.zhihu.com/question/360985479"&gt;业内不少公司都停留在了Java8&lt;/a&gt;，主要是公司们不想还遗产代码的债。&lt;/p&gt;
 &lt;p&gt;如果你工作项目使用的是Java8，推荐你了解一下Java8引入的  &lt;a href="https://www.w3cschool.cn/java/java-stream-api.html"&gt;Stream API&lt;/a&gt;。如果你需要Java语言的工具书，建议使用  &lt;a href="https://book.douban.com/subject/26880667/"&gt;Java核心技术&lt;/a&gt;，上下两卷两本大厚书，你也可以通过通读它来学习Java。&lt;/p&gt;
 &lt;h3&gt;第三方库&lt;/h3&gt;
 &lt;p&gt;在现代，没有任何编程项目是从零开始的。每个编程语言都有自己的第三方库仓库（repository），比如Python的  &lt;a href="https://pypi.org/"&gt;pypi&lt;/a&gt;，Java的  &lt;a href="https://mvnrepository.com"&gt;Maven Repository&lt;/a&gt;等。有些公司为了保证项目所使用的第三方库的稳定，会建立并维护内部的仓库。库（library）或者叫包（package），就是别人写好的功能。你可以把库从在线的仓库下载到本地，就不需要自己编写了对应的功能了。这算盗窃吗？事实上，每个库（每个开源软件项目，库属于一种特殊的专门给程序员用的项目）都有  &lt;a href="https://zhuanlan.zhihu.com/p/322438947"&gt;许可证&lt;/a&gt;，许可证是一个声明，它规定了该库可在什么情况下使用，比如有些许可证就禁止商业使用。&lt;/p&gt;
 &lt;h4&gt;框架&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="https://baike.baidu.com/item/%E8%BD%AF%E4%BB%B6%E6%A1%86%E6%9E%B6/1471931"&gt;框架（framework）&lt;/a&gt;是一种特殊的项目，顾名思义，它提供了编写某类程序的大致框架。当你自己动手写练手的项目，你会发现写项目最难的在于如何组织各个组件间的关系，我该把这个文件放在哪个目录？我该把这段逻辑放在哪个组件？谁调用谁？选择一款框架，了解它关于组织组件的建议，你便只需专注你的功能。&lt;/p&gt;
 &lt;h4&gt;架构&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="https://zhuanlan.zhihu.com/p/86052051"&gt;架构（architecture）与框架的联系与区别&lt;/a&gt;，  &lt;a href="https://zhuanlan.zhihu.com/p/3455520"&gt;微服务架构&lt;/a&gt;和单体架构。如果想了解更多，请自行搜索。&lt;/p&gt;
 &lt;h5&gt;Java下的Spring框架&lt;/h5&gt;
 &lt;p&gt;“  &lt;a href="https://baike.baidu.com/item/spring/85061"&gt;Spring框架&lt;/a&gt;（  &lt;a href="https://spring.io/"&gt;官方网站&lt;/a&gt;）是最受欢迎的企业级 Java 应用程序开发框架。” 听听，它可没吹牛。目前Spring已经发展成了完整的生态（我不喜欢这个词，它代表封闭，但Spring是很开放的），绝大部分新的Java应用项目选择Spring生态作为基础框架是相当自然的事。&lt;/p&gt;
 &lt;p&gt;使用Spring对程序员编程有很多实际的好处，不仅是企业级的那些什么可伸缩之类的高大上特点：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;Spring有完备的基础功能，可以让你只写几行代码就配置好一个复杂的功能，如果不用Spring，也许需要一整天去下载配置相同功能的库或其他外部系统。&lt;/li&gt;
  &lt;li&gt;Spring开箱即用，简化了项目配置的过程（配置真是一个消磨精力的事）。&lt;/li&gt;
  &lt;li&gt;Spring统一了Java业界的标准，你会发现各种项目和库都支持对Spring的兼容，不需要你来单独做兼容了。&lt;/li&gt;
  &lt;li&gt;Spring对原本代码的侵入相当少。&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;Spring增加了学习成本。我已经见过好几个人，当他们听到除了学Java还要学Spring时，眉头突然皱起来了…但是…总要多学一些工作中会用到的常用库，只是Spring稍微有点大，稍微。而且你这样想，学了Spring，就能享受上面提到的大量好处，很值。最低限度的学习，只需要了解Spring配置文件和Spring MVC的注解就行了。&lt;/p&gt;
 &lt;h4&gt;工具库&lt;/h4&gt;
 &lt;p&gt;按照我的分类，工具库通过API提供对象处理功能，你可以像使用语言本身的原生库API一样使用这些工具库。举个例子，因为Web应用的普及，每个语言都会遇到对  &lt;a href="https://baike.baidu.com/item/JSON/2462549"&gt;Json格式&lt;/a&gt;文本的解析、映射等操作的功能需求。比如Java语言没有在其原生库中提供这些Json格式数据的操作，于是Java社区中应需求出现了好几个Json处理工具库。&lt;/p&gt;
 &lt;h5&gt;Java常用的工具库&lt;/h5&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;p&gt;Json处理：    &lt;a href="https://github.com/FasterXML/jackson"&gt;Jackson&lt;/a&gt;，    &lt;a href="https://github.com/alibaba/fastjson"&gt;FastJson&lt;/a&gt;，    &lt;a href="https://github.com/google/gson"&gt;Gson&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;数据处理（狭义上的工具类）：    &lt;a href="https://github.com/dromara/hutool"&gt;HuTool&lt;/a&gt;，    &lt;a href="https://mvnrepository.com/artifact/org.apache.commons/commons-lang3"&gt;apache commons-lang3&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;日志记录：    &lt;a href="https://www.tutorialspoint.com/slf4j/slf4j_vs_log4j.htm"&gt;slf4j&lt;/a&gt;（它是接口，不能独立工作），    &lt;a href="https://logging.apache.org/log4j/2.x/"&gt;log4j&lt;/a&gt;（它是一种实现，可以独立工作）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;每一类有其中之一就满足需要了（slf4j除外）。如果你中途加入一个项目组，你需要辨别该项目使用了哪些工具库，并继续使用，不要添加相同功能的其他工具库。&lt;/p&gt;
 &lt;h4&gt;依赖管理工具&lt;/h4&gt;
 &lt;p&gt;当你使用某个第三方库或框架，你便对它产生了“依赖”，有时我们把它名词化，项目依赖的第三方库就起个别名叫“依赖”（dependency）。当然你使用的第三方库本身也可能有依赖，于是会形成一个以你的项目为根的依赖树。&lt;/p&gt;
 &lt;p&gt;  &lt;a href="https://cloud.tencent.com/developer/article/1122163"&gt;依赖管理工具&lt;/a&gt; 源自人们想要自动化（程序员爱自动化）依赖管理的需求。一般依赖管理工具和第三方库仓库是相辅相成的，本地的依赖管理工具会将第三方库仓库的网址作为远程仓库，从上面下载第三方库文件。部分依赖管理工具还拥有工程构建的功能，你简单理解为编译、打包与部署项目。&lt;/p&gt;
 &lt;h5&gt;Java依赖管理工具&lt;/h5&gt;
 &lt;p&gt;主流的Java依赖管理工具有两个：  &lt;a href="https://maven.apache.org/"&gt;Apache Maven&lt;/a&gt;和  &lt;a href="https://gradle.org"&gt;Gradle&lt;/a&gt;。区别？看  &lt;a href="https://cloud.tencent.com/developer/article/1122163"&gt;这篇中文文章&lt;/a&gt;或者  &lt;a href="https://gradle.org/maven-vs-gradle/"&gt;这篇Gradle自己写的对比&lt;/a&gt;或者  &lt;a href="https://www.zhihu.com/question/276078446"&gt;这篇知乎回答&lt;/a&gt;。&lt;/p&gt;
 &lt;h4&gt;往项目里添加依赖&lt;/h4&gt;
 &lt;p&gt;以Java语言项目为例，单个现代项目往往被分成多个包（package，对，就是上面提到的第三方库的一种别名），包之间的有一定的隔离性，依赖也是各个包独立管理的。&lt;/p&gt;
 &lt;p&gt;在编程工作中，你会碰到想使用某个第三方库（或者同一个项目的另一个包）的功能，而目前项目里还没有这个依赖的情况。此时你应该斟酌一下你想在哪个包的代码中使用第三方库，对应要把新的依赖放在哪个包的依赖配置文件里。这个问题没有固定答案，原则就是尽可能少增加复杂度。如果你拿不准，咨询一下有经验的程序员的意见。&lt;/p&gt;
 &lt;p&gt;有一个编程原则叫“针对抽象而非具体编程”，我们应该尽可能减少程序中不必要的依赖，因为它会妨碍未来的变更的灵活性。反面例子：依赖是一个树型结构，有些库没有好好遵守这个原则，依赖于某个具体的库，导致使用该库的其他库也  &lt;a href="https://zhuanlan.zhihu.com/p/34427614"&gt;传递依赖&lt;/a&gt;了那个具体库。结果越来越少的库为了避免麻烦选择使用这些库，最终维护者因无人使用放弃了维护，项目死亡了。不可在未来灵活替换的依赖对项目来说是致命的病毒。&lt;/p&gt;
 &lt;h2&gt;单元测试与Debug&lt;/h2&gt;
 &lt;p&gt;关于单元测试的定义与用途，读  &lt;a href="https://baike.baidu.com/item/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1917084"&gt;百度百科的介绍&lt;/a&gt;。关于单元测试思想方面的内容，可以读  &lt;a href="https://boholder.github.io/blogs/tdd-tips-zh/"&gt;这篇文章&lt;/a&gt;。简单说，单元测试是程序员为了检测自己写的功能是否合乎预期而编写的额外的代码。把这种测试的行为用代码持久化下来有不少好处，比如可以重复运行。单元测试不是必须的，写它可能要费不小的事，所以有时要斟酌是否值得写单元测试，主要看写测试的时间能否弥补未来一遍遍手动测试的时间。&lt;/p&gt;
 &lt;p&gt;一般使用现成的单元测试库来编写单元测试用例。单元测试库属于工具库，也是百花齐放多种多样。现代的框架，比如  &lt;a href="https://docs.spring.io/spring-framework/docs/5.3.2/reference/html/testing.html"&gt;Java的Spring&lt;/a&gt;，  &lt;a href="https://projectreactor.io/docs/core/release/reference/index.html#_testing_a_scenario_with_stepverifier"&gt;Java的Project Reactor&lt;/a&gt;（我相信其他语言的编程框架也有，奈何我没用过无法举例）都会比较贴心地随框架附带专用的测试工具包，帮助你更顺利地使用框架。如果一些热门的库本身没有提供测试工具包，也会有热心程序员提供第三方的辅助测试包…社区就是这个样子，有需求就往往有对应的现成解决方案。&lt;/p&gt;
 &lt;p&gt;单元测试库的API是额外的学习成本，所以部分程序员不喜欢写单元测试，或者写的单元测试无法自动化运行，需要人盯着看日志输出结果。还有一种不写单元测试的情况是，不知道怎么写、或者没有单元测试库的依赖（内网开发时会遇到）或项目使用特殊的商业框架，因此有心无力写不出单元测试。对于前者，斟酌一下学习并写出单元测试的成本；对后两者…默哀，放弃单元测试吧，争取用其他工具把集成测试的测试用例自动化。&lt;/p&gt;
 &lt;p&gt;Debug，或者叫调试，是在程序尚未被打包部署前，把程序在本地的环境里通过调试器等工具的帮助下运行起来，细致观察程序内部的每一步行为，以确定程序行为符合预期。现代IDE中一般会集成调试器和Debug功能，因此通常的实践是在IDE中，以debug模式运行单元测试用例或整个程序。具体怎么用要查IDE的官网文档或自己动手试用，别忘了学习对应的快捷键。&lt;/p&gt;
 &lt;h3&gt;Java的单元测试包和IDEA的Debug功能&lt;/h3&gt;
 &lt;p&gt;我会介绍我现在用的测试库，你也可以选择自己整理一套喜欢的测试库。自从我学会借助测试库写单元测试后只用过两种语言：Java和JavaScript。写JavaScript单元测试我是用FaceBook开源的  &lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt;，本身功能就挺全的，有时会安装基于它的插件包来扩展功能。&lt;/p&gt;
 &lt;p&gt;Java就复杂点了，我现在有一套会用的Java测试库，搭配使用它们可以完成基于Spring框架的应用的各种单元测试工作。关键是它们可以用一个  &lt;a href="https://stackoverflow.com/questions/61117933/whats-the-difference-between-spring-boot-test-vs-spring-boot-starter-test"&gt;spring-boot-starter-test&lt;/a&gt;依赖全部导进来，省事（而且公司的内部仓库里大概率会有）。主要有这么几个包：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;a href="https://junit.org/junit5/"&gt;Junit&lt;/a&gt; 它是一个测试框架，很多其他测试包会基于它编写，角色类似上面的Jest。公司项目中有些用Junit4，但它比较老（10年以上），现在出了Junit5，注意两者间用法的   &lt;a href="https://www.baeldung.com/junit-5-migration"&gt;不同&lt;/a&gt;(   &lt;a href="https://www.baeldung.com/junit-5-runwith"&gt;@Runwith兼容&lt;/a&gt;，   &lt;a href="https://www.baeldung.com/mockito-junit-5-extension"&gt;Mockito in Junit5&lt;/a&gt;)。&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://docs.spring.io/spring-framework/docs/5.3.2/reference/html/testing.html"&gt;Spring提供的测试组件&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://docs.spring.io/spring-boot/docs/current/reference/html/features.html"&gt;Spring Boot提供的测试组件&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://site.mockito.org/"&gt;Mockito&lt;/a&gt; Mock，嘲弄，在测试中我们说mock被测试组件的依赖，是指把调用被试和被被试调用的组件，全部用测试库提供的API换成假的空壳子。这样我们可以控制输入被试的数据，和被试调用其他组件时其他组件的反应。举个例子，我们可以mock一个数据库API，然后写明如果被试调用该API，抛出异常，测试被试在数据库异常时的异常处理逻辑。&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://hamcrest.org/JavaHamcrest/"&gt;Hamcrest&lt;/a&gt; 小巧的断言（assertion）框架，作为Junit断言API的替换品，提供可读性更高的API。（Hamcrest仅是判断一个对象的值怎样怎样，如果想判断其他的比如抛出异常，用Junit的API更方便。）断言是单元测试自动化的核心：自动判断运行结果是否符合预先编写好的结果。例子：assertThat(result,is(“expected-output”))，期望result这个变量是个字符串格式，值是&amp;quot;expected-output&amp;quot;。如果没通过判断，断言API会抛出异常，让这个测试用例失败，并打印出失败的原因。&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;写Java的测试用例时要留意一下IDEA Auto Import的哪个库的注解|API，不能无脑回车导入。因为都是用在测试场景，不少库有同名或名称相似注解|API（例：org.junit.Test和org.junit.jupiter.api.Test）。注解|API间需要搭配使用，混用可能使某个注解|API失效导致测试运行失败，报错也总是云里雾里，无法快速发现是注解用错的原因。这个需要多读点教程和文档弄明白常用的注解|API间的关系，又是一笔额外的学习成本。&lt;/p&gt;
 &lt;p&gt;顺带一提，上面的Hamcrest基于的测试理念是“基于用例的测试”，即提前写好预测的结果，一个用例只能预测一种行为的一个输入和对应的结果。现在业内出了一个还没流行起来的新测试理念——“基于特性的测试”，简单说就是测试框架根据给定的范围，自动生成测试数据，一个测试用例可以用大量的随机数据测试被测组件的抽象行为。但是这种测试用例特别难写，主要是难以抽象总结被测组件的行为。感兴趣的话，可以阅读  &lt;a href="https://boholder.github.io/blogs/unit-test-methods/"&gt;这篇文章中的后两节&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;IDEA的debug功能挺强大的，尤其是debug中途修改变量值，可以作为写不出单元测试时的替代操作。它还允许现改代码并编译替换运行中的类文件，允许drop堆栈来实现“反悔”回到上一步调用处，使得程序可以在一段逻辑中反复运行，测试各种情况。可以用上文提到的Learn插件学习IDEA的debug功能，或者读  &lt;a href="https://www.jetbrains.com/help/idea/debugging-code.html"&gt;官方文档&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;编程思想&lt;/h2&gt;
 &lt;h3&gt;编程原则&lt;/h3&gt;
 &lt;p&gt;编程原则（principle）是一些抽象化的格言，用来规范提醒程序员的编程行为实践。比如提到面向对象编程实践就是  &lt;a href="https://www.baeldung.com/solid-principles"&gt;SOLID五大原则&lt;/a&gt;。还有什么ETC（easy to change）原则，DRY（do not repeat yourself）原则，FEP（fail early，不够仨单词的原则会把原则的P也算进缩写）等。这些原则不是术语，算是程序员间的共识（或者叫黑话），而且可能同一原则有不同解释方式和缩写变体。&lt;/p&gt;
 &lt;p&gt;编程原则试图从抽象层面对抗未来必然会出现的代码变更，尽可能让代码变更变得容易，少修改已经写好的代码。我借用一下忘了哪本书中提到的观点：把软件开发学科与建筑学科相类比的观点（软件架构architecture一词是从建筑学借来的，软件设计模式也是基于建筑学典著  &lt;a href="https://book.douban.com/subject/1157145/"&gt;建筑模式语言&lt;/a&gt;启发出现）已经过时，因为开发流程不再是严格遵守计划表的  &lt;a href="https://zhuanlan.zhihu.com/p/81383161"&gt;瀑布式开发&lt;/a&gt;。软件开发更像园艺，你把种子种在花园里，不能控制植物的自然生长（未来的需求变更），只能通过园艺技术（  &lt;a href="https://book.douban.com/subject/4262627/"&gt;代码重构&lt;/a&gt;）修剪、梳理花园。&lt;/p&gt;
 &lt;p&gt;编程原则无关编程语言，甚至在编程之外的工作和生活中都能借鉴，算是一种行为哲学。希望你能聆听这些编程原则，写出易于变更的代码。&lt;/p&gt;
 &lt;h3&gt;设计模式&lt;/h3&gt;
 &lt;p&gt;请看这篇文章了解设计模式：  &lt;a href="https://draveness.me/holy-grail-design-pattern/#fnref:5"&gt;圣杯与银弹 · 没用的设计模式&lt;/a&gt;。以我的经验而言，设计模式最大的用途是减少沟通成本，冲这个用途值得花时间学一些常用的设计模式的概念。&lt;/p&gt;
 &lt;h2&gt;完成编程工作所需的外围技能&lt;/h2&gt;
 &lt;p&gt;你可以在网络上搜索什么&amp;quot;Xxx职业技能树|知识图谱|技术栈&amp;quot;，有许多人试图总结出这么一个东西，但是要我说，看看  &lt;a href="https://www.ruanyifeng.com/blog/2021/06/drunk-post-of-a-programmer.html"&gt;这位有10年间有多岗位经验的reddit老哥&lt;/a&gt;是怎么描述这个行业的技术栈的：&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;p&gt;技术栈不重要。技术领域有大约 10-20 条核心原则，重要的是这些原则，技术栈只是落实它们的方法。你如果不熟悉某个技术栈，不需要过度担心。&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;h3&gt;英语&lt;/h3&gt;
 &lt;p&gt;四级，英语四级水平的英语读写绝对够用了，只要日常工作没有听说英语的需求。除开每次写方法名都要愣一下单词怎么拼（记得在IDE上安装拼写纠正插件，别闹了笑话）以外，编程工作不是太要求英语水平。编程相关的问答、教程、官网、文档…都不会用很生僻的单词，大家都倾向于用最简单的单词表达意图。唯二的例外是博客和论文。博客是口语化的文章，我碰到过不少次作者想举个例子或者玩笑幽默一下，但把我卡住用字典查里面的生词，继续读下去明白了只是一个例子|玩笑的无奈情况。论文…论文的生词主要是术语，数学术语、机器学习术语、数据分析术语等。&lt;/p&gt;
 &lt;p&gt;有些中文程序员不喜欢英语材料，可能是因为不习惯或者读得慢浪费时间。其实我读得也不快，有时候也因为怕浪费时间选择找中文材料去读。但是如果你去读，你会发现英语材料是可以读懂的，读懂就足够了，多读一些就能克服不习惯的心理障碍，也能慢慢提高阅读速度。&lt;/p&gt;
 &lt;p&gt;你还可以借助科技的辅助：  &lt;a href="https://www.deepl.com/en/translator"&gt;DeepL Translate&lt;/a&gt;等翻译网站、浏览器翻译插件和IDE翻译插件等可以帮你弥补英语能力的不足。&lt;/p&gt;
 &lt;h3&gt;版本控制工具&lt;/h3&gt;
 &lt;p&gt;源代码是文本文件，对吧。  &lt;a href="https://baike.baidu.com/item/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/3311252"&gt;版本控制工具&lt;/a&gt; 是用来管理文本文件的内容变更的功能，类似Microsoft Office Word里的Review（审计？）功能，就是写论文时导师用来帮你打批注、改论文的那个。我见过有写手用它管理txt格式的小说文件，写代码真的和写作很像啊。版本控制工具不仅会记录哪个人对哪个文件做了什么改动，还允许你独立地管理这些改动，确保多人协作的同时维护源代码文件不会被搞成乱糟糟的“源码-v02的副本(1)(2)(1)”这副模样。&lt;/p&gt;
 &lt;p&gt;有两款主流的版本控制工具工具：  &lt;a href="https://www.runoob.com/git/git-tutorial.html"&gt;Git&lt;/a&gt;和  &lt;a href="https://www.runoob.com/svn/svn-tutorial.html"&gt;SVN&lt;/a&gt;（曾经还有  &lt;a href="https://baike.baidu.com/item/CVS/405463"&gt;CVS&lt;/a&gt;，SVN成功取代了CVS）。两者区别？打开Git的链接阅读介绍。另外我想分享一个写得不错的  &lt;a href="https://www.atlassian.com/git/tutorials/what-is-version-control"&gt;英文的Git教程系列&lt;/a&gt;，它不仅讲命令，还总结命令间的区别，还稍微讲了一些git的实现原理，让你对git命令的执行过程有更深的认识。&lt;/p&gt;
 &lt;h3&gt;Linux命令行操作&lt;/h3&gt;
 &lt;p&gt;现在有三种主流的个人计算机操作系统，微软的Windows，苹果的macOS，和开源的（各种发行版的）Linux。服务器操作系统就很多了，五花八门的商业产品，比如Windows的  &lt;a href="https://www.microsoft.com/en-us/windows-server/"&gt;Windows Server&lt;/a&gt;，还有各种Linux。Linux系列操作系统因为其内存占用小、运行稳定、开源（即，免费，服务器版本的操作系统超贵）等特点，成为了主流的应用服务器的宿主操作系统。就是说，我们编写的应用在编译打包后，最终要部署到运行着Linux操作系统的服务器上。&lt;/p&gt;
 &lt;p&gt;如果你在Windows或MacOS操作系统上编程，一般你会使用Linux服务器做这两种工作：&lt;/p&gt;
 &lt;p&gt;部署（也称发版，发布新版本）程序。有时会有专门的运维职业的人员负责这方面工作，或者有自动化构建流水线，有时现实没那么美好，要程序员自己干。部署的操作流程视编程语言而定，在中途加入的项目组中，一般会有其他程序员写好的部署脚本（  &lt;a href="https://www.runoob.com/linux/linux-shell.html"&gt;Shell脚本&lt;/a&gt;）来简化部署操作。&lt;/p&gt;
 &lt;p&gt;查看日志文件。当程序打包部署后，我们就不能以debug的形式查看程序内部的运行情况了。因此我们会在程序中各处插入打印日志的语句，日志会被打印到一些文本文件中，我们通过查看日志文件来判断程序是否正常运行。看日志文件基本是程序员的职责，比如当自己负责的功能出问题时…就会有电话联系你“看一下某请求的情况”，你就要去对应的服务器上查看日志，来判断到底是你的功能出bug了，还是其他系统或功能形成的异常数据致使你的功能运行不正常（这种情况也要增加异常处理补丁去防止再次发生，编程原则：永远不要信任外部系统）。如果只是看日志文件的话，最低限度需学习的命令有  &lt;a href="https://www.man7.org/linux/man-pages/man1/cd.1p.html"&gt;切换目录的cd&lt;/a&gt;，  &lt;a href="https://www.man7.org/linux/man-pages/man1/ls.1p.html"&gt;查看目录内容的ls&lt;/a&gt;，  &lt;a href="https://www.man7.org/linux/man-pages/man1/grep.1p.html"&gt;使用正则过滤查看日志文件的grep&lt;/a&gt;。当然你还需要咨询同组其他人、或阅读程序中的日志输出配置文件来了解日志文件的位置。&lt;/p&gt;
 &lt;p&gt;如果你不熟悉命令行界面，看  &lt;a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-the-linux-terminal"&gt;这篇英文介绍&lt;/a&gt;或者  &lt;a href="https://www.runoob.com/linux/linux-tutorial.html"&gt;菜鸟教程的中文Linux教程&lt;/a&gt;。另外，在命令行中输入“man”（代表manual）+其他命令，可以打开命令的说明书；或输入命令+  &lt;code&gt;-h&lt;/code&gt;或  &lt;code&gt;--help&lt;/code&gt;参数，打印命令的简单说明。你也可以在网上搜索在Linux中应该使用哪个命令做你想做的事。&lt;/p&gt;
 &lt;p&gt;特别的，从我们自己的电脑连接到服务器来使用服务器的命令行界面，需要使用  &lt;a href="http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html"&gt;SSH&lt;/a&gt;这么一种命令行工具（同时它也是工具原理的同名协议）。一般不需要直接使用它，有多种图形界面软件供你选择，这里不再列举，请自行搜索。关于服务器的IP、端口、用户名与密码等连接所需的信息，你需要咨询同组的其他人。&lt;/p&gt;
 &lt;h3&gt;对各种外部系统的配置&lt;/h3&gt;
 &lt;p&gt;提问！上文中出现了几次“配置”？（提示：使用搜索快捷键）开个玩笑，其实我是想说，编程离不开对外部系统的配置。编程项目不是从零开始的，对吧，我们要使用许多已有的系统来省事，比如  &lt;a href="https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%BA%93/103728"&gt;数据库&lt;/a&gt;、  &lt;a href="https://baike.baidu.com/item/%E4%B8%AD%E9%97%B4%E4%BB%B6/452240"&gt;中间件&lt;/a&gt;、框架、日志系统（打日志是一件很复杂的事）…这些系统都需要我们通过配置来调整它们的行为，以适应我们项目的需要。&lt;/p&gt;
 &lt;p&gt;一般我们说配置一个系统，指的是编写配置文件，配置文件是一种遵守某种  &lt;a href="https://baike.baidu.com/item/%E5%8F%AF%E6%89%A9%E5%B1%95%E6%A0%87%E8%AE%B0%E8%AF%AD%E8%A8%80/2885849"&gt;标记语言&lt;/a&gt;（xml,json,toml,yaml…）的文本文件，它就是系统的设置项，和手机设置一样。系统一般在启动时读取配置文件，基于此调整行为。注意，系统一般只会在启动时读取配置文件，所以如果系统启动后你想修改配置文件并让它生效，往往需要重启系统。当然这有很多例外…比如你可以多开一个  &lt;a href="https://baike.baidu.com/item/%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B/966835"&gt;守护进程&lt;/a&gt;专门监控配置文件的变化，若出现变化，就重启系统让系统读新的配置文件。另外在我看来，配置文件的内容是只能被该系统识别并解析的“语言”（  &lt;a href="https://www.infoworld.com/article/2077865/core-java-creating-dsls-in-java-part-1-what-is-a-domain-specific-language.html"&gt;领域特定语言&lt;/a&gt;）。&lt;/p&gt;
 &lt;p&gt;为了写出配置文件，要去读说明书。可以读官方的配置说明文档（往往详细又冗长），也可以省事读简化版的第三方文档，比如中文翻译、博客记录等。这个工作最麻烦的步骤就是要硬着头皮读大篇幅的文档。读哪个都行，能明白怎么写完成工作就好，我推荐配合网页内搜索读官方文档，毕竟最详细。注意配置与软件一样都是有版本的，要读自己项目所用的版本的对应说明书，或者有些文档只有一版，但会在每个配置项下标注从哪个版本开始生效。&lt;/p&gt;
 &lt;h2&gt;总结：太多了，先学哪个？&lt;/h2&gt;
 &lt;p&gt;不好意思，我没收住字数，写太多了。咚地一下全摆在面前是挺吓人的，而且说实话本文仍未涵盖我所认定的所有“必备技能”，如正则表达式等。&lt;/p&gt;
 &lt;p&gt;总之先学编程语言吧，然后是熟悉框架和几个常用的库的用法，此时就能完成工作了。然后如果你对这个职业仍有兴趣，可以学习单元测试、debug和编程思想（看书看博客），还有外围的技能，这些可以慢慢来。额外的知识会提高你的专业性，让你能够有底气地承认自己被付钱来编写程序，你对自己写出的程序有信心且对它负责。&lt;/p&gt;
 &lt;p&gt;如果你对这个职业不感兴趣，学到足够工作使用的知识就可以停止了，你也可能会发现其他兴趣和职业的知识会迁移性地对编程工作产生意想不到的帮助，很多抽象的原则和知识是共通的。&lt;/p&gt;
 &lt;h2&gt;附录&lt;/h2&gt;
 &lt;h3&gt;有用的网站&lt;/h3&gt;
 &lt;p&gt;下面是通用的几个网站：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt; 它是    &lt;a href="https://stackexchange.com/"&gt;StackExchange&lt;/a&gt; 问答网站中分离出的编程问答板块。如果想解决程序报错、想知道某个API怎么用、不知道如何完成一个功能、想了解一种编程实践的理念…一切关于编程的东西，基本上你不是第一个碰到这个问题的人，stackoverflow上大概率会有对应的提问和专业亲切的回答。为了不限制搜索引擎的能力，不建议使用网站内部的搜索功能，而是直接在搜索引擎的搜索栏上开头写&amp;quot;stackoverflow&amp;quot; + 你的问题描述（用英文）。关于这个网站有不少meme赞美它的便利，比如：在没有stackoverflow之前程序员怎么可能顺利写完程序呢。PS: stackoverflow需要从    &lt;code&gt;ajax.googleapis.com&lt;/code&gt;域名加载Js脚本，因为GFW封禁了该域名，在国内网络打开该网站的速度会慢得不可忍受。如果你没有网络代理，你可以使用浏览器的广告屏蔽插件规则将该脚本的加载屏蔽，进而恢复正常的网页打开速度。&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://developer.mozilla.org/zh-CN/docs/Web"&gt;MDN(Mozilla Developer Network) Web docs&lt;/a&gt; 这是实质上的互联网唯一的Web前端开发参考文档，附带翔实有趣的教程（多语言翻译，有中文）。你可以不走出这个网站而学习完前端开发所需要的大部分基础知识。&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; 结合    &lt;a href="https://boholder.github.io/blogs/learn-from-source-code"&gt;这篇文章&lt;/a&gt;从Github里找点感兴趣的项目看一下，感兴趣优先，真的什么千奇百怪的项目都能搜出来。另外有一个小诀窍，如果你拿不准某个库的某个API怎么用，而注释、文档和stackoverflow又没能让你满意，你可以在github中搜索使用了该api的代码片段，学习使用方法。&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://old.reddit.com/r/ExperiencedDevs/"&gt;Reddit-ExperiencedDevs&lt;/a&gt; 这版块只允许3年以上从业经验的开发者发帖，版块里聊的都是职业规划、公司中发生的事等等，很少涉及技术。看这里面的帖子就像一群大佬围着聊闲天时你凑进去听，只是听就能学到不少东西。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;下面是Java方面的网站：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://www.baeldung.com/"&gt;Baeldung&lt;/a&gt; 这网站上有内容充实的关于Java与Java生态（如Spring框架）的教程，质量比那种内容农场网站高出一截。不需要刻意在网站中搜索，当你搜索Java相关教程时，这个网站往往排在搜索结果前面…&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://blogs.oracle.com/javamagazine/"&gt;Oracle Java Manazine&lt;/a&gt; 因为Java不太受同行待见（这是真的吗？），所以不怎么能看到关于Java语言的公开讨论。虽然（仅在中国？）工作上用Java的程序员很多，但讨论Java语言俨然是个小圈子。这时我们要借助学术界中小圈子交流的方法：研讨会和期刊。研讨会…至少我不够格参与，因此我选择邮件订阅Oracle公司组织编撰的免费杂志，进而一窥Java行业的动向，学点新东西。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;h3&gt;之前没接触过IT行业的基础知识？&lt;/h3&gt;
 &lt;p&gt;基础知识体系无法突击补习，这是慢活，更别提还会遗忘。目前大学的软件工程|计算机科学专业会开设大约10门左右的IT专业课程，也就是说你和科班出身的IT专业本科毕业生的差距在10本左右的教科书，以及几个练手的小项目。&lt;/p&gt;
 &lt;p&gt;不补基础知识体系的前提下完成公司要求的编程工作是可以的，现在的编程语言和工具已经把底层实现都封装起来了。但它会在工作上限制你的思考：不知道原理，就没法想象你的程序如何运行，也就没法深入地思考一个解决方案的细节，心里很不舒服。或者…小心  &lt;a href="https://droidyue.com/blog/2019/03/24/cargo-cults-programming/"&gt;货物崇拜编程&lt;/a&gt;，它是指新手程序员常犯的那种“网上找解决方案复制粘贴下来”的不良编程实践。越不熟悉基础知识，越可能在工作中出现货物崇拜编程现象，这可能会在程序里埋下炸弹，最终伤害你或身边的程序员。&lt;/p&gt;
 &lt;p&gt;这里有一个好的起步课程：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://www.bilibili.com/video/BV1HJ411q7bm"&gt;【中英字幕|2019 CS50|哈佛大学编程入门】 CS50 Harvard University2019&lt;/a&gt;
用非术语讲解IT行业里的一些知识体系。真正的0基础开始学。可惜课不太全。&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;    &lt;a href="https://www.bilibili.com/video/BV1dx411i7dW"&gt;【哈佛大学-编程入门】 CS50 Harvard University（2016）11集（全）&lt;/a&gt;
课全了，可惜没中文字幕。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;h3&gt;我推荐的阅读材料&lt;/h3&gt;
 &lt;p&gt;API的使用方法可以通过关键字去搜索文档和问答，但职业经验就不方便搜索了，它们恰恰是重要的东西。IT行业很有意思，我没见过除此之外哪个行业在遵守工匠道路的同时，又不吝啬甚至乐于向同行分享自己的经验。有许多人会写经验类的博客，比热门博客更系统化也更著名的是出版成书的著作。下面是我读过的，能打包票的经验方面的阅读材料。&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;a href="https://book.douban.com/subject/3032825/"&gt;Clean Code 代码整洁之道&lt;/a&gt; 讲细小层面（语句级别）的编程技巧。当用某种编程语言写了一个练手项目或几个功能时就可以开始看了。&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://book.douban.com/subject/6114900/"&gt;The Clean Coder 程序员职业素养&lt;/a&gt; 很薄的一本书，对的，和Clean Code是同一系列， 该系列还有两本：架构整洁之道，敏捷开发实践，等级比较高，我还没看¯\_(ツ)_/¯。不涉及技术细节，指导程序员在某件工作乃至职业规划上应该如何做。&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://book.douban.com/subject/35006892/"&gt;The Pragmatic Programmer: From Journeyman to Master 程序员修炼之道（第2版）&lt;/a&gt; 分了许多小章节，每个章节用一个比喻做标题。两个作者想把他们的职业经验讲给你听，内容涉及方方面面。&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://book.douban.com/subject/3324516/"&gt;实现模式&lt;/a&gt; 书不厚，类似Clean Code，讲细节的编程技巧，但是对读者的经验要求比Clean Code高一些。&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://gist.github.com/zer4tul/44ac7d145a4342d876f3"&gt;如何成为黑客&lt;/a&gt; 不，hacker不是你想象的那个意思，你指的是cracker。这篇文章是一位温和派的开源运动领导者写的关于实践开源精神的一些建议，里面一些原则值得以程序员的角度去理解学习。&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://book.douban.com/subject/35043034/"&gt;计算机简史（第三版）&lt;/a&gt; 学校里没有开设关于IT行业的历史课，我倒觉得该开一门。了解历史能多明白一些为什么现在的IT行业是这副样子。比如，开源运动如何让行业内出现了可自由使用的第三方库，让软件研发行业对人员专业素质的要求大幅降低，进而让提供了大量岗位。随着科技的发展和商业需求、社会环境的演变，曾经的一些黄金实践原则已经过时或不合时宜，也出现了适应时代的新的原则。举个例子，你不会在50年前要求程序员编写单元测试，因为他们连编译个程序都要等好几个小时，而现在的算力如此廉价，在一台个人笔记本上运行整个项目的整套单元测试只需要几分钟，这也让   &lt;a href="https://www.ruanyifeng.com/blog/2015/09/continuous-integration.html"&gt;持续集成&lt;/a&gt;成为可能。&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://book.douban.com/subject/25956450/"&gt;人件&lt;/a&gt;、   &lt;a href="https://book.douban.com/subject/1102259/"&gt;人月神话&lt;/a&gt;和   &lt;a href="https://book.douban.com/subject/25881855/"&gt;大教堂与集市&lt;/a&gt; 这三本是软件开发组织架构方面的理论书，结合对应的年代和历史事件，它们会让你了解软件开发行业是怎样从瀑布式开发转向敏捷开发的，开发团队的组织规模为何从大部队分散成灵活的小组。&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming programming blog</category>
      <guid isPermaLink="true">https://itindex.net/detail/61709-%E7%BC%96%E7%A8%8B-%E9%9C%80%E8%A6%81-%E4%B8%9C%E8%A5%BF</guid>
      <pubDate>Mon, 16 Aug 2021 08:00:00 CST</pubDate>
    </item>
    <item>
      <title>快速產生 SQLite 資料的方式：一分鐘內產生十億筆資料</title>
      <link>https://itindex.net/detail/61623-sqlite-%E4%B8%80%E5%88%86</link>
      <description>&lt;p&gt;在「  &lt;a href="https://avi.im/blag/2021/fast-sqlite-inserts/"&gt;Towards Inserting One Billion Rows in SQLite Under A Minute&lt;/a&gt;」這邊看到作者想要在一分鐘內在 MBP 2019 上面寫 1B 筆資料進   &lt;a href="https://sqlite.org/"&gt;SQLite&lt;/a&gt;，裡面有些方法還蠻值得玩一下的，這台 MBP 2019 機器的規格是：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;The machine I am using is MacBook Pro, 2019 (2.4 GHz Quad Core i5, 8GB, 256GB SSD, Big Sur 11.1)&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;第一版是   &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; 寫的，塞 10M 筆花了 15 分鐘：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;In this script, I tried to insert 10M rows, one by one, in a for loop. This version took close to 15 minutes, sparked my curiosity and made me explore further to reduce the time.&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;加了五個   &lt;code&gt;PRAGMA&lt;/code&gt; 的版本變成 100M 筆十分鐘：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;The naive for loop version took about 10 minutes to insert 100M rows.&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;用批次處理則可以降到八分半：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;The batched version took about 8.5 minutes to insert 100M rows.&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;再來是拿經典神器   &lt;a href="https://www.pypy.org/"&gt;PyPy&lt;/a&gt; 出來用，降到兩分半：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;All I had to do was run my existing code, without any change, using PyPy. It worked and the speed bump was phenomenal. The batched version took only 2.5 minutes to insert 100M rows. I got close to 3.5x speed :)&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;接下來就是跳槽到 Rust 了，中間也有不少 tuning 相關的討論，但直接先跳到最後面好了... 最後 100M 只用了 33 秒：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;I created a threaded version, where I had one writer thread that received data from a channel and four other threads which pushed data to the channel. This is the current best version which took about 32.37 seconds.&lt;/p&gt;&lt;/blockquote&gt;
 &lt;p&gt;能用 PyPy 的地方還是可以考慮一下的...&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Computer Database Library Murmuring Programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/61623-sqlite-%E4%B8%80%E5%88%86</guid>
      <pubDate>Tue, 20 Jul 2021 18:55:40 CST</pubDate>
    </item>
    <item>
      <title>XML和JSON</title>
      <link>https://itindex.net/detail/52604-xml-json</link>
      <description>&lt;p&gt;  &lt;a href="http://www.raychase.net/wp-content/uploads/2015/01/json.png"&gt;   &lt;img align="right" alt="XML&amp;#21644;JSON" border="0" height="118" src="http://www.raychase.net/wp-content/uploads/2015/01/json_thumb.png" title="XML&amp;#21644;JSON" width="244"&gt;&lt;/img&gt;&lt;/a&gt; 不久前看到一个讨论帖，说的是XML和JSON的比较，说着说着后来就变成了JSON到底比XML牛逼在哪里。不吹不黑，客观地来比较一下二者的异同。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;XML比JSON更胖吗？&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;有的情况下是的，但也不一定，比较这样的片段：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;user age=&amp;quot;18&amp;quot;&amp;gt;
    &amp;lt;address&amp;gt;
        &amp;lt;city name=&amp;quot;Seattle&amp;quot; /&amp;gt;
    &amp;lt;/address&amp;gt;
&amp;lt;/user&amp;gt;&lt;/pre&gt;
 &lt;p&gt;和&lt;/p&gt;
 &lt;pre&gt;{&amp;quot;user&amp;quot; : {
    &amp;quot;age&amp;quot; : 18,
    &amp;quot;address&amp;quot; : {
        city : {
            name : &amp;quot;Seattle&amp;quot;
        }
    }
}}&lt;/pre&gt;
 &lt;p&gt;二者信息量几乎均等，XML看起来并不显得多么冗余。有恰当的编辑器，二者都可以有比较美观的缩进表达。&lt;/p&gt;
 &lt;p&gt;当然，也有很多情况我们可以看到XML要比JSON啰嗦（有人说JSON是fat-free alternative to XML），比如XML写这样的东西：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;employees&amp;gt;
    &amp;lt;employee&amp;gt;
        &amp;lt;address value=&amp;quot;...&amp;quot;/&amp;gt;
    &amp;lt;/employee&amp;gt;
    &amp;lt;employee&amp;gt;
        &amp;lt;address value=&amp;quot;...&amp;quot;/&amp;gt;
    &amp;lt;/employee&amp;gt;
    &amp;lt;employee&amp;gt;
        &amp;lt;address value=&amp;quot;...&amp;quot;/&amp;gt;
    &amp;lt;/employee&amp;gt;
&amp;lt;employees&amp;gt;&lt;/pre&gt;
 &lt;p&gt;如果employees和employee这节点名字名字本身不重要的话，写成JSON就简单多了：&lt;/p&gt;
 &lt;pre&gt;[{address:&amp;quot;...&amp;quot;}, {address:&amp;quot;...&amp;quot;}, {address:&amp;quot;...&amp;quot;}]&lt;/pre&gt;
 &lt;p&gt;  &lt;strong&gt;JSON的表达直观在哪里？&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;继续就着上面的例子看：&lt;/p&gt;
 &lt;p&gt;XML格式下，我无法得知age其实是一个数字，因为XML里面你无法进一步区分简单数据类型；但是JSON就不是了，18是数字，”18″是字符串；true是布尔真，”true”是字符串；null是空，”null”是字符串。&lt;/p&gt;
 &lt;p&gt;如果要表达数组呢？XML中可以在父节点下面累放节点，而JSON则有[ ]这样更直观的方式。&lt;/p&gt;
 &lt;p&gt;如果字符串中有换行符怎么办，JSON不存在这个问题，而XML必须引入  &lt;a href="http://www.w3schools.com/xml/xml_cdata.asp" target="_blank"&gt;CDATA&lt;/a&gt;解决问题，比如：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;script&amp;gt;
&amp;lt;![CDATA[
function matchwo(a,b)
{
if (a &amp;lt; b &amp;amp;&amp;amp; a &amp;lt; 0) then
  {
  return 1;
  }
else
  {
  return 0;
  }
}
]]&amp;gt;
&amp;lt;/script&amp;gt;&lt;/pre&gt;
 &lt;p&gt;  &lt;strong&gt;XML也有优势&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;比如XML可以有声明（declaration）：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;?xml version=&amp;apos;1.0&amp;apos; encoding=&amp;apos;character encoding&amp;apos; standalone=&amp;apos;yes|no&amp;apos;?&amp;gt;&lt;/pre&gt;
 &lt;p&gt;规定了编码格式等等信息，但是JSON就没有这样的东西。&lt;/p&gt;
 &lt;p&gt;当上面的standalone为yes的时候表示DTD直接写到这个XML里面去，这样，就不需要额外的DTD文件了，也就是说，这个文件不但是自解释，还是自校验的了。而这一点，JSON是不可能做到的。&lt;/p&gt;
 &lt;p&gt;另外，XML还可以有命名空间，可以通过xmlns属性引入不同的定义文件，像编程语言的import来自由组合，这一点，JSON也是做不到的：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;h:table xmlns:h=&amp;quot;http://www.w3.org/TR/html4/&amp;quot;&amp;gt;
   &amp;lt;h:tr&amp;gt;
   &amp;lt;h:td&amp;gt;Apples&amp;lt;/h:td&amp;gt;
   &amp;lt;h:td&amp;gt;Bananas&amp;lt;/h:td&amp;gt;
   &amp;lt;/h:tr&amp;gt;
&amp;lt;/h:table&amp;gt;&lt;/pre&gt;
 &lt;p&gt;另外，在偶然出现格式错误的时候，由于起始和结束标签对应的关系，XML的校验会比JSON更容易发现“错在哪里”，换言之，修复的可能性更大。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;和对象之间的互相转化&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;JSON的一大好处是有些语言可以原生支持，比如JavaScript，不需要一个JSON Parser这样的东西，代码里表示对象用的就是JSON格式的表达。但是直接支持XML的编程语言，好像没有吧，倒是有像HTML等等标记语言的解析器，可以处理任意DOM对象。&lt;/p&gt;
 &lt;p&gt;如果要把JSON转成对象，在支持JSON对象的浏览器中可以写：&lt;/p&gt;
 &lt;pre&gt;var obj = JSON.parse(text);&lt;/pre&gt;
 &lt;p&gt;如果不支持，则可以这样做：&lt;/p&gt;
 &lt;pre&gt;var obj = eval (&amp;quot;(&amp;quot; + text + &amp;quot;)&amp;quot;);&lt;/pre&gt;
 &lt;p&gt;如果是反过来，要把对象表达成JSON表达式呢？&lt;/p&gt;
 &lt;pre&gt;JSON.stringify(obj);&lt;/pre&gt;
 &lt;p&gt;这些都是原生的支持，如果是XML，要和对象之间互相转换，则要麻烦得多，需要借助第三方类库。支持注解的表达会让代码清晰很多，把XML这种声明式的表达，变成另一种类定义声明式的表达，比如  &lt;a href="http://stackoverflow.com/questions/10518372/how-to-deserialize-xml-to-object" target="_blank"&gt;这个例子&lt;/a&gt;：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;StepList&amp;gt;
  &amp;lt;Step&amp;gt;
    &amp;lt;Name&amp;gt;Name1&amp;lt;/Name&amp;gt;
    &amp;lt;Desc&amp;gt;Desc1&amp;lt;/Desc&amp;gt;
  &amp;lt;/Step&amp;gt;
  &amp;lt;Step&amp;gt;
    &amp;lt;Name&amp;gt;Name2&amp;lt;/Name&amp;gt;
    &amp;lt;Desc&amp;gt;Desc2&amp;lt;/Desc&amp;gt;
  &amp;lt;/Step&amp;gt;
&amp;lt;/StepList&amp;gt;&lt;/pre&gt;
 &lt;p&gt;带有注解的类定义声明式表达：&lt;/p&gt;
 &lt;pre&gt;[XmlRoot(&amp;quot;StepList&amp;quot;)]
public class StepList
{
    [XmlElement(&amp;quot;Step&amp;quot;)]
    public List&amp;lt;Step&amp;gt; Steps { get; set; }
}

public class Step
{
    [XmlElement(&amp;quot;Name&amp;quot;)]
    public string Name { get; set; }
    [XmlElement(&amp;quot;Desc&amp;quot;)]
    public string Desc { get; set; }
}&lt;/pre&gt;
 &lt;p&gt;对于XML和JSON之间的互相转化，除了类库，还有一些在线的工具，用起来很方便，比如  &lt;a href="http://www.utilities-online.info/xmltojson/" target="_blank"&gt;这个&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;XML DTD和JSON Schema&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;DTD指的是Document Type Definition，用于定义XML文件的节点属性格式和含义，比如  &lt;a href="http://www.w3schools.com/dtd/" target="_blank"&gt;这样的DTD文件&lt;/a&gt;：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;!DOCTYPE NEWSPAPER [

&amp;lt;!ELEMENT NEWSPAPER (ARTICLE+)&amp;gt;
&amp;lt;!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)&amp;gt;
&amp;lt;!ELEMENT HEADLINE (#PCDATA)&amp;gt;
&amp;lt;!ELEMENT BYLINE (#PCDATA)&amp;gt;
&amp;lt;!ELEMENT LEAD (#PCDATA)&amp;gt;
&amp;lt;!ELEMENT BODY (#PCDATA)&amp;gt;
&amp;lt;!ELEMENT NOTES (#PCDATA)&amp;gt; 

&amp;lt;!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED&amp;gt;
&amp;lt;!ATTLIST ARTICLE EDITOR CDATA #IMPLIED&amp;gt;
&amp;lt;!ATTLIST ARTICLE DATE CDATA #IMPLIED&amp;gt;
&amp;lt;!ATTLIST ARTICLE EDITION CDATA #IMPLIED&amp;gt;

]&amp;gt;&lt;/pre&gt;
 &lt;p&gt;XML除了DTD本身，还有一个真正的schema，叫做  &lt;a href="http://www.w3schools.com/schema/" target="_blank"&gt;XML Schema&lt;/a&gt;，它本身也是XML。其实，XML Schema是针对DTD无法解决问题而发明的进化版本，可以定义数据类型，包括集合类型，可以指定顺序，元素出现次数，支持命名空间，以及定义缺省值等等。另外，哪怕就从这一点上看，XML的功能性上确实要比JSON更强大：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;xs:schema xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;gt;

&amp;lt;xs:element name=&amp;quot;note&amp;quot;&amp;gt;
  &amp;lt;xs:complexType&amp;gt;
    &amp;lt;xs:sequence&amp;gt;
      &amp;lt;xs:element name=&amp;quot;to&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;
      &amp;lt;xs:element name=&amp;quot;from&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;
      &amp;lt;xs:element name=&amp;quot;heading&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;
      &amp;lt;xs:element name=&amp;quot;body&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;
    &amp;lt;/xs:sequence&amp;gt;
  &amp;lt;/xs:complexType&amp;gt;
&amp;lt;/xs:element&amp;gt;

&amp;lt;/xs:schema&amp;gt;&lt;/pre&gt;
 &lt;p&gt;相应地，JSON也有类似的东西，叫做JSON Schema，它本身也是JSON。比如这个例子：&lt;/p&gt;
 &lt;pre&gt;{
	&amp;quot;title&amp;quot;: &amp;quot;Example Schema&amp;quot;,
	&amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,
	&amp;quot;properties&amp;quot;: {
		&amp;quot;firstName&amp;quot;: {
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;
		},
		&amp;quot;lastName&amp;quot;: {
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;
		},
		&amp;quot;age&amp;quot;: {
			&amp;quot;description&amp;quot;: &amp;quot;Age in years&amp;quot;,
			&amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;,
			&amp;quot;minimum&amp;quot;: 0
		}
	},
	&amp;quot;required&amp;quot;: [&amp;quot;firstName&amp;quot;, &amp;quot;lastName&amp;quot;]
}&lt;/pre&gt;
 &lt;p&gt;  &lt;strong&gt;从XPath到JSONPath&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;我们经常需要一种表达式来访问整个XML中间的某个节点或者属性，XPath就是这样的表达式，比如下面这个XPath表达式就是XPath  &lt;a href="http://en.wikipedia.org/wiki/XPath#firstHeading" target="_blank"&gt;维基百科页上面XPath标题的节点&lt;/a&gt;：&lt;/p&gt;
 &lt;pre&gt;//*[@id=&amp;quot;firstHeading&amp;quot;]/span&lt;/pre&gt;
 &lt;p&gt;为什么很少提及JSON数据的path？主要原因是因为一旦有了语言原生支持，我们就不自觉地使用了，比如JavaScript中使用对象的某一个属性一样自然。但是，无论如何，一个path的表达式还是不可替代的，除了各色的开源项目，还有一个叫做  &lt;a href="http://tools.ietf.org/html/rfc6901" target="_blank"&gt;JSON Pointer&lt;/a&gt;的规范，虽然  &lt;a href="http://susanpotter.net/blogs/software/2011/07/why-json-pointer-falls-short/" target="_blank"&gt;没能得到足够多的赞成票&lt;/a&gt;；也有人拟了一个  &lt;a href="http://goessner.net/articles/JsonPath/" target="_blank"&gt;JSONPath&lt;/a&gt;的东西，这个看起来就完备得多了：&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.raychase.net/wp-content/uploads/2015/01/XPathAndJSONPath.png"&gt;   &lt;img alt="XML&amp;#21644;JSON" border="0" height="459" src="http://www.raychase.net/wp-content/uploads/2015/01/XPathAndJSONPath_thumb.png" title="XML&amp;#21644;JSON" width="436"&gt;&lt;/img&gt;&lt;/a&gt; &lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;还有其它的替代品吗？&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;有。比如  &lt;a href="http://en.wikipedia.org/wiki/YAML" target="_blank"&gt;YAML&lt;/a&gt;，表意更加丰富，还省掉了很多格式化的符号，比如JSON的引号和XML的标签记号。  &lt;a href="http://yaml.org/spec/1.2/spec.html#id2759572" target="_blank"&gt;YAML官网的介绍&lt;/a&gt;，记录了它和JSON以及XML之间的比较：&lt;/p&gt;
 &lt;blockquote&gt;
  &lt;p&gt;JSON’s foremost design goal is simplicity and universality. In contrast, YAML’s foremost design goals are human readability and support for serializing arbitrary native data structures. Thus, YAML allows for extremely readable files, but is more complex to generate and parse.&lt;/p&gt;
  &lt;p&gt;YAML is primarily a data serialization language. XML was designed to support structured documentation. XML therefore had many design constraints placed on it that YAML does not share.&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;看看下面的例子，不得不说，就清晰简洁为上的可读性上而言，YAML是三者中最好的：&lt;/p&gt;
 &lt;pre&gt;---
receipt:     Oz-Ware Purchase Invoice
date:        2007-08-06
customer:
    given:   Dorothy
    family:  Gale
   
items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled &amp;quot;Ruby&amp;quot; Slippers 
      price:     100.27
      quantity:  1

bill-to:  &amp;amp;id001
    street: | 
            123 Tornado Alley
            Suite 16
    city:   East Westville
    state:  KS

ship-to:  *id001   

specialDelivery:  &amp;gt;
    Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the 
    man behind the curtain.
...&lt;/pre&gt;
 &lt;p&gt;  &lt;strong&gt;文章未经特殊标明皆为本人原创，未经许可不得用于任何商业用途，转载请保持完整性并注明来源链接   &lt;a href="http://www.raychase.net/2769"&gt;《四火的唠叨》&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
 &lt;div&gt;分享到：  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#26032;&amp;#28010;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#33150;&amp;#35759;&amp;#24494;&amp;#21338;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;QQ&amp;#31354;&amp;#38388;"&gt;&lt;/a&gt;  &lt;a href="javascript:var b=document.body;var GR________bookmarklet_domain='http://www.google.com';if(b&amp;&amp;!document.xmlVersion){void(z=document.createElement('script'));void(z.src='http://www.google.com/reader/ui/link-bookmarklet.js');void(b.appendChild(z));}else{}" title="&amp;#20998;&amp;#20139;&amp;#21040;Google Reader"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#20154;&amp;#20154;&amp;#32593;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#35910;&amp;#29923;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#40092;&amp;#26524;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#24320;&amp;#24515;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;Follow5"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#21516;&amp;#23398;&amp;#32593;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#22016;&amp;#21653;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#39277;&amp;#21542;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#20570;&amp;#21861;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#30334;&amp;#24230;&amp;#25910;&amp;#34255;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;twitter"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#28155;&amp;#21152;&amp;#21040;&amp;#25910;&amp;#34255;&amp;#22841;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Programming Paradigm DTD JSON schema XML</category>
      <guid isPermaLink="true">https://itindex.net/detail/52604-xml-json</guid>
      <pubDate>Sun, 25 Jan 2015 11:37:36 CST</pubDate>
    </item>
    <item>
      <title>可视化编程</title>
      <link>https://itindex.net/detail/48198-%E5%8F%AF%E8%A7%86%E5%8C%96-%E7%BC%96%E7%A8%8B</link>
      <description>&lt;p&gt;本文来自《  &lt;a href="http://blog.interfacevision.com/design/design-visual-progarmming-languages-snapshots/" target="_blank"&gt;Visual Programming Languages – Snapshots&lt;/a&gt;》，作者  &lt;a href="http://twitter.com/erichosick" target="_blank"&gt;Eric Hosick&lt;/a&gt;收集了一堆关于可视化编程的工具，好多我都听都没听说过，我一股脑的全转过来，给大家看看，算是开开眼界了。本文也是参考了Wikipedia的   &lt;a href="http://en.wikipedia.org/wiki/Visual_programming_language"&gt;Visual Programming Language&lt;/a&gt; 词条。&lt;/p&gt;
 &lt;p&gt;另外，在原文有很多评论，其中也有很多正文没有提到的，你可以前去围观一下。&lt;/p&gt;
 &lt;h4&gt;SketchPad&lt;/h4&gt;
 &lt;p&gt;Maybe the first. 1963.&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://mydiesel22.blogspot.com/2011/05/vector-and-digital-graphics.html"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Sketchpad"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.youtube.com/watch?v=495nCzxM9PI&amp;feature=player_embedded"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" height="407" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_sketchpad_01.jpg" width="576"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h4&gt;Alice&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.alice.org/index.php"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Alice_%28software%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://en.wikipedia.org/wiki/File:Alice-2-screenshot.jpg"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_alice_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;App Inventor For Android&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://beta.appinventor.mit.edu/learn/tutorials/whereismycar/whereismycar.html"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/App_Inventor_for_Android"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://appinventor.mit.edu/explore/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_app_inventor_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;ArcGIS Model Builder&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.rockware.com/product/featuresLobby.php?id=193&amp;category=615"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://resources.arcgis.com/en/help/main/10.1/index.html#//002w00000001000000"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_app_arcgis_01.gif"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Automator&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.apple.com/remotedesktop/automation.html"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Automator_%28software%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.apple.com/osx/apps/#automator"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_automator_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Blockly&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://i.imgur.com/PfJO2.png"&gt;图片来源&lt;/a&gt; 和   &lt;a href="https://code.google.com/p/blockly/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_blockly_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Bounce&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.art.net/~hopkins/Don/lang/bounce/SpaceSeedCircuits.gif"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://www.art.net/~hopkins/Don/lang/bounce/bounce.html"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_bounce_01.gif"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Copper Thoughts&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.copperthoughts.com/assets/request-fsm-instance.png"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://www.copperthoughts.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_copper_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;DRAKON&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://en.wikipedia.org/wiki/DRAKON"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/DRAKON"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://drakon-editor.sourceforge.net/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" height="712" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_drakon_01.png" width="720"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Etoys / Squeak&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://en.wikipedia.org/wiki/File:Squeak-screenshot.png"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Etoys_%28programming_language%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.squeakland.org/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" height="496" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_etoysqueak_01.png" width="733"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Field&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://openendedgroup.com/field/OverviewBanners2.html"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://openendedgroup.com/field/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" height="442" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_field_01.png" width="860"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;FL Studio&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://freaksolid.wordpress.com/2013/05/20/fl-studio-11-patcher-dj-performance-presets/"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Fl_studio"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.image-line.com/flstudio/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" height="610" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_flstudiopatcher_01.jpg" width="1082"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Flow Hub and NoFlo&lt;/h4&gt;
 &lt;p&gt;Flow-Based Programming.&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://flowhub.io/"&gt;图片来源 1&lt;/a&gt;,   &lt;a href="http://cdn.thegrid.io.s3.amazonaws.com/noflo/kickstarter/images/UI-03.jpg"&gt;图片来源 2&lt;/a&gt;   &lt;a href="http://noflojs.org/"&gt;官方网站 1&lt;/a&gt; 和   &lt;a href="http://flowhub.io/"&gt;官方网站 2&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" height="451" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_flohub_01.png" width="819"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" height="562" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_noflo_01.jpg" width="734"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;FlowStone&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://en.wikipedia.org/wiki/File:FlowStone_Large_Screenshot.png"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://www.dsprobotics.com/flowstone.html"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_flowstone_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;GoDot Engine&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.godotengine.org/wp/wp-content/uploads/2014/01/editor2.jpg"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://www.godotengine.org/wp/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_godot_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Google Web Designer&lt;/h4&gt;
 &lt;p&gt;  &lt;a&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Google_Web_Designer"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="https://www.google.com/webdesigner/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_webdesigner_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Hopscotch&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="https://www.gethopscotch.com/"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Hopscotch_%28programming_language%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="https://www.gethopscotch.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_hopscotch_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;HyperCard&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.smackerel.net/black_white_02.html"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/HyperCard"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://hypercard.org/"&gt;官方网站???&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_hypercard_01.gif"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;IFTTT&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="https://ifttt.com/recipes"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Ifttt"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="https://ifttt.com/wtf"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_ifttt_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Illumination Software Creator&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://lunduke.com/2010/06/16/illumination-software-creator-20-beta-2/"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Illumination_Software_Creator"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://lunduke.com/2010/06/16/illumination-software-creator-20-beta-2/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_illumination_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Intentional Technology&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.intentsoft.com/intentional-technology/"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://www.intentsoft.com/intentional-technology/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_IntentionalTech_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Jeskola Buzz&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://blog.livedoor.jp/acid808/archives/cat_693944.html"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Jeskola_Buzz"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.jeskola.net/buzz/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_jeskolabuzz_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Kimono&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.kimonolabs.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_kimono_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Kodu (Boku)&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.interactiveclassroom.net/?p=508"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Kodu"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://research.microsoft.com/en-us/projects/kodu/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_kodu_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;LabView&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.ni.com/newsletter/51735/en/"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/LabVIEW"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.ni.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_labview_02.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Ladder Logic&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://en.wikipedia.org/wiki/Ladder_logic"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Ladder_logic"&gt;Wikipedia&lt;/a&gt; 和   &lt;a&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_ladderlogic_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Lamdu&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://peaker.github.io/lamdu/"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://peaker.github.io/lamdu/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_lamdu_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Lava&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://lavape.sourceforge.net/Derivation.htm"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Lava_%28programming_language%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://lavape.sourceforge.net/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" height="639" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_lava_01.png" width="660"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Learnable Programming&lt;/h4&gt;
 &lt;p&gt;More of a post on different ways to learn programming.&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://worrydream.com/#!/LearnableProgramming"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://worrydream.com/#!/LearnableProgramming"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_learnable_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Light Table&lt;/h4&gt;
 &lt;p&gt;Chris Granger’s development environment.   &lt;a href="https://plus.google.com/+JJoeDouglas/posts"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Light_table_%28software%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.lighttable.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_lighttable_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Lily&lt;/h4&gt;
 &lt;p&gt;Really cool and hard to describe. You need to visit their demo web page and watch their videos.   &lt;a href="http://blog.lilyapp.org/lily/demo/"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Lily_%28software%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://blog.lilyapp.org/lily/demo/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_lily_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Limnor Studio&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.limnor.com/studio_whatIsIt.html"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Limnor"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.limnor.com/studio_whatIsIt.html"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_limnorstudio_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Little Big Planet&lt;/h4&gt;
 &lt;p&gt;Someone built an An   &lt;a href="http://www.youtube.com/watch?v=jWanvKdurU0"&gt;8-bit Mechanical Adder in LittleBigPlanet&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.youtube.com/watch?v=jWanvKdurU0"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/LittleBigPlanet"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://littlebigplanet.playstation.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_littlebig_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Minecraft&lt;/h4&gt;
 &lt;p&gt;Considering someone has created a   &lt;a href="http://www.youtube.com/watch?v=frcr9XYeTW4"&gt;fully programmable computer&lt;/a&gt; using Minecraft.&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.youtube.com/watch?v=frcr9XYeTW4"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Minecraft"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="https://minecraft.net/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_minecraft_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Minibloq&lt;/h4&gt;
 &lt;p&gt;This has a really cool looking interface.   &lt;a href="http://en.wikipedia.org/wiki/File:ToneWithVariables.png"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Minibloq"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://blog.minibloq.org/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_minibloq_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Morphic&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.cc.gatech.edu/fac/mark.guzdial/squeak/startingmorphic.html"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Morphic_%28software%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.dmoz.org/Computers/Software/Operating_Systems/Graphic_Subsystems/Morphic"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_morphic_01.gif"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Mozilla Appmaker&lt;/h4&gt;
 &lt;p&gt;This was discussed quite a bit on   &lt;a href="https://news.ycombinator.com/item?id=6501731"&gt;Ycombinator&lt;/a&gt;.   &lt;a href="http://2.bp.blogspot.com/-1xD81b5fPso/Uly-amqf9vI/AAAAAAAAC8I/n7ehLipb1CE/s1600/appmaker.png"&gt;图片来源&lt;/a&gt; 和   &lt;a href="https://appmaker.mozillalabs.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_appmaker_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;MST Workshop&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://home.comcast.net/~tpandolfi/site/?/photos/&amp;PHPSESSID=63621f2035fe55537d794ab0ac795934"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/MST_Workshop"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://home.comcast.net/~tpandolfi/site/?/home/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_mst_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;NeatTools Visual Programming Environment&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.sensyr.com/NeatTools.html"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://www.neattools.org/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_NeatTools_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;NodeBox&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://nodebox.net/node/"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://nodebox.net/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_nodebox_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Nuke&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.thefoundry.co.uk/products/nuke-product-family/nuke/"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Nuke_%28software%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.thefoundry.co.uk/products/nuke-product-family/nuke/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_nuke_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;NXT-G&lt;/h4&gt;
 &lt;p&gt;Legos!!!   &lt;a href="http://www.brickshelf.com/cgi-bin/gallery.cgi?i=2051945"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Lego_Mindstorms_NXT#NXT-G"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.legoengineering.com/program/nxt-g/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_nxt-g_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Open Modelica&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.marekgayer.com/en/projects/incfd/"&gt;图片来源&lt;/a&gt; 和   &lt;a href="https://www.openmodelica.org/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_openmodelica_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Open Music&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://en.wikipedia.org/wiki/File:Om_patch.gif"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/OpenMusic"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://repmus.ircam.fr/openmusic/home"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_openmusic_01.gif"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;OpenWire&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.mitov.com/products/openwire#screenshots"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/OpenWire_%28library%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.mitov.com/products/openwire#overview"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_openwire_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Origami&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://a.36krcnd.com/photo/2014/d2878df00bea4bfb782037f1683423e3.jpg"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://facebook.github.io/origami/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_origami_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Piet&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://en.wikipedia.org/wiki/Piet_%28programming_language%29#Piet"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Piet_%28programming_language%29#Piet"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.retas.de/thomas/computer/programs/useless/piet/Piet/index.html"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_piet_01.gif"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Programming Without Coding Technology&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://sourceforge.net/projects/doublesvsoop/?source=recommended"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://doublesvsoop.sourceforge.net/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_pwct_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Prograph&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://en.wikipedia.org/wiki/File:Prograph_database_operation.PNG"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Prograph"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://c2.com/cgi/wiki?PrographLanguage"&gt;官方网站??&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_prograph_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Pure Data&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://en.wikipedia.org/wiki/File:Pd_example_3.svg"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Pure_Data"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://puredata.info/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_puredata_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Quartz Composer&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://mastersofmedia.hum.uva.nl/2011/10/24/finally-it-comes-together/"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Quartz_Composer"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="https://developer.apple.com/technologies/mac/graphics-and-animation.html"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_quartz_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Reaktor&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://media.soundonsound.com/sos/oct99/images/reaktor5.gif"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Reaktor"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.native-instruments.com/en/products/komplete/synths-samplers/reaktor-5/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_reaktor_01.gif"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Scheme Bricks&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.pawfal.org/dave/blog/2010/05/scheme-bricks-for-graphics/"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://www.pawfal.org/dave/index.cgi?Projects/Scheme%20Bricks"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_schemebricks_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Scratch&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://scratch.mit.edu/projects/11126006/#editor"&gt;图片来源 1&lt;/a&gt;,   &lt;a href="http://scratch.mit.edu/projects/11126006/#editor"&gt;图片来源 2&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Scratch_%28programming_language%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://scratch.mit.edu/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_scratch_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_scratch_02.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Self&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://handbook.selflanguage.org/current/langref.html#objects"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Self_%28programming_language%29"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://selflanguage.org/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_self_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Sextante&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.gvsig.com/files/images/screenshots/gvSIG_Sextante_02.png"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://sextantegis.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_sextante_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Simulink&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.mathworks.com/products/simulink/?s_cid=wiki_simulink_8"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Simulink"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.mathworks.com/products/simulink/?s_cid=wiki_simulink_8"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_simlink_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Sikuli&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://hellotestworld.com/2012/04/27/sikuli-for-all-those-hard-to-reach-places/"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Sikuli"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.sikuli.org"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_sikuli_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;SQL Server Integration Services&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://technet.microsoft.com/en-us/library/cc917721.aspx"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/SQL_Server_Integration_Services"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.microsoft.com/en-us/sqlserver/solutions-technologies/enterprise-information-management/integration-services.aspx"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_sqlintegration_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Story Code&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://softconstructors.com/en/applications/stroycode/screenshots.html"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://softconstructors.com/en/applications/stroycode/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_stroycode_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;TextIt&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="https://textit.in/"&gt;图片来源&lt;/a&gt; 和   &lt;a href="https://textit.in/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_textit_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Touch Develop&lt;/h4&gt;
 &lt;p&gt;From Microsoft research.&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://handheld.softpedia.com/progScreenshots/TouchDevelop-Screenshot-125731.html"&gt;图片来源&lt;/a&gt; 和   &lt;a href="https://www.touchdevelop.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_touchdevelop_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Tydlig&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://tydligapp.com/images/screenshots/1-physics.png"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://tydligapp.com/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_tydlig_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;UDK&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.youtube.com/watch?v=0OR63rDN5p8"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://www.unrealengine.com/en/udk/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_udk_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Visual JForex&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://i1.ytimg.com/vi/iz5numHchGU/maxresdefault.jpg"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://www.dukascopy.com/swiss/english/forex/Visual/features/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_jforex_01.jpg"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;VUO&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://www.vjunion.se/2013/03/a-great-start-to-the-new-year/"&gt;图片来源&lt;/a&gt; 和   &lt;a href="http://vuo.org/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_vuo_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;VVVV&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://vvvv.org/contribution/vvvv.packs.image"&gt;图片来源 1&lt;/a&gt;,   &lt;a href="http://kristiansmusicproductionblog.com/wp-content/uploads/vvvv.png"&gt;图片来源 2&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Vvvv"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://www.vvvv.org/"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_vvvv_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_vvvv_02.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h4&gt;Windows Workflow Foundation&lt;/h4&gt;
 &lt;p&gt;  &lt;a href="http://fryerblog.com/post/2179029238/a-windows-workflow-foundation-example"&gt;图片来源&lt;/a&gt;,   &lt;a href="http://en.wikipedia.org/wiki/Windows_Workflow_Foundation"&gt;Wikipedia&lt;/a&gt; 和   &lt;a href="http://msdn.microsoft.com/en-us/vstudio/jj684582.aspx"&gt;官方网站&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://blog.interfacevision.com/assets/img/posts/example_visual_language_winworkflow_01.png"&gt;&lt;/img&gt;  &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;（全文完）
  &lt;div&gt;
&lt;/div&gt;&lt;/p&gt; &lt;p align="center"&gt;  &lt;strong&gt;（转载本站文章请注明作者和出处    &lt;a href="http://coolshell.cn/"&gt;酷 壳 – CoolShell.cn&lt;/a&gt; ，请勿用于任何商业用途）&lt;/strong&gt;
  &lt;div&gt;——===    &lt;strong&gt;访问     &lt;a href="http://coolshell.cn/404/" target="_blank"&gt;酷壳404页面&lt;/a&gt; 寻找遗失儿童。&lt;/strong&gt; ===——&lt;/div&gt;

  &lt;div&gt;   &lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt; &lt;h3&gt;相关文章&lt;/h3&gt; &lt;ul&gt;  &lt;li&gt;   &lt;small&gt;2012年10月14日&lt;/small&gt;    &lt;a href="http://coolshell.cn/articles/8387.html"&gt;Bret Victor – Learnable Programming&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;small&gt;2011年02月28日&lt;/small&gt;    &lt;a href="http://coolshell.cn/articles/3723.html"&gt;（麻省理工免费课程）计算机科学和编程导论&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;small&gt;2009年06月04日&lt;/small&gt;    &lt;a href="http://coolshell.cn/articles/968.html"&gt;18个Web开发的IDE&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;small&gt;2009年12月01日&lt;/small&gt;    &lt;a href="http://coolshell.cn/articles/1883.html"&gt;Coderun.com 在线开发IDE&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;small&gt;2011年05月04日&lt;/small&gt;    &lt;a href="http://coolshell.cn/articles/4657.html"&gt;狗日的开源软件许可证&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;small&gt;2012年08月20日&lt;/small&gt;    &lt;a href="http://coolshell.cn/articles/8115.html"&gt;GCC 用 C++ 来编译&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;small&gt;2011年01月28日&lt;/small&gt;    &lt;a href="http://coolshell.cn/articles/3609.html"&gt;那些炒作过度的技术和概念&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;small&gt;2013年12月03日&lt;/small&gt;    &lt;a href="http://coolshell.cn/articles/10739.html"&gt;Lua简明教程&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div&gt;  &lt;a href="http://www.zemanta.com/?wp-related-posts" rel="nofollow" target="_blank"&gt;Zemanta&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>杂项资源 编程工具 IDE Programming Visual</category>
      <guid isPermaLink="true">https://itindex.net/detail/48198-%E5%8F%AF%E8%A7%86%E5%8C%96-%E7%BC%96%E7%A8%8B</guid>
      <pubDate>Sat, 22 Feb 2014 00:27:10 CST</pubDate>
    </item>
    <item>
      <title>Java8集合中的Lambda表达式</title>
      <link>https://itindex.net/detail/46097-java8-%E9%9B%86%E5%90%88-lambda</link>
      <description>&lt;p&gt;  &lt;strong&gt;文章系本人原创，转载请保持完整性并注明出自   &lt;a href="http://www.raychase.net/1629"&gt;《四火的唠叨》&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" border="0" height="182" src="http://www.raychase.net/wp-content/uploads/2013/10/lambda.png" title="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" width="400"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;本文翻译自《  &lt;a href="http://zeroturnaround.com/rebellabs/java-8-explained-applying-lambdas-to-java-collections/"&gt;Java 8 Explained: Applying Lambdas to Java Collections&lt;/a&gt;》。&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://zeroturnaround.com/rebellabs/java-8-the-first-taste-of-lambdas/"&gt;Lambdas&lt;/a&gt;表达式是Java 8的主题，在Java平台上我们期待了很久。但是，如果如果我们不在集合中使用它的话，就损失了很大价值。把现有接口迁移成为lambda风格接口的问题已经通过  &lt;a href="http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/"&gt;default methods&lt;/a&gt;，也就是defender methods解决了。在这篇文章里面我们来看一看Java集合里面的  &lt;a href="http://openjdk.java.net/jeps/107" target="_blank"&gt;批量数据操作&lt;/a&gt;（bulk operation）。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;批量操作&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;最初的变更文档已经说了，批量操作是“给Java集合框架添加的用以批量操作数据的功能，而它是基于lambda函数实现的”。引用的话也就是在说，lambda移植到Java 8对我来说的实际目的，就是它提供了一种新的使用集合的方式，这也是最重要的特性，表达式操作符可以并行执行，并且lambda是一个比常规表达式操作符更好的工具。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;内部和外部的迭代&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;历史上，Java集合是不能够表达内部迭代的，而只提供了一种外部迭代的方式，也就是for或者while循环。要描述内部迭代，我们需要用到LambdaJ这样的类库：&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;List persons = asList(new Person(&amp;quot;Joe&amp;quot;), new Person(&amp;quot;Jim&amp;quot;), new Person(&amp;quot;John&amp;quot;));
forEach(persons).setLastName(&amp;quot;Doe&amp;quot;);&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;从上面的例子可以看出，我们不需要关心last name是怎么被设置到每一个person对象里面去的，也许这样的行为是支持并发执行的。现在我们可以在Java 8中使用类似的表达了：&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;persons.forEach(p -&amp;gt; p.setLastName(&amp;quot;Doe&amp;quot;))&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;内部迭代其实和集合的批量操作并没有密切的联系，这只是一个小小的特性，借助它我们感受到语法表达上的变化。真正有意思的和批量操作相关的是新的流（stream）API。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;流API&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;新的  &lt;a href="http://javadocs.techempower.com/jdk18/api/java/util/stream/package-summary.html"&gt;java.util.stream&lt;/a&gt;包已经添加进JDK了，现在我们可以借助Java 8执行filter/map/reduce风格的操作了。&lt;/p&gt;
 &lt;p&gt;流API允许我们声明对数据进行串行或者并行的操作：&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;List persons = …   // sequential version
Stream stream = persons.stream();   //parallel version
Stream parallelStream = persons.parallelStream();&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://javadocs.techempower.com/jdk18/api/java/util/stream/Stream.html"&gt;java.util.stream.Stream&lt;/a&gt;接口提供了批量数据操作的入口，取得了对流实例的引用，我们就可以对集合执行如下有趣的任务了：&lt;/p&gt;
 &lt;p&gt;Filter&lt;/p&gt;
 &lt;p&gt;在数据流中实现过滤功能是首先我们可以想到的最自然的操作了。Stream接口暴露了一个filter方法，它可以接受表示操作的  &lt;a href="http://javadocs.techempower.com/jdk18/api/java/util/function/Predicate.html" target="_blank"&gt;Predicate&lt;/a&gt;实现来使用定义了过滤条件的lambda表达式。&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;List persons = …
Stream personsOver18 = persons.stream().filter(p -&amp;gt; p.getAge() &amp;gt; 18);&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;Map&lt;/p&gt;
 &lt;p&gt;假使我们现在过滤了一些数据，比如转换对象的时候。Map操作允许我们执行一个  &lt;a href="http://javadocs.techempower.com/jdk18/api/java/util/function/Function.html" target="_blank"&gt;Function&lt;/a&gt;的实现（Function&amp;lt;T,R&amp;gt;的泛型T,R分别表示执行输入和执行结果），它接受入参并返回。首先，让我们来看看怎样以匿名内部类的方式来描述它：&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;Stream students = persons.stream()
      .filter(p -&amp;gt; p.getAge() &amp;gt; 18)
      .map(new Function() {
                  @Override
                  public Student apply(Person person) {
                     return new Student(person);
                  }
              });&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;现在，把上述例子转换成使用lambda表达式的写法：&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;Stream map = persons.stream()
        .filter(p -&amp;gt; p.getAge() &amp;gt; 18)
        .map(person -&amp;gt; new Student(person));&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;Lambda在把参数传给map方法的时候，实际却并没有使用这个参数，那么我们就可以写成这样：&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;Stream map = persons.stream()
        .filter(p -&amp;gt; p.getAge() &amp;gt; 18)
        .map(Student::new);&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;Collect&lt;/p&gt;
 &lt;p&gt;“流”抽象天生就该是持续的，我们使用流来描述操作，但是如果我们要获取最终结果的话，必须收集流产生的最终结果。Stream API提供了一系列“最终”的方法，  &lt;a href="http://javadocs.techempower.com/jdk18/api/java/util/stream/Stream.html#collect(java.util.stream.Collector)"&gt;collect()&lt;/a&gt;方法就是其中的一个，我们借此可以收集操作的最终结果：&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;List students = persons.stream()
        .filter(p -&amp;gt; p.getAge() &amp;gt; 18)
        .map(Student::new)
        .collect(new Collector&amp;gt;() { … });&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;幸运的是，大多数情况下你不需要自己实现  &lt;a href="http://javadocs.techempower.com/jdk18/api/java/util/stream/Collector.html"&gt;Collector&lt;/a&gt;接口，而是利用  &lt;a href="http://javadocs.techempower.com/jdk18/api/java/util/stream/Collectors.html"&gt;Collectors&lt;/a&gt;工具类：&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;List students = persons.stream()
        .filter(p -&amp;gt; p.getAge() &amp;gt; 18)
        .map(Student::new)
        .collect(Collectors.toList());&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;或者，如果我们想使用特定的实现类来收集结果：&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;pre&gt;List students = persons.stream()
        .filter(p -&amp;gt; p.getAge() &amp;gt; 18)
        .map(Student::new)
        .collect(Collectors.toCollection(ArrayList::new));&lt;/pre&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;并行和串行&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;一个使用新的Stream API有趣的特性是它从来都不需要所谓串行或者并行的方法，可以从一开始就并行地消费数据，或者在处理流中的任意时刻转为串行的。&lt;/p&gt;
 &lt;pre&gt;List students = persons.stream()
        .parallel()
        .filter(p -&amp;gt; p.getAge() &amp;gt; 18)  // filtering will be performed concurrently
        .sequential()
        .map(Student::new)
        .collect(Collectors.toCollection(ArrayList::new));&lt;/pre&gt;
 &lt;p&gt;这里有隐藏的一点是，数据处理的并行部分会自动地自我管理，不需要我们自己来处理并发的问题。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;好了，要结束了。新的Stream API和lambda表达式给Java 8带来了很多新的特性。当然，在这篇文章以外还有很多没有谈及到，但愿很快我可以给你带给你更多有趣的特性。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;文章系本人原创，转载请保持完整性并注明出自   &lt;a href="http://www.raychase.net/1629"&gt;《四火的唠叨》&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
 &lt;div&gt;分享到：  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#26032;&amp;#28010;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#33150;&amp;#35759;&amp;#24494;&amp;#21338;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;QQ&amp;#31354;&amp;#38388;"&gt;&lt;/a&gt;  &lt;a href="javascript:var b=document.body;var GR________bookmarklet_domain='http://www.google.com';if(b&amp;&amp;!document.xmlVersion){void(z=document.createElement('script'));void(z.src='http://www.google.com/reader/ui/link-bookmarklet.js');void(b.appendChild(z));}else{}" title="&amp;#20998;&amp;#20139;&amp;#21040;Google Reader"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#20154;&amp;#20154;&amp;#32593;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#35910;&amp;#29923;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#40092;&amp;#26524;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#24320;&amp;#24515;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;Follow5"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#21516;&amp;#23398;&amp;#32593;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#22016;&amp;#21653;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#39277;&amp;#21542;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#20570;&amp;#21861;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;&amp;#30334;&amp;#24230;&amp;#25910;&amp;#34255;"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#20998;&amp;#20139;&amp;#21040;twitter"&gt;&lt;/a&gt;  &lt;a href="javascript:void(0);" title="&amp;#28155;&amp;#21152;&amp;#21040;&amp;#25910;&amp;#34255;&amp;#22841;"&gt;&lt;/a&gt;&lt;/div&gt; &lt;div&gt;你可能也喜欢：&lt;/div&gt; &lt;ul&gt;  &lt;li&gt;   &lt;a href="http://www.raychase.net/1098" title="Java&amp;#30340;&amp;#26085;&amp;#26399;API&amp;#30495;&amp;#28866;"&gt;    &lt;img alt="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" height="150" src="http://www.raychase.net/wp-content/uploads/2012/12/date-150x150.jpg" title="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" width="150"&gt;&lt;/img&gt;&lt;/a&gt;   &lt;a href="http://www.raychase.net/1098" title="Java&amp;#30340;&amp;#26085;&amp;#26399;API&amp;#30495;&amp;#28866;"&gt;Java的日期API真烂&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;a href="http://www.raychase.net/924" title="C++&amp;#31243;&amp;#24207;&amp;#21592;&amp;#21644;Java&amp;#31243;&amp;#24207;&amp;#21592;&amp;#30340;&amp;#24046;&amp;#24322;"&gt;    &lt;img alt="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" height="150" src="http://www.raychase.net/wp-content/uploads/2012/10/C_Java-150x150.jpg" title="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" width="150"&gt;&lt;/img&gt;&lt;/a&gt;   &lt;a href="http://www.raychase.net/924" title="C++&amp;#31243;&amp;#24207;&amp;#21592;&amp;#21644;Java&amp;#31243;&amp;#24207;&amp;#21592;&amp;#30340;&amp;#24046;&amp;#24322;"&gt;C++程序员和Java程序员的差异&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;a href="http://www.raychase.net/753" title="&amp;#20320;&amp;#30495;&amp;#30340;&amp;#31934;&amp;#36890;Java&amp;#21527;&amp;#65311;"&gt;    &lt;img alt="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" height="150" src="http://www.raychase.net/wp-content/uploads/2012/10/java-107x150.jpg" title="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" width="107"&gt;&lt;/img&gt;&lt;/a&gt;   &lt;a href="http://www.raychase.net/753" title="&amp;#20320;&amp;#30495;&amp;#30340;&amp;#31934;&amp;#36890;Java&amp;#21527;&amp;#65311;"&gt;你真的精通Java吗？&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;a href="http://www.raychase.net/698" title="Java&amp;#22810;&amp;#32447;&amp;#31243;&amp;#21457;&amp;#23637;&amp;#31616;&amp;#21490;"&gt;    &lt;img alt="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" height="150" src="http://www.raychase.net/wp-content/uploads/2012/09/image-150x150.png" title="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" width="150"&gt;&lt;/img&gt;&lt;/a&gt;   &lt;a href="http://www.raychase.net/698" title="Java&amp;#22810;&amp;#32447;&amp;#31243;&amp;#21457;&amp;#23637;&amp;#31616;&amp;#21490;"&gt;Java多线程发展简史&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;   &lt;a href="http://www.raychase.net/180" title="&amp;#26434;&amp;#35760;&amp;#65306;Java&amp;#30340;&amp;#26080;&amp;#38145;&amp;#32534;&amp;#31243;&amp;#21644;&amp;#38145;&amp;#20248;&amp;#21270;"&gt;    &lt;img alt="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" height="150" src="http://www.raychase.net/wp-content/uploads/2012/06/image18-150x150.png" title="Java8&amp;#38598;&amp;#21512;&amp;#20013;&amp;#30340;Lambda&amp;#34920;&amp;#36798;&amp;#24335;" width="150"&gt;&lt;/img&gt;&lt;/a&gt;   &lt;a href="http://www.raychase.net/180" title="&amp;#26434;&amp;#35760;&amp;#65306;Java&amp;#30340;&amp;#26080;&amp;#38145;&amp;#32534;&amp;#31243;&amp;#21644;&amp;#38145;&amp;#20248;&amp;#21270;"&gt;杂记：Java的无锁编程和锁优化&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Programming Paradigms Java lambda 集合</category>
      <guid isPermaLink="true">https://itindex.net/detail/46097-java8-%E9%9B%86%E5%90%88-lambda</guid>
      <pubDate>Fri, 18 Oct 2013 20:52:16 CST</pubDate>
    </item>
    <item>
      <title>在 HTML 內嵌 JSON object 時要注意的事情…</title>
      <link>https://itindex.net/detail/47449-html-json-object</link>
      <description>&lt;p&gt;有時候我們會因為效能問題，在 HTML 內嵌入 JSON object，而不是再多一個 HTTP request 取得。&lt;/p&gt;
 &lt;p&gt;但「嵌入」的行為如果沒有處理好，就產生非常多 XSS attack vector 可以玩。&lt;/p&gt;
 &lt;p&gt;首先最常犯的錯誤是使用錯誤的 escape function：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script&amp;gt;
var a = &amp;quot;&amp;lt;?= addslashes($str) ?&amp;gt;&amp;quot;;
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
 &lt;p&gt;這樣可以用   &lt;code&gt;&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;alert(1);//&lt;/code&gt; 攻擊   &lt;code&gt;$str&lt;/code&gt;。因為   &lt;code&gt;   &lt;a href="http://php.net/manual/en/function.addslashes.php"&gt;addslashes&lt;/a&gt;()&lt;/code&gt; 並不會過濾到這個字串，而產生這樣的 HTML：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script&amp;gt;
var a = &amp;quot;&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;alert(1);//&amp;quot;;
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
 &lt;p&gt;而這個字串會造成 DOM parser 解讀上產生不是我們預期的行為：&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://i.imgur.com/yiA8yFl.png"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;可以看到在字串裡面的   &lt;code&gt;&amp;lt;/script&amp;gt;&lt;/code&gt; 被拆開了。&lt;/p&gt;
 &lt;p&gt;這是因為瀏覽器會先拆解產生 DOM tree，再把   &lt;code&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; 內的程式碼交給 JavaScript engine 處理。所以在一開始產生 DOM tree 的時候，是看不懂 JavaScript 程式邏輯的…&lt;/p&gt;
 &lt;p&gt;正確的方法是用   &lt;code&gt;   &lt;a href="http://php.net/manual/en/function.json-encode.php"&gt;json_encode&lt;/a&gt;()&lt;/code&gt; 處理，因為   &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt; 的   &lt;code&gt;json_encode()&lt;/code&gt; 預設會把   &lt;code&gt;/&lt;/code&gt; (slash) 變成   &lt;code&gt;\/&lt;/code&gt; (這是 JSON spec 裡合法的轉換)：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script&amp;gt;
var a = &amp;lt;?= json_encode($str) ?&amp;gt;;
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
 &lt;p&gt;這會產生出：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script&amp;gt;
var a = &amp;quot;&amp;lt;\/script&amp;gt;&amp;lt;script&amp;gt;alert(1);//&amp;quot;;
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
 &lt;p&gt;但上面這段 HTML 與 PHP code 仍然有問題，如果   &lt;code&gt;$str&lt;/code&gt; 是   &lt;code&gt;&amp;lt;!--&amp;lt;script&lt;/code&gt; 時，你會發現 DOM 又爛掉了：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script&amp;gt;
var a = &amp;quot;&amp;lt;!--&amp;lt;script&amp;gt;&amp;quot;;
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
 &lt;p&gt;  &lt;img alt="" src="http://i.imgur.com/Ofagrin.png"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;而   &lt;a href="http://escape.alf.nu/"&gt;escape.alf.nu&lt;/a&gt; 的 Level 15 就是利用這個問題，再加上其他的漏洞而完成 XSS 攻擊。&lt;/p&gt;
 &lt;p&gt;為了這個問題去 StackOverflow 上問：「  &lt;a href="http://stackoverflow.com/questions/20942452/why-does-script-cause-a-dom-tree-break-on-the-browser"&gt;Why does &amp;lt;!–&amp;lt;script&amp;gt; cause a DOM tree break on the browser?&lt;/a&gt;」，才又發現上面這段 code 並不是合法的 HTML5 (先不管 head &amp;amp; title 的部份，補上後仍然不是合法的 HTML5)。&lt;/p&gt;
 &lt;p&gt;原因在於 DOM parser 對   &lt;code&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; 的特殊處理：「  &lt;a href="http://www.w3.org/TR/html5/scripting-1.html#restrictions-for-contents-of-script-elements"&gt;4.3.1.2 Restrictions for contents of script elements&lt;/a&gt;」。(話說這段 ABNF 差點讓我翻桌…)&lt;/p&gt;
 &lt;p&gt;解法是在   &lt;code&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; 的開頭與結尾加上 HTML 註解：(這剛好是   &lt;a href="http://www.w3.org/TR/REC-html40/"&gt;HTML 4.01&lt;/a&gt; 建議的方法)&lt;/p&gt;
 &lt;pre&gt;&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script&amp;gt;
&amp;lt;!--
var a = &amp;quot;&amp;lt;!--&amp;lt;script&amp;gt;&amp;quot;;
--&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
 &lt;p&gt;  &lt;img alt="" src="http://i.imgur.com/H4YzEmY.png"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;那段 ABNF 的目的是希望可以盡可能往後找到   &lt;code&gt;--&amp;gt;&lt;/code&gt; 與   &lt;code&gt;&amp;lt;/script&amp;gt;&lt;/code&gt; 結尾的地方。&lt;/p&gt;
 &lt;p&gt;當然你也可以用   &lt;code&gt;json_encode()&lt;/code&gt; 的   &lt;code&gt;JSON_HEX_TAG&lt;/code&gt; 把   &lt;code&gt;&amp;lt;&lt;/code&gt; 與   &lt;code&gt;&amp;gt;&lt;/code&gt; 硬轉成   &lt;code&gt;\u003c&lt;/code&gt; 與   &lt;code&gt;\u003e&lt;/code&gt; 避開這個問題，但這使得呼叫   &lt;code&gt;json_encode()&lt;/code&gt; 時要多一個參數 (而非預設參數)，用起來比較卡…&lt;/p&gt;
 &lt;p&gt;這個問題會變得這麼討厭，是因為 DOM parser 與 JavaScript 語法之間有各自的處理方式，然後又有些 pattern 是之前的 spec 遺留下來的包袱 (像是 HTML 4.01 在「  &lt;a href="http://www.w3.org/TR/REC-html40/interact/scripts.html#h-18.3.2"&gt;18.3.2 Hiding script data from user agents&lt;/a&gt;」裡有提到用   &lt;code&gt;&amp;lt;!--&lt;/code&gt; 與   &lt;code&gt;--&amp;gt;&lt;/code&gt; 包裝   &lt;code&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;)，變成在設計 HTML5 時都要考慮進去相容…&lt;/p&gt;
 &lt;p&gt;之前會習慣用   &lt;code&gt;&amp;lt;!--&lt;/code&gt; 與   &lt;code&gt;//--&amp;gt;&lt;/code&gt; 包裝   &lt;code&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; 倒不是這個原因，而是因為不這樣做的話，  &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 在 IE 使用   &lt;code&gt;   &lt;a href="http://api.jquery.com/html/"&gt;html&lt;/a&gt;()&lt;/code&gt; 時遇到有   &lt;code&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; 的字串會爛掉，所以後來寫的時候變成習慣了…&lt;/p&gt;
 &lt;p&gt;反而因為這個習慣而避開了這個問題…&lt;/p&gt;
 &lt;p&gt;超難搞啊…  &lt;br /&gt;
&lt;/p&gt; &lt;h3&gt;Related Posts:&lt;/h3&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;a href="http://blog.gslin.org/archives/2013/12/27/4012/filter-input-escape-output/" title="Filter Input &amp; Escape Output&amp;#8230;"&gt;Filter Input &amp;amp; Escape Output…&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://blog.gslin.org/archives/2013/08/16/3434/%e6%96%b0%e7%9a%84-https-%e6%94%bb%e6%93%8a%ef%bc%9abreach-compression-attack/" title="&amp;#26032;&amp;#30340; HTTPS &amp;#25915;&amp;#25802;&amp;#65306;BREACH Compression Attack"&gt;新的 HTTPS 攻擊：BREACH Compression Attack&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://blog.gslin.org/archives/2013/02/05/3174/ssltls-%e7%9a%84%e5%95%8f%e9%a1%8c/" title="SSL/TLS &amp;#30340;&amp;#21839;&amp;#38988;&amp;#8230;"&gt;SSL/TLS 的問題…&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://blog.gslin.org/archives/2013/01/10/3122/iframe-%e7%9a%84-sandbox-%e5%8a%9f%e8%83%bd/" title="iframe &amp;#30340; sandbox &amp;#21151;&amp;#33021;&amp;#8230;"&gt;iframe 的 sandbox 功能…&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://blog.gslin.org/archives/2012/11/18/3031/%e8%99%9b%e6%93%ac%e6%a9%9f%e5%85%a7%e7%9a%84-side-channel-attack/" title="&amp;#34395;&amp;#25836;&amp;#27231;&amp;#20839;&amp;#30340; Side-channel attack&amp;#8230;"&gt;虛擬機內的 Side-channel attack…&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Computer Murmuring Network Programming Security</category>
      <guid isPermaLink="true">https://itindex.net/detail/47449-html-json-object</guid>
      <pubDate>Mon, 06 Jan 2014 16:23:19 CST</pubDate>
    </item>
    <item>
      <title>Hadoop工程师成为热门职业</title>
      <link>https://itindex.net/detail/33941-hadoop-%E5%B7%A5%E7%A8%8B%E5%B8%88-%E8%81%8C%E4%B8%9A</link>
      <description>JP摩根大通总经理Larry Feinsmith在纽约举行的Hadoop World 2011会议上发表了主题演讲，公开声明高薪招聘精通Hadoop的软件工程师。Hadoop是一个顶级Apache开源项目，主要被应用于分析大数据集，被eBay、Facebook、Yahoo、AOL和Twitter等互联网公司广泛采用，今年微软、IBM和甲骨文也都纷纷拥抱Hadoop。JP摩根大通在全球有超过24.5万雇员，其中IT雇员2.5万，每年的IT开支在80亿美元左右，该公司已经使用Hadoop超过三年的时间，用它分析150 petabytes的在线数据。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/19fa0fa8/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=Hadoop%E5%B7%A5%E7%A8%8B%E5%B8%88%E6%88%90%E4%B8%BA%E7%83%AD%E9%97%A8%E8%81%8C%E4%B8%9A&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F11%2F10%2F104208%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=Hadoop%E5%B7%A5%E7%A8%8B%E5%B8%88%E6%88%90%E4%B8%BA%E7%83%AD%E9%97%A8%E8%81%8C%E4%B8%9A&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F11%2F10%2F104208%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/118097963784/u/49/f/556826/c/33236/s/19fa0fa8/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/118097963784/u/49/f/556826/c/33236/s/19fa0fa8/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=9WE-GjB-qL4:V06l33GcvbY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=9WE-GjB-qL4:V06l33GcvbY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/33941-hadoop-%E5%B7%A5%E7%A8%8B%E5%B8%88-%E8%81%8C%E4%B8%9A</guid>
      <pubDate>Thu, 10 Nov 2011 18:00:00 CST</pubDate>
    </item>
    <item>
      <title>开放式前端类库的构建</title>
      <link>https://itindex.net/detail/34588-%E5%BC%80%E6%94%BE-%E5%89%8D%E7%AB%AF-%E7%B1%BB%E5%BA%93</link>
      <description>&lt;p&gt;hax 的文章很不错：&lt;a href="http://hax.iteye.com/blog/1128269"&gt;关于国内前端和 JS 技术发展的乱想&lt;/a&gt;&lt;br&gt;
愚公贴出了四个月前的聊天记录，如今再读，别有一番滋味：&lt;a href="http://blog.csdn.net/aimingoo/article/details/6619705"&gt;我们需要什么样的“技术”&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我当时也留存了一些感想，索性也贴出来：&lt;br&gt;
———————————————————————&lt;br&gt;
这是一篇改变我很多想法的文章：&lt;a href="http://www.aka.org.cn/Docs/c&amp;amp;b.html"&gt;大教堂和集市&lt;/a&gt;。老文章，很耐读，最近放在 iPhone 上，没事就看看，烂熟。&lt;/p&gt;
&lt;p&gt;世界上有很多聪明人，很多事情已经做得非常棒。有太多更需要投入的地方，的确不应该在别人已经做得很好的地方浪费时间了。&lt;/p&gt;
&lt;p&gt;遇到 jquery 的问题，通过 google 一搜，十有八九就能搜到结果，这就是社区。&lt;/p&gt;
&lt;p&gt;在公司做事，有两件事情很重要：（1）做什么事；（2）和什么人做事。其他都是浮云。&lt;/p&gt;
&lt;p&gt;“天时”是个很奇妙的东西。当有一帮兄弟在召唤你，当有一件事情在吸引你的时候，就是“天时”。当然还需 “地利”和“人和”。在公司环境下，“地利”经常会限制很多想法思路。&lt;/p&gt;
&lt;p&gt;步子迈大了，的确可能扯痛蛋，但也仅仅是蛋痛一下下而已。倘若步子迈小了，短时间内蛋不会痛，但却有可能永远错失超越的机遇。&lt;/p&gt;
&lt;p&gt;如果你选择一条保守的线路，就只能实现一个狭窄的目标。&lt;/p&gt;
&lt;p&gt;大教堂是个梦，很美。人人都想做。&lt;/p&gt;
&lt;p&gt;百花齐放的目的，是让每个人都能成为类库/框架的开发者，就和 github 一样。不是形式上的分布式开发，而是内容上也分布式。打散了，物竞天择，人类社会就是这么演化的。&lt;/p&gt;
&lt;p&gt;避免重复是很好的实践原则。懂得适量重复，是更高层次的实践。&lt;/p&gt;
&lt;p&gt;没有自由，就没有突破。社会如此，写代码也如此。&lt;br&gt;
———————————————————————&lt;/p&gt;
&lt;p&gt;下面是读完 hax 文章后，对 seajs 的一些想法：&lt;br&gt;
&lt;span&gt;&lt;/span&gt;&lt;br&gt;
es5-shim 这一块，hax 和我的想法很相近。我的想法是，seajs 提供一个 conditional load plugin，当探测到当前浏览器缺少哪些 es5 的东东时，自动修复好。这样，所有模块都可以直接基于 es5 来开发，而且对开发者是透明的。&lt;/p&gt;
&lt;p&gt;更进一步，还可提供 less 和 coffeescript 等编译扩展。使得基于 seajs 做开发时，可以直接用 less 写 css，用 coffee 语法写 js. 这样可以提前实现将 javascript 变成编译目标语言的愿景，使得 js 的开发直接可利用上最新技术。&lt;/p&gt;
&lt;p&gt;基于模块环境 + 模块的方式来构建类库，最难的是模块环境要具有通用性，目前 commonjs 和 nodejs 的努力，使模块环境逐步成熟。其次就是各种模块的筛选和开发了，我早就想拆掉 kissy，只恨目前力又不逮。如果 qwrap 能拆分成多个小类库，绝对支持。拆分的好处，可能会造成少量重复，但好处是更灵活，更自由了。因为小了，意味着可替换性更好，这样，有现成做得不错的，直接拿来用就好。如果找不到满意的，大不了自己开发一个，满足自己的需求同时也能贡献给社区。这是一种良性竞争下的百花齐放。&lt;/p&gt;
&lt;p&gt;这样，逐步努力下去，就会形成一个生态圈。生态圈呀，一旦形成，所有人都会受益。希望我不是在作梦。&lt;/p&gt;
&lt;p&gt;————————————&lt;br&gt;
最后放一个在 MPD 大会的分享，没什么新内容，不好意思：&lt;br&gt;
&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/34588-%E5%BC%80%E6%94%BE-%E5%89%8D%E7%AB%AF-%E7%B1%BB%E5%BA%93</guid>
      <pubDate>Wed, 20 Jul 2011 16:16:04 CST</pubDate>
    </item>
    <item>
      <title>也谈前端基础设施建设</title>
      <link>https://itindex.net/detail/34585-%E5%89%8D%E7%AB%AF-%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD-%E5%BB%BA%E8%AE%BE</link>
      <description>&lt;p&gt;克军昨天的分享不错：&lt;a href="http://www.slideshare.net/kejun/ss-9413262"&gt;前端基础架构的实践和思考&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;从 2009 年起，也一直在想这些事。受克军启发，梳理成一张图：&lt;br&gt;
&lt;a href="http://lifesinger.files.wordpress.com/2011/09/fed_infrastructure.png"&gt;&lt;img src="http://lifesinger.files.wordpress.com/2011/09/fed_infrastructure.png" alt="" title="fed_infrastructure" width="700" height="273"&gt;&lt;/a&gt;&lt;br&gt;
(请点击小图看大图)&lt;/p&gt;
&lt;p&gt;几点说明：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将“架构”换成了“设施”，对应的英文是 Infrastructure. 感觉用“设施”更能精准表达原意。&lt;/li&gt;
&lt;li&gt;克军的大分类是设施的形态：是一个工具，还是一份规范，或是一个系统。这样分类不错，但系统和工具之间感觉很难区分，系统可以包含工具，工具可以是一个系统。&lt;/li&gt;
&lt;li&gt;这里从前端开发涉及的流程来划分：需求阶段 — 开发阶段 — 部署阶段 — 上线后。然后看每个阶段，需要哪些基础设施建设。想清楚后，前端的 Infrastructure 也就出来了。&lt;/li&gt;
&lt;li&gt;需求阶段，一个快速原型工具，无论对交互还是前端，都是非常有用的。目前淘宝用的是 Axure RP.&lt;/li&gt;
&lt;li&gt;开发阶段是重点。规范、流程有利于团队协作，类库、框架可以让业务代码有一个很好的开发基础，工具可以提高工作效率，测试能保障代码质量。&lt;/li&gt;
&lt;li&gt;单独把部署阶段放出来，是因为前端在这一块还很薄弱，有很多可做的事。比如代码的压缩、模块的依赖分析和打包等。这些工作也可以放在开发阶段，但那样会增加前端的工作量。放在部署阶段，可做到自动化。前端写好源码后，提交就好，压缩等操作，交给平台来做。&lt;/li&gt;
&lt;li&gt;上线后，主要是监控分析。很重要的一块，前端可做的事情不少。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注意：这张图仅是 Infrastructure Sketch. 每个公司，每个团队，应该根据自己的实际情况进行筛选和调整。适合自己的才是最好的。&lt;/p&gt;
&lt;p&gt;除了前端基础设施，克军 slide 里还谈到了前端团队的角色定位：“&lt;strong&gt;前端开发在设计部门是过去时，现在更适合在技术部门&lt;/strong&gt;”，深以为然。&lt;/p&gt;
&lt;p&gt;最后，回到克军谈到的“转变”：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前端在做什么&lt;/strong&gt;：以前做 Web Pages, 现在逐步转向 Web Apps. 在淘宝还不明显，但趋势是无疑的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端在什么地方做&lt;/strong&gt;：以前是 Browsers, 现在增加了 Mobile, Server 等，前端可做的事情大大延伸了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端怎么做&lt;/strong&gt;：以前是写 demo, 现在越来越直接开发代码，与服务端通过数据接口来协作。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上转变，能让前端逐步脱离“页面实现者”的定位，转而变成软件开发的正规军，并踏上创新之路。&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/34585-%E5%89%8D%E7%AB%AF-%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD-%E5%BB%BA%E8%AE%BE</guid>
      <pubDate>Mon, 26 Sep 2011 16:09:11 CST</pubDate>
    </item>
    <item>
      <title>在 Linux 下開發 C/C++ 的新手指南</title>
      <link>https://itindex.net/detail/35345-linux-%E6%89%8B%E6%8C%87</link>
      <description>&lt;p&gt;新加入一個專案，最先面對的課題是如何正確地編譯和執行專案，可從   &lt;a href="http://nebulousarion.wordpress.com/2008/02/23/top-20-replies-by-programmers-when-their-programs-do-not-work/"&gt;&amp;quot;It works on my machine&amp;quot; &lt;/a&gt; 如此地風行，印證這件事的困難性；再來則是閱讀負責工作相關的程式碼。至於發揮程式語言的特性，運用高階設計模式等，都是另開新專案或熟悉狀況後才有機會發揮。 &lt;/p&gt; &lt;p&gt;過去數年沉浸在愉快的 scripting language 和開發新專案中，一直沒踏入這殘酷的世界。這篇記錄在這樣的情境下，可能需要的技能，結算一下這一個多月的心得，全都是血淚談啊 ...。&lt;/p&gt; &lt;h4&gt;系統工具&lt;/h4&gt; &lt;p&gt;熟悉作業系統的安裝套件是首要之務，這樣才知道如何補足需要的 header、library，或是安裝含 debug symbol 版的函式庫以執行 gdb 觀察程式或除錯。參見  &lt;a href="http://fcamel-life.blogspot.com/2012/01/debug-symbol-package.html"&gt;《自行編譯含 debug symbol 的套件 (package)》&lt;/a&gt;了解 Ubuntu/Debian 下的套件命名規則。 &lt;/p&gt; &lt;p&gt;在未安裝套件的情況下，可用&lt;/p&gt; &lt;ul&gt;  &lt;li&gt; aptitude search SUBSTRING # 找套件&lt;/li&gt;  &lt;li&gt; aptitude show PACKAGE # 顯示套件用途&lt;/li&gt;  &lt;li&gt; apt-file search X # 找出 X 包在那個套件裡，找 header 時很有用。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;注意在用 apt-file 前要先跑 sudo apt-file update，不然搜不出東西來。 &lt;/p&gt; &lt;p&gt;對於已安裝套件，可用&lt;/p&gt; &lt;ul&gt;  &lt;li&gt; dpkg --search SUBSTRING # 找出安裝在那個套件，已知 header 時，適合用來找 library&lt;/li&gt;  &lt;li&gt; dpkg -L PACKAGE # 列出套件內容，可用來找 header、library&lt;/li&gt;  &lt;li&gt; locate SUBSTRING # 我比較常用它找 header 的位置，再觀看 header 內容&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;執行 locate 前記得先執行 sudo updatedb，原因同 apt-file。 &lt;/p&gt; &lt;h4&gt;編譯&lt;/h4&gt; &lt;ul&gt;  &lt;li&gt; 參考   &lt;a href="http://fcamel-life.blogspot.com/2011/12/undefined-symbol-reference.html"&gt;《解決 undefined symbol / reference》&lt;/a&gt;了解整個編譯的流程，先有觀念才清楚問題的環節，才能選對工具檢查問題。&lt;/li&gt;  &lt;li&gt; 另在   &lt;a href="http://fcamel-life.blogspot.com/2012/01/c-c.html"&gt;《從 C 呼叫 C++ 函式的過程理解程式編譯、連結的原理》&lt;/a&gt;以一個小個案，從另一個角度描述編譯的流程來除錯。&lt;/li&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2012/01/debug-info-optimization.html"&gt;《debug info 和 optimization》&lt;/a&gt;提到 -O 和 -g 可同時用，以及注意事項。&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;連結&lt;/h4&gt; &lt;p&gt;這一塊是我目前最頭痛的地方，大多卡在這裡。一些粗淺心得:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2011/12/list-shared-library.html"&gt;《列出用到的 shared library》&lt;/a&gt;。&lt;/li&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2011/12/linking-time.html"&gt;《加速 linking time》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;之後還需抽時間補充相關知識，像是 ldconfig 如何運作。 &lt;/p&gt; &lt;h4&gt;執行&lt;/h4&gt; &lt;p&gt;光只是讀程式碼就像大海撈針一樣，不太有效率。可從動態執行過程找出主要執行的路徑，再專注相關的程式碼。 &lt;/p&gt; &lt;p&gt;1. strace 和 ltrace &lt;/p&gt; &lt;p&gt;srace 是分析執行行為的強大工具，google 一下會看到很多別人的個案心得，看看再自己試一試，很快能上手，不知能發揮它多少功能。這裡列自己用的兩個小案例:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2011/12/stracedebugger.html"&gt;《善用 strace、debugger 從執行期間找出問題根源》&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2012/01/blog-post.html"&gt;《熟悉系統工具好處多多》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;反而是 ltrace 一直都想不到使用它的時機，也沒找到好的個案心得文。 &lt;/p&gt; &lt;p&gt;2. gdb &lt;/p&gt; &lt;p&gt;gdb 的重要性不需多說明，之前的幾則心得:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2012/01/gdb.html"&gt;《gdb 初步心得》&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2011/12/core-dump-cgdb.html"&gt;《打開 core dump 和使用 cgdb 檢查程式掛點原因》&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2012/01/glibc.html"&gt;《追踪 glibc 裡的程式》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;強烈建議使用   &lt;a href="http://cgdb.sourceforge.net/"&gt;cgdb&lt;/a&gt;，簡易安裝 + 無痛上手，瞬間省下大量操作和讀碼的時間。 &lt;/p&gt; &lt;p&gt;3. 打開除錯功能 &lt;/p&gt; &lt;p&gt;依照開發者的習性，一定會留後門讓自己方便除錯，從這角度下手也可省下不少時間:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2011/12/cc-debug.html"&gt;《C/C++ 檢查和打開 debug 功能的小技巧》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;4. 載入函式庫&lt;/p&gt; &lt;ul&gt;  &lt;li&gt; 若在編譯、連結時無法解決相依問題，可考慮偷吃步   &lt;a href="http://fcamel-life.blogspot.com/2011/09/ldpreload.html"&gt;在載入程式時用 LD_PRELOAD 換掉部份函式&lt;/a&gt;。&lt;/li&gt;  &lt;li&gt; 另外備忘用 LD_LIBRARY_PATH 補充載入 shared library 的位置，目前仍沒用過它。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;除以上所言外，我另外有找過畫出程式流程的靜態和動態分析工具，像是畫 call graph 或是 C 的 cflow。不過 C++ 的靜態分析效果很糟，就沒花太多時間研究。目前用 strace 和 gdb 覺得已夠用了，不知用工具產生 call graph、class 相依圖或其它東西，是否會更有幫助。待有需求看整體的程式時再來試試。  &lt;br /&gt;&lt;/p&gt; &lt;h4&gt;閱讀程式碼&lt;/h4&gt; &lt;p&gt;聽了大家的建議後，做了一些實際操作，而有些心得:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2011/12/cc.html"&gt;《閱讀 C/C++ 原始碼的好幫手》&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2011/12/eclipse-cdt-cc.html"&gt;《用 Eclipse CDT 讀 C/C++ 原始碼》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Eclipse CDT 雖然方便，後來我還是用   &lt;a href="https://github.com/fcamel/configs/blob/master/bin/gj"&gt;gj&lt;/a&gt; 居多。原因有幾點:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt; 我已很習慣用 vim + screen 做事，   &lt;a href="https://github.com/fcamel/configs/blob/master/bin/gj"&gt;gj&lt;/a&gt; 最合這個情境&lt;/li&gt;  &lt;li&gt;    &lt;a href="http://www.gnu.org/s/idutils/"&gt;id-utils&lt;/a&gt; 真的是超級快&lt;/li&gt;  &lt;li&gt; 我針對自己的需求更新    &lt;a href="https://github.com/fcamel/configs/blob/master/bin/gj"&gt;gj&lt;/a&gt; 多次，愈用愈順手&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;另外   &lt;a href="http://betterthangrep.com/"&gt;ack&lt;/a&gt; 也滿方便的，懶得建 index 或是想比對子字串時，可直接使用。當然   &lt;a href="http://www.gnu.org/s/idutils/"&gt;id-utils&lt;/a&gt; 也支援子字串比對，只是暫時懶得為此修改   &lt;a href="https://github.com/fcamel/configs/blob/master/bin/gj"&gt;gj&lt;/a&gt; 的程式，目前大部份需求是找完整的 symbol。 &lt;/p&gt; &lt;h4&gt;熟悉 Linux 系統程式&lt;/h4&gt; &lt;p&gt;在基本工具都上手後，打算每天抽一點時間加減讀一點相關知識。一兩年下來應該會有不錯的成果。目前打算讀  &lt;a href="http://man7.org/tlpi/"&gt;《The Linux Programming Interface》&lt;/a&gt;，年假時試看看效果如何。 &lt;/p&gt; &lt;p&gt;這一個月的心得以了解 /proc 為主，對觀察 CPU 用量、RAM 用量、載入那些函式庫、multi-thread、程式執行狀態等都很有幫助:&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2012/01/procpidtask-multi-thread-status.html"&gt;《透過 /proc/PID/task/ 觀察 multi-thread 狀態》&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;    &lt;a href="http://fcamel-life.blogspot.com/2011/12/list-shared-library.html"&gt;《列出用到的 shared library》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;結論&lt;/h4&gt; &lt;p&gt;即使大概知道有那些東西，還是需要實際動手的經驗，才會真的學進去。一個月下來進步了不少，不過對於要面對的戰役，還有一大段路要趕上，還有很多很多要學的。&lt;/p&gt; &lt;div&gt;  &lt;img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/451051488891335923-5179517793212774990?l=fcamel-fc.blogspot.com" width="1"&gt;&lt;/img&gt;&lt;/div&gt; &lt;img height="1" src="http://feeds.feedburner.com/~r/fcamel/~4/oAv2YhTe4UY" width="1"&gt;&lt;/img&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Programming Software Engineering</category>
      <guid isPermaLink="true">https://itindex.net/detail/35345-linux-%E6%89%8B%E6%8C%87</guid>
      <pubDate>Thu, 19 Jan 2012 00:22:00 CST</pubDate>
    </item>
    <item>
      <title>GitHub如何运作：时间并不决定一切</title>
      <link>https://itindex.net/detail/34220-github-%E6%97%B6%E9%97%B4</link>
      <description>伯乐 写道 "Github公司的职员Zach Holman写了一系列文章，介绍GitHub如何运作管理(中文)。Zach在文中说到，“在很多行业中，时间是评判效率的准则，但不是我们的标准。在创业公司工作是完全不同的。你不可能花太多时间来解决一个问题。编程是一件需要创造力的事情，你需要在最佳状态才能编出高质量的代码。”“每个在GitHub工作的人的时间安排都是不一样的。我没有平均计算过每一天的时间，但大致是这样的： 1. 早上10点起床，查看Campfire日志，处理过夜支持请求 2. 坐巴士上班，在十二点或一点钟左右吃饭 3. 从下午一点开始工作，直到下午六点或晚九点下班 4. 回家工作或休息到凌晨两点钟。”"&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/1a393d76/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=GitHub%E5%A6%82%E4%BD%95%E8%BF%90%E4%BD%9C%EF%BC%9A%E6%97%B6%E9%97%B4%E5%B9%B6%E4%B8%8D%E5%86%B3%E5%AE%9A%E4%B8%80%E5%88%87&amp;amp;link=http%3A%2F%2Finternet.solidot.org%2Farticle.pl%3Fsid%3D11%2F11%2F19%2F1047218%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=GitHub%E5%A6%82%E4%BD%95%E8%BF%90%E4%BD%9C%EF%BC%9A%E6%97%B6%E9%97%B4%E5%B9%B6%E4%B8%8D%E5%86%B3%E5%AE%9A%E4%B8%80%E5%88%87&amp;amp;link=http%3A%2F%2Finternet.solidot.org%2Farticle.pl%3Fsid%3D11%2F11%2F19%2F1047218%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/118102017999/u/49/f/556826/c/33236/s/1a393d76/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/118102017999/u/49/f/556826/c/33236/s/1a393d76/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=Zh2cOMti2eA:BNPymgwlG3Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=Zh2cOMti2eA:BNPymgwlG3Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/34220-github-%E6%97%B6%E9%97%B4</guid>
      <pubDate>Sat, 19 Nov 2011 19:00:00 CST</pubDate>
    </item>
    <item>
      <title>游戏开发商开源HTML5游戏</title>
      <link>https://itindex.net/detail/38261-%E6%B8%B8%E6%88%8F-%E5%BC%80%E5%8F%91%E5%95%86-%E5%BC%80%E6%BA%90</link>
      <description>游戏工作室Wooga开源了其开发的HTML5游戏Pocket Island，源代码托管在GitHub上，该公司在官方博客上介绍了他们的开发经验，认为HTML5游戏有潜力，但尚未做好准备，开源的意图将是让其他人了解他们的工作，学习和改进。Wooga认为，2012年也许不是HTML5的黄金时代，但它的黄金时代即将到来。Mozilla和Google之前也演示过HTML5游戏，但多是技术演示，Pocket Island更为完整，虽然不太完美，但感兴趣的用户可以在浏览器或移动平台如iPhone上测试一下。 &lt;img border="0" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/209dd8b9/mf.gif" width="1"&gt;&lt;/img&gt; &lt;div&gt;  &lt;table border="0"&gt;   &lt;tr&gt;    &lt;td valign="middle"&gt;     &lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=en&amp;title=%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91%E5%95%86%E5%BC%80%E6%BA%90HTML5%E6%B8%B8%E6%88%8F&amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D12%2F06%2F22%2F146209%26amp%3Bfrom%3Drss" target="_blank"&gt;      &lt;img border="0" src="http://res3.feedsportal.com/images/emailthis2.gif"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/td&gt;    &lt;td valign="middle"&gt;     &lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91%E5%95%86%E5%BC%80%E6%BA%90HTML5%E6%B8%B8%E6%88%8F&amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D12%2F06%2F22%2F146209%26amp%3Bfrom%3Drss" target="_blank"&gt;      &lt;img border="0" src="http://res3.feedsportal.com/images/bookmark.gif"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt; &lt;br /&gt; &lt;br /&gt; &lt;a href="http://da.feedsportal.com/r/137428850661/u/49/f/556826/c/33236/s/209dd8b9/a2.htm"&gt;  &lt;img border="0" src="http://da.feedsportal.com/r/137428850661/u/49/f/556826/c/33236/s/209dd8b9/a2.img"&gt;&lt;/img&gt;&lt;/a&gt; &lt;img border="0" height="1" src="http://pi.feedsportal.com/r/137428850661/u/49/f/556826/c/33236/s/209dd8b9/a2t.img" width="1"&gt;&lt;/img&gt; &lt;div&gt;
  &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=WX26mmz55LE:G_HA29geFuk:yIl2AUoC8zA"&gt;   &lt;img border="0" src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA"&gt;&lt;/img&gt;&lt;/a&gt;   &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=WX26mmz55LE:G_HA29geFuk:7Q72WNTAKBA"&gt;   &lt;img border="0" src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/38261-%E6%B8%B8%E6%88%8F-%E5%BC%80%E5%8F%91%E5%95%86-%E5%BC%80%E6%BA%90</guid>
      <pubDate>Fri, 22 Jun 2012 22:00:00 CST</pubDate>
    </item>
    <item>
      <title>O'Reilly呼吁设立丹尼斯·里奇纪念日</title>
      <link>https://itindex.net/detail/32424-reilly-%E4%B8%B9%E5%B0%BC%E6%96%AF-%E9%87%8C%E5%A5%87</link>
      <description>两周前，加州州长Jerry Brown宣布10月16日为“史蒂夫·乔布斯日（Steve Jobs Day）”，以纪念刚刚去世的苹果联合创始人。如果说乔布斯改变了世界，那么C语言和Unix之父丹尼斯·里奇（Dennis Ritchie）则是创造了世界。用里奇贝尔实验室的同事Rob Pike的话说，Unix、Linux、Mac OS X甚至Windows的内核都是用C语言开发的，浏览器和大部分Web服务器也基本上使用的是C或C++，整个互联网生态系统都是基于C、或者是C的派生语言如C++和Java，或者是用C实现的语言如Python和Ruby。没有丹尼斯·里奇，乔布斯也创造不了奇迹。Tim O'Reilly呼吁将10月30日设为丹尼斯·里奇日。《经济学人》也有一篇纪念文章“printf("goodbye, Dennis");”。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/19976f18/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=O%27Reilly%E5%91%BC%E5%90%81%E8%AE%BE%E7%AB%8B%E4%B8%B9%E5%B0%BC%E6%96%AF%C2%B7%E9%87%8C%E5%A5%87%E7%BA%AA%E5%BF%B5%E6%97%A5&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F27%2F0125259%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=O%27Reilly%E5%91%BC%E5%90%81%E8%AE%BE%E7%AB%8B%E4%B8%B9%E5%B0%BC%E6%96%AF%C2%B7%E9%87%8C%E5%A5%87%E7%BA%AA%E5%BF%B5%E6%97%A5&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F27%2F0125259%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/117145816601/u/49/f/556826/c/33236/s/19976f18/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/117145816601/u/49/f/556826/c/33236/s/19976f18/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=jZJanaTtbho:Ij6wfQhrNTE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=jZJanaTtbho:Ij6wfQhrNTE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/32424-reilly-%E4%B8%B9%E5%B0%BC%E6%96%AF-%E9%87%8C%E5%A5%87</guid>
      <pubDate>Thu, 27 Oct 2011 09:24:00 CST</pubDate>
    </item>
    <item>
      <title>Java之父评价C语言之父：我用尽了形容词</title>
      <link>https://itindex.net/detail/30421-java-%E8%AF%AD%E8%A8%80-%E5%BD%A2%E5%AE%B9%E8%AF%8D</link>
      <description>伯乐 写道 "詹姆斯·高斯林在上周发布了关于讨论C语言之父丹尼斯·里奇（Dennis Ritchie）的简短博文（中文），认为他的影响巨大，并超越了科技世界，虽然他的大多影响都不为人知，但完全可以感受到。C语言撑起了一切。他说，“我的整个职业生涯也是从C和Unix中发展而来。对当今的大多数工程师而言，很难理解我在20世纪70年代感受到的幸福愉快感。当一种编程语言最终出现，我（其他人也）可以从汇编语言提升到一种真正的编程语言。我们可以做任何一切，过去我们得编写所有低级位系统。在C语言之前，编程语言达不到任务：开销太大了。系统的复杂性是真的阻碍了用汇编语言编写大型软件。C语言就像代码的JATO。”"&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/19693a96/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=Java%E4%B9%8B%E7%88%B6%E8%AF%84%E4%BB%B7C%E8%AF%AD%E8%A8%80%E4%B9%8B%E7%88%B6%EF%BC%9A%E6%88%91%E7%94%A8%E5%B0%BD%E4%BA%86%E5%BD%A2%E5%AE%B9%E8%AF%8D&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F20%2F015226%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=Java%E4%B9%8B%E7%88%B6%E8%AF%84%E4%BB%B7C%E8%AF%AD%E8%A8%80%E4%B9%8B%E7%88%B6%EF%BC%9A%E6%88%91%E7%94%A8%E5%B0%BD%E4%BA%86%E5%BD%A2%E5%AE%B9%E8%AF%8D&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F20%2F015226%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/115974604928/u/49/f/556826/c/33236/s/19693a96/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/115974604928/u/49/f/556826/c/33236/s/19693a96/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=7C3XG3FxQ18:q9_bdongiyE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=7C3XG3FxQ18:q9_bdongiyE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/30421-java-%E8%AF%AD%E8%A8%80-%E5%BD%A2%E5%AE%B9%E8%AF%8D</guid>
      <pubDate>Thu, 20 Oct 2011 09:24:00 CST</pubDate>
    </item>
    <item>
      <title>过去五年出现的新程序语言</title>
      <link>https://itindex.net/detail/30640-%E8%BF%87%E5%8E%BB-%E7%A8%8B%E5%BA%8F%E8%AF%AD%E8%A8%80</link>
      <description>Google的Go语言和Dart语言备受瞩目，但它们只不过是过去几年涌现出的十多种新语言之一，软件架构师Fogus在他的博客上介绍了过去五年出现的新程序语言。除了Go和Dart外，这些语言还包括了：基于函数语言Qi的Shen语言，自动定理证明程序语言Agda 2，Pure，动态、强类型、基于原型的语言Ioke，OMeta，CoffeeScript，Clojure，Scratch，Fortress，Arc，Potion，Mirah等等。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/196d4bf9/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=%E8%BF%87%E5%8E%BB%E4%BA%94%E5%B9%B4%E5%87%BA%E7%8E%B0%E7%9A%84%E6%96%B0%E7%A8%8B%E5%BA%8F%E8%AF%AD%E8%A8%80&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F20%2F1046239%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=%E8%BF%87%E5%8E%BB%E4%BA%94%E5%B9%B4%E5%87%BA%E7%8E%B0%E7%9A%84%E6%96%B0%E7%A8%8B%E5%BA%8F%E8%AF%AD%E8%A8%80&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F20%2F1046239%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/115975276718/u/49/f/556826/c/33236/s/196d4bf9/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/115975276718/u/49/f/556826/c/33236/s/196d4bf9/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=gJ8La2OudaQ:m__DcU0CBAI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=gJ8La2OudaQ:m__DcU0CBAI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/30640-%E8%BF%87%E5%8E%BB-%E7%A8%8B%E5%BA%8F%E8%AF%AD%E8%A8%80</guid>
      <pubDate>Thu, 20 Oct 2011 18:48:00 CST</pubDate>
    </item>
    <item>
      <title>把 GitHub 上的 private repository 搬到 BitBucket 上…</title>
      <link>https://itindex.net/detail/27835-github-private-repository</link>
      <description>&lt;p&gt;既然 latency 都差不多 (兩個 site 從台灣過去都要 200ms)，git push 速度感覺起來也差不多，找不到理由要付錢給 &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;，加上 private repository 裡面也沒什麼特別的東西，剛剛就都改丟到 &lt;a href="https://bitbucket.org/"&gt;BitBucket&lt;/a&gt; 上面，然後把 GitHub 的付費機制 cancel 掉…&lt;/p&gt;
&lt;p&gt;步驟很簡單，在 BitBucket 上開好 private repository，然後把 &lt;code&gt;.git/config&lt;/code&gt; 裡面的 &lt;code&gt;origin&lt;/code&gt; 換掉後重新 &lt;code&gt;git push -v origin master&lt;/code&gt; 就好了。&lt;/p&gt;
&lt;p&gt;參考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.othree.net/log/2011/10/04/bitbucket-rocks-with-git/"&gt;BitBucket 支援 Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.wu-boy.com/2011/10/bitbucket-support-git-repository-now/"&gt;Bitbucket 開始支援 Git Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Computer Murmuring Network Programming WWW</category>
      <guid isPermaLink="true">https://itindex.net/detail/27835-github-private-repository</guid>
      <pubDate>Mon, 10 Oct 2011 18:01:02 CST</pubDate>
    </item>
    <item>
      <title>Google宣布结构化编程语言Dart</title>
      <link>https://itindex.net/detail/27700-google-%E7%BB%93%E6%9E%84-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80</link>
      <description>Google官方博客宣布了新语言Dart。Dart是一种基于类的可选类型化编程语言，设计用于创建Web应用程序。 Google称，Dart的设计目标是为Web编程创造结构化但又富有灵活性的语言；编程方法一目了然，符合程序员的自然习惯，易于学习；能在所有浏览器和不同环境中实现高性能。Dart代码以两种方式执行，一种是原生虚拟机，一种是JavaScript引擎，用编译器将Dart代码翻译成JavaScript代码。这允许程序员在Dart中创建Web应用，编译后在任何浏览器上运行。Dart语言官网提供了名叫Dartboard的在线应用，让感兴趣的开发者在线上编程和运行。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/1927aac2/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=Google%E5%AE%A3%E5%B8%83%E7%BB%93%E6%9E%84%E5%8C%96%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80Dart&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F10%2F0819227%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=Google%E5%AE%A3%E5%B8%83%E7%BB%93%E6%9E%84%E5%8C%96%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80Dart&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F10%2F0819227%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/115634896960/u/49/f/556826/c/33236/s/1927aac2/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/115634896960/u/49/f/556826/c/33236/s/1927aac2/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=43k4Bvs_GQ4:qJ8TNVxH6js:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=43k4Bvs_GQ4:qJ8TNVxH6js:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/27700-google-%E7%BB%93%E6%9E%84-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80</guid>
      <pubDate>Mon, 10 Oct 2011 16:18:00 CST</pubDate>
    </item>
    <item>
      <title>作为一个程序员，数学对你到底有多重要</title>
      <link>https://itindex.net/detail/28270-%E4%BD%9C%E4%B8%BA-%E7%A8%8B%E5%BA%8F%E5%91%98-%E6%95%B0%E5%AD%A6</link>
      <description>&lt;p&gt;每个计算机系毕业的人，大都学过不少数学课，而且不少学校的计算机系的数学课，通常比一般的其他工科专业的数学要难一些，比如不上高等数学，而是学数学分析，不上线性代数而去上高等代数。但是，大部分毕业了后去做程序员的人，即使是所谓的名校计算机系毕业的，大都工作中也基本完全用不上学的那些数学，基本上，一半时间在CRUD，另一半时间在处理各类字符串、链表、Hash表，知道在面试中回答各种排序的时间复杂度是他们需要的数学的上线了。&lt;/p&gt;
&lt;p&gt;而在念书的时候，虽然上大学之前，有不少内行的外行的，年老的年轻的人告诉你，数学很重要啊。但是，通常来说，各个学校的计算机系的同学么，爱好学习的，可能重视的也是Thinking in Java，C++ Primer之类的语言书，或者设计模式之类的架构书，抑或是算法与数据结构这些玩意儿；而像我这样天天偷懒放羊的，也不会把数学当作是什么重要的课程好好学习。所以，“数学真重要”，这句话，似乎对于大家来说，始终只是飘在天上的一句话，随风飘逝了。&lt;/p&gt;
&lt;p&gt;于是，五年过去了，程序员们都有了不少的工作经验了，如果不是对工作毫无追求混吃等死的程序员的话，对于天天干活的语言，不论是Java还是C++应该都熟能生巧了，所谓的设计模式、重构、自动化测试等等也手到擒来了，大部分人的title上都加上了Senior了，牛一点的后面大概还跟上了一个Manager，然而，大家都开始考虑一个新的问题——“30岁以后怎么半？”，于是，转PM的转PM，考公务员的考公务员，像我这样仍然抱定——“你看人家美国Rohit都50了还不是天天写程序，别人想请还请不到的”的单纯想法的人越来越少了。然后，就算这些人，时不时也会觉得，自己天天干的超越CRUD的，所谓写点OO的框架，不也是很无聊的体力活么，写程序的人干两年谁都会干。于是，又有不少人下海创业了，多年以后，这些人中的大部分都会和我一样悲催的没有挣到前继续回来给大大小小的公司写程序。&lt;/p&gt;
&lt;p&gt;其实，杯具往往发生在一开始，其实，要是咱们当年好好学习，才会发现，也许数学对于你当个不错的程序员来说，没那么重要，但是要再往上走一步，有一点点技术上的创新，就都是数学的事儿了。两年前，我在T公司，用Configurator处理某个程序的时候，开始有点儿意识到这一点了，于是，那阵子还花了不少时间重新翻了翻数理逻辑。今年，换了新工作后为了工作看点儿机器学习的东西的时候，终于发现，这全都是数学啊。当你要超越CRUD，做任何一点点有创新性的技术的时候（不说产品），最有机会遇到的问题，其实是数学问题。虽然从Spring到Hibernate到Rails之类的框架，或者Hadoop，HBase之类的分布式计算框架，也都是技术上的重大革新，但是这些框架类的程序，完善都是阶段性的，一旦出现后，很快都会有相应的Best Practice，又会成为熟练工种的活。而真正针对问题域的解答，反是每天都可以有些新鲜的想法、思路和方案的，这些，往往有个数学的门槛。所以如果你真是挺喜欢写程序的，而且希望自己一直能写更好玩更难的程序，总有一天，你要过了这一道坎儿。&lt;/p&gt;
&lt;p&gt;所以我很是同意不知道是谁说得，如果你只想当个good programmer，那么数学不重要。但是如果你想当个great programmer，那么数学很重要。在你手里只有锤子的时候，你看什么东西都会是个钉子，想想你如果没有学过算法和数据结构，可能你的大部分程序需要自己写排序的话，都会是傻傻地冒泡吧，反正对于大部分程序来说，在现在这么快的PC下，这点时间差别，大部分情况下，也就是让你等程序执行测试的时候，多个倒杯水的时间。但是很多新鲜，好玩，有挑战的问题，很多数学的概念没有的话，恐怕不是多等个倒水的时间了。而如果你过了这个门槛，你又会发现，一个崭新的世界，又到了你的面前。&lt;/p&gt;
&lt;p&gt;回过头来，我说数学重要的话，那么重要的是哪些呢？大家常说的通常是离散数学，不过最近比较热门的机器学习这个方向，我目前看到的相关资料都大量依赖于线性代数和概率论，以及一点点微积分。所以，如果你和我一样，希望做点有追求的技术工作的话，开始花点时间学习数学吧。其实万事开头难，也许你和我一样，对着一堆公式符号，感到头晕眼花，但是如果真得按下心来，看上一个小时，这么坚持个一周，其实就会发现，这没啥难的，就当学门新的编程语言得了。&lt;/p&gt;
&lt;p&gt;PS：如果在google中搜索&lt;a href="http://www.google.com/#sclient=psy&amp;amp;hl=en&amp;amp;site=&amp;amp;source=hp&amp;amp;q=%E7%A8%8B%E5%BA%8F%E5%91%98+%E6%95%B0%E5%AD%A6&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq=&amp;amp;pbx=1&amp;amp;fp=4565d1ad08660d4d"&gt;程序员 数学&lt;/a&gt;的话，第一个链接是&lt;a href="http://article.yeeyan.org/view/pluto/2365"&gt;程序员怎样学数学&lt;/a&gt;，我觉得这篇文章写得相当不错。我也非常同意，广度有限比较有效，容易激发学习的兴趣，而且能和实际的工作和现实世界的问题、项目相结合。&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Tech Math Programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/28270-%E4%BD%9C%E4%B8%BA-%E7%A8%8B%E5%BA%8F%E5%91%98-%E6%95%B0%E5%AD%A6</guid>
      <pubDate>Tue, 01 Feb 2011 22:58:08 CST</pubDate>
    </item>
    <item>
      <title>新系统自动判断软件对象的交互</title>
      <link>https://itindex.net/detail/27453-%E7%B3%BB%E7%BB%9F-%E8%BD%AF%E4%BB%B6-%E5%AF%B9%E8%B1%A1</link>
      <description>过去四十年，软件工程中的一大创新是面向对象的编程语言。“对象”实际上是程序的软件库，让程序员从计算细节上转移注意力到更重要的编程任务上。一个复杂的程序有数百万行代码，如果程序员从头开始参与项目，他可以方便对面向对象的程序增添功能；但如果程序员是中途进来参与大项目，了解现有对象的互动可能有些难度，需要颇费一段时间。MIT的计算机科学和人工智能实验室的研究人员，将在美国计算机协会的SPLASH会议上介绍一套新系统(PDF)，能自动判断软件中的对象是如何互动的。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/192234c8/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=%E6%96%B0%E7%B3%BB%E7%BB%9F%E8%87%AA%E5%8A%A8%E5%88%A4%E6%96%AD%E8%BD%AF%E4%BB%B6%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%BA%A4%E4%BA%92&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F09%2F0747203%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=%E6%96%B0%E7%B3%BB%E7%BB%9F%E8%87%AA%E5%8A%A8%E5%88%A4%E6%96%AD%E8%BD%AF%E4%BB%B6%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%BA%A4%E4%BA%92&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F09%2F0747203%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/115634833534/u/49/f/556826/c/33236/s/192234c8/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/115634833534/u/49/f/556826/c/33236/s/192234c8/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=vLirXVkrCcE:qxjtrUIkCio:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=vLirXVkrCcE:qxjtrUIkCio:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/27453-%E7%B3%BB%E7%BB%9F-%E8%BD%AF%E4%BB%B6-%E5%AF%B9%E8%B1%A1</guid>
      <pubDate>Sun, 09 Oct 2011 15:40:00 CST</pubDate>
    </item>
    <item>
      <title>Google 推出基於結構式的全新網頁編寫語言 Dart</title>
      <link>https://itindex.net/detail/28094-google-%E6%8E%A8%E5%87%BA-dart</link>
      <description>&lt;p&gt;&lt;iframe src="http://feedads.g.doubleclick.net/~ah/f/4rs0ej479r1sra6jte20speac4/300/250?ca=1&amp;amp;fh=280#http%3A%2F%2Fwww.techorz.com%2Finternet%2Fgoogle-dart-structured-web-programming%2F" width="100%" height="280" frameborder="0" scrolling="no" marginwidth="0" marginheight="0"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://cdn.techorz.com/wp-content/uploads/2011/10/google-dart.png"&gt;&lt;img title="google-dart" src="http://cdn.techorz.com/wp-content/uploads/2011/10/google-dart-600x254.png" alt="" width="600" height="254"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Google 今天在官方的部落格中宣佈推出一種全新基於結構式的全新網頁編寫語言 – Dart，可用於設計及製作基於 Web 的應用程式。Google 指出 Dart 對於開發者來說是一種自然以及熟識的語言，開發者可以輕易地學習得到。&lt;/p&gt;&lt;p&gt;&lt;br&gt;(...)閱讀全文&lt;a href="http://www.techorz.com/internet/google-dart-structured-web-programming/"&gt;Google 推出基於結構式的全新網頁編寫語言 Dart&lt;/a&gt; (6 words) &lt;br&gt;&lt;a href="http://ad.zanox.com/ppc/?19394696C1826786397T"&gt;&lt;img src="http://ad.zanox.com/ppv/?19394696C1826786397" align="bottom" width="300" height="250" border="0" hspace="1" alt="MacBook Air B 004 300x250"&gt;&lt;/a&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;small&gt;© alfred for &lt;a href="http://www.techorz.com"&gt;TechOrz 囧科技&lt;/a&gt;, 2011. | &lt;a href="http://www.techorz.com/internet/google-dart-structured-web-programming/"&gt;Permalink&lt;/a&gt; | &lt;a href="http://www.techorz.com/internet/google-dart-structured-web-programming/#comments"&gt;No comment&lt;/a&gt; | Add to &lt;a href="http://del.icio.us/post?url=http://www.techorz.com/internet/google-dart-structured-web-programming/&amp;amp;title=Google%20%E6%8E%A8%E5%87%BA%E5%9F%BA%E6%96%BC%E7%B5%90%E6%A7%8B%E5%BC%8F%E7%9A%84%E5%85%A8%E6%96%B0%E7%B6%B2%E9%A0%81%E7%B7%A8%E5%AF%AB%E8%AA%9E%E8%A8%80%20Dart"&gt;del.icio.us&lt;/a&gt; &lt;br&gt; Post tags: &lt;a href="http://www.techorz.com/tag/dart/" rel="tag"&gt;dart&lt;/a&gt;, &lt;a href="http://www.techorz.com/tag/google/" rel="tag"&gt;Google&lt;/a&gt;, &lt;a href="http://www.techorz.com/tag/google-dart/" rel="tag"&gt;google dart&lt;/a&gt;, &lt;a href="http://www.techorz.com/tag/programming/" rel="tag"&gt;programming&lt;/a&gt;, &lt;a href="http://www.techorz.com/tag/web-programming/" rel="tag"&gt;web programming&lt;/a&gt;&lt;br&gt; &lt;/small&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/techorz/~4/TNYUM6eEpC4" height="1" width="1"&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>網絡應用 dart Google google dart programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/28094-google-%E6%8E%A8%E5%87%BA-dart</guid>
      <pubDate>Mon, 10 Oct 2011 23:38:45 CST</pubDate>
    </item>
    <item>
      <title>ISO C++11标准发布</title>
      <link>https://itindex.net/detail/28011-iso-%E6%A0%87%E5%87%86</link>
      <description>国际标准组织ISO/IEC发布了C++11编程语言标准，售价352瑞士法郎。C++作者Bjarne Stroustrup在自己网站上提供了标准草案文本(PDF)，应该与最后的标准内容相差不大。C++0x/11标准在今年8月获得一致通过，它是1998年以来C++语言的第一次大修订，对C++语言进行了改进和扩充，新的特性也扩展了语言在灵活性和效率上的传统长处，例如转移语义，lambda函数，等等。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/193036f8/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=ISO+C%2B%2B11%E6%A0%87%E5%87%86%E5%8F%91%E5%B8%83&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F11%2F104256%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=ISO+C%2B%2B11%E6%A0%87%E5%87%86%E5%8F%91%E5%B8%83&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F11%2F104256%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/115632879905/u/49/f/556826/c/33236/s/193036f8/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/115632879905/u/49/f/556826/c/33236/s/193036f8/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=1uO8QxgQ-og:ChuOAb42G-k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=1uO8QxgQ-og:ChuOAb42G-k:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/28011-iso-%E6%A0%87%E5%87%86</guid>
      <pubDate>Tue, 11 Oct 2011 18:00:00 CST</pubDate>
    </item>
    <item>
      <title>Heroku 上跑 PHP 的心得與感想…</title>
      <link>https://itindex.net/detail/28537-heroku-php</link>
      <description>&lt;p&gt;&lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt; 不愧是 &lt;a href="http://en.wikipedia.org/wiki/Platform_as_a_service"&gt;PaaS&lt;/a&gt; 中的領先品牌，deploy 的操作及穩定性都相當好，加上 Heroku 每個 project 都有 1 free dyno 可以使用，對於 prototyping 其實相當棒…&lt;/p&gt;
&lt;p&gt;關於要怎麼在 Heroku 上跑 &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt;，可以參考 &lt;a href="http://blog.xdite.net/"&gt;xdite&lt;/a&gt; 寫的「&lt;a href="http://wp.xdite.net/?p=3109"&gt;Create PHP application on Heroku without Facebook account&lt;/a&gt;」這篇文章。&lt;/p&gt;
&lt;p&gt;有幾個要抱怨的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP 是用 &lt;a href="http://httpd.apache.org/"&gt;Apache HTTP Server&lt;/a&gt; 跑的，所以可以用 &lt;code&gt;.htaccess&lt;/code&gt; 寫 rewrite rule，不過 &lt;code&gt;Options -Indexes&lt;/code&gt; 居然會 500 (因為 &lt;code&gt;AllowOverride&lt;/code&gt; 沒開給使用者用)，這個設定看起來沒有什麼 issue，應該是 Heroku 還在摸索這塊…&lt;/li&gt;
&lt;li&gt;沒有 &lt;a href="http://www.imagemagick.org/"&gt;ImageMagick&lt;/a&gt;，只有 &lt;a href="http://www.boutell.com/gd/"&gt;GD&lt;/a&gt;，而 GD 居然沒支援 &lt;a href="http://www.jpeg.org/"&gt;JPEG&lt;/a&gt;，這是要讓人怎麼用…&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;phpinfo()&lt;/code&gt; 看到支援的 module 有點少…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這些問題其實還蠻大的，不過，應該有機會改善… 應該… 應該…&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Cloud Computer Murmuring Network Programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/28537-heroku-php</guid>
      <pubDate>Wed, 12 Oct 2011 23:51:15 CST</pubDate>
    </item>
    <item>
      <title>Playbook正式支持Android应用</title>
      <link>https://itindex.net/detail/31216-playbook-android-%E5%BA%94%E7%94%A8</link>
      <description>Panggit 写道 "在Playbook尚未发售的时候，RIM就宣布Playbook将支持Android应用。而这次发布的Playbook OS2.0beta终于向人们展示了QNX系统上运行Android的效果（优酷视频）。目前只有kindle，gmail，Google Maps之类的普通android应用可以被运行，因为是beta系统，还无法知道将来对Android应用的支持能到哪种程度。喜欢游戏应用的用户也无须担心，因为那些能同时支持iOS和Android的游戏，大多都能以原生应用的方式移植到Playbook。此外，该版本的OS还包含了Adobe Air3和Flashplayer11。希望通过这些努力，RIM能让BBX/QNX系统步入正轨，而不要象Meego或webOS那样半途而废。" 软件公司BASIS起诉RIM，称BBX侵犯了它的商标。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/19768be0/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=Playbook%E6%AD%A3%E5%BC%8F%E6%94%AF%E6%8C%81Android%E5%BA%94%E7%94%A8&amp;amp;link=http%3A%2F%2Fit.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F21%2F151255%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=Playbook%E6%AD%A3%E5%BC%8F%E6%94%AF%E6%8C%81Android%E5%BA%94%E7%94%A8&amp;amp;link=http%3A%2F%2Fit.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F21%2F151255%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/115975301483/u/49/f/556826/c/33236/s/19768be0/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/115975301483/u/49/f/556826/c/33236/s/19768be0/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=AebrYw-0PRU:QgOpc-fJ3J8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=AebrYw-0PRU:QgOpc-fJ3J8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/31216-playbook-android-%E5%BA%94%E7%94%A8</guid>
      <pubDate>Fri, 21 Oct 2011 23:18:00 CST</pubDate>
    </item>
    <item>
      <title>[翻译]Dennis Ritchie：Steve Jobs 的巨人肩膀</title>
      <link>https://itindex.net/detail/31891-%E7%BF%BB%E8%AF%91-dennis-ritchie</link>
      <description>&lt;p&gt;原文来自：&lt;a href="http://www.wired.com/wiredenterprise/2011/10/thedennisritchieeffect/" title="Dennis Ritchie: The Shoulders Steve Jobs Stood On"&gt;http://www.wired.com/wiredenterprise/2011/10/thedennisritchieeffect/&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;Jobs 和 dmr 老爹前后离开，让很多人不能不将其放在一起谈论。无论如何，他们都是伟大的人。有的时候在很短的时间里，这个世界同时失去两个伟大的人，是一件很难言语的事情。&lt;/p&gt;
&lt;p&gt;“If I have seen further it is only by standing on the shoulders of giants.”- Isaac Newton.&lt;/p&gt;
&lt;p&gt;仅以此向 dmr 老爹致敬。&lt;/p&gt;
&lt;p&gt;———————翻译分割线———————&lt;/p&gt;
&lt;h1&gt;Dennis Ritchie：Steve Jobs 的巨人肩膀&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://www.wired.com/wiredenterprise/author/cade_metz/"&gt;Cade Metz&lt;/a&gt;撰写 2011十月13日 7:14 pm&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2011/10/thompson-and-ritchie.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2011/10/thompson-and-ritchie-300x240.jpg" alt="" title="Dennis Ritchie (standing) and Ken Thompson at a PDP-11 in 1972. (Photo: Courtesy of Bell Labs)" width="300" height="240"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;对 Dennis Ritchie 的悼念完全不能同 Steve Jobs 去世后在 Web 上纷飞的如潮水般的赞美相提并论。但是他们确实如此。&lt;/p&gt;
&lt;p&gt;甚至更夸张一些。&lt;/p&gt;
&lt;p&gt;“当 Steve Jobs 上周去世后，产生了声势浩大的哀悼活动，而这是另人感动和恰当的。虽然 Dennis 有着更大的成就，但是公众甚至不知道他是谁。”另一个&lt;a href="http://www.theregister.co.uk/2011/05/05/google_go/"&gt;程序界的传奇&lt;/a&gt;，现在是一名 &lt;a href="http://research.google.com/people/r/index.html"&gt;Google 人&lt;/a&gt;，在著名的&lt;a href="http://en.wikipedia.org/wiki/Bell_Labs"&gt;贝尔实验室&lt;/a&gt;工作的20年里同 Ritchie 每日穿过同一个门廊的 Rob Pike 这样说到。&lt;br&gt;
&lt;span&gt;&lt;/span&gt;&lt;br&gt;
在周三的晚上，Pike 通过 &lt;a href="http://plus.google.com/u/2/101960720994009339267/posts/ENuEDDYfvKP?hl=en"&gt;Google+ 上的一篇留言&lt;/a&gt;公布了 Ritchie 与疾病进行了长久的斗争之后，在他新泽西的家中病逝的消息，尽管来自铁杆技术人的响应非常强烈，但整体上&lt;a href="http://news.cnet.com/8301-1001_3-20119811-92/dennis-ritchie-father-of-c-programming-language-dies/?tag=mncol"&gt;来自 web&lt;/a&gt; 的&lt;a href="http://www.theregister.co.uk/2011/10/13/dennis_ritchie_obituary/"&gt;悼念&lt;/a&gt;与 Ritchie 对现代社会广泛的影响并不匹配。Dennis Ritchie 是 C 语言之父，并且协同贝尔实验室科学家 Ken Thompson 一起，使用 C 构建了 UNIX，基于这个操作系统的构建是如此之多——包括 Steve Jobs 建立的 Apple 帝国。&lt;/p&gt;
&lt;p&gt;“在 web 上几乎所有的事情都用到了这两个东西：C 和 UNIX，”Pike 告诉网友。“浏览器是用 C 编写的。UNIX 内核——几乎整个互联网都运行在其上——也是 C 编写的。web 服务器是 C 编写的，而如果不是用 C 编写的话，那就是用 Java 或者 C++，这些是 C 的衍生，或者 Python 或 Ruby，这些是用 C 实现的。以及所有运行这些程序的网络硬件，我几乎都可以断定是用 C 编写的。”&lt;/p&gt;
&lt;p&gt;“现代信息经济是构建在 Dennis 之前所做的工作上，这一点也不夸张。”&lt;/p&gt;
&lt;p&gt;他补充到，甚至 Windows 曾经也是用 C 编写的，以及 UNIX 的后继者包括 Apple 的桌面操作系统 Mac OS X，和运行在 iPhone 和 iPad 上的 iOS。“Jobs 是看得见的王，而 Ritchie 是无法看到的万王之王，”MIT 电器工程和计算机科学教授，计算机科学与人工智能实验室成员，Martin Rinard 这样说到。&lt;/p&gt;
&lt;p&gt;“Jobs 的天赋在于他构建了那些人们真正喜欢使用的产品，因为他有品味并且可以让事情变得引人注目。Ritchie 构建的东西是技术方面的，可以用于构建核心的基础设施，人们几乎无法接触到，但是每天都在使用的东西。”&lt;/p&gt;
&lt;h2&gt;从 B 到 C&lt;/h2&gt;
&lt;p&gt;Dennis Ritchie 构建了 C，因为他和 Ken Thompson 需要一个更好的方法来构建 UNIX。最初的 UNIX 内核是用汇编语言编写的，但是很快他们决定他们需要一个“高级”语言，某些对数据来说可以提供更多的控制能力并且跨操作系统的东西。在整个1970年，他们尝试构建了第二代 Fortran，但是这个并不十分适合，然后 Ritchie 提议基于 Thompson 创造的叫做 B 的语言开发一个新的语言。&lt;/p&gt;
&lt;p&gt;不论你相信哪个版本的传说，B 的命名来自 Thompson 的妻子 Bonnie 或者一个由剑桥在六十年代中期开发的语言 &lt;a href="http://en.wikipedia.org/wiki/BCPL"&gt;BCPL&lt;/a&gt;。在任何情况下，从 B 产生了 C。&lt;/p&gt;
&lt;p&gt;B 是一种解释型语言——也就意味着它是运行在 CPU 上的软件的一种中间形态——但是 C 是编译型语言。它被翻译为机器码，然后这些机器码直接运行于 CPU 上。不过在那个时候，C 被认为是一个高级语言。它可以为 Ritchie 和 Thompson 提供所需的灵活性，与此同时它很快。&lt;/p&gt;
&lt;p&gt;C 语言的第一个版本与现在我们知道的版本并不完全一样——不过还是有些类似的。它提供了完整的数据结构和“类型”用于定义变量，而这就是 Ritchie 和 Thompson 用于构建新的 UNIX 内核所使用的。“他们构建了 C 来编写程序，”在 10 年后加入贝尔实验室的 Pike 说到。“而他们要写的程序就是 UNIX 内核。”&lt;/p&gt;
&lt;p&gt;Ritchie 的一个玩笑是 C 有着“汇编语言的力量和汇编语言的便利。”换句话说，他承认 C 不是一个绚丽夺目的发明，它仍然非常贴近硬件在运行。今天，它被认为是一个低级语言，而不是高级的。 然而 Ritchie 的玩笑对于这个新语言并不公平。通过提供真正的数据结构，它操作的层面已经足够高了。&lt;/p&gt;
&lt;p&gt;“当你编写一个大程序的时候——而 UNIX 正是这种类型——就必须管理各种不同组件之间的相互影响：所有的用户，文件系统，磁盘，程序执行，以及使其能够有效的管理，你就需要能够对正在处理的信息有一个良好的表达。也就是我们所说的数据结构。”Pike 说到。&lt;/p&gt;
&lt;p&gt;“在没有数据结构的情况下编写内核，并且使其向 UNIX 一样的保持一致和优雅是一个相当相当难的挑战。需要有一个方法将数据成组的放在一起，而在 Fortran 里是没有办法做到的。”&lt;/p&gt;
&lt;p&gt;就当时而言，这样编写操作系统是非同寻常的，而这也使得 Ritchie 和 Thompson 最终设想移植操作系统到其他平台，他们在七十年代末期进行了这个工作。“这开启了 UNIX 运行在任何地方的水闸，”Pike 说到。“这全部都是 C 使其成为现实的。”&lt;/p&gt;
&lt;h2&gt;Apple，Microsoft，和其超越者&lt;/h2&gt;
&lt;p&gt;与此同时，C 在它自己的道路上越走越远，从贝尔实验室到世界上其他大学，以及 Microsoft，在二十世纪80年代爆发的软件公司。“使用 C 语言进行开发是一个巨大的进步，且和时宜… C 提供了正确的平衡性，使得可以在更高层面编写并更加产品化，但是当需要的时候，仍然可以控制到底如何处理，”NVIDIA 首席科学家和斯坦福的贝尔工程教授 Bill Dally 这样说到。“（它）加快了程序开发的步伐至少数十年。”&lt;/p&gt;
&lt;p&gt;就像 Pike 指出的，Richie 在 C 中构建的数据结构甚至影响产生了现代语言如 C++ 和 Java 所使用的面向对象范型。&lt;/p&gt;
&lt;p&gt;革命开始于 1973 年，Ritchie 发表了对语言的研究的论文，五年之后，他和同事 Brian Kernighan 发布了决定性的 C 书籍：C 程序设计语言。Kernighan 编写了这个语言初步的一些指南，然后同时他“扭着 Dennis 的胳膊”一起编写了一本书。&lt;/p&gt;
&lt;p&gt;Pike 在多伦多大学就读的时候阅读了这本书，在有一天生病回家的下午拿起了它。“这个参考手册与其他手册相比是清晰和可读的典范。它无疑是优秀的。”他说。“我在病床上阅读了它，而它使我忘记了正在生病。”（译注：如果我说我是靠这本书过的 CET4 会不会有人相信？但是这是真的，它确实燃起了我对学习英语的渴望……）&lt;/p&gt;
&lt;p&gt;就像许多大学生一样，Pike 已经在使用这个语言了。由于贝尔实验室捐赠了 UNIX 的代码，使得它风靡于大学校园。特别要提到的是，操作系统开始进入现代开源运动中了。 Pike 在讲述的时候，没有也无法夸大 Ritchie 的工作的影响力，因此即使 Ritchie 在 1983 年获得图灵奖，并且在 1998 年获得美国国家技术奖， 他得到的赞誉仍然无法匹及他的贡献。&lt;/p&gt;
&lt;p&gt;如同 Kernighan 和 Pike 说得那样，Ritchie 本人是非同寻常的孤僻。“我与他在同一个屋檐下一起工作了超过 20 年，而我感觉我并不全部了解他，”Pike 这样说。但是这并不能解释为他行事低调。Steve Jobs 是一个孤僻的人，但是他在隐私方面的坚持成为了公众对他个人生活探索的动力。&lt;/p&gt;
&lt;p&gt;Ritchie 在与众不同的时间生活，并且在与众不同的环境工作，在这点上他超过了任何人，例如 Jobs。他没有获得应得的这绝对没错。但是那些真正在意的人，都能明白他留下的跨时代的标志。“在牛顿关于站在巨人的肩膀上有一个标准，”Kernighan 说到，“我们都站在 Dennis 的肩膀上。”&lt;/p&gt;
&lt;p&gt;附加的内容由 Jon Stokes 撰写。&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>My life c c programming language dennis ritchie Java</category>
      <guid isPermaLink="true">https://itindex.net/detail/31891-%E7%BF%BB%E8%AF%91-dennis-ritchie</guid>
      <pubDate>Wed, 19 Oct 2011 16:59:50 CST</pubDate>
    </item>
    <item>
      <title>Lisp作者和人工智能之父约翰·麦卡锡去世</title>
      <link>https://itindex.net/detail/31826-lisp-%E4%BD%9C%E8%80%85-%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD</link>
      <description>Lisp作者和人工智能之父约翰·麦卡锡（John McCarthy）于10月24日去世，终年84岁。 1927年，麦卡锡出于于波士顿的一个美国移民家庭，他很早就表现出了数学方面的天赋，青少年时期开始自学加州理工的大学数学教科书，使他能在进入加州理工学习时跳过前两年的数学学习。他于1951年在普林斯顿大学获得数学博士学位，是约翰·纳什的同学。1955年，他提出了人工智能概念。麦卡锡相信人工智能需要交互。1958年，他发明了最早的高级语言之一Lisp，它很快成为人工智能研究最受欢迎的程序语言。1971年麦卡锡因人工智能研究上的贡献而获得图灵奖。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/1988b4a1/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=Lisp%E4%BD%9C%E8%80%85%E5%92%8C%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E4%B9%8B%E7%88%B6%E7%BA%A6%E7%BF%B0%C2%B7%E9%BA%A6%E5%8D%A1%E9%94%A1%E5%8E%BB%E4%B8%96&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F25%2F019206%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=Lisp%E4%BD%9C%E8%80%85%E5%92%8C%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E4%B9%8B%E7%88%B6%E7%BA%A6%E7%BF%B0%C2%B7%E9%BA%A6%E5%8D%A1%E9%94%A1%E5%8E%BB%E4%B8%96&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F25%2F019206%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/116916411210/u/49/f/556826/c/33236/s/1988b4a1/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/116916411210/u/49/f/556826/c/33236/s/1988b4a1/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=sw5LqK8MEfI:azVt9hjI2Fg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=sw5LqK8MEfI:azVt9hjI2Fg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/31826-lisp-%E4%BD%9C%E8%80%85-%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD</guid>
      <pubDate>Tue, 25 Oct 2011 09:05:00 CST</pubDate>
    </item>
    <item>
      <title>Google Dart语言分析</title>
      <link>https://itindex.net/detail/31927-google-dart-%E8%AF%AD%E8%A8%80</link>
      <description>Google最新推出的Dart语言引发了热议。它是一种适合服务器端和客户端应用程序开发的程序语言。 InfoQ的一篇分析文章认为，Dart的一些特性解决了Java或Javascript语言长期以来没有解决的问题。它的Snapshots特性类似Smalltalk images，允许应用程序即时启动。Isolates特性类似Erlang的processes和Javascript的WebWorkers，保持代码无共享单线程，支持消息传递并发。Dart其它的特性能实现伸缩性和模块化开发。它的代码可以使用编译器翻译成Javascript代码，或者直接在Dart虚拟机中执行。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/198b4cef/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=Google+Dart%E8%AF%AD%E8%A8%80%E5%88%86%E6%9E%90&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F25%2F0750249%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=Google+Dart%E8%AF%AD%E8%A8%80%E5%88%86%E6%9E%90&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F25%2F0750249%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/117145734898/u/49/f/556826/c/33236/s/198b4cef/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/117145734898/u/49/f/556826/c/33236/s/198b4cef/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=XvOX_dnIgjg:QWEtCygfwUM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=XvOX_dnIgjg:QWEtCygfwUM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/31927-google-dart-%E8%AF%AD%E8%A8%80</guid>
      <pubDate>Tue, 25 Oct 2011 15:48:00 CST</pubDate>
    </item>
    <item>
      <title>shell 重定向的一处妙用</title>
      <link>https://itindex.net/detail/31435-shell-%E9%87%8D%E5%AE%9A%E5%90%91</link>
      <description>&lt;p&gt;偶然在 dracut 的代码中发现一个使用重定向很巧妙的地方。见 modules.d/90kernel-modules/module-setup.sh 文件。&lt;/p&gt;
&lt;p&gt;之前的老代码是这样的：&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&lt;a href="http://wangcong.org/blog#"&gt;PLAIN TEXT&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;BASH:&lt;/span&gt;
&lt;div&gt;
&lt;div style="font-family:monospace"&gt;
&lt;ol&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;&lt;span style="color:#666666;font-style:italic"&gt;##&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;             &lt;span style="color:#7a0874;font-weight:bold"&gt;local&lt;/span&gt; _f&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;             &lt;span style="color:#000000;font-weight:bold"&gt;while&lt;/span&gt; &lt;span style="color:#c20cb9;font-weight:bold"&gt;read&lt;/span&gt; _f; &lt;span style="color:#000000;font-weight:bold"&gt;do&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;in&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#000000;font-weight:bold"&gt;*&lt;/span&gt;.ko&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt;    &lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt; $&lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;        &lt;span style="color:#007800"&gt;$_f&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; =~ &lt;span style="color:#007800"&gt;$_blockfuncs&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#000000;font-weight:bold"&gt;*&lt;/span&gt;.ko.gz&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt; $&lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#c20cb9;font-weight:bold"&gt;gzip&lt;/span&gt; -dc &lt;span style="color:#000000;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#007800"&gt;$_f&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; =~ &lt;span style="color:#007800"&gt;$_blockfuncs&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#000000;font-weight:bold"&gt;esac&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;             &lt;span style="color:#000000;font-weight:bold"&gt;done&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;意思很清楚吧？就是在内核模块（注意是二进制格式）中匹配一些函数（字符串）。这样会很慢，因为 bash 要在庞大的二进制文件流中匹配一些指定字符串。&lt;/p&gt;
&lt;p&gt;于是，就有人想了一个方法加速这个处理过程，把原来的单个数据流分成两个并行的数据流，同时进行匹配！很巧妙！&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&lt;a href="http://wangcong.org/blog#"&gt;PLAIN TEXT&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;BASH:&lt;/span&gt;
&lt;div&gt;
&lt;div style="font-family:monospace"&gt;
&lt;ol&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;&lt;span style="color:#666666;font-style:italic"&gt;##&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;             &lt;span style="color:#000000;font-weight:bold"&gt;function&lt;/span&gt; bmf1&lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#7a0874;font-weight:bold"&gt;local&lt;/span&gt; _f&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#000000;font-weight:bold"&gt;while&lt;/span&gt; &lt;span style="color:#c20cb9;font-weight:bold"&gt;read&lt;/span&gt; _f; &lt;span style="color:#000000;font-weight:bold"&gt;do&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;in&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                     &lt;span style="color:#000000;font-weight:bold"&gt;*&lt;/span&gt;.ko&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt;    &lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt; $&lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;        &lt;span style="color:#007800"&gt;$_f&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; =~ &lt;span style="color:#007800"&gt;$_blockfuncs&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                     &lt;span style="color:#000000;font-weight:bold"&gt;*&lt;/span&gt;.ko.gz&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt; $&lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#c20cb9;font-weight:bold"&gt;gzip&lt;/span&gt; -dc &lt;span style="color:#000000;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#007800"&gt;$_f&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; =~ &lt;span style="color:#007800"&gt;$_blockfuncs&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                     &lt;span style="color:#000000;font-weight:bold"&gt;esac&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#000000;font-weight:bold"&gt;done&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;             &lt;span style="color:#7a0874;font-weight:bold"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;             &lt;span style="color:#666666;font-style:italic"&gt;# Use two parallel streams to filter alternating modules.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;             &lt;span style="color:#7a0874;font-weight:bold"&gt;local&lt;/span&gt; merge side2&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;             &lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;local&lt;/span&gt; _f1 _f2&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#000000;font-weight:bold"&gt;while&lt;/span&gt;  &lt;span style="color:#c20cb9;font-weight:bold"&gt;read&lt;/span&gt; _f1; &lt;span style="color:#000000;font-weight:bold"&gt;do&lt;/span&gt;   &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f1&amp;quot;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                     &lt;span style="color:#000000;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#c20cb9;font-weight:bold"&gt;read&lt;/span&gt; _f2; &lt;span style="color:#000000;font-weight:bold"&gt;then&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f2&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;color:#800000"&gt;1&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#800000"&gt;${side2}&lt;/span&gt;; &lt;span style="color:#000000;font-weight:bold"&gt;fi&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#000000;font-weight:bold"&gt;done&lt;/span&gt; \&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#000000;font-weight:bold"&gt;|&lt;/span&gt; bmf1     &lt;span style="color:#000000;color:#800000"&gt;1&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#800000"&gt;${merge}&lt;/span&gt;    &lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;{&lt;/span&gt;side2&lt;span style="color:#7a0874;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;color:#800000"&gt;1&lt;/span&gt; \&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                 &lt;span style="color:#000000;font-weight:bold"&gt;|&lt;/span&gt; bmf1  &lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt;      &lt;span style="color:#7a0874;font-weight:bold"&gt;{&lt;/span&gt;merge&lt;span style="color:#7a0874;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;color:#800000"&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;经过 refactor 之后的或许更好理解一些：&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&lt;a href="http://wangcong.org/blog#"&gt;PLAIN TEXT&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;BASH:&lt;/span&gt;
&lt;div&gt;
&lt;div style="font-family:monospace"&gt;
&lt;ol&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;&lt;span style="color:#666666;font-style:italic"&gt;# subfunctions inherit following FDs&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;            &lt;span style="color:#7a0874;font-weight:bold"&gt;local&lt;/span&gt; &lt;span style="color:#007800"&gt;_merge=&lt;/span&gt;&lt;span style="color:#000000;color:#800000"&gt;8&lt;/span&gt; &lt;span style="color:#007800"&gt;_side2=&lt;/span&gt;&lt;span style="color:#000000;color:#800000"&gt;9&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;            &lt;span style="color:#000000;font-weight:bold"&gt;function&lt;/span&gt; bmf1&lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                &lt;span style="color:#7a0874;font-weight:bold"&gt;local&lt;/span&gt; _f&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                &lt;span style="color:#000000;font-weight:bold"&gt;while&lt;/span&gt; &lt;span style="color:#c20cb9;font-weight:bold"&gt;read&lt;/span&gt; _f; &lt;span style="color:#000000;font-weight:bold"&gt;do&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;in&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                    &lt;span style="color:#000000;font-weight:bold"&gt;*&lt;/span&gt;.ko&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt;    &lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt; $&lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;        &lt;span style="color:#007800"&gt;$_f&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; =~ &lt;span style="color:#007800"&gt;$_blockfuncs&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                    &lt;span style="color:#000000;font-weight:bold"&gt;*&lt;/span&gt;.ko.gz&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;[&lt;/span&gt; $&lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#c20cb9;font-weight:bold"&gt;gzip&lt;/span&gt; -dc &lt;span style="color:#000000;font-weight:bold"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#007800"&gt;$_f&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; =~ &lt;span style="color:#007800"&gt;$_blockfuncs&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;]&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;;;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                    &lt;span style="color:#000000;font-weight:bold"&gt;esac&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                &lt;span style="color:#000000;font-weight:bold"&gt;done&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;            &lt;span style="color:#7a0874;font-weight:bold"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;            &lt;span style="color:#000000;font-weight:bold"&gt;function&lt;/span&gt; rotor&lt;span style="color:#7a0874;font-weight:bold"&gt;(&lt;/span&gt;&lt;span style="color:#7a0874;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#7a0874;font-weight:bold"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                &lt;span style="color:#7a0874;font-weight:bold"&gt;local&lt;/span&gt; _f1 _f2&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                &lt;span style="color:#000000;font-weight:bold"&gt;while&lt;/span&gt; &lt;span style="color:#c20cb9;font-weight:bold"&gt;read&lt;/span&gt; _f1; &lt;span style="color:#000000;font-weight:bold"&gt;do&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                    &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f1&amp;quot;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                    &lt;span style="color:#000000;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#c20cb9;font-weight:bold"&gt;read&lt;/span&gt; _f2; &lt;span style="color:#000000;font-weight:bold"&gt;then&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                        &lt;span style="color:#7a0874;font-weight:bold"&gt;echo&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;$_f2&amp;quot;&lt;/span&gt; &lt;span style="color:#000000;color:#800000"&gt;1&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#800000"&gt;${_side2}&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                    &lt;span style="color:#000000;font-weight:bold"&gt;fi&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;                &lt;span style="color:#000000;font-weight:bold"&gt;done&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;|&lt;/span&gt; bmf1 &lt;span style="color:#000000;color:#800000"&gt;1&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#800000"&gt;${_merge}&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;            &lt;span style="color:#7a0874;font-weight:bold"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:bold;color:#26536A"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;            &lt;span style="color:#666666;font-style:italic"&gt;# Use two parallel streams to filter alternating modules.&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-weight:normal;color:#3A6A8B"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;, Courier, monospace;font-weight:normal;font-style:normal"&gt;            &lt;span style="color:#7a0874;font-weight:bold"&gt;eval&lt;/span&gt; &lt;span style="color:#ff0000"&gt;&amp;quot;( ( rotor ) ${_side2}&amp;gt;&amp;amp;1 | bmf1 ) ${_merge}&amp;gt;&amp;amp;1&amp;quot;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/31435-shell-%E9%87%8D%E5%AE%9A%E5%90%91</guid>
      <pubDate>Tue, 18 Oct 2011 11:41:30 CST</pubDate>
    </item>
    <item>
      <title>PHP 5.3 的 anonymous function</title>
      <link>https://itindex.net/detail/29520-php-anonymous-function</link>
      <description>&lt;p&gt;在看到 &lt;a href="http://phpconf.tw/2011/sessions"&gt;PHPConf Taiwan 2011 的議程介紹&lt;/a&gt;後，看到有人在推薦 &lt;a href="http://www.slimframework.com/"&gt;Slim Framework&lt;/a&gt;，一連上去就看到包含 anonymous function 的 sample code：&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?php
require &amp;#39;Slim/Slim.php&amp;#39;;
$app = new Slim();
$app-&amp;gt;get(&amp;#39;/hello/:name&amp;#39;, function ($name) {
    echo &amp;quot;Hello, $name!&amp;quot;;
});
$app-&amp;gt;run();
?&amp;gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;然後回頭去翻 &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt; 的說明：「&lt;a href="http://php.net/manual/en/functions.anonymous.php"&gt;Anonymous functions&lt;/a&gt;」，發現是從 PHP 5.3 開始支援。&lt;/p&gt;
&lt;p&gt;於是在 JavaScript 上常用到的技巧就也可以在 PHP 上用了：(不影響到全域變數與函數空間的方式)&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;// JavaScript
(function(){
    // ...
})();

// PHP
call_user_func(function(){
    // ...
});&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;接下來是繼續測試 Slim Framework 了，看起來算是一個不錯的小東西… 之後拿來配合 &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt; 這類的 PasS 快速開發應該會很好用 :o&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Computer Murmuring Network Programming WWW</category>
      <guid isPermaLink="true">https://itindex.net/detail/29520-php-anonymous-function</guid>
      <pubDate>Sun, 16 Oct 2011 06:45:05 CST</pubDate>
    </item>
    <item>
      <title>NoScript For Android发布</title>
      <link>https://itindex.net/detail/30020-noscript-for-android</link>
      <description>用于屏蔽脚本的浏览器流行扩展NoScript发布了Android版本。开发者称已经在Firefox for Android测试过，此外也应该能工作在基于Maemo的设备上。移动版NoScript可以帮助移动用户抵抗基于脚本的攻击。Android平台上的扩展功能和桌面版相似，允许用户对每个网站单独设置脚本执行许可。新版NoScript还引入了反点击劫持和反XSS过滤等对抗跨站脚本攻击的功能。&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/195d514f/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=NoScript+For+Android%E5%8F%91%E5%B8%83&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F18%2F0856213%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=NoScript+For+Android%E5%8F%91%E5%B8%83&amp;amp;link=http%3A%2F%2Fdevelopers.solidot.org%2Farticle.pl%3Fsid%3D11%2F10%2F18%2F0856213%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/115974942086/u/49/f/556826/c/33236/s/195d514f/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/115974942086/u/49/f/556826/c/33236/s/195d514f/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=QgNSL47O3WQ:25XBR1zQmyA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=QgNSL47O3WQ:25XBR1zQmyA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/30020-noscript-for-android</guid>
      <pubDate>Tue, 18 Oct 2011 16:54:00 CST</pubDate>
    </item>
    <item>
      <title>FCITX 4.1发布，加入谷歌拼音移植</title>
      <link>https://itindex.net/detail/19252-fcitx-%E8%B0%B7%E6%AD%8C%E6%8B%BC%E9%9F%B3-%E7%A7%BB%E6%A4%8D</link>
      <description>OSMSG.com 写道 "小企鹅输入法FCITX发布 4.1版，增加Android上的Google拼音移植；增加OpenCC做简繁转换引擎支持；增加支援Fcitx所有拼音引擎的云拼音支持；默认界面修改。支持竖排候选词列表，改善绘制性能；增加与KDE整合的配置模块；增加GTK2，GTK3，QT4的输入模块，以期解决Firefox，GTK3，Flash等程序的输入问题；增加对fbterm的支持；采用doxygen及docbook完善部分开发相关的文档。"&lt;img width="1" height="1" src="http://solidot.org.feedsportal.com/c/33236/f/556826/s/18148e47/mf.gif" border="0"&gt;&lt;div&gt;&lt;table border="0"&gt;&lt;tr&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/sendemail2.html?title=FCITX+4.1%E5%8F%91%E5%B8%83%EF%BC%8C%E5%8A%A0%E5%85%A5%E8%B0%B7%E6%AD%8C%E6%8B%BC%E9%9F%B3%E7%A7%BB%E6%A4%8D&amp;amp;link=http%3A%2F%2Flinux.solidot.org%2Farticle.pl%3Fsid%3D11%2F09%2F08%2F036216%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="middle"&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=FCITX+4.1%E5%8F%91%E5%B8%83%EF%BC%8C%E5%8A%A0%E5%85%A5%E8%B0%B7%E6%AD%8C%E6%8B%BC%E9%9F%B3%E7%A7%BB%E6%A4%8D&amp;amp;link=http%3A%2F%2Flinux.solidot.org%2Farticle.pl%3Fsid%3D11%2F09%2F08%2F036216%26amp%3Bfrom%3Drss"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://da.feedsportal.com/r/112922861908/u/49/f/556826/c/33236/s/18148e47/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/112922861908/u/49/f/556826/c/33236/s/18148e47/a2.img" border="0"&gt;&lt;/a&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/solidot?a=dYcdMcdy5q4:vihyBYfWooQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/solidot?a=dYcdMcdy5q4:vihyBYfWooQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/solidot?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>programming</category>
      <guid isPermaLink="true">https://itindex.net/detail/19252-fcitx-%E8%B0%B7%E6%AD%8C%E6%8B%BC%E9%9F%B3-%E7%A7%BB%E6%A4%8D</guid>
      <pubDate>Thu, 08 Sep 2011 11:15:00 CST</pubDate>
    </item>
  </channel>
</rss>

