Java8에 들어간 stream, parallelStream이 좋다는 이야기만 듣고 대충 개념만 이해한 상태에서...
"그냥 좋겠지"란생각으로 쓰려다...

간단하게 테스트 해보고 정리 ^^ 참고로 로컬 PC에서 돌렸으며, 로컬 PC의 물리 cpu 코어 개수는 4개이다.




10만건, 100만건 테스트를 그냥 간단하게 2, 3회 정도 실시해 본 결과는 아래와 같다.


10만

##  1 소요시간(초.0f) : 0.005초

##  2 소요시간(초.0f) : 0.058초

##  3 소요시간(초.0f) : 0.013초


##  1 소요시간(초.0f) : 0.004초

##  2 소요시간(초.0f) : 0.042초

##  3 소요시간(초.0f) : 0.007초


100만

##  1 소요시간(초.0f) : 0.015초

##  2 소요시간(초.0f) : 0.063초

##  3 소요시간(초.0f) : 0.056초


##  1 소요시간(초.0f) : 0.015초

##  2 소요시간(초.0f) : 0.062초

##  3 소요시간(초.0f) : 0.058초


결과 1이 단순 for loop, 결과 2가 stream, 결과 3이 parallelStream 이다.

10만건이 되었든 100만건이 되었든... 단순 for loop가 빠르다.

이로 인해 내릴 수 있는 결론은 loop문 안에서 처리되는 비즈니스 로직에 block이나 delay 요소가 없다면 단순 for loop로 돌리는게 더 빠를 수 있다. stream이나 parallelStream은 list를 stream으로 바꾸고 내부적으로 라이브러리를 사용하는 비용이 소모 되므로 단순 작업에서는 더 느릴 수 있다고 어디선가 본 것 같다 ^^;;


그럼 loop문 안에 인위적으로 sleep을 넣는다면? 소스 코드 안의 sleep을 주석을 풀고 실행하게 되면 결과는 아래와 같다.


10만

##  1 소요시간(초.0f) : 1.001초

##  2 소요시간(초.0f) : 1.037초

##  3 소요시간(초.0f) : 0.144초


##  1 소요시간(초.0f) : 1.0초

##  2 소요시간(초.0f) : 1.077초

##  3 소요시간(초.0f) : 0.161초


100만

##  1 소요시간(초.0f) : 10.012초

##  2 소요시간(초.0f) : 10.09초

##  3 소요시간(초.0f) : 1.289초


##  1 소요시간(초.0f) : 10.004초

##  2 소요시간(초.0f) : 10.105초

##  3 소요시간(초.0f) : 1.291초


단순 for loop와 stream은 거의 차이가 없으며 parallelStream이 압도적으로 빠르다.

list를 parallelStream 으로 변환하고 라이브러리를 로드하고 사용하는 비용을 쓰더라도 loop문 안에서 지연이 발생해서 loop를 도는 속도가 현저히 떨어지게 된다면 병렬로 나눠 처리하는 것이 좋다는 결론을 얻게 된다.


하지만 loop 안에서 지연이 발생한다고 해서 무조건 parallelStream 을 쓰는 것이 좋을까?

경험 상 병렬로 작업을 처리한다 하더라도 loop 내부에 DB Insert, Update, Delete와 같은 것이 있다면 DB에 크나큰 부담으로 시스템 장애를 일으킬 수 있으니 조심해야 한다.

또한 parallelStream 이 CPU를 점유할 경우 다른 parallelStream 작업에도 영향을 미칠 수 있으므로 조심 ^^


덧. for loop보다 stream이 이론 상으로 더 빨라야 하는 것 같은데... 오히려 stream이 느리네..

stream이 더 빠른 경우가 무엇인지에 대한 고민이 필요 ^^;;



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

보통 개발 시에 파일 업로드를 하려 하면 html form에서 multipart/form-data로 파일을 선택해서 업로드 하고, 이를 서버 단에서 받아 처리를 하게 된다.

하지만 이런 방법이 아니라 원격지의 이미지 파일을 읽어온 후 필요 시 리사이지, 그리고 나서 다시 다른 곳에 있는 서버로 파일을 업로드 하는 기능이 필요해 개발을 하다 보니, 많이 사용되는 방법이 아니기에 정리해 둔다.


<원격지에서 파일을 읽어 들여 파일 객체로 만든 후 리사이징, 업로드하기>


<이미지 리사이징>



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

코딩하면서 유용하게 사용하고 있는 사이트들이 몇 개 있는데...

자주 사용하다 보니... 그냥 이렇게 정리해 두고 필요할 때 끄집어 내서 사용하면 좋겠다 싶어 정리 ^^

순서는 중요도랑 아무 상관 없이... 그냥...


1. Json online Editor


http://www.jsoneditoronline.org/


json editor 기능도 있고, 이쁘게 정리도 해 주고, object로 접었다 폈다 하면서 구조적으로 잘 볼 수 있도록 해 준다.



2. XML to Json


http://www.utilities-online.info/xmltojson/#.WIbKYFOLRVI


xml의 list 형태가 json으로 변하면 어떻게 변하는지 궁금해서 찾아본 사이트...

요즘은 대부분 json을 많이 쓰지만 xml을 쓰기 원하는 곳도 있으니 간간히 필요한 경우 사용하면 좋을 듯...



3. Online regex tester and debuger


https://regex101.com/


예전에 XE 개발 할 때 오픈소스라서 날마다 해킹 시도가 있어서 뚤리는거 막고 뚤리는거 막고 할 때 정규 표현식을 많이 썼는데, 바로 바로 해당 정규표현식이 잘 적용 되는지 확인할 수 있어서 좋다.



4. URL Decoder, Encoder


http://meyerweb.com/eric/tools/dencoder/


인코딩 된 문자를 디코딩 하거나 디코딩 된 문자를 인코딩 하고 싶을 경우 바로 바로 확인 가능하기에 괜찮은 사이트이다.






저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

요즘 주변에서 일어나는 일들을 보면서 드는 생각들을 적어본다.

정리된 생각이 아니니... 주저리 주저리 잡설이 될 듯 싶다.



* 개발을 잘 한다는 의미는 무엇일까?


한 쪽 사람은 다른 사람을 개발 못한다고 욕하고, 다른 쪽에서는 이 사람을 개발 못한다고 욕한다.

요즘 드는 생각으로는 뭐가 개발을 잘하는 것이고, 뭐가 못하는 것인지... 이제 잘 모르겠다는...

예전에는 뭔가 명확한 원칙, 기똥찬 코딩 실력...

여러가지 어려운 전문용어...

새로운 개념 도입... 깔끔한 정리 등등

뭔가 개발 잘하는 것에 따라오는 수식어들이 있었는데...

상황에 따라, 권력을 쥐고 있는 사람에 따라 관점이 달라지듯... 개발을 잘 하는 지의 여부도 달라지는 현상을 본다.


그냥 정확하게 알게 된 결론은...

서로 잘난척을 할 뿐...

뭐가 옳은지, 뭐가 잘못된 것인지 명확하지 않다는 것이다.



* 되도 않는 권력욕들... 욕망의 꿈틀거림...


정치인들이야 원래 그렇다고 치자.

조그마한 회사 안에서까지 별 그지 같은 타이틀 한번 달아보고...

별 그지 같은 쥐꼬리 만한 권력 가져보고자...

역겨운 정치질을 한다.

회사의 공동 목표는 멀어지고...

조그마한 파트 안에서 일부 사람들의 집단 이기주의가 꿈틀거리면서...

Showing이 시작 된다.


그 Showing이 회사에 무슨 이익이 되는 것인지의 고민은 없고...

그냥 그 Showing으로 인해 집단 내에서 자신을 돋보이고자 하는 행동들만 난무한다.


우리 그러지 말자...

정말 역겹다...


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

야마하 mt-03 타고 싶은데...

배기량 때문에 2종 소형이 필요해서... 학원을 알아 봤는데...

마나님이 안된다고 하셔서 야마하 mt-03은 꿈을 버리게 되었습니다.



그래서 좀 배기량 작은 스쿠터는 어떨까 하고 검색하다가 우연찮게... 이뻐 보이는 스쿠터가 있어서...


http://storefarm.naver.com/lsl19690/products/485629786



요놈 ㅎㅎ

사고 싶어 마나님에게 링크를 보냈더니...

단박에 거절 ㅠㅠ ( 저 죽으면 어떻게 가족이 먹고 사냐고... 바퀴 2개 짜리는 안된다네요 ㅠㅠ)


그냥 오래된 구아방이나 몰고 다녀야 겠네요 ㅠㅠ


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

얍삽하다는 의미인 것 같다...

그런 사람들이 알아서 먼저 살길 찾아가는 것 같고...


그러다 보면 가만히 있는 사람이 쓰레기 청소 다 하고... 피해 보는 것 같다.


알아서 살길 찾아 가는 것 까지야 뭐라 안하는데...

가기 전까지 왜 이리 잘난척 다하면서, 조직에 혼신을 다 바칠 것처럼 하면서...

이제와서 나 몰라라 하는거냐 -.-;;


그렇게 살지마라...

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

이 역시 티몬 구매후기에서 이미지 업로드와 관련된 기능을 적용하면서 나온 내용을 정리 차원에서 적어 둡니다.


구매후기 작성 시 이미지를 선택해서 업로드를 하게 되는데, 기존에는 이미지의 사이즈를 제한하는 기능이 있었고 이로 인해 이미지 제한에 걸려 이미지를 업로드 하지 못하거나, 업로드 된 원본 이미지도 용량이 너무 큰 문제가 있었습니다. (장당 3MB)


아무런 제약 없이 이용자는 이미지를 마음껏 올릴 수 있으려면 이미지 리사이즈가 필요한데, 서버단에서 용량 리사이징을 하게 되면 아까운 네트웍 비용이 들어가게 되므로 클라이언트 단에서 용량을 줄일 필요가 있었습니다.

그래서 사용하게 된 것이 HTML5의 Canvas 기능이죠.

물론 이전에 HTML5를 제대로 사용해 본 적이 없어서...

모든 기능은 최고의 방법이 구글링을 통해 적용했습니다.

그리고 HTML5의 Canvas가 적용되지 않는 브라우저를 위해서라도 (망할 IE -.-;;) 기존 소스 코드는 남겨두고 분기 처리를 해야 했습니다.


기본적으로 jQuery를 사용 했습니다.

아... 그리고 기본적으로 저는 자바스크립트를 잘 못하는 개발자이므로 발코딩이 나와도 이해해 주세요 ^^

간단한 설명은 주석으로 달았습니다.



<html5의 Canvas를 사용해서 이미지 리사이징이 가능한지 판별하는 메소드>


<html form>


<file input을 통해 file을 선택했을 경우 동작하는 메소드>


<String을 Binary로 변환해 주는 메소드. 구글링 결과물로 정확한 내용은 검토해 보지 못함>


<리사이징 된 파일을 업로드 하는 메소드>






저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

구매후기 이미지 업로드에서 오류가 나고 있어서 해당 내용을 검토 중에 알게 된 내용을 정리합니다.

기본적으로 아래와 같은 방식으로 업로드가 되고 있습니다.


브라우저 -> php -> Java


그런데 문제는 어느 한쪽의 문제가 아니라 php, Java 둘다 문제가 발생...

그리고 문제의 원인은 둘다 Version Up이였습니다.


1. 먼저 Java

Error Message가 "Required MultipartFile parameter 'file' is not present" 라고 발생.

구글링 하니 http://stackoverflow.com/questions/25830503/spring-mvc-http-status-400-required-multipartfile-parameter-file-is-not-pre 가 검색 됨.


아래와 같은 방식으로 수정


AS-IS : <bean id="multipartResolver" class="**org.springframework.web.multipart.commons.CommonsMultipartResolver**" />

TO-BE : <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />


2. 다음으로 PHP


PHP에서 Java 쪽으로 파일을 올릴 때는 CURL을 사용했는데 기존에 /tmp에 올라온 임시 파일을 읽어 들일 때는 @를 사용해서 리소스를 읽어 들였음.

php 5.5.0 기준 Deprecated 된 기능이라서 다른 방법으로 수정



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

Spring Batch를 그닦 많이 써본 경험이 없지만, 특정 요구 사항이 있어서 개발하게 되었습니다.

작업을 하면서 겪은 오류를 어떻게 해결 했는지 History 및 Backup을 위해 적어 둡니다.


보통 배치는 Reader와 Writer로 구분합니다.

특정 정보를 Reader에서 읽어 들여서 필요한 내용을 가공하고 Writer에서 필요한 행동을 합니다.


그런데 Reader에서 정보를 읽어 들이고 가공하는 시간이 오래 걸리면서 Writer에서 DB Connection을 못 찾게 되고, Writer 작업을 수행하지 못하게 되는 경우가 발생했습니다.


구글링을 한 결과 "autoReconnect 값을 true로 해라", "validationQuery를 날려라" 등등이 나왔지만 유효하지 않은 해결책이였습니다.


결국 찾아낸 해결 방법은 applicationContext.xml에서 database 관련 다음의 옵션을 수정하는 거였습니다.


testOnBorrow : true


이 옵션은 커넥션 풀에서 커넥션을 가져올 경우 유효한지 검사하는 것인데

일반적인 웹서비스에서는 커넥션이 자주 맺고 끊어져서 이 옵션과 상관없이 잘 동작 하는데

배치와 같이 특별한 경우에는 기존 커넥션을 사용하려다가 연결 해제된 커넥션을 검증 안하고 쓰면서 발생한 문제였습니다.

즉 testOnBorrow가 false인 경우에는 유효하지 않은 커넥션을 사용할 수 있으므로, Writer에서 에러가 종종 발생하게 된 것입니다.


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

필요에 의해 html -> php -> java api로 파일을 전송해야 할 일이 생겼다.

Java Api는 UI에서 바로 사용하면 안되는 상태라서 php를 거쳐 가야 하는데 html에서 올린 파일을 Java API로 전달 하는 과정이 생각보다 쉽지 않아 정리 차원에서 글을 남긴다.


Html에서 php로 파일을 올리게 되면 $_FILES 라는 전역변수 안에 정보가 담기고, 실제 파일은 php.ini에서 지정한 임시 디렉토리에 저장된다.

해당 경로는 $_FILES['업로드한 html form name']['tmp_name'] 에 저장되어 있으며, 해당 파일을 다시 Java API 쪽으로 넘겨 주면 된다.


넘겨주는 방법은 curl을 사용하면 된다.

다음과 같은 방법으로 하면 된다.






Content-Type을 multipart/form-data로 셋팅하는 부분은 많지만, 많이 찾기 힘들었던 부분은 ".';filename='.$file['name'].';type='.$file['type']" 이다.

html에서 php로 업로드 한 파일은 image/png 인데 php에서 Java로 curl을 통해 업로드 하게 되면, 기본적으로 application/octet-stream 타입으로 업로드 되기 때문이다.

이 부분을 html에서 업로드 한 그대로 by pass 하기 위해서는 위 소스와 같이 값을 지정해 주면 된다.


그 후 $response에서 받은 Json 값을 파싱하면 되는데

$response에는 header 정보도 같이 들어오게 되므로 body만 별도로 분리해야 한다.



이렇게 하게 되면 header를 제외한 순서 Json body 부분만 받을 수 있게 된다.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

List에서 불필요한 item을 제거하기 위해 loop를 돌리게 되면 제거 후 size가 맞지 않는 일로 인해 null point exception을 만나기가 쉽다.

이럴 경우 제대로 된 방법이 무엇인지는 모르지만...

실제로 돌려보고 Exception이 나지 않은 방법을 찾아 정리 차원에서 남겨 둔다.


검색해서 참고한 URL은 https://stackoverflow.com/questions/17279519/removing-items-from-list-in-java/17279565#17279565?newreg=0dee1db24aaa4154a0cebdc173ed5aeb


List<Object> toRemove = new ArrayList<Object>();

for(Object a: list){

if(a.getXXX().equalsIgnoreCase("AAA")){

toRemove.add(a);

}

}

list.removeAll(toRemove);


다른 방법들은 다 해 봤지만 null point exception 발생 함.


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

오랜만에 php 코드를 들여다 볼 일이 생겼는데, 알지 못할만한 소스코드들이 있어 헤메다가 정리 차원에서 적어둔다.


1. php의 람다식.


http://php.net/manual/kr/function.array-walk.php

array_walk($data, function(&$value, $key, $joinUsing) { 

$value = $key . $joinUsing . $value; 

}, $glue);


array_walk의 2번째 인자값을 function 변수로 넘길 수도 있지만 위에처럼 람다식으로 그냥 적어버릴 수 있다.

안드로이드에서 Callback 함수로 람다식으로 적는 경우가 많은데, 그런식으로 작성하나 보다. 오랜만에 php 하니 새롭다 ^^;;


2. 가변함수


이런말 첨 들어보는데, 위의 array_walk가 만일 유저 정의 함수라면 함수 내에서 두번째 인자값을 받아다가 사용할 수 있다.

두번째 인자를 $func 이란 변수로 받는다면 함수 자체는 $func() 과 같이 사용할 수 있다.

이와 관련한 것도 php.net에서 간단한 예제를 볼 수 있다.


http://php.net/manual/kr/functions.variable-functions.php

function foo() {

    echo "foo() 안입니다.<br />\n";

}


$func = 'foo';

$func();        // foo()를 호출합니다.


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

위도와 경도를 표기하기 위해서 DB Column을 만드는 중 알게 된 내용을 정리해 본다.

정확한 내용이 아닐 수도 있으니 참고 사항으로만 보길...


MySQL에서 float, double 타입을 Create할 때 float(length, decimals) 와 같은 형식으로 만든다.

여기서 length와 decimal이 의미하는 내용이 정확히 무엇인지 알기 위해 구글링을 했지만, 매뉴얼에나 나올법한 알아듣지 못할 소리를 번역기로 돌린 듯한 글만 있...


그래서 좀더 검색해 보니 얻어 걸린 글에서 아래와 같은 내용이 보였다.




https://dev.mysql.com/doc/refman/5.0/en/floating-point-types.html


M(length)는 전체 길이 즉 정수 부분과 소수 부분을 합친 길이를 가리키며, D(Decimals)는 소수 부분을 가리킨다는 말이다.

예제에서도 나온 것처럼 float(7,4)로 Column을 정의 해 두었고 이 Column에 999.00009란 값이 들어가면 전체 길이가 8이고 소수 부분이 5 이므로 00009란 소수 부분이 0001로 바뀌게 된다.


덧. 아무런 의미 없는 매뉴얼 같은 내용을 이해도 하지 못하면서 블로그에 올려두는 것도, 수많은 정보로 제대로 된 지식을 못 찾게 만드는 주범인것 같기도 하다.



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Program! > MySQL' 카테고리의 다른 글

MySQL의 Float, Double에서 Length와 Decimal이 의미하는 것...  (0) 2015.06.02

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

급하게 바코드 인식 관련 프로그램을 만들다 보니 오픈소스를 검색하게 되었고 Google에서 제작한 zxing 이란 것을 발견하게 되었습니다. (GitHub : https://github.com/zxing/zxing)

해당 코드와 관련된 포스팅들이 여럿 나왔지만 다 조금 씩 부족한 부분들이 있어서 정리 차원에서 올립니다.

물론 제가 올린 내용도 부족한 부분이 많습니다.


1. 외부 앱을 이용한 방법


이미 외부 앱을 이용해서 구동하는 방법은 잘 정리된 곳이 있습니다.

관련 포스팅은 http://code.tutsplus.com/tutorials/android-sdk-create-a-barcode-reader--mobile-17162 를 참고하시면 됩니다.

간단하게 정리하자면 Github에서 다운로드 받은 소스 중에 IntentIntegrator.java와 IntentResult.java 두개의 파일만 사용하는 것입니다.

특정 Button의 onClick Event에서 아래 내용을 호출할 수 있도록 하면 됩니다.




그러면 onActivityResult에서 특정 앱에서 Scan한 값을 받게 됩니다.

리턴 받게 된 값은 아래와 같은 형식으로 받으면 됩니다.




이렇게 하는 방법은 매우 쉽지만 외부 앱을 추가로 깔아야 한다는 단점이 있습니다.

자체적으로 카메라를 구동 시키고 바코드나 QR코드를 인식할 수 있다면 좋겠다는 생각에 다른 방법을 찾아 보았습니다.

조금 무식하지만 필요한 소스 코드를 다 포함하고, 자체적으로 구동하는 것이죠.


2. 자체 구현


사실 소스 코드 크기가 좀 되기에 자체 구현하기가 망설여 졌지만 일단 구현하였습니다.

자체 구현 관련되어서 참고한 사이트는 http://fishbear.tistory.com/3 입니다.

그런데 ant로 core.jar 파일을 만들어야 한다는데... build.xml 파일이 없더라는 ㅠㅠ

그래서 더 찾아보니 zxing의 특정 버전부터 maven으로 바뀌었다고 하네요.

그래서 maven으로 jar 파일을 만들었지만... 호출해야 하는 Activity인 CaptureActivity 가 해당 jar 파일 안에 없더군요 ^^;;

어쩔 수 없이 해당 소스코드를 다 lib 프로젝트에 포함 시켰습니다.

이로 인해 생기는 Resource 관련 오류들을 fix하기 위해 zxing 안에 있는 res 파일들을 포함 시켰구요 ㅠㅠ

어째든 에러가 없도록 만든 다음... 다음과 같이 사용을 하면 됩니다.(fq는 AQuery 인스턴스입니다. AQuery를 사용 안하시는 경우는 native로 구현 하세요.)




하지만 이렇게 하게 될 경우 SCAN이란 Activity가 없다는 에러가 발생합니다.

따라서 Manifest 파일에 다음과 같이 정의를 해 줘야 합니다.




이렇게 하게 되면 성공적으로 바코드 인식 프로그램이 내부적으로 뜨게 됩니다.

그리고 바코드 인식 후 onActivityResult에서 다음처럼 받아 사용하면 됩니다.




49374란 숫자는 intent를 띄울 때 넘어가는 request code 같은데 정확하게 저 숫자가 뭘 의미하는지는 모르겠습니다.

다만 구분하기 위한 숫자이기에 특정 constant에 넣어 사용했습니다.


이상 간단하게 정리해본 Bar Code, QR Code 인식 Android 앱 만들기 정리 포스팅이였습니다.






저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 모바일에선 소스코드가 안 보이네요. PC버젼으로 봐 주세요 ^^
secret

오일전문 커뮤니티(http://cafe.naver.com/redzonekr) 에서 복돌님이 주구장창 이야기 하셨던 엄청난 반응을 보여준다는 eni 0W-30으로 오일을 교환하고 왔습니다.

언제나 그렇듯이 오일은 '오일스마트 수원점'에서 했구요. (평가 봐 보세요 ㅎㅎ 장난 아닙니다 ^^)

오일 교환 전에 스포텁 4년차 정기 정검 받으러 '기아자동차 수원 서비스센터' 가야 했기에 먼저 서비스 센터에 입고했습니다.

접수 받아 주시는 분이 정기 정검 말고 특이점 이야기 하라고 하길래, 와이프가 주행 중 기어를 R로 놓는 순간 시동이 2번 꺼진 적이 있어서 그 이야기를 했습니다.

접수 완료 후 미케닉이 시동 꺼질 당시의 상황을 물어보았지만... 제가 있을 때 꺼진게 아니라 와이프가 있을 때 꺼진거라서 정확한 설명을 하지 못했네요 ㅠㅠ

그 당시의 정확한 설명, 엔진 체크등이 들어오고 나서 자동으로 꺼졌는지, 시동 꺼지면서 라디오나 기타 전원은 살아 있었는지 등등을 알아야 도움이 되는데 그런 상황을 전혀 기억하고 있지 않았다는 ㅠㅠ

그리고 오류가 있은 후 4번 정도의 시동 On/Off 가 있으면 보통 에러코드가 메모리에서 지워진다고 하네요.

그래서 바로 주변 오토큐 찾아가서 스캐너 물려보는게 좋다는데... 저는 시간 관계상 무려 한달 정도만에 방문을 ㅠㅠ

그래서 오류 코드는 찾지 못했습니다.


그래서 미케닉이 의심갈 만한 부분을 살펴봐 주신다고 했는데, 의심 가는 부분을 하나 발견했다는 ㅠㅠ

기존에 웨스트 게이트 터보차져 부분의 와셔 부분 부품이 충격에 의해서 떨어져 나가면서 터빈이 돌아도 부스트가 차지 않았다는...

그래서 ecu에서는 터빈이 돌아도 부스트가 차지 않으니 부스트 센서 오류로 인식을 하고 있었다네요...

어쩐지 차를 밟아도 나가지 않더라는...

내내 2.0 NA로 다닌 거였다는 ㅠㅠ

이게 시동 꺼짐의 원인인지 모르겠지만, 어째든 오류 코드 나온 부분은 손 보았으니 더 지내봐야 할 것 같습니다.

이로 인해 정비 시간만 2시간 가량 걸렸고... 오일 갈러 급하게 이동 ㅎㅎ

시간이 많이 늦어져서 오일스마트 사장님께 미안한 맘으로 들어갔습니다.


오늘 갈아야 할 오일은 위에서 이야기 했듯이... 바로 요놈...


차량을 리프트 위에 올리고...


폐 오일을 방출하고...

eni 0w-30을 주입합니다.


기존 오일이 밀러 였는데...

밀러는 소음에 민감한 분들에게 좋은 오일이라고 하네요.

그런데 2.0 터보로 다닌게 아니라 NA로 다닌 거라서 제대로 체감을 못한거 같아서 아쉬움이 남네요 ㅠㅠ

어째든 eni 0w-30은 오일이 많이 묽더군요. 색깔도 많이 투명하고..

그래서 터보보단 NA엔진에 더 좋다고 하는데... 그래서 한계도 빨리 오는 경향도 있고..


오일 교환 하는 도중 하체를 찍었는데...

배기구가 잘 구워져 있습니다.


배기구에 약간의 녹이 올라와 있는데, 배기구 녹은 벤츠도 다 올라온다고 하더군요.

그 말에 좀 안심을 ㅎㅎ


오늘 길에 좀 거칠게 몰아보니...

부스트압이 마구 차 오르는게 느껴집니다. 마치 첨 스포텁을 샀을 때 느꼈던 그 부스트압이 몸으로 느껴지니 좋네요 ㅎ

그리고 오일은 점도가 없는 듯 느껴집니다.

그만큼 저항 없이 rpm이 올라가네요. 혹 이로 인해 후빨이 약할까 걱정했는데 x60까지는 무리없이 올라가더라는...


이번에 타이어도 앞뒤 교환해 주고, 웨스트 게이트 터보차져도 손보고, 오일도 eni 0w-30으로 새로 갈고 하니...

마치 새 차가 된 듯한 느낌이 드네요 ^^



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

MySQL에 DateTime 필드에 값이 없을 경우 기본 값으로 "0000-00-00 00:00:00" 들어가는 경우가 있다.

이럴 경우 쿼리해 온 값이 Java의 Model 객체에 Setter로 값을 넣는 과정에서 에러가 발생한다.

에러 메시지는 다음과 같다.


"Cannot convert value '0000-00-00 00:00:00' from column 4 to TIMESTAMP"


뭐 '0000-00-00 00:00:00' 값은 timestamp 값으로 바꿀 수 없다는 메시지 같은데...

이럴 경우 어떻게 해결해야 하나 고민하다가 구글링을 통해 알게 된 내용을 정리한다.

보통 Model 객체의 Setter를 아래와 같이 작성하게 된다.



setter에서 Date 객체로 받아야 하는데 값을 넘겨줄 수 없기에 이런 경우에는 DB 접속 옵션을 아래처럼 바꾸어 주면 된다.


jdbc:mysql://localhost/myDatabase?zeroDateTimeBehavior=convertToNull


zeroDateTime일 경우 null을 반환하라는 의미같은데

위와 같이 옵션을 설정한 후 디버깅을 해 보면 zeroDateTime일 경우 setter에 실제로 null 값이 들어오게 된다.


참고 : http://stackoverflow.com/questions/1363527/cannot-convert-0000-00-00-000000-to-timestamp

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

이클립스 사용하다 보면 jquery.min 파일에서 "Missing semicolon" 이라는 오류가 뜨게 된다.

이럴 경우 다음과 같은 방법으로 예외 처리를 하게 되면 된다.


출처 : http://metalbird.tistory.com/59


=============================================================================================


query min.js 의 경우 이상없이 작동하나 에러가 표시되게 된다.


이게 싫어서 일반 jquery*.js로 쓰기도 했으나 간단하게 해결할수 있는 방법이 있어서 메모한다.




에러 예외처리에 추가하는것이다.


Project > Properties > JavaScript > Include Path > 아래그림 참고


**/jquery*.js


출처: okjsp - http://www.okjsp.pe.kr/seq/185342




저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

다국어 사용을 위해서 그동안 Struts2 기반 MessageUtil만 사용하다가 Spring 기반으로 변경하기 위해 구글링, 작업한 내용을 정리 차원에서 올립니다.


1. applicationContext.xml에 다음 내용을 추가


<!-- for MessageUtil -->

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

        <property name="basenames">

            <list>

                <value>/WEB-INF/messages/messages</value>

            </list>

        </property>

        <property name="cacheSeconds" value="100000" />

        <property name="defaultEncoding" value="UTF-8" />

    </bean>

    <bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">

        <constructor-arg ref="messageSource"/>

    </bean>

    <bean id="messageUtil" class="package.path.MessageUtil">

        <property name="messageSourceAccessor" ref="messageSourceAccessor"/>

    </bean>


2. MessageUtil




참고 사이트

http://springsource.tistory.com/113

http://blog.naver.com/pureb612b/10120505318

http://zinlee.tistory.com/204

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

출처 : http://warmz.tistory.com/727


1. HttpServletRequest, HttpServletResponse


2. HttpSession


3. Local

 - java.util.Locale 지역 정보


4. InputStream, Reader

 - HttpServletRequest의 getInputStream(), Reader


5. OutputStream, Writer

 - HttpServletResponse의 getOutputStream(), Writer - 서블릿 형태로 만들때 사용한다.


6. @PathVariable

 - @RequestMapping의 URL {} 부분의 패스 변수를 받는다.

    만약 타입이 틀린 값이 들어오면 HTTP 400 - Bad Request 가 전달 된다.

1
2
@RequestMapping("/board/{id}")
public void view( @PathVariable("id") int id ) {...}
 

7. @RequestParam

 - 스프링 내장 변환기가 다룰 수 있는 모든 타입을 지원한다.

   해당 파라미터가 없다면 HTTP 400 - Bad Request 가 전달 된다.

 -  file의 경우는 <input type="file" name="file" /> 에 매핑 된다.

1
2
3
public String edit( @RequestParam("id") int id,
            @RequestParam("title") String title,
            @RequestParam("file") MultipartFile file ) {...}
 

 -  맵 형태로 받으면 모든 파라미터 이름은 맵의 키에 파라미터 값은 맵의 값에 담긴다. 

1
public String add( @RequestParam Map<String, String> params ) {...}

-  파라미터가 필수가 아니라면 required = false 로 지정하면 된다. 

   이때 파라미터가 없으면 NULL이 들어간다. default 값을 지정 할 수도 있다. 

1
2
3
public void view( @RequestParam(value = "id",
                        required = false,
                        defaultValue = "0" int id) {..}.
 

8. @CookieValue

 - @RequestParam과 동일 하며 쿠키값을 가져올 때 사용한다.

1
2
public String check( @CookieValue("check") String check,
                required = false, defaultValue = "" ) {...}
 

9. @RequestHeader

 - 헤더 정보를 메소드 파라미터에 넣어 준다. Ajax로 처리할때 $.ajax(...) 에서 head에 특정 값을 넣고 여기서 받아서 

   있으면 ajax이고 없으면 일반페이지라는 식으로 이용하면 된다.

1
public String header( @RrequestHeader("ajax") String ajax ) {...}
 

10. Map, Model, ModelMap

 - view를 String으로 리턴해 주고 Attribute를 Map, Model, ModelMap 에 담을 수 있다.

 

11. @ModelAttribute

 - 파라미터를 Object형태로 받을때 사용된다. 일반적인 파라미터 형태로 쓰인 경우 타입이 일치하지 않으면 객체에 매핑 되지 

   않으며 에러는 발생 시키지 않는다. 자동으로 ModelMap에 담기므로 modelMap.addAttribute를 해 줄 필요가 없다.

1
public void update( @ModelAttribute("board") Board board) {...}

 - 메소드에도 @ModelAttribute를 설정 할 수 있다. 리턴값이 항상 나머지 컨트롤러에 자동 추가 되며 보통 참조용 데이터 등에 

   이용된다.

1
2
@ModelAttribute("emailList")
public Map<String, String> getEmailList() { ... }
 

12. Errors, BindingResult

  - 모델의 값을 검정한다. 이때 BindingResult나 Errors의 파라미터 값의 위치는 반드시 @ModelAttribute 뒤에 위치해야 한다. 

     자신의 바로 앞에 있는 @ModelAttribute 파라미터의 검정 작업만 하기 때문이다.

1
2
@RequestMapping(value = "/board/add", method = RequestMethod.POST)
public String add( @ModelAttribute("board") Board board, BindingResult result ) {...}
 

13. SessionStatus

 - 모델 오브젝트를 세션에 저장하여 계속 사용한다. 더이상 모델 오브젝트를 사용하지 않을 때는 세션에서 제거해 줘야 한다.


14. @RequestBody

 - HTTP body 부분만 전달 한다. XML 이나 JSON 으로 출력 할 경우 사용한다.

   리턴타입의 @ResponseBody 를 참조하자.

 

15. @Value

 - 프로퍼티값이나 값을 파라미터에 적용한다.

1
2
3
4
5
6
7
8
9
public class BoardController {
    @Value("${eng.url}")
    String engUrl;
 
    @RequestMapping(..)
    public String gotoEng() {
        return this.engUrl;
    }
}
 
 - 위는 프로퍼티중 eng.url 의 값을 String engUrl에 매핑 시키고 메소드에서 사용한 케이스다. 파라미터에도 적용 된다.

1
2
3
public String gotoEng( @Value("${eng.url}") String engUrl ) {
    return engUrl;
}
 

16. @Valid

 - JSR - 303 검증기를 이용해서 @ModelAttribute를 검정하도록 한다.

1
public String add( @Valid @ModelAttribute("board") Board board, BindingResult result ) { ...}


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

1. overcommit_memory 값 변경


https://charsyam.wordpress.com/2013/01/24/%EC%9E%85-%EA%B0%9C%EB%B0%9C-redis-vm-overcommit_memory-%EC%9D%84-%EC%95%84%EC%8B%9C%EB%82%98%EC%9A%94/#comment-1256


위 포스트를 보다가 overcommit_memory 값은 어디에 셋팅되어 있고, 어떻게 변경하는 것인지 궁금해서 구글링.

아래와 같은 포스트 찾음.


http://redis.io/topics/faq




현재 셋팅 된 값은 /proc/sys/vm/overcommit_memory 에 있음.


http://redis.io/topics/admin



값 셋팅은 /etc/sysctl.conf 안에 vm.overcommit_memory 값을 지정한 후 재시작하거나 /sbin/sysctl vm.overcommit_memory 명령어를 사용하면 됨.



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret