'분류 전체보기'에 해당되는 글 393건

  1. 블랙프라이데이 운동화 추천, 나이키 팩토리 스토어 구로NFS점
  2. 정전용량 무접점 키보드 추천, 레오폴드 FC660C 영문 그레이
  3. Java, 텔레그램 메시지 전송하기
  4. Java 8, 타임존이 포함된 ISO 8601 문자열을 LocalDateTime으로 변환하기
  5. 미니소 오소니 OS-H2 초음파 가습기 사용기, 구매 후기
  6. Amazon S3 REST API로 살펴보는 HMAC 인증
  7. 마리아로렌 울템 안경테, 세이코 비구면 초발수코팅 안경렌즈 구매 후기
  8. EPL 2017-2018 시즌 토트넘 핫스퍼 베스트 스쿼드 11
  9. Spring Boot, Jackson, @JsonView로 멀티 뷰 구성하기
  10. CentOS 6, Zulu(OpenJDK 8) 설치하기

블랙프라이데이 운동화 추천, 나이키 팩토리 스토어 구로NFS점

블랙프라이데이가 오다

  • 2017-11-24, 직구족이 환영할 블랙프라이데이 세일이 시작되었다. 다분히 영미권 문화라 국내에서는 큰 기대를 안했는데 가산디지털단지역 4번 출구 W-MALL 6층에 위치한 나이키 팩토리 스토어 구로NFS점에 들렀다가 생각치 못한 광란의 블랙프라이데이에 운동화를 2족 사왔다.

  • 나이키 팩토리 스토어의 블랙프라이데이는 11-24 ~ 11-26 3일간 진행되고 있다. 태그에 붙은 최종 판매가에서 추가로 20%를 더 할인하여 판매하고 있으니 운동화 또는 의류를 구매하기에 아주 좋은 기회라고 할 수 있다.

지름의 결과

  • 나이가 30대로 들어서고 자유복이 허용되는 직장만 고집하다 보니 입고 신는 것에 대한 선호가 명확해졌다. 사계절 옷은 유니클로, H&M, 탑텐에서 세일 기간에만 구매하고 운동화(라고 쓰고 전투화라고 읽는다)는 나이키에서 세일 기간에만 구매한다. 특히, 발에 촥 달라붙는 나이키의 AIR MAX 시리즈는 내 최애템 중 하나이다.

  • 이번에 구매한 운동화는 NIKE AIR MAX BW ULTRA SE(255)와 NIKE COURT ROYALE LW SLIP(255) 2족이다. 각각 63,600원(원가 159,000원), 19,000원(원가 79,000)원에 구매했다. 나이키 운동화 2족을 구매했는데 합쳐서 82,600원이니 블랙프라이데이의 위력을 실감할 수 있었다.












저작자 표시 비영리 동일 조건 변경 허락
신고

정전용량 무접점 키보드 추천, 레오폴드 FC660C 영문 그레이

또 다른 세계, 정전용량 무접점 키보드

  • 수년간 소프트웨어 개발자로 먹고 살고 있지만 전자제품에 무심한 편이라 키보드 또한 처음 PC를 구매할 때 사은품으로 딸려오는 만원대의 지극히 일반적인 멤브레인 키보드를 사용했었다. 키보드는 그냥 슈퍼마켓 갈 때 신는 삼디다스 슬리퍼 같은 녀석으로 취급했다.

  • 그러다 동료 개발자인 P군이 소유한 정전용량 무접점 키보드인 리얼포스87을 두들길 기회가 생겼다. 기계식 키보드를 건너뛰고 접한 끝판왕 키보드는 완전한 신세계였다. 삼디다스 슬리퍼에서 크록스로 갈아탄 그 느낌! 너무 강렬했다.

  • 하지만 가격이 문제였다. 키보드에 36만원을 투자하기란 쉬운 결정이 아니었다. 결국 반값에 같은 방식으로 제작된 토프레 사의 타입 헤븐 104를 구매했다. 그런데 앞서 느꼈던 그 느낌이 없었다. 딱딱한 초콜렛이 서걱거리는 느낌은 그다지 유쾌하지 않았다. 같은 정전용량 무접점이라고 타건감이 같은 것은 아니었던 것이다.

레오폴드 FC660C

  • 한동안 타입 헤븐 104에 적응할 무렵, 생각치 않게 레오폴드 FC660C를 쿨매로 득템하게 되었다. 과연 이 녀석은 어떨까?

  • 첫 인상은 충격적이었다. 과연 이렇게 아담한 크기의 키보드로 과연 스트레스 없는 작업이 가능할까 의문이 들었다. 타건을 시작한 결과 내 걱정은 기우였음이 드러났다. 레오폴드 FC660C의 타건감은 수치적으로 설명하기는 힘드나 그냥 기분이 좋다. 굉장히 깔끔하고 묵직한 타건감을 느끼게 해준다. 그냥 대만족이다.

  • 걱정되는 것은 처음 써보는 텐키리스 키보드의 불편함이었다. 오른쪽 숫자키 패드는 과감히 제거되고 펑션 키로 중첩 사용하게 되어 있다. 당장은 적응이 안됬지만 마치 게임 단축키처럼 적응할 수 있을거란 생각이 들었다. 펑션 키가 적용된 레이아웃을 보면 동선을 최소화할 수 있게 고민한 흔적이 보인다.

  • 장점과 단점이 인지될 무렵 꼬꼬마 학창 시절부터 20년째 키보드로 즐기고 있는 게임 시리즈의 최신작인 위닝 일레븐 2018을 플레이했다. 리버풀로 아스날을 6-1로 바르고 나는 외쳤다. 이건 내 인생템이다!







저작자 표시 비영리 동일 조건 변경 허락
신고

Java, 텔레그램 메시지 전송하기

개요

  • 애플리케이션에서 로그 만큼이나 중요한 것이 특정 상황에 대한 알람(Alert) 기능이다. 가장 전통적인 수단은 이메일 또는 SMS로 알람 메시지를 전송하는 것이다. 최근 들어 별도의 인프라 구축 비용이나 과금이 없이 손쉽게 알람 메시지를 전송하는 수단은 텔레그램 메신저를 이용하는 것이다. 세계에서 가장 안전하며 무료라는 장점이 있다. 이번 글에서는 Java 애플리케이션에서 텔레그램 메시지를 전송하는 방법을 소개하고자 한다.

전제 조건

  • 애플리케이션에서 텔레그램으로 메시지를 전송하려면 봇(Bot)을 최소 1개 생성해야 한다.

  • 메시지를 전송할 특정 채팅방 또는 그룹방에 앞서 생성한 봇이 초대되어 있어야 한다.

  • 위 상태에서 에게 발급된 botToken과 해당 채팅방(그룹방)chatId를 획득하면 메시지를 전송할 준비가 완료된다.

텔레그램 봇 생성 및 토큰 발급

  • 새로운 봇을 생성하려면 모든 봇을 관리하는 BotFather를 친구 추가해야 한다. 텔레그램 클라이언트가 설치된 모바일 또는 데스크탑 웹 브라우저에서 https://telegram.me/botfather에 접속하고 SEND MESSAGE 버튼을 클릭하면 내 계정에 BotFather가 친구로 추가되어 대화할 수 있다.

  • BotFather와의 대화 창에서 /newbot을 입력하면 새로운 봇을 생성하기 위한 질문이 시작된다.

  • 가장 먼저 봇의 name을 묻는다. 실제 텔레그램에 노출되는 이름이므로 쉽게 인지할 수 있도록 적절히 입력한다. 그 다음 질문은 봇의 username을 묻는다. 시스템이 인지하기 위한 이름으로 작명은 자유롭지만 반드시 마지막이 Bot 또는 bot으로 끝나야 한다.

  • 생성한 봇의 name, username에 대한 답변이 완료되면 해당 봇을 위한 token이 발급된다. Bot API를 이용할 수 있는 토큰 정보이므로 잊지 말고 잘 기록해둔다.

  • 토큰 값을 이용하여 아래와 같이 봇 정보를 조회할 수 있다.
GET 'https://api.telegram.org/bot{token}/getMe'
HTTP/1.1 200 OK
{
    "ok": true,
    "result": {
        "id": 472939985,
        "is_bot": true,
        "first_name": "{name}",
        "username": "{username}"
    }
}

텔레그램 채팅방 ID 발급

  • 앞서 생성된 봇의 token을 확보했으니 이제 현재 봇과 대화중인 채팅방(chat.id)을 알아야 한다. 아래와 같이 API를 조회하여 확보할 수 있다. result[].message.chat.id 값이다.
GET 'https://api.telegram.org/bot{token}/getUpdates'
HTTP/1.1 200 OK
{
    "ok": true,
    "result": [
        {
            "update_id": 653055795,
            "message": {
                "message_id": 3,
                "from": {
                    "id": 59524576,
                    "is_bot": false,
                    "first_name": "json",
                    "last_name": "object",
                    "language_code": "ko"
                },
                "chat": {
                    "id": {chatId},
                    "first_name": "json",
                    "last_name": "object",
                    "type": "private"
                },
                "date": 1510808019,
                "text": "hello"
            }
        }
    ]
}

Java에서 텔레그램 메시지 전송하기

  • 이제 특정 채팅 창으로 메시지를 전송하기 위한 준비물인 botToken, chatId가 확보되었으니 Java 애플리케이션에서 텔레그램 메시지를 채팅방에 전송해보자. 가장 먼저 아래와 같이 라이브러리 종속성을 추가한다.
compile group: 'com.github.pengrad', name: 'java-telegram-bot-api', version: '3.4.0'
TelegramBot bot = new TelegramBot("{botToken}");
SendMessage request = new SendMessage({chatId}, "hello, world!")
        .parseMode(ParseMode.HTML)
        .disableWebPagePreview(true)
        .disableNotification(false)

SendResponse sendResponse = bot.execute(request);
boolean ok = sendResponse.isOk();
Message message = sendResponse.message();
  • 텔레그램에 전송할 메시지의 형식은 Markdown, HTML 2가지를 지원한다. 지원하는 태그는 매우 제한적인데 대표적으로 텍스트에 색상을 입힐 수 없다. 오로지 Bold, Italic, Link만 제공한다.
// Markdown
*bold* _italic_ [link](http://jsonobject.com)

// HTML
b>bold</b> <i>italic</i> <a href="http://jsonobject.com">link</a>
저작자 표시 비영리 동일 조건 변경 허락
신고

Java 8, 타임존이 포함된 ISO 8601 문자열을 LocalDateTime으로 변환하기

타임존?

  • 과거에는 개발자들이 타임존을 크게 신경 쓰지 않았다. 하지만 시스템 또는 플랫폼 간의 의사소통 방식으로서의 API가 대중화되고 서비스 지역이 전세계로 확장되면서 API 요청 및 응답에 있어 타임존 정보를 적절하게 인식하고 가공하는 작업이 중요해졌다. 이번 글에서는 Java 8에서 타임존이 포함된 날짜/시간 정보를 다루는 방법을 소개하고자 한다.

타임존 포함 ISO 8601 문자열의 표현

  • 날짜/시간 및 타임존을 다루는 국제적인 규약은 상당히 다양하다. RFC 822, 1036, 1123, 2822, 3339, ISO 8601 등이 있다. 여기서는 ISO 8601RFC 3339와 관련된 표기법을 소개한다.
// 로컬 시간을 의미하는 ISO 8601 문자열
2017-11-06T15:00:00.000

// UTC(GMT) 시간을 의미하는 ISO 8601 문자열
2017-11-06T06:00:00.000Z

// 로컬 시간을 의미하면서 UTC(GMT) 대비 +09:00 임을 의미하는 ISO 8601 문자열
2017-11-06T15:00:00.000+09:00
  • 2017-11-06T15:00:00.000ISO 8601의 기본 형식이다. 해당 시간이 로컬 시간 임을 의미한다.

  • 2017-11-06T06:00:00.000Z와 같이 뒤에 Z 식별자를 추가하면 해당 시간이 UTC(GMT) 시간 임을 의미한다.

  • 2017-11-06T15:00:00.000+09:00와 같이 뒤에 Z 대신 +HH:mm 식별자를 추가하면 해당 시간이 로컬 시간이면서 UTC(GMT)09:00 만큼 차이가 남을 의미한다. 이 형식의 장점은 인간이 손쉽게 추가적인 계산 없이 로컬 시간을 인지하면서 추가적으로 타임존 정보까지 제공하기 때문에 가장 인간친화적이라고 할 수 있다.

일광 절약 시간제의 고려

  • 일광 절약 시간제(Daylight Saving Time; DST)는 우리에게는 서머 타임으로 유명한 개념으로 하절기에 표준시를 원래보다 1시간 앞당겨 쓰는 것을 의미한다. 일광 절약 시간제의 적용 여부와 시기는 국가마다 다르며, 미래에는 각 국가의 법이 어떻게 변할지 아무도 알 수 없다. 일광 절약 시간제가 적용된 국가(대표적으로 미국)의 시간 정보에 있어 유의할 점은 미래 시간의 경우 정확한 UTC 시간을 예측할 수 없다는 것이다. 따라서 이 경우 내부적으로 로컬 시간으로 저장해야 한다.

타임존 포함 ISO 8601 문자열의 LocalDateTime 변환

try {
    // 타임존이 포함된 ISO 8601 문자열로부터 Asia/Seoul 타임존의 LocaDateTime 오브젝트 획득
    LocalDateTime dateTime = LocalDateTime.from(

        Instant.from(
            DateTimeFormatter.ISO_DATE_TIME.parse("2017-11-06T06:02:00.000Z")
        ).atZone(ZoneId.of("Asia/Seoul"))
    );

// 파씽 오류시 DateTimeParseException 예외 발생
} catch (DateTimeParseException ex) {

    // 예외 처리 로직 작성
}
  • DateTimeFormatter.ISO_DATE_TIME.parse()는 파라메터로 앞서 언급한 3가지 표기법을 모두 지원한다. 지원하지 않는 표기법의 경우 DateTimeParseException 예외를 발생시킨다.

  • LocalDateTime은 순수하게 로컬 시간 만을 표현하는 클래스이다. 앞서 인식된 문자열을 로컬 시간으로 변환하기 위해서는 현재 시스템에서 기준이 되는 타임존 정보를 알려주어야 한다. 본 예제에서는 Asia/Seoul를 예로 들었다. Instant.atZone(ZoneId.of("Asia/Seoul"))은 앞서 인식된 시간 정보를 Asia/Seoul 타임존으로 변환한다. Instant.atOffset(ZoneOffset.of("+09:00"))으로 변환해도 결과는 동일하다. 지원하지 않는 타임존 또는 타임존 오프셋의 경우 DateTimeException 예외를 발생시킨다.

참고 글

저작자 표시 비영리 동일 조건 변경 허락
신고

미니소 오소니 OS-H2 초음파 가습기 사용기, 구매 후기

초음파 가습기 구매

  • 2017-11-05, 초겨울이 시작되면서 자고 일어나면 입이 바짝 마르는 건조한 계절이다. 한참 가습기의 필요성을 느끼고 있던 차에 미니소 타임스퀘어점에서 조그맣고 깜찍한 초음파 가습기가 눈에 띄어 바로 구입했다. 제품명은 오소니 OS-H2 초음파 가습기로 판매가는 19,900원이다.

  • 오소니 OS-H2 초음파 가습기는 수수깡 모양의 교체 가능한 필터 스틱을 가진 간단한 구조의 초음파 가습기이다. 어른 손바닥 만한 작은 크기에 일반적인 USB 전원 케이블만 있으면 어디서나 사용이 가능한 것이 장점이다. 회사 사무실 책상 위에 놓으면 딱 알맞다.

초음파 가습기 사용 방법

  • 매일 사용 전 가습기에 방금 따른 수돗물을 가득 담아준다. 일반적인 상식으로 정수기 물이 인체에 무해하다고 생각하기 쉬우나 오히려 정수기 물은 세균이 번식하기 좋은 환경이다. 바로 입으로 마시는 것이 아니고 장시간에 걸쳐 가습하기 위한 용도로는 염소를 비롯하여 세균 번식을 억제하는 성분이 풍부한 수돗물이 절대적으로 안전하고 위생적이다.

  • 수돗물 충전 후에는 필터 스틱이 충분히 젖어야 하므로 최소 5분 정도 대기하다가 전원을 켠다.

  • 매일 사용 후에는 반드시 남은 수돗물을 버리고 깨끗히 씻어낸 후에 필터 스틱을 포함하여 모두 분리하여 햇빛에 자연건조한다. 귀찮지만 인체에 유해한 세균의 번식을 예방하기 위해 반드시 필요한 과정이다.

  • 처음 구매시 제공되는 필터 스틱은 3개이다. 필터 스틱은 소모품이므로 최소 1개월마다 필터 스틱을 교체한다. 필터 스틱의 규격은 지름 7mm, 높이 123mm로 시중에서 판매되는 카카오 USB 미니 가습기 전용 필터(4개 3,900원)와 호환되므로 대체 필터로 구매가 가능하다.












참고 글


저작자 표시 비영리 동일 조건 변경 허락
신고

Amazon S3 REST API로 살펴보는 HMAC 인증

개요

  • HMACAPI 서버에 요청자의 신원과 요청 메시지의 무결성을 검증하는데 특화된 해쉬 문자열이다. 일종의 대칭키 암호화에 해당하는데 PKI에 비해 구현의 부담이 적어 널리 사용되고 있다. 이번 글에서는 Amazon S3 REST API를 예로 들어 HMAC을 이용한 클라이언트 인증 방식을 살펴보고자 한다.

HMAC 인증 방법

  • Amazon S3 REST API는 서버와 클라이언트 만이 공유하는 비밀키(Shared Secret, 대칭키)를 이용하여 생성된 서명(Signature)으로 매번 클라이언트로부터의 요청이 올바른지 인증한다.

  • 클라이언트와 서버 사이의 요청-응답 메시지에 대한 보안은 TLS가 적용된 HTTPS 프로토콜을 사용하는 것으로 자연스럽게 수행된다. Signature는 단지 요청한 클라이언트가 진짜인지 가짜인지를 증명하는 역할을 수행한다.

  • HMAC 서명을 생성하는 알고리즘으로는 SHA256이 사용된다. 업계 표준으로 쓰이고 있어 신뢰할 수 있으며 CPU에 가해지는 부담이 적다.

  • 생성된 서명이 포함된 요청의 유효 시간은 15분이다. 15분이 경과하면 유효하지 않은 요청으로 간주한다. 이 경우 timestamp의 포맷은 ISO 8601에 타임존을 추가하여 정의한다.

HMAC 인증 절차

  • 클라이언트와 서버는 서로만 아는 비밀키를 공유한다. 이 키는 클라이언트가 원할 경우 언제든지 재발급 받을 수 있으며 절대 외부에 공개되어서는 안된다.

  • 클라이언트는 서버에 대한 모든 요청시 둘 간에 미리 공유된 비밀키(Shared Secret)와 계산 공식에 의해 생성된 서명(Signature)을 헤더에 첨부한다. Amazon S3 REST APIAuthorization 요청 헤더에 서명을 담아 전송하도록 명시하고 있다.

  • 서버는 요청 헤더로부터 서명을 확인하여 요청이 올바른 클라이언트로부터 왔는가를 확인하여 처리 여부를 결정한다.

HMAC 서명의 생성과 검증

  • 서명을 생성하는데 필요한 것은 요청 자체에 담긴 여러 데이터와 비밀 키이다. 클라이언트는 미리 서버와 약속된 공식에 따라 데이터를 가공한 후 비밀 키를 이용하여 HMAC 서명 문자열로 변환한다. 서명 문자열을 만들어내는 방법은 다양하다. DomainTools의 경우 client_id + timestamp + request_uri를 조합한 문자열에 client_secret를 이용한 HMAC을 생성한다. [관련 링크]

  • 서버 측은 요청 데이터에 대해 동일한 방법을 이용하여 HMAC 서명 문자열을 생성하는데 클라이언트 측이 첨부한 것과 일치하면 유효한 요청으로 간주하고 불일치할 경우 비정상적인 요청으로 간주한다.

HMAC 인증 장점

  • 단순히 client_id, client_secret을 전송하여 인증하는 방식보다 보안이 우수하다. 공격자가 클라이언트로 위장하려면 비밀키를 알아야 하고, 비밀키를 알았다고 하더라도 계산 공식까지 알아야 한다.

  • PKI 대비 복잡성이 적어 최소한의 비용으로 인증 보안을 유지할 수 있다.

HMAC 인증 단점

  • 서버와 클라이언트 간에 비밀키를 유출되지 않고 공유하는 방법을 고민해야 한다.

  • 단순히 client_id, client_secret을 사용하는 인증 방식에 비해 구현자의 부담이 증가한다.

Java에서의 HMAC 시그너쳐 생성 예

String sharedSecret = "5pKRnC5MGNuqEdKkzYy4MA";
String algorithm = "HmacSHA256";
String message = "2017-11-07T18:00:00+09:00 GET http://jsonobject.com/posts/2017";

// HMAC 생성기 초기화, 공유키, 알고리즘, 원본 메시지 지정
Mac mac = Mac.getInstance(algorithm);
mac.init(new SecretKeySpec(sharedSecret.getBytes(), algorithm));

// Signature 바이트 배열 생성
byte[] signatureBytes = mac.doFinal(message.getBytes()));

// 생성된 Signature를 Base64 문자열로 변환, UMuelgDclhzNZPiNqF6NYkZtJnOFqlgu4i4t+4M1fJs=
String signature = Base64.getEncoder().encodeToString(signatureBytes);

참고 글

저작자 표시 비영리 동일 조건 변경 허락
신고

마리아로렌 울템 안경테, 세이코 비구면 초발수코팅 안경렌즈 구매 후기

안경을 맞추다

  • 어느새 인생의 절반을 안경과 함께 하고 있다. 그동안 한 번도 안경에 대해서 제대로 공부하지 않고 아무 생각 없이 집 앞에서 안경을 맞추곤 했다. 하지만 작년 눈 건강에 위기를 느끼면서 영양제와 함께 안경에 대해서도 공부하게 되었다. 이번 글에서는 새로 맞춘 안경을 찾기 위해 안과, 안경원, 안경테, 안경렌즈를 차례로 선택한 이야기를 공유하고자 한다.

안과: 공안과 종로점

  • 눈에 문제를 느껴 안경원을 방문하기에 앞서 반드시 안과에 방문하여 의사의 진단과 함께 안경처방전을 받는 것이 중요하다. 종각역 6번 출구 공안과의원 종로점을 추천한다. 체계적인 검안 과정을 거쳐 눈 건강에 대해서 종합적인 진단을 받을 수 있다. 항상 사람이 많기 때문에 반드시 최소 하루 전 전화해야 원하는 시간을 예약할 수 있다. 안경처방전을 받기 까지 약 30분이 소요됬다.

안경원: 다비치안경 명동점

  • 안경원은 집 앞, 프랜차이즈, 남대문으로 구분할 수 있다.

  • 남대문은 전통적으로 안경원이 밀집한 곳으로 가성비가 좋아 인기가 많은 곳이다. 남대문에서 추천할만한 안경원은 회현역 5번 출구에 위치한 대호안경이 있다. 남대문의 단점은 고가일수록 저렴하게 구매할 수 있지만 안경에 문제가 생길 경우 수리를 위해 방문하기가 번거롭다.

  • 프랜차이즈는 전국에 위치하고 어느 곳을 방문해도 동일한 A/S와 적립금 혜택을 받을 수 있어 편리하다. 나 또한 이번 구매는 전국 1위 프랜차이즈로 유명한 다비치안경 명동점에서 했다. 다비치안경은 가격정찰제라 전국 모든 가맹점에서 동일한 정찰가에 판매하며 카드 구매시 5%를 적립해준다. 다비치안경 명동점은 전체 3층으로 되어 있는데 1층에서 상담 후 안경을 제작하는 동안 2층 카페에서 쉬면서 기다릴 수 있어 좋았다. 앞서 안과에서 처방 받은 안경처방전을 제출했기에 검안 과정을 생략하고 안경 제작은 20분이 소요됬다.

안경테: 마리아로렌 M-404

  • 안경테는 내 눈의 초점에 맞추는 피팅이 필요하기 때문에 반드시 안경사의 손을 거쳐야 한다. 또한, 피팅이 유지되려면 변형이 적은 소재를 사용해야 한다. 좋은 안경테를 구매하면 안경 렌즈만 1년 마다 교체하는 식으로 유지가 가능하다.

  • 구매를 위해 여러 안경점을 다녀보니 울템 소재의 안경테의 장점을 많이 부각시키며 광고했다. 울템은 폴리에테르이미드라는 특수 재질로 탄성과 복원력이 뛰어나고 매우 가벼운 것이 특징이다. 방문했던 모든 안경점이 안경테의 다리를 심하게 구부렸다 펴는 식으로 울템 소재를 광고했다. 울템으로 많이 추천받는 브랜드는 피오비노, 블리스, 프랭크 커스텀이 있다.

  • 안경테는 코받침이 있는 마리아로렌 M-404(정찰가 5만원)를 선택했다. 국산 우미광학의 브랜드 제품으로 울템 소재로 가볍고 변형이 적다.

안경 렌즈: 세이코 1.60 AS

  • 안경 렌즈는 소모품이다. 안경 렌즈의 수명은 코팅의 질이 결정한다. 코팅이 벗겨지기 시작하면 얼룩과 잔기스가 시야와 선명도를 방해할 정도로 증가하게 된다. 내 경우 1년이 지나면 어김 없이 교체 시점이 왔다.

  • 코팅이 안경 렌즈의 수명을 결정하는 만큼 유지가 중요하다. 안경 렌즈를 세척할 때는 절대 뜨거운 물을 피하고 차가운 물에 퐁퐁과 같은 중성 세제를 묻혀 세척해야 한다. 귀찮다고 옷이나 휴지로 닦으면 코팅이 벗겨지고 잔기스가 발생한다.

  • 이번 구매에는 다비치안경 명동점의 카탈로그에서 SEIKO 1.60 AS(정찰가 9만원, 단면비구면/1.60/초발수코팅) 안경 렌즈를 선택했다.

  • SEIKO 공식 홈페이지에 따르면 SEIKO 1.60 AS(이전 이름 SEIKO ULTRA MX 1.60)를 저렴한 프리미엄 렌즈라고 소개하고 있다. [관련 링크] 굴절률은 1.60으로 유리 렌즈보다 55% 가볍고 1.50보다 38% 얇다. 비구면으로 렌즈 주변부 왜곡이 적다. 초발수 코팅(Super Clean Coat)이 적용되어 있어 나같이 안경을 험하게 사용하는 사람에게 좋다. [관련 링크]



참고 글

관련 사이트


저작자 표시 비영리 동일 조건 변경 허락
신고

EPL 2017-2018 시즌 토트넘 핫스퍼 베스트 스쿼드 11

개요

  • 토트넘 핫스퍼는 명장 포체티노 감독의 지휘 하에 2015-2016 시즌 3위, 2016-2017 시즌 2위로 역대 최고의 전성기를 보내고 있다. 오일 머니의 지원을 받는 빅클럽 사이에서 가성비 스쿼드로 2년 연속 빅4 안에 들며 존재감을 과시하고 있다.
  • 포체티노 감독은 어린 선수들을 발굴하여 경쟁력 있는 선수(델레 알리)로 성장시키는데 능하다. 또한 로테이션에 강점을 발휘하는 멀티 플레이어(에릭 다이어)를 선호한다.
  • 토트넘이 국내에 인기가 많은 것은 손흥민의 소속팀이기 때문이다. 2016-2017 시즌 최고의 활약을 펼친 덕에 유럽 리그에서 활동 중인 아시아 선수 랭킹 1위(2위는 카가와 신지)에 선정됬다.

전술

  • 토트넘은 3-4-2-1 전술에서 가장 높은 승률을 기록하고 있다. 델레 알리크리스티안 에릭센의 공격력을 극대화할 수 있어 2017-2018 시즌에도 가장 많이 사용되고 있다.
  • 문제는 3-4-2-1 전술에서 손흥민의 자리가 없다는 것이다. 공격적인 전개가 필요한 경기에서 좌측 윙백으로 출전하는 정도이다. 손흥민4-2-3-1 전술의 왼쪽 윙으로 출전시 가장 뛰어난 활약을 보여준다.

골키퍼

  • EPL 정상급 골키퍼인 위고 요리스(30세, 프랑스)가 주전 골키퍼이다. 토트넘과 프랑스 대표팀에서 주장을 맡고 있다.

센터백

  • 센터백은 얀 베르통언(30세, 벨기에), 다빈손 산체스(20세, 콜롬비아), 토비 알데르베이럴트(28세, 벨기에)가 주전이다.
  • 교체 멤버는 에릭 다이어(23세, 잉글랜드)가 있다.

측면 미드필더

  • 왼쪽 측면 미드필더는 대니 로즈(26세, 잉글랜드)가 주전이지만 부상으로 시즌 아웃되면서 교체 멤버인 벤 데이비스(24세, 웨일스)가 주전 역할을 하고 있다. 공격적인 전개가 필요할 경우 손흥민(24세, 대한민국)이 투입된다.
  • 오른쪽 측면 미드필더는 EPL 정상급 라이트백인 카일 워커(27세, 잉글랜드)가 시즌 시작 전 맨체스터 시티로 이적하면서 교체 멤버였던 트리피어(27세, 잉글랜드)가 주전 역할을 하고 있다. 교체 멤버로는 카일 워커의 대안으로 영입한 세르주 오리에(24세, 코트디부아르), 에릭 다이어가 있다.

중앙 미드필더

  • 중앙 미드필더는 무사 뎀벨레(30세, 벨기에)가 주전이다. 상대의 압박으로부터 공을 지켜내고 2선에 전달하는 능력이 EPL 정상급이다. 교체 멤버로는 무사 시소코(28세, 프랑스)가 있다.
  • 수비형 미드필더빅터 완야마(26세, 케냐)가 주전이다. 별명이 짐승일 정도로 뛰어난 신체조건으로 제공권을 장악하는 능력이 탁월하다. 교체 멤버로는 에릭 다이어가 있다.

공격형 미드필더

  • 공격형 미드필더는 델레 알리(21세, 잉글랜드), 크리스티안 에릭센(25세, 덴마크)이 굳건한 주전으로 토트넘 공격의 핵심이다. 알리-케인-에릭센 조합은 EPL 정상급 파괴력을 보여준다.
  • 교체 멤버는 손흥민이 있다.

최전방 공격수

  • 최전방 공격수는 EPL 2연속 득점왕인 대체불가 자원 해리 케인(24세, 잉글랜드)이 버티고 있다.
  • 교체 멤버는 손흥민페르난도 요렌테(32세, 스페인)가 있다.

참고 글


저작자 표시 비영리 동일 조건 변경 허락
신고

Spring Boot, Jackson, @JsonView로 멀티 뷰 구성하기

@JsonView 정의

public class View {

    public static class Consumer {
    }

    public static class Repository {
    }
}
  • @JsonView의 장점은 동일한 POJO 오브젝트에 대해서 선택적으로 서로 다른 프라퍼티가 조합된 JSON 문자열을 만들 수 있다는데 있다. 예를 들어 user라는 POJO 오브젝트가 있다고 가정할 경우 password_encrypted 프라퍼티는 API 사용자에게 노출되지 않아야 하지만 저장소에는 반드시 저장되어야할 데이터이다. 이런 서로 다른 상황을 위해 선택적으로 뷰를 적용할 수 있는 것이 바로 @JsonView이다.
  • 위는 API 클라이언트에게 응답할 목적의 Consumer라는 뷰와, 저장소에 저장할 목적의 Repository라는 뷰를 정의하였다.

POJO에 @JsonView 명시

@Data
public class User {

    private Long id;

    @JsonProperty("user_id")
    @JsonView({View.Consumer.class, View.Repository.class})
    private String userId;

    @JsonProperty("passwordEncrypted")
    @JsonView({View.Repository.class})
    private String passwordEncrypted;
}
  • 앞서 설명한대로 @JsonView를 목적에 맞게 명시하였다.

@JsonView 적용: Spring Boot

@RestController
public class UserController {

    @RequestMapping(value = "/users/{userId}", method = RequestMethod.GET)
    @JsonView(View.Consumer.class)
    public ResponseEntity<?> getUser(@PathVariable("userId") String userId) {
        ...
        return new ResponseEntity<>(user, HttpStatus.OK);
    }
}
  • Spring Boot에서는 컨트롤러의 메써드 레벨에 적용할 @JsonView를 명시하면 된다. 위 예제의 경우 응답 JSON 문자열에 user_id만 노출된다.

@JsonView 적용: ObjectMapper

String user = new ObjectMapper()
        .disable(MapperFeature.DEFAULT_VIEW_INCLUSION)
        .writerWithView(View.Repository.class)
        .writeValueAsString(user);
  • MapperFeature.DEFAULT_VIEW_INCLUSION 옵션을 활성화하면 @JsonView가 명시되지 않은 POJO의 프라퍼티들도 JSON 문자열에 포함된다. 기본값은 활성화되어 있으므로 이를 원치 않을 경우 비활성화 해주어야 한다.

  • writerWithView()로 적용할 @JsonView를 명시하면 Jackson은 해당 @JsonView가 명시된 프라퍼티만 JSON 문자열에 포함한다.

참고 글

저작자 표시 비영리 동일 조건 변경 허락
신고

CentOS 6, Zulu(OpenJDK 8) 설치하기

개요

  • 일반적으로 레드햇 계열의 운영체제에서 OpenJDK를 설치한다고 하면 기본 패키지로 제공되는 java-1.8.0-openjdk-devel를 설치하는데 그친다. 이 패키지는 OpenJDK 레퍼런스 소스 코드를 Red Hat이 자사의 운영체제인 RHEL에 맞게 빌드하여 오라클로부터 TCK 인증 후 배포하는 것이다. [관련 링크]

  • 한편, Zulu는 엄격한 TCK 테스트의 전체 집합을 완전히 통과한 OpenJDK 기반의 재배포 가능한 무료 바이너리이다. [관련 링크] Zulu는 고성능의 상업 JVMZing을 판매하는 Azul Systems에서 배포하여 신뢰할 수 있다.

주의사항

  • OpenJDK의 설치는 root 계정으로 진행해야 한다.
  • Java 애플리케이션의 컴파일 및 실행은 사용자 계정으로 진행해야 한다. [관련 문서]

설치

### Zulu 저장소 등록, 최초 1번만 실행
$ sudo rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
$ sudo curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo

### Zulu RPM 패키지 설치
$ sudo yum -y install zulu-8

### 설치된 Zulu 실행 확인
$ java -version
openjdk version "1.8.0_144"
OpenJDK Runtime Environment (Zulu 8.23.0.3-linux64) (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (Zulu 8.23.0.3-linux64) (build 25.144-b01, mixed mode)

### 모든 사용자에게 적용되는 환경변수 적용
$ nano /etc/environment
export JAVA_HOME=/usr/lib/jvm/zulu-8
export JRE_HOME=/usr/lib/jvm/zulu-8/jre

n개 이상의 OpenJDK 설치시 Julu 빌드 적용

$ which java
/usr/bin/java

$ readlink /usr/bin/java
/etc/alternatives/java

$ readlink /etc/alternatives/java
/usr/lib/jvm/zulu-8/bin/java

$ alternatives --config java
There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/zulu-8/bin/java
   2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144-0.b01.el7_4.x86_64/jre/bin/java)

Enter to keep the current selection[+], or type selection number: 1

JDK 버전 선정시 고려할 점

  • 만약 프로젝트에서 Lombok 라이브러리를 사용할 경우 현재 최신인 1.16.18JDK 9을 완전히 지원하지 않는다. 아직 개발 중인 1.16.20에서 정식 지원할 예정으로 정식 배포 전까지는 JDK 9 도입을 유보해야 한다.

  • 프로젝트 빌드 도구로 Gradle 툴을 사용할 경우 4.2.1 버전 미만은 Julu OpenJDK 9를 지원하지 않아 빌드 오류가 발생한다. 이 경우 최신 버전을 사용하면 된다.

참고 글

저작자 표시 비영리 동일 조건 변경 허락
신고

'SW 개발 > CentOS' 카테고리의 다른 글

CentOS 6, Zulu(OpenJDK 8) 설치하기  (0) 2017.09.26