반응형

Java NanoTime To Seconds


보통 특정 메서드를 실행하거나 로직을 수행할 때 시간이 얼마나 걸리는지 측정(성능측정)하기 위해서 nanotime을 자주사용한다.

long start = System.nanoTime();


하지만 나노타임(nanotime)은 우리가 보고 판단하기에는 너무 어렵다...초로 바꿔보자...


자바에서 nanotime을 second(초)로 변환하는 방법은 두 가지이다.


1. TimeUnit.SECONDS.convert(nanotime, TimeUnit.NANOSECONDS을 이용하는 방법


이 방법은 진짜 딱 초단위 까지만 나오게 된다. 11.035초의 시간이 걸렸더라도 딱 11초만 표기된다.


2.((double) nanotime) / 1000000000; 을 사용하는 방법


이 방법은 11.33599 형태로 double형 단위에 맞는 초단위로 표기된다.



반응형
반응형


maven으로 빌드시 정상적으로 동작하지 않는 test케이스들로 인해 실패하는 경우가 많다.


테스트케이스를 작성한지 오래됬거나 변경된 정보들로 인해 성공못하는 경우가 빈번하다.


물론 가장 좋은 케이스는 테스트케이스들도 같이 꾸준히 관리를 해주는 것이지만


그게 쉬운일이던가???....


무튼 이런 경우 보통 jenkins 등 ci 툴에서도 빌드시 skip test 명령어를 명시적으로 넣어주곤 한다.


방법은 세 가지다.


첫 번째, 메이븐 빌드 실행 커맨드 라인에 다음과 같이 실행


package -Dmaven.test.skip=true


두 번째, 메이븐 빌드 실행 커맨드 라인에 다음과 같이 실행

package -DskipTests


세 번째, 커맨드 라인에 명령어를 명시적으로 주어서 사용하고 싶지 않은 경우 (pom.xml plugin 추가)

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <skipTests>true</skipTests>
  </configuration>
</plugin>


위와 같이 세 가지 방법으로 사용할 수 있고 나의 경우는 두 번째 방법을 스프링 부트내에서 자주 사용해 packing하곤 한다.





반응형

'Programming > Maven' 카테고리의 다른 글

리눅스 환경에서 mave으로 빌드하기(mvn package)  (1) 2018.05.09
MAVEN과 ANT 비교  (0) 2017.05.10
반응형


웹 작업을 할 때 jsp내의 문구라던지 구조를 변경하고 확인해야하는데 실시간으로 반영이 안되면 무척이나 성가시지요...


빌드다시해줘야하고.....시간은 시간대로 잡아먹고...


SpringBoot를 쓰고 계신다면 application.properties에 다음과 같이 추가해 주세요.


server.jsp-servlet.init-parameters.development=true


추가 이후에는 어플리케이션 재시작 없이 바로 웹에 반영되는 것을 확인할수 있다.

반응형
반응형


다른 도메인 내부에 쿠키 생성하기 (이게 가능해???)


최근 쿠키매칭시스템 설계를 위해 광고 프로세스 전반에 대한 내용을 학습중 우리 도메인 쿠키 내부에 


다른 도메인 쿠키값들이 박혀있는 걸 발견하였다.


뭐야 이거 어떻게 박는거야? 크로스도메인 이슈 때문에 당연히 안될거라고 생각했었는데 심지어 여러 도메인들 쿠키값들이 박혀있었다....


위의 캡쳐화면을 보면 cloud.toast.com 페이지에 들어갔는데 toast.com쿠키 내부를 보면 .toast.com말고도 여러 도메인들의 


쿠키값들이 설정되어있는 것을 보았다.


어떻게 이게 가능하단 말인가????


근데 가능하다는거....실제로 구현을 해보고서도 좀 신기하긴했다...




방법은 다음과 같다. 


해당 페이지의 html에 다른 도메인을 호출하는 호출하는 태그를 심는다. 이 때 태그는 <img>, <a> 태그가 가능하다.


다음을 보자.


local.media.com(내가 호스트에 등록해 띄운 페이지) 도메인의 페이지 내부에는 다음과 같은 태그를 박았다.


이렇게 박았을 경우 페이지가 렌더링되는 시점에 해당 도메인의 서버에 요청이 가게 된다.


요청을 받은 해당 도메인의 서버에서 요청을 받아 내부에서 쿠키를 생성하면 다른 도메인 쿠키 내부에 본인들의 쿠키값을 설정할 수 있는 것이다.


local.toast.com:8082/dsp/request 컨트롤러에서 요청을 쿠키를 만들어주게 되면




내가 생성한 쿠키 값이 박히는걸 볼 수 있다.


만약 다른 도메인의 iframe을 박아 렌더링 하게 된다면 해당 도메인의 쿠키가 하나 더 생기게 된다.


iframe으로 local.doubleclick.com:8080/adx/request를 요청해보자


이번에는 local.media.com쿠키 내부에 값이 생성되는게 아니고 별도의 local.doubleclick.com쿠키가 생성된 것을 볼 수 있다.


물론 어떻게 쿠키를 심든간에 httpServletRequest로 request를 받아 cookie를 얻어오게되도 본인 


서브도메인에 일치하는 쿠키값만 받아올 수 있다!!!(당연당연)


반응형
반응형

스프링부트(Springboot) 사용시 java.lang.IllegalArgumentException: An invalid domain Error 해결하기


스프링에서 쿠키에 setDomain을 할 경우 현재 서버의 도메인 및 상위 도메인 외에 다른 도메인을 셋팅하게 되면 에러가 발생한다.


서버 도메인이 test.com인데 다음과 같이 쿠키에 setDomain을 하게되면


cookie.setDomain(".toast.com");


다음과 같은 에러가 발생한다.


java.lang.IllegalArgumentException: An invalid domain [.toast.com] was specified for this cookie

at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:183)

at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:125)

at org.apache.catalina.connector.Response.generateCookieString(Response.java:989)

at org.apache.catalina.connector.Response.addCookie(Response.java:937)

at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386)

at com.nhnent.demonaid.cms.CookieMatchingServiceController.getAdRequestFromMedia(CookieMatchingServiceController.java:80)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220)

.

.

.



[ 원인 ] 


tomcat8 버전 이상에서는 Cookie Header를 파싱하는 기본 CookieProcessor가 RFC6265를 기반으로 하고 다음과 같은 속성을 같는다.

5.2.3.  The Domain Attribute

   If the attribute-name case-insensitively matches the string "Domain",
   the user agent MUST process the cookie-av as follows.

   If the attribute-value is empty, the behavior is undefined.  However,
   the user agent SHOULD ignore the cookie-av entirely.

   If the first character of the attribute-value string is %x2E ("."):

      Let cookie-domain be the attribute-value without the leading %x2E
      (".") character.

   Otherwise:

      Let cookie-domain be the entire attribute-value.

   Convert the cookie-domain to lower case.

   Append an attribute to the cookie-attribute-list with an attribute-
   name of Domain and an attribute-value of cookie-domain.


Domain값 맨 앞자리에 "."을 붙일 경우 "."을 제거하고 파싱하게 된다.


[ 해결 ]

SpringBoot를 사용하고 있는 경우(Embedded Tomcat) 다음과 같은 설정을 해주면 된다. 스프링부트 자바 config클래스에 넣어주면 된다.




[ reference ]

https://jistol.github.io/java/2017/08/30/tomcat8-invalid-domain/

http://hyunc87.tistory.com/34

반응형
반응형


 '벤 호로비츠(Ben Horowitz)'의 투자 철학


실리콘밸리에는 전설적인 벤처 투자가들이 많다.


최근에는 새로운 인터넷 물결의 흐름을 주도하는 신생 벤처 캐피탈들이 많이 생겼다. 그 중에서 가장 주목할만한 곳이 


'앤드리슨 호로비츠(Andressen Horowitz)'이다.


2013년을 기준으로 실리콘밸리에서 가장 활발한 벤처 캐피털 회사 중의 하나인 '앤드리슨 호로비츠'의 전략을 살펴보면,


세계에서 가장 활발한 벤처 생태계의 한 단면을 엿볼 수 있다.


'앤드리슨 호로비츠'는 2009년 이래 총 27억 달라의 펀드를 운용하면서, 이미 121개 회사에 투자를 해왔다. 


우리에게도 익숙한 스카이프(Skype), 징가(Zynga), 인스타그램(Instagram), 트위터(twitter) 그리고 에어비앤비(airbnb)까지 투자했다. 


그야말로 시대의 흐름을 주도하는 거의 모든 사업에 투자한 벤처 캐피털 회사이다.


이 벤처 캐피털의 창업자 중의 한 사람인 '벤 호로비츠(Ben Horowitz)'의 투자 철학은 다음과 같다고 한다.


'세상을 바꿀 수 있는 미친 아이디어에만 투자한다'


오히려, "초기에, 그 아이디어가 미친 것처럼 보이지 않으면, 그것은 혁신적인 아이디어가 아니다."


창조사회에서 수많은 아이디어 중에서, 성공할 수 있는 아이디어를 구별해 내는 그만의 철학이 묻어있는 이야기이다.




'소프트웨어 전쟁' 책 내용 중 '한국형 미래 전략' 부분에 소개되어진 글로 요즘같이 상상이 현실화되어가는 


시대에 의미있게 생각해볼 문구 인것 같아 포스팅하게 되었다.


사람들이 생각하기에 미친 아이디어, 혹은 비현실적인 아이디어들이 요즈음 세상을 변화시키고 있다. 


그런 아이디어를 생각해 낼 수 있는 능력 또한 중요하지만 내가 가지고 있지 못한 생각이나 아이디어들을 접했을 때 또 다른 가치를 부여하여 공감하는 


능력을 갖춘 사람만이 급격히 변해가는 사회에서 좋은 기회를 잡을 수 있을 거라는 생각이 든다.

반응형
반응형


[ Spark ] JavaRDD로 saveAsTextFile했는데 데이터가 정상적으로 나오지 않는다???


Spark(스파크) 작업을 하고나서 결과물을 hadoop(하둡)에 쓰고 싶을 경우 보통 saveAsTextFile 메소드를 사용하게 된다.


그런데 적재를 하고 하둡 명령어로 해당 파일을 열어봤는데 파일의 내용이 정상적으로 안써지고 dataframe을 RDD로 변경할 때 사용한


모델 패키지명으로 노출되는 경우가 있다. 다음과 같이...


처음 스파크로 작업을 했을 때 적잖이 당황했던 기억이나서 포스팅한다.


코드를 보게되면


다음과 같은 식으로 integratedDF라는 변수명의 dataframe을 JavaRDD로 변환하는데 매핑 모델로 AdidBidPairingModel을 쓰고 있다.


해당 모델을 보면 다음과 같다.


스파크에서 특정 클래스파일로 데이터를 쓸 때 해당 클래스의 toString메소드를 참고해 데이터를 쓰게되는데?(내추측) 


해당 모델 클래스에는 toString메소드가 없다...


보통 일반적인 스프링프로젝트에서는 lombok을 써서 알아서 생성해주지만 일반 자바 프로젝트에서는 toString메소드를 작성해주어야 한다.




다음과 같이 AdidBidPairingModel 끝부분에 toString메소드를 정의해주고 다시 spark-submit을 해보면 ~



정상적인형태로 데이터가 나오는 것을 확인할 수 있다!!!!


처음 스파크프로젝트로 작업을 하시는 분들은 꽤나 헤맬 수 있다...나또한 나중에 또 헤맬 수 있으므로 오랜만에 spark작업하는 김에 기록해본다!!!


반응형
반응형

[ MAC ] mac에 nvm, npm, bower설치하기


웹 패키지 관리를 위해 bower를 설치해볼까 했더니 npm(Node Package Modules)으로 설치하는게 가장 간단해 보여 nvm(Node Version Manager)과 npm을 먼저 깔고 npm으로 설치해보았다.


1. nvm설치 

> curl https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh | bash

명령을 실행하니 "Profile not found" 가 뜨며 정상적으로 설치되지 않았다.

보아하니 경로를 지정할 profile파일이 필요한데 로컬환경에 해당 파일이 없어서 정상적으로 설치가 되지 않았다.


그래서 vi로 ~/.bash_profile을 하나 만든 후 다시 시도


> nvm --version을 해보면 정상적으로 설치되었는지 확인할 수 있다.




2. npm 설치

nvm이 설치되었다면 다음 명령으로 손쉽게 npm을 설치할 수 있다.

nvm install stable


설치가 정상적으로 되었는지 확인하려면 "npm -v"명령을 내려보자


정상적으로 설치된 것을 확인할 수 있다.


3. bower설치 

npm까지 설치가 완료되었다면 bower도 손쉽게 설치가 가능하다.


> npm install -g bower 

로 설치하면 된다.



bower는 프론트 개발에 필요한 라이브러리들을 손쉽게 관리해주는 패키지 관리도구라고 생각하면 이해하기 편하다(마치 백엔드의 maven, gradle과 같은).


아직 사용하는데 익숙하지는 않지만 손쉽게 프론트엔드 라이브러리들을 관리해주는 유용한 도구인만큼 자주사용해보도록 해야겠다.


반응형
반응형

산자이(shanzhai)란?



산속의 울타리, 혹은 산적 소굴을 일컫는 말로 정부나 관리의 관할권을 벗어난 지역을 일컫는 말이었으나, 공식적이지 않고 은밀한 모조품을 만들어내는 행태나 그렇게 만들어진 가짜 물건을 일컫는 말이었으나, 공식적이지 않고 은밀한 모조품을 만들어내는 행태나 그렇게 만들어진 가짜 물건을 일컫는 말로 사용되고 있다.

중국 공영 방송인 CCTV는 이를 '산자이 '문화'로까지 표현했는데, 반드시 부정적인 의미보다는 중국 고유의 특정적 문화로 해석하는 듯하다. 즉, 복제의 대상을 그대로 베끼는 것이 아니다. 복제는 하되 나름대로 새로운 해석을 집어넣는다는 것이다. 거기에서 새로운 창조의 가치가 생겨난다는 것이다. 기존의 것을 신속하게 복제하고, 여기에 대중이 원하는 요소를 첨가하는 '산자이 전략'은 이미 여러 분야에서 그 위력을 발휘하고 있다.


[소프트웨어 전쟁 중] p72



산자이가 새로운 뜻으로 사용되기 시작한 것은 1990년대 말에서 2000년대 초반 광둥에서였다. 즉, 산자이는 광둥어로 제3자의 상품을 모방하거나 위조하는 생산공장을 지칭하는 말이었다. 처음에는 광둥에서만 쓰였지만, 이후 점차 광범위하게 확산되어 중국 전역에서 사용하게 되었다. 정의도 점차 긍정적인 뜻을 내포하기 시작했다. 단순한 짝퉁이나 모방만을 의미하는 것이 아니라, ‘창조적 모방’이라는 뜻도 포함하게 된 것이다.

산자이는 미국 검색엔진 회사 구글에서 통계 낸 ‘2008년도 중국의 뉴 핫워드(China’s new hot words)’에 1위로 선정되는 등, 2008년 초부터 중국에서 폭발적인 인기를 끌어왔다. 산자이에서 파생된 ‘산자이 문화’라는 말은, 모조품과 복제품이 사회 전반에 확산된 현상을 가리킨다. ‘산자이 휴대폰’으로 시작된 이 현상은 산자이 스타, 산자이 영화, 산자이 건축물 등 수없이 다양한 분야에서 산자이라는 이름으로 등장하고 있다.


[네이버 지식백과] 산자이 [山寨] (중국현대를 읽는 키워드 100, 국민대학교 중국인문사회연구소)


반응형

+ Recent posts