Category Archives: 개발코딩

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/

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

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\
이 경로 통째로 삭제

web.xml 버전별로 정리

를 하려고 했지만…. 최근것만

4.0

은 언제 나오나

 

3.1

 

3.0

 

알고리즘 공부 사이트

알고스팟

https://algospot.com/

 

더블릿

http://www.dovelet.com

 

Colility
https://codility.com/programmers/lessons/1-iterations/

개발자 알고리즘 테스트할 때도 쓰는 사이트

 

코딩도장

http://codingdojang.com/

 

오일러 프로젝트(Project Euiler)

https://projecteuler.net/

http://euler.synap.co.kr/

 

LeetCode

https://leetcode.com/problemset/algorithms/

기타

백준 https://www.acmicpc.net/

http://www.koistudy.net/

http://jungol.co.kr/

http://www.koreaalgorithm.com/

http://poj.org/

 

 

 

http://exercism.io

https://www.4clojure.com/

Clojure IDE 선택

Clojure 공부 시작하려고 보니…
쓸만한 IDE가 없다.

먼 일을 해도 문구/공구 필요한거 다 챙겨놓고 시작하는 성격이고 개발툴도 찾아서 쓰는편이다.
Eclipse도 어느정도 쓸만해진 후에 Java를 시작했는데 그전에는 없었으면 시작도 안하고 그냥 VisualStudio로 윈도우만 개발만 했을 것 같은데
그래서 ruby도 php도 거들떠도 안봤었다.
python은 복잡한 프로그램을 짜는 용도로 사용하기보다 간단한 스크립트 용도로 사용했기에 상관없었지만…

Jetbrain 덕분에 사요가능 언어 범위가 많이 넓어졌다.
Ruby, Python, Php, JS …(찍어먹어보기만 했지만 Scala, Kotlin도 잘 지원을 해 주는 것 같고)

Clojure도 자동완성을 셋팅 해 놓으면 어느정도 동작을 하는 것 같은데..

겨우 지원되는게 괄호자동으로 치는기능정도인데 편집할 때 오히려 거슬릴 때도 있다.
위에 설정 추가해주면 약간 자동완성이 되는 것 같은데… 해보니 def defn 정도밖에 안된다.
코드자동완성이 잘 되면 언어 개념만 익히면 세부적으로 외우지 않고도 코딩이 가능한데
라이브러리 사용할 때도 구조만 이해하고 넘어가면 되고

설치나 빌드도..
lein 툴 이용하면 설치, 빌드도 되고 cli환경도 사용이 가능한데

다른 언어에 비해 설치방법도 불편하고 공식적으로 인정받는 설치방법도 없는 것 같다.
cli환경 실행시킬 때 쓰는 lein repl이라는 명령도 왠지 php-cli, python, 등 그냥 명령어만 실행했을 때 실행되는 것보다 거리감이 느껴진다

—- 아 IDE쓰려고 했는데 불평만 늘어놨다.

Intellij Idea + Cursive를 많이 사용하는 것 같다.

그런데 자동완성 잘 안되기는 마찬가지다.

atom, visual studio code 등 쓰는거나 별 차이가 없을지도…

그나마 오른쪽 클릭으로 바로 실행시킬 수 있는게 장점

Gradle 빌드로 자바랑 같이 쓰는 환경이나 구성 해 봐야겠다.

Clojure 언어 기본정리

1. 숫자, 분수, 소수, 사칙연산
다른 언어나 비슷하다

2. 괄호넣고연산
연산자가 함수로 인정

3. 문자열, 키워드, 캐릭터, 불린

4. 컬렉션Collection – 목록형
모든 컬렉션은 Immutable, Persistent
Lisp의 벡터는 인덱스가 있고 리스트는 인덱스가 없다
List ‘(1 2 3 4) – LinkedList
Vector [1 2 3 4] – ArrayList

5. 컬렉션Collectino – Map
Map {:bat “bat1” “dog” “dog0”}

6. 컬렉션Collectino – Set
Set #{:bat “dog :cow}
합집합union
차집합difference
교집합intersection

7. def 변수 정의(선언)

8. defn
함수정의
(defn -name [-param0 -param1] -return)

9. fn 익명함수

10. ns 네임스페이스

소프트웨어 트렌드의 변화 – SI to 알고리즘

SI의 시대에서 ~~~의 시대로 넘어오면서
(삑데이터, IOT, AI, 기타 솔루션, 모바일, 자체서비스 …)
알고리즘의 중요도가 더 높아진 것 같다.

기존 한국의 소프트웨어 산업은 영어의 원뜻과는 별 상관없는 것 같지만, SI라고 불리는 한 축을 중심으로 성장 해 왔다. 그리고 이 SI산업은 전통적인 여러 산업의 효율성을 증대시켜주고 2000년대 한국산업의 발전에 지대한 역할을 했다.
(개발자는 죽어났지만.. 거의 80년대 봉재노동자급… 중동 건설인부 = 일본캐나다 진출)
이 시기에는 시스템 성능을 높이기 위해서는 쿼리튜닝, 파일용량 낮추기, 네트워크와 컴퓨팅 파워 업그레이드가 더 중요했다. (자바-오라클의 시대)
개발 방법론도 효율적인 코딩보다 빠른 코딩이 대세였고… 그 흐름을 타고 순위권에 진입한 언어가 자바, 파이썬, 루비

SI의 업무분야는 대강 아래의 범주에 다 포함된다.
– 은행/카드/보험/증권 (차세대) 개발, 쇼핑몰, ERP연동, VOC
근데 이 산업군들은 이제 개발이 다 끝났다. 개선은 계속 이뤄지겠지만… 적어도 서비스를 구축하기에 급급하던 시절은 지났다.

근데.. 인터넷 왕폭발이 일어나고 10년쯤 지난 지금은? 좀 다르다.

이제 생각할 수 있는 것은 거의 다 만들어졌다.
이제는 ‘새로움’ 보다는 ‘나아짐’을 만드는 시대다.
서비스를 개선한다는 것은 비용을 낮추거나 사용편의성을 높이는 것일텐데…
같은 컴퓨팅 파워로 더 많은 일을 하려면 아키텍처/알고리즘의 개선.. 밖에 답이 없지 않을까?
– 서버1대 월 10만원에서 10%효율을 높이는 것은 쓸데없는 짓이지만… 1000대라면
기존에 운영되던 서비스들도 인터넷 인구가 늘면서 사용자가 많아지고 따라서 데이터양이 늘고.. 이로인해 기존에 겪어보지 못한 문제를 맞닥뜨리게 된다.

이런 배경에서 알고리즘의 중요성이 다시 대두되는 것 같다.

 

노가다 코딩의 시대의 종말

요즘은 뭘 해도 데이터가 많다. SI업무분야에 포함되는 업종들도 마찬가지…
예전엔 0.01ms의 차이가 별 것 아니었지만, 데이터양이 많아지다보니 이런 부분에서 더 큰 차이를 보인다.
라이브러리들도 많은 기능보다는 작고 빠른게 대세로 자리잡고 있다.
– PlayFramework, Flask와 같은 경량프레임워크의 약진
(그리고 라이브러리 뭐 있었는데 기억이 안난다)

 

이직 – 알고리즘

어느회사 이력서를 넣었다가 온라인 코딩테스트를 하길래…
ㅋ 뭐 얼마나 대단하길래? 라는 생각으로 1시간만에 하고 자야지~
하고 시작했다가.. 좌절을 맛봤다. 잠도 못자고…
그러고 나니 알고리즘에 대해 다시 생각을 해 보게 된다
… 되게 어려웠는데
이 회사 개발자가 몇명인데~ 여기 있는 다른개발자들은 이런문제 다 풀어내는건가?

취업 이후에는 계속 아키텍팅이나 구조분석/설계에만 집중을 했었는데…
시대가 변한 것 같으니 알고리즘도 공부를 해야하지 않을까 싶다.

책도 좋지만..
온라인 테스트 사이트가 다른사람하고 경쟁심도 생기고… 훈장도 받을 수 있고 하니 더 좋아보인다
다양한 언어를 지원 해 줘서 이미 풀었던 문제나 쉬운 문제를 새로 공부하는 언어로 다시 풀어보는 것도 도움이 될 것 같다.

 

사이트 목록은 여기서 퍼옴 http://ledgku.tistory.com/40

오일러 프로젝트

알고스팟

더블릿

코딜리티

https://codility.com/programmers

코드도장

탑코더

코드포스

해커랭크

 

JVM기반 언어들, 쓸만한 녀석들을 골라보면

JVM은 버추어 머신으로 자바만을 돌리기 위한 플랫폼?이 아니고

자바는 컴파일시에 바이트코드를 생산하기 때문에 다른 언어들도 바이트코드로 변환할 수 있게 만들면 JVM위에서 돌릴 수 있다.

자바 처음 공부할 때 이런 내용을 본 것 같은데
그때는 뭐 컨셉만 잡아놓고 말겠지~라고 했는데

하나씩 나왔다.
jRuby, jython, … 이정도?

사실 여기까지는 쓸모없다고 느꼈었다.
네이티브로 돌리면 되는걸 왜 jvm으로 돌려~
그리고 같은 언어라고 하긴하지만… 세부 문법까지 똑같지는 않을거고
이거 복사해서 붙여넣는다고 cruby, cpython에서 돌아가는것도 아니잖아~’라고 생각했었고 지금도 그렇다.

그런데.. groovy, scala, clojure 등의 언어가 나오면서 상황이 좀 바뀐 것 같다.

groovy, scala는 spring에서도 지원하고 있고

playframework는 scala 전용프레임워크 정도로 자리를 잡은 것 같다.

이중 clojure는 … 지구의 90%이상 프로그래머가 모언어로 섬기는 C언어에 짓눌려 기를 못 펴고 있다.

scala함수형, groovy스크립트 정도로 이해하고 있는데.. 그래도 문법 자체가 c계열에서 크게 벗어난다는 느낌은 없었는데

lisp계열인 scala는… 정말 다르다.

언어의 너무 다른 컨셉때문에라도 한번 익혀놓는게 좋지 않을까 싶을정도…
그래서 clojure도 한번 해보려고 한다.

 

내 경험상… 언어를 잘 익히려면 뭔가를 만들어봐야 하는데.. clojure을 이용해서 만들만한게 뭐가 있을까 모르겠다. 언어의 특성에 따라 만들기 좋은 작품이 있는데…

몇몇 클로저 라이브러리를 보고 느낀건데… 가독성은 상당히 좋은 것 같다.
줄바꿈도 잘 지켜지고..
자바나 파이썬에서 많이 보이는 변태적인 문법도 오히려 더 적어보인다.

일단 자바기반 프로젝트에 라이브러리를 클로저로 심는 정도로 하는게 좋을 것 같다.

JAVA – Serializable

Serializable은 왜 사용하는가?

자바의 직렬화 기능을 사용하는 객체를 명시적으로 알려준다. 이것을 안쓰면 직렬화가 안된다.
라고 알고 있었는데

이 기회에 알아보려고 좀 찾아봤다.

 

 

기존에는이 객체는 데이터 오브젝트이다 라는 것을 명시하기 위해 사용했었다.
ajax, rest api 등등에 사용하는 DTO(VO..) 객체에 그냥 붙였다. gson/jackson을 이용한 serialization에는 필수적이지는 않지만 그냥 확실히 표시 해 주기 위해서..
AjaxWrapper<T extends Serializable> 을 명시해서 Serializable가 선언된 DTO만 들어올 수 있도록

이경우 MAP을 사용할 수 없지만 -> 이 설계를 잡을 때 명시적인 도메인을 쓰고 map을 쓰지 않는게 원래 목표였으니 잘된건가?

 

Serializable 인터페이스에 대해 알아보기 위해.. 먼저 

Serialization하고 붙어다니는 serialVersionUID
이게 선언되어 있지 않으면 jvm에서 자동으로 생성을 한다고 한다.
http://docs.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100

The stream-unique identifier is a 64-bit hash of the class name, interface class names, methods, and fields. The value must be declared in all versions of a class except the first. It may be declared in the original class but is not required. The value is fixed for all compatible classes. If the SUID is not declared for a class, the value defaults to the hash for that class. The serialVersionUID for dynamic proxy classes and enum types always have the value 0L. Array classes cannot declare an explicit serialVersionUID, so they always have the default computed value, but the requirement for matching serialVersionUID values is waived for array classes.

영어로 서너번 읽은 것 같은데.. 정확히 이해가 안간다.
첫번째 생성한 클래스.. 변경이 없었다면 0L이 기본으로 셋팅이 될테니 꼭 선언을 할 필요가 없다는것 같다.
클래스에 변경이 있었다면 구버전과 비교를 위해 이 넘버를 명시하는게 필수적이 된다는 거시다.(아마도)

 

Serializable에 대단한 기능이나 의미가 있는 것은 아닌 것 같다.
그냥 JVM에서 제공하는 직렬화를 사용한다고 명시하는 것. JVM에서 기본적으로 제공하는 직렬화/역직렬화 기능을 쓸 때 필수적이고, 내가 예전에 썼던것처럼 그냥 json으로 변환할 오브젝트에다가도 대충 갖다가 써또 되지 않을까 싶다. 그래서 계속 쓰던대로 쓰면 될 것 같다.

 

샘플코드를 작성한다면

Book(v0.1) without uid
Book(v0.2) without uid

Book(v0.1) with uid 1
Book(v0.2) with uid 2

Book(v0.1) without uid
Book(v0.2) with uid 2

이렇게 해서 비교해보면 될 것 같다

이건 간략예제

 

Ruby2.3.3 on Windows10(64bit)

보통 다른언어들은 위도우에 설치하는게 더 쉬운데..

루비는.. 아니다.

버전충돌이 심해서 rvm같은걸 설치 해 주는게 좋은데… 윈도우에서는 잘 안되는것 같다.

윈도우 인스톨러 이용해서 특정버전해서 개발하는게 좋지 않을까
https://rubyinstaller.org/downloads/

설치해야 할 것이 두가지다.

Devkit은 native 루비 gem을 다운받았을 때 이것들을 컴파일하는 역할을 한다.  이거 없으면 기본적인rails app 테스트도 힘드니 필수적이다.

Ruby 설치

이건 그냥 인스톨러 돌리면 바로 설치된다.

설치과정에서 add path는 꼭 선택 해 준다. 안해줬다면 그냥 중복 설치하면 된다.

Devkit 설치

Devkit은 설치파일이 아니고 압축파일이다.

C:\RubyDevkit 또는 C:\Ruby23-x64\Devkit

이쯤에 적당히 풀어준다.

환경변수 추가는 수동으로 해줘야한다.
C:\Ruby23-x64\Devkit\bin

커맨드창을 열어서

 

이제 rails budle rake 등 기본적인 gem들을 설치하고 사용하면된다.