Translate

2014년 8월 28일 목요일

안드로이드,ios 이모티콘(emoji)과 MySQL charset 문제


앱 서버를 관리하면서 큰문제가 닥쳐왔다.
문제는 일반 문자형태로 저장하는 컬럼에 사용자들이 입력을 하면서 안드로이드 킷캣부터 지원하는 이모티콘을 넣기 시작한것이였다.
이모티콘을 넣다보니 서버에서는 에러가 나고 어플은 작동을 하지않자 그냥 꺼버리는 시나리오가 나타나기 시작하는 것이였다. 그 결과 데이터가 꼬이는 현상이 일어났다....ㅜㅜ
그래서 엄청난 검색결과 뭐 utf8em4 ? 란 문자셋으로 바꾸라는데 .. 운영중인 서버의 문자셋을 바꾼다는건 위험한 일이라고 판단했다. 그래서 방법이 없을까.. 싶던참에 어떤분이 이미 해결하신 내용이 있었다.

http://100dream.tistory.com/6
이분 글인데 난 일단은 빠르게

 MySQL 5.1 유지하면서 해당 컬럼을 VARBINARY로 변환하고, SELECT 시 CAST(%컬럼명% AS CHAR(사이즈) CHARSET UTF8) 형태로 조회


2014년 7월 18일 금요일

java - 정규식

Happy learning Java Regular Expression :)

java - ip주소를 이용해서 위치 찾기

위치 정보
이 예제에서, 우리는 어떻게 IP 주소를 사용하여 위치 (국가, 도시, 위도, 경도)를 발견하는 방법을 보여줍니다.

1. GeoLite 데이터베이스

를 MaxMind는 무료 GeoLite 데이터베이스 (위치에 IP 주소)를 제공합니다.
  1. 무료 GeoLite 무료 데이터베이스를 얻을 - 여기
  2. - GeoIP 클라이언트 자바 API를 바로 여기
  3. 코드보기를 시작합니다.

2. GeoLite 자바 예

IP 주소를 이용하여 위치를 찾을 수 있도록 GeoIP 클라이언트 자바 API를 사용하는 예.
GetLocationExample.java
package com.mkyong.analysis.location;
 
import java.io.File;
import java.io.IOException;
import com.maxmind.geoip.Location;
import com.maxmind.geoip.LookupService;
import com.maxmind.geoip.regionName;
import com.mkyong.analysis.location.mode.ServerLocation;
 
public class GetLocationExample {
 
  public static void main(String[] args) {
 GetLocationExample obj = new GetLocationExample();
 ServerLocation location = obj.getLocation("206.190.36.45");
 System.out.println(location);
  }
 
  public ServerLocation getLocation(String ipAddress) {
 
 File file = new File(
     "C:\\resources\\location\\GeoLiteCity.dat");
 return getLocation(ipAddress, file);
 
  }
 
  public ServerLocation getLocation(String ipAddress, File file) {
 
 ServerLocation serverLocation = null;
 
 try {
 
 serverLocation = new ServerLocation();
 
 LookupService lookup = new LookupService(file,LookupService.GEOIP_MEMORY_CACHE);
 Location locationServices = lookup.getLocation(ipAddress);
 
 serverLocation.setCountryCode(locationServices.countryCode);
 serverLocation.setCountryName(locationServices.countryName);
 serverLocation.setRegion(locationServices.region);
 serverLocation.setRegionName(regionName.regionNameByCode(
             locationServices.countryCode, locationServices.region));
 serverLocation.setCity(locationServices.city);
 serverLocation.setPostalCode(locationServices.postalCode);
 serverLocation.setLatitude(String.valueOf(locationServices.latitude));
 serverLocation.setLongitude(String.valueOf(locationServices.longitude));
 
 } catch (IOException e) {
  System.err.println(e.getMessage());
 }
 
 return serverLocation;
 
  }
}
Output
ServerLocation [countryCode=US, countryName=United States, region=CA, 
 regionName=California, city=Sunnyvale, postalCode=94089, 
 latitude=37.424896, longitude=-122.0074]
출처 - http://www.mkyong.com/java/java-find-location-using-ip-address/

텍스트 로고 만들어주는 사이트

출처 : http://www.ppomppu.co.kr/zboard/view.php?id=etc_info&no=8003 ]

< 초급. 간단하게 제작 가능하지만, 커스터마이징이 제한적임 >

1. 구글, 야후 스타일 로고 제작 : http://youfiles.net/logo/ 
- 가보시면 아시겠지만, 굉장히 심플한 스타일의 로고 제작 사이트입니다. 구글의 인터페이스로 되어 있죠. 중앙 부분에 보면 야후, 구글, 플리커 스타일 중에서 하나를 고를 수 있고 숫자와 영문에 한해서 입력을 받아서 각각의 스타일에 맞춰서 로고를 만들어 줍니다. 잘 만들면 깔끔의 극치를 달릴 수 있죠. 이보다 조금 더 다양한 스타일을 원하신다면, 중앙 하단 부분에 "더 다양한 로고 만들기"라는 링크를 클릭하면 좀 더 다양한 스타일이 있는 사이트를 방문할 수 있습니다. 잠시 봤는데 이 쪽은 좀 그로테스크한 스타일이 많아서 -_-; 

2. 팝스질 닷 컴 : http://poshopzil.com/Logo_Generator/ 
- 원래 이런 스타일의 로고를 부르는 단어가 있는데, 까먹었습니다. -_-; 여튼, 가보시면 아시겠지만 파스텔 톤의 색상을 활용해서 총 5가지 종류의 깔끔한 로고를 만들 수 있는 곳입니다. 이 쪽도 기본적으로는 텍스트(한글 불가)를 입력하고 하단에 제시된 5가지 스타일 중의 하나를 고를 수 있는 곳입니다. 위에 설명한 구글, 야후 스타일 보다는 예쁩니다만, 제공도는 스타일이 5가지 밖에 없다는게 좀 아쉽죠. 그래도 좀 예쁜 편이라 학교 다닐때 팀프로젝트 하면서 로고만들때 자주 사용하던 사이트 중에 하나입니다. :) 



< 중급. 커스터마이징이 거의 모든 부분에 대해서 가능하지만, 제작이 좀 복잡하고 귀찮음 >

1. 쿨~ 텍 : http://cooltext.com/ 
- 저도 사용은 안해보고 사이트 즐겨찾기만 해놨던지라 설명이 좀 부족할 수 있습니다. 방금 사용해 봤거든요; 사이트에 접속하면 중앙 부분에 다양한 스타일의 로고가 있습니다. 맘에 드는 로고를 클릭하면, 예시 로고가 확대되어서 상단에 나타나면서 제작 툴이 나타납니다. 여기서 텍스트를 입력하고, 폰트와 크기 그리고 배경 이미지 혹은 배경색을 고를 수 있습니다. 제작 후의 포맷까지도 설정할 수 있죠. 이 사이트는 한글을 지원합니다. 

2. 이미지 툴 : http://imagetool.programar.net/ 
- 2번 스타일에 가까운 로고를 만들어 줍니다. 스타일은 한가지 밖에 안되고, 폰트도 쿨 텍에 비해서 6가지만 지원합니다만 (쓸만한 폰트로만 구성되긴 했습니다만;) 제한적으로 심볼을 붙일 수 있고, 거울에 반사된 듯한 스타일의 로고를 만들어 주기에 희귀성을 가집니다. 보시면 아시겠지만, 잘만 만들면 정말 예쁠 스타일의 로고를 만들 수 있습니다! 전 귀찬아서 한번도 안 만들어 봤지만.. -_-; 



< 고급. 풀 커스터마이징이 가능하나 유료이거나 프로그램 설치 필요 >

1. 명함까지 제작되는 사이트 : http://www.logoyes.com/logocreator.php
- 플래쉬로 제공되는 로고 제작 사이트입니다. 사용해 보시면 아시겠지만, 고급 카테고리로 분류된 만큼, 정말 모든 부분에 한해서 커스터마이징이 가능합니다. 사이트 자체가, 산업용 로고를 만드는 것을 목표로 하는지라 제공되는 스타일들의 퀄리티는 정말 최고입니다. 로고를 다 만들고 난 뒤에는, 로고를 활용한 '명함'도 제작이 가능합니다. :) 앞서의 사이트 들과는 달리 단순 로고 제작이 아니기에, 사용방법이 좀 복잡하고 최종적으로 명함까지 다 만들고 그 명함을 실제로 사용하라고 하면 돈을 내라고 합니다. 하지만, 어차피 우리의 목적은 명함이 아니라 닉콘 혹은 로고이기에 다 만들고 난 뒤에 해당 페이지를 캡쳐 한다거나 하는 방법으로 무료로 사용이 가능합니다. -_-; 

2. GIMP : http://teamblog.joinc.co.kr/yundream/115 
- 상단에 보면 제가 업로드 시킨 프로그램이 있는데, 프로그램을 이용해서 제공되는 로고 전문 제작 프로그램입니다. 이 프로그램에 대한 자세한 설명은 링크를 따라가서 보시는게 더 나을거 같네요. 잘 설명해놓은 사이트가 있어서 링크 붙여 놓습니다. :)
- 파일 업로드 시킬려고 했더니 용량이 15Mb라서 안되는 군요. 이 프로그램을 써보고 싶으신 분은, 링크 따라가서 한번 구경해 보시고, 저에게 쪽지로 메일 주소 주시면 메일로 보내드리겠습니다. 혹시나 싶어서 이야기 드리지만, 32Bit 윈도우 용입니다. 64Bit용인 경우에는 아예 다른 링크가 존재하니까 혹시 64Bit인 경우에는 꼭 먼저 이야기 해주세요. :) 

Java에서 XML 파일을 읽는 방법 - (DOM 파서)


다음 방법을 통해 자바에서 XML 파일을 읽는 방법을 보여줄 예제입니다 DOM XML 파서가 . DOM 인터페이스를 이해하고 사용하기 쉬운 XML 파서입니다. 그것은 쉬운 탐색이나 조작을위한 객체로 모델링, 전체 XML 문서를 메모리에 그 파일을로드를 구문 분석합니다.

참고
DOM 파서는 천천히하고 데이터가 많이 들어있는 XML 문서를로드하는 경우 많은 메모리를 소모합니다. 그것을 솔루션으로 SAX 파서를 고려하십시오, SAX가 DOM보다 빠르고 적은 메모리를 사용하는 것입니다.

1. DOM 파서의 예

DOM XML 파서는 XML 파일을 읽고 아래의 각 요소에게 하나씩 출력하면된다.


File : file.xml
<?xml version="1.0"?>
<company>
 <staff>
  <firstname>yong</firstname>
  <lastname>mook kim</lastname>
  <nickname>mkyong</nickname>
  <salary>100000</salary>
 </staff>
 <staff>
  <firstname>low</firstname>
  <lastname>yin fong</lastname>
  <nickname>fong fong</nickname>
  <salary>200000</salary>
 </staff>
</company>
File : ReadXMLFile.java – A Java class to read above XML file.
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
 
public class ReadXMLFile {
 
 public static void main(String argv[]) {
 
   try {
 
  File fXmlFile = new File("c:\\file.xml");
  DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
  DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
  Document doc = dBuilder.parse(fXmlFile);
  doc.getDocumentElement().normalize();
 
  System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
  NodeList nList = doc.getElementsByTagName("staff");
  System.out.println("-----------------------");
 
  for (int temp = 0; temp < nList.getLength(); temp++) {
 
     Node nNode = nList.item(temp);
     if (nNode.getNodeType() == Node.ELEMENT_NODE) {
 
        Element eElement = (Element) nNode;
 
        System.out.println("First Name : " + getTagValue("firstname", eElement));
        System.out.println("Last Name : " + getTagValue("lastname", eElement));
               System.out.println("Nick Name : " + getTagValue("nickname", eElement));
        System.out.println("Salary : " + getTagValue("salary", eElement));
 
     }
  }
   } catch (Exception e) {
  e.printStackTrace();
   }
  }
 
  private static String getTagValue(String sTag, Element eElement) {
 NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
 
        Node nValue = (Node) nlList.item(0);
 
 return nValue.getNodeValue();
  }
 
}

2. Result

Root element :company
-----------------------
First Name : yong
Last Name : mook kim
Nick Name : mkyong
Salary : 100000
First Name : low
Last Name : yin fong
Nick Name : fong fong
Salary : 200000

Java에서 XML 파일을 읽는 방법 - (SAX 파서)


SAX 파서가 DOM 파서와 다르게 작업이며, 그것은 어느 메모리에 어떤 XML 문서를로드하거나 XML 문서의 오브젝트 표현을 만듭니다. 대신, SAX 파서 사용 콜백 함수 ( org.xml.sax.helpers.DefaultHandler 까지)는 XML 문서 구조의 클라이언트를 알려줍니다.
SAX 파서는 신속하고 사용  DOM 파서보다 더 메모리.
다음 SAX 콜백 메서드를 참조하십시오 :
  • (startDocument) 과 endDocument () - 메서드는 XML 문서의 시작과 끝에했다.
  • startElement () 및 endElement () - 문서 요소의 시작과 끝에 불리는 방법.
  • 문자 () - XML 문서 요소의 시작과 끝 태그 사이에 텍스트 내용을 불리는 방법.

1. XML 파일

간단한 XML 파일을 만듭니다.
<?xml version="1.0"?>
<company>
 <staff>
  <firstname>yong</firstname>
  <lastname>mook kim</lastname>
  <nickname>mkyong</nickname>
  <salary>100000</salary>
 </staff>
 <staff>
  <firstname>low</firstname>
  <lastname>yin fong</lastname>
  <nickname>fong fong</nickname>
  <salary>200000</salary>
 </staff>
</company>
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
public class ReadXMLFile {
 
   public static void main(String argv[]) {
 
    try {
 
 SAXParserFactory factory = SAXParserFactory.newInstance();
 SAXParser saxParser = factory.newSAXParser();
 
 DefaultHandler handler = new DefaultHandler() {
 
 boolean bfname = false;
 boolean blname = false;
 boolean bnname = false;
 boolean bsalary = false;
 
 public void startElement(String uri, String localName,String qName, 
                Attributes attributes) throws SAXException {
 
  System.out.println("Start Element :" + qName);
 
  if (qName.equalsIgnoreCase("FIRSTNAME")) {
   bfname = true;
  }
 
  if (qName.equalsIgnoreCase("LASTNAME")) {
   blname = true;
  }
 
  if (qName.equalsIgnoreCase("NICKNAME")) {
   bnname = true;
  }
 
  if (qName.equalsIgnoreCase("SALARY")) {
   bsalary = true;
  }
 
 }
 
 public void endElement(String uri, String localName,
  String qName) throws SAXException {
 
  System.out.println("End Element :" + qName);
 
 }
 
 public void characters(char ch[], int start, int length) throws SAXException {
 
  if (bfname) {
   System.out.println("First Name : " + new String(ch, start, length));
   bfname = false;
  }
 
  if (blname) {
   System.out.println("Last Name : " + new String(ch, start, length));
   blname = false;
  }
 
  if (bnname) {
   System.out.println("Nick Name : " + new String(ch, start, length));
   bnname = false;
  }
 
  if (bsalary) {
   System.out.println("Salary : " + new String(ch, start, length));
   bsalary = false;
  }
 
 }
 
     };
 
       saxParser.parse("c:\\file.xml", handler);
 
     } catch (Exception e) {
       e.printStackTrace();
     }
 
   }
 
}
Result
Start Element :company
Start Element :staff
Start Element :firstname
First Name : yong
End Element :firstname
Start Element :lastname
Last Name : mook kim
End Element :lastname
Start Element :nickname
Nick Name : mkyong
End Element :nickname
Start Element :salary
Salary : 100000
End Element :salary
End Element :staff
Start Element :staff
Start Element :firstname
First Name : low
End Element :firstname
Start Element :lastname
Last Name : yin fong
End Element :lastname
Start Element :nickname
Nick Name : fong fong
End Element :nickname
Start Element :salary
Salary : 200000
End Element :salary
End Element :staff
End Element :company
경고 이 예제는 것은 ​​예외가 발생할 수 있습니다 UTF-8로 XML 파일을,에 대해이 문서를 참조하십시오 SAX로 XML 'UTF-8 "파일을 읽는 방법

JSP trimDirectiveWhitespaces 공백처리

데이터를 콤보박스에 바인딩했을때 알수없는 공백이 들어간 경우가 있었다. 그럴때

JSP 상단에 아래와 같이 선언하면 공백을 없앨수 있다!

'KISTI와 함께 하는 슈퍼컴 이야기' 시리즈 보기

'KISTI와 함께 하는 슈퍼컴 이야기' 시리즈 보기 (1/5)

롤 접속 확인 어플



롤 아이디를 검색하여 게임중인지 아닌지만을 검색해주는 간단한 어플입니다.

개인의 편의상 재미 삼아 op.gg 와 kr.wastedonlol.com 사이트를 이용해서 제작해 보았습니다.

압축파일안에 apk가 들었습니다.

APK다운로드