레이블이 computer인 게시물을 표시합니다. 모든 게시물 표시
레이블이 computer인 게시물을 표시합니다. 모든 게시물 표시

[컴][파이썬] VSCode 에서 library 까지 break point 를 지정할 수 있는 python debugger 설정

vscode python debugger 설정 / configuration / how to config / 파이썬 디버거 사용 / site-package 어떻게 접근 / 내비 / 네비게이트 / traverse / break point 를 library 에


vscode python debugger tips

python debugger 의 option 이 많이 추가됐다. 그래서 정리가 필요해서 글을 적는다.

libray 까지 code navigation

"python.analysis.cacheFolderPath": ".vscode",
"python.analysis.memory.keepLibraryLocalVariables": false,
"python.venvPath": "c:\\\\a\\\\envs",
"python.analysis.cachingLevel": "Library",
"python.analysis.memory.keepLibraryAst": true,

그리고 cachingLevel 을 Library 까지 해주면 code navigation 을 할 때 잘된다. 그렇지 않으면 제대로 source 를 찾지 못한다.


library 까지 debugger 로 동작하도록 하기

아래처럼 settings.json 에 debugJustMyCode 를 false 로 두는 것으로는 debugging 이 동작하지 않는다. launch.json 에 justMyCode 를 넣어줘야 된다.

이렇게 해주지 않으면 step into를 해도 library code 로 debugger 가 옮겨가지 않는다.

// settings.json

// "python.dataScience.debugJustMyCode": false,


// launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "justMyCode": false,
        }
    ]
}





[컴][툴] github issue 를 활용하는 방법

github issue / github 사용법 / github 로 개발하는 방법 / github 로 collaborator 로 이슈 해결 / 협업 툴 / 그룹 웨어 / vscode 에서 github 를 사용하는 방법 /triaging / triage / 깃헙 / 깃허브 사용법 / 깃허브 이슈 사용법 / github 이슈 / 활용법


github issue 를 활용하는 방법

vscode team 의 github 활용방법

vscode Wiki를 읽으면 vscode team 이 어떻게 github 를 사용하는지 알 수 있다.

  • https://github.com/microsoft/vscode/wiki/Issues-Triaging
    • close 할 때 이유를 label 로 달아준다.(예를 드려면 duplicate)등
    • 모든 issue는 type label 을 갖는다. issue 를 분류할때 type label 을 사용한다. type label 에 특정 색으로 통일. (vscode team 은 grey 를 사용, bug 같이 특정 의미가 들어가면 grey+red 등으로 만듦)
    • feature area 라는 것을 둬서, 기능에 따른 분류를 하고, 그에 따라 label 을 배정했다. 그리고 이것도 마찬가지로 색을 통일했다.
    • iteration 이나 release 를 표현하기 위해 milestone 을 사용한다.
      • iteration 은 대체로 1개월 주기이다.(참고)
      • 주로 Backlog milestone 에 있는 issue 들이 바로 iteration milestone 으로 가게 된다. (iteration milestone 은 November 2019 처럼 날짜를 사용)
      • Backlog 에 있는 것중 Roadmap 에 부합하는 녀석들이 iteration 으로 넘어간다.
      • 만약 Backlog 에 있는 것이 Roadmap 과 전혀 관련없는 것이 명확하다면 close 한다.
      • Backlog Candidate 는 community 가 원하는 기능중에 vscode team 이 작업하지 않으려 한것들에 대한 투표를 진행한다. upvote 가 20개 이상이면 이것은 Backlog 로 옮겨진다.
    • important issue 에 대한 정의를 적어놓고, 부합되면 important label 을 붙인다.
    • 도움을 요청하는 label 도 있다.
      • investigation-wanted 는 재현을 할 수 없거나, 세팅등이 너무 오래걸려서 재현할 시간이 없거나 하면 이 label 을 사용한다.
      • help-wanted 는 community 에 도움을 요청하기 위한 용도
    • bug 를 wont-fix label 을 붙이고 close 하는 경우
      • 비용대비 효용이 없을때 wont-fix 를 사용한다.
    • upstream issue
      • 이슈가 package 나 library 에 연관돼서 생기고, 이것만 고쳐서는 안되는 이슈인 경우 `upstream` 을 붙인다. 그래서 package 나 library 가 이슈를 인지해서 이것을 issue 로 처리하면 close 한다. 또는 이것이 고쳐질 가능성이 없어도 close 한다.
  • https://github.com/microsoft/vscode/labels
  • https://github.com/microsoft/vscode/milestones
    • `On Deck` milestone: 다가올 milestone 에 고려해야 할 이슈들을 모아놓는다. vscode 에서는 On Deck 의 issue 개수를 항상 100개 이하로 관리하려 한다.
    • `Backlog` milstone : 아직 수정을 고려하고 있지 않은 issue 들을 모아놓는다.
    • 각 iteration 마다 milestone 을 만들어서 사용한다.
  • https://github.com/microsoft/vscode/projects
  • https://github.com/microsoft/vscode/wiki/Roadmap
    • Roadmap wiki 를 계속해서 update 해 나간다. 그래서 그 해에 골들을 세운다.
    • 최소 1달에 1번 roadmap 을 review 하고 update 한다.
  • https://github.com/microsoft/vscode/wiki/Development-Process
    • 매 iteration 전에, 이번 iteration 에서 어떤 기능에 우선순위를 둘 것인지를 정하고, 어떤 버그를 고칠 것인지 정한다.
    • 고치려고 하는 bug 에는 milestone 을 붙인다.
    • 새로운 기능에는 issue 를 새로 만든다.
      • 그리고 plan-item 이라는 label 을 붙인다.
      • plan-item 에는 자세한 checklist 를 넣게 된다.(예시)
    • 이렇게 bug, plan-item, feature-request 에 milestone 을 할당한다.
    • iteration
      • 첫주차 : 이전 iteration의 결과를 지켜보고, critical issue 들을 해결한다.
      • 2주차: 개발
      • 3주차: 개발
      • 4주차: 마무리
        • 기능테스트등을 하고, 문서를 update 한다.
        • insider channel 에서 가능한 pre-release 를 만든다. 그리고 user 에게 test 를 요청한다.
        • pre-release 에 아무런 변경이 없고 24시간이 지나면, release 를 게시한다. 때로는 주중에 게시하기도 한다.
    • iteration milestone 이 할당된 후에 우선순위와 관련된 label 을 추가한다.
      • importatant 가 가장 먼저 해결된다.
    • iteration plan : iteration 마다 iteration plan 이라는 이슈를 하나 만들고, 그 안에서 issue 들을 모아서 checklist 로 관리한다. 각각의 item 들은 하나의 issue 이다. 이것은 관리자가 처리해야 하는 issue 같은 느낌이다.
  • Issue Tracking · microsoft/vscode Wiki · GitHub
    • 여러 repository 에 대한 label 을 일괄적으로 관리하기 위해Github Label Manager를 사용한다.

See Also

  1. gatsby: https://www.gatsbyjs.org/contributing/triaging-github-issues/
  2. gitlab: https://docs.gitlab.com/ee/development/contributing/issue_workflow.html
  3. 쿠…sal: [컴][툴] github 와 slack 의 연동
  4. github 용 extension: GitHub - stefanbuck/awesome-browser-extensions-for-github: A collection of awesome browser extensions for GitHub.
  5. https://github.com/super-greate-org/issues/issues/5
  6. https://github.com/microsoft/vscode-python/issues/19299 : vscode python extension 의 release 절차를 확인할 수 있다.
  7. GitHub - microsoft/vscode-github-issue-notebooks: GitHub Issues Notebooks for VS Code : vscode 에서 extension 을 사용해서, github issue notebooks 를 사용할 수 있다.
  8. Searching issues and pull requests - GitHub Docs : github issue 와 pull request 의 검색 방법

[컴] Windows 에서 여러개의 git credential 을 사용하는 방법

useHttpPath option / 여러개의 계정 사용 방법 / 윈도우10 윈도우에서  / 어떻게 여러개의 git 계정을 사용하는 가

Windows 에서 여러개의 git credential 을 사용하는 방법

credential.github.com.useHttpPath

기본적으로 Git 이 path 를 고려하지 않는데,
https://example.com/foo.git 에서 사용한 credential 을 https://example.com/bar.git 에서도 사용하게 된다.
이것을 구분하게 사용하게 하려면 이 옵션을 on 하면 된다.
git config --global credential.github.com.useHttpPath true

기존의 git credential 삭제하기

이것이 필요한지는 모르지만, 일단 필자는 기본적으로 이것을 지우고 위의 command 를 실행했다.
제어판 --> 자격 증명 관리자 --> 일반 자격 증명(general credentials) --> git 관련 credential 삭제

Reference

  1. useHttpPath option, Git - gitcredentials Documentation


[컴] local 에서 git init 후 remote git repository 연결

git 에 연결 / 원격 repository 에 연결하는 방법 / command line 연결 / git 사용법 /git 연결 / git init

local 에서 git init 후 remote git repository 연결

local 에 empty git repository 생성

C:\ptt>git init
Initialized empty Git repository in C:/ptt/.git/

remote(origin) git repository 를 연결

C:\ptt>git remote add origin https://github.com/mygitid/pytorchtest
...
C:\ptt>git flow init
...

origin 에 new branch 반영

# origin(remote) 에 develop branch 에 대한 upstream reference 를 만들어라.
C:\ptt>git push --set-upstream origin develop

See Also

  1. [컴] git-lfs 사용하기
  2. [컴] git flow 자료들
  3. [컴] git rebase 설명
  4. [컴][툴] GitLab Flow



[컴] VSCode 를 이용해서 WSL 사용하기

vscode 로 원격으로 작업하기 / vscode 로 리눅스 환경사용하기 / vscode 로 wsl 작업 / 윈도우에서 리눅스 작업하기 / vscode

Update 2021-06

remote container 를 제공한다. 이제는 docker container를 하나만들고, 그 안에서 작업하는 것도 가능하게 됐다.

VSCode 를 이용해서 WSL 사용하기

순서

  1. WSL 의 설치가 필요하다. 여기를 참고하자.
  2. Windows 에 VSCode 설치
    • 하나 주의할 것은 VSCodium 은 지원하지 않는다.
  3. Remote Development Extension 을 설치

그림1: 구성도

Remote-WSL: New Window

wsl 에 source codes 를 넣고, vscode 에서 열어보자. 아래 2개의 command 중 하나를 이용하면 된다.

  • Remote-WSL: New Window
  • Remote-WSL: New Window using Distro

Remote-WSL: New Window using Distro 를 실행한 이후에 약 8분정도 기다렸다.


그림2-1

그림2-2: 열고 있는 중


그림2-3: 최종

Open Folder

하단에 WSL:Ubuntu-16.04가 보이면 이제, folder 를 열자. wsl 의 filesystem 을 navigate 하게 된다.
  • File > Open Folder

\\wsl$ vs Remote-SSH

그냥 vscode 에서 네트워크 file path 를 입력해서 열 수도 있다. 하지만 이 경우는 환경이 windows 이다. 그래서 만약 terminal 을 vscode 내에서 열면, cmd.exe 가 보여진다.

하지만 Remote-SSH 를 이용하면, terminal 도 bash 로 변경되고, 만약 build script 등을 수행해도 bash 상태로 수행된다. "그림1" 을 보면 이해가 쉬울 듯 하다.

아직 불완전

아직 여러가지 면에서 문제가 있는듯 하다. "알려진 이슈"는 아래 링크를 참고하자.

개인적인 생각

이것의 이점은 wsl 의 이점과 비슷하다.
  • application 이 windows 에서 실행되지 않거나
  • windows 에서 개발환경을 구축할 수 없는 경우(compile 이 안되는등)
  • linux 와 windows 에서 다른 coding을 줘야 하는 경우(systemcall 등)
  • 여러 곳에서 windows vscode 를 통해 하나의 source 를 접속해서 사용하는 경우
    • 예를 들면, 개인서버 하나에 repository를 유지하고, 어디서든 접근을 해서 coding 을 할 수도 있을 것이다.
    • 이것도, 차라리 vm 을 띄우는 것이 더 나을듯도 하다.
에 사용을 고려해 볼 수 있을 듯 하다. 기본적으로 windows 에서 구축할 수 있는 환경이고, windows 에 더 익숙한 user 라면, 굳이 wsl 을 이용해서 vscode 를 사용할 필요는 없어보인다.

References

  1. Developing in the Windows Subsystem for Linux with Visual Studio Code


[컴] Windows Subsystem Linux (WSL) 설치

윈도우에서 리눅스 / 리눅서 서브시스템 / 서브 시스템 리눅스 설치 방법 / sshd

Windows Subsystem Linux (WSL) 설치

최신 version 의 wsl 설치

WSL 설치

설치 후 재부팅을 해야 한다.

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Linux distro 다운받기 및 설치

설치하기전에 wsl2 를 사용할 생각이라면, 아래 command 를 먼저 실행하자.

wsl --set-default-version 2

linux 배포판을 다운로드 한다. 가능한 목록은 여기서 확인할 수 있다.

최신 Ubuntu 는 Microsoft Store 를 이용하면 된다.(참고) store 에서는 다운로드 후 '실행' 버튼을 누르면 설치가 시작 된다.

# 다운로드 후 설치
Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1604 -OutFile Ubuntu.appx -UseBasicParsing;Add-AppxPackage .\Ubuntu.appx
Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1604 -OutFile Ubuntu.appx -UseBasicParsing
Add-AppxPackage .\Ubuntu.appx

삭제 방법

wsl -l -v
wsl --unregister <DistributionName>

app package 삭제

PS C:\Users\user> Get-AppxPackage *ubuntu* | Remove-AppxPackage

시작메뉴에서 Ubuntu 16.04 실행

시작메뉴로 가면, 방금 설치된 Ubuntu 에 대한 '바로가기'가 보인다. click 하면 약간의 설치를 더 하고, 바로 계정을 생성하는 화면을 보여준다.

이제 WSL 에서 windows command 를 실행할 수 있고, cmd 에서도 WSL command 를 실행할 수 있다.

wsl 에서 cmd.exe 를 치면, cmd 로 넘어가고, cmd 에서 wsl(또는 bash) 을 치면 wsl 로 넘어가게 된다.

$ cmd.exe
c:\> wsl
c:\> bash

ubuntu 에 기본적으로 python 이 깔려있어서, 아래처럼 하면 static server 를 띄울 수 있다.

$  python3 -m http.server

이렇게 하고나서, web browser 로 http://localhost:8000 에 접근하면 화면이 보인다.

windows 에서 wsl 파일 접근

\\wsl$를 사용해서 접근할 수 있다. (참고 : windows 에서 path 를 copy 한 path 를 wsl 에서 사용하기 위한 bash function)

실제로 linux file 에 대한 windows path 는 c:\Users\USERNAME\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu16.04onWindows_79rhkp1fndgsc\LocalState\rootfs 이다. 이곳을 실제로 수정해선 안된다.

openssl server 설치

기본적으로 wsl 을 설치하면 openssl-server 가 설치되어 있다. 하지만 아래 글에서 그것이 완전한 package 가 아니라서, 지우고 다시 설치하라고 한다.

$sudo apt-get remove openssl-server

$sudo apt-get install openssl-server

이제 /etc/ssh/sshd_config 를 수정해주자. 위 글을 참고했다.

####################################################
# added or modified
AllowUsers userid

# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication yes

windows 가 실행될 때 자동으로 실행하도록 하기

A step by step tutorial on how to automatically start ssh server on boot on the Windows Subsystem for Linux running Ubuntu 18.04 · GitHub

그냥 windows 용 openssl 을 설치하는 것이 훨씬 나을 듯 하다.

VSCode 와 WSL을 이용한 개발

WSL2 vs WSL1

UX Changes between WSL 1 and WSL 2 | Microsoft Docs

WSL2 는 vm 으로 동작한다.

VHD(Virtual Hardware Disk) 를 사용한다. 최초 max size 는 256GB 이다. 넘어가면 수동으로 늘려줄 수 있다.

file system 으로 ext4 를 사용한다고 한다.

ip address 를 하나 할당 받게 된다.

Linux root file system 에 있는 파일에 대한 접근속도가 향상됐다.(cross OS 에 대한 이야기가 아니라, WSL내에서 WSL파일을 접근할 때를 이야기하는 듯 하다.)

WSL 2 가 가벼운 utility VM 을 Linux kernel 위에서 사용한다. 

  • 이 utility VM 이 "file system의 성능향상"과 "완전한 system call 호환"을 제공한다.
  • 이 utility VM 이  작은 메모리 흔적(footprint)을 갖는다.
  • 시작할 때 Virtual Address backed memory 를 할당할 것이다.

현재(2020-05-01)는 cross OS file speed 는 WSL1 보다 나쁘다.

hyper-v 를 사용한다.

그래서 vmbox 등의 다른 vt-x 를 사용하는 vm 과 사용하기 쉽지 않다.(windows 에서 hypervisor interface 를 제공하긴한다. 참고

virtual box 6.0 이상은 wsl2 와 같이 사용할 수 있긴 하지만, 아직 문제가 많아 보인다.

Update to WSL2

PS C:\Users\user> wsl --set-default-version 2
오류: 0x1bc
WSL 2와의 주요 차이점에 대한 자세한 내용은 https://aka.ms/wsl2를 참조하세요
PS C:\Users\user>

wsl1 에서 설치한 distro 는 자동으로 version 2 로 변경되지 않는다. 그래서 다시 설치했다.

install path 변경

See Also

  1. Learn About Windows Console & Windows Subsystem For Linux (WSL) | Windows Command Line
  2. How to Add Ubuntu Tab to Windows Terminal in Windows 10 : Windows Terminal 에 bash 추가하는 방법, 참고로, 가만히 있어도 자동으로 생성된다.
  3. WSL 에서 VM disk 위치
  4. Manual installation steps for older versions of WSL | Microsoft Learn : Error: 0x800701bc 인 경우 kernel update 로 해결이 될 수도 있다.(다른참고, Error: 0x800701bc)

Reference

  1. Get started with the Windows Subsystem for Linux - Learn | Microsoft Docs

[컴][유틸] Microsoft Windows Terminal

윈도우 터미널 / cmd / powershell / 최신 쉘 / 최신 cmd / cli / command line interface



Microsoft Windows Terminal Preview

설치


삭제 방법

  • 설정 --> 앱 --> 앱 및 기능 --> 검색 --> Windows Terminal --> '제거'
  • powershell command
    • Get-AppxPackage Microsoft.WindowsTerminal | Remove-AppxPackage

windows terminal 의 바로가기 만들기

c:\Users\<user_name>\AppData\Local\Microsoft\WindowsApps\Microsoft.WindowsTerminal_8wekyb3d8bbwe 의 wt.exe 에 대한 .lnk 를 만들어 사용하면 된다.

Settings.json

  • terminal/SettingsSchema.md at master · microsoft/terminal · GitHub : settings.json 에 대한 설정관련 문서, 단축키(shortcut) 을 만들 수 있다.
  • c:\Users\<user_name>\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
  • Windows Terminal 에 오른쪽 메뉴 버튼을 누르고, 설정을 누르면 된다.

cmd 를 기본으로 띄우기

기본값이 powershell 이다.
  • defaultProfile 를 변경하면 된다. 값은 settings.json 내에 'profiles' 를 보면 된다.

기타 설정들.

{
    ...
    "actions": 
    [
        {
            "command": 
            {
                "action": "prevTab"
            },
            "keys": "ctrl+pgup"
        },
        {
            "command": "find",
            "keys": "ctrl+shift+f"
        },
        {
            "command": 
            {
                "action": "splitPane",
                "split": "auto",
                "splitMode": "duplicate"
            },
            "keys": "alt+shift+d"
        },
        {
            "command": 
            {
                "action": "splitPane",
                "split": "down",
                "splitMode": "duplicate"
            },
            "keys": "alt+shift+h"
        },
        {
            "command": "paste",
            "keys": "ctrl+v"
        },
        {
            "command": 
            {
                "action": "splitPane",
                "profile": "{6bcdc39e-547b-5474-8a8b-34b45160eeae}",
                "split": "auto"
            },
            "keys": "alt+shift+3"
        },
        {
            "command": "openNewTabDropdown",
            "keys": "ctrl+t"
            // https://learn.microsoft.com/en-us/windows/terminal/customize-settings/actions#open-the-dropdown
        },
        {
            "command": 
            {
                "action": "copy",
                "singleLine": false
            },
            "keys": "ctrl+c"
        },
        {
            "command": "unbound",
            "keys": "ctrl+tab"
        },
        {
            "command": "unbound",
            "keys": "ctrl+shift+tab"
        },
        {
            "command": "unbound",
            "keys": "ctrl+shift+t"
        },
        {
            "command": 
            {
                "action": "nextTab"
            },
            "keys": "ctrl+pgdn"
        },
        {
            "command": 
            {
                "action": "closeTab"
            },
            "keys": "ctrl+f4"
        },
        {
            "command": "closePane",
            "keys": "ctrl+shift+w"
        }
    ],
    ...
}

color scheme

색상 변경도 가능하다. 아래처럼 scheme 을 만들고, 그것을 profile 에서 사용하면 된다.
{
    
    "profiles":
    {
        ...
        "list":
        [
            {
                // Make changes here to the cmd.exe profile.
                "guid": "...",
                "name": "명령 프롬프트",
                "fontSize": 10,
                "commandline": "cmd.exe",
                "hidden": false,
                "background": "#09002d",
                "colorScheme": "Campbell"    
            },
            ...
        ]
    },

    // Add custom color schemes to this array.
    // To learn more about color schemes, visit https://aka.ms/terminal-color-schemes
    "schemes": [
        {
            "name" : "Campbell",
            "background" : "#0C0C0C",
            "black" : "#0C0C0C",
            "blue" : "#0037DA",
            "brightBlack" : "#767676",
            "brightBlue" : "#3B78FF",
            "brightCyan" : "#61D6D6",
            "brightGreen" : "#16C60C",
            "brightPurple" : "#B4009E",
            "brightRed" : "#E74856",
            "brightWhite" : "#F2F2F2",
            "brightYellow" : "#F9F1A5",
            "cyan" : "#3A96DD",
            "foreground" : "#F2F2F2",
            "green" : "#13A10E",
            "purple" : "#881798",
            "red" : "#C50F1F",
            "white" : "#CCCCCC",
            "yellow" : "#C19C00"
        },
    ],
    ...
}

See Also

  1. How to Add Ubuntu Tab to Windows Terminal in Windows 10 : Windows Terminal 에 bash 추가하는 방법
  2. Windows Terminal Profile Settings | Microsoft Docs


[컴][안드로이드] 안드로이드 폰을 sshd 서버로 사용

안드로이드 폰 / 안드로이드 sshd / 토렌트 / 설치 후 할일 / sub server / media server /



안드로이드 폰을 sshd 서버로 사용

VLC player 를 이용해서 sshd 서버의 파일을 play 하면 renderer 를 chromecast 로 할 수 있다.

sshd server 로 열어놓으면, 폰이 여러개인 경우 유용할 듯 하다.

sshd

torrent clients




[컴][툴] 구글 애널리틱스 무료 범위

구글 / 애널리틱스 / google analytics / 가격 / free / 무료 구간

구글 애널리틱스 무료 범위

구글 애널리틱스는 일정범위에서 무료로 기능을 제공한다. 이 이상을 사용하려 한다면 Analytics 365 를 이용하면 되는 듯 하다.
대략적인 제한은 아래에 적었다. 자세한 사항은 ref. 1 을 참고하자.
  • Web Property / Property / Tracking ID
    • property 당 한달에 1천만 hit
  • 모든 범위의 제한
    • gtag.js
    • analytics.js
    • Android SDK
    • iOS SDK
    • the Measurement Protocol
    • 제한
      • 하루에 유저당 200,000 hits
      • 세션당 500 hits
  • 과거 제한
    • ga.js
    • mobile snippets
    • other 기존의 tracking library 들
    • 제한
      • 세션당 500 hits

See Also

  1. Difference between Flurry and Google Analytics | Flurry vs Google Analytics
    • 모바일에서 analytics 를 쓰려한다면, Flurry 가 좋은 선택일 수 있다.

Reference

  1. Google Analytics Collection Limits and Quotas

[컴][툴] GitLab Flow

gitlab flow / 깃랩 플로우 / git flow /

GitLab Flow

git flow 보다 좀 더 간단한 정책이다. 그래서 좀 더 매력적으로 여겨진다.

대략적으로 git flow 와 비교를 한다면, gitflow 의 develop 과 feature 부분이 존재하고, 추가로 production branch 라는 것이 존재한 다는 것이다.
  • gitflow develop --> gitlab flow master
  • gitflow feature --> gitlab flow feature
  • gitflow master --> gitlab flow production

그래서 모든 개발은 feature 를 따서 진행하고, 개발이 완료되면 master 로 merge request 를 보내서 merge 를 한다. 그러고 나서 master 에서 많은 test 가 진행이 되고나서, stable 한 버전을 하나 만들 때 production branch 로 merge 를 해서 tag 를 붙이면 된다. 그래서 이 production branch 는 계속 유지가 된다.

여기 를 보면, production branch 를 2개를 둘 수도 있다. pre-production, production 그래서 pre-production 에서 흔히 test server 에 deploy 를 하고, 이후에 여기서 다시 실제 staging version 으로 production branch 를 뽑는 방식으로 사용하는 듯 하다.

Release branches with GitLab flow 에는 release branch 에 대한 사용법도 나온다. 이것은 거의 git flow 의 release branch 처럼 사용하는 방식인 듯 보인다. 이 경우 production branch 를 따로 두는 것은 아닌 듯 하다.

git flow 이용한 GitLab Flow

git flow init 시에 설정을 아래처럼 잡아준다.

C:\>git flow init -f

Which branch should be used for bringing forth production releases?
   - master
   - prod
Branch name for production releases: [prod]

Which branch should be used for integration of the "next release"?
   - master
Branch name for "next release" development: [pre-prod] master

How to name your supporting branch prefixes?
Feature branches? [feature/]
Bugfix branches? [bugfix/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
Hooks and filters directory? [C:/a/prog/nodejs/jprice/.git/hooks]

Reference

  1. The problem with Git flow | GitLab, 2020-03-05
  2. Introduction to GitLab Flow | GitLab

[컴][웹] 대한민국의 동접 최고 기록

한국 최고 기록 / 동접 기록 / 동접 어느정도가 최고일까 /역대 최고 기록은 / 상식 / 동시 접속 최고 기록 / 서버 동시 접속

대한민국의 동접 최고 기록


  • 엔씨소프트의 모바일 게임 리니지M
    • 2017년
    • 100만~150만 명
  • 공공 서비스
    • 2016년
    • KTX 설 기차표 예매
    • 45만 명

References


  1. 400만명 동시접속 견뎌낼까…네이버·MS 서버 운영 맞대결 | 한경닷컴, 2020-04-08

[컴] windows 10 에서 '검색' 제거하기

윈도우 10 / 윈도우즈 / 윈도우10

windows 10 에서 '검색' 제거하기 / SearchUI.exe 제거하기

cd %windir%\SystemApps\Microsoft.Windows.Cortana_cw5n1h2txyewy
takeown /f SearchUI.exe
icacls SearchUI.exe /grant administrators:F
taskkill /f /im SearchUI.exe
rename SearchUI.exe SearchUI.exe.001

Reference

  1. How to Permanently Stop SearchUI.exe from Running in Windows 10

[컴][자바] java 의 G1 collector 1/2

자바 / 가비지 컬렉터 /

  1. 쿠…sal: [컴][자바] java 의 G1 collector
  2. 쿠…sal: [컴][java] G1 Garbage Collector 2/2

G1 Garbage Collector 1/2

  • server-style garbage collector
  • multi-processor machines 를 target 으로 한다.
  • 높은 처리량(througput)을 달성하면서 높은 확률로 garbage collection pause time 목표를 충족시키다.
  • Oracle JDK 7 update 4 부터 지원시작
  • 다음과 같은 어플리케이션을 위해 디자인 됐다.
    • CMS collector 와 같은 응용 프로그램 스레드와 동시에 작동 하는 application.
    • pause time 을 유발하는 긴 GC가 없이 여유 공간을 compact 하는 application
    • 더 예측 가능한 GC pause durations가 필요한 application
    • 많은 throughput performance 를 희생하고 싶지 않은 application.
    • 훨씬 더 큰 Java 힙이 필요하지 않는 application.

G1은 CMS (Concurrent Mark-Sweep Collector)의 장기 교체 계획이다.

G1과 CMS를 비교해서, G1의 더 나은 점은

  • G1이 compacting collector
    • G1 은 충분히 압축한다
      • allocation을 위한 fine-grained free list 들의 사용을 완전하게 피하고, 대신에 region 들에 의존하기 위해서 --> 연속된 메모리로 옮겨놓는 것, 이로 인해 분산되어있는 것들에 대한 접근을위해 리스트를 traverse 해야 하지만, 한곳에 모아놓으면 traverse time 을 줄이는 것 같다.
      • 이는 collector의 일부를 상당히 단순화하고 잠재적인 fragmentation 문제를 대부분 제거한다
  • 또한 G1은 CMS collector 보다 좀 더 예측 가능한 garbage collection pauses를 제공하며 사용자가 원하는 desired pause 목표를 지정할 수 있다.

G1 동작 overview

오래된 garbage collectors (직렬, 병렬, CMS)는 모두 heap을 fixed memory size의

  • young generation
  • old generation
  • permanent generation

의 세 섹션으로 구성한다.

모든 메모리 객체는 이 세 섹션 중 하나에 들어간다.

G1 collector는 다른 접근 방식을 취한다.

heap은 equal-sized heap regions 의 집합으로 나뉜다. 각각의 region은 virtual memroy 의 연속된 범위이다.

heap  ---> heap region
      |
      +---> heap region
      |
      +---> heap region

특정 region 집합에는 이전 collector와 동일한 역할 (eden, survivor, old)이 할당되지만 정의된 fixed size 는 없다. 이것이 메모리 사용에 있어서 더 큰 유연성을 제공한다.

marking phase

garbage collections 을 수행 할 때 G1은 CMS collector(Concurrent Mark-Sweep Collector)와 유사한 방식으로 작동한다.

G1은 동시 전역 마킹 단계(concurrent global marking phase)를 수행하여 heap 전체에서 객체의 liveness 를 결정한다.

마크 단계가 완료되면 G1은 어느 region이 많이 비어 있는지 알게 된다. 이 region에서 먼저 collect하여 일반적으로 많은 양의 여유 공간을 생성한다. 이러한 garbage collection 방법이 Garbage-First 라고 불리는 이유이다.

reclaimable heap region

이름에서 알 수 있듯이 G1은 회수 가능한(reclaimable) object들, 즉 garbage로 가득 찬 heap region에 수집 및 압축 활동(collection and compaction activity)을 집중시킨다.

G1은 pause prediction model(정지 예측 모델)을 사용하여 user-defined pause time target(유저가 정의한 정지 시간 목표)를 충족시키고 지정된 pause time target를 기반해서 "수집 할 영역(region)의 수"를 선택합니다.

evacuation

G1 이 reclamation 을 할 만큼 오래(ripe)됐다고 판단한 region은 evacuation(방출) 을 사용하여 garbage collect 가 된다.

G1은 "힙의 하나 이상의 region"에서 "힙의 단일 region"으로 객체를 복사하고 프로세스에서 둘 영역 모두의 메모리를 압축하고 해제한다. --> 여러개로 흩어진 region 을 하나의 연속된 공간으로 모으고, 이것을 하나의 region 으로 처리한다?

이러한 evacuation은 multi processors 에서 병렬로 수행되어 pause times을 줄이고 처리량을 증가시킨다.

따라서 G1은 각각의 garbage collection에서 지속적으로 동작하여 단편화를 줄이고 user-defined pause times 내에서 작업한다.

이것은 이전의 두 가지 방법으로는 불가능하다. CMS (Concurrent Mark Sweep) garbage collector 는 압축(compact)을 수행하지 않는다. ParallelOld garbage collection은 전체 힙 압축(whole-heap compaction) 만 수행하므로 상당한 pause times이 발생한다.

G1은 real-time collector가 아니다. 즉, real-time os 처럼 time critical 하지 않다. 높은 확률로 pause time target를 충족하지만, 절대적으로 확신할 수 있는 것은 아니다.

이전 collection 의 데이터를 기반으로 G1은 사용자가 지정한 target time 내에 collect 할 수있는 "region의 수"를 추정한다.

따라서 collector 는 region을 수집하는 비용에 대해 reasonably accurate model(합리적으로 정확한 모델)을 갖고있고, 이 모델을 사용하여 pause time target 내에 어느 region 을 collect 할지 얼마나 많은 region 을 collect 할 지를 결정한다.

참고 : G1에는 concurrent (애플리케이션 스레드와 함께 실행 (예 : refinement, marking, cleanup))와 parallel (멀티 스레드, 예를 들어 stop-the-world) 단계가 있다. full garbage collection은 여전히 ​​단일 스레드이지만, 잘 tuning 하면 애플리케이션이 full GC를 피할 수 있다.

G1 발자국

ParallelOldGC 또는 CMS collector에서 G1으로 마이그레이션하면 JVM 프로세스 크기더 커질 수 있다. 이것은 Remembered Sets 및 Collection Sets과 같은 "accounting" data structures 때문이다.

RSets

  • Remembered Sets(RSets)는 특정 region 에 대한 obejct referece 들을 추적한다.
  • heap에는 region 당 하나의 RSet이 있다.
  • RSet을 사용해서 region의 병렬 및 독립 collection이 가능하게 한다.
  • RSets의 전체 foot printing 영향은 5 % 미만이다.

CSets

  • Collection Sets(CSets) GC에서 collect 될 region 들의 집합.
  • CSet의 모든 라이브 데이터는 GC 중에 evacuated 된다.(copied / moved).
  • regions 의 집합은 Eden, survivor 및 / 또는 old generation 이 될 수 있다.
  • CSets는 JVM 크기에 1 % 미만의 영향을 미친다.

G1의 권장 사용 사례

G1의 첫 번째 초점은 limited GC latency time큰 heap이 필요한 애플리케이션을 실행하는 사용자에게 솔루션을 제공하는 것이다.

약 6GB 이상의 힙 크기와 0.5 초 미만의 안정적이고 예측 가능한 pause time 을 의미한다.

CMS 또는 ParallelOldGC garbage collector로 실행중인 응용 프로그램 중 G1로 전환하는 것이 좋은 경우(다음중 하나에 해당하면 G1 을 사용하는 것이 좋다.)

  • Full GC duration이 너무 길거나 너무 자주 일어난다.
  • object allocation rate 의 비율 또는 object promotion 비율이 크게 다르다.
  • 원하지 않는 긴 garbage collection 또는 compaction pauses (0.5-1 초 이상)

참고 :

  • CMS 또는 ParallelOldGC를 사용하고 있고 응용 프로그램에 garbage collection pauses가 길지 않으면 현재 collector를 유지하는 것이 좋다.
  • 최신 JDK를 사용해도 G1 collector 를 꼭 사용하지 않아도 된다.

See Also

  1. JEP 345: NUMA-Aware Memory Allocation for G1
  2. 마지막 남은 공짜 점심. Facebook의 메모리 할당자 jemalloc | kth 개발자 블로그

Reference

  1. Getting Started with the G1 Garbage Collector

[컴][웹] Adonisjs Unittest 사용시 Tips

TDD / 아도니스 / 유닛  테스트 / 팁스 /에러 해결 / how to recognize after insert / insert 후에 인식 / insert 한 내용 확인하는 방법


Unit Test 사용시 Tips

trx.table('...') 을 사용하자.

trait('DatabaseTransactions'); 을 사용할 때는 Lucid 를 사용하지 말자. 이유는 분석을 하지 않아서 잘 모르겠지만, Lucid ORM 을 사용하면, transaction 으로 insert 한 record 를 확인할 수 없었다.
const { test, trait, before, after } = use('Test/Suite')('Solicitor');
const sinon = require('sinon');

const Product = use('App/Models/Product/Product');

const Database = use('Database');

trait('DatabaseTransactions');

test('test-db-insert', async ({ assert }) => {
  const trx = await Database.beginTransaction();

  const productId = 130; // canceled
  // const productId = 302; // not active yet
  const product = await Product.find(productId, trx);


  const mclass = new MyClass(prodcutId);
  await mclass.run();

  // await Product.find(productId, trx) --> 제대로 동작하지 않는다.
  const product2 = await trx.table('product').where('id', productId).first();


  assert.equal(product.name, product2.name);

  trx.rollback();
});
아래처럼 unittest 를 실행할 수 있다.
node test_ace.js test -f myclass.spec.js

timeout(0)

아래 처럼 때론 timeout 이 돼서 unittest 가 끝나는 경우가 있다.
Error: Test timeout, ensure "done()" is called; ...
이때는 timeout(0) 을 사용하면 된다.
test('test-db-insert', async ({ assert }) => {
  const trx = await Database.beginTransaction();
    ...  

  assert.equal(product.name, product2.name);
  trx.rollback();

}).timeout(0);

trx.rollback()

기본적으로 Database.beginTransaction(); 을 사용하면, 자동으로 trx.rollback() 을 해주기는 하지만, 만약 여러 test 내에서 각각 trx 를 호출하는 경우라면, 각 test 마다 trx.rollback() 을 해줘야 한다.
그렇지 않으면 종종 timeout 이 발생한다.
Error: Test timeout, ensure "done()" is called; ...





[컴][OS] Spinlock, Mutext lock



Spinlock, Mutext lock

Mutex lock 은 os 에서 software 로 lock 을 만들었는데 그중 가장 간단한 도구가 mutex lock 이다.

Mutex lock 을 spinlock 이라고도 부른다. 왜냐하면, process 가 lock 이 available 될 때까지 계속 돌기 때문이다.(spin)

이 spinlock 은 busy waiting 을 만든다. 하지만 반대로 그래서 context switch 가 필요없다.

멀티코어 시스템에서 특정한 경우에는 spinlock 이 훨씬 좋은 선택이 된다.

만약 lock 이 짧은 순간이라면, 다른 thread 는 또다른 core 에서 critical section 을 수행하는 동안 하나의 thread 가 하나의 core 에서 lock 을 기다릴 수 있다.


Spinlock 은 multiprocessor 시스템에서 쓰는 locking mechanism 중 하나이다.
짧은 시간에 lock 을 할 때 사용한다.이 짧은 시간의 정의는

lock 은 2개의context switch 가 필요하다.
1. thread 를 waiting state 로 옮기는 context switch
2. lock 이 가능하게 됐을 때 waiting thread 를 복구 시키는 context switch
일반적인 spinlock 을 사용하는 규칙은 lock 이 2개 미만의 context switch 의 시간동안 lock 을 잡을 때 사용한다.


References


  1. Operating System Concepts 10th edition

[컴][네트워크] DDos(distributed denial of service) 공격

DDOS attack / 디도스 / ddos / distributed denial of service

DDos(distributed denial of service) 공격

디도스 공격의 목적

  • 대상(온라인 리소스)을 느리게 만든다.
  • 대상을 응답이 없게 만든다.

3가지 유형의 디도스 공격

  1. 볼륨 기반 공격
    • 대량의 가짜 트래픽을 이용
    • 웹 사이트나 서버 등의 리소스의 용량을 초과한다.
    • 여기에는 ICMP, UDP, SPF(Spoofed-Packet Flood) 공격 등이 포함
    • 측정: 초당 비트 수(Bits Per Second, BPS)로 측정.
  2. 특정 layer 를 공격
    1. 프로토콜 또는 네트워크 layer 디도스 공격
      • 다수의 패킷을 표적화된 네트워크 인프라인프라 관리 툴로 전송
      • 공격 방법
        • SYN 플러드
        • 스머프 디도스 등
      • 측정: 초당 패킷 수(Packets Per Second, PPS)로 측정.
    2. 애플리케이션 layer 공격
      • 애플리케이션에 악의적인 요청을 무작위로 전송하여 수행.
      • 측정: 초당 요구 수(Requests Per Second, RPS)로 측정.

대규모 공격 예

  • 2016년 10월, 인터넷 인프라 서비스 제공 기업인 딘 DNS(현 오라클DYN)
    • DNS 쿼리를 수천만 개의 IP 주소로부터 받았다.
    • 이로 인해 시스템이 마비됐다.
    • 이 공격은 미라이 봇넷을 통해 수행됐다.
    • IP 카메라와 프린터를 포함하여 10만 개 이상의 IoT 기기를 감염시킨 것으로 보도
    • 최고조일 때 미라이는 40만 개의 봇에 달했다.
    • 아마존, 넷플릭스, 레딧, 스포티파이, 텀블러, 트위터 등의 서비스가 마비.
  • 2018년 초, 2월 28일, github
    • 초당 1.35TB의 트래픽
    • 기트허브는 간헐적으로 차단
    • 20분 만에 해당 공격을 물리쳤다.
    • 해당 공격에 사용된 기술에 관한 분석
      • MemCached 를 사용하는 서버를 이용.
      • 작은 get 으로 큰 사이즈의 response를 가져다 준다.
      • 요청자의 ip address 를 변경해서 요청하면, 특정 ip address 로 대량의 response 가 가게 된다.

봇넷을 활용한 공격

  • 깃허브 이후, 미국의 한 service provider 에 대한 미라이 봇 공격
    • MemCached 기반 공격
    • 초당 1.7TB 공격
    • 취약한 IoT 기기를 활용.
  • 아카마이, 클라우드플레어, 플래시포인트, 구글, 리스크IQ, 팀 사임루 내부의 보안팀들이 수행한 조사에서 유사한 규모의 와이어X라는 봇넷이 발견
    • 100개국에서 해킹된 10만 개의 안드로이드 기기로 구성
  • 토리
    • 일련의 IoT 기기를 장악할 수 있으며 미라이보다 더욱 일관되고 위험한 것으로 여겨지고 있다.
  • 데몬봇
    • 하둡 클러스터를 장악하여 더 큰 연산 능력을 얻는다.
  • 0x-booter 같은 새로운 디도스 실행 플랫폼의 등장
    • 미라이의 변종인 “부시도(Bushido) 악성코드”에 감염된 약 1만 6,000개의 IoT 기기를 이용

디도스 트렌드

  • 봇넷의 임대
    • 디도스 공격자는 봇넷에 의존
    • 이런 봇넷을 임대해서 사용
  • APDoS(Advanced Persistent Denial-of-Service)
    • 단일 공격 안에서 다수의 공격 벡터를 사용하는 APDoS(Advanced Persistent Denial-of-Service)
    • 포함하는 공격
      • 데이터베이스
      • 애플리케이션
      • 서버에 대한 직접적인 공격 등 애플리케이션 계층이 포함
  • ISP 와 클라우드를 타겟으로
    • 피해자를 직접 표적으로 삼지 않는 대신에 그들이 의존하는 ISP와 클라우드 제공자 등의 조직을 표적으로 삼는 경우가 많다.
    • 자사와 협업하는 여러 비즈니스 파트너, 벤더, 공급자에 대한 공격도 우려

github 의 ddos 공격 자료

References

  1. 디도스 공격은 어떻게 발전하고 있나 - CIO Korea

[컴][통신] windows 에서 특정 program 에 대한 방화벽 설정 방법

V3 Lite 를 설치 후 해야 할일 / 안랩 업데이트 / 통신 라이트 / v3 라이트 차단 / 방화벽 설정 방법 / 방화벽 command  / command line firewall netsh how to set advfirewall /




windows 에서 특정 program 에 대한 방화벽 설정 방법

ASDSvc 의 TCP 통신을 제한

V3 Lite - 나무위키의 이야기는 P2P 로 업데이트 하는 방식을 사용한다고 한다.

그래서 이부분을 조금 제한 하려 한다. 현재로서는 이렇게 했을 때 update 가 될지 안될지 확인을 해보지는 못했다.

대략적인 절차

  • 제어판 --> windows 방화벽 –> 고급설정 
  • --> 아웃바운드 규칙 
  • –> 새규칙 
  • –> 규칙종류, ‘프로그램’
  • –> %ProgramFiles%\AhnLab\V3Lite40\ASDSvc.exe
  • –> 연결차단

CLI command

위처럼 gui 를 통해서 해도 되고, 간단하게 아래 command 를 사용해도 된다. (관리자 권한의 cmd 를 열어야 한다.)

netsh advfirewall firewall add rule name="ASDSvc - my conf" dir=out action=block program="%ProgramFiles%\AhnLab\V3Lite40\ASDSvc.exe" enable=yes profile=ANY


ASDSvc 가 1755 port 도 계속 이용하는 듯 하다. 1755 는 MS-streaming 관련 port 라서 port 자체를 막는 것은 좋지 않아 보인다. 일단 위의 프로그램 관련 통신만 차단해도 ASDSvc 가 1755 에서 통신을 하지는 않는 듯 보인다.

See Also


  1. Port 1755 (tcp/udp) :: SpeedGuide

Reference


  1. How to use the "netsh advfirewall firewall" context instead of the "netsh firewall" context to control Windows Firewall behavior in Windows Server 2008 and in Windows Vista
  2. Netsh AdvFirewall Firewall Commands






[웹][툴] github marketplace 에서 도움이 되는 도구들

도구/ 코드 리뷰 도구 / code analysis / code review / tools /



github marketplace 에서 도움이 되는 도구들

가격정보는 ref. 1 에 있다.

  1. AccessLint 
  2. Imgbot
    1. Imgbot - Automatic image compression
    2. github market place 에서 설치할 수 있는듯 하다. 설치를 하면 내 git repository 에 있는 이미지를 압축해 주는 듯 하다.
  3. LGTM
  4. DeepSource
  5. Codelingo
    1. codelingo · GitHub Marketplace · GitHub
    2. 정의해 놓은 coding rule 에 따라 소스를 확인해준다. lint 같은 툴이다.
  6. DeepScan
  7. CodeScene
  8. FeaturePeek



References


  1. https://featurepeek.com/blog/the-8-best-tools-for-code-review-in-2020/

[웹] 멜로디 관련 프로그래밍

멜로디 프로그래밍 / 프로그래밍으로 음악을 / 소리 / 사운드 관련 / 음악관련 소리 관련 / progrmaming melody / 코딩 /


멜로디 관련 프로그래밍

  1. http://allthemusic.info/
    1. GitHub - allthemusicllc/atm-cli: Command line tool for generating and working with MIDI files. : Rust 로 되어 있다. shell 에서 멜로디를 프로그래밍? 하는 듯 하다.

[컴][웹] AdoniJS 에서 File Upload

아도니스 / 업로드 / 파일 업로드

AdoniJS 에서 file upload

file 의 upload 와 함께, file 이름도 함께 server 로 전달하고 싶었다. 그래서 처음에 client side 의 FormData 에 field 를 하나 더 추가해서 server 로 보냈다.
...
onClickUpload() {
  ...
  // @ref : https://reactjs.org/docs/uncontrolled-components.html#the-file-input-tag
  const file = this.fileInput.current.files[0];
  if (file) {
    const reqData = new FormData(); // eslint-disable-line
    reqData.append('file', file);
    reqData.append('alias', this.state.alias);

    this.props.uploadFile(this.props.url, reqData);
  }
}

render() {
  return (
    <div className="">
      <input type="text" placeholder="alias 별칭" name="alias" onChange={this.onChangeAlias} />
      <input
        type="file"
        className="form-control"
        name={this.props.name}
        ref={this.fileInput}
      />
      <button
        type='button'
        onClick={this.onClickUpload}
        disabled={this.props.uploadStatus === 'WAITING'}
      >
        UPLOAD
      </button>
      <div>
        {this.state.message}
      </div>
    </div>
  );
}
...

문제점

그래서 서버쪽에서는 아래처럼 처리를 하려고 했다. 하지만 문제는 request.multipart.field 로 등록한 callback 과 request.multipart.file 에서 등록한 callback 중 어느 것이 먼저 동작할 지 알 수 없는 것이다. 순서에 대한 보장이 되지 않는다. [ref. 1]



  async uploadEventBanner({ request, response }) {

    let fileUrl, dstPath;
    try {
      // const alias = inputData.alias;
      const bButler = new BannerButler();
      let body = {};
      request.multipart.field((name, value) => {
        // 이것이 request.multipart.file 의 callback 보다 먼저 실행되지 않는다.        
        body[name] = value;
      });

      // 'file' is name attribute of form-data
      request.multipart.file('file', {}, async (file) => {
        dstPath = bButler.getDstPath(file, alias);
        await bButler.upload(file, dstPath);
      });
      await request.multipart.process();

      fileUrl = bButler.getFileUrl(dstPath);
      await bButler.insertEventBannerInfo(alias, inputData.notice_id, fileUrl);

    } catch (e) {
      console.error(e.stack);
      return response.status(400).json({ error: e.message });
    }

    return response.json({ message: 'upload_completed', url: fileUrl });
  }

대안

ref.1 에서 비슷한 경우가 있어서 답변을 보니 다음 2가지 방법으로 처리가 가능할 듯 했다.
  1. alias 를 query string 으로 넘기는 방법 : 이방법이 지금으로서는 최선인 듯 하다.
  2. GB 정도의 사이즈를 다루는 것이 아니라면, upload 를 직접 처리하는 방법: 이것은 아마도 ref. 2 에서 처럼 직접 file 을 다루는 방법을 이야기하는 듯 하다.

See Also

  1. HTTP Tests

Reference

  1. How to get request values with processManually · Issue #1092 · adonisjs/core · GitHub
  2. File Uploads