서평 이벤트 : https://cafe.naver.com/aphone/93447



오랜만에 손 놓고 있던 안드로이드 개발을 하게 되었는데..


코틀린이란 것이 있다는 것을 알게 되었네요.


안드로이드는 언제나 자바로만 짜는 줄 알고 있었는데...


새로운 것을 배우는 것은 언제나 신기하기만 합니다.

1. 개요


라즈베리파이의 bluetooth 를 이용하여 beacon broadcast 기능을 수행하기 위해서는 bluez 라는 라이브러리가 가장 많이 사용되는 편이며, 또한 그 사용법 역시 인터넷에 제일 많이 검색되는 편입니다.


하지만 대체로 bluez 의 사용법을 설명하는 내용은 많으나 정작 비콘 브로드캐스팅 시 여타 장비에서 검색되는 beacon local name 을 변경하는 부분에 대한 설명이 없어 그 내용을 공유하고자 합니다.



2. 수정방법


최초 bluez 를 사용하여 라즈베리파이를 비콘화 하는 경우, 스마트폰을 이용하여 장비를 탐색하면 다음과 같이 나오게 됩니다.


제가 가진 라즈베리파이의 bluetooth 주소는 B8:27:EB:63:33:C6 입니다

위와 같이 장치 명이 라이브러리 이름인 BlueZ 5.50 으로 되어 있는 것이 보입니다.

바로 이 부분을 변경해 보도록 하겠습니다.




라즈베리파이 터미널에서 다음 명령어를 기입하시면 bluez 의 설정 파일 내용을 볼 수 있습니다.




설정 파일의 6번째 줄에 보시면 Name = BlueZ 부분이 주석 (#) 처리 되어 있는 것이 보입니다. 이 부분을 다음과 같이 변경합니다.



변경이 완료되면 Ctrl + X 입력 후, Y 를 통해 저장하고 나오도록 합니다.


이후 sudo reboot -h now 명령어를 통해 라즈베리파이를 재시작 하신 후, 다시 스마트폰 앱을 통해 비콘을 탐색하면 다음과 같이 검색이 됩니다.



bluetooth 주소를 보시면 처음 검색 했을 때와 같은 장비임을 알 수 있습니다.

하지만 장치명을 보면 raspberryp 로 나오는 것이 보입니다.


이상하죠?

분명 설정에서 Name = BlueZ 로 바꿨으니 저희가 의도한 상황은 아닙니다.


다시 설정 파일의 내용을 봅시다.



설정 파일에 주석으로 된 부분에 중요한 내용이 있군요.

대충 해석 하자면 hostname 플러그인이 로딩 된 경우에는 Name 설정을 hostname으로 덮어 쓴다는 내용입니다.

그리고 바로 아랫 줄에 또 중요한 내용이 있습니다.


/etc/machine-info 파일에 PRETTY_HOSTNAME=장치명 으로 설정하면 된다고 나오는 군요.

알려주는대로 해 봅니다.




nano 명령어를 통해 machine-info 파일을 열어보면 아무런 내용이 나오지 않습니다.

bluez 를 최초 설치한 경우 별 다른 설정을 하지 않으면 해당 파일이 존재하지 않기 때문이죠.

하여 우리는 새로운 파일을 생성하여 위와 같이 장치명을 입력하여 준 뒤, Ctrl + X, Y를 통해 저장하여 주도록 합니다.


이후, 아까와 마찬가지로 sudo reboot -h now 명령어를 통해 라즈베리파이를 재부팅 하도록 합니다.



드디어 원하는대로 장치명이 변경 되었습니다.


괄호 안에 나오는 (아이비콘) 의 경우 제가 사용한 어플리케이션에서 자동으로 붙여준 부분입니다.

아마 다른 앱을 사용하시면 장치명이 설정한 장치명만 나오게 될 듯 합니다.


장치명은 최대 10글자로 제한 됩니다.

설정 파일에서 10글자 이상으로 길게 기입하더라도 실제 검색되는 이름은 앞에서 10글자까지 잘려서 표시되게 됩니다.

이는 ibeacon 의 패킷 payload 상 장치명에 할당 된 길이가 10 byte 이기 때문입니다.

1. 개요


jquery-ui API 중 달력 기능 사용에 있어 기본 영문 언어에서 한글로 변경하는 방법에 대해 포스팅 합니다.

 



2. API


상세한 API 사용은 원 출처 페이지를 참고하기 바랍니다.

https://jqueryui.com/datepicker/


3. 한글 설정


<script>
if(typeof $.datepicker.regional == 'object') {
	$.datepicker.regional['kr'] = {
	    closeText: '닫기', // 닫기 버튼 텍스트 변경
	    currentText: '오늘', // 오늘 텍스트 변경
	    changeYear: true,
	    changeMonth: false,
	    monthNames: ['1 월','2 월','3 월','4 월','5 월','6 월','7 월','8 월','9 월','10 월','11 월','12 월'], // 개월 텍스트 설정
	    monthNamesShort: ['1 월','2 월','3 월','4 월','5 월','6 월','7 월','8 월','9 월','10 월','11 월','12 월'], // 개월 텍스트 설정
	    dayNames: ['월요일','화요일','수요일','목요일','금요일','토요일','일요일'], // 요일 텍스트 설정
	    dayNamesShort: ['월','화','수','목','금','토','일'], // 요일 텍스트 축약 설정   
	    dayNamesMin: ['월','화','수','목','금','토','일'], // 요일 최소 축약 텍스트 설정
	    dateFormat: 'dd/mm/yy' // 날짜 포맷 설정
	};

	// Seeting up default language, Korean
	$.datepicker.setDefaults($.datepicker.regional['kr']);
}
</script>


datepicker 호출하기 직전에 위의 소스가 먼저 호출되면 됩니다.


<script>
$("#date_popup").datepicker({
			dateFormat:'yy-mm-dd',
			showOn: "button",
			buttonImage: 'btn_calendar.gif',
			buttonImageOnly: true,
			buttonText: "Select date"
		});
</script>

<input type="text" id="date_popup" name="select_date" style="color:#787878;" onkeypress="checkInputTime(event);" onfocus="blur();" />

 

 


 

4. 출처


https://jqueryui.com/

'웹 프로그래밍 > JavaScript' 카테고리의 다른 글

[jquery] Flight Indicator API  (0) 2020.06.18

1. 개요


안드로이드 6.0 이상 버전에서 사용자에 의해 권한을 부여 받아야 사용 가능한 기능 (카메라, 파일 접근 등)을 이용하려면 런타임 퍼미션( runtime permissions)이 필요합니다.


본 포스팅에서는 퍼미션을 체크하고 요청하는 방법에 대해 기술합니다.


핵심 함수는 다음과 같습니다.


퍼미션 체크 ActivityCompat.checkSelfPermission(Context, String)

퍼미션 요청 ActivityCompat.requestPermissions(Activity, String[], int)

퍼미션 요청 콜백함수 ActivityCompat.OnRequestPermissionsResultCallback


콜백함수(OnRequestPermissionsResultCallback) 의 경우 AppCompatActivity 에 오버라이드 (Override) 되어 있는 함수이기 때문에 실제 권한 요청을 수행하는 Activity 에 코드가 포함되지만 그 외 나머지 함수들은 별도의 CustomClass 를 작성하여 호출하도록 구성하였습니다.


2. 소스 코드


1) AndroidManifest.xml


실제 사용하고자 하는 요청 권한을 명기 합니다.


<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


2) PermissionUtil.java


퍼미션 체크(checkSelfPermission) 와 퍼미션 요청(requestPermissions) 을 실제로 호출하는 CustomClass 입니다.


해당 부분은 내용이 길어 첨부한 소스코드 파일의 주석으로 대체 합니다.


PermissionUtil.java


3) MainActivity.java


앱 최초 실행 시 권한을 받아 결과에 따라 앱을 실행할지 말지 여부를 결정하기 위해 최초 실행 되는 Activity의 onCreate 에서 호출하도록 합니다.


만약 해당 기능 사용과 별개로 앱을 사용하다가 실제 기능 동작이 필요한 경우에 권한을 요청하려면 (예를 들어 사진 앨범에 접근하기 위해 가져오기 버튼을 클릭하는 순간 권한을 묻기를 원한다면) 해당 기능 동작 중 (OnClickListener 내부)에 호출하도록 합니다.



private PermissionUtil m_PermissionTool;
private String strPermissions[] = {
	Manifest.permission.READ_EXTERNAL_STORAGE
};

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	// 권한 검사
	m_PermissionTool = new PermissionUtil(this, strPermissions);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
	super.onRequestPermissionsResult(requestCode, permissions, grantResults);

	switch (requestCode) {
		case PermissionUtil.MY_PERMISSIONS_REQUEST_READ_CONTACTS:
			if (m_PermissionTool.verifyPermission(permissions, grantResults) == false) {
				// 권한 얻기 실패
				m_PermissionTool.showRequestAgainDialog();
			}
			break;
	}
}


3. 참조


https://developer.android.com/training/permissions/requesting?hl=ko#java



1. 개요

 

jquery UI API 중에서 지도와 연계하여 사용하기 좋은 비행 계기판 관련 API를 소개하고자 한다.

 

(개발자 git 에서 발췌한 UI 이미지)

 

다섯 가지 외에 추가로 turn coordinator 라는 API 도 있는데 해당 API 의 경우 IE 에서는 사이즈 변경이 안되는 오류가 있어서 소개되어 있지 않으나 API 상에는 존재함

 

(존재하나 소개 되지 않은 API UI)

 

 

2. 사용방법

 


<head>
<script src="js/jquery.flightindicators.js"></script>
<link rel="stylesheet" type="text/css" href="css/flightindicators.css" />
</head>

<body>
<span id="attitude"></span>
<script>
     var indicator = $.flightIndicator('#attitude', 'attitude', {size:200, showBox : showBox});
     indicator.setRoll(15);
     indicator.setPitch(7.5);
</script>
</body>


3. 출처

 

https://github.com/sebmatton/jQuery-Flight-Indicators

 

 

 

 

 

 

'웹 프로그래밍 > JavaScript' 카테고리의 다른 글

[jquery] datepicker 한글 설정  (0) 2020.08.19
1. 개요


프로그래밍을 하다 보면, 이 기종 간에 데이터를 주고 받아야 하는 일이 참 많이 발생한다.


대체로 온라인을 통해 데이터를 주고 받는 경우가 흔한데, 이 경우 유출될 수 있는 데이터를 보호하기 위해서는 반드시 암호화/복호화 과정을 통해 데이터를 잠궈야 하는데 이때 많이 사용되는 암호화 알고리즘이 AES 방식일 것이다.


2. AES


데이터를 암호화 하는 키의 길이에 따라 AES-128, AES-192, AES-256 의 형태로 사용 가능하다.


단순히 키의 길이만 바뀌는 것이 아니라, 키의 길이에 맞춰 암호화를 진행하는 횟수 (이를 라운드라 함) 도 다르고 또 암호화 하고자 하는 데이터 길이에 따라서 CBC 방식이니 ECB, CFB 등등.. 여러 방식이 있지만 여기서 암호화 알고리즘에 대해 논하자는 것은 아니고 실제 선구자 들이 만들어 놓은 암호화 알고리즘을 사용하는 방법을 기술하고자 한다.


3. PHP


최신 PHP 에서는 openssl 확장 DLL을 통한 암호화 방식을 많이 사용한다.

openssl_encrypt, openssl_decrypt 함수를 사용하며 key, iv, 암호화 방식을 선택하기만 하면 간단하게 암호화가 가능해 진다.


openssl_encrypt($str, "AES-256-CBC", $secret_key, OPENSSL_RAW_DATA, $secret_iv);
openssl_decrypt($str, "AES-256-CBC", $secret_key, OPENSSL_RAW_DATA, $secret_iv);

자세한 사용 방법은 첨부 된 php 파일을 참고 하시길






4. JAVA


오늘 본 글을 블로그에 게재 하게 만든 원인. 이 녀석이다.


구글 등에서 JAVA AES 256 암호화로 검색하면 가장 많이 보이는 소스가 바로 다음과 같은 형식이다.


public AES256Util(String key) {
		this.iv = key.substring(0, 16);
		byte[] keyBytes = new byte[16];
		byte[] b = key.getBytes("UTF-8");
		int len = b.length;
		if (len > keyBytes.length) {
			len = keyBytes.length;
		}
		System.arraycopy(b, 0, keyBytes, 0, len);
		SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

		this.keySpec = keySpec;
	}

AES-CBC 방식의 경우 초기화 벡터(IV) 값으로 16 byte의 공유(암호화 복호화 하고자 하는 사람 간에)되는 값을 사용한다.


대게 해당 값은 암호화에 사용하는 마스터 키(역시 암복호화 사이에 공유 되는 값) 에서 16 byte를 추출해서 사용하는 것이 보통이기에 위 소스 첫 째 줄처럼 사용하곤 한다.


여기까지는 문제가 없다.

다음을 보자


byte[] keyBytes = new byte[16];
byte[] b = key.getBytes("UTF-8");

...
...
...

System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

위 코드를 분석해 보면, keyBytes 라는 16 byte (중요하다. 강조!) 배열을 생성하고 입력받은 마스터 키(key) 값 중에서 에서 16 byte 를 뽑아와서 keyBytes 에 채워넣고 있다.


그리고, 이 값을 가지고 SecretKeySpec 이라는 함수를 통해 암복호화에 사용할 비밀키를 설정하고 있다.


여기서 이상한 점을 느낄 수 있는가?

사실 보안교육이나 암호화에 대해 따로 배운 적이 있지 않고는 위 코드만 보고서는 문제점을 찾기란 쉽지 않을 것이다.


본 글 2항에서, AES는 키의 길이에 따라 암호화 방식이 128, 192, 256 으로 나뉜다고 기술하였다.


하지만 대부분의 소스를 검색해 보면 SeceretKeySpec 함수를 사용하는데 있어 16 byte 의 키를 넣어 놓고는 AES-256 암호화를 사용하고 있다고 말하는 경우가 비일비재 하다.


위의 소스 코드는 다음과 같이 변경되어야 한다.


public AESCrypto(final String key, final int keySize) throws Exception { byte[] keyBytes=null; byte[] b = key.getBytes(StandardCharsets.UTF_8); String strCipher=null; switch (keySize) { case 16: // 128 bit strCipher = "AES-128"; keyBytes = new byte[keySize]; break; case 24: // 192 bit strCipher = "AES-192"; keyBytes = new byte[keySize]; break; case 32: // 256 bit strCipher = "AES-256"; keyBytes = new byte[keySize]; break; } if (keyBytes == null) { throw new Exception("암호화 방식이 올바르지 않습니다."); } System.out.println("Encrypt Type : "+strCipher); int inputKeyLength = key.length(); if (inputKeyLength > keySize) { // 입력 받은 key string 길이가 실제 암호화 할 대상 key 길이보다 큰 경우, 암호화 키 길이에 맞게 조정 System.arraycopy(b, 0, keyBytes, 0, keySize); } else if (inputKeyLength < keySize) { throw new Exception("Key 길이가 올바르지 않습니다."); } else { // 입력 받은 key string 길이가, 실제 암호화 할 대상 key 길이와 동일한 경우 System.arraycopy(b, 0, keyBytes, 0, keySize); } // AES 암호화는 IV 값으로 16 byte 사용 this.iv = key.substring(0, 16); // KeySpec 생성 시 입력하는 키 길이에 따라 AES-128,192,256 방식으로 자동 설정 됨 this.keySpec = new SecretKeySpec(keyBytes, "AES"); System.out.println("KEY : "+new String(keyBytes, "UTF-8")); System.out.println("IV : "+this.iv); }


JAVA 소스코드 역시 첨부하였으니 자세한 사용 방법은 코드를 확인 하시길..


5. 결과


<PHP 호출 결과>



<JAVA 호출 결과>




6. 맺음


부디 본 글이 이 기종 연동 간에 서로가 원인을 못 찾아 허덕이는 이들을 구원해 주기를...


AES.zip





 

1. 개요

 

 

MFC 에서 사용 가능한 libcurl DLL 파일 및 LIB 파일 묶음 입니다.

 

SSL 미 사용 버전으로 최신 버전 CURL 유지를 위하여 공유 합니다.

 

정적 라이브러리에서 MFC 사용 가능한 환경으로 작성 된 파일이며 사용 시, CURL_STATICLIB 를 전처리기에 추가해 주어야 합니다.

(참조 : https://ittravelkr.tistory.com/24?category=406899)

 

 

 

 

 

 

libcurl-7.65.1.zip

 

 

1. 개요

 

MS office의 아웃룩을 사용하다 보면 가끔 아웃룩이 Splash 이미지에서 처리 중... 의 메세지를 띄운 상태에서 더 이상 진행되지 않는 경우가 생기기도 한다.

이럴 땐 아웃룩을 안전모드 로 실행했다 정상 종료한 후, 다시 실행해 보면 오류가 해결 되는 경우가 있으니 그 방법은 다음과 같다.

 

2. 조치방법

 

1. Win + R 키를 눌러 실행 창을 띄운다.

 

2. 열기 창에 outlook.exe /safe 라고 입력하고 확인 버튼을 클릭한다.

 

 

3. 자신이 사용하고 있는 프로필을 선택한 후 확인 버튼을 클릭한다.

 

 

4. 아웃룩이 실행되면 [파일 - 끝내기] 버튼을 클릭하여 정상 종료 한다.

 

아무쪼록 해당 방법으로 오류가 해결 되기 바랍니다.

1. 개요

 

MFC 에서 Json 포맷의 스트링을 파싱할 경우 사용 할 수 있는 open source

 

2. 설치

 

공식 git 페이지(https://github.com/open-source-parsers/jsoncpp) 에서 소스 코드를 다운로드 받아, Visual Studio IDE에서 프로젝트를 Import 및 Compile 하여 사용

 

이때, lib 형식과 dll 형식의 2가지 방식으로 컴파일 가능

 

3. 오류 대처

 

jsoncpp를 컴파일 하여 나온 결과물(lib, dll)을 프로젝트에 import 하여 사용하는 경우 debug 모드에서는 별 문제가 없으나, release 모드로 컴파일 시 [json_value.cpp : fatal error C1083: 컴파일러 생성 파일 파일을 열 수 없습니다. '../../build/vs71/release/lib_json/json_value.asm': No such file or directory] 와 같은 에러가 생기는 경우 다음과 같이 설정 값을 수정 하는 것으로 해결 가능

 

 

붉은 박스로 표시한 영역의 값을 목록 없음(No listing)으로 변경

 

 

1. 개요

 

PHP 에서 Array 형 데이터를 JSON 포멧으로 출력하고자 하는 경우 json_encode 함수를 호출함으로써 간단하게 데이터 변환이 가능하다.

 

단, 해당 함수는 UTF-8 형태의 String 값만을 사용할 수 있기 때문에 iconv 를 사용하여 UTF-8 인코딩을 하여 사용해야만 한다.

 

그런데 여기서 문제가 발생하는데, 한글 데이터를 사용할 경우 json_encode 함수가 한글을 유니코드 형태로 자동으로 변환해서 출력하게끔 되어 있다.

 

 

2. 해결 방안

 

PHP 5.4 버전 이상을 사용할 경우, 다음과 같이 상수 변수 값을 옵션으로 줌으로써 간단하게 해결이 가능하다.

json_encode($arrJson, JSON_UNESCAPED_UNICODE);

그러나, 하위 버전 PHP를 사용하는 경우 json_encode 함수가 옵션 값을 받지 않기 때문에 해당 방법을 사용 할 수 없다.

 

따라서, 다음의 함수를 추가하여 해결하도록 한다.

function han ($s) { return reset(json_decode('{"s":"'.$s.'"}')); }
function to_han ($str) { return preg_replace('/(\\\u[a-f0-9]+)+/e','han("$0")',$str); }

to_han (json_encode($arrJson));

+ Recent posts