반응형

(Deno.js)디노 - Windows Server 2019(윈도우 서버)에 Deno 설치하기

 

디노를 Windows Server 2019(윈도우 서버)에 설치해보도록 하겠습니다.

현재 디노 최신버전은 v.1.8.2까지 나와있습니다.

 

최신버전 설치방법은 아래 명령어를 Windows PowerShell(윈도우즈 파워쉘)에서 입력 및 실행하여 주시면 됩니다.

iwr https://deno.land/x/install/install.ps1 -useb | iex

 

특정버전의 Deno를 설치하고 싶다면 아래처럼 명령어를 입력해주시면됩니다. (예: v1.0.0 설치)

$v="1.0.0"; iwr https://deno.land/x/install/install.ps1 -useb | iex

 

 

1. 먼저 윈도우의 검색에서 PowerShell을 검색하여 실행하여 줍니다.

Windows PowerShell

 

2. 다음은 파워쉘 커맨드창에 아래처럼 명령어를 입력해줍니다.

    iwr https://deno.land/x/install/install.ps1 -useb | iex

Deno.js 설치 명령어

 

그러면 아래처럼 웹요청으로 파일을 받아오게 됩니다.

 

Deno의 설치가 성공적으로 완료되면 디노의 실행파일이 설치된 위치와 알려줍니다.

 

환경변수를 확인해보면 설치와 동시에 자동으로 위치가 입력되었음을 확인할 수 있습니다.

그렇기 때문에 어떤 위치에서도 deno.exe 명령을 실행할 수 있습니다.

 

만약 Deno의 설치위치를 변경하여 설치하고자 한다면 설치명령어를 실행하기 전,

아래 첫줄과 같이 설치 위치를 입력하시면 지정하는 폴더에 Deno가 설치됩니다.

(설치위치 변경 예: C:\Program Files\deno)

주의하실점은 파워쉘을 관리자권한으로 실행하셔야 합니다.

$env:DENO_INSTALL = "C:\Program Files\deno"
iwr https://deno.land/x/install/install.ps1 -useb | iex

 

3. 다음은 Deno의 버전과 도움말을 확인해 봅니다.

 

4. 파워쉘에서 인터넷 주소에 있는 타입스크립타파일(.ts)을 실행하여 보겠습니다.

deno run https://deno.land/std/examples/welcome.ts

 

5. 마지막으로 deno를 이용하여 서버를 실행하여 보겠습니다.

 

import { serve } from "https://deno.land/std@0.91.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}

 

위 소스를 serve.ts 파일로 저장된 상태입니다.

 

파워쉘에서 아래 명령어와 옵션으로 serve.ts를 실행하여 줍니다.

deno run --allow-net serve.ts

 

웹브라우저를 열어 http://localhost:8000으로 접속해 봅니다.

 

(Deno.js)디노 전체보기

 

'(Deno.js)디노' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

 

반응형

반응형

(PYTHON)파이썬 알고리즘 - 문자열 검색(블루투 포스법, KMP법, 보이어 무어법)

 

브루투 포스법

def bf_match(txt: str, pat: str) -> int:
    """브루트 포스법으로 문자열 검색"""
    pt = 0  # txt(텍스트)를 따라가는 커서
    pp = 0  # pat(패턴)를 따라가는 커서

    while pt != len(txt) and pp != len(pat):    # pt와 pp가 문자열 끝자리를 벗어나지 않았다면 실행
        if txt[pt] == pat[pp]:  #텍스트문자열과 패턴용 문자열의 pt, pp위치에 값이 같으면
            pt += 1
            pp += 1
        else:   # 값이 다르면
            pt = pt - pp + 1    # 비교할 시작값(pt)을 배열 한칸 우측으로 이동
            pp = 0  # pp 시작값은 0번으로 변경하여 다시 비교

    return pt - pp if pp == len(pat) else -1    # 만약 비교할 패턴이 다맞아서pp가 pat길이와 같은 값이되면 pt - pp를 리턴, 아니면 -1을 리턴

if __name__ == '__main__':
    s1 = input('텍스트를 입력하세요.: ')  # 텍스트용 문자열
    s2 = input('패턴을 입력하세요.: ')    # 패턴용 문자열

    idx = bf_match(s1, s2)  # 문자열 s1~s2를 브루트 포스법으로 검색

    if idx == -1:
        print('텍스트 안에 패턴이 존재하지 않습니다.')
    else:
        print(f'{(idx + 1)}번째 문자에서 일치합니다.')

 

 

표준라이브러리를 사용한 문자열 검색(find, index)

# 문자열에 포함되어 있는 문자열을 검색(find 계열 함수)

txt = input('문자열 txt: ')  # 문자열 나열
ptn = input('문자열 ptn: ')  # 검색할 문자

c = txt.count(ptn)

if c == 0:                                                  # 포함된 문자가 없음
    print('ptn은 txt에 포함되어 있지 않습니다.')
elif c == 1:                                                # 포함된 문자가 1개만 있는 경우
    print('ptn이 txt에 포함되어 있는 인덱스: ', txt.find(ptn))
else:                                                       # 포함된 문자가 2개 이상 있는 경우
    print('ptn이 txt에 포함되어 있는 맨 앞 인덱스: ', txt.find(ptn))
    print('ptn이 txt에 포함되어 있는 맨 끝 인덱스: ', txt.rfind(ptn))
# 문자열에 포함되어 있는 문자열을 검색(index 계열 함수)

txt = input('문자열 txt: ')
ptn = input('문자열 ptn: ')

c = txt.count(ptn)

if c == 0:                                                  # 포함된 문자가 없음
    print('ptn은 txt에 포함되어 있지 않습니다.')
elif c == 1:                                                # 포함된 문자가 1개만 있는 경우
    print('ptn이 txt에 포함되어 있는 인덱스: ', txt.index(ptn))
else:                                                       # 포함된 문자가 2개 이상 있는 경우
    print('ptn이 txt에 포함되어 있는 맨 앞 인덱스: ', txt.index(ptn))
    print('ptn이 txt에 포함되어 있는 맨 끝 인덱스: ', txt.rindex(ptn))

 

 

KMP법

브루트 포스법은 일치하지 않는 문자를 만나면 이전 단계를 검사했던 결과를 버리고 패턴의  첫 문자부터 다시 검사를 수행하지만, KMP법은 검사했던 결과를 버리지 않고 효율적으로 활용하는 알고리즘입니다.

(건너뛰기 표를 만들어 활용)

def kmp_match(txt: str, pat: str) -> int:
    """KMP법에 의한 문자열 검색"""
    pt = 1  # txt를 따라가는 커서
    pp = 0  # pat를 따라가는 커서
    skip = [0] * (len(pat) + 1)  # 건너뛰기 표 

    # 건너뛰기 표 만들기
    skip[pt] = 0
    while pt != len(pat):   # pt 위치가 패턴길이와 같지 않다면 실행
        if pat[pt] == pat[pp]:
            pt += 1
            pp += 1
            skip[pt] = pp
        elif pp == 0:
            pt += 1
            skip[pt] = pp
        else:
            pp = skip[pp]

    # 검색하기
    pt = pp = 0
    while pt != len(txt) and pp != len(pat):    # pt와 pp가 문자열 끝자리를 벗어나지 않았다면 실행
        if txt[pt] == pat[pp]:  #텍스트문자열과 패턴용 문자열의 pt, pp위치에 값이 같으면
            pt += 1
            pp += 1
        elif pp == 0:   # pp가 0이면 
            pt += 1
        else:
            pp = skip[pp]

    return pt - pp if pp == len(pat) else -1    # 만약 비교할 패턴이 다맞아서pp가 pat길이와 같은 값이되면 pt - pp를 리턴, 아니면 -1을 리턴

if __name__ == '__main__':
    s1 = input('텍스트를 입력하세요.: ')  # 텍스트용 문자열
    s2 = input('패턴을 입력하세요.: ')    # 패턴용 문자열

    idx = kmp_match(s1, s2)  # 문자열 s1~s2를 KMP법으로 검색

    if idx == -1:
        print('텍스트 안에 패턴이 존재하지 않습니다.')
    else:
        print(f'{(idx + 1)}번째 문자에서 일치합니다.')

 

 

보이어 무어법

패턴의 끝 문자에서 시작하여 앞쪽을 향해 검사를 수행합니다. 이 과정에서 일치하지 않는 문자를 발견하면 미리 준비한 표를 바탕으로 패턴이 이동하는 값을 결정합니다.

def bm_match(txt: str, pat: str) -> int:
    """보이어 무어법에 의한 문자열 검색"""
    skip = [None] * 256  # 건너뛰기 표

    # 건너뛰기 표 만들기
    for pt in range(256):
        skip[pt] = len(pat)
    for pt in range(len(pat)):
        skip[ord(pat[pt])] = len(pat) - pt - 1

    # 검색하기
    while pt < len(txt):
        pp = len(pat) - 1
        while txt[pt] == pat[pp]:
            if pp == 0:
                return pt
            pt -= 1
            pp -= 1
        pt += skip[ord(txt[pt])] if skip[ord(txt[pt])] > len(pat) - pp \
              else len(pat) - pp

    return -1

if __name__ == '__main__':
    s1 = input('텍스트를 입력하세요.: ')  # 텍스트 문자열
    s2 = input('패턴을 입력하세요.: ')    # 패턴 문자열

    idx = bm_match(s1, s2)  # 문자열 s1~s2를 KMP법으로 검색

    if idx == -1:
        print('텍스트 안에 패턴이 존재하지 않습니다.')
    else:
        print(f'{(idx + 1)}번째 문자에서 일치합니다.')

 

(PYTHON)파이썬 전체보기

 

'(PYTHON)파이썬' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

 

반응형