2010年6月28日星期一

容器格式 Container format

这是一个非常长期的计划,在hanyionet的博客中将陆续对“流媒体技术”的方方面面进行介绍。在这里我试图梳理一些重要的知识点,力求以最简单易懂的语言进行介绍,并且适度提供部分英文特殊名称,以便读者进行进一步的搜索。每篇文章都尽量精简,只对一个小的方面进行探讨,以前也写过一部分关于流媒体技术的文章,以后也会陆续收录到这个专栏里。

容器格式 Container format

一个多媒体容器格式是一种文件格式,它指定如何将数据存储在文件中。它并不指定数据应该如何编码。它也被称为meta-format,因为它不是只存储实际数据,而且描述了数据信息是如何在文件中存储。音频或视频流可以使用许多不同的算法进行编码,但它们只是在很少的几种文件格式中存储。
下图(来自互联网)体现了编解码器Codec和容器格式Container format的关系。

video-container

用于实际上编码/解码视听数据的算法称为编解码器。编解码器Codec是为编码器/解码器的简称。容器中的编解码器的头(Codec header)包含了非常重要的信息对于用来解码视频文件。例如,它描述了有关视频的帧的帧率,分辨率和编码算法等。音频/视频流解码总是根据在编解码器中的资料头结构。不同的容器格式会拥有不同的头结构(header structure)。

 

视频播放器先读取在容器文件编解码器的头信息,然后在视频播放器里找到对应分路器,并初始化将用于视频解码运行时播放视频流的适当的解码器。

 

现在大部分的编解码器信息不是被储存在文件的开头,就是被存储在文件的末尾,在播放视频的时候,作为头信息没有需要作任何的改变。这意味着每当视频播放器遇到一个新的视频文件,视频播放器必须读取头文件信息,然后初始化相应的解码器,最后解码和播放视频。这个过程会导致在视频播放的时候会产生几毫秒的延迟。这就是为什么我们不能播放两个单独视频文件,在同一个视频播放器实例,除非视频播放器同时提供了一个或多个缓冲区,或者相应功能的多个实例编解码器。

2010年6月27日星期日

数字视频 Digital Video

对“流媒体技术”有了一定的接触后,hanyionet现在开了一个“流媒体技术”的专栏。这是一个非常长期的计划,在hanyionet的博客中将陆续对“流媒体技术”的方方面面进行介绍。在这里我试图梳理一些重要的知识点,力求以最简单易懂的语言进行介绍,并且适度提供部分英文特殊名称,以便读者进行进一步的搜索。每篇文章都尽量精简,只对一个小的方面进行探讨,以前也写过一部分关于流媒体技术的文章,以后也会陆续收录到这个专栏里。

 

什么是流媒体技术,其实流媒体技术也称流式媒体技术。所谓流媒体技术就是把连续的影像流媒体技术和声音信息经过压缩处理后放上网站服务器,让用户一边下载一边观看、收听,而不要等整个压缩文件下载到自己的计算机上才可以观看的网络传输技术。在第一篇文章,我想介绍的是数字视频。

其实一个视频是由多个数据流组成。在每一个电影文件,至少有两个单独的数据流对于音频和视频。最常见的其中一个标准,用于视频编码就是我们所熟悉的MPEG。运动图像专家组(MPEG)是由国际标准组织(ISO)和International Electrotechinical Commission (IEC)成立。运动图像专家组(MPEG)负责界定和发展音像和其他多媒体内容的标准。

每个的MPEG编码视频的组成成分是连续Group of Pictures (GOPs),见下图。一个GOP还可能包含一个或全部的I-帧任何,P帧,B帧和D帧。I帧是Intra-frame的缩写形式,它被称为Intra-frame,因为它不依赖于任何其它帧它可以独立解码。I帧也称为关键帧。它们是类似的JPEGimage。当我们播放MPEG视频,寻找到其他视频位置的时候,它总是从开始最近的一帧。当然啦,一个视频的编码可以只使用I帧。这种压缩类型,通常是很快,但它会产生非常大的文件大小。两个I帧之间的非I帧的数目称为GOP的长度。通常,对于MPEG-1格式,GOP的大小通常为15至18,这意味着在两个I帧只间有15至18个非I帧。

Group of Pictures

P帧,为预测帧(Predicted-frames)的缩写,也称为forward-predicted frames。该P帧只包含有关和以前引用帧图像的差异,可以是一个I帧或其他P帧。因此,使用P帧的主要目的是为了提高压缩率。

双向帧,B帧,也称为backward-predicted frames向后预测帧。它们相当类似的P帧进行预测,但是B帧同时使用上一帧和下一帧的信息。在B帧被解码并显示之前,邻近的I帧或者P帧必须被解码。这使得B帧解码的计算相对比较复杂。因此,它们需要更大的数据缓冲区,以避免出现显示拖延现象。

D帧是一种特殊的帧类型,只在MPEG - 1标准的出现。它们没有使用在后来的MPEG视频标准。D帧是一个独立的图像,提供非常低的图像质量和数据大小。它仅用于视频的快速预览。

2010年6月22日星期二

不要“想当然”地编程

100_2891

本图和本文无关,摄于汉诺威动物园。

很久没有在“电子工程师乱弹编程”这个系列写一些东西,这个系列是我的一些关于编程“自爽文”的集合,今天有点时间,来写一个小小的编程体验。
今天下午又花了一大堆时间来找bug。
经过一番一番的跟踪才发现bug的程序代码。
找到bug后,又是一阵痛心疾首。

花了那么多的时间就是为了一个非常愚蠢的bug。
在代码中,我需要配长度为DEF_I_FRAME_BUFFER_SIZE字节的内存块。
DEF_I_FRAME_BUFFER_SIZE 长度为一个MPEG编码的I Frame的大小。
_last_buf = (uint8_t *)malloc(DEF_I_FRAME_BUFFER_SIZE);
我当时“想当然地”分配了200000。
自认为已经足够大了。

请看以下分析:
如果分辨率为500*500
使用了的是4:2:0 (YV12) --> 12 bit pro Pixel
8 Bit = 1 Byte
那么可以得到maximal frame size:
4:2:0 (YV12) --> 500*500*(12/8) = 375000 Byte = 0.375 MB
哈,就是这样,对于一个500*500一个帧也许会需要375000 Byte,就是这么简单。

“想当然”的足够大的size,就产生了一个愚蠢的bug。
使用malloc固然非常危险,但是最危险的是“想当然”的编程态度。
我常常不够谨慎地进行编程,一味求快。
这常常会出现很多思考的遗漏。
其实,在当时编这段愚蠢的代码的时候,自己问问自己,是这样吗?
如果自己的回答是不太确定,那么就去google一下,就像今天的例子,我当时只需要几分钟google一下,就可以分析出我所需要的buffer的大小。
然而,当时的“想当然”,就会产生后来的一个小时以上时间的浪费。

好了,最后再总结一下。

第一个经验为:
不要“想当然”地编程

第二个小小的经验为:
在动手找bug解决它的时候,一定一定要分析理解一下问题的本质。抓住问题的本质,根本,这很重要。
不要乱猜测bug的来源或者随意随机的修改,这肯定会让你的程序比找bug之前更糟糕。

2010年6月21日星期一

阅读和使用LIVE555的一些简单记录

行2 012

注意,此图和本文无关。图为以前拍的汉诺威动物园的企鹅。要了解正文请继续阅读。

最近继续看了看live555的代码,进行了一些具体的实验。
对live555的部分特性有了一定的了解。
稍微看了网上的一些关于live555的文章,千篇一律。
大部分都是转载自一个人的博客。
很少人进行一些实验或进行一些比较深入的代码阅读,然后写出一些其他的经验之谈。
我想应该是很多人都进行了代码阅读,理解了代码,但是就是懒的写一些东西吧。
这里自夸一下自己,哈,hanyionet真是大好人,大闲人。
这里我尽我自己一份小小的力,给大家写一些小小的经验之谈。如果有时间的话,我将写一些更多的文章关于live555。

以前在网上看到一个论坛有人问:
使用live555的testMpeg1or2VideoReceiver在其FrameSink的afterGettingFrame1(unsigned frameSize, struct timeval presentationTime) 接受的buffer是否是代表一个帧。
大概是这个问题。

当时看到没有太在意。
因为没有搞这部分。
刚刚做了一些实验。
根据实验的结果。我可以得出:
live555如果采用 A test program that reads a MPEG-1 or 2 Video Elementary Stream file就是testMpeg1or2VideoStreamer.cpp发送rtp包,那么得到的rtp包包含的就不是一个完整的帧。

如果不是完整的一帧那么我们该如何进行“正确”的解码呢。
例如我们使用的是FFmpeg的avcodec_decode_video()进行解码。
那么如果要正确解码,就必须将一个完整的帧的buffer放入这个解码API中去。
如果没有正确的一帧,我们直接将buffer放入avcodec_decode_video()进行解码,会有什么结果呢。
我们就会得到抖动的画面,带着马赛克,或者画面模糊等等。
这说明了,我们没有正确的解码。

接下来的问题是,我们该如何得到完整的一帧呢。
因为我们现在得到的是一些buffer(它为unsigned char*)。
很多人会想到要使用avcodec_decode_video()进行解码然后得到的例如AVFrame *_decoded_frame这样的_decoded_frame的指针。
通过类似_decoded_frame->pict_type == FF_I_TYPE 或FF_P_TYPE,进行判断。
但是我进行的实验证明这是不可以的,也就是说无法正确地判断这些buffer是否为同一帧的buffer。
我使用的avcodec_find_decoder( CODEC_ID_MPEG2VIDEO );
可能其他的codec可以通过_decoded_frame->pict_type == FF_I_TYPE 或FF_P_TYPE,进行判断。
但是在CODEC_ID_MPEG2VIDEO或CODEC_ID_MPEG1VIDEO的情况下不行。

经过一点思考。
我发现使用live555中afterGettingFrame1(unsigned frameSize, struct timeval presentationTime) 的presentationTime进行判断就可以判断出是得到的buffer是否是同一帧的。
具体实现如下,我只是提供一点思路。
具体实现请自己搞定。
请不要问我如何编。
很简单,请想想吧,请不要写信要源代码。

一点思路:

可以将每次进入afterGettingFrame1的presentationTime进行判断,如果是相同的
那么将相同的buffer存入一个buffer中去,也就是两个buffer连接在一起,不知道我是否表述的清晰。
其实就是使用memcpy这个函数。
当presntationTime不同时候,将以前存的buffer(已经是完整一帧)传给avcodec_decode_video()就可以正确地解一帧了。

当然了,这里在提一下,我们最好设两个thread,一个thread进行live555的接受,另一个thread进行解码使用FFmpeg或其他。
两个thread如果读取同一变量,请设定mutex进行锁。

在进行一些延伸的思考,为什么可以使用presentationTime判断是否为同一帧呢。
如果读过live555的http://www.live555.com/liveMedia/doxygen/html/DeviceSource_8cpp-source.html
liveMedia/DeviceSource.cpp的朋友就知道了,非常非常不负责任的简单地说,如果我们想自己进行编码然后再播放那么就要使用DeviceSource这个类,自己进行一些拓展,DeviceSource是在服务器端,进行rtp包发送前的处理。
DeviceSource里的deliverFrame()函数的用途就是将编码后产生的buffer连同想对应的presentationTime一起“发送出去”,如果熟悉FFmpeg可以使用avcodec_encode_video()进行编码。
看到了吧,在这里就可以找到了presentationTime和一帧里的buffer之间的联系。
当然了,我的这个解释很不负责任,极度简单。
只是通过一个例子进行说明。
有兴趣的朋友可以通过进行更进一步的代码阅读了解presentationTime和一帧里的buffer之间的关系。

好了,随手写一些东西,比较不见条理性。希望大家见谅。
希望大家在需要的时候,能搜索到这篇文章,并得到一点帮助。

注意,以上的解释和记录比较不负责任,极度简单,因为没有进行更系统的代码阅读和分析,不能保证以上所诉完全正确。

2010年6月16日星期三

两个关于char*的bug (QDebug, itoa)

100_2995

此图和本文无关。图为德国埃森的华纳影城的街景(4年前拍的,昨天在整理照片发现的),我很喜欢这张,海绵宝宝。要了解正文请继续阅读。

我今天刚刚发现的我写的两个愚蠢的bug,都和char*有关。
这个两个愚蠢的bug都是因为我自己对一些函数的不正确,过于简单的理解造成的。
要警惕啊,随手写下来,记录一下。

[1]
在使用Qt的时候,我非常喜欢使用QDebug。
可以任意输出什么东西。
可是没有想到,QDebug也会给我造成bug,使测试崩溃。
例如我使用:
QDebug & QDebug::operator<< ( const char * s )
Writes the '\0'-terminated string, s, to the stream and returns a reference to the stream.

rmsg.Answer是一个char*
qDebug() << " Answer:" << rmsg.Answer;

就会得到类似的输出
First-chance exception at 0x670a7fb9 (QtCored4.dll) in **.exe: 0xC0000005: Access violation reading location 0x0000000f.
Unhandled exception at 0x670a7fb9 (QtCored4.dll) in **.exe: 0xC0000005: Access violation reading location 0x0000000f.

发现
Qt的qstring.cpp

QString::Data *QString::fromLatin1_helper(const char *str, int size)
{
    Data *d;
    if (!str) {
        d = &shared_null;
        d->ref.ref();
    } else if (size == 0 || (!*str && size < 0)) {    //程序崩溃在这里
    } else {
        if (size < 0)
            size = qstrlen(str);
        d = static_cast<Data *>(qMalloc(sizeof(Data) + size * sizeof(QChar)));
        d->ref = 1;
        d->alloc = d->size = size;
        d->clean = d->asciiCache = d->simpletext = d->righttoleft = d->capacity = 0;
        d->data = d->array;
        ushort *i = d->data;
        d->array[size] = '\0';
        while (size--)
           *i++ = (uchar)*str++;
    }
    return d;
}

这到底是什么原因呢?

因为我给了错误的指针。

如果得到比较怪异的指针,qDebug()无法正确转换成QString或者(whatever进行一些有关于QString的处理)进行输出的时候就会产生这样的错误。

[2]
现在来谈谈第二个关于char*的bug。

/***
*xtoa.c - convert integers/longs to ASCII string
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       The module has code to convert integers/longs to ASCII strings.
***/

常常使用<stdlib.h>里的函数itoa进行int 到char*的转换
char * itoa ( int value, char * str, int base );

如果这样写
/* use the itoa() to convert int to char* */
int id = 10;
char *id_char;
itoa (id, id_char, 10);

就会出错,然后如果使用Visual Studio进行debug就会跳到xtoa.c里。

/***
*xtoa.c - convert integers/longs to ASCII string
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       The module has code to convert integers/longs to ASCII strings.
***/

为什么呢,还是因为没有定好char*的具体范围。
大概是这样的。
该怎么做呢,其实很简单。
只需如下定义char*就行了。
char id_char[3];

/* use the itoa() to convert int to char* */
int id = 10;
char id_char[3];
itoa (id, id_char, 10);

2010年6月15日星期二

使用Qt Designer进行QLayout设定

用Qt开发GUI的朋友一定对QLayout类很熟悉
我们常常使用QGridLayout,QFormLayout,QBoxLayout,QHBoxLayout,QVBoxLayout 
但是完全用写代码的方式设计GUI,往往是挺麻烦的,至少对我而言
还好我们有Qt Designer

今天,非常简单地谈谈如何使用Qt Designer进行Layout
这里举一简单的例子,我们使用Qt Designer进行Layout做一个视频播放程序的非常简单的用户操作界面

在Qt Designer中Layout可以从Widget Box中选择
也可以从Menu Bar中选择
例如下图

Qt_Designer_1_hanyionet

圈选我们需要进行Layout的Widget例如一些已经设定好的PushButton,Slider等等
然后点击我们进行Layout的类型,例如这里使用了QGridLayout
完成后在Object Inspector中可以看到我们的选择
在Property Editor里可以看到我们的Layout的Stretch等等变量
我们也可以继续手动进行一些微调,例如水平和垂直spacing等等
具体如下图所示

Qt_Designer_2_hanyionet

接下来进行一些类似的QHBoxLayout将一些Label放入其中,和上面的操作类似

最后将QHBoxLayout和QGridLayout整体再放入QWidget的Vertical Layout里
现在大功告成,看吧,实在非常简单吧

可以看到我们完成的一个视频播放程序的非常简单的用户操作界面
如下图所示,点击下面的图可以看大图

Qt_Designer_3_hanyionet

Qt_Designer_hanyionet

在做一些非常简单的演示程序的时候,如果采用Qt Designer进行Layout,常常会节省很多时间,提高编码效率

Enjoy!

2010年6月14日星期一

闲来谈谈理财

金融学上有所谓72法则、71法则、70法则,用作估计将投资倍增或减半所需的时间,反映出的是复利的结果。
计算所需时间时,把与所应用的法则相应的数字,除以预料增长率即可。例如:
假设最初投资金额为100元,复息年利率9%,利用“72法则”,将72除以9(增长率),得8,即需约8年时间,投资金额滚存至200元(两倍于100元),而准确需时为8.0432年。
要估计货币的购买力减半所需时间,可把与所应用的法则相应的数字,除以通胀率。若通胀率为3.5%,应用“70法则”,每单位之货币的购买力减半的时间约为70/3.5=20年。

股票投资比重股票投资适当比重=100-年龄/100。风险与报酬成正比,对一个30岁的年轻人,追求成长,适当地投资股票比重是七成(100-30/100);一名70岁的退休者,股票投资就不宜超过三成(100-70/100)。这个法则是国外教科书推荐的法则,那么在国内,我们应把100变为社会平均生活年龄,比如80岁,或75岁。

活期存款"6个月生活费"活期存款利息极少,存多了则浪费,存少了怕不够家庭应急。一般来说,活期存款为个人或家庭6个月的生活支出最合适。

金融资产1:1固定资产,家庭金融资产(存款、基金、股票、债券等等)和固定资产(房产、汽车、商铺等等)的比例最好为1:1。

保险 "10定律"
保险额度为家庭年收入10倍,总保费支出为家庭年收入的10%。

以上内容来自维基百科及网络。

images_starbucks 

好了进入正题。
还是要坚持每周至少一篇博客,今天写一个简单的读书笔记吧。
最近稍微简单地翻阅了一本书《喝星巴克咖啡的女人VS买星巴克股票的女人》韩国财经专业记者的金姬姃写的书,其实这本书还是挺有趣的,闲来无事的时候看看还不错,可以汲取很多的新知。
男生看看这本书也不错。
从这本书中我了解了一个最浅显而常常会被人忽略的道理:
理财的首要目标在于累积资产管理的能力。

书中也谈到了我在上面摘出的72法则和股票投资比重股票投资适当比重等等概念,很多人一定都知道吧,哈,我一点都不知道,我还是通过这本书才知道的。
所谓真正了解理财,其实要先摆正观念。
就是要先摆脱一获万利的甜蜜诱惑。
然后知道什么是理财。
书中提出:
理财就是将管理的“理”与钱财的“财”合在一起而成的辞汇。理财一词让人有种庸俗,金钱游戏的感觉。但若将理财视为资产管理来看的话,感觉又如何呢?这就
让人有种是对人生长期规划的感觉。因此,专家们为了避免“理财”一词给人一种金钱游戏的负面联想,有时也会使用“资产管理”的说法来代替。
我们应该做什么呢。
首先是放弃所谓的“一获万利”的白日梦,别想不劳而获 。
然后相信自己,透过持续性的资产管理,来达到经济独立,同时借此增加自己的财富。
具体来说就是,每个星期花点时间,彻底掌握经济与金钱的走向,进行稳定的投资,慢慢达到致富目标。

其他的理财方法我这里就不提了。
这里谈谈投资股票。
这本书提到,投资股票,买一股是一股。
但是我们真的知道,该如何投资股票。
其实买股票的时候我们永远不可能买的最低或最高。应该会买到不高不低的价格吧。其他的其实并不需要关心吧。
我们应该参考技术图形或消息吗。
其实做长线投资的时候,我们应该知道一些的内容。

知道这家公司是干什么的,它的思想和理念是什么,有什么主业副业。会不会倒。
这家公司市盈率等参数是什么。平均交易量,流动性,是否存在大量关联交易。
它在什么行业,这家公司的行业地位。这个行业是否会相对其他行业具有较高的成长性。
它的产品或者提供的服务,是否有大量的消费者愿意使用(这一点可以观察一下自己身边的人)。

最近读的“闲书”明显少了。与其说是比较没时间,其实是比较懒。
自己的一个小感受,读书还是很重要的,读一本好书就像听智者聊天。
不仅感受智慧还会发现差距,接受新知。有时间还是一定要多读书啊。

2010年6月6日星期日

咖啡因到底不会让人清醒?

我们常常早上时来一杯咖啡,以图让自己清醒。
然而咖啡因真的会让人清醒吗?
这是真的吗?有科学依据吗?
我其实也考虑过这个问题。

刚刚在网上看了一则报道,也提到了这个问题。
这个报道也解决了我很久以来的困惑。以科学的角度来解释这个问题。
这里做一个非常简单的介绍。

coffee_art

其实咖啡和其他含咖啡因的饮料本身不会使人清醒。其实这只是幻想的兴奋剂的效果。现在英国专家发现,事实上,咖啡因并没有刺激使我们感到清醒,但是如果我们戒断咖啡因摄入,反而这会让人感到非常累。只有当咖啡因继续进入人体,因咖啡因的戒断产生的症状才会消失,我们才会感到清醒。以上的结论来自研究者的结论,发表在“神经精神药理学杂志Journal of Neuropsychopharmacology”。

这将意味着:我们甚至不应该开始习惯喝咖啡,茶或其他含咖啡因的饮料。因为,如果发生“戒断咖啡因”,我们的疲劳只能通过更多含咖啡因的饮料来缓解。另外,在大脑中的咖啡因依赖的影响已被证明。前一段时间,美国科学家曾在科学期刊“精神药理学Psychopharmacology”发表了一份报告,发现因咖啡因的戒断会改变大脑的血流量,因此会导致头痛。但是如果该物质(咖啡因)再次进入体内,痛苦的反应在大多数情况下会迅速消失。

 

参考:
www.nature.com/npp/journal/vaop/ncurrent/abs/npp201071a.html
http://de.news.yahoo.com/12/20100604/thl-koffein-soll-doch-nicht-wach-machen-d343981.html

2010年6月5日星期六

土豆使人发胖?

今天来聊一些生活常识。
土豆使你发胖?食用生的蔬菜比煮熟的健康吗?
你和我一定不是很清楚吧。
以下是在的德国雅虎生活频道看到的一则报道,这里做一个简单的翻译。希望大家会喜欢。

Eisbergsalat

我们这里谈论一下了五个对蔬菜这个大自然的礼物常见的误解。

第一,新鲜的蔬菜比冷冻的更好?
有研究表明,冷冻蔬菜往往含有更多的营养。收获后,大部分的蔬菜,维生素损失不断。储存的时间越长,蔬菜中对健康有益的成分损失越大。

第二,生的蔬菜比熟好?
这取决于蔬菜种类。富含维生素C的蔬菜更适合生食。另一方面,维生素A的发挥需要一定的加热。此外,熟的蔬菜更容易被消化。健康食品中的抗氧化剂可以更好地被人体吸收。

第三,生菜(Eisbergsalat)没有营养?
除了水,生菜还含有蛋白质,纤维,维生素和矿物质。然而,我们也可以选择比生菜更健康的长叶生菜,它含有更少的水 - 但是含有更多维生素。

第四,土豆让你发胖?
马铃薯几乎不含脂肪和只会提供极少的热量 - 但有它含有大量的纤维。因此,土豆可以持续长时间的饱足感。这不是土豆本身,而是在于我们对土豆的再加工。

第五,市场上的蔬菜始终是“有机”?
如果你直接从农民购买蔬菜,这并不意味着,这些蔬菜是真正的有机产品。可靠的指标是国家有机认证。如果产品上有这个有机认证,那么就可以确保您购买的是经过测试的“有机”产品。

原文出处(德文):
http://de.lifestyle.yahoo.com/04062010/442/gemuese-mythen.html

2010年6月3日星期四

德国房租和房价最高的城市

今天在德国雅虎看到一则关于德国的平均房租和价格最高的城市的新闻。
这里做一个非常简化的翻译。
其实和中国一线城市还有部分二线城市对比,其实德国的房子一点都不贵,而且德国的平均工资水平远高于中国。闲话不多说,看数据。

Dusseldorf Skyline

市场研究机构Empirica的一项最新研究,研究了称近120个德国城市平均价格。这些数据适用于拥有居住面积60-80平方米的公寓。
图:德新社

第十位是德国黑森州州的首府威斯巴登。每平方米平均达到9.31欧元。

第九位是德国本身狂欢大本营和莱茵兰普法尔茨的州府莱茵河口的美因茨。这个城市每平方米的租金为9.37欧元。

第八次是德国的科技城黑森州的达姆施塔特。每平方米为9.67欧元一平方米。

第七位是北威州的州府杜塞尔多夫。平均价格为9.95欧元。

第六位是巴登符腾堡州的州府斯图加特。这个内卡河边的城市大概为十欧元每平方。

第五名是汉堡。这个两条河流流过的国际大都会每平方米为10.61欧元。

第四名是弗莱堡。这个巴登符腾堡州的大学城平均每平方米高达10.62欧元。

第三位是海德堡。又是巴登符腾堡州的大学城,平均每平方米的租金已经高达10.77欧元。

第二位当然是美因河畔法兰克福。这个位于黑森州的金融中心,不仅拥有德国的天际线而且还有极高的租金,大概11.07欧元一平方米。

第一名没有意外还是巴伐利亚州首府的慕尼黑。这个伊萨尔河上的大都会,不仅是德国足球场上的纪录保持者而且她每平方米12.11欧元的租金也是德国最高的。

 

以下是德国10个房价最昂贵的地方:

第十:巴伐利亚州的罗森海姆。这个61万居民的城市的公寓平均一平方米的售价为2533欧元。

第九:巴伐利亚州的埃尔兰根。这个只有10.5万人口的城市(西门子在这个城市极具影响力,西门子很多重要的部门都在这里)。这里的房价为平均每平方米2567欧元。

第八:巴登符腾堡州的首府斯图加特。2643欧元只能在这里买公寓的一平方米。

第七:美因河畔法兰克福。购买价格为每平方米2654欧元。

第六:巴登符腾堡州的弗莱堡。至少为每平方米2737欧元。

第五:巴登符腾堡州的海德堡。德国最古老的大学城不仅有学生,可怕的高租金,还有极高的购买价格。平均2760欧元每平方米。

第四:巴登符腾堡州的巴登巴登。这个拥有著名的温泉和赌场巴登符腾堡州的城市。平均每平方米的房价为2799欧元。

第三:巴伐利亚州的雷根斯堡。这个城市的命名采取的方式从河流的名称,而不是降水量多。每平方米2807欧元。

第二:汉堡。每平方米为2972欧元。

第一:还是巴伐利亚州的的州府慕尼黑。平均为3586欧元每平方米。

德国平均房租和平均房价最低的地方在大部分位于东德地区。

 

原文地址(德文):
http://de.finance.yahoo.com/nachrichten/wo-mieten-und-kaufpreise-krftig-steigen-hblatt-d5f0e21028d8.html

2010年6月2日星期三

读书笔记:《写给生存不安的年轻人》

现在想开始改变博客风格
在编排方式也做一些改变并减少一些所谓偏技术性的文章
排版的方式将以让人看起来不累为指导原则
增加一些随笔,读书笔记和心情感悟

前不久看了《写给生存不安的年轻人》这本书
强烈推荐
这本书也是当年日本AMAZON商业类榜单上的畅销书
作者是一个日本人山本真司
其实日本人写的商业类书籍在很多情况比较符合我们中国人的需要
这本书谈到年轻人要做到脱颖而出
要实行差异化策略
找出感兴趣的领域
每个人都有其自身优势
如果能在自己有兴趣的领域发挥自己的创造力
那么距离成功也就不远了

很多书都谈到了目标为导向的学习法
这本书也提到了这种学习法的优点
最重要的是这种方法极具针对性和效率
简单而言就是越专注越有效率
知识爆炸的时代
新的知识永远学不完
我们所需要的就是别人无法取代的实力
而这种实力的取得
其实一是靠积累
二是靠本书所提到的目标为导向的学习法

很多年轻人都希望拥有MBA学位给自己加分
然而什么是MBA
MBA的核心和精华什么?
我认为很多人和我一样并不是真正地了解
这本书提到
其实MBA就是不外乎以下这些方面
logical thinking,investment,finance,marketing,corporate strategy
请摆脱MBA情节
其实MBA并没有什么
对一个年轻人而言
拥有一个MBA学位
已经无法创造出差异化竞争力
其实我们大可以自学
重点掌握MBA精华

学海无涯而我们的时间有限
我们要做到的其实只是通过目标为导向的学习法
然后注重「软性技能」
发挥创造力
突显自己与众不同之处
创造差异
整体不要看局部
努力和专注提高自己的“核心竞争力”