RECORDING MY FANTASY

Friday, April 27, 2007

米兰频道上线YOUTUBE

2007/3/30
A.C.米兰俱乐部的官方电视台米兰频道宣布在YOUTUBE网站上设立专属频道。这将是与YOUTUBE签署合约的第一家意大利电视台。

观众遍世界
2007/3/30 13:03:00

米兰频道成为了这个星球上第一个在Youtube网站上播出的意大利电视频道。米兰频道的网址是www.youtube.com/milanchannel。

A.C.米兰俱乐部的官方电视台米兰频道宣布在YOUTUBE网站上设立专属频道。这将是与YOUTUBE签署合约的第一家意大利电视台。

全世界都可以通过访问www.youtube.com/milanchannel 这个网址来观看米兰频道的特别版,其中将包括日常新闻剪辑,特别片段,独家视频和“米兰经典”内容,节目将以意大利语和英语的双语形式播出。

观众将有机会以多种形式与其他人互动,如投票,评论内容及向朋友发送自己喜爱的视频。他们还可以直接与米兰频道联系,发表自己对视频节目的意见。

“作 为第一家与YouTube合作的意大利频道,我们感到很自豪,”米兰频道主席里卡多.席尔瓦说道。“米兰频道再一次确认了自己是意大利最受欢迎的足球俱乐 部主题频道,在Sky电视台和全世界拥有55,000注册订阅用户。凭借无数的国际转播协议,米兰频道的节目在23个外国频道播出,涵盖了世界48国。 YouTube的社区每天都有数以千万计的视频节目被收看,与他们合作将借助互联网的力量吧把米兰频道在世界范围内的观众群进一步扩大。”

“米兰频道在YouTube上播出是个证明,”AC米兰商业和市场副总裁劳拉.马西说道,“它证明了俱乐部的成功策略,即通过互联网和内容的国际转播合约来真正的实现与我们球迷的实质性接触。”

Thursday, April 12, 2007

世界第9大奇迹-西直门立交桥

一名北京交警的自述
  大家好!俺是一名交警--不,应该说曾经是一名交警。俺现在已经辞职不干了,俺当了八年交警,立过五次一等功,九次二等功。可是俺前两天辞职不干了,因为领导要派俺去西直门。
   西直门刚改造好的时候,马师傅被派去负责那里,大伙儿都挺羡慕他,因为那是北京最气派的立交桥。可是过了仨月,局里接连接到投诉,说马师傅业务不熟练, 乱指路。想去安定门的让他给指到了动物园,想去动物园的让他给指到了蓟门桥,想去蓟门桥的让他给指到了金融街……最夸张的是有一位司机哭诉说他想去八达岭 长城,按马师傅说的一直走结果到了保定。局里把马师傅调离了西直门,可是马师傅多倔呀,每天一下班儿就骑着自行车到西直门一通绕,非要把这路都搞清楚不 可。后来局里让他休假了,他就干脆整天泡在西直门,一边儿绕圈儿一边嘴里念念有词……直到他搬进安定医院(精神病医院)我们都不知道他嘴里念叨什么呢。
   马师傅调离之后,牛师傅接了他的班儿。要说牛师傅不愧是业务骨干,就是心细,他花了几个月时间把西直门摸了个透熟,熬了几十个晚上练习画图。后来,甭管 谁问路,他掏出纸笔几分钟就把路线图画出来了。后来他被北大数学系一位老教授请走了,说他解决了数学界一大难题--徒手绘制七元八次方程组的解集图。他被 请去给全国各地数学系讲课。牛师傅哪儿会讲课呀,他只会画图,上来就画,黑板画满了就往墙上画,教室里画,家里画,白天画,晚上画……后来安定医院所有的 白墙也都让他画满了--除了马师傅那间病房,因为马师傅一看见牛师傅画的图就浑身哆嗦。
  牛师傅之后,小杨师傅接了班儿。一天,他正在指挥交 通,一转身儿,看见那边桥底下停着一辆汽车,司机坐在车里东张西望。小杨师傅有点儿纳闷儿,因为他印象里好像从来没在这个位置看见有车,今儿头一回,这司 机还怪模怪样。小杨便走过去,让司机赶紧把车开走,司机死活不走,说他只要一动就违章。小杨四下一看,可不。前面桥上挂着禁止驶入,地上画着左转线,可是 一旦左转就是逆行,右转呢?不行,也是禁止驶入。那就掉头吧?嘿,人家都替你想到了,左边就戳着个禁止调头的牌子。那也不能就这么停着呀,因为右边还立着 个前后200米内禁止停车的牌子。小杨问司机是怎么开到这儿来的,司机说刚才在路口地面标线和路边的指示牌不一致,他就按地面标线开,结果就开到这儿来 了。小杨发了一会儿呆,用步话机通知了附近的同事,然后他自己骑着摩托车直接就开进了安定医院,说什么也不出来了。
  小杨之后,局里就派俺来接 班儿。对了,俺姓朱,叫俺小朱好了。俺在西直门呆了一天,就知道这不是人干的活儿,赶紧托人找工作。没过几天,一哥们儿给介绍了西城环卫局的一份儿工作, 俺立马辞了职,到清洁队报到去了。俺负责一段儿长安街的保洁工作,干了两天,感觉好极了!俺每天把清洁车往路边儿一搁,然后就坐在马路牙子上看着川流不息 的车,又宽又直的马路,心里这叫一个痛快。在西直门呆久了,差点儿认为汽车都是爬着走的呢。看着看着,俺不知不觉高兴得都笑出声儿了。 昨天,上头领导来检查工作,检查到俺这儿,俺正坐在马路牙子上看着车流笑呢,领导刚要发火儿,俺们队长赶紧小声说:他就是那个西直门……那个交警……领导 立马多云转晴,微笑着对俺说:小朱啊,汽车好玩儿吗?俺白了他一眼,又吐了他一口吐沫,没搭理他。切,当俺是傻子呀,俺能没见过汽车吗?俺也当过交警呢, 西直门交警。

Friday, April 06, 2007

在北京航空馆门口的花


flower 花, originally uploaded by minjun_buaa.

今天天气真不错,上午开始晴晴的天,过会就有一片片的白云了;暖暖的风吹着,感觉到春天(夏天?)真的来了。^_^

中午的时候拿着数码相机出去拍了几张照片。
这一张是在北京航空馆门口拍的,这花正开着,很好看;不像周围的一些花的花期早,叶子都开始败了。

Wednesday, April 04, 2007

Linux操作系统中i2c总线设备驱动程序的设计分析


原文是从http://www.cechinamag.com/bbs/showtopic.aspx?id=18445这个地址得到的。
我想了解的内容是 i2c总线的驱动程序的体系结构,

1。I2C总线
I2C 总线通过串行数据SDA 和串行时钟SCL线在连接到总线的器件间传递信息,每个器件都有一个唯一的地址识别。根据数据传输时的功能不同,把器件分为主机和从机。主机是初始化总线 的数据传输并产生允许传输的时钟信号的器件,通常是微控制器。此时,任何被寻址的器件都被认为是从机,例如LCD驱动器、E2PROM等。
这样看来,一般外接的都是被寻址的器件,应该是从机。
2。Linux中I2C总线驱动结构
Linux的I2C框架中各个部分的关系如图所示:

内核中I2C相关代码可以分为三个层次:
1. I2C core框架:提供了核心数据结构的定义和相关接口函数,用来实现I2C适配器驱动和设备驱动的注册、注销管理,以及I2C通信方法上层的、与具体适配器无关的代码,为系统中每个I2C总线增加相应的读写方法。

2. I2C总线适配器驱动:定义描述具体I2C总线适配器的i2c_adapter数据结构、实现在具体I2C适配器上的I2C总线通信方法,并由i2c_algorithm数据结构进行描述。

3. I2C 设备驱动:定义描述具体设备的i2c_client和可能的私有数据结构、借助I2C core提供的函数接口完成设备在内核的注册,并实现具体的功能,包括read, write以及ioctl等对用户层操作的接口。

总体而言,Linux中I2C总线的驱动分为两个部分:总线驱动(BUS)和设备驱动(DEVICE)。I2C core与I2C总线适配器驱动完成了硬件上的主机总线驱动(BUS),而I2C driver则实现了从机设备驱动。在设计中,I2C core提供的接口是统一的,不需要修改,我们只需要实现特定I2C总线适配器驱动和I2C设备驱动,这样大大提高了系统的可移植性。

Tuesday, April 03, 2007

函数指针 条款14

/*
* 条款14
* 函数指针
*
* 我们可以声明一个指向特定类型函数的指针
*/
void (*fp)(int);//指向函数的指针

/*括号是必不可少的,它表明fp是指向一个返回值为void的函数的指针*/

extern int f(int);

extern void g(long);

extern void h(int);
//...
fp = f; //错误!&f的类型为int (*)(int), 而不是void (*)(int);
fp = g; //错误!&g的类型为void (*)(long), 而不是void (*)(int);
fp = h; //正确!
fp = &h;//正确!
/* 将一个函数的地址初始化或者赋值给一个指向函数的指针的时候,无需显式地取得函数
* 地址,编译器知道隐式地获得函数的地址,因此这种情况下&是可省的,通常忽略不用
*/

/* 类似的,为了调用函数指针所指向的函数而对指针进行解引用操作也是没有必要的,编译
* 器可以帮你解引用
*/

(*fp)(12); //显式地解引用
fp(12); //隐式得解引用,结果相同

/* 和void *指针可以指向任何类型的数据不同,不存在可以指向任何类型函数的通用指针;
* 还要注意,非静态成员函数的地址不是一个指针,因此不可以将一个函数指针指向一个
* 非静态成员函数
*/

/* 函数指针的一个传统用法就是回调(callback).
* 一个回调就是一个可能的动作,这个动作在初始化阶段配置,以便在将来可能发生的事件进
* 行响应。打个比方,如果我们希望救火,那么最好在开始阶段就计划好如何做出反应
*/

extern void stopDropRoll();
inline void jumpIn();

//...
void (*fireAction)() = 0;

//...
if(!fatallist) {//如果你关心失火了
//那么设置适当的动作以防万一
if(nearWater)
fireAction = jumpIn;
else
fireAction = stopDropRoll;
}

/* 一旦决定了要执行的动作,代码中的令一部分就可以专注于是否以及何时去执行动作,而
* 无需关心这个动作是什么了
*/
if( ftemp >= 451 ) {//如果着火了
if(fireAction)
fireAction();//执行之
}
/* 注意,一个函数指针指向一个内联函数是合法的,然而,通过函数指针调用内联函数不会
* 导致内联式的函数调用;编译器只能生成间接的/非内联的函数代码
*/

/* 另外,函数指针持有个重载函数的地址也是合法的,指针的类型被用在各种不同的候选函数中
* 挑选最佳匹配的函数
*/
void jumpIn();
void jumpIn(bool canSwim);
//...
fireAction = jumpIn;

Monday, April 02, 2007

C++复制操作 条款13

/*
* copy_operations.cpp
* 1.复制构造和复制赋值是两种不同的操作;
* 但是,在类的实现中,它们需要被放在一起,同时出现并且需要兼容.
*/

class Impl;
class Handle {
public:
//...
Handle(const Handle& ); //复制构造函数
Handle &operator = (const Handle &); //复制赋值函数

void swap(Handle &);
//...
private:
Impl *impl_;
};
/*
* 2.复制操作如此深远,以至于总是被成对的声明,具有如上所示的签名
*/

/*
* 3.对于一个类来说,如果成员形式的swap实现具有性能或者安全的优势,那么定义
* 一个swap成员函数往往是一个非常好的主意。典型的wap实现是很直观的
*/
template <typename T>
void swap(T &a, T &b)
{
T tmp;
tmp = a;
a = b;
b = tmp;
}
/*
* 它是根据T类型的复制操作来进行定义,如果T的实现很简单,这种方式就会工作的很好;
* 但如果T是一个复杂而且庞大的类,这种方式就会导致很大的开销。对于Handle类这样的类,
* 我们有更好的方式,即交换指向各自实现的指针
*/

inline void Handle::swap(Handle &that)
{
std::swap(impl_, thta.impl_);
}
/*
* 对于句柄类来说,这项技术工作的尤其好。句柄类的全部或者部分实现就是由一个
* 指向其实现的指针构成的.因此,为其编写异常安全的swap非常简单,容易实现
*/

/*
* 4.对于复制赋值的实现来说,一个微妙之处在于,复制构造的行为必须和复制赋值的行为
* 兼容,尽管它们不是相同的操作,但是它们产生的结果不应该有区别。
* 当用标准容器时,这种要求更加严格,因为标准容器的实现通常用复制构造来替代复制赋值
* 当然也就期望两种操作产生一致的结果。
*/

/*
* 一个或许更为常见的复制赋值实现具有如下的结构
*/
Handle &Handle::operator = (const Handle& that)
{
if(this != &that) {
//赋值操作
}
return *this;
}
/*这种检查一般出于正确性和效率的考虑*/

4月1号愚人节。。。

愚人节真没有意思,为什么什么东西流传到中国就变味了呢?! 老是骗老实人,就算骗成功了的话也没有成就感阿!

愚人节真真假假的事情太多。

最大的事件就是赶在愚人节这天,把项目的代码给写完调通了,真不容易。

其次的大事件就是,我同学的老婆4月1号生了一个胖小子,这日子挑的..... -_-|