반응형

Pell's Equation 은 알고리즘 문제 풀이에 상당히 자주 등장하는데요,  아래와 같은 형태의 식에 대한 해법을 구하는 것입니다.

 

 

여기서 제약은 x, y, n 은 자연수이고, n이 제곱수가 되어서는 안된다는 것입니다. 

 

아래 링크에서 자세한 설명을 보실 수 있습니다.
https://en.wikipedia.org/wiki/Pell%27s_equation

 

간단한 대입만으로도 해결이 되는 경우가 있지만, n에 따라서는 답이 쉽게 나오지 않는 경우도 있습니다.

아래의 코드를 이용하면 쉽게 기본해를 구할 수 있습니다. 기본해를 이용하면 추가로 해를 구할 수도 있습니다. 

 

def solvePells(n):
    a, b = 0, 0
    x = int(n**0.5)
    y, z, r = x, 1, (x<<1)
    e1, e2, f1, f2 = 1, 0, 0, 1
    
    while True:
    	y = r * z - y
        z = ((n - y * y) // z)
        r = (x + y) // z
        
        t = e1
        e1 = e2
        e2 = e2 * r + t
        
        t = f1
        f1 = f2
        f2 = f2 * r + t
        
        a, b = f2, e2
        
        t = b
        b = a
        a = a * x + t
        
        if (a * a - n * b * b == 1):
        	break
    return a, b
    

 

 

반응형
반응형

Swap 은 하드디스크를 매핑시켜서 추가 메모리처럼 사용하는 영역입니다.

기존에는 swap partition 을 사용했었는데, Ubuntu 17.04 부터는 파일로 변경되었습니다.

파티션 변경없이 쉽게 변경이 가능하다는 장점이 있습니다.

 

Ubuntu 18.04 LTS 에서 실행한 것으로 버전에 따라 약간 상이할 수 있습니다.

 

0. 현재 사용 중인 swap 정보를 확인합니다.

grep SwapTotal /proc/meminfo

 

1. 현재 사용중인 swap 을 중지 시킵니다.

sudo swapoff -a

 

 

2. swap 으로 사용할 파일을 생성합니다.

sudo dd if=/dev/zero of=/swapfile bs=1G count=16

 

if : input file

of : output file

bs : block size

count : number of blocks

위의 예시의 경우 1G * 16 = 16G 사이즈의 파일이 생성됩니다. 만약 시스템 메모리가 충분하지 않아서 한번에 1G의 임시 파일을 생성할 수 없다면, block size를 줄이고 count를 늘리면 됩니다.

sudo dd if=/dev/zero of=/swapfile bs=16384 count=1048576

 

 

2-1. Ubuntu의 경우 fallocate 명령어로도 파일 생성이 가능합니다. fallocate 명령어를 사용하는 것이 훨씬 빠르고 편하지만, fallocate 명령어로 생성한 파일은 특정 파일 시스템에서 문제가 발생할 수도 있다고 합니다. (swapon manual notes에 나와 있는 내용) 그리고, 특정 리눅스 배포판에서는 fallocate 명령어가 없기 때문에 dd 명령어가 더 범용적인 방법일 것 같습니다. 그냥 참고만 하세요.

sudo fallocate -l 16G /swapfile

 

 

3. 해당 파일을 시스템만 접근이 가능하도록, 권한을 조정합니다.

sudo chmod 600 /swapfile

 

 

4. 생성한 파일을 swap 으로 사용할 수 있게 합니다.

sudo mkswap /swapfile

 

5. swap 을 활성화 합니다.

sudo swapon /swapfile

 

6. 현재 사용 중인 swap 정보를 다시 확인합니다.

sudo grep SwapTotal /proc/meminfo

 

7. 마지막으로 부팅시에도 swap 이 적용될 수 있게 /etc/fstab을 편집합니다.

sudo vi /etc/fstab

 

아래 내용 추가

/swapfile    swap    swap    defaults    0    0

 

8. 확인

swap 정보 확인

sudo swapon --show

 

메모리 체크

free -h

 

 

9. swappiness 설정

swappiness 는 swap 메모리를 언제 사용할지에 대한 설정입니다. 설정값은 퍼센트로 0~100을 설정할 수 있습니다. 만약 30으로 설정하였다면, 시스템 메모리가 30% 이하로 남게되면 swap을 사용하라는 의미입니다. 숫자가 적을 수록 swap을 적게 사용하게 됩니다.

 

아래 명령어로 확인합니다.

cat /proc/sys/vm/swappiness

 

변경은 아래와 같이 합니다.

sudo sysctl vm.swappiness=20 

 

영구적으로 변경을 원한다면, /etc/sysctl.conf 파일을 편집합니다.

sudo vi /etc/sysctl.conf

 

아래 내용 추가

vm.swappiness=20

 

10. swap 제거하기

swap 종료

sudo swapoff -v /swapfile

 

/etc/fstab 파일 편집해서 swap 정보 삭제

vi /etc/fstab

 

swap 파일 삭제

sudo rm /swapfile

 

 

반응형

'Linux > Ubuntu' 카테고리의 다른 글

Ubuntu 에서 Oracle JDK 설치하기  (0) 2020.04.04
반응형

Oracle 의 JDK 정책이 변경되면서, Open JDK 를 사용하려고 했으나..

Oracle JDK가 반드시 필요한 상황이 생겨서 Oracle JDK를 설치하는 방법에 대해서 포스팅 해 봅니다.

 

테스트 환경은 Ubuntu 18.04 LTS 이고, 설치할 JDK는 버전은 11 입니다.

리눅스의 JDK 설치과정은 바이너리 파일들을 적당한 경로에 두고, 필요한 바이너리들을 링크해 주는 것인데요.

연결할 바이너리 파일들이 한 두 개가 아니라서, 일일이 소프트 링크를 만드는 것이 번거로운 작업이라서 installer 를 이용해서 설치해 보겠습니다.

 

먼저 Oracle 사이트에서 JDK11 을 다운로드 받습니다. (링크는 변경될 수도 있으니 검색해서 찾으시는 것을 권장합니다.)

https://www.oracle.com/java/technologies/javase-jdk11-downloads.html

 

Oracle 정책 때문에 다운로드시에 로그인을 해야하는데요, Oracle 에 계정이 없다면 하나 만드시면 됩니다.

 

다운로드한 파일을 installer 가 인식할 수 있는 경로에 복사해 두어야 합니다. (버전 확인하세요! 현재 11.0.6 입니다.)

경로는 /var/cache/oracle-jdk11-installer-local 입니다.

다음 명령으로 경로를 생성하고 다운로드한 파일을 해당 경로로 복사합니다.

sudo mkdir -p /var/cache/oracle-jdk11-installer-local

sudo cp jdk-11.0.6_linux-x64_bin.tar.gz /var/cache/oracle-jdk11-installer-local/

 

그리고 시스템 업데이트를 실행합니다.

sudo apt update && sudo apt upgrade

 

PPA (Personal Package Archive) 를 추가합니다.

sudo add-apt-repository ppa:linuxuprising/java && sudo apt update

 

아래 명령으로 JDK를 설치합니다.

sudo apt install oracle-java11-installer-local

 

설치 후 버전을 확인합니다.

java --version

 

반응형

'Linux > Ubuntu' 카테고리의 다른 글

Ubuntu 에서 Swap 사이즈 조정하기  (0) 2020.04.04
반응형

이번 포스팅은 MS사의 ERP 솔루션인 Dynamics AX 개발 환경 설정에 대해서 알아 보겠습니다.

 

설치할 버전은 Dynamics AX 2012 R3 버전입니다. 소프트웨어는 MS 다운로드 페이지에서 구할 수 있습니다.

 

https://www.microsoft.com/en-us/download/details.aspx?id=58205&WT.mc_id=rss_alldownloads_all

 

Microsoft Dynamics AX 2012 R3

Microsoft Dynamics AX 2012 R3

www.microsoft.com

 

Dynamics AX 는 의존성이 많아서 미리 준비해야 할 것들이 많이 있습니다. 설치 파일을 실행해서 설치할 패키지를 선택하면 필요한 의존성들이 어떤게 있는지 확인해 알려줍니다. 각 항목에 대해 자세히 설명한 링크가 있지만 오래된 탓인지 대부분 제대로 작동하지 않지만, 잘 검색해 보면 아직은 찾아볼 수 있습니다. 또 한 가지 주의할 점은 반드시 호환되는 버전으로 필요한 프로그램들을 설치를 해야지만 요구사항을 통과할 수 있습니다. 

 

OS는 Windows 10 Enterprise 로 가정하겠습니다. 클린 설치를 했다고 가정하고 시작해 보겠습니다.

 

0. 같은 도메인에 Dynamics AX 서버가 설치되어 있어야 합니다. 

 

1. Windows Update

- 최신 업데이트들을 모두 설치해 줍니다.

 

2. Visual Studio 2010 (Ultra)

- 설치 후 서비스팩도 설치해 줍니다. (Visual Studio 2010 SP1)

 

3. MS SQL Express 2008 R2 Advanced

- 설치시 Business Inteligence Development Studio 를 반드시 설치해야 합니다.

 

먼저 개발자 옵션으로 Dynamics AX 설치해 보겠습니다.

 

Setup을 실행하고, Validate system requirements 를 클릭합니다.

 

컴포넌트에서 Debugger 와 Visual Studio Tools 를 선택합니다.

 

실행해 보면 3가지 항목에 Error 표시가 나타납니다. 

 

먼저 Domain user account는 도메인 설정이 필요합니다.

 

도메인 유저 계정을 사용하기 위해서는, 내 컴퓨터 > 속성 화면에서 속성 변경을 클릭 합니다.

아래 화면에서 Change (변경) 버튼을 눌러 도메인에 로그인 합니다.

Microsoft Chart Controls for Microsoft .NET Framework 3.5 는 아래 링크에서 프로그램을 다운로드하여 설치합니다.

 

https://www.microsoft.com/en-us/download/details.aspx?id=14422

 

Microsoft Chart Controls for Microsoft .NET Framework 3.5

ASP.NET and Windows Forms Chart Controls for .NET Framework 3.5 SP1

www.microsoft.com

 

 

마지막으로 Windows Identity Foundation 은 윈도우 기능 추가로 설치합니다.

제어판 > 프로그램 > 윈도우 기능 켜기 / 끄기 > Windows Identity Foundation 3.5 선택

 

 

Dynamics AX의 Setup 을 다시 실행하여 Debuger와 Visual Studio Tools를 설치합니다.

 

설치 도중 AOS 서버는 Dynamics AX 서버가 설치된 서버의 이름을 적어 주면 됩니다.

 

 

설치가 완료되면 Visual Studio 를 실행해서 View > Application Explorer 를 선택하면 Dynamics AX 프로젝트에 접속할 수 있습니다.

 

반응형
반응형

Combination 은 다음 식으로 계산이 가능합니다.

 

nCr = n! / ((n-r)! * r!)

 

n, r 숫자가 커지면 결과가 너무 커져서 계산이 힘들어 집니다.

 

대신 계산을 끝까지 하지 않고도, 소인수 분해는 가능합니다.

 

아래 코드를 이용하면 됩니다.

 

def findPrimeFactors(n, k):
    tPrimeFactorsMap = {}
    
    # 소수인지 합성수인지 체크하기 위한 배열 - 최대 소수는 n 보다 작거나 같음
    tCompositeChecker = [True] * 2 + [False] * n
    
    for p in xrange(n + 1):
    
    	# 합성수인 경우 다음으로 넘김
        if tCompositeChecker[p]:
            continue
        
        q = p
        m = 1
        
        # 현재 소수 p가 몇 번 나오는지 체크하기 위한 변수
        tPrimeCnt = 0
        
        # 현재 체크 중인 q에 대해서 해당 소수 p가 몇 번 들어 있는지 체크하기 위한 리스트
        tPrimePowers = [0] * (n + 1)
        
        while True:
            tPrimePowers[q] = tPrimePowers[m] + 1
            
            # q 가 k 보다 작거나 같으면 분모, 해당 개수 만큼 빼줌
            if q <= k:
                tPrimeCnt -= tPrimePowers[q]
            # q 가 n - k 보타 크면 분자, 해당 개수 만큼 더해줌
            if q > n - k:
                tPrimeCnt += tPrimePowers[q]
                
            q += p
            m += 1
            if q > n:
                break
            
            # q는 p의 배수이므로 합성수
            tCompositeChecker[q] = True
            
        tPrimeFactorsMap[p] = tPrimeCnt
        
    return tPrimeFactorsMap

 

 

 

 

 

반응형
반응형

유클리드 호제법은 2개의 자연수 또는 정식의 최대공약수를 구하는 알고리즘의 하나입니다.

호제법이란 말은 두 수가 서로 상대방 수를 나누어서 원하는 수를 얻는 알고리즘입니다.

 

재귀호출을 통해서 구하는 방법과 반복문을 통해서 구하는 방법이 있습니다.

 

 

재귀호출을 이용하는 방법입니다.

def gcd(m,n):
        if m < n:
                m, n = n, m
        if n == 0:
                return m
        if m % n == 0:
                return n
        else:
                return gcd(n, m%n)

 

반복문을 이용하는 방법입니다.

def gcd(x, y):   
        while(y): 
                x, y = y, x % y   
        return x 

 

라메의 정리에 의하면, 최대공약수를 구할 때, 소인수 분해를 이용하는 것 보다 유클리드 호제법을 이용하여 구하는 것이 훨씬 빠른 것으로 알려져있습니다.

반응형

'알고리즘 (기초)' 카테고리의 다른 글

Pell's Equation  (0) 2020.04.28
Combination 소인수 분해  (0) 2019.10.04
팩토리얼에서의 지수 계산  (0) 2018.09.09
오일러 피 함수  (0) 2018.08.30
에라토스테네스의 체  (0) 2018.08.17
반응형

SAP UI5 APP 개발 환경은 Cloud 버전을 사용하거나 Personal Edition을 다운로드 받아서 설치하면 됩니다.

 

Cloud 버전은 약간의 비용이 발생하지만 SAP 에서 항상 최신 버전의 개발 환경을 제공해 준다는 장점이 있습니다.

 

또 하나의 단점으로는 중간에 네트워크 연결이 끊어지면 작업하던 내용이 저장되지 않는 이슈가 있었습니다. 

(2018년에 마지막으로 써봐서 아직도 그런지는 모르겠습니다..)

 

Personal Edition은 로컬 컴퓨터에서 개발이 가능하지만, 업데이트가 느리고 (2020년 3월 기준으로 아직도 2018년 12월에 배포한 버전 사용 중), 플러그인 들을 사용할 수 없습니다.

 

여기에서는 Personal Edition 을 이용한 개발환경에 대해서 설명해 보겠습니다.

 

WebIDE Personal Edition 을 사용하기 위해서는 Java가 설치되어 있어야 합니다. 저는 로컬에 Oracle JDK 8 이 설치되어 있습니다.

 

 

Personal Edition 은 아래 URL에서 다운로드 받을 수 있습니다.

 

https://tools.hana.ondemand.com/#sapui5

 

 

OS에 맞는 Download Link 를 클릭하여 다운로드를 받으면 됩니다. Trial 버전과 Production 버전에는 큰 차이는 없었던 것으로 알고 있는데, deploy 할 시스템이 있다면 Production 버전을 선택합니다.

설치는 다운로드 받은 파일의 압축을 푸는 것으로 끝입니다.

 

윈도우 기준 C:\WebIDE 폴더에 압축을 풀면 되는데, 파일 길이나 이름 때문에 압축 해제시 에러가 발생할 수 있으므로, 해당 기능을 지원해주는 압축 프로그램을 사용해서 풀어 줍니다. (7z 혹은 반디집 추천)

 

압축해제 후에 아래 경로에서 orion 을 실행합니다.

C:\WebIDE\sap-webide-personal-edition-1.53.9-prod-win32.win32.x86_64\eclipse

 

orion 으로 WebIDE 로컬 서버를 실행하고 나면, Web Browser 를 열어서 다음과 같이 입력합니다.

 

http://localhost:8080/webide/index.html

 

그러면, 아래와 같은 페이지로 redirect 됩니다.

 

처음 실행시에는 계정이 없을 테니, Create a new accout 를 눌러 새 계정으로 만들어서 사용합니다.

 

 

email 은 입력하지 않아도 됩니다.

 

Sign up 후에 아래와 비슷한 로그인 화면으로 갈 수 있습니다.

 

혹시나 로그인 후에 404 에러가 나거나 하면, JDK 버전을 의심해 보세요.

 

이상으로 WebIDE 개발환경 설정을 마칩니다.

반응형
반응형

* 이 포스트는 "파이썬 프로그래밍으로 지루한 작업 자동화하기" 의 내용을 참조해서 작성하였습니다.

* 파이썬 3.3을 기준으로 작성하였습니다.



파일 및 폴더 관리


shutil, os 모듈을 이용한 파일 및 폴더 관리에 대해서 알아보겠습니다.



파일 혹은 폴더 복사하기


>>> import shutil

>>> shutil.copy('/tmp/spam.txt', '/tmp2')

# /tmp 경로에 있는 spam.txt 파일을 /tmp2 경로로 복사합니다.

>>> shutil.copy('eggs.txt', '/tmp2/eggs2.txt')

# 현재 작업 경로에 있는 eggs.txt 파일을 /tmp2 경로에 eggs2.txt 파일로 이름을 변경하여 복사합니다.

>>> shtuil.copytree('/tmp/bacon', '/tmp/bacon_backup')

# /tmp/bacon 폴더에 있는 모든 내용을 /tmp/bacon_backup 으로 복사합니다.


 

파일 혹은 폴더 이동 및 이름 바꾸기


>>> import shutil

>>> shutil.move('/tmp/bacon.txt', '/eggs')

# 만약 /eggs 라는 폴더가 있다면, /tmp 경로에 있는 bacon.txt 파일을 /eggs 경로로 이동합니다.

# 만약 /eggs 라는 폴더가 없다면, /tmp 경로에 있는 bacon.txt 파일을 / 경로로 옮기고 파일 이름을 eggs 로 변경합니다.

>>> shutil.move('/tmp/bacon.txt', '/eggs/new_bacon.txt')

# /tmp 경로 있는 bacon.txt 파일을 /eggs 경로로 옮기고 파일 이름을 new_bacon.txt 로 변경합니다.



파일 혹은 폴더 지우기


 os.unlink()

 파라미터로 보내진 경로에 있는 파일을 삭제합니다. 

 os.mkdir()

 파라미터로 보내진 경로에 폴더를 생성합니다. 

 os.rmdir()

 파라미터로 보내진 경로에 있는 폴더를 삭제합니다. 해당 경로에는 어떤 파일이나 폴더도 없는 빈 폴더여야 합니다.

 shutil.rmtree()

 파라미터로 보내진 경로에 있는 폴더를 삭제합니다. 그 안의 파일 및 폴더도 모두 삭제됩니다.



다음은 확장자가 txt 인 파일을 모두 삭제하는 코드입니다.


>>> import os

for filename in os.listdir():

if filename.endswith('.txt'):

os.unlink(filename)



디렉토리 경로 탐색


os.walk() 함수를 이용합니다.


>>> import os

>>> for folderName, subfolders, filenames in os.walk('.'):

>>>    print (folderName, subfolders, filenames)




파일 압축하기


zipfile 모듈을 이용한 파일 압축에 대해서 알아보겠습니다.



ZIP 파일 읽기


ZipFile 객체를 생성하여 필요한 작업을 수행하고 객체의 리소스를 해제해 줍니다.


>>> import zipfile, os

>>> testZip = zipfile.ZipFile('example.zip')

# example.zip 파일로 부터 ZipFile 객체를 생성합니다.

>>> testZip.namelist()

# example.zip 파일에 포함된 파일 리스트를 출력합니다.

>>> testFile = testZip.getinfo('test.txt')

# example.zip 파일에 들어 있는 test.txt 파일에서 정보를 읽어서 ZipInfo 형태의 객체를 돌려줍니다.

>>> testFile.file_size

# test.txt 파일의 압축되기 전 크기를 출력합니다.

>>> testFile.compress_size

# text.txt 파일이 압축된 파일 크기를 출력합니다.

>>> testZip.close()

# 객체의 리소스를 정리합니다.



ZIP 파일에서 추출하기


extract, extractAll 메소드를 이용하여 파일을 추출합니다.



전체 파일 추출하기


>>> import zipfile, os

>>> testZip = zipfile.ZipFile('example.zip')

>>> testZip.extractAll()

# 현재 작업 경로에 example.zip 파일에 있는 모든 파일을 추출합니다.

>>> testZip.close()



일부 파일 추출하기


>>> import zipfile, os

>>> testZip = zipfile.ZipFile('example.zip')

>>> testZip.extract('test.txt')

# 현재 작업 경로에 test.txt 파일을 추출

>>> testZip.extract('test.txt', '/tmp)

# /tmp 에 test.txt 파일을 추출



파일에서 압축하기


압축 파일을 생성하려면, ZipFile 객체를 생성할 때, 두 번째 인수로 'w' 를 전달하여 쓰기 모드로 열면 됩니다. 

파일을 압축해서 추가할 때는 write() 메소드를 사용합니다.


>>> import zipfile

>>> newZip = zipfile.ZipFile('new.zip', 'w')

>>> newZip.write('spam.txt')

>>> newZip.close()




반응형

'프로그래밍 > Python' 카테고리의 다른 글

Python에서 Singleton 구현  (0) 2024.10.19
decorator 사용하기  (0) 2024.06.06
8. 파일 읽고 쓰기  (0) 2019.02.21
7. 정규 표현식  (0) 2019.01.09
6. 문자열 다루기  (0) 2019.01.08

+ Recent posts