星期三, 十月 18, 2006

podcasting 展望

podcasting 展望
作者:飞扬轻狂 fallseir.lee (fallseir at gmail.com)
一、什么是podcasting
技术角度认为什么是podcasting
Podcast是为了用户更方便的获取数据,作者更容易的发布数据而产生的。
狭义的说 Podcast 简单的说就是blogger创作的音频列表。
更广一点的说 Podcast 就是经常被更新的专人维护的媒体数据列表(可以包含语音视频图片等格式的数据)。

上图是一幅描述广播、blog和podcast关系的草图
其实应该加上网站和读者,
下面来叙述一下他们的关系,
首先,
听众通过收音机来获取广播的内容
读者通过Feed阅读器来定于作者发布在FEED上的blog内容
podcasting的出现使得听众可以使用Podcast订阅器来订阅作者提供在支持podcast的网站上的音频数据了。
其次,
不论是广播的信息源还是blog之前网站的信息源都是少数人发布的,而由多数人来获取;
podcasting的出现使得人人都可以成为信息发布者。

可以设想,如果我们的任意款mp3可以连接电脑后就方便的获取和筛选我们需要的数据,而这些数据有是分门别类的排列好供我们挑选,如此网络该是多么享受的事情。
podcasting及应用其上的服务就可以为我们营造这个方便的未来,
1、作者将数据提交到网络
2、由扮演再发布者的角色进行筛选整合和归类
3、由网络中的读者和听众进行评论,归类和digg等大众参与的评估
4、最后听众和读者就可以得到他们想要的内容了
这一切都需要podcasting这样的通用格式来将数据流连接起来来保证更有效的发布,更实用的评估,更方便得获取。



下面是摘录的两篇关于podcasting的说明

Podcast,中文译名尚未统一,但最多的是将其翻译为“播客”。它是数字广播技术的一 种,出现初期借助一个叫“iPodder”的软件与一些便携播放器相结合而实现。Podcasting录制的是网络广播或类似的网络声讯节目,网友可将网 上的广播节目下载到自己的iPod、MP3播放器或其它便携式数码声讯播放器中随身收听,不必端坐电脑前,也不必实时收听,享受随时随地的自由。更有意义 的是,你还可以自己制作声音节目,并将其上传到网上与广大网友分享。
就像博客颠覆了被动接受文字信息的方式一样,播客颠覆了被动收听广播的方式,使听众成为主动参与者。有人说,播客可能会像博客(Blog)一样,带来大众传媒的又一场革命。

一.Podcast的推动者Doc Searls给出的定义:
PODcasting,Personal Optional Digital casting。PODcasting是自助广播,是全新的广播形式。收听传统广播时我们是被动收听我们可能想听的节目,而PODcasting则是我们 选择收听的内容、收听的时间以及以何种方式让其他人也有机会收听。 戴维·温纳(Dave Winer)的Morning Coffee Notes:人各有所专,所以理论上人人播客是可能的。

 二.Dave Shusher在其“Podcasting的定义”一文中的定义:

他提出Podcasting必须具备三个要件:

1.必须是一个独立的、可下载的媒体文件;

2.该文件的发布格式为RSS2.0 enclosure feed;

3.接收端能自动接收、下载并将文件转至需要的地方,放置于播放器的节目单中。

  他认为可下载MP3 不是波刻(Podcast)――这是充分但不是必要条件。“能下载固然不错,但能自动出现供你播放而无需你关照才是关键。这才是Podcasting。”

三.Wikipedia的定义:

像WIKI这样的定义是开放、动态的,到2004年12月13日为止,其定义为: Podcasting源于iPod,兼具broadcasting和webcasting 之意。Podcasting 与TiVo相似, 只是Podcasting是用于声讯节目而且目前免费。但是应该注意,该技术能把任何文件“拉”过来,包括软件更新、照片和视频。

摘自:什么是Podcast? http://tech.bokee.com/140/2005-04-14/364318.html
( 作者:郑雅钦 | 2005年04月14日 20:04 | 原始出处: 博客中国)


Podcast是以数字方式存储在网络上的音频广播。传统广播特点是直播的,有一定的时效性、一次性,播完就可能消失,而且只能是“你播啥我听啥”。Podcast就不同了,它更自由:播者自由,听者也自由。做为播客,你可以自己建立个Podcast网站自己做Podcast,播你喜欢的。做为听众,因为可以下载,那么你就可以存下来慢慢听,不喜欢听这段就换下一段,“想听啥就听啥,想啥时听就啥时听”。
摘自:iPodder初级教程 http://blog.terac.com/andy/e_206.html

php中的逻辑输出信息缓存处理

php中的逻辑输出信息缓存处理
tags: php, cache,out
-- fallseir.lee (fallseir at gmail.com) 20061018
doc in google http://docs.google.com/View?docid=dg4t629m_43f75qzq
/* ---- 事例代码 ---- */

/** 将输出缓存到内存 **/
$out_headers[]='<meta http-equiv="refresh" content="3;url='.$return_url.'">';
add_error_cache("您已经登陆,请退出后再进行登录操作!"); # 添加错误消息
add_cache_out("将在3秒后自动跳转到$return_url"); # 添加输出消息
add_cache_out("如果没有自动跳转请单击<a href=\"$return_url\">这里</a>!");
cache_clear() # 清除前边设置的缓存
$out_headers[]='<meta http-equiv="refresh" content="3;url='.$return_url.'">';
add_success_cache("退出成功!"); # 添加成功消息
add_cache_out("将在3秒后自动跳转到$return_url");
add_cache_out("如果没有自动跳转请单击<a href=\"$return_url\">这里</a>!");

/** 将缓存的内容输出 **/
out_cache(); # 输出内建样式的全部缓存信息
join("<br/>",get_error_cache()); # 输出指定的信息
join("<br/>",get_success_cache()); # 输出指定的信息
join("<br/>",get_out_cache()); # 输出指定的信息

/* ---- 页面缓存封装 ---- */
/** 设定输出缓存 **/
if(!is_array($cache_outs)){
$cache_outs=array();
}
if(!is_array($cache_keyouts)){
$cache_keyouts=array();
}
/** 输出缓存信息 **/
function out_cache($br=true,$out_str=false){
$errs=get_error_cache();
$sucs=get_success_cache();
$infos=get_out_cache();
$outstr="";
if(count($errs)>1||(is_array($errs) && $errs[0])){
$outstr.= '<p class="errbox">';
$outstr.= join("<br/>",$errs);
$outstr.= '</p>';
}
if(count($sucs)>1||(is_array($sucs) && $sucs[0])){
$outstr.= '<p class="sucbox">';
$outstr.= join("<br/>",$sucs);
$outstr.= '</p>';
}
if(count($infos)>1||(is_array($infos) && $infos[0])){
$outstr.= '<p class="infobox">';
$outstr.= join("<br/>",$infos);
$outstr.= '</p>';
}
if($br)$outstr=str_replace("\n","<br/>\n",$outstr);
if($out_str){
return $outstr;
}else{
echo $outstr;
return 1;
}
}
/**
* 清除输出缓存
*/
function cache_clear(){
global $cache_outs;
$cache_outs=array();
global $cache_keyouts;
$cache_keyouts=array();
}
/**
* 添加错误信息到缓存
*/
function add_error_cache($msg){
add_cache_out("ERROR",$msg);
}
/**
* 输出缓存的错误消息
*/
function get_error_cache($format="× {out}"){
return get_out_cache("ERROR",$format);
}
/**
* 添加正确信息到缓存
*/
function add_success_cache($msg){
add_cache_out("SUCCESS",$msg);
}
/**
* 输出缓存的正确消息
*/
function get_success_cache($format="√ {out}"){
return get_out_cache("SUCCESS",$format);
}
/**
* 将消息加入输出缓存
* cout($msg);
* cout($key,$msg);
* cout($keys,$msg);
*/
function add_cache_out($msg,$msg2=false){
if($msg2===false){
global $cache_outs;
if(!is_array($cache_outs)){
$cache_outs=array();
}
return add_array_cache($cache_outs,$msg,$msg2);
}else{
$key=$msg;
$msg=$msg2;
global $cache_keyouts;
if(!is_array($cache_keyouts)){
$cache_keyouts=array();
}
return add_array_cache($cache_keyouts,$msg,$key);
}
}
/**
* 输出缓存的消息
*/
function get_out_cache($key=false,$format=false){
print_r($cache_outs);
if($key===false){
global $cache_outs;
$os=$cache_outs;
}else{
global $cache_keyouts;
$os=$cache_keyouts;
}
return get_array_cache($os,$format,$key);
}
/* ---- 底层逻辑封装 ---- */
/** -- 使用数组进行缓存输出 -- **/
/**
* 添加输出信息到缓存数组中,可以使用key进行填充 使用get_array_cache获取添加到缓存数组的输出信息
* add_array_cache($os) 输出空行
* add_array_cache($os,$msg) 输出信息
* add_array_cache($os,$msg,$key:string) 将信息输出到指定的位置
* add_array_cache($os,$msg,$keys:array) 将信息输出的分层的位置
* -- fallseir.lee 20061018
*/
function add_array_cache(&$os,$msg="",$key=false){
if($key===false){
if(!is_array($os)){
$os=array();
}
array_push($os,$msg);
}else if(is_array($key)&&count($key)>0){
if(!is_array($os)){
$os=array();
}
$t=&$os;
for($i=0;$i<count($key);$i++){
if(!array_key_exists($key[$i],$t)){
$t[$key[$i]]=array();
}
$t=&$t[$key[$i]];
}
array_push($t,$msg);
}else{
if(!is_array($os)){
$os=array();
}
if(!array_key_exists($key,$os)){
$os[$key]=array($msg);
}else{
array_push($os[$key],$msg);
}
}
}
/**
* 获取添加到缓存数组的输出信息
* format中可以指定 {out} 和 {key} 的样式
* get_array_cache($os)
* get_array_cache($os,$format)
* get_array_cache($os,$format,$key)
* get_array_cache($os,$format,$key,$pkey)
* -- fallseir.lee 20061018

*/
function get_array_cache($os,$format=false,$key=false,$pkey=false){
if($format===false){
$format="{out}";
}
$ostrs=array();
if($key===false){
if(is_array($os)){
foreach($os as $k=>$v){
if(is_array($v)){
$ostrs=array_merge($ostrs,get_array_cache($v,$format,$key,$pkey!==false?"$pkey:$k":"$k"));
}else{
$t=preg_replace("/{key}/",$pkey,$format);
$ostrs=array_merge($ostrs,preg_replace("/{out}/",$v,$t));
}
}
}else{
$format=preg_replace("/{key}/","",$format);
$ostrs=array_merge($ostrs,preg_replace("/{out}/",$os,$format));
}
}else{
// out $keyouts[$key[0]][$key[1]]...
if(is_array($key)){
for($i=0;$i<count($key);$i++){
if(false===$os=try_get_array_value($os,$key[$i],false)){
return $ostrs;
}
}
$ostrs = get_array_cache($os,$format,null);
}else{
if(false===$os=try_get_array_value($os,$key,false)){
return $ostrs;
}
$ostrs = get_array_cache($os,$format,false);
}
}
return $ostrs;
}
if(!function_exists(try_get_array_value))
/**
* 尝试从数组中获取指定的值
*/
function try_get_array_value($array, $key, $default = null)
{
if($array && is_array($array)){
if( array_key_exists($key, $array) ){
return $array[$key];
}
}
return $default;
}
}
doc in google http://docs.google.com/View?docid=dg4t629m_43f75qzq

星期二, 十月 10, 2006

note: 使用prototype中的ajax (1)

使用prototype中的ajax
一、prototype 中的ajax调用部分分析
author: fallseir fallseir [at] gmail.com
tags:prototype,ajax,参考

Ajax
getTransport() 获取一个基本的Request对象
自动从 XMLHttpRequest Msxml2.XMLHTTP Microsoft.XMLHTTP 中选择,如果创建失败则返回false
activeRequestCount 当前的活动reqeust数量 默认为0

Ajax.Responders 全局
responders[] responder列表
_each() 对每一个 responder 执行指定的操作
register() 注册一个 responder
unregister() 注销一个 responder
dispatch() 触发每个 responder 中指定的callback动作
继承了 Enumerable 的操作
添加默认处理 onCreate 和 onComplete 对 Ajax.activeRequestCount 进行增减操作
Ajax.Base 基本ajax类
setOptions 设置Ajax选项
使用指定的参数值覆盖默认值,每次设置会重新初始化而不会保留原有值
responseIsSuccess() 判断transport的执行状态是否为 2xx
responseIsFailure() 返回transport执行是否成功 !responseIsSuccess()
Ajax.Request 远程请求
Ajax.Request.Events[] 事件表 = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']
继承 Ajax.Base
initialize() 初始化
初始化一个 transport 通过 Ajax.getTransport()
设定 options 通过 指定的 options
通过 request 请求指定的 url
request() 请求远程地址
从 options 中获取参数
options.parameters 参数表
用于发送到请求的url中 使用 xx=xx&xx=xx格式
options.method 请求方式
post | get 当使用其他方式时 请求采用post形式 并将 method 以 _method=method形式追加到parameters上。
options.asynchronous 指定是否使用异步方式请求
触发 onCreate 事件 Ajax.Responders.dispatch('onCreate', this, this.transport);
打开远程请求连接 this.transport.open(this.options.method, this.url,this.options.asynchronous);
设置异步请求的定时回调处理 setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
设置transport的状态回调处理 this.transport.onreadystatechange = this.onStateChange.bind(this);
设置请求头信息 this.setRequestHeaders();
发送请求 this.transport.send(this.options.method == 'post' ? body : null);
body 如果 options.postBody 存在就使用 options 中的设置 否则使用 parameters 的值
更新状态 this.onStateChange(); 如果使用非同步方式或overrideMimeType形式的请求
处理过程中如果发生异常将导致 this.dispatchException(e)
setRequestHeaders() 设置 http 请求头信息
如果 options.method 为 post 则通过 options.contentType 设置请求的 Content-type
如果 overrideMimeType 存在则设置 Connection 为 close
使用 options.requestHeaders 中的值覆盖默认值
设置 transport 的头信息 this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
onStateChange() 更新 Reqeust 状态
当 transport.readyState 不为 1 (loading) 时,触发状态更新动作 this.respondToReadyState(this.transport.readyState)
header() 从 transport 的 response 中获取指定的 header 项的值
evalJSON() 使用 eval 执行( this.header('X-JSON') )中包含的 javascript 字面形式数据
evalResponse() 使用 eval 执行 response 中包含的 javascript 字面形式数据
出错时触发 dispatchException
respondToReadyState() 处理请求状态
获取状态值对应的状态名
设置 json为 this.evalJSON()
如果当前状态为 Complete 则根据优先顺序选择处理方式
如果 options中包含 'on' + this.transport.status 命名的回调函数
或 'on' + (this.responseIsSuccess() ? 'Success' : 'Failure' 命名的回调函数
则尝试执行回调
如果 response 的 content-type 为javascript 则执行返回的内容
if((this.header('Content-type') || '').match(/^text\/javascript/i)) this.evalResponse();
如果 options 中包含对应的 'on'+event 回调函数 则进行回调
触发全局的Responders 事件 Ajax.Responders.dispatch('on' + event, this, transport, json);
如果当前状态为 Complete 则 清空 transport 的状态回调函数
dispatchException() 处理异常
调用 options 中的异常处理函数 如果存在的话 (this.options.onException || Prototype.emptyFunction)(this, exception);
触发异常处理事件 Ajax.Responders.dispatch('onException', this, exception);

Ajax.Updater 自动更新处理
继承 Request
initialize() 初始化
建立回显区域 containers{success,failure}
container|container.success[,container.failure]
如果指定的container包含success 则设置success为container.success指定的htmldom元素
如果指定的container包含container.failure 则设置 failure
创建 transport
设置请求选项 setOptions
重置完成时的回调 onComplete
增加 updateContent
开始请求 request
updateContent() 更新回显区域
根据状态设定回显区域 receiver
获取回显内容 response
清除response中的js脚本,如果选项中没有设定执行js options.evalScripts
更新内容
如果选项中指定了回显操作options.insertion 则调用指定的回显操作进行回显
否则使用默认方式更新回显区域 Element.update(receiver, response);
如果 responseIsSuccess 设定延时执行 onComplete

Ajax.PeriodicalUpdater
继承 Ajax.Base
initialize() 初始化
设置参数 setOptions
设置请求回调 onComplete=options.onComplete
设置循环周期 frequency
设置衰减 decay
初始化 updater
设置 container
设置 url
开始进行处理 start
start() 开始处理
重置回调处理 options.onComplete = updateComplete
触发计时器事件 onTimerEvent
stop() 停止循环处理
清除 updater 的回调函数 this.updater.options.onComplete = undefined;
清除计时器 clearTimeout(this.timer);
回调 onComplete (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
updateComplete() 重置请求
当updater完成一次请求时,自动回调此函数
根据返回的内容是否存在设定本次的衰减值 decay
设定lastText
重新设定定时器 onTimerEvent
onTimerEvent() 创建 updater
创建updater并执行一次远程请求

参考:
最新prototype.js下载
prototype 类图
prototype.js开发笔记
Developer Notes for prototype.js
js加油站:prototype 源码解读(一)

星期日, 十月 08, 2006

code:php 将字符串转换为html实体

tags:htmlentity,php,iconv
将字符串转换为html实体
$src 原始字符串
$output 输出字符串
$src= htmlspecialchars($src); // translate &"<> to HTML entities
/** translate \n to <br/>**/
$src= str_replace("\n", "<br/>", $src);
$str = iconv($deck->charset, "UTF-16BE", $src); # 将原始字符串转换为utf16编码
for ($i = 0; $i < strlen($str); $i++,$i++) { # 将每个标准ascii字符以外的(大于128)字符转换为实体
$code = ord($str{$i}) * 256 + ord($str{$i + 1});
if ($code < 128) {
$output .= chr($code);
} else if ($code != 65279) {
$output .= "&#".$code.";";
}
}

摘录 html实体与网页编码
--------------------------------------------------------------
--http://www.ugia.cn/?p=72

在php中我们可以用mbstring的mb_convert_encoding函数实现这个正向及反向的转化。
如:

mb_convert_encoding ("你好", "HTML-ENTITIES", "gb2312"); //输出:你好
mb_convert_encoding ("你好", "gb2312", "HTML-ENTITIES"); //输出:你好

可以查看这个页面:htmlentities.html, 不管选择什么网页编码,网页都能正常显示。

如果需要对整个页面转化,则只需要在php文件的头部加上这三行代码:

mb_internal_encoding("gb2312"); // 这里的gb2312是你网站原来的编码
mb_http_output("HTML-ENTITIES");
ob_start('mb_output_handler');

在asp中我们可以用下面这个函数来实现这个转化:

Function htmlentities(str)
For
i = 1 to Len(str)
char = mid(str, i, 1)
If
AscW(char) > 0 then
htmlentities
= htmlentities & "&#" & Ascw(char) & ";"
Else
htmlentities = htmlentities & "&#" & (65536 + ascW(char)) & ";"
End if
Next
End
Function

--------------------------------------------------------------
mb_convert_encoding 只在php5之后才有 我用的是php4所以用不了 :)


摘录:将字符转成unicode
---------------------------------------------------------------
-- http://www.web-bbs.com/forum/htm_data/10/0512/258.html

Js版

<script>
test = "你好abc"

str = ""
for( i=0; i<test.length; i++ )
{
temp = test.charCodeAt(i).toString(16);
str += "\\u"+ new Array(5-String(temp).length).join("0") +temp;
}
document.write (str)
</script>


vbs版


Function Unicode(str1)
Dim str,temp
str = ""
For i=1 to len(str1)
temp = Hex(AscW(Mid(str1,i,1)))
If len(temp) < 5 Then temp = right("0000" & temp, 4)
str = str &amp;amp;amp; "\u" & temp
Next
Unicode = str
End Function

---------------------------------------------------------------
摘录的两个没有进行测试 放在这里有待参考


星期六, 十月 07, 2006

摘录:http响应码 & http 信息头

摘录:http响应码 & http 信息头
tags:http,http code,http head
一、HTTP响应码

响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。

响应码分五种类型,由它们的第一位数字表示:
1xx:信息,请求收到,继续处理
2xx:成功,行为被成功地接受、理解和采纳
3xx:重定向,为了完成请求,必须进一步执行的动作
4xx:客户端错误,请求包含语法错误或者请求无法实现
5xx:服务器错误,服务器不能实现一种明显无效的请求

下表显示每个响应码及其含义:

100 继续
101 分组交换协
200 OK
201 被创建
202 被采纳
203 非授权信息
204 无内容
205 重置内容
206 部分内容
300 多选项
301 永久地传送
302 找到
303 参见其他
304 未改动
305 使用代理
307 暂时重定向
400 错误请求
401 未授权
402 要求付费
403 禁止
404 未找到
405 不允许的方法
406 不被采纳
407 要求代理授权
408 请求超时
409 冲突
410 过期的
411 要求的长度
412 前提不成立
413 请求实例太大
414 请求URI太大
415 不支持的媒体类型
416 无法满足的请求范围
417 失败的预期
500 内部服务器错误
501 未被使用
502 网关错误
503 不可用的服务
504 网关超时
505 HTTP版本未被支持

二、HTTP头标
头标由主键/值对组成。它们描述客户端或者服务器的属性、被传输的资源以及应该实现连接。

四种不同类型的头标:
1.通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
2.请求头标:允许客户端传递关于自身的信息和希望的响应形式。
3.响应头标:服务器和于传递自身信息的响应。
4.实体头标:定义被传送资源的信息。即可用于请求,也可用于响应。


头标格式::

下表描述在HTTP/1.1中用到的头标
Accept 定义客户端可以处理的媒体类型,按优先级排序;
在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符。例如:Accept: image/jpeg,image/png,*/*
Accept-Charset 定义客户端可以处理的字符集,按优先级排序;
在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符。例如:Accept-Charset: iso-8859-1,*,utf-8
Accept-Encoding 定义客户端可以理解的编码机制。例如:Accept-Encoding:gzip,compress
Accept-Language 定义客户端乐于接受的自然语言列表。例如:Accept-Language: en,de
Accept-Ranges 一个响应头标,它允许服务器指明:将在给定的偏移和长度处,为资源组成部分的接受请求。
该头标的值被理解为请求范围的度量单位。例如Accept-Ranges: bytes或Accept-Ranges: none
Age 允许服务器规定自服务器生成该响应以来所经过的时间长度,以秒为单位。
该头标主要用于缓存响应。例如:Age: 30
Allow 一个响应头标,它定义一个由位于请求URI中的次源所支持的HTTP方法列表。例如:Allow: GET,PUT
aUTHORIZATION 一个响应头标,用于定义访问一种资源所必需的授权(域和被编码的用户ID与口令)。
例如:Authorization: Basic YXV0aG9yOnBoaWw=
Cache-Control 一个用于定义缓存指令的通用头标。例如:Cache-Control: max-age=30
Connection 一个用于表明是否保存socket连接为开放的通用头标。例如:Connection: close或Connection: keep-alive
Content-Base 一种定义基本URI的实体头标,为了在实体范围内解析相对URLs。
如果没有定义Content-Base头标解析相对URLs,使用Content-Location URI(存在且绝对)或使用URI请求。
例如:Content-Base: Http://www.myweb.com
Content-Encoding 一种介质类型修饰符,标明一个实体是如何编码的。例如:Content-Encoding: zip
Content-Language 用于指定在输入流中数据的自然语言类型。例如:Content-Language: en
Content-Length 指定包含于请求或响应中数据的字节长度。例如:Content-Length:382
Content-Location 指定包含于请求或响应中的资源定位(URI)。
如果是一绝。对URL它也作为被解析实体的相对URL的出发点。
例如:Content-Location: http://www.myweb.com/news
Content-MD5 实体的一种MD5摘要,用作校验和。
发送方和接受方都计算MD5摘要,接受方将其计算的值与此头标中传递的值进行比较。
例如:Content-MD5:
Content-Range 随部分实体一同发送;标明被插入字节的低位与高位字节偏移,也标明此实体的总长度。
例如:Content-Range: 1001-2000/5000
Contern-Type 标明发送或者接收的实体的MIME类型。例如:Content-Type: text/html
Date 发送HTTP消息的日期。例如:Date: Mon,10PR 18:42:51 GMT
ETag 一种实体头标,它向被发送的资源分派一个唯一的标识符。
对于可以使用多种URL请求的资源,ETag可以用于确定实际被发送的资源是否为同一资源。
例如:ETag: '208f-419e-30f8dc99'
Expires 指定实体的有效期。例如:Expires: Mon,05 Dec 2008 12:00:00 GMT
Form 一种请求头标,给定控制用户代理的人工用户的电子邮件地址。例如:From: webmaster@myweb.com
Host 被请求资源的主机名。对于使用HTTP/1.1的请求而言,此域是强制性的。例如:Host: www.myweb.com
If-Modified-Since 如果包含了GET请求,导致该请求条件性地依赖于资源上次修改日期。
如果出现了此头标,并且自指定日期以来,此资源已被修改,应该反回一个304响应代码。
例如:If-Modified-Since: Mon,10PR 18:42:51 GMT
If-Match 如果包含于一个请求,指定一个或者多个实体标记。只发送其ETag与列表中标记区配的资源。
例如:If-Match: '208f-419e-308dc99'
If-None-Match 如果包含一个请求,指定一个或者多个实体标记。资源的ETag不与列表中的任何一个条件匹配,操作才执行。
例如:If-None-Match: '208f-419e-308dc99'
If-Range 指定资源的一个实体标记,客户端已经拥有此资源的一个拷贝。必须与Range头标一同使用。
如果此实体自上次被客户端检索以来,还不曾修改过,那么服务器只发送指定的范围,否则它将发送整个资源。
例如:Range: byte=0-499If-Range:'208f-419e-30f8dc99'
If-Unmodified-Since 只有自指定的日期以来,被请求的实体还不曾被修改过,才会返回此实体。
例如:If-Unmodified-Since:Mon,10PR 18:42:51 GMT
Last-Modified 指定被请求资源上次被修改的日期和时间。例如:Last-Modified: Mon,10PR 18:42:51 GMT
Location 对于一个已经移动的资源,用于重定向请求者至另一个位置。
与状态编码302(暂时移动)或者301(永久性移动)配合使用。
例如:Location: http://www2.myweb.com/index.jsp
Max-Forwards 一个用于TRACE方法的请求头标,以指定代理或网关的最大数目,该请求通过网关才得以路由。
在通过请求传递之前,代理或网关应该减少此数目。例如:Max-Forwards: 3
Pragma 一个通用头标,它发送实现相关的信息。例如:Pragma: no-cache
Proxy-Authenticate 类似于WWW-Authenticate,便是有意请求只来自请求链(代理)的下一个服务器的认证。
例如:Proxy-Authenticate: Basic realm-admin
Proxy-Proxy-Authorization 类似于授权,但并非有意传递任何比在即时服务器链中更进一步的内容。
例如:Proxy-Proxy-Authorization: Basic YXV0aG9yOnBoaWw=
Public 列表显示服务器所支持的方法集。例如:Public: OPTIONS,MGET,MHEAD,GET,HEAD
Range 指定一种度量单位和一个部分被请求资源的偏移范围。例如:Range: bytes=206-5513
Refener 一种请求头标域,标明产生请求的初始资源。对于HTML表单,它包含此表单的Web页面的地址。
例如:Refener: http://www.myweb.com/news/search.html
Retry-After 一种响应头标域,由服务器与状态编码503(无法提供服务)配合发送,以标明再次请求之前应该等待多长时间。
此时间即可以是一种日期,也可以是一种秒单位。例如:Retry-After: 18
Server 一种标明Web服务器软件及其版本号的头标。例如:Server: Apache/2.0.46(Win32)
Transfer-Encoding 一种通用头标,标明对应被接受方反向的消息体实施变换的类型。例如:Transfer-Encoding: chunked
Upgrade 允许服务器指定一种新的协议或者新的协议版本,与响应编码101(切换协议)配合使用。
例如:Upgrade: HTTP/2.0
User-Agent 定义用于产生请求的软件类型(典型的如Web浏览器)。
例如:User-Agent: Mozilla/4.0(compatible; MSIE 5.5; Windows NT; DigExt)
Vary 一个响应头标,用于表示使用服务器驱动的协商从可用的响应表示中选择响应实体。例如:Vary: *
Via 一个包含所有中间主机和协议的通用头标,用于满足请求。例如:Via: 1.0 fred.com, 1.1 wilma.com
Warning 用于提供关于响应状态补充信息的响应头标。例如:Warning: 99 www.myweb.com Piano needs tuning
www-Authenticate 一个提示用户代理提供用户名和口令的响应头标,与状态编码401(未授权)配合使用。响应一个授权头标。
例如:www-Authenticate: Basic realm=zxm.mgmt
原文:http://blog.liu21st.com/index.php?job=art&articleid=a_20060807_154537

code:从apache日志文件中获取所有的关于google的useragent[shell应用]

tags:shell,cat,awk,sort,uniq


从apache日志文件中获取所有的关于google的useragent

cat [dir]/access_log.2006*| awk '/Google/{sub(".*","",$1); sub(".*","",$2); sub(".*","",$3); sub(".*","",$4); sub(".*","",$5); sub(".*","",$6); sub(".*","",$7); sub(".*","",$8); sub(".*","",$9); sub(".*","",$10); sub(".*","",$11); print ; }'| awk '/Google/'|sort|uniq -c|sort –rn

分析:

cat [dir]/access_log.2006* # 输出所有dir指定的目录下以access_log.2006开头的文件的内容

awk '/Google/ # 过滤出所有包含Google的记录(按行)

{sub(".*","",$1); sub(".*","",$2); sub(".*","",$3); sub(".*","",$4); sub(".*","",$5); sub(".*","",$6); sub(".*","",$7); sub(".*","",$8); sub(".*","",$9); sub(".*","",$10); sub(".*","",$11); print ; }' # 通过 sub 对前11项(按空格进行区分)进行清除 ,print输出剩下的内容。

awk '/Google/' # 过滤出所有包含Google的项

sort|uniq -c # 排序并过滤重复,-c 输出重复次数

sort –rn # 按-n数字进行-r反向排序


数据样式

20060926 – 20061007 关于google的useragent列表

重复次数 useragent

167822 "Feedfetcher-Google; (+http://www.google.com/feedfetcher.html)"

4105 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

2017 "Mozilla/5.0 (compatible; Google Desktop)"

1933 "Mozilla/4.0 (compatible; Google Desktop)"

257 "Planet Google (China) +http://planet-google.com/cn/ Planet/1.0~pre1 +http://www.planetplanet.org UniversalFeedParser/3.3 +http://feedparser.org/"

35 "FeedFetcher-Google; (+http://www.google.com/feedfetcher.html)"

13 "Googlebot/2.1+(+http://www.googlebot.com/bot.html)"

12 "Mediapartners-Google/2.1"

10 "Nokia6820/2.0 (4.83) Profile/MIDP-1.0 Configuration/CLDC-1.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)"

8 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.1) Gecko/20060307 Googlebot/2.1;+http://www.google.com/bot.html"

7 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Google Wireless Transcoder;)"

4 "Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)"

2 "GoogleSpider2"

1 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Google-TR-4)"


星期五, 九月 29, 2006

wp的config分析 learn wordpress (9)

定义常量的方式
define('DB_NAME', 'wordpress_test');
定义变量的方式
$table_prefix = 'wp_';

数据库设置
DB_NAME DB_USER DB_PASSWORD DB_HOST
table_prefix

多语言设置
WPLANG

当前文件的绝对路径
define('ABSPATH', dirname(__FILE__).'/');
#PS:这个强烈建议去做,在一个预定的位置来记录路径,在以这个路径为基本进行路径组合。
省得当前文件在哪自己都不知道了,特别是在包含来包含去的时候。

从外部导入设置
require_once(ABSPATH.'wp-settings.php');
在wp-setting中对环境进行了一些设置 可以参看前面的几篇文章

wp-setting中进行不需要人为干预的环境初始化