MarkDown_learning.md

学习使用MarkDown语言进行写作

MarkDown语言是什么

MarkDown语言发明的初衷就是让互联网发布内容易读易编写,它用一种简单的语法将文字内容组织,转变成HTML语言发布在互联网上 官网

使用MarkDown这种语言的契机是想要给极客公园投稿,在回复的邮件中他们提到了这种语言。在简单了解之后简单的看了下它的语法。在他们的回复邮件中他们还给出了一个文章的模板—-可能吧。大家应该还记得可能吧每篇文章的排版模式吧!想当初禅叔应该就是用这种方式去写作的吧。使用MarkDown 写作让你全心全意的专注在写作的过程中,不必关注格式,排版,这就是这门语言发明的初衷。其他具体的内容可以参考:维基百科和我给出来的其他链接,上面都有非常详细的介绍。

意外的收获

在查询MarkDown内容的时候,我还意外的知道了“简书”这样的一个网站。网站外观制作精美,通过网站的关于知道网站还在内测中,这个网站专注于写作,所以他的编辑器就是支持MarkDown的。在现在这样一个浮躁的社会没有多少人愿意静下来读一篇很长的文章,当然也少有人愿意写一篇很长的文章,不过我庆幸还有那么一群人能够做出这样的产品,还能有许多人在这个平台上写作,或许我们的社会需要那样的一批人才能更加丰富多彩。

收集到的一些网站

小众软件 MarkDown工具

在线编辑器

MarkDown语法

Google Reader之死----另一種意義上的重生

看這篇文章前,有幾篇文章想先請讀者看看,這些文章都是我看過之後久不能忘的:
還有Quora上面在探討的問題,以及谷奧上面Google Reader標籤下的一系列紀念文章。他們的觀點不免有點吻合,有些矛盾,甚至有的持有截然不同的想法。
其實今天離Google Reader正式宣布到7月1日關閉已經有好久一段時間了,說實話當時聽到這個消息我也很震驚,但經過這段時間的閱讀別人的文章,別人的評論,心態漸漸平息下來,這件事情在一定的圈子中的震動確實挺大。
我使用Google Reader其實並不是很早,我在10年12月份才註冊,深度使用的時間也並不是很長,但Google Reader才是我真正的個人資料庫。有段時間我在尋找電影的時候都是先到Google Reader中搜尋的。而現在談這一切都是空的了。
Google Reader的優勢歸納出來至少有以下幾點:
  • 緩存了許多被刪除的文章,有些博客,有些文章可能被作者,或者其他因素刪除,但是Google還會將它保存在服務器中
  • 強大搜索功能,出現在Google幾乎所有產品中的搜索欄,除了Google Search之外用的最多的就是Google Reader中的搜索了
  • 個人知識庫,分類,標籤,加星,Google Reader可以讓我在一個地方閱讀到我關注的所有網站的內容,並且能夠分類整理,標記,使用時間長久之後就是個人知識存儲的最好的地方了

其實最最痛苦就是背了那麼多快捷鍵,現在卻要轉移使用的平台,重新學習。Google Reader關閉這件事情改變了我對Google的一些看法,我之所以不用很多國內的服務重要的一點原因就是我不信任那些公司能夠保護好我的數據,對於我來說我所擁有的僅僅是那些數據而已,我不希望我的很多年的數據在他們的服務總結之後就在無意義,另外一個重要的原因是我知道國外的服務是不會胡亂刪貼的,我不希望我辛辛苦苦敲出來的東西,別人輕輕一點鼠標就沒了。而這次Google Reader服務的關閉在一定程度上改變了我的一些想法。但是我能理解Google,虽然我也抱怨过,但是现在更加平静。至少Google给出了相当充裕的时间来给我们转移自己的数据,并且提供Takeout来下载我们数据。这样至少能够保证我的数据不会丢失。
有些人由这件事情谈到Google在价值观上的改变,其实我觉得那些真的没有必要,虽然现在Google确实有些让人不懂,但是真的没有必要扯上那些阻碍“信息”自由流通之说,就像土木坛子说的那样,好的文章自然会在互联网上自由流通,接受时间的洗涤并沉淀。或许我们的思维应该跟随着时代的变化去更进一步的思考,我这里没有说RSS过时,没有说Google Reader过时,只是我觉得Google Reader不会就这么样死去,RSS还有用武之地(具体RSS是什么参考文前给出的文章)。Google+首席架构师在Google+上的一则Post中向我们保证了Google Reader这个产品中的一些特征会在Google将来的产品中体现出来的。
反正Google Reader关闭这件事情,我特别矛盾。Google下定决心关闭Google Reader会给其他小厂商很多机会,而Google是否有了Google Reader的替代品,或者已经考虑清楚之后的事情,Google却一点消息都没有透露。我期望着Google会发布另一款重磅级的产品来代替Google Reader,可是我觉得是我想多了。不过我还是期待着奇迹,期待着重生。
更多假想图

等到6月份的时候,再来看看有什么替代品吧。

Google产品

想写一系列介绍Google产品的文章,原因是惊讶于身边的人一直以为Google只不过是一个搜索引擎公司。身边很多同学,他们都很多的需求要解决,却都不知道那些需要的服务Google早已经为他们解决。那些在开学初老是忘记教室的同学,Google Calendar可以完美的解决这样的问题,最近还看到过国内的大学生团队开发出来课程格子的应用,这样的应用在Google Calendar面前是多么的弱;还有写同学寻找长篇大段的翻译工具,虽然国内网易有道,各种翻译做的都还不错,可是很多人却还不知道Google Translate Toolkit可以上传文档,结合机器和人工翻译来给大段文字翻译;还有很多很多,虽然我一直推荐身边的人使用Google的各种服务,他们却只因为上不去而弃Google而去,以至于我竟然听到有同学因为百毒能够保存搜寻记录如此先进而感慨。悲凉由心底升起。
我一遍一遍的反复说明,我也会烦,所以以后不管谁问我,我都不会再劝他/她。他/她用什么服务跟我没有关系,我尊重他/她的选择。
好了,不多说了,下面规划一下想写的内容

第一篇
Google搜索--老本行
Google依靠搜索起家,没有搜索支撑,Google也就什么都不是了。现在到不是说Google Search对Google 公司的影响,而是Google Search对我的影响。从对电脑一无所知到现在已经快三年了,三年时间不短也不算长,这三年里Google到底解决了我多少问题,我已经无从得知,从Google 18000+条搜索记录中零星或许能看到点什么,但是Google伴随着我的成长,现实生活中或许没有一个这样的人能够在三年的时间中告诉你生活社会的点点滴滴,但是Google却对我的生活造成了很大的影响,无论是学习上的,还是社会生活中的。在使用Google Search的过程中,渐渐的积累了一些经验,在参考互联网上无数的优秀资源之后,Google Search才渐渐的变得随心所欲。搜索远远不是只是关键词的简单搜索,搜索靠得是经验和搜索的技巧,如何快速的找到答案需要技巧及生活的经验。

第二篇
Google Image Search--颠覆了图片搜索
虽然我也并不是经常Google图片搜索,但是Google图片搜索却总是能在最关键的时刻帮助我解决各种各样我形容不出来,归纳不出关键词的问题。我经常使用Google图片搜索的几种情况如下:
  • 为Blogger,PPT,Word等各种演示配图
  • 为寻找一个更高像素的图片
  • 为了解现实生活中看到的各种图片的意义,或者为找到一张海报,或者为找到图片上的人物
  • 或者为找到一战图片背后的故事
(如下面这张在环球银幕上面看到的图片,却一时想不起来这部电影的名字,拍下来Google Image Search一下便知道,具体在第二篇文章中解释)
Google Image Search 官方博客,视频宣传
TinEye 以图搜图
Goggle 伊万麦克雷哥
第三篇
Google Map
很久以前大家从来没有想过做地图,只有Google默默的在贡献着什么,一点一滴把地图服务做得人尽皆知,渐渐的大家都看到了地理信息的重要支撑,于是苹果踢去Google Map,于是诺基亚跳出来推出了Here,于是百毒成立了LBS部门,于是大家突然对地图都感兴趣起来。而Google依然默默的一步一步的走着,从没有高调的宣传,从没有频繁的广告,有的也只是Google YouTube频道上简简单单,轻轻松松的娱乐小短片,有的也只是官方博客上对各个功能的介绍而已。但是Google注定要走在最前列,街景小车带来不了任何利益却开遍了全世界,甚至是海底。
分布为Google Map网页版,Google Earth

第四篇
Google YouTube
YouTube或许在一些大陆人眼里只是能够播放违禁短片的非法网站而已,可惜YouTube早已成为向全世界广播个人的平台,这也是为什么YouTube会在08年获得皮博迪奖,因为YouTube代表着公平,自由,没有大号小号之分,每一个人只要拥有一个账户就能有自由的发表自己的观点,或者向别人分享自己拍摄的视频。她的广告语“Broadcast Yourself.“简单,却不一定每一个人,每一家公司都能做到。YouTube几乎已经成了我网络上唯一的播放器,国内的优库,土豆不是广告比视频还长就是广告比原视频还流畅,或许国内也就只剩下搜狐视频用来看看美剧了。

第五篇
Google Photo
也就是Picasa,曾经的图床,曾经的网络相册,曾经PC端很方便的图片管理软件,在Google+发布之后被Google整改到Google+,虽然原先的入口依然还存在,Google首页显示的却已经是Google Photo,这也就是很多人说“可能哪天YouTube也会变成Google Vedio”。Google的太多服务如果没有在主页表明,入口都很难找到。Picasa在2004年被Google收购,到今年已经8个多年头,Google对Picasa的更新越来越慢,Google Picasa却依然被评选为“我最喜欢的图片浏览工具”。Google或许意识到更新PC平台的软件对自己架构云计算一点好处有没有了,现在如果网速够流畅,直接在浏览器里可以通过Google+自带的Picnik处理,还有其他网页直接能处理图片的Aviary,Pixlr等等等。总之目前阶段还摆脱不了PC,Picasa总是要装的软件,至于5年,10年之后Chromebook能不能和PC瓜分天下就另说了。

第六篇
Google Blogger
世界上最大的博客发布平台,".blogspot.com",这个中国没多少人知道的二级域名在互联网的却有着举足轻重的分量。Blogger在自己的官方的内容政策中这样写道
“Blogger 是一個能讓您通訊、自我表達和自由發言的免費服務。 我們相信 Blogger 會不斷增加資訊的可用性,鼓勵健康且正面的討論,讓人與人之間建立新聯繫。
我們尊重使用者對選擇分享之內容的擁有權和其責任。 我們深信審查這些內容與基於言論自由的服務有所扺觸。
為了維護這些價值,我們必須抑制濫用,保障我們提供此服務的能力並鼓勵言論自由。 因此,可使用 Blogger 的內容有數種範疇。 我們已定義的範疇是根據法律上的要求並增強整個服務。”
所以这样一个服务注定是不能也不会在大陆生根发芽的。

第七篇
Google Mail(Gmail)
Google的邮件系统,在愚人节推出,在我写Gmail技巧之前你应该看看我曾经转过的一篇文章”我们应该向Gmail学习什么“,Gmail作为一个邮箱系统为什么能够打败Hotmail,Yahoo Mail,其中有很多值得思考的问题。

Google Reader

Google Drive

Google Android

Google Chrome

Google Calendar

Google Plus

Google的產品多得如同天上的星星,即使是深度用戶都有可能有沒用使用過得產品,但是自從 +Larry Page當了CEO,Google大刀闊斧的砍掉了很多項目,其中包括很受歡迎的Google Reader。
總之不管怎麼說,這篇算是個開篇吧。

Win7下powercfg命令


Win7下命令:
POWERCFG <命令行选项>
描述:
  此命令行工具使用户能够控制系统上的
  电源设置。

参数列表:
  -LIST, -L   列出当前用户环境中的所有电源方案。

              用法: POWERCFG -LIST

  -QUERY, -Q  显示指定电源方案的内容。

              用法: POWERCFG -QUERY <SCHEME_GUID> <SUB_GUID>

              <SCHEME_GUID>  (可选)指定要显示的电源
                             方案的 GUID,可以使用 powercfg -l 获得它。
              <SUB_GUID>     (可选)指定要显示的子组 GUID。
                            要求提供一个 SCHEME_GUID。

              如果 SCHEME_GUID 或 SUB_GUID 均未提供,则会显示
              当前用户的活动电源方案的设置。
              如果未指定 SUB_GUID,则会显示指定的
              电源方案中的所有设置。

  -CHANGE, -X 修改当前电源方案中的一个设置值。

              用法: POWERCFG -X <SETTING> <VALUE>

              <SETTING>   指定下列选项之一:
                          -monitor-timeout-ac <分钟>
                          -monitor-timeout-dc <分钟>
                          -disk-timeout-ac <分钟>
                          -disk-timeout-dc <分钟>
                          -standby-timeout-ac <分钟>
                          -standby-timeout-dc <分钟>
                          -hibernate-timeout-ac <分钟>
                          -hibernate-timeout-dc <分钟>

              示例:
              POWERCFG -Change -monitor-timeout-ac 5
              当使用交流电源时,这会将监视器空闲超时值
              设置为 5 分钟。

  -CHANGENAME 修改电源方案的名称并可选择修改其
              描述。

              用法: POWERCFG -CHANGENAME <GUID> <name> <scheme description>

              如果该描述被忽略,则仅修改该名称。

  -DUPLICATESCHEME
               复制指定的电源方案。将会
              显示代表新方案的结果 GUID。

              用法: POWERCFG -DUPLICATESCHEME <GUID> <destination GUID>

              <GUID>  指定通过使用 powercfg -l 获得的方案 GUID。

              如果忽略 <destination GUID>,将为
              重复的方案创建新 GUID。

  -DELETE, -D 删除具有指定 GUID 的电源方案。

              用法: POWERCFG -DELETE <GUID>

              其中 <GUID> 是通过使用 LIST 参数获得的。

  -DELETESETTING
              删除电源设置。

              用法: POWERCFG -DELETESETTING <SUB_GUID> <SETTING_GUID>

              <SUB_GUID>      指定子组 GUID。
              <SETTING_GUID>  指定电源设置 GUID。

  -SETACTIVE, -S
              使指定的电源方案在系统上成为活动的。

              用法: POWERCFG -SETACTIVE <SCHEME_GUID>

              <SCHEME_GUID>  指定方案 GUID。

  -GETACTIVESCHEME
              检索当前活动的电源方案。

              用法: POWERCFG -GETACTIVESCHEME

  -SETACVALUEINDEX
              当系统是由交流电源供电时,设置一个
              与指定的电源设置相关联的值。

              用法: POWERCFG -SETACVALUEINDEX <SCHEME_GUID> <SUB_GUID>
                                               <SETTING_GUID> <SettingIndex>

              <SCHEME_GUID>   指定一个电源方案 GUID,并可以
                              通过使用 PowerCfg /L 获得它。
              <SUB_GUID>      指定电源设置 GUID 的一个子组,并可以
                              通过使用 "PowerCfg /Q" 获得它。
              <SETTING_GUID>  指定一个单独的电源设置 GUID,并可以
                              通过使用 "PowerCfg /Q" 获得它。
              <SettingIndex>  指定此电源设置
                              将被设置为可能值列表中的哪个值。

              示例:
                  POWERCFG -SetAcValueIndex <GUID> <GUID> <GUID> 5
                  这会将该电源设置的交流值设置为此电源设置
                  的可能值列表中的第 5 项。

  -SETDCVALUEINDEX
              当系统是由直流电源供电时,设置一个
              与指定的电源设置相关联的值。

              用法: POWERCFG -SETDCVALUEINDEX <SCHEME_GUID> <SUB_GUID>
                                               <SETTING_GUID> <SettingIndex>
              <SCHEME_GUID>   指定一个电源方案 GUID,并可以
                              通过使用 PowerCfg /L 获得它。
              <SUB_GUID>      指定电源设置 GUID 的一个子组,并可以
                              通过使用 "PowerCfg /Q" 获得它。
              <SETTING_GUID>  指定一个单独的电源设置 GUID,并可以
                              通过使用 "PowerCfg /Q" 获得它。
              <SettingIndex>  指定此设置
                              将被设置为可能值列表中的哪个值。

              示例:
                  POWERCFG -SetDcValueIndex <GUID> <GUID> <GUID> 5
                  这会将电源设置的直流值设置为此电源设置
                  的可能值列表中的第 5 项。

  -HIBERNATE, -H
              启用-禁用休眠功能。所有
              所有系统上都支持。

              用法: POWERCFG -H <ON|OFF>
                     POWERCFG -H -Size <PercentSize>
              -Size  以总内存百分比指定所需的休眠文件大小。
                     默认大小不得小于 50。
                     此开关还自动启用休眠文件。

  -AVAILABLESLEEPSTATES, -A
              报告系统上可用的睡眠状态
              尝试报告睡眠状态不可用的原因。

  -DEVICEQUERY
              返回符合指定标准的设备列表。

              用法: POWERCFG -DEVICEQUERY <queryflags>

              <queryflags>  指定以下标准之一:

              wake_from_S1_supported  返回支持从浅睡眠状态
                                      唤醒系统的所有设备。
              wake_from_S2_supported  返回支持从深睡眠状态
                                      唤醒系统的所有设备。
              wake_from_S3_supported  返回支持从最深睡眠状态
                                      唤醒系统的所有设备。
              wake_from_any           返回支持从任何睡眠状态
                                      唤醒系统的所有设备。
              S1_supported            列出支持浅睡眠的设备。
              S2_supported            列出支持较深睡眠的设备。
              S3_supported            列出支持最深睡眠的设备。
              S4_supported            列出支持休眠的设备。
              wake_programmable       列出用户可配置的从某个睡眠状态
                                      唤醒系统的设备。
              wake_armed              列出当前配置为从任何
                                      睡眠状态唤醒系统的设备。
              all_devices             返回系统中现有的所有设备。
              all_devices_verbose     返回详细的设备列表。
              示例:
                  POWERCFG -DEVICEQUERY wake_armed

  -DEVICEENABLEWAKE
              使设备能够从睡眠状态唤醒系统。

              用法: POWERCFG -DEVICEENABLEWAKE <devicename>

              <devicename>  指定使用以下命令检索的设备:
                            "PowerCfg -DEVICEQUERY wake_programmable"

              示例:
                  POWERCFG -DEVICEENABLEWAKE
                                       "Microsoft USB IntelliMouse Explorer"

  -DEVICEDISABLEWAKE <devicename> 禁止该设备从睡眠状态
              禁止该设备从睡眠状态唤醒系统

              用法: POWERCFG -DEVICEDISABLEWAKE

              <devicename>  指定使用
                            "PowerCfg -DEVICEQUERY wake_armed" 检索的设备。

  -IMPORT     从指定的文件导入所有电源设置。

              用法: POWERCFG -IMPORT <filename> <GUID>

              <filename>  指定到由以下内容生成的文件的完全限定路径
                          "PowerCfg -EXPORT"  参数生成的文件的完全限定路径。
              <GUID>      (可选)将设置加载到此 GUID 所代表
                           的电源方案中。如果未提供,powercfg
                          将生成并使用新 GUID

              示例:
                  POWERCFG -IMPORT c:\scheme.pow

  -EXPORT     将指定的 GUID 代表的电源方案导出到
              指定的文件。

              用法: POWERCFG -EXPORT <filename> <GUID>

              <filename>  指定到目标文件的完全限定路径。
              <GUID>      指定一个电源方案 GUID,并可以通过
                          使用 "PowerCfg /L" 获得它。

              示例:
                  POWERCFG -EXPORT c:\scheme.pow
                                   381b4222-f694-41f0-9685-ff5bb260df2e

  -LASTWAKE   报告关于哪些设备从上次睡眠中唤醒系统的信息
              转换

  -HELP, -?   显示关于命令行参数的信息。

  -ALIASES    显示所有别名及其相应的 GUID。
              用户可以使用这些别名代替命令行
              上的任何 GUID。

  -SETSECURITYDESCRIPTOR
              设置与指定的电源设置、电源方案、操作相关联的安全描述符。


              用法: POWERCFG -SETSECURITYDESCRIPTOR <GUID|ACTION> <SDDL>

              <GUID>       指定电源方案或电源设置 GUID。
              <ACTION>     可以是下列字符串之一:
                           ActionSetActive、ActionCreate、ActionDefault
              <SDDL>       以 SDDL 格式指定一个有效的安全描述符
                           字符串。调用 POWERCFG -GETSECURITYDESCRIPTOR 以查看
                           SDDL 字符串示例。

  -GETSECURITYDESCRIPTOR
              获取与指定的电源设置、电源方案或操作相关联的安全描述符。


              用法: POWERCFG -GETSECURITYDESCRIPTOR <GUID|ACTION>
              <GUID>       指定电源方案或电源设置 GUID。
              <ACTION>     可以是下列字符串之一:
                           ActionSetActive, ActionCreate, ActionDefault

  -REQUESTS
              枚举应用程序和驱动程序电源请求。
              电源请求阻止计算机自动关闭显示器电源,
              或者阻止进入低能量睡眠模式。

  -REQUESTSOVERRIDE
              为特定进程、服务或驱动程序设置电源请求替代。
              如果未指定任何参数,则该命令显示
              当前的电源请求替代列表。

              用法: POWERCFG -REQUESTSOVERRIDE <CALLER_TYPE> <NAME> <REQUEST>
              <CALLER_TYPE>    指定以下调用程序类型之一:
                               PROCESS、SERVICE、DRIVER。这通过
                               调用 POWERCFG -REQUESTS 命令获得。
              <NAME>           指定调用程序名称。这是通过
                               调用 POWERCFG -REQUESTS 命令返回的名称。
              <REQUEST>        指定以下一个或多个电源
                               请求类型: Display、System、Awaymode。
              示例:
                  POWERCFG -REQUESTSOVERRIDE PROCESS wmplayer.exe Display System


  -ENERGY
              分析系统中常见的能量效率和电池寿命问题。
              当计算机空闲且没有打开的程序或文档时应该使用 ENERGY
              命令。ENERGY 命令
              将在当前路径中生成一个 HTML 报告文件。ENERGY
              命令支持以下可选参数:

              用法: POWERCFG -ENERGY [-OUTPUT <FILENAME>] [-XML]
                                      [-DURATION <SECONDS>]
                     POWERCFG -ENERGY -TRACE [-D <FILEPATH>]
                                             [-DURATION <SECONDS>]
              -OUTPUT <FILENAME>  – 指定存储能量报告
                                      HTML 文件的路径和文件名。
              -XML                 - 将报告文件格式化为 XML 文件。
              -TRACE               - 记录系统行为,但不执行分析。
                                     除非指定
                                      -D 参数,否则将在当前路径中
                                     生成跟踪文件。
              -D <FILEPATH>       - 指定存储跟踪数据的目录。
                                     只能与 -TRACE 参数一起使用。
              -DURATION <SECONDS> – 指定观察系统行为的秒数。
                                     默认值为 60 秒。
  -WAKETIMERS
              枚举活动唤醒计时器。如果启用,
              唤醒计时器可以将系统从睡眠状态和休眠状态唤醒。

CopyArea----一款小巧的拷屏软件

平时上网或者电脑出现问题,截取屏幕是必不可少的一个动作,之前我尝试过很多截屏的软件从大块头Ashampoo Snap 5到比较小巧的PicPick,分不同情况使用倒也还没出现过什么大的问题,不过前几天上网又偶遇一款更小巧的截屏软件Copy Area。这个小软件是个人开发的使用倒也方便,他会将截屏保存到粘贴板内,可以在任何可粘贴图片的地方粘贴。
安装完Copy Area之后会集成在系统右键菜单中
在桌面上和资源管理器中都能方便的调用。再点击Copy Area后有5秒钟的缓冲时间让你准备着摆放好需要截屏的地方。5秒结束就可以在任何地方拖出一个矩形截屏了,截取的屏幕保存在粘贴板内,随便贴哪里都行。
和Copy Area配套使用的还有一个PasteAsFile,能够将截取的屏幕粘贴到文件管理器中。
上面这张图就是我通过Copy Area抓图然后Paste As File的 :)
下面是Copy Area开发者对Copy Area的一点介绍,这里我们要感谢Chris Gingerich这位开发者。

下面是Paste As File的一个文件

目前我这个版本是v3.0.0.5
需要的自取之
Copy Area BOX
Paste As File BOX

Android:资源id及资源id的动态获取

我们平时获取资源是通过 findViewById 方法进行的,比如我们常在onCreate方法中使用这样的语句:
btnChecked=(ImageView)findViewById(R.id.imgCheck);
findViewById是我们获取layout中各种View 对象比如按钮、标签、ListView和ImageView的便利方法。顾名思义,它需要一个int参数:资源id。
资源id非常有用。Android回自动为每个位于res目录下的资源分配id,包括各种图片文件、xml文中的”@+id”对象。res的子目录几乎总是固定的,比如每次都能见到的:drawable-xxxx、layout、values,以及不常见的:anim、xml、row、color。
Android教科书上告诉你:
res/drawable/用来存放图片文件;
res/layout/用来存放布局定义文件;
res/values/用来存放一些变量、参数等文件。
这都是我们已经知道的。此外,Android会为res目录下的所有资源分配id,其主要的分配原则是:
drawable中的图片文件总是每个文件一个资源id。
Xml文件中每个使用android:id=”@+id/xxx”的view都会被分配一个未用的资源id。
其他更复杂的规则也许每个人都会补充一些。
在 ADK 的API 中,有许多方法其实都会使用资源id作为参数,比如 getDrawable 方法 :
getResources().getDrawable(R.drawable.sendsms_bk));
从字面上看,getResouces方法返回一个android.content.res.Resources对象。
getDrawalbe方法返回一个Drawable对象,我们知道这就是一张图片。
getDrawable方法使用的参数就是资源id。
但是,这些int型的资源id到底是些什么数字?或者它们都放在哪里。如果你够细心,你可以在gen目录的R.java文件中找到它们。每个16进制整型id都有一个很O-O 的属性名字,它们都是public static final的,建议你不要手动去修改它们。这些资源id位于不同类层次结构中,你仔细看一看,会发现其中的一些规律,比如,drawable类中包含资源id其实代表了res/drawable目录中的图片文件;layout类中包含的资源id其实是代表了在res/layout目录中的xml文件 ;id类中包含的资源id其实是代表了布局xml文件中使用了 android:id=”@+id/xxx”的widget对象——当然如果你使用的是”@+Tyre/xxx”,则Android编译时会在R.java 中创建一个叫做 Tyre 的类。
通过上面的了解,我们发现资源id就是以“R.”开头的变量或属性——因为它都定义在R类中——这个类跟android.R不是同一个R,它们不在同一个包层次中。前者是定义了android框架自己的资源,比如:android.R.layout.simple_expandable_list_item_1、android.R.layout.simple_expandable_list_item_2。这些资源你使用过吗?有时间不妨试试。而另一个R就是我们自己的R了,定义了我们自己的资源id。我们可以用面向对象的R.xxx.yyy的方式使用资源id,当然也可以直接用16进制数来使用它们。
资源id在Android中是如此重要,因此我们只要获得了资源id,即可获得资源。因为某些情况下,我们不能使用某个常量作为资源id(因为我们想用一个变量代替它),所以只能采用两种方式动态获取资源id:

1、反射

java的反射是如此强大,以至于我们在走投无路时总是想起它。我们来看一段代码:
try{
  Field field=R.drawable.class.getField(type);
  int i= field.getInt(new R.drawable());
  Log.d(tag,i+"");
  return i;
}catch(Exception e){
  Log.e(tag,e.toString());
  return R.drawable.unknow;
}

type是一个变量,他的可能值会是“close”、“edit”、“icon”等。我们通过java的反射类Field 去访问 R.drawable 类下面的某个字段。实际上,我们知道在R.drawable 下的字段就是 res.drawable-xxxx 目录下的图片文件的资源id。因此运行上面的这段代码,其实就是通过一个字符串去获取对应图片文件的资源id。比如,当 type 的值为“icon”时,上面的代码会获得res.drawable-xxxx目录下的 icon.png 图片文件的资源id并返回给我们。我们通过资源 id 来把图片显示在ImageView中就是顺理成章的事了。

2、使用Resources 类的 getIdentifier方法

使用反射毕竟还是麻烦。如果同样的事情用 android.content.res.Resources 类来干,就是两句话而已:
Resources res=getResources();
return res.getIdentifier(type,"drawable",getPackageName());
getResources方法是来自于contenxt(也就是Activity类),它直接可以返回一个Resouces对象。而Resouces的getIdentifier方法可以返回R.java中的任何资源id,当然,你必须指定3个参数:字段名,类名,包名。包名指定了的 全限定名的包名部分,如果R 的全限定名为 android.R 或者 com.company.R,则包名在这里就是“android”或“com.company”。getPackageName其实是this.getPackageName(),它直接返回本类的包名。
类名则是资源所属的类。比如我们知道的,在R.java 类中的几个固定的类:drawable、id、string、layout等,在它们下边又定义了许多资源id。
字段名则是资源id的名字。比如这个资源id定义: public static final int del=0x7f020002;
del就是一个资源id的名字,0x7f020002则是它的16进制值。
通过3个参数,getIdentifier 方法就可以通过比较动态的方式获得资源id。

Google Reader为什么会关闭

Google Reader为什么会关闭:
Google日前公布了新一轮的Google服务清理计划,另人惊讶的是,这次竟然轮到了Google Reader,Google宣布Google Reader将会在今年7月1日正式关闭,用户和开发者可以导出其中RSS数据,并使用其他的RSS订阅软件代替。这个消息一经发布,立即引起业内大哗。
世界各地的社交网站上充斥着抱怨、惋惜和无奈,对于Google的这个决定,有人联名抗议,有人愤怒谴责,有人无奈接受,有人开始寻找替代品,还有一些其他RSS应用忙着抢用户。
那么,Google为什么会不惜冒犯众怒而关闭Google Reader这个产品,其背后的原因到底是什么呢?
Google Reader为什么会关闭

  Google Reader的简介

Google Reader是Google于2005年推出的一项RSS阅读器服务,普遍被认为是世界上最好的资讯订阅服务,迅速吸引了技术爱好者、IT互联网行业从业者以及传统媒体和对信息比较敏锐的人群的使用。Google Reader之后发布了很多社交网络方面的功能,获得用户的大量好评,并曾经营造了一个不错的社交圈,一度曾被认为是最有价值的Google服务之一。
然而,2011年谷歌推出社交网络Google+,Google Reader经历过一次大改版,全部社交功能被删除,其分享功能被引向Google+,新版Google Reader引发大量争议,很多用户表示抗议,然而谁都想不到,Google突如其来的决定会让Google Reader服务走向灭亡。

  Google Reader的产品特点

1)优点
Google Reader做为一款RSS阅读器,和RSS有着密不可分的联系,RSS技术能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新。读者使用RSS阅读器软件,可以在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。
使用RSS阅读器的一大优点就是高效、快速的获得资讯信息,其订阅功能还可以实现个性化阅读,让用户只关注自己感兴趣的内容,有利于专注和深度阅读。
此外,RSS追求的干净、纯粹的阅读体验,通常RSS上没有广告信息的干扰,可以让读者获得优质的阅读体验。
对于中国用户来说,Google Reader还有一些特殊的功能令人喜爱,就是让中国用户能方便的阅读墙外的新闻,对于中国用户来说意义重大,例如世界最大的博客系统blogspot上的博客无法从中国直接访问,但中国用户只要订阅了blogspot博客的RSS,就可以方便地进行全文阅读,除此之外,Google Reader还可以用于备份博客,有些人的博客已经不存在了,但是从Google Reader上依旧可以阅读其早先的博客存档,这类似百度快照那样,将信息资讯都永久的保存下来,供有需要的人随时查询。
2)缺点
RSS阅读器也有一些缺点,其一直都没有很成功的商业模式,由于RSS阅读器追求纯粹的阅读体验,这使得广告内容难以存在,即使在上面发布广告,通常也点击率也非常低,无法维系产品发展。
此外,RSS阅读器对用户要求很高,要求用户具有很好的信息管理能力,能独立甄别哪些是好的RSS订阅源并加以订阅,否则的话,很容易引发信息过载,读不到自己需要的信息,却有海量的信息处于未阅读状态。

  Google Reader的社交之路

在Google Reader发布的初期,RSS阅读器市场可谓群雄逐鹿,Blogline、NewsGator等老牌阅读器都有大量忠实用户,但Google Reader凭借着稳定的服务和优异的使用体验,快速地崛起,并于2007年跃居市场份额第一
2008年的时候,Google Reader开始了社交化探索,推出了好友阅读分享功能,让用户可以通过好友分享发现更多的优质信息,从而减少阅读的压力,之后,Google Reader还推出了“共享备注”和“评论”功能,进一步强化了Google Reader的社交功能,随着Google Reader的跟随(follow)、喜欢(like) 等功能的发布,Google Reader已经具备了一个社交网站所需要的所有功能,2010年,Google Reader实现了“热门条目”和“神奇排序”功能,让Google Reader从一个RSS阅读器工具彻底转变成为一个社会化媒体发现和共享平台,此时的Google Reader达到了历史的巅峰。
搜索和跟随其他用户
那时,Google Reader的发展前景是更智能的个性化推荐,通过分析自己订阅者的分享条目的数据来智能推荐给用户新的信息,而这类产品需要海量的数据、复杂的分析以及用户积极的参与才能实现,当时的用户也对此满怀信心,然而之后,Google Reader的开发却处于停滞状态,原有的开发人员被调去开发Google+,2011年Google自己的社交网络服务Google+终于诞生,Google倾尽全力发展Google+这个社交网络产品。
Google Reader的好日子也终于到头了,2011年10月底,Google宣布要整合Google Reader和Google+,最终用户看到的却是,Google Reader的全部社交功能都被删除了,而分享功能则修改的更奇怪了,Google Reader用户分享完成后,别人想要看分享必须要访问Google+才能看到,而且看到的还是摘要分享,对于用户来说,又回到了几年前的起点。自从分享功能有了这种“新特色”之后,我就再也没有使用Google Reader分享过一篇文章,可以说,这次Google Reader的改版,将Google Reader几乎所有的优点都删除了,所有的缺点都被放大了,最终导致Google Reader的用户阅读体验大幅下降。
于是,大量Google Reader老用户对改版表示不满,他们为此参与了一项“万人签名拯救Google Reader”的请愿活动,要求Google换回以前的Google Reader版本。许多失望的Google Reader用户纷纷以#OccupyGoogleReader或#OccupyReader这样的标签发帖,在Twitter上面发泄他们的愤怒。部分华盛顿居民则在纽约大道1101号谷歌华盛顿办公室门前举起“拯救Google Reader”的牌子进行抗议。
拯救Google Reader
但Google对这些用户的反馈视而不见,听而不闻,毫不让步,坚持阉割Google Reader的功能,从Google趋势上可以明显看出,2011年11月后Google Reader的关注度大幅下降,Google亲手摧毁了Google Reader社区,并妄图将其用户引到Google+,最终的结果是,Google如愿以偿地将Google Reader社区彻底摧毁,Google Reader的使用量和用户也大幅下降,与此同时,Google+的用户却没有增加。
Google Reader为什么会关闭

  Google Reader的商业化探索

一个产品的生存基础就是要有一个好的商业模式,商业公司需要通过一定途径或方式从产品上赚钱,缺少商业模式的产品都是非常危险的,一个产品如果不能产生可持续盈利收入,那就无法对商业公司产生价值。
Google Reader是一个非常消耗资源的产品,海量的RSS抓取需要大量的资源和带宽,而Google Reader开放了API供Reeder等第三方应用调用,这就耗费了额外的更多资源,而Google却并没有向这些第三方应用收费,也没有对用户收费,Google是一家网络广告公司,他对于产品的商业化模式倾向于广告展示。
Google早在2006年就开始探索RSS的商业模式,最早的产品是Google AdSense for Feeds for beta,那时候搞RSS广告的还有Feedburner Ad Networks,Google可能为了更好地掌握RSS广告的技术,于2007年收购了Feedburner,2007年底,FeedBurner开始集成Google AdSense广告,2008年,Google发布AdSense for Feeds,让所有支持RSS的AdSense用户都可以使用RSS广告。
Google发布AdSense for Feeds
我自己也使用过AdSense for Feeds进行过一些测试,发现AdSense for Feeds的广告点击率非常低,低到了几乎可以忽略不计的地步,这和网站的AdSense广告点击率形成了鲜明的对比,这也验证了,RSS阅读器用户的性质决定了没人会点RSS上的广告。
不出意料,Google AdSense for Feeds这个RSS广告产品维持了四年时间,终于在2012年底宣布此服务关门大吉。Google在RSS商业模式的探索努力最终以失败而告终,或许从那时起,Google就已经开始考虑关闭Google Reader了。

  Google Reader的灭亡

时光进入了2013年,Google Reader的末日也终于来临,Google终于宣布将在2013年7月1日关闭Google Reader,Google官方博客对于这一决定给出了两个冠冕堂皇的理由:首先,Google Reader使用率持续下降。其次,“作为一个正悉心聚焦于更少产品的公司,我们认为专注将给用户带来更好的体验。”
不过,稍稍进行一些分析,就会发现Google的说法根本站不住脚。
通过Google关键字工具可以跟踪在Google中搜索这些产品的次数,以此可以类推各个产品的热门程度。根据Google提供的数据,包括Google相关的全球每月搜索量的大小,我总结了下面这张表单,列出了Google搜索最多的产品,总的来说这是Google服务的热门程度对比。
关键字 全球每月搜索量
youtube 1,380,000,000
google 755,000,000
gmail 277,000,000
google earth 83,100,000
google maps 83,100,000
chrome 68,000,000
blogspot 68,000,000
google translate 55,600,000
google chrome 37,200,000
picasa 9,140,000
google docs 7,480,000
google analytics 5,000,000
google calendar 3,350,000
google apps 3,350,000
google voice 3,350,000
google plus 2,740,000
google talk 2,740,000
google books 2,240,000
google adwords 1,830,000
google sketchup 1,220,000
google adsense 1,220,000
google reader 1,000,000
google trends 368,000
google currents 60,500
可以看出,相比Google的热门产品来说,Google Reader的用户关注度的确不多,但也没有低到不值一提的地步。Adwords和Adsense同样也是小众产品,但从来不用担心是否关闭的问题,因为两者提供Google绝大多数收入来源。google trends、google calendar这样的服务虽然用户量也不大,但其运营成本并不太高,而类似google toolbar,picasa这样的客户端产品就更不用说了,其不需要太多的服务器资源,运营成本更低。
Google收入
Google全球收入来源(来源:Business Insider)
从Google Trends上来分析,Google Reader的关注度至少在2011年11月之前都在一直上升,之后才开始下降了一段时间,然后保持稳定,如果Google不在2011年11月将Google Reader功能大幅削减,其使用量未必会下降。即使如此,其用户量也比Google Trends,Google Currents等产品也要多,用户少就关闭产品的说法说不通。
Google Reader为什么会关闭
Google的产品的确很多,从商业模式上看,可以分为盈利类、间接盈利类、不盈利类,Adwords和Adsense属于直接盈利的广告产品,Google搜索则提供了主要的广告展示,间接进行了盈利,Google的其他产品,例如Google工具栏等,主要功能是在IE和Firefox上将默认搜索修改为Google,增加Google搜索的流量,Chrome默认的搜索就是Google,所以一直没有Chrome版本的Google工具栏,一些产品虽然用处不大,用户也不多,但都或多或少地增加了Google的搜索流量,间接为Google的广告收入做出了贡献。
但是,RSS阅读器就不同了,这种产品运维困难,不具备可持续发展的条件,RSS阅读器无法依靠展示广告盈利,其用户性质决定了没人会点广告,同时,维持一个RSS阅读器正常运行需要耗费大量成本,大量的抓取服务器和带宽都是非常耗费资源的,要保证及时抓取海量RSS的更新不是件简单的事情,同时,针对用户的个性化分析也非常复杂,需要大量计算,一方面运营需要付出高额成本,一方面产品又缺少可持续商业模式。Google是全球最大的广告公司,广告是其盈利的主要模式,而Google Reader的一大特色就是在不打开网页的情况下阅读内容,从而过滤了广告,Google Reader的用户越多,Google的广告收入就越少,因此,Google缺少继续支持Google Reader的理由。现在网民举行各种请愿活动希望Google放弃关闭Google Reader,无异于痴人说梦。
一个伟大的产品最终还是死掉了,杀死她的不是战场上的敌人,而是她身后的亲人。
评论《Google Reader为什么会关闭》的内容...

相关文章:


微博:新浪微博 - 腾讯微博
QQ群:186784064
月光博客投稿信箱:williamlong.info(at)gmail.com
Created by William Long www.williamlong.info

对操作系统的认识

学期开始,上了操作系统这门课,可上面老师提出来一个有趣的想法,他叫我们在学期前写下对“操作系统”的认识,然后到学期末的时候再写下对“操作系统”的认识,对比一学期前后的认识会是一件非常有趣的事情。
之前上课老师随便提问了一些同学,叫他们说一下他们心目中的操作系统是什么样的----”大脑“、”管理者“、”调度者“之类的答案随即出现。其实宏观的讲这些答案都是对的。老师也没有否认这些答案。
下面我就说说我想吧,期末的时候再写一篇对比看看有什么区别。
操作系统的课上了也有两个星期了,之间讲过操作系统的几大功能:处理机管理,存储器管理,文件管理,设备管理。所以我归纳为:操作系统就是用户和硬件资源打交道的中间桥梁,操作系统是硬件设备的管理者。操作系统为上层应用提供一套编程接口,应用运行在操作系统上,与用户交互。操作系统是计算机的核心。
在写完上面的,我搜索”维基“的解释:
操作系统(英语:Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。 操作系统的型态非常多样,不同机器安装的操作系统可从简单到复杂,可从手机的嵌入式系统到超级计算机的大型操作系统。许多操作系统制造者对它涵盖范畴的定义也不尽一致,例如有些操作系统集成了图形用户界面(GUI),而有些仅使用命令行界面(CLI),而将GUI视为一种非必要的应用程序。

别了,Google Reader

别了,Google Reader:



Google喜欢折腾各种新创意,但是砍起产品来也是大刀阔斧。这不,春季大扫除行动又开始了。其中最“著名”的产品是已有8年历史的Google Reader。


冰冻三尺非一日之寒。Google关闭Google Reader只是系列动作的最后一个步骤。在有了Google+之后,Google Reader就已经被剥离了社会化的内核,并且几乎没有留下什么员工对它进行维护。Google推出的最后一个以RSS为核心的产品是AdSense for Feeds,一个对RSS订阅源进行货币化的广告产品。想对最后的忠实用户,具有浏览洁癖的极客播放广告?这个想法很不好。2012年12月3日,AdSense for Feeds关门大吉。现在Google就只剩下FeedBurner这唯一的一颗RSS种子了。


别了,Google Reader。对于视之为吸收信息的海绵的极客来说,这多多少少有点依依不舍,但对于一般的互联网用户来说,也许仿佛它就未曾来过。RSS几乎从来就没有赢得过普通互联网用户的青睐,当然,对信息获取如饥似渴的极客而言,RSS简直就是他们的乐园。看到喜欢的网站,找到RSS的链接,然后点击并订阅,正如它的名字Really Simple Syndication一样,同步真的非常简单,不是吗?不是的,要想把它解释给其他人听有点困难。为了尽量让解释通俗易懂,有人曾经这样打过比方:“其实就是把内容变成电视台,你订了哪个台就收看哪个台。”这种努力失败了,作为技术,RSS太宅了,对一般的消费者没有吸引力。


对于一般人而言,微博这个RSS阅读器更容易接受。三人行必有我师,但凡知识渊博者、乐意分享者,我加关注成为其粉丝,站在巨人的肩膀上岂不看得更高更远?


与微博相比,RSS阅读器稍欠亲和。而与Flipboard之流相比,RSS阅读器又略逊风骚。是,对于极客来说,信息就够迷人的了,而且只有信息才是迷人的。但对于普罗大众来说,形式很重要,有时候甚至比内涵还重要。冷冰冰地浏览信息流不够性感。


实际上,很多流行的互联网产品,往往是极客先使用,然后再推广到普通互联网用户那里才流行起来的,比如说Instagram。RSS之所以流行不起来,不得不说是启蒙的失败。


轻轻地,你走了,就好像从没来过。


但我会带走那片云彩

除非注明,本站文章均为原创或编译,转载请注明: 文章来自 36氪

36氪官方iOS应用正式上线,支持『一键下载36氪报道的移动App』和『离线阅读』 立即下载!

少年包青天3配乐

一.简介:
   少年包青天配乐以诡异悬疑恐怖著称,武侠音乐系列中曾收录的一首《线索》更是让大家领教到了悬疑音乐的魅力。今日在下特来将其中的一些音乐截取部分消除人声,而得到以下的11首音乐。也是网上唯一的一个比较全的少年包青天配乐集!!

二.音乐创作者:
少年包青天1,2
原创音乐:韦启良
少年包青天3
原创音乐:郭斗之

三.曲目列表:
01.线索
02.恐怖之乐
03.悠闲
04.独入逍遥岛
05.另有玄机
07.静思
06.拜祭李如
08.幽怨
09.再现李如
10.震惊
11.皇朝威仪

四.截取者:
丘九天,碧海青天,花和尚等

五.曲目详解:
   本剧配乐以悬疑恐怖音乐为主,悠闲静思时候也有很多忧伤沉寂的音乐。、以上11首,1,2,4,5为悬疑恐怖音乐,3,6,7,8大致为忧伤沉寂类的音乐。而9可算是表现突然高兴的重逢音乐,10,11更是真想大白,突然失望悲伤的震惊音乐了。
其中,
04.独入逍遥岛:展昭一人于竹筏之上,独入世外之境的逍遥岛时的音乐。
09.再现李如:三廉王四处寻找,发现李如坟墓时的音乐。
10.震惊:少年包青天3中大结局,发现皇帝才是凶手时的音乐。
11.皇朝威仪:包拯请出太祖黄袍,令皇帝也下跪时的音乐。

六.权利声明:
   由于这部电视剧没有发行原声带,所有音乐由我和道友一起截取并部分消除人声而得到的。这些音乐中没有完全将人声消除,也并没有大范围传播,仅限于个人欣赏或者研究用,请不要做其他用途。


BOX下载

Eclipse安装插件后不显示的解决办法

有时候一些 eclipse 插件安装之后,打开 eclipse 死活都不显示,这时候可以:

① 把 eclipse/configuration/org.eclipse.update 删除掉。出现这种情况的原因是在你安装新的插件以前你启动过 eclipse ,在 org.eclipse.update 文件夹下记录了插件的历史更新情况,它只记忆了以前的插件更新情况,而新安装的插件它并不记录,所以删除掉这个文件夹就可以解决这个问题了,不过删除掉这个文件夹后, eclipse 会重新扫描所有的插件,此时再重新启动 eclipse 时可能会比刚才稍微慢点。

② 创建一个 Eclipse 快捷启动方式,在目标栏中加入一个“ -clean ”参数(前面有个空格),如果启动 eclipse 后找到你所安装的新插件后,在下次启动之前把参数 clean 去掉就可以了。

③ 最厉害的:如果 Eclipse 启动还是找不到插件的话,在 eclipse/configuration 目录下的 config.ini 文件中加入一行 :

sgi.checkConfiguration=true 


这样它就会寻找并安装插件。
注意找到插件后可以把该行注释掉 ( 去掉 ), 这样以后每次启动就不会因为寻找插件而显得慢了。


4.打开Help ->Software Updates ->manage configuration,点击show disabled features,会显示disabled 的插件,右键选择XXX,点击enable即可. 此项功能在myeclipse才有,eclipse里没有。
5.使用link方式安装的时候,如果不显示,可以删除插件目录的site.xml文件试试。

放诸古今皆准的权力规则

放诸古今皆准的权力规则:
(《东方早报·上海书评》,2013年3月10日)
十九世纪末的比利时国王利奥波德二世完全有理由成为一些人心中的偶像。他大力推动民主自由,在四十多年的任期内,把比利时从一个专制独裁国家成功变成了一个现代民主国家。他赋予每个成年男子选举权,甚至比美国提前半个世纪立法允许工人罢工。他对妇女儿童的保护领先于整个欧洲。比利时1881年就普及了基础教育,确保每个女孩都能上到初中,并且在1889年通过法律禁止十二岁以下儿童工作。在利奥波德二世治下,国家的经济像政治一样获得了大发展,他比罗斯福更早采取建设公路和铁路基础设施的手段来减少失业和刺激经济。
然而在非洲刚果这个比利时殖民地,确切的说是利奥波德二世本人的殖民地,他完全是另外一个形象。刚果人,包括妇女儿童,在奥波德二世的统治下没有任何人权,完全是奴隶。他们在警察部队的强制下劳动,动辄被施以断手之类的酷刑,有超过一千万人被迫害致死,而这一切都是为了保证利奥波德二世在橡胶贸易中获得巨额利润。
为什么同样一个人可以在一个国家推行民主却在另一个国家施行最残暴的独裁?有人可能立即会说这是制度问题。但“制度”在这里与其说是答案还不如说是问题本身。为什么比利时的制度越来越民主,而同一时期,同一领导人的刚果,却越来越独裁?难道是因为利奥波德二世只爱本国人或者有种族歧视?但后来刚果自己“选”出来的领导人并没有做得更好,仍然是一个糟糕的独裁者。在The Predictioneer’s Game(《预测师的博弈论》)这本书里,斯坦福大学胡佛研究所和纽约大学的政治学教授Bruce Bueno de Mesquita指出,真正原因是在刚果,利奥波德二世只需要让少数人高兴就足以维持自己的统治;而在比利时,他必须让很多人满意才行。我认为这个答案跟“制度论”的区别在于必须让多少人满意,这个人数不是制度“规定”出来的,而是实力的体现。
Bueno de Mesquita和合作者研究多年,得出了一个能够相当完美地解释很多政治现象的理论。这个理论认为不管是国家、公司还是国际组织,其政治格局不能简单地以“民主”和“独裁”来划分,而必须用三个数字来描写。以国家为例,这个“三围”就是层层嵌套的三种人的人数:
  • 名义选民:在名义上有选举权和被选举权的全体公民。然而他们中的很多人,可能对谁当领导人根本没有任何影响力。
  • 实际选民:那些真正对谁当领导人有影响力的人。对美国来说这相当于是选举这天出来投票的选民,对沙特这样的君主国来说这相当于是皇室成员。
  • 胜利联盟:必须依赖他们,领导人才能维持自己权力的人。对美国总统来说这相当于是在关键选区投出关键一票让你当选的人,对独裁者来说这是你在军队和贵族内部的核心支持者。
看一个国家是不是真民主,关键并不在于是否举行选举,而在于胜利联盟(以下简称“联盟”)的人数。领导人工作的本质是为联盟服务,因为联盟对领导人有推翻权— 如果你不能保证我们的利益,我们有能力随时换一个。如果联盟的人数很多,那么这个国家就是我们通常所说的民主国家。反过来如果联盟的人数非常少,那么不管这个国家有没有选举,它都是事实上的独裁国家。这个理论看似简单,其背后必须要有大量的数学模型、统计数据和案例支持,它们首先出现在政治学期刊上,然后被总结成一本学术著作The Logic of Political Survival(《政治生存的逻辑》),并在2011年形成一本通俗著作The Dictator’s Handbook(《独裁者手册》)。
在通俗史书和影视剧中人们经常研究权术,惊异于为什么像慈禧和魏忠贤这种文化水平相当低的人能够把那些饱读诗书的知识分子玩弄于鼓掌之间。难道政治斗争是一门需要特殊天赋的非常学问么?现在Bueno de Mesquita的“三围”理论,可以说是抓住了政治的根本。所有领导人,不论什么体制,其做事的终极目的只有两个:第一是获得权力,第二是保住权力。要知道即使最厉害的独裁者也不可能按自己的意志为所欲为,他们必须依靠联盟才能统治。为此领导人取悦的对象不应该是全体人民,而必须是联盟。这就是为什么那些一心为民或者能从长远筹划国家发展的领导人即使在民主国家也常常干不长,而那些腐败透顶的独裁者却常常可以稳定在位几十年。从这个根本出发,“三围”理论可以回答我们对政治斗争的种种不解之处。朱元璋为什么要杀功臣?变法为什么困难?为什么民主党欢迎非法移民却反对给高技术移民提供特别渠道?民主的美国为什么会推翻别人的民选政府?为什么一个国家的自然资源越丰富,它就越不可能民主化?为什么经济发展并不一定能带来民主?所有这些问题都可以用领导人和联盟的互动来解释。三围理论能把种种帝王之术解释的明明白白,可以说是学术版的“厚黑学”和现代版的《韩非子》。
政客搞个什么政策,常常从意识形态出发来给自己找理由。比如共和党经常谈论家庭价值,什么反对同性恋和堕胎之类。这些所谓的自由或保守思想都是说给老百姓听的。真正重要的是不同政党各自代表一部分选民的利益,并都争取中间派。政客,是一种比老百姓理智得多的动物,他们并不从个人好恶出发做事,背后完全是利益计算。《独裁者手册》提出了五个通用的权力规则。不管你是独裁者还是民主国家领导人,还是公司的CEO,哪怕你对如何治理国家和管理公司一无所知,只要能不折不扣地执行以下规则,你的权力就可保无虞。
  1. 要让联盟越小越好。联盟人数越少,收买他们要花的钱就越少。
  2. 要让名义选民越多越好。名义选民多,一旦联盟中有人对你不满,你就可以轻易替换掉他。
  3. 控制收入。领导人必须知道钱在哪,而且必须能控制钱的流动。萨达姆上台七年前就已经掌控了伊拉克的石油。
  4. 好好回报联盟对你的支持。一定要给够,但是也不要过多。
  5. 绝对不要从联盟口袋里往外拿钱给人民。这意味着任何改革如果伤害到联盟的利益就很难进行。凯撒大帝曾经想这么做,结果遇刺身亡。历史上变法者常常以失败告终。
也就是说领导人要做的事情其实非常简单:通过税收、卖资源或者外国援助拿到钱,用一部分钱把联盟喂饱,剩下的大可自己享受— 或者,如果是好的领导人的话,也可以拿来为人民某点福利。一个有意思的问题是既然联盟必须拿到回报,而警察又是一个重要的联盟力量,为什么独裁国家的警察工资反而都比较低?答案非常简单:因为对领导人来说纵容警察腐败是比直接给他们发钱更方便的回报办法。
联盟是领导人的真正支持者,但由于其掌握推翻领导人的手段,他们也是领导人的最大敌人。领导人对付联盟,除了必须收买之外,还有一个用外人替换的手段。路易十四继位初期联盟里的贵族都不是自己人,他的做法就是扩大名义选民,给外人进入政治和军事核心圈子的机会,用新贵族替代旧贵族,甚至把旧贵族关进凡尔赛宫,使这帮人的富贵只能依靠他。对领导人来说,联盟成员的能力不重要甚至反而有害,忠诚才是最重要的。朱元璋为什么要屠戮功臣?就是要削弱联盟的能力,同时证明联盟成员是可替换的。我们完全可以想象中国皇帝的统治之所以稳定,一个很大原因就是通过科举制度扩大了名义选民,让功臣和贵族始终保持一定的不安全感。
联盟和名义选民的相对大小关系,是政治格局的关键。有没有投票选举,有没有自由媒体,有没有三权分立,有没有监督机制,都是细节而已。只有当联盟人数足够多,成功的民主政治才有可能实现。如果联盟人数少,哪怕在民主国家也会发生独裁式腐败。此书中有个好例子。美国加州贝尔市人口不足四万,经济很差,然而其市长却给自己定了个78万美元的高年薪,其市政委员会成员年薪也有10万— 要知道洛杉矶市长年薪才20万,美国总统才40万,其它地方的市政委员会工资不过每年几千而已。贝尔市长能做到这些,恰恰是其成功设计了一场参加人数很少的投票,把贝尔市从普通城市变成“宪章城市”。这意味着很多事情可以关起门通过少数几个联盟成员自己做。
国际奥委会和国际足联都是小联盟组织,这就是为什么它们都很腐败,而且它们的主席都能在任很长时间。国际奥委会总共只有115个委员席位,重大决定只需要赢58票。这意味着只要收买少数委员就能在很大程度上左右投票结果,而众所周知奥委会委员在决定奥运举办城市时的确会接受贿赂。据BBC估计现在贿赂奥委会委员的总价码大约不过才一千万美元。国际足联更腐败,你只需要13票!所以贿赂他们一个人需要的钱就更多,据报道有一个委员的亲口开价是单人八百万美元。也只有腐败,才能解释把世界杯主办权交给卡塔尔这样的荒谬决定。其实消除腐败的办法很简单:扩大联盟人数。比如可以给全体奥运会运动员投票权,不过奥委会主席是不会赞成这个建议的。
上市公司虽然有广大的小股东(名义选民),但是董事会往往只有十几个人。联盟人数极少,对CEO来说是一个容易形成独裁的局面。一般人可能想象CEO的工资应该跟他的业绩密切相关,而据《经济学人》2012年报道的最新统计,CEO工资跟业绩根本没关系!事实上,CEO的最佳策略不是搞业绩而是搞政治。他们必须在董事会安插自己的人马,研究表明越是在董事会有亲信的CEO,他们的在位时间就越长。比如惠普女CEO Carly Fiorina因为行事高调和错误收购康柏,现在已经成了IT史上的笑话,但是她在任内做的每个动作都符合权力规则。Fiorina一上台就不断在董事会排除异己,减少联盟人数。而她不顾市场反对坚决收购康柏,正是为了扩大名义选民,进一步冲淡董事会中对自己的反对势力。然后她给新的董事会加薪,正是收买联盟。当然最后因为惠普的业绩实在太差,股价一跌再跌,Fiorina任职六年后被迫在2005年下台。就是这样她仍然得到一笔巨额遣散费。其实Fiorina被赶下台的关键还是董事们都有股票,他们对股价的关心最终胜过了对Fiorina“喜爱”。我们完全可以设想倘若惠普不是一个公司而是一个国家,也许Fiorina就会在领导人的位置上一直干下去。
那么在人民享有广泛的投票权,联盟人数理论上可以达到全体选民的一半的民主国家,权力规则是否还起作用呢?答案是民主国家领导人与独裁国家领导人并无本质区别:他们都必须优先保证自己铁杆支持者的利益。
Bueno de Mesquita提出,当我们谈论民主政治的时候必须了解一点:所谓“国家利益”,其实是个幻觉。国家作为一个抽象概念并没有自己的利益 — 是国家中的不同人群有各自不同的利益。政客们无非是代表一定的利益集团进行博弈而已。因为联盟人数太多,民主国家领导人没有办法直接用钱收买联盟,但是可以给政策。以美国大选为例,奥巴马的铁杆支持者就是穷人,以西裔和黑人为代表的少数民族,年轻人和女人。那么他当选后就一定要把大量税收用于社会福利,加强医保和社区服务。最近罗姆尼败选后就此大大抱怨,但是罗姆尼当选也得回报自己的支持者。美国政界常见的“专项拨款(earmark)”和“猪肉桶(pork barrel)”现象,就是政客回报自己选区的特定选民的手段。《独裁者手册》列举了权力规则在民主国家美国的种种体现:搞集团投票(block voting),国会选举要划分选区,就是为了减少联盟人数;民主党倾向于增加移民并给非法移民大赦,就是要扩大名义选民;两党都特别重视税法,就是要控制钱;民主党搞福利,共和党支持把大量研究经费投入到疑难杂症等往往只对富人有利的研究,就是为了回报各自的联盟;共和党反对给富人加税和医保改革,就是因为绝对不能动自己联盟的利益。美国以外,种种选举中的政治手段也是屡见不鲜。在新加波不给李光耀的党投票的选区的住房计划会被削减;有些国家存在直接买票的情况,而更高级的做法则是哪个村子投给我的票最多,我当选之后就给哪个村修条路。
有这么一帮人,他们相信民主国家的领导人真心热爱民主,希望能借助外国力量推动国内的民主。这帮人太天真了。民主国家领导人的确要取悦人民,但仅限于其本国的人民。事实上,民主国家领导人在国内处处受限,但在对外政策上却可以像独裁者一样行事。美国总统爱说美国要在世界范围内推进民主,而此书指出,这全是胡扯。美国对外政治的唯一原则是确保美国人的利益。为此美国要求外国政府施行有利于美国的政策。这有两个办法,不常见的办法是战争,常见的办法则是对外“援助”。
2010年,女经济学家Dambisa Moyo出了一本书,Dead Aid(《援助已死》),列举大量事实证明发达国家对非洲的种种所谓援助,根本没有起到任何正面作用。实际情况是绝大多数援助金额和物资被当地独裁者占有,他们正好可以用这笔收入回报联盟。你想给独裁国家饥民提供直接援助,该国政府会首先要求你交税。然而明知援助无效的情况下,为什么发达国家和国际组织仍然要继续提供援助呢?因为援助的目的本来就是收买独裁政府。援助其实就是一个幌子,就好像以对方小孩上大学为名义的行贿一样,你要当真去考察这钱是不是交了学费就荒唐了。美国曾经通过对埃及援助来促成埃以和谈,埃及政府拿了钱办了事却并未在本国宣传美国的好,埃及老百姓反而更恨美国了。
Bueno de Mesquita使用一个简单的数学模型证明,越是联盟人数少的国家,它的政府就越容易被收买,因为收买少数人花不了多少钱。同样一笔钱投给民主国家可能什么问题都解决不了,投给独裁国家却可以立即让该国政策发生一个改变 — 所以越是独裁国家,越容易出内奸。给一个独裁国家援助,等于帮着独裁者收买联盟来巩固自己的地位。此书介绍了一个很有意思的研究,统计发现那些当选联合国安理会成员国的国家,在其任期内,经济发展和政治自由都变的更落后了!为什么?因为更大的发言权可以换来更多援助!很明显,这个安理会效应在独裁国家更强。
从容易收买的角度看,美国领导人更喜欢独裁的外国政府。最近一系列非洲国家民主化以后给美国带来了很大麻烦。在历史上如果一个民选的外国政府对美国人不利,美国甚至可能直接出兵干掉这个民主政府,然后换上一个独裁傀儡,比如智利的皮诺切特。有人可能会说难道美国人民不喜欢推行民主么?没错,但这种喜欢仅限于口头说说,如果你要让他们拿自己的利益换别人的民主,那就不干了。《独裁者手册》生动地说,什么叫民主?民主就是government of, by, and for the people at home
尽管此书对美式民主的弊端多有披露,有人对此书的一个批评仍然是其大大美化了美国的民主,而且高估了美国胜利联盟的人数。有研究表明很多美国选民的意志并没有在获胜后得到体现。但不论如何,这本书的基础论述是可取的。在我看来此书并没有把民主神圣化,它只是用一个有点愤世嫉俗的态度告诉读者,独裁体制收买少数人,民主体制收买多数人,本质都是收买。
我读此书的一个突出感受是民主的本质就是让老百姓过好当前的小日子,而不要谈什么长远目标和伟大理想。有人认为民主是一个手段,其实民主本身就是目的。书中列举好几个研究数据,说明在相似经济发展条件下,民主国家的教育与医疗水平,地震等自然灾害死亡人数,都明显优于独裁国家。一个有意思的统计是越是独裁国家,从首都机场机场到首都市区的公路修得就越直,因为独裁国家征地容易。
我们甚至可以说民主制度就是一种以满足人民短期利益为目标的福利制度。一个最能说明问题的现象就是所有政府都乐意借钱,因为借钱可以自己花,还钱则是下届政府的事。而且就算你不借钱,你的竞争者也会借钱,还不如你借了钱,给政府负债,反而让竞争者不好接手。政府借来钱不必生利,直接分给联盟收买人心就行。唯一能限制独裁政府借钱的是别人愿意借给他多少钱。唯一能限制民主政府借钱的是他万一还不上债会被降低信用等级。本来经济增长的时候正好还债,但西方政府没有这么做,他们有钱了也不还。当一个政客批评别的政客不顾国家长远利益借钱花,他的实际意思是说怎么这钱不是我借的!
尽管民主也有很多弊端,它仍然比独裁强得多,绝大多数人恐怕还是宁可生活在一个自由民主的国家里。那么到底怎样才能成为真正的民主国家?民主的一个先决条件是政府必须是人民纳税养活的。如果这个国家拥有石油之类的自然资源,独裁者只需把这个资源控制在手里就能确保足够的收入去喂饱联盟,那么他就任何时候都不需要什么民主。我们现在看缅甸似乎有民主化的迹象,但是按此书分析,缅甸自然资源非常丰富,军政府靠卖资源就能获得巨大收入,在这种情况下想搞民主很难。只有在国家收入必须依赖税收的情况下,独裁者为了获得收入才有可能给人民更多自由,市场经济才有可能。俄罗斯现在民主程度下降,一个重要原因是石油涨价了。此书甚至设想如果当年石油也有这么贵,可能戈尔巴乔夫根本没必要搞改革。
实行民主的另一个条件是最好在这个国家的建政之初,联盟的人数就比较大。有人把华盛顿施行民主而不称帝归结于他的个人美德,这是大错特错,其实华盛顿哪有称帝的资本!美国建国靠的军事力量本身就是各州组成的一个联盟,根本不是谁一家独大的局面。
那么现在世界上这些独裁国家,怎样才能过渡到民主呢?一个常见的论点是认为经济发展会带来民主。这个论点的逻辑是说经济发展必然会让人民变得更加自由,而富裕和自由的人民必然会要求更多的民主权利。此书对这个论点不屑一顾。问题是当一个国家的经济增长,其政府的收入也会上升,领导人手里有足够多的钱可以很好地安抚联盟,他日子过得好好的为什么要搞民主?历史的经验表明反而是一个国家经济出现严重问题,乃至于领导人没钱了按不住联盟的时候,这个国家更有可能突然实行民主。从这个角度说经济危机的时候借给独裁者钱,等于帮他维持统治。为什么几年前埃及发生了革命?此书提出这是因为军队没有像以往一样镇压上街群众。而军队之所以旁观是因为穆巴拉克没钱了,联盟感到他已经不能保证自己的利益。穆巴拉克之所以没钱,则是因为正好在经济不行的时刻美国减少了对埃及援助。
归根结底,民主的本质不是选举,而是联盟人数多。所以民主化的根本办法就是扩大联盟人数。但是这一点不能指望领导人,因为根据权利规则,领导人在任何情况下希望的都是减少联盟人数。而另一方面名义选民则在任何情况下都希望扩大联盟人数。真正能让联盟扩大的,其实是联盟本身。独裁国家的联盟成员本来是不希望联盟扩大的,因为联盟人数越少,每个人能得到的利益就越大。然而人数少也意味着存在不安全感,领导人可以随时替换他们,这还不算在政权更迭的时刻联盟本身能不能继续存在都成问题。这样联盟有可能会乐意增加人数来换取安全感。我们看有人评价前苏联解体是《来自上层的革命》,也许就是这个机制起的作用。
《独裁者手册》进一步使用了一个相当简陋的数学模型来说明如果联盟人数继续增加,他们反而会因为这个增加而获得经济上的好处。这个模型是这么算的:联盟人数增加意味着国家更民主,于是税率会降低,于是人民会更加乐意工作,于是经济增长,于是每个人的收入都增加。在我看来这个模型相当不可靠,单说“民主国家税率低”这个论点,就让欧洲那些高福利国家情何以堪。
我想,经济发展带来民主这个论点还是有道理的。正如去年出版的The Rational Optimist(《理性乐观派》)这本大肆鼓吹商品交换带来人类一切好处的书所论证的,所谓民主和法治这些东西,并非是哪个强人自上而下赐予人民的,而是人民在市场交换过程中互相磨合和演化出来的。随着经济发展,国家中会涌现出越来越多的敢于要求更多权利的人来。这些人如果足够多,他们将是所有政党都必须争取的对象。
他们想加入胜利联盟!










Mp3Tag 教程

之前一片文章中因Google Music乱码的问题涉及到Mp3Tag这款软件,不过一下这篇文章更加详细
Mp3Tag 教程:
虽然常见的音频播放器如千千静听、foobar2000已经具有简单的音乐标签编辑功能,但是有时候仍然不能满足我们的需求。下面我们一起来学习如何使用 Mp3Tag 对音乐标签进行编辑和管理。

1. 下载安装 Mp3Tag

访问 Mp3Tag 官网下载页面,下载 Mp3Tag 最新版本。
运行 Mp3Tag 安装程序,首先选择安装程序的语言,选择简体中文 Chinese (Simplified)。此后的安装过程较为简单,需要注意的是在选择安装组件设置处可以勾选最后一项 Explorer Context Menu,这样我们就可以在资源管理器右键菜单中使用 Mp3Tag 选项快速打开需要编辑标签的文件或文件夹。

2. 初始设置

启动 Mp3Tag 之后,我们会发现 Mp3Tag 仍然是英文界面,首先我们设置一下界面语言。
点击 Tools 菜单,选择 Options 选项,然后在弹出的 Options 对话框中选择 Languages 类别,在右侧语言列表中选择“Simpl. Chinese 简体中文”,点击 OK 确定。Mp3Tag 会提示需要重新启动程序,确认之后重新启动即可。
“工欲善其事,必先利其器”,现在我们对 Mp3Tag 进行一些初始设置。
点击工具菜单,选择选项,或者按下 Ctrl + O 快捷键组合,启动 Mp3Tag 选项设置。
首先选择“标签”类别,勾选“使用光标移动键或鼠标单击时保存标签”,这样在切换不同音乐文件时可以自动保存音乐标签。
然后选择“标签”类别中的“Mpeg”子类别,推荐大家参照下图设置,将 MP3 标签保存为 ID3v2.3 格式。因为 ID3v2.3 UTF-16 是目前兼容性最佳的 MP3 标签格式,主流音频播放器及 Windows 7的库都支持 ID3v2.3 标签,在 Linux 系统中也不会出现乱码问题。

现在选择“标签面板”类别,如果大家对 Mp3Tag 主界面左侧的标签面板可编辑的标签字段感到不满意的话,可以在此添加。
设置完毕,点击确定即可。

3. 基本使用

首先我们学习如何直接使用 Mp3Tag 编辑音乐标签,点击文件菜单中的“改变工作目录”“添加目录”或者“打开播放列表或Cuesheet”可以将需要编辑的音乐文件添加到 Mp3Tag 中,Mp3Tag 支持一下常见音频格式:
  • Advanced Audio Coding (aac)
  • Free Lossless Audio Codec (flac)
  • Monkey’s Audio (ape)
  • Mpeg Layer 3 (mp3)
  • MPEG-4 (mp4 / m4a / m4b / iTunes compatible)
  • Musepack (mpc)
  • Ogg Vorbis (ogg)
  • OptimFROG (ofr)
  • OptimFROG DualStream (ofs)
  • Speex (spx)
  • Tom’s Audio Kompressor (tak)
  • True Audio (tta)
  • Windows Media Audio (wma)
  • WavPack (wv)
Mp3Tag 主界面如下图所示,左侧为标签面板,在此可对音乐标签进行手动编辑,右侧为文件列表,在此可以选择不同的音频文件(如果打开的是 cue 文件的话,那么此处便为不同的音轨)。

首先在右侧文件列表选择需要编辑标签的文件(可以选择多个文件进行编辑),然后在左侧标签面板就可以对音乐标签进行编辑了,按下 Tab 键可以切换不同的标签字段。如果之前勾选了“使用光标移动键或鼠标单击时保存标签”选项,在编辑完毕之后就可以按下 Ctrl + N 切换到下一个文件,Mp3Tag 会提示已经保存标签,按下回车键确认即可继续编辑。需要特别注意的是如果之前没有勾选“使用光标移动键或鼠标单击时保存标签”选项的话,Mp3Tag 是不会在切换音乐文件时自动保存标签的,因此所做的修改会全部丢失!
现在我们来学习如何实现标签和文件名之间的转换,这也是我们经常要用到的功能。
首先是从标签到文件名的转换,首先选择需要转换的文件,然后点击转换菜单中的“标签 – 文件名”选项,弹出如下图所示的对话框。

在格式串文本框中填入符合自己需要的格式串,可以控制转换后的文件名,右侧的黑色小箭头可以选择常用字段,下面是一些常见字段的含义:
  • %album%:专辑
  • %artist%:艺术家
  • %genre%:流派
  • %title%:标题
  • %track%:音轨
  • %year%:年代
格式串文本框下方可以预览转换之后的的文件名,设置完毕之后点击确定,Mp3Tag 会提示对多少个文件名进行了修改。
然后是从文件名到标签的转换,首先选择需要转换的文件,然后点击转换菜单中的“文件名 – 标签”选项,弹出如下图所示的对话框。

与“标签 – 文件名”类似,此处我们也需要填入格式串,格式串文本框下方可以预览转换之后的标签,设置完毕之后点击确定,Mp3Tag 会提示推导出多少文件的标签。
Mp3Tag 还可以实现从文件名到文件名的转换,但是该功能并不常用,此处不再赘述。

3. 连线获取音乐标签

如果有收集整张专辑的习惯,那么使用 Mp3Tag 可以在网络上获取音乐标签,而无需手动输入,非常方便。
Mp3Tag 内置了 freedb、Amazon、discogs 和 MusicBrainz 几个标签数据源,通常而言,使用 freedb 和 Amazon 可以找到许多流行的欧美音乐标签信息,其他两个标签数据源并不常用,可以不予理会。
使用内置标签数据源非常方便。对于 Amazon.com 来说,选择整张专辑的音乐文件,然后选择“标签数据源”菜单中的“Amazon.com”,然后在弹出的对话框中输入搜索关键词(请尽量精确输入),输入完毕之后点击下一步,稍等片刻就会弹出搜索结果列表,选择相应专辑之后点击下一步,进入如下图所示的调整标签信息对话框。

此处需要调整音轨,也就是把文件和相应的音轨对应起来,在文件列表中用鼠标拖动文件与标签信息相对应即可。因为默认排列的方式是按文件名排列,如果原来的音乐文件有音轨信息,首先使用“标签 – 文件名”将文件名转换成以音轨序号开始的形式就可以省去这一步骤。调整完毕后点击确定即可。
对于 freedb 来说,情况略有不用,选择文件之后点击“标签数据源”菜单中的“freedb”,此时会弹出如下图所示的对话框,选择默认的“根据选定的文件查找信息”即可,点击确定,如果可以找到相应专辑的话稍等片刻就会进入“调整标签信息”对话框,调整方法与上文所述一致。

如果内置的标签数据源不能满足需求的话,可以添加标签数据源。下面我推荐几个不错的标签数据源:freedb 日本語、豆瓣和 Amazon.co.jp。下面我们来看看如何添加标签数据源:
freedb 日本語属于 freedb 类服务,添加方法与其他标签数据源不同,点击工具菜单,选择选项,或者按下 Ctrl + O 快捷键组合,启动 Mp3Tag 选项设置。选择“标签数据源”类别下的“freedb”子类别,将“地址”文本框修改为freedbtest.dyndns.org,点击确定即可。

需要注意的是原有的 freedb 服务器会被替换,而 freedb 日本語的服务器上以日语音乐信息为主。如果要恢复到原有的话请点击端口文本框右侧的“当前Internet上可用的freedb服务器列表”按钮即可恢复。
freedb 日本語的使用方法与 freedb 一致,选择“标签数据源”菜单中的“freedb”即可。
豆瓣、Amazon.co.jp 则都是从相应网站抓取标签。添加方法非常简单,首先下载对应的标签数据源文件(.src),然后将其复制到 %appdata%\Mp3tag\data\sources 目录下,如在笔者的电脑上为 C:\Users\Terry Chen\AppData\Roaming\Mp3tag\data\sources(运行豆瓣插件压缩包中的 OpenSourcesDirectory.bat 可以快速打开此目录),重新启动 Mp3tag 即可在标签数据源菜单中选用,使用方法与 Amazon.com 一致。
豆瓣标签数据源插件下载地址
Amazon.co.jp 标签数据源插件下载地址

4. 从文本转换标签

对于一些专辑,我们虽然可以在网络上搜索到相关专辑信息(例如歌手的官方网站),但是在标签数据源中却搜索不到,那么我们就需要手动修改了。不过利用“标签列表文件 – 标签”的转换功能,我们可以很方便实现从文本文件到标签的转换。
首先为了在创建标签文件时更为方便,首先我们需要将音乐文件名进行转换。标签列表文件中是通过文件名将音乐文件与标签信息对应起来的,所以应该将音乐文件名转换为比较简单的形式,推荐大家使用数字作为文件名,如 01.flac 等。
然后开始创建标签列表文件,在标签列表文件中,每一行代表着一个单独的文件,标签列表文件的写法没有硬性要求,此后在转换时通过指定格式串识别,需要注意的是每一行都必须有对应的文件名,不同字段的信息请使用文件名中的非法字符进行分割,如 / * | 等等,以避免与文件名混淆。同一个标签列表文件中必须按照相同的格式编写,例如可以按照“%_filename_ext%|%title%”的格式串编写,下面是以 Eagles 的专辑 Hotel California 为例编写的标签列表文件:
01.FLAC|Hotel California

02.FLAC|New Kid in Town

03.FLAC|Life in the Fast Lane

04.FLAC|Wasted Time

05.FLAC|Wasted Time (Reprise)

06.FLAC|Victim of Love

07.FLAC|Pretty Maids All in a Row

08.FLAC|Try and Love Again

09.FLAC|The Last Resort
标签列表文件看似复杂,实际编写很简单。我们既可以利用记事本中的替换功能,也可以使用 Excel 编写。
最后进入 Mp3Tag,导入相关音乐文件,按下 Ctrl + S 快捷键组合全选,然后点击转换菜单中的“文件名 – 标签”选项,弹出如下图所示的对话框。

在“文件名”文本框中填入标签列表文件的路径,或者点击右侧按钮浏览。在“格式串”文本框中输入相应的格式串,如“%_filename_ext%|%title%”,其中“%_filename_ext%”是指文件名,需要手动输入或复制,无法在右侧菜单中选择;“|”则是分隔符,可自行选择其他无法在文件名中使用的特殊符号;“%title%”则是相应的字段,可在右侧菜单中选择。
设置完毕之后点击确定,即可开始转换,完成之后 Mp3Tag 会提示多少文件成功转换。

5. 动作

Mp3Tag 内置了强大的动作功能,可以帮助我们快速进行一些自定义操作。
点击“动作”菜单,选择“动作组”,弹出“动作组”对话框,在此处我们可以自定义常见的动作,从而可以快速执行一些重复操作。

Mp3Tag 已经内置了三个动作组,Case conversion、CD-R 和 Standard,作为动作组的实例,双击相应动作组我们可以查看具体动作组进行了什么样的动作,例如,Case conversion 就包含了将所有以(-_开头的字段转换为大小写混合的动作。
动作组列表右侧的按钮可以对动作组进行管理,我们可以点击新建动作组按钮,输入动作组名称,然后自定义自己的动作组。

自定义动作组的对话框与管理动作组的的对话框有些类似,我们可以在此新建适合自己需要的动作,下面介绍Mp3Tag 支持的动作类型:
  • 大小写转换:

    对指定的标签字段(如 ARTISIT、TITLE 等等)、文件名(_FILENAME)甚至字段名称(_FIELDNAME)进行大小写转换。

    支持大写字母、小写字母、大小写混合和句子四种模式,下面用例子说明其区别:

    大写字母:

    AIR – MOON SAFARI – 03 – ALL I NEED.MP3

    小写字母:

    air – moon safari – 03 – all i need.mp3

    大小写混合:

    Air – Moon Safari – 03 – All I Need.mp3

    句子:

    Air – moon safari – 03 – all i need.mp3
  • 转换代码页:

    如果在 Mp3Tag 中音乐标签显示乱码的话,可以尝试进行代码页转换,只要选择相应的字段及原始代码页(如 Chinese (Traditional) – 中文(繁體))即可。
  • 导出:

    导出标签信息,较不常用,不多加介绍。
  • 导出唱片封面到文件:

    将音乐文件中内嵌的唱片封面导出到相应文件,可以指定文件名的具体格式,支持 %artist% 和 %album% 等字段的使用。
  • 格式化值:

    使用自定义格式串格式化某个字段的值,也可以用于将某个字段的值复制到另一个字段中。

    例如,将字段设置为 ENCODEDBY,将格式串设置为 %comment%,就可以将 COMMENT 字段复制到 ENCODEDBY 字段。
  • 猜测值:

    如果目前某个字段包含了两个字段的信息,如标题字段的格式为“Artist / Title”,我们就可以将源设置为“%title%”,将猜测模式设置为“%artist% / %title%”进行分割。
  • 从文件导入唱片封面:

    从相应文件导入唱片封面,可以指定文件名的具体格式进行导入,支持 %artist% 和 %album% 等字段的使用。
  • 导入文本文件:

    从文本文件中导入相应字段的内容,注意此处只能导入一个字段的内容,可以指定文件名的具体格式进行导入,支持 %artist% 和 %album% 等字段的使用。

    例如,在文件目录中有对应名称的歌词文件,在字段处选择 UNSYNCEDLYRICS,在文件名处输入 %title%.lrc 就可实现内嵌歌词。

    注:由于不同的播放器字段支持比较混乱,如果 UNSYNCEDLYRICS 无法显示歌词的话请尝试使用 LYRICS 字段。
  • 合并重复的字段:

    将重复的字段进行合并,利用格式串进行设置,较不常用,不多加介绍。
  • 删除重复的字段:

    删除重复的字段,只留下最后一个字段的内容,较不常用,不多加介绍。
  • 清除字段:

    清除指定的字段,可键入多个字段,例如使用 COMMENT;PICTUR 清除备注和图片。
  • 清除多余的字段:

    清除指定字段之外的字段,可键入多个字段,例如使用 ALBUM;ARTIST;COMMENT;GENRE;TRACK;YEAR 清除专辑、艺术家、备注、流派、音轨和年代之外的所有字段。
  • 替换:

    将制定字段中的特定词语替换为另外的词语,可以指定全字匹配和区分大小写。
  • 根据正则表达式替换:

    使用正则表达式进行匹配替换,具体用法可参见Replace with regular expression
  • 使用分隔符拆分字段:

    如果目前某个字段包含了多个信息,就可以指定相应字段和分隔符,拆分为多个字段。
在一个动作组中可以设置多个动作,设置完成之后选择相应文件,选择动作菜单中的相应动作组,就可以执行自定义动作了。
上面就是使用 Mp3Tag 的主要方法了,善用 Mp3Tag,我们可以更好地管理我们的音乐文件,和 Windows 7 的新特性配合更是如虎添翼。

参考资料:

本文历史:

  • 2011 年 9 月 1 日:初稿完成
感谢TerryChen





播放器

现在播放器实在是多了点,有的新手觉得眼花缭乱,不知道选什么,今天就来个点评,给大家些参考。(A最高)

普通播放器
1Windows Media Player(系统自带版本

这个是非常常用的播放器,一般网吧,课室都用这个
   
    优点:系统自带,无需安装。新版本是某些随身听播放器传输视频或者音频必须得软件。新版本在声音上有一定改善。
   
    缺点:声音不好听!含糊不清。对各种格式支持非常不好!apeflac这类牛B哄哄的格式别指望能播放的了。打开速度慢,系统资源占用多,缺点太多,就不一一赘述了。

音质指数:C  实用指数:C

2搜狗音乐盒、酷我音乐盒、QQ音乐、青苹果音乐播放器、酷狗音乐

酷我音乐盒


这些都是网络播放器,主要功能是让大家能在播放器内直接选择最新最流行的音乐试听

    优点:内置音乐排行榜,点选热门歌曲直接播放。

    缺点:声音质量差,不支持无损格式,转换,修改文件信息等功能缺乏,只适合做试听之用。

音质指数:D  实用指数:D

3:千千静听


非常大众化的一个播放软件

    优点:使用方便,修改和编辑文件信息效率高,对各种格式的支持和转换都很好,界面也丰富多彩。官方版本自带歌词速配,非常适合想偷懒又想看歌词的人。声音还算过得去。软件还算小巧,占用小。

    缺点:千千的声音对追求音质的人来说太过马虎,特别突出的问题是对DTS文件的播放,出来的效果可以用非常差来形容。默认的配置使用了均衡器(两边高中间低),可以说是扭曲了声音。

音质指数:B+  实用指数:A

4:暴风Winamp


曾经风靡一时的播放器

    优点:界面华丽(默认皮肤来算,如果会弄的话,很多播放器的皮肤都可以很炫),播放mp3声音还不错。功能随着版本更新越来越多。

    缺点:新版本不支持apeflac的播放,需要找插件(麻烦)。随着版本不断更新,软件越来越臃肿,无用功能太多。

音质指数:B+  实用指数:B

5jetaudio


能歌善舞的播放器

    优点:这个是iAUDIO开发出来的播放器,可以播放视频,有录音功能,是个功能比较多的播放器,并且界面华丽。声音方面,和iAUDIO随身听采用同一风格的调音,中频稍微凹一下去一点。但是整体声音还是很不错的。

    缺点:支持ape,但是不支持CUE(囧rz)。界面为英文,软件比较臃肿。

音质指数:A  实用指数:B-

6airplay


小巧玲珑的播放器

    优点:绿色,小巧(只有200多K),打开速度快,有专辑封面自动下载功能!

    缺点:播放质量差,播放无损音乐时爆音很多,一般只是用来下载专辑封面用!封面也不是每张都能找到,外国的很多都找不到。(本软件为国产软件)

音质指数:E-   实用指数:E
7foobar2000
强大且实用的播放器

    优点:基本上支持所有的音频格式。适合追求音质的人使用。功能强大,可以轻松进行各种格式转换,并且支持转换格式时添加DSP。支持asio输出,声音干净。有的版本自带歌词速配。由于foobar插件无数,潜力巨大,重采样到192K,再开asio输出,声音会有明显提升!(适合高手)

    缺点:对新手来说默认界面太过简陋,参数设置项看着就头疼。

音质指数:A     实用指数:A+

8beoplayer


这是个高贵的播放器

    优点:乃是丹麦著名音响品牌B&O出品的播放器。奥迪a8等高端车系才配备的顶级音响,界面风格非常适合高级白领。这个播放器的调音很有意思,模仿高级音响晶莹剔透的感觉,播放mp3时让人眼前一亮。

    缺点:使用不方便,不支持apeflac,无损里面只支持WAV。英文界面(当然也有汉化版),功能不多。可以换的皮肤也不多。

音质指数:A   实用指数:B-

9iTunes


平淡而不平凡的播放器

    优点:这个是苹果公司开发的播放器,专门给使用ipodiphone的人士使用。(当然普通人也可以用)使用惯了的话还算方便。平滑的声音,虽然缺少了激情,但是给人一种歌声娓娓道来的感觉(调音和苹果随身听的风格一致),属于mp3播放器中的精品之作。还可以花钱买到正版音乐,有钱人必备。

    缺点:不能播放apeflac等无损格式音频。初次使用比较麻烦。弹出窗口太多,占用应该也比较厉害,软件也很臃肿。

音质指数:A  实用指数:B-


10:J River Media Center

优点:1、声场比foobar大一圈,声音收的快,foobar相比之下有点乱,低音很结实,很强大。
同样可以使用asio输出
2、好看!

3、资源占用少!看起来很夸张的界面,只占用20M的内存,CPU基本是0
4、功能多多,跟iTunes很像,是个音乐管理软件,第一次使用需要导入媒体库,需要花一点时间(我用了10分钟)可以用来刻录音乐,也可以用来播放视频。

缺点:如果音乐较多,第一次导入时间可能会很长,最好分开来导入;操作没有foobar这么简单明了,需要一段时间习惯。
格式的支持不算很多,但是ape,FLAC,WV,wav这些基本的无损都支持,大部分的有损压缩也支持。
想要像我的一样好看的话,需要下载很多的CD封面,花点时间还是值得的!

音质指数:A+  实用指数:A+


专业播放器
11Cplay


这个是专业用户使用的播放器

    优点:很高质量的声音,给人的感觉很大气,有人比较说:重采样开到192K的foobar才能和他一比高下。

    缺点:必须要有支持asio输出的声卡才能使用该软件,支持格式有限,界面为英文,而且非常简陋,操作复杂。只适合音质狂热爱好者。

音质指数:A++    实用指数:C

12SawStudio


播放器里的神器

    优点:层次分明,清晰自然地声音,胜过foobar可以说是没有什么悬念。(但个人还是认为foobar的调音听着舒服)
这个是用汇编语言写的播放器,好处自然是受到windows影响极小。


    缺点:界面复杂(灰常复杂。。。),只能播放WAV,操作麻烦,不能批量选择歌曲播放(囧rz
没有播放列表等基本播放器的功能。因为这个本来就是专业的混音软件,不是用来当播放器用的。。。。。。

音质指数:A++    实用指数:D





最后,顺便说说各个播放器为啥声音有区别。
一个原因,是解码精度的问题。
例如:
SawStudio 64Bit定点+64bit浮点内部处理精度
foobar2000
64Bit浮点内部处理精度(其他播放器基本都低于这个精度)
解码精度越高,出来声音质量也会越高。

另一个原因,是调音的问题。
比如说前面提到的beoplayer,能用调音模仿出晶莹剔透的感觉,这个可不简单,所以出来的效果会比普通的播放器好。当然,每个人都有自己喜欢的风格,并没有规定哪个调音是最好的。

直通线和交叉线


直通线和交叉线通常指带水晶头(RJ45)的5类双绞线。是根据网线的8个芯,在制作网线头的时候两端线序是否使用同一种标准线序制作来分的。标准线序分A、B两种,A类线序为:绿白、绿、橙白、蓝、蓝白、橙、棕白、棕 ,B类线序为:橙白、橙、绿白、绿、蓝白、蓝、棕白、棕。直通线的两端线序是相同的,而交叉线两端的线序不同。
直通线(straight-through cable) :一根网线,两端的线序相同叫直通线,即两端线序相同,都是568B标准。不同类型设备连接使用直通线,如网卡到交换机、网卡到ADSL modem、交换机到路由器等。

交叉线:(crossover cable) :一根网线,一段为568B线序,另一端为568A线序,即1-3,2-6对调。相同类型设备连接使用交叉线,如两台电脑的网卡,交换机与交换机、交换机与集线器等。部分交换机和集线器有级联口(标注,如“Uplink”、“MDI”,顺序是普通端口1-3,2-6对调后的顺序),交换机的级联口连接其他交换机的普通口使用直通线。双绞线的长度:100M网,主机与交换机直接不超过100m,实际连接时,交换机与机柜需要跳线连接,主机与信息插座也需要跳线连接,所以要求跳线的长度都不超过5m,固定布线的长度不超过90m,中间不能有过多的转接。
双绞线内部线对是按照不同的松紧度绞在一起的,目的是为了减少干扰。使用标准线序也是为了最大限度的减少干扰。不使用标准线序的网线虽然能够连通,但可能干扰较严重,不稳定,无法判断问题。所以不能使用非标准的线序。

关于一些对网络设备初学者,很多时候都分不清楚设备间是用直通线还是交叉线连接,在这里,我根据个人的见解,做一些大概的讲解,希望能够帮到需要的朋友,仅供参考。
正常线序是两端全为
(568A)橙白-橙-绿白-蓝-蓝白-绿-棕白-棕
交叉线一端正常,另一端为
(568B)绿白-绿-橙白-蓝-蓝白-橙-棕白-棕

备注:
直通线:两边的线序一样,即同为568A或者同为568B
交叉线:两边的线序不一样,即一边为568A,另一边为568B

一般情况下,不同的设备之间用直连线,相同设备之间用交叉线。
举个例子:交换机和路由器级连的时候需要用直连线;交换机和交换机之间用交叉线;交换机和PC之间用直连线;路由器和交换机之间用交叉线(路由器可以看做是一个多端口的PC。交换机是二层设备,路由器是三层设备);ADSL猫可以看做是是一个小的路由器,ADSL猫和PC连接也要用交叉线。
关于网络设备的定义和设备间连接方式一般规律:

第一,你需要了解两类设备:DTE类设备和DCE类设备。

DTE 类设备:PC、路由器、交换机uplink口、HUB级联口
DCE 类设备:交换机普通口、HUB普通口
同类设备间相连使用交叉线方式;异类设备间相连使用直通线方式。

说明:
DTE(Data Terminal Equipment)是数据终端设备,也就是具有一定的数据处理能力以及发送和接收数据能力的设备。大家知道,大多数的数字数据处理设备的数据传输能力是很有限的。直接将相隔很远的两个数据处理设备连接起来,是不能进行通信的。必须在数据处理设备和传输线路之间,加上一个中间设备。这个中间设备就是数据电路端设备DCE(Data Circuit-terminating Equipment)。DCE的作用就是在DTE和传输线路之间提供信号变换和编码的功能,并且负责建立、保持和释放数据链路的连接。DTE可以是一台计算机或一个终端,也可以是各种的I/O设备。典型的DCE则是一个与模拟电话线路相连接的调制解调器。我们从图3-10可以看到,DCE虽然处于通信环境内,但它和DTE均属于用户设施。用户环境只包括DTE。

例如:

PC PC 交叉线
PC HUB 直通线
HUB普通口 HUB普通口 交叉线
HUB普通口 HUB级联口 直通线
PC 路由器 交叉线
路由器 路由器 交叉线
PC 交换机 直通线
路由器 交换机 直通线
交换机普通口 交换机uplink口 直通线
交换机普通口 交换机普通口 交叉线
交换机uplink口 交换机uplink口 交叉线
简单的说就是相同设备相连用交叉线连接
例如 两台电脑想互相通信就有交叉线连接
要是两台电脑通过一个交换机相连,那电脑于交换机相连的线是直通线

EVERNOTE

Gson使用

之前写过一篇简单介绍Gson的文章,这两天在网上又找到一个很详细的工程,贴在下面。
gson:谷歌提供的JSON的解决方案。它的站点是http://code.google.com/p/google-gson/。
本人用过org.json和的JSON - lib中提供的解决方案。
先说下org.json,它属于轻量级的JSON的。它能够将Object或者ArrayList的转换为JSONObject的和JsonArrayList。但是在反转换的JSON字符串时却只能够提供字符串的结果。所以比较适合 开发者后期处理。
至于的JSON - lib的在反转方面做得比前者强了许多。它通过JSONObject.fromObject和JSONObject.toBean可以将Bean、ArrayList、HashMap中与JSONObject的互相转换。但是遇到嵌套问题

如一个Bean1->HashMap-> Bean2。当它对该对象反转换时将出现Bean2为JSONObject的对象的情况.

现在讲到gson了.它通过reflection来识别对象.见下面例子:

定义<Bean>
package org.gson.bean;

import java.util.Date;
import com.google.gson.annotations.Expose;
/** 
* 普通的UserBean 
*/ 
public class UserBean {
 @Expose
 //并不是java标准的注解,而是谷歌GSON的注解,表示它所注解的字段不支持序列化。
 private String id; 
 @Expose 
 private String name; 

 private Date birthday; 

 public String getId() { 
   return id; 
 } 

 public void setId(String id) { 
   this.id = id; 
 } 

 public String getName() { 
   return name; 
 } 

 public void setName(String name) { 
   this.name = name; 
 } 

 public Date getBirthday() { 
   return birthday; 
 } 

 public void setBirthday(Date birthday) { 
   this.birthday = birthday; 
 } 

 @Override 
 public String toString() { 
   return "UserBean [birthday=" + birthday + ", id=" + id + ", name=" 
     + name + "]"; 
 } 

}

--------------------------------------------------------------------------------
package org.gson.bean;

import java.util.List;
import java.util.Map;
/** 
 * 包含Arrylist和HashMap,里面保持UserBean 
 */ 
public class GroupBean {
 private String id; 
 private Map userMap; 
 private List userList; 

 public String getId() { 
   return id; 
 } 

 public void setId(String id) { 
   this.id = id; 
 } 

 public Map getUserMap() { 
   return userMap; 
 } 

 public void setUserMap(Map userMap) { 
   this.userMap = userMap; 
 } 

 public List getUserList() { 
   return userList; 
 } 

 public void setUserList(List userList) { 
   this.userList = userList; 
 } 

 @Override 
 public String toString() { 
   return "GroupBean [id=" + id + ", userList=" + userList + ", userMap=" 
     + userMap + "]"; 
 } 

}
---------------------------------------------------------------------------------------------- FilterAnnotationTest
package org.gson.main;

import org.gson.bean.UserBean;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/** 

 * 通過註釋過濾轉換對象 

 */ 

public class FilterAnnotationTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
    UserBean user = new UserBean(); 
    user.setId("1001"); 
    user.setName("张三"); 
    
    /** 
     *  设置注释过滤功能 
     *  Gson gson = new GsonBuilder() 
     *  .registerTypeAdapter(Id.class, new IdTypeAdapter()) 
     *  .serializeNulls() 
     *  .setDateFormat(DateFormat.LONG) 
      *  .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE) 
     *  .setPrettyPrinting() 
     *  .setVersion(1.0) 
     *  .create(); 
     */ 
    GsonBuilder builder = new GsonBuilder(); 
    // 不转换没有 @Expose 注解的字段 
    builder.excludeFieldsWithoutExposeAnnotation(); 
    Gson gson = builder.create(); 

    // 将JavaBean字符串转换为 JSON 
    String sUser = gson.toJson(user); 
    System.out.println(sUser); 
    // {"id":1001,"name":"张三"} 

    // 将JSON字符串转换为 JavaBean 
    UserBean user2 = gson.fromJson(sUser, UserBean.class); 
    System.out.println(user2.getId() + ", " + user2.getName()); 
    // 1001, 张三 
  } 

}


-------------------------------------------------------------------------------------------
package org.gson.main;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import org.gson.bean.UserBean;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/** 
* 模板反射對象Bean 
* @author yansheng 
*/ 

public class TemplateTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
    List<UserBean> testBeanList = new ArrayList<UserBean>(); 
    UserBean testBean = new UserBean(); 
    testBean.setId("1"); 
    testBean.setName("name"); 
    testBeanList.add(testBean); 
    
    Gson gson = new Gson(); 
    Type type = new TypeToken<List<UserBean>>(){}.getType(); 
    
    String beanListToJson = gson.toJson(testBeanList, type); 
    System.out.println(beanListToJson); 
    // prints [{"id":"id","name":"name"}] 

    List<UserBean> testBeanListFromJson = gson.fromJson(beanListToJson, type); 
    System.out.println(testBeanListFromJson); 
    // prints [TestBean@1ea5671[id=id,name=name,birthday=<null>]] 

 }

}

----------------------------------------------------------------------------
package org.gson.main;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/** 
* 簡單的集合使用 
* @author yansheng 
*/ 

public class SimpleCollectionTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
    Gson gson = new Gson(); 

    // 将ArrayList字符串转换为 JSON 
    List<String> testList = new ArrayList<String>(); 
    testList.add("first"); 
    testList.add("second"); 
    
    String listToJson = gson.toJson(testList); 
    System.out.println(listToJson); 
    // prints ["first","second"] 
    
    // 将JSON字符串转换为 ArrayList 
    List<String> testList2 = (List<String>) gson.fromJson(listToJson, new TypeToken<List<String>>(){}.getType()); 
    System.out.println(testList2); 
    
    // 将HashMap字符串转换为 JSON 
    Map<String, String> testMap = new HashMap<String, String>(); 
    testMap.put("id", "id.first"); 
    testMap.put("name", "name.second"); 
    
    String mapToJson = gson.toJson(testMap); 
    System.out.println(mapToJson); 
    // prints {"id":"id.first","name":"name.second"} 
    
    // 将JSON字符串转换为 HashMap 
    Map<String, String> userMap2 = (Map<String, String>) gson.fromJson(mapToJson, 
      new TypeToken<Map<String, String>>(){}.getType()); 
    System.out.println(userMap2.get("id")); 
    
 }

}

-------------------------------------------------------------------------
package org.gson.main;

import java.lang.reflect.Type;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;

import org.gson.bean.UserBean;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

/**
 * 
 * date測試類
 */

public class DateTest {
 /**
  * 序列化方法
  * 
  * @param bean
  * @param type
  * @return
  */
 public static String bean2json(Object bean, Type type) {
  Gson gson = new GsonBuilder()
    .registerTypeAdapter(java.util.Date.class,
      new UtilDateSerializer())
    .setDateFormat(DateFormat.LONG).create();
  return gson.toJson(bean);
 }

 /**
  * 反序列化方法
  * 
  * @param json
  * @param type
  * @return
  */
 public static <T> T json2bean(String json, Type type) {
  Gson gson = new GsonBuilder()
    .registerTypeAdapter(java.util.Date.class,
      new UtilDateDeserializer())
    .setDateFormat(DateFormat.LONG).create();
  return gson.fromJson(json, type);
 }

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  List<UserBean> testBeanList = new ArrayList<UserBean>();
  UserBean testBean = new UserBean();
  testBean.setId("id");
  testBean.setName("name");
  testBean.setBirthday(new java.util.Date());
  testBeanList.add(testBean);

  java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<UserBean>>() {
  }.getType();
  String beanListToJson = bean2json(testBeanList, type);
  System.out.println("beanListToJson:" + beanListToJson);
  // prints [{"id":"id","name":"name","birthday":1256531559390}]

  List<UserBean> testBeanListFromJson = json2bean(beanListToJson, type);
  System.out.println(testBeanListFromJson);
  // prints [TestBean@77a7f9[id=id,name=name,birthday=Mon Oct 26 12:39:05
  // CST 2009]]

 }

}

--------------------------------------------------------------------
package org.gson.main;

import java.lang.reflect.Type;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;

/**
 * 反串行Data
 */

public class UtilDateDeserializer implements JsonDeserializer<java.util.Date> {
 @Override
 public java.util.Date deserialize(JsonElement json, Type typeOfT,
   JsonDeserializationContext context) throws JsonParseException {
  return new java.util.Date(json.getAsJsonPrimitive().getAsLong());
 }
}

-----------------------------------------------------------
package org.gson.main;

import java.lang.reflect.Type;
import java.util.Date;

import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

/**
*  串行Data 
*/ 

public class UtilDateSerializer implements JsonSerializer<java.util.Date> {

 @Override
 public JsonElement serialize(Date src, Type typeOfSrc,
   JsonSerializationContext context) {
  // TODO Auto-generated method stub
  return new JsonPrimitive(src.getTime()); 
 }

}
package org.gson.main;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.gson.bean.GroupBean;
import org.gson.bean.UserBean;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/** 
* 嵌套使用對象Bean 
* @author yansheng 
*/ 

public class NestedTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
    UserBean user1 = new UserBean(); 
    user1.setId("1001"); 
    user1.setName("张三"); 
    
    UserBean user2 = new UserBean(); 
    user2.setId("1002"); 
    user2.setName("李四"); 
    
    Map userMap = new HashMap(); 
    userMap.put("user1", user1); 
    userMap.put("user2", user2); 
    
    List userList = new ArrayList(); 
    userList.add(user1); 
    userList.add(user2); 
    
    GroupBean groupBean = new GroupBean(); 
    groupBean.setId("1"); 
    groupBean.setUserMap(userMap); 
    groupBean.setUserList(userList); 
    
    Gson gson = new Gson(); 

    String sGroupBean = gson.toJson(groupBean, new TypeToken() { 
    }.getType()); 
    System.out.println(sGroupBean); 
    //{"id":"1","userMap":{"user2":{"id":"1002","name":"李四"},"user1":{"id":"1001","name":"张三"}},"userList":[{"id":"1001","name":"张三"},{"id":"1002","name":"李四"}]}

    // 将JSON字符串转换为 HashMap 
    GroupBean groupBean2 = (GroupBean) gson.fromJson(sGroupBean, 
      new TypeToken(){}.getType()); 
    System.out.println(groupBean2); 
    // 张三 

 }

}

GSONTest工程文件 BOX
GSON教程PDF BOX

Quote Of The Day