jQuery AJAX 로 시도, 시군구, 읍면동 동적으로 데이터를 가져오는 샘플입니다.

타 도메인의 데이터를 가져오는 예제입니다.

<!doctype html>
<html lang="ko">
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta http-equiv="Cache-Control" content="no-cache"/> 
	<meta http-equiv="Expires" content="0"/> 
	<meta http-equiv="Pragma" content="no-cache"/>
	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
	<script>
		var curLevel = 0;
		$(document).ready(function(){
			getLocation(0);
		});
		function myPOST(v) {
			var arr = v;
			if(curLevel == 0) {
				for(var i=0; i<arr.length; i++) {
					$('#sido').append('<option value="' + arr[i].sido + '">' + arr[i].sido + '</option>');
				}
			} else if(curLevel == 1) {
				for(var i=0; i<arr.length; i++) {
					$('#sigungu').append('<option value="' + arr[i].sigungu + '">' + arr[i].sigungu + '</option>');
				}
			} else if(curLevel == 2) {
				for(var i=0; i<arr.length; i++) {
					$('#dong').append('<option value="' + arr[i].dong + '">' + arr[i].dong + '</option>');
				}
			} else {
			}
		}
		function getLocation(v) {
			curLevel = v;
			if(v == 0) {
				$('#sido').empty().append('<option value="">시도 선택</option>');
			} else if(v == 1) {
				$('#sigungu').empty().append('<option value="">구군 선택</option>');
				$('#dong').empty().append('<option value="">읍면동 선택</option>');
			} else if(v == 2) {
				$('#dong').empty().append('<option value="">읍면동 선택</option>');
			} else {
			}
			var sido = $('#sido').val();
			var sigungu = $('#sigungu').val();
			var request = $.ajax({
				type: 'POST',
				data: {mdiv:'json',sido:sido,sigungu:sigungu},
				url: 'https://www.ivps.kr/zipcode/zipcode.php',
				dataType: "jsonp",
				jsonpCallback: "myPOST",
				success:function(result){
					//console.log('ret : ' + result);
				},
				error:function(xhr, status, error){
					console.log('status : ' + xhr.status);
				}
			});
		}
	</script>
</head>
<body>
	<form name="postForm" method="get" action="" onsubmit="return false;">
		<div style="float:left;width:200px;height:45px;">
			<select name="sido" id="sido" style="width:150px;" onchange="getLocation(1);">
				<option value="">시도 선택</option>
			</select>
		</div>
		<div style="float:left;width:200px;height:45px;">
			<select name="sigungu" id="sigungu" style="width:150px;" onchange="getLocation(2);">
				<option value="">구군 선택</option>
			</select>
		</div>
		<div style="float:left;width:200px;height:45px;">
			<select name="dong" id="dong" style="width:150px;" onchange="getLocation(3);">
				<option value="">읍면동 선택</option>
			</select>
		</div>
	</form>
</body>
</html>

PHP 부분은 아래와 같습니다.

<?php
	include "./mysql.php";

	header('Content-Type: text/html; charset=UTF-8');

	$callback = $_REQUEST['callback'];
	$mdiv     = $_REQUEST['mdiv'];
	$sido     = $_REQUEST['sido'];
	$sigungu  = $_REQUEST['sigungu'];
	$dong     = $_REQUEST['dong'];

	if($mdiv == 'json') {
		if($sido && $sigungu) {
			$sql = "select if(dong='',eupmyun,dong) dong from zip_tmp where sido like '$sido' and sigungu like '$sigungu' group by dong, eupmyun order by dong asc";
			$datas = DBQueryArray($sql);
		} else if($sido) {
			$sql = "select sigungu from zip_tmp where sido like '$sido' group by sigungu order by sigungu asc";
			$datas = DBQueryArray($sql);
		} else {
			$sql = "select sido from zip_tmp group by sido order by sido asc";
			$datas = DBQueryArray($sql);
		}
		$json_str = json_encode($datas);
		echo $callback."(".$json_str.")";
	} else {
	
	}
?>

DBQueryArray 부분은 따로 구현하시면 됩니다.

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

도로명주소 DB 가 총 6,421,529 건 이라서 인덱스를 걸어줘도 느리네요~

테이블 Engine 이 MyISAM, InnoDB 관계 없이 느립니다.

시도, 시군구, 읍면동을 Select option 으로 뽑아내서 사용하자니 너무 느려서 별도의 TABLE 을 만들었습니다.

CREATE TABLE zip_tmp (
 idx            INT(10)    UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
 sido           VARCHAR(25) NULL,
 sigungu        VARCHAR(30) NULL,
 eupmyun        VARCHAR(20) NULL,
 dong           VARCHAR(20) NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

INSERT INTO zip_tmp (sido, sigungu, eupmyun, dong)
 SELECT sido, sigungu, eupmyun, dong FROM zipcode
 GROUP BY sido, sigungu, eupmyun, dong
 ORDER BY sido ASC, sigungu ASC, eupmyun ASC, dong ASC;

GROUP BY 로 중복된 데이터 걸러내니 5,031건으로 줄어드네요~

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

HTS 를 실행했는데 이전에 열어둔 기능창들이 하나도 안보여서 조금 황당했습니다.

주식 주문창이 안보이는 겁니다~

"4989: 없는 화면이거나 조회권한이 없습니다." 이렇게 뜨길래... 뭐지? 생각하면서 여러번 재실행해 보았지만 안되더군요~

원인은 다른데 있었습니다.

미스클릭이였는지는 잘 모르겠지만 화면 왼쪽 상단에 보니 Hable 로 되어있어야 되는데 Globla 로 설정이 되어있더군요~

혹시 저 처럼 황당한 상황이 있으실까봐 글로 남겨봅니다~

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

라이베리파이4 모델B가 출시되었네요~

램에 따라 가격이 1GB $35, 2GB $45, 4GB $55 이네요~

특징이 전 모델에 비해 성능이 3배 가까이 향상, 램은 1GB ~ 4GB, USB3.0 지원이네요~

  • A 1.5GHz quad-core 64-bit ARM Cortex-A72 CPU (~3× performance)
  • 1GB, 2GB, or 4GB of LPDDR4 SDRAM
  • Full-throughput Gigabit Ethernet
  • Dual-band 802.11ac wireless networking
  • Bluetooth 5.0
  • Two USB 3.0 and two USB 2.0 ports
  • Dual monitor support, at resolutions up to 4K
  • VideoCore VI graphics, supporting OpenGL ES 3.x
  • 4Kp60 hardware decode of HEVC video
  • Complete compatibility with earlier Raspberry Pi products

라즈베리파이4 모델B

아래는 케이스인데 5달러라고 합니다.

라즈베리파이4 케이스

자세한 내용은 https://www.raspberrypi.org/blog/raspberry-pi-4-on-sale-now-from-35/ 여기를 참고하세요~

 

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

우체국에서 최신 우편번호 DB 파일을 다운로드 받으면 텍스트 형태로 되어 있습니다.

이를 mysql 에 데이터로 밀어넣는 방법입니다.

https://www.epost.go.kr/search/zipcode/areacdAddressDown.jsp
https://www.epost.go.kr/search/areacd/zipcode_DB.zip
여기에서 파일을 다운로드 받아서 압축을 풀고 서버로 업로드를 합니다.

우편번호|
시도|
시도영문|
시군구|
시군구영문|
읍면|
읍면영문|
도로명코드|
도로명|
도로명영문|
지하여부|
건물번호본번|
건물번호부번|
건물관리번호|
다량배달처명|
시군구용건물명|
법정동코드|
법정동명|
리명|
행정동명|
산여부|
지번본번|
읍면동일련번호|
지번부번|
구우편번호|
우편번호일련번호

파일을 열어서 보면 위에 같은 형태로 되어 있는데 똑같은 구조로 테이블을 만듭니다.

CREATE TABLE zipcode (
 zipcode        VARCHAR(5) NULL,
 sido           VARCHAR(25) NULL,
 sido_en        VARCHAR(20) NULL,
 sigungu        VARCHAR(30) NULL,
 sigungu_en     VARCHAR(30) NULL,
 eupmyun        VARCHAR(20) NULL,
 eupmyun_en     VARCHAR(25) NULL,
 doro_code      VARCHAR(12) NULL,
 doro           VARCHAR(40) NULL,
 doro_en        VARCHAR(50) NULL,
 under_yn       VARCHAR(1) NULL,
 buildno1       VARCHAR(5) NULL,
 buildno2       VARCHAR(4) NULL,
 buildnum       VARCHAR(25) NULL,
 multiple       VARCHAR(1) NULL,
 buildname      VARCHAR(70) NULL,
 dong_code      VARCHAR(10) NULL,
 dong           VARCHAR(20) NULL,
 ri             VARCHAR(20) NULL,
 dong_hj        VARCHAR(30) NULL,
 mount_yn       VARCHAR(1) NULL,
 jibun1         VARCHAR(4) NULL,
 eupmyundong_no VARCHAR(2) NULL,
 jibun2         VARCHAR(4) NULL,
 zipcode_old    VARCHAR(7) NULL,
 zipcode_seq    VARCHAR(3) NULL,
 idx            INT(10)    UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

이제 DB Text 파일을 ANSI 에서 UTF-8 로 변환 합니다.

iconv -c -f cp949 -t utf-8 강원도.txt > 강원도1.txt
iconv -c -f cp949 -t utf-8 경기도.txt > 경기도1.txt
iconv -c -f cp949 -t utf-8 경상남도.txt > 경상남도1.txt
iconv -c -f cp949 -t utf-8 경상북도.txt > 경상북도1.txt
iconv -c -f cp949 -t utf-8 광주광역시.txt > 광주광역시1.txt
iconv -c -f cp949 -t utf-8 대구광역시.txt > 대구광역시1.txt
iconv -c -f cp949 -t utf-8 대전광역시.txt > 대전광역시1.txt
iconv -c -f cp949 -t utf-8 부산광역시.txt > 부산광역시1.txt
iconv -c -f cp949 -t utf-8 서울특별시.txt > 서울특별시1.txt
iconv -c -f cp949 -t utf-8 세종특별자치시.txt > 세종특별자치시1.txt
iconv -c -f cp949 -t utf-8 울산광역시.txt > 울산광역시1.txt
iconv -c -f cp949 -t utf-8 인천광역시.txt > 인천광역시1.txt
iconv -c -f cp949 -t utf-8 전라남도.txt > 전라남도1.txt
iconv -c -f cp949 -t utf-8 전라북도.txt > 전라북도1.txt
iconv -c -f cp949 -t utf-8 제주특별자치도.txt > 제주특별자치도1.txt
iconv -c -f cp949 -t utf-8 충청남도.txt > 충청남도1.txt
iconv -c -f cp949 -t utf-8 충청북도.txt > 충청북도1.txt

변환된 파일을 mysql load data 를 이용해서 데이터로 밀어넣습니다.

LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/강원도1.txt'         INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/경기도1.txt'         INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/경상남도1.txt'       INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/경상북도1.txt'       INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/광주광역시1.txt'     INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/대구광역시1.txt'     INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/대전광역시1.txt'     INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/부산광역시1.txt'     INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/서울특별시1.txt'     INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/세종특별자치시1.txt' INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/울산광역시1.txt'     INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/인천광역시1.txt'     INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/전라남도1.txt'       INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/전라북도1.txt'       INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/제주특별자치도1.txt' INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/충청남도1.txt'       INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
LOAD DATA LOCAL INFILE '/home/ivps/www/zipcode/zipcode_DB/충청북도1.txt'       INTO TABLE zipcode.zipcode CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;

생각보다 빨리 처리가 되는군요~

idx 컬럼 때문에 warning 이 발생하긴 하지만 idx 컬럼이 없으면 로딩시 느려집니다.

load data 뒤쪽에 SET idx = NULL 을 넣어도 워닝은 발생하네요~

INSERT INTO TABLE (컬럼명, ...) 이렇게 지정하면 되긴 하지만 저 많은 컬럼을 다 나열하자니~ ㅎ

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

우체국의 우편번호 주소 DB 텍스트 파일을 열어보니 ANSI 로 나오는데 mysql 에 밀어 넣으려면 utf-8 로 변환해야 합니다.

ANSI 인데 한글인 경우 cp949 를 utf-8 로 변경하면 됩니다. ( euc-kr 로 하니까 샾아파트 같은 문자는 깨지네요~ )

AcroEdit 와 같은 편집기를 이용해서 변환해도 되지만 리눅스 명령어로 치환하는 방법입니다.

[root@ivps zipcode_DB]# file -bi 강원도.txt
text/plain; charset=iso-8859-1
[root@ivps zipcode_DB]# iconv -c -f cp949 -t utf-8 강원도.txt > 강원도1.txt
[root@ivps zipcode_DB]# file -bi 강원도1.txt
text/plain; charset=utf-8

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

윈도우의 모니터 화면을 로컬네트워크(유.무선) 대역에 있는 스마트폰의 스크린으로 모니터를 확장할 수 있는 프로그램입니다.

안쓰는 스마트폰이나 태블릿을 듀얼모니터로 활용이 가능합니다~

https://spacedesk.net/ 여기에서 다운로드 받으시면 됩니다.

SpaceDesk 무선 모니터 확장 프로그램

윈도우7, 8.1, 10 버전에서 PC용 프로그램을 설치한 다음에
확장 모니터로 활용할 Remote Viewer 는 윈도우, 안드로이드, iOS, HTML5, 아마존에서 설치를 할 수 있습니다.

스마트폰 두대도 확장 연결이 되더군요~ 최대 몇 대까지 될지는 모르겠지만  x10 가 있는 것으로 보아 10대까지 가능한 것 같습니다.

확장 모니터로 연결된 스마트폰 화면입니다.

세로 모드와 가로 모드로 전환시 끊김 현상이 있지만 생각 보다 훌륭한 프로그램 같습니다.

 

SpaceDesk Remote Viewer Options

프레임 속도와 해상도 설정 옵션도 있습니다.

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

한글로 된 파일이름을 다운로드 할 때 예제 PHP 샘플소스입니다.

<?php
	if(!isset($_GET['filename'])) {
		echo "file not found";
		return;
	}
	$filename = $_GET['filename'];
	$filepath = dirname(__FILE__)."/파일경로/".$_GET['filename']; // 경로에 맞게 수정
	if(!file_exists($filepath)) {
		echo "file not found ". $filepath;
		return;
	} else {
		header("Content-Type: application/octet-stream");
		header("Content-Disposition: attachment; filename=\"$filename\"; filename*=UTF-8''".urlencode($_GET['filename']));
		header("Content-Transfer-Encoding: binary");
		header("Content-Length: ".(string)filesize($filepath));
		header("Cache-Control: cache, must-revalidate");
		header("Pragma: no-cache");
		header("Expires: 0");
		readfile($filepath);
	}
?>

위 코드를 download.php 파일로 저장하고 호출은 download.php?filename=파일이름 이렇게 하시면 됩니다.

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

문서 열기에서 최근항목에 보면 통합문서에 이전에 열어본 엑셀 파일들이 리스트에 나타납니다.

이것을 제거하는건 아니고 안보이게 하려면 옵션 -> 고급 -> 표시할 최근 통합 문서 수

정수 0 ~ 50까지 입력이 가능한데 0으로 입력하면 됩니다.

0으로 했다가 다시 숫자를 올리면 이전에 문서가 다시 리스트에 나타납니다.

완전히 지우려면 레지스트리에서 삭제를 하여야 한다고 하는군요~

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

안드로이드 폰마다 해상도가 달라서 그리드뷰에서 이미지가 다르게 나오는군요~

폰의 화면 해상도에 따라 각 셀의 이미지 폭을 계산하는 방법입니다.

	<GridView
	    xmlns:android="http://schemas.android.com/apk/res/android"
	    android:id="@+id/gridview"
	    android:layout_width="fill_parent"
	    android:layout_height="0dip"
	    android:layout_weight="1"
	    android:columnWidth="100dp"
	    android:numColumns="3"
	    android:verticalSpacing="10dp"
	    android:horizontalSpacing="10dp"
	    android:stretchMode="columnWidth"
	    android:gravity="center"
	    />

위의 android:numColumns 숫자로 Width 를 나누면 됩니다.

그리고 나누기 전에 horizontalSpacing 이 있으므로 그 값을 미리 빼서 나누어야 합니다.

mGridView = (GridView)findViewById(R.id.gridview);
mCellSize = (this.getResources().getDisplayMetrics().widthPixels - mGridView.getRequestedHorizontalSpacing() ) / 3;

여기서 구한 mCellSize 를 mGridView.setAdapter 함수 호출시 값을 전달합니다.
mGridView.setAdapter(new ImageAdapter(getBaseContext(), thumbPath, mCellSize));

public class ImageAdapter extends BaseAdapter {
	private Context mContext;
	private int mCellSize = 0;

	public ImageAdapter(Context c, String[] thumbPath, int cellSize) {
		mContext = c;
		mCellSize = cellSize;
	}

	public Object getItem(int position) {
		return null;
	}
	
	public long getItemId(int position) {
		return 0;
	}
	
	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView imageView;
		if(convertView == null) {
			imageView = new ImageView(mContext);
			imageView.setLayoutParams(new GridView.LayoutParams(mCellSize, mCellSize));
			imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
			imageView.setPadding(1, 1, 1, 1);
		}
		else {
			imageView = (ImageView)convertView;
		}
		
		imageView.setImageURI(Uri.parse(thumbPath[position]));
		
		return imageView;
	}
}

GridView에 자동으로 표시하는 옵션이 생기면 좋을텐데 아쉽군요~

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,