你们是如何一步步成为学会数控编程怎么学的

对学习编程者的忠告:眼过千遍不如手过一遍!书看千行不如手敲一行!手敲千行不如单步一行!单步源代码千行不如单步对应汇编一行!
为什么你应该学习编程?
学习代码可以锐化思维
程序可能会工作,也可能不会工作。如果它不能正常工作,那么就意味着有需要分析和集中梳理的bug。但是不同于数学难题,即使你的解决方案是错误的,程序也根据代码会做一些意想不到的事情...
学编程为什么这么难?每个新手绝对要知道的那些事
Quincy Larson曾经只是个穿西装坐办公室的家伙,有一天,他决定要学习编程。于是,他到处打听关于编程的事情。他从Ruby入手,接着很快学了Scala、Clojure和Go等多种其他的编程语言。...
使用VC调用matlab engine编程
使用VC调用matlab engine编程
首先要在电脑中装VC和MATLAB,我的电脑装的是VC6.0和MATLAB7.1.
Matlab Engine 采用Client...
一步步学如何使用VC调用matlab engine编程
这里不再介绍VC和matlab的各自优劣。直接给出一个最简单的例子。跟着文中步骤一步步来做,肯定会成功的。
废话少说。
Matlab Engine 采用Clien...
tensorflow的学习,开始慢慢入门
本博客会记录我学习tensorflow的过程,后期在nlp上进行实战的会比较多。加油,一步步慢慢积累。现在自己就是一个小白,慢慢来吧。
1. tensorflow的简单入门
推荐网址:https:...
干货 | 怎样才能一步步学透Java?
我们都知道,Java在桌面应用方面并不是很擅长,所以做Java最后大致是两个方向,web企业级开发(JavaWeb J2EE)和手机android开发。一般从事Java的开发人员都会从J2SE开始学习...
没有更多推荐了,如果说我什么都不懂,比如一张白纸,那我想学编程,那么应该学习哪些东西,应该怎么一步步学_百度知道
如果说我什么都不懂,比如一张白纸,那我想学编程,那么应该学习哪些东西,应该怎么一步步学
就是说什么都不懂,那么先学什么,再学什么,.最后可以学会编程呢...如果最后目标是电脑高手的话,那又应该学什么。..就当我第一次看到电脑,对电脑一点不懂,那么改怎么成为高手??...
就是说什么都不懂,那么先学什么,再学什么,.最后可以学会编程呢...如果最后目标是电脑高手的话,那又应该学什么。..就当我第一次看到电脑,对电脑一点不懂,那么改怎么成为高手??
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
没事侃两句
没事侃两句
采纳数:26
获赞数:102
擅长:暂未定制
首先说一说进入计算机专业的目的,我个人是因为十分喜欢IT业,很喜欢折腾电脑,所以在填报志愿是毫不犹豫的在报了的所有的学校都填写的计算机专业,梦想着进入计算机专业后能遇见很多高手,能交到几个知己,谁之进来后却大失所望。计算机专业的学生有很多以前对计算机不怎么了解,而且还有部分人进大学前连计算机摸都没摸过,对计算机很熟悉的很少,高手更是凤毛麟角,大多数人是服从了父母之命,显而易见,目前社会最热的行业是IT业,工资最高的也是IT业,抱着这个因素,大多数考生的父母都让自己的孩子进入了计算机专业,而大多数学生也天真的认为从计算机专业毕业后就能够像电视里演的大多数白领一样每天只用坐在办公室里和同事们聊聊天,和老板吃吃饭,每天签几个字然后就有高工资等着你去拿。 进校后他们发现其实他们在专业课方面什么都听不懂,自己也一点兴趣都没有,没有兴趣那就没有学习的动力,而且这个专业是要靠悟性的,而兴趣是培养悟性的第一步,然后他们会发现越往后学专业课越难,也越听不懂,好一点的就会狠下心来,硬着头皮苦学一通,有可能也就能走出一片路来,而不好的就会就此放弃,只需要混着考试通过,混毕业,找个单位安心上班。有些人上了几年学连自己上哪些课都不知道;拿个程序他分不清是用C语言写的还是用PASCAL写的;不小心进了DOS不知道怎么再回到WINDOWS。但说起游戏来头头是道,好像每个都是职业玩家一样,有的每天只知道泡在网吧。这就是中国计算机人才下一代的悲哀! 再说现在计算机专业大学生的学习和生活。大多数计算机专业的学生对本专业的发展及前景一无所知,每天都是看小说、玩游戏、看电影、打牌、喝酒、睡觉等等很有&前途&的事情。偶尔看见一两个同学看看与计算机专业有关的书,跑去拿来一看,全是什么&游戏攻略&、&黑客秘技&等此类书籍。还有的人连C语言和C++谁是谁都还没搞清楚,就拿本VC的书&刻苦钻研&,真不知他们看懂了没有。好多学生都买了电脑,但用处都是游戏机+碟机+音响,每天都在用电脑玩着各种流行的游戏、看着最新的大片、听着时尚的音乐,就是不用电脑学习。有的学生甚至问我电脑除了玩游戏还能干什么,我问他你为什么这么问,他告诉我他觉得电脑只能用来玩游戏,不知道还能不能干干别的什么。据我了解,近几年在国内好几所高校的计算机专业的毕业生的毕业设计竟然是做网页,在大学了四年,学完了《数据结构》、《软件工程》、《C语言》等专业课后,竟然交了一个没有学过计算机的人自学一两天就能做好的东西! 这就是大多数计算机专业的学生,在我在大学玩了两年之后,我突然明白该为自己的未来打算打算了,但还有许多人仍然还什么都不明白,所以就有了这篇文章。 如果你是以上我说的那种受父母之命来学计算机的学生,如果你看了《计算机应用文摘》第15期的《写给想当程序员的朋友》一文后,发现自己没有当程序员的欲望,那么我这里有几条路给你选择: 1、网页制作,将来去网站工作! 2、学习3D MAX等软件,去作动画! 3、学习美术设计! 4、网络,将来考个CCNA,去专业组网! 5、在保证能顺利毕业的前提下,去疯狂玩游戏,做个职业玩家或做一个或几个网络游戏的GM。(我身边就有这样的人) 6、以上五条都与计算机有关,要有一定的专业知识,但比起你的专业课简单多了。如果你看到这里还不觉得有适合你干的,那这条最适合你:在你们学校去修双学位,修一个自己感兴趣的专业,计算机真的不适合你! 如果以上几条有适合你的,那么你就努力去做适合你的那一片天地,去看杂志的下一篇文章,下面的文字你看了只会浪费你的时间。 如果你是计算机专业的在校大学生,而且想当程序员,那么请往下看: 1、大学生活丰富多彩,会令你一生都难忘,但难忘有很多种,你可以学了很多东西而难忘,也会因为什么都没学到而难忘! 2、计算机专业是一个很枯燥的专业,但即来之、则安之,只要你努力学,也会发现其中的乐趣的。 3、记住:万丈高楼平地起!基础很重要,尤其是专业基础课,只有打好基础才能学得更深。 4、C语言是基础,很重要,如果你不学好C语言,那么什么高级语言你都学不好。 5、C语言与C++语言是两回事。就象大熊猫和小熊猫一样,只是名字很像! 6、请先学习专业课《数据结构》、《计算机组成原理》,不要刚开始就拿着一本VC在看,你连面向对象都搞不清楚,看VC没有任何用处。 7、对编程有一定的认识后,就可以学习C++了。(是C++而不是VC,这两个也是两码事!C++是一门语言,而VC教程则是讲解如何使用MFC类库,学习VC应建立在充分了解C++的基础之上。看VC的书,是学不了C++语言的。) 8、学习编程的秘诀是:编程,编程,再编程; 9、认真学习每一门专业课,那是你的吃饭碗。 10、在学校的实验室就算你做错一万次程序都不会有人骂你,如果你在公司你试试看!所以多去实验室上机,现在错的多了,毕业后就错的少了。 11、从现在开始,在写程序时就要养成良好的习惯。 12、不要漏掉书中任何一个练习题--请全部做完并记录下解题思路。 13、你会买好多参考书,那么请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码。 14、VC、C#、.NET这些东西都会过时,不会过时的是数据结构和优秀的算法! 15、记住:书到用时方恨少。不要让这种事发生在你身上,在学校你有充足的时间和条件读书,多读书,如果有条件多读原版书,你要知道,当一个翻译者翻译一本书时,他会不知不觉把他的理念写进书中,那本书就会变得像鸡肋! 16、我还是强调认真听专业课,因为有些课像《数据结构》、《编译原理》、《操作系统》等等,这种课老师讲一分钟能让你明白的内容,你自己看要看好几个月,有的甚至看了好几年都看不明白。 17、抓住在学校里的各种实践的机会,要为自己积累经验,就业时经验比什么都有用。 18、多去图书馆,每个学校的图书馆都有很多好书等你去看! 19、编程不是技术活,而是体力活。 20、如果你决定了要当一个好的程序员,那么请你放弃游戏,除非你是那种每天只要玩游戏就能写出好程序的天才! 21、你要有足够的韧性和毅力!有个高手出了一道题测试你的韧性和毅力:找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。 22、找到只属于你自己的学习方法!不要盲目的追随别人的方法,适合自己的才是最好的! 23、请热爱程序员这项工作! 以上的话有些是我的经验,有些是我从高手那里直接COPY来的,但他们都很有用,记住他们,并遵守他们,那你们一定会成功! 对于大多数初学者来说,好多人有这种问题存在:我到底先学什么?学C/C++?还是学VC?还是学Borland C++ Builder呢?还是Delphi?哪一个更好呢?学习程序设计和学习程序设计语言究竟是怎么一个关系?初学者究竟应该如何取舍呢?就这些问题,我从一个高手那里看了一下的这段话,可以帮助在这方面有问题的人:学习程序设计就好比学习射击,而程序设计语言就对应射击中的气枪、手枪、步枪等各种枪械。学习射击必须要选择一种枪械,不可能没有枪还能学好射击的,也不可能同时学会使用所有的枪械。但是,如果掌握一种枪械的射击,再学别的也就触类旁通了。因为在熟悉一种枪械的同时,也学习了射击技术本身。再学其他的,自然事半功倍。学习程序设计也是一样,必然要从学习一门程序设计语言开始入手。在学会系统的编程理念之后,用什么工具都一样! 之所以写这篇文章呢是因为自己眼看身边那么多的同学一个个都&不务正业&,荒废了学业,心急如焚,自己也荒废了好几年,眼看微软的Windows从3.X到现在的2003 Server,而中国的软件业还是在原地踏步,难道我们真要每年等微软给他的操作系统换一次名字,我们给他交一次钱吗?这么大的利润为什么不留给我们自己,为什么不让别的国家给我们交钱呢?这是广大中国程序员的一个共同的梦,要实现这个梦的人是现在还在大学里的&准程序员&们,他们是中国软件明天的希望!希望广大计算机业的大学生看到这篇文章后,睡觉的能醒来,玩游戏的能停下来,在网吧的能出来,一起拿起课本,坐在电脑前,用程序写出中国软件业明天的辉煌。 最后:强烈劝告各位计算机专业的大一新生,千万别沉迷于电脑游戏,尤其是网游,我身边由于沉迷玩游而无法自拔,越来越堕落的人比比皆是!!希望你们对计算机真正产生兴趣,你对编程的兴趣越高,你的编程能力便会越强。把我好自己吧!!!!!!!!!!!!!!!
功夫小子♂董
功夫小子♂董
获赞数:16
擅长:暂未定制
什么什么shénme1.表示询问某人、某物或某事的本身或性质,例:你从那里得到了什么消息2.表示询问某物或某事的情况,例:告诉我你在找什么3.虚指,表示不肯定的事物,例:闻到一种什么花香4.表示否定,例:他算什么,你竟挂念他5.表示责难,例:你笑什么?6.表示询问在它前面的词或一系列的词中所未包括的可能性,例:这是爬行动物、两栖动物,还是别的什么东西7.表示惊讶或激动,例:什么,不吃早餐啦!8.一切事物,例:无论大地——生育一切的母亲——出产什么9.用在“也”前,表示所说的范围之内无例外,例:他什么也不怕10.用在“都”前,表示所说的范围之内无例外,例:只要认真学,什么都能学会引申什么的shénmede1.用在一个词组或并列的几个词组后面表示“…之类”的意思,例:他就喜欢看小说什么的
采纳数:63
获赞数:107
擅长:暂未定制
先不要想那么多了,还是从基础开始吧,我建议学C++
采纳数:57
获赞数:1936
无论最终目的是高手还是仅仅入门...C语言都是不可或缺的..如果熟练后可以C++或JAVA
其他1条回答
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
点击阅读原文
一步步搭建物联网系统
日 发布,来源:
一步步搭建物联网系统(教你设计物联网系统)
纸质版《自己动手设计物联网》现已出版
立即购买:、
一步步搭建物联网系统(教你设计物联网系统)
源自毕业论文:
本作品采用进行许可。
(C) 2014 .
设计物联网系统是件有意思的事情,它需要考虑到软件、硬件、通讯等多个不同方面。通过探索不同的语言,不同的框架,从而形成不同的解决方案。
在这里,我们将对设计物联网系统有一个简单的介绍,并探讨如何设计一个最小的物联网系统。
1.1 目标读者
目标读者: 初入物联网领域,希望对物联网系统有一个大概的认识和把握,并学会掌握一个基础的物联网系统的设计。
硬件开发人员,对物联网有兴趣。
没有web开发经验
几乎为0的linux使用经验
想快速用于生产环境
对硬件了解有限的开发人员。
没接触过51、ARM、Arduino
想了解以下内容:
RESTful与IOT
本文档对一些概念(如)只做了一些基本介绍,以方便读者理解。如果您想进一步了解这些知识,会列出一些推荐书目,以供参考。
1.2 不适合人群
如果你是在这方面已经有了丰富经验的开发者。
不是为了学习而学习这方面的知识。
关于内容的选择,这是一个有意思的话题,因为我们很难判断不同的开发者用的是怎样的语言,用的是怎样的框架。
于是我们便自作主张地选择了那些适合于理论学习的语言、框架、硬件,去除掉其他一些我们不需要考虑的因素,如语法,复杂度等等。当然,这些语言、框架、硬件也是最流行的。
Arduino: 如果你从头开始学过硬件的话,那么你会爱上它的。
Raspberry PI: 如果你从头编译过GNU/Linux的话,我想你会爱上她的。
Python: 简单地来说,你可以方便地使用一些扩展,同时代码就表达了你的想法。
PHP : 这是一门容易部署的语言,我想你只需要在你的Ubuntu机器上,执行一下脚本就能完成安装了。而且,如果你是一个硬件开发者的话,你会更容易地找到其他开发者。
Javascript : 考虑到javascript这门语言已经无处不在了,而且会更加流行。所以,在这里CoAP、MQTT等版本是基于Nodejs的。
HTML、CSS : 这是必须的,同样,他们仍然无处不在。
GNU/Linux: 作为部署到服务器的一部分——你需要掌握他。当然如果你要用WAMP也是可以的。
CoAP: 用NodeJS构建IOT CoAP物联网
1.3.1 为什么没有C ?
C都不懂还跑过来干嘛。
1.3.2 为什么不是JAVA ?
大有以下两个原因
学习JAVA的人很多,但是它不适合我们集中精力构建与学习,因为无关的代码太多了。
之前以及现在,我还是不喜欢JAVA (我更喜欢脚本语言,可以提高工作效率)。
1.4 如何阅读
这只是一个小小的建议,仅针对于在选择阅读上没有经验的读者。
软件初学者
硬件开发者
没有web经验的开发者
从第二部分开始
我们会在前面十章里简单介绍一些必要的基础知识,这些知识将会在后面我们构建物联网系统时用到。
某一天,正走在回学校的路上的我突然想到:“未来将会是一个科技的时代——虽然现在也是——只是在未来,科技将会无处不在。如果我们依旧对周围这些无处不在的代码一无所知的话,或许我们会成为黑客帝国之中被控制的普通人。”于是开始想着,有一天人们会像学习一门语言一样开始学习编程,直到又有一天我看到了学习编程如同学习一门语言的说法。这又恰好在我做完最小物联网系统之后,算是一个有趣的时间点,我开始想着像之前做最小物联网系统的那些步骤一样,写一个简单的入门。也可以补充好之前在这个最小物联网系统缺失的那些东西,给那些正在开始试图去解决编程问题的人。
让我们先从身边的语言下手,也就是现在无处不在的html+javascript+css。
2 无处不在的HTML
之所以从html开始,是因为我们不需要配置一个复杂的开发环境,也许你还不知道开发环境是什么东西,不过这也没关系,毕竟这些知识需要慢慢的接触才能有所了解,尤其是对于普通的业余爱好者来说,当然,对于专业选手言自然不是问题。HTML是Web的核心语言,也算是比较基础的语言。
2.1 html的hello,world
Hello,world是一个传统,所以在这里也遵循这个有趣的传统,我们所要做的事情其实很简单,虽然也有一点点hack的感觉。——让我们先来新建一个文并命名为“helloworld.html”。
(PS:大部分人应该都是在windows环境下工作的,所以你需要新建一个文本,然后重命名,或者你需要一个编辑器,在这里我们推荐用sublime text。破解不破解,注册不注册都不会对你的使用有太多的影响。)
hello,world
保存为-&“helloworld.html”,
双击打开这个文件。 正常情况下都应该是用你的默认浏览器打开。只要是一个正常工作的现代浏览器,都应该可以看到上面显示的是“Hello,world”。
这才是最短的hello,world程序,但是呢?在ruby中会是这样子的
2.0.0-p353 :001 & p "hello,world"
"hello,world"
=& "hello,world"
2.0.0-p353 :002 &
等等,如果你了解过html的话,会觉得这一点都不符合语法规则,但是他工作了,没有什么比安装完Nginx后看到It works!更让人激动了。
遗憾的是,它可能无法在所有的浏览器上工作,所以我们需要去调试其中的bug。
2.1.1 调试hello,world
我们会发现我们的代码在浏览器中变成了下面的代码,如果你和我一样用的是chrome,那么你可以右键浏览器中的空白区域,点击审查元素,就会看到下面的代码。
&head&&/head&
&body&hello,world&/body&
这个才是真正能在大部分浏览器上工作的代码,所以复制它到编辑器里吧。
2.1.2 说说hello,world
我很不喜欢其中的&*&&/*&,但是我也没有找到别的方法来代替它们,所以这是一个设计得当的语言。甚至大部分人都说这算不上是一门真正的语言,不过html的原义是
超文本标记语言
所以我们可以发现其中的关键词是标记——markup,也就是说html是一个markup,head是一个markup,body也是一个markup。
然而,我们真正工作的代码是在body里面,至于为什么是在这里面,这个问题就太复杂了。打个比方来说:
我们所使用的汉语是人类用智慧创造的,我们所正在学的这门语言同样也是人类创造的。
我们在自己的语言里遵循着桌子是桌子,凳子是凳子的原则,很少有人会问为什么。
2.1.3 想用中文?
所以我们也可以把计算机语言与现实世界里用于交流沟通的语言划上一个等号。而我们所要学习的语言,并不是我们最熟悉的汉语语言,所以我们便觉得这些很复杂,但是如果我们试着用汉语替换掉上面的代码的话
&头&&结束头&
&身体&你好,世界&结束身体&
&结束语言&
这看上去很奇怪,只是因为是直译过去的原因,也许你会觉得这样会好理解一点,但是输入上可就一点儿也不方便,因为这键盘本身就不适合我们去输入汉字,同时也意味着可能你输入的会有问题。
让我们把上面的代码代替掉原来的代码然后保存,打开浏览器会看到下面的结果
&语言& &头&&结束头& &身体&你好,世界&结束身体& &结束语言&
更不幸的结果可能是
&璇?█& &澶?&&缁撴潫澶?& &韬?綋&浣犲ソ锛屼笘鐣?&缁撴潫韬?綋& &缁撴潫璇?█&
这是一个编码问题,对中文支持不友好。
我们把上面的代码改为和标记语言一样的结构
&身体&你好,世界&/身体&
&结束语言&
于是我们看到的结果便是
&语言& &头& &身体&你好,世界
被chrome浏览器解析成什么样了?
&html&&head&&/head&&body&&语言&
&头&&!--头--&
&身体&你好,世界&!--身体--&
&!--语言--&
&/body&&/html&
结尾的是注释,写给人看的代码,不是给机器看的,所以机器不会去理解这些代码。
但是当我们把代码改成
&whatwewanttosay&你好世界&/whatwewanttosay&
浏览器上面显示的内容就变成了
或许你会觉得很神奇,但是这一点儿也不神奇,虽然我们的中文语法也遵循着标记语言的标准,但是我们的浏览器不支持中文标记。
浏览器对中文支持不友好。
浏览器对英文支持友好。
刚开始的时候不要对中文编程有太多的想法,这是很不现实的:
现有的系统都是基于英语语言环境构建的,对中文支持不是很友好。
中文输入的速度在某种程度上来说没有英语快。
我们离开话题已经很远了,但是这里说的都是针对于那些不满于英语的人来说的,只有当我们可以从头构建一个中文系统的时候才是可行的,而这些就要将cpu、软件、硬件都包含在内,甚至我们还需要考虑重新设计cpu的结构,在某种程度上来说会有些不现实。或许,需要一代又一代人的努力。忘记那些吧,师夷长之技以治夷。
2.2 其他html标记
添加一个标题,
&title&标题&/title&
&body&hello,world&/body&
我们便可以在浏览器的最上方看到“标题”二字,就像我们常用的淘宝网,也包含了上面的东西,只是还包括了更多的东西,所以你也可以看懂那些我们可以看到的淘宝的标题。
&title&标题&/title&
hello,world
&h1&大标题&/h1&
&h2&次标题&/h2&
&h3&...&/h3&
&li&列表1&/li&
&li&列表2&/li&
更多的东西可以在一些书籍上看到,这边所要说的只是一次简单的语言入门,其他的东西都和这些类似。
2.2.1 美妙之处
我们简单地上手了一门不算是语言的语言,浏览器简化了这其中的大部分过程,虽然没有C和其他语言来得有专业感,但是我们试着去开始写代码了。我们可能在未来的某一篇中可能会看到类似的语言,诸如python,我们所要做的就是
$ python file.py
=&hello,world
然后在终端上返回结果。只是因为在我看来学会html是有意义的,简单的上手,然后再慢慢地深入,如果一开始我们就去理解指针,开始去理解类。我们甚至还知道程序是怎么编译运行的时候,在这个过程中又发生了什么。虽然现在我们也没能理解这其中发生了什么,但是至少展示了
中文编程语言在当前意义不大,不现实,效率不高兼容性差
语言的语法是固定的。(ps:虽然我们也可以进行扩充,我们将会在后来支持上述的中文标记。)
已经开始写代码,而不是还在配置开发环境。
随身的工具才是最好的,最常用的code也才是实在的。
2.2.2 更多
我们还没有试着去解决“某商店里的糖一颗5块钱,小明买了3颗糖,小明一共花了多少钱”的问题。也就是说我们学会的是一个还不能解决实际问题的语言,于是我们还需要学点东西,比如javascript,css。我们可以将Javascript理解为解决问题的语言,html则是前端显示,css是配置文件,这样的话,我们会在那之后学会成为一个近乎专业的程序员。我们刚刚学习了一下怎么在前端显示那些代码的行为,于是我们还需要Javascript。
3 无处不在的Javascript
Javascript现在已经无处不在了,也许你正打开的某个网站,他便可能是node.js+json+javascript+mustache.js完成的,虽然你还没理解上面那些是什么,也正是因为你不理解才需要去学习更多的东西。但是你只要知道Javascript已经无处不在了,它可能就在你手机上的某个app里,就在你浏览的网页里,就运行在你IDE中的某个进程里。
3.1 Javascript的Hello,world
这里我们还需要有一个helloworld.html,Javascript是专为网页交互而设计的脚本语言,所以我们一点点来开始这部分的旅途,先写一个符合标准的helloworld.html
&!DOCTYPE html&
&head&&/head&
&body&&/body&
然后开始融入我们的javascript,向HTML中插入Javascript的方法,就需要用到html中的&script&标签,我们先用页面嵌入的方法来写helloworld。
&!DOCTYPE html&
document.write('hello,world');
&body&&/body&
按照标准的写法,我们还需要声明这个脚本的类型
&!DOCTYPE html&
&script type="text/javascript"&
document.write('hello,world');
&body&&/body&
没有显示hello,world?试试下面的代码
&!DOCTYPE html&
&script type="text/javascript"&
document.write('hello,world');
&noscript&
disable Javascript
&/noscript&
3.2 更js一点
我们需要让我们的代码看上去更像是js,同时是以js结尾。就像C语言的源码是以C结尾的,我们也同样需要让我们的代码看上去更正式一点。于是我们需要在helloworld.html的同一文件夹下创建一个app.js文件,在里面写着
document.write('hello,world');
同时我们的helloworld.html还需要告诉我们的浏览器js代码在哪里
&!DOCTYPE html&
&script type="text/javascript" src="app.js"&&/script&
&noscript&
disable Javascript
&/noscript&
3.2.1 从数学出发
让我们回到第一章讲述的小明的问题,从实际问题下手编程,更容易学会编程。小学时代的数学题最喜欢这样子了——某商店里的糖一个5块钱,小明买了3个糖,小明一共花了多少钱。在编程方面,也许我们还算是小学生。最直接的方法就是直接计算3x5=?
document.write(3*5);
document.write实际也我们可以理解为输出,也就是往页面里写入3*5的结果,在有双引号的情况下会输出字符串。我们便会在浏览器上看到15,这便是一个好的开始,也是一个糟糕的开始。
3.3 设计和编程
对于实际问题,如果我们只是止于所要得到的结果,很多年之后,我们就成为了code monkey。对这个问题进行再一次设计,所谓的设计有些时候会把简单的问题复杂化,有些时候会使以后的扩展更加简单。这一天因为这家商店的糖价格太高了,于是店长将价格降为了4块钱。
document.write(3*4);
于是我们又得到了我们的结果,但是下次我们看到这些代码的时候没有分清楚哪个是糖的数量,哪个是价格,于是我们重新设计了程序
document.write(tang*num);
这才能叫得上是程序设计,或许你注意到了“;”这个符号的存在,我想说的是这是另外一个标准,我们不得不去遵守,也不得不去fuck。
3.3.1 函数
记得刚开始学三角函数的时候,我们会写
sin 30=0.5
而我们的函数也是类似于此,换句话说,因为很多搞计算机的先驱都学好了数学,都把数学世界的规律带到了计算机世界,所以我们的函数也是类似于此,让我们做一个简单的开始。
function hello(){
return document.write("hello,world");
当我第一次看到函数的时候,有些小激动终于出现了。我们写了一个叫hello的函数,它返回了往页面中写入hello,world的方法,然后我们调用了hello这个函数,于是页面上有了hello,world。
function sin(degree){
return document.write(Math.sin(degree));
在这里degree就称之为变量。 于是输出了-0.8602,而不是0.5,因为这里用的是弧度制,而不是角度制。
的输出结果有点类似于sin 30。写括号的目的在于,括号是为了方便解析,这个在不同的语言中可能是不一样的,比如在ruby中我们可以直接用类似于数学中的表达:
2.0.0-p353 :004 & Math.sin 30
=& -0.8618
2.0.0-p353 :005 &
我们可以在函数中传入多个变量,于是我们再回到小明的问题,就会这样去编写代码。
function calc(tang,num){
result=tang*num;
document.write(result);
calc(3,4);
但是从某种程度上来说,我们的calc做了计算的事又做了输出的事,总的来说设计上有些不好。
3.3.2 重新设计
我们将输出的工作移到函数的外面,
function calc(tang,num){
return tang*num;
document.write(calc(3,4));
接着我们用一种更有意思的方法来写这个问题的解决方案
function calc(tang,num){
return tang*num;
function printResult(tang,num){
document.write(calc(tang,num));
printResult(3, 4)
看上去更专业了一点点,如果我们只需要计算的时候我们只需要调用calc,如果我们需要输出的时候我们就调用printResult的方法。
3.3.3 object和函数
我们还没有说清楚之前我们遇到过的document.write以及Math.sin的语法为什么看上去很奇怪,所以让我们看看他们到底是什么,修改app.js为以下内容
document.write(typeof document);
document.write(typeof Math);
typeof document会返回document的数据类型,就会发现输出的结果是
object object
所以我们需要去弄清楚什么是object。对象的定义是
无序属性的集合,其属性可以包含基本值、对象或者函数。
创建一个object,然后观察这便是我们接下来要做的
store.tang=4;
store.num=3;
document.write(store.tang*store.num);
我们就有了和document.write一样的用法,这也是对象的美妙之处,只是这里的对象只是包含着基本值,因为
typeof story.tang="number"
一个包含对象的对象应该是这样子的。
store.tang=4;
store.num=3;
document.writeln(store.tang*store.num);
var wall=new Object();
wall.store=store;
document.write(typeof wall.store);
而我们用到的document.write和上面用到的document.writeln都是属于这个无序属性集合中的函数。
下面代码说的就是这个无序属性集中中的函数。
var IO=new Object();
function print(result){
document.write(result);
IO.print=print;
IO.print("a obejct with function");
IO.print(typeof IO.print);
我们定义了一个叫IO的对象,声明对象可以用
var store={};
var store=new Object{};
两者是等价的,但是用后者的可读性会更好一点,我们定义了一个叫print的函数,他的作用也就是document.write,IO中的print函数是等价于print()函数,这也就是对象和函数之间的一些区别,对象可以包含函数,对象是无序属性的集合,其属性可以包含基本值、对象或者函数。
复杂一点的对象应该是下面这样的一种情况。
var Person={name:"phodal",weight:50,height:166};
function dream(){
Person.future=dream;
document.write(typeof Person);
document.write(Person.future);
而这些会在我们未来的实际编程过程中用得更多。
3.3.4 面向对象
开始之前先让我们简化上面的代码,
Person.future=function dream(){
看上去比上面的简单多了,不过我们还可以简化为下面的代码。。。
var Person=function(){
this.name="phodal";
this.weight=50;
this.height=166;
this.future=function dream(){
return "future";
var person=new Person();
document.write(person.name+"&br&");
document.write(typeof person+"&br&");
document.write(typeof person.future+"&br&");
document.write(person.future()+"&br&");
只是在这个时候Person是一个函数,但是我们声明的person却变成了一个对象一个Javascript函数也是一个对象,并且,所有的对象从技术上讲也只不过是函数。这里的“&br&”是HTML中的元素,称之为DOM,在这里起的是换行的作用,我们会在稍后介绍它,这里我们先关心下this。this关键字表示函数的所有者或作用域,也就是这里的Person。
上面的方法显得有点不可取,换句话说和一开始的
document.write(3*4);
一样,不具有灵活性,因此在我们完成功能之后,我们需要对其进行优化,这就是程序设计的真谛——解决完实际问题后,我们需要开始真正的设计,而不是解决问题时的编程。
var Person=function(name,weight,height){
this.name=name;
this.weight=weight;
this.height=height;
this.future=function(){
return "future";
var phodal=new Person("phodal",50,166);
document.write(phodal.name+"&br&");
document.write(phodal.weight+"&br&");
document.write(phodal.height+"&br&");
document.write(phodal.future()+"&br&");
于是,产生了这样一个可重用的Javascript对象,this关键字确立了属性的所有者。
Javascript还有一个很强大的特性,也就是原型继承,不过这里我们先不考虑这些部分,用尽量少的代码及关键字来实际我们所要表达的核心功能,这才是这里的核心,其他的东西我们可以从其他书本上学到。
所谓的继承,
var Chinese=function(){
this.country="China";
var Person=function(name,weight,height){
this.name=name;
this.weight=weight;
this.height=height;
this.futrue=function(){
return "future";
Chinese.prototype=new Person();
var phodal=new Chinese("phodal",50,166);
document.write(phodal.country);
完整的Javascript应该由下列三个部分组成:
核心(ECMAScript)——核心语言功能
文档对象模型(DOM)——访问和操作网页内容的方法和接口
浏览器对象模型(BOM)——与浏览器交互的方法和接口
我们在上面讲的都是ECMAScript,也就是语法相关的,但是JS真正强大的,或者说我们最需要的可能就是对DOM的操作,这也就是为什么jQuery等库可以流行的原因之一,而核心语言功能才是真正在哪里都适用的,至于BOM,真正用到的机会很少,因为没有完善的统一的标准。
一个简单的DOM示例,
&!DOCTYPE html&
&noscript&
disable Javascript
&/noscript&
&p id="para" style="color:red"&Red&/p&
&script type="text/javascript" src="app.js"&&/script&
我们需要修改一下helloworld.html添加
&p id="para" style="color:red"&Red&/p&
同时还需要将script标签移到body下面,如果没有意外的话我们会看到页面上用红色的字体显示Red,修改app.js。
var para=document.getElementById("para");
para.style.color="blue";
接着,字体就变成了蓝色,有了DOM我们就可以对页面进行操作,可以说我们看到的绝大部分的页面效果都是通过DOM操作实现的。
3.5 美妙之处
这里说到的Javascript仅仅只是其中的一小小部分,忽略掉的东西很多,只关心的是如何去设计一个实用的app,作为一门编程语言,他还有其他强大的内制函数,要学好需要一本有价值的参考书。这里提到的只是其中的不到20%的东西,其他的80%或者更多会在你解决问题的时候出现。
我们可以创建一个对象或者函数,它可以包含基本值、对象或者函数。
我们可以用Javascript修改页面的属性,虽然只是简单的示例。
我们还可以去解决实际的编程问题。
4 无处不在的CSS
或许你觉得CSS一点儿也不重要,而事实上,如果说HTML是建筑的框架,CSS就是房子的装修。那么Javascript呢,我听到的最有趣的说法是小三——还是先让我们回到代码上来吧。
下面就是我们之前说到的代码,css将Red三个字母变成了红色。
&!DOCTYPE html&
&p id="para" style="color:red"&Red&/p&
&script type="text/javascript" src="app.js"&&/script&
var para=document.getElementById("para");
para.style.color="blue";
将字体变成了蓝色,CSS+HTML让页面有序的工作着,但是Javascript却打乱了这些秩序,有着唯恐世界不乱的精彩,也难怪被冠以小三之名了——或许终于可以理解,为什么以前人们对于Javascript没有好感了——不过这里要讲的是正室,也就是CSS,这时还没有Javascript。
4.2 关于CSS
这不是一篇专业讲述CSS的书籍,所以我不会去说CSS是怎么来的,有些东西我们既然可以很容易从其他地方知道,也就不需要花太多时间去重复。诸如重构等这些的目的之一也在于去除重复的代码,不过有些重复是不可少的,也是有必要的,而通常这些东西可能是由其他地方复制过来的。
到目前为止我们没有依赖于任何特殊的硬件或者是软件,对于我们来说我们最基本的需求就是一台电脑,或者可以是你的平板电脑,当然也可以是你的智能手机,因为他们都有个浏览器,而这些都是能用的,对于我们的CSS来说也不会有例外的。
CSS(Cascading Style Sheets),到今天我也没有记得他的全称,CSS还有一个中文名字是层叠式样式表,事实上翻译成什么可能并不是我们关心的内容,我们需要关心的是他能做些什么。作为三剑客之一,它的主要目的在于可以让我们方便灵活地去控制Web页面的外观表现。我们可以用它做出像淘宝一样复杂的界面,也可以像我们的书本一样简单,不过如果要和我们书本一样简单的话,可能不需要用到CSS。HTML一开始就是依照报纸的格式而设计的,我们还可以继续用上面说到的编辑器,又或者是其他的。如果你喜欢DreamWeaver那也不错,不过一开始使用IDE可无助于我们写出良好的代码。
忘说了,CSS也是有版本的,和windows,Linux内核等等一样,但是更新可能没有那么频繁,HTML也是有版本的,JS也是有版本的,复杂的东西不是当前考虑的内容。
4.3 代码结构
对于我们的上面的Red示例来说,如果没有一个好的结构,那么以后可能就是这样子。
&!DOCTYPE html&
&p style="font-size: 22color:#f00;text-align:padding-left: 20"&如果没有一个好的结构&/p&
&p style=" font-size:44color:#3text-indent: 2padding-left: 2"&那么以后可能就是这样子。。。。&/p&
虽然我们看到的还是一样的:
于是我们就按各种书上的建议重新写了上面的代码
&!DOCTYPE html&
&title&CSS example&/title&
&style type="text/css"&
font-size: 22px;
color:#f00;
text-align: center;
padding-left: 20px;
font-size:44px;
color:#3ed;
text-indent: 2em;
padding-left: 2em;
&p class="para"&如果没有一个好的结构&/p&
&p class="para2"&那么以后可能就是这样子。。。。&/p&
总算比上面好看也好理解多了,这只是临时的用法,当文件太大的时候,正式一点的写法应该如下所示:
&!DOCTYPE html&
&title&CSS example&/title&
&style type="text/css" href="style.css"&&/style&
&p class="para"&如果没有一个好的结构&/p&
&p class="para2"&那么以后可能就是这样子。。。。&/p&
&!DOCTYPE html&
&title&CSS example&/title&
&link href="./style.css" rel="stylesheet" type="text/css" /&
&p class="para"&如果没有一个好的结构&/p&
&p class="para2"&那么以后可能就是这样子。。。。&/p&
然后我们有一个像app.js一样的style.css放在同目录下,而他的内容便是
font-size: 22px;
color:#f00;
text-align: center;
padding-left: 20px;
font-size:44px;
color:#3ed;
text-indent: 2em;
padding-left: 2em;
这代码和JS的代码有如此多的相似
var para={
font_size:'22px',
color:'#f00',
text_align:'center',
padding_left:'20px',
而22px、20px以及#f00都是数值,因此:
var para={
font_size:22px,
color:#f00,
text_align:center,
padding_left:20px,
目测差距已经尽可能的小了,至于这些话题会在以后讨论到,如果要让我们的编译器更正确的工作,那么我们就需要非常多这样的符号,除非你乐意去理解:
(dotimes (i 4) (print i))
总的来说我们减少了符号的使用,但是用lisp便带入了更多的括号,不过这是一种简洁的表达方式,也许我们可以在其他语言中看到。
\d/[A-Z][a-z][a-z]/\d
上面的代码,是为了从一堆数据中找出“某日/某月/某年”。如果一开始不理解那是正则表达式,就会觉得那个很复杂。
这门语言可能是为设计师而设计的,但是设计师大部分还是不懂编程的,不过相对来说这门语言还是比其他语言简单易懂一些。
4.4 样式与目标
如下所示,就是我们的样式
font-size: 22px;
color:#f00;
text-align: center;
padding-left: 20px;
我们的目标就是
如果没有一个好的结构
所以样式和目标在这里牵手了,问题是他们是如何在一起的呢?下面就是CSS与HTML沟通的重点所在了:
4.4.1 选择器
我们用到的选择器叫做类选择器,也就是class,或者说应该称之为class选择器更合适。与类选择器最常一起出现的是ID选择器,不过这个适用于比较高级的场合,诸如用JS控制DOM的时候就需要用到ID选择器。而基本的选择器就是如下面的例子:
color:#f0f;
将代码添加到style.css的最下面会发现“如果没有一个好的结构”变成了粉红色,当然我们还会有这样的写法
color:#f0f;
为了产生上面的特殊的样式,虽然不好看,但是我们终于理解什么叫层叠样式了,下面的代码的重要度比上面高,也因此有更高的优先规则。
而通常我们可以通过一个
text-align:
这样的元素选择器来给予所有的p元素一个左对齐。
还有复杂一点的复合型选择器,下面的是HTML文件
&!DOCTYPE html&
&title&CSS example&/title&
&link href="./style.css" rel="stylesheet" type="text/css" /&
&p class="para"&如果没有一个好的结构&/p&
&div id="content"&
&p class="para2"&那么以后可能就是这样子。。。。&/p&
还有CSS文件
font-size: 22
color:#f00;
text-align:
padding-left: 20
font-size:44
text-indent: 2
padding-left: 2
color:#f0f;
div#content p {
font-size:22
4.5 更有趣的CSS
一个包含了para2以及para_bg的例子
&div id="content"&
&p class="para2 para_bg"&那么以后可能就是这样子。。。。&/p&
我们只是添加了一个黑色的背景
background-color:#000;
重新改变后的网页变得比原来有趣了很多,所谓的继承与合并就是上面的例子。
我们还可以用CSS3做出更多有趣的效果,而这些并不在我们的讨论范围里面,因为我们讨论的是be a geek。
或许我们写的代码都是那么的简单,从HTML到Javascript,还有现在的CSS,只是总有一些核心的东西,而不是去考虑那些基础语法,基础的东西我们可以在实践的过程中一一发现。但是我们可能发现不了,或者在平时的使用中考虑不到一些有趣的用法或者说特殊的用法,这时候可以通过观察一些精致设计的代码中学习到。复杂的东西可以变得很简单,简单的东西也可以变得很复杂。
5 无处不在的三剑客
这时我们终于了解了我们的三剑客,他们也就这么可以结合到一起了,HTML+Javascript+CSS是这一切的基础。而我们用到的其他语言如PHP、Python、Ruby等等到最后都会变成上面的结果,当然还有Coffeescript之类的语言都是以此为基础,这才是我们需要的知识。
5.1 Hello,Geek
有了一些些基础之后,我们终于能试着去写一些程序了。也是时候去创建一个像样的东西,或许你在一些界面设计方面的书籍看过类似的东西,可能我写得也没有那些内容好,只是这些都是一些过程。过去我们都是一点点慢慢过来的,只是现在我们也是如此,技术上的一些东西,事实上大家都是知道的。就好比我们都觉得我们可以开个超市,但是如果让我们去开超市的话,我们并不一定能赚钱。
学习编程的目的可能不在于我们能找到一份工作,那只是在编程之外的东西,虽然确实也是很确定的。但是除此之处,有些东西也是很重要的。
过去总是不理解为什么会一些人会不厌其烦地去回答别人的问题,有时候可能会想是一种能力越大责任越大的感觉,但是有时候在写一些博客或者回答别人的问题的时候我们又重新思考了这些问题,又重新学习了这些技能。所以这里可能说的不是关于编程的东西而是一些编程以外的东西,关于学习或者学习以外的东西。
5.2 从源码学习
过去总觉得学了一种语言的语法便算是学会了一种语言,直到有一天接触运用该语言的项目的时候,虽然也会写上几行代码,但是却不像这种语言的风格。于是这也是这一篇的意义所在了:
5.3 浏览器渲染过程
基本的渲染引擎的过程如下图所示:
解析HTML去构建DOM树
渲染树形结构
生成渲染的树形图布局
绘制树形图
对于Webkit浏览器来说,他的过程如下所示:
webkitflow
5.3.1 HTML
写好HTML的一个要点在于读别人写的代码,这只是一方面,我们所说的HTML方面的内容可能不够多,原因有很多,很多东西都需要在实战中去解决。读万卷书和行万里路,分不清哪个有重要的意义,但是如果可以同时做好两个的话,成长会更快的。
写好HTML应该会有下面的要点
了解标准及遵守绝大多数标准
注重可读性,从ID及CLASS的命名
关注SEO与代码的联系
或许在这方面我也算不上很了解,不过按笔者的经验来说,大致就是如此。
多数情况下我们的HTML是类似于下面这样子的
&div class="col-md-3 right"&
{% nevercache %}
{% include "includes/user_panel.html" %}
{% endnevercache %}
&div class="panel panel-default"&
&div class="panel-body"&
{% block right_panel %}
{% ifinstalled mezzanine.twitter %}
{% include "twitter/tweets.html" %}
{% endifinstalled %}
{% endblock %}
换句话说HTML只是基础,而不是日常用到的。我们的HTML是由template生成的,我们可以借助于mustache.js又或者是angluarjs之类的js库来生成最后的HTML,所以这里只是一个开始。
还需要了解的一部分就是HTML的另外一个重要的部分,DOM树形结构
5.4 DOM树形结构图
DOM是文档对象化模型(Document Object Model)的简称。DOM Tree是指通过DOM将HTML页面进行解析,并生成的HTML tree树状结构和对应访问方法。
5.4.1 javascript
这里以未压缩的jQuery源码和zepto.js作一个小小的比较,zepto.js是兼容jQuery的,因此我们举几个有意思的函数作一简单的比较,关于源码可以在官网上下载到。
在zepto.js下面判断一个值是否是函数的方面如下,
function isFunction(value) { return type(value) == "function" }
而在jQuery下面则是这样的
isFunction: function( obj ) {
return jQuery.type(obj) === "function";
而他们的用法是一样的,都是
$.isFunction();
jQuery的作法是将诸如isFunction,isArray这些函数打包到jQuery.extend中,而zepto.js的也是这样的,只不过多了一行
$.isFunction = isFunction
遗憾的是我也没去了解过为什么,之前我也没有看过这些库的代码,所以这个问题就要交给读者去解决了。jQuery里面提供了函数式编程接口,不过jQuery更多的是构建于CSS选择器之上,对于DOM的操作比javascript自身提供的功能强大得多。如果我们的目的在于更好的编程,那么可能需要诸如Underscore.js之类的库。或许说打包自己常用的函数功能为一个库,诸如jQuery
function isFunction(value) { return type(value) == "function" }
function isWindow(obj) { return obj != null && obj == obj.window }
function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }
function isObject(obj) { return type(obj) == "object" }
我们需要去了解一些故事背后的原因,越来越害怕GUI的原因之一,在于不知道背后发生了什么,即使是开源的,我们也无法了解真正的背后发生什么了。对于不是这个工具、软件的用户来说,开源更多的意义可能在于我们可以添加新的功能,当然还有免费。如果没有所谓的危机感,以及认为自己一直在学习工具的话,可以试着去打包自己的函数,打包自己的库。
var calc={
add: function(a,b){
return a+b;
sub: function(a,b){
return a-b;
dif: function(a,b){
然后用诸如jslint测试一下代码。
$ ./jsl -conf jsl.default.conf
JavaScript Lint 0.3.0 (JavaScript-C 1.5 )
Developed by Matthias Miller (http://www.JavaScriptLint.com)
/Users/fdhuang/beageek/chapter4/src/app.js(15): lint warning: missing semicolon
0 error(s), 1 warning(s)
于是我们需要在第15行添加一个分号。
最好的方法还是阅读别人的代码,而所谓的别人指的是一些相对较大的网站的,有比较完善的开发流程,代码质量也不会太差。而所谓的复杂的代码都是一步步构建上去的,罗马不是一天建成的。
有意思的是多数情况下,我们可能会用原型去开发我们的应用,而这也是我们需要去了解和掌握的地方,
function Calc(){
Calc.prototype.add=function(a,b){
return a+b;
Calc.prototype.sub=function(a,b){
return a-b;
我们似乎在这里展示了更多的Javascript的用法,但是这不是一好的关于Javascript的介绍,有一天我们还要用诸如qunit之类的工具去为我们的function写测试,这时就是一个更好的开始。
如果我们乐意的话,我们也可以构建一个类似于jQuery的框架,以用来学习。
作为一门编程语言来说,我们学得很普通,在某种意义上来说算不上是一种入门。但是如果我们可以在其他的好书在看到的内容,就没有必要在这里进行复述,目的在于一种学习习惯的养成。
CSS有时候很有趣,但是有时候有很多我们没有意识到的用法,这里以Bootstrap为例,这是一个不错的CSS库。最令人兴奋的是没有闭源的CSS,没有闭源的JS,这也就是前端好学习的地方所在了,不过这是一个开源的CSS库,虽然是这样叫的,但是称之为CSS库显然不合适。
a:visited {
text-decoration: underline;
a[href]:after {
content: " (" attr(href) ")";
abbr[title]:after {
content: " (" attr(title) ")";
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
这里有一些有趣的,值得一讲的CSS用法。
伪类选择器,如a:visited这样需要其他条件来对元素应用样式,用于已访问的链接。
属性选择器,如a[href]这样当a元素存在href这样的属性的时候来寻找应用元素。
其他的还需要去好好了解的就是CSS的盒模型,作为CSS的基石之一。
5.5 CSS盒模型图
(ps:以下内容来自于Mozilla Developer NetWorks)
CSS下这些矩形盒子由标准盒模型描述。这个模型描述元素内容占用空间。盒子有四个边界:外边距边界margin edge, 边框边界border edge, 内边距边界padding edge 与 内容边界content edge。
CSS Box Model
内容区域content area 是真正包含元素内容的区域。位于内容边界的内部,它的大小为内容宽度 或 content-box宽及内容高度或content-box高。
如果 box-sizing 为默认值, width, min-width, max-width, height, min-height 与 max-height 控制内容大小。
内边距区域padding area 用内容及可能的边框之间的空白区域扩展内容区域。它位于内边距边界内部,通常有背景——颜色或图片(不透明图片盖住背景颜色). 它的大小为 padding-box 宽与 padding-box 高。
内边距与内容边界之间的空间可以由 padding-top, padding-right, padding-bottom, padding-left 和简写属性 padding 控制。
边框区域border area 是包含边框的区域,扩展了内边距区域。它位于边框边界内部,大小为 border-box 宽和 border-box 高。由 border-width 及简写属性 border控制。
外边距区域margin area用空白区域扩展边框区域,以分开相邻的元素。它的大小为 margin-box 的高宽。
外边距区域大小由 margin-top, margin-right, margin-bottom, margin-left 及简写属性 margin 控制。
在 外边距合并 的情况下,由于盒之间共享外边距,外边距不容易弄清楚。
最后注意,对于行内非替换元素,其占用空间(行高)由 line-height 决定,即使有内边距与边框。
margin: 0px;
padding: 0px;
font-family: Helvetica;
这样的通用器用来进行全局选择的工具和我们用于抵消某个body对于子选择器的影响一样值得注意得多。
写博客似乎是一个不错的好习惯,作为一个不是很优秀的写手。对于来说,有时候发现原来能教会别人对于自己的能力来说算是一种肯定。有些时候教会别人才算是自己学会的表现,总会在项目上的时候需要自己去复述工作的一个过程,我们需要整理好我们的思路才能带给别人更多的收获。我们的笔记上总会留下自己的学习的一些过程,有些时候我们想要的只是一点点的鼓励,有时是诸如评论一类,有时可能是诸如访问量。更多的可能是我们可以重新整理自己的知识,好好复习一下,以便于好好记住,写出来是一个好的过程。
无处不在的三剑客就这样到了这里,写得似乎很多也很少,但是还是没有做出来一个东西,于是我们朝着这样一个方向前进。
6 GNU/Linux 强大且Free
6.1 什么是Linux
Linux是一种自由和开放源码的类UNIX操作系统内核。目前存在着许多不同的Linux发行版,可安装在各种各样的电脑硬件设备,从手机、平板电脑、路由器和影音游戏控制台,到桌上型电脑,大型电脑和超级电脑。 Linux是一个领先的操作系统内核,世界上运算最快的10台超级电脑运行的都是基于Linux内核的操作系统。
Linux操作系统也是自由软件和开放源代码发展中最著名的例子。只要遵循GNU通用公共许可证,任何人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统(也被称为GNU/Linux)。通常情况下,Linux被打包成供桌上型电脑和服务器使用的Linux发行版本。一些流行的主流Linux发行版本,包括Debian(及其衍生版本Ubuntu),Fedora和openSUSE等。Linux得名于电脑业余爱好者Linus Torvalds。
而不是如百度百科所讲的Linux操作系统是UNIX操作系统的一种克隆系统。它诞生于1991年的 Linux桌面[1]10 月5日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX类操作系统,并且使用人数还在迅猛增长。
Linux只是个内核,而不是操作系统,所以在这我们再理解一下操作系统是由什么组成的。
6.2 操作系统
操作系统(英语:Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。 操作系统的型态非常多样,不同机器安装的操作系统可从简单到复杂,可从手机的嵌入式系统到超级计算机的大型操作系统。许多操作系统制造者对它涵盖范畴的定义也不尽一致,例如有些操作系统集成了图形用户界面(GUI),而有些仅使用命令行界面(CLI),而将GUI视为一种非必要的应用程序。
操作系统位于底层硬件与用户之间,是两者沟通的桥梁。用户可以通过操作系统的用户界面,输入命令。操作系统则对命令进行解释,驱动硬件设备,实现用户要求。以现代标准而言,一个标准PC的操作系统应该提供以下的功能:
进程管理(Processing management)
内存管理(Memory management)
文件系统(File system)
网络通信(Networking)
安全机制(Security)
用户界面(User interface)
驱动程序(Device drivers)
而让我们来看一下两者之间的不同之处,这是一张linux的架构图我们可以发现内核只是位于底层。
6.2.1 Linux架构图
Linux Kernel
6.2.1.1 用户模式
应用程序(sh、、等)
复杂(、glib等) 简单库(opendbm、sin等)
C库(open、fopen、socket、exec、calloc等)
6.2.1.2 内核模式
系统中断、调用、错误等软硬件消息
内核(驱动程序、进程、网络、内存管理等)
硬件(处理器、内存、各种设备)
我们可以发现,由linux内核+shell可以构成一个操作系统,而linux本身只是个内核,也就是图中的内核模式,负责控制系统的这些部分。也就是我们可以发现,Linux内核构成了一个操作系统除用户界面以外的部分,而shell就是这最后的用户界面。
而linux内核以外的部分就是由GNU计划构成的。
6.2.2 Shell
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果
bash 是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同Version 7 Unix一起发布。bash则在1987年由布莱恩·福克斯创造。在1990年,Chet Ramey成为了主要的维护者。
shell将会是我们在GNU/linux中经常用到的经常有到的工具之一,用来操作计算机用的。在迁移到linux之前我们可以试用cygwin来进行模拟:
Cygwin是许多自由软件的集合,最初由Cygnus Solutions开发,用于各种版本的Microsoft Windows上,运行UNIX类系统。
GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。
GCC原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言。
#include &stdio.h&
printf("Hello world\n");
~/temp/free& gcc hello.c -o hello
hello.c:2:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
1 warning generated.
~/temp/free& ./hello
Hello world
同shell一样,对于GNU/linux系统而言,GCC的作用也是无可取代的。当然如果只是一般用途的话,GCC对于一般用户可能没用,但是在些GNU/Linux系统上,我们可能就需要自己编译源码成二进制文件,而没有软件包,因而其重要性是不言而喻的。自然的如果我们自己动手编译GNU/Linux操作系统的话,我们会理解其的重要意义。有兴趣的同学可以试一下:Linux From Scratch (LFS)。
6.2.4 启动引导程序
最后,当我们构成以上的那些之后,我们就需要一个引导程序,以便使系统启动,引导进内核。
启动程序(bootloader)于电脑或其他计算机应用上,是指引导操作系统启动的程序。启动程序启动方式与程序视应用机型种类。例如在普通PC上,引导程序通常分为两部分:第一阶段引导程序位于主引导记录,用于引导位于某个分区上的第二阶段引导程序,如NTLDR、GNU GRUB等。
BIOS 开机完成后,bootloader就接手初始化硬件设备、创建存储器空间的映射,以便为操作系统内核准备好
正确的软硬件环境。
简单的bootloader的虚拟汇编码,如其后的八个指令:
0: 将P暂存器的值设为8
1: 检查纸带(
void loop(){
setup()函数用于初始化(如GPIO初始化,串口初始化,定时器初始化等)特点是只执行一次;loop()函数是一个死循环,可以看做C语言的while(1)函数。
7.4 点亮一个LED
对初学者来说,点亮led已成为入门必修课,使用Arduino控制led十分简单,并且很容易理解。 使用到的函数:
pinMode(pin,mode)
digitalWrite(pin,value)
上一段代码分析:
int led=13;
void setup()
pinMode(led,OUTPUT);
void loop()
digitalWrite(led,HIGH);
delay(1000);
digitalWrite(led,LOW);
delay(1000);
该程序实现Arduino单片机13号引脚以1S时间电平翻转,如果外接一个led,就可以看到led以1S的间隔闪烁;函数pinMode()有两个参数pin、value,pin参数用来指定引脚号,本程序中设置为13号引脚,mode用于设置引脚模式,有三个值:
INPUT_PULLUP
表示让某一个IO引脚作输入,反之,
OUTPUT则使一个IO引脚做输出
INPUT_PULLUP则配置一个IO引脚具有上拉输入功能(上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平),从英文意思也能很直观的看出来。
理解了pinMode()函数,digitalWrite()就很容易理解啦,value的取值有两个HIGH、LOW,HIGH表示让某一个引脚输出高电平,反之,LOW则使某一个引脚输出低电平。 程序中还是用到delay(ms)函数,它表示延时多少毫秒,例如延时500 ms ,直接调用delay(500);就可以了。
如果你仔细查看我的描述,你会发现我没有讲13号引脚怎么来的,是这样的:Arduino团队为了简化对引脚描述,对每个引脚都进行了编号,以UNO开发板为例,可以发现开发板排座的附近有对应的白颜色的数字,那便是所有的引脚编号,A0~A5是6路ADC输入引脚,0-13表示13路基本IO,数字前面的~表示该引脚具有PWM功能。如果要使用某一引脚,只需要知道引脚编号就可编写相应代码进行操作。
例如digitalWrite(2,LOW)表示向2号引脚输出低电平。其他操作类似,是不是so easy - !
7.5 串口通信
使用到的基本函数:
Serial.begin()
Serial.write()
Serial.read()
Serial.available()
在此项目中需要使用串口,Arduino串口初始化使用Serial.begin(9600);,其传输波特率为9600,其他波特率也行,函数位于setup()中,之后可以使用Serial.read()、Serial.write()读入一个字符,输出一个字符,使用Serial.print()输出字符串.代码如下:
char ch='1';
void setup()
Serial.begin(9600);
void loop()
Serial.write(ch);
if(Serial.available())
ch = Serial.read();
Serial.print(ch);
以上程序实现字符的输出(Serial.write(),Serial.print())和读入(Serial.read())。如果需要了解更多,可以参考:
7.5.1 关于Arduino Setup()
如果你对Arduino的Setup很疑惑的话,可以看看这里。下面Arduino源码目录中的main函数:
#include &Arduino.h&
int main(void)
for (;;) {
if (serialEventRun) serialEventRun();
8 Python 代码如散文
作为一门计算机语言来说,Python会有下面的特点。
语言学习起来容易
解决生活中的实际问题
支持多学科
我们可以和其他不是脚本语言的语言进行一个简单的对比,如C,你需要去编译去运行,有时候还需要解决跨平台问题,本来你是在你的Windows上运行得好好的,但是有一天你换了一个Mac电脑的时候,问题变得很棘手,你甚至不知道怎么去解决问题。我没有用过MFC,听说很方便,但是在其他平台下就没有一个好的解决方案。这里可能跑得有点远,但是不同的用户可能在不同的平台上,这也就是脚本语言的优势所在了。
8.1 代码与散文
你可能听过,也可能了解过,不过在这里我们可能不会去讲述那些基础的语法的东西,我们想说的是代码格式的重要性,在html中你可以这样去写你的代码
&html&&head&&title&This is a Title
&/title&&/head&&body&&div class="content"&
&p&flakjfaklfjalfa&/p&&/div&
&/body&&/html&
又或者是js的minify,它可能会使你的代码看起来像是这样的:
function NolTracker(b,a){this.pvar=b;this.mergeFeatures(a)}
可能的是如果是python的话,你可能会遇到下面的问题。。
File "steps.py", line 10
IndentationError: expected an indented block
如果你对JSLint、Lint这类的工具有点印象的话,你也可以认为python集成了这类工具。整洁的代码至少应该看上去要有整洁的衣服,就好像是我们看到的一个人一样,而后我们才会有一个好的印象。更主要的一点是代码是写给人看的,而衣服更多的时候对于像我这样的人来说,他首先应该是要保暖的,其次对于一个懒的人来说。。。
程序应该是具有可读性的短文,它将在计算机上执行,从而解决某些问题
我们需要去读懂别人的代码,别人也需要去读懂我们的代码。计算机可以无条件地执行你那未经编排过的程序,但是人就不是如此了。
var calc={add: function(a,b){return a+b;},sub: function(a,b){return a-b;},dif: function(a,b){if(a&b){return a;}else{return b;}}}
上面的代码相对于下面的代码可读性没有那么多,但是计算机可以无条件地执行上面的代码。上面的代码对于网络传输来说是好的,但是对于人来说并不是如此,我们需要一些工具来辅助我们去读懂上面的代码。如果代码上写得没有一点可读性,诸如函数命名没有多少实际意义,如果我们把前面的函数就成这样:
a: function(a,b){
return a+b;
s: function(a,b){
return a-b;
d: function(a,b){
那么只有在我们理解了这个函数是干什么之后才能理解函数是干什么,而不是光看函数名就可以了。
在Javascript解决一个函数的办法有很多,在其他一些语言如Ruby或者Perl中也是如此,解决问题的办法有很多,对于写代码的人来说是一个享受的过程,但是对于维护的人来说并非如此。而这个和Python的思想不是很一致的是,Python设计的理念是
对于特定的问题,只要有一种最好的方法来解决就够了
可读性的代码在今天显得比以前重要的多,以前写程序的时候我们需要去考虑使用汇编或者其他工具来提高程序的效率。
.global _start
# write(1, message, 13)
mov $1, %rax # system call 1 is write
mov $1, %rdi # file handle 1 is stdout
mov $message, %rsi # address of string to output
mov $13, %rdx # number of bytes
syscall # invoke operating system to do the write
mov $60, %rax # system call 60 is exit
xor %rdi, %rdi # we want return code 0
syscall # invoke operating system to exit
.ascii "Hello, world\n"
所以上面的代码的可读性在今天新生一代的程序员来说可能没有那么容易理解。芯片运行的速度越来越快,在程序上我们也需要一个越来越快的解决方案,而所谓的越来越快的解决方案指的不是运行速度上,而是开发速度上。如果你没有办法在同样时间内开发出更好的程序,那么你就可能输给你的竞争对手。
8.1.1 开始之前
我们终于又从一种语言跳到了另外一种语言,我们可能习惯了一种模式,而不敢于去尝试新的东西,这些或许是我们的一些习惯又或者是因为害怕等等。
作为另外一个跨平台能力很强的语言,这里说的是与Javascript、HTML比较,或许你会觉得C算是最好的,但是我们这里讨论更多的是脚本语言,也就是直接可以运行的。在现在主流的大多数移动平台上,python也有良好的支持,如Android,IOS,只是这些算是类Unix系统内核,python还支持之前Nokia的Symbian。
开始之前我们需要确认我们的平台上已经有了python环境,也就是可以运行下面的Hello,World,你可以在网上很多地方看到,最简单的地方还是到官网,又或者是所用移动平台的store下载。
8.1.2 Python的Hello,World
Python的Hello,World有两种形式,作为一种脚本语言来说,Javascript也是一种脚本语言,只是两者之间有太多的不同之处,每个人都会有不同的选择对于一种语言用来作为其的习惯。于是这就是我们的
print "Hello,World"
当我们把我们的脚本在shell环境下运行时
&&& print "Hello,world"
File "&stdin&", line 1
print "Hello,world"
IndentationError: unexpected indent
&&& print "Hello,world"
Hello,world
如果你没有预料到缩进带来的问题的时候,这就是一个问题了。
和我们在Javascript或者是CSS里面一样,我们也可以用一个文件的方式来写入我们的代码,文件后缀名是py,所以创建一个helloworld.py,输入上面的代码,然后执行
python helloworld.py
一个理想的结果,或许你试过C语言的helloworld,如果了解过GCC的话应该是可以这样的:
也就是执行编译完后的程序,需要注意的是helloworld.py没有编译,不过也会输出
Hello,world
8.1.3 我们想要的Hello,World
我们想展示的是如何结合前面学习的内容做一个更有意思的Hello,World。
import cherrypy
class HelloWorld(object):
def index(self):
return "Hello World!"
index.exposed = True
cherrypy.quickstart(HelloWorld())
我们需要去了解算法(algorithm),引经据典的话就是这样子:
a process or set of rules to be followed in calculations or other problem-solving operations, especially by a computer
也就是计算或其他解决问题的操作需要遵循的一个过程或者一套规则,书上还提到的说法是——解决问题的诀窍,让我想起了hack一词。我们总会去想某些东西是否有一个更快的计算方法,有时候在处理某些问题上也显示了一个好的算法的重要性。
8.3 实用主义哲学
(来自于:HyryStudio)
大多数工程师、科学家使用科学计算软件的目的都是为了快速解决其工作中遇到的问题,而不是开发出一套完整的软件。这就是为什么MATLAB这样的商用科学计算软件十分流行的原因。而Python在这一点上实际上和MATLAB十分相似,我们也可以使用Python众多的扩展库快速写出一次性的数据处理、运算的脚本。然而由于Python语言的一些高级特性,以及众多的科学计算之外的扩展库,我们可以将积累下来的一次性脚本进行改造,为它们提供命令行、GUI、数据库、网络等众多接口,最终成为一套完整的工具包或者实用的计算软件。而且由于是开源的自由软件,我们可以在任何系统中安装Python环境,运行我们 的程序。
Python一直保持着很强的实用主义,它通常不会去试着重新开发一整套函数库,而是将现有的开源函数库包装成其扩展库。而Python则通过这些扩展库将众多的开源函数库连接在一起,是名符其实的胶水语言。例如由华盛顿大学的教授主导开发的 Sage ,就是一套以代替MATLAB、Mathematica、Maple等商用科学计算软件为目的的开源系统。它通过Python结合了众多的开源科学计算软件,并通过网页浏览器提供了一个与其交互的记事本文档界面。 Python的科学计算扩展库非常多,不同专业的技术人员都可以找到适合自己的扩展库。下面是我经常会用到的一个非常不完全的列表:
NumPy + SciPy + matplotlib + IPython : 这几个应该是每位开发者都应具备的扩展库。NumPy提供了多维数组以及众多的处理函数,SciPy提供了各种数值运算功能,matplotlib能绘制 出精美的二维图表,IPython则提供了一个超强的命令行,最新版的IPython还添加于Sage类似的浏览器的记事本界面(notebook)。
SciKits : 其中包括许多独立的扩展库,作为SciPy的补充。其中 scikit-learn 是一套机器学习库,包含了比较完善的文档以及众多的实例程序。
Pandas : 以Python世界中 R 的替代品为目标的数据分析库。根据其官方网站的测试,Pandas在许多方面的性能都比R要高。
ETS : 这是一套Enthought公司开发的函数库,其中的 Mayavi 能很方便地对数据进行三维可视化。
OpenCV : 这是一套计算机视觉库,目前的最新版本已经提供了十分完备的Python接口,能够调用OpenCV中众多的图像处理、模式识别函数直接对NumPy数组进行处理。
8.4 包管理
关于Python的包管理
Eggs 格式是 setuptools 引入的一种文件格式,它使用 .egg 扩展名,用于 Python 模块的安装。
pip 是目前 python 包管理的事实标准,2008年发布。它被用作 easy_install 的替代品,但是它仍有大量的功能建立在 setuptools 组件之上。
8.4.1 python requests
Requests 是使用 Apache2 Licensed 许可证的 HTTP 库。用 Python 编写,真正的为人类着想。
Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
以安装requests为例:
sudo pip install requests
Downloading/unpacking requests
Downloading requests-2.4.3-py2.py3-none-any.whl (459kB): 459kB downloaded
Installing collected packages: requests
Successfully installed requests
Cleaning up...
用这个库我们可以做些什么?看看官网的示例:
&&& import requests
&&& r = requests.get('https://github.com/timeline.json')
&&& r.json()
到现在你会发现我们没有说到任何的Python语法,这不是一本关于Python语法的书,如我们在开头所说的。下面是我们将会在后面用到的代码
#!/usr/bin/env python
import requests
url = "http://b.phodal.com/athome/1"
r = requests.get(url)
print r.text
9 Raspberry Pi
Raspberry Pi
9.1 Geek的盛宴
Raspberry Pi是一款针对电脑业余爱好者、教师、小学生以及小型企业等用户的迷你电脑,预装Linux系统,体积仅信用卡大小,搭载ARM架构处理器,运算性能和智能手机相仿。在接口方面,Raspberry Pi提供了可供键鼠使用的USB接口,此外还有千兆以太网接口、SD卡扩展接口以及1个HDMI高清视频输出接口,可与显示器或者TV相连。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Raspberry Pi相比于一般的ARM开发板来说,由于其本身搭载着Linux操作系统,可以用诸如Python、Ruby或Bash来执行脚本,而不是通过编译程序来运行,具有更高的开发效率。
9.2 Raspberry Pi 初始化
今天的Raspbian默认已经安装openssh-server,并默认开启了OpenSSH-Server。
接着我们就可以看到系统启动了,要我们输入用户名和密码
Raspbian GNU/Linux 7 raspberrypi ttyAMA0
raspberrypi login: pi
Last login: Sat Apr 26 05:58:07 UTC 2014 on ttyAMA0
Linux raspberrypi 3.10.25+ #622 PREEMPT Fri Jan 3 18:41:00 GMT 2014 armv6l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
NOTICE: the software on this Raspberry Pi has not been fully configured. Please run 'sudo raspi-config'
sudo raspi-config
选择第一个,下面就可以继续了
Expand Filesystem Ensures that all of the SD card s
接着重启后,便可以扩展SD卡成功。
注: Raspbian与一般的Debian系统使用起来区别不是太大(ps:命令上),由于CPU是不同的架构,在编译上可能有所区别。通常PC上的软件需要重新编译才能在RPi上运行,所以如果可以用apt-get安装的话,就不要自己编译了。
9.3 Raspberry Pi GPIO
General Purpose Input Output (通用输入/输出)简称为GPIO,或总线扩展器,利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I/O端口,或当系统需要采用远端串行通信或控制时,GPIO产品能够提供额外的控制和监视功能。
10 Server 一切皆为服务
10.1 服务器
服务器(Server)指:
一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器(能使用户在其它计算机访问文件),数据库服务器和应用程序服务器。
运行以上软件的计算机,或称为网络主机(Host)。
一般来说,服务器通过网络对外提供服务。可以通过Intranet对内网提供服务,也可以通过Internet对外提供服务。
10.2 Web服务器
WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 WWW 是 Internet的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是发展最快和目前用的最广泛的服务。正是因为有了WWW工具,才使得近年来 Internet 迅速发展,且用户数量飞速增长。
Linux+Nginx+MySQL+PHP
Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru站点开发的,第一个公开版本0.1.0发布于日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。日,nginx 1.0.4发布。
MySQL 是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
PHP于1994年由Rasmus Lerdorf创建,刚刚开始是Rasmus Lerdorf为了要维护个人网页而制作的一个简单的用Perl语言编写的程序。这些工具程序用来显示 Rasmus Lerdorf 的个人履历,以及统计网页流量。后来又用C语言重新编写,包括可以访问数据库。他将这些程序和一些表单直译器整合起来,称为 PHP/FI。PHP/FI 可以和数据库连接,产生简单的动态网页程序。
11 Web服务
Web服务是一种服务导向架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。
根据W3C的定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多应用程序接口(API)所组成的,它们透过网络,例如国际互联网(Internet)的远程服务器端,执行客户所提交服务的请求。
尽管W3C的定义涵盖诸多相异且无法介分的系统,不过通常我们指有关于主从式架构(Client-server)之间根据SOAP协议进行传递XML格式消息。无论定义还是实现,WEB服务过程中会由服务器提供一个机器可读的描述(通常基于WSDL)以辨识服务器所提供的WEB服务。另外,虽然WSDL不是SOAP服务端点的必要条件,但目前基于Java的主流WEB服务开发框架往往需要WSDL实现客户端的源代码生成。一些工业标准化组织,比如WS-I,就在WEB服务定义中强制包含SOAP和WSDL。
WEB服务实际上是一组工具,并有多种不同的方法调用之。三种最普遍的手段是:
远程过程调用(RPC)
面向服务架构(SOA)
表述性状态转移(REST)。
11.1 SOAP VS RESTful
简单对象访问协议是交换数据的一种协议规范,使用在计算机网络Web服务中,交换带结构信息。SOAP为了简化网页服务器从XML数据库中提取数据时,节省去格式化页面时间,以及不同应用程序之间按照HTTP通信协议,遵从XML格式执行资料互换,使其抽象于语言实现、平台和硬件。
12 HTTP 熟悉&陌生
12.1 你所没有深入的HTTP
Internet有两个核心协议: IP和TCP,这样讲述起来似乎会很漫长。
超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
HTTP是用于客户端与服务端之间的通信。
传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的。
注意: HTTP协议只规定了客户端与服务端的通信规则,而没有规定其通讯协议,只是现在的大部分实现都是将TCP作为通讯协议。
12.1.1 打开网页时发生了什么
简单地来说,当我们在浏览器上输入URL的敲下回车的时候。
浏览器需要查找域名的IP,从不同的缓存直至DNS服务器。
浏览器会给web服务器发送一个HTTP请求
服务器“处理”请求
服务器发回一个HTML响应
浏览器渲染HTML到页面。
在上有一个这样的回答会比较详细。
if requested object is in cache and is fresh, skip to #9
browser asks OS for server’s IP address
OS makes a DNS lookup and replies the IP address to the browser
browser opens a TCP connection to server (this step is much more complex with HTTPS)
browser sends the HTTP request through TCP connection
browser receives HTTP response and may close the TCP connection, or reuse it for another request
browser checks if the response is a redirect (3xx result status codes), authorization request (401), error (4xx and 5xx), etc.; these are handled differently from normal responses (2xx)
if cacheable, response is stored in cache
browser decodes response (e.g. if it’s gzipped)
browser determines what to do with response (e.g. is it a HTML page, is it an image, is it a sound clip?)
browser renders response, or offers a download dialog for unrecognized types
忽略一些细节便剩下了
从浏览器输入URL
浏览器找到服务器,服务器返回HTML文档
从对应的服务器下载资源
说说第一步,开始时我们输入的是URI(统一资源标识符,Uniform Resource Identifier),它还有另外一个名字叫统一资源定位器(URL,Uniform Resource Locator)。
12.1.2 URL组成
网址算是URL的一个俗称,让我们来看看一个URL的组成,以HTTP版IOT中的URL为例。
http://b.phodal.com/athome/1
开始之前,我们需要标出URL的80端口以及json文件的全称,那么上面的网址就会变成
http://b.phodal.com:80/athome/1.json
那么对于这个URL的就有下面几部分组成
http:// http说的是这个URL用的是HTTP协议,至于//是一个分隔符,用法和C语言中的;一样。这样的协议还可以是coap,https,ftp等等。
b 是子域名,一个域名在允许的情况下可以有不限数量的子域名。
phodal.com 代表了一个URL是phodal.com下面的域名
80 80是指80端口,默认的都是80,对于一个不是80端口的URL应该是这样的http://iot-coap.phodal.com:8896/
athome 指的是虚拟目录部分,或者文件路径
1.json看上去就是一个文件名,然而也代表着这是一个资源。
对就一个稍微复杂点的例子就是
http://ebook.designiot.cn/#你所没有深入的http
这里的#后面是锚部分,如果你打开这个URL就会发现会直接跳转到相应的锚部分,对就于下面这样的一个例子来说
http://www.phodal.com/search/?q=iot&type=blog
?后面的q=iot&type=blog的部分是参数部分,通常用于查询或者、搜索。
12.2 一次HTTP GET请求
当我们打开最小物联网系统的一个页面时,如
我们在浏览器上看到的结果是
"temperature": 19,
"sensors1": 31,
"sensors2": 7.5,
只是我们看到的是结果,忽略了这其中的过程,于是我们用curl命令来看看详细的情况。
curl -I -s http://b.phodal.com/athome/1.json
出于某种原因考虑,删去了其中一些元素,剩下下面这些。
HTTP/1.1 200 OK
Content-Type: application/json
Date: Fri, 05 Sep :49 GMT
[{"id":1,"temperature":19,"sensors1":31,"sensors2":7.5,"led1":0}]
我们用curl命令向服务器发起了GET请求,服务器返回了上面的结果。
12.2.1 HTTP响应
一个HTTP响应由三部分组成
状态行(状态码)
消息报头(响应报头)
响应正文(消息体)
12.2.1.1 HTTP响应 状态码
在上面的结果中,状态行是
HTTP/1.1 200 OK
返回的状态码是200,OK是状态码的原因短语。
如果是一个跳转的页面,它就可能是下面的结果:
HTTP/1.0 301 MOVED PERMANENTLY
Date: Mon, 08 Sep :01 GMT
Content-Type: text/html; charset=utf-8
HTTP Status有五种状态,而这五种状态又有所细分,提一下这五种状态,详细可参见
4xx客户端错误
5xx服务器错误
200 ok - 成功返回状态,对应,GET,PUT,PATCH,DELETE.
201 created - 成功创建。
304 not modified - HTTP缓存有效。
400 bad request - 请求格式错误。
401 unauthorized - 未授权。
403 forbidden - 鉴权成功,但是该用户没有权限。
404 not found - 请求的资源不存在
405 method not allowed - 该http方法不被允许。
410 gone - 这个url对应的资源现在不可用。
415 unsupported media type - 请求类型错误。
422 unprocessable entity - 校验错误时用。
429 too many request - 请求过多。
12.2.1.2 HTTP响应 响应报头
在这次响应中,返回了两个报头,即
Content-Type: application/json
Date: Fri, 05 Sep :49 GMT
Content-Type和Date,在这里的Context-Type是application/json,而通常情况下我们打开一个网站时,他的Content-Type应该是text/html。
Content-Type: text/html;
Content-Type是最重要的报头。
12.2.1.3 HTTP响应 响应正文
正文才是我们真正想要的内容,上面的都是写给浏览器看的,一般的人不会去关注这些

我要回帖

更多关于 怎么学会编程 的文章

 

随机推荐