HaruGakka Translate-Develop Blog

TimeTimer와 Focus-To-DO

|

TimeTimer와 Focus-To-Do에 대한 고찰

TL;DR;(Too Long, Don`t Read - 세줄요약의 영어판) : 타임 타이머는 프로젝트마다 시간을 정하고. Focus-To-Do는 일할 시간을 정하고 한번 도는 형태입니다. 저는 규칙적인 사람이 아니라 타임타이머가 좋습니다. ;ㅁ;

전 의식하지 않으면 시간이 무한정 있는 자원이라고 생각하기 때문에, 항상 마감 기일을 되새기면서 작업을 하고 있습니다. 8월 1일 타겟이니까 빨리 해야해! 이렇게요.

그런데 일때문에 정신이 없거나, 혹은 아침이라 혼이 빠져 있는 상태거나, 아니면 그냥 머리가 안 돌아가는 날은 일정이라는 걸 생각하면서 일하기도 쉽지 않고. ( 사실 그냥 일하기도 쉽진 않지만. ) 그냥 축 늘어져버려 그로인해 작업 효율이 쭉 떨어지는 경험을 몇번 해봤습니다.

그래서 전 ‘정신이 빠져있을 때도 축 늘어지지 않는’ 솔루션을 원했고, 두 프로그램을 지금까지 사용해 봤습니다.

TimeTimer와, Focus-To-Do입니다.

TimeTimer

타임타이머는 타이머입니다. 타이머와 하는 역활도 똑같지만, 하나 다른 점은 ‘남은 시간을 시각적으로’ 보여준다는 점입니다.

저는 그리 디지털적이지 않아 숫자보다는 그래프를 좋아하고. 직관적인게 머리에 잘 들어옵니다. 제가 MMORPG에서 힐러를 할 때도, 우리 파티원의 채력이 300남았다. 라는 UI보다는 붉은 색으로 번쩍이며 HP바가 바닥을 기어간다는 게 더 집중이 잘 되더라고요.

타임타이머는 시간을 HP바처럼 표현할 수 있습니다. 다가오는 위기의식을 느낄수도 있습니다. PC 버전은 여러 타임 타이머를 만들어 관리할 수 있는데요. 저는 QA용 타이머, 그리고 특정 이슈용 타이머들을 만들고. 둘을 번갈아 사용하면 더욱 효율적으로 관리 할 수 있었습니다.

Focus-To-Do

Focus-To-Do는 타임 타이머와 비슷하지만 다른 입장을 견지합니다. 타임 타이머는 ‘한 개의 프로젝트에 할당 된’ 시간을 보여주지만. Focus-To-Do는 ‘한 번의 행동에 할당된’ 시간을 보여줍니다. 즉. Focus-To-Do는 한개의 재한된 시간을 여러 프로젝트가 쉐어하는 방식입니다.

여기서 한개의 재한된 시간을 ‘포모두루’라고 하는데, 공부법에서 따온 명칭이라고 합니다. Focus-To-Do에서의 프로젝트는 이 포모두루를 몇개 사옹할지 정하는 방식입니다. 그런데 한 프로젝트를 하다가 컨텍스트 스위칭이 발생하면, 스위칭한 그 프로젝트에도 포모두루가 하나 쌓입니다!

더 직관적으로 설명드리자면. 60분의 포모두루가 있다고 했을 떄, A 프로젝트는 한 3시간이 걸릴 것 같아 3 포모두루를 할당하고 타이머를 시작한다고 가정해봅시다.

처음 30분을 A 프로젝트를 목표로 열심히 하다가. QA 업무가 내려와서 QA 프로젝트를 생성, 1 포모두루를 할당하곤 남은 30분을 QA에 투자한다면. A 프로젝트의 포모두루가 하나 차감되고, QA 프로젝트의 포모두르가 하나 차감됩니다. 전혀 직관적이지 않지만. 포모두루 방법론에서는 한 개의 시간을 여러 프로젝트가 사용한거니까. 그냥 하나씩 까버리는 걸로 퉁칩니다.

즉, 이 방법론은 ‘여러 개의 연속된 프로젝트’를 진행할 때 도움이 될 겁니다. A와 B가 연관되어있다면, 이 프로젝트의 포모두르는 둘 다 차감해도 되니까요.

결론

Focus-To-Do는 저에게 잘 맞지 않은 것 같습니다. 규칙적이고 계획적인 행동을 요구하는 프로그램인데. 이는 철저한 스캐쥴에 맞게 돌아가야 효율이 나올 것 같습니다. 저는 그리 계획적이지도, 규칙적이지도 않기 때문에 ‘언제든지 타이머를 멈추고 조정할 수 있는’ TimeTimer를 사용하고 있습니다.

TimeTimer는 능동적이고, 뭔가 크게 틀어졌을 때 수정하기도 쉽고. 컨텍스트 스위칭도 직관적입니다. 그냥 다른 타이머를 다시 작동하는거니까요. 다만 Focus-To-Do에 비하면 아주 UI가 구립니다. 웹 형식으로 되어 있습니다.

#Development/R&D

C++ 20 모듈 시스템

|

히스토리

2019-07-28 / 문서 생성.

2019-07-28 / 모듈 선언 방식 추가, 컴파일 불가능 한 코드들 수정. 모듈 시스템에서 불가능한 대표적인 것들, 서브 모듈이 안되는 이유, 문단 나누기 수정.

2019-07-28 / 파일 이름 중복 수정

C++ 20 모듈 시스템

C++20.. 에 수많은 것들이 추가되는데. 아마 적용되자마자 가장 빠르게 코드가 난독화 될(…) 모듈 시스템을 초간단 요약해봤습니다.

이제 모듈 시스템으로 헤더 <-> 소스 파일 구분이 불필요해졌습니다. 물론. 기존의 include도 지원합니다! 즉, 둘 다 알아야 할 수도 있습니다! ;ㅁ;…

기본적인 선언 방식

모듈을 정의할때는 기본적으론 다음과 같은 문법을 따릅니다.

모듈의-정의:
	["export"] "module" 모듈-이름 [모듈-파티션] ";"

모듈-파티션: 
	":" 모듈-파티션-이름;

이를 한번 보시고. 이제 한번 밑에 글을 천천히 읽어주세요!

기초 모듈 시스템

우선 예제코드를 보시죠 :

//module.cpp
exprot module hello;

export const char * get_hello() { return "Hello!, World!";  }
const char * get_not_hello() { return "Hello!, World!"; }

이제 이 파일을 들고올때는 간단히 아래와 같이 적으면 됩니다.

//main.cpp
import hello; 
import <iostream>; //기존 헤더파일도 이렇게 들고 올 수 있습니다. 세미클론은 필수 입니다.  

int main ()
{
	get_hello(); //컴파일 성공! 
	//get_not_hello(); //컴파일 실패..
}

바깥으로 들고오려면, 앞에 export를 선언해주면 됩니다.

파티션

모듈 시스템의 기능중 하나는 모듈을 파티션별로 나눌 수 있습니다. 한 모듈안에 여러개의 파일이 포함될 수 있습니다!

//module.cpp
export module hello; 
//이 선언은 별개의 모듈을 선언한게 아니라
//이 모듈의 부분(파티션)들을 선언한겁니다. 	

//둘의 차이점은, 별개의 모듈(아래 설명할 서브모듈)은 분리가 가능하지만. 
//모듈의 부분은 (파티션)은 분리가 불가능합니다. 
export import :eng;
export import :ko;
//중요한 점은, *반드시* 모든 파티션들을 선언해줘야 합니다. 직접적으로든, 간접적으로든. 이는 C++ 표준상 제약이며, 미정의 행동을 유발할 수 있습니다.
//module_eng.cpp
//모듈 분리! 이건 모듈의 부분입니다. 
export module hello:eng;  //이런 선언을 파티션을 인터페이스화 했다고 할 수 있습니다. 이제부터 외부노출이 가능합니다. 

export const char * get_hello_eng()
{ return "Hello, World!";}

//module_ko.cpp
//모듈 분리! 이건 모듈의 부분입니다. 
export module hello:ko;  //이런 선언을 파티션을 인터페이스화 했다고 할 수 있습니다. 이제부터 외부노출이 가능합니다. 

export const char * get_hello_ko()
{ return "안녕, 세상!";}
//main.cpp
import hello; 
import <iostream>

int main()
{
	std::cout << get_hello_eng() << get_hello_ko(); //정상 작동! 
}

구현과 정의단 분리

모듈 시스템에서도 구현단과 정의단의 분리가 가능합니다.

//module.cpp
//모듈 구현 분리! 여기서 선언만 해줍니다.
export module hello;
import :ko; //여기서 정의하면, export할 필요가 없습니다. 

export const char * get_hello_ko(); //선언! 외부 노출용 인터페이스이기 때문에, 선언부에서 export해줘야 합니다.
//module_ko.cpp
//모듈 분리! 이건 모듈의 부분입니다. 
module hello:ko; //역시 export해주지 않아도 됩니다. 

const char * get_hello_ko() //정의!
{ return "안녕, 세상!";}

으음. 저는 모듈의 일부만 불러오고 싶어요!

불가능합니다! ;ㅁ; 아래 예제를 봐주시죠.

//module_hello.cpp
export module hello;

export import hello.hi;
export import hello.welcome;

//module_hello_hi.cpp
export module hello.hi;

export const char * get_hello_ko() //정의!
{ return "안녕, 세상!";}

//module_hello_welcome.cpp
export module hello.welcome;

export const char * get_hello_eng()
{ return "Hello, World!";}
//main.cpp
import hello;

int main()
{
	get_hello_eng();
	get_hello_ko(); //둘다.. 되긴 합니다. 
}

위 예제를 보시면 문법상으로 C#의 System.Text와 같은 서브모듈의 분리가 가능한 것 ‘처럼’ 보이지만, 실제 구현상으론 그냥 별개의 모듈로 작동합니다. module에서 보다싶이. 그냥 다른 모듈을 import한 걸 외부에 노출시키겠다는 선언 그 이상도, 그 이하도 아닙니다. 헤더파일을 예로 들면.

#include <hello.h>
#include <hello_hi.h>
#include <hello_welcome.h>

이게 구현되지 않은 이유는 C++의 언어 특징에 밀접하게 관련이 있습니다 .

C++은 네이티브 언어이기에, API뿐만 아니라 ABI도 신경써야 합니다. 예를 들어 System과, System의 서브모듈(이고 싶은) System.Sub, System.Main이 있다고 해봅시다.

만약 C++이 다른 언어와 같이 서브모듈을 지원하려면 System.Sub를 가져올 시 연관 관계에 있는 System도 들고와줘야 합니다. 그야 System의 일부분이니까요. 그리고 사용자가 System.RemoveSystem을 만들어서 System에 붙일 수도 있겠지요. 하지만 모듈 시스템에선 불가능합니다. ABI를 덧 붙이는 방법은 없으니까요. 그래서 위 코드는 그냥 모듈 세 개의 이름이 다른 것 뿐입니다.

다만 이름이 ‘System’, ‘System.Submodule’인 건 여전히 가능합니다. 기술적으로는 아무런 의미가 없고, 바이너리도 독립적으로 나오겠지만 구분상으로 도움이 될 수 있습니다.

대표 오류 사례들.

외부 노출되지 않은 파티션은, 모듈이 export import할 수 없습니다.

//foo.cpp
module A:Foo;
//A.cpp
export module A; 
exprot import :Foo; // 불가능합니다! foo는 export되지 않았거든요.

위 오류는 파티션이 노출이 되지 않았기에 export도 불가능한 사례입니다. export import는 오직 export module이 된 파티션에만 적용됩니다. 즉. 이게 외부로 노출된 인터페이스( export module로 노출시키는 거지요!)가 아니라면 export import도 불가능합니다.

export module은 반드시 한번씩만 사용되야 합니다.

//A.cpp
export module A;
export void A2();
export void A3();
//A_anoter.cpp
export module A; 
export void A1();

export module은 여러번 나올 수 없습니다. 이유가 몇개 있는데요. 하나는 ‘ 다른 사람의 모듈에 강제로 자기 코드를 넣게 해도 되는가? ‘ 라는 이유가 있고요. 가장 중요한 이유는 현재 컴파일러는 이 설계에 대처하지 않았기 때문입니다.

조금 더 예시를 들어보면. 현재 파일이 두 개니까, 두 번의 컴파일러 콜이 생성되겠군요. 그런데 컴파일러 호출마다, 이 파일이 merge해야 하는지, 아님 그냥 사용자가 실수로 적은 건지 판단하기 어렵습니다. (게다가, 멀티 스레딩까지 가세한다고 생각해보면 머리가 터지겠죠.) 그냥 단순히 복붙을 했을수도 있고. ( 그러면 중복 인터페이스로 컴파일 에러를 내뱉을거고요. ) 사용자가 이 모듈에 코드를 집어 넣고 싶은 걸 수도 있고. ( 이럴 경우 머지를 해줘야 겠고요. ) 리펙토링하고 까먹어서 나온 걸지도 모르겠지요. 그걸 다 판단하기보다는 그냥 export module이 하나 이상이면 에러인게 더 간단하겠지요.

물론 컴파일러가 이 파일들을 merge 해줄 수는 있겠지만, 그로 인해 얻는 장점은 별로 없고. 컴파일러 설계만 더 복잡해 질 것 입니다.

모든 인터페이스 파티션들은 ( export module한 파티션들은 ) 반드시 기반 인터페이스( 파티션을 잡은 부모 모듈 )에서 다시 export 되야 합니다.

이름부터 어렵지만. 그냥 조심 해주시면 되는 간단한 문제입니다.

//module_cats_sound.cpp
export module Cats:Sounds;

export void yaong();
export void maww();

//module_cats_behavior.cpp
export module Cats:Behaviors;

export void export_object_to_ground();
export void eject_from_home(); 
export void kill_sopa();
//module_cats.cpp;

export module Cats;

export import :Behaviors;

import Cats;

int main() {
	export_object_to_ground();
	eject_from_home();
	kill_sopa(); 

	yaong(); //에러! export되지 않았습니다! 
}

파티션들을 외부에서 사용하고 싶으시면, 두가지만 조심해주시면 됩니다. 하나는 파티션을 인터페이스 유닛으로 뽑아주시고요. ( export module module:partion; ) 하나는 파티션을 친 기본 모듈에서 파티션을 export해주는 것입니다. ( exprot import :partion;)

참고 : Understanding C++ Modules: Part 1: Hello Modules, and Module Units

위 포스터의 영향을 강력히 받았습니다. 자세한 사항은 저 블로그를 참고해주세요!

History:

#Development/R&D #Development/C++/C++20

TreeView Guide

|

Tree View Guide

이 가이드에서는 Visual Studio 코드에 대한 View Container 및 Tree View를 제공하는 확장을 작성하는 방법을 설명합니다. 위 링크에서 소스 코드가있는 샘플 확장을 찾을 수 있습니다.

View Container

View Container는 기본으로 제공되는 View Container옆에 표시되는 View 목록을 포함합니다.

View Container

View Container에 View를 추가하려면 먼저 contributes.viewsContainers를 사용하여 등록해야합니다. ‘package.json`에 있는 Contribution Point에서(직역하면 기여 포인트이지만, ‘리스트를 추가하는 장소’정도로 생각하시면 됩니다. - 역주) 다음 필수 입력란을 지정해 주어야 합니다.

  • id : 생성할 새로운 View Container의 이름
  • title : View Container의 상단에 나타날 이름
  • icon : 액티비티 바의 View Container에 표시 될 이미지
"contributes": {
  "viewsContainers": {
    "activitybar": [
      {
        "id": "package-explorer",
        "title": "Package Explorer",
        "icon": "media/dep.svg"
      }
    ]
  }
}

Tree View

View는 View Container 안에 표시되는 UI 섹션입니다. contributes.views에 있는 Contribution Point를 사용하면 내장되거나, 생성되어 있는 View Container에 새로운 View를 추가 할 수 있습니다.

View

View를 제공하려면 먼저 contributes.views를 사용하여 등록해야합니다.package.json의 Contribution Point에 있는 View의 식별자와 이름을 지정해야하며 다음 위치에 작성할 수 있습니다.

  • explorer : 사이드 바에있는 탐색기View
  • debug : 사이드 바에있는 디버그 View
  • scm : 사이드 바에있는 소스 컨트롤View
  • test : 사이드 바에있는 탐색기View 테스트
  • 생성한 View Container

예제:

"contributes": {
  "views": {
    "package-explorer": [
      {
        "id": "nodeDependencies",
        "name": "Node Dependencies",
        "when": "explorer"
      }
    ]
  }
}

사용자가 View를 열면 VS Code는 activationEventonView:${viewId}를 실행합니다. (위의 예에서onView:nodeDependencies). when 컨텍스트 값을 제공하여 View를 언제 보여줄 지를 제어 할 수도 있습니다.

View Actions

View의 다음 위치에서 작업을 제공 할 수 있습니다.

  • view/title : View 제목에 액션을 표시 할 위치입니다. 기본 또는 인라인 동작은 "group": "navigation"을 사용하고 나머지는 ... 메뉴에 있는 보조 동작입니다.

  • view/item/context : Tree 항목에 대한 액션을 보여주는 위치. 인라인 액션은``group “: “inline “을 사용하고 나머지는 …` 메뉴에 있는 보조 동작입니다.

when 속성을 사용하여 이러한 액션을 언제 보여줄 지를 제어 할 수 있습니다.

예제 :

"contributes": {
  "commands": [
    {
      "command": "nodeDependencies.refreshEntry",
      "title": "Refresh",
      "icon": {
        "light": "resources/light/refresh.svg",
        "dark": "resources/dark/refresh.svg"
      }
    },
    {
      "command": "nodeDependencies.addEntry",
      "title": "Add"
    },
    {
      "command": "nodeDependencies.editEntry",
      "title": "Edit",
      "icon": {
        "light": "resources/light/edit.svg",
        "dark": "resources/dark/edit.svg"
      }
    },
    {
      "command": "nodeDependencies.deleteEntry",
      "title": "Delete"
    }
  ],
  "menus": {
    "view/title": [
      {
        "command": "nodeDependencies.refreshEntry",
        "when": "view == nodeDependencies",
        "group": "navigation"
      },
      {
        "command": "nodeDependencies.addEntry",
        "when": "view == nodeDependencies"
      }
    ],
    "view/item/context": [
      {
        "command": "nodeDependencies.editEntry",
        "when": "view == nodeDependencies && viewItem == dependency",
        "group": "inline"
      },
      {
        "command": "nodeDependencies.deleteEntry",
        "when": "view == nodeDependencies && viewItem == dependency"
      }
    ]
  }
}

참고: 특정 항목에 대한 작업을 표시하려면 TreeItem.contextValue를 사용하여 Tree 항목의 컨텍스트를 정의하고 when 연산자의 키 viewItem에 대한 컨텍스트 값을 지정할 수 있습니다.

예제 :

"contributes": {
  "menus": {
    "view/item/context": [
      {
        "command": "nodeDependencies.deleteEntry",
        "when": "view == nodeDependencies && viewItem == dependency"
      }
    ]
  }
}

TreeDataProvider

확장 작성자는 TreeDataProvider를 프로그래밍 방식으로 등록하여 View의 데이터를 채워야합니다.

vscode.window.registerTreeDataProvider('nodeDependencies', new DepNodeProvider());

구현을 위해 nodeDependencies.ts를 참조하십시오.

TreeView

프로그래밍 방식으로 View에 대해 일부 UI 작업을 수행하려면window.registerTreeDataProvider 대신 window.createTreeView를 사용할 수 있습니다. 그러면 View 조작을 수행하는 데 사용할 수있는 View에 대한 액세스 권한이 얻을 수 있습니다.

vscode.window.createTreeView('ftpExplorer', { treeDataProvider: new FtpTreeDataProvider() });

구현을 위해 ftpExplorer.ts를 참조하십시오.

The State Of C++ on Windows

|

The State Of C++ On Windows

원문

2019년 국정 연설(미국 국정 연설. - 역주)이 연기되었으니. 제가 그 틈을 타 Windows의 C++ 소식을 알려드리겠습니다! ( 미연방 국정 연설은 영어로 State Of Union Address인데, 원작자가 말장난으로 State Of C++을 썼습니다. 한국어로 번역하면 윈도우 C++ 국정 연설정도 됩니다. - 역주)

C++은 여전히 중요한 프로그래밍 언어고, Windows 플렛폼에서 결과를 얻을 수 있는 유일한 시스템 프로그래밍 언어입니다. Visiual Studio 2019 릴리즈에서도 몇 주 동안 공유할 수 있는 놀라운 정보들이 있지만. 오늘은 C++ / WinRT에 대한 업데이트를 알려드릴려고 합니다.

C++/WinRT는 개발자들이 현대적이고 표준적인 C++을 지향하면서 WRL(윈도우 런타임 라이브러리)와 C++ / CX를 피하게 되며 더 많이 쓰이고 있습니다. 최근엔 Windows UI 라이브러리가 오픈 소스라는 소식을 들으셨을 건데, 그게 C++ / WinRT로 만들었다는 걸 알아차리셨습니까? 이건 그저 한 가지 중요한 예시일 뿐이지만, C++/WinRT로 전환한 많은 팀들이 있고. 우리는 앞으로 WRL이나 C++/CX를 사용하지 못하게 할 것입니다.

C++ / WinRT가 XAML의 많은 부분을 구현하는데 사용된다 하더라도, XAML 응용 프로그램을 만들 때 C++/WinRT를 채택하는 팀들이 적습니다. 이 현상은, C++ / WinRT가 가장 자주 등장하는 세 가지 범주, 혹은 세 가지 시나리오를 이해하는 데 도움이 됩니다.

  1. Windows API 사용 또는 호출 (WinRT 유형 사용이라고도 함)
  2. Windows API 작성 (WinRT 유형 생성이라고도 함)
  3. Xaml 응용 프로그램과 컨트롤 제작

첫 번째는 C++ / WinRT를 사용하여 API를 호출 하여 블루투스, 스트리밍 비디오 통신, Window 셸과의 통합 등과 같은 작업을 처리하는 것입니다. 두 번째는 앞서 말한 기능과, 그래픽 API, 저장소 및 파일 시스템 API, 네트워킹 API등을 제공하는 API 작성을 처리하는 것이고. 세번째는 XMAL 프레임워크에 구축된 앱 및 컨트롤 작성을 처리하는 것입니다. XMAL은 UI를 작성하는 API중 하나일 뿐이지만, 현재 Window에서 지배적인 UI 프레임워크이며 WinRT보다 큰 영향력을 가지고 있기 때문에 동급 취급 받을 자격이 있습니다.

C++/WinRT는 첫번째 범주는 완벽하고, 타협하지 않고 지원합니다. 두번째 범주인 새로운 API 작성은 개발자가 API를 구현하기 전에 IDL(인터페이스 정의 언어)를 사용하여 API의 구조를 정의해야 하기 때문에 조금 더 복잡합니다. 그렇지만 C++/CX를 사용할 때처럼 훨씬 복잡하지는 않으며, C++/WinRT를 사용할 때 얻는 많은 장점을 감안할때 일반적으로 매우 만족할만한 거래입니다.

다만 세 번째 범주인 응용 프로그램 제작은 얘기가 다릅니다. XMAL은 .Net용으로 설계 되었으며 그 의도대로 기능이 반영되어야 합니다. 그렇기에 C++/WinRT로 XMAL 응용 프로그램을 작성할 수는 있지만, 꽤 귀찮습니다. 이건 C++ 개선안에서 아주 중요한 곳입니다.

그렇지만 전 우리가 주변을 돌아 볼 수 있길 바랍니다. Windows가 C++ 개발자들에게 좋은 UI 개발 환경을 가지고 있지 않다는 건 저에게 아쉬움을 남깁니다. C++ 개선안은 장기적으로 이 문제를 해결하는 데 도움이 될 수 있지만, 완성될 때까지 기다릴 수 없으므로 가까운 시일안에 유용하게 사용할 수 있는 몇 가지 옵션을 생각하고 있습니다. 그 중 일부는 Visual Studio에서 더 나은 C++/WinRT 개발 경험을 경험할 수 있도록 DevDiv와의 논의는 물론, XAML의 큰 개선이 필요하지 않은 대안 접근법이 포합됩니다.

C++/WinRT와 xlang에 대한 자세한 내용을 확인하세요. 많은 일들이 벌어지고 있습니다 - 저는 이 글을 막 끝냈지만. 우리가 해온 일들을 공유하기 위해 다시 글을 작성할 것입니다.

Typescript

|

https://code.visualstudio.com/api/get-started/wrapping-up

마무리

In the Your First Extension topic, you learned how to create, run and debug an extension. In the Extension Anatomy topic, you learned fundamental concepts to Visual Studio Code extension development. However, we have only seen the tip of the iceberg, and here are some suggested routes for furthering your VS Code extension development skills.

첫 확장 기능 주제에서는 확장을 어떻게 만들고, 실행하고, 디버깅하는 지 알아봤습니다. 확장 해부하기 주제에서는 VS Code 확장 개발의 기본 개념을 배웠습니다. 그렇지만 우리는 이제야 빙산의 일각만을 봤을 뿐이죠. 그래서 여기 당신의 VS Code 확장 개발 능력을 기울 수 있는 길을 준비해왔습니다.

확장기능과 일해보기

This section includes topics that help you develop high-quality VS Code extension. For example, you can learn

이 문단에서는 어떻게 고-퀄리티의 VS Code 확장을 개발할 수 있는지에 대한 주제가 담겨 있습니다. 예를 들어, 이런 것들을 배울 수 있습니다.

  • How to add integration tests for your extension

  • 어떻게 통합 테스트를 내 확장기능에 추가할 수 있을까요?

  • How to publish your extension to the VS Code Marketplace

  • 어떻게 VS Code Marketplace에 내 확장을 보낼 수 있을까요?

  • How to set up Continuous Integration for your extension

  • 어떻게 내 확장에 지속적인 통합을 준비할 수 있을까요?

지속적인 통합

In this section, we split the VS Code API and Contribution Points into a few categories, each with short descriptions as to what your extension could achieve. Validate that your extension idea is achievable with VS Code API or look for new extension ideas here.

이 섹션에서는 VS Code API와 Contribution Points를 몇 가지 범주로 나누었습니다. 각각은 확장이 달성 할 수있는 것에 대한 간단한 설명이 포함되어 있습니다. 확장 아이디어가 VS Code API로 달성되는지 확인하거나 여기에서 새로운 확장 아이디어를 찾으십시오.

가이드들 & 샘플들

우리는 여러분이 적용할 수 있는 훌륭한 샘플 확장 모음을 가지고 있으며, 그 중 일부는 소스 코드를 설명하는 상세한 가이드를 포함하고 있습니다. Extension Guide Listing 나 vscode-extension-samples 저장소에서 모든 샘플 및 안내서를 찾을 수 있습니다.