[python] 파이썬 입문하기



작년 node.js와 react.js를 하고 나서 빈둥빈둥 놀다가


올해 초 이직을 하고 새로운 언어를 공부해 볼까 하며 고민하다가


해봐야 겠다고 생각한 파이썬



파이썬의 장점과 단점에 대해서 여기저기 찾아보았는데


개인적으로 내린 결론은


장점


1. 파이썬은 속도가 빠르다.


처리속도가 빠른건 아니고 개발 진행 속도가 빠르다는 의미로 받아들이면 될 것 같다.


리뷰들을 보면 C+ 보다도 느린 처리속도를 보여준다고 하는데


최적화를 하면 C+보다는 조금 더 빠르다고 한다.,


파이썬을 이용해 개발해본 사람들이 말하는 것을 들어 보면 파이썬을 사용하면 빠르다 라는 것은 간편한 문법으로 개발 속도가


빠르다는 의미로 많이 사용 하는 것 같다.


2. 데이터 처리가 용이하다.


1번의 개발속도가 빠르다는 것과 같이 묶어서 생각하면 될듯



3. 비동기 코딩


단일 스레드 대신 이벤트 루프를 활용해 소수 유닛의 비동기 코딩을 하는데 뛰어나다 라고 하는데


사실 이건 직접 경험해봐야 알듯 하다.



단점


1. 처리 속도가 느리다.


스크립트 언어인 인터프리터 언어이기 때문에 컴파일 언어보다는 처리속도가 


느리다는데 사실 초 대용량 데이터 쓰거나 하는거 아니면 이젠 하드웨어 성능이 좋아져서


큰 단점이라고 보기는 애매 할듯 하다.



2. 모바일에 취약하다


데스크탑 환경에 맞는 플랫폼은 존재하지만 모바일 컴퓨팅엔 취약 하다고 한다.


사실 이것도 잘 모르겠음...




결론


뭐든 일단 써보고 경험해봐야 이게 어떤 프로젝트에 좋을지 판단 가능 할 것 같다.





그래서 시작해 보았다


파이썬!




책사서 공부하는건 해본적도 없고 돈도 아깝고 적성에도 안맞으니


구굴선생님에게 물어물어 설치를 해 보았다.


일단 파이썬 프레임워크는 장고 보단 플라스크를 선택 하기로 했다.


이유는 그냥 내 주변에 파이썬 공부해봤던 사람이 플라스크를 썼기 떄문이다.


별거 없다. 내 상황에 공부하기 좋은 환경으로 선택해서 진행 하면 된다.


주변에 장고쓰는 사람 있으면 장고 설치 하면 되는것임.



파이썬 설치 하는 방법



1. 파이썬 설치


1) 파이썬 다운로드  및 설치


https://www.python.org/


위 주소로 가서


다운로드 받는다.


파이썬 3.X.X 와 2.X.X가 있는데


처음에 2.x.x를 받았다가


파이썬 공부해본 지인이 파이썬3로 공부 했다고 해서


파이썬 3버전으로 다시 받았다.


요즘 새로 만드는 프로젝트들은 대부분 파이썬3로 진행 한다고 하기도 하고


일단 파이썬3이랑 파이썬2랑 문법이 조금 다르다


일종의 버전커브가 있는데


인터넷에 자료는 파이썬2가 더 많으니 알아서 취사 선택 하면 됨.



일단 다운받아서 설치 하고 나면



환경변수 설정을 해준다.





2) 환경변수 설정


환경변수 설정하는건 자바 환경변수 설정했던거랑 똑같음






path 에 파이썬 설치 경로를 추가 해주면 되는데.


두가지를 추가 해주어야 한다


파이썬 설치 경로에서



C:\Users\cheesu\AppData\Local\Programs\Python\Python36-32


C:\Users\cheesu\AppData\Local\Programs\Python\Python36-32\Scripts


이렇게 두개를 추가 해준다.



그리고 새로만들기를 하고





PYTHONPATH 라는 변수에


값은 C:\Users\cheesu\AppData\Local\Programs\Python\Python36-32\Lib


파이썬이 설치된 경로에 lib 폴더까지의 경로를 선택해 주면 된다.



환경 변수 설정이 끝났다면


CMD 창을 열어서



python 이라고 쳐보자




위 사진과 같은 결과가 나왔다면 완료 된 것이다.



이제 개발할 준비를 해보자




.




2. pip 설치



cmd 창에다가



easy_install pip


라는 명령어를 입력해 pip를 설치 한다.



3. 플라스크(Flask) 설치


CMD 창에


pip install virtualenv


를 타이핑해서 실행 시키고


c드라이브나 아무 드라이브에


작업할 폴더 만들어 놓고


그 폴더 안에서


virtualenv venv


라는 명령어를 실행 시켜보자


그럼 venv 라는 폴더가 생김



그리고 


pip install flask


명령어를 실행 시키면



플라스크가 설치 된다.



이제 플라스크 개발 환경은 끝났는데


좀 제대로 개발 하려면


파이썬 에디터가 필요하다



4. 파이썬 에디터 설치 하기



파이썬 에디터는 여러 종류가 있는데


일단 난 파이참 이라는 걸 선택함


별 이유는 없다


걍 무료고 파이참이라는 이름만 들어도 파이썬에 최적화 되어 있을 것만 같다


https://www.jetbrains.com/pycharm/download/#section=windows


위 주소로 들어가서



오른쪽에 있는 




커뮤니티 버전으로 다운받고 설치 하자



설치를 다 하고 나서 실행하면


프로젝트를 새로 생성할건지


기존에 있는 경로를 쓸건지 물어보는데


아까 위에 venv 설정 해놓은걸 뒤로 하고


걍 새로 만들어보자


그럼 파이참이 알아서 여러 가지 폴더들과 라이브러리들을 생성해준다




처음 생성하고 나면


위에 있는 폴더리스트에서 app 폴더만 뺴고 나머지가 기본으로 생성이 되어 있는 사앹가 된다.





5. 파이썬으로 웹서버 구동시키기



venv 폴더 아래에 app 라는 이름의 폴더를 하나 만들어주고



그 폴더 안에


index.py 라는 파일을 하나 만들어보자



이름은 상관 없다.



그리고 그 파일에


1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'welcome fucking hell joseon'
 
 
if __name__ == '__main__':
    app.run()
 
 
cs



이렇게 작성을 해준다



그리고 저장한 다음



cmd 창을 키고


저 index.py 파일이 있는 경로에서


python index.py


라는 명령어를 실행하면



이런 메세지가 뜨고



12.7.0.0.1:5000 으로 접속해보면


웰컴 헬조선 이라는 텍스트가 뜬다



이것으로 기본적은 웹서버 구동까지가 끝이다!


오와...


빠르긴 빠르다...


jsp 전자정부 쓸떄는 톰캣설정 따로 해주고 뭐 복잡했는데...



물론 얘도 나중에 html 파일 띄우고 하려면 템플릿 만들어서 뿌려줘야 하니 비슷할지도 모르겠다;;;




그리고 추가로


url 라우터를



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'welcome hell joseon'
 
 
 
@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username
 
 
@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id
 
if __name__ == '__main__':
    app.run()
 
 
cs




이렇게  라우터를 더 만들어 주는데


10번 라인의 경우


127.0.0.1:5000/user/야매개발자



이라는 주소로 접속하면




이렇게 뜬다


우왕 .. 싱기방기...






그리고 파이썬을 쓸때 주의해야 할 점이 있다.


위의 코드에서



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'wellcome fucking hell joseon'
 
 
 
    @app.route('/user/<username>')
    def show_user_profile(username):
        # show the user profile for that user
        return 'User %s' % username
    
    
    @app.route('/post/<int:post_id>')
    def show_post(post_id):
        # show the post with the given id, the id is an integer
        return 'Post %d' % post_id
 
if __name__ == '__main__':
    app.run()
 
cs



이렇게 탭으로 들여쓰기 하면



/user/유저이름


이거 접속 안됨...



하...


스크립트 언어라서 탭에 예민하다는데..


좀 짜증남...


저것떔에 파이썬에 대한 첫인상은 좋지 않았다.




오늘은 여기 까지 했으니


여기까지만 포스팅을 하고


나중에 공부 더 하면 그때 이어서 포스팅을 해보도록 하겠다.



그럼 다들 야근 그만하고 칼퇴 하시길! 

[테라M] 현실적인 소과금 개꿀팁! 강추







테라M 공식카페 깔라만C님의 공략글 입니다.







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



1만1처넌주고 스타팅 패키지사는게 정신적으로 이롭다. 


그리고 한달이상은 할 것 같다싶으면 28일간 잼주는거 그것도 그냥사줘


거지도아니고 솔직히 2만원대는 사줄만하자나? 5만원부터는 다들 비싸다고 생각하니까 사지마


무과금 어쩌고 끝까지 버티면서 정신승리 하려고하지마 그냥 형이 하라는대로만 하면 재밋게할수있다. 알았지?


스타팅사고 1000블루젬으로 2000래드젬으로 바꿔 그담 레드젬으로 가방200까지 열고 100백팩 써줘


남은 레드젬 전부 스킬포인트 구매해 그리고 탈것껴줘


데일리잼사고 500블루젬으로 펫한개사 


그리고 하루에 100개씩 주는걸로 레드잼 200개 바꿔서 스킬포인트 사거나 스킨사서 합성해


현질은 일단 이렇게 하고보는거야 그래야 편하다 안하고 그냥한다고??

그럼 일단 스트레스 조금 받을각오는해 그리고 파밍하고있는 나 자신을 미리 보는거야






현질하고 일단 퀘를 깨지는데까지 게속 진행해 그리고 하다가 막혀?

그러면 던전돌면서 장비 고급, 희귀 암거나 셋템으로 맞춰, 룬도 셋템으로 맞춰

강화는 대충 2~3씩해주고 장비렙업은 20정도만해줘 어차피 40중후반부터 영웅셋 맞춰지니까 그때 장비렙업재료로 쓸거야

그리고 합성하지마 셋템외에 모든 템들은 다 npc 호감도올려

하다가 피곤해? 그럼 도감작하는데가서 반자동돌려놔 그럼 일어나있으면 장비 300개 알아서 차있어

그걸로 뭐하냐고? 첨에 산 탈것이 이때 유용해 마을뺑뺑이 돌면서 npc호감작하면 전부 5단계까지 그냥 쉽게올려

탈것없으면 퀘할때나 npc나 시간개같이 걸린다. 만처넌 포기할래? 시간을 포기할래?

그럼 전투력 2만은 대충 알아서 먹고들어가니까 50까지 메인퀘 진행하는데 문제없어

50쯤되면 영웅풀셋 알아서 맞춰지고 그다음 45던전파밍ㄱㄱ 개꿀

투력높 개많아 35던전보다 더빨라 영웅템도 더잘나와

그다음 뭐해? 영웅작하면서 전설작 해야지

나머지 컨텐츠는 어차피 다 필수니까 다깨줘

돈은 어디서 모으냐고? 부캐들 28렙까지 키워 그담 매일 돈60마넌가지고 전설 만들어

덤으로 부캐들 무탑15층까지 깨놓고 매일 소탕해 그럼 레드젬 캐릭당 20개씩 수급가능해 캐릭간 공유다

형이 진심으로 애기해준다. 이게 현재 테라 최적화 트리다

무과금으로 할거면 그냥 겜삭제하는게 답이다.



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



현실적으로 가장 효과적인 소과금으로 최대 효율을 낼 수 있는 방법입니다.


어차피 뽑기에 꼴아박아봐야 답도 안나오는거


확정적으로 가장 높은 효율의 전투력 올리는 방법이네요.


NPC친밀도 올려서 능력치 올리는 방법은


아직까지 많은분들이 잘 모르고


알더라도 실행을 잘 안하는 것 같습니다.


저도 이방법 써야 겠네요 ㅋㅋ


부캐들 28렙까지 키 워서 돈 60만원 얻는건


계정내의 캐릭터들은 골드와 젬등을 공유 합니다.


즉 28까지 부캐 5개 더 만들어서 골드던전 싹 돌면


하루에 60만골드를 얻을 수 있다는 거죠


개꿀팁입니다 ㅋ



[테라M] 에러코드 65538 계정연동 오류, 푸쉬알림 오류



현재 아이폰에서 발생하는 대표적인 오류 두가지는 


에러코드 65538 계정연동 오류, 푸쉬알림 오류 이 두가지일 것이다


푸쉬알림 오류는 일종의 권환오류중 하나라고 생각되어 진다.


녹스에서도 동일한 오류가 발생하고 아이폰에서 발생한다는 점에서


개인적인 뇌피셜로는 권한관련 오류일듯 한데


이건 금방 고쳐질것 같다. 게임하는데 지장도 없으니 큰 문제도 없는데


문제는


에러코드 65538이다


로그인 오류 : 앱에 로그인하시는데 오류가 발생했습니다. 나중에 다시 시도하세요



라는 문구가 나타나는데


안드로이드에서 계정연동 후


아이폰기기로 다시 계정 연동할때 나타나는 에러다



안드로이드에서 키워놓은거 폰바꿔서 아이폰으로 연동하려는데


그게 안되면


얼마나 빡치겠는가.



개인적인 해결 방법은



안드로이드에서 계정 연동을 먼저 했다 아이폰으로


옮겨야 하는경우




1. 아이폰에 설치된 테라의 캐쉬데이터를 전부 지우고 다시 연동을 시도 한다



2. 1번이 안되면  PC에 녹스 설치후 녹스에 테라M을 설치한 다음 녹스에서 페북 연동을해 캐릭터를 가져온다.

   그리고 그 이후 아이폰에서 페이스북 연동을 이용해 캐릭터 정보를 가져온다.(이때 녹스에서 페북연동을 해지하지 않습니다. 그냥

녹스만 종료하고 연동 ㄱㄱ)




위의 두가지 방법이 전부 안된다면...








첫 번째,

1. 설정>게임센터로 가서 현재 로그인하고 있는 Apple ID를 선택한 뒤 로그아웃합니다. 그리고 다시 로그인하세요.

2. iPhone/iPad를 강제로 재시동합니다(iPhone, iPad 또는 iPod touch 재시동하기 - Apple 지원에서 "강제로 재시동하기"를 참조하세요. 사과로고가 보일 때까지 홈버튼+잠자기버튼을 계속 누르고 있으면 강제 재시동이 됩니다.)

3. 설정>일반>날짜와 시간에서 "자동으로 설정(Set Automatically)"을 켬으로 합니다.

이 방법이 듣지 않는 사용자는 다른 방법을 다시 적용해 보세요.

 

두 번째,

1. iPhone/iPad에서 현재 구동중인 모든 앱을 닫습니다.

2. 에어플레인 모드로 변경합니다.

3. 전원을 껐다가 몇 분 기다린 뒤 다시 iPhone/iPad의 전원을 켭니다.

4. 설정>게임센터에서 현재 로그인되어 있는 Apple ID를 선택한 뒤 로그아웃합니다.

5. 에어플레인 모드를 해제하고, 다시 wifi를 활성화합니다.

6. 설정>게임센터에서 다시 로그인합니다.




OR


간단히는 설정>재설정>모든 설정 재설정


OR


아예 다른 Apple ID로 게임센터를 로그인하는 것만으로 문제가 해결되었다는 사람도 있습니다;


위의 방법까지 안된다면....

저도 방법이 없네요 ㅠ_ㅠ


하지만 게임 에러해결 전문가로 방법은 계속 찾아보도록 하겠습니다.


[테라M] 녹스로 테라M 돌릴때 버벅거림 팅김 검색결과 안나오는 현상 해결 방법



녹스로 테라M 하고싶은데 구글검색하면 안뜨는 현상 팅김 등 현상  해결하는 팁입니다.




1) 휴대폰 모델 변경: 시스템 설정 > 속성 > 휴대폰모델 설정 에서 모델 변경(samsung galaxy s6 edge,SM-G9350 등 모델)


2) apk 파일 수동 설치 방법

- 다운로드 받은 apk 파일을 녹스 프로그램 화면 위로 드래그.

- apk 수동설치가 자동 진행되고, 앱이 설치됨


3) 브라우저 권한동의 방법

   nox 내 브라우저를 여시면 권한동의 메시지가 뜰 것입니다.

   동의해주시고 nox 재실행 부탁드립니다.

- nox 화면에 있는 구글플레이 실행하여 꼭 업데이트하셔야 합니다.


4) 구글 플레이 스토어 캐시 삭제

- 설정 > 어플리케인션 > 전체(오른쪽으로 드래그) 보기

- 구글 플레이 스토어 선택

- 데이타 지우기 / 캐시 지우기 진행


5) 해상도 변경 : 1280 x720

(변경후 녹스 재시작)


6)녹스시스템설정> 고급설정 > 그래픽모드- 스피드모드


7)성능설정-중



마지막으로 녹스에 할당되는 메모리 용랴은 2기가 이상으로 해주셔야 합니다.

[테라M] 다운로드 에러코드 -10 해결 방법


모바일게임 초창기엔 


어딜가나 에러가 있기 마련이죠



저도 개발자이기 때문에


그리고 머드게임을 개발하고 운영하고 있는 사람이기에


어쩔수 없다는걸 알고 있습니다.


그리고 해결방법도 항상 존재하지요



이번엔 녹스같은 앱플레이어를 사용할때 나타나는


다운로드중 발생하는 에러코드 -10에 대한 해결 방법에 대해 알아보겠습니다.





지금은 해결되고 업데이트가 되었는진 모르지만


녹스에서 발생하는 다운로드 에러 사항에 대한 해결 방법으론



전통적으로 인터넷이 연결되는 경로를 바꾸는 것입니다.


방법은


.



1. 만약 와이파이로 연결주이었다면 직접 LAN선을 꽂아서 사용하기


2. 랜선연결이라면 와이파이로 잡아놓고 다운받기


3. 1.2 둘다 안된다면 핸드폰 핫스팟을 켜고 다운 받아보기


4. 1,2,3 전부 안된다면 외부 인터넷 ( 마트 공용 와이파이라던가... 다른 장소)을 사용하여 다운 받아보기


5. 랜선을 다 뽑고 공유기와 모뎀전원을 껏다가 킨 후 다운 받아보기




위의 5가지 방법중에 하나론 해결이 됩니다.


개인적인 견해론 다운로드중 방화벽에 막히거나


패킷오류가 났다거나 혹은


서버에서 데이터를 다운 받는중에 인증문제가 발생했다거나 인것 같은데


워낙 다양한 경로에서 에러가 날 수 있어서 정확하겐 모르겠네요


만약 에러코드 -10이 나타났다면 위의 방법을 이용해 해결할 수 있으면 좋겟습니다.





- 아룬서버 <무서운언니들> 길드에서 혈원 모집 하는 중입니다. 길드원끼리 다양한 정보를 공유 할 수 있어요~

가입요청 부탁 드립니다!

[JXLS] JAVA SPRING 데이터 엑셀출력 및 셀병합, merge 하는 방법







웹프로젝트를 개발하다보면


테이블이나 어떤 데이터들을 엑셀로 다운받는 기능을 만들어야 하는 경우가 있다.



일단 엑셀로 만드는게 POI만 쓰면 진짜 더럽게 귀찮아진다.


그렇다고 제이쿼리 excel export를 쓰자니


페이징처리된 테이블의 데이터들을 뽑기가 애매하고


1만로우쯤 되었을때 그걸 다 테이블에 append 시키기도 오바같다



그래서 찾다찾다 찾아낸것이


JXLS


일단 jxls는 poi 기반으로 만들어졌다.


사용법은


정말 간단하다.


그냥 마이바티스에서 db데이터 뽑아서


페이지로 날려주는 그 모델


해쉬맵데이터 형식으로뽑은걸 그대로 사용하면 된다


엑셀에 위치 지정이나 반복되는것은 


미리 엑셀 템플릿을 만들어 놓으면


그대로 들어간다.



일단 셋팅 방법부터 알아보도록 하자.


전자정부 기준이로 설명 한다.




1. pom.xml  


pom.xml의 dependency 부분에 아래 코드를 넣어 주도록 하자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!-- 엑셀 다운로드 -->
        
        <dependency>
              <groupId>net.sf.jxls</groupId>
               <artifactId>jxls-core</artifactId>
             <version>1.0.6</version>
        </dependency>
       <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-poi</artifactId>
            <version>1.0.13</version>
        </dependency>
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-jexcel</artifactId>
            <version>1.0.6</version>
        </dependency>
cs




위에서 말했듯 jxls는 poi를 사용하기 때문에 poi도 받아주어야 한다.





2. 엑셀만들고 다운로드 받는 클래스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package 패키지 경로;
 
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import net.sf.jxls.exception.ParsePropertyException;
import net.sf.jxls.transformer.XLSTransformer;
 
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
 
// MakeExcel이라는 클래스를 만들고 그 안에 downliad라는 메소드를 생성한다.
public class MakeExcel {
    public void download(HttpServletRequest request, HttpServletResponse response,
                    Map<String, Object> bean, String fileName, String templateFile, String string)
                    throws ParsePropertyException, InvalidFormatException {
 
        // 받아오는 매개변수 bean는 디비에서 뽑아온 데이터
        // fileName 은 다운로드 받을때 지정되는 파일명
        // templateFile 는 템플릿 엑셀 파일명이다.
        
        // tempPath는 템플릿 엑셀파일이 들어가는 경로를 넣어 준다.
        String tempPath = request.getSession().getServletContext().getRealPath("/WEB-INF/excel");
        
 
        // 별도로 다운로드 만들기 귀찮으까 이런식으로 만들어서 바로 엑셀 생성후 다운 받게 
        try {
 
            InputStream is = new BufferedInputStream(new FileInputStream(tempPath + "\\" + templateFile));
            XLSTransformer xls = new XLSTransformer();
            
            
            Workbook workbook = xls.transformXLS(is, bean);
            
            
            response.setHeader("Content-Disposition""attachment; filename=\"" + fileName + ".xlsx\"");
            
            OutputStream os = response.getOutputStream();
            
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
cs



3. 엑셀 다운로드 요청 및 데이터가져오는 메소드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 @RequestMapping(value = "/downExcel.do")
        public void listExcel(HttpServletRequest request,
                HttpServletResponse response, VO vo,
                ModelMap modelMap) throws Exception, Exception {
 
            
            // 그냥 평소에 마이바티스에서 데이터 뽑는 방법으로 데이터를 가져온다.
            List<VO> dataList = trs01Service.selectGroupList(groupVO);
            
            
            // 받은 데이터를 맵에 담는다.
            Map<String, Object> beans = new HashMap<String, Object>();
            beans.put("dataList", dataList);
            
            // 엑셀 다운로드 메소드가 담겨 있는 객체
            MakeExcel me = new MakeExcel();
 
            me.download(request, response, beans, "다운받을때지정될 엑셀파일명""엑셀템플릿 파일 명.xlsx""무시해도됨");
        }
cs





이렇게 하면 자바에서 할 건 끝났다.



막 예전에 POI에서 셀위치 지정하고 했던것들은 하지 않아도 된다!!



저 템플릿위치에 아래 4번에서 만든 템플릿 엑셀파일을 넣어놓고


3번에서 만든 메소드를 호출하면 해당 데이터를 담은 엑셀을 다운로드 받게 된다.


정말 너무너무 간단하다.




4. 템플릿 엑셀 예제





위 그림과 같이 JSTL 쓰던것 처럼 적어주면 된다.


저렇게 적으면 콜렉션일 경우 자동으로 반복까지 해준다.


그냥 저렇게만 만들어 두면 저 위치부터 아래로 쭉쭉 엑셀데이터가 입력 되는 것이다.



엄청나다.





5. 셀병합, merge






이런식으로 셀병합을 하고 이름옆에 3줄로 다른 정보를 반복시켜야 하는 경우가 있다.



그냥 4번에 있는식으로 템플릿만들어서 적으면 에러난다.


java.lang.NullPointerException

at net.sf.jxls.util.Util.shiftColumnUp(Util.java:335) ~[jxls-core-1.0.6.jar:?]

at net.sf.jxls.util.Util.shiftUncoupledCellsUp(Util.java:315) ~[jxls-core-1.0.6.jar:?]

at net.sf.jxls.util.Util.duplicateRow(Util.java:246) ~[jxls-core-1.0.6.jar:?]

at net.sf.jxls.controller.SheetTransformationControllerImpl.duplicateRow(SheetTransformationControllerImpl.java:140) ~[jxls-core-1.0.6.jar:?]

at net.sf.jxls.transformer.CollectionRowTransformer.processRowCollections(CollectionRowTransformer.java:106) ~[jxls-core-1.0.6.jar:?]

at net.sf.jxls.transformer.CollectionRowTransformer.transform(CollectionRowTransformer.java:66) ~[jxls-core-1.0.6.jar:?]



이런 에러가 막 뿜어져 나올 것이다.


왜 에러가 나느냐..


템플릿을 잘못 만들었기 때문이다.


이걸 보는 여러분들도 템플릿으로 이것저것 에러뿜어가면서 테스트 하다보면


알수 있을 이유이다


그냥 해결방법만 간단하게 말하면





이런식으로 셀병합한 위치에 들어가는 데이터 옆에 //:숫자  를 넣어 주면 된다.


만약 데이터가 3칸을 병합해서 세줄단위로 넘어가야 하는 경우


0 , 1, 2  로 세서 숫자 2를 넣어주면 된다.



머지를 하지 않더라도


2줄단위로 반복하거나 3줄단위로 반복하게 하는 경우에도 동일하게 적용하면 된다.



JXLS의 가장 좋은 장점은 데이터 넣는곳 템플릿에 스타일 넣어주면 그 스타일도 같이 반복이 된다.


아주 훌륭하다


[안드로이드] 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>


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



그럼 해결이 된다!

[음양사] 음양사 쿠폰 추가 정보







음양사 쿠폰 100곡옥 주는


기묘한식작음양사 이외의 더 발견한 쿠폰번호들 입니다.


쿠폰을 이용하면 쉽게 곡옥을 얻을 수 있습니다.



1. 카카오택시 쿠폰 100곡옥


쿠폰번호 : a8fdc8cd77f84abb



2. 모비, 겜셔틀 


어플 설치시 쿠폰 획득 200곡옥



3.카카오 네비 쿠폰  100곡옥


어플 설치 후 목소리변경 하면 쿠폰을 받을 수 있습니다.



4.별플레이어 쿠폰 100곡옥


별플레이어 어플 설치 후 쿠폰을 얻을 수 있습니다.



[안드로이드] 웹뷰 자바스크립트와 안드로이드 자바 연동 방법


안드로이드의 웹뷰를 사용해 개발을 하다 보면 웹뷰에서 띄운 자바스크립트와


안드로이드의 자바 소스간에 연동을 해야 하는 경우가 생긴다



즉 자바스크립트에서 안드로이드 메소드를 호출 하거나


안드로이드에서 자바스크립트 함수를 호출해야 하는 경우인데.


그 방법에 대해서 알아 보도록 하자.



1. mainActivity.java 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final DBHelper dbHelper = new DBHelper(getApplicationContext(), "MoneyBook.db"null1);
        // 웹뷰 셋팅팅
        mWebView = (WebView) findViewById(webView);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.loadUrl(myUrl + "/html/test.html");
        mWebView.setWebChromeClient(new WebChromeClient());
        mWebView.setWebViewClient(new WebViewClientClass());
    
 
        // Bridge 인스턴스 등록
        mWebView.addJavascriptInterface(new AndroidBridge(mWebView, dbHelper, newtwork), "HybridApp");
 
 
 
    }
cs



메인 액티비티의 oncreate 메소드에 웹뷰 셋팅을 해놓고 그 아래에 안드로이드브릿지를 등록 한다.



2. AndroidBridge.java


1번의 15번 라인의 안드로이드 브릿지를 사용하기 위해 클래스를 추가 해 주도록 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.xxx.xxxxx;
 
import android.os.Handler;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
/**
 * Created by Administrator on 2017-08-03.
 */
 
public class AndroidBridge {
    private final Handler handler = new Handler();
    private WebView mWebView;
    private DBHelper dbHelper;
    private  boolean newtwork;
 
    // 생성자
    // 따로 사용할일 없으면 이거 안만들고 위의 변수도 안만들어도 됨.
    public AndroidBridge(WebView mWebView, DBHelper dbHelper, boolean newtwork) {
        this.mWebView = mWebView;
        this.dbHelper = dbHelper;
        this.newtwork = newtwork;
    }
 
    // DB데이터 가져오기
    @JavascriptInterface
    public void requestData() { // must be final
        handler.post(new Runnable() {
            public void run() {
                Log.d("HybridApp""데이터 요청");
                String test  =  dbHelper.getResult();
                Log.d("HybridApp", test);
                mWebView.loadUrl("javascript:getAndroidData('"+test+"')");
            }
        });
    }
 
    // DB에 데이터 저장하기
    @JavascriptInterface
    public void saveData(final String item, final int num) { // must be final
        handler.post(new Runnable() {
            public void run() {
                Date d = new Date();
 
                String s = d.toString();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 
                dbHelper.insert(sdf.format(d), item, num);
                Log.d("HybridApp""데이터 저장");
                String test  =  dbHelper.getResult();
                mWebView.loadUrl("javascript:getAndroidData('"+test+"')");
            }
        });
    }
 
 
 
}
cs



DB데이터 가져온다는 내용은 신경쓰지 말자


일단 1번과 2번을 완료 했다면 안드로이드에서 할일은 끝났다.


여기서 봐야 할 것은


30번 43번 라인의 어노테이션이다. API17이상부터 저 어노테이션을 달아주지 않으면


정상 작동하지 않는다.


그리고 31 44번의 requestData, saveData 이 메소드명이 자바스크립트에서 호출하는 이름이 된다.


그리고 37 55번라인은 안드로이드에서 자바스크립트로 데이터를 날려주면서 


자바스크립트 function을 호출하는 부분이다.



3. javascript


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
$(function(){
    window.HybridApp.requestData();
});
 
function saveData(){
    var item = $("#item").val();
    var num = $("#num").val();
    window.HybridApp.saveData(item, num);
}
 
 
function getAndroidData(data){
    alert(data);
 
    var dataArr = data.split("*nn*");
    $("#testDiv").empty();
    for(var count=0; count < dataArr.length; count++){
        $("#testDiv").append("<p>"+dataArr[count]+" </p>");
    }
 
}
cs



자바스크립트에서 안드로이드 메소드를 호출할땐


window.1의 15번라인에서 선언한 이름.2에서 선언한 메소드명();


이런식으로 호출을 해주면 된다.


만약 3번라인의 리퀘스트데이터를 호출하면


2의 31번 메소드가 응답하며 2의 37번 라인이 동작해 자바스크립트 3의 13번function이 동작한다.




물론 위에 보는 것 처럼 안드로이드와 자바스크립트간의 텍스트 데이터도 전송이 가능 하다.

+ Recent posts