整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

如何购买特价机票、一折甚至免费机票 太有用了

如何购买特价机票、一折甚至免费机票 太有用了

行最大的费用就是住宿和交通,那么飞机如此简便的今天,如何定到最便宜的机票呢?

现在的网络如此方便,在国内也基本上取消了纸质机票,很多大的机场都可以自助登机,而可以定到便宜机票的方法也越来越多。

除了廉价航空,还有淘宝,拍拍网等很多网站都可以订到超便宜的特价机票,甚至赶上网站推出促销活动的时候,还可以找到1元机票。

许多人问我,怎么定便宜机票。在这里告诉大家几个订票的大网站,其实在很多时候连旺季都是可以买到一折的机票。主要是看你会不会善于利用这些资源,如果能善加利用,那么你的飞机出行也许比火车汽车还要便宜哦!

1.首先,QQ财付通和南航有合作,基本上财付通的特价票都是一折以下的,特别是南航有点的那些国际机票,实在是超值的很,可以减轻你的旅途负担。

南航财付通(网址自己去百度,发不上来),上次去日本和美国就是在这里买的机票,广州-大阪,来回380,加上税也就1100。实在是超级划算!

只是现在特价机票没有那么多了,一般是会提前一个时间出特价机票的通告,然后准点抢票,那个时候就要看你是否手脚够快了!

2.再给大家推荐个廉价机票的搜索引擎:去哪儿网,这是个机票搜索的大平台,也是我用的最多的搜索订票网站。

网站几乎会罗列各大网站的机票信息,是非常实用的一个搜索引擎。里面的一折的条件是要至少提前一个月预计,不到一个月的也有二三折的票。

就算不在这个网站订票,也可以作为一个很好的参考,知道大致上那个时段的机票最低可以到什么价格,然后到各大航空公司的门户网站去搜当时的特价机票,可以省去很多时间。

3.国内廉价航空,比较有名的是春秋航空,这个航空是上海的,很多城市的价格都固定的,比如青岛和上海之间、武汉和上海之间等等都是99块的价格。

春秋航空是廉价航空,所以定机票的时候你要有心理准备,飞机经常晚点,座位小,飞机也很小。上面的服务是自助的,没有飞机餐,也没有养眼的空姐,而且对行李有限重,总之是典型的廉价航空。好处就是很便宜。

4.海航网也经常抛出便宜的机票(官方网址)

最后再告诉大家两个廉价机票的搜索引擎:贤贤网和酷讯网,在里面,你可以查到最便宜的机票时间和所有指定日期最便宜的机票。

我一般定机票的程序,是先上去哪儿网站搜索一下大致机票情况,然后再看看贤贤网,选择所有费用最低的那个订票。

出门旅行总是能省则省,何况网上多搜索一下,也并不会浪费很多的时间。哪怕你有很多的钱,也可以省下来作其他更有意义的事情。

最后提醒大家:银行卡要开通网上银行,上面便宜的机票基本要求你在线支付。

1.根据网络上前人的经验搜集整理了一下订票网站,欢迎大家指正修改,提出意见哦!

国内特价机票查询网站:

去哪儿

贤贤网

春秋航空

南航财付通

酷讯网

海航网

2.特价机票监视查询 ,如其名,帮你监视网络上出现的超级特价机票, http://www.appinn.com/ticket-special-offer/

3.航空公司网站

海南航空

南方航空

上海航空

东方航空

厦门航空

四川航空

深圳航空

4.以下列出个人所查询全球『廉价航空』公司网站及简介: 亚洲:

马来西亚

亚航: http://www.airasia.com/site/cn/home.jsp

泰国

曼谷航空: http://www.bangkokair.com/en/

Nok air: http://www.nokair.co.th/

泰东方: http://www.orient-thai.com/web/home.html

新加坡

亚洲捷星: http://www.jetstarasia.com

虎航: http://www.tigerairways.com/

惠旅: http://www.valuair.com.sg/

新航: http://www.singaporeair.com/saa/app/saa

印尼 狮航: http://www.lionair.co.id/ Ga-citilink: http://www.ga-citilink.com/ Garuda: http://www.garuda-indonesia.com/ Bouraq: http://www.bouraq.com/ 曼达拉: http://www.mandalaair.com/mandala/ecms/index.cfm 菲律宾 宿雾太平洋: http://www.cebupacificair.com/ 印度 Air Deccan: http://www.deccanair.com/ Express: http://www.expressindia.com/ Jet: http://www.jetairways.com/Cultures/en-US/HomePage.htm 印航: http://www.indianairlines.indiatimes.com/

美洲:

1)如果时间上比较flexible, www.priceline.com,可以自己出价,然后看是否有航空公司接受。

2)如果你有学校的信箱,也就是有.edu的mailbox,且在35岁以下,去www.studentuniverse.com注个册,可以买到很便宜的机票。好处是可以自己选择时间,航班等等。

3)经常去网上找票,一看到价格在自己的接受范围内马上购买。一般周三,周六起飞的票比周末的要便宜。机票价格有的时候一天几变,所以看到自己想要得就马上下手,否则后悔莫及。

4)http://www.kayak.com/ (宿主告诉我的,搜寻所有链接航空的,会列表出来)

1. Jetblue:http://www.jetblue.com/(美国境內廉价机票,一家以纽约JFK机场为基地的廉价航空公司,飞行的目的地往往是大城市的二级机场,如洛杉矶的Long Beach机场,旧金山的Oakland机场。单程机票价格曾低至10元。 ) 2. Airtran:http://www.airtran.com/Home.aspx(美国境內廉价机票以美东为主) 3. Southwest:http://www.southwest.com/(美国境內最大、最知名的廉价航空公司,不保留座位,视Check-in早晚来定。服务不局限于美国西南,还包括佛罗里达和巴哈马。 ) 4. Frontier Airlines:http://www.frontierairlines.com/frontier/index.jsp(美国境內廉价机票,是一家总部设立在丹佛的航空公司,目的地包括了美国主要城市,主要服务美国西部,兼而服务墨西哥度假地。) 5. Flyted:http://www.flyted.com/index.html (美国境內廉价机票) 6. ATA:http://www.ata.com/home.html (美国境內及夏威夷廉价机票) 7. Spirit Airlines:http://www.spiritair.com/welcome.aspx(美国境內廉价机票,飞行基地在佛罗里达的劳德戴尔堡和底特律的航空公司。) 8. Sun Country:http://www.suncountry.com/SCA/index.jsf(美国境內廉价机票,飞行基地在明尼苏达州明尼阿波利斯市机场的航空公司,飞行目的地遍布全国主要城市。)

9.Vegin America(virginamerica.com):著名的维珍航空,主要经营以旧金山为基地的美国西海岸航线如拉斯维加斯、西雅图、洛杉矶等,也有横跨美洲大陆到纽约、波士顿、和佛罗里达的航线。 (果然比较便宜的)

10.Westjet(westjet.com):以加拿大为基地,主要经营加拿大境内以及美加之间航线的航空公司,价格比加拿大航空Air Canada相对便宜。

11.Go Air(Iflygo.com):一家经营夏威夷群岛之间的廉价航空公司。

欧洲: 德国 1,AIR BERLIN 柏林航空 http://www.airberlin.com/ 以德国为基地,航线数量相当多,几乎能达到所有的西欧和南欧主要旅游城市和度假地,机上有供应免费饮料和报纸。经常推出减价活动.一般29EU起. 2,GERMANWINGS 德国之翼 http://www.germanwings.com/ 汉莎控股,飞往欧洲各地,行李限重8kg,无儿童票。不过由于是汉莎的子公司,所以相比其他航空公司,Germanwings的服务,尤其是空中服务要更好一些。以科隆,斯图加特,柏林三个城市为基地,航线数量多,每周四打折19EU起,但是如果不提前订票和碰上打折,机票价格比较贵. 3,GERMANIA EXPRESS http://www.gexx.de/ 在德国大多数城市都有起飞的航班,目的地为意大利,希腊以及地中海度假区,值得一提的是有前往莫斯科的廉价航班. 4,HAPAG LLOYD http://www.hlx.com/ 德国最大廉价航空之一,航线繁多。主要飞往意大利,西班牙和地中海一些岛屿,每周二打折,价格一般19.99EU起 起飞的都是一些大城市的主要机场,离市区比较近,这个优点不错. 5,dba www.flydba.com 以慕尼黑和杜赛尔多夫为基地,主要飞往德国各大城市和希腊,意大利,法国南部等地,价格一般,40EU左右. 6,LTU http://www.ltu.de/ 呵呵,LTU旅行社包机比较多,航班数量多,在德国RUHR区,有时候有特价票,不过数量有限,以前还有飞往中国重庆的航班,不知道现在还有没有. 7,LowFareJet http://www.lowfarejet.de/ 每日从Hannover飞往Luton and Glasgow 及Paris。是少数提供air miles program.的低价航空公司线之一,忘了说,前面的DBA也提供里程积分. 8,CONDOR http://www.condor.com/ Thomas Cook 旗下的子公司。经常能找到非常优惠的价格。 经常提供两种价格的打折票,29EU的短途航线和99EU的长途航线,飞行目的地以度假区为主,99EU的机票一般从法兰克福出发,前往马尔代夫,曼谷,加拿大,美国等地,相当超值. 最大的缺点是,航班搜索系统做的比较糟糕 9,LUFTHANSA http://www.lufthansa.com/ 汉沙经常有100EU左右的特价票,前往欧洲各大城市,虽然比一般的廉价航空要贵,但是考虑到汉沙的服务以及飞的都是中心机场,也还可以了. 英国和爱尔兰 1,Ryanair http://www.ryanair.com/ 欧洲最出名的廉价航空公司,有很好的口碑,在欧洲机场数目也多,打折促销也很多,从英国和爱尔兰17个机场,飞往欧洲地区50多个城市,而且提供很多欧洲内陆城市之间的航班服务,优点是价格低廉,他的廉价票是最容易买的,缺点,他飞的几乎都不是城市的中心机场,大部分都是离他所称的城市几十到一百公里的小机场,一般从机场到市区需要再花费10到20EU.因为这个原因,我觉得RYANAIR反而不如EASYJET,HLX之类的,因为加上前往市区的交通费,往往比别的航空公司贵. 2,EASYJET http://www.easyjet.com/ 欧洲最大的廉价航空公司之一,有203条航线,飞往欧洲61个城市,遍布欧洲大陆主要城市和波罗的海沿岸,价格一般20EU起,提前订票一般都在30到60EU之间含税,飞的都是主要机场,不错,值得推荐! 3,AIR SCOTLAND http://www.air-scotland.com/ 苏格兰航空,飞往英国,西班牙,希腊的航班比较多 从Edinburgh、Glasgow及Aberdeen飞往 Palma、Barcelona、Tenerife、Alicante、Malaga及Fuerteventura。 4,JET2 http://www.jet2.com/ 是家新的低价航空公司,从Leeds Bradford飞往欧洲10个城市。 5,BMIBABY http://www.bmibaby.com/ 英国三大廉价航空之一,主要飞往西班牙南部,荷兰,捷克以及英国国内航班,价格20镑起. 6,FLYGLOBESPAN http://www.flyglobespan.com/ 苏格兰廉价航空公司,主要从爱丁堡飞往地中海岛屿以及沿岸的度假城市,还有前往布拉格和瑞士的航班.20人以上有团体票提供. 7,MY TRAVEL LITE http://www.mytravellite.com/ 以伯明翰为基地,和FLYGLOBESPAN差不多,飞往地中海岛屿以及沿岸的度假城市(以西班牙为主). 8,THOMSONFLY http://www.thomsonfly.com/ 主要飞往德国,西班牙南部,意大利和巴黎,以及英国和爱尔兰之间的航班,机票15EU起. 9,BUDGET AIR http://www.budgetair.ie/ 爱尔兰的廉价航空公司,从都柏林飞往西班牙和葡萄牙南部,价格50EU左右 10,MONARCH http://www.monarch-airlines.com/ 英国的廉价航空,从伦敦等地飞往西班牙为主. 11,britanniadirect http://www.britanniadirect.com/ 英国各地往返Malta、Malaga、Naples、Venice。 12,AER LINGUS http://www.aerlingus.com/ 爱尔兰的航空公司,主要从都柏林飞往欧洲大陆主要城市,价格从十几欧到一百多欧. 13,Flybe http://www.flybe.com/ Flybe前身为British European,从英国和爱尔兰20个机场飞往全欧及纽约,行李限重20kg。 14,Jetmagic http://www.jetmagic.com/ 以Cork为基地,飞往欧洲大陆,航线不多,10来条吧 15,Now http://www.now-airlines.com/ Luton第二低价航空公司,2003年暑期开始营运,飞往7个城市,Manchester、 Hamburg、Jersey、Rome、Lisbon、Ibiza及Tenerife,票价约35~75英镑。 欧洲的同学可以用到:www.jetcost.com,在上面可以订到巴黎到法兰克福的一欧元的机票。

选择廉价航空应注意事项?

廉价航空公司(Budget airliners),一个新兴的运营模式,通过运输成本的降低来降低机票价格。运输成本的降低主要是依靠两个手段:一个是通过提高飞机利用率(高密度座位及飞行时间)降低单位成本;另一个是通过降低维护成本(单一机型及很低的人机比等)来控制其整体运营费用。 所以选择廉价航空应注意下面这些事项:

1. 避免更改行程:『廉价机票』又称『计划机票』,因此,在购票之前最好仔细考虑行程,因为如果临时更改时间及地点,航空公司会额外索取『手续费』,有时『手续费』的价值便超过当初所购买的『一切费用』(机票及各项税款),所以能不更改儘量不要改,否则『廉价机票』也会变得『不廉价』囉!

2. 买了不能退款:大部份的廉价航空都没有『退款服务』,主要是因为这类航空公司本身所提供的机票价格已经低於『市场价』许多,有时甚至是『免费机票』(航空公司该如何退给你呢?),所以这类航空公司並不提供『退款服务』,当然也有些航空公司会要求将客户的『退款』,转成『客户信用额度』,下次购买机票时可以从裡头扣款(毕竟这是少数),如果真的无法继续计画行程,不是白白浪费,就是建议更改行程(只是额外增加的费用,还不如重新购买来得便宜),至於『机场税』、『兵险』等税务费用当然无法退还,这点是必须提醒各位的。

3. 提早办理登机手续:廉价航空的服务一视同仁,並没有『舱等』差异的服务,开放性选择座位方式,先进入先选择座位,因此,想要有个舒适的乘座空间,避免选择前面的位置,建议提早办理登机手续,通常后面的位置比较少人坐,飞机起飞后,只要旁边的座位没有人,就可以『躺平休息』一路睡到目的地了!

4. 行李限重:廉价航空最令人困扰的莫过於『行李限重』的问题了,行李限重在15-20KG上下(其实与一般航空公司大同小异,只是较无弹性可言),一旦超重了,就必须额外付费办理託运,所以行李的重量最好预做规划。

5. 网路购票安全性:绝大部分的『廉价机票』都是透过网路交易(航空公司降低成本的考量),因此网路购票的『安全性』是许多背包客所担心的,大部份的廉价航空公司对於『网路交易』都有一定妥善处理的做法,当然有会有意外(骇客侵入),如果真的担心网路交易的安全,个人建议亲自电洽(或电子信件)询问该如何现金付款,这样的作法相对无法得到网路订票的优惠价,只能说见仁见智囉!

6. 飞安事故:许多人对於廉价航空都会有『廉价』=『不安全』的迷思,严格说来这点恐怕是多虑的,虽然廉价航空公司为了降低成本可能採购较为老旧的机型,但是人命关天,没有任何一家航空公司会拿乘客生命开玩笑,飞安的问题不在於机型老旧与否,在於『安全维护』是否彻底执行,因此应该破除『廉价』=『不安全』的迷思。提供一个有趣的数值供大家参考:目前全球廉价航空失事率仅百万分之零点七(安全性无庸置疑),但是最近印尼『亚当航空』的空难事件(2007 01 01)却为『廉价航空』飞安蒙上一层阴影。

品:科普中国

制作:北京师范大学天文系 宇宙之美科普团队 张同杰 李时雨

监制:中国科学院计算机网络信息中心

对于“是否有外星人”存在这个问题,宇航员们似乎因为曾经进入太空,比我们普通人更有机会与外星人“ 亲密接触”, 因此他们多了一些发言权。

宇航员们相信“外星人”存在吗?

最近,中国第一位航天员杨利伟亲述曾在太空遇到神秘的敲击声:“这个声音也是突然出现的,并不一直响,而是一阵一阵的,不管白天还是黑夜,毫无规律,不知什么时候就响几声。不是外面传进来的声音,也不是飞船里面的声音,而仿佛是谁在外面敲飞船的船体。无法描述它,不是叮叮的,也不是当当的,而是更像拿一个木头锤子敲铁桶,咚 咚 咚 咚”。

这是否是外星人造访我们的飞船?

2014年,笔者曾组织举办第27届太空探索者协会年会的社会活动日(北师大分会场),航天员刘旺和部分美国、俄罗斯和日本的宇航员都应邀参加了这个活动。

会议交流期间,刘旺曾经告诉我,他相信有外星人的存在,但是没有说为什么。而最近航天员杨利伟的爆料,让我明白了背后可能的原因。此外,一些美国航天员也相信外星人的存在。

图注: 第27届太空探索者协会年会(北师大分会场)

本文将首先介绍国际和国内搜寻地外文明的历史及现状,再从天体物理角度对杨利伟爆料的神秘敲击声给出可能的解释。

漫长的地外文明搜寻之路

在如此深邃的宇宙里,

人类是唯一的智慧生命吗?

地球是宇宙中最特殊的星球吗?

在宇宙中是否还有其他的生命?

这些生命会以怎样的形式进行演化?

人类是如此渴望知道这些问题的答案,以至于从未停止过对地外文明的搜寻。

从最早试图在地球上建造巨大的结构来引起外星人的注意,被动得等待外星人发现人类,到一百多年前,尼古拉·特斯拉认为他的无线电传输系统可以用来联系火星上的生物(参考文献【1】),人们搜寻外星人的方法随着科技的进步经历着一系列深刻重大的变化。

1931年,美国的无线电工程师卡尔·央斯基接收到了来自银河系中的射电辐射,打开了射电天文学这一新窗口,为人们探索宇宙增加了一条重要途径。

1959年,物理学家莫里森和科可尼在《自然》杂志上发表了一篇论文(参考文献【2】) ,他们认为如果宇宙中存在其他智慧生命,并且他们的科技发展水平与人类相当,或许人类能够从众多的射电信号中,找到外星人发出的信号。他们认为这个信号的波长很可能是525px(1.42GHz),这一波长正是宇宙中最常见的中性氢发出的辐射。

图注: 中性氢原子的21 厘米谱线产生机制示意图

这篇文章的发表一时间激起千层浪,从此人们对于外星人的搜寻不再是盲目的,可谓是为现代搜寻地外智慧生命奠定了科学基础。

笔者的师大物理宇宙学团队也基于2014年发表在PRL上的文章,计划使用我国FAST望远镜,观测宇宙深处中性氢的21 厘米射电谱线测量宇宙膨胀的加速度。

1. 搜寻地外智慧生命(SETI)实验

1960年,康奈尔大学的射电天文学家、被称为“SETI之父”的弗兰克·德雷克(Frank Drake)开启了第一个现代搜寻地外智慧生命(Search for Extra-terrestrial Intelligence,以下简称SETI)的实验,该实验被称为“奥慈玛计划(Project Ozma)”。基于莫里森和科可尼的文章,他利用绿岸射电望远镜(Green Bank Telescope)的85英尺射电望远镜,观测天仓五和天苑四这两颗恒星在1.42GHz这一频率的射电信号。当然,现在我们都知道在这次实验中,德雷克并没有找到他想找到的信号。然而德雷克并没有放弃,第二年,他发表了著名的德雷克公式,从统计上揭示了银河系中能够与外界交流的文明的数量。

图注: 笔者与德雷克的合影

1971年,NASA支持了德雷克等人进行SETI研究,他们设计了由多达1500个小型射电望远镜组成的地基射电望远镜阵列。然而由于造价过高,并没有实际建成,但是他们所做的研究工作为之后大量的SETI工作奠定了基础(参考文献【3】)。

1972年,美国先驱者10号探测器发射时携带了德雷克与康奈尔大学的天体物理学家卡尔·萨根共同设计的人类发往太空中的第一条物理信息(参考文献【4】)。这块镀金铝板上标记出了地球在太阳系中的位置,如果先驱者10号探测器能够遇到地外生命,那么他们就有望通过这条信息与我们取得联系。

然而地外生命也许并不是友好的,我们是否应该主动发送地球以及人类的信息给可能的地外生命,也一直是一个备受争议的话题。

德雷克目前是SETI研究所(参考文献【5】)的成员之一。

SETI研究所是一个非盈利性组织,它成立于1984年,所需资金大部分来自于私人捐赠,他们所用的艾伦射电望远镜阵列以微软的共同创始人保罗·艾伦的名字命名,保罗·艾伦为这个望远镜阵列提供了一半的经费支持。

图注: 笔者访问SETI研究所

然而,耗费了大量人力物力的艾伦射电望远镜阵列并没有搜寻到外星人的蛛丝马迹,随着2011年美国政府资金支持的停止,艾伦射电望远镜阵列陷入了停工的局面。

图注:艾伦射电望远镜阵列(图片来源于网络http://www.shao.ac.cn/kpyd/mtsm/201105/t20110505_3128141.html)

与SETI研究所隔着旧金山湾相望的加州大学伯克利分校SETI研究中心(参考文献【6】),他们负责的SERENDIP(Search for Extraterrestrial Radio Emissions from Nearby Developed Intelligent Populations:搜寻临近地球的地外智慧生命发出的射电信号)项目是世界上运行时间最长的SETI项目。

得益于互联网技术突飞猛进的发展,伯克利SETI研究中心也展开了SETI@home的项目(参考文献【7】),利用全球900万志愿者联网的计算机共同搜寻地外文明。SERENDIP最初是依附于其他观测项目之上的,从阿雷西博射电望远镜拿到观测数据之后,他们将这些数据分段,分别发给SETI@home的各个志愿者,利用每个志愿者电脑待机休息的时间对数据进行处理,找出非自然产生的射电信号以及潜在的目标信号,再反馈给SETI研究中心的科学家们。这种模式的优势是进行SETI研究的科学家们不需要单独申请望远镜的观测时间,能与其他项目实现双赢。

图注: SETI@home分布式计算项目

2. 突破创新计划 (Breakthrough initiatives)

突破创新计划(参考文献【8】)是俄罗斯富翁尤里·米尔纳于2015年创立的探索宇宙、搜寻地外智慧生命,鼓励公众从行星的角度进行辩论的项目。其董事会成员包括著名的科学家史蒂芬·霍金以及Facebook的CEO马克·扎克伯格。尤里·米尔纳在英国伦敦皇家学会举行的新闻发布会上宣布了突破创新计划的成立, 当时物理学家史蒂芬·霍金、英国皇家天文学家马丁.瑞斯(Martin Rees)[据说他非常相信地外文明的存在]、“SETI之父”的弗兰克·德雷克、美国加州大学伯克利分校(U.C.Berkeley)天文系席教授高尔夫·摩西(Geoff Marcy)[他曾经发现了上千颗系外行星,是诺贝尔奖的热门候选者;但是不相信地外文明的存在,曾经和突破聆听计划的PI,同时也是伯克利SETI@home的首席科学家Dan Werthimer教授进行过关于是否有地外文明的辩论;目前他已经从U.C.Berkeley天文系辞职]、 突破聆听的主要负责人Andrew Siemion以及基金会主席Peter Worden参加了成立仪式。

图注: 突破创新计划新闻发布会

突破创新计划由突破聆听(Breakthrough Lisen)、突破摄星(Breakthrough Strashot)以及突破信息(Breakthrough Message)三个项目组成。

(1)突破聆听

突破聆听计划是历史上最大规模的搜寻地外智慧生命的项目。

史蒂芬·霍金与尤里·米尔纳于2015年7月共同启动了突破聆听项目。尽管霍金本人认为向太空主动暴露人类的信息并不是明智之举,但是他对于人类主动搜寻地外智慧生命的项目仍然持积极态度。

突破聆听计划将在十年内投入1亿美元的资金,支持SETI研究。其中一部分经费用于购买望远镜的观测时间,另一大笔经费将会用来升级望远镜的后端设备。有了更多的望远镜观测时间以及更好的设备,突破聆听计划将会得到优于以往近百倍的观测结果。鉴于NASA已经决定今后不再给SETI研究任何的经费支持,对于SETI研究的科学家们来说,突破聆听项目的启动是一个重大利好消息。

2015年,伯克利SETI研究中心幸运的得到了俄罗斯富翁尤里·米尔纳10年内共计1亿美元的资金支持,继续搜寻地外文明。突破聆听计划的PI,同时也是伯克利SETI@home的首席科学家丹·沃斯莫(Dan Werthimer)教授,将与突破聆听的主要负责人安德鲁·西蒙(Andrew Siemion)一起[曾经是Dan Werthimer的博士后],带领伯克利的SETI研究团队一同聆听天外来音。

Dan Werthimer教授与中国也有一段不解之缘,早在上个世纪八十年代,他就在北京师范大学天文系进行了为期一年的访问交流,与北师大的师生建立了深厚的情谊。2014年笔者访问美国加州大学伯克利分校(U.C.Berkeley)天文系和劳伦兹国家实验室(LBNL)时,与Dan建立了更加密切的合作关系。2015年,在笔者邀请下,Werthimer教授对北师大进行了学术访问,并做了风趣幽默、通俗易懂的报告,报告介绍了SETI研究的历史与发展。在此良机下,笔者带领的北师大SETI研究团队也积极得加入到了SETI的研究中,并且已经开始处理绿岸射电望远镜(Green Bank Telescope)的数据。

图注: 笔者与DAN的合影以及DAN在北师大的海报

突破聆听计划主要利用位于美国西弗吉尼亚州的100米口径的绿岸射电望远镜(Green Bank Telescope)和位于澳大利亚的64米口径的Parkes射电望远镜,监听来自外星文明传来的信号。绿岸射电望远镜是世界上最大的全方位可移动望远镜,Parkes射电望远镜是南半球第二大的射电望远镜。

在突破聆听项目开启之前,做SETI研究的科学家们通常一年之内只能得到一两天的观测时间,而现在,他们得到了望远镜每年20%-25%的观测时间。

图注:国台和SETI签订协议

2016年10月,中国科学院国家天文台也与突破基金会签订战略性合作协议,国家天文台台长严俊和突破奖基金会主席及“突破计划”执行主任Pete Worden代表双方分别签字。根据合作意向,国家天文台500米口径球面射电望远镜FAST将加入“突破聆听”(Breakthrough Listen)项目,与位于美国的绿岸望远镜及位于澳大利亚的Parkes天文台共同合作,寻找地球以外智慧生命的线索。双方将有可能交换观测计划、探测方法和数据,并快速进行跟踪观测及数据分析。

未来,位于三个国家的三个世界一流的望远镜将一起交换观测计划,共享观测数据。

图注: 笔者参观绿岸射电望远镜

图注:Parkes射电望远镜

除了射电波段的研究,突破聆听还有一部分资金用于美国加利福尼亚州利克天文台的2.4米光学望远镜,进行光学波段的研究,旨在探测地外文明发出指向地球的激光信号。

图注:笔者访问美国加利福尼亚州利克天文台

突破聆听计划主要观测的频率范围是1-10GHz,在这个范围内的射电信号不受宇宙源或地球大气的影响,可以用地面望远镜进行观测。大型望远镜的观测时间是十分宝贵的,因此科学家们总是期望从一批观测数据中可以得到多项科研成果。SETI研究得到的观测数据,还可以用于研究脉冲星、恒星日冕物质抛射等研究领域。这些数据将会公开发表,可能是历史上公开发表的数量最多的数据。

(2)突破摄星计划

突破摄星项目计划建成一个依靠光压驱动的纳米级宇宙飞船,其速度高达到光速的15%,这样的飞船能够在发射后20年到达距离太阳系最近的恒星——半人马座α星,又称为比邻星——为我们传来最近发现的比邻星的行星 Proxima b的图像。据此,可以帮助我们探测该恒星系统是否还有其他行星,我们还可以分析它们的磁场等一系列的性质。

(3)突破信息计划

如果说突破聆听计划是被动的接收外星人的信号,那么突破信息计划则是人类主动、有意识地给地外文明发送信息的项目。

突破信息计划的研究还包括将信息发送到宇宙深空的伦理学。同时,它还发起了高达一百万美元奖金的竞赛,竞赛的内容是设计一个可能会发送到地外文明手中的来自地球的数字化信息。这条信息应该是代表整个人类的文明程度和我们地球的特征。在是否应该主动向外界发送关于地球和人类信息的高水平深层次辩论结果出来之前,该项目暂时不会向外界发送任何信息。

突破计划的三个项目相辅相成,期待它能为我们带来振奋人心的发现。在未来的十到二十年之间,人们或许有望找到外星人发出的蛛丝马迹。另一方面,不论是否真的有外星人存在,突破创新计划都将在天文特别是射电天文学方面,极大的推动科学技术的发展。

3.突破聆听计划研讨会

2016年10月5-6日,在绿岸天文台召开了突破聆听计划研讨会,笔者也参加了这次会议,并且作了SETI in China 的学术报告。

会议由突破聆听计划项目主办,绿岸天文台承办。突破聆听基金的负责人Jamie Drew、突破聆听项目的PI Dan Werthimer教授、该项目的主要负责人Andrew Siemion以及现代SETI项目的奠基人Frank Drake教授均出席了本次研讨会。

图注:笔者与Dan Werthimer和Andrew Siemion

研讨会上探讨了突破聆听计划的研究目标、策略,并且广泛探讨了现代搜寻地外智慧生命的方法。从SETI实验所需的射电望远镜后端接收机以及数据储存、传输等硬件设备,到数据处理的方法,特别是对与其他研究项目一起进行联合观测研究的可能性进行了讨论。

此外,还有部分利用开普勒卫星进行光学波段研究的学者到场做了精彩的报告,主要是有关系外行星的搜寻工作。随着系外行星样本的不断增加,将会增加我们对于系外行星的认识,对于宜居行星分布情况也将会有进一步的了解。

对于宇宙中是否存在其他智慧生物,虽然短时间内可能不会有结果,但是学者们大多抱有积极乐观的态度。

即使最终不是专门研究SETI的科学家发现了地外智慧生命的,就像历史上许多重大天文观测发现一样(有心栽花花不开,无心插柳柳成荫),那仍将是令人激动的结果。

与会者还参观了绿岸望远镜的观测室以及后端设备室(非美国公民需要登记批准后才能进入)。在这里,观测人员可以同时控制天文台中的多架望远镜进行观测,后端设备室有两排插满了5TB硬盘的架子,存储了突破聆听计划的观测数据并对其进行了预处理。当找到了研究人员所感兴趣的信号之后,会把这部分数据发往加州大学伯克利分校的空间科学实验室进行进一步的处理。由于每天观测都会产生大量数据,剩下的没有发现感兴趣信号的数据就会被删除掉。德雷克教授感慨道,他在二十世纪六十年代最早做SETI实验的时候,是不敢想象今天的海量数据的。

杨利伟在太空是遇到外星人了吗?

最后,让我们再回到这个问题,杨利伟在太空是遇到外星人了吗?

笔者的看法是,杨利伟遇到外星人的可能性很小。

到目前为止,还没有接收到来自外星人的信号,并且也没有外星人造访地球的确切事实。

以目前我们所知的科学技术水平,银河系内的外星人即使乘坐以光速飞行的飞船在短时间内都无法到达我们地球。从理论上讲,一种可能可以使我们从一个区域在短时间内到达另一个区域,那就是《星际穿越》电影里面描述的虫洞,这也是我的博士导师沈有根先生研究了一辈子的天体物理领域。

图注:虫洞示意图

如上图所示,外星人可以通过虫洞在短时间内从宇宙一个遥远的区域到达我们这里,而不需要经过漫长的路程。2015年初,来自意大利和美国的一个国际研究小组声称,基于对银河系的最新研究和理论,在我们的银河系可能存在可以通往遥远时空的巨大门户-虫洞,像热映电影《星际穿越》中所展现的那样,其大小足以让一艘宇宙飞船经过。相关论文发表在《物理学报》杂志上。这项研究表明人类将有可能通过虫洞穿越时空到达及其遥远的地方。因此,如果杨利伟遇到的确实是外星人,那么这些外星人所行走的路线只有一条:虫洞。这条虫洞连接我们地球附近区域和银河系内某个遥远的地方或者河外星系的某处区域,而且这个虫洞的入口或许在马航MH370飞机失事区域。

一个美好的愿望是马航MH370飞机仍然在这条虫洞中穿越。虽然我们感觉两年过去了,而MH370飞机由于在虫洞中穿行,其时间变慢,机上的乘客一直活着,他们感觉只是过去了几个小时,不久的将来他们或许通过其他的虫洞返回到我们的地球。

参考文献

[1] Seifer, Marc J. (1996). "Martian Fever (1895–1896)". Wizard : the life and times of Nikola Tesla: biography of a genius. Secaucus, New Jersey: Carol Pub. p. 157. ISBN 978-1-55972-329-9.OCLC 33865102.

[2] Cocconi, Giuseppe & Philip Morrison (1959). "Searching for interstellar communications"Nature.184(4690):844~846.Bibcode:1959Natur.184..844C.doi:10.1038/184844a0.

[3] "Project Cyclops: A Design Study of a System for Detecting Extraterrestrial Intelligent Life" NASA. 1971.

[4] Carl Sagan; Linda Salzman Sagan & Frank Drake (1972-02-25). “A Message from Earth”. Science. 175 (4024) : 881-884

[5] http://www.seti.org/

[6] https://seti.berkeley.edu/

[7] http://setiathome.ssl.berkeley.edu/

[8] http://www.breakthroughinitiatives.org

“科普中国”是中国科协携同社会各方利用信息化手段开展科学传播的科学权威品牌。

本文由科普中国融合创作出品,转载请注明出处。

注】本文译自:https://psamsotha.github.io/jersey/2015/12/16/dynamic-proxies-dependency-injection.html

本文将讨论动态代理如何在 Java 平台中工作以及依赖注入如何利用此 Java 功能。本文的撰写源于我在 HK2 框架(或更确切地说是 Jersey 应用程序中的 HK2)中尝试将请求范围对象注入到单例对象中的的搜索。我本来打算将我的发现都写在一个博客里,但是我觉得这个主题太宽泛了,不适合用两行代码就能解决的问题。

首先,我将快速讨论代理模式,然后展示如何在 Java 语言中使用动态代理,最后介绍一个使用动态代理和自定义依赖项注入的示例。

代理模式

我不会过多介绍代理模式。在互联网上到处都有很好的参考。我只给出一个简短的类比,以及该模式的一些简短代码示例。

我敢肯定,你们大多数人都听过“委托投票”这个说法。当有人投票给其他人时。例如,说公司董事会成员之间有一些随意的投票。成员 B 生病住院了,因此无法参加董事会会议。所以,成员 A 代表成员 B 进行了投票。因此,在表决会议上,成员 A 只是成员 B 的委托。

代理模式的工作原理与此相同。这是一个类图(来自维基百科)。

假设 Member 是接口

public interface Member {
    void vote();
}

那么你有 MemberAMemberB

public class MemberA implements Member {
    public void vote() {}
}

public class MemberB implements Member {
    public void vote() {}
}

由于成员 B 将不存在,因此我们需要一个代理。 代理还应实现 Member 接口,并应包含对 MemberB 的引用。

public class MemberBProxy implements Member {
    private MemberB memberB;

    public void vote {
        memberB.vote();
    }
}

现在 MemberA 可以让 a 成为成员 B 的代理,让代理为成员 B 进行代理投票。

这可能不是最好的例子,因为代理仅对成员 B 进行表决。但是对于真正的代理,通常情况下还会发生其他事情。例如,在使用远程代理的情况下, vote() 方法实际上可能会对远程 MemberB 进行网络调用。Java平台中的一个示例就是 RMI(远程方法调用)。后面的示例将描述另一个用例,通常对于开发人员来说是透明的。

动态代理

在上面的示例中,我们终须手动编写代理类。但是,在 Java 中,随着 1.3 中引入动态代理,这不是必需的。动态代理的核心接口是 java.lang.reflect.Proxy。要使用它,我们需要组件,我们的代理接口和一个 InvocationHandler。 让我们看一个简单的例子,使用与上面相同的类比。

Member memberBProxy = (Memeber) Proxy.newProxyInstance(
        Memeber.class.getClassLoader(),
        new Class[] { Member.class },
        new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) {
                return method.invoke(new MemberB(), args);
            }
        }
);

就是这样。现在 memberBProxyProxy 的一个实例,而不是 MemberB 的实例。如果你打印出 Member 对象的类名,实际上会看到类名是 com.sun.proxy.ProxyX,而不是 MemberB

让我们快速地浏览一下。这是 Proxy#newProxyInstance 的签名

newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

它首先需要 ClassLoader 用于定义代理,其次需要一个实现的接口,最后是 InvocationHandlerInvocationHandler 只有一个需要实现的 callback 方法。

Object invoke(Object proxy, Method method, Object[] args)

第一个参数是实际的代理对象。你应该很少使用它。第二个参数是 java.lang.reflect.Method 。如果你有 Java 反射的经验,那么应该熟悉这个接口。 使用 Method 时,我们可以通过传递要调用该方法的对象以及任何参数(最后一行)来调用:

return method.invoke(new MemberB(), args);

在这里,代理将方法和传递给代理之上的方法调用的参数传递给代理。作为 InvocationHandler 的实现者,我们可以使用 Method 和method 参数做我们想做的任何事情。这里我们只是简单地,应该在 new MemberB() 对象中调用,并传递参数。

为了获得更清楚地了解情况,只需将其看作 Proxy 实例具有 Member 接口具有的所有方法。因此,当我们调用 Proxy#vote() 时,它会调用 InvocationHandler#invoke 本身、方法和传递给 vote() 的参数(如果有)。通过调用 Method 对象上的 inovokeInvocationHandler 实现只需调用该方法即可。然后,Method 对象将对实际的 MemberB 对象调用 vote()

就是这样。如你所见,动态代理很容易实现。

动态代理和自定义注入示例

  • 获取 GitHub 项目(https://github.com/psamsotha/dynamic-proxies-example)

我将在这里尝试解释的是在依赖项注入(DI)框架中如何使用动态代理。DI 中动态代理的主要用例之一是处理范围。例如,您有一个处于单例作用域中的服务或控制器,这意味着每个应用仅创建一个。该单例服务依赖于请求范围内的服务器,这意味着应为每个请求创建一个服务器。类可能看起来像这样(这完全是虚构的---没有特定的框架)。

@Controller(scope = "singleton")
public class AppController {
    @Inject
    SingletonService service;
}

@Singleton
public class SingletonService {
    @Inject
    RequestScopedService service;
}

@RequestScoped
public class RequestScopedService {}

这里的问题是,在启动时创建 SingletonService 时,需要执行所有注入。但是在启动时没有请求,因此当前应该没有绑定到请求的 RequestScopedService。另一个问题是我们如何管理哪个请求获取哪个 RequestScopedService。也许我们可以在 SingletonService 中添加一个 setter,在其中我们可以为每个请求设置一个新的 RequestScopedService。但这是行不通的,因为 SingletonService 将被并发访问,就像一些服务器的工作方式一样(每个请求一个线程)。

这是动态代理发挥作用的地方。This is where dynamic proxies come to the rescue. When the当启动创建 SingletonService 时我们将注入服务的 Proxy,而不是注入实际的 RequestScopedService。当从 from inside the SingletonService, 内部对 RequestScopedService 进行调用时,实际上将在 Proxy 上进行调用,该代理将调用委派给 InvocationHandler#invoke 方法,该方法实现对从 ThreadLocal 获得的 RequestScopedService 的调用。每次处理一个请求时,都会在 ThreadLocal 中设置一个新的 RequestScopedService,这个请求将在一个单独的线程中处理。如果你听说过 “线程本地代理”一词,那么这几乎就是它的工作原理。

让我们尝试实现这些。我们甚至将实现自己的依赖注入。我们将实现一个简单的服务器框架,该框架允许用户实现一个自定义 RequestHandler ,它可以注入我们的 SingletonService ,而 SingletonService 又依赖于 RequestScopedService。以下是类图。(接下来,最好从上面的链接中获取 GitHub 项目)。

如前所述,用户将能够实现自定义 RequestHandler 并注入我们的 SingletonService。在项目中,有一个默认的实现,它仅只返回来自 SingletonService 的消息作为 Response

public class DefaultRequestHandler implements RequestHandler {
    
    @Inject
    private SingletonService singletonService;

    @Override
    public Response handleRequest(Request request) {
        return new Response(singletonService.getMessage());
    }  
}

然后用户创建 Server 传入实现类给构造器。

Server server = new Server(DefaultRequestHandler.class);

在服务器构造函数中,您将看到两件事,用户定义的 RequestHandler 类验证,以及创建 SingletonService。验证在这里并不重要,这是 SingletonService 的创建。

private static SingletonService initSingletonService() {
    Service proxyService = (Service) Proxy.newProxyInstance(
            Service.class.getClassLoader(), new Class[]{Service.class},
            new ServiceInvocationHandler());
    return new SingletonService(proxyService);
}

我们要做的第一件事是创建 Service 类的代理。这里是 ServiceInvocationHandler

public class ServiceInvocationHandler implements InvocationHandler {

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) .. {
        Service service = ThreadLocalService.get();
        return method.invoke(service, args);
    }
}

它没有太大作用。它只是从 ThreadLocalService 检索 Service ,并在服务上调用代理方法。稍后我们将看到,RequestScopedService 的实例被设置为 ThreadLocal

然后,使用 SingletonService 创建 Service。所以现在,当 SingletonService调用 Service 上的方法时,代理将查找线程本地 Service 并将调用委托给方法。

服务器引导程序就是这样。现在我们进入运行时和请求处理。下面是来自请求处理流的序列图。

首先,Main 程序调用 Server#sendRequest(Request) 并传入一个新的 Request 对象。 Request 对象仅具有客户端的名称。

当我们在 Server 上调用 sendRequest 时,它所做的就是将请求添加到 BlockingQueue

public void sendRequest(Request request) {
    try {
        requests.put(request);
    } catch (InterruptedException ex) {
        throw new RuntimeException(ex);
    }
}

服务器启动时,它会不断轮询 BlockingQueue,等待新的 Request

public void startServer() {
    executors.submit(new Runnable() {
        @Override
        public void run() {
            while (true) {
                try {
                    Request request = requests.take();
                    if (request.isShutdownTrigger()) {
                        break;
                    }
                    executors.submit(new RequestProcessor(userDefineHandler,
                                                          singletonService,
                                                          request));
                } catch (InterruptedException ex) {
                    throw new RuntimeException(ex);
                }
            }
            System.out.println("Server shutdown!");
        }
    });  
}

当接收到 Request 时,Server 将创建一个新的 RequestProcessor,传入 Request 对象、SingletonService 对象和使用定义的 RequestHandler 类。如果你查看 RequestProcessorrun() 方法,你将看到以下内容

private void setThreadLocalService() {
    ThreadLocalService.set(new RequestScopedService(request));
}

@Override
public void run() {
    setThreadLocalService();
    RequestHandler handler = initInjections();
    Response response = handler.handleRequest(request);
    System.out.println(response.getMessage());
}

因此,处理器要做的第一件事就是将 RequestScopedService 设置为 ThreadLocalService。 然后使用一些反射实例化 RequestHandler ,如 initInjections() 方法所示

RequestHandler initInjections() {
    try {
        for (Field field : handlerCls.getDeclaredFields()) {
            if (field.isAnnotationPresent(Inject.class)
                    && field.getType() == SingletonService.class) {
                return createHandler(field, handlerCls);
            }
        }

        Constructor[] cons = handlerCls.getConstructors();
        for (Constructor con : cons) {
            if (con.isAnnotationPresent(Inject.class)
                    && con.getParameterCount() == 1
                    && con.getParameterTypes()[0] == SingletonService.class) {
                return (RequestHandler) con.newInstance(singletonService);
            }
        }
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
    throw new RuntimeException("RequestHandler could not be created.");
}

该方法只是检查我们是否应该进行字段注入或构造函数注入。它确保使用 @Inject 注解字段或构造函数。如果字段带有注解,并且字段类型为 SingletonService,我们将使用反射使用 SingletonService 设置字段。进程构造函数注入也会发生类似事件。

RequestHander 做的最后一件事就是简单地调用 RequestHandlerhandleRequestof ,它返回一个 Response,然后处理器打印出 Response 消息。这就是处理单个请求的过程。

如果运行 Main 类,应该会看到类似以下内容的信息

Message: Hello Kobe
  meta-info:
    service class: com.sun.proxy.$Proxy2
    service id: 1
    thread name: pool-1-thread-2


Message: Hello Lebron
  meta-info:
    service class: com.sun.proxy.$Proxy2
    service id: 2
    thread name: pool-1-thread-3
... three more

您应该注意的第一件事是,服务类确实是 Proxy 实例,而不是 RequestScopedService。只要正在处理请求,底层的 RequestScopedService 都将保持不变。因此所有在 Service 内部的服务上所做的将总是被委托给与特定线程相关联的实际 RequestScopedService

就这样了。

总结

我们介绍了代理模式的一些基础知识,并了解了它如何使用包装器或委托模型来调用底层对象。然后,我们讨论了动态代理,以及如何用 Java 语言实现它。最后,我们通过一个示例说明了动态代理是如何使用作用域依赖注入的。如果需要将较小作用域的对象注入到更大作用域的对象中,则需要代理较小作用域的对象,以便不同的线程能够访问自己的较小作用域的对象实例。

这个示例与你在现实生活中使用的一些东西相去甚远,但我希望你能更好地理解我们讨论的两个主题(动态代理和依赖注入)的组全背后发生的事情。