2월, 2016의 게시물 표시

디스플레이 색 교정 방법 (영상)

이미지
  색 교정의 특성상 영상으로는 차이를 확인할 수 없습니다. 영상에서 설명하는 걸 잘 들으시고 현재 자신의 모니터에 적용하시면 됩니다.

IntelliJ Idea에 JDBC Driver를 추가해도 ClassNotFoundException이 뜰 경우

이미지
  IntelliJ를 어제 설치하고 사용하는 중 SQLite를 쓸 일이 생겨서 SQLite JDBC 드라이버를 다운 받고 라이브러리에 추가한 후 웹 서비스를 시작해봤는데 ClassNotFoundException이 떠서 왜 그런가 찾다가 결국 방법을 알아내서 공유합니다.   해결 방법은 매우 간단합니다. 프로젝트 설정(기본값: Ctrl + Alt + Shift + S)에 들어가셔서 Problems 항목의 sqlite jdbc 드라이버 관련 문제를 Fix해주면 됩니다. 참 쉽죠?

포토샵 UI 크기가 너무 커졌을 때 다시 정상 크기로 줄이는 방법

이미지
  위에 보이는 이미지는 제 회사 컴퓨터에서 포토샵을 켰을 경우 나타나는 화면입니다. 모니터 해상도가 2560x1440임에도 불구하고 UI가 매우 거대해진 탓에 전체적으로 매우 작아보이죠.   이번엔 이렇게 포토샵 UI가 너무 커졌을 경우 다시 줄이는 방법 을 알려드리도록 하겠습니다. 커진 포토샵 UI 크기 줄이는 방법   Ctrl + K 를 눌러 환경 설정에 들어가신 다음 시험적 기능 메뉴에 들어가기거나, 편집 - 환경 설정 - 시험적 기능  메뉴를 순서대로 클릭해 들어가 주세요.   고해상도 디스플레이를 위해 UI 크기 200% 조정 을 선택 해제 하시면 다시 정상적인 UI 크기로 돌아옵니다.

C# 코딩중... TableLayoutPanel의 컨트롤 삭제가 너무 느려서

  여기저기 구글링을 하면서 찾아본 결과 TableLayoutPanel의 자식 컨트롤 삭제 시 속도 저하는 어쩔 수 없다는 듯한 결론을 얻게 됐는데... 이게 맞는지 모르겠네요.   다른 컨트롤에서 하는 것처럼 SuspendLayout 후 해봐도 안 되고... tlpMain.SuspendLayout(); foreach (Control ctrl in tlpMain.Controls) { tlpMain.Controls.Remove(ctrl); } tlpMain.ResumeLayout();   제일 처음 찾은 답변인 RowStyles, ColumnStyles를 모두 제거한 후 해보라는 대로 해봐도 안 되고... tlpMain.SuspendLayout(); tlpMain.RowStyles.Clear(); tlpMain.ColumnStyles.Clear();' foreach (Control ctrl in tlpMain.Controls) { tlpMain.Controls.Remove(ctrl); } tlpMain.ResumeLayout();   결국 제일 확실해 보이지만 끝까지 하기 싫었던, Remove 전 Hide시키고 Remove 후 Show시키는 방법을 써서 해결했습니다. tlpMain.Hide(); //Remove childs... tlpMain.Show();   문젠 이렇게 하면 컨트롤이 깜빡인다는 거죠. tlpMain 상위의 폼은 수시로 업데이트되기 때문에 Suspend시킬 수도 없는 상황. 답답합니다. 혹시 이 글을 보신 개발자 분 중 C#에서 TableLayoutPanel의 자식 컨트롤을 랙 없이 삭제하는, Hide/Show를 제외한 방법을 알고 계신 분이 있다면 알려주시길 바라봅니다.

제네릭 리스트의 클론을 만드는 방법

  C#에서 제네릭 리스트(List )의 클론을 만들려면 아주 간단하게 아래와 같이 LINQ를 사용하시면 됩니다. using System.Linq; using System.Collections.Generic; List original = new List () { "A", "B", "C" }; List clone = original.Select((s) => s);

Windows 10 시작 메뉴의 명령 프롬프트를 PowerShell로 바꾸기

이미지
  작업 표시줄 - 속성 - 탐색 - 체크! 4단계로 끝나는 꿀팁입니다.

BackgroundWorker가 소리없이 죽어버리는 경우

  분명 BackgroundWorker.WorkerSupportsCancellation 속성을 True로 해놓았고, DoWork 핸들러에 BackgroundWorker.CancellationPending이 true일 경우가 아니면 무한 루프를 돌게 해놓았는데 자꾸 루프를 빠져나가는 어떤 신호도 없이 Worker가 죽어버려서 이유를 찾던 중 어이없는 실수를 깨달았습니다.   DoWork 이벤트 핸들러 내부 루프에서 소켓 컬렉션을 가지고 foreach 루프를 한 번 도는데, Disconnected된 Socket을 찾고 해당 Socket을 컬렉션에서 제거하는 작업을 하는 중 접속 해제된 소켓이 감지됐을 경우 Close하는 메서드의 catch문과 DoWorkEventHandler 내부의 catch문이 중복되는 것을 발견했습니다. (ObjectDisposedException)   즉, DoWorkEventHandler의 try 문 안에서 ObjectDisposedException이 발생하는데, 이 때 DoWorkEventHandler 내부의 catch문에서 일단 잡힌 후 빠져나간 다음 바로 CloseSocket 메서드 내부의 catch문으로 진행해버려 DoWorkEventHandler가 그 시점에서 중단돼 버리는 것이었습니다... 세상에.   DoWorkEventHandler에서 ObjectDisposedException이 발생할 건덕지를 없애버리니 정상 작동하는군요.

Ruby 벤치마킹용 Benchmark 클래스

이미지
  루비에 벤치마크 전용 클래스가 있더군요. require 'benchmark'   이렇게 로드한 후 아래처럼 사용하시면 됩니다. n = 1000000000 Benchmark.bm do |x| x.report do for i in 1 .. n do end end x.report do n.times do end end x.report do 1.upto n do end end end   결과는 아래처럼 나옵니다.   더 자세한 사용법은 rubydoc 을 참조하세요.

만약 Collection(컬렉션)에서 Cast, Select, Where 등이 안 보인다면? (C#)

  ControlCollection 등등에서 Linq메소드들 (Select, Any, Where, ...) 및 Cast 혹은 TypeOf가 보이지 않는다면 System.Linq 네임스페이스를 Import하지 않아서 그럴 겁니다. 간단히 한 줄 추가해주세요. using System.Linq;

문자열이 문자열 리스트 중 하나라도 포함하는지 알아내기 C# Linq

기존 방식   기존엔 문자열 A가 문자열 리스트 B의 요소 중 하나라도 포함하는지 알아내려면 다음과 같이 해야 했습니다. public static void Main(string[] args) { string A = "aabacdd"; List B = new List (); B.AddRange(new string[] { "a", "b", "c", "d", "aa", "ba", "cc", "dd" }); bool contain = false; foreach (string e in B) { if (A.IndexOf(e) != -1) { contain = true; break; } } }   겨우 저런 간단한 로직 하나 실행하는데 이렇게 긴 코드가 필요했죠. 하지만 Linq를 사용하면 단 한 줄로 문자열이 다른 문자열 리스트 중 하나라도 포함하는지 검사가 가능합니다. public static void Main(string[] args) { var A = "aabacdd"; var B = new List (); B.AddRange(new string[] { "a", "b", "c", "d", "aa", "ba", "cc", "dd" }); bool contain = B.Any(A.Contains);   bool contain = B.Any(A.Contains);  한 줄. 정말 간단하죠?   간략하게 설명을 드리자면 IEnumerable .Any (Func pr

Control.Name을 기준으로 하위 컨트롤 찾기 (재귀 사용)

동적 컨트롤 생성/수정/삭제   코딩을 하다 보면 동적으로 컨트롤을 생성하고 수정하고 삭제해야 하는 일이 비일비재하게 일어납니다. 그런데, 생성하는 거야 뭐 순서대로 생성하면 된다 치지만 수정과 삭제는 어떻게  해야할까요?   C#에서 모든 컨트롤은 Name 속성 을 가지고 있습니다. Name 속성은 string 형식의 컨트롤의 고유 이름을 저장하는 식별자 역할을 하신다고 보시면 됩니다. 이 Name 속성을 사용해 동적으로 컨트롤을 생성할 때마다 Name을 할당해주면 나중에 수정/삭제시 이를 통해 특정 컨트롤을 손쉽게 찾아 작업할 수 있습니다.   동적으로 컨트롤을 생성하고 Name을 할당하는 것을 보여드리죠. private void CreateControls() { var parent = tlpMain; for (int i = 0; i < 100; i++) { var chk = new CheckBox(); chk.Checked = true; chk.Name = $"chk_{i}"; var tb = new TextBox(); tb.Name = $"tb_{i}"; parent.Controls.Add(chk); parent.Controls.Add(tb); parent.RowCount++; parent.RowStyles.Add(rowStyle); } }   자, 위와 같이 코드를 작성하고 CreateControls 메소들를 호출하면 tlpMain이라는 테이블 레이아웃 패널에 각각 100개의 체크박스와 텍스트박스 페어가 자식 컨트롤로 등록 됩니다. 그리고 각각의 체크박스와 텍스트박스는 "chk_#"과 "tb_#"이라는 Name 속성으로 식별 되죠. Name 속성을 사용해 하위 컨트롤 찾기

비활성화된(Disabled) 컨트롤에 클릭 이벤트 전달받는 방법 C#

비활성화된 컨트롤   C#을 코딩하다 보면 비활성화된 컨트롤(Enabled = false;)에 마치 클릭 이벤트가 적용된 것처럼 코딩해야 하는 때가 있습니다.   그러나 컨트롤의 Enabled 속성이 false로 잡혀있다면 Click을 포함한 모든 이벤트를 받을 수가 없죠.   그러나 예를 들어 초기 폼 로드 시 비활성화 상태였다가, 클릭하면 활성화가 되며 다른 컨트롤과도 연계돼 처리하는 방식의 코딩이 필요할 때가 많습니다. 이럴 땐 비활성화된 컨트롤에 클릭 이벤트를 받는 듯한 처리가 필요한데 어떻게 해야 할까요? 비활성화된 컨트롤에 클릭 이벤트 효과 내기   방법은 간단합니다. 바로 부모 컨트롤의 MouseClick 이벤트를 넘겨받아 MouseEventArgs의 Location을 기초로 부모 컨트롤의 GetChildAtPoint(Point p) 메소드를 호출해 처리하는 방식입니다.   예제를 드리자면 아래와 같겠네요. CtrlParent.MouseClick += new MouseEventHandler((sender, e) => { var arg = e as MouseEventArgs; var pos = arg.Location; var ctrl = CtrlParent.ChildAtPoint(pos) as TextBox; if (ctrl != null) { // Processing... } });   우선 부모 컨트롤인 CtrlParent(여기선 System.Windows.Forms.Panel 타입) 컨트롤의 MouseClick 이벤트에 이벤트 핸들러를 등록합니다. 여기서 중요한 것이 이벤트 핸들러의 내용입니다.   var arg = e as MouseEventArgs; 부분은 생략해주세요. 제가 블로그에 글 쓰는 속도를 단축하기 위해 람다 식으로 핸들러를 작성하느라 생긴 부분입니다.   var pos = arg.Location;  이 부분에서 현재