背景:解析Http的get请求时会对\r\n啥的作解析,得对这个get Post作分析。
响应格式:
下面是通过firebug获取的响应头数据信息:
响应头信息 原始头信息
响应格式主要有响应行,响应头,响应体组成 。
响应行 : 标识服务器端对客户端请求的处理结果,主要由响应状态信息,响应状态码,服务器协议HTTP协议:参考请求头当中对协议的描述。
响应头: 类似于请求头的key:value形式。如下:
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.4; JBoss-4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)/Tomcat-5.5
Content-Type: application/json;charset=GBK
Content-Length: 338
Date: Wed, 12 Sep 2012 07:30:22 GMT
1. Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
2. Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
3. Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
4. Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
5. Expires 应该在什么时候认为文档已经过期,从而不再缓存它。
6. Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
7. Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
8. Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。
注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。
注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。
注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。
Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
Set-Cookie 设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。
WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。
注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问
//根据父节点查出子节点 function loadByParentCode(kongjian) { // alert("onchange"+kongjian.name); var kongjianName=""+(parseInt(kongjian.name.charAt(0))+1)+"Catalog"; var url = "/s.do obj=catalogDaoImpl"; var where={}; where["level"]=parseInt(kongjian.name.charAt(0))+1; where["code"]=kongjian.value; sendJsonrpcRequest(url, "POST", "getListBy", {where:where} , null,function(data) { //清除原来的option for(var j=parseInt(kongjian.name.charAt(0))+1;j<=5;j++) { $("#"+j+"Catalog option").remove(); $("#"+j+"Catalog").append("<option value=''$amp;>amp;$lt;/option$amp;>quot;$); } //添加新的option if(kongjian.value != "") bindHtmlSelect("#"+kongjianName,data,"title","code",null); }, null); }
根据上面的ajax代码:请求的url是:;charset=utf-8&jsonrpcContent=%257B%2522id%2522%253A1%252C%2522method%2522%253A%2522getListBy%2522%252C%2522params%2522%253A%257B%2522where%2522%253A%257B%2522level%2522%253A2%252C%2522code%2522%253A%2522840%2522%257D%257D%252C%2522jsonrpc%2522%253A%25222.0%2522%257D&rnd=0.7714995991861088
其中:
obj :catalogDaoImpl 是post的非json参数,在firebug中捕获到的结果是:
参数:
obj
catalogDaoImpl
而下面是通过URLDecoder编码后的ajax的post参数,在firebug中的捕获到的数据格式如下:
参数 application/x-www-form-urlencoded
charset utf-8
jsonrpcContent %7B%22id%22%3A1%2C%22method%22%3A%22getListBy%22%2C%22params%22%3A%7B%22where%22%3A%7B%22level%22%3A2 %2C%22code%22%3A%22840%22%7D%7D%2C%22jsonrpc%22%3A%222.0%22%7D
rnd 0.7714995991861088
其组成url请求的源代码是:
charset=utf-8&jsonrpcContent=%257B%2522id%2522%253A1%252C%2522method%2522%253A%2522getListBy%2522%252C %2522params%2522%253A%257B%2522where%2522%253A%257B%2522level%2522%253A2%252C%2522code%2522%253A%2522840 %2522%257D%257D%252C%2522jsonrpc%2522%253A%25222.0%2522%257D&rnd=0.7714995991861088
响应请求后的数据包:
{"id":1,"jsonrpc":"2.0","result":[{"id":521,"title":"kangze111","code":"840596","parentId":0,"parentPath" :"840","sortNumber":0,"level":2,"createTime":1347008939000,"reservedInt":0,"status":0,"comment":"kangze .sl","creator":"kangze.sl","lastUpdateTime":1347008939000,"lastOperator":"kangze.sl","reservedField" :null,"reservedString":null}]}
二:http请求分析:
请求头信息的格式(firebug中抓取):
Host: risk:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0.1
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer:
Content-Length: 289
Cookie: ArkAppAuthen=Authen|YMVwbcTly2N0KJbDcaGVrn3WYWguBTPkgMZhjPQakiCvFoalWKrYrhLUmNGMJtT1b9/EB2kfvCDecWNBKxSzFPjf+bdYg8oIXg7og8qk78kFspRVQ5+XIKBWrhzYjV5WiJwzBh6QtGm37e8fBNI2kGtqW1TRJPfksgwIFwaSu4Z8u1+NLgLH0vJriGCw8M5oYqe15s/7n9Ifl1k+gVc3oJZqvXU0cL9KZFkebGaL/ZFNgU/QocW85f2P2zrcQ8WEBUyNsqrlqih+AmHzt5lvcTQWI0HuVWu98tBETrdpoH54wTbalb38+tbOLQ4GN/b6tHOcxTcwbma1vOhYLe5yop/RW0S5/hQheNuVRsHC9VD3T3Ra3fbAmy028pHePqUB/IS+/AlnQefqPaGXxO/dN3oFlYSGquVcLBtKfxp8UJBF+gpOYD0/EZzAR89ZeS9kHHT24hxwMsfDz1qNTSTqeA||&Scid|NWZjZTQxYTYtZWRhMy00OTI5LTg1MWYtMjE1MzAwMTJkZjAz&Code|||AM; auth=114966948%3Ayumo.lck%3A*%3A1346064696%3A13a2ec50e821c247f95ef34ac34e899e; JSESSIONID=161252CDF4DE354D0B723C8614106F44
Pragma: no-cache
Cache-Control: no-cache
一个非常重要的空行分开了请求头与实体,它标志着实体内容的开始。
一个浏览器中输入url地址。
2. 网页中的超链接。
3. 后台代码中通过response.redirect("form表单形式提交
前三种方式都是以Get方式发起请求。第四种方式可以以Get方式发起请求,也可以以Post方式发起请求,只需要设置<form action="" method="Get/Post"$amp;>amp;$lt;/form>的method属性即可,默认该属性值为Get.
当客户端发起一个Http请求到服务端时,会传输一个Http请求消息给服务端,标准的Http请求消息格式如下:
请求行(request-line)——请求行的格式为:请求方式_资源路径_x HTTP/1.1)。
消息头(headers)——说明服务器要使用的附加信息(ContentType:application/json Content_Length:18 等等其他头信息)。
回车换行(CRLF)——表明头部信息结束。
主体数据(request-body)——需要传输到服务端的数据内容,以Post方式请求时才会有该项数据。(username=tom&age=21)
回车换行(CRLF)——表明主体数据信息结束。
需要说明的是:
1.当一个Http请求时Get方式的请求时,请求消息中只有前三项,而没有主体数据。当以Post方式请求时,会包含上述五项信息。
2.无论是Get请求还是Post请求,请求行中的资源路径必须是application/x-www-form-urlencoded方式编码。Get请求时,浏览器会自动对其进行UrlEncode。Post请求时,浏览器不会自动进行UrlEncode,所有需要手动对资源路径进行UrlEncode。
来自:http://www.educity.cn/wenda/142454.html
响应格式:
下面是通过firebug获取的响应头数据信息:
响应头信息 原始头信息
响应格式主要有响应行,响应头,响应体组成 。
响应行 : 标识服务器端对客户端请求的处理结果,主要由响应状态信息,响应状态码,服务器协议HTTP协议:参考请求头当中对协议的描述。
响应头: 类似于请求头的key:value形式。如下:
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.4; JBoss-4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)/Tomcat-5.5
Content-Type: application/json;charset=GBK
Content-Length: 338
Date: Wed, 12 Sep 2012 07:30:22 GMT
1. Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
2. Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
3. Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
4. Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
5. Expires 应该在什么时候认为文档已经过期,从而不再缓存它。
6. Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
7. Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
8. Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。
注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。
注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。
注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。
Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
Set-Cookie 设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。
WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。
注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问
//根据父节点查出子节点 function loadByParentCode(kongjian) { // alert("onchange"+kongjian.name); var kongjianName=""+(parseInt(kongjian.name.charAt(0))+1)+"Catalog"; var url = "/s.do obj=catalogDaoImpl"; var where={}; where["level"]=parseInt(kongjian.name.charAt(0))+1; where["code"]=kongjian.value; sendJsonrpcRequest(url, "POST", "getListBy", {where:where} , null,function(data) { //清除原来的option for(var j=parseInt(kongjian.name.charAt(0))+1;j<=5;j++) { $("#"+j+"Catalog option").remove(); $("#"+j+"Catalog").append("<option value=''$amp;>amp;$lt;/option$amp;>quot;$); } //添加新的option if(kongjian.value != "") bindHtmlSelect("#"+kongjianName,data,"title","code",null); }, null); }
根据上面的ajax代码:请求的url是:;charset=utf-8&jsonrpcContent=%257B%2522id%2522%253A1%252C%2522method%2522%253A%2522getListBy%2522%252C%2522params%2522%253A%257B%2522where%2522%253A%257B%2522level%2522%253A2%252C%2522code%2522%253A%2522840%2522%257D%257D%252C%2522jsonrpc%2522%253A%25222.0%2522%257D&rnd=0.7714995991861088
其中:
obj :catalogDaoImpl 是post的非json参数,在firebug中捕获到的结果是:
参数:
obj
catalogDaoImpl
而下面是通过URLDecoder编码后的ajax的post参数,在firebug中的捕获到的数据格式如下:
参数 application/x-www-form-urlencoded
charset utf-8
jsonrpcContent %7B%22id%22%3A1%2C%22method%22%3A%22getListBy%22%2C%22params%22%3A%7B%22where%22%3A%7B%22level%22%3A2 %2C%22code%22%3A%22840%22%7D%7D%2C%22jsonrpc%22%3A%222.0%22%7D
rnd 0.7714995991861088
其组成url请求的源代码是:
charset=utf-8&jsonrpcContent=%257B%2522id%2522%253A1%252C%2522method%2522%253A%2522getListBy%2522%252C %2522params%2522%253A%257B%2522where%2522%253A%257B%2522level%2522%253A2%252C%2522code%2522%253A%2522840 %2522%257D%257D%252C%2522jsonrpc%2522%253A%25222.0%2522%257D&rnd=0.7714995991861088
响应请求后的数据包:
{"id":1,"jsonrpc":"2.0","result":[{"id":521,"title":"kangze111","code":"840596","parentId":0,"parentPath" :"840","sortNumber":0,"level":2,"createTime":1347008939000,"reservedInt":0,"status":0,"comment":"kangze .sl","creator":"kangze.sl","lastUpdateTime":1347008939000,"lastOperator":"kangze.sl","reservedField" :null,"reservedString":null}]}
二:http请求分析:
请求头信息的格式(firebug中抓取):
Host: risk:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0.1
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer:
Content-Length: 289
Cookie: ArkAppAuthen=Authen|YMVwbcTly2N0KJbDcaGVrn3WYWguBTPkgMZhjPQakiCvFoalWKrYrhLUmNGMJtT1b9/EB2kfvCDecWNBKxSzFPjf+bdYg8oIXg7og8qk78kFspRVQ5+XIKBWrhzYjV5WiJwzBh6QtGm37e8fBNI2kGtqW1TRJPfksgwIFwaSu4Z8u1+NLgLH0vJriGCw8M5oYqe15s/7n9Ifl1k+gVc3oJZqvXU0cL9KZFkebGaL/ZFNgU/QocW85f2P2zrcQ8WEBUyNsqrlqih+AmHzt5lvcTQWI0HuVWu98tBETrdpoH54wTbalb38+tbOLQ4GN/b6tHOcxTcwbma1vOhYLe5yop/RW0S5/hQheNuVRsHC9VD3T3Ra3fbAmy028pHePqUB/IS+/AlnQefqPaGXxO/dN3oFlYSGquVcLBtKfxp8UJBF+gpOYD0/EZzAR89ZeS9kHHT24hxwMsfDz1qNTSTqeA||&Scid|NWZjZTQxYTYtZWRhMy00OTI5LTg1MWYtMjE1MzAwMTJkZjAz&Code|||AM; auth=114966948%3Ayumo.lck%3A*%3A1346064696%3A13a2ec50e821c247f95ef34ac34e899e; JSESSIONID=161252CDF4DE354D0B723C8614106F44
Pragma: no-cache
Cache-Control: no-cache
一个非常重要的空行分开了请求头与实体,它标志着实体内容的开始。
一个浏览器中输入url地址。
2. 网页中的超链接。
3. 后台代码中通过response.redirect("form表单形式提交
前三种方式都是以Get方式发起请求。第四种方式可以以Get方式发起请求,也可以以Post方式发起请求,只需要设置<form action="" method="Get/Post"$amp;>amp;$lt;/form>的method属性即可,默认该属性值为Get.
当客户端发起一个Http请求到服务端时,会传输一个Http请求消息给服务端,标准的Http请求消息格式如下:
请求行(request-line)——请求行的格式为:请求方式_资源路径_x HTTP/1.1)。
消息头(headers)——说明服务器要使用的附加信息(ContentType:application/json Content_Length:18 等等其他头信息)。
回车换行(CRLF)——表明头部信息结束。
主体数据(request-body)——需要传输到服务端的数据内容,以Post方式请求时才会有该项数据。(username=tom&age=21)
回车换行(CRLF)——表明主体数据信息结束。
需要说明的是:
1.当一个Http请求时Get方式的请求时,请求消息中只有前三项,而没有主体数据。当以Post方式请求时,会包含上述五项信息。
2.无论是Get请求还是Post请求,请求行中的资源路径必须是application/x-www-form-urlencoded方式编码。Get请求时,浏览器会自动对其进行UrlEncode。Post请求时,浏览器不会自动进行UrlEncode,所有需要手动对资源路径进行UrlEncode。
来自:http://www.educity.cn/wenda/142454.html
Linux C/C++多线程pthread实例
Unix/LinuxC技术 jack 2015-3-20 11:31
背景:主要是遇到编译时要函数返回一个void *,否则会提示:warning: no return statement in function returning non-void,如果去掉这个线程函数的void *里的星号会报错: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’ 。
pthread注意事项
注意,pthread_create第三个参数,也就是线程回调函数格式为:
void* fnThreadFun(void* param)
{
return NULL;//或return ((void *)0);
}
其返回值为void*型指针,如果写成void fnThreadFun(void* param)形式,那么编译会报告:
error: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’ [-fpermissive]
错误。
写成:
err = pthread_create(&ntid,NULL,(void*)&fnThreadFun,NULL);
样式似乎也不行,gcc编译时不会出错,但是用g++就会有问题(也会报告上面错误。),究其原因就是C语言编译器允许隐含性的将一个通用指针转换为任意类型的指针,而C++不允许
From:http://www.metsky.com/archives/550.html
pthread注意事项
注意,pthread_create第三个参数,也就是线程回调函数格式为:
void* fnThreadFun(void* param)
{
return NULL;//或return ((void *)0);
}
其返回值为void*型指针,如果写成void fnThreadFun(void* param)形式,那么编译会报告:
error: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’ [-fpermissive]
错误。
写成:
err = pthread_create(&ntid,NULL,(void*)&fnThreadFun,NULL);
样式似乎也不行,gcc编译时不会出错,但是用g++就会有问题(也会报告上面错误。),究其原因就是C语言编译器允许隐含性的将一个通用指针转换为任意类型的指针,而C++不允许
From:http://www.metsky.com/archives/550.html
一)进程ID:
pid_t 是那一种数据类型:
是Linux下的进程号类型,也就是Process ID _ Type 的缩写。 其实是宏定义的unsigned int类型,
warning: format ‘%u’ expects type ‘unsigned int’, but argument 2 has type ‘pthread_t’:
使用%lu打印pthread_t不会出现警告。
二)线程ID:
编译时如果使用%x打印pthread_t会出现警告信息:
thread-pool.c:77: warning: format ‘%x’ expects type ‘unsigned int’, but argument 3 has type ‘pthread_t’
如果使用%lu打印pthread_t不会出现警告。
如:
问题一,对宏定义的返回数据类型作出一个定义,如下面是对进程数作定义:
问题二:对pid_t进程号用printf打印出现警告:
pid_t p;
pthread_t t;
printf("\nthread id is %lu,procees id is %lu,waiting for into while...\n",t,p);
format ‘%lu’ expects type ‘long unsigned int’, but argument 3 has type ‘pid_t’
这PID pthread_t打印用啥格式?
: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘pthread_t’
: warning: format ‘%ld’ expects type ‘long int’, but argument 3 has type ‘pid_t’
: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘pthread_t’
如果打印pid_t这种类型,你知道它是整数,但是不知道具体类型,而且在不同平台也可能不同
一般做法是强转下:"%lld", (long long)xxx
或者"%llu", (unsigned long long)xxx
因为C的整数最大就是long long
实践Ok代码如下:
pid_t 是那一种数据类型:
是Linux下的进程号类型,也就是Process ID _ Type 的缩写。 其实是宏定义的unsigned int类型,
warning: format ‘%u’ expects type ‘unsigned int’, but argument 2 has type ‘pthread_t’:
使用%lu打印pthread_t不会出现警告。
二)线程ID:
编译时如果使用%x打印pthread_t会出现警告信息:
thread-pool.c:77: warning: format ‘%x’ expects type ‘unsigned int’, but argument 3 has type ‘pthread_t’
如果使用%lu打印pthread_t不会出现警告。
如:
问题一,对宏定义的返回数据类型作出一个定义,如下面是对进程数作定义:
问题二:对pid_t进程号用printf打印出现警告:
pid_t p;
pthread_t t;
printf("\nthread id is %lu,procees id is %lu,waiting for into while...\n",t,p);
format ‘%lu’ expects type ‘long unsigned int’, but argument 3 has type ‘pid_t’
这PID pthread_t打印用啥格式?
: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘pthread_t’
: warning: format ‘%ld’ expects type ‘long int’, but argument 3 has type ‘pid_t’
: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘pthread_t’
如果打印pid_t这种类型,你知道它是整数,但是不知道具体类型,而且在不同平台也可能不同
一般做法是强转下:"%lld", (long long)xxx
或者"%llu", (unsigned long long)xxx
因为C的整数最大就是long long
实践Ok代码如下:
背景:如果nginx代理这个80到swoole(用swoole做webserver,其实就是做个转发和html解析。),这个代理是个什么概念,那这个socket的fd是不是就没法长连接了呢??被反向80端口代理的swoole还能长连接?用:nginx_tcp_proxy_module才行 ,否则肯定不行啊,即使http的keep-alive,https://github.com/yaoweibin/nginx_tcp_proxy_module 也就是说nginx的http代理长连接不行,得走tcp这一层才行,用haproxy。
使用Nginx实现TCP反向代理:https://www.hi-linux.com/posts/65232.html
Nginx 配置TCP代理:https://www.cnyunwei.cc/archives/1315
nginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司的的负载均衡都是nginx所以决定研究一下nginx的这个功能实现,下面简单介绍一下实现方法:
阅读全文
使用Nginx实现TCP反向代理:https://www.hi-linux.com/posts/65232.html
Nginx 配置TCP代理:https://www.cnyunwei.cc/archives/1315
nginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司的的负载均衡都是nginx所以决定研究一下nginx的这个功能实现,下面简单介绍一下实现方法:
阅读全文
http://www.techweb.com.cn/ucweb/news/id/2134055
http://jingyan.baidu.com/article/676629972c2ce954d51b8425.html
http://jingyan.baidu.com/article/676629972c2ce954d51b8425.html
[实践OK] gdb断点保存,gdb单文件多文件断点设置及断点管理,GDB通过自定义命令实现一次执行多个命令。
Unix/LinuxC技术 jack 2015-3-19 11:21
背景:调试大的程序时,经常会设置很多断点。但一旦退出gdb,这些断点会全部丢失,再调试时又得重新设置断点,费时费力。gdb断点保存势在必行。
实践如下:
vi bp.list
set follow-fork-mode child
b 187
b 194
b 290
后用-x命令载入这个断电的列表:
GNU gdb Fedora (6.8-37.el5)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...
Breakpoint 1 at 0x4025de: file multipepollserver.cpp, line 187.
Breakpoint 2 at 0x4026cf: file multipepollserver.cpp, line 194.
Breakpoint 3 at 0x402c2a: file multipepollserver.cpp, line 290.
有时进程退出有问题,于是得杀死,其shell一行解决:
ps aux|grep httpmut|grep -v grep|awk '{print "kill -9 "$2 }'
kill:
——————————————————————————————————————————————————————————
一、Share: gdb断点保存
调试大的程序时,经常会设置很多断点。但一旦退出gdb,这些断点会全部丢失,再调试时又得重新设置断点,费时费力。
我们可能利用gdb的-x参数来载入所有预设的断点,步骤如下:
1.将断点保存到一个文件中,如bp.list;
2.用gdb调试时,加-x参数载入上述文件。这相当于是gdb的一个批处理功能,因此你还可以在上述文件中加上其他你经常要用到的命令。
For example:
bash-3.00$ cat bp.list
b main
b 8
bash-3.00$ g++ -g test.cpp
bash-3.00$ gdb ./a.out -x bp.list -tui
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "sparc-sun-solaris2.10"...
Breakpoint 1 at 0x11000: file test.cpp, line 26.
Breakpoint 2 at 0x10e28: file test.cpp, line 8.
(gdb)
Enjoy it~
例如,你每次启动gdb,想在main 函数处设断点
编辑一个文件比如叫 a
a中输入
br main
保存
gdb 你的可执行文件 -x a就自动执行设断点了。
这相当于是gdb的一个批处理功能,你还可以在文件中加上其他你经常要用到的命令
只要用-x 参数加批处理文件运行就可以了
来自:http://blog.csdn.net/rxl2008/article/details/6273664
http://topic.csdn.net/t/20041117/17/3562393.html
可以把一些需要用到的命令写到一个文件中,运行gdb的时候读取之就ok了。
6 楼datuhao(峡谷)回复于 2004-11-18 19:22:14 得分 90
例如
你每次启动gdb ,想在main 函数处设断点
编辑一个文件比如叫 a
a中输入
br main
保存
gdb 你的可执行文件 -x a就自动执行设断点了。
这相当于是gdb的一个批处理功能,你还可以在文件中加上其他你经常要用到的命令
只要用-x 参数加批处理文件运行就可以了
二、gdb单文件多文件断点设置及断点管理:
摘自:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520112179264986/
三、GDB通过自定义命令实现一次执行多个命令
今天,想在gdb一次执行next和p num_caches两条命令,尝试
next; p num_cache
等基于分割符的命令无效后,查了下,需要通过自定义命令实现,具体如下:
(gdb) next;p num_caches
Invalid character ';' in expression.
(gdb) define myfun
Type commands for definition of "myfun".
End with a line saying just "end".
>next
>p num_caches
>end
(gdb) myfun
731 cpus[j].dcache->owner = (struct godson2_cpu *)&cpus[j];
$4 = 3
另外,有些常用的命令组合可以在~/.gdbinit中定义
原文:http://mblog.sigma.me/2011/09/22/gdb-run-multi-cmd.html
实践如下:
vi bp.list
set follow-fork-mode child
b 187
b 194
b 290
后用-x命令载入这个断电的列表:
GNU gdb Fedora (6.8-37.el5)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...
Breakpoint 1 at 0x4025de: file multipepollserver.cpp, line 187.
Breakpoint 2 at 0x4026cf: file multipepollserver.cpp, line 194.
Breakpoint 3 at 0x402c2a: file multipepollserver.cpp, line 290.
有时进程退出有问题,于是得杀死,其shell一行解决:
ps aux|grep httpmut|grep -v grep|awk '{print "kill -9 "$2 }'
kill:
——————————————————————————————————————————————————————————
一、Share: gdb断点保存
调试大的程序时,经常会设置很多断点。但一旦退出gdb,这些断点会全部丢失,再调试时又得重新设置断点,费时费力。
我们可能利用gdb的-x参数来载入所有预设的断点,步骤如下:
1.将断点保存到一个文件中,如bp.list;
2.用gdb调试时,加-x参数载入上述文件。这相当于是gdb的一个批处理功能,因此你还可以在上述文件中加上其他你经常要用到的命令。
For example:
bash-3.00$ cat bp.list
b main
b 8
bash-3.00$ g++ -g test.cpp
bash-3.00$ gdb ./a.out -x bp.list -tui
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "sparc-sun-solaris2.10"...
Breakpoint 1 at 0x11000: file test.cpp, line 26.
Breakpoint 2 at 0x10e28: file test.cpp, line 8.
(gdb)
Enjoy it~
例如,你每次启动gdb,想在main 函数处设断点
编辑一个文件比如叫 a
a中输入
br main
保存
gdb 你的可执行文件 -x a就自动执行设断点了。
这相当于是gdb的一个批处理功能,你还可以在文件中加上其他你经常要用到的命令
只要用-x 参数加批处理文件运行就可以了
来自:http://blog.csdn.net/rxl2008/article/details/6273664
http://topic.csdn.net/t/20041117/17/3562393.html
可以把一些需要用到的命令写到一个文件中,运行gdb的时候读取之就ok了。
6 楼datuhao(峡谷)回复于 2004-11-18 19:22:14 得分 90
例如
你每次启动gdb ,想在main 函数处设断点
编辑一个文件比如叫 a
a中输入
br main
保存
gdb 你的可执行文件 -x a就自动执行设断点了。
这相当于是gdb的一个批处理功能,你还可以在文件中加上其他你经常要用到的命令
只要用-x 参数加批处理文件运行就可以了
二、gdb单文件多文件断点设置及断点管理:
摘自:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520112179264986/
三、GDB通过自定义命令实现一次执行多个命令
今天,想在gdb一次执行next和p num_caches两条命令,尝试
next; p num_cache
等基于分割符的命令无效后,查了下,需要通过自定义命令实现,具体如下:
(gdb) next;p num_caches
Invalid character ';' in expression.
(gdb) define myfun
Type commands for definition of "myfun".
End with a line saying just "end".
>next
>p num_caches
>end
(gdb) myfun
731 cpus[j].dcache->owner = (struct godson2_cpu *)&cpus[j];
$4 = 3
另外,有些常用的命令组合可以在~/.gdbinit中定义
原文:http://mblog.sigma.me/2011/09/22/gdb-run-multi-cmd.html
[实践OK]gdb调试宏定义并显示宏定义的值,gdb调试时No symbol "var" defined in current context,局部变量不可查看问题,如何用GDB查看一个宏?
Unix/LinuxC技术 jack 2015-3-18 16:08
背景:调试一个多进程学习的小程序,发出用gdb调试,出现:gdb调试时No symbol "var" defined in current context,if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0){//上传分片上报链接 发现在点问题,于是查了下网络,同时发现宏好像不适合用这个函数作比较:char *strncpy(char *dest, const char *src, size_t n);。
(gdb) p requestHeaderURI
$1 = 0xa6bc240 "/task"
(gdb) p TASKSURI
No symbol "TASKSURI" in current context.

————————————————————————————
在编译程序时 加上 -gdwarf-2 -g3 参数 即可。
如 gcc -gdwarf-2 -g3 sed sed.o
————————————————————————————
宏定义#define APLLCON0 *((volatile unsigned int *)0xFF500100),值为虚拟地址
问题:
gdb跟踪调试想查看该宏的值时,如下提示:No symbol “APLLCON0” in current context.
分析:
参考http://blog.csdn.net/jibing57/article/details/7439631
编译器默认没有把宏定义扩展信息编译进二进制文件。
通过man gcc查看说明,如下

编译时需添加-gdwarf-2和-g3两个参数。
加了-g3的参数后,gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。
结论:
在CFLAGS参数后添加-g3 -gdwarf-2参数

重新编译、gdb调试宏,如下

来自:http://blog.csdn.net/zhangjs0322/article/details/39666889
开始实践如下:
(gdb) set follow-fork-mode child
(gdb) b 290
Breakpoint 1 at 0x402bd9: file multipepollserver.cpp, line 290.
(gdb) r
..............................
294 if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0){//上传分片上报链接
(gdb) n
295 printf("上传分片上报链接");
(gdb) n
线程捕获到生产出来的产品,consumer thread tid=1086941504 get in bp=-1
298 if(strncmp(requestHeaderURI,SLICEURI,strlen(requestHeaderURI)) == 0){//上传各分片的链接
(gdb) p requestHeaderURI
$1 = 0xd7df240 "/task"
(gdb) p TASKSURI
上传分片上报链接线程捕获到生产出来的产品,consumer thread tid=1086941504 get in bp=-2
$2 = "/task"
如果去掉生成点o文件里的参数,只保留最后生成的可执行文件是不行的,实践证明,得在生成.o时就加上后,在后面合并时不加也成。(也就是说最后生成的.o里得有,否则,最后一步及时加上也是不行的。)
MakeFile:
multipepollserver:multipepollserver.o memorypool.o
/usr/bin/g++44 -Wall -g -o multipepollserver multipepollserver.o memorypool.o -lrt -lpthread -lmemcached
multipepollserver.o:multipepollserver.cpp memorypool.h
/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g multipepollserver.cpp -std=c++0x
memorypool.o:memorypool.cpp memorypool.h
/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g memorypool.cpp
clean:
rm -f multipepollserver memorypool.o multipepollserver.o
实践证明,加这一句上,下面生成点O不加也是不行的:
/usr/bin/g++44 -Wall -g -o multipepollserver multipepollserver.o memorypool.o -lrt -lpthread -lmemcached
————————————————————————————————————————————————————————————————————————
其他参考:
来自:http://www.sudu.cn/info/index.php?op=article&id=260892
来自:http://blog.csdn.net/littlefang/article/details/6293448
来自:http://blog.sina.com.cn/s/blog_6cee149d0100ohvl.html
(gdb) p requestHeaderURI
$1 = 0xa6bc240 "/task"
(gdb) p TASKSURI
No symbol "TASKSURI" in current context.
————————————————————————————
在编译程序时 加上 -gdwarf-2 -g3 参数 即可。
如 gcc -gdwarf-2 -g3 sed sed.o
————————————————————————————
宏定义#define APLLCON0 *((volatile unsigned int *)0xFF500100),值为虚拟地址
问题:
gdb跟踪调试想查看该宏的值时,如下提示:No symbol “APLLCON0” in current context.
分析:
参考http://blog.csdn.net/jibing57/article/details/7439631
编译器默认没有把宏定义扩展信息编译进二进制文件。
通过man gcc查看说明,如下
编译时需添加-gdwarf-2和-g3两个参数。
加了-g3的参数后,gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。
结论:
在CFLAGS参数后添加-g3 -gdwarf-2参数
重新编译、gdb调试宏,如下
来自:http://blog.csdn.net/zhangjs0322/article/details/39666889
开始实践如下:
(gdb) set follow-fork-mode child
(gdb) b 290
Breakpoint 1 at 0x402bd9: file multipepollserver.cpp, line 290.
(gdb) r
..............................
294 if(strncmp(requestHeaderURI,TASKSURI,strlen(requestHeaderURI)) == 0){//上传分片上报链接
(gdb) n
295 printf("上传分片上报链接");
(gdb) n
线程捕获到生产出来的产品,consumer thread tid=1086941504 get in bp=-1
298 if(strncmp(requestHeaderURI,SLICEURI,strlen(requestHeaderURI)) == 0){//上传各分片的链接
(gdb) p requestHeaderURI
$1 = 0xd7df240 "/task"
(gdb) p TASKSURI
上传分片上报链接线程捕获到生产出来的产品,consumer thread tid=1086941504 get in bp=-2
$2 = "/task"
如果去掉生成点o文件里的参数,只保留最后生成的可执行文件是不行的,实践证明,得在生成.o时就加上后,在后面合并时不加也成。(也就是说最后生成的.o里得有,否则,最后一步及时加上也是不行的。)
MakeFile:
multipepollserver:multipepollserver.o memorypool.o
/usr/bin/g++44 -Wall -g -o multipepollserver multipepollserver.o memorypool.o -lrt -lpthread -lmemcached
multipepollserver.o:multipepollserver.cpp memorypool.h
/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g multipepollserver.cpp -std=c++0x
memorypool.o:memorypool.cpp memorypool.h
/usr/bin/g++44 -Wall -g3 -gdwarf-2 -c -g memorypool.cpp
clean:
rm -f multipepollserver memorypool.o multipepollserver.o
实践证明,加这一句上,下面生成点O不加也是不行的:
/usr/bin/g++44 -Wall -g -o multipepollserver multipepollserver.o memorypool.o -lrt -lpthread -lmemcached
————————————————————————————————————————————————————————————————————————
其他参考:
来自:http://www.sudu.cn/info/index.php?op=article&id=260892
来自:http://blog.csdn.net/littlefang/article/details/6293448
来自:http://blog.sina.com.cn/s/blog_6cee149d0100ohvl.html
背景:我喜欢用QQ五笔输入法,媳妇喜欢用搜狗输入法,但往往打开一个默认的编辑器,会首先使用搜狗输入法,还听说有的卸载了还是会显示这个搜狗输入法,这个王小川同学的输入法确实好,不知道是怕恶意删除还是啥原因,居然把输入法里的设置常规里的搜狗输入法的删除给变灰了,我想删除都删除不了啊,一看网上也有类似的情况,一堆人都在骂。
————————————————————————————————————————————
win7系统,搜狗输入法7.2版本,
就三种输入法:美式键盘/微软拼音2010/搜狗,
我试过把默认输入法设成微软拼音2010,不行,确认之后自动变成搜狗,
把默认设成美式键盘,默认第二设成微软拼音2010,不行,确认之后默认第二变成搜狗,
如何设置才能限制搜狗这种霸道行为?
搜狗输入法设置中自带了个输入法设置工具可以调整输入法先后顺序:
最开始,调出这栏,点击上面的设置,然后选择设置属性
(因为电脑系统和设置各有不同,这里就不说怎么调出这个了)
弹出这个界面,点击左边的输入法管理器
会弹出这个界面,然后在你想设置的默认输入法旁边点击设为默认
你会发现原来你电脑右下角输入法排序发生了变化
现在默认输入法已经变成你想设置的输入法了
输入法管理器帮管理了输入法顺序,这个让微软情何以堪呢?呵呵。
经上面实践,我重新打开Editplus后,发现我的QQ五笔输入法是默认了,达到目的。
摘自:http://jingyan.baidu.com/article/47a29f24507471c01423991d.html
右键搜狗拼音输入法图标,选设置,然后选中搜狗后点属性,在打开的搜狗拼音输入法设置中,选输入法管理器,选中中文简体-美式键盘,将其设置为默认输入法就可以了。
————————————————————————————————————————————
win7系统,搜狗输入法7.2版本,
就三种输入法:美式键盘/微软拼音2010/搜狗,
我试过把默认输入法设成微软拼音2010,不行,确认之后自动变成搜狗,
把默认设成美式键盘,默认第二设成微软拼音2010,不行,确认之后默认第二变成搜狗,
如何设置才能限制搜狗这种霸道行为?
搜狗输入法设置中自带了个输入法设置工具可以调整输入法先后顺序:
最开始,调出这栏,点击上面的设置,然后选择设置属性
(因为电脑系统和设置各有不同,这里就不说怎么调出这个了)
弹出这个界面,点击左边的输入法管理器
会弹出这个界面,然后在你想设置的默认输入法旁边点击设为默认
你会发现原来你电脑右下角输入法排序发生了变化
现在默认输入法已经变成你想设置的输入法了
输入法管理器帮管理了输入法顺序,这个让微软情何以堪呢?呵呵。
经上面实践,我重新打开Editplus后,发现我的QQ五笔输入法是默认了,达到目的。
摘自:http://jingyan.baidu.com/article/47a29f24507471c01423991d.html
右键搜狗拼音输入法图标,选设置,然后选中搜狗后点属性,在打开的搜狗拼音输入法设置中,选输入法管理器,选中中文简体-美式键盘,将其设置为默认输入法就可以了。
背景:装了个桌面版本的微信,台式机是win7版,只要点微信(RTX的链接也一样)里的链接会不在浏览器上打开,用了word打开。点里面的链接是用word打开的...
在word中打开的那些链接都是*.php类型的,而在windows的文件类型或协议与程序关联”中,并没有对*.php做出关联,所以就变成了由word打开了*.php文件。那么解决的办法就是--打开控制面板,选择“默认程序”,然后选择“设置默认程序”,接着在打开的列表中选择自己使用的浏览器类型,将它设置为“将此程序设置为默认值”,即”使用所选程序打开在默认情况下能打开的所有文件类型和协议“,问题解决~
实践如下:
控制面板\程序\默认程序\设置默认程序 选中chrome浏览器,设置为默认打不开的文件,即是说所有打不开的文件类型邮chrome来打开,后再点一下桌面的微信聊天对方发出来的链接Url,就是很自然的由chrome打开了,相当方便~
图形参考:http://jingyan.baidu.com/article/1709ad80ae52fb4634c4f08b.html
上述文字摘自:http://wenku.baidu.com/link?url=d8ltSiLtUAKr15pKbMzovglYaQUupDlyOwUM6JMBJqM8hspmPkCwFlBKVKpjUPje2ShbQ6Hw2BM9bgc4Yy7KZYIlLQkBIqrqEUGrusN9iWW
阅读全文
在word中打开的那些链接都是*.php类型的,而在windows的文件类型或协议与程序关联”中,并没有对*.php做出关联,所以就变成了由word打开了*.php文件。那么解决的办法就是--打开控制面板,选择“默认程序”,然后选择“设置默认程序”,接着在打开的列表中选择自己使用的浏览器类型,将它设置为“将此程序设置为默认值”,即”使用所选程序打开在默认情况下能打开的所有文件类型和协议“,问题解决~
实践如下:
控制面板\程序\默认程序\设置默认程序 选中chrome浏览器,设置为默认打不开的文件,即是说所有打不开的文件类型邮chrome来打开,后再点一下桌面的微信聊天对方发出来的链接Url,就是很自然的由chrome打开了,相当方便~
图形参考:http://jingyan.baidu.com/article/1709ad80ae52fb4634c4f08b.html
上述文字摘自:http://wenku.baidu.com/link?url=d8ltSiLtUAKr15pKbMzovglYaQUupDlyOwUM6JMBJqM8hspmPkCwFlBKVKpjUPje2ShbQ6Hw2BM9bgc4Yy7KZYIlLQkBIqrqEUGrusN9iWW
阅读全文
详解jquery插件中(function ( $, window, document, undefined )的作用:为什么要将window和undefined作为参数传给它?
Php/Js/Shell/Go jack 2015-3-17 10:27
背景:在一个项目中,有一个兄弟用init jquery时,用了这种写法,而不是$().ready( ,参考:http://jackxiang.com/post/1983/ ,于是了解了一下~
学习一:
提问,
(function(window,undefined){})(window);
这个,为什么要将window和undefined作为参数传给它?
回答:
因为 javascript 执行JS代码是从里到外,因此把全局变量传进来,就避免了到外层去寻找。提高效率
提问Q:
不明白为什么JS 的undefined还可以做变量名。 undefined算是JS里面的什么呢?不是关键字,不是保留字,true跟false还有null也不是,不过跟undefined不同,不能用作变量名。
这些到底算是什么呢?
回答A:
可以避免 undefined 被别人定义了。
var undefined=8;
(function(window){
alert(window.undefined); //8
alert(undefined); //8
})(window);
与
var undefined=8;
(function(window,undefined){
alert(window.undefined); //8
alert(undefined); //此处undefined参数为局部的名称为undefined变量,值为undefined
})(window);
所以后者,就算外面的人把 ,undefined 定义了,里面的 undefined 依然不受影响。
大概是为了最大程度防止外界的变量定义对 所做封装的内部影响吧。
学习二,更和jquery结合更紧密:
详解jquery插件中(function ( $, window, document, undefined )的作用:
在jquery插件中我们经常看到以下这段代码
;(function ( $, window, document, undefined ){
//函数体内具体代码
})(jQuery, window,document);
对于很多初学者来说很难明白这表示什么,下边我将为大家介绍其相应的作用。
1、代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后的语法错误。
2、匿名函数(function(){})();:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。避免函数体内和外部的变量冲突。
3、$实参:$是jquery的简写,很多方法和类库也使用$,这里$接受jQuery对象,也是为了避免$变量冲突,保证插件可以正常运行。
4、window, document实参分别接受window, document对象,window, document对象都是全局环境下的,而在函数体内的window, document其实是局部变量,不是全局的window, document对象。这样做有个好处就是可以提高性能,减少作用域链的查询时间,如果你在函数体内需要多次调用window 或 document对象,这样把window 或 document对象当作参数传进去,这样做是非常有必要的。当然如果你的插件用不到这两个对象,那么就不用传递这两个参数了。
5、最后剩下一个undefined形参了,那么这个形参是干什么用的呢,看起来是有点多余。undefined在老一辈的浏览器是不被支持的,直接使用会报错,js框架要考虑到兼容性,因此增加一个形参undefined
http://www.bcty365.com/content-47-805-1.html
————————————————————为何有这一问(代码来自)————————————————————
代码来自:
http://jackxiang.com/post/7864/
更多疑问参考解答Url:http://zhidao.baidu.com/link?url=P4soG5CQSsXaZUo5DBfUX9uoFl9Mkbncf_dFs7CdC3XwdVdy7rSjWCAyTy4VWIMtIAkRzpV87TJh6uHxlvYPyq
学习一:
提问,
(function(window,undefined){})(window);
这个,为什么要将window和undefined作为参数传给它?
回答:
因为 javascript 执行JS代码是从里到外,因此把全局变量传进来,就避免了到外层去寻找。提高效率
提问Q:
不明白为什么JS 的undefined还可以做变量名。 undefined算是JS里面的什么呢?不是关键字,不是保留字,true跟false还有null也不是,不过跟undefined不同,不能用作变量名。
这些到底算是什么呢?
回答A:
可以避免 undefined 被别人定义了。
var undefined=8;
(function(window){
alert(window.undefined); //8
alert(undefined); //8
})(window);
与
var undefined=8;
(function(window,undefined){
alert(window.undefined); //8
alert(undefined); //此处undefined参数为局部的名称为undefined变量,值为undefined
})(window);
所以后者,就算外面的人把 ,undefined 定义了,里面的 undefined 依然不受影响。
大概是为了最大程度防止外界的变量定义对 所做封装的内部影响吧。
学习二,更和jquery结合更紧密:
详解jquery插件中(function ( $, window, document, undefined )的作用:
在jquery插件中我们经常看到以下这段代码
;(function ( $, window, document, undefined ){
//函数体内具体代码
})(jQuery, window,document);
对于很多初学者来说很难明白这表示什么,下边我将为大家介绍其相应的作用。
1、代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后的语法错误。
2、匿名函数(function(){})();:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。避免函数体内和外部的变量冲突。
3、$实参:$是jquery的简写,很多方法和类库也使用$,这里$接受jQuery对象,也是为了避免$变量冲突,保证插件可以正常运行。
4、window, document实参分别接受window, document对象,window, document对象都是全局环境下的,而在函数体内的window, document其实是局部变量,不是全局的window, document对象。这样做有个好处就是可以提高性能,减少作用域链的查询时间,如果你在函数体内需要多次调用window 或 document对象,这样把window 或 document对象当作参数传进去,这样做是非常有必要的。当然如果你的插件用不到这两个对象,那么就不用传递这两个参数了。
5、最后剩下一个undefined形参了,那么这个形参是干什么用的呢,看起来是有点多余。undefined在老一辈的浏览器是不被支持的,直接使用会报错,js框架要考虑到兼容性,因此增加一个形参undefined
http://www.bcty365.com/content-47-805-1.html
————————————————————为何有这一问(代码来自)————————————————————
代码来自:
http://jackxiang.com/post/7864/
更多疑问参考解答Url:http://zhidao.baidu.com/link?url=P4soG5CQSsXaZUo5DBfUX9uoFl9Mkbncf_dFs7CdC3XwdVdy7rSjWCAyTy4VWIMtIAkRzpV87TJh6uHxlvYPyq
背景:centos一兄弟把那个/etc/sudoer给权限变更了,于是否,出现sudo su -因为权限进入不了root,sudo su - sudo: /etc/sudoers is mode 0640, should be 0440 ,于是否,查了一下网络,有下面两种解决办法,特别是我自己有一个方法,那就是我有一个c文件是有root的权限,它能以root的权限让php去执行这个popen的类windows的cmd命令,于是在没有root密码的情况下也能修改这个文件,解决了问题。
ubuntu或者CentOS中,/etc/sudoer 的权限为 0440时才能正常使用,否则sudo命令就不能正常使用。出现类似:sudo: /etc/sudoers is mode 0640, should be 0440 的对话。
解决办法:
1、Ctrl+Alt+F1 进入文本模式。用超级用户登录,如root
2、输入:chmod 0440 /etc/sudoers 。Enter
3、exit 退出
4、Ctrl+Alt+F7 返回图形模式。
5、在试试sudo命令,可以用了
P:其实另开一个端口,su -进入root,然后chmod 0440 /etc/sudoers
效果是一样的
example:
[BIngo@windows ~]$ sudo chmod u+w /etc/sudoers
口令:
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
[BIngo@windows ~]$ sudo chmod u-w /etc/sudoers
sudo: /etc/sudoers is mode 0640, should be 0440
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
另开端口
[root@windows ~]# chmod 0440 /etc/sudoers
[root@windows ~]# exit
[BIngo@windows ~]$ ls -l /etc/sudoers
-r--r----- 1 root root 3210 11-16 02:40 /etc/sudoers
方法二(不是每台机器都有我这样的二进制,我是为了显示svn的版本号才临时用php调这个c,再用php调shell下的svn命令获取项目代码位置里的svn的版本号):
-rwsrwxrwx 1 root root 11711 Oct 9 17:29 resetServerAndOptSVN //有root权限,它会调一个php文件,这个php的shell也有root权限,于是我只对php作了修改即可:
vi resetServerAndOptSVN.php
./resetServerAndOptSVN disvnver jack
于是,Ok了,这块主要是利用这个c编译的文件有root权限,让它去修改了权限,于是解决了问题~
ubuntu或者CentOS中,/etc/sudoer 的权限为 0440时才能正常使用,否则sudo命令就不能正常使用。出现类似:sudo: /etc/sudoers is mode 0640, should be 0440 的对话。
解决办法:
1、Ctrl+Alt+F1 进入文本模式。用超级用户登录,如root
2、输入:chmod 0440 /etc/sudoers 。Enter
3、exit 退出
4、Ctrl+Alt+F7 返回图形模式。
5、在试试sudo命令,可以用了
P:其实另开一个端口,su -进入root,然后chmod 0440 /etc/sudoers
效果是一样的
example:
[BIngo@windows ~]$ sudo chmod u+w /etc/sudoers
口令:
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
[BIngo@windows ~]$ sudo chmod u-w /etc/sudoers
sudo: /etc/sudoers is mode 0640, should be 0440
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
另开端口
[root@windows ~]# chmod 0440 /etc/sudoers
[root@windows ~]# exit
[BIngo@windows ~]$ ls -l /etc/sudoers
-r--r----- 1 root root 3210 11-16 02:40 /etc/sudoers
方法二(不是每台机器都有我这样的二进制,我是为了显示svn的版本号才临时用php调这个c,再用php调shell下的svn命令获取项目代码位置里的svn的版本号):
-rwsrwxrwx 1 root root 11711 Oct 9 17:29 resetServerAndOptSVN //有root权限,它会调一个php文件,这个php的shell也有root权限,于是我只对php作了修改即可:
vi resetServerAndOptSVN.php
./resetServerAndOptSVN disvnver jack
于是,Ok了,这块主要是利用这个c编译的文件有root权限,让它去修改了权限,于是解决了问题~
[实践Ok]find exec 接合rm -Rf 删除文件和拷备文件的小应用脚本。
Unix/LinuxC技术 jack 2015-3-13 14:11
将目录中的文件查找出来并全部拷备文件到指定目录:
find . -type f -exec cp -rf {} /tmp/pdf \;
背景:删除一些vim的临时文件及批量文件修改时间,有用xargs的也有用exec......但是这个命令的后面这一部分得小心点写,有一个空格。
第一:花括号}后面必须得有空格.
第二:最后斜杠后面必须得有分号。
第三:exec前面有一个中横线,否则也不行,三者必须要注意。
如:
#!/bin/bash
Redisdb_file=/data/redis/6403/redis.rdb
Redisbak_dir=/data/bak/redis/6403
Bak_time=`date +%Y%m%d%H%M`
mkdir -p $Redisbak_dir
/bin/cp -rf $Redisdb_file $Redisbak_dir/redis.rdb.$Bak_time
find $Redisbak_dir -name "redis.db.201*" -mtime +30 -exec rm -rf {} \;
+ /bin/cp -rf /data/redis/6403/redis.rdb /data/bak/redis/6403/redis.rdb.201610262250
+ find /data/bak/redis/6403 -name 'redis.db.201*' -mtime +30 -exec rm -rf '{}' ';'
-----------------------------------------------------------------------------------------------------------------------------------
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep "messagebox-bottom" {} \;
<div class="messagebox-bottom">
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep -lr -A3 "您目前的用户组是" {} \;
./lang/zh-cn/common.php
======================这儿不得不说xargs和-exec的区别=================================
1)-exec里的{} 相当于一个变量,于是grep时是每次针对单个文件的,所以没有文件名显示。
2)而xagrs是管道,则grep认为是一堆文件进行grep,于是默认就有文件名。
-exec就像这样指定了文件名,当然没有文件名存在了,在使用时根据实际情况进行使用:
=======================================================================================
下面这两种情况都是没法执行得到的,如下:
[root@localhost test]# find . -ctime -1 -exec ls -l {} \ ;
find: missing argument to `-exec'
[root@localhost test]# find . -ctime -1 -exec ls -l {} \
>
所以,必须得要注意,而用xargs来做这个就不用那么多事了:
find . -mtime +30 | xargs rm -f
每天运行一次,清理半月外的文件,予以删除:
==================================
[root@localhost ~]# find /tmp -type f
/tmp/.X0-lock
/tmp/test.pcap
[root@localhost ~]# find /tmp -type f|xargs echo
/tmp/.X0-lock /tmp/test.pcap
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
[root@localhost ~]# find /tmp -type f -exec ls -l {} ;
find: missing argument to `-exec'
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
阅读全文
find . -type f -exec cp -rf {} /tmp/pdf \;
背景:删除一些vim的临时文件及批量文件修改时间,有用xargs的也有用exec......但是这个命令的后面这一部分得小心点写,有一个空格。
第一:花括号}后面必须得有空格.
第二:最后斜杠后面必须得有分号。
第三:exec前面有一个中横线,否则也不行,三者必须要注意。
如:
#!/bin/bash
Redisdb_file=/data/redis/6403/redis.rdb
Redisbak_dir=/data/bak/redis/6403
Bak_time=`date +%Y%m%d%H%M`
mkdir -p $Redisbak_dir
/bin/cp -rf $Redisdb_file $Redisbak_dir/redis.rdb.$Bak_time
find $Redisbak_dir -name "redis.db.201*" -mtime +30 -exec rm -rf {} \;
+ /bin/cp -rf /data/redis/6403/redis.rdb /data/bak/redis/6403/redis.rdb.201610262250
+ find /data/bak/redis/6403 -name 'redis.db.201*' -mtime +30 -exec rm -rf '{}' ';'
-----------------------------------------------------------------------------------------------------------------------------------
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep "messagebox-bottom" {} \;
<div class="messagebox-bottom">
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep -lr -A3 "您目前的用户组是" {} \;
./lang/zh-cn/common.php
======================这儿不得不说xargs和-exec的区别=================================
1)-exec里的{} 相当于一个变量,于是grep时是每次针对单个文件的,所以没有文件名显示。
2)而xagrs是管道,则grep认为是一堆文件进行grep,于是默认就有文件名。
-exec就像这样指定了文件名,当然没有文件名存在了,在使用时根据实际情况进行使用:
=======================================================================================
下面这两种情况都是没法执行得到的,如下:
[root@localhost test]# find . -ctime -1 -exec ls -l {} \ ;
find: missing argument to `-exec'
[root@localhost test]# find . -ctime -1 -exec ls -l {} \
>
所以,必须得要注意,而用xargs来做这个就不用那么多事了:
find . -mtime +30 | xargs rm -f
每天运行一次,清理半月外的文件,予以删除:
==================================
[root@localhost ~]# find /tmp -type f
/tmp/.X0-lock
/tmp/test.pcap
[root@localhost ~]# find /tmp -type f|xargs echo
/tmp/.X0-lock /tmp/test.pcap
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
[root@localhost ~]# find /tmp -type f -exec ls -l {} ;
find: missing argument to `-exec'
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
阅读全文
C语言如何比较两个【字符】或者【字符串】是否相等?strcmp
Unix/LinuxC技术 jack 2015-3-12 16:02
Q:
C语言如何比较两个【字符】或者【字符串】是否相等?
A:
比较字符可以直接使用==比较操作符,如:
char c1='a',c2='b';
if(c1==c2) printf("%c is same as %c.",c1,c2);
else printf("%c is different to %c",c1,c2);
若是字符串,则需要使用字符串函数了,strcmp
char s1[]="abc",s2[]="xyz";
if(strcmp(s1,s2)==0) printf("%s is same as %s.",s1,s2);
也可以忽略大小写来比较,使用函数stricmp 中间的i意思是ignore case sensitive
还可以指定长度比较,strncmp,如:
char s1[]="abc",s2[]="abcdefg";
if(strncmp(s1,s2,3)==0) printf("first 3 characters are same");
若不是从开头位置开始比较,如:
char s1[]="abc",s2[]="xyzabc"
if(strncmp(s1,&s2[3],3)==0) 就是比较s1和s2的第3个字符开始的内容
Egg:
#include <string.h>
char s1[10],s2[10];
...
if(strcmp(s1,s2)==0)
printf("两字符串相等\n");
string.h 头文件中就有比较函数,可以用来比较是否相等
来自:http://zhidao.baidu.com/link?url=9gRfWtoqGKzO_Y-aSb5H56QDSkKTblfzFYBoWrggRtxNaXSF3YI1MSo_gnsYvsoVdL_bN4AqEULfDLKMLvZtoq
C语言如何比较两个【字符】或者【字符串】是否相等?
A:
比较字符可以直接使用==比较操作符,如:
char c1='a',c2='b';
if(c1==c2) printf("%c is same as %c.",c1,c2);
else printf("%c is different to %c",c1,c2);
若是字符串,则需要使用字符串函数了,strcmp
char s1[]="abc",s2[]="xyz";
if(strcmp(s1,s2)==0) printf("%s is same as %s.",s1,s2);
也可以忽略大小写来比较,使用函数stricmp 中间的i意思是ignore case sensitive
还可以指定长度比较,strncmp,如:
char s1[]="abc",s2[]="abcdefg";
if(strncmp(s1,s2,3)==0) printf("first 3 characters are same");
若不是从开头位置开始比较,如:
char s1[]="abc",s2[]="xyzabc"
if(strncmp(s1,&s2[3],3)==0) 就是比较s1和s2的第3个字符开始的内容
Egg:
#include <string.h>
char s1[10],s2[10];
...
if(strcmp(s1,s2)==0)
printf("两字符串相等\n");
string.h 头文件中就有比较函数,可以用来比较是否相等
来自:http://zhidao.baidu.com/link?url=9gRfWtoqGKzO_Y-aSb5H56QDSkKTblfzFYBoWrggRtxNaXSF3YI1MSo_gnsYvsoVdL_bN4AqEULfDLKMLvZtoq
[实践OK]Linux 命令行下嗅探 HTTP 流量的工具:httpry
Unix/LinuxC技术 jack 2015-3-10 17:50
背景:对http 80端口的监控是必须的,无论是开发时接口间调用,还是在线上弱水三千只取一瓢,对接口的侦测,我国的网侦部门对我们的行为控制,从来没有停止过,这儿请的不是tcpdump,而是有一个抓取http流量的类似tcpdump的数据包嗅探工具,httpry捕获HTTP数据包,并且将HTTP协议层的数据内容以可读形式列举出来。当前linux两个系统比较常用一个是centos一个是debian,这里都有,请看下面讲述即可。
Fedora、centos、RHEL系统需要安装EPEL源
$ sudo yum install httpry
也可以源码编译
$ sudo yum install gcc make git libpcap-devel
$ git clone https://github.com/jbittel/httpry.git
$ cd httpry
$ make
$ sudo make install
下载软件包:
yum install httpry
http://mirrors.neusoft.edu.cn/epel/6/x86_64/httpry-0.1.8-1.el6.x86_64.rpm: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 503 Service Temporarily Unavailable"
尝试其他镜像。
httpry-0.1.8-1.el6.x86_64.rpm | 35 kB 00:00
运行 rpm_check_debug
执行事务测试
已安装:
httpry.x86_64 0:0.1.8-1.el6
完毕!
阅读全文
Fedora、centos、RHEL系统需要安装EPEL源
$ sudo yum install httpry
也可以源码编译
$ sudo yum install gcc make git libpcap-devel
$ git clone https://github.com/jbittel/httpry.git
$ cd httpry
$ make
$ sudo make install
下载软件包:
yum install httpry
http://mirrors.neusoft.edu.cn/epel/6/x86_64/httpry-0.1.8-1.el6.x86_64.rpm: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 503 Service Temporarily Unavailable"
尝试其他镜像。
httpry-0.1.8-1.el6.x86_64.rpm | 35 kB 00:00
运行 rpm_check_debug
执行事务测试
已安装:
httpry.x86_64 0:0.1.8-1.el6
完毕!
阅读全文
[实践OK]通过命令行能不能打印易读的Json数据怎么办?接合windows使用curl命令输出json并格式化的方法。及升级CentOS下的python到3.3版本的步骤,升级后yum except KeyboardInterrupt, e: 错误。
Unix/LinuxC技术 jack 2015-3-9 17:31
背景:我很喜欢在命令行调试API,返回数据都是JSON格式的。打印出来的内容太痛苦了,如:{"status":200,"data":[{"id":1000,"name":"John"}{"id":1004,"name":"Tom"}]},有木有工具打印个易读的样式,这样的
实践一:
答:可以使用python的json.tool!
cat json|python -mjson.tool
cat json|python -mjson.tool
python: module json.tool not found
json是python3内置模块,在包libpython3.3-stdlib中提供。
centOS的默认的python版本是V2.4.3,但运行json库也好需要的版本是3以上,linux(CentOS)下升级python3.3:
http://lovebeyond.iteye.com/blog/1770476 ,后面升级后就Ok了,自带这个包,相当靠谱~ AddTime:2015-03-09
echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
Vim中格式化json数据:
命令模式下
#!python -m json.tool
可以映射快捷键,如Ctrl+F6,编辑vimrc:
“ Format JSON data using python module json.tool
map <C-F6> :#!python -m json.tool<CR>
vim调用python格式化json数据:
实践二,根据1接合windows使用curl命令输出json并格式化的方法:
windows中使用curl命令需要下载curl工具
下载地址:http://curl.haxx.se/download.html
请选择不带SSL的版本,否则还需要安装SSL的支持包
我下载的版本 http://www.paehl.com/open_source/?CURL_7.28.1
下载后解压,将exe文件拷贝到 C:\windows\system32目录下即可在cmd中直接调用
我使用linux下成功的相同命令去发现报错如下:
网上查发现是引号的原因,
例如linux下成功命令格式如下:
来自:http://blog.csdn.net/lipei1220/article/details/8536520
http://blog.longwin.com.tw/2012/12/cli-python-json-formatter-2012/
http://blog.csdn.net/yuechuzhao/article/details/24460781
http://openwares.net/linux/vim_call_python_format_json.html
————————————————————linux(CentOS)下升级python3.3———————————————————————————
CentOS下的Python版本一般都比较低,很多应用都需要升级python来完成。我装的centOS的默认的python版本是V2.4.3,但运行node.js需要的版本是2.5以上。
1。下载python3.3安装包:wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz
2。解压安装包:tar -zxvf Python-3.3.0.tgz
3。进入解压后目录:cd Python-3.3.0
4。创建安装目录:mkdir /usr/local/python3.3
5。编译安装:./configure --prefix=/usr/local/python3.3
6。执行:make && make install
7。此时已完成新版本的安装,但由于老版本还在系统中,所以需要将原来/usr/bin/python链接改为新的连接:a.先修改老的连接,执行:mv /usr/bin/python /usr/bin/python_bak。b.再建立新连接: ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python
8。查询python版本,执行:python
显示如下:
Python 3.3.0 (default, Jan 16 2013, 17:52:44)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
已安装成功了。恭喜你。
实际情况,一堆老版本,还得都给挪动一下,否则还是2.7啥的:
/usr/bin/python2.4
mv /usr/bin/python2.4 /usr/bin/python2.4_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python2.4
/usr/local/bin/python2.7
mv /usr/local/bin/python2.7 /usr/local/bin/python2.7_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/local/bin/python2.7
实践来源:http://lovebeyond.iteye.com/blog/1770476
最后,json显示结构化Ok了:
[root@test Python-3.3.0]# echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
{
"data": [
{
"id": 1000,
"name": "John"
},
{
"id": 1004,
"name": "Tom"
}
],
"status": 200
}
再结合Curl这个命令行显示一把,实践如下:
cat json.php
shell访问,直接访问json是一行,后面直接加上python的解析后变成了一个格式化的json串显示出来了,达到了目的,如下:
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php"
{ "status":200, "data": [ { "id":1000, "name":"John" }, { "id":1004, "name":"Tom" } ] } [root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php" vi json.php
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php" | python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 106 0 106 0 0 51381 0 --:--:-- --:--:-- --:--:-- 0
{
"data": [
{
"id": 1000,
"name": "John"
},
{
"id": 1004,
"name": "Tom"
}
],
"status": 200
}
最后,当python升级到3后,yum出现:except KeyboardInterrupt, e:
问题:
——————————————————————————————————
[root@name user]# yum
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
原因:
这是因为yum采用python作为命令解释器,这可以从/usr/bin/yum文件中第一行#!/usr/bin/python发现。而python版本之间兼容性不太好,使得2.X版本与3.0版本之间存在语法不一致问题。而CentOS 5自带的yum采用的是python2.4,当系统将python升级到2.6或3.0后,出现语法解释错误。
解决办法:
很简单,一是升级yum,一是修改yum的解释器为旧版本python2.4(如果你没有采用覆盖升级的话)
升级yum的作法就不详述了;
修改yum的解释器为旧版本python2.4:
vi /usr/bin/yum
将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2.4"即可,我自己是修改:
/usr/bin/python2.4_bak //前面挪动到这儿了,实践是OK的~
摘自:http://blog.sina.com.cn/s/blog_67d6a2650100jiaw.html
实践一:
答:可以使用python的json.tool!
cat json|python -mjson.tool
cat json|python -mjson.tool
python: module json.tool not found
json是python3内置模块,在包libpython3.3-stdlib中提供。
centOS的默认的python版本是V2.4.3,但运行json库也好需要的版本是3以上,linux(CentOS)下升级python3.3:
http://lovebeyond.iteye.com/blog/1770476 ,后面升级后就Ok了,自带这个包,相当靠谱~ AddTime:2015-03-09
echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
Vim中格式化json数据:
命令模式下
#!python -m json.tool
可以映射快捷键,如Ctrl+F6,编辑vimrc:
“ Format JSON data using python module json.tool
map <C-F6> :#!python -m json.tool<CR>
vim调用python格式化json数据:
实践二,根据1接合windows使用curl命令输出json并格式化的方法:
windows中使用curl命令需要下载curl工具
下载地址:http://curl.haxx.se/download.html
请选择不带SSL的版本,否则还需要安装SSL的支持包
我下载的版本 http://www.paehl.com/open_source/?CURL_7.28.1
下载后解压,将exe文件拷贝到 C:\windows\system32目录下即可在cmd中直接调用
我使用linux下成功的相同命令去发现报错如下:
网上查发现是引号的原因,
例如linux下成功命令格式如下:
来自:http://blog.csdn.net/lipei1220/article/details/8536520
http://blog.longwin.com.tw/2012/12/cli-python-json-formatter-2012/
http://blog.csdn.net/yuechuzhao/article/details/24460781
http://openwares.net/linux/vim_call_python_format_json.html
————————————————————linux(CentOS)下升级python3.3———————————————————————————
CentOS下的Python版本一般都比较低,很多应用都需要升级python来完成。我装的centOS的默认的python版本是V2.4.3,但运行node.js需要的版本是2.5以上。
1。下载python3.3安装包:wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz
2。解压安装包:tar -zxvf Python-3.3.0.tgz
3。进入解压后目录:cd Python-3.3.0
4。创建安装目录:mkdir /usr/local/python3.3
5。编译安装:./configure --prefix=/usr/local/python3.3
6。执行:make && make install
7。此时已完成新版本的安装,但由于老版本还在系统中,所以需要将原来/usr/bin/python链接改为新的连接:a.先修改老的连接,执行:mv /usr/bin/python /usr/bin/python_bak。b.再建立新连接: ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python
8。查询python版本,执行:python
显示如下:
Python 3.3.0 (default, Jan 16 2013, 17:52:44)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
已安装成功了。恭喜你。
实际情况,一堆老版本,还得都给挪动一下,否则还是2.7啥的:
/usr/bin/python2.4
mv /usr/bin/python2.4 /usr/bin/python2.4_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python2.4
/usr/local/bin/python2.7
mv /usr/local/bin/python2.7 /usr/local/bin/python2.7_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/local/bin/python2.7
实践来源:http://lovebeyond.iteye.com/blog/1770476
最后,json显示结构化Ok了:
[root@test Python-3.3.0]# echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
{
"data": [
{
"id": 1000,
"name": "John"
},
{
"id": 1004,
"name": "Tom"
}
],
"status": 200
}
再结合Curl这个命令行显示一把,实践如下:
cat json.php
shell访问,直接访问json是一行,后面直接加上python的解析后变成了一个格式化的json串显示出来了,达到了目的,如下:
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php"
{ "status":200, "data": [ { "id":1000, "name":"John" }, { "id":1004, "name":"Tom" } ] } [root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php" vi json.php
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php" | python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 106 0 106 0 0 51381 0 --:--:-- --:--:-- --:--:-- 0
{
"data": [
{
"id": 1000,
"name": "John"
},
{
"id": 1004,
"name": "Tom"
}
],
"status": 200
}
最后,当python升级到3后,yum出现:except KeyboardInterrupt, e:
问题:
——————————————————————————————————
[root@name user]# yum
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
原因:
这是因为yum采用python作为命令解释器,这可以从/usr/bin/yum文件中第一行#!/usr/bin/python发现。而python版本之间兼容性不太好,使得2.X版本与3.0版本之间存在语法不一致问题。而CentOS 5自带的yum采用的是python2.4,当系统将python升级到2.6或3.0后,出现语法解释错误。
解决办法:
很简单,一是升级yum,一是修改yum的解释器为旧版本python2.4(如果你没有采用覆盖升级的话)
升级yum的作法就不详述了;
修改yum的解释器为旧版本python2.4:
vi /usr/bin/yum
将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2.4"即可,我自己是修改:
/usr/bin/python2.4_bak //前面挪动到这儿了,实践是OK的~
摘自:http://blog.sina.com.cn/s/blog_67d6a2650100jiaw.html
[实践OK]C语言函数sscanf()的用法
Unix/LinuxC技术 jack 2015-3-9 17:05
背景:做日志分析,linux C 的开发环境,在对每行日志进行处理的时候,手下一个小伙用的是逐字节拆分成字段(也就是指针)。刚开始没注意,后来每天10几G的日志上来后,发现除了速度特别慢以外,还经常出问题,遇到错误格式的日志就直接崩溃。。。从文件读取数据是一件很麻烦的事,所幸有sscanf()函数,对网络输入数据也就是从一个字符串中读进与指定格式相符的数据并进行分组也是可行的。
在做一道九度上机题时,突然发现sscanf()函数非常有用,就顺便从网上搜集资料整理一下。
sscanf() 的作用:从一个字符串中读进与指定格式相符的数据.
原型: int sscanf (const char *str,const char * format,........);
说明: sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。转换后的结果存于对应的参数内。
成功则返回参数数目,失败则返回0。
注意:sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。
这里就举几个经常用到的例子来说明他的用法,便于大家深刻理解他的用法.
[root@test sscanf]# gcc sscanf.c
[root@test sscanf]# ./a.out
用法一
str = 1234
用法二
time = 2013-2-13 14:55:34
用法三
str = 12345
用法四
str = acc
用法五
str = 12345
用法六
str = 12345+
同进,我想把http请求里的get的串取出来,怎么办?
编译运行调试:
[root@test sscanf]# gcc sscanf.c
[root@test sscanf]# ./a.out
用法七
str = task
来自:http://blog.csdn.net/sjf0115/article/details/8579935
在做一道九度上机题时,突然发现sscanf()函数非常有用,就顺便从网上搜集资料整理一下。
sscanf() 的作用:从一个字符串中读进与指定格式相符的数据.
原型: int sscanf (const char *str,const char * format,........);
说明: sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。转换后的结果存于对应的参数内。
成功则返回参数数目,失败则返回0。
注意:sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。
这里就举几个经常用到的例子来说明他的用法,便于大家深刻理解他的用法.
[root@test sscanf]# gcc sscanf.c
[root@test sscanf]# ./a.out
用法一
str = 1234
用法二
time = 2013-2-13 14:55:34
用法三
str = 12345
用法四
str = acc
用法五
str = 12345
用法六
str = 12345+
同进,我想把http请求里的get的串取出来,怎么办?
编译运行调试:
[root@test sscanf]# gcc sscanf.c
[root@test sscanf]# ./a.out
用法七
str = task
来自:http://blog.csdn.net/sjf0115/article/details/8579935
为什么我希望用C而不是C++来实现ZeroMQ
Unix/LinuxC技术 jack 2015-3-9 13:49
开始前我要先做个澄清:这篇文章同Linus Torvalds这种死忠C程序员吐槽C++的观点是不同的。在我的整个职业生涯里我都在使用C++,而且现在C++依然是我做大多数项目时的首选编程语言。自然的,当我从2007年开始做ZeroMQ(ZeroMQ项目主页)时,我选择用C++来实现。主要的原因有以下几点:
1. 包含数据结构和算法的库(STL)已经成为这个语言的一部分了。如果用C,我将要么依赖第三方库要么不得不自己手动写一些自1970年来就早已存在的基础算法。
2. C++语言本身在编码风格的一致性上起到了一些强制作用。比如,有了隐式的this指针参数,这就不允许通过各种不同的方式将指向对象的指针做转换,而那种做法在C项目中常常见到(通过各种类型转换)。同样的还有可以显式的将成员变量定义为私有的,以及许多其他的语言特性。
3. 这个观点基本上是前一个的子集,但值得我在这里显式的指出:用C语言实现虚函数机制比较复杂,而且对于每个类来说会有些许的不同,这使得对代码的理解和维护都会成为痛苦之源。
4. 最后一点是:人人都喜欢析构函数,它能在变量离开其作用域时自动得到调用。
阅读全文
1. 包含数据结构和算法的库(STL)已经成为这个语言的一部分了。如果用C,我将要么依赖第三方库要么不得不自己手动写一些自1970年来就早已存在的基础算法。
2. C++语言本身在编码风格的一致性上起到了一些强制作用。比如,有了隐式的this指针参数,这就不允许通过各种不同的方式将指向对象的指针做转换,而那种做法在C项目中常常见到(通过各种类型转换)。同样的还有可以显式的将成员变量定义为私有的,以及许多其他的语言特性。
3. 这个观点基本上是前一个的子集,但值得我在这里显式的指出:用C语言实现虚函数机制比较复杂,而且对于每个类来说会有些许的不同,这使得对代码的理解和维护都会成为痛苦之源。
4. 最后一点是:人人都喜欢析构函数,它能在变量离开其作用域时自动得到调用。
阅读全文




