[파이썬] 파이썬3로 CGI 이용하기

2011. 7. 12. 04:36
파이썬에서 지원하는 CGI(Common Gatewaay Interface) 라이브러리를 가지고 놀아보기로 했다. 요즘에 참 웹을 많이 가지고 노는 듯. 요즘 같이 어울리는 녀석이 웹인재인지라...

일단은 CGI를 테스트하기 위해 웹서버가 필요하다. 그것도 모른채 파이썬 공식 사이트의 CGI 라이브러리 설명이랑 웹서핑을 통해 얻은 기본 소스들만 계속해서 보다가 시간만 왕창날렸다. 웹에서 돌아가는건데 당연히 웹에서 테스트해야지.ㅠㅠ 우분투를 쓰고 있고, 아주 오래전에 아파치 웹서버를 설치해 놓았었기 때문에 따로 뭐 더 설치할 것은 없고, 파이썬을 CGI처럼 쓰기 위한 설정작업이 조금 필요했다.

아파치1을 설치했으면 httpd.conf 파일을 설정해야되는 것 같던데, 나는 아파치2를 설치해서 다른 파일을 손봐야했다. /etc/apache2/sites-enabled 폴더에 가면 000-default 파일이 있다. 이 파일은 관리자 권한으로 접근해야 수정할 수 있다.

sudo vi /etc/apache2/sites-enabled/000-default
터미널을 실행한 뒤 위의 명령어를 입력하면 해당 파일을 vi 편집기로 편집할 수 있다. (나는 vi 대신 gedit 을 이용했다.

...

<Directory /var/www>
          Options Indexes FollowSymLinks MultiViews
          AllowOverride None
          Order allow,deny
          allow from all
          Options +ExecCGI
         AddHandler cgi-script .cgi .py
</Directory>
... 



나는 따로 웹서버의 루트 폴더를 사용자 계정으로 바꾸지 않았기 대문에, 웹서버의 루트폴더는 기본 폴더인 /var/www 로 되어있었다. 000-default 파일을 보면 위와 같은 부분이 있다. 당연히 빨간색 두 줄은 내가 직접 추가한 파일이다. 저 빨간색 두 줄을 추가하도록하자.
Options +ExecCGI 는 웹서버에서 CGI를 실행가능하도록 하는 설정이고
AddHandler cgi-script 는 어떤 확장자의 파일을 실행할 것인지 설정한다. 뒤에 실행할 파일의 확장자를 추가해주면 된다. 여기서는 .cgi와 .py를 추가했으므로 cgi파일과 python파일을 실행할 수 있다.
이제 웹서버쪽의 설정은 끝. 파이썬 코드를 작성해보자.

index.html

<!doctype>
<html>
<head>
</head>
<body>

<form name="form" method="get" action="http://localhost/cgi_test.py">
<p>
email : <input type="text" name="email">
name : <input type="text" name="name">
<input type="submit" value="CLICK">
</p>
</form>

</body>
</html>

cgi_test.py

#!/usr/bin/env python
#-*- coding: euc-kr -*-

import cgi
import cgitb    #스크립트 오류 등의 에러발생시 브라우저에 에러 내용을 보여준다.
cgitb.enable()

print("Content-type: text/html\n")    #\n 을 안하면 Internal Server Error 발생!

print('<html>')
print('<head>')
print('<title>Hello Word - First CGI Program</title>')
print('</head>')
print('<body>')

form = cgi.FieldStorage()

if "email" not in form:
    print("Error!")
else:
    print("Your email address is " + form["email"].value)


print('</body>')
print('</html>')



위 두 파일을 웹서버 루트폴더에 넣고 http://localhost/ 에 접속하면 아래와 같이 index.html파일이 열린다.


 텍스트박스에 임의의 내용을 입력하고 버튼을 클릭하면 cgi_test.py가 호출된다. 여기서 cgi라이브러리에 주목하자. cgi.FieldStorage() 가 실행되면서 index.html파일이 넘겨준 form의 내용을 form이라는 이름의 변수에 저장하고 있다. 그리고 넘겨받은 이름 중에 email 이란 것이 없으면 Error, 있으면 그 내용을 출력한다. 



성공적으로 form의 이메일을 잘 받아서 출력해주는 것을 알 수 있다. 이 외의 여러 cgi 관련 라이브러리들은 http://docs.python.org/py3k/library/cgi.html 에서 확인할 수 있다.

중간에 수도 없이 Internal Server Error 메시지를 보기도 하였고, cgitb 라이브러리를 이용하여 브라우저에 뜨는 에러메시지를 보니 파이썬2.7.1이 인터프리터로 나오는 등 무수한 문제점과 의문에 부딪혔었다. 쓸데없이 웹서버 설정을 이리저리 바꾸기도 하고 서버를 재시작하는 등 삽질을 하다가 파이썬3에서는 안된다는 어느 외쿡인의 글을 보면서 좌절하기도 했었는데 막상 성공하고나니 뿌듯하면서도 한편으로는 허무함. 오늘도 이렇게 나의 삽질 내공은 쌓여간다. 

박상근 프로그래밍/Python

[Python] Thread, Socket을 이용한 간단한 채팅 프로그램 구현

2011. 5. 28. 02:11
한 언어를 배울 때, 책상 앞에 앉아 책만 보기보다는 뭔가 작은 프로그램을 직접 만들어보는 것이 진리. 간단한 파이썬을 이용하여 간단한 채팅 프로그램을 구현해보기로 했다. TCP/IP 소켓 통신 관련하여 검색해보니 간단한 예제들이 수도 없이 나왔다. 물론 대부분이 2.x 버전에서 구현된 것들이다. http://www.python.org/에서  3.2 버전의 socket을 검색하니 간단하게 참고할만한 예제가 있었다. 하지만 서버에서 응답 한번 해주고 바로 소켓을 닫아버리는 소스이기에 이것을 좀 수정해서 계속해서 여러 메시지를 주거니 받거니 할 수 있도록 만들고 싶었다.

#client program
import socket
import threading

HOST = "127.0.0.1"
PORT = 8089      
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))


def sendingMsg():
	while True:
		data = input()
		data = bytes(data, "utf-8")
		s.send(data)
	s.close()
	
def gettingMsg():
	while True:
		data = s.recv(1024)
		data = str(data).split("b'", 1)[1].rsplit("'",1)[0]
		print(data)
	s.close()

threading._start_new_thread(sendingMsg,())
threading._start_new_thread(gettingMsg,())

while True:
	pass

#server program
import socket
import threading

HOST = ''                
PORT = 8089        
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print('Connected by', addr)

def sendingMsg():
	while True:
		data = input()
		data = data.encode("utf-8")
		conn.send(data)
	conn.close()

def gettingMsg():
	while True:
		data = conn.recv(1024)
		if not data: 
			break
		else:
			data = str(data).split("b'", 1)[1].rsplit("'",1)[0]
			print(data)
	conn.close()
	
threading._start_new_thread(sendingMsg,())
threading._start_new_thread(gettingMsg,())

while True:
	pass

파이썬3에서는 그냥 메시지를 전달하면 str는 지원하지 않는다는 에러메시지가 나온다. 그래서 이를 bytes형으로 변환하기 위해 encode함수를 이용하였다. 그러니 메시지 앞에 byte라는 의미의 b가 달라붙어버렸다. (hello -> b'hello') 이를 해결하기 위해 일단은 문자열 변환으로 b와 ' ' 를 지워서 출력하기는 했는데 str함수로 형변환 했을 때 깔끔하게 b를 지워줬으면 좋겠다. 분명히 문자열 변환같은 수동적인 방법말고 뭔가 다른 방법이 있을 것 같긴 한데...

마지막에 While True: pass 도 엄청난 삽질 끝에 삽입하였다. Thread를 이용해서 함수를 시작시키도록 코드를 구현한 뒤 파일을 실행했는데 아무런 반응이 없었다. 이 이유를 몰라서 한참 삽질하다보니 쓰레드로 특정 함수를 시작하자마자 코드의 마지막을 읽음으로서 파일 실행이 끝나버리는 ... 그렇다, 파이썬은 스크립트언어다. 인터프리터 방식의.... 그래서 프로그램이 끝나지 않고 계속 쓰레드가 돌아갈 수 있도록 의미없이 무한반복하는 코드를 집어넣었다. 아휴, 파이썬의 길은 멀고도 험하구나~

박상근 프로그래밍/Python

[Python] 랜덤 모듈과 파일 입출력을 이용한 로또링!

2011. 5. 25. 22:06
파이썬을 대충 공부하기는 해봤는데 트위터나 구글 등의 오픈API를 이용하지 않고 내장 모듈로만 뭔가 만들어볼까 하다가 로또 당첨금 15억원때문에 파탄난 가정에 대한 뉴스를 보고서, 도대체 로또 1등은 얼마나 힘든 일인지 파이썬을 이용해 알아보기로 했다.
    
프로그램을 처음에 한번 실행해봤더니 8308532번만에 겨우 1등이 당첨될 수 있었다. 실제로 1등에 당첨이 될 확률은 800만분의 1정도라는데 신기하게도 한번에 비슷한 확률로 1등이 나왔다. 여러번 테스트를 해보니 5등은 200번에 한번정도는 당첨이 되는 것 같은데 그 이상은 상당히 힘든 것 같다. 1등은 프로그램 실행 후에 밥을 먹고 화장실도 다녀와도 당첨이 안되어 있을 정도...
import random

lotto = random.sample(range(1,45),7)
bonus = lotto[6]
lotto.pop()

howManyTried = 0

while 1:    
    f=open("lotto.txt", "a")

    howManyGotNum = 0
    howManyTried += 1

    myLotto = random.sample(range(1,45),6)
    lotto.sort()
    myLotto.sort()

    for i in myLotto:
        for j in lotto:
            if i==j:
                howManyGotNum+=1
                break
    
    if howManyGotNum==6:
        print("1등!\n")
        f.write("1등")
        break
    elif howManyGotNum==5:
        for b in myLotto:
            if b==bonus:
                f.write("2등!\n")
        howManyGotNum==5 
        f.write("3등!\n")
    elif howManyGotNum==4:
        f.write("4등!\n")
    elif howManyGotNum==3:
        f.write("5등!\n") 
    else:
        f.write("꽝!\n")
f.close()

1등에 당첨되면 어쩌지? 하는 걱정에 지금껏 한번도 로또를 해본 적이 없었는데, 앞으로 그런 걱정은 전혀 할 필요가 없을 것 같다.

박상근 프로그래밍/Python

[Python] 파이썬으로 Google API 연동 셋팅하기

2011. 5. 20. 08:32
구글에서는 Youtube, GoogleDoc, Blogger 등의 수많은 서비스의 API를 파이썬에서 이용할 수 있도록 지원해준다. 파이썬의 문법을 간단히 익혔으므로 본격적으로 이를 활용하여 간단한 앱들을 만들어보기로 했다. 

http://code.google.com/apis/gdata/articles/python_client_lib.html
다행히도 위 사이트에서  파이썬을 이용한 구글API 사용법을 친절하게 안내해주고 있다.

>>>from xml.etree import ElementTree
먼저 XML 라이브러리 설치 여부를 확인한다. 파이썬 인터프리터에서 위와 같이 입력하였을 때 아무 에러메시지 없이 잘 임폴트 되었다면 이미 설치되어 있는 것이므로 그냥 다음 단계로 넘어가면 된다. 만약 임폴트가 실패하면 http://effbot.org/downloads/#elementtree 에서 다운받아야 한다. 윈도우 사용자라면 exe파일을, 리눅스 사용자라면 zip파일을 받으면 된다. (리눅스 사용자는 압축을 푼 후 sudo ./setup.py install 를 터미널에 입력하여 설치하도록 하자)

http://code.google.com/p/gdata-python-client/downloads/list
위 URL에서 Google Data Library를 다운 받을 차례다. 가장 상위의 최신 버전을 다운받자. (윈도우 사용자는 zip파일을, 리눅스 사용자는 tar.gz파일을 받는다). 

나는 우분투 사용자이므로 tar.gz 파일을 받아 사용자 계정에 압축을 풀고
설치한 경로에서 sudo ./setup.py install 를 터미널에 입력하여 라이브러리를 설치하였다.

뭔가가 마구 설치되고 난 후,
정상 설치 테스트를 하기 위해 
sudo ./tests/run_data_tests.py 를 입력한다.

   위와 같이 OK가 계속 출력되면 정상적으로 라이브러리가 설치되었음을 확인할 수 있다.

이제 파이썬으로 구글API를 이용하기 위한 준비가 끝났다. 터미널에서 라이브러리 설치 경로로 이동해서 샘플 코드를 실행해 볼 수 있다. ./samples/docs/docs_example.py를 입력해보자.  


박상근 프로그래밍/Python

[Python] 우분투에서 Django 설치하기

2011. 5. 20. 03:21
Django(장고)는 강력한 언어인 파이썬으로 작성된, MVC 기반의 오픈소스 웹 프레임워크이다. 웹 애플리케이션을 쉽고 빠르게 개발할 수 있도록 도와주며, 최소한의 시간과 노력으로 웹 애플리케이션을 개발할 수 있도록 한다.

Django 설치 이전에 Python 2.4 이상의 2.x 버전이 설치되어 있어야한다. 단, 3.x 버전은 아직 지원하지 않는다.



http://www.djangoproject.com/download/  에서 Django를 다운받을 수 있다. 이를 다운 받은 뒤 사용자 계정에 압축을 풀었다. 터미널에서 sudo python setup.py install를 입력하여 설치를 시작한다. 터미널에서 수많은 설치과정이 진행되는 것을 볼 수 있다.
 




/usr/local/bindjango-admin.py 파일이 생성되어 있는 것을 확인할 수 있다. 현 위치에서 이 파일을 실행시킬 수도 있지만 나는 이 파일을 사용자 계정 위치로 옮겨서 실행하기로 했다. 터미널에서 python /usr/local/bin/django-admin.py startproject mysite 를 입력한다. 여기서 mysite는 자동으로 생성될 django 관련 폴더명을 뜻한다.


mysite라는 폴더가 생성되고 폴더 내에 4개의 파일이 만들어졌다.
 

python mysite/manage.py runserver 를 입력하여 서버를 실행해보자.
 

http://127.0.0.1:8000/ 으로 접속하면 위와 같은 화면을 볼 수 있다.

자, 이제 Django 설치가 간단하게 끝났다. 첫단계를 쉽게 끝냈으니 본격적으로 Django를 공부해보도록 하자! 
 

 

박상근 프로그래밍/Python

윈도우 비스타에서의 볼륨 컨트롤

2009. 10. 13. 04:03

  나의 윈 폼 어플리케이션 처녀작인 Laptop Guard를 만든지도 어언 1년이 다 다되었다. 이 작품 덕에 삼성 소프트웨어 멤버십이라는 멋진 곳에 모자란 내가 들어갈 수도 있었고, 프로그래밍에 깊은 재미를 느낄 수 있었던 것 같다.

 

  작년 학교 축제기간의 우리과 소프트웨어 전시회 때에는 아직 Laptop Guard가 미구현 된 점도 많고, 내가 그런 전시회에 작품을 냈다가 망신만 당하는 것은 아닐까 하는 생각에 참여를 못했었는데, 올해 작품 전시회에 이 작품을 전시하게 되었다.

  1년간 한 쪽 구석에 처박아뒀기에 아직 잘 돌아가나 테스트를 해보니. 아뿔사. XP환경에서 개발했었는데, 지금 내가 사용중인 OS는 비스타이다.

 

 

  코드 프로젝트에서 구해서 이용했던 WaveLibMixer.dll 이 XP환경에서만 오디오 볼륨 조절이 가능했던 것이다.


http://www.codeproject.com/KB/audio-video/AudioLib.aspx?display=PrintAll&fid=217323&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=2685226


Comment를 보니 나처럼 이 프로젝트가 비스타에서 작동하지 않음을 호소하는 글들이 몇 개 눈에 들어왔고, 윈도우 비스타와 XP는 사운드 시스템 체계가 다르다는 것 또한 알 수 있었다.

 

결국 비스타에서 오디오 조절 방법을 찾다가 코드 프로젝트에서 CoreAudioApi 프로젝트를 찾았다. 시스템에서의 오디오장치를 이용하는 MMDevice API와 볼륨, 피크미터에 접근이 가능한 EndPointVolume API를 이용한 방법이었다.


http://www.codeproject.com/KB/vista/CoreAudio.aspx?display=PrintAll


프로젝트를 다운 받아 분석하고 바로 Laptop Guard에 적용시켰다. 이 전과 다른 점이라면 이전에는 볼륨이 0~65535까지 였는데, 이번엔 0.0~1.0 까지로 볼륨 크기를 나누었다는 것 정도.

 

  1년 만에 내 코드를 다시 보니 부끄럽다. 손이 가는대로 막코딩하다보니 코드도 너저분하고, 쓸데없는 변수들의 남용들, 비효율적인 구조… 으하하하.

 

  새로 컴파일 하고 실행해보니 잘 비스타에서 잘 작동한다.

휴.. 다음에 여유가 생기면 새로 설계 후 다시 깔끔하게, 배포할 수 있을 정도로 만들어봐야겠다. 아직은 도서관 등에서 사용하기에는 너무 치명적인 버그들이 존재하기에 ㅋㅋㅋ

박상근 프로그래밍/Laptop Guard

C#용 증강현실 라이브러리 - NyARToolKitCS

2009. 9. 20. 06:23

NyARToolKitCS 는 NyARToolKit의 종류 중 하나입니다.


NyARToolKit은 이미 널리 알려진 ARToolKit(Hirokazu kato와 Human Interface Technology Lab에서 개발된 증강현실 라이브러리) Ver 2.72.1을 발전시킨 호환 ARToolKit 클래스 라이브러리입니다. JAVA / Android / C#.NET FW/ C#.NET CFW / Action Script3 / C++ 등의 여러 플랫폼을 지원하고 있습니다.


NyARToolKitCS는 NyARToolKIt의 C#용 버전이며, 2008년 6월 최초버전이 공개된 이후 2009년 5월에 2.3.0 버전이 최종으로 릴리즈되어 있습니다.

 

NyARToolKItCS Architecture


 

NyARToolKitCS는 .NET Framework 2.0 이상에서 동작하며 컴파일러는 Visual C# 2008 Professional Edition 이상이 필요합니다. 또한 Windows Mobile 5 이상에서도 동작이 가능하며 이때에는 .NET Compact Framework 3.5 이상의 환경이 필요합니다.


카메라 입력은 DirectShowLib.NET을 이용하며, 3D 출력에는 Managed Direct3D를 사용합니다. .NET CFW에서 개발할 시에는 카메라 영상 입력을 위해 NyWMCapture (Capture DLL for WM), Mobile Managed Direct3D를 사용합니다.

 

Coordination of ARToolKit


Basic Principles of ARToolKit


Computer Vision Algorithm of ARToolKit


 

NyARToolKitCS의 좌표체계는 기존의 ARToolKit과 같은 원리이며, 동작 원리 또한 거의 흡사하다.

 

<Computer Vision Algorithm of ARToolKit>

① 사용할 마커를 카메라 좌표 안에 위치한다

② 스레드홀딩 기법을 이용하여 마커이미지를 이진화한다.

③ 각 Component 들을 연결한다.

④ 윤곽선을 추출한다.

⑤ 마커의 모서리와 코너를 추출하여 마커위에 사각형을 그린다.

⑥ 3D Object를 추출된 마커 사각형 좌표에 맞춰 나타낸다.

 

ARToolKit 공식 홈페이지 : http://www.hitl.washington.edu/artoolkit/

NyARToolKit 공식 홈페이지 : http://nyatla.jp/nyartoolkit/wiki/index.php


 

NyARToolKit을 이용한 증강현실


박상근 프로그래밍/NyARToolKitCS

BlogAPI의 이해와 활용

2009. 7. 3. 06:11

6월 23일.

삼성 소프트웨어 멤버십에 들어오고나서 나의 첫 기술세미나를 가졌다. 세미나 주제는 신입 단기과제때 잠시 다뤄보았던 BlogAPI. 이를 이용하여 MS Windows Live Writer같은 원격 블로깅 프로그램을 만들어보자!
 

BlogAPI에 대해 알아보기 전에 XML-RPC에 대해서 알아볼 필요가 있다. XML-RPC란, RPC(Remote Procedure Call) 프로토콜의 일종으로서, 인코딩 형식에서는 XML을 채택하고, 전송 방식에서는 HTTP 프로토콜을 사용하고 있다. XML-RPC는 매우 단순한 규약으로서, 작은 데이터 형식이나 명령을 정의하는 정도로만 사용하고 있으며, 사양서도 A4 2매 정도로 꽤나 단순한 편이다. 이는 대다수의 RPC 프로토콜 시스템이 수많은 규격을 규정하고, 실제 사용할 때에도 엄청난 양의 코딩을 요구하는 것과 비교하면 눈에 띄는 특징이라고 할 수 있다. 간단히 말해 서로 다른 운영체제, 프로그래밍 언어 간에도 웹을 통해 데이터를 주고 받을 수 있도록 해주는 표준 프로토콜을 의미한다.

 

< XML-RPC 아키텍쳐 >


XML-RPC 중 특히 블로깅과 관련된 기능을 지원하는 것을
BlogAPI 라고 하며, 블로그에 직접 접속하지 않고도 원격으로 포스팅이 가능하고, 포스팅 한 글의 편집, 삭제 등등 블로깅 전반에 걸친 여러 함수들을 제공한다.


BlogAPI
에는 MetaWeblog API, Blogger API, MovableType API 등등 여러 종류의 BlogAPI가 있다. 티스토리 블로그는 위의 세 BlogAPI를 모두 지원하며 각 블로그 서비스마다 지원하는 BlogAPI가 조금씩 틀리다. 여기서는 가장 널리 지원되고 있는 MetaWeblog API를 이용하여, C# 언어로 티스토리 블로그에 원격 블로깅을 할 수 있는 간단한 예제를 구현해본다.


http://www.xml-rpc.net/
에 접속하면 첫페이지 상단에서 XML-RPC.NET Ver.2.4.0 을 다운받을 수 있다. 압축을 풀면 여러 폴더와 파일들이 나오는데, 다 필요없고 bin1_0 폴더 안의 CookComputing.XmlRpc.dll 파일만이 필요하다.




위 그림처럼 using CookComputing.XmlRpc 을 위해서CookComputing.XmlRpc.dll 파일을 프로젝트에 참조시킨다. 이 dll 파일안에 MetaWeblog API들이 포함되어있다. 우리는 그냥 가져다 쓰기만 하면 된다. 
 
 
위에 첨부된 MetaWeblog.cs 파일을 다운받아 프로젝트에 추가하도록 하자. MetaWeblog API를 C#에서 바로 쓸 수 있게 만들어진 클래스다. 와... 이 정도면 그냥 거져 먹는거다. 간단하게 MetaWeblog.cs 의 내용에 대하여 살펴보자. 블로그와 관련된 구조체들이 선언되어 있고, 본격적으로 XmlRpc에 구현된 함수들을 C#에서 맛있게 먹도록 해줄 클래스가 있다. 
구조체 선언부와 클래스 선언부 사이에 보면 [XmlRpcUrl("http://parksk.tistory.com/api")] 라는 부분이 있다. 티스토리 블로그의 경우에는 자신의 블로그 주소 뒤에 "/api"를 붙이면 되고, 이글루스 블로그 같은 경우에는[XmlRpcUrl(http://rpc.egloos.com/rpc1)] 로 수정하면 된다. 자신이 이용하는 블로그 서비스의 BlogAPI 설정을 참고하도록 한다. 이제 클래스 내의 여러 함수 중, 새 글을 포스팅하는 함수인 newPost함수에 대해 자세히 알아보자. 

[XmlRpcMethod("metaWeblog.newPost")] 
public string newPost( 
string blogid, 
string username, 
string password, 
Post content, 
bool publish) 
    return (string)this.Invoke("newPost", new object[] { blogid, username, password, content, publish }); 
}



newPost 함수는 blogid, username, password, content, publish 를 매개변수로 가지며, 각 매개변수를 이용하여 자신의 블로그에 원격 포스팅을 한다. 각 매개변수에 대해서 알아보자.


blogid
각 블로그 서비스마다 틀린데, 티스토리같은 경우 관리자 환경설정에서 BlogAPI메뉴를 보면 84258 등의 숫자로 되어있는 자신의 blogid를 알 수 있다.

username  블로그 아이디
password  블로그 비밀번호. 티스토리는 그냥 실제 자신의 비밀번호를 입력하면 된다.  이글루스는 비밀번호를 직접 입력하지 않고 따로 API Key를 제공받아 password로 사용한다. 아마도 실제 비밀번호가 노출되는 것을 막기 위한 듯

contents 포스팅 될 글의 제목과 내용. 실제 포스팅되는 중심부분
publish 포스팅의 공개 유무


자 이제 C#으로 원격 블로깅 프로그램을 구현할 준비가 다 되었다. 
이제 아주 간단하게 만들어 본... 포스팅 정도는 할 수 있는 코드를 살펴보자.

 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using CookComputing.XmlRpc; 
using System.Net;

 

namespace blogapi 
    public partial class Main : Form 
    { 
        MetaWeblog mw = new MetaWeblog();


        string username; 
        string password; 
        string blogid;

 

        string postid;

 

        public Main() 
        { 
            InitializeComponent(); 
            mw.Credentials = new NetworkCredential(username, password); 
        }

 

        private void btn_posting_Click(object sender, EventArgs e) 
        { 
            username = tb_blogid.Text; 
            password = tb_blogpw.Text; 
            blogid = tb_blogapiid.Text;

 

            try 
            { 
                Post post = new Post(); 
                post.categories = new string[] { "Test Posts" }; 
                post.title = tb_title.Text; 
                post.description = tb_contents.Text; 
                post.dateCreated = DateTime.Now;

                postid = mw.newPost(blogid, username, password, post, true); 
            } 
            catch (XmlRpcFaultException xrfe) 
            { 
                MessageBox.Show("ERROR : " + xrfe.ToString()); 
                return; 
            } 
            MessageBox.Show("Posting is Completed"); 
        }

      

        private void btn_file_Click(object sender, EventArgs e) 
        { 
            username = tb_blogid.Text; 
            password = tb_blogpw.Text; 
            blogid = tb_blogapiid.Text;

            MediaObjectUrl url =

            mw.newMediaObject(blogid, username, password, mw.GetMediaObject("c:\\me.jpg"));

           

            Post post = new Post(); 
            post.categories = new string[] { "Test" }; 
            post.title = "TEST"; 
            post.description = "<img src=" + url.url.ToString() + ">"; 
            post.dateCreated = DateTime.Now;

           

            string id = mw.newPost(blogid, username, password, post, false); 
            MessageBox.Show("File Upload & Posting Completed"); 
        }

 

        private void btn_del_Click(object sender, EventArgs e) 
        { 
            username = tb_blogid.Text; 
            password = tb_blogpw.Text; 
            blogid = tb_blogapiid.Text;

            try 
            { 
                Post post = new Post(); 
                post.categories = new string[] { "Test Posts" }; 
                post.title = tb_title.Text; 
                post.description = tb_contents.Text; 
                post.dateCreated = DateTime.Now;

                mw.deletePost(String.Empty, postid, username, password, true); 
            } 
            catch (XmlRpcFaultException xrfe) 
            { 
                MessageBox.Show("ERROR : " + xrfe.ToString()); 
                return; 
            } 
            MessageBox.Show("Deleting is Completed"); 
        } 
    } 
}

 

Windows Form 응용 프로그램 프로젝트 중 코드부분만 붙였다.

위 코드중 newMediaObject함수에 의해 리턴되는 url은 포스팅할 때 자신이 올린 파일의 주소이다. 이 주소를 이용해서 이미지 태그를 사용하여 이미지를 올린다던가 파일을 다운받을 수 있게 만드는 것이 가능하다. 여기까지 BlogAPI와 간단한 활용에 대해 알아보았다. C#을 조금이라도 아는 초보개발자라면 누구나 이해할 수 있을 정도로 쉽다. BlogAPI 별거 없다.

<참고자료>
http://msdn.microsoft.com/ko-kr/library/aa905670.aspx

박상근 프로그래밍/.NET (C#)

MS Windows Live Writer 를 이용한 원격 포스팅

2009. 6. 18. 00:47


삼성 소프트웨어 멤버십 신입 단기과제 때의 일이다.

스마트폰으로 찍은 사진을 블로그로 원격 포스팅하는 부분을 내가 담당하게 되어 BlogAPI에 대해서 알아볼 일이 있었다. 팀원중 자기 블로그를 관리해본 경험이 있는 사람도 딱히 나밖에 없었고,  우리가 개발하는 모바일 어플리케이션 상에서 원격 블로깅이 가능하다는 사실이 흥미롭게 다가왔다.

 

그 때야, 내가 가진 스마트폰에서 원격 블로깅을 해야했기에 BlogAPI를 이용하여 직접 코딩했었지만, 사실 이미 완벽에 가깝게 만들어져서 공개되어있는 원격 블로깅 프로그램들이 많이 있다.

 

'뭐하러 귀찮게 그런 프로그램들을 쓸까, 그냥 블로그에 접속해서 직접 쓰면되지' 라고 생각했었는데 엊그제 간만에 포스팅 한건 하려는데 Tistory 서버 점검이었다. 따로 워드 프로그램으로 작성해놓을까 했는데, 나중에 서버 점검 끝나면 또 옮겨서 이것저것 수정도 해야할 것 같고 해서 그만뒀었다. 그 때 내가 원격 블로깅 프로그램을 설치했었더라면 서버 점검중일때 포스팅할 글을 미리 작성해놓고, 서버 점검 후에 바로 포스팅을 했으면 편했을텐데...

 

그래서 방금 막 MS Windows Live Writer 라는 원격 블로깅 프로그램을 설치해서 첫 원격 블로깅을 하는 중이다. 

티스토리에서 직접 쓸때보다 표나 미디어 파일들 삽입하기가 훨씬 간단하고 편리하다. 태그 지정도 바로 가능하고 트랙백까지 바로 보낼 수가 있다. 따로 파일로 저장하는건 아니고 로컬이나 웹 로그에 임시저장이 된다. 그냥 일반 문서 프로그램처럼 글을 쓰다가 방금 웹 레이아웃으로 설정을 맞추니까, 지금 포스팅하는 문서 화면이 내 블로그에서 미리보기 하였을 때 보여지는 화면으로 셋팅이 되서, 내가 포스팅을 하면 어떻게 글이 보이겠구나 라는걸 바로 알 수가 있다. 귀찮게 미리보기를 해보지 않더라도. 오호... 이거 꽤나 매력있는 듯

http://download.live.com/writer
위 링크를 클릭해가면 각 언어별 MS Live Writer를 다운받을 수 있다. 

삽입 메뉴를 보니 표, 사진, 동영상, 지도.... 뭐?! 지도?!!!

지도 삽입을 클릭하니 구글어스 같은 Vitual Earth 라는걸로 내 지역을 찾아서 삽입이 가능하다.

삽입을 하니 바로 아래 처럼 지도보기 라는게 생겼다. 한번 클릭해보자. 어떻게 나오는지...

 

 

음, 그런데 글꼴 색상을 바꾸려다보니, 도구 모음에 글꼴 크기, 색상, 폰트 등은 없다. 폰트 관련하여선 진하게, 기울기, 밑줄 등만 있고, 글꼴 색상을 예로들면, 이를 바꾸기 위해서는 직접 메뉴의 서식을 클릭하여 글꼴 색을 클릭하여 글꼴 색 선택 창을 띄워서 색상을 골라야만 글꼴 색 변경이 가능하다. 게다가 글자를 복사/붙여넣기 하니 그 글에 적용되었던 글꼴 색은 없어지고 본래의 글꼴 색으로 돌아오고만다.

 

이제 글을 슬슬 마무리 짓고 게시하려하니까 또 단점이 보인다.

티스토리에서 게시하기 직전에 저작권 관련이라던가 발행하기 등등의 옵션들은 여기선 건드릴 수가 없다.

뭐 MS Windows Live Writer가 Tistory에 특화된 건 아니니깐 어쩔 수 없이 원격 포스팅 이후에 내 블로그에 접속해서 관리자모드로 로그인 후 설정해야한다는 귀차니즘이 필요하다. 이런 설정 없이 그냥 게시하였을때 이런 사항들이 기본으로 어떻게 셋팅되어있을까.

 

지금까지 간단하게 MS Windows Live Writer에 대한 나의 리뷰를 적어보았다.

이 외에도 MS Word 2007로도 원격 포스팅이 가능하고, Zoundry 라던가... MAC OS용의 ECTO,

그리고 ScribeFire Blog Editor라는 FireFox Plugin 등 BlogAPI를 이용한 수많은 프로그램들이 있다.

나는 아무 이유없이 그냥 MS Windows Live Writer 를 이용했지만, 여러분들은 각자 입맛에 맞는 프로그램을 찾길 바란다.

 

 

 

MS Windows Live Writer 를 이용할 분들을 위한 다운로드/설치 안내

이 글을 보시는 블로거들이라면 당연히 자신의 블로그(웹 로그)가 있을 것이다.

웹 로그 있음을 선택하고 다음!

혹시나 블로그가 없어서 MS의 라이브 스페이스라는 블로그를 만들겠다면 내 스페이스 만들기를 선택하고 다음!

 

자신이 사용하는 블로그에 맞춰서 선택. Tistory, Egloos, Naver 블로그들은 당연히 기타 웹 로그 서비스입니다.

 

자신의 블로그 주소를 적고, 이 블로그에 대한 자신의 관리자 아이디(사용자 이름), 암호를 입력합니다.

 

웹 로그 설정들을 받아옵니다.

 

웹 로그 설정 검색중 갑자기 이런 창이 뜹니다. 원격 포스팅을 하면서 미리보기도 하고 해야하니 를 선택

(싫으시면 아니오를 하셔도 상관없습니다. 각자 기호에 맞게...)

 

방금 자신이 등록한 블로그를 MS Windows Live Writer에서 구분하기 위한 이름을 입력합니다.

그리고 자신의 블로그가 정상적으로 설정되었는지 확인합니다.

 

자 이제 편집화면입니다. 맘껏 원격 블로깅을 즐겨보아요~♬

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

PS.
MS Windows Live Writer로 포스팅 하고 난 후, 직접 Tistory에 로그인해보니
발행시 공개설정은 그냥 일반 공개로 되어있었고 CCL(저작권)설정은 없었다.
이를 위해서 직접 발행을 선택하고 CCL설정은 상업적이용 불가로 설정했다.
이정도 외에는 따로 설정할 것 없이 깔끔하게 잘 포스팅 된 듯. 만족~

PS2.

티스토리에서 원격 블로깅을 하기 위해서는 환경설정에서 BlogAPI 을 사용하기로 설정해야한다.

아래 화면에서 [사용하기]를 클릭하여 사용중으로 변경하면 BlogAPI 를 사용할 수 있게된다.


박상근 프로그래밍/.NET (C#)

블랙잭 개발환경 구축하기 ( Windows Mobile 6 )

2009. 6. 6. 20:12


막연히 모바일 개발이 해보고싶다라고 생각만 했었는데,
삼성 소프트웨어 멤버십 19기로 합격하고 단기과제를 진행하면서 Windows Mobile 6 기반에서 개발할 기회가 생겼다.

Museum Assitst
박물관에서 각 작품의 해당 정보를 얻기 위해 자신의 스마트폰에서 지정된 작품 번호를 입력하면
해당 작품의 정보를 텍스트, 이미지 뿐 아니라 음성으로 바로 안내를 받을 수 있는 시스템

Museum Assist 에서 내가 스마트폰 개발 파트를 담당하게 되었다.
옴니아같은 스마트폰은 100여만원... 너무 비싸고, 무난히 쓸만한 블랙잭 ( SCH-M620 )을 구매했다..
상태도 깨끗했고 4GB MicroSD 칩 포함해서 직거래 12만원에 ㅎㅎㅎ. 중고매매 처음해봤다.

스마트폰이 준비되었으니 이제는 개발환경을 구축할 차례다.
블랙잭은 기본으로 Windows Mobile 5 가 깔려있는데 Windows Mobile 6 으로 롬업했다.

Visual Studio 2008 은 미리 준비되어 있었고, 스마트폰 개발을 위한 Windosw Mobile 6 SDK 를 다운받자.

http://www.microsoft.com/downloads/details.aspx?FamilyID=06111a3a-a651-4745-88ef-3d48091a390b&DisplayLang=en
Windows Mobile 6 Professional SDK 는 터치가 가능한 스마트폰용이고 블랙잭은 터치가 안되기때문에
Windows Mobile 6 Standard SDK 를 다운받아서 설치하면 된다.

이제 블랙잭을 위한 에뮬레이터 이미지를 다운받아야한다.
일단 윈도우 폼 개발에서의 Form 형태를, 스마트폰 개발에서는 각 폰 형태에 맞게 이미지를 지정해줘야한다.
각 폰마다 액정의 크기도 틀리고, 키패드 배열 등도 틀리기 때문이다.

http://www.microsoft.com/downloads/details.aspx?familyid=38C46AA8-1DD7-426F-A913-4F370A65A582&displaylang=en
위 링크에서 0412/Windows Mobile 6 Standard Images (KOR).msj 를 다운받아 설치하자.


자, 이제 스마트폰 개발을 위한 새 프로젝트를 생성해본다. Visual Studio 2008 을 설치하고
파일 -> 새로만들기 -> 새 프로젝트 를 하면 위 그림과 같은 새 프로젝트 창이 뜬다.
본인은 Visual C# 으로 개발할 생각이었으므로 Visual C# -> 스마트 장치 를 선택했다.
이 스마트 장치가 바로 스마트폰을 의미한다. ( PDA 개발도 포함 )


새 프로젝트에서 이름과 위치 등을 설정하고 확인을 누르면 위와 같은 스마트 장치에 대한 설정 창이 뜬다.
대상 플랫폼을 Windows Mobile 6 Standard SDK로 설정하고 .NET Compack Framework는 각자 자신에 맞게.
장치 응용 프로그램을 선택하고 확인을 클릭해보자.

 
 
좌측이 Windows Mobile 6 Standard SDK, 우측이 Windows Mobile 6 Standard Landscape QVGA 폼 이미지이다.

처음 프로젝트를 생성하면 폼 속성의 FormFackor 가 Windows Mobile 6 Standard SDK 로 되어있으므로
블랙잭 폼 이미지를 사용하기 위해서는 Windows Mobile 6 Standard Landscape QVGA 폼 이미지로 변경한다.


자, 이제 에뮬레이터도 블랙잭으로 설정을 바꿔보자.
프로젝트의 속성에서 장치 탭을 보면 배포 옵션의 대상 장치를 선택할 수 있다.
이것도 폼 속성의 FormFackor 를 변경했던것과 마찬가지로, 위 그림과 같이 바꿔준다.


자 이것이 에뮬레이터 동작 화면이다.
디버깅 하면 저 에뮬레이터가 동작하게된다. 블랙잭과 아주 유사하지 않은가?

이제 블랙잭 폰에 맞춘 스마트폰 개발환경을 마쳤다.

휴... 4달 전 단기과제 시작할 때의 기억을 더듬어 쓰려니 힘들다.
그 땐 정말 아무것도 몰랐는데, 한번 해봤다고 프로젝트 있을 때마다 스마트폰 관련 기능을 넣어서
내 폰으로 어찌어찌 아웃풋을 내보려는 내 모습을 보면 조금 우습기도 하다. 하하하~

내가 지금 이럴때가 아니지. 시험기간인데...


박상근 프로그래밍/.NET (C#)

09년(上) 삼성전자 SW멤버십 기술면접

2009. 1. 17. 02:40

얼떨결에 삼성 소프트웨어 멤버쉽 1차 서류전형을 합격하고 기술면접을 보게되었다.
서류 전형 합격(8일) 후 기술면접(15일)까지 남은 기간은 1주일.
이 기간안에 최대한 빨리 프로그램을 마무리 짓고 PPT 발표 자료를 만들고, 발표 연습을 끝내야했다.

TOEIC 단어 스터디, 어학원 TOEIC R/C강좌를 일주일간 그만두고서까지 매달렸지만
결국 면접보기 하루 전날 까지 버그와의 싸움을 하느라 코딩을 멈출 수가 없었다.
틈틈이 PPT를 손보면서 발표내용을 살짝 정리해놓은게 천만 다행이었다.

서류전형에 합격할 줄 알았더라면 서류전형 지원하고나서 1주일동안 좀 놀지 않고
열심히 작품 완성도를 더 높였을텐데, 고작 서류전형 하나 내놓고 큰 일 하나 치룬듯 쉬었던게 부끄럽다.

나는 부산멤버쉽에 지원했기에 같이 서류전형에 합격하여 15일에 면접을 보는 동기들이랑 하루 전에 올라와
기술면접실에 직접가서 내 노트북이랑 연결도 해보고 바로 근처에 모텔을 잡았다.
면접실에선 고등학교 컴퓨터동아리 선배를 만났었다. 18기로 있던데... 이런데서 아는 사람을 만날줄이야.
군대서 고등학교선배를 만났을때처럼 반갑더라. ㅋㅋㅋ 뭔가 좀 안정되는 느낌

모텔인데 인터넷도 되고 벽걸이형 TV에... 시설이 좋더라. 두명 쓰는 방에 4만원줬는데 괜찮은 듯.

새벽 늦게까지 기술면접 준비를 하느라 잠을 못잤다.
PPT발표 준비랑 시연 준비,
그리고 삼성소프트웨어 기술면접 후기를 검색했더니 C,C++ 의 기분문법 같은 수준의 질문도 많이 하는 것 같길래
내 프로그램과 관련하여 후킹이라던가 .NET FRAMEWORK 의 구조와 특징, 델리게이트 등등...
예상 질문에 대한 대답 등을 연습하다보니 어느덧 새벽 3시. 그리고는 기절하듯 잠들어버렸다.

아침 9시에 첫번째로 면접을 보게 된 친구가 한시간도 채 지나지 않아 면접을 보고 모텔로 돌아왔다.
면접관이 프로그램에 대해서 구체적으로 캐묻기도 하고 그런다는데 어휴, 이때부터 나도 좀 긴장되기 시작한다.
다들 오전에 면접인데 나만 오후2시 30분... 나도 얼른 면접 보고 끝내고 싶은데.

어영부영 시간은 가고 점심을 먹고서 다들 먼저 진주로 내려가고,
내 순서 30분 전에 면접실에 도착했다.
어제 만났던 고등학교 선배가 1층에서 도우미를 하고 계시다가 격려 해주시고
마침 건물에서 나가시던 우리과 선배 두분도 만나서 잘 하라고 격려 해주시고...

흠흠.
면접대기실에 갔었는데 다른 사람들이 자기 면접 시간 제대로 안지키고...
뭐 급한일 있다고 먼저 본다고 하고...
내 차례 되서 들어갔더니만 어제 랜선 준비해달라고 말도 했었고 오늘 와서 물어보니 셋팅도 되있다더니만
면접실 들어가니깐 되있기는 뭐 -_- 어제 그대로더만... 랜선이 바로 준비가 안되서 난 순서 밀리고...
결국 그날 맨 마지막 면접자가 되버렸다.

드디어 내 차례가 되어 면접실에 들어가고, 면접 시작!
준비한 PPT 발표는 순조롭게 진행되었다.
중간중간에 두어개 질문을 하시기는 했는데 뭐 무난하게 대답했다. 뭘 질문하셨는지는 기억이 안나고 ㅡ.ㅡ
모르는 부분에 대해서는 아는 정도까지만 대답을 하고 더 자세히는 모른다고 솔직히 말했다.

내가 이제 내세울 부분들은 열정과 가능성.
그 부분을 강하게 어필하기 위해 목소리도 나름 씩씩하고 자신있게 내고, 태도도 당당하게 보이려 애썼다.

시연 도중에 USB메모리를 해제하면 바로 경보음이 발생해야하는데 USB메모리 연결을 했는데...
아무런 반응이 없더라. 연결하고 다시 해제하고... 이러길 두어번.
정적이 흐르고...
이러다 갑자기 윈도우메시지가 한번에 몰려서 전달된듯 버벅이더니만 경고음이 나온다.
휴우ㅠ_ㅠ

내 프로그램과 관련하여 계속 질문을 하셨는데 대부분 다 자신있게 내 프로그램에 대해 설명했었고
음소거 상태일때도 경보음이 발생되냐고 질문하시길래 난 음소거가 볼륨이 0이 되는 개념인지 알고
당연히 볼륨을 최대볼륨으로 하여 경보음을 발생시키기때문에 음소거를 하더라도 상관없다고 말했다.
보여달라 하시길래 음소거를 하고 시연해보니... 경보음이 안난다 -_-
음소거가 볼륨을 0을 만드는게 아니라 아예 사운드를 차단하는 듯... 휴우 =3 ...

기술 외적인 질문으로는

Q : 준비해온 작품 외에 다른 프로젝트 경험은?
A : 학부과정으로 C, C++, JAVA를 배우면서 했던 과제 수준의 프로젝트 외에는 없고
     이 프로그램이 처음으로 프로그램에 대한 내 열정이 깃들여진 처녀작입니다.

Q : 학교가 진주인데 부산까지 다니려면 힘들지 않을까?
A : 휴학하고 멤버쉽생활에 더 집중하고 멤버쉽 수료후 복학하여 학교를 졸업하겠습니다
( 난 이때까지 멤버쉽은 1년이나 2년정도 수료를 하는거지 학교생활과는 별개인줄 알았다 -_- )
Q : (웃으시며) 여긴 그런 곳이 아니다. 학교생활도 같이 병행해야한다.
A : 그렇다면 수업을 월화수요일 등으로 몰아서 들으면서 멤버쉽생활을 하여 지장이 없도록 하겠습니다.

Q : 경상대 컴퓨터과라면, CSSM 이라는 동아리 소속인가?
A : 동아리라기보다는 과 내의 소모임입니다.
Q : SSM을 통해 삼성전자로 들어오려는 목적으로 변질될 가능성도 있을 것 같은데.
A : SSM이 창의력과 열정 들을 보고 멤버를 뽑듯이 CSSM(Computer Science Software Membership)도
     그러한 프로그래밍에 대한 열정 등을 보고 선발하며, 그런 가능성을 최대한 배제시키려 노력중입니다.

음... 이 질문들 말고 다른 질문들도 있었던 것같은데 잘 기억이 나지 않는다.
나머지는 다 내 작품과 관련된 질문들이었으니까.'

굉장히 편안한 분위기에서 면접을 볼 수 있었다.
내가 잘 모르는 부분에 대해서는 설명해주시며 가르쳐주시기도 하고,
내 프로그램이 더 발전하기 위핸 방향도 제시해 주시기도 하셨다.
난 이상하게 다른 문법적이나 기술적인 용어 등에 대한 질문은 없었다. 다행인건지 불행인건지...

시간이 어떻게 흘렀는지도 모른채 면접은 끝났다.
홀가분한 기분.
완벽했다고는 할 수 없지만 나름대로 최선을 다 했던 면접이었다.
이정도면 내가 할 수 있는 만큼 한 것 같다.
즐거웠고, 재밌고, 유익한 경험이었다.

고등학교 선배가 나 면접 끝날때까지 기다려주시고 밥까지 사주셔서
밥먹으며 이런 저런 멤버쉽관련 이야기를 나누고 ... 날이 저물어서야 진주로 내려왔다.

진인사 대천명

최선을 다 했다.
이제는 조용히 결과를 기다릴 뿐.
다음주 목요일. 얼마 머지 않았다.

그래도, 사람 욕심은 끝이 없는건가.
좋은 결과가 나왔으면 좋겠다 ㅎㅎㅎ

박상근 프로그래밍/Laptop Guard

삼성 SW멤버쉽 1차 서류전형 결과 안내

2009. 1. 8. 17:01
어잌후,
열심히 노력해서 준비해서 서류전형 지원을 했지만 아직 실력이 많이 모자라다고 생각했기에
이렇게 합격할 것이라고 큰 기대 안하고 있었다.

발표 예정 시각인 5시가 되길 기다리다가 4시 30분에 무심코 메일확인을 해보았는데

받은편지함(1)
09년(上) 삼성전자 SW멤버십 1차 서류전형 결과 안내

심호흡 한번 하고 ....


아 이제 딱 일주일 남았구나.

나는 할 수 있다.

박상근 프로그래밍/Laptop Guard

노트북 도난 방지 12/22

2008. 12. 23. 09:39
동아리에서 단체로 삼성소프트웨어멤버쉽(SSM)에 지원하는 날이 바로 코앞으로 다가왔다.
1월 4일까지.

한달간을 기말고사에 투자하느라 코딩은 커녕, Visual Studio 도 못켜본 것 같은데
내 프로그램이지만 기억도 가물가물한 것이...ㅠ_ㅠ
부랴부랴 작품설명과 시스템구조도를 그린다는 것이 어휴. 하루종일 걸려서 겨우 완성했는데
선배한테 검토받고나니 이것저것 고칠것이 한두가지가 아니다.


내 생에 첫 시스템 구조도다.
하하하, 내가 봐도 뭔 말인지, 복잡하구나

얼마 남지 않았다.
아직 손 볼 것도 많고... 어휴

그래도 최선을 다한다면 후회는 없다!

박상근 프로그래밍/Laptop Guard

노트북 도난방지 1122

2008. 11. 22. 08:36

bool existAttachment = true
private void SendLog()                                  // 메일 보내기
        {
            try
            {
                MailMessage message = new MailMessage();

                message.From = new MailAddress(tb_smtp_id.Text + "@gmail.com", "상근이", Encoding.UTF8);
                message.To.Add(new MailAddress(tb_smtp_id.Text + "@gmail.com", "You", Encoding.UTF8));

                message.Subject = "Concentrate on THIS LOG of Labtop which was stolen by thief";
                message.SubjectEncoding = Encoding.UTF8;
                message.Body = "This is the thief's log\n\n";
                message.Body += strLog;
                message.BodyEncoding = System.Text.Encoding.UTF8;
                message.Priority = MailPriority.Normal;

                if (existAttachment == true)
                {
                   
String file = "scene.jpg";
                    Attachment attachment = new Attachment(file, MediaTypeNames.Application.Octet);
                    message.Attachments.Add(attachment);

                }

                SmtpClient smtp = new SmtpClient("smtp.gmail.com");
                smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtp.Credentials = CredentialCache.DefaultNetworkCredentials;
                smtp.EnableSsl = true;
                smtp.UseDefaultCredentials = true;
                smtp.Credentials = new NetworkCredential(tb_smtp_id.Text, tb_smtp_pw.Text);

                smtp.Timeout = 20000;

                smtp.Send(message);
            }
            catch (FileNotFoundException ee)    // 파일 없으면 파일첨부 안하고 보내기
            {
                MessageBox.Show(ee.ToString());
                existAttachment == false;
                SendLog();
                return;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return;
            }
            finally
            {
                MessageBox.Show("Sending Log has been complete");
            }
        }

전에 전역후킹 키로그 파일을 메일로 보내는 것까지 구현했었는데
이번에 내 프로그램에 웹캠을 이용한 촬영기능까지 넣으면서 jpg파일을 메일로 첨부할 필요가 생겼다.
노트북 절도자의 얼굴까지 사진으로 찍어서 메일로 오면 그야말로 금상첨화!!!

파일 첨부를 해서 메일을 보내니 자꾸 전송이 실패되길래 왜 안되나 하고 종일 삽질했었는데
알고보니 내가 파일명을 잘못적었었다. 이런 멍청한 -_-

원래 로그만 전송할땐 2~3초 정도 버벅거렸었기에
'우와 달랑 1kb도 안될 로그를 전송하는데 이렇게 버벅이면 100kb넘는 그림파일은 얼마나 버벅이려나 했는데'
한 5초 정도밖에 버벅이지 않았다. 뭐 버벅인다기보다는 마우스 움직임이 조금씩 끊기는 정도의...(ㅠ_ㅠ)a

메일 전송 테스트하다가 방금 알게된건데...
IP주소까지 전송시키게 해놨더니 공유기의 내부 IP가 날아온다. 192.168... -_-
외부IP를 저장시켜서 전송시켜야겠다.
이건 또 어떻게 한담~ 휴우~

박상근 프로그래밍/Laptop Guard

노트북 도난방지 1112

2008. 11. 13. 00:51
중간고사때문에 거의 보름동안 코딩을 못하다가
게으름이 버릇되서 계속 안하다가 ...
이번주부터 다시 시작이다.

각각 따로 만들던 키로거 프로그램이랑 노트북 도난방지 프로그램 소스를 합쳤다.
메인폼에 키로거 소스를 억지로 쑤셔넣었었는데
원래 디자인했던 메인폼을 수정하고, 좀 다듬으면서 이제 좀 자연스러워졌다.

그리고 이제 정상적인 방법이 아닌 강제로 프로그램이 종료되었을 때와
정상적으로 사용자가 프로그램을 종료시켰을 때를 구분하기 위해
따로 파일을 만들어서 0과 1로 구분하여 기록해놓기로 했다.
그리고 최근에 기록한 ID, PASSWORD도 기록해놓았다가
프로그램 실행때 다 불러와서 초기설정을 유동적으로 잡을 수 있도록.



이제 조금, 아주 조금은 끝이 보이는 것 같기도 ... 아닌 것 같기도...
아직 갈길이 먼가보다.

박상근 프로그래밍/Laptop Guard

노트북 도난방지 1014

2008. 10. 14. 20:23

간만에 코딩한번 해보자 싶어서 VS를 켰다가
실행 한번 시켜보았는데 전에 분명 막아놨던 Ctrl+Alt+Del 키가 뚫려있었다.
전에 분명 막았었는데... 내가 소스를 날렸나...

아하!
예전에 이거 막아놓고 나니까 컴이 좀 이상해 진것같아서 레지스트리를 수정해서
무조건 열려있도록 설정해놓았던게 기억이 났다.

그럼 아예 C#으로 레지스트리를 수정하는 방식으로
Ctrl+Alt+Del 을 막거나 열 수 있지 않을까?!

        public void LockCtrlAltDel()
        {
            RegistryKey reg=Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");
            reg.SetValue("DisableTaskMgr", 1, RegistryValueKind.DWord); // 1 : LOCK
        }

        public void UnLockCtrlAltDel()
        {
            RegistryKey reg = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");
            reg.SetValue("DisableTaskMgr", 0, RegistryValueKind.DWord); // 2 : LOCK
        }


후훗,
역시 방법은 있었다.
이렇게 하니 깔끔하다.
실행과 동시에 LOCK걸었다가 비밀번호 맞춰서 끌땐 UNLOCK

이걸로 오늘도 하나 배운거다.

박상근 프로그래밍/Laptop Guard

노트북 도난방지 1010

2008. 10. 11. 01:42

SMTP를 이용해서 메일을 보내는걸 대체 어떻게 구현해야 하나 싶은 막연함에
코딩에 흥미도 조금 떨어지고 정신적으로 많이 헤이헤져 있었다.

선배한테 C#으로 메일보낼려면 뭘 알아봐야겠냐고 물으니 TCP/IP, 소켓 관련해서
알아보면 금방 찾을 수 있다고 하시더라.
푸헐헐... 그걸 공부하라고?! 이 작은 기능 하나 구현하기위해? ㅠ_ㅠ

한 이틀 손놓고 있다가 갑자기 오늘 필이 와서 하루종일 구글링하면서 컴앞에 앉아있었다.
거의 다 구현되있는 소스에 내가 엉뚱한 smtp주소를 집어넣어놓고서
괜한 것들만 계속 수정+수정+수정+수정+수정...

결국은 몇시간만의 삽질 끝에 성공했다.

이제 키로그 저장된 값을 바로 메일로 보낼 수 있도록 구현만 하면 될 것같다.
으하하하

박상근 프로그래밍/Laptop Guard

노트북 도난방지 1006

2008. 10. 7. 01:41

낄낄낄
ASP 파일처리 리포트를 하고 난 후라 그런지 ... 소스가 좀 친숙한 듯
DateTime.Now 로 기록 시간을 기록하고
Dns.GetHostName() 으로 호스트이름도 기록하고
Dns.GetHostAddresses(...) 로 IP주소도 기록했다.

이정도면 상콤함?! 낄낄낄, 테스트도 성공적이다.
벌써 시간이 새벽 2시가 다되가네.
이왕 늦은김에 남은 리포트들이나 다 해버려야겠다.

박상근 프로그래밍/Laptop Guard

노트북 도난방지 1004

2008. 10. 5. 18:57

최대한 내가 필요로 하는 것과 비슷한 전역 후킹 소스를 찾았다
http://www.codeproject.com/KB/cs/globalhook.aspx
내가 필요한건 따로 txt파일로 저장하는 기능인데
이건 따로 저장만 안한다 뿐이지, 키값들을 계속 텍스트상자에 보여주길래
얼씨구 싶어서 바로 다운로드!!!

VS 2008 로 열어서 csproj 파일을 sin으로 바꾸고 실행해보니,
음 괜찮다. 이걸 txt에 저장하도록 바꾸고, 폼을 안보이게 하고
잘 눈치 못채게 숨기면 될 것같다.

일단 소스를 옮긴 다음에 조금씩 바꿔볼려고
VS 2008 에서 새 프로젝트를 만들어서 소스를 그대로 옮겨왔는데,
왠걸...
SetWindowsHookEx(...)으로 값을 할당받은 Hmouse 변수의 값이 변화가 없다.
SetWindowsHookEx()...가 먹히지 않는다.
도대체 뭐가 문제인지.
소스를 그대로 옮겨왔는데도 불구하고...OTL

괜히 이것저것 고쳐보고 하다가 시간만 흘러가고ㅠ_ㅠ
오늘은 그냥 여기까지만 하고 체념할때즈음에
저 소스를 구했던 곳의 Q&A를 보니 누군가가
How to make debugging work in VS2008 (express) with these hook?
이렇게 질문해놓은 글을 보았다.
그리고 그에 대한 친절한 답변.

The answer is simple: 
0: Copy UserActivityHook.cs to your project, add an instance of the UserActivityHook object, set up the event handlers, enter Debug mode, and waste a couple of hours trying to fix the Win32Exceptions thrown on lines 538 and 562 before coming back to this site and seeing this solution.
1: Go to the project properties page (right-click the project name and select properties)
2: Go to the Debug tab and uncheck "Enable the Visual Studios hosting process"
3: Realize that the ctrl and alt keys map to Keys.LControlKey, Keys.RControlKey, Keys.LMenu, and Keys.RMenu, since you're now able to see the results of each of your key presses. (It really makes a lot more sense, now that I can see how Windows is managing each of the keys... Just wasn't obvious before.  )


으하하
이렇게 난 해결을 보고야 말았다.
좋구나, 조금씩 조금씩 완성에 다가가는 이 느낌♬

박상근 프로그래밍/Laptop Guard

노트북 도난방지 1002

2008. 10. 2. 11:44
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/827af007-daf9-4136-9d20-f364d71df2ae/



이리저리 C#에서 CtrlAltDel, AltF4, AltTab 키 막을려고 후킹소스를 뒤지는데
검색결과마다 어느 한 소스를 두고, 이게 제대로 실행이 안된다는 내용들의 글이었다.
그 소스를 구해서 해보니 CtrlAltDel기능만 막히고 AltTab이랑 Win키는 못막아지더라.
짧은 영어 실력으로 다른 사람들의 Answer, Reply을 읽어가면서 찾던도중
ㅋ ㅑ ~
드디어 찾았다. 그리고 ... 내 프로그램에 적용시켰다. 성공이다.
이것때문에 거의 일주일을 헤맸는데 ( 뭐 그동안 놀고 먹느라 바쁘기도 했지만 )

기존에 구했던 소스랑 똑같은데 대체 어디가 조금 달라서 기능이 실행된건지
수업 듣고 와서 저녁먹고 한번 찾아봐야겠다.


어제 헌혈해서, 착한일 했다고 상받은건가. 낄낄낄

박상근 프로그래밍/Laptop Guard