우분투 서버 개발환경 설정 정리 코-오드

회사에서 이전하는 서버를 세팅하는데 나중에 필요할 것 같아 정리해둔다.


리눅스에서 파일 검색 코-오드

find . -name testfile.txt 현재 디렉토리에서 testfile.txt 이름의 파일 검색
find /home -name *.jpg home과 하위 디렉토리에서 jpg 확장자 파일 검색
find /home -user exampleuser -mtime 7 -iname ".db" exampleuser가 지난 7일동안 변경 이력이 있고 .db를 확장자로 가지는 파일 검색


시작이 반 쇼핑이 반. 수퍼마켙

자격증 공부를 하고 있다.
마음을 다 잡기 위해 쇼핑을 한다(?).
졸업 이후에 공책을 사본적이 별로 없어서
무조건 두꺼운운 공책

톡톡팬시 포 인덱스...을 샀는데 출퇴근 시간에 짬내서 보기에는 너무 컸다. 
다시 얇은 공책 여러 권포포팬시 캠퍼스노트...을 사고
큰 노트는 인강들으면서 잡다한 필기용으로 얅은 것은 강의 끝나고 깔끔하게 정리해서
출퇴근에 보는 용도로 사용하고 있다.
펜은 집에 돌아다닌거 아무거나 사용하다가 논술식 시험에 많이 추천되는 제트 스트림제트스트림 유성볼펜...으로 일단
답안 작성용 글씨체 연습중이다.
시작이 반이고 쇼핑이 반이니 이제 붙는 일만 남았다.ㅎㅎ

용어 코-오드

온톨로지 용어사전 개념이라고 생각하는데 실체가 뭔지는 잘 모르겠다.
개발일을 하면 이런일이 종종 아니 자주 있다. 어떤 것들은 막상 구현해보면
단순한 것이고 어떤 것은 어감에 비해 훨씬더 깊이 있고 복잡한 것도 있고.
하면 할 수록 어렵다.

몇 일전에는 드디어 자바 리플렉션의 실체를 알고 조금은 허무했었다.
말그래도 거울을 보고 있었는데도 그게 나인지 몰랐던 것 같은 느낌.

기분도 어떤 때는 실력이 느는 것 같기도 어떤 때는 이런 것도 몰랐었나 하는 자괴감.


어쨌거나 온톨로지 도움이 되는 링크: http://home.skku.edu/~ymko/proceedings/metadataandontology.pdf

사주에 금이 있다던데. 수퍼마켙

이케아에서 1000원 주고 산 뱀모양 구두주걱을 사용했었는데
어느날 출근하려 구두를 신는데 툭하고 부러졌다.
귀엽게 툭이 아니라 '빠직'하고. 귀엽게 생긴 모양과 달리 부러지니 날카롭다.
뱀이빨 같이 갈라진 끝에 손도 베였다. 아침부터 짜증이 확!
구두주걱이 별거 아닌것 같아도 몇일 없으니 신을 신을 때마다 고역이다.
남자는 금속!이란 마음으로 메탈 구두주걱을 하나 샀다.
생각보다는 짧은데 조금 더 긴것이랑 가격차이가 확나서 그냥 불편함을 감수하기로 했다.
이제 야무지게 신고 돈 벌러 가야지.


삼우상사 도금 장헤...

컵밍아웃 수퍼마켙

우주덕후지만 회사생활하면서 개인적인 취향이나 취미는 드러내지 않는 편이다.
회사는 돈벌어오는 곳이라고 생각하는 것도 있고 입에 오르내리는것도 싫어서 자중하고 있는데
이직 후에 들뜬 마음에 사재꼈다.


릴팡 스타워즈 머그...더파슬리 그래픽 와...별모양 우주 키캡 ...

개발팀 영업부 사업팀 핫한 삼거리에 위치한 내 자리를 지나다니며

흠칫하긴 하지만 물어보는 이는 별로 없다. 좋아 계획대로 되고 있어.

간혹 사진을 좋아하는 김차장님이 넌지시 취향을 물어봤지만 차갑고 냉정하게 잘 응대했다.

난 프로니까.





월간 자기만의 서비스 코-오드

간단한거라도 매월 하나씩 서비스를 만들어 보기로 했다.
기획, 디자인, 코딩, 배포 모두 스스로 하는 걸로.
그리고 오늘 12월달의 서비스를 배포했다.
몇달 전 부터 한자에 꽃혀 있었는데 책상에서 한글자 한글자 음미하며 강독하는것을
컨셉으로 만든 사소한 서비스 이다.

처음 부터 어떤 형태여야 하는지 머릿속에 있던 것은 아니고 일단 디비 부터 구성했다. 초반2주 정도 소요된것 같다. 
그리고 어떤 식으로 활용할지, 어떤 형태의 화면일지 고민을 또 1주. 본격적인 구현도 약 1주.
딱 한달이 걸렸다. 주구장창 질문만 해대는 커뮤니티에 올리니 몇몇 고수 분들이 고마운 조언을 주셔서...그렇게 올리자 마자
고도화가 시작되었다.

이번에 만들면서 들었던 생각은 개발자의 개성과 보편성간의 균형인것 같다. 평소 성향이 결과물에 무의식적으로 반영되어 있었고
바로 수정하면 좋겠다는 조언을 받았다. 

앞으로 또다른 서비스 개발과 기존 서비스 개선을 병행할 예정이다. 바쁘지만 포켓몬 스티커 모을때의 재미가 있다.
확율을 적지만 에드센스 심의도 걸어 두었다.
잘되었으면 좋겠다. 

주소는 http://chojohanja.ga



git에서 collaborator등록 코-오드

회사와 집에서 다른 git 계정을 사용하고 있다. 회사계정으로 리파지토리 생성 후 집에서 변경한 소스를 push 하려고 하니
access할 수 없다는 메세지가 나온다. 
바로 공동제작자(collaborator)로 등록이 되어 있어야 push가 가능하다. 나의 경우에는 회사계정으로 리파지토리를 생성하였으므로
회사계정에서 집에서 사용하는 계정을 collaborator로 등록해주어야 한다.
하는 방법은 리파지토리 선택 -> Settings -> 왼쪽 메뉴에서 Collaborators 선택 -> 사용자 검색 후 추가
이후에 push해보니 문제 없이 잘된다.
clone/pull collaborator등록 없이도 작동한다. 원본 소스 보호를 위해서는 당연한 것인데 회사에서 설정되어 있는 상태로만 사용하다가 오늘 처음 알았다. 


운영시 서버 에러 (NullPointerException at org.apache.tomcat.util.buf.CharChunk.append) 코-오드

서버를 설치하고 톰캣을 설치하고 프로젝트를 구동하니 작동이 잘된다.
아무 이상 없는 줄 알고 지나갔다가 몇 일뒤에 로그를 확인 하니 온통 에러로그다. 
유형을 보니 2가지 이다. 서비스 운영은 정상적으로 되고 있지만 찜찜한 마음에 수정법을 찾아 보았다.

1. defaultHost 변경에 따른 로그.

DD-Dec-YYYY hh:mm:ss.sss SEVERE [http-nio-80-exec-8] org.apache.coyote.http11.Http11Processor.service Error processing request
 java.lang.NullPointerException
at org.apache.tomcat.util.buf.CharChunk.append(CharChunk.java:331)
at org.apache.catalina.mapper.Mapper.map(Mapper.java:694)
at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:679)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

찾아보니 기능상의 에러는 아니고 톰캣 기본 설정을 변경해서 사용한 것이 원인이었다.

톰캣 소스 중 org.apache.catalina.mapper.Mapper.map에서 아래와 같이 디폴트 호스트 네임을 호출하는 부분이 있다.

if (host.isNull()) {
      host.getCharChunk().append(this.defaultHostName);
    }
defaultHostName은 아래의 부분에서 설정되는데
<Engine name="Catalina" defaultHost="localhost">

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host>이 부분을 수정하면서 
Host name을 변경한것이 원인으로 파악된다.

에러로그가 뜨지 않게 하기 위해서
- <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host>을 추가해주거나
- <Engine name="Catalina" defaultHost="localhost">의 defaultHost를 사용하고 있는 Host name 중 하나로 변경해 주었다.



CSS, 스크립트 최적화 코-오드

개발중에 참 많은 변화가 있다. 기능도 로직도. 하다보면 이것이 동작하는 코드인지 아닌지 몰라 그냥 남겨두는 경우가 많다.
Java 소스 쪽은 IDE가 한번도 사용하지 않은 변수, 호출되지 않은 메소드 등 그럭저럭 잘 찾아 줘서 개발 후 한 번 쓱 정리하면 그래도 봐줄만 하다. 

문제는 CSS, 스크립트. 웹에서는 페이지 로딩 속도가 중요한 이슈인데 쓸데 없이 용량만 큰 소스들만 정리해줘도 꽤나 향상 시킬 수 있다. 사실은 나도 이번에 사이트 속도 측정을 해보면 많이 배웠다. 그 중 실제로 작동하는(유효한) CSS, 스크립트만 추려 낼수 있는 방법이 효율도 좋고 흥미로워 정리하고자 한다.

크롬개발자도구 -> More tools -> Coverage를 실행

리코드버튼 또는 리로드 버튼을 대상 페이지에서 실행시키면 아래와 같이

소스별로 유효률을 볼 수 있다. 컬럼은 리소스명, 리소스 타입, 파일 사이즈, 유요하지않은(소스는 있지만 실제로 한 번도 동작하지 않는) 파일의 사이즈 그리고 퍼센테이지 이다.

리스트 중 자세히 보고 싶은 것을 클릭하면
이렇게 상세히 볼수 있다. 

나는 이것을 기준 삼아 카피본을 만든 후 사용되지 않은 소스는 지워버리고 슬림 버전을 만든 다음 css, js 압축기를 이용해서 미니마이즈 버전을 만든다. 이렇게 하면 평균 50% 정도의 소스를 덜어 낼 수 있는 것 같다. 물론 로딩 속도도 빨라지고.






에드센스 해지 코-오드

애드센스 심사를 신청했는데 이용하고 있는 다른 계정이 있다고 나왔다. 
기억으로는 예전에는 메일 계정 1개당 에드센스 계정이 하나 씩 발급했던적이 있었는데 
이제는 인증된 계정당 1개씩으로 바뀌었지 않나 추측해 본다. 
어찌되었건 에드센스 계정내에서는 아무리 찾아봐도 계정을 삭제, 해지 할 방법이 없다. 
구글링 해보니 에드센스가 아니라 에드몹이라는 서비스의 계정을 해지해야 한다. 
에드몹 계정은 아래 링크를 타고 가면 확인 가능하고. 

support.google.com/admob/answer/6273540?hl=ko&CTCctx=ui 

support.google.com/admob/contact/account_cancel 에서 아래 서식폼 입력하면 해지 가능하다.























































신청 후 얼마되지 않아서 해지 안내 메일이 왔고 에드센스 계정 접속해보니





















해지 완료!
해지도 어렵고 심사도 어려운 에드센스 만세!






css,js 압축기 코-오드

사이트 속도 측청
developers.google.com/speed/pagespeed/insights/?hl=ko

리소스 압축
css: cssminifier.com/
https: javascript-minifier.com/

UI 레이아웃 설정 코-오드


화면 레이아웃 잡기는 매번 div 정렬주고 매치시키고 귀찮은 작업이다. 찾아보니 부트스트랩 기반 그리드 css를 작성해주는 서비스가 있다. 사용법은 매우 직관적이다. 다만 저기서 생성된 코드만 사용하면 전체적인 사이즈가 작게 나와 body에 width,height 100% 설정해서 사용했다.

www.layoutit.com -> css grid generator 선택

잘못내린 밤 어쨌든 글쓰기

전 직장동료들과 술자리 후 막차를 타고 한 정거장을 지나 내렸다. 대충 방향으로 감을 잡은 출구로 나온다. 새벽으로 넘어가는 거리에는 사람이 없다. 묘한 호기심으로 둘러쌓인 거리에서 또 대충 방향을 잡아 걷는다. 알고 있지만 모르는 거리에서 인도와 긴장감이 섞인 걸음을 내딛는다. 낯의 유령이 남긴 자취에 홀린듯 터벅터벅. 오래만에 느끼는 새벽 분위기에 들뜬다.

날벼락 같이 좋은 사람이었다는 고백을 들었다. 무엇 때문에 기분이 들었는지 모르겠다. 버스를 타고 한 정거장을 더 지나 내려 걸었다. 한참을 더 걸어야 하지. 기분은 좋지.

자기만의 서비스 코-오드

그동안 틈틈이 만든 서비스들, 서버 연장하지 않았던 것, 도메인 변경한 거, 소스 버전 달랐던 것들 모두 정리해서 다시 올렸다. 아직도 배워야 할게 많다. 야아 신난다. 이제부터 주기적으로 살피고 개선해야지. 흥했으면 좋겠다.

소셜네트워크서비스: 마이셸프 myshelf.ga
로또번호육성프로젝트: 프로또서645 app.plottoser.ga
단어조합수업:워드슬롯머신 wordslotmachine.ga



구인공고 어쨌든 글쓰기

모집분야: 마술 보조
우대사항:
- 칼을 무서워 하지 않으시는 분
- 혈액량이 많으신 분
- 아파도 웃는 긍정적인 마인드 갖추신 분

인텔리제이 IDEA에서 외부 라이브러리 추가하기 코-오드

File -> Project Structure -> Modules -> Dependencies(tab) -> Click [+] button -> Library ... -> Select Library Type
-> (from Maven) Search Library ->Choose 'Download to: ' or not -> OK

* Download to 클릭 후 경로 프로젝트 내 lib로 하는 경우 라이브러리가 소스에 포함 그렇지 않을 경우 External Libraries로 위치.

千字文 閑良

出處:付南美術館
何書體也

마이바티스에서 일대다(본문+파일/본문+댓글) 관계 데이터 추출 코-오드

본문에 첨부된 이미지 또는 본문에 달린 답글과 같은 관계를 1:다(1:N) 관계라고 한다.
설계시에 자주 이용되는 패턴인데 구현 방법을 정리해본다.
처음에는 무식하게(?) 본문 리스트를 뽑은 후 for loop를 사용하여 
딸린 댓글/이미지이 있는지 재조회 후에 있을 경우 별도의 모델을 생성하여 추가하는 식으로 작업하고 했다.

낑낑대고 있자 선임분이 mybatis collection 키워드를 알려주셔서 검색해 보았다.
처음에는 가장 기본적인 형태로 시도해 보았다.
아래와 같이 2개의 resultMap을 선언한 후 부모자식관계 형태로 정의한다.

<resultMap id="post" type="map">
<result property="title" column="title">
<result property="content" column="content">
...
<collection property="attachfiles" javaType="java.util.ArrayList" resultMap="attachList"/>
</resultMap>
<resultMap id="attachList" type="map">
<result property="attachfile" column="attachfile">
</resultMap>

정의 후 조인 쿼리를 수행하면 결과내에서 그룹핑 하여 데이터 셋을 만들어 준다.
주의할 점은 데이터 셋의 사이즈가 유동적이다.
일반적인 경우 위와 같은 형태 사용해도 좋으나 스크롤등과 연동하여 사용하는 경우 데이터 셋의 고정적인 사이즈를 확보하여야 한다.
그럴 때에는 Collection 을 위한 내포된(Nested) Select의 경우로 사용하면 된다.
작동원리 1차 리스트(예제에서는 포스팅 리스트를 )를 조회 후에 자바로직에서 for loop와 같이 1차 리스트이 특정 키값을 이용하여 2차 리스트(포스팅에 첨부된 파일)를 조회, 데이터셋에 넣어주는 식이다. 
형태는 아래와 같다.

데이터 세팅을 위한 리저트맵 선언
<resultMap id="post" type="map">
<result property="title" column="title">
<result property="content" column="content">
...
<collection property="attachfiles" javaType="java.util.ArrayList" column="idx" select="selectAttachedImgForList"/>
</resultMap>

...
2차 리스트 조회를 위한 셀렉트 쿼리
 <select id="selectAttachedImgForList" resultType="map">
select a,b,c from tb_attached_file
</select>



인텔리제이: 서버 재시작없이 수정사항 반영 코-오드

스프링부트+타임리프로 개발하면 소스 수정시 서버 재시작해야 반영되는 것으로 알고 있었는데
수정 파일별로 컴파일 해주는 기능이 있다. 화면 개발시에 귀찮았는데 유용하게 사용중
단축키는 콘트롤+쉬프트+에푸9

1 2 3 4


adsense