js hoisting 호이스팅

javascript에서는 선언 전에 변수를 사용할 수 있는 경우가 있는데, 호이스팅 때문이다
근데 호이스팅은 나쁜거다

var
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function f() {
console.trace(A); // undefined
{
console.trace(A); // undefined
{
console.trace(A); // undefined
var A = 1;
}
console.trace(A); // 1
}
console.trace(A); // 1
}
f();
// console.trace(A) // not work
  • var 키워드를 사용하면 함수 최상위 스코프로 간다
  • 변수 A는 선언도 안되었는데 잘 실행되는 이유이다
함수 호이스팅
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
f();
// g(); // not work
// h(); // not work

function f() {
let a = 1;
console.log(a);
}

const g = function () {
console.log(2);
};

const h = () => {
console.log(3);
};
  • 특히 함수는 함수 선언식? 일 때 호이스팅 된다
  • 나는 처음 js를 배울 때, varconst, let으로 대체해라고 해서
  • 일단은 var을 안 쓰면서 공부를 해왔었는데,
  • 그래선지 호이스팅 관련해서 골머리 아픈 적이 없었던 것 같다

참고

defer vs DOMContentLoaded

  • defer이 먼저 실행된다

defer 여러개 실행 순서

1
2
<script src="./defer.js" defer></script>
<script src="./defer2.js" defer></script>
  • 여러개의 defer가 있으면 위에서 아래로 순서대로 실행된다
  • defer.js 실행 -> defer2.js 실행

async와 DOMContentLoaded는 서로 무관하다

  • DOMContentLoaded 먼저 실행될수도 async가 먼저 실행될수도 있다

참고

이미지 레이지로딩

https://css-tricks.com/the-complete-guide-to-lazy-loading-images/

레이지로딩

  • 페이지에 이미지가 너무 많으면 로딩 속도가 느리다
  • 일반적으로 페이지가 로드되고 페이지에 포함된 모든 이미지가 로드된다
  • 레이지 로딩을 사용하면 로드를 뒤로 미룰 수 있고, 원하는 타이밍에 로드할 수 있다
  • 이를 통해 페이지를 빠르게 로딩할 수 있다
  • 콘텐츠를 제공하는 서버 비용을 아낄 수 있다

src 대신 data-src사용

1
2
<!-- <img src="https://via.placeholder.com/468x200?text=1" /> -->
<img class="lazy" data-src="https://via.placeholder.com/468x200?text=1" />
  • src를 사용하면 이미지가 로드되기 때문에, src는 사용하지 않는다
  • 대신 이미지 주소를 data-src에 저장한다
  • data-를 사용하면 js에서 dataset을 통해 접근할 수 있다

Observer API 사용

public/js/method2.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
let lazyloadImages;

if ('IntersectionObserver' in window) {
lazyloadImages = document.querySelectorAll('.lazy');
const imageObserver = new IntersectionObserver(
function (entries, observer) {
entries.forEach(function (entry) {
if (entry.isIntersecting) {
const image = entry.target;
image.src = image.dataset.src;
image.classList.remove('lazy');
imageObserver.unobserve(image);
}
});
},
{
root: document.querySelector('.container'),
rootMargin: '0px 0px 500px 0px',
}
);

lazyloadImages.forEach(function (image) {
imageObserver.observe(image);
});
}
  • Observer API를 통해 이미지가 뷰포트에 들어오면
  • 그제야 src를 초기화해서 이미지를 로드한다
  • 로드된 이미지는 더 이상 옵저버가 관찰하지 않도록 unobserve() 해준다
  • IntersectionObserver 생성자 두 번째 인자로 rootMargin을 설정해줄 수 있는데,
  • 사용하지 않았을 때, 뷰포트에 들어오면 이미지 로드가 시작되어 불러오는 반면
  • rootMargin을 설정해주면, 설정한 값만큼 미리 옵저버가 반응해서 이미지를 로드할 수 있도록 한다

참고

gh-pages 사용하기

열심히 만든 웹을 Github Pages를 통해 자랑해보자
이때 사용할 수 있는 간편한 패키지가 있다

terminal
1
2
3
4
5
6
npm i -D gh-pages
gh-pages -d dist

# or

npx gh-pages -d dist

gh-pages

  • Github Pages 기능을 통해 정적 웹을 호스팅 할 수 있다
  • gh-pages라는 패키지를 사용하면 간편하게 배포할 수 있다
  • gh-pages를 설치하고 gh-pages -d {빌드 디렉터리} 명령을 하면,
  • gh-pages라는 브랜치가 자동으로 생성되고 빌드 디렉터리의 내용이 깃헙 저장소에 올라간다
  • github pages 세팅도 자동으로 된다
  • package.json이 프로젝트 루트 디렉터리에 존재해야 한다
  • 바닐라 웹 프로젝트를 진행한 경우에도 gh-pages를 사용하고 싶다면,
  • npm init -y 명령으로 임시로 package.json을 생성하고
  • npx로 gh-pages를 실행하면 된다

옵션 사용하기

terminal
1
npx gh-pages -d dist -b dist --dotfiles --tag \"🚀update\"
  • -d dist dist 디렉터리를
  • -b dist 원격 레포의 dist 브랜치에
  • --dotfiles 닷 파일을 포함하고,
  • --tag \"🚀update\" 태그도 지정해 줄 수 있다
  • 더 많은 옵션은 -h로 확인

nextjs 배포하기

terminal
1
2
touch .nojekyll
npx gh-pages -t true -d out
  • .nojekyll 파일을 생성해 줘야 한다
  • gh-pages는 기본적으로 지킬 기반으로 동작한다
  • 그러면 _로 시작하는 파일들을 제대로 동작하지 않는다
  • 그래서 지킬을 사용하지 않는다는 것을 .nojekyll파일을 생성하여 알릴 수 있다
  • gh-pages로 배포할 때 -t true 옵션을 사용하는데,
  • .(dot)으로 시작하는 파일을 포함하여 배포하라는 뜻이다
  • 옵션을 사용하지 않는 다면 .nojekyll이 제외된다

참고

깃허브에 있는 파이썬 프로젝트 돌려보기

파이썬 초보가 처음 깃허브에 있는 파이썬 프로젝트들을 돌려보면서 막혔던 부분과 알게 된 부분을 정리한 글

내 파이썬 지식

  • 인공지능 관련 프로젝트들이 대부분 파이썬으로 작성되어 있어서
  • 관련 프로젝트를 돌려보기 위해서는 파이썬 지식을 필요로 했다
  • 1 ~ 2년 전에 학교 수업으로 데이터분석처리라는 과목을 들으면서 파이썬을 사용해봤는데,
  • os는 윈도우, 도구는 주피터 노트북으로 테이블 데이터 전처리, 데이터 시각화와 분석을 해보았었다
  • 사용해본 모듈로는 pandas, seaborn, matplotlib, numpy, statsmodels, scipy 등이 있다
  • 각 모듈들에 대한 숙련도는 치트 시트를 확인한 정도이다

리눅스에서 돌리기

  • 윈도우에서 프로젝트를 돌려보려고 시도했지만,
  • 종속성을 설치하는 과정에서 불편한 것이 많아서 리눅스에서 돌려보기로 한다
  • WSL로 윈도우에서 쉽게 리눅스 환경을 사용할 수 있다
  • 나는 WSL2 Ubuntu-18.04 LTS 환경에서 진행했다
  • vscode remote - WSL을 통해 작업했다

종속성 설치

  • apt-get을 통해 필요한 종속성을 설치하는 경우,
  • 먼저 apt를 최신 상태로 업데이트해줘야 한다
1
sudo apt-get update

sudo: pip: command not found

  • pip 커맨드가 없다고 하는데, 설치해줘야 한다
  • pip3를 설치하고, pip 커맨드는 pip3로 대체하여 사용한다
1
sudo apt-get -y install python3-pip

requirements.txt 설치 도중 오류

  • pip3 install -r requirements.txt로 종속성을 설치하는데,

ModuleNotFoundError: No module named ‘skbuild’

  • 이런 경우 말고도 no matching distribution found for numpy==1.20.0처럼 버전을 가져올 수 없다는 오류도 마찬가지로 파이썬 버전을 올려주니 해결됐다

프로젝트 파악하기

1
python3 main.py
  • 기능을 추가하려면 코드가 어떻게 동작하는지 알아야 한다
  • 여기저기 print문을 작성해보면서 차근차근 알아가 보자
  • 파이썬 문법을 자세하게 몰라도 잘할 수 있다

참고

python 초보가 어제 오늘 배운 몇가지 명령어 모음

py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 타입 알아내기
print(type(1)) # <class 'int'>

# 앞뒤 공백 없애기 trim
print(' 안녕 '.strip()) # 안녕

# 문자열 길이 알아내기
print(len('안녕')) # 2

# 숫자 문자열로 캐스팅
print(type(str(1))) # <class 'str'>

# print 출력 파일로 저장하기
import sys
sys.stdout = open('/txt.txt', 'w')
print('안녕하세요요')
print('반갑습니다')
sys.stdout.close()

# 텍스트 파일 저장하기
text_file = open("output.txt", "w")
text_file.write("%s" % '안녕하세요를레이')
text_file.close()

# numpy 1 또는 0으로 초기화 된 배열 얻기
import numpy as np
np.ones((10,10))
np.zeros((10,10))

# numpy 인버트하기 ; 각 원소에 not 연산 수행
np.invert(np.ones((10,10))) # === np.zeros((10,10))

# numpy 배열 크기 확인
np.ones((10,10)).shape # (10, 10)

# numpy 원소값 더하기
np.ones((10,10)).sum() # 100.0

# numpy 행렬 더하기
(np.ones((10,10)) + np.ones((10,10))).sum() # 200

# numpy 행렬 곱하기 ; 마스크로 쓸 수 있겠다
(np.ones((10,10)) * np.zeros((10,10))).sum() # 0

# 유닉스 타임 얻기
import time
time.time()
str(round(time.time())) # 파일명으로 쓸 때

# 이미지 저장
from PIL import Image
image # PIL image
image.save('imageOutput.bmp','BMP')

# pandas 객체 생략없이 print
# row 생략 없이 출력
pd.set_option('display.max_rows', None)
# col 생략 없이 출력
pd.set_option('display.max_columns', None)

cli

1
2
3
4
5
# python 버전 확인
python3 -V

# pip 버전 확인
pip3 -V

python type

1
2
num = 1
print(type(num)) # <class 'int'>
  • 야매로 python 코드에 손을 대기 위해서 필요한 첫 번째 관문
  • 무슨 타입인지 알아야 구글링할 수 있다

파이썬 기본 자료형

  • bool
  • int / float
  • str
  • list

python 카테고리 생성

  • python으로 작성된 코드를 해석하기 위해 야매로 공부한 내용 올리기