모바일앱2017. 7. 25. 01:32

회사 내에서 사용하는 그룹웨어 App같은 경우 App Store에 올리기엔 약간 부담이  된다.


그래서 ad hoc이란 방식으로 배포하게 되는데 이것은 plist라는 xml형태의 파일을 만들고


공인 인증된 웹도메인(HTTPS, SSL)에서  아래와 같은 링크를 통해서 다운 받아서 앱을 설치하는 방식이다.


<a href="itms-services://?action=download-manifest&url=ipa 파일이 있는 경로">앱 설치하기</a>


사실 Tomcat에다가 ipa파일을 올려놓고 심볼릭 링크를 통해서 다이렉트로 다운 받을 때는 큰 문제가 없으나


동시 다운로드 시 트래픽제한을 해야하는 이슈가 발생하여 앱 다운로드 종료시점을 알아야했기에 다운로드 방식을


Servlet을 통해서 할 수 밖에 없게 되었다. 별 이상 없이 잘 될 줄 알았으나 톰캣에서 기본 기능으로 다이렉트 다운로드 시에는


문제 없이 잘 진행되었으나 서블릿 방식으로 변경하고나서 다운로드가 되지 않았다.


이런 저런 테스트 후에 발견한 사실은 


https://localhost/file/fileDownload.file?param1=sample.ipa&param2=aaa


위와 같이 했울 경우 &가 문제가 된 것이였다. &amp;로 해줘야 문제 없이 실행된다.


또는 Spring MVC에서 동적으로


https://localhost/file/fileDownload/param1/param2.file과 같이 해줘도 무방하다.


Controller에서는


@RequestMapping(value="/file/fileDownload/{param1}/{param2}", method = RequestMethod.POST) 

public void categoryTest(

@PathVariable("param1") String param1, 

@PathVariable("param2") String param2, HttpServletRequest request) throws Exception { 

 //블라블라

}

위와 같이 처리해주면 되겠다.

Posted by 미랭군
카테고리 없음2016. 7. 19. 15:37


링크드인을 창업한 Reid Hoffman께서 말씀하신 것 중, 스타트업이란 절벽에서 맨몸으로 뛰어내려, 내려가는 동안 비행기를 만들어 하늘로 날라가는 것이라 설명하였다. 

Posted by 미랭군
생활의지혜2016. 6. 30. 10:22

나무의 나이테가 우리에게 가르치는 것은

 나무는 겨울에도 자란다는 사실입니다.

그리고 겨울에 자란 부분일수록

 여름에 자란 부분 보다 훨씬 단단하다는 사실입니다.

- 신영복 


‘좋은 쇠는 뜨거운 화로에서 백번 단련된 다음에 나오는 법이며,

매화는 추운 고통을 겪은 다음에

 맑은 향기를 발하는 법’입니다.(역경)

 ‘위대한 인간이란 역경을 극복할 줄 아는 동시에

 그 역경을 사랑할 줄 아는 사람입니다.’ (니체) 

Posted by 미랭군
HTML52016. 6. 14. 10:48

회사에서 망구성도를 그리다가 아크라인을 그릴 일이 생겼다.


여러가지 방법을 생각해보다가 2가지 방법정도로 간추려진 듯 하다.


일단 Canvas상에서 각도 개념은 아래 그림과 같이 우: 0, 아래: 90, 좌: 180, 위: 270으로 아래로 돈다.



function drawCanvas() {

  var canvas = document.getElementById("myCanvas");

  if(canvas.getContext) {

    var canvas_context = canvas.getContext("2d");

    

    var start_degrees = 0;

    var strat_angle = (Math.PI/180) * start_degrees;

    var end_degrees = 180;

    var end_angle = (Math.PI/180) * end_degrees;

   

    canvas_context.beginPath();

    canvas_context.arc(75, 75, 50, start_angle, end_angle, true);

   

    canvas_context.strokeStyle = "rgb(0, 222, 0)";

    canvas_context.stroke();

}

}


*arc메소드는 x, y, radius, start_angle, end_angle, anticlockwise의 파라미터 순서대로 입력해야한다.

anticlockwise는 반시계방향 여부를 true, false로 결정한다.



참조사이트: http://www.homeandlearn.co.uk/JS/html5_canvas_circles_and_arcs.html



'HTML5' 카테고리의 다른 글

alt, title에서 줄바꿈 처리  (0) 2018.10.11
d3에 대해 배우는 방법 정리  (0) 2014.11.28
특수기호 표시  (0) 2014.10.02
Handsontable 한글 문제  (0) 2014.08.13
부트스트랩 관련 블로그  (0) 2013.08.13
Posted by 미랭군
카테고리 없음2016. 1. 28. 17:00

http://www.sorting-algorithms.com/

Posted by 미랭군
카테고리 없음2015. 11. 17. 17:01

browser: (function () {

var ua = navigator.userAgent.toLowerCase();

var mobile = (ua.search(/mobile/g) != -1);

if (ua.search(/iphone/g) != -1) {

return { name: "iphone", version: 0, mobile: true }

} else if (ua.search(/ipad/g) != -1) {

return { name: "ipad", version: 0, mobile: true }

} else if (ua.search(/android/g) != -1) {

var match = /(android)[ \/]([\w.]+)/.exec(ua) || [];

var browserVersion = (match[2] || "0");

return { name: "android", version: browserVersion, mobile: mobile }

} else {

var match = /(msie) ([\w.]+)/.exec(ua) ||

/(trident)(?:.*? rv:([\w.]+)|)/.exec(ua) ||

/(opera|opr)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||

/(chrome)[ \/]([\w.]+)/.exec(ua) ||

/(webkit)[ \/]([\w.]+)/.exec(ua) ||

ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||

[];


var browser = (match[1] || "");

var browserVersion = (match[2] || "0");


var browserName = {

"msie"   : "ie",

"trident": "ie",

"opr"    : "opera"

};

if (browser in browserName) browser = browserName[browser];


return {

name: browser,

version: browserVersion,

mobile: mobile

}

}

})(),

브라우져체크를 하기 위한 함수로써 navigator.userAgent에 지정된 브라우져 정보를 파싱해서 체크한다.

ua.search(/mobile/g)과 같이 /g 옵션이 들어갈 경우 Global 즉 전체를 검색하겠다는 것이다. 

/g옵션이 들어가지 않을 경우에는 첫번째 검색된 결과만 리턴한다.

/i는 대소문자 구분을 하지 않겠다는 것이다.


일반적인 문자열(literal) 찾기를 할 경우엔 indexOf()가 search()보다 검색속도가 빠르다. 

하지만 search()의 경우엔 정규식을 사용할 수 있다. 상황에 맞게 사용하여야 할 것 같다.



Posted by 미랭군
2015. 11. 17. 16:52

each:  function(obj, callback){

if(obj){

var name, i = 0, length = obj.length,

isObj = length === undefined || Object.isFunction( obj );

if ( isObj ) { 

for ( name in obj ) {

if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {

break;

}

}

} else {

for ( ; i < length; ) {

if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {

break;

}

}

}

}

},


1. obj가 Object형일 경우에는 for in문을 사용하여 Object안에 담긴 모든 key, value를 가져와서 callback함수로 지정된 함수를 호출하여 가공처리 한다.

2. obj가 Object형이 아니고 Array형일 경우에는 배열에 담긴 객체수만큼 루프를 돌면서 callback함수를 호출한다.

Posted by 미랭군
데이터베이스2015. 11. 12. 14:44

[스포일러]

결론부터 말하자면... 


MyISAM, InnoDB, BDB, MEMORY 엔진을 사용할 경우,

NULL도 INDEX를 탄다 !!!


아래는 그 테스트와 MySQL 리퍼런스 링크에 관련된 내용이다.


[문제 제기]

요즘 나의 궁금중 중 하나가, 'MySQL에서 NULL 값이 인덱스를 탈까?' 라는 것이었다.


참고로,

오라클의 경우에는 NULL 일 경우 인덱스를 타지 않고,

그로 인해 NULL일 경우를 검색해야 한다면, FULL SCAN을 해야 한다고 알고 있다.


그래서인지 주위에서는 억지로 인덱스를 태우기 위해

DEFAULT '' 를 속성의 기본값으로 사용하는 경우를 볼 수 있었다.


흠... 평소에도 쓸데 없이 NULL을 사용하지 않고 ''를 사용하던 것에 불만이었던 나...

게다가 얼마 전에 읽었던, 

The Top 20 Design Tips For MySQL Enterprise Data Architects 라는 짧은 PPT에서는 

'필요 없는 경우에 굳이 NOT NULL 을 쓰는 것은 안 좋은 경우' 라고 얘기했기에,


'그럼 한 번 NULL이 인덱스를 타느냐 안 타느냐를 가지고 테스트 해보자'

라는 생각을 하게 되었다.


[테스트]

1. 테이블 준비 및 값 넣기

 1.1. 임시 테이블 생성

-- ---------------------------------------------------------------

CREATE TABLE `nulltest` (

      `id` int(11) NOT NULL auto_increment,

      `col1` varchar(50) default NULL, 

      `col2` varchar(50) default NULL, 

      PRIMARY KEY(`id`), 

      KEY `nulltest_cols` (`col1`, `col2`) 

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

-- ---------------------------------------------------------------


 1.2. 임시 테이블에 널 값의 교차적인 값 입력

(아래 프로시저는 주석을 모두 제거해야 컴파일 됩니다. ^^;;)

-- ---------------------------------------------------------------

CREATE PROCEDURE `p_nulltest`()

BEGIN

 DECLARE number INT DEFAULT 0; --  반복 회수를 위한 변수

 SET @number = 1;  -- 1로 초기화

  WHILE @number < 100000 DO  -- 100000번 수행

   INSERT INTO nulltest (col1,col2) VALUES (

           -- 2로 나누어질 경우 NULL, 그렇지 않을 경우 랜덤숫자를 생성하여 입력

           (CASE mod(@number,2)  WHEN 0 THEN NULL ELSE CASE(ROUND(RAND()*10000) AS CHAR) END), 

           -- 3로 나누어질 경우 NULL, 그렇지 않을 경우 랜덤숫자를 생성하여 입력

           (CASE MOD(@number,3)  WHEN 0 THEN NULL ELSE CAST(ROUND(RAND()*10000) AS CHAR) END) );

   SET @number = @number+1; -- 변수 1증가

  END WHILE;

 END

-- ---------------------------------------------------------------


 1.3. 테스트 수행 

  1.3.1. col1 이 NULL인 경우 인덱스를 타는가?


EXPLAIN SELECT id FROM nulltest WHERE col1 IS NULL;


id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE nulltest ref nulltest_cols nulltest_cols 153 const 50278 Using where; Using index

=> 인덱스를 탄다.



 1.3.2. col1, col2 가 NULL인 경우 인덱스를 타는가?


EXPLAIN SELECT id FROM nulltest WHERE col1 IS NULL AND col2 IS NULL;

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE nulltest ref nulltest_cols nulltest_cols 306 const,const 13298 Using where; Using index

=> 역시 인덱스를 탄다.


 1.4. 분석

 위의 실행계획들을 보면, 둘다 인덱스를 이용하는 것을 볼 수 있으며,

 이로 인해 NULL값도 인덱스에 들어갈 수 있다는 것을 알 수 있다.



[참고 문서]

나.. 웬지 괜히 테스트 한 듯...

MySQL 외국 리퍼런스를 보면.. (난 영어 능력이 딸려서, 한글만 검색하는뎅 ㅠ,.ㅠ)


http://dev.mysql.com/doc/refman/5.0/en/create-index.html


In MySQL 5.0 :

 * 오직 MyISAM, InnoDB, BDB, MEMORY 에서만 인덱스에 NULL을 더 할 수 있다.

 * 오직 MyISAM, InnoDB, BDB 에서는 BLOB, TEXT를 INDEX로 사용할 수 있다. 

   (사족이지만 이것도 좋은 정보)


라고 나온다....


으흐흑~ ㅠ.ㅠ 

이넘의 저질 영어 울렁병... 언제나 고칠런지....

담부턴... 영어 리퍼런스도 항상 같이 보도록 노력하자..





Posted by 미랭군
Beacon2015. 11. 11. 13:10

비콘은 Bluetooth Smart 규격의 무선 신호를 주기적으로 발생시키는 소형장치위성으로부터의 신호를 수신하여

삼각측량으로 수신기의 위치를 식별하는 GPS 다음의 기술로 이해될 수 있으나, 비콘이 발생시키는 신호에는 

위치를 식별할 수 있는 정보는 포함되어 있지 않음

비콘이 설치된 위치 정보를 조합하여 수신기의 위치를 식별하는 것이 가능한데, 50m까지 신호 발생이 가능한 

비콘의 신호세기에 의한 오차가 5cm 수준으로 정밀한 측위가 가능하여 상대적으로 오차가 크고 실내에서 측위가

어려운 비콘이 설치된 위치 정보를 조합하여 수신기의 위치를 식별하는 것이 가능한데, 50m까지 신호 발생이 

가능한 비콘의 신호세기에 의한 오차가 5cm 수준으로 정밀한 측위가 가능하여 상대적으로 오차가 크고 실내에서 

측위가 어려운 GPS를 대체할 수 있는 기술로 인식됨

비콘 신호를 활용한 위치에 대한 측위는 비콘의 설치 정보 등을 활용하여 어플리케이션에서 구현되어야 함

'Beacon' 카테고리의 다른 글

iBeacon의 근접거리(immediate/near/far) 구분은 ?  (0) 2015.11.11
Posted by 미랭군
Beacon2015. 11. 11. 13:07

iOS는 CoreLocation 프레임워크는 비콘으로부터의 신호 수신세기를 이용하여 4가지(immediate/near/far/unknown) 구분으로 어플리케이션의 근접정도를 통지함

immediate는 수cm 이내에 비콘이 위치

near는 수m 이내에 비콘이 위치

far는 비콘의 위치가 10m를 초과한 경우

unknown는 수신기가 비콘의 신호 범위 밖에 위치하는 경우

'Beacon' 카테고리의 다른 글

비콘(beacon)이란 무엇인가 ?  (0) 2015.11.11
Posted by 미랭군