sanggi-jayg의 등록된 링크

키자드에 등록된 총 211개의 포스트를 확인하실 수 있습니다.

Tistory

[Clean Code] 6-1 객체지향 절차지향

객체와 자료구조 객체 지향적 과 절차 지향적의 차이 절차 지향적인 코드는 기존 자료구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면 객체 지향적인 코드는 변경점이 생기면 기존 함수를 변경해야 하는 부분이 생길 수 있다. 모든 것을 객체 지향적인것 보다는 때로는 단순한 것이 적합한 상황이 있을 수 있다. 절차 지향적 class Squre(object): x: float y: float side: float class Rectangle(object): x: float y: float width: float height: float class Circle(object): x: float y: float radius: float def get_arae(figure: object) -> float: if ..

Tistory

[Clean Code] 6-2 객체지향 절차지향 2

객체와 자료구조 디미터 법칙 모듈은 자신이 조작하는 객체의 속을 몰라야 한다는 법칙이다. 객체는 조회 함수로 내부 구조를 공개한다면 안 된다는 의미 (내부 구조를 노출하는 셈) C 클래스의 f 메소드는 다음과 같은 객체의 메소드만 호출 해야 한다. 클래스 C f가 생성한 객체 f로 넘어온 인수 클래스 C 인스턴스 변수 객체 디미터 법칙을 어긴 예시 같은 객체가 아닌 서로 다른 객체를 가지고 서로 연결해서 작성한 이런 코드를 기차 충돌 이라고 부른다. 일반적으로 조잡하니 지향하는 편이 좋다. outputDir := cTxt.GetOptions().GetScratchDir().GetAbsolutePath() 변경 예시 opts := cTxt.GetOptions(); scratchDir := opts.GetS..

Tistory

[Clean Code] 7-1 예외처리

예외처리 함수 깔끔하게 하기 호출자 코드와 오류 코드 처리 코드를 분리한다. 1안 class DeviceController: def shutdown(self): try: self.try_shutdown() except (DeviceControllerError, DeviceShutdownError) as e: ... logger.error() def try_shutdown(self): device = self.get_handle() device.pause() device.clear_queue() device.close() def get_handle(self, device_id: int): ... raise DeviceControllerError('Invalid device handle') 2안 def ca..

Tistory

[Clean Code] 3-2 Functions

함수 함수는 한 가지만! 문제의 코드다. session_initialize() 를 주목하자. 최초 개발시 로그인시에 암호 체크용으로 개발을 했는데 이후에 다른 곳에서도 암호를 체크가 필요한 경우가 생겼고 똑같이 가져다 썻을 경우 Session이 초기화 되어 문제가 생길수 있다. 문제를 해결하기 위해서는 함수명을 check_password_and_session_init() 등으로 함수기능 명시하는 방법 (그래도 함수가 2가지 역할을 담당하여 문제) 함수의 기능을 두개로 다시 작성을 진행하는 방법이 있다. def check_password(username: str, password: str) -> bool: try: user = User.object.get(username = username) encrypt..

Tistory

[Clean Code] 4-1 주석

주석 우리는 주석을 코드로 의도를 표현 하지 못하여 사용 한다. 그러나 과거의 주석이 미래에 실패를 불러 올 수 있다. 코드는 언제나 변화하고 진화하며 이곳 저곳 옮겨지기도 한다. 주석은 그 코드를 따라가지 못한다. 누군가는 주석을 엄격하게 관리해야 한다고 할 수도 있지만 애초에 주석이 필요하지 않도록 코드를 작성 하는데 에너지를 쏟자. 코드로 주석을 대체하라 변경 전 # 직원에게 복지 혜택을 받을 자격이 있는지 체크 if (employee.flags and HOURLY_FLAG) and employee.age > 65 : do_something() 변경 후 if employee.isEnoughForFullBenefits() : do_something() # 이상적인 주석 public static Sim..

Tistory

[Clean Code] 5-1 형식

형식 소스를 보았을 때 코드가 깔끔하고 일관적이며 꼼꼼하며 질서정연하다고 생각되면 좋겠다. 술 취한 사람이 짜놓은 듯한 코드로 보인다면 코드를 보는 사람은 다른 부분도 그렇다고 생각 할 것이다. 개인적으로 스파게티처럼 작성된 소스는 유지보수할때 나도 스파게티를 만든는 경향이 있는데 비교적 잘 짜여졌다고 생각되는 부분을 고칠때는 나도 조심하여 일관성 있게 코드를 작성 할려고 하는 것 같다.프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다. 팀마다 형식을 맞추고 규칙을 정하며 규칙을 따라야 한다. 필요하다면 형식을 적용하는 도구를 활용해도 된다. jetbranin 제품을 사용한다면 코드 양식을 1명이 수정한 다음 config 파일 공유해도 괜찮지 않을까? 싶다.# 형식을 맞추는 목적 누군가 "돌아가기만 ..

Tistory

[Clean Code] 2-1 Class 와 Method 이름

Class 이름 Class와 Object의 이름은 명사가 적합하다. [Good] Customer, WikiPage, Account, AddressParser [Bad] Manager, Processor, Data, Info Method 이름 Method와 Function의 이름은 동사가 적합하다. [Good] postPayment, deletePage, save javabean 표준에 따라서 Accessor(접근자), Mutator(변경자), Predictate(조건자)는 앞에 get, set, is 를 붙인다. 이름을 혼용하지마라 여러 Class에 add() 함수의 역할과 Paramerter와 Return 이 동일하다면 계속 사용해도 되지만 기존과 다른 성격을 지닌다면 insert() 나 append(..

Tistory

[Clean Code] 2-2 Method

함수는 작게 만들어라 함수는 최대한 작게 만들어라. If문, While문 등 사용시 블록안에는 라인 1개로 처리하도록 하자. 이를 통해서 우리는 1단~2단 수준에 들여쓰기 수준을 유지할 수 있고 함수는 읽기 쉬워지고 이해하기 쉬워진다. def some_method(): ... if is_something: show_something() 함수는 한 역할만 해라 def request_something(): response = requests.post('url') return response def handle_response(response: Response): if response.status_code == 200: do_success() else: do_failure()

Tistory

[Clean Code] 3-1 Parameter

함수 인수 함수의 이상적인 인수개수는 0개 이다. 다음은 1개(단항) 다음은 2개(이항) 3개(삼항)은 피하는게 좋다. 4개(다항) 이상은 작성하면 안된다. 이유는 개념을 이해하기 어렵게 만든다 Test case 에서도 검증하기 위해서 다양한 인수를 작성하는 것도 어렵다. 운영 개발할때 경우에 따라서 필요한 경우가 있는데 요즘은 IDE 잘 되어 있어서 상관 없지 않을까 싶다. 그래도 줄일수 있다면 줄이자.1개 (단항 함수) 대표적인 단항의 경우는 주로 두가지로 나누어진다. 질문을 던지는 경우 def is_file_exist(filepath:string) -> bool: ... Parameter를 변환하여 결과를 Return 하는 경우 def file_open(filepath:string) -> file:..

Tistory

Git 프로젝트 별로 다른 계정 사용하기

모두 같은 계정 사용 git 을 사용할때 모든 프로젝트가 같은 계정정보를 사용한다면 아래처럼 사용 git config --global user.name "username" git config --global user.email "[email protected]"서로 다른 계정 사용 프로젝트별로 다른 계정을 사용한다면 commit시에 이상한 계정으로 업로드 될수 있음 (예를 들어서 회사에서 이렇게 사용한다면? 개인 Github + 회사 Github Entrerprise or 회사 Gitlab) 변경할 프로젝트 경로에 접속해서 아래처럼 사용 git config --local user.name "username" git config --local user.email "[email protected]"설정 확인 git config --..

Tistory

Promtheus + MySQL Exporter 연동

MySQL Exporter 설치 및 연동 MySQL Exporter 다운로드 # 버전 MySQL >= 5.6. MariaDB >= 10.2 # 유저 없으면 추가, 있으면 접속 useradd -m -s /bin/bash prometheus su - prometheus # 다운로드 wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.13.0/mysqld_exporter-0.13.0.linux-amd64.tar.gz tar zxvf mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz mv mysqld_exporter-0.13.0.linux-amd64/ mysql_exporter exit MySQL 에 권한 추..

Tistory

[Fluentd] MySQL slow log 연동

Fluentd MySQL slow log 연동하기 MySQL slow log MySQL slow log 는 멀티라인입니다. 따라서, conf 를 꿍짞꿍짝 해서 나중에 수정불가한 conf 를 생성 하거나 open soruce 사용해서 연동을 하면 되는데 착하신 분이 미리 mysqlslowquery 라는 것을 만들어 놓아서 이걸로 연동 했습니다. 설치 및 사전 준비 gpasswd mysql -a td-agent apt install -y ruby ruby-dev libc6-dev # 현재 서버에서 사용중인 gem 레포지가 # td-agent-gem 인지 fluentd-gem 인지 gem 인지 먼저 확인하세요 td-agent-gem install fluent-plugin-mysqlslowquery설정 # IN..

Tistory

[Python] Colorful print

Example from colorful_print import color color.black('Print Black') color.red('Print Red') color.green('Print Green') color.yellow('Print Yellow') color.blue('Print Blue') color.magenta('Print Magenta') color.cyan('Print Cyan') color.white('Print White') print() color.red('Print Red') color.green('Print Bold Green', bold = True) color.yellow('Print Bold Italic Yellow', bold = True, italic = True..

Tistory

[Fluentd] Php 연동

PHP 연동 PHP 7 이상 (https://github.com/fluent/fluent-logger-php) composer.json 추가 "fluent/logger": "1.0.*" PHP 7 미만 (https://github.com/DQNEO/php-fluent-simplelogger) 오픈소스 라이브러리 설치 샘플 use Fluent\Logger\FluentLogger; defined('BASEPATH') or exit('No direct script access allowed'); function f_log(string $label, array $data) { try { # TODO : Constants setting $logger = new FluentLogger('192.168.10.7', ..

Tistory

[Ubuntu 20.04] MySQL 5.6.xx 설치

삭제 cd /home rm /var/lib/mysql/ -R rm /etc/mysql/ -R apt-get autoremove -y mysql* --purge apt-get remove -y apparmorMySQL 설치 apt install -y libaio1 libncurses5 groupadd mysql useradd -g mysql mysql wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz tar -xvf mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz mv mysql-5.6.51-linux-glibc2.12-x86_64 /usr/local/mysql..

Tistory

Prometheus + Node Exporter + Grafana 연동

프로메테우스 설치 https://prometheus.io/ # 유저 추가 useradd -m -s /bin/bash prometheus su - prometheus # 다운로드 cd /home/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.28.0/prometheus-2.28.0.linux-amd64.tar.gz tar -xzvf prometheus-2.28.0.linux-amd64.tar.gz # 폴더명 변경 로그아웃 mv prometheus-2.28.0.linux-amd64/ prometheus exit# 시스템 서비스 등록 vi /etc/systemd/system/prometheus.service [Unit..

Tistory

[Fluentd] 7. Nginx 연동

Nginx 로그 연동 개요 리눅스 서버에서 nginx의 access log 와 error log 를 수집하려고 한다. 우선, Nginx 는 날짜별로 파일 로그를 생성하고 날짜가 지나면 압축시켜 버린다. 그렇다면 Input 시에는 현재 작성하고 있는 파일에 접근해서 데이터를 수집해야 하기때문에 Input 플러그인은 tail 을 사용할 것이고 tail plugin은 access.log, error.log 를 대상으로 수집을 진행 할것이다. 또, Nginx 폴더에 그룹 권한이 admin으로 되어 있다. fluentd 를 adm 그룹으로 추가해주자. # CentOS 7 $ gpasswd adm -a td-agent 연동 @type tail @label @NGINX_LOG @id NGINX_ACCESS_LOG t..

Tistory

[Fluentd] 8. Prometheus 연동

Prometheus 연동 https://github.com/fluent/fluent-plugin-prometheus Prometheus 플러그인은 총 6개를 제공 연동전 설치 CentOS 라 td-agent $ td-agent-gem install fluent-plugin-prometheus 샘플 input plugin 은 promethues 사용해서 server_ip:24231/metrics 를 리스닝 상태로 두고 output plugin은 prometheus_output_monitor 사용해서 10 초마다 promethues 에서 pull 해가도록 한다. @type prometheus bind 0.0.0.0 port 24231 metrics_path /metrics @type prometheus_ou..

Tistory

[Fluentd] Python 연동

테스트 환경 : python3.7 라이브러리 설치 $ pip install fluent-logger 샘플 소스 def log(label: str, data: dict): try: from fluent import sender, event except ImportError: raise ImportError('Install fluent-logger. pip install fluent-logger') try: # TODO : Constants setting sender.setup(tag = 'apps', host = 'localhost', port = 24232) event.Event(label, data) except Exception as e: # TODO : 에..

Tistory

[Fluentd] 4. Input plugin

Input Plugin https://docs.fluentd.org/input tail tail 은 꼬리로, 텍스트 파일의 꼬리를 쫓는다. 리눅스 커맨드 tail 과 비슷하다. 아래는 Nginx access log tail 샘플 @type tail @label @NGINX_LOG @id NGINX_ACCESS_LOG tag nginx.access path /var/log/nginx/access.log pos_file /var/log/td-agent/nginx-access.log.pos @type nginx @log_level debug forward forward 는 포트 열고 통신 대기한다고 생각하면 됨 fluentd -> fluentd fluentd -> prometheus @type forward ..

Tistory

[Fluentd] 5. Output plugin

Output Plugin https://docs.fluentd.org/output file file 은 이름처럼 데이터를 파일로 생성 @type file path /var/log/fluent/myapp compress gzip timekey 1d timekey_use_utc true timekey_wait 10m forward output 에서 forward 는 local fluentd 데이터를 external fluentd 로 전송해 줌 아래 보면 myserver1과 myserver2 로 local event data를 전송해주고 운영시에 장애가 발생해도 문제 없이 운영이 가능 하도록 2개의 서버로 데이터를 보내는 것 유추 쌉가능 @type forward send_timeout 60s recover_w..

Tistory

[Fluentd] 6. 서버간 연동

서버간 연동 aggregator 서버 @type forward @id input_forward port 24232 bind 0.0.0.0 @type stdout @id output_nginx @log_level debug forwarder 서버 @type tail @label @NGINX_LOG @id NGINX_ACCESS_LOG tag nginx.access path /var/log/nginx/access.log pos_file /var/log/td-agent/nginx-access.log.pos @type nginx @type tail @label @NGINX_LOG @id NGINX_ERROR_LOG tag nginx.error path /var/log/nginx/error.log pos_file..

Tistory

[Fluentd] 1. 설치

Before Installation Increase the Maximum Number of File Descriptors # 확인 $ ulimit -n 65535 # 서버마다 다른지 모르겠지만, CentOS는 1024가 default # 아래 파일 내용 추가 $ vi /etc/security/limits.conf root soft nofile 65536 root hard nofile 65536 * soft nofile 65536 * hard nofile 65536 systemd 서비스 사용중인 os는 'LimitNOFILE=65536' 추가, 이외 os 는 default 로 set 되어 있음 Optimize the Network Kernel Parameters $ vi /etc/sysctl.conf ne..

Tistory

[Fluentd] 2. 설정 개요

설정 How Does Fluentd Works 우선 Fluentd 에서 모듈별로 어떻게 작동하는지 순서를 봐보자. 그렇다고 한다. Component Role Input Input 은 로그를 수집하는 Plugin. Input 플러그인은 외부에서 event log 를 pull 후 fluentd 로 전송 이외에도 착하고 똑똑한 애들이 미리 개발 해놓은 Extension Plugin 설치를 통해 사용할 수 있음. Parser (option) Parser 는 Input 으로 읽은 데이터의 포맷이 fluentd에서 지원하지 않는 경우에 파싱을 위해 선택적으로 사용. Filter (option) Filter 는 Output 으로 보내기 전에 뭔가를 한다. 필터링 데이터 필드 추가, 삭제, 마스킹 로그 데이터에서 라벨..

Tistory

[Fluentd] 3. 설정 파라미터

설정 Common Parameter @type type 은 plugin 의 이름? 을 지정 @type my_plugin_type @type my_filter @id id 는 설정의 unique 값으로, buffer, storage, logging 등에서 사용 @type file @id service_www_accesslog path /path/to/my/access.log # ... @log_level log_level 은 log의 level 을 지정으로 system 선언에서 전체 log_level(default:info) 를 지정할 수도 있고, 특정 플러그인의 log level을 선언할 수도 있다. log_level info # ... @log_level debug # shows debug log on..

Tistory

Git Branch 사용법

Git Branch 사용법 Jetbrain IDE를 사용합니다 1. branch 확인하기 git branch 현재 master branch 만 존재, *는 현재 활성화 branch 표시 git branch -r 원격 저장소 branch 확인 2. branch 생성 및 이동 첫번째 방법 git branch feature/#1 git branch git checkout feature/#1 두번째 방법 git checkout -b feature/#1 3. branch 삭제 git branch -d feature/#1 4. branch Github 원격 저장소 push git push --set-upstream origin feature/#1 혹은 git push -u origin feature/#1 로컬에만 ..

Tistory

Git Branch 를 통한 Gitflow

참고 : gmlwjd9405.github.io/2018/05/11/types-of-git-branch.html

Tistory

[CentOS 7] Prometheus + Grafana 설치

CentOS 7 에 Prometheus + Grafana 설치 메뉴얼 프로메테우스 설치 https://prometheus.io/ # 유저 추가 useradd -m -s /bin/bash prometheus su - prometheus # 다운로드 cd /home/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.21.0/prometheus-2.21.0.linux-amd64.tar.gz tar -xzvf prometheus-2.21.0.linux-amd64.tar.gz # 폴더명 변경 로그아웃 mv prometheus-2.21.0.linux-amd64/ prometheus exit # 시스템 서비스 등록 vi /etc..

Tistory

[CentOS] CPU, Memory 사용량 로그

CentOS CPU, Memory 사용량 로그 확인하기 #설치 yum insatll sysstat # 크론탭 확인 cat /etc/cron.d/sysstat CPU 사용률 # CPU 사용률(오늘) sar # CPU 사용률(날짜별) sar -f /var/log/sa/sa날짜 메모리 사용률 # 메모리 사용률 (오늘) sar -r # 메모리 사용률 (날짜별) sar -r -f /var/log/sa/sa날짜

Tistory

[Jenkins] 젠킨스란 무엇인가

젠킨스란 무엇인가 젠킨스는 개발시에 지속적인 통합 서비스를 제공해주는 오픈소스 툴이며, 이를 CI(Continous Integration) 이라고 표현 한다. 젠킨스 사이트 접속을 하면, 젠킨스는 프로젝트를 빌드, 배포, 자동화를 해주며 다양한 플러그인들이 있다고 한다. 젠킨스는 Java로 개발되어 있고 WAR를 단독 혹은 톰캣 등의 서버로 실행을 할 수 있으며, Windows, Linux, macOS 등 크로스 플랫폼을 지원한다. 젠킨스를 실행하면 웹 화면을 생성하며 REST API 호출로 구동 된다. CI (Continous Integration) 란? Build, Test를 실시하는 프로세스로 이러한 통합 프로세스를 계속 실시해 주는 것을 CI 라고 한다. 즉, 통합을 지속적으로 수행하는 것. CD..

Tistory

[Jenkins] 젠킨스 Dockerfile 설치

[Jenkins] 젠킨스 Dockerfile 설치 cd /home/ vi Dockerfile docker build -t demo_jenkins . docker image ls docker run -it -p 8080:8080 --name demo_jenkins docker.io/jenkins/jenkins docker run -d -p 8080:8080 --name demo_jenkins docker.io/jenkins/jenkins Dockerfile FROM centos:7 RUN echo -e '[AdoptOpenJDK]\n\ name=AdoptOpenJDK\n\ baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/centos/$releasever/$b..

Tistory

Gitlab 에서 Github 로 저장소 log 유지하며 옮기기

윈도우 기준입니다. gitcmd 터미널 실행을 해서 아래와 같이 실행 git clone --bare http://gitlab.kaffalab.com/project.git cd project git push --mirror https://github.nhnent.com/godo/project.git

Tistory

프로그래머스 - 나머지 한 점

문제 설명 직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하려고 합니다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때, 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성해주세요. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다. 제한사항 v는 세 점의 좌표가 들어있는 2차원 배열입니다. v의 각 원소는 점의 좌표를 나타내며, 좌표는 [x축 좌표, y축 좌표] 순으로 주어집니다. 좌표값은 1 이상 10억 이하의 자연수입니다. 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 [x축 좌표, y축 좌표] 순으로 담아 return 해주세요..

Tistory

프로그래머스 - 가장 큰 정사각형 찾기

문제 설명 1와 0로 채워진 표(board)가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요. (단, 정사각형이란 축에 평행한 정사각형을 말합니다.) 예를 들어 1234 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 가 있다면 가장 큰 정사각형은 1234 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다. 제한사항 표(board)는 2차원 배열로 주어집니다. 표(board)의 행(row)의 크기 : 1,000 이하의 자연수 표(board)의 열(column)의 크기 : 1,000 이하의 자연수 표(boar..

Tistory

Cent OS 6 버전 yum 에러

CentOS 6버전이 지원이 끝남에 따라서 yum 명령어 실행시 에러가 발생 아래와 같이 명령어 실행 $ echo "https://vault.centos.org/6.10/os/x86_64/" > /var/cache/yum/x86_64/6/base/mirrorlist.txt $ echo "http://vault.centos.org/6.10/extras/x86_64/" > /var/cache/yum/x86_64/6/extras/mirrorlist.txt $ echo "http://vault.centos.org/6.10/updates/x86_64/" > /var/cache/yum/x86_64/6/updates/mirrorlist.txt

Tistory

소프트웨어 개발원칙 YAGNI

소프트웨어 개발원칙 YAGNI "You ain't gonna need it" 에서 따온 약자로 정말 필요할때까지 만들지 말라는 의미를 가진다. 언제 사용될지도 모르는 것에대해서 작성하는 것은 현재 상황에 대해서 더욱 복잡하게 만들며 시간을 소요하게 하고 이후 변경 시 2차적으로 시간을 잡아먹게 된다. 따라서, 현재 사용되지 않을 것에 대해서 먼저 작성하는 것을 지양하라는 의미.

Tistory

CentOS pyenv 설치

> yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel git > yum install gcc openssl-devel libffi-devel bzip2-devel wget > curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash > vi /root/.bash_profile export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" > source /root/.bash_profile 설치 가능 버전 상위 리스트 >..

Tistory

프로그래머스 - 순열 검사

문제 설명 길이가 n인 배열에 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는지를 확인하려고 합니다. 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는 경우 true를, 아닌 경우 false를 반환하도록 함수 solution을 완성해주세요. 제한사항 배열의 길이는 10만 이하입니다. 배열의 원소는 0 이상 10만 이하인 정수입니다. 입출력 예 arrresult [4, 1, 3, 2] true [4, 1, 3] false 입출력 예 설명 입출력 예 #1 입력이 [4, 1, 3, 2]가 주어진 경우, 배열의 길이가 4이므로 배열에는 1부터 4까지 숫자가 모두 들어 있어야 합니다. [4, 1, 3, 2]에는 1부터 4까지의 숫자가 모두 들어 있으므로 true를 반환하면 됩니다. 입출력 예 #2 [4, 1..

Tistory

객체지향 설계 5대 원리 SOLID - IRP

I - ISP - Interface Segregation Principle (인터페이스 분리 원칙) 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다. 클래스에서 사용하지 않는 메서드는 분리해야 한다. 차량 소유주 정보는 변경점이 없어 그대로 구현 class CarOwnerInfo: def __init__(self, car_number, owner_name): self.__car_number = car_number self.__owner_name = owner_name @property def car_number(self): return self.__car_number @car_number.setter def car_number(self, value): self.__car_numb..

Tistory

소프트웨어 개발 원칙 DRY

소프트웨어 개발 원칙 DRY - Don't Repeat Yourself 똑같은 일을 두번하지 말아라! 중복 되는 내용의 함수, 모듈 등에 대해서 리팩토링을 해라. 한 프로젝트내에서 개발 과정이든 개발 완료 후 유지보수 과정에서든 언제든지 같은 역할을 수행하는 중복된 내용의 소스코드가 작성 될 수 있다. 이렇게 중복된 코드들은 시간이 지남에 따라서 프로젝트가 덩치가 커지면서 오버헤드를 발생시키고 쓸데없는 시간과 노력이 소요되게 하며 버그가 발견되었을 경우 여러군데를 고쳐야 하는 등의 단점이 발생한다.

Tistory

소프트웨어 개발원칙 KISS

소프트웨어 개발원칙 KISS “Keep it small and simple.”, “Keep it short and simple.”, 또는 “Keep it simple, stupid.” 에서 따온 약어이다. 소스코드에 대해서 최대한 간단 명료하게 작성하라는 의미로 불필요하게 장황하고 복잡하게 작성하는 것을 지양하며 경계하라는 원칙. 단순할수록 이해하기 쉽고 버그가 발생하기 어렵다.

Tistory

객체지향 설계 5대 원리 SOLID

객체지향 설계 5대 원리 SOLID 컴퓨터 프로그래밍에서 SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것이다. 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다. SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다. 이 원칙들은 애자일 소프트웨어 개발과 적응적 소프트웨어 개발의 전반적 전략의 일부다. S - SRP - Single Responsiblity Principle (단일 책임 원칙) 한 클래스는 하..

Tistory

객체지향 설계 5대 원리 SOLID - SRP

S - SRP - Single Responsiblity Principle (단일 책임 원칙) 한 클래스는 하나의 책임만 가져야 한다. 다음과 이미지처럼 트럭 정보를 관리하는 클래스가 있다고 가정 class Truck: id_number = None car_number = None owner_name = None def __init__(self, id_number, car_number, owner_name): self.id_number = id_number self.car_number = car_number self.owner_name = owner_name 트럭의 차대번호는 생산에 따라 부여된 고유 번호로 변경되지 않지만, 소유주나 차량등록번호는 변경 될 가능성이 있는 정보이다. 따라서 TruckOwne..

Tistory

객체지향 설계 5대 원리 SOLID - OCP

O - OCP - Open/Closed Principle (개방/폐쇄 원칙) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. Truck 외에 차량 종류가 추가 될 경우 공통 속성을 가지는 Car Interface로 추상화를 합니다. class Car: id_number = None owner_info = None detail_info = None def __init__(self, id_number, owner_info: CarOwnerInfo, detail_info: CarDetailInfo): self.id_number = id_number self.owner_info = owner_info self.detail_info = detail_info class Suv(Car): pass..

Tistory

[Python] builtin dir() 함수

[Python] builtin dir() 함수 dir()함수는 입력된 parameter 의 attributes를 list 형태로 return 해주는 함수. def dir(p_object=None): # real signature unknown; restored from __doc__ dir([object]) -> list of strings If called without an argument, return the names in the current scope. Else, return an alphabetized list of names comprising (some of) the attributes of the given object, and of attributes reachable from it...

Tistory

[Ubuntu 18] docker 를 이용한 MariaDB Sharding (샤딩)

MariaDB Sharding using Docker Below versions. Ubuntu 18.04 Docker 19.03 MariaDB 10.4 Installation Install the server and apt update. $ sudo apt update $ sudo apt-get update $ sudo apt-get upgrade Install the dependencies. $ sudo apt install apt-transport-https ca-certificates curl software-properties-common Add docker repository on apt $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | ..

Tistory

캐시 (Cache)

캐시 (Cache) 캐시란 컴퓨팅에서 캐시는 일반적으로 일시적인 특징이 있는 데이터 하위 집합을 저장하는 고속 데이터 스토리지 계층입니다. 따라서 이후에 해당 데이터에 대한 요청이 있을 경우 데이터의 기본 스토리지 위치에 액세스할 때보다 더 빠르게 요청을 처리할 수 있습니다. 캐싱을 사용하면 이전에 검색하거나 계산한 데이터를 효율적으로 재사용할 수 있습니다. 캐시의 작동방법 캐시의 데이터는 일반적으로 RAM(Random Access Memory)과 같이 빠르게 액세스할 수 있는 하드웨어에 저장되며, 소프트웨어 구성 요소와 함께 사용될 수도 있습니다. 캐시의 주요 목적은 더 느린 기본 스토리지 계층에 액세스해야 하는 필요를 줄임으로써 데이터 검색 성능을 향상하는 것입니다. 속도를 위해 용량을 절충하는 캐시..

Tistory

HTTP Request Method (HTTP 요청 방법)

HTTP Request Method (HTTP 요청 방법) HTTP 는 GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH Reqeust Method 가 있으며, 상황별 알맞게 사용을 권장한다. GET The GET method requests a representation of the specified resource. Requests using GET should only retrieve data and should have no other effect. (This is also true of some other HTTP methods.)[1] The W3C has published guidance principles on this distin..

Tistory

HTTP Response Status Code (HTTP 응답 상태 코드)

HTTP Response Status Code (HTTP 응답 상태 코드) Status Code 란? HTTP response is called the status line and includes a numeric status code (such as "404") and a textual reason phrase (such as "Not Found"). The way the user agent handles the response depends primarily on the code, and secondarily on the other response header fields. Custom status codes can be used, for if the user agent encounters a cod..

Tistory

브라우저 동작 원리

브라우저 동작 원리 브라우저의 주요 기능 브라우저의 주요 기능은 사용자가 선택한 자원을 서버에 요청하고 브라우저에 표시하는 것이다. 자원은 보통 HTML 문서지만 PDF나 이미지 또는 다른 형태일 수 있다. 자원의 주소는 URI(Uniform Resource Identifier)에 의해 정해진다. 브라우저의 기본 구조 브라우저의 주요 구성 요소는 다음과 같다. 사용자 인터페이스 - 주소 표시줄, 이전/다음 버튼, 북마크 메뉴 등. 요청한 페이지를 보여주는 창을 제외한 나머지 모든 부분이다. 브라우저 엔진 - 사용자 인터페이스와 렌더링 엔진 사이의 동작을 제어. 렌더링 엔진 - 요청한 콘텐츠를 표시. 예를 들어 HTML을 요청하면 HTML과 CSS를 파싱하여 화면에 표시함. 통신 - HTTP 요청과 같은 ..

Tistory

DNS(Domain Name System) 작동원리

DNS(Domain Name System) DNS(Domain Name System) 란? 도메인 네임 시스템 (Domain Name System, DNS) 은 호스트의 도메인네임 (www.example.com)을 네트워크주소(192.168.1.0)로 변환하거나, 그 반대의 역학을 수행하는 시스템이다. 인터넷의 DNS 시스템은 이름과 숫자 간의 매핑을 관리하여 마치 전화번호부와 같은 기능 DNS 작동원리 위의 그림과 같이 PC 브라우저에서 www.naver.com 을 입력한다. 그러면 PC는 미리 설정되어 있는 DNS (단말에 설정되어 있는 이 DNS를 Local DNS라 부름, 위에서는 203.248.252.2) 에게 "www.naver.com 이라는 hostname" 에 대한 IP 주소를 요청한다. ..

Tistory

[Python 오픈소스] Diagrams

Diagrams 라는 Python Github 오픈소스 라이브러리 이며, 이 라이브러리는 소스 작성을 통해서 그림을 그려주는 것을 정말로 간단하게 해준다. Github 주소 : github.com/mingrammer/diagrams mingrammer/diagrams :art: Diagram as Code for prototyping cloud system architectures - mingrammer/diagrams github.com Docs 주소 : diagrams.mingrammer.com/docs/guides/diagram Diagrams · Diagram as Code Diagram as Code diagrams.mingrammer.com 이하 샘플로 작성한 코드. from diagrams ..

Tistory

2020년 백엔드(Back-end) 개발자 로드맵

2020년 백엔드(Back-end) 개발자 로드맵

Tistory

HTTP (HyperText Transfer Protocol) 란?

HTTP (HyperText Transfer Protocol) 란? HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다. W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다 예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다. 이 정보가 모니터와 같은 출력 장치를 통해 사용자에게 나타나는 것이다. 추가로, HTTP는 여러가지 버전이 있다. HTTP의 버전은 이후 알아보기로 한다. 클라이언트 요청 ..

Tistory

MariaDB sharding using docker

MariaDB sharding using docker (도커를 이용한 마리아DB 세팅) https://github.com/sanggi-wjg/docker_mariadb_sharding sanggi-wjg/docker_mariadb_sharding Contribute to sanggi-wjg/docker_mariadb_sharding development by creating an account on GitHub. github.com

Tistory

[Python] builtin abs() 함수

abs(x) 함수는 입력 받은 값의 절대값을 return 해주는 함수이다. 정의 def abs(*args, **kwargs): # real signature unknown Return the absolute value of the argument. 실행결과 sample = [ 10, - 10, 10.5, - 10.5, 0, 0.0, ] for s in sample: print('{} => {}'.format(s, abs(s))) """ 10 => 10 -10 => 10 10.5 => 10.5 -10.5 => 10.5 0 => 0 0.0 => 0.0 """ 이런식으로도 사용이 가능하다. from operator import __abs__ __abs__(10) 구현단 PyObject * PyNumber_Ab..

Tistory

[Python] builtin all() 함수

정의 def all(*args, **kwargs): # real signature unknown """ Return True if bool(x) is True for all values x in the iterable. If the iterable is empty, return True. """ pass all() 함수는 iterable 안의 값이 모두 참이거나 empty 라면 return True. 그렇지 않다면 return False 를 한다. 실행결과 sample = [ [], [0], ['0'], [1], ['1'], [0, 1, 2], [1, 2, 3], [-0], [-1], [True], [False], ] for s in sample: print(s, '=>', all(s)) """ [] =..

Tistory

[Clean Code] 0. 앞 부분...

5S 철학... 1. 정리 또는 조직화(정렬) : 적절한 명명법 방법 등을 통해 무엇이 어디에 있는지 알아야 한다. 2. 정돈 또는 체계화 : 코드는 누구나 예상하는 위치에 있어야 한다. 그렇지 않다면 위치 정돈을 하여라. 3. 청소 또는 정리 : 소스에 과거 이력이나 주석으로 처리한 코드 등은 제거하기 바란다. 4. 청결 또는 표준화 : 프로젝트 내 일관적인 구현 스타일과 기법을 가져라. 5. 규율 또는 생활화 : 관례를 따르고, 변경이 필요하다면 기꺼이 변경 하여라. 맞는 말도 있는 것 같고 아닌 말도 있는 것 같고...

Tistory

통신사별 DNS IP 리스트 (구글, SKT, KT, LG)

통신사별 DNS IP 리스트 (구글, SKT, KT, LG) 구글 (Google Public) 기본 DNS 서버 : 8.8.8.8 보조 DNS 서버 : 8.8.4.4 SKT 기본 DNS 서버 : 219.250.36.130 보조 DNS 서버 : 210.220.163.82 KT 기본 DNS 서버 : 168.126.63.1 보조 DNS 서버 : 168.126.63.2 LG 기본 DNS 서버 : 164.124.101.2 보조 DNS 서버 : 203.248.252.2

Tistory

Django demo project (chatting, monggo db, sample)

Django chatting demo app(장고 이용 채팅 데모) https://github.com/sanggi-wjg/django_chat_demo sanggi-wjg/django_chat_demo Contribute to sanggi-wjg/django_chat_demo development by creating an account on GitHub. github.com Django with MonggoDB (장고와 몽고 DB 사용) https://github.com/sanggi-wjg/django_mongodb sanggi-wjg/django_mongodb django_mongodb. Contribute to sanggi-wjg/django_mongodb development by creating..

Tistory

3. Django 뷰 작성 및 라우팅

polls 디렉토리 생성 > cd /home/django_sample/ > python manage.py startapp polls # 생성된 polls 디렉토리 구조 polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py views.py # polls/views.py from django.http import HttpResponse from django.shortcuts import render # Create your views here. def index(request): return HttpResponse('Hello, World. This Is Polls Index()') def select(request): ..

Tistory

4. Django 모델 및 관리자

모델 클래스 생성 polls/models.py from django.db import models # Create your models here. class Users(models.Model): id = models.IntegerField(primary_key = True, null = False, auto_created = True) name = models.CharField(max_length = 10, null = False, unique = True) regDate = models.DateTimeField(null = False) def __str__(self): return "Name : {name}, RegDate : {regDate}".format(name = self.name, regDat..

Tistory

5. Django - Nginx 연동

참고 : https://victorydntmd.tistory.com/257 Nginx 설치 # Nginx 설치 > vi /etc/yum.repos.d/nginx.repo # Insert this parhase [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 # Firewall 설정 > yum install nginx > firewall-cmd --permanent --zone=public --add-service=http > firewall-cmd --permanent --zone=public --add-service=https > firewall-cmd --reload # N..

Tistory

[리팩토링] 임수변수 내용 직접 삽입

간단한 수식을 대입받는 임시변수를 사용할때는 임시변수 참조 부분을 수식으로 치환 변경 전 double basePrice = anOrder.basePrice(); return (basePrice > 1000); 변경 후 return (anOrder.basePrice() > 10000); 변경 전 double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.5; else return basePrice * 0.9; 변경 후 A if (getBasePrice() > 1000) return getBasePrice() * 0.5; else return getBasePrice() * 0.9; double getBasePric..

Tistory

1. Django 및 기타 설치

Python 3.7 설치 1. 패키지 설치 yum install gcc openssl-devel libffi-devel bzip2-devel wget 2. 해당 버전 다운로드(https://www.python.org/ftp/python/) wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz 3. 압축 해제 tar zxf Python-3.7.4.tgz 4. Configure And Install cd Python-3.7.4 ./configure --enable-optimizations make altinstall 5. 설치 확인 python3.7 -V 그냥 python 명령어로 python3.7 을 실행하고 싶을 때... vi /root/.bash..

Tistory

2. Django 프로젝트 생성

현재 디렉토리에서 django_sample 이라는 디렉토리 를 생성 > django-admin startproject django_sample django_sample 디렉토리에 생성된 파일 및 구조 (https://docs.djangoproject.com/en/2.2/intro/tutorial01/) django_sample / manage.py django_sample/ __init__.py settings.py urls.py wsgi.py MySQL 을 사용할 것이므로 settings.py 소스 수정 과 패키지 설치가 필요하다. # Database # https://docs.djangoproject.com/en/2.2/ref/settings/#databases # DATABASES = { # 'de..

Tistory

리팩토링 - 코드 개선 방법

중복 코드 똑같은 코드 구조가 두 군데 이상 있을 때 그 부분을 하나로 통일하면 개선할 수 있다. 단순한 예는 한 클래스의 두 메소드 안에 같은 코드가 들어 있는 경우다. 이럴 때는 메소드 추출 기법을 적용해서 겹치는 코드를 빼내어 별도의 메소드로 만들고 그 메소드를 두 곳에서 호출 또, 한 클래스의 두 하위 클래스에 같은 코드가 들어 있는 경우가 있다. 메소드 추출 기법을 적용해서 중복을 없앤 후 메소드 상향 기법을 적용한다. 코드가 같지 않고 비슷하다면, 같은 부분과 다른 부분을 분리한 다음 템플릿 메소드 형성 기법을 알고리즘만 다르다면, 알고리즘 전환 기법을 중복코드가 중간에 있다면 주변 메소드 추출 기법을 적용한다. 서로 상관없는 두 클래스 안에 중복 코드가 있다면, 모듈 추출로 제3의 클래스로 ..

Tistory

[리팩토링] 메소드 추출

리팩토링의 주된 작업은 코드를 포장하는 메소드를 적절히 정리하는 것이다. 핵심적인 리팩토링 기법은 코드 뭉치를 별도의 메소드로 빼내는 메소드 추출, 반대로 메소드를 호출 하는 곳에 메소드 삽입 기법이다. 메소드 추출 메소드 추출시에 가장 힘든 작업은 지역변수 처리, 주로 임시변수로 힘든경우가 많음. 1. 임시변수를 메소드 호출로 전환 후 없어도 되는 임시변수 삭제 2. 임시변수가 여러곳에서 사용된다면 임시변수 분리 3. 임시변수가 너무 얽혀 있다면 자료 객체 클래스로 전환해서 사용 void printOwing(double amound) { printBanner(); print("name : " + _name); print("amount : " + amound); } void printOwing(doubl..

Tistory

[리팩토링] 메소드 삽입

호출하는 메소드의 기능이 너무 간단해서 내용이 뻔하다면 메소드 기능을 한개로 병합하고 삭제하자. 변경 전 String getRating() { return (isPassRate())? "Y" : "N"; } boolean isPassRate() { return _score > 5; } 변경 후 String getRating() { return (_score > 5)? "Y" : "N"; }

Tistory

[리팩토링] 매개변수로의 값 대입 제거

Parameter(매개변수)는 Method 호출 시 argument 로 넘어간 변수를 칭한다. 여기서 매개변수로의 값 대입은 Parameter로 받은 변수의 값을 호출한 Method에서 어떠한 값을 대입 하는 경우를 말한다. 전달받은 매개변수에 특정 Object나 Variable등을 참조 대입시에 코드의 명료성과 코드를 보는 이에게 Call by value 인지 Call by reference 인지 혼동을 불러 일으킬수 있다. 따라서, 매개변수로의 값 대입을 코드 작성할 시 지양해야 하며, 발견시에 해당 내용을 수정할 수 있도록 하자. 변경 전 int discount (int inputVal) { if (inputVal > 50) inputVal -= 10; // below code blah blah }..

Tistory

[리팩토링] 메소드를 메소드 객체로 전환

장황한 메소드에서 각 부분을 간결한 메소드로 변경해서 보면 코드가 이해하기 쉬워 진다. ...는데 짧고 간단한 소스예제라 잘 모르겠음 ㅋ 이 방법 길고 복잡한 소스에서는 어떨까? 1. 전환할 메소드의 이름과 같은 새 클래스(Gamma)를 생성 2. 새 클래스에 final 필드로 클래스와 멤버변수를 속성 추가 3. 생성자로 필요 변수들을 받을수 있도록 함 4. 복잡한 계산 로직을 나눔 5. 메소드 객체로 전환할 클래스에서 새로 만든 클래스와 메소드를 호출 변경 전 Class Account { int gamma(int inputVal, int quantity, int yearToDate) { int importantValue_1 = (inputVal*quantity) + getDelta(); int impo..

Tistory

[리팩토링] 객체간 메소드 이동

메소드가 자신이 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 땐 그 메소드가 제일 많이 이용하는 클래스안으로 메소드를 이동하자 클래스에 기능이 너무 많거나 클래스가 다른 클래스와 과하게 연동되어 의존성이 지나칠 때는 메소드를 옮기는 것이 좋다. 옮기면 클래스가 간결해지며, 여러 기능을 더 명확하게 구현할수 있다. 옮기는 것이 판단하기 힘들거나 확신이 서지 않다면, 해당 메소드가 참조된 클래스를 확인해보고 직감에 따라 판단해서 옮겼더라도 나중에 다시 변경하면 된다. 변경전 class Account { private AccountType _accountType; private int _dayOverdrawn; double getOverdraftCharge() { if ( _accountType.is..

Tistory

[리팩토링] 클래스 멤버변수 이동

어떤 멤버변수 필드가 자신이 속한 클래스보다 다른 클래스에서 더 많이 사용 되어질 때 대상 클래스안에 새 필드를 선언하고 그 필드 참조 부분을 새 필드 참조 하도록 수정하자. 시스템이 발전하고 수정되어 앞으로 나아갈수록 새 클래스가 필요해지며 기능이 여기저기서 사용이 많아진다. 따라서 그러한 것들을 여기저기로 옮겨야 하는 상황과 필요가 있다. 지금은 합리적이고 올바르다고 판단해서 설계 및 개발을 했다 해도, 나중에는 그렇지 않을 수 있다. 문제는 그러한 상황에서 아무것도 하지 않는 것이다. 변경전 AccountType 클래스에서 interestRate 필드를 더 많이 사용하는 경우 class Account { private AccountType _accountType; private double _int..

Tistory

Flask Flask-SQLAlchemy

db init_app config class DevConfig(Config): # Dev Config ENV = 'dev' DEBUG = True TESTING = True # Dev Database SQLALCHEMY_TRACK_MODIFICATIONS = True SQLALCHEMY_ECHO = False SQLALCHEMY_RECORD_QUERIES = True SQLALCHEMY_DATABASE_URI = 'mysql://아이디:비밀번호@192.168.1.222:3306/test' # 데이터베이스 Binds SQLALCHEMY_BINDS = { 'test' : 'mysql://아이디:비밀번호@아이피:포트/test', 'EXPORT' : 'mysql://아이디:비밀번호@아이피:포트/EXPORT', ..

Tistory

batch 프로그램으로 host 변경하기

파일 4개를 생성 hosts_normal.txt 파일에는 기본 host 내용을 적고 hosts_test.txt 파일에는 추가할 ip와 domain 내용을 적고 저장한다 ## hosts_normal.bat 파일 내용 @echo off copy /Y C:\Windows\System32\drivers\etc\hosts_normal.txt C:\Windows\System32\drivers\etc\hosts ## hosts_test.bat 파일 내용 @echo off copy /Y C:\Windows\System32\drivers\etc\hosts_test.txt C:\Windows\System32\drivers\etc\hosts

Tistory

[리팩토링] 직관적 임시변수 사용

사용된 수식이 봅잡할때 수식의 결과나 일부분을 직관적 이름의 임시변수에 대입 위에 조건문과 같은 경우에 논리조건문이 복잡해져서 코드를 보는 사람이 한번에 이해 하기 어려울때 사용하지만, 임시변수를 사용하면 메소드가 복잡해진다. 따라서, 더 좋은 방법이 없는지 생각해본 뒤 사용하자. 변경 전 if ( (platform.toUpperCase().indexOf('MAC') > -1) && (browser.toUpperCase.indexOf('IE') > -1) && wasInitialized() && (resize > 0) ) { // code blah blah } 변경 후 boolean isMac = platform.toUpperCase().indexOf('MAC'); boolean isIE = browse..

Tistory

Centos7 ElasticSearch 설치

Java 버전 확인 > java -version 없으면?? > yum install java 1.8 버전 이상인지 확인하자 elasticserach 7 버전 다운받자 > cd /home > wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-x86_64.rpm > rpm --install elasticsearch-7.3.0-x86_64.rpm /etc/elasticsearch.yml 수정 # Path to directory where to store the data (separate multiple locations by comma): # #path.data: /var/lib/elasticsearch path.data..

Tistory

Flask Request Handler, Error Handler

Request Handler """ before_first_request : 웹 어플리케이션 기동 이후 가장 처음에 들어오는 HTTP 요청에서만 실행 before_request : 매 요청시 실행 after_request : 요청이 끝나 브라우저에 응답하기 전에 실행 teardown_request : 요청의 결과가 브라우저에 응답한 다음 실행 teardown_appcontext : HTTP 요청이 완료 되면 실행 되며, 애플리케이션 컨텍스트 내에서 실행 """ # 웹 브라우저로부터 HTTP 요청이 들어올 때마다 호출되는 메소드 @app.before_request def before_request(): g.temp = 'before_request' # print(getattr(g, 'temp', None)..

Tistory

Centos Laravel 설치

PHP # php 버전 확인 php -v # php 7버전대가 아니라면 삭제 yum remove php-* yum remove php-common mod_php php-cli # php 설치 yum install php71w yum install php71w-cli php71w-common php71w-dba php71w-devel php71w-fpm php71w-gd php71w-imap yum install php71w-ldap php71w-mbstring php71w-mcrypt php71w-mysqlnd php71w-odbc php71w-opcache yum install php71w-pdo php71w-pdo_dblib php71w-pear php71w-pecl-imagick php71w-pec..

Tistory

개발에 있어서...

개발에 있어서 . 리펙토링의 개념을 제대로 알고 있는가 . 상황에 맞는 적절한 디자인 패턴을 적용할 수 있는가 . 프로그램 버전과 문서화를 얼마나 꼼꼼히 하는가 . 최신 기술에 관심이 있는 사람인가, . 팀의 업무 문화와 수준을 올려줄 수 있다는 믿음을 주는 사람인가, . 팀 작업에 중점을 두는가, 본인에게 익숙한 것에 중점을 두는가, 개발 전 . 툴 활용 능력이 아예 없는 사람은 아닌가? . 자기 생각을 먼저 정리하고 문서화 하는가, . 다른 사람과의 대화를 통해 목적을 뚜렷이 하는가, 개발 중 . 사용하는 라이브러리나 프레임워크에 대한 지식이 있는가, . 설계의 간소화를 위해 노력하는가, 그리고 구현하는가, . 최신 기술을 얼마나 효율적으로 적용해 프로그램의 질을 향상하는가, . 툴이 알려준 경고들에..

Tistory

Centos7 Nginx, PHP, MySQL Codeigniter 프로젝트 세팅

세팅 전 > yum install unzip net-tools wget > yum install openssl openssl-devel curl libcurl libcurl-devel > mkdir /home/mysql Nginx # Nginx 설치 > vi /etc/yum.repos.d/nginx.repo # Insert this parhase [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 # Firewall 설정 > yum install nginx > firewall-cmd --permanent --zone=public --add-service=http > firewall..

Tistory

Centos7 + Lucene Solr 8.2 설치 및 실행

Java 버전 확인 > java -version 없으면?? > yum install java 1.8 버전 이상인지 확인하자 다운로드 > wget https://archive.apache.org/dist/lucene/solr/8.2.0/solr-8.2.0.tgz > tar -zxvf solr-8.2.0.tgz > useradd solr -p solr > chown solr:solr -R /home/solr-8.2.0 포트 > firewall-cmd --permanent --zone=public --add-port=8983/tcp (firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=192.168.1.58 port port=..

Tistory

GitLab - SVN 마이그레이션 및 Clone

참고 http://blog.sz21c.com/569 마이그레이션 1. java -jar svn-migration-scripts.jar authors svn://192.168.1.107/wms_kr02 > authors.txt 실행 후 authors.txt에 메일을 알맞게 변경한다. 2. git svn clone --authors-file=authors.txt --no-metadata svn://192.168.1.107/wms_kr02 3. SourceTree에서 해당 폴더 Open 후, 저장소 설정에 GitLab 주소와 아이디 정보 저장한다. 4. 소스트리 해당 저장소 패치를 받는다. 5. Push를 진행하는데, Branch에 주의해서 강제푸쉬+모든 태그에 대해서 푸쉬를 진행한다. GitLab 프로젝트에..

Tistory

설치 에러 발생시 대처

Apache apr설치시 libtoolT No such file 에러시 # cp -arp libtool libtoolT 다시 ./configure 명령어 실행 PHP off_t undefined 에러시 --enable-zip 제거 Cannot find libmysqlclient_r 에러시 # cd /usr/local/mysql # ln -s ./lib ./lib64clea make:***[sapi/cli/php] 오류 1 # vi Makefile EXTRA_LIBS= -liconv 추가 # make 그래도 에러?? ㅠㅠ libiconv 경로 확인 후 --with-iconv-dir=경로 SVN svn 클론 에러 - vi ~/.subversion/servers 그런후 [global] 항목에 다음의 내용을 삽..

Tistory

CentOS 7 / 고정 IP 설정하는 방법

CentOS 7 / 고정 IP 설정하는 방법 CentOS 7을 설치할 때 네트워크를 설정할 수 있습니다. GUI 환경이므로 네트워크 설정을 알고 있다면 쉽게 고정 IP로 설정할 수 있습니다. 만약 DHCP로 설치했다면 다음과 같은 방법으로 고정 IP 설정을 할 수 있습니다. 네트워크 설정 파일 열기 네트워크 설정 파일은 /etc/sysconfig/network-scripts/ifcfg-enp0s3입니다.(파일 이름은 다를 수도 있습니다.) 설정 파일을 텍스트 에디터로 엽니다. TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="dhcp" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6..

Tistory

fail2ban

https://www.evoluso.com/how-to-protect-ssh-with-fail2ban-on-centos-6/ https://www.lesstif.com/pages/viewpage.action?pageId=43843899 [명령어] service fail2ban start / stop fail2ban-client status sshd fail2ban-client status mysqld-auth whois 패키지 쓸라면?? -> yum install jwhois [DEFAULT] ignoreip = 127.0.0.1/8 192.168.0.1/255 bantime = 7200 findtime = 600 maxretry = 3 destemail = sender = root@API-WH mta ..

Tistory

Centos 7 Flask 설치

1. 패키지 설치 yum install gcc openssl-devel libffi-devel bzip2-devel 2. 해당 버전 다운로드(https://www.python.org/ftp/python/) wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz 3. 압축 해제 tar zxf Python-3.7.4.tgz 4. Configure And Install cd Python-3.7.4 ./configure --enable-optimaizations make altinstall 5. 설치 확인 python3.7 -V 그냥 python 명령어로 python3.7 을 실행하고 싶을 때... vi /root/.bashrc 아래와 같이 alias py..

Tistory

MySQL Replication 연결

# Master mysql > show master status; ex ) +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000010 | 6696003 | | | | +------------------+----------+--------------+------------------+--------..

Tistory

넷기어 VPN - L2TP 설정

1. First, create a mode config profile. Go to VPN > Mode Config > Add. Note: The IP address information used in this mode config is the sample LAN network of a client (192.168.0.x). The First Pool should be any network OTHER than the actual network being used (I used 192.168.10.x). 2. Then, create the IKE Policy manually. Go to VPN > IPSec VPN > IKE Policy > Add. 3. Once done, create an IPSEC us..

Tistory

MySQL 프로시저 디버그

CREATE DEFINER=`jay_g`@`192.168.1.88` PROCEDURE `debug_msg`(_type VARCHAR(100) ,msg VARCHAR(255)) BEGIN SELECT concat("** DEBUG ** ", _type ," : ", msg) AS 'DEBUG'; END

Tistory

MySQL innodb 버퍼 할당 에러

vi /ect/mysql/my.cnf # innodb 설정 값 중 메모리량을 적절하게 변경 innodb_buffer_pool_size = 5120M innodb_data_file_path = ibdata1:1000M:autoextend 2018-07-13 14:00:43 21419 [Note] InnoDB: Initializing buffer pool, size = 5.0G InnoDB: mmap(686817280 bytes) failed; errno 12 2018-07-13 14:00:44 21419 [ERROR] InnoDB: Cannot allocate memory for the buffer pool 2018-07-13 14:00:44 21419 [ERROR] Plugin 'InnoDB' ini..

Tistory

MySQL DB 명세서 쿼리 작성

SELECT t1.table_name, t1.table_comment, column_name, data_type, column_type, column_key, is_nullable, column_default, extra, column_comment FROM (SELECT table_name, table_comment FROM information_schema.TABLES WHERE table_schema='WH') t1, (SELECT table_name, column_name, data_type, column_type, column_key, is_nullable, column_default, extra, column_comment, ordinal_position FROM information_sche..

Tistory

MySQL 접속 유저 추가

# 현재 유저별 호스트 확인 select user,host,password from mysql.user order by user; # 유저 추가 create user 'ID'@'a.b.c.d' identified by 'PASSWD'; grant all privileges on *.* to 'ID'@'a.b.c.d' with grant option; flush privileges; 5.7 버전 이상시 select user,host,authentication_string from mysql.user order by user; create user 'id'@'a.b.c.d59' identified by 'passwd'; grant all privileges on *.* to 'id'@'a.b.c.d' wit..

Tistory

MySQL Dump시 테이블 Lock 에러

mysqldump: Got error: 1044: Access denied for user 'root'@'localhost' to database 'information_schema' when using LOCK TABLES 에러 발생 시 GRANT SELECT,LOCK TABLES ON DBNAME.* TO 'username'@'localhost'; flush privileges;

Tistory

MySQL error 1364 Field doesn't have a default values

MySQL 5.6 이전에는 필드 생성시 default 값을 따로 지정을 안 해도 insert 시에 '' 처럼 자동으로 디폴트 값이 반영이 되었습니다. 5.6 이후부터는 STRICT 모드라고 해서 테이블 생성시에 default 값을 지정하지 않을 경우 insert 시에 아래와 같이 에러가 발생합니다. Field 'name' doesn't have a default value 외부 프로그램을 사용시 테이블의 필드들을 모두 수정하기는 힘든 경우가 많습니다. 이런 경우 my.cnf 에서 기본 설정을 되어 있는 STRICT 모드를 해제해 줍니다. #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES sql_mode=NO_ENGINE_SUBSTITUTION 해제 후에 MyS..

Tistory

MySQL 5.7 설정 튜닝

MySQL 5.7에서 가쟝 중요한 4가지 변수가 있다. [mysqld] innodb_buffer_pool_size = 10240M (램의 50~70% 정도로 설정) innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 # may change to 2 or 0 innodb_flush_method = O_DIRECT // performance_schema 데이터베이스 사용 USE performance_schema // 현재 쓰레드(연결) 개수 확인 SELECT * FROM performance_schema.threads // 현재까지 누적된 쿼리 패턴 통계 확인 SELECT * FROM performance_schema.events_statement..

Tistory

[토끼책] 객체지향의 사실과 오해 1장 - 협력하는 객체들의 공동체

"객체지향이란 실세계를 직접적이고 직관적으로 모델링 할 수 있는 패러다임" 현실 속에 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업. 즉, 객체지향 소프트웨어는 실세계의 투영이며 현실 세계 사물에 대한 추상화이다. 하지만, 현실은 객체에 직접적으로 대응되는 실세계의 사물을 발견한 확률은 높지 않다. 또 존재하더라도 유사성을 찾기가 매우 어려운 게 일반적이다. 화재의 확산을 막는 "방화벽" 과 네트워크의 침입을 막는 "방화벽" 을 예시로 실제 사물과 소프트웨어 객체 간의 의미적 거리와 연관성 간의 괴리를 예로 들을수 있다. 예 소프트 웨어에서 보는 객체 : 행위에 대한 "캡슐화(encapsulation)" 와 "자율성(autonomous)" 메시지(아규먼트) : 현실 세계의 사람들..

Tistory

[토끼책] 객체지향의 사실과 오해 - 2장. 이상한 나라의 객체

객체를 발견하고 창조하는 것은 지식과 행동을 구조화 하는 문제이다 (by. 레베카 위프스브록) 인간은 본능적으로 세상을 독립적이고 식별 가능한 객체의 집합으로 바라본다. 많은 사람들이 객체지향을 직관적이고 이해하기 쉽다고 하는 이유는 객체지향이 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 기본적인 인지능력에 기반을 두고 있기 때문이다. 하지만 인간은 물리적인 한계를 넘어 추상적인 사물까지도 객체로 인식할 수 있다. (주문, 통장의 이체 등 손이나 눈에 안보이는 추상적인 것들) 저자는 이 장의 설명을 위해서 "이상한 나라의 앨리스" 책의 앨리스를 예로 들고 있다. 문을 지나 정원을 가기 위해서 앨리스는 키를 조정해야 한다. 병속의 액체나 케이크를 먹는 것으로 키를 조정할 수 있다고 하며 또, 버섯으..

Tistory

Isolation level (트랜잭션 고립(격리) 수준)

Isolation Levels (트랜잭션 고립(격리) 수준) 우선 Transaction에서 사용 되는 개념이다. SQL은 4개의 Isolation level을 정의하고 있다. READ UNCOMMITTED, READ COMMITED, REPEATABLE READ, SERIALZABLE 각 Storage Engine 혹은 DBMS 마다 조금씩 다르게 구현 되어 있다. 따라서, 어떤것을 사용하기 전에 메뉴얼을 읽어보자(언제 읽냐...) READ UNCOMMITTED Transaction은 uncommitted 결과를 볼 수 있다. 이 단계에서 너가 정말 정말 좋은 의도로 개발을 했지만 많은 문제가 발생할 수 있다. 이 단계는 거의 실용적이지 않다. 왜냐하면, 성능이 다른 레벨들보다 좋지 않기 때문이다. un..

1 2 3