2012년 12월 27일 목요일

Thread 동기화(Monitor, Mutex)

3.Monitor.Enter and Monitor.Exit
Monitor.Enter 와 Monitor.Exit 는 try/ finally 사용한다
Monitor.Exit를 Monitor.Enter 없이 호출된다면 예외를 호출 한다.
CLR 4.0에서는 Monitor.Enter 메소드르 오버로드했다.
public static void Enter(object obj, ref bool lockTaken);
TryEnter Monitor 또한 TryEnter 메소드를 제공한다. millisecond 또는 TimeSpan으로TimtOut을 정한다.
Choosing the Synchronization Object
어떤 오브젝트라도 동기오브젝트로 사용가능하다 스레드 내에서
데드락(스레드내에서 서로 락을 걸음)
중첩락 (Nested Locking)은 가장 바깥쪽에 있는것이사용됨.
4. Mutex
뮤텍스는 C#에서 lock과 같다. 하지만 멀티프로세스 에서 across된다.
즉 뮤텍스는 애플리케이션에서 광범위하게사용된다(컴퓨터)
뮤텍스는 스레드간 아니라 프로세스간에서 사용된다.
뮤텍스로 현재 실행중인 프로그램이
이미 실행되었는지 파악하고 이를 취소하는방법을 사용했었다.

Thread 동기화(Block,Lock)

쓰레드 동기화 문제에 대해 4가지 방법

1. Simple Blocking methods
특정시간의 경과하거나 다른스레드가 끝나기를 기다리여할떄
Sleep, Join and Task.Wait

2. Locking Constructs
제한된 여러 스레드가 실행되어질때 특정시간에 코드의 일부분(크리티컬섹션)을
읽거나 사용할때
하나의 스레드가 코드부분에 접근해야한다.
스레드들은 코드에 접근하기위해 경쟁을 해야하고 서로 방해가 된다.
lock(Monitor.Enter / Moniter.Exit), Mutex, SpinLock
The nonexclusive - Semaphore, SemaphoreSlim, reader/ writer locks.

3. Signaling constructs
스레드는 코드일부분을 사용하고 다른스레드에게 알려야한다.
event wait handles , Monitos' Wait/Pulse methods
Frmaework4.0 CountdownEvent , Barrier classes.

4. NOnblocking synchronization constructs
Thread.MemoryBarrier, Thread.VolatileRead, Thread.VolatileWrite, the volatile keyword, and the Interlocked class.

Blocking
unblocking 발생하는 4가지 방법에는
- 블록킹 조건(조건변수) 이 만족할떄
- 실행시간이 timing out
- Thread.Interrupt
- Thread.Abort
Thread.Suspend를 통한 block은 스레드가 간주하지 않는다.

같은 방법은..매우 wasteful -_- 좀 나아진다면

Locking
하나의 스레드가 코드의 일부분을 사용하는데 매우 유용하다
lock과 Mutex가 있는데 lock은 Mutex보다 빠르고 편리하다.
이 방법은 클래스가 스레드로부터 안전하지 않다.
두개의 스레드가 Go()메소드를 호출한다. 아마 division-by-zero Exception을 발생시킨다.
이유는 _val2 가 하나의 스레드 로부터 0으로 되고 다른스레드에서 이를 0으로 나누려고 했으니말이다.

자 lock을 이용해서 문제를 고쳐보자

오직 하나의 스레드만이 synchronizing objet ( in this case, _locker)특정시간에 접근하므로
다른 스레드에서는 lock의 해제될떄가지 블락을 당할것이다.
이때 블럭된 스레드의 상태 ThreadState 는 WaitSleepJoin 이다.
The Task Parallel Libarary (TPL) and PLINQ sufficiently powerful and high-level
닷넷 4.0 버전부터 TPL을 지원한다고 한다? 잘 모르지만 알아보자

2012년 12월 26일 수요일

Thread Getting Started [1]

스레드 사용에 있어서. 너무 혼란이 생겼다. 다시 스레드 공부해보자

2012년 12월 24일 월요일

IMG 크기변환 및 압축

이전 포스트 Exif에 대해 알아보았습니다.
기술의발전??으로 디카나 핸드폰으로 찍은 사진(이미지)등
화질이 매우 좋아져서 그만큼 데이터 크기도 커졌습니다.

오늘은 JPEG파일 크기 변환과 압축을 해보겠습니다.
아래의해당 소스는 MSDN에서 친절하게 설명합니다.

크기가 큰 이미지 파일을
썸네일 이미지로 보여준다던지
압축하여 디비에 때려 넣든지 해야합니다. (자바 JAI, C# ziplib)

JPEG 압축 수준설정
GDI에서 이미지 자르기 및 배율조정
위의 이미지 리사이즈 부분에서는 Bitmap을 사용했습니다만.- 많은 이미지 처리시에는 속도매우 느려졌습니다. 멋도모르고 걍 리사이즈 되니 좋았지요 ㅠㅠ Mj Blog, C#보다 빠르게 썸네일 이미지 만드는법 을 참고
좀 개선해봤습니다.

Exif 이미지 파일형식

교환 이미지 파일 형식 (Exif; Exchangable Image File format)은 디지털 카메라에서
이용되는 이미지고 JPEG, TIFF6.0, RIFF, WAV파일에 이용되며
사진에 대한 정보를 포함하는 메타데이터를 추가한다고 한다. Exif는 JPEG2000, PNG, GIF파일에서는
지원하지 않는다.

Exif는 일본전자산업진흥회(JEIDA)에서 개발되었다고 한다-_-;
현재 교환이미지 파일형식을 정하는 단체가 기구는 존재하지않지만
디지털 카메라에서 전세계적으로 사용된다고합니다.

- 날짜와 시간정보, 카메라정보, 저작권정보, 그외GPS정보를 담고있습니다.
Exif 메타 데이터 정보
카메라 제조사, 카메라 모델, 회전 방향, 날짜와 시간, 색 공간, 초점 거리, 플래시, ISO 속도, 조리개, 셔터 속도 등의 정보를 제공한다.

위키 Exif

c#에서 GPS정보를 가진 jpeg파일을 읽어 GPS 와 정보등을 읽어보도록 하겠습니다.
우선 Exif파일을 읽어드리기 위해선 라이브러리 ExifLibrary를 다운받아봅시다.

codeproject ExifLibrary

만든이는 터키의 Ozgur Ozcitak 님이랍니다. 여행을 가셔서 많은 사진들을 찍었답니다.
gps정보가 담긴 사진말이죠 , 집으로 돌아와 자기가 어디에 가서 무얼했는지
사진만으로는 귀찬았답니다. 그래서 사진에는gps정보가 있을테니
구글어스나, 피카소, 등으로 gps정보를 가지고 지도에 내가 어디갔었는지를
표시해주려고 했엇지만 ... c#에서는 Exif파일포맷에 대한 기능을 제공하고있지만
마음에 들지 않았나봅니다 좀더 정확한 정보가 필요 했었나보군요.
그래서 자기가 손수 Exif라이브러리를 만들었다고 하네요!!! OH Showking ,,
개발자는 이런데서 빛을 발휘하는군요 ..오옷 나두ㅠ_ㅠ

다운받구 해당 폴더 안에 ExifLabrary.dll 을 프로젝트에
참조 추가해주고 사용해 봅시다.
뭐 사용법은 간단합니다.(codepoject 사용법이 나와있습니다.큭)



Exif파일의 각종 정보를 알아볼수가 있었습니다.~~
다음시간에는 이 위치정보를 가지고 지도에 찍어보도록 하겠습니다.
즐거운 클수마스 보내세요

아래는 Exif파일 포맷입니다.



2012년 12월 23일 일요일

믿음과 사람

블로그구경하던중 믿음에 관련해서 글을 읽었던적이 있습니다.
마음에 와닿아 자꾸 기억나는 글이지요

사람을 한결가이 믿는 다는것은 쉬운일이 아니다.
누구나 살아가면서 주변의 소문이나 다른 사람의 이야기로 인해 어떤 살마을
오해하여 인간관계가 꼬이는 경험을 한적이 있을것이다.
사업상 동반자에서 원수로 돌아서기도한다.

우리는 매일 의식적이든 무의식적이든 어떤 사람의 신뢰성에 대해서
크고 작은 판단을 하고 나름대로 점수를 매기기도 한다. 그 판단은 오차가 나기 마련이다
사람은 상대를 있는 그대로 보기보다는 지극히 주관적인 마음의 창을 통해서 바라보기 때문이다.
더군다나 이 마음의 창은 외부 상황에 따라 쉬이 흔들린다.


"증자는 어질고 효성이 지극한 공자의 제자이다.
한번은 그와 이름이 같은 이가 사람을 죽였다. 증자를 아는 사람이 걱정하여
증자 어머니에게 달려갔다.

"증삼(증자의 본명)의 사람을 죽였습니다."
어머니는 그말을 믿지 않고 여전지 베를 짰다 또 한사람이 찾아와 고했다.
"증삼이 살인을 했습니다."
"우리애는 그럴사람이 아니다."
증자의 어머니는 계속하여 베를 짰다. 얼마뒤 또 한사람이 달려와서 고했다.
"증삼이 사람을 죽였습니다"
마침내 증자의 어머니는 북을 내던지고 베틀에서 내려와 달아났다.
증자가 어질다는 사실을 믿고 있는 어미니도 처음 두 사람까지는 믿지 않았지만,
세 사람이나 와서 같은 말을 하자 믿지 않을수 없었던 것이다.



공자조차도 평소 덕행을 찬탄해 마지않았던 수제자 안회가
스승인 자신에게 올릴 밥에 먼저 손을 댄다고 의심한적이 있었다. 하지만 사실은
안회가 밥에 떨어진 재와 티를 걷어내다가 같이 딸려 나온 밥풀이 버리가 아까워 먹었던 것이다.
공자가 그러니 봍오 사람들이야 오죽하겠는가.
당시 공자는 자신의 실수를 한탄하며 다음과 같이 말했다고 한다.

"믿을수 있는 것은 눈이지만 그래도 믿을수가 없고, 의지할 것은 마음이지만 그래도 의지할것은 못된다.
제자는 이것을 기록하라. 사람을 아는일은 진실로 쉬운것이 아니라고.

마음으로 사람을 판단하려 한다면 여러가지 오류를 면하기 어렵다.
증자 어머니의 이야기처럼 아무리 황당한 거짓말이라도 반복적으로 들려온다면
마침내 마음은 사실로 받아들인다.
또한 마음은 그 당시 상태에 따라서 판단에 지대한 영향을 미칠수 있다.
자신의 마음이 우울할 때는 상대를 평소보다 부정적으로 볼 가능성이 높으며,
마음이 밝고 기쁠 때는 웬만하면 믿어줄 수 있게된다.

인간은 고정불변의 존재가 아니다
상대가 의심하느냐 혹은 믿어 주느냐에 따라서 그 사람의 신뢰성은 얼마든지
바꿀수 있는 상호간섭의 존재인것이다.
즉, 호감을 가지고 믿어준다면 상대의 믿음에 호응해서 변하기도 하는 것이 인간이다.

변하는것과 변하지 않는것을 구분하는 프로그래밍

변하는 것과 변하지 않는것: 개발철학

보기 알티베이스http://altistory.net/4539

2012년 12월 21일 금요일

[Windows] Apache2.2.x + php 5.x + MongoDb 설치

오래전에 간략하게 게시판에 메모해놓고 포맷하고 다시 구축하는김에
새로이 블로그에 작성합니다.

%php를 이클립스에서 개발위해 php 플러그인을 설치하자
Help- Install New Software..에서 inhttp://download.eclipse.org/tools/pdt/updates/2.0/

이럴 필요가없다!!!!! Help - Eclipse MarketPlace 에서 PTI 검색하 다운로드 받자!!!

구축 시점이 12년 12월 12일인데 이클립스 새로운버젼인 juno를 설치했다..(주노가 그닥 -_-)
기존 이클립스에서 자동완성기능인 Ctrl+ Space가 없다고 한다.
플러그인으로 다운받아야 한다고 해서

Help - Install New Software..에서 http://download.eclipse.org/releases/juno 의
Language 에서 Code Recommender를 설치하자

========== 이부분은 아래로는 확실하지 않습니다. 설치하고 정리하겠습니다. ============
1. 아파치 www.apache.org/ 으로 가서 다운로드한다.
- VC9 과 VC6 의 차이: VC9은 visual c++ 2008 Runtime / Runtime(x64)가 설치되어있어야만 사용가능,
2008로 컴파일되었다.

또한 IIS 서버에서 사용 VC6은 visual 6 컴파일된것으로 apache1 또는 apcahe2
사용한다면 VC6을 사용해야함

2. 다운로드 받은후 설치를 시작한다. 본인은 C:\Apache2.2

3. PHP http://www.php.net/ 로 가서 다운로드를 받는다.
(다른분들은 msi installer 파일보단 zip 파일로 다운로드 하라는데 관련 DLL 존재유무란다)
그냥 다운로드받음 C:\php (Thread 용으로 받아야 php5apache.dll 파일존재함)


기냥 C:\Apache2.2\ CONF\Extra 하지말고 걍 httpd-conf 파일에다가 아래 내용을 삽입하자(마지막줄에)

#BEGIN PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL
PHPIniDir "c:\php"
LoadModule php5_module "c:\php\php5apache2_2.dll"
#END PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL

중간 부분에다가
AddType application/x-httpd-php .amz .php .htm .inc .dos .phps .html
AddHandler application/x-httpd-php .phps
AddType application/x-httpd-php-source .phps

아래의 내용을 포함시키자 그런후
C:\Apache2.2\htdocs 아래의 디렉토리밑에 php 관련 파일을 하나 만들어넣고
서버를 재시작하고 http://localhost/XXX.php 를 돌려보면 잘 돌아갈것이다..

8. 몽고디비를 설치해보자
http://kr2.php.net/manual/en/mongo.installation.php#mongo.installation.manual
- 해당 사이트에서 Installing on Windows 부분에서 자신의 php 버젼에 맞는것을 다운로드 하자.
- unzip하고나서 해당 파일을 C:\PHP 아래에 EXT 디렉톨이를 만들어서 넣고
- PHP.INI 파일을 열어서 " extension=php_mongo.dll " 을 넣어주고 재시작 하면 끝~~


PHP Down
http://php.net/downloads.php

Mongo PHP Driver 알맞은거 다운
https://github.com/mongodb/mongo-php-driver/downloads

Mongo 설치 방법
http://se2.php.net/manual/en/mongo.installation.php#mongo.installation.windows


cmd창을 열어서
1. c:\ netstat -ano (netstat -help)
확인하다 우측의 PID를 확인

2. window 작업관리자 열고 해당 PID를 사용하는 프로세스를 확인하고 강제종료한다

Java개발환경구축

자바 환경 구축
1.JDK 설치 운영체제 32/ 64비트에 따른 JDK다운로드 설치
본인은 C:\JAVA\설치함
http://www.oracle.com/technetwork/java/javase/downloads/index.html

2. 이클립스 설치
http://www.eclipse.org/downloads/

자 자바환경변수를 등록해보까?
그렇다면 환경변수는 왜 ?등록하는것인가?
왜 등록하는것인가?(현실은시궁창:http://c36wn.egloos.com/4205675)

매번 구축할때마다..검색하는 번거로움을 없애기 위해 이렇게 남긴ㄷ..

2012년 12월 20일 목요일

소수 prime

소수 Prime Number http://ko.wikipedia.org/wiki/소수_(수론)

100까지의 처음 25개의 소수는
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89,
97, 101, 103, 107, 109, 113...
여기서 2는 유일한 짝수 소수이다.
소수를 찾는 현재까지 가장 간단한 방법으로 에라토스테네스의 체 가 있다.
1. 찾고자 하는 범위의 자연수를 나열한다.
2. 2부터 시작하여, 2의배수를 지워나간다.
3. 다음수의 배수를 모두 지운다(3-의배수,4...5..)

연속 소수체 예를 들어 8은 연속된 두 소수 3과 5의 합으로 나타내어질수 있으므로 2 - 연속 소수체이다.
아래는 에라토스테네스의 체를 사용하지 않고 소수를 구했다.

Q.에라토스테네스의 체의 방법으로 구하려면
2의배수, 3의배수 4의배수를 지워나간다고 했다.
100 까지의 소수를 구할경우 지워나간다고 했다면
1, 2, 3 ..... 98, 99, 100 의 수를 정수형 배열에 가지고있어야 하는건가?
배열에 가지고있다가 2의배수 3의배수,,, 를 배열인덱스로 지워야하는건가?
다른방법??은 없으까

http://ko.wikipedia.org/wiki/에라토스테네스의_체 위키에 간단한 C++과 JAVA로 구현된 알고리즘과 이미지가 있으니 참고하자.

2012년 12월 19일 수요일

Stack Heap,,,메모리공간

아래와 같은 메소드와 변수들이 있을경우 메모리에서는 도대체 무슨일이 일어나는가??
출처 http://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types
다음에는 new로 인스턴스를 두개 생성했을경우의 그림이다.

이렇게 스택과 힙 두영역에 나누어 지고
힙영역의 메모리가 가득찬다면 C#? 닷넷에서는
Garbage Collecter가 자동적으로 메모리를 관리해준다.
사용하지 않거나 사용한지 오래된 것은 GC가 알아서 처리하여 메모리를관리해준다고 한다.
하지만 직접적인 GC 호출은 시스템에 성능저하를 유발할수 있어 불가피한상황이 아니라면 피해야한다고 함.

GC 사용을 하지말라면???
IDispose, Finalize 를 구현하자!!! 단, C#에서는 소멸자를 사용하지말자?
예를 들자면 대용량의 객체를 사용한뒤 시스템 부하를 줄여야 하는상황..

다음의 코드는 인자로 받아진 object의 메모리 주소를 알아보는 코드다
{

Thread 개념

Socket통신을 사용하다가 Client가 통신이 끊기게 되면
Server는 이를 알아채고 클라이언트의 접속을 다시 대기해야합니다.

Socket.Accept();

Accept()부분을 쓰레드로 생성하여
기본 스레드와 별개로 스레드를 생성해서 Accept()를 했습니다.
이러면 기본스레드에 대해 비동기적으로 Accept()를 수행됩니다.

스레드를 이해하고 얼마 지나지 않으면 스레드에 기억이..가물가물..
또 다시 스레드에대 학습하게 됩니다.-_-;;

간단히 스레드에 대해 알아봅시다.
Worker클래스의 DoWork 메소드를
Thread.Start() 메소드로 실행하여 줍니다.

workThread.IsAlive 는 현재 스레드의 실행상태를 나타내는 값을 가져옵니다.
스레드가 시작되었으며 정상적으로 종료 또는 중단되지 않았으면 true고, 그렇지않으면 false

Thread.Sleep(1); 이렇게 한다면 기본스레드가 잠시 중단하고
다른 스레드(workerThread)는 DoWork메소드의 루프를 몇차례 반복하여 실행할수 있습니다.
Thraed.Abort()는 다른 스레드에서 스레드를 종료 할수 있습니다.
하지만 스레드의 작업이 완료됬는지 관계없이 스레드가 종료되어 리소스를 정리할수없습니다.

그래서 기본스레드(메인)에서 Thread.Join()메소드를 호출하여
개체가 가리키는 스레드가 종료될때까지 현재 스레드를 차단하거나 대기상태로 만듭니다.
Join()은 작업자스레드가 반환되고 자체 종료될떄까지 반환되지 않습니다.

관련내용은 http://msdn.microsoft.com/ko-kr/library/7a2f3ay4(v=vs.90).aspx
다음글에서 쓰레드와 관련되는 클래스를 만들어 사용해 보기로 합시다.

사용자정의 컨트롤 만들어보기 (ProgressBar)

C# 닷넷 컴포넌트의 ProgressBar가 있습니다.
닷넷 프로그래스바의 내부에 Text라던가 Label을 넣어
프로그래스바와 내부에 글자를 넣어 보겠습니다.
우리가 만들것은 아래의 그림과 같은 ProgressBar 사용자 정의 컨트롤 입니다.
추가 => 사용자 정의컨트롤을 선택하여 CProgressBar.cs 를 생성합니다.
이제 코딩을 시작해 봅시다.
우선, 디자인부분에서 프로그래스바와 내부에 위치할 Text를 가질 Label을 넣어줍니다.

하나의 TableLayoutPanel(열 두개)을 만들고
각 열에 Label을 만들어넣습니다(구분을 명확하게 하기위해 Color를 임의로 넣어준겁니다.)
TableLayoutPanel과 Label의 BackColor는 투명하게 해줍니다(TransParent)
코드를 살펴봅시다.

CProgressBa 생성자에 디자이너부분에서 만든 Label들의 ForeColor와 Font를 지정합니다.
(불필요한 작업같군요. 안해줘도 될거 같아요)
맴버 변수 선언부분입니다.
Pen pen은 열을 구분하기 위해 OnPaint시 사용할 Color입니다.
┌───────────┐
│                       │
└───────────┘빨간 구분선

protected 선언된 맴버변수는 디자이너의 속성창을 보면 생성되어져 보입니다.
속성창에서 값을 변경하게 되면 아래의 맴버변수들의 변경되는거지요.
protected로 선언되었으니 이를 대신 받아줄 get; set 변수들이 필요합니다.
아래에서 Value 즉 Percent값의 변경될때마다 Invalidate()를 호출하는데요
this.Invalidate()메소드를 호출할때마다 OnPaint()메소드를 재 호출 합니다
OnPaint 메소드를 오버라이드 해서 필요한 것을 그려주면 되는것이지요
ClientRectangle은 컨트롤 영역의 사각형을 가지고 계산식으로
Rectangle에 색깔을 입히게 되는겁니다.

Socket(Tcp) 비동기 Client

Socket(Tcp) 비동기 Server

c# Socket의 비동기 서버 입니다.
비동기 부분에서 눈여겨 봐야할부분은
BeginAccept <====> EndAccept
BeginSend <====> EndSend
BeginReceive <====> EndReceive
메소드들의 짝을 이뤄야한다는점입니다.
Socket.BeginSend()의 원형을 보면(MSDN Library 참고 및 검색) AsyncCallback 대리자
Object state 상태정보를 포함한 객체(사용자정의객체도 됨)를 눈여겨봐야할것같습니다.
예외처리시 SocketException이 발생하는데요
SocketException.SocektErrorCode의 맴버들을 적절히 사용해야됩니다.
NotConnected = Socket의 연결되지 않은 상태로 응용프로그램에서 데이터를 보내고 받으...
ConnectionRefused = 원격호스트가 연결을 거부했습니다.
ConnectionReset = 원격피어가 연결을 다시 설정했습니다. 등등등.

Socket(Tcp) 동기 Client

c# Socket(Tcp) 클라이언트를 구현해봤습니다.

2012년 12월 17일 월요일

Socket(Tcp) 동기 Server

c# Socket(Tcp)를 이용한 싱글 서버를 구현해봤습니다. 수정할 부분이 많습니다.-_-