介绍

Scala环境下已经至少有6种Json解析的类库很用了很相似的抽象语法树(AST),而JSON4S这个项目的目标就是提供一个单一的AST树供其他Scala类库来使用。

JSON4S工作原理

JSON4S的features:

  • 快速的JSON解析
  • LINQ 风格的查询
  • 可以紧密结合样例类
  • 差别比较和合并
  • 使用DSL来生成有效格式的JSON
  • 支持XPATH
  • 优雅的打印
  • 支持XML的转换
  • 序列化

Read More

泛型,可以告诉编译器每个集合中接受哪些对象类型,编译器会自动地为你的插入进行转化,并在编译时告知是否插入了类型错误的对象。(貌似Java里面的泛型都是伪泛型吧-_-|)

第23条:请不要再新代码中使用原生态类型

什么是原生态类型?

类似List<E>,Collection<E>泛型的定义都有一个原生态类型,那就是List,Collection,用他们定义类型也不会出错.

为什么不要使用原生态类型

使用原生态类型的集合类可以插入各种不同的类型,他们在编译时不会进行类型检查,但是运行时遇到错误就会抛出,这样是很不安全的。

我在不确定或者不在乎集合类型的情况下,是不是用原生态类型最好?

还是不要用,可以使用无限制的通配符来替代,比如

1
2
3
4
5
6
7
8
9
10
11
static int numElementsInCommon(Set<?> s1,Set<?> s2)
{

int count=0;
for(Object o:s1)
{
if(s2.contains(o))
count++;
}

return count;
}

它是类型安全的,但是无法猜测放入了哪些对象,此时可以使用泛型或者有限制的通配符类型(下文会描述)。

Read More

泡椒牛蛙是一道色香味俱全的汉族名菜,属于川菜系。最常见又易烹制,成菜后味咸鲜,肉细嫩,色红亮,泡菜香气浓郁。

食材

  • 牛蛙:2只
  • 油、料酒~~~~
  • 生姜、大蒜:适量
  • 莴笋:适量(炒到牛蛙里面的莴笋特别好吃)
  • 小米椒:一点点就好了(最好还有红灯笼椒,但是没买到-_-)

Read More

Linux版本:Centos6.5
Mac版本:OS X Yosemite 10.10.2

LC_CTYPE: cannot change locale (UTF-8)

通过ssh连接到linux,会出现如下警告:

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

这是由于没有找到对应的语言环境导致的:
按一下命令步骤操作即可修复:
首先

sudo vi /etc/ssh_cofig

然后将该文件中的SendEnv LANG LC_*这一行用#进行注释

#SendEnv LANG LC_*

参考:OS X Terminal: -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory Fix

Write failed: Broken pipe

通过ssh连接到linux,有时候会莫名其妙的出现错误:

Write failed: Broken pipe

看资料说的是由于长时间未操作造成的,解决方法为在Mac端的~/.ssh/config文件中添加:

ServerAliveInterval 60

参考:解决ssh的”Write failed: Broken pipe”问题

命令历史

:/开头的命令都有历史纪录,可以首先键入:/然后按上下箭头来选择某个历史命令。

启动vim

在命令行窗口中输入以下命令即可

  • vim 直接启动vim
  • vim filename 打开vim并创建名为filename的文件

文件命令

  • vim file 打开单个文件
  • vim file1 file2 file3 … 同时打开多个文件
  • :open file 在vim窗口中打开一个新文件
  • :split file 在新窗口中打开文件
  • :bn 切换到下一个文件
  • :bp 切换到上一个文件
  • :args 查看当前打开的文件列表,当前正在编辑的文件会用[]括起来。
  • 打开远程文件,比如ftp或者share folder
    :e ftp://192.168.10.76/abc.txt
    :e \qadrive\test\1.txt

vim的模式

  • 正常模式(按EscCtrl+[进入) 左下角显示文件名或为空
  • 插入模式(按i键进入) 左下角显示—INSERT—
  • 可视模式(不知道如何进入) 左下角显示—VISUAL—

Read More

最近在Haddop环境下跑论文里的对比试验,不过这两天在跑Job时偶然会出现Job Failed的问题,看日志就是其中一台机器Connect Timeout了,在WebUI上点击这台机器IP的各种UI界面也是开不了,HDFS还连不上-_-|,之前也遇到过这种问题,解决方法简单粗暴:

  1. 重启Haddop集群:一般重启一下还正好了
  • Haddop集群,然后重启每台物理机,然后再开启Hadoop集群:这么做一般问题就可以解决-_-|
  • 还有一种就是直接去Linux上删除dfs文件目录,重新初始化HDFS:这么做效果虽达到了,但是。。。向HDFS传数据还很久一段时间。。

今天第1、2种方法试了都不行,第三种方法也太麻烦了(集群有15台DataNode+1台NameNode,重新初始化每次都要去每个机器上删除文件夹再新建),由于时间受限,就想尝试去动态的直接把那个老是异常的节点去掉得了,赶紧查了下面一些资料:

Read More

类和接口是Java程序设计语言的核心,它们也是Java语言的基本抽象单元。

第13条:使类和成员的可访问性最小化

尽可能使每个类或者成员不被外界访问。

Java的4种访问级别:

  • 私有的private:只有在申明该成员的类的内部才可以访问。
  • 包级私有的package-private:包内的任何类都可以访问这个成员,(这个是默认的访问级别
  • 受保护的protected:子类可以访问超类的protected成员,但是还有这个protected成员类的包内的任何类也可以访问
  • 公有的public:任何地方都可以访问这个成员。

如何方法覆盖了超类中的中的一个方法,子类中的访问级别就不允许低于超类的访问级别。

这样可以确保使用超类的实例的地方也可以使用子类的实例。

实例域是不能公有的。

其实就是建议类里面只暴露final修饰的变量成员,其他变量一律不要暴露。

长度非零的数组总是可变的。

就算你使用static final关键字将一个数组成员暴露出来,但是这个数组成员的内容还是可以被外部给修改的。你可以使用

  • 创建不可变量列表
  • 克隆这个对象

Read More

对于所有对象都通用的方法

类在继承时,它的所有非final方法都用明确得通用约定,他们都是被设计为要被覆盖的,对于任何一个类,在覆盖这些方法的时候,都需要遵循这些通用的约定,如果做不到这一点,其他依赖于这些约定的类将无法结合该类一起工作。

第8条:覆盖equals时请遵守通用约定

我们都知道equals方法称被用于判断两个对象是否相等(除地址外),那你知道该方法应该被如何设计呢?

equals方法需要遵循的约定:

  • 自反性:对于任何非null的引用值xx.equals(x)必须要true,也就是自己一定要和自己相等啊。
  • 对称性:对于任何非null的引用值xy,当前仅当y.equals(x)=true时,x.equals(y)=true一定成立。
  • 传递性:对于任何非null的引用值xyz,如果x.equals(y)=truey.equals(z)=true,则x.equals(z)=true一定成立,关于这点,写代码时难点主要是在有子类、超类同时存在的情况下比较难搞。。
  • 一致性:对于任何非null的引用值xy,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)返回的值一定相等。
  • 对于任何非null的引用值xx.equals(null)一定为false,关于这一条,不必要在equals方法是使用null的判断。

对于这些约束,编写equals有下面几个诀窍:

Read More

       由于实验需要在半年前开始接触Scala,之前也学习/使用过TIOBE榜上Top20中一半左右的编程语言,感觉还是Scala给我印象最深,最近没怎么做相关的开发感觉都开始慢慢淡忘了,上周在技术分享时我对Scala作了一些总结,顺便在这里写下。

Scala注意,本文主要是描述我所了解的Scala相关的基础语法,和Java相同得在这里就不再累赘。

我眼中的Scala

Scala是一种基于JVM的编程语言,集成了面向对象和函数式编程的特性,既能处理脚本化得临时任务,又能处理高并发场景下分布式大数据应用。

       Java就是因为有JVM虚拟机才成就了现在的辉煌,Scala同样是运行在JVM,大致可以看做Java的升级版,由于现在大数据大势所趋,各种大数据框架的出现导致了Scala强势崛起!
       编程初学者最先接触的应该就是”Hello,World”,而WordCount可以看做大数据编程的入门必学技能,所以现在我们在”Hello,World”上实现CharCount:

1
2
3
4
5
6
7
8
9
//Scala Application
val str="Hello,wrold"
val data=str
.split(Array(',',' '))

.flatMap(for(c<-_) yield (c,1)) //好Api
.groupBy(_._1)
.mapValues(_.size)

println(data)

Read More