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