【VC++开源代码栏目提醒】:网学会员在VC++开源代码频道为大家收集整理了“如何提高HTML代码的效率 - 讲义教程“提供大家参考,希望对大家有所帮助!
如何提高HTML
代码的效率 提高HTML
代码的效率 许多
网站设计者最常犯的错误便是当其网页能够在IE下正常显示便认为其
代码正确无误甚至常看到有人在抱怨其网站排名不
理想到其网站简单看一下便可发现 HTML
代码中充斥各种各样的错误在那样的
代码基础上无论付出多少努力去优化网站结果都可能是付诸流水的啊事实上IE是一款对HTML
代码容错能力甚高的的浏览器——说句题外话尽管我们可以有各式各样的理由可以攻击微软但微软对其
产品操作的易手性及可用性方面所做的努力是不容抹杀的。
——Web页面能够在IE下正常显示绝不意味着页面的HTML
代码没有问题甚至可以推而广之Web页面在多种浏览器下均可正常显示也不意味着HTML
代码完全合法有效毕竟哪个浏览器都要保证基本的容错的功能不然就会发生即使仅仅因为网络传输中的一点导致导致 HTML页面
显示不正常了而这在
网络带宽仍然紧张的今天仍是频繁
发生的。
什么是合法有效的HTML
代码 简单说来我们的Web页面是由HTMLHypertext Markup Language :超
文本链接标示语言元素
构成的即使对于ASP、PHP之类的动态页面其也是由SERVER将ASP或
PHP语句渲染成相应的HTML元素并下传到
客户机上对于Jav
aScript之类则由
客户端将其
转换为HTML。
同其他语言一样HTML也有自己的语法规则无论是浏览器还是搜索引擎的Spider都在根据这些
规则来分析网页
代码中的内容。
但很多时候即使对熟练人员来说在HTML页面构建时仍然难免出些HTML
代码上的错误更别提大部分所见即所得编辑器造成的HTML冗余臃肿问题了。
如果页面中不存在违背HTML标准语法规范的成分即可被称为合法有效的HTML
代码 合法
有效的HTML
代码对SEO的
重要性 要使搜索引擎收录我们的网页——在此基础上才能谈网站优化网站
推广——其前提是要让搜索引擎的Spider能读懂我们的Web文件。
搜索引擎 Spider阅读网页的根据便是HTML规范通过对
HTML代码的分析Spider才能判断网页内容在此基础上才能
判断针对相应关键词的相关性。
需要明确的是搜索引擎Spider不同于
浏览器的
一点便是其容错能力相对于浏览器要差不少如果页面
代码中存在其无法解释的HTML
代码时其便可能停止阅读该
页面甚至可能停止在我们的网站内爬行更严重的错误甚至会导致其同时也丢弃已经收集到的网站内其他页面的内容信息。
尽管如今如大主要
搜索引擎也都在尽力提高Spider的容错能力让其可以在HTML
代码出现一般性错误时不至影响对内容的收集。
但很多时候仍然会发生如漏了一个关闭标签导致整个页面的
内容被忽略的情况。
另一方面合法有效的HTML也可以保证Web页面可以在多种浏览器下被
正确解释避免同一个页面在IE下显示正常在Mozilla下却严重变形的情况当然
不能完全避免这对于提高网站的可用性方面也是有着极大好处的。
如何验证HTML
代码的合法有效
Internet有很多类似的免费服务可以帮我们验证
网页代码是否合法有效其中最著名的即是 W3C HTMLValidator这是由W3C World Wide WebConsortium万维网联盟官方推出的
免费服务项目在其页面上只需输入待验证的HTML地址或者上传一个在本地机上的HTML文件即可其会很快返回校验结果
是否无误如有
错误分别为
哪些及如何
改进等。
同时W3C HTML Validator也提供对CSS文件的
验证服务。
一定要通过W3C的验证么 对这
个问题的
答案则不那么绝对。
理论上说合法的HTML
代码能够使搜索引擎的Spider在更容易地收集网站页面的内容信息。
但另一
方面并不是所有的HTML
代码错误都会影响到 Spider的爬行也即是说HTML存在少量的错误对Spider来说也是可接受的那么一定要通过W3C认证么 另一方面如在Mark Daoust的测试中甚至暗喻未肯定地下结论存在少量HTML
代码错误在页面在Google排名中能更占
优势当然这
存在很大争议但至少
证明了存在少量HTML
代码错误并不
影响网页在SERP中的排名。
个人观点如果您对HTML相对不那么熟悉的话倒也不必强求非得100通过W3C的验证毕竟把更多的时间与精力放到真正应该努力的方向如创建内容与链接才是根本但要保证HTML
代码中不存在大的严重性错误。
当然如果您对HTML语言较为精通那么何妨稍花点功夫以确保其完全无误呢正如在上篇文章中所说的 因此
我们要做的倒不一定非得通过W3C认证但至少要保证其在各种浏览器下显示正常保证搜索引擎的Spider能够正常分析。
提高HTML
代码的
效率 前文我们提说过很多所见即
所得编辑器造成的HTML冗余臃肿问题这种情况在很多
中文网站相当普遍。
所见即所得编辑器如FrontPage、
Dreamweaver尤其在其对一个网页进行修改的时候往往会产生很多不
必要的冗余
代码。
当页面的HTML
文件在存在大量的冗余
代码时文件便会变得臃肿这不但会降低网页的打开速度
损害到网页的效率同时也会严重影响到相当网页的搜索引擎排名。
与其把精力投入到一定通过W3C
认证上个人认为倒不如把更多的精力放到精减
代码上如引入
CSS等以实现
代码的干净简洁。
这样的
优化效果会更明显。
破解
入门--提高汇编语言阅读
能力 作为一个初学破解的菜鸟谁不想快速提高自己破解水平。
每每看大虾们发的文章试图跟着学习但一看到文章中大量的汇编
代码我就头晕了
什么PUSHMOV呀虽然知道这些指令的含义但这些指令组成的
代码是什么意思却一窍不通看的
模糊的很。
学了半天破解也就知道几招
简单方法---查找
关键跳 改JMP 为 NOP呀JGE 改为 JLE呀等等初浅的功夫。
注册码也只能在内存中跟踪得到。
要写
注册机嘿嘿真是难呀---汇编的注册算法望而生畏。
提高汇编能力是忍无可忍的事了。
几经周则我终于
发现一个学习汇编的好方法愿与广大菜鸟
共享。
那就是利用
VC在调试过程中有一反汇编功能既有高级语言
代码又有对应汇编
代码真为我等学
习的好工具也。
如下所示
自己写的源
代码/ / crarcktest1.cpp : 定义控制台应用程序的入口点。
// include quotstdafx.hquot define PASSWORD quotABCDquot int main int count0 char buffer100 forcount0countlt3count printfquotEnter password:quot scanfquotsquot buffer if strcmpbufferPASSWORD printfquotwrong passwordnquot else break if countlt3printfquotPassword oknquot return 0 经过
VC反汇编后 // crarck
test1.cpp : 定义控制台应用程序的入口点。
// include quotstdafx.hquot define PASSWORD quotABCDquot int main 00411B20 push ebp 00411B21 mov ebpesp 00411B23 sub esp138h 00411B29 push ebx 00411B2A push esi 00411
B2B push edi 00411B2C lea ediebp-138h 00411B32 mov ecx4Eh 00411B37 mov eax0CCCCCCCCh 00411B3C rep stos dword ptr edi int count0 00411B3E mov dword ptr count0 char buffer100 forcount0countlt3count 00411B45 mov dword ptr count0 00411B4C jmp main37h 411B57h 00411B4E mov eaxdword ptr count 00411B51 add eax1 00411B54 mov dword ptr counteax 00411B57 cmp d
word ptr count3 00411B5B jge main83h 411BA3h printfquotEnter password:quot 00411B5D push offset string quotEnter password:quot 42704Ch 00411B62 call ILT1285_printf 41150Ah 00411B67 add esp4 scanfquotsquot buffer 00411B6A lea eaxbuffer 00411B6D push eax 00411B6E push offset string quotsquot 427048h 00411B73 call ILT990_scanf 4113E3h 00411B78 add esp8 if strcm
pbufferPASSWORD 00411B7B push offset string quotABCDquot 427040h 00411B80 lea eaxbuffer 00411B83 push eax 00411B84 call ILT560_strcmp 411235h 00411B89 add esp8 00411B8C test eaxeax 00411B8E je main7Fh 411B9Fh printfquotwrong passwordnquot 00411B90 push offset string quotwrong passwordnquot 42702Ch 00411B95 call ILT1285_printf 41150Ah 00411B9A add esp4 else 00411B9D jmp main81h 411BA1h break 00411B9F jmp main83h 411BA3h 00411BA1 jmp main2Eh 411B4Eh if countlt3printfquotPassword oknquot 00411BA3 cmp dword ptr count3 00411BA7 jge main96h 411BB6h 00411BA9 push offset string quotPassword oknquot 42701Ch 00411BAE call ILT1285_printf 41150Ah 00411BB3 add esp4 return 0 00411BB6 xor eaxeax 比较阅读就能立即理解这些汇编
代码的意思了。
如何阅读源
代码 第一章导论 1. 要养成一个习惯经常花
时间阅读别人编写的高品质
代码。
2. 要有选择地阅读
代码同时还要有自己的
目标。
您是想
学习新的
模式、编码风格、
还是满足某些需求的方法 3. 要注意并重视
代码中特殊的非功能性需求这些需求也许会导致特定的实现风格。
4. 在现有的
代码上工作时请与
作者或维护
人员进行
必须的
协调以避免重复
劳动或因此而
产生厌恶情绪。
5. 请将从开放源码软件中得到的益处看作是一项
贷款尽可能地寻找各种方式来回报开放
源码社团。
6. 多数情况下如果您想要了解―别人会如何完成这个功能呢‖除了阅读
代码以外
没有更好的
方法。
7. 在寻找 BUG时请从问题的
表现形式到
问题的根源来分析
代码。
不要沿着不相关的
路径误入岐途 8. 我们要充分利用调度器编译器给出的警告或输出的符号
代码系统调用跟踪器数据库结构化
查询语言的日志
机制、包转储
工具和
Windows的消息侦查程序定出BUG的位置。
9. 对于那些大型且组织良好的系统您只需要最低限度地了解它
的全部功能就能够对它做出修改。
10. 当向系统中增加新功能时首先的任务就是找到实现类似特性的
代码将它作为待实现功能的模板。
11. 从
特性的功能描述到
代码的实现可以按照字符串消息或使用关键词来搜索
代码。
12. 在移植
代码或
修改接口时 您可以通过编译器直接定位出问题涉及的
范围从而减少
代码阅读的工作量。
13. 进行重构时您从一个能够正常工作的系统开始做起
希望确保结束时系统能够正常工作。
一套恰当的测试用例可以帮助您满足此项
约束。
14.
阅读代码寻找
重构机会时先从
系统的构架开始然后逐步细化能够获得最大的
效益。
15.
代码的可重用性是一个诱人的但难以掌握的
思想降低期望就不会感到失望。
16. 如果您希望重要的
代码十分棘手难以理解
与分离可以试着寻找粒度更大一些的包甚至其他
代码。
17. 在复查软
件系统时要注意系统是由很多部分组成
的不仅仅只是执行语句。
还要
注意分析以下内容文件和目录结构、生成和配置过程、
用户界面和系统
的文档。
18. 可以将
软件复查作为一个学习、讲授、援之以手和接受帮助的机会。
第二章
基本编程元素 19.第一次分析一个程序时 main是一个好的起始点. 20.层叠if-else if-...-else序列可以看作是由互斥选择项组成的选择结构. 21.有时 要想了解程序在某一方面的功能 运行它可能比阅读源
代码更为恰当. 22.在
分析重要的程序时 最好首先识别出重要的组成部分. 23.了解局部的命名约定 利用它们来猜测变量和函数的功能用途. 24.当基于猜测修改
代码时 您应该
设计能够验证最初假设的
过程. 这个过程可能包括用
编译器进行检查引入断言或者执行适当的测试用例. 25.理解了
代码的某一部分 可能帮助你理解余下的
代码. 26.
解决困难的
代码要从容易的部分入手. 27.要养成遇到库元素就去阅读
相关文档的习惯 这将会增强您阅读和编写
代码的能力. 28.
代码阅读有许多可选择
的策略: 自底向上和自顶向
下的分析应用试探法和
检查注释和外部
文档 应该依据问题的
需要尝试所有这些方法. 29.for i0 iltn i形式的循环执行n次 其他任何形式都要小心. 30.涉及两项不等测试其中一项包括相等条件的
比较表达式可以看作是区间成员测试. 31.我们经常可以将表达式应用在样本数据上 借以了解它的含义. 32.使用De Morgan法则简化复杂的逻辑表达式. 33.在阅读逻辑乘表达式时 问题可以认为正在分析的表达式以左的表达式均为true 在阅读
逻辑和表达式时 类似地 可以认为正在分析的表 达式以左的
表达式均为false. 34.重新组织您控制的
代码 使之更为易读. 35.将使用条件运行符 :的表达式理解为if
代码. 36.不需要为了效率 牺牲
代码的易读性. 37.高效的算法和
特殊的优化确实有可能使得
代码更为复杂 从而更难理解 但这并不意味着使
代码更为紧凑和不易读会提高它的效率. 38.
创造性的
代码布局可以用来提高
代码的易读性. 39.我们
可以使用空格临时变量和括号提高表达式的易读性. 40.在阅读您所控制的
代码时 要养成添加注释的习惯. 41.我们可以用好的缩进以及对变量名称的明智选择 提高编写欠佳的程序的易读性. 42.用diff程序分析
程序的
修订历史时 如果这段
历史跨越了整体重新缩排 常常可以通过指定-w选项 让diff忽略空白差异 避免由于更改了 缩进层次而引入的噪音. 43.do循环的循环体至少执行
一次. 44.执行算术运算时 当b2n-1时 可以将aampb
理解为ab1. 45.将altltn理解为ak k2n. 46.将agtgtn理解为a/k k2n. 47.每次只分析
一个控制结构 将它的内容看作是一个黑盒. 48.将每个控制结构的控制表达式看作是它所包含
代码的断言. 49.return goto break和continue语句 还有异常 都会影响结构化的执行流程. 由于这些语句一般都会终止或重新开始正在进行的循环 因此要单独推理它们的行为. 50.用复杂
循环的变式和不变式 对循环进行推理. 51.使用保持含义不变的变换重新
安排代码 简化
代码的推理
工作.
第三章:
高级C数据类型 52.了解特定语言构造所服务的功能之后 就能够更好
地理解使用它们的
代码. 53.
识别并归类使用指针的理由. 54.在C程序中 指针一般用来构造链式数据结构动态分配的数据结构实现引用调用访问和迭代数据元素传递数组参数引用函数
作为其他 值的别名代表字符串以及
直接访问系统
内存. 55.以引用传递的参数可以用来返回函数的结果 或者避免参数复制带来
的开销. 56.指向数组元素地址的指针 可以访问位于特定索引位置的元素. 57.指向数组元素的指针和相应的数组索引
作用在二者上的运算
具有相同的
语义. 58.使用全局或static局部变量的函数大多数情况都不可重入reentrant. 59.字符指针不同于字符数组. 60.识别和归类应用结构或共用体的每种理由. 61.C语言中的结构将多个数据元素集合在一起 使得它们可以作为一个
整体来使用 用来从函数中返回多个数据元素构造链式数据结构映射 数据在硬件设备网络链接和存储介质上的组织方式实现抽象数据类型
以及以
面向对象的方式
编程. 62.共用体在C程序中主要用于优化存储空间的利用实现多态以及访问数据
不同的
内部表达方式. 63.一个指针 在初始化为指向N个元素的存储空间之后 就可以作为N个元素的数组来使用. 64.动态分配的内在块可以电焊工地释放 或在程序结束时释放 或由垃圾回收器来完成回收 在栈上分配的内存块当分配它的函数退出后释放 . 65.C程序使用typedef声明
促进抽象 并
增强代码的易读性 从而
防范可
移植性问题 并模拟C和Java的类声明
行为. 66.可以将typedef声明理解成变量定义: 变量的名称就是类型的
名称 变量的类型就是与该名称对应的
类型. 第四章: C数据结构 67.根据底层的抽象数据类型理解显式的数据结构操作. 68.C语言中 一般使用内建的数组类型实现向量 不再对底层实现进行抽象. 69.N个元素的数组可以被序列for i0 iltN i完全处理
所有其他变体都应该引起警惕. 70.表达式sizeofx总会得到用memset或memcpy处理数组x不是指针所需的正确字节数. 71.区间一般用区间内的第一个元素和区间
后的第一个元素来表示. 72.不对称区间中元素的数目等于高位边界与低位边界的差. 73.当不对称区
间的高位边界等于低位边界时 区间为空. 74.不对称区间
中的低位边界
代表区间的第一个元素 高位边界代表区间外的第一个元素. 75.结构的数组常常表示由记录和字段组成的表. 76.指向结
构的指针常常表示
访问底层
记录和字段的游标. 77.
动态分配的矩阵
一般存储为指向数组列的指针或指向元素指针的指针 这两
种类型都可以按照二维数组进行访问. 78.以数组形式
存储的动态分配矩阵 用自定义访问函数定位它们的元素. 79.抽象数据类型为底层实现元素的使用或误用方式提供
一种信心的量度. 80.数组用从0
开始的顺序整数为键 组织查找表. 81.数组经常用来对控制结构
进行高效编码 简化程序的逻辑. 82.通过在数组中每个位置存储一个数据元素和一个函数指针指向处理数据元素的
函数 可以将
代码与数据
关联起来. 83.数组可以通过存储供程序内的抽象机abstract machine或虚拟机virtual machine使用的数据或
代码 控制程序的运作. 84.可以将表达式sizeofx / sizeofx0理解为数组x中元素的个数. 85.如果结构中含有指向结构自身名为next的元素 一般说来 该结构
定义的是单向链表的结点. 86.指向链表结点的持久性如全局静态或在堆上分配指针常常表示链表的头部. 87.包含指向自身的next和prev指针的结构可能是双向链表的结点. 88.理解复杂数据结构的指针操作可以将数据元素画为方框指针画为箭头. 89.递归数据结构经
常用递归
算法来处理. 90.重要的数据结构操作算法一般用函数参数或模板参数来参数化. 91.图的结点常常顺序地存储在数组中 链接到链表中 或通过图的边链接起来. 92.图中的边一般不是隐式地通过指针 就是显式地作为独立的结构来表示. 93.图的边经常存储为动态分配的数组或链表 在这两种情况下 边都锚定在图的结点上. 94.在无向图中 表达数据时应该将所有的结点看作是等同的 类似地 进行处理任务的
代码也不应该基于它们的
方向来区分边. 95.在非连通图中 执行遍历
代码应该能够接通孤立的子图. 96.处理包含回路的图时 遍历
代码应该避免在处理图的回路
进入循环. 97.复杂的图结构中 可能隐藏着其他类型的
独立结构.
第五章: 高级控制流程 98.采用递归定义的算法和数据结构经常用递归的函数定义来实现. 99.推理递归函数时 要从基准落伍测试开始 并认证每次递归调用如何逐渐接近非递归基准
范例代码. 100.简单的语言常常使用一
系列遵循该语言
语法结构的函数进行语法分析. 101.推理互递归函数时 要基于底层
概念的递归定义. 102.尾递归调用等同于一个回到函数开始处的循环. 103.将throws子句从方法
的定义中移除 然后
运行Java编译器对类的源
代码进行编译 就可以容易地找到那些可能隐式地
生成异常的方法. 104.在多处理器
计算机上运行的
代码常常围绕进程或线程进行组织. 105.工作群并行模型
用于在多个处理器间分配工作 或者
创建一个任务池 然后将大量需要处理标准
化的工作进行分配. 106.基于线程的管理者/工人并行
模型一般将耗时的或阻塞的操作分配给
工人子
任务 从而
维护中心任务的响应性. 107.基于进程的
管理者/工人
并行模型一般用来重用现有的程序 或用定义良好的
接口组织和
分离粗粒
度的系统模块. 108.基于流水线的并行处理中 每个任务都接收到一些输入 对它们进行一些处理 并将生成的输出传递给下一个任务 进行不同的处理. 109.竞争
条件很难捉摸 相关的
代码常常会将
竞争条件扩散到多个函数或
模块 因而 很难隔离由于竞争条件导致
的问题. 110.对于
出现在
信号处理器中的数据结构操作
代码和库调用要保持高度警惕. 111.在阅读包含宏的
代码时 要注意 宏既非函数 也非语句. 112.do…while0块中的宏等同于控制块中的语句. 113.宏可以访问在它的使用点可见的所有局部变量. 114.宏调用可
改变参数的值 115.基于宏的标记拼接能够创建新的标记符. 第六章: 应对
大型项目 116.我们可以通过浏览
项目的源
代码树—包含项目源
代码的
层次目录结.