반응형

java spring 개발시 사용하는 gradle 이란?

 

정의 : 그루비(Groovy)를 기반으로 한 빌드 도구

 

XML 기반으로 빌드 스크립트를 사용하는 MAVEN 과 달리 DSL(Domain Specific Language)를 사용한다.

 

설치 방법 : https://gradle.org/install/

 

Gradle | Installation

Install the Gradle build tool on Linux, macOS or Windows, either manually or using a package manager like SDKMAN! or Homebrew.

gradle.org

Gradle 설치 전 JDK 버전이 8이상 확인!

 

gradle init 으로 샘플 프로젝트 생성

위 명령어 실행하면 해당 폴더에 아래와 같은 파일 생성

각 파일별 용도 기입 예정...

반응형

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

JTable column size 내용길이에 맞춰 조절하기  (0) 2016.01.20
Titleborder 색 변경  (0) 2015.12.27
[팁] JarBundler 이용법.  (0) 2015.12.08
[팁] application bundle 위치  (0) 2015.12.08
JAVA L&F(Look & Feel)  (0) 2015.12.05
반응형

관리자 페이지 또는 필요에 따라 로그인 2차인증이 필요할 경우가 있다.

구글에서 제공하는 TOTP 기반의 google authenticator 앱으로 무료로 사용할 수가 있다.

여기서 TOTP와 2-factor 인증 방법에 대해 이해가 필요하다.

 

TOTP란?

정의 : 시간 기반 일회용 비밀번호(Time-based one-time password) 현재 시간의 고유성의 원천으로 사용하여 일회용 비밀번호를 생성하는 컴퓨터 알고리즘.

알고리즘 : 사용자가 입력한 otp 코드와 로컬에서 유닉스 시간 기반으로 생성한 코드가 일치 여부를 판단.

                  google authenticator 앱에서는 HOTP 알고리즘으로 인증을 진행.

 

2-factor authentication(2FA)

정의 : 이중인증절차라고 하며 로그인을 시도한 주체가 계정의 실제 소유자인지 확인하여 계정 보안을 높여주는 절차

 

QR코드 생성은 아래 url을 QR코드로 변경하여 표시하면 된다.

 

otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example

Label : Example

User : alice@google.com

secret_key : JBSWY3DPEHPK3PXP

 

위 예시에서 secret_key 는 특정 문자열을 Base32 인코딩한 결과만 Google Authenticator에서 인식된다.

 

google authenticator 앱에 QR 코드로 장치를 등록하는데 해당 QR을 생성하는 예시를 들어주는 사이트 공유

https://dan.hersam.com/tools/gen-qr-code.php

 

Generate QR Codes for Google Authenticator

 

dan.hersam.com

위 사이트에서 QR 만드는 예시를 참고하여 앱 또는 웹 어플리케이션에서 QR을 생성하여 보여주고 인증이 완료된 사용자를 저장하고 해당 사용자에 대해서는 이후 로그인 시도 시 google authenticator 인증 코드를 입력 받을 수 있도록 구현.

반응형
반응형

sqlalchemy는 파이썬에서 DB에 접근하기 위한 ORM 라이브러리다.

 

ORM은 Object Relational Mapping의 약어로써 객체(Object)와 관계형 DB(Relational)을 연결(Mapping) 해주는 것을 의미한다.

객체지향언어에서 객체(클래스)에 DB 테이블을 매핑시켜 사용한다고 생각하면 이해가 쉽다.

ORM은 설계에 따라 사용이 용이할 수도 어려워질 수가 있다.

 

* sqlalchemy

사이트 : https://www.sqlalchemy.org/

 

SQLAlchemy - The Database Toolkit for Python

The Python SQL Toolkit and Object Relational Mapper SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL. It provides a full suite of well known enterprise-level persisten

www.sqlalchemy.org

지원하는 Databases : SQLite, Postresql, MySQL, Oracle, MS-SQL, Firebird, Sybase 등..

사용가능한 Python 버전 : 2.5이후 또는 3.x 버전

 

SQLAlchemy를 사용하기 위해 우선적으로 DB Engine을 생성해야 한다

from sqlalchemy import create_engine
#engine 생성
#password 특수문자 포함 시 password에 url 인코딩 필요
engine = create_engine("postgresql://{username}{password}@{host}/{database}")

#password 인코딩 예시
import urllib.parse
print(urllib.parse.quote_plus("kx@jj5/g")) #'kx%40jj5%2Fg' 출력

from sqlalchemy import URL
#URL을 이용한 engine생성
#password에 특수문자가 포함 시 인코딩 하지 않고 사용할 수 있음.
url_object = URL.create(
	drivername="",
    username={username},
    password={password},
    host={host},
    database={database},
    query={"charset":"cp949"}
    )
engine = create_engine(url_object)

위와 같이 생성한다.

 

* 각 DB별 engine 생성 샘플

# mysql default
engine = create_engine("mysql://scott:tiger@localhost/foo")

# mysqlclient (a maintained fork of MySQL-Python)
engine = create_engine("mysql+mysqldb://scott:tiger@localhost/foo")

# PyMySQL
engine = create_engine("mysql+pymysql://scott:tiger@localhost/foo")

#Oracle
engine = create_engine("oracle://scott:tiger@127.0.0.1:1521/sidname")
engine = create_engine("oracle+cx_oracle://scott:tiger@tnsname")

# mssql pyodbc
engine = create_engine("mssql+pyodbc://scott:tiger@mydsn")

# pymssql
engine = create_engine("mssql+pymssql://scott:tiger@hostname:port/dbname")

# sqlite://<nohostname>/<path>
# where <path> is relative:
engine = create_engine("sqlite:///foo.db")

# Unix/Mac - 4 initial slashes in total
engine = create_engine("sqlite:////absolute/path/to/foo.db")

# Windows
engine = create_engine("sqlite:///C:\\path\\to\\foo.db")

# Windows alternative using raw string
engine = create_engine(r"sqlite:///C:\path\to\foo.db")

참고 문서 : https://docs.sqlalchemy.org/en/20/core/engines.html#supported-databases

반응형

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

[PYTHON] 파이썬 함수 매개변수  (0) 2022.08.11
[Python] flask_restful fields  (0) 2021.10.08
Single Linked list 구현  (0) 2018.03.22
창원시 버스 API 사용하기  (1) 2016.02.22
반응형

파이썬에서 사용하는 함수 매개변수 종류에 대해 작성

 

파이썬에서는 아래 5가지 종류의 함수 매개변수를 선언해서 사용할 수 있다.

1. default arguments

2. keyword arguments

3. positional arguments

4. arbitrary positional arguments

5. arbitrary keyword arguments

 

1. default arguments

  • 기본 매개변수는 함수가 정의되는 동안 제공된는 값이다.
  • "=" 기호를 사용해 매개변수의 기본값을 설정한다.
  • 기본 매개변수는 함수 호출 동안 선택적으로 사용된다.
  • 함수 호출 시 기본 매개변수에 값을 제공하면 기본 매개변수에 덮어 씌여진다.
  • 함수는 기본 매개변수를 원하는 만큼 가질 수 있다. (갯수 제한 없음)
  • 기본값 설정이 필수적이지 않다.

예시)

def add(a, b=5, c=10):
	return (a+b+c)

위 예시는 b,c가 기본 매개변수로 설정되어 있는 것을 보여준다.

아래 함수 호출 예시를 참고

print(add(3)) #return 18 a = 3, b = 5, c = 10
print(add(3,4)) #return 17 a = 3, b = 4, c = 10
print(add(2,3,4)) #return 9 a = 2, b = 3, c =4

 

2. Keyword Arguments

  • key = value 형식으로 사용하는 매개변수
  • 함수에 정의된 매개변수 순서를 따르지 않아도 값이 통과된다.
  • 키워드 매개변수는 함수에 정의 된 매개변수랑 일치해야한다.
  • 함수 호출시 사용되는 매개변수 타입 중 하나이다.

예시)

def add(a,b=5,c=10):
    return (a+b+c)

위와 같이 함수를 선언한다.

아래 예시와 같이 함수 호출시 매개변수를 key=value 로 사용하는 것을 keyword arguments 라 한다.

정의된 매개변수 순서를 지키지 않고 매개변수 키 값만 알맞게 설정하여 호출 가능하다.

print (add(b=10,c=15,a=20)) #return 45
print (add(a=10)) #return 25

 

3. Positional Arguments

  • 위치 매개변수 함수 호출 시 매개변수 위치에 값을 대입하여 호출하는 것을 의미한다.

예시)

def add(a,b,c):
    return (a+b+c)
    
print (add(10,20,30)) #return 60
print (add(10,c=30,b=20)) #return 60

위 첫번째 print 문과 같이 매개변수 위치에 값을 설정하여 호출 가능하다.

두번째 print 문처럼 keyword 매개변수와 섞어서 사용이 가능하다.

 

위 세가지 매개변수 사용에 대해 주의할 점!

 

#1. default 매개변수는 non-defualt 매개변수보다 앞에 선언할 수 없다.
def add(a=5,b,c):
    return (a+b+c)
#Output:SyntaxError: non-default argument follows default argument

#2. keyword 매개변수는 positional 매개변수보다 앞에 선언할 수 없다.
def add(a,b,c):
    return (a+b+c)
print (add(a=10,3,4))
#Output:SyntaxError: positional argument follows keyword argument

#3. 선언되지 않은 keyword 매개변수는 사용불가
def add(a,b,c):
    return (a+b+c)
print (add(a=10,b1=5,c=12))
#Output:TypeError: add() got an unexpected keyword argument 'b1'

#4. 중복된 keyword 매개변수 사용 불가
def add(a,b,c):
    return (a+b+c)
print (add(a=10,b=5,b=10,c=12))
#Output:SyntaxError: keyword argument repeated

 

4. arbitrary positional arguments

  • 매개변수 앞에 *를 사용하여 선언한 매개변수
  • 매개변수 선언을 가변적으로 설정할 때 사용한다.
  • 매개변수를 list 타입과 동일하게 사용

예시)

def add(*b):
    result=0
    for i in b:
         result=result+i
    return result

print (add(1,2,3,4,5)) #return 15
print (add(10,20)) #return 30

위 예시처럼 add 함수에 매개변수를 가변적으로 설정하여 호출이 가능하다

 

5. arbitrary keyword arguments

  • 매개변수 앞에 **를 사용하여 선언한 매개변수
  • 4번과 같이 매개변수를 가변적으로 설정할 수 있고 key:value 매개변수를 dictionary 타입과 동일하게 사용

예시)

def fn(**a):
    for i in a.items():
        print (i)
fn(numbers=5,colors="blue",fruits="apple")
'''
return
('numbers', 5)
('colors', 'blue')
('fruits', 'apple')
'''

 

참고 사이트 : https://levelup.gitconnected.com/5-types-of-arguments-in-python-function-definition-e0e2a2cafd29

반응형

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

[Python]sqlalchemy 사용법  (0) 2022.12.07
[Python] flask_restful fields  (0) 2021.10.08
Single Linked list 구현  (0) 2018.03.22
창원시 버스 API 사용하기  (1) 2016.02.22
반응형

Python Flask api 앱을 만드는 도중 marshal_with 와 fields 라이브러를 이용해

output 데이터 타입을 설정할 떄 찾은 팁 공유

 

아래와 같이 사용하면 특정한 타입으로 응답필드 값을 설정하여 사용할 수 있다.

from flask_restful import fields

class MyDateFormat(fields.Raw):
    def format(self, value):
        return value.strftime('%Y-%m-%d')

resource_fields = {
    'id': fields.Integer,
    'date': MyDateFormat
}

참조

https://stackoverflow.com/questions/65982519/custom-date-format-for-flask-restful-fields-datetime-for-marshal-with

 

Custom date format for flask_restful fields.DateTime for marshal_with

I am using flask_restful's fields and marshal_with to serialize my APIs output data. But I am having problems with my date format. I am storing the date as an SQLAlchemy DateTime type, for example,...

stackoverflow.com

https://flask-restplus.readthedocs.io/en/stable/marshalling.html

 

Response marshalling — Flask-RESTPlus 0.13.0 documentation

Response marshalling Flask-RESTPlus provides an easy way to control what data you actually render in your response or expect as in input payload. With the fields module, you can use whatever objects (ORM models/custom classes/etc.) you want in your resourc

flask-restplus.readthedocs.io

 

반응형

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

[Python]sqlalchemy 사용법  (0) 2022.12.07
[PYTHON] 파이썬 함수 매개변수  (0) 2022.08.11
Single Linked list 구현  (0) 2018.03.22
창원시 버스 API 사용하기  (1) 2016.02.22
반응형

Context Switching 이란?

 

 - 병렬처리를 위한 Job Scheduling

 - Running 상태의 Task가 사용하던 Context를 메모리 특정 영역에 저장한 후 새로이 수행 될 Task의 Context를 TCB또     는 Stack에서 CPU의 레지스터 영역으로 복사하여 새로운 Task가 수행되도록 하는 일련의 작업

 - LIFO, FIFO, RR 등..

 - Context는 CPU가 사용하는 레지스터들의 값

 

 

멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)를 교체하는 작업을 Context Switch(Context Switching)라고 한다.

 

 

Context는 무엇인가?

사용자와 다른 사용자, 사용자와 시스템 또는 디바이스간의 상호작용에 영향을 미치는 사람, 장소, 개체등의 현재 상황(상태)을 규정하는 정보들을 말한다.

android나 servlet등에서도 context가 있지만 OS에서 Context는 CPU가 해당 프로세스를 실행하기 위한 해당 프로세스의 정보들이다.

 Context는 프로세스의 PCB(Process Control Block)에 저장된다.

그래서 Context Switching 때 PCB의 정보를 읽어(적재) CPU가 전에 프로세스가 일을 하던거에 이어서 수행이 가능한 것이다.

PCB의 저장정보

- 프로세스 상태 : 생성, 준비, 수행, 대기, 중지

- 프로그램 카운터 : 프로세스가 다음에 실행할 명령어 주소

- 레지스터 : 누산기, 스택, 색인 레지스터

- 프로세스 번호

* 참고로 Context Switching 때 해당 CPU는 아무런 일을 하지 못한다. 따라서 컨텍스트 스위칭이 잦아지면 오히려 오버헤드가 발생해 효율(성능)이 떨어진다.

Context가 뭔지 알았고 멀티프로세싱하기 위해 CPU를 나눠서 사용하기 위해 Context를 교체하는 것이 Context Switching임을 알았다. 그리고 PCB에 Context가 저장됨도 알았다.

남은 것은 인터럽트 요청이 뭐고 어떤 종류가 있는지 + 서브로 우선 순위에 대한 이야기다.

 

 

Context Switching - 인터럽트(Interrupt)

인터럽트는 CPU가 프로그램을 실행하고 있을 때 실행중인 프로그램 밖에서 예외 상황이 발생하여 처리가 필요한 경우 CPU에게 알려 예외 상황을 처리할 수 있도록 하는 것을 말한다.

어떤 인터럽트 요청이 와야 Context Switching이 일어날까?

1. I/O request (입출력 요청할 때)

2. time slice expired (CPU 사용시간이 만료 되었을 때)

3. fork a child (자식 프로세스를 만들 때)

4. wait for an interrupt (인터럽트 처리를 기다릴 때)



출처: https://jeong-pro.tistory.com/93 [기본기를 쌓는 정아마추어 코딩블로그]

 

반응형
반응형

C/C++ 에서 소켓통신을 하기 위해 패킷을 구조체로 정의한다.

일반적으로 아래와 같이 선언하여 사용한다.

struct _Socket
{
    int Size;
    char text[50];
} Socket;

해당 구조체로 패킷을 정의하면 패킷의 크기는 어떻게 될까?

int 자료형은 4바이트, char 자료형은 1바이트지만 배열로 선언하여 50 바이트가 된다.

두 값을 더하면 54가 나와야 하지만 sizeof(Socket); 결과는 56바이트가 된다.

왜 이런 결과가 나오는 것일까?

먼저 정답은 패딩비트에 의해 56바이트가 나오게 된다.

대부분의 컴파일러는 CPU가 접근하기 쉬운 위치에 필드를 배치한다. 그러다보니 중간에 빈 공간이 들어가는데 위 예시에서는 2바이트가 추가로 들어가게 된 것이다.

이렇게 추가된 2바이트를 패딩 비트라고 한다.

32bit CPU는 메모리에서 값을 읽어올 때 한번에 4byte(32bit)를 읽어 오고 64bit CPU는 한번에 8byte(64bit)를 읽어온다

 

그러면 이러한 상황을 방지하기 위한 방법이 뭐가 있는지 찾아보니 아래와 같이 구조체를 선언하면 패딩비트가 생성되지 않는다.

#pragma pack(1)
struct _Socket
{
  int Size;
  char text[50];
} Socket;
#pragma pack(pop)

위와 같이 선언한 구조체의 크기를 출력해보면 sizeof(Socket)의 결과가 54가 나오게 된다.

#pragma pack(1)이 뜻하는 바는 구조체에서 가장 큰 바이트로 변수의 크기가 설정되는데 해당 설정을 1바이트로 변경한다는 뜻이다. #pragma pack(pop)을 통해 원래 정렬된 값(4바이트)으로 돌아가게 된다.

#pragma pack(1)과 #pragma pack(pop) 사이에 선언된 모든 구조체에 해당 설정이 적용 된다.

 

#참고 사이트 : https://pangate.com/19

반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

[C++] 숫자만 입력받기 예제  (0) 2017.04.24
[C++] STL(Standard Template Library)  (0) 2017.04.17
반응형

Python 2.7 Single Linked list 구현


참고자료 : starmooc.kr kaist 문일철 교수 데이터구조 및 분석 인강


class Node:

value = ''

nextnode = ''

binhead = False

bintail = False


def __init__(self, value='', nextnode='', binhead=False, bintail=False):

self.value = value

self.nextnode = nextnode

self.binhead = binhead

self.bintail = bintail

def getValue(self):

return self.value

def setValue(self, value=''):

self.value = value

def getNext(self):

return self.nextnode

def setNext(self, nextnode=''):

self.nextnode = nextnode

def isTail(self):

return self.bintail

def isHead(self):

return self.binhead




class SinglyLinkedlist:

nodehead = ''

nodetail = ''

size = 0


def __init__(self):

self.nodetail = Node(bintail = True)

self.nodehead = Node(binhead = True, nextnode = self.nodetail)

def insertAt(self, objInsert, idxInsert):

nodeNew = Node(value=objInser)

nodePrev = self.get(idxInsert - 1)

nodeNext = nodePrev.getNext()

nodePrev.setNext(nodeNew)

nodeNew.setNext(nodeNext)

self.size = self.size+1

def removeAt(self, idxRemove):

nodePrev = self.get(idxRemove - 1)

nodeRemove = nodePrev.getNext()

nodeNext = nodeRemove.getNext()

nodePrev.setNext(nodeNext)

self.size = self.size - 1

return nodeRemove.getValue()

def get(self, idxRetrieve):

nodeReturn = self.nodeHead

for itr in range(idxRetreve + 1):

nodeReturn = nodeReturn.getNext()

return nodeReturn

def printStatus(self):

nodeCurrent = self.nodehead

while nodeCurrent.getNext().isTail() == False:

nodeCurrent = nodeCurrent.getNext()

print nodeCurrent.getValue(),

print

def getSize(self)

return self.size


반응형

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

[Python]sqlalchemy 사용법  (0) 2022.12.07
[PYTHON] 파이썬 함수 매개변수  (0) 2022.08.11
[Python] flask_restful fields  (0) 2021.10.08
창원시 버스 API 사용하기  (1) 2016.02.22
반응형

//숫자외 입력을 받으면 새로 입력을 받게한다. 숫자 입력받을 시 프로그램 종료.


#include "iostream"

using namespace std;


void main()

{

int num=0;

cout << "숫자를 입력하세요;" << endl;

while (!(cin >> num)) {

cin.clear();

cin.ignore(INT_MAX,'\n');

cout << "잘못된 값을 입력하셨습니다. 숫자만 입력해주세요.\n";

}

}


실행환경 : Visual studio 2017 C++ / Windows 10


반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

패킷과 구조체 그리고 패딩비트  (0) 2019.05.09
[C++] STL(Standard Template Library)  (0) 2017.04.17
반응형

C++에는 표준 템플릿 라이브러리라는 STL이 있다.


STL 구성


Sequence containers: 연속된 자료형


Container adaptors: 자료구조


Associative containers: key:value 형식의 자료형


Unordered associative containers: 순서 없는 컨테이너(자바 hash랑 비슷?)


* 참조 사이트 : http://www.cplusplus.com/reference/stl/

반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

패킷과 구조체 그리고 패딩비트  (0) 2019.05.09
[C++] 숫자만 입력받기 예제  (0) 2017.04.24

+ Recent posts