按 ‘ infotech ’ 分类归档

制作金星凌日动画

2012年金星凌日动画

2012年金星凌日动画

看到Photoshop里的“窗口…时间轴”功能,忍不住拿它练手,把去年拍的金星凌日过程做了个动画。共用了21帧画面,每两帧的间隔200毫秒,代表20分钟的摄影间隔。

最不易把握的是太阳的倾角,因为太阳在拍摄过程中从地平线升到天中央,加了滤光膜之后周围一片黑暗。如果不把太阳“调平”,金星的位置就会跳来跳去,画面就不连贯了。还好,当天太阳表面有几颗太阳黑子,可以帮助我把太阳固定住,只让金星在画面里移动。

金星凌日时观察到太阳黑子的偏移

金星凌日时观察到太阳黑子的偏移
由太阳自转引起

太阳黑子也不完全可靠,第一帧画面和最后一帧,无论如何旋转、平移,都没法让日轮和黑子同时吻合,这说明太阳在这拍摄的6个小时里发生了自转,使得黑子们在日轮里面悄悄偏移了。

测量22:15到3:30 UTC的黑子偏移,这5小时15分钟里,它们向右(太阳认为的东方)平移了10个像素,相对于384像素的太阳直径,10个像素相当于2.98度(10×360/384π)。运算得出太阳在黑子处的自转速度是13.6度/地球日(2.98×24/5.25),和太阳的实际情况吻合。

天平寻异问题

核桃

刚看到一道题:十二个球,有一个重量与众不同(没说是重是轻),有架天平,限最多称三次把这个球找出来。

博主@张泉灵表示,有这时间思考还不如立即动手称十一次,这一定让她的侄子很是扫兴,不过十二个球也太少了,如果改成“二百四十三个球里有一个重的,限五次把它称出来”或许能帮她认真想一会儿。有人认为这是文科生和理科生的不同,其实即使在理科生里,也有做底层设计和现场客服的不同。

顺便想起了两个人来,一个是惯用客服心态对待设计,一个是惯用设计心态对待客服,都是人间悲剧。用客服心态对待设计的,事后也不想着补严实了,程序里满是创可贴,隔三岔五地垮;用设计心态对待客服的,待找到出血点,一针一线细细补好,再加上两三年内可以预见的种种特殊防范,病人早已失血过多死在了床上。只顾“扬汤止沸”,非要“釜底抽薪”,是两种极端人格,还是走中间路线比较稳妥些。

扯远了,回到问题上来。先跳入脑海的就是二分查找:先是六对六地称,然后三对三,最后一对一,搞定。但二分法有个前提,你得预先知道那个球是轻是重。否则,第一步六对六称完,秤盘确实一高一低,下一步的三对三,你打算挑哪个秤盘下手呢?

方法如下,没有思路。事后总结,是“与众不同者,不一定非要上秤盘”和“让大家动起来”。

1、把十二个球分三堆,为了表述方便,称为A、B、C,每堆四个球。
2、天平两边放A堆和B堆。(第一称)

3.1、如果天平平衡,则说明A堆和B堆都是正常球,异常的那个球在C堆里。在天平一侧放三个C球,另一侧放三个正常球(从A或B里随意取),再称。(第二称)

3.1.1、如果依然平衡,则说明没上秤的那个是异常球。【结束】
3.1.2、如果天平失衡,则上秤的三个C球里有异常,并且这时已经知道它是轻是重,任意取两个C球放天平两边。(第三称)
3.1.2.1、如果一样重,那么剩下那个就是异常的。【结束】
3.1.2.2、如果天平失衡,那么和第二称里C球翘起/下沉方向一致的那个,就是异常球。【结束】

3.2、如果天平失衡,则异常是在A堆或B堆里,而C堆球可以当做标准砝码用。拿走三个A球,用三个B球去陪剩下的A球,而B球空下的位置填三个C球。就是说,天平一边是A1B1B2B3,另一边是B4C1C2C3。(第二称)

3.2.1、如果天平平衡,则说明异常在拿下去的三个A球里,并且刚才全体A球的表现已经说明了它是轻是重,只需任意称其中两个,(第三称)就知道谁是异常的。(参考3.1.2)【结束】
3.2.2、如果天平和第一称的AB盘倾斜方向保持一致,则说明异常球还在原位没动,不是A1就是B4,只要把其中一个和一个C球比较一下即可。(第三称)【结束】
3.2.3、如果天平的AB盘倾斜方向发生翻转,则说明异常跟着三个B球转移到A盘去了,而且我们这时知道了它是轻是重。只要任意对比其中两个即可。(第三称)【结束】

Photoshop CC 防抖滤镜

莲师忿怒金刚·防抖滤镜矫正之前

莲师忿怒金刚·防抖滤镜矫正之前

Photoshop CC增加了一项新功能:防抖滤镜,在“滤镜……锐化……”菜单下可以找到。这个滤镜可以矫正摄影时相机的抖动。

来快速感受一下,头图是首都博物馆的莲师忿怒金刚,那时还没有掌握铁手技巧,1/20秒就抖得一塌糊涂。用Photoshop打开这张照片,点“滤镜……锐化……防抖”,使用默认设置即可,点“确认”,一瞬间,眼球震颤的感觉就木有了!

莲师忿怒金刚·防抖滤镜矫正之后

莲师忿怒金刚·防抖滤镜矫正之后

惊喜之余,拿这个神器拯救一下在夏鲁寺拍糊的五方佛之不动如来(五方佛只有他一尊拍糊了,让强迫症患者十分难过),以及同一年拍糊的思维观音(注意修复后的顶髻的清晰纹路):

总结如下:

  • 对焦不准的问题不能被此滤镜修复。
  • 修图时,要首先使用防抖滤镜,再修其它的(如透视、色温、色阶、图片尺寸等等),因为此滤镜需要最原始的扰动数据:位置、色彩等等。
  • 防抖后噪点会略有上升,有得必有失。一次把照片拍正确的铁手技能不可废。
  • 矫正后不要覆盖或删除原图,要期待未来图像处理技术的持续改进。也说明如果在旅途中拍到了孤本,即使效果不好也得留着,以待技术革新。
  • 最后,拉仇恨地感叹一句:文科生的世界,终究是要靠理科生拯救的。

Photoshop修图示例

四川博物院佛像厅的展台灯光色温低得出奇,G12厚卡的“自动白平衡”和“白炽灯”模式都无法反映展品原色,是用来展示Photoshop修图的好素材。这里举三个例子,都是四川博物院的展品。为了节省页面,故修图过程使用小图展廊方式,好处是可以点击展廊以滚动演示修图过程。

示例一:密集金刚

四川博物院·密集金刚·原照片

四川博物院·密集金刚·原照片

1、滤镜-Camera Raw-吸管方式校正色温(样点取展台)。2、勾选佛像外轮廓。3、反转选择范围(即选佛像),微调色相,增饱和度。4、再反转选外轮廓,渐变工具-圆辐射模式改背景,辐射点取佛像头部。5、配字,选用方正藏意字体。

配字,选用方正藏意字体

配字,选用方正藏意字体


猛击阅读全文

程序员入伙书——“会报警”的取款机

keyboard-sketch

有个传言流传很久了,说是如果你被歹徒胁迫去ATM取钱,不妨把密码倒着输,如123456输成654321,然后,ATM就会一边吐钱给你(为了防止歹徒翻脸攮你一刀),一边偷偷替你报警。

这个传言的虚假性挺明显的,不过就我所知,办公室里曾经有人,看到这消息时,兴奋地念给大家听,完全辱没了自己程序员的身份。最近一念忽然想起了搁笔已久的《程序员入伙书》,该继续往下写了。这一篇并不算是真正介绍编程语言或技巧的,而是作为《程序员入伙书——两个世界》的补充篇,帮助大家习惯计算机的思路。

即使不是学编程的读者,这篇文章也可以算是足够浅显的逻辑训练,教大家识别都市传说真伪的套路。

假如我是程序员,被客户——或者啥也不懂、就知道和客户沆瀣一气的销售员——要求设计这样一个ATM:正着输密码就心平气和地吐钱,倒着输密码就边吐钱边报警。

我的第一个问题就是:万一用户的密码是888888怎么办?(暴发户脑子不好使,就记得这种密码)或者稍微复杂些的:158851,你到银行输这个密码,取款机该不该报警?当场就把在办公室传这个消息的人们问趴下了,我想,给我布置这个任务的客户也只好收回成命。

接着再说点深的,我努力做到循序渐进,先易后难。

首先说的就是,这个传言有个过于简单的假设(请记住“过于简单”这个词,文章结尾要用),就是“银行知道客户密码,所以知道密码是反着输的”。山寨银行或者骗子银行可能真知道客户密码,但正规的银行一定不知道,理由有浅有深。

浅显的原因是,银行的老大也要存钱,银行老大一定不喜欢任何人——柜台、出纳、甚至机器——看到或记住他的密码。你可能会问为啥让机器记也不可以,因为机器是人类维护的。如果银行知道客户密码,知道底细的老大就不愿意在自家银行存钱,更不愿意把钱存到别家银行。平民百姓也倒罢了,那几个小钱有跟没有差不多,如果银行的任何角落里留有客户密码,那么越有钱的人越不敢把钱往银行里搁。

深一点的原因,是这样可以保护银行自己。虽然银行都很贪,也确实在拿着所有客户的银子胡来,他们却不敢偷具体客户的存款,非但不敢偷,甚至还要做到“想偷都偷不出”。这样,万一有人状告银行在系统地盗用客户密码,银行就可以向调查者公开源程序:你们看,我们的系统真的无法窃取或透露用户密码,所以任何用户的钱因为取款取丢了,都是他自己没看好密码,我们没有赔偿责任。

定理:胆敢存储用户密码的银行,一定无法开张、即使开张也倒闭得最快最惨。

所以,每当我看到老太太们费力地按了六个键之后问柜台:“我按的是441205么?”再补一句“就是我的生日。”我都禁不住打哆嗦:老太太你这是要害死小姑娘啊!人家真的没看见你的密码,也不想听见你说的。再说你自己耳朵背,就非得嚷这么大声啊?我听见你的密码,都起歹意了……

那观众就要问了:银行不知道我们的密码,那我们怎么取钱的?取款机怎么知道我们输对还是输错了?
猛击阅读全文

博物馆摄影系列——Photoshop消除透视及制作灰度背景

amitabha-xialu

消除畸变并修复缺陷后的夏鲁寺阿弥陀如来

在介绍图像后期制作那章,我提到两个技术放到这一章来讲:一个是消除透视,一个是制作灰度背景图。之所以单独放一章,是因为这两个任务不像调明暗、调颜色、裁尺寸那么直观、易操作。

消除透视法

对于书画、唐卡、壁画、浮雕这些平面艺术,如果相机不是摆在整个画面的正中间,得到的结果常常是一个梯形。下面这张照片,是2006年在日喀则夏鲁寺拍摄的五方佛壁画之阿弥陀如来,其巨大的高度使画面成了梯形。这种变形可以用Photoshop消除。

透视畸变严重的夏鲁寺阿弥陀如来壁画

猛击阅读全文

WWF Together iPad App

20130809-202501.jpg

Check out WWF Together, a free iPad app from World Wildlife Fund.

Watch the trailer: http://youtu.be/COPOEOnRnNk
Learn more about the app: http://www.worldwildlife.org/together

面试拒人连载

今天这位完完全全地折在技术上了。

他说他带一个技术团队,在一家知名的通信设备公司工作。行政上不带人,只是技术上带。我想,那一定是技术上很强了。问他擅长那种操作系统及那些编程语言,他说(简历上也这么写的):Linux系统,C/C++,Shell,说这些都是作为“基本功”,必须会的了。

C/C++的话题比较宽泛,因为他前面的陈述里提到过正则表达式,我就请他写匹配C语言里实数的正则表达式。

他提起笔,沉吟了一下,在纸上写:

/d+/./d+/

然后把纸转过来给我看。

我心里咯噔一下,他犯了至少四个错误:

表示“任何数字”的简写是“\d”,而不是“/d”。
小数点“.”在正则表达式里表示“任何字符”,如果想表示“小数点”的意思,则需要写“\.”。
他没考虑实数可能包含正负号。
他没考虑科学计数法,例如一个实数可能被写成3E8,意即3乘以10的8次方。

如果忽略掉头两个错误,他的表达式只能匹配最简单的小数,如3.14、12.7863、0.23等等,而以下数字都不能被识别:

2      虽然这个是“整数”,但人们的心理上希望程序能大度一些。
-3.5
5.2E8

我就提示他说,这个式子还可以改进一下吧,比如科学计数法的实数,你怎么处理?

他的表情,仿佛平生头一次听到“科学计数法”这个词一样。我只好说,就是像“3乘10的8次方”这种数字。看他还是茫然,我就说:你可以先打个草稿嘛,把“3乘以10的8次方”写在纸上,看着这个数写表达式就容易多了。

然后,我无比震惊地看到,他在纸上写下了:

3×108

写下这个数字,表明我面前这位仁兄,一定不是程序员。我来讲解一下:

首先是那个“x”,计算机的标准字符集没有乘号,几乎所有的编程语言都用“*”表达乘法。

其次是那个写成上标的“8”,程序是纯文本的东西,没有在程序里写上下标的可能。

我期望的正则表达式是下面这样的,那一定是太欺负他了:

^[+-]?\d+(\.\d*([Ee][+-]?\d+)?)?$

程序员入伙书——函数初步

以前的几个章节里,大家一定常见到print(…)、range(…)、max(…)之类的结构,它们是什么呢?

它们叫函数。不用管这个名字听起来多么奇怪,和数学上的函数、方程的概念多么不同,先接受这个名字,后面我会说这个名字的来历。

比如说,我们在《程序在干什么?》一节的最后一段举过一个求平方根的例子,后来在《初涉算法》一节讲解过它。就拿这个程序为例,如果现在我想求(根号2 + 根号3) x (根号5 – 根号7),该怎么写程序?

当然我们可以把这个例子复制粘贴四遍,第一遍求根号2,第二遍求根号3,第三遍求根号5,第四遍求根号七,然后用这四个中间结果算出最后的值。

这个思路能干活,可就是直觉太傻太啰嗦。四段程序只有喂给它们的数字的差别,实在是太浪费了。所以人们想,可以引入数学上的函数y = f(x)概念,定义好这个函数的公式(f)之后,把参数(x)喂给它,让同一段代码对参数进行运算,运算结果放在y里,这样岂不节约?

好主意!我们现在把求平方根的算法定义成一个函数:

>>> def mysqrt(n):
    high = max(1, n)
    low = 0
    while True:
        result = (high + low) / 2
        if abs(result * result - n)  < n * 1E-8:
            break
        if result * result > n:
            high = result
        else:
            low = result
    return result

>>>

这段程序里最关键的是第一行,以关键字def引导的函数名mysqrt,其后以括号包围要传递给这个函数的参数n,最后是冒号表示:以下的缩进内容是用来定义这个函数的算法。

最后一行return result也很重要,见到return语句时,程序就会返回到使用函数的那个位置,在相应的mysqrt(x)的地方,放上本次运行得到的result值。这个值被称为返回值

说得再多不如实际做一次:
猛击阅读全文

如何把话说明白?

把话说明白,容易也不容易。

我曾经旁听过一个电话会议,这一头是技术人员,那一头不是,二十五分钟过去了,双方互相没听懂对方想要什么,眼看离会议结束还有五分钟,我只好出声,花五分钟把俩人搞定了。双方的英语和口音也许是造成沟通障碍的原因之一,但我认为一定不是主要原因。

我以前做过售前支持,长期的摸爬滚打中,不知不觉地形成了一套把话说明白的方法,这里总结一下,分享给大家看看。篇幅所限,这文章只谈怎么把话说清楚,而非“销售技巧”一类的煽情指南。

一、要人明白,必须自己先明白。

否则,就是“以己昏昏,使人昭昭”了。曾经有同事问我:如果一样东西,你自己不是很清楚,老板非要你出去讲给客户,怎么讲?我说:没法讲,非讲不可的话,我只讲我清楚的那部分,并在开头就诚恳地告诉客户,有些地方我是不明白的,希望得到他们的指点,如果大家都不明白,我会搜集他们的问题回去,日后一一作答。

二、自己明白之后,却要从不明白的人的角度来讲。

当一个人沉浸在话题内部时,听众就站在了他的对面,他和听众就有了对立的视野,他从里头向外看,听众从外往里瞧,不同的视角,使得他使用的话语、词汇,难以被听懂。

以上两点是最基本的原理,推论如下:

我不想把事情泛道德化,但我的观察是,说不明白话的人,一般相当自私。养心是很重要的,学会站在别人的角度去看去想。自己慷慨了,心胸宽了,不知不觉地,说话就好懂了。

尽量不使用只有自己明白的术语和行话,如果必须要用,就得用一两句话描述,这个术语在外行人眼里是干什么用的。

有时,不但要考虑别人的思路,也要考虑他们的身体条件,跟小孩和残疾人说话时,要想,依他们的身高,看到的世界是什么样?当说“前后左右”这些相对方位词时,要事先约定一个共同认知的参照物。当说“东西南北”前,要问自己:你的听众对这个城市熟悉吗?

说事情要学会分层说,先说主干,再说主干有几个分支,把同一层的各个分支全部点名后,才能向深处展开。记得时时提醒听众,现在的位置在哪儿。千万别在第一个分支就开始往话题深处扎猛子,过早地钻进小巷子,会让自己都迷路的。

和“这个东西是什么”同等重要的,是“这个东西不是什么”。和“这个东西能做什么”同样重要的,是“如果没有它,会出什么事”。

太艰深的预设条件、却和主线关系不大的,要及时对听众说:这个不需要了解太深,已经证明是成立的,知道结论就可以了。

暂不需要听众听懂的,要记得告诉他们:眼前不需要使劲听,后头我会再细讲。真的,听也是很耗力气的,不要磨到正题时,把听众的力气耗光了。

介绍精神层面的抽象概念时,要学会用物质世界的事物来类比。要分清楚大家的共识和自己的见解,不要挟带私货。

学会打比方很重要。很多人以为自己不会打比方,其实,当你真正了解一个事物时,你的大脑就不会使用文字来记录,而是使用画面或声音、生活里的瓶瓶罐罐、道路车马、柴米油盐来表述它。打比方,就是把这些瓶瓶罐罐描述给听众的过程,告诉你的听众,你的眼帘里浮现的是什么。

举个例子:

我的公司是向市场提供金融数据的。这些金融数据通过网络传进我们的处理器,把它们分类,使它们更有条理,再通过网络发布到各交易所、各银行去。因为网络和数据处理都是自动化的,所以我们需要计算机程序员。我们这座楼里有两种程序员:一种做网络,类似于修路的,让装载数据的卡车在上面跑。另一种,就是开车运数据的了。负责修路的人们不在乎头顶上的车运的是什么货,路不要断掉、路面别塌陷就成。开车的人也不在乎路面是石板的还是柏油的,只要装车的时候是一群猪,到货的时候别是一筐白菜就行。就是说,这两种程序员,一种保证数据能传进来送出去,另一种负责数据本身是合理正确的。

再举个例子:

面前的这件器物叫甗,念“演”。一眼看去,就会立刻注意到,这个细腰把它分成上下两部分。名字很难写很神秘,其实它就是个蒸锅,下面这个胖腿的部分叫做“鬲”(念“利”),负责烧开水,上面这个小圆锅叫“甑”(念“增”),如果可以拿回家,你就可以在甑里放小笼包子。平时咱们蒸包子还需要什么?要当心包子掉到烧开水的锅里去。古人也想到这点了,在这个细腰的地方有个铜箅子,蒸汽可以上来,包子不会掉下去。