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