首页
Search
1
解决visual studio code (vscode)安装时没有选择安装路径问题
320 阅读
2
如何在 Clash for Windows 上配置服务
215 阅读
3
Linux 下 Bash 脚本 bad interpreter 报错的解决方法
150 阅读
4
Arch Linux 下解决 KDE Plasma Discover 的 Unable to load applications 错误
149 阅读
5
uniapp打包app提示通讯录权限问题,如何取消通讯录权限
113 阅读
clash
服务器
javascript
全部
游戏资讯
登录
Search
加速器之家
累计撰写
1,195
篇文章
累计收到
0
条评论
首页
栏目
clash
服务器
javascript
全部
游戏资讯
页面
搜索到
758
篇与
的结果
2024-10-21
http协议报头详解
1. http 协议简介 # HTTP 是 Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)[5]和 Internet 工作小组 IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的 RFC,RFC 1945 定义了 HTTP/1.0 版本。其中最著名的就是 RFC 2616。RFC 2616 定义了今天普遍使用的一个版本——HTTP 1.1。为纪念 Tim Berners-Lee 提出 HTTP 后对互联网发展的贡献,万维网协会保留有他最原始提交的版本。HTTP 协议(HyperText Transfer Protocol,超文本转移协议)是用于从 WWW 服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。HTTP 是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP 是一个无状态的协议。 (引自百度百科) 2. http 报头举例 # 这里我们就用常用的百度搜索举例吧,虽然很多程序员看不起百度搜索!Remote Address:61.135.169.125:80 Request URL:http://www.baidu.com/ Request Method:GET Status Code:200 OK Request Headersview source Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip,deflate,sdch Accept-Language:zh-CN,zh;q=0.8,en;q=0.6 Cache-Control:max-age=0 Connection:keep-alive Cookie:BDUT=eiceD23DDBB7D809C94A0E669E114AB2FAA613c5bfe280c0; SSUDBTSP=1374456410; Host:www.baidu.com Referer:http://tieba.baidu.com/ User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 Response Headersview source BDPAGETYPE:2 BDQID:0xa86e37090000192c BDUSERID:263345794 Cache-Control:private Connection:Keep-Alive Content-Encoding:gzip Content-Type:text/html Date:Fri, 30 May 2014 06:07:20 GMT Expires:Fri, 30 May 2014 06:07:19 GMT Server:BWS/1.1 Set-Cookie:H_PS_PSSID=6225_5230_1461_5224_6553_6506_4759_6018_6676_6698_6441_6774_6502_6819_6838; path=/; domain=.baidu.com Set-Cookie:BDSVRTM=133; path=/ Transfer-Encoding:chunked 3. http 报头详解 # 这里我就根据上面的那个例子把所有的字段说一下,当然,有的字段,我们通过他的名字就已经知道大概的意思了!有链接的字段,我们在下面进行了更详细的讲解!表 1 公共头部 字段 说明 Remote Address 请求的远程地址 Request URL 请求的域名 Request Method 页面请求的方式:GET/POST Status Code 请求的返回状态 表 2 请求头 字段 说明 Accept 表示浏览器支持的 MIME 类型 Accept-Encoding 浏览器支持的压缩类型 Accept-Language 浏览器支持的语言类型,并且优先支持靠前的语言类型 Cache-Control 指定请求和响应遵循的缓存机制 Connection 当浏览器与服务器通信时对于长连接如何进行处理:close/keep-alive Cookie 向服务器返回 cookie,这些 cookie 是之前服务器发给浏览器的 Host 请求的服务器 URL Referer 该页面的来源 URL User-Agent 用户客户端的一些必要信息 表 3 返回头 字段 说明 Cache-Control 告诉浏览器或者其他客户,什么环境可以安全地缓存文档 Connection 当 client 和 server 通信时对于长链接如何进行处理 Content-Encoding 数据在传输过程中所使用的压缩编码方式 Content-Type 数据的类型 Date 数据从服务器发送的时间 Expires 应该在什么时候认为文档已经过期,从而不再缓存它? Server 服务器名字。Servlet 一般不设置这个值,而是由 Web 服务器自己设置 Set-Cookie 设置和页面关联的 cookie Transfer-Encoding 数据传输的方式 4. 几个字段的说明 # 4.1 Accept # 例子中的 Accept 字段是这样子的:Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8。意思是:浏览器支持的 MIME 类型分别是 text/html、application/xhtml+xml、application/xml 和*/*,优先顺序是它们从左到右的排列顺序。Accept 表示浏览器支持的 MIME 类型;MIME 的英文全称是 Multipurpose Internet Mail Extensions(多功能 Internet 邮件扩充服务),它是一种多用途网际邮件扩充协议,在 1992 年最早应用于电子邮件系统,但后来也应用到浏览器。text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;text/html 表示 html 文档;Application:用于传输应用程序数据或者二进制数据;application/xhtml+xml 表示 xhtml 文档;application/xml 表示 xml 文档。 4.2 Cache-Control # Cache-Control 指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control 并不会影响到另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括:no-cache, no-store, max-age, max-stale, min-fresh, only-if-cached。响应消息中的指令包括:public, private, no-cache, no-store, no-transform, must-revalidate, proxy-revalidate, max-age。各个指令的含义: Public:指示响应可被任何缓存区缓存。 Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当前用户的部分响应消息,此响应消息对于其他用户的请求无效。 no-cache:指示请求或响应消息不能缓存 no-store:用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 max-age:指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 min-fresh:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 max-stale:指示客户机可以接收超出超时期间的响应消息。如果指定 max-stale 消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。 4.3 User-Agent # User-Agent 的值是:用户使用的客户端的一些必要信息,比如操作系统、浏览器及版本、浏览器渲染引擎等。 4.4 Transfer-Encoding # transfer-encoding 的可选值有:chunked,identity,从字面意义可以理解,前者指把要发送传输的数据切割成一系列的块数据传输,后者指传输时不做任何处理,自身的本质数据形式传输。举个例子,如果我们要传输一本“红楼梦”小说到服务器,chunked 方式就会先把这本小说分成一章一章的,然后逐个章节上传,而 identity 方式则是从小说的第一个字按顺序传输到最后一个字结束。 5. 总结 # http 报头让客户端和服务器之间传递了更多的信息,服务器能够发送过来的报头了解到用户的一些必要信息,服务器传回的报头,让客户端更好的理解和解析。 6. 参考文章 # http://www.cnblogs.com/jcli/archive/2012/10/19/2730440.html http://hi.baidu.com/ah__fu/item/1b8c6e6c5e78950da0cf0f53 http://jingyan.baidu.com/article/375c8e19770f0e25f2a22900.html http://blog.csdn.net/wiwipetter/article/details/4559183 http://baike.baidu.com/view/293520.htm#5
2024年10月21日
7 阅读
0 评论
0 点赞
2024-10-21
汉诺塔算法演示
工作之余闲来无聊,于是就有了用JS来实现算法演示的想法,很久以前用JS实现过选择排序,不过源程序找不到了!汉诺塔的递归算法:void move(int n,char a,char b,char c){ if(n==1) printf("\t%c->%c\n",a,c); //当n只有1个的时候直接从a移动到c else { move(n-1,a,c,b); //第n-1个要从a通过c移动到b printf("\t%c->%c\n",a,c); move(n-1,b,a,c); //n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解 } } 在上面的递归算法中,printf函数可以换成我们JS的动画处理函数。我也是受到了其他人写的汉诺塔算法演示的启发:先在算法执行完成以后, 才开始执行动画效果。【代码演示】在代码中,在init()这个方法里我们可以看:// 初始化 Hnt.init = function(opt){ $("#block").html(''); Hnt.movie = []; Hnt.options = $.extend(Hnt.options, opt); Hnt.A.num = Hnt.options.n; Hnt.B.num = 0; Hnt.C.num = 0; Hnt.initBlock(Hnt.options.n); Hnt.move(Hnt.options.n, "A", "B", "C"); Hnt.start(); } 前半部分是将使用到变量重新初始化。后半部分:initBlock(); // 初始化盘子 move(); // 汉诺塔算法的执行,仅仅是执行算法,在这个过程中保存盘子移动的路径,但是不执行动画 start(); // 执行动画效果。 后话:现在仅仅是用js简单地实现了汉诺塔的演示过程,下一步打算从流程上和界面上进行优化,也希望能够学习一些其他的东西。比如:html5的dnd,audio,woker,localstorage,还有jQueryMobile的框架
2024年10月21日
7 阅读
0 评论
0 点赞
2024-10-21
jQuery中兄弟元素、子元素和父元素的获取
我们这里主要总结 jQuery 中对某元素的兄弟元素、子元素和父元素的获取,原声的 Javascript 代码对这些元素的获取比较麻烦一些,而 jQuery 正好对这些方法进行封装,让我们更加方便的对这些元素进行获取和操作。 1. jQuery 提供的方法 # 上来就把 jQuery 提供的方法摆在这里是不是有点不好呀,不过,我们从 jQuery 的方法名称上就能知道这些方法是干嘛的了。 parent(selector) 查找父元素,可传入selector进行过滤(下同) parents(selector) 查找所有的祖先节点 children(selector) 返回所有的子节点,不过该方法只会返回直接的子节点,不会返回所有的子孙节点 prev() 返回该节点的上一个兄弟节点 prevAll() 返回该节点之前所有的节点 next() 返回该节点的下一个兄弟节点 nextAll() 返回该节点之后所有的节点 siblings() 返回该节点所有的兄弟节点,不分前后 find(selector) 返回该节点所有的子孙节点 看完所有的方法之后,我们可以发现:children()只能获取直接的子节点;而 find 能获取所有的子孙节点,当然也包括直接的子节点。让我们通过一个直观的例子来看看这些方法是怎么使用的,【狠狠点击这里>>】从实例中我们能够很清楚的看到这些方法都是获取的哪些元素,比如 parent()是获取当前元素的直接父亲元素,而 parents()是获取所有的父亲元素(也包括其直接父元素)。前面的那些方法使用起来都比较简单,不过这里还是要多说一句:所有的方法都能接收一个 selector 参数来对获取到的结果集进行过滤,来真正的获取我们想要的元素。find()方法的使用是我们这里重点要讲的。 2. find(selector)方法的讲解 # 官方文档的解释:通过一个选择器、jQuery 对象或元素过滤,得到当前匹配的元素集合中每个元素的后代。我们通过这样的代码来更加清晰地了解这句话的意思:$("#main").find(".list"); // 选择器过滤 var $span = $("span"); $("#main").find($span); // jQuery对象过滤 var span = $("span")[0]; $("#main").find(span); // DOM元素过滤 从上面的代码中我们可以看到三种方式都能从$main的所有子孙元素中获取相应的元素。而且find()方法获取子孙元素时采用的时深度搜索优先的策略进行检索的。还是拿我们上面的实例来举例,$('.current')就是当前的元素,然后用 find()获取该元素所有的子孙元素:从上面的图中我们可以看到,find()先找到第一个.item 元素,然后开始检索.item 里的子元素.s;.item 里的子元素检索完成以后,开始寻找第二个.item 元素,然后接着检索第二个.item 里的子元素;第二个.item 检索完成后,开始进行第三个。深度优先的策略就是:先闷头一直往下找,下一个没有元素时再确认是否有 next()兄弟元素,如果没有兄弟元素,那么再往上返回一级,确认这个元素有没有兄弟元素,直到第一级的子元素;如果当前元素有兄弟元素,那么就从这个兄弟元素开始往下执行深度搜索。待所有的子元素检索完毕后,find()方法结束。
2024年10月21日
15 阅读
0 评论
0 点赞
2024-10-21
修改git提交历史中的姓名和email
1. 起因 # 前几天用公司的电脑提交几回代码,也没怎么注意。后来回家之后使用git log查看提交历史时,发现 author 里保存着一些重要的信息。我该怎么办呢,怎么不让别人看到呢,虽然目前这些东西就我一个人用,万一被别人看到了呢,毕竟是放在全世界最流行的代码托管网站。 2. 解决过程 # 在网上倒是找了一些很多的方案,可是因为对 git 命令还不是很熟悉的前提下,即使人家给出了答案都不知道怎么用,比如下面的这几个博文里讲解的:Git 修改提交的用户名和 Emailgit 修改历史提交批量修改 git log 的内容不过都没有解决我的问题,主要还是我学的不多,看不懂,汗。 3. 最终解决方案 # 最后在一个网站找到了一条命令,把里面的参数修改为自己的,回车运行即可$git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='newemail';" HEAD 具体操作过程: 进入到你的文件目录里 先敲一个命令:git --version 修改这条命令里的 newname 和 newemial,如我后面修改的命令: git filter-branch -f --env-filter "GIT_AUTHOR_NAME='wenzi'; GIT_AUTHOR_EMAIL='xxx@gmail.coml'; GIT_COMMITTER_NAME='wenzi'; GIT_COMMITTER_EMAIL='xxx@gmail.com';" HEAD 回车执行 做完上面这几步后,就能看到我们的命令正在执行!完毕!如果你还有什么不明白的,欢迎留言讨论。
2024年10月21日
7 阅读
0 评论
0 点赞
2024-10-21
Mercurial的使用心得
1. 本人接触版本控制的历史 # 在很久很久以前,我们是怎么进行版本控制的呢,当我们工作到某个阶段后,就把此时的项目存为一个文件夹(A),然后再从这儿复制出一份(B)接着修改,而存储的那个文件夹(A)就是我们打的版本号,当我们把B改动到某个阶段后再打一个版本,然后从这个版本里衍生出一个C,一直衍生下去......。如果我们在某个版本改坏了的话,我们再从上个版本复制出一份接着修改。本人小蚊当时在学校的时候对版本控制了解的不深,就是用的这种方式进行版本控制的,这种手动进行版本控制的一个坏处就是:我们不知道每两个版本的差异在哪儿,都修改了哪些文件,只能说是这个版本比上个版本多了几个功能,可是文件的差异在哪儿,就不好对比了。不过后来在工作中遇到了SVN,这种情况就改善了很多。当时小蚊使用SVN时,每次我要对某个项目的代码进行改动时,都先从服务器上down下一份代码来,然后开始修改。因为本地的代码已经很老了,如果其他人也提交了代码的话,我再用我本地的老代码进行提交,就可能出现代码覆盖或文件冲突的情况。刚开始使用时都没有写改动信息,后来发现同事会在项目里弄一个changelog.txt来保存每次的修改,然后我也跟着学。可是后来发现原来SVN本身就有记录改动日志的功能,从这儿之后才算是开始步入正轨,真正地接触到了版本控制系统。当我开始接触github时,慢慢地使用上了git这个版本控制系统,可是因为是项目只有自己在改,也没有学习到很多。后来换了新工作之后,新公司使用的是mercurial作为版本控制系统,在工作中学习到了很多分布式版本控制系统的知识。 2. mercurial的使用 # hg和git有着无数的相似之处,都是分布式版本控制,都是有分支。git我只是在提交自己的项目时使用,很多的东西还没用到,不过工作中使用的是hg,每天都在多人合作代码,常会遇到合并分支时出现文件冲突、推代码时出现多个相同的分支。什么是分支,分支是干什么用的?像以前传统时的那种版本控制系统,整个项目都是集中一个服务器上,任何的修改都是要先从整个服务器上拉取代码,修改完成后再上传上去,若在修改的期间,其他人也提交了代码,最后自己提交的时候可能会覆盖掉上一个人的改动;现在分布式版本控制系统的优势就是,一个分支就是一个代码库,你在该分支上进行的任何操作都不会影响到其他分支,如果把整个分支整坏了,或者想放弃这个分支,那么直接切回到default分支重新新建即可,在那个分支上所有的改动都被保留在了那个分支上。 3. hg常用命令 # hg clone rep 从rep的地址拉取代码hg status 查看当前仓库中的文件改动状态: M: 内容已改动; !(感叹号):版本库还在跟踪该文件,可是本地仓库已经丢失该文件 R:该文件从版本库中删除; ?(问号):本地仓库中新添加的文件,版本库里还没有该文件,需要使用hg add 文件名 添加到版本库中 A:该文件是新添加的 hg remove 文件名 版本系统不再跟踪该文件hg revert 文件名 恢复该文件状态是!(感叹号)的,需要进行二选一了,是该文件真需要删除了,还是被误删了;若真的需要删除,则使用hg remove 文件名,若被误删了则使用hg revert恢复该文件hg add . 将所有没有在版本控制系统的文件添加到控制系统中,hg add 文件名 是将某个文件添加到控制系统中 hg log 查看提交的历史信息hg commit 将本地的改动进行提交hg push 将改动推到远程的分支上hg merge 分支名 将其他分支的代码合并过来hg diff 查看改动,hg diff 文件名 查看该文件的改动 4. 使用过程中遇到的问题 # 当前分支拉取当前分支不用merge,直接hg pull -u 取消当前分支的修改回到最初状态时,hg update -C 切换到其他分支且不保留当前分支的修改时,hg update default -C 切换到其他分支且保留当前分支的修改时,hg update default 创建分支时要在default分支上进行创建,这样保证所有的分支没有瓜葛;若在其他的分支上直接创建分支时,则把上一个分支的修改保留了下来,不容易进行拆分;视情况而定 若第一次提交分支时,则使用hg push -b 当前分支名 --new-branch,若已经是第二次以上的提交了则使用hg push -b 当前分支名即可,当然,每次提交时都带着—new-branch也没错 多人合作时需要拉取别人的分支的代码,不要担心,别人的分支和default分支没有任何区别7.1 在default分支上拉取远程的代码并更新本地代码:hg pull -u(hg pull, hg update) 7.2 在default分支上新建自己的分支:hg branch 自己的分支名 7.3 合并他人的分支:hg merge 他人的分支名 7.4 将合并的先提交一下,不然一会儿自己的改动和刚拉取的他人的代码混到一起了:hg commit -m 'merge from xiaoming' 7.5 进行自己的改动,该修改的修改,该添加的添加,该删除的删除7.6 提交自己的修改:hg commit -m '改动原因或目的' 7.7 再拉取下远程的代码,在改动的过程中说不定已经有人更新default分支了,不合并的话,会把别人的提交弄丢:hg pull -u hg merge default hg commit -m 'merge from default'(若merge default时需要提交) 7.8 将自己的代码推送到远程代码库:hg push -b 自己的分支名 --new-branch 配置 .hg目录8.1 hgrc : hg的远程代码库地址 ,若远程地址改动了 ,不用从零开始在新的地址拉取,只需要在这个文件中可以修改地址即可[paths] default = ssh://https://www.github.com/wenzi0github/test 8.2 branch : 当前的分支 ,这个文件里存储着当前的分支名8.3 last-message.txt : 最后一次提交的信息,hg commit -m 'message' 合并分支时出现冲突或出现推代码时出现多个相同的分支(多头),怎么办?当我出现这个的状况时通常是使用sourceTree的这个可视化工具来解决的,sourceTree上安装kdiff3的插件,当合并时出现了冲突,能够很明显的看到文件的哪部分出现了冲突,然后应该选择哪个作为需要合并的部分;当出现多个相同的分支时,先使用hg up 分支切换到当前多个中,然后把其他相同的分支直接merge到这个分支上,然后再合并其他分支的代码。 如何在mac下配置kidff3?配置kdiff3的地方主要由两个:控制台和sourcetree。首先安装kdiff3,如果是直接打开的话,那么就直接把kidff3.app拖拽到应用程序的文件夹中。10.1 控制台配置kdiff3hg在控制台配置kdiff3是相当的简单,打开你的~/.hgrc文件(如果不存在则创建一个),然后添加下面的代码:[extdiff] cmd.kdiff3 = /Applications/kdiff3.app/Contents/MacOS/kdiff3 [merge-tools] kdiff3.args = $base $local $other -o $output 配置完成后,当你merge一个分支产生冲突时,kidff3会自动弹出,然后你就可以选择你需要的内容进行合并。10.2 sourcetree配置kidff3打开sourcetree->preferences->diff,然后在visual diff tool和merge tool中都选择kDiff3即可。 当有文件产生冲突时,选择这个文件->右键选择resolve conflicts->launch external merge tool ,就会弹出kDiff3。 5. 总结 # 当然,这里也只是个人经历的总结而已,依然还有很多的东西没有总结到位。
2024年10月21日
7 阅读
0 评论
0 点赞
1
...
33
34
35
...
152