반응형

 

 

웹에 있는 소프트웨어 버전정보를 수집하는 간단한 스크래핑 python 스크립트가 있다.

 

이 스크립트는 몇 가지 소프트웨어 목록에 대해 스크래핑을 수행하는데

 

개발하다보니 각 소프트웨어 목록들의 정보 수집을 위해 공통된 요소를 갖게 됨을 볼 수 있었다.

 

  • 고정된 URL 주소
  • 스크래핑 파서의 selector path
  • 파싱된 내용에서 원하는 내용만 추출하기 위한 regex(정규식)

이 데이터는 DB 테이블에 저장해서 사용하는 방식으로 개선되었다.

 

이전에는 파싱 규칙들이 소스코드에 하드코딩되어 있어 난잡해보였던것에 비해

DB에 저장되니 소스코드도 깔끔해지고 DB를 통해 구조적으로 확인하고 수정할 수 있어서 좋았다.

 

 

하지만, 당장 소스코드는 깔끔해질지 몰라도 형상 관리 측면에서 좋진 않았다.

 

웹페이지 내용이 변경되면 스크래퍼의 파싱 규칙을 수정해야한다.

 

즉, DB테이블에 저장된 파싱 규칙 (주로 selector path) 를 수정해야하는데

 

DB를 수정하고 커밋하게 되면
(여기서 말하는 DB는 PC로컬에 저장되는 sqlite db이며 해당 DB file을 commit하는 구조, 일반적으로 RDBMS를 사용하는 방식과 도메인 특성상 다른 부분이긴함...)

 

git revision에서 변경 사항에 대해 확인할 수 없게 되는 단점이 있다.

 

 

요약해보면, 소스코드의 개선을 위해 특정 데이터를 DB에 저장했지만, 결국 유지보수 측면에서 손해보는 부분이 생긴것이다. 이렇듯 시점별 작업자 ( 굳이 따지자면 초기 개발자와 유지보수하는 개발자 )의 관점 과 입장에 따라 좋은게 좋은게 아니게 되는 상황이 발생하기도한다.

 

처음엔 항상 모든걸 간결하게 만드는게 답인줄 알았지만, 현실을 그렇지 않다. 답답해이고 이해가 안되는 방식이라도 나름의 이유가 있는 것들이 있기도하다. ( 하지만, 대부분 구린내가 나면 문제가 있는게 맞긴하다..ㅎㅎ )

 

 

 

 

반응형
반응형

응용 프로그램의 side-by-side 구성이 잘못되어 응용 프로그램을 시작하지 못했습니다. 자세한 내용은 응용 프로그램 이벤트 로그를 참조하거나 sxstrace.exe 도구를 사용하십시오.

 

 

 

이벤트 뷰어에서 로그 확인하기

VC90.MFC 키워드를 보니 재배포 패키지 문제로 예상된다.

 

 

https://www.microsoft.com/ko-kr/download/details.aspx?id=26368 

 

Download Microsoft Visual C++ 2008 Service Pack 1 재배포 가능 패키지 MFC 보안 업데이트 from Official Microsoft Dow

중요! 아래에서 언어를 선택하면 전체 페이지 내용이 해당 언어로 신속하게 변경됩니다. 독일어러시아어스페인어영어이탈리아어일본어중국어(간체)중국어(번체)프랑스어한국어 다운로드 Visual

www.microsoft.com

에서 2008 재배포 패키지를 설치해주자

 

 

재배포 패키지르 설치 한 후 제어판에서 확인한 모습

x64만 설치했는데 안되서 x86도 설치했다.

(응용프로그램이 x86 아키텍쳐라면 그럴 수 있다.)

 

끝.

반응형
반응형

'Install Windows Hypervisor Platform (WHP) automatically' 는 무슨 의미?

Install Windows Hypervisor Platform (WHP) automatically 를 체크하게 되면 WHP 를 VMware setup 설치 중에 설치해준다는 의미입니다. 이는 Windows 기능을 통해 설치할 수도 있습니다.

 

VMware 설치 중 WHP 내용이 보여 알아봤습니다.

( 사용된 setup : https://download3.vmware.com/software/wkst/file/VMware-workstation-full-16.1.2-17966106.exe )

 

Installer detected the host has Hyper-V or Device/Credential Guard enabled. To run VMware Workstation Pro on hosts with Hyper-V or Device/Credential Guard enabled, install Windows Hypervisor Platform (WHP) on the host through 'turn Windows features on or off', or remove the Hyper-V role from the system. Check the following checkbox if you want installer install WHP on the host automatically.

설치 프로그램이 호스트에서 Hyper-V 또는 Device/Credential Guard가 활성화되어 있음을 감지했습니다. Hyper-V 또는 Device/Credential Guard가 활성화된 호스트에서 VMware Workstation Pro를 실행하려면 'Windows 기능 켜기 또는 끄기'를 통해 호스트에 Windows WHP(Hypervisor Platform)를 설치하거나 시스템에서 Hyper-V 역할을 제거합니다. 설치 프로그램이 호스트에 자동으로 WHP를 설치하도록 하려면 다음 확인란을 선택합니다.

 

기존에 VirtualBox나 VMware 를 사용하려면 Windows의 Hyper-V 비활성화해야만 했습니다.

하지만 Windows 10 20H1(20.04) 그리고 VMware 15.5 부터 WHP가 지원됩니다.

결론부터 보면 WHP 덕분에 VirtualBox나 VMware 사용시 Hyper-V 를 비활성화하지 않아도됩니다.

 

 

 

왜 Hyper-V가 활성화된 Windows 10에서 VirtualBox나 VMware를 실행할 수 없을까?

 

VirtualBox와 VMware 는 level2 hypervisor입니다. 반면 Hyper-V는 level 1입니다.

level2는 OS에서 어플래케이션으로 실행되지만, level1 은 OS자체로 hypervisor가 실행됩니다.

하이퍼바이저(영어: hypervisor)는 호스트 컴퓨터에서 다수의 운영 체제(operating system)를 동시에 실행하기 위한 논리적 플랫폼(platform)을 말한다.

출처 : https://ko.wikipedia.org/wiki/하이퍼바이저

따라서 Hyper-V가 활성화되는 경우 OS자체가 Hyper-V의 가상머신이 되므로

이 가상머신 위에서 VirtualBox나 VMware 를 실행하게 되면 아래 메세지를 보게되는 것입니다.

the Intel VT-X instruction are no longer accessible from your virtual machine, only the host has access to it.

 

 

WHP 로 인해

VirtualBox나 VMware 사용시 WHP로 인해 더 이상 Hyper-V 를 비활성화하지 않아도 된다고 했습니다.

이전에는 Hyper-V가 활성화되면 VirtualBox나 VMware가 가상화에 필요한 host 자원에 직접 접근하지 못해 실행할 수 없었지만, WHP의 API로 인해 이런 제한이 사라졌습니다.

 

참조

https://blogs.vmware.com/workstation/2020/05/vmware-workstation-now-supports-hyper-v-mode.html

https://superuser.com/questions/1208850/why-cant-virtualbox-or-vmware-run-with-hyper-v-enabled-on-windows-10

https://itigic.com/ko/use-virtualbox-and-vmware-alongside-hyper-v/

https://docs.microsoft.com/en-us/virtualization/api/

 

반응형
반응형

 

#define _CRT_SECURE_NO_WARNINGS

#include <sstream>
#include <chrono>
#include <time.h>
#include <iomanip>
#include <iostream>

std::stringstream Timestamp()
{
    auto now = std::chrono::system_clock::now();
    std::time_t t = std::chrono::system_clock::to_time_t(now);
    auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();

    std::stringstream ss;
    ss << std::put_time(std::localtime(&t), "%F %T.") << std::setfill('0') << std::setw(3) << ms % 1000;
    return ss;
}

int main()
{
    std::cout << Timestamp().str() << std::endl;
    return 0;
}

 

출력 예시

2021-08-19 23:27:03.063

 

 

(milliseconds를 epoch 나머지로 직접 구하는 방법 말고는 없는걸까? 기본 제공되는 함수라던가)

 

반응형

+ Recent posts