Windows PowerShell, 윈도우 10을 쓰다보니…

윈도우10 쓰다가 우연히 발견했는데 …
쓰다보니 맘에들어 작업표시줄에 커맨드라인 대신 걸어놓고 쓴다.

CommandPrompt는 Dos의 콘솔창같은 느낌이라면 PowerShell은 LinuxTerminal의 좋은점을 좀 가져온 느낌이다. 색깔 때문인지 입력하는 느낌도 묘하게 다른게 많이 생소하다.
Gnu처럼 명령어도 좀 복잡한게 CommandPrompt보다 다양한 명령이 가능할 것 같다

실행은 두 가지 모드가 있던데 명령어 보이는 복잡한 창이랑.. 심플한 창이랑
뭐라고 명령어 입력하면 명령어 안내창이 나오기도 하던데…
일부러 공부할 생각은 없고.. 노가다성 작업이 필요할 때 마다 찾아보면서 하는게 좋지 않을까?

원래 윈도우 서버에서 쓰였던 것 같은데… 이제 이걸로 통합하려고 하는건가?

 

윈도우10 밑에 검색에 PowerShell 치면 나온다

 

 

UML – 프로젝트에 UML포함하기

이슈트래커나  프로젝트 문서 또는 소스코드에 프로젝트의 설계 관련 문서를 넣으면 좋을때가 있는데
여태까지는 진짜 적당한 프로그램이 없었다
대강 인터넷 찾아서 나오는 몇 가지 프로그램 비교해보면

argouml

몇번 써봤는데…
이건 제대로 돌아가지도 않는다… 느리고

StarUML

한국인이 개발한건데 이 사람이 개발포기한다고 어디서 글을 본 것 같은데…
GPL 라이센스 무료.. 원래 유료였는데 무료화에 소스공개하고 접은걸로 알고 있다.
근데 몇년전에 갑자기 v2가 나오고 v2는 어찌된건지 유료화가 됐다. GPL인데 유료화가 됐다면… 저작권을 매입한건가?
어쨌든 프로그램이 좀 불안정해서 안쓰게 됐다.

Visio

좋긴한데, 깔아서 쓰는사람이 별로 없고 설치도 힘들어서…
프로젝트에 포함시켰을 때 ide나 웹에서 봐지면 좋은데 그것도 아니고

PlantUML

최근 발견했는데 상당히 마음에 든다.
그림을 그리는 방식이 소스코드처럼 그려서 GIT에 관리하기도 편하고 용량도 얼마 안먹는다.
IDE플러그인에서 이미지 출력도 지원
중국계 오픈소스, GPL License인 것 같지만

http://plantuml.com/faq

I don’t like GPL!

You can also use:

라이센스가 모호하다.  맘대로쓰라는것같다.

X11, OSx에서는 완벽하게 돌아가지는 않나보다. 아직 윈도우에서만 써봐서…
컨셉이 나름 괜찮아서 커뮤니티가 활성화되면 나아지지 않을까 싶다.

사용하려면
http://plantuml.com/
이클립스, Intellij 플러그인을 설치하고 graphviz를 다운받은 후 설정에 써줘야한다.
C:/Program Files (x86)/Graphviz2.38/bin/dot.exe
뭘잡을지 잘 모르겠지?
dot.exe파일을 잡아줘야한다.

문법이 크게 복잡한것은 아니고…

클래스다이어그램은
UML만가지고 무슨 대규모 프로젝트 하는것도 아니고 잘해야 인터페이스 대여섯개정도 잡는정도니까

시퀀스 다이어그램은 순차적으로 가니 또 상관없을 것 같고….

디자인 패턴가지고 ClassDiagram 그려보고 있는데 괜찮은 느낌이다.

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을 이용해서 만들만한게 뭐가 있을까 모르겠다. 언어의 특성에 따라 만들기 좋은 작품이 있는데…

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

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

Gradle을 왜 써야하나

그래들.. Ant/Maven/Ivy 등 자바의 다양한 빌드 툴중 하나 정도…

Java를 주로 쓰고 Groovy를 보조로 그리고 요즘 Scala를 살짝 보려고 하고 있는데… 순수 Java개발이라면 상관없지만 복합적인 프로젝트를 만들려면 Gradle이 필수적이다.
(Maven으로 해도 되긴 하는데..  예전에 시도했을 때는 groovy의 특정 버전이 안먹힌다던가 하는 문제가 있었다)

scala는 또 따로 sbt가 있긴하던데… 비슷한 기술들을 이것저것 익힐 필요는 없을 것 같고 조금 더 많이 사용하는 Gradle을 쓰는게 낫지 않을까 호환성 측면에서도
gradle vs sbt 참고자료 : http://stackoverflow.com/questions/11061938/comparing-sbt-and-gradle
요약하면 sbt는 ivy기반이고 snapshot 라이브러리(버전을 중복해서 막 배포하는 라이브러리)에 대응하지 못한다는 것.(인것같다)

개인적으로는 네이티브 자바 라이브러리 개발 및 배포 상황에서 메이븐 셋팅을 다 갖춰놓았기 때문에 이 부분까지 Gradle로 대체할 생각은 없고 java groovy scala를 복합적으로 적용해야 하는 상황에만 사용할 예정이다.

 

Gradle관련 공부하면서 본 책

[도서]엔터프라이즈 자동화를 위한 그래들
여태껏 Gradle 셋팅을 튜토리얼만 찾아보면서 배워가지고
좀 더 구석구석 공부하려고 책을 봤는데
튜토리얼이 다인 것 같다.
한글로 읽어서 편하고 빠르게 이해할 수 있다는 점에서 만오천원 정도 쓸 가치는 있다.
번역서도 아니고 저자가 직접 저술한 책이라 어설픈 번역투도 없어서 이해도 더 잘된다.

 

Gradle을 왜 써야하나

Gradle이 대세이고 지금 기능도 제일 좋은 것 같다.
다른걸 잘 써 왔고 사용하려는 기능이 다 제공된다면 굳이 바꿔야할 필요가 없지만, 배워놓을 필요는 있는 것 같다.
처음 배운다면 Java/Scala/Groovy 뭘 하던 Gradle.

Gradle 참고자료

Gradle 공식 소스코드
https://github.com/gradle/gradle
Gradle 공식홈페이지

Gradle l Modern Open-Source Enterprise Build Automation

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들을 설치하고 사용하면된다.

 

[ERROR] DB 커넥션이 알 수 없는 이유로 닫히는 경우

 

단순한 실수로 발생할 확률이 높고 의외로 해결에 시간이 오래 걸린다.

내 코드가 잘못됐다고 생각하지 않고 보통 다른데서 문제를 찾다보니 한참 걸린다.

 

이건 보통 transaction이나 connection close를 적절한 곳에서 해 주지 않아서 발생한다.

아마도…. 다른 이유였다면 검색하면서 시간 버리지 않고 금방 해결했을거다.

 

여태까지 여러 삽질을 해왔는데…
라이브러리의 문제로 오류가 발생했던 경험이 두어번정도 있었고 나머지는 다 내 코드 문제였다.

avro 자바-파이썬 에서 숫자자료형길이 호환안되는 문제 : 파이썬은 숫자자료형길이가 무제한

닷넷에서 뭐였는데… 스텍오버플로우에서 그거 닷넷버그라고 회피해서 사용하는법을 알려줬던 것 같다.

아 그리고… 오라클은 좀 많았던것같다.  아예 먹통은 아니고 의존성 문제였지만(문제있는 라이브러리는 패치를 하던가 삭제를 하던가.. 다운받게 공개를 해놔가지고)

 

몇년이나 일하면서 서너번이면 많지는 않으니

MSSQL2008 -> Oracle12c Sqldeveloper이용 데이터 대강이전

어쩌다 보니 어느패션업체의 디비 마이그레이션업무를 처리하게 됐다.
직접 말한것은 아니고 기획자를 통해서 한다리 건너서 협의가 이뤄져서 정확히는 모르겠지만
전달받기로는 마이그레이션이 쉬운게 아니라고 설명을 하면 "그냥 해주면 안되요?" 라는 반응을 보였다는 것 같다.

고객사에서는 마이그레이션을 그냥 파일 카피 정도로 생각하는 것 아닐까?
내가 갔으면 말도안되다는것을 좀 더 강하게 어필했을 것 같은데…

디비 전환 이유는 …. 정확히 전달받지는 못했지만 데이터를 보니까 이해가 갔다.
데이터 상태를 보니 속도가 매우 느렸을 것 같다.
검색도 하지 않을 것 같은 로그테이블이 동일한 데이터베이스에 수백기가 쌓여 있었다
MSSQL이 느리니까 짷좋은 오라클로 옮기면 빨라지겠지? 정도의 판단이 아니었을까

그리고 기왕 마이그레이션을 하기로 마음을 먹었으면 안쓰는 테이블이라던가 프로시저들을 파악해서 정리를 하면 좋을텐데…

대~애충 빨리 해다라고 하니 그럴 수 밖에…

마이그레이션은 툴을 이용해서 처리하기로 했다.
유료는 안 써봐서 모르겠고 이전에도 몇 번 돌려봤는데 특정 쿼리문은 번역도 안되고 테이블도 몇 개씩 빼먹고 하는 경우가 많았다.
각 데이터베이스에 의존적인 키워드를 사용하는 경우 오류도 발생하고

툴은 SqlDeveloper 4.1.5를 사용하기로 결정
(고객사에서 추가비용 지출을 저언혀 생각하지 않고 있어서)

SqlDevelop – Tools – Database – Third Party JDBC Driver에 추가

jtds-1.3.1-dist

이래저래 필요한 셋팅하고서 마이그레이션 실행
오류가 이것저것 많이 발생했는데 주로 발생하는 문제는 인코딩 오류, 쿼리오류
인코딩은 초반에 잡아줘서 해결했지만.. 쿼리는… 일부는 포기하고 넘어갔다.

MSSQL 2008 -> Oracle12c
결과 : 쓸데없는 테이블을 생성 해 놓는다. 마이그레이션 결과기록 테이블인가?
데이터는 제대로 옮겨지지 않는다. (뭘 잘못한 것 같진 않고 12는 아직 지원되지 않는것 같다)

MSSQL2008 -> Oracle11gr2
결과 : 테이블과 데이터는 잘 옮겨졌다

Oracle11gr2 -> Oracle12c
여기서는 자동화 툴이 안돌아가고 쿼리로 백업받은 후에 다시 올렸다.
덤프는 뭔가 호환이 안되는 것 같다.
이 방법으로 하는경우 Clob은 이전이 안된다. Oracle Clob은 쿼리 insert가 안되서 Varchar4000으로 변경할 수 있는 부분은 변경하고 안되는 부분은 python script를 이용해서 처리했다.

 

야매이전 완료 후

Function, Procedure – 거의 다 깨진다.
View – 거의못쓸지경.. 다 지우는게 나을 것 같다
Table-Clob제외하고는 정상

처참하네.. 마이그레이션이라고 할 수 있을까?
오류가 날 대 마다 거의 다 손으로 처리해야하지 않을까 싶다.

일 해 놓고도 미안한 상황이다
정식 프로젝트가 아니라 더 시간을 할애할 수는 없으니 대강 마무리할 수 밖에…

Oracle 디비 백업 – expdp

expdp system/oracle@orcl directory=MY_DATA_PUMP dumpfile=shopmall.dump logfile=shopmall.dump schemas=shopmalljob_name=shopmall001

이 명령을 실행시키면..

다음 경고가 뜨면서 처리되지 않는다.

 

  1. 이미 처리중이던 녀석이 남아있으면 안될 수 있다고

이걸 확인 해 보라는데…

 

또 안되네

  1. 스트림 풀 사이즈를 늘려보라는데

    안된다

  2. DBA 디렉토리 등록

     

    아직안됨…디비 깨짔나

 

질문할만한사이트가…

http://www.gurubee.net/
http://www.dator.co.kr/
http://www.dbguide.net/
http://database.sarang.net/

 

몇가지 더 확인 필요해 보이는 부분

http://www.dba-oracle.com/t_ora_31623_job_not_attached_to_session_via_specified_handle.htm

http://theone79.tistory.com/837