'[+++ JAVA +++]/- - Useful'에 해당되는 글 11건

  1. 2014.05.04 Java & Redis
  2. 2014.04.29 Spring project 시 한글 에러 처리 방법
  3. 2012.06.02 [JAVA3D] RestrictedAccessException : Group: only a BranchGroup node may be added (7)
  4. 2012.05.05 [JAVA] 더블버퍼링(Double Buffering) (3)
  5. 2012.04.05 [JAVA] 한글의 유니코드를 이용해 초성/충성/중성 분리하기 (2)
  6. 2012.02.06 [JAVA] txt 파일 입출력 관련 팁 - 인코딩(encode) (1)
  7. 2012.01.13 3D Particle (5)
  8. 2012.01.11 Eclipse에 FD처럼 수식(표현식)에 공백(whitespace) 넣어주기 (1)
2014.05.04 15:10


Redis 는 NoSQL (Not only SQL) 로 메모리디비.


다양한 타입을 지원


key-value


벨류에 대해 검색이 애매하기 때문에 반드시 키를 잘 정의 해주는 것이 중요하고, 외래키 개념이 없기 때문에 따로 외래키 처럼 사용할 수 있도록 따로 키 스킴을 정의해주는것도 좋아 보임. (키값에 대해 와일드카드등 검색이 용이한 기능이 있음)


보통 키 스킴은 콜론을 이용해 구분자를 둠.


ex)

blog:users:Flask - "123"


blog:comment:user:123 - "Flask"

blog:comment:text:123 - "Wow great"


이때 모든 코맨트 검색시 


keys blog:comment:*


Flask가 작성한 코맨트 검색시


get blog:users:Flask  -> 123


keys blog:comment:*:123


아 뭔가 이상한데? RDB 를 사용하다가 NoSQL을 사용하니 SQL의 편리함을 깨달을 수 있음...



이번 포스트의 중점을 이게 아니고, java 에서 객체를 redis에 넣고, 뺘고 싶을때?


보통 Mybatis 를 사용하면 그냥 sql 구문에 잘 정의 해주면 알아서 객체로 변환해주는데, 하이버네이트처럼 ORM해주는 것이 필요 했다.


그런데 처음에 무식하게 만들었던 방법이 있었는데, 

redis 에서는 해시맵 타입을 지원해서 하나의 키에 대해 맵 형식으로 데이터를 넣을 수 있었다.


명령어는 h가 붙은것으로 hget, hput 등등


따라서, json 처럼 모든 데이터들을 String 으로 변환후, 이걸 하나의 키에 대해 write 하면 될것 같았음.

그래서 자바 오브젝트를 맵 형식으로 바꾸는 유틸을 만들어 보기로 함.






이렇게 만들어 봤는데 문제점이 객체.프롭퍼티.프롭퍼티 를 해결 하지 못함..(객체.프롭퍼티 까지만 됨....아직 재귀가 익숙 하지 않은건가...ㅠㅜㅜㅠ)


그래서 이건 뭔가 좀 불안하다 해서 검색.


검색해보니 hibernate-redis 프로젝트를 개발하시는 분을 발견.

http://debop.blogspot.kr/2013/04/hibernate-redis-hibernate4-2nd-cache.html


이것 말고도 원래 Spring -data 에서 이러한 redis 말고도 여러가지 디비관련 라이브러리가 많았음. 역시 혼자 낑낑 만드는것보다 찾아보는게 좋을지도....

http://projects.spring.io/spring-data-redis/

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0
2014.04.29 12:30
출처 : http://slipp.net/questions/254

현재 Spring + Mybatis 프레임워크와 Tomcat, MySql을 이용한 프로젝트를 진행하고 있습니다.
프로젝트 초창기부터 한글데이터를 기준으로 설계하였습니다.
때문에 디렉토리나 파일구조도 한글에 맞추는 방향으로 프로그래밍을 진행하였구요. 
하지만 프로젝트를 진행하는 내내 한글문제가 발생합니다. 그것에 대한 리서치에도 굉장한 시간을 투자하게 되고요.

혹자는 글로벌사회에 '굳이 한글을 써야하나'..라고 할 수도 있지만
반대로 '굳이 쓰지 말아야할 이유가 있을까..?'라는 생각이 들었습니다. 
만약 사용자가 모두 한국인이라고 가정한다면 한글을 사용하는편이 오히려 restful하지 않을까??라는 생각에서였지요. 
그리고 지금 (첫프로젝트입니다) '한글문제를 피하게 되면 평생 프로그래밍할때마다 피하지 않을까?'라는 생각을 하니까
오기가 더욱 생긴거 같구요..

이 글을 통해서 짧은 시간동안에 제가 겪은 한글문제들을 공유해보고자 하며,
더불어 현재 맞닥트린 문제를 여쭙고자 이렇게 글을 씁니다.
저와 비슷한 문제를 겪을 사람들이 조금이나마 수고을 덜었으면 하는 바람입니다.

추가, 혹은 지적해주시는 내용들은 본문에 추가,수정하도록 하겠습니다.
제 미약한 지식에 적극적인 보탬을 부탁드립니다..

  • 아래내용 (본 프로젝트)에서는 URLEncoding을 전혀 사용하지 않았습니다.
  • 아래에 언급되지는 않지만 소스코드파일의 인코딩은 원하는 설정의 인코딩방식과 동일하게 작성되어야 합니다.

1) GET 요청시 한글 URL 오류.

예를들어 다음과같이 (localhost:8080/2013/자바지기) 요청이 있다고 가정합니다.
spring controller메소드에서 @Pathvariable 로 사용하는 url value를 한글로 사용할 경우,
controller메소드에서 전달받은 데이터 인코딩값이 깨지게 됩니다.


@RequestMapping("/{class1}/{professor}")
public String lecture_detail(@PathVariable String professor) {
//professor 데이터 인코딩 깨짐
}

이 문제는 tomcat 요청시 별다른 파라미터 전달이 없을경우 (header의 encoding setting 요청이 없을경우)
톰캣의 기본인코딩 설정인 8859_1형태로 인코딩되어 발생합니다.
저같은 경우에는 Spring 프로젝트의 web.xml에 encodingFilter를 UTF-8로 설정하였기 때문에
위 메소드의 파라미터로 전달받는 데이터는 8859_1인코딩 + Spring에 설정된 UTF-8인코딩 된 데이터가 전달되게 됩니다.
그러므로 정상적인 데이터를 확인하기 위해서는 아래와 같이 디코딩을 2번해야지만 정상적인 한글이 출력되게 됩니다.


URLDecoder.decode((URLDecoder.decode(param, "8859_1")), "UTF-8"); //방법1
new String(param.getBytes("8859_1"), "utf-8"); //방법2

2) 특정한글이 포함된 URL요청에서 404 not found 에러발생

1)을 통해서 한글데이터를 정상적으로 주고받을 수 있게 되었지만, 특정글자에서 URL인식이 무시되는 현상이 생깁니다.
예를들어 (localhost:8080/2013/한글) 요청에서 '한글'부분에 '종', '눅', '년' 과 같은 글자가 포함될 경우 
404에러가 발생했습니다. 이 부분은 스프링이 아닌 톰캣의 URL요청상의 문제이며 요청 URL의 인코딩과정에서 일어나는 현상입니다.
Tomcat의 server.xml에 설정값을 추가합니다. (리눅스의 경우 /var/lib/tomcat/conf/server.xml)

<Connector port="8080" URIEncoding="UTF-8" connectionTimeout="20000" protocol="HTTP/1.1" redirectPort="8443"/>

여기서 설정하는 URIEncoding의 설정은 1)에서 기본인코딩설정을 8859_1에서 지정하는 Charset으로 변경해줍니다.
이외에 설정할 수 있는 Tomcat옵션은 URL(http://tomcat.apache.org/tomcat-5.5-doc/config/http.html)을 
통해서 확인할 수 있습니다.

여기서 주목할 만한 옵션을 한가지 보자면, useBodyEncodingForURI="true"로 사용하는 항목을 확인할 수 있습니다.
Tomcat Encoding으로 검색할 경우 많은 포스트에서 보이는 옵션으로,
HTTP Header 영역의 ContentType안에 특별히 정의된 charset이 있을경우 Tomcat에 정의된 URIEncoding 값보다 우선적용됩니다.
JSP에서 자주등장하는 setCharacterEncoding을 사용하지 않더라도, 
헤더에 Content-type=application/x-form-urlencoded;charset=UTF-8"으로 전송하게되면 실제로 UTF-8로 인코딩이 됩니다.

이렇게 server.xml에 설정을 추가하게되면, 이전에 사용했던 1)번의 디코딩방식을 사용하면 안됩니다.
오히려 사용하면 에러가 발생하지요.

3) DB 질의시 한글 Param에 대한 오류.

mybatis를 이용한 데이터베이스 쿼리시, 한글 Param값에 해당하는 항목들이 ??????????와 같이 처리되는것이 확인되었습니다.
데이터베이스의 charset 설정값이 UTF-8임에도 불구하고, 한글 Param값에서는 에러가 발생했습니다.
물론 쿼리가 제대로 이루어지지 않았구요.
이 문제는 Connection Pool에 인코딩설정값을 더해줌으로서 해결할 수 있었습니다.
database url 선언시 하단과 같이 설정하게되면 query에 포함되는 유니코드값이 원하는 형태로 인코딩 됩니다.

String databaseURL ="jdbc:mysql://localhost:3306/dbName?useUnicode=true&characterEncoding=UTF8";

4) 리눅스 원격접속 (SSH) 한글사용하기

ssh환경에서 한글파일에 대한 테스트를 진행하고자 했는데, 기본적으로는 사용할 수 없었습니다.
(타이핑해도 제자리에서 멤도는 그 현상..) 원격서버의 몇가지 설정을 변경해주고 나니 한글사용이 가능했습니다.

/etc/sysconfig/i18n

LANG="ko_KR.UTF-8"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"

/etc/vimrc
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$" 
set fileencodings=utf-8,euc-kr 
endif

/etc/bashrc

export LANG="ko_KR.UTF-8" 
export LC_ALL="ko_KR.UTF-8"

5) Mac에서 JDK 7.0을 사용할 경우, Unicode로 처리된 파일명을 읽지 못할경우

해당링크를 통해 확인할 수 있습니다 (http://www.slipp.net/questions/210)

6) Tomcat 환경에서 한글파일 생성하기. (질문드립니다.)

일반적인 자바프로젝트를 이클립스에서 작성하고, 실행하거나 Terminal에서 java컴파일 명령을 통해서 실행하거나,
두경우 모두 한글파일을 생성하는 경우에서는 별 이슈없이 원하는 CharacterSet으로 파일이나 디렉토리를 생성할 수 있었습니다.
하지만 tomcat을 이용하는 현재의 Spring 프로젝트는,
한글파일을 생성할 경우 파일제목이 글자수만큼 ?로 표기되는 현상이 일어납니다..
예를들어 자바지기.png를 만들면 ????.png로 보이는 것이지요. 시스템설정쪽은 확인해봤지만 UTF8로 잘 되어있습니다. 
톰캣프로젝트에서 실행할 경우에만 이런현상이 발견되는데... 비슷한 경험있으시다면 공유좀 부탁드리겠습니다!!!

import java.io.File;

public class KoreanTest {
  public static void main(String[] args) {
    File file1 = null;
    File file2 = new File("/Users/YOON-SUNG/Desktop/test/javajigi.png");
    
    try {
      
      file1 = new File( new String("/Users/YOON-SUNG/Desktop/test/자바지기.png".getBytes(), "UTF-8") );;


      System.out.println("file1 exists? : "+file1.exists());
      System.out.println("file2 exists? : "+file2.exists());      
      System.out.println("file1 create sucess? : "+file1.createNewFile());
      System.out.println("file2 create sucess? : "+file2.createNewFile());
      
      
      
      //file1.renameTo(new File( new String("/Users/YOON-SUNG/Desktop/test/정윤성.png".getBytes(), "UTF-8")));
      
    } catch (Exception e) {
      e.printStackTrace();
    }
    
    System.out.println("System File Encoding : "+System.getProperty("file.encoding")); //UTF8로 잘 표기됩니다.
  }
}

위 소스는 Tomcat프로젝트와 일반프로젝트에서 동일하게 테스트되었습니다.

(2014년 2월 4일 추가)

7) Spring에서 사용하는 JSON의 인코딩문제

Spring에서 JSON, 혹은 String 데이터를 View영역으로 전달할때, Ajax통신을 하는 과정에서 @ResponseBody 예약어를 사용했습니다. 
일반적으로 사용하는 MODEL 패턴을 사용할대는 객체안에 한글데이터를 담기 때문에 문제가 생기지 않지만,
브라우저를 통해 직접 데이터를 전달해주는 JSON방식에서는 한글이 깨졌습니다. 
이 문제는 아래의 소스코드와 같이 produces 항목에 charset을 지정해주게 되면, 해당 인코딩방식으로 데이터를 처리해서 전달시키게 됩니다.


@RequestMapping(value="/test/SelectTreeViewData", method=RequestMethod.GET, produces="text/plain;charset=UTF-8")
  public @ResponseBody String selectTreeViewJoinData() {
    
    List<TreeViewJoinData> data = treeViewDao.selectTreeViewData();
    Gson gson = new Gson(); //구글에서 제공되는 JSON Parsing라이브러리
    String result = gson.toJson(data); //JSON형태의 스트링값으로 변환.
    
    return result;
  }


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0
2012.06.02 21:52

java3d를 가지고 할게 생겨서 해보는 도중에 계속해서 문제가 생겼다...-_-


구조 파악하는데도 시간이 좀 걸렸지만 이 문제는 정말.....;;;


문제는 RestrictedAccessException 예외가 계속해서 발생하는것이다. 




이 예외는 언제 발생하냐면...


public class RestrictedAccessException

extends java.lang.RuntimeException

Indicates an attempt to access or modify a state variable without permission to do so. For example, invoking a set method for a state variable that is currently read-only.


권한이 없는데도 불구하고 접근하거나 수정하려고 할때 발생한단다(읽기 전용이라서..)...  그리고, 메시지에 보면, 


Group: only a BranchGroup node may be added


브랜치 그룹 노드만 추가될 수 있다...라는데.. 잉? 난 분명 BranchGroup 을 추가 했는데?????


열심히 구글링 해본결과, 이는 성능상의 이유로 컴파일 타임에 브랜치 그룹을 좀 다른 형태의(좀더 랜더링 하기 편한 상태로) 브랜치 그래프로 만든다고 한다. 그래서, 이를 추가하면 브랜치 그룹이 아니라고 하는것이고.....


뭐 성능상의 이유로 이렇게 한다니 뭐 어쩔 수 없다....가 아니라.. 역시 해결책은 있다.


해결책을 찾기 전에 구글링 해보니, setCapability 매서드로 여러가지 옵션을 넣어주는게 있었다. 하지만? 해봐도 소용이 없었다... 왜...왜...ㅠㅠㅠ



더욱 자세한 내막을(...?) 검색해보니, addChild 할때 브랜치그룹들이 컴파일 되는것 같았다. 따라서, addChild 하기 전에 그리기 작업을 해주고, 마지막에 addChild 로 루트 브랜치에 그려주기만 하면된다. 그런데... 여기서 문제가 발생한다. 


그런데, 저렇게 하려면, 새로운 브랜치 그룹을 만들고, 다시 붙이고 하는 작업을 해야하는데, 이는 메모리 낭비가 심해질 수도.... 따라서, 기존의 것은 재활용 하는 방안을 찾아야 한다. 


"? 그냥 붙였던거(addChild) 다시 떼고(detach), 다시 붙이면(addChild) 되잖아..."


그렇다;;;;;;걍 다시 떼어내고, 수정하고 다시 붙이면 된다..ㅋㅋㅋ


그래서 중요한 옵션이 ALLOW_DETACH 가 되겠다. 


<root>

    |

<sub>

    |

[shape]


<>는 브랜치 그룹

[]는 쉐이프.(사이에 트랜스폼그룹이 있어야 하는데, 편의상 생략..)

이렇게 구조가 형성되어 있다면, 


root에게 옵션으로 


rootgroup.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);

rootgroup.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);


sub에게도 옵션으로 


subgroup.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);

subgroup.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);

subgroup.setCapability(BranchGroup.ALLOW_DETACH);


를 주면 1단계는 완성!


이제, 런타임시에 그릴때엔...


먼저 시작될때 화면에 그렸다고 치자.


rootgroup.addChild(subgroup);


그다음, 저 서브그룹을 수정할 일이 생겼다!


subgroup.detach(); // 뗴어내기!


// 서브 그룹을 수정하기. <-- 뗴어내서, 수정가능한 상태이다.


rootgroup.addChild(subgroup); // 다시 붙이기.ㅋ





저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 7
  1. Favicon of http://www.jordan4fireredonline.com BlogIcon Jordan 4 Varsity Red 2012.07.24 10:26 신고 address edit & del reply

    http://www.jordan4fireredonline.com 이다. 다른 사람 이 많 아 질 수록 당신 을 전기 공급 을 열 고 닫 는 실제 스크린 에 대한 과잉 의 지방 aquiring 인쇄물 을 들 고 장거리 관리 다.그들 은 물론 원가 보다 非机动 유형 지만 뛰 어 난 부품 은 외부 천창 이다. http://www.jordan4fireredonline.com 이다.

  2. Favicon of http://ione.net/tin-tuc/showbiz/music/2012/07/32576-cong-ty-quan-li-to-nguoc-h.. BlogIcon Scandal hwayoung 2012.08.01 16:54 신고 address edit & del reply

    스캔들 hwayoung

    http://ione.net/tin-tuc/showbiz/music/2012/07/32576-cong-ty-quan-li-to-nguoc-hwayoung-an-va.html

  3. 2012.08.10 10:43 address edit & del reply

    비밀댓글입니다

  4. 2012.08.20 00:08 address edit & del reply

    비밀댓글입니다

  5. 2012.09.06 18:30 address edit & del reply

    비밀댓글입니다

  6. 2012.09.14 10:09 address edit & del reply

    비밀댓글입니다

  7. 2012.09.14 12:04 address edit & del reply

    비밀댓글입니다

2012.05.05 16:52

컴푸터에서 그래픽을 표시하기 위해서는 일정 시간마다 화면을 뿌려줘야 합니다. 움직임이 있을때는 더욱 그렇죠.


그런데, 이 화면을 갱신하다보면, 자주 있는 일이 화면이 깜박이는 현상(flickering)입니다.


이것은, 컴퓨터가 화면을 뿌리는것과, 화면이 그려주는것이 서로 동시에 이루어 져서 사실, 좌측 상단에서부터 차례로 그리는것인데, 인간의 눈으로 보면, 이것이 너무 빨리 되기 때문에, 아직 안그려진부분이 순식간에 채워져서 깜박이는것처럼 보이는것입니다. // 이에대한 생각은 틀릴 수 도 있지만, 제가 경험해본 바로는 이렇습니다.


처음에, C로 콘솔 테트리스를 짤때도 이것이 문제가 되었습니다. 매초마다 화면을 갱신하다 보니, 전체를 그리려면, 시간이 좀 걸렸고, 몇몇부분에서는(특히, 이전에 그려져있었던 장소에 또 다시한번 그리는바람에) 깜박임 현상이 생겼습니다. 그때는, 또 그려야 하는 부분을 검출해서, 해당 부분을 그리지 않고, 변동사항이 생긴 부분만 그렸습니다.

그래서 어느정도 이 현상을 해결했었죠.


요즘에 자바로 만드는데, 역시 이 깜박임 현상이 문제가 됩니다........


하지만, 자바는 우릴 버리지 않았습니다.ㅋ(응?)


기존 awt에서 없던 기능인 더블버퍼링을 손쉽게 구현해주는 기능이 swing에 생겼기 때문이죠!


본래, 더블 버퍼링을 구현하려면, 일단, 임시 버퍼에 모두 그리고 나서, 이 임시버퍼를 다시 본래화면표시용 버퍼에 그리는 방식으로 했었습니다. 이렇게 하면, 일단 paint()의 내부 로직이 더럽게 됩니다....


swing에서는 이 문제를 아주 쉽게 해결할 수 있도록, JFrame에서 지원해줍니다.


{

.

.

.

setResizable(false);

setVisible(true);


createBufferStrategy(2);

}


(set... 한 부분은 중요하지 않습니다. 단지, createBufferStrategy() 매서드의 호출 순서를 보여줄 뿐,,)


바로 저것이.... 더블 버퍼(이중 버퍼)를 만드는 매서드입니다.... 참 쉽죠잉.......-_-


그리고나서, 버퍼에 그림을 그려야하는데;;; 어디다 그리느냐?



Graphics2D g = (Graphics2D) jframe.getBufferStrategy().getDrawGraphics();


g.setColor(font_debug);

// 무언가 그린다.

g.dispose();


getMasterWindow().getBufferStrategy().show();



이상입니다..


JFrame 인스턴스로부터 BufferStrategy 를 가져오고, 이 버퍼전략(...)으로부터 그래픽인터페이스를 받아오면됩니다....


마지막으로, 화면에 출력하기 위해, show() 하면 끝......


더블버퍼 참 쉽죠잉;;;-_-















저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 3
  1. Favicon of http://estellenotes.tistory.com BlogIcon 에스텔시아 2012.05.12 19:37 신고 address edit & del reply

    Good! 오랫만에 올라오는 실용적인 글이다.

  2. Favicon of http://euro2012.vnexpress.net/ BlogIcon euro 2012 2012.05.30 19:40 신고 address edit & del reply

    모든 입력, 매우 도움이 흥미있는 정보를 주셔서 감사합니다

  3. 2012.06.12 14:44 address edit & del reply

    비밀댓글입니다

2012.04.05 23:17

한글을 분리해서 검색하는 것을 만들려고 예전 자료를 찾다가 귀찮아서 그냥 만들어 버림....;;

먼저, 여기 를 보시고... (한글 조합형 유니코드 설명 - 위키자료 긁어온것)

일단, 중요한 부분은 

한글 유니코드 = [{(초성)×588}+{(중성)×28}+(종성)]+44032

이것이다. 초/중/종으로 분리 하려면? 빼고 나누고, 모듈러 하면 끝이다...ㅋㅋ 

(588 = 28 * 21, 저 식은 다시, [{(초성)×21+(중성)}×28}+(종성)]+44032 가 되겠다.)


	public static String Han_UnicodeNumberToString(int[] s) throws IllegalArgumentException {
		if (s.length != 3) throw new IllegalArgumentException();
		s[0] -= 0x1100;
		s[1] -= 0x1161;
		s[2] -= 0x11a8;
		char c = (char) ((((s[0] * 588) + s[1] * 28) + s[2]) + 44032);
		return String.valueOf(c);
	}

	public static int[] Han_CharacterToIMFUnicode(char s) {
		int[] result = new int[3];
		int a = s - 44032;
		result[0] = 0x1100 + ((a / 28) / 21);
		result[1] = 0x1161 + ((a / 21) % 21);
		result[2] = 0x11a8 + (a % 28);
		return result;
	}


뭔가......음;; 뭐 이렇다. (네이밍 센스가 그지같다;;;;)


첫번째 메소드는, 배열을 하나 받아오는데, 반드시 길이가 3이어야 한다. (예외가 발생하면, 인자가 잘못되었다고 에러를 뿜는다.)

받아온 배열을 가지고, 한글 유니코드를 만들어 준다. (초성+중성+종성 을 합쳐서.)


두번째는, 어떤 캐릭터(되도록 한글이어야 하는데,,,예외 처리는 다음 시간에..ㅋㅋ)를 받아온뒤, 이걸 초성/중성/종성으로 분리해 준다. 


여기서 헷갈릴 수도 있는 부분이 있는데, 바로 종성이다.

우리가 흔히 생각할때 초성의 ㄱ 과 종성의 ㄱ이 같다고 생각하지만, 유니코드에서는 그렇지 않다. 예를들면, 초성으로 쓰일수 있는 ㄱ의 유니코드값은, 4352(0x1100)인데 반해, 받침(종성)으로 쓰이는 ㄱ의 유니코드값은, 4536이다.

또, 초성으로 쓰일 수 있는 문자는 19개지만, 받침으로 쓰일 수 있는 문자는 28개이다. (받침으로 ㄳ, ㅄ 같은게 있다....//ㅄ은 벼ㅇ시ㄴ의 줄임말로 쓴게 아니니 오해 마시길..ㅋ)

그래서, 만약 위 문제를 생각안하고 쓰게 되면, ? 를 얻게 될것이다...ㅠ 이거 뭐 나중에 예외 처리를 통해서 구분을 할 수 있도록 나중에 또 포스팅 하기로..


마지막으로, 구현하려던게, 초성 검색인데, 위 메소드들을 이용하면 간단히(?) 구현할 수 있다.

1. 입력받는것은 "ㅌㅅㅌㄹ"의 초성만 온다.

2. 검색할 대상이 되는 것들은 모두 조합된 한글이다.

* 숫자나 영어는 생각하지않고 오로지 한글 부분에대해서만 검색을 한다고 가정한다.


먼저, 검색할 대상이 되는것을 첫번째 글자를 뜯어와 초성을 가져온다.


String name = "티스토리";

int i = Han_CharacterToIMFUnicode(name.charAt(0))[0];


그런뒤, 입력받은 것에서 첫번째 글자를 뜯어와 유니코드로 변환후(타입을 char로 바꾼뒤, int로 캐스팅 하거나) 항등비교를 하면 되겠다.

(아직 테스트 해보지 않아서 되는지는 모르겠지만 이런식으로 하면 되겠다.)


이번 포스팅은 이정도로 하고,.. 총총총

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 2
  1. Favicon of http://www.olympic2012.vn/ BlogIcon olympic 2012 2012.04.27 17:34 신고 address edit & del reply

    그레이트 사이트 제안 및 모든 입력, 매우 도움이 흥미있는 정보를 주셔서 감사합니다.

  2. Favicon of http://www.tintucolympic.com/ BlogIcon olympic london 2012 2012.04.27 17:39 신고 address edit & del reply

    이 사이트를 찾기 위해 나는 매우 기쁘게 생각했습니다. 나는이 위대한 읽어 주셔서 감사 드린다! 이것은 매우 유익한 posat, 그것은 좀 더 도움이됩니다.

2012.02.06 02:29
요번에 하는 프로젝트가 안도르이드에서 txt 파일을 가져와서 읽고, 수정한뒤에 저장하는 기능이 있었는데요,

처음엔 엑셀로 구현해놨다가 바껴서 txt 로 읽고 쓰기로 했습니다. 

처음 생각과는 달리 상당히 어려웠습니다. 문제점으로 제일 큰게 인코딩(encode)이었습니다.

안에 있는 데이터엔 한글이 포함되어 있었습니다. 아무런 인코딩 없이 아래와 같이 불러왔을때 한글이 이상한 문자로 깨지는 현상이 생겼습니다. 마름모에 물음표가 들어있는.ㅋㅋ(위키에서 살펴보니, UTF에서 글자를 못찾으면(?) 저 문자로 대체되거나 무시된다고 하는군요)

FileReader fr = new FileReader(src);
BufferedReader br = new BufferedReader(fr);
String line;
data = new ArrayList<String>();
while ((line = br.readLine()) != null) {
	Log.e("Flask_input", line);
	data.add(line);
}
br.close();
fr.close();
문제점을 찾기엔 너무 오래걸렸습니다...ㅠㅠ 먼저 인코딩관련 자료를 찾아보니 자바스크립트에서는 아주쉽게 http디코더였나? 에서 변환해주더군요.

일단 억지로 인코더/디코더 코드를 구해서 적용시켜봤지만, 인터넷 주소에서 쓰이는 %EF%AE%D6 뭐 이런 퍼센트가 들어가있는 문자가 나왔습니다...ㅠㅠ

다시 찾아보니, 이걸다시 변환해줘야;;;;;; 하지만 이게 원천적으로 문제를 해결할 수 없다는것을 깨닫고 다시 구글링을 했습니다.

그래서 구한게 파일을 읽어올때 바이트 코드로 읽는데, 여기에 인코딩해논것으로 읽어오기! 입니다.

File file = new File(src);
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
String line;
data = new ArrayList<String>();
while ((line = br.readLine()) != null) {
	Log.e("Flask_input", line);
	data.add(line);
}
br.close();
하지만,,,,,가끔 안되는게 있더군요.,.. 그래서 저기 UTF-8 로 되있는것을 EUC-KR로 바꿔보기도 하고 별의별 뻘짓을 해봤지만 아직 해결법은 못찾았습니다. (일단은 저 코드는 동작하는것 같습니다.)

뭐 여기까진 문제가 없었습니다. 그다음 txt에서 한줄을 읽고, 이걸 분해 하려고 substring() 를 사용했습니다.

그런데 이상한 현상이 생깁니다. 바로, subsitrng() 로 얻어온 문자열이 눈으로 볼땐 길이가 7인데, .length()찍어보면 8입니다....엉? 뭐야?

어....음.....머지.......................

하다가, 생각난 charAt()으로 해당 문자열 각각의 문자를 다 찍어보기로 합니다... 찍어보니, 맨 앞 자리가 아무것도 안나옵니다.... 아 뭐야;; 공백 문자인가...해서 int로 캐스팅하고 숫자를 찍어보니 65279 가 나왔습니다....ㅋㅋㅋㅋㅋㅋ아 뭐야.ㅋㅋㅋㅋ 이 숫자는 뭘 의미하는거야.ㅋㅋㅋㅋㅋㅋ

뭐 일단 char는 유니코드를 받으니, 16진수로 변환! 65279 -> 0xFEFF

저 16진수를 찾아보니 텍스트의 파일시작에서 '유니코드' 라고 말해주는 녀석이었습니다.

Big-endian : 0xFEFF
Little-endian : 0xFFFE

이라고 하는데, 자세한건 http://hyyoo.egloos.com/2273029 를 참고....

뭐 어쨋든, 파일의 첫 부분이 저 코드로 시작해서 첫줄의 인덱스가 하나씩 밀려서 글자 하나가 짤리게 되는 현상을 낳았네요....

드디어 문제를 해결하고... 이제 자러갑니다ㅠㅠ

+ 2012-2-7 관련 내용 추가

txt 파일을 출력하면 newLine()이 잘 안될때가 생기네요..

파일에서 맨 앞으로 가라는 CR(Carrge return) 과 다음 줄로 가라는 LF(Line Feed) 를 이용하여 엔터효과를 낼 수 있습니다.

 먼저 여기서 중요한 것이  LF 바로 개행 문자입니다.

아스키코드표에서 보면, 16진수 0x000A  가 개행문자입니다.

여기서 개행문자를 어떻게 주느냐?? 바로 케릭터 타입에담고, 줄 뒤에 붙여서 보내주면 됩니다! 참 쉽죠?

하지만 여기서 문제가 발생합니다. 바로 저 개행문의 유니코드값 '\u000a' 가 케릭터 타입에 안들어갑니다.
(\ 는 역 슬래시 입니다, 넣으려고 하면 오류를 보여줍니다.)

엥? 이게 무슨 소리야? 분명,  char a = '\u005a'  이런건 들어가는데?

찾아보니, 저것이 개행문자로 등록되어 있어서 넣을수(?) 없다느군요? 자세한건 나중에 추가하기로 하고...

그럼 이넘을 어떻게 넣어주느냐?  그냥 16진수 넣듯이 넣어주면 됩니다. 아래처럼 말이죠.
(자바에선  char 은 문자 지만, 숫자 값도 넣을 수 있습니다.)

 char a = 0x000A;

 그러면 정상적으로 들어가고

 String s = "hello world"+a;

 로 해주면 정상적으로 되는것을 확인하실수 있습니다.

자바에서 파일을 쓸때, 아니 윈도우에선 유닉스에서 만든  txt 파일들 가져오면  LF 가 짤려서 나온다고 합니다.
그래서 한줄한줄들이 장인의손길(?)에 의해 한땀한땀 이어진것을 보실수 있게 되는거죠.

의문이  생기는 것이  newLine() 를 해줬음에도 불구하고 개행이 안된다는 점입니다.

자바는 모든 플렛폼에서 구동되도록 설게되엇는뗴 말이죠, 그래서 각  OS 마다 다르게 내부적으로 적용(?)




저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 1
  1. Favicon of http://heather-hm.tistory.com BlogIcon HeatherHM 2015.02.11 22:59 신고 address edit & del reply

    댓굴 처음달아보네요 ㅋㅋ
    좋은글 감사합니다. 저도 똑같은 문제로 헤메고있었는데 마침 좋운글 잘 보고갑니다 ^^

2012.01.13 16:07
전에 만들었던  (2012년 첫글은!?) [Blur] 블러 구현(java)2을 3D로 구현해 보았습니다.

3D는 처음 만져보지만 상당히 재밌군요..ㅋㅋ 특히 사용되는 수학들이 ㄷㄷㄷ
 

위 사진들은  모두 똑같은 모습을 카메라 돌려가면서 촬영한것입니다. (파티클갯수 약 64000개)
(잘 보면 호 모양으로 그려진것을 볼 수 있는데, 이건 카메라가 자동으로 회전해서 블러효과가 누적되 나온 궤적입니다. 원래 이거(궤적)때문에 블러를 공부했던.....ㅋㅋ)

은하(...) 만들어 볼려고 파티클을 평면으로 뿌리고, 각각의 속도 벡터만 3차원으로 줬는데 원하는 결과가 잘 안나오네요...
(예상한 모양은 중앙에가 볼록나온... 실제 은하사진들을 보니 가운데에 엄청 큰 태양 또는 블랙홀같은게 있어서 환하게 빛나서 그부분이 볼록한것 같네요..?)

아무래도 안에 핵이 있어야 구현될듯 합니다.

각 파티클이 질량을 갖고 서로 인력으로 끌어당기는 효과에, 파티클이 뭉치도록해서 하나의 행성 덩어리(?)를 만들 수 있도록 하고싶은데, 컴터가 못버텨줄것 같아 포기합니다..ㅋ
(이전에 서로 인력으로 끌어당기게 해봤었는데 원하는 결과가 안나옵니다...ㅠㅠ 서로 뭉치려다가 인력이 너무 세져버려서 서로 다시 날라갑니다...ㅠㅠ)
 
 카테고리가 Useful 인만큼, 뭔가 도움될만한 내용은 다음 포스트에 적도록 하겠습니다.
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 5
  1. Favicon of http://estellenotes.tistory.com BlogIcon 에스텔시아 2012.01.15 11:17 신고 address edit & del reply

    Good. 멋있다.

  2. volumeless 2012.01.18 11:01 신고 address edit & del reply

    입자들이 가까워지면 부딪혀서 멈춰야 하는데 충돌 없이 가속 시뮬레이션만 하기 때문에 뭉칠 수 없는 것 같습니다

  3. Favicon of http://datvo.com/Dich-vu-bao-ve.html BlogIcon bao ve 2012.01.19 18:47 신고 address edit & del reply

    고마워요, 좋은 하루 소원

  4. Favicon of http://creatordev.tistory.com BlogIcon [Noa] 2012.01.21 09:31 신고 address edit & del reply

    뭐야 저거 무서워

  5. Favicon of http://www.danhtiengphat.com.vn/ BlogIcon van phong pham 2012.01.30 14:38 신고 address edit & del reply

    나는 이러한 놀라운과 뛰어난 사이트를 방문하는 것은 매우 기쁘게 생각합니다, 나는 완전히 그것을 즐겼다.

2012.01.11 00:11
이전에 FlashDevelop 이란 AS3.0 코딩툴을 써서 그런지 정말 편했던 기능 두가지가 있었습니다.

하나가 바로 수식(표현식)입력시에 연산자사이에 자동로 공백을 넣어주는 기능입니다!

다른 하나는 휠로 글씨 크기 조절.... 작은 것들이지만 너무 편했다고 생각합니다. 특히 글씨 크기 조절같은경우는 웹상에서도 휠로 글씨 크기를 조절할 수 있기에 동일한 사용자 경험을 제공해 좋은 방법인것 같네요.
(뭐 아직 글씨크기에 대한 불만은 없으니.,,, 넘어가도록하고,ㅋ)

오랜만에 이클립스를 켜서 3차원상의 점을 2차원에 보여주도록 할려고 Perspective Projection을 공부하고 있었습니다.

그런데 수식이 엄청 깁니다..ㅠㅠ


;;;;;;아;;;;;;뭔가 치환해서 사용하면 괜찮을것 같은데;; 일단은 귀찮아서...대충 적어보기로 했습니다.

d.x = cosy*(sinz *(y - camPos.y)+cosz*(x-camPos.x))-siny*(z-camPos.z);
d.y = sinx*(cosy*(z-camPos.z)+siny*(sinz*(y-camPos.y)+cosz*(x-camPos.x)))+cosx*(cosz*(y-camPos.y)-sinz*(x-camPos.x));
d.z = cosx*(cosy*(z-camPos.z)+siny*(sinz*(y-camPos.y)+cosz*(x-camPos.x)))-sinx*(cosz*(y-camPos.y)-sinz*(x-camPos.x));

적다보니 너무 길어저버린 식;;;; 이러면 가독성이 너무 떨어지죠...ㅠㅠ
 
전에 쓰던 FD에서는 세미콜론을 붙이면 자동으로 연산자 앞뒤에 공백을 넣어줍니다.  그러니까.....
d.x = cosy * (sinz * (y - camPos.y) + cosz * (x - camPos.x)) - siny * (z - camPos.z);
d.y = sinx * (cosy * (z - camPos.z) + siny * (sinz * (y - camPos.y) + cosz * (x - camPos.x))) + cosx * (cosz * (y - camPos.y) - sinz * (x - camPos.x));
d.z = cosx * (cosy * (z - camPos.z) + siny * (sinz * (y - camPos.y) + cosz * (x - camPos.x))) - sinx * (cosz * (y - camPos.y) - sinz * (x - camPos.x));

넘어가 버렸네요..ㅋㅋ 

이렇게 되면 비록 식은 길지만, 전보다 훨씬! 읽기가 수월해 집니다. (뭐 길어서 복잡한건 마찬가지지만..ㅋㅋ) 

이게 이클립스엔 없을까... 생각하다가 이 기능이 없으면 이클립스를 버릴(..까진 아니고..) 까도 생각해보고...

일단 구글링을 열심히 해본 결과 힌트를 얻을 수 있었습니다.
 

당연히 코드 포멧에 관련한 내용이니, 들어가 봅니다.ㅋ

그때 항상 지나쳤던 프로파일 [편집]이 눈에 들어옵니다... 왜 이걸 지나쳤는지.....ㅠㅠ

안에 보니 


분명! 2항 연산자의 앞뒤에 공백을 넣어줍니다! 분명 기능에 있다는 거죠..

그런데 왜 자동으로 안되나.. 했더니 이게 단축키로 지정되어 있었습니다......ㅋㅋ



단축키에서 검색하니 


[Ctrl + Shift + F] 로 지정되어 있습니다.ㅋ

해보니 동작은 합니다만,,, 수식이 워낙 길어서 짤린부분은 자동으로 또다시 개행되네요....-_- 이건 뭐;;
(물론 짧은건 한줄도 됩니다;;;)

뭐 이건 자동개행 될때의 범위를 지정해주면 되니...


최대 행 너비에 기본값 40을 400으로 해주고 해보니 긴 수식도 한줄로 포멧팅 됩니다..ㅋㅋ

(다들,,,아시는내용인가.......그런데 왜 검색은 잘 안되지..ㅋㅋ) 
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 1
  1. Favicon of http://ianuarias.tistory.com BlogIcon Ianuarias 2012.01.12 23:05 신고 address edit & del reply

    그냥 수동으로 띄어쓰기를 했기떄문에...



티스토리 툴바