금요일, 1월 23, 2015

올챙이에 excel 파일 업로드 하기

1. 파일을 구글 드라이브로 업로드 합니다. -> csv 로 저장합니다. (excel에서 csv 파일로 변환하면 한글이 깨집니다.)
저장하실때 ,(쉼표)로 구분자를 사용하세요.


2. 위의 첨부한 이미지 처럼 테이블에 업로드 할 컬럼 이름을 수정합니다. (3번의 생성하려는 컬럼명과 같게요)

3. pgsql 의 테이블을 생성합니다.
CREATE TABLE h_20150102 ( 
    code  character varying(10) not null, 
    sido  character varying(32) , 
    gungu  character varying(256) , 
    dong  character varying(256)  ,
    create_date  character varying(8),
    expire_date character varying(8) 
    ,CONSTRAINT h_20150102_pkey PRIMARY KEY ( code) 
  );

4. 올챙이에서 csv 파일 업로드를 선택합니다.

​5. 위에서 생성한 테이블명과 파일을 업로드 합니다.

6. import 를 클릭하시면 파일이 업로드 되어 있을거에요.

7. 확인은 select * from h_20150102 로 하시면 다음과 같이 되어 있습니다. 


목요일, 1월 22, 2015

Spatial DB Manager 개발기 2탄(MSSQL 편)

전편에 쓴 Spatial DB Manager 편(http://hangumkj.blogspot.kr/2015/01/spatial-db-manager.html)에 이이서

이번편은 MSSQL을 어떻게 확장했는지 설명 하도록 하겠습니다.
테스트 된 디비는 MSSQL Server 2008 버전 이구요.

- 해당 디비가 공간 정보를 가지고 있는 지는 다음의 쿼리를 통해 확인 할 수 있습니다.
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_CATALOG = '" + userDB.getDb() + "'
and DATA_TYPE like 'geo%'
해당 쿼리를 조회하면 어떤 스키마의 어떤 테이블, 컬럼이 공간 정보인지 볼수 있습니다.

메인 에디터에서 쿼리 결과를 조회해서 지도에 표시하는 다음과 같습니다.
지도는 Leaflet.js를 사용하고, Leaflet.js는 GeoJson을 사용하므로, 쿼리의 결과를 GeoJson으로 바꾸어야 할 필요가 있습니다.
MSSQL은 불행하게도 geojson으로 변환할수 있는 함수가 존재하지 않습니다.   그래서 WKT(컬럼명.STAsText())로 쿼리해 와서 외부 유틸을 통해서 GeoJson으로 바꾸어야 합니다.

mssql 의 공간 정보 처리는 다음(http://msdn.microsoft.com/en-us/library/bb933790.aspx)으로 확인하세요. 

여기 까지 배경 설명이었구요.
그럼, 올챙이에서 사용자가 쿼리를 하면 올챙이는 쿼리 중에 공간 컬럼이 있는지 알아야 하구요.  컬럼의 데이터를 얻어와서 데이터 타입이 공간 컬럼이면 서브 쿼리를 만들었습니다.
TADPOLESUB.%s.STAsText() as " + PublicTadpoleDefine.SPECIAL_USER_DEFINE_HIDE_COLUMN + "%s
이런식으로 서브 쿼리를 만들어서 보여주는 것이지요. (이전 화에서 소개해 드린 postgis도 같은 방법입니다.)

그래서 공간 컬럼을 wkt로 가져와서 GeoTools의 서브 프로젝트인 jts 라이브러리를 이용하여 wkt를 geojson으로 바꾸었습니다.
해당 소스와 진행 사항은 https://github.com/Gaia3D/SpatialDataManager를 통해 계속 보실수 있습니다.

월요일, 1월 19, 2015

mysql 모니터링 시스템 1/6

3일간  mysql 모니터링 시스템 만들기 12시간 후

주요한 항목으로 놓고...
  • 실시간 모니터링은 탐지 후 즉각알림이 중요하고(than 시각화). 통합툴의 모니터링은 추세 통계의 시각화가 더 중요할거 같습니다. 전자는 개발자들이 어떻게든 커버하는데 후자가 어렵습니다. 하루동안 언제 슬로쿼리가발행했는지... 매일의 기록을 잘 보여준다면 인사이트를 줄 수 있겠죵


모니터링 항목으로는 다음과 같습니다.
  • 세션리스트
  • slow query(table only)
  • query monitoring
  • io, connection, process
단서) slow query, query monitoring 은 로그가 테이블에 있어야 합니다. 

전체기능은 다음과 같습니다.
  1. 그래프로 보여준다. 
  2. 세션리스트, slow query가 ?(3)초 이상일 경우 
  • 관리자에게 메일보내기
  • 해당 쿼리 저장
우선 데이터를 가져오는 쿼리는 다음과 같습니다. 
-- profile
select * from mysql.general_log ;

-- slow 
select * from mysql.slow_log order;

-- SHOW FULL PROCESSLIST
SHOW FULL PROCESSLIST;

-- CPU
-- DISK, File I/O

-- http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html
-- http://dev.mysql.com/doc/refman/5.0/en/show-status.html

-- connection
SHOW STATUS WHERE `variable_name` = 'Connections';
-- process 
SHOW STATUS WHERE `variable_name` = 'Threads_connected';

-- Network I/
SHOW STATUS WHERE `variable_name` = 'Bytes_received';
SHOW STATUS WHERE `variable_name` = 'Bytes_sent';

-- querys
SHOW STATUS WHERE `variable_name` = 'Queries';

전체 구조는

  1. 데이터 가져오는 것은 기존의 스케줄 기능을 확장(Quartz)
    1. 스케줄 항목에 어떤 데이터는 어떻게의 후속 과정을 넣을 수 있도록 확장
      예를 들어 경고 값이 어떤 것일 경우에 후속 과정을 수행해라라거나...
  2. 데이터 가져와서 캐쉬 엔진에 제일 마지막 데이터를 넣어 놓고(Guava cache)
  3. 차트에서는 캐쉬의 제일 마지막 데이터만 사용하도록 합니다. (D3.js)
  4. 올챙이 화면은 monitoring perspective를 만들..

금요일, 1월 09, 2015

Spatial DB Manager 개발기

올챙이는 웹브라우저에서 DB를 관리하는 툴입니다.  보통의 DB툴은 결과를 Grid에 보여주는데,  Spatial DB Manager는 결과를 Grid, 지도에 보여주는 툴 입니다.

현재 SDM(Spatial DB Manager)는 다음과 같은 기능을 가지고 있어요.

  1. PostgreSQL(Postgis)를 지원하구요. (조만간(?) MSSQL, Oracle ..)
  2. Conntection Manager 창에 지도를 지원하는 디비이면 디비이미지에 G가 표시됩니다. 
  3. Object Explorer의 테이블과 컬럼에도 지도를 데이터가 있다면 G가 표시됩니다. 
  4. 쿼리 에디터 창에서 쿼리를 하면 지도 데이터가 있다면 지도 창이 활성화 되어 보여줍니다.  10만 로우를 검색해도 죽지않고 지도까지 잘 보여집니다.(?)

  5. 쿼리 결과 창에서 데이터를 클릭하면 지도에 도움말 풍선이 표시됩니다.

올챙이를 확장한 SDM은 다음과 같은 구조를 가지고 있습니다.
올챙이는 확장 가능한 부분을 Eclipse extension point로 정의 해 놓았습니다. SDM은 이것을 이용하여 확장하였습니다.

그러면, 어떻게 PostgreSQL가 지도를 지원하는 디비인지 알수 있을까요?
Postgis는 geometry_columns라는 뷰를 제공합니다. 이 뷰는 현재 geometry 테이블과 컬럼, type등을 제공하고 있어서 쿼리하면 어떤 테이블과 컬럼이 공간정보를 지원하는지 알수 있습니다.
다음과 같이요.
SELECT
    f_table_catalog          -- 디비 카탈로그
    ,f_table_schema        -- 공간 테이블 스키마
    ,f_table_name           -- 공간 테이블 이름
    ,f_geometry_column  -- 공간 테이블의 컬럼
    ,coord_dimension      --
    ,srid
    ,type        -- 공간 타입(POINT, MULTILINESTRING, MULTILINESTRING)
  FROM
    geometry_columns;
SDM은 이 뷰를 쿼리하여 Connection Manager, Object Explorer에 G자를 표시해 주었습니다.

그럼, 지도로 표시는 어떻게했을까요? 우선 지도는 Leaflet을 사용하였구요.
사용자가 쿼리 했을때 공간 컬럼인지 알수 있어야 하고, 공간 컬럼일 경우 지도(Leaflet)에 표시하기위해 WKT, WTB, GeoJSON 로 보내야합니다.

사용자가 쿼리 했을 때 공간 컬럼인지는 ResultSet의 ResultSetMetaData를 사용하여 geometry_columns 뷰에서 조회된 컬럼을 비교하여 공간쿼리인지를 알수 있었습니다.
결과를 Leaflet으로 출력하기 위해서GeoJson 형태로 변경해야 했는데, 이것은 postgis가 st_AsGeoJson(st_transform(TADPOLESUB.%s, 4326)) 를 지원하여 변환하였습니다.

예를 들어 공간테이블이 world_cities 이고, 공간 컬럼이 geom 라고 가정을 해보겠습니다.
사용자는
SELECT gid, city, latitude, country, rank, population, longitude, geom
FROM world_cities;  
라고 쿼리를 요청하면 SDM은 위에서 설명하는 과정을 거쳐서 다음과 같이 쿼리를 수정합니다.
SELECT *, st_AsGeoJson(st_transform(TADPOLESUB.geom, 4326)) as TADPOLE_HIDE_geom
FROM
    (SELECT gid, city, latitude, country, rank, population, longitude, geom
     FROM world_cities)
     as TADPOLESUB  
내부적으로 위와 같은 서브 쿼리를 만들어 DB에 쿼리를 요청하고 쿼리 결과를 사용하여 지도에 출력하게 됩니다.