[컴][웹] admin templates

어드민 템플릿, / 웹 페이지 템플릿 / 빠르게

admin templates

update: 2023-01-02 기준

vuejs

jquery

[컴] windows 에서 php interpreter 의 wasm build

php interpreter / web assembly build / wasmedge / 웹어셈블리 / php 스크립트 / script /

windows 에서 php interpreter 의 wasm build

  • OS: windows 10 + WSL2 ubuntu

WSL2 의 ubutu 내에서 작업했다. 직접 windows10 에서 가능하지 않을까 해봤지만, 기본적으로 build 에서 사용하는 여러 tool 들이 linux 를 기반으로 했다. 예를들면, shell script 나 make 등. container 에서 작업하는 것도 고려해 볼 수 있을 듯 한데, container 에서 다시 docker 를 설치하는 작업을 잘 몰라 하지 않았다.

그래서 wsl2 에 docker 를 설치하고 build 를 했다.

build 를 위해서는 linux 에 docker 도 설치되어 있어야 한다.

다음과 같은 절차를 거치면 된다.

  1. git clone
  2. sudo make php-7.4.32
  3. <proj_root>/php/build-output/php/php-7.4.32/bin/에서 php-cgi 라는 결과파일을 찾을 수 있다.

git clone:

git clone --depth=1 -b php-wasmedge-demo https://github.com/vmware-labs/webassembly-language-runtimes.git wlr-demo

build command:

cd wlr-demo
cd php
sudo make php-7.4.32

기타 :

  • Dockerfile.wasi-builder 파일은 sudo make php-7.4.32 를 하면 build 를 위해서 docker 를 사용하는데, 그때 사용되기 위한 파일이다. 필자는 처음에 Dockfile 로 container 를 만들어서 build 하려 했는데, 실패했다.

  • sudo make php-7.4.32 를 실행하면 아래와 같은 command 를 실행하게 된다.

    docker build -f <proj_root>\Dockerfile.wasi-builder -t ghcr.io/vmware-labs/wasi-builder:16 <proj_root>\
    docker build -f <proj_root>\php\Dockerfile --build-arg WASI_SDK_VERSION=16 -t ghcr.io/vmware-labs/php-builder:wasi-16 <proj_root>\php\
    
    mkdir -p build-output build-staging
    docker run --rm -v <proj_root>\php\build-output:/wlr/build-output -v <proj_root>\php\build-staging:/wlr/build-staging ghcr.io/vmware-labs/php-builder:wasi-16 ./wl-make.sh php/php-7.4.32
  • See Also 1.” 에서 이야기하는 것처럼 build 를 하려면, Dockerfile.wasi-builder 안에 ENV WASMLABS_RUNTIME=wasmedge 부분을 추가한후, sudo make php-7.4.32 를 실행하면 된다. 그러면, <proj_root>/php/build-output/php/php-7.4.32/binphp-cgi-wasmedge, php-cgi 2개 파일이 생성된다.

    ...
    ENV WASI_SDK=wasi-sdk-${WASI_SDK_VERSION}
    ENV WASI_SDK_ROOT=/wasi-sdk
    ENV WASMLABS_RUNTIME=wasmedge
    ...

See Also

  1. WebAssembly: Docker without containers!, 2022-12

[컴] wsl2 ubuntu 에서 docker install

 

wsl2 ubuntu 에서 docker install

그냥 linux 에서 설치하는 것처럼 설치하면 된다. 참고로 windows 에 docker for desktop 을 설치해놓은 상태라고 해도 문제없이 잘 된다.

sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

[컴] 동시성, 병렬, 동기, 비동기

 

용어 설명 / jargon / programming concepts /

동시성, 병렬, 동기, 비동기

좋은 그림들을 모아놓아 준 글이 있어서 글을 보면서 다시 나의 언어로 정리를 좀 해본다.

동시성 / 병렬, concurrent / parallel

  • concurrent 는 동시에 동작하는 것처럼 보이면 되는 수준: 이것은 time 이 중요할 듯. 어떤 task에서는 1s 안에 2개가 수행되면 concurrent 로 보겠지만, 어떤 task 에서는 0.1s 안에 2개가 수행되어야 concurrent 로 볼테니.
  • parallel 은 진짜 동시에 동작하는 것: 그러니까 쉽게 컴퓨터 2대를 동시에 실행하는 수준, 대체로 이 수준이 되려면 hw 가 2개인 수준으로 봐야 할 듯 하다. 예를 들면 core가 2개
  • parrallelism 은 hardware적인 고려이고, concurrency 는 software적인 고려(from 생각하는 프로그래머)

그래서 single core 에서는 concurrent 는 지원하지만, parallel 은 지원하지 않는다고 볼 수 있다.

sync/async, block/non-block

ref. 1 의 async 의 설명은 조금 이상하다. : 작업의 완료여부를 ’누가 확인’하느냐에 sync/async 를 구분짓는다고 하지만, 확인의 의미가 모호하다. 만약 thread 1 이 thread2 에게 task 를 요청하고, 그 task 가 끝나면, thread 1 에게 notify 를 줄 수 있다. 하지만 이 noti 를 확인하는 주체는 thread 1 이다. 그렇기 때문에 ’누가 확인’을 하느냐에 따라 sync/async 를 구분하는 것은 이상해 보인다.

sync/async 는 쉽게 동작이 sychronous 하는가 (일치하는가) 를 생각하면 될 듯 하다. 여러 thread 가 있지만, 하나의 thread 가 동작할 때, 다른 thread 가 특정 task 를 수행하지 않는다면, 그것은 synchronous 하다고 할 수 있다. 예를 들어, 네트워크 요청을 하는 경우를 보자. 하나의 thread 에서 ’요청’을 한 이후, 다른 일을 하지 않고, 기다리는 것이 synchronous 라고 이야기하는데, async 인 경우는 ’요청’을 한 후 자신이 다른 작업(code line 이라고 이해하면 될 듯)을 한다. 이런 식의 동작을 모두 async 라고 부를 수 있다. 만약 네트워크 ’요청’이후, 그 thread 가 결과를 받기위해 polling 을 한다고 해보자. 이것은 async 인가 sync 인가? 이것은 async 를 지원하지만, 그 동작은 synchronous 하게 보이게 만든 것이라 봐야 한다. 그래서 async/sync 의 설명은 code level 로 명확하게 이야기 하기 어렵다고 생각한다.

  • sync : sync(동기)는 1개의 thread 가 작업을 한다고 보면 된다. 그래서 특정 함수를 실행하면, 그 함수의 내부를 그 thread 가 다 돌고나서, return 값을 가지고 그 다음 함수를 수행한다. 물론 2개의 thread 에서도 가능하다. 함수를 다른 thread 에게 실행하게 하고, 처음 thread 는 그냥 놀고있는 것이다. 하지만, 이런 구조는 실제로 존재하지 않을 듯 하다. 굳이 현재 thread 가 놀아야 하는데 왜 2개의 thread를 사용하겠는가.

  • async : async(비동기)는 2개의 thread 가 있고, 그 가운데 queue 가 2개 있다고 보면 좋을 듯 하다. 1개는 thread 1 에게 notify 하는 queue 이고, 다른 하나는 thread 2 에게 notify 하는 queue 라고 가정하자. 이때, thread 1 는 일을 하다가 thread 2 에게 특정 task1 을 수행하라고 queue 에게 message 를 던진다. 그러면 thread2 는 그것을 받고 일을 시작한다. 그러다가 끝나면, queue 를 통해 thread 1 에게 결과를 알려준다. 이때 thread 1 은 2가지 행위를 할 수 있다. 하나는 thread 2 에서 결과를 보낼때까지 queue 를 계속 보고 있거나(blocking), 아니면, 그냥 자기 할일을 하다가 간간이 queue 를 확인하는 것이다.(non-blocking)

  • 쿠…sal: [컴][자바] 동시성, Concurrency from java tutorial

  • Progress Updates and Incremental Results A class that adheres to th

Reference

  1. 동시성, 병렬, 비동기, 논블럭킹과 컨셉들 :: BlaCk_Log

cd php sudo make php-734.32

[컴] code 로 cloud architecture 그리기

아키덱쳐 / 구조도 / 다이어그램 쉽게 / 그리기 / visio / 대용 / 클라우드 쉽게 빠르게 그리는 방법 /툴 / 도구

code 로 cloud architecture 그리기

Eraser 라는 툴에서 지원한다. 아직 많이 사용해 보진 않았지만, code 로 어느정도 작성해주면, 쉽게 그릴 수 있을 듯 하다. 이것을 svg 로 export 도 가능하다.

vs diagram.net

개인적으로 그림을 그릴 때 diagram.net 을 자주 사용하는데, 간단한 사용에 있어서는 eraser 가 훨씬 좋아보인다. 그리고 속도 면에서도 쾌적함을 보여준다.

See Also

  1. 쿠…sal: [컴][유틸] Mermaid - markdown 형식으로 diagram 을 그릴 수 있다.

[컴] vuejs 에서 component v-model 사용법

vmodel / v-model 사용법 / 내 component에 v-model 넣기 /

vuejs 에서 component v-model 사용법

아래처럼 만들어서 사용하면 된다.

<MyInput v-model="myvalue" />
// MyInput.vue
//
<template>
  <input :value="value" @input="handleInput" />
</template>

<script>
export default {
  prop: {
    value: {
      type: String,
      default: '',
    },
  },

  model: {
    // 다음은 default 값들이다. 이 'model' 이 없으면 'value', 'input' 이 기본 값이 된다.
    prop: 'value', // value prop 을 이용
    event: 'input' // handler 를 input event 에 attach 한다.
  },
  data () {
    return {
    }
  },
  methods: {
    onInput(evt){
      this.$emit('input', evt.target.value)
    }
  },
  watch: {
    // for test
    value(newVal, oldVal){
      console.log(`value = ${newVal}`)
    },
  },
}
</script>
<MyInput v-model="myvalue" />

는 vuejs 가 아래처럼 변경하게 된다.

<MyInput :value="myvalue" @input="$$v => myvalue = $$v" />

// js
_c("MyInput", {
  model: {
    value: _vm.myvalue,
    callback: function ($$v) {
      _vm.myvalue = $$v
    },
    expression: "myvalue",
  },
}),

data flow, 데이터 흐름

대략 아래와 같은 순서로 움직인다. 즉, 값이 변경되면, element 의 value 를 변경하지 않고, 그 값이 변경됐다고 parent component 로 알리고(emit), parent 의 값을 변경한다. 그러면 그 값이 component 의 prop으로 전달되고, 그 prop 의 값을 element 의 value 에 반영하게 된다.

typing 
--> 'input' event 
--> 'input' event handler 
--> emit 'input' event 
--> update the 'myvalue' 
--> update the MyInput's prop.value

다른 prop 과 event 를 사용하기

다음처럼 model 부분을 변경하면 된다.

// MyInput.vue
//
<template>
  <input :value="value2" @input="handleInput" />
</template>

<script>
export default {
  prop: {
    value2: {
      type: String,
      default: '',
    },
  },
  model: {
    prop: 'value2', // value2 prop 을 이용
    event: 'input2' // handler 를 input2 event 에 attach 한다.
  },
  data () {
    return {
    }
  },
  methods: {
    onInput(evt){
      this.$emit('input2', evt.target.value)
    }
  }
}
</script>

위에서

<MyInput v-model="myvalue" />

가 아래처럼 변경된다고 했는데,

<MyInput :value="myvalue" @input="$$v => myvalue = $$v" />

// js
_c("MyInput", {
  model: {
    value: _vm.myvalue,
    callback: function ($$v) {
      _vm.myvalue = $$v
    },
    expression: "myvalue",
  },
}),

그러면 model 에서 값을 바꾸면, 아래처럼 될까?

<MyInput :value2="myvalue" @input2="$$v => myvalue = $$v" />

실제로 render부분의 js code 를 보면 변하지 않는다. 즉, 다른 layer 에서 처리하도록 되어 있다고 보면 된다. 좀 더 자세한 사항은 vuejs code를 확인하자.


// js
_c("MyInput", {
  model: {
    value: _vm.myvalue,
    callback: function ($$v) {
      _vm.myvalue = $$v
    },
    expression: "myvalue",
  },
}),

[컴][머신러닝] Prompt enginerring

 

ai / 사용법 / 좀 더 잘 사용하는 방법 / chatgpt / how to / better usage / better use

Prompt enginerring

prompt 는 ’뭔가를 하도록 유도하다’는 뜻이다.

Prompting | Learn Prompting :

  • AI에서는 AI 에게 어떤 일(task) 를 하라고 지시하는 process 가 prompting 이다.
  • AI 에게 instruction 들의 집합(the prompt) 하면 AI 가 그 task 를 수행한다.
  • GPT3 에게 What is 100*100? 을 물어보면, 1000이라고 대답한다. What is 100*100? Make sure your answer has the correct number of 0s 라고 물어보면, 10000 이라고 대답한다.
  • Make sure your answer has the correct number of 0s 라는 부분이 들어가야만 정답을 이야기 해줄까? 우리의 task 에 대한 최적화된 정답을 산출하는 prompt들을 만들려면 어떻게 해야 할까? 이부분에 대한 답을 구하는 것이 prompt engineering 이라고 한다.

현재 prompt engineering 에 대한 나의 정리

예를 들어, 포토샵이 있다면, 어떻게 해야 포토샵을 더 잘 쓸 수 있을까? 를 알기 위해, 어떤 식으로 하면 좀 더 우리가 원하는 편집 결과물이 나오는지를 알아내려고 하는 것이 prompt engineering 이라고 보면 되지 않을까?

그런데 최적화된 결과물이 어떻게 나오는지 원리에 집중하기 보다는, 즉, 포토샵의 동작원리에 집중하기 보다는, 포토샵의 메뉴를 다양하게 조합해 봐서, 결과물이 제대로 나오면, 그 방법을 공유하는 방식인 듯 싶다.