ivaneye.com

Java环境与语法

简介

本文是对如何学习一门编程语言的具体实践-Java语言第一篇。

前面说了基础语法是很简单的,如果有语言基础,比较好的方法是过一遍Learn X in Y minutes

下文是在公司给毕业生做培训时的PPT,可做参考!

Java环境搭建

java -version

得到如下信息,则表示搭建成功!

java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

Java中需要理解两个路径:

第一个程序

//例子代码
public class Hello{
    public static void main(String[] args){
        int a = 1 + 1;
        int b = 1 + 2;
        System.out.println("(1 + 1) * 3 + (1 + 2) = " + (a * 3 + b));
    }
}

如何学习一门编程语言

简介

未来的应用必然是异构的,绝对不会限定在一门语言上,这就要求我们能根据需要快速的掌握一门语言。

本文就个人经历谈一谈如何快速的学习一门编程语言。主要面向已经掌握了一门语言的人。

学习目的

当你决定要学习一门语言的时候,请先问问自己为什么要学习这门语言? 如果答案是这门语言现在很火,那么可以洗洗睡了。生命苦短,好好玩乐吧,少年!

个人认为需要学习一门语言的动机有如下几个:

而第一种目的和第二,三中目的所要学习的程度则有差别。工作需要当然是越深入越好。提高效率则更偏向实用。拓宽思路则理解其思想即可。

确立了目标后才能更好的学习语言,比如你只是想拓宽思路,那么没必要死抠语法,理解其思想即可,语法忘了就忘了。如果是使用,那么后期需要频繁的使用,在使用的过程中反馈学习,才能有更好的效果。编程嘛,无他,唯手熟尔!

无论什么目的,都需要从基础开始!

环境与语法

首先是要摸清你要学习的语言的环境和基本语法。这个耗时不会很长,一般半天左右即可。

目前大部分语言都提供了傻瓜式的安装包,所以环境基本不是问题了。

语法的话,基本语法其实很简单。只要你有一门编程语言的基础,基本语法的学习也就是分分钟的事。无外乎:

等等,这些最基本的东西,只是各个语言在语法表达层面上的差异罢了!

语言的思想

基本语法只能说达到了Hello World的级别。而语言的思想则是核心重点。

当然,如果你会过程式语言,再学一门过程式语言,这个坎就比较小了(只涉及到一些小的语法层面的学习, 比如Java使用接口来实现多重继承,而ruby使用的是mixin)。但是如果你学过过程式语言,现在要学面向对象语言, 或者你会面向对象语言,要学习函数式语言,则需要重点越过这个坎。

Docker初探

Docker的用途

在程序的生命周期中,主要有开发,测试,发布环节。每个环节都需要部署相应的环境。

简单来说,Java使得程序能够一次编译到处运行,但是需要部署的每台机器都要部署jdk,server等,而每次部署都会是个耗时的过程,可能jdk版本不同,机器系统不同等导致部署环境不一致,进而导致无法发布应用的情况。

Docker的作用就是将整个应用连带部署环境一起打包。就是说开发时配置好的环境,可以一起打包,拷贝到测试,发布机器上直接去发布即可。

Docker的安装

windows下从下面的连接下载安装包!

https://github.com/boot2docker/windows-installer/releases

下载最新版本的:docker-install.exe即可。一路next,没什么好说的。

启动Docker

直接双击Boot2Docker Start即可启动。启动后会将c:/Users/{username}目录挂载过去,可以作为本地与docker的文件交互目录

SSH连接

可以通过SSH工具连接到Docker上进行操作!在Docker界面上通过 boot2docker ip 可以获取Docker的IP。默认的用户名和密码是: docker/tcuser

Java模块化:jigsaw初体验

简介

Java模块化一拖再拖,目前jdk9发布了包含jigsaw的先行版。本文为Project Jigsaw: Module System Quick-Start Guide的简译,及使用感受总结。

翻译正文

本文提供了一些简单的例子方便开发者熟悉模块化。

例子中的文件路径使用反斜杠和冒号分隔。Windows用户请修改为反斜杠和分号。

Greetings

第一个例子是个叫com.greetings的模块,它只是简单的打印"Greetings!"。这个模块包含两个源文件:模块定义文件(mmodule-info.java)和主类。

按规定,源文件需要在一个目录下,这个目录表示模块,目录名即模块名。

src/com.greetings/com/greetings/Main.java
src/com.greetings/module-info.java
$ cat src/com.greetings/module-info.java
module com.greetings { }
$ cat src/com.greetings/com/greetings/Main.java
package com.greetings;
public class Main {
    public static void main(String[] args) {
        System.out.println("Greetings!");
    }
}

Clojure绘制UML

简介

使用Clojure封装了Graphviz的使用,目前主要实现了UML的绘制

使用

以命令模式的UML为例,演示cdraw的使用

安装Graphviz

cdraw是对Graphviz的简单封装,请先安装Graphviz

添加依赖

[com.ivaneye/cdraw "0.2.0"]

定义类

(ns uml.core
  (:require [cdraw.uml :refer :all]))
 (defclass Client)
 (defclass Inboker)
 (defclass Receiver {:m ["Action()"]})
 (defclass Command {:m ["Execute()"]})
 (defclass ConcreteCommand {:f  ["state"] :m ["Execute()"]})

ClassLoader

什么是ClassLoader?

Java程序都是由若干个.class文件组成,程序的运行过程即是对class文件的调用。 程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要, 通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的, 只有class文件被载入到了内存之后,才能被其它class所引用。 所以ClassLoader就是用来动态加载class文件到内存当中用的。

Java默认提供的三个ClassLoader

示例:

import com.sun.nio.zipfs.ZipFileStore;
public class Test {
    public static void main(String[] args) {
        System.out.println("1".getClass().getClassLoader());
        System.out.println(ZipFileStore.class.getClassLoader());
        System.out.println(A.class.getClassLoader());
    }
}
class A{}

输出结果:

null                          //BootStrap ClassLoader输出为null
sun.misc.Launcher$ExtClassLoader@3e10c986
sun.misc.Launcher$AppClassLoader@610f7612

一致性协议

简介

一致性协议主要是为了解决分布式环境下的数据一致性问题。

对于单节点应用来说,数据的同步相对较简单。例如数据库的事务,多线程中的锁,都是为了保证数据的一致性。

而对于分布式环境来说,没有完善的强一致性解决方案。

在2000年,加州大学伯克利分校Eric Brewer教授提出了CAP猜想(后被证明可行):一个分布式系统不可能同时满足一致性(C:Consistency), 可用性(A:Abailability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。

后eBay架构师Dan Pritchett提出了BASE理论,即Basically Available(基本可用),Soft state(软状态)和Eventually consisent(最终一致性)。 其核心思想即无法做到强一致性,但系统可以根据自身做到最终一致性。

故对于分布式系统设计,目前的做法是保证可用性和分区容错性的基础上去实现最终一致性。

而对于最终一致性处理,比较著名的协议和算法便是:二阶段提交协议(2PC),三阶段提交协议(3PC)以及Paxos算法。