기록76 [JAVA] Queue 인터페이스 구현하기 (3) ArrayDeque Queue라는 인터페이스를 구현하는 방식 중 ArrayDeque에 대해서 알아본다. add - offer이 완전히 동일한 것을 제외하면 나머지는 queue 추상메서드의 의도대로 구현되었다. ArrayDeque ArrayDeque은 내부적으로 다음의 변수를 사용한다. 이 변수들은 transient를 사용해서 직렬화되지 않는다. Object[] elements deque의 요소가 저장되는 배열. 항상 2의 거듭제곱이 배열의 길이가 된다. deque요소를 보유하지 않는 모든 배열 셀은 항상 null이다. int head deque의 head 요소의 "인덱스". deque가 비어있는 경우 tail과 같은 임의의 숫자가 저장된다. int tail deque의 다음요소가 추가될 "인덱스". private int M.. 기록/JAVA 2023. 7. 11. [JAVA] Queue 인터페이스 구현하기 (2) LinkedList Queue라는 인터페이스를 구현하는 방식 중 LinkedList에 대해서 알아본다. LinkedList LinkedList는 내부적으로 다음의 변수를 사용한다. 이 변수들은 transient를 사용해서 직렬화되지 않는다. int size 크기 Node first 첫번째 노드를 가리킨다. Node last 마지막 노드를 가리킨다. modCount는 LinkedList가 상속받은 AbstractSequentialList 내부적으로 쓰이는 변수다. 객체의 구조적 변경 횟수를 추적하기 위해 사용된다. Node LinkedList에서 사용하는 Node 클래스다. 한 노드에는 아이템과 이전 노드 주소, 다음 노드 주소를 저장한다. private static class Node { E item; Node next; .. 기록/JAVA 2023. 7. 11. [JAVA] Queue 인터페이스 구현하기 (1) Queue Queue라는 인터페이스를 구현하는 방식은 일반적으로 ArrayDeque, LinkedList 두 가지가 있다. 이 두 가지 클래스가 Queue의 추상메서드를 어떤 식으로 수행하는지 비교해보고자 한다. (java 1.8 기준) 그 이전에, 큐가 어떤 것인지부터 짚어본다. Queue란? 큐는 데이터를 일시적으로 저장하고 처리하는 자료구조다. 데이터를 먼저 입력한 순서대로 저장하고, 먼저 입력된 데이터가 먼저 처리되는 FIFO(First-In-First-Out)원칙을 따른다. 은행 창구, 버스정류장 등 일반적인 일상생활에서의 대기줄을 생각하면 쉽다. Queue 추상 메서드 목록 Queue 인터페이스에는 다음과 같은 추상 메서드가 있다. 이 메서드를 잘 기억해서, ArrayDeque이나 LinkedList에서.. 기록/JAVA 2023. 7. 10. [Flask] 플라스크 배포(feat.Docker) 1. main.py main.py의 main함수의 app.run부분을 이렇게 설정한다. main에서 app.run()을 써서 아무 설정 없이 그대로 돌아가도록 하면 flask에 기본적으로 내장돼있는 웹서버를 쓰게된다. 로컬에서는 정말 간편하지만 이걸 서버로 배포할 때는 문제가 생긴다. 어떻게 해도 외부접속이 안되기 때문이다. 따라서 app.run() 말고(=로컬호스트127.0.0.1에서만 돌아간다) app.run(host='0.0.0.0')으로 바꿔야 한다. if __name__ == "__main__": app.run(debug=False, host='0.0.0.0', port=5000) 2. waitress_server.py 생성 여기서 main은 위에서 내가 만든 flask 파일이다. main 파일.. 기록/CI&CD 2022. 10. 12. [Hadoop] Map Reduce를 위한 maven project 만들기 하둡 클러스터를 통해서 mapreduce를 실행했는데, 이 때 꼭 jar파일이 필요했다. 미리 공부했던 방식은 ant를 이용한 방식이었는데, 내가 따로 코드를 처음부터 작성하다보니 그 방식을 공부하기보다 이미 알고있는 maven방식을 쓰는게 좋다는 결론을 내렸다. 여건 상 하둡 클러스터 서버에서 maven을 설치할 수 없었기 때문에 로컬에서 빌드한 후 서버로 이동시켰다. 1. pom.xml 81번째줄의 mainClass부분이 중요하다. 메인클래스를 지정해야 jar파일을 실행할 때 Driver에서 설정한 명령어로 다른 클래스를 실행할 수 있다. 4.0.0 org.apache.hadoop.examples wayg jar 1.0 wayg http://maven.apache.org junit junit 3.8... 기록/그 외 프로젝트 기록 2022. 10. 11. [NLP] Open Korean Text 자바로 구현 몇년 전에 파이썬의 konlpy 라이브러리를 이용해서 okt를 써보았던 적이 있다. konlpy는 한국어 정보처리를 위한 파이썬 패키지로, 여러 종류의 한국어 자연어 처리기를 쉽게 사용할 수 있도록 돕는다. 나는 이번에 okt를 스프링부트에서 사용하기 위해서 자바로 직접 사용해보았다. 1. gradle 인코딩을 utf-8로 설정한다. tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } 그 후 dependencies에 다음을 추가한다. implementation('org.openkoreantext:open-korean-text:2.1.0') 2. 분석코드 분석을 위해 작성한 클래스다. analyseText 함수는 파라미터로 text와 선택할 품사태그배열.. 기록/그 외 프로젝트 기록 2022. 10. 10. [Jenkins] gradle 설정 이전에 빌드하던 방식은 maven을 사용했기 때문에 gradle 버전만 다시 정리해보았다. 1. 젠킨스 관리 > Global Tool Configuration Gradle을 추가해서 name을 G로 정했다. 자동으로 설치되도록 했고, 버전은 내 프로젝트와 맞췄다. 2. Item 구성 위에서 설정한 이름을 쓰고 Tasks에 clean build를 작성한다. Excute shell에 command line을 전처럼 설정하면 된다. 3. 빌드된 화면 기록/CI&CD 2022. 10. 6. [Hadoop] Map Reduce - timed out after 600secs 에러 해결 기록용 글이다. 1. 배경 1) 이 프로젝트에서는 형태소 단위로 wordcount를 진행하고자 했다. 하둡을 '하둡답게' 이용하고 싶었기 때문에 데이터 6기가 정도를 크롤링으로 모았다. 2) 내가 짠 mapreduce 코드는 관광지명, 형태소가 key고 value가 카운팅횟수이기 때문에 한 줄에 관광지명, 텍스트가 전부 다 들어가있어야했다. 크롤링한 데이터는 일반적인 블로그글이라 미리 특수문자, 개행문자를 모두 제거하고 csv형식으로 정리해두었다. 3) 사용하던 하둡 클러스터 서버는 50대 정도의 서버를 묶은 것으로 내게 sudo권한이 없었다. 따라서 관리자권한이 필요한 설정변경은 할 수 없는 상황이었다. 2. 오류메세지 이렇게 mapreduce를 실행하면 timed out after 600s.. 기록/그 외 프로젝트 기록 2022. 9. 28. [NLP] Docker로 Konlpy 사용하는 Flask 배포 konlpy는 자바 라이브러리를 내부적으로 실행시키기 때문에 파이썬 코드라도 자바환경이 갖춰져야한다. 하지만 플라스크 배포 시에는 어떻게 해야할 지 방법이 잘 나와있지 않아서 여기저기 자료를 찾아보고 해결한 결과를 정리해둔다. 이 글을 읽기 앞서서, 플라스크의 구조는 [이 방식]으로 구성했다. 1. requirements.txt pip로 이 두 가지를 설치해야한다. JPype1 == 1.4.0 konlpy == 0.6.0 2. main.py 내 플라스크 api일부이다. 이것처럼 konlpy의 라이브러리를 쓰기전에 jpype.attachThreadToJVM()를 호출해야한다. 3. Dockerfile 자바랑 파이썬 같이 있는 이미지를 불러와야한다. openjdk:slim을 사용하면 자바와 파이썬이 동시에 .. 기록/CI&CD 2022. 9. 23. [Hadoop] Python으로 wordcount하기(Hadoop Streaming) 코드는 딱히 특별하지 않아서 설명하지 않는다. (내가 이 글로 말하고 싶은 부분은 3,4번에 있다.) 1. mapper #!/usr/bin/env phthon3 # -*-coding:utf-8 -* import sys for line in sys.stdin: words = line.strip().split() for word in words: print('{}\t{}'.format(word, 1)) 2. reducer #!/usr/bin/env python3 # -*-coding:utf-8 -* import sys def print_output(word, count): print('{}\t{}'.format(word, count)) word, count = None, 0 for line in sys.st.. 기록/그 외 프로젝트 기록 2022. 9. 22. [AWS] 같은 브랜치에 있는 프론트엔드, 백엔드 자동배포하기 (6) Jenkinsfile, vue & springboot Dockerfile 작성 1. 프로젝트 구조 프로젝트 구조는 다음과 같다. Jenkinsfile, frontend폴더, bacnekd폴더가 가장 최상단에 있고 그 밑에 Dockerfile이 있다. 2. Jenkinsfile tools에서 이전에 설치한 메이븐 이름을 쓴다. M3로 설정했으므로 maven "M3"을 적는다. stages는 네 단계로 나눴는데, 다음과 같다. 1) Docker kill 이미 프론트엔드, 백엔드 돌아가고있는 도커가 있다면 멈추고 해당 컨테이너를 지웠다. 만약 그 컨테이너가 없다면 오류가 나면서 빌드가 멈추기 때문에 || 연산을 사용해서 있든 없든 빌드가 계속되도록 했다. 2) Prepare checkout scm 명령어로 깃 레파지토리를 가져온다. 성공한다면 prepare success, 실패한다면 p.. 기록/CI&CD 2022. 8. 18. [AWS] 같은 브랜치에 있는 프론트엔드, 백엔드 자동배포하기 (5) jenkins 컨테이너 내부에 docker 설치 및 Webhook 설정 1. jenkins 컨테이너 내부에 docker 설치 1) sudo, vi, wget 설치 # 컨테이너 접속 docker exec -it jenkins bash apt update apt install vim apt install sudo apt install wget 2) docker 설치 sudo apt update sudo apt install apt-transport-https ca-certificates curl software-properties-common sudo wget -qO- | sh sudo systemctl start docker sudo systemctl enable docker 3) docker.sock 권한변경 sudo chmod 666 /var/run/docker.sock .. 기록/CI&CD 2022. 8. 17. 이전 1 2 3 4 ··· 7 다음