타입스크립트(Typescript) 스타터 코드

Web|2022. 9. 4. 08:39

 

 

프로젝트가 반복되면 재사용되는 코드가 많아질 수 밖에 없다. 여러가지 툴을 타입스크립트를 작성하다 보니 그 동안 공통적으로 사용하고 있는 기능을 묶어서 프로젝트로 만들어서 github에 공개해봤다.

https://github.com/joone/typescript-template

 

GitHub - joone/typescript-template: Typescript project template

Typescript project template. Contribute to joone/typescript-template development by creating an account on GitHub.

github.com

물론,  MS가 만든 비슷한 프로젝트도 있는데, 너무 기능이 많고, 내가 원하는 수준에서 만들었는데, 아마도 필요한 분이 있을것 같다.

일단,  프로젝트는 clone하면 기본적으로 아래 package를  사용할 수 있고, 간단한 웹서비스가 구현되어 있다.

  • express.js
  • eslint
  • mocha
  • chai
  • prettier
  • typeorm
  • mongodb
  • Docker

MongoDB를 사용하는 방법이 두가지 있는데, typeorm와 mongoose를 사용한 것 코드를 별도 branch로 분리해두었다. typeorem이 쓰기 편해도 MongDB에는 mongoose가 코드는 복잡해도 더 쉬운 것 같다.

Start your web application:

$ npm start

Run test cases:

$ npm test
$ npm run-script lint

Docker image를 만들어 실행하는 부분도 추가했고, prettier도 지원한다.

Run prettier to fix styles:

$ npm run style

Build a Docker image and run the container:

$ sudo ./build_docker.sh
$ sudo docker ps
$ curl -v http://localhost:3001


향후 계획은 게시판 정도 실행되도록 하는 것이 목표다.

 

댓글()

리눅스 커널 0.01 컴파일 및 부팅하기

FOSS|2022. 7. 17. 04:51

https://web.archive.org/web/20170707093303/http://iamhjoo.tistory.com/11

즐겨찾기한 글이 삭제되어서 어쩔 수 없이 복원에서 공유해봅니다.
 
다행히 다른 분이 이미 리눅스 커널 0.01버전을 잘 정리해두었네요.
https://kjhg4321.gitbook.io/kaldp/
 
 

댓글()

Rust 기반 OpenGL animation toolkit

FOSS|2021. 11. 24. 14:31

오랜 숙원사업(?) 첫삽을 떴습니다. 나만의 오픈소스 프로젝트를 시작해보려고 그동안 여러 시도를 해왔지만, 생각 만큼 진척이 없었습니다. 무엇보다도 부끄럽지 않은 결과를 만들어보고 공개하자는 맘이 앞서다 보니, 뭘 만들어도 막상 공개하려면 부끄러움이 앞서더군요. 하지만 어떤 피드백 없이 혼자 꾸역 꾸역 뭔가 만들어 나가는 것도 보통 의지가 없으면 안됩니다. 리누스 토발즈가 말했는이, 제대로된 구조 보다 일단 동작 가능하게 만들어야 한다. 그리고 자주 업데이트하고 릴리스 하면 된다는 말을 떠올리면 일단 최소한 동작 가능한 수준에서 공개를 했습니다.

처음 Rust와 OpenGL 배우는 분께는 더할 나위없이 좋은 프로젝트입니다. 왜냐하면 코드 아주 간단하거든요. 별로 기능이 없습니다.  저도 역시 배우는 입장이라.. :-)   단, 릴리스 할 때마다 API가 무지 바뀔 수 있습니다.

https://github.com/joone/rust-animation

 올해 연말은 이 프로젝트로 따듯하게 지낼 수 있을 것 같네요.

댓글()

웹엔진 Electron, NW.js, CEF, Qt WebEngine 에 관하여..

Web|2021. 6. 9. 07:42

웹엔진으로 앱을 만드는 것은 쉬운 일이지만, 브라우저 엔진을 실행하는 만큼 그 용도가 정확하게 맞아야 큰 효과가 있다. 몇가지 솔루션이 있는데, 한번 짚고 넘어가보자.

Electron 

Electron은 Chromium기반의 애플리케이션 런타임이다. 웹기술로 여러 플랫폼을 지원하는 앱을 쉽게 만들 수 있다. 이런 개념은 오래전 부터 존재해왔지만,  Electron이 많은 인기를 끌게된 원인은 바로 Node.JS의 지원이다. 그냥 Node.JS 패키지로 npm으로 설치할 수 있고 JavaScript로 Chromium WebView를 생성하고 Application의 Life cycle을 관리할 수 있다.  또한 다양한 Node.JS 패키지로 강력한 앱을 빠르고 쉽게 만들 수 있는 장점이 있다. 물론 원조는 NW.JS라는 것이 있다.  Electron을 만든 사람도 NW.JS개발자였고 비슷한 부분이 많다. 

https://www.electronjs.org/docs/tutorial/quick-start

위 튜토리얼 보면 쉽게 샘플앱를 만들고 바로 패키징도 할 수 있다.

 NW.js

비교한 글을 보면 NW.js는  Electron과 달리 브라우저 엔진과 같은 context에서 Single Thread로 동작한다고 한다. NW.js의 경우 소스코드를 노출하지 않을 수 있다고 하는데, 이 경우 서버로 기능을 숨길 수 있기 때문에 커다란 장점은 아니라고 한다.

CEF(Chromium Embedded Framework)

CEF의 경우 말 그대로 라이브러리 형태로 하나의 컴포넌트로 WebView를 앱에서 실행하는 것이다. 예전에 IE Component를 사용하는 방식과 같다고 할 수 있다. 기본적으로 C++로 앱을 만들때 사용할 수 있으며 다양한 바인딩이 존재한다.

Chromium 자체가 WebKit처럼  embedding을 목적으로 만들어져 있지 않아서 기존 앱에 WebView를 붙이는 것이 쉽지 않다. 분명 소스코드가 많이 수정되었고 최신 코드를 업데이트하기도 쉽지 않을 것 같다.

https://bitbucket.org/chromiumembedded/cef/wiki/Tutorial

Qt WebEngine

https://doc.qt.io/qt-5/qtwebengine-features.html

Qt도 Chromium WebView를 구현했는데,  Qt로 앱을 만들 때 사용할 수 있다.  Tesla 자동차에서 사용하는 것으로 알고 있다.

 참고

댓글()

WebGL의 다음 버전인 WebGPU에 관하여..

Graphics|2021. 5. 13. 13:59

WebGL은 웹에서 3D 그래픽을 표현하기 위해 사용하는 API로  OpenGL/ES를 기반으로 만들어져있다. 현재 버전 3.0까지 나와있고 각 브라우저 개발자들은 다음 버전인  WebGPU를 만들고 있다. WebGPU의 탄생은 OpenGL의 다음 버전인 Vulkan이나  Metal과 연관이 되어 있다. OpenGL은 보편적인 3D 그래픽스 API로 게임 부터 CAD까지 쓰일 수 있다. 하지만, Vulkan이나 Metal은 개발자가 GPU에 더 접근하고 최적화할 수 있도록 저수준의 API제공하며  CPU오버헤드를 줄일 수 있도록 디자인되어있다. 그렇다보니, GPU에 대한 더 많은 지식을 요구하고 코드량도 증가해서 배우기가 더 어려워졌다. 예전에 OpenGL driver에 제공되는 기능을 이제는 Vulkan 개발자는 본인이 직접해야 한다.
또한 OpenGL은 에러 처리를 위한 많은 코드가 드라이버에 있지만,  Vulkan은 없다. 그래서 단순하고 코드만 잘 만들면 더 좋은 성능을 얻을 수 있다.
이런 API를 과연 웹 개발자에게도 노출할 필요가 있을까? 초기 애플이  WebKit에 WebGPU를 구현하고 이를 제안할 때, 반대고 있었다. 하지만 지금은 힘을 보아 개발을 진행하고 있다.

Apple에서 만든 WebGPU 데모 코드를 한번 보자.

let gpu;
let commandQueue;
let renderPassDescriptor;
let renderPipelineState;

window.addEventListener("load", init, false);

function init() {

    if (!checkForWebMetal()) {
        return;
    }

    let canvas = document.querySelector("canvas");
    let canvasSize = canvas.getBoundingClientRect();
    canvas.width = canvasSize.width;
    canvas.height = canvasSize.height;

    gpu = canvas.getContext("webmetal");
    commandQueue = gpu.createCommandQueue();

    let library = gpu.createLibrary(document.getElementById("library").text);
    let vertexFunction = library.functionWithName("vertex_main");
    let fragmentFunction = library.functionWithName("fragment_main");

    if (!library || !fragmentFunction || !vertexFunction) {
        return;
    }

    let pipelineDescriptor = new WebMetalRenderPipelineDescriptor();
    pipelineDescriptor.vertexFunction = vertexFunction;
    pipelineDescriptor.fragmentFunction = fragmentFunction;
    // NOTE: Our API proposal has these values as enums, not constant numbers.
    // We haven't got around to implementing the enums yet.
    pipelineDescriptor.colorAttachments[0].pixelFormat = gpu.PixelFormatBGRA8Unorm;

    renderPipelineState = gpu.createRenderPipelineState(pipelineDescriptor);

    renderPassDescriptor = new WebMetalRenderPassDescriptor();
    // NOTE: Our API proposal has some of these values as enums, not constant numbers.
    // We haven't got around to implementing the enums yet.
    renderPassDescriptor.colorAttachments[0].loadAction = gpu.LoadActionClear;
    renderPassDescriptor.colorAttachments[0].storeAction = gpu.StoreActionStore;
    renderPassDescriptor.colorAttachments[0].clearColor = [0.35, 0.65, 0.85, 1.0];

    render();
}

function render() {

    let commandBuffer = commandQueue.createCommandBuffer();
    let drawable = gpu.nextDrawable();
    renderPassDescriptor.colorAttachments[0].texture = drawable.texture;

    let commandEncoder = commandBuffer.createRenderCommandEncoderWithDescriptor(renderPassDescriptor);
    commandEncoder.setRenderPipelineState(renderPipelineState);

    // NOTE: We didn't attach any buffers. We create the geometry in the vertex shader using
    // the vertex ID.

    // NOTE: Our API proposal uses the enum value "triangle" here. We haven't got around to implementing the enums yet.
    commandEncoder.drawPrimitives(gpu.PrimitiveTypeTriangle, 0, 3);

    commandEncoder.endEncoding();
    commandBuffer.presentDrawable(drawable);
    commandBuffer.commit();
}

Vulkan 코드를 만져본 분은 익숙한 코드일 수 있다. commandQueue, Pipeline, CommnadBuffer등 Vulkan에서 사용되는 개념들이 똑같이 WebGPU에 적용되어 있다. 확실히 코드양은 증가했지만, 뭔가 더 최적화할 수 있는 부분은 많아졌다. 

댓글()

크로미엄(Chromium) 프로젝트 기여하기

Chromium|2021. 5. 1. 09:46

chromium.googlesource.com/chromium/src/+/master/docs/contributing.md

여러분의 사용하는 구글 크롬 브라우저(오픈소스 버전은 크로미엄 브라우저라고 부름)는 오픈소스로 관리된다. 소스코드를 공개되어 있고 여러분의 컴퓨터에서 빌드하고 테스트가 가능하다. 그리고 코드를 수정해서 크로미엄 사이트에 올리면 리뷰 과정을 거쳐서 코드가 반영된다. 아주 어려운 일은 아니다. 잘 찾아보면 아무도 신경 안쓰는 수정하기 쉬운 버그도 있다.

우선 크롬 브라우저가 어떻게 동작하는지 대충 알아야할 것이다. 구글에서 만든 수 많은 기술 문서가 있지만, 우선 아래 문서와 발표 자료를 꼭 들어보자.

크롬 브라우저는 어떻게 동작하는가?

Life Of a Pixel

Life of Pixel 문서는 말 그대로 크로미임 브라우저가 어떻게 웹페이지를 화면 출력하는지를 자세하게 소개하고 있다. 발표 자료와 함께 강의 비디오도 Youtube에 있다. 

 

Life of a Pixel

This is the evergreen copy of "Life of a Pixel". Video of the presentation at Chromium University (Nov 2020): http://bit.ly/loap-2020-video LIFE OF A Steve Kobes skobes@chromium.org Nov 2020 slides: bit.ly/lifeofapixel with special thanks to past presenter

docs.google.com

 

 

 Inside look at modern web browser

구글 엔지니어가 직접 만든 문서이다. 가장 자세하게 전반적으로 크롬 브라우저의 동작을 설명한 문서이다.

어떻게 기여하는가?

크로미엄 프로젝트에서 공식적으로 만든 기여를 위한 안내서(Contributing to Chromium)을 먼저 읽어본다. 크로미엄 코드는 C++로 만들어져있으므로 기본적으로 Google C++ Style Guide를 지키고 예외적은 것은 Chromium C++ style guide 로 정리해두었다.  크로미엄 프로젝트는 조금은 느리지만 가능한 모던C++ 기능을 많이 수용하려고 노력하고 있다. 현재는 C++14를 목표로 필요한 기능을 적용하고 있다. 네이버 Deview에서 발표된 "Modern C++ 무조건 써야해?"도 읽어보면 좋다.

또한 크로미엄 프로젝트에서 자체 제공하는 여러 클래스 라이브러리가 있는데, 이는 크로스 플랫폼을 지원을 위해 개발되었다. C++ 표준 라이브러리로 조금씩 대체되고 있지만, 사용방법을 알아두면 코드를 이해하는데 도움이 있다. 몇가지 예제가 있으니 참고 바란다.

버그를 찾자.

Chromium issue tracke사이트에서 버그를 검색해본다.

이번 글은 여기까지, 다음글에서는 패치를 올리고 리뷰 받는 법을 소개해볼까 한다.

 

댓글()

아치 리눅스( Arch Linux) 패키지 관리

기타|2021. 4. 29. 04:59

예전에 리눅스 커널 개발자에게 무슨 리눅스 배포본을 사용하냐고 물어봤는데, 답변은 바로 아치 리눅스였다. 이유는 가장 최신 패키지를 사용하고 개발자가 필요한 다양한 환경을 쉽게 구성할 수 있다는 이유였다. 하지만 모든 설정을 상당힌 직접 해야 하는 어려움이 있다. 

리눅스 하면 대부분의 사용자는 우분투를 생각하지만 다양한 배본폰이 존재한다. 이 중 아치 리눅스는 가장 최근의 업데이트를 배포하는 배포본으로 코어 개발자들이 많이 사용한다. 설치 부터가 옛날 리눅스를 설치하는 기분을 들게 하는데, 터미널 환경에서 직접 파티션을 나누는 작업 부터 시작해야한다. 좋은 점은 딱 원하는 패키지만 설치할 수 있어서 가볍게 리눅스를 사용할 수 있다.

여러분이 나름 코어 리눅스 개발자라면 아마도 아차 리눅스가 좋은 선택이 될 것이다.

아래는 간단한 패키지 관리 방법이다.

Search

$ pacman -Ss chromium

 

Installation

$ sudo pacnman -S vim git openssh

 

Update

$ sudo pacman -Syu  // Synchronize package database..

 

간만에  Arch Linux를 업데이트하면 아래와 같은 에러를 만날 수 있다.

"invalid or corrupted package (PGP signature)” Error

$ sudo pacman -S archlinux-keyring
$ sudo pacman -Syu

 

다운로드 받은 패키지가 있다면..

$ pacman -U /root/Download/packagename.tar.gz

 

한꺼번에 다운로드 받은 패키지를 설치하려면...

$ pacman -U /root/Download/*.tar.gz

댓글()

오픈소스 VR 프로젝트(OpenHMD project)

카테고리 없음|2021. 4. 28. 17:40

리눅스에서 VR 컨텐츠를 즐길 수 있는 방법은 없을까해서 찾아보니, 오픈소스로 여러 VR 기기를 지원하는 프로젝트를 찾게되었다.

 

OpenHMD – FOSS HMD drivers for the people

OpenHMD aims to provide a Free and Open Source API and drivers for immersive technology, such as head mounted displays with built in head tracking. Our aim is to implement support for as many devices as possible in a portable, cross-platform package. Devic

www.openhmd.net

시중에 나와있는 많은 VR기기를 지원하지만 특히,  오큘러스(Oclulus) 기기를 잘 지원하는 것 같다. 일반적으로 VR 기기를 리눅스에 연결하면 스크린을 그냥 외부 모니터로 인식해서 그냥 데스크탑이 하나 더 생기고, 센서 데이터는 포맷이 공개가 안된 경우가 대부분이라 약간의 해킹이 필요하다. 실제 스팀VR이 리눅스를 지원하기는 하나 공식적인 것은 아니고 실험적인 성격이 강해서 제대로 안되는 부분이 많은 것 같다. 이 프로젝트에서 해킹으로 각종 센서와 조이스틱을 지원하고 네이티브 환경에서 VR 컨텐츠를 만들어볼 수 있는 것을 지원하고 있다.  게임 엔진에서 사용할 수 있는 드라이버도 만들고 있다.

아래 데모를 보면 이 프로젝트에서 무엇을 하는지 감이 올 것이다.

 

댓글()