영원 웹 개발과 일상

elasticsearch 설치하기 (Ubuntu 20.04)

#[🌎elasticsearch] Elasticsearch 설치하기 (Ubuntu 20.04)



👓 잠깐만 이거 했니??!!

다음과 같은 사항이 필요합니다.

  • Ubuntu 20.04 버전이 깔려 있는 OS
  • 듀얼코어 이상의 cpu 와 4gb 이상의 램

    원활한 실행을 위해 필요하며 필수는 아닙니다.

ElasticSearch는 자바로 만들어졌기 때문에 JDK 가 설치되어야 하지만 ElasticSearch를 설치하면서 JDK 가 같이 깔리게 됩니다. 자바 문제가 발생한다면 지원하는 JDK를 다시 깔고 JAVA_HOME 변수를 다시 설정해주세요. Elasticsearch JDK 버전 확인하기 ✈


🥽 따라와

설치과정은 ElasticSearch 7.x 버전을 기준으로 합니다. 버전이 다르면 수행이 다를 수 있습니다.

Step 1 - 설 치 하 자

  • Ubuntu 에서는 ElasticSearch 컴포넌트가 기본적으로 이용이 불가능합니다. 하지만 apt 명령으로 설치 후 Elastic 의 패키지를 설치한다면 이용 가능합니다.
  • ElasticSearch는 너를 사랑해서 Elastic 인증키로 서명이 되어 있습니다.(보안을 위해서라는 뜻) 키를 통해 인증받은 패키지들은 모두 사용가능합니다.
  • 설치를 위해 다음을 실행하여 Elastic Public GPG 키를 추가해주세요
    $ curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch sudo apt-key add -
  • sources.list.d 폴더에 Elastic 소스리스트를 추가해주세요! APT 가 새로운 소스를 찾아야하거든요!! (다음 입력하라는 뜻)
    $ echo “deb https://artifacts.elastic.co/packages/7.x/apt stable main” sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
  • package lists 들을 업데이트 해야겠죠?

    $ sudo apt update

  • 드디어 설치!

    $ sudo apt install elasticsearch

두둔

Step 2 - 설 정 하 자

  • 로컬 머신에서 돌리기 위해서 약간의 수정이 필요하답니다! ElasticSearch 는 elasticsearch.yml 에서 설정 관리되고 있습니다. (열어라는 뜻)

$ sudo nano /etc/elasticsearch/elasticsearch.yml

  • 내려 내려 내려 내려 (다음 과 같은 영역을 찾아라는 뜻) 그리고 바꿔 (: 이후에 내용을 원하는 값을 설정합니다.)

# ———————————- Network ———————————– # # Set the bind address to a specific IP (IPv4 or IPv6): # network.host: localhost . . .

주의 yml 파일은 포맷이 매우 중요합니다 ‘ : ‘ 다음에 반드시 뛰어쓰기를 해야합니다.


Step 3 - 실 행 하 자

  • systemctl 명령으로 실행해봅시다.
  • 초기 수행에 시간이 걸리니 잠시 기다려주세.

    $ sudo systemctl start elasticsearch

  • 한번 확인해볼까요?

    $ service elasticsearch status

  • 위의 명령을 입력후, active running 단어가 보이면 정상 실행중이라는 겁니다. 램 많이 잡아먹네요.
  • 이제 컴퓨터가 켜질 때마다 자동으로 실항하게 해줍니다.

    $ sudo systemctl enable elasticsearch

Step 4 - 확 인 하 자

  • 별도로 포트 설정을 안했다면 http://localhost:9200 으로 접속하면 json 형식으로 값이 뜨면 성공!!

    😁

고생하셨습니다!!

기본적인 사용법에 대해서는 다음 포스트에서 ~


elasticsearch 소개

#[🌎elasticsearch] Elasticsearch이란?



네이버 및 구글에서 원하는 문서를 검색하면 잘 나옵니다. 어떻게 이런게 가능할까요 ???

전문검색(Full-Text-Search 이하 FTS)은 검색 단어를 입력하면 해당하는 문서와 “관련 깊은” 자료를 보여주게 됩니다.

단순한 문자열 일치 연산으로는 네이버나 구글의 검색과 같은 결과를 보여주기는 어렵습니다. 따라서 FTS 에서는 모든 문서의 단어와 문장을 검색하여 점수를 매기게됩니다. 이 과정에서는 머신러닝과 같은 자연어 처리 과정이 포함되게 됩니다.

당연히 모든 문서의 단어와 문장을 검색하고 점수를 매긴 후 점수 순서대로 보여주기 때문에 기존의 문자열 일치 연산보다 복잡한 연산을 하게 됩니다.

다시 말하자면 전문검색은 우리가 원하는 문서와 관련깊은 문서들을 보여주는 기술이라 생각하시면 됩니다.


🥽 ElasticSearch

FTS 기능은 분석 엔진으로 제공될 수도 있고 DBMS에 기능이 탑재될 수도 있습니다.

Lucene, Solr, ElasticSearch 등 다양한 분석 엔진이 있고 Mongodb, Postgresql, AzureSQLDatabase 등 다양한 DBMS에서도 지원하고 있으니 더 검색해보는 걸 추천드립니다.

그 중에 ElasticSearch 를 소개하려고 합니다.

ElasticSearch 는 FTS 를 지원하는 오픈소스 검색 및 분석 엔진입니다. Apache Lucene을 기반으로 구축되었으며 다음과 같은 사항들을 강조합니다.

  • 빠르다. Lucene을 기반으로 구축되었기 때문에 빠르며, 실시간에 가까운 속도를 보여줍니다.
  • 분산적이다. 샤드라고 하는 저장형태로 여러 컨테이너에 걸쳐 분산, 복제되어 저장되기 때문에 분산적이라고 할 수 있습니다.
  • 간소화된 데이터 Beats와 Logstash, Kibana 를 통해 데이터를 실시간으로 시각화하며 로그, 인프라 메트릭 데이터에 신속히 접속가능합니다.

ElasticSearch 는 또한 다음 언어를 위해서 클라이언트가 공식적으로 지원합니다.

  • 자바
  • 자바스크립트
  • Go
  • .NET(C#)
  • PHP
  • Pearl
  • Python
  • Ruby

😁

프로젝트를 진행하면서 Full Text Search 기능이 필요하여 찾다가 ElasticSearch 를 찾게 되었고 ElasticSearch 에 흥미를 가지게 되었네요.

저보다 정리를 잘한 가이드북이 있으니 꼭 보시길 추천드립니다.

다음 시간에는 ElasticSearch 를 Ubuntu에 설치하는 방법으로 찾아뵙겠습니다.


프로그래머스 연습문제 3 x N 타일링 풀이

#[프로그래머스✈][연습문제] 3 x N 타일링 풀이



👓 문제 요약

유명한 DP 문제 2 x N 타일링의 업그레이드 버전

이젠 세로의 길이가 2가 아니라 3이다!!

DP 공식을 잘 유도하면 쉽게 풀 수 있다!!

자세한 문제 설명과 제한 사항은 프로그래머스 홈페이지 참고. 문제풀러가기

🔑 문제 풀이

dp 공식을 유도해야하는데 순서대로 잘 그려보면 알 수 있다. 일단 n이 홀수면 타일링을 할 수 없으므로 답은 0 이다.

그려보면

  • n : 2 일 때 답은 3
  • n : 3 일 때 답은 0
  • n : 4 일 때 답은 11 이다.
  • n : 6 일 때는 답이 41 이다. (너무 많이 그려야해서 찾아봤다)
  • n : 8 일 때는 답이 153 이다. (너무 많이 그려야해서 찾아봤다)

n 이 4일 때를 생각해보자.

  • 3X2 타일링 의 방법의 수 * 3X2 타일링의 방법의 수 = 9
  • n 이 4일 때만 만들 수 있는 방법 2를 더하면 11가지의 경우가 있다.

    (ㅣ = ㅣ 이런식으로 가운데 가로 타일을 놓는 것)

n 이 6일 때를 생각해보자.

  • 3X4 타일링의 방법의 수 * 3X2 타일링의 방법의 수 = 33

    (3X4 에는 3X2와 3X2로 만들 수 있는 모든 경우의 수가 포함되어 있다.)

  • n 이 6일 때만 만들 수 있는 타일의 수 2
  • 또 생각 해야할 것이 3 x 2 의 타일링의 방법의 수 * 2 와 3 X 4 만이 만들 수 있는 타일의 경우 2가지를 곱한 것을 더한다. = 6

    왜냐하면 3X4 타일링의 방법의 수 * 3X2 타일링의 방법의 수를 할 때 오른쪽 4칸을 포함하는 오직 3X4만이 만들 수 있는 2가지 경우의 수는 들어가있지 않기 때문이다.

n 이 8 일 때는

  • 위와 마찬가지로 3X6 일때 타일링의 방법의 수 * 3X2 일 때 타일링의 방법의 수 = 123
  • n 이 8일 때만 만들 수 있는 경우 : 2
  • 3X2 일 때 타일링의 방법의 수 * 3X6일 때만 만들 수 있는 타일링의 수 = 6
  • 3X4 일 때 타일링의 방법의 수 * 3X4일 때만 만들 수 있는 타일링의 수 = 22

감이 오는가?? 3XN 을 타일링 할 때는

  • 3X(n-2) * 3X2 를 곱한 값
  • n 일 때만 만들 수 있는 2가지 경우
  • 3X2 * (3X(n-2)일 때만 만들 수 있는 경우 2개)
  • 3X4 * (3X(n-4)일 때만 만들 수 있는 경우 2개)…. 앞의 수가 3X(n-2)에 해당할 때까지 해주면 된다.

다시 말하면

  • N-2 일때 경우의 수 * 3(3X2타일링의 방법의 수)
  • N일 때만 만들 수 있는 경우 2개
  • N-2k(k = 1,2,3….) N-2k가 N-2 가 될 때까지의 수 각각에 2를 곱한 값을 더해주면 된다.

🥽 소스코드 및 소스해석

프로그래머스 사이트가 아닌, visual studio 에서 코드를 작성해서 그대로 가져온 것 입니다. 일부 테스트 코드가 존재합니다.

#include <string>
#include <vector>

using namespace std;

//풀이
//ex n = 8
//더해야할 것
//answer(6) * answer(2)
//answer(2) * 2 (n 이 6일때만 존재하는 2개의 경우)
//answer(4) * 2 (n 이 4일때만 존재하는 2개의 경우)

//dp1의 인덱스는0 부터 시작되며 n이 2씩 증가할 때 마다의 값이 저장됨 n이 2,4,6,8 ....일 때
//dp2는 인덱스 0 부터 인덱스 n - 2 까지의 각각의 값 *2 의 합이 저장.

long long dp1[4096];
long long dp2[4096];
int solution(int n);
int main() {
    solution(16);
}
int solution(int n) {
    if (n % 2 == 1)
        return 0;
    dp1[0] = 3;
    dp1[1] = 11;
    dp2[1] = 6;
    for (int i = 2; i < n / 2; i++) {
        dp1[i] = (dp1[i - 1] * 3 + dp2[i - 1] + 2) % 1000000007;
        dp2[i] = (dp1[i - 1] * 2 + dp2[i - 1]) % 1000000007;
    }
    return dp1[n / 2 - 1];
}

🔨 문제 후기

디피는 어렵다. 단순한 문제 일 수록 더욱 어렵다.

생각을 많이하고 시간을 많이 소요하는 문제들도 생각보다 많다.

화이팅!


지킬을 이용하여 깃허브 블로그 만들기

안녕하세요 만냥이의 하루 입니다.

저를 포함해서 많은 개발자 분들이 깃허브 블로그를 만드는데 지킬을 사용하고 계시는데 오늘은 그 방법에 대해서 글을 써보려고 합니다.


목차

  • 당신에게 먼저 필요한 것 !!
  • 지킬이 뭐에요??
  • 지킬 테마 선택
  • 깃허브 페이지로 배포하기
  • 첫 블로그 글 써보기
  • 마무리

당신에게 먼저 필요한 것 !!

  1. 당연하게도 깃허브 아이디가 필요합니다.!! 🚗깃허브로!
  2. Git에 대한 기본적인 이해 🚗깃허브 기본!!
  3. 마크다운 언어에 대한 기본적인 이해 (블로그 글작성을 위해 필요합니다.) 🚗마크다운 언어 배우기
  4. 개발할 수 있는 환경이 필요합니다. 저는 VSCode 를 사용했습니다. 🚗VSCode 다운받기
  5. 루비 언어 설치! 🚗설치하는법!
  6. 끈기와 인내심(가장중요😊)

지킬이 뭐에요 ??

🚗지킬 사이트로 가보기 !!

지킬은 마크다운, 리퀴드, HTML & CSS 를 사용할 수 있는 정적인 웹페이지를 배포 할 수 있도록 도와주는 프레임워크라고 생각하시면 됩니다.

루비 언어로 만들어진 지킬은 복잡한 데이터베이스나 업데이트 구조가 필요 없고 이미 다른 누군가가 만들어 놓은 지킬 테마를 이용하면 자신만의 블로그를 배포할 수 있습니다.

어렵다구요?? 사용하면서 알아갑시다!!

지킬 테마 선택

테마 고르는 사이트

테마를 고르실 때에는 원하는 디자인뿐만 아니라 그리고 원하는 기능의 제공 여부(카테고리, 태그 기능 등)를 체크하세요!! 🚗지킬 top 10 테마 추천!!🚗

저는 두 번째 사이트인 jekyllthemes.org 를 기준으로 말씀 드리겠습니다.

원하는 테마를 고른 후 누르시면 다음과 같은 페이지가 나옵니다.

테마선택

저는 지금 제 블로그에서도 사용중이고 기본적인 기능에 충실한 Lanyon 테마를 선택했습니다. 테마를 선택하는 3가지 사이트 모두 테마를 선택하게 되면 깃허브로 이어지는 버튼이 있습니다. 위의 경우는 Hompage라고 되어 있군요. 클릭해줍니다.

깃허브 페이지로 배포하기

Lanyon 테마는 자체적으로 카테고리, 태그 기능을 제공하지 않습니다. 후에 추가 설정 및 코드를 작성해야만 해당 기능을 사용하실 수 있습니다.

깃허브 페이지가 나오면 아래 README 문서를 잘 읽어보고 자신이 원하는 기능과 디자인에 적합한 테마인지 한번 더 훑어봅시다 !!

그리고 오른쪽 중간에 보면 fork 라는 버튼이 있습니다.(로그인 필요)

fork 버튼 위치 Fork 버튼을 누르게 되면 로그인 된 내 계정의 Repository 로 해당 깃허브 소스가 모두 복사가 됩니다.

레포지토리 이름

(사진의 경우 제 깃허브에서 가져온 것이라 Repository 이름이 tocktock.github.io 보입니다.)

Fork를 하게 되면 자신의 계정에 Repository가 생성 됩니다. 위 사진에서 ”/” 왼쪽에 있는 것이 자신의 계정 닉네임이고 오른쪽이 Repository 이름 입니다.

Repository 는 자신이 Fork 한 Repository 의 이름으로 생성됩니다. 깃허브 블로그를 만들기 위해서는 이 Repository 를 (자신의 계정 닉네임).github.io 라는 형식으로 바꾸어 주어야 합니다.

세팅위치

화면의 중앙 즈음 보면 Settings 라는 태그가 보입니다. (누르고 들어가라는 뜻 입니다..)

Setting 페이지의 Repository name 을 (자신의 계정 닉네임).github.io 로 바꾸어줍니다. 🛑자신의 계정 닉네임을 반드시 소문자로 해주세요🛑

새로고침 하고 내리다 보면 Github Page 라는 문구가 보입니다. 깃허브페이지정보

위와 같이 Your site published at 어쩌구 저쩌구 라고 되어있으면 성공입니다.

깃허브 페이지 자체는 반드시 (자신의 계정 닉네임).github.io 일 필요는 없습니다. 원하면 바꿀 수 있습니다

해당 하는 Repository 는 깃허브 자체에서 파일을 작성하고 커밋해도 되지만 플러그인, 빌드 과정에서 필요한 소스가 설치가 안되어있는 경우도 있기도 하고 개별환경의 편의성을 위해서 이 Repository 를 자신의 컴퓨터에 Clone 해줍니다.

GitHub Clone 방법은 Github Desktop을 사용하는 방법과 커맨드 창에서 git clone “repository 주소” 를 입력하는 방법이 있습니다.

vscode를 기준으로

해당하는 폴더를 vscode 로 열고 좌측 상단의 Terminal 탭을 눌러 New Terminal 을 클릭해줍니다.

vscode 에서 terminal

  • 지킬과 번들러 gems를 설치하려고 합니다. 터미널에서 다음을 입력합니다.

    gem install jekyll bundler

  • 해당 하는 사이트를 빌드하기 위해 다음을 입력한다.

    jekyll build

  • 빌드된 사이트를 로컬에서 실행해보기 위해 다음을 입력한다.

    jekyll serve

모든 과정이 순탄하게 진행되었다면 http://localhost:4000 에서 빌드된 자신의 사이트를 볼 수 있다.

이 상태로 GitHub 로 push 하게 되면 깃허브 페이지에서 자신의 블로그를 볼 수 있다.

첫 블로그 글 써보기

_posts 아래의 폴더에 다음과 같은 형식의 파일을 만든다. (년도)-(월)-(일)-페이지의주소가될곳.md

예시 : 2020-10-03-this-is-my-url.md

해당하는 파일에 아래와 같은 글을 적습니다.

첫 글 사진

터미널에서 jekyll serve 를 입력하여 로컬에서 정상적으로 작동하는지 확인합니다.

이미 jekyll serve 가 실해중이라면 저장하는 것만으로 해당 사이트에 반영됩니다.

첫 글

정상적으로 포스트가 등록 되었다면 GitHub에 push를 해줍니다!.

와 첫글이다!!

원치 않은 오류가 발생하여 정상적으로 작동 안한다면 google 에 빌드 실패이유를 검색하시거나 파일명이 제대로 작성되었는지 확인해주세요!

마무리

지킬은 잘 만들어지고 사용하기 간편한 프레임워크이지만 자신의 블로그를 자신의 손맛대로 조금씩 변형하려면 조금 더 자세하게 알 필요가 있습니다.

다음 시간에는 config.yml 파일을 건드리는 것과 간단하게 카테고리를 생성하는 법을 알아 보도록 하겠습니다.

고생하셨습니다. ❤❤❤❤


프로그래머스 2019 KAKAO 겨울 인턴쉽 징검다리 건너기 해설

#[프로그래머스✈][2019 kakao 겨울 인턴쉽] 징검다리 건너기 해설



👓 문제 요약

“우리 돌다리는 약해유..”

니니즈 친구들이 라이언 선생님과 함께 가을 소풍을 가는 중에 징검다리를 만났다. 이 징검다리의 돌은 매우 연약하여 여러번 밟으면 부서지고 더이상 사용할 수 없다. 돌마다 내구도가 주어질 때 건널 수 있는 니니즈들의 최대 인원 수를 구하여라.

  • 우리 니니즈들은 반드시 뛸 수 있는 가장 가까운 돌로 뛰어야한다.
  • 니니즈의 인원은 200,000,000 이상이다.
  • 선생님은 건너지 않는다.

자세한 문제 설명과 제한 사항은 프로그래머스 홈페이지 참고. 문제풀러가기

🔑 문제 풀이

우선순위 큐를 잊어버릴 꺼 같아서 사용한다. 우선순위 큐에는 내구도가 가장 낮은 데이터를 top에 저장한다.

우선순위 큐에 대한 자세한 정보는 다음을 참고하라 우선순위큐 설명

top에 저장된 돌의 내구도 만큼 니니즈들이 건너갔다고 가정하고, 오른쪽과 왼쪽의 사용 가능한 돌의 거리를 계산하여 최대 건널 수 있는 거리를 넘어가면 더이상 건너지 못한다고 생각한다.

🥽 소스코드 및 소스해석

프로그래머스 사이트가 아닌, visual studio 에서 코드를 작성해서 그대로 가져온 것 입니다. 일부 테스트 코드가 존재합니다.

#include <string>
#include <vector>
#include <queue>

using namespace std;

struct STONE {
    int idx;
    int count;
};
struct COMP {
    bool operator()(STONE& a, STONE& b) {
        return a.count > b.count;
    }
};
priority_queue<STONE, deque<STONE>, COMP >myPQ;

int solution(vector<int> stones, int k);
int main() {
    vector<int> stones = { 5,5,5,5,200000000 };
    solution(stones, 4);
}
int solution(vector<int> stones, int k) {
    for (int i = 0; i < stones.size(); i++)
        myPQ.push({ i, stones[i] });

    int jumpCount = 0;
    bool donotJump = false;
    while (!myPQ.empty() && !donotJump) {
        STONE minStone = myPQ.top();
        jumpCount = minStone.count;
        while (myPQ.top().count == jumpCount) {
            STONE tempStone = myPQ.top();
            int rt = tempStone.idx + 1;
            int lt = tempStone.idx - 1;
            while (rt < stones.size() && stones[rt] < jumpCount) rt++;
            while (lt >= 0 && stones[lt] < jumpCount) lt--;
            if (rt - lt > k) {
                donotJump = true;
                break;
            }
            myPQ.pop();
            if (myPQ.empty()) break;
        }
    }
    return jumpCount;
}

🔨 문제 후기

이제 C++의 STL 없이는 알고리즘 코딩을 할 수 없을 것 같다.