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

,