Wednesday, October 18

天宫一号: 大约在冬季


天宫一号太空站在2011年9月升空。 

2011至2013年内,神舟八号、神舟九号、神舟十号飞船相继与天宫一号完成太 空交会对接,宇航员进入天宫操作。2013年6月最后一次对接之后,天宫一号预定的工作已全部完成。 

这时候,如果稳妥起见,可以控制天宫一号进入地球大气层双规,在规定的时间,规定的地点(一般选择浩瀚的南太平洋)坠毁。 

中国人不是穷怕了么,什么都要精打细算,所以把它超期服役,希望在天宫二号(2016年9月升空)之前一直运转。 这也是有先例的,下面的介绍你能看到礼炮7号太空站在世界各国宇航员的合作之下修修补补又工作了几年。

几个月后,就有电池发生了故障,无法修复;倒一直还有数据传输。直到2016年3月,数据传输都失败了,地面完全失去了控制。 中国给联合国写了封信,承认现在只能“跟踪与监测”:


现在只好等着它掉下来了。时间大约在冬季。地点大概在地球。很有可能大部分都在空中燃烧掉,但是8.5吨的大家伙,也可能有残余,不定掉在哪里。一阵飓风就可能把残余从一个大陆变换到另一个大陆。 


史上也有两次这样的太空站坠落,我们看看: 
1,苏联礼炮7号,21吨,在1982年4月至1992年2月间运转。1985年2月11日,联络中断。6月6日,宇航员进入其中更换了故障电池,太空站继续运作。1986年,宇航员还进入其中把一些设备取出来,转移到新的和平站(1986年2月升空),并发了一个22吨的引擎接上去,把它的轨道升高,预计在1994年进入地球轨道坠毁,或者找个航天飞机去回收。可是在80年代末和90年代初(那个春夏之交)太阳活动异常,它在1992年2月提前坠毁,没有掉到预定的南太平洋,而是在阿根廷的深山里。 

2,美国太空实验站 Skylab,77吨,1973到1979。坠落前几小时,地面人员还调整了参数,让它能掉在好望角以南,广阔的海洋,可是它燃烧的程度比预期的少,最后在西澳大利亚一个小镇旁坠落,一个家里掉了24块碎片。小镇给NASA开了$400澳元的“乱扔垃圾罚单”。 

3,这个不是太空站,是苏联一个卫星Kosmos 954,1977年9月上天,12月份就失控,1月24日掉到加拿大的阿尔伯塔、杀斯科册温一带。问题是,这是一个核能卫星,这些核废料散落到这两个省,花费了很多工夫收集。 


下面这个链接可以随时看到天宫一号现在的位置:
http://www.satflare.com/track.asp?q=37820

Labels: ,

Sunday, October 15

历史上的今天: 中共中央关于《划分右派分子的标准》的通知

六十年前的今天,1957年10月15日,中共中央发布《划分右派分子的标准》,条例有一二三四五六条,简单说来,反对共产党及其政策的就是右派分子,其中领导人物就是极右分子。

这并不是“反右”的第一天,只是这个通知把规矩明确下来而已。整个“反右”的过程大致如此:

1956年4月25日,毛泽东在中央政治局扩大会议上作了《论十大关系》的讲话,提出了“百花齐放,百家争鸣”的方针。这个讲话当时仅在党内传达,到四人帮被抓起来之后才于1976年12月26日,在《人民日报》上公开发表。

1957年4月27日,中共中央发布关于整风运动的指示,登载于5月1日的《人民日报》上,号召“知无不言,言无不尽;言者无罪,闻者足戒;有则改之,无则加勉”。这几句格言在1945年的《论联合政府》里就有提出来,现在中共已经当政了,还鼓励民众对执政党提意见,让大家很受鼓舞。

1957年4月30日,毛泽东在天安门城楼上召集民主党派负责人座谈,对他们提出了相同的要求。


可是,两个星期之后,毛泽东就发现事情正在起变化5月15日撰写的文章,6月12日党内印发,“我们对中间派过去所扣一切不适当的帽子都要取掉,以后也不要乱扣,只有扣帽子一事,对右派当别论”。
有人评论:
如果以善意推测,毛在最初请党外人士帮助党整风提意见时,并没有“钓鱼”的想法,那么这份“指示”则明确显示,从5月15日起,所有鼓励党外人士继续鸣放的行为,是名副其实的“钓鱼”或曰“引蛇出洞”了。


6月14日,毛泽东同志为《人民日报》写的一篇《<文汇报>在一个时间内的资产阶级方向》,指出:《文汇报》和《光明日报》“在一个时间内利用‘百家争鸣’这个口号和共产党的整风运动,发表了大量表现资产阶级观点而并不准备批判的文章和带煽动性的报道”

1957年7月1日,毛泽东同志为《人民日报》写的社论:
本报及一切党报,在五月八日至六月七日这个期间,执行了中共中央的指示,正是这样做的(不登或少登正面意见,对错误意见不作反批评)。其目的是让魑魅魍魉,牛鬼蛇神“大鸣大放”,让毒草大长特长,使人民看见,大吃一惊,原来世界上还有这些东西,以便动手歼灭这些丑类。

反右运动在中国大地红红火火地开展起来。


1957年7月18日,中共中央主席毛泽东在青岛省市委书记会议上说《一九五七年夏季的形势》,并提出“搞个劳动教养条例,除了少数知名人士之外,把一些右派都搞去劳动教养”。“有反必肃。杀人要少,但是决不废除死刑,决不大赦。对...公众公认为坏人的人,必须惩办”。这其实是文化大革命由公众审判(不经公检法)的起点。

8月3日,国务院公布了《关于劳动教养问题的决定》,主要针对的对象是“不够逮捕判刑而政治上又不适合继续留用,放到社会上又会增加失业的”人员。

这年国庆,人民兴高采烈地打着“把反右派斗争进行到底”的牌子:

然后就是开头这篇:10月15日,《划分右派分子的标准》颁布。


时光飞逝,到1978年9月17日,毛泽东、周恩来、刘少奇等人都已经离世,四人帮已经粉碎,中共中央发布55号文件《贯彻中央关于全部摘掉右派分子帽子决定的实施方案》,大概意思如此:
从一九五九年到一九六四年,先后五批摘掉约三十余万右派分了的帽子。目前,估计全国大约还有右派分子十万多名。他们经过二十一年长期的教育改造,大多数人有了转变,表现较好。
一九七五年,在特赦释放全部再押战犯的同时,毛主席、周总理指示摘掉章乃器的右派分子的帽子,产生了很好的影响。当时考虑到右派分子经过长期的教育改造,绝大多数有了转变,表现较好,准备全部摘掉他们的右派帽子。由于“四人邦”反党集团的干扰和破坏,毛主席的这个无产阶级政策,当时未能实现。
实现四个现代化,总是人多一点好。摘掉右派分子帽子的人中,不少是有用之才。

1981年6月27,中共中央通过《关于建国以来党的若干历史问题的决议》,关于反右运动总结如下:
在整风过程中,极少数资产阶级右派分子乘机鼓吹所谓“大鸣大放”,向党和新生的社会主义制度放肆地发动进攻,妄图取代共产党的领导,对这种进攻进行坚决的反击是完全正确和必要的。但是反右派斗争被严重地扩大化了,把一批知识分子、爱国人士和党内干部错划为“右派分子”,造成了不幸的后果。

2013年1月7日上午,孟建柱在全国政法工作会议上宣布,停止使用劳教制度。

2013年12月28日,第十二届全国人大常委会通过了《关于废止有关劳动教养法律规定的决定》,劳动教养制度正式废止。

Labels: ,

Tuesday, October 10

Python notes: re.match object is not subscriptable in 3.5. good in 3.6

Below is the screen shot of the same code running in two environments:


You can see that a[0] works well in 3.6 environment, but failed in 3.5 environment (which is the latest python 3 of Ubuntu).

Thursday, October 5

Practice caution when using cache (lru_cache in python)

I have a simple search code in python:

def SearchNode(name):
   for node in Nodes:
         if node.name == name:
              return node
   return None

Pretty simple. Nodes is global variable in this module. Because this function is called frequently, I added cache from functools for it:
@lru_cache(maxsize=5000)
def SearchNode(name):
   for node in Nodes:
         if node.name == name:
              return node
   return None
Sounds too trivial to create a unit test for it, so I apply it directly to my project. Two days later, my program is giving out different kinds of error, and it took me several hours to identify the source of error: the @lru_cache line. The call to this function always returns "None" for me.

 I actually added some code to iterate the legit names and do "SearchNode(name)", and the return values were always "None"!

After another hour of tracing and thinking, I finally understood the problem:

When building Nodes, I call this function for a new name, to make sure the name does not exist in the Nodes, before adding into the structure. So for each new name, the answer is always None, and the @lru_cache remembers this answer. So when I actually need the node, the @lru_cache still gives me the "None".


After locating the source of error, I can think of several ways to solve it (while still having the cache mechanism): Disable the cache first, only enable it after the Nodes is built; Reset cache after the the Nodes is built; Let the cache remember the non-None result. @lru_cache does not have the capability to do any of them, so I have make my own cache, using the third way:
SearchNode_cache = {}
def SearchNode(name):
   if node in SearchNode_cache:         return SearchNode_cache[node]
   for node in Nodes:
         if node.name == name:
              SearchNode_cache[node] = node              return node
   return None

You can easily add 2 lines to set a size limit for the cache, and remove the oldest item in it, to implement Least Recent Used mechanism.


Lesson learnt:
1, Any one simple line, no matter how innocent it looks, can jeopardize your project in a big way.
2, If the value of the Nodes can be modified, my current way is not correct.
3, So don't just copy my code. My application scenario might not be the same as yours.
4, Practice caution when using cache.

Labels: ,