Search Results for '전체 분류'


2051 posts related to '전체 분류'

  1. 2020/06/15 MYSQL FEDERATED 사용법 다른 서버 데이터베이스 연결 조회
  2. 2020/05/25 우분투 mysql ini 초기 설정
  3. 2020/05/22 letsencrypt 2020 인증서 설치 추가 갱신 ssh 인증서 - 우분투- 아파치
  4. 2020/05/22 우분투 리눅스 사용자 상위 폴더 다른 사용자 폴더 접근 차단 방법
  5. 2020/04/23 파이썬 find_element By 오류 해결 방법
  6. 2020/03/10 phpmyadmin 에서 모든 테이블을 innoDB 로 일괄변경하는 방법
  7. 2020/02/18 MYSQL - mysqld.cnf 튜닝
  8. 2019/12/17 XAMPP MYSQL root 비밀번호 간단 설정 방법
  9. 2019/12/15 최대절전모드 꺼버리자
  10. 2019/12/14 윈도우10 모든버전 정품인증 간단 EXE 1
  11. 2019/12/10 제주 산간지방 우편번호 정리
  12. 2019/11/14 IntelliJ IDEA 2019 1
  13. 2019/11/11 ADB를 통해 USB 테 더링을 활성화 3
  14. 2019/11/08 CalculatorTest 튜토리얼 자동화 Java 예제 Eclipse에서 실행하기 - 링크
  15. 2019/11/08 mysql-for-excel-1.3.8.msi - 그냥 쓸만함 1
  16. 2019/10/30 파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문
  17. 2019/10/30 AI 개발에 적합한 5가지 프로그래밍 언어
  18. 2019/10/30 JavaScript 스택(stack)을 이용한 사칙연산(+ - * /) 계산기
  19. 2019/10/30 화이트 도메인 스팸 차단 리스트 / 도메인 설정
  20. 2019/10/30 JavaScript 어제날짜, 내일날짜 구하기
  21. 2019/10/30 정규표현식 제목에 특수문자 정리하는 정규식
  22. 2019/10/30 PHP date 함수에서 사용할 수있는 포맷문자열
  23. 2019/10/30 무료&유료 DNS 및 HTTPS 서비스를 무료 지원 사이트
  24. 2019/10/08 3관 개원한 서초동 수학 마중물학원 정철훈 대표와의 인터뷰
  25. 2019/09/18 BeautifulSoup4 에러 해결 방법
  26. 2019/09/17 크랙 다운로드 사이트 주소
  27. 2019/09/16 파이썬 IP 확인 소스
  28. 2019/08/29 그누보드 각 게시판 글 수 구하기
  29. 2019/08/21 mysql 특정 문자열 치환 ( 특정 문자열 변경 ) REPLACE
  30. 2019/08/21 엑셀 날짜 지정날짜 랜덤 생성
my.cnf : The file has system variables for DB environment.
location of MariaDB SW in this docoment : /engn001/mysvc01/mariadb-10.0.26
location of my.cnf in this document: /engn001/mysvc01/MARIASVC/my.cnf
my.cnf sample



$ vi /engn001/mysvc01/MARIASVC/my.cnf
##---------------------------------------------------------------------------
## Author: YJ
## mysqld 데몬 프로세스 관련 설정들
##---------------------------------------------------------------------------
[mysqld]
core-file                                     # core dump 파일을 생성하도록 하기 위한 설정
user = mysvc01                                # MariaDB 엔진의 owner (user id) = DB를 실행시킬 OS 계정

port = 3306                                   # DB 포트
socket = /engn001/mysvc01/MARIASVC/mysqld.sock   # 소켓파일 경로(로컬서버 접속에 사용), 리모트 서버에는 ip와 port를 이용해서 TCP/IP 프로토콜로 접근
pid-file = /engn001/mysvc01/MARIASVC/mysqld.pid  # MariaDB 서버가 자신의 프로세스 ID를 기록하는 파일 경로 (유닉스 혹은 리눅스에서만 사용)

basedir = /engn001/mysvc01/mariadb-10.0.26    # MariaDB 엔진 경로
datadir = /data001/mysvc01/MARIASVC           # DB의 데이터가 생성될 기본 경로
tmpdir = /data001/mysvc01/tmpdir_MARIASVC     # 디스크에 임시테이블이 생성될 때 사용될 경로

#secure_file_priv = /tmp                      # LOAD_FILE() 함수 및 LOAD DATA 와 SELECT ... INTO OUTFILE 명령문이 특정 디렉토리에 있는 파일에서만 동작을 하도록 한정

##---------------------------------------------------------------------------
## Author: YJ
## Logging
##---------------------------------------------------------------------------
log-warnings = 3                            # 0 비활성화
                                            # 1 이상: 쿼리문 단위의 경고 내용까지 에러로그에 기록

log_output = FILE,TABLE                     # 로그 기록 유형 (파일과 테이블에 기록)
log-error = /logs001/mysvc01/MARIASVC/error/mysqld.err # 에러 로그파일 경로

general_log = OFF                           # 제너럴 로그 비활성화
                                            # DB에서 일어나는 모든 작업에 대한 로그를 남기게 되므로 필요할 때만 ON으로 설정해서 사용
general_log_file = /logs001/mysvc01/MARIASVC/general/mysvc01-general.log    # 제너럴 로그파일 경로

slow_query_log = ON                         # 느린 쿼리 기록 활성화
long_query_time = 0.5                       # 느린 쿼리의 기준 시간(초)
log-slow-verbosity = 'query_plan,innodb'
log_queries_not_using_indexes = OFF         # 인덱스를 사용하지 않은 쿼리 기록 여부
slow_query_log_file = /logs001/mysvc01/MARIASVC/slow/mysvc01-slow.log # 느린 쿼리 로그파일 경로


##---------------------------------------------------------------------------
## Author: YJ
## DB 기본 설정
##---------------------------------------------------------------------------

skip-name-resolve                           # 역DNS 검색 비활성화 (IP 기반으로 접속을 하게 되면 hostname lookup 과정 생략)

default_storage_engine='InnoDB'             # 기본 스토리지 엔진 설정
lower_case_table_names = 1                  # 테이블명을 소문자로 처리
sysdate-is-now                              # SYSDATE 구문을 NOW와 동일하게 처리

sql_mode="TRADITIONAL,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI_QUOTES"
# sql_mode 설명 : SQL문 사용 제한 = 쿼리 점검 수준
# TRADITIONAL = STRICT_TRANS_TABLES,STRICT_ALL_TABLES = 잘못된 값이 컬럼에 입력되거나 업데이트될 때 에러를 반환함
#              ,NO_ZERO_IN_DATE,NO_ZERO_DATE = 날짜타입에 0000-00-00 입력 못 하게 함
#              ,ERROR_FOR_DIVISION_BY_ZERO = 0으로 나눌 때는 오류 발생시킴
#              ,NO_AUTO_CREATE_USER = 권한 부여 문장이 실행된다고 해서 자동으로 유저를 생성하지 않게 함
#              ,NO_ENGINE_SUBSTITUTION = 기본 스토리지 엔진의 자동 대체를 방지
# IGNORE_SPACE : 프로시저나 함수명과 괄호 사이의 공백 무시
# ONLY_FULL_GROUP_BY : 그룹핑 작업을 할 때 GROUP BY 절에 그룹핑 키 컬럼들이 다 있어야만 함
# ANSI_QUOTES : 홑따옴표만 문자열 값 표시로 사용, 쌍따옴표는 문자열 리터를 표기에 사용할 수 없음
# PAD_CHAR_TO_FULL_LENGTH : MariaDB/MySQL은 기본적으로 CHAR 타입도 VARCHAR 처럼 문자열 뒤 공백 문자를 제거하는데, 공백을 제거하지 않고 채우게 하려면 설정함

#feedback = ON                              # MariaDB로 에러 내용 보내기
event_scheduler = ON                        # 이벤트스케줄러(cron, Oracle의 Job과 같은 역할) 활성화
performance_schema = ON                     # performance_schema 활성화
#performance_schema_max_digest_length=10240 # digest의 최대 길이 (digest:정형화시킨 쿼리문, 상수부분 등을 패턴화시킨다.)
plugin-load = server_audit


##---------------------------------------------------------------------------
## Author: YJ
## Character Set
##---------------------------------------------------------------------------
skip-character-set-client-handshake         # 클라이언트에서 보내지는 문자셋 정보를 무시하고 서버의 문자셋 사용
character_set_server = utf8mb4
collation_server = utf8mb4_bin
init_connect='SET collation_connection = utf8mb4_bin'
init_connect='SET NAMES utf8mb4'


##---------------------------------------------------------------------------
## Author: YJ
## Transaction 설정
##---------------------------------------------------------------------------
autocommit = ON                             # autocommit 활성화 여부
transaction_isolation = "READ-COMMITTED"    # replication을 할 때는 "레코드 기반 복제"를 사용하도록 함
# transaction_isolation 설명
# . READ UNCOMMITTED
# 다른 트랜잭션이 Commit 전 상태를 볼 수 있음
# Binary Log가 자동으로 Row Based로 기록됨 (Statement설정 불가, Mixed 설정 시 자동 변환)
# . READ-COMMITTED
# Commit된 내역을 읽을 수 있는 상태로, 트랜잭션이 다르더라도 특정 타 트랜잭션이 Commit을 수행하면 해당 데이터를 Read할 수 있음
# Binary Log가 자동으로 Row Based로 기록됨 (Statement설정 불가, Mixed 설정 시 자동 변환)
# . REPEATABLE READ (기본)
# MySQL InnoDB 스토리지 엔진의 Default Isolation Level
# Select 시 현재 데이터 버전의 Snapshot을 만들고, 그 Snapshot으로부터 데이터를 조회
# 데이터에 관해서 암묵적으로 Lock과 비슷한 효과가 나타남. 즉, Select 작업이 종료될 때까지 해당 데이터 변경 작업 불가
# 동일 트랜잭션 내에서 데이터 일관성을 보장하고 데이터를 다시 읽기 위해서는 트랜잭션을 다시 시작해야 함
# . SERIALIZABLE
# 가장 높은 Isolation Level로 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸림
# 다른 트랜잭션에서는 해당 영역에 관한 데이터 변경 뿐만 아니라 입력도 불가

##---------------------------------------------------------------------------
## Author: YJ
## 보안 설정
##---------------------------------------------------------------------------
#skip-external-locking                      # 외부(TCP/IP) 잠금 비활성화
enable-secure-auth                          # 서버로 구버전(4.1버전 이하) 포멧으로 된 패스워드 전달 비활성화
symbolic-links = OFF                        # 심볼릭 링크 비활성화


##---------------------------------------------------------------------------
## Author: YJ
## Connection 설정
##---------------------------------------------------------------------------
thread_handling = one-thread-per-connection # 쓰레드풀(Thread Pool) 사용 여부
                                            # 쓰레드풀을 사용하려면 pool-of-threads 으로 설정

max_connections = 250                       # 허용 가능한 최대 동시 접속수, 각각의 커넥션은 최소 thread_stack의 사이즈만큼의 메모리 사용
max_connect_errors = 1000                   # 계속적으로 문제를 발생시키는 클라이언트를 몇번째 재시도후 block할지 지정
                                            # 한번 block되면, 서버를 재시작하거나 flush host명령을 실행하기 전까지 접속 불가
back_log = 100                              # max_connections 이상의 connection이 대량으로 몰릴 때 큐에 대기가능한 커넥션의 갯수
thread_cache_size = 100                     # 재 사용을 위해 보관할 쓰래드 수, thread_created가 높을 경우 증가됨
                                            # THREADS_CONNECTED 상태값의 피크보다 약간 낮게 설정하는 것을 권장함
wait_timeout = 28800                        # 접속한 후 쿼리가 들어올 떄까지 대기하는 시간(초) = noninteractive 커넥션 닫기까지의 시간
lock_wait_timeout = 28800                   # metadata lock을 획득하기 위해 대기하는 시간(초), 기본은 1년임
interactive_timeout = 3600                  # "mysql>"과 같은 콘솔이나 터미널 상에서 클라이언트의 접속을 시간(초), 기본 8시간이지만 1시간 설정 권장
connect_timeout = 10                        # mysqld 데몬이 클라이언트로 부터 접속요청을 받는 경우 기다리는 시간(초)

#net_retry_count = 10                       # 통신이 잘못되어 실패할 때, 몇 번까지 재시도할지
net_read_timeout = 60                       # 커넥션으로부터 읽기가 안 된다고 판단하기 전에 데이터를 기다리는 시간(초)
net_write_timeout = 60                      # 커넥션으로 쓰기가 안 된다고 판단하기 전에 기다리는 시간(초)

open_files_limit = 3000                     # mysql이 오픈할수 있는 file(정확히는 file descripter)개수
                                            # 가능하면 5000으로 설정하는데 OS limit에 따라 재조정 될수 있다
                                            # 실제로는 이 값에 영향을 받지 않고, OS의 nofile(open files) 제한이 적용됨
table_open_cache = 4000                     # DB전체에서 오픈할 수 있는 테이블 갯수
table-definition-cache = 4000               # 캐싱해 놓을 (.frm 파일에서 추출한)테이블 정의 갯수, 테이블이 많으면 크게 설정

##---------------------------------------------------------------------------
## Author: YJ
## Thread Pool 설정 - thread_handling = pool-of-threads 일 때만 의미 있음
##---------------------------------------------------------------------------
# thread_pool_size = 4                      # 쓰레드 그룹 갯수, 기본은 CPU 갯수와 같음
# (sleep이나 wait 상태인 쓰레드 제외하고) CPU를 동시에 사용할 수 있는 쓰레드 갯수
# 리눅스나 유닉스 계열일 때만 사용되는 설정
# thread_pool_max_threads = 500             # 쓰레드풀에 들어갈 수 있는 최대 쓰레드 갯수
# thread_pool_idle_timeout = 60             # idle 상태인 쓰레드를 정리하기 전에 대기하는 시간(초)
# thread_pool_stall_limit = 500             # 쓰레드 교착 상태 검사 간격(밀리초)
# 쓰레드 갯수가 thread_pool_max_threads에 도달하면 쓰레드는 더 이상 생성되지 않는다.

# thread_pool_oversubscribe = 3             # internal 파라미터로 임의로 수정하지 않는 것이 좋음
# thread_pool_size * thread_pool_oversubscribe = DB에서 동시에 active되어 CPU를 사용할 수 있는 쓰레드 갯수

##---------------------------------------------------------------------------
## Author: YJ
## Connection 메모리 설정
##---------------------------------------------------------------------------
sort_buffer_size = 256K         # (인덱스를 사용할 수 없는) 정렬에 필요한 버퍼의 크기, ORDER BY 또는 GROUP BY 연산 속도와 관련
join_buffer_size = 256K         # 조인이 테이블을 풀스캔 하기 위해 사용하는 버퍼크기, 드리븐 테이블이 FULL SCAN할 때 사용됨
read_buffer_size = 256K         # 테이블 스캔에 필요한 버퍼크기
read_rnd_buffer_size = 256K     # 디스크 검색을 피하기위한 랜덤 읽기 버퍼크기, 정렬 대상이 커서 two pass 알고리즘을 쓸 때만 사용

#thread_stack = 256K            # 쓰레드 하나의 스택 사이즈 (기본 64bit 시스템의 기본 256KB)

net_buffer_length = 16K         # 클라이언트에 보내는 초기 메시지의 바이트 수
max_allowed_packet = 16M        # 한 패킷의 최대 크기
group_concat_max_len = 32M      # GROUP_CONCAT() 함수를 사용할 때 이용할 수 있는 최대 크기

max_heap_table_size = 32M       # MEMORY 테이블의 최대 크기
tmp_table_size = 1M             # 메모리에 생성될 임시 테이블의 최대 크기, 이 값을 초과하면 디스크에 임시 테이블을 씀

##---------------------------------------------------------------------------
## Author: YJ
## 쿼리 캐시 설정
##---------------------------------------------------------------------------
query_cache_size = 32M          # 쿼리 결과를 캐싱하기 위해 할당하는 메모리 크기 (DB전체)
query_cache_limit = 2M          # 쿼리 결과가 이 값보다 크면 캐싱 안 함 (기본은 1M)
query_cache_type = DEMAND       # 쿼리에서 힌트로 쿼리 캐시를 사용하겠다고 설정한 경우에만 쿼리 캐시 사용
                                # 0 or OFF : 쿼리 캐시 사용 안 함, 쿼리 캐시를 안 쓰려면 query_cache_size도 0으로 설정해야 함
                                # 1 or ON : SQL_NO_CACHE를 설정하지 않은 모든 쿼리의 결과를 캐싱함
                                # 2 or DEMAND : SQL_CACHE로 설정한 쿼리의 결과만 캐싱함

##---------------------------------------------------------------------------
# Author: YJ
# MariaDB 에서 사용할 수 있는 최대 메모리 사이즈
# innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + key_buffer_size + query_cache_size
# + max_connections * ( read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size + thread_stack + binlog_cache_size)
##---------------------------------------------------------------------------

##---------------------------------------------------------------------------
## Author: YJ
## InnoDB 설정
##---------------------------------------------------------------------------
#innodb_page_size = 16K
#innodb_use_sys_malloc = ON                            # OS에서 제공되는 메모리 할당기능 사용 여부, ON: InnoDB에서 OS 자원을 사용
                                                       # InnoDB의 메모리 할당기능과 OS에서 제공되는 메모리 할당 기능 중 더 효율이 높은 쪽을 선택할 수 있음
innodb_buffer_pool_size = 512M                         # InnoDB 엔진으로 된 테이블과 인덱스를 캐시하기 위한 메모리 버퍼 크기
                                                       # 초기 시스템 전체 물리 메모리의 40% 수준으로 설정하고 사용량에 따라 증감
innodb_buffer_pool_instances = 2                       # 버퍼풀의 갯수, 적절한 갯수로 나누면 뮤텍스(mutex) 경합이 줄어들어 DB 동시 처리 성능을 높여줌
                                                       # 각각의 버퍼풀은 각각의 플러쉬 리스트 뮤텍스(mutex)를 가짐 (아마 LRU리스트도 가질 듯)
                                                       # 각 버퍼풀은 InnoDB 엔진이 자동으로 적절히 배분해서 사용함
#innodb_additional_mem_pool_size = 16M                 # DEPRECATED됨, 데이터 디렉토리 정보와 내부 데이타 구조를 저장하는 메모리 풀의 크기

innodb_data_file_path=ibdata1:32M;ibdata2:32M:autoextend # 시스템테이블스페이스 - 파일명:초기크기:자동증가:최대크기
innodb_file_per_table = 1                              # 테이블 단위로 테이블스페이스 할당, 활성시 테이블별로 .frm, .ibd 각각 생성
innodb_data_home_dir = /data001/mysvc01/MARIASVC       # 테이블 생성 기본 경로
#innodb_autoextend_increment = 100                     # 테이블스페이스 자동 확정시 크기

innodb_log_buffer_size = 4M                            # 로그(redo) 버퍼 크기
                                                       # 클수록 디스크 사용량이 줄어서 성능이 향상되지만 시스템 다운시 손실되는 트랜잭션 양도 증가됨
                                                       # 크기가 작으면 로그버퍼를 로그파일로 쓰기 위한 부하가 많이 발생할 수도 있음
innodb_log_group_home_dir = /data001/mysvc01/MARIASVC  # 로그(redo) 경로
innodb_log_files_in_group = 3                          # 로그(redo) 파일 갯수
innodb_log_file_size = 64M                             # 로그(redo) 파일 크기
                                                       # 일반적으로 (innodb_buffer_pool_size/innodb_log_files_in_group)를 적정 값으로 본다.

innodb-support-xa = OFF                                # 트렌젝션 two-phase commit 지원, 디스크 플러시 횟수를 줄여 성능항상
                                                       # 분산데이터 기능 (2-PhaseCommit)

innodb_buffer_pool_dump_at_shutdown = 1                # DB shutdown할 때 innodb_log_buffer에 있던 내용을 dump 파일로 내림
innodb_buffer_pool_filename = innodb_buffer_pool_dump  # DB shutdown할 때 innodb_log_buffer에 있던 내용을 담을 dump 파일명
innodb_buffer_pool_load_at_startup = 1                 # DB startup할 때 dump파일로 받아 놨던 내용을 innodb_log_buffer에 올림

innodb_thread_concurrency = 4             # InnoDB가 동시 사용가능한 최대 시스템 쓰래드 수
                                          # CPU의 2~4배 권장, 0으로 설정하면 동시성이 비활성화 됨
#innodb_thread_sleep_delay=0              # InnoDB queue에 들어가기전에 얼마나 sleep할것인가
                                          # innodb_thread_concurency에 도달하면 새로운 쓰레드는 innodb_thread_sleep_delay 동안 Sleep 함
                                          # innodb_thread_concurency = 0 이면 이 값음 무시됨
#innodb_adaptive_max_sleep_delay = 150000 # 0 이상의 값으로 지정하면, InnoDB가 innodb_thread_sleep_delay를 자동으로 조정
#innodb_concurrency_tickets = 500         # 한번 스케줄링된 쓰레드는 설정된 티켓개수만큼 자유롭게 InnoDB를 사용할수 있다
                                          # 여러 쓰레드가 innodb_thread_concurrency에 도달하면 하나의 쓰레드만 큐에 들어갈 수 있음
                                          # 하나의 쓰레드가 InnoDB에 들어가게 되면, innodb_concurrency_tickets의 값과 일치하는 “자유 티켓”의 숫자가 주어지고,
                                          # 쓰레드가 자신의 티켓을 사용하기 전 까지는 자유롭게 InnoDB에 들어가고 나올 수가 있다.
                                          # 이런 후에는, 쓰레드는 다시금 일관성 검사를 하고 InnoDB에 다시 들어가려고 시도하게 된다

# InnoDB는 IO request를 background threads에 가능한한 동등하게 분배하고, 동일한 extent에 대한 read requests는 동일한 thread에게 할당함
innodb_read_io_threads = 4           # InnoDB 읽기 작업을 위한 I/O 쓰레드의 수, 주목적: read-ahead requests
                                     # SHOW ENGINE INNODB STATUS 에서 pending read requests가 64 x innodb_read_io_threads이상이라면, 
                                     # innodb_read_io_threads를 더 할당하는 것을 고려
innodb_write_io_threads = 4          # InnoDB 쓰기 작업을 위한 I/O 쓰레드의 수
# read-ahead 란?
# 하나의 extent(64개 pages group)을 모두 buffer pool에 prefetch하는 작업. (asynchronous request임)
# 이들 페이지도 곧 읽혀질거라는 가정하에 모두 버퍼에 올리는 것
# 알고리즘)
# linear read-ahead technique: 버퍼풀 안에 순차적으로 읽혀진 페이지 개수로 판단
#                              만약 하나의 extent내에서 순차적으로 읽혀진 페이지 개수가 innodb_read_ahead_threshold 이상이면 다음 extent전체 페이지를 read-ahead
# random read-ahead technique: 버퍼풀 안에 존재하는 페이지 개수로 판단(순차적인지 여부와 무관함)
#                              만약 한 extent내의 13개의 연속된 페이지가 버퍼풀에 존재한다면, 해당 extent의 나머지 pages들을 read-ahead한다

innodb_lock_wait_timeout = 1200      # 트랜잭션 락(record lock)을 대기하는 시간(초)

#innodb_flush_neighbors = 1          # InnoDB 버퍼풀에서 페이지 플러시를 할 때(=디스크로 기록할 때), 인접한 더티 페이지도 (단일 I/O로) 플러시할 지 결정하는 변수
                                     # 랜덤액세스 쓰기 성능이 떨어지는 HDD에서는 좋으나, SSD에서는 비활성화하는 것이 성능에 유리함
                                     # 0: 해제, 1: 같은 extent안에 연속된 더티 페이지를 같이 플러시함, 2: 같은 extent안에 모든 더티 페이지를 플러시함

#innodb_io_capacity = 100            # 백그라운드 플러싱 속도 제어를 위한 변수, 큰 값을 지정하면 I/O 대역폭을 점유하므로 환경에 맞춰서 설정할 것
                                     # InnoDB 메인 쓰레드가 I/O 작업을 할 수 있는 capa, 시스템의 I/O 수준에 의존적임
                                     # 일반적으로 7200 RPMs 하드 드라이브인 경우 100으로 설정
                                     # RAID 구성이나 SSD 사용 등에 따라서 더 높은 값으로 설정
                                     # Raid1: 200. Raid10: 200 x write arrays. SSD: 5000. FusionIO: 20000

innodb_flush_log_at_trx_commit = 0   # InnoDB에서 커밋될 때마다 로그(redo)를 디스크에 플러시할지를 결정하는 옵션
# fsync() 함수를 호출하는 빈도에 관한 옵션
# 0 : 커밋될 때마다 디스크 플러시를 하지는 않음, OS에서 적절한 시점(일반적으로 4~5초 간격)마다 데이터 동기화를 처리하게 됨
#     잘 못 되면 4~5초간의 데이터는 유실될 수도 있음
# 1 : 트랜잭션이 커밋될 때마다 로그 파일에 기록되고 디스크 플러시가 실행 (가장 안전, 가장 느림)
# 2 : 커밋되면 강제로 로그 버퍼를 로그 파일에 쓰지만, 1초가 지나기 전에는 디스크에 저장되지 않음

innodb_flush_method = O_DIRECT
# InnoDB가 dafa files, log files로 data를 flush(디스크에 기록하고 동기화하는 작업)하는 방법
# ------------------+----------+----------+-----------+-----------------+-----
# Method            | log file | log file | data file | data file flush | 설명
# Method            | open     | fulsh    | open      | data file flush | 설명
# ------------------+----------+----------+-----------+-----------------+-----
# fsync             | normal   | fsync()  | normal    | fsync()         | 기본
# O_DSYNC           | O_SYNC   | O_SYNC   | normal    | fsync()         | synchronized(동기) I/O로서, write작업시 hardware단까지 fsync함
# O_DIRECT          | normal   | fsync()  | O_DIRECT  | fsync()         | OS caching을 하지 않고 direct I/O로 innodb_buffer_pool에서 file로 I/O함
# O_DIRECT_NO_FSYNC | normal   | fsync()  | O_DIRECT  | skip fsync()    | O_DIRECT와 동일한데 data file 동기화를 위한 fsync 호출을 생략함
# ------------------+----------+----------+-----------+-----------------+-----
# fsync = 데이터와 메타정보를 함께 변경하는 방식 (파일메타정보는 파일변경일시,수정자 등을 의미함, fdatasync "데이터만 변경, 메타데이터는 무시")
# O_DIRECT = pache cache, buffer cache는 directly하게 write bypass하지만, inode cache, directory cache, metadata는 따로 fsync()를 호출해서 flush 해줘야 함
#            (캐시메모리 장착된)RAID 컨트롤러가 없거나 SAN을 사용할 때는 O_DIRECT를 사용 하지 않는 것이 좋음
#            double buffering(InnoDB buffer pool과 OS file system cache에 두번 캐쉬)을 하지 않기 떄문에 성능향상을 기대할 수 있다.
# O_DIRECT_NO_FSYNC = 몇몇 file system에서는 O_DIRECT가 fsync()없이도 metadata까지 synchronize되는 걸 보장함. 그래서 InnoDB가 O_DIRECT_NO_FSYNC를 추가함

# 디스크에 데이터를 쓰는 방법 = 1단계 "운영체로의 버퍼로 기록" + 2단계 "버퍼의 내용을 디스크로 복사"
#   - 동기(Sync) I/O = 1단계와 2단계를 함께 실행
#   - 비동기(Async) I/O = 1단계와 2단계를 다른 시점에 실행
#   - direct I/O = 1단계 무시, 2단계 "버퍼의 내용을 디스크로 복사"만 실행

innodb_adaptive_hash_index = ON
# Adaptive Hase Index
# 1. workload와 충분한 buffer pool memory의 적절한 조합하에서, 트랜잭션 특성이나 신뢰성에 위배되지 않는 선에서, InnoDB를 in-memory DB처럼 동작하게 함
# 2. 동작
# 1) MySQL은 search 패턴을 고려하여 index prefix(인덱스 키의 값 앞부분)로 hash index를 만든다
# 2) 자주 access되는 인덱스 페이지에 대해서만 부분적으로 생성될 수도 있다.
# 3) InnoDB는 index search 패턴을 모니터링하는 메커니즘을 가지고 있어서 해당 쿼리가 hash index를 사용하면 이익이라고 판단되면, 자동으로 hash index를 생성한다
# 4) 만약 테이블 전체가 메모리에 들어갈수 있는 사이즈인 경우, hash index는 쿼리 속도를 향상시킨다.
#    인덱스를 pointer와 같이 동작하게 해서 원하는 로우를 바로 다이렉트하게 찾을수 있다.
# 5) 자주 사용되는 데이터는 해시를 통해서 직접 접근할 수 있기에, Mutex Lock으로 인한 지연은 확연하게 줄어듦
# 6) heavy workload하에서는(동시 대량 배치 작업 등), adaptive has index를 접근할때 획득하는 read/write lock이 contention의 원인이 되기도 한다
# 7) LIKE % 쿼리의 경우에는 Adaptive Hase Index가 별 이득이 안 된다
# 3. 모니터링
# 1) 할당되는 메모리는 Innodb_Buffer_Pool_Size의 1/64만큼으로 초기화(최소가 그렇고 최대는 알 수 없음)
#    지나치게 커지지 않도록 상태의 주기적 확인 필요 (SHOW GLOBAL STATUS LIKE 'Innodb%adaptive%';)
# 2) SHOW ENGINE INNODB STATUS 에서 SEMAPHORE 섹션에 RW-latch를 대기하는 thread가 여러개 있다면, disable하는 것이 더 좋을 수도 있다.
# 3) 테이블 DROP은 최대한 트래픽이 없는 새벽에, Adaptive Hash Index를 순간 OFF/ON을 하여 메모리를 해제하고, 테이블을 DROP하는 것이 좋다.

innodb_adaptive_hash_index_partitions = 2
# adaptive_hash_index를 몇 개로 나눠쓸지 결정하는 변수
# 기본은 1 이며, 1일 때는 단일 Mutex로 관리되기 때문에 테이블을 DROP하게 되면 adaptive_hash_index에서 관련 정보를 정리하려고 하면서
# adaptive_hash_index 덕을 보던 쿼리들까지 영향을 받을 수 있음
# 변수값을 크게 설정하면 Mutex가 여러 개가 되면서 테이블을 DROP할 때 adaptive_hash_index에서 Mutex 경합으로 인해 발생할 수 있는 문제를 줄일 수 있음
# InnoDB 내부적으로는 테이블 DROP시 Sleep없이 죽으라고 Hash Index에서 관련 노드를 모두 삭제한 후 테이블이 제거
# 개인적인 생각으로는 CPU 개수 정도면 적당할 듯 함

#innodb_change_buffering = all       # change buffering 설정
# change buffering = insert buffering + delete buffering + purge buffering
# all : 기본: buffer inserts, delete-marking operations, and purges.
# none : Do not buffer any operations.
# inserts : Buffer insert operations.
# deletes : Buffer delete-marking operations.
# changes : Buffer both inserts and delete-marking.
# purges : Buffer the physical deletion operations that happen in the background.
# Innodb는 인덱스 leaf node를 업데이트하지 않고 buffer만 해둠, 버퍼에 임시로 저장해 두고 나중에 여유가 될 때 실제 인덱스에 병합함
# secondary index의 leaf node를 update하려면, 디스크로부터 index page를 읽어서 변경해야하는데 이는 부수적으로 추가 IO가 필요한 작업이기 때문
# 저장: change buffer는 system tablespace에 위치함
# 조건: non-unique한 인덱스에 대한 변경사항 저장, 변경작업에 해당하는 page가 buffer pool에 존재하지 않을때만 change buffer에 변경을 저장
# merge 작업)
# background thread에 의한 주기적으로 병합
# 해당 page가 다른 read operation에 의해서 buffer pool로 불려읽혀졌을 때

#innodb_change_buffer_max_size=25    # 버퍼풀에서 change_buffer가 차지할 비율

#innodb_old_blocks_pct = 37          # LRU 리스트 영역의 범위(퍼센트)
#innodb_old_blocks_time = 1000       # LRU 리스트에서 MRU 리스트로 옮기기 전에 대기하는 시간(밀리초)
# MRU: Most Recently used list, LRU: Last Recently used list
# 버퍼풀의 페이지를 관리하는 리스트 = MRU 리스트 + LRU 리스트

innodb_autoinc_lock_mode = 1
# auto_increment 칼럼에 들어갈 값을 위한 lock 설정
# 0 : insert 할 때 마다 auto increment lock 사용, insert ... select ... 처럼 대량 데이터 입력할 때는 lock 대기가 길어짐
# 1 : insert ... select ... 처럼 대량 데이터 입력할 때 미리 일정량의 자동 증가값을 만들어 사용
#     미리 만든 일정량의 자동 증가값이 다 사용되지 않으면 나머지는 버림
# 2: auto increment lock을 사용하지 않고 mutex 사용, auto_increment 값이 유니크함은 보장하지만 순서는 보장하지 못 함

#innodb_max_dirty_pages_pct=75       # 버퍼풀에 남아 있을 수 있는 더티 페이지의 비율 (이 비율이 넘어가면 체크포인트가 수행됨)
                                     # 더티페이지(dirty page) = SQL 조작으로 변경됐지만 아직 디스크에 쓰여지지 않은 데이터 페이지
#innodb_adaptive_flushing=ON         # InnoDB 엔진이 리두 로그의 발생량을 모니터링 하면서 버퍼 풀의 더티페이지를 디스크로 쓰는 작업 속도를 조절하게 함
                                     # ON 이 아니면 더티페이지의 비율이 innodb_max_dirty_pages_pct를 넘어서는 순간 공격적인 디스크 쓰기 일어날 수 있음
#innodb_use_native_aio=ON            # 리눅스와 윈도우 플랫폼에 한해 네이티브 비동기 I/O 방식이 제공됨 (I/O요청 동시성 증대 효과)
                                     # libaio 라이브러리가 설치되어 있고, 이 값을 "ON"으로 설정해야 사용 가능함

innodb_doublewrite = 1               # doublewrite buffer와 data file에 이중 쓰기 활성화 (기본: 활성)
# 목적: 시스템 crash, 전원공급중단 등 장애시 보다 안전한 리커버리
#       OS의 기본IO 단위(보통 4K)와 DB의 기본IO단위(보통 16K)가 다름으로 인해 발생할 수 있는 page currupt를 방지하기 위해 사용
#       (16K가 OS를 통해 다 써지기 전에 시스템 crash가 가 되도, 안전하게 복구할 수 있도록 도와줌)
#       InnoDB는 full pages를 로깅하지는 않으므로 필요함
#       InnoDB는 log file에 page number, 변경내용, log sequence 정보를 기록함
# Doublewrite Buffer 는?
# 1. 기본적으로 system tablespace에 위치함
# 2. Flush 이벤트 발생시 Doublewrite Buffer를 먼저 쓰고, 그 다음에 대상 페이지의 내용을 변경함 
#    (대상 페이지의 변경 작업은 fsync()를 call해서 진행됨)
# 3. Doublewrite Buffer에 기록되는 내용은 해당 페이지 정보와 operation 정보임
# 4. 여러 개의 dirty page를 각각의 데이터파일에 플러쉬하려면 랜덤I/O가 발생하여 시간이 오래 걸리므로 
#     dirty page를 모아서 시스템 테이블스페이스 내 하나의 연속적인 extent에 쓰고 단일 I/O로 처리
# 5. fsync() 횟수 줄임 - 매 page마다 fsync()를 콜하는게 아니라, multiple page를 한번에 쓰고 fsync()
# 6. 일반적으로 doublewrite를 활성화에 의해서 발생하는 성능 저하는 5% 정도로 본다.

#innodb_sync_spin_loops = 30         # 쓰레드가 지연되기 전에 (suspended) 풀어 주기 위해 InnoDB 뮤텍스(mutex)를 기다리는 쓰레드의 대기 시간
                                     # spin loop: CPU를 사용하면서 락이 해제됐는지 검사하는 것
                                     # 동일한 쿼리가 동시다발적으로 유입되어 여러 스레드에서 메모리내의 같은 데이터 블록에 접근하여 뮤텍스 경합이 발생,
                                     # CPU 부하가 높아지는 경우에는 이 값을 줄여가면 부하가 줄어들 수도 있음 (10정도까지는 괞찮을 듯)

#innodb_table_locks = 1              # LOCK TABLES은 AUTOCOMMIT=0경우에, InnoDB로 하여금 내부적으로 테이블을 잠금
#innodb_max_purge_lag = 0            # 퍼지 연산 (purge operation)이 래깅(lagging)될 때 INSERT, UPDATE 및 DELETE 연산을 지연 시키는 방법을 제어
                                     # 디폴트값 0일시 지연 없음

#innodb_commit_concurrency = 0       # 동시에 commit 처리를 할 수 있는 쓰레드의 숫자. 값이 0이 되면 동시성 제어(concurrency control)가 비활성화

#innodb_purge_threads = 1            # purge 작업을 실행할 쓰레드의 수 (기본1~최대32)
# InnoDB의 purge 작업
# 예전) 주기적으로 수행되는 가비지 컬렉션 작업의 한 종류, 마스터 쓰레드에 의해 동작됨, purge하는 동안 다른 데이터베이스 작업들은 대기해야 함
# MySQL 5.5이후) 개별의 쓰레드에서 수행되면서 더 높은 동시성 보장

innodb_file_format = barracuda       # InnoDB 파일 포멧: 테이블압축 등의 기능을 사용하려면 barracuda 사용
innodb_file_format_max = barracuda
innodb_large_prefix = ON             # 인덱스 키 칼럼의 prefix를 767 bytes 이상으로 설정 (최대 3072 bytes까지 설정 가능)
innodb_open_files = 4000             # DB전체에서 동시에 열어 놓을 수 있는 InnoDB 테이블의 .ibd 파일의 수

#innodb_stats_persistent = 1 (ON)    # 통계정보를 주기적으로  mysql.innodb_table_stats, mysql.innodb_index_stats 테이블에 영구히 저장
#innodb_stats_auto_recalc = 1 (ON)   # 주기적으로 통계 정보를 갱신
#innodb_stats_persistent_sample_pages = 20 # mysql.innodb_table_stats, mysql.innodb_index_stats 테이블에 영구히 저장할 통계정보 수집에 사용할 샘플 페이지 수
#innodb_stats_sample_pages = 8       # 통계정보 수집에 사용할 샘플 페이지 수
#innodb_stats_on_metadata = OFF      # 다음 명령들이 실행될 때 통계 정보 갱신 활성화
                                     # SHOW TABLE STATUS, SHOW INDEX, INFORMATION_SCHEMA.TABLES 조회, INFORMATION_SCHEMA.STATISTICS 조회

innodb_show_verbose_locks = 1        # "SHOW ENGINE INNODB STATUS"에 락이 잡힌 레코드 표시
innodb_print_all_deadlocks = ON      # 에러 로그에 InnoDB 데드락 정보 기록 활성화

#innodb_status_output = ON;          # 에러 로그에 "SHOW ENGINE INNODB STATUS" 결과 포함 설정
innodb_status_output_locks = ON      # InnoDB Status를 보는 부분("SHOW ENGINE INNODB STATUS" 혹은 에러로그)에 lock 정보도 함께 표시되도록 함

#innodb_force_recovery = 0
# 크래시 복구 모드 설명 : 큰 값은 작은 값의 내용을 포함함
# 1 (SRV_FORCE_IGNORE_CORRUPT) 서버가 깨진 페이지를 발견한다고 하더라도 계속 구동하도록 만듦
# 2 (SRV_FORCE_NO_BACKGROUND) 메인 쓰레드가 구동되지 못 하도록 함
# 3 (SRV_FORCE_NO_TRX_UNDO) 복구 다음에 트랜젝션 롤백을 실행하지 않음
# 4 (SRV_FORCE_NO_IBUF_MERGE) 삽입 버퍼 병합 연산 (insert buffer merge operations)까지 금지
# 5 (SRV_FORCE_NO_UNDO_LOG_SCAN) 데이터베이스를 시작할 때 UNDO log를 검사하지 않음
# 6 (SRV_FORCE_NO_LOG_REDO) 복구 연결에서 로그 롤-포워드 (roll-forward)를 실행하지 않음

##---------------------------------------------------------------------------
## Author: YJ
## MyISAM 스토리지 엔진 관련 설정
## InnoDB를 사용하지 않고 MyISAM만 사용한다면 key_buffer_size를 크게 설정
##---------------------------------------------------------------------------
key_buffer_size = 16M                  # MyISAM 테이블이 거의 없고, 데이터도 매우 적으므로 아주 작게 설정
bulk_insert_buffer_size = 1M
myisam-recover-options = BACKUP,FORCE  # MyISAM 테이블을 열 때 자동 복구 옵션
myisam_sort_buffer_size = 1M           # 인덱스 정렬시 할당되는 버퍼의 크기
myisam_max_sort_file_size = 64M        # 인덱스 재 생성시 사용할 임시 파일의 최대 크기
#myisam_repair_threads = 1             # 정렬 복구시 사용될 쓰레드 갯수
#ft_min_word_len                       # MyISAM 혹은 InnoDB 테이블 FULLTEXT 인덱스를 만들 때 포함될 단어의 최소 길이 (mgroonga와는 관련 없는 설정)
                                       # 이 값을 변경하면 "REPAIR TABLE 테이블이름 QUICK" 으로 재 구축해야함

##---------------------------------------------------------------------------
## Author: YJ
## Aria 스토리지 엔진 관련 설정
## internal temporary table이 생성될 때는 기본적으로 Aria 스토리지 엔진을 사용하므로 지나치게 작게 설정하지 말 것
## 예: aria_pagecache_buffer_size = 1M
##---------------------------------------------------------------------------
aria_pagecache_buffer_size = 32M
aria_sort_buffer_size = 32K
aria_log_file_size = 64M


##---------------------------------------------------------------------------
## Author: YJ
## 통계 및 Optimizing 관련 설정
##---------------------------------------------------------------------------
use_stat_tables = NEVER                 # 스토리지 엔진 통계 정보와 통합 통계 정보를 이용하는 우선순위를 결정
# NEVER: 스토리지 엔진 통계정보만 수집
# COMPLEMENTARY : 스토리지 엔진 통계정보를 우선 사용하고 정보가 부족하면 통합 통계 정보 사용
# PREFERABLY: 통합 통계정보를 우선 사용 사용하고 정보가 없으면 스토리지 엔진 통계 정보 사용
# 통합 통계정보란? mysql.table_stat, mysql.column_stat, mysql.index_stat

histogram_size = 20                    # 히스토그램을 저장할 공간 크기(bytes단위), 히스토그램 정보는 mysql.column_stat 저장
# 0 ~ 255 까지 설정 가능, 0이면 히스토그램 수집 안 함
# MariaDB는 Height-Balanced Histogram 알고리즘 사용, 버킷에 저장된 최대값을 1byte 할당해서 저장
histogram_type = SINGLE_PREC_HB         # 
# SINGLE_PREC_HB : histogram_size   만큼 버킷 생성
# DOUBLE_PREC_HB : histogram_size/2 만큼 버킷 생성 (버킷당 2byte를 사용하는 대신 정확성을 확대했기 때문)

#optimizer_prune_level = 1               # 조인 순서 결정 알고리즘 선택 (1: Greedy 방식, 2: Exhaustive 방식)
optimizer_search_depth = 20             # Greedy 방식에서 쿼리에 있는 테이블 중 몇개 테이블의 조인 순서 최적화를 찾을 지 결정 (기본 62)
optimizer_use_condition_selectivity = 4 # 옵티마이저 선택도(1~5)
# 1: MariaDB 5.5 버전에서 사용하던 선택도 예측 방식을 유지(디폴트 값)
# 2: 인덱스가 생성된 칼럼의 조건에 대해서만 선택도 판단
# 3: 모든 칼럼의 조건에 대해서 선택도 판단(히스토그램 사용 안함)
# 4: 모든 칼럼의 조건에 대해서 선택도 판단(히스토그램 사용)
# 5: 4에 추가적으로 범위 검색이 아닌 조건에 대해서는 샘플링 정보를 이용해 선택도를 판단

userstat = ON                           # Enable INFORMATION_SCHEMA.%_STATISTICS tables




##---------------------------------------------------------------------------
## Author: YJ
## Binary Logs
##---------------------------------------------------------------------------
server_id = 1

# Binary Log 설명
# 1. 써지는 시점
# 1) 트랜잭션을 지원하는 스토리지 엔진(예: InnoDB)
#    commit 된 후 lock이 해지 되지 않은 상태에서 쿼리를 로깅
#    commit 전에는 쿼리 정보가 cache되고 commit 될 때 모든 쿼리 정보가 로깅됨
# 2) 트랜잭션을 지원하는 않는 스토리지 엔진(예: MyISAM)
#    쿼리 실행 직후 바로 로깅됨
#    트랜잭션 안에 트랜잭션을 지원하지 않는 테이블이 섞이면, 트랜잭션이 롤백되도 그 테이블의 데이터는 롤백 안 됨
# 2. 활성화 방법
# log_bin 설정

log_bin = /data001/mysvc01/binary_MARIASVC/mysvc01-bin  # binary log 경로

#binlog_cache_size = 256K                            # 쓰레드 별로 binary logging과 관련된 내용을 저장하기 위한 캐시 사이즈로 트랜잭션 지원 구문만을 위해 사용됨
                                                     # 큰 다중문 트랜잭션을 번번히 사용한다면 이 사이즈를 크게 잡아서 퍼포먼스를 개선할 수 있음
                                                     # 최대 사이즈: max_binlog_cache_size로 설정가능
#binlog_stmt_cache_size = 32K                        # 쓰레드 별로 binary logging과 관련된 내용을 저장하기 위한 캐시 사이즈로 트랜잭션 지원하지 않는 구문만을 위해 사용됨
                                                     # 최대 사이즈: max_binlog_stmt_cache_size로 설정가능

#binlog_checksum = NONE                              # NONE: binary log의 이벤트가 제대로 작성됐는지 각각의 이벤트 길이를 체크해서 확인

max_binlog_size = 256M                               # binary log file 최대 크기

binlog_format = ROW                                  # binary log에 기록할 데이터 유형
# transaction_isolation이 "READ-COMMITTED" 이상이면 "MIXED" 이상으로 설정해야 함
# STATEMENT: 명령문 기록
# MIXED : 몇몇 일관성을 보장하지 못 하는 경우에는 ROW 포멧으로, 그 외에는 STATEMENT 포멧으로 기록
# ROW: 실제 레코드 기록

sync_binlog = 0                                      # DB의 binary log 동기화 빈도 설정
# 0: binary log를 기록하지만 직접적으로 플러시(동기화)를 실행하지 않고, OS에 맡김 (리눅스 계열은 3~5초 간격으로 자동 플러시함)
# 1: binary log의 쓰기가 발생할 때마다 디스크 동기화 수행
#    binary log 손실은 없지만 잦은 디스크 I/O로 느려질 수 있음
# 1 이상의 값: 설정된 횟수만큼 binary log 쓰기가 발생할 때마다 DB가 binary log 파일의 동기화를 실행
#              설정된 값이 클수록 손실될 수 있는 binary log의 양이 많아지고 binary log의 쓰기 성능은 좋아짐

expire_logs_days = 1                                 # binary log 보관기간(일), 이 기간이 지나면 자동 삭제
log_bin_trust_function_creators = 1                  # Routine 생성자 신뢰, replication 환경에서는 이 설정을 해야만 Routine 생성이 가능함
#binlog-annotate-row-events = ON                     # 주석도 binary log에 남도록 처리

#sql_log_bin = 0
# mysqld에 적용되는 시스템변수는 아니고, 쓰레드레벨에서 설정할 수 있는 값임
# 해당 쓰레드에서 binary log가 안 남게 하고 싶을 때는 0으로 설정 가능, SUPER 권한 필요함

##---------------------------------------------------------------------------
## Author: YJ
## 슬레이브(Slave) 설정 - replication 환경에서 slave일 때만 의미 있음
##---------------------------------------------------------------------------
#relay_log = /logs001/mysvc01/MARIASVC/relay         # 릴레이 로그 경로
#relay_log_purge = TRUE
#read_only                                           # 일기 전용 DB로 설정


##---------------------------------------------------------------------------
## Author: YJ
## 슬레이브(Slave)이면서 마스터(Master)인 경우
##---------------------------------------------------------------------------
#log-slave-updates                                   # 현재 복제되는 쿼리를 바이너리 로그에 저장

##---------------------------------------------------------------------------
## Author: YJ
## mysqld_safe 데몬에만 적용되는 설정
##---------------------------------------------------------------------------
[mysqld_safe]
log-error=/logs001/mysvc01/MARIASVC/error/mysqld.err    # 에러로그 파일경로
pid-file = /engn001/mysvc01/MARIASVC/mysqld.pid         # 프로세스 ID 파일경로
socket = /engn001/mysvc01/MARIASVC/mysqld.sock          # 소켓파일 경로
nice           = 0


##---------------------------------------------------------------------------
## Author: YJ
## mysqldump 툴을 이용한 DB 접속시에만 적용되는 설정
##---------------------------------------------------------------------------
[mysqldump]
max-allowed-packet    = 1G
default-character-set = 'utf8mb4'
quick                             # 버퍼를 사용하지 말고, direct로 덤프받기


##---------------------------------------------------------------------------
## Author: YJ
## myisamchk 툴을 이용한 DB 접속시에만 적용되는 설정
##---------------------------------------------------------------------------
[myisamchk]
key-buffer-size   = 10M
sort-buffer-size  = 10M
read-buffer-size  = 8M
write-buffer-size = 8M


##---------------------------------------------------------------------------
## Author: YJ
## mysql 클라이언트 툴을 이용한 DB 접속시에만 적용되는 설정
##---------------------------------------------------------------------------
[mysql]
default-character-set = 'utf8mb4'
no-auto-rehash                     # 자동 완성 기능 비활성화
local-infile = ON                  # local file을 이용한 LOAD DATA 작업이 가능하게 함
enable-secure-auth                 # 서버로 구버전(4.1버전 이하) 포멧으로 된 패스워드 전달 비활성화
prompt=(\U){\h}[\d]\_\R:\m:\\s>\_  # SQL 프롬프트 설정
pager=less -n -i -F -X -E          # 데이터 출력시 페이징처리
show-warnings                      # 경고 발생시 메세지 자동 출력
#safe-updates                      # 데이터 변경 또는 삭제시 where절을 필수로 갖도록 처리
#i-am-a-dummy


##---------------------------------------------------------------------------
## xtrabackup (innobackupex) 툴을 이용한 DB 접속시에만 적용되는 설정
##---------------------------------------------------------------------------
[xtrabackup]
default-character-set = 'utf8'
# clientlib 5.1로 xtrabackup binary가 build된 경우, 해당 lib에는 utf8mb4가 없어서 아래와 같은 오류가 발생할 수 있음
# 오류내용: "Can't initialize character set utf8mb4"
# lib 5.5로 xtrabackup을 다시 컴파일하면 문제가 없지만 workaround로 위와 같은 옵션을 설정해도 됨
# 위 설정은 특별한 의미는 없으며 lib 5.1에는 utf8이 있기 때문에 오류가 발생하진 않음


##---------------------------------------------------------------------------
## Author: YJ
## 모든 클라이언트 툴을 이용한 DB 접속시에 적용되는 설정
##---------------------------------------------------------------------------
[client]
port   = 3306
socket = /engn001/mysvc01/MARIASVC/mysqld.sock
default-character-set=utf8mb4

2020/06/25 10:44 2020/06/25 10:44
https://r1ch.net/projects/forcebindip

위 주소에서 파일을 다운 받을수 있습니다.
2020/06/21 13:11 2020/06/21 13:11
2020/06/15 10:11 2020/06/15 10:11
그누보드 운영중 도메인 변경이나 멀티 도메인을 사용할 경우 검색엔진 에서 불이익을 받게 된다. 

01. 스마트 에디터 

/plugin/editor/smarteditor2/photo_uploader/popup/php/index.php

위 파일을 열어서


$data_url = G5_DATA_URL.'/editor/'.$ym.'/';
//변경전
$data_url = '/'.G5_DATA_DIR.'/editor/'.$ym.'/';
//변경후

위 처럼 수정하면 해결할수 있다.

02. 채디터  Cheditor5

/plugin/editor/cheditor5/imageUpload/config.php

위 파일을 열어서
$data_url = G5_DATA_URL.'/'.G5_EDITOR_DIR.'/'.$ym;
//변경전
$data_url = '/'.G5_DATA_DIR.'/editor/'.$ym.'/';
//변경후


위 경우 신규 이미지 업로드 경우만 반여이 된다. 

lib/common.lib.php 의 conv_content 함수를 수정하는 방법도 가능하다.
이는 https://a.com  을 https://b.com 으로 도메인을 변경하는 편법이다.
// 변경전
function conv_content($content, $html, $filter=true)
{
    global $config, $board;
 
// 변경후
function conv_content($content, $html, $filter=true)
{
    global $config, $board;
    $content = str_replace('기존도메인', '현재도메인', $content);

위 방법으로 처리할 경우 미비하지만 속도가 느릴것으로 생각된다.
2020/06/15 10:08 2020/06/15 10:08
A 서버 + B 서버 테이블을 조회 할수 있다. 

show engines;

확인해보면 

초기 FEDERATED 비활성화 되어있어 이를 활성화 해야 한다. 

vi /etc/mysql/my.cnf 

위 파일을 열어 아래 내용을 추가하고 MYSQL 재시작 한다.


[mysql]
federated

위 내용 추가

/*원본 데이터 쌓이는 곳 */
CREATE TABLE `db_test1` (
  `a1` varchar(10) DEFAULT NULL,
  `a2` varchar(10) DEFAULT NULL,
  `a3` varchar(11) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8




/*원본에서 가져올 서버 */
CREATE TABLE `db_test1` (
  `a1` varchar(10) DEFAULT NULL,
  `a2` varchar(10) DEFAULT NULL,
  `a3` varchar(11) DEFAULT NULL
) ENGINE=FEDERATED DEFAULT CHARSET=utf8
CONNECTION='mysql://아이디:비밀번호@IP 주소:3306/데이터베이스이름/db_test1';



위 형식으로 추가하면 /*원본에서 가져올 서버 */ 에서 원본 DB를 조회 할수 있다. 문제는 속도다 속도가 느리다.
2020/06/15 09:57 2020/06/15 09:57
mysqld.cnf 위치가 변경 되었습니다.

/etc/mysql/mysql.conf.d/mysqld.cnf 

sql_mode 를 추가 해야 합니다. 



1. /etc/mysql/mysql.conf.d/mysqld.cnf 

2. 위 경로 파일을 열어서
3. 아래 내용을 추가 합니다.

[mysqld]
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ALLOW_INVALID_DATES"
2020/05/25 10:19 2020/05/25 10:19
Ubuntu  letsencrypt 설치 할때 아파치 중지 없이 신규 발급 갱신 등이 가능합니다.



sudo apt-get install certbot
sudo add-apt-repository ppa : certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-apache


인증서 발급

sudo certbot --apache -d youngsam.net -d www.youngsam.net


갱신 방법

sudo certbot renew

or 

sudo certbot renew --dry-run



2020/05/22 14:09 2020/05/22 14:09
리눅스 설치후 home 디렉토리 계정 생성후 다른 사용자 계정을 알 경우 접근이 가능함 수동적인 방법이지만 가장 확실한 방법이라 이런 식으로 처리함

01. 계정생성

useradd -m youngsam -g korea

-m 옵션 = home 폴더에 youngsam 폴더 생성 -g korea 옵션 korea 그룹 생성 옵션


02.  계정 비밀번호 설정

passwd youngsam


03. vi /etc/ssh/sshd_config

-1 #Subsystem sftp /usr/libexec/openssh/sftp-server
-2 Subsystem sftp internal-sftp

-1 을 주석처리 하고 -2 추가

04. 아래 쪽에 계정별로 추가

Match User youngsam
     ChrootDirectory /home/youngsam
     ForceCommand internal-sftp
     X11Forwarding no
     AllowTCPForwarding no

위 형식

05. service sshd restart 명령어 실행 ssh 재시작

06. 폴더 권한 소유자 설정

#chmod 755 /home/youngsam
 - 폴더 권한은 755
#chown root /home/youngsam
 - 폴더 소유자는 root
#mkdir /home/youngsam/www
 - www 폴더 생성
#chmod 775 /home/youngsam/www
 - 폴더 권한은 위와 다르게 쓰기권한을 포함한 775로 설정
아래는 생략해도 되지만 그룹 미지정 경우 처리
#chown youngsam:korea /home/youngsam/www
 - 폴더 소유자는 youngsam  그룹 korea 로 변경

ssh 나 sftp 등으로 접속 하면 상위 폴더 접근 차단됨

2020/05/22 13:09 2020/05/22 13:09
selenium 업데이트 하면서 기존 문법 경고창이 뜨기 시작 했다. 해결 방법

element에 따라 method를 따로 사용하는 것 보다 간결하다.

방법


from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_element(By.XPATH, '//button')
driver.find_element(By.ID, 'loginForm')
driver.find_element(By.LINK_TEXT, 'Continue')
driver.find_element(By.PARTIAL_LINK_TEXT, 'Conti')
driver.find_element(By.NAME, 'username')
driver.find_element(By.TAG_NAME, 'h1')
driver.find_element(By.CLASS_NAME, 'content')
driver.find_element(By.CSS_SELECTOR, 'p.content')
driver.find_elements(By.ID, 'loginForm')
driver.find_elements(By.CLASS_NAME, 'content')



By 속성
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
2020/04/23 12:53 2020/04/23 12:53
1. phpMyAdmin 을 실행하여 작업할 DB명을 선택합니다.

2. 상단의 "SQL" 탭을 클릭합니다.

3. 입력 상자에 아래의 코드를 넣습니다.

SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;') 
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM';

4. "+옵션"을 클릭하여 "전체 텍스트"를 선택한후 "실행"을 클릭합니다.

5. "모두 보기"를 선택 후 "클립보드에 복사하기"를 클릭합니다.

6. 클립보드에 복사된 내용을 텍스트 에디터에 붙여넣고 "ALTER TABLE"로 시작하는 모든 행을 복사합니다.

7. 작업하는 DB명 선택후 "SQL" 탭을 클릭합니다.

8. 6번에서 복사한 내용을 입력 상자에 붙여넣고 "실행"을 클릭합니다.
2020/03/10 17:46 2020/03/10 17:46
기존 my.cnf  에서 /etc/mysql/mysqld.cnf 변경 되었습니다.

1. Mysql의 최대 접속자 수 확인하기.
show variables like '%max_connection%';
max_connections는 mysql에서 connect할 수 있는 최대 소켓수를 정의한 값입니다.
접속 최대수를 초과해 접속 시도를 하는 경우 "too many connections error"이 발생 합니다.
 
2. 접속수 보기.
show status like 'Max_used_connections';
 
3.  Connection 설정을 위한 변수.
 
- variables (예 show variables like '%max_connection%';)
 
max_connections – 최대 동시 접속 가능 수. max_connection 수가 늘어 나면 innodb 의 thread별 메모리 사용량이 늘어나 같이 고려해야 합니다.
wait_timeout – 지정된 시간 동안 아무런 요청 없이 대기하는 경우 MySQL 서버는 해당 커넥션을 강제로 종료해 버립니다. (기본값은 28800초(8시간))
thread_cache_size – thread 재 사용을 위한 thread pool, 최대 몇 개 까지의 thread를 pool에 보관할지 설정.
 
- status (예 show status like '%clients%';)
 
Aborted_clients : 클라이언트 프로그램이 비 정상적으로 종료된 수
Aborted_connects : MySQL 서버에 접속이 실패된 수
Max_used_connections : 최대로 동시에 접속한 수
Threads_cached : Thread Cache의 Thread 수
Threads_connected : 현재 연결된 Thread 수
Threads_created : 접속을 위해 생성된 Thread 수
Threads_running : Sleeping 되어 있지 않은 Thread 수
 
4. 튜닝
Cache Miss Rate(%) =  Threads_created / Connections * 100
Connection Miss Rate(%) = Aborted_connects / Connections * 100
Connection Usage(%) = Threads_connected / max_connections * 100
 
- Connection Usage(%)가 100% 라면 max_connections 수를 증가시켜 주십시요. Connection 수가 부족할 경우 Too Many Connection Error 가 발생합니다.
 
- DB 서버의 접속이 많은 경우는 wait_timeout 을 최대한 적게 (10~20 정도를 추천) 설정하여 불필요한 연결을 빨리 정리하는 것이 좋습니다. 그러나 Connection Miss Rate(%) 가 1% 이상이 된다면 wait_timeout 을 좀 더 길게 잡는 것이 좋습니다.
 
- Cache Miss Rate(%) 가 높다면 thread_cache_size를 기본값인 8 보다 높게 설정하는 것이 좋습니다. 일반적으로 threads_connected 가 Peak-time 시 보다 약간 낮은 수치로 설정하는 것이 좋습니다.
 
- MySQL 서버는 외부로 부터 접속 요청을 받을 경우 인증을 위해 IP 주소를 호스트네임으로 바꾸는 과정을 수행하여 접속시에 불필요한 부하가 발생하게 됩니다. skip-name-resolve를 설정하시고 접속시에 IP 기반으로 접속을 하게 되면 hostname lookup 과정을 생략하게 되어 좀 더 빠르게 접속을 하실 수 있습니다.
 
 
5. Aborted_clients 값이 증가하는 원인
클라이언트 프로그램이 mysql_close() 를 호출하지 않고 종료.
클라이언트 프로그램에서 wait_timeout 혹은 interactive_timeout 시간동안 요청이 없는 경우.
전송도중 클라이언트 프로그램이 비정상적으로 종료.
비정상적인 패킷을 가진 통신 시도.
접속을 시도한 사용자가 데이터베이스에 접근할 권한이 없거나, 패스워드가 잘못된 경우.
접속을 시도하는 동안 connect_timeout 시간을 초과.
live 서비스중 해당 값이 과도하게 증가 된다면 해킹 시도에 대한 의심을 해봐야 합니다.


------------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql 버전업 되면서 패스워드 정책이 변경되었다 . 이를 무시하려면 아래 내용을 추가해야 합니다.


[mysqld] 
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ALLOW_INVALID_DATES"
2020/02/18 10:08 2020/02/18 10:08
cmd ( command )실행후 

mysqladmin.exe -u root password secret

secret 이곳에 비밀번호를 넣으면 됩니다.

phpmyadmin root 로그인 경우 config.inc 파일에서 비밀번호를 넣어주면 됩니다. 
2019/12/17 14:49 2019/12/17 14:49
cmd 관리자 모드

powercfg.exe /hibernate off

2019/12/15 01:57 2019/12/15 01:57
윈도우10 모든 버전 인증 프로그램 입니다. 실행 시키고 팝업 뜨면 확인 2번만 눌러주면 끝

KMSAuto net Tools 처럼 가상화 방식이 아닌  자체적으로 윈도우가 미리 탑재된 제품으로 인식하는 방식입니다.

2019/12/14 16:55 2019/12/14 16:55
제주
63000 ~ 63644 
인천광역시 중구 무의동
22386 ~ 22388
인천광역시 강화군
23004 ~ 23010
인천광역시 옹진군
23100 ~ 23116
인천광역시 옹진군 
23124 ~ 23136
충청남도 당진시 석문면 난지도리
31708
충청남도 태안군 근흥면 가의도리
32133
충청남도 보령시 오천면 녹도리
33411
경상북도 울릉군
40200 ~ 40240
경상남도 사천시 신수동
52571
경상남도 통영시 용남면
53031 ~ 53033
경상남도 통영시 
53089 ~ 53104
전라북도 군산시 옥도면 개야도리
54000
전라북도 부안군
56347 ~ 56349
전라남도 영광군, 목포시
57068 ~ 58762
전라남도 신안군 임자면
58800 ~ 58806
전라남도 신안군 증도면 병풍리
58809
전라남도 신안군 압해읍
58817 ~ 58818
전라남도 신안군 압해읍 가란리
58826
전라남도 신안군
58828 ~ 58866
전라남도 진도군 조도면
58953 ~ 58958
전라남도 완도군 
59137 ~ 59145
전라남도 완도군
59149 ~ 59170
전라남도 보성군 벌교읍 장도리
59421
전라남도 고흥군 도양읍 시산리
59563
전라남도 고흥군 봉래면 사양리
59568
전라남도 여수시 화정면 여자리
59650
전라남도 여수시 경호동
59766
전라남도 여수시 화정면 개도리
59781
전라남도 여수시 화정면 개도리
59783
전라남도 여수시
59785 ~59790
2019/12/10 23:49 2019/12/10 23:49
https://www.mchweb.net/a/14.html
인증

-javaagent:C:\Program Files\JetBrains\DataGrip 2018.1.2\bin\JetbrainsCrack.jar

datagrip.exe.vmoptions

datagrip64.exe.vmoptions

56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2DIC4iLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiRm9yIGVkdWNhdGlvbmFsIHVzZSBvbmx5IiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IkFDIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiUFMiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJHTyIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IkRNIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiQ0wiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJSQyIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IlJEIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJSTSIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiREIiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IlJTVSIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9XSwiaGFzaCI6IjEyMjkxNDk4LzAiLCJncmFjZVBlcmlvZERheXMiOjAsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-SYSsDcgL1WJmHnsiGaHUWbaZLPIe2oI3QiIneDtaIbh/SZOqu63G7RGudSjf3ssPb1zxroMti/bK9II1ugHz/nTjw31Uah7D0HqeaCO7Zc0q9BeHysiWmBZ+8bABs5vr25GgIa5pO7CJhL7RitXQbWpAajrMBAeZ2En3wCgNwT6D6hNmiMlhXsWgwkw2OKnyHZ2dl8yEL+oV5SW14t7bdjYGKQrYjSd4+2zc4FnaX88yLnGNO9B3U6G+BuM37pxS5MjHrkHqMTK8W3I66mIj6IB6dYXD5nvKKO1OZREBAr6LV0BqRYSbuJKFhZ8nd6YDG20GvW6leimv0rHVBFmA0w==-MIIElTCCAn2gAwIBAgIBCTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE4MTEwMTEyMjk0NloXDTIwMTEwMjEyMjk0NlowaDELMAkGA1UEBhMCQ1oxDjAMBgNVBAgMBU51c2xlMQ8wDQYDVQQHDAZQcmFndWUxGTAXBgNVBAoMEEpldEJyYWlucyBzLnIuby4xHTAbBgNVBAMMFHByb2QzeS1mcm9tLTIwMTgxMTAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQAF8uc+YJOHHwOFcPzmbjcxNDuGoOUIP+2h1R75Lecswb7ru2LWWSUMtXVKQzChLNPn/72W0k+oI056tgiwuG7M49LXp4zQVlQnFmWU1wwGvVhq5R63Rpjx1zjGUhcXgayu7+9zMUW596Lbomsg8qVve6euqsrFicYkIIuUu4zYPndJwfe0YkS5nY72SHnNdbPhEnN8wcB2Kz+OIG0lih3yz5EqFhld03bGp222ZQCIghCTVL6QBNadGsiN/lWLl4JdR3lJkZzlpFdiHijoVRdWeSWqM4y0t23c92HXKrgppoSV18XMxrWVdoSM3nuMHwxGhFyde05OdDtLpCv+jlWf5REAHHA201pAU6bJSZINyHDUTB+Beo28rRXSwSh3OUIvYwKNVeoBY+KwOJ7WnuTCUq1meE6GkKc4D/cXmgpOyW/1SmBz3XjVIi/zprZ0zf3qH5mkphtg6ksjKgKjmx1cXfZAAX6wcDBNaCL+Ortep1Dh8xDUbqbBVNBL4jbiL3i3xsfNiyJgaZ5sX7i8tmStEpLbPwvHcByuf59qJhV/bZOl8KqJBETCDJcY6O2aqhTUy+9x93ThKs1GKrRPePrWPluud7ttlgtRveit/pcBrnQcXOl1rHq7ByB8CFAxNotRUYL9IF5n3wJOgkPojMy6jetQA5Ogc8Sm7RG6vg1yow==







N757JE0KCT-eyJsaWNlbnNlSWQiOiJONzU3SkUwS0NUIiwibGljZW5zZWVOYW1lIjoid3UgYW5qdW4iLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiRm9yIGVkdWNhdGlvbmFsIHVzZSBvbmx5IiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyMC0wMS0wNyJ9LHsiY29kZSI6IkFDIiwicGFpZFVwVG8iOiIyMDIwLTAxLTA3In0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDIwLTAxLTA3In0seyJjb2RlIjoiUFMiLCJwYWlkVXBUbyI6IjIwMjAtMDEtMDcifSx7ImNvZGUiOiJHTyIsInBhaWRVcFRvIjoiMjAyMC0wMS0wNyJ9LHsiY29kZSI6IkRNIiwicGFpZFVwVG8iOiIyMDIwLTAxLTA3In0seyJjb2RlIjoiQ0wiLCJwYWlkVXBUbyI6IjIwMjAtMDEtMDcifSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMjAtMDEtMDcifSx7ImNvZGUiOiJSQyIsInBhaWRVcFRvIjoiMjAyMC0wMS0wNyJ9LHsiY29kZSI6IlJEIiwicGFpZFVwVG8iOiIyMDIwLTAxLTA3In0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMjAtMDEtMDcifSx7ImNvZGUiOiJSTSIsInBhaWRVcFRvIjoiMjAyMC0wMS0wNyJ9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDIwLTAxLTA3In0seyJjb2RlIjoiREIiLCJwYWlkVXBUbyI6IjIwMjAtMDEtMDcifSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAyMC0wMS0wNyJ9LHsiY29kZSI6IlJTVSIsInBhaWRVcFRvIjoiMjAyMC0wMS0wNyJ9XSwiaGFzaCI6IjExNTE5OTc4LzAiLCJncmFjZVBlcmlvZERheXMiOjAsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-AE3x5sRpDellY4SmQVy2Pfc2IT7y1JjZFmDA5JtOv4K5gwVdJOLw5YGiOskZTuGu6JhOi50nnd0WaaNZIuVVVx3T5MlXrAuO3kb2qPtLtQ6/n3lp4fIv+6384D4ciEyRWijG7NA9exQx39Tjk7/xqaGk7ooKgq5yquIfIA+r4jlbW8j9gas1qy3uTGUuZQiPB4lv3P5OIpZzIoWXnFwWhy7s//mjOWRZdf/Du3RP518tMk74wizbTeDn84qxbM+giNAn+ovKQRMYHtLyxntBiP5ByzfAA9Baa5TUGW5wDiZrxFuvBAWTbLrRI0Kd7Nb/tB9n1V9uluB2WWIm7iMxDg==-MIIElTCCAn2gAwIBAgIBCTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE4MTEwMTEyMjk0NloXDTIwMTEwMjEyMjk0NlowaDELMAkGA1UEBhMCQ1oxDjAMBgNVBAgMBU51c2xlMQ8wDQYDVQQHDAZQcmFndWUxGTAXBgNVBAoMEEpldEJyYWlucyBzLnIuby4xHTAbBgNVBAMMFHByb2QzeS1mcm9tLTIwMTgxMTAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQAF8uc+YJOHHwOFcPzmbjcxNDuGoOUIP+2h1R75Lecswb7ru2LWWSUMtXVKQzChLNPn/72W0k+oI056tgiwuG7M49LXp4zQVlQnFmWU1wwGvVhq5R63Rpjx1zjGUhcXgayu7+9zMUW596Lbomsg8qVve6euqsrFicYkIIuUu4zYPndJwfe0YkS5nY72SHnNdbPhEnN8wcB2Kz+OIG0lih3yz5EqFhld03bGp222ZQCIghCTVL6QBNadGsiN/lWLl4JdR3lJkZzlpFdiHijoVRdWeSWqM4y0t23c92HXKrgppoSV18XMxrWVdoSM3nuMHwxGhFyde05OdDtLpCv+jlWf5REAHHA201pAU6bJSZINyHDUTB+Beo28rRXSwSh3OUIvYwKNVeoBY+KwOJ7WnuTCUq1meE6GkKc4D/cXmgpOyW/1SmBz3XjVIi/zprZ0zf3qH5mkphtg6ksjKgKjmx1cXfZAAX6wcDBNaCL+Ortep1Dh8xDUbqbBVNBL4jbiL3i3xsfNiyJgaZ5sX7i8tmStEpLbPwvHcByuf59qJhV/bZOl8KqJBETCDJcY6O2aqhTUy+9x93ThKs1GKrRPePrWPluud7ttlgtRveit/pcBrnQcXOl1rHq7ByB8CFAxNotRUYL9IF5n3wJOgkPojMy6jetQA5Ogc8Sm7RG6vg1yow==
2019/11/14 09:28 2019/11/14 09:28
ConnectivityManager.setUsbTethering(boolean enable)은 Android 4.3에서 호출 됩니다.
adb shell su -c service call connectivity 34 i32 1 USB 테 더링을 켭니다.
adb shell su -c service call connectivity 34 i32 0 USB 테 더링을 끕니다.
다른 Android 버전의 경우 Android 버전 당 34다음 setUsbTethering 아래처럼 바꿔 사용할수 있습니다.
4.4.4: 34
5.1.0: 30
6.0.1: 30
7.0.0: 33
2019/11/11 15:56 2019/11/11 15:56
잘 설명 되어 있음

https://yonoo88.tistory.com/1306
 

2019/11/08 13:58 2019/11/08 13:58
사용자 삽입 이미지



엑셀과 MYSQL 연동처리 하는 프로그램입니다 오라클에서 업데이트를 안해서 데이터가 많아지면 먹통이 되네요.
이를 써야 할지 말아야할지 고민입니다.

https://dev.mysql.com/downloads/windows/excel/ 

최신 버전을 받을수 있습니다.
2019/11/08 13:55 2019/11/08 13:55
사용자 삽입 이미지

BeautifulSoup, scikit-learn, TensorFlow를 사용하여 실무에 머신러닝/딥러닝을 적용해 보자!
인공지능, 머신러닝, 딥러닝은 바둑, 의료, 자동차 등 이미 다양한 분야에서 성공적인 성과를 보여주고 있습니다. 이러한 머신러닝, 딥러닝과 관련된 성공 사례를 듣고 나면 실제 업무에서도 활용해보고 싶을 것입니다. 사실 머신러닝이라고 하면 어려운 수학과 관련된 지식이 필요하다고 생각하는 경우가 많지만, 그렇게까지 어려운 수학을 사용하는 경우는 거의 없습니다. 활용할 데이터만 가지고 있다면 자신이 원하는 것을 만들어낼 수 있습니다.

[파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문]에서는 머신러닝의 바탕이 되는 데이터를 수집하고, 수집된 데이터를 기반으로 머신러닝을 수행하는 방법을 설명합니다. 인터넷에서 데이터를 어떻게 효율적으로 수집하는지 알아보고, 머신러닝을 원활하게 할 수 있게끔 데이터를 가공하는 방법을 살펴봅니다. 나아가 가공된 데이터를 이용해 챗봇 제작, 규동 메뉴 이미지 판정, 얼굴 인식 등 머신러닝에 활용하는 과정까지 실질적인 파이썬 예제 코드로 소개합니다.


00장: 머신러닝을 위한 데이터 처리
0-1. 크롤링, 스크레이핑, 머신러닝
인터넷의 빅데이터
스크레이핑, 크롤링, 데이터 가공
머신러닝에 사용할 수 있는 데이터의 구조
01장: 크롤링과 스크레이핑
1-1. 데이터 다운로드하기
웹상의 정보를 추출하는 방법
urllib.request를 이용한 다운로드
웹에서 데이터 추출하기
BeautifulSoup로 스크레이핑하기
1-2. BeautifulSoup로 스크레이핑하기
네이버 금융에서 환율 정보 추출하기
웹 브라우저로 HTML 구조 확인하기
1-3. CSS 선택자
위키 문헌에 공개돼 있는 윤동주 작가의 작품 목록 가져오기
CSS 선택자 자세히 알아보기
CSS 선택자로 추출 연습하기
정규 표현식과 함께 조합하기
1-4. 링크에 있는 것을 한꺼번에 내려받기
한꺼번에 다운받는 데 필요한 처리 내용
상대 경로를 전개하는 방법
재귀적으로 HTML 페이지를 처리하는 방법
02장: 고급 스크레이핑
2-1. 로그인이 필요한 사이트에서 다운받기
HTTP 통신
requests 사용해보기
2-2. 웹 브라우저를 이용한 스크레이핑
웹 브라우저 원격 조작에 사용하는 Selenium
웹 사이트를 이미지로 캡처해보기
네이버에 로그인해서 구매한 물건 목록 가져오기
Selenium으로 스크레이핑하는 방법
자바스크립트 실행해보기
2-3. 웹 API로 데이터 추출하기
웹 API
웹 API를 제공하는 이유
웹 API 사용해보기 - OpenWeatherMap의 날씨 정보
국내에서 사용할 수 있는 웹 API
2-4. cron을 이용한 정기적인 크롤링
정기적인 크롤링
매일 환율 정보 저장하기
cron으로 매일 한 번 실행하기
crontab 설정 방법
03장: 데이터 소스의 서식과 가공
3-1. 웹의 다양한 데이터 형식
텍스트 데이터와 바이너리 데이터
XML 분석
JSON 분석
YAML 분석
CSV/TSV 분석
엑셀 파일 분석
3-2. 데이터베이스
데이터베이스
데이터 저장에는 어떤 데이터베이스를 사용해야 할까?
SQLite - 가볍게 파일 하나로 사용할 수 있는 데이터베이스
MySQL 사용하기
TinyDB 사용하기
04장: 머신러닝
4-1. 머신러닝이란?
머신러닝 개요
머신러닝의 종류
머신러닝의 흐름
머신러닝의 응용 분야
초과 학습(초과 적합)
4-2. 머신러닝 첫걸음
머신러닝 프레임워크 scikit-learn
XOR 연산 학습해보기
붓꽃의 품종 분류하기
4-3. 이미지 내부의 문자 인식
손글씨 숫자 인식하기
이미지 데이터 학습시키기
4-4. 외국어 문장 판별하기
외국어 판정
판정 방법
샘플 데이터 수집
언어 판별 프로그램
웹 인터페이스 추가하기
4-5. 서포트 벡터 머신(SVM)
SVM이란?
SVM을 실제로 사용해보기
SVM의 종류
4-6. 랜덤 포레스트
랜덤 포레스트란?
랜덤 포레스트 사용하기
4-7. 데이터를 검증하는 방법
크로스 밸리데이션
그리드 서치
05장: 딥러닝
5-1. 딥러닝 개요
딥러닝
5-2. TensorFlow 설치하기
TensorFlow
설치 방법
설치가 제대로 됐는지 확인하기
TensorFlow로 간단한 계산해보기
5-3. Jupyter Notebook
Jupyter Notebook 설치하고 실행하기
새 노트 만들기
데이터 시각화
TensorFlow와 함께 사용하기
5-4. TensorFlow 기본
TensorFlow 기본
머신러닝 해보기
5-5. TensorBoard로 시각화하기
TensorBoard의 사용법
5-6. TensorBoard로 딥러닝하기
딥러닝의 구조
딥러닝 해보기 - MNIST 손글씨 데이터
5-7. Keras로 다양한 딥러닝 해보기
Keras
Keras 설치
Keras로 MNIST 테스트해보기
Keras로 비만도 판정해보기
5-8. Pandas/NumPy 다루기
Pandas/NumPy
데이터 조작
Pandas/Numpy 정리
06장: 텍스트 분석과 챗봇 만들기
6-1. 한국어 분석(형태소 분석)
형태소 분석
한국어 형태소 분석 라이브러리
출현 빈도 분석
6-2. Word2Vec으로 문장을 벡터로 변환하기
Word2Vec
Gensim 설치
Gensim의 Word2Vec으로 "토지"를 읽어보기
위키피디아 한국어 버전을 사전으로 사용해보기
위키피디아 데이터로 놀아보기
6-3. 베이즈 정리로 텍스트 분류하기
텍스트 분류
베이즈 정리
나이브 베이즈 분류
베이지안 필터 사용해보기
6-4. MLP로 텍스트 분류하기
MLP로 텍스트 분류하기
6-5. 문장의 유사도를 N-gram으로 분석하기
문장의 유사도 분석
레벤슈타인 거리
파이썬으로 레벤슈타인 거리를 계산하는 프로그램
N-gram으로 유사도 구하기
6-6. 마르코프 체인과 LSTM으로 문장 생성하기
마르코프 체인과 LSTM/RNN
마르코프 체인이란?
마르코프 체인 구현하기
LSTM/RNN
6-7. 챗봇 만들기
챗봇(회화 봇)
챗봇의 구조
07장: 이미지와 딥러닝
7-1. 유사 이미지 검출하기
간단한 형태 인식 - Average Hash
7-2. CNN으로 Caltech 101의 이미지 분류하기
CNN으로 색상 있는 이미지 분류해보기
7-3. 규동 메뉴 이미지 판정하기
규동을 판정할 수 있는 PC가 좋은 PC
스크레이핑부터 시작하기
7-4. OpenCV로 얼굴 인식하기
OpenCV
얼굴을 인식하는 프로그램 만들어보기
얼굴에 모자이크 걸기
7-5. 이미지 OCR - 연속된 문자 인식하기
OpenCV로 텍스트 영역 확인하기
문자 인식 데이터 만들기
다양한 숫자 폰트 학습 시키기
부록: 개발 환경 구축
부록-1. Docker로 개발 환경 구축하기
Docker란?
Docker 설치
윈도우 10 이하에서 Docker Toolbox 설치하기
macOS에서 Docker for Mac 설치하기
부록-2. 파이썬 + Anaconda 환경 준비
파이썬 + Anaconda 이미지 다운

사용자 삽입 이미지
쿠지라 히코우즈쿠에 [저]
중학교 시절부터 취미로 하던 프로그래밍이 재미있어 다양한 것들을 만들다가 프로그래머가 되었다. 현재는 소프트웨어 기획 획사 '쿠지라한도'에서 '재미있고 도움되는 도구'를 주제로 윈도우, 안드로이드 등에서 동작하는 앱을 공개하고 있다. 대표작은 도레미로 작곡할 수 있는 음악 소프트웨어 '텍스트 음악 사쿠라'와 '일본어 기반 프로그래밍 언어 나데시코' 등이다. 2001년에는 온라인 소프트웨어 대상을 받았으며, 2004년 IPA 청소년부에서 슈퍼크리에이터로 인정을 받았고, 2010년에 OSS 공헌자 상을 수상했다. 프로그래밍의 즐거움을 전달하기 위해 매일 분투하고 있다.

윤인성 [역]
어쩌다가 책을 집필/번역하기 시작해서, 지금까지 계속해서 집필/번역하고 있다. 현재 직업 특성상 집에서 나갈 이유가 별로 없다는 것에 굉장히 만족하고 있다. 오전에는 커피, 오후에는 홍차를 마신다. 요리, 피아노, 기타, 작곡, 그림, 스컬핑 등의 취미를 갖고 있다. 그림 취미로 ≪인공지능을 위한 수학(프리렉, 2018)≫의 표지를 그리기도 했다. 소개말을 쓰는 시점을 기준으로 이 책은 49번째 작업 및 참여 도서이다.


=================================================================
좋은책을 발견했다.
요즘 관심이 생긴 [마르코프 체인] 에 대한 지식이 필요했는데 파이썬에 여러 기능을 한번에 공부 할수 있는 귀한책이다.
요즘 분위기상 일본책 보고 있으면 매국놈 소리 들을수 있지만.  뭔가 잘쓴 책이다 싶으면 일본인이 저자다.
다음주에 구입 예정이다.

네이버 가격비교 : [링크]

=================================================================

출처 : 위키북스


2019/10/30 16:41 2019/10/30 16:41
1. 파이썬 1위는 파이썬이다.
파이썬 말고 다른 어떤 언어가 1위가 될 수 있겠는가? 파이썬에는 개발자를 미치도록 화나게 하는 면이 있지만(공백, 파이썬 2.x와 파이썬 3.x 사이의 극심한 분열, 각기 다른 면에서 부실한 5가지 패키징 시스템 등) AI 관련 작업을 한다면 어느 시점에는 분명 파이썬을 사용하게 된다.
파이썬의 라이브러리는 다른 언어에서 따라올 수 없는 부분이다.
넘파이(NumPy)는 워낙 보편적으로 사용되는 터라 텐서 연산에서 사실상 표준 API 역할을 한다.
판다스(Pandas)는 R의 강력하고 유연한 데이터프레임을 파이썬으로 가져온다.
자연어 처리(NLP)에서는 이름도 유명한 NLTK와 빠른 속도가 장점인 스페이시(SpaCy)가 있다.
머신러닝 쪽에는 역전의 사이킷-런(Scikit-learn)이 있다.
딥 러닝이라면 현재의 모든 라이브러리(텐서플로우(TensorFlow), 파이토치(PyTorch), 체이너(Chainer), 아파치 MXNet(Apache MXNet), 테아노(Theano) 등)가 사실상 파이썬을 가장 우선시하는 프로젝트다.
arXiv에서 첨단 딥 러닝 연구를 살펴보면 십중팔구는 파이썬으로 된 소스 코드를 찾을 수 있다.
파이썬 생태계에는 그 외의 다른 부분도 있다.
아이파이썬(IPython)은 주피터 노트북(Jupyter Notebook)이 되면서 파이썬 중심에서 다소 벗어났지만 주피터 노트북 사용자와 온라인에서 공유되는 노트북의 대부분은 파이썬을 사용한다.
부정할 수 없다.
파이선은 AI 연구의 최전방에 선 언어다.
대부분의 머신러닝과 딥 러닝 프레임워크는 파이썬용으로 만들어지며, AI 분야에서 일하는 거의 모든 사람들이 파이썬을 이야기한다.
하루에 적어도 한 번은 공백 문제 때문에 욕이 나오게 하는 언어임에도 바로 이러한 이유로 AI 프로그래밍 언어 중 1위로 꼽힌다.
2 자바와 그 친구들 JVM 언어군(자바, 스칼라, 코틀린, 클로저 등) 역시 AI 애플리케이션 개발을 위한 좋은 선택이다.
자연어 처리(CoreNLP), 텐서 연산(ND4J) 또는 GPU 가속 딥 러닝 스택(DL4J) 등, 파이프라인의 모든 부분에서 풍부한 라이브러리를 사용할 수 있다.
또한 아파치 스파크, 아파치 하둡과 같은 빅 데이터 플랫폼에 대한 접근성도 우수하다.
자바는 대부분의 기업에서 국제 공통어로 사용되며, 자바 8과 자바 9에 새로운 언어 구성자가 도입되면서 대부분의 개발자가 기억하는 짜증스러운 코딩 경험에서도 어느정도 벗어났다.
자바를 사용해서 AI 애플리케이션을 코딩하는 과정은 다소 지루하기도 하지만, 어쨌든 소기의 목적은 달성할 수 있다.
또한 개발, 배포, 모니터링을 위한 기존의 모든 자바 인프라를 그대로 사용 가능하다는 것도 장점이다.
3. C/C++ C/C++는 보통 AI 애플리케이션을 개발할 때 가장 먼저 떠오르는 언어는 아니지만, 임베디드 환경을 다루고 자바 가상 머신이나 파이썬 인터프리터의 오버헤드를 감당할 수 없다면 C/C++가 해답이 된다.
시스템에서 마지막 한 방울까지 성능을 짜내야 하는 상황에서는 내키지 않더라도 포인터의 세계로 다시 돌아갈 수밖에 없다.
다행히 현대의 C/C++ 코딩은 즐거운 경험이 될 수도 있다.
여러 가지 접근 방법 중에서 선택이 가능하다.
바닥까지 뛰어들어 CUDA와 같은 라이브러리를 사용해서 GPU에서 바로 실행되는 자체 코드를 작성할 수 있고, 텐서플로우 또는 카페(Caffe)를 사용해서 유연한 고수준 API에 접근하는 방법을 사용할 수도 있다.
후자의 경우 데이터 과학자가 파이썬으로 만든 모델을 가져온 다음 C/C++의 장점인 속도를 십분 발휘해 프로덕션에서 실행하는 것도 가능하다.
이 분야에서 올해 러스트(Rust)가 행보를 주목하라. C/C++의 속도와 형식 및 데이터 안전성을 결합한 러스트는 보안 문제를 유발하지 않으면서 프로덕션 성능을 확보하기 위한 좋은 선택이다.
또한 텐서플로우 바인딩이 이미 제공된다.
4. 자바스크립트 자바스크립트? 요즘 분위기가 심상치 않다.
구글은 최근 웹 브라우저에서 머신러닝 모델의 학습 및 실행이 가능한 WebGL 가속 라이브러리인 TensorFlow.js를 출시했다.
여기에는 케라스(Keras) API, 그리고 정규 텐서플로우에서 학습된 모델을 로드하고 사용할 수 있는 기능도 포함된다.
이는 AI 영역으로 개발자들을 대대적으로 끌어들일 가능성이 높다.
현재 자바스크립트에서 이용할 수 있는 머신러닝 라이브러리는 다른 언어만큼 풍족하지는 않지만, 개발자들이 리액트(React) 구성 요소 또는 CSS 속성을 추가하는 것만큼 아무렇지도 않게 웹 페이지에 신경망을 추가하게 되는 날이 곧 온다.
생각만 해도 기대와 두려움이 동시에 느껴진다.
TensorFlow.js는 초기 단계다.
현재 브라우저에서 작동하지만 Node.js에서는 안 된다.
전체 텐서플로우 API 구현도 아직 되지 않는다.
그러나 필자는 2018년 말까지 이 두 가지 문제가 모두 해결되고, 그 직후 자바스크립트의 AI 침공이 뒤따를 것으로 예상한다.
5.R R은 상위 5개 언어 가운데 최하위이며 지금도 계속 하락세다.
R은 데이터 과학자들이 선호하는 언어다.
그러나 다른 프로그래머들은 R을 처음 접할 때 그 데이터프레임 중심의 접근 방식에 다소 혼란을 느낀다.
R만 다루는 개발자 그룹이 있다면 연구, 프로토타이핑, 실험을 위해 텐서플로우, 케라스 또는 H2O와의 통합을 사용하는 것도 좋지만 프로덕션 용도로 R을 추천하기는 망설여진다.
원문보기: http://www.ciokorea.com/news/38151#csidx11c5e93d37811a68712ccd7d8ff21f7
2019/10/30 15:25 2019/10/30 15:25
<script>
// 연산자의 연산 우선순위
function getOpPrec(op) 
    switch (op)
    {
        case '*':
        case '/':
            return 5;
        case '+':
        case '-':
            return 3;    
        case '(': 
            return 1;    
    }
    return -1;
}
// 연산자의 우선순위 비교
function whoPrecOp(op1, op2) 
{
    return getOpPrec(op1) >= getOpPrec(op2);    // op1의 연산순위가 높거나 같다면 참
}
function postfixNotation(exp) 
{  
    var stack = [], convExp = [], tok, popOp; 
    exp = exp.replace(/\s/g, '').match(/[\d\.]+|[^\d\.]/g).reverse();  // 공백제거 및  배열로 분리
    while (tok = exp.pop()) {    
        // 숫자가 아니라면(연산자라면) 
        if (isNaN(tok)) {    
            switch (tok)
            {
                case '(':
                    stack.push(tok);
                    break;
                case ')':
                    while (1) {
                        popOp = stack.pop();
                        if ( popOp == '(' )
                            break;
                        convExp.push(popOp);
                    }
                    break;
                case '+': case '-':
                case '*': case '/':
                    while (stack.length && whoPrecOp(stack[stack.length-1], tok))
                        convExp.push(stack.pop());
                    stack.push(tok);
                    break;
            }
        } else     // 숫자라면(피연산자라면)
            convExp.push(tok); 
    }          
    while (stack.length)  
        convExp.push(stack.pop());    
    return convExp;  
}
function evalPostfixNotation(exp) 
{
    var i, tok, n1, n2, stack = [];
    for (i in exp) {   
        tok = exp[i];
        // 연산자라면 
        if (isNaN(tok)) {
            n2 = Number(stack.pop());
            n1 = Number(stack.pop());
            switch (tok)
            {
                case '*':
                    stack.push(n1 * n2);
                    break;
                case '/':
                    stack.push(n1 / n2);
                    break;
                case '+':
                    stack.push(n1 + n2);
                    break;
                case '-':
                    stack.push(n1 - n2);
                    break;
            }
        } else     // 숫자라면            
            stack.push(tok);
    } 
    return stack.pop();
}
document.write( evalPostfixNotation(postfixNotation( '((3.5 - 2) + 3.4) * (14 - 10)' )));
</script>
2019/10/30 15:16 2019/10/30 15:16
https://spam.kisa.or.kr/white/sub1.do

이메일서버 등록하면 끝 !
2019/10/30 15:14 2019/10/30 15:14
$yesterday = date("Y-m-d", mktime(0,0,0,date("m"),date("d")-1,date("Y")));
$tomorrow = date("Y-m-d", mktime(0,0,0,date("m"),date("d")+1,date("Y")));
2019/10/30 15:11 2019/10/30 15:11
제목에 특수문자 정리하는 정규식
[한글, 숫자, 영어, <>/,.%&-"' ] 딱 이문자들만 허용!
더 추가하고 싶은 문자 있으면 [대괄호] 안에 추가 하면 됩니다.
php 예제 
$subject = preg_replace("|([^가-힣0-9a-zA-Z\s<>\(\)\[\]\"\'.,/&%:-])|u", " ", $subject);
2019/10/30 15:08 2019/10/30 15:08
a : "am" 또는 "pm"
A : "AM" 또는 "PM"
d : 두자리로 표현되는 날짜, 즉 "01"~"31"
D : 세글자로 표현되는 요일, 즉 "Fri"
F : 월을 긴 문장으로 나타냅니다. 즉 "January"
h : 시간을 12시간 단위로 나타냅니다. "01"~"12"
H : 시간을 24시간 단위로 나타냅니다.
g : 시간을 12시간 단위로 0 없이 나타냅니다. "1"~"12"
G : 시간을 24시간 단위로 0 없이 나타냅니다. "0"~"24"
i : 분을 나타냅니다. "00"~"59"
j : 날짜를 0 없이 나타냅니다. "1"~"31"
l : (L의 소문자)요일을 나타냅니다. "Friday"
L : 윤년인지의 여부를 나타냅니다. "0" 또는 "1"
m : 달을 나타냅니다. "01"~"12"
n : 0 없이 달을 나타냅니다. "1"~"12"
M : 3글자로 달을 나타냅니다. "Jan"
s : 초를 나타냅니다. "00"~"59"
S : 영어에서 순서를 나타내는 2글자로 된 접미사; "th", "nd"
t : 주어진 달의 날 수; 즉 "28"~"31"
U : 기준시점(GMT 1970년 1월1일 00:00:00)으로부터 지난 시간을 초로 표시
w : 요일을 숫자로 표시합니다. 즉 "0"(일요일) ~ "6"(토요일)
Y : 4글자로 연도표시, "1999"
y : 2글자로 연도표시, "99"
z : 날짜를 표시, "0"~"365"
Z : 지역간의 시간편차를 초단위로 표시, 즉 "-43200"~"43200"
2019/10/30 15:06 2019/10/30 15:06
https://dash.cloudflare.com

입니다.

HTTPS 서비스까지 무료 지원 합니다. SSL 인증서 없이 DNS  레코드만 등록하면 됩니다.

불법 사이트에서 많이 사용하는데 무료 서비스도 안정적이지만 속도가 조금 불만 스럽다면 유료 서비스 진행 하셔도 

좋을듯 합니다.

CloudFlare  구글링 하면 쉽게 사용법 나와 있습니다. 

보충 설명 하자면 DNS , DDOS(디도스) , CDN , SSL , PAGE RULL 이런 기능들이 무료입니다.
2019/10/30 15:01 2019/10/30 15:01
사용자 삽입 이미지


마중물학원에서 1관과 2관을 운영해온 노하우를 바탕으로 서초동에 3관을 개원했다고 밝혔다. 

자율학기제와 변화무쌍한 입시제도 아래 아이들과 학부모들의 심적부담과 내신 및 수능시험의 고충을 덜고자 2014년부터 학원사업을 시작해온 마중물학원 정철훈 대표에게 3관 개원에 대한 이야기와 앞으로의 포부에 대해 들어봤다.

Q. 마중물 3관 학원을 서초동에 오픈했는데, 동기가 있는가?

A. 어느덧 3관을 오픈하게 되었는데, 서초구 아이들뿐만 아니라 전국적으로 아이들이 질적 수업을 받을 수 없거나 무작정 1타 강사의 수업을 대기해야만 하는 대치동의 안타까운 현실을 반영하여 이를 서초동으로 분산시켜보고자 한다. 아이들의 시간 낭비 및 체력 낭비가 줄어들기를 바라며 실력 있는 강사들을 본원으로 배치시킴으로써 대치동 집중화 현상이 조금이나마 해소되기를 바란다.

Q. 마중물이라는 학원명은 어떤 의미가 있는가?

A. ‘마중물’이란 펌프에 물이 나오기 위해서 퍼붓는 한 바가지의 물을 의미하는 순우리말이다. 마중물학원은 엄청난 양의 물이 쏟아지듯 작은 가르침이 큰 효과가 있길 바라는 마음을 담아 지어진 학원명이다.

Q. 마중물 3관 학원의 수업과목은 어떻게 이루어졌나?

A. 본원은 정규수업과 주말 특강반이 있으며 대상은 중학교 1학년부터 고등학교 3학년까지다. 정규수업은 수학, 과학 2가지이며 주말특강수업은 영어, 수학, 과학이 있다.

Q. 다른 학원과의 차별점이 있다면?

A. 가장 첫 번째는 강사의 멘토화와 코칭 및 터칭을 꼽을 수 있다. 두 번째로는 한 반을 정규반 9명, 특강반 6명으로만 구성하여 소수정예 인원으로 꾸린다는 점이다. 셋 째는 성적에 따라 프리패스반을 운영하고 있다는 점. 또한 다양한 미래직업군과의 직접 연계 멘토링을 실시한다는 점, 원장•강사•학부모에 의한 학생관리 네트워크를 구축한다는 점 등 마중물학원만의 차별화된 시스템으로 학생 지도를 하고 있다.

Q. 마중물 3관 학원의 미래 방향은?

A. 서초동 3관을 확고한 입지로 다지는 것이 먼저라고 생각한다. 이후 나아가서는 지방소도시와 세계 여러 지역으로 확장하여 양질의 교육 서비스를 제공하고 싶다. 또한, 열악한 환경 속에서 열심히 하려는 꿈 많은 인재들이 무료로 학원수업을 들을 수 있도록 장학사업에도 매진할 예정이다. 끝으로 초심을 잃지 않는 학원경영 철학을 바탕으로 최선을 다 할 것이다.
2019/10/08 16:44 2019/10/08 16:44
한시간 넘도록 오류를 뿜어

$ pip uninstall BeautifulSoup4
$ easy_install BeautifulSoup4

그냥 지웠다 설치 하니 해결 된다. 젠장할~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2019/09/18 13:21 2019/09/18 13:21
https://free.appnee.com/genp/
2019/09/17 10:08 2019/09/17 10:08