从我大二的时候,大概六年前开始写技术博客,到现在已经有540+了,大概每年会写一百篇左右。

这篇文章由四部分组成:

  1. 博客的流量来源
  2. 不同文章类型的写作要点
  3. 如何写博客
  4. 如何收集写作的灵感

流量来源

首先,我将技术博客分为下面几种类型:

  1. 技术细节型。频率: 每天几次,15~30分钟可以写完。
  2. 干货型。频率: 每月几次,1~2小时可以搞定。
  3. 实践总结型。频率: 每周1~2次,2+小时以上的时间。
  4. 杂谈与鸡汤型。频率: 每季度几次,少则几小时,动则上月。

接着,奉献上一章我的博客的用户来源图,分析完大概如下:

程序员怎样才能写出一篇好的博客或者技术文章

前三者可以带来很多的流量,后者可以带来大量的评论啦。

前三者可以让你在Google上有一个好位置~~,后者可以让你在用户心中有个好位置。

通过社交媒体可以让第四种类型的文章,有大量的评论和转载。

干货型和实践总结型的文章通过聚合网站来传播的效果最好。

在Google中有个好位置意味着——第一的位置会有50%以上的用户访问,这一点很重要哦~~。再放出神图:

程序员怎样才能写出一篇好的博客或者技术文章

首先作为一个专业的程序员,我们会用某个关键词去搜索,如“InsecurePlatformWarning: A true SSLContext object is not available.” :如果这时你的标题就是《Python 解决 InsecurePlatformWarning: A true SSLContext object is not available》,那么你就找到了你的用户了。

这是我之前用了5分钟不到的文章写的一篇文章,它在半年的时间里带来了6,599个访问量。它在Google的搜索结果中排第一:

程序员怎样才能写出一篇好的博客或者技术文章

虽然很不情愿地被排名第二的文章抄袭了——但是我还是第一,这该死的伪原创

而用户不会只访问你的一个页面的:

程序员怎样才能写出一篇好的博客或者技术文章

一般来说,前三种类型的用户获取到他们想要的信息就走了,不会留下评论。至于第四种类型,没有大V的光环,偶尔文章被转企业V转转也能多个几十个粉丝。所以我没有第四种类型的文章太多的经验哈。

不同文章类型的写作要点

接着, 让我们再看看上面的几种类型:

技术细节型

在我的博客里很大一部分文章都是这一类,主要是原自早先对SEO的研究。对于先这种没有光环的人来说,这是我博客的主要流量来源。这也是让我坚持下去的动力,每天有大概三百个用户来自搜索引擎。

这种类型主要来自于日常工作,但是好像写这一类的人不多。每天我们都会遇到不同的技术问题——如某个第三库更新,某个浏览器bug,如何使用某个技术。因此,我们就会用这样的关键字和词去搜索,反正大部分教程序员使用Google的文章就是这么写的。

既然你想要这样的搜索,那我就直接把搜索结果放前面好了,如:

如果你也擅长用Google的话,我想你就懂了奥秘。标题的前半部分是关键字,后半部分指名意图。

接着,就是贴解决方案和代码咯~~。在这时候需要注意几点:

  • 试着去表达一些技术上的细节,也会省去一些技术上的细节。
  • 以自己学习的角度去想怎样写可以一步步下来。
  • 加入一点点自己的情感,博客和文档是不一样的。
  • 编写更简洁的内容,因为技术博客与此文不同的是,技术博客是面向寻找信息的人。

干货型

一般来说,这种类型的文章更类似于GitHub上的那些Awesome类型的Repo。说说几个标题,大概可能就会有点感觉了:

  • 每个程序员必知之SEO
  • 作为一个前端工程师你了解你的小伙伴么 - chrome
  • App 上架相关事宜、解决技巧
  • 20 个非常有用的 Java 程序片段
  • Java 开发者不容错过的 12 种高效工具

通常来说,这一类型的文章都是作者一段时间对于某一个东西的总结,非常有收藏价值。故而,这种类型的文章会在GitHub或者聚合网站上比较受欢迎。所以,它也更容易传播。

但是写起来的难度比较大,这依赖于你的使用经验。所以,也不是一天、两天就能搞定的。

实践总结型

看看标题,可能大家都知道这一类文章要怎么写了:

这通常是一系列的文章,而这一系列的文章一般是连续写出来的。也因此,我们可以发现很大的书都是由这一类的文章衍生出来的。

这一类的文章更像是干货型和技术细节型的结合,面向特定领域的技术,也属于干货。对于这种类型的文章来说,更依赖于代码——读者需要依据代码一步步往下深入。

所以在这一类型的文章中代码往往比较重要。

杂谈与鸡汤型

来几一些标题:

  1. 为什么整个互联网行业都缺前端工程师?
  2. 程序员职业生涯中应该思考的10个问题
  3. 怎么减少编程中的 bug?
  4. 为什么大公司看起来都那么糟糕?

BlaBla,简单地来说这一类文章基本上是没有技术的,都是一些以理论为主的概括。同时,写这一类文章的时候,也意料着可能在某一领域有一定的水平——写出来才会有人看。而由于偏向理论,这一类文章看的人往往会更多,因为它并不倾向于使用领域特定的技术。

所以这种类型是受众很广的文章,并且也像鸡汤一样容易传播。同时,这种类型的文章,更依赖于社区媒体及聚合网站的传播。因为大部分情况下,用户不会这么去搜索文章的。

如何写博客

对于博客的内容来说,下面几点很重要哦:

  1. 标题、小标题。一个好的标题会带来更多的流量的。
  2. 内容。以代码为例的文章,最好有代码。代码可以放在GitHub上,一举两得。
  3. 图 —— 一图胜千言,如本文第一节中的框架图。,一个框架图可以省去你的很多话语。
  4. 排版,又可称为UI设计。基本的语法高亮要有,容易阅读也要有。最简单就是白底黑字。

下面有我之前在《招聘笔杆子——成为笔杆子》一文中说到的一些要点:

标题——必须重要,类名

对于写博文的人来说,重点的是如何清楚的去表达他们的想法,标题算是其中之一,这个也就是为什么标题党成为了标题党,而《设计模式》成为了经典。刚开始学编程的时候,更吸引你注意力的可能是《72小时学会Javascript》,而不是《Javascript 权威指南》,兴许让你买前者的原因是因为你能看懂前者,而后者不仅看不懂,而且价格更贵。只是一年以后,《72 小时学会Javascript》被你扔到了垃圾箱,而《Javascript 权威指南》却放在了原来放那本书的位置上。你定义的类难道仅仅应该是class class1么?

小标题——地图,method

小标题有点类似于sitemap.xml,只是他就是站点地图,一点就到了相应的地方。他应该直接了解的说这是开始菜单,标题栏,菜单栏,而不应该是简简单单的第一章,如果你真是那样写的话,你写的函数想必是

def fun1 end

如果你写的是getdata那么,我想你的函数名应该和你的文章一样,告诉人们,你要的是getdata。所以不要吝啬你鼠标的一下,它可以承受上百万字的点击。如果因为那样坏了,你可以告诉我,我可以帮你免费换一个欧姆龙的微动,前提是你的鼠标可以换。如果是HTML那么应该是h2 h3,markdown也就是用得比较多的github上的README.md的##或者是###

内容——函数体

这里可不是让你用一个让人难以理解的Magic Number,你写得越复杂,别人看的时间就越久,通俗易懂,就是一个很好的开始。你可以把一个个复杂的方法分解出来,或者提炼函数,或者重命名。当你相信你看不懂你的文章,正如你看不懂你写的hello,world我想你是时候去重构你的函数了。

复杂的部分,就用段落来解决,一个函数如同一个段落只应该表达一个思想,太长了就如同这篇文章一样没有多少人会认真去看。你需要给你写的一个精美的代码加一个注释,所以你也需要给你复杂的地方加上个(PS)。

在编写内容的时候需要注意下面的几点:

  • 代码。必要的时候贴出代码,会是一种快速有效的方法,工作的时候是为了完成某个任务。
  • 列表。列表可以简明扼要的说明你想要表达的内容。
  • 图表。一张流程图可以说明程序的步骤,一个表格可以作好一个对比。
  • 标题。标题的好处,可以让用户快速定位,让用户找到想要的内容。
  • 链接。一个好的URL对于使用英文的人来说,可以利于SEO,对于中文,使用的人可以判断出文章的专业与否。

引言——README

我想都会去看的,无论是在破解软件的时候,还是github上面的项目。简单的说说,这篇文章是干什么的,这个程序是干什么的。大家都会,不是么?

没有什么好写的?说说你是怎么开始编程吧,然后写在你的博客上,你会发现你会爱不释手的。

如何收集写作的灵感

下面是我最近在做的,感觉很不错,推荐一下咯:

一般是先有个论点,然后再论据,最后才写。

第一步,在平时把想到的一些能写的文章用TODO的形式列出来,如我用的是“奇妙清单”。下面就是我最近想写的一些文章的一些标题:

程序员怎样才能写出一篇好的博客或者技术文章

但是有一些还没灵感,只是想到了个大概——所以有的是只是一个标题。这些文章大部分都属于杂谈型的,想到什么就说点什么,但是会有个核心。

第二步,在平时偶然会有点灵感的时候,就用Google Keep创建一个新的记事,稍微写几句,提醒一下自己咯。在这一步,相当于就是找一些论据来支撑自己的观点,等到这些观点差不多的时候就可以写了。

程序员怎样才能写出一篇好的博客或者技术文章

第三步,便是写。写的时候其实没有啥感觉,就如同我之前在《编程同写作,写代码只是在码字》一文中所说的。不得不再说说这个标题,一看就知道要写什么了~~。

真正的想法都在脑子里,而不在纸上,或者IDE里。

所以,其实写代码的时间很短,真实长的是想出怎么写,文章也是如此。

其他

转载保留来源微信公众号:Phodal

如果你也想着怎么写好文章,不烦多看看我的文章吧,哈哈~~

本文来自微信公众号“给产品经理讲技术”(pm_teacher),欢迎关注。

做为一名产品经理,你是否遇到过这样的窘境,“帮我把字体调成16号呗,颜色变成#FFFF00FF,老大说这里最好改一下”,作为一名app的开发只能无奈但心里窃喜的告诉你,“只能等下个版本了,必须要重新发布才能改”,如果你问为什么不能改了就生效啊,那说明你对技术的理解要么真的很差,要么你就是知道这项React-Native新技术所爆发出来的力量。

React Native是Facebook推出的一个用JavaScript语言就能同时编写ios,android,以及后台的一项技术,今年9月发布了android版本,又在程序员里面掀起了一波小高潮,不断有喜欢尝鲜的程序员投入到这个领域。

用大白话说,就是从此一名程序员自己就可以创业了,他只用这一门技术,就可以同时写出androidapp,ios app,以及后台应用程序,并且,请注意这里,它可以做到实时热更新(就像网页一样,改了一个字体,随时可上线),app也能做到随时都能更新了,第一段讲的那个需求可以分分钟秒杀解决,不用新发版本,只需在服务器改动一下代码即可,是不是很牛逼,是不是很牛逼,是不是很牛逼,真的很牛逼。

到这里,你只需要理解一句话,就是Facebook提供了一套解决方案,它利用JavaScript作为开发语言,可以同时来编写前端,移动终端,后台应用程序。

我们再来讲讲,为什么React Native受到了如此大的关注,以及它的优越性到底在什么地方。

目前,一个成熟的互联网产品基本囊括了:移动终端和网页两种主要形态。在移动终端app和网页的开发历程中,涉及了很多技术角色:前端开发(俗名叫做网站的),移动终端开发(android和ios开发,现在满大街都是),后台开发(他们的程序大多没有界面,主要是为网页和app提供数据和保障服务的稳定性),每个角色各司其职,分别需要不同的技能,比如前端开发需要精通html,css,javascript这些基本的web语言知识。Android开发用Java(这个词读“扎瓦”,别读成了“加瓦”,读成这样很Low B的)语言编写,ios开发用Objective-c(把他想象成当年过计算机二级的那个C语言就可以了)编写。后台开发,有的公司用Java,有的公司用C++,用啥的都有,能满足性能需要就可以了。

已经看崩溃了吧,对于一个非计算机专业的人,根本不会理解他妈的为什么要存在这么多语言,为什么这里要用C语言,那里要用C++,有的地方要用Python,而又有很大的一个人群对你高呼:“PHP才是世界最好的语言”。其实他们每种语言都有不同的使用场景,有的语言效率高,有的语言语法更简洁漂亮,有的是专为后台而生,有的是特定场景下的唯一选择。如果你还听不懂,我们就用大白话做个比喻,为什么避孕套有的是螺纹的,有的是颗粒的,有的是延时的,有的是超薄的,还有一个品牌号称一只手就可以打开的,它们也都是依据个人身体状态,以及不同场景分别发挥各自的强项。你随便类比,任何一个领域,都有很多不同的工具来满足不同的场景,是需求决定了当前状态。

现在好了,React整套解决方案完成了江湖统一,FaceBook也号称这们技术是“Learn Once,Write AnyWhere”,学习成本只有一次,却完成了所有开发角色的统一。

这意味着:

  1. app将来都是可像网页一样热更新,随时发布。
  2. 对于一名开发人员,将再也没有前端,终端,后台的区分,他所关注的就是做一整套应用程序,人力将得到最大幅度的整合与释放。
  3. 代码复用将会是主旋律,因为是一种语言,大家重复造轮子的成本会越来越节省。

目前,React Native也还是有一些缺点的,比如他的sdk组件包size还比较大,crash还比较多,在ios上支持的内容已经相当不错,android还属于初级阶段,但是目前最新的版本也才是0.16,相信再过一年, 一定会牛逼闪闪。

Attention !! 36 氪正在招募全职创业公司作者,如果你对报道互联网创业感兴趣,充满好奇心,善于发现新事物,又能沉心做行业研究,恰好又对教育、社交、农业、大公司其中一个方向了如指掌,那么你就是我们想要的人 !!快把简历投至:zhaopin@36kr.com

转:http://36kr.com/coop/toutiao/5041233.html

让我觉得我应该再写一篇文章站在全栈工程师的理由是,一本书《浮现式设计》和一个单词Re-Practise。

似乎这是一个新的思考,尽管在那之前我已经写了一篇《全栈工程师的思考》,只是事隔半年之后,我又有了一些新的感触。这半年来,除了增长了一些软技能,如沟通、表达 、英语,以及一点点的技术提升之外,并没有什么太大的变化。

每天我们似乎都在重复前一天的工作,生活似乎就像是一潭死水,日复一日地添加新功能,修复旧Bug。让我们觉得生活过于无聊的原因,怕是因为现有的项目已经很稳定,不会有太大的变化 ——不会有关键人员的离职,不会产生大的bug。

所以自然而然地,我们就不需要更多的技能能帮助我们成长。

个人的全栈

从个人的角度来说全栈似乎没有多大实际意义。以我的角度来说,我之所以选择全栈这条路线,不仅仅因为只研究一个东西太枯燥无聊——即使我可以成为这领域的大牛,更何况我对成为大牛一点兴趣都没有。并且我可以站在一个新的高度来看世界。

说到这里我突然就会有一种疑惑——你一直往某一个领域钻,只是因为你的工作需要吧!

这就变成了一个更有意思的话题,如果你并不是真正喜欢这个领域,那么你会对这个领域作出怎样的贡献?仅仅是让大家知道你对这个领域了解比较深?

而且还有一点特别有意思的是,你现在觉得你会为之奋斗许久的技术栈,并非是你的真爱。因为你还没有机会好好看看这个世界,这个世界到底是怎样的,到底会有怎样有意思的人、事。只是因为你过去熟悉这个领域,你就选择了这个领域。你听从了别人的片面之词就做了一个决定,而并没有自己好好地去做一个尝试。

记得还在学校的时候,我曾经花了很多时间去绕过Java语言——用Python、JavaScript来完成大部分的想法(不是计算机相关专业)。等到了工作,我发现让我受益最大的语言是Java——因为Java是一门很完备的语言。我从Java上并没有学到一些特别有用的东西,但是我从其相关的书籍上学习到了太多的东西。几乎所有的和软件工程相关的书籍,都以Java作为示例,当然还有一些C++。Python、JavaScript则是可以满足我的创造欲。

对了,是不是又想到了木桶效应。木桶效应还有很扯淡的一点是,只考虑到了板子的长度,而没有考虑到容器的大小。

为什么你应该先成为全栈工程师

mutong.jpg

如果你有更多的板子,你所能容纳的水量就是多。相似的,如果你有更多的技术栈,那么你的容量也就更大的。并且当你开始提升某一个长板时,剩下的长板也可以很容易提升。

全栈的优势无非就是学习能力和思维能力,同时带来更广阔的视野。

团队的全栈

在一个大型的互联网公司,这种全栈一点意义都没有。他们并不需要你有着良好的代码能力、架构能力,又或者是全局思考的能力。你只需要把你手头的那一点点技术细节完美实现即可,要知道0.1%的性能提升,可能会带来几百万刀的效益。相比于这样精分职责的团队,你只需要好好精通手上的技术栈即可,要知道那可是好几十个0.1%。

团队里面的人会拥有相同的技术栈,讨论着相同的知识。尽管存在能力上的差异,但是如果一个人员离职,由于其岗位所带来的价值,也会带来相似能力的人员。对于大的互联网公司来说,不会存在太多的问题。

然而作为一个小的团队来说,这个问题就变得很严重,在有时似乎是难以承受的。这似乎也就是结对编程得以在国外流行开来的原因,尽管结对编程会增加编程时间,也会在一定程度上减少Bug的数量。而事实上,结对编程带来的优点并非是这样的,而是分享业务知识。

这就意味着在一个敏捷团队里,你不得不全栈。看上去似乎有点被逼无奈的样子,但是实际上大型互联网公司也是如此,你不得不成为专家。

而事实上,大部分的人都不会只在一个领域里工作。

【本文转载简书,作者phodal ,转载请注明来自威客安全】

转:http://toutiao.com/i6231679981232062977/

下面,我列出了一些资源比较丰富的代码编辑器和IDEs,在开发复杂的程序的过程中,它们可以帮助你节省大量的时间。它们拥有所有的支持工具和强大的功能,能让你在开发过程中保持灵活和高效。

Codelite是一个开源并且免费的跨平台集成开发环境,它支持C/C++编程语言。它对于任何新手程序员来说都是非常好的工具,并且在轻量级的项目中被高度推崇。这个功能丰富的IDE有一个非常直观的界面和一些动态工具,同时它还能很好地兼容很多浏览器。

开发者必备的10个免费IDE和代码编辑器

Bluefish是一个灵活的开源编辑器。它拥有很多非常好的功能,可以让编辑过程更加轻松和快捷。它简单易用,并提供了许多的功能来编写和编辑自己的源代码,以创建高质量的Web项目。Bluefish也包含一些额外的程序和片段作为扩展。它作为一个开源项目,还有一些更好的机会可以增加扩展性的功能。

开发者必备的10个免费IDE和代码编辑器

Java Inventor是一个高性能的Java IDE,能让Java应用程序的开发和部署更加容易。它的产生就是为了减少Java程序员的开发时间。他是一个RAD工具能让你创建表格,管理数据,报告等。IDE部分能对你的应用程序的整体外观和感觉进行改造。

开发者必备的10个免费IDE和代码编辑器

你可以测试你的JavaScript代码的可靠性并看到它的实际运行情况。JS Bin是一个交互的IDE,可以让开发者创建和分享他们的工作,这样误差就可以及时地被检测到并解决。它还能让你在输出之前进行预览,并用于进一步的编辑和分享。它是完全免费的,还拥有许多功能,可以帮助你简化你的开发流程。

开发者必备的10个免费IDE和代码编辑器

Komodo IDE是一个跨平台的集成开发环境,支持所有的主要编程语言,能让你的开发工作快速完成。它拥有一个智能的代码编辑器,会帮助你编写出高质量的代码。它还提供了一种支持Python 2.4-3.3版本的多线程自动调试器。

开发者必备的10个免费IDE和代码编辑器

jEdit是一个非常先进的文本编辑器,用于编写Java程序,同时还能兼容所有主要的浏览器。它具有一个内置的宏语言和易于扩展的插件设计,可以直接从jEdit的插件管理器直接下载并安装。它也很容易定制,对于新手和有经验的开发人员来说都是非常适合的。

开发者必备的10个免费IDE和代码编辑器

Aptana是一个专业的开源工具,专门用于开发Web应用程序。Aptana主要是针对Javascript的开发。它也支持多种编程语言,能实现对CSS,HTML,JavaScript的全面支持。对于那些开发PHP和Ruby的开发者来说,Aptana也是一个非常好的选择。

开发者必备的10个免费IDE和代码编辑器

Code::Blocks是一个免费的支持 C/C++编程的开源集成开发环境。它可以在所有主要的平台上无缝运行,并且是高度可定制的和可配置的。它使用插件框架建立,可以通过安装一些功能性的插件进行扩展。它还带有一个插件向导,这样您就可以创建自己的插件。Code::Blocks是绝对通用的并能很好地用于建设您的项目。

开发者必备的10个免费IDE和代码编辑器

DrJava对于初学者来说是非常简单的并且功能比较齐全。它是免费的开源集成开发环境,主要针对那些开发领域的初学者。它还包括一些强大和神奇的功能,使得这个IDE也成为了高级开发人员的首选。DrJava还提供了多平台的支持功能,带有一个直观的界面,让开发过程变得简单快速。

开发者必备的10个免费IDE和代码编辑器

Coda是一个富文本编辑器,可以让你为Web项目创建简洁,快速和高效的代码。使用Coda你还能进行预览并根据需要作出适当的调整。此外,Coda也会给你一个完美的方式来管理你的本地和远程文件。

开发者必备的10个免费IDE和代码编辑器

本文翻译自:www.k2ice.com

本站文章除注明转载外,均为本站原创或翻译

转:http://toutiao.com/i6230846390918971905/

Dynamics.js是设计基于物理规律的动画的重要JavaScript库。它可以赋予生命给所有包含CSS 和SVG属性的DOM(文本对象模型)元素,换句话说,Dynamics.js适用于所有JavaScript对象以及一系列其它的元素。目前,Dynamics.js常被用于设计交互式菜单栏、同步下拉菜单、加载器、按钮以及其它功能。这个库提供了可定制动画类型的各种基本选项,如频率、反弹力、旋转、摩擦、持续时间等等。

创建酷炫动画效果的10个JavaScript库

Cta.js 是用于在网页上创建动画元素“Action-to-Effect”路径的轻量级库。它常被用在tile-based应用程序的导航、模态窗口的打开、侧边栏上可点击的按钮等等。

创建酷炫动画效果的10个JavaScript库

Beep.js是一个通过使用WebAudio API创建基于网页的电子合成器的JavaScript库。它可以用于创建音乐或者设计和音乐相关的学习教程。

创建酷炫动画效果的10个JavaScript库

Rainyday.js是一个使用HTML5 canvas创建雨滴落在玻璃表面的出色效果的强大JavaScript库。它拥有一个集成了各种可自定义实现的动画组件的可扩展应用程序接口。

创建酷炫动画效果的10个JavaScript库

Iconate.js是一个可将设计图标转化为流行动画元素的伟大资源。它拥有大量可供选择的字体、字形图标以及自定义图标集。

创建酷炫动画效果的10个JavaScript库

Dom-Animator.js是一个在DOM(文本对象模型)中可显示内容节点里ASCII动画的JavaScript库。

创建酷炫动画效果的10个JavaScript库

Famous 是用于设计流行动画的强大JavaScript库,它包含的基于事件的系统(event-based system)使得渲染平滑动画和过渡特效这类的更新转换工作变得非常简单。Famous还有一个可创建自定义动画和动画仿真的3D物理引擎,你可以做出包含在不同的重力、拖放和碰撞下的粒子或者3D物体的状态。

创建酷炫动画效果的10个JavaScript库

Bounce.js 是一个在CSS 3的支持下能做出各种酷炫动画的JavaScript库。你可以设计不同的动画和运动效果,如自转、公转、来回运动、急加速等。

创建酷炫动画效果的10个JavaScript库

Snabbt.js是一个使用CSS3转换矩阵的轻量级JavaScript动画库。它的结构非常简单,支持各种过渡和运动效果的应用,如缩放、尺寸调整、扭曲、旋转等等。Snabbt.js还支持attention animation功能,这个功能在表单验证方面是非常有用的。

创建酷炫动画效果的10个JavaScript库

Rekapi是用于CSS动画关键帧动画以及DOM中JavaScript动画的高级avaScript库。在复杂动画的设计方面,Rekapi以其实用性被人们广为熟知。您可以使用Rekapi创建生动的饼图和曲线图、五彩纸屑、交互性时间线以及各种用户界面。

创建酷炫动画效果的10个JavaScript库

本文翻译自codecondo.com

本站文章除注明转载外,均为本站原创或翻译

转:http://toutiao.com/i6221939614307844609/

PHP遭弃用!Wordpress.com开源并转用Javascript

站长之家(Chianz.com)11月30日消息 据外媒消息称,Wordpress母公司Automattic将完全重写Wordpress.com网站代码,并将此项计划命名为“Calypso”,代码开源并被托管于Github平台。此外,最新的wordpress.com放弃了php,转而启用Javascript,且通过API调用数据。

以下为几个主要更新点:

1、如今的Wordpress.com为一个管理界面,完全独立于Wordpress的核心代码,且与其(wordpress核心代码)的交互方式类似于其他第三方接口、app。通过REST API来获取发布的内容、上传照片等数据。

2、Wordpress.com 不再使用PHP+MySQL的组合模式,而是采用了Javascript语言及API调用模式。也就是说,当你访问wordpress网站时,会触发服务器分发一个几乎完全运行于用户浏览器上的、功能齐全wordpress客户端。

上面所说的WP客户端实际上是一个单页应用(Single Page Application),这样一来就可大大减少用户与界面进行交互时页面加载的次数。此外,它采用的是响应式设计,因而对手机、平板等移动设备也十分友好。

在新版wordpress.com中,用户可以通过Wordpress原有的后台管理系统来维护博客。也可以通过Jetpack插件来管理wordpress站点,Jetpack插件里面还内置了社会化分享,社会化登录和社会化评论的功能。

3、重写后的Wordpress.com是完全开源的,托管于Github上(地址:https://github.com/Automattic/wp-calypso),用户可在遵从GNU GPL(General Public License)规定情况下查看完整代码、重新使用该代码。

除了wordpress.com开源外,wp团队还针对Mac用户推出了一款类似于桌面应用程序的app。这款App简化了用户访问、维护Wordpress.com的工作,后续还将推出Windows和Linux版本。

Calypso:荷马《奥德赛》中人物,海之女神卡吕普索。

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品

一看就明白的爬虫入门讲解-基础理论篇

关于爬虫内容的分享,我会分成两篇,六个部分来分享,分别是:

  1. 我们的目的是什么
  2. 内容从何而来
  3. 了解网络请求
  4. 一些常见的限制方式
  5. 尝试解决问题的思路
  6. 效率问题的取舍

本文先聊聊前三个部分。

一、我们的目的是什么

一般来讲对我们而言需要抓取的是某个网站或者某个应用的内容,提取有用的价值,内容一般分为两部分,非结构化的文本,或者结构化的文本。

关于非结构化的数据

1.1 HTML文本(包含javascript代码)

HTML文本基本上是传统爬虫过程中最常见的,也就是大多数时候会遇到的情况,例如抓取一个网页,得到的是HTML,然后需要解析一些常见的元素,提取一些关键的信息。HTML其实理应属于结构化的文本组织,但是又因为一般我们需要的关键信息并非直接可以得到,需要进行对HTML的解析查找,甚至一些字符串操作才能得到,所以还是归类于非结构化的数据处理中。

常见解析方式如下:

CSS选择器

现在的网页样式比较多,所以一般的网页都会有一些CSS的定位,例如class,id等等,或者我们根据常见的节点路径进行定位,例如腾讯首页的财经部分:

这里id就为finance,我们用css选择器,就是"#finance"就得到了财经这一块区域的html,同理,可以根据特定的css选择器可以获取其他的内容。

XPATH

XPATH是一种页面元素的路径选择方法,利用chrome可以快速得到,如:

一看就明白的爬虫入门讲解-基础理论篇

copy XPATH 就能得到——//*[@id="finance"]

正则表达式

正则表达式,用标准正则解析,一般会把HTML当做普通文本,用指定格式匹配当相关文本,适合小片段文本,或者某一串字符,或者HTML包含javascript的代码,无法用CSS选择器或者XPATH。

字符串分隔

同正则表达式,更为偷懒的方法,不建议使用。

1.2 一段文本

例如一篇文章,或者一句话,我们的初衷是提取有效信息,所以如果是滞后处理,可以直接存储,如果是需要实时提取有用信息,常见的处理方式如下:

分词

根据抓取的网站类型,使用不同词库,进行基本的分词,然后变成词频统计,类似于向量的表示,词为方向,词频为长度。

NLP

自然语言处理,进行语义分析,用结果表示,例如正负面等。

关于结构化的数据

结构化的数据是最好处理,一般都是类似JSON格式的字符串,直接解析JSON数据就可以了,提取JSON的关键字段即可

二、内容从何而来

过去我们常需要获取的内容主要来源于网页,一般来讲,我们决定进行抓取的时候,都是网页上可看到的内容,但是随着这几年移动互联网的发展,我们也发现越来越多的内容会来源于移动app,所以爬虫就不止局限于一定要抓取解析网页,还有就是模拟移动app的网络请求进行抓取,所以这一部分我会分两部分进行说明。

1 网页内容

网页内容一般就是指我们最终在网页上看到的内容,但是这个过程其实并不是网页的代码里面直接包含内容这么简单,所以对于很多新人而言,会遇到很多问题,比如:

明明在页面用Chrome或者Firefox进行审查元素时能看到某个HTML标签下包含内容,但是抓取的时候为空。

很多内容一定要在页面上点击某个按钮或者进行某个交互操作才能显示出来。

所以对于很多新人的做法是用某个语言别人模拟浏览器操作的库,其实就是调用本地浏览器或者是包含了一些执行javascript的引擎来进行模拟操作抓取数据,但是这种做法显然对于想要大量抓取数据的情况下是效率非常低下,并且对于技术人员本身而言也相当于在用一个盒子,那么对于这些内容到底是怎么显示在网页上的呢?主要分为以下几种情况:

网页包含内容

这种情况是最容易解决的,一般来讲基本上是静态网页已经写死的内容,或者动态网页,采用模板渲染,浏览器获取到HTML的时候已经是包含所有的关键信息,所以直接在网页上看到的内容都可以通过特定的HTML标签得到

javascript代码加载内容

这种情况是由于虽然网页显示时,内容在HTML标签里面,但是其实是由于执行js代码加到标签里面的,所以这个时候内容在js代码里面的,而js的执行是在浏览器端的操作,所以用程序去请求网页地址的时候,得到的response是网页代码和js的代码,所以自己在浏览器端能看到内容,解析时由于js未执行,肯定找到指定HTML标签下内容肯定为空,这个时候的处理办法,一般来讲主要是要找到包含内容的js代码串,然后通过正则表达式获得相应的内容,而不是解析HTML标签。

Ajax异步请求

这种情况是现在很常见的,尤其是在内容以分页形式显示在网页上,并且页面无刷新,或者是对网页进行某个交互操作后,得到内容。那我们该如何分析这些请求呢?这里我以Chrome的操作为例,进行说明:

一看就明白的爬虫入门讲解-基础理论篇

所以当我们开始刷新页面的时候就要开始跟踪所有的请求,观察数据到底是在哪一步加载进来的。然后当我们找到核心的异步请求的时候,就只用抓取这个异步请求就可以了,如果原始网页没有任何有用信息,也没必要去抓取原始网页了。

2 App内容

因为现在移动应用越来越多,很多有用信息都在App里面,另外解析非结构化文本和结构文本对比而言,结构化文本会简单多了,不同去找内容,去过多分析解析,所有既有网站又有App的话,推荐抓取App,大多数情况下基本上只是一些JSON数据的API了。那么App的数据该如何抓取呢?通用的方法就是抓包,基本的做法就是电脑安装抓包软件,配置好端口,然后记下ip,手机端和电脑在同一个局域网里面,然后在手机的网络连接里面设置好代理,这个时候打开App进行一些操作,如果有网络数据请求,则都会被抓包软件记下,就如上Chrome分析网络请求一样,你可以看到所有的请求情况,可以模拟请求操作。这里Mac上我推荐软件Charles,Windows推荐Fiddler2。

具体如何使用,之后我再做详述,可能会涉及到HTTPS证书的问题。

三、了解网络请求

刚刚一直在宽泛的提到一些我们需要找到请求,进行请求,对于请求只是一笔带过,但请求是很重要的一部分,包括如何绕过限制,如何发送正确地数据,都需要对的请求,这里就要详细的展开说下请求,以及如何模拟请求。

我们常说爬虫其实就是一堆的HTTP请求,找到待爬取的链接,不管是网页链接还是App抓包得到的API链接,然后发送一个请求包,得到一个返回包(也有HTTP长连接,或者Streaming的情况,这里不考虑),所以核心的几个要素就是:

  1. URL
  2. 请求方法(POST, GET)
  3. 请求包headers
  4. 请求包内容
  5. 返回包headers

在用Chrome进行网络请求捕获或者用抓包工具分析请求时,最重要的是弄清楚URL,请求方法,然后headers里面的字段,大多数出问题就出在headers里面,最常限制的几个字段就是User-Agent, Referer,Cookie 另外Base Auth也是在headers里面加了Autheration的字段。

请求内容也就是post时需要发送的数据,一般都是将Key-Value进行urlencode返回包headers大多数会被人忽视,可能只得到内容就可以了,但是其实很多时候,很多人会发现明明url,请求方法还有请求包的内容都对了,为什么没有返回内容,或者发现请求被限制,其实这里大概有两个原因:

  • 一个是返回包的内容是空的,但是在返回包的headers的字段里面有个Location,这个Location字段就是告诉浏览器重定向,所以有时候代码没有自动跟踪,自然就没有内容了;
  • 另外一个就是很多人会头疼的Cookie问题,简单说就是浏览器为什么知道你的请求合法的,例如已登录等等,其实就是可能你之前某个请求的返回包的headers里面有个字段叫Set-Cookie,Cookie存在本地,一旦设置后,除非过期,一般都会自动加在请求字段上,所以Set-Cookie里面的内容就会告诉浏览器存多久,存的是什么内容,在哪个路径下有用,Cookie都是在指定域下,一般都不跨域,域就是你请求的链接host。

所以分析请求时,一定要注意前四个,在模拟时保持一致,同时观察第五个返回时是不是有限制或者有重定向。

http://www.webkaka.com/blog/archives/how-to-set-gzip-for-js-in-Nginx.html

Nginx启用gzip很简单,只需要设置一下配置文件即可完成,可以参考文章Nginx如何配置Gzip压缩功能。不过,在群里常有人提到,他们的网站Gzip压缩虽然成功了,但检测到JS仍然没有压缩成功,这是为什么呢?经过我的检查发现,原来是他们的gzip_types设置不对造成的,本文就为遇到同样情况的人解决这一问题。

Nginx启用Gzip压缩js无效

某群友在群里提到,他启用了网站的Gzip压缩,通过站长工具Gzip压缩检测检测到启用成功了,想着其他文件如CSS、JS等也都压缩成功了,但是通过进一步检测各种类型的压缩情况,发现JS文件并没有启用Gzip压缩,这令他非常纳闷,不知何故。

Nginx启用Gzip压缩js无效

图1:Nginx启用Gzip压缩js无效

转:http://blog.jobbole.com/48769/

一些我更愿意在开始就知道东西

利用 Node.js 开发是一个非常有趣,和令人满足的过程, 它有3万多个模块可以选择使用,并且所有的模块可以非常容易的集成入现有的应用之中。

无论如何,对于一些刚开始使用Node.js 开发的的人来说, 很容易碰壁,在这个文章中,我会提到在你学习过程中遇到的问题。

贴士 1: 在开发环境使用 nodemon, 在生产环境使用pm2

当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样。 当我第一次开发的node app时候,这个让我感到异常挫败和痛苦, 尤其是每当我修改很小东西的时候需要control+c

幸运的是我发现了一个非常棒的工具Nodemon。 你可以利用以下的命令来安装

1
npm install -g nodemon

Nodemon 是一个令人惊叹的工具, 当你全局安装它以后, 可以通过 nodemon [file].js 来启动你的node.js scripts,它会告诉nodemon来监视你的script和scripts的所有变化, 这样的Node.js开发方式非常震撼以及让大大提高开发速度。

那么,生产环境又如何, 除非你用了herokuNodejitsu或者其它一些好的 Node.js 平台(也许它们有类似的功能), 但是碰巧你用了EC2 或者一些其它的云平台来运行你的Node.js app, 你如何能然保证这是一个始终运行的Node.js app

案就是PM2, PM2 是一个类似于Nodemon的工具,不同之处在于它用于生产环境, 和Nodemon相似的地方在于它会监控你的app的任何修改或者重新部署,但是有更好的一面, PM2 在遭遇到崩溃的时候,它会正确重启你的app。

PM2的优胜之处在于当你要将app需要多核处理的时候,PM2内部集成的负载均衡可以让你很容易的去指定运行多少个实例。

1
pm2 start app.js -i max

-i参数目的是指定运行多少个实例,在这个例子中 PM2 使用了一个常量max来扩展你的app运转到你最大的核数,不要忘记Node 平时只会运行在单核!

告别node-forever,拥抱PM2
http://www.oschina.net/translate/goodbye-node-forever-hello-pm2?cmp

pm2 logodevo.ps团队对JavaScript的迷恋已经不是什么秘密了;node.js作为服务器端,AngularJS作为客户端,某种程度上说,我们的堆栈是用它建成的.我们构建静态客户端和RESTful JSON API的方法意味着我们跑了很多的node.js,我必须承认尽管node.js的一切都令人敬畏,但当我们在生产环境中运行它时它仍然会让我们感到头疼.相比一些更加成熟的语言,它的工具和最佳实践仍然缺乏(试想一下:监控,日志,错误处理).

到目前为止,我们仍然依赖漂亮俏皮的node-forever模块.它是非常伟大的模块,不过依然缺失一些功能:

  • 有限的监控和日志功能,
  • 进程管理配置的支持差,
  • 不支持集群,
  • 代码库老化(意味着在升级node.js时频繁的失败).

这就是为什么我们要在过去的几个月里去写PM2模块.在我们即将发布针对生产环境的正式版之前我们想先让您看一眼.

PM2到底是什么个东西呢?

首先第一件事,你需要先通过 npm 来安装它:

npm install -g pm2

让我们通过表格来对比下:

Feature Forever PM2
Keep Alive
Coffeescript
Log aggregation
API
Terminal monitoring
Clustering
JSON configuration

现在让我来介绍一点点主要特性...

原生的集群化支持

Node v0.6引入了集群特性,允许你在多个Node应用中共享socket.问题在于,它不能在容器外运行而且需要一些额外的配置来处理主进程和子进程.

PM2原生支持处理这个问题,而且不需要额外的代码:PM2本身作为主进程,然后它将你的代码封装到一个特殊的集群进程里,就像node.js一样,为你的代码文件添加一些全局变量.想要启动一个使用所有CPU核心的集群,你只需要键入如下的指令:

$ pm2 start app.js -i max

然后;

$ pm2 list

然后就会显示类似下面的东西(ASCII UI FTW);

pm2 list

就像你看到的,现在你的应用有多少个进程就取决于你的CPU核心数了.

按照termcaps-HTOP(Linux下的系统监控与进程管理软件)的方式管理

通过pm2 list命令来观察所有运行的进程以及它们的状态已经足够好了.但是怎么来追踪它们的资源消耗呢?别担心,用这个命令:

$ pm2 monit

你可以得到进程(以及集群)的CPU的使用率和内存占用.

pm2 monit

声明: node-usage 到目前为止还不支持MacOS(随便什么性能要求),不过它在Linux下运行良好.

现在,让我们来核实一下我们的集群,还有对内存堆栈的垃圾回收,我们假设你已经有一个HTTP基准测试工具(如果没有,你一定要使用 WRK):

$ express bufallo // Create an express app $ cd bufallo
$ npm install
$ pm2 start app.js -i max
$ wrk -c 100 -d 100 http://localhost:3000/

在另一个终端,运行监控选项:

$ pm2 monit

耶~

实时集中log处理

现在你不得不管理多个集群进程:一个爬取数据,一个处理数据,等等...这就意味着大量log,你可以按照老式的方法处理:

$ tail -f /path/to/log1 /path/to/log2 ...

但我们想的很周到,我们增加了logs功能:

$ pm2 logs

pm2 monit

快速恢复

现在事情一切顺利,你的进程嗡嗡的运行着,你需要做一次硬重启(hard restart).现在吗?是的,首先,dump掉:

$ pm2 dump

然后,你可以从文件中恢复它:

$ pm2 kill // 让我们假设一个PM2停掉了
$ pm2 resurect // 我所有的进程又满血满状态复活了

强健的API

比方说,你想要监控所有被PM2管理的进程,而且同时还想监控运行这些进程的机器的状态(甚至希望创建一个Angular应用来调用这些API...):

$ pm2 web

打开浏览器输入 http://localhost:9615 ,我嘞个去!!

对了,还有很多特性...

  • 全部测试通过,
  • 新一代的update-rc.d(pm2 startup),当然它还是alpha版,
  • 开发模式下更改文件自动重启(pm2 dev),也同样还是草稿,
  • 自动刷新log,
  • 快捷的通过JSON文件管理你的应用,
  • 在error log里记录未捕获的异常,
  • 记录重启的次数和时间,
  • 退出时自动杀死进程.

 

下一步计划?

首先,你可以去Github上粉我们(我们喜欢stars): https://github.com/Unitech/pm2.

我们开发的PM2提供了先进完整的Node进程管理解决方案.我们希望能有更多的人来帮助我们:更多的pull requests.一些还停留在开发路线图上面的功能我们会尽快完成,下面这些就是:

  • 远程管理/状态校验,
  • 嵌入式跨进程通信通道(消息总线),
  • V8垃圾回收的内存泄漏检查,
  • Web界面,
  • 监控数据持久化,
  • 邮件通知.

特别感谢 Makara Wang 的观点和工具,还有 Alex Kocharin 提的建议和提交的代码.