Category Archives: NOTE

인코딩 지옥탈출 가이드

깨지는 모양으로 인코딩 판별하기

이미지는 생각나면 추가

가오리 : EUC-KR을 UTF-8로 인식하고 열면

수식 : UTF-LATIN1 으로 인식하고 열면

외계어 :

쫩쫠뻴 : utf를 EUC로 인식하고 열면

참고

한글 인코딩의 역사

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0LMWJ&articleno=8181316

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0LMWJ&articleno=8181317

한글 인코딩 – 개념

https://ko.wikipedia.org/wiki/%ED%95%9C%EA%B8%80_%EC%99%84%EC%84%B1%ED%98%95_%EC%9D%B8%EC%BD%94%EB%94%A9

https://namu.wiki/w/%ED%95%9C%EA%B8%80%20%EC%9D%B8%EC%BD%94%EB%94%A9

http://d2.naver.com/helloworld/19187

http://studyforus.tistory.com/167

http://mwultong.blogspot.com/2006/12/hwp-unicode-utf-8.html

https://ko.wikipedia.org/wiki/UTF-8

http://ssaemo.tistory.com/28

https://encoder.mattiasgeniar.be/index.php

https://docs.python.org/3/howto/unicode.html#encodings

코드

어디거 퍼온거 합쳐놓은거

import java.io.*;

/**
 * @author chaeeung.e
 * @since 2017-08-08
 */
public class EncodingCheck2 {

	private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
	public static String bytesToHex(byte[] bytes) {
		char[] hexChars = new char[bytes.length * 2];
		for ( int j = 0; j < bytes.length; j++ ) {
			int v = bytes[j] & 0xFF;
			hexChars[j * 2] = hexArray[v >>> 4];
			hexChars[j * 2 + 1] = hexArray[v & 0x0F];
		}
		return new String(hexChars);
	}

	public static void main(String[] args) throws IOException {
		File file = new File("B:\\test\\test22.txt");
		BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
		reader.readLine();
		reader.readLine();
		reader.readLine();
		reader.readLine();
		reader.readLine();

		String str = new String(reader.readLine());
		String[] charSet = {"utf-8", "euc-kr", "ksc5601", "iso-8859-1", "x-windows-949"};

		for(int i=0; i<charSet.length; i++){

			for(int j=0; j<charSet.length; j++){
				try{
					System.out.println(charSet[i]+":"+charSet[j] +"="+ new String(str.getBytes(charSet[i]), charSet[j]));
					System.out.println(bytesToHex(str.getBytes(charSet[i])));
					System.out.println(new String());
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
}

 

[소프트웨어] Kotlin+Java-SpringBoot 프로젝트 진행 후기

프로젝트라고 할 수준은 아니고 새로 만드는 마이크로 서비스에 꼬출린을 적용하다가 겪은 일들

사용기술 키워드

Java,Kotlin,SpringBoot,JPA,QueryDSL,RESTful API

문제상황

문법

TypeScript,Swift,Kotlin 문법이 상당히 비슷하다.

세개 언어의 합병은 불가능할까?

Reflection, Ananotation

JVM언어라 최종적으로 동일한 바이트코드가 나오는거니까 리플렉션도 동일한 형태로 나오겠지 생각했는데 아니었나보다.

리플렉션이 필요한 부분에서 오류가 나는 것 같다.

QueryDsl, jackson, Lombok(은좀다르지만)

 

생성자 선언

이건 좀 다른데.. 그냥 언어에 익숙하지 않아서 그런면도 있고

되게 편한것처럼 써있던데 막상 써보면

문법이 그리 편하지는 않다.

Lombok

Java와 혼용시 lombok 적용이 안된다.

컴파일타임 문제때문에…

같은 모듈에서 Java+Kotlin을 쓰는경우 오류가 난다.

해결방법은…(회피방법은?)

core<–web

core에 Java를 쓰고 web의 kotlin에서 가져다 쓰는건 가능하다.

근데 왜 쓰나?

그냥 한 번 써볼라고

그리고 아직 많이는 안 써봤찌만 쓰다보니 언어 자체가 조금 심플함이 좀 있다.

SSO(SingleSignOn) – Solution vs 직접개발

개요

요즘엔.. SSO 관련 개발은 거의 필수인데
막상개발하려면 여기저기 다 있는거 또 만드는 것 같은 생각이 들지만…
오픈소스나 뭐 갖다 쓰려고 하면 또 마땅한게 없다.

대안

OpenSource

JOSSO : 설치하면 실행된다. 쉽게 사용은 가능한데 커스터마이징도 쉬울까가 고민..
CAS : 코드가 매우 복잡.. 잘 이해가 안간다. 새로 만드는게 더 빠르지 않을까? 그냥 실행되는것도 아니라서 갖다쓰기도 편하지 않다.

상용Commercial

직접개발

관련기술

SAML : 삼를.. 잘 모르겠다.
http://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_roles_providers_saml.html
OAuth : 오앗. 토큰받아다가 쓰는거. 많이 쓰니까 설명생략
GlobalCookie : 여러서버에서 동일한 네임의 쿠키를 바라본다. auth서버를 호출해야겠지
IP : 접속주소
MacAddress : 랜카드 주소기반
LDAP : 디렉토리 서비스 계층형으로 권한을 저장하는방식??/정도로 알고있는데..
Token : Stateless 호출에 사용. API에 많이 사용됨
등등…
다 지원되면 좋겠지만 다 하기는 힘들고 필요한것만 사용하는게 좋다.

~~~~~

위의 기술을 그대로 구현할수도 있고.. 유사하게 구현할수도 있고..라이브러리를 갖다쓸 수도 있고

이전에 쓸 때는 OAuth서버를 구현하고 OAuth(Like)방식으로 내부 SSO를 구현했는데…
좀 개선해보려면 어떻게 하는게 좋을지

CRUD 네이밍 결정. 고민.

https://ko.wikipedia.org/wiki/CRUD

ABCD: add(추가), browse(보기), change(변경), delete(삭제)
ACID: add(추가), change(변경), inquire(질의), delete(삭제)[1]
BREAD: browse(보기), read(읽기), edit(편집), add(추가), delete(삭제)
VADE(R): view(참조), add(추가), delete(삭제), edit(편집), 트랜잭션 처리에서는 restore(복원) 추가

게시판의 경우
write, read, modify, delete

파일
change

데이터인 경우
add, remove,

근데 나눠쓰면 헷갈린다.

Java -> Kotlin 전환시 발생하는 문제들 + 안좋은점

JPA모델설계시

Java에서는 @OneToOne Many등 표시안하고 그냥써도 됐는데.. Kotlin에서는 오류가 난다.

Caused by: org.hibernate.MappingException: Could not determine type for: solcon.board.domain.model.ArticleCategoryEntity, at table: t_article, for columns: [org.hibernate.mapping.Column(category)]

kotlin data class constructor

생성자 만드는게 몹시 짜증이난다다
써보니 이름이 왜 꼬출린인지 알겠다

자동완성이 구리다

자바개발에서 귀찮은 getter, setter, slf4j은 lombok으로 처리해서 귀찮은 자바의 단점이었던 난잡한 코드 문제가 많이 해결됐는데

변수 선언에서 자동완성이 좀 안된다.

//java
AccountEntity accountEntity;
//kotlin
var accountEntity: AccountEntity;

 

java는 클래스명을 쓰면 변수명이 자동으로 나올 수 있는데
Kotlin은 … 그게안된다.

커뮤니티에 엉터리가 많다

아직 초보자들이 많은지 잘못된 정보가 간혹 있다.
JPA Entity설계할 때 dataclass를 사용하라고 한다던가 하는…
해보니까 그냥 class로 선언하는게 편하다.
아닌가?? 더 익숙해지면 data class가 더 나을까?

QueryDSL 미지원

QueryDSL에서는 Gradle을 공식적으로 지원하지 않는건가?
github에 가보니 maven만 있고 Gradle은 안 보인다.
third party를 이용해서 하긴했는데…
Kotlin은 변환이 안된다. (이것은 아직 지원안되는 것 같다)
결국 Entity는 Java로 다시 변환했다.

Java와 혼용시 문제

Java와 Kotlin을 같은 프로젝트에 섞어서 쓰면 kotlin에서 lombok의 getter, setter이 인식되지 않는다. (컴파일 타임의 문제니까 노력하지말자 – lombokforkotlin을 만들게 아니라면)
멀티모듈로 하면 상위 코드의 core를 조회 가능
groovy가 더 잘 섞이는 것 같다. 테스트코드 짤 때 써볼라고하니까

결론

꽤 안정화됐지만 그래도 아직 갈길이 멀었다.
아직 한창 개발중인 언어로, 언어 자체의 문제로 인한 버그가 간혹 존재한다.
그리고 현재의 문법체계가 언제까지 유지될거라고 보기도 힘들다.
IDE, 프레임워크, 라이브러리 지원도 아직은 Java를 대체할 수준은 아니다.

가장 오류없이 무난한 개발을 하려면 Maven-Java

좀 고생을 하더라도 다른거 써보고 싶으면 다른거 쓰면 될 것 같다.

워드프레스 데이터베이스스키마명 변경하고싶을때

스키마를 하나 새로 만들고
하나하나옮겨줘야한다.

mysqldump를 사용하는방법도 있고 이게 간편한것같다.
디렉토리명을 변경할수도 있을 것 같은데.. 메타데이터를 찾아서 바꿔주면… 위치를 정확히 몰라서 노가다로 처리했다.

플러그인 설치한게 더 있다면 테이블이 더 많을수도있고….
여기서도 이름이상한 몇개는 플러그인에서 생성한 테이블인것같다

RENAME TABLE {original_schema}.wp_commentmeta TO {new_schema}.wp_commentmeta;
RENAME TABLE {original_schema}.wp_comments TO {new_schema}.wp_comments;
RENAME TABLE {original_schema}.wp_cpd_counter TO {new_schema}.wp_cpd_counter;
RENAME TABLE {original_schema}.wp_icl_string_translations TO {new_schema}.wp_icl_string_translations;
RENAME TABLE {original_schema}.wp_icl_strings TO {new_schema}.wp_icl_strings;
RENAME TABLE {original_schema}.wp_links TO {new_schema}.wp_links;
RENAME TABLE {original_schema}.wp_multilingual_linked TO {new_schema}.wp_multilingual_linked;
RENAME TABLE {original_schema}.wp_options TO {new_schema}.wp_options;
RENAME TABLE {original_schema}.wp_postmeta TO {new_schema}.wp_postmeta;
RENAME TABLE {original_schema}.wp_posts TO {new_schema}.wp_posts;

RENAME TABLE {original_schema}.wp_term_relationships TO {new_schema}.wp_term_relationships;
RENAME TABLE {original_schema}.wp_term_taxonomy TO {new_schema}.wp_term_taxonomy;
RENAME TABLE {original_schema}.wp_termmeta TO {new_schema}.wp_termmeta;
RENAME TABLE {original_schema}.wp_terms TO {new_schema}.wp_terms;
RENAME TABLE {original_schema}.wp_usermeta TO {new_schema}.wp_usermeta;
RENAME TABLE {original_schema}.wp_users TO {new_schema}.wp_users;

CQRS와 EventSourcing 기술을 보고

CQRS와 EventSourcing제대로 이해를 했나 모르겠는데

비슷한 생각을 하고 그런 설계를 잡으려고 했었는데,
당시에는 Hibernate ORM Envers라는게 있는줄 몰라서…
그 때의 설계는
ORM을 이용한 도메인 설계를 그대로 화면에 보여줄 수 있도록 하고 히스토리는 별도로 저장하는 구조였다.

)를 들어 회원정보 엔티티에서
level 변동, password 변경 등에 대한 히스토리 저장이 필요하다.

RDBMS에서는 다음 엔티티의 현재상태만 저장

UserEntity {
username : string
password : string
passwordChangeDate : date
email : ref EmailEntity
level : type { bronze, silver, gold, platinum, diamond, challenger }
lastLoginDate : date
}

로그는 별도 디비 또는 파일로 관리.
user-password-change-history (password, passwordChangeDate)
user-level-change-history
user-lastLoginDate-history

이런방식으로 현재상태와 변경상태를 저장한다.
변경히스토리를 저장하는 부분을 하나하나코딩하면 안되고,
하이버네이트 인터셉터라던가 해서 데이터변경을 확인하고 로그를 남기도록 하는 추가기능이 필요하다.

이렇게 하는 경우 RDBMS의 데이터가 메인이기 때문에 변경기록이 남지 않게 되는 상황이 생길수도 있다. 중요한 데이터는 트랜잭션을 걸면 느려
계좌 밸런스를 저장하는걸 예로들걸 그랬나

지금 CQRS컨셉으로 제시하는 것을 보면 현재상태는 메모리디비같은데 저장하는 것 같은데 소규모시스템에서 생각 해 보면
RDBMS에 현재상태를 몽땅저장하는게 괜찮아보인다.

이정도로 중규모까지는 사용가능 해 보인다.

RDBMS의 업데이트를 과도하게 사용하는 부분이 문제가 되긴 할텐데…

어쨌든.. envers쓰면 쉽게 된다.
http://hibernate.org/orm/envers/
….
잘도 만들어 놨다. 이걸 왜 못찾았을까 좀만 더 찾아볼걸

MS의 Cloud Design Pattern 24선. (CQRS, EventSourcing … etc)

원문 링크 : https://docs.microsoft.com/en-us/azure/architecture/patterns/

MS에서 발표한 Cloud 에서 적용하면 좋은 디자인 패턴

(for Azure, 다른 Cloud도 가능)

그중에서 요즘 관심을 끄는것은 CQRS와 EventSourcing
정확히 이해는 못했는데

DDD구현의 문제를 해결
CRUD가 분산환경에서 갖는 문제점(고가용성 서버한계)
때문에 나왔다.

아주 간단히 하면 이정도인듯 하다.
StreamData처리하는것과 비슷한건가 좀 더 봐야할 것 같고.

구글에서 CQRS로 검색하면 한글로 번역된 문서도 좀 있다.

[번역] 최신 기술 – CQRS 처음 도입하기

시간이 되면 원문을…

Command Query Responsibility Segregation
https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs

https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing

프레임워크도 나와있다

Axon : www.axonframework.org

Reveno : reveno.org

Eventuate : eventuate.io

Lagom : www.lagomframework.com

다들 쉽고 빠르고 분산가능하다고 써있는데 안써봤다.

기타 참고할만한 문서

Introduction to Domain Driven Design, CQRS and Event Sourcing

Java Template 엔진 – 텍스트

JSP – jstl

www가 html을 쓴다면,  jsp도 계속 쓴다
협업시 jsp를 쓴다면 깔끔한 코딩은 신경쓰지 말자
쑤셔넣어서 개발하기좋고 보통 그렇게 사용된다

Thymleaf

이메일 템플릿 용도로 써봤는데
잘 만들어놓으면 퍼블리셔가 자꾸 망쳐놓는다.
문법이 어려우니까…
디자이너 퍼블리셔 개발자 협업해서 쓰라고 만든 것 아닌가?
이정도면 용도폐기 수준.

다시는 쓸 생각이 없다.

Velocity

jstl에서 꺽쇠 쓰는걸 샵으로 대체하는 정도
그만 만들고 다른 생산적인 일을 했으면 좋겠다.

Freemarker

Velocity와 또 다른 끔찍한 혼종
뷰 코드에 베이직형태의 코드를 짜집어 넣고싶어 환장한 사람이 있다면 추천
아니라면 이걸 쓸 필요는 없지 않을까

Mustache

jquery tmpl 하고 비슷한 방식을 사용한다.
익히기 쉽고 사용도 쉽다.
눈에띄는 단점은 없는데 실제 프로젝트에 적용 해 보지 않아서 아직 뭐라 말을 못하겠다.
간단한 페이지에 적용 해 볼 의향이 있는 정도

Jade

노드랑 ㄷ장고 프로젝트 만질 때 좀 썼었는데
좋지도 나쁘지도 않았다.
익숙하지 않아서 그런지 모르겠지만 탭강간이 심각했다
탭이 대여섯개 넘어가면 파일을 나눈다거나 하는 별도의 노력이 필요하지 싶다.
자바용으로도 나와있다고 하는데 자바에서는 안 쓸 것 같고
노드 프로젝트 할 때나 써봐야겠다.

결론

은 HTML

결국 HTML을 뽑아낼 방법을 찾는 것들인데

뭐가 더 편할지는 취향차이가 있을 것이라고 생각한다.

물론 완전히 잘못된 선택도 존재한다.