分类目录归档:杂七杂八

程序员玩的游戏


程序员在忙完一天的工作(编码)以后,适当的放松一下自己,玩玩游戏,锻炼身体等等。下面我给大家推荐一些程序员玩的游戏。希望大家可以放松心情。

加入IT江湖官方群:383126909,学习更多,共同发展 或者关注IT江湖微信公众号。

Robocode

程序员玩的游戏 - 第1张  | IT江湖

这款游戏相信很多程序员都知道。游戏主页:http://robocode.sourceforge.net/ 

Robocode是2001年7月在美国IBM 的Web alphaWorks上发布的坦克机器人战斗仿真引擎。与通常玩的游戏不同的是:参赛者必须利用对机器人进行编程,给机器人设计智能来自动指挥它,而不是由键盘、鼠标简单地直接控制。

Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其他机器人互相对抗的机器人。你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。机器人配有雷达与火炮,选手在躲避对手进攻的同时攻击对手,以此来较量得分的多少。Robocode可以让你在娱乐的同时学习与提高Java技术.

游戏视频

Hack Run、Hack Run Zero、Hack Time 

程序员玩的游戏 - 第2张  | IT江湖

游戏官网:http://hackthegame.com/ 

黑客入侵解谜游戏系列!你将化身为强大的黑客,接受各种任务,譬如入侵别人的邮箱账号窃取重要信息、破解密码等。游戏以类似DOS界面的命令行方式进行,看上去很酷很高技术,实际上玩家只需输入一些基础简单的指令即可一步步解开谜团……

目前这个黑客解谜游戏系列已经推出了 Hack Run、Hack Run Zero 以及 Hack Time 共3款作品,游玩顺序应该也是这样了。游戏的难度其实并不是很高,开始的前面几关基本上是相当于教学关,逐渐展开游戏的剧情。虽然游戏界面看起来很像编程写代码的界面或者说是命令行终端,很酷很黑客Feel,但游戏的命令操作并不繁琐,实际上并不需要太多真正的电脑技术即可进行。

Hack Run、Hack Run Zero 以及 Hack Time 这三款游戏均提供了 iOS 和 Mac 版本

Uplink

英国Introversion Software出的一个游戏也叫uplink,在游戏中你将要扮演一个神通广大的黑客,在网络上接受任务,然后破解世界各地的电脑系统。虽然现实中的黑客并非都是如此简单的,但也可以让你领略到做黑客的滋味。

程序员玩的游戏 - 第3张  | IT江湖  程序员玩的游戏 - 第4张  | IT江湖

游戏里不需要你懂得太多的专业知识,反而会教你许多东西,只要你英语过得去。你是作为UPLINK的一个黑客,注册了以后你会得到一笔初始的资金和初始的软硬件。如果你熟悉黑客的知识,你可以自己去做,如果不会的话,会有一个教学模式一步一步的教你。然后你的等级会上升,你就可以正式在UPLINK的SERVER上联系客户,接取工作,完成工作就会获得回报(当然是钱啦)等级越高,任务的难度就会越高。在SERVER里,你还可以买到更厉害的软件和硬件,让你容易完成任务。

CodeTank

Javascript程序员在线编程游戏 游戏地址:http://codetank.alloyteam.com/ 

程序员玩的游戏 - 第5张  | IT江湖

CodeTank 将会带你进入一个神奇而充满挑战的代码机器人的世界!

CodeTank{代码坦克}是全世界首个Javascript程序员的在线编程对战游戏,是由 腾讯 AlloyTeam 和 HTML5 梦工场联合出品的在线坦克仿真游戏平台,CodeTank 采用 HTML5、Javascript、CSS3、NodeJS、MongoDB 等全新 Web 技术来构建一个基于互联网的在线智能坦克机器人战斗仿真引擎(所以需要支持HTML5的浏览器来运行)。

{编程游戏}也叫{代码游戏},有许多软件是基于这种思想的,著名的 Robocode 就是来源于机器人大战Robot Battle 这款软件。Robocode是2001年7月在美国IBM 的Web alphaWorks上发布的坦克机器人战斗仿真引擎。不过随时互联网的飞速发展,Robocode 已经开始变得落后。所以,现在有了Javascript语言的基于互联网的在线编程对战游戏——CodeTank 代码坦克!

相信每一个男人的内心深处,都有一份对坦克的特殊情结,而用Javascript代码来直接控制坦克进行战斗更是会让广大程序员热血沸腾的事情!

ok,程序员们适当的放松一下自己吧。下面还有一款游戏,你懂的

转自:http://www.itjhwd.com/cxygame/

前端冷知识集锦


前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前端技能,一些属于技巧,一些则是闻所未闻的冷知识,一时间还消化不过来。现分类整理出来分享给大家,也补充了一些平时的积累和扩展了一些内容。

HTML篇

浏览器地址栏运行JavaScript代码

这个很多人应该还是知道的,在浏览器地址栏可以直接运行JavaScript代码,做法是以javascript:开头后跟要执行的语句。比如:

javascript:alert('hello from address bar :)');

将以上代码贴到浏览器地址栏回车后alert正常执行,一个弹窗神现。

需要注意的是如果是通过copy paste代码到浏览器地址栏的话,IE及Chrome会自动去掉代码开头的javascript:,所以需要手动添加起来才能正确执行,而Firefox中虽然不会自动去掉,但它根本就不支持在地址栏运行JS代码,sigh~

这一技术在我的另一篇博文《让Chrome 接管邮件连接,收发邮件更方便了》中有使用到,利用在浏览器地址栏中执行JavaScript代码将Gmail设置为系统的邮件接管程序。

浏览器地址栏运行HTML代码

如果说上面那条小秘密知道的人还算多的话,这条秘笈知道的人就要少一些了,在非IE内核的浏览器地址栏可以直接运行HTML代码!

比如在地址栏输入以下代码然后回车运行,会出现指定的页面内容。

data:text/html,<h1>Hello, world!</h1>

 

你造么,可以把浏览器当编辑器

还是浏览器地址栏上做文章,将以下代码贴到地址栏运行后浏览器变成了一个原始而简单的编辑器,与Windows自带的notepad一样,吼吼。

data:text/html, <html contenteditable>

 

归根结底多亏了HTML5中新加的contenteditable属性,当元素指定了该属性后,元素的内容成为可编辑状态。

推而广之,将以下代码放到console执行后,整个页面将变得可编辑,随意践踏吧~

document.body.contentEditable='true';

 

 

利用a标签自动解析URL

很多时候我们有从一个URL中提取域名,查询关键字,变量参数值等的需要,而万万没想到可以让浏览器方便地帮我们完成这一任务而不用我们写正则去抓取。方法就在JS代码里先创建一个a标签然后将需要解析的URL赋值给ahref属性,然后就得到了一切我们想要的了。

var a = document.createElement('a');
 a.href = 'http://www.cnblogs.com/wayou/p/';
 console.log(a.host);

利用这一原理,稍微扩展一下,就得到了一个更加健壮的解析URL各部分的通用方法了。下面代码来自James的博客

function parseURL(url) {
    var a =  document.createElement('a');
    a.href = url;
    return {
        source: url,
        protocol: a.protocol.replace(':',''),
        host: a.hostname,
        port: a.port,
        query: a.search,
        params: (function(){
            var ret = {},
                seg = a.search.replace(/^?/,'').split('&'),
                len = seg.length, i = 0, s;
            for (;i<len;i++) {
                if (!seg[i]) { continue; }
                s = seg[i].split('=');
                ret[s[0]] = s[1];
            }
            return ret;
        })(),
        file: (a.pathname.match(//([^/?#]+)$/i) || [,''])[1],
        hash: a.hash.replace('#',''),
        path: a.pathname.replace(/^([^/])/,'/$1'),
        relative: (a.href.match(/tps?://[^/]+(.+)/) || [,''])[1],
        segments: a.pathname.replace(/^//,'').split('/')
    };
}

页面拥有ID的元素会创建全局变量

在一张HTML页面中,所有设置了ID属性的元素会在JavaScript的执行环境中创建对应的全局变量,这意味着document.getElementById像人的阑尾一样显得多余了。但实际项目中最好老老实实该怎么写就怎么写,毕竟常规代码出乱子的机会要小得多。

<div id="sample"></div>
<script type="text/javascript">
        console.log(sample);
</script>

加载CDN文件时,可以省掉HTTP标识

现在很流行的CDN即从专门的服务器加载一些通用的JS和CSS文件,出于安全考虑有的CDN服务器使用HTTPS方式连接,而有的是传统的HTTP,其实我们在使用时可以忽略掉这个,将它从URL中省去。

<script src="//domain.com/path/to/script.js"></script>

 这一点在之前一篇译文博客《jQuery编程最佳实践》中也有提到。

利用script标签保存任意信息

将script标签设置为type=’text’然后可以在里面保存任意信息,之后可以在JavaScript代码中很方便地获取。

<script type="text" id="template">
	<h1>This won't display</h1>
</script>

 

var text = document.getElementById('template').innerHTML

CSS篇

关于CSS的恶作剧

相信你看完以下代码后能够预料到会出现什么效果。

*{
    cursor: none!important;
}

简单的文字模糊效果

以下两行简单的CSS3代码可达到将文字模糊化处理的目的,出来的效果有点像使用PS的滤镜,so cool!

p {
    color: transparent;
    text-shadow: #111 0 0 5px;
}

 

 

垂直居中

有好多次博主都有这样的需求,垂直居中显示某个DIV,我们知道CSS中天然有水平居中的样式text-align:center。唯独这个垂直居中无解。

当然你可以将容器设置为display:table,然后将子元素也就是要垂直居中显示的元素设置为display:table-cell,然后加上vertical-align:middle来实现,但此种实现往往会因为display:table而破坏整体布局,那还不如直接用table标签了呢。

下面这个样式利用了translate来巧妙实现了垂直居中样式,需IE9+。

.center-vertical {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}

相比而言,水平居中要简单得多,像上面提到的text-align:center,经常用到的技巧还有margin:0 auto。但对于margin大法也只在子元素宽度小于容器宽度时管用,当子元素宽度大于容器宽度时此法失效。

如法炮制,利用lefttransform同样可实现水平居中,不过意义不大,毕竟text-alignmargin差不多满足需求了。

.center-horizontal {
    position: relative;
    left: 50%;
    transform: translateX(-50%); 
}

 

多重边框

利用重复指定box-shadow来达到多个边框的效果

在线演示    

/*CSS Border with Box-Shadow Example*/
div {
    box-shadow: 0 0 0 6px rgba(0, 0, 0, 0.2), 0 0 0 12px rgba(0, 0, 0, 0.2), 0 0 0 18px rgba(0, 0, 0, 0.2), 0 0 0 24px rgba(0, 0, 0, 0.2);
    height: 200px;
    margin: 50px auto;
    width: 400px
}

 

实时编辑CSS

通过设置style标签的display:block样式可以让页面的style标签显示出来,并且加上contentEditable属性后可以让样式成为可编辑状态,更改后的样式效果也是实时更新呈现的。此技巧在IE下无效。拥有此技能者,逆天也!

<!DOCTYPE html>
<html>
    <body>
        <style style="display:block" contentEditable>
        	body { color: blue }
        </style>
    </body>
</html>

 

创建长宽比固定的元素

通过设置父级窗口的padding-bottom可以达到让容器保持一定的长度比的目的,这在响应式页面设计中比较有用,能够保持元素不变形。

<div style="width: 100%; position: relative; padding-bottom: 20%;">
    <div style="position: absolute; left: 0; top: 0; right: 0; bottom: 0;background-color:yellow;">
        this content will have a constant aspect ratio that varies based on the width.
    </div>
</div>

 

CSS中也可以做简单运算

通过CSS中的calc方法可以进行一些简单的运算,从而达到动态指定元素样式的目的。

.container{
	background-position: calc(100% - 50px) calc(100% - 20px);
}

 

JavaScript篇

生成随机字符串

利用Math.randomtoString生成随机字符串,来自前一阵子看到的一篇博文。这里的技巧是利用了toString方法可以接收一个基数作为参数的原理,这个基数从2到36封顶。如果不指定,默认基数是10进制。略屌!
   

function generateRandomAlphaNum(len) {
    var rdmString = "";
    for (; rdmString.length < len; rdmString += Math.random().toString(36).substr(2));
    return rdmString.substr(0, len);
}

 

整数的操作

JavaScript中是没有整型概念的,但利用好位操作符可以轻松处理,同时获得效率上的提升。

|0~~是很好的一个例子,使用这两者可以将浮点转成整型且效率方面要比同类的parseInt,Math.round 要快。在处理像素及动画位移等效果的时候会很有用。性能比较见此

var foo = (12.4 / 4.13) | 0;//结果为3
var bar = ~~(12.4 / 4.13);//结果为3

 顺便说句,!!将一个值方便快速转化为布尔值
!!window===true

 

重写原生浏览器方法以实现新功能

下载的代码通过重写浏览器的alert让它可以记录弹窗的次数。

(function() {
    var oldAlert = window.alert,
        count = 0;
    window.alert = function(a) {
        count++;
        oldAlert(a + "n You've called alert " + count + " times now. Stop, it's evil!");
    };
})();
alert("Hello World");

 

关于console的恶作剧

关于重写原生方法,这里有个恶作剧大家可以拿去寻开心。Chrome的console.log是支持对文字添加样式的,甚至log图片都可以。于是可以重写掉默认的log方法,把将要log的文字应用到CSS的模糊效果,这样当有人试图调用console.log()的时候,出来的是模糊不清的文字。好冷,我表示没有笑。

是从这篇G+帖子的评论里看到的。使用之后的效果是再次调用log会输出字迹模糊不清的文字。

var _log = console.log;
console.log = function() {
  _log.call(console, '%c' + [].slice.call(arguments).join(' '), 'color:transparent;text-shadow:0 0 2px rgba(0,0,0,.5);');
};

 

不声明第三个变量的值交换

我们都知道交换两个变量值的常规做法,那就是声明一个中间变量来暂存。但鲜有人去挑战不声明中间变量的情况,下面的代码给出了这种实现。蛮有创意 的。

var a=1,b=2;a=[b,b=a][0];

 

万物皆对象

在JavaScript的世界,万物皆对象。除了nullundefined,其他基本类型数字,字符串和布尔值都有对应有包装对象。对象的一个特征是你可以在它身上直接调用方法。对于数字基本类型,当试图在其身上调用toString方法会失败,但用括号括起来后再调用就不会失败了,内部实现是用相应的包装对象将基本类型转为对象。所以(1).toString()相当于new
Number(1).toString()
。因此,你的确可以把基本类型数字,字符串,布尔等当对象使用的,只是注意语法要得体。

同时我们注意到,JavaScript中数字是不分浮点和整形的,所有数字其实均是浮点类型,只是把小数点省略了而以,比如你看到的1可以写成1.,这也就是为什么当你试图1.toString()时会报错,所以正确的写法应该是这样:1..toString(),或者如上面所述加上括号,这里括号的作用是纠正JS解析器,不要把1后面的点当成小数点。内部实现如上面所述,是将1.用包装对象转成对象再调用方法。

If语句的变形

当你需要写一个if语句的时候,不妨尝试另一种更简便的方法,用JavaScript中的逻辑操作符来代替。

var day=(new Date).getDay()===0;
//传统if语句
if (day) {
	alert('Today is Sunday!');
};
//运用逻辑与代替if
day&&alert('Today is Sunday!');

比如上面的代码,首先得到今天的日期,如果是星期天,则弹窗,否则什么也不做。我们知道逻辑操作存在短路的情况,对于逻辑与表达式,只有两者都真才结果才为真,如果前面的day变量被判断为假了,那么对于整个与表达式来说结果就是假,所以就不会继续去执行后面的alert了,如果前面day为真,则还要继续执行后面的代码来确定整个表达式的真假。利用这点达到了if的效果。

对于传统的if语句,如果执行体代码超过了1 条语句,则需要加花括号,而利用逗号表达式,可以执行任意条代码而不用加花括号。

if(conditoin) alert(1),alert(2),console.log(3);

上面if语句中,如果条件成立则执行三个操作,但我们不需要用花括号将这三句代码括起来。当然,这是不推荐的,这里是冷知识课堂:)

 

禁止别人以iframe加载你的页面

下面的代码已经不言自明了,没什么好多说的。

if (window.location != window.parent.location) window.parent.location = window.location;

 

console.table

Chrome专属,IE绕道的console方法。可以将JavaScript关联数组以表格形式输出到浏览器console,效果很惊赞,界面很美观。

//采购情况
var data = [{'品名': '杜雷斯', '数量': 4}, {'品名': '冈本', '数量': 3}];
console.table(data);

 

REFERENCE

Feel free to repost but keep the link to this page please!


本文链接:http://www.cnblogs.com/Wayou/p/things_you_dont_know_about_frontend.html#2915338

如何计算程序员自身的价值


转自:http://www.educity.cn/career/case/201003261410161142.htm

    “价值”这个词,很正式,俗一点就是一个“钱”字。可以说这个字是当今社会的一个核心。无论经济活动、社会活动那个能离开这个字呀!“人为财死,鸟为食亡。”可能是人生的一个真实的写照吧!

    回到现实生活之中,我们常常听到程序员抱怨自己的工资很低,抱怨自己的付出和自己的报酬严重背离,有的甚至不考虑自己工作能力和工作贡献,以别人的工资或社会岗位工资来确定自己的报酬。同时我们也常常听到公司的老板的抱怨软件公司不赚钱,最大的成本都花在员工的工资上了,自己在给员工打工。那么我们怎么能够计算程序员自身的价值呢?我们怎么看待程序员价值值与不值呢?我感到程序员自身价值有两个方面,一个方面是程序员的收入价值,一方面是程序员市场价值。程序员收入价值比较简单,就是程序员的年收入。例如一个程序员的年收入是5万。则这个程序员收入价值就是5万。程序员市场价值是指程序员本人编制的软件产品销售价值和预期的销售价值。例如,有5个程序员一年之中为一个客户编制了一个软件,软件售价5万元,假定我们忽略了销售成本和维护成本等,5个程序员水平大致相同,则一个程序员的市场价值就是1万。

    程序员的收入和程序员市场价值往往是不相同的:

    1)当大学生刚刚参加工作的时候,由于能力的限制,很少能编好程序,大部分时间都花在学习上,但是,他还是获得工资报酬。但是他的市场价值为0。这个时候,程序员是正收入。

    2)当程序员具备编程能力,投入到编程工作之中,程序员不但获得工资报酬,其劳动成果也变成的公司的收入。假定公司能收支平衡,而且分配比较合理,那么程序员收入价值于程序员的市场价值相当。

    3)当程序员具备较强的编程能力,投入到编程工作之中,程序员不但获得工资报酬,其劳动成果也变成公司的收入。假定公司产生利润,而且分配比较合理,那么程序员的收入价值就会低于程序员市场价值,其差价就是程序员给公司的利润贡献。

    4)当公司出现亏损的时候,程序员收入价值就会大于程序员的市场价值。

    通过以上分析我们可以看出,程序员的市场价值是程序员收入价值的基础,当程序员收入价值远远低于其市场价值的时候,程序员就会感到收入太少,分配不公,不愿意在公司长期呆下去。当程序员收入价值高于或等于其市场价值时候,公司老板只能维持或靠吃老本来维系公司的运作,维持不下去公司只好倒闭。另外,程序员的市场价值要小于公司的软件销售收入。

    就目前的中国软件企业运行状况而言,中国软件业早已告别了暴利时代,残酷的竞争使得软件的公司利润趋于下降。有的软件公司在竞争中倒闭,大部分在维持中维持。究其原因很多,但是大部分软件公司都是靠开发项目来维持生计。而项目都是靠用户需求来驱动的,因此,开发出来的软件往往是定制的,不可复用。一些好的软件公司,往往在一个行业中积累了大量的行业知识和软件开发的程序。通过程序积累系统积累,形成了行业系统的开发工具和通用软件。使得程序的复用性大大增强,逐步形成了行业软件的优势,这样公司发展很好。

    无论从程序员个人的收入价值或市场价值,还是软件公司的运行状况来看。其核心是软件本身的市场价值。如果一个软件市场价值很高,则程序员的市场价值就会很高,公司的利润就会很高。一个软件市场价值往往取决于这个软件的复用性或商品化程度。假定一个软件销售价格为1万,预期的销售个数达1000个时,其市场价值就会达1000万,假定这个软件是由5个人开发的,相关销售、维护、管理费用不计,则一个程序员的市场价值就会达200万,尽管这个程序员年收入只有5万。但是程序员的市场价值是很高的。有了高的市场价值,就有了增加工资、奖金报酬的基础,就会有增加收入的希望。一般开明的公司都会根据程序员的市场价值的大小来,来定义程序员报酬的。只有这样公司才能留住人才,才能获得更大的利润。

另外一种情况,当一个程序员的市场价值达到一定数值的时候,如50万、100万的时候,而收入价值处在较低的水平,例如,5万,6万,程序员往往会产生单干的念头,以期获取更大的收入价值。但是,程序员往往会忘记市场价值的实现并不仅仅在于软件本身,还涉及到资金、资质、市场、销售、安装、维护、服务等各种环节。所以个人开软件公司人数挺多的,但是成功的并不占多数。好的程序员往往不是好的老板,就是这个道理。

    现实当中,大学生程序员年收入在2万元比比皆是,普通程序员年收入在4-5万居多,高级程序员在10万以上也不在少数,超过20万年收入的程序员也时有耳闻。

    如果我们平均一下程序员的年收入,估计在5万左右。假定公司的利润率为50%,全部由程序员贡献,那么程序员的市场价值也就在7-8万之间。这就意味着程序员一生(35年计)市场价值也就280万。这与比尔盖茨巨大财富相比是多么的渺小呀!这同时意味着中国程序员市场价值有很大的增长空间。

    认识程序员的自身价值的目的。

    第一,就是希望程序员不要单看自己的收入价值,不要埋怨自己的收入低,而是要更多看看自己的市场价值到底有多高。

    第二,市场价值就是编制满足用户需求的软件,如果这个软件销售不出去,程序员再辛苦都白费,市场价值为0。程序员应该争做具有市场价值的软件,同时尽力帮助软件实现销售。

    第三,市场价值最大化就是多编制可复用的程序,以提高单个软件开发效率,以降低人力成本,提高利润率。

    第四,市场价值最大化就是多编制商品化软件,在编制定制软件还是通用软件选择中,它可以成倍地提高程序员的市场化价值。

    第五,有了程序员市场化价值认识后,程序员和公司可以共同地为促进市场化价值作出贡献,并到达员工提高收入,公司提高利润的双赢局面。

    中国的程序员市场化价值相对较低,导致程序员收入不高,程序员技术水平降低,最终导致软件质量下降。我们要关注程序员市场价值的提高,技术水平的提高,使得软件行业通用能软件所占的比重大大增加,软件公司的收入大大增加,只有这样我们的程序员的收入大大增加,我们的软件才有更高的质量和更大的市场。


每个程序员都应该知道的论文和文章


转自:http://geek.csdn.net/news/detail/1566

http://projectmona.com/bits-of-brilliance-session-five/


里面内容很杂但很丰富,是UIUC教授Jeff Erickson在编程方面的个人收集(其他收集可以参见:http://projectmona.com/bits-of-brilliance/ 包括费曼、尼采和特斯拉等等)。


其中比较有价值的有:

算法笔记:http://compgeom.cs.uiuc.edu/~jeffe/teaching/algorithms/

每个程序员应该知道的100个Vim命令:http://www.catswhocode.com/blog/100-vim-commands-every-programmer-should-know

Addy Osmani的JavaScript设计模式(电子书):http://addyosmani.com/resources/essentialjsdesignpatterns/book/

Practicing Ruby(每月订阅的编程课程):https://practicingruby.com/

每个程序员都应该了解的Unicode与字符集常识:http://www.joelonsoftware.com/articles/Unicode.html (另外可以参见阮一峰的博客:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html


类型理论与函数式编程(PDF电子书):http://www.cs.kent.ac.uk/people/staff/sjt/TTFP/ttfp.pdf


类似标题的文章见过不少,虽然都有些标题党,但其中总也能给出一些有价值的资料汇编。

Hacker News上的讨论(https://news.ycombinator.com/item?id=5962933 )里大家正好把类似的文章都汇集了一下。稍后我们整理出一个靠谱的列表来。