모든다해 IP66 금속 검출기
해당 기기를 사용하는 업체는 밝힐 수 없지만 해당 금속검출기에서 TCP 통신으로 양품, 불량 수자를 가져오도록 작업을 하였습니다.
Keithley TCP 통신
장비에 따라서 1회성이 있고, 스트링으로 가져오는 장비가 있었음. 명령어는 전압 전류를 가져오도록 설정 측정 장비여서 설정값이 없음 일부 장비는 설정값이 있음
회사 동일 다수 DB 관리
DB 가 분리되어 있지만 모두 동일한 DB 일 경우에 컬럼을 동일하게 변경하기 위해서 필요함.먼저 대상이 되는 DB를 수집후 테이블 명을 보고 컬럼을 변경을 할수 있습니다. 각 DB에서 테이블 정보를 수집도 가능합니다. 테이블을 추가 할 경우 다수의 DB에서 동일한 작업이 필요할 경우에 추가를 진행하면은 동시에 다수를 작업을 합니다. 테이블을 한곳에 만들어 두거나 혹은 특정 DB에서 필요한 테이블을 복사 혹은 삭제 처리 할수 있습니다. 테이블 내의 컬럼을 추가 하거나 삭제 변경 할수 있습니다. 컬럼의 형식이나 값을 변경할 경우에 나오는 화면입니다. 테이블에 컬럼을 추가 할 경우에 입력 하는 화면 입니다. 데이터를 볼때 정렬이 필요하면은 정렬 기능을 이용해서 정렬을 해서 전체 테이블에 동일 컬럼이나 값이 일치 하지 않는 것을 확인할때 필요합니다. DB 명세서를 만들때 엑셀 파일로 출력이 가능 합니다. 실제 엑셀로 출력 할 때 테스트나 불필요한 테이블을 제외 하고 저장 할 수 있도록 설정을…
WebServer에서 사용률 체크하기
홈페이지를 만들고 나서 사용률이 저조하면은 상당히 힘이 빠지는 일입니다. 더욱이 정부에서 사용을 하라고 하는데 제작을 할때는 사람들이 요구사항이 상당히 많이 발생하고 좀 더 자기에게 유리하게 만들기 위해서 시간과 노력을 투자 하지만 일단 정부에서 대금이 지급되고 나서는 시들해지기 마련입니다. 하지만 정부도 바보가 아닌 이상 몇년간 사용을 해야 하는데 사람들이 일이 늘어나서 사용하지 않는다는것을 알고 있어서 조금은 강제로 사용 현황을 수집하고 있습니다. 정부 사이트에 현황을 볼 수 있는 사이트가 있지만 매일 들어가서 보기 힘들고 어차피 우리가 만들어준 시스템에서 자료를 가지고 통계를 전송하기에 해당 부분에 착안해서 먼저 우리가 시스템에서 데이터를 통계를 내서 메일을 발송하기로 하였습니다. 상태 표시 화면 이렇게 매일 실행을 해서 상태를 확인 후 우리가 정한 상한선 보다 낮을 경우에 메일을 발송을 해서 경각심을 가지고 해야 합니다. 정부는 몇달간 모았다가 갑자기 감사를 나오기 때문에 미리 미리 해 놓아야 합니다. 메일 발송 내역…
서버의 파일 내용 찾기
어느정도 보안을 위해서 모자이크 처리를 하였습니다. 리눅스 서버에 바로 접속해서 파일 내용을 지정해서 찾을수 있는 간단한 프로그램 입니다. 전체적으로 단어 변경이나 할 일이 있으면은 서버에 접속해서 어느 파일에 있는지 찾아야 하는 일이 요즘 빈번이 일어나고 있어서 만들게 되었습니다. 비록 최근에 만든 파일들은 쉽게 기억을 하지만 기억이 나지 않는 부분까지 모두 찾으려고 하니 CLI 에서 하나하나 기입하기도 귀차니즘이 발동해서 만든것입니다.
MySQL 스키마 변경 프로그램
웹 개발을 하다 보면은 동일한 내용을 DBTable를 생성하고 복제를 하는 일이 많이 발생을 하기 마련입니다. 모든 사이트가 동일하지는 않지만 관리를 위해서라도 서버마다 다를수 있어서 한번에 변경할려니 DB툴을 가지고 하는것도 작업 시간이 늘어나는 일이 이고 해서 한번에 바꿀수 있도록 만들게 되었습니다. 개발자에 따라서 여러가지 프로그램으로 제작을 하지만 저는 C#을 이용하여서 GUI 화면에서 보면서 지금것은 어떤지 실시간으로 보기도 하고 변경도 하고 싶어서 만들게 되었습니다. 프로그램에 제가 접속을 해야 하는 서버들이나 DB를 기록을 해 놓은곳에서 가져오는것인지 SQL 자체는 상당히 간단한 편입니다. 컬럼을 변경할 경우에 사용하는 SQL ALTER TABLE `대상DB`.`대상TABLE` CHANGE COLUMN `변경할컬럼` `변경할컬럼명` 형식 NULL여부 DEFAULT '기본값' COMMENT '코멘트'; 컬럼을 추가할 경우에 사용하는 SQL ALTER TABLE `대상DB`.`대상TABLE` ADD COLUMN `추가할컬럼명` 형식 NULL여부 DEFAULT '기본값' COMMENT '코멘트' AFTER `대상컬럼`; 컬럼을 삭제할 경우에 사용하는 SQL ALTER TABLE `대상DB`.`대상TABLE` DROP COLUMN `지울컬럼명`; 이렇게 SQL 명령어만 조건에…
C# Debug / Release 체크해서 코드 실행하기
C#으로 개발을 하다 보면은 Debug에서만 작동해서 테스트를 위할 때가 있습니다. Release와 동일하게 하면 좋지만은 겨우 확인을 위해서만 필요한 사항인데, 빌드할때 빼먹으면은 남기도 하고 하는등이 피폐한 부분이 있어서 조금은 코드를 찾아보니 좋은 조건문이 있어서 기록을 합니다. #if DEBUG Console.WriteLine("Mode=Debug"); #else Console.WriteLine("Mode=Release"); #endif 이제 그냥 디버그와 릴리즈 일때 구분하지 않고 코드를 나두고 작업을 합니다. 물론 최종 출시전에는 위에 코드가 없는편이 깔끔하고 좋지만은 한창 개발중인 기능에 대해서는 긴급하게 업데이트도 필요하기 때문에 나두면은 좋습니다. 물론 실행을 막아주기도 하는등의 좋은 기능도 있습니다. 주석을 잘 남기는것도 좋지만 확실히 디버그 일때와 릴리즈 모드에 대해서도 구분을 하고 개발을 하면 좋을것 같습니다.
윈도우 시간 동기화
프로그램을 개발하면서 윈도우의 시간동기화가 필수적으로 필요하게 되었습니다. 당연히 윈도우가 자동으로 잘 동기화를 하고 있겠지만은 그렇지 않은 경우에는 강제로 동기화를 해야 하는데, 컴퓨터가 그냥 자동으로 작업을 할 경우에 시간에 예약이 있을 경우에 시간이 동기화가 되지 않으면은 작업이 늦어지기에 한번씩 동기화를 해줘야 합니다. /// <summary> /// Gets the current DateTime from time-a.nist.gov. /// </summary> /// <returns>A DateTime containing the current time.</returns> public static DateTime GetNetworkTime() { return GetNetworkTime("time.windows.com"); // time-a.nist.gov } /// <summary> /// Gets the current DateTime from <paramref name="ntpServer"/>. /// </summary> /// <param name="ntpServer">The hostname of the NTP server.</param> /// <returns>A DateTime containing the current time.</returns> public static DateTime GetNetworkTime(string ntpServer) { IPAddress[] address = Dns.GetHostEntry(ntpServer).AddressList; if (address == null || address.Length == 0) throw new ArgumentException("Could not resolve ip address from '" + ntpServer + "'.", "ntpServer");…
[CSharp] Zip 파일 압축, 해제
참조할 어셈블리System.IO.CompressionSystem.IO.Compression.FileSystem // 압축 풀기 using (ZipArchive zipArchive = ZipFile.OpenRead(LOCAL_FILE)) { foreach (ZipArchiveEntry zipArchiveEntry in zipArchive.Entries) { try { string folderPath = Path.GetDirectoryName(Path.Combine(LOCAL_ZIPARCHIVE_PATH, zipArchiveEntry.FullName)); // if (!Directory.Exists(LOCAL_ZIPARCHIVE_PATH)) { Directory.CreateDirectory(LOCAL_ZIPARCHIVE_PATH); } // zipArchiveEntry.ExtractToFile(Path.Combine(LOCAL_ZIPARCHIVE_PATH, zipArchiveEntry.FullName), true); } catch (PathTooLongException pt_ex) { Console.WriteLine(pt_ex); } } } // 압축하기 using (FileStream fileStream = new FileStream(SFTP_DOWNLOAD_LOCAL_PATH, FileMode.Create, FileAccess.ReadWrite)) { using (ZipArchive zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Update)) { try { foreach (string filePath in Directory.EnumerateFiles(DOWNLOAD_LOCAL_ZIPARCHIVE_PATH, "*.*", SearchOption.AllDirectories)) { string relativePath = filePath.Substring(DOWNLOAD_LOCAL_ZIPARCHIVE_PATH.Length + 1); try { zipArchive.CreateEntryFromFile(filePath, relativePath); } catch (PathTooLongException pt_ex) { Console.WriteLine(pt_ex); } } } catch (Exception ex) { Console.WriteLine(ex); } finally { zipArchive.Dispose(); fileStream.Close(); } } } 단순하게 참조만 추가하니 정상적으로 되지 않아서 참조 방법을 조금더 자세히 기록을 합니다. 변경일 : 2021.06.19
[CSharp] SFTP
ConnectionInfo ci = new ConnectionInfo(SFTP_HOST, SFTP_PORT, SFTP_USER, new PasswordAuthenticationMethod(SFTP_USER, SFTP_PASS)); using (var sftpClient = new SftpClient(ci)) { try { // sftpClient.KeepAliveInterval = TimeSpan.FromSeconds(60); sftpClient.ConnectionInfo.Timeout = TimeSpan.FromMinutes(180); sftpClient.OperationTimeout = TimeSpan.FromMinutes(180); sftpClient.Connect(); sftpClient.DeleteFile(SFTP_PATH); sftpClient.Disconnect(); // sftpClient.Connect(); sftpClient.BufferSize = 4 * 1024; using (FileStream fs = new FileStream(LOCAL_FILE, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { sftpClient.BufferSize = 4 * 1024; sftpClient.UploadFile(fs, FILE_NAME, true); } sftpClient.Disconnect(); // sftpClient.Connect(); sftpClient.DownloadFile(SFTP_DOWNLOAD_SERVER_PATH, LOCAL_FILE); sftpClient.Disconnect(); } catch (System.Net.Sockets.SocketException socket_ex) { MessageBox.Show(socket_ex.Message, "경고"); } catch (Renci.SshNet.Common.SshAuthenticationException ssh_ex) { MessageBox.Show(ssh_ex.Message, "경고"); } }
[CSharp] MySQL 접속 처리
using (dbConnection = new MySqlConnection("Server={0}Port={1};Database={2};Uid={3};Pwd={4}")) { try { /* INSERT, UPDATE 처리 */ dbConnection.Open(); dbQuery = string.Format("UPDATE `table` SET colume = '{0}' WHERE idx = '{1}'", VALUE, IDX); dbConnection.Open(); dbCmd = new MySqlCommand(dbQuery, dbConnection); dbCmd.ExecuteNonQuery(); dbConnection.Close(); /* bind 형식 */ dbConnection.Open(); dbQuery = "INSERT INTO log (`content`,`ip`,`creator`) VALUES (@content,@ip,@creator); "; dbCmd = new MySqlCommand(dbQuery, dbConnection); var bind1 = new MySqlParameter("@content", this.logString() + TEXT +"했습니다."); dbCmd.Parameters.Add(bind1); if( dbCmd.ExecuteNonQuery() == 1) { //성공 } dbConnection.Close(); /* SELECT */ dbConnection.Open(); dbQuery = string.Format("SELECT * FROM `table` WHERE idx = '{0}'; ", IDX); dbCmd = new MySqlCommand(dbQuery, dbConnection); dbTable = dbCmd.ExecuteReader(); if (dbTable.HasRows) { while (dbTable.Read()) { dbTable["cnt"].ToString().Trim(); } } } catch (MySqlException db_ex) { MessageBox.Show(db_ex.Message, "경고"); } finally { } } 그냥 소스코드의 일부 기능을 정리한 코드 입니다. 누군가가 바로 사용할 정도의 코드가…
[CSharp] datagirdivew 설정
C#으로 개발을 하다 보면은 datagridview를 사용할 일이 너무 많아서 한번 기록을 해두기 위해서 글을 작성합니다. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; dataGridViewCellStyle1.Font = new System.Drawing.Font("맑은 고딕", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(165))); dataGridViewCellStyle1.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5); dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; //줄바꿈 this.dataGridViewFileList.Columns.Clear(); this.dataGridViewFileList.Rows.Clear(); this.dataGridViewFileList.Refresh(); this.dataGridViewFileList.BorderStyle = BorderStyle.None; this.dataGridViewFileList.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None; this.dataGridViewFileList.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None; this.dataGridViewFileList.CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal; this.dataGridViewFileList.BackgroundColor = Color.White; this.dataGridViewFileList.DefaultCellStyle.SelectionBackColor = Color.FromArgb(0, 161, 218);//선택시 this.dataGridViewFileList.DefaultCellStyle.SelectionForeColor = Color.White; //선택시 this.dataGridViewFileList.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;//Color.FromArgb(236, 240, 241); this.dataGridViewFileList.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(228, 170, 102); this.dataGridViewFileList.ColumnHeadersDefaultCellStyle.ForeColor = Color.White; this.dataGridViewFileList.SelectionMode = DataGridViewSelectionMode.FullRowSelect; this.dataGridViewFileList.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; this.dataGridViewFileList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; this.dataGridViewFileList.DefaultCellStyle.WrapMode = DataGridViewTriState.True; //줄바꿈 this.dataGridViewFileList.Font = new System.Drawing.Font("맑은 고딕", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(165))); this.dataGridViewFileList.Visible = true; this.dataGridViewFileList.ReadOnly = true; this.dataGridViewFileList.MultiSelect = false; this.dataGridViewFileList.AutoGenerateColumns = false; this.dataGridViewFileList.RowHeadersVisible = false; this.dataGridViewFileList.ShowCellErrors = false; this.dataGridViewFileList.ShowCellToolTips = false; this.dataGridViewFileList.ShowEditingIcon = false; this.dataGridViewFileList.ShowRowErrors…
[C#] 파일 관리 Application
회사에서 급하게 진행된 Application 입니다. Web서비스중에서 첨부파일에 대해서만 Application에서 관리를 하기 위해서 만들어진것입니다. web의 기능과 동일하게 작동을 해야 하는 부분에서 DB 분석을 해서 Web과 동일하게 작동을 하도록 만든점이 상당한 노력을 기울였습니다. 그외 부분은 파일 전송과 파일감시 기능은 Application의 고유 기능이라서 그다지 힘들었다기보다는 새로운 기술을 익히는 과정이라서 즐겁기까지 하였습니다. 해당 Application은 웹에 올린 파일을 Local에 다운받고 해당 파일의 변경 여부를 하여서 다시 Web Server에 올려주는 과정을 합니다. Up,Down 과정에서는 Web의 제약사항인 파일 사이즈의 문제를 해결 하기 위해서 SFTP 기능을 이용해서 파일을 Up,Down하도록 해서 대용량 파일이라도 Server에 올라가도록 하는 기능을 구현을 하였습니다. 또한, 압축된 파일을 자동적으로 압축해제 하고 파일을 볼 수 있도록 하면 그 파일중 1개라도 변경이되면은 다시 압축을 하는 과정도 거치게 되어 있어서 조금 복잡하게 변한 부분도 없지 않아 있지만, 사용자분들이 일단은 괜찮다는 평이 좋았습니다.
MySQL 엑셀로 산출물 만들기
문서를 작성해야 하는 일이 항상 있습니다. 그중에서 가장 귀찮은 일이 MySQL의 DB의 형식이나 현재 어떤 스키마를 가지고 있는지를 문서를 만드는 일이 정말 귀찮습니다. 물론 처음 문서를 작성하고 나서 큰 변화가 없다면은 다행이지만 항상 똑같은 상태라고 할 수가 없다 보니 매번 문서를 만들어야 하는 일이 정말 귀찮기만 할뿐입니다. 그렇다고 매번 Database에 들어가서 명령어를 실행하고 만드는것도 일입니다. 고정된 형태면 좋지만 다른 사람에게 공유하기 위해서로 문서로 만들어야 하는 일이 발생을 하게 되면은 또 다시 세팅하고 실행하고 결과값을 저장하는 일이 반복되는 일을 줄이는것이 가장 큰 목표였습니다. C#으로 만들다보니 엑셀 파일 만드는것이 가장 큰 일이였습니다. 내가 설치된 컴퓨터의 환경에 맞추면은 가장 좋지만은 프로그램이라 함은 어느정도 범용성을 가져야 하기에 엑셀로 출력하는 방식에서 많은 고민을 하였습니다. 물론 그전에 MySQL에서 정보를 빼 내는 로직 자체는 이미 완성되어 있어서 그래도 실행을 하면 되지만 마무리가 되지 않아서 한참을 헤메이다가 우연한…