在程序员的眼里,用户是这样使用他们开发的软件的
我曾经说过,程序员不是一般的人,是具有某种超能力的人。但问题是,程序员往往意识不到自己 的这种特异功能,在他们的眼里,会认为自己很普通,跟常人一样,所以,程序员能做到的事情,其他人——比如他们的客户/软件用户——也应该很容易做到。但 事实上,由于大部分人——绝大部分人(包括软件开发公司的客户/购买软件的用户)——都是电脑小白(对电脑知识/计算机知识/软件知识知之甚少的人)。一 个对于程序员来说很显而易见的软件操作,换成让用户来操作,就会出现各种各样奇怪的事情。这让程序员非常痛苦。 记得有一次,一个客户打电话给我,说他电脑桌面上的大e找不到了,我没听懂,什么大e找不到了?客户解释说:就是那个长的像大个儿的英文字母e的图标找不到了。我倒。终于明白了他指的是桌面上的IE浏览器的图标不见了。 还 有一次,有个客户提出一个需求,要求在页面上增加一个搜索功能,我问它,系统里有搜索功能,为什么还要在这个地方新增一个搜索功能,他说他要的不是那个搜 索,他要的是在这个页面上搜在某个关键词。经过进一步的沟通,我明白了,他要的是浏览器上的快捷键CTRL+F的功能。 因 为用户的这些特征,导致了程序员认为完美的程序,到了客户的手里,却变成极其难用的软件,投诉电话如乡下骂街的泼妇似的响个不停。而事后分析发现,根本原 因都是应为程序员高估了用户对软件的掌控能力,低估了自己对软件的创造能力,于是导致了他们看这些客户使用他们开发的软件时,都是那样一种可笑的行为,如 下图: 在程序员的眼里,用户是这样使用他们开发的软件的 如果是脾气暴躁的程序员,遇到这种情况,难免会对着客户发一顿牢骚,而且,程序员的脾气一般都不是很好,所以,通常跟客户沟通时,项目经理一般都是跟着一起,以免事态激化。 用户虽然给程序员带来很多麻烦,但其实程序员的所有荣耀感都来自客户,因为只有客户用得满意,程序员才会有成就感。比如像下面这几个客户在使用一个新款软件时显露出来的表情,足够让一个处在北京重度雾霾的下午的程序员也能露出笑容: 用户在使用一款新软件时的样子 程 序员虽然脾气不好,但他们都是为工作着想,不带任何个人恩怨。当开发软件有紧急任务时,他们都是任劳任怨的加班加点,当在已经发布的软件中出现了重大 bug时,他们都会深深在自责,会连夜赶制出紧急修复bug,如果不能在第一时间让用户满意,他们会茶不思、饭不想、觉不睡。即使在实在没有短期内完整的 补救措施的情况下,他们也会想出一些歪招,但也是行之有效的方案,让用户暂时度过难关。比如,下面就是一个紧急修复补丁: 紧急修复补丁 用 户应该体谅程序员。程序员的生活实际处在一种十分矛盾的状态中。编程不像其它行业,比如泥瓦匠砌砖,砌一层砖,墙就会高一次。但编程不一样,有时候一个程 序员写了一天的代码,急得满头大汗,但开发进度未必就有所进展,有时候甚至还会倒退。软件编程是一个亦虚亦实的世界,有时候你搞不清一段代码为什么好用, 有时候也会诧异由那样的代码构成的软件也能跑起来,正如下面这张图片中所示: 软件中有鬼 最后,说一下跟程序员打交道的一些注意事项。程序员因为整天和编程逻辑打交道,所以对因果关系特别敏感。如果你的话语的因果关系不是很明确,这会让他们感到疑惑,如果你的话语的因果关系不完整,这会让他们办错事。如果你的话中有if,最好后面用then做结束,或者用else给出选择,主语要明晰。如果不明晰,就会出现下图中出现的事故: 程序员是这样理解这个指示牌上的话的 如果你是一个程序员,你会理解我说的话。 from:http://www.oschina.net/news/53654/how-client-use-their-software
View Details阿凡达
从09年底上映到现在一直听一些朋友热论此电影,但一直很抵触,所以一直没有完整的看过。 今天晚上看了一遍,真是震撼。直接颠覆我对科幻类电影的感观;因为一直比较喜欢科幻类的电影,自认为对科幻电影的熟悉,却没想到《阿凡达》带给我的影响,她的理念,她的价值观。生态平衡:一切动、植物应该是一个完美的生态系统,当然也包括人类。人类那点小聪明在大自然面前显得是那么的多余;自然不是为人类服务的,人类只是自然的一部分,不要让人类的傲慢毁了自己。 很遗憾的说我看电影大部分都是在网上看,这些影音软件有没有版权就不好说了;所以,以后多带家人去影院观看,和家人交流一下感情,也为曾经拍出自己喜欢电影的导演尽一份力。 同样让我震撼的是这部影片的投入和票房,投入237000000美元,标记27亿5400万。《阿凡达2》将于今年10月开拍,2016年12月上映,翘首以待吧~
View Details纳威语
纳威语是电影《阿凡达》中纳威人的唯一语言体系,拥有非常规范的语法规则和语言结构。2005年8月,时任南加州大学教授的语言学家(Paul R. Frommer)收到一封电子邮件。 语言介绍 信中称希望其为卡梅隆正在摄制的电影中的外星种族创造出一套语言体系。当时卡梅隆为其展示了一个剧本雏形,当中包含有30个左右的纳威语词根,但大多数都是角色名字。保罗在结合了印第安语,非洲,中亚以及高加索等地区的语言后,终于创造出纳威语 创作人:保罗·R·弗洛莫 2语言详情 詹姆斯·卡梅隆(James Cameron)的《阿凡达》(Avatar又译:化身)还有不到一个月的时间就要上映了(国内明年一月初),这部影片讲述了发生在遥远外星球潘多拉(Pandora)上的一个美丽悲壮的“风中奇缘”的故事。为了使影片接近完美,卡梅隆事无巨细的精心打磨每一个细节,他甚至还专门找来语言学家为片中的“纳威人”(Na’vi)创造了一套完整的语言体系。 负责创造“纳威人”语言的是南加州大学教授保罗·R·弗洛莫(Paul R. Frommer),他是一名语言学专家,4年前他接到一封电子邮件,邮件里说他们正在帮詹姆斯·卡梅隆的新电影找一名能够创造外星语言的人,不过那个时候电影还没有名字,用的是代号《Project 880》。弗洛莫知道机会难得,立刻回复了过去,很快便得到了这个任务。 弗洛莫并不是完全凭空创造,卡梅隆给了他一个剧本雏形,里面包含了30多个“纳威语”词汇,虽然大部分都是角色的名字,但这让弗洛莫明白了卡梅隆想要一种什么样的语言(有韵律感、流畅富于感染力)。靠着这一点线索,弗洛莫花了4年时间逐渐摸索创造出了一套有自己语法规则和语言结构的、可以使用的、完整的语言体系。 成型的“纳威语”是一种非常温柔的语言,它吸取了印第安人、非洲、中亚、高加索的语言特点,有的人听了觉得像波利尼西亚语,有的人觉得像非洲的某种语言,还有的人觉得像德语或日语。 “纳威语”不仅将出现在《阿凡达》电影里,还会出现在法国游戏公司为该片制作的同名游戏中。弗洛莫希望《阿凡达》可以拍前传和续集,这样他发明的语言就可以得到更多的展示和使用。另外他也希望将来能有人做一个“潘多拉百科”(Pandora-pedia)详细介绍这种语言,让别人也来学说这种语言,这样他就可以和别人用“纳美语”交谈了,而不是自言自语。 不过学说这种语言并不容易,至少片中饰演3米多高蓝色纳美人“奈特丽”(Neytiri)的佐伊·扎尔达娜(Zoe Saldana)就是这么认为的,她说:“学这个语言太难了,我大部分精力都花在这上面了,我觉得自己根本无法过这一关,我在语言学习方面并不擅长。” 为了帮助演员学说“纳威语”,卡梅隆特意找来了好莱坞著名的语言指导师卡拉·梅耶(Carla Meyer),她参与过《加勒比海盗》(Pirates of the Caribbean)、《天使与魔鬼》(Angels & Demons)、《永不妥协》(Erin Brockovich)等影片,曾帮助过《空军一号》(Air Force One)里的加里·奥德曼(Gary Oldman)学会了东欧口音。有了她之后,语言方面的难关总算被克服了。 目前“纳威语”已经有1000多个词汇,弗洛莫还在不停的扩充“纳威语”的词汇量,并且电影上映后也不会停止,用他的话来说,他要一直做到自己做不了了为止。 创作人:保罗·R·弗洛莫 3基本字母 元音字母 a ā e i ì o u 普通字母 f h k kx l ll m n ng p px r rr s t ts tx v w y z 4基本字音编辑 纳美语字符 国际音标 字面读法 英语范例 a [a] aah "father" ä [æ] ahh "cat", "pack" aw [aw] aou "noun" ay [aj] eye "eye", "fly" ts [c] tSS […]
View Details不小心把所有的快捷方式lnk文件都设置成了用Word打开,该怎么改回来
|
1 2 3 4 5 |
1、点开始,点运行,输入REGEDIT,回车; 2、找到HKEY_CURRENT_USER\Software\Microsoft\Windows\currentVersion\Explorer\fileExts\.lnk,然后删除掉; 3、点开始,点运行,输入“assoc .lnk=lnkfile”,回车,重启,就可以啦; FROM:http://zhidao.baidu.com/link?url=iLUvY1xoo_49Z69p9M3Flf3n7KK9VvEJyP8ZlUAC83MHbd87Qn8zf-TxB7VrcprJXbHb2680Iuv1D3bN1Eo1Oa |
Mac下Photoshop CS6 简体中文版的安装和离线激活
大师版有注册机,但没中文版;单photoshop中文版,没注册机。我整合了一下,找了个可用的序列号,用大师版注册机离线激活。经过测试,已完美激活,可升级!1、下载photoshop单文件简体中文版官方:http://trials2.stage.adobe.com/A … hotoshop_13_LS3.dmg用迅雷下载就可以了2、断网。 确认/etc/hosts没有下面两行: 127.0.0.1 lmlicenses.wip4.adobe.com 127.0.0.1 lm.licenses.adobe.com 如果以前安装过,请删除下面两个目录: /Library/Application Support/Adobe/SLStore /Library/Application Support/Adobe/SLCache3、打开安装文件,选择安装(不是试用!),填入下面的序列号: 1330-1730-0041-7458-1356-16534、装好后打开photoshop,确认链接问题,选择离线激活,生成请求码。5、打开注册机,填入上面的序列号(不能用注册机生成的序列号,那是大师版的)和请求码,生成激活码。6、激活成功。7、在/etc/hosts加入:(或者用管理员运行注册机附带的disable_activation_osx也是一样的) # Adobe Blocker 127.0.0.1 lmlicenses.wip4.adobe.com 127.0.0.1 lm.licenses.adobe.com8、好吧,现在可以联网、升级。9、Enjoy!附:注册机(就是大师版的注册机,我把windows版的文件去除了,已经下载的略过) Crack-OSX FROM:http://bbs.feng.com/read-htm-tid-5011699.html
View DetailsIIS6中配置FastCGI运行PHP
环境说明: 操作系统:使用windows 2003 server 32位系统,IIS6。 PHP版本:官方下载PHP 5.3.26 VC9 x86 Non Thread SafeZIP版本。 IIS6 FastCGI安装包:FastCGI for IIS x86版本。 PHP路径:C:\php-5.3.26\ FastCGI相关文件和路径 : C:\WINDOWS\system32\inetsrv\fcgiext.dll C:\WINDOWS\system32\inetsrv\fcgiext.ini 配置步骤: 解压PHP文件,修改目录名放到C盘。目录地址为C:\php-5.3.26\ 复制php.ini-production改名为php.ini,先参考PHP.ini参数说明修改。 并修改PHP对FastCGI支持: 安装下载的FastCGI for IIS工具,本文下载的文件名为fcgisetup_1.5_rtw_x86.msi。安装完成后无提示,直接打开文件C:\WINDOWS\system32\inetsrv\fcgiext.ini在最后[Types]后添加以下
|
1 2 3 4 5 6 7 8 9 |
[Types] php=PHP [PHP] ExePath=C:\php-5.3.26\php-cgi.exe InstanceMaxRequests=10000 ActivityTimeout=600 RequestTimeout=600 EnvironmentVars=PHP_FCGI_MAX_REQUESTS:10000,PHPRC:C:\php-5.3.26\ |
检查IIS是否配置正确了FastCGI的调用。如下图: from:http://www.magicwinmail.com/setupiis/iis6fastcgi.html
View Details值得收藏的十二条Jquery随身笔记
1、关于页面元素的引用 通过jquery的$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法。 2、jQuery对象与dom对象的转换 只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是jquery对象。 普通的dom对象一般可以通过$()转换成jquery对象。 如:$(document.getElementById("msg"))则为jquery对象,可以使用jquery的方法。 由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。 如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。 以下几种写法都是正确的: $("#msg").html(); $("#msg")[0].innerHTML; $("#msg").eq(0)[0].innerHTML; $("#msg").get(0).innerHTML; 3、如何获取jQuery集合的某一项 对于获取的元素集合,获取其中的某一项(通过索引指定)可以使用eq或get(n)方法或者索引号获取,要注意,eq返回的是jquery对象,而get(n)和索引返回的是dom元素对象。对于jquery对象只能使用jquery的方法,而dom对象只能使用dom的方法,如要获取第三个<div>元素的内容。 有如下两种方法: $("div").eq(2).html(); //调用jquery对象的方法 $("div").get(2).innerHTML; //调用dom的方法属性 4、同一函数实现set和get Jquery中的很多方法都是如此,主要包括如下几个: $("#msg").html(); //返回id为msg的元素节点的html内容。 $("#msg").html("<b>new content</b>"); //将“<b>new content</b>” 作为html串写入id为msg的元素节点内容中,页面显示b加粗的new content $("#msg").text(); //返回id为msg的元素节点的文本内容。 $("#msg").text("<b>new content</b>"); //将“<b>new content</b>” 作为普通文本串写入id为msg的元素节点内容中,页面显示<b>new content</b> $("#msg").height(); //返回id为msg的元素的高度 $("#msg").height("300"); //将id为msg的元素的css高度设为300 $("#msg").width(); //返回id为msg的元素的css宽度 $("#msg").width("300"); //将id为msg的元素的宽度设为300 $("input").val("); //返回表单输入框的value值 $("input").val("test"); //将表单输入框的value值设为test $("#msg").click(); //触发id为msg的元素的单击事件 $("#msg").click(fn); //为id为msg的元素单击事件添加函数 同样blur,focus,select,submit事件都可以有着两种调用方法 5、集合处理功能 对于jquery返回的集合内容无需我们自己循环遍历并对每个对象分别做处理,jquery已经为我们提供的很方便的方法进行集合的处理。 包括两种形式: $("p").each(function(i){this.style.color=['#f00′,’#0f0′,’#00f'][ i ]}) //为索引分别为0,1,2的p元素分别设定不同的字体颜色。 $("tr").each(function(i){this.style.backgroundColor=['#ccc',’#fff'][i%2]}) //实现表格的隔行换色效果 $("p").click(function(){alert($(this).html())}) //为每个p元素增加了click事件,单击某个p元素则弹出其内容 6、扩展我们需要的功能 $.extend({min: function(a, b){return a < b?a:b; }, max: function(a, b){return a > b?a:b; } }); //为jquery扩展了min,max两个方法使用扩展的方法(通过“$.方法名”调用): alert("a=10,b=20,max="+$.max(10,20)+",min="+$.min(10,20)); 7、支持方法的连写 所谓连写,即可以对一个jquery对象连续调用各种不同的方法。 例如: $("p").click(function(){alert($(this).html())}) […]
View Detailsarray_slice() 函数
定义和用法 array_slice() 函数在数组中根据条件取出一段值,并返回。 注释:如果数组有字符串键,所返回的数组将保留键名。(参见例子 4) 语法
|
1 |
array_slice(<i>array</i>,<i>offset</i>,<i>length</i>,<i>preserve</i>) |
参数 描述 array 必需。规定输入的数组。 offset 必需。数值。规定取出元素的开始位置。 如果是正数,则从前往后开始取,如果是负值,从后向前取 offset 绝对值。 length 可选。数值。规定被返回数组的长度。 如果 length 为正,则返回该数量的元素。 如果 length 为负,则序列将终止在距离数组末端这么远的地方。 如果省略,则序列将从 offset 开始直到 array 的末端。 preserve 可选。可能的值: true – 保留键 false – 默认 – 重置键 例子 1
|
1 2 3 4 |
<?php $a=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird"); print_r(array_slice($a,1,2)); ?> |
输出:
|
1 |
Array ( [0] => Cat [1] => Horse ) |
例子 2 带有负的 offset 参数:
|
1 2 3 4 |
<?php $a=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird"); print_r(array_slice($a,-2,1)); ?> |
输出:
|
1 |
Array ( [0] => Horse ) |
例子 3 preserve 参数设置为 true:
|
1 2 3 4 |
<?php $a=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird"); print_r(array_slice($a,1,2,true)); ?> |
输出:
|
1 |
Array ( [1] => Cat [2] => Horse ) |
例子 4 带有字符串键:
|
1 2 3 4 |
<?php $a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse","d"=>"Bird"); print_r(array_slice($a,1,2)); ?> |
输出:
|
1 |
Array ( [b] => Cat [c] => Horse ) |
C#集合类Queue
队列(Queue)在程序设计中扮演着重要的角色,因为它可以模拟队列的数据操作。例 如,排队买票就是一个队列操作,新来的人排在后面,先来的人排在前面,并且买票请求 先被处理。为了模拟队列的操作,Queue在ArrayList的基础上加入了以下限制: · 元素采用先入先出机制(FIFO,First In First Out),即先进入队列的元素必须先离 开队列。最先进入的元素称为队头元素。 · 元素只能被添加到队尾(称为入队),不允许在中间的某个位置插入。也就是说, 不支持ArrayList中的Insert方法。 · 只有队头的元素才能被删除(称为出队),不允许直接对队列中的非队头元素进行 删除,从而保证FIFO机制。也就是说,不支持ArrayList中的Remove方法。 · 不允许直接对队列中非队头元素进行访问。也就是说,不支持ArrayList中的索引访 问,只允许遍历访问。 下面的实例展示了如何创建Queue对象,并向Queue对象中入队数据、出队数据、遍历 数据。 创建TestQueue类,在TestQueue.cs中输入如下代码: using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace Chapter12 { class TestQueue { static void Print(Queue list) { Console.Write("队列内容:"); foreach (string str in list) System.Console.Write(str + " "); } static void Main(string[] args) { Queue list = new Queue(); //Add elements Console.WriteLine("输入字符串添加到队列(#号结束):"); string str; do { str = Console.ReadLine(); if (str == "#") break; else { list.Enqueue(str); } } while (true); TestQueue.Print(list); Console.WriteLine(); //Remove elements Console.WriteLine("出队字符串:"); while (list.Count != 0) […]
View Detailsvolatile(C# 参考)
volatile 关键字指示一个字段可以由多个同时执行的线程修改。 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。 volatile 修饰符通常用于由多个线程访问但不使用 lock 语句对访问进行序列化的字段。 volatile 关键字可应用于以下类型的字段: 引用类型。 指针类型(在不安全的上下文中)。 请注意,虽然指针本身可以是可变的,但是它指向的对象不能是可变的。 换句话说,您无法声明“指向可变对象的指针”。 类型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。 具有以下基类型之一的枚举类型:byte、sbyte、short、ushort、int 或 uint。 已知为引用类型的泛型类型参数。 IntPtr 和 UIntPtr。 可变关键字仅可应用于类或结构字段。 不能将局部变量声明为 volatile。 示例 下面的示例说明如何将公共字段变量声明为 volatile。 C#
|
1 2 3 4 5 6 7 8 9 |
<span style="color: blue;">class</span> VolatileTest { <span style="color: blue;">public</span> <span style="color: blue;">volatile</span> <span style="color: blue;">int</span> i; <span style="color: blue;">public</span> <span style="color: blue;">void</span> Test(<span style="color: blue;">int</span> _i) { i = _i; } } |
下面的示例演示如何创建辅助线程,并用它与主线程并行执行处理。 有关多线程处理的背景信息,请参见托管线程处理和线程处理(C# 和 Visual Basic)。 C#
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<span style="color: blue;">using</span> System; <span style="color: blue;">using</span> System.Threading; <span style="color: blue;">public</span> <span style="color: blue;">class</span> Worker { <span style="color: green;">// This method is called when the thread is started.</span> <span style="color: blue;">public</span> <span style="color: blue;">void</span> DoWork() { <span style="color: blue;">while</span> (!_shouldStop) { Console.WriteLine(<span style="color: #a31515;">"Worker thread: working..."</span>); } Console.WriteLine(<span style="color: #a31515;">"Worker thread: terminating gracefully."</span>); } <span style="color: blue;">public</span> <span style="color: blue;">void</span> RequestStop() { _shouldStop = <span style="color: blue;">true</span>; } <span style="color: green;">// Keyword volatile is used as a hint to the compiler that this data</span> <span style="color: green;">// member is accessed by multiple threads.</span> <span style="color: blue;">private</span> <span style="color: blue;">volatile</span> <span style="color: blue;">bool</span> _shouldStop; } <span style="color: blue;">public</span> <span style="color: blue;">class</span> WorkerThreadExample { <span style="color: blue;">static</span> <span style="color: blue;">void</span> Main() { <span style="color: green;">// Create the worker thread object. This does not start the thread.</span> Worker workerObject = <span style="color: blue;">new</span> Worker(); Thread workerThread = <span style="color: blue;">new</span> Thread(workerObject.DoWork); <span style="color: green;">// Start the worker thread.</span> workerThread.Start(); Console.WriteLine(<span style="color: #a31515;">"Main thread: starting worker thread..."</span>); <span style="color: green;">// Loop until the worker thread activates.</span> <span style="color: blue;">while</span> (!workerThread.IsAlive) ; <span style="color: green;">// Put the main thread to sleep for 1 millisecond to</span> <span style="color: green;">// allow the worker thread to do some work.</span> Thread.Sleep(1); <span style="color: green;">// Request that the worker thread stop itself.</span> workerObject.RequestStop(); <span style="color: green;">// Use the Thread.Join method to block the current thread </span> <span style="color: green;">// until the object's thread terminates.</span> workerThread.Join(); Console.WriteLine(<span style="color: #a31515;">"Main thread: worker thread has terminated."</span>); } <span style="color: green;">// Sample output:</span> <span style="color: green;">// Main thread: starting worker thread...</span> <span style="color: green;">// Worker thread: working...</span> <span style="color: green;">// Worker thread: working...</span> <span style="color: green;">// Worker thread: working...</span> <span style="color: green;">// Worker thread: working...</span> <span style="color: green;">// Worker thread: working...</span> <span style="color: green;">// Worker thread: working...</span> <span style="color: green;">// Worker thread: terminating gracefully.</span> <span style="color: green;">// Main thread: worker thread has terminated.</span> } from:http://msdn.microsoft.com/zh-cn/library/x13ttww7.aspx |