본론으로 들어가기 앞서, 이 글은 유닛테스트(Unit test)를 작성하는 프로젝트에 참여, 관리하는 분들께만 해당됩니다. 


유닛 테스트를 작성하는 프로젝트에서는 유닛 테스트 코드가 얼마나 잘 작성되고 있는지 수시로 확인하고자 하는 요구 사항이 항상 있기 마련입니다.  

이를 요청이 들어올 때 마다 처리해야 한다고 하면 매우 귀찮은 일이 되겠죠. 


반복되는 단순 작업은 최대한 컴퓨터(기계)에게 맡기는 게 여러가지로 좋기 때문에.. 젠킨스(Jenkins)나 허드슨(Hudson)을 사용 해서 매우 쉽게 소스코드 커버리지(code coverage)를 관리해봅시다. 


여기서는 파이썬(Python)에 대한 방법을 다룰 예정입니다. 

물론, 개발중인 언어별로 설정 방법이나 사용하는 플러그인이 조금씩 다를 수 있습니다. 



플러그인 설치 


Plugin Manager 페이지에서 'Cobertura Plugin' 를 검색해 봅시다. (젠킨스에서는 'Jenkins Cobertura Plugin'으로 찾으셔도 됩니다.)

'Cobertura Plugin'의 체크박스를 체크 하고 설치를 하면 됩니다. 




우분투(리눅스) 프로그램 설치 


coverage라는 툴을 사용해야 하니 설치 해 줍니다. 


$ sudo apt-get install python-coverage



젠킨스 설정


설치가 완료되면 코드 커버리지를 설정할 프로젝트에서 '구성(configure)' 메뉴에 들어가서 '빌드'파트에 'Execute shell'을 선택해서 추가해줍니다. 


아래와 같이 수행할 명령을 작성해 줍니다. 



저의 경우 장고(Django)에서 개발 중이므로 위와 같이 unit test를 수행했습니다. 

각자 필요에 따라 테스트 수행하는 코드만 변경하시면 됩니다. 


이렇게 하면 code coverage 결과물이 생성될겁니다. 

이 결과물을 젠킨스에서 보기 편하게 보여주도록 하는 작업만 추가하시면 됩니다. 


'빌드 후 조치 추가'에서 'Publish Cobertura Coverage Report'를 선택해서 추가해줍니다. 


해줄 작업은 매우 간단합니다. code coverage xml 파일을 지정해주기만 하면 됩니다. 


파일별로 실제 코드 라인별로 커버리지 결과를 보고 싶다면 '빌드 후 조치 추가'에서 'Publish HTML reports'도 선택해 줍시다. 

디렉터리와 HTML 파일명을 지정해 주기만 하면 됩니다. 




결과 조회


위 작업을 문제없이 잘 진행하셨다면 프로젝트(job)를 빌드시켜 봅시다. 

아래와 같은 결과 화면이 보일겁니다. 



코드 커버리지 결과 그래프나 'coverage Report'링크를 클릭하면 세부적인 정보를 확인 할 수 있습니다. 




참고로, 여기서는 실제 소스코드를 보면서 확인 하는건 불가능 합니다. 그건 HTML Report에서 확인이 가능합니다. 


혹시 궁금하신점이 있다면 댓글로 남겨주세요. ^^ 



Posted by KT한
,

장고(Django) 환경의 HTML페이지에서 값을 입력 받아, ajax로 서버로 보내면 json타입으로 결과를 받아 실시간으로 화면에 보여주는 기능에 대한 내용입니다. 

다른 환경이나 언어라 하더라도 내용을 이해하시면 응용해서 쉽게 적용이 가능합니다. 



동작 방식을 그림으로 그려보자면 아래 그림과 같은 구조입니다. 




대략적인 동작 순서는

먼저 HTML페이지에서 입력창을 통해 사용자로 부터 값을 입력 받게 되면 

(1)JQuery에서 입력받은 값을 가지고 서버로 보내기 위한 작업을 진행하고 

(2) Ajax로 서버로 패킷을 전송하게 됩니다. 


이에 대해 서버에서는 결과값으로 보여줄 값에 대한 처리를 진행 한 후 

(3) 데이터를 Json 타입으로 변환하여 응답 패킷을 보냅니다. 

(4) 응답 패킷을 화면에 보여줄 포맷에 맞게 처리 하여 HTML 화면에서 보여주게 됩니다. 




이제, 화면별로 소스코드를 살펴봅시다. 


HTML 페이지 



'input' 태그(tag)를 사용해서 값을 입력 받도록 하고, 입력 받은 값은 'searchword'라는 'id'로 접근 할 수 있도록 해줬습니다. 

'div' 태그의 id값인 'results'는 결과값을 보여주기 위해 사용합니다. 

'searchajax()'는 아래 있는 jquery로 작성한 코드를 호출하는 코드입니다. 



JQuery 파일 



텍스트 입력 필드의 값을 가져와서 값이 존재하면 ajax로 전송하는 코드입니다. 

텍스트 입력 여부는 'keyup()' 함수를 사용해서 판단 할 수 있습니다. 

Ajax는 'POST' 메소드(method)로 보내며 데이터는 키(key) 값을 'searchwords'로 해서 전송합니다. 

성공적으로 전송하고 응답을 받았다면, 'success'에 작성한 것 처럼 값을 html 의 'results' 필드에 넣어주는 작업까지 진행합니다.



장고(Django) 서버 (파이썬)



'POST' 패킷에 대해 'searchwords' 값이 존재하는지 확인 후 원하는 작업을 수행하도록 코드를 작성해주시면 됩니다. 

결과값에 대해서는 json 타입으로 변환 후 응답 패킷을 보내주도록 하면 됩니다. 

물론, 장고의 url 설정에 '/browser/searchData/' 에 대한 값을 추가해주셔야합니다. 



이제 입력 필드에 값이 입력 될 때마다 실시간으로 결과 값이 화면에 출력되는것을 확인 하실 수 있을 겁니다. 


Posted by KT한
,

'clash of clans'은 'SUPERCELL'이란 회사의 게임인데 게임내 아이템 판매 수익으로만 연 매출이 1조가 넘는 엄청난 게임입니다. 

이 게임에서 가장 중요한 것은 건물을 짓는 빌더(builder)를 얼마나 잘 활용하는가 입니다. 

빌더 때문에 현질하는 사람이 상당하기 때문에 엄청난 매출이 가능한것이겠죠. 

한 마디로 게임 기획자가 사람 심리를 참 잘 알고 게임도 정말 잘 만들었다는 생각이 절로 드는 게임입니다. 

현질을 하지 않고 빌더를 늘리고 싶으시거나 현질을 하더라도 얼마나 해야 할지 고민이시라면 빌더에 대해 좀 더 알아보시고 결정 하시는게 좋겠죠?




구입 가격 


 빌더 순번

 구입 가격 

 첫 번째 빌더 (기본 제공)

 공짜   

 두 번째 빌더 (튜토리얼 중 구입)

 250  

 세 번째 빌더 

 500  

 네 번째 빌더

 1,000  

 다섯 번째 빌더(마지막)

 2,000     

 총 합

  3,750  



잼(Gem) 얻는 방법


1. 1250 트로피 달성시 보상으로 주는 450 잼 획득

가장 많이 알려져 있으며 가장 현실적인 방법입니다. 

단점은 트로피를 1250까지 올리려면 게임을 어느정도 진행하셔야만 가능합니다. 트로피를 얻는 방법이 상대편 기지를 공격해서 승리 해야만 보상으로 주어지는 것인데, 나의 트로피를 기준으로 공격 가능한 상대를 추천해 주기 때문에 트로피가 높아질 수록 상대도 강한 사람들이 대부분입니다. 일반적으로 타운홀의 레벨이 6~7일 때 가능합니다. 물론, 타운홀 레벨만 신나게 올리면 상대편의 공격에 허무하게 털리기 쉽상이라 잼(Gem)보상을 받기 전에 의욕을 상실 할 수 있으니 방어 건물의 레벨도 같이 올리시는게 좋습니다. 


트로피 올리는 방법에 대한 한 가지 팁을 드리자면, 상대 진영을 살펴보다 보면 타운홀을 공격 건물로 부터 멀리 떨어트려 놓는 사람들이 있습니다. 

아처만 많이 뽑아서 그런 집만 찾아다니면 매우 쉽게 1250트로피 달성이 가능합니다. 

타운홀만 부숴도 8~10 트로피 정도를 보상으로 받게 되는데 아처는 생산속도가 빠르기 때문에 시간도 얼마 걸리지 않습니다. 



2. 주변 청소 시 랜덤하게 주어지는 잼 획득 

지도에 나무, 돌, 수풀 같은 장애물들이 있는데 이걸 제거하면 보상으로 잼을 얻을 수 있습니다. 잼의 개수는 최대 3개까지 랜덤하기 때문에 운이 좋다면 남들보다 조금 더 빨리 모을 수는 있을 겁니다. 물론, 꽝도 있습니다. 



그리고, 장애물들은(돌을 제외하고) 8시간 마다 한 개씩 자동으로 다시 생깁니다. 생길때 마다 열심히 제거하다 보면 은근 짭짤한 잼 수익원이 됩니다.



3. 그 외의 퀘스트 보상 

물론, 위에 설명한 내용들도 퀘스트이긴 하지만 그 외에도 다양한 퀘스트가 존재합니다. 

모든 퀘스트를 모두 달성하게 되면 최대 6,312개의 잼을 보상으로 받을 수 있다고는 합니다. 물론, 이건 희망고문일뿐 전 세계 순위 손가락 안에 드는 사람들도 모두 클리어한 사람은 거의 없습니다. (아마 아직 한 명도 없는것 같습니다.)

그래도 '1250 트로피 달성 퀘스트'를 클리어 할 때 쯤이면 '장애물 청소 보상'으로 받은 잼과 초기에 주어진 잼을 합치면 대략 500개 정도는 모을 수 있습니다. 



현질은 필수!  vs  현질은 돈지랄! 


현질에 정답은 없습니다. 자신의 스타일에 맞게 선택하시는게 가장 좋습니다. 

게임을 하면서 느낀 스타일 별 현질 방법 추천은 크게 세 가지가 되겠네요. 


1. 게임에 큰 돈은 쓰기 싫고 게임을 좀 더 수월하게 즐기고 싶다면 'US$4.99' 결제로도 충분합니다. 

US$4.99 결제로 얻는 잼은 500개입니다. 이걸로 초기에 빌더를 하나 구입하시고 위에서 설명한 방법으로 잼을 얻으신다면 1250 트로피를 달성 하실 때 쯤에는 네 번째 빌더를 추가적인 현질 없이 구입할 수 있습니다. 

이 방법은 다섯번째 빌더는 거의 포기하는 방법입니다. 


2. 느림의 미학으로 천천히 즐겨도 충분하다면 현질 하지 마세요. 

건물 레벨이 올라갈 수록 업그레이드 하는데 걸리는 시간이 배로 늘어납니다. 평소 오래 기다리는것에 익숙하고 이 게임에 큰 흥미를 느끼지 못하신다면 현질 하지 않는게 좋습니다. 대부분의 게임내 결제 아이템이 그렇듯 잼 구입에 드는 비용이 결코 저렴하지 않습니다. 

결제 후에 게임에 흥미를 잃어버린다면 큰 낭비겠죠. 


3. 답답한건 딱 질색이고 이 게임은 날 위한 게임임에 틀림없다면 한 방에 'US$19.99' 이상 결제하는것이 이득일 수 있습니다. 

저는 결코 'SUPERCELL'로 부터 로비나 돈을 받고 이 글을 쓰는게 아닙니다만...

주변에도 여러번 나눠서 추가로 현질을 하는 분들이 있습니다. 한 번에 많이 사면 보너스 잼을 주기 때문에 조금 더 저렴합니다. 


시작부터 빌더를 모두(5개) 구입하고 싶으시다면 위에서 설명 드린것 처럼 3,750개의 잼이 필요한데 'US$19.99'는 2,500잼 밖에 되지 않습니다. 

결국 빌더 구입 외에 다른곳에 잼을 쓰지 않을 것이라면 'US$19.99' + 'US$9.99' 를 결제하거나 'US$49.99'를 결제 하시는게 유리합니다. 


혹은, 게임중에 얻게 되는 잼을 감안해서 'US$19.99'만 결제하고 열심히 보상으로 받는 잼을 모아두면 어느정도 게임을 진행한 후에 다섯번째 빌더까지 구입하실 수 있습니다. 

 


현명한 선택으로 즐겁게 게임을 즐기세요. ^^

Posted by KT한
,


비트코인(bitcoin)
은 코인 이라는 이름에서 알 수 있듯이 화폐입니다. 

하지만 신기한건 전 세계 어느 나라도, 어떤 기관도 비트코인을 발행하지 않습니다. 

누구도 발행하지 않는 화폐라고 하니 시작부터 이건 뭔 말장난 인가 싶을겁니다. 

아래 내용을 읽고 나면 비트코인이 대충 어떤건지 감을 잡으실 수 있을 겁니다. 




탄생

2009년 사토시 나카모토 (Satoshi Nakamoto)라는 이름의 사람(단체)이 처음 고안해냈다고 합니다. 

개인적으로는 일본 사람 이름 같은데.. 사람 이름이라는 증거가 없어서 단체 이름일 수도 있다고 추정한다고 합니다. 

어쨌든, 사토시는 2008년 디자인을 시작하였고 2009년 부터 비트코인이 생성되기 시작했습니다. 

2010년 부터는 실제 거래가 가능했으며 마켓도 형성되기 시작 했습니다.  이후로는 말 그대로 폭발적인 성장을 이어오고 있습니다. 

그리고 사토시는 이제는 더 이상 자신이 개입하지 않아도 될 만큼 안정됐다고 생각해서 인지 어느날 종적을 감춰버렸습니다. 

처음 부터 사토시의 실체를 아는 사람이 없었기 때문에 종적을 감추는 것도 가능하지 않았나 싶습니다. 


이런 비트코인은 실체가 없는 가상화폐입니다. 

비트코인으로 물건을 사고 팔 수는 있지만 전자지갑속에만 존재하며, 인터넷 뱅킹을 하듯 숫자만 보일 뿐이죠. 


비트코인은 이해하기 쉽게, 편의상 금화 한 닢 이라고 생각하시면 될것 같습니다. 

1 비트코인의 가격은 수시로 변합니다. 

최초 발행시에는 1비트코인(BTC) = 1달러($) 였다고 하는데 현재는 수백배를 호가하는 가격으로 거래가 되고 있습니다. 



거래 

비트코인(bitcoin)은 한국은행처럼 발행/관리 하는 중앙 장치/기관이 없습니다. 

모든 거래는 P2P 구조(peer-to-peer electronic cash system)공개키 암호화 방식으로 이루어지고, 결과는 분산 데이터베이스 방식으로 비트코인 Peer들의 PC에 저장됩니다. 이는 이중 결재(double-spending)를 방지하는 효과도 있습니다. 

 

해킹을 통해 거래 결과를 속이려고 해도 거래 결과를 저장하고 있는 모든 분산 데이터베이스를 해킹해야 하므로 거의 불가능합니다. 

물론, 개인 전자지갑이나 거래소를 해킹해서 훔치는것은 가능합니다. 


재미있는건 비트코인도 화폐처럼 송금도 가능합니다. 화폐는 송금시 매우 많은 수수료를 받지만 비트코인은 별도의 수수료가 없습니다. 

다만, 보내는 사람으로 부터 받는 사람까지 중간에 거쳐가는 노드들에게 약간의 수수료를 제공해주면 매우 빨리 송금이 된다고 합니다. 

반대로 수수료를 전혀 제공하지 않는다면 몇일이 걸려서 송금이 완료되기도 한다고 하네요. 



물건을 사기 위해 사용하거나 타인에게 송금해주는 것만 가능한 것은 아닙니다. 

일반 화폐처럼 비트코인과 화폐를 환전 하거나 서로 사고 파는것도 가능합니다. 

한국 최대의 거래소인 코빗(Korbit) 과 같은 온라인 거래소를 이용하면 한화로 비트코인을 구매하거나 팔 수 있습니다.  


비트코인은 잘개 쪼개서 사용이 가능한데 밀리코인(mBTC=.001), 마이크로코인(μBTC=.000001), 사토시(satoshi=.00000001)와 같은 단위로 거래됩니다. 



비트코인 벌기

그렇다면 발행도 하지않는 비트코인은 누구에 의해서 어떻게 생겨나는 걸까요? 

비트코인을 벌기 위해서는 컴퓨터로 암호화 문제를 풀면 보상으로 제공된다고 이해하면 쉽습니다. 


비트코인을 벌기 위해 암호화 문제를 푸는 행위를 채굴(Bitcoin mining)이라고 비유합니다. 

비트코인을 금화라고 생각하면 좀 더 이해가 쉬울지도 모르겠습니다. 


이쯤 되면 이런 생각이 들겁니다. 

너도나도 문제를 풀기 시작하면 비트코인이 너무 많이 생겨나고 결국 가치가 하락하는건 아닌가? 


다행히도 이런걸 방지하기 위해서 문제를 풀 수록 문제의 난이도가 높아져서 갈수록 생산량이 줄어드는 구조로 되어 있습니다. 

게다가 최대 생산량은 2,100만개로 제한이 있다고 합니다. 



위 그래프에서 보는 것 처럼 문제의 난이도를 조절해서 생산량이 조절 되도록 설계 되어 있는겁니다. 

초반에는 문제 난이도가 쉬워서 많이 생산 됐는데, 2013년 기준으로 전체의 절반 정도인 1,000만개가 채굴 되었다고 하네요. 


만약 지금이라도 채굴을 시작하고 싶다면  비트코인 채굴 사이트를 참고하시면 됩니다. 

하지만, 개인적으로 채굴을 시도하는건 비추합니다. 


초기에는 문제가 쉬워서 개인 PC로도 쉽게 풀 수 있었겠지만 비트코인이 돈이 된다는 사실을 알게 된 수 많은 사람들이 채굴에 뛰어드는 이른바 '비트코인 골드러쉬'가 이미 진행 되고 있기 때문입니다. 

문제의 난이도가 어려워 지면서 그래픽카드의 GPU를 사용해서 채굴 하는 방식이 한 때 유행 했으나 머지 않아 채굴에 특화된 ASIC(Application-Specific Integrated Circuit)이 출시 되었죠. 


비트코인 채굴(Bitcoin mining) 전용 ASIC


이렇게 해도 문제 푸는게 쉽지 않아지자 채굴 하는 사람들 끼리 서로 연대를 하기 시작합니다. 

이른바 'Bitcoin Mining Pools'라고 합니다. 



문제를 같이 풀고 보상으로 받은 비트코인을 문제 풀이에 기여한 비중대로 나누는 방식입니다. 

이 마저도 참가자가 많아서 생각보다 비트코인 채굴하는 작업이 쉽지 않습니다.


구글(Google) 이미지 검색창에 'Bitcoin mining'을 검색해 보세요. 

왜 하지 말라고 하는지 쉽게 이해가 되실겁니다. 



가능성

비트코인 채굴이 어렵다고 해서 비트코인을 사지도 말라는 의미는 아닙니다. 

초창기에는 별 관심을 못 받는 듯 했지만, 요즘들어서는 세계 각국에서 공식적으로 비트코인을 언급하거나 대응방안에 관한 의견을 내고 있기 때문입니다. 

이는 비트코인의 위상이 그만큼 높아졌고 어쩌면 멀지않은 미래에는 공식 화폐로써 사용될 수도 있다는 것을 반증하는 것이라고 볼 수도 있겠죠. 

공식화폐로 사용되지 않는다고 하더라도 이미 수만 개의 상점(해외)에서 이미 비트코인을 결제수단으로 인정하고 받고 있습니다. 

조만간 한국에서도 비트코인을 받는 상점이 생겨날것 같네요. (2013년 12월. 인천의 한 파리바게트에서 비트코인을 받기 시작했습니다.)


제 생각을 사족으로 달아보자면.. 

비트코인이 폭발적인 인기를 얻게 된데는 여러가지 이유가 있겠지만, 초창기에는 약간의 시간과 노력만 투자하면 쉽게 얻을 수 있기 때문이 아닐까 생각합니다. 밑져야 본전이라는 생각으로 사람들이 비트코인 채굴에 모여들었고 이 덕분에 많은 사람들에게 알려졌을 거라는 거죠. 

하지만, 앞으로는 다른 이유로 각광받을것 같습니다. 

소득이 많으면 그 만큼 세금을 많이 내는데 현금으로 벌어들인 소득에 대해서는 신고하지 않을 수 있습니다. 하지만, 은행에 넣거나 부동산, 금과 같은 투자처에 투자하게 되면 그 순간부터 그 자산은 공개되서 더이상 숨길 수가 없게 됩니다.  

하지만, 비트코인을 사서 보관한다면 얘기가 다릅니다. 자신의 자산을 간편하게 숨기고, 세금을 낼 필요도 없고 거추장 스러운 금고도 필요 없기 때문이죠. 

개인적으로는 최근 중국에서 비트코인을 엄청나게 매입을 하고 있는데 그 이유가 이 때문이 아닐까 생각합니다. 



한계

비트코인은 따지자면 암시장에서 거래되는 비공식 화폐와 같은 겁니다. 

그렇기 때문에 여기서 발생하는 사기/범죄 행위에 대해서 법의 보호를 받기가 어렵습니다. 


게다가 최대 생산량이 한정되어 있기 때문에 마피아 조직 처럼 암흑의 세계의 큰 손이 작정하고 주가조작 하듯 작업을 벌이게 되면 달리 손 쓸 방법이 없습니다. 

좀 오버를 한다면 비트코인 잔돈이 여러 사람의 전자지갑에서 잠자고 있다거나, 여러 이유로 유통되지 않고 어딘가에서 묵는 일이 오랜 시간 반복 되다 보면 결국 화폐로써의 역할을 제대로 수행 못하는 경우가 발생 할 수도 있다고 봅니다. 


그리고 어디까지나 비트코인 시스템에 버그가 존재할 경우 해커들의 먹잇감이 될 것이고 예상치 못한 결과가 발생할 수도 있겠구요. 


어쨌든, 아직까지는 합법적이라고 인정받지 못한 화폐라는게 가장 큰 한계가 아닌가 싶습니다. 

Posted by KT한
,

Django 어플리케이션을 Apache 서버에서 구동 시키기 위해 Debian 패키지를 만드는 방법입니다. 


이 글에서는 바이너리 패키지를 만드는 방법에 대한 설명만 하도록 하겠습니다. 


deb 패키징을 하려는 어플리케이션이  /home/USERNAME/Workspace/myapp 폴더라고 가정하고 진행하겠습니다.  (django 어플리케이션을 패키징 하는 것이므로 settings.py나 manage.py와 같은 파일들이 들어 있을 겁니다. ) 

myapp 이란 django 어플리케이션을 djangoapp이란 이름이로 패키지를 하는 절차입니다. 


작업을 진행하기 앞서 패키징을 진행할 위치에서 필요한 폴더를 만들고 작업하려는 파일들을 복사해 주어야 합니다. 

$ mkdir ./debian

$ mkdir -p ./debian/usr/share

$ mkdir -p ./debian/etc/init.d

$ mkdir -p ./debian/usr/share/doc/djangoapp

$ cp -r /home/USERNAME/Workspace/myapp ./debian/usr/share/


그 다음 패키징과 관련된 파일들을 넣어줄 'DEBIAN' 폴더도 만들어 줍시다. 


$ mkdir ./debian/DEBIAN



추천은 저를 춤추게 합니다 ^^



DEBIAN 폴더


이 폴더는 아래 파일들을 포함하고 있어야 합니다. 

  • control
  • config
  • conffiles
  • templates
  • postinst
  • postrm
  • preinst
  • prerm

각 파일들을 어떻게 작성해야 하는지 차례대로 알아봅시다. 


control 

이 파일은 패키징에 매우 중요한 파일입니다. 패키지에 대한 정보와 디펜던시(dependency)정보 등을 기술해줍니다. 우리는 바이너리(binary)패키지만 할 것이므로 아래와 같이만 기술해주면 됩니다. 


디펜던시(depends)에 이 패키지를 실행하기 위해 필요한 패키지 들을 나열해 주면 됩니다. 


config

패키지를 설치하기 전에 입력받아야 할 값이 있다면 이 파일에서 질문을 지정해주면 됩니다. 예를 들어 이름을 묻고 싶다면 아래와 같이 작성하세요. 


이 파일에는 질문에 대한 내용이 안보이죠? 그 내용은 아래 나오는 'templates'파일에서 기술하면 됩니다. 


templates

질문을 입력받기 위한 내용입니다. 일반적인 경우 입력 받을 일이 없으니 참고만 하세요. 


conffiles 

이 파일에는 패키지를 설치 할 때 일반적으로 '/etc' 하위 폴더에 넣어 줄 설정 파일과 관련된 정보를 기술해 줍니다. 우리는 django(장고) 시작 스크립트(script)apache(아파치) 설정 파일에 대한 정보를 입력해 주면 됩니다. 


아파치 설정 파일은 아파치 버전에 따라 다르겠지만,  버전 2.2.22 를 사용중인 저의 경우 'site-available'에 설정 파일을 넣어주고 'enable'시켜주는 방식이라 저 폴더에 넣어줬습니다. 


preinst

파일 이름에서 느낄 수 있는 것 처럼 설지를 진행하기 이전에 수행할 작업을 기술해 주는 파일 입니다. 


혹시나 이미 설치가 되어있어서 동작 중이었다면 동작을 중단 하도록 해줬습니다. 


postinst 

이 파일은 패키지를 압축을 푼 다음에 수행할 작업을 기술해 주는 파일입니다. 


설치시에 입력받았던 이름을 사용해서 무언가를 할 수 도 있습니다. 

그 외에도 필요한 폴더를 생성한다거나 다른 명령을 실행 하도록 지정 하는것도 가능합니다. 

( 'a2ensite'는 아파치의 'sites-available' 폴더에 넣어주었던 파일을 사용하도록 지정해 주는 명령어입니다.)


설치가 성공했다면 서비스를 시작하도록 해줍시다. 


prerm

이 패키지를 제거하는 명령어를 실행 했을 때 설치된 패키지를 제거하기 전에 수행할 작업을 기술해 주는 파일입니다. 


postrm

이 패키지를 제거하는 명령어를 실행 했을 때 설치된 패키지를 제거한 다음에 수행할 작업을 기술해 주는 파일입니다. 


여기까지가 'debian/DEBIAN'폴더에 넣어주어야 하는 파일들입니다. 



웹 서버(아파치) 설정

위에서 아파치 폴더의 'sites-available' 폴더에 넣어줬던 파일에 대한 설명입니다. 


호스트 이름, 포트 명과 같은 서버 설정 정보와 'root'폴더를 지정해줍니다. 

그 아래 정보들은 django(장고)를 apache(아파치)에서 구동되도록 하기 위한 설정 들입니다. 참고만 하세요. 



Django(장고) init.d 스크립트 

시작 스크립트는 './debian/etc/init.d' 폴더에 넣어주면 됩니다. 


저는 웹 페이지 경로를 '/var/www/' 로 지정해 주었습니다. 이를 위해서 '/usr/share/myapp' 폴더의 링크를 '/var/www/djangoapp/myapp'에 만들어 주어야 합니다. 

위의 'DEBIAN/postinst' 에 예제로 적어놓은것 처럼 'postinst'에 지정해 주셔도 됩니다. 



Debian doc 파일들 

해당 패키지에 대한 문서 파일들을 작성해 주어야 합니다. 


changelog (changelog.Debian) 

changelog는 2개의 파일이 필요하지만 초기 설치이므로 같은 내용으로 작성해줍시다. 


이 파일은 은근 문법을 따집니다. 빈 줄을 제거하지 마시고 잘 넣어보시고 그래도 잘 되지 않는다면 changelog 문서를 참고하세요. 

작성한 파일은 './debian/usr/share/doc/djangoapp/'폴더로 복사한 다음 'gz'파일로 압축해 줍니다. 


$ cp changelog changelog.Debian ./debian/usr/share/doc/djangoapp/

$ gzip --best ./debian/usr/share/doc/djangoapp/changelog


copyright

copyright정보를 기술해 주는 파일입니다. 


이 파일도 changelog와 동일하게 복사하고 'gz'파일로 만들어 줍니다. 


$ cp copyright ./debian/usr/share/doc/djangoapp/

$ gzip --best ./debian/usr/share/doc/djangoapp/changelog.Debian



패키지 빌드 실행 


debian은 파일의 권한(permission)을 755(-rwxr-xr-x)나 644(-rw-r--r--)로 할 것을 권장합니다. 

파일의 권한을 목적에 맞게 지정해 줍시다. 


$ find ./debian -type d | xargs chmod 755


이런 식으로 chmod 명령으로 파일 권한을 주시면 됩니다. 


준비를 다 했다면 패키지 빌드를 수행해 봅시다. 


$ fakeroot dpkg-deb --build debian

$ mv debian.deb djangoApp_1.0-1.deb

$ lintian djangoApp_1.0-1.deb


dpkg-deb 명령으로 빌드를 수행하고, 그 결과 생성된 파일을 원하는 이름으로 수정 한 다음 lintian명령으로 패키지에 문제가 없는지 검사하는 순서로 진행하시면 됩니다. 

lintian명령 수행 결과 맨 앞에 'W'로 표시된 'Warning'은 수정하는게 좋지만 수정하지 않아도 배포는 가능하고, 'E'로 표시되는 'Error'는 모두 수정하셔야만 됩니다. 

'Error'가 없다면 deb파일을 배포할 준비가 완료 된겁니다. 


참고한 글 

Posted by KT한
,

KISA 해킹 방어 훈련장 문제에 대한 풀이입니다. 


Web Level 4 문제를 보면 아래와 같습니다. 


제목 : 파일 읽기


설명 : 해당 웹 사이트에 접속하여 인증키를 얻어내 보아라


파일을 읽는 문제라고 하는군요. 무슨 뜻일까요? 


[문제 풀기]를 클릭해서 링크를 따라 들어가 봅시다. 



추천은 저를 춤추게 합니다 ^^



메뉴를 이것저것 클릭하다 보니 URL에 '?path=main' 처럼 값을 줘서 보여줄 화면을 지정하고 있는걸 알 수 있습니다. 


크롬(chrome) 브라우저의 요소 검사(Inspect Element)로 소스를 봐 봅시다. 


소스의 맨 위에 'readme.php'라는게 보입니다. 

왠지 저 파일에 뭔가 문제를 풀 수 있는 힌트가 숨겨져 있을것 같은 느낌이 드는군요.  

그래서 제목이 파일 읽기 인가 봅니다. 


자신있게 URL의 path값을 readme.php 로 수정해 봅시다. 


이런.. 아무것도 나오지 않는군요. 


역시 그렇게 간단한 문제는 아닌가 봅니다. 

포기하지 말고 readme.php파일을 보기 위해 여러가지 기법을 사용해 봅시다. 


먼저 LFI(Local File Inclusion)기법 중 가장 많이 사용되는 base64 encode방식으로 시도해 봅시다. 


?path=php://filter/convert.base64-encode/resource=readme


화면에 'no hack'이란 메시지가 나오네요. 

이런 수법을 사용할걸 미리 알고 다 막아놨나 봅니다. 


그렇다고 여기서 포기하면 안되죠. 

PHP 사이트 에 가서 다른 필터 방식을 찾아 봅시다. 

우선 conversion 필터 내용을 확인 해보고 시도해봤으나 역시나 다 막혀있네요. 


이번에는 String 필터쪽을 살펴봅시다. 



문자열(String) 필터 링크를 따라 들어가봅시다. 


'string.rot13'이 지원 된다고 하는군요. 

이게 뭔가 찾아보니 '카이사르 암호의 일종으로 영어 알파벳을 13글자씩 밀어서 만든다.' 라고 하는군요. 


큰 기대가 되진 않지만 우선 시도해봅시다. 

URL을 다음과 같이 수정해서 시도하면 됩니다. 


?path=php://filter/string.rot13/resource=readme


화면에는 아무것도 나타나지 않지만 크롬 브라우저의 '요소 검사(Inspect Element)'기능의 'Resources' 탭에서 보니 뭔가 메시지가 보이네요. 


<?

$xrl = "gxqykzncfodufgxsxn_dbeuizrx_oo";

?>


우리가 rot13 방식으로 인코딩 했으니 이 값을 디코딩 하면 무슨 값이 되는지 해봅시다. 


rot13 을 디코딩 해주는 사이트를 찾아 들어가봅시다. 


먼저 앞에 있는 값 'xrl'을 입력하고 디크립트(decrypt)를 수행했더니 'key'라고 나오네요. 

그렇다면 뒤에 있는 값은 우리가 찾는 키 값이 되겠죠?


값을 입력하고 디크립트를 수행하면 그토록 애타게 찾던 키 값이 나옵니다. ^^ 


base64 인코딩 방식으로 풀어보려 URL을 인코딩도 해보고.. 별별 방법으로 엄청 삽질 했네요. 

문제를 풀고나니 오히려 허무하기까지 한 문제였지 않나 싶습니다. 

Posted by KT한
,

KISA 해킹 방어 훈련장 문제에 대한 풀이입니다. 


Network Level 3 문제를 보면 아래와 같습니다. 


제목 : 패킷 내용 분석


설명 : 패킷 내용을 분석해 접속자들끼리 나눈 비밀 

대화를 도청하고 암호를 획득하여라!



추천은 저를 춤추게 합니다 ^^



문제 풀기를 클릭하면 pcpcpc.pcap파일을 다운 받을 수 있습니다. 


와이어샤크(wireshark)로 열어봅시다. 


그리고, 메뉴에서 'statistics > conversations'을 선택해봅시다. 



두 호스트 간 통신한 내용을 간략하게 정리해서 보여주는 기능입니다. 


이제 하나 하나 'Follow Stream' 버튼을 눌러가며 통신 내용을 살펴 봅시다. 

전반적으로 훑어보고 의심가는 flow를 먼저 봐도 됩니다. 



위에서 선택한 대화는 네이트온으로 주고받은 대화네요. 

암호화 되어 있지 않아서 서로 주고받은 메시지를 모두 볼 수가 있습니다. 



대화로 주고받은 내용중에 인증키로 의심이 가는 메시지가 있습니다. 

혹시나 하는 마음에 넣어보니.. 역시나 맞네요. 


문제가 쉬운 감이 없잖아 있지만.. 어쨌든 풀었으니 패스~ 

Posted by KT한
,

KISA 해킹 방어 훈련장 문제에 대한 풀이입니다. 


Network Level 2 문제를 보면 아래와 같습니다. 


제목 : PCAP 파일을 분석하여라!


설명 : 주어진 PCAP 파일을 분석하여

인증키를 추출해 보아라!



추천은 저를 춤추게 합니다 ^^



문제 풀기를 클릭하면 proc_p2.pcap파일을 다운 받을 수 있습니다. 


와이어샤크(wireshark)로 열어봅시다. 


그리고, 메뉴에서 'statistics > conversations'을 선택해봅시다. 



두 호스트 간 통신한 내용을 간략하게 정리해서 보여주는 기능입니다. 

이제 하나 하나 'Follow Stream' 버튼을 눌러가며 통신 내용을 살펴 봅시다. 
전반적으로 훑어보고 의심가는 flow를 먼저 봐도 됩니다. 

보다 보니 telent 통신을 한 내역이 있네요. 

암호화 되어 있지 않아서 서로 주고받은 데이터를 모두 볼수가 있네요. 



아래쪽으로 내려보니 로그인 정보가 있습니다. 

설마 이렇게 쉬운 문제를 냈을까 싶지만.. 이 값이 문제에서 요구한 인증키 입니다. 


단, 저 문구를 통채로 넣는것은 아니구요.. 일부만 넣어야 합니다.

일부가 어디부터 어디까지 인지는 문구를 보면 아마도(?) 아실 겁니다. 


만약, 봐도 감이 안온다면 그냥 여러번 시도하시면 되니깐 푸는데는 지장 없을 겁니다. 

Posted by KT한
,

jquery에는 selector에 의해 선택된 항목에 원하는 내용을 추가하는게 가능합니다. 

지원하는 함수는 다음 네 가지가 존재 합니다. 

  1. append() : 선택된 엘리먼트(elements)의 맨 뒤에 추가하기 
  2. prepend() : 선택된 엘리먼트(elements)의 맨 앞에 추가하기 
  3. after() :  선택된 엘리먼트(elements)의 바로 뒤에 추가하기 
  4. before() : 선택된 엘리먼트(elements)의 바로 앞에 추가하기 
이 함수들을 사용하면 html 태그 값을 추가하는게 가능합니다. 


추천은 저를 춤추게 합니다 ^^



아래 예제를 봅시다. 



이런 코드를 실행하게 되면 테이블의 값을 클릭할 때 마다 클릭한 행의 바로 아래 'appended row'라는 이름의 행이 하나 추가됩니다. 



위의 그림처럼 '2'를 클릭하면 바로 아래 'appeded row'라는 행이 하나 추가되죠. 

그런데, 'appended row'를 클릭하면 아무런 변화가 없습니다. 


이렇게 동작하기를 기대했다면 더 고민할 필요가 없습니다. 

하지만, 새로 추가된 행에 대해서도 클릭하면 동일한 동작(바로 아래 'appended row'라는 행이 추가)이 수행되기를 기대했다면 추가적인 작업이 필요합니다. 


왜냐하면 동적으로 새롭게 추가된 컨텐츠에 대한 마우스 액션이 등록되어 있지 않기 때문에 아무런 마우스 이벤트가 발생해도 이를 인식하지 못하기 때문입니다. 


그럼 이벤트 핸들러를 등록해 봅시다. 



이렇게 append()로 태그 값을 추가한 후에 태그값에 대해서 이벤트값(마우스 클릭 액션)을 등록하면 됩니다. 



좀전과 동일하게 '2'를 클릭하고, 추가된 'appended row'를 클릭해봅시다. 

이번에는 'appending'이라는 새로운 행이 추가되는것을 확인 할 수 있습니다. 


이제 동적으로 추가한 태그 값에 대해서도 원하는 이벤트를 등록해서 사용하세요~ 

Posted by KT한
,

KISA 해킹 방어 훈련장 문제에 대한 풀이입니다. 


Network Level1 문제를 보면 아래와 같습니다. 


문제 제목 : PCAP 파일을 분석하여라!


문제 설명 : 주어진 PCAP 파일을 분석하여

인증키를 추출해 보아라!



추천은 저를 춤추게 합니다 ^^



문제 풀기를 클릭하면 findkey2.pcap 파일을 다운 받을 수 있습니다. 

와이어샤크(wireshark)로 열어봅시다. 


메뉴에서 'statistics > conversations'을 선택해봅시다. 


두 호스트 간 통신한 내용을 간략하게 정리해서 보여주는 기능입니다. 


이제 하나 하나 'Follow Stream' 버튼을 눌러가며 통신 내용을 살펴 봅시다. 



TCP 프로토콜 6664번 포트로 통신한 내용입니다. 

HanIRC 통신인데 평문으로 통신했기 때문에 대화 내용을 모두 볼 수가 있네요.


혹시나 대화 중에 키 값이 있을 지 모르니 찬찬히 대화 내용을 살펴 보았지만 별 다른 내용이 없습니다. 

그런데, 대화 마지막에 'my.zip' 파일을 보내겠다고 하는군요. 

혹시 주어진 pcap파일에 my.zip파일을 전송하는 패킷이 포함되어 있을 지 모르니 한 번 찾아봅시다. 


만약, zip파일의 header/footer 값을 알고 있다면 수월합니다. 


메뉴의 'Edit > Find Packet' 을 선택해봅시다. 

'Hex Value'를 선택하고 zip파일의 header인 '50 4B 03 04 14'를 넣고 'Find'버튼을 클릭해봅시다. 



패킷 하나가 검색 되었네요. 

해당 패킷에서 마우스 우 클릭 후 'Follow TCP Stream' 메뉴를 선택해봅시다. 


통신 한 내용이 나옵니다. 즉, zip파일의 내용에 해당하겠죠. 


화면 하단의 'Save As'를 선택 후 원래 보내려던 이름인 'my.zip'으로 저장해봅시다. 


저장된 zip 파일을 열어봅시다. 


zip파일 안에는 'my.txt'라는 파일이 있고 파일을 열어보면 key값이 들어있습니다. 

약간의 인내심을 가지고 노가다를 해야 하긴 하지만 의외로 쉽게 풀리는 문제입니다. 



만약, conversations 메뉴에서 아래 그림처럼 zip파일을 전송하는 tcp flow를 찾았다면 더 간단하게 문제를 풀 수 도 있었을 겁니다. 


'Follow Stream' 버튼을 클릭하면 my.zip 파일을 주고받는 통신을 바로 볼 수 있습니다.


Posted by KT한
,