[안드로이드] duplicate entry 에러 해결 방법



Error:Execution failed for task 에러를 해결하니 이번엔 중복에러가 나타났다



duplicate entry: com/google/zxing/aztec/AztecDetectorResult.class


이런 에러인데


AztecDetectorResult 클래스가 중복이 되었다 뭐 그런 이야기다



구글의 라이브러리를 이것저것 참조하다보면 저런 에러가 흔히 나타나는듯 하다.


나같은 경우는


QR코드를 읽는 라이브러리와


안드로이드 카메라로 촬영한 이미지의 문자를 인식하는 라이브러리를 사용하던 중에


이것저것 끌어오다가 나타난 에러였다.



어느부분에서 중복되었는지 찾기가 쉽지는 않지만


어차피 앞쪽의 경로를 보면 대충 사이즈는 나오니까 잘 찾아보도록 하자









안드로이드 스튜디오의 프로젝트보기로 (안드로이드 보기론 안보임)


저 두군데를 뒤져보면 중복되는 녀석들이 나타난다



단순히 build.gradle에서 컴파일 명령을 지우는 것 만으로는 해결이 되지 않기 때문에


직접 저기서 파일 자체를 삭제 해주어야 한다.



물론 아무거나 지우다 일어나는 일은 책임 못진다.



build.gradle에서 명령줄만 삭제 해보고 



정상 동작 한다면 그떄 지우고 APK파일로 구동시켜 보도록 하자.




단순히 빌드할땐 나타나지 않다가 APK파일로 생성할때 나타나는 에러니까


정상동작하는걸 확인 후 삭제하는 것으로 



저 에러를 해결 하자



[안드로이드] Error:Execution failed for task ':app:transformClassesWithDexForDebug'. 오류 해결 방법



신나게 코딩하고나서 모바일로 테스트 까지 다 해놓고


APK파일로 묶으려는데 저런 에러가 나서 당황스러운 경우가 있었다.



대체 뭐지.. 뭘까..


하고 뒤쪽의 에러를 더 봤더니



com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: 

com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/BarcodeFormat;



이런 내용의 로그가 나타났고


저기서 잘 보아야 할것은


Multiple dex files define 


바로 이부분이었다


음... 뭐 다중 어쩌구 파일을 못찾겠다 뭐 이런건지


일단 잘 모르니까 검색을 해보니


역시나 스택오버플로우 형님들이 좋은 답변들을 알려주었다



안드로이드 build.gradle (app 레벨)에 들어가서


몇줄 추가해 주도록 하자


dependencies {
compile 'com.android.support:multidex:1.0.1'
}


디펜던시에서 저 한줄을 추가 해주고



android {

.......
defaultConfig {

.........
multiDexEnabled true
}

.....
}


저렇게 하나 추가해 주도록 하자



그리고 AdnroidManifest.xml에 가서


<application
.....
android:name="android.support.multidex.MultiDexApplication">

......
</application>


어플리케이션단에 추가를 해준다



그럼 해결이 된다!


리니지2 레볼루션 도감, 집혼석에 나와있는 범위버프 오오라 토템은 무엇인가?



우선 예전에 공식카페에 올라왔던 패치 내용을 보자


------------------------------------------------------------------------


안녕하세요. 모바일 혁명의 시작, 레볼루션 입니다.

12월 31일 (토) 08:50부터 업데이트 이후 발견된 현상의 수정을 위한 데이터 패치 작업이 진행될 예정입니다.
작업이 진행되는 동안 일시적으로 서버가 불안정할 수 있는 점 양해 부탁 드립니다.

자세한 사항은 아래의 내용을 확인하여 주시기 바랍니다.

▶ 데이터 패치 일정 안내
● 일시: 12월 31일 (토) 08:50 ~ 09:50 (완료)
● 내용: 

1. '몬스터 도감' 및 '집혼석'의 옵션에서 '범위 버프(오오라 토탬)'이라는 효과가 확인되는 현상

2. 간헐적으로 자신의 직업에 맞지 않는 장비가 추천 장비로 팝업 메시지가 표시되는 현상

3. '서브 퀘스트_약탈당한 고양이상단' 퀘스트가 정상적으로 진행되지 않는 현상

※ 작업이 진행되는 동안 게임 접속이 불안정할 수 있습니다.
※ 게임을 원활하게 이용하실 수 있도록 9시 50분 이후 게임에 다시 접속하시어, 데이터 패치를 다운로드 받으실 것을 권해드립니다.

데이터 패치 작업이 완료되면 최종적인 공지를 통해 안내해드릴 예정이오니,
이 점 참고하여 주시기 바랍니다.

해당 현상으로 인해 용사님들께 심려를 끼쳐드린 점 대단히 죄송합니다.

보다 쾌적하고 안정적인 서비스를 이용하실 수 있도록 최선을 다하겠습니다.

감사합니다.

모바일 혁명의 시작, 레볼루션


------------------------------------------------------------------------



1번을 보면 게임내에서 해당 텍스트가 뜨는건 표기 오류 라는걸 알 수 있다.

저당시 패치를 하면서 해당 텍스트가 게임내에서 사라졌다가


다음날 안드로이드 수동패치 이후에 다시 텍스트가 표기되고 있다.


즉... 넷마블 버전관리가 꼬였거나 패치이전에 고쳐논걸 다시 패치해서


덮어씌워진거라고 생각된다.


차후에 뭔가 나올지도 모르겠지만 일단 현재로선 그냥 표기오류 버그인 것이다.






★★글루디오 02서버 Kill 혈맹에서  혈맹원 모집중입니다. ★★


인게임 RoadKill << 귓말하거나 댓글 달아주시기 바랍니다.


가입조건은 20대 이상 성인, 레벨 30이상 이며


매일 출첵, 기부 필수 입니다.


혈맹던전 레이드와 단톡방에서의 정보공유를 하는 친목혈맹 입니다.






리니지2 레볼루션 무한으로 다이아 받는 방법


오늘 갑자기 블로그 유입검색어중에 무한다이아 라는게 보이길래 뭔가 했다 


무한뽑기에 관한 포스팅을 한적은 있어도 무한다이아라니? 그래서 찾아보았더니 



얘네들 게임 진짜 얼마나 대충만든거지 아니 잘만든 게임인데 이정도 수준 버그가 먹힐줄은 몰랐다


일단 무슨 내용인지 확인해보자





출처 : http://www.inven.co.kr/board/powerbbs.php?come_idx=4854&name=subjcont&keyword=%EB%B2%84%EA%B7%B8&mskin=l2mobile&l=2517




녹스를 이용하는 사용자에 한해서 매일다이아 수령후 PC시간 변경


그리고 재부팅을 한후 다시 다이아 수령을 하는 방법이다.




매일 한번씩 보상을 받는 시스템에서 특히 온라인게임에서 디바이스 시간을 기준으로 받는다니


이건 예전 1인개발 게임에서나 먹히던 방법이 아니던가


보통 이런건 서버에 있는 시간 기준으로 한다던가


날짜 체크 로직을 꼼꼼히 만들어야 하는거 아닌가?


나도 개발할때 엄청 꼼꼼하게 하는건 아니지만 그래도 이건 너무했다 



지금 이 버그를 악용해서 다이아를 모으고 다이아 세탁하는 유저들을 저격하는 글들도 올라오고 있는 상황이다.


물론 버그가 막혔다고는 하지만 실망이다.


이런 수준의 버그가 존재한다면 다른 버그들도 분명히 많이 있고 악용하고 있는 사람들도 많을 것 이다.


가디언 키우다가 소과금하고도 좌절감에 리세마라 하고 있는데 이 미칠듯한 허탈감이란 ㅋㅋㅋㅋ



녹스를 활용한 버그가 많은 것 같은데 이래서 PC구동을 막아놓은것 같다.



2016/12/27 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 요새전에 대해 알아보자

2016/12/26 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 녹스 튕김현상 해결방법

2016/12/23 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 크리스마스 이벤트

2016/12/23 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 탄력의 효과는 무엇인가 [답변]

2016/12/22 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 시체렉 해결 방법

2016/12/22 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 혈맹 만들기, 포상, 혈원초대

2016/12/22 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 합성, 승급, 강화, 집혼석, 승급석, 주문서 관련한 정보

2016/12/20 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 집혼석 싸게 제거,추출 하기 개꿀팁

2016/12/20 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 아데나 모으기, 노가다 방법

2016/12/18 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 글자 이벤트 획득경로 및 보상 정보

2016/12/16 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 무한뽑기 버그 발생

2016/12/16 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 피의증거 노가다

2016/12/16 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 31렙 전직퀘스트 공략

2016/12/16 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 초반 퀘스트 보스몹 잡기 팁

2016/12/16 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 레벨업 공략, 레벨업 막힐때 팁

2016/12/15 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 비정상적인 동작으로 인하여 팝업 튕김현상

2016/12/15 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] 무과금러 공략&소소한 팁

2016/12/15 - [Yame Game Life/Lineage2 revolution] - [리니지2 레볼루션] security detection 해결방법


2016/12/18 - [Yame Daily Life] - [리니지2 레볼루션] 글자 이벤트 획득경로 및 보상 정보

2016/12/16 - [Yame Daily Life] - [리니지2 레볼루션] 무한뽑기 버그 발생

2016/12/16 - [Yame Daily Life] - [리니지2 레볼루션] 피의증거 노가다

2016/12/16 - [Yame Daily Life] - [리니지2 레볼루션] 31렙 전직퀘스트 공략

2016/12/16 - [Yame Daily Life] - [리니지2 레볼루션] 초반 퀘스트 보스몹 잡기 팁

2016/12/16 - [Yame Daily Life] - [리니지2 레볼루션] 레벨업 공략, 레벨업 막힐때 팁

2016/12/15 - [Yame Daily Life] - [리니지2 레볼루션] 비정상적인 동작으로 인하여 팝업 튕김현상

2016/12/15 - [Yame Daily Life] - [리니지2 레볼루션] 무과금러 공략&소소한 팁

2016/12/15 - [Yame Daily Life] - [리니지2 레볼루션] security detection 해결방법















출처< http://m.cafe.naver.com/ArticleRead.nhn?clubid=28487036&articleid=243067&page=4&boardtype=L>



리니지2 레볼루션 에서 무한뽑기 버그가 발생했다.


한 유저가 카페에 올린 글인데


약 740개뽑기중 SR이 딱 2개 나왔단다.


무한뽑기 버그라는게 있는것도 충격적이지만 740개중에 2개라는 확률이 난 더 충격적이다.



작성자는 뽑기버그 방법을 공개하지는 않았고 있다는것만 알리기 위해 글을 올린 것 같다.


넷마블이 어떻게 대처를 할지 궁금하다 다이아 1000개씩 돌린다고 하는데


과연 그걸로 무마가 될지...



아마 나처럼 뽑기버그 보다 뽑기 확률에 더 충격먹은 사람들이 많을듯 함.


역시 모바일게임은 일이백만원 과금한걸론 티가 잘 안난다 ㅋㅋㅋㅋ


한 돈천만원 질러야 티가 나는듯


암튼 첫날매출 70억원이라는 초 대박게임에서 이런 버그가 발생했으니 넷마블 개발자들 또 집에 못가겠네...


하.. 역시 게임개발은 위험한 것 같다. 출근할때 수건이랑 속옷 챙겨가던 친구를 보면서 느꼇던 기분을


누군지도 모르는 사람들한테 불쌍한 감정을 느끼다니 ㄷㄷㄷ




개발을 시작한지 초반에, 그리고 아직도 종종 자주 하는 실수중에 하나를 했을때 나타나는 메세지 이다.


java.sql.SQLException: ORA-00911: 문자가 부적합합니다.


쿼리문에 잘못된 문자를 사용했다는 의미 인데.


90%정도는 바로 쿼리문 마지막에  -> ';'  요 세미콜론을 붙였기 때문에 나타난다.


쿼리 내용을 넣는 xml문서에는 마지막에 세미콜론을 붙이지 않는다.


오라클 디벨로퍼에서 쿼리 테스트 해보고 그대로 복사한 후 소스에 붙여넣기 했을때 주로 나타나는 에러.


문자가 잘못되었다고 해서 아무리 들여다봐도 잘못된 부분이 없는데 마지막을 보면 저 세미콜론이 붙어 있다.


에러 로그는 요란스럽게 올라오지만 별거 아닌 문제니 천천히 쿼리를 살펴보도록 하자.




java.sql.SQLException: ORA-00911: 문자가 부적합합니다


at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)

at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)

at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)

at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:966)

at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1170)

at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339)

at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3445)

at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)

at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)

at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:80)

at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteUpdate(MappedStatement.java:216)

at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeUpdate(MappedStatement.java:94)

at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.update(SqlMapExecutorDelegate.java:457)

at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.update(SqlMapSessionImpl.java:90)

at org.springframework.orm.ibatis.SqlMapClientTemplate$9.doInSqlMapClient(SqlMapClientTemplate.java:380)

at org.springframework.orm.ibatis.SqlMapClientTemplate$9.doInSqlMapClient(SqlMapClientTemplate.java:1)

at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:200)

at org.springframework.orm.ibatis.SqlMapClientTemplate.update(SqlMapClientTemplate.java:378)

at egovframework.rte.psl.dataaccess.EgovAbstractDAO.update(EgovAbstractDAO.java:101)

at kr.co.narutec.pems2016.widget.service.impl.WidgetDAO.updateUserAutoSetting(WidgetDAO.java:142)

at kr.co.narutec.pems2016.widget.service.impl.WidgetServiceImpl.updateUserAutoSetting(WidgetServiceImpl.java:118)

at kr.co.narutec.pems2016.widget.web.WidgetController.updateUserWidgetSetting(WidgetController.java:170)

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

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

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

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

at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)

at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)

at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)

at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at egovframework.rte.ptl.mvc.filter.HTMLTagFilter.doFilter(HTMLTagFilter.java:51)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)

버그 예.


1. 클라이언트(브라우저)에서 jquery ajax 를 수행하여 GET request를 한다.

2. 서버가 GET request를 받고 routing을 수행하여 해당하는 데이터를 response한다.


Chrome, FF, Safari 의 경우 - 서버가 보낸 response를 받고 데이터를 확인한다.

IE 의 경우 - 서버가 보낸 response는 받으나 데이터가 없다.




서버쪽 로그를 확인해보니 특정한 GET 요청을 서버가 받지 못하고 있었다.


헌데 alert(‍), console.log() 등을 이용해서 확인해본 결과


ajax 수행은 error가 나지 않고 제대로 success 를 띄움



재밌는건 익스플로러의 개발자도구를 띄워놓은 상태에선 값을 잘 받아 온다는 점이다.




원인 및 해결 방법



URL이 같으면 IE의 ajax 연결은 cache를 사용하고 갱신하지 않는다는 것이다.


그래서 ajax 연결 시 URL을 매번 바꾸어주어야 한다는 것


간단한 해결 방법은 시간과 같이 매번 변하는 파라메터를 같이 날려 주는 것


http://localhost:8080/session

=> http://localhost:8080/session?1260790889296



제이쿼리에서는 

jQuery.ajaxSetup({cache:false});

와 같이 캐쉬사용을 끄는 옵션도 있지만 간혹 적용이 안되는 경우도 있는 것 같다.


+ Recent posts