중복된 HTTP 헤더는 모든 경우에 가능한가?


references

rfc-2616

4.2 Message Headers 에 다음과 같이 씨부라려져 있다.

Multiple message-header fields with the same field-name MAY be
present in a message if and only if the entire field-value for that
header field is defined as a comma-separated list [i.e., #(values)].
It MUST be possible to combine the multiple header fields into one
"field-name: field-value" pair, without changing the semantics of the
message, by appending each subsequent field-value to the first, each
separated by a comma. The order in which header fields with the same
field-name are received is therefore significant to the
interpretation of the combined field value, and thus a proxy MUST NOT
change the order of these field values when a message is forwarded.

잘못된 해석을 한 번 하자면 다음과 같다.

그냥 됨.

간단하게 쓰면 될 일을 왜 저렇게 썼는지 곰곰히 살펴보도록 하자.

Multiple message-header fields with the same field-name MAY be
present in a message

여기까지는 좋다. 근데..

                     if and only if the entire field-value for that
header field is defined as a comma-separated list [i.e., #(values)].

if and only if 와 그 뒤의 내용이 좀 껄쩍지근한 건 단지 느낌일 뿐인걸까?

It MUST be possible to combine the multiple header fields into one
"field-name: field-value" pair, without changing the semantics of the
message, by appending each subsequent field-value to the first, each
separated by a comma.

이 부분이 좀 중요한 것 같다. 역설적으로, 만약 다음과 같은 사용될 수 있다면,

My-Awesome-Header: value1
My-Awesome-Header: value2
My-Awesome-Header: value3

다음과 같이 콤마(‘,’)로 분리해서 한꺼번에 사용해도 동일한 의미와 순서를 가지는 헤더에 한해서, 위에 있는 것 처럼, 같은 이름으로 나눠서 사용할 수(MAY) 있다는 얘기다.

My-Awesome-Header: value1,value2,value3

Accept 헤더를 다음과 같이 사용하면

Accept: application/xml
Accept: application/json

원래는 아래와 같이 사용해야 하는데 (그렇게 정의되어 있다.) 위처럼 사용할 수 있다는 의미다.

Accept: application/xml,application/json

하지만 Content-Type 를 다음과 같이 사용하면 안될 듯 하다.

PUT /items/1 HTTP/1.1
Host: whatever
Content-Type: application/xml
Content-Type: application/json

ㅋㅋㅋ

다음과 같은 응답메시지를 볼 수 있을지도…

HTTP/1.1 400 씨발새꺄 장난하냐?

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?.?으로 보내주시기 바랍니다.