TCP의 흐름 제어/Sliding Window

2. Sliding Window
방금 알아본 바와 같이 Stop and Wait를 사용하여 흐름 제어를 하게 되면 비효율적인 부분이 있기 때문에, 오늘날의 TCP는 특별한 경우가 아닌 이상 대부분 슬라이딩 윈도우(Sliding Window) 방식을 사용한다.
슬라이딩 윈도우는 수신 측이 한 번에 처리할 수 있는 데이터를 정해놓고 그때그때 수신 측의 데이터 처리 상황을 송신 측에 알려줘서 데이터의 흐름을 제어하는 방식이다.
Stop and Wait과 여러 가지 차이점이 있겠지만, 
사실 가장 큰 차이점은 송신 측이 수신 측이 처리할 수 있는 데이터의 양을 알고 있다는 점이다. 
이 정보를 알고 있기 때문에 굳이 수신 측이 처리 가능이라는 대답을 일일히 해주지 않아도 데이터를 보내기 전에 이게 처리될 지 어떨지 어느 정도 예측이 가능하다는 말이다.

File Send/Recv - Window form/Thread/Recv/

 

1. 파일사이즈 전송

2. 파일이름 전송

3. 파일데이타 전송

4. 수신받는 서버는 파일이름을 YYYYMMDDHHMISS_FILENAME으로 저장

windows_file_send.c
0.00MB
frm_win_file_recv.cs
0.01MB
frm_win_file_recv.Designer.cs
0.00MB
program.cs
0.00MB

file recv/send/delemeter(0x0d,0x0e,0xff)/멀티수신/windows src

1. 다중 클라이언트 파일 송신

2. 멀티수신서버

3. 수신방법은 delemeter(0x0d,0x0e,0xff) 사용

4. 파일명은 YYYYMMDDHHMISS_FILENAME으로 설정

 

windows_send_byte.c
0.00MB
windows_multi_recv_byte.cs
0.00MB

 

TCP(Transmission Control Protocol)은 원활한 통신을 위해 전송하는 데이터 흐름을 제어하고 네트워크의 혼잡 상태를 파악해서 대처하는 기능을 프로토콜 자체에 포함하고 있다.
만약 TCP가 이런 기능들을 제공해주지 않는다면 개발자가 일일히 데이터를 어떤 단위로 보낼 것인지 정의해야하고, 패킷이 유실되면 어떤 예외처리를 해야하는 지까지 신경써야하기 때문에 TCP가 제공해주는 이러한 기능들 덕분에 우리는 온전히 상위 레이어의 동작에만 집중할 수 있는 것이다.
보통 TCP의 전송 제어 방법은 전송되는 데이터의 양을 조절하는 흐름 제어, 통신 도중에 데이터가 유실되거나 잘못된 데이터가 수신되었을 경우 대처하는 방법인 오류 제어, 네트워크 혼잡에 대처하는 혼잡 제어로 나누어진다.
물론 TCP 같은 전송 계층의 프로토콜을 어플리케이션 레이어에서 활동하는 개발자가 건드릴 일은 많이 없다. 그러나 혹시라도 이 부분에서 뭔가 문제가 발생했을 경우, TCP가 어떤 식으로 작동하는지 모른다면 고치는 건 둘째치고 원인 파악조차 하지 못하는 슬픈 상황이 발생할 수 있으므로 여러모로 알아두는 것이 좋다고 생각한다. (더불어 야근도 따라올 것이다)
그런 의미에서 이번 포스팅에서는 TCP의 흐름 제어 기법들과 오류 제어 기법들에 대한 이야기를 한번 해보려고 한다.

TCP의 흐름 제어

송신 측과 수신 측이 서로 데이터를 주고 받을 때, 여러가지 요인에 따라 이 두 친구들의 처리 속도가 달라질 수 있다. 이때 데이터를 받는 수신 측의 처리 속도가 송신 측보다 빠른 경우는 사실 별 문제가 없다.
주는 족족 빠르게 처리해주니 딱히 문제될 것이 없는 것이다. 그러나 수신 측의 처리 속도보다 송신 측이 더 빠른 경우 문제가 생긴다.
송신 측과 수신 측은 모두 데이터를 저장할 수 있는 버퍼를 가지고 있다. 이때 수신 측이 자신의 버퍼 안에 있는 데이터를 처리하는 속도보다 송신 측이 데이터를 전송하는 속도가 더 빠르다면, 당연히 수신 측의 버퍼는 언젠가 꽉 차버릴 것이기 때문이다.
수신 측의 버퍼가 꽉 찬 상태에서 도착한 데이터는 더 이상 담아둘 공간이 없기 때문에 폐기 처분된다. 물론 이런 상황에서는 송신 측이 다시 데이터를 보내주기는 하겠지만, 데이터 전송이라는게 네트워크 환경에 따라 변수가 워낙 많은 작업이기 때문에 사실 이 작업을 줄일 수 있으면 줄이는 것이 가장 좋다.
그래서 송신 측은 수신 측의 데이터 처리 속도를 파악하고 자신이 얼마나 빠르게, 많은 데이터를 전송할 지 결정해야한다. 이것이 바로 TCP의 흐름 제어인 것이다.
수신 측은 자신이 처리할 수 있는 데이터의 양을 의미하는 윈도우 크기(Window Size)를 자신의 응답 헤더에 담아서 송신 측에게 전해주게 되고, 송신 측은 상대방에게 데이터를 보낼 때 이 윈도우 크기와 네트워크의 현재 상황을 참고해서 알맞은 양의 데이터를 보냄으로써 전체적인 데이터의 흐름을 제어하게 된다.

1. Stop and Wait
Stop and Wait 방식은 이름 그대로 상대방에게 데이터를 보낸 후 잘 받았다는 응답이 올 때까지 기다리는 모든 방식을 통칭하는 말이다. 이때 데이터를 받는 수신 측은 잘 받았어!와 못 받았어... 등의 대답을 해주게 되는데, 수신 측이 어떤 대답을 해주냐에 따라 사용할 수 있는 오류 제어 방법이 나눠지기도 한다.
Stop and Wait로 흐름 제어를 할 경우의 대원칙은 단순히 상대방이 응답을 하면 데이터를 보낸다이기 때문에 구현 자체도 간단하고 개발자가 어플리케이션의 작동 원리를 파악하기도 쉬운 편이다.
기본적인 ARQ(Automatic Repeat Request)를 구현한다고 생각해보면, 수신 측의 윈도우 크기를 1 byte로 설정하고 처리 가능 = 1, 처리 불가능 = 0과 같은 식으로 대충 구현해도 돌아가기는 하기 때문이다.
하지만 서로 처리 가능, 처리 불가능 정도의 의미만 주고받는 방식은 간단한만큼 비효율적이라고 할 수도 있다. 왜냐하면 송신 측은 자신이 직접 데이터를 보내봐야 이 데이터를 수신 측이 처리할 수 있는지 알 수 있기 때문이다. 쉽게 말해서 이런 기초적인 Stop and Wait 방식은 그냥 될 때까지 주구장창 보내는 방식이라고 봐도 무방하다.
그런 이유로 Stop and Wait 방식을 사용하여 흐름 제어를 할 경우에는, 이런 비효율성을 커버하기 위해 이런 단순한 구현이 아닌 여러가지 오류 제어 방식을 함께 도입해서 사용한다.

>>>>보내는쪽에서의 개략소스)
>>>>보내는쪽에서의 개략소스)
>>>>보내는쪽에서의 개략소스)
>>>>보내는쪽에서의 개략소스)

while (true)
{
    while(true)
    {
        bytesSent = sender.Send(fileByte);
        bytesSent = sender.Receive(recvByte);

        string flagTxt = Encoding.UTF8.GetString(recvByte, 0, bytesSent);

        if (flagTxt == "no") continue;
        else if (flagTxt == "go") break;
    }
}

>>>>받는쪽에서 개략소스)
>>>>받는쪽에서 개략소스)
>>>>받는쪽에서 개략소스)
>>>>받는쪽에서 개략소스)

while (true)
{
    int sz = handler.Receive(bytes);

    if (sz == -1) break;
    else if (sz != PACKSZ) //제대로 받지를 못했다고 판단했을때에
    {
if (sz + cur < filesz) //실제로 마지막데이타도 아니라면
{
    handler.Send("no");
    continue;
}
    }

    cur += sz;

    handler.Send("go");

    if (cur > filesz) break;
    else if (filesz == cur) break;
}


TCP의 흐름 제어/Sliding Window

2. Sliding Window

방금 알아본 바와 같이 Stop and Wait를 사용하여 흐름 제어를 하게 되면 비효율적인 부분이 있기 때문에, 오늘날의 TCP는 특별한 경우가 아닌 이상 대부분 슬라이딩 윈도우(Sliding Window) 방식을 사용한다.
슬라이딩 윈도우는 수신 측이 한 번에 처리할 수 있는 데이터를 정해놓고 그때그때 수신 측의 데이터 처리 상황을 송신 측에 알려줘서 데이터의 흐름을 제어하는 방식이다.
Stop and Wait과 여러 가지 차이점이 있겠지만, 
사실 가장 큰 차이점은 송신 측이 수신 측이 처리할 수 있는 데이터의 양을 알고 있다는 점이다. 
이 정보를 알고 있기 때문에 굳이 수신 측이 처리 가능이라는 대답을 일일히 해주지 않아도 데이터를 보내기 전에 이게 처리될 지 어떨지 어느 정도 예측이 가능하다는 말이다.

 

 

dirent.h
0.01MB
windows_file_recv.c
0.01MB
windows_file_send.c
0.00MB
windows_recv_basic.c
0.00MB
windows_send_basic.c
0.00MB
windows_send_byte.c
0.00MB

변형적인 file recv/send(windows)

1. 파일이름을 보낸다.(서버에서 파일중복검사를 하지 않고, YYYYMMDDHHMISS_FILENAME으로 처리)

2. 파일내용을 읽어서 보낸다.

windows_send_byte.c
0.00MB
windows_recv_byte.cs
0.00MB

 

 

문의)xterm92@naver.com

일반적인 file send/recv(windows src)

1. 클라이언트에서 파일사이즈를 보내고

2. 클라이언트에서 파일이름을 보내고

3. 파일을 읽어서 전송

 

 

 

dirent.h
0.01MB
windows_file_recv.c
0.01MB
windows_file_send.c
0.00MB

c# 으로 작성되어진 delemeter(0xff)로 구분되어진 데이타 수신서버

windows_send_basic.c
0.00MB
other_rcv.cs
0.00MB
windows_recv_basic.c
0.00MB

애플리케이션 성능 모니터링이란?

 

애플리케이션 성능 모니터링인 APM은 조직이 애플리케이션 및 코드의 성능 문제를 신속하게 식별하고 해결하기 위한 프로세스입니다.

APM 솔루션은 웹사이트, 소프트웨어 애플리케이션 및 서비스에서 원격 측정 데이터를 수집, 모니터링 및 분석합니다. 팀은 애플리케이션 전반에 걸쳐 엔드 투 엔드 가시성을 확보하여 애플리케이션 및 서비스 종속성을 파악하고 오류나 속도 저하를 해결할 수 있습니다. 또한 APM 솔루션은 추세를 표면화하기 위해 과거 데이터를 저장하고 활용하며, 비즈니스 KPI뿐만 아니라 대기 시간 및 처리량과 같은 주요 성능 지표에 대한 이상값을 탐지합니다.

애플리케이션 성능 모니터링의 역할은 무엇인가요?

애플리케이션 성능 모니터링은 애플리케이션의 성능에 대한 지속적이고 상세한 인사이트를 제공합니다. 팀은 이러한 인사이트를 활용하여 고객의 불만 사항을 기다리는 대신 보다 사전 예방적으로 대처할 수 있습니다. APM에는 여러 가지 용도가 있습니다. 예를 들어, 팀은 사용자 경험의 저하에 대한 경보 기능을 설정하고, 최신 릴리즈의 영향을 측정하고, 개선해야 할 부분에 대해 정보에 입각한 결정을 내릴 수 있습니다. 또한 근본 원인 분석을 지원하고 평균 탐지 시간(MTTD) 및 평균 해결 시간(MTTR)을 낮추는 데에도 사용할 수 있습니다.

APM이 중요한 이유는 무엇인가요?

애플리케이션은 현대 조직에서 필수불가결한 요소입니다. 애플리케이션은 사람들이 매일 사용하는 제품, 서비스 및 도구의 관문이며, 또한 점점 더 복잡해지고 있습니다. 클라우드 네이티브 기술  마이크로서비스와 같은 분산 애플리케이션이 증가함에 따라, 팀은 스트리밍되는 원격 측정 데이터의 양을 따라잡을 수 없습니다. 탁월한 사용자 경험을 제공하기 위해 모든 것을 모니터링하는 방법이 필요합니다.

APM은 애플리케이션이 예상대로 작동하도록 보장합니다. 고객의 신뢰를 유지하기 위해, APM 도구는 팀에게 잠재적인 문제에 대한 경보를 보내 문제를 신속하게 해결할 수 있습니다.

APM의 역사

1990년대에 만들어진 이래로, APM은 IT 팀에게 이전에는 전혀 가시성이 없던 애플리케이션에 대한 가시성을 제공해 왔습니다. 수년에 걸쳐, 여러 회사가 분산 추적을 실험했지만 2010년대가 되어서야 보다 강력한 APM 솔루션이 출시되었습니다. 이러한 플랫폼 솔루션은 보다 높은 수준의 추적과 엔드 투 엔드 모니터링 기능을 제공합니다.

APM과 Observability 비교

표면적으로는 Observability와 APM이 유사합니다. 둘 다 텔레메트리를 사용하여 데이터를 수집하고 성능에 대한 인사이트를 제공합니다. APM은 트랜잭션 추적과 모니터링 등 보다 애플리케이션 중심적인 반면, Observability는 애플리케이션 및 인프라 성능 양쪽 모두에 적용됩니다. Observability를 통해 시스템에 대한 이해도를 높이기 위해 기술 세부 정보를 심층적으로 파악할 수 있습니다. Observability는 로그, 메트릭 및 추적 간의 상관 관계를 통해 팀이 성능 문제의 컨텍스트와 근본 원인을 파악할 수 있도록 지원합니다.

애플리케이션 성능 모니터링은 어떻게 작동하나요?

APM은 일련의 도구와 방법론을 사용하여 소프트웨어 애플리케이션의 성능을 모니터링하고 관리합니다. APM 도구에는 일반적으로 응답 시간, 처리량 및 오류율과 같은 주요 메트릭의 모니터링이 포함되어 성능 병목 현상 및 문제를 식별하고 진단합니다.

APM 도구는 또한 개발자들이 코드의 문제를 이해하고 해결하는 데 도움이 되는 상세한 추적 및 디버깅 정보를 제공할 수 있습니다. 여기에는 이해관계자에게 애플리케이션의 성능을 지속적으로 알리기 위한 경보 및 보고 기능이 포함되는 경우가 많습니다.

APM 에이전트

에이전트는 일반적으로 애플리케이션에서 계측되는 소프트웨어입니다. 에이전트는 추적 및 원격 측정 데이터를 모니터링하고 APM 서버 및/또는 기타 모니터링 도구로 전송합니다. 에이전트를 사용하여 광범위한 시스템 및 애플리케이션을 모니터링할 수 있으며, 성능의 특정 측면에 대한 데이터를 수집하도록 에이전트를 구성할 수 있습니다.

APM 계측

계측은 성능 데이터를 수집하기 위해 애플리케이션에 모니터링 코드를 추가하는 프로세스입니다. 응답 시간, 오류율, 리소스 활용률, 로그 및 기타 애플리케이션 상태와 성능의 주요 지표에 대한 메트릭을 수집하는 데 사용할 수 있습니다.

계측은 공급업체별 APM SDK(소프트웨어 개발 키트)를 사용하거나 또는 스팬을 사용해 추적이 시작되고 중지되는 OpenTelemetry와 같은 개방형 표준을 사용하여 수동으로 수행할 수 있습니다.

또는 코드를 자동으로 계측하는 에이전트를 사용하여 수행할 수도 있습니다. 에이전트를 설치한 후, 팀은 분석을 위해 애플리케이션 또는 트랜잭션의 특정 부분을 계측한 다음 데이터를 엔드포인트(일반적으로 APM 플랫폼)로 전송할 수 있습니다. 계측은 보통 도구의 UI에서 또는 API를 통해 설정됩니다. 구성의 예로는 환경 이름, 샘플링 속도 및 기타 메트릭이 있습니다.

APM 분석 및 경보

성능 데이터가 수집되면 분석을 할 수 있습니다. 도구를 선택할 때는 사용자의 경험을 쉽게 추적하고 오류 및 문제를 한눈에 파악할 수 있는 대시보드와 보기가 포함되어 있어야 합니다. 대부분의 팀은 보고된 문제에 대한 조사를 시작한 다음, 근본 원인을 파악하기 위해 노력합니다. APM에 대한 플랫폼 접근 방식을 갖게 되면, 이 단계에서 도구 전환을 방지할 수 있습니다. 향후 문제를 방지하기 위해 경보를 설정할 수도 있습니다.

APM은 무엇을 측정하나요?

APM 도구는 다음을 측정할 수 있습니다.

  • 서버 상태: 서버 CPU 사용량, 메모리 요구량 및 읽기/쓰기 속도 모니터링
  • 오류율: 성능 저하 추적 및 문제 식별
  • 응답 시간: 애플리케이션 성능에 영향을 미치고 있는지 여부 확인
  • 인스턴스: 효율적으로 확장하고 전체 비용을 관리하기 위해 실행 중인 서버 또는 앱 인스턴스 수 파악. 이 메트릭은 클라우드 기반 애플리케이션에 매우 중요합니다.
  • 요청 속도: 사용자 트래픽을 평가하여 급증이 발생하거나 사용자가 비활성화되는 이유 파악
  • 가용성: 애플리케이션의 가동 시간 추적

 

APM의 어려움은 무엇인가요?

APM 도구에는 어려움이 따르게 마련입니다. 팀들은 실시간으로 방대한 양의 데이터 스트리밍을 처리하는 중입니다. 복잡하고 분산된 애플리케이션, 특히 클라우드 네이티브 기술을 사용하는 애플리케이션은 APM 계측을 어렵게 만들 수 있습니다. 환경 전반에 걸쳐 문제가 있거나 복잡한 근본 원인 분석 사례가 있는 경우, 많은 도구가 어려움을 겪을 수 있습니다.

APM 솔루션은 엔드 투 엔드 트랜잭션, 애플리케이션 및 코드 레벨 성능을 모니터링하여 조직에 포괄적인 적용 범위를 제공해야 합니다. 단일 플랫폼을 사용하면 가장 포괄적인 적용 범위를 제공하고, 워크플로우를 단순화하고, 문제 해결 속도를 높일 수 있습니다. 비즈니스 목표를 달성하기 위해 여러 모니터링 방법을 조합하여 사용할 수 있는 적절한 APM 솔루션을 선택하는 것이 중요합니다.

 

APM의 이점은 무엇인가요?

애플리케이션이 작동을 멈추면, 사용자에게 부정적인 경험을 주기 전에 미리 아는 것이 좋습니다. APM을 통해 팀은 문제를 신속하게 파악하고 해결할 수 있으며, 향후에도 문제를 방지할 수 있습니다. 포괄적인 APM 도구를 통해, 팀은 다음과 같은 이점을 얻을 수 있습니다.

  • 안정성 및 가동 시간 향상
  • 인시던트 감소
  • 문제를 보다 신속하게 해결
  • 고품질 소프트웨어 출시
  • 인프라 개선 사항 파악
  • 생산성 향상
  • 더 나은 사용자 경험 만들기
  • 매출 증대

 

APM 도구의 주요 기능

적절한 APM 도구를 선택할 때 어떤 점을 고려해야 하나요? 엔드 투 엔드 트랜잭션, 애플리케이션 및 코드 레벨 성능을 모니터링할 수 있는 다양한 APM 솔루션이 있지만, 현재와 미래의 기술적 필요에 맞는 솔루션을 선택하는 것이 중요합니다.

기술적 역량

조직에 대한 체크리스트를 작성합니다. 그런 다음, 필요에 따라 도구 기능을 비교할 수 있습니다. APM 기술적 역량의 예를 몇 가지 소개하면 다음과 같습니다.

  • 웹사이트 및/또는 애플리케이션 성능 추적
  • 애플리케이션 및 서비스 종속성 매핑 및 관리
  • 엔드 투 엔드 가시성을 위해 분산 추적 수집
  • 실시간 사용자 모니터링(클라이언트 및 서버) 제공
  • 앱 성능을 비즈니스 목표에 연결
  • 머신 러닝 및 AI 기반 분석 활용
  • 다양한 데이터 유형, 데이터 소스 및 언어 지원

 

 

엔드 투 엔드 가시성

APM 데이터는 애플리케이션에서 실제로 어떤 일이 일어나고 있는지를 조직에 알릴 수 있는 기능을 가지고 있습니다. 그러나 모든 것을 잘 모니터링할 수 있어야 어떻게 작동하고 있는지에 대한 명확한 비전을 얻을 수 있습니다.

개별 추적은 이 스토리의 일부만 보여주기 때문에, APM 도구는 한 단계 더 나아가 트랜잭션을 전체 과정에서 모니터링해야 합니다. 그런 다음, 여러 추적을 함께 연결하여 개괄적인 전체 보기에서 코드 레벨 문제로 전환할 수 있습니다.

엔드 투 엔드 가시성도 AIOps의 중요한 요소입니다.

통합

서드파티 서비스 및 애플리케이션과의 통합을 통해 APM 도구는 조직의 보다 규모가 큰 에코시스템에 원활하게 꼭 들어맞을 수 있습니다. 인증에서 CI/CD 프레임워크에 이르기까지, 이러한 통합을 사전에 조사하는 것이 중요합니다.

사용 용이성

조직 내에는 APM 기능에 액세스해야 하는 다양한 사용자가 있습니다. 직관적인 UI를 통해 각 사용자의 필요에 맞추세요. 또한 APM 솔루션의 배포, 관리 및 확장이 얼마나 쉬운지 확인해 보세요.

배포 옵션

운영 및 관리 비용을 절감하려는 경우 ,클라우드 기반 SaaS 옵션을 고려해 볼 수 있습니다. 그러나 고려해야 할 다른 배포 옵션이 있습니다. 일부 APM 도구는 멀티 클라우드 또는 하이브리드 전략을 지원할 수 있지만, 다른 도구는 선호하는 클라우드 서비스 제공자에 따라 제한이 있을 수 있습니다.

개방형 표준/개방형 데이터 지원

Observability 공간은 끊임없이 진화하고 있습니다. 새로운 도구와 표준이 시장에 진입함에 따라, 적응할 수 있는 유연한 플랫폼이 필요합니다. 또한 OpenTelemetry와 같은 개방형 표준 및 기술을 사용하면 도구 집합의 미래를 보장하는 데 도움이 될 수 있습니다.

 

참조)
APM - 애플리케이션 성능 모니터링이란 무엇인가요? | 포괄적인 APM 안내서 | Elastic

 

APM - 애플리케이션 성능 모니터링이란 무엇인가요? | 포괄적인 APM 안내서

APM(애플리케이션 성능 모니터링)은 조직이 사용자 트랜잭션을 이해하고, 문제를 식별하며, 애플리케이션과 코드의 성능 문제를 해결하는 프로세스입니다. 애플리케이션 성능 모니터링에 대해

www.elastic.co

 

클라이언트에서 555사이즈 packet을 400번 보내면 서버에서 받는모습은(?)

1. 클라이언트에서 555사이즈 packet을 400번 보내면 555 * 400 = 222,000이다.

2. 파일에서의 사이즈는 229,200이다.("\r\n" + 기타정보를 추가로 입력했기때문에 사이즈가 늘어났다.)
-rw-r--r-- 1 B210145_BK 197121    229200 Apr 22 08:32 packefile_2024_04_22_08_32_24.txt
-rw-r--r-- 1 B210145_BK 197121    229200 Apr 22 08:34 packefile_2024_04_22_08_34_02.txt
-rw-r--r-- 1 B210145_BK 197121    229200 Apr 22 08:35 packefile_2024_04_22_08_34_58.txt

3. 클라이언트에서 555를 보낸다고해서, 서버에서 555을 받지는 않는다.
장비 네크워크 사정, 서버의 처리속도, 등등을 따져서 서버에서 받는 수신 packet 의 사이즈는 틀려진다.

4. 마지막 서버에서 모든 수신된 packet의 길이를 더하면 클라이언트에서 보낸 사이즈와 같다.

유실이 없다.(tcp/ip)

5. 위의 화면을 보면, 클라이언트에서 보내는 모습과 서버에서 받는모습이 나타나있다.
자세히 보면, 어떻게 클라이언트와 서버가 데이타를 주고받는지 알수 있다.

궁금한점은 xterm92@naver.com으로,ㅡㅡ,ㅡㅡㅡㅡ

 


//11.txt
//{"param":{"loginid":"admin","pwd":"admin123"},"proto":"r","sender":"/cli/admin/10.1.181.79/25216","id":"login_client.0000919860.001","ts":"1713428639","method":"login_client"}

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

class Program
{
    public static void Main(string[] args)
    {
        if (args.Length == 1)
        {
            CHKNM nmm = new CHKNM();
            nmm.RUN(args[0]);
        }
        else
        {
            CHKNM nmm = new CHKNM();
            nmm.RUN();
        }
    }
}
class CHKNM
{
    public void RUN(string fileText)
    {
        string lines = File.ReadAllText(fileText);

        Console.WriteLine(lines);

        byte[] bytes = Encoding.UTF8.GetBytes(lines);
        PrintByteArray(bytes);
    }
    public void RUN()
    {
        byte[] buffer = new byte[] { 123, 34, 112, 97, 114, 97, 109, 34, 58, 123, 34, 108, 111, 103, 105, 110, 105, 100, 34, 58, 34, 97, 100, 109, 105, 110, 34, 44, 34, 112, 119, 100, 34, 58, 34, 97, 100, 109, 105, 110, 49, 50, 51, 34, 125, 44, 34, 112, 114, 111, 116, 111, 34, 58, 34, 114, 34, 44, 34, 115, 101, 110, 100, 101, 114, 34, 58, 34, 47, 99, 108, 105, 47, 97, 100, 109, 105, 110, 47, 49, 48, 46, 49, 46, 49, 56, 49, 46, 55, 57, 47, 50, 53, 50, 49, 54, 34, 44, 34, 105, 100, 34, 58, 34, 108, 111, 103, 105, 110, 95, 99, 108, 105, 101, 110, 116, 46, 48, 48, 48, 48, 57, 49, 57, 56, 54, 48, 46, 48, 48, 49, 34, 44, 34, 116, 115, 34, 58, 34, 49, 55, 49, 51, 52, 50, 56, 54, 51, 57, 34, 44, 34, 109, 101, 116, 104, 111, 100, 34, 58, 34, 108, 111, 103, 105, 110, 95, 99, 108, 105, 101, 110, 116, 34, 125, 13, 10, };
        string strText = Encoding.Default.GetString(buffer);

        Console.WriteLine(strText);
    }
    public void PrintByteArray(byte[] bytes)
    {
        var sb = new StringBuilder("new byte[] { ");
        foreach (var b in bytes)
        {
            sb.Append(b + ", ");
        }
        sb.Append("}");
        Console.WriteLine(sb.ToString());
    }
}





windows_send_basic.exe 127.0.0.1 21111 "E:\exture_plus_raw_internet_log_20230418\home\release\Paxfeed_x64\backup\TickerplantRaw_EXTURE_PLUS_INTERNET_REAL_STANDBY\20230418_13_internet_Kse_32114.log"

-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kse_32113.log
-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kse_32112.log
-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kosdaq_33112.log
-rw-r--r-- 1 B210145_BK 197121    3013444 Apr 18  2023 20230418_20_internet_Kse_32115.log
-rw-r--r-- 1 B210145_BK 197121       3264 Apr 18  2023 20230418_20_internet_FutureIndex_35115.log
-rw-r--r-- 1 B210145_BK 197121       3264 Apr 18  2023 20230418_20_internet_OptionIndex_36112.log
-rw-r--r-- 1 B210145_BK 197121       3264 Apr 18  2023 20230418_20_internet_OptionIndex_36111.log
-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kse_45111.log
-rw-r--r-- 1 B210145_BK 197121       3264 Apr 18  2023 20230418_20_internet_FutureIndex_35114.log
-rw-r--r-- 1 B210145_BK 197121       2944 Apr 18  2023 20230418_20_internet_Kse_32114.log
-rw-r--r-- 1 B210145_BK 197121       5520 Apr 18  2023 20230418_20_internet_Elw_34913.log
-rw-r--r-- 1 B210145_BK 197121       5460 Apr 18  2023 20230418_20_internet_Kse_40116.log
-rw-r--r-- 1 B210145_BK 197121       5460 Apr 18  2023 20230418_20_internet_Kse_40112.log
-rw-r--r-- 1 B210145_BK 197121       5460 Apr 18  2023 20230418_20_internet_Kse_40111.log
-rw-r--r-- 1 B210145_BK 197121       5520 Apr 18  2023 20230418_20_internet_Elw_34912.log
-rw-r--r-- 1 B210145_BK 197121       5612 Apr 18  2023 20230418_20_internet_Elw_34914.log

windows_send_basic.c
0.00MB
windows_recv_basic.c
0.00MB
linux_recv_basic.c
0.00MB

플랫버퍼에서 데이터를 읽고 쓰는 방법은 다음과 같습니다.

1.데이터 구조 정의: 먼저 플랫버퍼에서 사용할 데이터 구조를 정의해야 합니다. 이를 위해 플랫버퍼에서 제공하는 FlatBufferBuilder 클래스를 사용합니다. FlatBufferBuilder 클래스는 데이터 구조를 생성하고, 데이터를 추가하며, 최종적으로 직렬화된 데이터를 생성하는 데 사용됩니다.

2.데이터 추가: FlatBufferBuilder 클래스를 사용하여 데이터 구조에 데이터를 추가합니다. 데이터를 추가할 때는 FlatBufferBuilder 클래스의 메소드를 사용합니다. 예를 들어, int 타입의 데이터를 추가하려면 FlatBufferBuilder.addInt 메소드를 사용합니다.

3.데이터 직렬화: 데이터 추가가 완료되면, FlatBufferBuilder 클래스의 Finish 메소드를 사용하여 데이터를 직렬화합니다. Finish 메소드는 직렬화된 데이터를 반환합니다.

4.데이터 읽기: 직렬화된 데이터를 읽으려면, FlatBufferBuilder 클래스에서 제공하는 GetRootAs 메소드를 사용합니다. 이 메소드는 직렬화된 데이터에서 원하는 데이터 구조를 추출하는 데 사용됩니다. 추출된 데이터 구조는 해당 언어에서 제공하는 방식으로 사용할 수 있습니다.

5.데이터 수정: 추출된 데이터 구조를 수정하려면, 해당 언어에서 제공하는 방식으로 데이터를 수정합니다. 수정된 데이터를 다시 직렬화하려면, FlatBufferBuilder 클래스를 사용하여 데이터를 추가하고, Finish 메소드를 사용하여 데이터를 직렬화합니다.

다음은 C++에서 플랫버퍼를 사용하여 데이터를 읽고 쓰는 예제입니다.

#include "flatbuffers/flatbuffers.h"

struct Person {
    int id;
    std::string name;
    int age;
};

int main() {
    // 데이터 구조 정의
    FlatBufferBuilder builder;

    // 데이터 추가
    auto nameOffset = builder.CreateString("John");
    auto person = CreatePerson(builder, 1, nameOffset, 30);

    // 데이터 직렬화
    FinishPersonBuffer(builder, person);

    // 데이터 읽기
    auto buffer = builder.GetBufferPointer();
    auto person_ = GetPerson(buffer);

    // 데이터 출력
    std::cout << "ID: " << person_->id() << std::endl;
    std::cout << "Name: " << person_->name()->c_str() << std::endl;
    std::cout << "Age: " << person_->age() << std::endl;

    return 0;
}

SBE (Simple Binary Encoding)는 성능에 민감한 애플리케이션을 위한 경량의 고성능 바이너리 데이터 인코딩 및 직렬화 형식입니다. SBE는 금융 서비스, IoT, 산업 자동화, 네트워크 모니터링 등 다양한 산업 분야에서 사용됩니다.

다음은 SBE의 주요 특징입니다:

1.고성능: SBE는 경량의 바이너리 형식을 사용하여 데이터를 인코딩하고 직렬화하므로, 데이터 전송 및 처리 속도가 빠릅니다.

2.유연성: SBE는 사용자가 데이터 구조를 정의하고, 필드의 길이, 데이터 타입, 값의 범위 등을 지정할 수 있습니다. 이를 통해 사용자는 자신의 요구사항에 맞게 데이터를 인코딩할 수 있습니다.

3.다양한 언어 지원: SBE는 C++, Java, .NET, Python, JavaScript 등 다양한 언어를 지원합니다. 이를 통해 여러 언어로 작성된 애플리케이션 간에 데이터를 쉽게 교환할 수 있습니다.

4.안전성: SBE는 데이터 무결성을 보장하기 위해 체크섬을 사용합니다. 또한, 데이터가 손상되는 것을 방지하기 위해 오류 검사를 수행합니다.

5.확장성: SBE는 대규모 데이터 처리를 위한 확장성이 높습니다. 이를 통해 대량의 데이터를 빠르고 안정적으로 처리할 수 있습니다.

6.표준화: SBE는 금융 서비스 산업에서 널리 사용되는 FIX (Financial Information eXchange) 프로토콜을 기반으로 개발되었습니다. 이를 통해 SBE는 금융 서비스 분야에서 표준화된 데이터 인코딩 형식으로 자리 잡았습니다.

SBE는 금융 서비스 분야에서 널리 사용되고 있으며, 다른 산업 분야에서도 점차 도입되고 있습니다. SBE를 사용하면 데이터 전송 및 처리 속도를 향상시키고, 데이터 무결성을 보장하며, 다양한 언어로 작성된 애플리케이션 간에 데이터를 쉽게 교환할 수 있습니다.

플랫버퍼(FlatBuffers)는 C++, C#, C, Go, Java, Kotlin, JavaScript, Lobster, Lua, TypeScript, PHP, Python, Rust 및 Swift를 위한 효율적인 크로스 플랫폼 직렬화 라이브러리입니다. 원래 게임 개발 및 기타 성능에 민감한 애플리케이션을 위해 구글에서 만들었습니다.

플랫버퍼는 데이터를 효율적으로 저장하고 전송하기 위해 설계되었습니다. 이는 메모리 사용량과 직렬화 및 역직렬화 시간을 최소화함으로써 이루어집니다. 또한 다양한 언어를 지원하므로 여러 언어로 작성된 애플리케이션 간에 데이터를 쉽게 교환할 수 있습니다.

플랫버퍼는 다음과 같은 특징을 가지고 있습니다:

1.효율성: 플랫버퍼는 데이터를 압축하여 저장하므로 메모리 사용량을 최소화합니다. 또한 직렬화 및 역직렬화 시간이 매우 빠릅니다.

2.다양한 언어 지원: 플랫버퍼는 다양한 언어를 지원하므로 여러 언어로 작성된 애플리케이션 간에 데이터를 쉽게 교환할 수 있습니다.

3.유연성: 플랫버퍼는 사용자가 데이터 구조를 정의하고 직렬화할 수 있게 해줍니다. 또한 사용자가 직렬화된 데이터를 수정하고 역직렬화할 수 있습니다.

4.빠른 속도: 플랫버퍼는 데이터를 빠르게 읽고 쓸 수 있으므로 게임 개발이나 실시간 데이터 처리와 같은 성능에 민감한 애플리케이션에 적합합니다.

5.안전성: 플랫버퍼는 데이터 무결성을 보장하기 위해 체크섬을 사용합니다. 또한 데이터가 손상되는 것을 방지하기 위해 오류 검사를 수행합니다.

6.오픈 소스: 플랫버퍼는 오픈 소스 라이브러리이므로 누구나 자유롭게 사용하고 수정할 수 있습니다.

플랫버퍼는 게임 개발, 머신 러닝, 빅 데이터 처리 등 다양한 분야에서 사용됩니다. 또한 웹 개발에서도 사용되며, JSON과 같은 다른 직렬화 형식보다 더 효율적이고 빠릅니다.

json 데이타를 c# 구조체 모델링 코드화 해주는 사이트
json 데이타를 c# 구조체 모델링 코드화 해주는 사이트
json 데이타를 c# 구조체 모델링 코드화 해주는 사이트

https://json2csharp.com/

json 데이타를 c# 구조체 모델링 코드화 해주는 사이트
json 데이타를 c# 구조체 모델링 코드화 해주는 사이트
json 데이타를 c# 구조체 모델링 코드화 해주는 사이트

https://json2csharp.com/

1. 특정 폴더 일괄 지우기(특정 폴더)

find . -name "test" -type d -exec rm -rf {} \;
or
find . -name "test*" -type d | xargs rm -rf

하위까지(APM),ㅡㅡㅡㅡㅡ
find ./ -name "obj" -type d | xargs rm -rf
find ./ -name "obj" -type d | xargs rm -rf
find ./ -name "obj" -type d | xargs rm -rf

2. 특정 파일 일괄 지우기

find . -name "test" -type f -exec rm -rf {} \;
or
find . -name "*test*" -type f | xargs rm -rf


case1)
Application.Exit();

case2)
System.Diagnostics.Process.GetCurrentProcess().Kill();

using System;
using System.Collections.Generic;
using System.Linq;
using Systehttp://m.Text.Json;
using StackExchange.Redis;

class Program
{
    public static void Main(string[] args)
    {
        REDISCHK nmm = new REDISCHK();
        nmm.RUN();
    }
}
class REDISCHK
{
    public void RUN()
    {
        RedisStore redis = new RedisStore("localhost:6379");

        /*---------------------------------------------------------------------------
        // key, value로 저장
        redis.SetValue("test1", "ans-test1");

        // key로 value를 찾는다.
        //Console.WriteLine(redis.GetValue("test1"));
       ---------------------------------------------------------------------------*/

       /*
        FILE을 읽어서, KEY=ifReceiver.sender
        VALUE=formatText
       */
    }
}

 

 

# DispatcherTimer  활용사례

using System;
using System.Windows.Threading;
using Systehttp://m.Windows.Forms;
using System.Timers;
using System.IO;

namespace APM
{
    public partial class APMMain : Form
    {
        private DispatcherTimer displayTimer1 = new DispatcherTimer(); //유가
        private DispatcherTimer displayTimer2 = new DispatcherTimer(); //코스닥
        private DispatcherTimer displayTimer3 = new DispatcherTimer(); //파생
        private DispatcherTimer displayTimer4 = new DispatcherTimer(); //채권

        private int sec1, sec2, sec3, sec4;


        public APMMain()
        {
            InitializeComponent();

            InitControl();
        }
        void InitControl()
        {
            

            displayTimer1.Interval = TimeSpan.FromSeconds(interval);
            displayTimer1.Tick += new EventHandler(displayTimer_Tick);
            sec1 = 0;
            displayTimer2.Interval = TimeSpan.FromSeconds(interval);
            displayTimer2.Tick += new EventHandler(displayTimer_Tick);
            sec2 = 0;
            displayTimer3.Interval = TimeSpan.FromSeconds(interval);
            displayTimer3.Tick += new EventHandler(displayTimer_Tick);
            sec3 = 0;
            displayTimer4.Interval = TimeSpan.FromSeconds(interval);
            displayTimer4.Tick += new EventHandler(displayTimer_Tick);
            sec4 = 0;

            displayTimer1.Start();
            displayTimer2.Start();
            displayTimer3.Start();
            displayTimer4.Start();

            
        }

        void displayTimer_Tick(object sender, EventArgs e)
        {
            if ((sender as DispatcherTimer).Equals(displayTimer1))
            {
                TimeSpan t = TimeSpan.FromSeconds(sec1++);
                timer1.Text = string.Format("{0:D2}:{1:D2}", t.Minutes, t.Seconds);
            }

            else if ((sender as DispatcherTimer).Equals(displayTimer2))
            {
                TimeSpan t = TimeSpan.FromSeconds(sec2++);
                timer2.Text = string.Format("{0:D2}:{1:D2}", t.Minutes, t.Seconds);
            }

            else if ((sender as DispatcherTimer).Equals(displayTimer3))
            {
                TimeSpan t = TimeSpan.FromSeconds(sec3++);
                timer3.Text = string.Format("{0:D2}:{1:D2}", t.Minutes, t.Seconds);
            }

            else if ((sender as DispatcherTimer).Equals(displayTimer4))
            {
                TimeSpan t = TimeSpan.FromSeconds(sec4++);
                timer4.Text = string.Format("{0:D2}:{1:D2}", t.Minutes, t.Seconds);
            }
        }

        #region WndProc
        protected override void WndProc(ref Message m)
        {

            switch (m.Msg)
            {
                default:
                    break;
            }
            base.WndProc(ref m);
        }
        #endregion   

        public void SetRegin()
        {
            //
        }
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000;
                return cp;
            }
        }
    }
}

(1)라이선스 에러 발생시 대처 방법 안내/(2)마이그레이션 방법
(1)라이선스 에러 발생시 대처 방법 안내/(2)마이그레이션 방법
(1)라이선스 에러 발생시 대처 방법 안내/(2)마이그레이션 방법

마이그레이션
라이선스 에러 발생시 대처 방법 안내 - 마이그레이션 방법

ComponentOne(컴포넌트원)을 사용하여 개발한 솔루션 빌드 또는 실행시에 발생하는 라이선스의 에러에 대해서 알아보고, 이를 대처 하는 방법을 설명합니다. 

빌드 또는 실행 시, 라이선스 에러가 발생하는 주요 원인은 아래와 같습니다. 

구버전에서 신버전으로 업그레이드를 하시는 경우
다른 PC에서 다른 C1버전으로 개발한 소스를 가져와서 사용하시는 경우
체험판 상태에서 프로젝트를 개발하다가 정식 라이선스를 사용하시는 경우

위와 같은 경우, 
이전 프로젝트에서 사용했던 Licenses.licx 또는 DLL들의 버전 정보와 현재 설치된 ComponentOne 제품의 버전 정보가 일치하지 않아 라이선스 에러 또는 빌드 에러가 발생할 수 있습니다.
이 경우, 라이선스 마이그레이션 과정으로 통해 프로젝트에서 참조 중인 DLL들과 Licenses.licx 정보를 업데이트하면 됩니다. 
아래의 과정을 따라해 주시기 바랍니다. 

라이선스 활성화 확인

1. 먼저 프로젝트를 빌드하기 위해서는 정상적으로 라이선스가 설치(액티베이션) 되어 있어야 합니다. 라이선스가 액티베이션(활성화)이 되어 있는지 확인하기 위해서는 아래와 같은 과정을 따라하시면 됩니다.

[2020 V2 이상 버전]
구매 시에 메일의 링크를 통해서 받으신 설치 프로그램인 ComponentOneControlPanelKR.exe를 실행하셔서 아래와 같이 라이선스 - 비활성화 탭을 클릭합니다.
라이선스 키 부분의 콤보박스를 클릭하면 현재 설치되어 있는 라이선스를 보실 수 있습니다. 여기에서 라이선스가 보여진다면 액티베이션이 되어 있는 것입니다.

또는 아래와 같은 GrapeCity License Manager를 통해서도 확인이 가능합니다.

- 프로그램 위치: C:\ProgramData\GrapeCity\gclm\gclm.exe 
(윈도우 시작 버튼 클릭 후 License Manager로 검색하여 실행하실 수도 있습니다.) 

프로그램에서 Product License Activated 항목이 보여 진다면 해당 제품 (아래 예제의 경우에는 ComponentOne Studio Enterprise 제품)이 정상적으로 활성화가 된 것입니다.

[2020 V1 이하 버전]

C1LicenseActivation 프로그램을 사용하시면 됩니다.

해당 프로그램은 아래의 위치에 존재합니다.

C:\Program Files (x86)\Common Files\ComponentOne Shared\C1LicenseActivation.exe 
이 프로그램에서 Serial Number부분의 (물음표) 버튼을 클릭하셨을 때 라이선스가 보여진다면 정상적으로 액티베이션(활성화)이 되어 있다고 생각하시면 됩니다.

이렇게 확인했을 때 액티베이션이 되어 있지 않다면 아래의 글을 참고하셔서 라이선스 
액티베이션을 해주시기 바랍니다.

2020 V2 이상 버전
(2020 V2 이상) 온라인 라이선스 활성화 및 비활성화
(2020 V2 이상) 오프라인 라이선스 인증 및 해제

2020 V1 이하 버전  2020년 10월 이후 구매자
(2020V2 이상) 하위 버전 라이선스 활성화/비활성화 방법 

2020 V1 이하 버전  2020년 9월 이전 구매자
ComponentOne 온라인 라이선스 활성화 및 비활성화

프로젝트 마이그레이션 방법 /프로젝트 마이그레이션 방법 /프로젝트 마이그레이션 방법 /프로젝트 마이그레이션 방법 /프로젝트 마이그레이션 방법 

[방법1: 프로젝트 다시 빌드]

이제 라이선스가 액티베이션(활성화) 되었다면 VisualStudio 빌드 메뉴에서 솔루션 정리 후, 솔루션 다시 빌드한 다음 프로그램을 실행해 보시기 바랍니다.
이것만으로 문제가 해결되는 경우가 있습니다.

[방법2: DLL 및 License.licx 삭제 및 재생성 ]

위 방법을 실행하여도 동일한 문제가 발생한다면, 반드시 프로젝트를 백업하시고 아래의 방법을 따라 마이그레이션을 진행하여 주시기 바랍니다.
솔루션 탐색기의 Properties 하위에 있는 licenses.licx파일과 참조 하위에 있는 C1으로 시작하는 이름을 따로 적어둔 후 모든 dll을 삭제합니다.

실제 프로젝트가 존재하는 경로의 필요 없는 Bin폴더나 Debug 폴더를 모두 삭제합니다.
(만약 Visual Studio가 실행 중이라 해당 폴더가 지워지지 않는다면, Visual Studio를 종료한 다음 삭제합니다.)

솔루션 탐색기의 해당 동일 프로젝트에서 마우스 우클릭 후 빈 Windows Form을 하나 추가합니다.

새로 생성한 빈 폼에 도구 상자로부터 현재 사용중인 C1의 컨트롤을 드래그하여 올려놓습니다.
C1.Win.C1Chart.Toolbar.4.5.2 등의 일부 dll은 도구 상자의 C1 컨트롤을 끌어와 추가하시더라도 자동으로 추가되지 않을 수 있습니다.

이 경우, 참조를 직접 추가하시는 방법을 안내드립니다.참조를 마우스 우클릭하여 참조 추가를 선택합니다.
솔루션 빌드 시, 오류가 발생하는 네임스페이스를 확인하여 [어셈블리 - 확장] 탭에서 찾아 직접 추가합니다.
추가했던 빈 Windows Form을 삭제합니다.

솔루션 내 C1 컨트롤을 사용 중인 모든 프로젝트에 대해 위의 1~5 단계를 반복합니다.
전체 솔루션을 Rebuild 한 후, 프로그램을 실행합니다.
이제 프로젝트 마이그레이션 과정이 완료되었습니다. 




$ find ./ -name licenses.licx | xargs grep Version
./APM/APM/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/APM/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/APMCommManager/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/AMS/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20113.21313, Culture=neutral, PublicKeyToken=a22e16972c085838
./APM/Screen/AMS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/AMS/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/CFG/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/CFG/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/DBM/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20113.21313, Culture=neutral, PublicKeyToken=a22e16972c085838
./APM/Screen/DBM/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/DST/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20113.21313, Culture=neutral, PublicKeyToken=a22e16972c085838
./APM/Screen/DST/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/DST/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/INQ/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/INQ/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/MWM/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/MWM/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20113.21313, Culture=neutral, PublicKeyToken=a22e16972c085838
./APM/Screen/MWM/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/PMA/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/PMA/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/PMS/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/PMS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/PMS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/POP/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/POP/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/RPT/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/RPT/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/RPT/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20113.21313, Culture=neutral, PublicKeyToken=a22e16972c085838
./APM/Screen/RTP/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/RTP/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/SEC/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20113.21313, Culture=neutral, PublicKeyToken=a22e16972c085838
./APM/Screen/SEC/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/SEC/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/SMS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/SMS/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20113.21313, Culture=neutral, PublicKeyToken=a22e16972c085838
./APM/Screen/SMS/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/TAT/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/TAT/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/TMS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/TMS/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20113.21313, Culture=neutral, PublicKeyToken=a22e16972c085838
./APM/Screen/TPS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/TPS/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/TRA/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/TRA/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.1.20113.214, Culture=neutral, PublicKeyToken=79882d576c6336da
./APM/Screen/TRA/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.6.20113.647, Culture=neutral, PublicKeyToken=79882d576c6336da

xterm@DESKTOP-VVAIF4D MINGW64 /d/takeover/exture_apm_30_00
$



After Version Up) After Version Up) After Version Up) After Version Up) After Version Up) After Version Up) After Version Up)



xterm@DESKTOP-VVAIF4D MINGW64 ~/Downloads/tmp/versionup_ver_20_00/APM
$ find ./ -name licenses.licx | xargs grep Version
./APM/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./APMCommManager/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/AMS/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=a22e16972c085838
./Screen/AMS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/CFG/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/DBM/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/DST/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/DST/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=a22e16972c085838
./Screen/INQ/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/INQ/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/MWM/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/MWM/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=a22e16972c085838
./Screen/PMA/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/PMS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/POP/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/RPT/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/RPT/Properties/licenses.licx:C1.C1Excel.C1XLBook, C1.C1Excel.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/RPT/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=a22e16972c085838
./Screen/RTP/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/SEC/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=a22e16972c085838
./Screen/SEC/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/SMS/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=a22e16972c085838
./Screen/SMS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/TAT/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/TMS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/TMS/Properties/licenses.licx:C1.Win.C1Chart.C1Chart, C1.Win.C1Chart.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=a22e16972c085838
./Screen/TPS/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da
./Screen/TRA/Properties/licenses.licx:C1.Win.C1FlexGrid.C1FlexGrid, C1.Win.C1FlexGrid.4, Version=4.0.20183.338, Culture=neutral, PublicKeyToken=79882d576c6336da

xterm@DESKTOP-VVAIF4D MINGW64 ~/Downloads/tmp/versionup_ver_20_00/APM

+ Recent posts