Skip to content

생계형 개발자 수첩 ver4.0

이제 나이 먹어 강제로 4.0 버전업됨, 일인개발자임, 파키스탄식 코딩.. 오래된 코드도 다시 쓴다.

Tag: C#

DB Table Column 이름 가져오기.

Posted on 2023년 7월 28일 - 2023년 8월 10일 by kimczip
SELECT column_name
FROM information_schema.columns
WHERE table_name = '테이블명';
SELECT column_name
FROM user_tab_cols
WHERE table_name = '테이블명';

select concat('public object ', column_name, ' { get; set;}')
from information_schema.COLUMNS
where table_name = '테이블명' and table_schema = 'DB명'
/* 결과값 :: 복사 후 자료 형만 적절하게 교체 */
public object SEQUNCE {get;set;}
public object LEVEL {get;set;}
public object MENU_REG {get;set;}
public object MENU_RENT {get;set;}
public object MENU_SEARCH {get;set;}
public object MENU_ANALYZE {get;set;}
public object MENU_DEL {get;set;}
public object MENU_MATCH {get;set;}
public object USER_NM {get;set;}
public object USER_ID {get;set;}
public object USER_PW {get;set;}
public object START_DATE {get;set;}
public object END_DATE {get;set;}
Posted in 3.0Tagged C#, MySQLLeave a comment

DLL 파일 PublicKeyToken 얻기

Posted on 2022년 8월 30일 - 2023년 8월 10일 by kimczip
([system.reflection.assembly]::loadfile("DLL 파일 절대 경로")).FullName
Posted in 3.0Tagged C#, PowershellLeave a comment

C# List를 DataTable로 변환

Posted on 2020년 9월 28일 - 2023년 8월 10일 by kimczip

제네릭 타입의 List를 DataTable로 변환하는 메서드

public static DataTable ToDataTable(this List items)
{
    var tb = new DataTable(typeof(T).Name);
     
    PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

    foreach (var prop in props)
    {
        tb.Columns.Add(prop.Name, prop.PropertyType);
    }

    foreach (var item in items)
    {
        var values = new object[props.Length];
        for (var i = 0; i < props.Length; i++)
        {
            values[i] = props[i].GetValue(item, null);
        }

        tb.Rows.Add(values);
    }

    return tb;
}
Posted in 3.0Tagged C#Leave a comment

C# WinForm에서 한글 입력시 한글 밀림 현상 해결 방법

Posted on 2019년 2월 5일 by kimczip

윈도우 프로그램 제작시 텍스트 박스등 입력 컨트롤에 한글을 입력 할 시 포커스가 벗어나면,

한글 밀림현상이 발생하는 경우가 간혹 있다. ( 외국 윈도우컨트롤 라이브러리 사용등.. )

입력 : 가나다라

포커스변경이후 : 라나다가

 

이런 현상을 해결 하기 위해 간단한 솔루션이 있는데,

프로젝트가 있는 경로의 *.csproj 파일을 메모장으로 열어 <PropertyGroup> 하위 노드에 다음  내용을 추가 한 후 저장하면 된다.

<SubsystemVersion>5.01</SubsystemVersion>

 

 

Posted in 3.0Tagged C#, WinFormLeave a comment

C# WinForm UI Design Idea

Posted on 2018년 3월 5일 by kimczip

 

기본 Control로 Flat Style UI

Posted in 3.0Tagged C#, UI, WinFormLeave a comment

C# 병렬 ( Parallel ) 처리 패턴

Posted on 2017년 12월 5일 by kimczip

참조 문서 : MSDN Task Parallelism (Task Parallel Library)

함께 읽어보면 도움 되는 자료 링크 : http://blog.powerumc.kr/175?category=206843

 

개인적으로 멀티 작업 처리를 할 때 자주 쓰는 패턴이다.

모든 상황에 병렬처리가 꼭 좋은 성능을 발휘하는건 아니므로 상황에 따라 적절히 사용하는게 좋다.

using System.Threading.Tasks;
using System.Collections.Concurrent;


Object _lockObject = new Object();

// READ OR WRITE DATA
List<object> _testObject = new List<object>();



.....

// PATTERN
Task task = Task.Factory.StartNew(() =>
{
	int maxWorkingCount = _testObject.Count;
	int workingRangeSize = 1;
	int processedCount = 0;
        // 논리 프로세스 수량 만큼 쓰레드 생성
	if (maxWorkingCount > Environment.ProcessorCount)
	{
	    workingRangeSize = maxWorkingCount / Environment.ProcessorCount;
	}

	var part = Partitioner.Create(0, maxWorkingCount, workingRangeSize);
	Parallel.ForEach(part, (num, state) =>
	{
	   
	    for (int i = num.Item1; i < num.Item2; i++)
	    {
                // 처리하고자 하는 데이터 읽기
                object currentData = _testObject[i];
                // 현재 처리 수량
		processedCount++;
                
                
                // 만약 처리 데이터를 한곳에 모으고 싶다면 lock을 사용
                lock(_lockObject)
                {
                      // 예제      
                      object processedObject = Process(currentData);
                      _testObject.Add(processedObject);
                }                

	    }// END FOR
      
	});
});

// 이 부분은 필요에 따라 작성하던.. 안하던..
try
{
        // 처리가 완료 될때 까지 대기
	task.Wait();

        // 후 처리 영역

}
catch (AggregateException ex)
{
	// 쓰레드 영역 예외
}
catch(Exception ex)
{
       // 후 처리 예외
}

.....

 

 

Posted in 3.0Tagged C#, Parallel, 병렬처리Leave a comment

C# OpenCV Kmeans

Posted on 2017년 12월 3일 by kimczip

K-means algorithm 란?

k-평균 클러스터링 알고리즘은 클러스터링 방법 중 분할법에 속한다. 분할법은 주어진 데이터를 여러 파티션 (그룹) 으로 나누는 방법이다. 예를 들어 n개의 데이터 오브젝트를 입력받았다고 가정하자. 이 때 분할법은 입력 데이터를 n보다 작거나 같은 k개의 그룹으로 나누는데, 이 때 각 군집은 클러스터를 형성하게 된다. 다시 말해, 데이터를 한 개 이상의 데이터 오브젝트로 구성된 k개의 그룹으로 나누는 것이다. 이 때 그룹을 나누는 과정은 거리 기반의 그룹간 비유사도 (dissimilarity) 와 같은 비용 함수 (cost function) 을 최소화하는 방식으로 이루어지며, 이 과정에서 같은 그룹 내 데이터 오브젝트 끼리의 유사도는 증가하고, 다른 그룹에 있는 데이터 오브젝트와의 유사도는 감소하게 된다.[7] k-평균 알고리즘은 각 그룹의 중심 (centroid)과 그룹 내의 데이터 오브젝트와의 거리의 제곱합을 비용 함수로 정하고, 이 함수값을 최소화하는 방향으로 각 데이터 오브젝트의 소속 그룹을 업데이트 해 줌으로써 클러스터링을 수행하게 된다. 출저 : 위키피디아

 

적용 이미지 예시 ( OpenCV 공식 홈페이지 )

이미지 선 성분 검출을 위해서 서전에 이 작업을 거치면 비교적 원하는 결과를 얻을 수 있다.

OpenCVSharp ver 3.2에서는 Kmeans Method를 지원한다.

이 Method의 Parameter의 의미는 여기에서 참조 하길 바란다.

아래는  C#으로 구현된 OpenCVSharp을 활용한 K-means

public static void Kmeans(Mat input, Mat result, int k)
{
    using (Mat points = new Mat())
    {
	using (Mat labels = new Mat())
	{
	    using (Mat centers = new Mat())
	    {
		int width = input.Cols;
		int height = input.Rows;

		points.Create(width * height, 1, MatType.CV_32FC3);
		centers.Create(k, 1, points.Type());
		result.Create(height, width, input.Type());

		int i = 0;
		for (int y = 0; y < height; y++)
		{
		    for (int x = 0; x < width; x++, i++)
		    {
			Vec3f vec3f = new Vec3f
			{
			    Item0 = input.At<Vec3b>(y, x).Item0,
			    Item1 = input.At<Vec3b>(y, x).Item1,
			    Item2 = input.At<Vec3b>(y, x).Item2
			};

			points.Set<Vec3f>(i, vec3f);
		    }
		}

		Cv2.Kmeans(points, k, labels, new TermCriteria(CriteriaType.Eps | CriteriaType.MaxIter, 10, 1.0), 3, KMeansFlags.PpCenters, centers);

		i = 0;
		for (int y = 0; y < height; y++)
		{
		    for (int x = 0; x < width; x++, i++)
		    {
			int idx = labels.Get<int>(i);

			Vec3b vec3b = new Vec3b();


			int tmp = Convert.ToInt32(Math.Round(centers.At<Vec3f>(idx).Item0));
			tmp = tmp > 255 ? 255 : tmp < 0 ? 0 : tmp;
			vec3b.Item0 = Convert.ToByte(tmp);

			tmp = Convert.ToInt32(Math.Round(centers.At<Vec3f>(idx).Item1));
			tmp = tmp > 255 ? 255 : tmp < 0 ? 0 : tmp;
			vec3b.Item1 = Convert.ToByte(tmp);

			tmp = Convert.ToInt32(Math.Round(centers.At<Vec3f>(idx).Item2));
			tmp = tmp > 255 ? 255 : tmp < 0 ? 0 : tmp;
			vec3b.Item2 = Convert.ToByte(tmp);

			result.Set<Vec3b>(y, x, vec3b);

		    }
		}
	    }
	}
    }

}

 

 

 

Posted in 3.0Tagged C#, OpenCV, 개발팁Leave a comment

C# OpenCV (OpenCVSharp) Mat Class To Bitmap

Posted on 2017년 7월 28일 by kimczip
using OpenCvSharp

/* Mat => System.Drawing.Bitmap */
Bitmap bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);

/* System.Drawing.Bitmap => Mat */
Mat mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);

/* Mat => byte[] */
// TYPE 1
byte[] imageBytes = mat.ToBytes(".jpg");
// TYPE 2
byte[] imageBytes;
Cv2.ImEncode(".jpg", mat, out imageBytes);

/* byte[] => Mat */

// TYPE 1 : COLOR
Mat colorMat = Mat.FromImageData(imageBytes, LoadMode.Color);
// TYPE 2 : GRAY
Mat grayMat = Mat.FromImageData(imageBytes, LoadMode.GrayScale);
// TYPE 3
Mat grayMat = Cv2.ImDecode(imageBytes, LoadMode.GrayScale);

 

Posted in 3.0Tagged C#, OpenCV, 개발팁4 Comments

C# OpenCV 3.2 사용하기 (OpenCvSharp)

Posted on 2017년 7월 3일 by kimczip

C#에서 OpenCV를 사용하고자 할 때, Visual Studio가 설치 되어 있다면

도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔 을 실행한다.

패키지 관리자 콘솔창에서 다음과 같이 입력

Install-Package OpenCvSharp3-AnyCPU

그러면 자동으로 설치가 되고, 관련 DLL 파일은 솔루션 디렉토리 내에 packages 폴더에 존재한다.

간단한 예제

using OpenCvSharp;

private void Form1_Load(object sender, EventArgs e)
{
   Mat image = Cv2.ImRead(SAMPLE_IMG, ImreadModes.Color);
   Cv2.NamedWindow("OriginImage", WindowMode.AutoSize);
   Cv2.ImShow("OriginImage", image);
}

 

소스 보기
소스 숨김

만약, 실행 중 오류가 난다면 OpenCV 홈페이지에서 (http://opencv.org/releases.html) WinPack 파일을 다운 받은 후, 압축 해제하고
버전 마다 틀리겠지만 3.2버전 기준으로 opencv\build\x64\vc14\bin 디렉토리에 있는 파일 전체를 복사하여, 현재 개발중인 프로젝트의 Debug폴더에 복사&붙여넣기한 후 실행하면 해결된다.

Posted in 3.0Tagged C#, OpenCVLeave a comment

C# WebException “기본 연결이 닫혔습니다”

Posted on 2017년 5월 25일 by kimczip

WebClient Class든 HttpWebRequest Class든, 간혹 같은 코드로 Web에서 데이터 수신이 잘 되던게
갑자기 안될 경우가 있다.

Exception 메시지는 “기본 연결이 닫혀 있습니다.”
Google검색으로 여러가지 해결법이 있지만, 되는것도 있고 서버에서 설정 변경으로 처리해야만 가능 할 경우가 있다.

아래 코드는 위의 에러가 생길 경우, 서버 설정변경이 어려운 상황이나 같은 URL로 브라우저에서 호출하면 이상은 없는데
유독 위 Class로 자동화 구현시 Exception 걸릴 경우, 꼼수?로 좋은 코드다.

public static string DownloadHTMLPage(string URL)
{
    string pageContent = null;
    try
    {
        HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL);

        httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
        httpWebRequest.Referer = "http://www.google.com/";


        httpWebRequest.Timeout = 10000;
        
        WebResponse response = httpWebRequest.GetResponse();

        Stream webStream = response.GetResponseStream();


        StreamReader streamReader = new StreamReader(webStream);

        pageContent = streamReader.ReadToEnd();

        streamReader.Close();
        webStream.Close();
        response.Close();
    }
    catch (WebException ex)
    {
        Console.WriteLine("HTTP ERROR [{0}] : {1}", URL, ex.ToString());
        return null;
    }

    return pageContent;
}

소스 보기
소스 숨김

Posted in 3.0Tagged C#, Exception, WebLeave a comment

글 내비게이션

이전 글

버전

  • 3.0
  • 4.0

최근에..

  • 실행파일 디지털 서명하기 (프로그램 배포)
  • 자신의 PC에 막혀 있는 포트 검색
  • DB Table Column 이름 가져오기.
  • DLL 파일 PublicKeyToken 얻기
  • DSM 7.0에서 MariaDB 10 설정

Tags

10Gbps AMD Bitspower C# Command Control Corsair Crawling Exception F4-3200C14D-16GFX FLAREX G.Skill git gogs MariaDB MySQL NAS OpenCV Parallel PC-O9 rainmeter Ryzen scimitar Thermaltake UI Web WinForm 개발팁 개인사업자 광명시청 네트워크속도 데이터베이스 라이젠 랜선 랜케이블 리안리 메모리 명령프롬프트 수냉쿨링 수로 시놀로지 직구 커스텀쿨링 컴퓨터 퍼옴
Proudly powered by WordPress | Theme: micro, developed by DevriX.