ES 쓰다보면

max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]

 

같은걸 겪기도 한다. 옛날옛적에 메모장에 메모해둔게 있어서 카톡방에 공유하면서 정리.

 

sudo -s su - 

(login root) swapoff -a 

마스터노드랑 데이터노드는 다 껐다. ingest랑 coordi는 vm이라 필요없어서 안함.

 

sudo /sbin/sysctl -w fs.file-max=655360

sudo /sbin/sysctl -w vm.max_map_count=262144

sudo /sbin/sysctl -w vm.overcommit_memory=1

sudo /sbin/sysctl -w vm.overcommit_ratio=100

sudo /sbin/sysctl -w net.core.somaxconn=65535

sudo /sbin/sysctl -w net.core.netdev_max_backlog=262144

 

이건 www로 실행이 불가능하니, 직접 서버에 들어가, 슈퍼유저 권한으로 설정한다.
그 뭐야 서버 리부팅이나 점검다녀오면 시, 위 사항 + ulimit -a 까지 풀리는 경우가 있음.

 

그래서 뭐 어쩌겠어 점검다녀와도 유지되게 해야지.

재부팅해도 사라지지 않는 설정값 설정은 대충 /etc/sysctl.d/ 로 이동해서
파일하나 아래처럼 만들고

vim 100-elasticsearch.conf

fs.file-max=655360
vm.max_map_count=262144
vm.overcommit_memory=1
vm.overcommit_ratio=100
net.core.somaxconn=65535
net.core.netdev_max_backlog=262144

sysctl -p /etc/sysctl.d/100-elasticsearch.conf

재부팅해도 사라지지 않는 스왑오프는

/etc/fstab 에서 swap 파티션 주석처리를 해뒀땅.

 



と、教えたのに.。。わからない、頭痛ッテ;

라고 했지만 안들어간다... 아이고 머리야

'잡담' 카테고리의 다른 글

21.01.22. 金曜日  (0) 2021.01.22
21.01.20 記録  (0) 2021.01.20
2021.01.13. 記録  (0) 2021.01.14
記録 2020.01.12.  (0) 2021.01.13
記録 2021.01.11.  (0) 2021.01.12

まずは、仕事の問題だ。
つぎは、勉強する問題。
あとは、時と体力、眠ること。

。゚( ゚இωஇ゚)゚。
足り過ぎね……

'잡담' 카테고리의 다른 글

21.01.20 記録  (0) 2021.01.20
2021.01.14 記録  (0) 2021.01.14
記録 2020.01.12.  (0) 2021.01.13
記録 2021.01.11.  (0) 2021.01.12
메모  (0) 2020.11.26

Chrome으로 디버깅하기 🐞

디버깅. 버그를 찾는건 중요한 것 같다. 크롬 디버깅 도구 사용법을 가르치고 있다.

맞다. 실행 단계마다 코드 단위로 추적할 수 있는 부분이 장점이다.

 

Sources 패널 사용법

링크 : ko.javascript.info/article/debugging-chrome/debugging/index.html

위에 링크로 테스트 페이지를 가라고 하니 따라가서 켜보자.

안녕, 존

확인 버튼을 누르면 An example for debugging. 라는 문구가 출력된다.
디버깅은 어떻게 하는가...보통 빈페이지에서 마우스 우클릭 후 '검사'를 누르게되면 나오는 창(패널들)에서 진행한다.

개발자 도구 샘플

보통 이런식으로 생겼다.🎉

 

Sources 탭 부터 설명을 하니까 위에 잘 보면 소스를 까볼 수 있다.

영역을 3부분으로 나누네.

'오픈소스즈' 라고 좌측상단에 토글버튼을 누르면 디렉토리 트리 구조로 파일탐색영역이 나온다.

파일을 우클릭 한 경우.

리소스를 저장한다던가, JS파일을 웹에서 별도로 탭으로 열어본다던가에 유용.

 

코드에디터영역이지만 코드말고도 가능

리소스는 편집이 안되지만, 드래그해서 저장가능.

 

디버그영역

좀있다가 자세히 살펴본다고... 😭넘어가자... 양이 많다는 소리겠지.😭

 

Console 사용법

콘솔탭이다. 다른탭에서 ESC키를 누르면 하단에 퀵 호출로 탭이동을 안하고도 쓸 수 있다. 안보인다면 잘 살펴보자. 펼쳐 볼 수 있다.

표현식을 입력하고 엔타를 딱 때리면 즉시 실행해준다.🔥

하지만 쉬프트+엔타를 동시에 누르면 줄바꿈이되고, 여러 줄 입력 가능.🔥

화살표를 위로 올리면 직전 및 이전에 입력한 내용들을 불러올 수 있다. (우클릭을해서 히스토리를 지우기전까지)

 

중단점(breakpoints) 사용법

콘솔 사용법을 이야기하곤 다시 소스탭으로 돌아간다.

아까 위에 예제페이지 링크열어둔걸로 돌아가서 실습해야함...

코드를 고치지 않았다고 가정하고, 페이지를 새로고치기 전에 중단점을 박아두면 (왜냐면 코드를 고치면 중단점도 바뀔 수 있다.)

해당 코드를 불러오기 전 지정해둔 곳에서 중단점이 걸린다. 말이 좀 이상한데, 지정해둔 '점'에서 '중단'이 걸린다.

 

뭐 다양한 기능을 설명하고 있으니, 눌러보자. 잘못 세팅했을땐 초기화도 할 수 있다. 걱정말고 가지고놀자.

 

debugger 명령어

특별히 쓸 말이 없다 어쩐다.🥺

 

멈추면 비로소 보이는것들

자, 브레이크 걸고 새로고침 하면 중단점이 걸리고, 디버그 창 영역에서 컨트롤을 추가적으로 가능해졌다. 

 

왓치 부분은 잘 안쓰지만 가끔 쓰면 유용하고, (코드에 적기 싫을 때)

콜 스택은 콜백함수라던지 어디서 실행되어 실행되고 타고 들어왔는지 구분할 때 좋다. (사실 직접 짠 구조가아니면 구분이 잘 안되지만🥺)

스코프 영역은 해당 코드범위영역에서 접근 가능한 레벨의 변수를 보여준다.

🌈

 

실행추적하기

이 부분이겠지
멈추면 생기는 Paused in debugger

 

브레이크를 걸었다면 resume (f8키) 버튼을 많이 쓸거고 

보통은 Step (f9키나) Step over(f10)을 많이 쓴다.

f9를 좀 더 많이 사용할텐데, 하나하나 까보는경우 소중하게 참고하자.

F11과 쉬프트+F11은 일단 넘어가고 사용할 때 한번 더 보자.

✨ (또 새로운 꽃인 비동기호출쯤에서...)

 

console.log

출력 : 미리 구현되어있는 함수인 console.log를 이용하는 방법이다. 콘솔창에서 안써도 묵시적으로 출력되긴하지만 코드상에선 써야지..🥺

ESC키를 누르면 어떤 패널에서도 하단에 console 패널을 소환할 수 있단걸 알고 있으니, 적절히 잘 소환해서 써보고

친구들로 console.dir console.error 등이 있다. console.log 말고 한번 써보자.

콘솔.dir은 object형을 한번 써보고

콘솔.error는 한번 이것저것 해보고, 콘솔창을 잘 살펴볼 것.

 

 

코딩스타일

인정한다. 개발자는 간결하고 읽기 쉬운 코드가 최고다.

성능도 좋고 간결해서 라인수도 짧지만 다른사람이 봤을 때, 못알아보는 급의 코드는 협업시 유지보수가 힘들고다.

나를 찾지 않으면 일이 되지 않지. =퇴사불가능


와... 추천할만한 규칙 시트를 설명했다.

확실히 이 스타일 선호도는 팀에따라, 프로젝트에따라, 개인에따라 달라질 수 있으니 만능뿅망치가 아님을..

탭 vs 2스페이스 vs 4스페이스 등으로 싸우지말자.

 

wow

ㅋㅋㅋ

 

문법

중괄호

상세하게 잘 설명해두었다. 나는 요약을 하지.

) {

이렇게 시작하는걸 권장하자. 라는 이야기다.

if (n < 0) {
  alert(`이것을 기본 형식으로 받을자.`);
}

최종 결론은 짧아도 간단해도 이렇게 만들자.🥺

가로길이

요즘은 그래도 4:3 모니터가 많이 사라졌네.. 노트북의 경우 조금 문제될 수 있겠다.

들여쓰기

종류가 여러가지가 있는데, 이것도 팀별로 최신 에디터나 IDE를 쓰고, 통일하자고 맞추면된다.

가로들여쓰기

🌸 스페이스 개수가 몇개인가 탭을 사용하는걸로  싸우지말자.

세로들여쓰기

🌸 가능하면 어떤 일을 행했는지 주석에 남기는게 좋은데, 여기도 재미있는 포인트는 주석의 다음 행에 해당되는 코드를 쓸 지, 아니면 코드 다음에 적을지는 팀별로 미리 협의하도록 하자.

세미콜론

모든 구문 끝에는 세미콜론을 써야 모던하지만, 특정 룰이 적용되면, 안쓰는 경우도 있다는걸 알아두면된다.

절대적인건 없다. 모던한건 꼭 써야한다고 해둘 뿐. (사용할 순 있다 가독성에 나쁠 뿐......)

중첩레벨

한번에 너무 많은 if 로 들어가거나, 중첩해서 함수를 작성하지 말자는 내용

함수의 위치

"헬퍼함수 여러개를 만들어 사용하고 있다면" 이라고 써놓고 있다.

❓ 헬퍼함수에 대해서는 설명을 안해두어서 

-> 다른 함수에 추가적으로 들어가 함수가 하고자 하는 해당 기능을 완성하기 위해 도움을 주는 함수를 말한다.

createElement 가 핸들러를 세팅하기 위해서 elem으로 표현, 할당된 후, setHendler에 파라메터로 들어가고 있다. 들어가서 엘리먼트생성하는 일을 배치받아 담당자로 업무를 시작하겠지.

 

스타일가이드

이제서야 스타일 가이드에 대한 내용이 시작되었다. 프로젝트 시작시에 만들어두면 좋은 스타일 가이드이다.

혼자할때는 거의 만들지 않지만 만들어두면 익숙해져서 좋다.

내 주변엔 보통은 airbnb 많이 쓰더라.

* 저거 직접 다 만들면 시간 엄청 오래걸림...

Linter

스타일 가이드 검사기다. 💙 마이너한 linter의 경우, 정보가 잘 없다. 사람들이 많이 쓰는데는 이유가 있겠지?
가능하면 유명한 ESlint를 쓰는걸 추천한다.

 

여기서부터 2갈래 갈림길이 적용된다.

 

1. 에디터에서 사용하는 외부 확장형 설치형 lint 를 설치하고 빠르게 넘어가기

💚 스크롤을 쭉 내려서 airbnb가 보이는 링크를 바로 누르자. 1.1 부분만 해도 일단 문제없을것이다.


2. 일단 매운맛을 한번 보기.

 

일단, 맘에드는 걸 하나 잡고, ESLint 같은것 (Ecma Script + Lint)

google 사전 - 이러한 천을... 외과용 거즈 붕대를 칭칭 감아놓는다의 느낌으로 다가온다.

- 개발에선 문제가 있는 코드에 표시를 달아두는걸 의미한다.

eslint.org/docs/user-guide/getting-started

 

Getting Started with ESLint

Getting Started with ESLint ESLint is a tool for identifying and reporting on patterns found in ECMAScript/JavaScript code, with the goal of making code more consistent and avoiding bugs. In many ways, it is similar to JSLint and JSHint with a few exceptio

eslint.org

일단 지금레벨에서 추천은

next steps 까지 들여다볼 필요는 없을 것 같고, 

eslint.org/docs/user-guide/configuring 이거 영어로 되어있어서 일단 패스하거나 진짜로 패스했다면 ㅠㅠㅠ

이 블로그의 글을 읽자.

velog.io/@kyusung/eslint-config-2

 

ESLint 설정 살펴보기

ESLint 설정을 위한 config에 대해서 살펴봅니다. ESLint Configuration은 eslintrc.* 파일 또는 package.json의eslintConfig 필드에 작성할 수 있습니다. ESLint의 핵심 구성 정보는 세가지 영역으로 나누어져 구성

velog.io

그래도 처음하는거라서 한번에 안와닿을 수 있다. 이것만 머릿속에 기억하자.
아 나는 일단 최소한 eslintrc 라는 이름을 가진 설정 파일을 만들어야 쓸 수 있구나. (아니면 웹팩 모듈번들러 package.json에서 eslintCongif를 만들어야하는구나.) 하고 외워두자.

 

용어가 많이 나온다. 파서, 프로세서, 환경, 플러그인 등등


기본 가이드를 익힌 후 아래와같은 글 등으로 환경을 설정하는게 가장 빠르고 좋다.

velog.io/@_jouz_ryul/ESLint-Prettier-Airbnb-Style-Guide%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

 

ESLint & Prettier, Airbnb Style Guide로 설정하기

코드의 가독성을 높혀주고 에러나 컨벤션에 관한 경고 해주는 유명한 툴이 있는데바로 ESLint와 Prettier입니다. 매번 멘토님의 블로그를 보고 설치하고 설정하고 사용하던 ESLint와 Prettier를 가장 유

velog.io

요즘은 그래도 2-3년전보다 정리가 잘 되어있는 곳들이 많다. 위에글은 리엑트 포함이 있는데 필요한거만 살펴보자.
살짝 감이오면

 

github.com/James-Curran/pure-es6-boilerplate

이 프로젝트를 참고해서, 아 최소한 이건 있어야겠구나. 정도만 알아두고 넘어가자. 아님 지금은 바로 위 프로젝트 깃헙주소의 파일을 받아서 자신의 기본프로젝트로 설정하고 바꾸거나 개발해나가자.
왜냐면 JS가 문제가 아니라, 웹팩이니, 빌드니, node package manager 니...
(아니 JS를 빌드한다고?)의문을 가지며 설정 대해서도 공부해야 하기 때문.


(3년전에 작성된 이 보일러플레이트도 심플하네, 버전이 낮아서그렇지.. github.com/jluccisano/webpack-es6-boilerplate )

Prettier

일단 위에서 linter만 이야기하고 모던JS 가이드에서 프리티어에 대한 설명이 없어서 추가.
위에서 서타일 가이드를 열심히 만들어서 스타일 잡고았으면, 바로 위에서 lint로 아 이거 스타일이랑 안맞다고 뿅뿅 표시해주었다.

그럼 프리티어는 이걸 💝프리티~하게💝 어여쁘게 자동으로 수정해주는것을 말한다.

 

주석

주석이란 무인가. 중x의 국가 주석 말고..

네이버사전 : 주석

그럼 JS개발에서 주석(코멘트)를 달려면 어찌 해야하나는 이전에 배웠다.
여기선 코드 품질을 높히기 위해 어떤 주석을 써야하는지 알아보자.

 

좋지않은 주석

풀어서 쓰고있는데 짧게 말하면 명확한 코드엔 주석을 쓸 필요가 없다. 복잡하면 하나의 기능을하는 함수 이름으로 묶어 볼 것.

// 변수 선언을 썸으로 하고, 숫자형 1234 더하기 5를 문자열로 연결한 코드이다.
let sum = 1234 + '5';
// 라고 쓸 필요가 없다는 말이다.

 

좋은 주석

예시를 들어 잘 설명을 해 두었다. "함수 용례와 매개변수 정보를 담고 있는 주석" 부분은 익혀두자.

- 왜? 이걸로 해결했는가? 개발 아키텍처 등.

- 왜 이런 이름인가😇😇😇😇😇😇😇😇😇😇

- 왜 여기에 이 코드를 썼는가. 저걸 쓰면 되는데, 이유가 뭔가?

- ......

// 되는데 이유를 모르겠어서 절대 건들지 말 것.

등등..

 

닌자코드

기억하고 있습니까

데자뷰 느껴본적 있어?

최강닌자 닌자 닌자! 은둔술!! 은닉술!! 최강의 나루토가 되는 방법!!!!!
아... 진짜 싫다. 스파게티 코드도 아니다.
여기 나오는 내용의 의미는 절반이상은 비꼬는 내용이다. 잘 구분해서 보자.

코드 짧게 쓰기 + 글자 하나만 사용하기

가독성이 문제가 아니라 그냥 의미불명의 수준으로 난독화를 해둔 수준이다. 이렇게 작성하지말자.

이름 만드는게 제일 어렵지만 의미있는 변수명과 함수명을 만들도록 노력하고 가독성을 높히자.

 

약어사용하기

보통 팀 내에 약어를 공유하는 wiki나, 가이드를 만들어둔다. 꼭 가이드를 쓰도록하자.

아니 제발 가이드 만들었으면 가이드에 적는걸 까먹지말라고

아무 이야기도 없이 멋대로 변수명이 짧으면... 정말 곤란하다.

ua가 뭐야 ua가 영웅이야? 울트라 아카데미야? ㅠㅠㅠㅠ

포괄적인 명사 사용하기

아 진짜 data라고 해두는거진짜 싫다...

그래... prefix 나 postfix로 다음의 obj, data, value, item, elem 일단 좋다. campaignObj 아... 그래 캠페인 오브젝트구나.

responseUserData...? 아... 그래 뭐... 응답받은 사용자 데이터인가보다.

 

그.런.데... 뭐? "data" 만 딸랑 써두면 안에 뭐 들어있는지 어떻게아냐고 ㅠㅠㅠㅠㅠㅠ 호카게 닌자야? 🥺

 

... data1, data2, data3 (속에 내용 다 다름 다 열어봐야함)

아비규환

 

다음으로 나오는 내용은

let num = 'gogo sing.';
let string = 3.1492349532;

철자가 유사한 단어

let IlikeNinja
// 개발 코드 하이라이터라서 이렇지

 

이미지로 만들거나 이렇게 그냥 쓰면 let IlikeNinja = 'I lika NInje'; 대문자 아이인지 엘인지 뭐가 뭔지 헷갈린다.

 

동의어 사용하기

스타일 가이드 만들 때, 변수명 작성에 대한 가이드도 부족하지 않았나 살펴볼 것. 😂

 

 

이름 재사용하기

정말 정말 무섭다ㅋㅋㅋ  적당히를 모르는 내용이다.
😊 적절히 상황에 맞게... 잘 만들어 드세요..... 제발...

재미로 언더스코어 막 남발하면서 쓰지말자

모든 코드작성엔 이유가 있는것이 좋다.

// 왜 언더스코어를 남발하며 썼는지 이곳에 남기려했지만 여백이 없어 남기지 않았다.

 

미칠듯한 과장 형용사 사용하지 않기

let 킹갓제네럴엠페러충무공마제스티하이퍼울트라판타스틱익스트림지니어스화룡정점마스터문자열변수 = 'Piyo!';

 

let chickSound

가 좋겠지?

 

외부변수덮어쓰기

...악마다 진짜 너무한다

 

부작용이 있는 코드 작성하기

클린코드 책 저자가 보면 거품을 물 내용 / 평생유지보수하는법 저자가 보면 아 선넘었네 하는 내용.
아. 책 영업해야지.

클린코드+클린아키텍처세트
클린코더

Javascript 내용은 아니다. 사놓고 머리맡에서 베고자면 좋다. (물론 읽다가)

 

자. 빨리빨리 넘어가자...

 

함수에 다양한 기능넣기

✨ ^ㅡ^ 노자라는 사람 참 대단하다 싶다.

일단... 하나의 기능을 하는 함수(function)을 만드는것이 좋긴 하다. 그런데 이게 꼭 "법"은 아니다. 어긴다고 벌받지 않는다.

그렇게 된 경우 주석으로 이유를 써주고, 이 커다란 함수가 하는 목적을 잘 작성해두자.

 

*** 너무 많이 함수를 쪼개면 이게 개발을 하는건지 함수 인수 분해를 하는건지 도저히 알 수 없을것이다.

** 편법을 모두 사용하면 후배 개발자들에게 저렇게 살진 말아야지 하고 영감을 심어줄 수 있다.

* 해당 챕터도 쫌 적당히 하자.

 

끝. 다음 포스트에 테스트 자동화와 모카 폴리필을 메모해두련다.

 

테스트자동화와 모카

모카보다 나는 제스트파인데

폴리필

아이고 구브라우저

'프론트 > 모던JS요약' 카테고리의 다른 글

4장 - 객체(0)  (0) 2021.01.21
3장 - 코드품질(1)  (0) 2021.01.16
2장 - 자바스크립트 기본(2)  (0) 2021.01.13
2장 - 자바스크립트 기본(1)  (0) 2021.01.11
2장 - 자바스크립트 기본(0)  (0) 2021.01.09

if 와 '?'를 사용한 조건 처리 ❤️

문서를 다시 읽어봐도
조건문이라는 친구를 알아보는 과정이라고 소개해야 할 것  것 같지만, 조건을 평가하는데 아래 내용을 쓰면 된다고 훅 치고 들어온다.

즉, if 문과 ? 연산자를 사용하면 된다고 말하고 있다.

조건문은 🐈 만약 (조건이❓이러이러) 하다면, (다음과 같이 반짝반짝🌟) 하게 행동 하라... 라고 하는 개발의 꽃이다.

 

조건문을 잘 만든 예시 *'ㅁ '* (???)

 

 

'if'문

설명에서 if(조건식) 문은 괄호 안에 들어가는 조건을 평가하는데, 그 결과가 true 이면 코드 블록이 실행된다.
- 라고 if 라는 조건 문법을 사용해, 괄호안의 조건식을 평가해서 결과가 참한녀석이면, 코드를 실행하는구나! 하고 이해하면 되는 간단한 친구다. (뭐가 다른데?)

if (year === 2021) {
  alert( "백색소의해라고합니다! 한우맛있쩡" );
}

 

실행 부분은 짥게 줄여서 중괄호를 안쓰고 한줄로 쓰기도하는데, 가능하면 가독성을 위해서 한줄이라도 묶어주자.🥺

 

year === 2021

이라고 표현한 부분이 조건식인가? 조건과 조건문 조건식은 다른가? 이라는 부분을 헷갈릴 수 있는데, 이렇게 보고 본문을 읽어보자.

조건문 (if 조건 문...법...) 조건식(표현식) 평가 된 값
if(year === 2021) { ...뭔가 할 일... } year === 2021 true

조건문에 조건식을 넣으면 참/거짓을 평가해서 동작한다고 설명하려 한 것 같다고 느꼈다 🤔

구글 검색해보면 사람들이 조건문이랑 조건식이랑 섞어쓰는것 같으니까 이것도 헷갈릴 수 있을지도 모르겠고...

 

조건식(표현식)이라 써 두었는데, 표현식으로 confirm() 정도는 쓸 수 있지만 가능하면 이렇게 즉시즉시 받아서는 가독성이 떨어지니 안하는편이 좋다고 생각되었다.

 

 

'else'절

언어의 문법이니까 절이 나온다.

기본적으로 상단의 조건식과 반대되는 조건인 false 경우 실행된다.

if (year === 2021) {
  alert( '백색소의해라고합니다! 한우맛있쩡' );
} else {
  alert( '돼지가 맛있는 연도 입니다.' );
}

 

조건부 연산자 '?'

 

물음표가 나왔다. 조건부 연산자, 혹은 혼자 쓸 수 없고 3개의 항이 필요하다해서 삼항연산자로 불려진다.

let 결과를담을변수 = 조건식이나조건 ? 참일경우실행할내용 : 거짓인경우실행할내용;
// 물론 위 코드는 돌리면 동작이 안된다.

한글로 써 본 예제이다.

상당히 많은 코드에서 이 조건부 연산자로 처리하는 경우가 제법 있으니 눈에 익혀두자.

 

다중'?' 는 가급적 가독성을 위해서 안쓰는게 좋고, 부적절한 '?' 부분도 봐 두면 좋다.

 

논리연산자

자주 쓰는 쓸만한 친구인 논리연산자가 나왔다.

세가지 종류가 있다고 소개 중.

 

|| (OR)

오아 연산자는 보통 엔터키위에 쉬프트키를 눌러 입력한다. 버티컬바 라고 불리던가 그랬다. 두개를 쓰자.

if같은 조건문에서 쓰면 평가후 바로 참한 내용에 대해서 사용하고,

"✨전통적인프로그래밍에서✨"
불린값을 조작하는데 쓰이고, 둘중 하나라도 참이면 참(true)을 반환한다.

 

두번째의 아주 큰 특징으로 

첫번째 트루씌(참한녀석)를 찾는 오아연산자 '||'

왼쪽부터 체크를 시작해서 첫번째 참한 값이 나오면 즉시 평가 된, 결과 평가에 따라 동작의 오리지널 타입 결과 값을 반환한다.

* 즉, 조건문에서 사용할때랑, 표현식으로 일반적으로 할당연산자(=)와 섞어서 쓸때랑 다르단걸 말한다.

 

나머지 변수 표현식으로 구성된 목록이나 단락평가는 응용법이니 알아두면된다.

a값이 없는경우 b값을 세팅하고 c값도 없는경우 기본값으로 "테스트값" 이렇게 할 때 쓰기도 했었..(아래 복선으로 남겨두자)

 

&& (AND)

두개의 앰퍼샌드를 연달아 쓰면 AND 연산자를 만들 수 있다고 하네. 쉬프트+7

 

다시나온✨"전통적인프로그래밍"✨에서 모두 '참'인 경우 참(true)을, 그외엔 거짓(false)를 반환한다. 라고 설명 중.
조건을 모두 만족해야하니, 엄격하다.

 

두번째 아주 큰 특징으로

 

첫번째의 펄씌(거짓된친구들)를 찾는 AND 연산자 '&&'

이라고 설명하고있다.

위에 나온 오아연산자의 두번째 큰 특징과 반대되는 조건이다.

거짓된친구들 falsy 라는 의미를 가진 친구들을 한번 생각해보자.

false, null, 0, undefined 이런 친구들이 나오면 먼저 반환한다.

 

 

힘든경우다

가끔 정말 이런코드를 쓰는 사람들도 있으니, 코드리뷰에서 이렇게 쓰지않으면 좋을 것 같아요. 라고 해주자.
취향이니까.. 생각이 있어 썼겠지. 강제는 하지말고 크게 싸우지는 말자. 회사나 팀의 코드 규약룰이 있으면 지켜달라고 하자.

 

! (NOT)

참/거짓으로 평가한 후 뒤집어주는 연산자이다.

 

헷갈리면 지금은 그냥 넘어가는것이 좋다.

 

두번쓰면 불린형으로 변환할 수 있다고 설명하는 예시까지 사용해봤다.

아, 모든 논리 연산자 우선순위 중 높다는것도 꼭 알아두자.

 

 

'null'병합연산자

사실 이거 정리할 때 까지 있었어? 라고 생각할 정도였다. 최근에 추가되어 폴리필이 필요하다고.

삼항연산자의 고급버전으로 생각하면 좋으며, 비어있고 선언된 변수는 걸러주는 좋은 연산자구나.🥺

위에서 복선을 회수해서, 요즘은 이 연산자를 사용하면 짧고 간결하게 선언이나 아무것도 없다면 기본 값을 정해줄 수 있고

선언된게 있다면 그 을 먼저 반환하는 동작을 한다.

 

우선순위는 저 - 밑에 있어서 (5) 나- 중에 동작한다. 괄호로 잘 묶어서 먼저 평가되도록 쓰는걸 권장한다.

 

 

 

while 과 for 반복문

한바퀴 돌고 한바퀴 또 도는 이터레이션이라고 부르는 뺑뺑이를 도와주는 반복문의 시간이 왔다. 🔥

(루프문, loop문 이렇게 부르기도 했던거같아.)

 

'while' 반복문

문법을 소개하는데, if에서 조건식에 대해 잘 했을테니 쉽게 할 수 있을거다.

조건식을 평가해서 참인경우 본문을 실행해주는 구조다.

* 한줄짜리 예시가 있는데, 가능하면 쓰지말자.

 

'do ... while' 반복문

조건식 평가를 뒤로 미루었다. 즉, 일단 일을 딱 한번 저질러놓고 아래에서 한번 더 할지 말지 고민을 해보는 구조다.

😂정말 잘 안씀.

 

'for' 반복문

많이 쓰임. 구조가 조금 독특해보여서 첨언을...

for (처음실행되는구문.인데ㅡ보통은여기에초기값을넣기도한다; 평가식; 증가식) {
  // ... 반복문 본문 ...
}

 

(세미콜론;두개;들어가있다)

세미콜론이 두개 들어가있다. 순서대로 보통은 초기식, 평가식, 증가식 이렇게 부르기도 하는데

반복을 위해서 초기값 설정은 외부에서도 할 수 있다. 이 경우 비워두기도한다.

for ( ; i < 10; i++) 이렇게 될 수 있다는것. 정도까지. 그리고 초기식에 인라인 변수선언, 그리고 앞에서 쉼표연산자로 인라인 변수선언을 여러번 할 수 있단것도 기억해내면 될듯.

 

반복문 탈출

반복을 하다가 종료를 해야하는 경우 사용하는 break 키워드가 있다.

그냥 바로 써버리면 반복문이 바로 종료되니, 반복문 안에 조건문을 넣고 잘 가꾸어 이를 통해 실행하도록 한다.💬

 

다음 반복으로 넘어가기

break 하기는 그렇고, 다음 식은 전부 실행하는건 낭비일 것 같은 경우, continue 를 사용해서 코드의 뺑뺑이 시작점을 위로 돌려준다.🧡

 

break/continue와 레이블

중첩반복문을 사용하는 경우 사용할 수 있다.

가끔 사용하는데, 이게뭔지 찾아보는 사람이 있었으니 기억해두자.

(그게나였다. 이게 무슨문법이야 처음본다? 하고 잊어버려서 찾은적이있었다.)

반복문 앞에 콜론으로 붙여주고있다.

 

Switch문

조건문 반복분에 이어 스위치문이라는 큰 문법이 나왔다. 강력하게 타입체크등을 가지고 엄격한 조건판별을 하기 때문에 구체적으로 다룬다고 느껴졌다.

 

문법

디폴트는 필수가 아니지만 break는 써주세요 제발... 안쓰면 안쓰는 이유를 적어두면 협업시 의도 해석에 도움이 된다.

생각보다 쉽다. 케이스에 써 있는 예시☣️를 보면 타입까지 체크하기 때문에 prompt 같은걸로 입력받으면 string이니까 주의해서 case에 케이스를 입력(?) 정의(!) 해주는 것 말고 실수하지않으면 된다.

케이스에 표현식을 넣는건.. 되는거긴한데 가능하면 밖에서 정리하고 넣어주자.

 

여러 개의 "case"문 묶기

문법은 아니고 break를 사용하지 않고 쓰는 편법인듯.

 

자료형의 중요성

위에서 자료형까지 일치 시키게 된다고 예시☣️를 한번 언급했다.

 

함수

자바스크립트의 꽃 함수다. 💮꽃이 너무많다. 뒤에 객체도 꽃인데...프로톹ㅌ

일단 이미 자연스럽게 각종 브라우저에 들어있는 내장 함수를 사용해 본적이 있으니 익숙하다.

 

직접 만들어서 써 보자.

 

함수 선언

 

약간 선서! 같은 느낌으로 대중들에게 이 함수를 쓰겠다고 선언하노라. 하는 방식이다.

function showMessage() {
  alert( '안녕하세요!' );
}

예시 샘플은 간단하게 잘 되어있다. 복붙했다.

function 이라는 함수 선언 키워드, showMessage 라고 선언한 함수이름, 매개변수를 넣을 공간( ), { 본문내용 } 

 

선언은 했는데 사용은 해본적이 없다.

showMessage();

이렇게 사용한다.

 

지역변수/외부변수

도튜먼트 내용으로 특별한 무리는 없는 것 같다.

전역변수라고 변수밖에 선언된 외부 변수 중 하나인데, 글로벌로 선언한 변수의 관리를 잘 해야한다는 점 정도 기억해두자.

 

매개변수

변수긴 변수인데, 함수안에서 전달받는 매개변수(파라메터 parameter)라고 하는 변수이다. 

function useParaPara(catName, insamal) {
  alert( catName + ' - ' + insamal ); // 좌측에 고양이이름 - 인사말을이어두었다.
}
useParaPara('나비', '야옹아안녕?');

매개 변수를 넘겨봤다

예제에서 매개변수를 넘겨주는걸 봤다. 본문을 마음껏 수정해서 변경할 수 있다.

 

기본값

매개변수의 기본값을 설정해 줄 수 있는 부분도 참고해두자. 아무것도 않들어오는 경우, 코드가 오류날 수 있으니 이런 경우를 막아준다.

 

매개변수 기본값을 설정할 수 있는 또 다른 방법

오래된코드 등 보통은 저렇게 많이 구현을 해 둔다.

 

반환값

함수는 반환값이라는것을 결과물로 생성한다.🌺 파라메터로 받은 내용을 연산하고 그 결과를 내어준다.

반환값에따라 변수 이름도 잘 지어주면 좋다.

return 키워드를 사용해서 반환 할 변수를 지정해주자.

return을 안하거나 변수를 지정안하면 undifined 인 것을 알아둘ㄱ것

 

함수이름짓기

언제나 이름짓는게 젤 힘들어..

규칙예시를 잘 해뒀는데, 해당 룰을 기반으로 만들고, 언제나 부득이한 경우가 생기면 주석을 활용하자.

함수는 동작 하나만 담당해야하는데, 어쩔 수 없는 경우 두개가 될 수 있다. 왜 그렇게 되었는지 꼭 써두자.

 

함수==주석

한줄로 요약하면 함수를 기능을 잘 나눠서 이쁘게 잘 만들면 주석과 같다는 의미이다.

 

 

함수 표현식🌺

앞에는 선언이라고 했고, 뒤에는 표현식이다. 개인적으로 표현식의 '표' 가 = 랑 느낌이 비슷해서 = 로 할당하고 구문의 끝을 알리는 ; 세미콜론이 있으면 표현식이구나 하고 외웠다.

let sayHiPyoHyun = function() {
  alert( "Hello" );
};

alert( sayHiPyoHyun ); // 함수 코드가 보임

 

선언문이랑 다른 특징은 끝에 세미콜론도 있고, 미리 선언해두지 않는다인데, 문서의 코드 보면서 진행해보면 알 수 있을것이다.

 

선언은 미리 선언이고 표현식은 다음과 같다.

내가 그의 이름을 불러주기 전에는 그는 다만 하나의 몸짓에 지나지 않았다. 내가 그의 이름을 불러주었을 때, 그는 나에게로 와서 꽃🌺이 되었다.
내가 그 함수를 불러주기 전에는 그건 다만 하나의 표현식에 지나지 않았다. 내가 그 함수명을 호출했었을 때, 그건 나에게로 와서 실행🌺 되었다.

표현은 해당 위치에 코드가 🌺닿아야 표현되어 불러주어야 온다. 😂 쓰고나니 오글거린다. 사람이 잠을안자고 정리하면 이렇다.

 

콜백함수

예문을 기반으로 공부하자. 교과서기반으로 따라가자.

매개변수 3개를 제시하고 있다.

첫번째 코드라인부터 보면 ask 애스크라는 질문을 받는 함수하나가 1-4줄에 있다. 

 

파라메터로 question을 받는데, 2번줄을 보면 한줄짜리 짧은 if문으로 조건식에 컨펌으로 질문을 받고있다.
뒤에 바로 yes 라고 파라메터로 받은 yes를 ()를 써서 호출(실행)하고 있다. yes()를 부른것이다.

이런 방식을 콜백방식(나중에 부름)이라고 부른다.

 

yes는 어디에있나? 

 

함수의 인자 순서는 실행할 때와 같으니
15번째 줄에 두번째 파라메타로 showOK 로 yes에 해당된다.

 

두번째 예제는 너무 짧게 썼는데.. 솔직히 이렇게 쓰면 가독성이 떨어진다.

 

함수표현식 vs 함수 선언문

차이에 대해 위에서 간단하게🌺 설명하긴했다. 이곳에서 좀 더 상세하게 다루고 있다.

1. 문법차이

선언문 - 코드 중간에 독자적인 구문... JS 코드 어딘가에 당당하게 쨘 하고 선언되어있다.

표현식 - 할당연산자 우측에 구문이 잘 표현되어 있음.

2. 생성차이

선언문 함수선언문이 정의되기 전에 호출이된다고 써두었는데, 호이스팅 개념이 없다면 일단 넘어가고 

간단하게는 선언문은 순서상관없이 어디서든 코드 저 밑에 선언을 해두어도 위에서 호출해서 쓸 수있다.

표현식은 할당되고, 그 부분에 닿아야 실행되기 때문에🌺

 

복잡한 개발에서는 표현식을 룰로 권장해서 개발하는 경우도 있다.

선언문을 여기저기 선언 후 호출하면 못찾기도 해서 그렇다.

 

 

화살표 함수 기본

그렇다는건 심화가 있다는거겠지?

정식 명칭은 화살표 함수 표현식🌺이다.

심플 문법부터 보자. 두번째줄은 실행안된다. 첫줄과 매칭을하려고 씀.

let func = (arg1, arg2, ...argN) => expression
선언 함수명 = (인자1, 매개2, 많은인자들) => 실행할표현식과반환을값을적는곳

큰 특징은

function 이라는 키워드를 써야하는 번거로운 부분, return 키워드 쓰는 부분이 사라졌단걸 주목하자.

 

let sayHi = () => alert("안녕하세요!");

줄이고 줄이는데 최적화 할 수 있기 때문에, 너무 간단하게 줄이는 경우도 있다.

선언문으로 쓸 수 없는게 지금 할당 한 우측을 보면서 선언문으로 바꿔 만들고자 하여도
이름이 없는 익명함수가 되어버리기 때문이다.

🌺화살표 🌺함수 🌺표현식이다.

 

여러줄인 경우 중괄호로 묶는것도 다른방식들과 같다만 알아두면 될 것 같다.

'프론트 > 모던JS요약' 카테고리의 다른 글

3장 - 코드품질(1)  (0) 2021.01.16
3장 - 코드품질(0)  (0) 2021.01.13
2장 - 자바스크립트 기본(1)  (0) 2021.01.11
2장 - 자바스크립트 기본(0)  (0) 2021.01.09
낭독회 로그  (0) 2021.01.07

体力的にやばいね。

今もam04:5x分のに…

整理なければならないので続きます。

'잡담' 카테고리의 다른 글

2021.01.14 記録  (0) 2021.01.14
2021.01.13. 記録  (0) 2021.01.14
記録 2021.01.11.  (0) 2021.01.12
메모  (0) 2020.11.26
티스토리 방치상태네...  (0) 2020.09.01

つかれた。
思ったより、良く出来なくって悲しかった。子供の時から今まで努力しかなければなれないのに、最近はちょっと力かれてっかもしらね。時間もないし、仕事もたくさんあるし頭が複雑でもう休みたいと思いました。

なんで日本語で日記を書くとかをするのは。正直、私が考えたことを形ける目的もあり日本語の練習もあります。まぁ、韓国人がよく読めない、目的もあります、例えば会社の仲間とか。

とにかく最近寝不足時間不足ですね、未来のあたし大丈夫かな?ほんと?死ぬかもしれませんと考えた最近。

いつかこの永遠な努力が終わった時、私は自由かなぁ……

もう夜明けのに眠れない。

'잡담' 카테고리의 다른 글

2021.01.13. 記録  (0) 2021.01.14
記録 2020.01.12.  (0) 2021.01.13
메모  (0) 2020.11.26
티스토리 방치상태네...  (0) 2020.09.01
NewSQL memo  (0) 2018.07.27

code.tutsplus.com/ko/tutorials/the-30-css-selectors-you-must-memorize--net-16048

 

반드시 기억해야 하는 CSS 선택자 30개

여러분은 id, class, descendant 기초를 알고 있겠죠. 과연 그게 전부일까요? 그렇다면, 여러분은 폭넓게 적용하지 못하고 있네요. 이 글에서 설명하는 선택자 중에 다수가 CSS3 명세서에 있으며 모던

code.tutsplus.com

 

JS ^ㅁ^ JS 고오오오오오오급 객체지향언어

 

기본타입 - call by value (원시타입(Primitive Type))

객체타입 - call by reference

숫자형

이친구 java 64비트 부동소수점 double 비슷

문자형

16비트 유니코드 문자셋

불린형

...

언디파인드

값 할당(선언)이 안된 경우, 객체내에 존재 하지 않는 값을 참조할 때.

null

없다. 비어있는걸 나타낼 때.

객체

리터럴 표현법에 의해 객체를 생성

객체란 뭘까

  • 일단 숫자, 문자, 불린형은 유사객체
  • prototype 집합
  • key - value 
  • 내장 객체들은 Object 객체(상위 포식자)의 일원

 

 

 

모던JS를 처음 읽어보는 사람이 옆에 같이 띄워놓고, 읽으면서 부담 없이 학습을 진행할 수 있으면 좋을 것 같아서 쓰는 메모 조각

 

alert, prompt, confirm을 이용한 상호작용

상호작용이라 써있다. 🤔사용자와 반응을 주고받는 느낌으로 접근하면 쉽다.

브라우저마다 형태는 다르지만, 브라우저에서 만들어서 제공하는거라 사용자가 통일시킬 수 없다.
나중에 커스텀하게 알아서 만들어야..

alert

⚠️메세지와 일방적인 OK 버튼을 함께 둔 기본적인 확인 창

alert sample.

 

prompt

창의 타이틀과 사용자에게 입력받을 텍스트 (기본값-선택값 optional)을 받는 창


사실 타이틀도 옵셔널이라 아무것도 안넣고 써도 돌아가긴 돌아간다.
사용자에게 title 대신 yaong22222.도메인.컴 같은 주소가 뜨기도 한다.

 

아, 예제에 [...] 지금 저렇게 보이는 부분
[default] 가 디폴트로 넣을 수 있는 선택값을 위한 공간정도라고 생각하고 넘기는 편이 좋다. 
나중에 [...] 문법이랑 헷갈릴수가 있다.

🌱사용자가 아무것도 안넣고 엔터나 확인을 누르면 빈 'string', 취소를 누르면 'null' 형태의 결과가 나온다.

 

confirm

🌿사용자가 확인을 누르면 true, 취소나 esc 누르면 false 반응을 받을 수 있다. 불린형이다.

 

형변환

앞에서 소개한 여러가지 타입들을 강제로 바꾸거나 할 때 사용한다. 보통은 적절하게 바뀌는데, 원하지 않는 자동형변환이 되는 경우, 오류가 날 수 있다. 이런경우 명시적으로 형변환을 해준다.

 

문자형으로 변환

보통 불린이나 숫자형을 바꾸는데 사용한다.

let value = true;
alert(typeof value); // 여기의 타입이 그러니까 boolean형 상태인걸 직접 확인해보고,
value = String(value); // 강제로 문자열 형태로 바꾸어서 value엔 문자열 "true"가 저장되니
alert(typeof value); // 그걸 꼭 찍어서 확인 해 보는 좋은 예제.

 

숫자형으로 변환

문자로 입력한 123456 같은걸 연산에 제대로 활용하려면 확실히 변환해주는게 좋다.

NaN type을 체크해보자.

숫자로 못바꾸는걸 바꾸면 NaN(Not a Number) 이라는 문자같지만 숫자형인 숫자가 아니라는 숫자형 타입의 글자 나온다.

 

undefined는 바꾸면 뭔지 모르겠으니 NaN

true는 바꾸면 1 - (참, on)

false는 바꾸면 0 - (거짓, off)

 

비어있는 "" string 타입이나, null 은 숫자형으로 바꾸면 0, 변환에 실패하면  NaN

 

불린형으로 변환

 

문자열 "0"을 제외하고 (❗true❗) 비어있다고 느껴지는 그 모든것은 false 라는것. 만 알아두면 되지않을까.

 

 

기본연산자와 수학

 

연산자. 수학시간이다. +, -, * 연산자에 대해서는 문제없을 것 같고.

항 - 식에서 한 변에 있는 항(項)... 한자다. 잊어먹었으면 이걸 참고 -> www.sjbnews.com/news/articleView.html?idxno=476152

단항 연산자 - 항이 단독으로 있는 연산자

이항 연산자 - 옮긴다는 뜻의 이항이 아니라 2개의 항을 연산할 때 쓴다.

피연산자 - 연산을 당하는 친구

 

나누기에 사용하는 연산자 /

나누기 10 / 3을 하면 무한대로 0.333333333.... 으로 떨어질텐데 JS에서 계산하면 일단 3.3333333333333335 같은 끝자리가 묘하게 나오는데, 언젠가 나중에 js의 float 64비트 연산과 관련된 내용을 하다보면 아, 적당히 자르고 써야겠구나. 할것이다.

컴퓨터에서 수학을 계산하는 비트연산을 보러 당장 가면 개발을 포기할 수 있으니

일단은 간단하게 계산할 수 있는 표시 자리가 부족해서 적당히 끊었다로 이해하고 넘어가자.

 

세상엔 익힐게 왜이렇게 많을까...

 

나눈 값의 나머지를 뽑는 연산자 %,

일반적으로 10을 3으로 나눈다고 하면 1이 남는데, 그냥 계산기로 나누면 3.3333333333333335 이 되고 나머지가 안보이기 때문에, 나머지를 출력하기위해 쓴다.

나머지없이 잘 나눠 떨어졌는지, 🐣그러니까 소수점없이 깔끔하게 나눠졌으면 0이 나올테니까 이런걸 구분할 때 쓴다.

 

거듭제곱에 사용하는 연산자 **

거듭제곱, 이제곱 세제곱 네제곱 을 할 때 쓴다.

문서의 하단을 보면, 이걸로 제곱근도 구할 수 있는데, 제곱과 제곱'근(=root)'은 다르다!!!
기억이 날지 가물가물한데, 아무튼 제곱근을 원래 구하면 ± 플마를 나타낸다고 배웠지만


JS 개발에선 일단 양의 제곱근을 구해준다. (
다른언어에선 어떻게 주는지 모르니...)

 

이항연산자 '+' 로 문자열 연결

더하기는 문자열을 연결하는 특수한 기능이 있다.

문자열과 숫자열을 더하면 문자열로 합쳐져 연결!

 

단항 연산자 +와 숫자형으로의 변환

더하기 연산자는 문자열 연결 말고 하나 더 있는데,
예시를 들면 단독으로 숫자값이 있는 문자열 단항에 쓰이면 숫자형으로 변환 해 준다. 숫자형 변환 룰을 따르니, 
이미 숫자형인 경우 아무것도 영향이 없고, 다른형의 경우 숫자형 변환 룰에 따라 영향을 준다.

 

 

연산자 우선순위 

 

다시 수학시간인데, 괄호안의 내용을 먼저 처리하고, 곱셈이 덧셈보다 먼저인걸 알테니, 수치화해서 보려면 아래 우선순위 테이블을 참고하자. 😇

 

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/%EC%97%B0%EC%82%B0%EC%9E%90_%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84

 

연산자 우선순위 - JavaScript | MDN

연산자 우선순위는 연산자를 실행하는 순서를 결정합니다. 우선순위가 높은 연산자가 먼저 실행됩니다. The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interact

developer.mozilla.org

숫자가 높을 수록 먼저 처리 한다고 생각하면된다.😇

 

할당연산자

= 을 이야기하는데, 일반 수학에서 쓰는 방식으로 접근하면 곤란하고,
오른쪽에 있는 여러가지 형태의 값을 왼쪽에 할당을 하는 용도로 쓴다. (우결합성이라는 복선)

2개의 항을 필요로하는 이항연산자라 단독으로 쓸 수 없다.

 

복합 할당 연산자

 

💣지나가는 말로 할당연산자(=는)는는 는은 언제나 오른쪽에 있다.

복합적으로 한번 더 할당해서 동일한 연산을 한다고 생각하면 된다.

 

* 여기서도 언제나 오른쪽의 식을 다~ 계산하고 좌측에 할당하자. *

 

증가 감소 연산자

변수를 1 증가 1 감소할 때 사용한다.

전위형 후위형이 있다는 것.

해당 행에서 값을 확인한다면, 확인 전 증가하는가(전위형) 확인 후 증가하는가(후위형) 나눠진다.

아래 최종 요약에 보면 '코드 한줄엔, 특정 동작 하나' 만 작성하는게 좋다. 를 지키는게 좋다.

 

비트연산자

 

7개의 비트연산자를 보여주고 있는데, 일단 있다고만 확인하고 넘어가자.

 

쉼표 연산자

 

나중에 for 연산을 할 때 쓰기도 하는데, 아주아주 낮은 우선순위로 쉼표 이전의
아ㅡ, 아까 그 연산은 연산을 하기는 했어! 그리고 다음 연산을 했는데, 마지막에 한 연산이 이거야.

라는 방식으로 접근하면 좋다.

1 + 2는 아까 해봤어!!! 3 + 4 도 해서 알려줄게!!

 

for에서 쓸 때 예제가 좋은데, 
a 에 1을 할당했어!
b 에 3도 할당했어!

c 에 a * b 한걸 할당했어! c 의 값은 이거구나. 부터 시작하는 연산자이지만.. 다시봐도 가독성이 않좋다...

...정말.... 사용 할 일은 아마도 거의 없을것이다.

 

비교연산자

 

위에 다시 연산자 순위표를 한번 열어보고 순위는 12번에 위치하다는걸 기억해두고 시작하자.

불린형 반환

alert( 2 > 1 );  // true
alert( 2 == 1 ); // false
alert( 2 != 1 ); // true

결과적으로 평가 된 식은 불린형으로 나온다.

 

문자열 비교

 

이친구들은 숫자로 뭘까. 아래 표를 참고하자.

 

문자열을 비교하는 경우인데, 문자라는건 숫자도 컴퓨터가 알아먹기 좋게 숫자로 이루어진 코드가 존재한다.

www.w3schools.com/charsets/ref_html_ascii.asp

 

HTML ASCII Reference

HTML ASCII Reference ASCII was the first character set (encoding standard) used between computers on the Internet. Both ISO-8859-1 (default in HTML 4.01) and UTF-8 (default in HTML5), are built on ASCII. The ASCII Character Set ASCII stands for the "Americ

www.w3schools.com

여기에 있긴 한데, 문자 열이니까 하나 하나 문자로 이루어진 배열이며, 이 문자열 비교는 문자 한 하나 순서대로 비교를 해 가면서 순위를 정하게 되어 예문의 결과가 나온다.

 

 

다른 형을 가진 값 간의 비교

자료형이 다르면 숫자형으로 변환하고 바꾸게된다. 

🤔보통 자료형이 다른 경우 비교를 잘 안하지?

 

일치연산자

 

동등 연산자 == 는 비교를 하면서 숫자형으로 바꾸기 때문에, 문제가 있다.

타입까지 같은가!? 비교하는 일치연산자 === 을 이용하면 형 변환없이 둘의 값을 비교를 한다.

 

null이나 undefined와 비교하기

둘을 일치 연산자로 비교하면 형이 같지 않지만, 동등한지 비교하면 같다고 나오는데, 가능하면 

비교는 === 일치연산자를 쓰는게 요즘 국룰이니, 

== 는 가능하면 혼자 개발하거나 테스트에서 써 주시는걸 강력 권장ㅠㅠ

 

🥺 undefined랑 이것저것 비교하지 말 것... 0과 비교해도 false

 

'프론트 > 모던JS요약' 카테고리의 다른 글

3장 - 코드품질(0)  (0) 2021.01.13
2장 - 자바스크립트 기본(2)  (0) 2021.01.13
2장 - 자바스크립트 기본(0)  (0) 2021.01.09
낭독회 로그  (0) 2021.01.07
1장 - 소개  (0) 2021.01.07
모던JS를 처음 읽어보는 사람이 옆에 같이 띄워놓고, 읽으면서 부담 없이 학습을 진행할 수 있으면 좋을 것 같아서 쓰는 메모 조각
2장 처음부터
2장 자료형까지

Hello, world!

검색을 해 보면 유구한 역사(?)를 자랑하는 출력문자. 

 

HTML이라는 문서를 모르면 자바스크립트 기본을 읽기전에, HTML에 대해 대충이라도 익히고 와야겠구나. 하고 잠시 다른차원으로 여행을 다녀올 것을 권장한다.
예시로 아래 내용을 출력해보라고 하고 있다. 파일의 이름은 index.html 이나, test.html 같은 파일을 UTF-8 인코딩으로 저장 할 것.

 

<!DOCTYPE HTML>
<html>
<body>
  <script>
    alert( 'Hello, world!' );
  </script>
</body>
</html>

기본적인 사용법은 아주 간단하다.

'script' 태그

🍓<script> 라는 태그를 이용해서, 저기는 자바스크립트의 자리야. 라고 명시적으로 HTML 문서에서 자리를 깔아주면 된다.
옛날(?, 2016년 이전 쯤)에는 <script type="text/javascript"> 형식으로 공간을 마련 해 주기도 했는데, 요즘은 필요하지 않다.

잘 열고, 문법에 맞게 </script>로 잘 닫아주자.

 

외부에 스크립트 (에 파일이 있는 경우, 로드하는 방법)

대충 폴더구조

 

HTML 파일이랑 Javascript 파일을 나누는걸 소개하고 있다.

src 속성을 이용해서 index.html 파일에다가 넣어주는 과정. 웹에 올라가있는 주소나, 상대경로, 여러개를 넣고싶으면 여러번 순차적으로 넣어주면 된다.

 

index.html  파일 속의 내용

<!DOCTYPE HTML>
<html>
<body>
  <script src="./catholic.js"></script>
  전설에 따르면, 본문의 글자가 출력되는 부분이라고 전해진다.
  외부 js 파일의 내용을 소환하는 방법은
  body에 넣거나 head에 넣거나 하는데, 일단 우린 기초를 배우니 body에 넣자.
</body>
</html>

 

catholic.js 파일 속의 내용

<script>
  alert( '고양이, 세상!' );
</script>

아, alert('어쩌구 출력할 문구'); 라는 친구는 함수라는 친구로, 익스플로러나 크롬같은 브라우저 친구들에서 경고창을 띄우는데 사용한다.

코드구조

문! moon 도 아니고 door도 아닌, statement 라고 하는 문법 구조.
자바스크립트 구문에 대해서 이야기 하고 있다.

문서를 잘 읽어보면 ; (세미콜론) 으로 해당 구문, 문장의 끝을 명시적으로 나타내고 있다는걸 알아두자.

세미콜론

사실 ; 를 생략하기도 하는데, 묵시적으로 아 이게 문장의 끝이야.

또는, 어~ 이 문장은 여기서부터 여기까지야 라고 확실하게 추정할 수 있는 경우 생략하기도 한다.

프로젝트를 하다보면, 같이 일을하는 팀 약속이나 linter 룰에 따라 그런게 있다. 나중에 언젠가 알아보자. 세미콜론을 제거하는 경우도 있다.

 

alert("에러가 발생합니다.")
[1, 2].forEach(alert)

🍆이런 에러예제 같은걸 잘 알아두면, 어디서 문제가 생기는지 알 수 있다. 👻

 

주석

// 일단 슬래시 두개로 작성하는 이런것을 주석이라고 말한다.
alert("에러가 발생합니다."); // 이렇게 쓰기도 하고.

/* 
  이렇게 쓰기도
  하니까, 알아두자. 아주좋다. 주석기반코딩(!?) 을 하기 좋다.
*/

주석, 코멘트, 뭔가 설명을 해야할 때 개발자가 문서에다가 어 이거 이런거야 하고 적어두는 설명서에 가까운 그것.

자바스크립트 엔진은 이걸 무시하고 구동된다.

 

엄격모드

use static 이라는데, 보통 자바스크립트를 능구렁이 담넘어가는 유순한 언어라고 한다.

거기에 조금 족쇄를 달아서 빡세게 쓰는 방법이다.

보통 js 파일 최상단에다 

'use strict';

이런식으로 제일 먼저 작성한다.

 

나중에 알아들을테니 못알아들으면 넘어가자.

이걸 선언해두면, 언젠가 개발자가 변수를 선언하는 키워드를 사용하지 않고, 대충 선언없이 변수를 만들고 값을 구겨넣어 할당 한다던가 하는 경우, 에러가 발생시켜주는 착한친구.

 

개발자 콘솔창은 보통 이 엄격모드가 적용되어있지 않고, 👿구렁이 담넘어가듯 유연하단것도 알아두자.

 

변수와 상수

변수 : 변하는 값 💫

상수 : 한번 꽂히면 변하지 않는 값. (고정값) 💦

 

변수(variable)라고 부르는 친구는 예전엔 var 라는 키워드로 선언했다.

지금은 let 라는 키워드 친구로 선언한다.

 

각종 예시를 들면서 변수를 "선언" 하는 방법들을 말하고 있다. 언제나 무언가를 담을 수 있는 박스에 나는 물건을 담았다고 생각하자.

let message;

message = 'Hello!';

message = 'World!'; // 값이 변경되었습니다.

alert(message);

 

1. 예제에서는 메세지라는 박스를 만들고,
2. 메세지 박스에 '헬로' 를 담았다가

3. '월드'를 담는데, 메세지 박스에 담긴 글자를 버려버리고 다른걸로 바꿔 담았다고 생각하면된다.
4. 그리고 내용물을 alert 를 이용해서 보여준다.

 

한번 선언을 하면, 두번다시 같은 이름으로 선언할 수 없다는 특이사항을 알아두고, 밑으로 내려가서 이름을 짓는 방법도 알아보자.

 

변수 명명 규칙

다양한 규칙이 있는데 한번 정리하면 다음과 같다.

// 주석을 써보자.
let 사실한글도된다;
let 1234test; // 이런건 못쓴다.
let $ = 1; // '$'로 이름 만들기.
let _ = 2; // '_'이것도 된다고 했다.
let my-name; // 하이픈 '-'은 안된다.
let cat;
let cAt; // cat와 cAt는 같은것이 아니라 다른 변수공간이다.
let return // 예약어 (키워드) 같은건 사용할 수 없다.

 

상수

고정값

let 대신 const 로 쓰면 되고, = 으로 한번 할당되면 변하지 않아서 유용하다.

// 상수
const ERROR_MESSAGE = '오류!경고!';

 

보통 이런식으로 사용한다. 상수의 이름을 대문자로 쓰는건, 어디가서 변수와 쉽고 빠르게 구분하기 위해서.

 

이름짓는 방법에 대한 고찰은 언제나 해도 좋다.

 

자료형

변수에다 자꾸 = 으로 값을 할당 해 주었는데, 이런 값의 종류가 8가지가 있다. 이걸 자료형이라 한다.
가볍게 요약을 하면 다음과 같다.

=================
1. 숫자형
2. 빅인트형 (아주 큰 숫자를 담아두는 형태)
3. 문자형 (따지자면 문자열 형태이다.)
4. 불린 (참 거짓만 담는 형태)
5. 'null' - 비어있다
6. 'undefined' - 값이 할당이 되지 않았다.
7. 객체

8. 심볼
이들을 확인하기 위한 typeof 연산자
=================

 

숫자형 🔢

변수에 보통 숫자를 입력해서 넣는 값이다. 소수점도 숫자형에 포함된다.

일반적인 사용방법 이다. 변수의 이름은 넘버박스라고 만들었다.

let numberBox = 3939;
numberBox = 999.8765;

 

🤖특수한 숫자형도 있다는걸 알아두자.

// Infinity, -Infinity, NaN 같은 '특수 숫자 값(special numeric value)'

각각 무한대 ♾️, 마이너스무한대 -♾️, 숫자가 아님을 나타 냄.

BigInt 

일반적으로 자바스크립트의 숫자형은 특정한 범위 이내에서만 저장하고 표현할 수 있었는데, 최근에 몇몇 브라우저에서 이 제약이 풀렸다.

BigInt를 사용하는 것이다. 표준이 된지 얼마 안되었다고... 사용에 주의를 하자.

 

// 끝에 'n'이 붙으면 BigInt형
const bigInt = 123456789012345678999999999n;

 

문자형

자바스크립트에서 문자+문자열 다 합쳐서 문자형으로 지정해두었다.

세 종류의 따옴표를 사용한다는 부분을 잘 익혀두자. 특히 백틱 부분을 잘 기억해두자.

나머지 싱글 쿼테이션과 더블쿼테이션 두개는 쉬우니까...

 

// 백틱은 문자열 가운데에 변수를 구분해서 표현할 수 있는 방식이다.
const CAT_NAME = 'Nabi';
alert( `안녕, 네 이름은 ${name}야!` ); // 안녕, 네 이름은 Nabi야!

// 변수대신 표현식 넣어서 결과를 표현할 수도있다.
alert( `결과 값 = ${1 + 2}` ); // 결과 값 = 3

❤️‍🔥위 예제를 참고해서 한번 더 복습해보자.

 

불린

참(true)과 거짓(false) 두가지의 정보만 담고 있는 자료형이다.

각각 긍정 / 부정을 뜻한다는걸 알 수 있다.

 

null

헷갈릴 수 있으니, 다른언어는 넘어가고 자바스크립트에 대한 내용만 알아두자.
null이라는 형(태)는 널값 이라고 부르기도 한다. 보통 비어있다는걸 표현하거나.
알 수 없는 상황을 표현할 때 사용한다.

typeof 에서 유의사항을 확인하자.

 

undefined

🤔할당되어있지 않은, 정의가 되어있지 않은 뜻을 가지는 자료형이다.

null과는 다르다. null과는... 변수가 만들어져 있지만 null이 담겨있는것과, 아예 선언이 되어있지 않은것은 다르다.

 

출처 : morioh.com/p/20c2d9f373bc

 

How To Check If A String Is Empty/Undefined/Null in JavaScript

To check if a string is empty or null or undefined in Javascript use the following js code snippet.

morioh.com

0 : 과자박스의 이름(변수명)은 '쿠키즈' 이다. 안을 보니, 과자가 하나도 없다.

null : 이름은 '쿠키즈' 이지만, 안에 아무것도 없다. 박스도 안보인다.

undefined : 과자박스가 뭐야? '쿠키즈'가 뭐야? 그것들을 찾을 수 없다.

 

이런 느낌으로 기억을 해 두자. 점점 사용하면서 알게 될 것이다.
빨리빨리 넘어가보자.

객체(object)형 + 심볼(symbol)형

여기도 뒤에가서 자세하게 알려줄 테니, 🎯특수한 자료형의 두 종류가 있는데🎯정도로 이해하고 슉슉!

 

일단 객체(object) - 원시(primitive) 자료형이 아님. 복합적인 자료형으로 표현된다.

// 이런 객체 자료형인 오브젝트가 있다.
let catObject = {     // 객체
  name: 'nya cat',    // Key: 'name',  Value: 'nya cat'
  age: 3              //   키: 'age',      값: 3
};

// 이런 심볼 친구가 있다.
const sym = Symbol();

심볼(symbol) - primitive 는 원시자료형임. 2015년에 추가 됨. 고유한 식별자(unique identifier)를 만들 때, "참조"해서 사용 하는 자료형이고 문서에서 나왔듯이 나중에 알아보자.

 

typeof 연산자

변수나 상수가 어떤 형태인지 타입을 체크할 수 있는 기능을 가진 연산자이다.

// 사용방법
let name = 'nya';

typeof name // 'string'
typeof Math // 'object'
typeof null // 'object'
typeof alert // 'function'

남이 만든 사이트라던지, 나름 개발자 콘솔에서도 자주 사용하니까 기억해두면 좋다.

 

유의사항
(1) null은 null이다. object 라고 나오는거 JS자체 오류니까 기억해두고 조심하자.

(2) 함수는 객체이다. function === object . 오래된 오류인데, 이거도 null 처럼 하위호환성을 위해서 수정하지 못하는 슬픈 전설이 있다.

 

 

PS. 아래글은 MDN 자료인데, 급하게 훑어볼 사람에게 추천한다.

developer.mozilla.org/ko/docs/A_re-introduction_to_JavaScript#.ed.8f.90.ed.8f.ac_.28closures.29

 

JavaScript 재입문하기 (JS ​튜토리얼) | MDN

JavaScript 재입문하기 (JS ​튜토리얼) Jump to sectionJump to section 어째서 재입문일까요? 왜냐하면, JavaScript는 세계에서 가장 오해받고 있는 프로그래밍 언어로 악명이 높기 때문입니다. 종종 장난감같

developer.mozilla.org

 

'프론트 > 모던JS요약' 카테고리의 다른 글

2장 - 자바스크립트 기본(2)  (0) 2021.01.13
2장 - 자바스크립트 기본(1)  (0) 2021.01.11
낭독회 로그  (0) 2021.01.07
1장 - 소개  (0) 2021.01.07
0장 - 들어가면서  (0) 2021.01.06
// 메인터넌스 종료 후 평소에
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.exclude._ip": ""
  },
  "transient": {
    "cluster.routing.allocation.exclude._ip": ""
  }
}

// 보내야할 떄
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.exclude._ip": "192.168.xxx.xxx"
  },
  "transient": {
    "cluster.routing.allocation.exclude._ip": "192.168.xxx.xxx,192.168.xxx.xxx"
  }
}

보통 온프로미스 환경에서 해당 노드의 하드디스크나 메모리나 맛이가거나 ^ㅁ^
IDC에 특정 랙에 있는 노드가 죽어버렸을 때, 다른 샤드에 이전 복제나 신규 인덱스의 샤드가 생성되는것을 방지 하기 위해 씀.
transient는 노드 재부팅되면 사라지는 일회성 persistent는 영속성이 있는데, 둘다 써주는게 안전빵.

_ip 말고 name 도되고 group도 되는걸로 알고는 있음.

약간 책읽어주는 클로버램프 느낌으로 모던JS를 사람들과 같이 읽은 기록에 대한 메모.
뒤로 갈 수록 파트 진도가 나가는게 느려지니, 다른 입문자가 볼 때 대충 아 이렇구나 알 수 있을 듯(?)

 

주제 : 모던 Javascript 읊어보기
목적 : 한번 리딩 시 ======>> 예를들어 30분정도 읽었을 때, 이 책을 어느정도로 진도를 쫙 쫙 뺄 수 있는지 연구ㅋㅋㅋㅋㅋㅋ

참석자 : 리유(읽는사람), 호에, 유버그, 영롱, 모니
효과 : 한번에 배우는 만능 학습은 없다. 따라서 반복학습이 목적이므로, 
얼마나 훑어볼 수 있는지, 다들 따라올 수 있는지 확인 해 보는 연구이다(!?)
시작시간 : 24일 오후 21시 10분
시작파트 : 1-1 자바스크립트란 부터
종료시간 : 24일 오후 22시 00분
종료파트 : 2-5 자료형까지 읽음

=================
1. 숫자
2. 빅인트(아직까진 사용을 지양)
3. 문자형
4. 불린
5. 'null'
6. 'undefined'
7. 객체와심볼
8. 타입오브
=================


[2회차 로그]
참석자 : 리유, 호에, 유버그, 영롱, 으악
시작시간 : 28일 오후 21시 10분
시작파트 : 2-6 alert, prompt, confirm을 이용한 상호작용
종료시간 : 28일 오후 22시 00분
종료파트 : 2-8 기본연산자와 수학
후기 : 
1. UB에 대해. Undefined Behavior
2. 시간이 점점 오래 걸리기 시작했다. - 9개 1시간 -> 4개 1시간.
3. 쉼표연산자 왜 쓰지? => 늘상 for 에서 자주 쓰는 친구였다.
4. 시작시간은 어떠세요? 21시~22시 괜찮다는 의견.

[3회차 로그]
참석자 :  리유(독자), 호에, 람쥐, 유버그, 영롱, 모니
시작시간 : 12월 30일 21시 10분
시작파트 : 2-9 비교연산자
종료시간 : 12월 30일 22시 10분
종료파트 : 2-12 Null 병합 연산자
메모 : 나중에 Re:할 때 연산자 과제 꼭 해 볼것.
후기 : Null병합연산자 아직 시기 상조 같았지만 잘쓰면 될 듯 ?? = 삼항연산자의 진화형이지만, 역시 아직 맘에 안와닿는다. 남발하면 가독성을 해칠 것 같은 기분이 들었다. 언제나 잘 써야한다.

[4회차 로그]
참석자 : 리유(낭독자), 유버그, 모니, 람쥐, 영롱, 호에
시작시간 : 2021년 01월 01일 21시 10분
시작파트 : 2-13 while 과 for
종료시간 : 2021년 01월 01일 21시 50분
종료파트 : 2-15 함수 / 기본값 
후기 : label -> same goto

 


[5회차 로그]
참석자 : 리유(낭독자), 유버그, 모니, 영롱
시작시간 : 2021년 01월 04일 21시 05분
시작파트 : 2-15 함수 / 반환값
종료시간 : 2021년 01월 04일 21시 45분
종료파트 : 2-16 함수표현식
후기 : 챕터 2가 조금 남았으니 6회차에는 마무리해보는걸로...

 

 

[6회차 로그]
참석자 : 리유(낭독자),
시작시간 : 2021년 01월 08일 21시 10분
시작파트 : 2-17 화살표함수 기본
종료시간 : 2021년 01월 08일 21시 25분
종료파트 : 2-18 기본 문법 요약
후기 : 와 끝이다! 마지막은 15분정도. 소요되었다.

'프론트 > 모던JS요약' 카테고리의 다른 글

2장 - 자바스크립트 기본(2)  (0) 2021.01.13
2장 - 자바스크립트 기본(1)  (0) 2021.01.11
2장 - 자바스크립트 기본(0)  (0) 2021.01.09
1장 - 소개  (0) 2021.01.07
0장 - 들어가면서  (0) 2021.01.06
모던JS를 처음 읽어보는 사람이 옆에 같이 띄워놓고, 읽으면서 부담없이 학습을 진행할 수 있으면 좋을 것 같아서 쓰는 메모 조각

자바스크립트란?

누가 읽을지 모르겠지만 나랑 같이 읽어보자.
오, 자바스크립트에 대해서 구구절절하게 최근 쓰임세 등 뭔가 적혀있다.
javascript 를 초기 브라우저용 동적 언어라고 소개. 서버용으로도 쓸 수 있다고, 요즘은 엔진이 여기저기 들어있어 어디서든 쓰이는 추세라고 설명함. 역사나 자바스크립트를 분석하기위한 인터프리터 엔진들에 대한 간략한 소개들, 파생언어에 대한 소개가 있다.

앞으로 접할 JS(약어)친구는 이렇구나 정도, JAVA와 앞에 영문자 4글자만 같지 전혀 다른 친구라는 것을 말하고있는 페이지.

메뉴얼과 명세서

자바스크립트의 근간이되는 규약문서(ECMA-262 명세)에 대해 소개하고 있는데, 눌러서 보다보면 머리 아프니, 아 이런게 있음 이런거 보고 예전엔 브라우저를 만들었었다. 하고 넘어가자.

 

살다보면 JS에검색할모던자바스크립트를 보다가 이해되지 않는 경우 MDN을 참고해서 검색해보자. 하나 더 예를들면 구글에다가

"MDN" array sort

라는 식으로 입력. 마소의 MSDN도 나쁘지 않다.

 

 

근데 일단 모던 JS에 있는 내용으로 기본 학습을 하면 특별히 문제될 것 없으니 기억해두고 넘어가자.

코드에디터

개발자가 쓰는 도구에 대해 설명하는데, 취향것 골라잡아 쓸 것. 타인의 Editer를 비하하지 말 것.

 

개발자 콘솔

특별히 불필요한 내용은 없어보인다.
웹 브라우저별 개발자 도구 사용법을 알려주니, 익혀두자. 브라우저는 보통 크롬/사파리/파이어폭스/IE/오페라 까지해서 5대 브라우저라고 불렀는데, 지금도 같겠지?

'프론트 > 모던JS요약' 카테고리의 다른 글

2장 - 자바스크립트 기본(2)  (0) 2021.01.13
2장 - 자바스크립트 기본(1)  (0) 2021.01.11
2장 - 자바스크립트 기본(0)  (0) 2021.01.09
낭독회 로그  (0) 2021.01.07
0장 - 들어가면서  (0) 2021.01.06

출처 : ko.javascript.info/

 

모던 JavaScript 튜토리얼

 

ko.javascript.info

웹 개발 입문용으로도 좋고, 복습용으로도 좋은 모던한 자바스크립트 튜토리얼 웹사이트.

아마 보통 여기랑, 생활코딩, 너튜부 보며 웹개발자로 전직하는 사람이 많을 것 같다고 생각되네...
요즘엔 참 좋아진거같다.

 

눈 딱 감고 기초 복습을 위해 더 간단하게 정리해본다.

 

 

어떤 솔루션이나 어떤 행동도

 

모든 사람의 니즈와 부족한 부분을 만족시켜줄 순 없다.

.. 그저 한번 더 해보고 한번 더 만들어보고 기초라도 무시하지 않고 다시 돌아보고 생각할 뿐.

 

 

모던JS를 처음 읽어보는 사람이 옆에 같이 띄워놓고, 읽으면서 부담없이 학습을 진행할 수 있으면 좋을 것 같아서 쓰는 메모 조각

 

4챕터로 이루어진 1장 내용

 

'프론트 > 모던JS요약' 카테고리의 다른 글

2장 - 자바스크립트 기본(2)  (0) 2021.01.13
2장 - 자바스크립트 기본(1)  (0) 2021.01.11
2장 - 자바스크립트 기본(0)  (0) 2021.01.09
낭독회 로그  (0) 2021.01.07
1장 - 소개  (0) 2021.01.07

모카와 제스트

 

모카 작고 빠름

제스트 지속가능한 코드면... ㅇㅇ *추천*

연말 코드프리징 이후 우선순위

 

1. 자료구조 알고리즘

2. JS 다시 다지기 -> 진행중

3. 리엑트 스터디

4. 뷰로 밥벌어먹고 살았는데, 어떻게 할까 고민 중. -> 아직 벌어먹고사는중

5. 스벨트. 스벨트 재밌어보인다.

6. deno

7. elasticsearch 새버전에 대해서 학습 다시 해야함.

8. mongodb도 많이 올라갔네

9. 주워들은게 많으니 뭐 만들어볼건많은데..... 확 끌리는게없네  그래서 1-8이라도 잘 해보려고.

 

 

- 신년계획이라고 쓴다.

'잡담' 카테고리의 다른 글

記録 2020.01.12.  (0) 2021.01.13
記録 2021.01.11.  (0) 2021.01.12
티스토리 방치상태네...  (0) 2020.09.01
NewSQL memo  (0) 2018.07.27
memo  (0) 2018.07.05

음.. 정말 방치 상태라 거미줄이 여기저기 많이 쳐졌다.

 

코드조각이나 메모 같은걸 외부에 공개할 수 없고 가공해야하고, wiki에 작성하다보니 좀 방치되는 느낌이 강한데...

 

뭐... 먹고사는일=생존이 걸려있다보니 어쩔 수 없는것 같기도 하고

 

ㅠㅠ

 

꾸준하게 개발한걸 정리해서 보안정책에 걸리지않게 글 작성하는 분들 참 대단한것같고... 그래.

 

음...

눈부시지 않게, 스킨을 편집. 다크모드 느낌으로 수정.

'잡담' 카테고리의 다른 글

記録 2021.01.11.  (0) 2021.01.12
메모  (0) 2020.11.26
NewSQL memo  (0) 2018.07.27
memo  (0) 2018.07.05
mac에 brew 로 설치한 nginx 메모  (0) 2018.07.04

NewSQL-comparison

스키마가 있는거 빼고 뭐 저런 신통한 아이가...

------------

Some NewSQL solutions :

Some “In-Memory” databases provided by big vendors


ref. http://labs.sogeti.com/newsql-whats/

'잡담' 카테고리의 다른 글

記録 2021.01.11.  (0) 2021.01.12
메모  (0) 2020.11.26
티스토리 방치상태네...  (0) 2020.09.01
memo  (0) 2018.07.05
mac에 brew 로 설치한 nginx 메모  (0) 2018.07.04

golang + websocket  서버 프로그래밍



상황 - 서버개발 혼자, 코드 첫줄부터 어드민까지 6주


자동화 CI 배포 구축. (메소스, 마라톤, 등등)


고랭에 불안감이 좀 사라진 상태. (고랭 6~7개월차)


---


죽지않는 서버를 만들기위해 TDD 

ㄴ 테스트 패키지 통해서 -race 옵션으로 부하가 어디 걸리는지 체크해보고.


- GoCD (CI.CD 툴)

ㄴ git에 올려서 도커 이미지 빌드 했구.


- mesos - 마라톤 

ㄴ 인스턴스 비정상 종료시, 페일오버 전략을 진행.


- 엔그라인더 부하테스트.

ㄴ 테스트 스크립트는 자이썬을 써 에러율 확인. - 엔그라인더에서 좀 덜뜨길래 메소스 제한 걸린거 풀어줌... (뭐였지 기억안남)



- 메모리 고루틴 회수 체크.

ㄴ 어드민 페이지 생성. 뷰로짬.

ㄴ 사용율이랑 메모리 스택같은거 가져와서 확인용으로 빠르게 만듬.


-------

방법론에 대한 고민을 하게 됨.


고랭철학 CPS ( 순차 프로세스 통신)

ㄴ 채널 채널 채널

ㄴ 구글에서 일어나는 다양한 동시성에 환멸을 느껴 만든 프로젝트 언어.

ㄴ 약간 객체지향 부정적.

ㄴ Rob Pike



동시성

ㄴ 한꺼번에 많은 일을 다루는 것 (순차성이 중요함)


병렬성

ㄴ 많은 일을 한꺼번에 실행.



적당한 개발론을 고민.

- Mutex vs Channel

> 가장 빨리만나는 고 책을 참고했는뎅,


400만개 append 해서 500ms

언 버퍼드 채널로 했을 경우.

-- 테스팅을 해봄.

뮤택스는 400만개 다했고.

채널은 230만개 된 상황.

---- 잘되길래 뮤택스로 코딩을 했더니 데드락 같은걸 느낌. 

커뮤니케이팅을 통해 메모리를 공유하라.


고루틴간의 대화를 뮤텍스 보호에 너무 의존 하지 말 것.


그래서 뮤텍스 제거를 들어감.


stateful한 코드를 제거해 나감.

> 채널을 통해서 상태를 관리했음. leave채널이나, live채널에 넣는 식으로.


라이브러리를 고를때도 뮤텍스가 적거나 없는걸로 .


range, close, select


-----

고루틴 릭

- 뮤텍스 싸잉 안맞음.

- 샌더가 없는데, 리시버가 있거나

- 리시버가 없는데, 샌더가 있는경우.


defer 호출로 panic이 발생하면 send

defer HandlePanic()


닫힌 채널에 뭔가 값을 계속 보낼 떄. 이런걸 받았음.

- 고루틴을 닫는 타이밍을 고려...


-------

웹소캣 서버를 만들어야했고.


- 고 소캣 iO에서 브로드케스트 락 해제 관련 이슈가 있었고.

필요한 부분만 가지고와서


고릴라 웹소켓을 쓰고.

- 웹소캣 지원안하는 폰은 버리고.

- cors, origin 옵션문제도 여기 넣을 수 있음.


리드펌프 / 라이트 펌프 2개의 고루틴이 돌아감.



---------

- 7가지 동시성 모델 책.




1.4.7 / 1.99 있음. 서로 비호환 (완전 다르더라 ;;;;;;;;;;)


폴더만듬. mkdir sqoop


다운

wget http://mirror.navercorp.com/apache/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz


해제

tar xzf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz


환경변수 등록 (.bashrc)

export SQOOP_HOME=/어딘가 위치/sqoop

export PATH=$PATH:$SQOOP_HOME/bin


...

source .bashrc


테스트.

sqoop test


---- 스쿱 준비 완료.


mysql 준비.


db 생성. CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


형식에 맞게 테이블만들고.


... 날렸는데 안됨.

jdbc dirver가 라이센스 때문에 sqoop에 없나봄.


wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.28.tar.gz

받아서 속에 jar 만 sqoop/lib 폴더에 넣기.


..실행.

sqoop export --connect jdbc:mysql://서버:포트/디비명 --username 유저 --password 비번 --table 테이블명 --num-mappers 1 --export-dir /data/데이타

했는데

에러!! sqoop  Transferred 0 bytes 데이터 전송 안됨...!



=ㅅ= 아........ .... 리얼 클러스터랑 베타 DB랑 전송 막혔다. ACL로 클러스터 다 열어야 하는데 못해이거. 


경험했다.



'몰라그거무서운거 > 기타등등' 카테고리의 다른 글

쿠베 메모  (0) 2021.04.26
Docker compose yml 작성시..  (0) 2021.04.12
hive 에서 create table 등이 안될 때...  (0) 2021.04.02
java 추가 설치중 에러가...  (0) 2021.02.24
airflow 메모 - 코드조각  (0) 2017.12.07

RDD - Resilient Distributed Datasets 분산 이뮤터블 자바 객체


http://12bme.tistory.com/306

'몰라그거무서운거 > scala or spark' 카테고리의 다른 글

scala memo  (0) 2018.07.10
  • 값에 타입 선언 이후 변경불가.
  • 문자열보간모드 println(s"문자 $변수출력시앞에 s") / printf 도 있ㅇ넹.
  • && || 비교는 lazy비교... js와 다름... 주의.
  • ? : 일단 삼함 안보임. if (조건) 결과A else 결과B 로 대체가능.
  • 셀렉트 케이스 같은 스위치 케이스 없음. 매치표현식으로.
  • _ 와일드카드 ... 이거뭐야... match case 이외의 케이스를 표현.
  • 숫자 .abs, .min, .max
  • 문자 .reverse .captialize, .toInt
  • def Fu() { } 속에 return 안적어도 마지막ㅇㅣ 리ㄴㅌ됨ㅓ
  • ++나 --는 제공하지 않으므로 += 1을 사용해야 합니다 //////.......... -_-

  • 중첩 for 대신, 조건식 중첩으로 가능.
  • 아래는 메모.
  • scala> b

    res5: List[Any] = List(a, 1, true)


    scala> a

    res6: (String, Int) = (솔라,112123)

  • 테스트
  • 접근 (0) ._1
  • 리턴없는 프로시저


'몰라그거무서운거 > scala or spark' 카테고리의 다른 글

spark  (0) 2018.07.17
javascript, es6, vue, elasticsearch(+LK) ,scala, spark, python, linux, macos, testing tool, react native, hadoop cluster, etl, webpack, ansible, react, airflow, zeppelin, kafka, golang, shell script, restful, YARN, MapReduce, Zookeeper

'잡담' 카테고리의 다른 글

記録 2021.01.11.  (0) 2021.01.12
메모  (0) 2020.11.26
티스토리 방치상태네...  (0) 2020.09.01
NewSQL memo  (0) 2018.07.27
mac에 brew 로 설치한 nginx 메모  (0) 2018.07.04

방금 맥북에 설치한 정보 메모..


==> Installing nginx

==> Downloading https://homebrew.bintray.com/bottles/nginx-1.15.0.high_sierra.bottle.tar.gz

######################################################################## 100.0%

==> Pouring nginx-1.15.0.high_sierra.bottle.tar.gz

==> Caveats

Docroot is: /usr/local/var/www


The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that

nginx can run without sudo.


nginx will load all files in /usr/local/etc/nginx/servers/.


To have launchd start nginx now and restart at login:

  brew services start nginx

Or, if you don't want/need a background service you can just run:

  nginx

==> Summary

🍺  /usr/local/Cellar/nginx/1.15.0: 23 files, 1.4MB



내 서버에는 왜 /etc/nginx

..  암튼 맥북


시작 : $ nginx

종료 : $ nginx -s stop

재시작 : $ nginx -s reload


listen       80 으로 바꾸면 sudo

'잡담' 카테고리의 다른 글

記録 2021.01.11.  (0) 2021.01.12
메모  (0) 2020.11.26
티스토리 방치상태네...  (0) 2020.09.01
NewSQL memo  (0) 2018.07.27
memo  (0) 2018.07.05

빨리 진도 빼야하는데... -_-;


아무튼 배치처리 ...


살펴보니 용도는 대충 배치(일괄) 처리 이후, 그 결과 데이터를 벌크로 올리는 것 같고, 수정이나 삭제도 할 수 있나보다.


  1. 앞에서 다 삭제했지만, 벌크를 써서 만들어 넣어보자.

    ~]$ curl -X POST "localhost:9200/customer/_doc/_bulk?pretty" -H 'Content-Type: application/json' -d'

    > {"index":{"_id":"1"}}

    > {"name": "John Doe1111" }

    > {"index":{"_id":"2"}}

    > {"name": "Jane Doe2222" }

    > '

    {

      "took" : 11,

      "errors" : false,

      "items" : [

        {

          "index" : {

            "_index" : "customer",

            "_type" : "_doc",

            "_id" : "1",

            "_version" : 2,

            "result" : "updated",

            "_shards" : {

              "total" : 2,

              "successful" : 1,

              "failed" : 0

            },

            "_seq_no" : 18,

            "_primary_term" : 2,

            "status" : 200

          }

        },

        {

          "index" : {

            "_index" : "customer",

            "_type" : "_doc",

            "_id" : "2",

            "_version" : 2,

            "result" : "updated",

            "_shards" : {

              "total" : 2,

              "successful" : 1,

              "failed" : 0

            },

            "_seq_no" : 4,

            "_primary_term" : 2,

            "status" : 200

          }

        }

      ]

    }


    똑같은 패턴이다.
    잘 들어갔는지 보려면 조회.

    ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 2,

      "found" : true,

      "_source" : {

        "name" : "John Doe1111"

      }

    }


    1번

    ~]$ curl -X GET "localhost:9200/customer/_doc/2?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "2",

      "_version" : 2,

      "found" : true,

      "_source" : {

        "name" : "Jane Doe2222"

      }

    }


    얜 2번.

    잘 들어간듯. 


  2. 대량 수정 삭제.

    ~]$ curl -X POST "localhost:9200/customer/_doc/_bulk?pretty" -H 'Content-Type: application/json' -d'

    > {"update":{"_id":"1"}}

    > {"doc": { "name": "John Doe becomes Jane Doe" } }

    > {"delete":{"_id":"2"}}

    > '

    {

      "took" : 23,

      "errors" : false,

      "items" : [

        {

          "update" : {

            "_index" : "customer",

            "_type" : "_doc",

            "_id" : "1",

            "_version" : 3,

            "result" : "updated",

            "_shards" : {

              "total" : 2,

              "successful" : 1,

              "failed" : 0

            },

            "_seq_no" : 19,

            "_primary_term" : 2,

            "status" : 200

          }

        },

        {

          "delete" : {

            "_index" : "customer",

            "_type" : "_doc",

            "_id" : "2",

            "_version" : 3,

            "result" : "deleted",

            "_shards" : {

              "total" : 2,

              "successful" : 1,

              "failed" : 0

            },

            "_seq_no" : 5,

            "_primary_term" : 2,

            "status" : 200

          }

        }

      ]

    }


    한번에 1은 수정 2는 삭제.

    후, 200이 떨어졌으니..... 

    조회.

    ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 3,

      "found" : true,

      "_source" : {

        "name" : "John Doe becomes Jane Doe"

      }

    }

    [ㅇㅣ름이름@서버서버명 ~]$ curl -X GET "localhost:9200/customer/_doc/2?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "2",

      "found" : false

    }


    오케이 확인 끝.
    꼴랑 id 만으로 삭제함.


  3. 벌크는 중간 처리 내용이 실패한다고 하더라도... 중단하지 않는다. 라고해서 해봄.

    ~]$ curl -X POST "localhost:9200/customer/_doc/_bulk?pretty" -H 'Content-Type: application/json' -d'

    > {"update":{"_id":"2"}}

    > {"doc": { "name": "John Doe becomes Jane Doe" } }

    > {"update":{"_id":"1"}}

    > {"doc": { "name": "John Doe becomes Jane Doe122434" } }

    > 

    > '

    {

      "took" : 75,

      "errors" : true,

      "items" : [

        {

          "update" : {

            "_index" : "customer",

            "_type" : "_doc",

            "_id" : "2",

            "status" : 404,

            "error" : {

              "type" : "document_missing_exception",

              "reason" : "[_doc][2]: document missing",

              "index_uuid" : "4clf5AwmTQ-hruQl7EGJSg",

              "shard" : "2",

              "index" : "customer"

            }

          }

        },

        {

          "update" : {

            "_index" : "customer",

            "_type" : "_doc",

            "_id" : "1",

            "_version" : 4,

            "result" : "updated",

            "_shards" : {

              "total" : 2,

              "successful" : 1,

              "failed" : 0

            },

            "_seq_no" : 20,

            "_primary_term" : 2,

            "status" : 200

          }

        }

      ]

    }


    2번을 고치고 1번을 고치도록 했는데, 음... 그렇다.

    ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 4,

      "found" : true,

      "_source" : {

        "name" : "John Doe becomes Jane Doe122434"

      }

    }


    1 잘 고쳐짐.


    일단 여기까지.


이전 메모에는 클러스터(싱글) 헬스체크하고, 인덱스 만들어서 조회하고, 삭제하는걸 해봤는데... 정말 이걸로 끝인가(?) 흠터레스팅 하다.


bin의 .el~서치 실행해주자. -> 터미널 나갔더니 꺼져있더라. (systemd 로 나중에 등록하던가 하자.)


:thinking_face: 인덱스는 약간 RDB 테이블 같은 녀석.



  1. 약간 오버라이트 같은 데이터 수정을 해볼 것.
    앞에서 delete로 인덱스를 날렸으니 조회하면 404가 나올거다., 일단 데이터 한번 넣어서 확인 한번 해보자.

    ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "error" : {

        "root_cause" : [

          {

            "type" : "index_not_found_exception",

            "reason" : "no such index",

            "resource.type" : "index_expression",

            "resource.id" : "customer",

            "index_uuid" : "_na_",

            "index" : "customer"

          }

        ],

        "type" : "index_not_found_exception",

        "reason" : "no such index",

        "resource.type" : "index_expression",

        "resource.id" : "customer",

        "index_uuid" : "_na_",

        "index" : "customer"

      },

      "status" : 404

    }


    이렇게 404...

    ~]$ curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'

    {

      "name": "John Doe"

    }


    넣어주고.

    확인해보자.

    ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 1,

      "found" : true,

      "_source" : {

        "name" : "John Doe"

      }

    }


    음.... name 를 잘 보자. 수정은... 다음 과 같이.

    ~]$ curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'

    > {

    >   "name": "Joooooooooooooooon Duck"

    > }

    > '


    res

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 2,

      "result" : "updated",

      "_shards" : {

        "total" : 2,

        "successful" : 1,

        "failed" : 0

      },

      "_seq_no" : 1,

      "_primary_term" : 1

    }



    조회 하면.

    ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 2,

      "found" : true,

      "_source" : {

        "name" : "Joooooooooooooooon Duck"

      }

    }


    존덕....으로 덮어써진 것 같다. 다른점은 version 2 가 된점.

    인덱스에 새로운 아이디(2번) 추가해보자.

    ~]$ curl -X PUT "localhost:9200/customer/_doc/2?pretty" -H 'Content-Type: application/json' -d'

    > {

    >   "name": "Jane Doe"

    > }

    > '


    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "2",

      "_version" : 1,

      "result" : "created",

      "_shards" : {

        "total" : 2,

        "successful" : 1,

        "failed" : 0

      },

      "_seq_no" : 0,

      "_primary_term" : 1

    }


    얼추 드간거 같으니까. 1번 이랑 2번 한번 조회해보자. 

     ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 2,

      "found" : true,

      "_source" : {

        "name" : "Joooooooooooooooon Duck"

      }

    }

    내계정명@내서버명 ~]$ curl -X GET "localhost:9200/customer/_doc/2?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "2",

      "_version" : 1,

      "found" : true,

      "_source" : {

        "name" : "Jane Doe"

      }

    }


    1,2 볼 수 있음.

    1,2 지정해서 만들었는데, 미지정하면 알아서 autoincrement 하는 .... 것 같진 않고  지정하지 않으면 Elasticsearch에서 임의 ID를 생성하여 문서 색인화에 사용합니다. 라고 함.


    그래서 미명시 put 도 해보려고...

    앞에서 메모 한 <REST Verb> /<Index>/<Type>/<ID> 법칙엔 조금 벗어남. 


     ~]$ curl -X PUT "localhost:9200/customer/_doc/pretty" -H 'Content-Type: application/json' -d'

    {

      "name": "Jane Dodsfsfsdfsdfsdfe"

    }

    '

    {"_index":"customer","_type":"_doc","_id":"pretty","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}


    json pretty 가 사라졌다... 아무튼 들어간거 같음.

    조회해보면

    ~]$ curl -X GET "localhost:9200/customer/_doc/pretty"

    {"_index":"customer","_type":"_doc","_id":"pretty","_version":1,"found":true,"_source":

    {

      "name": "Jane Dodsfsfsdfsdfsdfe"

    }


    이런식으로 들어 감.

    근데 이건 잘못사용한 예의 하나일 듯. (그래서 json이 이쁘게 안나온건가?)

    put의 경우 id를 명시해 주는 경우에만 사용해야하는데, 지금 res를 잘 보면 id가 pretty 가 되었음.

    가이드에 있는대로 써보면.

    미 명시의 경우 POST를 사용한다. (id자동생성)

     ~]$ curl -X POST "localhost:9200/customer/_doc?pretty" -H 'Content-Type: application/json' -d'

    {

      "name": "Jane Doe12323456784567890"

    }
    '


    라고 날리면, res로 

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "YrQSWmQBU_p42XDzzCOy",

      "_version" : 1,

      "result" : "created",

      "_shards" : {

        "total" : 2,

        "successful" : 1,

        "failed" : 0

      },

      "_seq_no" : 2,

      "_primary_term" : 1

    }


    id가 자동 생성되었다.

    아하. 그렇구나... id 지정 put , 자동지정 post..

     

  2. 정말로 수정해보자.

    update 명령어를 쓸 건데.........인덱스의 1번 id내용을 고치려고 한다.

    ~]$ curl -X POST "localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'

    {

      "doc": { "name": "Jane Doe" }

    }

    '

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 3,

      "result" : "updated",

      "_shards" : {

        "total" : 2,

        "successful" : 1,

        "failed" : 0

      },

      "_seq_no" : 3,

      "_primary_term" : 2

    }


    라고 나왔는데, ........... 어.... 버전이 2에서 3이된거보면 업데이트 된 것 같긴하고.

    한번 더 다른거 예제에 있는 내용 넣어 봤다. 나이가 추가되었네.

    ~]$ curl -X POST "localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'

    > {

    >   "doc": { "name": "Jane Doe", "age": 20 }

    > }

    > '

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 4,

      "result" : "updated",

      "_shards" : {

        "total" : 2,

        "successful" : 1,

        "failed" : 0

      },

      "_seq_no" : 4,

      "_primary_term" : 2

    }


    버전4.


    이러고 조회 한번 해보면

    ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 4,

      "found" : true,

      "_source" : {

        "name" : "Jane Doe",

        "age" : 20

      }

    }


    바뀐게 보인다.

  3. 스크립트 사용해서 변경

    나이가 숫자인데, 스크립트로 증감할 수 있나보다.

    ~]$ curl -X POST "localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'

    > {

    >   "script" : "ctx._source.age += 5"

    > }

    > '

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 5,

      "result" : "updated",

      "_shards" : {

        "total" : 2,

        "successful" : 1,

        "failed" : 0

      },

      "_seq_no" : 5,

      "_primary_term" : 2

    }


    버전이 또 올랐네.

    데이터를 조회해봄.

     ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 5,

      "found" : true,

      "_source" : {

        "name" : "Jane Doe",

        "age" : 25

      }

    }



    ... 이 방식은 1ID 도큐먼트 만 증감시켜 줬느데, 

    6.3은 query로 다중 업데이트 증가가 가능하다.

    문서는 docs-update-by-query API

    이곳을 참고하면 될 것 같다. 음.. 예제 이름이 kimchy인데, https://twitter.com/kimchy 김치형님과 관련이 있나보다.

    .... 일단 나중에 보자.

  4. 문서(doc) 삭제 방법.

    ~]$ curl -X DELETE "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 6,

      "result" : "deleted",

      "_shards" : {

        "total" : 2,

        "successful" : 1,

        "failed" : 0

      },

      "_seq_no" : 6,

      "_primary_term" : 2

    }


    조회해보니 삭제가 되어 안보이는 것 같다.

    ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "found" : false

    }


    없다.


    일단 일도 해야하니 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ 여기까지 해두고... 다음은 배치처리인가.

ref. https://www.elastic.co/guide/en/elasticsearch/reference/current/_batch_processing.html

ref. https://www.elastic.co/guide/kr/elasticsearch/reference/current/gs-modifying-data.html

... ES 해야함.


참고문서 두개 번갈아가면서 봄.


한글 5.4 https://www.elastic.co/guide/kr/elasticsearch/reference/current/gs-installation.html

영문 6.3 https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html



  1. 서버 하나 vm으로 받음. (다음번엔 여러대 클러스터 작업엔 엔씨블로...)

  2. 1.8 깔려있다. 감사합니다. 근데 java_home이 없음. 
    vi ~/.bash_profile  에다가 등록함.

  3. es tar 다운

    curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.0.tar.gz


  4.   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                     Dload  Upload   Total   Spent    Left  Speed

     29 87.1M   29 25.4M    0     0   318k      0  0:04:40  0:01:21  0:03:19  378k


    용량이 좀 있네..

  5. 압축 풀고.
    tar -xvf elasticsearch-6.3.0.tar.gz


  6. cd elasticsearch-6.3.0/bin

    디렉토리 이동.

  7. bin]$ ./elasticsearch


    노드랑 싱글 클러스터 실행 가능하다고 함.

  8. OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N


    시작부터 이런게 뜨네 ..... 알아서 구성 해줄것이지..ㅠㅠ


    나머지 맥은 홈브류로, 윈도우는 인스톨러가 있는듯. 안중요하니 넘김.


  9. ./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name 



    실행 시 클러스터 이름, 노드 이름 지정가능.

  10. 음... 9200번 포트를 사용해서 rest API를 제공하나봄.(퍼블리쉬_어드레스) ... 9300 번은 뭔지 ? (바운스 어드레스)
    일단 넘어감.

  11. REST API 로 거의 모든것을 할 수 있는거 같은 느낌을 줬음.
    클러스터, 노드, 헬스체크, CURD 뭐 여러가지 등등... 고급작업까지 라고 적혀있음.

  12. 외부에서(맥북) 해당서버 ip로 curl 날리니 안되고... 흠...? 다른사람들도 이런가.

    설치 된 서버 내부에서 localhost 콘솔로 날려봄.

    ~]$ curl -X GET "localhost:9200/_cat/health?v"

    epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent

    1529253972 01:46:12  elasticsearch green           1         1      0   0    0    0        0             0                  -                100.0%



    그 외에도 키바나 콘솔에서 다음 api를 날릴 수 있다고함.
    ... 그냥도 날릴 수 있었음. 언젠가 키바ㄴㅏ 사용법을 다음엔 알아봐야겠다. elk니까...

    일단 정상이라 그린임.

    노랑은 모든 데이터 사용가능하지만 일부 리플리카가 미배정된 상태.
    레드는 비정상. 부분동작.

  13.  ~]$ curl -X GET "localhost:9200/_cat/nodes?v"

    ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name

    127.0.0.1            9          93   4    0.00    0.01     0.06 mdi       *      7EmJiq_


    노드목록은 ㅇㅣ렇게 체크 가능한것 같다. ... 짠한 유일노드.

  14. ~]$ curl -X GET "localhost:9200/_cat/indices?v"

    health status index uuid pri rep docs.count docs.deleted store.size pri.store.size


    모든 색인(indices) 나열 이라고 하는데. 없ㄷㅏ.

  15. 색인 ...  index 생성. 'customer' 라는걸 만들고 색인을 나열한다고...

    curl -X PUT "localhost:9200/customer?pretty"

     ~]$ curl -X PUT "localhost:9200/customer?pretty"

    {

      "acknowledged" : true,

      "shards_acknowledged" : true,

      "index" : "customer"

    }


    curl -X GET "localhost:9200/_cat/indices?v"


     ~]$ curl -X GET "localhost:9200/_cat/indices?v"

    health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size

    yellow open   customer axCGidU6Qy2D7Eercp5ATw   5   1          0            0       460b           460b


    아... rep가 1이라서 옐로인가봄.
    싱글 노드라서.


  16. 'customer' index 에다가 뭘 집어넣으려고 한다...


    curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'

    {

      "name": "John Doe"

    }

    '


    유형이 어떤지 알려줘야 한다고... 위에처럼 넣고나면.

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 1,

      "result" : "created",

      "_shards" : {

        "total" : 2,

        "successful" : 1,

        "failed" : 0

      },

      "_seq_no" : 0,

      "_primary_term" : 1

    }


    이렇게 응답이 오고.

    내부 id는 1, 타입은 doc... 뭐  등등 정보가 있음.

  17. ~]$ curl -X GET "localhost:9200/customer/_doc/1?pretty"

    {

      "_index" : "customer",

      "_type" : "_doc",

      "_id" : "1",

      "_version" : 1,

      "found" : true,

      "_source" : {

        "name" : "John Doe"

      }

    }



    found 필드? - 찾았다고 알려주는 필드. source 는 앞에 넣은 json 문서네.


  18. 삭제 후 확인

    curl -X DELETE "localhost:9200/customer?pretty"

    ~]$ curl -X DELETE "localhost:9200/customer?pretty"

    {

      "acknowledged" : true

    }

    curl -X GET "localhost:9200/_cat/indices?v"


    ~]$ curl -X GET "localhost:9200/_cat/indices?v"

    health status index uuid pri rep docs.count docs.deleted store.size pri.store.size


    ... 인덱스 날아감.


  19. <REST Verb> /<Index>/<Type>/<ID>


    이런 패턴이 있는걸 익혀두라함.

    일단 여기까지.



airflow Variable, Connections 암호화 하는 법.

airflow.cfg


# Secret key to save connection passwords in the db
fernet_key = cryptography_not_found_storing_passwords_in_plain_text


fernet_key를 저부분에 생성해서 넣으면 됨.


주의1 ::: 이후 한글키나 한글값을 저장하면 다음과 같은 오류가 남.

알아서 코드나 디비를 수정 하길... 바람. 참고주소 https://libsora.so/posts/python-hangul/

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc7 in position 0: ordinal
not in range(128)


주의2 ::: 이전에 만든키는 그냥 일반키이다.


fernet_key 만든는 방법. 

$ pip install cryptography

안깔려 있으니 설치 한다. (  https://cryptography.io/en/latest/installation/  )


$ python -c "from cryptography.fernet import Fernet; FERNET_KEY = Fernet.generate_key().decode(); print FERNET_KEY"


콘솔창에 치면 다음줄에 키값이 떨어질텐데 이걸 위에 넣으면 됨.


..



hook

http://tech.marksblogg.com/airflow-postgres-redis-forex.html




'몰라그거무서운거 > 기타등등' 카테고리의 다른 글

쿠베 메모  (0) 2021.04.26
Docker compose yml 작성시..  (0) 2021.04.12
hive 에서 create table 등이 안될 때...  (0) 2021.04.02
java 추가 설치중 에러가...  (0) 2021.02.24
sqoop 메모.  (0) 2018.07.19

js 하다보면 근 1년사이 너무 많이 뭔가 나온다.

웹팩 친척인가... 대항마인가 라이벌인가 뭔가 모르겠지만. 


parcel - 꾸러미 (파셀? 파스-얼? 파쉘? 파스엘? 파쒀얼??) 라는 새로운 모듈 번들러가 나왔다.







구글번역 최고


공홈 : https://parceljs.org/

git : https://github.com/parcel-bundler/parcel



일단 써보고...판단해야지.


퀵가이드 따라 한 메모.


설치


🤖  parcel-test npm install -g parcel-bundler


parcel-test 폴더 하나 만들었고. 일단 난, npm 쓰니까, 글로벌로 꾸러미 설치하고...


package.json 생성.


🤖  parcel-test npm init -y


기본 셋으로 빠르게 생성.

.. 뭐 모든 종류 파일을 엔트리로 지정할 수 있다는데... php도 되나보네. 근데 js나 html이 좋다고 써져있다.



html 파일, js 파일 생성


간단하게 src에 index.js (콘솔로그정도) 와 index.html 만들고.


그냥 이대로 콘솔창에


🤖  parcel-test parcel index.html

Server running at http://localhost:1234

  Built in 305ms.


라고 입력했더니 뭐 빌드 하고 서버도 띄웠네..


폴더구경



dist 폴더 만든적이 없는데, dist 폴더가 생겼다. 지정해 준 기억도 없다.


js도 같이 들어갔다는 점.




번들된 dist 내부의 index.html을 열어보면(오른쪽) 잘 만들어져있다.


포트변경은 

parcel [목적파일] -p [포트번호]


후기


1. 간단하네. 심플 프로젝트 용으로 괜찮겠다. parcel만 앞에 붙이면 [개발서버+빠른번들링]


2. 버그인ㅈㅣ모르겠는데, python airflow 8080에 띄워놓았는데, parcel로 8080 띄우니까, 에러안나고 꾸러미 우선 올라가더라.

-airflow 미아되어버림.-


이건 좀 더 ㄴㅏ중에 파이선써버와 어떤 관계가 있길래 중복으로 뜨는지 알아봐야지.

꾸러미 끄니까, airflow로 다시 붙음. -_-? 왜???????? 왜일까..


3. watch 옵션 붙이지 않아도 기본적으로 꾸러미 로컬 개발 환경에서는 watch 하고 있다.


별도로 서버를 구축해서 사용하는 경우 watch 옵션을 붙여주면, 꾸러미 내부의 개발서버 띄우지 않고 watch 만 할 수 있었다.


parcel watch [목적파일] // Won't use hot module server.


분명 watch 해놓고 왜 서버 안뜬다고 할 사람 있을 것 같다.


총평


간단하네. 


빠른지는 아무것도 안넣어서 잘 모르겠다...




기타.

✨ Production

When it comes time to bundle your application for production, you can use Parcel's production mode.

parcel build entry.js


프로덕션... 설명... 간단해...



앞으로 찾아야 할 것


1. webpack.config.js 같은 것은 없나?


2. 외부라이브러리 설치 후 모듈 import 도... 진짜? 간단해??


3. [ CSS, other compile-to-CSS languages like LESS, SASS, and Stylus ] 가 들어 있다는데, 상세옵션을?? 어떻게??



빠른 분들 나오자마자 리엑트용 보일러 플레이트를 내어놓았다.

https://github.com/rwieruch/parcel-react


아직 parcel-vue 는 없다. vue-loader .vue 파일이 문제인 듯.


1.0.0 기반으로 작성 됨.


끝.



+ Recent posts