no image
C# winform 동적으로 탭 추가하기
HTML 삽입 미리보기할 수 없는 소스 폐암 데이터 라벨링 작업을 위한 툴을 개발 중인데, 정답 이미지 레이블링을 진행한 후 그 레이블링에 대한 정보를 여러 개를 입력해야 한다. 이런 식으로 한 라벨링 당 저장해야 하는 정보가 많다는 뜻이다. (동일한 데이터 구조로) 요청을 받은 부분은 임파선 라벨링을 할 때 임파선의 위치 (첫 번째 노란 박스) 와 임파선의 양성, 악성 구분 + 해당 임파선에 대한 스코어(두번째 노란 박스) 를 따로 저장할 수 있게 프로그램을 만들어 달라는 것이었다. C# winform으로 진행을 하고 있었고 저장된 라벨링 정보는 csv에 전부 넣고 있었는데 추가 요청이 들어와서 싹 다 갈아 엎어야 하는 상황이 왔다...... 어차피 암으로 판정되는 부위를 그리고 나면 서브 폼이 떠서 ..
2022.05.09
no image
HTTPS, SSL 인증서
HTTP - Hypertext Transfer Protocol (html을 전송하기 위해서 만들어진 통신 규약) 도메인이나 url을 입력할 때 http:// < 라고 적는 것이 이런 이유임 HTTPS에서 S는 Over Secure Socket Layer의 약자다. 보안 장치가 결합되어 있는 통신 방식임. http에서 데이터를 전송하게 되면 제 3자가 감청하고 조착하거나 털릴 수 있음 그런 것을 방지하기 위한 포괄적인 기술 체계를 https 라고 생각하면 됨 그래서 https를 사용하게 되면 데이터가 암호화 되기 때문에 제 3자가 도청할 수 없게 됨 HTTPS와 SSL의 차이점 같다면 같고 다르다면 다름 SSL 위에서 HTTPS가 돌아감 SSL / TLS (같은 거) 대부분 SSL 이라고 부름 ㅡㅡㅡㅡㅡㅡ..
2022.01.19
no image
[Excel] 다른 행에서 같은 값 찾아서 특정 값 삽입하기
target concept id가 필요한 상황인데 숫자가 깨져 버렸다 다시 매핑해야 하는 상황 DB 였으면 update 문으로 바꿨을 텐데 그럴 수 있는 상황이 아니니 원본 csv에서 처리를 해야 한다 엑셀 찌끄레기는 구글링을 겁나게 하기 시작했다.......... 역시 엑셀은 없는 게 없는 듯 근데 극혐 저거 어떻게 검색해야 하는지 키워드도 몰라서 같은 값 찾아서 변경 동일 행 변경 이딴 거 엄청 치다가 겨우 찾았다 이래서 검색도 능력이라고 하는 거다 어차피 컴활은 필요 없을 것 같아서 안 땄는데 이런 것도 몰라서 구글링 한다는게 기본이라도 좀 해야겠다 초반 같은 상황은 B열과 E 열이 1:1 매칭이라 B와 E가 같으면 A를 D에 넣으면 되니 IF 문으로 같으면 삽입하는 걸로 복붙하면 되겠다 생각했는데..
2022.01.19
DBeaver postgresql 대용량 csv 한글 깨짐 현상
utf-8인 csv를 dbeaver로 적재했을 때 한글이 깨지게 되는 현상이 나타난다 (pgadmin도 마찬가지) 구글에 찾아보면 csv를 메모장으로 열어서 인코딩을 ANSI -> UTF8로 고친 후에 적재하라고 하는데 나는 레코드가 삼천만 개 정도 되어서 메모장에서 열리지 않는다...... csv 분할도 해 보고 다른 인코딩 방법을 찾았는데 원본 파일 바로 한글 깨지지 않게 적재하는 방법 알아냄 인코딩을 EUC_KR로 바꿔서 하면 된다 ㅎ
2021.07.30
no image
npgsql timeoutException
Npgsql.NpgsqlException: 'Exception while reading from stream' TimeoutException: Timeout during reading attempt npgsql timeout during reading attempt DB connection 후 코드 인으로 쿼리를 때려 박고 DataAdapter 에 저장하고 DataSet에 넣어야 하는데 쿼리 돌리는 속도가 오래 걸려서인지 계속 timeout 예외가 떴다 처음에는 서버 문제인 줄 알아서 postgresql을 다시 연결해 준 다음에 실행하니 dataset에 문제없이 해당 데이터가 담겼었다. 그런데 분명히 같은 select 문이었음에도 불구하고 또 같은 에러가 뜨는 것이다........... 왜 됐다가 안 되..
2021.07.29
no image
postgresql-x64-12 - PostgreSQL Server 12 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다
또 말썽이다....... ETL을 배치 프로그램 이용해서 만들고 있었는데 C#에서 쿼리가 dataset으로 안 받아와지고 해당 오류가 뜨길래 Npgsql.NpgsqlException: 'Exception while reading from stream' TimeoutException: Timeout during reading attempt npgsql timeout during reading attempt 무엇인가 하니 forums.servicestack.net/t/postgresql-timeout/6289 해당 주소를 참고하여 서버 문제인 것을 알았다 같이 일하시는 분이 공유기 아이피를 바꿔버림 아 ㅋㅋ 1. 윈도우 + R services.msc 처음에는 postgresql-x64 눌렀을 때 서비스 시작..
2021.07.29
DBeaver 실행 시 오류 log error
dbeaver로 postgresql 작업을 하다가 갑자기 에러창이 뜨면서 log 파일을 확인하라는 메세지가 떴다. ide 켜지지도 않고 이유 찾아보다가 포기하고 이틀 정도 그냥 pgadmin으로 작업한 듯...... 이대로는 안 되겠다 싶어서 구글링으로 다시 찾아보니까 겨우 찾았다 근데 별문제 아니었음 dbeaver를 실행시키면 이런 경고창이 뜨고 꺼진다 See the log file C:/Users/user/AppData/Roaming/DBeaverData/workspace6/.metadata/.log" 해당 경로에 가서 log 파일을 확인해 보면 Caused by: java.lang.Exception: 호환되지 않는 파일 형식입니다. 작업공간이 호환되지 않는 0 버전으로 저장되었습니다. at org...
2021.07.28
no image
05-1 MSSQL - ASP.NET CORE 연동
local 접속 후 데이터베이스 계정 로그인 안 될 때 -> hannom.tistory.com/195 참고 using System.Data.SqlClient; using System.Data; // using 등록해야 할 것들 public IActionResult TicketList() { var dt = new DataTable(); // 다른 곳에서 참조가 되면 남아 있을 수 있기 때문에 명시적으로 코딩 하는 게 좋음 (using) using (var conn = new SqlConnection("Server=DESKTOP-2H5KO6N\\SQLEXPRESS;Database = myweb;User ID = sa;password = sa1234")) { conn.Open(); #region [sql 구..
2021.03.05

폐암 데이터 라벨링 작업을 위한 툴을 개발 중인데, 정답 이미지 레이블링을 진행한 후 그 레이블링에 대한 정보를 여러 개를 입력해야 한다. 

 

이런 식으로 한 라벨링 당 저장해야 하는 정보가 많다는 뜻이다. (동일한 데이터 구조로) 

요청을 받은 부분은 임파선 라벨링을 할 때 임파선의 위치 (첫 번째 노란 박스) 와 임파선의 양성, 악성 구분 + 해당 임파선에 대한 스코어(두번째 노란 박스) 를 따로 저장할 수 있게 프로그램을 만들어 달라는 것이었다. 

 

C# winform으로 진행을 하고 있었고 저장된 라벨링 정보는 csv에 전부 넣고 있었는데 추가 요청이 들어와서 싹 다 갈아 엎어야 하는 상황이 왔다...... 

 

어차피 암으로 판정되는 부위를 그리고 나면 서브 폼이 떠서 그 라벨링에 대한 정보를 저장해 놓을 수 있게 했기 때문에 서브폼에 탭을 동적으로 만들어 추가를 해야 하면 추가하는 식으로 개발하기로 했다. 

너무 애매했던 게 저렇게 라벨링 부위를 노란색으로 색칠을 해도 저 부위가 위치가 3R일 수도 있고 4R일 수도 있고, 위치가 5일 수도 있고 6일 수도 있다는 거다. 그러니까 정확한 위치 판별이 되지 않는다는 뜻이다. 그리고 추가하는 데이터가 최대 몇 개까지 나올 수 있는지도 정확하지 않다. 정확하지 않은 데이터를 정형적으로 만들려고 하니 하...... 하지만 개발로는 안 되는 게 없다. 다시 정신 잡고 프로그램 프로세스를 생각해 보자 ㅋㅋ 

 

결국 탭을 만들어 추가 버튼을 누르면 무한으로 만들 수 있게 구축했다. 

스택오버플로나 다른 블로그 검색해도 for문으로 탭 여러개 만들기 이런 것밖에 안 뜨던데 어디서 하나 찾아서 코딩했던 것 같다...... 

탭 안의 폼 내용은 사용자 컨트롤을 만들어 넣었다. 

 

 

탭 추가를 하면 동적으로 탭이 생성된다. 

    // 탭 추가 버튼 이벤트
    private void btnAddTab_Click(object sender, EventArgs e)
    {
    	// 추가할 TabPage 선언
        TabPage nodeTab = null;
        
        // TabPage 안에 들어갈 내용 
        // 사용자 컨트롤을 만들어서 넣었기 때문에 사용자 컨트롤도 선언해 준다 
        AddNodeControl nodeControl = new AddNodeControl();
		
        
        // TabPage 위에 텍스트를 추가해 주고 싶으면 new TabPage("text"); 로 작성해도 됨
        nodeTab = new TabPage(); 
        // TabPage 안에 사용자 컨트롤 넣기 
        nodeTab.Controls.Add(nodeControl);
        // 나는 탭 제목들을 추가할 때마다 1 2 3 4 5 로 만들어 주기 위해서 이렇게 했다
        nodeTab.Text = (tabNode.SelectedIndex + 2).ToString();
        nodeTab.UseVisualStyleBackColor = true;
        // 전체 탭컨트롤의 이름이 tabNode임. 
        // tabNode에 탭 페이지를 추가할 것이다 <- nodeTab을
        tabNode.TabPages.Add(nodeTab);
		
        // 이 부분을 작성하지 않으면 추가한 탭 페이지로 포커스 되지 않고 첫 번째 탭으로 포커스가 됨. 
        // 추가한 페이지로 포커스 하고 싶으면 이 구문 쓰면 된다 
        tabNode.SelectedTab = nodeTab;
    }

 

탭 제거 버튼

private void btnRemoveTab_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show(string.Format("{0}번 탭을 삭제하시겠습니까?"
            	, (tabNode.SelectedIndex + 1).ToString()), "삭제"
                , MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
            	// 탭 삭제
                tabNode.TabPages.Remove(tabNode.SelectedTab);
            }
            else
            {
                return;
            }
        }

 

winform에서 버튼 클릭으로 탭 추가하는 방법에 대해서 알아 보았다. 

'Develop > C#' 카테고리의 다른 글

DataTable에서 해당하는 값 찾기  (0) 2022.05.18
npgsql timeoutException  (1) 2021.07.29

 

HTTP - Hypertext Transfer Protocol (html을 전송하기 위해서 만들어진 통신 규약)

도메인이나 url을 입력할 때 http:// < 라고 적는 것이 이런 이유임

 

HTTPS에서 S는 Over Secure Socket Layer의 약자다. 보안 장치가 결합되어 있는 통신 방식임. 

 

http에서 데이터를 전송하게 되면 제 3자가 감청하고 조착하거나 털릴 수 있음

그런 것을 방지하기 위한 포괄적인 기술 체계를 https 라고 생각하면 됨 

 

그래서 https를 사용하게 되면  데이터가 암호화 되기 때문에 제 3자가 도청할 수 없게 됨

 

HTTPS와 SSL의 차이점 

 

같다면 같고 다르다면 다름 

SSL 위에서 HTTPS가 돌아감 

 

 

SSL / TLS (같은 거) 대부분 SSL 이라고 부름 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

SSL 디지털 인증서 

 클라이언트와 서버간의 통신을 제3자가 보증해 주는 전자화된 문서 

 

  • 통신 내용이 공격자에게 노출되는 것을 막을 수 있다 

        -> 암호화가 필요 

  

대칭키 openssl 이라는 소프트웨어를 이용해서 암호를 복호화, 암호화 함 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

target concept id가 필요한 상황인데 숫자가 깨져 버렸다 다시 매핑해야 하는 상황 

DB 였으면 update 문으로 바꿨을 텐데 그럴 수 있는 상황이 아니니 원본 csv에서 처리를 해야 한다 

 

엑셀 찌끄레기는 구글링을 겁나게 하기 시작했다.......... 역시 엑셀은 없는 게 없는 듯 근데 극혐 

저거 어떻게 검색해야 하는지 키워드도 몰라서 같은 값 찾아서 변경 동일 행 변경 이딴 거 엄청 치다가 겨우 찾았다 이래서 검색도 능력이라고 하는 거다 

 

어차피 컴활은 필요 없을 것 같아서 안 땄는데 이런 것도 몰라서 구글링 한다는게 기본이라도 좀 해야겠다 

 

초반 같은 상황은 B열과 E 열이 1:1 매칭이라 B와 E가 같으면 A를 D에 넣으면 되니 IF 문으로 같으면 삽입하는 걸로 복붙하면 되겠다 생각했는데 밑부분으로 가니 E열에 같은 코드들이 몇 개 있었다 < 그래서 기존 수식은 사용 불가 

 

 

본론부터 말하면 구글링으로 찾아보니 방법이 있다. https://bamdule.tistory.com/50 감사합니다 

 

완성띠 오른쪽 하단 십자가 눌러서 밑으로 주르륵 내려 주면 끝이다 

간단한 작업할 땐 디비보다는 엑셀이 편하지 ㅇㅇ 

 

= INDEX(A:A, MATCH(E2, B:B, 0), 1)

 "A열을 복사할 값으로 지정하고, E2열과 B 전체 열의 범위를 비교해서 같으면 해당 컬럼에 A 값을 넣어라" 라는 뜻이다

 

부가 설명 

 INDEX & MATCH 라는 함수가 있다 

 비교 열이랑 비교 열 범위라고 하니까 좀 헷갈려서 나는 내 데이터 특성 상 그냥 key - value 라고 이해했다.

왼쪽이 원본 key-value, 오른쪽이 내가 바꾸고 싶은 key-value => value를 비교해서 동일하다면 원본 key를 복사한다. 

=INDEX(바꿔줄 값, MATCH(비교 열(바꿔지는 값의 key), 비교 열 범위(원본 value), 0),1)

 

 

utf-8인 csv를 dbeaver로 적재했을 때 한글이 깨지게 되는 현상이 나타난다 (pgadmin도 마찬가지) 

 

구글에 찾아보면 csv를 메모장으로 열어서 인코딩을 ANSI -> UTF8로 고친 후에 적재하라고 하는데 나는 레코드가 삼천만 개 정도 되어서 메모장에서 열리지 않는다...... 

 

csv 분할도 해 보고 다른 인코딩 방법을 찾았는데 원본 파일 바로 한글 깨지지 않게 적재하는 방법 알아냄 

인코딩을 EUC_KR로 바꿔서 하면 된다 ㅎ 

Npgsql.NpgsqlException: 'Exception while reading from stream'

TimeoutException: Timeout during reading attempt

npgsql timeout during reading attempt

 

 

DB connection 후 

코드 인으로 쿼리를 때려 박고 DataAdapter 에 저장하고 DataSet에 넣어야 하는데 쿼리 돌리는 속도가 오래 걸려서인지 계속 timeout 예외가 떴다 

 

처음에는 서버 문제인 줄 알아서 postgresql을 다시 연결해 준 다음에 실행하니 dataset에 문제없이 해당 데이터가 담겼었다. 그런데 분명히 같은 select 문이었음에도 불구하고 또 같은 에러가 뜨는 것이다........... 왜 됐다가 안 되는지는 잘 모르겠지만 아마 메모리 누수 때문일 수도 있고 리소스 많이 잡아 먹어서 그럴 수도 있다. 

 아무튼 서버 문제도 아니니 해결 방법은 시간을 늘려주는 것이니 connection 부분에서 시간을 늘려 주었다. 

 

Timeout, CommandTimeout 을 각각 넣어주면 정상적으로 실행이 된다 

 

짜면서도 너무 비효율적이라 짜증나는데 개선 방법에 대해서 좀 생각해 봐야겠다......

 

'Develop > C#' 카테고리의 다른 글

DataTable에서 해당하는 값 찾기  (0) 2022.05.18
C# winform 동적으로 탭 추가하기  (0) 2022.05.09

또 말썽이다....... 

ETL을 배치 프로그램 이용해서 만들고 있었는데 C#에서 쿼리가 dataset으로 안 받아와지고 해당 오류가 뜨길래  

Npgsql.NpgsqlException: 'Exception while reading from stream'

TimeoutException: Timeout during reading attempt

npgsql timeout during reading attempt

 

무엇인가 하니 forums.servicestack.net/t/postgresql-timeout/6289 해당 주소를 참고하여 서버 문제인 것을 알았다 

같이 일하시는 분이 공유기 아이피를 바꿔버림 아 ㅋㅋ 

 

 

1. 윈도우 + R services.msc

처음에는 postgresql-x64 눌렀을 때 서비스 시작밖에 안 떠 있었다

서비스 시작을 계속 눌러줘도 다음과 같은 에러창이 뜨는데 이 단계로 오지 않았다면 서비스 중지 후 다시 시작을 눌러주면 해결이 될 것 같다

첫 번째 방법 해결 X 

 

2. 작업관리자 - 서비스 탭 - postgresql 찾기 

 시작 눌러 주면 상태가 시작 중으로 바뀌면서 정상 작동이 된다....... 

 

3. 그래도 안 될 때 

~PATH\PostgreSQL\12\data  data 폴더에 postmaster.pid 를 삭제하고 1, 2 번 진행 

dbeaver로 postgresql 작업을 하다가 갑자기 에러창이 뜨면서 log 파일을 확인하라는 메세지가 떴다. 

ide 켜지지도 않고 이유 찾아보다가 포기하고 이틀 정도 그냥 pgadmin으로 작업한 듯......

 

이대로는 안 되겠다 싶어서 구글링으로 다시 찾아보니까 겨우 찾았다 근데 별문제 아니었음 

 

dbeaver를 실행시키면 이런 경고창이 뜨고 꺼진다 

See the log file C:/Users/user/AppData/Roaming/DBeaverData/workspace6/.metadata/.log"

 

해당 경로에 가서 log 파일을 확인해 보면 

Caused by: java.lang.Exception: 호환되지 않는 파일 형식입니다.  작업공간이 호환되지 않는 0 버전으로 저장되었습니다.
at org.eclipse.core.internal.resources.ResourceException.provideStackTrace(ResourceException.java:42)
at org.eclipse.core.internal.resources.ResourceException.<init>(ResourceException.java:38)
... 50 more

등이 나오는데 해결 방법은 간단하다

 

1. 

%HOMEPATH%/.dbeaver/.metadata/.plugins/org.eclipse.core.resources /.snap 

를 찾아서 .snap 삭제 

 

2. .snap이 없는 경우 

 - org.eclipse.core.resources  폴더 삭제 

 

3. 1, 2 번을 해도 안 될 때 

 - .metadata 삭제 

3번은 삭제 시 dbeaver 데이터 소스 연결 스크립트나 일부 구성이 삭제될 수 있음을 유의 

 

보통 2번까지 하면 정상적으로 dbeaver가 뜬다

 

 

 

 

mssql 테이블 생성

 

local 접속 후 데이터베이스 계정 로그인 안 될 때 

-> hannom.tistory.com/195 참고 

using System.Data.SqlClient;
using System.Data;
// using 등록해야 할 것들 


public IActionResult TicketList()
        {
            var dt = new DataTable();

            // 다른 곳에서 참조가 되면 남아 있을 수 있기 때문에 명시적으로 코딩 하는 게 좋음 (using)
            using (var conn = new SqlConnection("Server=DESKTOP-2H5KO6N\\SQLEXPRESS;Database = myweb;User ID = sa;password = sa1234"))
            {
                conn.Open();

                #region [sql 구문 작성법]
                /*
                 * string sta = "ddd"
                 WHERE 구문에서 a.status = sta + '%' 이런 식으로 쓰면 안 되는 이유 
                -> 사용자가 악의적으로 sta 변수에 OR '1' = '1' 같은 변수를 넣었을 경우 select 문으로 테이블의 모든 값을 조회할 수 
                있기 때문에 보안상으로도 올바르지 않음 (sql 해킹법으로 많이 쓰인다) 
                 */
                #endregion

                using (var cmd = new SqlCommand())
                {
                    string status = "In Progress";
                    cmd.Connection = conn;
                    cmd.CommandText = @"
                                        SELECT
	                                        A.ticket_id
	                                        ,A.title
	                                        ,A.status
                                        FROM 
	                                        t_ticket A
                                        WHERE 
	                                        A.status = @status 
                                        ";

                    cmd.Parameters.AddWithValue("@status", status);

                    var reader = cmd.ExecuteReader(); // READ 부분 select~ 
                    dt.Load(reader);
                    
                    //cmd.ExecuteNonQuery(); // CURD 처리 부분 (insert, update, delete) int 값 반환
                }
            }
            ViewData["Dt"] = dt;

            return View();
        }

- HomeController.cs

DB 연동 방법 다양함. appsettings.json에서 바로 연동해 주는 방법이 있고, 해당 페이지에서만 연동해 주는 방법이 있는데

해당 페이지에서만 연동하는 방법으로 HomeController에서 ticketList 페이지에서만 ticket 테이블 조회할 수 있도록 연동

 

 

@{ 
    var dt = ViewData["dt"] as System.Data.DataTable;
}

-- 해당하는 html의 cshtml 위에 데이터 테이블 전달 

  <tbody>
    @foreach(System.Data.DataRow row in dt.Rows)
    {
      <tr>
        <td>@row["status"]</td>
        <td>@row["title"]</td>
        <td>@row["ticket_id"]</td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
    }
</tbody>

Ticket.cshtml 

-> 데이터를 표시할 부분에 전달 

 

기본적인 데이터 구조는 이렇게 흘러감

MVC의 Model을 사용해서 쓰는 방법 필요

'Develop > ASP.NET CORE' 카테고리의 다른 글

05 - Database 연동  (0) 2021.03.04
04 - Layout 구성  (0) 2021.03.04
03 - 데이터 전달  (0) 2021.03.03
02 - MVC 프로젝트 생성  (0) 2021.03.03
01 - ASP.NET CORE 시작하기  (0) 2021.03.03