사례 모서리가 둥근 사각형을 만들려면 클리핑 사각형을 적용하는 대신 많은 위젯 클래스에서 제공하는 borderRadius 속성을 사용하는 것이 좋습니다. Bad ClipRRect( borderRadius: BorderRadius.circular(8.0), child: Image.network( "path to your image", height: 150.0, width: 100.0, ), ) Good Container( width: 48.0, height: 48.0, decoration: new BoxDecoration( shape: BoxShape.circle, image: new DecorationImage( fit: BoxFit.fill, image: NetworkImage("path to your image") ) ) )
패키지 업데이트 sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository universe sudo add-apt-repository ppa:certbot/certbot sudo apt-get update Certbot 설치 sudo apt-get install certbot python3-certbot-nginx Nginx 설정 sudo vi /etc/nginx/conf.d/default.conf # server_name에 도메인 수정 후 저장 / nginx 재시작 sudo service nginx restart SSL 발급 sudo certbot --nginx -d example.com -d www.example.com
타임존 변경 sudo mysql; # 접속 후 use mysql; # 현재 설정 확인 SELECT @@global.time_zone, @@session.time_zone; # 타임존 변경 SET GLOBAL time_zone='+09:00'; SET time_zone = '+09:00'; SELECT @@global.time_zone, @@session.time_zone; -> +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | +09:00 | +09:00 | +--------------------+---------------------+ 1 row in set (0.000 sec) 50-server.cnf 수정 50-server.cnf 이제 MariaDB가 재부팅 되도, 타임존은 그대로 유지
타임존 변경 "date"로 명령하여 타임존 확인 date -> Wed Nov 23 20:29:27 UTC 2022 서울로 타임존 변경 sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime -> Thu Nov 24 05:29:43 KST 2022 UTC 타임존 변경 sudo ln -sf /usr/share/zoneinfo/UTC /etc/localtime -> Wed Nov 23 20:32:14 UTC 2022 NTP 서버 연동 타임존 변경 패키지 설치 sudo apt update sudo apt -y install rdate "LG U+", "NIST" 둘중 한군데 연결 # LG U+ sudo rdate -p time.bora.net sudo rdate -s time.bora.net # NIST sudo rdate -p time.nist.gov sudo rdate -s time.nist.gov 재부팅시 초기화 되지 않게 설정 sudo
릴레이션쉽(relationship) 모델 class A_TABLE(Base): """ A_TABLE 테이블 \f :column idx: 인덱스 :column created_at: 생성일 :return: """ __tablename__ = "a_table" __table_args__ = { "comment": "A 테이블" } idx = Column(Integer, unique=True, nullable=False, primary_key=True, index=True, autoincrement=True, comment="인덱스") created_at = Column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now(tz='KST'), comment="생성일") class B_TABLE(Base): """ B_TABLE 테이블 \f :column idx: 인덱스 :column a_idx: A 테이블 인덱스 :column
폴더 생성 및 쉘 스크립트 생성 "/home/ubuntu" 기준 백업 폴더 생성 mkdir /ubuntu/database_backup 쉘 스크립트 생성 vi database_backup.sh 쉘 구성하기 DATE : 날짜 및 시간 표기 BACKUP_DIR : 백업 경로 FILE_NAME : 저장될 파일 이름 DB_USER : 데이터베이스 아이디 DB_PASSWORD: 데이터베이스 비밀번호 DB_DATABASE : 데이터베이스명 하단 find 부분은 백업파일을 유지하는 기간 입니다. +10일을 해놓게 된다면, 나중에 현재 날짜 기준 이전 10일까지의 파일만 유지되고 나머진 삭제되는 형태 즉, 최신 데이터베이스 현재 부터 과거 10일 기준으로 저장 #!/bin/bash DATE=$(date +%Y%m%d-%H%M%S) BACKUP_DIR="/home/ubuntu/database_backup" FILE_NAME=$BACKUP_DIR"/database_"$DATE.sql DB_USER="r
불투명도 애니메이션에 대한 성능 고려 사항 Opacity 위젯에 애니메이션을 적용하면 위젯(및 해당 하위 트리)이 각 프레임을 다시 빌드하게 되므로 그다지 효율적이지 않습니다. 대신 AnimatedOpacity 또는 FadeTransition을 사용하는 것이 좋습니다. Transparent image 단일 이미지 또는 색상만 0.0과 1.0 사이의 불투명도로 합성해야 하는 경우 불투명도 위젯 없이 직접 사용하는 것이 훨씬 빠릅니다. 불투명도가 위젯 그룹에 불투명도를 적용할 수 있으므로 비용이 많이 드는 오프스크린 버퍼가 사용되기 때문에 불투명도를 사용하여 이미지 또는 색상을 직접 그리는 것이 그 위에 불투명도를 사용하는 것보다 빠릅니다. 콘텐츠를 오프스크린 버퍼로 그리면 렌더링 대상 전환이 트리거될 수도 있으며 이러한 전환은 구형 GPU에서 특히 느립니다. 예를 들어 Container(color: Color.fromRGBO(255, 0, 0, 0.5))는 Opacity(opacity
AnimatedBuilder 성능 최적화 빌더 함수에 애니메이션에 의존하지 않는 하위 트리가 포함된 경우 애니메이션 틱마다 다시 빌드하는 것보다 해당 하위 트리를 한 번 빌드하는 것이 더 효율적입니다. 사전 빌드된 하위 트리를 하위 매개변수로 전달하면 AnimatedBuilder는 빌드에 통합할 수 있도록 빌더 함수로 다시 전달합니다. 이 미리 빌드된 자식을 사용하는 것은 전적으로 선택 사항이지만 경우에 따라 성능을 크게 향상시킬 수 있으므로 좋은 방법입니다. 아래의 코드는 녹색 사각형을 계속 회전시키는 위젯을 정의합니다. AnimatedBuilder로 빌드되었으며 매번 컨테이너를 다시 빌드할 필요가 없도록 하위 기능을 사용합니다. Performance optimizations class MyStatefulWidget extends StatefulWidget { const MyStatefulWidget({super.key}); @override State<MyStatefulWidge
부팅 시간 비교 AMI Id (us-east-1) AMI Name running to port closed closed to open total ami-0f9ebbb6ab174bc24 Clear Linux 34640 1.23 0.00 1.23 ami-07d02ee1eeb0c996c Debian 10 6.26 4.09 10.35 ami-0c2b8ca1dad447f8a Amazon Linux 2 9.55 1.54 11.09 ami-09e67e426f25ce0d7 Ubuntu Server 20.04 LTS 7.39 4.65 12.04 ami-0747bdcabd34c712a Ubuntu Server 18.04 LTS 10.64 4.30 14.94 ami-03a454637e4aa453d Red Hat Enterprise Linux 8 (20210825) 13.16 2.11 15.27 ami-0ee02acd56a52998e Ubuntu Server 16.04 LTS 12.76 5.42 18.1
모노레포 개념이란? 모노레포 개념을 모른다면 아래 링크에서 확인하자 모던 프론트엔드 프로젝트 구성 기법 - 모노레포 개념 편 새로운 프로젝트를 설계하거나 기존 프로젝트가 성장하면서 규모가 커질 때 우리는 효율적인 프로젝트 구조를 고민합니다. 핀포인트 프로젝트의 프론트엔드 구조를 개선하면서 검토하고 조사했.. d2.naver.com Turborepo란? 아래의 링크에서 자세하게 설명되어 있다 Turborepo로 모노레포 개발 경험 향상하기 2022-LINE-engineering-site engineering.linecorp.com 패키지 추가 Turborepo 패키지 추가 yarn add turbo --dev turbo.json { "pipeline": { "build": { "outputs": [".next/**"] }, "lint": { "outputs": [] }, "dev": { "cache": false } } } eslintrc.js "turbo" 추가 extends: [
Info.plist 예로들어 카메라 권한인 경우 <key>NSCameraUsageDescription</key> <string>나의 프로필 이미지를 업로드 하기 위하여 접근 허용이 필요합니다</string> Podfile 이전에는 "Info.plist" 파일에 권한 항목만 추가해주면 됬으나, 정책변경으로 인해 "Podfile"에서도 어떤 권한을 받는지 활성화 해줘야 한다. Xcode에서 권한을 추가한거라면 자동으로 "1, true"로 변경해주지만, 파일로 수정한 경우에는 별도로 주석해제해 주면 된다. # permission_handler 구성 시작 target.build_configurations.each do |config| config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ '$(inherited)', ## dart: PermissionGroup.calendar # 'PERMISSION_EVENTS=1', ## dart: P
패키지 설치 sudo apt install software-properties-common sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update sudo apt install python3.11 관련 패키지 설치 sudo apt install python3.11-dev python3.11-venv python3.11-distutils python3.11-gdbm python3.11-tk python3.11-lib2to3 기본 버전 설정 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 2 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1 버전 확인 python3.11 --version 가상환경 접근 및 pip 업그레이드 가상환경 접근 python3.11
조건문 var booleanTemp = true; var numbers = [1, 2, 3, 4, if (booleanTemp) 5]; print(numbers) => [1, 2, 3, 4, 5] 반복문 var newfriends = ['lewis', 'ralph']; var currentFriends = ['darren', for (var friend in newfriends) '$friend']; print(currentFriends ) => ['darren', 'lewis', 'ralph']
Example BottomNavigation Scaffold( backgroundColor: Colors.white, body: SafeArea( child: IndexedStack( index: controller.tabIndex, children: [] ), ), bottomNavigationBar: Container( margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), height: 70.h, decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black.withOpacity(.15), blurRadius: 30, offset: const Offset(0, 10), ) ], borderRadius: BorderRadius.circular(23.r), ), child: Row( mainAxisAlignment: M
MariaDB GPG 키 가져오기 및 MariaDB APT 저장소 추가 sudo apt install software-properties-common -y curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup sudo bash mariadb_repo_setup --mariadb-server-version=10.6 MariaDB 10.6 설치 sudo apt update sudo apt install mariadb-server mariadb-client # 버전 확인 mariadb --version 초기 설정 sudo mariadb-secure-installation # 만약, 접근이 안된다면 MariaDB 실행후 진행 sudo service mariadb start # 시스템 자동 실행 sudo systemctl enable mariadb 완전삭제 sudo apt purge mariadb-server sudo r
API JSON 불러올때에 $.each(), for 사용으로 반복문으로 진행시 해당 값이 없을 경우 undefined 오류를 나타내는데, 해당 값이 없어도 진행되기 위한 방법 입니다. 불러오는 코드에 하단 try-catch 부분을 입력해주세요. 당연히 없는 값을 입력해주셔야 문제를 잡을 수 있습니다. <예시1> $.getJSON("https://min-api.cryptocompare.com/data/top/totalvolfull?limit=100&page=0&tsym=KRW", function(data) { var newHTML = []; $.each(data.Data, function(index, value) { var error_check = value.RAW.KRW; // << 반복문을 통해 출력하지만, 만약 불러오는 JSON 값에서 이 값이 "null"이 아닌 아예 없을 경우 오류가 생깁니다. newHTML.push('값 표시'); }); $("#tbody_list").htm
어느날 갑자기 단축키가 작동이 안되어 확인해보니 소프트웨어에서 중복되고 있어서 단축키를 변경하여 해결한 방법을 알려드립니다. 아무래도 다른 단축키도 비슷할 겁니다. 라데온 사용자 - 라데온 소프트웨어 실행 후 오른쪽 상단 '설정' 메뉴에서 '단축키' 이동하여 (CTRL + SHIFT + C) 단축키를 'DELETE' 키를 통해서 'NONE' 상태로 변경 - 라데온 소프트웨어에서 녹화 기능에서 단축키가 설정되어 있는 경우 작동이 안될 수도 있습니다. 그외 - 설치된 소프트웨어마다 단축키가 설정되어 있는지 확인하여 중복되어 있는 단축키를 없애 시켜주시면 됩니다.
CentOS 최신 버젼 설치 yum -y update (CentOS7을 최신버전으로 업데이트) yum install libjpeg* libpng* freetype* gd-* gcc gcc-c++ gdbm-devel libtermcap-devel (APM(아파치 + PHP + MYSQL[MARIADB])을 정상 구동하기 위하여 관련 의존성 패키지를 설치) rpm -qa libjpeg* libpng* freetype* gd-* gcc gcc-c++ gdbm-devel libtermcap-devel (의존성 패키지 설치 후 확인) 의존성 패키지 리스트 확인 ※ 사진과 리스트 및 버전은 달라질 수 있음 계정 생성 useradd 계정명 passwd 계정명 (후 비밀번호 설정) userdel 계정명 (계정 삭제) userdel -r 계정명 (홈디렉토리도 함께 삭제) 리눅스CentOS7 - 사용자 계정 생성 삭제와 비밀번호 설정 #사용자 계정 생성 사용형식 useradd 계정명 # 사용자 계정
Node.JS 설치하기 # 먼저, "Yum"에 있는 기본 6.X 버젼 설치하기 yum install -y nodejs # 버젼 확인 node -v npm -v ※ "npm"은 자동으로 같이 설치됨 버젼 확인 Node.JS 최신 버젼으로 업데이트 Node.js Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. nodejs.org # "NPM" 캐시 초기화 npm cache clean -f # "Node.JS" 다운로드 npm install -g n # "Node.JS" 설치 n 6.11.0 (nodejs 특정 버젼 설치 n 6.x.x / n 7.x.x 버젼 입력) n stable (nodejs 최신 안정화 버젼 설치) n latest (nodejs 최신 버젼 설치) # 버젼 확인 node -v npm -v # 이전 버젼과 똑같이 나온다면 재부팅 후 재확인 shutdown -r now Express 설치 #
참고 링크 https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management 자바스크립트의 메모리관리 메모리 생존주기는 프로그래밍 언어와 관계없이 비슷하다. developer.mozilla.org https://velog.io/@pa324/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%ED%84%B0 자바스크립트 - 가비지 컬렉터 가지비 컬렉터 (GC) - c와 같은 언어에는 malloc()나 free()와 같은 저수준의 메모리 관리를 위한 함수가 존재한다. 개발자들은 명시적으로 운영체제로부터 메모리를 할당 받거나 돌려주는 작업을 해야한다. - 자바스크릅트에서는 객체나 문자열등이 생겨날 때 메모리가 할당되며 더 이상 사용되지 않을때는 자동으로 메모리가 반환되는데, 이 과정을 가비... ve
Docker란 무엇인가요? https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html 초보를 위한 도커 안내서 - 도커란 무엇인가? 도커를 처음 접하는 시스템 관리자나 서버 개발자를 대상으로 도커 전반에 대해 얕고 넓은 지식을 담고 있습니다. 도커가 등장한 배경과 도커의 역사, 그리고 도커의 핵심 개념인 컨테이너와 이미지에 대해 알아보고 왜 이렇게 도커가 인기 인지 하나하나 살펴보겠습니다. subicura.com https://www.youtube.com/watch?v=tPjpcsgxgWc Docker 회원가입 https://www.docker.com/get-started Get Started with Docker | Docker Learn about the complete container solution provided by Docker. Find information for developers, IT operations
웹 최적화 팁 기본적으로 웹을 표준에 맞추어 최적화 하고 여러 구조 및 개선을 통해서 퍼포먼스를 향상 시키는 방법 입니다. 일반적인 웹사이트는 이 방법을 통해서 최소한의 로딩 속도 및 서비스 품질을 개선할 수 있기 때문에 사용자에게서 좋은 인식을 얻을 수 있습니다. ASYNC, DEFER https://webclub.tistory.com/630 브라우저의 역할과 스크립트의 로드 시점 브라우저는 어떻게 동작하는가? 사용자가 연결된 주소의 서버에 데이터 요청을 하게 되면 서버로부터 데이터를 다운로드 받은 것을 가지고 웹브라우저가 그것을 해석해서 사용자가 보는 UI 를 완성해 주게 됩니다... webclub.tistory.com
명령어 indexOf includes (ES6) search lodash match 정규식 var stringVal = "Hello world", exp = /hell/; exp.test(stringVal ); 퍼포먼스 크롬 (V~) 파이어폭스 (V~) 참고 링크 [자바스크립트]문자열에서 문자 포함 여부 [Javascript]문자열에서 문자 찾는 몇가지 방법 문자를 찾는 방법 몇가지 1. indexOf var stringVal = "javascript", substring = "java"; stringVal.indexOf(substring) !== -1; javascript의 기본객체인 string.. enzycut.tistory.com
CentOS7 nodeJS(Express) 웹서버 구축 및 최신 버젼 업데이트 CentOS7 nodeJS(Express) 웹서버 구축 및 최신 버젼 업데이트 CentOS 업데이트 및 기본 nodeJS 설치- CentOS7을 최신버전으로 업데이트 (조금 시간 소요)- epe... blog.naver.com 이전 게시글에서 nodeJS 설치까지만 진행하시면 되십니다 EXPO 회원가입 Expo Expo is an open-source platform for making universal native apps for Android, iOS, and the web with JavaScript and React. expo.io EXPO를 사용하기 위해서는 우선 회원가입을 해주세요. 매우 간단하기 때문에 설명은 참조하지 않습니다. EXPO 모바일 앱 설치 EXPO 어플리케이션(앱) 핸드폰에서 구글플레이스토어 혹은 IOS의 경우 마켓을 통해서 EXPO를 설치해주세요. "EXPO", "EXPO PR
설치 전 유의사항 "윈도우 10 프로 버젼 이상"에서만 설치 및 사용이 가능합니다. "기본 용량은 약 450MB 정도" 이지만, 설치 패키지에 따라서 용량이 늘어 날 수 있습니다. Windows 기능 켜기/끄기 경로1 : 제어판 > 프로그램 및 기능 > 왼쪽 "Windows 기능 켜기/끄기" > Linux용 Windows 하위 시스템 체크 경로2 : 설정 > 상단 검색란 "Windows 기능 켜기/끄기" > Linux용 Windows 하위 시스템 체크 ※ 위 설정을 체크 하신 후 재부팅을 꼭 해주시기 바랍니다. Linux용 Windows 하위 시스템 체크 Microsoft Store에서 우분투 설치 필요에 따라서 버젼이 있는것으로 진행하셔도 되며, 일반적인 상황에서는 맨왼쪽 "Ubuntu"를 다운로드 해주시면 됩니다. 우분투 실행 후 초기설정은 다소 몇분 소요 될 수 있습니다. 초기설정이 완료되면, 계정과 비밀번호를 입력해주시면 됩니다. 마이크로소프트 스토어에서 Ubuntu 검색 우
<IfModule deflate_module> AddOutputFilterByType \ DEFLATE \ application/javascript \ text/css \ text/html \ text/javascript \ text/plain \ text/xml </IfModule> GZIP 압축 확인 사이트 HTTP Compression Test / WhatsMyIP.org Tweet Home / HTTP Compression URL Compression Test This tool checks your server to see if it is sending out compressed data. It checks for compression via mod_gzip, mod_deflate, or any server-side language that does content compression. Enter the address of a specific page or file to ch
코로나 바이러스 관련 맵, 알리미 웹 사이트 입니다. 현재 경계지수, 확진자, 완치자, 검사자와 확진자 이동경로 등 쉽게 확인이 가능합니다. https://www.corona-virus.co.kr/ https://www.corona-virus.co.kr/
리엑트 네이티브 서버 구축 및 EXPO 연동 앱 개발 환경 만들기 CentOS7 리엑트 네이티브 서버 구축 및 EXPO 연동 앱 개발 환경 만들기 CentOS 업데이트 및 기본 nodeJS 설치기존 nodeJS 서버를 구축하는 과정까지는 동일합니다nodeJ... blog.naver.com 리엑트 네이티브 웹뷰 Import 하기 npm install --save react-native-webview or react-native link react-native-webview EXPO로 만든 프로젝트 디렉토리로 가서 위 명령어를 입력해주세요. App.js 파일 코드 수정 import React from 'react'; import { StyleSheet, Text, View } from 'react-native'; export default function App() { return ( <View style={styles.container}> <Text>Open up App.js to s
발생되는 원인? 저의 경우에는 웹브릭 이라는 곳을 통해서 HTTPS(443) 통신을 하고 있습니다. 즉, 보안인증서 없이 HTTPS를 사용중입니다. 웹브릭을 통해서 DNS를 연결하게 되면 웹브릭에서 인증서가 준비된 곳으로 리다이렉팅 식으로 하지 않을까 싶습니다. 자세한 기술적 내용은 모르겠습니다. 아무튼 저의 경우는 이렇게 진행하다 보니 phpmyadmin에서는 아파치 및 인증서 관련 셋팅이 된게 없다보니 로그인시 URL 뒤에 :80 포트가 붙게 되는것 입니다. 만약 현재 서버에 인증서가 없지만 저와 비슷한 방법으로 HTTPS를 이용하고 있다면 아래와 같은 방법으로 수정해주시면 간단하게 해결됩니다. Config.class.php 파일 수정 파일 위치 찾기 1. type ifconfig EX) ifconfig is /sbin/ifconfig 2. which ifconfig EX) /sbin/ifconfig 3. whereis ifconfig EX) ifconfig: /sbin/ifco
코로나 알림 어플은 리엑트 네이티브 웹뷰로 만든 웹사이트 입니다. 코로나 바이러스에 대한 동향과 확진자 이동경로 최근에는 31번째 확진자가 발생되었습니다. 해당 사이트는 자동으로 크롤링 하여 데이터를 선별하여 저장합니다. 곧 API 서비스도 제공될 예정입니다. API 문서는 간단한 사이트 등록으로 호출 할 수 있게 할 예정입니다. 어플의 경우 아직 버그 및 수정할 내역이 많습니다만, 기본적인 정보는 얻을 수 있습니다. 관련 업데이트는 점차 진행할 예정입니다. 많은 이용부탁드립니다. 웹사이트 https://www.corona-virus.co.kr/ 어플(안드로이드) https://play.google.com/store/apps/details?id=com.swit.coronanotify 코로나 알림
리엑트 네이티브 웹뷰 만들기 CentOS7 리엑트 네이티브 웹뷰 만들기 CentOS7 리엑트 네이티브 서버 구축 및 EXPO 연동 앱 개발 환경 만들기리엑트 네이티브 웹뷰 Impor... blog.naver.com 리엑트 네이티브 웹뷰 Import 하기 npm install --save react-native-status-bar-height ※ 해당 프로젝트 디렉토리로 이동 후 설치 import React from 'react'; import { WebView } from 'react-native-webview'; export default function App() { return ( <WebView source={{uri: 'https://www.corona-virus.co.kr'}} style={{marginTop: 20}} /> ); } 이전 코드 import React from 'react'; import { WebView } from 'react-native-webvie
앱 APK 파일 용량 줄이는 빌드 expo build:android --type app-bundle ※ 빌드시에 뒤에 타입과 앱번들을 입력해주시면 됩니다.
App.json 파일에서 아래 항목 추가 "ios": { "bundleIdentifier": "com.yourcompany.yourappname" }, "android": { "package": "com.yourcompany.yourappname" } ※ 안드로이드, IOS 둘중 해당하는것만 입력해도 됩니다.
업로드 실패 App.json 안드로이드 버전코드 추가 "android": { "package": "~~~", "versionCode": 2 } ※ "versionCode": 2 << 해당 코드를 추가해주시고, 플레이 콘솔에서 업로드시 발생하는 버전코드보다 높게 설정해주시면 됩니다. ※ 만약, 플레이 콘솔에서 APK 업데이트를 한다면 이전에 입력했던 버전코드 보다 높게 설정하면 됩니다. 버젼코드 변경 후 업로드 버젼 코드 수정후 업로드가 가능해집니다.
HTML <select id="abcde"> <option value="사과">사과</option> <option value="딸기">딸기</option> <option value="고추">고추</option> </select> 가져오기 JAVASCRIPT const select = document.getElementById('abcde'); const value = select.options[select.selectedIndex].value; 추가하기 JAVASCRIPT const select = document.getElementById('abcde'); const span = document.createElement('option'); span.setAttribute('value', '불닭볶음면'); // 만든 엘리먼트에 벨류값을 넣어줌 span.textContent = '불닭볶음면'; // 만든 엘리먼트에 텍스트 값을 넣어줌 select.appendChild(span); //
export EXPO_DEBUG=true ※ 위 명령 입력 후 재시도
카카오맵 라이브러리 사용후기 1. 최적화 첫번째로 최적화는 상당히 별로다라는 느낌이 있습니다. 네이버지도 라이브러리와 비교했을시에 웹 로드시 지연이 발생한다는 점 입니다. 지연문제 때문에 최적화에 상당히 시간이 소요되었고, 그 마저도 만족하지 못하는 부분 입니다. ※ 네이버 지도의 경우에는 로드시 지연되는 사항은 없었습니다. 하지만 검색 기능이 이제 사업자 회원에게만 제공된다고 하니 고민되는 부분입니다. 로드 지연 또한, 맵을 불러오면서 발생되는 이미지 파일들의 캐시문제 입니다. 이미지를 불러오는 과정도 네이버 지도에 비해서는 속도가 더딥니다. 자체 서버에서 캐시를 지정해도 몇개의 이미지를 제외하고는 캐시가 저장되지 않습니다. 이미지 파일 로드 2. 커스텀 카카오맵의 경우 지도에 표시되는 마커 부분을 포함한 여러 부분이 제공된 솔루션만 이용이 가능합니다. 즉, 마커를 HTML 태그로 CSS로 디자인 할 수 없습니다. 그래서 개발할때에 이미지 파일을 수정해야하는 부분이 발생되어 커
WebView WebView - Expo Documentation Hey, friend! We are co-hosting a conference with Software Mansion . Learn more here . WebView WebView renders web content in a native view. import React , { Component } from 'react' ; import { WebView } from 'react-native' ; class MyWeb extends Component { render ( ) { return ( < WebView sou... docs.expo.io source WebView에서 정적 HTML 또는 URI (선택적 헤더 포함)를로드합니다. 정적 HTML은 originWhitelist 를 ["*"] 로 설정해야합니다. source 전달 된 객체는 다음 모양 중 하나를 가질 수 있습니다. 로드 uri uri (string)
D3.js Gallery An Observable notebook by D3. observablehq.com JSCharting JavaScript Charts for Developers | JSCharting < > Financial Summary Number of shops Explore JSCharting Gallery A chart type for every need, on every device! Including bar and column charts, lines, splines, steplines, advanced combination types, finance, stock charts, pies, donuts, and scatter charts plus new types on every JSCharting release! F... jscharting.com Highcharts Interactive JavaScript charts for your webpage |
Echarts를 추천 Apache ECharts (incubating) Free to use Open sourced under Apache-2.0 License Rich Features Caters for all needs Active Community GitHub Stars Brand-new v4.0 Rendering ability for ten-million-level data Supports both SVG and Canvas rendering Seperates data and style configuring Accessibility supports Wechart and Powerpoint sup... www.echartsjs.com Ehcarts를 추천하는 이유는 다른 차트에 비해서 모자란 부분이 전혀 없고, 퍼포먼스 부분에서도 우수 합니다. Echarts는 아파치 재단에서 지원받는것 같고, 중국에서 만든 차트 라이브러리 입니다. Echarts를 사용하기전에 여러 차트 라이브
기존 PHP 제거 # PHP 관련설치 목록 확인 yum list installed | grep php # PHP 관련 제거 yum remove php-* yum remove php-common mod_php php-cli PHP 최신 및 버젼별 설치 # 레포 설치 및 PHP 최신 버젼 다운로드 yum install -y epel-release yum-utils yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm ----- # PHP 7.0 버전 yum-config-manager --enable remi-php70 # PHP 7.1 버전 yum-config-manager --enable remi-php71 # PHP 7.2 버전 yum-config-manager --enable remi-php72 # PHP 7.3 버전 yum-config-manager --enable remi-php73 # PHP 7.4 버전(
서트봇 설치하기 certbot # 우선 적용하기 앞서 Let's Encrypt 인증서를 발급받는 과정에서 발생하는 "Unable to find a virtual host listening on port 80..." 관련 오류를 포함한 내용입니다. ※ 먼저 도메인이 필요하며 DNS에 연동되어 있어야 합니다. # "epel" 저장소 설치 yum install -y epel-release # "yum-utils" 설치 yum install -y yum-utils yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional # "certbot" 설치 yum install -y certbot python2-certbot-apache 아파치 설정 httpd.conf # "httpd.conf" 수정하기 vi /etc/httpd/conf/httpd.conf # 아래 "ServerName"과 "D
레포지토리 설정 # 파일 생성 vi /etc/yum.repos.d/MariaDB.repo # 파일 생성 후 입력 저장 [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.4/centos7-amd64 gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck = 1 MariaDB 설치 yum -y install MariaDB systemctl start mariadb systemctl enable mariadb.service 계정 비번 변경 # MariaDB 초기 설정 "Set root password"에서 엔터 후 사용할 비밀번호 2번 입력 후 모두 엔터 입력해주시면 됩니다. 최초 계정에는 비밀번호가 없기 때문에 엔터 후 비밀번호 설정 하신 후 모두 엔터하시면 됩니다. sudo mysql_secure_installation ※ 위 MariaDB 서비스를 시작해야 오류가 발생되
phpMyAdmin 최신버젼 설치 yum install epel-release rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum --enablerepo=remi install -y phpmyadmin ----- // PHP 버젼이 PHP 5.4 이거나 이하인 경우는 아래와 같이 yum --enablerepo=remi,remi-test install phpmyadmin phpMyAdmin.conf 파일 수정 vi /etc/httpd/conf.d/phpMyAdmin.conf // <RequireAny> 없이 추가해도 됨 <RequireAny> </RequireAny> 웹에서 phpMyAdmin 접속을 위한 설정 PHP와 버전이 맞지 않아 발생되는 오류 (Deprecation Notice in ./libraries/common.inc.php#261 Function get_magic_quotes_gpc() is
도커 명령어 명령어 설명 sudo docker run -itd --name 이름 ubuntu:18.04 컨테이너 생성 후 접속 sudo docker container run --restart always -d -p 80:80 --name 이름 ubuntu:18.04 컨테이너 포트 80:80으로 설정 후 접속 sudo docker run -d -p 80:80 -itd --name 이름 ubuntu:18.04 컨테이너 포트 80:80으로 설정 후 접속 sudo docker create -it --rm --name 이름 ubuntu:18.04 컨테이너 생성만 sudo docker start 이름 컨테이너 실행 sudo docker stop 이름 컨테이너 중지 sudo docker exec -it 이름 bash 컨테이너 접속 sudo docker ps 구동중인 컨테이너 확인 sudo docker rm 이름 컨테이너 삭제 exit 컨테이너 나가기 sudo docker images 이미지 리스
구버젼 설치 기본 버젼 설치 후 업데이트 # 아파치 구버젼 설치 yum install -y httpd # 아파치 자동시작 등록 및 시작 systemctl enable httpd systemctl start httpd 버젼 확인 yum info httpd 아파치(Apache) 버젼 확인 최신 버젼 업데이트 # APM 설치시 관련 의존성 패키지를 설치 # APM(아파치 + PHP + MYSQL[MARIADB])을 정상 구동하기 위하여 관련 의존성 패키지를 설치 yum install -y libjpeg* libpng* freetype* gd-* gcc gcc-c++ gdbm-devel libtermcap-devel ----- # 아파치 최신 버젼을 다운로드 하기 위한 레포 설치 및 다운로드 yum install -y epel-release wget cd /etc/yum.repos.d && wget https://repo.codeit.guru/codeit.el`rpm -q --qf "%{V
Apache 아파치(httpd) 버젼 체크 최소 2.4.17 버젼 이상 필요합니다. 2.4.17 버젼에서 지원되는 mod_http2를 사용합니다. // 아파치 버젼 체크 yum info httpd httpd.conf 설정 vi /etc/httpd/conf/httpd.conf // 맨 하단에 추가 LoadModule http2_module modules/mod_http2.so <IfModule http2_module> ProtocolsHonorOrder On Protocols h2 h2c http/1.1 </IfModule> // httpd 재시작 systemctl restart httpd 관리자 콘솔 프로토콜 추가 1. 크롬 관리자 콘솔(F12) 2. Network 3. All, XHR, JS, CSS 등 아무거나 탭 클릭 4. 리스트에 상단에 Name, Status 마우스 오른쪽 클릭 후 Protocol 체크 5. 리스트에 Protocol 목록이 추가되고 h2 확인 프로토콜 h2
https://xe1.xpressengine.com/tip/23021383 SSL의 정석 (아파치 & nginx) - 웹마스터 팁 - XpressEngine 서버에 SSL을 설치할 때 인증서는 어찌어찌 집어넣으면 되는데, 그 밖의 설정들에는 별로 신경쓰지 않는 경우가 대부분입니다. 실제 보안은 인증서가 아닌 그 밖의 설정들이 좌우하는데 말이죠. 그래서 몇십만 원짜리 최고급 인증서를 샀는데도 불구하고 SSL Server Test 사이트에서 검사를 해보면 몇천 원짜리 인증서를 사용하는 사이트보다 오히려 못한 경우가 수두룩해요. 이 글에서는 SSL 인증서를 구입하고 아파치와... xe1.xpressengine.com https://www.ssllabs.com/ssltest/ SSL Server Test (Powered by Qualys SSL Labs) Hostname: Do not show the results on the boards Recent Best A+ tickets.azbro
기본 경로 변경하기 vi /etc/httpd/conf.d/phpMyAdmin.conf // 아래 내용 주석처리 변경 전 > Alias /phpMyAdmin /usr/share/phpMyAdmin 변경 전 > Alias /phpmyadmin /usr/share/phpMyAdmin 변경 후 > #Alias /phpMyAdmin /usr/share/phpMyAdmin 변경 후 > #Alias /phpmyadmin /usr/share/phpMyAdmin // 아래 내용 추가 Alias /mariaDB /usr/share/phpMyAdmin ※ 위 처럼 설정시 도메인주소/phpmyadmin으로 접속이 안되며, 새로 설정한 도메인/mariaDB 이렇게 이동됩니다. HTTP 인증으로 보호 vi /etc/httpd/conf.d/phpMyAdmin.conf <Directory /usr/share/phpMyAdmin/> AddDefaultCharset UTF-8 AllowOverride All //
http://www.qdata.co.kr/bo/bbs/board.php?bo_table=pht&wr_id=77 PHP에서 성능 개선을 위한 유용한 팁 > PHP Tip | 큐디 PHP Tip PHP에서 성능 개선을 위한 유용한 팁 페이지 정보 작성자 이즈 댓글 0건 조회 5,493회 작성일 07-05-18 18:08 본문 1. 최대한 쌍따옴표 대신에 일반따옴표를 쓴다. 쌍따옴표로 감산 문자열의 경우 PHP는 문자열 전체를 처리하게 됩니다. 따라서 처리되지 않고 그대로 유지될 혹은 나중에 처리되어야할 문자열의 경우 일반따옴표를 쓰는 것이 좋습니다. 예) $string = '문자열'; 문자열 중간에 변수가 삽입될 경우에도 최대한 일반 따옴표를 쓰는 것이 좋지요. 예) $string = '문자열1' . $str... www.qdata.co.kr
.htaccess 활성화 vi /etc/httpd/conf/httpd.conf // 아래의 이미지에 있는 내용을 찾아서 All 으로 변경 변경 전 > AllowOverride None 변경 후 > AllowOverride All httpd.conf 활성화 .htaccess 생성 보안이 필요한 폴더에 생성합니다. 생성 후 아래와 같이 내용을 입력해주세요. AuthType Basic AuthName "Admin Login" AuthUserFile /etc/httpd/파일이름 Require valid-user // 상단의 파일이름은 /etc/httpd 폴더 안에 htpasswd을 설정할 파일을 저장할겁니다. // 즉 아파치에서 인식할 수 있는 유저 아이디와 비밀번호를 저장한 파일일 뿐 입니다. // 파일의 내용은 아래와 같이 되어 있습니다. (수정할 필요 없으니 참고만 하시면 됩니다.) // 설정한아이디:$apr1$ep26/암호화된 비밀번호. 계정을 담은 htpasswd 파일 생성 htp
httpd.conf 수정 방법 vi /etc/httpd/conf/httpd.conf 변경 전 > Options Indexes FollowSymlinks 변경 후 > Options FollowSymlinks // Indexes 제거 systemctl restart httpd 버츄얼호스트(SSL)에 추가하는 다른 방법 vi /etc/httpd/conf.d/ssl.conf // 찾기 <VirtualHost _default_:443> OR <VirtualHost *:443> // <VirtualHost ~:443> 시작되는 부분 안쪽에다가 따로 만들어서 추가 <Directory : "홈디렉토리주소입력"> // EX /var/www Options FollowSymlinks </Directory> systemctl restart httpd 모두 안될경우 임시방편 vi /etc/httpd/conf/httpd.conf // 찾기 <IfModule dir_module> DirectoryIndex i
아파치 설치 apt update apt autoremove // 아파치 설치 2.4.29 apt install -y apache2 apt install -y ssl-cert apt install -y certbot // 아파치 모듈 활성 a2enmod rewrite a2enmod headers a2enmod ssl a2dismod -f autoindex // 아파치 환결설정 및 문법검사 apache2ctl -S // 아파치 실행 service apache2 restart // 아파치 버젼확인 apache2 -v 아파치 언어셋 변경 vi /etc/apache2/conf-available/charset.conf AddDefaultCharset UTF-8 // 앞 주석 제거 및 값을 UTF-8으로 변경 charset.conf 아파치 보안 설정 vi /etc/apache2/conf-available/security.conf security.conf // 센토스에서는 기본 설정이 httpd.
PHP 설치 // PHP 7.2.24 버젼 설치 apt install php // 버젼 확인 php -v PHP 모듈(의존성 패키지) 설치 apt install php-mbstring php-gd php-curl php-xml php-bcmath php-oauth php-mysql composer PHP 보안 설정 vi /etc/apache2/mods-available/php7.2.conf // 하단 내용을 추가 <FilesMatch ".+\.ph(p3|p4|p5|p7|ar|t|tml)$"> Require all denied </FilesMatch> php7.2.conf vi /etc/php/7.2/apache2/php.ini // 편집기를 연후 /timezone 타이핑 하여 검색 // 주석제거 후 수정 date.timezone = Asia/Seoul // 위 설정 모두 진행 후 아파치 재시작 service apache2 restart ※ 타임존 설정 후 phpinfo에서 date
MariaDB(MySql) 설치 // 클라이언트, 서버 설치 apt install -y mysql-client mysql-server // 버젼 확인 mysql --version OR mysqladmin version MariaDB(MySql) 계정 및 초기 설정 sudo mysql_secure_installation MariaDB(MySql) 언어셋 설정 vi /etc/mysql/mysql.conf.d/override.cnf // 아래 내용 입력 후 저장 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci query_cache_type = ON query_cache_limit = 4M query_cache_size = 64M sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ----- // 문법 검사 (오류가 있는지 확인) mysqld --verbo
phpMyAdmin 설치 apt install phpmyadmin ※ 설치 진행시 아래 이미지를 참고해주세요. apache2 선택 NO 선택 ※ 만약 Yes 선택 할 경우 이미 MYSQL 설정까지 완료된 상태라서 오류가 발생됩니다. 그런 경우는 아래와 같이 제거 후 재설치 합니다. phpMyAdmin 웹 접속 설정 vi /etc/apache2/apache2.conf // 맨 하단에 추가 Include /etc/phpmyadmin/apache.conf // 아파치 재시작 service apache2 restart // 도메인 접속 도메인/phpmyadmin phpMyAdmin 삭제 apt purge phpmyadmin 참고링크 APM(Apache2+Php7.2+Mysql)설정 및 세팅(Ubuntu 18.04) 이번에는 서버를 운영하기 위한 설정을 준비 해보도록 하겠습니다. 서버를 위해 apche, php, mysql을 설치해야 합니다. 단, 저는 Ubuntu 18.04버전에 맞추어 설
계정 생성 # root 계정으로 로그인한 경우 mysql # 이외 계정으로 로그인한 경우 sudo su mysql -u root -p create user '아이디'@'%' identified by '비밀번호'; grant all privileges on *.* to '아이디'@'%'; ※ 비밀번호 생성이 안되는 경우 대문자 한개를 포함 모든 권한 부여 grant all privileges on 스키마.테이블 to '계정'@'localhost' identified by '비밀번호'; grant all privileges on 스키마.테이블 to '계정'@'%' identified by '비밀번호'; 특정 테이블 권한 부여 grant select on db스키마.* to `계정이름`@`localhost` identified by '비밀번호'; grant select on db스키마.* to `계정이름`@`%` identified by '비밀번호'; 참고 링크 phpMyAdmin roo
Composer(컴포저) 설치 yum install -y php-cli php-zip wget unzip php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" HASH="$(wget -q -O - https://composer.github.io/installer.sig)" php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" // 출력 확인 Installer verified php composer-setup.php --install-dir=/usr/local/bin --filename=composer // 출력 확인 All settings cor
CodeIgniter4(코드이그나이터4) 설치를 위한 사전 조건 PHP 버전 7.2 이상이 필요하며, *intl* 확장 기능(Extension)이 설치되어 있어야 합니다. ----- 서버에 다음 PHP 확장 기능을 사용하도록 설정해야 합니다 php-json, php-mbstring, php-mysqlnd, php-xml CURLRequest를 사용하려면 libcurl이 설치되어 있어야 합니다. ----- 대부분의 웹 어플리케이션은 데이터베이스가 필요합니다. 현재 지원되는 데이터베이스는 다음과 같습니다. MySQL (5.1+) via the MySQLi driver PostgreSQL via the Postgre driver SQLite3 via the SQLite3 driver ----- CodeIgniter4용으로 일부 드라이버가 변환/재작성되지 않았습니다. 아래는 아직 완결되지 않은 항목입니다. MySQL (5.1+) via the pdo driver Oracle via the
include, include_once, require, require_once // 외부 PHP 파일을 특정 PHP파일 안으로 코드를 가져오는 부분 include include_once require require_once ※ _once가 붙은 경우 한번만 가져오며, 중복으로 입력하더라도 한번만 가져옵니다. 예제 include '/var/www/html/test.php'; include_once '/var/www/html/test.php'; require '/var/www/html/test.php'; require_once '/var/www/html/test.php'; OR include('/var/www/html/test.php'); include_once('/var/www/html/test.php'); require('/var/www/html/test.php'); require_once('/var/www/html/test.php'); 참고 링크 include와 namespace
Namespace // 외부에서 파일을 가져왔는데 중복된 함수가 있는 경우 구분하기 위함 namespace language\en; // 두개의 파일을 인클루드 require_once 'greeting_ko.php'; require_once 'greeting_en.php'; // 인클루드한 파일 안에 동일한 함수가 있으며, 호출한 경우 echo welcome(); echo welcome(); // 아래와 같이 중복되기 때문에 에러를 발생 Fatal error: Cannot redeclare welcome() (previously declared in D:\BitNami\wampstack-5.4.12-0\apache2\htdocs\include\greeting_ko.php:3) in D:\BitNami\wampstack-5.4.12-0\apache2\htdocs\include\greeting_en.php on line 4 ----- // 인클루드한 각 파일안에 네임스페이스로 지정을 해주
Class 생성 class MyFileObject { function isFile() { return is_file('data.txt'); } } $file = new MyFileObject(); $file -> isFile(); 참고 링크 : https://opentutorials.org/course/3018/15726 Class 부모, 자식 생성 // 부모 class SplFileObject { } // 자식(부모를 상속) class MyFileObject extends SplFileObject { function getContents() { } } 참고 링크 : https://opentutorials.org/course/3018/15726 construct class MyFileObject { // __construct function __construct($fname) { $this -> filename = $fname; } function isFile() { return i
// 데이터베이스에서 데이터를 추출합니다. SELECT // 데이터베이스의 데이터를 업데이트합니다. UPDATE // 데이터베이스에서 데이터를 삭제합니다. DELETE // 데이터베이스에 새 데이터를 삽입합니다. INSERT INTO // 새 데이터베이스를 만듭니다. CREATE DATABASE // 데이터베이스를 수정합니다. ALTER DATABASE // 새 테이블을 만듭니다. CREATE TABLE // 테이블을 수정합니다. ALTER TABLE // 테이블을 삭제합니다. DROP TABLE // 인덱스를 생성합니다. (검색 키) CREATE INDEX // 색인을 삭제합니다. DROP INDEX 참고 링크 SQL Syntax SQL Syntax ❮ Previous Next ❯ Database Tables A database most often contains one or more tables. Each table is identified by a name (e.g. "Cust
SELECT SELECT 문은 데이터베이스에서 데이터를 선택하는 데 사용됩니다. 반환되는 데이터는 결과 집합이라는 결과 테이블에 저장됩니다. SELECT * FROM 테이블; SELECT 컬럼1 FROM 테이블; SELECT 컬럼1, 컬럼2, ... FROM 테이블; 참고 링크 SQL SELECT Statement SQL SELECT Statement ❮ Previous Next ❯ The SQL SELECT Statement The SELECT statement is used to select data from a database. The data returned is stored in a result table, called the result-set. SELECT Syntax SELECT column1 , column2, ... FROM table_name ; Here, column1, column2, ... are the field n... www.w3schools.com
DISTINCT SELECT DISTINCT 문은 고유한(다른) 값만 반환하는 데 사용됩니다. 테이블 안에 있는 열에는 여러 개의 중복된 값이 포함되어 있는 경우가 많습니다. 때로는 서로 다른(분명한) 값만 나열하려고 할 수도 있습니다. // 중복된 값을 제외 SELECT DISTINCT 컬럼명 FROM 테이블; // 여러개의 컬럼명을 지정할 경우 SELECT DISTINCT 컬럼명1, 컬럼명2, ... FROM 테이블; // 총 개수를 확인할때에도 중복 데이터를 제외 SELECT COUNT(DISTINCT 컬럼명) FROM 테이블; 참고 링크 SQL SELECT DISTINCT Statement SQL SELECT DISTINCT Statement ❮ Previous Next ❯ The SQL SELECT DISTINCT Statement The SELECT DISTINCT statement is used to return only distinct (different) values
WHERE WHERE 절은 레코드를 필터링하는 데 사용됩니다. WHERE 절은 지정된 조건을 충족하는 레코드만 추출하는 데 사용됩니다. SELECT * FROM 테이블 WHERE 조건컬럼; SELECT 컬럼1 FROM 테이블 WHERE 조건컬럼; SELECT 컬럼1, 컬럼2, ... FROM 테이블 WHERE 조건컬럼; SELECT COUNT(DISTINCT 컬럼명) FROM 테이블 WHERE 조건컬럼; AND // 행이 탐색 조건의 두 술부 모두를 충족해야 함 SELECT 컬럼1, 컬럼2, ... FROM 테이블 WHERE 조건컬럼1 AND 조건컬럼2; SELECT 컬럼1, 컬럼2, ... FROM 테이블 WHERE 조건컬럼1 AND 조건컬럼2 AND 조건컬럼3 ...; // 부정일때(포함하지 않아야 할때) NOT SELECT 컬럼1, 컬럼2, ... FROM 테이블 WHERE 조건컬럼1 AND NOT 조건컬럼2; OR // 행이 탐색 조건의 두 술부 중 하나 또는 모두로 설정된
ORDER BY ORDER BY 키워드는 결과 집합을 오름차순 또는 내림차순으로 정렬하는 데 사용됩니다. ORDER BY 키워드는 기본적으로 레코드를 오름차순으로 정렬합니다. 레코드를 내림차순으로 정렬하려면 DESC 키워드를 사용합니다. // "컬럼3", "컬럼4" 지정하여 특정 컬럼을 기준으로 오름차순, 내림차순으로 정렬 // 맨뒤 ASC|DESC 둘중 하나만 입력하면 된다 SELECT 컬럼1, 컬럼2, ... FROM 테이블 ORDER BY 컬럼3, 컬럼4 ... ASC|DESC; 예제 // 다음 SQL 문은 "고객" 테이블에서 "국가" 열별로 정렬된 모든 고객을 선택합니다. SELECT * FROM Customers ORDER BY Country; ----- // 다음 SQL 문은 "고객" 테이블에서 "국가" 열별로 정렬된 모든 고객을 선택합니다. SELECT * FROM Customers ORDER BY Country DESC; ----- // 다음 SQL 문은 "Custom
INSERT INTO INSERT INTO 문은 테이블에 새 레코드를 삽입하는 데 사용됩니다. // INSERT INTO 문을 두 가지 방법으로 작성할 수 있습니다. // 첫 번째 방법은 열 이름과 삽입할 값을 모두 지정합니다. INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); ----- // 테이블의 모든 열에 대한 값을 추가하는 경우에는 SQL 조회에 열 이름을 지정할 필요가 없습니다. // 그러나 값의 순서가 표의 열과 동일한 순서로 되어 있는지 확인합니다. INSERT INTO 구문은 다음과 같습니다. INSERT INTO table_name VALUES (value1, value2, value3, ...); 예제 // 다음 SQL 문은 "고객" 테이블에 새 레코드를 삽입합니다. INSERT INTO Customers (CustomerName, ContactN
NULL NULL 값이 있는 필드는 값이 없는 필드입니다. 테이블의 필드가 선택 사항인 경우 이 필드에 값을 추가하지 않고 새 레코드를 삽입하거나 레코드를 업데이트할 수 있습니다. 그러면 필드가 NULL 값으로 저장됩니다. ※ 참고: NULL 값은 0 값 또는 공백을 포함하는 필드와 다릅니다. NULL 값이 있는 필드는 레코드 생성 중에 비어 있는 필드입니다! // =, < 또는 <>과 같은 비교 연산자를 사용하여 NULL 값을 테스트할 수 없습니다. // 대신 IS NULL 및 NULL 연산자를 사용해야 합니다. SELECT column_names FROM table_name WHERE column_name IS NULL; ----- SELECT column_names FROM table_name WHERE column_name IS NOT NULL; IS NULL IS NULL 연산자는 빈 값(NULL 값)을 테스트하는 데 사용됩니다. // 다음 SQL은 "주소" 필드에 NULL
Update UPDATE 문은 테이블의 기존 레코드를 수정하는 데 사용됩니다. ※ 테이블의 레코드를 업데이트할 때 주의해야 합니다! UPDATE 문에서 WHERE 절을 확인합니다. WHERE 절은 업데이트할 레코드를 지정합니다. WHERE 절을 생략하면 테이블의 모든 레코드가 업데이트됩니다! UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition; 예제 UPDATE Customers SET ContactName = 'Alfred Schmidt', City= 'Frankfurt' WHERE CustomerID = 1; Update Multiple 업데이트할 레코드의 수를 결정하는 것은 WHERE 절입니다. ※ 레코드를 업데이트할 때 주의해야 합니다. WHERE 절을 생략하면 모든 레코드가 업데이트됩니다! // 다음 SQL 문은 국가가 "멕시코"인 모든 레코드에 대해 연락처 이름을 "Juan"으로 업데이
Delete DELETE 문은 테이블의 기존 레코드를 삭제하는 데 사용됩니다. ※ 테이블에서 레코드를 삭제할 때 주의해야 합니다! DELETE 문에서 WHERE 절을 확인합니다. WHERE 절은 삭제할 레코드를 지정합니다. WHERE 절을 생략하면 테이블의 모든 레코드가 삭제됩니다! DELETE FROM table_name WHERE condition; 예제 // 다음 SQL 문은 "고객" 테이블에서 고객 "Alfreds Futterkiste"를 삭제합니다. DELETE FROM Customers WHERE CustomerName='Alfreds Futterkiste'; Delete All Records // 테이블을 삭제하지 않고 테이블의 모든 행을 삭제할 수 있습니다. // 즉, 테이블 구조, 특성 및 인덱스는 그대로 유지됩니다. DELETE FROM table_name; 참고 링크 SQL DELETE Statement SQL DELETE Statement ❮ Previous N
LIMIT, SELECT TOP LIMIT 절은 반환할 레코드 수를 지정하는 데 사용됩니다. LIMIT 절은 수천 개의 레코드가 있는 큰 테이블에서 유용합니다. 많은 수의 레코드를 반환하면 성능에 영향을 줄 수 있습니다. ※ 일부 데이터베이스 시스템은 SELECT TOP 절을 지원하지 않습니다. MySQL은 제한된 수의 레코드를 선택할 수 있는 LIMIT 절을 지원하며 Oracle은 ROWNUM을 사용합니다. SELECT column_name(s) FROM table_name WHERE condition LIMIT number; 예제 // 다음 SQL 문은 LIMIT 절(MySQL의 경우)을 사용한 동등한 예를 보여 줍니다. SELECT * FROM Customers LIMIT 3; SELECT * FROM Customers WHERE Country='Germany' LIMIT 3; 참고 링크 SQL TOP, LIMIT or ROWNUM Clause SQL TOP, LIMIT or
MIN, MAX MIN() 함수는 선택한 열의 가장 작은 값을 반환합니다. MAX() 함수는 선택한 열의 가장 큰 값을 반환합니다. // MIN() SELECT MIN(column_name) FROM table_name WHERE condition; ----- // MAX() SELECT MAX(column_name) FROM table_name WHERE condition; 예제 // MIN() // 다음 SQL 문에서 가장 저렴한 제품의 가격을 확인할 수 있습니다. SELECT MIN(Price) AS SmallestPrice FROM Products; ----- // MAX() // 다음 SQL 문은 가장 비싼 제품의 가격을 찾습니다. SELECT MAX(Price) AS LargestPrice FROM Products; 참고 링크 SQL MIN() and MAX() Functions SQL MIN() and MAX() Functions ❮ Previous Next ❯ The
COUNT(), AVG() and SUM() COUNT() 함수는 지정된 기준과 일치하는 행 수를 반환합니다. AVG() 함수는 숫자 열의 평균 값을 반환합니다. SUM() 함수는 숫자 열의 총합계를 반환합니다. // COUNT() 일치하는 행수(총수) SELECT COUNT(column_name) FROM table_name WHERE condition; // AVG() 열의 평균 값 SELECT AVG(column_name) FROM table_name WHERE condition; // SUM() 열의 총합계 SELECT SUM(column_name) FROM table_name WHERE condition; 예제 // COUNT() // 다음 SQL 문은 제품 수(총수)를 찾습니다. SELECT COUNT(ProductID) FROM Products; // AVG() // 다음 SQL 문은 모든 제품의 평균 가격을 찾습니다. SELECT AVG(Price) FROM Produ
LIKE LIKE 연산자는 WHERE 절에서 열의 지정된 패턴을 검색하는 데 사용됩니다. LIKE 연산자와 함께 사용되는 와일드카드는 두 개입니다. % - 백분율 기호는 0, 1 또는 여러 문자를 나타냅니다. _ - 밑줄은 단일 문자를 나타냅니다. SELECT column1, column2, ... FROM table_name WHERE columnN LIKE pattern; ※ AND 또는 OR 연산자를 사용하여 원하는 수의 조건을 결합할 수도 있습니다. LIKE 연산자 종류 설명 WHERE CustomerName LIKE 'a%' "a"로 시작하는 값을 찾습니다. WHERE CustomerName LIKE '%a' "a"로 끝나는 값을 찾습니다. WHERE CustomerName LIKE '%or%' 임의의 위치에 "또는"가 있는 값을 찾습니다. WHERE CustomerName LIKE '_r%' 두 번째 위치에 "r"이 있는 값을 찾습니다. WHERE CustomerName
Wildcards 와일드카드 문자는 문자열에서 하나 이상의 문자를 대체하는 데 사용됩니다. 와일드카드 문자는 SQL LIKE 연산자와 함께 사용됩니다. LIKE 연산자는 WHERE 절에서 열의 지정된 패턴을 검색하는 데 사용됩니다. 심볼 설명 예제 % 0개 이상의 문자를 나타냅니다. bl% finds bl, black, blue, and blob _ 단일 문자를 나타냅니다. h_t finds hot, hat, and hit [] 괄호 안에 있는 모든 문자를 나타냅니다. h[oa]t finds hot and hat, but not hit ^ 괄호 안에 없는 문자를 나타냅니다. h[^oa]t finds hit, but not hot and hat - 문자 범위를 나타냅니다. c[a-b]t finds cat and cbt 모든 와일드카드(심볼)를 조합하여 사용할 수도 있습니다! 다음은 '%' 및 '_' 와일드카드를 사용하는 여러 LIKE 연산자를 보여 주는 몇 가지 예입니다. LIKE 설
IN IN 연산자를 사용하면 WHERE 절에 여러 값을 지정할 수 있습니다. IN 연산자는 여러 OR 조건에 대한 속기입니다. SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...); OR SELECT column_name(s) FROM table_name WHERE column_name IN (SELECT STATEMENT); 예제 // 다음 SQL 문은 "독일", "프랑스" 또는 "영국"에 위치한 모든 고객을 선택합니다. SELECT * FROM Customers WHERE Country IN ('Germany', 'France', 'UK'); // 다음 SQL 문은 "독일", "프랑스" 또는 "영국"에 있지 않은 모든 고객을 선택합니다. SELECT * FROM Customers WHERE Country NOT IN ('Germany', 'France', 'UK'); // 다음 SQL 문은
BETWEEN BETWEEN 연산자는 지정된 범위 내에서 값을 선택합니다. 값은 숫자, 텍스트 또는 날짜일 수 있습니다. BETWEEN 연산자는 다음을 포함합니다. 시작 및 끝 값이 포함됩니다. SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2; 예제 // 다음 SQL 문은 가격 BETWEEN 10 및 20의 모든 제품을 선택합니다. SELECT * FROM Products WHERE Price BETWEEN 10 AND 20; // 이전 예제의 범위를 벗어나는 제품을 표시하려면 다음을 사용합니다. SELECT * FROM Products WHERE Price NOT BETWEEN 10 AND 20; // 다음 SQL 문은 가격 BETWEEN 10 및 20의 모든 제품을 선택합니다. // 또한 범주가 있는 제품을 표시하지 않습니다. ID는 1,2 또는 3입니다. SELECT * FROM
Aliases(AS) SQL 별칭은 테이블 또는 테이블의 열을 임시 이름으로 지정하는 데 사용됩니다. 별칭은 종종 열 이름을 더 읽기 쉽게 만드는 데 사용됩니다. 별칭은 쿼리 기간 동안만 존재합니다. Aliases(AS) 컬럼 SELECT column_name AS alias_name FROM table_name; ----- Aliases(AS) 테이블 SELECT column_name(s) FROM table_name AS alias_name; 예제 // 다음 SQL 문은 고객을 위한 별칭 2개를 생성합니다. // ID 열과 CustomerName 열에 대한 열은 다음과 같습니다. SELECT CustomerID AS ID, CustomerName AS Customer FROM Customers; // 다음 SQL 문은 CustomerName 열에 대한 별칭과 ContactName 열에 대한 별칭 두 개를 생성합니다. // 참고 : 별칭 이름에 공백이 포함된 경우 큰따옴표 또는 대
JOIN JOIN 절은 두 개 이상의 테이블에서 행을 결합하는 데 사용되며, 두 테이블 사이의 관련 열을 기반으로 합니다. SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID; JOIN의 유형 (INNER) JOIN : 두 표에 일치하는 값이 있는 레코드를 반환합니다. LEFT(OUTER) JOIN : 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 반환합니다. RIGHT(OUTER) JOIN : 오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 반환합니다. FULL(OUTER) JOIN : 왼쪽 또는 오른쪽 테이블에 일치 항목이 있을 때 모든 레코드를 반환합니다. 출처 : w3school INNER JOIN INNER JOIN 키워드는 두 테이블에서 일치하는 값
UNION UNION 연산자는 두 개 이상의 SELECT 문 결과 집합을 결합하는 데 사용됩니다. UNION 내의 각 SELECT 문에는 동일한 열 수가 있어야 합니다. 열에도 유사한 데이터 유형이 있어야 합니다. 각 SELECT 문의 열도 순서가 같아야 합니다. SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; // UNION 연산자는 기본적으로 고유한 값만 선택합니다. // 중복 값을 허용하려면 UNION ALL을 사용합니다. // 참고 : 결과 집합의 열 이름은 일반적으로 UNION의 첫 번째 SELECT 문에서 열 이름과 동일합니다. SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2; 예제 // 다음 SQL 문은 "고객" 표와 "공급업체" 표의 도시(별개의 값만)를 반환합니다. // 참고 : 일부 고객 또
GROUP BY GROUP BY 문에서는 동일한 값을 가진 행을 "각 국가의 고객 수 찾기"와 같이 요약 행으로 그룹화합니다. GROUP BY 문을 집계 함수(COUNT, MAX, MIN, SUM, AVG)와 함께 사용하여 결과 집합을 하나 이상의 열로 그룹화하는 경우가 많습니다. SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) ORDER BY column_name(s); 예제 // 다음 SQL 문에는 각 국가의 고객 수가 나열되어 있습니다. SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country; ----- // 다음 SQL 문은 각 국가의 고객 수를 높음에서 낮음으로 정렬하여 나열합니다. SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country ORDER BY COUN
HAVING (GROUP BY) HAVING은 간단하게 생각해서 GROUP BY 결과에 조건을 추가할때에 사용할 수 있습니다. GROUP BY의 WHERE 절과 같다고 보면 되지만, GROUP BY 다음에 사용가능하며 WHERE 에는 사용이 불가합니다. 즉, GROUP BY 절에서 조건을 주려면 WHERE가 아닌, HAVING 절을 사용해야 합니다. SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING condition ORDER BY column_name(s); 예제 // 다음 SQL 문에는 각 국가의 고객 수가 나열되어 있습니다. 고객이 5명 이상인 국가만 포함합니다. SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country HAVING COUNT(CustomerID) > 5; ----- // 다음 SQL 문에는 각 국가의
EXISTS EXISTS 연산자는 하위 쿼리에 있는 모든 레코드의 존재를 테스트하는 데 사용됩니다. 하위 쿼리가 하나 이상의 레코드를 반환하는 경우 EXISTS 연산자는 true를 반환합니다. 즉, 두 테이블 간의 결과의 특정 값이 존재하는지에 대한 유무를 판단합니다. SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition); 예제 // 다음 SQL 문은 TRUE를 반환하고 제품 가격이 20 미만인 공급업체를 나열합니다. SELECT SupplierName FROM Suppliers WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.supplierID AND Price < 20); ----- // 다음 SQL 문은 TRUE를 반환하고 22에 해당하는 제품
ANY and ALL Operators 모든 연산자와 모든 연산자는 WHERE 또는 HVING 절과 함께 사용됩니다. IN : 조건절에서 사용하며 다수의 비교값과 비교하여 비교값 중 하나라도 같은 값이 있다면 true를 반환합니다. ANY : 하위 쿼리 값 중 하나가 조건을 충족하면 모든 연산자는 true를 반환합니다. ALL :모든 하위 쿼리 값이 조건을 충족하면 ALL 연산자는 true를 반환합니다. ※ 아래 내용으로 이해가 어렵다면, 하단 참고 링크를 참조해주세요. // IN SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...); ----- // ANY // 다수의 비교값 중 한개라도 만족하면 TRUE SELECT column_name(s) FROM table_name WHERE column_name operator ANY (SELECT column_name FROM table_name
SELECT INTO SELECT INTO 문은 한 테이블에서 새 테이블로 데이터를 복사합니다. // 모든 열을 새 테이블로 복사합니다. SELECT * INTO newtable [IN externaldb] FROM oldtable WHERE condition; ----- // 일부 열만 새 테이블에 복사합니다. SELECT column1, column2, column3, ... INTO newtable [IN externaldb] FROM oldtable WHERE condition; ----- // 대상 테이블이 존재하는 경우 테이블 값 복사 INSERT INTO [대상 테이블명] SELECT * FROM [원본 테이블명] SELECT * INTO CustomersBackup2017 FROM Customers; ----- // 다음 SQL 문은 몇 개의 열만 새 테이블로 복사합니다. SELECT CustomerName, ContactName INTO CustomersBackup2
Vim 설치 yum -y install vim-enhanced 기본 명령어로 변경 # 아래 파일을 열어주세요. vi /etc/profile # 마지막 행에 추가해주세요. alias vi='vim' # 수정 내용을 반영합니다. source /etc/profile ※ 기본 vi를 입력하면 vim으로 실행 옵션 사용여부 설정 명령어 설명 set nocompatible vim의 독자적인 기능을 사용 (vi와 호환성을 고려하지 않는다) set encoding=utf-8 문자 코드를 지정 set fileencodings=utf-9,cp949 파일 인코딩을 지정 set fileformats=unix,dos 자동인식시키는 개행 코드 지정 set backup 백업설정 (반대 설정은 "set nobackup") set backupdir=~/backup 백업을 만들 디렉토리 지정 set history=50 검색기록 50개 남김 set ignorecase 검색시 대소 문자 구별하지 않음 set smart
오류 코드 Whoops! We seem to have hit a snag. Please try again later... CodeIgniter\Cache\Exceptions\CacheException Cache unable to write to {0} env 파일명 변경 다운받은 코드이그나이터4 디렉토리 안에 env 파일명을 .env로 변경 env 파일은 환경설정 부분이라고 보시면 됩니다. env 파일내용 변경 먼저, 개발 환경이기 때문에 production > development 으로 변경해주시면 됩니다. #CI_ENVIRONMENT = production CI_ENVIRONMENT = development ※ 앞 # 주석은 삭제하면 됩니다. writable 폴더 퍼미션(권한) 변경 writable 폴더에는 로그, 세션 등 여러가지 내용이 저장되는곳으로 권한설정을 변경해줍니다. chmod 777 -R 디렉토리루트/writable ※ writable 폴더 퍼미션 설정시 내부 디렉토
Sudo 파일 수정 및 그룹 권한 주기 // root 계정으로 로그인 su root // /etc/sudoers 파일 수정 visudo // #%wheel ALL=(ALL) ALL "#" 주석 제거 %wheel ALL=(ALL) ALL // 계정 그룹 확인 groups 계정이름 // wheel 그룹에 추가 usermod -aG wheel 계정이름 참고 링크 CentOS7 - 초기설정/보안설정 (2/10) 개요 CentOS7을 설치한 후 제가 개인적으로 초기에 설정해 두는 내용을 정리했습니다. ※ OS 설치는 이곳을 참고하세요 >> CentOS7 - OS설치하기 (1/10) sudo명령어 사용하기 # Security문제로 인해 통상 root계정.. puzji.tistory.com
SELinux 무효화 설정 SELinux는 redhat계열의 디스트리뷰션인 CentOS와 Fedora의 경우 기본 도입되어 있는 시스템입니다. 과거 리눅스는 소스코드가 공개되어 있기 때문에 보안에 취약하다는 평을 많이 받았다. 취약한 이유는 설치 이후 보안에 필요한 설정을 하지 않았기 때문이다. 이러한 취약점을 보안하기 위한 모델이 SELinux이다. 특정 서버의 경우 설치시 SELinux 는 enforcing 되어 있다. 하지만 관리자라면 다른 보안 설정으로 취약점을 보안 할 수 있기 때문에 SELinux를 비활성화 하여 사용한다. SELinux 3가지 상태 enforcing : 강제 permissive : 허용 disabled : 비활성화 ----- vi /etc/sysconfig/selinux // 아래와 같이 변경 SELINUX=disabled 참고 링크 [꿈머] LINUX - SELinux 란 ? & SELinux 설정하기 SELinux( security Enhanced L
설치하기 yum -y install yum-cron 설정하기 # 아래 파일을 열어 수정하기 vi /etc/yum/yum-cron.conf # 아래와 같이 변경 apply_updates = yes # 시작 및 자동시작 등록 systemctl start yum-cron systemctl enable yum-cron # 베이스, 개발 툴 패키지 군을 설치 yum -y groupinstall base "Development tools" 참고 링크 [꿈머] LINUX - SELinux 란 ? & SELinux 설정하기 SELinux( security Enhanced Linux ) 란? - 과거 리눅스는 소스코드가 공개되어 있기 때문에 보안에 ... m.blog.naver.com
SSH 포트 변경 vi /etc/ssh/sshd_config // 보안을 위해서 0 ~ 1023 이외 포트로 설정 #포트 변경 Port 22 EX) Port 1999 systemctl restart sshd.service ----- // firewall firewall-cmd --permanent --zone=public --add-port=1999/tcp firewall-cmd --reload ss -tnlp | grep ssh ※ 특정 클라우드 사이트의 경우 자체적으로 방화벽을 간편하게 설정 할 수 있습니다. ※ 자체적으로 방화벽을 지원하는 경우에는 방화벽 규칙도 변경하셔야 합니다. SSH 그외 설정 vi /etc/ssh/sshd_config // 인증없이 서버로 접속하는 rhost를 금지 IgnoreRhosts yes // root로 직접로그인 금지 PermitRootLogin no // wheel 그룹만 로그인가능 AllowGroups wheel // 특정 계정 또는 그룹에
IPv6란 무엇인가? 국내에서 IPv6 주소를 접하기 어려운 이유 IPv4의 주소 고갈 문제, IPv6의 전환, IPv6와 멀티미디어 데이타의 증가 등의 얘기가 나온지 꽤 오래되었다. 사실 이미 IANA(Internet Assigned Numbers Authority)에서의 할당은 더 이상 없는 상태다. 관련 종사.. unipro.tistory.com vi /etc/sysctl.conf // 아래 내용 추가 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 sysctl -p OR echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf CentOS 7 ipv6 disable # vi /etc/sysctl.conf net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 # s
SSH Fail2ban 설치하기 yum install -y fail2ban # 기본 수정 파일 vi /etc/fail2ban/jail.conf # 기본 수정 파일의 경우 업데이트시 새로 덮어씌우기 때문에 새로 만들어서 관리합니다. vi /etc/fail2ban/jail.d/local.conf # 아래 내용을 추가합니다. [DEFAULT] # Common ignoreip = 127.0.0.1/8 bantime = 86400 findtime = 86400 maxretry = 3 banaction = firewallcmd-new # Mail destemail = 알림 수신메일 주소 sender = 알림 발신메일 주소 # Action action_mw = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] %(mta)s-whois[na
passwd, group 파일 권한 변경하기 // 퍼미션(권한) 확인 ls -al /etc/passwd ls -al /etc/group // 퍼미션(권한) 변경 chmod 644 /etc/passwd chmod 644 /etc/group
password(비밀번호) 길이 제한, 최대 사용기간 설정하기 // password 최소 길이 제한 설정 vi /etc/security/pwquality.conf // 앞 # 주석 제거 minlen = 9 ----- // password 최대 사용기간 설정 vi /etc/login.defs // 99999 값을 원하는 일자 값으로 변경 PASS_MAX_DAYS 99999; ----- // password 문자, 숫자, 특수문자 규칙 설정 vi /etc/security/pwquality.conf // 1개 이상의 대문자 ucredit = -1 // 1개의 소문자 lcredit = -1 // 1개 이상의 숫자 dcredit = -1 // 1개 이상의 특수문자 ocredit = -1
도스창 한글, 영어 변경하기 // 한글로 변경 LANG=ko_KR.UTF-8 // 영어로 변경 LANG=en_US.UTF-8
GUI 그래픽 툴 설치 yum groupinstall "GNOME Desktop" "Graphical Administration Tools" xrdp + tigervnc를 통한 리눅스 GUI 환경 접속 방법 # epel + xrdp + tigervnc 설치 yum install -y epel-release yum install -y xrdp tigervnc-server Firewalld 설치 # firewall 설치 yum install -y firewalld # firewall 시작 및 자동시작 등록 systemctl start firewalld systemctl enable firewalld Firewalld 방화벽 허용 # 3389/tcp 허용 firewall-cmd --permanent --zone=public --add-port=3389/tcp # firewalld 재부팅 firewall-cmd --reload # 포트 허용 리스트 보기 (3389/tcp 뜨는지 확인) fi
INSERT INTO SELECT INSERT INTER TO SELECT 문은 한 테이블에서 데이터를 복사하여 다른 테이블에 삽입합니다. SELECT에 삽입하려면 소스 테이블과 대상 테이블의 데이터 유형이 일치해야 합니다. 대상 테이블의 기존 레코드는 영향을 받지 않습니다. INSERT INTO table2 (column1, column2, column3, ...) SELECT column1, column2, column3, ... FROM table1 WHERE condition; 예제 // 다음 SQL 문은 "공급자"를 "사용자"로 복사합니다. (데이터로 채워지지 않은 열에는 NULL이 포함됩니다). INSERT INTO Customers (CustomerName, City, Country) SELECT SupplierName, City, Country FROM Suppliers; // 다음 SQL 문은 "공급자"를 "사용자"로 복사합니다. (모든 열 채우기) INSERT IN
CASE CASE 문은 조건을 통과하여 첫 번째 조건이 충족될 때(IF-THEN-ELSE 문처럼) 값을 반환합니다. 그래서 일단 조건이 참이면 읽기를 멈추고 결과를 돌려주게 됩니다. true 조건이 없으면 ETHER 절의 값을 반환합니다. 다른 부품이 없고 조건이 true가 없으면 NULL을 반환합니다. // WHEN과 THEN은 한쌍이어야 합니다. // WHEN과 THEN은 다수가 존재할 수 있습니다. // ELSE가 존재하면 모든 조건에 해당하지 않는 경우에 반환 값을 설정할 수 있습니다. // ELSE가 존재하지 않고, 조건에 맞지 않아서 반환 값이 없으면 NULL를 반환합니다. CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN conditionN THEN resultN ELSE result END; ----- CASE WHEN 조건 THEN '반환 값' WHEN 조건 THEN '반환 값' ELSE 'WHE
IFNULL(), ISULL(), COLLESCE() 및 NVL() 함수 테이블 ID Name Price Stock Order 1 Jarlsberg 10.45 16 15 2 Mascarpone 32.56 23 3 Gorgonzola 15.67 9 20 UnitsOnOrder 열은 선택 사항이며 NULL 값을 포함할 수 있다고 가정합니다. SELECT Name, Price * (Stock + Order) FROM Products; => 위의 예제에서 "Order" 값이 NULL이면 결과는 NULL이 됩니다. 해결 방법 MySQL IFNULL() 함수를 사용하면 식이 NULL인 경우 대체 값을 반환할 수 있습니다. SELECT Name, Price * (Stock + IFNULL(Order, 0)) FROM Products; 또는 다음과 같은 COLLESCE() 기능을 사용할 수 있습니다. SELECT Name, Price * (Stock + COALESCE(Order, 0)) FROM
Comments(주석) 주석은 SQL 문의 섹션을 설명하거나 SQL 문의 실행을 방지하는 데 사용됩니다. 싱글 라인 // 한 줄의 설명은 --로 시작합니다. // -와 줄 끝 사이의 텍스트는 무시됩니다(실행되지 않음). // 다음 예에서는 설명으로 단일 줄 설명을 사용합니다. --Select all: SELECT * FROM Customers; // 다음 예에서는 단일 줄 설명을 사용하여 줄의 끝을 무시합니다. SELECT * FROM Customers -- WHERE City='Berlin'; // 다음 예에서는 단일 줄 설명을 사용하여 문을 무시합니다. --SELECT * FROM Customers; SELECT * FROM Products; ----- 멀티 라인 // /*로 시작하고 */로 끝나는 다중 행 주석입니다. // /*와 */ 사이의 모든 텍스트는 무시됩니다. // 다음 예에서는 다중 줄 설명을 사용합니다. /*Select all the columns of all th
CREATE DATABASE CREATE DATABASE 문은 새 SQL 데이터베이스를 생성하는 데 사용됩니다. 팁 : 데이터베이스를 작성하기 전에 관리자 권한이 있는지 확인합니다. 데이터베이스가 작성되면 다음 SQL 명령으로 데이터베이스 목록에서 확인할 수 있습니다. CREATE DATABASE databasename; 예제 CREATE DATABASE testDB; 참고 링크 SQL CREATE DATABASE Statement SQL CREATE DATABASE Statement ❮ Previous Next ❯ The SQL CREATE DATABASE Statement The CREATE DATABASE statement is used to create a new SQL database. Syntax CREATE DATABASE databasename ; CREATE DATABASE Example The following SQL statement creates a databa
DROP DATABASE Drop DATABASE 문은 기존 SQL 데이터베이스를 삭제하는 데 사용됩니다. DROP DATABASE databasename; ※ 데이터베이스를 삭제하기 전에 주의해야 합니다. 데이터베이스를 삭제하면 데이터베이스에 저장된 전체 정보가 손실됩니다! 예제 // 다음 SQL 문은 기존 데이터베이스 "testDB"를 삭제합니다. DROP DATABASE testDB; ※ 데이터베이스를 삭제하기 전에 관리자 권한이 있는지 확인합니다. 데이터베이스가 삭제되면 다음 SQL 명령으로 데이터베이스 목록에서 확인할 수 있습니다. 참고 링크 SQL DROP DATABASE Statement SQL DROP DATABASE Statement ❮ Previous Next ❯ The SQL DROP DATABASE Statement The DROP DATABASE statement is used to drop an existing SQL database. Syntax DROP
CREATE TABLE CREATE TABLE 문은 데이터베이스에 새 테이블을 작성하는 데 사용됩니다. 열 매개변수는 표의 열 이름을 지정합니다. 데이터 형식 매개 변수는 열에 저장할 수 있는 데이터 유형(예: varchar, 정수, 날짜 등)을 지정합니다. 팁 : 사용 가능한 데이터 유형에 대한 개요를 보려면 전체 데이터 유형 참조로 이동합니다. CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, .... ); 예제 // 다음 예제에서는 다섯 개의 열이 포함된 "사용자" 테이블을 만듭니다. // PersonID, LastName, FirstName, Address 및 City는 다음과 같습니다. CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City
DROP TABLE (테이블 삭제) Drop TABLE 문은 데이터베이스의 기존 테이블을 삭제하는 데 사용됩니다. DROP TABLE table_name; ※ 테이블을 삭제 하기전에 주의해야 합니다. 테이블을 삭제하면 테이블에 저장된 전체 정보가 손실됩니다! TRUNCATE TABLE CLIPATE TABLE 문은 테이블 내부의 데이터를 삭제하는 데 사용되지만 테이블 자체는 삭제하지 않습니다. TRUNCATE TABLE table_name; 예제 // 다음 SQL 문은 기존 테이블 "Shippers"를 삭제합니다. DROP TABLE Shippers;
ALTER TABLE(테이블 수정) ALTER TABLE 문은 기존 테이블의 열을 추가, 삭제 또는 수정하는 데 사용됩니다. ALTER TABLE 문은 기존 테이블에 다양한 제약 조건을 추가 및 삭제하는 데도 사용됩니다. 컬럼 추가 ALTER TABLE table_name ADD column_name datatype; // 다음 SQL은 "사용자" 테이블에 "이메일" 열을 추가합니다. ALTER TABLE Customers ADD Email varchar(255); ----- 컬럼 삭제 // 테이블에서 열을 삭제하려면 다음 구문을 사용합니다 (일부 데이터베이스 시스템에서 열 삭제를 허용하지 않음) ALTER TABLE table_name DROP COLUMN column_name; // 다음 SQL은 "사용자" 테이블에서 "전자 메일" 열을 삭제합니다. ALTER TABLE Customers DROP COLUMN Email; ----- 데이터 타입 수정 // 표에서 열의 데이터 유형
Constraints (제약 조건) CREATE TABLE 문을 사용하여 테이블을 만들거나 ALTER TABLE 문을 사용하여 테이블을 만든 후 제약 조건을 지정할 수 있습니다. CREATE TABLE table_name ( column1 datatype constraint, column2 datatype constraint, column3 datatype constraint, .... ); SQL 제약 조건은 테이블의 데이터에 대한 규칙을 지정하는 데 사용됩니다. 제약 조건은 표에 들어갈 수 있는 데이터 유형을 제한하는 데 사용됩니다. 이렇게 하면 표에 있는 데이터의 정확성과 신뢰성이 보장됩니다. 제약 조건과 데이터 작업 사이에 위반 사항이 있으면 작업이 중단됩니다. 제약 조건은 열 수준 또는 표 수준이 될 수 있습니다. 열 수준 제약 조건은 열에 적용되고 표 수준 제약 조건은 전체 표에 적용됩니다. SQL에서 일반적으로 사용되는 제약 조건은 다음과 같습니다. NOT NULL 열에
NOT NULL 기본적으로 열에는 NULL 값이 포함될 수 있습니다. NOT NULL 제약 조건은 NULL 값을 허용하지 않도록 열을 적용합니다. 이 경우 필드는 항상 값을 포함하도록 적용되므로 새 레코드를 삽입하거나 이 필드에 값을 추가하지 않고 레코드를 업데이트할 수 없습니다. // 다음 SQL은 "사용자" 테이블이 생성될 때 "ID", "성" 및 "이름" 열이 NULL 값을 허용하지 않도록 합니다. CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255) NOT NULL, Age int ); ----- // "사용자" 테이블이 이미 작성되었을 때 "만기" 열에 NOT NULL 제약 조건을 생성하려면 다음 SQL을 사용합니다. ALTER TABLE Persons MODIFY Age int NOT NULL; 참고 링크 SQL NOT NULL Constraint SQL N
UNIQUE (고유 키) 고유 제약 조건을 사용하면 열의 모든 값이 달라집니다. 고유 키 및 기본 키 제약 조건은 모두 열 또는 열 집합에 대한 고유성을 보장합니다. 기본 키 제약 조건에는 자동으로 고유한 제약 조건이 있습니다. 그러나 테이블당 여러 가지 고유한 제약 조건을 가질 수 있지만 테이블당 하나의 기본 키 제약 조건만 가질 수 있습니다. // 다음 SQL은 "사용자" 테이블이 생성될 때 "ID" 열에 고유한 제약 조건을 생성합니다. CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, UNIQUE (ID) ); ----- // 테이블이 이미 생성되었을 때 "ID" 열에 고유한 제약 조건을 만들려면 다음 SQL을 사용합니다. ALTER TABLE Persons ADD CONSTRAINT UC_Person UNIQUE (ID,LastName);
PRIMARY KEY (기본 키) 기본 키 제약 조건은 테이블의 각 레코드를 고유하게 식별합니다. 기본 키에는 고유 값이 포함되어야 하며 NULL 값을 포함할 수 없습니다. 테이블에는 기본 키가 하나만 있을 수 있으며, 테이블에서 이 기본 키는 단일 또는 여러 개의 열(필드)로 구성될 수 있습니다. // 다음 SQL은 "사용자" 테이블이 생성될 때 "ID" 열에 기본 키를 생성합니다. CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, PRIMARY KEY (ID) ); ----- // 기본 키 제약 조건의 이름을 지정하고 여러 열에 기본 키 제약 조건을 정의하려면 다음 SQL 구문을 사용합니다. CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varc
FOREIGN KEY (외부, 외래 키) 외부 키는 두 테이블을 서로 연결하는 데 사용되는 키입니다. 외부 키는 한 테이블의 필드(또는 필드 모음)로 다른 테이블의 기본 키를 나타냅니다. 외부 키가 들어 있는 테이블을 하위 테이블이라고 하며, 후보 키가 들어 있는 테이블을 참조 테이블 또는 상위 테이블이라고 합니다. 다음 두 표를 봅니다. Persons 테이블 PersonID(기본키) LastName FirstName Age 1 Hansen Ola 30 2 Svendson Tove 23 3 Pettersen Kari 20 Orders 테이블 OrderID(기본키) OrderNumber PersonID(외부 키) 1 77895 3 2 44678 3 3 22456 2 4 24562 1 Person 테이블의 PersonID는 기본 키입니다. Person 테이블의 Orders는 외부 키입니다. 외부 키 제약 조건은 테이블 간의 연결을 파괴하는 작업을 방지하는 데 사용됩니다. 또한 잘못된 데
라라벨 서버 요구사항 PHP >= 7.2.5 BCMath PHP Extension Ctype PHP Extension Fileinfo PHP extension JSON PHP Extension Mbstring PHP Extension OpenSSL PHP Extension PDO PHP Extension Tokenizer PHP Extension XML PHP Extension 확장 모듈 설치하기 # 의존성 패키지 설치 yum install -y git curl zip unzip # PHP 확장 기능(의존성) 필수 설치 yum install -y php-fpm php-cli php-redis php-brotli php-gd php-gmp php-imap php-bcmath php-interbase php-json php-mbstring php-mysqlnd php-odbc php-opcache php-memcached php-tidy php-pdo php-pdo-dblib php-p
웨일 브라우저 GPU 활성화 # 웨일 브라우저에서는 유튜브를 접속하여 영상 화질 설정에 HD 이상 나오지 않습니다. (특정, GPU및 CPU(내장)에서 나타나는것 같습니다.) 그래서 Compositor Information에서 Tile Update Mode 를 강제로 활성화 시킬겁니다. # 웨일 브라우저 주소창에 입력 whale://flags/ # 아래 검색 후 "Enabled" 변경 Zero-copy rasterizer Disabled -> Enabled 설정 확인 # 설정이 완료되었으면, 기존의 켜있던 웨일 브라우저를 모두 닫은 후 바로가기를 만든 웨일 브라우저를 실행하여 재확인 # 웨일 브라우저 주소창에 입력 chrome://gpu # 하단 검색 후 "Zero-copy" 확인 Compositor Information Tile Update Mode : Zero-copy Zero-copy 설정 확인 참고 사항 # 라데온 그래픽카드는 부분적으로 지원이 잘 안됩니다. "RX570"
NPM 최신 설치하기 NPM을 최신으로 설치해야 오류가 발생되지 않습니다. // nodeJS와 NPM은 같이 설치됩니다. // 먼저 아래와 같이 구형 버젼을 설치해주세요. yum install -y nodejs ----- # nodeJS 최신설치 npm cache clean -f npm install -g n // 위 명령어 입력 후 그대로 아래 명령어 입력하시면 됩니다. // nodeJS 특정 버젼 설치 n 6.x.x / n 7.x.x 버젼 입력 n 6.11.0 // nodeJS 최신 안정화 버젼 설치 n stable // nodeJS 최신 버젼 설치 n latest // nodejs 버젼 확인 node -v ----- # NPM 최신 업데이트 npm install -g npm // npm 버젼 확인 npm -v ※ nodeJS 버젼이 변경되지 않는다면 재부팅 shutdown -r now OR reboot VueJS 설치하기 // 라라벨이 설치된 디렉토리로 이동 후 아래 명령 실행
NPM 최신 설치하기 NPM을 최신으로 설치해야 오류가 발생되지 않습니다. // nodeJS와 NPM은 같이 설치됩니다. // 먼저 아래와 같이 구형 버젼을 설치해주세요. yum install -y nodejs ----- # nodeJS 최신설치 npm cache clean -f npm install -g n // 위 명령어 입력 후 그대로 아래 명령어 입력하시면 됩니다. // nodeJS 특정 버젼 설치 n 6.x.x / n 7.x.x 버젼 입력 n 6.11.0 // nodeJS 최신 안정화 버젼 설치 n stable // nodeJS 최신 버젼 설치 n latest // nodejs 버젼 확인 node -v ----- # NPM 최신 업데이트 npm install -g npm // npm 버젼 확인 npm -v ※ nodeJS 버젼이 변경되지 않는다면 재부팅 shutdown -r now OR reboot React 설치하기 // 라라벨이 설치된 디렉토리로 이동 후 아래 명령 실행
Tailwindcss 설치하기 // 라라벨 디렉토리 이동 후 설치 // node_module 폴더 안에 tailwindcss으로 설치됨 # tailwindcss 설치 npm install tailwindcss # Mix에서 Tailwind를 사용할 수 있게 패키지를 설치 npm install mix-tailwindcss --save-dev Tailwindcss 추가하기 // 부트스트랩과 겸용하기 사용하지는 않으니 부트스트랩은 지웁니다. # app.scss을 아래 내용으로 변경 /resources/sass/app.scss ----- // Fonts @import url('https://fonts.googleapis.com/css?family=Nunito'); // Variables @import 'variables'; // Bootstrap // @import '~bootstrap/scss/bootstrap'; // Tailwind @tailwind base; @tailwind com
GRID (그리드) 페이지의 레이아웃(뼈대, 구조)를 여러 주요 영역으로 나누는데 탁월합니다. 저의 경우 그리드를 통해 레이아웃을 하고 플렉스를 통해서 정렬을 합니다. 웬만한건 위 2개의 조합으로 되며, 시간단축도 빨라지고 적응되면 쉽습니다. ※ 그리드와 플렉스를 사용해보지 않았다면, 무조건 사용하길 권장합니다. GRID(그리드) 레이아웃 GRID (그리드) 컨테이너 속성 속성 설명 grid-template-rows 행의 높이(크기, 세로) 예제 grid-template-columns 열의 넓이(가로) 예제 grid-template-areas 영역(Area) 이름을 참조해 템플릿 생성 예제 grid-template "grid-template-columns", "grid-template-areas"의 단축 속성 예제 row-gap(grid-row-gap) 행과 행 사이의 간격(Line)을 정의 예제 column-gap(grid-column-gap) 열과 열 사이의 간격(Line)을 정
FLEX BOX (플렉스 박스) 수평, 수직(상하, 좌우) 구조 정렬을 쉽게 할 수 있습니다. 그리드로 레이아웃을 만든 후 플렉스 박스로 수평, 수직(상하, 좌우) 정렬을 하면 좋습니다. FLEX BOX (플렉스 박스) 컨테이너 속성 속성 설명 flex-direction Flex Items의 주 축(main-axis)을 설정 예제 flex-wrap Flex Items의 여러 줄 묶음(줄 바꿈) 설정 예제 flex-flow "flex-direction", "flex-wrap"의 단축 속성 예제 justify-content 주 축(main-axis)의 정렬 방법을 설정 align-content 교차 축(cross-axis)의 정렬 방법을 설정(2줄 이상) align-items 교차 축(cross-axis)에서 Items의 정렬 방법을 설정(1줄) FLEX BOX (플렉스 박스) 아이템 속성 속성 설명 flex-grow Flex Item의 증가 너비 비율을 설정 예제 flex-shrink
Media Query (미디어 쿼리) 미디어 쿼리는 단말기의 유형(출력물 화면)과, 어떤 특성이나 수치(화면 해상도, 뷰포트 너비 등)에 따라 웹사이트나 앱의 스타일을 수정할 때 유용합니다. 속성 설명 all 기본값으로, 모든 미디어 타입의 장치 print 인쇄 미리 보기 기능 또는 페이지 출력 screen 컴퓨터나 테블릿, 스마트폰 등의 스크린 speech 페이지를 소리 내어 읽어주는 스크린 리더기(screen reader) 연산자 설명 and AND 연산 not NOT 연산 , OR 연산 속성 설명 width 대상 디스플레이 영역의 너비를 명시함. “min-” 접두사로 최솟값, “max-” 접두사로 최대값을 명시할 수 있음. ex) media=“screen and (max-width:900px)” height 대상 디스플레이 영역의 높이를 명시함. “min-” 접두사로 최솟값, “max-” 접두사로 최대값을 명시할 수 있음. ex) media=“screen and (min-hei
ViewPort (뷰포트) 모바일 브라우저들은 뷰포트(viewport)로 알려진 가상 "window"상에 페이지를 렌더링하는데, 보통의 경우 스크린 보다 폭이 넓어 모든 페이지 레이아웃을 억지로 작은 화면에 축소할 필요가 없다. (레이아웃을 축소할 경우 모바일 사이트로 만들지 않은 사이트들은 대개 엉망이 되게 마련이다.) 사용자들은 화면을 움직이거나 줌 기능을 이용해 페이지의 보이지 않는 부분들을 볼 수 있다. ※ 모바일 safari 에서도 같은 속성들이 지원되며, Fennec을 고쳐서 여러가지 화면크기와 다른 해상도에서도 모바일 사이트들이 문제없이 나타나도록 했다. 속성 설명 기본값 width 넓이(가로) ㄴdevice-width 기기의 가로 넓이 픽셀 값 (웹페이지의 가로(width) 값은 기기가 사용하는 가로 넓이 값(device-width) 만큼 적용하여 사용하라는 의미) height 높이(세로) ㄴdevice-height 기기의 세로 높이 픽셀 값 initial-scale
Vue.js 란? 사용자 인터페이스를 만들기 위한 프로그레시브 프레임워크 입니다. Vue.js 시작하기 1. HTML 스크립트 추가 방식 # 개발버전, 도움되는 콘솔 경고를 포함 # 개발할때에 사용한다. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> # 상용버전, 속도와 용량이 최적화됨 # 상용할때에 사용한다. <script src="https://cdn.jsdelivr.net/npm/vue"></script> 2. Node.js 기반 빌드에 vue-cli로 시작 node.js가 먼저 설치되어 있어야 하며, node.js에 속해 있는 npm을 통해서 vue-cli 패키지를 설치하여 사용 할 수 있습니다. vue-cli는 터미널 명령어를 통하여 손쉽게 Vue.js 환경을 vue-cli가 자동으로 최적화된 환경을 만들어 주는 도구라고 보면 됩니다. # 프로젝트 생성 vue create 프로젝트명 Vue-CLI
Vue 인스턴스 만들기 전체 옵션 목록은 API reference에서 찾을 수 있습니다. var vm = new Vue({ // 옵션 }) 속성과 메소드 각 Vue 인스턴스는 data 객체에 있는 모든 속성을 프록시 처리 합니다. 데이터가 변경되면 화면은 다시 렌더링 되며, 유의할 점은 data에 있는 속성들은 인스턴스가 생성될 때 존재한 것들만 반응형이라는 것입니다. # 데이터 객체 var data = { a: 1 } # Vue인스턴스에 데이터 객체를 추가합니다. var vm = new Vue({ data: data }) # 같은 객체를 참조합니다! vm.a === data.a // => true # 속성 설정은 원본 데이터에도 영향을 미칩니다. vm.a = 2 data.a // => 2 # ... 당연하게도 data.a = 3 vm.a // => 3 # 아래와 같이 미리 정의되지 않은 값을 변경하게 되면 반응형으로 변경되지 않습니다. vm.b = 'hi' # b가 변경되어도 화면
템플릿 문법 Vue.js는 렌더링 된 DOM을 기본 Vue 인스턴스의 데이터에 선언적으로 바인딩 할 수있는 HTML 기반 템플릿 구문을 사용합니다. 내부적으로 Vue는 템플릿을 가상 DOM 렌더링 함수로 컴파일 합니다. 반응형 시스템과 결합된 Vue는 앱 상태가 변경 될 때 최소한으로 DOM을 조작하고 다시 적용할 수 있는 최소한의 컴포넌트를 지능적으로 파악할 수 있습니다. 가상 DOM 개념에 익숙하고 JavaScript의 기본 기능을 선호하는 경우 템플릿 대신 렌더링 함수를 직접 작성할 수 있으며 선택사항으로 JSX를 지원합니다. 보간법 1. 문자열 데이터 바인딩의 가장 기본 형태는 “Mustache” 구문(이중 중괄호 {{ }})을 사용한 텍스트 보간 <span>메시지: {{ msg }}</span> # v-once 디렉티브를 사용하여 데이터 변경시 업데이트 되지 않는 일회성 보간을 수행할 수 있지만, 같은 노드의 바인딩에도 영향을 미친다는 점을 유의해야 합니다. <span v-
computed 속성 템플릿 내에 표현식을 넣으면 편리합니다. 하지만 간단한 연산일 때만 이용하는 것이 좋습니다. 많은 연산을 템플릿 안에서 하면 코드가 비대해지고 유지보수가 어렵습니다. # 이 템플릿은 더 이상 간단하고 명료하지 않습니다. # 복잡한 로직이라면 반드시 computed 속성을 사용해야 하는 이유입니다. <div id="example"> {{ message.split('').reverse().join('') }} </div> 기본 예제 <div id="example"> <p>원본 메시지: "{{ message }}"</p> <p>역순으로 표시한 메시지: "{{ reversedMessage }}"</p> </div> # "message"의 값이 변경되면 "reverseMessage" 갱신 합니다. 즉, "computed"는 편하며 자동으로 값을 변경(종속성 및 반응형)하고 캐싱 해주는 "반응형 getter(게터)"라고 부릅니다. var vm = new Vue({ el:
클래스와 스타일 바인딩 데이터 바인딩은 엘리먼트의 클래스 목록과 인라인 스타일을 조작하기 위해 일반적으로 사용됩니다. 이 두 속성은 v-bind를 사용하여 처리할 수 있습니다. 그러나 문자열 연결에 간섭하는 것은 짜증나는 일이며 오류가 발생하기 쉽습니다. 이러한 이유로, Vue는 class와 style에 v-bind를 사용할 때 특별히 향상된 기능을 제공합니다. 표현식은 문자열 이외에 객체 또는 배열을 이용할 수 있습니다. HTML 클래스 바인딩하기 1. 객체 구문 클래스를 동적으로 토글하기 위해 v-bind:class에 객체를 전달할 수 있습니다. # 클래스를 동적으로 토글하기 위해 v-bind:class에 객체를 전달할 수 있습니다. <div v-bind:class="{ active: isActive }"></div> # 객체에 필드가 더 있으면 여러 클래스를 토글 할 수 있습니다. 또한 v-bind:class 디렉티브는 일반 class 속성과 공존할 수 있습니다. 그래서 다음과
조건부 렌더링 1. v-if # Handlebars와 같은 문자열 템플릿에서는 다음과 같은 조건부 블록을 작성할 수 있습니다. {{#if ok}} <h1>Yes</h1> {{/if}} # Vue에서는 v-if 디렉티브를 사용하여 같은 결과를 얻을 수 있습니다. <h1 v-if="ok">Yes</h1> # v-else와 함께 else 블록을 추가하는 것도 가능합니다. <h1 v-if="ok">Yes</h1> <h1 v-else>No</h1> 2. <template>에 v-if을 갖는 조건부 그룹 만들기 # v-if는 디렉티브기 때문에 하나의 엘리먼트에 추가해야합니다. 하지만 하나 이상의 엘리먼트를 트랜지션하려면 어떻게 해야할까요? 이 경우 우리는 보이지 않는 래퍼 역할을 하는 <template> 엘리먼트에 v-if를 사용할 수 있습니다. 최종 렌더링 결과에는 <template> 엘리먼트가 포함되지 않습니다. <template v-if="ok"> <h1>Title</h1> <p>Para
데이터베이스 이름에 "-" 하이픈 추가 기본적으로는 하이픈 추가시 오류가 발생되는 부분은 맞습니다. 대표적으로 변수명도 하이픈이 안되는것이 맞구요. # 아래와 같은 데이터베이스를 생성하려고 하면 create database test-test; # 이와 같은 오류가 발생 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-test' at line 1 오류 1064(42000)입니다. SQL 구문에 오류가 있습니다. MariaDB 서버 버전에 해당하는 설명서에서 1행에서 '-test'에 가까운 구문을 사용할 수 있는지 확인하십시오. 해결방법 # 낮은 악센트 표(grave accent)로 감싼 후 생성 create database `test-test`; 참고 링
서버 패키지 업데이트 # 서버에 설치된 기본 패키지들은 최신버전으로 업데이트 yum -y update # EPEL 저장소 설치 yum install -y epel-release nodeJS 구버전(기본) 설치 # nodeJS 구버전(기본) 설치 yum install -y nodejs # nodeJS 버전 확인 node -v # npm 버전 확인 npm -v nodeJS 최신버전 업데이트 npm cache clean -f npm install -g n # nodejs 특정 버젼 설치 n 6.x.x / n 7.x.x 버젼 입력 n 6.11.0 # nodejs 최신 안정화 버젼 설치 n stable # nodejs 최신 버젼 설치 n latest # 버전 체크를 위한 재부팅(리부팅) shutdown -r now # 다시 버전 확인 node -v npm -v CLI 설치 및 프로젝트 생성 # "CLI"를 설치하기 위해서는 nodeJS 버젼은 8.9 이상이 필요하며, "CLI"는 뷰를 쉽게
SFTP 설치하기 # 확장 탭을 클릭 후 "SFTP" 검색 한 후 아래의 이미지의 확장을 설치해주세요. 확장 프로그램 # 새로운 폴더 혹은 기존 프로젝트 폴더를 열어주신 후 "F1"을 눌러 "sftp" 검색 후 "sftp:config"을 선택해주세요. F1 # 아래와 같이 ".vscode" 폴더가 생성 되며 "sftp.json" 파일이 생성 됩니다. sftp.json # 초기 생성시 없는 속성이 있습니다. 아래와 비교하여 추가해주세요. # uploadOnSave : 저장시에 자동으로 업로드 (true/false) # igonre : 업/다운로드를 제외할 파일 및 폴더 보안상 ".vscode" 폴더 안의 파일 내용에는 서버 계정의 비밀번호까지 있기 때문에 대부분 설정하는 편 { "name": "프로젝트 이름", "host": "서버 IP 주소", "protocol": "sftp", "port": 22, "username": "서버 계정", "password": "서버 비밀번호", "r
Git 설치하기 Git - Downloads Downloads Mac OS X Windows Linux/Unix Older releases are available and the Git source repository is on GitHub. Latest source Release 2.26.2 Release Notes (2020-04-19) Download 2.26.2 for Windows GUI Clients Git comes with built-in GUI tools ( git-gui , gitk ), but there are several third-party tools... git-scm.com # 설치시 기본 상태에 두고 "Next" 혹은 "다음"을 눌러 설치하시면 됩니다. Git 기본 개념 개념 설명 작업공간 (워크(킹)스페이스) 로컬 환경에서 소스코드를 편집하는 일반적인 프로젝트 폴더를 일컬어 작업공간이라고 합니다. 저장소 (레포지토리) 작업공간을 "Git"이 제공하는
CSS TailWind 설치하기 # 해당 프로젝트 폴더 이동 후 설치 npm install --save tailwindcss postcss.config.js 파일 만들기 Webpack(및 Vue.js 구성 요소용 Webpack 로더인 Vue-loader)은 CSS용 Webpack 로더인 PostCSS를 사용하도록 구성할 수 있습니다. postcss.config.js 파일 내에서 구성을 찾고 추가한 패키지에서 CSS로 앱을 빌드할 수 있습니다. Vue CLI에서 생성한 데모 앱은 기본적으로 postcss.config.js 파일을 생성하지 않습니다. (Vue.JS 3.0 에서는 기본적으로 지원) postcss 관련 내용은 링크1, 링크2를 클릭하여 자세히 알아보기 # 해당 프로젝트 폴더 가장 상위에 "postcss.config.js" 생성 후 아래 내용 입력 후 저장 const autoprefixer = require('autoprefixer'); const tailwindcss = r
CSS BootStrap 설치하기 # 해당 프로젝트 폴더 이동 후 설치 # 해당 투두앱에서는 "axios"라는 기능을 써야 하기 때문에 동일하게 프로젝트 폴더에서 설치 npm install --save bootstrap bootstrap-vue axios ※ 한번에 나열하여 설치가 가능합니다. main.JS 파일 수정 # 아래 내용을 추가 # ".vue" 파일에서 "bootstrap-vue"를 사용 할 수 있다. import BootstrapVue from 'bootstrap-vue' import 'bootstrap/dist/css/bootstrap.min.css' import 'bootstrap-vue/dist/bootstrap-vue.css' Vue.use(BootstrapVue) # 아래 내용으로 덮어씌워도 됩니다. import Vue from "vue"; import App from "./App.vue"; import BootstrapVue from 'bootstrap-vue
FTP-SIMPLE 설치하기 # 확장 탭을 클릭 후 "SFTP" 검색 한 후 아래의 이미지의 확장을 설치해주세요. FTP-SIMPLE # 새로운 폴더 혹은 기존 프로젝트 폴더를 열어주신 후 "F1"을 눌러 "ftp-simple 검색 후 "ftp-simple : Config - FTP connection setting"을 선택해주세요. VSCODE FTP-SIMPLE # 아래와 같이 설정 파일이 열리게 됩니다. FTP-SIMPLE ftp-simple-temp.json # 초기 생성시 없는 속성이 있습니다. 아래와 비교하여 추가해주세요. # autosave : 저장시에 자동으로 업로드 (true/false) # confirm : 저장시에 확인(컨펌)을 받을지 여부 (true/false) # igonre : 업/다운로드를 제외할 파일 및 폴더 보안상 ".vscode" 폴더 안의 파일 내용에는 서버 계정의 비밀번호까지 있기 때문에 대부분 설정하는 편 [ { "name": "My Server
nodeJS(Express) 설치 하기 기존 익스프레스를 통해서 API 서버를 구축하며, MySQL도 연동 가능합니다. # "Vue.JS" 프로젝트를 만든 폴더로 이동 후 아래와 같이 입력 # 즉, "test"라는 뷰 프로젝트 생성 후 "test" 폴더 하위에 생성 cd test npm install -g express-generator express --view=pug express # 생성된 "express" 폴더로 이동 후 명령어 실행 cd express npm install nodeJS(Express) 포트 변경 # 위에서 만든 "express" 내에 "bin" 폴더안에 "www" 파일을 열어 "3000"번 포트를 "80" 포트로 변경합니다. # 이 작업은 따로 하지 않아도 되며, 3000번 포트 방화벽을 열어주시면 됩니다. var port = normalizePort(process.env.PORT || '3000'); => var port = normalizePort(pro
MySQL(마리아디비) 설치하기 [CentOS7] MySQL(MariaDB) 최신버젼 설치 MariaDB 레포 설정MariaDB 설치MariaDB 계정 비번 변경Set root password 에서 엔터 후 사용할 ... blog.naver.com MySQL Workbench 설치하기 MySQL :: Download MySQL Workbench General Availability (GA) Releases Archives MySQL Workbench 8.0.20 Select Operating System: Recommended Download: Other Downloads: Windows (x86, 64-bit), MSI Installer 8.0.20 35.6M Download (mysql-workbench-community-8.0.20-winx64.msi) MD5: edd40cd63fa929127389f0440b930012 | Signature We suggest tha... de
APM(Apache + PHP + MySQL) 설치 1. Apache 설치하기 [CentOS7] Apache 아파치(httpd) 최신버젼 설치 Apache 아파치(httpd) 버젼 확인현재 2.4.6 버젼이 설치되어 있습니다.Apache 아파치(httpd) 최신 확인2.... blog.naver.com 2. PHP 설치하기 [CentOS7] PHP 최신버젼 및 특정버젼으로 업데이트 및 설치(제거) 방법 PHP(기존) 제거PHP(버전별) 설치 blog.naver.com 3. MySQL(마리아디비) 설치하기 [CentOS7] MySQL(MariaDB) 최신버젼 설치 MariaDB 레포 설정MariaDB 설치MariaDB 계정 비번 변경Set root password 에서 엔터 후 사용할 ... blog.naver.com 4. PHPMyAdmin 설치하기 [CentOS7] phpMyAdmin 최신버젼 설치 phpMyAdmin 최신버젼 설치phpMyAdmin.conf 파일 수정PHP와 버전
Vue.JS 디렉토리 구조 "vue.config.js" 파일은 따로 생성하였습니다. public favicon.ico index.html src assets logo.png components helloworld.vue App.vue main.js .gitignore babel.config.js package-lock.json package.json README.md vue.config.js "public" 디렉토리 구조 가장 맨 처음 로드 되는 기본 HTML "PUBLIC" 디렉토리 구조 # 기본적인 HTML과 동일하며, 하단 DIV 태그의 ID 값 "app"을 통해서 뷰가 호출되어 보여지게 됩니다. # 즉, "app"을 통해서 호출되는 관련된 내용을 없애거나 DIV 태그(ID 값)를 없애고 단순히 "HelloWorld"를 입력하면 문자열만 바로 보이게 되는 것 입니다. <!DOCTYPE html> <html lang="en"> <he
뷰 라우터란? 화면을 전환할때 사용되는 것을 의미합니다. 페이지(컴포넌트)를 미리 다운받아 놓은 상태에서 페이지 이동시에 화면이 새로고침 되지 않고 갱신되는 방식 입니다. 이는 싱글 페이지 어플리케이션(SPA-Single Page Application) 방식입니다. 더 쉽게 설명을 드리자면, 게시판의 "좋아요" 버튼이 있는데 이것을 클릭할때마다 페이지를 새로 불러오는게 아닌 비동기 방식으로 부분적으로 데이터를 변경하는 방식이라고 생각하시면 됩니다. 이것은 뷰 라우터에서는 페이지를 전환하는데 사용되기 때문에 화면 전환이 부드럽고 깔끔하며, 사용자에게 좋은 인식을 줄 수 있습니다. 뷰 라우터(vue-rotuer) 설치하기 # 해당 프로젝트 폴더에서 실행 npm install --save vue-router 뷰 라우터(vue-rotuer) 설명 태그 설명 <router-link to="URL 값"> 페이지 이동시 사용하는 태그 입니다. HTML에서는 A태그로 표시되며 클릭하면 "to" 속
Vue DevTools(크롬 확장 프로그램) 설치하기 크롬 확장프로그램을 통해서 뷰 데브툴즈를 다운로드 받을 수 있습니다. 해당 툴을 통해서 크롬 콘솔(F12) 탭에서 Vue 항목을 확인 하실 수 있으며, 디버깅을 더욱 쉽게 도와줍니다. Vue.js devtools Chrome and Firefox DevTools extension for debugging Vue.js applications. chrome.google.com Vue DevTools 사용하도록 허용하기 기본적으로는 데브툴즈를 사용할 수 없도록 "false" 되어있습니다. 만약에 뷰로 만든 어떤 사이트든 해당 툴을 사용하게 되면 보안상 문제가 발생 될 수 있기 때문입니다. 개발시에만 사용하도록 합니다. # "main.js" 파일에 아래 내용을 추가합니다. # 기본값은 "false" 입니다. Vue.config.devtools = true; 참고 링크 Vue.js is detected on this page. Devtoo
alias "@" 별칭이 필요한 이유 아래와 같이 임포트에서 일일이 경로를 적어주는것이 매우 불편할 수 있기 때문에 "@" 별칭이 필요합니다. skyepodium 게시글 이미지 인용 ※ "vue-cli 2.x" 버전에서는 "webpack.config.js"(웹팩 설정 파일)에서 "@"를 사용하는 경로가 정의 되어 있었지만, 현재의 버젼에서는 따로 웹팩 설정파일은 없어지고 대신 "vue.config.js"에서 설정하고 있습니다. Vue.JS CLI 설치한 경우 CLI로 설치한 경우 별도로 설정 없이 바로 사용할 수 있습니다. 임포트 "@" 별칭 사용 개별적인 별칭이 필요한 경우 # "vue.config.js" 파일에 아래의 내용을 추가합니다. # 상단 "path" 선언과 하단의 "configureWebpack"을 추가하면 됩니다. # 아래 처럼 "@"가 아닌 "~"(물결 표시) 같은 별칭을 추가해서 사용할 수 있습니다. const path = require("path"); module
NodeJS(Express) API 서버 만들기 [CentOS7] nodeJS (Vue.JS) + Express API 서버 구축하기 nodeJS(Express) 설치 하기기존 익스프레스를 통해서 API 서버를 구축하며, MySQL도 연동 가능합... blog.naver.com NodeJS에서 제공하는 "bcrypt" 설치하기 "bcrpyt"는 npm에 등록되어있는 암호화 모듈입니다. 이 모듈을 이용하면 아주 쉽게 패스워드의 "hash" 값을 구하고 비교할 수 있습니다. # "express" 폴더로 이동 후 설치해주세요. # 설치하는 김에 필요한 "mysql"도 설치해줍니다. npm install --save mysql bcrypt MySQL 연동 및 라우터 설정하기 # 생성한 "express" 폴더 안에 "routes/users.js" 파일을 수정해주세요. # 하단의 쿼리를 연결하는 곳에 "아이디", "비밀번호", "테이블"을 입력해주세요. # XHR으로 "/login", "/re
프리 프로세서란? Pre-Preprocessor "PostCSS" 알아보기전에는 우리는 "프리 프로세서"라는것을 알아야 합니다. 한번쯤은 들어봤을 "Sass", "Less", "Stylus"는 "전처리기(자)"라고 하며, "PostCSS"는 "후처리기(자)"라고 하며, 이를 통틀어서 "프리 프로세서(Pre-Preprocessor)"라고 합니다. 더욱 자세한 내용은 번외로 다루도록 하겠습니다. PostCSS란? 자바스크립트(플러그인)로 CSS를 변환을 통해 처리하는 "후처리기(자)"라고 불리우며, 이름 처럼 CSS를 작성한 후에 처리하는 도구입니다. # 간단한 예시를 보겠습니다. # 대부분 CSS를 작성할 때에는 크로스 브라우징(IE, 크롬, 사파리 등등)을 염두해두고 대부분 아래 처럼 작성하실 겁니다. 크롬에서는 되지만 IE, 사파리에서는 지원이 되지 않아서 사용(적용)이 안될 수 있습니다. .flexbox { display: -webkit-box; display: -webkit-f
프리 프로세서란? Pre-Preprocessor "Sass", "Less", "Stylus"는 "전처리기(자)"라고 하며, "PostCSS"는 "후처리기(자)"라고 하며, 이를 통틀어서 "프리 프로세서(Pre-Preprocessor)"라고 합니다. 우리는 여기서 더 복잡하게 생각할 필요 없이 "프리 프로세서(Pre-Preprocessor)"는 "전, 후처리기(자)"로 나뉘며, "Sass(Scss)", "Less", "stylus"는 "전처리기(자)"이며, "PostCSS"는 "후처리기(자)로 알고 계시면 될것 같습니다. Sass 설치하기 # 해당 뷰 프로젝트 폴더에서 설치해주세요. npm install --save sass-loader node-sass Sass 간단보기 # 해당 컴포넌트 파일 하단에 "<style>" 태그안에 내용을 입력해주세요. 다만, "lang" 값은 "scss"로 지정해주세요. # 여기서 "scoped"는 해당 컴포넌트에서만 스타일을 적용하겠다는 뜻 입니다.
퍼미션 문제로 접속 불가시 You don't have permission to access 1. 권한 수정하기 # "-R" 붙이면 하위 디렉토리까지 전부 변경 # "777" 다른 사용자도 변경을 허용 # 권한 수정의 경우 테스트로 "777"를 해본 후 원인이 맞다면 적당한 권한으로 수정하길 권장 chmod -R 777 /home/username OR chmod -R 777 /var/www/html 2. 소유자 변경하기 # "-R" 붙이면 하위 디렉토리까지 전부 변경 chown -R root:root /home/username OR chown -R root:root /var/www/html 3. httpd.conf vi /etc/httpd/conf/httpd.conf # 아래 부분을 찾은 후 <Directory /> AllowOverride none Require all denied </Directory> ----- # 아래와 같이 변경 <Directory /> AllowOverrid
5.8 -> 6.X 업데이트시 발생된 문제 In cache.php line 91: Call to underfined function str_slug() 라라벨 6.X에서는 모든 "str_", "array_"는 "laravel/helpers" 컴포저 패키지로 이동되었고 프레임워크에서는 제거되었습니다. # "헬퍼"를 설치 한 후 업데이트가 가능합니다. composer require laravel/helpers In cache.php line 91: Call to underfined function str_slug() 6.X -> 7.X 업데이트시 발생된 문제 Symfony 5 PHP Fatal error: Declaration of App\Exceptions\handler::report(Excrption $exception) must be compatible with Illuminate\Foundation\Exceptions\Handler::report(Throwable $e) in .
퍼미션 문제 발생 Permission denied The stream or file "/home/centos/BeverageManager/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied 위와 같은 오류로 권한, 퍼미션 등을 조정해도 안되는 경우가 있습니다. 그런 경우 SELinux를 체크해봐야 합니다. CentOS7 부터는 기본값이 False 로 바뀌어서 /var/www/html 같은 폴더에 컨텐츠가 있을 경우 소유자가 웹 서버(apache) 이고 파일 퍼미션에 write 가 설정되어 있고 httpd_sys_content_t context 가 설정되어도 쓰지를 못하게 되어있습니다. SELinux 설정하기 # SELinux를 사용하여 이 명령을 사용하여 파일 쓰기를 허용합니다. setenforce 0 # 라라벨 프로젝트 폴더로 이동 후 "storage" 폴더를 "httpd_sy
"@" 별칭 사용하기 webpack.mix.js 라라벨의 경우 "webpack.config.js" 설정하는 곳은 "webpack.mix.js"라고 보시면 됩니다. # "/webpack.mix.js" 디렉토리 최상단의 파일을 열어줍니다. # 아래와 같이 복붙 및 다른 부분만 변경해주세요. const mix = require("laravel-mix"); // 초기 디렉토리 경로를 담습니다. const path = require("path"); mix.react("resources/assets/js/app.js", "public/js") .sass("resources/assets/css/sass/app.scss", "public/css"); // "@"는 별칭으로 사용하며, "~" 와 같이 다르게 변경이 가능합니다. // "path.resolve("resources")"에서 "resources"는 최상위 디렉토리 다음 하위 디렉토리를 설정합니다. // "extensions"는 적용할 파일
컨테이너 Container 컨테이너는 요소의 너비를 현재 중단점에 고정하기 위한 구성 요소입니다. 클래스 명령어 특성 .container None width: 100%; sm (640px) max-width: 640px; md (768px) max-width: 768px; lg (1024px) max-width: 1024px; xl (1280px) max-width: 1280px; 사용방법 Usage ".container" 클래스는 요소가 현재 명령어의 "min-width"과 어울리는의 "max-width" 가져오거나 설정합니다. 만약 당신이 화면 크기의 고정된 세트 대신 완전 유체 보임창 수용을 시도하 설계하고 싶어요 이 기능이 유용합니다. 여러분은 다른 프레임워크에 사용했을 것 용기와 달리 "Tailwind"의 컨테이너가 자동으로 어떤 내장형 수평 패딩이 없는 자체가 초점을 맞추지 않습니다. # 컨테이너 초점을 맞추려면 ".mx-auto"를 사용합니다. <div class="co
테스트 환경 # CentOS7 # PHP 7.4.6 최신버젼 # APACHE 2.4.43 최신버젼 # Larvel 7.X 최신버젼 PHP 의존성 패키지 설치하기 # 의존성 라이브러리 패키지 설치하기 yum install -y libaio gcc systemtap-sdt-devel # PHP 확장 기능(의존성) 필수 설치 yum install -y php-fpm php-cli php-redis php-brotli php-gd php-gmp php-imap php-bcmath php-interbase php-json php-mbstring php-mysqlnd php-odbc php-opcache php-memcached php-tidy php-pdo php-pdo-dblib php-pear php-pgsql php-process php-pecl-apcu php-pecl-geoip php-pecl-gmagick php-pecl-hrtime php-pecl-json php-pecl-mem
동적로드(딩)란? LazyLoad 프로젝트 규모가 커질 수록 사용자 입장에서도 리소스 다운받는 양이 늘어나게 됩니다. 즉, 이것은 로딩이 지연되거나 화면이 버벅이는 현상으로 인해 사용자 입장에서는 좋은 경험으로 받아들여지지 않습니다. 그렇기 때문에 동적으로 로딩을 합니다. 대표적 사용은 이미지가 많은 페이지에서 스크롤을 내릴때 해당 스크롤 위치에 맞춰 미리 1 ~ 2개 정도만 미리 로딩해놓는겁니다. 그렇게 되면 한번에 웹페이지의 리소스인 이미지를 다운받지 않고 분할하여 다운받기 때문에 전체적인 퍼포먼스가 향상되고 사용자 경험도 매우 좋은 긍정적인 평가를 받습니다. 뷰 같은 경우에는 컴포넌트를 한번에 다운로드 받게 되는데, 이에 필요한 부분만 다운받아 쾌적한 느낌을 받을 수 있습니다. "LazyLoad"의 개념을 이해하시면, 다른 환경, 조건에서도 충분히 구현 할 수 있습니다. 파일 분할하여 저장하기 webpackChunkName 뷰에서는 대표적으로 한개의 JS에 압축하여 불러오게 됩
템플릿 엔진이란? 템플릿 엔진은 파일을 HTML 형식으로 변환시키는 모듈입니다. "Express"에서 가장 많이 사용하는 템플릿은 엔진은 "Jade"이며, 그에 비해 EJS는 똑같은 HTML에서 "<% %>" 를 사용하여 서버의 데이터를 사용하거나 코드를 실행 할 수 있습니다. # "ejs"로 서버 데이터를 넘겨 "<% %>"으로 실행하는 예제 # "routes/index.js" 파일 내용 const express = require("express"); const router = express.Router(); router.render = function(req, res, next) { res.render('index', {title : 'Hello EJS'}); } module.exports = router; # "views/index.ejs" 파일 내용 <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8" /> <meta
주의사항 # 센토스에 오라클을 설치하기 전에 스토리지(저장공간)를 여유있게 확보해놓아야 합니다. # 저는 보통 최소 30GB 이상 맞춰놓습니다. 오라클 사용자 생성 # "CentOS" 서버 계정을 생성하여 오라클 권한을 부여해줄겁니다. groupadd -g 1100 dba groupadd -g 1101 oinstall useradd -g dba -G oinstall oracle # "oracle" 계정 비밀번호 설정 passwd oracle 관련 패키지 설치 # 설치중에 없는 패키지도 있겠지만, 크게 문제는 없을것 같습니다. yum install -y bc binutils compat-libcap1 compat-libstdc++ elfutils-libelf elfutils-libelf-devel fontconfig-devel glibc glibc-devel ksh libaio libaio-devel libXrender libXrender-devel libX11 libXau libXi
계정 생성 하기 # 먼저, 오라클 설치시 지정한 계정으로 로그인 su - 계정이름 # sqlplus 접속 sqlplus / as sysdba # "오라클 12C 이상" 부터는 아이디 앞에 "c##" 필수 # 비밀번호는 특수문자가 안됨 CREATE USER c##abcd IDENTIFIED BY abcd; ※ 아이디 앞 "c##"이 아이디 자체에 포함 계정 권한 부여 # 모든 권한 부여 grant connect, dba, resource to c##api;
PM2 설치하기 npm install pm2@latest -g PM2 시작하기 명령 설명 pm2 start "AppName" 시작 pm2 stop "AppName" 중단 pm2 delete "AppName" 삭제 pm2 reload pm2 reload "AppName" 재시작 pm2 show "AppName" 상세 정보 확인 pm2 ls pm2 list 리스트 항목 확인 pm2 monit 모니터링 화면 출력 pm2 logs 로그 확인 pm2 startup 서버 부팅시 자동 시작 등록 # 시작 pm2 start npm --name "Your APP Name" -- start # 시작 (클러스터 모드) pm2 start npm --name "APP Name" -i 0 -- start # 시작 예제 pm2 start npm --name socketserver -i 0 -- start 클러스터 모드란? # "PM2"에서 제공하는 "클러스터 모드"는 코드 수정 없이 "CPU 확장" 할 수 있
PHP 7.X 버젼 최소 메모리 사양 # 최소 메모리 1.5G 이상으로 알고 있지만 서버 메모리를 2G 이상으로 선택하거나 업그레이드 권장 PHP 메모리 제한 해제 memory_limit # PHP 메모리 제한 수정 vi /etc/php.ini # 위 파일을 연후 ":/128M" 입력 후 엔터 이후 값 수정 # "-1" 입력시 무제한 이외에는 서버 사양에 따라 직접 메모리 설정 memory_limit = 128M => memory_limit = -1 => memory_limit = 512M ※ 위 설정으로도 컴포저가 다운되거나 관련된 작업이 불가한 경우 서버자체 사양 메모리를 높여주는게 제일 좋은 방법
Firewalld 설치하기 # "Firewalld" 설치 yum install -y firewalld # 자동시작 등록 및 시작 systemctl start firewalld systemctl enable firewalld Firwalld 명령어 사용법 명령어 설명 firewall-cmd --permanent --zone=public --add-port=포트번호/tcp 포트 열기 firewall-cmd --permanent --zone=public --add-port=포트번호-포트번호/tcp 포트 범위 열기 firewall-cmd --permanent --zone=public --add-source=아이피 --add-port=포트번호/tcp 포트 열기 및 허용 IP 추가 firewall-cmd --permanent --zone=public --remove-port=포트번호/tcp 포트 삭제 firewall-cmd --get-zones 사전 정의된 존 출력 firewall-cmd --
Remote Development 확장 프로그램 설치 # "Remote Development" 설치시 확장팩 3개가 설치 됩니다. Remote Development SSH 접속을 위한 키 생성하기 # "VSCODE"를 연후 "Ctrl + `" 단축키를 통해서 터미널로 이동 후 아래 명령 실행 ssh-keygen -t rsa -b 2048 # 저장 위치(기본 "C:\Users\윈도우계정/.ssh/id_rsa") Enter file in which to save the key (C:\Users\윈도우계정/.ssh/id_rsa): # "passphrase"는 입력하지 않고 엔터 Enter passphrase (empty for no passphrase): # 똑같이 엔터 Enter same passphrase again: # 아래와 같이 나온다면 생성 완료 Your identification has been saved in C:\Users\윈도우계정/.ssh/id_rsa. Your pub
오류 발생 원인 ESLint 오류 # 위와 같이 비슷한 오류가 발생되는 이유는 아래와 같습니다. "ESLint"는 자바스크립트 코딩시 오류가 발생되지 않게 문법을 조정(보조)해주는 패키지 입니다. 위 이미지 처럼 오류가 발생되는 이유는 애플리케이션 실행에는 문제 없으나, 코드에 사용하지 않는 변수 등을 정리하라고 경고하는 메세지 입니다. 해결 방법 # 먼저, 뷰 프로젝트에 "vue.config.js" 파일이 없다면 생성 후 아래 내용 입력 후 저장 module.exports = { devServer: { overlay: false } } ※ 주의 할점은 "overlay" 옵션을 가장 상단에 올려주세요. vue.config.js 다른 방법 # "package.json" 파일을 열어 끝에 추가 --quiet OR --quiet \"{tests,src}/**/*.{js,vue}\" package.json 참고 링크 ESLint '--quiet' Option has no effect · I
뷰엑스는 무엇인가? Vuex # 뷰의 핵심은 "데이터" 중심의 "컴포넌트"라고 봐도 무방할 정도로 집중적으로 사용하게 됩니다. # 보통 뷰 프로젝트를 하게 되면, 컴포넌트 관리를 쉽게하기 위해서 "라우터"라는것도 사용하게 됩니다. 즉, 사용자가 어떤 이벤트를 발생했을때 다른 페이지를 보여줄때 "라우터"를 사용합니다. # 문제는 여기서 발생됩니다. 서로 다른 페이지(컴포넌트)를 보여줄때 다른 컴포넌트 간에 값을 전달하기 위해서는 "부모 => 자식에서 props의 전달 방법", "자식 => 부모에게 Emit event의 전달 방법" 으로 데이터를 주고 받아야 합니다. 위 문제는 정말 작은 소규모 프로젝트에서는 문제가 되지 않을 수 있습니다. 왜냐하면, 소규모인만큼 구조가 간단하니깐요... 하지만 대형 프로젝트에서는 유지보수를 할 수 없을만큼 감당하기 어려울겁니다. # 그래서 위 문제를 해결해 주는 것이 "Vuex"라고 보시면 됩니다. "모든 컴포넌트들을 하나의 중앙 집중식 저장소 역활
Vuex 설정하기 # 뷰 프로젝트 폴더로 이동 후 "Vuex" 패키지를 설치합니다. npm install --save vuex npm install --save jsencrypt npm install --save axios ※ 이전에 설치했던 패키지가 있으면 넘어가도 됩니다. # 뷰 프로젝트 "src/store/index.js" 폴더와 파일을 만들어주세요. # "index.js"는 아래 내용이 들어갑니다. import Vue from "vue"; import Vuex from "vuex"; import axios from "axios"; import router from "@/routes"; import { decrypt } from "@/encrypt"; // Vuex를 사용하기 위해서 글로벌로 선언합니다. Vue.use(Vuex); // Vuex를 사용합니다. export default new Vuex.Store({ // 공용으로 사용할 state 값을 지정합니다. state:
Redux와 Vuex 어떤걸 사용해야 하나요? 초기 SPA(Single Page Application) 방식의 프로젝트들은 데이터 관리에 대해서 많은 이슈가 있었습니다. 그래서 로컬 스토리지, 세션 스토리지, 쿠키 등 여러 방법으로 해결하고자 했었습니다. 프로젝트 규모가 커질수록 더욱 관리가 힘들어지고 사용에 대한 제약이 생겨나기 시작했습니다. 처음에는 React에서 Redux라는 개념이 생겨나면서 스토어로 데이터를 관리하기 시작했습니다. (Redux가 React를 염두에 두고 만들어졌다는 내용도 있습니다.) 다른 프레임워크인 Angular, Vue에서도 영향을 받아 중앙집중식 데이터 관리가 추가되었습니다. Redux, Vuex 모두 좋은 상태관리 라이브러리지만 Vue에서는 Vuex를 활용하는것이 성능상에서도 많은 이점을 가져올 수 있습니다. 이유는 아래와 같습니다. 1. 돌연변이체는 감속기와 함께 "사용하기가 더 쉬움" 2. "Vuex"에서 "비동기 작업"은 훨씬 더 "체계적 구성
오류 발생원인과 해결하기 오류코드 "Listener refused the connection with the following error : ORA-12505, TNS: listener does not currently know of SID given in connect descriptor" # 결론 적으로는 SID 값이 맞지 않아서 그렇습니다. 서버에서 "SID" 값을 확인해주신 다음에 "SQL Developer" 같은 툴로 "SID" 값을 동일하게 넣어주시면, 정상적으로 접속되실겁니다. SID 확인 및 변경 # "sqlplus" 접속 sqlplus / as sysdba # "SID" 확인 방법 select name from v$database; # "instance" 확인 방법 select instance from v$thread; # "ORA-01034: ORACLE not available" 오류 발생시 오라클이 실행되고 있지 않아서 발생되는 문제로 오라클 실행하기 # "sq
PHP 웹 라우터 설정하기 라우터 설정으로 새로고침 및 주소를 입력하여 이동시 404 페이지가 아닌 해당 컴포넌트를 보여주는 방법입니다. # "routes/web.php" 이동 후 아래 내용 추가 # "파일이름.blade.php" 이 부분은 라라벨 설치시 초기에 "welcome.blade.php" 파일 보신게 있으실 겁니다. 이 파일의 이름 앞 부분인 "welcome" 이렇게만 입력해주시면 됩니다. Route::get('/{any}', function () { return view('파일이름.blade.php'); })->where('any', '.*'); # 예제 # 저는 "index.blade.php"으로 되어있기 때문에 앞에 "index"만 입력하면 됩니다. Route::get('/{any}', function () { return view('index'); })->where('any', '.*');
SSH 접속시간 수정 # "sshd_config" 연후 아래 내용 수정 # "#" 주석이 있다면 풀기 vi /etc/ssh/sshd_config # "ClientAliveInterval" 클라이언트 살아있는지 확인하는 간격 ClientAliveInterval # "ClientAliveCountMax" 클라이언트 응답 없어도 접속 유지하는 횟수 ClientAliveCountMax # 예제 ClientAliveInterval=15, ClientAliveCountMax=3 이면 45초 후 접속 끊김 # "sshd" 재시작 systemctl restart sshd # 재확인하기 cat /etc/ssh/sshd_config | grep Client vi /etc/ssh/sshd_config 참고 링크 SSH 접속 유지시간 연장 How to Keep Alive SSH Sessions How to avoid SSH timeouts SSH 접속 유지하기 SSH 접속 유지시간 변경 목차 1 TMOU
패키지 설치하기 # 라라벨 프로젝트 폴더에서 설치 npm install vuetify npm install @mdi/font App.js 수정하기 # 아래 내용을 추가 import Vuetify from "vuetify"; Vue.use(Vuetify); new Vue({ render: (h) => h(main), vuetify: new Vuetify(), }).$mount("#app"); # 예제 import Vue from "vue"; import Vuetify from "vuetify"; import App from "@/components/App"; Vue.config.productionTip = false; Vue.config.devtools = true; Vue.use(Vuetify); new Vue({ render: (h) => h(App), vuetify: new Vuetify(), }).$mount("#app"); app.scss 수정하기 # 상단에 추가 @impor
리스너 상태 확인 # 상태 확인 lsnrctl status # 아래 사진처럼 정지되 있는 경우 # 정지 후 재실행 lsnrctl stop lsnrctl start lsnrctl
배열 감시하기 export default { date() { Test: [ { id: 1, name: "홍길동1", }, { id: 2, name: "홍길동2", }, ], }, watch: { "Test.0.name": function() { console.log("홍길동1 값 체크"); } "Test.1.name": function() { console.log("홍길동2 값 체크"); } }, } 오브젝트 감시하기 export default { date() { Test: { Good: false }, }, watch: { "Test.Good": function() { console.log("Test.Good 값 변경"); } }, }
REF 선언하기 # 지정한 "이름"이 "refs"에 들어가게 됩니다. 즉, 설정한 "이름"으로 컴포넌트 경로가 지정됩니다. created() { this.$root.$refs.이름 = this; }, methods: { Test() { console.log("호출!"); } } 다른 컴포넌트에서 호출 # 위에서 설정한 컴포넌트 "이름"을 넣어 메소드를 실행합니다. this.$root.$refs.이름.Test(); 예제 # "A 컴포넌트" created() { this.$root.$refs.A = this; }, methods: { action() { this.$root.$refs.B.test(); }, test() { console.log("A 호출!"); } } # "B 컴포넌트" created() { this.$root.$refs.B = this; }, methods: { action() { this.$root.$refs.A.test(); }, test() { console.lo
Axios 장점 1. "구형 브라우저 지원" (IE8 이상을 포함한 모든 최신 브라우저를 지원) 2. "요청 중단" 가능 3. "응답 시간 초과" 설정 가능 4. "CSRF 보호" 기능 5. "JSON 데이터 자동 변환" 6. "Promise" 기반으로 "async, await" 문법으로 "XHR" 요청이 매우 간단 Axios 패키지 설치 # 뷰 프로젝트 폴더에서 설치 npm install --save axios App.js 수정하기 # "axios" 선언 import axios from "axios"; # "axios" 전역 사용 Vue.prototype.$http = axios; Axios 기본 사용 # "axios.get" : "GET" 요청 # "axios.post" : "POST" 요청 # 헤더, 파라미터, 데이터 모두 지원 axios.get("요청할주소", { headers: { 'Content-Type': 'application/x-www-form-urlencoded',
TCP/UDP의 포트 목록 # 알려진 포트(well-known port)는 특정한 쓰임새를 위해서 IANA에서 할당한 TCP 및 UDP 포트 번호의 일부이다. 일반적으로 포트 번호는 다음과 같이 세 가지로 나눌 수 있다. 0 ~ 1023 : 잘 알려진 포트 (well-known port) 1024 ~ 49151 : 등록된 포트 (registered port) 49152 ~ 65535 : 동적 포트 (dynamic port) 잘 알려진 포트 # 대부분의 유닉스 계열 운영 체제의 경우, 잘 알려진 포트를 열려면 루트 권한이 있어야 한다. # 이 번호는 강제적으로 지정된 것은 아니며, IANA의 권고안일 뿐이다. 가끔 각 포트 번호를 그대로 사용하지 않고 다른 용도로 사용하기도 한다. # 이 경우, 트로이 목마와 같은 프로그램들이 악의적인 목적으로 포트를 변경하여 사용하는 경우도 있다. 포트 TCP UDP 설명 상태 0 UDP 예약됨; 사용하지 않음 공식 1 TCP TCPMUX (TCP
추가하기 # 라라벨 프로젝트 최상단 ".env" 파일에서 내용을 추가해주세요. # 아래는 예제 입니다. MIX_PUBLIC_KEY=MFwwDQYJKoZIhvcNAQEBBQADSwAw ※ 앞에 "MIX_" 값을 넣어주세요. 사용하기 # 위에서 추가한 값을 가져오기 위해서 아래와 같이 사용합니다. # 만약, 인식하지 못한다면 터미널에서 "php artisan serve" 명령을 실행 한후 다시 재시도 해보세요. process.env.MIX_PUBLIC_KEY
리포지토리(EPEL) 설치하기 yum install -y epel-release 참고 링크 CentOS, RHEL 또는 Amazon Linux를 실행하는 EC2 인스턴스에 대한 EPEL 리포지토리 활성화 표준 리포지토리는 CentOS, RHEL 또는 Amazon Linux 기반 배포에 설치할 수 있는 일부 패키지를 제공하지 않을 수도 있습니다. EPEL 리포지토리를 활성화하면 패키지 설치에 대한 추가 옵션이 제공됩니다. 해결 방법 다음 단계에 따라 RHEL, CentOS 또는 Amazon Linux 기반 배포에서 EPEL 리포지토리를 다운로드, 설치 및 활성화합니다. Amazon Linux Amazon Linux 2: RHEL 7용 EPEL 릴리스 패키지를 설치하고 EPEL 리포지토리를 활성화합니다. sudo yum install ... aws.amazon.com
ROOT 계정 로그인 허용하기 보안상 허용하지 않는것이 좋음 # "sshd_config" 파일을 연뒤 아래 "PermitRootLogin"을 찾아서 "yes" 설정하기 # 만약, 주석처리만 되어있다면 주석제거 vi /etc/ssh/sshd_config PermitRootLogin no => PermitRootLogin yes ※ 서비스시에는 로그인 하지 못하게 막을것! 아마존(AWS) 서버 생성 후 보조 계정의 인증키 복사하기 발급받은 pem 키를 복사하는 방법 # 아마존에서 서버 생성 후 기존 계정에 연결된 ".pem" 키를 "root"에 복사하는 방법 sudo cp /home/ec2-user/.ssh/authorized_keys /root/.ssh # "centos" 서버라면 "/home/centos"로 변경 sudo cp /home/centos/.ssh/authorized_keys /root/.ssh ※ 이제 서버 생성시 만들었던 팸 키를 "root" 계정에서 로그인이 가능하다
권한 수정 # "root" 계정으로 로그인 후 "etc" 폴더로 이동 cd /etc # "sudoers" 파일에 권한 777 설정 chmod 777 sudoers 파일 수정 # "sudoers" 파일 수정 vi sudoers # 하단 "root ALL=(ALL) ALL" 부분을 찾아서 추가할 계정에 똑같이 설정 후 저장 계정이름 ALL=(ALL) ALL ※ 권한 변경 없이는 "sudoers" 파일이 열리지 않음 권한 재설정 # "etc" 폴더로 이동 cd /etc # "sudoers" 파일에 권한 440 설정 chmod 440 sudoers
용량 추가 # 스왑 정보 확인 free # 현재 계정 루트에 생성 mkdir /swap # 오라클 설치라면 "5G" 추천 dd if=/dev/zero of=/swap/swapfile bs=1M count=5120 # 위에서 만든 "swap" 폴더로 이동 cd /swap # 스왑 영역 생성 mkswap swapfile # 스왑 활성화 swapon swapfile # 스왑 확인 swapon -s 재부팅시에도 적용 # "fstab" 파일을 열기 vi /etc/fstab # 아래 내용 추가 /swap/swapfile swap swap defaults 1 1 용량 제거 # 스왑 공간 제거 swapoff swapfile # 위에서 생성한 폴더 및 파일 제거 rm -rf /swap/swapfile # 재부팅시 적용했다면 제거 vi /etc/fstab # 아래 내용을 삭제하거나 주석처리 /swap/swapfile swap swap defaults 1 1 참고 링크 리눅스 swap 용량 늘이는 방법
명령어 명령어 단축명령어 설명 --save-prod -P "dependencies"에 패키지를 추가합니다. --save-dev -D "devDependencies"에 패키지를 추가합니다. --save-optional -O "optionalDependencies"에 패키지를 등록합니다. --no-save "dependencies"에 패키지를 등록하지 않습니다. --save # "package.json" 파일의 "dependencies" 항목에 패키지 정보가 추가 됩니다. 프로덕션(실서비스) 빌드시 "패키지가 포함되어 빌드" 됩니다. 즉, 테스트 목적 및 개발 상황이 아닌 실제 서비스를 위해서 빌드할때에 "dependencies" 항목에 추가된 패키지들이 같이 포함되어 빌드 됩니다. package.json --save-dev # "package.json" 파일의 "devDependencies" 항목에 패키지 정보가 추가 됩니다. 프로덕션(서비스) 빌드시 패키지가 "포함되지 않고 빌드"
dotenv 설치하기 npm install dotenv .env 파일 생성 # 최상위 디렉토리에 ".env" 생성 PUBLIC_KEY=공개키 PRIVATE_KEY=비공개키 dotenv 사용하기 # "dotenv" 모듈 사용 import dotenv from 'dotenv'; dotenv.config(); OR require("dotenv").config(); # 위의 모듈을 가져온 후 아래 처럼 사용이 가능합니다. var PRIVATE_KEY = process.env.PRIVATE_KEY; var PUBLIC_KEY = process.env.PUBLIC_KEY; dotenv 경로 변경하여 사용 # 최상위 디렉토리 위치가 아닌 특정 위치가 필요하다면 아래와 같이 사용 import path from 'path'; import dotenv from 'dotenv'; dotenv.config({ path: path.join(__dirname, '경로1/경로2/.env') }); OR con
# 개발 과정에서 Vue는 일반적인 오류 및 함정을 해결하는 데 도움이 되는 많은 경고를 제공합니다. 그러나 이러한 경고 문자열은 프로덕션에서는 쓸모 없으며 앱의 페이로드 크기를 키웁니다. 또한 이러한 경고 검사 중 일부는 프로덕션 모드에서 피할 수 있는 런타임 비용이 적습니다. Webpack 4+ # "webpack.mix.js" 파일을 연후 아래 내용 추가 mix.webpackConfig({ mode: "production", }); Webpack 3 과 그 이전 버전 var webpack = require('webpack'); mix.webpackConfig({ plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') }) ] }); Browserify # "production "으로 설정된 실제 NODE_ENV 환경 변수로 번들링 명령을 실행하십시오. 이렇게 하면 핫 리로
라우터 구조 경로 작동 설명 routes/api.php API api 미들웨어 그룹안에 포함되는 라우트들을 포함하고 있으며, 접속 속도 제한 기능을 제공합니다. 이 라우트들은 상태를 저장하지 않는것을 대상으로 하며 따라서 requests-요청들이 애플리케이션에 진입하면 이 라우트들을 통해서 토큰을 통해서 인증되고, 세션 상태에 엑세스 할 수 없습니다. routes/channels.php 소켓 애플리케이션에서 지원하는 모든 이벤트 브로드캐스팅 채널을 등록하는 파일입니다. routes/console.php 콘솔 클로저 기반의 명령어들을 정의해 놓을 수 있는 파일입니다. 각각의 클로저는 각각의 명령어 IO 메소드와 상호작용하는 간단한 명령어를 구현하는 명령어 인스턴스에 바인드 되어 있습니다. 이 파일에는 HTTP 라우트가 정의되어 있지는 않지만, 애플리케이션에 콘솔 기반의 진입점(라우트와 비슷하게)을 정의합니다. routes/web.php 웹 web 미들웨어 그룹안에 포함되는 라우트들을
API 리밋 조절 # "app/http/Kernel.php" 파일을 연후 수정 # "$middlewareGroups" 그룹 하단 "API throttle" 수정 'api' => [ // 1분간 60회 요청 허용 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], => 'api' => [ // 1분간 120회 요청 허용 'throttle:120,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 예외 설정 # 위 설정이 적용이 안되는 경우에는 따로 "'throttle' => ['throttle:60,1']" 추가하여 전체 적용으로 테스트 합니다. protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\M
미들웨어란? # 서버로 들어오는 HTTP 요청들을 중간에 확인(검수) 하는 작업들을 처리합니다. 예로 들자면, 로그인 관련하여 로그인한 사용자가 HTTP 요청을 보내면, 로그인 되어있는지 미들웨어에서 확인하여 요청을 거부할껀지 승인할껀지에 대해서 설정이 가능합니다. 미들웨어 기본 구조 구조 설명 Authenticate 사용자 인증을 처리하는 미들웨어 입니다. CheckForMaintenanceMode 요청시마다 사이트가 정비 모드인지 확인합니다. EncryptCookies 보안을 위해 쿠키를 암호화합니다. RedirectIfAuthenticated 위에서 설명한 인증 여부를 확인하고 인증되지 않았을 경우 인증 페이지로 redirect 합니다. TrimStrings 모든 요청 데이터를 자동으로 트리밍합니다. TrustHosts 화이트 리스트 호스트 구성 TrustProxies 화이트 리스트 프록시 구성 VerifyCsrfToken 사이트 간 요청 위조(CSRF, XSRF) 공격 방지를
SED로 변경하기 # "/etc/php.ini" 파일안에 타임존 값 확인 grep date.timezone /etc/php.ini # 백업하기 cp /etc/php.ini /etc/php.ini.old # 변경하기 sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/g' /etc/php.ini # 백업 파일과 새로 만든 파일의 타임존 값 확인 diff /etc/php.ini.old /etc/php.ini # 아파치 재시작 systemctl restart httpd # 테스트 출력하기 php -r "echo date('Y-m-d H:i:s').PHP_EOL;" 직접 변경하기 # "php.ini" 파일을 연후 단축키 :/ 를 통해서 검색해줍니다. 예제, :/timezone 입력 후 엔터 vi /etc/php.ini # 앞 ";" 주석을 재거한 후 값 변경 ;date.timezone= => date.timezone= Asia/Seoul # 아
타임존 설정하기 # 리눅스 타임존 변경 timedatectl set-timezone Asia/Seoul OR ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime # 타임존 변경 한국 표준시(KST) 확인 date # 리눅스 서버 재부팅 shutdown -r now 참고 링크 리눅스 KST 시간대 설정 목차 1 개요 2 방법 1 3 방법 2 4 같이 보기 5 참고 1 개요 [ 편집 ] 리눅스 KST 설정 리눅스 한국 시간대 설정 한국 시간으로 변경 리눅스 한국표준시 적용 적용효과 및 메커니즘은 방법1, 2 모두 동일하다. 2 방법 1 [ 편집 ] 명령어 timedatectl set-timezone Asia/Seoul ️ Bash 3 방법 2 [ 편집 ] 명령어 ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime ️ Bash 실행예시 [root@zetawiki ~]# date Sun N... zetaw
사용하기 # 타임존이 설정되지 않은 경우 상단에 선언 date_default_timezone_set('Asia/Seoul'); # 현재 날짜 date("Y-m-d"); # 현재 날짜와 시간 date("Y-m-d H:i:s"); # 현재 시간으로 부터 전(-1), 후(+1), "초(seconds)" "분(minutes)" "시(hours)" "일(days)" "주(week)" "달(months)" "년(years)" # 예제 (1초 전) date("Y-m-d H:i:s", strtotime("-1 seconds")); # 예제 (1년 1개월 1일 1시간 후) date("Y-m-d H:i:s", strtotime("+1 years +1 months +1 days +1 hours")); # 예제 (2020년 1월 1일 지정) date("Y-m-d H:i:s", strtotime("2020-01-01")); # 예제 (2020년 1월 1일 기준 1달 후) date("Y-m-d H:i:s",
해시(해싱)이란? # 라라벨의 Hash 파사드는 사용자의 암호를 저장하는데 필요한 "안전한 Bcrypt와 Argon2 해싱을 제공"합니다. # 해싱의 기본 경로는 "config/hashing.php"이며, "Bcrypt"와 "Argon2" (Argon2i, Argon2id 변경버전)을 지원합니다. ※ "Argon2i" 드라이버는 "PHP 7.2.0 이상"의 버전을 요구하고, "Argon2id" 드라이버는 "PHP 7.3.0 이상"을 요구합니다. 1.해시 암호화 하기 # 상단 파사드 해시를 불러옵니다. use Illuminate\Support\Facades\Hash; # 아래 명령을 통해서 암호화 합니다. Hash::make("값"); 2-1. 해시 암호화(Bcrypt Work Factor)길이 설정하기 # "Bcrypt" 알고리즘을 사용하고 있다면 "rounds" 옵션을 사용하여 "Bcrypt" 알고리즘에서 사용하는 "work factor"를 관리할 수 있게 해줍니다 Hash::ma
설치하기 # "express" 폴더로 이동 후 설치 npm install -D nodemon 패키지 파일 수정 # "package.json" 파일을 열어 주신 후 아래 내용 수정 "node" 부분을 "nodemon"으로 수정 "scripts": { "start": "nodemon ./bin/www" }, # 서버 시작 npm run start
패키지 파일 수정하기 # 뷰 프로젝트 폴더의 "package.json" 파일을 열어주세요. 아래와 같이 "build" 부분 끝에 "--watch"를 추가해주세요. "build": "vue-cli-service build --watch --mode development", 익스프레스 서버 설정하기 [CentOS7] NodeJS(Express) 노드몬(nodemon) 서버 파일 변경 감지 및 자동 재시작 설치하기패키지 파일 수정 blog.naver.com 사용해보기 # 먼저, 뷰 프로젝트 폴더에서 빌드 시작 npm run build # 이후 터미널을 한개 더 열어주신 후 익스프레스(express) 폴더로 이동하여 서버를 시작합니다. # 뷰 폴더에서 실행한 빌드 명령은 뷰쪽 파일을 감지하여 자동 재빌드를 해주며, 익스프레스 폴더에서 실행한 서버는 "public" 폴더로 뷰가 빌드를 해주면 익스프레스 서버에서 노드몬이 파일 변경 감지를 하여 서버를 재시작 합니다. npm run start
최신버젼 업데이트 # 보통 "nodejs" 버젼에 따라서 "npm"도 자동으로 최신으로 설치됩니다. npm install -g npm # "npm" 버젼확인 npm -v # "npm" 버젼이 변경되지 않았다면 서버 재부팅 shutdown -r now
먼저 링크 모음 이후 정리 예정 phpinfo 정보 https://m.blog.naver.com/PostView.nhn?blogId=parkjy76&logNo=30037662612&proxyReferer=https:%2F%2Fwww.google.com%2F https://unabated.tistory.com/entry/%EC%84%B8%EC%85%98-%EC%84%A4%EC%A0%95-phpini opcache 정보 https://extrememanual.net/11088 https://www.lesstif.com/php-and-laravel/zend-opcache-23757119.html https://m.blog.naver.com/PostView.nhn?blogId=kshosting&logNo=221297259398&proxyReferer=https:%2F%2Fwww.google.com%2F
XSS 방어에 사용되는 함수 명령어 설명 strip_tags HTML 태그와 PHP 태그 제거하는 함수 htmlspecialchars 문자열에서 특정한 특수 문자를 HTML 엔티티로 변환 htmlentities 모든 문자열을 HTML 엔티티로 변환 1-1. 미들웨어 추가 # 터미널 명령으로 미들웨어 파일 추가하기 php artisan make:middleware XSSMiddleware # 아래 내용 추가 "array_walk_recursive"하고 "foreach" 퍼포먼스 차이는 PHP7 버젼으로 오면서 격차가 많이 줄었기 때문에 편한것으로 쓰면 됩니다. (그래도 "foreach"가 조금 더 빠릅니다.) # 저의 경우 API 데이터가 암호화 되서 전달되기 때문에 특수문자등 아래 명령들을 쓰기에 부적합하여 "preg_replace", "str_replace" 으로 진행했습니다. 특별하지 않은 경우에는 "strip_tags", "htmlentities", "htmlspecialcha
채널 드라이버 # 채널 드라이버는 아래의 예시에서 확인 하실 수 있으며, 아래의 사용가능한 채널 드라이버만 사용할 수 있습니다. "이외의 다른 값을 넣을시 서버가 다운될 수 있으니 참고"해주세요. 이름 설명 stack "다중 채널"을 생성할 수 있는 채널 single 하나의 파일이나 경로 기반 로거 채널(StreamHandler) daily Monolog 드라이버를 기반으로 한 일별 로테이션을 하는 RotatingFileHandler slack Monolog 드라이버를 기반으로 한 SlackWebhookHandler papertrail Monolog 드라이버를 기반으로 한 SyslogUdpHandler syslog Monolog 드라이버를 기반으로 한 SyslogHandler errorlog Monolog 드라이버를 기반으로한 ErrorLogHandler monolog 지원가능한 Monolog 핸들러를 사용하는 Molog 팩토리 드라이버 custom 지정된 팩토리를 호출해서 채널을
다운로드 주소 변경 # 아래 파일을 연후 수정 sudo vi /etc/apt/sources.list # 파일을 연후에 "ESC" 키를 눌른 후 ":" 한후에 아래 명령어 실행 그러면 기존에 있던 주소가 아래로 변경 됩니다. %s/archive.ubuntu.com/mirror.kakao.com/ %s/security.ubuntu.com/mirror.kakao.com/ 수정 파일 내용 # 원본 내용 # See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to # newer versions of the distribution. deb http://archive.ubuntu.com/ubuntu/ focal main restricted # deb-src http://archive.ubuntu.com/ubuntu/ focal main restricted ## Major bug fix updates produced after
root 계정으로 로그인 터미널에서 "su", "su root" 입력 su root sudoers 파일 권한 변경 "sudoers" 파일의 기본 권한은 "440" 권한 부여 후 다시 "440"으로 변경합니다. chmod 660 /etc/sudoers sudo 권한 추가 아래 "root" 이후에 추가할 계정을 똑같이 입력 vim /etc/sudoers sudoers passwd 파일 수정 부여할 계정을 찾은뒤 뒤에 숫자를 "0:0"으로 변경 vim /etc/passwd passwd root 그룹 추가 아래 "root:x:0:" 뒤에 "root" 그룹을 추가할 계정을 입력 후 저장 추가한 계정으로 로그인 해서 "sudo" 없이 명령이 실행되는지 확인합니다. vim /etc/group group
터미널 옵션 수정 터미널 먼저, 우분투 터미널에서 창쪽을 마우스 오른쪽 클릭하여 "기본값(D)" 혹은 "속성(P)" 클릭하여 수정 터미널을 클릭하여 드래그 하거나 마우스 오른쪽 클릭으로 붙여넣기 끄는 이유는 터미널을 클릭할때가 많은데 그때 드래그 형식으로 클릭이 되어 터미널이 잠시 멈추어 보이는 현상이 있음 (아무거나 설치할때 마우스로 터미널 글자 드래그 해보면 됨) 빠른 편집 모드 끄기 윈도우 우분투 터미널은 기본적으로 복사 붙여넣기인 "Shift+Insert(Ins)"가 안먹힘 그래서 "Ctrl+Shift+C/V"로 복사 붙여넣기 해주면 아주 편리함 Ctrl+Shift+C/V를 복사(C)/붙여넣기로 사용 켜기
sudo 권한으로 설치가 안될때 # "sudo" 명령어가 안될때 아래 명령어를 맨뒤에 붙여서 시도 sudo npm install 패키지 --unsafe-perm=true --allow-root Missing write access to # "Missing write access to" 오류 발생시 앞에 "sudo"를 붙여서 "root" 권한으로 설치 시도 Appears to be a git repo or submodule # "Appears to be a git repo or submodule" 오류 발생되면 "node_modules" 폴더의 "git" 폴더 삭제 후 시도 sudo rm -rf node_modules/*/.git/ 이외 오류는 댓글로 공유해주시면 최대한 빠르게 도움드릴 수 있도록 하거나, 차후에 게시글 내용에 추가하도록 하겠습니다.
레포지토리 주소 변경 아래 파일을 연후 수정 sudo vi /etc/yum.repos.d/CentOS-Base.repo 아래 "base"와 "updates"에서 "mirror.kakao.com" 국내 주소로 된것으로 추가하고 이전꺼는 "#" 주석 처리합니다. [base] name=CentOS-$releasever - Base #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ baseurl=http://mirror.kakao.com/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [updates] name=CentOS-$r
시작하기 앞서 현재 설치하는 환경은 윈도우10 우분투 입니다. 리눅스에서도 GUI 환경으로 안드로이드 스튜디오 설치하고 자바 설치해서 환경변수 설정하시면 될것 같습니다. NodeJS 설치하기 # 패키지 인덱스 정보 업데이트 sudo apt-get update # "build-essential", "curl" 사전 설치 sudo apt-get install -y build-essential curl # "NodeJS" 설치 curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - sudo apt-get install -y nodejs # "NPM" 설치 sudo apt install -y npm # 버젼 확인 node -v npm -v Xming 설치 GUI 툴 https://sourceforge.net/projects/xming/ # 위 사이트로 이동 후 다운로드하여 윈도우에 설치하여 실행해줍니다. "Xming" 실행시 나오는
authorized_keys 파일 수정 # 여러개의 키파일이 있고, 공개키를 등록하는것은 굉장히 간단합니다. 먼저, 계정 폴더로 이동 후 ".ssh/authorized_keys"을 열어주세요. 만약 없다면, 폴더와 파일을 생성해줍니다. # 공개키를 여러개 등록할 경우에는 끝에 띄어쓰기 후 이어서 붙여주시면 됩니다. 줄바꿈시에도 작동하기는 하지만, 특정 터미널에서 읽지 못하는 경우가 있습니다. 그래서 띄어쓰기로 구분해주세요. ssh-rsa 키값 test1 ssh-rsa 키값 test2 ssh-rsa 키값 계정명@DESKTOP-123456
패키지 설치 # "클라이언트, 서버" 모두 설치 npm install --save socket.io-encrypt 클라이언트 # 소켓 통신시 자동으로 암호화 됩니다. 서버에서 소켓을 통신 받으면 복호화 됩니다. 소켓 메세지에서는 암호화 되어 있지만, 콘솔로 찍어보면 복호화 되어 있을겁니다. const SocketIO = require('socket.io-client'); const encrypt = require('socket.io-encrypt'); const socket = SocketIO("연결할 주소"); encrypt("암호화 할 코드 입력")(socket); socket.emit('message', { ... }); 소켓 통신 암호화 서버 const SocketIO = require('socket.io'); const encrypt = require('socket.io-encrypt'); const io = SocketIO({}); io.use(encrypt("암호화 할
pusher 회원가입 Pusher Channels | Build Realtime Features Anywhere Easily build scalable realtime graphs, geotracking, multiplayer games, and more in your web and mobile apps with our hosted pub/sub messaging API. #PusherChannels pusher.com config/app.php 파일 수정 # "config/app.php" 파일을 수정합니다. 하단의 내용이 주석처리 되어 있다면 주석해제 없다면, 추가해주세요. App\Providers\BroadcastServiceProvider::class, laravel-websockets 설치 composer require beyondcode/laravel-websockets php artisan vendor:publish --provider="BeyondCode\LaravelW
출력 비교 $message = "Hello, World"; ----- echo $message; => Hello, World print($message); => Hello, World print_r($message); => Hello, World string(14) var_dump($message); => "Hello, World" $message = array("Hello", "World"); OR $message = array(); $message[0] = "Hello"; $message[1] = "World"; OR $message = [ "Hello", "World" ]; ----- echo $message; => Array print($message); => Array print_r($message); => Array ( [0] => Hello [1] => World ) var_dump($message); => array(2) { [0]=> string(6) "Hello"
배열 변수 사용 # "$message" 배열에 값을 추가 주의할점은 키값이 없어야 합니다. $message = [ "TEST1", "TEST2", "TEST3", ]; # "$message"에 담은 값을 각각 변수로 사용 list($a, $b, $c) = $message; ----- echo $a; => TEST1 echo $b; => TEST2 echo $c; => TEST3 특정 위치의 값을 변수로 사용 # 아래와 같은 방법은 가독성도 떨어지고 햇갈릴 수 있기 때문에 특별한 경우 사용하지 않는게 좋을것 같습니다. $message = [ "TEST1", "TEST2", "TEST3", ]; # "쉼표(,)"로 배열에 3번째 값을 "$a" 변수로 지정합니다. list(,, $a); ----- echo $a; => TEST3
압축 종류 명령 설명 gzencode() gzip 명령줄 도구와 동일한 GZIP 파일 형식을 사용합니다. 이 파일 형식에는 선택적 메타데이터, DEFLAT 압축 데이터 및 CRC32 체크섬 및 길이 검사를 포함하는 바닥글이 있습니다. gzcompress() ZLIB 형식이 사용됩니다. 압축 형식, DEFLAT 압축 데이터 및 ADLER32 체크섬이 포함된 바닥글만 식별하는 짧은 헤더를 제공합니다. gzdeflate() 원시 DEFLAT 알고리즘을 자체 사용하며, 이는 다른 두 형식 모두에 대한 기본입니다. 예제 # 용량 절감과 보안 향상을 위해 문자열을 압축한다. # 압축 $VALUE = "[email protected]" $VALUE = gzcompress($VALUE); print($VALUE); => x+KOILMtK,K-KT # 해제 $VALUE = "[email protected]" $VALUE = gzcompress($VALUE); $VALUE = gzuncompress($VALUE
Korean Language Pack for Visual Studio Code Korean Language Pack for Visual Studio Code # 비주얼 스튜디오 코드 한글화 Auto Complete Tag Auto Complete Tag 단축키 설명 Alt + . 단축키로 닫는 태그가 빠진 곳을 자동으로 변경합니다. # Auto Close Tag Visual Studio IDE 또는 Sublime Text와 동일한 HTML/XML 닫기 태그를 자동으로 추가합니다. # Auto Rename Tag 쌍으로 구성된 HTML/XML 태그의 이름을 자동으로 바꿉니다. Bracket Pair Colorizer 2 Bracket Pair Colorizer 2 # 일치하는 대괄호 색상을 지정하기 위한 사용자 지정 가능한 확장입니다. 즉, 대괄호의 시작과 끝이 되는 괄호의 색상을 표시하여 가독성을 높여줍니다. Rainbow Brackets Rainbow Brackets # 위의 "B
YUM 오류 발생 # 아래의 경우 /var/lib/rpm의 db가 깨졌을 가능성이 높은데, 해당 명령어 두줄로 간단히 해결 할 수 있습니다. 오류: rpmdb: BDB0113 Thread/process 5632/139869042812736 failed: BDB1507 Thread died in Berkeley DB library 오류: dbenv->failchk의 db5 오류(-30973): BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery 오류: db5(을)를 이용하여 Packages 인덱스를 열 수 없습니다 - (-30973) 오류: /var/lib/rpm 안의 패키지 데이터베이스를 열 수 없습니다 CRITICAL:yum.main: Error: rpmdb open failed # "RPM"의 "DB"삭제 후 다시 리빌드를 진행해줍니다. 이후 정상적으로 yum을 통해 패키지 설치 진행할 수 있습니다. rm -f /var/lib
해결 방법 sudo add-apt-repository ppa:rafaeldtinoco/lp1871129 sudo apt update sudo apt install libc6=2.31-0ubuntu8+lp1871129~1 libc6-dev=2.31-0ubuntu8+lp1871129~1 libc-dev-bin=2.31-0ubuntu8+lp1871129~1 -y --allow-downgrades sudo apt-mark hold libc6 참고 링크 WSL Ubuntu 20.04 - gpg: can't connect to the agent: IPC connect call failed · Issue #5125 · microsoft/WSL I have a fresh installation of Windows 10, and I am trying to get a development environment with WSL set up. I enabled WSL and installed Ubuntu
CURL 추가 "command line data transfer tool"의 약자 "setup_16.x" 여기에 숫자를 넣어주면 특정 버젼도 설치 가능합니다. curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh nodeJS 설치 "PPA"가 구성에 추가되고 로컬 패키지 캐시가 자동으로 업데이트 됩니다. 이제 이전 섹션에서와 같은 방법으로 "NodeJS" 패키지를 설치할 수 있습니다. ※ 만약, "NodeJS"를 업데이트 하고 싶다면 더 높은 버젼으로 추가 후 설치하면 됩니다. sudo bash nodesource_setup.sh sudo apt install -y gcc g++ make sudo apt install -y nodejs sudo apt install build-essential 노드, NPM 버젼 확인 node -v npm -v NPM 최신버젼 설치 sudo npm install -g npm gp
Opcache 값 수정 AWS "php.ini" 기본 경로 vi /opt/bitnami/php/etc/php.ini 값 "1" => "0" 수정하기 opcache.enable=0 아파치 재실행 ※ "AWS 라이트세일 서버 기준" sudo /opt/bitnami/ctlscript.sh restart apache php.ini
주의 사항 1. 구글 계정 로그인시 보안 부분 해제하기 서버에서 메일 발송시 구글 계정 로그인 시도 2. SMTP 사용 후 메일이 발송되지 않으면, 구글 계정으로 접속해서 "보안 수준이 낮은 앱의 엑세스 허용" 부분 및 로그인 관련 보안 경고 사항으로 뜨는지 확인(클릭 후 허용 필요) ※ "G SUITE" 계정의 경우는 "보안 수준이 낮은 앱의 엑세스 허용"은 다른 페이지에서 허용 가능함 IMAP 설정 지메일 "IMAP" 설정 G Mail 설정 G Mail 설정 보안 수준이 낮은 앱의 엑세스 허용 G SUITE 계정의 경우 로그인 - Google 계정 하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인 내 계정 찾기 계정 만들기 Google 계정 하나면 OK myaccount.google.com "G suite" 계정의 경우 상단 링크를 통하여 허용 필요 하단은 SMTP 사용시 관련 오류 발생 AuthenticationFailedException: 535-5.7.
DNS 설정 "라이트 세일" 사이트 접속 후 "네트워킹" 클릭 만약, "DNS"가 없다면 "DNS 영역 생성"을 해주시고 이미 생성했다면, 하단 "DNS 영역"에서 해당하는 서버를 클릭 후 "관리"로 들어갑니다. 해당 "DNS 레코드"를 추가하기 해서 아래 사진 처럼 "MX 레코드"를 추가해줍니다. (하위 도메인 "@", 또는 "공백") MX 레코드 우선순위 1 매핑 ASPMX.L.GOOGLE.COM MX 레코드 우선순위 5 매핑 ALT1.ASPMX.L.GOOGLE.COM MX 레코드 우선순위 5 매핑 ALT2.ASPMX.L.GOOGLE.COM MX 레코드 우선순위 10 매핑 ALT3.ASPMX.L.GOOGLE.COM MX 레코드 우선순위 10 매핑 ALT4.ASPMX.L.GOOGLE.COM 네트워킹 DNS 레코드
관련 패키지 설치 # "EPEL 저장소" 설치 yum install -y epel-release # "wget" 설치 yum install -y wget # 의존성 패키지 설치 yum install -y libjpeg* libpng* freetype* gd-* gcc gcc-c++ gdbm-devel libtermcap-devel 아파치 설치 # "Code IT" 저장소 활성화 cd /etc/yum.repos.d && wget https://repo.codeit.guru/codeit.el`rpm -q --qf "%{VERSION}" $(rpm -q --whatprovides redhat-release)`.repo # 설치 가능한 아파치 버젼 확인 yum info httpd # 아파치 설치 yum install -y httpd # 서비스 등록 systemctl enable httpd # 아파치 시작 systemctl start httpd # 아파치 버전 확인 httpd -v
패키지 설치하기 타입스크립트 글로벌 설치 npm install -g typescript 프로젝트 폴더를 만든 후 패키지 설치 npm install typescript --save-dev 설정 파일 만들기 tsconfig.json "tsconfig.json" 파일 만들기 첨부파일 tsconfig.json 파일 다운로드 npx tsc --init ※ 옵션 내용은 업로드 파일 참조 (파파고 번역) 간단하게 테스트 해보기 test.ts 디버그(F5)를 이용하여 디버깅 하기 const test = "test"; const test1 = 123; const test2 = () => console.log(test1);
Lodash 설치 Lodash는 자바스크립트 유틸리티 라이브러리 유틸리티 라이브러리로 "array", "collection", "date", "number", "object" 등이 있으며, 데이터를 쉽게 다룰 수 있도록 도와줍니다. (예를 들면, 배열 안에 중복 값을 제거하거나 object 배열 안에 특정 값만 추출하기 등 특히, 자바스크립트에서 배열 안의 객체들의 값을 핸들링할때 유용합니다.) ※ 설치 후 소스코드에 변수나 함수에 대해서 정보가 뜨고 "import" 같은 경우에도 자동으로 잡아줍니다. npm install lodash npm install @types/lodash 참고 링크 lodash에 대해서 자주 사용하는 함수들 안녕하세요. 오늘은 많이 사용되는 javascript 라이브러리 lodash에 대해서 간단하게 알아보고, 자주 사용되는 기능 몇 가지만 알아보도록 하겠습니다. lodash란? lodash는 자바스크립트 유틸리티 라이브러리 입니.. ithub.tistor
모든 타입 정의 변수 "any"으로 모든 타입과 값을 포함합니다. (함수도 가능) const a: any; 타입별로 예제 보기 변수 "number"로 선언 const a: number = 123; # "boolean"로 선언하면서 "a"가 큰지 확인 const b: boolean = a >= 100; "string"로 선언하면서 "b"의 조건문 const c: string = b ? "UP" : "DOWN"; "number[]"으로 배열로 선언 const a: number[] = [1, 2, 3]; "Array<number>"으로 배열로 선언 (위와 같은 선언이지만 다른 방법) const b: Array<number> = [1, 2, 3]; "[number, string]"으로 인덱스 별로 선언(튜플 Tuple) const a: [number, string] = [1, "abc"]; "undefined"으로 선언(undefined만 가능) const a: undefined = und
enum # "enum"은 값을 숫자와 문자열을 넣을 수 있으며, 선언하지 않아도 자동으로 "1"이 할당됩니다. const enum Car { Hyundai, Kia, Samsung = "르노"; } const a: Car = Car.Hyundai; const b: Car.Hyundai | Car.Kia = Car.Kia; ※ 숫자도 가능 console.log(Car.Samsung); => "르노" console.log(Car["Samsung"]); => "르노" # 문자열의 경우 단방향으로만 매핑이 됨 console.log(Samsung["르노"]); => X const enum Car { k3, = 3; k5, = 4; k7 = 1; } # 숫자형의 경우 양방향으로 매핑이 됨 console.log(Car["k7"]); => 1 console.log(Car["1"]); => k7 ※ "enum" 객체 앞에 "const"를 붙이게 되면, 컴파일 후 "enum" 객체가 만들어지지 않아
크론탭 설치 Crontab # "cronie" 설치 yum -y install cronie # 시작 및 서비스 등록 systemctl start crond systemctl enable crond ※ 우분투(Ubuntu)는 기본 패키지에 있지만, 센토스(Centos7)은 없음 크론탭 수정 및 추가 Modify and Add 명령어 설명 crontab -e crontab를 편집할 수 있는 에디터 실행 crontab -l crontab에 등록된 작업 리스트 확인 crontab -r crontab에 등록된 모든 리스트 삭제 # "크론탭" 수정 crontab -e # 내용 추가 매월 1일 03시에 인증서를 갱신 후 아파치 재실행 0 18 1 * * /usr/bin/certbot renew --renew-hook="sudo systemctl restart httpd" ※ "Crontab" 수정시 줄 바꿈을 사용할 수 없으며 1개의 줄로 작성해야 합니다.
SSL 인증서 모듈 설치 yum install -y mod_ssl 인증서 발급 파일 업로드 # 외부에서 유료 SSL 구입시 발급 받는 파일 4개가 있습니다. "/etc/httpd/ssl" 경로로 다운받은 4개의 파일을 업로드 해줍니다. /etc/httpd/ssl/ca.pem /etc/httpd/ssl/ssl.crt /etc/httpd/ssl/ssl.key /etc/httpd/ssl/sub.class1.server.ca.pem 퍼미션 # 보안을 위해 디렉토리와 파일의 권한을 수정합니다. sudo chown -R root:root /etc/httpd/ssl # 파일의 권한을 600(소유자만 읽기, 쓰기 허용) sudo chmod 600 /etc/httpd/ssl/*.* 가상 호스트 설정 Virtual Host # "ssl.conf" 파일 연후 수정 아래 값들을 찾아 수정 vi /etc/httpd/conf.d/ssl.conf # "<VirtualHost _default_:443>" 값을
변수 선언하기 # CSS에서도 변수를 선언하여 사용 할 수 있습니다. 이것을 "규칙 집합의 선택자"라고 합니다. # 보통 앞에 "--"를 입력하여 나오는 뒤의 단어는 자유롭게 선언이 가능합니다. :root { --default-color: red; --main-color: blue; } h1 { --default-color: red; --main-color: blue; } ※ 사용자 지정 속성의 이름은 대소문자를 구분합니다. 따라서 "--my-color"와 "--My-color"는 서로 다른 속성으로써 처리합니다. 변수 사용하기 h1 { background-color: var(--default-color); => red background-color: var(--main-color); => blue } 예제 # 아래와 같이 "background-color: brown" 반복되고 있을때, .one { color: white; "background-color: brown;" margin
PHP 다운로드 PHP: Downloads Current Stable PHP 7.4.9 ( Changelog ) ¶ php-7.4.9.tar.bz2 (sig) [12,431Kb] 06 Aug 2020 2e270958a4216480da7886743438ccc92b6acf32ea96fefda88d07e0a5095deb php-7.4.9.tar.gz (sig) [16,129Kb] 06 Aug 2020 c0c657b5769bc463f5f028b1f4fef8814d98ecf3459a402a9e30d41d68b2323e php-7.4.9.tar.xz (sig) [10,048Kb]... www.php.net # 위 사이트 이동하여 최신 PHP 다운로드 합니다. 아래 다운로드중 "쓰레드"와 "논쓰레드"의 차이는 있지만, "에디터에 연동하여 사용할것이기 때문에 아무거나 다운로드 받아도 상관없습니다." ※ 단, 윈도우 환경에서 PHP와 아파치 등 사용할 계획이라면 "쓰레드"와 "논쓰레드" 차이점을 알
충돌 원인 # "원 드라이브"에 프로젝트 폴더를 업로드된 상태에서 "VSCODE"의 "SFTP" 기능중 "WATCH" 기능을 사용하게 되면, 서로 충돌(계속 리프레쉬)이 나면서 계속 업로드를 반복하게 됩니다. 즉, "원 드라이브"에서 새로운 파일 감지를 하면서 리프레쉬를 하게 되고, 여기서 "SFTP"도 새로운 파일 감지를 하게 되면서 계속 무한루프에 걸리게 됩니다. 현재 원인 해결을 원드라브에서 찾을려고 했으나 불가하여, 어쩔 수 없이 "SFTP"의 "WATCH" 기능중 "UPLOAD"를 "FALSE"를 하여 사용중입니다. # "요청 기반 파일 관리" 이 부분도 해제합니다.
리소스 우선 순위 명령어 설명 preload 몇 초 안에 자원이 필요할 때 prefetch 다음 페이지에 자원이 필요할 때 preconnect 곧 자원이 필요하겠지만 아직 전체 URL을 모르는 경우 프리로드 preload # "as 속성"을 사용하여 리소스의 유형을 브라우저에 알려줘야 합니다. 올바른 유형이 설정되어 있지 않다면 브라우저는 해당 리소스를 사용하지 않습니다. # "preload"는 브라우저가 반드시 리소스를 가져오게 만듭니다. 중복 참조하면 중복된 만큼 리소스를 가져오기 때문에 중복해서 참조하지 않도록 해야 합니다. # "preload"는 현재 페이지에서 반드시 사용되는 리소스에만 사용되어야 합니다. <link rel="preload" as="script" href="super-important.js"> <link rel="preload" as="style" href="critical.css"> 프리커넥트 preconnect # "preconnect"를 사용하면 브라우
구글 리캡차 등록 reCAPTCHA reCAPTCHA is a security service that protects your websites from fraud and abuse. www.google.com # 위 사이트 이동 후 오른쪽 상단 "Admin Console" 클릭 하여 등록합니다. "V2", "V3" 모두 등록해도 됩니다. # 등록 후 나오는 "사이트키", "비밀키"는 꼭 백업해둡니다. 구글 리캡차 등록 리캡차V2 사용하기 # 스크립트 추가 <script src="//www.google.com/recaptcha/api.js"></script> # 엘리먼트 태그 추가 <div class="g-recaptcha" id="captcha" data-sitekey="사이트키"></div> # 콜백 추가 function grecaptcha() { // "grecaptcha.getResponse()" 부분이 핵심 입니다. // 리캡차 이미지를 클릭했다면 0 이상의 숫자가 나오고,
보안과 방화벽에 관해서... 평소에 자주 사용하는 아마존의 경우 기본적인 보안 포트는 허용이 되지만, 이외의 포트는 허용되지 않는다. 즉, 외부와의 협력이 필요할때 포트를 열었는데 안된다면, 아마존 측에 요청을 해야 된다. 하지만, 아마존의 답변 시간은 최대 48시간이다... 그리고 한번만에 해결되면 좋겠지만 그럴일은 거의 없다. 메일을 몇번 주고 받아야 되는지 안되는지 알 수 있고 한번 메일이 왔다갔다 하는데 드는 시간이 엄청나다... 그래서 제가 하고 싶은 말은 아마존 사용법은 익혀두시고 아마존에 있는 특별한 기능을 사용하지 않는 경우에는 웬만하면 국내 호스팅사를 사용하는게 정신적으로 편합니다. 그렇다고, 국내 호스팅사들의 보안이 허술하다? 그건 아니라고 봅니다. 클라이언트나, 개발자가 기본적인 룰만 지켜주고 웹 취약점만 조심하면 보안에서는 크게 문제될게 없습니다.
Xdebug 확장 프로그램 # "PHP"를 디버깅하는 더 좋은 방법은 "Xdebug"을 통해 이루어집니다. 대부분의 브라우저는 디버깅 프로세스를 초기화하는데 필요한 쿠키/쿼리 문자열을 전달하는 데 도움이되는 도우미 확장을 제공합니다. 크롬 : Xdebug Helper 파이어폭스 : Xdebug(가장 쉬운) 오페라 : Xdebug 사파리 : Xdebug Toggler ※ 확장 프로그램 설치는 구글 검색 Clockwork 확장 프로그램 Clockwork Clockwork is a development tool for PHP available right in your browser. Clockwork gives you an insight into your application runtime - including request data, performance metrics, log entries, database queries, cache queries, redis commands, dis
https://github.com/RickySu/phpsocket.io RickySu/phpsocket.io Socket.IO php server side alternative. Contribute to RickySu/phpsocket.io development by creating an account on GitHub. github.com https://github.com/walkor/phpsocket.io walkor/phpsocket.io A server side alternative implementation of socket.io in PHP based on workerman. - walkor/phpsocket.io github.com
Web Storage API 구분 공통 설명 로컬 스토리지 (LocalStorage) 1. 페이지 프로토콜별로 구분합니다. HTTP(http://example.com) HTTPS(https://example.com) 위 두개의 프로토콜은 각각 다른 Storage에 저장됩니다. 2. 키와 값은 항상 각 문자에 2바이트를 할당하는 UTF-16 DOMString의 형태로 저장합니다. 객체와 마찬가지로 정수 키는 자동으로 문자열로 변환합니다. 위와 같지만, 브라우저를 닫았다 열어도 데이터가 남아있습니다. 1. 유효기간 없이 데이터를 저장하고, JavaScript를 사용하거나 브라우저 캐시 또는 로컬 저장 데이터를 지워야만 사라집니다. 2. 저장 공간이 셋(로컬, 세션, 쿠키) 중 제일 큽니다. 3 사생활 보호 모드" 중 생성한 localStorage 데이터는 마지막 "사생활 보호" 탭이 닫힐 때 지워집니다. 세션 스토리지 (SessionStorage) 각각의 URL에 대해 독립적인 저장 공
동기화 설정 # 마이크로소프트, 깃허브 계정으로 로그인 하여 현재의 "VSCODE" 설정 값을 동기화 할 수 있습니다. 1. 왼쪽 상단 "파일" > "기본 설정" > "설정" 클릭해주세요. 2. 검색 및 오른쪽 끝에 보면 "동기화" 관련 버튼이 있습니다. 클릭해주세요. 3. 마이크로소프트, 깃허브 계정으로 로그인 해주세요. => 방화벽 관련 팝업이 뜨면 허용 눌러주시면 됩니다. 이제 어떤 PC든 동기화 과정만 거치면 원래 쓰던 설정값 대로 똑같이 사용 할 수 있습니다. ※ 단, 확장 프로그램은 자동 설치가 안되는것 같습니다. ※ 추가 팁, "본체와 노트북 둘다 사용자 계정이름을 동일"하게 했습니다. 확장 프로그램은 직접 설치해야된다지만 "설정값에서 경로 같은 부분은 바꿀 필요가 없어집니다." VSCODE 동기화 설정 VSCODE 동기화 설정
PHP 설치 [VSCODE] 비주얼스튜디오코드(Visual Studio Code) PHP 익스텐션 셋팅(설정)하기 PHP 다운로드PHP 압축해제 후 폴더 옮기기비주얼 스튜디오 코드 익스텐션비주얼 스튜디오 코드 설정... blog.naver.com # 위의 링크를 통해 먼저 "PHP" 설치해주세요. 컴포저 설치 Introduction - Composer Dependency management System Requirements Installation - Linux / Unix / macOS Downloading the Composer Executable Locally Globally Installation - Windows Using the Installer Manual Installation Using Composer Introduction # Composer is a tool for dependency management in PHP. It allows you to declar..
PHPCS 설치하는 방법 이전 게시글 참고 [VSCODE] 비주얼스튜디오코드(Visual Studio Code) PHPCS 설치하는 방법 PHP 설치컴포저 설치php_codesniffer 설치VSCODE 설정 blog.naver.com PHP-CS-FIXER 파일 다운로드 FriendsOfPHP/PHP-CS-Fixer A tool to automatically fix PHP Coding Standards issues - FriendsOfPHP/PHP-CS-Fixer github.com # 위 사이트 이동 후 아래 글에서 "php-cs-fixer.phar" 다운로드 하기 Locally Download the php-cs-fixer.phar file and store it somewhere on your computer. # 다운 받은 파일은 저는 "C:\composer" 폴더에 넣어주었습니다. PHP-CS-FIXER 익스텐션 설치 # VSCODE에서 "php-cs-fixer" 검색하면
Attributes란? https://365ok.co.kr/tj/okdown/7046 # Attributes는 "주석"이라고도 하는 이러한 속성의 목적은 메타데이터를 클래스, 메서드, 변수 등에 체계적으로 추가하는 것입니다. # 즉, 기존에 사용하던 "PHP DocBlock" 방식인 주석을 기억하시나요? 예로들면 아래와 같은 겁니다. /** * @Route("/about") */ # 위의 주석은 실제로 실행되지는 않지만, "Reflection API" 제공하여 주석을 편리하게 검색 할 수 있습니다. 위의 주석을 아래와 같이 바꿀 수 있습니다. <<Route('/about')>> 쉬운 예제 https://365ok.co.kr/tj/okdown/7046 class AboutPage extends AbstractController { /** * @Route("/about") */ public function page() {} } => class AboutPage extends Abstra
Named Params란? # 이제 이름을 바꾸거나 객체 다형성을 제공하지 않고 명시적으로 선언된 파라미터만 사용할 수 있습니다. 즉, 아래와 같습니다. function Email(string $to, string $from = "[email protected]", string $content = "test", bool $option = false) {} # 기존 사용 방식 Email("[email protected]", "[email protected]", "내용"); # 네임드 파라미터 방식 Email(to : "[email protected]", options : true); # 잘못된 방식(디폴트 값을 네임드로 적어둔 뒤에 네임드 없이 적을 경우) Email(options : true, "[email protected]"); ※ 위와 같이 이름을 지정하고 기존 디폴트 값들의 순서 상관없이 건너뛸 수 있습니다. 단, 주의 할점은 기존 디폴트 값을 가장 앞에 두고나서 일반적
Nullsafe Operator란? # "null"이 아닌 경우 표현식의 결과에 대해 메서드를 호출하거나 속성을 가져오기를 원하는 것은 상당히 흔한 일이다. 현재 PHP에서 "null" 리드를 확인하면 "더 깊은 내포 및 반복이 발생하는 문제가 있음" $country = null; if ($session !== null) { $user = $session->user; if ($user !== null) { $address = $user->getAddress(); if ($address !== null) { $country = $address->country; } } } => # "null"로 평가될 때 전체 체인의 실행이 중지되고 null로 평가된다. "null"이 아닌 경우, 일반 -> 연산자와 동일하게 동작한다. $country = $session?->user?->getAddress()?->country; 예제 class MyClass { public function foo()
Match Expression란? # 스위치(swtich) 대신 매치(match)를 통해서 간략하게 사용 가능합니다. 예제는 아래와 같습니다. $message = null; $value = 1; switch ($value) { case 1: $message = "Hello"; break; case 2: $message = "World"; break; Default: $message = "Hello, World"; } => $message = match ($value) { 1 => "Hello", 2, 3, 4 => "World", default => "Hello, World" }; # 단, 주의해야 할 점은 매치(match)의 경우 "default" 처리 하는 과정이 없고, "$value"의 값이 매치에 없다면 "Fatal Error"를 나타내게 됩니다. 예제는 아래와 같습니다. $value = 5; $message = match ($value) { 1 => "Hello", 2, 3
Non Capturing Catches란 # 현재 PHP는 변수에 걸리는 예외를 처리해야 합니다. try { foo(); } catch (SomeException $ex) { die($ex->getMessage()); } # 그러나 변수를 사용하지 않더라도 다음과 같이 지정해야 합니다. try { changeImportantData(); } catch (PermissionException $ex) { // "$ex" 변수를 지정해야 됨 echo "이 작업을 수행할 수 있는 권한이 없습니다."; } => # 예외를 변수에 캡처하지 않고 예외를 포착할 수 있도록 허용 try { changeImportantData(); } catch (PermissionException) { // "$ex" 변수를 지정안해도 됨 echo "이 작업을 수행할 수 있는 권한이 없습니다."; } 참고 링크 PHP: rfc:non-capturing_catches PHP RFC: non-capturing catc
Mixed Type란? mixed # 위의 사진 처럼 "Mixed Type"는 여러 타입을 받거나 반환할 수 있습니다. 보통은 string, int, bool 이런식으로 타입을 선언하지만, mixed를 쓰면 여러 타입을 받을 수 있다는 얘기입니다. 아래의 예제를 확인해보세요. class A { public function bar(): mixed {} } class B extends A { public function bar(): int {} } # 하지만, 당연히 반대로 사용이 불가합니다. 즉, int로 타입이 지정된 곳에 mixed(any)로 사용 할 수 없다는 얘기 입니다. class A { public function bar(): int {} } class B extends A { public function bar(): mixed{} } # 기존에는 여러 타입을 받기 위해서는 앞에 타입을 지정하지 않았습니다. 이제는 "mixed"로 명시적으로 표시 할 수 있기 때문에 가독성에
Constructor Promotion # 먼저, 예제를 살펴보겠습니다. "public float $" 부분을 중점으로 보시면 됩니다. class Point { public float $x; // 각각 프로퍼티 선언 public float $y; // 각각 프로퍼티 선언 public float $z; // 각각 프로퍼티 선언 public function __construct( float $x = 0.0, float $y = 0.0, float $z = 0.0, ) { $this->x = $x; $this->y = $y; $this->z = $z; } } => # "__construct"에 직접 프로퍼티 선언이 가능해집니다. class Point { public function __construct( public float $x = 0.0, public float $y = 0.0, public float $z = 0.0, ) {} } 참고 링크 PHP: rfc:constructor_p
Throw Expression란? # 이제는 함수에서 예외처리가 가능해집니다. function test() { return throw new Exception(); } try { test(); } catch (Exception) { // test()가 예외처리로 빠짐 } 예제 # 화살표 함수는 하나의 표현식만 받아들이기 때문에 이전에는 불가능했다. $callable = fn() => throw new Exception(); # 중복 연산자에서도 사용이 가능 $a = isset($a) ? $a : throw new InvalidArgumentException(); => $a = $a ?? throw new InvalidArgumentException(); # 엘비스 연산자에서도 사용이 가능(if/else) $a = $b ?: throw new InvalidArgumentException(); # $value 배열이 비어 있지 않은 경우에만 설정됨. $value = !empty($arr
Stringable란? # "Stringable" 인터페이스는 "__toString()"을 구현하는 모든 힌트를 입력하는 데 사용할 수 있다. 클래스가 "__toString()"을 구현할 때마다 자동으로 뒤에서 인터페이스를 구현하므로 수동으로 구현할 필요가 없다. class Foo implements Stringable { public function __toString(): string { return 'foo'; } } $foo = new Foo(); echo $foo; // -> foo 예제 https://pronist.tistory.com/60 class MyClass implements Stringable { public function __toString(): string { return 'Hello, world'; } } echo new MyClass(); // -> Hello, world 참고 링크 PHP: rfc:stringable PHP RFC: Add String
Static Return Type란? # "self"를 반환하는 것은 이미 가능했지만, "PHP8"에서 "static"은 유효한 반환 유형이 아니었습니다. PHP의 동적 유형 특성을 감안할 때 많은 개발자에게 유용한 기능입니다. class Foo { public function test(): static { return new static(); } } class Foo { public function test(): static { return $this; } } # 내용이 허술하여 보충 내용 필요(업데이트 예정)... 참고 링크 PHP: rfc:static_return_type PHP RFC: Static return type Date: 2020-01-08 Author: Nikita Popov [email protected] Target Version: PHP 8.0 Status: Implemented Implementation: https://github.com/php/php-src/pu
Union Types란? # 기존의 타입에는 여러 타입을 함께 사용 할 수 없었지만, 이제는 여러 타입을 적어 줄수 있습니다. # 기존 방식 function test(string $number) { } => # 유니온 방식 function test(string|int $number) { } # "null" 타입도 받을 수 있습니다. function test(null|int $number) { } # 앞에 "?"을 붙여서 "null"을 받을 수도 있습니다. function test(string $number, ?string $name) { } # 리턴 타입을 "int|false"을 줄 수 있습니다. "int|false"만 리턴 타입을 지정해줄 수 있습니다. (거의 사용하지 않을것 같군요.) function test(): int|false { }
WeakMap란? # 일반적인 사용 사례는 데이터를 강제로 유지하지 않고 개별 개체 인스턴스와 연결하여 장기 실행 프로세스에서 메모리를 효과적으로 관리하는 것입니다. 예를 들어, 약한 맵을 사용하여 계산 결과를 메모 할 수 있습니다. 예제 # 이것은 각 객체에 대해 한 번만 computeSomethingExpensive() 메서드를 호출합니다. 동시에 객체가 파괴되면 맵에서 캐시 된 값도 삭제합니다. 일반 배열(또는 오히려 SplObjectStorage)로 동일한 작업을 수행하면 "메모리 누수가 발생"합니다. class FooBar { private WeakMap $cache; public function getSomethingWithCaching(object $obj) { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); } // ... } 참고 링크 PHP: rfc:weak_maps PHP RFC: Wea
PHP8 설치하기 sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm sudo yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm sudo yum -y install yum-utils sudo yum -y install --enablerepo=remi-test php80 # 버젼 확인 php80 --version
구문 # "insertAdjacentHTML"는 이미 사용중인 엘리먼트를 다시 파싱하지 않아서, "innerHtml" 보다 "작업이 덜 드므로 빠르다." # 기본 사용 방법 element.insertAdjacentHTML(position, text); # 엘리먼트 앞에 넣기 beforebegin # 엘리먼트 안에 첫번째에 넣기 afterbegin # 엘리먼트 안에 마지막에 넣기 beforeend # 엘리먼트 뒤에 넣기 afterend 포지션 값과 위치 # 위의 "position"에 들어갈 명령어 입니다. "p" 엘리먼트 태그에 넣을때 위치 입니다. <!-- beforebegin --> <p id="test"> <!-- afterbegin --> foo <!-- beforeend --> </p> <!-- afterend --> 응용 예제 # 실제로 사용할때 예제 (위의 "p" 태그 기준으로) "insertAdjacentHTML" 뒤의 엘리먼트는 변수 할당 후 넣어줘도 되고, 직접 작성
구문 # "append"는 "appendChild"를 대신하여 사용합니다. # 특정 엘리먼트 앞에 넣기 부모노드.insertBefore(삽입 할 노드, 기준 점 노드); # 엘리먼트 안 앞에 넣기 엘리먼트.prepend() # 엘리먼트 안 뒤에 넣기 엘리먼트.appendChild(); 예제 # 특정 엘리먼트 앞에 넣기 <form> <input type="text" id="first" value="test" /> </form> <script> let form = document.querySelector("form"); let input = form.querySelector("input"); let input2 = Object.assign(document.createElement("input"), { type : "hidden", id : "second", value : "이 태그는 "first" 인풋 태그 위로 갑니다." }); form.insertBefore(input2, input
config.inc.php 수정 # 아래 파일 연후 맨 하단에 추가 기존에 값이 있다면 값 수정 vi /etc/phpMyAdmin/config.inc.php => $cfg['LoginCookieValidity'] = 36000; php.ini 수정 # 아래 파일 연후 아래 내용 수정 vi /etc/php.ini => session.gc_maxlifetime = 36000; 아파치 재시작 systemctl restart httpd
config.inc.php 수정 # 아래 파일 연후 맨 하단에 추가 이외 더 숨기고 싶은 테이블이 있다면, "테이블1|테이블2" 이런식으로 추가해주면 됩니다. vi /etc/phpMyAdmin/config.inc.php => $cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql|performance_schema|phpmyadmin)'; 아파치 재시작 systemctl restart httpd phpMyAdmin 재로그인 # "phpMyAdmin" 로그인이 되어있다면, 로그아웃 후 다시 로그인 해주세요.
config.inc.php 수정 phpMyAdmin # 위에 사진처럼 왼쪽에 있는 테이블 목록 수를 늘립니다. 아래 파일 연후 맨 하단에 추가 (숫자를 변경하여 원하는 테이블 목록을 수정) vi /etc/phpMyAdmin/config.inc.php => $cfg['MaxDbList'] = 100; 아파치 재시작 systemctl restart httpd
config.inc.php 수정 phpMyAdmin # 위의 사진처럼 행 갯수를 늘립니다. 아래 파일 연후 맨 하단에 추가 (너무 많이 늘리면 버벅일 수 있으니 최대 100까지 추천) vi /etc/phpMyAdmin/config.inc.php => $cfg['MaxRows'] = 100; 아파치 재시작 systemctl restart httpd
phpMyAdmin 설치 phpMyAdmin phpMyAdmin phpMyAdmin # phpMyAdmin 설치 sudo apt install phpmyadmin php-gettext # 아파치 재시작 sudo systemctl restart apache2 apache2.conf 수정 # 아파치 수정 파일 sudo vi /etc/apache2/apache2.conf # 최상단에 추가 Include /etc/phpmyadmin/apache.conf # 아파치 재시작 sudo systemctl restart apache2 ※ 프록시 및 가상호스트 사용으로 인한 phpMyAdmin 접속 불가시 일시적으로 프록시, 가상호스트를 해제하시면 됩니다.
Nginx 레포 기준으로 설치 Nginx 레포로 설치시 # "nginx.repo" 파일 생성 vi /etc/yum.repos.d/nginx.repo # 하단 내용 저장 [nginx] name=nginx repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 EPEL 레포 기준으로 설치 Epel 레포로 설치시 # 위 "Nginx"에서 관리하는 "Repo"를 기준으로 설치할 수 있으며, 아래 처럼 "EPEL"에서 관리하는 "Repo"로 버전에 대한 검증을 마친 후 등록 하여 설치가 가능합니다. "epel-release"는보다 안전하지만 업데이트 반영 주기는 다소 느립니다. yum install -y epel-release Nginx 설치 yum install -y nginx Nginx 설정 # 하단 설정을 통하여 포트 등등 수정 가능 vi /etc/nginx/conf
원인 The operation was rejected by your operating system 1. 전역으로 설치된 NPM이 해당 보조 계정에서 접근 권한이 없을때 발생될 수 있습니다. 해당 NPM 폴더를 이외 계정에서도 접근가능하게 하거나, 관리자 권한을 줘야 해결되는 문제 입니다. 2. 우분투 20 버젼의 경우 npm 이슈가 있을 수 있습니다. 되도록이면 18.04 버젼을 이용 3. 기존 프로젝트가 "npm"이 아닌 "yarn"으로 설치된 경우 "yarn"으로 설치 진행 ※ 아래 링크를 통해서 관리자 권한을 부여해보세요. [Windows10] 우분투(Ubuntu) 어드민 권한 추가하기(SUDO) root 계정으로 로그인sudoers 파일 권한 변경sudo 권한 추가passwd 파일 수정root 그룹 추가 blog.naver.com
퍼미션 문제 vscode "vscode"에서 파일이 안열리는 경우에는 퍼미션 권한 문제일 가능성이 높습니다. 해당 퍼미션을 755로 변경하거나 권한을 주면 됩니다.
아마존 기본 부트 쉘스크립트 실행 # "aws ec2"의 경우 "/var/lib/cloud/scripts/per-boot/" 안에 쉘 스크립트를 만들어 넣으면 자동으로 서버 재부팅시 실행됨 라라벨 쉘 스크립트 응용 # "laravel_startup.sh" 파일을 만듬 sudo vi /var/lib/cloud/scripts/per-boot/laravel_startup.sh # 안에 내용을 넣음 "#!/bin/bash" 은 필수 즉, 라라벨 디렉토리 이동이 성공하면 서버를 실행해라는 명령 입니다. #!/bin/bash cd /home/라라벨 디렉토리... || exit 1 echo "php artisan serve" # "root"가 아닌 다른 계정도 실행하기 위한 권한 변경 sudo chmod 755 /var/lib/cloud/scripts/per-boot/laravel_startup.sh ※ 이외에도 쉘 스크립트를 응용하여 사용하시면 됩니다.
사용자 코드 조각 생성 vscode # "VSCODE" > "파일" > "기본 설정" > "사용자 코드 조각" 후 상단에 언어가 나오면 선택(여기서는 javascript 선택) # 하단 내용으로 수정 { "Print to console": { // "con"으로 입력시 출력 "prefix": "con", "body": [ "console.log('$1');", "$2" ], // 설명 "description": "console.log" } } # 아래 이미지 처럼 "con" 입력하고 엔터치면 "console.log("");" 생성됨 ※ 이외 언어도 응용해서 생성 vscode
발생 원인 # "/var/lib/dpkg/lock" 파일이 존재할 경우 패키지 및 인덱스를 업데이트 하지 않는다고 합니다. 즉, 특정 호스팅 업체에서 서버 개설 후에 VPS를 사용하는 경우 서버에 설치된 우분투 이미지에 세팅되어 있는 경우가 있어서 그럴 수 있습니다. 그래서 위의 "lock" 관련 파일을 삭제하여 다시 업데이트 하면 해결 할 수 있습니다. 해결 방법 # 프로세스 모두 종료 sudo killall apt apt-get # "lock" 관련 파일 삭제 (없으면 건너띄기) sudo rm -rf /var/lib/apt/lists/lock sudo rm -rf /var/cache/apt/archives/lock sudo rm -rf /var/lib/dpkg/lock* # "dpkg" 재등록 sudo dpkg --configure -a # 우분투 다시 업데이트 sudo apt update 참고 사이트 우분투 APT Could not get lock /var/lib/dpkg/lo
원인 # "jwt" 시크릿키가 생성되어 있지 않아서 발생되는 문제 Argument 3 passed to Lcobucci\JWT\Signer\Hmac::doVerify() must be an instance of Lcobucci\JWT\Signer\Key, null given 해결하기 # "jwt" 시크릿 키를 생성하여 해결 php artisan jwt:secret
발생원인 # "MySQL 5.5 버전"부터는 잠금 건너뛰기 지시문이 더 이상 사용되지 않는다. 즉, "my.cnf" 파일안에 "skip-locking"이 더이상 사용되지 않는다는 뜻 원인해결 # "centos" 기준이며, "ubuntu"의 경우 위치를 모르면 검색 "find / -name my.cnf" vi /etc/my.cnf # 아래 내용을 주석 처리 #skip-locking # "mysql" 재시작 systemctl start mariadb 참고 링크 Unable to start MySQL: Error unknown option '--skip-locking' Applicable to: Plesk Onyx for Linux Symptoms The Plesk is down. The MySQL service is not starting after upgrade from 5.1 to 5.5 version, with the following errors in /var/log/mysqld
발생원인 https://repo.packagist.org coult not be fully loaded (Could not resolve host: repo.packagist.org), package information was loaded from the local cache and may be out of date # 즉, "Git"이 잘못된 프록시를 사용하는 경우 위에 해당하는 오류가 발생할 수 있습니다. 따라서, "Git" 작업이 성공적으로 작동하도록 해당 프록시를 재구성하면 됩니다. 원인해결 git config --global http.proxy http://proxyuser:[email protected]:8080 and git config --global --unset http.proxy git config --global --unset https.proxy # 이후에도 컴포저가 안되면 재부팅 참고 링크 https://github.com/desktop/de
디버그바 설치 디버그바(Debug Bar) # 컴포저를 통해 "디버그바" 패키지 설치 composer require barryvdh/laravel-debugbar --dev # ".env" 파일에서 "true" 변경 APP_DEBUG = true # 웹 사이트 접속 후 하단 디버그바 확인
Apache2 삭제하기 # "Apache2" 서비스 중단 sudo service apache2 stop # "Apache2" 관련 패키지 모두 삭제 sudo apt-get remove -y apache2* # "purge"를 이용하여 설정파일도 모두 삭제 한다. sudo apt-get remove -y --purge apache2* # 남은 의존성 패키지 등 자동 정리 sudo apt-get -y autoremove # 우분투 업데이트 sudo apt update sudo apt -y upgrade
Nginx 설치하기 # "Nginx" 설치 sudo apt install -y nginx # 자동 시작 등록 sudo update-rc.d nginx defaults sudo update-rc.d nginx enable PHP 7.4 및 관련 패키지 설치 php7.4 package : Ubuntu php7.4 package in Ubuntu libapache2- mod-php7. 4: server-side, HTML-embedded scripting language (Apache 2 module) libapache2- mod-php7. 4-dbgsym: debug symbols for libapache2- mod-php7. 4 libphp7.4-embed: HTML-embedded scripting language (Embedded SAPI library) libphp7. 4-embed- dbgsym: debug symbol... launchpad.net # "php7.4" 관련 패
"certbot" 레포지토리 추가 # 입력 후 엔터 sudo add-apt-repository ppa:certbot/certbot # 업데이트 sudo apt update sudo apt -y upgrade certbot 설치 # "certbot" 설치 sudo apt-get install python-certbot-nginx -y # "nginx" 설정 파일 수정 "server_name"의 도메인 추가 입력하기 sudo nano /etc/nginx/sites-available/default # "nginx" 문제 없는지 확인 sudo nginx -t # "nginx" 재시작 sudo service nginx restart 방화벽 변경하기 # "ufw" 상태 확인 sudo ufw status # "ufw" "active"으로 변경 sudo ufw enable sudo ufw allow 'Nginx Full' sudo ufw allow OpenSSH 인증서 받기 # 인증서 받기 sud
기본 단축키 단축키 기능 (cmd/ctrl) + n 새로운 페이지 생성 (cmd/ctrl) + shift + p 기존에 생성된 특정 페이지에 하위를 생성할지 선택 (cmd/ctrl) + shift + n 노션을 새 윈도우 창에서 열기 (cmd/ctrl) + p 페이지 검색 (cmd/ctrl) + [ 이전 페이지(뒤로 가기) (cmd/ctrl) + ] 다음 페이지(앞으로 가기) (cmd/ctrl) + u 상위 페이지로 이동 (cmd/ctrl) + shift + l 다크, 화이트 모드 변경 (cmd/ctrl) + \ 왼쪽 사이드 메뉴 감추기/표시 마크다운 단축키 단축키 기능(텍스트를 감싸주면) ** 굵게 * 기울임 ` 인라인(들여쓰기) ~ 취소선 단축키 기능(비어있는 텍스트에 입력시) *, -, + 입력 후 space 글머리 기호 목록 [] 체크박스(공백 없이) 1. 입력 후 space 번호가 매겨지는 목록 기호 목록 # 입력 후 space 헤더 ## 입력 후 space 서브 헤더 >
크롬 확장프로그램 설치 Notion Web Clipper Use our Web Clipper to save any website into Notion. chrome.google.com # 웹 클리퍼를 이용하면 어떤 웹사이트라도 노션에 저장할 수 있습니다. 확장프로그램 설정 노션 # 노션 로그인 후 "새로운 링크 데이터베이스" 생성시 "나의 링크"가 생성되며, 리스트 형식으로 추가됨
도커 삭제하기 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 도커 설치하기 # 도커 레포지토리 추가 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 도커 최신버젼 설치 sudo yum install docker-ce # 도커 자동실행 등록 sudo systemctl enable docker # 도커 계정 권한 등록 sudo usermod -aG docker $USER # 도커 데모 실행 sudo systemctl start docker # 도커 상태 확인 sudo sy
계정 저장 sudo git config --global user.name "이름" sudo git config --global user.email "이메일@email.com" 캐시 저장 # 아래 명령어 실행 후 깃 명령어를 사용하여 계정 입력하면 저장됨 EX) sudo git pull ... 등등 sudo git config credential.helper store # 시간을 지정하여 캐시 저장(초) sudo git config --global credential.helper 'cache --timeout 7200' 캐시 삭제 sudo git credential-cache exit 참고 링크 Git - git-credential-cache Documentation English Topics Version 2.29.0 git-credential-cache last updated in 2.29.0 NAME git-credential-cache - Helper to temporar
아파치 설정 파일 수정 # "아파치2" 설정 파일 열기 sudo nano /etc/apache2/apache2.conf # 맨 하단에 추가 AcceptFilter http none AcceptFilter https none # "아파치" 재시작 sudo service apache2 restart
개발자 등록하기 등록하기 전 - Apple Developer Program 등록해야 할 사항 개인으로 등록하기 개인 또는 개인사업자/1인 기업인 경우, 이중 인증 이 켜져 있는 Apple ID로 로그인하여 시작하십시오. 법적 이름 및 주소를 포함한 기본적인 개인 정보를 제공해야 합니다. 조직으로 등록하기 조직으로 등록하는 경우 이중 인증 이 켜져 있는 Apple ID 와 다음 사항이 필요합니다. D-U-N-S 번호 조직의 정보 및 법인 상태를 확인하려면 해당 조직에 D-U-N-S 번호 가 있어야 합니다. Dun & Bradstreet 에서 지정하는 고유한 이 9자리 번호는 표준 비즈니스 식별자로 흔히 ... developer.apple.com # 애플 로그인 후 위 링크로 이동하여 개발자 등록해줍니다. 개인도 가능하니 입력할 양식만 채워서 등록하면 됩니다. 참고 링크 To see this page, you must enable JavaScript. Pour afficher cette
볼륨 조정 파티션 크기 조정 전 파티션 크기 조정 후 # 파티션 확인 lsblk # 위 이미지에서의 파티션 이름은 "xvda1" 입니다. 디바이스 이름과 파티션 번호를 구분하는 공백을 추가해야합니다. sudo growpart /dev/xvda 1 # 크기 확장 sudo resize2fs /dev/xvda1 # 파티션 확인 및 볼륨 확인 lsblk df -h
퍼미션 및 소유자 변경 # "nginx" 및 "apache"가 디렉토리에 대한 권한이 필요 sudo chown -R ubuntu:www-data storage sudo chown -R ubuntu:www-data bootstrap/cache # 퍼미션을 755로 변경 sudo chmod -R 775 storage sudo chmod -R 775 bootstrap/cache
최신 버젼 업데이트 Downloads Since July 2015 all phpMyAdmin releases are cryptographically signed by the releasing developer. You should verify that the signature matches the archive you have downloaded. Verification instructions are placed in our documentation in the Verifying phpMyAdmin releases chapter. phpMyAdmin 4.9.7 Rele... www.phpmyadmin.net # 우분투 업데이트 sudo apt-get update sudo apt-get -y upgrade # "wget, unzip" 설치 sudo apt-get install -y wget sudo apt-get install -y unzip # 기본 "phpmyadmin" 설치 su
최신 버젼 설치 sudo apt-get update sudo apt -y install software-properties-common sudo add-apt-repository ppa:ondrej/php sudo apt-get update # PHP 7.4 설치 sudo apt -y install php7.4 # PHP 관련 의존성 라이브러리 설치 sudo apt-get install -y php7.4-{bcmath,bz2,intl,gd,mbstring,mysql,zip,common} NGINX 사용하기 # 우분투에 "PHP"를 설치하면 아파치가 구성된다. "Nginx"와 "PHP"를 실행하는 데 관심이 있는 사용자의 경우 "Apache" 서비스를 중지하고 비활성화해야 한다. # 아파치 종료 sudo systemctl disable --now apache2 # "Nginx" 및 "php7.4-fpm" 설치 sudo apt-get install nginx php7.4-fpm # "p
Mysql 설치 # 최신 sudo apt update # "Mysql" 설치 sudo apt-get install -y mysql-server # 방화벽 "ufw"에서 "Mysql" 허용 sudo ufw allow mysql # "Mysql" 등록 및 실행 sudo systemctl enable mysql sudo systemctl start mysql 초기 셋팅 # MariaDB 초기 설정 "Set root password"에서 엔터 후 사용할 비밀번호 2번 입력 후 모두 엔터 입력해주시면 됩니다. 최초 계정에는 비밀번호가 없기 때문에 엔터 후 비밀번호 설정 하신 후 모두 엔터하시면 됩니다. sudo mysql_secure_installation ※ 위 MariaDB 서비스를 시작해야 오류가 발생되지 않음 ※ 위 초기 설정이 안되는 경우 MariaDB가 실행되고 있는지 체크 root 계정 비밀번호 변경 # "Mysql" 접속 sudo /usr/bin/mysql -u root -p
설정 파일 수정 첨부파일 default. 파일 다운로드 첨부파일 fastcgi_params. 파일 다운로드 # "Nginx" 설정 파일 수정 sudo vi /etc/nginx/sites-available/default # "location / {" 아래에 추가 "php7.4-fpm.sock" 부분에 버젼 수정 location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; } # "fastcgi_params" 설정 파일 수정 아래 내용으로 교체 sudo vi /etc/nginx/fastcgi_params fastcgi_param QUERY_STRING
완전 삭제하기 # 순서대로 진행하면 됩니다. "Mysql"의 경우 삭제 후 재설치시 구성을 제대로 하지 못하는 부분이 있습니다. sudo apt-get remove --purge mysql* sudo apt-get purge mysql* sudo apt-get autoremove sudo apt-get autoclean sudo apt-get remove dbconfig-mysql sudo apt-get dist-upgrade sudo apt-get install mysql-server # 폴더 삭제 sudo rm -rf /var/log/mysql sudo rm -rf /var/log/mysql.* sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql # 다시 한번 삭제 sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-5.7 mysql-client-core-5.7 su
APT 설정 파일 수정 # "10periodic" 파일 수정 sudo vi /etc/apt/apt.conf.d/10periodic APT::Periodic::Update-Package-Lists "0"; APT::Periodic::Download-Upgradeable-Packages "0"; APT::Periodic::AutocleanInterval "0"; APT::Periodic::Unattended-Upgrade "0"; # "20auto-upgrades 파일 수정 sudo vi /etc/apt/apt.conf.d/20auto-upgrades APT::Periodic::Update-Package-Lists "0"; APT::Periodic::Unattended-Upgrade "0"; 기본값 # "10periodic" 파일 기본값 udo vi /etc/apt/apt.conf.d/10periodic APT::Periodic::Update-Package-Lists "1"; APT::
Elasticsearch 설치하기 # 레포 추가 curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list # 업데이트 sudo apt update # "elasticsearch" 설치 sudo apt install elasticsearch # "elasticsearch" 시작 및 시작등록 sudo systemctl enable elasticsearch sudo systemctl start elasticsearch 외부접속 허용 # 외부접속 허용시에만 진행하면 됩니다. sudo vi /etc/elasticsearch/elasticsearch.yml # 아래 내용을 찾아서 수정
Nginx.conf 설정 파일 수정 # "Nginx.conf" 파일 수정 아래 내용중 "gzip on" 부분을 찾은 후 넣습니다. 내용을 수정하셔도 되고 해당 부분을 삭제하고 아래것을 복사하여 넣어도 됩니다. sudo vi /etc/nginx/nginx.conf # Gzip 활성화 gzip on; # HTTP/1.0 및 HTTP/1.1 모두에 대해 압축을 사용하도록 설정합니다. gzip_http_version 1.1; # 압축 수준(1-9)입니다. # "5"는 크기와 CPU 사용량을 완벽하게 절충하여 다음과 같은 기능을 제공합니다. # 대부분의 아스키 파일(레벨 9와 동일)이 75% 감소합니다. gzip_comp_level 5; # 이미 작고 많이 줄어들 것 같지 않은 것은 압축하지 마세요. # 기본값 20 Byte gzip_min_length 256; # 프록시를 통해 당사에 연결하는 클라이언트도 데이터를 압축합니다. # "Via" 헤더로 식별됩니다(CloudFront 필요) gz
Mysql(MariaDB) 최신 설치 및 업데이트 # "Mysql(MariaDB)" 최신 업데이트 기존 이전 버젼 설치 되어있어도 업데이트 가능 위에 링크로 접속하여 특정 버젼 및 최신 버젼 입력 (현재 10.5) sudo apt-get install software-properties-common sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 sudo add-apt-repository 'deb [arch=amd64,arm64,i386,ppc64el] http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.5/ubuntu xenial main' # 우분투 업데이트 sudo apt update # "MariaDB" 최신 설치 중간에 기존에 있던 "50-server.cnf" 나오면 "Y" 입력 기존에 있던 파일은 같은 폴더에 "old"로 백업되
Mysql(MariaDB) 설정 및 튜닝 50-server.cnf 첨부파일 50-server.cnf 파일 다운로드 # 설정 변경하기 단, 버젼이 낮은 "Mysql"의 경우 "innoDB" 관련된 내용이 없음으로, 업데이트 권장 sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf # [mysql] 바로 아래 입력 접속 "IP"에 대한 "Resolving"을 진행하는데 대부분의 "IP"의 경우 등록되지않아 쓸데없는 리소스를 사용하기 때문에 "skip" 해준다. skip-host-cache skip-name-resolve # 하단 "Fine Tuning" 설정 값 변경 key_buffer_size = 256M max_allowed_packet = 1G thread_stack = 192K thread_cache_size = 8 # This replaces the startup script and checks MyISAM tables if needed # t
analysis-nori plug-in 설치하기 cd /usr/share/elasticsearch/bin/ sudo ./elasticsearch-plugin install analysis-nori 생성하기 # 테스트 중 사용하지 마세요. curl -X PUT http://localhost:9200/nori_test -H "Content-Type: application/json" -d '{"settings": {"index": {"analysis": {"analyzer": {"korean": {"type": "nori","stopwords": "_korean_"}}}}}}' curl -X PUT http://localhost:9200/nori_test/_settings -H "Content-Type: application/json" -d '{"analysis": {"tokenizer": {"nori_user_dict": {"type": "nori_tokenizer","decompoun
설치하기 # 컴포저로 설치하기 composer global require friendsofphp/php-cs-fixer VSCODE 익스텐션 설치 PHP-CS-Fixer # "VSCODE" 설정 파일에 추가 "php.suggest.basic" : false, "[php]" : { "editor.formatOnSave" : true, "editor.defaultFormatter" : "junstyle.php-cs-fixer", }, "php-cs-fixer.executablePath" : "C:/Users/윈도우계정명/AppData/Roaming/Composer/vendor/bin/php-cs-fixer.bat", "php-cs-fixer.executablePathWindows" : "C:/Users/윈도우계정명/AppData/Roaming/Composer/vendor/bin/php-cs-fixer.bat", "php-cs-fixer.onsave" : true, "php-cs-fixe
컴포저 설치하기 Composer Download the installer to the current directory Verify the installer SHA-384, which you can also cross-check here Run the installer Remove the installer WARNING: Please do not redistribute the install code. It will change with every version of the installer. Instead, please link to t... getcomposer.org 위 사이트 접속후 상단에 "Composer-Setup.exe" 클릭 후 설치진행 설치되었는데 오류가 뜬다면, 뒤로가기 후 개발자모드(DeveloperMode) 체크 후 진행 설치 완료 후 "CMD" 환경에서 "composer" 입력시 도움말이 표시됨 ※ 만약 마지막 "php.ini" 다음 설치에서 오류가 난다면 이미
레포지토리 주소 변경 파일 수정 sudo vi /etc/apt/sources.list ":" 입력 후 붙여넣기 %s/archive.ubuntu.com/mirror.kakao.com Iwinv(스마일서브) 서버의 경우 (mirror.kakao.com가 훨씬 빠름) %s/maxio.clouds.mirror.kakao.com/mirror.kakao.com 저장 후 업데이트 sudo apt-get update DNS nameserver 변경 sudo rm /etc/resolv.conf sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf' sudo bash -c 'echo "[network]" > /etc/wsl.conf' sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf' sudo chattr +i /etc/resolv.conf
※ 라라벨에 설치되어있지 않은 경우 명령어가 안될 수 있음 Available commands 명령어 설명 clear-compiled 컴파일된 클래스 파일 제거 db 새 데이터베이스 CLI 세션 시작 down 애플리케이션을 유지 보수/데모 모드로 전환 env 현재 프레임워크 환경 표시 help 명령에 대한 도움말 표시 inspire 고무적인 인용문 표시 list 명령어 나열 migrate 데이터베이스 마이그레이션 실행 optimize 프레임워크 부트스트랩 파일 캐시 최적화 serve 서버 시작 test 서버 테스트 시작 tnker 애플리케이션과 상호 작용 up 응용 프로그램을 유지 보수 모드에서 해제 auth 명령어 설명 auth:clear-resets 만료된 암호 재설정 토큰 플러시 buyer 명령어 설명 buyer:cancel 구매 영수증 48시간 후 구매 취소 미지급 cache 명령어 설명 cache:clear 응용 프로그램 캐시 플러시 cache:forget 캐시에서 항목 제거
해결방법 # 오류 로그 E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it? # 설정 sudo killall apt apt-get sudo rm /var/lib/apt/lists/lock sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock* sudo dpkg --configure -a sudo apt update sudo apt -y upgrade
숨고를 사용해본지 약 3주 정도 되는것 같습니다. 하지만, 계약건은 1개가 될까말까인 상황입니다. (견적도 낮고 요구사항도 많음, 안할 예정) 숨고의 장점이라고 한다면 낮은 접근성 입니다. 실제로 오는 견적들도 기존 유지보수 관련된 부분이라면 어떤 언어로 되어있는지 아무것도 적혀있지 않고(선택하는 목록 자체가 없음) 그리고 내용도 매우 부실합니다. 즉, No Plan No Design Yes Idea 인것이죠 (거의 70 ~ 80%) 그렇다면 제가 활동을 잘 하지 않았냐? 그건 아닙니다. 견적수가 낮은것들과 그나마 위에 데이터들보다도 나은 견적 내용을 보고 견적을 보내고 했습니다. 계약이라는것 자체가 굉장히 낮고 이어지기가 어려운 부분인데 고객과 상담을 할려면 4800캐시? 정도를 내야합니다. 그 사람이 할 생각이 있는지 없는지 모르는 불확실한 상황에서요. 처음 가입하고 이벤트로 3만 캐시를 더 받아서 6만원 결제 했습니다. 총 9만 캐시에서 시작을 했습니다. 현재는 모두 다 소진한
403 포비든 ModSecurity 해결하기 # 우선 퍼미션을 조정하고, 아파치 및 "SELINUX" 소유권을 줘도 403 포비든 문제가 발생했을때 입니다. 관련 내용으로는 "SSL"의 "ModSecurity"가 문제입니다. # httpd.conf 열기 sudo vi /etc/httpd/conf/httpd.conf # 하단의 내용을 찾아서 추가 만약 없다면 추가 "SecRuleInheritance Off" "SecRuleEngine Off" <Directory /www/html/directory/> SecRuleInheritance Off SecRuleEngine Off </Directory>
[Linux] ffmpeg-php 0.7.0 설치 on Centos 6 ffmpeg-php 0.7.0 설치 on Centos 6 설치 방법 1. 필요 호환성 패키지 설치 rpm --import http://pa... m.blog.naver.com YUM 으로 FFMPEG 설치하기 & FFMPEG-PHP 설치하기 (Centos 6.5) FFMPEG 와 FFMPEG-PHP 를 설치하는데 애를 먹었었다가.. 드디어 해결했다!! (FFMPEG 는 동영상 변환등 많은 기능이 있지만 나 같은 경우는 PHP 에서 동영상을 업로드 할 때 썸네일을 추출및 기타 정보를 가져오기.. overcode.tistory.com
PHP8 퍼포먼스 관련 테스트 간략 내용 # PHP8의 경우 PHP7.4 대비(OPcache 및 GIT 모두 키더라도) 약 3배 정도 성능이 높습니다. # PHP8은 이번에 넘어오면서 "TTFB"가 굉장히 빨라졌습니다. 패키지 및 레포지토리 업데이트 sudo apt update sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common sudo add-apt-repository ppa:ondrej/php # 업데이트 한번더 실행 sudo apt update PHP8 설치하기 # PHP 8.0 설치 sudo apt install -y php8.0 PHP8 익스텐션 설치 sudo apt install php8.0-<extension> php8.0-amqp php8.0-common php8.0-gd php8.0-ldap php8.0-odbc php8.0-readline php8.
패키치 설치하기 sudo apt install -y curl gnupg2 ca-certificates lsb-release 레포지토리 수정 # 최신 버젼 echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list # 안정화 버젼 echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list # 공식 서명키 등록 curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add - sudo apt-key fingerprint ABF5BD827BD9BF62 Nginx 설치하기 sudo apt update sudo apt i
www.conf 수정을 통한 접근 권한 설정 # 각 PHP 버젼에 맞게 이동 cd /etc/php/8.0/fpm/pool.d # www.conf 파일 수정 sudo vi www.conf # 아래 내용을 찾음 www-data는 아파치 nginx는 nignx로 설정 listen.onwer = www.data listen.group = www.data # 필자는 "nginx"를 사용하기 때문에 아래 처럼 변경 listen.onwer = nginx listen.group = nginx # 재시작 PHP는 버젼에 맞게 실행 sudo service php8.0-fpm restart sudo service nginx restart
미디엄은 최근 ES6에서 어레이를 중복제거하기 위한 다양한 접근 방식에 대한 사만다 밍의 이 기사를 다루었습니다. 어레이에서 중복을 제거하는 작업은 기본 엔진이 대용량 데이터 세트를 전송하는 방법을 처리하는 일반적인 작업입니다. 솔루션을 벤치마킹하는 것은 많은 목록을 처리해야 할 때 좋은 조언입니다. 얼마 전 대형 어레이와 유사한 문제를 해결해야 했고 새로운 지혜와 비교했을 때 제 솔루션이 어떻게 비교되는지 알고 싶어졌습니다. 한 시간 후, 결과가 나왔습니다: 저는 깜짝 놀랐습니다. 아마 당신도 그럴 거예요. 7백만 멤버의 배열에 대한 벤치마크는 밀리초 단위입니다. .filter()를 사용 간단히 말해 어레이를 사용합니다.필터링하여 배열을 반복하고 배열에 있는 요소의 첫 번째 항목만 선택합니다. 이는 가장 직관적이지 않지만 모든 플랫폼에서 성능 가격을 받습니다. set() 사용 이 접근 방식은 ES6에서 새로 사용할 수 있는 Set 객체를 사용합니다. 집합에는 중복된 구성원이 없는
VSCODE 설정 변경 단축키 "CTRL" + "," 연후 오른쪽 상단 설정 열기(JSON) 클릭하여 추가 ※ "WSL2"에서 해결된다고 함 "remote.WSL.fileWatcher.polling" : true, 참고 링크 VS CODE에서 npm install 시 EACCESS 권한 오류 발생 해결방법이 잘 정리가 되어 있네요. lahuman.github.io
npm yarn 설치하기 npm 설치 npm install -g yarn yarn 버젼 확인 yarn --version
composer.json 수정하기 # 하단 내용을 버젼을 명시 및 추가 후 저장 "php": "^7.4|^8.0" # 컴포저 업데이트 composer update
오류 내용 cd /usr/local/bin 루트에서 letencrypt 깃 클론 후 다시 해주면 됩니다. Requesting to rerun ./letsencrypt-auto with root privileges... Skipping bootstrap because certbot-auto is deprecated on this system. ./letsencrypt-auto has insecure permissions! To learn how to fix them, visit https://community.letsencrypt.org/t/certbot-auto-deployment-best-practices/91979/ Your system is not supported by certbot-auto anymore. Certbot cannot be installed. Please visit https://certbot.eff.org/ to check for other alternati
Tmux 설치하기 sudo apt install tmux Tmux 실행하기 구분 명령어 설명 기본 tmux 실행하기 tmux attach -t 0 SSH 종료 후에도 실행 유지 CTRL + B 명령어 모드 실행 CTRL + D 나가기 화면(PANE) % 화면 가로 분할 " 화면 세로 분할 상하좌우 방향키 화면 이동 { 화면 위치 이전 자리 위치로 } 화면 위치 다음 자리 위치로 x 해당 작업중인 화면 닫기 PgUp/pgDn 화면 스크롤 (완료 후 q로 스크롤 모드 닫기) 창(WINDOW) c 신규 창 생성 w 창 선택하여 이동 p 이전 창 이동 0 ~ 9 번호별 창 이동 & 창 종료 세션 관련 tmux new -s [session_name] [session_name]의 세션으로 tmux 실행 d tmux 세션을 백그라운드로 돌리기 tmux ls tmux 세션 리스트 보기 tmux attach -t [session_name] [session_name]의 세션으로 다시 전환 $ 세션 이
출력 버퍼 사용하기 구분 설명 flush() PHP가 사용하는 백엔드(CGI, 웹 서버 등)에 관계 없이 PHP의 출력 버퍼를 비웁니다. 이는 사실상 모든 출력을 사용자 브라우저에 보냅니다. flush()는 웹 서버나 클라이언트 브라우저의 버퍼링 방식에는 영향을 주지 않습니다. 그러므로 출력 버퍼를 비우려면 ob_flush()와 flush()를 모두 호출해야 합니다. 몇몇 서버들은, 특히 Win32에서, 스크립트가 종료할 때까지 결과를 브라우저에 전송하지 않고 버퍼를 지속합니다. 아파치 mod_gzip 등의 서버 모듈은 자신의 버퍼를 가지고 있기에, flush()는 데이터를 클라이언트에 즉시 전송할 수 없습니다. 브라우저도 표시하기 전에 입력을 받아들이는 버퍼를 가질 수 있습니다. 예를 들어, 넷스케이프는 줄이 끝나거나 태그가 시작할때까지 텍스트를 버퍼에 보관하고, 표는 </table>가 나올때까지 표시를 하지 않습니다. 마이크로소프트 Internet Explorer의 몇몇 버전은
문자열 자료형 특징 문자열도 곱하기가 된다. print("안녕") >>> 안녕 print("ㅋ"*9) >>> ㅋㅋㅋㅋㅋㅋㅋㅋㅋ print("안녕"*9) >>> 안녕안녕안녕안녕안녕안녕안녕안녕안녕
Boolean 자료형 불리언 타입은 파이썬에서는 앞 첫 글자가 대문자로 해야된다. true, false (X) True, False (O) print(5 > 10) >>> False print(5 < 10) >>> True print(True) >>> True print(False) >>> False print(not True) >>> False print(not False) >>> True print(not (5 > 10)) >>> True
변수(Variable) 출력하는곳에 변수를 넣기 위해서는 감싸여진 곳에 큰(작)은 따옴표를 끊어준 후 + 로 이어 쓸 수 있다. (다른 방법으로는 쉼표(,)도 가능하다.) name = "홍길동" print("안녕하세요." + name + " 입니다.") >>> 안녕하세요. 홍길동 입니다. name = "홍길동" print("안녕하세요.", name, " 입니다.") >>> 안녕하세요. 홍길동 입니다. 문자열(STR)이 아닌 다른 타입의 경우 큰(작)은 따옴표에서는 문자열로 출력하기 위해서 "str()" 감싸야 된다. 다만, 쉼표는 문자열 선언(str())을 하지 않아도 된다. 큰(작)은 따옴표 name = "홍길동" age = 20 print("안녕하세요." + name + " 입니다.") print("나이는 " + str(age) + "세 입니다.") >>> 안녕하세요. 홍길동 입니다. >>> 나이는 20세 입니다. 쉼표(,) print("안녕하세요.", name, " 입니다.")
초기 설정하기 # MariaDB 초기 설정 "Set root password"에서 엔터 후 사용할 비밀번호 2번 입력 후 모두 엔터 입력해주시면 됩니다. 최초 계정에는 비밀번호가 없기 때문에 엔터 후 비밀번호 설정 하신 후 모두 엔터하시면 됩니다. sudo mysql_secure_installation ※ 위 MariaDB 서비스를 시작해야 오류가 발생되지 않음 ※ 위 초기 설정이 안되는 경우 MariaDB가 실행되고 있는지 체크
http_build_query # 아래 처럼 "GET"으로 네이버 영화 정보를 가져온다고 가정했을때 "http_build_query()"를 사용하여 URL 문자열로 자동으로 인코딩 해주는 방식 "POST" 형식처럼 데이터를 배열로 선언한뒤 배열을 URL 문자열로 인코딩 해주는 방식 # "GET" 데이터 $data = [ "query" => $title, "count" => $count, ]; # URL 문자열로 인코딩 $data = "?".http_build_query($data, "", "&"); $CURL = curl_init(); curl_setopt($CURL, CURLOPT_URL, "https://openapi.naver.com/v1/search/movie.json{$data}"); curl_setopt($CURL, CURLOPT_POST, false); $response = curl_exec($CURL); curl_close($CURL); $data = json_
언어 파이썬 현재 : 하 목표 : 중상 비고 : 현재 파이썬은 기초를 잡아가는 과정이며, 다른 언어의 경험이 있는 만큼 기초만 잡고 바로 여러가지 연습할 예정 달성여부 : 장고를 제외하고 FastAPI와 Flask를 해보았다. 결론적으로는 FastAPI가 짱이다. 현재 많이 딥하게 써보았고, 각종 크롤링 등 프로그램도 많이 제작해보았다. 스스로 기준을 정하는게 올바르지 않을 수는 있지만, 그래도 중급 정도 실력은 올라온것 같다. 현재는 개발 대부분 백엔드를 FastAPI로 사용하고 있다. PHP 현재 : 상 목표 : 최상 비고 : PHP는 나의 주 언어이다. 사실 PHP의 모든 함수를 사용할 일은 없지만 모르는것도 수두룩 하다. 물론 그만큼 잘 안쓰는 함수가 많다는것도 문제이다. 하지만 욕심이 생긴다. 내 머리속의 PHP 90%를 넣는 그날까지 계속 할것 이다. 달성여부 : 작년말 이번년도 초까지는 라라벨을 사용해왔으나 나머지 기간은 PHP를 하지 못했다. 물론 갑자기 할려고 하면
백슬래시(\) # 클래스 이름 앞에 "\"를 사용하면 전역 공간에서 클래스를 호출할 수 있습니다. "\"를 사용하지 않으면 코드와 동일한 네임스페이스에 있는 클래스를 호출합니다. 그러나 코드에서 네임스페이스를 사용하지 않으면 글로벌 공간에서 클래스를 호출합니다.
사용자 인증 $URL = "사이트 주소"; $AUTH_URL = "https://kakaoapi.aligo.in/akv10/token/create/30/s/"; $CURL = curl_init(); curl_setopt($CURL, CURLOPT_PORT, (strtolower(parse_url($URL)['scheme']) == 'https') ? 443 : 80); curl_setopt($CURL, CURLOPT_URL, $AUTH_URL); curl_setopt($CURL, CURLOPT_POST, 1); curl_setopt($CURL, CURLOPT_RETURNTRANSFER, 1); curl_setopt($CURL, CURLOPT_POSTFIELDS, http_build_query([ "apikey" => "키", "userid" => "유저 아이디", ])); curl_setopt($CURL, CURLOPT_SSL_VERIFYPEER, false); $reponse =
Mysql(MariaDB) 구버젼 설치 sudo apt update sudo apt install -y mysql-server # 외부 포트 열기 sudo ufw allow mysql # 시작등록 sudo systemctl enable mysql # Mysql 실행 sudo service mysql start # MariaDB 초기 설정 "Set root password"에서 엔터 후 사용할 비밀번호 2번 입력 후 모두 엔터 입력해주시면 됩니다. 최초 계정에는 비밀번호가 없기 때문에 엔터 후 비밀번호 설정 하신 후 모두 엔터하시면 됩니다. sudo mysql_secure_installation ※ 위 MariaDB 서비스를 시작해야 오류가 발생되지 않음 ※ 위 초기 설정이 안되는 경우 MariaDB가 실행되고 있는지 체크
커맨드 생성하기 # 아티산을 이용한 커맨드 생성 "app/Console/Commands" 폴더에 생깁니다. 그냥, 폴더에 바로 만들어도 됩니다. php artisan make:command 클래스명 # 만들게 되면 해당 파일에 내용은 아래와 같을 겁니다. "$signature"에 실행시킬 명령어를 정해줍니다. 중요 로직은 "hander"에 추가하면 됩니다. 저는 로그를 출력 해보겠습니다. <?php namespace App\Console\Commands; use Illuminate\Console\Command; class 클래스명 extends Command { protected $signature = "purchase:cancel"; protected $description = "Command description"; public function __construct() { parent::__construct(); } public function handle() { Log::deb
초단위 # 크론탭 수정 crontab -e # 초단위 설정 아래 처럼 하면 1분 뒤 부터는 1초 단위로 크론탭 실행됨 "* * * * *" 뒤에 "sleep 01;"이 중요 포인트 * * * * * cd /경로 && php artisan schedule:run >> /dev/null 2>&1 * * * * * sleep 01; cd /경로 && php artisan schedule:run >> /dev/null 2>&1 * * * * * sleep 02; cd /경로 && php artisan schedule:run >> /dev/null 2>&1 * * * * * sleep 03; cd /경로 && php artisan schedule:run >> /dev/null 2>&1 * * * * * sleep 04; cd /경로 && php artisan schedule:run >> /dev/null 2>&1 * * * * * sleep 05; cd /경로 && php artisan sc
파이썬 최신 업데이트 # 현재 파이썬 버젼 확인 python3 -V # 레포지토리 업데이트 sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update # 업데이트된 레포지토리 파이썬 패키지 확인 sudo apt list | grep python3.9 # 최신 파이썬 설치 sudo apt install -y python3.9 # 대체 업데이트에 "Python"의 이전 버전과 새 버전을 모두 추가합니다. sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 2 # 대표적으로 사용할 파이썬 선택 0번으로 오토 모드로 되어있을텐데 최신 파이썬 번호로 입력해서 고정시켜주세요. sudo update-alternative
파이썬 버젼 오류 해결 # 위 오류가 발생되는 이유는 파이썬 버젼이 맞지 않아서 입니다. 아래 명령어를 통해서 현재 설치된 파이썬 리스트를 확인 하여 사용할 버젼을 선택해줘야 합니다. sudo update-alternatives --config python3
패키지 한번에 설치하기 # 해당 프로젝트 폴더로 이동 후 명령어 실행으로 패키지 전체 설치 pip install -r requirements.txt ※ 단, "requirements.txt" 파일이 존재해야됩니다. requirements.txt 파일 생성하기 # 해당 프로젝트 폴더에서 명령어 실행 pip freeze >> requirements.txt
라라벨 FCM 푸시 알람 https://github.com/brozot/Laravel-FCM brozot/Laravel-FCM Laravel-FCM is an easy to use package working with both Laravel and Lumen for sending push notification with Firebase Cloud Messaging (FCM). - brozot/Laravel-FCM github.com
특정 버전 삭제 sudo apt purge `dpkg -l | grep php7.2| awk '{print $2}' |tr "\n" " "` sudo apt purge php7.* sudo apt autoclean sudo apt autoremove
숫자처리함수 절대값 print(abs(-5)) print(abs(5)) >>> 5 제곱근 print(pow(4, 2)) >>> 4*4 = 16 OR 4**4 = 16 최대값 print(max(5, 12)) >>> 12 최소값 print(min(5, 12)) >>> 5 반올림 print(round(3.14)) >>> 3 print(round(4.99)) >>> 5 math 임포트 하기 "math" 내장 함수 from math import * dir(math) >>> [ '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor',
랜덤 함수 0.0 ~ 1.0 이하의 임의의 값 print(random()) 0.0 ~ 10.0 이하의 임의의 값 print(random() * 10) 0.0 ~ 10 이하의 임의의 값 (정수) print(int(random() * 10)) 1 ~ 10 이하의 임의의 값 (정수) print(int(random() * 10) + 1) 1 ~ 45 이하의 임의의 값 (정수) print(int(random() * 45) + 1) 1 ~ 45 미만의 임의의 값 생성 print(randrange(1, 46)) 1 ~ 45 이하의 임의의 값 생성 print(randint(1, 45))
문자열(독스트링 Documentation String) 독스트링에도 포멧팅을 사용할 수 있다. gender = "남자" sentence3 = f""" 저는 {gender} 입니다. """ >>> 저는 남자 입니다.
슬라이싱 인덱스가 0부터 시작하기 때문에 7이면 "성별 정보"를 가져올 수 있다. number = "990120-1234567" print(f"성별 : {number[7]}") >>> 성별 : 1 "연도"는 [0:2] 0은 시작 2는 두 번째까지 가져올 수 있다. print(f"년도 : {number[0:2]}") >>> 년도 : 99 "월" 정보는 [2:4] 2는 두 번째부터 시작 4는 네 번째까지 가져올 수 있다. print(f"월 : {number[2:4]}") >>> 월 : 01 "일" 정보는 [4:6] 4는 네 번째부터 시작 6는 여섯 번째까지 가져올 수 있다. print(f"일 : {number[4:6]}") >>> 일 : 20 [:6] 앞에 콜론만 적을 경우 암시적으로 첫 번째부터 가져온다. print(f"생년월일 : {number[:6]}") >>> 생년월일 : 990120 [7:] 뒤에 콜론만 적을 경우 암시적으로 끝가지 가져온다. print(f"뒤 7자리 : {nu
문자열처리함수 "lower()"를 이용하여 모두 소문자로 변경하여 출력 message = "Python is Amazing" print(message.lower()) >>> python is amazing "upper()"를 이용하여 모두 대문자로 변경하여 print(message.upper()) >>> PYTHON IS AMAZING 첫 번째 단어가 소문자인지 체크 print(message[0].islower()) >>> False 첫 번째 단어가 대문자인지 체크 print(message[0].isupper()) >>> True 문자열 수 print(len(message)) >>> 17 문자열 변경 print(message.replace("Python", "Java")) >>> Java is Amazing "n"이 몇 번째 있는지 체크 print(message.index("n")) >>> 5 "n"이 있는 위치에서 다음 위치에 있는 "n"을 찾는다. 즉, 다음 번째에 해당하는 "n
흑연패드 추천 # 사진에 흑연패드는 이미 반으로 잘라서 썼습니다. 추천하는 이유는 현재 한성컴퓨터 TFX5450UC를 사용하고 있는데 성능으로 두고 쓰게 된다면 온도가 금방 올라가고 뒷판을 뜯어보니 쿨링구조가 매우 좋지 않습니다. 그래서 팬 소리가 크기 때문에... 이번에 흑연패드로 바꿔줬는데 정말 놀라운 결과가 발생됬네요. 성능 모드로 CPU-Z 벤치를 돌려보니 이전에 써멀구리스 바른대비 약 10도 ~ 12도 정도 내려갔습니다. 올코어 4기가 터지면서 온도 80도 원래는 90도 이상 나옴... ※ 주의사항 잘 보면서 작업하세요. 쇼트나면 노트북 날라갑니다~ 흑연패드 얇기 흑연패드 흑연패드 흑연패드 비엠텍 그라파이트써멀패드/써멀패드/쿨썸패드 CTPD3030/4040/5050/6060 COUPANG www.coupang.com
문자열포멧 기본 "+" 문자열 포맷 방법 print("a" + "b") >>> ab 기본 "," 문자열 포맷 방법 print("a", "b") > a b 원하는 값을 "%d"(정수) 뒤에 값을 지정해 줄 수 있다. print("나는 %d살 입니다." %20) >>> 나는 20살 입니다. "%s"(문자열) 값을 넣을 수 있다. (문자열에는 정수를 넣을 수 있다.) print("나는 %s살 좋아해요." %"파이썬") >>> 나는 파이썬살 좋아해요. "%a"(캐릭터) 한 글자만 넣을 수 있다. (두 개 이상 단어 입력 시 오류) print("Apple은 %c로 시작해요." %"A") >>> Apple은 A로 시작해요. 한 번에 여러 가지를 넣을 수도 있다. print("나는 %s색과 %s색을 좋아해요." %("빨강", "파랑")) >>> 나는 빨강색과 파랑색을 좋아해요. 포맷을 활용하여 중괄호에 넣을 수 있다. print("나는 {}살 입니다.".format(20)) >>> 나는 20살
탈출문자 "\n" 역 슬러시엔 은 줄 바꿈이다. print("백문이 불여일견 \n백견이 불여일타") >>> 백문이 불여일견 백견이 불여일타 ", ' 을 활용하여 따옴표를 넣을 수도 있다. print("안녕하세요. '검은냥냥이' 입니다.") print('안녕하세요. "검은냥냥이" 입니다.') >>> 안녕하세요. '검은냥냥이' 입니다. >>> 안녕하세요. "검은냥냥이" 입니다. 또한, 역 슬러시를 통해 큰따옴표 안에 큰따옴표를 중복해서 쓸 수 있다. print("안녕하세요. \"비킹\" 입니다.") print("안녕하세요. \'비킹\' 입니다.") >>> 안녕하세요. "비킹" 입니다. >>> 안녕하세요. '비킹' 입니다. "\\" 역 슬러시를 두 번 사용하게 되면 하나의 "\" 역 슬러시로 변경된다. print("C:\\Users\\Desktop\\Python") >>> C:\Users\Desktop\Python "\r" 커서를 맨 앞으로 이동' print("Red Apple\rPine
isset() 주의할점 # "null" $test = null; Log::debug("isset null : ".isset($test)); -> 빈값 (false) # "false" $test = false; Log::debug("isset false : ".isset($test)); -> 1 (true) # "true" $test = true; Log::debug("isset true : ".isset($test)); -> 1 (true) # "공백" $test = ""; Log::debug("isset 공백 : ".isset($test)); -> 1 (true) # "띄어쓰기" $test = " "; Log::debug("isset 띄어쓰기 : ".isset($test)); -> 1 (true) ※ 즉, 현재 위 보기에서는 "null"일 경우에만 "false"를 출력하기 때문에 주의하면서 사용해야 합니다. ※ 가급적 "empty()", "!empty()"와 같이 사용하세요!
컴포저2(Composer 2) 설치하기 curl -sS https://getcomposer.org/installer -o composer-setup.php sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer # 설치 확인 composer
known_hosts 파일 삭제 # 기존 "known_hosts" 파일에 SSH 정보가 담겨 있어서 그렇습니다. 해당 파일을 삭제해주시면 다시 생성되면서 접속이 가능해집니다. C:\Users\윈도우계정이름\.ssh
mysqld.cnf 설정값 수정 # 경로 cd /etc/mysql/mysql.conf.d/mysqld.cnf # "skip-external-locking" 하단에 추가 skip-external-locking skip-host-cache skip-name-resolve # 나머지는 기존 값을 수정하거나 주석처리하여 맨아래에 한번에 넣기 # "Fine Tuning" max_connection=100 connect_timeout=20 wait_timeout=7200 max_allowed_packet=32M thread_stack=192K thread_cache_size=128 sort_buffer_size=2M join_buffer_size=2M bulk_insert_buffer_size=16M tmp_table_size=256M max_heap_table_size=256M # "QueryCache" query_cache_type=OFF query_cache_limit=2M query_c
Opcache 설치하기 명령어 설명 php artisan opcache:clear OPcache 지우기 php artisan opcache:config OPcache 구성 표시 php artisan opcache:status OPcache 상태 표시 php artisan opcache:compile --force 응용 프로그램 코드를 미리 컴파일합니다. ※ opcache.dups_fix를 사용하도록 설정하거나 --force 플래그를 사용해야 합니다. 클래스를 다시 선언할 수 없음 오류가 발생하면 opcache.dups_fix를 사용하도록 설정하거나 클래스 경로를 제외 목록에 추가합니다. composer require appstract/laravel-opcache php artisan vendor:publish --provider="Appstract\Opcache\OpcacheServiceProvider" --tag="config"
Opcache 설정하기 # 각 PHP 버젼 sudo vi /etc/php/버젼/fpm/conf.d/10-opcache.ini ;;; ; OPCACHE ;;; ; OPCACHE 사용여부 opcache.enable=1 ; 파일과 캐시 변경점 체크 (0, 1) opcache.validate_timestamps=1 ; 변경점 체크 시간(SECOND) ; 개발시 0초로 권장 opcache.revalidate_freq=2 ; 캐시 메모리 크기 (MB) opcache.memory_consumption=1024MB ; 문자열 버퍼크기 (MB) opcache.interned_strings_buffer=16 ; 파일 키 개수 opcache.max_accelerated_files=100000 ; OPCACHE 재시작시 만료된 캐시의 교체 비율 (%) opcache.max_wasted_percentage=10 ; 활성화 된 경우 OPcache는 현재 작업 디렉토리를 스크립트 키에 추가하여 동일한 기본 이
메인 도메인 준비 CDN을 만들기 위해서는 가장 먼저 메인으로 사용하고 있는 도메인이 필요합니다. EX) abc.com 도메인이라면 cdn.abc.com 으로 서브 도메인으로 사용합니다. 도메인 구입처에서 네임서버를 "AWS ROUTE 53"으로 연결해줍니다. S3 생성하기 Amazon Web Services Sign-In Amazon Web Services Login 로그인 루트 사용자 무제한 액세스 권한이 필요한 작업을 수행하는 계정 소유자입니다. 자세히 알아보기 IAM 사용자 일일 작업을 수행하는 계정 내 사용자입니다. 자세히 알아보기 루트 사용자 이메일 주소 다음 계속 진행하는 경우 AWS 고객 계약 또는 AWS 서비스에 대한 기타 계약 및 개인 정보 보호 정책 에 동의하게 됩니다. 이 사이트는 필수 쿠키를 사용합니다. 자세한 내용은 쿠키 고지 를 참조하세요. AWS를 처음 사용하십니까? AWS 계정 새로 만들기 English s3.console.aws.amazon.com 버
phpmyadmin 설치 및 심볼릭 링크 생성 # "phpmyadmin" 설치 sudo apt install -y phpmyadmin sudo ln -s /usr/share/phpmyadmin root로 설정한 경로 - EX) sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin
백업 계획 만들기 Amazon Web Services Sign-In Amazon Web Services Login 로그인 루트 사용자 무제한 액세스 권한이 필요한 작업을 수행하는 계정 소유자입니다. 자세히 알아보기 IAM 사용자 일일 작업을 수행하는 계정 내 사용자입니다. 자세히 알아보기 루트 사용자 이메일 주소 다음 계속 진행하는 경우 AWS 고객 계약 또는 AWS 서비스에 대한 기타 계약 및 개인 정보 보호 정책 에 동의하게 됩니다. 이 사이트는 필수 쿠키를 사용합니다. 자세한 내용은 쿠키 고지 를 참조하세요. AWS를 처음 사용하십니까? AWS 계정 새로 만들기 English ap-northeast-2.console.aws.amazon.com # 위 링크 접속하여 "백업 계획"으로 이동하기 "AWS Backup"의 최대 장점은 볼륨까지 한번에 백업 됩니다. 복원시 EC2로 자동으로 만들어집니다. 1. 백업 계획 생성 - 새 계획 수립 - 백업 계획 이름 설정 2. 백업 규치 구
데이터 수명 주기 관리자 시작 Amazon Web Services Sign-In Amazon Web Services Login 로그인 루트 사용자 무제한 액세스 권한이 필요한 작업을 수행하는 계정 소유자입니다. 자세히 알아보기 IAM 사용자 일일 작업을 수행하는 계정 내 사용자입니다. 자세히 알아보기 루트 사용자 이메일 주소 다음 계속 진행하는 경우 AWS 고객 계약 또는 AWS 서비스에 대한 기타 계약 및 개인 정보 보호 정책 에 동의하게 됩니다. 이 사이트는 필수 쿠키를 사용합니다. 자세한 내용은 쿠키 고지 를 참조하세요. AWS를 처음 사용하십니까? AWS 계정 새로 만들기 English ap-northeast-2.console.aws.amazon.com # 위 링크 접속 후 EBS 스냅샷 생성 및 삭제 예약 및 관리 "수명 주기 정책 생성" -> Data Lifecycle Manager를 사용하면 EBS 스냅샷 및 EBS 지원 AMI의 생성, 보존, 복사, 삭제를 자동화할 수
공식 https://www.electronjs.org/ Electron | Build cross-platform desktop apps with JavaScript, HTML, and CSS. Build cross-platform desktop apps with JavaScript, HTML, and CSS. www.electronjs.org 버전 https://www.electronjs.org/releases/stable Stable Releases | Electron Electron 12.0.0 March 02, 2021 ( 2 weeks ago ) Release Notes for v12.0.0 Stack Upgrades Chromium 89.0.4389.69 v89 blog post v88 blog post Node v14.16.0 v14.16.0 release notes v14.15.5 release notes v14.15.4 release notes v14.15.3 rele
패키지 설치 아래 패키지를 설치해야 일렉트론을 실행할 수 있습니다. ※ 추가 오류 발생시 아래 내용 확인 sudo apt update && sudo apt install -y gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1
BrowerWindow 옵션 옵션 타입 설명 width Integer Windows 너비 (픽셀). 기본값은 800입니다. height Integer Windows 높이 (픽셀). 기본값은 600입니다. x Integer 화면에서 창 왼쪽 오프셋. 기본값은 창을 가운데에 맞추는 것입니다. (y를 사용하는 경우 필수) y Integer 화면에서 창 상단 오프셋. 기본값은 창을 가운데에 맞추는 것입니다. (x를 사용하는 경우 필수) useContentSize Boolean 너비와 높이는 웹 페이지의 크기로 사용됩니다. 즉, 실제 창 크기에는 창 프레임의 크기가 포함되며 약간 더 큽니다. 기본값은 거짓입니다. center Boolean 화면 중앙에 창을 표시합니다. minWidth Integer Windows 최소 너비. 기본값은 0입니다. minHeight Integer Windows 최소 높이. 기본값은 0입니다. maxWidth Integer Windows 최대 너비. 기본값은 제한
main.yml name: CI on: push: branches: [ main ] pull_request: branches: [ main ] workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest steps: - name: checkout # checkout uses: actions/checkout@master - name: Upload S3 # S3에 배포 uses: jakejarvis/s3-sync-action@master with: args: --exclude ".git*" --acl public-read --follow-symlinks --delete env: AWS_S3_BUCKET: "버킷 이름" AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_REGION: ${{ se
args 인수 설명 --verbose 디버깅에 유용한 수정중인 파일을 출력합니다. --delete 소스에없는 파일 삭제 --transfer-all 대상 사이트와 동일 해 보이는 모든 파일 전송 --dry-run 실제 변경없이 수정 될 파일을 출력합니다. --include=File.txt 일치하는 파일을 포함하면 여러 --include를 추가 할 수 있습니다. --exclude=File.txt 일치하는 파일을 제외하고 여러 --exclude를 추가 할 수 있습니다. --include-glob=*.zip 일치하는 파일을 포함하면 여러 --include-glob을 추가 할 수 있습니다. --exclude-glob=*.zip 일치하는 파일을 제외하고 여러 --exclude-glob을 추가 할 수 있습니다. --delete-excluded 제외 된 것으로 표시 한 항목이 서버에있는 경우 삭제합니다. --no-empty-dirs 빈 디렉토리를 만들지 마십시오 --parallel=X 한 번에 X
기본값 키 값 타입 필수 기본값 AWS_ACCESS_KEY_ID 액세스 키 env Yes N/A AWS_SECRET_ACCESS_KEY 보안 액세스 키 Yes N/A AWS_S3_BUCKET 버킷 이름 Yes N/A AWS_REGION 버킷 생성 지역(리전) No us-east-1 AWS_S3_ENDPOINT 버킷의 엔드 포인트 URL No 자동 (s3.amazonaws.com 또는 AWS의 리전 별 해당) SOURCE_DIR 로컬 디렉터리 (또는 파일) No ./ (복제 된 저장소의 루트) DEST_DIR S3 버킷 내부의 디렉토리 No / (버킷의 루트) 예외처리 인수 설명 --acl public-read 파일을 공개적으로 읽을 수 있도록합니다 (버킷 설정도 공개로 설정되어 있는지 확인). --follow-symlinks 다 치지 않고 발생할 수있는 이상한 심볼릭 링크 문제를 수정합니다. --delete --delete가 리포지토리 / 빌드의 최신 버전에없는 S3 버킷의 파일을
TFX5450UC 한성 노트북 TFX5450UC 4개월 사용후기 TFX5450UC CPU-Z CPU-Z CPU-Z CPU-Z CPU-Z 현재 한성 노트북 TFX5450UC을 개발용으로 사용중입니다. 서론 필요없이 간단하게 장단점을 설명하겠습니다. 장점 1. 스펙대비 가벼운 무게와 생각보다 작은 충전기 2. C 타입 충전 (최소 65W 이상) 3. 유선 랜포트 (있으면 쓰게 됨) 4. 가격대비 스펙이 좋음 5. 조용모드로 놓고 사용해도 웬만한 무겁지 않은 작업들도 모두 가능하다. 단점 1. 별로 좋지 않은 쿨링 시스템 - 히트파이프가 1개이고 딱히 좋아보이진 않음 - 하지만, 모드를 조용으로 놓으면 나름 쓸만함 2. 발열로 인한 팬 소음 - 이건 거의 대부분 공통적인 문제이지만 - 성능, 엔터 모드로 쓰게 되면 발열 해소가 잘 되지 않아서 팬이 자주 돕니다. 팬이 시끄러운것도 있지만 RPM 진짜 높게 올라갈 수 있어서 비행기 이륙이 뭔지 알 수 있습니다. 3. 패널이 생각보다 밝지는
기본값 키 필수 설명 PATHS yes* 무효화 할 하나 이상의 공백으로 구분 된 경로 목록 PATHS_FROM 경로 목록을 읽을 파일 이름 DISTRIBUTION yes 작업할 구름 전면 분포 ID(예: 'EDFDVBD6Example') AWS_REGION 운영될 AWS 영역 AWS_ACCESS_KEY_ID 액세스키 AWS_SECRET_ACCESS_KEY 비밀키 DEBUG no "1"로 설정하면 문제 해결을 위해 최종 awscli 무효화 명령을 인쇄 AWS IAM Policy 이 작업을 사용하려면 최소한 다음 권한이있는 액세스 키 쌍을 제공해야합니다. { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "cloudfront:CreateInvalidation", "Resource": "arn:aws:cloudfront::<account id>:distributio
VSCODE settings.json 파일 수정하기 VSCODE settings VSCODE settings # VSCODE에서 "파일->기본설정->설정"이나 "CTRL+," 단축키로 설정 연후 검색이나 JSON에서 "php.memory"을 -1로 변경해주세요. "php.memoryLimit" : "-1",
운영체제 확인 # 운영체제 확인 cat /etc/redhat-release cat /etc/*release* # 비트 확인 getconf LONG_BIT 참고 링크 리눅스에서 OS버전 확인하기. 리눅스에서 OS버전 확인하기 리눅스에서 버전을 확인하는 방법은 여러가지가 있습니다. 커널을 확인하거나 리눅스OS 버전을 확인할때 유용합니다. 아래 명령어들을 참조하시고 입맛에 맞게 골라 쓰세요 :) # 일반.. ongal.tistory.com
운영체제 확인 # 운영체제 확인 cat /etc/issue cat /etc/redhat-release cat /etc/*release* # 비트 확인 getconf LONG_BIT 참고 링크 리눅스에서 OS버전 확인하기. 리눅스에서 OS버전 확인하기 리눅스에서 버전을 확인하는 방법은 여러가지가 있습니다. 커널을 확인하거나 리눅스OS 버전을 확인할때 유용합니다. 아래 명령어들을 참조하시고 입맛에 맞게 골라 쓰세요 :) # 일반.. ongal.tistory.com
NVM 설치하기 # NVM(Node Version Manager) 라이브러리, 프레임워크, 개발 툴 등 협업할때 발생되는 버전 호환 문제를 해결하기 위해서 사용 # 관련 패키지 설치 sudo apt install -y build-essential libssl-dev # NVM 설치 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash # bashrc 수정 내용 적용 source ~/.bashrc NVM 사용하기 # NVM으로 사용가능한 Node 버전 확인 nvm ls-remote # NVM Node 10.16.3 버전 설치해보기 nvm install 10.16.3 # NVM 버전 설정하기 nvm use 10.16.3 # Node 버전 확인 node -v # Npm 버전 확인 npm -version # Nvm 현재 사용 버젼 nvm current
요즘 개발 관련된 교육 플랫폼들이 나오면서 학원과 같이 가르치고 있죠. 근데 저는 여기서 장점이 아닌 현재의 문제점과 단점을 얘기할 겁니다. 이 문제는 전체적인 공통사항임을 알아주셨으면 합니다. 저는 3년차 프리랜서 입니다. 스파르타코딩클럽은 제 지인이 다니고 있습니다. 물론 반대를 했지만 선택은 본인이 하는거니깐요. 옆에서 보면서 느낀것을 말하고자 합니다. 1. 짧은 기간에 맞춘 문제 있어보이는 커리큘럼 현재 프론트 개발자로 가기 위해서 주로 다룰것을 선택하게 되는데 당연히 리엑트 밖에 없긴 합니다만... 커리큘럼 자체가 리엑트를 배울때 노드가 무엇인지 노드로 왜 돌아가야하는가 리엑트는 어떤 영역에 속하는지 그런게 정말 기초적인 것을 알려주지 않는것 같습니다. 강의를 던져줍니다. 그냥 보고 만들라고 합니다. (거짓말 같죠?) 처음에 파이썬으로 시작하는데 조를 짜줍니다. 랜덤 조 입니다. 주?마다 돌아가는건지 암튼 주기적으로 바뀝니다. 시작하기 전에 강의를 들으라고 합니다. 해당 강
권한 부여하기 sudoers passwd group # 먼저 "root" 계정으로 전환 su 또는 su root # "sudo" 권한 부여 "sudoers" 파일을 연후 "root" 밑에 추가 vi /etc/sudoers ubuntu ALL=(ALL:ALL) ALL # "passwd"를 연후 하단에 "ubuntu"를 찾아서 뒤에 값을 "0:0"으로 변경 vi /etc/passwd ubuntu:x:0:0:,,,:/home/ubuntu:/bin/bash # "그룹" 변경 "root" 뒤에 "ubuntu" 추가하기 vi /etc/group root:x:0:ubuntu
오류 해결하기 sudo apt remove cmdtest sudo apt remove yarn curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list sudo apt-get update sudo apt-get install yarn -y
Keys # 키는 React가 어떤 항목이 변경, 추가 또는 제거되었는지 식별하는 데 도움이됩니다. 요소에 안정적인 ID를 제공하려면 배열 내부의 요소에 키를 제공해야합니다. const numbers = [1, 2, 3, 4, 5]; const listItems = numbers.map((number) => <li key={number.toString()}> {number} </li> ); # 키를 선택하는 가장 좋은 방법은 형제 중에서 목록 항목을 고유하게 식별하는 "문자열을 사용"하는 것입니다. 대부분의 경우 "데이터의 ID를 키로 사용"합니다. const todoItems = todos.map((todo) => <li key={todo.id}> {todo.text} </li> ); # 렌더링 된 항목에 대한 "안정적인 ID가없는 경우" 마지막 수단으로 "항목 색인을 키로 사용"할 수 있습니다. const todoItems = todos.map((todo, index) => //
해결하기 # 입력 값들은 "null"이 아니어야 합니다. 빈 문자열을 사용하여 구성 요소를 지우거나 제어되지 않는 구성 요소의 경우 "null" 대신 "undefined"를 사용하는 것이 좋습니다. data["abc"] === null ? null : data["abc"] -> data["abc"] === undefined ? undefined : data["abc]
미들웨어(Middleware) # 미들웨어에서는 "try ~ catch"가 제대로 작동하지 않는 문제를 발견했습니다. 아래는 비교 대상 입니다. # "try ~ catch"가 작동되지 않은 코드 try { if (empty(Auth::check()) || Auth::check() === "" || Auth::check() === null) { // 아래 코드가 작동되지 않아서 계속 "true" 값을 반환시키는 문제가 있음 throw new \Exception("토큰이 존재하지 않습니다."); } } catch (\Exception $error) { Auth::logout(); $this->verify = false; $this->message = ((bool) preg_match($this->match, $error->getMessage())) ? $error->getMessage() : "JwtAuthenticate handle Error"; $this->response = Res
HTTP 부하 분산 # NGINX의 HTTP 모듈인 업스트림을 사용하여 HTTP 서버를 통해 부하를 분산합니다. 아래 구성은 80포트에서 두 HTTP 서버의 부하를 분산합니다. "backup"은 "weight1, 2"를 사용할 수 없을때 사용됩니다. "weight2"로 설정하면 해당 서버에 두배 많은 요청을 전달하도록 설정됩니다. (기본값 "weight=1") upstream backend { server 10.10.12.45:80 weight=1; server app.example.com:80 weight=2; server spare.example.com:80 backup; } server { location / { proxy_pass http://backend; } } ※ HTTP 업스트림 모듈은 HTTP에 대한 부하 분산을 제어합니다. 이 모듈의 대상은 "Unix sockets, IP addresses, DNS records" 입니다. TCP 부하 분산 # 이번에는 NGINX의
스티키 쿠키(Sticky Cookie) # 고정 쿠키 지시문을 통하여 NGINX에 쿠리르 만들고 추적하도록 지시 할 수 있습니다. 다운스트림 클라이언트를 연결하는 쿠키를 생성하고 추적합니다. upstream backend { server backend1.example.com; server backend2.example.com; sticky cookie affinity expires=1h domain=.example.com httponly secure path=/; } 스티키 쿠키 학습 # 아래는 NGINX가 쿠키를 찾아 세션을 찾고 추적하도록 지시합니다. 응답 헤더에서 COUCIENAME이라는 이름을 지정하고 기존 세션을 찾아봅니다. 요청 헤더에 있는 동일한 쿠키에 대해서 이 세션 선호도는 공유에 저장됩니다. 약 16,000개의 세션을 추적할 수 있는 2MB의 메모리 영역입니다. 쿠키 이름은 항상 응용프로그램에 따라 다릅니다. 일반적으로 사용되는 쿠키 이름(예: jsessionid
A/B 테스트 # "backendv2"에 들어오는 트래픽을 20%을 분할하고 나머지 "backendv1"에서는 80%의 트래픽을 보냅니다. 이렇게 분할 함으로써 다양한 유형의 마케팅 및 프론트를 테스트 할때 유용합니다. 한번에 변경하기 어려운 경우 조금씩 비율로 조정하여 A/B 테스트 할때 좋습니다. split_clients "${remote_addr}AAA" $variant { 20.0% "backendv2"; * "backendv1"; } location / { proxy_pass http://$variant } # 정적 사이트로 사용 방법 http { split_clients "${remote_addr}" $site_root_folder { 33.3% "var/www/sitev2/"; * "var/www/sitev1/"; } server { listen 80 _; root $site_root_folder; location / { index index.html; } } } ※ 이
연결 제한 하기 # "limitbyaddr"이라는 공유 메모리 영역을 만들고, 크기는 10MB로 설정됩니다. 아래 40명까지만 접속이 되며 이외는 429(너무 많은 요청)으로 반환됩니다. http { limit_conn_zone $binary_remote_addr zone=limitbyaddr:10m; limit_conn_status 429; server { limit_conn limitbyaddr 40; } }
속도 제한하기 http { limit_req_zone $binary_remote_addr zone=limitbyaddr:10m rate=3r/s; limit_req_status 429; server { limit_req zone=limitbyaddr; } } # 2단계 속도 사용 server { location / { limit_req zone=limitbyaddr burst=12 delay=9; } } 대역폭 제한 # 다운로드 대역폭을 제한합니다. 10M 이후에 초당 1MB으로 제한됩니다. location /download/ { limit_rate_after 10m; limit_rate 1m; }
캐시 # 캐싱은 다시 제공할 요청 응답을 저장하여 콘텐츠 제공을 가속화 합니다. 서버 부하를 줄일 수 있으며, 더 적은 자원 및 전략적 위치에서 캐싱 서버의 확장 및 배포 사용자 경험에 큰 영향을 미칠 수 있습니다. 이 방법은 콘텐츠 전송 네트워크 또는 CDN의 패턴 입니다. proxy_cache_path /var/nginx/cache keys_zone=CACHE:60m levels=1:2 inactive=3h max_size=20g; proxy_cache CACHE; # 캐시 잠금 # 현재 캐시에 기록중인 요청을 프록시 막기 proxy_cache_lock on; proxy_cache_lock_age 10s; proxy_cache_lock_timeout 3s; 해시 키 캐시 # 콘텐츠가 캐시되고 검색되는 방식을 제어해야 합니다. proxy_cache_key "$host$request_uri $cookie_user"; 캐시 우회 # 때로는, 캐싱을 우회 할 수 있는 기능이 필요합니다.
환경 변수 추가 # 시스템 환경 변수 편집 -> path -> 새로만들기 -> "%systemroot%\System32\WindowsPowerShell\v1.0" 추가해주시면 됩니다. 참고 링크 error 0x80070002 when launching `powershell.exe' · Issue #6039 · microsoft/terminal Environment Windows build number: 10.0.18363.778 Windows Terminal version: 1.0.1401.0 Store/GitHub & 1.0.1402.0 Preview Steps to reproduce Open Windows Terminal or open new tab Windows PowerShe... github.com
리눅스 하위 시스템, 버추얼머신 사용 설정 .\dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart .\dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 리눅스 커널 업데이트 및 설치 Windows 10에 WSL(Linux용 Windows 하위 시스템) 설치 Bash 터미널을 사용하여 WSL(Ubuntu, Debian, SUSE, Kali, Fedora, Pengwin 및 Alpine 포함)을 Windows 10에 설치하는 방법에 대한 설치 가이드입니다. docs.microsoft.com 리눅스 커널 # 만약, X86이 아닌 ARM 기반의 경우는 "ARM64 패키지"를 대신 설치하셔야 합니다. 설치 후 재부팅 후 하단 명령을 통한 활성화 진행(관리자 권한으로 실행)
000-default.conf 수정하기 # "000-default.conf"를 수정하여 ".htaccess"를 활성화 합니다. </VirtualHost> 바로 위에 추가합니다. sudo vi /etc/apache2/sites-available/000-default.conf <Directory /경로> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted </Directory> # 아파치 재시작 sudo service apache2 restart ※ 만약, "Mod_Rewrite"가 활성화가 안되었다면 아래 추가로 진행해주세요. Mod_Rewrite 설치 # "Mod_Rewrite" 설치 sudo a2enmod rewrite # 아파치 재시작 sudo service apache2 restart
403 forbidden 해결하기 # 파일을 연후 아래 처럼 적용 sudo vi /etc/phpmyadmin/apache.conf <Directory /usr/share/phpmyadmin> Options Indexes FollowSymLinks MultiViews DirectoryIndex index.php AllowOverride all Require all granted # 아파치 재시작 sudo service apache2 restart
소켓 성능 벤치마킹 WSL1 WSL2 # "WSL2"가 압도적으로 빠릅니다. 긱벤치 벤치마킹 긱벤치 WSL2를 사용해본 장단점 후기 https://gmyankee.tistory.com/307 # WSL2는 SFTP + (Vmware + Docker Compose)보다 좀 빠르다 # WSL2는 개발을 하려면 /mnt/c로 잡아주는 경로가 아닌 다른 경로(예시, $HOME/)로 지정해서 해당 위치에서 해야 한다.(윈도 경로로 하면 실시간 바인딩을 포기해야 합니다. 반드시 WSL 경로로...) # WSL2는 docker, docker-compose, swarm, Kubernetes 사용이 가능하다! # WSL2는 SSH가 굉장히 불편하다 (재부팅할 때마다 IP가 바뀌어서 별도의 스크립트를 작성해서 포워딩해야 함) # WSL2를 사용하면 이제 Vm, Virtualbox 사용 가능하다 # WSL2는 아직도 안드로이드 게임용 에뮬레이터는 공존할 수 없다 # WSL2만 사용하면 Vmware에 더
Server public key has changed 오류 해결하기 # 기존에 남아있던 서버키를 제거해줘야 합니다. 아래 위치 이동 후 "known_hosts"를 백업해놓고 지워줍니다. 다시 워크벤치로 이동 후 다시 시도해주시면 정상적으로 등록됩니다. C:\Users\사용자\.ssh 참고 링크 Why MySQL Workbench shows connection error related to known_hosts? While connecting to database on remote server I got connection error related to known_hosts file. It did not ask me to update the known_host file but simply reject to connect. stackoverflow.com
한국어 플러그인 적용 Data Grip Data Grip # "File" -> "Settings" -> "Plugins" -> "korean" 검색 후 한국어 언어팩 설치
전체사진 액정 키보드 상판 앞면 뒷면 내부 윈도우 설치시 주의 laptops and netbooks :: lenovo v series laptops :: v15 g2 alc :: 82kd :: 82kd000ukr :: pf2qfcf3contentdetail - Lenovo Support KR V15 G2-ALC Laptop (Lenovo) - Type 82KD 시리얼 넘버 제품 감지 제품 변경 제품 홈 드라이버 및 소프트웨어 진단 기술 자료 및 가이드 보증 및 서비스 수리 상태 부품 액세서리 문의하기 더 보기 드라이버 및 소프트웨어 { "body": "Internal Error." } 수동 업데이트 자동 드라이버 업데이트 주문 복구 미디어 pcsupport.lenovo.com 레노버 V15 G2의 경우에는 윈도우 설치 후 자동으로 드라이버가 잡아지지 않습니다. 즉, 와이파이가 안되기 때문에 유선 랜 포트를 꽂아야 하는데 가능하면, 윈도우 USB에다가 레노버 드라이버도 같이 넣어서 설
램 업그레이드 써멀 재도포 써멀패드 교체 분해시 주의 하판 분해시에 사이드 측면을 이용해서 카드를 넣어서 분해해주세요. 내부 핀들이 부러지지 않게 천천히 작업하는게 중요합니다. 하판 케이스 내부 램 보호 케이스 램(메모리)를 추가로 장착하기 위해서는 램 보호 케이스를 제거해주시면 됩니다. 램 보호 케이스 제거 저기에 추가 램을 장착해주시면 됩니다. ※ 먼저 아래 보이는 배터리 선을 빼주세요. 합선이 되어 고장날 수 있습니다. 준비물 써멀, 써멀패드, 램 방열판을 미리 준비해놨습니다. 전에 쓰던거 남은건데요. SSD도 써멀패드로 방열해주면 좋습니다. 램 방열판과 써멀패드 SSD 써멀패드 기존 써멀패드는 너무 얆아서 뒷판 케이스쪽에 닿지 않아서 떼어내줍니다. 써멀패드 CPU CPU 방열판에 써멀구리스가 굳어 있네요. 바른지 시간이 좀 됬거나 저렴한 써멀구리스를 바르게 되면 빨리 마르게 됩니다. CPU 방열판 기존 써멀을 깨끗하게 닦아줍니다. 장착 이렇게 써멀구리스 재도포와 방열판 및 써
문자열 message = '안녕하세요.' print(message) >>> 안녕하세요. message2 = "반갑습니다." print(message2) >>> 반갑습니다. message3 = """ 안녕하세요. 반갑습니다. """ print(message3) >>> 안녕하세요. 반갑습니다.
리스트(배열) 리스트(배열) subway = [10, 20, 30] print(subway) >>> [10, 20, 30] subway = ["유재석", "조세호", "박명수"] print(subway) >>> ['유재석', '조세호', '박명수'] 특정 문자열 인덱스 찾기 print(subway.index("조세호")) >>> 1 "append" 뒤에 배열 추가 subway.append("하하") print(subway) >>> ['유재석', '조세호', '박명수', '하하'] "subway" 객체에 첫 번째 인덱스에 값을 넣는다. subway.insert(1, "정형돈") print(subway) >>> ['유재석', '정형돈', '조세호', '박명수', '하하'] "pop"은 뒤에서부터 출력 가능 print(subway.pop()) print(subway) >>> 하하 >>> ['유재석', '정형돈', '조세호', '박명수'] print(subway.pop()) print(su
레직스(Regex) 정규표현식이란? Regular Expression # "Regex"란 "Regular Expression"의 약자 입니다. 텍스트에서 특정한 패턴을 찾거나 변경할때 유용합니다. # 1950년 유명한 수학자 "Stephen Cole Kleene"에 의해서 개발이 되었습니다. 초기에는 유닉스, 리눅스 등에서 활용되다가 점차 자바스크립트 및 다른 언어에서도 사용이 가능합니다. 사용방법 # "/regex/옵션"으로 슬래시 사이에 두고 사용합니다. 뒤에 옵션은 플래그란 뜻으로 "g, i, m, s, u, y"가 있습니다. 플래그는 각자 다른 조건을 줄 수 있기 때문에 확실히 알고가야 좋습니다. EX) /abc/gi 약자 플래그 설명 g global 마지막 일치의 색인을 유지하여 이전 일치의 끝에서 후속 검색을 시작할 수 있습니다. 전역 플래그가 없으면 후속 검색에서 동일한 일치를 반환합니다. RegExr는 무한 일치 오류를 방지하기 위해 전역 플래그가 비활성화 된 경우에만
그룹 및 범위 Groups and ranges Chracter 설명 | 또는 () 그룹 [] 문자셋, 괄호안의 어떤 문자든 [^] 부정 문자셋, 괄호안의 어떤 문가 아닐때 (?:) 찾지만 기억하지는 않음 # "hi"와 "Hello"는 그룹1로 묶어주고, "And"는 그룹2로 묶이게 됩니다. 아래 처럼 할 경우 "Hi", "Hello", "And"라는 3가지 텍스트를 찾게 됩니다. /(Hi|Hello)|(And)/gm # gr로 시작하면서 (e|a) 있으며 y로 끝나는 텍스트를 찾을때 "()"는 그룹을 지정하게 됩니다. /gr(e|a)y/gm > gray # gr로 시작하면서 (e|a) 있으며 y로 끝나는 텍스트를 찾을때 단, 그룹을 지정하지 않고 싶을때 /gr(?:e|a)y/gm > gray # 대괄호를 이용하여 하나라도 만족하는 텍스트가 있을때 /gr[ea]y/gm > gray # "a-z" 방식으로 알파벳 a부터 z까지 만족하는 텍스트가 있을때 /gr[a-z]y/gm > gray
수량 관련 Quantifiers Chracter 설명 ? 없거나 있거나 (zero or one) * 없거나 있거나 많거나 (zero or more) + 하나 또는 많이 (one or more) {n} n번 반복 {min,} 최소 {min,max} 최소, 그리고 최대 # "?" 물음표를 통해서 없거나 있거나를 체크 /gra?y/gm > gray, gry # "*" 별표는 통해서 없거나 있거나를 많거나를 체크 /gra*y/gm > gray, gry, graay, graaay # "+" 플러스는 통해서 하나 또는 많이 플러스는 없는 경우가 제외되겠죠. /gra*y/gm > gray, graay, graaay # "{}" 중괄호는 통해서 몇번 반복 되는지 체크 아래는 a가 2번 나온 경우에만 해당 /gra{2}y/gm > graay # 또는, 최소와 최대를 지정 아래는 a가 최소 2개 최대 3개인 텍스트를 찾습니다. /gra{2,3}y/gm > graay, graaay # 또는, 최소만 지
GO 설치하기 Downloads - The Go Programming Language After downloading a binary release suitable for your system, please follow the installation instructions . If you are building from source, follow the source installation instructions . See the release history for more information about Go releases. As of Go 1.13, the go command by default downloads... golang.org VSCODE나 기타 에디터 등에서 빌드를 하기 위해서는 "GO"를 설치해야 됩니다. 별도의 세팅 없이 설치만 진행해 주면 됩니다. GO 설치확인 폴더명 설명 bin go에서 사용하는 명령어 저장 pkg go get 명령어로 다운로드한 패키지 저장
VSCODE 익스텐션 설치 VSCODE 위 이미지처럼 "go extension pack"을 검색하여 익스텐션 패키지를 설치해 주세요. VSCODE 설정하기 단축키 "CTRL + ,"을 하거나, 왼쪽 "메뉴 파일->기본설정->설정"으로 들어간 후 오른쪽 상단 "설정 열기(JSON)" 변경한 뒤에 아래 내용을 입력해 주세요. "[go]": { "editor.defaultFormatter": "golang.go", "editor.formatOnSave": false, }, "gopls": { "formatting.gofumpt": true, }, 참고 링크 Go with Visual Studio Code Learn about Visual Studio Code editor features (code completion, debugging, snippets, linting) for Go. code.visualstudio.com
아나콘다 설치 Anaconda | Individual Edition Anaconda's open-source Individual Edition is the easiest way to perform Python/R data science and machine learning on a single machine. www.anaconda.com # 설치 후 "Qt Designer"를 실행시키기 위해 아래 경로 이동 하여 "designer.exe" 실행 "C:\ProgramData\Anaconda3\Library\bin" ※ 가능하면 "시작화면 고정" 같은 부분으로 별도로 빼서 사용해도 좋습니다. 아나콘다 환경변수 추가 환경변수 CMD # "CMD"에서 사용하기 위해서 환경변수를 아래 처럼 추가해줍니다. 추가했다면, "CMD"에서 "conda"를 입력하면 관련 명령어가 나올겁니다. C:\ProgramData\Anaconda3 C:\ProgramData\Anaconda3\Scripts C:\
PyQt 설치하기 pyuic Riverbank Computing | Download PyQt Download If you have purchased a commercial license then please login to your account using the details sent to you at the time of purchase. PyQt6 PyQt6 is provided as a source distribution (sdist) and binary wheels from PyPI . The wheels will automatically install copies of the corresponding ... riverbankcomputing.com # "PyQt4," 버젼은 지원이 끝났기 때문에 "PyQt5", "PyQt6" 버젼을 설치해주세요. ※ "pyuic4" = "PyQt4" 파일 변환하기 # "CMD"에서 파일 경로와 확장자까지 입력하여 변환합니다. 예로 바탕화면
유저 조회 select user, host from user; 유저 생성 # "localhost"는 내부 접속 "%" 외부접속 허용 CREATE USER 'root'@'%' IDENTIFIED BY '비밀번호'; # 변경사항을 리로드하여 바로 적용 FLUSH PRIVILEGES; 유저 삭제 # 유저 삭제 DELETE FROM user WHERE user='USER_ID'; # 혹은 아래 방법 DROP USER 'root'@'%'; # 변경사항을 리로드하여 바로 적용 FLUSH PRIVILEGES; 비밀번호 변경 GRANT USAGE ON *.* TO 'root'@'%' IDENTIFIED BY '비밀번호'; # 변경사항을 리로드하여 바로 적용 FLUSH PRIVILEGES; 외부접속허용 # 모든 권한 부여 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '비밀번호'; # 변경사항을 리로드하여 바로 적용 FLUSH PRIVILEGES
관련 오류 qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. PyQt5 설치하기 # "venv" 환경에서 하면 좋습니다. pip install pyqt5 pip install pyqt5-tools 윈도우의 경우 환경변수 설정 환경변수 # 시스템 환경 변수에 추가 QT_QPA_PLATFORM_PLUGIN_PATH 경로...\venv\Lib\site-packages\PyQt5\Qt\plugins\platforms # 이후 컴퓨터 재부팅 후 디버그 하게 되면 정상적으로 될겁니다.
세션 남기기 # "크롬"을 실행 후 페이스북에서는 로그인 인증 문제가 발생되기 때문에 먼저 수동으로 로그인을 1회 진행하면 그 다음 크롬이 실행될때는 페이스북에 로그인 상태로 진행됩니다. import os dir_path = os.getcwd() profile = os.path.join(dir_path, "profile", "facebook") option = webdriver.ChromeOptions() option.add_argument(r"user-data-dir={}".format(profile)) ※ 참고로 리눅스에서 헤드레스로 실행한다고 해도 현재 방법으로 우회하거나 로그인을 시도하기 어려운 문제가 있어서 별도의 작업을 실행할 수 있는 프로그램화로 하는것을 추천 드립니다.
VENV로 디버깅 하기 VSCODE # "CTRL + `" 단축키로 터미널로 "CMD"로 연후 해당 디렉토리에서 "venv" 생성 python -m venv venv VSCODE VSCODE # "CTRL + SHIFT + P" 단축키로 "python: select Interpreter" 입력 후 "venv" 선택 이제 "venv" 환경에서 디버깅이 가능합니다. 관련 패키지 설치는 위와 동일하게 "CMD" 환경에서 하시면 됩니다.
사용자 모든 권한 부여 사용자 계정 사용자 계정 # "Ctrl + R" 이후 "netplwiz" 입력 후 위 사진 처럼 해당 계정 선택 후 속성 클릭 후 "그룹 등록"에서 관리자 부여 후 재부팅 VSCODE 관리자 모드로 실행 속성 # "C:\Users\사용자계정이름\AppData\Local\Programs\Microsoft VS Code" 와 같은 경로 이동 후 "VSCODE" 속성에서 "호환성" 탭에서 "관리자 권한으로 이 프로그램 실행" 체크 후 적용 "VSCODE" 실행 후 타이틀 오른쪽에 "[관리자]"라고 나오면 완료 CMD 터미널 권한 부여 cmd 속성 cmd 속성 cmd 속성 cmd 속성 # "C:\Windows\System32" 경로 이동 후 "cmd.exe" 파일 속성 "고급" 클릭 후 상단에 "소유자 변경" 클릭 하단에 사용자 계정 이름 입력 후 "이름 확인" 후 적용 다시 "보안" 항목에서 사용자 계정 선택 후 하단 "고급" 클릭 후 모든 권한 부여하기
VENV 환경에서 진행 # "venv" 환경 만들기 (이미 해당 한다면 패스) python -m venv venv # "venv" 환경 접속 source venv/bin/activate # "CMD" venv/Scripts/activate.bat # "CONDA" create -n venv python=3.8 conda activate venv 빌드하기 # "pyinstaller"으로 빌드 만약 없다면, 설치 pip install pyinstaller # ".spec" 파일이 만들어지면, "pathex", "binaries" 경로 설정 저의 환경은 "conda"이고 가상환경 "venv"를 만들었으니 아래 경로로 입력해주고 ".spec" 파일을 빌드해줍니다. 물론, "conda" 가상환경으로 진입해서 패키지들을 설치해줘야 합니다. pathex=['C:/ProgramData/Anaconda3/envs/venv'], binaries=[('C:/ProgramData/Anaconda3/env
윈도우 콘솔 막기 # ".spec" 파일에서 "[('v', None, 'OPTION')]," 부분을 추가하면 기존에 콘솔창을 열지 말라고 옵션을 줬던 부분이 적용됩니다. exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [('v', None, 'OPTION')], name='ShareFacebook', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False )
아이콘 적용하기 # ".spec"에서 데이터 추가 datas=[('...경로/favicon.ico', '.')], # 옵션에 "icon" 추가 exe = EXE(... console=False, icon='...경로/favicon.ico' )
타이틀바 아이콘(icon) 적용하기 # "QtGui" 추가 후 "QIcon"에는 풀 경로를 써준다. from PyQt5 import QtGui self.setWindowIcon(QtGui.QIcon("...경로/favicon.ico")) # ".spec" 파일에 "data" 경로 추가 datas=[('...경로/favicon.ico', '.')],
파일 수정하기 # 아래 링크로 이동하여 파일에 내용 수정 C:\Users\윈도우사용자계정이름\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2-streams\lib\sftp. # 388번 라인 수정 후 VSCODE 재시작 if (code === STATUS_CODE.OK) { -> if (code === STATUS_CODE.OK || code === STATUS_CODE.NO_SUCH_FILE) { 참고 링크 Visual Studio Code sftp Error 문제해결 - Error: No such file 어제 VScode 버전업을 했는데 (Version: 1.56.0) 파일 저장을 하면 바로 Error 팡!! 엉? 뭐지 다행이 ... blog.naver.com
7.4 설치하기 sudo apt update sudo apt -y install software-properties-common sudo add-apt-repository ppa:ondrej/php sudo apt update sudo apt install -y php7.4-cli php7.4-fpm php7.4-bcmath php7.4-bz2 php7.4-common php7.4-curl php7.4-dba php7.4-gd php7.4-json php7.4-mbstring php7.4-opcache php7.4-readline php7.4-soap php7.4-xml php7.4-xmlrpc php7.4-zip php7.4-ctype php7.4-pdo php7.4-redis php7.4-mysql php7.4-imagick php7.4-intl
function* expression function* [name]([param1[, param2[, ..., paramN]]]) { statements } name : 함수명. 생략하면, 익명 함수가 됩니다. 함수명은 함수내에만 한정됩니다. paramN : 함수에 전달되는 인수의 이름. 함수는 최대 255 개의 인수를 가질 수 있습니다. statements : 함수의 본체를 구성하는 구문들 예제 function* foo() { yield "비"; yield "킹"; } let str = ""; for (const val of foo()) { str = str + val; } console.log(str); -> 비킹 -------------------- function* foo() { yield 1; yield 2; yield 3; yield 4; yield 5; } let str = 0; for (const val of foo()) { str = str + val; } conso
yield yield 키워드는 제너레이터 함수 (function* 또는 레거시 generator 함수)를 중지하거나 재개하는데 사용됩니다. 예제 function* foo(){ var index = 0; while (index <= 2) // 인덱스가 3에 도달하면 yield은 true가 되고 그 값은 정의되지 않습니다. yield index++; } var iterator = foo(); console.log(iterator.next()); // { value: 0, done: false } console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: undefined, done: true } yield* yield* 표현식은 다른 generator 또는 이터러
Promise Promise 객체는 비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값을 나타냅니다. Promise의 작동 방식과 Promise 사용 방법에 대해 알아보려면 먼저 Promise 사용 방법을 읽어 보십시오. 속성 "Promise.length" : 값이 언제나 1인 길이 속성입니다. (생성자 인수의 수) "Promise.prototype" : Promise 생성자의 프로토타입을 나타냅니다. 메서드 "Promise.all(iterable)" : iterable 내의 모든 프로미스가 이행한 뒤 이행하고, 어떤 프로미스가 거부하면 즉시 거부하는 프로미스를 반환합니다. 반환된 프로미스가 이행하는 경우 iterable 내의 프로미스가 결정한 값을 모은 배열이 이행 값입니다. 반환된 프로미스가 거부하는 경우 iterable 내의 거부한 프로미스의 이유를 그대로 사용합니다. 이 메서드는 여러 프로미스의 결과를 모을 때 유용합니다. "Promise.race(iterable)"
객체 객체는 new Object(), Object.create(), 중괄호({})로 묶인 형태입니다. 예제 const object1 = { a: 'foo', b: 42, c: {} }; console.log(object1.a); -> foo const a = 'foo'; const b = 42; const c = {}; const object2 = { a: a, b: b, c: c }; console.log(object2.b); -> 42 const object3 = { a, b, c }; console.log(object3.a); -> foo
오류 해결하기 vscode # 위 사진 처럼 "vscode" 속성으로 들어가 호환성에서 "호환 모드" "이 프로그램을 실행할 호환 모드" 해제를 해주시면 됩니다.
CPython && RPython "CPython" C로 작성된 파이썬 구현체, 가장 널리 쓰임 인터프리터 & 컴파일러(파이썬 코드 -> 바이트코드 컴파일 & 한줄씩 번역하는 인터프리터 기능) "RPython" 파이썬의 부분 집합, PyPy 개발 위해 등장, 표준 파이썬과 다르게 정적 타입 사용 파이파이(PyPy) 기존의 파이썬은 생산성은 좋으나 성능이 낮았다. 이를 보완하기 위해서 나온것이 파이파이(PyPy) 입니다. JIT(just-in-time) 컴파일 사용하기 때문에, 속도가 더욱 빠르다.
append vs extend performance # "append"의 경우 작은 데이터일 경우 "extend"와 크게 성능차이가 나지 않는다. 다만, 데이터가 커질 수록 데이터양에 따라서 "extend"가 더 빠르다. 테스트 append extend # 여러번 테스트를 해봐도 "extend"가 더 빠르다. 참고 링크 Python List append() vs extend() | Finxter Python List append() vs extend() Python / By Chris A profound understanding of Python lists is fundamental to your Python education. Today, I wondered: what’s the difference between two of the most-frequently used list methods : append() vs. extend() ? I shot a small video exp
가변인자 def profile(name, age, *language): print("이름 : {0}\t나이 : {1}\t언어 :".format(name, age), end=" ") for lang in language: print(lang, end=" ") profile("홍길동", 20, "Python", "Java", "C", "C++", "C#") -> 이름 : 홍길동 나이 : 20 언어 : Python Java C C++ C#
표준입출력 print("Python", "Java") -> Python Java ---------- print("Python" + "Java") -> PythonJava ---------- print("Python", "Java", sep=",") -> Python,Java ---------- print("Python", "Java", "JavaScript", sep=" vs ") -> Python, Java, JavaScript ---------- print("Python", "Java", "JavaScript", sep=",", end="?") print("가나다라마바사") -> Python,Java?가나마다라마바사 "items()"를 사용하면 "Key", "Value"를 가져옴 "ljust"는 왼쪽 정렬, "rjust"는 오른쪽 정렬 scores = {"수학":0, "영어":50, "코딩":100} for subject, score in scores.items(): print(
다양한 출력포맷 빈 자리는 빈공간으로 두고, 오른쪽 정렬을 하되, 총 10자리 공간을 확보 print("{0: >10}".format(500)) -> 500 양수일 땐 + 표시, 음수는 -로 표시 print("{0: >+10}".format(500)) print("{0: >+10}".format(-500)) -> 500 +500 -500 왼쪽 정렬하고, 빈칸으로 _로 채움 print("{0:_<10}".format(500)) -> +500________ 3자리 마다 콤마 찍기 print("{0:,}".format(10000000)) print("{0:+,}".format(10000000)) print("{0:-,}".format(10000000)) -> 10,000,000 -> +10,000,000 -> -10,000,000 3자리 마다 콤마 찍고, 부호, 자릿수 확보, 빈자리 ^ print("{0:^<+30,}".format(10000000)) -> +10,000,000^^^^^^
with "with"를 통해서 간단하게 파일을 "입출력" 할 수 있다. with open("test.txt", "r", encoding="utf8") as file: print(file.read()) -> 테스트
클래스(상속) 다른 클래스를 상속 받을 수 있다. class profile: def __init__(self, name, age): self.name = name self.age = age class people(profile): def __init__(self, name, age, hobby): profile.__init__(self, name, age) self.hobby = hobby def introduce(self): print("이름 : {0} 나이 : {1} 취미 : {2}".format(self.name, self.age, self.hobby)) user = people("홍길동", 20, "축구") user.introduce() -> 이름 : 홍길동 나이 : 20 취미 : 축구 클래스(다중상속) class profile: def __init__(self, name, age): self.name = name self.age = age class career: def _
try-except-else-finally 코드 설명 try 에러 발생 가능성이 있는 코드 실행 except 에러 발생 시 (생략 가능, 여러개 사용 가능) else 에러가 발생하지 않았을 경우 실행 (생략 가능) finally 항상 실행 (생략 가능) name = 'Kim' try: if name == 'Lee': print('OK') else: raise ValueError except ValueError: print('Error!') except Exception as e: print(e) else: print('Completed!') 예외처리(try except) "except"는 여러번 사용이 가능 try: .... except SyntaxError: print("잘못된 문법") except NameError: print("참조변수 없음") except ZeroDivisionError: print("0으로 나눌 수 없음) except IndexError: print("인덱스
모듈 모듈은 다른 파이썬 파일에서 불러와서 사용할 수 있는 파일이라고 생각하면 된다. # "module1.py" 파일 def test(value) print("module1.py 파일을 불러와 호출한 값 : {0} 입니다.".format(value)) # main.py 파일 import module1 module1.test("테스트") -> module1.py 파일을 불러와 호출한 값 : 테스트 입니다. # 모듈명이 길때 대체 이름 import module1 as md1 md1.test("테스트") -> module1.py 파일을 불러와 호출한 값 : 테스트 입니다. # 모듈을 전체 불러오는 방법 from module1 import * test("테스트") -> module1.py 파일을 불러와 호출한 값 : 테스트 입니다. # 모듈에서 불러오고 싶은 함수만 불러올 경우 from module1 import test test("테스트") -> module1.py 파일을 불러와 호출한
.wslconfig 첨부파일 ___.wslconfig 파일 다운로드 "C:\Users\사용자이름" 폴더로 이동 후 ".wslconfig" 파일 생성 후 저장 후 WSL 재시작 ※ 혹은 다운로드 파일을 "C:\Users\사용자이름"에 넣어주시면 됩니다. [wsl2] processors=4 # 프로세스(CPU) 제한 memory=3GB # 메모리(RAM) 제한
완전삭제하기 sudo apt -y remove nginx sudo apt --purge -y remove nginx-* sudo apt purge -y nginx nginx-common sudo rm -rf /etc/nginx sudo apt -y autoremove
플러터 SDK 다운로드 Windows install How to install on Windows. flutter.dev # 위의 링크를 접속하여 "flutter_windows_2.2.3-stable.zip" 파일을 다운로드 받아주세요. 이후 "C:\Users\PC유저이름\Documents" 으로 이동 후 받은 압축을 풀어 해당 폴더에 넣어주신후에 안드로이드 스튜디오에서 플러터 SDK를 불러올때 경로를 지정해주시면 됩니다. 플러터 깃으로 받기 # "C:\src" 폴더를 생성하거나 특정 위치를 지정하여 "git clone"을 해주시면 됩니다. 그러면, 매번 다운로드 받을 필요없이 SDK를 교체할 수 있습니다. git clone https://github.com/flutter/flutter.git -b stable
타임아웃 늘리기 # "50-server.cnf" 파일을 연후 sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf # 하단쪽 아무곳에다가 타임아웃 값을 넣어줍니다. interactive_timeout = 31536000 wait_timeout = 31536000
구매처 레노버 V15 82C7007JKR 레노버 2020 V15 COUPANG www.coupang.com ※ 레퍼럴 링크 아님 내부 구조 내부구조 내장 4GB(2400) + 외장 슬롯 1개로 최대 20GB 램 확장이 가능합니다. 왼쪽 하단이 SSD 자리 입니다. 현재 사진에는 방열판을 끼웠었지만 커버가 잘 닫히지 않아 현재는 써멀패드만 붙여놓은 상태 입니다. 패널 이번에 구매한 노트북은 15.6인치인 레노버 V15 82C7007JKR 모델 입니다. 패널의 경우 TN이기 때문에 시야각이 좋지 않고 또렷하지 못합니다. 어르신들이 쓰시기에는 글자가 잘 보이지 않기 때문에 크게 추천드리지는 않습니다. 물론, 20 ~ 30대 분들에게도 장기간 사용은 추천하지 않습니다. 간단한 작업을 하기 때문에 크게 성능을 맞출 필요가 없다면 최소한 모니터라도 하나 장만하셔서 연결하셔서 사용하시는게 눈건강에 좋을것 같습니다. 마감 전에 구매했던 레노버의 경우도 마감은 좋았습니다. 이번 저가형 노트북도 가격
패키지 설치 # pip install wheel
uWSGI How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 20.04 | DigitalOcean In this guide, you will build a Python application using the Flask microframework on Ubuntu 20.04. The bulk of this article will be about how to set up the uWSGI application server and how to launch the application and configure Nginx to act as a fron www.digitalocean.com uWSGI를 이용하여 Nginx에 Flask 연결하기 Jihun's Development Blog cjh5414.github.io Ubuntu 16.04 Flask, django uwsgi 서비스 등록하기 Flask, django로 개발을 마친
SQL injection bobby-tables.com: A guide to preventing SQL injection in {currlang} Python Using the Python DB API , don't do this: # Do NOT do it this way. cmd = "update people set name='%s' where id='%s'" % (name, id) curs.execute(cmd) This builds a SQL string using Python's string formatting, but it creates an unsafe string that is then passed through to the database and execute... bobby-tables.com # 장고는 queryset(ORM)를 통해서 "SQL injection"을 방지할 수 있다. 하지만, 플라스크의 경우 "SQL injection"을 방지하기 위해서는 다른 방
유니온(Union) 타입 # 유니온 타입(Union Type)은 연산자(||)와 같이 'A' 이거나 'B'이다 라는 의미의 타입이다. 즉, 해당 타입은 Null 일 수도 있으면서 다를 수도 있다라는 뜻 입니다. 타입스크립트를 잘 활용하려면 타입을 "any"로 두지 마시고 명확한 타입을 적어줘야 합니다. function logText(text: string | number) { // ... } 인터섹션(Intersection) 타입 # 인터섹션 타입(Intersection Type)은 여러 타입을 모두 만족하는 하나의 타입을 의미한다. interface Person { name: string; age: number; } interface Developer { name: string; skill: number; } type Capt = Person & Developer; # "Capt"의 타입은 아래와 같이 됩니다. & 연산자를 이용해 여러 타입을 하나로 합치는 방식을 인터섹션 타입 정
메모리 오류 # 해당 오류는 관련 패키지(라이브러리) 문제일 가능성이 높기 때문에 기존 "venv" 삭제해주시고, 하나씩 패키지들 설치해보시면서 테스트 해야 합니다.
테이블 조회 SHOW TABLES; 테이블 생성 CREATE DATABASE 테이블 이름; 테이블 선택 USE 테이블 이름; 테이블 삭제 DROP TABLE 테이블 이름; 참고 링크 MySQL :: 테이블 생성 하기 create table - MySQL 입문 :: EVERDEVEL - 에버디벨 mysql의 테이블을 생성하는 방법, 필드를 삭제하는 방법, 필드를 추가하는 방법에 대해서 학습니다. www.everdevel.com
파이썬 기본 멀티프로세싱 종류 multiprocessing.Process(...) multiprocessing.Pool(...) # Pool 데이터의 양이 기하급수적으로 증가할 수록 결과 값은 많은 차이가 날 것으로 기대 됩니다. Pool은 데이터를 병렬화해서 함수의 결과를 좀 더 빠르게 응답받을 수 있는 장점이 있습니다. # Process Process는 쓰레드와 상당히 유사하며, 일련의 프로세스를 생성 후 작업하므로 시스템의 여러 프로세스의 자원을 충분히 활용할 수 있다는 장점이 있습니다. parmap # "paramap"은 위의 "Process"나 "Pool" 보다 더 나은 방법으로 쉽게 사용 할 수 있다고 하며, 진행바를 볼 수 있다고 한다. 더 자세한 부분은 다음에 다루도록 하겠습니다. # 현재 사용가능한 CPU 개수 파악 import multiprocessing num_cores = multiprocessing.cpu_count() data = [ .... ] def te
도커(Docker) 설치하기 # 도커 설치하기 한줄씩 실행 sudo apt -y install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" sudo apt update sudo apt -y install docker-ce # 도커 실행 확인 sudo service docker status 도커(Docker) 컨테이너 생성 Docker Hub Create a Docker ID. Already have an account? Sign In Send me occasional product updates an
FastAPI 패키지 설치 pip install fastapi pip install uvicorn[standard] FastAPI 베이스 셋팅 from fastapi import FastAPI from typing import Optional app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q} uvicorn 명령어 사용 # "uvicorn"의 "--reload" 옵션은 "hot reloading" 기능으로 소스 코드가 수정되면 서버를 재시작 한다. uvicorn main:app --reload 비동기 처리 방법 async await # 데이터베이스 조회나 I/O를 처리해야 하는 곳에 사용 @app
No module named 'pip._internal.cli.main' # 먼저, CMD 및 "window terminal"을 관리자 권한으로 실행 후 PIP 업데이트 python -m pip install --upgrade pip ----- # 위 방법이 안되면 "get-pip" 재설치 curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python3 get-pip.py --force-reinstall OR curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py ----- # 위 2가지 다 안될경우 프로젝트 내에 "venv" 폴더 지우고 인터셉터 다시 만들기
사양 cpu-z 오버클럭 Asrock Deskmini x300 CPU 전압 : 1.375 클럭: 4200Mhz ※ HWMonitor를 통하여 전압 피크치가 1.38 수준으로 나와서 1.375로 설정 ※ 전압 다이어트 안함 램(메모리) 클럭 3600(IF 1800) 타이밍 24 26 26 50 / 1T 전압 1.35 ※ 웬만하면 3600에 위 타이밍 정도는 그냥 들어갑니다. 온도 온도는 오버클럭 전에 조금 더 낮기는 하지만 크게 차이가 없습니다. 평균 60 ~ 65도 수준 물론 저의 PC는 게임용이 아닌 작업용이고 다중 멀티작업을 하는 수준이고 영상편집 같은 무거운 프로그램을 돌리지는 않습니다. 아참! 에어컨 환경 입니다. 실내 평균 24도 수준 정도 써멀구리스는 MX-5 재도포 해주었습니다. 현재 4.2 클럭에서 70도를 이상 올라간적이 없는것을 보아 크게 문제는 없어 보입니다. ※ 쿨러는 라이젠 기본 쿨러 사용했습니다. 위 뚜겅을 제거하면 케이스 안으로 들어가집니다. 체감 우선은
깃 설정 초기화 git config --local --unset credential.helper git config --global --unset credential.helper sudo git config --system --unset credential.helper 깃 계정 입력시 비밀번호 [Git] 토큰 인증 로그인 - remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. 8월 13일 부로 push, clone, pull 시 비밀번호 대신 토큰을 사용하게 변경됨. Personal access token 이용 로그인 방법 정리. 1. https://github.com/ 접속 + 로그인 2. 우측 상단 Profile 클릭 후 Settings 클릭.. firstquarter.tistory.com # "비밀번호" 대신 생성한
깃 설정 초기화 git config --local --unset credential.helper git config --global --unset credential.helper sudo git config --system --unset credential.helper 깃 세션 저장하기 # "pull/push" 전 입력 후 진행 git config --global credential.helper cache
다트(Dart) 소개 1. 구글이 2011년 웹 프론트엔드 개발을 위해 만든 언어 2. 객체 지향이면서 C언어와 유사한 문법 3. 선택적 타입(optional type) 4. 메모리를 공유하는 thread 대신 독립 메모리를 갖는 isolate를 사용 5. 자바스크립트와 호환 6. 코드 변경시 실행 중인 앱에 즉시 결과를 보여주는 "hot reload"를 통한 생산성 높음 7. AOT 컴파일로 네이티브 코드를 생성하여 높은 속도 기본 문법 1. import - 패키지 내의 라이브러리를 사용하고자 할 때 라이브러리를 가져오기 위해 사용 2. // - 주석처리 3. 함수 선언 - a, b는 모두 타입이 "Integer" add(int a, int b) { return a+b } 4. main() 함수 - 앱 실행을 시작하는 최상위 함수 5. 변수 선언은 var - 타입이 없는 형태로 해당 변수가 참조하는 타입에 따라 결정 6. 콘솔 출력은 print() - 변수를 넣기 위해서는 자바스크
상수 상수 설명 final 런타임 시점에 상수화 const 컴파일 시점에 상수화 # 아래 코드는 문제 없이 작동한다. main() { final int NUMBER = 1; const int PRICE = 1000; final NAME = "KIM"; const COLOR = "RED"; print("NUMBER : $NUMBER"); print("PRICE : $PRICE"); print("NAME : $NAME"); print("COLOR : $COLOR"); } # 하지만, 아래의 경우에는 "final"은 런타임 시점에 "get()"을 가져오기 때문에 오류가 나지 않지만, "const"의 경우에는 컴파일 시점에 "get()"을 가져오려고 하니 가져 올 수 없기 때문에 오류가 난다. 즉, 컴파일 시점에는 "get()"이라는 함수가 정의되지 않았고 가져올려고 하기 때문에 오류가 나는것이다. 더 쉽게 말하면 렌더링 전에 선언되지 않는 함수에 값을 가져올려고 하면 오류가 나는것과 동일
변수가 함수를 참조 가능 getName() { // 함수 return "홍길동"; } main() { var name = getName(); // 변수가 함수를 참조 } ※ 객체 지향이기 때문에 자바스크립트 처럼 가능하다. 다른 함수의 인자로 함수 전달 가능 int test1(int a, int b) { return a + b; } int test2(int a, int b) { return a - b; } int total(int a, int b) { return a * b; } main() { int a = 10; int b = 5; print("${a + b} * ${a - b} = ${total(test1(a, b), test2(a, b))}"); } 이름 있는 선택 매개변수 String getAddress(String City, {String district, String zipCode = "123456"}) { return "$city시 $district구 $zipCode"
산술 연산자 연산자 설명 + 더하기 - 빼기 * 곱하기 / 나누기 ~/ 몫 구하기 % 나머지 값 ++ 현재 값에서 1 더하기 -- 현재 값에서 1 빼기 할당 연산자 연산자 설명 = 현재 값 할당 += 현재 값에서 1 더하기 -= 현재 값에서 1 빼기 *= 현재 값에서 1 빼기 /= ~/= 관계 연산자 연산자 설명 == 같다 ~= > 보다 크다(초과) < 보다 작다(미만) >= 크거나 같다(이상) <= 작거나 같다(이하) 비트 & 시프트 연산자 연산자 설명 & AND | OR ^ XOR (XOR 연산은 입력값이 같지 않으면 1을 출력합니다. 이는 두 입력 중 하나만이 배타적으로 참일 경우에만 일어납니다) ~ NOT << 시프트 값을 한칸 옮김 >> 시프트 값을 한칸 옮김 타입 검사 연산자 연산자 설명 as 다른 타입으로 변환은 되지 않고 상위 타입으로 변환할 수 있다. is 특정 객체가 특정 타입이면 true이다. is! 특정 타입이면 false, 즉 특정 타입이 아니면 true이다.
조건문 # if, if~else if (조건) { ... } if (조건) { ... } else { ... } --------- # switch switch(변수) { case 값1: ... break; case 값2: ... break; default: ... } --------- # assert(debug mode에서만 동작) 조건식이 거짓이면 에러 발생 main() { int a = 10; int b = 20; assert(a > b); // 거짓이므로 디버깅 모드에서 오류 발생 } 반복문 # for for (int i = 1; i < 5; i++) { ... } ---------- # while int a = 0; while(a < 5) { ... a++; } ---------- # do ~ while int a = 0; do { ... } while (a > 0);
객체, 멤버, 인스턴스 # 클래스 기본 형태 class Person { String name; getName() { return name; } } ----- # 다른 예제 class Person { String name; int age; getName() { return name; } } main() { var student = new Person(); // new 키워드를 넣어도 되고 생략해도 된다. var teacher = Person(); // new 키워드를 넣어도 되고 생략해도 된다. student = "Kim"; teacher = "Park"; } ※ 클래스를 사용하기 위해서는 객체를 생성해야 한다. C++이나 자바에서는 객체 생성 시 new 키워드를 사용한다. 하지만 플러터는 기본적으로 생략한다. 사용하고 싶으면 사용할 수도 있다.
기본 생성자 # 클래스를 구현할 때 생성자를 선언하지 않으면 기본 생성자가 자동으로 제공된다. 기본 생성자는 클래스명과 동일하면서 인자가 없다. 또한 기본 생성자는 부모 클래스의 인수가 없는 생성자를 호출한다. class Person { Person() { ... } } # 예제 아래와 같이 상속하지만 기본 생성자가 있기 때문에 해당 기본 생성자가 호출되는 모습이다. class Person { Person() { print("This is Person Constructor!"); } } class Student extends Person { } main() { var student = Student(); } -> This is Person Constructor! ※ 기본 생성자는 상속되지 않는다. 자식 클래스는 부모 클래스의 생성자를 상속받지 않는다. 앞서 말한 것처럼 자식 클래스에서 아무 생성자도 선언하지 않으면 기본 생성자만 갖는다. 이름 있는 생성자 # 이름이 있는 생성자를 부
상속 class Parent { String name; String getType() { .... } } class Child extends Parent { @override // 메소드 오버라이딩을 통한 부모의 getType() 함수를 자식의 getType() 함수로 덮어씌움 String getType() { ... } } # 예제 class Person { String name; setName(String name) { this.name = name; } getName() { return name; } showInfo() { print("name is $name"); } } class Student extends Person { int studentID; @override showInfo() { print("name is ${super.getName()} and id is $studentID."); } } main() { Student student = Student(); ...
캡슐화 # 객체를 만드는게 캡슐화 class Developer { String name; int age; eat() { print('eat'); } // 캡슐화 sleep() { print('sleep'); } // 캡슐화 coding() { print('This is not bug. It's just feature.'); } // 캡슐화 } 추상화 # 공통된 데이터와 메서드를 묶어서 이름(클래스명)을 부여 하는 것 즉, 사람을 표현할때 성별이 있고, 직업도 있고, 취미도 있을것이다. 이것의 공통적으로 갖는 데이터와 행동을 떠올려 만드는것이 추상화이다. class Person { String name; int age; eat() { } sleep() { } } 접근 지정자 # 기본적으로 "public"으로 접근가능하지만, "private"으로 동일 클래스에서만 접근 가능하게 가능하다. "private"로 선언할때는 앞에 "_" 밑줄 하나 넣어주면 된다. class Person { S
게터(Getter), 세터(Setter) # private 멤버 변수인 _name에는 직접 접근이 불가능하지만 public인 getter를 통해서 접근 가능하다. 이때 get name에서 name이 접근할 때 사용할 이름이다. set도 get과 마찬가지로 public이라 _name에 값을 할당하기 위해 접근 가능하며 set name에서 name은 접근할 때 사용되는 이름이다. class Person { String _name; String get name => _name; // 이름 가져오기 set name(String name) => _name = name; // 이름 변경하기 } main() { Person person = Person(); ...name = "Kim"; print(person.name"); } -> Kim
추상 클래스 # 메서드 선언은 되어 있지만 바디가 정의되지 않은 형태 추상 클래스는 앞에 "abstract" 키워드를 붙여서 표현 추상 클래스는 미완성 클래스이기 때문에 객체를 생성할 수 없다. 하지만 참조형 변수의 타입으로는 사용이 가능하다. 추상 클래스를 사용하기 위해서는 일반 클래스에서 implements 키워드로 임플리먼트 한 후에 반드시 추상 메서드를 오버라이딩 해야 한다. # 예제 abstract class Person { eat(); } # Developer 클래스는 추상 클래스인 Person를 임플리먼트(implements) 했다. 이때 반드시 추상 클래스 Person의 추상 메서드인 eat()를 오버라이딩(@override) 해야 한다. 꼭 다른 기능으로 사용하기 위한 재정의가 아니더라도 반드시 Developer 클래스 내에 선언되어 있어야 한다. class Developer implements Person { @override eat() { print("Eat");
List(Array) 프로퍼티 설명 indexOf(요소) 요소의 인덱스 값 add(데이터) 데이터 추가 addAll([데이터1, 데이터2]) 여러 데이터 추가 remove(요소) 요소 삭제 removeAt(인덱스) 지정한 인덱스 삭제 contains(요소) 요소가 포함되어 있으면 true, 아니면 false clear() 리스트 요소 전체 삭제 sort() 리스트 요소 정렬 first 리스트 첫번째 요소 last 리스트 마지막 요소 reversed 리스트 역순 isNotEmpty 리스트가 비어있지 않으면 true, 비었으면 false isEmpty 리스트가 비어있지 않으면 false, 비었으면 true single 리스트에 단 1개의 요소만 있다면 해당 요소 리턴 List<String> colors = ['Red', 'Orange', 'Yellow']; OR List<String> colors = List(); colors.add('Red'); colors.add('Orange');
타입 매개변수 # 제네릭은 타입 매개변수를 통해 다양한 타입에 대한 유연한 대처를 가능하게 한다. 사실 앞서 봤던 컬렉션에서 이미 제네릭을 사용했다. "List", "Set", "Map" 모두에서 <>를 사용했는데 그 부분에 타입 매개변수(Type parameter)를 지정한다. 이렇게 <>에 타입 매개변수를 선언하는 것을 매개변수화 타입(Parameterized type)을 정의한다고 한다. # List 예제 <E>가 존재하기 때문에 타입 매개변수를 사용할 수 있다는 것을 알 수 있다. abstract class List<E> implements EfficientLengthIterable<E> { ... void add(E value); ... } class Person { eat() { print("Person eat"); } } class Student extends Person { eat() { print("Student eat"); } } class Manager<T ext
플러터 SDK 깃 클론 및 다운로드 [Flutter] 플러터 SDK 깃 클론 및 다운로드 플러터 SDK 다운로드 플러터 깃으로 받기 blog.naver.com 플러터 검사하기 cmd # 도스창을 연후 "flutter doctor" 입력 "Android toolchain" 문제 발생시 하단에 "flutter doctor --android-licenses" 입력 cmd android studio # 위와 같은 오류 발생시 안드로이드 SDK 구성요소 중 안드로이드 SDK 커맨드라인 도구 (Android SDK Command-line Tools)가 설치되어 있지 않을때 발생 안드로이드 스튜디오에서 아래와 같이 설치 Appearance & Behavior > System Settings > Android SDK > Android SDK Command-line Tools 설치 cmd # "flutter doctor --android-licenses" 입력 후 라이센스 모두 동의(Y)
안드로이드 설치 경로 설정하기 # cmd 창에서 아래 명령어 실행 flutter config --android-studio-dir="C:\Program Files\Android\Android Studio" # 검사 확인하기 flutter doctor
PyQt5 재설치 # 기존 패키지 삭제 pip uninstall PyQt5 pip uninstall PyQtWebEngine # 패키지 재설치 pip install PyQt5==5.12.2 pip install PyQtWebEngine
VSCODE 플러터 추천 익스텐션 Pubspec Assist # Pubspec Assist 플러터에서 패키지를 검색하여 패키지 매니저 및 pubspec.yaml에 추가할 수 있습니다. 또한 이름을 쉼표로 구분하여 여러 패키지를 동시에 검색할 수 있습니다. Error Lens # Error Lens 오류 및 경고는 개발 중에는 정상이지만 처리하는 데 사용하는 방법은 고유합니다. VS Code 편집기에서 오류 및 경고는 일반적으로 맨 아래에 표시되며 목록을 스크롤하여 추가 문제가 있는지 확인해야 합니다. Error Lens 확장은 코드의 오류 라인을 강조 표시하고 라인 끝에 오류 세부 정보를 추가합니다. 여백에 오류 아이콘도 표시됩니다. 또한 settings.json 파일에서 오류 강조 표시의 색상을 사용자 지정할 수 있습니다. 이렇게 하면 실수가 더 매력적으로 보일 것입니다. Flutter Tree # Flutter Tree 많은 수의 위젯으로 애플리케이션을 구성할 때 트리에서 위젯을
오류 해결하기 # 우선 아래의 문제는 빌드를 하려고 하는데 기존 빌드 파일을 삭제하지 못한것이기 때문에 여러가지 문제일 수 있습니다. 권한(퍼미션) 문제 등등 아무튼 현재 프로젝트 디렉토리에 build 폴더를 삭제해주시면 됩니다. # 추가로 플러터 검사도 해보시면 좋습니다. flutter doctor flutter doctor -v
편집기 키 바인딩 단축키 설명 CTRL + T (CMD + T) 작업 공간 기호 표시 CTRL + SHIFT + O (CMD + SHIFT + O) 문서 기호 표시 CTRL + SHIFT + P (CMD + SHIFT + P) 명령 팔레트 열기 CTRL + SPACE 오픈 코드 완성 CTRL + . (CMD + .) 빠른 수정 열기 SHIFT + ALT + F (CMD + SHIFT + F) 문서 서식 지정 ALT + SHIFT + O 지시문 구성 SHIFT + F12 참조 찾기 F2 기호 이름 바꾸기 F4 유형 계층 표시 F12 정의로 이동 디버그 키 바인딩 단축키 설명 CTRL + ALT + D Dart DevTools 시작 F5 디버깅 시작 CTRL + F5 디버깅하지 않고 시작 SHIFT + F5 디버깅 중지 CTRL + SHIFT + F5 (CMD + SHIFT + F5) 디버깅 다시 시작(또는 Flutter 앱을 디버깅할 때 Hot Restart) CTRL + F5 Flu
앱의 성능을 향상시키는 방법 # Fluter 애플리케이션의 성능을 개선할 수 있는 방법과 관련된 많은 의문과 질문이 있습니다. Fluter는 기본적으로 성능이 우수하지만, 애플리케이션을 훌륭하고 빠르게 실행하기 위해서는 코드를 작성할 때 몇 가지 실수를 피해야 합니다. 이러한 팁으로 프로파일링 도구의 사용을 피할 수 있습니다. 위젯을 메서드로 분할하지 않음 class MyHomePage extends StatelessWidget { Widget _buildHeaderWidget() { final size = 40.0; return Padding( padding: const EdgeInsets.all(8.0), child: CircleAvatar( backgroundColor: Colors.grey[700], child: FlutterLogo( size: size, ), radius: size, ), ); } Widget _buildMainWidget(BuildContext conte
체크리스트 확인 # 내용이 길기 때문에 하단 참고링크로 확인해주세요. Google Play | Android Developers 이 체크리스트를 통해 앱이나 게임을 출시하는 데 필요한 모든 단계를 완료했는지 확인하세요. developer.android.com 안드로이드 개발자 계정 결제하기 Google Play Developer Console One account. All of Google. Sign in to continue to Google Play Developer Console Find my account Create account One Google Account for everything Google play.google.com 구글 개발자 계정 생성 구글 개발자 계정 결제 화면 구글 개발자 계정 가입 완료 화면 # 위 링크로 접속하여 정보 입력 후 결제를 하면 개발자 계정이 생성됩니다. 보충 예정...
AndroidManifest.xml 수정하기 # "android/app/src/main/AndroidManifest.xml" 에서 "android:usesCleartextTraffic" 값을 "true" 변경 및 없으면 추가 ... <application android:label="앱 이름" android:usesCleartextTraffic="true" android:icon="@mipmap/ic_launcher"> ... network_secure_config.xml 만들기 # "android/app/src/main/res" 위치에서 "xml" 폴더를 만든 후 "network_secure_config.xml" 파일을 만들어 아래의 내용을 넣어주세요. <?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeS
앱 아이콘 변경 App Icon Generator Generate icons and images for mobile apps, android and iOS. No need to upload or download. Works on your browser appicon.co 출력 후 다운로드 파일 # 상단 앱 아이콘 제네레이터에서 이미지 파일을 업로드하면, 출력할 OS에 맞춰서 파일이 자동으로 생성되어 다운로드 할 수 있습니다. 앱 아이콘 적용 안드로이드 "android\app\src\main\res" 안에 폴더 덮어씌우기 IOS "ios\Runner\Assets.xcassets" 경로 안에 "AppIcon.appiconset" 폴더 덮어씌우기
JDK 설치 및 환경변수 Download the Latest Java LTS Free Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts. www.oracle.com # 우선, 도스창(커맨드라인)에서 "keytool"을 찾을 수 없거나 명령이 되지 않으면 "JDK"를 설치해주시면 됩니다. 시스템 환경 변수 # 시스템 환경 변수로 들어가서 설치한 "JDK"를 설치해줍니다. 버젼은 다를겁니다. 현재 기준으로는 16 이었습니다. 이제 "keytool" 명령을 사용할 수 있습니다. OpenSSL 설치 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions Win32/Win64 OpenSSL The Win32/Win64 OpenSSL Installation Project
기본 패키지 설치 # 도커로 우분투 컨테이너를 만들게 되면, 아무것도 설치되어있지 않아서 귀찮은게 한두가지가 아닙니다. 아래 명령어로 기본 패키지를 설치해줍니다. apt update; apt upgrade -y; apt install -y vim curl ssh wget htop iputils-ping net-tools python3 curl git
오류 해결하기 sudo chown root:docker /var/run/docker.sock # 위 명령어로 권한을 부여한뒤 로그인 재시도 sudo docker login 참고링크 docker 설치 후 /var/run/docker.sock의 permission denied 발생하는 경우 · Issue #116 · occidere/TIL docker 설치 후 /var/run/docker.sock의 permission denied 발생하는 경우 상황 docker 설치 후 usermod로 사용자를 docker 그룹에 추가까지 완료 후 터미널 재접속까지 했으나 permission denied 발생 (설치 참고: https://blog.naver.com/occidere/221390946271... github.com
데이터 수정시 자동으로 타임스탬프 업데이트 # MariaDB 컬럼 생성시 TYPE에 timestamp on UPDATE current_timestamp 디폴트 값 "CURRENT_TIMESTAMP" # MySQL 컬럼 색성시 TYPE은 timestamp 디폴트 값 "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
해결방법 # 강제 재설치 pip3 install -U --force-reinstall pip # 강제 재설치가 안될 경우 ex) c:\users\user\appdata\local\programs\python\python37\python.exe -m pip install -U --force-reinstall pip # "No module named 'pip'" 오류가 난다면, 업그레이드시 삭제 후 엑세스가 거부되서 재설치가 되지 않은것으로 "pip"를 다시 설치해주면 된다. curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py 참고링크 Windows 에서 pip 업그레이드 시 엑세스 거부 에러 해결법 · Issue #124 · occidere/TIL Windows 에서 pip 업그레이드 시 엑세스 거부 에러 해결법 증상 python 3.7.6 설치 후 pip3 install --upgrade pip 수행 시
패키지 설치 # uvicorn 설치 pip install uvicorn uvicorn 실행 옵션 설명 main main.py와 같은 파이썬 파일을 의미합니다. 만약, 다른 폴더 구성인 경우에는 src.main:app으로 실행하면 됩니다. app main.py 파일 안에 있는 app = FastAPI()을 의미합니다. --reload 핫리로드 --host 전체 접근 0.0.0.0 --port 포트 설정 --log-level 로그 레벨 설정 uvicorn main:app --reload --host=0.0.0.0 --port=8000 참고링크 FastAPI + uvicorn 구성 FastAPI는 표준 Python 유형 힌트를 기반으로 Python 3.6 이상으로 API를 빌드하기위한 최신의 빠른 (고성능) 웹 프레임 워크입니다. 기존 Flask 보다 빨라 AI관련 설치해보자. FastAPI 공식 사이.. sncap.tistory.com
설정 변경하기 Pycharm Settings # 파이참 설정 변경하여 "Typo: In word"를 끌 수 있습니다. "File" -> "Settings" -> "Editor" -> "Inspections" -> "Type 검색 후 체크 해제"
포트 추가로 열기 # 우선은 실행중인 컨테이너를 중단하고, "commit" 하고 다시 생성해야 합니다. sudo docker stop 컨테이너 sudo docker commit 기존이름 새로운이름 EX) sudo docker commit test new_test # 생성된 이미지 확인 sudo docker images # 생성된 이미지로 추가 포트 개방 후 실행 sudo docker run -d -p 80:80 -p 443:443 -itd --name 컨테이너이름 이미지이름 EX) sudo docker run -d -p 80:80 -p 443:443 -itd --name backend new_test 참고링크 실행중인 도커 컨테이너에 추가 포트 오픈하기?! 아쉽지만 docker는 실행중인 컨테이너에 실시간으로 포트를 오픈하는 기능을 제공하지는 않는다. 아래와 같은 방법들로 다시 시작해야 한다. 1. 컨테이너의 변경 사항이 없다면.. stop 후 docker run에 -p 옵션을..
CoreUI Free Bootstrap Admin Templates · CoreUI Time is our most valuable asset, that’s why we want to help you save it by creating simple, customizable, easy to learn UI components and Admin Templates which significantly cut development time. CoreUI lets you save thousands of priceless hours because it offers everything you need to create modern... coreui.io # 평가 디자인 활용성 문서 # 기타 CoreUI를 3.4 버젼 이전 부터 사용해봤으나, 솔직히 디자인은 별로입니다. 하지만, 확장성이 용이하고 커스텀하기 좋습니다. 문서도 잘 되어있어 좋습니다. 다만, CoreUI에서 예로들어 3.2 버젼을
default.conf # "nginx"에 있는 "default.conf"를 수정합니다. "location ~ .(static)/(js|css|media)/(.+)$" 부분을 추가해주시면 됩니다. server { listen 80; server_name localhost; root /root/react-frontend/build; index index.html index.htm; location ~ .(static)/(js|css|media)/(.+)$ { try_files $uri $uri/ /$1/$2/$3; } location / { try_files $uri $uri/ /index.html; } } React Route에서 걸리는 경우 # 리엑트 라우터에서 경로로 잡히는 경우에는 라우터 안에서 전체 경로로 들어온것을 살펴보시고 수정하시면 됩니다.
URL 하위 경로 path 같이 보내기 # "default.conf" 파일 수정 server { listen 80; server_name localhost; # 아래 처럼 URL 경로가 "/api" 시작하는 경우 프록시 패스를 하면서 URL에 따라오는 "/api/v1/signin" 이런 하위 경로까지 같이 전달합니다. location /api/ { rewrite ^/api(/.*)$ $1 break; proxy_pass http://localhost; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; } }
옵션 추가 # "stdin_open", "tty" 옵션을 추가하여 "BASH"로 접근하게 해줌 client: build: context: ./client container_name: client restart: "on-failure" expose: - 3000 volumes: - './client:/app' - '/app/node_modules' environment: - NODE_ENV=development - CHOKIDAR_USEPOLLING=true stdin_open: true tty: true 참고링크 React docker exited with code 0 react를 docker-compose로 구성하기 라는 글을 준비하고 있는데 갑자기.. 예전에 문제 없던 react container가 죽더군요. container의 로그를 보면 아래와 같은데 뭐가 문제 인지 전혀 예측할 수 없었습니다. medium.com
도커 컴포즈 설치 # 필요한 패키지 미리 설치 sudo apt install apt-transport-https ca-certificates curl software-properties-common # 도커 컴포즈 설치 sudo curl -L https://github.com/docker/compose/releases/download/v2.1.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 권한 수정 sudo chmod +x /usr/local/bin/docker-compose # 버젼 확인 sudo docker-compose --version # 도커 사용 설정 sudo usermod -aG docker $USER 참고링크 [Ubuntu] docker / docker-compose 설치 우분투 18.04.3 LTS 기준 작성입니다. vmware위의 우분투위에 일종의 vm인 도커를 깔다니 ㅎㅎ 1.
docker-compose.yml # "docker-compose"는 여러가지 컨테이너를 한번에 묶어서 실행가능하게 해줍니다. 또한, 브릿지라는 단어로 하나의 컴포즈안에 여러 컨테이너가 있어 내부 네트워킹을 하게 해줍니다. # "docker-compose.yml"을 기본적으로 리눅스 "root" 및 사용자 폴더에 만들어 주시면 됩니다. sudo vi docker-compose.yml # 하단 내용을 넣어 저장한다. 단, 띄어쓰기로 인식하기 때문에 잘 맞춰줘야 합니다. 그리고 버젼마다 옵션이 다르기 때문에 미리 확인해보셔야 합니다. version: "3" services: 실행컨테이너이름: image: 이미지이름:태그 build: # "Build"할때 현재 디렉토리 context: . ports: - "80:80" - "443:443" # 포트 추가시 networks: - 네트워크이름 # 브릿지 : 컴포즈 안에 여러 컨테이너가 맞물리며 사용할 네트워크 이름 # Example "stdi
docker-compose.yml # 아래 옵션을 추가로 넣어주면 된다. environment: TZ: "Asia/Seoul"
타임존 변경 # "MySQL" 내부로 접속 sudo mysql -u root -p # 타임존 확인 select @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 1 row in set (0.00 sec) -------------------- # 타임존 변경 (한개씩 실행) SET GLOBAL time_zone='Asia/Seoul'; SET time_zone='Asia/Seoul'; +--------------------+---------------------+ | @@global.time_zone | @@s
오류 해결하기 # 기존 "include proxy_params;" 내용을 아래와 같이 수정 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 예제 server { server_name localhost; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8000; } }
SSHTUNNEL # 서버 포트가 다른 경우에 SSH 터널링을 통하여 별도로 접속해줘야 한다. from sshtunnel import SSHTunnelForwarder from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 서버 포트가 달라서 별도의 SSH 터널링을 사용하여 접근 server = SSHTunnelForwarder( ("서버 아이피", 포트), ssh_username="서버 아이디", ssh_password="서버 비밀번호", remote_bind_address=("127.0.0.1", 3306) # 바인딩될 데이터베이스 포트 ) server.start() local_port = str(server.local_bind_port) # SQLALCHEMY_DATABASE_URL = "mys
도커 명령어 # 기본 할당 비율 docker run -d --name cpu_1024 --cpu-shares 1024 ubuntu # 기본 할당 비율 두배 docker run -d --name cpu_1024 --cpu-shares 2048 ubuntu # cpu 1개만 사용하도록 변경 docker update --cpuset-cpus=1 [container_name] # cpu 사용량을 0.5 비율로 사용하도록 변경 docker update --cpu-shares 512 [container_name] # cpu 사용량을 20% 비율로 사용하도록 변경 docker update --cpus=0.2 [container_name] CPU 스트레스 테스트 CPU STRESS TEST # 컨테이너 내부로 접속 apt-get update apt-get install stress stress -c [CPU개수] 참고사항 [Docker] Container CPU 제한 docker run --it
도커 볼륨 만들기 # 볼륨 생성 sudo docker volume create [볼륨이름] # 볼륨 삭제 sudo docker volume rm [볼륨이름] # 볼륨 확인 sudo docker volume ls 도커 볼륨 마운트 sudo docker inspect backend # 도커에서 만든 별도의 볼륨을 컨테이너에 적용 -v [볼륨이름]:/[컨테이너 내부 경로] EX) gunicorn -k uvicorn.workers.UvicornWorker --access-logfile ./gunicorn-access.log src.main:app --bind 0.0.0.0:8001 -v [볼륨이름]:/root/data --workers 4 --daemon # 컨테이너 볼륨 마운트 확인 sudo docker inspect [컨테이너 이름] 참고링크 Docker 컨테이너에 데이터 저장 (볼륨/바인드 마운트) Engineering Blog by Dale Seo www.daleseo.com 도커(
명령어 패키지 설치 sudo apt install -y gunicorn pip install gunicorn Gunicorn 실행 # 워커를 4개로 실행시키고 서버에서 처리지연이 있는 경우에는 타임아웃을 길게 잡아야 워커가 중간에 타임아웃되어 멈추지 않는다. gunicorn -k uvicorn.workers.UvicornWorker --access-logfile ./gunicorn-access.log main:app --bind 0.0.0.0:8001 --workers 4 --timeout 3600 # 백그라운드에서 돌릴경우에는 뒤에 옵션 "--daemon"을 추가로 넣어주면 된다. EX) gunicorn -k uvicorn.workers.UvicornWorker --access-logfile ./gunicorn-access.log src.main:app --bind 0.0.0.0:8001 --workers 4 --timeout 3600 --daemon 파이썬 3.10 실행방법 #
해결방법 # mbind는 리눅스 명령어로 메모리 범위에 대한 메모리 정책 설정을 뜻한다. 컨테이너에 CAP_SYS_NICE 기능을 부여하여 컨테이너가 프로세스 좋은 값을 높이고, 실시간 일정 정책을 설정하고, CPU 선호도를 설정하고, 기타 작업을 수행할 수 있도록 합니다. # docker-compose 방법 service: mysql: image: mysql cap_add: - SYS_NICE # 커맨드 실행 방법 "--cap-add=sys_nice" 옵션을 추가해주면 된다. docker run --cap-add=sys_nice -d mysql
https://beomy.github.io/tech/svelte/introduction-svelte/ [Svelte] Svelte 소개 Vue.js, React, Angular를 프론트엔드 프레임워크 3대장이라고 흔히들 말합니다. 이번 포스트에서는 새롭게 등장한 Svelte라는 프레임워크를 소개합니다. 아직 정식 한글 문서를 제공하지 않고 있지만, 프레임워크 3대장이라고 불리는 다른 프레임워크보다 낮은 러닝 커브를 가집니다. beomy.github.io https://im-developer.tistory.com/204 [Svelte] Svelte 첫 시작 - Setting up a Svelte App https://www.youtube.com/watch?v=zojEMeQGGHs&list=PL4cUxeGkcC9hlbrVO_2QFVqVPhlZmz7tO 나는 주로 유투브 영상을 보면서 공부하는 것을 좋아하는데, 스벨트 관련 정말 괜찮은 시리즈가 있어서 위에 첨부했다. 총.. im-deve
SSR(Server Side Rendering) # 원래의 초기에는 웹사이트는 MPA(Multiple Page Application) 방식으로 되어있었다. MPA는 페이지를 이동할 때마다 새로운 페이지를 요청한다. 모든 템플릿은 서버 연산을 통해서 렌더링하고 완성된 페이지 형태로 응답한다. 이 과정을 "서버 사이드 렌더링(SSR)"이라고 부른다. 서버 사이드 렌더링의 장점은 SEO이다. 전통적인 MPA의 경우 브라우저에서 JavaScript 코드가 동작하기 전에도 완성된 형태의 템플릿 (HTML에 데이터가 삽입된 상태)을 서버로 부터 전달받는다. 이 때문에 검색로봇이 페이지를 크롤링하기에 매우 적합하다. CSR(Client Side Rendering) # CSR 방식은 최초 요청시에 리소스를 모두 다운로드 받는다는 형식이다. 따라서, 최초 요청시에는 리소스를 다운받고 이후에는 서버에 데이터만 전달 받으며, 자바스크립트는 화면만 변경해준다. 이 과정을 "클라이언트 사이드 렝더링(CSR
SSR Framework의 등장 원인 SPA, MPA, SSR, CSR의 정의 [Basic] SPA, MPA, SSR, CSR 은 무엇인가? SSR(Server Side Rendering) CSR(Client Side Rendering) SPA(Single Page Application)... blog.naver.com Nuxt, Next, Nest란 무엇인가? # Nuxt Vue.JS 프레임워크 # Next React.JS 프레임워크 ※ Nuxt, Next 초기에는 서버에서 렌더링 됩니다. 이후에는 클라이언트 렌더링을 사용합니다. 이것이 바로 "범용 렌더링" 입니다. # Nest Node.JS 프레임워크 Nuxt란? # Vue.JS의 SSR을 지원하는 프레임워크가 Nuxt.JS 이다. - SPA(SSR)의 단점을 극복하고자 나온 프레임워크이다. # 특징 핫 리로드(Hot Reload) Vue 파일 쓰기 (*.vue) 코드 분할 자동화 SSR (서버 사이트 렌더링) 비동기 데이터 기
정리 예정 https://heropy.blog/2018/01/31/sass/ Sass(SCSS) 완전 정복! Style(CSS) 작업 시 필수가 되어버린 CSS Preprocessor(전처리기) Sass(SCSS)에 대해서 이해하고, CSS로 컴파일하는 방법부터 자세한 SCSS 문법까지 살펴봅니다. heropy.blog https://fathory.tistory.com/30 CSS 전처리기의 종류와 장단점 CSS 전처리기란? 간단히 말해, CSS의 한계를 뛰어넘기 위해 개발된 새로운 형태의 CSS라고 할 수 있습니다. 내가 CSS를 보다 쉽게 작성할 수 있게 다른 개발자들이 내가 작성한 CSS를 보다 쉽게 이해할 수 있게.. fathory.tistory.com https://velog.io/@eunoia/CSS-%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0%EB%9E%80 CSS 전처리기란? 전처리기의 자신만의 특별한 syntax를 가지고 CSS를 생성하도록 하는
정리예정 https://webruden.tistory.com/275 npx란 무엇일까? 그리고 npm이랑 어떤 차이점이 있을까? 우리는 종종 npx 명령어를 사용해서 패키지를 설치하곤 합니다. 예를 들어 리액트 CRA를 설치할 때 npx create-react-app을 사용하고 , nuxt를 설치할 때 npx create-nuxt-app을 사용하고, 리액트 네이티브를 설치.. webruden.tistory.com https://egg-programmer.tistory.com/227 [Node] npm vs npx vs yarn npm, npx, yarn, bower 등은 모두 Node 프로젝트에서 설치되는 패키지들을 관리해 주는 툴이라고 할 수 있다. 나는 평소 npm을 사용하고, 서버에서 배포할 때는 npx 명령어를 사용했다. npm으로 설치하는 것과 같.. egg-programmer.tistory.com https://ryusm.tistory.com/130 npm, npm, ya
build.gradle 수정 # "key.properties" 파일을 찾지 못해서 발생되는 문제 디버그 모드 사용시에는 "android/app/build.gradle"에서 주석처리해주면 된다. // signingConfigs { // release { // keyAlias keystoreProperties['keyAlias'] // keyPassword keystoreProperties['keyPassword'] // storeFile file(keystoreProperties['storeFile']) // storePassword keystoreProperties['storePassword'] // } // } // // buildTypes { // release { // signingConfig signingConfigs.release // } // }
MYSQL wait_timeout 값 변경하기 "/etc/mysql/my.cnf"에서 "wait_timeout" 값을 변경하여 높여(늘려) 줘야 합니다. [mysqld] max_connections = 100 connect_timeout = 5 wait_timeout = 600 max_allowed_packet = 16M thread_cache_size = 128 sort_buffer_size = 4M bulk_insert_buffer_size = 16M tmp_table_size = 32M max_heap_table_size = 32M interactive_timeout = 1000 FastAPI pool_recycle 옵션 주기 DB 연결 이후에 아무런 활동이 없으면 "MYSQL"에서 설정된 "wait_timeout" 이후 연결이 끊기게 됩니다. 따라서, 설정한 "wait_timeout"보다 짧은 주기로 "pool_recycle"을 통해서 지속적으로 DB 연결을 유지해야 합니다.
오버클럭 별도의 수동 오버클럭은 하지 못했고, 라이젠마스터로 사용중입니다. 다만, 올코어 4.4로 고정시키게 되면 현재 사무실 내부 온도 등을 고려하여 온도 피크치가 많이 높아지고 약간 불안정 한것 같아서 별도 수동으로 올코어 4.2로 맞춰서 사용중입니다. 그래도 체감 성능으로는 많이 떨어지지 않는것 같고 작은 미니 본체이다보니 내구성에 대한 염려가 되어 4.2로 맞추고 사용중입니다. 그래도 4350G 대비 비교가 안될정도로 빠릿하고 좋습니다. 온도 기존 4350G를 사용하고 5600G로 업그레이드 하면서 별도의 수동 오버클럭은 진행하지 못했습니다. 온도가 생각보다 높게 나옵니다. 물론 데스크미니라는 미니본체 이기 때문에 달 수 있는 쿨러가 한정적이기 때문인것 같습니다. 제 생각에는 5700G는 조금 쓰로틀링이 올 수도 있게다는 생각이 듭니다. 미니본체 라인에서는 5600G가 그나마 한계점이지 않을까 싶습니다. 체감 체감은 정말 많이 차이가 납니다. 아무래도 싱글코어 성능도 차이가
해결방법 # 재부팅 하시면 해결됩니다.
디렉토리 구조 - index.html - setting.json - assets - css - js - img - src - component - loader - src - pages HTML <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="modulepreload" href="./assets/js/initalization.mjs" /> <link rel="stylesheet" href="./assets/css/initalization.css" /> <script type="module" src="./assets/js/initalization.mjs"></script>
첨부파일 nkdi.zip 파일 다운로드 디렉토리 구조 - index.html - setting.json - assets - css - js - img - src - component - loader - src - pages - mobile - pc HTML <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="modulepreload" href="./assets/js/initalization.mjs" /> <link rel="stylesheet" href="./assets/css/initalization.css" /> <script type="module" src="./ass
외래 키(ForeignKey) 설정 아래의 예시와 같이 ForeignKey를 설정해 줍니다. ※ 주의할 점은, "Column(타입, ForeignKey())"처럼 타입 뒤인 2번째에 외래 키를 넣어줘야 한다. 이외 옵션은 그 뒤로 넣어주면 됩니다. class User(Base): __tablename__ = 'users' idx = Column(Integer, primary_key=True, index=True, autoincrement=True) # 유저 테이블 인덱스 name = Column(String, nullable=False) # 이름 class History(Base): __tablename__ = "history" idx = Column(Integer, primary_key=True, index=True, autoincrement=True) # 히스토리 테이블 인덱스 user_idx = Column(String, ForeignKey("users.idx"), nullab
액션 단축키 단축키 설명 Ctrl + Alt + L 코드 자동 정렬 Ctrl + Alt + I 줄단위 자동 정렬 Ctrl + Alt + O Import 자동 정리 Ctrl + Alt + P 인자값 즉시 보기 Ctrl + Alt + Q DOC 주석 바로 보기 F2 다음 강조 표시된 오류 Alt + Enter 수정 내용 추천 Alt + F1 에러 내용 확인 에디터 단축키 단축키 설명 Alt + Shift + Up/Down 현재 라인 위아래 이동 Ctrl+ Shift + Up/Down 현재 라인의 메소드, IF 등 블럭 단위로 위아래 이동 Alt + Enter 파이썬 추천 코드 형식으로 리팩토링 제안 Ctrl + Space 1. dic 변수 선언하고 가져다 쓸때, dic_name[ __ ] 상태에서 Ctrl + Space 누르면 Key 값 추천 됨 2. Class 멤버 번수 init에 넣고 메소드에서 사용 할때 self. __ 에서 자동 완성 Ctrl + Shift + Space 스마
함수 flush, commit, refresh, rollback이 자주 사용된다. 함수 설명 Refresh - 객체의 최신 상태 데이터가 필요한 경우 - 만약, 스레드에서 변경이 되어 변경 이전에 데이터를 가져왔을 경우에는 "refresh()"를 통하여 항상 최신 데이터를 가져올 수 있다. Flush - "flush"는 DB 버퍼에 변경된 사항들을 반영하는 것을 의미한다. (DB 반영 X) - "autocommit=True"일 경우 자동 "commit" 된다. - "autocommit=False"일 경우 DB 버퍼에만 저장 후 "commit"이 호출되면 저장한다. ※ "commit" 전 DB에 반영할 사항들을 모아놓는 곳을 DB Transaction buffer라 한다. Commit - 데이터를 저장할 경우 - 버퍼에 올라있던 사항들을 모두 DB에 반영한다. Rollback - 데이터를 이전으로 되돌릴 경우 Merge - 일부 키를 사용하여 동일한 데이터베이스 레코드에 매핑되는 메모
이동 감지 useEffect(() => { return () => { console.log("이동 감지"); } }, []) 경고 모달 새로고침시 감지 const handleBeforeunload = (e) => { e.preventDefault(); e.returnValue = ""; }; useEffect(() => { window.addEventListener("beforeunload", handleBeforeunload); return () => { ... } }, []) 참고링크 React에서 페이지를 떠나기 전에 사용자에게 경고하는 방법 지난주에는 콘서트 방송을 위해 특정 페이지를 떠나기 전에 사용자를 중지하는 방법을 알아 내야했고, 사용자가 탭을 닫거나 다른 페이지로 이동하도록 선택하면 콘서트를 종료하는 API 엔드 포인트에 도달해야했습니다. 사용자가 웹 사이트의 한 페이지를 떠날 수있는 여러 가지 방법이 있고 관련이 없기 때문에 이것은 어려운 문제였습니다. ichi.p
기본 사용법 <h1>Hello world!</h1> Hello world! 데이터 출력 <script> let name = 'world'; </script> <h1>Hello {name.toUpperCase()}!</h1> Hello WORLD! 다이나믹 속성 <script> let src = 'tutorial/image.gif'; let name = 'Rick Astley'; </script> <img {src} alt="{name} dances."> Result 스타일 속성 <p>This is a paragraph.</p> <style> p { color: purple; font-family: 'Comic Sans MS', cursive; font-size: 2em; } </style> This is a paragraph. 다른 파일 임포트 # App.svelte <script> import Nested from './Nested.svelte'; << 다른 파일 임포트 </scr
카운트 처리 및 동기화 # 이렇게 처리하면 버튼이 생성되면 누르면 카운트가 상승한다. <script> let count = 0; function incrementCount() { count += 1; } </script> <button on:click={incrementCount}> Clicked {count} {count === 1 ? 'time' : 'times'} </button> 카운트 처리 응용 반응형 선언 # Svelte는 구성 요소의 상태가 변경되면 DOM을 자동으로 업데이트합니다. 종종 구성 요소 상태의 일부 부분은 다른 부분(예: 성과 이름에서 파생된 전체 이름)에서 계산되고 변경될 때마다 다시 계산되어야 합니다. 이를 위해 $: 반응형 선언이 있습니다. <script> let count = 0; $: doubled = count * 2; function handleClick() { count += 1; } </script> <button on:click={handl
Props # 지금까지 우리는 내부 상태만을 다루었습니다. 즉, 값은 주어진 구성 요소 내에서만 액세스할 수 있습니다. 모든 실제 응용 프로그램에서는 한 구성 요소의 데이터를 하위 구성 요소로 전달해야 합니다. 그렇게 하려면 일반적으로 'props'로 축약되는 속성을 선언해야 합니다. Svelte에서는 export 키워드로 이를 수행합니다. Nested.svelte 구성 요소를 편집합니다. <script> export let answer; </script> ※ 이렇게 하면 재사용성이 높아집니다. # App.svelte <script> import Nested from './Nested.svelte'; </script> <Nested answer={42}/> # Nested.svelte <script> export let answer; </script> <p>The answer is {answer}</p> The answer is 42 Props 응용 # props의 기본값을 쉽게 지
조건문 # HTML에는 조건문 및 루프와 같은 논리를 표현하는 방법이 없습니다. Svelte는 합니다. 일부 마크업을 조건부로 렌더링하기 위해 if 블록으로 래핑합니다. {#if user.loggedIn} <button on:click={toggle}> Log out </button> {/if} {#if !user.loggedIn} <button on:click={toggle}> Log in </button> {/if} <script> let user = { loggedIn: false }; function toggle() { user.loggedIn = !user.loggedIn; } </script> {#if user.loggedIn} <button on:click={toggle}> Log out </button> {/if} {#if !user.loggedIn} <button on:click={toggle}> Log in </button> {/if} 조건문 ELSE # if us
DOM 이벤트 # "on:" 지시문을 사용하여 요소의 모든 이벤트를 수신할 수 있습니다. <div on:mousemove={handleMousemove}> The mouse position is {m.x} x {m.y} </div> <script> let m = { x: 0, y: 0 }; function handleMousemove(event) { m.x = event.clientX; m.y = event.clientY; } </script> <div on:mousemove={handleMousemove}> The mouse position is {m.x} x {m.y} </div> <style> div { width: 100%; height: 100%; } </style> 인라인 이벤트 # 이벤트 핸들러를 인라인으로 선언할 수도 있습니다. <div on:mousemove="{e => m = { x: e.clientX, y: e.clientY }}"> The mouse positi
Input 바인딩 # 일반적으로 Svelte의 데이터 흐름은 하향식입니다. 상위 구성 요소는 하위 구성 요소에 props를 설정할 수 있고 구성 요소는 요소에 속성을 설정할 수 있지만 그 반대는 아닙니다. 아래와 같이 "bind:value" 지시문을 사용할 수 있습니다. <input bind:value={name}> ※ 즉, name 값을 변경하면 입력 값이 업데이트될 뿐만 아니라 입력 값이 변경되면 이름도 업데이트됩니다. "Vue.js"의 "v-model"과 동일합니다. <script> let name = 'world'; </script> <input bind:value={name}> <h1>Hello {name}!</h1> Input 타입 (숫자, 범위) # DOM에서 모든 것은 "문자열(String)"입니다. 숫자 입력"(type='number' 및 type='range')"을 처리할 때는 도움이 되지 않습니다. 이는 사용하기 전에 "input.value"를 강제 변환해야 한다
onMount # 수명 주기 모든 구성 요소에는 생성될 때 시작되고 소멸될 때 끝나는 수명 주기가 있습니다. 해당 수명 주기 동안 중요한 순간에 코드를 실행할 수 있는 몇 가지 기능이 있습니다. 가장 자주 사용하게 될 "onMount"는 구성 요소가 DOM에 처음 렌더링된 후 실행되는 onMount입니다. 캔버스 요소가 렌더링된 후 상호 작용해야 할 때 이전에 간략하게 접했습니다. 네트워크를 통해 일부 데이터를 로드하는 onMount 핸들러를 추가합니다. <script> import { onMount } from 'svelte'; let photos = []; onMount(async () => { const res = await fetch(`https://jsonplaceholder.typicode.com/photos?_limit=20`); photos = await res.json(); }); </script> ※ SSR(서버 측 렌더링) 때문에 스크립트의 최상위 수준이 아닌 o
다크모드 감지 # 아래의 코드로 다크모드를 "true", "false"로 감지 할 수 있습니다. window.matchMedia('(prefers-color-scheme: dark)').matches 참고링크 JavaScript를 사용하여 다크 모드를 감지하는 방법 JavaScript를 사용하여 다크 모드 감지 및 모드 변경 감지 CSS를 사용하면 prefers-color-scheme 미디어 쿼리를 사용하여 다크 모드를 감지할 수 있습니다. 하지만.. JavaScript를 사용해야 한다면? 페이지에 이미.. jeycon.tistory.com
저장소(Store) Writable # 모든 애플리케이션 상태가 애플리케이션의 구성 요소 계층 구조에 속하는 것은 아닙니다. 때로는 관련되지 않은 여러 구성 요소 또는 일반 JavaScript 모듈에서 액세스해야 하는 값이 있습니다. Svelte에서는 "stroes"에서 이를 수행합니다. 저장소(stroes)는 단순히 저장소 값이 변경될 때마다 관심 당사자에게 알림을 제공하는 구독 메서드가 있는 개체입니다. # App.svelte 아래의 예시처럼 각 컴포넌트 별로 더하기, 빼기, 초기화 기능을 담당하고 있고, "stores.js"에서 쓰기 가능한 저장소를 이용하여 데이터를 저장하고 불러올 수 있습니다. <script> import { count } from './stores.js'; import Incrementer from './Incrementer.svelte'; import Decrementer from './Decrementer.svelte'; import Resetter f
Tweened 옵션 설명 delay 시작 전 딜레이 duration 지속 시간 easing 효과 (EX: cubicOut) interpolate 사용자 정의(from, to) = t = 임의 값 사이의 보간을 위한 값 함수. 기본적으로 Svelte는 숫자, 날짜, 동일한 모양의 배열과 객체 사이를 보간합니다(숫자와 날짜 또는 기타 유효한 배열과 객체만 포함하는 한). (예를 들어) 색상 문자열이나 변환 행렬을 보간하려면 사용자 정의 보간기를 제공하십시오. <script> import { tweened } from 'svelte/motion'; import { cubicOut } from 'svelte/easing'; const progress = tweened(0, { duration: 400, easing: cubicOut }); </script> <progress value={$progress}></progress> <button on:click="{() => progress.s
전환 효과 FadeIn, FadeOut # 요소를 DOM 안팎으로 우아하게 전환하여 보다 매력적인 사용자 인터페이스를 만들 수 있습니다. Svelte는 "transition" 지시어를 사용하여 이것을 매우 쉽게 만듭니다. <script> import { fade } from 'svelte/transition'; let visible = true; </script> <p transition:fade>Fades in and out</p> # 아래 처럼 옵션값을 설정할 수도 있습니다. "y" 값의 경우 아래에서 위로 올라는 효과를 얻을 수 있습니다. <p transition:fly="{{ y: 200, duration: 2000 }}"> Flies in and out </p> # App.svelte <script> import { fade } from 'svelte/transition'; let visible = true; </script> <label> <input type="check
애니메이션 Svelte tutorial undefined / undefined svelte.dev # 이전 장에서 우리는 요소가 하나의 할 일 목록에서 다른 목록으로 이동할 때 모션의 전환을 만들기 위해 지연된 전환을 사용했습니다. 다만, 여기서 "todo"에서 "done"을 이동하는 과정에서 이동 되는 엘리먼트에만 전환 효과가 적용되었고, 기존에 있는 "todo" 리스트 항목들은 효과가 적용되지 않았습니다. 이를 위해 animate 지시문을 사용합니다. 먼저 svelte/animate에서 플립 기능(플립은 'First, Last, Invert, Play'를 의미함)을 가져옵니다. import { flip } from 'svelte/animate'; # 그런 다음 라벨 요소에 추가합니다. <label in:receive="{{key: todo.id}}" out:send="{{key: todo.id}}" animate:flip > # 딜레이 시간을 변경 할 수 있습니다. <label
외부 요소 클릭시 이벤트 # 이 앱에서는 사용자가 외부를 클릭할 때 모달이 닫히도록 하려고 합니다. outclick 이벤트에 대한 이벤트 핸들러가 있지만 기본 DOM 이벤트가 아닙니다. 즉, 모달창이 있고 이외 "DOM", "엘리먼트"들을 클릭하면 모달이 닫히는 액션 입니다. # App.svelte <script> import { clickOutside } from "./click_outside.js"; let showModal = true; </script> <button on:click={() => (showModal = true)}>Show Modal</button> {#if showModal} <div class="box" use:clickOutside on:outclick={() => (showModal = false)}> Click outside me! </div> {/if} <style> .box { --width: 100px; --height: 100px; positi
도커 허브 이미지 PUSH(업로드) # 도커 로그인 sudo docker login # 이미지 확인 sudo docker images -a # 이미지 지정 sudo docker tag [이미지이름] [ID]/[NAME]:[TAG] EX) sudo docker tag abced123456 hksoft/backend:1 # 이미지 푸시 sudo docker push [이미지이름] [ID]/[NAME]:[TAG] EX) sudo docker push abced123456 hksoft/backend:1 ※ 태그에 기본 "latest"인 경우에는 명시하지 않음 도커 허브 이미지 PULL(다운로드) # 도커 로그인 sudo docker login # 이미지 확인 sudo docker images -a # 이미지 풀 docker pull [ID]/[NAME]:[TAG] EX) sudo docker pull hksoft/backend:1 ※ 태그에 기본 "latest"인 경우에는 명시하지 않음
도커 이미지 삭제 # 컨테이너 확인 sudo docker ps # 컨테이너 삭제 sudo docker rm [컨테이너ID] # 이미지 확인 sudo docker images -a # 이미지 삭제 sudo docker rmi [이미지ID]
도커 이미지 생성 옵션 설명 -a author를 의미하며 이미지 작성자를 나타내는 메타데이터를 이미지에 포함시킵니다. -m 메세지 # 컨테이너 확인 sudo docker ps # 이미지 확인 sudo docker images -a # 일반 이미지 생성 sudo docker commit [컨테이너이름] [NAME]:[TAG] EX) sudo docker commit 4f63faecbe51 anrisk-backend:1 # 옵션 사용 이미지 생성 sudo docker commit -a "[내아이디]" -m "[메세지]" [컨테이너이름] [NAME]:[TAG] EX) sudo docker commit -a "phongdaegi" -m "First Commit" 4f63faecbe51 anrisk-backend:1 ※ 이미지 생성시 "TAG"를 명시하지 않으면 기본 "latest"로 설정됨
requirements 생성 # "requirements" 패키지 관리 생성 pip freeze > requirements.txt 파이썬 도커파일 설정 방법 # 프로젝트 내부에 "dockerfile" 생성 이후 "dockerfile" 파일 연 후 아래 내용 추가 # "uvicorn" 실행 방법 FROM python:3.9 WORKDIR / COPY ./requirements.txt /requirements.txt RUN pip install --upgrade pip RUN pip install --no-cache-dir --upgrade -r /requirements.txt COPY ./ /app WORKDIR /app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] # "gunicorn" 실행 방법 나머진 동일하고 "CMD" 부분만 변경하면 된다. CMD ["gunicorn", "-k", "uvicorn.w
default.conf # 기본 HTTP(80) 설정 방법 하단 "expires -1"은 지워도 됨 프로젝트 내부에 "default.conf" 파일 생성 이후 "default.conf" 파일 연 후 아래 내용 추가 해당 파일은 "dockerfile"에서 "nginx"에 있는 기본 "default.conf" 파일을 삭제 한 후 대체되는 파일이기 때문에 필수 입니다. ※ 도커 컨테이너에서 "root/build" 형식으로 "root" 경로 안쪽으로 설정하니 퍼미션 문제인지 502 에러가 발생한다. 그렇기 때문에 아예 최상위 디렉토리 루트로 설정하는게 좋을것 같다. server { listen 80; server_name localhost; root /app/build; index index.html index.htm; location ~ .(static)/(js|css|media)/(.+)$ { expires -1; try_files $uri $uri/ /$1/$2/$3; } locati
PostCSS란? 2021 CSS 만족도 # "PostCSS"는 후처리기 이며, 브라우저에서 가능한 최상의 결과를 얻을 수 있도록 CSS를 정렬하고 개조합니다. 2021 트렌드에서는 PostCSS가 압도적으로 만족도가 높은 상태 입니다. ※ 전처리기는 CSS로 컴파일되는 언어를 사용하여 다소 쉬운 코드 작성으로 개발 속도를 높여줍니다. PostCSS 사용하기 # "PostCSS"는 일반적인 HTML 환경에서는 사용 할 수 없고 "node"안에서 적용 할 수 있습니다. # "PostCSS" 설치 npm install -D postcss postcss-loader # "webpack.config.js" 설정 "WebPack"과 같이 사용 const path = require('path'); module.exports = { entry: { app: ["./src/index.js", "./src/test.js"] }, output: { filename: "bundle.js", path:
Webpack 이란? # "Webpack"은 "모듈 번들링"이라고 불린다. "HTML" 파일에 들어가는 하나의 자바스크립트 파일로 최적화를 거쳐 압축시켜준다. 프론트 개발 영역에서는 필수 요소 이다. Webpack 설치하기 옵션 설명 entry 번들로 합치고 싶은 파일들 지정 output 번들 출력 위치 지정 mode development : 개발용 production : 배포용 # "Webpack" 설치 npm install -D webpack # "Webpack v4" 이상 사용시, cli 설치도 필요 (권장) npm install -D webpack-cli # webpack.config.js const path = require('path'); module.exports={ entry : ['./src/index.js', './src/test.js'], output: { filename : 'bundle.js', path : path.resolve(__dirname + '/bu
Babel 이란? # "ES6"를 "ES5"으로 변환시켜주어 구 버젼에 브라우저에 호환성을 가질 수 있다. Babel 설치 Webpack 과 같이 사용 # 대부분 "Webpack"과 같이 사용함으로 "Webpack" 설정으로 진행 npm i webpack webpack-cli babel-loader # ".babelrc" 파일 생성 후 아래 내용 추가 { "presets": ["@babel/preset-env", "@babel/preset-react"], "plugins": [ "@babel/plugin-proposal-class-properties" ] } # 설치 후 프로젝트 최상위 디렉토리에 "webpack.config.js" 파일을 만든 후 아래 내용을 적용 ("webpack.config.js" 파일이 이미 있는 경우는 수정) const path = require('path') module.exports = { entry : './src/code.js', output : {
css-loader 설치 # "css-loader", "style-loader"는 "Webpack"에서 "css" 파일을 읽어 번들링 해주는 것이다. # 설치 npm i css-loader style-loader --save-dev # 설치 후 프로젝트 최상위 디렉토리에 "webpack.config.js" 파일을 만든 후 아래 내용을 적용 ("webpack.config.js" 파일이 이미 있는 경우는 수정) const path = require('path') module.exports = { entry : './src/code.js', output : { path : path.resolve(__dirname, 'dist'), filename : 'code.bundle.js' }, module: { rules: [ { test: /\.js$/, use: "babel-loader" }, // 아래 코드 부분을 추가 { test: /\.css$/, use: ["style-loader",
Scss(Sass) 설치 # 설치 npm install --save-dev sass sass-loader mini-css-extract-plugin # 설치 후 프로젝트 최상위 디렉토리에 "webpack.config.js" 파일을 만든 후 아래 내용을 적용 ("webpack.config.js" 파일이 이미 있는 경우는 수정) const path = require('path') module.exports = { entry : './src/code.js', output : { path : path.resolve(__dirname, 'dist'), filename : 'code.bundle.js' }, module: { rules: [ { test: /\.js$/, use: "babel-loader" }, // 아래 코드 부분을 추가 { test: /\.css$/, use: ["style-loader", "css-loader", "sass-loader"], }, ], }, optimiza
PostCSS 및 PostCSS Short 설치 # "postcss" 설치 npm install --save-dev postcss-loader postcss # "postcss-short" 설치 npm i postcss-short -D ※ PostCSS Short은 CSS를 작성하는 속도를 향상시켜주는 유용한 PostCSS 플러그인입니다. Webpack 적용 # 프로젝트 최상위 디렉토리에 "postcss.config.js" 파일 생성 후 아래 내용 추가 module.exports = { plugins: [ [ "postcss-preset-env", { browsers: "> 5% in KR, defaults, not IE < 11", // CSS Grid 활성화 [false, 'autoplace', 'no-autoplace'] autoprefixer: { grid: "autoplace" }, }, "postcss-short", { prefix: "x", skip: "-" }, ],
파이썬 관련 패키지 설치 # 간혹, 특정 패키지 설치시 오류가 날때가 있을것이다. 그것을 미리 방지하기 위해서 아래 명령어로 관련 패키지를 모두 설치해주면 된다. sudo apt -y install build-essential autoconf libtool pkg-config python-opengl python-pil python-pyrex python-pyside.qtopengl idle-python2.7 qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml libqt4-test libqt4-script libqt4-network libqt4-dbus python-qt4 python-qt4-gl libgle3 python-dev libssl-dev python3-dev python3-venv python3-setuptools python-setuptools libpq-dev psycopg2 error 발생시 sudo apt -y
Nginx 자동실행 설정 # 실서버든 도커든 방법은 동일합니다. 루트(기본) 폴더에서 ".bashrc" 파일을 열어줍니다. cd sudo vi .bashrc # 맨 하단으로 이동 후 아래 명령어 입력 후 "wq"로 저장 sudo service nginx start # 이렇게 설정하면 시스템 재시작시 자동실행됩니다.
docker-compose.yml # 하단의 내용은 "docker-compose.yml"을 설명하기 위한 예시 입니다. 현재 아래의 도커 컴포즈 자세한 사용법은 구글링을 통해 진행하면 됩니다. 여기서 중요한 부분은 네트워크를 통해 브릿지하여 어떻게 내부망으로 통신하느냐 문제입니다. 하단에 보시면 각 "frontend", "backend" 네트워크망을 "webnet"이라고 이름을 정하였고 맨 하단에 "networks"쪽에서 driver를 "bridge"로 설정하였습니다. 이렇게 도커컴포즈를 실행시키면 "sudo docker networks ls"를 통하여 "webnet"이라는 네트워크망이 추가됩니다. ※ 만약, 네트워크를 설정하지 않았다면 현재 도커컴포즈를 실행하는 디렉토리 폴더 이름 및 사용자 이름(ubuntu)를 이용한 "ubuntu_default"으로 생성됩니다. version: "1.0" services: frontend: image: [프론트 이미지] ports: - "80:
GetX Flutter Firebase Auth Example GitHub - delay/flutter_starter Contribute to delay/flutter_starter development by creating an account on GitHub. github.com # 위의 예제는 GetX를 활용한 파이어베이스 인증 예제 입니다. 메모용 게시글 입니다.
GetX Pattern Structure in modules 이름 설명 Model 객체에 대한 모든 모델 클래스를 그룹화한 디렉토리 Providers 데이터 Provider(API or Database)를 그룹화한 디렉토리 Repository 단일 데이터 액세스 포인트이며 엔티티를 추상화함 Data 데이터와 관련된 모든 것(Repository, Providers)를 저장하는 디렉토리 Controller 컨트롤러는 비즈니스 로직, 상태 변경에 대한 책임만 있음 이벤트를 포함하는 Observable(.obs)을 생성하는 곳 UI 유저가 보는 위젯, 애니메이션, 텍스트, 테마 등이 있는 디렉토리 Routes Routes 관리를 담당하는 파일이 있는 디렉토리 Binding Dependency Injection을 분리하는 클래스 상태 관리자 및 Dependency 관리자로 라우팅 됨 # "GetX Pattern"에서 제안하는 "GetX"를 사용하는 프로젝트(디렉토리) 구조는 "Package"
차이점 # 우선은 둘다 사용해도 무난합니다. 어떠한 기능적인 문제가 있는것이 아닌 "json"이라는 변수이름을 자주 사용하고 또한 충돌되는 경우가 있기 때문에 "json.encode" 대신 "jsonEncode"를 사용하는것이라고 합니다. 참고링크 What is the difference and preferred way between jsonEncode() and json.encode() in Dart? In Flutter doc, it uses jsonEncode(), while in Angular doc, it uses json.encode(). What is the difference and preferred way between the two? stackoverflow.com
폼 파일 확장자 문제 # 한컴오피스 및 마이크로소프트 엑셀의 확장자가 다릅니다. 그래서 아래와 같이 설정해주면 됩니다. accept=".xlsx, application/haansoftxlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, application/vnd.msexcel"
컨트롤러 메모리 지우기 # "GetX"에서 바인딩을 한경우에는 원래 자동으로 메모리를 지워준다. 하지만, "StatefulWidget"에서 상단에 "final SignInController controller = Get.find();" 이런식으로 컨트롤러를 선언해주면 메모리에서 자동으로 지우지 않는다. 이런 경우 상태관리 특성상 페이지 이동 후 되돌아 왔을때 초기화면이 되어야 하는 경우가 있기에 별도로 초기화를 해줘야 한다. 아래 처럼 "dispose"에 컨트롤러를 강제로 삭제해주면 된다. @override void dispose() { Get.delete<컨트롤러이름>(); } LazyPut 사용시에는 Fenix 옵션 넣기 Differences between methods | Flutter GetX Overview chornthorn.github.io # "LazyPut" 사용시에는 옵션에 꼭 "fenix: true"를 넣어줍시다. 간단하게 화면변경시 데이터를 날린다고 보면 된다.
차이점 # "ListView"은 기본적으로 스크롤이 가능한 배열형 위젯 입니다. "ListView" : 소수의 리스트를 보여줄때 적당하다. "ListView.Builder" : "LazyList" 방식으로 좀 더 많은 데이터를 보여줄때 사용하면 된다. 참고링크 ListView vs ListView.builder 차이점 ListView: Creates a scrollable, linear array of widgets from an explicit List. This constructor is appropriate for list views with a small number of c velog.io
Wrap 이란? # 줄과 행에 공간이 부족할 때는 Wrap을 사용해 보세요! Wrap 위젯은 자식을 줄이나 행으로 배치하고 공간이 부족해지면 자동으로 줄이나 행을 바꿔줍니다. 방향, 정렬, 그리고 공간 속성기능이 여러분이 원하시는 디자인을 그대로 만드는 데 도움이 될 것입니다. 플러터에서 기본적으로 많이 사용되는 레이아웃 위젯 Container, Row, Column, Wrap 사용방법 # "Wrap"을 사용하면서 "children" 항목에 "List.generate"를 사용할 수도 있습니다. Wrap( direction: Axis.horizontal, alignment: WrapAlignment.center, runAlignment: WrapAlignment.center, spacing: 5, runSpacing: 0, children: List.generate( controller.certifyList.length, (_) => Row( children: [ Icon( contr
차이점 # "ListView"의 특징 - 표시되지 않는 경우에도 목록의 모든 항목을 렌더링합니다. "ListView.Builder"의 특징 - 화면에 보이는 항목만 렌더링합니다. - 즉, "Lazy" 형태라고 보면 됩니다. "SingleChildScrollView"의 특징 - "ListView" 와 동일하게 모든 항목을 렌더링합니다. - "ListView" 보다 유연합니다. - 다소 적은 컨텐츠의 경우에는 "ListView"와의 성능적인 차이가 없습니다. # 제가 내린 결론 "ListView"는 "SingleChildScrollView"과 동일하게 사용되며, "SingleChildScrollView"가 유연성이 더 높다고는 하나, 단일화된 페이지에서도 "ListView"를 사용해도 무방할것 같다. "ListView.Builder"는 데이터를 받고 출력할때 사용한다. 100개의 데이터를 받아서 보여줄때 한번에 렌더링 되기 보단 스크롤하면서 현재 보고 있는 화면이 나타날때 렌더링 되는것
https://risingstars.js.org/2021/ko JavaScript 라이징 스타 2021 2021년 JavaScript 백서. 프론트엔드, Node.js 프레임워크, React/Vue 에코시스템, 빌드 도구, 상태관리 등의 경향 risingstars.js.org https://github.com/google/zx GitHub - google/zx: A tool for writing better scripts A tool for writing better scripts. Contribute to google/zx development by creating an account on GitHub. github.com https://vitejs.dev/ Vite Vite Next Generation Frontend Tooling Get Started Learn More Instant Server Start On demand file serving over native ESM
백엔드 2022년도에서는 백엔드는 현상 유지 및 써보면서 딥하게 조금씩 진행할 계획이다. Python PHP Node 기본기 다지기 목표 Rust - 나의 진영쪽에서 Rust를 다루지는 않을것 같으나, 워낙 명성이 자자하다보니 공부해보고 싶다. => 러스트는 올해 하지 않기로 했다. Dart - 플러터를 하면서 이미 기본적인것은 확인하였으나, 별도로 시간을 내서 다시 정독해볼 생각이다. Golang - 개인적으로 파이썬 대체제로 생각하는 부분이다. 크롤링 퍼포먼스만 봐도 고랭이 앞도적이다. 차후에 분명히 성능 이슈로 인하여 Golang이 필요할 것 같아서 기본기를 다질 예정이다. => Golang은 올해 하지 않기로 했다. Node.js NestJS - 올해 추가된 목표로 NestJS를 해볼 생각이다. - 기존에 Node로 프로덕트 까지 가본적이 없기 때문이다. 프레임워크 Laravel - 요즘 프로젝트에는 라라벨을 따로 쓰지는 않았다. - 가능하면, 개별 공부를 해야될것 같다. d
원인 # 초기에 이 문제 때문에 정말 많이 헷갈렸습니다. 컨트롤러가 자동으로 닫히지 않으니 계속 이전 데이터를 불러왔기 때문입니다. "smartManagement: SmartManagement.onlyBuilder" 옵션에서 기본 옵션이 아닌 "SmartManagement.onlyBuilder"을 사용했기 때문 입니다. 해결방법 # "GetMaterialApp"에서 "smartManagement" 옵션이 "SmartManagement.onlyBuilder" 으로 되어 있다면, 기본 "SmartManagement.full" 으로 변경하거나, 삭제해야 컨트롤러가 사용되지 않을때 알아서 삭제해줍니다. 참고링크 getx/dependency_management.md at master · jonataslaw/getx Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies e
원인 및 방법 # "Form" 위젯을 사용중이고 "FormKey"를 지정하였다면, 해당 컨트롤러가 닫히지 않은 상태 혹은 중첩된 상태에서 다른 라우터(Get.to 등등) 으로 이동하려고 하면 오류가 발생됩니다. 따라서, 특정 액션전에 "Form" 페이지외 다른 페이지 혹은 필요가 없어진 경우 컨트롤러가 해제되었는지 확인하여 강제로 해제하거나 플로우 순서를 바꾸어 해결하시면 됩니다. 결론은 "Form"에 "FormKey"가 해제되지 않은 경우에 발생한다.
퍼블릭 버킷 설정 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::버킷이름/*" }, { "Effect": "Allow", "Principal": "*", "Action": [ "s3:ListBucketMultipartUploads", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::버킷이름", "arn:aws:s3:::버킷이름/*" ] }, { "Effect": "Allow", "Principal": "*", "Action": "s3:ListBucket
해결방법 # JDK 버젼 문제로 인한 발생 설치된 JDK 경로를 직접 입력하여 키파일을 만들면 된다. "C:\Program Files\Android\Android Studio\jre\bin\keytool" -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 참고링크 [Flutter] java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available 계속 java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available라며 apk build가 되지 않는 상황이 발생. (debug는 문제없음) 확인해보니, JDK 버전과 관련이 있는 문제인 것 같다. flutte.. temphi20.tistory.com
패키지명 체크 프로젝트에서 패키지명 "com.example.myapp" 형태를 찾아 모두 변경 "android\app\build.gradle"에서 확인 할 수 있다. 서명키(jks) 생성 Window keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key Mac / Linux keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 그외 오류는 아래 링크 참고 [Flutter] 플러터 Failed to read key key from store "android/app/key.jks" : Integrity check failed: Java 버전에 따른 옵션 추가 Java9 버전 부터는 "default storetype"이 "pcks12" 라... blog.naver.com
Controller 외부데이터에서 받아온다면 "[].obs"만 해주면되고, "assignAll"을 이용하면 데이터 변경값을 감지합니다. RxMap<String, dynamic> isAllCheckBox = {"title": "전체 약관에 동의합니다.", "isChecked": false}.obs; RxList<dynamic> isCheckbox = [ { "title": "[필수] 이용약관".obs, "isChecked": false.obs }, { "title": "[필수] 개인정보 수집 및 이용 동의".obs, "isChecked": false.obs, }, ].obs; Ui # 전체 체크박스 CheckboxListTile( focusNode: controller.allCheckBoxFocusNode, controlAffinity: ListTileControlAffinity.leading, contentPadding: EdgeInsets.zero, title: Text( cont
pubspec.yaml cached_network_image | Flutter Package Flutter library to load and cache network images. Can also be used with placeholder and error widgets. pub.dev 사용방법 # 매번 이미지를 다운로드 하지 않고 캐시하는 방법이 좋습니다. 성능이 낮은 기기 일수록 메모리 초과로 팅기는 현상도 없앨 수 있습니다. placeholder, progress indicator, imageBuilder 방식으로 사용 할 수 있으며, 위 링크를 참조하시면 됩니다. Container( width: 115, height: 115, child: CachedNetworkImage( imageUrl: "이미지링크", memCacheWidth: 500, memCacheHeight: 500, progressIndicatorBuilder: (context, url, downloadPro
해결방법 # 아래 처럼 한글은 인코딩을 별도로 해줘야 한다. 라우터 보낼때만 인코딩 하고 이후 컨트롤러에서 가져올때는 인코딩 안해도 된다. Get.toNamed("/search/house/${Uri.encodeComponent(데이터)}");
SkSL로 실행 Example 모바일 앱의 애니메이션이 버벅거리는 것처럼 보이지만 처음 실행했을 때만 나타나는 경우 상당한 개선을 위해 Skia Shader Language(SkSL)로 캡처한 셰이더를 워밍업할 수 있습니다. 먼저, 아래 명령어를 통하여 앱을 실행시킵니다. # 실행시 flutter run --profile --cache-sksl # SKSL을 처음 실행하는 경우 flutter run --profile --cache-sksl --purge-persistent-cache 실행시킨 앱에서 데이터가 쌓일 수 있게 기능들을 모두 탭하여 확인합니다. 같은 터미널에서 "shift" + "m"을 눌러 대문자 "M"을 누르게 되면 해당 프로젝트 폴더에 "flutter_01.sksl" 이름 순으로 파일이 만들어 집니다. 빌드 위에서 "profile" 모드로 데이터를 쌓은 파일을 가지고 빌드하시면 됩니다. # AOS 빌드 flutter build appbundle --bundle-sks
앱 크기 분석하기 analyze-size # 크기 분석 도구는 빌드할 때 --analyze-size 플래그를 전달하여 호출합니다. flutter build apk --analyze-size flutter build appbundle --analyze-size flutter build ios --analyze-size flutter build linux --analyze-size flutter build macos --analyze-size flutter build windows --analyze-size # 아래와 같은 오류 발생시 "--target-platform"을 지정해주면 됩니다. Cannot perform code size analysis when building for multiple ABIs. Specify one of android-arm, android-arm64, or android-x64 in the --target-platform flag. flutter bui
난독화 # 기본적인 최적화 방법 1. 사용하지 않는 리소스 제거 2. 라이브러리에서 가져온 리소스 최소화 3. PNG 및 JPEG 파일 압축 4. 캐시 저장을 통한 메모리 최소화 # 코드 난독화는 사람이 이해하기 어렵게 앱의 바이너리를 수정하는 프로세스입니다. 난독화는 컴파일된 Dart 코드에서 함수 및 클래스 이름을 숨기므로 공격자가 독점 앱을 리버스 엔지니어링하기 어렵게 만듭니다. 현재의 난독화는 "Android/iOS/macOS"만 지원합니다. 난독화 하기 난독화 전 난독화 후 # 위에 난독화 전후를 비교하면 약 2MB 차이가 납니다. 앱 크기가 더 클 수록 차이는 더 분명하게 날것 같습니다. 하단, "/<directory>" 부분은 해당 프로젝트 경로를 입력해주거나 터미널로 해당 프로젝트로 이동하여 "./"으로 처리하면 됩니다. # APK 빌드 flutter build apk --obfuscate --split-debug-info=/<directory> # Appbundle
필요할 때만 효과 적용 # SaveLayer()를 호출하면 오프스크린 버퍼가 할당됩니다. 콘텐츠를 오프스크린 버퍼에 그리면 이전 GPU에서 특히 느린 렌더 대상 전환이 트리거될 수 있습니다. 아래에 사항을 참고하여 부득이하게 필요한 경우에만 사용합니다. ShaderMask ColorFilter Chip - DisabledColorAlpha != 0xff인 경우 saveLayer()를 호출할 수 있습니다. Text - OverflowShader가 있는 경우 saveLayer()를 호출할 수 있습니다. 이미지에서 페이드인 효과 - "FadeInImage"를 활용하기 모서리가 둥근 사각형 - 클리핑 사각형을 적용하는 대신 여러 위젯 클래스에서 제공하는 borderRadius 속성을 사용
16ms 만에 프레임을 만들고 표시 # 빌드 및 렌더링을 위한 두 개의 개별 스레드가 있기 때문에 빌드에 16ms가 있고 60Hz 디스플레이에서 렌더링에 16ms가 있습니다. 대기 시간이 문제인 경우 16ms 이하로 프레임을 빌드하고 표시합니다. 8ms 이하로 빌드되고 8ms 이하로 렌더링되어 총 16ms 이하임을 의미합니다. 프레임 누락(잔키 현상)이 우려되는 경우 각 빌드 및 렌더링 단계에 대해 16ms가 좋습니다. # 프로필 모드에서 프레임이 총 16ms 미만으로 렌더링되는 경우 몇 가지 성능 문제가 적용되더라도 성능에 대해 걱정할 필요가 없지만 가능한 한 빨리 프레임을 만들고 렌더링하는 것을 목표로 해야 합니다. 1. 프레임 렌더링 시간을 16ms 미만으로 낮추면 시각적으로 차이가 없을 수 있지만 배터리 수명과 열 문제가 개선됩니다. 2. 장치에서 제대로 실행될 수 있지만 목표로 하는 가장 낮은 장치의 성능을 고려하십시오. 3. 120fps 장치를 널리 사용할 수 있게 되면
고려사항 1. 불투명도 - 애니메이션에서 사용하지 말것 - 대신, AnimatedOpacity 또는 FadeInImage를 사용 2. AnimatedBuilder - 애니메이션에 의존하지 않는 위젯을 빌드하는 빌더 함수에 하위 트리를 넣지 않기 - 이 하위 트리는 애니메이션의 모든 틱에 대해 다시 렌더링 됩니다. - 대신, 하위 트리의 해당 부분을 한 번 빌드하고 AnimatedBuilder에 자식으로 전달합니다. 3. 클리핑 및 모서리가 둥근 사각형 - 애니메이션에서 클리핑을 하지 말것 - 기존 위젯에서도 최대한 borderRadius를 사용할 것 - 가능하면 애니메이션을 적용하기 전에 이미지를 미리 잘라냅니다. 4. 화면에 표시되지 않는 경우 Column, ListView 피하기 - 빌드 비용을 피하기 위해 대부분의 자식이 화면에 표시되지 않는 경우 구체적인 자식 목록(예: Column() 또는 ListView())이 있는 생성자를 사용하지 않기 5. ShaderMask, Col
키보드 높이 구하기 # 키보드 높이 구하기 MediaQuery.of(context).viewInsets.bottom 참고영상
Timeline # "startSync"와 "finishSync" 사이에 처리될 로직을 넣고 측정 할 수 있습니다. void test() { Timeline.startSync("test function start"); for(int index = 0; index < 10000; index++) { print(index); } Timeline.finishSync(); } ※ "profile" 모드에서 실행해야 성능지표 타임라인에 표시됩니다.
쓰레드 사용 # 많은 데이터를 한번에 가져올때 UI가 버벅거리거나 움직이지 않는 현상이 발생될 수 있습니다. 이런 경우 "compute"를 이용하여 별도의 쓰레드를 만들어 처리하면 됩니다. # Bad Case // 응답 결과를 List<Photo>로 변환하는 함수. List<Photo> parsePhotos(String responseBody) { final parsed = json.decode(responseBody).cast<Map<String, dynamic>>(); return parsed.map<Photo>((json) => Photo.fromJson(json)).toList(); } Future<List<Photo>> fetchPhotos(http.Client client) async { final response = await client.get('https://jsonplaceholder.typicode.com/photos'); return parsePhotos(res
다른 앱 비교 # 쉬머를 사용했을때 데이터를 불러올때 좋은 효과를 줄 수 있는것은 분명한것 같다. 하지만, 다른 여러 앱(안드로이드 등)들을 확인해봤을때 초기에 로딩 인디케이터를 보여주고 바로 데이터를 보여준다. 그래서 핸드폰에 설치되있는 많은 앱들을 켜서 확인해보았다. 쉬머가 없는 앱 - 카카오톡 - 카카오네비 - 케이뱅크 - 스마일페이 - 쿠팡 - 당근마켓 - 번개장터 - 헬로마켓 - 크몽 - 핀터레스트 - 핀다 - 뱅크샐러드 - 배달의민족 - 야놀자 - 점핏 - 네모 - 넷플릭스 - 쿠팡플레이 - 왓챠 - 웨이브 - 쿠팡이츠 쉬머가 있는 앱 - 토스 : 주식 탭에만 쉬머가 들어가 있다. - PASS : 금융, 이벤트 탭에만 쉬머가 들어가 있다. - 롯데카드 - 로켓펀치 - 숨고 - 스푼 생각보다 많은 앱에서 쉬머를 사용하지 않거나 일부분만 사용한다. 대체적으로 사용하지 않고 로딩 인디케이터만 보여주는 경우가 대부분이다. 쉬머를 사용해본 사람으로써 개인적인 의견으로 분석해보자면,
경고 문구 Warning: Mapping new ns http://schemas.android.com/repository/android/common/02 to old ns http://schemas.android.com/repository/android/common/01 Warning: Mapping new ns http://schemas.android.com/repository/android/generic/02 to old ns http://schemas.android.com/repository/android/generic/01 Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/addon2/02 to old ns http://schemas.android.com/sdk/android/repo/addon2/01 Warning: Mapping new ns http://schemas.android.com/sdk/and
구조적 패턴 매칭 "switch"랑 동일하다 match "변수값": case ["quit"]: quit() case ["load", filename]: load_from(filename) case ["save", filename]: save_to(filename) case _: print (f"Command '{command}' not understood") 더 정확해진 오류 보고 # 기존 print ("Hello" print ("What's going on?") File ".\test.py", line 2 print ("What's going on?") ^ SyntaxError: invalid syntax # 새로운 File ".\test.py", line 1 print ("Hello" ^ SyntaxError: '(' was never closed 매개변수 사양 변수 입력에 새로 추가된 2가지, "typing.ParamSpec" 과 "typing.Concatenate"를 사용하면
딕셔너리 병합(merge), 갱신(update) 연산자 병합 연산자 : | 갱신 연산자 : |= ※ "Python3.7" 버전부터는 딕셔너리 순서가 보존된다. # 병합 연산자 google = {'android': 11} apple = {'ios': 14} google | apple >>> {'android': 11, 'ios': 14} apple | google >>> {'ios': 14, 'android': 11} 갱신 연산자 리스트를 딕셔너리로 바꿀 때, 리스트 내에 중복 데이터가 존재하는 경우에도 갱신 연산자로 손쉽게 처리할 수 있습니다. data = [('stock', 1), ('stock', 2)] aligned = {} for k, v in data: aligned |= {k: v} >>> aligned {'stock': 2} 문자열의 접두사, 접미사를 삭제하는 removeprefix(), removesuffix() 메서드 추가 다른 문자열 조작 메서드와 마찬가지로, 문자
Python3.10 설치 아래에서 다른 버전(python3.9 등)으로 설치해줘도 된다. sudo apt install software-properties-common -y sudo add-apt-repository ppa:deadsnakes/ppa Python3.10에 지원하는 "dev", "venv" 패키지만 설치 sudo apt install -y python3.10 python3.10-dev python3.10-venv Python3.10에 지원하는 다른 패키지까지 설치 sudo apt install -y python3.10 python3-dev python3-venv python3-distutils python3-lib2to3 python3-gdbm python3-tk libpq-dev python3-pip sudo apt -y install libpq-dev python3-dev sudo apt -y install build-essential sudo apt -y inst
문제 원인 "FastAPI"를 사용 중이며, "pydantic"에서 "Python3.10"에서 지원하는 "|" 유니온 타입이 지원이 되고 있지 않다고 합니다. 차후 "pydantic"에서 버그 및 문제를 해 결해야 사용해 볼 수 있을 것 같습니다. 당분간 이전 방식으로 "Optional[]" 방식으로 사용해야 될 것 같습니다. class UserBase(BaseModel): id: Optional[str] = None 참고 링크 python 3.10 TypeError: Fields of type "<class 'types.UnionType'>" are not supported. - Google Search All Videos News Images Maps Shopping Books Search tools Pydantic fails with Python 3.10 new UnionType · Issue #3300 - GitHub github.com › samuelcolvin › pyda
고유한 ID 만들기 id = Column(String(120), primary_key=True, default=lambda: str(uuid.uuid4()))
설치하기 레포지토리 업데이트 sudo apt -y install gnupg2 wget vim sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt -y update "postgreSQL 14" 설치 sudo apt -y install postgresql-14 버전 확인 psql --version PostgreSQL 접속 sudo -i -u postgres 위 명령어 입력하면 유저가 변경되고, 아래 명령어를 통하여 접속 가능 psql 아래 명령어는 바로 접속이 가능하다. sudo -u postgres psql 비밀번호 변경 ALTER U
orm_mode "pydantic"에서 제공하는 "orm_mode"를 이용하여 반환 모델을 만들 경우, ORM JSONEncoder에 의해 자동으로 "json"으로 변환해주기 때문에 별도로 "JSONResponse" 등의 객체를 이용할 필요가 없습니다. # Response class ResponseMemo(BaseModel): id: str title: str content: Optional[str] = None is_favorite: bool class Config: orm_mode = True
파라미터 옵션 변경 RDS로 이동하여 "파라미터 그룹"에서 아래에 해당하는 파라미터를 검색하여 수정 아래 항목을 "utf8"으로 변경 character_set_client character_set_connection character_set_database character_set_filesystem character_set_results character_set_server 아래 항목을 "utf8_general_ci"으로 변경 collation_connection collation_server 아래 항목 타임존 "Asia/Seoul" 변경 time_zone ※ 수정사항이 반영되었다면 재부팅을 꼭 해줍니다. 이모지 사용의 경우 아래 항목을 "utf8mb4"으로 변경 character_set_client character_set_connection character_set_database character_set_results character_set_server 아래 항목을 "utf
버튼 만들기
작성예정...
AWS CLI 설치 "Windows PC" 버전 https://awscli.amazonaws.com/AWSCLIV2.msi "Mac OS" 버전 https://awscli.amazonaws.com/AWSCLIV2.pkg 설정 버전 확인 aws --version 계정 설정 aws configure "configure" 예제 AWS Access Key ID [None]: QWHEHVKLBBLEKWC;D AWS Secret Access Key [None]: 79461qwpiz/ewoerpd85eqwWRB Default region name [None]: ap-northeast-2 Default output format [None]: json 명령어 단일 파일 업로드 (버킷내 특정 폴더로 넣을 경우 "s3://버킷이름/폴더/" 이렇게 지정해주면 된다.) aws s3 cp C:\Users\test\Desktop\test\테스트파일1.txt s3://버킷이름/music/ 폴더 내 파일 다중 업
Generic Types 오브젝트 설명 BigInteger Bigger Integers SmallInteger Small Integers Integer Integers Boolean Bool Date Date DateTime DateTime Float Float (소수점) String String(255) Text Text Interval datetime.timedelta() Time datetime.time() LargeBinary 바이너리 데이터 MatchType https://docs.sqlalchemy.org/en/14/core/type_basics.html#sqlalchemy.types.MatchType Numeric DECIMAL PickleType https://docs.sqlalchemy.org/en/14/core/type_basics.html#sqlalchemy.types.PickleType SchemaType 스키마 DDL Unicode 가변 길이 유니코드 문자열
해결방법 보통 엔드 포인트를 포함한 경로가 확실하지 않을때 발생됩니다. "main" 앱에 "redirect_slashes" 옵션을 추가하여 해결합니다. app = FastAPI() app.router.redirect_slashes = False 또 다른 문제로 특정 라우터의 기본 경로가 아래인 경우에는 위에서 설정한 리다이렉트가 되지 않아 경로를 찾을 수 없다고 나옵니다. @router.get('/', response_model=SomePydanticModel) 아래 처럼 경로를 추가해주고, API 문서에는 중복으로 보이기 때문에 "include_in_schema" 옵션을 추가합니다. @router.get("/", response_model=SomePydanticModel) @router.get("", response_model=SomePydanticModel, include_in_schema=False)
gunicorn "gunicorn"을 실행하려고 하니 "module 'collections' has no attribute 'MutableMapping'" 같은 오류 발생했다. 앞에 명시적으로 "python3 -m"을 붙여주고 실행하면 된다. 관련 오류로 이슈가 있는것 같긴하나 아래 명령어로 진행하면 우선은 된다. python3 -m gunicorn -k uvicorn.workers.UvicornWorker --access-logfile ./gunicorn-access.log --error-logfile ./gunicorn-error.log src.main:app --bind 0.0.0.0:8001 --workers 4 --daemon --timeout 3600
소개 리엑트(React) 개츠비(Gatsby)는 정적 웹 페이지를 만들기 적합한 CMS입니다. 특징 Gatsby는 빌드 시 "HTML" 확장자를 가진 파일로 별도의 "JS"를 불러오는 렌더링이 아닌 빌드 할 때에 모두 작성됩니다. 따라서, "정적 웹 페이지"를 만들기에 적합합니다. 여러 강력한 플러그인을 별도로 제공하고 있으며, Gatsby 공식 홈페이지에서 "클라우드 서비스"를 제공합니다. 또한, GraphQL을 이용하여 JS 객체로 저장하고 데이터를 가져올 때에 사용되는데 특정 JSON 파일을 읽어 데이터 풀에 저장한 후 사용된다. 의견 레거시 방법(HTML5, CSS3, JS)으로 정적 사이트를 충분히 만들 수 있지만 요즘은 프론트 기술들이 너무 좋기 때문에 여러 가지를 감안하면 레거시 방법을 절대 추천하지 않습니다. 필자는 간단한 브랜딩 사이트를 만들기 위해서 프론트(리엑트, 뷰, 스벨트 등)를 쓰지 않고 바닐라 HTML5, CSS3, JS를 이용하여 만들었지만, "프론트(리
소개 리엑트(React) 리믹스(Remix)는 리엑트 라우터(React-Router)를 만든 개발자가 만들었습니다. Remix는 원래 라이선스 비용을 지불하는 유료 프레임워크였는데, 최근에 무료로 변경되었습니다. 특징 Remix는 프로젝트를 시작할 때 어떤 종류의 서버에서 배포할 건지 선택하게 됩니다. 그 이유는 서버 측에서 렌더링(HTML) 하여 페이지를 보여주기 때문입니다. 즉, 프론트 서버에서 "JS" 코드를 읽고 "HTML"으로 렌더링해서 보여줍니다. 이 결과로 유저는 하얀화면(인터넷 속도가 느린 경우 포함), 로딩중 화면을 볼일이 없습니다. (서버사이드 렌더링) 다만, 데이터를 불러오고 보여주는 과정이 조금 다릅니다. "loader"라는 함수를 통하여 "API"를 요청하고 UI 단에서는 "useLoaderData"를 통해서 데이터를 보여주게 됩니다. 이렇게 통해 불러오게 되는 데이터는 프론트 서버 내부에서 호출해서 가져오고 실제로 유저는 이미 HTML로 변환된 화면을 보게
호출주소 변경 권한 문제로 플러터에서 백엔드 호출시 주소를 "localhost", "127.0.0.1"로 하면 안됩니다. 현재 나의 IP를 확인하시고, 백엔드 HOST 부분을 "0.0.0.0" 형식으로 모두 허용되게끔 되어있는지 체크해주시고 플러터에서 백엔드 호출 주소를 나의 아이피로 변경해주시면 됩니다. http://192.168.42.12:8001
rotuer @router.post("/user", tags=["user"], response_model=schemas.User) @router.post("user", tags=["user"], include_in_schema=False) def create_users(schemas: schemas.UserCreate, db: Session = Depends(get_db)): try: # 유저 생성 user = crud.UserCreate(schemas=schemas, db=db) # 유저 추가 확인 if user is False: raise Exception("유저 생성에 문제가 발생했습니다.") # 문제가 없을 경우 "200" 리턴 return JSONResponse(status_code=200, content={ "status": "success", }) except Exception as e: return JSONResponse(status_code=400, content={
데이터베이스 연결 "postgreSQL" 연결시 비밀번호 마지막에 특수문자 포함되어 있으면, 그 다음에 오는 "@{host}" 이 부분과 오류가 발생한다. 아직 명확한 해결방법은 찾지 못하여, 비밀번호를 간단하게 변경했다. engine = create_engine("postgresql://{username}:{password}@{host}:{port}/{db_name}".format( username='postgres', password='postgres', host='127.0.0.1', port='5432', db_name='테이블이름' )) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base()
서버 포트가 다른 경우 서버 접근 포트(80, 443)가 다른 경우 별도의 "SSHTunnelForwarder"을 사용하여 접근 합니다. server = SSHTunnelForwarder( ("아이피", 포트), ssh_username="아이디", ssh_password="비밀번호", remote_bind_address=("127.0.0.1", 3306) ) server.start() local_port = str(server.local_bind_port) engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format("root", "비밀번호", "127.0.0.1", local_port, "데이터베이스"), pool_recycle=500, pool_size=20, max_overflow=20, echo=False, echo_pool=True) SessionLocal = sessionmaker(autocommit=False, auto
플러그인 설치 timeago | Dart Package A library useful for creating fuzzy timestamps. (e.g. "15 minutes ago") pub.dev 초기화 "main.dart"에서 실행시 "timeago"를 한국어로 초기화 시켜줍니다. import 'package:timeago/timeago.dart' as timeago; void main() async { timeago.setLocaleMessages('ko', timeago.KoMessages()); runApp(const MyApp()); } 사용방법 아래 처럼 데이터를 받아서 넣어주거나 timeago.format(DateTime.parse(data['created_at']), locale: "ko") 공식 예제처럼 처리해주면 된다. final fifteenAgo = DateTime.now().subtract(Duration(minutes: 15)); print(timeago.
초기화 flutter clean flutter pub cache repair
시스템 환경 변수 추가 시스템 환경 변수에 아래 경로를 추가해주면 된다. C:\Users\유저이름\Documents\flutter\.pub-cache\bin
플러터 버전 업그레이드 플러터 업그레이드 flutter upgrade 플러터 채널 확인 및 채널 "stable"으로 변경 flutter channel flutter channel stable 간혹, 플러터 업그레이드 이후 "warning" 오류들이 발생될 수 있는데 이런 경우에는 캐시 리페어를 해준다. flutter pub cache repair 기존 프로젝트도 펍 초기화 이후 재설치 한다. flutter clean flutter pub get flutter pub upgrade 버전 맞추기 "android\build.gradle" 파일 수정 "ext.kotlin_version = '1.6.10'" 으로 변경 classpath에 "com.android.tools.build:gradle:7.0.2"으로 변경 buildscript { ext.kotlin_version = '1.6.10' repositories { google() mavenCentral() } dependencies {
폰트 다운로드 Google Fonts Making the web more beautiful, fast, and open through great typography fonts.google.com 위의 구글 폰트를 이용 하여 사용하고자 하는 폰트를 다운로드 합니다. 폰트 적용 파일을 다운 받았다면 ".otf" 확장자를 가지고 있습니다. 프로젝트 내부에 "assets/fonts/" 폴더를 만들어 옮겨줍니다. "pubspec.yaml" 파일을 열어서 아래와 같이 추가해줍니다. flutter: uses-material-design: true # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg fonts: - family: NotoSansCJKkr fonts: - asset: assets/fonts/NotoSansKR-Thin.otf weight: 100 - asset: assets/fonts/NotoSansKR-Light.otf
캐시 초기화 "Runtime JAR files in the classpath should have the same version" 해당 오류는 kotlin 버전을 업그레이드한 후 문제가 발생할 수 있습니다. 이전 버전의 캐시가 남아 있을 수 있어 캐시를 초기화 해줍니다. 안드로이드 스튜디오에서 "file -> Invalidate Caches"를 통해서 재시작 해주시면 되고, 불가피 할 경우 "C:\Users\유저이름\.gradle\caches" 해당 경로로 이동하여 "caches" 폴더를 삭제해주시면 됩니다. 두번째로 "\android\app\build.gradle"에서 JDK 버젼을 8로 변경합니다. dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" }
launch.json 실행 및 디버그를 통해서 ".vscode" 폴더안에 "launch.json" 파일에 "args" 내용을 넣어주면 됩니다. { // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요. // 기존 특성에 대한 설명을 보려면 가리킵니다. // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요. "version": "0.2.0", "configurations": [ { "name": "probation", "cwd": "probation", "request": "launch", "type": "dart", "flutterMode": "debug", "args": [ "--no-sound-null-safety", "--cache-sksl", "--purge-persistent-cache", ] }, { "name": "probation (profile mode)", "cwd": "pr
Chip Widget Chip Widget 정보만 표시하고 삭제할 수 있는 간단한 표현을 할때 사용합니다. Chip( labelPadding: EdgeInsets.all(2.0), avatar: CircleAvatar( backgroundColor: Colors.white70, child: Text(label[0].toUpperCase()), ), label: Text( label, style: TextStyle( color: Colors.white, ), ), backgroundColor: color, elevation: 6.0, shadowColor: Colors.grey[60], padding: EdgeInsets.all(8.0), ); Action Chip Action Chip 비활성화할 수 없다는 점을 제외하고는 다른 칩과 속성이 동일하여 비활성화할 수 없습니다. ActionChip( elevation: 8.0, padding: EdgeInsets.all(2.0), avat
정규식(RegExp) "TextFormField"에서 사용하려면 아래와 같이 해주면 된다. inputFormatters: [ FilteringTextInputFormatter.allow(RegExp("[ㄱ-ㅎ가-힣]")), ], 별도로 컨트롤러 및 벨리데이션 형식으로 체크할때에는 아래 처럼 해주면 된다. RegExp _regExp = RegExp(r'[\uac00-\ud7af]', unicode: true); 한글만 RegExp("[ㄱ-ㅎ가-힣]"); 이메일 형식 (r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'); 소문자 + 숫자 + 특수문자 + 최소 6자리 이상 RegExp(r"^(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]
ListWheelScrollView ListWheelScrollView "ListView"와 다르게 조금 더 입체적으로 스크롤 형식을 만들 수 있습니다. 어떻게 보면 쿠퍼티노피커와 비슷하기도 합니다. 카드 및 인스타그램의 피드 형식으로 표현하면 더욱 좋아보입니다. ListWheelScrollView( itemExtent: 75, children: items, ) 참고 링크 Flutter - Using ListWheelScrollView Widget Examples How to use ListWheelScrollView in Flutter, including how to set magnifier, changing diamter radius, setting selectedd item changed listner, and so on. www.woolha.com
TextInputAction https://api.flutter.dev/flutter/services/TextInputAction.html 상수 (검은색 자주 사용) 설명 continueAction iOS 앱에서는 화면 상단에 '뒤로' 버튼과 '계속' 버튼이 나타나는 것이 일반적입니다. 그러나 키보드가 열려 있으면 이러한 버튼이 화면 밖에 숨겨지는 경우가 많습니다. 따라서 iOS에서 '계속' 리턴 키의 목적은 사용자가 텍스트를 입력할 때 '계속' 버튼을 사용할 수 있도록 하는 것입니다. done 사용자는 입력 그룹(예: 양식)에 입력을 제공했습니다. 이제 일종의 마무리 동작이 발생해야 합니다. emergencyCall 응급 서비스에 전화를 걸기 시작합니다. (안드로이드는 지원되지 않습니다.) go 사용자가 목적지를 나타내는 텍스트(예: 레스토랑 이름)를 입력했습니다. '이동' 버튼은 사용자를 이 대상에 해당하는 앱의 일부로 안내하기 위한 것입니다. join 사용자는 예를 들어 무선
WillPopScope UI 단 WillPopScope( onWillPop: () async => controller.handleWillPopScopeAction(), child: const Text("메인"), ) 컨트롤러 // 현재 시간 DateTime currentDateTime = DateTime.now(); // 뒤로가기 종료 Future<bool> handleWillPopScopeAction() async { DateTime now = DateTime.now(); if (now.difference(currentDateTime) > const Duration(milliseconds: 1000)) { currentDateTime = now; Fluttertoast.showToast( msg: "한번 더 누르면 앱이 종료됩니다", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, ), } else { exit(0);
차이점 "Inkwell"과 "GestureDetector" 둘다 모두 많은 제스쳐를 포함합니다. "GestureDetector"가 더 많은 제스쳐가 있습니다. Inkwell 단, "GestureDetector"은 "Inkwell"에서 제공되는 리플(잔물결) 효과는 없습니다. 드래그와 같은 여러 제스쳐가 필요하다면 "GestureDetector"을 사용하면 되며, 간단한 제스쳐의 경우에는 "Inkwell"을 사용하시면 됩니다. 추가로 리플 효과가 없어야 되는 경우에도 "GestureDetector"을 사용하면 됩니다. 참고 링크 Flutter: InkWell vs GestureDetector: what is the difference? I'm completely new to Flutter and found out about InkWell and GestureDetector. It seemed to me that they are almost the same. The official do
임시 조치 크론탭을 이용하여 1초마다 프로세스 강제 종료 sudo vi /etc/crontab 아래 내용을 입력 후 저장 * * * * * sudo pkill -9 -f kthreaddk * * * * * sleep 01; sudo pkill -9 -f kthreaddk * * * * * sleep 02; sudo pkill -9 -f kthreaddk * * * * * sleep 03; sudo pkill -9 -f kthreaddk * * * * * sleep 04; sudo pkill -9 -f kthreaddk * * * * * sleep 05; sudo pkill -9 -f kthreaddk * * * * * sleep 06; sudo pkill -9 -f kthreaddk * * * * * sleep 07; sudo pkill -9 -f kthreaddk * * * * * sleep 08; sudo pkill -9 -f kthreaddk * * * * * sleep 09;
라이프사이클 포그라운드 -> 백그라운드 - inactive -> pause 백그라운드 -> 포그라운드 - resumed Back 키를 통한 앱 종료 - inactive -> pause -> detached 플러터 수정 controller.dart GetX에서는 "controller"에서 "WidgetsBindingObserver" 상속시켜준다. GetX가 아닌 경우에는 "UI"단에서 "Statefulwidget" 상태에서 진행해주면 된다. class TestController extends GetxController with WidgetsBindingObserver { @override void didChangeAppLifecycleState(AppLifecycleState state) { switch (state) { case AppLifecycleState.resumed: Logger().d("app in resumed"); break; case AppLifecycleState.
shimmer shimmer | Flutter Package A package provides an easy way to add shimmer effect in Flutter project pub.dev Shimmer.fromColors( baseColor: Colors.grey.shade300, highlightColor: Colors.grey.shade100, child: Container( width: 100, height: 100, decoration: const BoxDecoration( shape: BoxShape.circle, color: Colors.white, ), ), ),
pubspec.ymal 라이브러리 추가 firebase_messaging: ^11.2.8 flutter_local_notifications: ^9.3.3 google-services.json google-services.json 파이어베이스에서 앱등록시 "google-services.json" 파일을 받을 수 있습니다. 해당 파일을 "android/app/src/" 위치에 넣어주면 됩니다. mainfest.xml AndroidManifest.xml "android\app\src\main\AndroidManifest.xml" 위 파일을 열어 아래 권한을 추가합니다. <manifest .... <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:nam
Schema - pydantic Schema Pydantic allows auto creation of JSON Schemas from models: from enum import Enum from pydantic import BaseModel , Field class FooBar ( BaseModel ): count : int size : float = None class Gender ( str , Enum ): male = 'male' female = 'female' other = 'other' not_given = 'not_given' class MainMo... pydantic-docs.helpmanual.io
Service 이 클래스는 GetxController와 같으며 동일한 수명 주기onInit(), onReady(), onClose()를 공유합니다. 그러나 그 안에는 '논리'가 없습니다. GetX Dependency Injection 시스템에 이 하위 클래스를 메모리에서 제거할 수 없음을 알립니다. main.dart void main() { initServices(); runApp(const MyApp()); } void initServices() async { // FCM Service 초기화 // permanent는 메모리에서 삭제되지 않고 고정되게 합니다. Get.put(FCMService(), permanent: true); } fcm_service.dart class FCMService extends GetxService { @override // ignore: unnecessary_overrides void onInit() async { .... } }
permission permission_handler | Flutter Package Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions. pub.dev "permission_handler" 라이브러리를 설치해줍니다. 권한 목록 Android IOS 권한 목록 (블루투스)Bluetooth Sharing – NSBluetoothPeripheralUsageDescription (달력)Calendar – NSCalendarsUsageDescription(전화 관련)CallKit – NSVoIPUsageDescription(카메라) velog.io AndroidManifest.xml flutter-permission-handler/AndroidManifest.xml at master · Baseflow/flutter-permis
CI 이전 방법 Jeknis (Pull Request Builder) Gihub WebHook PR(Pull Request) Trigger 현재 방법 Gihub Actions CD 플러터 Jenkis fastlane
PyFCM 설치 pip3 install pyfcm FCM 전송 대상 1. FCM 특정 대상 알림 전송 (1명, 회원 대상) 2. FCM 다중 알림 전송 (다중, 회원 대상) 3. FCM 비회원 유저 알림 전송 (공지 및 이벤트 등) ※ 이외 기능에 따른 FCM 알림 해당 기능에 매칭된 CRUD에서 개별 처리 ※ 알림 허용에 따른 전송 단일 대상 전송 토큰값을 이용해 1명에게 푸시알림을 전송함 "data_message"를 통하여 원하는 데이터를 전송한다. 예로들면, 푸시 알람 클릭시 이동될 특정 이벤트 화면이나 이후 로직을 처리해주면 된다. PUSH_SERVICE = FCMNotification("FCM 콘솔에 있는 API Key") result = PUSH_SERVICE.notify_single_device( registration_id="전송 대상 FCM Token", message_title="제목", message_body="내용", data_message={ "url": "/
FCM과 IAM 차이점 "FCM(FireBase Cloude Messageing)"은 백그라운드 상태에서도 푸시알림을 보낼 수 있습니다. 다만, 과도한 알림은 사용자 경험을 낮추게 됩니다. "IAM(In-App Messageing)"은 앱 내부에서만 보여주게 됩니다. 따라서, FCM과 IAM 혼용하여 적절하게 사용하는것이 좋습니다. pubspec.ymal 라이브러리 추가 firebase_in_app_messaging: ^0.6.0+9 firebase_app_installations: ^0.1.0+8 google-services.json google-services.json 파이어베이스 콘솔에서 "In-App Messageing" 항목을 선택하여 구글애널리틱스를 추가하고 "google-services.json" 파일을 다운로드 받을 수 있습니다. 만약, 기존에 FCM(FireBase Cloude Messageing)으로 "google-services.json"을 이미 설정하였다면 넘어
GA 애널리틱스(Analytics) "GA (Google Analytics)"은 앱의 통계 및 유저 참여에 대한 측정을 할 수 있습니다. 즉, 사용자가 어떠한 행동을 하는지 파악 할 수 있습니다. pubspec.ymal 라이브러리 추가 firebase_core: ^1.13.1 firebase_analytics: ^9.1.2 android/build.gradle android/build.gradle "android/build.gradle" classpath 'com.google.gms:google-services:4.3.10' android/app/build.gradle android/app/build.gradle "android/app/build.gradle" implementation 'com.google.firebase:firebase-analytics' 플러터 수정 "ga_service.dart" 파일을 만들어서 상시 컨트롤러가 고정될 수 있도록 메인에 불러오겠습니다. main
IAP 인앱결제(In-App Purchase) 인앱결제는 구글에서 지원하는 내부 결제로 수수료는 외부 결제사 보다 높지만 구현하기가 다소 편합니다. 외부 결제의 경우 특정 상황에 따라서 리젝 사유에 해당되기 때문에 특별한 경우가 아니라면 인앱결제로 진행하는게 여러가지로 좋습니다. pubspec.ymal 라이브러리 추가 in_app_purchase: ^3.0.1 android/app/src/main/AndroidManifest.xml "android\app\src\main\AndroidManifest.xml" <uses-permission android:name="com.android.vending.BILLING" /> Google Play Console 구글 플레이스토어 콘솔로 이동하여 "앱 만들기"를 통해서 앱을 만든 후 출시에 필요한 모든 조건들을 충족한 뒤 인앱 결제를 테스트 하기 위해서는 빌드된것을 업로드 하여야 테스트를 해볼 수 있습니다. 여기서 디버그키가 아닌 실제 릴리즈
부트페이(bootpay) 부트페이 개발문서 기타문서 Flutter 결제구현 방식 Flutter는 구글에서 개발한 모바일 앱 개발 프레임워크로, Dart를 언어로 하며, 안드로이드, iOS로 빌드됩니다. Flutter는 skia 기반으로 렌더링하는데, 이는 웹 개발의 HTML과는 다른 방식이며, 네이티브급 성능과 UI를 제공하는 크로스 플랫폼 프레임워크입니다. Flutter에서는 MethodChannel을 통해 Native Library와 통신할 수 있습니다. 따라서 쉽게 Bootpay를 이용할 수 있으며, 샘플 코드를 제공합니다. main.dart import 'dart:a... docs.bootpay.co.kr 부트페이 개발문서 PG 결제 - Flutter/토스/휴대폰소액결제 매뉴얼 PG 선택 결제수단 선택 휴대폰소액결제 신용카드 계좌이체 가상계좌 언어별 보기 선택 웹 Android Android 웹앱 iOS Swift iOS ObjC iOS 웹앱 Flutter React Nati
페이플(payple) 페이플(Payple)은 부트페이(BootPay)와 동일한 결제 시스템 입니다 개인적으로 페이플을 다른 프로젝트(웹 등)에 써본 결과 굉장히 만족스러웠던점을 감안하여, 페이플에서도 플러터 공식 지원을 계기로 정리를 해볼 예정입니다. iamport_flutter 0.9.12 | Flutter Package Plugin that allows Flutter to use Iamport payment and certification functions. pub.dev 정리예정...
FractionallySizedBox FractionallySizedBox 넓이, 높이를 퍼센트로 범위를 지정 할 수 있습니다. FractionallySizedBox( widthFactor: 0.7, child: Text("TEST"), ), 참고 링크
예제코드 FloatingActionButton class TestUi extends GetView<TestController> { const TestUi({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Scaffold( // "extendBody"를 해야 홈이 파인 틈 사이가 투명된다. extendBody: true, appBar: AppbarWidget(appBar: AppBar()), body: SafeArea( child: Container( padding: const EdgeInsets.fromLTRB(40, 40, 40, 0), child: SingleChildScrollView( physics: const AlwaysScrollableScrollPhysics(), child: Column( children: const [ Text("테스트 페이지"), ], ), ), ), ), /
pubspec.yaml grouped_list | Flutter Package A Flutter ListView where the list items can be grouped into sections. pub.dev grouped_list: ^4.2.0 example example "GroupedListView"은 그룹을 분리하기 쉽고 채팅을 구현할때 편리한 라이브러리 입니다.
pubspac.yaml flutter_screenutil | Flutter Package A flutter plugin for adapting screen and font size.Guaranteed to look good on different models pub.dev flutter_screenutil: ^5.3.1 designSize 초기 "MaterialApp"에 사이즈를 초기화 시킬때 특정 디바이스 기준 사이즈로 초기화 시켜주면 해당 사이즈에 맞춰 넓이, 높이, 폰트사이즈를 비율에 맞게 설정해줍니다. 디자인 작업시 픽스된 모바일 디바이스 크기와 최대한 비슷하게 UI를 만들 수 있습니다. property 설명 width = 180.w 디자인 사이즈 기준 넓이 height = 180.h 디자인 사이즈 기준 높이 fontSize = 16.sp 디자인 사이즈 기준 폰트크기 위에 나와있는 표대로 사이즈 뒤에 "w", "h", "sp"를 설정해주면 "main.dart"에서 초기화한 디
pubspac.yaml flutter_dotenv | Flutter Package Easily configure any flutter application with global variables using a `.env` file. pub.dev 라이브러리 추가 flutter_dotenv: ^5.0.2 ".env" 파일 생성 후 추가 flutter: uses-material-design: true assets: - .env Initialize .env TEST="TEST123" main.dart void main() async { await initServices(); runApp(const MyApp()); } Future<void> initServices() async { // env 초기화 await dotenv.load(fileName: ".env"); } 값 불러오기 dotenv.env['TEST'] => TEST123 참고 링크 Flutter 환경설정 파일 적용 (기본)
pubspac.yaml hive | Dart Package Lightweight and blazing fast key-value database written in pure Dart. Strongly encrypted using AES-256. pub.dev hive_flutter | Flutter Package Extension for Hive. Makes it easier to use Hive in Flutter apps. pub.dev hive_generator | Dart Package Extension for Hive. Automatically generates TypeAdapters to store any class. pub.dev 라이브러리 추가 dependencies: hive: ^2.0.6 hive_flutter: ^1.1.0 dev_dependencies: hive_generator: ^1.1.2 Hive Hive Docs GitHub Samples Pub.dev
요약 설명 kafka broker - "kafka"라는 스트리밍 분산 처리 플랫폼에서 유연한 큐(Queue) 역할을 하는 서버(Server)이다. kafka Consumer - 클라이언트(Client)로 데이터를 조회한다. kafka Producer - 클라이언트(Client)로 데이터를 넣어준다. 위에 3가지를 모두 관리해주는것이 주키퍼(Zookeeper)이다. JDK 설치 sudo apt update sudo apt -y install default-jdk Kafka 설치 Apache Kafka Apache Kafka: A Distributed Streaming Platform. kafka.apache.org 아파치 카프카(Apache Kafka) 설치 Previous image Next image kafka 위에 사진처럼 "Binary downloads"에서 받아야 합니다. 현재 날짜 기준 "Scala 2.13 - kafka_2.13-3.1.0-tgz"를 받았습니다. wget
설치 Releases · tporadowski/redis Native port of Redis for Windows. Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Se... github.com 위 링크를 통하여 최시버젼의 레디스(Redis) 설치 CLI 실행 설치파일로 설치했을때 경로 "CMD"을 열어 경로 이동 후 "redis-cli.exe" 실행 cd C:\Program Files\Redis redis-cli.exe 압축파일의 경우 파일 내부에 "redis-cli.exe" 파일 실행 이후에는 "127.0.0.1" 로컬로 레디스를 연결해주면 사용이 가능합니다. 명령어 명령어 설명 info 레디스 설정 정보 monitor 모니터링 keys *
최신버전 설치 Redis Download Stable releases liberally follow the usual major.minor.patch semantic versioning schema. Unstable This is where all the development happens. Only for hard-core hackers. Use only if you need to test the latest features or performance improvements. This is going to be the next Redis release i... redis.io 레디스(Redis) 스테이블 버전으로 다운로드 wget https://download.redis.io/releases/redis-6.2.6.tar.gz 압축풀기 tar xzf redis-6.2.6.tar.gz sudo rm -rf ./redis-6.2.6.tar.gz 설치하기 cd redis-6.2.6 mak
pubspac.yaml liquid_swipe | Flutter Package A Flutter plugin to implement liquid Swipe effect to provided widgets. pub.dev smooth_page_indicator | Flutter Package Customizable animated page indicator with a set of built-in effects. pub.dev liquid_swipe: ^2.1.1 smooth_page_indicator: ^1.0.0+2 적용하기 Liquid Swipe ui.dart class LiquidSwipeUi extends GetView<LiquidSwipeController> { const LiquidSwipeUi({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Obx( () => Scaffold(
Tools Flutter Shape Maker | Auto-Generate Custom Paint Code for your Flutter Apps Flutter Shape Maker auto-generates Responsive code for Flutter Custom Paint Widget based on the shape you draw on the Canvas shapemaker.web.app 위에 쉐이프 메이커는 도형을 쉽게 그리고 코드를 얻을 수 있는 툴입니다. 적용하기 ClipPath ui.dart class ClipPathUi extends StatelessWidget { const ClipPathUi({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Scaffold( appBar: AppbarWidget(appBar: AppBar()), body: SafeArea( child:
Dart Exceptions 예외타입 설명 DefferedLoadException 지연된 라이브러리 로드에 실패하면 throw됩니다. FromatException 문자열 또는 기타 데이터에 예상 형식이 없고 구문 분석 또는 처리할 수 없는 경우 throw되는 예외입니다. IntegerDivisionByZeroException 숫자를 0으로 나눌 때 발생합니다. IOEException 모든 IO(입출력) 관련 예외에 대한 기본 클래스입니다. IsolateSpawnException 격리된 파일을 만들 수 없을 때 발생합니다. TimeoutException 비동기 결과를 기다리는 동안 예약된 시간 초과가 발생하면 throw됩니다. NullRejectionException null 또는 정의되지 않은 값으로 약속이 거부된 경우의 예외입니다. 이것은 다른 값에 비해 null 또는 undefined로 약속이 거부될 때 사용자가 잡을 수 있도록 공개합니다. OSError 운영 체제의 오류에 대한
Celery란? Celery는 비동기 작업 큐(Queue)라고 생각하면 된다. 즉, 요청 처리가 오면 Celery에서는 태스크 큐(Task Queue)로 메세지(Message)를 통신하고 생성된 워커로 비동기적으로 작업을 진행한다. 메세지와 워커 사이에는 브로커(Broker)를 통하여 연결되어 있다. 메세지를 전송하기 위해서는 큐를 쌓을곳이 필요한데 처리속도가 빠른 레디스(Redis)를 활용하여 메세지 큐를 쌓고 워커로 비동기적으로 쌓인 일을 처리한다. 카프카(Kafka)와 차이점 샐러리와 카프카의 기술 스택은 "Message Queue" 범주에 속한것은 맞습니다. 샐러리는 분산 메세지 전달을 기반으로 하는 비동기 태스크 대기열(작업 대기열) 입니다. 실시간 작업에 중점을 두고 있고 예약도 지원합니다. 조금 더 확장된 형태로 높은 처리량이 필요한 경우에는 카프카를 이용하는게 좋습니다. 레디스(Redis) 설치하기 [Redis] 레디스 Window 설치하기 설치 위 링크를 통하여 최시
Overview: Faust vs. Celery — Faust 1.9.0 documentation from celery import Celery app = Celery ( broker = 'amqp://' ) @app . task () def add ( x , y ): return x + y if __name__ == '__main__' : add . delay ( 2 , 2 ) Faust uses Kafka as a broker, not RabbitMQ, and Kafka behaves differently from the queues you may know from brokers using AMQP/Redis/Amazon S... faust.readthedocs.io 작성예정...
Flutter blur_ui.dart class TestUi extends StatelessWidget { const TestUi({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Scaffold( backgroundColor: Colors.black, body: SafeArea( child: Stack( children: <Widget>[ Positioned( top: 0, left: 0, child: Image.network( "https://cdn.dribbble.com/users/2657768/screenshots/15118489/media/9ca2af6ee34f7734a9c3e5d2e39dad4c.png?compress=1&resize=400x300"), ), Positioned( top: 230, left: 10, child: SizedBox( width: 150, height: 5
프로젝트 생성 npx create-next-app 프로젝트명 타입스크립트 사용시 npx create-next-app 프로젝트명 --typescript Eslint, Prettier 설정하기 yarn add -D eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-react-hooks yarn add -D prettier eslint-config-prettier eslint-plugin-prettier yarn add -D babel-eslint eslint-plugin-babel yarn add -D @next/eslint-plugin-next 최상위 디렉토리에 ".eslintrc.json" 파일 생성 후 아래 내용 저장 { "env": { "browser": true, "es6": true, "node": true }, "parser": "bab
tsconfig.json 아래 내용 추가 "baseUrl": ".", "paths": { "components/*": [ "components/*" ], "config/*": [ "config/*" ], "pages/*": [ "pages/*" ], "styles/*": [ "styles/*" ] },
psycopg2 error 발생시 패키지 설치중 "psycopg2" 관련 오류 발생시 설치 sudo apt -y install libpq-dev python3-dev sudo apt -y install build-essential
pubspec.yaml iamport_flutter | Flutter Package Plugin that allows Flutter to use Iamport payment and certification functions. pub.dev iamport_flutter: ^0.10.1+2 안드로이드 설정 앱 스키마(App Scheme) 설정 "android\app\src\main\AndroidManifest.xml" "스키마이름://action" 으로 실행하면 "MainActivity"가 실행됩니다. AndroidManifest.xml <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <data android:host="action" android:scheme="스키마이름" /> </intent-filter>
캐스케이드(Cascade) model class User { String name = ""; int age = 0; String changeName(String value) => name = value; } cascade User user = User(); ..name = "Emma" ..age = "13" get, set User user = User(); ..name = "Emma" ..changeName("Aaron"); => Araon 참고 링크
pubspec.yaml flutter_staggered_grid_view | Flutter Package Provides a collection of Flutter grids layouts (staggered, masonry, quilted, woven, etc.). pub.dev flutter_blurhash | Flutter Package Compact representation of a placeholder for an image. Encode a blurry image under 30 caracters for instant display like used by Medium pub.dev flutter_staggered_grid_view: ^0.6.1 flutter_blurhash: ^0.6.4 언스플래시 가입하기 Beautiful Free Images & Pictures | Unsplash Beautiful, free images and photos that you can d
Error: ENOSPC: System limit for number of file watchers reached 위 오류는 서버 파일 감시자가 읽을 수 있는 한계에 도달했다고 하는것이기 때문에 아래 명령어로 제한을 풀어주시면 됩니다. 제한 확인 cat /proc/sys/fs/inotify/max_user_watches 제한 풀기 echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
폰트어썸 무료 적용 무료 버전의 경우에는 "solid"와 "regular"만 지원이 된다. 코어 설치하기 npm i --save @fortawesome/fontawesome-svg-core npm i --save @fortawesome/react-fontawesome@latest ----- yarn add @fortawesome/fontawesome-svg-core yarn add @fortawesome/react-fontawesome@latest SVG 설치하기 npm i --save @fortawesome/free-solid-svg-icons npm i --save @fortawesome/free-regular-svg-icons ----- yarn add @fortawesome/free-solid-svg-icons yarn add @fortawesome/free-regular-svg-icons Babel Macros 적용 동적 아이콘 가져오기를 사용하면 개별 아이콘을 선언할 필요
npm install npm i react-responsive ----- yarn add react-responsive useMediaQuery 아래와 같이 크기를 감지하여 "모바일", "PC"를 구분할 수 있고 실시간으로 "넓이", "높이" 값을 가져올 수 있다. import React from "react" import { useMediaQuery } from "react-responsive"; const Home = () => { const isResponsive = useMediaQuery({ query: '(max-width: 424px)' }); return ( <div className={isResponsive ? 'layout mobile' : 'layout pc'}> {isResponsive && ( <> 모바일 일때 </> )} {!isResponsive && ( <> PC 일때 </> )} </div> ); }; export default Home;
인터페이스 Interface 인터페이스(Interface) interface PeopleInterface { name: string age: number } const me1: PeopleInterface = { name: 'yc', age: 34, } 인터페이스 확장시 interface PeopleInterface { name: string age: number } interface StudentInterface extends PeopleInterface { school: string } 인터페이스 선언적 확장 같은 이름으로 인터페이스를 만든다면 자동으로 확장된다. 선언적 확장에 대해서는 타입(Type)은 불가능 하고 인터페이스는 가능하다. 그 예제는 아래와 같다. interface Window { title: string } interface Window { ts: TypeScriptAPI } 인터페이스는 객체에만 사용이 가능 interface FooInterface { valu
버튼 만들기
pubspec.yaml sticky_headers | Flutter Package Flutter Sticky Headers - Lets you place headers on scrollable content that will stick to the top of the container whilst the content is scrolled. pub.dev sticky_headers: ^0.2.0 적용하기 ui.dart class StickyHeaderUi extends GetView<TestController> { const StickyHeaderUi({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Scaffold( appBar: AppbarWidget(appBar: AppBar()), body: const SafeArea( child: StickyHeaderWidget(), ), ); }
package.json 스타일 컴포넌트(Styled Components) 설치 npm install styled-components ----- yarn add styled-components 바벨(babel) 설치 npm install --save-dev babel-plugin-styled-components npm install babe-preset-next ----- yarn add --dev babel-plugin-styled-components yarn add babe-preset-next .babelrc { "presets": ["next/babel"], "plugins": [ [ "styled-components", // https://www.npmjs.com/package/babel-plugin-styled-components/v/1.1.7 { "ssr": true, // 서버 측 렌더링 지원 여부 "displayName": true, // 클래스명에 해당 스타일 정보
스타일 컴포넌트 설치 [Next.js] 스타일 컴포넌트(Styled Components) 설정하기 package.json 스타일 컴포넌트(Styled Components) 설치 바벨(babel) 설치 .babelrc _documents.js "... blog.naver.com 파일 생성 "styles/theme/theme.ts" const color = { white: "white", black: "black", }; export const theme = { color, }; export type Theme = typeof theme; _app "<ThemeProvider>" 를 감싸주고 위에서 만든 글로벌 스타일 파일을 불러옵니다. import { ThemeProvider } from "styled-components"; import { theme } from "styles/theme/theme"; function MyApp({ Component, pageProps }: A
global.d.ts "global.d.ts" 파일 생성 후 아래 내용 넣기 declare module "*.css" { interface IClassNames { [className: string]: string; } const classNames: IClassNames; export = classNames; } tsconfig.json "include" 부분에서 위에서 만든 "global.d.ts" 파일 넣기 "include": ["global.d.ts", "next-env.d.ts", "**/*.ts", "**/*.tsx"], dynamic 이제 "import"를 통하여 ".css" 파일을 불러올 수 있습니다. import("styles/gloabal.css");
will-change 값 설명 auto 기본값 scroll-position 엘리먼트의 스크롤 위치가 바뀔때 contents 엘리먼트의 컨텐츠 중 일부가 바뀔때 opacity 투명도가 바뀔때 transform transform 값이 바뀔때 left, top 여러 속성을 동시 사용 (EX: will-change: left, top;) 참고 링크 will-change - CSS: Cascading Style Sheets | MDN will-change CSS 속성은 요소에 예상되는 변화의 종류에 관한 힌트를 브라우저에 제공케 한다. 그래서 실제 요소가 변화되기 전에 미리 브라우저는 적절하게 최적화할 수 있다. 이러한 종류의 최적화는 잠재적으로 성능 비용이 큰 작업을 그것이 실제로 요구되기 전에 미리 실행함으로써 페이지의 반응성을 증가시킬 수 있다. developer.mozilla.org
원인과 해결방법 데이터베이스를 새로 만들어 기존 백업 파일을 가져오는 상황에서 인덱스 부분이 매칭되지 않아서 발생되는 문제이다. idx는 자동증가이기 때문에 명시적으로 입력해주면 안된다. 기존 유저 테이블을 새로 만들면 해결이 되겠지만, 수동으로 idx 값을 재설정하여 해결하면 된다. SELECT setval('users_id_seq', (SELECT MAX(id) from "users")); 참고 링크 Python/ Django Key already exists. Postgres I Have a project built in django and it uses a postgres database. This database was populated by CSVs files. So when I want to insert a new object I got the error "duplicated key" because the objec... stackoverflow.com
천지인 키보드 대응 RegExp('[ㄱ-ㅎ|가-힣|ㆍ|ᆢ]') 참고 링크 Flutter TextField에서 'FilteringTextInputFormatter.allow' 한글 허용시 주의사항 프로그래밍 정보를 다루는 블로그입니다. Let's cool programing! blogdeveloperspot.blogspot.com
Install npm install zustand ----- yarn add zustand Store 생성 "store/useStore.js" import create from "zustand"; const useStore = create((set) => ({ count: 1, inc: () => set(state => ({ count: state.count + 1 })), dec: () => set(state => ({ count: state.count - 1 })) })); export default useStore; Store 사용 const { count, inc, dec } = useStore(); return ( <> <span>{count}</span> <button onClick={inc}>up</button> <button onClick={dec}>down</button> </> ) 참고 링크 Zustand - Redux, 간단하게 써보세요! "상태 관리" 하면 어떤
JSX https://goddaehee.tistory.com/296 JSX(JavaScript XML)는 Javascript에 XML을 추가한 확장한 문법이다. return 이 시작되는 엘리먼트는 1개만 지정하여 감싸는 형태여야 한다. const boolean = false; const variable = "World"; return ( <> <h1>Hello {variable}</h1> <p>{boolean ? "true 일때" : "false 일때"}</p> {/* 주석 */} <p className="description" // 주석 >{boolean ? (<div>엘리먼트도 넣을 수 있다</div>) : (<div>엘리먼트도 넣을 수 있다</div>)}</p> </> ) 참고 링크 [React] 2. JSX란? (정의, 장점, 문법) 2. JSX란? (정의, 장점, 문법) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ [React 에서 사용하는 JSX ] 입니다. : ) 이번
페이지 이동 감지 import { useRouter } from "next/router"; const router = useRouter(); useEffect(() => { console.log("페이지 이동 감지"); }, [router]); 다른 방법 routeChangeStart 경로 변경 시작 beforeHistoryChange 브라우저 location 변경전 routeChangeComplete 경로 변경 완료 import Router from 'next/router'; Router.events.on('routeChangeStart', console.log); Router.events.on('beforeHistoryChange', console.log); Router.events.on('routeChangeComplete', console.log);
공지사항 예제 NoticeComponent.tsx const items = [ { id: 1, title: "First Accordion", content: "Hello", datetime: "2022-01-01" }, { id: 2, title: "Click me", content: "Hello 2", datetime: "2022-01-01" }, { id: 3, title: "Third Accordion Accordion", content: "Hello 3", datetime: "2022-01-01" }, ]; const NoticeComponent: React.FC<GenericProps> = ({}) => { const [isExpanded, setExpanded] = useState<string>(""); // 아코디언 타입 type AccordionGenericProps = { value: string; }; // 아코디언 상태 변경 const handleChange =
코드 "onLoad"를 통해서 실시간으로 높이 값 만큼 패딩값을 더해주면 자동으로 100% 효과를 얻을 수 있다. import Image from "next/image"; // Component const EventDetailRightComponent: React.FC<GenericProps> = ({}) => { const [paddingTop, setPaddingTop] = useState("0"); return ( <div className={styles.eventDetailContentBox} style={{ paddingTop }}> <Image src={items.image} layout="fill" objectFit="contain" aria-label="image" onLoad={({ target }) => { const { naturalWidth, naturalHeight } = target as HTMLImageElement; setPaddingTop(`calc(1
해결방법 설정 재설정 npm cache clean --force npm audit fix --force npm install -g cnpm --registry=https://registry.npm.taobao.org npm config set registry https://registry.npm.taobao.org/ --global npm config set registry https://registry.npmjs.org/ 네임서버 재설정 sudo rm /etc/resolv.conf sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf' sudo bash -c 'echo "[network]" > /etc/wsl.conf' sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf' sudo chattr +i /etc/resolv.conf 참고 링크 npm의 느린 다운로드 속도
해결방법 yarn config delete https-proxy yarn config delete proxy yarn config get https-proxy yarn config get proxy 참고 링크 Yarn - There appears to be trouble with your network connection. Retrying I have been trying to do the quickstart guide for react native, but kept getting this error There appears to be trouble with your network connection. Retrying... My connection works just fine. stackoverflow.com
const Component interface Props { name: string; } const Home: React.FC<Props> = ({ name }) => { return ( <div>Home</div> ) } functional Component interface Props { name: string; } function Home({ name } : Props) { return ( <div>Home</div> ) } 차이점 위에서의 차이점은 "React.FC" 입니다. "React.FC"를 유형으로 사용하려면 함수 유형 자체에 주석을 달아야 합니다. 매개 변수나 반환 값이 아니라 함수 값입니다. 함수 표현식(const Component)을 사용하면 적절한 상황에서 이러한 유형의 호이스팅이 가능하지만 TDZ(Temporal Dead Zone)를 유발할 수도 있습니다. 함수 선언(functional Component)이 더 안전한 선택입니다. 공식 문서에도 함수 선언(fu
Optional Properties 함수를 호출할때 해당 프로퍼티의 값이 생략되어도 된다고 표현할때 사용한다. function handler(name: any, age?: number) { .... } handler({ name: "john" }); // OK handler({ name: "john", age: 19 }); // OK
Defining a Union Type 타입을 2개 이상 조합하여 사용하는것이 조합형 유니온 타입이다. 하나의 유니온 타입을 구성하는 요소 타입을 유니온 멤버라고 한다. function handler(name: number | string) { .... } handler("john"); // OK handler(123); // OK handler(false); // NO 유니온을 사용하고 타입을 추론할때 "typeof"를 활용하면 된다. function handler(name: number | string) { if (typeof name === "string") { // 유니온 타입은 2개 이지만 타입을 추론하여 "string" 일 때 처리할 수 있다. } else { // "string" 타입이 아닌 "number" 일때 } }
Type Aliase type User = { name: string; age: number; }; function handler(user: User) { console.log(user.name); console.log(user.name); } function handler({ name, age }: User) { console.log(name); console.log(age); } handler({ name: "john", age: 19 }); 타입에도 유니온 타입을 적용할 수 있다. type User = { name: string; age: number; }; type UserReturn = number | string; function handler(user: User): UserReturn { return User; } 확장하는 방법은 아래와 같습니다. 참고로 "Type Aliase"는 같은 이름을 중복 선언하는 방식인 선언병합이 불가합니다. type PeopleType =
어썰션(Assertion) 아래와 같이 "HTMLCanvasElement"와 같은 수동으로 타입을 명시할때 어썰션(Assertion)을 사용할 수 있다. const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement; 꺽쇠 괄호(<>)를 이용하여 표현해줄 수도 있다. 다만, ".tsx"에서는 동작하지 않는다. const myCanvasAngleBracket = <HTMLCanvasElement>document.getElementById('main_canvas'); 어썰션(Assertion)은 타입의 특정성을 조절하는데에만 쓸 수 있다. const x = 'hello' as number; // Conversion of type 'string' to type 'number' maybe a mistake // because neither type sufficiently overlaps with the other.
Non-null Assertion Operator 표현식 뒤에 "!" 느낌표를 사용하게 되면, "null", "undefined" 타입이 아님을 명시할 수 있다. function liveDangerously(x?: number | null) { // No error console.log(x!.toFixed()); }
WAI-ARIA 접근성 항목 속성 기본값 설명 role HTML 기반의 애플리케이션의 다이얼로그 또는 콘텐츠를 분리하는 창 또는 다른 웹 애플리케이션의 UI 혹은 페이지를 마크업하는데 사용됩니다. aria-activedescendant string | undefined 메뉴, 그리드 및 도구 모음과 같은 포커스 가능한 여러 하위 항목이 포함된 대화형 요소에 대한 보조 기술에 대한 포커스를 관리하는 방법을 제공합니다. aria-atomic boolean | undefined https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-atomic aria-autocomplete "list" | "none" | "inline" | "both" | undefined 입력 텍스트가 콤보 상자, 검색 상자 또는 텍스트 상자에 대해 사용자가 의도한 값에 대한 하나 이상의 예측 표시를 트리거할 수 있는지 여부를 나
Readonly 타입앞에 "readonly"를 붙여주면, 읽기전용으로 값을 변경 할 수 없다. type User = { readonly name: string; age?: number; } const handler = (name:string) : User => ({name}) const test = handler("john"); test.name = "abc"; // Error
Call Signatures 일반적인 방법 function handler(a:number, b:number): number { return a + b; } "Call Signatures" 방법으로 함수가 어떻게 작동하는지 서술할 수 있다. type Add = (a:number, b:number) => number; const handler:Add = (a, b) => a + b;
오버로딩(Overloading) 콜시그니쳐(Call Signatures)가 여러개 있는것이 오버로딩(Overloading) 이라고 한다. 아래와 같이 해당 콜 시그니쳐가 여러개 있을때 "b"는 "number, "string" 둘다 받을 수 있다고 되어있다. 이런 경우에는 "typeof"를 이용하여 타입 체크를 하고 처리하면 된다. type Add = { (a: number, b: number) : number; (a: number, b: string) : number; } const add: Add = (a, b) => { if (typeof b === "string") { return a; } return a + b; }
Polymorphism 콜 시그니쳐를 통하여 "number", boolean", "string"을 허용해줬지만 문제는 해당 배열에서 타입을 섞어서는 처리할 수가 없다. 왜냐하면 타입을 섞은 배열에 대한 콜 시그니쳐가 없기 때문이다. 이런 경우에는 "Polymorphism"의 "제네릭(Generic)" 이용하여 처리하면 된다. type array = { (arr: number[]): void; (arr: boolean[]): void; (arr: string[]): void; } const handler: array = (arr) => { arr.forEach(i => console.log(i)); } handler([1, 2, 3, 4]); // OK handler([true, false, true, false]); // OK handler(["a", "b", "c", "d"]); // OK handler(["a", 1, 2, false]); // ERROR 아래 처럼 제네릭 형태로
예시 데이터 [ { idx: 1, name: "바나나", price: 5000, }, { idx: 2, name: "토마토", price: 3500, }, { idx: 3, name: "고구마", price: 4500, } ] SSR: Server-side rendering getServerSideProps 정적이 아닌 주기적으로 데이터가 변경되어 표시될때 사용하면 됩니다. interface TempJson { idx: number, name: string, price: number, } interface Props { status: number; data: TempJson[]; } function Home({ data }: Props) { // API 오류 처리시 // 다른 화면을 보여주거나, 별도 처리 if (status) { return <ErrorPage statusCode={status} />; } ... } HelpCenterEventDetailPage.getInitial
Error pages/error.tsx function ErrorPage({ statusCode }: any) { return <p>{statusCode ? `An error ${statusCode} occurred on server` : "An error occurred on client"}</p>; } ErrorPage.getInitialProps = ({ res, err }: any) => { const statusCode = res ? res.statusCode : err ? err.statusCode : 404; return { statusCode }; }; export default ErrorPage; pages/tempPage.tsx 빌드 후 API 호출때 실패 여부를 "status" props로 전달받아서 컴포넌트 출력전에 오류페이지로 보여준다. interface DefaultProps { status: number; data: any; } function TempPa
nextjs-progressbar nextjs-progressbar Nprogress component for Next.js app.. Latest version: 0.0.14, last published: 2 months ago. Start using nextjs-progressbar in your project by running `npm i nextjs-progressbar`. There are 2 other projects in the npm registry using nextjs-progressbar. www.npmjs.com npm i nextjs-progressbar OR yarn add nextjs-progressbar NextNProgress <NextNProgress color="#29D" startPosition={0.3} stopDelayMs={200} height={3} showOnShallow={true} /> _app.tsx import NextNProgr
pubspec.yaml optimize_battery | Flutter Package Check for battery optimization status and open settings or disable it pub.dev optimize_battery: ^0.0.4 사용방법 배터리 사용량 중지가 켜져있을때 팝업을 띄우거나 설정창으로 보내는 함수를 이용하면 된다. 사용자에게 먼저 alert을 통해서 안내를 해주고 처리하는것도 좋다. OptimizeBattery.isIgnoringBatteryOptimizations().then((onValue) { if (!onValue) { // 배터리 최적화 중일때 // 배터리 Allow 팝업을 띄움 OptimizeBattery.stopOptimizingBatteryUsage(); } });
pubspec.yaml toast | Flutter Package A Flutter Toast plugin. pub.flutter-io.cn toast: ^0.3.0 여기서 중요한 것은 위젯에다가 "context"를 꼭 전달해줘야 토스트 배경색상등을 커스텀하여 변경할 수 있따. // ignore_for_file: non_constant_identifier_names, must_be_immutable import 'package:toast/toast.dart'; Future<dynamic> GlobalToastWidget({ required context, required String message, }) async { ToastContext().init(context); Toast.show(message, gravity: Toast.bottom); } GlobalToastWidget(context: context, message: "이미지가 저장되었습니다");
패키지 종속성 문제해결 pubspec.yaml 아래 입력 후 완전히 종료했다가 재실행하면 됩니다. dependency_overrides: photo_view: git: url: https://github.com/bluefireteam/photo_view ref: master
OS 비중 확인 Android OS version market share over time | AppBrain The most up-to-date data about the what the market share of Android OS versions are. www.appbrain.com OS一覧(Android) | スペック検索とシェア率が役立つ国内スマホ・タブレット機種情報サイト スマタブinfoは、機種情報×バグ情報がまとめて見つかる開発者向けスマホ・タブレット情報サイトです。AndroidとiOSの詳細な機種別スペックやシェア情報を揃えて機種選定にお役立ちできるだけでなく、不具合や機種依存の情報も追加していきます。 smatabinfo.jp Mobile & Tablet Android Version Market Share Worldwide | Statcounter Global Stats This graph shows the market share of mobile & tablet android version
버젼 확인 코틀린 버젼 체크 https://kotlinlang.org/docs/gradle.html#plugin-and-versions 그레들 버젼 체크 https://services.gradle.org/distributions/ 그레들 툴즈(플러그인) 버젼 체크 https://developer.android.com/studio/releases/gradle-plugin?hl=ko https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google 포스팅 기준 최신 버젼 변경 "android\build.gradle" ext.kotlin_version = '1.6.21' classpath 'com.android.tools.build:gradle:7.2.0' "android\gradle\wrapper\gradle-wrapper.properties" distributionUrl=https\://services.gradl
create_engine 아래와 같이 비밀번호 구간에서 특수문자가 들어가 있다면 문자열 인식이 잘못되어 연결이 안됩니다. 따라서, "quote"를 통하여 "urlencoded" 변환 후 입력해주시면 됩니다. from urllib.parse import quote DATABASE_URL = f"postgresql://{quote(ENV.DB_USERNAME)}:{quote(ENV.DB_PASSWORD)}@{ENV.DB_HOST}:{ENV.DB_PORT}/{ENV.DB_DATABASE}" engine = create_engine(DATABASE_URL, pool_recycle=ENV.DB_POOL_RECYCLE, pool_size=ENV.DB_POOL_SIZE, max_overflow=ENV.DB_MAX_OVERFLOW, echo=ENV.DB_ECHO, echo_pool=ENV.DB_ECHO_POOL)
JWT Auth Exception(예외처리) 종류 함수 설명 AuthJWTException 모든 fastapi_jwt_auth 오류가 확장되는 경우를 제외한 기준 InvalidHeaderError Header 또는 JWT 헤더 정보를 가져오는 동안 오류 발생 JWTDecodeError JWT 디코딩 오류 발생 CSRFError CSRF 시도시 오류 발생 MissingTokenError 토큰이 헤더에 없을때 발생 RevokedTokenError 만료된 토큰이 액세스하려고 할 때 발생 AccessTokenRequired 만료된 Access Token이 액세스하려고 할 때 발생 (jwt_required, jwt_optional, fresh_subt_required) RefreshTokenRequired 만료된 Refresh Token이 액세스하려고 할 때 발생 (jwt_sublic_required) FreshTokenRequired 만료되지 않은 Refresh Token이 유효하지 않을때
node 설치 다운로드 | Node.js Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. nodejs.org 설치 후 환경변수 적용을 위하여 재시작 (권장) 재시작 이후 CMD에서 명령어 확인 node -v npm -v 만약, CMD 에서 명령어가 안먹힌다면 환경변수 설정이 제대로 되지 않은것으로 확인해줍니다. flutterfire_cli 설치 해당 프로젝트 폴더 이동후 CMD에서 명령어 실행 dart pub global activate flutterfire_cli 파이어베이스에서 생성한 프로젝트 이름을 넣어주면 된다. flutterfire configure --project=프로젝트이름 FirebaseCommandException: An error occured on the Firebase CLI when attempting to run a command. 위와 같은 오류가 발생한 경우는 결국은 Nod
Java 버전에 따른 옵션 추가 Java9 버전 부터는 "default storetype"이 "pcks12" 라고 합니다. Java8은 기본 방법대로 사용하면 됩니다. 기존 방법 keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 뒤에 "-storetype JKS" 옵션을 넣으면 된다. keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key -storetype JKS 참고 링크 Flutter 앱 서명 key.jks 읽기 실패 Failed to read key key from store "android/app/key.jks" : Integrity check failed: java.security.NoSuchAlgorithmException: Algorithm Hmac
프로가드와 안드로이드 앱 통합 AGP 7 부터는 "ProGuard"와 "Android" 앱이 통합됩니다. 그렇기 때문에 프로가드를 별도로 설정해줄 필요가 없어서 삭제해주면 오류가 사라집니다. "app/build.gradle" 아래 항목들 삭제 및 이외 프로가드를 설정한 곳 파일 삭제 useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 참고 링크 [Flutter] No signature of method: build_ (gradle 7.0+) Flutter 난독화 메뉴얼에 언급된 useProguard를 제거하면 된다. 에러로그 FAILURE: Build failed with an exception. * Where: Build file '/Users/melody/dev/sliding_puzzle/android/app/build.gradle'.. nowoodeel
depcheck npm install depcheck -g or yarn global add depcheck 아래 명령어로 실행하여 종속되지 않는 패키지를 검색할 수 있습니다. depcheck 참고 링크 [node.js] package.json에서 사용되지 않는 npm 패키지를 찾으십시오. - 리뷰나라 package.json 파일에 더 이상 필요하지 않은 패키지가 있는지 확인하는 방법이 있습니까? 예를 들어 패키지를 시험 해보고 나중에 주석을 달거나 코드를 삭제하지만 제거를 잊어 버린 경우 삭제할 수있는 몇 가지 패키지가 생깁니다. 패키지를 안전하게 삭제할 수 있는지 확인하는 효율적인 방법은 무엇입니까? 답변 depcheck 라는 npm 모듈을 사용할 수 있습니다 (노드 버전 10 이상 필요). 모듈을 설치하십시오 … [node.js] package.json에서 사용되지 않는 npm 패키지를 찾으십시오. 더 보기 » daplus.net
Proxy 설정 "next.config.js" 하단에 "redirects()" 부분에서 변경해주면 된다. "source"는 만약 사용자가 접근하는 URL 주소가 "/v1"이라면 프록시 시킨다. 즉, 사용자가 여러 페이지를 돌아다니다가 URL 주소가 "/v1"이 들어가 있다면, 아래의 "destination" 설정한 주소로 강제 프록시 된다. 뒤에 "/:path*"는 이하 주소 및 파라미터라고 보면 될것 같다. 아래 프록시 설정을 해주면 이제 실제 백엔드로 API 호출할 HTTP OR AXIOS에서 써주면 CORS 오류 없이 작동한다. module.exports = { ... async redirects() { return [ { source: '/v1/:path*', destination: `http://서버주소/:path*`, permanent: true, }, ] }, } 참고 링크 React와 Next.js의 Cors 에러 해결 (Proxy) BackEnd Developer가
BLE flutter_reactive_ble | Flutter Package Reactive Bluetooth Low Energy (BLE) plugin that can communicate with multiple devices pub.dev https://coding-oneday.tistory.com/entry/flutterreactiveble%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95 [Flutter] Bluetooth(플러터 블루투스) flutter_reactive_ble 사용방법 지난번 플러터 블루투스에 관한 라이브러리를 사용하는 방법에 대해 포스팅을 했지만, 이번에는 다른 라이브러리를 사용하는 방법을 포스팅 하려고 합니다. 지난 1년동안 잘 써왔지만 이번에 프로젝트를 널세이프.. coding-oneday.tistory.com BLE 특징 https://toongsunni-s-real-life.tistory.com/entry/BLE-Bluetooth-L
4월 IMQA 세미나 황영 present.do
https://wormwlrm.github.io/2022/06/20/Navigation-API.html?fbclid=IwAR0cOej53ppLjsfUX9LbZ2wfzDVYlK9WXvZB8zO_rmcMMLrPPNCEcPsC2-g&fs=e&s=cl History API는 가라! 이제는 Navigation API의 시대가 온다 - 재그지그의 개발 블로그 클라이언트 사이드 라우팅의 표준화를 위해 새롭게 제안된 Navigation API에 대해 알아봅니다. wormwlrm.github.io
안드로이드 운영체제 및 플랫폼 https://developer.android.com/guide/platform 플랫폼 버전과 API 레벨 https ://developer.android.com/about/dashboards/index.html?hl=ko 2021년 12월 기준 데이터이며, 배포율이 0.1% 이하인 버전은 표시되지 않습니다. 코틀린(Kotlin) 기존 안드로이드 플랫폼은 "리눅스 커널과 자바 API 프레임워크"가 결합된 형태로 과거의 안드로이드 플랫폼은 "JVM(DalvikVM)"으로 자바 가상 머신 위에서 앱이 동작했습니다. 현재는 안드로이드 런타인(Android RunTime, ART)를 사용하고 있으며, "JVM 형태에서 ART로 변경되었지만 가상 머신 위에서 동작하는 형태는 동일"합니다. "2017년 5월 Google I/O에서 코틀린(Kotlin)을 공식 언어로 채택"하여 메인 언어로 지원하고 있습니다. 자바 - 객체지향 class Hello { public
RxJava RxJava는 넷플릭스(Netflix)의 기술 블로그에서 처음 소개 되었다. 넷플릭스는 REST 기반의 서비스 API 호출 횟수와 서비스의 전반적인 성능을 개선하는 프로젝트를 진행한 결과 ".NET" 환경의 리엑티브 확장 라이브러리(Rx)를 "JVM에 포팅하여 RxJava를 만들었다." 넷플릭스의 "RxJava"를 만들게된 핵심적인 이유를 다음과 밝혔다. 동시성을 적극적으로 끌어안을 필요가 있다. 자바가 동시성을 처리를 하는데 번거로움이 있기 때문에 이를 해결하고자 넷플릭스는 클라이언트 요청을 처리하는 서비스 계층(Service Layer)에서 동시성을 처리하고자 다수의 비동기 실행 흐름(스레드 등)을 생성하고 결과를 취합하여 리턴하는 방식으로 내부 로직을 변경했다. 자바 Future를 조합하기 어렵다는 점을 해결해야 한다. 2013년 당시 자바8에서 제공하는 "CompletableFuture" 같은 클래스가 제공되지 않았기 때문에 "RxJava"에서 이를 해결하고자 비
DP Density-Independent Pixels UI 레이아웃을 정의할 때 레이아웃 치수나 위치를 지정하기 위해 사용하는 단위이다. 픽셀 독립 단위이며 화면의 크기가 달라도 동일한 비율로 보여주기 위해 안드로이드에서 정의한 단위이며 큰 화면, 작은 화면에 상관없이 같은 크기로 나타난다. SP와 다르게 DP로 설정하게 되면 시스템 설정의 텍스트 크기 값의 변화에 상관없이 일정한 크기를 유지한다. SP Scale-Independent Pixels UI 레이아웃을 정의할 때 텍스트의 크기를 지정하기 위해 사용하는 단위이다. 사용자가 디바이스 시스템 설정에서 텍스트 크기를 "최대크게" SP로 크기를 지정해놓은 TextView의 텍스트 크기가 영향을 받아 커지기 때문에, 크기를 고정하기 위해서는 앱의 폰트 크기 등을 우선적으로 적용하게끔 혹은 시스템 설정을 무시하게끔 할 수도 있다.
missingContairaints XML의 위젯의 위치를 설정해주지 않아서 뜨는 권장내용입니다. <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" tools:ignore="MissingConstraints" /> 아래와 같이 "layout_constraint" 위치들을 지정해주면 해결 됩니다. <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="pare
AppCompatActivity https://hongbeomi.medium.com/appcompatactivity-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-4ed4fc231899 Android 3.0(API Level 11) 이후 부터, 앱바(Appbar)의 액션바(Actionbar)를 사용할 수 있기 때문에 3.0 이하 버젼에서도 동작할 수 있게 "AppCompatActivity"를 사용합니다. 물론, 마시멜로 이상의 기기들로 충분히 커버가 가능하지만 때로는 구형 기기들까지 지원해야될 경우에는 "Activity" 대신 "AppCompatActivity"를 사용하면 될것 같습니다. 참고 링크 [Andorid] Activity와 AppCompatActivity, 그 외의 차이 몇년 사이에 신규로 프로젝트를 생성한다면, AppCompatActivity부터 마주하는 분들이 있을 것 같습니다. 그러나 저처럼 오래된 프로젝트 코드를 마주하면, Activity와 Ap
라이프사이클(Lifecycle) 라이프사이클(Lifecycle) 사이클 설명 onCreate() 1. 첫번째로 호출 (라이플사이클 1회만 수행) 2. 해당 사이클에서 초기화 진행 (Layout 정의, View 생성, DataBinding) ※ 추가로 해당 사이클에서 finish() 메서드를 호출하면 먼저 전체 onCreate() 메서드를 실행한 다음 Destroy()에서 수명 주기 메서드를 실행하고 활동이 삭제됨 onStart() 1. Activity가 화면에 표시되기 직전 호출 2. 화면에 진입할때마다 실행됨 onResume() 1. Activity가 화면에 표시되기 직후 호출 2. 화면이 포커스인(보여지는) 상태 onPause() 1. Activity가 화면에 보여지지 않은 직후에 호출 2. 화면이 포커스아웃(보여지지 않은) 상태 ※ 다른 Activity가 호출되기 전에 실행되기 때문에 무거운 작업을 수행하지 않도록 주의해야함 onStop() 1. Activity가 다른 Acti
Format on Save Settings 액션 설명 Reformat code 코드 스타일에 따른 코드 포맷 Optimize imports import 최적화 Rearrange code 코드 스타일에 따른 코드 정렬 Run code cleanup batch-apply quick-fixes 빠른 수정을 일괄 적용 저장되지 않은 변경 내용으로 파일 표시 Settings 저장되지 않은 파일 탭에 * 표시 Apply Changes의 실행 대체 사용 설정 Settings Apply Changes and Restart Activity나 Apply Code Changes 오류 발생시 수동으로 앱을 재실행 Macro를 통한 자동 Reformat on save Macro "Start Macro" 이후 "CTRL + ALT + L" 키 입력 후 "CTRL + S" 후 "Stop Macro" 하면 이름을 저장하라고 나오며, 다시 설정의 "Keymap"에서 아래와 같이 "Macros"에서 방금 저장한 "
wrap_content "wrap_content"는 폭과 높이가 자식크기에 맞춰서 크기가 자동으로 설정된다. 1. "wrap_content" + "wrap_content" 간단히 설명하면, "wrap_content"는 현재 위젯의 크기 기준으로 맞춰진다. "wrap_content" + "wrap_content" <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:context=".MainActivity"> <Button android:id="@+id/
@SuppressLint 현재 프로젝트에 설정된 minSdkVersion 버젼 이후에 나온 API를 사용할때 warning을 없애고 사용할 수 있게 합니다 참고 링크 https://developer.android.com/studio/write/lint 린트 검사로 코드 개선 | Android 개발자 | Android Developers 테스트를 빌드하여 앱이 기능적 요구사항을 충족하는지 확인하는 것 외에도 린트를 통해 코드를 실행하여 코드에 구조적 문제가 없는지 확인하는 것이 중요합니다. developer.android.com
오류 해결 "you need to use a Theme.AppCompat theme (or descendant) with this activity" 오류는 액티비에서 풀스크린을 사용하거나 타이틀바를 없앨때 발생합니다. 따라서, 풀스크린 혹은 타이틀바를 없앨때에는 "AppCompatActivity" 대신 "Activity"를 사용하면 된다. <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> public class MainActivity ext
변수, 상수 변수 (Variable) : 값을 수정할 수 있음 상수 (Constant) : 값을 수정할 수 없음 var 키워드 사용 var num = 5 num = 1 // 값 수정 가능 let 키워드 사용 let name = "John" name = "Jay" // 값 수정 불가능 Integer 내장 함수 let num = 360 3의 배수인지 확인하는 메소드 print(num.isMultiple(of:3)) 0 ~ 300 사이중 랜덤으로 수를 뽑아내는 메소드 let random = Int.random(in: 0...300) Boolean Boolean 값을 반전 시키는 함수 let isMan = true isMain.toggle() => false String Interpolation 변수의 값과 문자열 같이 표현하기 let name = "홍길동" let age = 26 let message = "저의 이름은 \(name) 이며, 나이는 \(age)세 입니다." => 저의 이름은
코루틴(Coroutine) 코루틴은 동시성 프로그래밍 개념을 도입한 비동기적(Async)으로 실행되는 방식입니다. build.gradle dependencies { ... implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2") } activity.kt import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.startActivity import kotlinx.coroutines.DelicateCoroutinesApi
OnClickListener() import android.os.Bundle import android.view.View import android.widget.Button import androidx.appcompat.app.AppCompatActivity class CheckUserActivity : AppCompatActivity() { private lateinit var mBtnUserconfirm: Button; override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_insert_user); mBtnUserconfirm = findViewById(R.id.btn_user_confirm); mBtnUserconfirm.setOnClickListener(ButtonListner()) } inner class Butto
https://dbanks.design/blog/dark-mode-with-style-dictionary/?utm_source=Nomad+Academy&utm_campaign=ba480c6af1-EMAIL_CAMPAIGN_2022_07_22&utm_medium=email&utm_term=0_4313d957c9-ba480c6af1-49637285&mc_cid=ba480c6af1&mc_eid=351fe96ded Dark Mode with Style Dictionary Dark mode is so hot right now. This article goes in depth into how dark mode works on Android, iOS, and the web as well as tips on how to structure your design tokens and 2 different implementations of dark mode in Style Dictionary. dbank
절대 경로 설정 우선 먼저 알아야 될 부분은 Next.js는 Next.js 9.4 이후 부터 tsconfig.json 및 jsconfig.json "경로" 및 "baseUrl" 옵션을 자동으로 지원합니다. 즉, 자동으로 지원하기 때문에 ".eslintrc"에서 설정을 잘못하면 계속 오류가 뜨고 안될 수 있으므로, 유의한다. jsconfig.json (tsconfig.json) { "compilerOptions": { "baseUrl": ".", "paths": { "@/components/*": ["components/*"], "@/pages/*": ["pages/*"], "@/config/*": ["config/*"], "@/styles/*": ["styles/*"], "@/store/*": ["store/*"], "@/utlis/*": ["utlis/*"] } } } .eslintrc.json 아래 사항을 체크한다. 1. "plugin:import/errors"가 있다면 삭제,
MUI(MaterialUI) 적용 베이스 템플릿 GitHub - REAFLA/mui-nextjs-javascript: MUI 테마를 적용한 NextJS 자바스크립트 베이스 템플릿 MUI 테마를 적용한 NextJS 자바스크립트 베이스 템플릿. Contribute to REAFLA/mui-nextjs-javascript development by creating an account on GitHub. github.com
TailWind 적용 베이스 템플릿 GitHub - REAFLA/tailwind-nextjs-javascript: TailWind 테마를 적용한 NetxJS 자바스크립트 베이스 템플릿 TailWind 테마를 적용한 NetxJS 자바스크립트 베이스 템플릿. Contribute to REAFLA/tailwind-nextjs-javascript development by creating an account on GitHub. github.com
부트스트랩(Bootstrap) 적용 베이스 템플릿 GitHub - REAFLA/bootstrap-nextjs-javascript: Bootstrap 테마를 적용한 NextJS 자바스크립트 베이스 템플릿 Bootstrap 테마를 적용한 NextJS 자바스크립트 베이스 템플릿. Contribute to REAFLA/bootstrap-nextjs-javascript development by creating an account on GitHub. github.com
Antd(Ant Design) 적용 베이스 템플릿 GitHub - REAFLA/antd-nextjs-javascript: ANTD 테마를 적용한 NextJS 자바스크립트 베이스 템플릿 ANTD 테마를 적용한 NextJS 자바스크립트 베이스 템플릿. Contribute to REAFLA/antd-nextjs-javascript development by creating an account on GitHub. github.com
설정 Settings -> Appearance & Behavior -> System Settings -> Project "New Window"으로 변경 Android Studio Settings
AndroidManifest.xml 해당 액티비티에 android:windowSoftInputMode="adjustResize" 옵션을 넣어준다. <activity android:name=".RegisterUserActivity" android:exported="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:windowSoftInputMode="adjustResize" /> 미적용 적용
https://github.com/ReactiveX/RxJava GitHub - ReactiveX/RxJava: RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM. RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM. - GitHub - ReactiveX/RxJava: RxJava – Reactive E... github.com Observable "Obeservable"은 말 그대로 관찰자로 상태 변화가 있을때, 옵저버가 변화를 알려주어 감시한다. 함수 설명 o
관련 이슈 Issues · oven-sh/bun Incredibly fast JavaScript runtime, bundler, transpiler and package manager – all in one. - Issues · oven-sh/bun github.com 기존 "Ubuntu 18.04"에서 "GLIBC_2.29" 이하인 상태에서는 "bun"을 별도로 사용할 수 없습니다. "Ubuntu 20.04"의 "GLIBC_2.31"이 설치된 버젼으로 사용이 가능합니다. 위의 링크에서 관련 이슈 확인하시면 됩니다.
Openssl 재설치 Google Code Archive - Long-term storage for Google Code Project Hosting. Projects Search About Project Source Issues Wikis Downloads openssl-for-windows File Summary + Labels Uploaded Size openssl-0.9.8k_WIN32.zip openssl-0.9.8k WIN32 Featured Jul 23, 2009 1.25MB openssl-0.9.8k_X64.zip openssl-0.9.8k X64 Featured Jul 23, 2009 1.42MB openssl-0.9.8e_X64.zip openssl-0.9.8e ... code.google.com openssl 먼저, 소셜 로그인 시도시 나오는 해시키와 Openssl에서 발급받은 해시키가 같은지 확인한다. 해시키가 다른 경우 위의 이미지와 같이 "openssl-0.
build.gradle "android\app\build.gradle" def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } 하단에 추가 def flutterCompileSdkVersion = localProperties.getProperty('flutter.flutterCompileSdkVersion') if (flutterCompileSdkVersion == null) { flutterCompileSdkVersion = '31' } def flutterTargetSdkVersion = localProperties.getProperty('flutter.flutterTarge
주석 예시 Markup 마크업 관련된 내용은 하단 공식 문서에서 확인 가능하며, 자주 쓰는 형태로 정리하여 쓰면 될것 같다. /** # 제목 설명 - Parameters: - param1: 파라미터1 - param2: 파라미터2 - Throws: 오류 타입 - returns: 리턴값 - Links: 참고 링크 For more information, see [The Swift Programming Language.](http://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/) - Note: 메모 - Author: 작성자 - Date: 날짜 자세한 추가 설명 */ 스니펫 단축키 "Xcode"에서 "Command + Shift + L"을 누르면 스니펫이 나오며, 주석전용 스니펫을 작성하여 단축키로 불러온 후 더블클릭하여 쉽게 추가할 수 있다. 참고 링크 Markup Form
SF Symbols SF Symbols - Apple Developer With over 4,000 symbols, SF Symbols is a library of iconography designed to integrate seamlessly with San Francisco, the system font for Apple platforms. developer.apple.com 4,000개가 넘는 기호가 있는 SF 기호는 Apple 플랫폼용 시스템 글꼴인 San Francisco와 원활하게 통합되도록 설계된 아이콘 라이브러리입니다. 기호는 9가지 가중치와 3가지 척도로 제공되며 자동으로 텍스트 레이블에 맞춰 정렬됩니다. 벡터 그래픽 편집 도구를 사용하여 내보내고 편집하여 디자인 특성과 접근성 기능을 공유한 사용자 정의 기호를 만들 수 있습니다. SF Symbols 4는 700개 이상의 새로운 기호, 가변 색상, 자동 렌더링, 새로운 통합 레이어 주석 기능을 제공합니다.
AutoLayout 오토레이아웃이란? 제약 조건(Constraints)에 따라 뷰 계층 구조에 있는 모든 뷰의 크기와 위치를 동적으로 지정하는 것이다. 뷰의 사이즈가 변경이 되어도, 위젯의 크기가 비율에 맞게 조정되지 않고 고정된다. "AutoResizing"과 다르게 내부를 포함한 외부 변화에도 대응할 수 있다. AutoResizing 부모의 뷰의 사이즈가 변경됨에 따라 자식 뷰의 크기나 위치를 조정하는 방식이다. 뷰의 사이즈가 작아진다면, 위젯도 비율에 맞게 크기가 조정 된다. 하지만 뷰 내부의 데이터가 변경되어 크기가 조정되어야 한다면 대응하지 못한다. "AutoLayout"과 "AutoResizing" 두개를 같이 적용해보려고 했으나, 둘 중 하나만 선택되게끔 풀리게 된다. 즉, 둘 중 하나만 사용가능하다. 참고 링크 Autolayout vs Autoresizing Masks iOS와 macOS의 사용자 인터페이스 레이아웃은 3가지 방법으로 구성할 수 있습니다. Frame-b
스택뷰(StackView) 스택뷰(StackView)sms 위젯(View)들을 일정한 간격으로 배치하기 위해 사용한다. Horizontal Stack View "Horizontal Stack View"는 View들을 가로로 배치한다. Horizontal Stack View Vertical Stack View "Vertical Stack View"는 View들을 세로로 배치한다. Vertical Stack View StackView - Distribution "Stack View" 옵션에 "Distribution" 이 있는데 해당 옵션에 따라서 정렬 할 수 있다. 해당 옵션들의 설명은 아래와 같다. Fill View들이 자신의 크기를 갖고, 크기가 설정되지 않은 마지막(혹은 처음) View는 남은 공간을 꽉 채우게 배치 된다. Fill Fill Equally 모두 같은 크기의 비율로 View가 정렬된다. Fill Equally Fill Proportionally 비율에 맞춰 배치된다.
Xcode Xcode -> Preferences -> Key Bindings "Move to Beginning of Text" "Move to End of Text" 위 두개의 키를 "Home", "End"로 변경해준다. Key Bindings Move to End of Text shift + home, end 삭제 "shift + home, end"를 누르면 최상단, 하단으로 긁으면서 이동되는것을 삭제 "Move to Beginning of Document Extending Selection" "Move to End of Document Extending Selection" 위 키에서 "shift + home, end"를 삭제한다. shift + up, down, left, right 키 재설정 "Move Up Extending Selection" "Move Down Extending Selection" "Move Left Extending Selection" "Move Right
do-catch enum TestError : Error { case outOfRange // 1 case invalidInput(testNum : Int) // 2 } do { let resultNumber = try object.printNumber(-20) } catch { print(error) } do { let resultNumber = try object.printNumber(-20) } catch TestError.outOfRange { // 오류처리 } catch TestError.invalidInput(let testNumber) { // 오류처리 } try "try"는 오류가 발생 할 수도 있다고 처리해주는것인데 "do-catch"를 무조건 감싸줘야 처리를 할 수 있습니다. 추가로 "try?", "try!" 옵셔널을 사용 할 수 있습니다. "try?"의 경우 오류가 발생되면, "nil" 값을 리턴 받을 수 있으며, "try!"의 경우에는 오류가 발생되면 "Runt
Xcode 앱은 IPad를 지원하지 않았는데, 심사시에 IPad 스크린샷 까지 요청한 경우에는 "Xcode" -> "Runner" -> "General"에서 Deployment Info에서 IPad가 체크되어 있어서 그렇다. 체크를 해제해주면 된다. 저의 경우 아래와 같이 피드백이 왔습니다. Please revise your screenshots to ensure that they accurately reflect the app in use on the supported devices. Keep in mind the following requirements: - Marketing or promotional materials that do not reflect the UI of the app are not appropriate for screenshots. - The majority of the screenshots should highlight your app's main featu
네이티브 충돌 지원 https://developer.android.com/studio/build/shrink-code#native-crash-support Google Play Console은 Android vitals에서 네이티브 충돌을 보고합니다. 몇 단계만 거치면 앱의 네이티브 디버그 기호 파일을 생성하고 업로드할 수 있습니다. 이 파일로 Android vitals에서 기호화된 네이티브 비정상 종료 스택 트레이스(클래스 및 함수 이름 포함)를 사용 설정하여 프로덕션에서 앱을 디버그할 수 있습니다. 이러한 단계는 프로젝트에서 사용하는 Android Gradle 플러그인의 버전과 프로젝트의 빌드 출력에 따라 다릅니다. Android Gradle 플러그인 버전 4.1 이상 https://developer.android.com/studio/build/shrink-code#native-crash-support "android\app\build.gradle" 디버그 기호 수준 설명 SYM
앱 설치 목록 조회 제한 구글은 2020년에 안드로이드 11을 출시하면서 앱 설치 목록에 접근하는 것을 기본적으로 차단하고, 이 정보에 접근 할 수 있게 하는 신규 권한인 "QUERY_ALL_PACKAGES"를 도입했다. 참고 링크 '앱 설치 목록' 볼 수 있는 안드 앱 제한된다 기기에 설치된 앱 목록에 접근할 수 있는 안드로이드 앱 종류가 제한될 전망이다. 불필요하게 사용자 몰래 설치된 앱 정보를 수집하고, 이를 광고업계 등 외부에 판매하는 것을 ... zdnet.co.kr
Logcat 색상 변경 "Settings" -> "logcat" 검색 Settings 아래와 같이 "Inherit values from"을 체크해제 후 "Foreground" 색상을 변경해준다. Android Logcat 스키마 색상코드 Assert 9777A9 Debug 6A98B9 Error FF6B68 Info 6A855A Verbose (모든 로그 메시지를 표시) BBBBBB Warning BC7739 유형에 맞게 색상을 변경하면 아래처럼 인식하기 쉬워진다. Android Logcat 참고 링크 [안드로이드] Android studio logcat color 변경 Assert : 9777A9 Debug : 6A98B9 Error : FF6B68 (기본) Info : 6A855A Verbose : BBBBBB (기본) Warning : BC7739 milkissboy.tistory.com
OS 체크하기 Build.VERSION.SDK_INT Log.d("Test1", Build.VERSION_CODES.BASE.toString()) Log.d("Test2", Build.VERSION.CODENAME.toString()) Log.d("Test3", Build.VERSION.SDK_INT.toString()) Log.d("Test4", Build.VERSION.BASE_OS.toString()) Log.d("Test5", Build.VERSION.INCREMENTAL.toString()) Log.d("Test6", Build.VERSION.RELEASE.toString()) Log.d("Test7", Build.VERSION.MEDIA_PERFORMANCE_CLASS.toString()) Log.d("Test8", Build.VERSION.PREVIEW_SDK_INT.toString()) Log.d("Test9", Build.VERSION.RELEASE_OR_CODENA
제조사, 브랜드, 모델명 체크 Log.d("[test] 디바이스ID", Settings.Secure.getString(this.contentResolver, Settings.Secure.ANDROID_ID)) Log.d("[test] 제조사", Build.MANUFACTURER) Log.d("[test] 브랜드", Build.BRAND) Log.d("[test] 모델명", Build.MODEL) Log.d("[test] OS 버전", Build.VERSION.RELEASE) Log.d("[test] SDK 버전", Build.VERSION.SDK_INT.toString()) 참고 링크 [안드로이드/Android] 기기 단말정보 가져오기 (단말ID, 제조사, 브랜드, 모델명, OS버전, SDK 버전) 안드로이드 휴대폰의 기기 단말정보 를 가져오는 코드입니다. DeviceInfoUtil 라는 Util 파일을 만들고 MainActivity 에서 DeviceInfoUtil 의 정보를 가져오
Kotlin class MainActivity : AppCompatActivity() { private var is_Permission = false var tele_num: TextView? = null var tele_country: TextView? = null @SuppressLint("HardwareIds") @RequiresApi(Build.VERSION_CODES.M) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) is_Permission = chkPermission() Log.d(TAG, "퍼미션 체크 값은? : $is_Permission") if (is_Permission) { Log.d(TAG, "체크 퍼미션 승인") // READ_PHONE_NUMBERS 또는 READ_PHONE_STATE 권한을 허가 받았는지 확인 if (ActivityCompat.ch
자동 업데이트 및 로그 남기기 - mkdir crontab && mkdir crontab/log - vi crontab/log/updatre.log - sudo chmod -R 777 ./crontab - 00 00 * * * root apt update && apt -y upgrade && apt -y autoremove > /home/crontab/log/update.log
pod update 기존 빌드 프로세스와의 충돌? sudo gem update cocoapods --pre pod update "Product" -> "Clean Build Folder" 이후 재빌드 Product -> Clean Build Folder 참고 링크 [iOS / Error] Unable to load contents of file list... 에러 해결 이전 포스터에서 문제를 해결하다가 새로운 에러에 봉착했습니다. 해당 문제는 Xcode 10.2에서 디폴트로 사용되는 새로운 빌드 프로세스와 관련된 에러입니다. 해당 에러를 해결해보겠습니다. [Step 1] terminal.. minny27.tistory.com
조건 Xcode9, IOS11 이상 USB 연결 먼저, USB로 맥과 연결 합니다. Xcode 실행 후 "Window" -> "Devices and Simulators" 이동하여 "Connect via network" 체크 Xcode -> Window -> Devices and Simulators -> Connect via network 이후, 선을 뽑은 뒤 Xcode에서 빌드하면 위 사진 처럼 지구본 형태 모양이 뜨면서 빌드가 진행된다.
Top layer 일반적으로 상위 레이어를 주기 위해서는 "z-index" 옵션을 사용합니다. 하지만 "<dialog></dialog>"를 사용하면 "Top layer(최상위 레이어)"를 사용하면 어디에 있든 항상 상위 "z-index"를 가질 수 있습니다. 아래의 코드는 "dialog"가 어디에 있든 "최상위 레이어" 배치 된다는 점 입니다. 즉, "postion: fixed, absolute"로 인덱스 값을 높일 필요가 없다는 말이죠. <dialog> <div>Rad! <span>c</span></div> <button class="close">Close Dialog</button> </dialog>
참고 링크 90's Cursor Effects I'd like to take the web back a little bit, into the wonderful days where knowing how to get your little mouse arrow to dance and sway was the most of your worries. Each of the cursor effects below are built for your modern browser (fast, efficient, mobile friendly), and are super easy t... tholman.com
참고 링크 GitHub - microsoft/Web-Dev-For-Beginners: 24 Lessons, 12 Weeks, Get Started as a Web Developer 24 Lessons, 12 Weeks, Get Started as a Web Developer - GitHub - microsoft/Web-Dev-For-Beginners: 24 Lessons, 12 Weeks, Get Started as a Web Developer github.com
Xcode Property List 추가 방법 Xcode Property List Info.plist 추가 방법 "ios/Runner/Info.plist" 모두 허용 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 특정 도메인만 허용 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>daheenallwhite.github.io</key> <dict/> <key>NSIncludesSubDomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> <key>NSAllowsArbitraryLoads</key> <false/> </dict>
Xcode "Signing & Capabilities > + 버튼 > Push Notifications 추가" Signing & Capabilities 참고 링크 iOS 응용 프로그램을 위한 유효한 ‘aps-environment’ 인타이틀먼트 문자열을 찾을 수 없습니다. 에러메시지 응용 프로그램을 위한 유효한 ‘aps-environment’ 인타이틀먼트 문자열을 찾을 수 없습니다. 해결 Signing & Capabilities > Capability 추가 버튼 클릭 > Push Notifications 을 추가한다 ghj1001020.tistory.com
Identifiers 생성 파이어베이스 연동 이전 식별자(Identifiers)를 먼저 등록해줘야 합니다. "Certificates, Identifiers & Profiles > Identifiers 추가" Identifiers App IDs 체크 후 다음 Register a new identifier App 선택 후 다음 Register a new identifier "App ID Prefix"는파이어베이스 연동때 사용됩니다. "Description", "Bundle ID" 작성 후 하단 "Capabilities"는 앱에서 사용할 권한을 체크해줍니다. 이후 생성 식별자가 생성되며, 클릭하면 "App ID prefix"코드 및 권한 부분은 다시 수정이 가능합니다. Register an App ID Apple Push Notifications service (APNs) 키 생성 "Keys" 메뉴로 이동하여 키 생성 Keys "Apple Push Notifications service
LTS(Long Term Support) 2년에 한번씩 배포하고 다음 5년 동안 지속 유지하는 릴리즈 형태 Ubuntu Releases 버전(LTS) 코드명 배포일 지원기간(데스크톱 / 서버) 18.04 Bionic Beaver 2018년 4월 26일 2023년 4월 / 2028년 4월 (ESM) 20.04 Focal Fossa 2020년 4월 23일 2025년 4월 / 2030년 4월 (ESM) 22.04 Jammy Jellyfish 2022년 4월 21일 2032년 Performance https://www.phoronix.com/review/xeonr-ubu1804-2004/9 "18.04 VS 20.04" 전체적으로 "Ubuntu 20.04"가 "Ubuntu 18.04" 대비 약 25% 성능이 높았다. (동일 CPU, 환경) OpenJDK, Python에서 Appleseed 렌더링, PHP에서 다른 머신러닝 소프트웨어에서 "Ubuntu 20.04"가 "Ubuntu 18.04"
Ubuntu 18.04 와 동일한 설치방법 [Windows10] 우분투(Ubuntu) 레포지토리(apt install) 수정으로 다운로드 속도 높이기 (수정) 레포지토리 주소 변경 파일 수정 ":" 입력 후 붙여넣기 저장 후 업데이트 DNS nameserver 변... blog.naver.com
root 비밀번호 변경 root 로그인 상태에서 명령어 실행 passwd 사용자 생성 "Ubuntu 22.04"는 "18.04"와 다르게 초기에 서브(사용자)계정을 만들지 않습니다. sudo adduser 사용자이름 사용자 생성 사용자 계정 정보 확인 cat /etc/passwd |grep 사용자이름 계정 전환 su 사용자이름 사용자 삭제 sudo deluser 사용자이름 "/home/사용자이름" 폴더는 삭제되지 않기에 별도로 삭제해줍니다. cd /home ls -l sudo rm -rf 사용자이름 sudo 권한 생성 root 계정에서 접근 sudoers # 파일 수정 권한 변경 sudo bash chattr -i /etc/sudoers chmod u+w /etc/sudoers # 파일 수정 sudo vi /etc/sudoers # 하단 root 밑에 추가 후 저장 사용자이름 ALL=(ALL:ALL) ALL 그룹 추가 그룹 생성 sudo addgroup 그룹이름 그룹 리스트 조회 c
오류 Failed to retrieve available kernel versions. The processor microcode seems to be up-to-date. No services need to be restarted. No containers need to be restarted. No user sessions are running outdated binaries. No VM guests are running outdated hypervisor (qemu) binaries on this host. error needrestart.conf 수정 sudo -e /etc/needrestart/needrestart.conf 맨 하단쪽 아래 2개를 주석해제 후 저장 $nrconf{kernelhints} = 0; $nrconf{ucodehints} = 0; 위 방법이 안되는 경우 삭제 sudo apt-get purge needrestart 참고 링크 Ubuntu 22.04 LT
LTS 설치 # 기본 저장소가 아닌 NVM 또는 NodeSource를 통해서 설치하려는 경우 sudo apt install curl gnupg2 gnupg -y OR # Ubuntu 저장소에 있는 기본 Node 설치 sudo apt install nodejs 버젼별 설치 curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - curl -fsSL https://deb.nodesource.com/setup_17.x | sudo -E bash - curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - NVM 설치 curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.bashrc # 노드 버젼 나열 nvm list-remote # 설치 방법 nvm install
resolv.conf 수정 우선, "resolv.conf" 파일이 매번 재생성 되기 때문에 네임서버를 바꿔도 다시 원상태로 돌아오게 되니 심볼릭 링크를 걷어내기 위해서 파일을 삭제하고 다시 만드는 형태로 진행한다. sudo rm /etc/resolv.conf sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf' sudo bash -c 'echo "[network]" > /etc/wsl.conf' sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf' sudo chattr +i /etc/resolv.conf 참고 링크 WSL2 Kali & Ubuntu 자동 인터넷 연결 설정 | Auto Internet connection WSL2 KALI & UBUNTU 자동 인터넷 연결 설정 WSL2에 설치한 Kali Linux와 Ubuntu의 경우, 컴퓨터를 부팅할 때마다 네트워크
기본 로그인 유저 변경 CMD 실행 후 아래 명령어 진행 ※ 만약, CMD에서 안되면 "Window PowerShell"에서 진행해본다. # Ubuntu 18.04 ubuntu1804 config --default-user 사용자이름 # Ubuntu 20.04 ubuntu2004 config --default-user 사용자이름 # Ubuntu 22.04 ubuntu2204 config --default-user 사용자이름 참고 링크 윈도우 10 WSL 활용 팁 - 기본 로그인 사용자 변경하기 - JooTC WSL 사용자 변경 Windows Subsystem for Linux (WSL) 초기 설정된 사용자는 이후의 기본 로그인 사용자입니다. 초기 설정 시 student 계정을 생성한 후 앱 실행 시 student 계정의 터미널이 열릴 것입니다. jootc.com
Bun 설치 # zip, unzip 설치 sudo apt-get install zip unzip # Bun 설치 curl https://bun.sh/install | bash .bashrc Export 설정하여 글로벌 하게 사용하기 .bashrc sudo vi ~./.bashrc # 하단에 추가 후 저장 export BUN_INSTALL="$HOME/.bun" export PATH="$BUN_INSTALL/bin:$PATH" 프로젝트 생성 bun helper # 프로젝트 생성 (Default Typescript) bun create next 프로젝트이름 # 프로젝트 실행 bun dev # 패키지 추가 bun add 패키지이름 # 패키지 삭제 bun remove 패키지이름 # 빌드 bun run build # 번 명령어 bun 참고 링크 How to create a new nextjs project with a bun? The Bun is a new run time environmen
패키지 설치 pip install pillow 배경 합성 예시) A4 용지 사이즈인 (2100X2970) 사이즈를 베이스로 위에 이미지를 합성 # 프로젝트 폴더 경로 ROOT_DIR = os.path.abspath(os.curdir) # 이미지 경로 IMAGES_DIR = f"{ROOT_DIR}/assets/images" # 베이스 이미지 base_image = Image.open(f"{IMAGES_DIR}/A4.jpg") # 베이스 위에 합성될 이미지 image = Image.open(f"{IMAGES_DIR}/temp_image.png") # 이미지 사이즈를 구함 image_width, image_height = base_image.size # 베이스 이미지의 사이즈를 조졍 image = image.resize((1750, 1500)) # 새로운 도화지를 만듬 (베이스 이미지가 흰색배경 무지인 경우 파일 안불러오고 사이즈만 넣어도됨) new_image = Image.new('RG
키 생성 키 생성 및 확인 ssh-keygen -t ed25519 -C "[email protected]" OR ssh-keygen -t rsa -b 4096 -C "[email protected]" 키 확인 cat id_ed25519 cat id_ed25519.pub 깃허브 SSH 등록 Github SSH and GPG keys 참고 링크 GitHub 접속 용 SSH 키 만드는 방법 GitHub의 저장소를 사용할 때 HTTPS과 SSH 프로토콜을 사용할 수 있습니다. SSH 프로토콜은 공개키 방식으로 안전하게 정보를 교환할 수 있습니다. 이번 글에서는 공개키를 만드는 방법부터, GitHub에 등록하고 SSH 프로토콜로 GitHub를 사용하는 방법을 알려드립니다. www.lainyzine.com
Flutter 점검 아래의 명령어로 점검 flutter doctor 추가적으로 코드 실행 sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch IOS 개발자 모드 켜기 "설정" -> "개인정보 보호 및 보안" -> "개발자 모드 (켜기)" 참고 링크 flutter 개발시 vscode에서 ios device가 선택 안되는 경우 vscode로 flutter의 샘플앱을 개발해 보던중 갑자기 연결한 ios device가 나타나지 않은 문제가 발생했습니다. 그래서 일단 접어두고 Runner를 xCode에서 열어서 build를 해보려고 하니 xCode에서는 아래와 같은.. khstar.tistory.com
권한 추가해주기 깃에서 경로가 의심스러운 권한으로 체크되어 있다면, 아래와 같이 안전한 경로라는것을 글로벌하게 선언합니다. git config --global --add safe.directory <경로> 전체적으로 허용하기 git config --global --add safe.directory '*' 참고 링크 git 관련 오류 sourcetree에서 repository clone 하니, 128 \~~ 에러(사진 스샷을 찍지 못하고, 어떤 내용인지 기억이 나지 않음...)set the environment variable git_test_debug_unsafe_directories=true a velog.io
디바이스 이미지 Device 위 사진에 있는 인치형 별로 나누어진 디바이스 이미지 아이콘을 보면, "iPhone 6.5형"과 "iPhone 5.5형"은 구형, 신형 나누어져 디바이스 프레임이 다릅니다. 인치 프레임 사이즈 링크 iPhone 6.7형 디스플레이 신형(노치디자인) 1290x2796 2796x1290 링크 iPhone 6.5형 디스플레이 신형(노치디자인) 1242x2688 2688x1242 1284x2778 2778x1284 링크 iPhone 5.5형 디스플레이 구형 1242x2208 2208x1242 링크 iPad Pro(3세대) 12.9형 디스플레이 신형(노치디자인) 2048x2732 2732x2048 링크 iPad Pro(2세대) 12.9형 디스플레이 구형 2048x2732 2732x2048 링크 위와 같이 다른 프레임의 목업 이미지를 사용해야 리젝되지 않습니다. 참고 링크 iOS 리젝 사유 : Accurate Metadata 내가 받은 리젝 사유 Apple의 메시지
build.gradle build.gradle 위 사진에서 "com.android.tools.build:gradle:7.2.2"의 버전이 맞지 않아서 발생되는 문제 아래 링크를 통하여 코틀린 릴리즈 버전을 체크하여 변경하자 Kotlin releases https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google
Workers Rx 변수들의 변화를 감지할 수 있다. 함수 설명 once 값이 처음 변경됬을때만 호출 ever 값이 변경될때마다 호출 interval 1초마다 호출 debounce interval이 끝난 후 한번 호출 예시 // ignore_for_file: unnecessary_overrides import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; class ExampleController extends GetxController { static ExampleController get to => Get.find(); // Variables ======================================= RxInt count = 0.obs; @override Future<void> onInit() async { once( count, (Object value)
log 사용하기 타입 옵션 설명 String message 로그 메세지 DateTime? time 타임스탬프 int? sequenceNumber 시퀀스 번호 int level 심각도 수준 (0 ~ 2000) String name 로그 메세지 이름 Zone? zone 로그가 발생한 영역 Object? error 로그 이벤트와 관련된 오류 개체 StackTrace? stackTrace 로그 이벤트와 관련된 스택 추적 log( '테스트', time: DateTime.now(), sequenceNumber: 1, level: 0, name: 'PERMISSION', // zone: Zone.current, error: { 'key': 'value', 'key2': 'value2', }.toString(), // error: '오류 메세지', // stackTrace: StackTrace.current, ); log
디바이스 준비 안드로이드 11 이상 같은 환경에 있는 WIFI 연결 개발자 모드 활성화 이후 "개발자 옵션" -> "무선 디버깅" 활성화 및 클릭 무선 디버깅 "페어링 코드로 기기 페어링"을 클릭하면 위 이미지 처럼 코드번호와 아이피:포트가 나옵니다. 연결될때까지 해당 화면을 닫지 마세요. VSCode에서 사용중인 경우 [Flutter] VScode 안드로이드 무선 디버깅 (adb) 하기 무선 디버깅 설정 방법 VScode 익스텐션 설치 익스텐션을 설치하는 이유는 위에서 무선 디버깅 설치 후 &... blog.naver.com 페어링 방법 Android Studio 안드로이드 스튜디오 실행 후 오른쪽 "Device Manager" 클릭 혹은 상단 "Tools" -> "Device Manager" 이후 "Physical" 탭 클릭 후 "Pair using Wi-Fi" 클릭 Pair Error "This system does not meet the requirements to suppo
무선 디버깅 설정 방법 [Android] 안드로이드 무선 디버깅 연결하기 (pair using wifi not working) 디바이스 준비 안드로이드 11 이상 같은 환경에 있는 WIFI 연결 개발자 모드 활성화 이후 "개발자... blog.naver.com VScode 익스텐션 설치 익스텐션을 설치하는 이유는 위에서 무선 디버깅 설치 후 "Android Studio"를 닫아버리면 연결이 같이 닫히는 문제가 있습니다. ADB Interface for VSCode - Visual Studio Marketplace Extension for Visual Studio Code - An interface that allows ADB commands inside IDE with no need to have terminal access. marketplace.visualstudio.com "ADB Interface for VSCode" 익스텐션을 설치하여 별도로 VScode에서 동작하게 합니다
storage 앱에서 웹뷰로 자바스크립트를 주입할때 디버그 모드에서는 "localStorage", "sessionStorage" 둘다 잘 먹히는데 릴리즈 모드로 갔을때는 "sessionStorage"가 먹히지 않는다. 따라서, 프론트에 전달하는 방식이 여러가지가 있겠지만 스토리지를 통해서 전달하고자 한다면 로컬스토리지를 사용하면 된다. 예로들면 PHP의 그누보드와 같이 만들어졌는데 HTTPS 인증이 안되어있고 이런 상황이라면, 앱에서 자바스크립트 주입하여 FCM 토큰을 로컬스토리지로 전달하고 반대로 프론트에서는 인터벌을 걸어 로컬스토리지 값을 지속 체크하여 내부적으로 가져와 처리할 수 있다.
비교 Bad void getCaffeine(type) { String caffeine; switch (type) { case 'Coffee': caffeine = '95 mg'; break; case 'Redbull': caffeine = '147 mg'; break; case 'Tea': caffeine = '11 mg'; break; case 'Soda': caffeine = '21 mg'; break; default caffeine = 'Not found'; } return caffeine } Good void getCaffeine(type) { String caffeine; const map = { 'Coffee': '95 mg', 'Redbull': '147 mg', 'Tea': '11 mg', 'Soda': '21 mg', }; caffeine = map[type] ?? 'Not found'; return caffeine }
오류 분석 Failed assertion: 'renderObject.child == child': is not true. 웹뷰에서 백그라운드 메세지를 받고 클릭시 위와 같은 화면이 출력 될 수 있다. 현재는 IOS에서만 나타나는 버그 증상으로 확인되고 있다. 웹뷰가 아닌 다른 구간에서도 오류가 난다면 먼저, 릴리즈 모드로 테스트 해보는것이 좋을것 같습니다. 릴리즈에서 오류가 나타나지 않는다면 크게 문제가 되지 않습니다.
Flutter - 위치 정보를 받아서 시, 구 를 화면에 띄우기 geolocator, 네이버 클라우드 플랫폼을 이용해서 위치정보를 위도 경도로 받아 주소로 나타내는 과정을 구현해 보았다. velog.io