본문 바로가기

C#

보다 심플한 C# 싱글턴 만들기 // simple type of c# singleton pattern public class Communicator { private static Communicator _inst; public static Communicator GetInst { get { return _inst; } } static Communicator() { _inst = new Communicator(); } private Communicator() { Console.WriteLine("NEW"); } } static 생성자를 통한 싱글턴 만들기. 더보기
상속된 Generic 타입 만들기, 타입의 제약 사항 선언 ( Generics Constraint ) 출처 : http://www.csharpstudy.com/CSharp/CSharp-generics.aspx Generics 타입 제약(constraint) C# Generics를 선언할 때, 타입 파라미터가 Value Type인지 Reference 타입인지, 또는 어떤 특정 베이스 클래스로부터 파생된 타입인지, 어떤 인터페이스를 구현한 타입인지 등등을 지정할 수 있는데, 이는 where T : 제약조건과 같은 식으로 where 뒤에 제약 조건을 붙이면 가능하다. 아래는 다양한 제약을 가한 예제들이다. 예제// T는 Value 타입 class MyClass where T : struct // T는 Reference 타입 class MyClass where T : class // T는 디폴트 생성자를 가져야.. 더보기
WebClient 를 이용한 GET 과 POST 전송하기. GET 예제 WebClient wc = new WebClient(); StringBuilder sb = new StringBuilder();sb.Append("https://openapi.youku.com/v2/uploads/create.json?"); sb.AppendFormat("client_id={0}", client_id); sb.AppendFormat("&access_token={0}", access_token); sb.AppendFormat("&title={0}", "jjongun upload test " + time_str); sb.AppendFormat("&tags={0}", "jjongun"); sb.AppendFormat("&file_md5={0}", hashString); sb.App.. 더보기
키넥트의 장치 ID 알아내기 (Kinect for Windows) 마이크로 소프트 키넥트 SDK 에서는 UniqueKinectId, DeviceConnectionId 를 제공한다. 하지만 UniqueKinectId 는 거짓이다. 다중 키넥트 사용시 모두 같은 값을 반환 한다. 그렇다면 DeviceConnectionId 은 어떠한가? 유니크 해 보이지만, USB 포트를 달리 하거나 허브, 리피터를 꼽을때마다 바뀐다. 그래서 실제 장치의 시리얼을 뽑을 수가 없다. 사용할 컴퓨터 마다 달라지니 말이다. 하지만 각고의 노력끝에 아래와 같은 항목을 발견 하였다. 형제 라는 항목인데, 영문 윈도우라면 정확히 어떤 속성 이름인지 알 수 있었겠지만, 일단 [형제ID] 로 지칭 하기로 하였다.저 아이디는 컴퓨터가 바뀌어도 어떤 키넥트를 정확히 특정 지을 수 있는 ID 이다. (Kine.. 더보기
[WPF] 멀티쓰레딩 에서 GUI 렌더링과 그것의 속성을 외부에서 접근하기 이전글 을 참고 하자 (http://scripter.co.kr/274) 이전 버전은 쓰레드 안에서 View 를 생성하여 while 루프 안에서 RenderTargetBitmap(이하 RTB) 로 찍어 내는 방식이었다. 하지만 쓰레드 안에서 생성한 Element 는 CompositionTarget 등 Dispathcer 관련 서비스를 이용 할 수 없었다.그래서 전역 메모리 공유 (멤버 변수) 를 통하여 좌표 라던지 크기 등 GUI 요소에 간접 접근 하는 방법 밖에 없었다. 직접 접근 하려면 , 아래와 같은 에러를 볼 수 있다. 그래서 앞서 설명 한 것 처럼 간접 접근을 통하여 while 루프에서 변경을 체크 하여 적용 할 수 밖에 없었는데, 이러한 점 때문에 약간의 딜레이를 감수 해야 했었다. 그리고 이러.. 더보기
[C#] 리플렉션 없고 자동완성 되는 PresetLoader.cs 비주얼 스튜디오 에서 기본 제공해 주는 *.config 는 상당히 편리한 구석이 있으나 문서 자체가 너무 복잡하게 되어 버릴 경우가 많아서 사용자에게 xml 을 수정 하라는 요구를 하기가 사뭇 꺼려 진다. 하지만 문자열로 xml의 값을 하나 하나 불러 오는것도 인간적인 실수 와 더불어 사용 코드가 그리 깔끔하지 않아 불편함이 있다.그래서 개선한 버전인 클래스 필드의 변수를 리플렉션 하여 얻어와 값을 인위적으로 넣어 주는 방법이 있었는데, 리플렉션 역시 사용 환경에 따라 제약이 생길 수 있다. (난독화, MONO , 등등) 그래서 셋팅값의 자동완성도 가능하면서 리플렉션도 사용하지 않는 PresetLoader 를 만들었고 그것의 실체와 사용법은 아래와 같다. // // PresetLoader.cs // Ca.. 더보기
[WPF] 이미지 블러링을 원천적으로 해결하 XAML 로 이미지를 위치 시킬경우 빌드 하면 가끔씩 이미지가 흐려 보이는 현상이 보일때가 있다. 이것을 해결 하려 구글링 하면 SnapsToDevicePixels , RenderOptions , UseLayoutRounding 등등의 방법이 난무 하지만 잘 안먹힐때가 많이 있다. 또한 이러한 현상은 왠지 낯설지가 않다.플래시 에서도 이러한 현상을 볼 수 있는데, 이유는 픽셀 시작점이 정수가 아니라 소수점으로 떨어 질 경우 정확한 필셀이 화면에 그려지지 않고 두 픽셀에 걸쳐서 색을 섞어 버리니 결국 흐려 보이는 것이다. 이러한 배경을 가지고 실제로 포지션을 구해보면, ... Window window = Window.GetWindow(target); Point actualTargetPoint = targe.. 더보기
[WPF] 키보드 포커스 가져오기 / 삭제하기 키보드로 컨트롤이 절실한 경우가 있다. 컨트롤 들의 미세한 컨트를을 위해서 이다.(예를 들면 Slider 류) 그런데 한 화면에 Textbox 가 있고, 이것은 키보드 포커스를 뺏어가서 반환 하지 않는다. 그래서 아래와 같은 방법으로 처리 할 수 있다. 0. 그전에, 사용자의 컨트롤 밖에 클릭을 감지 하기 위해 현제 윈도우의 마우스 이벤트를 이용하여 포커스를 죽여도 좋다는 상황을 만들어 보자.아래의 메서드를 이용한다. /* * 사용방법 * Window.GetWindow(this).PreviewMouseDown += MainWindow_PreviewMouseDown; * ... * void MainWindow_PreviewMouseDown(object sender, MouseButtonEventArgs e.. 더보기
[WPF] UserControl 에서 간단 마우스,키보드 이벤트 수신법 지울 필요가 없거나 충분히 on off 를 조절 하여 사용할 수 있는 환경이라면 구지 XAML 이나 += 로 추가 하지 않아도 아래와 같은 방법으로 override 하여 사용하면 깔끔하다. protected override void OnMouseDown(MouseButtonEventArgs e) { base.OnMouseDown(e); this.Focus(); Console.WriteLine("req focus"); } protected override void OnMouseEnter(MouseEventArgs e) { ((SolidColorBrush)(_circle.Fill)).Color = OverColor; } protected override void OnMouseLeave(MouseEventAr.. 더보기
[WPF] 멀티쓰레드 상황에서 WPF Control 캡처 하기 WPF 의 Shape 그리기나 , Shader Effect , Brushes 등등이 WPF 를 사용하면 아주 쉽고 처리속도에도 이점이 많다. 하지만 일반적인 방법으로는 메인쓰레드에서만 비주얼 요소를 사용할 수 있어 사용이 제한적이고 , 별도의 프로세싱을 위하여 사용 할 경우 CPU 사용량이 높아져 전체적인 GUI 가 버벅되는 현상이 발생 할 수도 있다. 이를 극복하기 위하여 멀티 쓰레드 상황에서 WPF 컨트롤에 접근 하는 방법을 알아 보자. using System; using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; us.. 더보기
[메모] 이중 반복문이 느리다. if (true) { int c = 0 , d = 0; int x = 0, y = 0; for (int i = 0; i 0) { ++y; x = 0; } if (this.depthPixels[i].PlayerIndex > 0) { maskedImage.Data[y, x, 0] = 30; maskedImage.Data[y, x, 1] = 250; maskedImage.Data[y, x, 2] = 30; } ++x; } #region // 아래와 같이 x y 이중 반복문은 위의 알고리즘 보다 훨씬 느리다. //for (int x = 0; x 더보기
웹캠 포커스 강제 설정방법 로지텍 캠의 고질적인 문제는 오토포커스 설정이 재부팅 시 원복 된다는 점이다. 그러나 아래의 DirectShow 를 이용한 메서드 들로 해결 할 수 있다. ( 출처 : http://stackoverflow.com/questions/18124646/manually-focus-camera-in-emgu-cv) private void SetCameraControl() { Console.WriteLine("Camera Setting ! "); DsDevice dev = GetPCCamDev(); if (dev == null) return; IFilterGraph2 graphBuilder = new FilterGraph() as IFilterGraph2; IBaseFilter capFilter = null; if.. 더보기
직렬화된 배열을 비트맵 스타일로 배열하기 , 리사이징 하기 1) 직렬화된 배열을 비트맵 스타일로 배열하기 , 2) 직렬화된 배열을 비트맵 스타일로 리사이징 하기 위의 요건이 이번 프로젝트 에 필요하게 되었다. 상황은 키넥트에서 받는 DepthFrame 을 이용하여 유니티에서 1:1 로 파티클을 매칭 한다. 이때 파티클은 1개의 매쉬 에 동적으로 그려진 버텍스 들이다. 그리고 버택스 개수는 약 6만5천개로 제한적이다. 그리고 일정 개수 이상 넘어 가고, 이것들을 루프에 돌릴때, 메인쓰레드의 FPS 가 떨어지는 불상사가 일어난다. 그래서 품질과 퍼포먼서의 적정 수준인 160 x 120 해상도의 DepthFrame 이 필요한데, 안타깝게도 키넥트에서는 저 해상도를 지원하지 않는다. 그러나 비트맵으로 변경하여 리사이징 하면 간편하다. 하지만, 이렇게 할 경우 이미징 과.. 더보기
[중요 메모] STA Thread 와 COM 객체 사용시 절대 주의 할점 while (true) { for (i = 0; i 더보기
c# Emgu 카메라 칼리브레이션 요점 정리 요점만.. 위의 사진을 사용하여 키보드 [1], [3] 을 번갈아 누르면, 점차 정확한 이미지를 얻을 수 있다. 위의 이미지는 대략 10번 정도 반복한 결과 이다.원리는 컬리브레이션 결과를 다시 컬리브레이션 하는 반복 과정 이다. using Emgu.CV; using Emgu.CV.Structure; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace CCT_form { public partial class For.. 더보기
[Marshal] byte* to byte[] protected override void CamStreamStart() { uint i = 0; SNCameraStreamEvent evtarg = new SNCameraStreamEvent(); while (true) { for (i = 0; i 더보기
[WPF] 이미지 byte[] 를 바로 BitmapSource 로 옮기자. 바로 BitmapSource.Create(...) 를 이용하는 방법이다.이전까지 WriteableBitmap 을 사용하였지만, 이방법이 더욱 간단하고 처리과정에서 이슈도 적다. 보통 별도 쓰레드 루프 에서 지속적인 이미지 byte[] 를 얻고 아래의 코드를 활용하여 GUI 에서 처리 한다. 신경을 써야 하는 부분은 간혹 InvalidOperationException 이 발생한다. try { bsrc = BitmapSource.Create(screenRenderSize.Width, screenRenderSize.Height, 96, 96, PixelFormats.Rgb24, null, W_RawSource_data, REGB24Stride); bsrc.Freeze(); } catch (InvalidOper.. 더보기
[WPF] VisualStudio 에서 [ is not recognized or is not accessible] 에러 해결법 위와 같은 에러메시지.. 아무리 컨트롤들을 잘 잡아도 계속되는 고질적인것은.. Here's the solution. In the application's .csproj file, change this: Debug x86 to this: Debug AnyCPU Do not be fooled by the fact that Visual Studio reports that you are running in AnyCPU more in the configuration manager. You must hand-edit the .csproj file 하고 한번 빌드해주면 된다. 아니면 F5 하던지.. 더보기
XmlDocument 사용법 정리 XML 문서 c#attractTimeTable = new List(); XmlDocument xml = new XmlDocument(); xml.Load(Environment.CurrentDirectory + "/config/KBVideoTimeTable.xml"); XmlNodeList _attract_list = xml.SelectNodes("/root/attract/time"); Console.WriteLine(_attract_list.Count); foreach (XmlNode xn in _attract_list) { Console.WriteLine("----------------------------"); Console.WriteLine(xn.Attributes["type"].InnerText).. 더보기
WPF , CacheMode CacheMode 의 사용과 비 사용의 테스트 이다. 테스트 방법은 사진 640 , 480 ,사이즈의 이미지 플레이트 들을 60장 생성하고 이를 겹겹이 겹쳐 놓은 다음 최상단 플레이트를 크게 움직였다. 첫번째는 캐쉬를 설정하지 않은 경우 이다. FPS 가 6 정도 나왔다. 거의 사용이 불가능 하다. 다음은 캐쉬를 설정한 경우이다. 캐쉬 적용 시점은 이미지의 로드가 완료 된 후 이미지 플레이트 전체에 설정 하였다. 참고 : 선택할경우 테두리의 알파값이 변하는 애니메이션이 존재한다. FPS 수치는 절대적인 수치가 아니라 상대적으로 이해 하는것이 맞다. 테스트 PC 사양 : i5 3세대 (1.7 ~ 2.4)Ghz , 4G RAM , Intel HD 4000 (노트북) 결론 : 비주얼에 캐쉬를 설정하는것은 비주.. 더보기
[Surface2]Surface2.0 Simmulator on Windows8 , Solved! 윈도우8 에서 Surface SDK 가 설치되지 않는다. 하지만 dll 만 있다면 개발은 할수 있다. 그러나 시뮬레이터는 사용할수가 없어 완전한 개발을할수 없었다. 그러던 어느날 , 설치가 되었다. 어떻게 되었는지는 확실치 않으나 실제 경로 C:\Program Files (x86)\Microsoft SDKs\Surface\v2.0 에 정확히 파일이 있고 , C:\Program Files (x86)\Microsoft SDKs\Surface\v2.0\Tools 에도 모든 유틸리티가 존재 한다. 아마도 그냥 한번 윈도우7 의 것을 그대로 복사를 했나 보다. 지원 하지 않는다는 글 , http://social.technet.microsoft.com/Forums/et-EE/surfacesoftware2/threa.. 더보기
[Surface - WPF] Surface 에서의 에니메이션 활용 (ArtefactAnimator) 출처 : http://artefactanimator.codeplex.com/ 기존 WPF 의 애니메이션 중 스토리 보드(Storyboard) 라는 극악의 사용성을 가진 방법이 존재 한다. AS3 의 트윈라이트 (TweenLite , TweenMax) 처럼 산뜻하지 않고 왠만한 복합에니메이션을 구현하려면 한바닥이 꽉 찬다. 이건 , 머 차라리 자체적으로 트윈 클래스를 만들라는 숨은 의도 같다. 그러던 도중 artefactanimator 라는 것을 발견했고 이것이 AS3 의 TweenLite 를 본따서 만들었다고 한다. 사용법이 간단하다. 그러나 보통의 UIElement 에서는 잘 동작 하나 , Surface2.0 용 컨트롤 에서는 당췌 동작하지 않는다. 이유를 살펴 보니 각 속성이 getter setter.. 더보기
[.NET] 어셈블리 하나로 합치기 (ilmerge 사용안함) 코딩을 하다보면 dll 들이 엄청 늘어 날때가 있다. 폴더가 지저분해진다. 보기 않좋다. 그래서 모든 dll 을 Embed 시키는 방법을 알아 본다. 기존의 ilmerge 라는 툴이 있지만 WPF 등과 같은 프레임웤에 사용하려면 관련된 dll 을 다 열거 하라고 하고 사용법 또한 그리 스마트 하지 않다. AppDomain.CurrentDomain.AssemblyResolve 를 이용하여 하나로 합칠수가 있다. 우선 사용될 모든 dll 을 비주얼 스튜디오 안으로 끌어 온다 . 그다음 이 모든 dll 들을 포함 리소스로 만들어 준다. 그리고 App 클래스로 이동하여 아래와 같이 코딩 한다. using System; using System.Collections.Generic; using System.Confi.. 더보기
[WPF] 트레이 아이콘 만들고 사용하기 트레이 아이콘을 만들고 , 무언가 알림이 있을때 풍선메시지를 만들어 본다. 먼저 간단히 아이콘을 만들어 리소스에 넣어 본다. * [프로젝트 속성] - 리소스 - 리소스추가 - 아이콘 추가 를 하면 기본 아이콘이 생성된다. 이를 Properties.Resources.Icon1; 로 접근 할수 있다. 사용법은 아래와 같다. private System.Windows.Forms.NotifyIcon trayIcon; protected override void OnInitialized(EventArgs e) { base.OnInitialized(e); //make up tray icon trayIcon = new System.Windows.Forms.NotifyIcon(); trayIcon.BalloonTipTex.. 더보기
[WPF] 윈도우 닫기 명령 무시하기 윈도우 유틸 어플리케이션을 만들경우 윈도우 닫기를 눌러도 무시해야 하는 경우가 생긴다. 닫이면 안된다는것이다. WIN32 를 건드리지 않고서라도 간단히 해결할수 있는 방법이 있다. protected override void OnClosing(CancelEventArgs e) { base.OnClosed(e); //do something //WindowState = System.Windows.WindowState.Minimized; e.Cancel = true; } OnClosing을 오버라이드 하면 된다. 더보기
[asmx] 쿠키 이용하기 , (사용자 인증) 서버측 코드 [WebMethod] public string LoginService(string _userId , string pw) { var query = from user in db.DbAccounts.Accounts where (user.User_id == _userId) select user; if (query.Count() > 0) { //success HttpContext.Current.Response.Cookies["User_id"].Value = _userId; //HttpContext.Current.Response.Cookies["User_id"].Expires = DateTime.Now.AddMinutes(10); return "ok"; } else { //fail return "fai.. 더보기
[SQL2012] DB 생성부터 사용자 만들기 그리고 SQL 접속하기 asmx 를 시도중이다. 그리고 원격 서버의 DB 를 접근 하려면 꼭 계정정보가 원격 코드에 입력이 되어 있어야 사용가능하다. 그렇지 않으면 인증 오류가 난다. MS SQL 2012 기준으로 데이터베이스 생성부터 사용자 만들기 , SQL 에 접근 하기 를 기록하겠다. 1) 데이터 베이스 생성 과정 2) 테이블 생성 완료 3) 계성 생성 4) 생성된 계정의 정보 보기 5) 비밀번호 재 설정 6) SQL 접근 * 누락사항 : SQL 의 DB 속성에서 Permissions 에 사용자를 할당하여 권한설정을 해주어야 한다. 더보기
sqlMetal 사용법 외부의 SQL Database 라도 손쉽게 dbml 혹은 맞춤 클래스와 맵 을 얻을수 있다. 우선 VisualStudo 명령 프롬프트 에서 적당한 디렉토리로 이동후 아래의 명령을 타이핑 한다. sqlmetal /Server:plasticserver_ /Database:TEST_DB /Code:LinqTest.cs /Map:LinqTest.xml /Pluralize /Functions /Sprocs /Views sqlmetal /Server:plasticserver_ /Database:TEST_DB /dbml:linqTest.dbml /Pluralize /Functions /Sprocs /Views 위의 것은 .cs 파일과 맵XML 생성 , 아래것은 dbml 생성 한다. 더보기
Activator 를 이용한 Type Instance 생성 이러한 표현을 하고 싶을 때가 있다 public void setType( Class TTT) { var t = new TTT(...); t.a = 123; t.b = "azc"; } 하지만 C# 에서 위와 같은 표현은 허락 하지 않는다. 현제 로컬 DB 라이브러리를 만들고 있다. 불러들일 로컬 DB의 Column 을 개발자는 미리 알고 있지만 생성기를 통하지 않고서는 각 로우에 맞는 클래스를 자동으로 만들어 주지는 않는다. 그래서 위와 같은 표현이 아쉬운것이다. TTT 라는 클래스에 DB의 테이블에 맞는 클래스를 작성한다음 활용 하면 좋은데.. 그래서 아래와 같은 방법을 생각했다. 가능하다. 하지만 많은 UnBoxing 과 리플렉션이 사용됨으로 사용횟수에 따라 성능차이가 날것이다. // Type type.. 더보기
[Broadcast Video Streaming] 640 * 480 * 4 만큼의 컬러 바이트 배열을 실시간으로 각 SWF 로 전송하여 그 컬러 배열 대로 bitmap을 만들어 실시간으로 업데이트 했다. 초당 1.2 M 전송율 , 로컬 네트워크로 묶을 경우 대역폭을 생각해서 공유기를 선택하면 효율적일듯 함. 문제 화면 깜빡거림 문제 : 82 바이트 만큼의 크기가 맞지 않는다. 화면 색 : 전송되는 컬러 바이트 배열순서와 복원 되는 컬러 바이트 배열 순서가 서로 틀려서 나온 결과 ARGB , BGRA , RGBA 결과 ㅡ 돈주고 화면 스트림 장비나 , 서버를 산다던데,,, 구지,,, 더보기