자료구조

알고리즘 복잡도

속도 –  시간 복잡도Time Complexity
메모리 – 공간 복잡도Space Complexity

복잡도의 기준은 비교연산의 횟수 or 반복문 횟수

worst case 기준으로 복잡도 측정

빅-오 표기법( Big-Oh notation)

좋은 알고리즘

O(1) 상수형 빅-오

y=1

O(log n) 로그형 빅-오

O(n) 선형 빅-오

O(nlong n)

보통

O(n^2)

거의사용불가

O(n^3)

O(2^n)

 

재귀 알고리즘 예제

  1. 입력값 n을 넣으면 n~0까지 출력
  2. Fibonacci – 입력값 n을 넣으면 n번째 값 출력 0 1 1 2 3 5 8 …
  3. Factorial – 입력값 n을 넣으면 n! 값 출력 5! = 5*4*3*2*1
  4. BinarySearch
  5. 하노이 타워

 

종류

선형구조Linear

List
Stack
Queue

비선형구조

Tree
Graph

파일구조

순차파일
색인파일
직접파일

단순구조

정수
실수
문자
문자열

 

Stack – LIFO(Last In, First Out)

 

Queue – FIFO(First In, First Out)

뱀그림 대가리 입력 꼬리 출력

Deque

아무리봐도 디큔데 덱이라고 읽음
양방향 입출력 큐

Tree

계층적 관계, Hierarchical Relationship을 표현하는 자료구조

Decision Tree, 조직도

 

Full Binary Tree 왕세모
Complete Binary Tree 작은세모집합

Traversal

1

2       3

전위 순회Preorder Traversal (2 1 3)
중위 순회Inorder Traversal (2 3 1)
후위 순회Postorder traversal (1 2 3)

 

예제) 계산기

전위 표기법prefix notation
중위 표기법infix notation
후위 표기법postfix notation

 

BubbleSort

Selection Sort

Insertion Sort

Heap Sort

Merge Sort

Quick Sort

 

Posted in NOTE | Tagged , | Leave a comment

Tomcat 사용시 주의점 – Java 웹개발시 초기설정

Tomcat 압축을 풀어보면

webapps 디렉토리에 기본 디렉토리가 존재한다.

이 상태로 톰색을 실행시키면 이 디렉토리 경로로 접속이 되는데….

이것때문에 충돌이 발생하는 상황이 있다.

딱 봐도 개발하다보면 종종 사용될만한 주소 패턴이다.

문제는, ide에서 / 경로에 웹을 띄웠을 때

/docs
/manager
/examples

로 접속하면 톰캣 기본디렉토리가 우선 접속된다.

 

webapps 디렉토리는 꼭 비워주고 쓰자.

저번에 당했었는데.. 오랜만에 또 당해서..

 

 

Posted in 노하우 | Tagged , , | Leave a comment

MongoDB 특성 분석 01, 사용전 기능조사~ 에서 ~ 적용사례까지

개요

몽고디비는 처음 알게됐을 때 부터 써보고싶기는 했는데.. SI만 하다보니 쓸 기회가 없었다.
개인적으로 테스트용이나 회사에서 간단한 모듈을 만들 때 사용하긴 했지만, 제대로 분석을 해 보고 적용해본게 아니라서 깊이있는 지식은 없는 상태

사용목적

기술적으로 몽고디비가 꼭 필요한 상황은 아니라고 판단되지만… 나쁜 선택은 아닐 것 같아서 일단 적용 해 볼 생각이다.
저장할 데이터 : Crawling, Scrapping 데이터, 게시판 글, 댓글, GIS정보, GridFS를 이용한 이미지 저장

 

GIS 정보 관리
PostgreSQL의 PostGIS를 써도 되지만…. 내부정보가 아닌 사용자 데이터를 저장해야 한다. 서비스가 급성장하면서 데이터가 엄청나게 쌓일거라서 MongoDB를 쓸 수 밖에 없잖아

Crawling, Scrapping 데이터
텍스트 파일 저장

GridFS를 이용한 이미지 저장
이 부분은 써야할까? 모르겠다. 성능문제도… 별 생각없이봐도 문제가 잇겠지?
http://symplog.tistory.com/entry/MongoDB-MongoDB-GridFS-%EB%B6%80%ED%95%98%ED%85%8C%EC%8A%A4%ED%8A%B8
있다고하네…
그리고 cdn에 올리면 필요없는 부분 아닌가

몽고디비에 대해 잘 정리된 페이지
http://kkyunstory.tistory.com/65
이런 평가를 많이 보긴 했는데…

아몰랑 그냥 쓰다가 안되는거 한개씩 옮겨야겠다.

특성 ~~ 확인중

문서형 데이터베이스

데이터를 문서형태로 저장 – BSON을 이용하여 저장
BSON : JSON을 Binary 형태로 저장

장점

다양한 인덱스 제공
Sharding

 

인덱싱 방법

종류

Unique고유 인덱스
Sparse희소 인덱스 : Null인 경우 인덱스 생성하지 않음
다중 키 인덱스, 복합인덱스

주의점

롤백은 불가능
트랜잭션 안된다고 치고
인덱싱 걸면 디비 먹통

Posted in Database | Tagged , | Leave a comment

Crawling, Scrapping… 갑자기 뭔 신기술처럼 대접받는

요즘 갑자기 신기술처럼 포장되는 것 중 하나
그냥 Html파싱, 퍼오기라고 생각해서 이력서에도 굳이 안 쓰는데
시시콜콜하게 다 써놔야하나 하는 생각이 든다.
별것 아니고 계속 사용되어 왔지만 갑자기 주목받는 기술 중 하나

Crawling, Scrapping을 구분해보면

구분 할 필요가 있긴한지 잘 모르겠지만… 굳이 구분해서 쓰는 사람이 있을지 모르니 알아두자
혼용되서 사용되기도 하고.. 굳이 구분하기도 하는데 이게 맞는지 정확하지는 않다.

Crawling

웹사이트를 걍 다 퍼오는 개념으로
링크를 타고 다음링크를 다시 타고들어가는 기능(Spider)이 중요하다.
한 주소를 가지고 거기있는 링크를 타고타고 또 들어가야 하는데 이것을 꼼꼼히 구현하는게 생각보다 힘들다. depth가 많아질수록…  이 부분은 Nutch, Scrapy 같은 라이브러리에서 지원을 해 주니 굳이 따로 구현을 할 필요는 없다.

Scrapping

스크래핑은 .. 사실 그냥 파싱 아닌가
특정 웹페이지에서 원하는 데이터를 뽑아내는 기술이다.

웹페이지를 만들 때 구조적으로 만드는게 구현도 더 쉽기 때문에 html의 id, class에는 보통 패턴이 숨어있다. 이걸 찾아서 데이터를 찾아오게 코딩을 해 주면 된다.
가끔 막코딩된 페이지는 별 수 없다. 막파싱 해야한다 .dom 계층을 무식하게 따라가면
노가다는 승리한다.

이런식으로 특정 사이트를 정해놓고 원하는 데이터를 뽑아내는 것은 쉽다.

카톡, 블로그, 페북도 요즘 이런걸 지원한다. 글쓰기 창에 링크를 박으면 해당 주소의 대표이미지와 요약정보를 보여주는데 보통 Meta데이터에 포함된 정보를 보여준다.
여기서, Meta데이터가 없을 경우에 알아서 정보를 표현 해 주는 기능을 만들려면 머리가 좀 아플거다.
(아직까지 알아서 잘 되는건 못 봤다)

여기서도 BeautifulSoup, Jsoup, Gson 등 각 언어별로 Html, Xml 라이브러리가 있으니 갖다 쓰자.

JS를 이용해 데이터가 다이내믹하게 변하는 웹사이트는 좀 다른 노력이 필요하다.
Ajax,Websocket, AngularJS등을 이용하는 페이지는 그냥 HTML을 다운받아 파싱하면 뻘 데이터가 나온다. 이럴 때는 WebDriver를 써야한다.
파싱은 python의 Selenium라이브러리를 이용해서 phantomJS 드라이버를 사용하면 편하다. 이렇게 하면 브라우저로 보는것과 HTML을 얻을 수 있다.
참고로.. 암표 봇이나 수강신청 봇도 이런기술을 이용해서 만들면 된다.(IP차단당할수도있다)

사용법은 공식사이트에서

http://phantomjs.org/
http://www.seleniumhq.org/
https://www.crummy.com/software/BeautifulSoup/
https://scrapy.org/
http://nutch.apache.org/

구석구석 잘 알고 쓰면 좋지만… 간단한 기능을 만드는데 모든 기능을 이해할 필요는 없다.
그래도 기술의 구조와 개념정도는 이해하고 쓰는게 좋은 것 같다.

Posted in 개발코딩 | Tagged , , , , , | Leave a comment

Classic ASP with Oracle Database

Classic ASP는 아직도 많이 사용된다. (cba)
일반 웹사이트에서는 많이 없어졌지만 Legacy System.에는 아직도…
새로 만드는 곳도 간혹 그냥 ASP로 하기도 한다.

용도는 주로 관리자 사이트, 소규모 쇼핑몰.

 

소규모 SI업체에서 일을 하다보면 이 꼴도보기 싫은 Legacy System을 설치/수정해야 할 일이 생긴다.
(새로 만들고 – 메뉴얼 문서작성한 다음에 유지보수팀에 인수인계 하기 싫으면 그냥 해야지)

시스템 엔지니어도 Windows서버 잘 하는 사람도 잘 없고.. ClassicASP와 얽혀있는 문제는 잘 해결이 되지 않는다. IIS설정과 DB연결에서부터 심각한 문제가 발생한다.

잘 알지도 못하면서 보다보니 순수 투입시간만 10시간은 여기저기 찾아보고 삽질 반복한 것 같다.

 

WebServer(IIS)

IIS설정은 그래도 검색하면서 하면 금방 처리 된다.
http://tutorial.beansugar.org/w/WindowsServer:IIS

Database(ODBC)

보통 IIS설치하고 ASP첫화면 뜨는거 보고 끝난줄 알지만…
사실 여기서 고생 시작이다.

ConnectionString은 다음과 같다.

ASP는 윈도우 기반 언어답게 윈도우 커넥션을 사용하는데… ODBC, OleDB, ADODB, ADONET.. .뭐 등등 있는 것 같은데… 사실 뭐가뭔지 잘 모르겠다.

ADO.NET 닷넷용이고 ODBC는 JDBC처럼 윈도우 구형 커넥션 프로토콜… ADODB는 ODBC Wrapper정도 아닐까? 생각해본다. (따로 찾아봐야겠다)

Oracle Provider에는 두가지가 있다.
Provider=msdaora.1 (32bit)
Provider=OraOLEDB.ORacle.1.1 (32bit, 64bit)
이름에서 알 수 있듯이 MS에서 제공하는 것과 Oracle에서 제공하는 것.
내가 설치한 프로젝트에서는 이 두가지를 함께 쓰고 있었다.

왜 두가지를 함께 쓰는지 이해할 수가 없었는데…
같은 프로시저를 실행시켜도 커넥션 스트링에 따라 돌아가기도 안돌아가기도 하더라..
OraOLEDB.Oracle.1.1을 이용해서 접속한경우에 아래의 쿼리를 돌리면 파라미터 개수가 안 맞는다고 오류가 난다.

out OUT_RESULT 이외에 out SYSREFCURSOR이 있는데 이것을 못 받아오고
이런 오류를 낸다.
PLS-00306: wrong number or types of arguments in call to ‘{procedure name}’

다른방법으로 호출을 해야되나보다.. LegacyCode를 그대로 쓰려면 커넥션 스트링을 두개 생성할 수 밖에… msdaora를 쓰려면 32bit Client를 써야한다.

Client 설치

Oracle.com에서 Server 버전에 맞는 클라이언트를 다운받는다. 내 경우에는 서버가 11gr2 11.2.0.4.0버전이었다.
(클라이언트 버전은 크게 상관없을지도 모르겠다. 어느정도 호환이 되니까)
32bit – win32_11gR2_client.zip – http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win32soft-098987.html
64bit – win64_11gR2_client.zip – http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-linx8664soft-100572.html

설치할 때 instantclient로 설치하면 개발에 필요한 요소가 다 설치되지 않는다.(network/admin)
관리자 또는 런타임으로 설치하자.
그런데 마지막으로 성공했을 때 관리자로 했기 때문에 런타임으로 해도 잘 될지 모르겠다.

대강 경로는 비슷하다
C:\app\useruser\product\11.2.0\client_1\network\admin\tnsnames.ora

여기서 설치 완료

32비트 클라이언트를 사용하려면 IIS(인터넷 정보 서비스) 관리자에서 – 응용 프로그램 풀고급설정32비트 응용 프로그램 사용 = True로 변경해줘야한다. 기본값이 False로 되어 있다.
변경 후 IIS를 재시작 해보고.. 안되면 재부팅 해야한다.

 

ODBC 데이터 원본(32비트,64비트)

윈도우에서 이걸 설정 해 줘야 하는 줄 알았는데.. 안해도 된다.

 

 

ERRORS

 

*** 실패하면 완전 삭제 후 위 삽질을 반복하도록 한다

삭제는 D:\app\useruser\product\11.2.0\client_1\deinstall\deinstall.bat를 실행

제대로 안될때도 있는데 그 때는

1 서비스 종료
Oracle 관련 서비스 다 종료

2 레지스트리 삭제
시작 – regedit – Oracle 찾아서 삭제
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Oracle in OraClient11g_home2
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Oracle11
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Oracle11

3 설치파일 삭제
C:\Program Files (x86)\Oracle
C:\Program Files\Oracle
C:\ProgramData\Oracle

4 D:\app\useruser\product\11.2.0\client_1\
이 경로 통째로 삭제

Posted in 개발코딩 | Tagged , , , , | Leave a comment

Jrebel, JAVA 웹개발자에게 정말 필수!!

Java 웹개발할 때 WAS를 재시작하지 않고도 코드가 적용된다니~
우와 굉장한 기술이다!!

근데…
이걸 왜 써야하나?

다른 주류 웹 언어들은 코드 변경하면 다 바로바로 적용된다.

많이 사용하는 다음의 언어들은 말할것도 없고
PHP, node-js, Ruby(on Rails), Python(on Django?)

JVM 계열인 Scala(SBT)도.. 소스변경 컴파일 하면 변경사항이 바로 적용된다고 하는데…

JAVA만… 300달러 정도 하다가 475달러로 가격을 인상한… JRebel같은 툴을 써야만 HotSwap이 가능하다.

그냥 웹개발을 자바로 안하면 될 것 아닌가?
그래서 안하려고 한다.
(SI업무라면은 할 수 없겠지만.. )
자바가 C,C++에 비해서는 생산성이 높은 언어였지만, Scala, Clojure, Python 등등에 비하면 아니기도 하니까

 

Posted in 개발툴 | Tagged , | Leave a comment

Log4j – WebAppRootKey 문제 발생시 처리

개발서버 설정하기 귀찮아서 Tomcat 하나에 VirtualHost설정 후 App을 때려넣다가 발생

 

한개의 컨테이너에 두개의 Webapp을 올릴 경우 나는 오류로

Log4j에서 라는 System.property("webapp.root")를 사용해서 발생하는 문제다.

하나의 인스턴스내에서 System.property는 공유되니까.. 한마디로 전역변수 문제라고 할 수 있다.

해결방법은

web.xml에서 앱마다 저 키값을 고유하게 지정 해 주는 것이다.

말 그대로 log4j에서 webapp의 root 디렉토리를 가져올 때 사용하는 값이다.

{tomcat_home}/webpaps/{app war파일명?}

 

 

 

Posted in 노하우 | Tagged , , | Leave a comment

Cafe24 사용후기 서비스의 문제점

트래픽이나 기타 비용적인 측면은 그냥 넘어가자
1위사업자인 만큼.. 서비스가 안정적으로 제공된다면 참고 넘어갈 수 있는 부분이다.|
과연 그런지는 써 봐야 알겠지만…

그런데
가상서버를 사용하는데
별도의 웹 터미널이 제공되지도 않고
서버의 개별적인 설정이 아닌 OS재설치에 비용이 부과된다
이 부분은 문제가 잇다.

가상서버라고 하면 기본적으로 기대하는게
스냅샷, 서비스 초기화, Scalable아닐까
1년계약하고 쓰는 가상서버에… 초기화 설치비용까지 따로 부과된다니
이래서는 서버호스팅과 다를게 없고 좋을게 하나도 없다. 값이 좀 싼가? 성능도 낮잖아

Posted in Uncategorized | Tagged , | Leave a comment

Http/2에서 변경되는 부분

Spec 문서 : https://tools.ietf.org/html/rfc7540

Github에 올라온 문서 : https://http2.github.io/faq/

 

Http/2정보 몇가지

구글 SPDY스피디에서 몇가지 스펙 덧붙여서 만든 프로토콜(인 것 같다)

Explorer 8(WinXP)에서 지원안함 볼 수 없음.. (현재 사용자의 6%가량)

Http 0.9 1.0 1.1처럼 .x가 안 붙고 Http/2라는것은 버전업을 할 예정이 없어서라고 자신있게 말 했다던데…

 

Http/2의 특징 대표적인 3가지는 아래~

참고정보 : https://b.luavis.kr/http2/http2-overall-operation

1.multiplex streams

http1은 무전기였다면 http2는 전화기. 양방향 데이터 흐름
http1은 request-response가 반복되느라 낭비가 있었는데
http2는 쭉 흘러온다고… stream. 그것도 양방향

http1에서 도메인당 request-response 채널이 보통 10개밑으로 열린다고 했다. 그래서 html, js, css, image. 등등을 다 다른도메인으로 설정하는 꼼수로 속도를 빠르게 할 수 있다고…

2. header compression

압축방식 : zlib(SPDY) -> HPACK(Http/2)
Http1.1까지는 text 통신이었는데 Http/2는 binary 통신이다. 압축해서 전달.

그로인한 변화는
text기반인 telnet은 이제 쓸 수 없다.
네트워크 용량이 절약된다.

3. server push

http1에서 html을 요청해서 받고나서 html을 파싱한다음에 리소스를 요청하는식으로 처리를 했다면… http2에서는 예상되는 파일들을 먼저 보내준다.
서버가 해킹당하면 이상한 파일을 먼저 보낼 수 있지 않을까? 라고 생각할 수 있지만.. 어련히 잘 해놨겠지? 나중에 찾아봐야겠다. (인증서라던가 신뢰할 수 있는 서비스에서만 사용할 수 있게 변경되는걸로 되지 않을까)

server push는 websocket과는 다른 기술이다.
관련 포스팅 : https://www.infoq.com/articles/websocket-and-http2-coexist
Well, the answer is clearly no, for a simple reason: As we have seen above, HTTP/2 introduces Server Push which enables the server to proactively send resources to the client cache. It does not, however, allow for pushing data down to the client application itself. Server pushes are only processed by the browser and do not pop up to the application code, meaning there is no API for the application to get notifications for those eve
대강 … 이벤트 전달용이 아니라 리소스만 전달한다는 것 같다.
WebSocket은 메셰지나 이벤트를 전달하는 용도고

이런이유로 속도가 빨라지고 네트워크 자원이 절약된다고 한다. Google이 죽자고 크롬 만들어서 배포한 이유가 여기 있었다. SPDY프로토콜 이용한 통신으로 네트워크 비용을 많이 절약했겠다.

빼먹은거 하나. Http1.1도 gzip 압축compress해서 전송하는걸 지원하긴했는데 Http/2에서 개선된점은 압축방식이 더 좋다고 한다. 뭔진 모르겠지만… 그리고 Http1에서는 헤더는 압축불가능하고 반복되는게 계속 전달됐는데 Http/2는 헤더와 쿠키의 반복전송을 하지 않는다는점.

웹개발자들은 WindowsXP8 유저들을 위한 대안도 준비해야겠다.
웹개발은 진짜 돈도 안되고 신경쓸것도 많고

Posted in Document | Tagged , | Leave a comment

Spring 5.0에서 바뀌는 점 + Java9에서 바뀌는 점

Java9 대응

따라서, Java9에서의 변화가 Spring5 에서의 변화겠지

JDK7에선 붜가 변했는지 잘 모르고 넘어갔고 <>??
JDK8에선 stream, lambda(람바다?람드아?)가 나왔는데 크게 사용률이 높지 않았다
JDK9에서는 좀 많은 변화가 있는 것 같다

‘ http://blog.takipi.com/5-features-in-java-9-that-will-change-how-you-develop-software-and-2-that-wont/

추가되는 기능

  • repl – jshell (커맨드라인 명령 지원 )
    • 다른 언어에서 지원되는거 보고 부러워하던 기능 아닌가 ㅎ
  • Microbenchmarks(JMH)
    • 벤치마크 기술이라고 하는데…
  • GC 개선
    • G1엔진을 쓴다고 하는데.. 빨라진다고?
  • http2.0
    • 2.0 스펙도 봐야한다.
  • OS컨트롤 능력 강화
    • 예를 들자면 PID 가져오는 기능이라던가

사라지는 기능

그런게 있었나 싶은 기능들 : Json API, Money currency

 

Spring5 추가기능

Mono 되는거 뭐 추가되는 것 같았는데…

DispatcherHandler라는 클래스 중심으로 flow가 추가되는 것 같고…

아직 제대로 안봐서 모르겠다.

 

Spring5 지원중지

Portlet, JDO, JSF 등 공부할 생각도 못했던 몇몇 기술들 지원중단
Hibernate3, 등 구버전 중단.
좀 더 과감해졌으면 좋겠지만…

최근에 Spring재단이 거의 Jaav 표준을 주도하고 있는 것 같아서
조심스러운가보다.

https://spring.io/blog/2015/06/10/feedback-welcome-spring-5-system-requirements

어설프게 몇 줄 읽어봤는데 역시나 댓글에 반발이 조금 있는 것 같다.

Portlet3.0(JSR362)스펙은 2017.Jan에 새로 발표된 것 같은데.. 지원 중단이군 ㅎ
공부할거 하나 줄었다.
왜 필요한가 의문이 좀 있었다. servlet 페이지에 삽입되어서 사용자의 상태를 기억하기도 하고 페이지 일부분의 동적인 변경을 담당하는 기술.. 정도로만 알고 있었는데
오늘 갑자기 protlet 관련 검색하다가 springframework 5.0소스에 portlet 패키지가 없는걸 보고 알게됏다.
DispatcherPortlet
https://en.wikipedia.org/wiki/Java_Portlet_Specification
http://stackoverflow.com/questions/1480528/what-is-the-difference-between-a-portlet-and-a-servlet
몇가지 찾아보니 portlet 기술은 jsp 페이지에 jstl방식으로 fragment를 삽입하는 기술의 일종인 것 같은데
최근에 ajax widget이나 template engine등이 이를 완전히 대체하고 있어서… 굳이 필요한가 싶은 생각이 든다.
그런의도에서 portlet 지원을 중단한게 아닌가….? 싶다.

Posted in 노하우 | Tagged , , | Leave a comment