我参加了2014年春季的JJUG CCC

2014年春季JJUG CCC赛事

日期:2014年5月18日(星期日)9:30(入场时间9:00)
地点:西新宿贝尔萨尔

发表资料清单
http://www.java-users.jp/?page_id=1048


大家的看法

禁止在Java8中使用for循环和forEach循环!

对于当天最令人难以忘怀的一句话,我认为只能用这个来形容。
必须要像切换到面向对象语言一样彻底转变思维。

Java 在 Web 开发上的讲座令人震撼。

光看这份幻灯片就已经饱到差不多了。
最终我反思自己,只学了一点点语法,一个框架都没用上。
还学到了作为工程师,精神层面上对工作的重要性,比如说「因为太难用,所以自己造了一个」或者「设计应该建立在业务模型之上」等等。

我虽然没有亲自听过,但看到这个发言感到其他公司的培训非常棒,与我刚开始工作时的培训内容相比。

在精神层面上,“确认偏见”和“建设性互动”这两个话题也给我留下了深刻的印象。建立开发过程和团队体制时,心理管理起着重要作用。


对以下的每个会话进行笔记和感受总结。


K-1详述Java SE 8 – CCC 版本

樱庭祐一(Java in the Box)的Java SE 8 CCC版本。

Java8的变化是围绕着的。

希望简化控制结构

ProjectLambda素为并行计算而设计。然而,在需要可视化控制结构时,它经常被广泛使用。对于嵌套层次深的诸如for和if的语句,可以通过使用ProjectLambda的Stream等方式简洁地描述。

禁止使用for循环和forEach循环!

当想要提高表现水平时

首先使用性能分析应用程序。查看源代码稍后再说。
使用MissionControl或飞行模拟器。

我不想使用日期/日历。

当需要在Date和Calendar之间进行繁琐的转换时,可以使用Date&Time API。
Date和Calendar类是基于Unix的。
Date&Time是基于ISO8601的,并且是不可变的。
但是,有些类增加了一些。日期和时间是分开的。
例如LocalDate和LocalTime。

当需要进行静态代码分析才能入睡的时候。。。

类型注解。代码检查器的注解。
例如,如果将@NonNull指定为类型参数,静态分析时会发现可能出现空值的情况并报错。

咕咕……!

Swing被降级了。Swing将来不会再进行扩展或添加。
JavaFX啊!
JavaFX通过XML(FXML)创建GUI结构。有点像Android。
外观可以用CSS编写。逻辑可以用Java编写(也可以用JavaScript编写)。
不能使用Flash,但可以嵌入视频或使用3D。

对服务器端JavaScript很感兴趣。

Nashorn。Nashorn现在可以使用InvokeDynamic。
与Java7相比,在基准测试中获得了双倍的分数。

总结

使用Java8将改变程序的风格。
只要使用Lambda,就能完全改变Java7之前的编程。
可以在以下系列页面中确认所有相关内容。
http://itpro.nikkeibp.co.jp/article/COLUMN/20140212/536246/


关于K-2 Java 8的lambda表达式和Stream概述。

Stuart Marks在Oracle公司的个人简介。
网址:http://www.slideshare.net/OracleMiddleJP/overview-lambda-streams

由于Lambda表达式是函数,所以可以有参数并返回值。
在Java8之前,函数只能作为方法实现。
如果使用Lambda表达式,可以将其作为参数传递。
例如,在以前的写法中,如果要进行排序,需要将实例化的排序条件(按名称排序)等传递给Collections.sort()方法。

class Person {
  String name;
  int age;
  String getaName() { return name; }
  int getAge() { return age; }
}

List<Person> lis = ...;

class ComparePersonsByName implements Comparator<Person> {
  @override
  public int compare(Person p1, Person p2) {
    return p1.getName().compareTo(p2.getName());
  }
}

Clollection.sort(list, new ComparePersonsByName());

可以使用注解重写这个,但仍然是冗长的。 如果使用Java8来写,就会变成下面这样。编译器还可以进行类型推断。

List<Person> list = ...;
Collection.sort( list,
        (p1, p2) -> p1.getName().compareTo(p2.getName()))

Lambda表达式需要FunctionalInterface。而且它是同步的。

Java8中的实现示例简化

List<Person> list = ...;

#Old Format
for (Iterator<Person> iter = list.iterator(); iter.hasNext; ){
  Person p = iter.next();
  it ("Jones".equals(p.getName())) {
    iter.remove();
  }
}

#Format Java8
list.removeIf(p -> "Jones".equals(p.getName()));

List<String> list = Arrays.list("Alpha", "Bravo",
                      "Charlie", "Delta", "Echo");

#Old Format
for (Iterator<String> iter = list.iterator(); iter.hasNext; ){
  iter.set(iter.next().toUpperCase());
}

#Format Java8
list.replaceAll(s -> s.toUpperCase());
list.replaceAll(string::tiUpperCase); // method referecne

Java8以后,新增了默认方法。
可以在现有接口中添加方法的实现。
保持了向后兼容性。

Iteratable.forEach(lambda)
Collection.removeIf(lambda)
List.replaceAll(lambda)
List.sort(lambda)
  // replaces static method

在Java7中,我们使用Collections.sort()来进行排序。然而,要对特定列表的实现进行优化是困难的。但是,list.sort()可以提供比Collections.sort()更优化的排序操作。

流API

流自身是一种抽象概念。
StreamsAPI的主要特点是并行性。
StreamsAPI使用Lambda表达式。

示例影像

persons.stream() #ストリーム化している
        .map(p -> p.getName()) #nameの新しいストリームを生成している
        .filter(s -> s.codePointCount(0, s.length()) > 3) # 4文字以上というフィルター
        .sorted()
        .forEach(s -> System.out.println(s)); #終端操作ストリームの操作を評価するLambda式

通过在流中使用parallel(),可以执行并行处理。

请将以下内容用中文进行改写,只需一种选项:

用Java 8尝试实现关系型数据库管理系统(RDBMS)

[Optional paraphrase in Chinese]

九州Java社群的酷叔 (Java Community @ Kyushu)

在RDB中,关系引擎和执行引擎起着重要的作用。
关系引擎负责创建将SQL传递给执行引擎的物理计划。
也就是说,可以将执行引擎理解为将SQL语句转换为其能够理解的编译器。

勉强使用数据库规范

    • シングルスレッド

 

    JOINはLEFT INNERのみ。

在Java中的数据库

    • あんまり向いていない

 

    関数言語(ScalaやHaskell)のほうがいい。

只要有Java8的话,可以使用Lambda、Stream和Optional,所以情况就不同了。有了Java8和lombok,即使不使用函数式语言,也可以使用关系型数据库。

在创建数据库时。。。

数据库的生命周期比应用程序长。因此,版本有效期较短的语言是不适合的。

作为解析器,我使用了JParsec库进行了实现。
– 自顶向下解析
– 移植自Haskel的parsec
– 解析组合器(仅通过参数确定结果的函数)
– 内部领域特定语言
– 但由于缺乏文档,难以进行超出教程范围的工作。

对以下内容进行本地化的汉语释义,只需提供一个选项:

解析文字和句子的含义

基本上將其視為正則表達式。
將令牌稱為終結符號。

句法分析

从令牌序列创建句法树。
与正则表达式的区别在于可以在模式中使用模式。可以嵌套定义。

数学表达式解析

数学表达式的优先级决定采用自底向上的解析方法。

关系代数

与SQL和关系代数不同

在这附近遇到了挫折。


开始学习 Apache Cassandra 的 Java R2-2 版本

森下雄贵(DataStax)

卡桑德拉自诞生起已有五年历史。
它是用Java编写的分布式数据库,由Facebook开发并捐赠给Apache软件基金会。

使用範例

Cassandra被选择的原因有三个主要的方面。

    • スケーラビリティが優れている

 

    • 時系列データの超高速書き込みができる

 

    アベイラビリティが優れている。データセンターロスなどに対応しやすい。

聚类

P2P的分散系统
由于每个节点扮演相同的角色,所以具有高度的冗余性。
由于没有主节点,没有单个故障点。即使有一定数量的节点宕机也没有问题。
数据被保存在多个节点上(复制)。
可以灵活地配置以跨越多个数据中心进行数据存储等设置。

支持多数据中心

可以将数据复制到东京的数据中心,然后转移到国内的数据中心,或者在线/离线分离节点。

线性可扩展性

当增加数据中心时,只有Cassandra会显著地呈线性增长。

数据写入

当收到写入请求时,磁盘I/O负载低、响应客户端迅速。同时定期进行内存刷新操作。

读取数据

阅读速度相对写入速度稍慢,因为合并需要一些时间

储存模型

因为BigTable的ColumnFamily是基于分区键和单元格名称进行排序的,所以非常适合处理时序数据。

易于开发

具备CQL3功能。

节俭的 RPC API

直接操作存储引擎的原始数据访问方法。

CQL3 三点全局查询语言

目前可以使用SQL类似的语法来获取数据。
Cassandra Query Language 版本3
与关系数据库(RDB)类似,可以创建索引、创建用户。
虽然与SQL相似,但以下功能并不存在:
– JOIN(连接)
– 子查询
– 聚合函数

CQL3是建立在Cassandra存储引擎之上的。

从Java应用程序中访问的方法

选择Cassandra驱动程序

正在开发CQL3的二进制协议,以克服RPC为特征的Thrift API的限制。通过使用二进制协议,

    • 非同期通信のサポート

 

    • サーバプッシュ

 

    • ページング

 

    その他新機能を追加しやすい。(Thrift APIに依存しないので)

DataStax Java driver 数据斯坦克斯Java驱动

开源驱动程序。可在Github上公开,并可以通过Maven等方式使用。

连接到集群。

由于它不是关系型数据库(RDB),所以它不遵循JDBC。

执行CQL

可以通过获取Session对象来执行CQL。

查询生成器

不直接编写CQL文,而是在程序中构建。

文档

尽管是英文原则,但我们在网络上公开了Javadoc等文档。


请在Java开发中充分利用Git、CI和持续交付。

长泽智治(Atlassian公司福音布道者)

Atlassian是一家提供JIRA和Bitbucket等工具的公司,旨在提供各种开发支持工具来全面支持开发生命周期。

走向商业驱动的开发世界
商业和软件的关系是密不可分的。
最理想的情况是软件驱动商业的发展。

欢迎来到持续交付的世界

推进BLM循环(建立、学习、衡量)。

确保从企划到发布的所有可追溯性。(可通过Atlassian应用实现!)

使用JIRA、SourceTree、Confluence、HipChat、Stash、Bamboo进行演示。

    • 全てのツールがシームレスに移動することが可能。

 

    • デプロイなどの操作も可能

 

    • SourceTreeから直接プルリクすることも可能。

 

    • 自動テストした結果はHipChatなどに通知可能

 

    • 全ての情報はJIRAに集約されている。

 

    • レビューはStash上でできる。行単位でコメントをすることも可能

 

    • ほとんどの操作がJIRAから行うことも可能。

 

    • トレーサビリティがあるので、わざわざ報告書など作らなくても、企画要件からチケットやテスト結果を参照することができる。

 

    全てのチケットが終了すれば、企画要件のステータスがCloseになる

整理

计划和代码的粒度不同。观看者也不同。重要的是确保所有流程都以各自的立场和粒度始终可见。

    • モチベーション

 

    • 目的|規律|見える化

 

    良い物を取り入れる有機

据说,一个人改变需要花费至少一年的时间。
建立一个能让自己意识到需要改变的环境很重要。

重要的是建立一個不受確証偏見影響的環境,可以進行建設性的互動。


H-4 Java 调试技巧 ~从直觉调试和打印调试中解脱~

山本裕介是一个自由职业者,专注于Java编程和打印技术。他在SlideShare上分享了一个有关Java打印的演示文稿,该演示文稿是日本Java用户组和Cloud Computing Community发布的第四章内容。

调试是指在软件开发过程中,通过检测和解决错误来确保程序的正确运行。

    • バグ修正

 

    副作用がないように。密結合だと大変

在发现错误的时机

从编码开始,到生产环境。越早越好!
技术难度和政治难度延后发展,变得越高。
调试器可以在生产环境中发挥作用。

调试器 vs 单元测试

单元测试:
– 确认实现是否符合预期。
– 检查输入是否得到预期的输出。

调试器:
– 分析未按预期工作的实现。
– 避免通过大量的调试/打印语句来使代码变得混乱。

在单元测试中进行调试的目的和手段是错误的,可能导致粒度过细。本来只需确认接口是否正确即可。单元测试只是能发现回归错误的最基本测试集。逻辑确认和调试应该使用调试器进行。

调试方法

确认复现条件、创建测试案例、修正相应代码
确认复现条件非常困难!→在调试器中确认!

调试器所做的事情。

执行步骤,修改数值等等

调试器不会做的事情

在中国造句中进行修改:
通过使用性能分析工具等,无法找到性能瓶颈的问题。在主要使用步进调试器等方法的情况下也难以深究定时问题的原因。同时,也很难发现由外部因素引起的问题。

今天需要解释的事情

    • ラインブレークポイント

 

    • ステップ実行

 

    • 条件付きブレークポイント

 

    式評価/ウォッチ

常见的问题在断点处

    • ループ内をデバックしたい

 

    • ブレークポイントを設定するが、問題発生まで何回もコンテニューしなくてはいけない。。。

 

    →条件付きブレークポイントを使いましょう。

远程调试

    • JPDAを利用している

 

    デバッグをするための標準インターフェース

需要添加执行选项才能启用。重要的选项是suspend=n,address=5005等等。
这指定了调试器监听的端口以及在连接之前是否停止。

生产环境中的调试

如果没有进行附加操作,即使启用也不会影响性能。
安全性非常脆弱,没有认证机制。
如果不需要,请务必禁用。
在生产环境中,只需指定监听地址为localhost,允许附加操作。
通过ssh隧道进行远程连接可以提供一定程度的安全性。

在开发中常见的问题

    • CI環境のみで再現

 

    • たまにしか再現しない

 

    • print文を入れたら再現しない

 

    etc…

常見的解決方法

引言: Chronon: The Time Travelling Debugger是一个非常方便的工具

在这篇文章中,我们介绍了Chronon: The Time Travelling Debugger,这是一个非常实用的工具。它可以帮助开发人员在调试过程中回溯时间,找到bug产生的具体原因。我们可以使用该工具来记录应用程序的执行历史,并且能够在不影响程序运行的情况下进行回放和观察。

Chronon通过代理Java虚拟机来实现时间回溯功能。它会在运行时记录应用程序的所有状态,并将其保存为后续调试所需的日志文件。使用Chronon,我们可以在任意时间点暂停程序的执行,然后逐步回放和检查各个状态的变化。这对于定位难以复现的bug或者理解复杂的程序行为非常有帮助。

除了时间回溯功能,Chronon还提供了其他一些有用的调试工具。例如,它可以跟踪内存分配和垃圾回收,帮助我们优化内存使用。此外,Chronon还支持断点和评估表达式等常见的调试操作,使我们更加有效地进行调试。

总而言之,Chronon: The Time Travelling Debugger是一个功能强大且实用的工具。它能够帮助开发人员更轻松地进行调试,并加快bug修复的速度。无论是定位难以重现的bug还是理解复杂程序行为,Chronon都能为我们提供很大的帮助。

使用IntelliJ IDEA可以在IDE内部或CI环境中记录信息。性能开销也较低。还可以只记录特定类的信息。使用IntelliJ IDEA是免费的。

总结一下

使用调试的时机
– 不要在代码中添加临时的调试语句
通过快捷键和带条件的断点来高效调试
对于离线调试,可以使用Chronon Time-travelling调试器来进行有效调试。


近年来的Java Web开发(2014年春季)存在的问题有以下六点:
1、封装性不足,容易导致代码混乱和不易维护;
2、性能优化不够,系统响应速度慢;
3、安全性不全面,容易受到恶意攻击;
4、界面设计和用户体验较差;
5、缺乏灵活性,业务需求变更困难;
6、代码规范不统一,可读性不好。

這個簡報介紹了文字拓郎(或稱為「シンプレクス」)對於 SPA 開發的相關內容。

Java + SPA開發案例,項目整體感知

因为内容非常丰富,所以我没能记住所有的东西。
可能最好还是看幻灯片吧。

项目概述

金融机构专用的Web应用程序。
适用于海外项目,必须使用WebLogic。这是我第一次接到的Web项目。

现有系统存在的问题

尝试参考其他机构的现有Web系统,但发现系统结构缺失和无法跟上客户端技术的进步。

单页应用程序(SPA)

可以将客户端和服务器端分离。

不稳定因素 (bù

在进行backbone.js的分析和克隆创建时,解决技术知识不足是可能的。

层叠

确保能够完全分离网络任务和业务结构。
网络层仅负责提供API。

客户端和API可能会随时变化,但领域不会改变。

服务器端

由于WebLogic较为笨重,在开发过程中使用jetty进行实施。

Gradle

与Maven不同,即使对它一无所知也能使用。还能动态创建环境。

番石榴

我认为没有人不使用,所以省略

领域模型

在技术方法论之前,
– 对业务感兴趣
– 不仅考虑现状,还考虑未来
– 不要阻止进化

如何设计商业模式?

思考

    • エンジニアが最も価値を出すべきところ

 

    ビジネス上の課題をエンジニア的に解釈する

不停止进化

毋需猶豫,立即修正。持续改善。

域模型的实现方针

在领域中进行没有副作用的操作,而在服务端进行有副作用的操作。
将依赖信息分离,并在应用程序端进行实现。

服务层实施策略

根据业务需求进行创建。
无需考虑Web方面。

网页界面的实施策略

不撰写业务逻辑,专注于编写Web的API(IN/OUT)。我们选择了JAX-RS。虽然Spring MVC可能是最好的选择,但它太庞大了。在创业公司中,常常使用DropWizard。

REST层

我使用Jackson进行JSON和YML的转换。

我所在意的地方

不要过于坚持REST原则。
API需考虑到客户端的需求。

服务器端的总结

服务器端都是“普通”的延伸
由于J2EE服务器太重,所以无法用于开发的情况。

客户端

基于Grunt,我们选择了Backbone.js来替代Angular和Ember这样的重型框架。而且我们使用了CoffeeScript来编写代码。为了补充功能的不足,我们还使用了Backbone.Marionette。

我将用Backbone构建的示例上传到了Github,所以代码等请前往那里查看。

客户端的测试几乎没有做。
图形用户界面的测试不值得投入实施成本(如果有频繁的发布,则另当别论)。

客户端的总结

SPA是值得采用的。它可以提升用户体验,并在开发方面实现代码分离。
不过,相比母语还是有所不及。无法介入渲染流程。

概括

SPA开发是在“普通”的延伸线上。不可怕。(如果可以设计的话)
最好使用简单的组件组合
需要持续地追赶。


从R1-7的服务器端JavaScript标准的角度来看,Nashorn的意义是什么?

酒巻瑞穗是HTML5J企業部门的一名Firefox OS代码阅读员。

    • ScriptのついてるほうのJavaの話

 

    Nashornコードや内部アーキテクチャの話はググればでてくるので割愛

JavaScript 历史上的服务器端

摩卡(Mocha)是在Nesuke上运行的,后来演变为LiveScript。之后,ServerSide JavaScript的鼻祖LiveWire诞生了。随着Nesuke 2的发布,从LiveScript转为JavaScript。与此同时,SpiderMonkey的克隆Rhino的开发也开始了。JavaScript系列的ECMAScript被制定为标准,各个浏览器开始实现JavaScript。尽管服务器端也在顺利发展,但随着ASP的出现,逐渐被淘汰。自从谷歌推出了V8引擎之后,ServerSide JavaScript等开始兴起。独立的解释器开始泛滥,导致混乱。CommonJS的出现使得架构逐渐统一为标准。Node.js被发布,ECMAScript 5.1也被发布。Node.js开始与Common.js分离。2014年,Nashorn被搭载在Java8中。

Nashorn是什么?

從Java8開始,JS引擎已被標準搭載。它也包含在JRE中。

为什么在Java中使用JavaScript

通过JavaScript,可以进行服务组合开发(即复合开发)
无论是在客户端(JavaFX)还是服务器端,都可以编写应用程序。

使用Nashorn时需要注意的事项

自Java8开始,jdk/jre中都包含了”jjs.exe”。而ScriptEnigineManager中的内容是Nashorn。

即“现在的服务器端JavaScript”。

レイヤー規格アプリケーション層ServerSide JavaScript Applicationインタプリタ層Vert.X、GromJS、NodeJSエンジン層Rhino SpiderMonkey、GoogleV8記述言語Java、C/C++

Nashorn是一个引擎层。

JavaScript功能比较

使用Nashorn运行Google Octane基准测试的得分显著低于预期,这是因为每次运行时都需要进行编译的缘故。如果正确编译,就能达到与Google V8引擎相当的分数。

ECMA-262是依据标准制定的,并且严格模式被正确执行。
处理器经过即时编译后,一旦执行就能获得稳定的速度。
相比于引擎本身的价值,它更具有作为使用Java资源的解释器的价值。

摘要

对于Java工程师来说,Nashorn是什么意思。

JRE所包含的是学习门槛较低的内容,可以用Java创建资产,然后用JavaScript进行资产共享。

对于JS工程师而言,Nashorn是一个重要的工具。

只有引擎层才会使用原生的JS来开发应用程序。
虽然在Shell上功能有些扩展,但在创建应用和服务方面力量不够。
如果能够使用基于Nashorn的VertX之类的东西,可能会不知不觉中获得好处……
对于服务器端的人来说,NodeJS可能已经足够了……

关于JavaScript

随着ECMAScript6的推出,Java工程师应该能够更轻松地转变技能,因为语言学习的资源已经准备好了。它被广泛用于前端和后端开发,并在物联网的发展中扮演着重要角色。各大厂商最近也都在大力推动。

广告
将在 10 秒后关闭
bannerAds