http://lets.todaysworkout.ga/



무료 도메인 호스팅을 통해 DNS도 연결 하였다.


프로젝트를 진행하면서 가장 긴장된 하루였다.

리눅스를 따라하면서 똑같이 안될때, 나만 안될때, 이런식의 쫄깃함이 존재해서 그런듯 하다.


다행히 이것저것 섞어서라도 할 수 있었다...


오늘은 war 파일을 배포하기 위한 세팅? 과 과정이 주였다.

지난번 빌더스의 경우 내가 이 부분을 담당하지 않았기에 이번에 많이 좀 해맸다.

특히 지난번 aws로 배포할때는 aws가 윈도우를 지원하여서.. 정말 편하게 진행했는데

이걸 리눅스로 하려니 그저 걱정만...


어제 jdk, tomcat까지 설치하였기에 오늘은 업로드 폴더 생성, 권한 부여, 그리고 war 배포.. 이렇게가 주였다.


1. 파일 업로드를 위한 경로를 생성하자

/usr 아래에 upload를 따로 만들었다(프로젝트 상에서도 경로를 바꿔줘야한다)


mkdir /usr/upload


* 그런데 파일 업로드의 경우에 보안상에 문제가 있기에 이를 꼭 염두해야한다고 한다..

나에겐 아직 과분한 부분이긴 하나 꼭 신경써야한다고 하니.. 흠..


2. 위에서 경로를 생성했어도 권한이 없다. 읽고, 쓰고 해야하는 권한...

실제로 내 코드상에선 일별로 폴더가 생성이 되야하기에 권한을 다 풀어줘야 했다.


2.1) 이를 진행하기 위해서 유저를 따로 생성해준다. 나는 어제 생성한 tomcat8이 있으므로 이는 skip...

sudo useradd 유저명


2.2) 위에서 생성한 유저로 권한을 부여

sudo chown -R tomcat8: 별칭 /usr/upload


2.3) 그리고 이 폴더에 대한 권한을 다 풀어준다.

chmod -Rf 777 /usr/upload


3. 마지막으로 war파일을 추출하여 서버에 올린다. 그리고 tomcat 설치 폴더 아래에 webapps에 그대로 넣어주고

톰캣을 껏다가 다시 키면 알아서 배포가 된다.

- 구글 클라우드는 업로드 기능이 있어서 이 부분은 딱히 어렵지 않았다

- 다만 파일을 올린후 mv로 옮기는데, 이게 옮겨지다가 내 실수로 인해 파일명이 바뀌는 경우도 있어서..

파일이 없어진것 처럼 보이기도 하였다.

- 그리고 ip 뒤에 포트를 없애기 위해 프로젝트 상에서 80으로 포트를 변경하였고 이를 제대로? 적용하기 위해서

war 파일명을 ROOT.war로 바꿔서 webapps에 넣었다.

(이 부분에 대해선 더 확인해봐야겠다)



- 리눅스 명령어를 많이 쳐봤는데 손에 익으면 진짜 편하겠다는 생각이 많이 든다.


- 자주 업데이트를 할때마다 계속 이렇게 해야하나 싶기도 하고.. 방법을 찾아봐야한다

(tomcat manager가 왜 안되는지 모르겠다, 설정도 잡아줬는데)


- 이제 앞으로 해야할 일은 기능 추가하고, 성능 더 빠르게 하고... 키워나가야지..




제목은 클라우드 서버 설정이지만 실제론 그냥 서버에 이것저것 설치하는 것이다.

하지만 리눅스와 안친한 나에게.. 그리고 대부분의 초심자에게.. 리눅스는 너무나 먼 존재이다.


http://tastydarr.tistory.com/245?category=710993

http://gblee1987.tistory.com/25?category=549227

위 두개는 리눅스에 설치하는 것에 대한 설명


http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.31/bin/apache-tomcat-8.5.31.tar.gz

위는 아파치 주소이다.. 이것도 못찾았음 처음엔..


아래는 구글 클라우스 포트 설정에 대한 블로그

http://gusrb.tistory.com/50


나는 우분투 14.04로 설치를 진행했는데 이럴 경우 몇몇 안되는게 있다(지원이 안되는 버젼이라)

그렇기에 가능하면 상위 버젼으로 진행하길 바람.. 나는 왜 14로 했을까 ㅠㅠ


일단 14로 진행하면 pacakage로 jdk가 설치가 안되서

https://stackoverflow.com/questions/32942023/ubuntu-openjdk-8-unable-to-locate-package

위 링크 참조해서 진행하였다.



우분투에 설치해야하는 것은 이러하다.

1. JDK

2. tomcat

* 편집기(vim) 이정도... 매우 간단한데 되게 어려웠음.. ㅎㅎ;;


그리고 root 계정이 아닌 곳에서 진행해서 sudo로 항상 명령어를 줬어야했다.

이걸 거의 마지막에 깨닫음... 항상 root로 진행하자.


1. 우분투에선 apt가 설치 도우미이다(centos는 yum인가 그럼)

그러니 apt update부터 하자


sudo apt-get update


2. 편집기를 설치하자(vim) : 각종 환경설정 등의 문서 편집을 위한것. 별거 아님


sudo apt-get install vim


3. jdk을 설치하자 : 나는 jdk8로 플젝이 진행됬으므로 jdk8로 설치함


sudo apt-get install openjdk-8-jdk


근데 나는 이게 안되서 위에 스택오버플로우를 참고해서 진행하였다. unable package가 계속 떠서...

아마 우분투 버젼 문제인듯 하다.


그리고 3번 과정이 끝나면 버젼 확인

java -version



4. 톰캣을 다운 받자.


wget 톰캣 주소


위에 http 로 가서(http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.31/bin) 여기서 tar.gz로 끝나는 확장자를 다운받자

아, 나는 8버젼이라서 8버젼을 찾았다.

그리고 deployer로 되잇는건 다운받으면 안된다. 뭔지 모르겠는데 빈약하다.


5. 알집을 풀자


tar -zxf 다운받은파일명.확장자



6. 여기서는 블로그를 막 섞어가면서 했는데

나는 바로 bin으로 가서 ./startup.sh 로 톰캣을 실행 시켰다.


7. 이제 내 클라우드 외부 ip:8080으로 접속을 하면 되는데...

포트를 안 열어놓는다면 접속이 안되니 포트를 열도록 하자(위에 블로그에 방법이 잘 설명되어있다.)


ip주소는 항구 주소, 포트는 선착장 번호... 




이제 남은건 업로드 폴더 만들고, 경로 만들고, war 파일 올려서 서비스 되는지 확인 후에 도메인 연결 하는 것이다.


와 말로 쓰니까 엄청 쉬워보인다.


피보나치 수열은 재귀식으로 너무 유명하다


f(0) = 0

f(1) = 1

f(n) = f(n-1) + f(n-2)


인데, 이걸 재귀식으로 하여 돌리면 실제론 무진장 오래 걸린다.


기본적으로 함수가 실행되면 stack으로 쭉쭉 위에 쌓이기 때문에 좀만 큰 숫자를 넣으면 동작이 안될것이다.


이럴땐 간단히 동적프로그래밍을 통해서 구현할 수 있다.

동적프로그래밍의 핵심은 기억해놓는것, 저 멀리 있는거를 나중에 가져오는게 아니니까 미리미리..


파이썬 코드로 하면 이러하다


a = 0;

b = 1;

for i in range num:

a, b = b, a+b;

return b


우리가 필요로 한건 앞에 두개의 숫자만 필요로 하니까 주구장창 두개만...사용.


동적프로그래밍 개념을 알아도 실제로 적용하는 것은 매우 힘들다. 후

'1일 1문제, 프로그래머스' 카테고리의 다른 글

레벨2) 최고의 집합  (0) 2018.06.23
최고의 집합  (0) 2018.06.23
끝말잇기, 18년 섬머 문제?  (0) 2018.06.15
땅따먹기, 프로그래머스  (0) 2018.06.13
문자열 내림차순 배열..  (0) 2018.06.12

비밀번호 복호화도 해결 하였고

자동 로그인 체크도 일단은 가능하게 둠.

실제 되는지는 더 두고봐야할듯.


지난번에 이상하게 에러가 나는 부분은 다른 객체를 가져와서 그렇게 됬는데..

어쨋든 1차적으로 뿌릴 준비는 끝남.


문제는 서버 설정...


이번에는 구글 클라우드로 도전!! 하는데


우분투에 jdk가 설치가 안됨.

unable to install...


두번째 걱정 되는건 파일 업로드 패스를 어떻게 잡아줘야할지..


기존엔 그냥 C드라이브로 했는데 이걸 우분투에서 잡아준다면 흠..




지난번에도 고생했떤 에러인데 오늘 또 등장하였다.


이 에러가 발생하는 근본적 원인은 트랜잭션이 이뤄지지 않아서이다

(로직을 설명하면 부모에게 insert 한 후, 부모의 값을 가져와서 다시 insert 하는 순서이다)


왜 잘 되던게 안되는가 했떠니..

context에서 component-scan을 기존에 ....controller 에서 .....* 으로 바꿔서였다.


아직도 이게 왜 그런지는 모르겠다...



추가로 오늘 자동 로그인 처리를 함.

근데 인터셉터로 안돌아가고 있어서 정리가 좀 필요함...


오늘 자동 로그인 + 암호화 하고

내일 네이버 서버 세팅 하면 서비스 가능할듯 ㅅ ㅅ


제품명 :  LG HBS-S80



가격 : 7만원 후반

사용기간 : 약 한달

목적 : 운동용 블루투스

총평 : 위에 링크를 보고 사진을 보면 알겠지만 평소에 하고 다니기엔 살짝 신경쓰일 수 있다.

귀에 거는 식이라서 달리기 할때는 진짜 좋다. 다만 인이어이기 때문에 도로 등에서는 사용하지 않는게 좋다.


또한 얘는 내것만 그런지 몰라도 너무 심하게 배터리 효율이 안좋다. 기존에 쓰던 블루투스는 한번 충전하면 적어도 2일은 사용했다. 얘는 아니다.

운동할때만 사용하니까 하루에 90분 정도만 사용하는데 매번 운동가기전에 풀충을 해주고 가야 마음이 편하다.

하루에 한번은 무조건 충전해야한다.

'생활리뷰(아이패드 악세사리 등..)' 카테고리의 다른 글

아이패드 어플, Nebo  (1) 2018.07.28
분노의 리뷰 : 카미노  (0) 2018.06.09


메인 부분을 바꿧다.


1. 네브바를 기존의 것에서 다르게 바꿈.

기존 네브바의 경우 업로드 버튼이랑 자꾸 충돌 아닌 충돌이 나서 기본 틀로..


2. 사진 업로드시 사진 크기에 따라서 사이즈를 재 조절하게끔 바꿈.

이게 실제 되긴 되는데 다양한 경우에 맞춰봐야해서 좀더 지켜봐야할 듯



현재 중간 결과.. ㅋㅋ 

의도치 않은 호야 게시판이 되고 있다.


썸네일 올리는 방식을 오리지날 방식으로 바꾸었고

쟤네가 왜 눕는지좀 알아내야함..

일주일을 해맸다. 정확히 말하면 5일.

결론을 얻은것 같았는데 다시 원점으로 돌아오기를 반복... 그래도 결국 답을 찾아냈다.

(스프링 버젼은 4.3, jdk는 1.8, tomcat은 8.0 버젼을 사용중임)


방법은 크게 두가지 이다.

하나는 servelt-context에 resourec 경로를 지정 하는 것

다른 하나는 reponseEntity로 응답 하는 것.


두개의 방법도 백단에서는 사실 문제가 안됬다.

문제가 된 부분은 jsp에서 보여줄때...


특히 첫번째 방법은 불가능 한줄 알았는데 가능하게 나와서 좀 놀랐다.


위에 처럼 리소스 경로를 등록해준다. 이거는 몰랐던게 아닌데 location이 다르다. file을 명시하고 뒤에 들어간다. 백슬래쉬가 3개라는 것도 포인트


그리고 다음은 위에 처럼 <spring:url value = '/image/파일명'/> 으로 불러온다. 이게 진짜 핵심..

이거를 이번에 구글링 하면서 처음 봤다. 위에서 /image는 결국 C:/test를 뜻한다. (실제로 경로와 파일이 있따)

** 그리고 spring을 사용 하려면 제일 위에 taglib을 설정해줘야한다.

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> 


두번째 방법은 ResponseEntity이다.

실제로 카페에서 방법을 물어봤을때 두번째 방법을 사용하라고 하였다. 

크롬? 에서도 로컬 폴더에 접속하는 것을 원천적으로 막기 때문에 위에처럼 등록하고 사용해야 하는데, 아무래도 보안상의 이유때문에

두번째 방법을 선호하는 것 같다.


위 코드는 단순히 파일을 불러온다. 미리 등록해놓은 uploadpath를 통해서 경로를 확인 한 후에 있으면 맵으로 넣는다.


이 친구는 기존의 책에 있는 코드와 동일하다. 다만 requestParam으로 name을 받아와야 한다. 

<img src = "/display?name=${data.value.f_path}"/>

이렇게 사용해야 하기 때문

이러면 끝이다.


위 두방법으로 하면 아래처럼 사진이 나온다!!




자세한 코드는 깃헙에 올려두었다.


https://github.com/homekeeper89/friend_workout





문제가 상당히 길다.


문제 설명

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.


1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.

마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.

앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.

이전에 등장했던 단어는 사용할 수 없습니다.

한 글자인 단어는 인정되지 않습니다.

다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.


tank → kick → know → wheel → land → dream → mother → robot → tank


위 끝말잇기는 다음과 같이 진행됩니다.


1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.

2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.

3번 사람이 자신의 첫 번째 차례에 know를 말합니다.

1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.

(계속 진행)

끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.


사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.


제한 사항

끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.

words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.

단어의 길이는 2 이상 50 이하입니다.

모든 단어는 알파벳 소문자로만 이루어져 있습니다.

끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.

정답은 [ 번호, 차례 ] 형태로 return 해주세요.

만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.

입출력 예

n  words  result

3  [tank, kick, know, wheel, land, dream, mother, robot, tank]  [3,3]

5  [hello, observe, effect, take, either, recognize, encourage, ensure, establish, hang, gather, refer, reference, estimate, executive]  [0,0]

2  [hello, one, even, never, now, world, draw]  [1,3]

입출력 예 설명

입출력 예 #1

3명의 사람이 끝말잇기에 참여하고 있습니다.


1번 사람 : tank, wheel, mother

2번 사람 : kick, land, robot

3번 사람 : know, dream, tank

와 같은 순서로 말을 하게 되며, 3번 사람이 자신의 세 번째 차례에 말한 tank라는 단어가 1번 사람이 자신의 첫 번째 차례에 말한 tank와 같으므로 3번 사람이 자신의 세 번째 차례로 말을 할 때 처음 탈락자가 나오게 됩니다.


입출력 예 #2

5명의 사람이 끝말잇기에 참여하고 있습니다.


1번 사람 : hello, recognize, gather

2번 사람 : observe, encourage, refer

3번 사람 : effect, ensure, reference

4번 사람 : take, establish, estimate

5번 사람 : either, hang, executive

와 같은 순서로 말을 하게 되며, 이 경우는 주어진 단어로만으로는 탈락자가 발생하지 않습니다. 따라서 [0, 0]을 return하면 됩니다.


입출력 예 #3

2명의 사람이 끝말잇기에 참여하고 있습니다.


1번 사람 : hello, even, now, draw

2번 사람 : one, never, world

와 같은 순서로 말을 하게 되며, 1번 사람이 자신의 세 번째 차례에 'r'로 시작하는 단어 대신, n으로 시작하는 now를 말했기 때문에 이때 처음 탈락자가 나오게 됩니다.



문제가 이정도 이다.

근데 막상 읽어보면 엄청 복잡한 문제는 아니다.


기초 로직을 생각하자면

첫 단어가 나오고 그 단어의 끝 글자와 다음 단어의 첫글자를 비교,

다를 경우 return하고

같을 경우 나온 단어(첫단어)를 빈 리스트에서 더한다.

그리고 다음 단어는 방금 더해진 리스트 내에서 유무를 확인하고 있으면 return, 없으면 위로 다시 진행.


만약 return이 안되고 다 돈다면 다 맞는 경우이니 return 0,0

 

알고리즘 자체는 어렵지 않다. 다만 결과값을 내는 방법에 대해 좀더 고민 중이다.



# 6월 18일 수정

결과값을 내는 방법 자체는 매우 쉽다.

몇번의 예시를 돌려보면 된다.


중요한 것은 결과값을 내기 위한 인덱스를 어떻게 지정하는가 이다.


처음에 내가 문제를 풀때는 인덱스를 0부터 시작하게 했다.

이렇게 할 경우 문제가 i번째에 걸리 수도 있고 또는 i+1번째에 걸릴 수도 있고, 이렇게 서로 다른 경우가 발생하다 보니

이 다른 경우를 해결 하기 위해 코드가 길어지고, 또 다른 경우가 발생하기도 했따.


(4번의 경우가 실패했따.. 아직도 이유는 모르겠지만 뭔가 틀렸겠찌)


그렇기에 코드를 간략히 하고 정확성을 높이기 위해 1부터 시작하고, 대신에 비교를 i-1로 하였다.







코드가 훨씬 간략해졌다. 기존에 서로 다른 경우에 따라서 나누기를 다르게 할 필요도 없고..

무엇보다 안되는 경우가 없다. ㅎㅎㅎㅎ

+ Recent posts