12월, 2019의 게시물 표시

2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

[C#] LINQ로 3개의 테이블을 JOIN한 후 DataGridView에 표시하는 방법

엄청 간단하구나..ㅎㅎ SQL문을 몰라도 논리적으로 기술하면 바로 돌아간다. LINQ도 메소드식과 쿼리식이 있는데, 쿼리식이 좀 더 간결하고 보기 쉬운듯. 워낙 직관적이라 그냥 소스만 붙여놔도 알 듯. // 3개의 테이블을 Join한 후, 필요한 필드만 추출해서 필드명을 지정한 후 Datagridview에 표시      using  ( var   model  =  new   FourTypesModel ())     {          var   query  =  from   u   in   model . users                      join   r   in   model . results   o n u.id equals r.userid                      join   t   in   model . types   on   r . typeid   equals   t . id          ...

[C#] 간단한 로그인 기능 만들기 with 폼에서 다른 폼으로 객체를 전달

이미지
C#에서는 어떻게 로그인 기능을 구현해야 하나.. 웹에서는 세션을 사용하면 서비스 전체 전역변수 처럼 사용이 되는데 C#은 그런 개념을 잘 모르겠다..그래서 현재 시험하는 방법은 로그인 시 사용자 객체를 생성한 후, 로그인이 성공하면 그 객체를 다른 폼으로 전달하는 방법이다. 문제는 이렇게 되면 페이지마다 객체를 전달하고 확인하는 과정과, 그 객체를 잘 관리해서 메모리 누수가 생기지 않게 해야하는데...우선 만들고 보자 ㅋㅋ 먼저, 정리를 하자면 다음과 같은 3개의 파일을 만든다. login_form.cs : 로그인 폼, 로그인 버튼을 클릭하면 로그인 처리를 함. main_form.cs : 메인 폼, 로그인이 성공하면 표시되어 객체정보를 표시함. MEMBER.cs : 멤버객체 생성 및 값을 가지고 있음, 로그인과 로그아웃 처리함. 특히, MEMBER.cs 가 중요한데, 자동으로 관리되지 않는 사용자 객체를 만들 것이기 때문에 수동으로 객체를 생성하고 소멸시켜야만 한다. 생성이야 문제가 안되지만 소멸은 어쩌지?? 하고 찾아봤는데.. 결과적으로는 클래스에 IDisposable 인터페이스를 상속받은 후, Dispose 메소드를 오버로딩해서 기술하면 된다는 듯 싶다. 이 때, dispose 상태인지 아닌지 판별하는 변수를 하나 만들어준다. [참조] [C#]イマイチ分かりにくいIDisposableの実装方法をまとめる。 폼에서 값을 주고받을 땐 이런저런 방법이 있지만, 기본적으로는 바로 던질 수 없는 듯 싶다. 객체지향적인 방법을 유지하면서 값을 전달하고 받으려면, get과 set 프로퍼티를 수동으로 정의한 후 객체를 생성한 뒤에 프로퍼티에 값을 넘기면 자동으로 처리해준다는. [참조] C# 폼간 데이터 전송 : Properties(속성) get, set (완벽한 정리) 여러가지 문제는 있겠지만 일단~돌아가게끔 만들기는 했으니 정리해둠. [login_form.cs] namespace   F...

[메모] LINQ 로 간단한 JOIN (LEFT-INNER-JOIN) 하기

정말 너무나 취약한 분야 데이터베이스 ㅋㅋ 하면 까먹고 보면 잊어버리고 이건 뭐 ㅋㅋㅋㅋ 여하턴 LINQ를 이용해서 두 테이블을 하나로 합치는 걸 해봤다. 여기서는 내부결합만 했고 외부결합은 다음 링크를 참조해보자. [참조] LINQでの内部結合・外部結合 여기서는 users 테이블에서 id, 이름, 성별, 연령 항목값과 typeresult 테이블에서 점수 항목값을 가져와서 JOIN 한 테이블을 만든 후, 이용자 개체에 값을 할당했다. // 타겟이 되는 이용자id를 사용해서 두 테이블을 내부결합 하는 코드 with LINQ // 참고:qiita.com/H-Takayama/items/0e0a962f9ebc59547e4d // 다른 코드는 생략      var   query  =  model . users . Join (              //결합 할 테이블명              model . typeresults ,              //결합 하는 쪽의 결합조건              typeresults  =>  typeresults . id ,       ...

[C#] Error Provider를 이용한 입력폼 체크 및 에러출력 (Feat. 정규표현식)

이미지
e아이디나 패스워드 등, 이용자로부터 값을 입력받은 경우에 그걸 체크해야 하는 경우가 많이 있다. 예를 들어 공백금지라던가, 문자 수 제한을 한다거나, 영문자와 숫자만 입력가능 하다거나..등등. 웹개발에서는 프레임워크에 포함된 라이브러리를 사용했는데 C#에서는 검증코드를 만들어야 하나보다. 물론 에러메세지를 표시해도 되는데, 가능하면 폼 옆에 에러 아이콘을 표시하고 제대로 된 입력값이 아니면 다른 폼을 입력하지 못하게 하려면 Error Provider를 사용하면 된다더라. 그래서 해봤던 내용을 정리한다. [메모] Error Provider 는 하나만 추가해도 되나, 각 폼의 검증코드는 따로 작성할 것. 작성한 검증코드는 이벤트 속성에 추가하지 않으면 작동 안 한다. 문자 수 제한은 폼의 속성에서 Max Length 에 값을 줘도 된다.  영문자 (대/소문자) 나 숫자&특수문자 등, 입력값의 세부적인 조건을 정의할 때는 정규표현식을 사용한다. 변수에 정규표현식을 정의한 후, IsMatch 메소드를 사용하면 정규식과 일치하는지 판정할 수 있다. [순서] 폼을 디자인 하고 이름을 부여한다. 툴박스에서 Error Provider 를 Drag and Drop으로 폼에 추가한다. 폼을 검증하는 메소드를 작성한다. 에러를 표시해야 하는 경우에 SetError() 를 정의한다. 에러가 없는 경우 혹은 폼을 초기화 할 땐 SetError() 에 null 을 정의해 줄 것. 에러가 발생한 경우, e.Cancel 에 true를 설정해서 이후의 이벤트를 정지시킴. 폼을 선택한 후, 설정->이벤트->포커스->Validating 에 작성한 메소드를 설정한다. (필요에 따라서는 다른 이벤트에 설정해도 ㅇㅋ) [소스코드] // 에러컴포넌트 쓰기 위해서 필요 using   System . ComponentModel ; // 정규표현식을...

[메모] Entity Framework 를 이용한 데이터조작

Npgsql과 Entity Framework를 설치한 후, using으로 데이터 관련 라이브러리를 추가한 후, 아래와 같이 사용할 수 있음. 기본적으로는 DbContext 모델을 만든 후, 그 모델에 접근해서 데이터를 조작한다. 여기서는 effects 라는 테이블에 id (pk), effectname (char) 라는 두 개의 컬럼이 있다고 가정하고, 기본적인 CRUD 를 해 봤다. LINQ는 좀 더 공부를 해야할 듯. 자주 쓰면 익숙해지겠지..?? <참고> はじめての LINQ Entity Framework 記事の一覧(iPentec.com) using   System ; using   System . Data ; using   System . Linq ; using   System . Data . SqlClient ; using   System . Data . Entity ; using   Npgsql ; namespace   NpgsqlEF6TestApp {      public   partial   class   Form1  :  Form     {          public   Form1 ()         {              InitializeComponent ();              using  ( var ...

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

PostgreSQL에서 Entity Framework를 사용해서 DB조작할 때 에러에 대한 메모. id컬럼을 Serial형(Auto Increasing)으로 만든 테이블에 id 값을 생략한 형식으로 INSERT를 하려고 했더니 다음과 같은 에러가 났다. ERROR: 重複キーが一意性制約" table_pkey "に違反しています。 ERROR: duplicate key value violates unique constraint "table_pkey" 초기화 SQL 스크립트로 데이터만 집어넣은 컬럼이라 치가 중복이 된 건 아니고, 왜 이런 에러가 나는지 감이 안잡혔는데 다음 링크에서 해답을 얻었다. PostgreSQLでINSERT時に自動採番の主キーが重複してエラーが出る場合の対処法 요약을 하자면, PostgreSQL에서는 자동으로 증가하는 번호를 시퀀스 오브젝트를 사용하여 내부적으로 관리하는데 이걸 수동으로 변경하거나 데이터를 외부에서 삽입 혹은 복사하게 되면 실제 컬럼에 들어간 값과 시퀀스 오브젝트의 값이 달라지게 되어서 문제가 생기는 경우가 있다. 내 경우에는 스크립트로 SQL 을 직접 입력해서 값을 삽입한 것이 문제가 된 듯. 이것을 확인하고 수정하는 건 다음의 3단계를 거친다. 실제 테이블 컬럼값의 최대치를 확인 >> SELECT MAX(id) FROM table; 시퀀스 오브젝트 값 확인 >> SELECT nextval('table_id_seq'); 두 값이 일치하면 문제가 없음. 두 값이 불일치하는 경우, 시퀀스 오브젝트 값을 테이블 컬럼값으로 변경해준다. >> SELECT setval('table_id_seq', (SELECT MAX(id) FROM table));

[메모] git 하고 github 설치

버전관리 및 소스코드 관리 학습을 위해서 설치를 해 봤다. 하도 귀아프게 들어서 언젠가는..이라고 생각만 했지 실제 개발쪽 일을 많이 안 했고 사용해도 SVN만 적당히 사용해 와서 필요성도 못느꼈다. 그래도 이왕 맘먹고 공부를 하는김에 개인적인 개발관련 프로젝트는 적용을 해보자 싶었음. 설치방법은 간단함. 나는 맥을 사용중이니 Mac OS X 환경을 전제로 설명함. 터미널을 열어서 git 이 설치되어 있는지 확인한다. >> git --version https://git-scm.com/  에 접속해서 화면 오른쪽에 있는 다운로드 버튼을 눌러서 dmg 파일을 다운로드 받아서 실행한다. (혹은 터미널에서 brew install git 이라고 입력해도 ㅇㅋ)  재부팅 후 터미널에서 1번 과정을 반복해서 설치가 완료되었는지 확인한다. 사용자 홈 디렉토리에 폴더를 하나 만든다. (터미널에서는 mkdir 커멘트 사용)  터미널에서 만든 폴더에 접근하여 다음과 같이 입력 후 ls -all 명령어로 .git 디렉토리가 생성되었는지 확인한다. >> git init https://github.com/  에 접속해서 계정을 생성한다. 생성된 계정을 메일인증 한 후에, 화면 왼쪽상단에 있는 new (+모양) 버튼을 클릭 후,  new repository 를 선택한다. Create a new repository 화면이 나오는데,  Repository name (필수, gitTest로 설정) 과 설명 및 옵션등을 입력한 후 Create Repository 버튼을 누른다.  Quick setup 이라는 설명이 나오는데, 여러가지 방법이 되나보다..그 중에서 나는 가장 원시적인 방법을 택했는데, [..or create a new repository on the command line] 이었다. 터미널로 가서 그대로 타이핑을 했다. >> echo "@ gitTiest" ...

[메모] 시스템 설계의 흐름 및 설계서 구성 관련

프로그래밍 개발 및 IT관련 프로젝트에서 워터폴(폭포수) 모델의 상류공정을 기준으로 설계의 흐름 및 산출물에 대한 정리임. (한국어와 일본어 용어의 번역이 부자연스러울수도??) 참고는  @chocode - システム設計の流れ・設計書の構成メモ 상류공정은 크게 <요구(요건)정의>👉<외부설계>👉<내부설계> 순으로 진행됨. [요구정의] 개발하는 시스템 및 서비스에 요구되는 기능 및 조건을 정리하는 단계. 예를 들면, 다음과 같은 것들이다. 패스워드 인증을 포함한 회원관리 기능 데이터베이스 내부의 자료를 검색 입력자료 및 출력자료의 사양 업무 플로우 처리속도 및 처리용량, 유지보수성, 조작성 등의 비기능적인 요구사항 RFP(제안의뢰서) 작성 및 사전조사를 통해서 실제로 필요한 요건을 정리해 나간다. 이 과정에서 정리된 내용에 기반해서 개발을 진행하게 되므로 제대로 요건을 정의해두면 누락 및 중복을 피할 수 있다. 요구정의를 할 때는 필수적으로 고려해야 하며 확실하게 보증을 해야하는 항목이 중심이 되어야 하며, 인터페이스 디자인 등 개발업체 쪽에서 결정해도 문제가 되지 않는 부분은 외부설계 단계에서 취급한다. 이 단계에서 만들게 되는 산출물은 요구정의서 혹은 요건정의서 라고 한다. 여러가지 양식이나 내용이 있지만 최소한 명시되어야 하는 항목은 다음과 같다. 시스템 개요 무엇을 하는 시스템인가?? 왜 이 시스템이 필요한가?? 이 시스템의 목표는 무엇인가?? 시스템 구성도 시스템 개념도 시스템의 업무 플로우 혹은 시나리오 유스케이스 다이어그램 기능요건(요구) 기능일람 각 기능의 상세설명 입력 및 출력요건 입력데이터 일람 각 입력데이터의 상세(데이터항목, 파일형식 등) 출력데이터 일람 각 출력데이터의 상세(데이터항목, 출력형식 등) 비기능요건 세큐리티 요구사항 품질 및 성능 요구사항 그 외 개발 스케쥴 관계자 일람 혹은 관...

[메모] 시간표 출력 프로그램 복습하며 느낀 점

작년에 중간까지 만들다가 중단(다른 일 하게 된 것도 있지만 반쯤은 실력부족으로 인한 포기에 가깝지 않았나) 했던 시간표 출력 프로그램을 다른 개발자가 완성한 소스코드를 보고 느낀점 및 팁을 메모함. 필요한 상수를 const 정의함, 그때그때 변수로 쓰는게 아니라 공통적으로 쓰는 값은 상수로 미리 정의한 후, 클래스 전체에서 사용하게 함. -> 나는 보통 클래스 내부에서 변수로 만들고 그것만 사용하고 말거나 혹은 그 값을 파라메터로 넘기거나 하는데 확실히 이런 부분에서 경험부족이 나오는 듯.. MVC패턴에서 View에 값을 보내는 부분과 처리하는 부분을 확실하게 나눌 것. CakePHP에서 Controller와 View(Template) 사이에서 데이터를 전송하는 경우, 기본적인 Class에서는 View에 표시할 데이터만 처리하고 실제적으로 처리를 하는 부분은 별도의 Class를 만들어서 호출하는 형식으로 개발함. 특히 Ajax를 사용해서 값을 전달하고 받아서 처리하는 경우, request의 is메소드로 ajax임을 확인한 후, 처리하는 별도의 함수를 만들어서 호출함. 나 같은 경우에는 기본 Class에 모든 처리를 다 때려넣으려는 경향이 있었고, 그게 Phpspreadsheet 플러그인과 CakePhp 사이에서 충돌이 났던 원인 중 하나이지 않았을까, 라는 생각이 듦. public function sheet_output() {      if ($this->request->is('ajax')){           $this->_roomsheetAjax(); // ファイル出力してAJAXで返す処理      return;      } } public function _roomsheetAjax() {      $this->autoRender = false;     ...