1. 1단계 - Visual Studio 부트스트래퍼 다운로드

Download the correct bootstrapper for the version and edition of Visual Studio you want

Create a network-based installation - Visual Studio (Windows) | Microsoft Learn

Edition                                        Bootstrapper
Visual Studio 2022 Enterprise    vs_enterprise.exe
Visual Studio 2022 Professional vs_professional.exe
Visual Studio 2022 Community   vs_community.exe
Visual Studio 2022 Build Tools    vs_buildtools.exe


2. 2단계 - 로컬 레이아웃 만들기
vs_enterprise.exe --layout c:\localVSlayout



3. 3단계
vs_setup.exe --config d:\takeover\vsconfig\myconfig.vsconfig

 

Create a network-based installation - Visual Studio (Windows)

Create a private network install point to deploy Visual Studio to support enterprise users with limited permissions or client machines with limited internet access.

learn.microsoft.com

 

4. 4단계

Microsoft Visual Studio Installer Projects 2022 확장프로그램 download

InstallerProjects2022.vsix 를 클릭해서 진행하면 된다.(자동설치)

Microsoft Visual Studio Installer Projects 2022 - Visual Studio Marketplace

 

Microsoft Visual Studio Installer Projects 2022 - Visual Studio Marketplace

Extension for Visual Studio - This official Microsoft extension provides support for Visual Studio Installer Projects in Visual Studio 2022.

marketplace.visualstudio.com




# visual studio offline 2019->2022 설치

# visual studio offline 2019가 이미 설치되어져 있다.
# visual studio offline 2022를 동시에 설치한다.

- 현재 장비에 인터넷은 되지 않는다. 통합설치는 불가능하고, 개별설치로 2019를 설치해서 사용중이다.
- 어찌 어찌 visual studio offline 2019 버젼을 설치해서 소스코드를 빌드해서 사용중이다.
- 이제 visual studio offline 2022버젼을 설치해야 한다. 물론 이것도 개별설치로 진행해야 할것이다. 통합설치는 불가능.



    - (참고문헌의 예)
    - (99.9) Visual Studio(2019) 설치 관리자를 엽니다. 제품 카드에서 기타 단추를 선택한 후 구성 내보내기를 선택합니다.

- Visual studio offline 2022버젼 binary 폴더로 이동한다.
- (99.9)의 내용을 d:\tmp\memo\myconfig.vsconfig로 저장한다.
- 아래의 shell을 실행한다.
- vs_setup.exe --config d:\tmp\memo\myconfig.vsconfig
- 실행결과 (?)
- InstallerProjects2022.visx 확장프로그램 더블클릭시에, 자동실행
- Visual Studio 2022에 확장 이식가능.
- Visual Studio 2019는 InstallerProjects.visx로 해야한다.
- 실행결과 (?)

호환적인부분에서 문제점이 발견되어진다. 해결방법은(?)


 

Visual studio 2019 Installer 내보내기결과)

{
  "version": "1.0",
  "components": [
    "Microsoft.VisualStudio.Component.CoreEditor",
    "Microsoft.VisualStudio.Workload.CoreEditor",
    "Microsoft.VisualStudio.Component.NuGet",
    "Microsoft.VisualStudio.Component.Roslyn.Compiler",
    "Microsoft.VisualStudio.Component.Roslyn.LanguageServices",
    "Microsoft.Net.Component.4.8.SDK",
    "Microsoft.Net.Component.4.7.2.TargetingPack",
    "Microsoft.Net.ComponentGroup.DevelopmentPrerequisites",
    "Microsoft.Component.MSBuild",
    "Microsoft.VisualStudio.Component.TextTemplating",
    "Microsoft.Net.Component.4.TargetingPack",   -> 2022에 적용되지 않음(?)
    "Microsoft.Net.Component.4.6.TargetingPack",
    "Microsoft.VisualStudio.Component.DiagnosticTools",
    "Microsoft.VisualStudio.Component.AppInsights.Tools",
    "Microsoft.VisualStudio.Component.IntelliCode",
    "Microsoft.Net.Component.4.8.TargetingPack",
    "Microsoft.VisualStudio.Component.VSSDK",
    "Microsoft.VisualStudio.ComponentGroup.VisualStudioExtension.Prerequisites",
    "Microsoft.VisualStudio.Component.DslTools",
    "Microsoft.Component.CodeAnalysis.SDK",
    "Microsoft.VisualStudio.Workload.VisualStudioExtension",
    "Microsoft.Component.ClickOnce"
  ]
}

 

Windows Form 실행시에 Message 순서출력
Windows Form 실행시에 Message 순서출력, Windows Form 실행시에 Message 순서출력

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private IntPtr tailHandle = IntPtr.Zero;
        int index = 0;
        public Form1()
        {
            InitializeComponent();

            //this.Visible=false;
        }
        private void SendToTail(int index, string data)
        {
            tailHandle = APMApiPublic.FindWindow(null, "DEBUGDEBUGDEBUG");
            if (tailHandle != IntPtr.Zero && data.Length > 0 && APMApiPublic.IsWindow(tailHandle))
            {
                try
                {
                    byte[] dataByte = Encoding.UTF8.GetBytes(data);

                    APMApiPublic.COPYDATASTRUCT copyData = new APMApiPublic.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 = APMApiPublic.SendMessage(tailHandle, APMApiPublic.WM_COPYDATA, (IntPtr)index, sendData);

                    Marshal.FreeHGlobal(copyData.lpData);
                    Marshal.FreeHGlobal(sendData);
                }
                catch (Exception exp)
                {
                    //MessageBox.Show(exp.Message);
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SendToTail(1, "(Form1_Load)()()()()()[INDEX]:" + index.ToString("0000000"));
            index++;
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            SendToTail(1, "(Form1_Shown)()()()()()[INDEX]:" + index.ToString("0000000"));
            index++;
        }

        private void Form1_Enter(object sender, EventArgs e)
        {
            SendToTail(1, "(Form1_Enter)()()()()()[INDEX]:" + index.ToString("0000000"));
            index++;
        }

        private void Form1_ForeColorChanged(object sender, EventArgs e)
        {
            SendToTail(1, "(Form1_ForeColorChanged)()()()()()[INDEX]:" + index.ToString("0000000"));
            index++;
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            SendToTail(1, "(Form1_FormClosed)()()()()()[INDEX]:" + index.ToString("0000000"));
            index++;
        }

        private void Form1_Activated(object sender, EventArgs e)
        {
            SendToTail(1, "(Form1_Activated)()()()()()[INDEX]:" + index.ToString("0000000"));
            index++;
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            SendToTail(1, "(Form1_Paint)()()()()()[INDEX]:" + index.ToString("0000000"));
            index++;
        }
    }
}

 

 

 

현재 로칼 컴퓨터의 아이피 알아내기





using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Diagnostics;
using System;
using System.Linq;
using System.Net;

class Program
{
    public static void Main(string[] args)
    {
        NETNM nmm = new NETNM();
        nmm.RUN();
    }
}
class NETNM
{
    public void RUN()
    {
        var host = Dns.GetHostEntry(Dns.GetHostName());
        foreach (var ip in host.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                Console.WriteLine(ip.ToString());
            }
        }
    }
}

 

Spy++을 이용하면 특정윈도우핸들에 보낸 메세지(WM_KEYDOWN + VK_ESCAPE)가 나타남을 확인할수 있다.

 

/*
1. 목적: A라는 대상 Utility의 기능들을 B라는 다른 Utility에서
Window Message(SendMessage)를 통해 제어하는 방법과 실험을 실시.

2. 구현 - 간략 설명.
A.EXT : SPY++로 Caption Title을 찾아 FindWindow로 핸들을 찾아와,

SendMessage로 해당 핸들에 메세지 및 W/L param를 전송한다.
3. 구현 - 코드
*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Xml;
using System.Text.RegularExpressions;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

class Program
{
    public static void Main(string[] args)
    {
        Application.Run(new KAKAONM());
    }
}
class KAKAONM : Form
{
    [DllImport("user32.dll")]public static extern int FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll")]public static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);


    const int WM_KEYDOWN = 0x0100;
    const int VK_ESCAPE = 0x1B;

    public DialogResult InputBox(string title, string content, ref string value)
    {
        Form form = new Form();
        PictureBox picture = new PictureBox();
        Label label = new Label();
        TextBox textBox = new TextBox();
        Button buttonOk = new Button();
        Button buttonCancel = new Button();

        form.ClientSize = new Size(300, 100);
        form.Controls.AddRange(new Control[] { label, picture, textBox, buttonOk, buttonCancel });
        form.FormBorderStyle = FormBorderStyle.FixedDialog;
        form.StartPosition = FormStartPosition.CenterScreen;
        form.MaximizeBox = false;
        form.MinimizeBox = false;
        form.AcceptButton = buttonOk;
        form.CancelButton = buttonCancel;
        
        form.Text = title;
        picture.SizeMode = PictureBoxSizeMode.StretchImage;
        label.Text = content;
        textBox.Text = value;
        buttonOk.Text = "확인";
        buttonCancel.Text = "취소";

        buttonOk.DialogResult = DialogResult.OK;
        buttonCancel.DialogResult = DialogResult.Cancel;

        picture.SetBounds(10, 10, 50, 50);
        label.SetBounds(65, 17, 200, 20);
        textBox.SetBounds(65, 40, 220, 20);
        buttonOk.SetBounds(135, 70, 70, 20);
        buttonCancel.SetBounds(215, 70, 70, 20);

        DialogResult dialogResult = form.ShowDialog();

        value = textBox.Text;
        return dialogResult;
    }
    public KAKAONM()
    {
        //
    }
    protected override bool ProcessCmdKey(ref Message message, Keys keyData)
    {
        switch (message.Msg)
        {
            case WM_KEYDOWN:
                if (keyData.ToString() == "Escape")
                {
                     Application.Exit();
                }
                else if (keyData.ToString() == "Space")
                {
                      //
                }
                else if (keyData.ToString() == "Return")
                {
                    string HEXAVALUE = "";
                    int VALUE10 = 0;
                    IntPtr HANDLENM  = IntPtr.Zero;

                    if (InputBox("HEXA CODE", "VALUE", ref HEXAVALUE) == DialogResult.OK)
                    {
                        VALUE10 = Convert.ToInt32(HEXAVALUE, 16);
                        Console.WriteLine(VALUE10.ToString());

                        HANDLENM = Marshal.StringToHGlobalAuto(HEXAVALUE);
                        Console.WriteLine(HANDLENM.ToString() + "");

                        //SendMessage(HANDLENM, WM_KEYDOWN, VK_ESCAPE, 0);
                        // [DllImport("user32.dll")]public static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);에 선언되어진 입력데이타 파라미터를 준수함.
                        SendMessage(VALUE10, WM_KEYDOWN, VK_ESCAPE, 0);
                    }
                }
                break;
            default:
                break;
        }
        return base.ProcessCmdKey(ref message, keyData);
    }
}








case1)
gcc -c send.c
gcc -o send send.o -lws2_32

case2)
gcc -o send send.o -lwsock32

/*
C:\Users\Downloads>gcc -c a12.c
a12.c: In function 'main':
a12.c:8:2: warning: implicit declaration of function 'scanf_s' [-Wimplicit-function-declaration] scanf_s("%s", NN, sizeof(NN));

*/

해당 오류는 VSCode에서 scanf_s 함수를 사용했을 때 발생한다.
scanf_s는 기존 scanf 함수에 비해 보안이 강화된 함수로 Visual Studio에만 내장되어 있는 함수이다.
따라서 사용하기 위해선 해당 헤더를 따로 추가해주어야 한다.

/*
소스
*/
#include <stdio.h>

int main(int argc, char *argv[])
{
    char NN[5];

    printf(">>");
    scanf_s("%s", NN, sizeof(NN));
    printf(">>[%s]\n",NN);

    return 0;
}

 

/*
문제
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.
게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다.
뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다.

먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
만약 벽이나 자기자신의 몸과 부딪히면 게임이 끝난다.
만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.
사과의 위치와 뱀의 이동경로가 주어질 때 이 게임이 몇 초에 끝나는지 계산하라.

입력
첫째 줄에 보드의 크기 N이 주어진다. (2 ≤ N ≤ 100) 다음 줄에 사과의 개수 K가 주어진다. (0 ≤ K ≤ 100)
다음 K개의 줄에는 사과의 위치가 주어지는데, 첫 번째 정수는 행, 두 번째 정수는 열 위치를 의미한다. 사과의 위치는 모두 다르며, 맨 위 맨 좌측 (1행 1열) 에는 사과가 없다.
다음 줄에는 뱀의 방향 변환 횟수 L 이 주어진다. (1 ≤ L ≤ 100)
다음 L개의 줄에는 뱀의 방향 변환 정보가 주어지는데, 정수 X와 문자 C로 이루어져 있으며. 게임 시작 시간으로부터 X초가 끝난 뒤에 왼쪽(C가 'L') 또는 오른쪽(C가 'D')로 90도 방향을 회전시킨다는 뜻이다. X는 10,000 이하의 양의 정수이며, 방향 전환 정보는 X가 증가하는 순으로 주어진다.
*/

using System;
using System.IO;
using System.Timers;

class Program
{
    public static void Main(string[] args)
    {
        if(args.Length == 1)
        {
            SNAKENM nm = new SNAKENM();
            nm.RUN("EX");
        }
        else
        {
            SNAKENM nm = new SNAKENM();
            nm.RUN();
        }
    }
}       
class SNAKENM
{
    static int MAPY = 100;
    static int MAPX = 100;

    const int LEFT = 1000;
    const int RIGHT = 1001;
    const int DOWN = 1002;
    const int UP = 1003;
    const int ROTATION_DEGREE_90_RIGHT = 10;
    const int ROTATION_DEGREE_90_LEFT = 20;
    const int EXIT_EVENT = -99;
    const int APPLE_EVENT = 2;
    const int APPLE_DELETE_EVENT = 3;

    int[] TIMER_EVENT = new int[1024];
    int[] TIMER_EVENT_DETAIL = new int[1024];
    int TIMER_EVENT_CNT=0;
    int timer_index = 0;

    int[,] APPLE = new int[MAPY,MAPX];
    int draw_apple_event = 0;
    int[,] BOARD = new int[MAPY,MAPX];
    int[] BOARD_POSITION_X = new int[MAPX];
    int[] BOARD_POSITION_Y = new int[MAPY];
    int position_index=0;
    int apple_delete_event_index=0;
    int APPLE_CNT=0;

    int xpos = 1;
    int ypos = 1;
    int direction = LEFT;
    int timer = 0;

    Timer tm = new Timer();

    public void RUN()
    {
        DATA_READ();
        DATA_INIT();
        TIME_INIT();

        ConsoleKeyInfo keyInfo;
        while(true)
        {
            keyInfo=Console.ReadKey(true);
            if(keyInfo.Key == ConsoleKey.Escape) break;
        }
    }
    void TIME_TICK(object sender, ElapsedEventArgs e)
    {
        timer++;

        if(direction == LEFT) xpos++;
        else if(direction == RIGHT) xpos--;
        else if(direction == UP) ypos--;
        else if(direction == DOWN) ypos++;

        if( (BOARD[ypos,xpos]==EXIT_EVENT) || (BOARD[ypos,xpos]==1))
        {
            tm.Stop();
            tm=null;
            Console.WriteLine("[TIME]:" + timer.ToString("00000"));
            Environment.Exit(0);
        }

        //APPLE EVENT
        if(APPLE[ypos,xpos]==APPLE_EVENT)
        {
            draw_apple_event = APPLE_EVENT;
            APPLE[ypos,xpos]=APPLE_DELETE_EVENT;

            if(direction == LEFT) xpos--;
            else if(direction == RIGHT) xpos++;
            else if(direction == UP) ypos++;
            else if(direction == DOWN) ypos--;
        }
        else if(APPLE[ypos,xpos]==APPLE_DELETE_EVENT)
        {
            draw_apple_event = APPLE_DELETE_EVENT;

            //마지막꼬리의 값을 없앤다.
            int xx = BOARD_POSITION_X[apple_delete_event_index];
            int yy = BOARD_POSITION_Y[apple_delete_event_index];
            BOARD[yy,xx] = 0;
            apple_delete_event_index++;
        }
        else
        {
            draw_apple_event = 0;
        }

        BOARD[ypos,xpos]=1;
        BOARD_POSITION_X[position_index] = xpos;
        BOARD_POSITION_Y[position_index] = ypos;
        position_index++;

        if(timer == TIMER_EVENT[timer_index])
        {
            if(TIMER_EVENT_DETAIL[timer_index]==ROTATION_DEGREE_90_LEFT)
            {
                if(direction==LEFT) direction = UP;
                else if(direction==UP) direction = RIGHT;
                else if(direction==RIGHT) direction = DOWN;
                else if(direction==DOWN) direction = LEFT;
            }
            else if(TIMER_EVENT_DETAIL[timer_index]==ROTATION_DEGREE_90_RIGHT)
            {
                if(direction==LEFT) direction = DOWN;
                else if(direction==UP) direction = LEFT;
                else if(direction==RIGHT) direction = UP;
                else if(direction==DOWN) direction = RIGHT;
            }
            timer_index++;
        }

        DRAW();
    }
    public void RUN(string EX)
    {
        DATA_INIT(EX);
        TIME_INIT();

        ConsoleKeyInfo keyInfo;
        while(true)
        {
            keyInfo=Console.ReadKey(true);
            if(keyInfo.Key == ConsoleKey.Escape) break;
        }
    }
    void DATA_READ()
    {
        string inputText = "";
        int index = 0;

        while(true)
        {
            if(index == 0)
            {
                Console.WriteLine("1. MAPY * MAPX");
                inputText = Console.ReadLine();

                MAPX=Convert.ToInt32(inputText) + 2;
                MAPY=Convert.ToInt32(inputText) + 2;
            }
            else if(index == 1)
            {
                Console.WriteLine("2. APPLE_CNT");
                inputText = Console.ReadLine();

                APPLE_CNT=Convert.ToInt32(inputText);
            }
            else if(index == 2)
            {
                for(int ii=0; ii<APPLE_CNT; ii++)
                {
                    Console.WriteLine("3. APPLE_POSITION:[" + (ii+1).ToString("00") + "]");
                    inputText = Console.ReadLine();

                    string[] position = (inputText).Split(' ');
                    if(position.Length != 2)
                    {
                        Console.WriteLine("invalid data error!!");
                        Environment.Exit(0);
                    }

                    int yy = Convert.ToInt32(position[0]) + 1;
                    int xx = Convert.ToInt32(position[1]) + 1;

                    APPLE[yy,xx]=APPLE_EVENT;
                }
            }
            else if(index == 3)
            {
                Console.WriteLine("4. TIMER_EVENT_CNT");
                inputText = Console.ReadLine();

                TIMER_EVENT_CNT=Convert.ToInt32(inputText);
            }
            else if(index == 4)
            {
                for(int ii=0; ii<TIMER_EVENT_CNT; ii++)
                {
                    Console.WriteLine("5. TIMER EVENT DETAIL:[" + (ii+1).ToString("00") + "]");
                    inputText = Console.ReadLine();     

                    string[] position = (inputText).Split(' ');
                    if(position.Length != 2)
                    {
                        Console.WriteLine("invalid data error!!");
                        Environment.Exit(0);
                    }

                    TIMER_EVENT[ii] = Convert.ToInt32(position[0]);
                    if(position[1] == "L") TIMER_EVENT_DETAIL[ii] = ROTATION_DEGREE_90_LEFT;
                    else if(position[1] == "D") TIMER_EVENT_DETAIL[ii] = ROTATION_DEGREE_90_RIGHT;
                }
                break;
            }
            index++;
        }
    }
    void DATA_INIT(string EX)
    {
        MAPX = 10 + 2;
        MAPY = 10 + 2;

        APPLE[1,5]=APPLE_EVENT;
        APPLE[1,3]=APPLE_EVENT;
        APPLE[1,2]=APPLE_EVENT;
        APPLE[1,6]=APPLE_EVENT;
        APPLE[1,7]=APPLE_EVENT;

        TIMER_EVENT[0]=8;
        TIMER_EVENT_DETAIL[0]=ROTATION_DEGREE_90_RIGHT;

        TIMER_EVENT[1]=10;
        TIMER_EVENT_DETAIL[1]=ROTATION_DEGREE_90_RIGHT;

        TIMER_EVENT[2]=11;
        TIMER_EVENT_DETAIL[2]=ROTATION_DEGREE_90_RIGHT;

        TIMER_EVENT[3]=13;
        TIMER_EVENT_DETAIL[2]=ROTATION_DEGREE_90_LEFT;

        for(int ii=0; ii<MAPY; ii++)
        {
        BOARD[ii,0]=-99;
        BOARD[ii,MAPX-1]=-99;
        }
        for(int kk=0; kk<MAPX; kk++)
        {
        BOARD[0,kk]=-99;
        BOARD[MAPY-1,kk]=-99;
        }
        BOARD[ypos,xpos]=1;
        BOARD_POSITION_X[position_index] = xpos;
        BOARD_POSITION_Y[position_index] = ypos;
        position_index++;
    }
    void DATA_INIT()
    {
        for(int ii=0; ii<MAPY; ii++)
        {
            BOARD[ii,0]=-99;
            BOARD[ii,MAPX-1]=-99;
        }
        for(int kk=0; kk<MAPX; kk++)
        {
        BOARD[0,kk]=-99;
        BOARD[MAPY-1,kk]=-99;
        }
        BOARD[ypos,xpos]=1;
    }
    void TIME_INIT()
    {
        tm.Elapsed += new ElapsedEventHandler(TIME_TICK);
        tm.Interval = 1000;
        tm.Start();
    }   
    void DRAW()
    {
        string mmmText = "";

        mmmText += "[" + timer.ToString("00000") + "]" + ",EVENT[" + draw_apple_event.ToString("00000") + "]" + ",X[" + ypos.ToString("00000") + "]" + ",Y[" + xpos.ToString("00000") + "]" + "\n";
        for(int ii=0; ii<MAPY; ii++)
        {
            for(int kk=0; kk<MAPX; kk++)
            {
                if(BOARD[ii,kk]==1) mmmText += "[**]";
                else mmmText += ii.ToString("00") + kk.ToString("00");
            }
            mmmText += "\n";
        }
        Console.WriteLine(mmmText);
        Console.WriteLine("");
    }
}

 

 

파일첨부)

snake2.cs
0.01MB

문제

'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.

게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다.

뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다.

  • 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
  • 만약 벽이나 자기자신의 몸과 부딪히면 게임이 끝난다.
  • 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
  • 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.

사과의 위치와 뱀의 이동경로가 주어질 때 이 게임이 몇 초에 끝나는지 계산하라.

입력

첫째 줄에 보드의 크기 N이 주어진다. (2 ≤ N ≤ 100) 다음 줄에 사과의 개수 K가 주어진다. (0 ≤ K ≤ 100)

다음 K개의 줄에는 사과의 위치가 주어지는데, 첫 번째 정수는 행, 두 번째 정수는 열 위치를 의미한다. 사과의 위치는 모두 다르며, 맨 위 맨 좌측 (1행 1열) 에는 사과가 없다.

다음 줄에는 뱀의 방향 변환 횟수 L 이 주어진다. (1 ≤ L ≤ 100)

다음 L개의 줄에는 뱀의 방향 변환 정보가 주어지는데, 정수 X와 문자 C로 이루어져 있으며. 게임 시작 시간으로부터 X초가 끝난 뒤에 왼쪽(C가 'L') 또는 오른쪽(C가 'D')로 90도 방향을 회전시킨다는 뜻이다. X는 10,000 이하의 양의 정수이며, 방향 전환 정보는 X가 증가하는 순으로 주어진다.

출력

첫째 줄에 게임이 몇 초에 끝나는지 출력한다.

using System;
using System.IO;

class Program
{
    public static void Main()
    {
        CHKNM nm = new CHKNM();
        nm.RUN();
    }
}

class CHKNM
{
    public string SPACEPADDING(string strText)
     {
         string specialToekn = "#";
         string mmmText = strText.ToUpper();
         mmmText = mmmText.Replace(" ", specialToekn);

         string mmmToken = "";
         for(int iii=20; iii >= 1; iii--)
         {
             mmmToken = "";
             for(int kkk=iii; kkk >= 1; kkk--)
             {
                 mmmToken += specialToekn;
             }
             mmmText = mmmText.Replace(mmmToken, " ");
         }
         mmmText = mmmText.Replace(specialToekn, " ");

         return mmmText;
     }
     public void RUN()
     {
         string qryText = "    SELECT    STOCK_CODE,    OPEN,    HIGH,   LOW,    CLOSE    FROM     SQSTRDAE   WHERE    STOCK_CODE    like '%005930%';";

         Console.WriteLine(    SPACEPADDING(qryText));
     }
}

public string SPACEPADDING(string strText)
{
    string specialToken = "#";
    string mmmText = strText.ToUpper();
    mmmText = mmmText.Replace(" ", specialToken );

    string mmmToken = "";
    for(int iii=20; iii >= 1; iii--)
    {
        mmmToken = "";
        for(int kkk=iii; kkk >= 1; kkk--)
        {
            mmmToken += specialToken ;
        }
        mmmText = mmmText.Replace(mmmToken, " ");
    }
    mmmText = mmmText.Replace( specialToken, " ");

    return mmmText;
}



■ 깃허브 vs. 깃랩(GITHUB/GITLAB)
■ 깃허브 vs. 깃랩(GITHUB/GITLAB)
■ 깃허브 vs. 깃랩(GITHUB/GITLAB)
■ 깃허브 vs. 깃랩(GITHUB/GITLAB)



소스코드 저장소 호스팅의 양대산맥인 깃허브와 깃랩은 그 기술적 기반을 '깃(Git)'으로 삼는다는 점에서 큰 차이를 보이지 않는다. 
기본 기능은 같지만 서비스를 만든 철학과 초점에 차이를 갖기 때문에, 사용자는 목적과 업무 체계를 고려해 적합한 서비스를 골라야 한다.
최근 미국 지디넷은 깃허브와 깃랩의 개발 방향성 차이점과 인터페이스 및 핵심 가치의 유사성을 설명하는 기사를 게재했다
오픈소스 소프트웨어 전문기자인 스티븐 보간니콜스는 먼저 "만약 사내 시스템만 구축하는 경우라면 자체 서버에 자체 깃 인스턴스만 있으면 되고, 자체 서버나 클라우드에 중앙화된 VCS로서 깃을 사용할 수 있다"며 "자체적으로 VCS를 구축할 수 있을 때 VCS 서비스를 구독할 필요는 없으며, 이 모델로 당신은 프로젝트를 전세계에 흩어져있는 팀, 파트너와 쉽게 실행할 수 있다"고 당부했다.

■ 깃허브와 깃랩의 핵심 차이점 '데브옵스'
깃허브와 깃랩의 가장 큰 차이점은 데브옵스 요소에 있다.
깃랩은 지속적 통합/지속적 전달(CI/CD)와 데브옵스 워크플로우를 내장했다.
반면, 깃허브를 사용하면 사용자가 원하는 CI/CD 도구를 직접 통합해야 한다. 깃허브 사용자는 보통 젠킨스, CircleCI, TravisCI 같은 써드파티 프로그램을 사용한다.
또 다른 차이점은 철학이다. 깃허브가 속도를 우선시 한다면, 깃랩은 안정성에 중점을 둔다.

■ 브랜치, 병합이냐 분리냐
깃허브는 새로운 브랜치를 마스터 분기와 병합하는 것을 지지한다. 
그 덕에 신속한 배포가 가능하고, 문제 발생 시 이전 버전으로 신속하게 복원할 수 있다.
깃랩의 워크플로우는 변경한 각 세트를 마스터 브랜치와 별도의 안정적인 브랜치로 생성한다. 프로덕션과 스테이징의 분기가 최소한으로 있다. 
이런 다중 분기 접근방식은 여러 단계의 테스트 프로세스를 필요로 한다. 병합 요청 시 코드 검토가 까다로워진다.
이런 다중 분기 접근방식은 여러 단계의 테스트 프로세스를 필요로 한다. 병합 요청 시 코드 검토가 까다로워진다.
이런 다중 분기 접근방식은 여러 단계의 테스트 프로세스를 필요로 한다. 병합 요청 시 코드 검토가 까다로워진다.
이런 다중 분기 접근방식은 여러 단계의 테스트 프로세스를 필요로 한다. 병합 요청 시 코드 검토가 까다로워진다.
단, 깃허브나 깃랩에서 브랜치 운영 방식을 병합이나 분리로 고정하진 않는다. 사용자 선택에 따라 원하는 방식을 택할 수 있다.

■ 소프트웨어 서비스
두 서비스의 또 다른 차이점은 소프트웨어 서비스의 구성이다.
깃랩은 완전한 소프트웨어 개발 솔루션을 제공하며, 올인원의 데브옵스 플랫폼이라고 강조한다. 
깃랩은 지라(Jira), 마이크로소프트 팀즈, 슬랙, G메일 같은 애프리케이션 및 플랫폼과 통합을 제공한다.
깃허브는 자체적으로 깃랩보다 적은 수의 소프트웨어 서비스를 제공한다. 
대신 외부 프로그램 및 서비스와 통합하는 쉬운 방법을 제공한다. 깃허브 마켓플레이스에서 다양한 외부 서비스와 프로그램, 깃허브와 통합을 위한 소프트웨어를 이용할 수 있다.

■ 기본 구성과 인터페이스는 유사
깃허브와 깃랩은 여러모로 닮았다. 리눅스 서버에서 실행된다는 점, 이슈 트래커를 함께 제공한다는 점, 광범위한 타사 통합과 가져오기 도구를 제공한다.
인터페이스도 비슷하다. 고급 개발자를 위한 커맨드라인인터페이스(CLI)를 가졌고, 초급 개발자를 위한 웹 인터페이스도 제공한다.
깃랩의 사용자 인터페이스(UI)는 자체 디자인 시스템인 '파자마스(Pajamas)'를 사용하며, 이 시스템은 '뷰JS(Vue.js)'로 작성됐다.
깃허브의 UI인 데스크톱은 윈도나 맥OS에서 사용가능하다. 또 비주얼스튜디오를 사용하는 것도 가능하다.
두 서비스 모두 오픈소스를 지원하지만, 저장소 자체는 혼합 프로그래밍 모델을 사용한다.
깃랩은 오픈 중심의 비즈니스 접근 방식을 사용한다. 깃랩 커뮤니티 에디션은 무료로 제공하고, 더 많은 기능과 지원을 제공하는 엔터프라이즈 버전은 유료다.
깃허브는 코드에 일부 오픈소스를 포함하지만, 그 자체는 오픈소스 프로젝트가 아니다.
기본적으로 깃허브와 깃랩 모두 오픈소스의 웹 기반 리포지톨, 깃 기반 코드 관리, 원격 리포지토리를 통한 로컬 파일 변경 등을 제공한다. 기본적인 깃 기능을 원하지만 깃을 계속 실행하는 것을 걱정하는 경우 두 서비스 모두 유용하다.

■ 마이크로소프트와 깃허브
마이크로소프트는 깃허브를 2018년 인수했다. 많은 사람이 당시 대규모 사용자 이탈을 예상했다. 
마이크로소프트가 오픈소스 소프트웨어에 적극적으로 구애를 펼치는 와중이었지만, 여전히 오픈소스 지지자 입장에서 마이크로소프트는 신뢰하기 힘든 악의 제국이었기 때문이다.
실제로 일부 깃허브 사용자는 깃랩과 아틀라시안 비트버킷 등으로 이동하긴 했다. 그러나 그 경우도 마이크로소프트의 깃허브 인수와 무관한 해당 사용자의 사정 때문이었다.
깃허브는 여전히 가장 큰 VCS 서비스다. 젯브레인스에 의하면, 개발자 77%가 깃허브를 정기적으로 사용한다. 깃랩의 경우 40%, 비트버킷의 경우 25%다.

■ 가격
깃허브와 깃랩 모두 무료 요금제를 운영하고 있다. 무제한 용량의 퍼블릭 및 프라이빗 저장소를 함께 제공한다. 개인 개발자나 소규모 팀이면 무료 요금제로도 충분히 쓸 만하다.
반면, 어느정도 규모 있는 회사의 소프트웨어 개발 조직이라면 유료 요금제를 이용하는 게 좋다.
깃랩의 유료 요금제는 프리미엄과 얼티메이트로 나뉜다. 깃허브의 유료 요금제는 팀과 엔터프라이즈로 구분된다. 깃허브와 깃랩의 가격을 1대1로 비교하긴 어렵다. 각 플랫폼에서 워크플로우 작동 방식에 따라 가장 적합한 요금제를 살펴봐야 한다.

■ 소스코드 관리 시스템으로 깃을 써야 하는 이유
VCS는 지리적으로 곳곳에 흩어진 개발자, 디자이너, 기타 팀 구성원과 프로젝트를 쉽게 꾸려갈 수 있다. 
모든 구성원이 최신 코드에 접근 권한을 갖고 모든 수정 사항을 추적할 수 있다.
리눅스의 아버지인 리누스 토발즈는 자신의 또다른 작품인 깃을 위대한 발평품이라 자평한다. 
깃을 활용한 소통과 협업 방식은 매우 쉽다. 깃은 오픈소스이며 무료고, 빠르다. 
그 어떤 버전관리 시스템보다 안정적이다. 깃이 오늘날 버전관리시스템의 표준으로 자리잡은 이유다.
그 어떤 버전관리 시스템보다 안정적이다. 깃이 오늘날 버전관리시스템의 표준으로 자리잡은 이유다.
그 어떤 버전관리 시스템보다 안정적이다. 깃이 오늘날 버전관리시스템의 표준으로 자리잡은 이유다.
그 어떤 버전관리 시스템보다 안정적이다. 깃이 오늘날 버전관리시스템의 표준으로 자리잡은 이유다.
그 어떤 버전관리 시스템보다 안정적이다. 깃이 오늘날 버전관리시스템의 표준으로 자리잡은 이유다.
그 어떤 버전관리 시스템보다 안정적이다. 깃이 오늘날 버전관리시스템의 표준으로 자리잡은 이유다.


Systehttp://m.Drawing.Color[] colorindex = new Systehttp://m.Drawing.Color[]
{
Systehttp://m.Drawing.Color.AliceBlue, ////240,248,255
Systehttp://m.Drawing.Color.AntiqueWhite, ////250,235,215
Systehttp://m.Drawing.Color.Aqua, ////0,255,255
Systehttp://m.Drawing.Color.Aquamarine, ////127,255,212
Systehttp://m.Drawing.Color.Azure, ////240,255,255
Systehttp://m.Drawing.Color.Beige, ////245,245,220
Systehttp://m.Drawing.Color.Bisque, ////255,228,196
Systehttp://m.Drawing.Color.Black, ////0,0,0
Systehttp://m.Drawing.Color.BlanchedAlmond, ////255,255,205
Systehttp://m.Drawing.Color.Blue, ////0,0,255
Systehttp://m.Drawing.Color.BlueViolet, ////138,43,226
Systehttp://m.Drawing.Color.Brown, ////165,42,42
Systehttp://m.Drawing.Color.BurlyWood, ////222,184,135
Systehttp://m.Drawing.Color.CadetBlue, ////95,158,160
Systehttp://m.Drawing.Color.Chartreuse, ////127,255,0
Systehttp://m.Drawing.Color.Chocolate, ////210,105,30
Systehttp://m.Drawing.Color.Coral, ////255,127,80
Systehttp://m.Drawing.Color.CornflowerBlue, ////100,149,237
Systehttp://m.Drawing.Color.Cornsilk, ////255,248,220
Systehttp://m.Drawing.Color.Crimson, ////220,20,60
Systehttp://m.Drawing.Color.Cyan, ////0,255,255
Systehttp://m.Drawing.Color.DarkBlue, ////0,0,139
Systehttp://m.Drawing.Color.DarkCyan, ////0,139,139
Systehttp://m.Drawing.Color.DarkGoldenrod, ////184,134,11
Systehttp://m.Drawing.Color.DarkGray, ////169,169,169
Systehttp://m.Drawing.Color.DarkGreen, ////0,100,0
Systehttp://m.Drawing.Color.DarkKhaki, ////189,183,107
Systehttp://m.Drawing.Color.DarkMagena, ////139,0,139
Systehttp://m.Drawing.Color.DarkOliveGreen, ////85,107,47
Systehttp://m.Drawing.Color.DarkOrange, ////255,140,0
Systehttp://m.Drawing.Color.DarkOrchid, ////153,50,204
Systehttp://m.Drawing.Color.DarkRed, ////139,0,0
Systehttp://m.Drawing.Color.DarkSalmon, ////233,150,122
Systehttp://m.Drawing.Color.DarkSeaGreen, ////143,188,143
Systehttp://m.Drawing.Color.DarkSlateBlue, ////72,61,139
Systehttp://m.Drawing.Color.DarkSlateGray, ////40,79,79
Systehttp://m.Drawing.Color.DarkTurquoise, ////0,206,209
Systehttp://m.Drawing.Color.DarkViolet, ////148,0,211
Systehttp://m.Drawing.Color.DeepPink, ////255,20,147
Systehttp://m.Drawing.Color.DeepSkyBlue, ////0,191,255
Systehttp://m.Drawing.Color.DimGray, ////105,105,105
Systehttp://m.Drawing.Color.DodgerBlue, ////30,144,255
Systehttp://m.Drawing.Color.Firebrick, ////178,34,34
Systehttp://m.Drawing.Color.FloralWhite, ////255,250,240
Systehttp://m.Drawing.Color.ForestGreen, ////34,139,34
Systehttp://m.Drawing.Color.Fuschia, ////255,0,255
Systehttp://m.Drawing.Color.Gainsboro, ////220,220,220
Systehttp://m.Drawing.Color.GhostWhite, ////248,248,255
Systehttp://m.Drawing.Color.Gold, ////255,215,0
Systehttp://m.Drawing.Color.Goldenrod, ////218,165,32
Systehttp://m.Drawing.Color.Gray, ////128,128,128
Systehttp://m.Drawing.Color.Green, ////0,128,0
Systehttp://m.Drawing.Color.GreenYellow, ////173,255,47
Systehttp://m.Drawing.Color.Honeydew, ////240,255,240
Systehttp://m.Drawing.Color.HotPink, ////255,105,180
Systehttp://m.Drawing.Color.IndianRed, ////205,92,92
Systehttp://m.Drawing.Color.Indigo, ////75,0,130
Systehttp://m.Drawing.Color.Ivory, ////255,240,240
Systehttp://m.Drawing.Color.Khaki, ////240,230,140
Systehttp://m.Drawing.Color.Lavender, ////230,230,250
Systehttp://m.Drawing.Color.LavenderBlush, ////255,240,245
Systehttp://m.Drawing.Color.LawnGreen, ////124,252,0
Systehttp://m.Drawing.Color.LemonChiffon, ////255,250,205
Systehttp://m.Drawing.Color.LightBlue, ////173,216,230
Systehttp://m.Drawing.Color.LightCoral, ////240,128,128
Systehttp://m.Drawing.Color.LightCyan, ////224,255,255
Systehttp://m.Drawing.Color.LightGoldenrodYellow, ////250,250,210
Systehttp://m.Drawing.Color.LightGray, ////211,211,211
Systehttp://m.Drawing.Color.LightGreen, ////144,238,144
Systehttp://m.Drawing.Color.LightPink, ////255,182,193
Systehttp://m.Drawing.Color.LightSalmon, ////255,160,122
Systehttp://m.Drawing.Color.LightSeaGreen, ////32,178,170
Systehttp://m.Drawing.Color.LightSkyBlue, ////135,206,250
Systehttp://m.Drawing.Color.LightSlateGray, ////119,136,153
Systehttp://m.Drawing.Color.LightSteelBlue, ////176,196,222
Systehttp://m.Drawing.Color.LightYellow, ////255,255,224
Systehttp://m.Drawing.Color.Lime, ////0,255,0
Systehttp://m.Drawing.Color.LimeGreen, ////50,205,50
Systehttp://m.Drawing.Color.Linen, ////250,240,230
Systehttp://m.Drawing.Color.Magenta, ////255,0,255
Systehttp://m.Drawing.Color.Maroon, ////128,0,0
Systehttp://m.Drawing.Color.MediumAquamarine, ////102,205,170
Systehttp://m.Drawing.Color.MediumBlue, ////0,0,205
Systehttp://m.Drawing.Color.MediumOrchid, ////186,85,211
Systehttp://m.Drawing.Color.MediumPurple, ////147,112,219
Systehttp://m.Drawing.Color.MediumSeaGreen, ////60,179,113
Systehttp://m.Drawing.Color.MediumSlateBlue, ////123,104,238
Systehttp://m.Drawing.Color.MediumSpringGreen, ////0,250,154
Systehttp://m.Drawing.Color.MediumTurquoise, ////72,209,204
Systehttp://m.Drawing.Color.MediumVioletRed, ////199,21,112
Systehttp://m.Drawing.Color.MidnightBlue, ////25,25,112
Systehttp://m.Drawing.Color.MintCream, ////245,255,250
Systehttp://m.Drawing.Color.MistyRose, ////255,228,225
Systehttp://m.Drawing.Color.Moccasin, ////255,228,181
Systehttp://m.Drawing.Color.NavajoWhite, ////255,222,173
Systehttp://m.Drawing.Color.Navy, ////0,0,128
Systehttp://m.Drawing.Color.OldLace, ////253,245,230
Systehttp://m.Drawing.Color.Olive, ////128,128,0
Systehttp://m.Drawing.Color.OliveDrab, ////107,142,45
Systehttp://m.Drawing.Color.Orange, ////255,165,0
Systehttp://m.Drawing.Color.OrangeRed, ////255,69,0
Systehttp://m.Drawing.Color.Orchid, ////218,112,214
Systehttp://m.Drawing.Color.PaleGoldenrod, ////238,232,170
Systehttp://m.Drawing.Color.PaleGreen, ////152,251,152
Systehttp://m.Drawing.Color.PaleTurquoise, ////175,238,238
Systehttp://m.Drawing.Color.PaleVioletRed, ////219,112,147
Systehttp://m.Drawing.Color.PapayaWhip, ////255,239,213
Systehttp://m.Drawing.Color.PeachPuff, ////255,218,155
Systehttp://m.Drawing.Color.Peru, ////205,133,63
Systehttp://m.Drawing.Color.Pink, ////255,192,203
Systehttp://m.Drawing.Color.Plum, ////221,160,221
Systehttp://m.Drawing.Color.PowderBlue, ////176,224,230
Systehttp://m.Drawing.Color.Purple, ////128,0,128
Systehttp://m.Drawing.Color.Red, ////255,0,0
Systehttp://m.Drawing.Color.RosyBrown, ////188,143,143
Systehttp://m.Drawing.Color.RoyalBlue, ////65,105,225
Systehttp://m.Drawing.Color.SaddleBrown, ////139,69,19
Systehttp://m.Drawing.Color.Salmon, ////250,128,114
Systehttp://m.Drawing.Color.SandyBrown, ////244,164,96
Systehttp://m.Drawing.Color.SeaGreen, ////46,139,87
Systehttp://m.Drawing.Color.Seashell, ////255,245,238
Systehttp://m.Drawing.Color.Sienna, ////160,82,45
Systehttp://m.Drawing.Color.Silver, ////192,192,192
Systehttp://m.Drawing.Color.SkyBlue, ////135,206,235
Systehttp://m.Drawing.Color.SlateBlue, ////106,90,205
Systehttp://m.Drawing.Color.SlateGray, ////112,128,144
Systehttp://m.Drawing.Color.Snow, ////255,250,250
Systehttp://m.Drawing.Color.SpringGreen, ////0,255,127
Systehttp://m.Drawing.Color.SteelBlue, ////70,130,180
Systehttp://m.Drawing.Color.Tan, ////210,180,140
Systehttp://m.Drawing.Color.Teal, ////0,128,128
Systehttp://m.Drawing.Color.Thistle, ////216,191,216
Systehttp://m.Drawing.Color.Tomato, ////253,99,71
Systehttp://m.Drawing.Color.Turquoise, ////64,224,208
Systehttp://m.Drawing.Color.Violet, ////238,130,238
Systehttp://m.Drawing.Color.Wheat, ////245,222,179
Systehttp://m.Drawing.Color.White, ////255,255,255
Systehttp://m.Drawing.Color.WhiteSmoke, ////245,245,245
Systehttp://m.Drawing.Color.Yellow, ////255,255,0
Systehttp://m.Drawing.Color.YellowGreen, ////154,205,50
};

'헥사' 카테고리의 다른 글

MM_DRAW()  (0) 2023.11.29
헥사 개발코드관련  (0) 2021.04.27

void MM_DRAW()
{
    int xx=0, yy=0, width=0, height=0;

    for(int ii=0; ii<MAPY-1; ii++)
    {
        for(int kk=1; kk<MAPX-1; kk++)
        {
            xx = (kk-1) * (     this.Width/     (MAPX-2)      );
            yy = (ii) * (     (this.ClientRectangle.Height)/    (MAPY-1)    );
            width = (this.Width /(MAPX-2));
            height=((this.ClientRectangle.Height/(MAPY-1));

             if(toggle_for_draw==0)
             {
                 if(hexa[ii,kk] > 0) MM_FORE_DRAW(xx,yy,width,height,DEFINENM.colorindex[     hexa[ii,kk]     ]);
                 else MM_BACK_DRAW(xx,yy,width,height);
             }
             else
             {
                 if(hexa_copy_for_draw[ii,kk] != hexa[ii,kk])
                 {
                     if(hexa[ii,kk]>0) MM_FORE_DRAW(xx,yy,width,height,DEFINENM.colorindex[     hexa[ii,kk]     ]);
                     else MM_BACK_DRAW(xx,yy,width,height);
                 }
             }
        }
    }
}

void MM_FORE_DRAW(int xx, int yy, int width, int height, System.Drawing.Color ____color)
{
    System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(____color);
    System.Drawing.Pen myPen = new System.Drawing.Pen( System.Drawing.Color.LightGray, 1);
    System.Drawing.Graphics myGraphic;
    myGraphic=this.CreateGraphics();
    myGraphic.FillRectangle(myBrush, new Rectangle(xx,yy,width,height));
    myGraphic.DrawRectangle(myPen,xx,yy,width,height);
}

void MM_BACK_DRAW(int xx, int yy, int width, int height)
{
    System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(    System.Drawing.Color.LightYelow);
    System.Drawing.Pen myPen = new System.Drawing.Pen( System.Drawing.Color.LightGray, 1);
    System.Drawing.Graphics myGraphic;
    myGraphic=this.CreateGraphics();
    myGraphic.FillRectangle(myBrush, new Rectangle(xx,yy,width,height));
    myGraphic.DrawRectangle(myPen,xx,yy,width,height);
}




IT 업계에서는 어떤 언어들이 좋은 대접을 받고 있을까? 5위부터 1위까지를 소개한다.

5위 : C#
2021년에는 4위를 했다. C#와 C/C++은 위에서 언급된 여러 자료들에서 고루 상위권을 차지했다. 
다만 C#의 경우 거의 모든 목록에서 2021년 대비 2023년 순위가 비슷할 정도로 안정적인 모습을 보이고 있다는 것은 사뭇 다르다. 
티오비, PYPL, 레드몽크, 깃허브 모두에서 C#은 5위권 안에 안착했다.

C#은 2000년에 개발된 언어로 C 및 C++와 매우 유사하다. 
다용도로 사용될 수 있는 다목적 언어이며, 실제 다방면에서 사용되고 있다. 
비디오 게임과 웹 애플리케이션 개발, 모바일 애플리케이션 개발 등 분야를 가리지 않는다. 

하지만 MS의 윈도 플랫폼을 위한 애플리케이션 개발에 가장 많이 활용되고 있다.
하지만 MS의 윈도 플랫폼을 위한 애플리케이션 개발에 가장 많이 활용되고 있다.
하지만 MS의 윈도 플랫폼을 위한 애플리케이션 개발에 가장 많이 활용되고 있다.
하지만 MS의 윈도 플랫폼을 위한 애플리케이션 개발에 가장 많이 활용되고 있다.

4위 : C/C++
2021년에는 5위를 차지했었다. 
2년 만에 한 단계 오른 것으로, 전체적으로는 C#과 비슷한 순위를 유지하고 있다는 점도 재미있다. 
C와 C++은 사실 다른 언어이지만 대부분의 프로그래밍 언어 목록에서 묶이는 건, 둘이 매우 유사하기 때문이다. 
또한 둘 다 높은 순위를 기록한다는 점에서도 비슷하다. 
티오비 인덱스에서 C는 2위, C++는 3위에 올랐다. 
인디드닷컴에서는 두 언어가 공동으로 1위에 올랐다.

C와 C++ 모두 다목적 언어다. 
C#과는 비교도 되지 않을 만큼 긴 역사를 가지고 있기도 하다. 
C와 C++은 얼마나 비슷한지, C로 만들어진 프로그램의 99%를 C++로도 돌릴 수 있다. 
그것도 아무런 변경 작업 없이 말이다. 
다만 C는 구조적 프로그래밍 언어로, 클래스를 지원하지 않는다는 차이점을 가지고 있다. 
C++은 객체 지향 언어이기 때문에 클래스를 지원한다.

3위 : 자바(Java)
2021년에도 3위를 기록했다. 
여전히 세계에서 한 손에 꼽히는 인기를 누리고 있는 언어로 남아 있는 것이다. 
위에서 언급한 목록 모두에서 높은 순위(2~3위)를 기록했으나 그 어떤 것도 1위에 자바를 올리지는 않고 있다. 
그 때문에 이번 목록에서도 3위에 그치게 됐다.

자바는 1995년 처음으로 등장한 언어로, 그 때부터 세계에서 가장 인기 높은 언어 중 하나로 계속해서 군림해 왔다. 
다재다능한 언어로, 모든 상황에서 사용이 가능하지만 특히 모바일 앱 개발 분야에서 널리 사용된다. 
안드로이드 애플리케이션들 중 상당수가 자바로 만들어졌다. 
자바는 플랫폼에 대한 의존성이 전혀 없어, 한 번 만들어진 소프트웨어를 다양한 플랫폼에서 실행할 수 있다. 
이것이 자바의 인기 지분을 상당히 차지한다.

2위 : 자바스크립트(JavaScript)
2021년에도 2위를 차지했다. 올해에는 위에서 언급한 7개 목록 중 3개에서 1위를 차지했다. 
그렇기에 이번 목록에서도 거의 1위를 차지할 뻔 했으나 티오비 인덱스에서 7위를 기록하는 바람에 아쉽게 놓쳤다. 
이 말은 1위를 해도 이상하지 않다는 것이고, 1~2위의 차이가 근소하다는 뜻이 된다.

자바스크립트는 스크립팅 언어 중 하나로 프론트엔드 웹 개발에 특히 유용하다. 
웹 브라우저를 가리지 않고 기능한다는 점이 가장 큰 장점이자 강점이다(이를 ‘이식성(portability)’이 뛰어나다고 한다). 
자바스크립트의 또 다른 강점은 배우기 쉽다는 것이다. 
프로그래밍 초보자들이 가장 많이 배우는 언어가 자바스크립트인 데에는 이러한 이유가 있다.

1위 : 파이선(Python)
2021년에도 1위를 기록했고, 여전히 1위를 기록 중인, 현 시대의 대세 언어다. 
파이선이 1위 자리를 놓치지 않은 지 이미 수년이 지나고 있다. 
위에서 언급한 7개 목록 중 파이선을 4위 이하로 둔 것은 하나도 없다. 3개 목록에서 1위를 기록하기도 했다.

다목적, 다기능을 가진 언어가 여러 개 존재하지만 파이선만큼 유연하게 여러 가지 목적으로 활용 가능한 언어는 그리 많지 않다. 
수많은 기능을 수행할 수 있으며, 수많은 모습으로 변신할 수도 있다. 
웹 개발, 자동화, 데이터 분석, 머신러닝, 소프트웨어 실험 등 파이선을 활용할 수 있는 분야에는 그 어떤 제약도 없는 것처럼 보인다. 
특히 어떤 분야에서 많이 사용된다는 것도 딱히 존재하지 않는다. 
배우기도 쉬워 대학 학부에서 초심자용 과목으로 널리 선택되는 편이다.


새롭게 프로젝트를 만들고 “Application Folder” 속성에 “DefaultLocation” 정보가 보이게 됩니다. 이곳의 정보를 수정하면은 변경을 할수 있습니다.

// [ProgramFilesFolder] :: 설치할 경로
// [Manufacturer] :: 필수 유지 위에서 설명함.
// [ProductName] :: 설치할 폴더명(프로젝트 이름과 달리 할수 있음)
[ProgramFilesFolder][Manufacturer]\[ProductName]

저 처름 입력하면은 “C:\Default Company Name\MyPROGRAM” 경로에 디렉토리를 만들고 Installer에 추가한 파일이 설치가 됩니다. 간단하면서도 모르면 그냥 헤메가 되는것 같아서 적어 봅니다.

 Windows에서 사용하는 환경변수를 그대로 사용할수 있어서 글 말미에 참고 삼아서 넣어 놓습니다. 현재 모두 테스트를 해 본것은 아니지만 어느정도 사용이 가능한 부분이여서 참고만 해주시면 됩니다.
%HomeDrive% – 로그인한 계정의 정보가 들어있는 드라이브
%HomePath% – 로그인한 계정의 폴더
%SystemDrive% – 윈도우가 부팅된 드라이브
%SystemRoot% – 부팅된 운영체제가 들어있는 폴더
%ProgramFiles% – 기본 프로그램 설치 폴더
%TEMP%, %TMP% – 임시 파일이 저장되는 폴더
%ComSpec% – 기본 명령 프롬프트 프로그램
%USERDOMAIN% – 로그인한 시스템의 도메인 명
%USERNAME% – 로그인한 계정 이름
%USERPROFILE% – 로그인한 유저의 프로필이 들어있는 폴더명
%ALLUSERPROFILE% – 모든 사용자 프로필이 저장된 폴더
%APPDATA% – 설치된 프로그램의 필요 데이터가 저장된 폴더
%LOGONSERVER% – 로그인한 계정이 접속한 서버명
%Path% – 실행 참조용 폴더 지정 목록
%PathEXT% – 참조용 폴더에서 검색한 파일들의 확장자 목록





using System;
using System.IO;

class Program
{
    public static void Main(string[] args)
    {
        CHKNM nmm = new CHKNM();
        nmm.RUNNING();
    }
}
class CHKNM
{
    int[] BGN_RATR_DT = new int[]
    {
        20211115,
20220515,
20221115,
20230515,
20231115,
    };
    int[] END_RATR_DT = new int[]
    {
        20220514,
20221114,
20230514,
20231114,
20241231,
    };
    double[] RATE_INFO_VALUE = new double[]
    {
        0.0346,
0.0402,
0.0507,
0.0586,
0.0612,
    };

    double GET_RATEINFO(int days)
    {
        double rc = 0;

        for(int ii=0; ii<BGN_RATR_DT.Length; ii++)
{
    if(days >= BGN_RATR_DT[ii] && days <= END_RATR_DT[ii])
    {
        rc = RATE_INFO_VALUE[ii];
break;
    }
}
return rc;         
    }  
    public void RUNNING()
    {
        int days = 0;

        double MIDDLE = 0;
        double FEE_DAY = 0;
        double FEE_SUM = 0;
        double RATEINFO = 0;

        string manualDT = "20211115120000";
        DateTime now = DateTime.ParseExact(manualDT, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture);
       DateTime calcnow;

        while(true)
        {
             calcnow = now.AddDays(days);

             if(calcnow.ToString("yyyyMMdd") == "20211115") MIDDLE += 66048000;
             if(calcnow.ToString("yyyyMMdd") == "20220415") MIDDLE += 66048000;
             if(calcnow.ToString("yyyyMMdd") == "20220915") MIDDLE += 66048000;
             if(calcnow.ToString("yyyyMMdd") == "20230215") MIDDLE += 66048000;
             if(calcnow.ToString("yyyyMMdd") == "20230715") MIDDLE += 66048000;
             if(calcnow.ToString("yyyyMMdd") == "20231215") MIDDLE += 60000000;

             RATEINFO = GET_RATEINFO(Convert.ToInt32(calcnow.ToString("yyyyMMdd")));

             FEE_DAY = MIDDLE * RATEINFO / 365.0;
             FEE_SUM += FEE_DAY;

             Console.WriteLine(calcnow.ToString("yyyyMMdd") + " " + MIDDLE.ToString() + " " + RATEINFO.ToString("000.0000") + " " + 
    FEE_DAY.ToString("000000000.000") + " " + FEE_SUM.ToString("000000000.000"));

             if(calcnow.ToString("yyyyMMdd") == "20240701") break;

            days++;
        }
    }
}



 

root 패스워드 설정하기

>sudo passwd root
>비번입력
>비번입력.확인

 

1. INIT(BackgroundWorker/Redis Server Connect)
2. Get Music List & BLPUSH( with Redis Key)
3. BackgroundWorker Process(BLPOP with Redis Key)

 

 

UAPDBMQ0010.cs
0.01MB
program.cs
0.00MB
RADIO_K_18_00.cs
0.01MB

 



csc.exe /reference:ServiceStack.Common.dll,
ServiceStack.dll,ServiceStack.Interfaces.dll,
ServiceStack.ServiceInterface.dll,
Newtonsoft.Json.Net20.dll 
/out:MMM.exe 
/recurse:*.cs



RedisCheck.cs
0.00MB
RedisMusicData.cs
0.01MB
program.cs
0.00MB




csc.exe
/reference:ServiceStack.Common.dll,
ServiceStack.dll,
ServiceStack.Interfaces.dll,
ServiceStack.ServiceInterface.dll 
/out:MMM.exe 
/recurse:*.cs

 

+ Recent posts