6455 items (6455 unread) in 32 feeds
Chinese
(5202 unread)
Japanese
(1139 unread)
English
(94 unread)
(18 unread)
现在是南半球的冬天,原本应该冰山雪地,不过位于阿根廷冰河国家公园里的莫雷诺冰河,却正在溶化,从4日开始,莫雷诺冰河不断崩裂,巨型冰块几乎是以垂直角度急速脱离冰河表面,落入阿根廷湖,场面相当震撼。
7月7日,位于阿根廷南方加拉法特的国家冰川公园内的莫雷诺大冰川开始崩塌,目前冰川已经被冲出一个大洞,形成独特的冰川拱门的景观。整座冰川拱门最终将彻底坍塌。 新华社发
因为这是阿根廷第一次在6到8月的冬天,出现冰河冰块崩裂现象。国家公园官员认为,导致冰块崩裂的原因是地球暖化,掉落湖中的冰块融解成浮冰,使得湖面水位不断上升。
7月7日,位于阿根廷南方加拉法特的国家冰川公园内的莫雷诺大冰川开始崩塌,目前冰川已经被冲出一个大洞,形成独特的冰川拱门的景观。整座冰川拱门最终将彻底坍塌。 新华社发
上升水位不断冲刷冰河,加快冰河崩解的速度,冰河上清晰可见道道裂痕,骇人的景象一再突显,这更加证明地球暖化的脚步没有减缓,反而是愈来愈快了。
7月7日,位于阿根廷南方加拉法特的国家冰川公园内的莫雷诺大冰川开始崩塌,目前冰川已经被冲出一个大洞,形成独特的冰川拱门的景观。整座冰川拱门最终将彻底坍塌。 新华社发
7月5日,位于阿根廷南部冰川国家公园的佩里托·莫雷偌冰川发生崩塌,形成一个冰桥。
相关文章

Scrapeup是一个提供视频视频Mashup服务的网站。目前Scrapeup主要聚合了VideoSift ,reddit ,Fark ,Digg , GameTrailers ,College Humor,LiveLeak上面的视频。你可以选取其中部分网站来过滤出其中的视频,并且可以在Scrapeup可以直接观看这些视频。

目前Scrapeup主要收录的是一些热门资讯网站上面的视频,个人觉得如果在聚合的基础上能够加强过滤功能就更好了,因为纯粹的将视频资讯聚合起来的意义远不如加入资讯的过滤功能更有价值。
© watsonxu for 天涯海阁, 2008. | Permalink | One comment
Add to del.icio.us | 请用新Feed地址订阅本站内容:http://feed.web20share.com
相关文章推荐
防溅湿雨伞
哇,吃面真的需要这样的东西吗?日本人的想法真够创意。
(二):感冒纸巾架、伸缩勺子、擦手屁贴
感冒专用纸巾架
伸缩勺子与擦手屁贴
弄成这样出去难道不会被人笑话吗?
(三):地铁休眠器、地铁便携凳
地铁休眠器
不注意看还以为是有人上吊呢,晕。= =!
地铁便携凳(四):剔牙遮羞机、吹面风扇、口红奶油
剔牙遮羞机
想不通她另一只手闲着做什么?难道是给残疾人设计的吗??
吹面风扇和口红奶油
这个“泡面风扇”经典,回头小编DIY一个试试,效果好用的话我会告诉大家的^^
(五):到站叫我帽、便携斑马线
到站叫我帽
便携斑马线(六):木屐皮鞋、防切手、便梳、自信器
木屐皮鞋与防切手
方便梳与秃头自信重建器(七):地铁专用方便拉环、好太太除蟑鞋
地铁专用方便拉环
不错的设计!出门带个这家伙还能防身。
好太太除蟑鞋
又见小强,嘿嘿!不懂这个和直接用脚踩有什么区别……
(八):农夫专用瑞士军刀、爱睡族眼镜
农夫专用瑞士小刀工具组
这么大的瑞士军刀,汗一个先……
爱睡族眼镜(九):眼药水专用漏斗、模拟男性喂奶器

男性喂奶器
这个强,绝对称得上是猥琐男……
(十):催眠美腿枕头
现代人的工作非常紧张,压力也比较大,利用工作间隙小憩几乎是很多人都愿意的事情。为此素来比较变态的大和民族又有了新发明,美腿枕头……![]() |
相关文章
Fosfor Gadgets日前评选出了他们认为年度最为怪异的十大USB存储装置。
第1位:Barbie










相关文章

这张照片中的装置是第6骑兵团配备的一架RQ-7“影子”200无人侦察机,当时在伊拉克北部执行任务。但是,这项发明受到褒奖之处不是无人侦 察机本身,而是机上的通讯中继系统(简称CRS)。“影子”处于单频道地面无线电的正常接收范围以外的时候,这套系统即可支持双向通讯。美陆军称,通讯中 继系统既可安装在吊杆上使用,亦可与翼尖延伸部分便携式PRC-152无线电装置一同使用。
同在美军服役的其他无人机一样,“影子”时刻俯瞰地面的一举一动,并将视频图像实时发回地面基站。接着,这些照片可在侦查、监视和获取目标时供 操作人员使用。今年初,美军认定几种无人机有资格享受在史密森学会供人“瞻仰”的荣誉,而“影子”就是其中之一。“影子”无人机的飞行时速达到100英里 左右,最大飞行高度约为1.9万英尺。
第二名.XM982“神剑”精确制导炮弹

2007年另一种重大航空发明是XM982“神剑”(Excalibur)精确制导炮弹。美陆军称,这种炮弹“引领21世纪加农炮的发展方 向”。照片是今年2月拍摄于阿富汗布莱辛军营,第321野战炮团的士兵正在将图格坐标输入“神剑”炮弹。“神剑”炮弹使用全球定位系统卫星数据及导航系统 的自动更新,提高常规155mm炮弹的精确度。
士兵们可通过增强型便携式炮兵感应引信装定器(Enhanced Portable Inductive Artillery Fuse Setter),向“神剑”炮弹输入图格坐标等信息。这是美军士兵拉动M-777A2榴弹炮拉火绳,在阿富汗首次发射“神剑”精确制导炮弹的镜头。据美军 称,除了可以数字化编程外,M-777的重量比更为常用的M-198榴弹炮轻9,800磅左右,而炮弹精确度更高,对目标地区造成的附带损害就越小。
第三名.RECCE 车辆系统

几种地面车辆还以其独特的方式名列美陆军年度十大发明名单之列。这张照片为RECCE 车辆系统,它是在“美洲狮”(Cougar)6x6 MRAP防地雷反伏击车基础上改进而来,工兵可用其清除道路。RECCE车不同于“美洲狮”基本配置,原因就在于安装了多套子系统:“保护神”遥控武器 站;Gyrocam 图像传感器;识别友军的航空蓝军跟踪系统;机器人部署系统,让操作人员无须打开“魔爪”机器人亦可部署和回收。
第四名.主动炮手保护装置

“主动炮手保护装置”(Objective Gunner Protection Kit,简称OGPK)是一种机动化旋转炮塔,可以安装在“悍马”和MRAP军车顶部,保护炮手免受爆炸装置碎片和轻武器射击的伤害。它由透明装甲、炮手 用桁索和后视镜构成。这是从远处看OGPK装置安装在“悍马”军车上的镜头。据美陆军介绍,这套装置主要是阻止敌人火力射向炮塔前端。2007年, 8000多台OGPK装置装备驻伊拉克和阿富汗美军。
第五名.Picatinny防爆护罩

这张照片是功能同主动炮手保护装置有些相似的“Picatinny防爆护罩”(Picatinny Blast Shield)的照片,它安装在炮塔上。防爆护罩的透明装甲和安装角度均可减轻爆炸的冲击波。它的重量较轻,适用于水陆两用车辆。水陆两用车辆的重量对其 生存能力至关重要。照片上的Picatinny防爆护罩安装在美海军陆战队LAV-25轮式步兵战车顶部。150多个Picatinny防爆护罩在 2007年装备LAV-25轮式步兵战。
第六名. M110半自动狙击系统

这是M110半自动狙击系统(Semi-Automatic Sniper System),使用7.62mm子弹。据美陆军介绍,M110半自动狙击枪设计用于“对多个目标进行快速、集中打击”,是美陆军第一套“快速安装/拆卸 消音器”的武器系统。这是对M110半自动狙击枪近距离一瞥,它有一个可装10发子弹或20发子弹的弹夹,最大有效射程约为2,625英尺。算上射击瞄准 仪、两脚架和一个装满20颗子弹的弹夹,总重约为15.3磅。
第七名.自我保护适应性滚动装置

“自我保护适应性滚动装置”(Self Protective Adaptive Roller Kit,简称SPARK)是安装于车辆前部的装置,设计用于实现“均衡保护”,在爆炸装置对车辆及车上士兵造成伤害前便将其引爆。
第八名.临时爆炸装置探测臂

这是另一种对付路边炸弹的工具,称为临时爆炸装置探测臂(Improvised Explosive Device Interrogation Arm),可以让操作人员从远处将路边炸弹引爆。这套装置由一个金属探测器和一台摄像机构成,摄像机可以让操作人员清楚地看到机械臂末端的情况。该装置可 将物体举起来,还可进行浅层挖掘。
第九名.HMMWV进出协助训练装置

十大发明第九名是HMMWV进出协助训练装置(HMMWV Egress Assistance Trainer,简称HEAT)。HMMWV是高机动性多用途轮式车辆的英文缩写形式,美军官兵通常昵称为Humvee,即“悍马”军车。照片中的装置是 “悍马”军车车身上部模型,顶端为炮手炮塔,这个模型可以四处旋转,并停在令人感到很难受的角度,以便让士兵经过训练掌握快速离开翻车车辆的技能。这种训 练是在海外服役的美军士兵的必备科目。
第十名.重伤员损伤控制复苏方法

年度十大发明的最后一名是重伤员损伤控制复苏方法(Damage Control Resuscitation of Severely Injured Soldiers),我们可以对这套装置的目标作相当精炼的表述:挽救更多生命。美陆军称,损伤控制复苏装置已成为“针对大多数需要大量输血的重伤员的医 护标准。”由于存在疑问的损伤主要是内伤,所以,不能采用挤压方法去止血。
一般情况下,医生会给失血患者静脉注射数量是其血液量三倍的生理盐水,可能还需要进行输血。但对于一些重伤患者而言,大量的血液和液体可能对其 身体构成伤害,原因是这会抑制人体凝结血液的能力。使用控制复苏装置,医生可以限制生理盐水的用量,他们可以使用比正常情况下更多的血浆来恢复患者血液 量。美陆军称,这一方法已使战场上重伤员的死亡率从原来的65%骤降至17%。(孝文)
相关文章
写完三集10位令人叹服的3D街头艺术家">[http%3A%2F%2Fwww.google.com%2Fcoop%2Fintl%2Fzh-Hans%2Fimages%2Fcustom_search_sm.gif%3BLC%3A%230000CC%3BLH%3A65%3BLP%3A1%3BT%3A%23000000%3BVLC%3A%2300CC33%3B&hl=zh-CN&oe=UTF-8&ie=UTF-8&client=google-coop">三集10位令人叹服的3D街头艺术家] 后, 我就开始想,这样老往这里贴照片是不是太懒了,然后大概算了一下,原来花在翻译上的时间也不少。这又要说到为什么要写博客,自从向cnbate及其他网站 投过几篇译文后,这个博客也多人看了,而且大多都是陌生人,匆匆走过也不留言。以前沉底的文章被有翻了出来,而且有被广泛转载的迹象,那些文章我觉得没有 什么内涵,但是自己认真收集的,虽然大家看了不会觉得有什么收获,但起码不觉得恶心,我现在开始是抱着一种分享的心态去写图片类的文章,应该不会有什么人 反对。
从这一期开始,一连三集《NASA最经典的45张照片》。NASA,美国航天局,实际上我对太空的东西很向往,真想有机会跑出地球看一下,但现在只能看照片了。这些照片有些现在看来不算什么,但由于很多是第一次,所以是很有价值的。
上图是第一张由气象卫星(Tiros)拍到的地球照片,拍摄时间为1960年4月1日。
上图被称为Earthrise(相对于sunrise),是在1968年12月,阿波罗8号的宇航员Frank Bormen等人看到地球正从月球表面冉冉升起。
上图是另一张在阿波罗8号拍摄取的照片,是人类第一次离开地球在月球轨道拍摄到的地球另一面,由于光线问题,地球有半是黑暗一片。
上图是由于阿波罗8号11号拍摄的整个南半球。从这张照片开始看到南极洲的冰层,非洲的海岸线及阿拉伯半岛。
上图是伽利略号飞船在390万英里的高度拍摄的,同时拍到了地球与月球半面。
上图是2003年NASA的火星探测器在火星上拍到的地球及其卫星月球。虽然模糊,但部分的南北美洲和太平洋还是可以看见。
上图是2004年在火星表面拍摄到的,地球只是一个小斑点。
上图是由NASA的分光仪根据卫星提供的数据模拟出来的半球照片。
上图是2005 拍摄到的半球照片,从照片中可以清晰看到太平洋、大西洋、南美洲。
上图是分光仪根据卫星提供的从2007年11月1号到12月1号的数据模拟出来的整个地球的平面图。
上图是地球夜晚的平面图,该图是一张综合图,是根据400张卫星照片整合形成的。
上图是由STS-77穿梭机在1996年拍摄的,该机械臂正悬停在地球的水平面上。
上图是由STS-96在1999年拍摄的,印度洋的上空被云层包围着。
上图是由STS-96在1999年拍摄的,在地球的水平面位置拍摄的澳洲的一些地方。
上图是由亚特兰提斯号在2008年1月8号拍摄的,在地球水平面捕捉到彩色的气层景象。
相关文章
这几天,我在学习PHP语言中的SPL。
这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记。不然记不住,以后要用的时候,还是要从头学起。
由于这是供自己参考的笔记,不是教程,所以写得比较简单,没有多解释。但是我想,如果你是一个熟练的PHP5程序员,应该足以看懂下面的材料,而且会发现它很有用。现在除此之外,网上根本没有任何深入的SPL中文介绍。
================
PHP SPL笔记
目录
第一部分 简介
1. 什么是SPL?
2. 什么是Iterator?
第二部分 SPL Interfaces
3. Iterator界面
4. ArrayAccess界面
5. IteratorAggregate界面
6. RecursiveIterator界面
7. SeekableIterator界面
8. Countable界面
第三部分 SPL Classes
9. SPL的内置类
10. DirectoryIterator类
11. ArrayObject类
12. ArrayIterator类
13. RecursiveArrayIterator类和RecursiveIteratorIterator类
14. FilterIterator类
15. SimpleXMLIterator类
16. CachingIterator类
17. LimitIterator类
18. SplFileObject类
第一部 简介
1. 什么是SPL?SPL是Standard PHP Library(PHP标准库)的缩写。
根据官方定义,它是“a collection of interfaces and classes that are meant to solve standard problems”。但是,目前在使用中,SPL更多地被看作是一种使object(物体)模仿array(数组)行为的interfaces和classes。
2. 什么是Iterator?
SPL的核心概念就是Iterator。这指的是一种Design Pattern,根据《Design Patterns》一书的定义,Iterator的作用是“provide an object which traverses some aggregate structure, abstracting away assumptions about the implementation of that structure.”
wikipedia中说,"an iterator is an object which allows a programmer to traverse through all the elements of a collection, regardless of its specific implementation".……"the iterator pattern is a design pattern in which iterators are used to access the elements of an aggregate object sequentially without exposing its underlying representation".
通俗地说,Iterator能够使许多不同的数据结构,都能有统一的操作界面,比如一个数据库的结果集、同一个目录中的文件集、或者一个文本中每一行构成的集合。
如果按照普通情况,遍历一个MySQL的结果集,程序需要这样写:
// Fetch the "aggregate structure"
$result = mysql_query("SELECT * FROM users");
// Iterate over the structure
while ( $row = mysql_fetch_array($result) ) {
// do stuff with the row here
}
读出一个目录中的内容,需要这样写:
// Fetch the "aggregate structure"
$dh = opendir('/home/harryf/files');
// Iterate over the structure
while ( $file = readdir($dh) ) {
// do stuff with the file here
}
读出一个文本文件的内容,需要这样写:
// Fetch the "aggregate structure"
$fh = fopen("/home/hfuecks/files/results.txt", "r");
// Iterate over the structure
while (!feof($fh)) {
$line = fgets($fh);
// do stuff with the line here
}
上面三段代码,虽然处理的是不同的resource(资源),但是功能都是遍历结果集(loop over contents),因此Iterator的基本思想,就是将这三种不同的操作统一起来,用同样的命令界面,处理不同的资源。
第二部分 SPL Interfaces
3. Iterator界面
SPL规定,所有部署了Iterator界面的class,都可以用在foreach Loop中。Iterator界面中包含5个必须部署的方法:
* current()
This method returns the current index’s value. You are solely
responsible for tracking what the current index is as the
interface does not do this for you.
* key()
This method returns the value of the current index’s key. For
foreach loops this is extremely important so that the key
value can be populated.
* next()
This method moves the internal index forward one entry.
* rewind()
This method should reset the internal index to the first element.
* valid()
This method should return true or false if there is a current
element. It is called after rewind() or next().
下面就是一个部署了Iterator界面的class示例:
/**
* An iterator for native PHP arrays, re-inventing the wheel
*
* Notice the "implements Iterator" - important!
*/
class ArrayReloaded implements Iterator {
/**
* A native PHP array to iterate over
*/
private $array = array();
/**
* A switch to keep track of the end of the array
*/
private $valid = FALSE;
/**
* Constructor
* @param array native PHP array to iterate over
*/
function __construct($array) {
$this->array = $array;
}
/**
* Return the array "pointer" to the first element
* PHP's reset() returns false if the array has no elements
*/
function rewind(){
$this->valid = (FALSE !== reset($this->array));
}
/**
* Return the current array element
*/
function current(){
return current($this->array);
}
/**
* Return the key of the current array element
*/
function key(){
return key($this->array);
}
/**
* Move forward by one
* PHP's next() returns false if there are no more elements
*/
function next(){
$this->valid = (FALSE !== next($this->array));
}
/**
* Is the current element valid?
*/
function valid(){
return $this->valid;
}
}
使用方法如下:
// Create iterator object
$colors = new ArrayReloaded(array ('red','green','blue',));
// Iterate away!
foreach ( $colors as $color ) {
echo $color."<br>";
}
你也可以在foreach循环中使用key()方法:
// Display the keys as well
foreach ( $colors as $key => $color ) {
echo "$key: $color<br>";
}
除了foreach循环外,也可以使用while循环,
// Reset the iterator - foreach does this automatically
$colors->rewind();
// Loop while valid
while ( $colors->valid() ) {
echo $colors->key().": ".$colors->current()."
";
$colors->next();
}
根据测试,while循环要稍快于foreach循环,因为运行时少了一层中间调用。
4. ArrayAccess界面部署ArrayAccess界面,可以使得object像array那样操作。ArrayAccess界面包含四个必须部署的方法:
* offsetExists($offset)
This method is used to tell php if there is a value
for the key specified by offset. It should return
true or false.
* offsetGet($offset)
This method is used to return the value specified
by the key offset.
* offsetSet($offset, $value)
This method is used to set a value within the object,
you can throw an exception from this function for a
read-only collection.
* offsetUnset($offset)
This method is used when a value is removed from
an array either through unset() or assigning the key
a value of null. In the case of numerical arrays, this
offset should not be deleted and the array should
not be reindexed unless that is specifically the
behavior you want.
下面就是一个部署ArrayAccess界面的实例:
/**
* A class that can be used like an array
*/
class Article implements ArrayAccess {
public $title;
public $author;
public $category;
function __construct($title,$author,$category) {
$this->title = $title;
$this->author = $author;
$this->category = $category;
}
/**
* Defined by ArrayAccess interface
* Set a value given it's key e.g. $A['title'] = 'foo';
* @param mixed key (string or integer)
* @param mixed value
* @return void
*/
function offsetSet($key, $value) {
if ( array_key_exists($key,get_object_vars($this)) ) {
$this->{$key} = $value;
}
}
/**
* Defined by ArrayAccess interface
* Return a value given it's key e.g. echo $A['title'];
* @param mixed key (string or integer)
* @return mixed value
*/
function offsetGet($key) {
if ( array_key_exists($key,get_object_vars($this)) ) {
return $this->{$key};
}
}
/**
* Defined by ArrayAccess interface
* Unset a value by it's key e.g. unset($A['title']);
* @param mixed key (string or integer)
* @return void
*/
function offsetUnset($key) {
if ( array_key_exists($key,get_object_vars($this)) ) {
unset($this->{$key});
}
}
/**
* Defined by ArrayAccess interface
* Check value exists, given it's key e.g. isset($A['title'])
* @param mixed key (string or integer)
* @return boolean
*/
function offsetExists($offset) {
return array_key_exists($offset,get_object_vars($this));
}
}
使用方法如下:
// Create the object
$A = new Article('SPL Rocks','Joe Bloggs', 'PHP');
// Check what it looks like
echo 'Initial State:<div>';
print_r($A);
echo '</div>';
// Change the title using array syntax
$A['title'] = 'SPL _really_ rocks';
// Try setting a non existent property (ignored)
$A['not found'] = 1;
// Unset the author field
unset($A['author']);
// Check what it looks like again
echo 'Final State:<div>';
print_r($A);
echo '</div>';
运行结果如下:
Initial State: Article Object ( [title] => SPL Rocks [author] => Joe Bloggs [category] => PHP ) Final State: Article Object ( [title] => SPL _really_ rocks [category] => PHP )
可以看到,$A虽然是一个object,但是完全可以像array那样操作。
你还可以在读取数据时,增加程序内部的逻辑:
function offsetGet($key) {
if ( array_key_exists($key,get_object_vars($this)) ) {
return strtolower($this->{$key});
}
}
5. IteratorAggregate界面
但是,虽然$A可以像数组那样操作,却无法使用foreach遍历,除非部署了前面提到的Iterator界面。
另一个解决方法是,有时会需要将数据和遍历部分分开,这时就可以部署IteratorAggregate界面。它规定了一个getIterator()方法,返回一个使用Iterator界面的object。
还是以上一节的Article类为例:
class Article implements ArrayAccess, IteratorAggregate {
/**
* Defined by IteratorAggregate interface
* Returns an iterator for for this object, for use with foreach
* @return ArrayIterator
*/
function getIterator() {
return new ArrayIterator($this);
}
使用方法如下:
$A = new Article('SPL Rocks','Joe Bloggs', 'PHP');
// Loop (getIterator will be called automatically)
echo 'Looping with foreach:<div>';
foreach ( $A as $field => $value ) {
echo "$field : $value<br>";
}
echo '</div>';
// Get the size of the iterator (see how many properties are left)
echo "Object has ".sizeof($A->getIterator())." elements";
显示结果如下:
Looping with foreach: title : SPL Rocks author : Joe Bloggs category : PHP Object has 3 elements
6. RecursiveIterator界面
这个界面用于遍历多层数据,它继承了Iterator界面,因而也具有标准的current()、key()、next()、 rewind()和valid()方法。同时,它自己还规定了getChildren()和hasChildren()方法。The getChildren() method must return an object that implements RecursiveIterator.
7. SeekableIterator界面
SeekableIterator界面也是Iterator界面的延伸,除了Iterator的5个方法以外,还规定了seek()方法,参数是元素的位置,返回该元素。如果该位置不存在,则抛出OutOfBoundsException。
下面是一个是实例:
<?php
class PartyMemberIterator implements SeekableIterator
{
public function __construct(PartyMember $member)
{
// Store $member locally for iteration
}
public function seek($index)
{
$this->rewind();
$position = 0;
while ($position < $index && $this->valid()) {
$this->next();
$position++;
}
if (!$this->valid()) {
throw new OutOfBoundsException('Invalid position');
}
}
// Implement current(), key(), next(), rewind()
// and valid() to iterate over data in $member
}
?>
8. Countable界面
这个界面规定了一个count()方法,返回结果集的数量。
第三部分 SPL Classes
9. SPL的内置类
SPL除了定义一系列Interfaces以外,还提供一系列的内置类,它们对应不同的任务,大大简化了编程。
查看所有的内置类,可以使用下面的代码:
<?php
// a simple foreach() to traverse the SPL class names
foreach(spl_classes() as $key=>$value)
{
echo $key.' -> '.$value.'<br />';
}
?>
10. DirectoryIterator类
这个类用来查看一个目录中的所有文件和子目录:
<?php
try{
/*** class create new DirectoryIterator Object ***/
foreach ( new DirectoryIterator('./') as $Item )
{
echo $Item.'<br />';
}
}
/*** if an exception is thrown, catch it here ***/
catch(Exception $e){
echo 'No files Found!<br />';
}
?>
查看文件的详细信息:
<table>
<?php
foreach(new DirectoryIterator('./' ) as $file )
{
if( $file->getFilename() == 'foo.txt' )
{
echo '<tr><td>getFilename()</td><td> '; var_dump($file->getFilename()); echo '</td></tr>';
echo '<tr><td>getBasename()</td><td> '; var_dump($file->getBasename()); echo '</td></tr>';
echo '<tr><td>isDot()</td><td> '; var_dump($file->isDot()); echo '</td></tr>';
echo '<tr><td>__toString()</td><td> '; var_dump($file->__toString()); echo '</td></tr>';
echo '<tr><td>getPath()</td><td> '; var_dump($file->getPath()); echo '</td></tr>';
echo '<tr><td>getPathname()</td><td> '; var_dump($file->getPathname()); echo '</td></tr>';
echo '<tr><td>getPerms()</td><td> '; var_dump($file->getPerms()); echo '</td></tr>';
echo '<tr><td>getInode()</td><td> '; var_dump($file->getInode()); echo '</td></tr>';
echo '<tr><td>getSize()</td><td> '; var_dump($file->getSize()); echo '</td></tr>';
echo '<tr><td>getOwner()</td><td> '; var_dump($file->getOwner()); echo '</td></tr>';
echo '<tr><td>$file->getGroup()</td><td> '; var_dump($file->getGroup()); echo '</td></tr>';
echo '<tr><td>getATime()</td><td> '; var_dump($file->getATime()); echo '</td></tr>';
echo '<tr><td>getMTime()</td><td> '; var_dump($file->getMTime()); echo '</td></tr>';
echo '<tr><td>getCTime()</td><td> '; var_dump($file->getCTime()); echo '</td></tr>';
echo '<tr><td>getType()</td><td> '; var_dump($file->getType()); echo '</td></tr>';
echo '<tr><td>isWritable()</td><td> '; var_dump($file->isWritable()); echo '</td></tr>';
echo '<tr><td>isReadable()</td><td> '; var_dump($file->isReadable()); echo '</td></tr>';
echo '<tr><td>isExecutable(</td><td> '; var_dump($file->isExecutable()); echo '</td></tr>';
echo '<tr><td>isFile()</td><td> '; var_dump($file->isFile()); echo '</td></tr>';
echo '<tr><td>isDir()</td><td> '; var_dump($file->isDir()); echo '</td></tr>';
echo '<tr><td>isLink()</td><td> '; var_dump($file->isLink()); echo '</td></tr>';
echo '<tr><td>getFileInfo()</td><td> '; var_dump($file->getFileInfo()); echo '</td></tr>';
echo '<tr><td>getPathInfo()</td><td> '; var_dump($file->getPathInfo()); echo '</td></tr>';
echo '<tr><td>openFile()</td><td> '; var_dump($file->openFile()); echo '</td></tr>';
echo '<tr><td>setFileClass()</td><td> '; var_dump($file->setFileClass()); echo '</td></tr>';
echo '<tr><td>setInfoClass()</td><td> '; var_dump($file->setInfoClass()); echo '</td></tr>';
}
}
?>
</table>
除了foreach循环外,还可以使用while循环:
<?php
/*** create a new iterator object ***/
$it = new DirectoryIterator('./');
/*** loop directly over the object ***/
while($it->valid())
{
echo $it->key().' -- '.$it->current().'<br />';
/*** move to the next iteration ***/
$it->next();
}
?>
如果要过滤所有子目录,可以在valid()方法中过滤:
<?php
/*** create a new iterator object ***/
$it = new DirectoryIterator('./');
/*** loop directly over the object ***/
while($it->valid())
{
/*** check if value is a directory ***/
if($it->isDir())
{
/*** echo the key and current value ***/
echo $it->key().' -- '.$it->current().'<br />';
}
/*** move to the next iteration ***/
$it->next();
}
?>
11. ArrayObject类
这个类可以将Array转化为object。
<?php
/*** a simple array ***/
$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');
/*** create the array object ***/
$arrayObj = new ArrayObject($array);
/*** iterate over the array ***/
for($iterator = $arrayObj->getIterator();
/*** check if valid ***/
$iterator->valid();
/*** move to the next array member ***/
$iterator->next())
{
/*** output the key and current array value ***/
echo $iterator->key() . ' => ' . $iterator->current() . '<br />';
}
?>
增加一个元素:
$arrayObj->append('dingo');
对元素排序:
$arrayObj->natcasesort();
显示元素的数量:
echo $arrayObj->count();
删除一个元素:
$arrayObj->offsetUnset(5);
某一个元素是否存在:
if ($arrayObj->offsetExists(3))
{
echo 'Offset Exists<br />';
}
更改某个位置的元素值:
$arrayObj->offsetSet(5, "galah");
显示某个位置的元素值:
12. ArrayIterator类echo $arrayObj->offsetGet(4);
这个类实际上是对ArrayObject类的补充,为后者提供遍历功能。
示例如下:
<?php
/*** a simple array ***/
$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');
try {
$object = new ArrayIterator($array);
foreach($object as $key=>$value)
{
echo $key.' => '.$value.'<br />';
}
}
catch (Exception $e)
{
echo $e->getMessage();
}
?>
ArrayIterator类也支持offset类方法和count()方法:
<ul>
<?php
/*** a simple array ***/
$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');
try {
$object = new ArrayIterator($array);
/*** check for the existence of the offset 2 ***/
if($object->offSetExists(2))
{
/*** set the offset of 2 to a new value ***/
$object->offSetSet(2, 'Goanna');
}
/*** unset the kiwi ***/
foreach($object as $key=>$value)
{
/*** check the value of the key ***/
if($object->offSetGet($key) === 'kiwi')
{
/*** unset the current key ***/
$object->offSetUnset($key);
}
echo '<li>'.$key.' - '.$value.'</li>'."n";
}
}
catch (Exception $e)
{
echo $e->getMessage();
}
?>
</ul>
13. RecursiveArrayIterator类和RecursiveIteratorIterator类
ArrayIterator类和ArrayObject类,只支持遍历一维数组。如果要遍历多维数组,必须先用RecursiveIteratorIterator生成一个Iterator,然后再对这个Iterator使用RecursiveIteratorIterator。
<?php
$array = array(
array('name'=>'butch', 'sex'=>'m', 'breed'=>'boxer'),
array('name'=>'fido', 'sex'=>'m', 'breed'=>'doberman'),
array('name'=>'girly','sex'=>'f', 'breed'=>'poodle')
);
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $key=>$value)
{
echo $key.' -- '.$value.'<br />';
}
?>
14. FilterIterator类
FilterIterator类可以对元素进行过滤,只要在accept()方法中设置过滤条件就可以了。
示例如下:
<?php
/*** a simple array ***/
$animals = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'NZ'=>'kiwi', 'kookaburra', 'platypus');
class CullingIterator extends FilterIterator{
/*** The filteriterator takes a iterator as param: ***/
public function __construct( Iterator $it ){
parent::__construct( $it );
}
/*** check if key is numeric ***/
function accept(){
return is_numeric($this->key());
}
}/*** end of class ***/
$cull = new CullingIterator(new ArrayIterator($animals));
foreach($cull as $key=>$value)
{
echo $key.' == '.$value.'<br />';
}
?>
下面是另一个返回质数的例子:
<?php
class PrimeFilter extends FilterIterator{
/*** The filteriterator takes a iterator as param: ***/
public function __construct(Iterator $it){
parent::__construct($it);
}
/*** check if current value is prime ***/
function accept(){
if($this->current() % 2 != 1)
{
return false;
}
$d = 3;
$x = sqrt($this->current());
while ($this->current() % $d != 0 && $d < $x)
{
$d += 2;
}
return (($this->current() % $d == 0 && $this->current() != $d) * 1) == 0 ? true : false;
}
}/*** end of class ***/
/*** an array of numbers ***/
$numbers = range(212345,212456);
/*** create a new FilterIterator object ***/
$primes = new primeFilter(new ArrayIterator($numbers));
foreach($primes as $value)
{
echo $value.' is prime.<br />';
}
?>
15. SimpleXMLIterator类
这个类用来遍历xml文件。
示例如下:
<?php
/*** a simple xml tree ***/
$xmlstring = <<<XML
<?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
<document>
<animal>
<category id="26">
<species>Phascolarctidae</species>
<type>koala</type>
<name>Bruce</name>
</category>
</animal>
<animal>
<category id="27">
<species>macropod</species>
<type>kangaroo</type>
<name>Bruce</name>
</category>
</animal>
<animal>
<category id="28">
<species>diprotodon</species>
<type>wombat</type>
<name>Bruce</name>
</category>
</animal>
<animal>
<category id="31">
<species>macropod</species>
<type>wallaby</type>
<name>Bruce</name>
</category>
</animal>
<animal>
<category id="21">
<species>dromaius</species>
<type>emu</type>
<name>Bruce</name>
</category>
</animal>
<animal>
<category id="22">
<species>Apteryx</species>
<type>kiwi</type>
<name>Troy</name>
</category>
</animal>
<animal>
<category id="23">
<species>kingfisher</species>
<type>kookaburra</type>
<name>Bruce</name>
</category>
</animal>
<animal>
<category id="48">
<species>monotremes</species>
<type>platypus</type>
<name>Bruce</name>
</category>
</animal>
<animal>
<category id="4">
<species>arachnid</species>
<type>funnel web</type>
<name>Bruce</name>
<legs>8</legs>
</category>
</animal>
</document>
XML;
/*** a new simpleXML iterator object ***/
try {
/*** a new simple xml iterator ***/
$it = new SimpleXMLIterator($xmlstring);
/*** a new limitIterator object ***/
foreach(new RecursiveIteratorIterator($it,1) as $name => $data)
{
echo $name.' -- '.$data.'<br />';
}
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
new RecursiveIteratorIterator($it,1)表示显示所有包括父元素在内的子元素。
显示某一个特定的元素值,可以这样写:
<?php
try {
/*** a new simpleXML iterator object ***/
$sxi = new SimpleXMLIterator($xmlstring);
foreach ( $sxi as $node )
{
foreach($node as $k=>$v)
{
echo $v->species.'<br />';
}
}
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
相对应的while循环写法为:
<?php
try {
$sxe = simplexml_load_string($xmlstring, 'SimpleXMLIterator');
for ($sxe->rewind(); $sxe->valid(); $sxe->next())
{
if($sxe->hasChildren())
{
foreach($sxe->getChildren() as $element=>$value)
{
echo $value->species.'<br />';
}
}
}
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
最方便的写法,还是使用xpath:
<?php
try {
/*** a new simpleXML iterator object ***/
$sxi = new SimpleXMLIterator($xmlstring);
/*** set the xpath ***/
$foo = $sxi->xpath('animal/category/species');
/*** iterate over the xpath ***/
foreach ($foo as $k=>$v)
{
echo $v.'<br />';
}
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
下面的例子,显示有namespace的情况:
<?php /*** a simple xml tree ***/ $xmlstring = <<<XML <?xml version = "1.0" encoding="UTF-8" standalone="yes"?> <document xmlns:spec=" [example.org] <animal> <category id="26"> <species>Phascolarctidae</species> <spec:name>Speed Hump</spec:name> <type>koala</type> <name>Bruce</name> </category> </animal> <animal> <category id="27"> <species>macropod</species> <spec:name>Boonga</spec:name> <type>kangaroo</type> <name>Bruce</name> </category> </animal> <animal> <category id="28"> <species>diprotodon</species> <spec:name>pot holer</spec:name> <type>wombat</type> <name>Bruce</name> </category> </animal> <animal> <category id="31"> <species>macropod</species> <spec:name>Target</spec:name> <type>wallaby</type> <name>Bruce</name> </category> </animal> <animal> <category id="21"> <species>dromaius</species> <spec:name>Road Runner</spec:name> <type>emu</type> <name>Bruce</name> </category> </animal> <animal> <category id="22"> <species>Apteryx</species> <spec:name>Football</spec:name> <type>kiwi</type> <name>Troy</name> </category> </animal> <animal> <category id="23"> <species>kingfisher</species> <spec:name>snaker</spec:name> <type>kookaburra</type> <name>Bruce</name> </category> </animal> <animal> <category id="48"> <species>monotremes</species> <spec:name>Swamp Rat</spec:name> <type>platypus</type> <name>Bruce</name> </category> </animal> <animal> <category id="4"> <species>arachnid</species> <spec:name>Killer</spec:name> <type>funnel web</type> <name>Bruce</name> <legs>8</legs> </category> </animal> </document> XML; /*** a new simpleXML iterator object ***/ try { /*** a new simpleXML iterator object ***/ $sxi = new SimpleXMLIterator($xmlstring); $sxi-> registerXPathNamespace('spec', 'http://www.exampe.org/species-title'); /*** set the xpath ***/ $result = $sxi->xpath('//spec:name'); /*** get all declared namespaces ***/ foreach($sxi->getDocNamespaces('animal') as $ns) { echo $ns.'<br />'; } /*** iterate over the xpath ***/ foreach ($result as $k=>$v) { echo $v.'<br />'; } } catch(Exception $e) { echo $e->getMessage(); } ?>
增加一个节点:
<?php
$xmlstring = <<<XML
<?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
<document>
<animal>koala</animal>
<animal>kangaroo</animal>
<animal>wombat</animal>
<animal>wallaby</animal>
<animal>emu</animal>
<animal>kiwi</animal>
<animal>kookaburra</animal>
<animal>platypus</animal>
<animal>funnel web</animal>
</document>
XML;
try {
/*** a new simpleXML iterator object ***/
$sxi = new SimpleXMLIterator($xmlstring);
/*** add a child ***/
$sxi->addChild('animal', 'Tiger');
/*** a new simpleXML iterator object ***/
$new = new SimpleXmlIterator($sxi->saveXML());
/*** iterate over the new tree ***/
foreach($new as $val)
{
echo $val.'<br />';
}
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
增加属性:
<?php
$xmlstring =<<<XML
<?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
<document>
<animal>koala</animal>
<animal>kangaroo</animal>
<animal>wombat</animal>
<animal>wallaby</animal>
<animal>emu</animal>
<animal>kiwi</animal>
<animal>kookaburra</animal>
<animal>platypus</animal>
<animal>funnel web</animal>
</document>
XML;
try {
/*** a new simpleXML iterator object ***/
$sxi = new SimpleXMLIterator($xmlstring);
/*** add an attribute with a namespace ***/
$sxi->addAttribute('id:att1', 'good things', 'urn::test-foo');
/*** add an attribute without a namespace ***/
$sxi->addAttribute('att2', 'no-ns');
echo htmlentities($sxi->saveXML());
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
16. CachingIterator类
这个类有一个hasNext()方法,用来判断是否还有下一个元素。
示例如下:
<?php
/*** a simple array ***/
$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');
try {
/*** create a new object ***/
$object = new CachingIterator(new ArrayIterator($array));
foreach($object as $value)
{
echo $value;
if($object->hasNext())
{
echo ',';
}
}
}
catch (Exception $e)
{
echo $e->getMessage();
}
?>
17. LimitIterator类
这个类用来限定返回结果集的数量和位置,必须提供offset和limit两个参数,与SQL命令中limit语句类似。
示例如下:
<?php
/*** the offset value ***/
$offset = 3;
/*** the limit of records to show ***/
$limit = 2;
$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');
$it = new LimitIterator(new ArrayIterator($array), $offset, $limit);
foreach($it as $k=>$v)
{
echo $it->getPosition().'<br />';
}
?>
另一个例子是:
<?php
/*** a simple array ***/
$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');
$it = new LimitIterator(new ArrayIterator($array));
try
{
$it->seek(5);
echo $it->current();
}
catch(OutOfBoundsException $e)
{
echo $e->getMessage() . "<br />";
}
?>
18. SplFileObject类
这个类用来对文本文件进行遍历。
示例如下:
<?php
try{
// iterate directly over the object
foreach( new SplFileObject("/usr/local/apache/logs/access_log") as $line)
// and echo each line of the file
echo $line.'<br />';
}
catch (Exception $e)
{
echo $e->getMessage();
}
?>
返回文本文件的第三行,可以这样写:
<?php
try{
$file = new SplFileObject("/usr/local/apache/logs/access_log");
$file->seek(3);
echo $file->current();
}
catch (Exception $e)
{
echo $e->getMessage();
}
?>
[参考文献]
1. Introduction to Standard PHP Library (SPL), By Kevin Waterson
2. Introducing PHP 5's Standard Library, By Harry Fuecks
3. The Standard PHP Library (SPL), By Ben Ramsey
4. SPL - Standard PHP Library Documentation
(完)
Amoeba 座落与Client、Database Server(s)之间。 具有负载均衡、高可用性、sql过滤、可承受高并发、读写分离、Query Route(解析sql query语句,并且根据条件与预先设定的规则,请求到指定的目标数据库。可并发请求多台数据库合并结果)、对客户端透明。
主要降低 数据切分带来的复杂多数据库结构、数据切分规则 给应用带来的影响,能够轻易实现:
这个和mysql proxy是有一些差别的,按照其作者的说法为:“在 mysql proxy 上面如果想要读写分离并且 读集群、写集群 机器比较多情况下,用mysql proxy 需要相当大的工作量,目前mysql proxy没有现成的 lua脚本。mysql proxy根本没有配置文件,lua脚本就是它的全部,当然可以是相当方便的。那么同样这种东西需要编写大量的lua脚本才能完成一个复杂的配置“
按照其说明文档中的”Amoeba:分布式数据库Proxy解决“说法,其主要也就扮演proxy的角色,目前已经发布了对mysql的proxy功能,其主要是为了支持分布式的DB系统,从读写、数据切分几个方面,来做到负载均衡并伴有故障转移等功能。
想法好似很好的,但是其文 [www.sourceforge.net] 法下载,没时间尝试,有时间可以再试试。
参考文档:
自从去年秋天和teacher舒确定写欧阳春,采访了好几次,总找不着感觉,和写艺术大腕的生活状态不同,让我犯难的是,他是一个新人,之前很少出现在媒体上,如何能在有限的字数之内,让人觉得他值得关注,为什么不是选择别人,而是选择他?而他的作品并不能一目了然地回答这些问题。喜欢的人特喜欢,不喜欢的人说,什么呀,儿童画嘛。 我喜欢他的画,但公共性的文章,我不想太依赖自己的判断。
对他的观察、访问一直持续了半年,直到这个晚春,欧阳春的事业春意盎然,他的“无穷柱”展出了,“捕鲸记”个展展出了,看着他一步步地实现了半年前跟我描述的ideas,我想是时机了。另外一个原因,和我想追求的采访风格有关,vogue杂志上经常有一些很棒的人物专访,比如近期关于calvin klein的那篇,作者说,我认识ck六年,这个采访我做了两年;还有写sienna miller那篇,作者跟着她在伦敦逛商店,去哪儿买了什么,后来跟着她飞去纽约,周一干什么周二干什么,当时她正在准备《工厂女郎》中的角色,在纽约拜会关键当事人,理解这位演员的核心就蕴含在作者有所选择的日记中。。。我就是想写一些这样的文章。
小文中一句话“每过一段时间去他的画室,都有风格迥异的几幅新作出现。”是从西郊到宋庄用车轮子一趟趟量出来的。一句带过,三联管这样的文章叫做“高成本文章”,既然有专有名词,就说明不是我一个人在做。比如采访某人4个小时,最后只用了他一句话。有时遇到很逊的采访对象,说一些冠冕堂皇自鸣得意的话,你知道没法用,可也不好意思驳他。后来和欧阳聊熟了,我可以说“我不要你刚才说的那些,太媒体了,你重说一下吧。”“刚才你的话。。。到底想表达什么?”就跟洗面筋似的,最后剩下的都比较筋道,这是假以时日才可以做到。不过考虑到收成,尚只能把这样的文章当作一个书与人栏目之外的副业来写。
并不是说采访花得时间越多越最好,只是我对第一次采访的陌生人是万万不敢这样,这是我的弱项。欧阳春本身并不是盛气凌人的人,尽管他现在已经是个成功的青年艺术家。他甚至也不太有媒体经验,渐渐对我的记者身份失去了防范,当然如果把我们每个人的社会外衣和面具剥掉,我们就成了脆弱的婴儿,所以还得给他留些衣服。欧阳不混圈子,在同龄艺术家中,他的思想让我觉得比较有意思,但文中也只用了他几句话,是因为是在篇幅有限。他虽然过着画痴般的单调生活,却是个很丰富的人,考虑到读者,只好抓所谓最重要的部分,生活工作状态等。不过,打算把对话录音整理出万把字的问答,以后用在别的地方。
我很难从学术角度评论他,但是在艺术史上找到一个参照物,就是Jean-Michel Basquiat,尽管文中并没有拿他们做比较(我觉得这很没意思),但Basquiat的艺术帮助我更加理解欧阳春。不过他们在艺术家之路上走得很不一样,欧阳更有计划和野心,也不像Basquiat那么脆弱。
欧阳春少年时代经历在我这样的人听来觉得很复杂,但我觉得复杂也很好呀,这可以让他在市场中有能力保护自己。我很欣赏的是,他不说是艺术改造了我,他很真挚地说,是劳动改造了我。他把最新画的《缅怀暴虐的王和无畏的刺客》抬出来拼好给我看,平时他都藏着,我一抬真是沉哪,他说他平时自己绷画框、搬画把自己练成了一个体力劳动者。当然写字也是,我每次写稿子中间都特容易饿。
相对看展览,我更喜欢参观艺术家的工作室,当然你可以提前见到既将在他们艺术史上划上一笔的未完成未公开的作品,不过对报道来说我不认为这是最重要的,重要的是房子里面有他的人生。欧阳春指着老画室的暖气片说,我刚来北京的时候,在旁边的床垫上睡了一年。上周去参观XGZ搬到1号地以后的工作室,又被雷到了,尽管艺术家很giant的工作室也见过一些,“如篮球场般”的形容都已经成了cliche,但这次又超越了,超过你对满足一个画家功能性的工作室的想象。回来后随便记记就写了小两千字,仅场景描述,我想我应该算是个善于观察细节的人,尚觉得其乐无穷。
方军商业日记 2008年7月8日
21世纪报系×红粉笔、爱心操场、典藏中国
社会企业地图-No.008
由媒体发起的企业公益行动,21世纪报系(以《21世纪经济报道》为主体)所推行的红粉笔乡村教育计划、“爱心操场・红遍中国”乡村学校体育支教计划、小桔灯乡村小学图书馆计划等是比较优秀的一组。最近,它展开以“平衡,可持续”为主题的最佳企业公民评选,它以如下这样的口号展示自己:“21世纪报系倡导‘企业公民’五周年;道德与能力共进,责任与利益双赢”。这一系列公益行动是由“21世纪报系|公益行动组”所实际运作的。
这一系列企业公益行动中,最为知名的是“红粉笔乡村教育计划”,它的理念是“素质教育.启迪心智”。它的介绍说,“红粉笔乡村教育计划”是为中国商务人士度身定制的公益活动。“红粉笔乡村教育计划”通过号召和组织受过良好教育的商务人士到乡村学校支教,致力于帮助改善偏远地区师资力量薄弱的状况,推动当地教育事业的发展,从而促进当地社会的可持续发展。雪佛兰品牌汽车是这一活动的长期冠名赞助商。
“到乡村去,建一座公益图书馆”,是小桔灯乡村小学图书馆计划的号召,这个项目是21世纪报系为中国平安量身定制的。它是一项旨给乡村孩子提供良性的阅读环境,培养他们对阅读、对知识的兴趣,提升综合素质的公益活动。它的做法是号召社会广泛人群捐赠旧书,并招募志愿者协助完成图书募集。同时在学校建立小桔灯读书会,由志愿者与当地老师结对辅导孩子们进行课外阅读。类似的,21世纪报系还有国家电网独家支持的“绿色畅想・21世纪大学生环保公益大赛”,它的主题是“世界和你的无限可能”;“爱心操场,红动中国”乡村学校体育支教计划则是为招商银行定制的,它今年的主题是“提升身体素质,培养奥运精神”。
中国最佳企业公民评选则是一个平台性的项目,通过评选凸显优秀的企业公民。与之相关的项目有中国企业公民行为评价体系、“中国最佳企业公民评价指数”、“21世纪企业公民促进联盟”等。2007年度的中国最佳企业公民榜单有3M中国、万科、利乐中国等30家企业。
“点藏中国・中华非物质文化遗产推广计划”则是21世纪报系公益行动中少有的文化类活动,它的主题是“寻访文化遗产重建精神家园”。它的介绍说:“活动将联合政府机构、专家学者、著名厂商、文化机构、公众媒体,共同探讨对中国传统文化的挖掘与保护、促进与弘扬、开发与利用、推广与表现、宣传与展示。深入传统文化集中的地区进行实地考察研究,促进当地传统文化资源的保护利用与经济开发,展开中国传统文化的普及教育和学术推广,收集整理优秀的传统文化作品和研究成果向全国和世界宣传推广,加强与世界的文化交流,向世界展示中国优秀的传统文化,推动中国的优秀文化遗产申请世界文化遗产。”
21世纪报系的公益行动,总体看有这样四个特点:第一,人群重点放在企业与商务人士,关注焦点主要是乡村教育;第二,它的公益行动给赞助商留出了空间,甚至在自己熟悉的领域(乡村教育)为赞助商定制公益项目;第三,把重点放在自身媒体熟悉的企业领域,推动企业公民,并通过评选的方式调动更多企业参与;第四,项目架构、理念设计、VI设计都很好,也是高标准的商业化运作。
在这些项目中,21世纪报系的主要付出是它的冗余广告版面,而非它的活动组织。《21世纪经济报道》从一周一期到两期、三期、五期,出现大量没有销售出去的广告版面,通过以冗余广告版面开展公益行动,对它来说一举多得。凤凰卫视大量运用自身的冗余广告资源推广自己的节目和主持人,21世纪则是用广告资源开展公益推广自身品牌。
关键词:21世纪报系,红粉笔乡村教育计划,小桔灯乡村小学图书馆计划,中国最佳企业公民评选,点藏中国・中华非物质文化遗产推广计划
项目网站: [www.21cbh.com] (21世纪品牌活动网页)

(C)版权所有 请勿转载
了解固然重要,了解却不理解则毫无意义。方军商业日记(BDAILY),每周一至周五出版,与你一起理解纷繁复杂的商业世界。
附录:21世纪报系|公益行动组

红粉笔乡村教育计划 “素质教育,启迪心智”
中国最佳企业公民评选 “平衡,可持续”

点藏中国・中华非物质文化遗产推广计划 “寻访文化遗产重建精神家园”

绿色畅想・21世纪大学生环保公益大赛 “世界和你的无限可能”

小桔灯乡村小学图书馆计划 “到乡村去,建一座公益图书馆”

"爱心操场,红动中国"乡村学校体育支教计划 “提升身体素质,培养奥运精神”
『数学ガール/フェルマーの最終定理』の無料プレゼントの抽選を行いました。 当選した方へはすでにメールをお送りして住所をおたずねしています。 ご確認ください!
はずれてしまったかた、ごめんなさいね…。
最終応募数は139名でした。 毎度恒例(?)になっていますけれど、応募期間の最終日の真夜中直前の応募がとても多かったです。 23時50分台に5人応募。最終応募者は23:59:15という…。 ともあれ、多数のご応募・応援ありがとうございました!
* * *
…さて。
書籍『数学ガール/フェルマーの最終定理』が店頭に並ぶのは今月末、都内では7月30日(もしかしたら31日かも)と思います。 現在アマゾンでは予約可能な状態になっています。
繰り返しになりますが、 多数のご応募をありがとうございました。 とっても多くの方が「はずれても買います」や「すでにショッピングカートには入れています」と書いてくださっていて、 なんだか、ほんとうに、ありがとうございます…。 今月末の発売をどうぞお楽しみに!