MongoDB 백업 & 복원

Database
어느 업체에서 MongoDB를 사용하는데, 해당 DB에서 필요한 자료를 가져와서 정보를 가공해서 보여줘야 하는 사항입니다. 그대로 복사한다고해서 그대로 사용을 할수가 없어서 찾아보게 된 자료입니다. ## MongoDB 백업 mongodump.exe --out .\backup\ --host 127.0.0.1 --port 27017 -uadmin1234 -p1234 --db "데이타베이스" ## MongoDB 복원 mongorestore.exe --host localhost --port 27017 -d"데이타베이스" -uadmin1234 -p1234 --drop "백업디렉토리" 위에 DB를 백업 & 복원을 통해서 C# Applicaiont을 통해서 자료를 조회한다음에 MySQL로 이전하는 작업입니다. MongoDB자체가 RDBMS가 아니라서 가져오는데 애를 먹었지만, 일단 2주간의 노력으로 일단은 만들게 되었습니다.
Read More

MySQL 트리거를 통해서 프로시저의 동적 쿼리 실행

Database
결론부터 말하면은 대실패 입니다. 의도한대로 전혀 움직이지 않습니다. 그렇기에 MySQL에서는 절대 하지 마십시오. 물론 다른 DBMS인 오라클, MSSQL은 어떤지 아직 직접해보지 않아서 정확히는 모릅니다. 하지만 제가 테스트한 MySQL에서는 전혀 실행이 되지 않습니다. 실패라고 하여도 과정에 대해서 일단 간단히 작성해 놓고 추후에 이런 일이 있으면 교본을 삼으려고 글을 남깁니다. 요구조건1. INSERT 시에 해당 값을 trigger를 통해서 다른 테이블에 기록2. 다른테이블 기록은 '테이블이름_년월' 형식에 기록해서 추후에 관리 용이3. 값이 없는 부분은 가공해서 넣기 어떻게 보면은 정말 간단한 요구사항입니다. trigger의 INSERT시에 캐치해서 월별로 관리하는 Table에 Insert 하는 부분입니다. 물론 이 외에 될수도 있지만 현재로서는 실패 입니다. DROP TRIGGER IF EXISTS `TRIGGER_TEST`; DELIMITER // CREATE TRIGGER `TRIGGER_TEST` AFTER INSERT ON `TRIGGER_TEST_RAW` FOR EACH ROW BEGIN -- 선언 DECLARE Access_Time VARCHAR(20); DECLARE Ip_From VARCHAR(20); DECLARE Status_From VARCHAR(20); DECLARE Work_Rate VARCHAR(10); DECLARE OrgMessageFrom VARCHAR(80); -- 값…
Read More
Asterisk에서 인입콜 취득

Asterisk에서 인입콜 취득

CSharp
Asterisk IP-PBX 교환기를 사용하고 있는분께서 모든 전화를 받을수 없으셔서 인입되는 모든 Call 정보를 획득하는 방법을 문의 하셨고 만들게 되었습니다. 부가적인 기능으로 인입되는 DID 번호에 따라서 메모를 기록하고, SMS/LMS를 보내는 기능까지 함께 합쳐서 만들어진 기능입니다. 이렇게 하면서 상담원이 늘어나면서 이제 상담원에 대한 인증기능을 붙이게 되었으며, 발신번호를 변경가능하게 만들어지게 되었습니다. 정보를 취득후 서버에서 관리할수 있도록 하는 기록 서버가 있어서 모든 기록이 365일 24시간 계속 기록됩니다.
Read More

윈도우 응용프로그램에 전자서명을 해야 될듯…

CSharp
가끔식 주변분들에게 윈도우 응용프로그램을 만들어 드리는편입니다. 이전에는 그냥 배포라는 생각이 없어서 전자서명을 할 생각이 없었지만 조금씩 숫자가 늘어나면서 생각을 바뀌야 될듯 합니다. 공식적으로 불특정 다수에게 공개해서 사용하도록 하는 일을 만들지 않으려고 하는편입니다. 사용하는 기술이 한발을 잘못 디디면은 불법이라는 형식으로 갈 수 있어서 그렇게 좋은 형태는 아닙니다. 하지만, 프로그램이라는것은 사용하시는분이 불편해서 만들어 달라는것이지, 사용할 일이 없으면은 절대 만들 이유가 없다고 보기에 만들어 드리는 편입니다. 이렇게 만든게 시간이 조금씩 흐르니 하나하나 쌓여서 이제 몇개가 사용되는 편입니다. 그렇다 보니깐 이제 전자서명을 해서 윈도우에서 사용하는데 불편함을 조금 들어 드리기 위해서 해야 된다고 생각을 합니다. 업데이트 문제도 있고해서 짧지는 않지만 장기간을 보고 하다 보면은 언젠가 Microsoft에서도 크게 문제가 없다고 인정해주지 않을가 싶어서 전자 서명을 시도합니다. 사설 전자서명이라서 기간이 2040년까지 인데 앞으로 20년을 제가 이 일을 할지 여부를 알 수 없기에 기간은 넉넉하다도 보여져서 만들어서 사용하는…
Read More

MySQL Grant 권한 옵션 설명

Database
MySQL User 추가를 할 경우 보통 Grant 옵션을 주지 않는데, 개발서버에서 필요한 경우가 있어서 간단히 한번 정리를 한것입니다. CREATEdatabases,tables, indexs데이터베이스, 테이블 생성DROPdatabases,tables,views데이터베이스, 테이블 삭제GRANT OPTIONdatabases,tables,stored routines사용자들의 권한을 부여하거나 제거LOCK TABLESdatabases테이블 잠그기ALTERtables테이블의 구조를 변경DELETEtables테이블의 행을 삭제INDEXtables인덱스를 생성하거나 삭제INSERTtables,columns행추가SELECTtables,columns행조회UPDATEtables,columns행변경CREATE TEMPORART TABLEStables임시테이블생성CREATE VIEWviews뷰의 생성SHOW VIEWviewsSHOW CREATE VIEWALTER ROUTINEstored routines프로시저 함수의 변경 삭제CREATE ROUTINEstored routines프로시저 함수의 생성 그다지 잘 주지 않는 옵션인데 Root 권한을 주기에는 뭔가 애매모호해서 필요한 부분만 허용을 하고 나머지는 주지 않을 생각이라서 현재 몇가기중 View 관련만 허용을 해주고 하지 않은 상태입니다.
Read More

C# 메모리 강제 회수

CSharp
GC.Collect()를 사용하였지만 정말 획기적으로 줄지 않아서 사용하게 되는것입니다. using System.Runtime.InteropServices; // [DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)] // private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize); /// <summary> /// 강제 메모리 회수 /// </summary> public static void FlushMemory() { GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); } } 남발을 할 경우 사용상에도 문제가 있고 하니, 적절히 필요한 부분에서 사용을 해야 될듯 싶습니다. 저 같은 경우은 datagridview를 몇개를 사용하다 보니 도저히 메모리 관리가 되지 않아서 지워준 경우가 됩니다. datagridview를 사용해서 표현은 하지만 Row 마다 수정은 막혀 있기도 하고 풀어 놓기도 해서 입니다. 수정 권한이 있는 사용자에게는 단순히 data를 보여주기만 하면 되어서 큰 문제가 없어서 메모리를 관리를 하는 용도로 사용을 합니다.
Read More

JQuery로 북마크 하도록 안내하기

JavaScript
기존에 사용하고 있던 호스팅을 변경하면서 북마크 및 사이트 이동을 위해서 필요해서 찾아보고 조합해서 만든것입니다. $(document).ready(function(){ var bookmarkTitle = '북마크타이틀'; var bookmarkUrl = "북마크할 주소"; if($(location).attr("host") == "도메인주소") { console.log('주소변경 안내!!'); if ('addToHomescreen' in window && addToHomescreen.isCompatible) { // Mobile browsers addToHomescreen({ autostart: false, startDelay: 0 }).show(true); } else if (/CriOS\//.test(navigator.userAgent)) { // Chrome for iOS alert('To add to Home Screen, launch this website in Safari, then tap the Share button and select "Add to Home Screen".'); } else if (window.sidebar && window.sidebar.addPanel) { // Firefox <=22 window.sidebar.addPanel(bookmarkTitle, bookmarkUrl, ''); } else if ((window.sidebar && /Firefox/i.test(navigator.userAgent) && !Object.fromEntries) || (window.opera && window.print)) { // Firefox 23-62 and Opera <=14 $(this).attr({ href: bookmarkUrl, title: bookmarkTitle, rel: 'sidebar' }).off(e); return true; } else if (window.external && ('AddFavorite' in window.external)) { // IE Favorites…
Read More

MySQL 에서 ON DUPLICATE KEY UPDATE 사용시 last_insert_id 값 획득

Database
MySQL에서 Insert, Update를 동시에 할 수 있게 해주는 "ON DUPLICATE KEY UPDATE" 쿼리를 사용할 경우 last_insert_id 결과값을 정상적으로 가져오지 못할 경우가 생기기 마련이다. 이 문제를 해결 하기 위해서는 해당 Table의 컬럼중 "AUTO_INCREMENT" 지정된 컬럼을 가져오면 된다. 쿼리의 예를 들면 다음과 같다. INSERT INTO test(name, age) VALUES ('이름', '19') ON DUPLICATE KEY UPDATE name='이름', age='19', expr=last_insert_id(idx); Insert가 실행되고, last_insert_id()를 획득 할 수 있습니다.
Read More

VisualStudio C# Debug창에 출력하기

CSharp
using System.Diagnostics; static class Program { static void Main() { Debug.WriteLine("메세지 내용"); } } 항상 사용을 할 수 있다는것은 알지만 기억이 나지 않아서 간단히 정리합니다. 평소에는 그냥 평하게 Console 창에 이용하기 때문에 사용할 수 있지만, 속성을 변경해야 하는 불편함도 있고 하여서 기록을 합니다. 이곳에 기록을 해 놓아도 기록여부를 기억하지 않으면 나중에 또 기억이 나지 않겠지만 일단 기록 입니다.
Read More
Visual Studio Installer Project 사용하기

Visual Studio Installer Project 사용하기

CSharp
확장 > 확장관리 :: 검색어 "installer"를 입력하면 설치 할 수 있습니다. Installer프로젝트의 자세한 사용법은 검색을 통해서 알아 보시기 바라며, 제가 기록할 내용은 설치할 경로에 대한 정보 입니다. 제가 이 사진을 올린 이유는 속성창중에서 "Manufacturer" 이부분이 중요해서 입니다. 아래의 사진중에서 경로를 지정할수 있습니다. 하지만, 이 프로그램이 설치될 상위 디렉토리에 대해서 설정을 여기서 할 수 있습니다.보이시는 "Manufacturer" 의 값이 아래의 "Application Folder"의 이름이 되는것이라고 저는 보고 있습니다. 경로를 설정하실때 이름을 입력을 해 놓는것이 좋다는 생각입니다. 보통 새롭게 프로젝트를 만들고 "Application Folder" 속성에 "DefaultLocation" 정보가 보이게 됩니다. 이곳의 정보를 수정하면은 변경을 할수 있습니다. // [ProgramFilesFolder] :: 설치할 경로 // [Manufacturer] :: 필수 유지 위에서 설명함. // [ProductName] :: 설치할 폴더명(프로젝트 이름과 달리 할수 있음) [ProgramFilesFolder][Manufacturer]\[ProductName] 위에서 "[ProgramFilesFolder]" 이부분을 변경을 원합니다. 저는 C 드라이버에 사용되기를 원해서 "[WindowsVolume][Manufacturer]\MyPROGRAM"으로 변경해서 모두 설치를 하고 있습니다. 저 처름…
Read More
MySQL DB Schema 관리 프로그램

MySQL DB Schema 관리 프로그램

CSharp, 프로그램
MySQL DB Schema 에 대해서 DBTool을 이용하지 않고 보고 보고서를 Excel로 출력하기 위해서 만들었습니다. 분명히 좋은 프로그램도 많고 하지만 특정 사용인에 맞춰서 출력을 조절하고 DB Schema를 관리 하기 위해서 만들게 되었습니다. 컬럼마다 코멘트와 형식으로 모두 설정이 가능하도록 되어 있어서 여러사람이 이 프로그램을 사용하면은 볼수가 있습니다.
Read More
Local MSSQL 데이터를 MySQL Server로 전송

Local MSSQL 데이터를 MySQL Server로 전송

CSharp, 프로그램
요구사항1. 컴퓨터의 MSSQL 특정 DB table을 MySQL 서버로 전송2. 특정컬럼의 구분자를 구분해서 MySQL로 전송3. 컴퓨터의 MSSQL 데이터를 일정기간 지난후 삭제 하도록 처리4. 프로그램의 실행 시간을 일정시간 간격으로 실행하다록 처리 매번 프로그램을 만들어주는게 간단한것도 있지만 막상 작업을 하다 보면은 손이 많이 가야 하는것이 있습니다. 이번 프로그램도 보기에는 간단한데, 내부적으로 돌아가야 하는 부분은 신경써야 할 곳이 한두곳이 아닙니다. Web API를 만들어서 전송하면은 WebServer에서 담당하면 되지만, 이건 IP가 지정되어서 MySQL 서버가 열러 있어서 해당 프로그램에서 자체적으로 MSSQL, MySQL를 동시에 처리해서 귀찮은 부분이 많았습니다. 일단 일정시간마다 읽어서 모든 Data를 전송하지만, 중복이 되지 않도록 제가 가능한 부분에서 최대한 노력을 하였으며, 현재 한달가 가동현황에서 보면은 문제는 없어 보입니다. 아울러 MSSQL의 데이터를 일정 기간만 유지하도록 Query 문을 사입해서 지우기도 하지 사용하시는분이 이제 편하다는 입장이며 저도 기분이 좋고 사용하시는 분도 좋으니 모든게 잘 풀린 케이스 인듯 합니다.
Read More
Local SQLite의 Table의 내용을 WebServer로 전송

Local SQLite의 Table의 내용을 WebServer로 전송

CSharp, 프로그램
필요사항1. 주기적으로 WebServer로 전송해야함.(단 WebServer에 중복은 방지)2. 각 컴퓨터마다 SQLite 경로가 다르기 때문에 설정이 가능하도록함.3. 각 컴퓨터 구분을 할 수 있도록 함.4. 각 컴퓨터에 일정시간적으로 DB를 읽을수 있도록함.5. 각 컴퓨터 SQLite DB가 Lock이 걸리니 복사해서 사용하도록함. 이상이 5가지 사항을 가지고 만든것이며, 약 일주일 정도 지났지만 문제없이 사용을 하고 있다고 합니다. 생각보다 적은 양의 코딩을 해서 만들었지만 알차게 만든듯 합니다.
Read More
JQuery Autocompliet 기능에 AJax 기능 추가하기

JQuery Autocompliet 기능에 AJax 기능 추가하기

JavaScript
jquery 를 제작할 경우에 자동완성처럼 편한기능이 있다. InputBox에 단어를 입력하면은 자동적으로 처리를 해주는 부분인데 DB와 연동하다 보면은 보여지는 Label의 문자와 실제 입력되어야 하는 Value가 다를 경우에 처리하는 기능까지 함게 붙여서 만들게 된 기능입니다. 위 그림 처럼 InputBox에 단어 한자만 입력하면은 Ajax를 이용해서 DB상에서 이미 조회후에 해당 결과값을 가지고 Label에 표시되는 기능을 최대한 표현하고 실제 DB에 입력될 Input은 Value에 지정해서 저장하면은 사용자도 보기 편하고, 관리자 입장에서도 편할것이라고 생각되어서 조합해서 사용하게된 기능입니다. $('#ID').autocomplete({ source: function(request, response){ // searchObjStandard = $('#headObjStandard').val(); // $.ajax({ type: "GET", url: "/worksorder/worksorderFormSearchHead", data: {objStandard: searchObjStandard}, contentType: "application/json; charset=utf-8", dataType: "json", success: function (data) { if( data.length == 0 ) { response(data); } else { response( $.map( data, function( item ) { return { label: item.objNumber + ' | ' + item.objName + ' | ' + item.objStandard, value:…
Read More