using transitive-dependency’s version


problem

다음과 같은 dependency-tree 가 있다고 하자.

A <- B <- C

C 에서 Aversion 값을 사용하고자 할 때 어떻게 하면 될까?

solution

add direct (redundant) dependency

// C/pom.xml
<properties>
  <a.version>x.y.z</a.version>
</properties>
<dependencies>
  <dependency>
    <artifactId>A</artifactId>
    <version>${a.vresion}</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <artifactId>B</artifactId>
    <version>x.y.z</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

Now we can use the value of ${a.version} in other files.

A's version is ${a.version}.

enforce dependency convergence

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-enforcer-plugin</artifactId>
  <executions>
    <execution>
      <id>enforce</id>
      <configuration>
        <rules>
           <dependencyConvergence/>
        </rules>
      </configuration>
      <goals>
        <goal>enforce</goal>
      </goals>
    </execution>
  </executions>
</plugin>

how to set final variable in catch block?


references

as final as possible, but not final-er.

꽤나 오랫동안 궁금했었다.

final SecureRandom random;
try {
    random = SecureRandom.getInstanceStrong();
} catch (final NoSuchAlgorithmException nsae) {
    random = new SecureRandom(); // won't compile
    // variable random might already have been assigned
}

let it go, let it go~~~

그냥 이렇게 하면 되지 뭐…

SecureRandom random;
try {
    random = SecureRandom.getInstanceStrong();
} catch (final NoSuchAlgorithmException nsae) {
    random = new SecureRandom();
}

// ----------------------------------
// 권팀장 죽어버려!!! -퇴사자-
random = null;
// ----------------------------------

final int i = random.nextInt(128); // NPE

we will find a way. we always have.

지저분해 보일지도 모르겠다.

final SecureRandom random;
{
    Random random_;
    try {
        random_ = SecureRandom.getInstanceStrong();
    } catch (final NoSuchAlgorithmException nsae) {
        random_ = new SecureRandom();
    }
    random = random_;
}

메서드로 따로 빼 놓고 써도 되고, 뭐…

static SecureRandom secureRandomPossiblyStrong() {
    try {
        return SecureRandom.getInstanceStrong();
    } catch (final NoSuchAlgorithmException nsae) {
        return new SecureRandom();
    }
}

exclusive or with java


references

^

XOR 을 사용할 일은 많이 없을 듯 하지만, 의외로 사용할 일이 있을 때 모르고 지나치는 일이 있다. 아래 코드는 condition1condition2중 하나만 true 일 때 특정 작업을 수행하는 코드이다.

void some() {
    if (condition1) {
        if (!condition2) {
            // do some!                     // T F
            return;
        }
    } else { // !condition1
        if (condition2) {
            // do some!                     // F T
            return;
        }
    }
    assert (condition1 && condition2)       // T T
           || (!condition1 && !condition2); // F F
}

Exclusive OR 를 다음과 같이 사용할 수 있다.

void some() {
    if (condition1 ^ condition2) {            // T F | F T
        // do some!
    }
}

a voice of the costomer


비용을 지불하고 사용하는 서비스임에도 불구하고 VOC가, 대기업 특성상, 아주 더럽게(?) 사용될 수도 있다는 생각에 차마 SEND 버튼을 누르지는 못하였다. 아직 충분히 늙지 않았나보다.

고객센터에서 전화 응대를 받는 사람들은 문제가 없는데,

장애가 발생 문의 후 전화하는 새끼들은 싸가지가 장난이 아니다. 이건 뭐… 같은 회사 옆 부서 새끼가 툭툭대면서 전화하는 것 같다.

장애를 고치고도 (뭐 빨리 해 줄 필요도 없었는데) 우리가 마음이 좋아서 고쳐줬다.
확인해 보시든가…. 뭐 이런 자세다.

애시당초 “고쳐는 드릴께..!” 뭐 이런 느낌?

=====================================================================
두 가지를 문의드렸었습니다.

하나는 Cloud Console 에서 reseller 용 사용자 관리메뉴를 여쭤봤고
두번째는 uc????s????e-sdk에서 어떤 API를 사용하면 될지를 여쭤봤습니다.

언급하신 PDF의 해당 위치에 제가 문의드린 사항에 대한 설명이 있나요?

아래처럼 대답을 주셔야 하는 거 아닌가요?

현재 리셀러들을 위한 UI는 별도로 준비되어 있지 않습니다.
또한 uc??????-sdk 에도 해당 서비스에 대한 client API 가 준비되어 있지 않습니다.
API 를 이용한 연동방법은 아래 메뉴얼의 “제 7 장 Reseller service.” 를 참고하시기 바랍니다.

https://uc????b??.ol???.com/manual/????.pdf

문의하기 답변 제목 : Re: 리셀러 서비스에서 사용자(user)를 추가/갱신/삭제 할 수 있는 메뉴는 어디에 있나요
K? uc???? ????er를 사용해 주셔서 감사합니다.
문의하신 내용에 대한 답변을 드립니다.
[답변내용]
아래 메뉴얼의 “제 7 장 Reseller service.” 를 참고 부탁 드립니다.
https://uc????b.ol???.com/???/???.pdf
추가적인 문의 사항이 있으시면 재문의 주시기 바랍니다.
감사합니다.
답변 내용 이외의 응대에 대한 불만족 사항은 uc????b-??c@k?.?으로 보내주시기 바랍니다.

When are generated primary key values available?


JSR 338: JavaTM Persistence 2.1 says, in 3.5.3, that

Generated primary key values are available in the PostPersist method.

It’s a pity that even those ids with GenerationType.TABLE are not available in the PrePersist method and it’s a bigger pity that I didn’t rely on the spec.

public class MyEntity {

    @PrePersist
    private void onPrePersist() {
        derived = Stirng.format("%1$016x", id);
    }

    @GeneratedValue(generator = "some",
                    strategy = GenerationType.TABLE)
    @TableGenerator(
            ...
            name = "some",
            ...
    )
    @NotNull
    private Long id;

    @Basic(optional = false)
    @Column(name = "DERIVED", nullable = false, updatable = false)
    @NotNull
    private String derived;
}

I just found that above code doesn’t work with WildFly while works with Payara.

I have to change my database and the code.

public class MyEntity {

    @PrePersist
    private void onPrePersist() {
        //derived = Stirng.format("%1$016x", id);
    }

    @PostPersist
    private void onPostPersist() {
        derived = Stirng.format("%1$016x", id);
    }

    @GeneratedValue(generator = "some",
                    strategy = GenerationType.TABLE)
    @TableGenerator(
            ...
            name = "some",
            ...
    )
    @NotNull
    private Long id;

    @Basic // optional
    @Column(name = "DERIVED") // nullable, updatable
    //@NotNull
    private String derived;
}