Interests

Bash 입문자를 위한 핵심 요약 정리 (Shell Script)

Bash 입문자를 위한 핵심 요약 정리 (Shell Script)

Linux / Unix
Click the link to read the original article: Here ================ Bash 입문자를 위한 기본적인 문법과 알고 있으면 좋은 것들만 정리했다....
Read More
Windows Hyper-V 사용법

Windows Hyper-V 사용법

Windows
Click the link to read the original article: Here ===================================== 안녕하세요. 도정진입니다.   저전력 서버를 사용하면서 윈도우를 쓸 일이 많아져서...
Read More
Hyper V 전체 화면으로 확대 하기 

Hyper V 전체 화면으로 확대 하기 

Windows
Click the link to read the original article: Here =================================== Hyper V 전체 화면으로 확대 하기  윈도우 10 하이퍼 v는...
Read More
하이퍼-V (Hyper-V) 개념

하이퍼-V (Hyper-V) 개념

Windows
Click the link to read the original article: Here ==================================== 하이퍼-V 란 무엇 인가 페러럴즈를 들어 보셨나요? 내가 맥을 사용할때...
Read More
How to Delete a Windows Recovery Partition

How to Delete a Windows Recovery Partition

Windows
How to Delete a Windows Recovery Partition Click the link to go to the original page: Here === by Gary Newell Updated...
Read More
왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?

왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?

Web Server
Click the link to read the original article: 왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나? ====== 목차 들어가며 서문 위대한 자바스크립트의...
Read More
Vue.js 사용하는 이유 :: 마이구미

Vue.js 사용하는 이유 :: 마이구미

Web Server
Click the link to read the original article: Vue.js 사용하는 이유 :: 마이구미 ===== 이 글은 Vue, Angular, React 를 비교하는 글이...
Read More
Redis 설치 및 셋팅 [EC2] :: 마이구미

Redis 설치 및 셋팅 [EC2] :: 마이구미

Web Server
Click the link to read the original article: Redis 설치 및 셋팅 [EC2] :: 마이구미 ========== 이번 글은 Redis 설치 및...
Read More
Use Redis for session storage (Magento 2)

Use Redis for session storage (Magento 2)

Magento 2
Prerequisite Before you continue, install Redis. You can use Redis for session storage in Magento versions 2.0.6 and later only. Configure...
Read More
Use Redis for the Magento page and default cache

Use Redis for the Magento page and default cache

Magento 2
Use Redis for the Magento page and default cache Prerequisite Before you continue, install Redis. Configure Magento to use Redis for...
Read More
Aws Ec2 인스턴스에 Redis 설치하기

Aws Ec2 인스턴스에 Redis 설치하기

Web Server
Click the link to read the original article: 읽으러 가기 =============== 저는 Read cache를 위해 별도 EC2 인스턴스를 띄우고 redis를...
Read More
Redis, 레디스를 사용한 데이터베이스 캐싱서버 운영하기

Redis, 레디스를 사용한 데이터베이스 캐싱서버 운영하기

Web Server
Click the link to read the original article: 읽으러 가기 =========== Redis 서버의 구축 및 운영 등 여러가지 방안에 대하여 생각한...
Read More
[Spring]스프링 프레임워크 설치하기-eclipse(1)

[Spring]스프링 프레임워크 설치하기-eclipse(1)

Web Server
[Spring]스프링 프레임워크 설치하기-eclipse(1) [Spring]스프링 프로젝트 만들기-eclipse(2)   Click the link to read the original article: ========================= 자바를 하는 사람이 결국...
Read More
Install Apache Tomcat 8.0 and connect Eclipse

Install Apache Tomcat 8.0 and connect Eclipse

Web Server
Install Apache Tomcat 8.0 and connect Eclipse Click the link to read the original article: ============================== 홈 » 프로그래밍+DB » Apache Tomcat 8.0 설치...
Read More
Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기

Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기

Web Server
Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기 Click the link to read the article: ====== 윈도에서 자바 프로그래밍을 하기 위해...
Read More
A/B Testing?

A/B Testing?

Web Server
A/B Testing? Click the link to go to the original site. ===== A/B testing이란? A/B testing은 웹이나 앱에서 A버전과 B버전을...
Read More
How to detect and clean malware from your Linux server using Maldet

How to detect and clean malware from your Linux server using Maldet

Magento 2
How to detect and clean malware from your Linux server using Maldet Click the link to the article page: =============...
Read More
RESTful API란 ?

RESTful API란 ?

Web Server
RESTful API란 ? Click the link to see the article: 개발 공부를 시작하고 자주 접하고 그냥 지나친 개념 중에 하나이다....
Read More
REST API란 무엇인가 #1 – 개념

REST API란 무엇인가 #1 – 개념

Web Server
REST API란 무엇인가 #1 - 개념 Click the link to see the article:  조대협 님께서 블로그에 개제 해주신 내용을 보고...
Read More
12 Online Free Tools to Scan Website Security Vulnerabilities & Malware

12 Online Free Tools to Scan Website Security Vulnerabilities & Malware

Web Server
12 Online Free Tools to Scan Website Security Vulnerabilities & Malware Click to the link to go to the site:...
Read More
Bitrise로 안드로이드 배포 자동화하기 1) Bitrise + Integrations

Bitrise로 안드로이드 배포 자동화하기 1) Bitrise + Integrations

Web Server
Bitrise로 안드로이드 배포 자동화하기   Bitrise Bitrise를 처음 접한 곳은 Droid Knights 17의 빠르고 지속적으로 전달하기-남상균님 세션을 통해서였다. 나도 처음 CI라는 개념을 접한...
Read More
젠킨스란 무엇인가, CI(Continuous Integration) 서버의 이해

젠킨스란 무엇인가, CI(Continuous Integration) 서버의 이해

Web Server
젠킨스란 무엇인가, CI(Continuous Integration) 서버의 이해 Martin Heller | InfoWorld 젠킨스(Jenkins)는 거의 모든 언어의 조합과 소스코드 리포지토리(Repository)에 대한 지속적인 통합과...
Read More
DevOps란 무엇이며, CI는 무엇인가?

DevOps란 무엇이며, CI는 무엇인가?

Web Server
Dev.World/개발상식&언어 [개발상식] 23. DevOps란 무엇이며, CI는 무엇인가? 글쓰는 개발자 _Jbee 2016.10.23 11:54 DevOps에 대해서, 하나의 소프트웨어를 개발하기 위해서는 여러 명이 동시에...
Read More
CI/CD 시작하기 : CI/CD 파이프라인으로 애플리케이션 딜리버리 자동화

CI/CD 시작하기 : CI/CD 파이프라인으로 애플리케이션 딜리버리 자동화

Web Server
CI/CD 시작하기 : CI/CD 파이프라인으로 애플리케이션 딜리버리 자동화 원문보기:  http://www.itworld.co.kr/howto/109147  
Read More
도커란 무엇인가 / Docker 컨테이너 / Docker 이미지 / LXC / 가상화

도커란 무엇인가 / Docker 컨테이너 / Docker 이미지 / LXC / 가상화

Web Server
도커란 무엇인가? 생활코딩의 Docker - Youtube pyrasis.com - DOcker 설치 등등 책의 내용 조영규 블로그 가기  http://dev.youngkyu.kr/32 =============== Docker란 무엇인가?...
Read More
AWS VPC를 디자인해보자(1) – Multi AZ와 Subnet을 활용한 고가용성

AWS VPC를 디자인해보자(1) – Multi AZ와 Subnet을 활용한 고가용성

Web Server
Click the link to read the article: AWS VPC Design ========= AWS VPC를 디자인 해보자(1) - Multi AZ와 Subnet을 활용한 고가용성 [Contents]...
Read More
Installing Magento 2 With Composer

Installing Magento 2 With Composer

Magento 2
Click the link to go to the site: GO TO THE LINKED SITE Installing Magento 2 With Composer Thinking of installing...
Read More
Github for beginner

Github for beginner

Web Server
Github for beginner Click the link to got to the article: 바로가기 == 원문 : 1. GitHub For Beginners: Don’t Get Scared,...
Read More
How to install Magento 2

How to install Magento 2

Magento 2
When installing Magento 2 on your machine you should ask yourself: Do I need more problems in my life? If...
Read More
AWS Certification

AWS Certification

Web Server
Ready to begin your AWS Certification journey?   AWS Simple Monthly Calculator Sign In or Create an Account
Read More
L2, L3, L4 스위치 정의 및 개념 정리

L2, L3, L4 스위치 정의 및 개념 정리

Web Server
1. 스위치의 정의 . 허브의 확장된 개념으로 기본 기능은 허브와 동일하지만 전송 중 패킷의 충돌이 일어나지 않도록 패킷의 목적지로 지정할 포트를...
Read More
L2 L3 L4 스위치 차이 및 FEP , QOS 설명

L2 L3 L4 스위치 차이 및 FEP , QOS 설명

Web Server
L2 스위치 -그냥 스위치라고 부르기도 합니다. 데이터를 뿌려주는 허브역할만 수행. 2Layer(Datalink Layer)의 프로토콜인 이더넷, 프레임릴레이, ATM 등에서 스위칭 기능을 수행한다...
Read More
Activate windows 10 without any key (microsoft toolkit)

Activate windows 10 without any key (microsoft toolkit)

Windows
Click the link to view the youtube video: youtube's video === Step 1: Download the Microsoft Toolkit and install it. Step...
Read More
How to enable/disable the demo store notice in Magento

How to enable/disable the demo store notice in Magento

Magento 2
Magento 2.x and newer: Go to Content and under Design, choose Configuration. Select the store view that you want to configure and click Edit. Under Other...
Read More
Magento 2.x: Configure Sandbox Authorize.net

Magento 2.x: Configure Sandbox Authorize.net

Magento 2
Magento 2.x: Configure Sandbox Authorize.net Click the link to read the article: Read the article === Create a Sandbox Account: https://developer.authorize.net/hello_world/sandbox/...
Read More
How to Create & Edit Email Templates in Magento 2

How to Create & Edit Email Templates in Magento 2

Magento 2
How to Create & Edit Email Templates in Magento 2 Click the link to read the article: Read the article ......
Read More
Font Awesome – Web Application Icons

Font Awesome – Web Application Icons

Web Server
Font Awesome - Web Application Icons Click the link to read the article:  Read the article ... ============ This chapter explains...
Read More
Android PHP MySQL 예제(Windows 서버) – 데이터베이스에 데이터 입력하기

Android PHP MySQL 예제(Windows 서버) – 데이터베이스에 데이터 입력하기

Mobile App
  Click the link to read the article: Read the article ...
Read More
Beginner’s Guide to Installing Magento 2 using Composer

Beginner’s Guide to Installing Magento 2 using Composer

Magento 2
Beginner’s Guide to Installing Magento 2 using Composer Written by Jack Fuller - Published on August 11, 2015 If you’re new to Composer...
Read More
Configure Gmail SMTP in Magento 2

Configure Gmail SMTP in Magento 2

Magento 2
Configure Gmail SMTP in Magento 2 Click the link to read the article: Read the article ===== We will give you...
Read More
Magento 2 file/folder permissions setting

Magento 2 file/folder permissions setting

Magento 2
Magento 2 file/folder permissions setting Click the link to read the article: Read the article ============ Magento 2 has a big...
Read More
Solving 500 Internal Server Error in Magento 2

Solving 500 Internal Server Error in Magento 2

Magento 2 Uncategorized
Solving 500 Internal Server Error in Magento 2 Click the link to read the article: Read the article ==================== 500 internal...
Read More
How to Install and Configure Magento on Ubuntu 14.04

How to Install and Configure Magento on Ubuntu 14.04

Web Server
How to Install and Configure Magento on Ubuntu 14.04 Click the link to read the article: Read the article =============== Introduction...
Read More
Magento on the AWS Cloud: Quick Start Reference Deployment

Magento on the AWS Cloud: Quick Start Reference Deployment

Magento 2
Magento on the AWS Cloud: Quick Start Reference Deployment Click the link to read the article:  Read the article ===== Deployment...
Read More
Configure and run cron (Magento 2)

Configure and run cron (Magento 2)

Magento 2
Configure and run cron (Magento 2) Click the link to read the doc: GO TO THE LINKED SITE ================== Overview of...
Read More
Magento 2 (M2) List of Commands Available

Magento 2 (M2) List of Commands Available

Magento 2
Magento 2 (M2) List of Commands Available Click the link to go to the site: GO TO THE LINKED SITE ==============...
Read More
Uninstalling Certbot on Debian system

Uninstalling Certbot on Debian system

Web Server
Uninstalling Certbot on Debian system Click the link to go to the Community Letsencrypt.org: GO TO THE LINKED SITE ======= I...
Read More
AWS SSL 설치하기 – SSL 인증서 발급 쉽게하기

AWS SSL 설치하기 – SSL 인증서 발급 쉽게하기

Web Server
AWS SSL 설치하기 - SSL 인증서 발급 쉽게하기 Click the link to read the article: 블로그 내용보러가기 ====== SSL설치하는것이 매우 까다롭습니다. 게다가 비싸기도하지요 (Codomo...
Read More
Migration Guide: Data Migration Tool Technical Specification

Migration Guide: Data Migration Tool Technical Specification

Magento 2
Data Migration Tool Technical Specification Overview This section describes an implementation details of Data Migration Tool and how to extend...
Read More
Migration Guide: After Migration

Migration Guide: After Migration

Magento 2
After Migration After you have completed your migration and thoroughly tested your new Magento 2 site, perform the following tasks:...
Read More
Migration Guide: Troubleshooting

Migration Guide: Troubleshooting

Magento 2
Troubleshooting Common error messages This section is about the errors that might occur when you run the Data Migration Tool,...
Read More
Migration Guide: Data that needs to be migrated manually

Migration Guide: Data that needs to be migrated manually

Magento 2
Data types There are four kinds of data that need to be migrated manually: Media Storefront design Admin user accounts Access Control...
Read More
Migration Guide: Follow-up (info and steps)

Migration Guide: Follow-up (info and steps)

Magento 2
Follow-up (info and steps) Overview Some behaviour and logic of Magento 1 has been implemented differently in Magento 2. The...
Read More
Migration Guide: Migrate changes

Migration Guide: Migrate changes

Magento 2
Migrate changes Overview Incremental migration enables you to migrate only the changes made in Magento 1 since the last time...
Read More
Migration Guide: Migrate data

Migration Guide: Migrate data

Magento 2
Migrate data Before you start: routine preparations Log in to Magento server as the file system owner. Change to the Magento /bin directory...
Read More
Migration Guide: Migrate settings

Migration Guide: Migrate settings

Magento 2
Migrate settings Overview The Settings mode migrates stores, websites, and system configuration like shipping, payment, tax settings, etc. According to our data...
Read More
Migration Guide: Migrate using Data Migration Tool

Migration Guide: Migrate using Data Migration Tool

Magento 2
Migrate using Data Migration Tool General rules for successful migration Before you start migration, stop all Magento 1 cron jobs....
Read More
Migration Guide: Configure migration

Migration Guide: Configure migration

Magento 2
Configure migration Overview of Data Migration Tool configuration After you install the data migration tool, the following directory contains mapping...
Read More
Migration Guide: Upgrade Data Migration Tool

Migration Guide: Upgrade Data Migration Tool

Magento 2
Upgrade Data Migration Tool Why do I need to upgrade? To make sure the versions of your current Magento 2...
Read More
Migration Guide: Install Data Migration Tool

Migration Guide: Install Data Migration Tool

Magento 2
Install Data Migration Tool Prerequisite: Versions of Magento and Data Migration Tool must match Make sure you are using the same...
Read More
Migration Guide: Preconditions

Migration Guide: Preconditions

Magento 2
Preconditions Before starting migration, make sure the following requirements are met. Magento 2 system Set up your Magento 2 system...
Read More
Migration Guide: Data Migration Tool

Migration Guide: Data Migration Tool

Magento 2
Overview Data Migration Tool is a command-line interface (CLI) used for transferring data from Magento 1 to Magento 2. The...
Read More
Migration Guide: Creating a migration plan

Migration Guide: Creating a migration plan

Magento 2
Creating a migration plan Click the link to go to the site: GO TO THE LINKED SITE To migrate successfully and...
Read More
Migration Guide: How migration works

Migration Guide: How migration works

Magento 2
How migration works Click the link to go to the site: GO TO THE LINKED SITE Terminology This document uses the...
Read More
Migration Guide: Versions supported

Migration Guide: Versions supported

Magento 2
Versions supported Click the link to go to the site: GO TO THE LINKED SITE Migration from versions The Data Migration...
Read More
Migration Guide: Best practices and benchmarking

Migration Guide: Best practices and benchmarking

Magento 2
Best practices and benchmarking Click the link to go to the article: GO TO THE LINKED SITE Overview This section provides...
Read More
Migration overview

Migration overview

Magento 2
Welcome! We’re pleased you’re considering moving from the world’s #1 commerce platform — Magento 1.x — to the platform for...
Read More
Migrate data from Magento 1 to Magento 2

Migrate data from Magento 1 to Magento 2

Magento 2
Migrate data from Magento 1 to Magento 2 Data Migration allows you to migrate several types of data from your...
Read More
Migrate code from Magento 1 to Magento 2

Migrate code from Magento 1 to Magento 2

Magento 2
Migrate code from Magento 1 to Magento 2 Custom code used by your Magento 1 store is compatible with Magento...
Read More
Migrate extensions from Magento 1 to Magento 2

Migrate extensions from Magento 1 to Magento 2

Magento 2
Migrate extensions from Magento 1 to Magento 2 Magento 1 extensions in most cases will not be compatible with Magento...
Read More
Migrate themes from Magento 1 to Magento 2

Migrate themes from Magento 1 to Magento 2

Magento 2
Migrate themes from Magento 1 to Magento 2 Magento 1 themes cannot be migrated to Magento 2 directly but we...
Read More
Migrate from Magento 1 to Magento 2

Migrate from Magento 1 to Magento 2

Magento 2
Migrate from Magento 1 to Magento 2 Migration to Magento 2 involves four components: data, extensions, themes, and customizations. To...
Read More
[IT지식] 무료이미지 사이트 PIXABAY

[IT지식] 무료이미지 사이트 PIXABAY

Photoshop
Click the link to read the article: 블로그 내용보러가기 ================= 세월이 흐를수록 저작권에 대한 문제가 점점 대두됨으로써 우리가 찾아 사용할 수...
Read More
How to create a bootable Windows 8.1 USB drive

How to create a bootable Windows 8.1 USB drive

Windows
How to create a bootable Windows 8.1 USB drive Click the link to read the article: Create a bootable windows 8.1...
Read More
How to find a WordPress Category ID

How to find a WordPress Category ID

WordPress
How to find a WordPress Category ID Click the link to read the article: https://www.wpwhitesecurity.com ==== When installing a new theme...
Read More
Windows 10: Show Wi-Fi Password

Windows 10: Show Wi-Fi Password

Windows
Windows 10: Show Wi-Fi Password Click the link to read the article: Show Wi-Fi Password ====== Solution Right click on the...
Read More
Configuring www folder on Ubuntu (Amazon EC2)

Configuring www folder on Ubuntu (Amazon EC2)

Web Server
Configuring www folder on Ubuntu (Amazon EC2) Click the link to read the article: Configuring www folder on Ubuntu ===== After...
Read More
Amazon EC2 Instance Types

Amazon EC2 Instance Types

Web Server
Amazon EC2 Instance Types Click the link to read the article: https://aws.amazon.com/ec2/instance-types/ ==== Amazon EC2 provides a wide selection of instance...
Read More
Top 7 Best Magento 2 Extensions for Wholesale and B2B Business

Top 7 Best Magento 2 Extensions for Wholesale and B2B Business

Magento 2
Top 7 Best Magento 2 Extensions for Wholesale and B2B Business Click the link to red the article: Magento 2 Extensions...
Read More
브라우저별 자체 기능으로 마우스 우클릭 해제 하는 방법

브라우저별 자체 기능으로 마우스 우클릭 해제 하는 방법

Windows
브라우저별 자체 기능으로 마우스 우클릭 해제 하는 방법 Click the link to read the article: http://mastmanban.tistory.com/877 == 인터넷을 돌아 다니다 보면...
Read More
Automatically enable HTTPS on your website with EFF’s Certbot, deploying Let’s Encrypt certificates.

Automatically enable HTTPS on your website with EFF’s Certbot, deploying Let’s Encrypt certificates.

Web Server
Apache on Ubuntu 16.04 (xenial) Click the link to read the article: https://certbot.eff.org/#ubuntuxenial-apache === Install On Ubuntu systems, the Certbot team...
Read More
워드프레스 테마 만들기 | 기본 구조 만들기

워드프레스 테마 만들기 | 기본 구조 만들기

WordPress
워드프레스 테마 만들기 | 기본 구조 만들기 Click the link to read the article: https://www.cmsfactory.net/ === index.php 기본 구조 만들기 index.php에...
Read More
한번에 끝내는 Ubuntu 웹서버 세팅(우분투서버세팅)

한번에 끝내는 Ubuntu 웹서버 세팅(우분투서버세팅)

Web Server
한번에 끝내는 Ubuntu 웹서버 세팅(우분투서버세팅) Click the link to read the article: https://blog.lael.be/post/73 === English version is also available : https://fakepath.link/easy-way-install-ubuntu-apache-mysql-php/ [주의] 기존의 Ubuntu 14.04 세팅방법...
Read More
AWS EC2(우분투)에 워드프레스 설치하기

AWS EC2(우분투)에 워드프레스 설치하기

Web Server
AWS EC2(우분투)에 워드프레스 설치하기 Click the link to read the article: http://lky1001.tistory.com/91 === AWS EC2 무료 서버 얻기(http://lky1001.tistory.com/88) SSH로 접속하기(http://lky1001.tistory.com/89) 우분투에...
Read More
Certbot – user guide

Certbot – user guide

Web Server
Certbot User Guide: Free SSL Click the link to read the article: https://certbot.eff.org/docs/using.html#renewal ==== Managing certificates To view a list of...
Read More
조대협의 블로그

조대협의 블로그

Web Server
조대협의 블로그 http://bcho.tistory.com/
Read More
AWS 모바일 서비스로 성공하는 모바일 앱 만들기 (윤석찬) – AWS Webiniar 2015

AWS 모바일 서비스로 성공하는 모바일 앱 만들기 (윤석찬) – AWS Webiniar 2015

Mobile App
AWS 모바일 서비스로 성공하는 모바일 앱 만들기 (윤석찬) - AWS Webiniar 2015 Click the link to read the article: AWS 모바일...
Read More
Ubuntu 16.04에 LAMP ( Apache2, MySQL , PHP5 / PHP7) 설치하는 방법

Ubuntu 16.04에 LAMP ( Apache2, MySQL , PHP5 / PHP7) 설치하는 방법

Web Server
Ubuntu 16.04에 LAMP ( Apache2, MySQL , PHP5 / PHP7) 설치하는 방법 Click the link to read the article: http://webnautes.tistory.com/1028 ===...
Read More
[Ubuntu] Let’s Encrypt 를 사용하여 무료로 SSL 사이트를 구축하는 방법

[Ubuntu] Let’s Encrypt 를 사용하여 무료로 SSL 사이트를 구축하는 방법

Web Server
[Ubuntu] Let’s Encrypt 를 사용하여 무료로 SSL 사이트를 구축하는 방법 Click the link to read the article: https://blog.lael.be/post/5107 === [Ubuntu] Let’s...
Read More
외부 도메인을 AWS에 설정하기

외부 도메인을 AWS에 설정하기

Web Server
외부 도메인을 AWS에 설정하기 Click the link to read the article: 외부 도메인을 AWS에 설정하기 ==== 드디어 서버 이전을 완료했다. 그동안...
Read More
How to install SUPEE-9767 without SSH?

How to install SUPEE-9767 without SSH?

Magento 1
How to install SUPEE-9767 without SSH? Click the link: https://magentary.com/kb/install-supee-9767-without-ssh/ ==== Magento Maintenance » How to install SUPEE-9767 without SSH JUN012017 How...
Read More
Node.js Programming

Node.js Programming

Web Server
Node.js Programming - ebook Click the link to read the article: Node.js-programming-ebook  
Read More
How to flush Magento 1.9.x cache using SSH?

How to flush Magento 1.9.x cache using SSH?

Magento 1
How to flush Magento 1.9.x cache using SSH? Click the link to read the article: https://magento.stackexchange.com/ ==== I have resolved the...
Read More
Magento 1.9.2.1 Re-index magento via ssh

Magento 1.9.2.1 Re-index magento via ssh

Magento 1
Magento 1.9.2.1 Re-index magento via ssh Click the link to read the article: https://magento.stackexchange.com/questions/117881/re-index-magento-via-ssh-putty ====   15down vote You are running...
Read More
Magento 2 – Fatal Error “Can’t create directory” var/generation/Magento/

Magento 2 – Fatal Error “Can’t create directory” var/generation/Magento/

Magento 2
Magento 2 - Fatal Error “Can't create directory” var/generation/Magento/ Click the link to read the article: Magento 2 - Fatal Error...
Read More
Please upgrade your database: Run “bin/magento setup:upgrade” from the Magento root directory

Please upgrade your database: Run “bin/magento setup:upgrade” from the Magento root directory

Magento 2
Please upgrade your database: Run “bin/magento setup:upgrade” from the Magento root directory Click to the link to read the articles: Please...
Read More
SSL/TLS를 사용하여 Amazon Linux에서 Apache 웹 서버 구성

SSL/TLS를 사용하여 Amazon Linux에서 Apache 웹 서버 구성

Web Server
SSL/TLS를 사용하여 Amazon Linux에서 Apache 웹 서버 구성 Click the link to read the article: http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/SSL-on-an-instance.html === ecure Sockets Layer/Transport...
Read More
[AWS] ACM(AMAZON CERTIFICATE MANAGER)  로 SSL 인증서 적용하는 방법

[AWS] ACM(AMAZON CERTIFICATE MANAGER) 로 SSL 인증서 적용하는 방법

Web Server
[AWS] ACM(AMAZON CERTIFICATE MANAGER) 로 SSL 인증서 적용하는 방법 Click the link to read the articles: http://blog.freezner.com/archives/1828 ====== 2017년 1월 13일...
Read More
모바일 앱을 만들 수 있는 10가지 Tools

모바일 앱을 만들 수 있는 10가지 Tools

Mobile App
모바일 앱을 만들 수 있는 10가지 Tools Click to the link to read the article: http://www.itworld.co.kr/slideshow/98811 ==============================
Read More
시작하는 스타트업을 위한 iOS 개발 환경 (1/2)

시작하는 스타트업을 위한 iOS 개발 환경 (1/2)

Mobile App
시작하는 스타트업을 위한 iOS 개발 환경 (1/2) Click the link to read the article: 스타트업을위한 ios개발환경 === 시작하는 스타트업을 위한 iOS...
Read More
10분 자습서로 AWS를 시작하기

10분 자습서로 AWS를 시작하기

Web Server
10분 자습서로 AWS를 시작하기 Click the link to read the article: AWS를 시작하기 === 10분 자습서로 AWS를 시작하기 10분 자습서는 AWS를...
Read More
AWS Mobile

AWS Mobile

Mobile App
AWS에서 모바일 앱을 구축하는 가장 빠른 방법 Click the link to read the article: https://aws.amazon.com/ko/mobile/ ====== AWS는 사용자를 수억 명까지 늘리고...
Read More
혼자서 모바일 앱 기획부터 개발까지

혼자서 모바일 앱 기획부터 개발까지

Mobile App
혼자서 모바일 앱 기획부터 개발까지 Click the link to read the article:  모바일 앱 기획부터 개발 ===
Read More
5일 만에 아이폰 앱 개발하기: 아이폰 개발을 시작하는 초보자를 위한

5일 만에 아이폰 앱 개발하기: 아이폰 개발을 시작하는 초보자를 위한

Mobile App
5일 만에 아이폰 앱 개발하기: 아이폰 개발을 시작하는 초보자를 위한 Click the link to go to : 아이폰 앱 개발하기 ===...
Read More
Eclipse + Andmore 기반 Android 개발환경 구축하기

Eclipse + Andmore 기반 Android 개발환경 구축하기

Mobile App
Eclipse + Andmore 기반 Android 개발환경 구축하기 Click the link to go to: http://webnautes.tistory.com/1112 === Eclipse에 Andmore 플러그인을 설치하여 Support ,...
Read More
하이브리드 앱 강좌 #1. 개발환경 준비, 설치

하이브리드 앱 강좌 #1. 개발환경 준비, 설치

Mobile App
하이브리드 앱 강좌 #1. 개발환경 준비, 설치 Clink the link to: http://www.nam.or.kr/archives/21509?ckattempt=1 ===  
Read More
How to use Gmail for your Godaddy email

How to use Gmail for your Godaddy email

Web Server
How to use Gmail for your Godaddy email Click to the link: http://www.brandrevive.com/how-to-use-gmail-for-your-godaddy-email/ ======================= How to use Gmail for your Godaddy...
Read More
Ultimo Help. Can not get slider blocks to display despite working before.

Ultimo Help. Can not get slider blocks to display despite working before.

Magento 1
Ultimo Help. Can not get slider blocks to display despite working before. Click to the link: https://understandinge.com/forum/magento-theming-design/ultimo-help-can-not-get-slider-blocks-to-display-despite-working-before/ === Can anyone help...
Read More
워드프레스 데이터베이스 들여다보기.

워드프레스 데이터베이스 들여다보기.

WordPress
워드프레스 데이터베이스 들여다보기. 퍼 온글 입니다: https://guspark.wordpress.com/ ==== 프로젝트나 새로운 업무를 맡게 되면 업무 분석이 필수적이다. 쉬운 방법으로 소스 디버깅을  선택할...
Read More
How to deactivate a plugin when you are locked out of WP-Admin?

How to deactivate a plugin when you are locked out of WP-Admin?

WordPress
How to deactivate a plugin when you are locked out of WP-Admin? Click to the link: http://docs.ultimatemember.com/article/244-how-to-deactivate-a-plugin-when-you-are-locked-out-of-wp-admin ===== If you need...
Read More
워드프레스 사용자 등급별 역할과 권한 정리

워드프레스 사용자 등급별 역할과 권한 정리

WordPress
워드프레스 사용자 등급별 역할과 권한 정리 Click to the link: http://hwangc.com/wordpress-user-role-capability/ ==== 워드프레스 사용자 등급별 역할과 권한 정리 워드프레스 블로그 운영자...
Read More
How can access AWS RDS by CLI / PUTTY?

How can access AWS RDS by CLI / PUTTY?

Web Server
How can access AWS RDS by CLI / PUTTY? Click to the link: https://stackoverflow.com/questions/21020416/how-can-access-aws-rds-by-cli-putty ==== RDS is not available to the...
Read More
워드프레스 폰트 설치, 제거, 초기화 방법 – 구글 한글 웹폰트 적용

워드프레스 폰트 설치, 제거, 초기화 방법 – 구글 한글 웹폰트 적용

WordPress
워드프레스 폰트 설치, 제거, 초기화 방법 – 구글 한글 웹폰트 적용 퍼 온글 입니다: http://blooom.co.kr/ ===== 워드프레스를 처음 설치하면, twentyfifteen 이라는...
Read More
워드프레스 자동 업데이트 비활성화하기

워드프레스 자동 업데이트 비활성화하기

WordPress
워드프레스 자동 업데이트 비활성화하기 Click to the link: http://blooom.co.kr/ ====== 워드프레스는 기본적으로 새로운 버전이 나오면 자동으로 업데이트됩니다. 그리고 테마와 플러그인은 업데이트가...
Read More
How to configure & run cron in Magento 2

How to configure & run cron in Magento 2

Magento 2
How to configure & run cron in Magento 2 Click to the link: https://www.cloudways.com/blog/magento-2-cron-job/ ===== Magento 2 comes with many awesome...
Read More
depreciation notice error in phpmyadmin with 16.04

depreciation notice error in phpmyadmin with 16.04

Web Server
depreciation notice error in phpmyadmin with 16.04 Click to the link: https://askubuntu.com/questions/796135/depreciation-notice-error-in-phpmyadmin-with-16-04/796705#796705 ===== Questions: I am getting errors when I launch...
Read More
AWS SSL 적용방법

AWS SSL 적용방법

Web Server
AWS SSL 적용방법 ===== Click to the link: http://interconnection.tistory.com/21  
Read More
How to Add CSS & Javascript Files to CMS Pages in Magento

How to Add CSS & Javascript Files to CMS Pages in Magento

Magento 1
How to Add CSS & Javascript Files to CMS Pages in Magento Click to the link: https://www.rowanburgess.co.uk/magento-how-to/add-css-javascript-files-cms-pages-magento/ === If you’re creating...
Read More
Update Your Amazon AMI from PHP5.3 to PHP5.4 or Higher

Update Your Amazon AMI from PHP5.3 to PHP5.4 or Higher

Web Server
Update Your Amazon AMI from PHP5.3 to PHP5.4 or Higher Click to the link: http://brianshim.com/webtricks/update-amazon-ami-php5-3-to-php5-4/ ==== I recently discovered that PHP5.4...
Read More
Amazon EC2: Upgrading from PHP 5.3 to PHP 5.6

Amazon EC2: Upgrading from PHP 5.3 to PHP 5.6

Web Server
Amazon EC2: Upgrading from PHP 5.3 to PHP 5.6 Click to the link: http://greggborodaty.com/amazon-ec2-upgrading-from-php-5-3-to-php-5-6/ ===== I launched my first Amazon instance...
Read More
서버에서 실행할 애플리케이션 소프트웨어가 설치된 PHP 버전 또는 다른 소프트웨어와 호환되지 않습니다

서버에서 실행할 애플리케이션 소프트웨어가 설치된 PHP 버전 또는 다른 소프트웨어와 호환되지 않습니다

Web Server
문제 해결 이 섹션에서는 새 LAMP 서버를 설정하는 동안 발생할 수 있는 일반적인 문제 해결을 위한 제안을 제공합니다. 웹 브라우저를...
Read More
Update AMI to include PHP 5.5

Update AMI to include PHP 5.5

Web Server
Update AMI to include PHP 5.5 Click to the link: https://forums.aws.amazon.com/message.jspa?messageID=556040 ==== Re: Update AMI to include PHP 5.5 Posted by:...
Read More
Install Apache, MySQL and PHP 5.5 on Amazon Linux AMI

Install Apache, MySQL and PHP 5.5 on Amazon Linux AMI

Web Server
Install Apache, MySQL and PHP 5.5 on Amazon Linux AMI Click to the link: https://gist.github.com/sl-digital/9838411 ==== :: UPDATE YUM :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: sudo...
Read More
Setup AWS EC2 and RDS (php5.5, apache2.4, mysql5.5, phpmyadmin)

Setup AWS EC2 and RDS (php5.5, apache2.4, mysql5.5, phpmyadmin)

Web Server
Setup AWS EC2 and RDS (php5.5, apache2.4, mysql5.5, phpmyadmin) Click to the link: https://gist.github.com/suvozit/8998731 ===== Launch an instance http://docs.aws.amazon.com/AmazonVPC/latest/GettingStartedGuide/GetStarted.html Security group...
Read More
워드프레스 사이트 아마존 AWS 에 설치하기 + VARNISH, MEMCACHED 까지 덤 [출처] 워드프레스 사이트 아마존 AWS 에 설치하기 + VARNISH, MEMCACHED 까지 덤

워드프레스 사이트 아마존 AWS 에 설치하기 + VARNISH, MEMCACHED 까지 덤 [출처] 워드프레스 사이트 아마존 AWS 에 설치하기 + VARNISH, MEMCACHED 까지 덤

WordPress
워드프레스 사이트 아마존 AWS 에 설치하기 + VARNISH, MEMCACHED 까지 덤 [출처] 워드프레스 사이트 아마존 AWS 에 설치하기 + VARNISH,...
Read More
[마젠토2] 마젠토2 + PHP7 아마존 AWS에 설치하는 방법 ( 개발환경설치 )

[마젠토2] 마젠토2 + PHP7 아마존 AWS에 설치하는 방법 ( 개발환경설치 )

Magento 2
[마젠토2] 마젠토2 + PHP7 아마존 AWS에 설치하는 방법 ( 개발환경설치 ) Click to the link: http://blog.naver.com/PostView.nhn?blogId=smileboylab&logNo=220770601647
Read More
Setup AWS EC2 and RDS (php5.5, apache2.4, mysql5.5, phpmyadmin)

Setup AWS EC2 and RDS (php5.5, apache2.4, mysql5.5, phpmyadmin)

Web Server
Setup AWS EC2 and RDS (php5.5, apache2.4, mysql5.5, phpmyadmin) Click to the link: https://gist.github.com/suvozit/8998731 ==== Launch an instance http://docs.aws.amazon.com/AmazonVPC/latest/GettingStartedGuide/GetStarted.html Security group...
Read More
How to install MySQL on an Amazon EC2 Server Instance?

How to install MySQL on an Amazon EC2 Server Instance?

Web Server
How to install MySQL on an Amazon EC2 Server Instance? Click to the link: http://text-analytics101.rxnlp.com/2013/11/how-to-install-mysql-on-amazon-ec2.html ==== How to install MySQL on...
Read More
mysql Command-line Client

mysql Command-line Client

Linux / Unix
mysql Command-line Client Click to the link: https://mariadb.com/kb/en/mariadb/mysql-command-line-client/#how-to-test-which-protocol-is-used === About the mysql command-line client mysql is a simple SQL shell (with...
Read More

chkdsk – Guide for Windows XP, Vista, 7, 8, 8.1, 10

Web Server
chkdsk – Guide for Windows XP, Vista, 7, 8, 8.1, 10 Click to the link: https://neosmart.net/wiki/chkdsk/#From_Command_Prompt-4 === CHKDSK is a Windows...
Read More

MySQL 데이터베이스 엔진 기반 DB 인스턴스에 연결하기

Web Server
MySQL 데이터베이스 엔진 기반 DB 인스턴스에 연결하기 === http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html  
Read More

AWS RDS 스냅샷 이용하기

Web Server
AWS RDS 스냅샷 이용하기 Click to the link: http://wildpup.cafe24.com/archives/754?ckattempt=1
Read More
안드로이드 스튜디오로 앱 개발을 하기 전에 알아둬야 하는 것

안드로이드 스튜디오로 앱 개발을 하기 전에 알아둬야 하는 것

Mobile App
안드로이드 스튜디오로 앱 개발을 하기 전에 알아둬야 하는 것  Click the link to go to the blog site: 안드로이드 스튜디오로 앱...
Read More
[안드로이드 강좌] [1] : Android Studio (안드로이드 스튜디오) 설치

[안드로이드 강좌] [1] : Android Studio (안드로이드 스튜디오) 설치

Mobile App
안드로이드 스튜디오 설치하기 Click the link to go to the blog site: 안드로이드 스튜디오 설치하기 ==== [출처] [안드로이드 강좌] [1] :...
Read More
안드로이드 스튜디오 강좌 목록 (새 버전)

안드로이드 스튜디오 강좌 목록 (새 버전)

Mobile App
안드로이드 스튜디오 강좌 목록 (새 버전) Click the link to go to the blog site: 안드로이드 스튜디오 강좌 목록 =====...
Read More
Ionic을 이용한 iOS, Android 하이브리드 앱 개발 사례

Ionic을 이용한 iOS, Android 하이브리드 앱 개발 사례

Mobile App
Ionic을 이용한 iOS, Android 하이브리드 앱 개발 사례 출처: http://blog.saltfactory.net Click to the link: 하이브리드 앱 개발 사례 === 서론 하이브레인넷 부설...
Read More
하이브리드앱 쉽게 만들기 강좌 #0 appery 개요

하이브리드앱 쉽게 만들기 강좌 #0 appery 개요

Mobile App
하이브리드앱 쉽게 만들기 강좌 #0 appery 개요 Click to the link: http://logmario.tistory.com/1 === appery 강좌를 시작하겠습니다. 우리나라에서는 생소하실 수 있는데요 저는...
Read More
대세는 하이브리드 앱

대세는 하이브리드 앱

Mobile App
대세는 하이브리드 앱 <저작권자(c)스마트앤컴퍼니> Click to the link: 하이브리드 앱 === 네이티브 앱보다 저렴…모바일 웹과 앱의 기능 차이 줄여 2013년 03월호...
Read More
모바일 웹과 반응형 웹 비교

모바일 웹과 반응형 웹 비교

Mobile App
모바일 웹과 반응형 웹 비교 Click to the link: 모바일 웹과 반응형 웹 비교 ==== [위시켓 / 그린 클라이언트 #25]  ...
Read More
모바일 웹과 앱(어플)의 차이점!

모바일 웹과 앱(어플)의 차이점!

Mobile App
모바일 웹과 앱(어플)의 차이점! Click to the link: 모바일 웹과 앱(어플)의 차이점 === 모바일 웹과 앱(어플)의 차이점!  생활의 발견/모바일 웹과 앱의...
Read More
HTML 편집기에서 작성한 코드가 저장되지 않습니다

HTML 편집기에서 작성한 코드가 저장되지 않습니다

Web Server
HTML 편집기에서 작성한 코드가 저장되지 않습니다 Click to the link: https://github.com/xpressengine/xe-core/issues/1882   1.8.18에서 새로 생긴 버그가 맞네요. 해결책: modules/document/document.controller.php 455~458줄...
Read More
Magento: How can I change the shipping method title at the checkout page?

Magento: How can I change the shipping method title at the checkout page?

Magento 1
Magento: How can I change the shipping method title at the checkout page? 1down vote To change the shipping methods...
Read More
How to reset the Magento administrator password

How to reset the Magento administrator password

Magento 1
How to reset the Magento administrator password Click to the link: https://www.a2hosting.com/kb/installable-applications/optimization-and-configuration/magento1/resetting-the-magento-administrator-password == This article describes how to reset the Magento...
Read More
How to configure PHP using .user.ini

How to configure PHP using .user.ini

Web Server
How to configure PHP using .user.ini Click to the link: https://www.gearhost.com/documentation/how-to-configure-user-ini === Introduction You can use a .user.ini file with your...
Read More
How To Fix STOP Error 0xc000021A In Windows 8.1

How To Fix STOP Error 0xc000021A In Windows 8.1

Web Server
How To Fix STOP Error 0xc000021A In Windows 8.1 Click to the link: http://www.windowswally.com/how-to-fix-stop-error-0xc000021a-in-windows-8-1/ ===== Reader Question: “Hi Wally, My laptop...
Read More
Store Manager for Magento Documentation

Store Manager for Magento Documentation

Magento 1
Store Manager for Magento Documentation Click to the link: http://store-manager-for-magento-documentation.emagicone.com/ === WELCOME TO STORE MANAGER FOR MAGENTO HELP CENTER Store Manager...
Read More
Creating a Magento theme from scratch

Creating a Magento theme from scratch

Magento 1
Creating a Magento theme from scratch Click to the link: http://inchoo.net/magento/creating-a-new-magento-theme/ ==== Powerful fallback system, organized folder structure and tons of...
Read More
How to create a new Package/Theme in Magento

How to create a new Package/Theme in Magento

Magento 1
How to create a new Package/Theme in Magento Click to the link: https://thetomorrowlab.com/2012/10/how-to-create-a-new-packagetheme-in-magento/ ==== When I first started working with Magento...
Read More
How To Setup Multiple Magento Stores

How To Setup Multiple Magento Stores

Magento 1
How To Setup Multiple Magento Stores Click to the link: https://www.crucialhosting.com/knowledgebase/setup-multiple-magento-stores === This article was last updated on November 4th, 2015...
Read More
Wholesale/Retail Prices and Shipping Rates based on Customer Group

Wholesale/Retail Prices and Shipping Rates based on Customer Group

Magento 1
Wholesale/Retail Prices and Shipping Rates based on Customer Group Click to the link: http://www.opencartas.com/magento/wholesale-retail-prices-and-shipping-rates-based-on-customer-group-16866.html === I wasn’t very happy with the...
Read More
How to Setup Magento with Multiple Stores and Domains

How to Setup Magento with Multiple Stores and Domains

Magento 1
How to Setup Magento with Multiple Stores and Domains Click to the link: https://www.properhost.com/support/kb/30/How-To-Setup-Magento-With-Multiple-Stores-And-Domains ==== One of the useful features in...
Read More
Magento how to create wholesale Store

Magento how to create wholesale Store

Magento 1
Magento how to create wholesale Store Click to the link: https://vijayexpertsoft.wordpress.com/2014/11/23/magento-how-to-create-wholesale-store/ === Here  are the Steps to creating magento wholesale store...
Read More
How to configure multiple Magento storefronts

How to configure multiple Magento storefronts

Magento 1
How to configure multiple Magento storefronts Click to the link: https://docs.nexcess.net/article/how-to-configure-multiple-magento-storefronts.html == How to configure multiple Magento storefronts Overview This article...
Read More
CREATING A MAGENTO WHOLESALE STORE

CREATING A MAGENTO WHOLESALE STORE

Magento 1
CREATING A MAGENTO WHOLESALE STORE Click to the link: https://www.hummingbirduk.com/creating-magento-wholesale-store/ ===== Wholesale with Magento Many of our clients who both produce...
Read More
Wholesaling With Magento: How is it done?

Wholesaling With Magento: How is it done?

Magento 1
Wholesaling With Magento: How is it done? Click to the link : https://www.sherodesigns.com/wholesale-with-magento/ === Posted February 25, 2015 by Joel in...
Read More
6) How to Make Money with Your Blog

6) How to Make Money with Your Blog

Online Marketing
How to Make Money with Your Blog Link: https://www.bloggingbasics101.com/how-can-i-make-money-from-my-blog/ === You want to make money, right? Of course you do....
Read More
5) 7 Ways to Boost Your Success as a Blogger

5) 7 Ways to Boost Your Success as a Blogger

Online Marketing
5) 7 Ways to Boost Your Success as a Blogger Link: https://www.bloggingbasics101.com/7-ways-to-boost-your-success-as-a-blogger/ === All bloggers have one thing in common:...
Read More
4) 5 Beginning Blogging Mistakes You Can Fix

4) 5 Beginning Blogging Mistakes You Can Fix

Online Marketing
5 Beginning Blogging Mistakes You Can Fix Link: https://www.bloggingbasics101.com/5-mistake-to-avoid-when-starting-a-new-blog/ === Congratulations! You’ve decided to join the ranks of bloggers. You’re...
Read More
3) Choosing a Blogging Niche

3) Choosing a Blogging Niche

Online Marketing
3) Choosing a Blogging Niche Link: https://www.bloggingbasics101.com/choosing-a-blogging-niche/ === Are you considering starting a blog? Great! You have the first step...
Read More
2) Choose the Best Blogging Platform – Comparison 2016

2) Choose the Best Blogging Platform – Comparison 2016

Online Marketing
2) Choose the Best Blogging Platform – Comparison 2016 Link: https://www.bloggingbasics101.com/choosing-a-blogging-platform-quick-reference/ === Deciding to start a blog comes with a...
Read More
1) How To Start a Blog – Beginner’s Guide for 2017

1) How To Start a Blog – Beginner’s Guide for 2017

Online Marketing
1) How To Start a Blog – Beginner’s Guide for 2017 Link: https://www.bloggingbasics101.com/how-do-i-start-a-blog/ === – Guide by Jessica Knapp (updated...
Read More
Choose the Best Blogging Platform – Comparison 2016

Choose the Best Blogging Platform – Comparison 2016

Online Marketing
Choose the Best Blogging Platform – Comparison 2016 Link: https://www.bloggingbasics101.com/choosing-a-blogging-platform-quick-reference/ ===== Deciding to start a blog comes with a lot...
Read More
블로그로 돈버는 방법 – 2016년 버전

블로그로 돈버는 방법 – 2016년 버전

Online Marketing
블로그로 돈버는 방법 – 2016년 버전 link: https://contentsfree.com/블로그로-돈버는-방법-2016년-버전/ === 블로그로 돈버는 방법 궁금하신가요? 주변에 보면 블로그로 돈을 벌고 있다는 얘기가...
Read More
이메일 마케팅이 아직도 필요한 이유

이메일 마케팅이 아직도 필요한 이유

Online Marketing
이메일 마케팅이 아직도 필요한 이유 https://blogs.adobe.com/digitaldialogue/ko/digital-marketing-ko/email-marketing-tips/ === 마케팅에서 디지털을 빼놓고는 이야기할 수 없는 시대가 됐다. 페이스북을 통해 기업의 메시지를 전파하고,...
Read More
해외 베스트 탑10 웹호스팅 업체

해외 베스트 탑10 웹호스팅 업체

Web Server
해외 베스트 탑10 웹호스팅 업체 http://www.thebesttop10hosting.com/ ==== 베스트 탑10 웹호스팅에거는 웹 호스팅 기술의 최고 업체 리스트를 제공합니다. since 2008 해외에는...
Read More
Optimize magento database by Cleaning log

Optimize magento database by Cleaning log

Magento 1
Optimize magento database by Cleaning log http://magento2x.com/optimize-magento-database-by-cleaning-log/ === Optimize Magento Database is one of a very important task of developer...
Read More
Creating fancy FAQ page in Magento – an easier approach

Creating fancy FAQ page in Magento – an easier approach

Magento 1
Creating fancy FAQ page in Magento – an easier approach http://www.blog.magepsycho.com/creating-fancy-faq-page-in-magento-an-easier-approach/ == Introduction Just keep reading this tutorial which will...
Read More
77 useful Linux commands and utilities

77 useful Linux commands and utilities

Linux / Unix
77 useful Linux commands and utilities Click to the following link to the read the article: http://searchenterpriselinux.techtarget.com/tutorial/77-useful-Linux-commands-and-utilities
Read More
MVC (Model–view–controller) frameworks

MVC (Model–view–controller) frameworks

Tech Terms
MVC (Model–view–controller) frameworks https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller ===== Model–view–controller (MVC) is a software design pattern for implementing user interfaces on computers. It divides a given software application into...
Read More
MVM frameworks

MVM frameworks

Tech Terms
MVM frameworks  https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel === From Wikipedia, the free encyclopedia (Redirected from Model View ViewModel) Model–view–view-model (MVVM) is a software architectural pattern. MVVM facilitates...
Read More
Business Process Management (BPM)

Business Process Management (BPM)

Tech Terms
Business Process Management (BPM) http://searchcio.techtarget.com/definition/business-process-management ==== Business process management (BPM) is a systematic approach to making an organization's workflow more...
Read More
Service Oriented Architecture (SOA)

Service Oriented Architecture (SOA)

Tech Terms
Service Oriented Architecture (SOA) https://www-01.ibm.com/software/solutions/soa/ === Service Oriented Architecture (SOA) has several core ideas that should be addressed in your organization's...
Read More
How to add CSS & Javascript to Magento Themes?

How to add CSS & Javascript to Magento Themes?

Magento 1
How to add CSS & Javascript to Magento Themes? http://vivacityinfotech.net/magento/how-to-add-css-javascript-to-magento-themes/ ==== n Web development JS & CSS files play a...
Read More
Bash 입문자를 위한 핵심 요약 정리 (Shell Script)
Linux / Unix

Bash 입문자를 위한 핵심 요약 정리 (Shell Script)

Click the link to read the original article: Here

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

Bash 입문자를 위한 기본적인 문법과 알고 있으면 좋은 것들만 정리했다.
(이런 것도 있구나 싶을 정도만 이해하도록 간단한 설명과 예제로 작성됨)

첫 시작은 문자 출력하기(Hello World)

고전적이지만 “hello world” 단순 출력부터 시작해보자.
파일명은 hello.sh로 만들고 실행해보자. 단 두줄이면 끝이다.
(만일 실행이 안된다면 퍼미션을 변경해야되는데 뭔지 모르겠다면 일단 이렇게 해봐라.chmod 700 hello.sh)
참고: echo 문장을 출력하는데 자동으로 줄바꿈 됨
참고: printf C언어와 비슷함

#!/usr/bin/env bash
echo "hello world"
printf "hello world"
printf "%s %s" hello world

 

주석(Comments)

# 기호로 시작하면 주석이다.

함수(Function)

형식은 다른 언어와 차이는 없다. 그러나 function는 생략해도 된다.
함수 명을 쓰면 함수가 호출이 되는데 주의할 것은 호출 코드가 함수 코드보다 반드시 뒤에 있어야 된다. 함수 코드 보다 앞에서 호출 시 오류가 발생한다.

string_test() {
    echo "string test"
}

function string_test2() {
    echo "string test 2"
    echo "인자값: ${@}"
}
string_test
string_test2

# 함수에 인자값 전달하기(공백의로 뛰어서 2개의 인자값을 넘김)
string_test2 "hello" "world"

 

변수(Variable)

변수 사용시에는 “=” 기호 앞뒤로 공백이 없이 입력하면 대입연산자가 된다.
그리고 선언된 변수는 기본적으로 전역 변수(global variable)다. 단 함수 안에서만 지역 변수(local variable)를 사용할 수 있는데 사용할려면 변수 명 앞에 local을 붙여주면 된다.
그런데 전역 변수는 현재 실행된 스크립트 파일에서만 유효하다. 자식 스크립트에서는 사용 할 수 없는 변수다.
변수 명 앞에 export을 붙여주면 환경 변수(environment variable)로 설정되어 자식 스크립트에서 사용 가능하다.
환경 변수 사용시 예약 변수(reserved variable)에 주의하자.(참고로 환경 변수는 .bash_profile에서 정의한다.)

# 전역 변수 지정
string="hello world"
echo ${string}

# 지역 변수 테스트 함수
string_test() {
    # 전역 변수와 동일하게 사용함. 만약 local 뺀다면 전역 변수에 덮어씌어지게 됨
    local string="local"
    echo ${string}
}
# 지역 변수 테스트 함수 호출
string_test
# 지역 변수 테스트 함수에서 동일한 변수 명을 사용했지만 값이 변경되지 않음
echo ${string}

# 환경 변수 선언
export hello_world="hello world..."
# 자식 스크립트 호출은 스크립트 경로을 쓰면된다.
/home/export_test.sh

#환경 변수를 테스트하기 위해 export_test.sh 파일을 만들고 선언한 변수를 확인해본다.
echo ${hello_world}

 

예약 변수(Reserved Variable)

문자 설명
HOME 사용자의 홈 디렉토리
PATH 실행 파일을 찾을 경로
LANG 프로그램 사용시 기본 지원되는 언어
PWD 사용자의 현재 작업중인 디렉토리
FUNCNAME 현재 함수 이름
SECONDS 스크립트가 실행된 초 단위 시간
SHLVL 쉘 레벨(중첩된 깊이를 나타냄)
SHELL 로그인해서 사용하는 쉘
PPID 부모 프로세스의 PID
BASH BASH 실행 파일 경로
BASH_ENV 스크립트 실행시 BASH 시작 파일을 읽을 위치 변수
BASH_VERSION 설치된 BASH 버전
BASH_VERSINFO BASH_VERSINFO[0]~BASH_VERSINFO[5]배열로 상세정보 제공
MAIL 메일 보관 경로
MAILCHECK 메일 확인 시간
OSTYPE 운영체제 종류
TERM 로긴 터미널 타입
HOSTNAME 호스트 이름
HOSTTYPE 시스템 하드웨어 종류
MACHTYPE 머신 종류(HOSTTYPE과 같은 정보지만 조금더 상세하게 표시됨)
LOGNAME 로그인 이름
UID 사용자 UID
EUID su 명령에서 사용하는 사용자의 유효 아이디 값(UID와 EUID 값은 다를 수 있음)
USER 사용자의 이름
USERNAME 사용자 이름
GROUPS 사용자 그룹(/etc/passwd 값을 출력)
HISTFILE history 파일 경로
HISTFILESIZE history 파일 크기
HISTSIZE history 저장되는 개수
HISTCONTROL 중복되는 명령에 대한 기록 유무
DISPLAY X 디스플레이 이름
IFS 입력 필드 구분자(기본값:   – 빈칸)
VISUAL VISUAL 편집기 이름
EDITOR 기본 편집기 이름
COLUMNS 현재 터미널이나 윈도우 터미널의 컬럼 수
LINES 터미널의 라인 수
LS_COLORS ls 명령의 색상 관련 옵션
PS1 기본 프롬프트 변수(기본값: bash\$)
PS2 보조 프롬프트 변수(기본값: >), 명령을 “\”를 사용하여 명령 행을 연장시 사용됨
PS3 쉘 스크립트에서 select 사용시 프롬프트 변수(기본값: #?)
PS4 쉘 스크립트 디버깅 모드의 프롬프트 변수(기본값: +)
TMOUT 0이면 제한이 없으며 time시간 지정시 지정한 시간 이후 로그아웃

 

위치 매개 변수(Positional Parameters)

문자 설명
$0 실행된 스크립트 이름
$1 $1 $2 $3...${10}인자 순서대로 번호가 부여된다. 10번째부터는 “{}”감싸줘야 함
$* 전체 인자 값
$@ 전체 인자 값($* 동일하지만 쌍따옴표로 변수를 감싸면 다른 결과 나옴)
$# 매개 변수의 총 개수

 

특수 매개 변수(Special Parameters)

문자 설명
$$ 현재 스크립트의 PID
$? 최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태
$! 최근에 실행한 백그라운드(비동기) 명령의 PID
$- 현재 옵션 플래그
$_ 지난 명령의 마지막 인자로 설정된 특수 변수

 

매개 변수 확장(Parameter Expansion)

아래 예를 테스트하기 위한 변수: string="abc-efg-123-abc"

문자 설명
${변수} $변수와 동일하지만 {} 사용해야만 동작하는 것들이 있음(예: echo ${string})
${변수:위치} 위치 다음부터 문자열 추출(예: echo ${string:4})
${변수:위치:길이} 위치 다음부터 지정한 길이 만큼의 문자열 추출(예: echo ${string:4:3})
${변수:-단어} 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수는 사용 불가(예: echo ${string:-HELLO})
${변수-단어} 변수 미선언시만 기본값 지정, 위치 매개 변수는 사용 불가(예: echo ${string-HELLO})
${변수:=단어} 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수 사용 가능(예: echo ${string:=HELLO})
${변수=단어} 변수 미선언시만 기본값 지정, 위치 매개 변수 사용 가능(예: echo ${string=HELLO})
${변수:?단어} 변수 미선언 혹은 NULL일때 단어 출력 후 스크립트 종료,(예: echo ${string:?HELLO})
${변수?단어} 변수 미선언시만 단어 출력 후 스크립트 종료(예: echo ${string?HELLO})
${변수:+단어} 변수 선언시만 단어 사용(예: echo ${string:+HELLO})
${변수+단어} 변수 선언 혹은 NULL일때 단어 사용(예: echo ${string+HELLO})
${#변수} 문자열 길이(예: echo ${#string})
${변수#단어} 변수의 앞부분부터 짧게 일치한 단어 삭제(예: echo ${string#a*b})
${변수##단어} 변수의 앞부분부터 길게 일치한 단어 삭제(예: echo ${string##a*b})
${변수%단어} 변수의 뒷부분부터 짧게 일치한 단어 삭제(예: echo ${string%b*c})
${변수%%단어} 변수의 뒷부분부터 길게 일치한 단어 삭제(예: echo ${string%%b*c})
${변수/찾는단어/변경단어} 처음 일치한 단어를 변경(예: echo ${string/abc/HELLO})
${변수//찾는단어/변경단어} 일치하는 모든 단어를 변경(예: echo ${string//abc/HELLO})
${변수/#찾는단어/변경단어} 앞부분이 일치하면 변경(예: echo ${string/#abc/HELLO})
${변수/%찾는단어/변경단어} 뒷부분이 일치하면 변경(예: echo ${string/%abc/HELLO})
${!단어*}, ${!단어@} 선언된 변수중에서 단어가 포함된 변수 명 추출(예: echo ${!string*}echo ${!string@})

 

배열(Array Variable)

배열 변수 사용은 반드시 괄호를 사용해야 한다.(예: ${array[1]})
참고: 1차원 배열만 지원함

# 배열의 크기 지정없이 배열 변수로 선언
# 참고: 'declare -a' 명령으로 선언하지 않아도 배열 변수 사용 가능함
declare -a array

# 4개의 배열 값 지정
array=("hello" "test" "array" "world")

# 기존 배열에 1개의 배열 값 추가(순차적으로 입력할 필요 없음)
array[4]="variable"

# 기존 배열 전체에 1개의 배열 값을 추가하여 배열 저장(배열 복사 시 사용)
array=(${array[@]} "string")

# 위에서 지정한 배열 출력
echo "hello world 출력: ${array[0]} ${array[3]}"
echo "배열 전체 출력: ${array[@]}"
echo "배열 전체 개수 출력: ${#array[@]}"

printf "배열 출력: %s\n" ${array[@]}

# 배열 특정 요소만 지우기
unset array[4]
echo "배열 전체 출력: ${array[@]}"

# 배열 전체 지우기
unset array
echo "배열 전체 출력: ${array[@]}"

 

변수 타입 지정(Variables Revisited)

Bash 변수는 타입을 구분하지 않고 기본적으로 문자열이다. 단 문맥에 따라서 연산 처리한다.
그런데 불완전한 형태의 declaretypeset 타입 지정 명령을 지원한다.(두 명령은 동일함)
참고: 코멘트에 있는 다른 문법 사용을 추천한다.

# 읽기 전용
# readonly string_variable="hello world" 문법과 동일 함
declare -r string_variable

# 정수
# number_variable=10 문법과 동일 함
declare -i number_variable=10

# 배열
# array_variable=() 문법과 동일 함
declare -a array_variable

# 환경 변수
# export export_variable="hello world" 문법과 동일 함
declare -x export_variable="hello world"

# 현재 스크립트의 전체 함수 출력
declare -f

# 현재 스크립트에서 지정한 함수만 출력
declare -f 함수이름

 

논리 연산자(Logical Operators)

문자 설명
&&-a 논리 AND
||-o 논리 OR

 

산술 연산자(Arithmetic Operators)

문자 설명
+ 더하기
- 빼기
* 곱하기
/ 나누기
++ 누승(exponentiation)
% modulo 나 mod (정수 나누기에서 나머지 값)
+= 상수값 만큼 증가(plus-equal)
-= 상수값 만큼 감소(minus-equal)
*= 상수값을 곱함(times-equal)
/= 상수값으로 나눔(slash-equal)
%= 상수값으로 나눈 나머지 값(mod-equal)

 

비트 연산자(Bitwise Operators)

문자 설명
<< 비트 왼쪽 쉬프트(쉬프트 한 번당 2를 곱하는 것과 동일함)
<<= left-shift-equal
>> 비트 오른쪽 쉬프트(쉬프트 한 번당 2로 나눔)
>>= right-shift-equal(<<=와 반대)
& 비트 and
&= 비트 and-equal
| 비트 OR
|= 비트 OR-equa
~ 비트 negate
! 비트 NOT
^ 비트 XOR
^= 비트 XOR-equa

 

기타 연산자(Miscellaneous Operators)

문자 설명
, 콤마 연산자(comma operator), 2개 이상의 산술 연산을 묶어줌

 

정수 비교(Integer Comparison)

문자 설명
-eq 같음
-ne 같지 않음
>-gt 더 큼(> 이중 소괄호에서 사용 가능)
>=-ge 더크거나 같음(>= 이중 소괄호에서 사용 가능)
<-lt 더 작음(< 이중 소괄호에서 사용 가능)
<=-le 더 작거나 같음(<= 이중 소괄호에서 사용 가능)

 

문자열 비교(String Comparison)

문자 설명
=== 같음
!= 같지 않음
< ASCII 알파벳 순서에 더 작음
> ASCII 알파벳 순서에서 더 큼
-z 문자열이 NULL, 길이가 0인 경우
-n 문자열이 NULL이 아님
${변수} 문자열이 NULL이 아님

 

파일 비교(File test operators)

문자 설명
-e 파일이 존재
-f 파일이 존재하고 일반 파일인 경우(디렉토리 혹은 장치파일이 아닌 경우)
-s 파일이 존재하고 0보다 큰 경우
-d 파일이 존재하고 디렉토리인 경우
-b 파일이 존재하고 블록장치 파일인 경우
-c 파일이 존재하고 캐릭터 장치 파일인 경우
-p 파일이 존재하고 FIFO인 경우
-h 파일이 존재하고 한 개 이상의 심볼릭 링크가 설정된 경우
-L 파일이 존재하고 한 개 이상의 심볼릭 링크가 설정된 경우
-S 파일이 소켓 디바이스인 경우
-t 파일이 디스크립터가 터미널 디바이스와 연관이 있음
-r 파일이 존재하고 읽기 가능한 경우
-w 파일이 존재하고 쓰기가 가능한 경우
-x 파일이 존재하고 실행 가능한 경우
-g 파일이 존재하고 SetGID가 설정된 경우
-u 파일이 존재하고 SetUID가 설정된 경우
-k 파일이 존재하고 스티키 비트(Sticky bit)가 설정된 경우
-O 자신이 소유자임
-G 그룹 아이디가 자신과 같음
-N 마지막으로 읽힌 후에 변경 됐음
file1 -nt file2 file1 파일이 file2 파일보다 최신임
file1 -ot file2 file1 파일이 file2 파일보다 예전것임
file1 -ef file2 file1 파일과 file2 파일이 같은 파일을 하드 링크하고 있음
! 조건이 안 맞으면 참(예: ! -e file)

 

반복문(for, while, until)

반목문 작성 시 아래 명령어(흐름제어)을 알아두면 좋다.
반복문을 빠져 나갈때: break
현재 반복문이나 조건을 건너 뛸때: continue

# 지정된 범위 안에서 반복문 필요 시 좋음
for string in "hello" "world" "..."; do;
    echo ${string};
done

# 수행 조건이 true 일때 실행됨 (실행 횟수 지정이 필요하지 않은 반복문 필요 시 좋음)
count=0
while [ ${count} -le 5 ]; do
    echo ${count}
    count=$(( ${count}+1 ))
done

# 수행 조건이 false 일때 실행됨 (실행 횟수 지정이 필요하지 않은 반복문 필요 시 좋음)
count2=10
until [ ${count2} -le 5 ]; do
    echo ${count2}
    count2=$(( ${count2}-1 ))
done

 

조건문(if…elif…else…fi)

조건문 작성 시 주의해야될 부분은 실행 문장이 없으면 오류 발생함

string1="hello"
string2="world"
if [ ${string1} == ${string2} ]; then
    # 실행 문장이 없으면 오류 발생함
    # 아래 echo 문장을 주석처리하면 확인 가능함
    echo "hello world"
elif [ ${string1} == ${string3} ]; then
    echo "hello world 2"
else
    echo "hello world 3"
fi

# AND
if [ ${string1} == ${string2} ] && [ ${string3} == ${string4} ]
..생략

# OR
if [ ${string1} == ${string2} ] || [ ${string3} == ${string4} ]
..생략

# 다중 조건
if [[ ${string1} == ${string2} || ${string3} == ${string4} ]] && [ ${string5} == ${string6} ]
..생략

 

선택문(case)

정규식을 지원하며 | 기호로 다중 값을 입력 가능하며 조건의 문장 끝에는 ;; 기호로 끝을 표시한다.
참고: 대문자와 소문자는 다른 문자다.

# case문 테스트를 위한 반복문
for string in "HELLO" "WORLD" "hello" "world" "s" "start" "end" "etc"; do

    # case문 시작
    case ${string} in
        hello|HELLO)
            echo "${string}: hello 일때"
            ;;
        wo*)
            echo "${string}: wo로 시작하는 단어 일때"
            ;;
        s|start)
            echo "${string}: s 혹은 start 일때"
            ;;
        e|end)
            echo "${string}: s 혹은 start 일때"
            ;;
        *)
            echo "${string}: 기타"
            ;;
    esac
    # //case문 끝

done

 

디버깅(Debugging)

간단하게는 echoexit 명령나 tee 명령어로 디버깅한다.
다른 방법으로 실행 시 옵션을 주거나 코드에 한줄만 추가하면 해볼수 있다.

Bash 옵션(스크립트 실행 시) set 옵션(스크립트 코드 삽입) 설명
bash -n set -nset -o noexec 스크립트 실행없이 단순 문법 오류만 검사(찾지 못하는 문법 오류가 있을수 있음)
bash -v set -vset -o verbose 명령어 실행전 해당 명령어 출력(echo)
bash -x set -xset -o xtrace 명령어 실행후 해당 명령어 출력(echo)
set -uset -o nounset 미선언된 변수 발견시 “unbound variable” 메시지 출력

 

마무리하며

  • 여기서 인자(argument)와 매개변수(parameter)는 이름만 다를 뿐 의미는 같다.
  • Bash는 공백에 민감하다.
  • 변수 사용은 생각하지 말고 ${변수} 이렇게 쓰자.

 

함께보기

Windows Hyper-V 사용법
Windows

Windows Hyper-V 사용법

Click the link to read the original article: Here

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

안녕하세요. 도정진입니다.

 

저전력 서버를 사용하면서 윈도우를 쓸 일이 많아져서 실제로는 아래와 같이 운영중이였습니다.

 

 

그런데 우분투를 호스트로 한 버추얼박스 위에 윈도우를 설치하면, 가상 운영체제에서 리소스를 많이 쓰게 되면 호스트의 서비스의 컨넥션이 드롭되는 문제가 있었습니다.

 

가장 큰 문제는, 윈도우를 가상화 한 것이 성능이 너무 느리다는 것입니다. ㅠ

 

제가 INTEL NUC DN2820 을 사용하고 있는데 인텔 아크에서 정보를 보면 아래와 같이 나옵니다.

 

 

VT-D 기술이 지원되지 않고 실 CPU 성능도 떨어져 가상화로 윈도우를 구동하기에는 무리가 있었습니다. 그래서 아예 윈도우를 네이티브로 깔고 시도하기로 마음을 먹었습니다.

그래서 NUC 에 바로 윈도우10 을 설치하였습니다.

다시 도식 그림으로 나타내면 이번 글로 지향하는 바는 아래와 같습니다.

 

 

실제로 Hyper – V 에 대한 Xpenology 에 대한 지원은 종료된지 조금 되었습니다. 그런데 딱히 쓰는데는 지장이 없으며, Hyper – V 기능 중에 허트비팅 이라는 기능이 있는데 윈도우가 종료되고 시작될 때, 가상머신과 통신하여 가상머신에 종료 명령을 내리고 종료가 완료되면 윈도우가 종료되는 기능입니다.

 

이 통합 기능이 최근의 Xpenology 에 와서는 지원이 되지 않고 있습니다. 그러나 이 문제는 Hyper-V 의 저장 기능 설정을 통해 해결이 가능하고 (실제로 종료가 동시에 이루어지지는 않음) 종료 까지 되게 하려면 Xpenology 부트 이미지를 뜯어서 모듈을 추가해야 합니다.

 

1 . Hyper – V 설치하기

 

하이퍼 V 는 윈도우에 내장된 기능으로 윈도우 10 Enterprise 버전 이상만 사용이 가능합니다. Home 버전에서는 사용이 불가능합니다.

 

아래처럼 제어판 -> 프로그램 및 기능 -> 윈도우 기능 사용 / 사용안함 으로 이동합니다.

 

 

아래처럼 Hyper – V 란을 모두 체크하고 확인을 누릅니다.

 

그러면 윈도우 기능 변경중 이라는 알림이 뜨고 재시작을 한번 해 주면 정상적으로 설치가 완료된 것입니다.

 

 

그럼 제어판 – 관리도구 로 이동해 보면 Hyper – V 관리자가 추가되어 있을 껍니다.

 

 

2 . Hyper – V 기본설정 하기

설치가 완료되었으면 Hyper – V 관리자 아이콘을 밖으로 빼거나 하셔서 사용하시면 됩니다. 일단 관리자를 들어가 보면 아래와 같이 생겼습니다.

 

 

서버에 연결 버튼을 눌러서 로컬 컴퓨터를 선택하고 확인을 누릅니다. 그럼 로컬 하이퍼 V 에 연결이 됩니다.

연결이 되면 아래와 같이 화면이 뜨게 됩니다. (사용중에 가이드를 작성해서 이미 가상머신이 구동중입니다.)

 

 

먼저 오른쪽의 Hyper – V 설정으로 이동하여 기본적인 디렉터리 설정을 해줍니다.

 

 

Hyper V 설정이 저장될 장소 및 가상 디스크 파일이 저장될 장소를 지정해 주고 고급 세션모드 정책 설정을 허용으로 바꾸어 줍니다. (바꾸어 주지 않으면 장치 패스스루가 지원되지 않습니다.)

 

 

그 다음 가상 컴퓨터에서 사용할 네트워크 스위치를 만들어 줄 차례입니다.

 

 

외부는 네이티브 윈도우의 네트워크 어댑터와 브릿지를 하는 것으로, 호스트의 IP 대역을 부여받을 수 있습니다. 서버 관리 편의를 위해서 외부로 만드시는 것이 좋습니다.

 

내부는 Hyper – V 에서 동작하고 있는 VM 간에 통신 용으로 만드는 것입니다.

(인터넷 연결 불가, 호스트 네트워크 인터넷 연결 공유 불가능 합니다.)

 

개인은 가상 NAT 을 통해 사설 아이피를 부여하고 인터넷 연결이 가능한 상태입니다.

 

서버 특성상 브릿지로 하는 것이 상위 공유기에서 포트포워딩이 쉽기 때문에 외부로 가상스위치를 만듭니다.

 

이름을 마음에 드는 것으로 설정하고 외부 네트워크를 선택한 다음 실제의 랜카드를 선택합니다. 그리고 확인을 눌러 생성합니다. 그럼 왼쪽 리스트에 만든 가상 네트워크 스위치 목록이 나타납니다.

 

 

3 . 가상 머신 생성해보기

 

테스트로 이번에 윈도우7 게스트를 설치해 보겠습니다.

 

 

작업 탭에서 새로만들기 -> 가상컴퓨터 를 선택합니다. 그럼 아래와 같은 창이 뜹니다.

 

 

이름을 지정하고 가상머신 프로파일이 저장될 위치도 필요하면 변경할 수 있습니다.

 

 

세대설정을 합니다. 정확히는 세대 설정에 관해서 이해를 하지 못했습니다. 세대설정을 처음에는 무조껀 2세대로 하고 가상머신을 작동해 보았는데 정상적으로 부팅이 되지 않으면 삭제하고 1세대로 새로 만들고 시도하고 있습니다.

 

윈도우 7은 1세대로 해야 부팅이 가능합니다.

 

 

 

 

가상머신에 할당할 메모리 용량을 선택합니다. 이때 조금 신기한 기능이 있는데 메모리 동적할당 기능이 있습니다.

 

메모리 동적할당 기능은 게스트 운영체제가 윈도우 일때만 사용하라고 되어 있습니다. 실제로 제가 리눅스호스트에 적용을 해 보았는데 2일 정도 구동시 메모리 8GB 가 모두 꽉차버리는 문제가 발생했습니다.

 

윈도우 게스트가 아니면 동적 메모리 할당은 꺼주시길 바랍니다.

 

이번에 설치하는 운영체제는 윈도우7 임으로 동적메모리 할당을 켜고 진행하겠습니다.

 

 

2번 과정에서 만든 가상 스위치를 선택해 줍니다.

 

 

 

다음은 가상 디스크를 설정하는 부분입니다. 새로 생성하고 위치를 변경할 수도 있습니다.

 

 

부팅 설정을 하는 부분입니다.

 

PXE 부팅도 가능하고 ISO 이미지로 부팅도 가능합니다.

 

 

가상컴퓨터 생성이 완료 되었습니다.

 

 

 

 

 

 

 

 

4 . 가상머신 설정하기 

 

실행하기 전에 가상머신을 설정해 보겠습니다.

 

 

 

가상메모리 에 대해 설정을 조금 해 줍니다.

 

최대 한계 메모리 설정을 합니다.

 

 

CPU 코어 사용갯수와 사용률을 제한할 수도 있습니다.

 

 

실제 하드디스크를 연결할 수도 있는데 실제 하드디스크를 연결하기 위해서는 해당 디스크가 오프라인 상태여야 합니다.

 

제어판 -> 관리도구 -> 컴퓨터 관리 -> 디스크 관리

 

로 이동하시면 설정이 가능합니다.

 

 

 

 

 

 

 

 

5 . 가상머신 실행하기

 

가상머신 리스트에서 오른쪽을 누르고 시작을 누릅니다.

 

 

 

정상적으로 실행이 됩니다.

(위 윈도우7 설치 이미지는 레마즈 님이 만드신 것으로 설치화면은 윈도우8 입니다.)

 

 

덤으로 동적 메모리 할당 때문에 유동적으로 메모리 할당량이 바뀝니다.

 

 

감사합니다.

Hyper V 전체 화면으로 확대 하기 
Windows

Hyper V 전체 화면으로 확대 하기 

Click the link to read the original article: Here

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

Hyper V 전체 화면으로 확대 하기 

윈도우 10 하이퍼 v는 무료이고 여러모로 쓰임새가 많은데 해상도 문제 때문에 풀스크린이 지원돼지 않는다. 이게 은근히 불편한데 모니터를 여러 개 쓰는 사람들은 페러럴즈 처럼 한쪽 모니터에 다른 운영체제를 뛰워놓고 모니터 마다 할당하고 싶은데 이게 안된다. 이번 포스트에서는 윈도우 리모트 데스크탑을 통해 편법으로 풀스크린으로 사용하는 방법을 소개한다.

하이퍼v 설치 방법은 여기를 클릭 (하이퍼 v 설치 방법)

 

  1. 공유기 접속번호

    일단 리모트 데스크탑으로 내 컴퓨터에서 가상 컴퓨터로 접속을 할려면 공유기가 있어야 한다. 그리고 모든 공유기 마다 접속번호가 있는데 회사 마다 틀리다. 내가 동영상에서 보여주는 포트는 192.168.1.1이고 LG 제품은 192.168.219.1 이라고 네이버가 말하는데 회사마다 틀리므로 각자 알아내야 한다. 그리고 공유기에 접속하면 비밀 번호를 물어보는데 거의 모든 초기값은 admin아이디에 admin비밀 번호이다.

     

  2. DHCP 고정 (DHCP Reservation)

    아. 이게 한국말로 머라는지 정확하게 모르겠다. 그렇지만 공유기에 접속한 컴퓨터의 가상 IP는 항상 바뀌는데 그걸 특정 아이피로 고정 시켜 주는 역할을 하고 모든 공유기에 있는 기능이니 스스로 찾아야 한다. 하이퍼 V를 구동하고 가상 머신으로 인터넷으로 접속한 상태에서 여기 DHCP 고정 화면에 들어가 보면 내 하이퍼 V가 어떤 라우터 IP를 할당 받아서 쓰고 있는지 나온다. (가상머신 안에서 확인하는 방법도 있는데 여기서 확인하면 한번에 끝나니 더 편함)

    지금 윈도우 7 가상 머신이 192.168.1.108을 할당 받았다

    이걸 반드시 고정 값으로 변경시켜야지 한번 설정으로 앞으로도 계속 같은 아이피 값으로 사용할수 있다.

     

  3. 라우터의 포트 포워딩을 바꿔주자

    리모트 데스크탑이 사용하는 프로토콜은 3389로 기본 값이다. 이걸 잘 모른다면 걍 리모트 데스크탑은 3389라는 번호를 가지고 왔다갔다 한다고 이해하면 된다. 그런데 이 값이 겹치면 안된다. 내 본체 컴퓨터는 3389를 이미 사용하고 있고 접속할려는 컴퓨터는 같은 wifi공간 안이다. 그렇다면 다른 포트를 써줘야 한다. Hyper V에 할당 된 IP 주소를 외워서 포트 포워딩으로 가자. 모든 공유기 마다 있는기능이다. 거기서 내 공유기에 할당된 아이피 어드레스를 치고 외부포트는 3390, 내부포트는 3389로 할당하고 (좌측그림참조, 우측사진은 IP타임 예제임) 동작시켜준다. 이것만 하면 모든 설정은 끝이다.

     

    리모트 데스크탑은 윈도우를 설치했다면 같이 깔리는 프로그램으로 따로 다운 받을 필요가 없습니다. 해당 동영상이 부적절하다고 판단되어 유튜브에서 삭제되었네요. 황당해서 이의 제의를 해놓은 상태이고 같은 비디오는 공지사항에 가시면 제 드랍박스 계정으로 링크 걸어놨습니다.

하이퍼-V (Hyper-V) 개념
Windows

하이퍼-V (Hyper-V) 개념

Click the link to read the original article: Here

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

하이퍼-V 란 무엇 인가

페러럴즈를 들어 보셨나요? 내가 맥을 사용할때 윈도우 프로그램을 돌리기 위해 썼던 가상 머신이다. 물론 부트캠프라는 OS X에서 지원하는 방법으로 듀얼 부팅 식으로 윈도우를 돌릴수도 있지만 다시 껐다가 켜야 하는 불편함 때문에 페러럴즈라는 상용 프로그램을 사서 사용하고있었다. 쉽게 말해서 컴퓨터안에 다른 가상의 컴퓨터 공간을 만들어 여러개의 운영체제를 둘다 동시에 사용할수있게 해준다. 윈도우 8을 실패작이라고들 하는데 난 이 하이퍼 V 기능 하나때문에라도 아주 유용하게 사용하고 있었다. VM Ware나 다른 가상 머신들이 수백달러를 넘는데 윈도우 8 프로 에서는 무료로 제공한다.

페러럴즈: 맥용 가상머신이다

듀얼모니터를 스크린샷 한것인데 좌측은 윈도우 7, 우측은 윈도우 10이다.

 

  1. 활용도

    아주 예전부터 오피스 프로그램에 대한 블로그를 운영 해볼까 고민하다가 한글판 오피스 시리얼 넘버도 없고 해적판을 구하기는 싫어서 미루고 있었다. 그러다가 학교에서 오피스 365로 바꾸자 마자 내 머릿속에는 여러가지 응용 상황들이 그려졌다. 오피스 365는 구독 형식이라 언어별로 시리얼 넘버가 있는게 아니라 구독하고 있으면 어떤 언어든지 지원한다. 윈도우 8부터는 다중 언어 지원이 되지만 윈도우 7은 얼티밋(Ultimate) 버전 부터 한글을 깔수있으므로 한국 블러그를 운영할수있겠다는 생각이 들어서 한번 시도 해봤더니 그리 어렵지 않았다. 이렇게 하여서 난 데스크탑에 윈도우 10, 영문 오피스 2016, 윈도우 7, 한글 오피스 2016을 모두 설치했다.

    윈도우 7 설치과정

    윈도우 10에 Hyper V로 윈도우 얼티밋을 설치한후 오피스 365로 워드 2016을 설치함

  2. 단점

    해상도가 떨어지고 3D 카드를 지원하지 않는다. 여러가지 단점들이 많지만 일반적으로 사용하기에 느끼는 단점은 이 것뿐이고 한가지 더 더하자면 Hyper-V 는 풀 스크린(Full Screen)을 지원하지 않는다. 그러나 첫번째 사진에서 보듯이 리모트 데스크탑으로 가상머신을 렌으로 접속하면 풀스크린으로 볼수있고 여러 작업하는데는 전혀 지장이없다.

    리모트 데스크탑으로 가상 머신을 접속하면 풀스크린으로 볼수있다

    와이파이를 사용한다면 공유기에서 가상머신 아이피 주소를 읽을수있는데 그걸로 접속하면 된다.

  3. Hyper-V 사용요건

    윈도우즈 10 Pro 이상이 되어야 지원하고 또한 메인보드가 가상머신을 지원해야하는데 요즘 나오는 신형 메인보드들은 모두 지원하니 그것은 걱정 안해도 될것같다.

    다음에 하이퍼V 설치 방법에 대해서 자세히 포스팅 하도록 하겠습니다. 제가 조교를 할때 학생들이윈도우 XP 를 써야하는 경우가 있어서 하이퍼 V 로 윈도우 8에 XP설치를 가르친적 있는데 첨부파일로붙여드립니다.영어로 되어있지만 그리 어렵지 않아요. 유투브로 자세한 방법 올려 드리겠습니다.

2015/10/15 – [윈도우 Tip/필수 스킬강좌] – 윈도우 10 하이퍼 (Hyper v) 사용 방법

2015/10/19 – [윈도우 Tip/필수 스킬강좌] – 윈도우10 하이퍼 v (Hyper v) 풀스크린 (full screen) 보기

How to Delete a Windows Recovery Partition
Windows

How to Delete a Windows Recovery Partition

How to Delete a Windows Recovery Partition

Click the link to go to the original page: Here

===

Before you decide you want to delete a Recovery Partition, you should understand why they exist, what they are used for, and how they are created.

Once in a while (that is, it’s rare, but it does happen) the section of your hard drive that stores Windows and lets your computer start up, becomes corrupted and won’t work. That doesn’t mean the hardware is bad, it just means the software needs some fixing and that’s what the Recovery Partition is for.

Why Would You Want to Delete Windows Recovery Partitions?

Disk Management

 Disk Management.

Obviously (or maybe it’s not obvious), if the physical drive gets ruined (flood, fire) then the ball game is over. Your recovery partition, however, can live on a different drive on the same computer or an external drive stored elsewhere which can be used to get your computer up and running again and more importantly save your precious data.

In the image you will notice that my computer has 2 drives attached to it called disk 0 and disk 1.

  • Disk 0 is a solid state drive (SSD). That means it’s fast, but doesn’t have a lot of room on it. The space on an SSD should be used for storing commonly used files and the Windows operating system as this will improve performance.
  • Disk 1 is a standard hard drive with lots of free space. As the recovery partition is something that will very rarely be used it is a good idea to move it from disk 0 to disk 1.

In this guide I will be showing you a free software tool called Macrium Reflect which can be used to create a recovery partition on another drive. (There is an optional premium version which you can pay for should you wish to do so).

I will also show you how to remove the recovery partitions created by Windows.

Create Recovery Media
Create Full Windows Disk Image

 Create Full Windows Disk Image.

Windows provides a basic set of tools for creating a system recovery drive but for more control it is often better to use dedicated software.

Macrium Reflect is a commercial tool which has a free version and a paid for version. The free version works on all versions of Windows from XP up to Windows 10 and can be used to create a bootable USB drive or DVD, a backup set which can be stored to a partition on your hard drive, external hard drive, USB drive or a set of DVDs.

Restoring using Macrium is very straight forward. Simply insert the bootable recovery drive and then select the device where the backup is stored.

There are a number of good reasons to use this approach.

  1. You can create recovery media that isn’t reliant on Windows.
  2. You can store the backups on external media so if your hard drive fails you will still be able to restore your system when you get a new hard drive.
  3. You can remove the Windows recovery partitions.

Creating a recovery drive and system image is good for creating media that you can recover from in a state of complete emergency.

It is a good idea, however, to create a backup of your main documents and other files using standard backup software. If you need help, this guide for Backup Maker shows how to backup files and folders for free using Windows.

How to Remove the Windows Recovery Partition

Delete Windows Recovery Partition

 Delete Windows Recovery Partition.

Normally the steps to delete a partition are as follows:

  1. Right-click the Start button.
  2. Click Disk Management.
  3. Right-click the partition you wish to delete,
  4. Choose Delete Volume.
  5. Select Yes when warned that all data will be deleted.

Unfortunately this doesn’t work for Windows Recovery partitions. The Windows Recovery partitions are protected and so right clicking on them has no effect at all.

To delete the recovery partition follow these steps:

  1. Right click on the Start button.
  2. Click Command Prompt (Admin).
  3. Type diskpart.
  4. Type list disk.
  5. A list of disks will be displayed. Note the number of the disk which has the partition you wish to remove. (If in doubt open disk management and look there, see steps above).
  6. Type select disk n (Replace n with the disk number with the partition you wish to remove).
  7. Type list partition.
  8. A list of partitions will be displayed and hopefully you should see one called Recovery and it is the same size as the one you wish to remove.
  9. Type select partition n (Replace n with the partition you wish to delete).
  10. Type delete partition override.
  11. The recovery partition will now be deleted.

Note: Be very careful when following these instructions. Deleting partitions removes all data from that partition. It is incredibly important to select the correct partition number on the correct disk.

Expanding a Partition to Use the Unallocated Space

Extend Windows Partition

 Extend Windows Partition.

Deleting a partition will create a section of unallocated space on your drive.

In order to use the unallocated space you have two choices:

  • Format the partition.
  • Extend another partition, such as the Windows partition.

You will need to use the Disk Management tool to do either of these things.

To open the disk management tool follow these steps:

  1. Right click on the Start button.
  2. Choose Disk Management.

To format the partition and use it as somewhere to store data follow these steps:

  1. Right click on the unallocated space and choose New Simple Volume.
  2. A wizard appears. Click Next to continue.
  3. A window appears. Choose how much space the new volume should use out of the unallocated space.
  4. To use all of the space leave the default and click Next or to use some of the space enter a new number and click Next.
  5. You will be asked to assign a letter to the partition. Choose the letter from the drop down.
  6. Finally you will be asked to format the drive. The default file system is NTFSbut you can change it to FAT32 or another file system if you so wish.
  7. Enter a volume label and click Next.
  8. Finally click Finish.

If you want to extend the Windows partition to use the space then you need to know that the unallocated space must appear to immediately to the right of the Windows partition within the Disk Management tool. If it doesn’t then you will not be able to extend into it.

To extend the Windows partition:

  1. Right-click the Windows Partition.
  2. Click Extend Volume.
  3. A wizard appears. Click Next to continue.
  4. The partition to extend into will be automatically selected.
  5. If you only want to use some of the unallocated space you can reduce the size using the box provided or simply click Next to use all of the unallocated space.
  6. Finally click Finish.

The Windows partition will now be resized to include the extra space.

왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?
Web Server

왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?

Click the link to read the original article: 왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?

======

들어가며

최근 Code School의 창업자이자 명강사인 Gregg이 Vue.js 공식 소개 영상을 촬영하였습니다. 쉬운 설명과 짜임새 있는 강의 구성을 잘해서 개인적으로 많이 좋아하는 강사인데요. 이렇게 유명한 교육자가 Vue.js 진영으로 넘어왔다는 건 정말 기쁜 소식인 것 같습니다.

아래의 글은 얼마 전에 Gregg이 Vue.js의 공식 소개 영상을 글로 풀어놓은 미디엄 기사를 번역한 글입니다. 왜 전 세계 43%의 프런트엔드 개발자들이 뷰를 배우고 싶어 하는지 체감할 수 있는 글입니다. 가볍고 유연한 Vue.js 프레임워크의 특징과 배우기 쉬운 점을 가벼운 설명으로 잘 녹여내었죠.

프런트엔드 개발을 시작하시는 분들에게 좋은 정보가 되었으면 좋겠습니다.

서문

전 세계 웹 개발자를 대상으로 한 2017년 자바스크립트의 현황조사에 따르면 Vue.js(이하 뷰 약칭)는 프런트엔드 개발자들이 가장 배우고 싶어 하는 프런트엔드 프레임워크입니다.

왜 이렇게 뷰가 선풍적인 인기를 끌고 있는지 제 생각을 나눠보려고 합니다. 아래에서 뷰로 간단한 앱을 만들어볼 거예요.

저는 최근에 에반 유(Vue.js 창시자), 크리스, 사라, 아담과 함께 뷰 소개 비디오를 만들었습니다. 소개 비디오는 여기서 찾으실 수 있구요. 아래의 글은 이 영상을 글로 풀어낸 것입니다.

위대한 자바스크립트의 진화

아마 다들 아시겠지만 자바스크립트는 지난 10년간 굉장히 많이 성장해왔어요. 서버 쪽에서 처리되던 코드들이 거의 다 브라우저로 넘어왔죠. 브라우저에서 처리해야 할 코드들이 많아지면서 프레임워크가 점점 더 그 코드들을 체계적으로 관리하게 되었습니다.

angular, react, vue.js

위에 보시는 프레임워크 앵귤러, 리액트, 뷰 중에 어떤 게 더 낫다 라고 얘기하지 않을 겁니다. 하지만, Vue.js 공식 문서를 보시면 세 개의 프레임워크가 잘 비교되어 있으니 참고해보세요.

뷰는 진입 장벽이 낮고, 유연하고, 성능이 우수하고, 유지 보수와 테스팅이 편리한 자바스크립트 프레임워크입니다. 뷰는 또한 점진적인 프레임워크를 지향합니다. 이는 웹 애플리케이션 전체를 프레임워크로 구조화하지 않아도 웹 애플리케이션의 작은 부분에만 적용하여 특정 화면에 더 나은 사용자 경험을 제공할 수 있는 걸 의미해요.

아니면 웹 애플리케이션 전체를 처음부터 뷰로 구현할 수 있죠. 뷰는 거대한 규모의 애플리케이션을 개발할 수 있게 핵심 라이브러리와 주변 생태계를 제공합니다. 점진적인 프레임워크로서의 vue.js

다른 프런트엔드 프레임워크처럼 뷰는 재사용이 가능한 컴포넌트로 웹 페이지를 구성할 수 있습니다. 각각의 컴포넌트는 각 페이지 영역을 표시하기 위해 필요한 HTML, CSS, 자바스크립트를 갖고 있죠. vue.js 컴포넌트로 구성한 웹 페이지 구조

첫 번째 프로젝트 시작하기

뷰를 아직 사용 안 해보신 분들을 위해 뷰로 코딩하는 느낌이 어떤 건지 보여드리려고 합니다. 그리고 문법도 간단히 한번 살펴볼께요. 정말 자세한 내용은 다루지 않을 겁니다. 다만, 뷰의 주요 컨셉이 어떤 건지 알아볼게요.

대부분의 자바스크립트처럼 우리도 페이지에 데이터를 표시하는 것으로 시작해보겠습니다. 데이터 집어넣기

위 그림처럼 뷰로 ‘Boots’라는 데이터를 ‘X’에 넣고 싶으면 아래와 같이 구현합니다. vue.js 인스턴스로 표현하기

위에서 보시는 것처럼 뷰 라이브러리를 불러와서 뷰 인스턴스를 생성하고, ‘app’이라는 화면 요소에 연결하였습니다. 여기서 el은 인스턴스가 뿌려질 화면 요소를 의미합니다. 그리고 data 안에 표시하고 싶은 값을 정의하여 화면에 }}로 연결했죠.

위 코드를 동작시키면 아래와 같이 나옵니다. vue.js 인스턴스 결과화면

여기서 특별한 건 없어요. 다만 데이터가 변할 때 뷰의 마법이 시작됩니다. 제가 이제 개발자 도구의 콘솔 창으로 가서 product의 값을 변경해볼게요. 어떤 일이 일어나는지 보세요. 콘솔에서 데이터 변경

뷰는 리액티브(Reactive)합니다. 이 말은 웹 페이지 상에 표시된 데이터가 변할 때 뷰에서 다 알아서 그 변경을 처리하는 것을 의미합니다. 이 동작은 문자열뿐만 아니라 모든 유형의 데이터에 모두 적용됩니다. 어디 한번 문자열 대신에 배열을 넣어볼까요? 그리고 HTML은 아이템 목록을 나타낼 수 있게 ul 태그로 바꿨습니다. product의 개수만큼 li 태그를 생성하려면 v-for라는 특별한 속성을 사용합니다. 이렇게 하면 데이터의 개수만큼 li 태그가 찍혀져 나오죠. v-for 디렉티브

이제 브라우저로 가서 코드를 실행하면 아래와 같습니다. v-for 디렉티브 결과

아직 코드가 살짝 부자연스럽네요. 어디 빈 배열로 시작해서 데이터를 불러와 담아볼까요? 불러올 데이터는 데이터베이스에서 가져온다고 가정합시다. API로 가져온 데이터 목록 표시하기

위 코드가 실행된 결과는 아래와 같습니다. vue.js 결과 화면

보시는 것처럼 현재 목록의 각 아이템은 데이터를 받아온 객체를 표시합니다. 좀 더 사용자가 보기 편하게 데이터 표현 방식을 아래와 같이 바꿔봅니다. vue.js의 데이터 표현방식

그럼 결과는.. vue.js 결과화면

각 아이템 중에 혹시 개수(quantity)가 0인게 있으면 사용자가 인지할 수 있도록 조금 다르게 표시해볼까요? span 태그로 item.quantity === 0 일 때만 OUT OF STOCK 텍스트가 나타나게 하겠습니다. 여기서 이 조건을 위해 v-if 디렉티브를 사용합니다. v-if 디렉티브 사용

아이템 중에 jacket의 재고가 다 떨어졌었네요. 아래와 같이 말이죠. v-if 디렉티브 vue.js 결과화면

만약 모든 상품(product)의 총 재고량을 목록 아래에 표시하려면 어떻게 해야 할까요? totalProducts라는 computed 속성을 활용하면 됩니다. 만약 자바스크립트 reduce() API가 익숙하지 않으시다면 여기서는 그냥 각 상품의 재고의 총합을 구하는 동작이라고 생각하세요. vue.js의 computed 속성

아래에서 볼 수 있듯이 이제 모든 상품의 총 재고량이 표시됩니다. vue.js의 computed 속성 결과 화면

자 이제 뷰 개발자 도구(Vue.js Chrome Extension)을 알아보기 좋은 시간이네요. 개발자 도구의 장점 중 하나는 페이지 상에 표시된 데이터를 살펴볼 수 있다는 점입니다. vue.js 개발자 도구

뷰의 반응성(Reactivity: 데이터가 변함에 따라 뷰에서 반사적으로 화면을 변화시키는 특성)을 다시 살펴볼까요. 아이템 2개를 제거해보겠습니다. 아래 보시는 것처럼 상품 목록뿐만 아니라 남은 상품의 총 재고량도 바뀌네요.

vue.js 반응성 reactivity

다음으로, 버튼을 이용해서 페이지에 이벤트를 추가해보겠습니다. 각 상품 아이템에 Add라는 버튼을 추가합니다. 그리고 버튼을 클릭했을 때 각 상품의 재고량을 1개씩 늘리겠습니다. vue.js 버튼 클릭 이벤트 v-on

아래를 보시면 각 상품의 Add 버튼을 클릭했을 때 각 상품의 재고와 총 재고량 숫자가 올라갑니다. 그리고 Jacket 상품의 Add 버튼을 클릭하면 OUT OF STOCK이라는 글씨도 사라지네요. vue.js v-on 디렉티브 결과 화면

허나 여기서 만약 각 상품의 재고량을 그냥 수기로 입력하고 싶으면 어떻게 해야 할까요? 인풋 박스를 하나 만들고 v-model 디렉티브를 연결해봅니다. 그리고 입력되는 값은 항상 숫자라고 지정할게요. vue.js v-model 디렉티브

이제 모든 아이템의 재고 숫자를 직접 입력하여 변경할 수 있습니다. 만약 0을 입력하면 자연스럽게 OUT OF STOCK이 함께 표시되네요. 그리고 아까 추가했던 Add 버튼도 정상적으로 동작합니다. vue.js v-model 디렉티브 결과 화면

여기까지 살펴본 코드는 JSFIDDLE에서 살펴볼 수 있습니다.

몇 개 더 살펴보는 뷰의 특징

만약 큰 애플리케이션을 만든다라고 하면 여러 개의 컴포넌트로 조합해야 합니다. vue.js single file components

뷰는 CLI(Command Line Interface) 명령어 도구로 쉽게 프로젝트를 생성할 수 있습니다. 아래 명령어로 프로젝트를 시작하시면 돼요.(뷰 CLI 도구는 미리 설치되어 있어야 합니다)

vue.js CLI 도구

그리고 컴포넌트별로 .vue 파일을 생성해 관리할 수 있어요. .vue 파일에는 HTML, 자바스크립트, 컴포넌트별 CSS & SCSS가 들어갑니다. vue.js 컴포넌트 체계

자 지금까지 뷰가 할 수 있는 기능 중 정말 빙산의 일각만 보셨습니다. 뷰에는 프런트엔드 화면을 개발하고, 구성하고, 빌드 하기 위한 더 많은 기능들이 있죠. 만약 뷰를 배우고 싶어 하신다면 아래의 2가지 자료를 추천드립니다.

  1. VueMastery의 뷰 가이드 & CheatSheet
  2. Vue.js의 공식 문서

마무리

위에서 살펴본 그렉의 설명 말고도 가볍게 Vue.js의 특징을 살펴볼 수 있는 글이 있습니다.

그리고 위 블로그 글이 마음에 드셨다면 저의 Vue.js 책으로 Vue.js를 시작해보시는 건 어떨까요? 🙂

Vue.js 온라인 강좌

책을 볼 시간이 없으시다면 아래 온라인 강좌로 빠르게 배워보시는 것도 좋을 것 같습니다 🙂

인프런 온라인 강좌 : Vue.js 초급, Vue.js 중급, Webpack (좌측 부터)
Vue.js 사용하는 이유 :: 마이구미
Web Server

Vue.js 사용하는 이유 :: 마이구미

Click the link to read the original article: Vue.js 사용하는 이유 :: 마이구미

=====

이 글은 Vue, Angular, React 를 비교하는 글이 아닌 단순히 Vue.js의 장점을 다룬다.

Vue 이외에는 눈으로만 보았기에, Vue에 편중되어 보여질 수도 있다는 점을 미리 언급한다.

세가지 비교는 참고 링크를 읽어보길 바란다.

읽기 전 참고할 링크 – Virtual DOM && Top 7 reasons Vue.js && Vue, Angluar, React 비교

Vue는 요즘 핫한 자바스크립트 프레임워크로 사용되고 있다.

React와 Angular가 항상 비교 대상이였지만, Vue의 등장으로 크게 3가지로 비교되고 있다.

Vue의 등장은 신선했다.

왜냐하면 Vue.js는 혈통 없이 React와 Angular의 성공과 실패로부터 만들어졌다.

크게 React(Virtual DOM)와 Angular(양방향 바인딩)의 장점을 가져왔기에, 반은 먹고 들어간다.

Vue.js의 장점들은 다음과 같다.

1. 학습 곡선이 낮다.

Vue를 접해보았다면, 굉장히 쉽다는 것을 느꼈을 거라 생각한다.

사실 사람마다 틀릴 수 있으나, 알려진 학습 곡선은 Angular > React > Vue 순이 된다.

본인의 경우에도 Angular와 Vue를 비교했을 때, Angular는 굉장히 어려웠고, Vue는 굉장히 쉬웠다.

Vue의 공식 문서도 이해하기 쉽게 설명했다고 생각한다.

한글 번역까지 많은 분들이 기여해주셔서, 두려워할 필요가 없다.

2. 컴포넌트

대규모 프로젝트에 있어, 유지보수와 재사용성을 높이기 위해 작은 단위로 쪼개어 관리한다.

현재 개발 구조로 이미 컴포넌트 방식이 대세이고, 당연하게 그렇게 진행되고 있는 추세이다.

이 부분은 Vue, Angular, React 모두 동일한 부분이다.

다른 점은 본인이 Vue에서 가장 극찬하는 부분이 있다.

바로 “단일 파일 컴포넌트” 이 부분이다.

App.vue

<template lang=”html”> <div> {{ msg }} </div> </template> <script> export default { data () { return { msg: “Hello World” } } } </script> <style scoped> </style>

위와 같이 .vue 파일 하나에 html, css, js를 작성할 수 있다.

결과적으로 단일 파일 컴포넌트는 캡슐화를 제공하게 된다.

이로써, 보다 깨끗하고 풍부한 컴포넌트를 표현할 수 있다.

마치 생소한 용어일 수도 있으나 Shadow DOM 같은 느낌이 든다.

React에도 필요한 경우 Shadow DOM 관련 모듈을 사용하는 것을 볼 수 있다.

그와 달리 Vue는 단일 파일 컴포넌트를 사용하면 다른 작업 필요없이 관련 효과를 낼 수 있다.

* Shadow DOM – DOM 및 CSS 캡슐화 목적. (관련 문서 – Shadow DOM)

하지만 React의 jsx 문법과 같은 것을 선호한다면, 이 부분에 대한 생각이 다를 수 있다.

* 단일 파일 컴포넌트는 권장하지만, 의무적인 것은 아니다.

3. 성능

Vue.js는 가볍고 빠르다.

Virtual DOM에 있어서도, React와 비교해서 보다 효과적인 성능을 낸다고 알려져있다.

그렇기에, 적은 오버헤드와 빠른 성능을 낼 수 있다.

4. View 최적화

Vue의 디자인은 MVVM 패턴에 영감을 받아서, View에 최적화되어있다.

DOM 조작에 있어, 기존 jQuery를 통한 DOM 조작은 더이상 필요하지 않다.

관련 내용은 링크를 참고하길 바란다. “jQuery 더이상 쓰지 않아야하는가?”

View에 최적화되어 있기 때문에, View의 동적 변화에 대한 처리가 매끄럽고 용이하다.

또한 페이지 전환 및 이벤트에 따른 애니메이션 작업에 있어, 개발하기에 좋다.

그에 관련된 transition과 transition-group 태그가 따로 분리되어 있어, View에 중점된 모습을 볼 수 있다.

관련 문서 – https://kr.vuejs.org/v2/guide/transitions.html

5. 많은 모듈

중앙 집중식 상태 관리 저장소를 위한 vuex

SPA를 위한 vue-router

유효성 검증을 위한 vue-vaildator

HTTP, Ajax를 위한 vue-resource

Vue에 최적화된 개발자 모드를 위한 vue-devtools 등등…….

효율적이고, 필요한 모듈이 웬만하면 존재하고, 이것 또한 학습곡선이 높지 않다.

6. 가능성

그래도 현재 React가 점유율에서 막강하다.

하지만 입문에 관한 통계를 보면, Vue가 훨씬 가파른 곡선이 보여지고 있다.

통계 자료나 세미나 및 컨퍼런스의 주제를 봐도 현재 많이 도입되고 있는 상황이라고 본다.

긍정적으로 바라보고 있기에, 앞으로도 기대해볼만하다.

출처: http://mygumi.tistory.com/206?category=697395 [마이구미의 HelloWorld]

Redis 설치 및 셋팅 [EC2] :: 마이구미
Web Server

Redis 설치 및 셋팅 [EC2] :: 마이구미

Click the link to read the original article: Redis 설치 및 셋팅 [EC2] :: 마이구미

==========

이번 글은 Redis 설치 및 셋팅에 대해 다뤄본다.

본인은 Amazon EC2 인스턴스를 사용한다.

12개월간 무료인 서비스가 있으니 몰랐다면 좋은 경험이 될 것이다. (Amazon EC2 Free Tier)

OS는 Amazon Linux AMI 기준으로 글을 작성한다.

Redis 설치와 셋팅을 알아보자.

여기서 셋팅은 조금 더 효율적으로 Redis를 설치하여 사용하는 법을 말한다.

예를 들어 일반적으로 설치를 하면 Redis Server를 실행하더라도 Server가 죽으면 Redis Server 또한 죽는다.

개발 시에는 문제가 없지만, 실제 서비스라면 문제가 된다.

우선, Server를 업데이트하고, Toolchain을 설치해야한다.

*Toolchain – System의 Compile 환경이라고 생각하면 된다.

sudo yum -y update

sudo yum -y install gcc make

그 후, Redis를 다운로드하자.

다운로드 URL은 자신이 원하는 버젼이 있다면 확인하여 다운로드해야한다. (Download)

sudo wget http://download.redis.io/redis-stable.tar.gz

sudo tar xvzf redis-stable.tar.gz

cd redis-stable

make

사실상 Redis 설치가 끝났다.

Redis 작동 여부는 명령어를 통해 확인할 수 있다.

redis-stable/src 디렉토리 기준

redis-server

redis-cli ping

=> PONG

결과적으로 Redis 작동에 문제가 없지만 FULL PATH 를 통해 명령어를 실행하는 불편함이 존재한다.

경로없이 실행하게 셋팅해보자.

redis-stable 디렉토리 기준

sudo cp src/redis-server /usr/local/bin/

sudo cp src/redis-cli /usr/local/bin/

OR

sudo make install

어느 경로에서도 redis-server 명령어가 실행되는 것을 볼 수 있다.

AMI는 /usr/local/src 환경 변수 경로이다. OS마다 다르므로 다른 OS일 경우 확인하길 바란다.

위 절차를 통해 설치 후 사용해도 무관하다.

하지만 위에서 언급했듯이 매번 서버를 시작해야하는 문제가 발생한다.

해결하기 위한 효율적인 방법을 통해 이어나가보자.

먼저 디렉토리 생성과 파일들을 복사해야한다.

redis-stable 디렉토리 기준

sudo mkdir -p /etc/redis /var/lib/redis /var/redis/6379

sudo cp redis.conf /etc/redis/6379.conf

그 후, config 파일을 열어보자.

sudo vi /etc/redis/6379.conf

파일 안의 옵션들을 아래와 같이 수정하자.

bind 127.0.0.1

daemonize yes // default => no

logfile /var/log/redis_6379.log

dir /var/redis/6379

수정을 했다면, init script를 설치하자.

sudo wget https://raw.githubusercontent.com/saxenap/install-redis-amazon-linux-centos/master/redis-server

sudo mv redis-server /etc/init.d

sudo chmod 755 /etc/init.d/redis-server

redis-server 를 열어보자.

sudo vi /etc/init.d/redis-server

그 후, config 파일 참조 경로를 변경해주면 된다.

REDIS_CONF_FILE=”/etc/redis/6379.conf”

이제 Redis Server의 자동 실행을 위해 chkconfig 명령어를 사용한다.

sudo chkconfig –add redis-server

sudo chkconfig –level 345 redis-server on

sudo service reids-server start

결과적으로, 서버를 재시작하여도 Redis Server 또한 재시작 되는 것을 볼 수 있다.

마지막으로 Redis는 비밀번호(암호)를 설정할 수 있다.

관련 config 파일의 옵션을 수정해주면 된다.

sudo vi /etc/redis/6379.conf

requirepass는 주석 처리(#)가 되어있을 것이다.

requirepass 1234

수정 후 Redis Server를 재시작해주면 비밀번호가 설정이 된다.

혹시나 문제점이 있다면 댓글을 통해 알려주면 감사하겠다.

참고  URL

https://redis.io/topics/quickstart

https://medium.com/@andrewcbass/install-redis-v3-2-on-aws-ec2-instance-93259d40a3ce#.iu8eo6rno

출처: http://mygumi.tistory.com/133 [마이구미의 HelloWorld]

Use Redis for session storage (Magento 2)
Magento 2

Use Redis for session storage (Magento 2)

Prerequisite

Before you continue, install Redis.

You can use Redis for session storage in Magento versions 2.0.6 and later only.

Configure Magento to use Redis for session storage

Following is a sample configuration to add to <your Magento install dir>app/etc/env.php:

'session' =>
array (
  'save' => 'redis',
  'redis' =>
  array (
    'host' => '127.0.0.1',
    'port' => '6379',
    'password' => '',
    'timeout' => '2.5',
    'persistent_identifier' => '',
    'database' => '2',
    'compression_threshold' => '2048',
    'compression_library' => 'gzip',
    'log_level' => '1',
    'max_concurrency' => '6',
    'break_after_frontend' => '5',
    'break_after_adminhtml' => '30',
    'first_lifetime' => '600',
    'bot_first_lifetime' => '60',
    'bot_lifetime' => '7200',
    'disable_locking' => '0',
    'min_lifetime' => '60',
    'max_lifetime' => '2592000'
  )
),

where

Parameter Meaning Default value
host Fully qualified hostname, IP address, or absolute path if using UNIX sockets. 127.0.0.1
port Redis server listen port. 6379
password Specifies a password if your Redis server requires authentication. empty
timeout Connection timeout, in seconds. 2.5
persistent_identifier Unique string to enable persistent connections (for example, sess-db0).

Known issues with phpredis and php-fpm.

empty
database Unique Redis database number, which is recommended to protect against data loss.

Important: If you use Redis for more than one type of caching (for example, page cache and session cache), the database numbers must be different.

0
compression_threshold Set to 0 to disable compression (recommended when suhosin.session.encrypt = On).

Known issue with strings of more than 64KB.

2048
compression_library Options: gziplzflz4 or snappy. gzip
log_level Set to any of the following, listed in order from least verbose to most verbose:

  • 0 (emergency: only the most severe errors)
  • 1 (alert: immediate action required)
  • 2 (critical: application component unavailable)
  • 3 (error: runtime errors, not critical but must be monitored)
  • 4 (warning: additional information, recommended)
  • 5 (notice: normal but significant condition)
  • 6 (info: informational messages)
  • 7 (debug: the most information for development or testing only)
1
max_concurrency Maximum number of processes that can wait for a lock on one session. For large production clusters, set this to at least 10% of the number of PHP processes. 6
break_after_frontend Number of seconds to wait before trying to break the lock for frontend (that is, storefront) session. 5
break_after_adminhtml Number of seconds to wait before trying to break the lock for an adminhtml (that is, Magento Admin) session. 30
first_lifetime Lifetime, in seconds, of session for non-bots on the first write, or use 0 to disable. 600
bot_first_lifetime Lifetime, in seconds, of session for bots on the first write, or use 0 to disable. 60
bot_lifetime Lifetime, in seconds, of session for bots on subsequent writes, or use 0 to disable. 7200
disable_locking Disable session locking entirely. false
min_lifetime Minimum session lifetime, in seconds. 60
max_lifetime Maximum session lifetime, in seconds. 2592000 (720 hours)

Basic verification

To verify that Redis and Magento are working together, use the following commands:

Redis monitor command

In a command prompt on the server on which Redis is running, enter:

redis-cli monitor

Refresh your storefront page and you’ll see output similar to the following.

Session storage

If you use Redis for session storage, you’ll see output similar to the following:

1476824834.187250 [0 127.0.0.1:52353] "select" "0"
1476824834.187587 [0 127.0.0.1:52353] "hmget" "sess_sgmeh2k3t7obl2tsot3h2ss0p1" "data" "writes"
1476824834.187939 [0 127.0.0.1:52353] "expire" "sess_sgmeh2k3t7obl2tsot3h2ss0p1" "1200"
1476824834.257226 [0 127.0.0.1:52353] "select" "0"
1476824834.257239 [0 127.0.0.1:52353] "hmset" "sess_sgmeh2k3t7obl2tsot3h2ss0p1" "data" "_session_validator_data|a:4:{s:11:\"remote_addr\";s:12:\"10.235.34.14\";s:8:\"http_via\";s:0:\"\";s:20:\"http_x_forwarded_for\";s:0:\"\";s:15:\"http_user_agent\";s:115:\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\";}_session_hosts|a:1:{s:12:\"10.235.32.10\";b:1;}admin|a:0:{}default|a:2:{s:9:\"_form_key\";s:16:\"e331ugBN7vRjGMgk\";s:12:\"visitor_data\";a:3:{s:13:\"last_visit_at\";s:19:\"2016-10-18 21:06:37\";s:10:\"session_id\";s:26:\"sgmeh2k3t7obl2tsot3h2ss0p1\";s:10:\"visitor_id\";s:1:\"9\";}}adminhtml|a:0:{}customer_base|a:1:{s:20:\"customer_segment_ids\";a:1:{i:1;a:0:{}}}checkout|a:0:{}" "lock" "0"

... more ...

Page caching

If you use Redis for page caching, you’ll see output similar to the following:

1476826133.810090 [0 127.0.0.1:52366] "select" "1"
1476826133.816293 [0 127.0.0.1:52367] "select" "0"
1476826133.817461 [0 127.0.0.1:52367] "hget" "zc:k:ea6_GLOBAL__DICONFIG" "d"
1476826133.829666 [0 127.0.0.1:52367] "hget" "zc:k:ea6_DICONFIG049005964B465901F774DB9751971818" "d"
1476826133.837854 [0 127.0.0.1:52367] "hget" "zc:k:ea6_INTERCEPTION" "d"
1476826133.868374 [0 127.0.0.1:52368] "select" "1"
1476826133.869011 [0 127.0.0.1:52369] "select" "0"
1476826133.869601 [0 127.0.0.1:52369] "hget" "zc:k:ea6_DEFAULT_CONFIG_CACHE_DEFAULT__10__235__32__1080MAGENTO2" "d"
1476826133.872317 [0 127.0.0.1:52369] "hget" "zc:k:ea6_INITIAL_CONFIG" "d"
1476826133.879267 [0 127.0.0.1:52369] "hget" "zc:k:ea6_GLOBAL_PRIMARY_PLUGIN_LIST" "d"
1476826133.883312 [0 127.0.0.1:52369] "hget" "zc:k:ea6_GLOBAL__EVENT_CONFIG_CACHE" "d"
1476826133.898431 [0 127.0.0.1:52369] "hget" "zc:k:ea6_DB_PDO_MYSQL_DDL_STAGING_UPDATE_1" "d"
1476826133.898794 [0 127.0.0.1:52369] "hget" "zc:k:ea6_RESOLVED_STORES_D1BEFA03C79CA0B84ECC488DEA96BC68" "d"
1476826133.905738 [0 127.0.0.1:52369] "hget" "zc:k:ea6_DEFAULT_CONFIG_CACHE_STORE_DEFAULT_10__235__32__1080MAGENTO2" "d"

... more ...

1476826210.634998 [0 127.0.0.1:52439] "hmset" "zc:k:ea6_MVIEW_CONFIG" "d" "a:18:{s:19:\"design_config_dummy\";a:4:{s:7:\"view_id\";s:19:\"design_config_dummy\";s:12:\"action_class\";s:39:\"Magento\\Theme\\Model\\Indexer\\Mview\\Dummy\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:0:{}}s:14:\"customer_dummy\";a:4:{s:7:\"view_id\";s:14:\"customer_dummy\";s:12:\"action_class\";s:42:\"Magento\\Customer\\Model\\Indexer\\Mview\\Dummy\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:0:{}}s:13:\"cms_page_grid\";a:4:{s:7:\"view_id\";s:13:\"cms_page_grid\";s:12:\"action_class\";s:43:\"Magento\\Catalog\\Model\\Indexer\\Category\\Flat\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:1:{s:8:\"cms_page\";a:3:{s:4:\"name\";s:8:\"cms_page\";s:6:\"column\";s:7:\"page_id\";s:18:\"subscription_model\";N;}}}s:21:\"catalog_category_flat\";a:4:{s:7:\"view_id\";s:21:\"catalog_category_flat\";s:12:\"action_class\";s:43:\"Magento\\Catalog\\Model\\Indexer\\Category\\Flat\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:6:{s:23:\"catalog_category_entity\";a:3:{s:4:\"name\";s:23:\"catalog_category_entity\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";N;}s:31:\"catalog_category_entity_decimal\";a:3:{s:4:\"name\";s:31:\"catalog_category_entity_decimal\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}s:27:\"catalog_category_entity_int\";a:3:{s:4:\"name\";s:27:\"catalog_category_entity_int\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}s:28:\"catalog_category_entity_text\";a:3:{s:4:\"name\";s:28:\"catalog_category_entity_text\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}s:31:\"catalog_category_entity_varchar\";a:3:{s:4:\"name\";s:31:\"catalog_category_entity_varchar\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}s:32:\"catalog_category_entity_datetime\";a:3:{s:4:\"name\";s:32:\"catalog_category_entity_datetime\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}}}s:24:\"catalog_category_product\";a:4:{s:7:\"view_id\";s:24:\"catalog_category_product\";s:12:\"action_class\";s:46:\"Magento\\Catalog\\Model\\Indexer\\Category\\Product\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:2:{s:23:\"catalog_category_entity\";a:3:{s:4:\"name\";s:23:\"catalog_category_entity\";s:6:\"column\"

... more ...

Redis ping command

Enter the following command:

redis-cli ping

PONG should be the response.

If both commands succeeded, Redis is set up properly.

More information

redis-cli command reference

Use Redis for the Magento page and default cache
Magento 2

Use Redis for the Magento page and default cache

Use Redis for the Magento page and default cache

Prerequisite

Before you continue, install Redis.

Configure Magento to use Redis for default and page caching

Following is a sample configuration that causes Magento to use Redis for both the default cache (default array) and the full page cache (page_cache array). Magento’s caching is implemented by Magento\Framework\App\CacheInterface.

Add a configuration similar to the following to <your Magento install dir>app/etc/env.php:

'cache' =>
array(
   'frontend' =>
   array(
      'default' =>
      array(
         'backend' => 'Cm_Cache_Backend_Redis',
         'backend_options' =>
         array(
            'server' => '127.0.0.1',
            'database' => '0',
            'port' => '6379'
            ),
    ),
    'page_cache' =>
    array(
      'backend' => 'Cm_Cache_Backend_Redis',
      'backend_options' =>
       array(
         'server' => '127.0.0.1',
         'port' => '6379',
         'database' => '1',
         'compress_data' => '0'
       )
    )
  )
),

where

Parameter Meaning
default, page_cache Specify the segment name to use a particular segment or a default shortcut for all other caches.

The default cache segment enables you to configure all cache segments except for page_cache (the full page cache).

server Absolute URL to your Redis server, or 127.0.0.1 if Redis is installed on the Magento server, or an absolute path to a UNIX socket.
port Redis server listen port
database Required if you use Redis for both the default and full page cache. You must specify the database number of one of the caches; the other cache uses 0 by default.

Important: If you use Redis for more than one type of caching (for example, default cache and page cache), the database numbers must be different.

password Specifies a password if your Redis server requires authentication.
compress_data Required only for the full page cache. Set to 1 to compress the full page cache. Redis chooses a compression algorithm in the following order, based on availability: snappyl4z, or lzf. If none of them available, Redis uses gzip.

Basic verification

To verify that Redis and Magento are working together, use the following commands:

Redis monitor command

In a command prompt on the server on which Redis is running, enter:

redis-cli monitor

Refresh your storefront page and you’ll see output similar to the following.

Session storage

If you use Redis for session storage, you’ll see output similar to the following:

1476824834.187250 [0 127.0.0.1:52353] "select" "0"
1476824834.187587 [0 127.0.0.1:52353] "hmget" "sess_sgmeh2k3t7obl2tsot3h2ss0p1" "data" "writes"
1476824834.187939 [0 127.0.0.1:52353] "expire" "sess_sgmeh2k3t7obl2tsot3h2ss0p1" "1200"
1476824834.257226 [0 127.0.0.1:52353] "select" "0"
1476824834.257239 [0 127.0.0.1:52353] "hmset" "sess_sgmeh2k3t7obl2tsot3h2ss0p1" "data" "_session_validator_data|a:4:{s:11:\"remote_addr\";s:12:\"10.235.34.14\";s:8:\"http_via\";s:0:\"\";s:20:\"http_x_forwarded_for\";s:0:\"\";s:15:\"http_user_agent\";s:115:\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\";}_session_hosts|a:1:{s:12:\"10.235.32.10\";b:1;}admin|a:0:{}default|a:2:{s:9:\"_form_key\";s:16:\"e331ugBN7vRjGMgk\";s:12:\"visitor_data\";a:3:{s:13:\"last_visit_at\";s:19:\"2016-10-18 21:06:37\";s:10:\"session_id\";s:26:\"sgmeh2k3t7obl2tsot3h2ss0p1\";s:10:\"visitor_id\";s:1:\"9\";}}adminhtml|a:0:{}customer_base|a:1:{s:20:\"customer_segment_ids\";a:1:{i:1;a:0:{}}}checkout|a:0:{}" "lock" "0"

... more ...

Page caching

If you use Redis for page caching, you’ll see output similar to the following:

1476826133.810090 [0 127.0.0.1:52366] "select" "1"
1476826133.816293 [0 127.0.0.1:52367] "select" "0"
1476826133.817461 [0 127.0.0.1:52367] "hget" "zc:k:ea6_GLOBAL__DICONFIG" "d"
1476826133.829666 [0 127.0.0.1:52367] "hget" "zc:k:ea6_DICONFIG049005964B465901F774DB9751971818" "d"
1476826133.837854 [0 127.0.0.1:52367] "hget" "zc:k:ea6_INTERCEPTION" "d"
1476826133.868374 [0 127.0.0.1:52368] "select" "1"
1476826133.869011 [0 127.0.0.1:52369] "select" "0"
1476826133.869601 [0 127.0.0.1:52369] "hget" "zc:k:ea6_DEFAULT_CONFIG_CACHE_DEFAULT__10__235__32__1080MAGENTO2" "d"
1476826133.872317 [0 127.0.0.1:52369] "hget" "zc:k:ea6_INITIAL_CONFIG" "d"
1476826133.879267 [0 127.0.0.1:52369] "hget" "zc:k:ea6_GLOBAL_PRIMARY_PLUGIN_LIST" "d"
1476826133.883312 [0 127.0.0.1:52369] "hget" "zc:k:ea6_GLOBAL__EVENT_CONFIG_CACHE" "d"
1476826133.898431 [0 127.0.0.1:52369] "hget" "zc:k:ea6_DB_PDO_MYSQL_DDL_STAGING_UPDATE_1" "d"
1476826133.898794 [0 127.0.0.1:52369] "hget" "zc:k:ea6_RESOLVED_STORES_D1BEFA03C79CA0B84ECC488DEA96BC68" "d"
1476826133.905738 [0 127.0.0.1:52369] "hget" "zc:k:ea6_DEFAULT_CONFIG_CACHE_STORE_DEFAULT_10__235__32__1080MAGENTO2" "d"

... more ...

1476826210.634998 [0 127.0.0.1:52439] "hmset" "zc:k:ea6_MVIEW_CONFIG" "d" "a:18:{s:19:\"design_config_dummy\";a:4:{s:7:\"view_id\";s:19:\"design_config_dummy\";s:12:\"action_class\";s:39:\"Magento\\Theme\\Model\\Indexer\\Mview\\Dummy\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:0:{}}s:14:\"customer_dummy\";a:4:{s:7:\"view_id\";s:14:\"customer_dummy\";s:12:\"action_class\";s:42:\"Magento\\Customer\\Model\\Indexer\\Mview\\Dummy\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:0:{}}s:13:\"cms_page_grid\";a:4:{s:7:\"view_id\";s:13:\"cms_page_grid\";s:12:\"action_class\";s:43:\"Magento\\Catalog\\Model\\Indexer\\Category\\Flat\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:1:{s:8:\"cms_page\";a:3:{s:4:\"name\";s:8:\"cms_page\";s:6:\"column\";s:7:\"page_id\";s:18:\"subscription_model\";N;}}}s:21:\"catalog_category_flat\";a:4:{s:7:\"view_id\";s:21:\"catalog_category_flat\";s:12:\"action_class\";s:43:\"Magento\\Catalog\\Model\\Indexer\\Category\\Flat\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:6:{s:23:\"catalog_category_entity\";a:3:{s:4:\"name\";s:23:\"catalog_category_entity\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";N;}s:31:\"catalog_category_entity_decimal\";a:3:{s:4:\"name\";s:31:\"catalog_category_entity_decimal\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}s:27:\"catalog_category_entity_int\";a:3:{s:4:\"name\";s:27:\"catalog_category_entity_int\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}s:28:\"catalog_category_entity_text\";a:3:{s:4:\"name\";s:28:\"catalog_category_entity_text\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}s:31:\"catalog_category_entity_varchar\";a:3:{s:4:\"name\";s:31:\"catalog_category_entity_varchar\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}s:32:\"catalog_category_entity_datetime\";a:3:{s:4:\"name\";s:32:\"catalog_category_entity_datetime\";s:6:\"column\";s:9:\"entity_id\";s:18:\"subscription_model\";s:71:\"Magento\\CatalogStaging\\Model\\Mview\\View\\Category\\Attribute\\Subscription\";}}}s:24:\"catalog_category_product\";a:4:{s:7:\"view_id\";s:24:\"catalog_category_product\";s:12:\"action_class\";s:46:\"Magento\\Catalog\\Model\\Indexer\\Category\\Product\";s:5:\"group\";s:7:\"indexer\";s:13:\"subscriptions\";a:2:{s:23:\"catalog_category_entity\";a:3:{s:4:\"name\";s:23:\"catalog_category_entity\";s:6:\"column\"

... more ...

Redis ping command

Enter the following command:

redis-cli ping

PONG should be the response.

If both commands succeeded, Redis is set up properly.

More information

redis-cli command reference

Aws Ec2 인스턴스에 Redis 설치하기
Web Server

Aws Ec2 인스턴스에 Redis 설치하기

Click the link to read the original article: 읽으러 가기

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

저는 Read cache를 위해 별도 EC2 인스턴스를 띄우고 redis를 사용하였습니다.

EC2 create

  • aws amazone linux AMI를 선택합니다.
  • security group 에 16379, 6379 포트를 추가합니다.
  • 인스턴스 생성완료

Linux updates

ssh로 접근해서 업데이트를 실행합니다.

$ sudo yum -y update
$ sudo yum -y install gcc make

Download Redis

참고: http://redis.io/download

$ cd /tmp
$ wget http://download.redis.io/releases/redis-4.0.0.tar.gz
$ tar xzf redis-4.0.0.tar.gz
$ cd redis-4.0.0
$ make

Create Directories and Copy Redis Files

$ sudo mkdir /etc/redis 
$ sudo mkdir /var/lib/redis
$ sudo cp src/redis-server src/redis-cli /usr/local/bin/
$ sudo cp redis.conf /etc/redis/

Configure Redis.Conf

conf 설정 파일을 수정합니다.

$ sudo vim /etc/redis/redis.conf

아래 내용 외 나머지 부분은 기본값을 유지합니다.

[..]
daemonize yes
[..]
  
[..]
bind 0.0.0.0
[..]
  
[..]
dir /var/lib/redis
[..]
  
logfile /var/log/redis_6379.log

Setting Redis-Server init script

참고: https://github.com/saxenap/install-redis-amazon-linux-centos

  • 자동 실행을 위한 스크립트를 다운 받습니다.
  • Redis-Server 파일 이동 후 권한을 설정합니다.
      $ sudo mv redis-server /etc/init.d
      $ sudo chmod 755 /etc/init.d/redis-server
      $ sudo vim /etc/init.d/redis-server
    	
      ->  redis="/usr/local/bin/redis-server" 확인
    
  • Redis-Server Auto-Enable 설정
      $ sudo chkconfig --add redis-server
      $ sudo chkconfig --level 345 redis-server on
    

Start Redis Server

드디어 서버를 실행합니다.

$ sudo service redis-server start
$ redis-cli ping -> PONG

강제 종료시
$sudo service redis-server stop
Redis, 레디스를 사용한 데이터베이스 캐싱서버 운영하기
Web Server

Redis, 레디스를 사용한 데이터베이스 캐싱서버 운영하기

Click the link to read the original article: 읽으러 가기

===========

Redis 서버의 구축 및 운영 등 여러가지 방안에 대하여 생각한 바를 정리한 내용이다. 먼저 Redis 서버가 필요한 이유는 무엇일까…

# Why Redis?

Redis를 왜 구축하는가를 아려면 Redis가 무엇인지부터 알아야한다.

! Redis란?Redis는 데이터베이스의 여러 솔루션 중 하나로 메모리를 사용하는 키, 밸류 형식의 데이터베이스이다. Redis의 최고 장점은 메모리를 사용하기 때문에 매우 빠른 속도를 자랑한다. 일반적인 하드 디스크에 비하여 상대적으로 엄청나게 빠를수도 있다. 다만 메모리라는 제약으로 공간이 크지 않고 키, 밸류(Key, Value) 형식의 입출력 방식이기에 복잡한 데이터베이스에 적합하지 않다.

위 내용만으로도 장점과 단점이 너무 극명하다. 빠르나 효과적인 주 데이터베이스로 사용하기에 다소 어려워보이는 점이다. 또한 공간이 많아질수록 비용이 급격히 올라가므로 이를 고려한다면 Redis는 빛좋은 개살구일 수 있다… 하지만! 대부분 Redis를 보조 데이터베이스 역할로 그 가치를 최대한 끌어내어 활용하고 있다. 그 중 Redis에 가장 적합한 것이 바로 데이터베이스 캐싱(Caching)이다.

! Caching Database Server캐싱(Caching)은 말 그대로 미리 읽어두었다가 요청이 올 경우 빠르게 응답하기 위한 목적으로 사용할 수 있다. 이 경우 전체 데이터가 필요없고 데이터 역시 계속 유지될 필요가 없기에 Redis처럼 적은 공간의 데이터베이스에 최적이다. 게다가 빠른 속도의 메모리를 사용하므로 잘 이용한다면 Redis 캐싱은 선택이 아닌 필수가 아닐까? 어찌보면 Redis는 캐싱을 위해 존재하는지도…

! 데이터베이스 캐싱… 꼭 필요한가?사실 이런 의문이 들 수도 있지만 모든 컴퓨터의 입출력 기술에는 알게 모르게 많은 부분이 캐싱되어 사용되고 있다. 메모리에 올려져 눈에만 안 보일 뿐 대부분이 이미 캐싱되어있지 않을까? 그렇다면 이번에는 웹서비스의 환경을 생각해보자. 아카마이나 CloudFront 등이 서버에서… 데이터베이스 역시 Redis Oracle의 TenTimes등에서 캐싱이 이뤄지고… 로컬 역시 다양한 방식으로 캐싱되며 localStoragesessionStorage를 사용해서도 클라이언트측 캐싱 서비스가 구축된다.

특히 대용량데이터나 컨넥션이 빈번하게 네트워크가 사용된다면 이에 따른 성능차이는 말로 표현하기 어렵다. 아키텍쳐에서 빠질 수 없는 부분이 바로 캐싱이며 어떻게 구축하고 운영하는가가 매우 중요하다.

# Redis 서버의 운영

여기까지 Redis의 장점과 필요성을 알아봤다면 이제 실제 운영을 위해 고민해보자. 일단 앞에 언급했듯이 Redis를 단독으로 주 데이터베이스로 사용하는 것은 무리가 있다. 텍스트 위주의 데이터라면 가능할 수 있으나 차라리 Expire 시점을 짧게 설정하는 편이 더 나을 것이다. 이는 뒤에 또 다루겠다.

어쨌든 Redis는 별도 서버로 구축되어 주서버와 지속적인 서비스를 주고 받는 방법이 효과적이다. 요즘은 하나에 모든 것을 관리 운영하기 보다 각각의 기능, 필요에 따른 마이크로 서비스(Micro Service) 형태로 많이 운영되어진다.

# CRUD에 따른 Redis 데이터 처리

Redis서버는 Client에서 Read 요청이 들어올때 주서버로부터 값을 가져와 저장한다. 이때 주서버와 싱크된 데이터 이 외에 추가로 데이터 만료시점을 처리하기 위해서 현재시간이나 만효시간을 함께 저장해야한다.

다음은 클라이언트의 Read 요청에 따른 처리과정으로 아래를 따르게 된다.

! Read 요청시– 방문자, 사용자의 새로운 데이터 서버에 요청
– Redis 서버에서 요청 데이터가 있는지 확인
– 데이터가 존재하는 경우 만료여부 확인 후 이 정보를 반환
– 정보를 반환한 경우 시간을 현재로 업데이트 후 종료
– 데이터가 만료되었거나 없는 경우 삭제 후 주 서버에 요청
– 주 서버에서 받은 데이터를 캐싱, 데이터베이스에 저장
– 이 값을 방문자에게 반환 후 종료

! CUD Create, Update, Delete 요청시이 경우 앞의 과정과는 조금 다르다. 그 이유는 데이터에 변화가 생겼으므로 해당하는 값의 데이터는 캐싱 값이 아닌 현재 실시간 정보를 보내주는 것이 효과적이기 때문이다. 캐싱 만료시간이 아무리 짧게 설정되어도 없는 데이터를 사용자가 보게되는 일으도록 해야할 것이다. 그러기 위해 필요한 조치는 비교적 간단하다. CUD 요청시 아래와 같이 처리한다.

– 방문자가 CUD를 서버에 요청
– CUD 요청을 주서버에 반영하여 업데이트
– 변경된 데이터 값을 캐싱데이터인 Redis에서 찾아 삭제 후 종료

여기서 가장 중요한 점은 캐싱을 제공하는 경우 단순하게 정보를 제공하는 주분만 고려하는 것이 아니라 다양한 상황에 대처해야한다는 점이다. 이 중 한 가지가 위와같이 CUD처럼 데이터에 중요한 변경사항이 있는 경우 기존의 캐싱 데이터를 삭제처리하는 과정이다.

! 마치면서여기까지 Redis 서버에 대하여 간략하게 알아보았다. 서비스를 구축할때 나도 이런 서비스를 제공한다라는 점보다 어떻게 제공하느냐가 매우 중요하다. 캐싱의 방법 역시 다양한 관점에서 고민하고 제공되어야 할 것이다.

! 추가내용위와같이 클라이언트 사용자의 요청에 따라 데이터를 만료하는 경우 요청이 없는 데이터가 불필요하게 오래 남을 수 있다. 이런 이유로 정기적인 시점… 특히 방문자가 적은 새벽 시점에 만료된 데이터를 clear하는 처리가 요구된다. 이런 작업은 Cron이나 AWS의 람다를 이용하는 것도 좋은 방법이다.

[Spring]스프링 프레임워크 설치하기-eclipse(1)
Web Server

[Spring]스프링 프레임워크 설치하기-eclipse(1)

[Spring]스프링 프레임워크 설치하기-eclipse(1)

[Spring]스프링 프로젝트 만들기-eclipse(2)

 

Click the link to read the original article:

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

자바를 하는 사람이 결국 한번은 거치게 되는 것이 spring프레임워크이다.

우리나라에서는 spring프레임워크는 자발 개발 표준 프레임워크이다.

필자는 빅데이터 수업을 들었는데 그 빅데이터 수업에서 강사님이 원래는 표준이 스프링이 아니였고

표준이 없어서 삼성은 삼성대로, LG는 LG대로 프레임워크를 썼다고 했다.

그러나 요즘은 스프링으로 통일되어 가는 분위기이다.

필자는 파이썬이(flask)나 nodejs(express)등의 프레임워크들을 접해봤다.

자바를 먼저배운것치고 자바 프레임워크를 오히려 늦게 배운편인데 spring은 조금 어렵다.

진입장벽이 있다는 말이다. spring의 명세는 저 프레임워크들보다 더 빡빡하고 더 체계적이다.

아마 오래되서 그런것일까? 아니면 필자가 잘 몰라서 그런것일까? 그건 잘 모르겠다.

어쨋던 spring을 제대로 알기위해서는 디자인패턴에대한 심도깊은 이해가 필요하다.

디자인패턴들을 그냥 아무렇지 않게 사용하는 경향이 있다.

예를 들어 spring의 근간을 이루는 mvc패턴은 말할것도 없으며

singleton, factory, dto, dao등의 패턴을 “이미 안다는 전제하”에서 시작한다.

따라서 spring을 쓰기위해서는 이 디자인패턴을 미리 알고 접근하는것이 매우매우매우 중요하다.

또한 spring은 jsp와 servlet을 근간으로 하기에 이 문법역시 알고 있어야하며

jdbc나 junit등의 표준에 가까운 라이브러리들도 알고 있어야하고

빌드 시스템인 maven(사실 메이븐이 강제는 아닌데 보통은 메이븐을 쓴다.)에 대해서도 이해해야한다.

그리고 깨알같이 알고 있어야하는 xml도 덤이다. 즉 spring프레임워크는 자바를 제대로 이해한 사람이

제대로된 프로젝트를 만들기위해서 사용하는 궁극의 비기(라고 말하면 개 중2병 같지만)같은 것이다.

결론부터 말하면 위에 것들을 모르면 그냥 배우지 말라는 것이다.

이들을 모두 알고 spring을 배우고 싶다면 필자의 Programming-Java-Spring의 강의를 보면된다.

여기서는 스프링 프레임워크를 사용하고 싶은 사람들은 어떻게 사용하면 되는지에 대해서 알려주는 강의이다.

스프링 프레임워크는 사실 설치라는 개념은 아니다. 그냥 jar파일을 추가하고 나면 자기 입맛대로 할 수도 있다.

근데 그렇게 하기엔 생산성도 너무 떨어지기에 그겋게 하는것을 추천하지는 않는다.

이클립스에서는 생산성을 위해서 sts라는 플러그인을 설치할 것이다.

Help->Eclipse Marketplace… 를 클릭해준다.

검색에서 sts를 타이핑해서 검색을하면 Spring Tool Suite를 다운받아준다.

다운을 하게되면 해당 라이브러리에 대한 설치가 진행된다.

이제 라이선스를 확인해준다.

이제 설치가 되는데 재시작을 해주면된다.

이제 다시 시작하면 스프링 프레임워크 대시보드가 추가된게 보인다. 이제 스프링 프레임워크를 사용할 준비가 되었다.

Install Apache Tomcat 8.0 and connect Eclipse
Web Server

Install Apache Tomcat 8.0 and connect Eclipse

Install Apache Tomcat 8.0 and connect Eclipse

Click the link to read the original article:

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

 » 프로그래밍+DB » Apache Tomcat 8.0 설치 + Eclipse 연결

Apache Tomcat 8.0 설치 + Eclipse 연결

이번에는 JSP, Servlet 사용을 위한 Tomcat 8.0 + Eclipse 연계 방법을 알아봄.

clip_image001

http://tomcat.apache.org/download-80.cgi 에서 Windows Service Installer 다운로드(8.0.x)

clip_image002

next

clip_image003

I Agree

clip_image004

Next

clip_image005

포트 확인 후 Next

clip_image006

Next

clip_image007

Install

clip_image008

Run Apache Tomcat… 조금 기다립니다.

clip_image009

알림 영역의 Apache Tomcat 9.0 아이콘을 더블클릭.

clip_image010

서비스를 중지합니다.

clip_image011

Eclipse에서 Window -> Open Perspective -> Other…

clip_image012

Java EE를 선택, OK

clip_image013

Window -> Preferences

clip_image014

Runtime Environments

clip_image015

Apache Tomcat v8.0 선택 후 Next

clip_image016

C:\Program Files\Apache Software Foundation\Tomcat 8.0

위 경로를 선택한 후, Finish

clip_image017

OK

clip_image018

Servers 탭에서 new server 생성

clip_image019

Tomcat v8.0 Server 선택 후, Next

clip_image020

Finish

clip_image021

Project Explorer의 Servers에 Tomcat v8.0 Server at localhost-config 가 추가되면 OK!

clip_image022

Dynamic Web Project 생성

clip_image023

test

clip_image024

새로 생성된 프로젝트의 WebContent에 HTML 파일 추가

clip_image025

index 입력, Finish

clip_image026

Hello World! 내용 추가

clip_image027

index.html -> Run As -> Run on Server

clip_image028

서버 선택 후 Next

clip_image029

우측에 test(프로젝트 이름)이 추가된 것을 확인 후, Finish

clip_image030

성공입니다. ^^

Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기
Web Server

Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기

Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기

Click the link to read the article:

======

윈도에서 자바 프로그래밍을 하기 위해 JDK(Java Development Kit)를 설치하고 이클립스를 설치해 자바 프로젝트를 만드는 과정을 설명합니다.

JDK는 자바 프로그래밍 언어를 사용해 애플리케이션을 개발할 수 있게 해주는 개발 환경입니다.

개발할 일이 없는 일반 사용자는 JRE(Java Runtime Environment)만 있으면 자바 프로그램을 실행할 수 있습니다.

JDK에는 JRE + 개발에 필요한 것들(자바 컴파일러 javac.exe 등)이 있습니다.

이클립스는 애플리케이션 개발을 도와주는 무료 소프트웨어입니다.

 

목차

  1. 윈도에서 JDK 설치
  2. 이클립스 설치
  3. 자바 프로젝트 만들기

 

윈도에서 JDK 설치

jdk download를 검색해 가장 위에 나오는 오라클 사이트에 들어갑니다.

Java Download 버튼을 누릅니다.

라이선스 동의에 체크 후 현재 OS에 맞는 설치파일을 받습니다.

설치파일을 실행합니다.

설치 경로는 Program Files 아래 Java 폴더입니다.

 

이클립스 설치

eclipse를 검색하고 가장 위에 나오는 이클립스 사이트에 들어갑니다.

download 버튼이 잘 보입니다.

설치파일을 누르면 여러 종류의 IDE(통합 개발 환경)가 나오는데 그 전에 오른쪽 위의 !를 눌러 업데이트를 합니다.

라이선스에 동의해야 합니다.

저는 Java EE 용 IDE를 설치합니다.

처음 인스톨할 땐 오류가 났지만, 다시 시도하니 설치되었습니다. 실행해봅시다.

프로젝트를 만들면 아래 경로 아래에 만들어집니다.

계속 같은 경로를 사용할 테니 묻지 말라는 체크 표시를 하고 넘어갑니다.

처음에 나오는 창은 다시 안 뜨도록 체크하고 닫았습니다.

 

자바 프로젝트 만들기

File – New – Other…를 눌러 Java – Java Project를 만듭니다.

프로젝트 이름은 마음대로 적습니다. Finish를 누릅니다.

Java Perspective를 사용하면 자바로 개발할 때 있으면 좋은 창들이 배치된 화면이 구성됩니다.

창들은 개별 설정할 수 있으니 일단은 추천해주는 대로 사용합시다.

src 폴더에 자바 클래스 파일을 만들어봅시다.

오른쪽 클릭 – New – Class를 누릅니다.

아직 클래스들을 구별할 필요가 없으니 패키지 이름이 없다는 경고는 무시하고 클래스 이름만 넣습니다.

main() 메소드를 자동으로 만들도록 public static void main()에 체크합니다.

만든 클래스 파일에 간단한 println() 코드를 넣었습니다.

실행(Ctrl + F11) 또는 디버그(F11)하면 그 전에 저장하라는 알림창이 뜹니다.

항상 묻지 않고 저장 되도록 체크하고 OK 합니다.

Console 창에 성공적으로 출력이 되었습니다.

A/B Testing?
Web Server

A/B Testing?

A/B Testing?

Click the link to go to the original site.

=====

A/B testing이란?

A/B testing은 웹이나 앱에서 A버전과 B버전을 무작위로 유저들에게 보여주고 어떤 것이 나은지 실험하는 방법이다. 각 버전을 본 유저의 행동 데이터를 통계적으로 분석하여  특정한 변화를 주었을 때 목표를 더 높게 달성하는지 알아낼 수 있다.

사실 A/B testing은 오래전부터 과학에서 쓰여왔던 대조 실험(Controlled experiment)과 본질적으로 같다. 가설을 입증하기 위해 대조군(Controlled group)과 실험군(Experimental group)을 설정하고 결과를 검증하는 것은 과학적 방법론의 기본이다. A/B testing은 이 과학적 방법론을 인터넷 환경에 맞게 실행하는 것으로 볼 수 있다.

A/B testing은 웹/앱 기반 비즈니스라면 누구나 사용하고 있는 필수 도구다. 아마존, 구글, 넷플릭스 등 많은 기업들이 새로운 기능을 테스트하고 디자인을 최적화하기 위해 A/B testing을 활용하고 있다.

구글은 오래전부터 A/B testing을 적극적으로 활용해온 것으로 유명한데, 지금도 꾸준히 한 번에 50개 이상의 A/B test를 진행한다고 한다. 그러니 우리는 인터페이스가 약간 바뀌어도 알아채지 못하거나 신경 쓰지 않지만, 사실 A/B testing의 실험 대상이 되고 있을 수도 있다.

A/B testing이 중요한 이유는 가설을 직관이 아니라 데이터로 증명할 수 있기 때문이다. 사실 디자인에 대해서는 누구나 가설을 세울 수 있지만 증명하기는 어렵다. 만드는 사람 입장에서는 너무나 중요해보이지만 실제로는 아무런 행동을 이끌어내지 못한다거나, 전혀 예상치 못했는데 전환율이 크게 증가한다거나 하는 사례는 비일비재하다.

웹에서는 사용자들의 행동을 트래킹할 수 있기 때문에, 유저들이 실제로 어떻게 반응하는지 정량적으로 측정 가능하다. 실제 유저들의 심리와 행동을 파악하는 귀중한 자료가 되고, 이 피드백을 통해 서비스를 최적화해나갈 수 있다.

A/B testing으로 큰 효과를 낸 사례들을 몇 가지 보자. (Smashing Magazine을 참고했다.)

1. “I’m on twitter”보다 “You should follow Me on Twitter here”가 실제 팔로우 확률이 173% 높았다.

2. 회원가입 버튼 옆에 ‘It’s free!’를 넣으면 버튼을 누를 확률이 28% 증가한다.

3. 문장 스타일 정보 입력 폼을 사용하자 완료할 확률이 25-40%로 증가했다.

A/B testing은 만능이 아니다.

A/B testing은 아주 유용한 툴이지만, 모든 의사결정을 A/B testing으로 해결할 수는 없다. Diane Tang은 A/B testing course에서 이에 대해 “A/B testing은 산을 잘 올라가고 있는지는 말해주지만 어느 산에 올라가야 하는지는 말해주지 않는다.”라고 표현했다. 즉, A/B testing은 최적화 도구일 뿐 큰 그림을 보여주지는 못한다.

자..잠깐, 이 산 맞나?

그래서 A/B testing은 완전히 새로운 기능을 추가하거나, 훨씬 높은 단계의 의사결정에 관해서는 효과적이지 않다. 예를 들어 ‘유료로 이용할 수 있는 프리미엄 기능’을 추가한다거나, ‘현제 시작 페이지에 어떤 문제가 있는가?’ 같은 질문에는 대답하기 어렵다. 따라서 A/B testing을 실행할 때는 아주 구체적이고 명확한 기능, 디자인을 대상으로 하는 것이 좋다.

A/B testing은 웹 로그 분석, 사용성 테스트, 유저 인터뷰 등 보완적인 방법들을 함께 사용해야 한다. A/B testing은 정답을 유추해내는 하나의 단서일 뿐 그 자체가 정답은 아니다.

A/B tesing을 할 때 알아야 할 실험 윤리

Udacity의 A/B testing course(링크)에서는 한 챕터를 ‘Policy and Ethics of in A/B testing’에 할애하고 있다. 미처 생각해보지 못했던 부분이었다. 비록 불특정 다수를 대상으로 하지만 A/B testing도 실험의 일종이기 때문에 실험 과정에서 참가자를 보호할 의무가 있다. 다음 4가지 질문을 기억하자.

첫 번째, 참가자에게 어떤 위험이 따르는가?

‘참가자가 일반적인 일상생활에서 겪는 위험’을 최소 위험이라고 한다. 이를 기준으로 더 큰 위험이 따르는 경우 반드시 참가자의 동의를 얻어야 한다.

두 번째, 참가자들이 어떤 개인 정보가 수집되는지 알고 있는가?

실험 과정에서 민감한 정보를 수집하는 경우도 있다. 민감한 정보란 일반적으로 건강, 의료 데이터나 금융 데이터 등이 해당된다. 이런 정보가 수집되는 경우에는 정보 수집, 처리 과정에 대해 알리고 참가자의 동의를 받아야 한다.

세 번째, 개인 정보가 식별 가능한가?

프라이버시에 관해서 데이터는 다음과 같이 나뉜다.

식별 가능 데이터 (Identified data) : 특정 개인임을 알아낼 수 있는 정보. 이름, 아이디, 주민등록번호, 운전면허 번호, 휴대폰 번호 등이 해당된다.

익명 데이터(Anonymous data) : 식별 가능 정보가 없는 데이터

익명화된 데이터(Anonymous data): 재식 별 위험이 없도록 수정된 데이터

가명화 데이터 (Psuedonymous data) : 무작위로 생성한 쿠키 등을 통해 동일 데이터를 파악할 수는 있지만 개인 식별은 불가능한 데이터

각 데이터의 종류에 따라 프라이버시 보호의 정도가 달라진다. 법적 조항은 각 나라마다 다르다고 한다. 우리나라의 개인정보보호 가이드라인은 개인정보보호 종합포털을 참고.

네 번째, 데이터가 어떤 과정을 거쳐서 처리되는가?

처리 과정에서 어떤 사람들이 접근 권한을 가지고 있으며, 원래 목적으로만 사용되도록 보호하는 조치는 어떤 것이 있는가? 위반 시 어떤 조치를 하는가? 이런 질문에 대해서 미리 답변할 수 있어야 한다.


A/B testing 프로세스

1. 기존에 존재하는 데이터를 모으고 들여다본다.

웹 로그 분석이나 사용자 인터뷰 등 이미 가지고 있는 데이터들에 대해 충분히 이해해야 한다. 곧 설명하겠지만, A/B testing을 하기 위해서는 실험에 필요한 지표, 신뢰 수준, 표본 숫자 등등 많은 것들을 결정해야 한다.

이를 결정할 인사이트를 얻기 위해서는 기존 데이터에서 문제점은 무엇이 있는지, 어떻게 개선할 수 있을지, 지표들의 흐름은 어떠한지, 지표가 변동하는 범위는 어느 정도인지 등을 사전에 파악해야 한다. 유난히 이탈률이 높은 페이지를 찾아보거나, 트래픽이 유난히 높을 때는 언제인지 등등을 눈여겨보자.

2. 목표(Goal)를 구체화한다.

먼저 A/B testing을 통해 궁극적으로 이루고자 하는 목표가 명확해야 한다. 어떤 비즈니스를 하느냐에 따라 목표는 다 다를 수 있다. 예를 들어 취업 포털 사이트라면 ‘더 많은 사람들의 취직을 돕는 것’이 목표일 수 있고 가격 비교 사이트라면 ‘소비자들이 가장 싼 가격에 좋은 물건을 사게 하는 것’이 목표가 될 수 있겠다.

어느 정도 레벨을 목표로 잡느냐에 따라서도 다르다. 높은 수준의 목표라면 ‘더 많은 사람들의 취직을 돕는 것’ ‘유저가 싼 물건을 짧은 시간에 찾을 수 있게 하는 것’ 등이 될 수도 있고, 좀 더 구체적으로는 ‘채용 기업 회원 숫자’나 ‘회원 만족도’를 목표로 할 수도 있다.

목표를 세울 때 중요한 점은 ‘우선순위’의 관점에서 생각해야 한다는 것이다. 당연히 회원 수가 늘면 좋고, 매출이 늘어도 좋고, 만족도가 늘어도 좋다. 하지만 의미 있는 서비스를 만들기 위해서는 그중에서 팀이 가장 중요하게 생각하는 것이 반드시 합의되어야 한다.

다른 말로 하면 이 목표를 위해서는 다른 목표를 희생할 수도 있다는 점을 모두가 동의해야 한다. A/B testing에 있어서 ‘명확한 목표’는 실험을 효과적, 효율적으로 진행하기 위한 기본이다.

3. 지표(Metric)를 선정한다.

목표를 정했다면 그에 맞는 지표(Metric)를 선정해야 한다. A/B testing에서 좋은 지표를 선정하는 것은 아주아주 중요하므로 지표를 선정할 때는 신중하자.

3.1. 목표에 맞는 지표

지표를 선정할 때는 주로 퍼널 분석(Funnel Analysis)을 하게 된다. 퍼널 분석이란 특정 목표를 이루기 위해 필요한 이벤트를 단계적으로 나누어 분석하는 것을 말한다.  다음 단계로 넘어갈수록 깔때기처럼 좁아지기 때문에 퍼널(Funnel, 깔때기) 분석이라고 한다. 이 방법은 전환율(Conversion rate)을 계산함으로써 유저 행동을 단계별로 분석할 수 있기 때문에 유용하다.

서비스에서 유저들이 통과하는 퍼널을 단계적으로 분류해보고 이 과정에서 A/B testing로 개선이 필요한 지표를 선택한다. 1단계에서 기존 데이터를 살펴보았다면, 특별히 유저들이 많이 이탈하는 단계를 먼저 선정할 수 있다.

아니면 미리 설정한 ‘목표’에 가장 큰 영향을 주는 단계의 전환을 지표로 삼는 것도 좋다. 버튼을 클릭하는 것이나 이메일을 열어보는 것 등 측정할 수 있는 거라면 뭐든 지표가 될 수 있다.

3.2. 지표의 종류

지표의 종류는 크게 네 가지 카테고리가 있다.

첫 번째는 ‘웹사이트에 들어온 전체 유저의 숫자’와 같은 합계 지표(Sum)이다.

두 번째는 평균(mean)이나 중앙값(median)이다. 예를 들어 구매까지 걸리는 평균 시간(mean), 첫 구매가 발생할 때까지 방문한 페이지의 중윗값(median) 등이 있다.

세 번째는 확률(probability)이다. 어떤 이벤트가 발생한 경우 1, 아닌 경우 0을 부여해서  전체 확률을 볼 수 있다. 확률 지표는 항상 0과 1 사이에 위치한다.

마지막으로는 비율(Ratio)이 있다. 한 지표를 다른 지표로 나눈다. “결제하기를 누른 횟수 중 구매 완료한 횟수 / 결제하기를 누른 횟수” 같은 식이다.

3.3. 민감도와 강건성

지표를 결정할 때는 민감도(Sensitivity)와 강건성(Robustness) 두 가지를 반드시 고려해야 한다. 우리가 원하는 변화가 발생했을 때 그 변화에 비례해서 움직이는 지표를 민감(Sensitive)하다고 한다. 반대로 목표와 상관없는 변화가 일어났을 때 지표가 움직이지 않으면 강건(Robust)하다고 한다.

예를 들어서 이 ‘시간당 회원가입을 클릭한 횟수’가 지표라고 해보자.

먼저 강건성 체크를 위해 아무것도 바꾸지 않은 상태에서 회원가입을 클릭하는 횟수가 어떻게 변동하는지 본다. 그런데 지표를 보니 아무런 변화를 주지 않았는데도 ‘회원 가입 클릭 횟수’가 큰 폭으로 오르락내리락했다. 실험과 관련된 변화가 없는데도 들쑥날쑥하면 실험 결과가 왜곡될 수 있기 때문에 좋은 지표라고 할 수 없다.

반대로 우리의 목표인 ‘활동 유저 수(Active user)’가 늘어도 ‘시간당 회원가입을 클릭한 횟수’는 별로 변화가 없을 수도 있다. 이 경우에는 충분한 민감하지 못한 지표이기 때문에 역시 적합하지 않다.

기존 데이터나 아니면 작은 실험을 통해서 지표가 이 두 가지 조건을 만족하는지 테스트해보자.

3.4 지표의 정의

한 가지 더 주의해야 할 점은 testing을 하기 전에 지표를 엄밀하게 정의해야 한다는 점이다. 단순히 ‘클릭한 확률(Click-through-rate)’이 지표라고 하더라도 impression을 기준으로 할지, 페이지뷰를 기준으로 할지에 따라 완전히 다르다. ‘클릭한 순간을 트래킹할지 클릭하고 다음 페이지로 이동했을 때 트래킹할지’ 같이 사소해 보이는 문제도 실제 웹상에서는 구현할 때는 완전히 다를 수 있다. 지표를 수식으로 나타내 보고 각 요소를 하나하나 따져보자. 테스팅을 구현하는 개발자와 원활한 소통을 위해서는 지표를 최대한 엄밀하게 정의하는 것이 좋다.

4. 가설을 수립한다.

목표와 지표가 있다면 이제 어떤 변화를 주어야 이 지표가 향상될 수 있을지, 그리고 왜 그럴지에 대해 가설을 세운다.

예시) “결제 페이지를 세 단계에서 두 단계로 바꾸면 결제하기를 클릭한 사람 중 완료한 사람의 비율이 높아질 것이다. 결제 단계가 간단하면 중간에 포기하고 나가는 고객이 줄어들 것이기 때문이다.”

유저 행동에 영향을 미치는 요소라면 무엇이든지 A/B testing 대상이 될 수 있다. 헤드라인, 텍스트, 사용후기, CTA(Call to Action) 버튼, 링크, 이미지, 접기 버튼, 기사 스크랩, 페이지 레이아웃 등등.

여러 가지 가설이 리스트에 있다면 예상되는 효과의 크기와 실행 난이도에 따라서 우선순위를 매기면 된다. 효과가 크고, 실행하기 쉬운 가설부터 실험한다.

5. 실험을 설계한다.

5.1. 분기 단위(Unit of diversion)

먼저 분기 단위(Unit of diversion)를 정해야 한다. 분기 단위(Unit of diversion)는 A그룹(대조군)과 B그룹(실험군)을 나누는 기준을 말한다. 주로 사용되는 3가지는 ID, cookie, event다.

ID의 경우, 로그인이 된 회원의 ID를 기준으로 대조군, 실험군을 나눈다. ID를 사용하면 동일 유저가 시간차를 두고 나중에 다시 접속하거나, 디바이스를 웹에서 모바일로 바꾸더라도 환경이 바뀌지 않아 일관적이다. 하지만 로그인을 하기 전에는 분기를 할 수 없고, 개인 식별이 가능하기 때문에 데이터 수집 시 주의해야 한다.

Cookie란 사용자가 사이트를 방문할 때 생성되는 기록 파일이다. 로그인을 하지 않아도 사용자의 행동을 트래킹 할 수 있다는 장점이 있다. 그래서 웹사이트에 들어가면 “쿠키 정보를 수집합니다”라고 알림이 뜨는 이유다. 다만 브라우저나 디바이스가 바뀌거나 쿠키가 삭제되면 트래킹이 불가능하다는 단점이 있다.

Event을 사용하면 유저가 어떤 행동(event)을 했을 때 무작위로 A 혹은 B의 결과가 나타나게 된다. 즉 ‘회원가입 클릭’이라는 이벤트를 기준으로 한다면, 매번 회원가입을 클릭할 때마다 A 화면이 뜰 수도 있고 B 화면이 뜰 수도 있다. 이 경우 동시에 서비스의 일관성을 많이 해칠 수 있다. 대신 가장 임의화된 (Randomized) 샘플을 뽑을 수 있어서 통계적으로 효과적이라는 장점이 있다.

따라서 Event 분기는 유저가 눈치채기 어려운 A/B testing일 때만 쓰인다. 예를 들어 ‘동영상 로딩 속도’를 높였을 때 ‘동영상을 끝까지 보는 사람의 비율이 늘어나는지 확인’하고 싶다고 하자. 동영상을 클릭했을 때 랜덤으로 ‘로딩 시간 0.5초’ 혹은 ‘로딩 시간 2초’가 나타나는 것이다. 이런 변화의 경우 유저가 알아채기 거의 힘들다. 즉, 유저가 “아니 어떨 때는 0.5초가 걸리고 어떨 때는 2초가 걸리는 거야?”라고 불만을 가지지 않는다는 말이다. 그래서 이럴 때는 Event 분기를 사용해서 A/B testing을 할 수 있다.

한 가지 더 고려해야 할 점은 분석 단위(Unit of analysis)이다. 분석 단위란 간단히 말해 지표의 분모다. 지표가 ‘회원당 구매액’이라고 해보자. 수식은 다음과 같을 것이다.

총 구매액 합계 / 회원 수

이 지표에서 분석 단위는 분모인 ‘회원’이 된다. 즉, A/B testing으로 영향을 주려고 하는 최소 단위다.

분기 단위를 정할 때는 분석 단위와 일치시키는 것이 바람직하다. ‘회원당 구매액’의 경우 분석 단위가 ‘회원 한 명’이므로 ID를 기준으로 분기한다. 분기 단위와 분석 단위를 일치시키는 이유는 실험 데이터를 ’독립 사건’으로 만들기 위해서다. 예를 들어 우리가 분석하고 싶은 단위는 ‘회원’인데 실험 데이터에서는 ‘페이지뷰’로 분기되어있다면, 한 명은 회원이 여러 개의 페이지뷰를 만들어낼 수 있다. 그러나 각 페이지뷰는 한 명의 회원이 만들어낸 것이므로 서로 확률이 연관되어있고, 사건 간의 독립성이 없다. 따라서 어떤 회원은 페이지뷰를 100번 했고, 어떤 회원은 페이지뷰를 1번 했을 때 실험 데이터가 왜곡될 가능성이 커진다. ‘통계적으로 유의미’ 한 결과가 나오기 힘들어진다. ‘통계적 유의성’에 관해서는 5단계에서 알아보겠다.

5.2. 목표 집단 (Target Population)

일반적으로 실험을 할 때는 샘플 숫자가 많을수록 좋다. 결과의 신뢰도가 올라가기 때문이다.

그럼에도 불구하고 무작정 모든 유저를 모집단(Population)으로 잡고 샘플링하면 오히려 신뢰도를 떨어뜨릴 수 있다. 어떤 상황에서는 측정하려고 하는 변화가 특정 집단에게만 의미 있는 것일 수 있기 때문이다.

예를 들어 홈페이지에 한국어 폰트를 변경하는 테스트를 했을 경우, 이 변화의 영향을 받는 유저는 한국 유저다. 그런데 이를 고려하지 않고 외국 유저까지 포함된 전체 유저를 대상으로 샘플링을 할 경우, 한국어 폰트 변경이 효과가 있었음에도 불구하고 영향을 받지 않는 그룹(외국 유저) 때문에 데이터를 분석했을 때  ‘효과 없음’으로 결론날 수가 있다. 한국 유저들의 행동 변화를 외국 유저들이 상쇄시키기 때문이다.  따라서 실험의 대상이 되는 모집단을 정확히 정의하자.

코호트(Cohort)를 기준으로 A/B testing을 할 수도 있다. 코호트란 ‘특정 기간 특정 경험을 공유한 사람들의 집합’을 말한다. 예를 들면 ‘앱 설치’가 기준이라면 4월에 앱을 설치한 그룹, 5월에 앱을 설치한 그룹 이런 식으로 나누는 방법이다. 코호트 분석은 유저 행동을 분석할 때 널리 쓰이는 방법이다. 웹/앱 서비스를 사용한 시간에 따라서 사용자의 패턴이 달라지기 때문이다. 서비스를 사용한 지 1개월 된 유저와 3년 된 유저는 특성이 매우 다를 수밖에 없다.

A/B testing에 코호트를 적용하는 이유는 여러 가지가 있다. 그중 하나는 ‘학습 효과’를 없애기 위해서다. 서비스에 변화가 생기면 유저들이 처음에는 익숙하지 않다가 차차 변화에 적응하는 것을 학습 효과라고 부르는데, 학습 효과가 진행되는 기간에는 데이터가 튀거나 왜곡될 수 있다. 실제로는 긍정적인 변화라도 기존 방식에 익숙해져 있던 유저들에게는 단기적으로 안 좋은 지표 변화가 나타날 수 있기 때문이다. 코호트를 사용해 새로 서비스를 사용하기 시작한 유저들을 대상으로만 A/B testing을 사용하는 식으로 ‘학습 효과’를 데이터에서 배제할 수 있다.

이 외에도 유저 리텐션(Retention) 향상이 목표이거나, 가입 시점에 따라서 실험 결과가 영향을 받을 수 있는 A/B testing의 경우는 목표 집단을 특정 코호트로 제한하는 방법이 효과적이다.

5.3. 표본 크기(Sample Size)

의미 있는 결과를 내기 위해 필요한 표본 숫자(n)가 얼마인지 알아야 한다. 필요한 표본 숫자는 신뢰도 수준을 더 보수적으로 잡거나, 오차 범위 구간을 작게 잡거나, 현실적으로 유의미한 변화(6.3.에서 설명)를 낮게 설정할수록 늘어난다.

각 수치들은 트레이드오프 관계이기 때문에 우선순위를 정하기 나름이다. 신뢰도가 높은 결과를 얻고 싶다면 표본 숫자를 늘려야 하고, 표본 숫자를 많이 구하기가 힘들다면 그만큼 신뢰 수준이 낮거나 오차 범위가 커진다.

우선순위를 고려해서 수치를 결정했다면 표본 숫자 계산은 어렵지는 않다. A/B testing 프레임워크를 쓴다면 대부분 자동으로 탑재되어있으며, 아니면 구글에서 ‘A/B testing sample size calculator’라고만 검색해도 쉽게 찾을 수 있다.

5.4. 실험 기간(Duration)

실험 기간도 결정해야 한다. 시간은 금이기 때문에 일단 기간은 최대한 짧은 게 좋겠지만, 기간이 짧은 경우 정확성을 놓칠 수가 있다. 전문가들은 A/B testing기간은 최소 수 일 이상은 되어야 한다고 조언한다. 결과에 영향을 미칠 수 있는 외부 변수들이 많이 있기 때문이다. 트래픽은 특정한 날짜나 요일에 따라서 영향을 받는다. 특히 E-commerce 사이트의 경우 명절, 연휴 기간에는 평소와 전혀 다른 패턴이 나타날 수 있다. 이런 경우가 실험에 영향을 주지 않도록 고려해서 기간을 정해야 한다. 또는 구매 주기가 긴 상품(가구, 자동차 등)의 경우에는 효과가 나타날 때까지 시간이 걸린다. 현실적으로 가능한 선에서 충분한 기간을 갖고 실험하자.

6. 결과를 분석한다.

이제 실험에서 도출된 데이터를 보고 결론을 도출해야 한다. 지표가 긍정적으로 변했다고 해서 흥분하지 말자. A/B testing을 할 때 가장 흔하게 나타나는 실수다. 실험 과정에서 무언가 잘못되었을 수도 있고, 우연의 일치가 일어났을 수도 있다. 그러므로 실제로 이 결과가 정말로 의미 있는지 알려면 3단계 확인을 해야 한다.

6.1. 불변 지표(Invariant Metric)

먼저 실험 과정에서 문제점이 없었는지 재점검을 해보기 위해서 불변 지표(Invariant metric)가 변하지 않았는지 체크한다. 불변 지표란 실험 과정에서 변하면 안 되는 변수다.

예를 들어 표본 숫자는 실험군과 대조군 사이에 큰 차이가 나서는 안된다. 기본적으로 A/B testing에서는 50대 50 확률로 실험/대조군을 분류하게 된다. 전체 트래픽을 2분의 1로 딱 나누는 것이 아니기 때문에 실험/대조군의 표본 숫자에 차이가 나는 것이 정상이다. 하지만 오차 범위를 계산해봤을 때 그 이상으로 차이가 난다면 실험 과정에서 뭔가 잘못되었을 가능성이 있다.

그 외에도 가설과 관련 없는 지표가 변화(회원가입 버튼을 바꾸었는데 결제 페이지 지표가 크게 바뀌었다던지) 하지 않았는지 확인하자. 시스템 상에서 오류가 일어나는 경우는 흔하고, 아니면 다른 외부 변수가 작용했을 수 있다.

A/A testing은 실험이 제대로 진행되었는지 확인할 때 유용하다. A/A 테스트란 아무런 변화도 주지 않고, 두 집단의 차이를 측정하는 실험이다. 즉, A/A 테스트를 했을 때는 양쪽 집단에서 결과가 똑같이 나와야 정상이다. 그렇지 않다면 뭔가 문제가 있는 것이다. 체중계로 치면 영점 조정이라고 할 수 있겠다. 올라가기 전에 정확하게 0에 맞춰져 있어야 측정 결과를 신뢰할 수 있는 것과 같은 원리다. Diane에 따르면 구글에서는 A/B 테스팅 전후에 A/A 테스트를 반드시 하도록 내부적으로 정해져 있다고 한다.

6.2. 통계적 유의성 (Statistical significance)

어떤 실험 결과를 두고 ‘통계적으로 유의미하다’고 하는 것은 단순히 우연이라고 보기 어렵다는 뜻이다. 실험에서는 언제나 우연의 가능성이 있기 때문에, 통계적으로 유의미한 결과인지 확인하는 것은 아주아주 중요하다.

통계적으로 유의미하다는 말은 동시에 이 실험을 다시 한번 해도 똑같은 결과가 나온다는 말이기도 하다. 우리는 A/B testing을 통해서 가설을 입증하고 이를 서비스 전체에 적용하고 싶은 것이기 때문에, 이 결과를 반복해서 나타날 수 있는지 여부를 반드시 점검해야 한다.

이 과정을 통계학에서는 가설 검정(hypothesis test)이라고 한다. 가설 검정을 모두 설명하게 되면 관련된 통계학 이론에 대해서 설명해야 하기 때문에 나중에 이 부분에 관해서 따로 정리해보겠다.

결론만 말하자면, Hypothesis testing을 통해서 변화가 ‘우연히 일어났을 확률’을 구할 수 있는데, 일반적으로 이 확률이 5% 이하이면 통계적으로 유의미한 것으로 본다.

6.3. 현실적 유의성 (Practical significance)

통계적으로 유의미한 결과가 나왔다고 하더라도 바로 그 가설을 적용해서는 안된다. 이 실험 결과를 전체적으로 적용하기 위해서는 시간과 돈이 들기 때문이다. 따라서 현실적으로 유의미하다는 말은 비용과 시간을 고려했을 때도 충분히 실행할 가치가 있는 가설이라는 뜻이다. 따라서 이는 상황을 고려해서 직접 결정해야 한다. 어떤 비즈니스냐에 따라 범위가 다를 수 있다.

극단적인 예로 신약 개발의 경우, 신약의 성능이 15% 이상은 되어야 현실적으로 유의미한 숫자라고 한다. 제품화에 그만큼 많은 시간과 비용이 들기 때문이다. 하지만 웹/앱 서비스 경우에는 그렇지 않기 때문에 1-2% 정도만 되어도 굉장히 의미 있는 차이로 본다.

‘왜’를 놓치지 말자

실험 결과가 이 3가지 점검을 모두 통과했다면 가설을 전체 서비스에 적용할 수 있다. 하지만 한 가지 더 마지막으로 유의해야 할 점이 있다. 단순히 가설을 입증했다고 해서 끝은 아니다.

왜 그런 결과가 나왔는지에 대한 이유를 더 파고 들어가야 한다. A/B testing은 유저 행동이 변화한 이유까지는 알려주지 않기 때문이다. 입증된 가설을 가지고 유저 인터뷰 등 정성적인 분석 방법을 통해서 유저에 대해 깊게 이해해나가야 지속적으로 사랑받는 서비스를 만들어갈 수 있다.


이 글은 Udacity의 A/B testing 강의 내용을 재구성했습니다.

How to detect and clean malware from your Linux server using Maldet
Magento 2

How to detect and clean malware from your Linux server using Maldet

How to detect and clean malware from your Linux server using Maldet

Click the link to the article page:

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

What is Malware?

Malware is the short form of Malicious Software. Any software that is introduced into your system/server with the malicious intent of disrupting the smooth operation of your server, to collect sensitive private information or to gain access to your system is malware.

How can you recognize the presence of malware?

You may or may not recognize that there is a malware attack on your system for a long time. Sometimes, your readers may report a warning from an anti-virus software like this.

Sometimes, Google Webmasters or Bing Webmasters will report it.

Either way, when you are alerted of malware, the first step would be to secure your system. Cleaning up may be futile if your system is not secure. So, secure first. Take backups of your files and databases. Change all passwords and then go on to cleaning the system of malware.

Most importantly, you need not wait to react after a malware attack. You can set up malware scanning as a regular check proactively so as to be able to catch them as soon as possible.

Linux Malware Detect (LMD)

Linux Malware Detect (LMD), popularly known as Maldet is an open-source malware scanner for Linux released under the GNU GPLv2 license. It is designed around the threats faced in shared hosted environments. Install, configure and run this free software to detect and clean malware on your system.

Install maldet and configure

Installation

Login as root or an account with root permissions into your server.

The source code of the current stable version of LMD or maldet is available as a tar ball at this link. Download it.

    sudo wget http://www.rfxn.com/downloads/maldetect-current.tar.gz

Unpack the tar ball.

    sudo tar -xvf maldetect-current.tar.gz

After this, list the files to see the directory in which it is installed. The directory is usually of the format maldetect-x.y.z where x.y.z is the version number. Change to this directory.

    cd maldetect-1.5

Check if the install.sh script is there and run it.

    sudo ./install.sh

The installation is complete.

Configuration

For configuring maldet, the configuration file at /usr/local/maldetect/conf.maldet has to be edited.

Open it with a text editor.

The following are some of the common options that you may want to set.

If you want to be alerted of the presence of malware by mail, set the following options.

  • email_alert : If you want to get email alerts whenever a suspicious file is detected, then it should be set to 1.
  • email_addr : The email address to which alerts should be sent. This is used in conjunction with the email_alert option.
  • email_ignore_clean : When malware alerts have been automatically cleaned (check the next two options), ignore sending email alerts. This is disabled by default. Set it to 1 to enable it, if you have set up an automated daily scan that detects and cleans the hits and you do not want to be alerted of these by mail.

What action should be taken on the affected files? The following options can be set to quarantine (to move the affected files to a secure location where they cannot produce any harm) the files.

  • quarantine_hits : The default value is 0. Set this to 1 so that the affected files will be moved to quarantine.
  • quarantine_clean : The default value is 0. This is used when quarantine_hits is set to 1. Do you want the system to further clean the files? Set this to 1 if you want the system to try to clean the malware injections. Keep this as zero if you want to inspect before cleaning.

In a multi-user environment, the following options may be useful.

  • quarantine_suspend_user : By default, this is disabled and set to 0. If you set this to 1, the accounts of users who have hits will be suspended. For this to work, quarantine_hits should be 1.
  • quarantine_suspend_user_minuid : The minimum user id which can be suspended. This is set to 500 by default.
  • inotify_minuid : The minimum user id above which users need to be monitored. The default value is 500 (more details here).
  • inotify_docroot : The web directory relative to the home directory of users. By default, it is set to public_html. If this is set, only this web directory will be monitored.

Save and close the configuration file.

Scanning and its options

A basic scan

For a basic scan, run maldet with the --scan-all option with a path as an argument. It first builds a list of files in all the directories and sub-directories in that path. Then it scans through all the files and gives the number of hits. It also gives a report which you can view to inspect the files that are suspicious. Make sure that you give the full path and not the relative path.

    sudo maldet --scan-all /home/username/public_html/

A note of caution, though. The setting scan_ignore_root in the configuration file is set to 1 by default. This causes files that are owned by root to be ignored in the file list that maldet builds. The default value is more efficient, but the assumption is that your root password has not been compromised and malware are not injected into root-owned files. Change this setting to 0 if you want root-owned files also to be scanned. This might slow down the scan. So, use it judiciously.

You can view the files that are affected by opening the report file mentioned.

Quarantine affected files

When quarantine_hits is set to 1, maldet not only scans for malware, but also moves the hits to a quarantine so that your users do not have access to these files. So, your malware scan may produce results as below. In this case, quarantine_clean is set to 0.

If you view the report, you can see the affected files and their quarantine location. You can inspect the files and then decide on whether you want to clean them.

If you performed a scan with the quarantine_hits set to 0, you need not set it to 1 and redo the scan (as shown above). Instead, you could quarantine all malware results from the previous scan with

sudo maldet –quarantine SCANID

Quarantine and clean affected files

When quarantine_clean is set to 1, in addition to moving the affected files to quarantine, maldet also tries to clean them.

If you did a scan with the quarantine_hits or quarantine_clean set to 0, you can do a clean with the following option.

    sudo maldet –clean SCANID

Restore a file

If you want to restore a file which was wrongly tagged as a malicious and quarantined, or if you have manually cleaned the file and want it back in its proper location,

    sudo maldet –restore FILENAME

Alternately, give the complete path of the quarantined file.

    sudo maldet –restore /usr/local/maldetect/quarantine/FILENAME

Wildcard scan

You can also use wildcards in your scan path. ? is the wildcard character.

    sudo maldet --scan-all /home/?/public_html/

This would check all directories inside /home and if any of them had a public_html sub-directory, then that directory will be scanned completely.

Recent scan

If you want to scan the same path as a previous scan, but only those files created or modified in the recent past, you have to run maldet with the --scan-recent option and the number of days n

    sudo maldet --scan-recent /home/username/public_html/ 7

A weekly incremental check can be done by doing such a recent scan for 7 days.

Automate periodic scan

You can automate daily scans using the cronjob feature. During installation, LMD installs a cronjob at /etc/cron.daily/maldet.

This cronjob (an automated job that runs periodically) will update signatures, include new malware threats in its registry and perform a daily scan of all the home directories and recent changes on the server. Whenever, it detects some malware, it will notify you at the mail address specified in the configuration.

Monitor mode

The inotify monitor can be used to monitor users real-time for file creation, modification or movement. Monitoring can be done with one or more of the three options available,

Monitor users

The users option will take the home directories of all users in the system who have uid greater than inotify_minuid and monitor them. If inotify_docroot is set, the users’ web directory, if it exists, will only be monitored.

    sudo maldet --monitor users

Monitor paths

Alternately, you can monitor paths. Give a comma separated list of paths with the --monitor option.

    sudo maldet --monitor PATH1,PATH2,...PATHN

For example,

    sudo maldet --monitor /tmp,/home,/var

Monitor files

If you have concerns about specific files, you can monitor specific files by giving a comma-separated list of files.

    sudo maldet --monitor FILE1,FILE2,...FILEN

Exclude files or paths

Certain paths or files can be excluded from scan, by using the ignore files.

Add files or paths to be excluded (one per line) from daily scan in /usr/local/maldetect/ignore_paths

Add signatures to be excluded (one per line) from daily scan in /usr/local/maldetect/ignore_sigs

Add files or paths to be excluded from inotify monitoring (one per line) in /usr/local/maldetect/ignore_inotify.

Add the extensions of file types that you want to exclude from daily scans (one per line) in /usr/local/maldetect/ignore_file_ext. Sample entries in file could be

    .png
    .jpg

Check out more options like running maldet in the background and other finer settings by using the help option.

    sudo maldet --help

If you run a self-hosted website, at some point or the other, it is possible for malicious hackers to inject malware into your system. Before that happens, get your system secure and install maldet to keep ahead of such attacks.

(For the purpose of this tutorial, Ubuntu version 14.04 and maldet version 1.5 were used)

RESTful API란 ?
Web Server

RESTful API란 ?

RESTful API란 ?

Click the link to see the article:

개발 공부를 시작하고 자주 접하고 그냥 지나친 개념 중에 하나이다. 면접 질문으로도 자주 나온다고 하고, 실제로 채용공고 필요 역량에도 REST 등 인터넷 기반 프로토콜/ 기술에 대한 이해를 요구하고 있는 기업도 다수 있다.


REST하다는 것은 무엇일까?


REST(REpresentational State Transfer) ‘대표적인 상태 전달’ 흠.. 무슨 말인지 와닿지 않는다.

REST란, “웹에 존재하는 모든 자원(이미지, 동영상, DB 자원)에 고유한 URI를 부여해 활용”하는 것으로, 자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미한다고 한다.

따라서 Restful API는 REST 특징을 지키면서 API를 제공하는 것을 의미한다. (일종의 Coding Convention이랄까. 설계원칙, 가이드를 지키면서 개발을 하자는 의미인듯 싶다.)

그렇다면 왜 REST 개념이 대두되었을까?

큰 특징으로는 ‘애플리케이션 분리 및 통합’, ‘다양한 클라이언트의 등장’이다.

애플리케이션의 복잡도가 증가하면서 애플리케이션을 어떻게 분리하고 통합하느냐가 주요 이슈가 되었고, 이에 자바 진영에서는 과거 EJB(Enterprise Java Beans), SOA(Service Oriented Architecture)에 이어 최근에는 MSA(Micro Service Architecture)와 함께 REST가 떠오르고 있는 것이다.

그리고 모바일과 같은 다양한 클라이언트의 등장하면서 Backend 하나로 다양한 Device를 지원하기 위해 REST의 필요성이 증대되었다.


그래서 REST란 무엇일까?


REST 구성– 자원 (Resouce) – URI– 행위 (Verb) – HTTP Method– 표현 (Representations)


예) /users GET /users/{id} GET /users PUT
REST의 특징1) Uniform (유니폼 인터페이스) : HTTP 표준에만 따른다면, 안드로이드/IOS 플랫폼이든, 특정 언어나 기술에 종속되지 않고 모든 플랫폼에 사용이 가능하며, URI로 지정한 리소스에 대한 조작이 가능한 아키텍처 스타일을 의미한다.
2) Stateless (무상태성) : HTTP는 Stateless Protocol 이므로, REST 역시 무상태성을 갖는다. 즉, HttpSession과 같은 컨텍스트 저장소에 상태정보를 따로 저장하고 관리하지 않고, API 서버는 들어오는 요청만을 단순 처리하면 된다. 세션과 같은 컨텍스트 정보를 신경쓸 필요가 없어 구현이 단순해진다.
3) Cacheable (캐시가능) : HTTP 기존의 웹 표준을 그대로 사용하므로, 웹에서 사용하는 기존의 인프라를 그대로 활용 가능하다. HTTP 프로토콜 기반의 로드밸런서(mod_proxy)나, SSL은 물론이고 HTTP가 가진 가장 강력한 특징 중의 하나인 캐싱 기능을 적용할 수 있다. 일반적인 서비스에서 조회 기능이 주로 사용됨을 감안하면, HTTP 리소스들을 웹 캐쉬 서버 등에 캐싱하는 것은 용량이나 성능 면에서 이점이 있다. 캐싱 구현은 HTTP 프로토콜 표준에서 사용하는 Last-Modified 태그나 E-Tag를 이용하면 가능하다.

캐시란 무엇인가?(펼치기)

 
E-Tag : 메시지에 담겨있는 엔터티를 위한 엔터티 태그를 제공한다. 이를 활용하여 리소스를 식별할 수 있다.
Last-Modified : 엔터티가 마지막으로 변경된 시각에 대한 정보를 제공한다. (파일인 경우 파일 시스템이 제공해 준 최근 변경 시각, 동적으로 생성된 리소스라면 응답이 만들어진 시간)

4) Self-descriptiveness (자체 표현 구조) : 동사(Method) + 명사(URI) 로 이루어져있어 어떤 메서드에 무슨 행위를 하는지 알 수 있으며, 메시지 포맷 역시 JSON을 이용해서 직관적으로 이해가 가능한 구조로, REST API 메시지만 보고도 이를 쉽게 이해할 수 있다. 5) Client – Server 구조 : REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보 등)을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 된다.
6) 계층형 구조 : API 서버는 순수 비지니스 로직을 수행하고, 그 앞단에 사용자 인증, 암호화(ssl), 로드밸런싱 등을 하는 계층을 추가하여 구조상의 유연상을 둘 수 있다. 이는 간단하게는 HA Proxy나 Apache의 Reverse Proxy를 통해, 더 나아가서는 API gateway 등을 활용하여 Micro Service Architecture로도 구현이 가능하게 한다.


REST 요소를 파악하는데는 Richardson Maturity Model(RMM)을 기준으로 이해하는 것이 좋은 것 같다.


레벨0

웹의 기본 메커니즘을 전혀 사용하지 않는 단계로, HTTP를 통해 데이터를 주고받지만 모든 데이터 요청 및 응답과 관련한 정보를 HTTP의 body 정보를 활용한다.

POST /appointmentService HTTP/1.1

[various other headers]

<openSlotRequest date = "2010-01-04" doctor = "mjones"/>

POX(Plain Old XML)로 요청과 응답을 주고받는 RPC 스타일 시스템이다. 이 때 HTTP method는 POST만 사용하며, 특정 서비스를 위해 클라이언트에서 접근할 endpoint는 하나이다.


레벨 1 – 리소스

RMM에서 REST를 위한 첫 단계는 리소스를 도입하는 것이다. 그래서 이제는 모든 요청을 단일 서비스 endpoint로 보내는 것이 아니라, 개별 리소스와 통신한다.

POST /doctors/mjones HTTP/1.1

[various other headers]

<openSlotRequest date = "2010-01-04"/>

즉, 함수를 호출하고 인자들을 넘기는 것이 아니라 다른 정보를 위해 인자들을 제공하는 특정 리소스로 요청을 보낸다. 이럴 경우의 이점은 자원이 외부에 보여지는 방식과 내부에 저장되는 방식을 분리 할 수 있다는 것이다. 예를 들면 클라이언트 단에서 완전히 다른 포맷으로 저장하더라도 JSON 형태의 데이터를 요청할 수 있다.


레벨 2 – HTTP Method

레벨 1의 URL + HTTP Merhod 조합으로 리소스를 구분하는 것으로 응답 상태를 HTTP Status code 를 활용한다. 현재 가장 많은 Restful API가 이 단계를 제공한다.

GET /doctors/mjones/slots?date=20100104&status=open HTTP/1.1

Host: royalhope.nhs.uk

발생한 에러의 종류를 커뮤니케이션하기 위해 상태코드(status code)를 사용하는 것, 그리고 안전한 오퍼레이션(GET 등)과 안전하지 않은 오퍼레이션 간의 강한 분리를 제공하는 것이 레벨 2의 핵심 요소이다. 우선, Status Code를 사용한다는 것은 어떤 의미일까?기존에는 유저 생성 요청을 했을 경우 302 등의 리다이렉트 요청을 서버에서 내려주는 방식이었다면,지금은 201(created)로 유저 생성 성공을 알릴 뿐 페이지 이동은 Client 단에서 해결하는 방식이다.(login의 경우 성공은 200, 실패시 인증실패는 401, 성공했으나 권한 문제시엔 403 등)즉, 서버는 순수하게 api로서의 기능만을 제공하게 된다.(view는 Client에서..)

두번째로, 강한 분리를 제공하는 것이 어떤 이점이 있는 것일까?

HTTP에서 GET은 멱등방식으로 자원을 추출하는데, 이에 어떤 순서로든, 얼마든지 호출하든 매번 같은 결과를 얻도록 한다. 이에 통신상의 모든 참여자에게 ‘캐싱’기능을 지원하는 다양한 방법을 제공한다.


레벨 3 – 하이퍼미디어 컨트롤

HATEOAS(Hypertext As The Engine Of Application State) 애플리케이션 상태 엔진으로서의 하이퍼미디어 ㅡㅡ..

하이퍼미디어란 하나의 컨텐츠가 텍스트나 이미지, 사운드와 같은 다양한 포멧의 컨텐츠를 링크하는 개념이다. 이것은 관련 컨텐츠를 보기위해 링크를 따라가는 방식과 유사한 방식으로 동작하는데, 클라이언트가 다른 자원에 대한 링크를 통해 서버와 (잠재적으로 상태 변이를 초래하는) 상호작용을 한다.

즉, 특정 API를 요청한 후 다음 단계로 할 수 있는 작업을 알려주는 것이며, 다음 단계의 작업을 위한 리소스의 URI를 알려주는 것이다. 이 단계를 적용하면 클라이언트에 영향을 미치지 않으면서 서버를 변경하는 것이 가능하다.

GET /doctors/mjones/slots?date=20100104&status=open HTTP/1.1

Host: royalhope.nhs.uk
HTTP/1.1 200 OK
[various headers]
<openSlotList>

 <slot id = "1234" doctor = "mjones" start = "1400" end = "1450">
            <link rel = "/linkrels/slot/book"
            uri = "/slots/1234"/>
 </slot>
 <slot id = "5678" doctor = "mjones" start = "1600" end = "1650">
            <link rel = "/linkrels/slot/book"
            uri = "/slots/5678"/>
 </slot>
</openSlotList>

단점은, 클라이언트가 수행할 작업을 찾기 위해 링크를 따라기기 때문에 컨트롤 탐색에 꽤 많은 호출이 발생할 수 있다는 것이다. 또한 복잡성이 증가할 수 있으며, HTTP 요청상에 나타나는 부하로 낮은 지연시간이 요구될 때 문제가 될 수 있다. HTTP 기반의 REST 페이로드는 JSON 또는 바이너리 등의 포맷을 지원하므로 실제로 SOAP 보다 훨씬 간결할 수 있지만 쓰리프트와 같은 바이너리 프로토콜에는 상대가 되지 못한다. 또한 웹소켓의 경우 HTTP 초기 핸드셰이크 후에 클라이언트와 서버 간에 TCP 접속이 이루어지고 브라우저에서 스트림 데이터를 보낼 때 효율적일 수 있다. 따라서 HTTP가 대규모 트래픽에는 적합할 수 있지만 TCP 또는 다른 네트워킹 기술 기반의 프토토콜과 비교하면 낮은 지연시간이 필요한 통신에는 그다지 좋은 선택이 아닐 수 있다.

이러한 단점에도 HTTP 기반의 REST는 서비스 대 서비스의 상호작용을 위해 합리적이고 기본적인 선택이다.


RMM을 통한 REST 핵심 요소

1) resouce (레벨 1의 고민) : 애플리케이션에서 제공하는 resouce를 어떻게 분할하고 통합할 것인가?

2) http method, status code (레벨 2의 고민) : 에러 상황에 대한 적절한 처리와 method 도입을 통한 불필요한 다양성(복잡성) 제거

3) hypermedia (레벨 3의 고민) : API가 스스로 문서화 가능하도록 지원할 것인가?


RESTful API 설계

1. URI는 정보의 자원을 표현해야 한다.(리소스명은 동사보다는 명사를 사용)

2. 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)으로 표현


URI 설계시 주의할 점

1. 슬래시 구분자(/)는 계층 관계를 나타내는데 사용

2. URI 마지막 문자로 슬래시(/)를 포함하지 않는다.

3. 하이픈(-)은 URI 가독성을 높이는데 사용

4. 밑줄(_)은 URI에 사용하지 않는다.

5. URI 경로에는 소문자가 적합하다.

6. 파일확장자는 URI에 포함하지 않는다.


Todo 기능을 구현한다고 가정했을 때의 Restful API 표준

 
endpoint 기능
GET /todos List all todos
POST /todos Create a new todo
GET /todos/:id Get a todo
PUT /todos/:id Update a todo
DELETE /todos/:id Delete a todo and its items
GET /todos/:id/items Get a todo item
PUT /todos/:id/items Update a todo item
DELETE /todos/:id/items Delete a todo item

(추가적으로) Spring Data Rest (흥미로운 부분이다. 학습 후 내용을 추가할 계획이다)

1. Richardson Maturity Model(RMM)의 레벨 3에 해당하는 hypermedia-driven HTTP resources를 제공하는 프레임워크

2. Spring Data Rest을 사용하지 않더라도 Spring Data Rest가 지원하는 HTTP method, Status Code, 기본 CRUD 자원,association resource, search resource, paging과 sorting에 따른 설계 방식을 학습하는 것도 좋은 설계 전략이다.


(추가적으로) 현재 통합 테스트도구로 postman을 사용중인데, 자동화된 테스팅 도구들을 좀 더 학습할 계획이다. 그리고 Backend의 경우 api만을 제공하나, 모바일은 특성상 다양한 버젼을 관리해야 하며, 웹은 최신기능을 업데이트 하지 않아도 사용하게 되어 코드 관리하기가 쉽다.(물론 웹도 글로벌 환경, CDN 배포 시간차 등을 고려하면 2가지 정도의 버전을 관리해야 한다.) 이 경우 REST를 지키면서 하는 DB 리팩토링은 매우 어렵다. 이 부분도 학습할 계획이다. (관련 책: 리팩토링 데이터베이스)

REST API란 무엇인가 #1 – 개념
Web Server

REST API란 무엇인가 #1 – 개념

REST API란 무엇인가 #1 – 개념

Click the link to see the article: 

조대협 님께서 블로그에 개제 해주신 내용을 보고 정리하였습니다. 

출처 : http://bcho.tistory.com/953

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

● API의 본질은 무엇인가 -> Decoupling, 탈 동조화

● 그렇다면 Web API의 본질은 무엇인가 -> Decoupling + Platform Agnostic

※ Platform Agnostic 이란? 

   플랫폼에 종속적이 않음을 뜻한다. 즉, 특정 기기나 OS에서만 돌아가는 것이 아닌 광범위하게 사용될 수 있는 것.

   ex) 데이터 파일(텍스트파일, 그래픽 파일, 음원파일)은 윈도우든 OS X 든 안드로인드든 어디에서도 잘 돌아가니까.

● REST의 역사

웹(HTTP)의 창시자 중의 한사람인 Roy Fielding의 2000년 논문에서 소개.

” 현재 아키텍쳐가 웹의 본래 설계의 우수성을 많이 사용하지 못하고 있다고 판단했기 때문에, 

웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍처를 소개한 것이 Representational state transfer(REST) 이다.

● REST의 기본

REST의 요소는 크게 리소스 // 메서드 // 메세지로 구성.

예로 “이름이 Terry인 사용자를 생성한다” 라는 호출이 있다면, “사용자”는 생성되는 리소스, “생성한다”라는 행위는 메서드

그리고 “이름이 Terry인 사용자”는 메시지가 된다.

이를 REST의 형태로 표현한다면, 

HTTP POST, http://myweb/users/

{

“users”:{

“name”:”terry”

}

}

 

와 같은 형태로 표현.

“생성한다”라는 행위의 의미를 갖는 메서드는 HTTP Post 메서드가 되고, 

생성하고자 하는 대상이 되는 “사용자” 라는 리소스는 http://myweb/users 라는 형태의 URI로 표현이 되며,

생성하고자 하는 사용자의 디테일한 내용은 JSON 문서를 이용해서 표현된다.

● HTTP 메서드

REST에서는 앞의 언급과 같이, 행위에 대한 메서드를 “HTTP 메서드” 그대로 사용한다.

HTTP 에는 여러가지 메서드가 있지만 REST에서는 CRUD(Create Read Update Delete)에 해당하는 4가지 메서드만 사용한다.

메서드  의미  Idempotent 
POST Create No
GET Select Yes
PUT Update Yes
DELETE Delete Yes

각각 POST, GET, PUT, DELETE는 각각의 CRUD 메서드에 대응된다. 

여기에 Idempotent라는 분류를 추가하였는데, Idempotent는 여러번 수행을 해도 결과가 같은 경우를 의미한다.

예를 들어 a++은 Idempotent 하지 않다고 하지만(호출시 마다 a값이 증가 되기 때문), 

a=4와 같은 명령은 반복적으로 수행해도 Idempotent하다고 한다.(a=4는 값이 고정된 명령이기 때문)

POST 메서드의 경우에는 리소스를 추가하는 연산이기 때문에 idempotent 하지 않지만 

나머지 GET, PUT, DELETE 메서드는 반복 수행해도 Idempotent 하다.

따라서 GET의 경우 게시물의 조회수 카운트를 늘려준다던가 하는 기능을 같이 수행했을 때는 

Idempotent 하지 않은 메서드로 정의해야 한다.

※ Idempotent의 개념을 설명한 이유는 REST는 각 개별 API를 상태 없이 수행하게 됩니다. 

   따라서 해당 REST API를 다른 API와 함께 호출하다가 실패하였을 경우, 트렌젝션 복구를 위해서 다시 실행해야 하는 경우가 있는데, 

   Idempotent 하지 않은 메서드들의 경우는 기존 상태를 저장 했다가 다시 복원해줘야하는 문제가 있지만, Idempotent한 메서드의 경우에는 

   반복적으로 다시 메서드를 수행해주면 됩니다.

   예를 들어 게시물 조회를 하는 API가 있을때, 조회시 마다 조회수를 올리는 연산을 수행한다면 이 메서드는 Idempotent 하다고 볼 수 없고, 

   조회하다가 실패하였을 때는 올라간 조회수를 다시 -1 만큼 빼줘야 합니다. 

   즉 Idempotent 하지 않은 메서드에 대해서는 트렌젝션에 대한 처리에 특히 주의가 필요합니다.

 

● REST의 리소스

REST는 리소스 지향 아키텍쳐 스타일이라는 정의 답게 모든 것을 리소스, 즉 명사로 표현을 하며 각 세부 리소스에는 ID를 붙인다.

사용자라는 리소스 타입을 http://myweb/users 라고 정의 했다면, terry라는 id를 갖는 리소스는

http://myweb/users/terry 라는 형태로 정의한다.

REST의 리소스가 명사의 형태를 띄우다 보니, 명령(Operation)성의 API를 정의하는 것에서 혼동이 올 수 있다.

예를 들어 “Push 메시지를 보낸다”는 보통 기존의 RPC(Remote Procedure Call)나 함수성 접근에서는 

/myweb/sendpush 형태로 잘못 정의가 될 수 있지만, 이러한 동사형을 명사형으로 바꿔서 적용해보면

리소스 형태로 표현하기가 조금 더 수월해 진다.

“Push 메시지 요청을 생성한다.”라는 형태로 정의를 변경하면, API 포맷은 POST/myweb/push 형태와 같이

명사형으로 정의가 될 수 있다. 

물론 모든 형태의 명령이 이런 형태로 정의가 가능한 것은 아니지만, 되도록이면 리소스 기반의 명사 형태로

정의를 하는게 REST 형태의 디자인이 된다.

☞ REST API의 간단한 예제

사용자 생성

다음은 http://myweb/users 라는 리소스를 이름은 terry, 주소는 seoul 이라는 내용(메시지)으로 HTTP POTS를 이용해서

생성하는 정의이다.

           HTTP POST, http://myweb/users/

          {

          “name”:”terry”
          “addreses”:”seoul”

          } 

– 조회 –
 
다음은 생성된 리소스중에서 http://myweb/users 라는 사용자 리소스 중에 id가 terry인 사용자 정보를 조회해오는 방식이다.
조회이기 때문에 HTTP GET을 사용한다.
 

           HTTP GET, http://myweb/users/terry
– 업데이트 –
 
다음은 http://myweb/users 라는 사용자 리소스중에, id가 terry인 사용자 정보에 대해서, 주소를 “suwon”으로 수정하는 방식이다.
수정은 HTTP PUT 메서드를 사용한다.
HTTP PUT, http://mtweb/users/terry
{
“name”:”terry”
“address”:”suwon”
}
 
– 삭제 –
 
마지막으로 http://myweb/user 라는 사용자 리소스 중에, id가 terry인 사용자 정보를 삭제하는 방법이다.
 

            HTTP DELETE, http://myweb/users/terry

            API의 정의를 보면 상당히 간단하다. 단순하게 리소스를 URI로 정해준 후에, 거기에 HTTP 메서드를 이용해서 

CRUD를 구현하고 메시지를 JSON으로 표현하여 HTTP Body에 실어 보내면 된다. POST URI에 리소스 id가 없다는
것을 빼면 크게 신경쓸 부분이 없다.
 
 
 

● REST의 특성

◎ 유니폼 인터페이스(Uniform Interface)

REST는 HTTP 표준에만 따른다면, 어떠한 기술이라던지 사용이 가능한 인터페이스 스타일이다. 

예를 들어 HTTP + JSON으로 REST API를 정의했다면, 안드로이드 플랫폼이건, IOS 플랫폼이건, 

또는 C나 Java / Python 이건 특정 언어나 기술에 종속 받지 않고 HTTP와 JSON을 사용할 수 있는

모든 플랫폼에 사용이 가능한 느슨한 결합(Loosely Coupling) 형태의 구조이다.

※ 흔히들 근래에 REST를 이야기하면, HTTP + JSON을 쉽게 떠올리는데, JSON은 하나의 옵션일뿐, 메시지 포맷을 

   꼭 JSON으로 적용해야할 필요는 없다. 자바스크립트가 유행하기전에만 해도 XML 형태를 많이 사용했으며, 근래에

   들어서 사용의 편리성 때문에 JSON을 많이 사용하고 있지만, XML을 사용할 경우, XPath, XSL 등 다양한 XML 프레임웍을

   사용할 수 있을뿐만 아니라 메시지 구조를 명시적으로 정의할 수 있는 XML Scheme나 DTD등을 사용할 수 있기 때문에,

   복잡도는 올라가더라도, 메시지 정의의 명확성을 더할 수 있다.

 

◎ 무상태성/스테이트리스(Stateless)

 
REST는 Representational State Transfer의 약어로 Stateless(상태를 유지하지 않음)이 특징 중의 하나이다.
 
상태가 있다, 없다의 의미는 사용자나 클라이언트의 컨택스트를 서버쪽에 유지 하지 않는다는 의미로,
쉽게 표현하면 HTTP Session과 같은 컨텍스트 저장소에 상태 정보를 저장하지 않는 형태를 의미한다.
 
상태 정보를 저장하지 않으면 각 API 서버는 들어오는 요청만을 들어오는 메시지로만 처리하면 되며, 
 
세션과 같은 컨텍스트 정보를 신경쓸 필요가 없기 떄문에 구현이 단순해 진다.
 
 

◎ 캐싱 가능(Cacheable)

REST의 큰 특징 중의 하나는 HTTP라는 기존의 웹 표준을 그대로 사용하기 때문에, 

웹에서 사용하는 기존의 인프라를 그대로 활용이 가능하다.

HTTP 프로토콜 기반의 로드 밸러서나 SSL은 물론이고, HTTP가 가진 가장 강력한 특징중에 하나인 

캐싱 기능을 적용할 수 있다. 일반적인 서비스 시스템에서 60%에서 많게는 80% 가량의 트랜잭션이 Select와 같은 

조회성 트랜잭션인 것을 감안하면, HTTP의 리소스들을 웹캐시 서버등에 캐싱하는 것은 

용량이나 성능 면에서 많은 장점을 가지고 올 수 있다. 구현은 HTTP 프로토콜 표준에서 사용하는

“Last-Modified” 태그나 E-Tag를 이용하면 캐싱을 구현할 수 있다.

아래와 같이 Client가 HTTP GET을 “Last-Modified” 값과 함께 보냈을 때, 컨텐츠가 변화가 없으면 REST 컴포넌트는

“304 Not Modified”를 리턴하면 Client는 자체 캐쉬에 저장된 값을 사용하게 된다.

그림 1. Last-Modified 필드를 이용한 캐싱 처리 방식

이렇게 캐시를 사용하게 되면 네트워크 응답시간 뿐만 아니라, REST 컴포넌트가 위치한 서버에 트랜잭션을 

발생시키지 않기 때문에, 전체 응답시간과 성능 그리고 서버의 자원 사용률을 비약적으로 향상시킬 수 있다.

◎ 자체 표현 구조(Self-descriptiveness)

REST의 가장 큰 특징 중의 하나는 REST API 자체가 매우 쉬워서 API 메시지 자체만 보고도 API를 이해할 수 있는 

Self-descriptiveness 구조를 갖는 다는 것이다. 리소스와 메서드를 이용해서 어떤 메서드에 무슨 행위를 하는지를 알 수 있으며,

또한 메시지 포맷 역시 JSON을 이용해서 직관적으로 이해가 가능한 구조이다.

대부분의 REST 기반의 OPEN API 들이 API 문서를 별도로 제공하고 있지만, 디자인 사상은 최소한의 문서의 도움만으로도 

API 자체를 이해할 수 있어야 한다.

◎ 클라이언트 서버 구조(Client-Server 구조)

근래에 들면서 재 정립되고 있는 특징 중의 하나는 REST가 클라이언트 서버 구조라는 것이다.

REST 서버는 API를 제공하고, 제공된 API를 이용해서 비즈니스 로직 처리 및 저장을 책임진다.

클라이언트의 경우 사용자 인증이나 컨택스트(세션, 로그인 정보)등을 직접 관리하고 책임 지는 구조로 역할이 나뉘어 지고 있다.

이렇게 역할이 각각 확실하게 구분되면서, 개발 관점에서 클라이언트와 서버에서 개발해야 할 내용들이 명확하게 되고 

서로의 개발에 있어서 의존성이 줄어들게 된다.

◎ 계층형 구조(Layered System)

계층형 아키텍쳐 구조 역시 근래에 들어서 주목받기 시작하는 구조인데, 클라이언트 입장에서는 REST API 서버만 호출한다.

그러나 서버는 다중 계층으로 구성될 수 있다. 순수 비즈니스 로직을 수행하는 API 서버와 그 앞단에 사용자 인증(Authentication),

암호화(SSL), 로드밸런싱 등을 하는 계층을 추가해서 구조상의 유연성을 둘 수 있는데, 

이는 근래에 들어서 앞에서 언급한 마이크로 서비스 아키텍쳐의 API Gateway나 간단한 기능의 경우에는 HA Proxy나

Apache와 같은 Reverse Proxy를 이용해서 구현하는 경우가 많다.

● REST 안티 패턴

REST 디자인시 하지 말아야 할 안티 패턴에 대한 내용이다.

◎ GET/POST를 이용한 터널링

가장 나쁜 디자인 중 하나가 GET이나 POST를 이용한 터널링이다.

http://myweb/users?method=update&id=terry 이 경우가 전형적인 GET을 이용한 터널링이다.

메서드의 실제 동작은 리소르르 업데이트 하는 내용인데, HTTP PUT을 사용하지 않고, 

GET에 쿼리 파라미터로 method=update라고 넘겨서, 이 메서드가 수정 메서드임을 명시했다.

대단히 안좋은 디자인인데, HTTP 메서드 사상을 따르지 않았기 때문에, REST라고 부를 수 도 없고,

또한 웹 캐시 인프라 등도 사용이 불가능하다.

또 많이 사용하는 안좋은 예는 POST를 이용한 터널링이다. Insert(Create)성 오퍼레이션이 아닌데도 불구하고,

JSON 바디에 오퍼레이션 명을 넘기는 형태인데 예를 들어 사용자 정보를 가지고 오는 API를 아래와 같이 

POST를 이용해서 만든 경우이다. 

HTTP POST, http://myweb/users/
{

“getuser”:{

“id”:”terry”,

}

}

◎ Self-descriptiveness 속성을 사용하지 않음

앞서 특징에서 설명한 바와 같이 REST의 특성 중 하나는 자기 서술성(Self-descriptiveness) 속성으로 REST URI와

메서드 그리고 쉽게 정의된 메시지 포맷에 의해서 쉽게 API를 이해할 수 있는 기능이 되어야 한다.

특히나 자기 서술성을 깨먹는 대표적인 사례가 위에서 언급한 GET이나 POST를 이용한 터널링을 이용한 구조가 된다.

 
 

◎ HTTP Response code를 사용하지 않음

다음으로 많이 하는 실수 중의 하나가 HTTP Response code를 충실하게 따르지 않고, 성공은 200, 실패는 500과 같이 

1~2개의 HTTP Response code만을 사용하는 경우이다. 심한 경우에는 에러도 HTTP Response code 200으로 정의한 후

별도의 에러 메시지를 200 response code와 함께 보내는 경우인데, 이는 REST 디자인 사상에도 어긋남은 물론이고

자기 서술성에도 어긋난다.

12 Online Free Tools to Scan Website Security Vulnerabilities & Malware
Web Server

12 Online Free Tools to Scan Website Security Vulnerabilities & Malware

12 Online Free Tools to Scan Website Security Vulnerabilities & Malware

Click to the link to go to the site:

=====

Scan Your WebSite, Blog for Security Vulnerabilities, Malware, Trojans, Viruses and online threats

One of the most trending talks in Information Technologies is Web Security. Do you know 96% of tested applications have vulnerabilities

Below chart from Cenzic shows different types of the vulnerability trend found.

We often pay attention to website design, SEO, contents and underestimate the security area. As a website, blog owner web security should have higher importance than anything.

There were many questions how to scan for website security, mobile app vulnerabilities so here you go. In this article, I will list out free tools to scan your site for security vulnerabilities, malware.

If found vulnerable, then you can always protect your website with Web Application Firewall from cloud-based security provider like SUCURI.

1Scan My Server

ScanMyServer provides one of the most comprehensive reports of varieties of security test like SQL Injection, Cross Site Scripting, PHP Code Injection, Source Disclosure, HTTP Header Injection, Blind SQL Injection and much more.

Scan report is notified by email with vulnerability summary.

2SUCURI

SUCURI is the most popular free website malware and security scanner. You can do a quick test for Malware, Website blacklisting, Injected SPAM and Defacements.

SUCURI also clean and protect your website from online threats and works on any website platforms including WordPress, Joomla, Magento, Drupal, phpBB, etc.

3Qualys SSL Labs, Qualys FreeScan

SSL Labs is one of most used tools to scan SSL web server. It provides in-depth analysis of your https URL including expiry day, overall rating, Cipher, SSL/TLS version, Handshake simulation, Protocol details, BEAST and much more.

If you are running a secure (https) website, you shouldn’t wait anymore to do a quick test.

qualys-server-test

FreeScan test website for OWASP Top Risks and malware, against SCP security benchmark and much more.  You need to register a free account to perform this scan.

Refer to my another post to find out SSL/TLS specific vulnerabilities.

4Quttera

Quttera check website for malware and vulnerabilities exploits.

quettera

It scans your website for malicious files, suspicious files, potentially suspicious files, phishTank, Safe Browsing (Google, Yandex) and Malware domain list.

5Detectify

Detectify is a SaaS-based website security scanner. This got 100+ automated security tests including OWASP Top 10, malware and much more.

Detectify provider 21-day free trial and you must register to perform security scan against your website.

6SiteGuarding

SiteGuarding helps you to scan your domain for malware, website blacklisting, injected spam, defacement and much more.

The scanner is compatible with WordPress, Joomla, Drupal, Magento, osCommerce, Bulletin and another platform.

site-guarding

SiteGuarding also helps you to remove malware from your website so if you are website is affected by viruses, they will be useful.

7Web Inspector

Web Inspector scans your site and provides thread report including Blacklist, Phishing, Malware, Worms, Backdoors, Trojans, Suspicious frames, Suspicious connections.

So, go ahead and run a scan to find out whether it is malicious or not.

web-inspector

8Acunetix

Acunetix analyzes complete website for more than 500 vulnerabilities including DNS and network infrastructure from Acunetix servers.

They provide free 14 days trial, and you can register and validate your domain as explained here before the security scan.

9Asafa Web

AsafaWeb offers quick scan results of Tracing, Custom errors, Stack trace, Hash DoS Patch, EMLAH log, HTTP Only Cookies, Secure Cookies, Clickjacking and much more.

asafaweb

10Netsparker Cloud

Netsparker Cloud is an enterprise web application security scanner which scans for more than 25 critical vulnerabilities. Netsparker is free for open source project else you can request for the trial to run the scan.

You may refer my step-by-step guide on how to register for an account and perform the scan.

11UpGuard Web Scan

UpGuard Web Scan is external risk assessment tool uses the publicly available information to grade on various factors including SSL, Clickjack attack, Cookie, DNSSEC, Headers,  etc. It’s still in beta but worth trying out.

upguard

12Tinfoil Security

Tinfoil security first audits your website against top 10 OWASP vulnerabilities and then other known security holes. You get an actionable report and an option to re-scan once you are done with necessary fixes.

Entire setup will take around 5 minutes, and you can scan even if your website is protected or behind single sign-on.

tinfoil-security

One of the essentials for security is to monitor them, so you get notified whenever it’s down or hacked.

While above tools help you to scan your website on-demand you may also wish to schedule them for an automatic security scan.

I hope above list helps you to perform security scanning against your website.

Bitrise로 안드로이드 배포 자동화하기 1) Bitrise + Integrations
Web Server

Bitrise로 안드로이드 배포 자동화하기 1) Bitrise + Integrations

Bitrise로 안드로이드 배포 자동화하기

 

Bitrise

Bitrise를 처음 접한 곳은 Droid Knights 17의 빠르고 지속적으로 전달하기-남상균님 세션을 통해서였다. 나도 처음 CI라는 개념을 접한 뒤 Jenkins를 이용한 자동화를 시도했었다. AWS EC2 위에 Jenkins를 올리고, Redmine연동도 해보고, 처음엔 커밋만 하면 자동으로 빌드부터 배포까지 된다는게 너무 신기하고 재밌어서 시간이 가는줄 모르고 세팅을 했다. 그러던 어느날 Jenkins에 쏟는 시간이 너무 많다는 생각이 들었다. 세팅 자체가 복잡하기도 하거니와 앱의 Android SDK 버전을 번경했을 때 등등 계속해서 유지보수해야할 일이 생겨서 때로는 그냥 수동빌드가 더 편하고 빠르다고 느낄 때가 많았다. 그렇게 점점 Jenkins를 관리하지 않게되고 결국 수동빌드로 돌아왔다. 그리고 한참 뒤 Circle CI라는 툴을 많이 쓴다길래 Circle CI를 시도해보려다가 마침 Bitrise를 접하게됐고 그때부터 지금까지 매우 만족하면서 사용하고있다.

CI / CD

maxresdefault
간단하게 말해서 Continuous Integration은 앱의 코드가 변경되었을 때 자동으로 유니테스트를 수행하고 새로운 빌드를 만드는 것까지 담당한다. Continuous Delivery는 내가 느끼기엔 조금 애매한 부분이 있지만 테스트와 배포가 가능하도록 APK파일을 만들어서 다른 팀원들에게 전달하는 것까지를 담당하는것 같다. Continuous Deployment는 Google Play에 배포하는 것까지를 담당한다.

Bitrise의 장점

  1. 서비스 형태로 제공
    Jenkins처럼 내 서버에 직접 설치하는게 아니라 서비스 형태로 제공되기 때문에 가입만 하면 바로 사용할 수 있다.
  2. 직관적인 UI
    가장 큰 장점이다. 비슷한 서비스인(인기도 더 많은) Circle CI는 circle.yml파일을 통해서 빌드세팅을 하는데 처음 circle.yml 파일을 마주하면 ‘이 좋은 툴을 쓰려면 또 공부를 해야겠구나’라는 생각이 든다. bitrise도 bitrise.yml파일을 통해 세팅을 하지만 직접 파일을 다루지 않고 블록을 조립하듯 모듈들을 끼워넣으면 자동으로 bitrise.yml 파일이 수정되는 직관적인 UI를 가지고있다.
  3. 서드파티 연동
    매우 많은 다른서비스들과 연동이 된다. 역시 모듈 형태로 필요한 곳에 끼워넣기만 하면 되기 때문에 연동이 매우 쉽다. 제공되는 모듈들
    이 외에도 무료로 사용할 수 있는 빌드타임과 횟수도 지금 수준에서는 만족하고있고 github와의 연동이 매우 잘 되어있다는 점도 좋다.
젠킨스란 무엇인가, CI(Continuous Integration) 서버의 이해
Web Server

젠킨스란 무엇인가, CI(Continuous Integration) 서버의 이해

젠킨스란 무엇인가, CI(Continuous Integration) 서버의 이해

Martin Heller | InfoWorld
젠킨스(Jenkins)는 거의 모든 언어의 조합과 소스코드 리포지토리(Repository)에 대한 지속적인 통합과 지속적인 전달 환경을 구축하기 위한 간단한 방법을 제공한다.


Credit: Getty Images Bank

젠킨스는 다른 일상적인 개발 작업을 자동화할 뿐 아니라 파이프라인(Pipeline)을 사용해 거의 모든 언어의 조합과 소스코드 리포지토리에 대한 지속적인 통합과 지속적인 전달 환경을 구축하기 위한 간단한 방법을 제공한다.

젠킨스가 각각의 단계에 대한 스크립트 작성의 필요성을 없애주지는 않지만, 사용자가 쉽게 구축할 수 있는 것보다 더 빠르고 더 강력하게 빌드(Build), 테스트, 그리고 배포(deployment) 도구 등 체인 전체를 통합할 수 있는 방법을 제공해 준다.

“나이틀리 빌드(Nightly Build)를 망가뜨리지 말라!”는 말은 매일 아침 테스터들을 위해 새로 빌드된 일일 제품 버전을 게시하는 소프트웨어 개발 조직의 기본 규칙이다. 젠킨스가 나오기 전에는, 나이틀리 빌드를 망가뜨리지 않기 위해 개발자가 할 수 있는 최선의 작업은 코드를 커밋(Commit)하기 전에 로컬 머신 상에서 조심스럽고 성공적으로 빌드해 테스트하는 것이었다. 하지만, 이는 다른 모든 사람들의 일일 커밋 없이, 혼자서 누군가의 변경사항을 테스트하는 것을 의미했다.

젠킨스, 원래는 허드슨(Hudson)은 이런 제한에 대한 직접적인 대응이었다.

허드슨과 젠킨스
2004년에 코스케 가와구치는 썬(Sun Microsystems)의 자바 개발자였다. 가와구치는 개발 작업에서 빌드를 깨는 것에 질려서, 코드를 리포지토리에 커밋하기 전에 해당 코드의 동작 여부를 알 수 있는 방법을 찾고 싶었다. 그래서 가와구치는 자바에서 이를 가능케 하는 자동화 서버를 자바로 개발했고, 허드슨이라는 이름을 붙였다. 허드슨은 썬에서 유명해졌으며, 오픈소스로 다른 기업들에게 확산됐다.

2011년으로 접어들면서, (썬을 인수한) 오라클 그리고 독자적인 허드슨 오픈소스 커뮤니티 간의 분쟁으로 젠킨스란 새로운 이름을 달고 갈라지게 되었다. 두 분류 모두 존속했지만, 젠킨스가 훨씬 더 활동적이었다. 2014년에 가와구치는 젠킨스 기반의 지속적 배포(Continuous Delivery, CD) 제품을 공급하고 있는 클라우드비즈(CloudBees)의 CTO가 되었다.

젠킨스 자동화
오늘날 젠킨스는 온갖 종류의 개발 작업을 지원하기 위한 약 1,400가지의 플러그인을 가지고 있는 선두적인 오픈소스 자동화 서버다. 가와구치가 애초에 해결하려 했던 지속적인 통합과 지속적인 자바 코드 전달, 즉 프로젝트 빌드, 테스트 실행, 정적 코드 분석 시행, 그리고 배포 작업은 사람들이 젠킨스를 사용해 자동화하고 있는 여러 가지 프로세스들 가운데 한가지일 뿐이다. 이 1,400개의 플러그인은 5가지 영역을 포괄하고 있다(플랫폼, UI, 관리, 소스코드 관리, 그리고 가장 많이 사용되는 빌드 관리).

젠킨스 동작 방식
젠킨스는 주요 운영체제용 자바 8 WAR 아카이브와 설치 패키지, 홈브루(Homebrew) 패키지, 도커 이미지, 그리고 소스코드 형태로 사용할 수 있다. 소스코드는 대부분 자바이며, 몇 개의 그루브(Groovy), 루비(Ruby), 그리고 앤틀러(Another Tool For Language Recognition, ANTLR) 파일이 들어 있다.

젠킨스 WAR를 단독으로 또는 톰캣 같은 자바 애플리케이션 서버에서 서버렛(Serverlet)으로 실행할 수 있다. 둘 가운데 어느 경우든, 웹 사용자 인터페이스(UI)를 생성하며 REST API에 대한 호출을 받아들인다.

젠킨스 플러그인
설치되고 나면, 젠킨스는 사용자가 기본 플러그인 목록을 수용하거나 원하는 플러그인을 선택할 수 있게 해준다.


Credit: IDG

초기 플러그인 세트를 고른 다음에, 설치 버튼을 클릭하면 젠킨스가 선택한 플러그인들을 추가한다.


Credit: IDG

젠킨스 메인 화면은 현 빌드 큐(Build Queue)와 실행기(Executor) 상태를 표시하며, 신규 항목(작업: Job) 생성, 사용자 관리, 빌드 이력 보기, 젠킨스 관리, 사용자의 맞춤형 뷰 보기, 그리고 사용자의 인증서를 관리할 수 있는 링크를 제공한다.


Credit: IDG

신규 젠킨스 항목은 6가지 유형의 작업 + 항목 관리를 위한 폴더 중 아무 것이나 될 수 있다.


Credit: IDG

젠킨스 관리(Manage Jenkins) 페이지에서는 명령어 줄 인터페이스를 열기 위한 옵션을 포함해 18가지 일을 할 수 있다. 하지만, 본 기사에서는 대개 스크립트로 정의되는 개선된 워크플로우인 파이프라인을 살펴보기로 하자.


Credit: IDG

젠킨스 파이프라인
젠킨스를 구성했다면, 이제는 젠킨스가 빌드할 수 있는 몇 가지 프로젝트를 생성할 시점이다. 스크립트를 작성하기 위해 웹 UI를 사용할 수도 있지만, 현재 최고의 공부는 Jenkinsfile이란 이름의 파이프라인 스크립트를 생성해 그것을 리포지토리에 체크인 하는 것이다. 다음 스크린샷은 멀티브랜치(Multibranch) 파이프라인에 대한 구성 웹 양식을 보여준다.


Credit: IDG

그림에서 볼 수 있듯이, 필자의 기본 젠킨스 설치본에서 이런 종류의 파이프라인에 대한 브랜치 소스(Branch Source)는 깃허브(GitHub)를 포함해, 깃(Git) 또는 서브버전(Subversion)일 수 있다. 다른 종류의 리포지토리 또는 다른 온라인 리포지토리가 필요한 경우, 적절한 플러그인을 추가하고 젠킨스를 재부팅하기만 하면 된다. 필자도 시도해 봤지만, 목록에 있는 젠킨스 플러그인이 없는 SCM(Source Code Management System)은 생각해 볼 수도 없었다.

젠킨스 파이프라인은 선언적 또는 스크립트일 수 있다. 두 가지 가운데 더 간단한 선언적 파이프라인은 그루비 호환 구문을 사용하며, 원하는 경우, 코드 편집기를 올바른 방향으로 이끌기 위해 #!groovy로 파일을 시작할 수 있다. 선언적 파이프라인은 다음의 3단계 예제처럼, pipeline 블록으로 시작해, agent를 정의하고, 실행 가능한 steps를 포함하는 stages를 정의한다.

pipeline {
agent any

stages {
stage(‘Build’) {
steps {
echo ‘Building..’
}
}
stage(‘Test’) {
steps {
echo ‘Testing..’
}
}
stage(‘Deploy’) {
steps {
echo ‘Deploying….’
}
}
}
}

pipeline은 젠킨스 파이프라인 플러그인을 호출하기 위한 필수 외부 블록(Outer Block)이다. agent는 파이프라인을 실행하고 싶은 위치를 정의한다. any는 파이프라인이나 스테이지(stage)를 실행하기 위해 사용 가능한 어떤 에이전트(agent)도 사용할 수 있음을 나타낸다. 예를 들어 좀 더 구체적인 에이전트라면 다음과 같이 사용할 컨테이너를 선언할 것이다.

agent {
docker {
image ‘maven:3-alpine’
label ‘my-defined-label’
args ‘-v /tmp:/tmp’
}
}

stages에는 한 개 이상의 스테이지 지시어(Directive)가 들어있다. 앞의 예에서, 세 개의 스테이지는 Build, Test 그리고 Deploy이다.
steps가 실제 작업을 수행한다. 앞서 예에서 steps는 메시지만 표시했다. 더 유용한 빌드 스텝이라면 다음과 같을 것이다.

pipeline {
agent any

stages {
stage(‘Build’) {
steps {
sh ‘make’
archiveArtifacts artifacts: ‘**/target/*.jar’, fingerprint: true
}
}
}
}

이 예에서 우리는 셸(Shell)에서 make를 호출한 다음에, 생성된 JAR 파일을 젠킨스 아카이브로 아카이빙하고 있다.
post 세션은 파이프라인 실행 또는 스테이지 끝에 실행될 동작을 정의한다. 포스트 세션 안에서 여러 개의 포스트-조건 블록을 사용할 수 있다(alwayschangedfailuresuccessunstable, 그리고 aborted).
예를 들어, 다음의 젠킨스는 Test 스테이지 다음에 항상 Junit을 실행하지만, 파이프라인이 실패하는 경우에는 이메일만 보낸다.

pipeline {
agent any
stages {
stage(‘Test’) {
steps {
sh ‘make check’
}
}
}
post {
always {
junit ‘**/target/*.xml’
}
failure {
mail to: team@example.com, subject: ‘The Pipeline failed :(‘
}
}
}

지시어 파이프라인은 사용자가 파이프라인을 정의하기 위해 필요한 대부분의 것을 표현할 수 있으며, 그루비 기반 DSL인 스크립티드 파이프라인 구문보다 훨씬 더 배우기 쉽다. 실제로 스크립티드 파이프라인은 모든 특성을 갖춘 프로그래밍 환경이다.

선언적(Declarative) 파이프라인

pipeline {
agent { docker ‘node:6.3’ }
stages {
stage(‘build’) {
steps {
sh ‘npm ?version’
}
}
}
}

스크립티드(Scripted) 파이프라인

node(‘docker’) {
checkout scm
stage(‘Build’) {
docker.image(‘node:6.3’).inside {
sh ‘npm ?version’
}
}
}

젠킨스 GUI, 블루 오션
최신의 가장 멋진 젠킨스 UI를 원한다면, 블루 오션(Blue Ocean) 플러그인을 사용할 수 있으며, 이 UI는 그래픽 사용자 경험을 제공한다. 기존 젠킨스 설치본에 블루 오션을 추가하거나 젠킨스/블루 오션 도커 컨테이너를 실행할 수 있다. 블루 오션이 설치되면, 젠킨스 메인 메뉴에 추가 아이콘이 생길 것이다.


Credit: IDG

원하는 경우, 블루 오션을 직업 사용할 수 있다. 젠킨스 서버 상의 /blue 폴더에 들어있다. 블루 오션에서 파이프라인 생성은 평범한 젠킨스에 비해 좀 더 그래픽하다.


Credit: IDG

젠킨스 도커
앞서 언급했듯이, 젠킨스는 도커 이미지로도 배포되고 있다. 그 과정에 별다른 것은 없다. SCM 유형을 선택하고 나서, URL과 인증서를 제공한 다음에, 단일 리포지토리에서 파이프라인을 생성하거나 그룹 저장소(Organization)에 있는 모든 리포지토리를 스캔 한다. Jenkinsfile을 가지고 있는 모든 브랜치가 파이프라인을 갖게 될 것이다.


Credit: IDG

몇 개의 파이프라인을 실행하면, 블루 오션 플러그인이 위와 같이 파이프라인들의 상태를 표시할 것이다. 스테이지와 스텝을 보기 위해 각각의 파이프라인을 확대할 수 있다.


Credit: IDG

브랜치(맨 위)와 작업상황도 확대할 수 있다.


Credit: IDG


Credit: IDG

젠킨스를 사용하는 이유
우리가 사용하고 있는 파이프라인 플러그인은 일반적인 CICD(Continuous Integration/Continuous Delivery) 사용 사례를 지원하고 있으며, 아마도 이것이 가장 흔한 젠킨스 사용법일 것이다.

자바 프로젝트가 원래의 젠킨스 존재 이유였다. 우리는 이미 젠킨스가 메이븐(Maven)을 사용한 빌드작업을 지원한다는 것을 보았다. 앤트(Ant), 그래들(Gradle), J유닛(JUnit), 넥서스(Nexus), 그리고 아티팩토리(Artifactory)와도 동작한다.

안드로이드는 일종의 자바를 실행하고 있지만, 광범위한 안드로이드 기기 상에서 테스트하는 방법 문제를 제기하고 있다. 안드로이드 에뮬레이터 플러그인은 사용자가 정의하고 싶어하는 수만큼의 에뮬레이트 된 기기 상에서 빌드와 테스트를 할 수 있게 해준다. 구글 플레이 퍼블리셔(Publisher) 플러그인은 릴리즈를 위해 또는 실제 기기 상에서의 더 많은 테스트를 위해 구글 플레이의 알파 채널로 빌드를 보낼 수 있게 해준다.

필자는 파이프라인에 대한 에이전트로 도커 컨테이너를 지정하고 도커 컨테이너에서 젠킨스와 블루 오션을 실행한 예를 보여주었다. 도커 컨테이너는 젠킨스 환경에서 속도, 확장성, 그리고 일관성을 개선하는데 매우 유용하다.

젠킨스와 깃허브에는 2가지 중요한 용도가 있다. 한 가지는 빌드 통합으로, 깃허브 리포지토리에 커밋을 할 때마다 젠킨스를 작동시키기 위한 서비스 훅(Hook)을 포함할 수 있다. 두 번째는 오쓰(OAuth)를 통해 젠킨스에 대한 액세스를 제어하기 위해 깃허브 인증을 사용하는 것이다.

젠킨스는 자바 외에도 다수의 언어들을 지원한다. C/C++의 경우, 오류와 콘솔의 경고 메시지를 캡처하고, CMake를 사용해서 스크립트를 빌드하며, 단위 테스트를 실시하고, 정적 코드 분석을 수행할 수 있는 플러그인들이 있다. 젠킨스는 PHP 도구들과 다방면으로 통합된다.

가령, 싸이썬(Cython)을 사용하고 있거나, 설치를 위해 파이썬 휠(Wheel)을 생성하는 경우가 아닌 한 파이썬 코드는 빌드가 필요없지만, 젠킨스가 파이썬 테스트와 노즈2(Nose2), 파이테스트(Pytest) 같은 보고서 작성 도구 그리고 파이린트(Pylint) 같은 코드 품질 향상 도구와 통합된다는 것은 유용하다. 마찬가지로, 젠킨스는 레이크(Rake), 큐쿰버(Cucumber), 브레이크맨(Brakeman), 그리고 CI::리포터(Reporter) 같은 루비 도구들과도 통합된다.

젠킨스 대 뱀부(Bamboo)
사람들은 종종 CICD 서버용으로 젠킨스나 아틀라시안 뱀부 가운데 어떤 것을 사용하는 것이 더 나은지를 묻는다. 컨설턴트로서 필자의 답변은 “그때그때 달라요”다.

우선, 젠킨스는 무료 오픈소스이고, 뱀부는 상용 소프트웨어다. 젠킨스가 더 큰 커뮤니티와 더 많은 플러그인을 가지고 있다. 반면에, 뱀부 상용 라이선스에는 아틀라시안의 지원이 포함되어 있으며, 뱀부는 빗버킷(Bitbucket), 지라(Jira), 그리고 컨플루언스(Confluence) 같은 다른 아틀라시안의 제품들과 기본적으로 잘 통합되어 있다.

예전에는 뱀부를 온프레미스 환경뿐 아니라 클라우드 서비스로도 사용할 수 있었다. 2017년 1월자로 뱀부 클라우드는 더 이상 사용할 수 없게 되었다. 대신, 아틀라시안은 클라우드 기반 소프트웨어 개발용으로 빗버킷 파이프라인을 제공하고 있다. 뱀부 서버는 아직 온프레미스 설치용으로 사용할 수 있으며, 클라우드 기반 컨테이너나 VM에 호스팅할 수 있다. editor@itworld.co.kr

원문보기:
http://www.itworld.co.kr/news/107527#csidx59f5288ab53140899f394c912d965b2 

DevOps란 무엇이며, CI는 무엇인가?
Web Server

DevOps란 무엇이며, CI는 무엇인가?

DevOps에 대해서,

하나의 소프트웨어를 개발하기 위해서는 여러 명이 동시에 개발할 수 있는 환경도 필요하며, 수천명의 사용자를 상대로 내놓으려면 서버와 스토리지, 운영체제 등 뒷단에서 관리해줘야 하는 인프라 환경도 갖춰야 한다. 이러한 역할을 수행하는 것이 Ops의 역할이다. 개발자(Dev)는 고객에게 제공한 변경을 빠르게 보길 원하고 운영자(Ops)는 제공하는 서비스 또는 소프트웨어의 안정성에 더 관심을 두게 된다. 또한 개발자는 개발 생산성을 향상시킬 수 있는 새로운 프레임워크를 도입하고 싶어하지만 Ops는 안정성이 보장되지 않는다는 이유로 이를 꺼려한다.
서로 다른 목적을 갖고 다른 프로세스로 다른 도구를 사용하여 개발을 진행하는 것이다. 이런 차이점 때문에 Dev와 Ops간에 충돌이 발생한다. 이러한 배경에서 등장한 것이 DevOps이다. DevOps란 소프트웨어 개발자들과 IT종사자들 사이의 의사 소통, 협업, 융합을 강조한 소프트웨어 개발 방법론이며 소프트웨어 개발과 IT 운영간의 상호 의존관계에 대한 산물이다. 조직에서 DevOps의 역할은 소프트웨어 상품과 서비스를 신속히 생산하는 것에 도움이 되는 임무를 수행하게 된다. Dev와 Ops 간에 그 목적을 일치시키고 프로세스와 도구에 대한 접근을 공유하여 그 차이를 줄이는데 목적이 있다.
CI(Continuous Integration)란 무엇인가?
개발자가 각각 개발한 소스코드를 모아서 한꺼번에 빌드하는 통합 빌드의 과정을 특정 시점이 아니라 주기적으로 수행함으로써 통합에서 발생하는 오류를 사전에 해결하고 이러한 과정들에 소요되는 시간을 줄이기 위한 기법을 말한다. 더이상 빌드는 컴파일만을 의미하지 않는다. 소프트웨어가 거대해지고 복잡해지면서 팀 단위로 개발을 하게 되었고, 그 과정에 있어서 분업과 협업은 필수적이 되었다. 이 분업과 협업의 과정에서 소스 버전 관리 툴을 이용한 소스 코드의 Merge 과정은 까다롭게 되었고, 이 문제를 해결하기 위한 기법이다. Agile 방법론이 대두되면서 이는 더욱 주목받게 되었으며, 배포를 위한 빌드 단계, 테스팅 단계 등에서 시간을 절약하는 효과를 발휘하여 빠른 시장 변화 속도에 발맞춰 대응할 수 있다. 속도와 품질 두 마리의 토끼를 잡을 수 있는 것이다.
CI 시스템 구축을 위한 핵심 구성요소
CI Server
빌드 프로세스를 관리하는 서버로 Jenkins가 여기에 속한다.
ex) Jenkins, Travis CI,  etc
SCM(Source Code Management)
소스코드 형상 관리 시스템으로 Git이 여기에 속한다. 소스코드의 개정과 백업 절차를 자동화하여 오류 수정 과정을 돕는다. 팀 프로젝트의 경우 각자 수정한 부분을 전체가 자동으로 동기화 할 수 있는 시스템이다.
ex) subversion, Git etc
Build Tool
컴파일, 테스트, 정적 분석 등을 실시해 동작가능한 소프트웨어를 생성하는 도구로 Maven이 여기에 속한다. 빌드는 형상 관리 시스템에 있는 소스코드를 가져와 컴파일하여 실행 가능한 파일로 만드는 일련 과정을 일컫는 말이다.
ex) Maven, Gradle, Ant, make etc
Test Tool
작성된 테스트 코드에 따라 자동으로 테스트를 수행해주는 도구로 빌드 툴의 스크립트에서 실행되며 JUnit이 여기에 해당한다.
ex) JUnit, Mocha etc
빌드 스크립트를 통한 CI 자동화 수행 절차
1. 소스코드를 바이너리 파일로 컴파일 한다.
2. 바이너리 파일을 배포 형태로 패키징 한다.
3. 단위 테스트를 수행한다.
4. 정적 분석을 수행한다.
5. 분석 결과를 리포팅 한다.
6. 패키징한 파일을 테스트 서버에 배포한다.
CI/CD 시작하기 : CI/CD 파이프라인으로 애플리케이션 딜리버리 자동화
Web Server

CI/CD 시작하기 : CI/CD 파이프라인으로 애플리케이션 딜리버리 자동화

CI/CD 시작하기 : CI/CD 파이프라인으로 애플리케이션 딜리버리 자동화

원문보기: 

http://www.itworld.co.kr/howto/109147

 

도커란 무엇인가 / Docker 컨테이너 / Docker 이미지 / LXC / 가상화
Web Server

도커란 무엇인가 / Docker 컨테이너 / Docker 이미지 / LXC / 가상화

도커란 무엇인가?

생활코딩의 Docker – Youtube

pyrasis.com – DOcker 설치 등등 책의 내용

조영규 블로그 가기 

http://dev.youngkyu.kr/32

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

Docker란 무엇인가?

도커는 2013년 3월에 출시한 오픈소스 컨테이너 프로젝트다. 현재 2년정도 지난 시점에 세계적으로 엄청난 인기를 구사중인 대단한 프로젝트기도 하다.

서버시장이 클라우드 환경으로 옮겨가게 되면서 우리는 가상서버를 손쉽게 수백대를 구매하여 바로 사용할 수 있게 되었다. 그런데, 서버 갯수가 많아지면서 각각의 서버에 소프트웨어 설치와 설정이 큰 귀찮음으로 다가오게 됐다. 몇개 안됐다면 직접 할텐데 갯수가 엄청나니 이것을 처리할 무언가가 필요했다.

초기에 쉘 스크립트를 통해 해결하려는 시도도 있었다. 이 방법으로 필자도 오랜기간 서버 관리를 해왔다. 그러나 쉘 스크립트는 복잡한 기능 구현은 거의 불가능 할 뿐더러(사실은 잘 못해서 그런거겠지만… ㅋㅋ) 자동화의 한계가 있다. 이를 어떻게 해결 할 것인가.

이를 해결하기 위해 나온 아이디어가 바로 Immutable Infrastructure다. 그 서버에 깔린 OS(호스트 OS)와 서비스 운영을 위한 환경(서버 운영을 위해 필요한 프로그램들; node js, mysql, java등)을 분리해 이 서비스 운영환경을 패키징 해 배포한다는 아이디어이다. 이때 이/ 패키지를 데몬툴즈같은 가상 이미지 파일과 비슷하다해서 이미지라 부른다. 어쨋든 이런 생각을 구현한 것이 Docker다.

이것은 엄청난 확장성을 가져다 준다. 클라우드 플랫폼에 이것을 적용하면 자동 확장이 가능해지고 마치 공장에서 틀에 물건을 찍어내듯 마구마구 서비스를 확장할 수 있다!

가상머신과는 뭐가 다른거야?

언뜻 들으면 가상머신과 똑같다. 가상 머신에 리눅스를 설치하고 그 가상 머신을 이미지화 해 여러 서버에 복사하면 똑같은 것 같지 않은가. 그런데 좀 다르다.

가상머신

가상 머신은 편했다. 그러나 느렸다. 가상 머신 자체는 거의 완전한 컴퓨터다. 이게 무슨말이냐하면, 가상머신은 기본적으로 원래 컴퓨터 OS(호스트OS)위에서 돌아간다. 그리고 그 가상머신은 하이퍼바이저를 통해 그 위에서 수십개의 게스트 OS를 돌린다. 즉 게스트 OS가 독자적으로 돌아가는 가상 컴퓨터 인 것이다. 올리고 올라가고 올라가서 실행되니 느린건 당연지사.

OS를 자체적으로 가지고 있다는 것은 OS를 가상 머신 이미지에 포함해야 했고, 이렇게 되다보니 이미지 용량이 상당히 컷다. 그리고 이것은 상당히 배포와 관리를 힘들게 했다. 인터넷이 빨라도 엄청난 용량은 부담인건 똑같으니까.

Docker는 뭐가 달라.

도커는 이를 더 가볍게 만들었다. 게스트 OS를 없애버렸다. Docker는 호스트 OS를 사용해서 동작한다. 즉 호스트 OS의 시스템 콜을 직접 호출한다. 이것은 매우 빠른 속도로 작동할 수 있음을 의미한다(실제 빠른가는 별개의 문제기에).

도커는 도커 이미지에 서버 운영을 위한 프로그램과 라이브러리를 포함하고 있다. 이런 이미지들은 도커로 각각 격리되어 설치된다. 즉 도커 엔진이 도커 이미지를 설치할 때, 마치 가상 머신처럼 분리 시켜준다는 것이다. 그러나 호스트 OS는 공유한다. 그게 다다.

도커를 사용하면 호스트OS위에서 바로 돌리는 것과 비슷한 성능 수준을 얻을 수 있다. 99%정도까지 유사하다고 한다.

도커가 제공하는 Docker Hub

도커는 이미지 생성과 배포에 특화된 기능을 제공한다. 마치 깃처럼 이것을 이용하면 이미지를 push/pull할 수 있다. 뿐만 아니라 이것들을 공유할 수 있는 깃헙과 같은 도커허브를 제공한다.

리눅스 컨테이너 이야기부터 해보자.

chroot라는 명령어가 있다. 이것은 파일 시스템에서 루티 디렉토리(/)를 바꾸는 것이다. chroot로 특정 디렉토리를 루트 디렉토리로 설정하면 chroot jail이라 불리는 격리된 감옥이 생성된다. 이것을 활용하면 안에서 밖으로는 절대 나갈 수 없는 환경을 만들 수 있다. 이것으로 하이퍼바이저의 오버헤드를 피하면서 가벼운 가상화 비스므리한 환경을 조성할 수 있었다. 그러나 이것은 온갖 귀찮은 일을 해야 하게 만든다.

일단 실행 파일과 라이브러리등을 직접 준비해 넣어줘야한다. 바꿔야 하는 설정이 있다면 해당 설정또한 바꿔야 한다. 해당 공간이 사용하는 정보들을 제대로 제공받지도 못할 뿐더러 호스트의 다른 프로세스의 어떤 문제가 직접적으로 영향을 끼친다. 아무튼! 사용자가 해야할 일이 엄청나다. 이것을 해결하기 위해 이것을 시스템 레벨에서 좀 더 잘 제공하자는 리눅스계의 움직임이 있었고, LXC(LinuX Container)라는 기능이 탄생한다.

LXC는 기존 가상화와 달랐다. 이 공간에는 OS가 없기에 가상 머신이라 부르기도 좀 그랬다. 그래서 바구니/그릇(컨테이너)정도로 부르기로 결정했다. 한국인이면 바구니라 불렀을지도 모르겠는데, 외국인이라 컨테이너라 부른듯하다.

이 LXC기능에 완전히 격리된 가상 공간을 제공하고자 했다. 이를 위해 커널의 Control Group(cgroups) 기능을 통해 CPU도 메모리도, 디스크와 네트웍자원까지 할당할 수 있도록 했고, 커널의 Namespace isolation(혹은 namespaces)이란 기능으로 프로세스트리와 사용자계정, fs까지도 격리되도록 했다.

그러나 이렇게 생성된 LXC기능은 공간 외에 서버 운영에 필요한 기능을 필요한 수준으로 제공치 못했다. 이에 따라 Docker가 등장한다.

LXC와 도커

기존에 LXC에 기능을 얹기 위해 구현된 도커는 0.9버전부터 libcontainer를 사용해 LXC를 대체하기 시작한다. 직접 LXC의 기능을 하기 시작한 것이다. 그리고 이를 exec driver라 부른다.

실행옵션에 따라 LXC 또한 사용할 수 있다.

Docker 이미지 VS 컨테이너

도커에는 이미지와 컨테이너라는 2가지의 헷갈리는 단어가 존재한다. 또 이미지는 베이스 이미지와 도커 이미지로 구분된다.

베이스 이미지

베이스 이미지란, 리눅스 배포판의 커널 영역을 제외한 사용자 공간/영역(유저랜드)만을 이미지에 포함한 파일을 의미한다. 이때 사용자공간/영역(유저랜드)란, 커널 공간/영역과 관련된 것들을 제외한 부팅시 필요한 몇몇 실행파일과 라이브러리, 그리고 패키징 시스템(우분투의 apt같은)것들을 포괄해서 부르는 명칭이다. 이 유저랜드 혹은 사용자공간/영역에 Redis나 Nginx등을 설치해서 베이스 이미지로 배포하기도 한다.

유저랜드에는 각 리눅스 배포판의 특징이 고스란히 있어서 각 배포판 고유의 패키징 툴도 그대로 활용 할 수 있다. 이 베이스 이미지는 변형되거나 뭔가가 추가 설치될 수 있는데 이렇게 해서 변형된 이미지를 도커 이미지라 부른다.

도커 이미지

도커 이미지는 베이스 이미지에서 몇가지를 라이브러리, 프로그램, 소스 파일등을 추가/설치/저장한 이미지다. 도커 이미지는 베이스이미지부터 상속받듯이 만들어진다. 즉, 베이스이미지에서 추가되거나 변형되는 부분만 도커 이미지에 저장된다. 이렇게 만들어진 도커 이미지는 또 수정될 수 있는데, 이렇게 수정되면 또 그 변형된 부분만 다시 도커 이미지에 저장된다.

첫번째 변화후 저장된 도커 이미지를 A라 하고, 두번째 변화후 저장된 도커 이미지를 B라 하면,

베이스 이미지 + A + B

를 하여 도커 이미지 실행이 시작된다. 이 때 도커는 필요한 파일을 부모이미지부터 자식이미지까지 싹 받아서 합친다. 이렇게하여 실행된 이미지를 우리는 컨테이너라 부른다.

컨테이너

도커 컨테이너는 이미지가 실행된 상태를 뜻한다. 이미지 하나로는 수백개의 컨테이너를 생성할 수 있다. 마치 이 관계는 실행파일과 프로세스의 관계 같은 것이다.

출처: http://dev.youngkyu.kr/32 [조영규의 블로그]

AWS VPC를 디자인해보자(1) – Multi AZ와 Subnet을 활용한 고가용성
Web Server

AWS VPC를 디자인해보자(1) – Multi AZ와 Subnet을 활용한 고가용성

Click the link to read the article: AWS VPC Design

=========

AWS VPC를 디자인 해보자(1) – Multi AZ와 Subnet을 활용한 고가용성

VPC(Virtual Private Cloud) 서비스는 AWS 사용자가 직접 가상 네트워크 환경을 구성하는 서비스이다. 이 서비스를 이용하면 Public / Private network 환경을 사용자가 원하는대로 디자인하고 구축할 수 있게 되며, 다양한 부가 기능을 통해 VPC 환경 내 네트워크 흐름을 제어할 수 있다.

먼저 VPC를 이해하려면, 기존의 물리 IDC 환경을 디자인 할 때 상황을 비교해서 생각해 보면 쉽게 이해할 수 있다. 이번 포스팅에는 데이터 센터 구성에서도 Multi 데이터센터 구성과 AWS의 VPC 서비스를 비교해 보고자 한다.


1. Multi AZ VPC를 활용한 Multi 데이터센터(IDC) 구성 효과

Multi 데이터센터는 지진같은 천재지변으로 인한 데이터센터 장애나 데이터센터 자체의 전력, 네트워크 장애에 대비하기 위한 이중화 구성이다. 하지만 물리적으로 데이터센터를 이중화 하려면 굉장히 많은 비용이 든다. 데이터센터 상면 비용에서 부터 데이터센터간 network latency 를 보장하기 위한 전용선 확보까지 비용적 부담이 매우 크다. 그래서 왠만큼 큰 규모의 서비스가 아니면 시도하기도 쉽지 않다. 또한 DB 의 경우는 DBMS 이중화와 데이터센터 이중화를 복합적으로 고민해야 한다.

이러한 현실을 고려하다 보면 Multi 데이터센터 구성은 쉽지 않은게 현실이다.

VPC를 활용해 Multi 데이터센터 구성을 한다면?

VPC 를 디자인 하기 위해서는 먼저 Region 과 Availability Zone 에 대한 개념을 이해해야 한다.

AWS 서비스의 가장 큰 단위는 Region이다.

Region이란 AWS의 서비스가 위치한 지리적인 장소이며, 글로벌 기준으로 지역적 위치를 묶어서 관리하는 단위이다.

하나의 Region 안에는 다수의 Availability Zone 으로 구성되어 있다.

Availability Zone(이하 AZ) 이란 Region 내에 실제 컴퓨팅 리소스들이 물리적으로 분리되어 있는 단위이다.

이해하기 쉽게, AZ 하나가 물리적인 데이터 센터와 맵핑된다고 생각해도 무방하다.

그렇다면, AZ간 물리적으로 떨어져 있음으로 인해 생기는 latency는 어떠할까.

AWS 측에서는 같은 Region 내 AZ간에는 low-latency link 로 연결되어 있기 때문에 물리적으로 떨어져 있음으로 생기는 latency 에 대해 보장해준다.

[ 출처 : http://docs.aws.amazon.com/ ]

 그렇다면 VPC와 Region은 어떠한 관계인가.

VPC를 생성할때는 반드시 Region을 지정해야 한다. 즉, VPC는 반드시 하나의 Region에 속하게 된다.

또한 VPC는 Region내 다수의 AZ를 이용해 설계가 가능하다.

만약 VPC 를 디자인 할때 Multi AZ를 기반으로 구성한다면, 사용자는 물리적으로 다수의 데이터센터를 이용하는 것과 같은 효과를 볼 수 있다. 

실제로 VPC 를 구성할때 어떻게 Multi AZ 형태로 구성하는지 알아보자.

그러기 위해서는 먼저 VPC 설계의 가장 기본인 Subnet에 대해서 알아보자

Subnet 이란

VPC에는 Subnet 이라는 개념이 있는데, 흔히 알고 있는 대로 IP block을 구분짓는 그 Subnet과 동일하다.

Subnet의 특징은 반드시 하나의 AZ 에 속해야 한다는 것이다. 그렇기 때문에 VPC 내부에 다수의 Subnet 을 생성하여 각각의 AZ에 분산 배치 하면 아래와 같이 하나의 VPC에 Multi AZ 를 사용하도록 디자인 가능하다.

 

위 VPC 는 서울 Region에 구성한 것으로, 서울 Region에는 두개의 AZ가 존재한다. 각 AZ에 아래와 같이 subnet을 배치해 보았다.

  • AZ (ap-northeast-2a) : subnet-01 / subnet-03
  • AZ (ap-northeast-2c) : subnet-02 / subnet-04

 

VPC와 Subnet을 구성할때는 반드시 CIDR을 설정해야 하는데, 위 VPC 경우에는 10.10.0.0/16 으로 생성하였다. Subnet CIDR은 당연히 VPC에 포함되도록 해야 한다. 각 subnet의 CIDR은 아래와 같이 설정해 보았다.

  • subnet-01 : 10.10.1.0/24
  • subnet-02 : 10.10.2.0/24,
  • subnet-03 : 10.10.101.0/24
  • subnet-04 : 10.10.102.0/24

이제, 위와 같이 구성된 VPC에 Instance 를 배포한다고 가정해보자.

만약 웹서버 두대를 배포한다고 가정하면, 위 VPC의 구성에서는 AZ가 분산되도록 subnet-01과 subnet-02에 분산하여 배포하면 된다. 그리고 이 instance에 ELB를 연결해 서비스한다. 이렇게 되면 만약 AWS의 AZ 하나에 장애가 발생되더라도 다른 AZ에서 서비스가 되기 때문에 고가용성이 유지될 수 있다.

 

ELB (Elastic Load Balancer) 는 Region 내 Multi-AZ 로 설정이 가능하다.

* 참고로 ELB는 Region을 벗어나는 로드밸런싱 설정이 불가하다. 이때는 ELB가 아닌 Route53을 이용한 DNS Load balancing 과 같은 방법을 이용해야 한다.

 

* LB를 만들때 보면, 위와 같이 고가용성을 위해 두개 이상의 subnet을 선택해 LB를 생성하기를 권고하는 메시지를 볼 수 있다.

2. Public / Private network 존 구분

데이터 센터를 디자인 할때 네트워크단에서 반드시 고려 하는 것이 Public / Private network 존을 나누는 것이다.

서비스를 구축할때 외부와 통신이 직접적으로 필요한 Web 서버 같은 Front-end layer의 경우, Public 존에 위치 하도록 한다. 하지만 Back-end나 DB의 경우 외부와의 통신이 직접적으로 필요하지 않으며, 단지 Public 존에 위치한 Front-end 서버와의 통신만 필요로 하는 경우가 많다. 이런 경우에는 외부와의 통신이 제한된 Private 존에 위치하도록 한다. 이는 보안상 부적절한 접근을 네트워크 레벨에서 원천적으로 차단하기 위함이다.

만약 물리 IDC의 경우라면, Public / Private 존을 나누기 위해서는 각각의 존을 구성하는 Switch 같은 물리 장비가 필요할 것이다. 또한 VLAN등을 이용해 네트워크 영역을 분할하는 작업도 해야하며, Router를 이용해 IP대역에 대한 routing table을 직접 구성해야 할 것이다.

 만약 AWS의 VPC를 이용한다면 어떨까.

 

아래 그림은 위에서 구성한 VPC 환경의 Subnet 중 01/02 의 역할을 Public 으로, 03/04 는 Private 으로 설계한 것이다.

[ Public ]

    • public-subnet-01 (ap-northeast-2a) : 10.10.1.0/24
    • public-subnet-02 (ap-northeast-2c) : 10.10.2.0/24

[ Private ]

    • private-subnet-01 (ap-northeast-2a) : 10.10.101.0/24
    • private-subnet-01 (ap-northeast-2c) : 10.10.102.0/24

public subnet 과 private subnet도 각각의 AZ에 분산해서 배포하였다.

그리고 subnet-01과 02에는 외부와 통신이 필요한 Web 서버만 배포하도록 정책을 세우고, subnet-03 과 04 에는 외부와 통신이 제한되는 DB 서버만 배포하도록 정책을 세우면 된다.

이제 실제적으로 subnet-01과 02가 외부와 통신을 하기 위한 추가적인 설정을 해야한다.

VPC 를 생성하면 기본적으로 외부 통신과 단절된 상태로 생성된다. 또한 모든 network가 private IP로 설정되어 있기 때문에 외부로 통신이 불가한 상태다. 이때 외부로 통신하기 위해 VPC 에서는 Internet Gateway 라는 기능을 제공한다.

 

Internet Gateway

VPC 에서 제공되는 Internet Gateway 라는 기능을 이용하면 원하는 Subnet을 외부 통신이 되도록 설정이 가능하다.

구성 방법은 매우 간단하다.

먼저 외부 통신을 위한 Internet Gateway (이하 IGW) 를 생성 한후, 생성된 IGW를 VPC에 Attach한다.

* 참고로 하나의 VPC 에는 하나의 IGW 만 attach 할 수 있다.

그리고 route table 을 생성 한 후, 외부 통신을 위한 public-subnet-01 과 02 에 route table 을 assign 한다.

[ route table을 생성 후 위와 같이 외부 통신을 위한 두 subnet을 추가한다 ]

마지막으로 route table에 모든 traffic이 생성한 IGW로 가도록 설정 해주면 된다.

 

[ routing 경로로 위에서 생성한 IGW 를 지정해준다 ]

그리고 Private 을 위한 route table 도 추가로 생성 한 후, private-subnet-03 과 04 에 assign 하면 된다. private의 경우에는 외부 통신을 제한해야 하므로 IGW로 routing 설정을 추가하지 않는다. 그럼 자연스럽게 내부통신만 가능하다.

 

그림으로 보면 아래와 같은 구성이 되겠다.

VPC 를 초기에 구축할때는 위와 같이 Multi AZ와 Public / Private Subnet 을 구분하여 디자인하는게 고가용성과 보안성을 위해 좋은 설계 방향이다. 이미 인스턴스가 배포되고 서비스가 운영되고 있는 상황에서 새롭게 VPC를 구성하여 마이그레이션 하기에는 굉장히 번거로운 작업들이 필요하기 때문이다.

이후 포스팅에서는 VPC의 보안 강화를 위해 Network ACL과 Security Group, Flow log 기능을 활용하는 방법을 알아보자.

VPC를 디자인 해보자(2) – Network ACL과 Security Group을 활용한 보안 강화

[참고]

  • http://docs.aws.amazon.com/ko_kr/AmazonVPC/latest/UserGuide/VPC_Introduction.html

출처: http://bluese05.tistory.com/45?category=559701 [ㅍㅍㅋㄷ]

Installing Magento 2 With Composer
Magento 2

Installing Magento 2 With Composer

Click the link to go to the site: GO TO THE LINKED SITE

Installing Magento 2 With Composer

Thinking of installing Magento 2 with Composer, but not sure how to do it? Don’t worry, you’re at the right place!

There is official documentation on how to do it, so this is merely an alternate step-to-step guide if you want to skim and not read the entire documentation. We plan to keep this guide updated with newer Magento 2 code drops, so bookmark this page check back from time to time!

Before installing, do check these Magento 2 installation requirements.

Steps on How to Install Magento 2 with Composer

1. Install Composer

You can skip this step if you’ve already installed the Composer. (Windows users have an installer available.)

1.1 Make Composer Globally Available

If you wish, you can additionally install Composer globally so you don’t have to type php/path/to/composer.phar every time. The Windows installer will automatically set up the PATH system variable.

2. Download Magento 2

Run the following command in the root directory.

3. Set Up Permissions

After all the dependencies are retrieved, you should set the correct permissions on the entire Magento 2 installation directory. The official documentation recommends chmod’ing all directories to 700 and all files to a level of 600:

In case you are still facing problems, you are probably logged in under a different user and have to give ownership of the installation directory to the web server user.

4. Create The Database

Given that you already have a MySQL user with the correct permissions, then create an empty database to work with. If you want to, you can also use an existing database and pick a table prefix during the installation process, but that’s not something a lot of people do.

5. Install Magento 2

That’s about it! You can now follow the installation wizard or use the command line.

5.1 Installation Wizard

Just fire up the browser, navigate to the host where you installed Magento 2 and if everything went correctly, you should be redirected to the setup tool.

5.2 Command Line Installer

Magento 2 ships with a command line installer and can be invoked as followed:

The above command should be edited to your needs and executed from the Magento 2 root directory. What follows, is a bit of scrolling text and if everything went correct, you are informed that the installation has been completed.

6. Useful Tip

This tutorial covered the manual installation of Magento via composer. There are many hosting providers that provide Magento installation on a single click. Shared hosting providers use cPanel that have Softaculous which has many Magento versions available as one click.

If you are looking for an optimized, secure hosting provider then Managed hosting providers like Cloudways, Nexcess, MGT-Commerce is better suited.

Currently, Cloudways is offering $25 off on Magento hosting. You can avail this offer by using the Promo Code: MGT25.

 Final words

Hopefully, this is a clear guide on how to install Magento 2 with Composer. Most of this information is simplified and readily available with more depth in the official documentation. In case we missed anything or you’d like to know more about, you can always leave a comment below, and we’ll get back with a solution!

Github for beginner
Web Server

Github for beginner

Github for beginner

Click the link to got to the article: 바로가기

==

원문 :

1. GitHub For Beginners: Don’t Get Scared, Get Started

2. GitHub For Beginners: Commit, Push And Go

How to install Magento 2
Magento 2

How to install Magento 2

When installing Magento 2 on your machine you should ask yourself:

  • Do I need more problems in my life?

If the answer is Yes, continue reading.

I’ll be installing Magento 2 on my dev machine – Linux Ubuntu 16.04 with

  • Php 7.0.7
  • Mysql 5.7.12
  • Composer 1.1.2

Before continuing, make sure you have all the prerequisites, required for running Magento 2.

I set up one virtual host, to rule them all! That way all my Magento 2 installations will be found by this local link http://m2.loc/2.07/ for you to follow along.

As you may, or may not already know, there are a few ways to install it. I will go through each installation, with and without sample data.

Install from archive file

First and easiest way is to download it from Magento download page
https://www.magentocommerce.com/download

You can choose from few different archive types (zip, tar.gz, tar.bz2) , with and without sample data.
Magento was kind enough to pack with all composer dependencies in the archive, so you don’t have to run Composer.

In this installation Magento core code is stored under /vendor directory and updating is possible through Magento admin.

So next steps are easy, just visit http://m2.loc//2.07/magento-website/ (in my case) and follow Setup Wizard.

Install via Composer

Second, but not the last, is installing Magento via composer. Composer is a tool for dependency management in PHP. To learn more visit this link https://getcomposer.org/doc/00-intro.md

In this installation, Magento core code is also stored under /vendor directory and updating is possible through Magento admin.

First you need authentication keys which can be obtained here, and you will need Magento account to login.
Once logged in, go to “My Access Keys”, enter some descriptive “Name” and generate new set of keys. Magento uses this approach because, in future, extensions you buy from marketplace, will be available to you, through Magento admin interface.

Enter this command in terminal:

composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition

When prompted, your public key is username, and private key is password.

After that, Magento is ready for installation. Go through Setup Wizard and install it.

This was without sample data. So to install sample data, navigate to your Magento 2 root directory through terminal, and run the following command:

php bin/magento sampledata:deploy
php bin/magento setup:upgrade

These two commands will update your composer.json file and install sample data. If you get this message, after installing sample data – “Please re-run Magento compile command”, enter the following in terminal:

php bin/magento setup:di:compile

This command will take some time to complete.

Install via GitHub

Third, and the last one, is cloning or downloading release from GitHub repository.
In this installation, I will show you how to avoid setup wizard and install Magento through terminal. But, it is important to mention that in this installation Magento core code is stored under app/code not in vendor/ like in previous two examples.
When you try to update Magento through Admin interface, you will get error that this is a GitHub version and it’s not possible to update. GitHub releases are intended to be used by contributors/developers.

First we must clone Magento repo from here: https://github.com/magento/magento2 or you can download releases on https://github.com/magento/magento2/releases

Create empty directory and run:

git clone git@github.com:magento/magento2.git .

After deploying has been finished, run:

composer install

Now it’s time to install Magento 2. My setup looks like this:

php -f bin/magento setup:install –base-url=http://m2.loc/2.07/github/ --backend-frontname=admin
--db-host=localhost --db-name=m2git --db-user=root --db-password=inchoo --admin-firstname=Magento
--admin-lastname=User --admin-email=ivan.veres@inchoo.net --admin-user=admin --admin-password=magento123
--language=en_US --currency=USD --timezone=America/Chicago –use-rewrites=1

Change your base-url, db-name, db-password, admin-email, admin-password to match your local setup.
If your visit you local link through browser (http://m2.loc/2.07/github/), Magento 2 should be installed.

If you need sample data, follow along.
In your web root (not magento2) run:

git clone git@github.com:magento/magento2-sample-data.git

Navigate into cloned directory and execute:

php -f dev/tools/build-sample-data.php -- --ce-source="your Magento CE install dir"

This will create symlinks to your Magento 2 installation.
Set ownership and permissions if you are on Linux machine:

chown -R :your web server group name
find . -type d -exec chmod g+ws {} \;

Then you need to clear static files (cache).
Navigate to Magento 2 var/ folder and enter following:

rm -rf cache/* page_cache/* generation/*

In Magento 2 documentation there are no further instructions. However you need to install sample data.

php bin/magento setup:upgrade
php bin/magento setup:di:compile

After that you should have sample data installed.

If you have some problems reference at: http://devdocs.magento.com/guides/v2.0/install-gde/bk-install-guide.html

If this or anything else regarding Magento development confuses you, we will gladly check out your site and offer technical insights on what to improve based on our detailed custom report. Feel free to get in touch!

L2, L3, L4 스위치 정의 및 개념 정리
Web Server

L2, L3, L4 스위치 정의 및 개념 정리

1. 스위치의 정의

. 허브의 확장된 개념으로 기본 기능은 허브와 동일하지만 전송 중 패킷의 충돌이 일어나지 않도록 패킷의 목적지로 지정할 포트를 직접 전송한다.

스위치에서 패킷의 목적지 주소를 기준으로 보내는 곳과 받는 곳을 계산하여, 해당포트르 1:1로 연결한다. – Switching

. 스위칭은 정보 전달의 수단과 회선의 효율적 운용을 위해 입출력 사태를 감시하며, 전송로의 장애 발생 시 현재 상태에서 예비 상태로 전환한다.

 

2. 스위치의 특징

. 패킷을 보내느 노드와 받는 노드를 1:1로 연결해 주기 때문에 충돌이 발생하지 않는다. – 빠른 속도로 전송 가능

. 두개의 노드가 통신을 하는 동안 다른 노드들도 서로간의 통신이 동시에 가능하며, 이더넷에서 높은 효율을 갖는다.

. 노드의 수가 증가해도 속도의 저하가 일어나지 않으며, 패킷의 감청이 어려운 구조이므로 보안성이 높다.

. 기본적으로 Processor,RAM,OS를 탑재하므로 많은 부가 기능을 갖는다.

 **** 허브와  L2 스위치 차이점 블로그 참고 : 

http://blog.naver.com/newyks?Redirect=Log&logNo=150183058388

 

3. 스위치의 장점

. 완전한 2중화와 Fault-Tolerant 구성이 가능하며, 대역폭 비용이 낮아진다.

. 트래픽 제어가 상대적으로 높으며, 포트 당 속도가 일정하게 보장된다.

. 여러 노드에서 동시 통신을 할 때 속도 저하가 없고, 성능이 향상된다.

. 전이중 통신 모드로 네트워크상의 불필요한 패킷의 흐름을 막으며, 충돌이 발생하지 않아 빠른 속도의 전송이 가능하다.

. 각 DTE는 스위치를 몰라도 데이터 전송에는 상관 없으며, 많은 부가 기능이 있다.

 

4. 스위치의 구분

. 어떤 주소를 가지고 스위칭을 하는가에 따라 L2,L3,L4 스위치로 구분된다.

. L2는 MAC주소, L3은 프로토콜 주소, L4는 세션 프로토콜을 이용하여 스위칭할 수 있다.

 

5. Layer 2 스위치의 특징

. L2 스위치로 가장 흔히 볼수 있는 스위칭 방식이며, 다른 방식에 비해 저렴하다.

. 패킷의 MAC 주소를 읽어 스위칭을 하고, MAC이 OSI 계층 중 2 계층에 해당하기 때문에 Layer 2 스위치라 한다.

. 기본적인 동작은 브리지나 스위칭 허브는 모든 자료를 보내는 곳으로 수신 번지를 전송한다.

. 브리지는 어떤 포트에서 받은 데이터를 다른 모든 포트로 전송하나 L2 스위치 허브에서는 여러개의 포트 중 특정 포트로만 전송한다.

 

<동작 원리>

. 다른 스위치처럼 프로세서,메모리,펌웨어(운영체제)가 담겨 있는 FLASH ROM으로 이루어져 있다.

. 부팅이 되면 L2스위치는 각 포트별로 연결되어 있는 노드의 상태를 확인한다.

. 각 노드의 MAC 주소를 알아내서 이것을 메모리에 적재하게 되고 , 패킷이 전달될 때 이 정보를 바탕으로 스위칭하게 된다.

. 스위치의 운영 체제가 적재되거나 스위칭을 할 때 각 포트별 주소 정보가 저장된다. – 스위칭 허브 메모리

. 스위칭 허브를 선택할 때 스위칭 허브가 얼마만큼의 메모리와 어느 정도의 주소 테이블을 저장할 수 있는지를 확인한다.

. 보통의 스위치는 메모리 용량 이상의 주소가 저장될 경우(연결 노드가 많은 경우) 스위칭 기능이 중지되고, 더미 허브와 같은 방식으로 동작한다.

장점 : 구조가 간단하며, 신뢰성이 높다. / 가격이 저렴하고, 성능이 높다.

단점 : Broadcast 패킷에 의해 성능 저하가 발생한다. – 라우팅이 불가능 / 상위 레이어 프로토콜을 이용한 스위칭이 불가능 하다.

 

6. Layer 3 스위치의 특징

. L3 스위치  포트간 패킷 스위칭을 위해 패킷의 IP나 IPX 주소를 읽어서 스위칭을 하며, 통신 경로를 한 번만 설정한다.

. 해당 프로토콜을 쓰는 패킷에 대해 스위칭이 가능하며, IP나 IPX 주소가 OSI 7 계층 중 3 계층에 해당하기 때문에 Layer 3 스위치라 한다.

. L2 스위치에 라우팅(Routing) 기능을 추가하고, 대부분의 고성능 하드웨어를 기초로 하였다. – 기본 구성은 L2와 동일

 

<동작원리>

. 부팅 시 각 포트로 연결된 노드의 상태를 확인하고, 노드의 주소를 테이블의 메모리에 적재하여 패킷이 전달될 때 이 정보를 바탕으로 스위칭을 한다.

. L3은 L2에 비해 고급 기능을 지원하므로 L2는 일부 고급 기종에서만 스위치에 IP주소를 할당하지만 L3은 기본적으로 스위치 자체에 IP 주소를 할당한다.

. 각 포트별 IP 주소 할당 내역 등을 설정하여 스위칭 할 때 설정된 값을 이용한다. – 기본 설정 모드를 지원

 

장점 : Broadcast 트래픽으로 전체 성능 저하를 막을 수 있다. / 트래픽 체크, 가상 랜 등의 많은 부가 기능을 갖고 있다.

단점 : 특정 프로토콜을 이용해야 스위칭을 할 수 있다. / 대부분의 트래팩이 서브텟의 한계를 넘는다.

 

7. Layer 4 스위치의 특징

. L3과 같이 프로토콜을 기반으로 하며, 어플리케이션별로 우선 순위를 두어 스위칭이 가능하다.

. 여러대의 서버를 1대처럼 묶을 수 있는 부하 분산 (Load Balancing) 기능을 제공한다. – 많은 양의 트래픽을 여러 서버로 분산 가능

. 각 제조 업체별로 설정 방법 및 제공 기능이 다르므로 , 특별한 표준을 지정하기가 힘들다.

 

<동작원리>

. L3 스위치와 유사한 구조와 동작 원리를 갖고 있지만 가상 랜 기능과 그룹화, 부하 분산 등의 고급 설정이 추가로 포함되는 점이 다르다.

. TCP/IP 포로토콜을 기반으로 동작하는 것이 대부분이며, 포트 번호를 이용한 스위칭 까지도 가능하다.

. 포트 번호는 수신 컴퓨터에서 IP 패킷의 형태로 결정하여 상위 계층으로 전달한다.

 

장점 : 보안성이 높고 고급 스위칭 설정이 가능하다. – 상황에 적절한 설정 / 용량에 관계 없이 네트워크의 성능 개선에 기여한다.

단점 : 프로토콜에 의존적이며, 설정이 복잡하다. / 고가의 장비로 L2,L3 스위치와 적절한 혼합 배치가 필요하다.

 

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

1. OSI 7 계층 복습

⑦ Application ( 응용 계층 )

– 네트워크를 이용하려는 프로그램과 사용자에게 서비스를 제공

– 사용자의 응용프로그램과 통신하는 계층

– Protocol : DNS, DHCP, Telnet, SSH, HTTP, FTP 등

⑥ Presentation ( 표현 계층 )

– 데이터를 주고 받을 때 데이터를 적절히 표현 : 0과 1로만 이루어진 data를 문자와 그         림 인지를 구분하여 표현 -> 파일 뒤에 확장자가 붙는 것과 같다.

– 보내는 방향의 응용 계층에서 받은 정보를 받는 방향의 응용계층에서 읽을 수 있게 해         준다.

– 압축 / 해제하는 일과 암호화 / 복호화를 한다.

– Encoding / Decoding, File Format

– 만약 데이터가 변환되어야 한다면 표현 계층에서 책임진다. ex) ASCII -> EBCDIC

⑤ Session ( 세션 계층 )

– 네트워크를 이용하여 통신하는 두 프로세스 간의 논리적인 연결

ex) NateON 채팅

전자결제 시 뒤로가기 클릭-> 세션 만료 또는 종료 문구 출력되는 것( 웹 브라우저와             해당 은행 또는 기관의 프로그램 간 연결이 논리적으로 끊어진 것, 이것은 순차적으               로 진행되어야 하는데 이것을 역으로 가면 연결이 끊어질 수 밖에 없다.)

– Protocol : NetBIOS, SSL ( Secure Socket Layer ), TLS ( Transport Layer Secure )

SSL, TLS는 암호화와 관련

– 압축, 암호화, 표현( .확장자)

 

④ Transport ( 전송 계층 )

– 하위 계층의 데이터 이동 시 신뢰성 제공

– 상위 계층의 서비스( Protocol 구분 ), Port 주소로 구분

– Data를 나누고, 나눠진 Data 조립, 즉 Segment(조각)로 나눠서 전송 -> 이를 원래            Data로 복원

– Protocol : TCP -> 오버헤드가 크다(속도가 느리다), Stateful(상태확인)

UDP -> 오버헤드가 적다(속도가 빠르다), Stateless(상태미확인)

-주소 : Port ( 0~65535 ) – 어떤 프로그램으로 가야 할지를 지정

③ Network ( 네트워크 계층 )

– 두 시스템 간 연결성과 경로 선택(Routing) -> 목적지까지 가기 위한 경로

– IP 주소를 사용 : TCP/IP 망에서 원하는 목적지까지 데이터를 전달하기 위해 만들어진         표준

– Data를 Packet 단위로 분할하고 전송한 후 다시 합치는 작업

– Protocol : IP, ICMP

– PDU ( Protocol Data Unit ) : Packet

– 장비 : Router

 

② Data Link ( 데이터 링크 계층 )

– 로컬 시스템 간 물리적 연결

– 물리적 노드에서의 통신을 담당, 물리적 링크를 통해서 데이터 링크를 신뢰성 있게 전          송하고 Bit(비트)를 Frame(프레임)이라는 논리적 단위로 구성

– MAC 주소로 장비 구분 -> Data 전송

– ARP : IP주소를 MAC 주소로 변환

– RARP : MAC 주소를 IP 주소로 변환

– Protocol : ARP, Ethernet, Token Ring, PPP, SLIP, HDLC, X.25, ATM 등

– Flow Control ( 흐름 제어 ), Error Control ( 오류 제어 )-> Checksum-> Footer의 역할

– PDU : Frame

– 장비 : Switch, Bridge

– 스위치의 기능 ( flooding, learning, forwarding, aging, filtering )

 

① Physical ( 물리 계층 )

– Data가 0과 1, 즉 Bit로 변환이 되어 보내지며 데이터 전송만 해줌, 전기적 신호 전송

– 장비 : Cable, Repeater, Hub

 

출발지가 목적지를 찾기 위해 패킷을 보냄

목적지를 발견하여 학습함

목적지를 알고 있으니 바로 목적지로 전송?

300초 주기로 플래쉬, 에이징

스위치 하면 콜리젼 도메인 한다는 것이 필터링하여 충돌을 막아주는 것이다.

3. TCP header

 

16bit -> 2의 16승

데이터 들어있는 것을 psh

window size : buffer의 size

window라고 하는 공간은 데이터를 여러번 보냈을 때 한번 ack를 받을 size?

L2 L3 L4 스위치 차이 및 FEP , QOS 설명
Web Server

L2 L3 L4 스위치 차이 및 FEP , QOS 설명

L2 스위치

-그냥 스위치라고 부르기도 합니다. 데이터를 뿌려주는 허브역할만 수행.

2Layer(Datalink Layer)의 프로토콜인 이더넷, 프레임릴레이, ATM 등에서 스위칭 기능을 수행한다

– MAC 정보(MAC Table)를 보고 스위칭

 

L3 스위치

– HUB+ROUTER 의 역활을 수행하는 장비… 즉 스위칭허브에 라우팅 기능이 추가된 장비.

– IP정보(Routing Table)를 보고 스위칭

 

L4 스위치

-L3 스위치의 기능에 더해 서버나 네트웍의 트래픽을 로드밸런싱.. 즉 균등하게 분배하여 주는 스위치입니다.

이때 TCP와 UDP 그리고 RTP(Real Time Protocol) 등의 헤더를 사용하여,

FTP, HTTP, TFTP. SMTP 등의 프로토콜 중 어느 것에 대한 요구가

우선하는지 파악한 후 스위칭하게 된다.

이러한 이유로 서버와 연동시켜 해당 서비스를 제공하는 서버로 연결하는 스위치로 이용된다.

– IP+Port (Session or Connection)를 보고 스위칭

 

L7 스위치

– 더 상세한 패킷을 처리하므로 패킷의 부하분산, QOS기능이 가능

– Dos/SYN Attack에 대한 방어

– CodeRed/Nimda등 바이러스 감염 패킷의 필터링

– 네트워크 자원의 독점 방지를 통한 네트워크 시스템의 보안성 강화가 가능함

– 실제 어플리케이션 데이터(Content)를 보고 스위칭을 하는 것

 

L4 스위치와 L7 스위치의 차이

– L4 : 패킷의 헤더 정보만 확인

– L7 : payload (이메일 제목/내용의 문자열, HTTP 컨텐츠 URL, FTP 파일제목, SSL ID,

Cookie 정보, 특정 바이러스) 특성들을 분석해 패킷을 처리함

보안에 이용되어지는데 보다 높은 수준의 Intelligence를 갖춘 스위치이므로 더 정교한

패킷의 부하 분산 및 Qos 기능 구현이 가능함. 가격높음.

 

라우터와 L3 스위치의 차이

– 오래전엔 L3 는 Layer3 계층을 사용하여, IP 로 패킷포워딩이 가능한 스위치 정도였고,

라우터는 이와 더불어 OSPF,BGP 등 라우팅 프로토콜을 사용할 수 있었다고 합니다.

하지만 지금은 기술의 발전으로 L3 도 라우팅 프로토콜을 사용할 수 있게 되고 성능도 라우터에 근접하게 되면이 둘을 나누는 의미자체는 모호해졌다고 하네요…

참고 : http://blog.naver.com/nackji80/220228728915

 

FEP(front-end processor)

– 네트워크로 연결된 장치에 네트워크 인터페이스 기능을 제공하는 장치나 보드를 뜻 함.

PC나 서버의 부하를 줄이기 위해 사용되는 네트워크용 프로세서라고 보시면 됩니다.

 

QOS (Quality of Service) (서비스 품질)

– 네트워크의 품질을 관리하기 위한 척도로 활용되거나 등급을 주기위한여 있다고 보시면 될까요..

Activate windows 10 without any key (microsoft toolkit)
Windows

Activate windows 10 without any key (microsoft toolkit)

Click the link to view the youtube video: youtube’s video

===

Step 1: Download the Microsoft Toolkit and install it.

Step 2: Click the windows icon to activate windows 10

Step 3: Clcik the “Activate” tan on the top menu to Install the Activate tool

Step 4: Select “AutoKMS” tool and Click the “Install” button to install …

Console Displaying:

.Created C:\Windows\AutoKMS\AutoKMS.exe

.Created AutoKMS Scheduled Task

.AutoKMS was successfully installed.

Step 5: Click the “Product Keys”  tab on the top menu to choose…

-Product: Window 10

-Edition: Windows Pro

Ans Click the “Install” button

Step 6: Click the “Activation” tab on the top menu and Click the “Activate” button.

Step 7: Click the “check” button to check the active status.

-Result on information Console


Name: Windoes(R), Education Edition

Description: windoes(R) …..

Family: Education

SKU ID: e0c4228-980c-4788-a014-c080d2e1926e

Application ID: 55c92734-d682-4d71-983e-d6ec3f16059f

Installed Product Key ID: 03612-03281-000-000001-02-1033-16299.0000-0342018

Step 8: Check the activate status on computer…

 

That’s it!

 

How to enable/disable the demo store notice in Magento
Magento 2

How to enable/disable the demo store notice in Magento

  • Magento 2.x and newer:

Go to Content and under Design, choose Configuration. Select the store view that you want to configure and click Edit. Under Other Settings, expand the HTML Head section. On the bottom of the page you can set the Display Demo Store Notice to your preference (Yes/No).

Select Save Configuration to save your changes.

Magento 2.x: Configure Sandbox Authorize.net
Magento 2

Magento 2.x: Configure Sandbox Authorize.net

Magento 2.x: Configure Sandbox Authorize.net

Click the link to read the article: Read the article

===

Create a Sandbox Account:

https://developer.authorize.net/hello_world/sandbox/

 

  1. First of all go to your sandbox account in https://sandbox.authorize.net/
  2. Then go to Account > Settings > Api Credentials & Keys. Generate a Transaction Key.
  3. (OPTIONAL) Once you get you API Login ID and your Transaction Key, go to Account > Settings > MD5-Hash and enter any word you want like “codealist”.
  4. Go to Account > Settings > Test Mode and set to Live Mode.

Once you get the API Login ID, Transaction Key and MD5-Hash, you are ready to set it up on Magento.

  1. Log into your Magento Backend
  2. Go to Stores > Configuration > Payment Method > Authorize.net Direct Post
  3. Change “Enabled” to “Yes”
  4. Put your API Login ID, Transaction Key and the Md5 string, in case you set it on sandbox.authorize.net
  5. Change “Test Mode” to “NO”
  6. Change the Gateway URL from https://secure.authorize.net/gateway/transact.dll to https://test.authorize.net/gateway/transact.dll
  7. Save and Clear Cache.
    Screen Shot 2016-12-19 at 15.49.14

And that’s it. Try placing an order with a test Credit Card, for example 4111 1111 1111 111, any CVV and any future expiration date.

How to Create & Edit Email Templates in Magento 2
Magento 2

How to Create & Edit Email Templates in Magento 2

How to Create & Edit Email Templates in Magento 2

Click the link to read the article: Read the article …

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

Creating and editing email templates in Magento 2 is very similar to the equivalent process in Magento 1. The primary difference between Magento 1 and Magento 2 is that these templates have been renamed from “Transactional Emails” to “Email Templates.” You can still find and customize default Magento 2 email templates as well as add new templates to use for your store. This guide will show you how to view and edit the default templates packaged with Magento 2 as well as how to create new templates to effectively represent your store’s branding and messaging with ease!

Templates Location

You can find Email Templates in the Magento 2 dashboard under Marketing > Email Templates:
Magento 2 Email Template Location

 

In a fresh installation of Magento 2, you won’t see any Email Templates listed in the grid by default. In order to edit or create a template, click Add New Template in the upper right corner.

 

Add New Email Template Button

 

Editing a Default Email Template

In order to edit one of the default, Magento 2 templates first click into the Add New Template page. At the top of the page you will see the Load default template section:

 

The Load Default Email Template Section

 

In order to edit one of the default Magento 2 templates first click into the Add New Template page. At the top of the page you will see the Load default template section:

  • Payment Failed
  • Contact Form
  • Change Email
  • Change Email and Password
  • Forgot Password
  • New Account
  • New Account (Magento/luma)
  • New Account Confirmation Key
  • New Account Confirmed
  • New Account Without Password
  • Remind Password
  • Reset Password
  • Currency Update Warnings
  • Footer
  • Footer (Magento/luma)
  • Header
  • Subscription Confirmation
  • Subscription Success
  • Unsubscription Success
  • Cron Error Warning
  • Price Alert
  • Stock Alert
  • Credit Memo Update
  • Credit Memo Update (Magento/luma)
  • Credit Memo Update for Guest
  • Credit Memo Update for Guest (Magento/luma)
  • Invoice Update
  • Invoice Update (Magento/luma)
  • Invoice Update for Guest
  • Invoice Update for Guest (Magento/luma)
  • New Credit Memo
  • New Credit Memo (Magento/luma)
  • New Credit Memo for Guest
  • New Credit Memo for Guest (Magento/luma)
  • New Invoice
  • New Invoice (Magento/luma)
  • New Invoice for Guest
  • New Invoice for Guest (Magento/luma)
  • New Order
  • New Order (Magento/luma)
  • New Order for Guest
  • New Order for Guest (Magento/luma)
  • Order Update
  • Order Update (Magento/luma)
  • Order Update for Guest
  • Order Update for Guest (Magento/luma)
  • Shipment Update
  • Shipment Update (Magento/luma)
  • Shipment Update for Guest
  • Shipment Update for Guest (Magento/luma)
  • Send Product Link to Friend
  • Sitemap Generation Warnings
  • Forgot Admin Password
  • User Notification
  • Wish List Sharing

Depending on your store’s setup you may see additional templates in this dropdown- this is because different themes and extensions may add new templates to accommodate additional functionality. Any of these templates can be edited in the same manner as default Magento 2 templates.

Once you have selected the template you wish to edit click “Load Template” and you will see the Template Subject and Template Content fields populated with the default values:

 

New Template Subject and Content Fields

 

Give your new template a descriptive title to differentiate it from the default template. At this point you can edit any of the HTML and CSS values in the subject or content sections, as well as add any content not included in the default.

You can also add or edit variables to Email Templates from this page. Magento variables are snippets of code which pull specific pieces of information from various locations within Magento into a template to enhance the customization and tailoring of your Email Templates. The “{{var customer.name}}” variable, for example, will pull in a registered customer’s name and display it within the email to make your store’s communications more personalized.

You can add a variable to any Email Template by placing your cursor in the location you would like to add the variable and clicking “Insert Variable…”

 

Email Template Insert Variable

 

These are the variables you can add to any template with default Magento 2:

  • Base Unsecure URL | {{config path=”web/unsecure/base_url”}}
  • Base Secure URL | {{config path=”web/secure/base_url”}}
  • General Contact Name | {{config path=”trans_email/ident_general/name”}}
  • General Contact Email | {{config path=”trans_email/ident_general/email”}}
  • Sales Representative Contact Name | {{config path=”trans_email/ident_sales/name”}}
  • Sales Representative Contact Email | {{config path=”trans_email/ident_sales/email”}}
  • Custom1 Contact Name | {{config path=”trans_email/ident_custom1/name”}}
  • Custom1 Contact Email | {{config path=”trans_email/ident_custom1/email”}}
  • Custom2 Contact Name | {{config path=”trans_email/ident_custom2/name”}}
  • Custom2 Contact Email | {{config path=”trans_email/ident_custom2/email”}}
  • Store Name | {{config path=”general/store_information/name”}}
  • Store Phone Number | {{config path=”general/store_information/phone”}}
  • Store Hours | {{config path=”general/store_information/hours”}}
  • Country | {{config path=”general/store_information/country_id”}}
  • Region/State | {{config path=”general/store_information/region_id”}}
  • Zip/Postal Code | {{config path=”general/store_information/postcode”}}
  • City | {{config path=”general/store_information/city”}}
  • Street Address 1 | {{config path=”general/store_information/street_line1″}}
  • Street Address 2 | {{config path=”general/store_information/street_line2″}}

*Note that different Email Templates may display different variables depending on their purpose. The Email Template for New Account, for example, also includes these variables:

  • Customer Account URL | {{var this.getUrl($store, ‘customer/account/’)}}
  • Customer Email | {{var customer.email}}
  • Customer Name | {{var customer.name}}

In the same way that an extension or theme may add new Email Templates to your store’s arsenal, they may also add new variables which can be used to enhance your customer experience.

Click on the variable you would like to add and you will see it automatically populate in your cursor’s location.

Depending on the template you are editing and your knowledge of HTML and CSS you may want to view the email template you are editing in plain text format- you can do this by clicking “Convert to Plain Text” in the page header:

 

View Template in Plain Text

 

This action removes all HTML tags from the Template Content field which can make the content easier to read as it only leaves the template variables and plain text. This is what a template may look like with all HTML and CSS content in place:

 

Plain Text Template Content

 

And this is what the same template looks like when converted to plain text:

 

Same Template Plain Text

 

As you can see the actual content is much easier to read and understand with the tags stripped which allows you to quickly and efficiently find specific pieces of information that you’d like to edit. You can then click “Return HTML Version” to restore the stripped tags to the template.

It should be noted that changes are not saved when switching back and forth between “Convert to Plain Text” and “Return HTML Version,” so it is not recommended that you make any changes while viewing the plain text version.

Clicking “Reset” in the page header will erase any changes you have made and return you to the blank New Template page.

You can preview your changes to an email template at any point by clicking the “Preview Template” button. This opens a preview of the email in a new tab which allows you to make changes and test them before saving the template.

It is possible to add CSS styles to the email template in the Template Styles field at the bottom of the New Template page, however, we generally recommend avoiding housing your styles in this field as certain email clients will not pick up this CSS which will result in your templates displaying improperly. To make sure your email styles appear on as many different email clients as possible it is recommended that you use inline CSS as much as possible.

 

Email CSS Template Styles

 

Once all of your edits have been made to a template, you can save your changes by clicking “Save Template” in the upper right corner of the page.

*Note that any template you are editing which are not the default Header or Footer email templates will not reflect changes to those respective portions of the email unless you remove the following variables from the template:

  • {{template config_path=”design/email/header_template”}}
  • {{template config_path=”design/email/footer_template”}}

How to Use New or Edited Email Templates

Once you have created a new template or edited a default template you must navigate to Stores > Configuration to actually utilize the template. If you aren’t sure where the settings are for your particular email template, you can often find this by loading in the default Magento template on the New Template page and looking for the “Currently Used For” section which displays the configuration path to the setting you need to change:

 

EmailTemplateInformation

 

Once you navigate to the appropriate configuration tab for your template, you can swap templates by selecting yours from the drop-down by that particular setting:

 

Email Template Invoice Dropdown Options

 

The two exceptions to these settings residing in Stores > Configuration are the settings for the Header and Footer templates. These can be found under Content > Configuration > Your Theme >Transactional Emails. This tab allows you to set the Header and Footer templates to use as well as define which logo image to use in any Email Template.

Recap

 

Whether you have recently migrated to Magento 2 or you are a new Magento 2 store owner, utilizing simple edits to Magento Email Templates can have a significant impact on your store’s message. Using the tools outlined above you should be able to add or edit Magento 2’s Email Templates with ease, so start improving your brand today!

If you don’t have the HTML and CSS knowledge to build more advanced and technical designs into your Email Templates contact Customer Paradigm today and we will build beautiful templates that will help expand your store’s online presence and branding!

Font Awesome – Web Application Icons
Web Server

Font Awesome – Web Application Icons

Font Awesome – Web Application Icons

Click the link to read the article:  Read the article …

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

This chapter explains the usage of Font Awesome Web Application icons. Assume that custom is the CSS class name where we defined the size and color, as shown in the example given below.

<html>
   <head>
      <link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css">

      <style>
         i.custom {font-size: 2em; color: gray;}
      </style>
		
   </head>
	
   <body>
      <i class = "fa fa-adjust custom"></i>
   </body>
	
</html>

The following table shows the usage and the results of Font Awesome Web Application icons. Replace the < body > tag of the above program with the code given in the table to get the respective outputs −

Usage Result
<i class= “fa fa-adjust custom”></i>
<i class=”fa fa-anchor custom”></i>
<i class=”fa fa-archive custom”></i>
<i class=”fa fa-area-chart custom”></i>
<i class=”fa fa-arrows custom”></i>
<i class=”fa fa-arrows-h custom”></i>
<i class=”fa fa-arrows-v custom”></i>
<i class=”fa fa-asterisk custom”></i>
<i class=”fa fa-at custom”></i>
<i class=”fa fa-automobile custom”></i>
<i class=”fa fa-balance-scale custom”></i>
<i class=”fa fa-ban custom”></i>
<i class=”fa fa-bank custom”></i>
<i class=”fa fa-bar-chart custom”></i>
<i class=”fa fa-bar-chart-o custom”></i>
<i class=”fa fa-barcode custom”></i>
<i class=”fa fa-bars custom”></i>
<i class=”fa fa-bed custom”></i>
<i class=”fa fa-beer custom”></i>
<i class=”fa fa-bell custom”></i>
<i class=”fa fa-wrench custom”></i>
<i class=”fa fa-bell-o custom”></i>
<i class=”fa fa-bell-slash custom”></i>
<i class=”fa fa-bell-slash-o custom”></i>
<i class=”fa fa-bicycle custom”></i>
<i class=”fa fa-battery-0 custom”></i>
<i class=”fa fa-battery-1 custom”></i>
<i class=”fa fa-battery-2 custom”></i>
<i class=”fa fa-battery-3 custom”></i>
<i class=”fa fa-battery-4 custom”></i>
<i class=”fa fa-battery-empty custom”></i>
<i class=”fa fa-battery-quarter custom”></i>
<i class=”fa fa-battery-half custom”></i>
<i class=”fa fa-battery-three-quarters custom”></i>
<i class=”fa fa-battery-full custom”></i>
<i class=”fa fa-birthday-cake custom”></i>
<i class=”fa fa-bolt custom”></i>
<i class=”fa fa-bomb custom”></i>
<i class=”fa fa-book custom”></i>
<i class=”fa fa-bookmark custom”></i>
<i class=”fa fa-bookmark-o custom”></i>
<i class=”fa fa-briefcase custom”></i>
<i class=”fa fa-bug custom”></i>
<i class=”fa fa-building custom”></i>
<i class=”fa fa-building-o custom”></i>
<i class=”fa fa-bullhorn custom”></i>
<i class=”fa fa-bullseye custom”></i>
<i class=”fa fa-bus custom”></i>
<i class=”fa fa-cab custom”></i>
<i class=”fa fa-video-camera custom”></i>
<i class=”fa fa-calendar custom”></i>
<i class=”fa fa-calendar-check-o custom”></i>
<i class=”fa fa-calendar-minus-o custom”></i>
<i class=”fa fa-calendar-o custom”></i>
<i class=”fa fa-calendar-plus-o custom”></i>
<i class=”fa fa-calendar-times-o custom”></i>
<i class=”fa fa-camera custom”></i>
<i class=”fa fa-camera-retro custom”></i>
<i class=”fa fa-car custom”></i>
<i class=”fa fa-cc custom”></i>
<i class=”fa fa-caret-square-o-down custom”></i>
<i class=”fa fa-caret-square-o-left custom”></i>
<i class=”fa fa-caret-square-o-right custom”></i>
<i class=”fa fa-caret-square-o-up custom”></i>
<i class=”fa fa-cart-arrow-down custom”></i>
<i class=”fa fa-cart-plus custom”></i>
<i class=”fa fa-certificate custom”></i>
<i class=”fa fa-child custom”></i>
<i class=”fa fa-check custom”></i>
<i class=”fa fa-check-circle custom”></i>
<i class=”fa fa-check-circle-o custom”></i>
<i class=”fa fa-check-square custom”></i>
<i class=”fa fa-check-square-o custom”></i>
<i class=”fa fa-circle custom”></i>
<i class=”fa fa-circle-o custom”></i>
<i class=”fa fa-circle-o-notch custom”></i>
<i class=”fa fa-circle-thin custom”></i>
<i class=”fa fa-clock-o custom”></i>
<i class=”fa fa-clone custom”></i>
<i class=”fa fa-close custom”></i>
<i class=”fa fa-anchor custom”></i>
<i class=”fa fa-cloud-download custom”></i>
<i class=”fa fa-cloud-upload custom”></i>
<i class=”fa fa-code custom”></i>
<i class=”fa fa-code-fork custom”></i>
<i class=”fa fa-coffee custom”></i>
<i class=”fa fa-cog custom”></i>
<i class=”fa fa-cogs custom”></i>
<i class=”fa fa-comment custom”></i>
<i class=”fa fa-comment-o custom”></i>
<i class=”fa fa-commenting custom”></i>
<i class=”fa fa-commenting-o custom”></i>
<i class=”fa fa-comments custom”></i>
<i class=”fa fa-comments-o custom”></i>
<i class=”fa fa-compass custom”></i>
<i class=”fa fa-copyright custom”></i>
<i class=”fa fa-creative-commons custom”></i>
<i class=”fa fa-credit-card custom”></i>
<i class=”fa fa-crop custom”></i>
<i class=”fa fa-crosshairs custom”></i>
<i class=”fa fa-cube custom”></i>
<i class=”fa fa-cubes custom”></i>
<i class=”fa fa-cutlery custom”></i>
<i class=”fa fa-dashboard custom”></i>
<i class=”fa fa-database custom”></i>
<i class=”fa fa-desktop custom”></i>
<i class=”fa fa-diamond custom”></i>
<i class=”fa fa-dot-circle-o custom”></i>
<i class=”fa fa-download custom”></i>
<i class=”fa fa-edit custom”></i>
<i class=”fa fa-ellipsis-h custom”></i>
<i class=”fa fa-ellipsis-v custom”></i>
<i class=”fa fa-envelope custom”></i>
<i class=”fa fa-envelope-o custom”></i>
<i class=”fa fa-envelope-square custom”></i>
<i class=”fa fa-eraser custom”></i>
<i class=”fa fa-exchange custom”></i>
<i class=”fa fa-exclamation custom”></i>
<i class=”fa fa-exclamation-circle custom”></i>
<i class=”fa fa-exclamation-triangle custom”></i>
<i class=”fa fa-external-link custom”></i>
<i class=”fa fa-external-link-square custom”></i>
<i class=”fa fa-eye custom”></i>
<i class=”fa fa-eye-slash custom”></i>
<i class=”fa fa-eyedropper custom”></i>
<i class=”fa fa-fax custom”></i>
<i class=”fa fa-feed custom”></i>
<i class=”fa fa-female custom”></i>
<i class=”fa fa-fighter-jet custom”></i>
<i class=”fa fa-file-archive-o custom”></i>
<i class=”fa fa-file-audio-o custom”></i>
<i class=”fa fa-file-code-o custom”></i>
<i class=”fa fa-file-excel-o custom”></i>
<i class=”fa fa-volume-down custom”></i>
<i class=”fa fa-file-movie-o custom”></i>
<i class=”fa fa-file-pdf-o custom”></i>
<i class=”fa fa-file-photo-o custom”></i>
<i class=”fa fa-file-picture-o custom”></i>
<i class=”fa fa-file-powerpoint-o custom”></i>
<i class=”fa fa-file-sound-o custom”></i>
<i class=”fa fa-file-video-o custom”></i>
<i class=”fa fa-file-word-o custom”></i>
<i class=”fa fa-file-sound-o custom”></i>
<i class=”fa fa-file-video-o custom”></i>
<i class=”fa fa-file-word-o custom”></i>
<i class=”fa fa-file-zip-o custom”></i>
<i class=”fa fa-film custom”></i>
<i class=”fa fa-filter custom”></i>
<i class=”fa fa-fire custom”></i>
<i class=”fa fa-fire-extinguisher custom”></i>
<i class=”fa fa-flag custom”></i>
<i class=”fa fa-flag-checkered custom”></i>
<i class=”fa fa-flag-o custom”></i>
<i class=”fa fa-flash custom”></i>
<i class=”fa fa-flask custom”></i>
<i class=”fa fa-flask custom”></i>
<i class=”fa fa-folder custom”></i>
<i class=”fa fa-folder-o custom”></i>
<i class=”fa fa-folder-open custom”></i>
<i class=”fa fa-folder-open-o custom”></i>
<i class=”fa fa-frown-o custom”></i>
<i class=”fa fa-volume-off custom”></i>
<i class=”fa fa-gamepad custom”></i>
<i class=”fa fa-gavel custom”></i>
<i class=”fa fa-gear custom”></i>
<i class=”fa fa-gears custom”></i>
<i class=”fa fa-gift custom”></i>
<i class=”fa fa-glass custom”></i>
<i class=”fa fa-globe custom”></i>
<i class=”fa fa-graduation-cap custom”></i>
<i class=”fa fa-group custom”></i>
<i class=”fa fa-hand-grab-o custom”></i>
<i class=”fa fa-hand-lizard-o custom”></i>
<i class=”fa fa-hand-paper-o custom”></i>
<i class=”fa fa-hand-peace-o custom”></i>
<i class=”fa fa-hand-pointer-o custom”></i>
<i class=”fa fa-hand-rock-o custom”></i>
<i class=”fa fa-hand-scissors-o custom”></i>
<i class=”fa fa-hand-spock-o custom”></i>
<i class=”fa fa-hand-paper-o custom”></i>
<i class=”fa fa-hdd-o custom”></i>
<i class=”fa fa-headphones custom”></i>
<i class=”fa fa-heart custom”></i>
<i class=”fa fa-heart-o custom”></i>
<i class=”fa fa-heartbeat custom”></i>
<i class=”fa fa-history custom”></i>
<i class=”fa fa-home custom”></i>
<i class=”fa fa-hotel custom”></i>
<i class=”fa fa-hourglass custom”></i>
<i class=”fa fa-hourglass-start custom”></i>
<i class=”fa fa-hourglass-half custom”></i>
<i class=”fa fa-hourglass-end custom”></i>
<i class=”fa fa-i-cursor custom”></i>
<i class=”fa fa-image custom”></i>
<i class=”fa fa-inbox custom”></i>
<i class=”fa fa-industry custom”></i>
<i class=”fa fa-info custom”></i>
<i class=”fa fa-info-circle custom”></i>
<i class=”fa fa-institution custom”></i>
<i class=”fa fa-key custom”></i>
<i class=”fa fa-keyboard-o custom”></i>
<i class=”fa fa-language custom”></i>
<i class=”fa fa-laptop custom”></i>
<i class=”fa fa-leaf custom”></i>
<i class=”fa fa-legal custom”></i>
<i class=”fa fa-lemon-o custom”></i>
<i class=”fa fa-level-down custom”></i>
<i class=”fa fa-level-up custom”></i>
<i class=”fa fa-life-bouy custom”></i>
<i class=”fa fa-life-ring custom”></i>
<i class=”fa fa-life-saver custom”></i>
<i class=”fa fa-lightbulb-o custom”></i>
<i class=”fa fa-line-chart custom”></i>
<i class=”fa fa-location-arrow custom”></i>
<i class=”fa fa-lock custom”></i>
<i class=”fa fa-magic custom”></i>
<i class=”fa fa-magnet custom”></i>
<i class=”fa fa-mail-forward custom”></i>
<i class=”fa fa-mail-reply custom”></i>
<i class=”fa fa-mail-reply-all custom”></i>
<i class=”fa fa-male custom”></i>
<i class=”fa fa-map custom”></i>
<i class=”fa fa-map-marker custom”></i>
<i class=”fa fa-map-o custom”></i>
<i class=”fa fa-map-pin custom”></i>
<i class=”fa fa-map-signs custom”></i>
<i class=”fa fa-meh-o custom”></i>
<i class=”fa fa-microphone custom”></i>
<i class=”fa fa-microphone-slash custom”></i>
<i class=”fa fa-minus custom”></i>
<i class=”fa fa-minus-circle custom”></i>
<i class=”fa fa-minus-square custom”></i>
<i class=”fa fa-minus-square-o custom”></i>
<i class=”fa fa-mobile custom”></i>
<i class=”fa fa-money custom”></i>
<i class=”fa fa-moon-o custom”></i>
<i class=”fa fa-mortar-board custom”></i>
<i class=”fa fa-motorcycle custom”></i>
<i class=”fa fa-mouse-pointer custom”></i>
<i class=”fa fa-music custom”></i>
<i class=”fa fa-users custom”></i>
<i class=”fa fa-object-group custom”></i>
<i class=”fa fa-object-ungroup custom”></i>
<i class=”fa fa-paint-brush custom”></i>
<i class=”fa fa-paper-plane custom”></i>
<i class=”fa fa-paper-plane-o custom”></i>
<i class=”fa fa-paw custom”></i>
<i class=”fa fa-pencil custom”></i>
<i class=”fa fa-pencil-square custom”></i>
<i class=”fa fa-pencil-square-o custom”></i>
<i class=”fa fa-phone custom”></i>
<i class=”fa fa-phone custom”></i>
<i class=”fa fa-photo custom”></i>
<i class=”fa fa-picture-o custom”></i>
<i class=”fa fa-pie-chart custom”></i>
<i class=”fa fa-plane custom”></i>
<i class=”fa fa-volume-up custom”></i>
<i class=”fa fa-plus custom”></i>
<i class=”fa fa-plus-circle custom”></i>
<i class=”fa fa-plus-square custom”></i>
<i class=”fa fa-plus-square-o custom”></i>
<i class=”fa fa-power-off custom”></i>
<i class=”fa fa-print custom”></i>
<i class=”fa fa-puzzle-piece custom”></i>
<i class=”fa fa-qrcode custom”></i>
<i class=”fa fa-question custom”></i>
<i class=”fa fa-question-circle custom”></i>
<i class=”fa fa-quote-left custom”></i>
<i class=”fa fa-quote-right custom”></i>
<i class=”fa fa-random custom”></i>
<i class=”fa fa-recycle custom”></i>
<i class=”fa fa-refresh custom”></i>
<i class=”fa fa-registered custom”></i>
<i class=”fa fa-remove custom”></i>
<i class=”fa fa-reorder custom”></i>
<i class=”fa fa-reply custom”></i>
<i class=”fa fa-reply-all custom”></i>
<i class=”fa fa-retweet custom”></i>
<i class=”fa fa-road custom”></i>
<i class=”fa fa-anchor custom”></i>
<i class=”fa fa-rss custom”></i>
<i class=”fa fa-rss-square custom”></i>
<i class=”fa fa-search custom”></i>
<i class=”fa fa-search-minus custom”></i>
<i class=”fa fa-search-plus custom”></i>
<i class=”fa fa-send custom”></i>
<i class=”fa fa-send-o custom”></i>
<i class=”fa fa-server custom”></i>
<i class=”fa fa-share custom”></i>
<i class=”fa fa-share-alt custom”></i>
<i class=”fa fa-share-alt-square custom”></i>
<i class=”fa fa-share-alt-o custom”></i>
<i class=”fa fa-shield custom”></i>
<i class=”fa fa-ship custom”></i>
<i class=”fa fa-shopping-cart custom”></i>
<i class=”fa fa-sign-in custom”></i>
<i class=”fa fa-sign-out custom”></i>
<i class=”fa fa-signal custom”></i>
<i class=”fa fa-sitemap custom”></i>
<i class=”fa fa-sliders custom”></i>
<i class=”fa fa-smile-o custom”></i>
<i class=”fa fa-warning custom”></i>
<i class=”fa fa-sort custom”></i>
<i class=”fa fa-sort-alpha-asc custom”></i>
<i class=”fa fa-sort-alpha-desc custom”></i>
<i class=”fa fa-sort-asc custom”></i>
<i class=”fa fa-sort-desc custom”></i>
<i class=”fa fa-sort-down custom”></i>
<i class=”fa fa-sort-numeric-asc custom”></i>
<i class=”fa fa-sort-numeric-desc custom”></i>
<i class=”fa fa-sort-up custom”></i>
<i class=”fa fa-space-shuttle custom”></i>
<i class=”fa fa-spinner custom”></i>
<i class=”fa fa-spoon custom”></i>
<i class=”fa fa-square custom”></i>
<i class=”fa fa-square-o custom”></i>
<i class=”fa fa-star custom”></i>
<i class=”fa fa-star-half custom”></i>
<i class=”fa fa-star-half-empty custom”></i>
<i class=”fa fa-star-half-full custom”></i>
<i class=”fa fa-star-half-o custom”></i>
<i class=”fa fa-star-o custom”></i>
<i class=”fa fa-sticky-note custom”></i>
<i class=”fa fa-sticky-note-o custom”></i>
<i class=”fa fa-street-view custom”></i>
<i class=”fa fa-suitcase custom”></i>
<i class=”fa fa-sun-o custom”></i>
<i class=”fa fa-support custom”></i>
<i class=”fa fa-tablet custom”></i>
<i class=”fa fa-tachometer custom”></i>
<i class=”fa fa-tag custom”></i>
<i class=”fa fa-tags custom”></i>
<i class=”fa fa-tasks custom”></i>
<i class=”fa fa-taxi custom”></i>
<i class=”fa fa-television custom”></i>
<i class=”fa fa-terminal custom”></i>
<i class=”fa fa-thumb-tack custom”></i>
<i class=”fa fa-thumbs-down custom”></i>
<i class=”fa fa-ticket custom”></i>
<i class=”fa fa-times custom”></i>
<i class=”fa fa-times-circle custom”></i>
<i class=”fa fa-times-circle-o custom”></i>
<i class=”fa fa-tint custom”></i>
<i class=”fa fa-toggle-down custom”></i>
<i class=”fa fa-toggle-left custom”></i>
<i class=”fa fa-toggle-off custom”></i>
<i class=”fa fa-toggle-on custom”></i>
<i class=”fa fa-toggle-right custom”></i>
<i class=”fa fa-toggle-up custom”></i>
<i class=”fa fa-trademark custom”></i>
<i class=”fa fa-tras custom”></i>
<i class=”fa fa-trash-o custom”></i>
<i class=”fa fa-tree custom”></i>
<i class=”fa fa-trophy custom”></i>
<i class=”fa fa-truck custom”></i>
<i class=”fa fa-wheelchair custom”></i>
<i class=”fa fa-tv custom”></i>
<i class=”fa fa-umbrella custom”></i>
<i class=”fa fa-university custom”></i>
<i class=”fa fa-unlock custom”></i>
<i class=”fa fa-unlock-alt custom”></i>
<i class=”fa fa-unsorted custom”></i>
<i class=”fa fa-upload custom”></i>
<i class=”fa fa-user custom”></i>
<i class=”fa fa-user-plus custom”></i>
<i class=”fa fa-user-secret custom”></i>
<i class=”fa fa-user-times custom”></i>
Android PHP MySQL 예제(Windows 서버) – 데이터베이스에 데이터 입력하기
Mobile App

Android PHP MySQL 예제(Windows 서버) – 데이터베이스에 데이터 입력하기

 

Click the link to read the article: Read the article …

Beginner’s Guide to Installing Magento 2 using Composer
Magento 2

Beginner’s Guide to Installing Magento 2 using Composer

Beginner’s Guide to Installing Magento 2 using Composer

If you’re new to Composer or package managers like Node’s NPM then you’ve got a lot to take in before you start working with Magento 2. You see, Magento 2 is dependent on Composer and all of its package/dependency goodness.

It’s true that Magento and several other developers have written articles detailing what I’m about to go through, but I decided to write this for the absolute beginner with deeper explanation of what is going on throughout the steps – particularly the role of Composer.

STEP 1: SERVER ENVIRONMENT

Magento 2 has new minimum requirements of your LAMP stack. I’m not going to list them here in case they change so please check the Magento 2 documentation for those prerequisites. A Vargrant setup is preferable but MAMP Pro can also work.

STEP 2: COMPOSER

If you’re unaware of what composer is then try this analogy. Composer is exactly like…. a composer. In this case Magento 2 is a musical and the packages installed are the members of the orchestra. Once installed in your project, Composer can be used to manage packages based on its dependency system. You can’t have a live musical without the orchestra and you can’t have Magento 2 without its packages. In both cases the composer is responsible for assembling components to allow the rest to work.

Fire up your command line tool and navigate to an empty folder where you’d like to install your copy of Magento 2. We need to ensure Composer is installed globally on your system so that you don’t have to repeat this step again.

Type the following command to see if composer is installed:

composer -help

If it’s not installed you’ll see the response command not found, which means you need to install Composer. Luckily it’s as simple as running the following two commands:

mv composer.phar /usr/local/bin/composer

The first command installs Composer into your local directory, the second will move the composer.phar file to a directory where it can be accessed globally by your system.

If you run the original command again you should see that Composer is installed and ready:

Install Composer

STEP 3: CLONE MAGENTO 2

To clone Magento CE 2 into your current directory run the Git following command:

It will clone the repo into a magento2 subdirectory, and this should take about 2-3 minutes depending on your broadband speed. Once it’s done run the following command to move into the Magento 2 root directory and checkout the master branch.

cd magento2
git checkout master

In order to work with Composer a project must have a composer.json file within its root directory. If you take a look at the file you’ll see a huge list of Magento 2 package dependencies. I’ve picked out first three below:

  • require: a list of packages (and versions) required by Magento 2. Magento 2 will not install if  any of those package dependencies are not met.
  • require-dev: a list of packages required by Magento 2 for development (includes running units tests, hence why PHPUnit is in there)
  • replace: shows a list of packages that are replaced by Magento 2, which is mostly made up of the main modules that make up the Magento 2 framework – this allows developers to fork specific packages with improved or customised code

To run Composer for the first time and install your packages simply run:

composer install

When upgrades become available you can install future updates by using:

composer update

The beauty is that upgrades will only run if Composer identifies a package’s dependencies can be met meaning the stack should always run smoothly.

Vagrant users should not find this a problem, however you may encounter missing PHP extensions when you install Composer, such as:

  • The requested PHP extension ext-mcrypt * is missing from your system.
  • The requested PHP extension ext-intl * is missing from your system.

For MAMP users, you can get around this by creating a symlink of your system’s PHP version to MAMPs. Firstly find out your PHP location:

which php // returns for example: /usr/bin/php

And then create the symlink:

sudo mv /usr/bin/php /usr/bin/php.bak
sudo ln -s /Applications/MAMP/bin/php/php5.6.10/bin/php /usr/bin/php

When Composer has finished its install you’ll be ready to install Magento. You can do this via command line, with Composer or through the installer interface.

STEP 4: INSTALL MAGENTO 2

The installer interface is better looking than before and it checks your server ‘readiness’ before allowing you to proceed with the install.

Magento Install

Follow the process and once  fully installed you’re ready to go.

Configure Gmail SMTP in Magento 2
Magento 2

Configure Gmail SMTP in Magento 2

Configure Gmail SMTP in Magento 2

Click the link to read the article: Read the article

=====

We will give you simple instruction How to setup Gmail SMTP service for Magento 2 It’s time to say farewell to procrastination sending email, we know it’s hurt that the default SMTP mode can not quite manage to set all the things in its right place, fact brings the truth that tons of sending mail was sent straightly to the… spam box, not customer’s inbox

The guide is pretty simple and everyone, no matter you’re a newbie or veteran, can accomplish it easily and quickly. This guide will use Mageplaza SMTP extension to configure this setup. It’s free extension so there’s no risk to try out this new advanced modules. You can download it in Github and the installation guide can be found at this Documentation.

OVERVIEW

Step 1: Create and setup Gmail Account

Step 2: Setup Gmail SMTP for Magento 2

Be sure you’ve installed SMTP for Magento 2 by Mageplaza successfully. Here we go

STEP 1. Create and setup Gmail account

  • Login to your Gmail account, go to My account > Sign-in&Security > Connected Apps and Sites Be sure Allow less secure apps is ON.

gmailsecurity

  • In the Setting page, make some minor change on Forwarding and POP/IMAP. Basically we will turn POP/IMAP on at this step
    • In POP Download, with 1. Status choose Enable POP for all email
    • In MAP Access, choose enable IMAP
    • Click Save changes at the bottom

POP/IMAP

STEP 2. Setup Gmail SMTP for Magento 2

  • Back to Magento Admin, make your way from Mageplaza > SMTP > Configuration. Expand General Configuration, choose Yes to turn Mageplaza SMTP on

general

  • Expand SMTP Configuration Option, complete these following steps

SMTPconfigurationoption

  • In the SMTP Provider field, choose Gmail (choose other if you’re using it)
  • Click Auto Fill button to fill Host, Port, Authentication and Protocol will be automatically filled up to match Gmail provider you had chosen.
  • In the Username and Password field, fill the gmail account you just have setup in the mentioned STEP 1.
  • In Test Email Recipient, enter the email you want to sent to. A successful report will show up if thing worked properly.

testrecipient

And now you have done with the set up SMTP in Magento 2 with Gmail provider!

Magento 2 file/folder permissions setting
Magento 2

Magento 2 file/folder permissions setting

Magento 2 file/folder permissions setting

Click the link to read the article: Read the article

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

Magento 2 has a big change compared to Magento 1. Therefore, Magento 1 users have little difficulty when switching to Magento 2. What are the correct file and folder permissions for Magento 2 and How to set Magento 2 file/folder permissions?

We recommend setting the permissions of file/folder in Magento 2 as below:

  • All directories have 770 permissions.
  • 770 permissions give full control (read/write/execute) to the owner and to the group and no permissions to anyone else.
  • All files have 660 permissions.
  • 660 permissions means the owner and the group can read and write but other users have no permissions.

That’s mean:

  • The owner of the Magento file system: Must have full control (read/write/execute) of all files and directories.
  • Must not be the web server user; it should be a different user.
  • The web server user must have to write access to the following files and directories: var app/etc pub
  • In addition, the web server’s group must own the Magento file system so that the Magento users (who are in the group) can share access to files with the web server user. (This includes files created by the Magento Admin or other web-based utilities.)

Setting file/folder commands in Magento 2

find . -type f -exec chmod 644 {} \;                        // 644 permission for files

find . -type d -exec chmod 755 {} \;                        // 755 permission for directory 

find ./var -type d -exec chmod 777 {} \;                // 777 permission for var folder    

find ./pub/media -type d -exec