情人节html5玫瑰花源码

情人节html5玫瑰花源码

玫瑰花

玫瑰花

<html>
<head></head>
<body>
<iframe width="1200px" scrolling="no" height="820px" frameborder="0" noresize="noresize" src="javascript:'
<!doctype html>n<html>nt<head>ntt<title>JS1k, 1k demo submission [1022]</title>ntt<meta charset=&quot;utf-8&quot;
/>nt</head>nt<body>ntt<canvas id=&quot;c&quot;></canvas>ntt<script>ntttvar b =
document.body;ntttvar c = document.getElementsByTagName('canvas')[0];ntttvar a = c.getContext
('2d');ntttdocument.body.clientWidth; // fix bug in webkit: http://qfox.nl/weblog/218
ntt</script>ntt<script>n// start of submission //nwith(m=Math)
C=cos,S=sin,P=pow,R=random;c.width=c.height=f=500;h=-250;function p(a,b,c){if(c>60)return[S(a*7)*(13+5/(.2+P
(b*4,4)))-S(b)*50,b*f+50,625+C(a*7)*(13+5/(.2+P(b*4,4)))+b*400,a*1-b/2,a];A=a*2-1;B=b*2-1;if(A*A+B*B<1){if(c>37){n=
(j=c&1)%3F6:4;o=.5/(a+.01)+C(b*125)*3-a*300;w=b*h;return[o*C(n)+w*S(n)+j*610-390,o*S(n)-w*C(n)+550-j*350,1180+C
(B+A)*99-j*300,.4-a*.1+P(1-B*B,-h*6)*.15-a*b*.4+C(a+b)/5+P(C((o*(a+1)+(B>0%3Fw:-w))/25),30)*.1*(1-B*B),o/1e3+.7-
o*w*3e-6]}if(c>32){c=c*1.16-.15;o=a*45-20;w=b*b*h;z=o*S(c)+w*C(c)+620;return[o*C(c)-w*S(c),28+C(B*.5)*99-b*b*b*60-
z/2-h,z,(b*b*.3+P((1-(A*A)),7)*.15+.3)*b,b*.7]}o=A*(2-b)*(80-c*2);w=99-C(A)*120-C(b)*(-h-c*4.9)+C(P(1-b,7))
*50+c*2;z=o*S(c)+w*C(c)+700;return[o*C(c)-w*S(c),B*99-C(P(b, 7))*50-c/3-z/1.35+450,z,(1-b/1.2)*.9+a*.1, P((1-
b),20)/4+.05]}}setInterval('for(i=0;i<1e4;i++)if(s=p(R(),R(),i%2546/.74)){z=s[2];x=~~(s[0]*f/z-h);y=~~(s[1]*f/z-
h);if(!m[q=y*f+x]|m[q]>z)m[q]=z,a.fillStyle=&quot;rgb(&quot;+~(s[3]*h)+&quot;,&quot;+~(s[4]*h)+&quot;,&quot;+~(s[3]
*s[3]*-80)+&quot;)&quot;,a.fillRect(x,y,1,1)}',0)n// end of submission //
ntt</script>nt</body>n</html>'"></iframe>
</body>
</html>

Hadoop和云计算的关系

Hadoop组件

Hadoop组件


Hadoop主要是由HDFS和MapReduce组成,HDFS是一个分布式文件系统(Hadoop Distributed File System),MapReduce则是用于并行处理大数据集的软件框架。因此,Hadoop是一个能够对大量数据进行分布式处理的软件框架,它是一种技术的实现。
Hadoop是Apache基金会下的一款开源软件,
它实现了包括分布式文件系统HDFS和MapReduce框架在内的云计算软件平台的基础架构,并且在其上整合了包括数据库、云计算管理、数据仓储等一系列平台,其已成为工业界和学术界进行云计算应用和研究的标准平台。Hadoop现在已经广泛应用于包括国外的FaceBook,Twitter,Yahoo!等公司,国内的百度,阿里等,Hadoop运行在数以千计的服务器和数以万计的CPU的集群上。基于Hadoop,用户可编写处理海量数据的分布式并行程序,并将其运行于由成百上千个结点组成的大规模计算机集群上。
Hadoop已被全球几大IT公司用
作其”云计算”环境中的重要基础软件,如:雅虎正在开发基于Hadoop的开源项目Pig,这是一个专注于海量数据集分析的分布式计算程序。亚马逊公司则基于Hadoop推出了Amazon S3(Amazon Simple Storage Service),提供可靠,快速,可扩展的网络存储服务。因此,Hadoop是云计算中一部分技术的实现,而不是全部。
云计算是继1980年代大型计算机到客户端-服务器的大转变之后的又一种巨变,但云计算的概念其实早已提出很久,早在上世纪60年代,麦卡锡就提出了把计算能力作为一种像水和电一样的公用事业提供给用户的理念,这成为云计算思想的起源。在20世纪80年代网格计算、90年代公用计算,21世纪初虚拟化技术、SOA、SaaS应用的支撑下,云计算作为一种新兴的资源使用和交付模式逐渐为学界和产业界所认知。因此,云计算的存在只是一种新的商业计算模型和服务模式。

Java和云计算的关系

Java是一种程序设计语言,云计算是一种新的商业计算模型和服务模式。他们实际上是没有直接关系的,但是由于Java 技术具有卓越的通用性、高效性、平台移植性和安全性,并且广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、智能手机、物联网和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景,Java已经成为一个庞大而复杂的技术平台。
hadoop hadoop
Java与云计算的关系主要体现在以下几个方面:
Java在云计算中的优势:
Java使云计算更简单,Java具有简单性、兼容性、简易性、安全性、动态性、高性能、解释性、健壮性
Java与分布式计算:
基于JAVA的分布式程序设计:
基于Socket的编程
基于RMI的分布式编程
基于CORBA的分布式编程
Java与并行计算:
JDK 1.5引入java.util.cocurrent包
Java中的多线程技术实现并行计算( JET 平台)
Java SE 5 中的锁,原子量 并行容器,线程调度 以及线程执行
基于Java的分布并行计算环境Java PVM
云计算开源框架支持:
Hadoop是Java开发,很多其他的云计算相关开源软件也是由Java开发或者提供Java API
Java使得云计算的实现更为简单,而云计算让Java更有活力,找到一个新的结合点。Java在互联网应用有
着独特的优势,而云计算是基于互联网的新的商业计算模型和服务模式,两者相结合,势必创造更大价
值。

Java程序员进化为架构师掌握的知识

一:Java知识
1、进制转换
2、Java基本数据类型
面向对象相关知识
3、类、接口、抽象类
this关键字、static关键字、final关键字
方法的参数传递机制
Java垃圾回收机制
四种内部类的实现方式
方法重写(override)与重载(overload)的联系与区别通过多态实现程序代码的松耦合
Java 异常体系详解(checked exception 与 unchecked exception)
JDK 5.0 新特性(泛型、枚举、可变参数、增强的 for 循环、静态导入等)
Java Annotation(使用系统内置 Annotation、自定义Annotation、Annotation的继承等)
Java多线程机制详解(锁、synchronized关键字、sleep()方法、wait()方法、notify()
、notifyAll()方法的意义与联系)
Java线程池的内部实现
Java定时任务内部实现
Java I/O编程(装饰模式详解)
Java网络编程基础知识(Socket、URL、URLConnection、ServerSocket等)
TCP与 UDP的联系与区别
Java Collection API(Collection、List、Set、Map、ArrayList、LinkedList、 Vector、 HashSet、
TreeSet、 HashMap与TreeMap等)区别,适用场景
常用设计模式(工厂方法模式、观察者模式、策略模式、装饰模式、模板方法模式、命令模式等的原理与
应用)
Java NIO详解
java.util.concurrent 并发包的应用(ConcurrentHashMap核心源代码分析、ThreadPoolExecutor、Future
Task、Semaphore、Condition、ReentrantReadWriteLock等接口与类的深度分析)
基于 JDK 1.4 锁的并发机制与基于 JDK 5.0并发包的同步与并发机制的比较与分析
序列化与反序列化
正则表达式的应用
Java动态代理与反射机制
Java代码的执行机制
源代码编译机制
类加载与执行机制
JVM内存管理(内存空间、内存分配、内存回收)
使用 JConsole、JVisualVM及 JMap等查看内存的使用状况
分析程序执行的过程
JVM线程资源同步及交互机制
线程交互机制与状态分析
Java文件操作相关,递归删除,递归读取
JDBC相关知识,步骤,连接操作,数据库连接池(详解 Apache DBCP数据库连接池)
移位操作 (左移n位==乘以2的n次幂) (右移n位==除以2的n次幂)
二、算法
各种排序算法:快速排序、归并排序、插入排序等等
斐波切纳函数
二分查找
全排列
二叉树的遍历
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时
间复杂度都是O(1)
字符串反转
前缀树
最大堆,最小堆
Hash算法及HashMap算法
ConcurrentLinkedHashMap(LRU)
BloomFilter
LIRS算法 LIRS的基本思想是对访问的数据块进行分类,一部分为hot数据块,一部分为cold数据块。对于
hot数据块我们可以分配90%以上的cache给它们。而对于cold数据块给它们分配10%。
从LIRS算法的描述来看,可以理解为两个LRU队列的组合,利用cold缓冲区来保护Hot缓冲区,提高了进
入hot缓冲区的门槛,阻止hot缓冲区频繁地变化。
三、数据库
mysql存储引擎
mysql优化
mysql HA解决方案
sql语句优化
NoSQL相关
四、文件系统
Linux主流文件系统
EXT3与EXT4文件系统
主流分布式文件系统分析与对比
分布式文件系统
五、系统相关
共享内存实现机制
mmap的实现原理与机制
copy on write技术
zero copy技术
六、网络相关
OSI七层网络模型
TCP/IP交互流程
HTTP访问流程
七、大型网站架构
负载均衡技术及其原理
智能DNS解析,原理,实现方案
squid web加速及缓存技术
网页静态化
 

即使别人是码农,你却不该是

好几天前,在微信里,有个童鞋给我留了这么一段话:
「程序君,昨日知乎日报上出现的那篇《为啥中国的程序员都被称为码农》(以下简称「码农」),看完实在心酸,作为一名还在大学校园即将走向“码农”大军的愣头青,想请教您,你对那篇文章有啥看法?上面的说法属实吗?中国程序员的现状大体是怎样?麻烦指点」
我大概看了一下那篇文章,说的有些道理。但程序君认为:别人是不是码农与你无关,你不该成为那篇文章作者眼中的码农。作者说码农一词强调程序员「地位低下、枯燥和劳累」。作为一个程序员,我也来随便说说。
收入和地位
一般而言,程序员的收入水平不低。我没有具体的数据,但在一线城市,程序员的平均收入应该都能达到该市的中上水平 —— 我猜top 30%左右。2012年,我们在校园招聘的时候,很多面试后非常心仪的同学(清华,北大,中科院等)最终都拿着十几到二十万的薪资去了B,T等公司,有一个我们特别中意的iOS工程师,被我们追了很久,但后来最终还是被某著名游戏公司招安,拿了二十好几万的薪水 —— 这可是程序君工作了好几年后才能拿到的package啊。
所以你说程序员的收入低么?为什么你的收入会低?为什么你怕你未来的收入会低?
程序君有个朋友,也是途客圈的前员工,本科来实习前已经有很多独立的项目经验,掌握了python/django和iOS的开发能力。他聪明好学,上手能力非常快,稍加指点就能从事重要功能的开发,勤奋程度又不输于程序君,所以进步神速。后来途客圈的很多核心功能都交由他来负责,某些功能程序君都自认为无法做得比他好。一年半后他从途客圈「毕业」时,已经是各大公司争相想招致麾下的「面霸」,同时拿到了好几份offer,最终去了某搜索公司,现在前途一片光明。
我想这是一个很有借鉴意义的例子,尤其对于在校学生。就像之前的『软件开发升级打怪之路』所讲的那样,我们身边有那么多很有意思的问题可以通过软件来解决,你愿意放弃一部分打dota的时间和精力去解决么?你愿意在解决的过程中排除万难,啃下一个个硬骨头么?
如果你在学生时代就有很多拿得出手的项目,那么在现在互联网热火朝天,人才缺口很大的时代,找一份薪水不低的工作还是难事么?
程序员可能是世界上唯一一份不用太靠学历,不用太靠爹娘,甚至都不用太靠熬日子出头的工种。有人杜撰了这么个故事:
说Python之父Guido van Rossum有天跑去google面试,说了三个词:”I wrote python”,就被录用了。
当然像Guido这样的大牛犯不着主动去找工作的,就像球场上的超级明星,给猎头打个电话,说我想挪个窝了,工作机会就会像雪片一样飞来。这个故事虽为杜撰,但不失一个很好的例子说明程序员「不靠天,不靠地,就靠自己一双手」的本质。你的薪水取决于你能做出什么来。
至于地位,我觉得除了权贵阶层,其他人的地位都差不多。如果不做公务员,没事别老琢磨地位,那玩意说来就来,说走就走。我倒觉得程序员应该多提高自己的品味 —— 至少多学学打扮自己,别拿着中产的收入过得像无产阶级。
另外,建议妹子们也多关注关注程序员这个群体 —— 毕竟能够改变世界的几类人中,程序员算是最好接近,在比较年轻的时候就能看出潜力,也最好玩弄于股掌中的。^_^
工作枯燥
工作枯燥这事真心和你自己的感受有关。首先不是所有人都适合做程序员的,如果你换了不少团队或公司,做什么都觉得枯燥,自己又没兴趣做pet project,那你要好好考虑下自己是否适合这条路。否则走下去,就真成了「码农」一文中的码农了。
有人曾经给我留言说自己不想做业务相关的事,没意思,想做「真正的程序员」做的事情。拜托,我们做的是产品,哪个产品不是和业务相关的呢?脱离了业务的软件,要么是纯粹个人爱好,要么只能在象牙塔里生存。
有人说工作特么没劲,每天干的都是琐碎边缘的活儿,枯燥死了。好吧,你以为程序君做得总是高大上的事情么?程序君最近两周干的活也琐碎得要命,其中一个任务类似于「从linux kernel的源代码里,把所有.c引用的.h文件摘一摘,只留下真正有用的(但系统还能正常编译运行)」。
工作中这样的活不少,枯燥是有点枯燥,遇到了与其怨天尤人,不如想办法快点将它完成。程序君花了大半天时间,在走了很多弯路写了两个程序后,终于找到一个巧妙的办法,仅仅写了五十多行python代码就将其完成。效果从最初的方案减少了25%的.h文件一直到减少了95%的.h文件。
我比较不理解有程序员说自己总不得不做重复劳动,所以感觉工作异常枯燥。想想「程序员」这顶帽子带在头上意味着什么?它意味着全世界任何群体都有理由说自己的劳动是重复劳动,唯独程序员这个群体不能。为何?程序员坚守的信条是DRY(Don’t Repeat Yourself),一件事当你发现你需要重复第二次时,就要考虑将其自动化。做不到这一点的请努力,因为这决定了你的效率和效能。
还举我自己的例子吧。前些日子我要测试几个开发环境,流程大概是下载代码,编译,运行UT。因为开发环境有点问题,所以在下载完代码后我需要对代码打个patch。这活第一遍我是手工做的,为了验证整个流程的正确性,调整patch等等。第二遍以后我就写了个脚本将其自动化。虽然在我写这个脚本的时间里,我完全可以对所有的开发环境都一一验证,但脚本化的好处是,我可以让别人用这个脚本也进行独立验证,我也可以在今后几天的工作中反复使用。
枯燥是你看待任务的主观情绪。很多看起来外表光鲜的互联网公司或者软件公司,真正分到你手上的任务就不见得光鲜靓丽。大数据?那是对外美好的商业表述。你真正做的事情也许是对海量日志进行或手动或半自动分析,枯燥不?操作系统?好吧,你去了以后发现主要做的是本地化,枯燥不?虚拟化?好吧,那里很大的团队在做驱动开发,枯燥不?
没那么多枯燥。软件就是一个个实现起来非常枯燥的功能有机地组合在一起,为用户(客户)提供价值。无法认清这一点,总认为自己干的就是最枯燥的,那你只能继续枯燥下去,也只能成为「码农」作者眼中的码农。
辛苦劳累
辛苦劳累倒是真的。不过要看你怎么个辛苦法。
如果你在一家各种限制你自由发挥,还以你工作时长为工作态度和工作能力的评定标准,那么,除非你有其它想法,否则应该选择离开。记得我毕业后工作的第一家公司,有天晚上吃饭,老板问我对team里两个女孩有什么评价,我说她们工作得挺好,合作愉快啊(潜台词是男女搭配,干活不累^_^)。老板努了努嘴,说:可她们一下班就回家,工作态度不积极啊。我听着不是滋味,心里就萌生了离开的念头。
程序员的工作绝对不应该用工作时间,是否加班来衡量。如果你的老板给你的评定是「该员工工作积极努力,主动加班,blablabla」,你还愿意这么呆着,那你就别抱怨辛苦劳累。
不过现状的确是是很多程序员都在加班,包括我在内。
有些人加班是真忙。但其实有很多行业比程序员忙得多,比如四大所在的会计(审计)行业,比如投行,咨询。
也有些人加班是刷存在感。
但更多的人加班是为了有一个清静的环境,能做点什么。
要说辛苦劳累,我觉得一个很重要的原因是:这个工种需要你不断更新夯实自己的技能。
如果被迫接受,那身心俱疲;如果主动出击,身体累了点,心灵上的成就感还是不小的。
http://blog.sae.sina.com.cn/archives/3548

如何修改java class文件

工具:
Java Class File Editor 下载地址:https://sourceforge.net/projects/classeditor/
jd-gui.exe 下载地址:http://jd.benow.ca/
其中Java Class File Editor是用来修改class内容的,而jd-gui.exe是在修改前和修改后查看代码的。
下载工具ce2.23 .tar.gz,解压,打开window的cmd
进入文件夹 运行java -jar ce.jar就可以看到界面,

class editor

class editor


jd-gui.exe查看源代码,在editor里查找要修改的地方,修改,保存,然后用jd-gui.exe查看修改后是否生效。
查看class文件

查看class文件

What are the best-kept secrets of great programmers

I think there are really a few things that distinguish great programmers.
Know the concepts. Solving a problem via memory or pattern recognition is much faster than solving it by reason alone. If you’ve solved a similar problem before, you’ll be able to recall that solution intuitively. Failing that, if you at least keep up with current research and projects related to your own you’ll have a much better idea where to turn for inspiration. Solving a problem “automatically” might seem like magic to others, but it’s really an application of “practice practice practice” as Miguel Paraz suggests.
Know the tools. This is not an end in itself, but a way to maintain “flow” while programming. Every time you have to think about how to make your editor or version-control system or debugger do what you want, it bumps you out of your higher-level thought process. These “micro-interruptions” are small, but they add up quickly. People who learn their tools, practice using their tools, and automate things that the tools can’t do by themselves can easily be several times as productive as those who do none of those things.
Manage time. Again it comes back to flow. If you want to write code, write code. If you want to review a bunch of patches, review a bunch of patches. If you want to brainstorm on new algorithms . . . you get the idea. Don’t try to do all three together, and certainly don’t interrupt yourself with email or IRC or Twitter or Quora. 😉 Get your mind set to do one thing, then do that thing for a good block of time before you switch to doing something else.
Prioritize. This is the area where I constantly see people fail. Every problem worth tackling has many facets. Often, solving one part of the problem will make solving the others easier. Therefore, getting the order right really matters. I’m afraid there’s no simple answer for how to recognize that order, but as you gain more experience within a problem domain – practice again – you’ll develop a set of heuristics that will guide you.
Reuse everything. Reuse ideas. Reuse code. Every time you turn a new problem into a problem you already know how to solve – and computing is full of such opportunities – you can save time. Don’t worry if the transformed solution isn’t absolutely perfect for the current problem. You can refine later if you really need to, and most often you’ll find that you’re better off moving on to the next problem.
A lot of these really come down to efficiency. As you move through more problems per day, you’ll gain more experience per day, which will let you move through more problems per day, and so on. It’s a feedback loop; once you get on its good side, your effectiveness (and value) will increase drastically.

即使别人是码农,你却不该是

好几天前,在微信里,有个童鞋给我留了这么一段话:
「程序君,昨日知乎日报上出现的那篇《为啥中国的程序员都被称为码农》(以下简称「码农」),看完实在心酸,作为一名还在大学校园即将走向“码农”大军的愣头青,想请教您,你对那篇文章有啥看法?上面的说法属实吗?中国程序员的现状大体是怎样?麻烦指点」
我大概看了一下那篇文章,说的有些道理。但程序君认为:别人是不是码农与你无关,你不该成为那篇文章作者眼中的码农。作者说码农一词强调程序员「地位低下、枯燥和劳累」。作为一个程序员,我也来随便说说。
收入和地位
一般而言,程序员的收入水平不低。我没有具体的数据,但在一线城市,程序员的平均收入应该都能达到该市的中上水平 —— 我猜top 30%左右。2012年,我们在校园招聘的时候,很多面试后非常心仪的同学(清华,北大,中科院等)最终都拿着十几到二十万的薪资去了B,T等公司,有一个我们特别中意的iOS工程师,被我们追了很久,但后来最终还是被某著名游戏公司招安,拿了二十好几万的薪水 —— 这可是程序君工作了好几年后才能拿到的package啊。
所以你说程序员的收入低么?为什么你的收入会低?为什么你怕你未来的收入会低?
程序君有个朋友,也是途客圈的前员工,本科来实习前已经有很多独立的项目经验,掌握了python/django和iOS的开发能力。他聪明好学,上手能力非常快,稍加指点就能从事重要功能的开发,勤奋程度又不输于程序君,所以进步神速。后来途客圈的很多核心功能都交由他来负责,某些功能程序君都自认为无法做得比他好。一年半后他从途客圈「毕业」时,已经是各大公司争相想招致麾下的「面霸」,同时拿到了好几份offer,最终去了某搜索公司,现在前途一片光明。
我想这是一个很有借鉴意义的例子,尤其对于在校学生。就像之前的『软件开发升级打怪之路』所讲的那样,我们身边有那么多很有意思的问题可以通过软件来解决,你愿意放弃一部分打dota的时间和精力去解决么?你愿意在解决的过程中排除万难,啃下一个个硬骨头么?
如果你在学生时代就有很多拿得出手的项目,那么在现在互联网热火朝天,人才缺口很大的时代,找一份薪水不低的工作还是难事么?
程序员可能是世界上唯一一份不用太靠学历,不用太靠爹娘,甚至都不用太靠熬日子出头的工种。有人杜撰了这么个故事:
说Python之父Guido van Rossum有天跑去google面试,说了三个词:”I wrote python”,就被录用了。
当然像Guido这样的大牛犯不着主动去找工作的,就像球场上的超级明星,给猎头打个电话,说我想挪个窝了,工作机会就会像雪片一样飞来。这个故事虽为杜撰,但不失一个很好的例子说明程序员「不靠天,不靠地,就靠自己一双手」的本质。你的薪水取决于你能做出什么来。
至于地位,我觉得除了权贵阶层,其他人的地位都差不多。如果不做公务员,没事别老琢磨地位,那玩意说来就来,说走就走。我倒觉得程序员应该多提高自己的品味 —— 至少多学学打扮自己,别拿着中产的收入过得像无产阶级。
另外,建议妹子们也多关注关注程序员这个群体 —— 毕竟能够改变世界的几类人中,程序员算是最好接近,在比较年轻的时候就能看出潜力,也最好玩弄于股掌中的。^_^
工作枯燥
工作枯燥这事真心和你自己的感受有关。首先不是所有人都适合做程序员的,如果你换了不少团队或公司,做什么都觉得枯燥,自己又没兴趣做pet project,那你要好好考虑下自己是否适合这条路。否则走下去,就真成了「码农」一文中的码农了。
有人曾经给我留言说自己不想做业务相关的事,没意思,想做「真正的程序员」做的事情。拜托,我们做的是产品,哪个产品不是和业务相关的呢?脱离了业务的软件,要么是纯粹个人爱好,要么只能在象牙塔里生存。
有人说工作特么没劲,每天干的都是琐碎边缘的活儿,枯燥死了。好吧,你以为程序君做得总是高大上的事情么?程序君最近两周干的活也琐碎得要命,其中一个任务类似于「从linux kernel的源代码里,把所有.c引用的.h文件摘一摘,只留下真正有用的(但系统还能正常编译运行)」。
工作中这样的活不少,枯燥是有点枯燥,遇到了与其怨天尤人,不如想办法快点将它完成。程序君花了大半天时间,在走了很多弯路写了两个程序后,终于找到一个巧妙的办法,仅仅写了五十多行python代码就将其完成。效果从最初的方案减少了25%的.h文件一直到减少了95%的.h文件。
我比较不理解有程序员说自己总不得不做重复劳动,所以感觉工作异常枯燥。想想「程序员」这顶帽子带在头上意味着什么?它意味着全世界任何群体都有理由说自己的劳动是重复劳动,唯独程序员这个群体不能。为何?程序员坚守的信条是DRY(Don’t Repeat Yourself),一件事当你发现你需要重复第二次时,就要考虑将其自动化。做不到这一点的请努力,因为这决定了你的效率和效能。
还举我自己的例子吧。前些日子我要测试几个开发环境,流程大概是下载代码,编译,运行UT。因为开发环境有点问题,所以在下载完代码后我需要对代码打个patch。这活第一遍我是手工做的,为了验证整个流程的正确性,调整patch等等。第二遍以后我就写了个脚本将其自动化。虽然在我写这个脚本的时间里,我完全可以对所有的开发环境都一一验证,但脚本化的好处是,我可以让别人用这个脚本也进行独立验证,我也可以在今后几天的工作中反复使用。
枯燥是你看待任务的主观情绪。很多看起来外表光鲜的互联网公司或者软件公司,真正分到你手上的任务就不见得光鲜靓丽。大数据?那是对外美好的商业表述。你真正做的事情也许是对海量日志进行或手动或半自动分析,枯燥不?操作系统?好吧,你去了以后发现主要做的是本地化,枯燥不?虚拟化?好吧,那里很大的团队在做驱动开发,枯燥不?
没那么多枯燥。软件就是一个个实现起来非常枯燥的功能有机地组合在一起,为用户(客户)提供价值。无法认清这一点,总认为自己干的就是最枯燥的,那你只能继续枯燥下去,也只能成为「码农」作者眼中的码农。
辛苦劳累
辛苦劳累倒是真的。不过要看你怎么个辛苦法。
如果你在一家各种限制你自由发挥,还以你工作时长为工作态度和工作能力的评定标准,那么,除非你有其它想法,否则应该选择离开。记得我毕业后工作的第一家公司,有天晚上吃饭,老板问我对team里两个女孩有什么评价,我说她们工作得挺好,合作愉快啊(潜台词是男女搭配,干活不累^_^)。老板努了努嘴,说:可她们一下班就回家,工作态度不积极啊。我听着不是滋味,心里就萌生了离开的念头。
程序员的工作绝对不应该用工作时间,是否加班来衡量。如果你的老板给你的评定是「该员工工作积极努力,主动加班,blablabla」,你还愿意这么呆着,那你就别抱怨辛苦劳累。
不过现状的确是是很多程序员都在加班,包括我在内。
有些人加班是真忙。但其实有很多行业比程序员忙得多,比如四大所在的会计(审计)行业,比如投行,咨询。
也有些人加班是刷存在感。
但更多的人加班是为了有一个清静的环境,能做点什么。
要说辛苦劳累,我觉得一个很重要的原因是:这个工种需要你不断更新夯实自己的技能。
如果被迫接受,那身心俱疲;如果主动出击,身体累了点,心灵上的成就感还是不小的。
http://blog.sae.sina.com.cn/archives/3548

AngularJS开发的理念

Angular信奉的是,当组建视图(UI)同时又要写软件逻辑时,声明式的代码会比命令式的代码好得多,尽管命令式的代码非常适合用来表述业务逻辑
将DOM操作和应用逻辑解耦是一种非常好的思路,它能大大改善代码的可调性;
将测试和开发同等看待是一种非常非常好的思路,测试的难度在很大程度上取决于代码的结构;
将客户端和服务器端解耦是一种特别好的做法,它能使两边并行开发,并且使两边代码都能实现重用;
如果框架能够在整个开发流程里都引导着开发者:从设计UI,到编写业务逻辑,再到测试,那对开发者将是极大的帮助;
“化繁为简,化简为零”总是好的。
AngularJS能将你从以下的噩梦中解脱出来:
使用回调:回调的使用会打乱你的代码的可读性,让你的代码变得支离破碎,很难看清本来的业务逻辑。移除一些常见的代码,例如回调,是件好事。大幅度地减少你因为JavaScript这门语言的设计而不得不写的代码,能让你把自己应用的逻辑看得更清楚。
手动编写操作DOM元素的代码:操作DOM是AJAX应用很基础的一部分,但它也总是很“笨重”并且容易出错。用声明的方式描述的UI界面可随着应用状态的改变而变化,能让你从编写低级的DOM操作代码中解脱出来。绝大部分用AngularJS写的应用里,开发者都不用再自己去写操作DOM的代码,不过如果你想的话还是可以去写。
对UI界面读写数据:AJAX应用的很大一部是CRUD操作。一个经典的流程是把服务端的数据组建成内部对象,再把对象编成HTML表单,用户修改表单后再验证表单,如果有错再显示错误,然后将数据重新组建成内部对象,再返回给服务器。这个流程里有太多太多要重复写的代码,使得代码看起来总是在描述应用的全部执行流程,而不是具体的业务逻辑和业务细节。
前得写大量的基础性的代码:通常你需要写很多的基础性的代码才能实现一个“Hello World”的应用。用AngularJS的话,它会提供一些服务让你很容易地正式开始写你的应用,而这些服务都是以一种Guice-like dependency-injection式的依赖注入自动加入到你的应用中去的,这让你能很快的进入你应用的具体开发。特别的是,你还能全盘掌握自动化测试的初始化过程。

Java异常处理步骤

Java异常处理步骤:
第一句一般是总的,告诉你哪里错了,错误就在caused by后面的语句提示里面,或者是自己写的类里面。异常信息是从上往下抛(大概的说法)的,因为下面是调用上面的方法,也就是说第一行是最终抛出异常的方法,而最后一行最上层调用的方法
异常链是一种机制,异常转译时,保存原来的异常,这样当这个异常再被转译时,还会被保存,于是就成了一条链了,包含了所有的异常,所以你可以看到这样的异常打印:

org.apache.phoenix.exception.PhoenixIOException: org.apache.phoenix.exception.PhoenixIOException: 系统找不到指定的路径。
	at org.apache.phoenix.util.ServerUtil.parseServerException(ServerUtil.java:107)
	at org.apache.phoenix.iterate.ParallelIterators.getIterators(ParallelIterators.java:527)
	at org.apache.phoenix.iterate.MergeSortResultIterator.getIterators(MergeSortResultIterator.java:48)
	at org.apache.phoenix.iterate.MergeSortResultIterator.minIterator(MergeSortResultIterator.java:63)
	at org.apache.phoenix.iterate.MergeSortResultIterator.next(MergeSortResultIterator.java:90)
	at org.apache.phoenix.jdbc.PhoenixResultSet.next(PhoenixResultSet.java:734)
	at com.youku.service.VideoFingerprintServiceNew.getSimlarVideoMD5(VideoFingerprintServiceNew.java:111)
	at com.youku.service.VideoFingerprintServiceNew.excute(VideoFingerprintServiceNew.java:50)
	at com.youku.service.AbstractHttpImpl.getResponseModel(AbstractHttpImpl.java:22)
	at com.youku.web.servlet.CommonHttpServlet.doPost(CommonHttpServlet.java:79)
	at com.youku.web.servlet.CommonHttpServlet.doGet(CommonHttpServlet.java:41)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:612)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:503)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.concurrent.ExecutionException: org.apache.phoenix.exception.PhoenixIOException: 系统找不到指定的路径。
	at java.util.concurrent.FutureTask.report(FutureTask.java:122)
	at java.util.concurrent.FutureTask.get(FutureTask.java:202)
	at org.apache.phoenix.iterate.ParallelIterators.getIterators(ParallelIterators.java:523)
	... 23 more
Caused by: org.apache.phoenix.exception.PhoenixIOException: 系统找不到指定的路径。
	at org.apache.phoenix.util.ServerUtil.parseServerException(ServerUtil.java:107)
	at org.apache.phoenix.iterate.SpoolingResultIterator.(SpoolingResultIterator.java:129)
	at org.apache.phoenix.iterate.SpoolingResultIterator.(SpoolingResultIterator.java:74)
	at org.apache.phoenix.iterate.SpoolingResultIterator$SpoolingResultIteratorFactory.newIterator(SpoolingResultIterator.java:68)
	at org.apache.phoenix.iterate.ChunkedResultIterator.(ChunkedResultIterator.java:90)
	at org.apache.phoenix.iterate.ChunkedResultIterator$ChunkedResultIteratorFactory.newIterator(ChunkedResultIterator.java:70)
	at org.apache.phoenix.iterate.ParallelIterators$2.call(ParallelIterators.java:631)
	at org.apache.phoenix.iterate.ParallelIterators$2.call(ParallelIterators.java:622)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	... 1 more

这个异常链中就是包含了两个异常,最前面是顶级异常,后面再打印一个Cause by,然后再打印低一层异常,直到打印完所有的异常。
异常链,在JDK1.4以后版本中,Throwable类支持异常链机制。Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。最后,它还可以包含 cause(原因):另一个导致此 throwable 抛出的 throwable。它也称为异常链 设施,因为 cause 自身也会有 cause,依此类推,就形成了异常链,每个异常都是由另一个异常引起的。
通俗的说,异常链就是把原始的异常包装为新的异常类,并在新的异常类中封装了原始异常类,这样做的目的在于找到异常的根本原因。
这篇文章很好:http://my.oschina.net/yanquan345/blog/204498
在我查过的资料中,以《Effective Java》书中对异常处理设计的研究得最系统,本文很多思想来自于它,下面我把其中的几条原则翻译(非直译)并贴上:
第57条:只对异常情况使用异常。(说明:即不要用异常处理控制正常程序流)。
第58条:对可恢复异常使用编译时异常,对编程错误使用运行时异常。
第59条:应避免不必要的编译时异常:如果调用者即使合理的使用API也不能避免异常的发生,并且调用者可以对捕获的异常做出有意义的处理,才使用编译时异常。
第60条:应偏好使用自带异常
第61条:抛出的异常应适合本层抽象(就是上面说的转译)
第62条:把方法可能抛的所有异常写入文档,包括运行时异常
第63条:用异常类记录的信息要包含失败时的数据
第64条:力求失败是原子化的(解释:就是如果调用一个方法发生了异常,就应该使对象返回调用前的状态)
第65条:不要忽略异常