작업환경

OS macOS Mojave 10.14.5
CPU i7 2.5Ghz
RAM 16G

 

작업목표

SaltStack 테스트 환경 구축

- 1개의 마스터와 2개의 미니언의 핑 테스트 및 네트워크의 이해를 도모한다. 

 


1. Oracle VirtualBox 설치

https://www.virtualbox.org/wiki/Downloads

 

Downloads – Oracle VM VirtualBox

Download VirtualBox Here you will find links to VirtualBox binaries and its source code. VirtualBox binaries By downloading, you agree to the terms and conditions of the respective license. If you're looking for the latest VirtualBox 5.2 packages, see Virt

www.virtualbox.org

2. CentOS7 다운로드

http://mirror.kakao.com/centos/7/isos/x86_64/

 

CentOS Mirror

 

mirror.kakao.com

 

 

3. 포트개방

//bash
# vi /etc/ssh/sshd_config

#Port 22 주석해제

방화벽해제

//bash
# firewall-cmd --permanent --zone=public --add-port=22/tcp

 

재부팅

//bash
# reboot

 

yum을 통한 네트워크 설치 

//bash
# yum install nano wget curl net-tools lsof bash-completion

 

네크워크 확인

//bash
# ifconfig

 

'Infrastructure' 카테고리의 다른 글

Network  (0) 2020.01.22
[Linux/Centos7] 자주쓰는 기본 명령어  (0) 2020.01.12
[Linux]CentOS7 콘솔 키보드 조작  (0) 2020.01.08
[Linux] CentOS7 디렉토리 역할  (2) 2020.01.08
[Linux] CentOS7 네트워크 설정하기  (0) 2020.01.07

1. 넥슨 넥슨고딕, 배찌체, 풋볼고딕, 메이플 무료배포 (상업적 이용가능)

넥슨고딕 Lv.1
넥슨 고딕 Lv2
넥슨 배찌체
넥슨 풋볼고딕체
넥슨 메이플체

저작권

 

링크

http://levelup.nexon.com/font/index.aspx

 

>NEXON LEVEL UP (레벨업) – 넥슨 브랜드 인벤토리

LEVEL UP의 첫 단계로 게임에서 경험했던 느낌을 서체에 담아 표현했습니다. 서체의 기능적인 부분 외에도 즐거운 경험들을 전달하고자 하는 또 다른 도전의 시작입니다.

levelup.nexon.com


2. 네이버 나눔손글씨 109종 무료배포 (상업적 이용가능)

저작권

  • 나눔손글씨 글꼴은 기업 및 단체 또는 개인 누구나 무료로 사용할 수 있습니다.
    다만, 나눔손글씨 글꼴 파일을 유상으로 제공, 판매, 배포하는 것은 금지됩니다.
  • 한글날 손글씨 공모전 참여 시 입력한 글꼴명 및 글꼴 소개말은 임의로 변경되었을 수 있습니다.
  • 본 페이지에서 제공하는 글꼴의 무료 제공 기간은 당사의 사정에 따라 예고 없이 변동될 수 있습니다.

링크

https://clova.ai/handwriting

 

새로운 나눔손글씨 글꼴 - 네이버 클로바

한글한글 아름답게 캠페인과 함께합니다.

clova.ai


3. 빙그레 메로나체 무료배포 (상업적 이용가능)

저작권

빙그레체의 지적 재산권은 빙그레(www.bing.co.kr)에 있습니다.
빙그레체는 개인 및 기업 사용자를 포함한 모든 사용자에게 무료로 제공합니다.
단, 대한민국 외에서 빙그레체를 다운받거나 사용하고자 하는 경우 이러한 복제 및 사용과 관련하여는
반드시 당사의 사전 허락을 받아야 하며, 당사의 사전 허락 없는 대한민국 외에서의 복제 및 사용은 허락되지 않습니다.

 

빙그레체는 인쇄물, 광고물, 온라인 등 상업적 목적으로 사용할 수 있습니다.

단, 글꼴 자체를 유료로 판매하는 것은 금지하며 빙그레체는 수정 및 재배포를 할 수 없으며, 배포되는 형태 그대로 사용해야 합니다.

빙그레체를 사용한 인쇄물, 광고물(온라인 포함)의 이미지는 빙그레 프로모션을 위해
활용될 수 있으므로, 빙그레체의 사용시 이러한 활용에 동의하는 것으로 간주됩니다.

이를 원치 않는 사용자는 언제든지 당사에 협의를 요청하실 수 있습니다.


문의(www.bing.co.kr)

 

인쇄 브로슈어, 카탈로그, DM, 전단지, 포스터, 패키지, 캘린더 등 인쇄물 O
책, 만화책, 잡지, 정기간행물, 신문 등 출판물 O
간판, 현수막, 판넬 등 제작물 O
신문광고, 잡지광고, 차량광고 등 광고물 O
신문 제목 및 텍스트 O
인쇄 및 문서 공유를 위한 PDF 파일 제작 O
CI/BI 회사명, 브랜드명, 상품명, 로고, 마크, 슬로건, 캐치프레이즈 X
웹사이트 웹페이지, 광고배너, 메일, 웹툰, E-카달로그 O
웹서버용 폰트 O
영상 방송 및 영상물 자막 O
TV-CF, 온라인 영상광고 O
영화(DVD / 비디오), 오프닝, 엔딩크레딧 자막 O
개인 UCC 및 홍보물 O
E-Learning 콘텐츠, 온라인 동영상강좌, 플래시 강좌 등 O
디바이스 모바일, MP3, PMP, 내비게이션, 셋탑박스, 게임기 등 디바이스 내 탑재 O
어플리케이션 GUI디자인 등 O
전광판 및 안내시스템, ATM기기 등 O
서버 서버 탑재 후 웹서비스 및 프로그램 내 서비스(게임 등) O
E-BOOK E-Book 기기 내 UI 제작, 폰트탑재 O
도서 및 잡지 등을 E-Book 콘텐츠(ePUB, PDF)로 변환 서비스 O
임베이팅 폰트파일 임베이딩 서비스 O
기타 직접 판매 목적의 이미지 제작(2차 제작결과물) O
스템프, T셔츠 등 서체 디자인이 직접 활용된 상품 제작 O

 

링크

http://www.bing.co.kr/story/contribute_font

 

빙그레

다양한 맛과 행복으로 모두 하나되는 세상

www.bing.co.kr


4. 배달의민족 을지로체 무료배포 (상업적 이용가능)

저작권 - 배달의민족 폰트 라이선스

배달의민족 한나체, 한나체 Air, 한나체 Pro, 주아체, 도현체, 연성체, 기랑해랑체, 을지로체의 지적 재산권은 ㈜우아한형제들에 있습니다. 배달의민족 한나체, 한나체 Air, 한나체 Pro, 주아체, 도현체, 연성체, 기랑해랑체, 을지로체는 개인 및 기업 사용자를 포함한 모든 사용자에게 무료로 제공되며 자유롭게 수정하고 재배포하실 수 있습니다.

 

단, 글꼴 자체를 유료로 판매하는 것은 금지하며, 배달의민족 한나체, 한나체 Air, 한나체 Pro, 주아체, 도현체, 연성체, 기랑해랑체, 을지로체는 본 저작권 안내와 라이선스 전문을 포함해서 다른 소프트웨어와 번들하거나 재배포 또는 판매가 가능합니다. 배달의민족 한나체, 한나체 Air, 한나체 Pro, 주아체, 도현체, 연성체, 기랑해랑, 을지로체체 라이선스 전문을 포함하기 어려울 경우, 배달의민족 한나체, 한나체 Air, 한나체 Pro, 주아체, 도현체, 연성체, 기랑해랑체, 을지로체의 출처 표기를 권장합니다. 예) 이 페이지에는 우아한형제들에서 제공한 배달의민족 한나체, 한나체 Air, 한나체 Pro, 주아체, 도현체, 연성체, 기랑해랑체, 을지로체가 적용되어 있습니다.

 

배달의민족 한나체, 한나체 Air, 한나체 Pro, 주아체, 도현체, 연성체, 기랑해랑체, 을지로체를 사용한 인쇄물, 광고물(온라인 포함)의 이미지는 우아한형제들(배달의민족) 프로모션을 위해 활용될 수 있습니다. 이를 원치 않는 사용자는 언제든지 당사에 요청하실 수 있습니다. 정확한 사용 조건은 아래 배달의민족 한나체, 한나체 Air, 한나체 Pro, 주아체, 도현체, 연성체, 기랑해랑체, 을지로체 라이선스 전문을 참고하시기 바랍니다.

 

링크

https://www.woowahan.com/#/fonts

 

우아한형제들

좋은 음식을 먹고 싶은 곳에서~! 우아한 사람들이 모여 우와하게 일하는 '우아한형제들'입니다.

www.woowahan.com


5. 윤디자인 & SBS런닝맨 전소민체 3개월간 무료배포 ( 3개월간 상업적 이용가능)

 

저작권

- 런닝맨 전소민체 글꼴 파일의 저작권은 SBS와 전소민, (주)윤디자인그룹에 있습니다.

- 런닝맨 전소민체 폰트 파일은, 3개월(2019.10.06 ~ 2020.01.05) 동안 무료로 제공하며, 

  별도의 승인 없이 인쇄, 출판, 영상, 웹 모바일 등 다양한 매체에서 상업적 목적으로도 자유롭게 사용이 가능합니다.

  (단, 해당 글꼴을 변형하거나 폰트 파일 자체를 유료로 판매 또는 대여할 수 없으며 유해매체에서의 사용은 금지합니다)

- 런닝맨 전소민체 폰트를 사용한 인쇄물, 광고물(온라인 포함)의 이미지는 폰트 파일 저작권자의 홍보, 프로모션을 위해 활용될 수 있음에 동의합니다.

- 전소민체 폰트 파일 저작권에 대하여, 궁금한 사항이 있으시면 담당자(02-2287-6708)에게 연락 주시기 바랍니다.

 

사용불가

- 폰트 파일의 수정 및 변형(디지털포맷 변경)을 포함한 개작, 개명을 통한 사용

- 별도 허락없이 임의로 재배포 및 유료양도 / 재판매 등의 상업적 행위 및 성인물, 도박물 등 유해매체에서의 사용

- 위 사항을 위반하는 경우, 위반 당사자는 저작권 침해에 따른 일체의 민형사상의 책임을 부담합니다.

 

링크

https://programs.sbs.co.kr/enter/runningman/board/52887/?cmd=view&page=1&board_no=3191&board_notice=Y

 

런닝맨

매주 일요일 오후 5시

programs.sbs.co.kr


6. GS칼텍스 + 다온폰트 독립서체 무료배포

저작권

- 폰트개발사나 GS미디어허브에 저작권이 기술되어 않았습니다. (19. 10. 9 기준)

- 대기업들의 경우 개인/기업의 비영리/영리 목적과는 상관없이 배포합니다만,

- 이와 같은 경우에도 주의하셔야합니다. 넥슨같은 상업적 불가한 폰트가 있기때문입니다.

- GS미디어허브에서 일부 발췌하여 게시하오니 자유롭게 판단하시어 사용하시길 바랍니다.

 

발췌문

GS칼텍스, 독립운동가 손글씨 서체를 만들다

GS칼텍스는 올해 삼일절과 대한민국 임시정부 수립 100주년을 맞이해 ‘독립서체’ 캠페인을 진행하고 있습니다. 과거 독립운동을 지원했던 GS그룹 이념에 기반하여 파편적인 기록으로 남아있는 일부 독립운동가분들의 글씨체를 모아 연구, 전문 폰트 개발업체와 협업, 당시의 글씨체를 현대에 맞게 복원하여 디지털 폰트로 제작하였습니다. 이는 독립운동가의 필체를 디지털로 복원하여 독립운동가의 독립정신과 독립운동의 위대함을 계승하고자 함입니다.


독립서체 1차 캠페인을 통해 삼일절 100주년을 기념하여, 독립운동가 한용운 서체와 윤봉길 서체를 개발/무료 배포하였고, 독립서체 2차 캠페인에서는 백범 김구 서체와 윤동주 서체(별 헤는 밤 & 서시 두 가지 버전)를 개발하여 무료 배포 중에 있습니다.

독립운동가분들의 정신과 마음이 담긴 글씨체를 다운받아 직접 사용해보며, 독립운동가분들의 나라를 위한 희생정신과 아름다운 마음을 다시 한 번 되새겨 보시길 바랍니다

 

링크

https://gscaltexmediahub.com/campaign/the-energy-of-independence-fighters-2/

 

독립운동가 글씨체를 내 손으로, '독립서체' : 윤봉길, 윤동주, 백범김구, 한용운

GS칼텍스는 올해 삼일절과 대한민국 임시정부 수립 100주년을 맞이해 의미 있는 날을 기념하기 위해 '독립서체' 캠페인을 진행하고 있습니다. 과거 독립운동을 지원했던 GS그룹 이념에 기반하여 파편적인 기록으로 남아있는 일부 독립운동가분들의 글씨체를 모아 연구, 전문 폰트 개발업체와 협업, 당시의 글씨체를 현대에 맞게 복원하여 디지털 폰트로 제작하였습니다. 이는 독립운동가의 필체를 디지털로 복원하여 독립운동가의 독립정신과 독립운동의 위대함을 계승하고자 함입

gscaltexmediahub.com


7. 리디북스 리디폰트 무료배포 (상업적 이용가능)

저작권 - 라이선스 안내

리디바탕 글꼴은 개인 및 기업 사용자를 포함한 모든 사용자에게 무료로 제공되며 자유롭게 수정하고 재배포하실 수 있습니다. 단, 글꼴 자체를 유료로 판매하는 것은 금지하며, 리디바탕 글꼴은 본 저작권 안내와 라이선스 전문을 포함해서 다른 소프트웨어와 번들하거나 재배포 또는 판매가 가능합니다. 라이선스 전문을 포함하기 어려울 경우, 리디바탕 글꼴의 출처 표기를 권장합니다. 예) 이 페이지는 리디주식회사에서 제공한 리디바탕 글꼴이 사용되어 있습니다.

 

This Font Software is licensed under the SIL Open Font License, Version 1.1.

리디바탕의 저작권은 리디주식회사가 소유하고 있습니다.

 

링크

https://www.ridicorp.com/branding/fonts/ridibatang/

 

리디바탕

더 선명하고, 긴 문장도 잘 읽을 수 있는 전자책 전용 글꼴 리디바탕을 소개합니다.

www.ridicorp.com


8. 데브시스터즈 쿠키런폰트 무료배포 (상업적 이용가능)

저작권 - CookieRun Font. LICENSE

'쿠키런 글꼴'의 지식 재산권은 데브시스터즈(주)에 있습니다.

'쿠키런 글꼴'은 개인 및 기업 사용자를 포함한 모든 사용자에게 무료로 제공되며

자유롭게 사용할 수 있습니다.

'쿠키런 글꼴'은 온/오프라인, 상품, 광고 등 상업적 목적으로 사용할 수 있습니다.

단, '쿠키런 글꼴' 자체를 유료로 판매하거나, 어떠한 형태로든 임의 수정 및

개작하여 글꼴을 재배포 하는 것은 금지합니다.

'쿠키런 글꼴'은 배포되는 형태 그대로 사용해야 합니다.

쿠키런 IP를 상징하는 쿠키런 딩벳 10자1)의 경우 상업적 목적으로 사용할 수 없으며,

비상업적인 용도에 한해 사용이 가능합니다. 그리고, 어떠한 형태로든 임의 수정 및

개작은 금지합니다.

'쿠키런 글꼴'은 본 저작권 안내와 라이선스 전문을 포함해서

다른 소프트웨어에 임베딩 및 번들하거나 재배포가 가능합니다.

라이선스 전문을 포함하기 어려울 경우 ‘쿠키런 글꼴'의 출처 표기를 권장합니다.

예) 이 페이지에는 데브시스터즈에서 제작한 ‘쿠키런 글꼴’이 적용되어 있습니다.

'쿠키런 글꼴'을 사용한 온/오프라인, 상품, 광고 등 모든 종류의 창작물은

쿠키런 및 데브시스터즈 프로모션을 위해 활용될 수 있습니다.

이를 원치 않는 사용자는 언제든지 당사에 요청하실 수 있습니다.

Update: 2019.09.20

 

문의: bxdesign@devsisters.com

 

링크

https://www.cookierunfont.com/

 

CookieRun Typeface

쿠키런 글꼴을 이제 웹에서도 즐기세요.

www.cookierunfont.com


9. YES24 예스체 무료배포 (상업적 이용가능)

 

저작권

  • TTF(True Type Font)는 윈도우OS용, OTF(Open Type Font)는 맥OS용으로 사용하시면 됩니다.
  • 예스 명조, 예스 고딕은 11월 이후 배포될 예정입니다.
  • 예스24 서체(예스체, 예스 명조, 예스 고딕)의 저작권은 예스24에 있습니다.
  • 예스24 서체는 개인 및 기업 사용자를 포함한 모든 사용자에게 무료로 제공됩니다.
  • 단, 글꼴 자체를 유료로 판매하는 것을 금지하며 해당 글꼴에 대한 변형 및 재배포를 할 수 없습니다.
  • 예스24 서체를 사용한 기업의 CI/BI(회사명, 브랜드명, 상품명, 로고, 마크 등)의 제작을 금지합니다.

링크

http://www.yes24.com/campaign/00_corp/2019/0930Yesfont.aspx

 

YES24 한글날 맞이 예스체 무료 다운로드 안내

다양한 감성을 아우를 수 있는 YES24만의 공간을 표현한 예스체를 지금 만나보세요!

www.yes24.com


10. (주)디자인210 정속언해 무료배포 (상업적 사용가능)

저작권

  • 사용범위  제한없음
  • 사용기한  기한없음
  • 사용대상  누구나
  • 사용자수  제한없음
기본라이선스 문서/서식 문서제작, 일반문서, 단체 내부 문서, 홍보문서, 배포문서, 시험지, 교재, 리포트, 판매용 서식 제작, 사내 배포용 프리젠테이션, 증서, 원서, 각종 신고서, 단체 내부 서식, 공문 서식, 배포 서식 O
인쇄/출력 일반잡지, 교양지, 전문지, 대학지, 학회지, 중앙지(일간, 스포츠, 시사지), 지방지, 무가지, 대학신문사보, 참고서, 학습지, 교과서, 만화책, 간행물, 단행본, 자료집, 브로슈어, 리플렛, 팜플렛, 카다로그포스터, 전단지, 제품포장지, 제품포장패키지(제품포장), 샘플북, 포장지, 엽서, 카드, 연하장, 현수막, 사용설명서, 메뉴판, 봉투, 쿠폰, DM, 소식지, 뉴스, 뉴스레터, 각종 리포트, 보고서, 각종자료작성, 명함, 달력, 캘린더 O
웹사이트 웹페이지 이미지 제작 일체, 이미지배너, 배너광고(영상배너 제외), 이메일, 웹진, 웹툰, SNS, 메신져 등의 모바일 홍보 마케팅용 이미지 제작 O
옥내외광고라이선스 옥내외광고물 옥내외 사인(비상구안내, 학교교식표시, 각종 안내 등), 옥내외 간판(벽면간판, 돌출간판 등), 옥내외 공공 시설물 안내판, 옥상 간판(광고탑, 광고판, 옥탑광고, 야립간판 등), 교통시설 및 교통수단을 이용한 광고물(지하도, 철도역, 지하철역, 공항, 버스, 지하철, 택시, 기차 등), 디지털 광고물 (DID, 전자POP, 매장내 거치형 광고물 / 이미지만 가능), 일반 단독 간판 O
분야별라이선스 영상 일반 동영상, 온라인 배너 영상물, 홍보 영상물, 메이킹 영상물, 뮤직 비디오, 영화 본편 및 예고편, 영상 컨텐츠 제작물 등 모든 형태의 광고영상물, 공중파, 케이블 등 방송 자막 일체, 공중파·케이블·지역방송 등 TV CF, 극장 CF, 온라인 CF, 디지털광고물(DID, 전자POP, 매장내 거치형 광고물) O
소프트웨어 무료 배포 및 판매용 앱 UI(이미지만 적용), 광고·홍보 등 마케팅용 앱 UI(이미지만 적용), 각종 스마트폰 어플리케이션 UI(이미지만 적용), OS·유틸리티·응용 프로그램 및 소프트웨어 UI(이미지만 적용), 무료 배포 및 판매용 게임 UI(이미지만 적용), 광고·홍보 등 마케팅용 게임 UI(이미지만 적용), 비디오게임·온라인 라이브 게임 UI(이미지만 적용) O
이북(pdf, epub)/이러닝 교육용 자료, 동영상 강좌, 플래시 강좌, 기타 이러닝 제작 및 서비스 컨텐츠, 웹진, 앱진, 인터넷신문, 서적, 학습지, 교과서, 등 전자형식의 도서, 잡지, 문서 일체, 모바일기사, 온라인 교육자료 및 사전검색 컨텐츠, 전자 브로슈어, 전자 카다로그, 각종 전자 서비스 컨텐츠, 온라인상 배포 및 게시용 PDF제작물(사용설명, 이용안내, 정품인증서 등) O
CI/BI 사명, 로고, 마크, 슬로건, 캐치프레이즈, 기업 브랜딩 관련 상징물, 브랜드명, 상품명, 각종 패키지 디자인 제작물(메인 명칭 외에 고정형 보조 문구 포함) O
2차제작물 폰트가 직접적으로 이용되어진 제품 일체(자소 도장, 카드종류, 머그컵, 스티커, 수건, 의류, 기타 생활용품 제작 등)
직접 판매 목적의 이미지 제작, 앨범자켓, 커버디자인(CD/DVD), 문구류, 가사북(각종 템플릿, 콘텐츠 상품, 이모티콘 등)
모형, 시제품, 전시용샘플, 각종 모델형 제작물 등, 3D 프린터 제작물
O
별도라이선스 임베딩 디바이스 탑재, 서버 임베딩, 웹폰트형식, 모바일 앱 및 온라인 게임, 채팅용 등 전 분야 폰트파일 탑재되는 형태 일체 O
제작물용도 개인용 개인용 제작물 O
자사용 자사용 제작물 O
납품용 납품용 제작물 O

링크

https://www.oning.co.kr/ONjeongsokeonhae

 

oning

굵기  3종(가는, 보통, 굵은) 한글  2,350자 영문  94자 약물  982자 파일  TTF, OTF

www.oning.co.kr


11. 생활공작소 미출시

생활공작소가 오피셜블로그를 통해 자신들만의 서체가 완성되었다고 발표하였다.

지난 1년간 윤디자인과 콜라보하여 생활공작소만의 서체가 완성되었다고 하였으나,

아직 절차가 남은 관계로 빠른 시일내에 선보일 예정이라고 한다.

 

저작권

- 미출시 관계로 저작권 정보 획득이 어려움.

 

링크

https://blog.naver.com/livingcrafts/221672643557

 

생활공작소, 한글날 맞아 서체 출시 !

​#생활공작소 #서체 가 완성됐어요 🙌 (with.윤디자인)​2019년 내내, 정성 들여 준비한생활공작소 서체...

blog.naver.com

'Design source' 카테고리의 다른 글

2020 한글날 무료폰트 배포 총정리!!!  (0) 2020.10.09
xcrun 에러  (0) 2020.03.12

특징


동기? 비동기? 그리고 저장 만료일

1. localStorage에서 모든 작업은 동기로 이루어집니다. 즉, 원하는 것을 바로 실행(생성, 수정, 읽기, 삭제)이 된다는 것이죠.

대기시간이 없기때문에 비동기에 비해 쉽고, 편리합니다.

 

2. session, cookie는 저장만료일(expire)이 있습니만, localStorage는 저장만료일이 없습니다.

브라우저 캐쉬, 저장공간 비우기 등등을 활용하여 사용자가 직접 삭제하거나, 개발자가 약간의 세팅을 해주어야 합니다.

저장공간

Mobile 환경에서의 저장공간

  Chrome Android Browser Firefox Safari Safari iOS WebView iOS WebView
  40 4.3 34 6, 7 8 6, 7 8
LocalStorage 10MB 2MB 10MB 5MB 5MB 5MB 5MB

 

Desktop 환경에서의 저장 공간

  Chrome Firefox Safari Safari IE IE
  40 34 6, 7 8 9 10, 11
LocalStorage 10MB 10MB 5MB 5MB 10MB 10MB

하나의 도메인당 5~10MB 정도로 작고 귀여운 용량이지만, 순수한 텍스트로 5MB를 채운다는 건 상상도 못할 일입니다. 

아래 링크는 순수한 텍스트로 이루어진 약 5.6MB크기의 텍스트입니다.(새창열기로 다운로드되지않고 보입니다.)

https://ars.els-cdn.com/content/image/1-s2.0-S0092640X00908349-mmc02.txt

주의점

localStorage에 사용자의 개인신상정보를 저장할 경우 해커에 의해 유출될 수 있습니다.

반드시 보안이 좋고, 안전한 저장공간에 저장하시길 바랍니다.

사용법


#준비물

locaStorage.html, localStorage.js

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  
</body>
<script src="./localStorage.js"></script>
</html>

 

지금부터 localStorage.js 파일을 작성할 것이니 잘 보고 순서대로 따라하시면 금방 습득할 수 있을 것 입니다.

 

1. 저장하기

window.localStorage.setItem("key", "value")

window.localStorage.setItem("myData", "string")

//확인하기
window.localStorage.myData
>>> "stirng"

 

2. 가져오기

window.localStorage.getItem("key")

const getItem = window.localStorage.getItem("myData")

//확인하기
console.log(getItem)
>>> "string"

 

3. 삭제하기

window.localStorage.removeItem("key")

window.localStorage.removeItem("myData")

>>> undefined

 

4. 중요! 에러가 될 수 있는 경우

값이 없는데 undefined 출력되는 경우, chain

window.localStorage.myData

>>> undefined
/*
[3. 삭제하기]에서 myData를 삭제했기때문에  undefined 반환됩니다.
체인으로 접근했을 땐 undefined 뜹니다.
*/

 

값이 없는데 null 출력되는 경우, getItem(key)

window.localStorage.getItem("myData")

>>> null
/*
[3. 삭제하기]에서 myData를 삭제했기때문에  null 반환됩니다.
getItem 함수로 접근했을 땐 null이 반환됩니다.
*/

이렇게 값이 undefined 혹은 null 일 경우, 값을 활용하여 가공을 하는 과정에서 에러가 날 수 있습니다.

 

const myData = window.localStorage.getItem("myData")
myData.filter(v => parseInt(v.score[0]) >= 8)

>>> Uncaught TypeError: Cannot read property 'filter' of null
/*
현재 localStorage에 key들 중 이름이 myData인 것이 없습니다.
그러므로, 변수 myData의 경우 null이 할당됩니다.
배열이 아닌 구조에 filter 메서드를 사용할 경우 오류가 납니다.
*/

localStorage에 원하는 값이 없을 경우를 대비하여 대체할 값이나 혹은 초기값을 반드시 세팅해주어야합니다. 

 

5-1. 응용하기

const defaultMovies = [
  {title: "힘을 내요. 미스터리", score: "8.47"},
  {title: "예스터데이", score: "8.45"},
  {title: "장사리", score: "8.54"},
]

const getMyMovies = window.localStorage.getItem("myMovies")
// window.localStorage에 저장된 값이 없기때문에 getMyMovie에 반환되는 값은 null입니다.

const movies = getMyMovies ? JSON.parse(getMyMovies) : defaultMovies
// 변수 movies는 getMyMovie의 키가 없기 때문에 defaultMovies이 참조됩니다.

const filteredMovies = movies.filter(v => parseInt(v.score[0]) >= 8)
// score가 8.0 이상인 영화를 필터링합니다.

console.log(filteredMovies)
>>> [
  {title: "힘을 내요. 미스터리", score: "8.47"},
  {title: "예스터데이", score: "8.45"},
  {title: "장사리", score: "8.54"},
]

getMyMovies 에는 null 이 들어있습니다. 그러므로 movies 는 defaultMovies를 바라보게 됩니다. defaultMovies의 값을 가지는 movie에 filter메서드를 사용하여 score가 8.0 이상인 영화만 걸러냅니다. defaultMovies의 모든 영화들은 8.0 이상이니 값이 그대로 나옵니다.

 

5-2. 응용하기

// 추가된 코드
const myMovies = [
  {title: "나쁜녀석들", score: "8.37"},
  {title: "타짜", score: "7.05"},
  {title: "양자물리학", score: "8.91"},
]

const defaultMovies = [
  {title: "힘을 내요. 미스터리", score: "8.47"},
  {title: "예스터데이", score: "8.45"},
  {title: "장사리", score: "8.54"},
]

// 추가된 코드
if(myMovies.length > 0){
  window.localStorage.setItem('myMovies', JSON.stringify(myMovies))
}

// myMovies의 사이즈가 0 보다 크다면 데이터가 있는 것으로 판단하고, localStorage 에 저장하게 됩니다.

const getMyMovies = window.localStorage.getItem("myMovies")
const movies = getMyMovies ? JSON.parse(getMyMovies) : defaultMovies
const filteredMovies = movies.filter(v => parseInt(v.score[0]) >= 8)

console.log(filteredMovies)
>>> [
  {title: "나쁜녀석들", score: "8.37"},
  {title: "양자물리학", score: "8.91"},
]

 

6. 최종코드

const myMovies = [
      {title: "나쁜녀석들", score: "8.37"},
      {title: "타짜", score: "7.05"},
      {title: "양자물리학", score: "8.91"},
    ]

const defaultMovies = [
      {title: "힘을 내요. 미스터리", score: "8.47"},
      {title: "예스터데이", score: "8.45"},
      {title: "장사리", score: "8.54"},
    ]

if(myMovies.length > 0){
	window.localStorage.setItem('myMovies', JSON.stringify(myMovies))
}

const getMyMovies = window.localStorage.getItem("myMovies")
const movies = getMyMovies ? JSON.parse(getMyMovies) : defaultMovies
const filteredMovies = movies.filter(v => parseInt(v.score[0]) >= 8)

console.log(filteredMovies)
>>> [
    {title: "나쁜녀석들", score: "8.37"},
    {title: "양자물리학", score: "8.91"},
  ]

 

참조

https://www.html5rocks.com/en/tutorials/offline/quota-research/

https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

'Javascript' 카테고리의 다른 글

transform byte to binary byte or Decimal byte  (0) 2020.08.18
[Browser API] fetch API를 알아보자!  (0) 2020.01.05
[Babel] 사용기(1)  (0) 2019.06.26
파일(Image) 용량을 확인하는 방법_v1  (0) 2019.06.05
배열의 중복값 제거  (0) 2019.04.25

ES6가 원활히 돌아가기 위해서 최신 브라우저가 필요하다.

하지만 모두가 최신 브라우저를 쓰지않기때문에 오래된 문법을 작성할 수 밖에 없는데

Babel은 최신 문법을 사용성이 넓은 범위의 문법으로 변환시켜주기 때문에

실험정신이 있는 개발자에게 필수 플러그인이다.

 

[1] html 코드삽입으로 바벨사용하기

<div id="result"></div>
/* support IE9+ */
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
//babel 을 불러온다.

<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js"></script>
// babel 실행에 필요한 기능을 불러온다.

<script type="text/babel" data-presets="es2015,stage-2">
// type="text/babel" data=presets="es2015, stage-2"
// babel을 사용할 것이고, es2015를 사용할 것이고, stage-2 는 Babel 플러그인의 안정적인 버전이다.

    const hello = (data) => {
        document.querySelector('#result').innerText = data
    }
    
    hello("hello");
</script>

 

 

 

참고: https://babeljs.io/docs/en/

 

Babel · The compiler for next generation JavaScript

The compiler for next generation JavaScript

babeljs.io

 

 

'Javascript' 카테고리의 다른 글

[Browser API] fetch API를 알아보자!  (0) 2020.01.05
[WebAPI] window.localStorage 부시기!  (5) 2019.09.29
파일(Image) 용량을 확인하는 방법_v1  (0) 2019.06.05
배열의 중복값 제거  (0) 2019.04.25
[자료구조]  (0) 2019.04.25

# 설치환경

node
v10.13.0

npm
6.4.1

editor
VScode

 

1. 설치

 

- work path

C:\Users\choi\Desktop\nuxt

 

- npx create-nuxt-app <my-nuxt-app>

npx create-nuxt-app nuxt-app

 

- 설치한내용

? Project name nuxt-app
? Project description My fine Nuxt.js project
? Use a custom server framework express
? Choose features to install Axios
? Use a custom UI framework vuetify
? Use a custom test framework none
? Choose rendering mode Universal
? Author name DaeBeom Choi
? Choose a package manager npm

- 설치요약

express 설치는 서버환경만들어서 Authorization 인증으로 CRUD 테스트 

axios 설치는 nuxt client 랑 express server 간에 편리한 통신

vuetify 설치는 디자인하기 싫어서... (잘 쓰겠습니다.)

 

 

'Frontend' 카테고리의 다른 글

transform hertz unit  (0) 2020.08.18
아코디언 메뉴(업데이트 예정)  (0) 2019.04.12
[jQuery] 최상단, 최하단 바로가기 애니메이트 버튼  (0) 2019.04.11
jQuery를 pure js, vue.js로 바꿔보자  (0) 2019.02.25
뷰 설치  (0) 2019.02.12

파일용량을 확인하는 방법을 두가지를 포스팅할 것이다.

사실 더 많을수도 있고, 알게 되면 더 포스팅 할 예정이다.

첫번째로 <input type="file"> 로 확인하는 방법

두번째로 AJAX 로 확인하는 방법

 

1. <input type="file"> 로 확인하는 방법

대부분 클라이언트에서 업로드할 파일의 용량을 제한하기 위해 사용된다.

 

ps. 본인은 img.src 를 통해 load된 이미지의 크기들을 DOM으로 가져오고 싶었다. 1번 방법아님.

 

1-1. html

<div>
	<input type="file" accept=".jpg, .jpeg, .png, .gif" id="inputFile" multiple>
	<div id="resultFile"></div>
</div>

1-2. javascript

const inputFile = document.querySelector('#inputFile');
const resultFile = document.querySelector('#resultFile');

inputFile.addEventListener('change', function(e) {
    return readURL(this)
}, false);

const readURL = input => {

    // 선택된 파일이 없으면 함수 종료
    if (!(input.files)) return
    
    // 결과창 초기화
    resultFile.innerHTML = "";
    
    // 선택된 파일만큼 반복
    for (let i = 0; i < input.files.length; i++) {
        
        //File정보를 읽을 수 있는 FileReader 호출
        const reader = new FileReader();
		
        //File 불러오기가 끝나면 실행될 함수
        reader.onload = function(e) {
            const img = new Image();
            
            // image파일의 blob 이 생성됨. blob -> 바이너리 오브젝트
            img.src = e.target.result
            
            // 생성된 데이터를 템플릿 문자열에 넣어준다.
            return resultFile.innerHTML +=
                `
                <dl>
                    <dt>${img.outerHTML}</dt>
                    <dd>${input.files[i].name}</dd>
                    <dd>${Math.round((input.files[i].size/1024)) + 'kb'}</dd>
                </dl>
                `;
        }
		
        // readAsDataURL은 Blob, File 을 읽을 수 있다.
        reader.readAsDataURL(input.files[i]);
    }
}

 

2. AJAX 로 확인하는 방법

AJAX로 이미지주소에 있는 이미지를 불러오면, ResponseHeader 객체가 생성되는데

여러 키값중 Content-Length 키, byte 값으로 이미지의 크기가 저장되어있다.

그러니 getResponseHeader()로 Content-Length를 가져오면 된다.

 

더 중요한 것은 

obj = URL.createObjectURL(Blob) 을 통해 생성된 URL객체는 

window.URL.revokeObjectURL(obj)를 통해 해제해주어야 가비지콜렉터

폐기된 정보를 수거해간다.

 

ps. 본인은 img.src 를 통해 load된 이미지의 크기들을 DOM으로 가져오고 싶었다.  2번도 아님.

 

2-1. html

<div>
    <input type="button" value="ajax 조회" id="callRequest">
    <div id="resultRequest"></div>
</div>

2-2. javascript

const resultRequest = () => {
		// 배열로 되어 있는 이미지의 주소
        const arrImages = [
            './images/image01.jpg',
            './images/image02.jpg',
            './images/image03.jpg'
        ]
        
        // selector
        const resultRequest = document.querySelector('#resultRequest');
        
        // 결과값 초기화
        resultRequest.innerHTML = "";
		
        // request 함수 시작
        const request = url => {
        
        	// XMLHttpRequest 호출
            const xhr = new XMLHttpRequest();
            
         	// 어떻게 가져올건지? 어디서 가져올건지? 비동기로 가져올건지?
            xhr.open('get', url, true);
            
            // responseType은 Blob 으로 가져온다. Blob === 바이너리 오브젝트
            xhr.responseType = "blob"
            
            // xhr의 상태값이 변했을 때
            xhr.onreadystatechange = () => {
                // 연결실패시 함수종료
                if (xhr.readyState !== 4) return;
                
                // 연결성공시 
                if (xhr.readyState === 4 && xhr.status === 200) {
                    const blob = xhr.response
                    
                    // URL.createObjectURL 은 blob 정보를 읽는다.
                    const objectURL = URL.createObjectURL(blob);
                    
                    // image에 Image객체를 호출
                    const image = new Image()
                    
                    // image의 src에 objectURL 할당
                    image.src = objectURL

                    resultRequest.innerHTML += '<p>' + image.outerHTML + '<br/>' +
                    	// getResponseHeader는 response 정보를 가져온다.
                        // Content-Length는 response header에 있으며, 
                        // FileSize가 byte단위로 담겨져있다.
                        Math.round(xhr.getResponseHeader('Content-Length') / 1024) + 
                        'kb </p>';
					
                    // 생성된 URL.createObjectURL을 해제하면 가비지컬렉터에서 수거해간다.
                    // setTimeout을 안할 경우 오류를 일으키는데 코드가 아래에 있어도
                    // 브라우저의 렌더링 과정에서 우선순위인 것 같다. 자세히 알아봐야함
                    const revoke = setTimeout(function() {
                        window.URL.revokeObjectURL(objectURL)
                        console.log('revoke')
                    }, 1000)
                }
            }
            xhr.send();
        }
		
        //이미지 갯수만큼 request 반복실행
        for (let i = 0; i < arrImages.length; i++) {
            request(arrImages[i])
        }
    }

    document.querySelector('#callRequest').addEventListener('click', resultRequest, false);

 

생각해본 것

3. cookie 나 cache에 접근하여 저장되어 있는 img의 size를 알 수있지않을까?(현재 이미지 이름만 출력가능한 상태)

4. 로드된 이미지들은 파일 생성자를 상속받는 인스턴스를 만들어 파일객체로 만들어본다?

5. 잠온다... 일단 자야지...

 

'Javascript' 카테고리의 다른 글

[WebAPI] window.localStorage 부시기!  (5) 2019.09.29
[Babel] 사용기(1)  (0) 2019.06.26
배열의 중복값 제거  (0) 2019.04.25
[자료구조]  (0) 2019.04.25
다수의 엘리먼트에 이벤트 등록하기  (0) 2019.04.11

배열/객체 중 객체안의 속성을 기준으로 중복값

    var arrayDummy = [
        {"unum": "0000001", "uname":"choi", "ugender":"man"},
        {"unum": "0000002", "uname":"bae", "ugender":"woman"},
        {"unum": "0000003", "uname":"kim", "ugender":"man"},
        {"unum": "0000001", "uname":"pack", "ugender":"woman"},
        {"unum": "0000002", "uname":"heo", "ugender":"woman"},
        {"unum": "0000003", "uname":"nana", "ugender":"man"}
    ]
    
    function uniqueArrayFilter(_array){
        //새로운 배열 uniqueArray 생성
        var uniqueArray = [];
        var i, j, flag;
        
        for( i = 0; i < _array.length; i++){
            // uniqueArray 의 길이가 0 이면 추가. 초기값
            if( uniqueArray.length === 0){
                uniqueArray.push(_array[i]);
            }else{
                // uniqueArray 의 길이가 1 이상이면 검토시작
                
                flag = true;
                for( j = 0; j < uniqueArray.length; j++){
                    // unum 이 같으면 flag 를 false 처리하고 해당 loop 종료
                    // unum 이 다르면 패스하고 flag는 true 지속함
                    if( uniqueArray[j].unum === _array[i].unum){
                        flag = false;
                        break;
                    }
                }
                
                // loop 에서 걸러지고 flag 값이 true 이므로 
                // 중복되지않는 unum이 해당하는 행은 uniqueArray에 추가된다. 
                if(flag){
                   uniqueArray.push(_array[i]) 
                }
            }
        }
        return uniqueArray;
    }
    
    uniqueArrayFilter(arrayDummy);
    
    /*
    결과값
    [
      {"unum": "0000001", "uname":"choi", "ugender":"man"},
      {"unum": "0000002", "uname":"bae", "ugender":"woman"},
      {"unum": "0000003", "uname":"kim", "ugender":"man"}
    ]
    */

'Javascript' 카테고리의 다른 글

[Babel] 사용기(1)  (0) 2019.06.26
파일(Image) 용량을 확인하는 방법_v1  (0) 2019.06.05
[자료구조]  (0) 2019.04.25
다수의 엘리먼트에 이벤트 등록하기  (0) 2019.04.11
base64 인코딩, 디코딩하기!  (0) 2019.04.11

 

 

    function Node(data) {
        this.data = data;
        this.next = null
    }

    function LinkedList() {
        var _length = 0;
        var _head = null;
    }

    LinkedList.prototype.append = function(data) {
        var node = new Node(data);
        var curr;

        if (this._head == null) {
            this._head = node;
        } else {
            curr = this._head;

            while (curr.next) {
                curr = curr.next;
            }

            curr.next = node;
        }
        this._length++;
    }

    var list = new LinkedList();
    list.append(15);
    list.append(10);
    list.append(5);
    list.append(3);
    
    

 

참고한 사이트

소https://boycoding.tistory.com/33

 

 

+ Recent posts