星期三, 十月 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