csc.exe /reference:*.dll /out:*.exe /recurse:*.cs

menu_build.cs
0.00MB


WindowsBase.dll/PresentationFramework.DLL/PresentationCore.DLL
WindowsBase.dll : WPF를 위한 기본 서비스 제공.
PresentationCore.dll
PresentationFramework.dll : using System.Windows.Controls

1. WPF개요

Windows Presentation Foundation
MS의 UI, 미디어 및 문서가 통합된 프로그래밍 모델(닷넷 3.0에 소개)
브라우저와 데스크톱에서 동시에 실행될 수 있는 프로그래밍 모델 제공.
Markup(XAML)과 코드 프로그래밍을 동시에 지원한다.
디자인이 가능한 프로그램 모델을 개발하였다. (Blend 프로그램으로 가능)
WPF는 DirectX를 Application UI에 통합했다.

2. WPF Architecture

 PresentationFramework
 PresentationCore
 Common Language Runtime

milcore 
 User32 DirectX 
 Kernel


PresentationFramework, PresentationCore : 순수한 관리코드로만 구성. 서로 분리되어 있음.
PresentationCore : API형태의 라이브러리, 컴포넌트 형태


WPF관련 어셈블리
WindowsBase.dll : WPF를 위한 기본 서비스 제공.
  DispatcherObject 
    Dispatcher : 복수의 작업을 대기시킬 수 있는 큐.
    namespace : System.Windows.Threading
    ※ STA : 실행 context에 하나의 쓰레드만 존재.
    Frame Queueing 가능 : Invoke(), BeginInvoke()

  DependencyObject
    WPF의 속성 시스템의 지원을 받기 위해 필요.
    프레임 수준의 바인딩 종속성, 손쉬운 데이터 공유 등을 객체 인스턴스에 저장하지 않고 가능.
    데이터 구조 중심 프로그래밍(XAML에서 이벤트와 액션까지 모델화하고 선언적으로 처리)

PresentationCore.dll
  Visual
    랜더링을 담당하는 객체. 컨트롤 클래스의 시작점. micore 컴포넌트와 밀접한 관련.
    WPF는 멀리 있는 객체를 먼저 그리고 가까이 있는 객체를 나중에 그린다.
    주요 기능 : 출력 표시. 변환, 클리핑, 적중 테스트, 경계 상자 계산.
    입출력, 이벤트 레이아웃 X

  UIElement
    Layout, 입력 및 이벤트 등의 핵심 기능을 담당.
    Measure : 크기를 정의, Arrange : 위치와 정렬. (2단계 레이아웃)
    입력과 Command의 분리 가능. -> CommandBinding으로 관리 가능.

PresentationFramework.dll
  FrameworkElement
    WPF 프레임워크 수준 요소 클래스와 UIElement 서비스를 연결해 주는 지점.
    레이아웃 시스템 정의 : 핵심 기능 손상 없이 새로운 레이아웃을 정의 가능.
    논리적 트리 : markup을 이용해 구조를 표현할 때 이용.
    객체 수명 이벤트 : Initialized, Loaded, Unloaded 세가지 지원.
    데이터 바인딩 및 동적 리소스 참조 지원 : Expression으로 바인딩 -> Framework는 해석.
    스타일 : 컨트롤의 외관을 변형하기 위해 사용.
    에니메이션 지원 

  Control
    탬플릿 지원 기능 : UI를 편리하게 수정 가능. 속성, 이벤트, Command, Template 기능 지원.
     XAML을 통한 탬플릿 정의 -> 랜더링 시 스트립트를 읽어 들여 반영

/*
csc.exe 사용하기. 옵션포함
*/

-----,----,---- 왠만한건,다 된다.
ex)csc.exe /reference:APMPublicLib.DLL,Newtonsoft.Json.Net20.DLL /out:GoodMorning.exe /recurse:*.cs
ex)csc.exe /reference:APMPublicLib.DLL,Newtonsoft.Json.Net20.DLL /out:GoodMorning.exe /recurse:*.cs
ex)csc.exe /reference:APMPublicLib.DLL,Newtonsoft.Json.Net20.DLL /out:GoodMorning.exe /recurse:*.cs
ex)csc.exe /reference:APMPublicLib.DLL,Newtonsoft.Json.Net20.DLL /out:GoodMorning.exe /recurse:*.cs
ex)csc.exe /reference:APMPublicLib.DLL,Newtonsoft.Json.Net20.DLL /out:GoodMorning.exe /recurse:*.cs

우선 c# 컴파일러의 주요 옵션들에 대해 알아보자.

입력 플래그 정의
/recurse 프로젝트의 하위 디렉터리 구조에 있는 C# 파일을 컴파일하도록 csc.exe에 알린다.
이 플래그는 와일드카드 구문을 지원한다.
/reference (/r) 현재 컴파일에서 참조할 외부 어셈블리를 지정하는 데 사용된다.
/addmodule 다중 파일 어셈블리에 포함할 모듈을 지정하는 데 사용된다.

[ 1]c# 컴파일러 입력 옵션

출력 플래그 정의
/out 생성할 어셈블리 이름을 지정한다. 이 플래그를 생략하면 출력 파일 이름은 *.dll 어셈블리의 경우에는 초기 입력 파일 이름을 기반으로, *.exe 어셈블리의 경우에는 Main() 메서드를 정의하는 클래스를 기반으로 지정된다.
/target (/t) 만들 어셈블리의 파일 형식을 지정한다.
/doc XML 문서 파일을 생성하는 데 사용된다.
/delaysign 강력한 이름의 서명 연기를 사용하여 어셈블리를 빌드할 수 있도록 한다.
/keyfile 어셈블리에 강력한 이름을 지정하는 데 사용되는 *.snk 파일 경로를 지정한다.

ComponentOne 프로젝트에 컨트롤 추가하고, 빌드하기
ComponentOne 프로젝트에 컨트롤 추가하고, 빌드하기
ComponentOne 프로젝트에 컨트롤 추가하고, 빌드하기


1.
본문에서는 새 프로젝트를 생성하고, ComponentOne 컨트롤을 도구상자로 불러온 후, 컨트롤을 폼 또는 프로젝트에 추가하는 과정을 설명하고 있습니다.

2.
도구상자에 컨트롤 추가하기

3.
ComponentOne 컨트롤들은 WinForms 에디션을 설치하는 동안 자동으로 비주얼 스튜디오 도구상자에 추가됩니다.
비고)
ComponentOne 컨트롤들은 WinForms 에디션을 설치는 ComponentOne 사이트에서 다운로드받을수 있습니다.

4.
도구모음에 컨트롤 추가하기

5.
컨트롤을 폼에서 사용후에 빌드하기

6. 
빌드가 안되면, 참조에 추가해서 다시 빌드하기



MSI와 EXE의 차이점(2) - MSI 직접만들어보기

1.

Visual Studio에 Installer 설치가 되어 있어야만 msi 프로젝트를 만들수 있다.

2.

 

MSI와 EXE의 차이점


MSI 파일은 최신 Microsoft Windows 시스템에서 소프트웨어를 설치, 유지 관리 및 제거하는 데 사용되는 실행 파일입니다. 
EXE 파일은 '실행 파일'의 줄임말이며 확장명은 .exe입니다. 
실행 파일의 주된 목적은 컴퓨터에 이미 설치되어있는 파일을 설치하거나 실행하는 것입니다.

컴퓨터에 소프트웨어를 설치하려면 인터넷을 통해 구매하거나 무료로 다운로드하여 설치 프로그램을 다운로드해야합니다. 
소프트웨어, MIS 또는 EXE를 설치하는 동안 발생할 수있는 두 가지 유형의 파일이 있습니다. 
이 두 파일은 실행 가능 확장 파일입니다. 
이 두 파일은 동일한 기능을 수행하지만 설치 및 실행 프로그램은 다른 방식으로 수행합니다.

MSI 파일은 최신 Microsoft Windows 시스템에서 소프트웨어를 설치, 유지 관리 및 제거하는 데 사용되는 실행 파일입니다. 
'MSI'라는 용어는 Microsoft Installer라는 이름에서 파생되었으며 Windows Installer로 변경되었습니다. 
MSI 파일에 대한 정보는 설치 패키지에 저장되며 파일의 확장자는 .msi입니다. 
MSI 파일은 windows installer와 함께 사용되며 프로세스를 시작하거나 응용 프로그램을 실행하기 위해 EXE 파일이 필요합니다. 
MSI 파일은 Windows 업데이트 또는 응용 프로그램에 Microsoft에서 가장 일반적으로 사용됩니다.

MSI 파일을 두 번 클릭하면 Windows Installer가 화면에 팝업으로 나타나 패키지에서 파일 추출을 시작하고 사용자가 지정한 드라이브에 필요한 폴더와 파일을 만들고 패키지에 언급 된 바로 가기도 만들 수 있습니다 . MSI 파일은 MAC 컴퓨터에서 실행되지 않으며 적절한 변환 소프트웨어를 사용하여 EXE 파일로 변환해야합니다. MSI 파일 사용의 이점은 무인 설치를 위해 설계되었으므로 설치 관리자가 파일 다운로드를 위해 할당 된 키 입력 또는 클릭 기록을 유지할 수 있다는 것입니다. MSI 파일을 사용하면 얻을 수있는 또 다른 이점은 표준 GUI를 사용할 수 있다는 것입니다. 표준 GUI는 특정 수준으로 사용자 지정할 수 있으며 자신의 인터페이스를 만드는 복잡성을 제거합니다. MSI는 또한 주문형 설치 옵션을 제공합니다.
이 옵션은 컴퓨터에 부 파일 만 다운로드하고 응용 프로그램을 처음 실행할 때 나머지 파일을 다운로드합니다.

EXE 파일은 '실행 파일'의 줄임말이며 확장명은 .exe입니다. 
실행 파일의 주 목적은 다음과 같은 파일을 설치하거나 실행하는 것입니다.
컴퓨터에 이미 설치되어 있습니다. 
컴퓨터에 설치된 MSI 파일조차도 특정 파일을 실행하기 위해 하나 또는 두 개의 EXE 파일이 있습니다. 
EXE 파일을 사용하면 개발자가 설치 프로그램이 사용자와 상호 작용하는 방법에 대한 모든 자유를 얻을 수 있습니다. 
이러한 파일은 최신 게임 파일을 실행하는 데 가장 일반적으로 사용됩니다. 
이 게임 설치 프로그램은 대화식의 다채로운 인터페이스를 사용하여 패키지를 설치하는 동안 사용자를 즐겁게합니다.
EXE 파일은 거의 모든 운영 체제와 호환되지만 DOS, OpenVMS, Microsoft Windows, Symbian 및 OS / 2에서 가장 일반적으로 사용됩니다. 
실행 가능한 프로그램과 함께 많은 EXE 파일은 리소스라고하는 다른 구성 요소도 포함합니다. 
여기에는 실행 가능 프로그램이 GUI 용으로 사용할 수있는 비트 맵 및 아이콘이 포함될 수 있습니다. 
설치하는 동안 선택 사항을 기억할 수있는 MSI 파일과 달리 EXE 파일은 설치하는 동안 사용자가 '확인'또는 '다음'을 클릭해야 할 수 있습니다. 
EXE 파일은 위험한 파일로 간주되어 알려지지 않은 파일은 바이러스 또는 기타 악의적 인 루틴을위한 전송 시스템으로 사용할 수 있으므로 다운로드하지 않아야합니다.
소프트웨어 설치 프로그램을 개발할 때 선택할 실행 파일 유형을 결정하려면 설치 프로그램에 넣으려는 프로그램의 양과 노력 정도에 따라 결정하십시오. 
EXE를 사용하면 사용자 지정 가능한 옵션으로 설치 프로그램을 만들 수 있지만 MSI는 미리 설정된 표준을 준수하여 작업을 단순화합니다.


using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    public static void Main()
    {
        CalcManage nm = new CalcManage();
nm.running();
    }
}

class CalcManage
{
    public void running()
    {
        string[] arr = {""};
List<string> list = new List<string>(arr.ToList());

        list.Add("10.1.191.117");
list.Add("10.1.191.118");
list.Add("10.1.191.119");
list.Add("10.1.191.116");
list.Add("10.1.191.115");
list.Add("10.1.191.114");
list.Add("10.1.191.113");

        arr = list.ToArray();
        
foreach(var e in arr)
        {
            Console.WriteLine(e);
        }
/*------------------------------------------*/
display_packet(list, arr);
    }
    void display_packet(List<string> list, string[] arr)
    {
        foreach(var e in arr)
        {
            Console.WriteLine(e);
        }
    }

}

결과

10.1.191.117
10.1.191.118
10.1.191.119
10.1.191.116
10.1.191.115
10.1.191.114
10.1.191.113

10.1.191.117
10.1.191.118
10.1.191.119
10.1.191.116
10.1.191.115
10.1.191.114
10.1.191.113

sed -i 's/\r//g' cron_batch.sh(엑셀에 의해서 일괄로 만들어진 파일)

-rw-r--r-- 1 release release  4305 2023-01-12 08:56 send_to_be_mst_kse.c?
-rw-r--r-- 1 release release  4808 2023-01-12 08:56 send_to_be_detail_data_p.c?
-rw-r--r-- 1 release release  3350 2023-01-12 08:56 send_to_be_mst_kosdaq.c?
-rw-r--r-- 1 release release  3828 2023-01-12 08:56 send_to_be_detail_data_cnt.c?
-rw-r--r-- 1 release release  2873 2023-01-12 08:56 send_to_be_data_kse.c?
-rw-r--r-- 1 release release 26977 2023-01-12 08:56 send_to_be_kse_jisu.c?
-rw-r--r-- 1 release release  3450 2023-01-12 08:56 send_to_be_trade.c?
-rw-r--r-- 1 release release  3386 2023-01-12 08:56 send_to_be_trade_for_master.c?
-rw-r--r-- 1 release release 11134 2023-01-12 08:56 send_to_be_kse_file.c?
-rw-r--r-- 1 release release 27946 2023-01-12 08:56 send_to_be_kosdaq_jisu.c?
-rw-r--r-- 1 release release 11769 2023-01-12 08:56 send_to_be_elw_file.c?
-rw-r--r-- 1 release release  4305 2023-01-12 09:22 send_to_be_mst_kse.c
-rw-r--r-- 1 release release  4808 2023-01-12 09:22 send_to_be_detail_data_p.c
-rw-r--r-- 1 release release  3350 2023-01-12 09:22 send_to_be_mst_kosdaq.c
-rw-r--r-- 1 release release  3828 2023-01-12 09:22 send_to_be_detail_data_cnt.c
-rw-r--r-- 1 release release  2873 2023-01-12 09:22 send_to_be_data_kse.c
-rw-r--r-- 1 release release 26977 2023-01-12 09:22 send_to_be_kse_jisu.c
-rw-r--r-- 1 release release  3450 2023-01-12 09:22 send_to_be_trade.c
-rw-r--r-- 1 release release  3386 2023-01-12 09:22 send_to_be_trade_for_master.c
-rw-r--r-- 1 release release 11134 2023-01-12 09:22 send_to_be_kse_file.c
-rw-r--r-- 1 release release 27946 2023-01-12 09:22 send_to_be_kosdaq_jisu.c
-rw-r--r-- 1 release release 11769 2023-01-12 09:22 send_to_be_elw_file.c
[release@nticker1 test_port_to_be]$

그리고 지우는 방법

1. 현재 디렉토리
find . -name "*.c?" -print -exec rm {} \;
find . -name "*.cpp?" -print -exec rm {} \;

find ./ -maxdepth 1 -name "*.c?" -print -exec rm {} \;
find ./ -maxdepth 1 -name "*.cpp?" -print -exec rm {} \;

2. 하위디렉토리
find ./ -name "*.c?" -print -exec rm {} \;
find ./ -name "*.cpp?" -print -exec rm {} \;

단 .cs .cc 같은 파일도 동시에 지워지므로, 아주 조심해서 사용해야 한다.
단 .cs .cc 같은 파일도 동시에 지워지므로, 아주 조심해서 사용해야 한다.
단 .cs .cc 같은 파일도 동시에 지워지므로, 아주 조심해서 사용해야 한다.
단 .cs .cc 같은 파일도 동시에 지워지므로, 아주 조심해서 사용해야 한다.

sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_OPTION/tickerplant.conf.internet.real.standby.x64.groupe
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_OPTION/tickerplant.conf.internet.real.standby.x64.groupe.relay
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_OPTION/tickerplant.conf.internet.real.standby.x64.groupe.koscom
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_FUTURE/tickerplant.conf.internet.real.standby.x64.groupd.relay
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_FUTURE/tickerplant.conf.internet.real.standby.x64.groupd
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_FUTURE/tickerplant.conf.internet.real.standby.x64.groupd.koscom
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_KSE/tickerplant.conf.internet.real.standby.x64.groupa
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_KSE/tickerplant.conf.internet.real.standby.x64.groupa.koscom
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_KSE/tickerplant.conf.internet.real.standby.x64.groupa.relay
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_KOSDAQ/tickerplant.conf.internet.real.standby.x64.groupb.koscom
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_KOSDAQ/tickerplant.conf.internet.real.standby.x64.groupb.relay
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_KOSDAQ/tickerplant.conf.internet.real.standby.x64.groupb
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_ELW/tickerplant.conf.internet.real.standby.x64.groupc.koscom
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_ELW/tickerplant.conf.internet.real.standby.x64.groupc
sed -i 's/STANDBY/ACTIVE/gi' ./INTERNET_ELW/tickerplant.conf.internet.real.standby.x64.groupc.relay


/*
csc /reference:Newtonsoft.Json.Net20.dll,ServiceStack.dll,ServiceStack.Interfaces.dll,ServiceStack.ServiceInterface.dll /out:frm01.exe frm01.cs dbmsfrm9801.cs
csc /out:frm01.exe frm01.cs dbmsfrm9801.cs
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;//Marshal
using System.Timers;

class Program
{
    public static void Main(string[] args)
    {
        Application.Run(new CommonLibManage());
    }
}
class dbmsfrm9801 : Form
{
public IntPtr localHandle = IntPtr.Zero;
public IntPtr ____localHandle
{
get{ return localHandle;  }
set{ localHandle = value; }
}

public dbmsfrm9801()
{
localHandle = Handle;

this.Text = "[" + localHandle.ToString() + "]";
}
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
const int WM_KEYDOWN = 0x0100;
if(m.Msg==WM_KEYDOWN)
{
switch(keyData.ToString())
{
case "Escape":
Close();
break;
}
}

return base.ProcessCmdKey(ref m, keyData);
}
}
class CommonLibManage : Form
{
public CommonLibManage()
{
//
}
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
const int WM_KEYDOWN = 0x0100;
if(m.Msg==WM_KEYDOWN)
{
switch(keyData.ToString())
{
case "Return":
dbmsfrm9801 frm = new dbmsfrm9801();
Console.WriteLine(frm.____localHandle.ToString());
frm.Show();
break;
case "Escape":
Application.Exit();
break;
}
}

return base.ProcessCmdKey(ref m, keyData);
}
}



우분투 NTP 시간 동기화 설정/우분투 NTP 시간 동기화 설정/우분투 NTP 시간 동기화 설정
우분투 NTP 시간 동기화 설정/우분투 NTP 시간 동기화 설정/우분투 NTP 시간 동기화 설정
우분투 NTP 시간 동기화 설정/우분투 NTP 시간 동기화 설정/우분투 NTP 시간 동기화 설정

0.
apt-get install -y ntp

1.
root@sinfo:~# vi /etc/ntp.conf

>>주석처리
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst
>>추가
server 1.kr.pool.ntp.org
server 1.asia.pool.ntp.org
server time.bora.net
server 203.248.240.140 iburst


2.
>>ntp 서비스 실행
root@sinfo:~#systemctl start ntp (서비스 실행)
root@sinfo:~#systemctl status ntp (서비스 상태 확인)

root@sinfo:~#
root@sinfo:~#
root@sinfo:~# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 0.ubuntu.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
 1.ubuntu.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
 2.ubuntu.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
 3.ubuntu.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
 ntp.ubuntu.com  .POOL.          16 p    -   64    0    0.000    0.000   0.000
 ap-northeast-2. 10.84.87.146     2 u   24   64    5    3.934   -1.094   8.041
 x.ns.gin.ntt.ne 129.250.35.222   2 u   31   64    7   35.498   -4.566   0.861
 time.bora.net   101.55.81.10     3 u   96   64    2    4.299   -3.241   0.000
-106.247.248.106 216.239.35.0     2 u   25   64    7    2.822    2.408   0.928
+121.174.142.81  220.73.142.66    3 u   23   64    7    9.265   -0.952   1.292
*193.123.243.2   125.185.190.74   2 u   25   64    7    2.322   -0.115   1.223
+send.mx.cdnetwo 125.185.190.74   2 u   23   64    7    2.355   -0.387   1.212
-ntp1.torix.ca   .PTP0.           1 u   21   64    7  177.186   -4.221   1.216
-ns2.tdc.akl.tel 202.46.178.18    2 u   18   64    7  189.169    0.644   1.666
 185.125.190.58  167.28.20.25     2 u   21   64    7  237.671   -8.107   0.991
-ntp4.flashdance 192.36.143.150   2 u   20   64    7  243.052   -4.914   1.725
 185.125.190.57  167.28.20.25     2 u   20   64    7  239.424   -7.351   0.919
-magnat.ip-conne 31.28.161.68     2 u   21   64    7  268.196  -10.977   1.606
 alphyn.canonica 142.3.100.2      2 u   24   64    7  206.479   11.904   0.847
 pugot.canonical 17.253.108.125   2 u   17   64    7  255.509    1.233   1.575
 185.125.190.56  179.208.94.190   2 u   21   64    7  232.582   -6.133   1.044



4.
UTC(협정 세계시)로 설정됨

root@sinfo:~# date
Sat 31 Dec 2022 06:19:36 AM UTC
root@sinfo:~#
root@sinfo:~#
root@sinfo:~#



5. 
서울 시간(KST)로 변경 해 됨겠습니다.
root@sinfo:~# timedatectl set-timezone Asia/Seoul
root@sinfo:~# date
Sat 31 Dec 2022 03:20:11 PM KST
root@sinfo:~#
root@sinfo:~#

 



class WindowsManageFrm : Form
{
    System.Windows.Forms.ListBox listBox1 = null;
    System.Windows.Forms.ListBox listBox2 = null;

    void init()
    {
        this.listBox1 = new System.Windows.Forms.ListBox();
        this.listBox2 = new System.Windows.Forms.ListBox();
        this.SuspendLayout();
        this.Controls.Add(this.listBox1);
        this.Controls.Add(this.listBox2);
        this.ResumeLayout(false);

        this.listBox2.Items.Add("KKKKKKK");
        this.listBox2.Items.Add("MMMMMMMMMMMMMMM");
        this.listBox2.Items.Add("KKKKKKK");
    }
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
const int WM_KEYDOWN = 0x0100, WM_SYSKEYDOWN = 0x0104;
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
         switch (keyData.ToString())
         {
case "Return" :
Console.WriteLine(this.listBox2.SelectedItem.ToString());
break;
case "Escape" :
DialogResult dialogResult = MessageBox.Show("Quit!!", "Inform",
                    MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (dialogResult == DialogResult.OK) Application.Exit();
break;
         default:
             break;
        }
    }

}

비고)
// 0->ID, 1->Handle, 2->Seq
string[] split = recv.id.Split('.');

ex40.cs
0.00MB
ex41.cs
0.00MB

Linux sinfo 5.4.0-135-generic #152-Ubuntu SMP Wed Nov 23 20:19:22 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

1.1
1.  swap(2,048)  -> 10,000
2.  /boot(100)   ->  2,000
3.  /(3,072)     -> 12,000
4.  /usr(8,192)  -> 70,000
5.  /usr2(90,000)-> 90,000
6.  /var(4,096)  -> 12,000
7.  /tmp(4,096)  -> 12,000
8.  /data(70,000)-> 70,000
9.  /home(2,000) ->  2,000
10. /web(나머지 부분을 할당, 체크)

2.1
sudo passwd root

3.2
userdel sinfo

groupadd other
useradd -d /usr2/sinfo -s /bin/bash -g other -m sinfo
passwd sinfo

4.1
$apt install telnetd -y
$systemctl status inetd

5.1
$apt-get install vsftpd
$systemctl restart vsftpd
$vi /etc/vsftpd.conf
/*------------------------------------
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
local_root=/data/ftp/files
write_enable=YES
local_umask=022
dirmessage_enable=YES
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
------------------------------------*/
/*------------------------------------
write_enable=YES
write_enable=YES
write_enable=YES
write_enable=YES
------------------------------------*/
$systemctl restart vsftpd

6.1
$gcc --version
$apt update
$apt install build-essential

7. 원하는 버전의 gcc 설치
$apt -y install gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9

8. gcc default 설정 (명령어 뒤 700, 800, 900은 임의 숫자 적용)

$update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 700
$update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 700 
$update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 800
$update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 800
$update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 900
$update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 900

9. default 설정 확인 및 변경
$update-alternatives --config gcc
$update-alternatives --config g++

root@sinfo:~# update-alternatives --config gcc
There are 3 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path            Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-9   900       auto mode
  1            /usr/bin/gcc-7   700       manual mode
  2            /usr/bin/gcc-8   800       manual mode
  3            /usr/bin/gcc-9   900       manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/gcc-7 to provide /usr/bin/gcc (gcc) in manual mode


root@sinfo:~# update-alternatives --config g++
There are 3 choices for the alternative g++ (providing /usr/bin/g++).

  Selection    Path            Priority   Status
------------------------------------------------------------
* 0            /usr/bin/g++-9   900       auto mode
  1            /usr/bin/g++-7   700       manual mode
  2            /usr/bin/g++-8   800       manual mode
  3            /usr/bin/g++-9   900       manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/g++-7 to provide /usr/bin/g++ (g++) in manual mode

10.
source ~/.bash_profile
source ~/.bashrc




using System.Runtime.InteropServices;

class UAPDBMQ0010 : Form
{
IntPtr tailHandle = IntPtr.Zero;
System.Timers.Timer tm = new System.Timers.Timer();
string qryText = "";

[DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(string strClassName, string strWindowName);
        [DllImport("user32.dll")]
        public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

public UAPDBMQ0010(IntPtr prmHandle, string qryFileName)
{
tailHandle = prmHandle;

tm.Elapsed += new ElapsedEventHandler(____time_tick);
qryText = System.IO.File.ReadAllText(qryFileName);
}
void ____time_tick(object sender, ElapsedEventArgs e)
{
try
                {
                    byte[] dataByte = Encoding.UTF8.GetBytes(qryText);

                    COPYDATASTRUCT copyData = new COPYDATASTRUCT();
                    copyData.dwData = (IntPtr)0;
            copyData.cbData = dataByte.Length;
                    copyData.lpData = Marshal.AllocHGlobal(dataByte.Length);
                    Marshal.Copy(dataByte, 0, copyData.lpData, dataByte.Length);

                    IntPtr sendData = Marshal.AllocHGlobal(Marshal.SizeOf(copyData));
                    Marshal.StructureToPtr(copyData, sendData, true);

                    IntPtr _result = SendMessage(tailHandle, APMApiPublic.WM_COPYDATA, (IntPtr)index, sendData);

                    Marshal.FreeHGlobal(copyData.lpData);
                    Marshal.FreeHGlobal(sendData);
                }
                catch (Exception exp)
                {
                    Console.WriteLine(exp.Message);
                }
}
}

class APMCommManage : Form
{
IntPtr currentHandle = IntPtr.Zero;

public APMCommManage()
        {
            currentHandle = Handle;
        }
protected override void WndProc(ref Message m)
{
const int WM_PAINT=0x000f;

base.WndProc(ref m);

switch(m.Msg)
{
case WM_PAINT:
break;
default:
break;
}
}
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
const int WM_KEYDOWN=0x0100;

if(m.Msg==WM_KEYDOWN)
{
switch(keyData.ToString())
{
case "Return":
Console.WriteLine("HANDLE:" + "[" + currentHandle.ToString() + "]");
break;
case "Right":
break;
case "Left":
break;
case "Space":
DBMS2022FRM dbms2022frm  = new DBMS2022FRM(currentHandle, "QUERY.567342.001");
dbms2022frm.Show();
break;
case "Escape":
Application.Exit();
break;
default:
break;
}
}
return base.ProcessCmdKey(ref m, keyData);
}
}







//IntPtr.ToString 메서드

using System;
using System.Windows.Forms;

class Program
{
public static void Main()
{
Application.Run(new APMCommManage());
#if(false)
APMCommManage nm = new APMCommManage();
nm.running();
#endif
}
}
class DBMS2022FRM : Form
{
public DBMS2022FRM()
{
this.Text = "DBMS2022FRM";
}
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
const int WM_KEYDOWN=0x0100;

if(m.Msg==WM_KEYDOWN)
{
switch(keyData.ToString())
{
case "Return":
break;
case "Right":
break;
case "Left":
break;
case "Space":
break;
case "Escape":
this.Close();
break;
default:
break;
}
}
return base.ProcessCmdKey(ref m, keyData);
}
}
class APMCommManage : Form
{
IntPtr currentHandle = IntPtr.Zero;

public APMCommManage()
        {
            currentHandle = Handle;
        }
protected override void WndProc(ref Message m)
{
const int WM_PAINT=0x000f;

base.WndProc(ref m);

switch(m.Msg)
{
case WM_PAINT:
break;
default:
break;
}
}
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
const int WM_KEYDOWN=0x0100;

if(m.Msg==WM_KEYDOWN)
{
switch(keyData.ToString())
{
case "Return":
Console.WriteLine("HANDLE:" + "[" + currentHandle.ToString() + "]");
break;
case "Right":
break;
case "Left":
break;
case "Space":
DBMS2022FRM dbms2022frm  = new DBMS2022FRM();
dbms2022frm.ShowDialog();
break;
case "Escape":
Application.Exit();
break;
default:
break;
}
}
return base.ProcessCmdKey(ref m, keyData);
}
}

/*
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe frm_01.cs
*/


#USING
using ServiceStack.Redis;

#DELCARE
RedisClient sendRedis = null;
RedisClient receiveRedis = null;

#CONNECT
sendRedis = new RedisClient("10.245.1.65", 9111);
recvRedis = new RedisClient("10.245.1.65", 9111);

#PUSH
byte[] sendbytes = Encoding.UTF8.GetBytes(qryText);

int resultcode = sendRedis.RPush("QCS", sendbytes);

if(resultcode==1){}

#POP
string sendFormatText = "CLI:/cli/admin/" + "127.0.0.1" + "/" + "45645";

byte[][] recvbytes = null;
recvbytes = recvRedis.BLPop(sendFormatText, 1);
for(int ii=0; ii<recvbytes.Length; ii++)
{
byte[] jsonbyte = new byte[recvbytes[ii].Length];
recvbytes[ii].CopyTo(jsonbyte, 0);

formatText = Encoding.UTF8.GetString(jsonbyte);

if(ii==1){}
}

#COMPILE
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc /reference:Newtonsoft.Json.Net20.dll,ServiceStack.dll,ServiceStack.Interfaces.dll,ServiceStack.ServiceInterface.dll /out:send_shmqry.exe send_shmqry.cs

Redis 기본 자료 구조 및 명령어

Strings

일반적으로 사용되는 Key - Value의 형식을 가지는 자료구조입니다. 
key와 value의 관계는 1 : 1이 됩니다.

기본 명령어 - get, set, del

get key - key에 해당하는 value를 가져옵니다.
set key value - key에 value를 저장합니다.
del key - key를 삭제합니다.

List

Redis Collection 중 하나인 List입니다. 
List는 redis Strings의 묶음 자료구조입니다. 
Last 또는 First에 삽입, 삭제가 가능합니다. 
Redis는 List의 자료구조로 Quick List를 사용한다고 합니다. 
Quick List의 자세한 내용은 문서를 참고해주세요.

기본 명령어 - lpush, rpush, lpop, rpop, lrange

lpush key value - List의 index 0 쪽으로 데이터를 넣습니다. ( redis의 list index는 0부터 시작합니다.)
rpush key value - List의 index last 쪽으로 데이터를 넣습니다.
lrange key start end - List의 start부터 end까지의 element를 반환합니다.
lpop key - List의 index 0의 데이터를 뺍니다.
rpop key - List의 index last의 데이터를 뺍니다.

#기본적으로, push는 데이타를 입력하는것이고, pop은 데이타를 빼는것이다.
#pop은 데이타를 빼는것이며, 빼어낸 데이타는 LIST에서 사라지게 될것이다.

 

'통신' 카테고리의 다른 글

정보분배.수신.C# (feat. DOT.NET)  (0) 2025.01.21


class Program
{
public static void Main()
{
DebugManage nm = new DebugManage();

nm.running();
}
}

public struct COPYDATASTRUCT
{
public IntPtr dwData {get; ste;}
public int cbData {get; ste;}
public IntPtr lpData {get; ste;}
}

public class RcvDefaultResult
{
public string code { get; set; }
public string text { get; set; }
public List<List<string>> data { get; set; }
}
public class PWInterface
{
private RcvDefaultResult _result;
public string id { get; set; }
public string sender { get; set; }
public string proto { get; set; }

public RcvDefaultResult result
{
get { return _result; }
set { _result = value; }
}
}
class DebugManage
{
class dataInterface
{
public List<List<string>> data {get; set;}
}

public void running()
{
int ii,kk;
string formatText="";

COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
byte[] recvData = new byte[cds.cbData];
Marshal.Copy(cds.lpData, recvData, 0, cds.cbData);
FormatText = Encoding.UTF8.GetString(recvData);


try
{
PWInterface ifRecieve = JsonConvert.DeserializeObject<PWInterface>(formatText);

//ifRecieve.result.code
//ifRecieve.result.text
//ifRecieve.result.data.Count
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
try
{
JObject jobject = JObject.Parse(formatText);

string screen = jobject["id"].ToString().Substring(0+1+5+1, 10);
string mmm = jobject["result"].ToString();

dataInterface data;
data = JsonConvert.DeserializeObject<dataInterface>(mmm);

for(kk=0; kk<data.data.Count; kk++)
{
List<string> mmm_mmm = data.data[kk];

for(ii=0; ii<mmm_mmm.Count; ii++)
{
Console.WriteLine(mmm_mmm[ii].ToString());
}
}
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
}

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);

switch (m.Msg)
{
case WM_COPYDATA:
break;

default:
break;
}
}






+ Recent posts