Skip to content

Instantly share code, notes, and snippets.

View nobeans's full-sized avatar

Yasuharu Nakano nobeans

  • Yokohama, Japan
View GitHub Profile
@nobeans
nobeans / trait.groovy
Created January 28, 2016 04:47
A private member in super trait cannot be accessed from sub trait (and sub class)
trait TraitA {
def propA = "AAA"
private privatePropA = "aaa"
def doA() {
propA + privatePropA
}
}
trait TraitB extends TraitA {
def propB = "BBB"
def doB() {
@nobeans
nobeans / hide_by_static.groovy
Created January 27, 2016 08:48
staticメソッドの隠蔽
class Parent {
def hoge() {
aaa()
}
def foo() {
aaa()
}
static aaa() {
"PARENT"
}
@nobeans
nobeans / gorem.md
Last active June 24, 2017 07:50
拡張GORM: GOREM(仮)

拡張GORM: GOREM(仮)

現状のGORMの課題

  • ドメインクラスのインスタンスを持ち回ると、セッション外等で面倒なことになる
  • だからといってDTOへの変換をするのはだるい(無駄なクラス、バインディングの手間、等)
  • 同一の項目定義で異なるテーブルに対応づける構成が直感的ではない(継承等で可能ではあるが)
  • 複数パターンのバリデーションルールを使い分けられない(2.xでプラグインはあったが)
@nobeans
nobeans / optional.groovy
Last active January 15, 2016 03:14
Java8のOptional
def opt = Optional.of("HOGE")
assert opt.get() == "HOGE"
assert opt.isPresent()
assert opt.map { it * 2 }.get() == "HOGEHOGE"
assert opt.flatMap { Optional.of(it * 2) }.get() == 'HOGEHOGE'
assert opt.map { null } == Optional.empty()
// Optional.of(null) // => NPE
@nobeans
nobeans / test.groovy
Last active December 12, 2015 04:42
switchはbreakとかfall-throughとか気にしたくないしreturnで使いたいが、別メソッドに分けるほどでもないときに、クロージャを使うといいかもしれない、というサンプル
import static groovy.test.GroovyAssert.*
def hoge(x) {
switch (x) {
case 1: return "A"
case 2: return "B"
default: throw new Exception("HOGE")
}
}
def foo(x) {
@nobeans
nobeans / CaseConvertingXmlDataBinder.groovy
Created December 11, 2015 17:10
XMLデータバインダ
import grails.databinding.SimpleDataBinder
import groovy.util.logging.Slf4j
/**
* XML文字列のタグ名の{@code snake_case}と{@code camelCase}を変換してから、対象オブジェクトにデータバインディングします。
*/
@Slf4j
class CaseConvertingXmlDataBinder {
void bind(Object object, String snakeCasedXml) {
@nobeans
nobeans / trait.groovy
Created December 2, 2015 07:59
Immutablizable by trait
trait Immutable {
void setProperty(String property, Object o) {
throw new UnsupportedOperationException("$property is immutable: $o")
}
}
class Hello {
String hello(String name) { "$message, $name!" }
String getMessage() { "Hello" }
String setHoge(Object o) { "Set!(Duumy)" }
@nobeans
nobeans / gorm-float-array-postgresql.md
Created October 15, 2015 07:31
GORMでFloat[]を使うには(PostgreSQL)

GORMでFloat[]を使うには(PostgreSQL)

問題

何も対策せずにドメインクラスにFloat[]型のプロパティを定義すると、RDBMS上ではバイナリ型(BLOB型)としてマッピングされてしまう。

具体的には、配列をJava的にシリアライズしたバイト列が格納される。 GORMを通してアクセスする分には、ロード時に自動的にデシリアライズされるので、一見特に問題がないようにみえる。

しかし、これはあまりよろしくない。

@nobeans
nobeans / gorm-float-array-postgresql.md
Created October 15, 2015 07:31
GORMでFloat[]を使うには(PostgreSQL)

GORMでFloat[]を使うには(PostgreSQL)

問題

何も対策せずにドメインクラスにFloat[]型のプロパティを定義すると、RDBMS上ではバイナリ型(BLOB型)としてマッピングされてしまう。

具体的には、配列をJava的にシリアライズしたバイト列が格納される。 GORMを通してアクセスする分には、ロード時に自動的にデシリアライズされるので、一見特に問題がないようにみえる。

しかし、これはあまりよろしくない。

@nobeans
nobeans / cli-support.js
Last active August 29, 2015 10:05
JavaScript to create a command line of CLI at Spring Initializr site (https://start.spring.io/ )
var groupId = document.getElementById('groupId').value;
var artifactId = document.getElementById('artifactId').value;
var name = document.getElementById('name').value;
var description = document.getElementById('description').value;
var packageName = document.getElementById('packageName').value;
var type = document.getElementById('type').value;
var packaging = document.getElementById('packaging').value;
var javaVersion = document.getElementById('javaVersion').value;
var language = document.getElementById('language').value;
var bootVersion = document.getElementById('bootVersion').value;