Rubik’s 360解法

去年去美国的时候给自己买了个玩具,LEGO的Mindstorm NXT 2.0机器人,可惜一年半时间下来发现自己的设计能力有点玩不转这种高科技的玩具。今年去美国时无意间在超市看到有正版的Rubik’s魔方卖,比国内便宜,没有买魔方,但它倒让我想起了另一个玩具--Rubik’s 360,最终在Amazon上找到了它,买了下来。Rubik’s 360在国内也有山寨版的卖,价格不到正版的1/10,品质如何不知道,不过正版的做工倒是确实很让我失望……

Rubik’s 360是魔方之父Ernő Rubik在发明魔方25年后发布的一个新玩具,它由三个透明的同心圆球组成,球与球之间以两根45度角相交的轴连接,最里面的球上有一个圆孔,中间的球上有两个圆孔,并且两个球上都各安装有一个重锤,在正常情况下保持圆孔朝上。玩具的目标就是把最里面的球中的六颗彩色珠子,通过两层球上的圆孔,移动到外层球表面上对应颜色的凸起中。在球体上还安装有两个控制钮,可以用来打开或关闭外层球上凸起的大门,这样就可以在把一个珠子移动到凸起中后,把门关上,防止珠子从里面再掉出来。

玩具的关键点在于:由于重锤的存在,圆孔总是朝上,所以就很难让珠子从圆孔中”掉出来“,到达外层球体。反倒是好不容易把珠子移到外层后,只要一不小心,就会重新从小孔中掉回内层球体中。

这个玩具有个很简单的解法,Shake-Shake,也就是把整个球乱摇,总有一定的可能性可以把珠子从内层球体摇到外面来。只不过这个解法就是完全靠运气了,就算你摇上20分钟,也没人能保证能不能成功摇出一个来。

其实Rubik’s 360跟Rubik’s Magic(魔板)很相似,只有一个步骤很关键,一旦学会了这个步骤,这个玩具就被破解了,也就不好玩了。这跟魔方很不一样,魔方的变化情况要多得多,对于每一个状态,都可以有很多不同解法。

所以,如果你对Rubik’s 360有兴趣,在往下看本文前,最好先自己玩一玩。下面的内容会把玩具的魅力破坏一大半,本文是为想立即知道这个玩具解法的人准备的。好,现在你已经被警告过了。

Rubik's Magic和Rubik's 360

Rubik's Magic和Rubik's 360

首先定义一些名词。从内到外三个球体分别叫作内球、中球和外球。外球上的拼接缝把外球分为两个半球,一个半球上是蓝白绿三色凸起,叫BUUG,另一个半球上是红橙黄三色凸起,叫ROY。我把两个控制旋钮处在一上一下的位置、它们连成的直线垂直于地面时的状态称为是竖着的,当这条直接平行于地面时,称为是横着的。

不难发现,当玩具是横着的时候,内球和中球的重锤会同时指向地心方向。当玩具是竖着的时候,内球的重锤通常会指向侧下方而中球的重锤会指向水平方向。

第一步:如果把球横过来,并让其中一个旋钮正朝向自己,慢慢把球朝外转动90度,就可以把球竖起来(朝向自己的旋钮朝上了)。请注意观察这个过程:内球和中球的重锤会分别朝两个方向离开地心方向的位置。

看清楚这一点后,重新再操作一次:先把球横过来,然后慢慢把它竖起来,到快接近竖直的时候(朝向自己的旋钮接近朝上,微微偏向自己一点,不完全朝上的原因是那时中球可能会带着内球开始乱转了),先静止一下,然后继续沿相同的方向流畅、稳定并迅速的转动180度。在这个过程中,需要确保两个重锤各自沿之前的运动方向继续向两边分离。当完成这次转动后,你就可以看到,内球的孔已经不再是朝上了,而是朝向了水平方向,与中球的重锤到达一样的位置。至此,最关键的一步就完成了。

第二步:适当转动Rubik’s 360,就可以让内球的孔基本朝下,这时就可以轻松的把内球中的某个珠子赶到内球与中球的夹层中了。到了这里,你需要牢记的一点是不可以再把Rubik’s 360完全横过来了,除非你希望珠子重新掉回内球去。

第三步:保持一个适当的倾斜角度,轻轻晃动Rubik’s 360,就可以让内球和中球夹层中珠子在夹层里运动起来,并最终卡到中球与外球相连的孔中。这个过程中,如果你的角度选择不合适,或者珠子在夹层中运动速度过快,或者你不小心把整个玩具完全横过来了,都会导致珠子掉回内球,前功尽弃。

第四步:当珠子卡到外球与中球之间后,剩下的工作就比较简单了,让你希望珠子进入的凸起朝向斜上方(具体角度请自行摸索,不难,但讲不清),然后用旋钮开门,把珠子晃进凸起,关门。

还遗留最后一个问题,就是有关颜色的。蓝白绿三色的珠子只应该进入BUUG半球,红橙黄三色珠子则只应该进入ROY半球,不然最后它们就不能回到颜色与它们相符的凸起中。做完第二步后,基本上就决定了你正在操作的珠子会进入BUUG半球还是ROY半球,如果进错了半球,基本上就没有搞头了,只好它让掉回内球,重新操作。在我的Rubik’s 360上,做第三步时,珠子总是会倾向于往某一个方向运动(虽然我总觉得应该两个方向的概率是一样的),在这种情况下就很容易预测从内球中掉出来的珠子会进入到哪一个半球中,所以在把珠子从内球赶到中球夹层时,可以有意识的选择合适的颜色的珠子。或者当剩下的珠子只有某个半球的颜色时,就应该在第一步时就选择正确的半球朝向自己,才能保证后面珠子可以进入正确半球。这个也请大家自己摸索一下吧,反正只有两种可能性,规律很好找。

好吧,我想我已经尽力用文字去解说整个过程了,不知道能不能对不会玩的朋友有所帮助。大家也可以参考以下资料(包括一些视频)来研究这个玩具。中国大陆用户访问会有些困难,但我也没有办法……

Rubik’s官方指南,有视频解说和原理动画,个人认为完全看不懂:http://www.rubiks.com/solving-center/solve_rubiks_puzzles.php

一个第三方的博客介绍技巧的,有说明和视频,跟我的方法比较接近,可以参考一下:http://rubix360.blogspot.com

成功完成首次卫星通联试验

在今年的辞旧迎新博文《2011新年好》中,我提出了今年希望能完成的一个愿望,就是能够进行一次卫星通联试验。眼看一年时间过去大半,在计划就要搁浅的时候,向来瞬间执行力超强的好友BG4KKS以迅雷不急掩耳盗铃儿响叮当的速度购入了一根UV双段的八木天线,促成了这次试验。

2007年,南京三中的同学们曾经与国际空间站(ISS)的宇航员进行过一次十分钟的天地对话,这次活动前后花费了2年半的准备时间外加经费16万元,这无疑会让人觉得卫星通信试验是一件很高不攀的事情。实际上,除了ISS的官方的业余无线电活动(ARISS)外,还有不少给业余无线电爱好者使用的卫星一直在围绕着地球运转,在地面上使用一些简单的设备就有希望通过这些卫星上的中继器,把信息从一个地方传递到另一个地方。

2009年底,中国在太原卫星发射基地通过一箭双星的方式发射了我国第一颗业余通信卫星希望一号(HO-68),期望通过中国自己的业余通信卫星在太空中传递自己的声音成为我计划进行卫星通信试验的一个动因。遗憾的是,在准备这次通联试验时,我们才发现,希望一号从今年一月底开始就因为一些设备故障无法打开各转发器,仅存留一个等幅电报(CW)的发射器不断发出表示“我在这里”的信标。所以,通过希望一号传递信息已经变得不可能,只能尝试接收来自它的信标。作为替换方案,我们选择了另外两颗国外的卫星SO-50AO-27做为进行语音通信试验的目标。

通过卫星的调频(FM)转发器进行语音通信,其实跟在地面上通过中继台进行语音通信非常相似:无线电台把信号通过上行频率发送给中继台,中继台接收到信号后进行放大并重新在下行频率上发送出去。由于中继台的天线能力、高度和功率通常都会大于一般的移动电台,所以可以起到扩大通信范围的作用。卫星通信,就是让卫星充当中继台的角色,把地面发送给卫星的信号,重新转发回地面,以达到地面直接通信较难达到的更大的覆盖范围。

当然卫星通信与地面中继台通信也还是存在一些不同的地方:

1) 时间窗口:业余通信卫星很多为低轨道卫星,绕地周期很短,所以对于一个特定的地点来说,卫星每次经过上空的时间都很有限,只有几分钟到十多分钟时间。必须提前计算好卫星通过的时间和角度,并抓紧分分秒秒,才能完成一次通联。

2) 飞行轨迹:如果使用八木天线等定向性非常强的天线,必须在卫星飞行过程中不断调整天线的角度对准卫星,才能保证通信的正常进行,所以必须提前知道卫星飞过上空时的轨迹。同时,如果飞行轨迹的仰角过低(贴近地平线),而通信地点不是在高山上,则可能会由于建筑物的遮挡而导致通信比较困难。

3) 多普勒效应:由于卫星与地球间存在较高的相对速度,在卫星接近和飞离时都会出现多普勒效应,导致频率飘移,所以在通信过程中需要不断调整接收发射频率才能补偿多普勒效应,达到较好的通信效果。

4) 转发器工作状态:卫星上的转发器受到电力等各种因素的制约,有可能不是一直可用的,所以在进行卫星通联前需要预先了解卫星过顶时转发器是否正在工作。对于有些卫星(比如SO-50),还需要通过向它发送特定的亚音信号,才能在一个时间段内激活它的转发器。这些都是要在做准备工作时所关注的。

要获知卫星飞过所在地上空的时间和轨迹,需要进行对于普通人来说非常复杂的天文计算,好在有很多软件可以帮我们来完成这样的计算,GNOME Predict就是Linux下的这类软件。通过在软件中载入卫星轨道根数(开普勒参数)和所在地坐标,就可以算出卫星后面的经过时间和轨迹。在Windows下,可以使用Orbitron软件,功能更为强大。使用这类软件时,一定要确认把软件中的卫星轨道参数更新到最新的数据,不然就会得出错误的结果。也有一些网站会提供在线的跟踪和预测数据,临时需要查阅的时候也很方便。

Linux下的卫星跟踪软件,HO-68正在经过南京上空

Linux下的卫星跟踪软件,HO-68正在经过南京上空

我们所有的通信设备是仅仅是两个手持电台(俗称“对讲机”):YAESU FT-60R加上0.4米长的UV双段橡胶天线和Kenwood G71A加上新买的U段7单元V段4单元的八木天线,两个电台的最大发射功率都不到5W。另外,我们还用手机和GPS用来获得精确的时间、位置和角度信息。

Kenwood G71A和UV双段八木天线

Kenwood G71A和UV双段八木天线

星期六晚上在仙林某学校的教学楼楼顶进行了第一次试验,首先是尝试抄收希望一号HO-68的信标信号。首次试验免不了有点手忙脚乱,不过还是非常顺利的在两个电台上都抄收到了来自太空的信号:一阵“噗噗”的声音。因为希望一号的信标信号是不到200mW的CW信号,而我们没有用于抄收CW信号的设备,只能用调频设备去接收这个信号,CW信号经过调频设备“错误”的解调后,就只能得到一串“噗噗”的噪音,而不是一般人想象中的”嘀嘀“的电报声。这些“噗噗”声按Morse码解码后就得到了希望一号信标的内容,包含它的呼号BJ1SA,遥测信号起止符XW XW和相关遥测数据。

一段完整的希望一号HO-68信标录音(有剪辑):

继续尝试通过SO-50进行语音转发,虽然我们有两个电台,但由于只有一个“牛”天线,所以很难进行有效的通联。不过我还是抱着“侥幸”心理通过我的FT-60R加上橡胶天线进行了一次呼叫,G71A上抄收到了这个信号!虽然信号非常的微弱几乎被淹没在噪音中难以辨识,但是我们的声音的确是变成电波实实在在的去天空转了圈又回到了地球上,心情非常激动。不过这也就是我们这天在SO-50上的唯一收获了。

有了周六的基础,周日下午我、BG4KKS和BG4XPH一同再次试验SO-50和AO-27时就显得更加信心十足。成果也很不错,在SO-50上,我们抄收了若干日本业余电台的通联过程,不过由于信道很繁忙,我们没有机会插入呼叫。在AO-27上,我们成功完成了与泰国电台HS35NP的通联,信号55(语音清晰,信号强度中等),并联络上了沈阳的BG2TOS。

卫星飞得很快,每次有效通联试验的时间也非常短暂,前后准备和等待了一天多时间,实际能说上话的时间也就不足5分钟,颇是意犹味尽。在一个电话就能打遍全球的年代,业余无线电通信这种古老而又“高科技”技术显得很没有性价比。然而无线电运动的魅力也许也就在于每次你想说话时,不知道能不能说得成,也不知道会跟谁说上话。期待下次卫星通联试验。

除了完成了卫星通联试验,周日早上在栖霞山上还完成了数次UV段的远距离通信,这天的信号传播很给力,我们成功联络了南京、仪征、常州、无锡、芜湖、宜兴和南通等地的电台,收获颇丰。其中与南通的直频通信(不通过中继)直线距离达到了190公里,打破了我所参与过的通信试验中黄山到芜湖直频149公里的小小记录。

在即将结束一天活动前,我们在仙林的亚东城某高楼顶还第一次观测到了国际空间站(ISS)飞过南京上空的景象,它的亮度很高,所以用肉眼就可以轻松观测。唯一的重点是你得知道它会在这个时候飞过你的上空,并且最好知道经过的轨迹,这样才会比较容易在天空中找到它。怎么才能知道这些信息?请参考本文第十段……

有关书的一点碎碎念

2011年6月18日,全民动员,像打了鸡血一样在京东抢购对折书,连我这种向来对“非必须”商品持谨慎态度的人也冲动了一把。冲动的后果当然就是到现在为止还在对着“正在出库”了2天半的订单无奈的流口水。

@和菜头对抢书行为很不以为然,认为书的价值在于阅读,而抢购低价图书则似乎是因为有些人把购买与阅读这两个完全不同的行为在心理上等同了起来,并没有体现出书籍真正应有的价值。或者说低价倾销图书也是互联网界一直存在的鼓励用户贪婪之心的一种体现。

我很认同书的主要价值在于阅读,不过我倒是觉得把书买回来放着也不算是什么罪恶。书籍做为商品,自然会有它多方面的使用价值,阅读是价值之一,收藏当然也是。另一方面说,购买行为也可以看成是对书籍作者和作品价值的肯定。就我自己而言,能让我下决心买回来的书(或音像制品),多半是我已经在图书馆或另的地方看过的,所以购买这件事本身,通常不会完全是为了阅读。我向来觉得,对于书籍这种商品,在我读过(或者在一定程度上了解)它之前,我无法判断它对我有没有价值,我又凭什么要支付它封面上所标明的价格呢?

一周前拿到了摆摆书架的内测邀请,这是在5月底的TEDxNJU活动上了解到的一个网站。摆摆书架试图打造一个社会化的图书馆,通过捐赠、交换来更充分的实现图书的价值。基本的模式就是注册会员捐赠自己的图书,根据捐赠的数量可以获得等量的从别人那里获取图书的机会。

我很喜欢摆摆书架的创意,但是这个创意和目前的实现似乎完全基于一个不现实的基础:所有人都是善意与合作的。在摆摆书店目前的体系中,只要出现一些不合作的人,整个体系就会乱套,很快就会出现类似于“劣币驱逐良币”的现象:大家把好书都囤到自己手里,剩下一些价值不高的书籍在外面流通或甚至导致流通趋于停滞。

类似于京东打折这样的低价图书的存在和中国高昂的物流成本,也会更多的限制摆摆书架的发展:买一本新书可能只要不到20元,寄一本旧书给别人却需要7-12元左右的快递费用(别跟我提中国邮政的平邮业务,实践证明,“丢包率”太高了)。一本书在摆摆书架的体系中流通两三次的物流成本,就可能超过它本身的价格,这样的书籍价值实现,实在是不好让人接受。

有个叫“青蕃茄”的网站,实现了免费图书借阅、送书上门,感觉它把图书和物流这两个问题放到一起去通盘考虑,似乎是可以找到一种可靠的模式来维持这个体系的存在。不过我一直没有去体验他们的服务,不知道现在实际运营的如何。

进入IPv6的世界

本文写于2011年,目前我已不再试用Linode,新的VPS提供商不提供IPv6的环境,所以目前本网站不再支持IPv6访问。

我的虚拟主机提供商Linode从5月份开始提供原生的IPv6支持,虽然暂时没有什么实质性的用处,但还是决定体验一下。记录一下添加IPv6支持时遇到的问题,供大家参考。

1. Linux中启用IPv6支持

原则上只需要确保你的Linux内核中已经把IPv6的支持编译进去了就行了。在Red Hat系列的发行版上,可能要检查一下/etc/sysconfig/network这个配置文件中有没有把NETWORKING_IPV6设成yes。启用IPv6后,网卡在up过程中就可以从DHCP服务器那里分配到IPv6地址了。如果需要手工配置静态的IPv6地址,跟配置IPv4的方法是类似的,直接修改相应的配置文件即可。比如在Red Hat系列的发行版上,就修改/etc/sysconfig/network-scripts/ifcfg-eth0,在里面加上IPV6INIT, IPV6ADDR, IPV6_DEFAULTGW等配置项即可。

2. nginx中启用IPv6支持

如果只是在配置文件中写上listen 80;的话,nginx只会在IPv4的80端口上侦听。如果需要全局启用IPv6,可以改成:

listen [::]:80;

因为在Linux中,默认情况下,IPv6的TCP socket会同时在IPv4地址上工作。所以对于listen 80;和listen [::]:80;这两种绑定所有地址的80端口的监听,只能两者取其一。不然在启动nginx时会报端口已经被占用而导致启动失败。

如果你的nginx是为多个vhost提供服务的,却又不想在所有的vhost上都启用IPv6,则可以分开写IPv4和IPv6的监听规则:

listen 80;
listen [::]:80 default ipv6only=on;

然后在各个vhost的配置文件中分别有选择性的使用这两行配置就可以了。或者也可以采用非全地址绑定的方式,在listen后面显式的指明要绑定的IP地址。

有关nginx的配置,可以参考nginx的HTTP Core Module的相关文档。

3. DNS设置

在你的域名的DNS配置面板上,你应该可以为你的域名添加A记录或AAAA记录,A记录是IPv4地址,AAAA记录IPv6地址。同一个域名可以同时指定A记录和AAAA记录。在访问的时候就会同时解析出IPv4和IPv6的地址。

除了主域名上同时绑定A和AAAA记录,通常也建议用一个独立的子域名去单纯绑定AAAA记录,这样可以便于在双栈的网络中明确指定希望走IPv6网络。

目前我的主域名freemindworld.com上同时绑定了IPv4和IPv6地址,ipv6.freemindworld.com上为纯IPv6地址。

使用国内的ISP的DNS服务器测试IPv6时需要小心,如果你的域名只绑定了IPv6地址,ISP的DNS服务器可能会进行一次DNS劫持,在返回你IPv6地址的同时,也返回给你一个错误的IPv4地址。至少在Linux下,Firefox和wget都会优先去用那个假的IPv4地址去发起请求,从而得到错误的结果。换用更可靠的DNS服务器或在/etc/hosts文件中添加IPv6地址映射可以解决一部分的问题,更可靠的解决途径可能可以使用TCP DNS。

4. 客户端

CERNET2的用户应该是有原生的IPv6环境来使用的,中国电信的用户就暂时只能通过Teredo隧道这样的方法来使用IPv6了。在Linux下,Teredo的一种实现叫做miredo(音乐中的三个唱名,mi re do),常见发行版中直接安装这个软件包并启动相应的服务就可以得到IPv6地址,通过Teredo隧道的方式来体验IPv6了。请记得改用ping6来测试IPv6的服务器连接,在nslookup时需要set type=AAAA。

最后再赞一下Linode的客服,我在不同时间提交了两个VPS开通IPv6的ticket后,都在3分钟中内得到响应并完成了请求,效率相当的高。

设计与传承

顺应民意,南京地铁开始进行车站导向标识的改版,如图:

南京地铁新版导向标识

南京地铁新版导向标识

什么是一个好的设计?在我看来,一个好的设计必须首先满足功能上的需求。作为导向标识,它最重要的功能性就是要表现出车站所在的方位,新版的导向标识在标明方位的同时还提供了车站名、线路号和距离等实用的信息,提供了更多的功能,也就给乘客提供了更多的方便。

设计心理学》一书中提到,对于设计师来说,有一种致命的诱惑叫做“悄然滋长的功能主义”,或者用别的一种表述的方法,就叫做“设计师应该会做加法,但更要重视做减法”。新版标识上所增加的信息,是不是足够的必要?

必要或不必要,对于不同的目标用户,常常会得到不同的答案。假设以外地游客作为导向标识的主要受益者,他们的需求,就是通过搭乘地铁,到达下一个目的地,所以对于他们来说,导向标识能指向最近的地铁站是最为重要的。而车站名称、距离和线路号,都是次要的信息,只要在地铁站内部布置更详细的线路图和换乘指示,他们都可以在到达地铁站后再获取更多的信息并顺利到达目的地。新版导向标识所增加的信息,只是对于一部分人来说可能可以提高出行效率或节省少量出行费用。

所以从“做减法”的角度说,我觉得改版的标志牌算是画蛇添足。

可是在导向标识牌上增加距离信息是广大人民群众的呼声啊,有人会这么说。好吧,这是个很大的话题,而且已经有很多人讨论过,比如白鸦的那篇《听不听用户的?》。

好的设计,除了满足功能需求,应该要考虑到一致性。因为人在日常生活中,通过不断积累对世界的认识,就形成了一种概念模式。通过一致的设计可以有效帮助用户去借助他头脑中已有的知识,去认识和理解新的事物。

南京地铁线路号的标识是什么样子的?答:圆圈里一个数字。或者,你想不出这个答案,但你一看到这个答案时就能迅速的回想起地铁车站里无处不在这种表示方法。可是遗憾的是,在新版的标识牌上,线路标志变成了一个方框,这分明是北京地铁用的表示方式嘛。缺乏一致性,从而不能成功的利用用户心中已经有概念模式去有效的给用户提供信息,是新版标识设计的败笔之二。

要做到一致性,标准化是一个非常行之有效的方法,虽然标准化可能会束缚一些创新,但从成本和效率上来看,它都不失是一种值得考虑的途径。

好的设计,从实现的层面上,要具有可扩展性。尤其当你的设计会成为标准,在多个场合应用的情况下,设计就必需要为多种应用场景留出必要的扩展空间,不然这样的设计就会很难让人来复用,最终失去了设计和标准化的意义。

在这一点上,已经有人恶搞了一下新版标识在”高铁南京南“站应用的效果图,不解释。

新版导向标识在高铁南京南站的应用场景

新版导向标识在高铁南京南站的应用场景

好的设计,在满足了基本的应用需求和设计思想后,最终还是要能给人一种设计美感。一些细节的设计和艺术的加工,是可以帮助设计本身更好的去实现它所应该具备的功能性的。

新版导向标识,包括鼓楼站站内最近更新的各块标识牌,都把原本很有特色的宋体风的字体改成了普通黑体(Serif风变成了Sans-serif风),英文字体虽然一直是Sans-serif的,但是字体也变得更平庸了。虽然美观这件事是见仁见智的,但是我个人觉得把一种有点特色设计变成了一个平庸的设计,大部分情况下恐怕是欠考虑的。

做一个好的设计很难,但更多的时候,传承一个好的设计更难。后来的人常常因为没有经历最初创作的过程,从而无法发现和理解一个设计中所内涵的东西。尤其对于一个功能性很强的东西,在时间、资源等限制条件下,被遗忘或者妥协掉的,总是设计。这也是南京地铁标识系统中现在的问题所在。

有时候,我们会嚷嚷着说,时间来不急了,我们先把东西做出来,细节上的东西和实现上的优化我们以后慢慢再改。但实际上,这种口号从来都只是一种美好的愿望,在功能实现的时候,不管是出于资源有限还是人类天生的懒惰,所有的改进和设计的愿望都会被抛到脑后,并且随着时间的推移,这种愿望实现的成本会越来越高,从而最终无奈的放弃。

做一个好的设计、传承一个好的设计,有时候只需要我们在刚开始的时候多走一步,比如采用文档、标准化等方法把一些基本的东西规定下来,事情就可以得以顺利的推进,并且也许不会增加太多的成本。但是一旦涉及到更改,成本总是会变得很高。可惜人们常常都是短视的。

以上图片资源和部分观点转载自地铁族论坛:链接一链接二

以上所有观点都适用于软件系统的设计和开发。