git reset --hard HEAD~5


해당 브랜치로 이동 (check out)하여 위의 명령어를 친다.

 5는 5번 commit 이전으로 돌아가는것.

물론 다른 숫자가 가능함.

'eclipse > svn' 카테고리의 다른 글

Failed to load JavaHL Library. 해결  (0) 2012.03.28
64bit 윈도우를 사용할때 svn연결의 문제  (0) 2012.03.28

링크글 : http://okky.kr/article/286812

위의 질문, 답, 토의를 보는데 유익해서 스크랩 겸 정리


책 저자 : 

 실제 구글 트랜드로 검색해보면 전세계에서 JPA, Hibernate를 합한 검색어가 94%인 반면 iBatis, myBatis를 합한 검색어가 6%가 안됩니다.

SQL만 잘 작성해도 충분히 빠르게 애플리케이션을 개발할 수 있다고 생각합니다. ORM 기술은 객체 지향과 관계형 데이터베이스 둘을 활용하는 것이지 대체하는 것이 아닙니다. 따라서 관계형 데이터베이스를 잘 모르면서 ORM 기술을 사용하는 것 처럼 위험한 것도 없다

 데이터를 언제 대체될지 모르는 특정 개발 환경에 종속적으로 만든다는 건 ... 꼬리가 몸통을 흔드는 격이라고 봅니다.

 ORM은 이름 그대로 객체(O) 관계형 데이터베이스(R)을 중간에서 매핑(M)하는 것입니다. 객체 지향 애플리케이션은 객체 지향대로 다루고 관계형 데이터베이스는 관계형 데이터베이스대로 설계하고 사용할 수 있도록 중간에서 도와주는 기술일 뿐

대부분의 데이터베이스가 너무 이질적이어서 공통화를 할 수 없습니다

ORM은 한계를 인정하고, 네이티브 SQL을 사용할 수 있도록 지원합니다. 


데이터를 연산하는 형태는 was에게 맡기는게 맞는 것 같습니다.

 sql안에서 직접 계산하고 연산하는 부분은 통계를 제외하고는 지양해야 된다고 생각됩니다.


ORM 은 편리하지만, RDBMS 의 특성을 100% 살리지는 못한다고 생각합니다. 그래서 비교적 간단한 형태의 관계를 가지는 데이터들이라면 ORM 이 어울리지만, 그렇지 않은 경우 참 난해해집니다.


ORM  역시 대부분은 일반적인 형태대로 테이블이나 관계 구성을 하면 최적의 환경을 못만들겠더군요. 그래서 ORM 에 맞는 구성을 해둘 경우 더욱 쾌적한 프로그래밍이 가능하다고 느꼈는데, 이것조차 진입장벽이라는게 문제였습니다. 


 DBA 와 개발자의 경계는

무척이나 선명한 편입니다.

ORM 을 사용하게 되면 이 경계가 살짝(?) 모호해 지죠. 


 Learning Curve의 문제이지 생산성의 문제는 아니라고 봅니다. 



'DB' 카테고리의 다른 글

MS SQL Id 칼럼 초기화  (0) 2013.08.30
ORM 이란  (0) 2013.05.08

객체지향 프로그래밍이란

상속관계로 클래스 계층구조를 형성하고,

클래스에 대한 인스턴스(필드)는 객체로 표현하며,

객체가 모여 서로 협조(사용)하며

조직을 이루게하는 구현방식이다.

Collections.sort(list, new Comparator<SomeDto>() {
@Override
public int compare(SomdDto o1, SomeDto o2) {
return o1.getCreatedAt().compareTo(o2.getCreatedAt());
}
});

객체안 값을 비교하여 sort Collections sort

private static final char UTF_8_WITHOUT_BOM = '\ufeff';

private String saveUpdatedResult(String mailString) {
String fileName = DateUtils.
convertDateToString(new Date(), DateUtils.FORMAT_DATE_CALENDAR) + ".csv";
Path filePath = Paths.get(fileName);
try {
Files.
createFile(filePath);
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(Files.newOutputStream(filePath, StandardOpenOption.TRUNCATE_EXISTING), "UTF-8"))) {
writer.write(
UTF_8_WITHOUT_BOM);
writer.write(convertHtmlToCSV(mailString));
}
return store(new File(fileName), fileName);
} catch (Exception e) {
log.warn("File create error. cause : ", e);
return null;
} finally {
try {
Files.
delete(filePath);
} catch (IOException e) {
log.warn("File delete fail. cause : ", e);
}
}
}

파일의 맨 앞에 \ufeff 을 넣어주면 된다. 하이고~..

function checkOnlyCharacter(data) {
for (var i = 0; i < data.length; i++) {
var temp = data.substring(i, i + 1);
if (!temp.match(/[0-9]|[a-z]|[A-Z]/)) {
return true;
}
}
}


private String getBarcodeCheckBit(String barcodeNumber) {
StringBuffer result = new StringBuffer();
if (barcodeNumber.length() <= NORMAL_BARCODE_LENGTH) {
for (int i = 0; i < NORMAL_BARCODE_LENGTH - barcodeNumber.length(); i++) {
result.append("0");
}
result.append(barcodeNumber);
}
String barcode = result.toString();
int s = 0;
int d = 0;
for (int i = 0; i < NORMAL_BARCODE_LENGTH - 1; i++) {
if (i % 2 == 0) {
s += Character.getNumericValue(barcode.charAt(i));
} else {
d += Character.getNumericValue(barcode.charAt(i)) * 3;
}
}

int chk = (10 - ((s + d) % 10)) % 10;

return String.valueOf(chk);
}


List<EditHistory> getEditHistory(String userId, Obj source, Obj target, Class clazz) {
List<EditHistory> editHistoryList = new ArrayList<>();
try {

for (Method sourceMethod : clazz.getMethods()) {
for (Method targetMethod : clazz.getMethods()) {
String sourceMethodName = sourceMethod.getName();
String targetMethodName = targetMethod.getName();
String startWithGet = "get";
String startWithIs = "is";
boolean methodGet = sourceMethodName.startsWith(startWithGet);
boolean methodIs = sourceMethodName.startsWith(startWithIs);
if ((methodGet || methodIs)
&& !sourceMethodName.equals("getClass")) {
if (sourceMethodName.equals(targetMethodName)) {
Object sourceResult = MethodHandles.lookup().findVirtual(clazz, sourceMethodName,
MethodType.methodType(sourceMethod.getReturnType())).invoke(source);
Object targetResult = MethodHandles.lookup().findVirtual(clazz, targetMethodName,
MethodType.methodType(targetMethod.getReturnType())).invoke(target);

if (sourceResult != null && !sourceResult.equals(targetResult)) {
EditHistory skuEditHistory = new EditHistory();
editHistory.setEditField(sourceMethodName.substring(methodGet ? startWithGet.length() : startWithIs.length()));
editHistory.setOriginValue(sourceResult.toString());
editHistory.setChangedValue(targetResult != null ? targetResult.toString() : null);
editHistory.setCreatedId(userId);
editHistoryList.add(editHistory);
}
}
}
}
}

return editHistoryList;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}


'java' 카테고리의 다른 글

java script 숫자 또는 영문자만 허용하기  (0) 2015.03.19
바코드 체크 비트 검증 Java 코드  (0) 2015.03.06
JVM에 관한 토론 기록  (0) 2015.01.21
Java MethodHandle Example (Java 1.7)  (0) 2014.10.07
Java reflection example.  (0) 2014.10.07

JVM (Visualizer eclipse plugin 사용시 보기편함)

참고자료 http://www.slideshare.net/javajigi/java-virtual-machine-call-stack-java-byte-code

  • JVM Stacks (N) - Call Stack
    • Operand Stack
      • 자바는 cpu 레지스터를 사용하지 않고 Operand Stack을 사용한다.
      • 논리적으로 연산을 하는데 물리적 연산을 하는 C보다 가끔 빠른 이유는?
        • 내부적으로 컴파일을 했을때 native code로 변환을 하면 최적화가 일어난다.
        • VM에서 외부 시스템에 호출할때 최적화된 CPU레지스터를 사용한다.
        • C로 짜면 성능 최적화가 어렵다. Java로 최적화를 잘하면 역전 현상도 일어난다.
        • Java byte code -> JVM Interpreter Code
        • C byte code -> H/W Code
        • Java는 메모리 매니지먼트가 빠르다
          • 자바는 핫스팟(GC)관리가 메모리 관리에 뛰어나다.
        • C는 malloc
          • 파편화, 쓰레드 세이프, 직렬화
          • 메모리를 빈번하게 생성하면 성능이 떨어진다.
    • Local Variables
    • 호출했다 빠졌다가 하기때문에 Call Stack
    • 명령을 받았을때 실행되기 때문에 Operand Stack
    • opcode
      • dup
        • 메소드를 호출할때 마다 dup opcode를 호출한다 (관례)
      • invoke special 구상메소드에 호출메소드를 알고 있을때 사용하는 호출방식
        • 모든 메소드의 첫번째 인자는 this 이다.
      • load opcode
        • stack에 값을 넣는다.
        • 값을 빼서 처리 후 store로 stack에 넣는다.
      • iconst
      • invokevirtual 다형성이 지원되지 않는다.
        • 런타임에 어떤 오브젝트를 호출할지 결정된다.
      • store opcode
        • stack에서 값을 뺀다.
        • local 변수로 돌려준다.
  • JVM Heap (1)
    • 모두가 공유하는 메모리이다.
  • Method Area (1)

 

주요 주제

  • 어노테이션의 특성
    • 컴파일이 될때 사용처를 알려주어 컴파일
    • 리플렉션 사용을 위한 마킹을 해놓는다.
  • 롬복 Lombok
    • 어노테이션으로 마킹하여 필요한 메소드를 바이트 코드를 적용하여 생성한다.
    • JavaOne Lambda: A peek under the hood (람다 초기 자료)
    • From Lambdas to Bytecode - Brian Goetz
    • 익명 클래스와 다른점은?
      • 익명클래스로 하던일을 쉽게 한다.
    • 익명 클래스로 하던 패턴을 바로 쓰겠다.
    • 메소드 하나만 있는 인터페이스 -> 람다적용 대상이 된다.
      • SAM (Single Abstract Method) -> Functional Abstract Method

  • invoke dynamic
    • 특징
      • 다형성 x
      • 어떤클래스를 사용하는지 런타임에 결정된다
    • 순서
      • indy botstrap 메소드 호출
        • 어떤 bootstrap메소드를 호출할지는 컴파일타임에 정해진다.
      • Callsite 라는 값을 반환한다.
        • 무엇을 호출할지 값을 가지고있다
      • bootstrap 을 통해 callsite 값 을 받은후에는 callsite 메소드를 호출
    • 장점 
      • 펌젬이오버플로우 되는 문제를 해결
      • 첫실행에는 시간이 조금 더걸리나, 첫실행후에는 빠르다. 
      • 리플렉션에 비해 절반정도 빠르다.

  • Method Handle 
    • 최종적으로 Functional Interface 로 Mapping 된다.
    • 어떤메소드를 호출할지 알려준다.
  • 람다 표현식에서 Invoke dynamic의 역할
    • 람다가쓰이는곳에 Invoke dynamic 방식으로 쓰고,
    • bootstrap 이 Method Factory 를 반환한다.
    • 런타임 중 4가지 방법중에 최적화된 방법을 찾아 수행한다.
  • 키워드
    • Lambda
    • Inner class
    • Proxy
    • Method handle
    • Invoke virtual
      • 다형성
    • Invoke interface
      • 다형성
    • invoke static
      • 다형성 x
  • Lambda 의 동작 방식
    • 한번 더 절차를 만들어 desugar
    • 람다를 람다클래스를 사용하는 멤버변수를생성
    • 코드를 Invoke dynamic 으로 생성
    • 메소드 팩토리(부트스트랩)를 생성
    • callsite를 생성하여 4가지 방법 중 가장 좋은것으로 생성
  • 정보
    • 자바닷컴은 내년초에 자바8로 바뀌게된다. (대중화가 이뤄지는 시기가 아닐까 하는 관측)

 

집 서버에 리눅스를 올리고 외장하드를 물려 사용하던 중 어느날 갑자기 외장하드 마운트가 떨어졌다.


$fdisk -l

명령어를 쳐도 안나오길래 아얘 뻑이 났나 싶어서 복구 툴을 돌리니 파일은 살아있는게 보였다.

혹시나 해서 

$sudo fdisk -l 

을 치니 디바이스는 물려있는게 보였다.

바로

$mount -t ext4 /dev/sda1/ /dir/ 

을 하니 

bad superblock on /dev/sdb1 ~

에러가 나오는 것이다. 

몇몇 포럼을 찾아 본 결과 배드 섹션이 있어서 그런것인데 아래의 명령어를 치면 해결된다.

#fsck.ext4 /dev/sda1

이후 다시 마운트 하면 해결


아이고 며칠 고생했네..

+ Recent posts