2016年9月8日星期四

编程难

作者:陈皓
上周,在Sun的Java论坛上出现了一个这样的帖子,这个贴子的链接如下:
http://forums.sun.com/thread.jspa?threadID=5404590&start=0&tstart=0
LZ的贴子翻译如下:
大家好,我是一个Java的新手,我有一个简单的问题:请问我怎么才能反转一个整数的符号啊。比如把-12转成+12。是的,毫无疑问这是个简单的问题,但我弄了一整天我也找不到什么好的方法。非常感谢如果你能告诉我Java有什么方法可以做到这个事,或者告诉我一个正确的方向——比如使用一些数学库或是二进制方法什么的。谢谢!
这个贴子的沙发给出了答案:
n = -n;
LZ在四楼回复到:
我知道是个很简单的事,可我没有想到居然这么简单,我觉得你可能是对的。谢谢你。
过了一会,又回复到:
不开玩笑地说,我试了,真的没有问题耶!
看到这样的贴子,就能想到国内论坛上很多这样的“问弱智问题的贴子”,结果可能都会是比较惨!是的,国外的互联网文化和国内差不多,都是恶搞的人多于热心的人,呵呵。不过,国外的网民们有一点是好的,再恶搞也是就事搞事,不会有侮辱人的语言,这点真是值国内的人学习
这本是一个平淡无奇的贴子,不过回复中那些恶搞的“解决方案”太强大了,在这里例举一下吧。
贴子的板凳给出了这样的答案(这是恶搞的开始)

int x = numberToInvertSign;
boolean pos = x > 0;
for(int i = 0; i < 2*Math.abs(x); i++){
    if(pos){
        numberToInvertSign--;
    }
    else{
        numberToInvertSign++;
    }
}
然后,有人说,n = -n 可以是可以,但不够晦涩,于是一个晦涩的解决方案出现了:
int n = ....;
 n = (0xffffffff ^ n) + 1;
然后,又出现了一些看似简单,其实是比较晦涩的方案
n = ~n + 1; 

n = ~--n; 

继续,有才的人从来就不少:
n^= 0xffffffff;
int m;
for (m= 1; m != 0 && ((n&m) != 0); m<<= 1);
n|= m;
if (m == 0) n= m;
else for (m >>= 1; m != 0; n^= m, m>>=1);

呵呵,开始越来越强大了,我以前也向大家介绍过《如何加密/弄乱C源代码》的文章,和这些恶搞的人可能有点相似吧。上面这个例子一出,大家都在讨论上面例子中的for循环语句,呵呵,很费解啊。
然后,后面几个就开始乱来了:
public int invert(int i) {
  return i - (i + i);
}
switch (i)
{
  case 1: return -1;
  case 2: return -2;
  case 3: return -3;
  // ... etc, you get the proper pattern
}
不过事情还没有结束,看看下面这个吧,OMG。
int absoluteValue(int num)
{
 int max = 0;
 for(int i = 0; true; ++i)
 {
  max = i > max ? i : max;
  if(i == num)
  {
   if(i >= max)
    return i;
   return -i;
  }
 }
}
 还有用字符串的解决方案:
public int invert(int n) {
    String nStr = String.valueOf(n);
 
    if (nStr.startsWith("-")) {
        nStr = nStr.replace("-", "");
    } else {
        nStr = "-" + nStr;
    }
 
    return Integer.parseInt(nStr);
}
别忘了面象对象,有最新Java支持的模板库: 
public interface Negatable<T extends Number> {
  T value();
  T negate();
}
 
 
 
public abstract class NegatableInteger implements Negatable<Integer> {
  private final int value;
 
  protected NegatableInteger(int value) {
    this.value = value;
  }
 
  public static NegatableInteger createNegatableInteger(int value) {
    if (value > 0) {
      return new NegatablePositiveInteger(value);
    }
    else if (value == Integer.MIN_VALUE) {
      throw new IllegalArgumentException("cannot negate " + value);
    }
    else if (value < 0) {
      return new NegatableNegativeInteger(value);
    }
    else {
      return new NegatableZeroInteger(value);
    }
  }
 
  public Integer value() {
    return value;
  }
 
  public Integer negate() {
    String negatedString = negateValueAsString ();
    Integer negatedInteger = Integer.parseInt(negatedString);
    return negatedInteger;
  }
 
  protected abstract String negateValueAsString ();
}
 
 
 
public class NegatablePositiveInteger extends NegatableInteger {
  public NegatablePositiveInteger(int value) {
    super(value);
  }
 
  protected String negateValueAsString () {
    String valueAsString = String.valueOf (value());
    return "-" + valueAsString;
  }
}
 
 
 
public class NegatableNegativeInteger extends NegatableInteger {
  public NegatableNegativeInteger (int value) {
    super(value);
  }
 
  protected String negateValueAsString () {
    String valueAsString = String.valueOf (value());
    return valueAsString.substring(1);
  }
}
 
 
 
public class NegatableZeroInteger extends NegatableInteger {
  public NegatableZeroInteger (int value) {
    super(value);
  }
 
  protected String negateValueAsString () {
    return String.valueOf (value());
  }
}

这个贴子基本上就是两页,好像不算太严重,如果你这样想的话,你就大错特错了。这个贴子被人转到了reddit.com,于是一发不可收拾,在上面的回贴达到了490多条。链接如下:
有人说,要用try catch;有人说要使用XML配置文件……,程序员们在追逐更为变态和疯狂的东西,并从中找到快乐,呵呵。
看完后,正如reddit.com所说——“编程好难啊”!
无独有偶,这并不是第一次,也不会是最后一次,让我们看看在PHP的官网上发生的类似的一幕——讨论PHP的abs取绝对值函数的函数说明文档中的回复:
又是一个长贴,还带着很多性能分析,真的很好很强大!

(全文完)
题外话:转载这个文章的目的,是告诉我自己,尽量用最简单的方法解决我当前的问题

如此理解面向对象编程

转载自:http://coolshell.cn/articles/8745.html#more-8745
作者:
不知道为什么,复制过来的文章就是无法保存,仅仅转了皓哥的《我的理解》
希望看原文的,可以点击上面的连接自行查看。
最后说一句,真心的不错

我的理解

我觉得,这篇文章的例子举得太差了,差得感觉就像是OO的高级黑。面向对象编程注重的是:1)数据和其行为的打包封装,2)程序的接口和实现的解耦。你那怕,举一个多个开关和多个电器的例子,不然就像STL中,一个排序算法对多个不同容器的例子,都比这个例子要好得多得多。老实说,Java SDK里太多这样的东西了。
我以前给一些公司讲一些设计模式的培训课,我一再提到,那23个经典的设计模式和OO半毛钱关系没有,只不过人家用OO来实现罢了。设计模式就三个准则:1)中意于组合而不是继承,2)依赖于接口而不是实现,3)高内聚,低耦合。你看,这完全就是Unix的设计准则
(全文完)
题外话:这篇文章太好,我就不好意思转载了!

五大基于JVM的脚本语言

转载自:http://coolshell.cn/articles/2631.html
作者:
还记得以前本站的一篇文章《如何在Google App Engine上运行PHP》吗,其实那是借用 Quercus, 一个 100% 的用Java 实现的一个 PHP 引擎。今天,这样的东西太多了,能运行在Java的虚拟机JVM上的程序意味着有天然的跨平台性,现在JVM并不单单只能运行Java程序,在JVM上出现了若干使用Java虚拟机运行的脚本程序,比如什么PHP, Python, Ruby等等,这里有一篇文章评论了在JVM上的可以运行的排名前五脚本语言。他们分别是:
  1. Groovy。构建在强大的Java语言之上 并添加了从Python,Ruby和Smalltalk等语言中学到的诸多特征,为Java开发者提供了现代最流行的编程语言特性,而且学习成本很低(几乎为零),在开发Web,GUI,数据库或控制台程序时, 通过减少框架性代码 大大提高了开发者的效率。支持单元测试和模拟(对象),可以简化测试。无缝集成 所有已经存在的 Java对象和类库。直接编译成Java字节码,这样可以在任何使用Java的地方 使用Groovy。
  2. JRuby。一个纯Java实现的Ruby解释器。通过JRuby,你可以在JVM上直接运行Ruby程序,调用Java的类库。很多Java编写的Ruby IDE都是使用JRuby来解释语法的。
  3. Scala。一种多范式的编程语言,设计意图是要整合面向对象编程和函数式编程的各种特性。Scala编程语言近来抓住了很多开发者的眼球。它看起来像是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格。Scala的名称表明,它还是一种高度可伸缩的语言。Scala的设计始终贯穿着一个理念:创造一种更好地支持组件的语言。
  4. Fantom 。Fantom 前身是 (Fan) 是一个基于 Java 和 .NET 平台的编程脚本引擎,用来在运行时产生 JVM 和 .NET 平台的字节码,该语言是面向对象的,跟 Groovy 和 JRuby 有点类似,可通过特定的接口来集成 Java 的类库。
  5. Jython。Jython由于继承了Java和Python二者的特性而显得很独特。其是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。
下面是一张表格比较了这五大JVM脚本语言:
GroovyJRubyScalaFantomJython
风格类型OO / 动态OO / 动态OO, 过程/ 静态OO / 静态OO / 动态
源语言JavaRubyN/AN/APython
运行编译型编译型,
解释型
编译型半编译型编译型
平台JVMJVMJVMJVM, .Net CLRJVM
Java集成极好极好极好极好
运行速度极好很好
工具支持广泛还可以广泛几乎没有几乎没有
其它一些JVM的脚本语言也我们可以关注一下,如:ClojureJavaFX, 和IBM的 NetRexx
(全文完)
题外话:这篇文章太好,我就不好意思转载了!

好单位与坏单位

可以延伸到很多方面
积极向上才是好的。








换个思路,焕然一新

最近,一件工作上的事情老烦着我,网站无法正常登录,但是可以正常浏览,查了下原因,是因为文件系统变为只读,使用的vps,也没法查看宿主机,让运营商去看,运营商说运行正常,没办法,我有监控,本来想监控URL,模拟登录,根据无法登录进行报警来达到目的,但是一个小难点把我卡住了,就是登录需要验证码,因此这个想法搁浅了,昨晚做梦忽然想到了解决办法,其实想法很简单,因为无法登录是因为文件系统只读完成的,那么我可以创建一个shell脚本,这个脚本主要作用就是创建一个临时文件,写测试数据,检验读,然后删除,配合监控,就能做到事故发生后进行报警了,也可以在第一时间解决,免得我事故发生好长时间了,却还不知道。

2016年9月7日星期三

手机上发布博文

我现在在手机上,也许你很惊讶吧!
为了在手机上发布,我千辛万苦,还专门安装了google play,没办法,现在墙的厉害。手机无法直接安装,不过,现在还是安装上了

一首歌,一个画面

 有几首歌每逢听到,都会浑身一颤,想起一段情景。
1,《月牙湾》 FIR

小说《美女江山一锅煮》
听到这个歌,都能想起江湖豪情,人间情义,爱恨离愁。
心揪在一起。

2,《画好月圆》 任贤齐、杨千嬅


独自在郑州的日子

 转眼间,在郑州已经八年了,即使抗日,也看到胜利了。
不知道为什么,我反而越觉得孤独,郁闷,前景迷茫。
 最近郑州的房价涨的太厉害,房租也跟着疯长。经济不大好,工资都发不下来。现在吃饭都已经成了问题,愁,愁的都长了白头发。
快憋疯了。
 我很想说出来,虽然有些自我安慰。


行走在路上博客诞生日

 让我记住这一天。
2016年9月7日,在中国郑州,开设了“行走在路上”这个博客。
博客网址为
https://walkingontheroad2016.blogspot.com

    Eagle
        写于郑州!

High一下!