안녕하세요. IT김군입니다.


오늘은 C#으로 Xml 파일 생성 및 읽어오기에 대해 메모해보겠습니다.


기본적인 내용이라 계층 구조 등은 따로 구글링하여 작업해주셔야 할 것 같습니다.

using System.Xml;
using System.IO;


먼저 Xml을 생성하고 Node를 생성 후 값을 넣는 부분입니다.

string xmlFilePath = "D:/";
 try
{
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.NewLineOnAttributes = true;
        XmlWriter xmlWriter = XmlWriter.Create(sFilePath + "/TestXml.xml");
        xmlWriter.WriteStartDocument();

        xmlWriter.WriteStartElement("root");
        xmlWriter.WriteElementString("Node1", "Value1");
        xmlWriter.WriteElementString("Node2", "Value2");
        xmlWriter.WriteEndDocument();

        xmlWriter.Flush();
        xmlWriter.Close();
}
catch (Exception except)
{
         Console.WriteLine(except.Message);
 }



아래는 생성했던 Xml파일을 읽어오는 부분입니다.

string xmlNodeName = "";
string xmlValue = "";
string xmlFilePath = "D:/";

try
{
     if (File.Exists(xmlFilePath + "/TestXml.xml"))   //  경로에 xml 파일이 있는지 체크
     {
          XmlTextReader xmlReadData = new XmlTextReader(xmlFilePath + "/TestXml.xml");    //  xml Open
          while (xmlReadData.Read())
          {
    		 if (xmlReadData.NodeType == XmlNodeType.Element)
			 {
	              switch (xmlReadData.Name.ToUpper().Trim())
				  {
		             case "NODE1": 
                                       xmlNodeName = xmlReadData.ReadString().ToString().Trim(); 
                                       break;
		             case "NODE2": 
                                       xmlValue = xmlReadData.ReadString().ToString().Trim(); 
                                       break;
				   }
		      }
           }
	        xmlReadData.Close();
	  }
      else // 해당 경로에 xml 파일이 없을 때
	  { 
	      Console.WriteLine("@@ Xml 존재하지 않음");            
	  }   
}
catch (Exception except)
{
	  Console.WriteLine(except.Message);
}

Console.WriteLine("@@ Product : " + xmlNodeName);
Console.WriteLine("@@ Worker : " + xmlValue);


도움이 되셨으면 좋겠습니다.


감사합니다.



WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,

안녕하세요. IT김군입니다.


이번 프로젝트에서는 PostgreSQL을 사용하게 되었어요.


그래서 그냥 간단한 기초들부터 메모해보겠습니다.


오늘은 그냥 기본 쿼리문입니다.



INSERT Query

INSERT INTO 스키마명.”테이블명” (“칼럼명”,”칼럼명2”,”칼럼명3”) VALUES (값1, 값2, 값3);



SELECT Query

SELECT*FROM 스키마명.”테이블명”;
SELECT “칼럼명” FROM 스키마명.”테이블명”;



UPDATE Query

UPDATE 스키마명.”테이블명” SET “칼럼명”=변경 값 WHERE 조건;



DELETE Query

DELETE FROM 스키마명.”테이블명” WHERE 조건;



PostgreSQL은 기본적으로 대소문자를 구분하기 때문에 "" 큰 따옴표 안에 써야하는 것들이 많습니다.


하지만 이 큰 따옴표를 쓰지 않고 쿼리를 던질 수 있는 방법은 매우 간단합니다.


테이블부터 칼럼까지 모두 소문자로 생성하시면 큰 따옴표 없이 그냥 사용하실 수 있습니다.


모두 소문자로 작성하시면 아래와 같이 작성하실 수 있습니다.

INSERT INTO 스키마명.테이블명 (칼럼명,칼럼명2,칼럼명3) VALUES (값1, 값2, 값3);



잘못된 부분이나 궁금한 점 댓글주세요.


감사합니다.



WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,

안녕하세요. IT김군입니다.


오늘은 MediaWiki에서 직접 만드신 Wiki를 혼자서도 사용할 수 있지만 팀 단위로 관리할 수도 있고 회사단위로 관리할 수도 있으니 사용자를 추가하는 방법에 대해 알아보도록 하겠습니다.


굉장히 기본적인 기능이지만, 저도 Wiki를 처음 다루어보는 입장에서 다음에는 헤매지 않게 정리해놓으려 합니다.


우선 만드신 Wiki에서 SuperUser 계정으로 로그인합니다. (최초에 Wiki를 생성했던 계정)


그 다음 만드신 Wiki의 메인페이지 혹은 아무 곳이나 접근하시면 좌측 Sidebar에 아래 사진과 같이 보이실거에요.



여기서 '특수 문서 목록'을 클릭하여 들어갑니다.


들어가시면 쭉 메뉴들이 보이실건데요.


이 중에 아래 사진과 같이 '계정 만들기'가 있습니다.



해당 메뉴에 접근하여 계정을 만들어주시면 됩니다.


이메일로 임시비밀번호 보내기 기능이 있던데, 저희 회사메일주소로는 메일이 오지 않더군요. 


이 점 참고하셔서 저 같은 경우는 비밀번호 제가 직접 입력해서 알려드리고 개인적으로 변경하는 방식으로 진행했습니다.


추가적으로 궁금하신 사항이나 잘못된 부분 있으면 댓글주세요.


감사합니다.



WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,

MediaWiki 초기 세팅.


대문 탭 바꾸기

MediaWiki:Mainpage-nstab


대문 문구 바꾸기

MediaWiki:Mainpage


대문 문구 자체를 삭제하기

MediaWiki:Common.css
body.page-대문 h1.firstHeading { display: none; }


사이드탭 항목 바꾸기

MediaWiki:Sidebar



WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,

안녕하세요. IT김군입니다.


오늘은 C# / WPF에서 프로젝트를 관리자 권한으로 실행시키는 방법에 대해 알아보도록 하겠습니다.


우선 Visual Studio를 관리자 권한으로 실행시켜줍니다.


그 후에 관리자 권한으로 실행한 Visual Studio에서 관리자 권한으로 실행시킬 프로젝트를 열어줍니다.




그 후 위와 같이 프로젝트 명을 우클릭하여 속성으로 들어갑니다.


속성에 들어가면 아래와 같은 화면이 나옵니다.


위 처럼 속성에서 보안 탭으로 들어가면


'ClickOnce 보안 설정 사용' 이라는 항목이 나오는데요.


이 항목을 체크했다가 다시 체크를 해재해줍니다.


그 이유는 위 사진 좌측에 보이시는 것과 같이 app.manifest 파일을 생성하기 위함이니, 처음 체크가 되어있지 않을테지만 체크를 했다가 다시 해제해줍니다.


그 다음 app.manifest 파일을 열어보겠습니다.




그럼 몇 줄 내려가지 않고 위 빨간 네모박스의 내용이 보이실텐데요.


위 태그에서 level 값을 아래와 같이 requireAdministrator로 변경해줍니다.




위 항목을 모두 진행하신 후 컴파일하셔서 exe를 실행하시면


관리자 권한으로 실행시킬 수 있습니다.


궁금하신 점이나 잘못된 점이 있다면 댓글주세요.


감사합니다.


WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,

안녕하세요. IT김군입니다.


오늘은 WPF로 개발 시 전체화면의 View를 만드는 법에 대해 알아보겠습니다.


전체화면으로 실행하고자 하는 페이지의 xaml 파일에 <Window></Window> 태그가 있다면

<Window ~~~~ 여기에 넣어주면 된다.>
   <Grid>
   </Grid>
</Window>

위와 같이 윈도우 여는 태그 안에 아래 설정들을 넣어주면 됩니다.



WindowStyle="None"

기본적으로 보이는 윈도우 창의 템플릿 (최소화, 최대화, 닫기) 등을 없애고 현재 실행 창의 화면만 사각형으로 보여지게 됩니다.



WindowState="Maximized"

모니터의 해상도에 맞추어 실행 창의 크기를 꽉 채워줍니다. (작업표시줄 위까지)



ResizeMode="NoResize"

창의 크기를 조절할 수 없게 만들며, 위 설정들과 함께 사용 시 작업표시줄까지 덮어주며 화면을 꽉 채워줍니다.


위 세 개의 설정을 모두 하고나면 이 프로그램 실행 시 다른 프로그램을 실행할 수 없을 것 같지만


실제로 키보드의 window키나 win+D키를 활용해 빠져나올 수 있기에 해당 프로그램만 실행시키고 싶다면 키보드 부분도 같이 작업해주어야 합니다.


잘못되었거나 궁금하신 사항이 있으시면 댓글주세요.


감사합니다.



WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,

안녕하세요. IT김군입니다.


Socket.io로 Client에서 통신하는 방법에 대해 적어보도록 하겠습니다.


우선 터미널에서 프로젝트에 패키지를 설치합니다.

$ npm install typings --global
$ typings install dt~socket.io-client --global --save
$ npm install socket.io-client --save



그 다음 Socket.io를 사용하실 페이지에 import 및 생성자에 선언해줍니다.

import { NgZone } from '@angular/core';
import * as io from 'socket.io-client';

export class HomePage{
    constructor(private zone : NgZone){}
}



아래는 socket.io를 연결하는 부분입니다.


socket.io를 연결할 URL에는 http 혹은 https를 무조건 붙여주도록 합니다. (붙이지 않으면 Android에서 인식하지 못합니다.)


아래 console.log 부분의 "this._any_socket.id"는 socket.io가 연결되지 않을 시 undefined로 값이 나오며, socket.io가 연결되었다면 그 id값이 나오게 됩니다.

private _str_socketURL : string = "http://www.yourURL.co.kr:0000";
private _any_socket : any;
private _strarr_chats : string[];

socketConnect(){
   this._any_socket = io(this._str_socketURL);
   this._strarr_chats = [];
   this._any_socket.on('connect', () => {
      console.log("@@ Socket Connect Check : "+this._any_socket.id);
   });
}




이제 socket.io로 연결을 했으니 서버로 정보를 송신해보겠습니다.


아래와 같이 정보를 보내며 'sendEvent'는 서버측과 정해놓은 이벤트 명입니다.


SendValue는 서버측으로 송신할 정보입니다.


이벤트의 경우 서버측과 협의하여야 하며, 이벤트 명을 맞추어 그에 따른 동작에 대해 작업하여야 합니다.

socketSendMsg(){
   this._any_socket.emit('sendEvent', SendValue);
}




이제 보냈으니 받는 부분도 해봐야겠죠?


받는 부분도 보내는 부분과 비슷한 점은 서버측과 협의된 이벤트가 있어야한다는 점입니다. (receiveEvent로 기재했습니다.)


그리고 아래 나온 _strarr_chats는 아까 connect 부분에서 초기화시켜준 변수입니다.

socketReceiveMsg(){
   this._any_socket.on('receiveEvent', (receiveMsg) => {
      this.zone.run(() => {
         this._strarr_chats.push(receiveMsg);
         console.log(receiveMsg);
      })
   });
}




마지막으로 socket.io 연결을 끊는 동작입니다.

socketDisconnect(){
   this._any_socket.disconnect();
}


Socket.io로 서버와 통신하는 기본적인 부분만 기재해보았습니다.


진짜 기본적인 기능만 기재하였고 추가적인 기능은 API를 참조하시면 될 것 같습니다.


Socket.io API  <---- Client API 링크 남깁니다.


감사합니다.


WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,

안녕하세요. IT김군입니다.


javascript에서 전화번호를 하이픈 없이 입력받아서 사용 후 하이픈을 넣은 값도 필요할 때가 있는데요.


이때 복잡하게 알고리즘으로 해결하시기 보다는 깔끔한 정규식을 추천드립니다.


var phoneNum = "01011111111";
phoneNum = phoneNum.replace(/(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/,"$1-$2-$3");


그리고 모바일 앱을 개발하시는 분들 중에는 입력받는 방식이 아닌 직접 핸드폰 번호를 가져오는 방식을 사용하시는 분들도 계실텐데요.


이 때 +82로 시작하여 국제번호로 들어오는 경우도 있더군요.


그 때 저는 확실한 처리 방법은 아니지만 아래와 같이 처리했습니다. (국내라는 가정하에 작성했습니다.)

ex) 가져온 번호가 var phoneNum = "+821011111111"; 이라고 가정
if(phoneNum.startWith("+")){
    phoneNum = "0"+phoneNum.substring(3);
}

더 좋은 방법 있으면 댓글주세요!


감사합니다.


WRITTEN BY
IT김군
S/W 개발자 김군의 메모장

,