每日一图:继续宠爱,十年

我就是我,是颜色不一样的烟火。不知不觉,张国荣已经离开了我们十年。今晚,为缅怀哥哥而举行的《继续宠爱·十年》音乐会于红馆举行。图为音乐会的海报设计。而在音乐会上,哥哥前经纪人陈淑芬也公开了他最后的讯息:“我终于可以舒舒服服的睡一觉”。也祝愿他能够在这场美梦中找到属于他的幸福。

相似图片搜索的原理(二)

二年前,我写了《相似图片搜索的原理》,介绍了一种最简单的实现方法。

昨天,我在isnowfy的网站看到,还有其他两种方法也很简单,这里做一些笔记。

一、颜色分布法

每张图片都可以生成颜色分布的直方图(color histogram)。如果两张图片的直方图很接近,就可以认为它们很相似。

任何一种颜色都是由红绿蓝三原色(RGB)构成的,所以上图共有4张直方图(三原色直方图 + 最后合成的直方图)。

如果每种原色都可以取256个值,那么整个颜色空间共有1600万种颜色(256的三次方)。针对这1600万种颜色比较直方图,计算量实在太大了,因此需要采用简化方法。可以将0~255分成四个区:0~63为第0区,64~127为第1区,128~191为第2区,192~255为第3区。这意味着红绿蓝分别有4个区,总共可以构成64种组合(4的3次方)。

任何一种颜色必然属于这64种组合中的一种,这样就可以统计每一种组合包含的像素数量。

上图是某张图片的颜色分布表,将表中最后一栏提取出来,组成一个64维向量(7414, 230, 0, 0, 8, …, 109, 0, 0, 3415, 53929)。这个向量就是这张图片的特征值或者叫”指纹”。

于是,寻找相似图片就变成了找出与其最相似的向量。这可以用皮尔逊相关系数或者余弦相似度算出。

二、内容特征法

除了颜色构成,还可以从比较图片内容的相似性入手。

首先,将原图转成一张较小的灰度图片,假定为50×50像素。然后,确定一个阈值,将灰度图片转成黑白图片。

如果两张图片很相似,它们的黑白轮廓应该是相近的。于是,问题就变成了,第一步如何确定一个合理的阈值,正确呈现照片中的轮廓?

显然,前景色与背景色反差越大,轮廓就越明显。这意味着,如果我们找到一个值,可以使得前景色和背景色各自的”类内差异最小”(minimizing the intra-class variance),或者”类间差异最大”(maximizing the inter-class variance),那么这个值就是理想的阈值。

1979年,日本学者大津展之证明了,”类内差异最小”与”类间差异最大”是同一件事,即对应同一个阈值。他提出一种简单的算法,可以求出这个阈值,这被称为“大津法”(Otsu’s method)。下面就是他的计算方法。

假定一张图片共有n个像素,其中灰度值小于阈值的像素为 n1 个,大于等于阈值的像素为 n2 个( n1 + n2 = n )。w1 和 w2 表示这两种像素各自的比重。

  w1 […]

画线框图容易忽略的几件事

通过工作中的观察与总结,我发现不少新人交互设计师以及产品人员,在画线框图时都会忽略一些重要内容,导致和视觉设计师的沟通成本增高、返工增多、工作效率下降、设计质量下降等重要问题。为了解决这些问题,一方面需要加强沟通,另一方面还需要多站在视觉的角度考虑线框图的设计,使大家的配合更默契。

那么具体怎样做呢?以下就是我工作中积累的一些心得,希望对大家有所帮助。

 

一、通过明暗对比表达

 

以前,我是这样画线框图的,这样能非常清晰的展示各模块元素之间的布局关系。然后我会告诉视觉,这些模块或元素之间的优先级关系是怎样的。但头疼的是,当界面元素很复杂的时候,视觉就难以一一记住了,这个时候就需要反复的沟通,视觉在这个过程中也非常的痛苦,经常是改的头都大了但还是有错误。

现在,我这样画线框图:

加入了明暗对比之后,界面元素的重要级关系更直观,我们不再需要跑过去跟视觉说:这N个模块中这个最重要,那个其次…… 视觉的工作效率也大大的提高了。

 

但需要注意的是:深色并不意味着比浅色更重要,要看色块之间的对比关系。比如下图:

 

“全部商品分类”是非常重要的,在深色块上用了浅色,是希望把它突出出来,让人更容易注意到。但是视觉设计师有可能会误以为浅色代表不那么重要,这个一定要提前沟通好。

 

修改前:

修改后:

二、不使用截图与颜色

很多产品人员为了能更清楚的表现想法,拼凑各种竞品的截图,组成一个页面。这样做一来不规范,二来对视觉设计师也有一定的干扰。另外不太建议在线框图上使用色彩,这样同样会对视觉设计师造成不必要的干扰。如果真的有一些关于图案的想法,可以告诉视觉设计师需要营造什么样的氛围,达到什么效果,而不是直接告诉他“画几个铜钱飞出来的样子,配一个皇榜……”

三、标记第一屏高度

第一屏高度至关重要,最重要的内容、尤其是重要的操作按钮尽可能在第一屏内显示完全,不然会对转化率有较大的影响。第一屏高度在什么位置?在1024*768分辨率下,极限情况下可定为570px;如果不那么严格的话,第一屏高度也可以定为600px。在原型稿上标明即可,这样可以给视觉设计师一个参考。但不要为了保持第一屏高度而让内容过度拥挤,这样会给视觉设计师带来不小的麻烦。

四、严格遵守栅格规范

很多产品人员或新人交互设计师都比较容易忽略这一点,没有按照栅格规范来布局,这样容易导致的结果就是:视觉设计师在按照栅格排版时,发现在交互稿中能排下的内容,在视觉稿中排不下了,这样就还得返回去改交互稿,或是修改需求内容。影响效率不说,可能还会影响最终的质量。所以在制作原型时,一定要注意这一点,同时也要保证交互稿中的字号、间距尽量符合视觉要求(比如间距最小10像素等),以免给视觉造成不必要的困扰。

五、合理的布局及间距

很多产品人员完全不考虑布局标准及美观程度,随便就把想要的内容堆到一起。这样视觉就只能重新考虑布局,无形中耽误了很多时间。另外就是前面提到的,不按照布局及间距标准画线框图,将很难准确的计算第一屏高度及每个模块的实际内容量,导致视觉返工的几率大大增加。(如下图的这种就是一个不合格的反例)

六、表达清楚UI逻辑

当设计一个内容元素较多、逻辑层级较复杂的页面时(比如表单),为了避免混乱,我们需要提前整理一下这些内容,以保证文字、链接、操作等内容的样式符合它们所代表的重要程度,并把各种复杂的情况归类成有限的几种形式,以给用户一个合理的视觉引导。(字号尽量控制在3-5种,根据情况匹配颜色)

主色调和点缀色最终由视觉设计师确定,在交互稿中有所示意即可。通过这些细致的分类,可以保证最终的字号及颜色符合逻辑,而不会给视觉设计师造成不必要的困扰(视觉考虑更多的是美观,而非令人头疼的逻辑)。

七、了解视觉趋势

时刻关注一些视觉趋势,有助于我们在审美上和视觉设计师站在较为一致的立场上,使大家的沟通更加顺畅。

[…]

Furious the Monkey Patch(狂暴的猴子修补)

FURIOUS THE MONKEY PATCH

最近在看pip和setuptools的源码,对动态修改运行时代码的手段(也就是所谓的Monkey Patch)有了一些心得体会,简单地记录一下。

FURIOUS THE MONKEY BOY(狂暴的猴男孩)是帝国时代II里面的一个作弊兵种,单个使用,可以迅速摧毁敌军的单位。虽然这和Monkey Patch基本上没啥关系,不过我倒是觉得借助于Monkey Patch写代码很接近我以前单机打帝国挑专家电脑的方式:(在运行时)打着打着发现正规的手段罩不住了,以前造的兵都不够用了,于是赶紧召唤出一堆作弊单位来弥补局面……

一个简单的示例:问题描述

写一个从IETF的官网获取RFC文档大小(以字节为单位)的Python函数get_rfc_content_length()。输入为某RFC的编号(整数),返回值为该RFC的HTML文档大小(整数)。

例如,RFC2549(文档地址http://tools.ietf.org/html/rfc2549)的大小为17833字节,那么:

>>> get_rfc_content_length(2549) 17833

要求借助Python 3的urllib中的request.urlopen实现。在没有预置的handler来完成请求时(我们知道,此时urlopen()将返回None,尽管这在默认情况下永远也不会发生),应当抛出一个用户自定义的NoHandlerError;更进一步,在当前网络状况存在问题时(未连接,或DNS解析出错),应当抛出一个URLError;而当我们查找的RFC编号不存在时(例如http://tools.ietf.org/html/rfc8888,此时服务器将返回一个404错误),get_rfc_content_length()应当返回值None。

为了便于参考,实现部分的代码如下:

from urllib import request, error def get_rfc_content_length(num): url = "http://tools.ietf.org/html/rfc%s" % str(num) try: response = request.urlopen(url) if response is None: raise NoHandlerError() else: header = response.headers['Content-Length'] content_length = int(header) except error.HTTPError: return None except: […]

罗永浩的“通利福尼亚”

IT路况2013-0331

罗永浩的“通利福尼亚”

本文纯属虚构,当真风险自负。

通利福尼亚,是天天挤地铁去中关村上班的,IT人士,对通州的爱称,以寄托大家对,加州阳光,和,加州硅谷,的向往之情。

家住“通利福尼亚”州的@iPhone一姐,一直有三个梦想。

一、五道口的搜狐大厦能搬到“通利福尼亚”,这样,上班就不用早起了。

二、“通利福尼亚”的房价能跟望京一个档次,那样,卖了房,就可以搬家去上地。

三、罗永浩的锤子手机真的很酷很赚钱,对得起自己深夜23:29分发的微博。

@罗永浩 的锤子发布会终于结束了,辛苦后方的同学了。几点感想:

1、老罗人气无敌,国家会议中心几乎座无虚席。

2、对于门票的处理非常赞,门票收入50万左右全部分给员工,明年推硬件门票价值可返现。

3、不一定完全的变革才可以称为创新,细节的优化同样是提升用户体验的表现。

4、没有西红柿,只有掌声

在一种特定情况下,@iPhone一姐 的三个梦想,都能实现。

张朝阳决定做自己的手机,

搜狐增发10亿美元股票投资罗永浩的锤子,

罗永浩在通利福尼亚,打造“锤子”产业园区,

“通利福尼亚”籍的IT精英,纷纷离职,在家就近,打工创业。

于是,

NASDAQ的钱+搜狐矩阵支持+罗永浩的人气+智能手机成熟产业链+通州便宜的房价

=

中国移动互联网之通利福尼亚的春天。

您可能也喜欢: IT路况–亚都的奥运新闻营销 IT路况–帮亚都加湿器晒烦恼 亚冠+王长庆=国安球票超级导购 IT路况–尼尔森引爆裁员炸弹 无觅 […]

更新标志、更换域名、推出吉祥物设计,看京东的一系列调整动作

最近京东的动作不少,一方面,京东在暂时保留 360buy.com 这个域名的同时,宣布开始启用更加简短的拼音首字母缩写域名 JD.com,同时,随着更换域名,京东也随之发布了全新的标志设计,并推出了自己的吉祥物(之前天猫把吉祥物玩转得非常成功)——名叫“Joy”的金属狗。

在京东的介绍当中,狗代表忠诚,意为京东服务的忠诚体贴,“Joy”的名字则象征着京东为顾客带来的轻松快乐。将自己的理念和诉求用吉祥物的方式呈现出来,希望能够在用户心中留下直观的印象。

无论如何,域名的缩短对用户来说肯定是一件好事,也是不少创业企业在成功之后一定会去努力的工作,而随之进行的一整套视觉设计,也是在市场竞争越来越激烈的当下,能够重新好好整理自己的思路和确定自己的定位,并在消费者当中重塑形象、为用户留下更多记忆点的方式。

不过,对于京东这样的“大头”来说,一套视觉设计的好坏,似乎暂时也不会对用户体验产生本质上的影响。你觉得这套新视觉怎么样呢?

【提醒Chrome用户】不要再使用“Download”扩展!

本警告涉及的范围包括所有开发者为chromeplayground.blogspot.com的Chrome Extension:

Download: https://chrome.google.com/webstore/detail/download/nccjoeeljedbmkidebclpoabijggpbdp Plugins: https://chrome.google.com/webstore/detail/plugins/chemohaemmfhjpmlgkmkanfpfbkaihop 其他。

首先,这个网站的名字非常具有迷惑性(Chrome Playground),其实和Chromium / Google Chrome的官方开发者并无任何关系。(所以我现在总算知道为什么Oracle要用尽一切手段保护他们的产品商标了,也许Google应该在这方面跟人家学学……)

然后,如果你没有用过这个Download扩展的话:它只是单纯的一个按钮,点击后可以直接打开一个标签到Chrome的下载页面。虽然我现在一般都直接用Ctrl-J,不过因为这个扩展是很久很久以前装的(貌似还是在我用Windows Vista做主要工作系统的时代),因为Chrome的各种同步一直保留到了现在。因为只是工具栏旁边的一个下载按钮(而且和Chrome本身的下载图标长得也一模一样),看起来实在是人畜无害,所以留着也就留着了。

然后,在最近几天前,Chromium提醒我这个Download扩展升级了,要求更多权限,因为觉得它人畜无害,所以想都没想就点了同意。

再然后,就在昨天,发现Twitter信息流里的所有推点击之后都完全没反应了,不能再像往常那样自动展开Details。另外,在输入区域点击之后,“Compose new Tweet”字样不会消失,点了Tweet也没反应。如下:

无独有偶,在ruby-doc.org上查看Ruby文档时,那个“click to toggle source”点击之后也没反应,所以可以确定这不是Twitter本身的问题。

升级了一下Chromium,问题依然存在。Firefox下面没有这个问题。发现在Chromium的隐身模式下面也不存在这个问题。排除法,只可能是Chromium的某个扩展导致的。这个时候才发现自己的扩展装得似乎有点多(汗- -||),一个个禁掉再刷新页面,最后找到了这个有问题的扩展:Download。禁用之后,Twitter页面立马恢复正常了。

废话不多说,直接去看源码。这个扩展在这里:

~/.config/chromium/Default/Extensions/nccjoeeljedbmkidebclpoabijggpbdp/0.1.7_0/

manifest.json:

"content_scripts": [ { "js": [ "fdi/inject.js" ], "matches": [ "http://*/*", "https://*/*" ], "run_at": "document_start" } ],

一个单纯用来打开Chrome下载页面的扩展,为什么要在我访问的所有页面上inject东西?这尼玛一看就有问题。

再一看这个fdi/inject.js:

function inj(){ if (document){ var _head = document.getElementsByTagName( "head" […]

程序员追求的是什么?

  上周我收到三位Halmstad大学学生的电子邮件,他们正在做一个为期三月的项目,内容是关于程序员在工作中追求的是什么,以及企业如何吸引有才华的程序员。下面是我对他们问题的答案,按重要程度排序。显然人们会有不同的偏好,所以我很有兴趣听到你们赞同哪些,反对哪些,重要性的评判,以及你们认为遗漏了的要点。

  1. 做软件产品。我希望我参与编写的程序成为公司的主要业务。这就排除了IT维护工作,因为这种工作只是间接地支持了真正的业务(不管它是什么)。我也希望参与系统核心部分的工作,越重要的越好。如果我做的东西出错了,它应该马上成为一个紧急问题。最后,我不愿意参与仅仅是配置、应用或整合其他公司的软件 — 我希望自己来实现关键性的功能。

  2. 优秀的同事。和对软件开发充满激情的聪明程序员一起工作是催人奋进的。我一次又一次地看到和同事一起谈论一些问题或设计是如何产生比我们任何一个人自己闷头想出来更好的思路的。这种合作方式不光是产生更好的代码,过程本身就是非常令人享受的。

  你怎么知道某人是不是一个优秀程序员呢?一个特别好的特征就是看他们是否持续学习和提高他们的技能,例如通过读书、看博客、参加培训课程、以及参加技术大会。这倒也不是一个必要条件,我就曾经和很多不干这些事的很棒的开发者共事。最后,优秀的开发者会吸引其他的优秀开发者,因为以上原因。如果一个企业有很多优秀的开发者,它就更容易招到更多的优秀开发者。

  3. 挑战难题。程序员通过代码解决问题。开发的产品起码在某些角度需要聪明的思路,比如低延迟、大量并发请求、或有限的硬件资源。不过,很多软件产品都是由常规代码组成,没有什么难做的部分。所以你也不能只是盼着做“困难问题”而避开其他的所有需求。而且,组织好那些看起来很无聊的代码,让它们容易理解和维护,这本身也是一个巨大的挑战。

  4. 很酷的技术。这主要是关于使用有趣的编程语言(例如Clojure、 Erlang 或者 Go),但也包括框架和应用(例如Hadoop 或 Cassandra)。这可能是某些公司有问题的地方。如果它们的应用是用某个语言(比如C++)写的,它就不会改了。所以如果你想改用一些新的语言,你可能需要换个工作。例如,如果你在斯德哥尔摩想用Erlang,你可以给Klarna 或 Campanja公司投个简历试试。

  5. 用户。编码的乐趣之一是做出一些对别人有用的东西。做了东西却没人用就无聊了。要让用户(越多越好)关注你开发的努力并且给予有价值的反馈。唯一例外的可能是创业的时候,但是之后就要把吸引尽可能多的用户作为最优先的事情。

  6. 不错的薪水。拥有大量优秀开发者的公司懂得优秀人才的价值。因为优秀和一般程序员之间的差别是巨大的,所以报酬向优秀开发者倾斜在经济上是有道理的 — 其实在生产效率上的差别远大于薪酬上的差别。反过来说,那些不舍得给程序员较好薪水的公司往往把程序员看作是可以随意更换的“资源”。那么这些公司在其他方面的表现恐怕也是你看不上的,不仅仅是低薪水。 

  7. 很好的工具。这个因素的重要性几乎是不言自明的。一台快速的计算机和几个显示器可以加快开发过程 — 谁会反对这一点呢?(好吧,那些光看成本不看效率的秃头老板可能会反对) 

  8. 一周工作40小时。如果你总是要加班完成任务,肯定是你工作的单位有一些问题。而且,长时间工作也不等于有效率。 

  9. 最少的官僚主义。对于开发过程来说,或多或少会有敏捷开发方法的影子,看起来大家都采用了这种思路。根据我的体会,在大公司里日常管理的那些琐事基本上都是躲不开的问题。 

  10. 在家工作。 有时候能在家工作是有效的,不过我不常这么做。我喜欢在办公室里,和同事交流。我曾经通过视频会议、聊天工具和电子邮件在一个远程办公室工作,但这样的工作效率还是不如现场合作的高。

  11. 离家近。显然这不容易强求,但是能不用每天花几个小时在路上多好啊。

  评论

  如果你是咨询顾问(而不是程序员),这个列表上某些项可能会不一样。我总是愿意在产品公司工作,主要因为我喜欢深入了解系统,看着它随时间如何演变。所以我没有作为咨询顾问的第一手工作经验,不过我觉得是这样的:作为一个咨询顾问,你更容易接触到很酷的新技术,因为你有机会和很多不同的客户一起工作。但是,即使你有很棒的同事,你可能也不会每天和他们在一起工作,因为你们会被派到不同的客户那里去。

  这就是我在单位里最看重的几个因素,按重要程度排序。在现实生活中总会打一些折扣,但越是列在前面的因素,我就越不愿意给它们打折扣。你看重的因素有哪些呢? 

  英文原文:Henrik Warne,编译:伯乐在线 – @老码农的自留地

  译文链接:http://blog.jobbole.com/37078/

评论《程序员追求的是什么?》的内容…

相关文章: 巧用CSS文件愚人节恶搞 产品经理类产品的探索之路 沃尔玛实验室开源项目一览 用于展现图表的50种JavaScript库 12306反制浏览器被指“傻大黑粗”

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

负整数的整除和取余运算

负整数间是怎么整除和取余数的呢?

数学上貌似没定义,但计算机确实能算。于是就试了试,想总结一下规律。

一不小心发现,C/C++ 和 Python 下的结果是不同的:

  C/C++ Python 精确值 -14/3 -4 -5 -4.67 -14%3 -2 1 / 14/-3 -4 -5 -4.67 14%-3 2 -1 / -14/-3 4 4 4.67 -14%-3 -2 -2 /

总结规律如下:

两种语言中,商和余数都符合 被除数=商x除数+余数 这一数学规律。 两种语言中,整除的方法不同:C/C++ 是向零取整(负数向上、正数向下取整),Python 是下取整。

 

以 n/3 和 n%3 为例,看看这两种处理方法的区别。

C […]

为什么Fibonacci数列相邻两项之比会趋于0.618?

    你或许熟知一个非常经典的结论: Fibonacci 数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … (头两项都是 1 ,此后每一项都是前两项之和)的相邻两项之比将会越来越接近黄金比例 0.618 ,不信请看:

      1 / 1 = 1.0000000…       1 / 2 = 0.50000000…       2 / 3 = 0.66666667…       3 / 5 = 0.60000000…       5 / 8 = 0.62500000…       8 / 13 = 0.61538462…       13 / 21 = 0.61904762…       21 […]

Category

Archives