2013년 3월 28일 목요일

MongoDB 제한자

제한자?
MongoDB에서 문서의 부분 갱신은 원자적 갱신 제한자(update modifier)를 사용해 매우 효율적으로 수행할 수 있다. 갱신 제한자는 키를 변경, 추가 또는 제거하고 배열과 내장 문서를 조작하는 복잡한 갱신 연산을 지정하는 데 사용되는 특수 키이다.

“$set”

  • 키의 값을 설정한다. 키가 존재하지 않으면 생성, 스키마를 갱신하거나 사용자 정의 키를 추가할 때 사용.
  • 심지어 키의 데이터형도 변경할 수 있다.
  • 내장 문서 내부의 데이터를 변경할 때 쓸 수 있다. {"$set” : {“author.name” : “joe schmoe”}}

“$unset”

  • 키와 값을 모두 제거할 수 있다.

“$inc”

  • 이미 존재하는 키의 값을 변경하거나 새롭게 키를 생성하는데 사용
  • 투표와 같이 자주 변하는 수치 값을 갱신하는 데 유용
  • "$set”과 비슷하지만 숫자를 증감을 목적으로 사용.
  • 정수, long, double 형의 값에만 사용, 다른 데이터형에 사용할 수 없다.

“$push”

  • 배열 제한자
  • 지정된 키가 이미 존재하면 배열의 끝에 요소를 추가하고, 그렇지 않으면 새로운 배열을 생성해 추가한다.

“$nc”

  • 배열 제한자
  • 지정된 키가 존재하는지 확인

“$addToSet”

  • 배열 제한자
  • "$nc”+”$push”와 같은 기능을 한다, 즉 중복을 피해서 배열에 추가할 때 사용.

"$each”

  • "$addToSet”과 함께 사용하여 여러 개의 값을 중복을 피해서 배열에 추가할 수 있게 된다.

“$pop”

  • 배열을 스택이나 큐로 사용.
  • {$pop : {key : 1}} → 배열의 끝부터 요소를 제거
  • {$pop : {key : -1}} → 배열의 처음부터 제거

“$pull”

  • 배열에서 하나의 문서만 지우는 것이 아니고 일치하는 모든 문서를 제거한다.

제한자의 속도
"$inc”는 제잘에서 문서를 수정한다, 즉 문서의 크기를 변경할 필요가 없어 매우 효율적이다. 반대로 배열 제한자는 문서의 크기를 변경할 수도 있기 때문에 느릴 수도 있다.

2013년 3월 21일 목요일

Android에서 PhoneGap을 이용한 첨부파일 다운로드 및 열기


Android와 PhoneGap을 이용하여 Web상에 존재하는 첨부파일을 다운로드하고 이를 Phone에 설치된 App으로 여는 예제를 설명하도록 하겠습니다.

본 예제에서 사용된 PhoneGap 버전은 2.5 입니다.

아래와 같이 "첨부"에 링크를 걸게 됩니다.

<a href='javascript:getFileDownload("http://i3.kym-cdn.com/entries/icons/original/000/000/080/doubt.jpg”);''><img src='../images/ico_att.gif' style='vertical-align: top;'>첨부</a>

function getFileDownload() {
fileDownload(remoteFile, onCallback);
}

function onCallback(entry) {  → 파일다운로드가 완료되면 호출되는 CallBack Method
cordova.exec(
function(result) {
}, function(error) {
console.log("Error: "+e);
}, "UrikidsPlugIn", "showFile", [entry.fullPath]);
}



PhoneGap의 FileTransper.Download API을 이용한 ‘getFileDownload' JavaScript은 아래와 같습니다.


var localFilePath = "Hurukku/";
...
function fileDownload(remoteFile, callback) {
   var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
   window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {
       fileSystem.root.getFile("dummy.html", {create: true, exclusive: false}, function(fileEntry) {
           var localPath = fileEntry.fullPath;
           
           if (device.platform === "Android" && localPath.indexOf("file://") === 0) {
               localPath = localPath.substring(7);
           }
           
           localPath = localPath.replace("dummy.html",localFilePath+localFileName);
           window.dialog.showDialog();
           var ft = new FileTransfer();
           ft.download(
            encodeURI(remoteFile),
               localPath,
               function(entry) {
            window.dialog.dismissDialog();
       console.log("download complete: " + entry.fullPath);
       if(callback != null) {
       callback(entry);        
       }
   },
   function(error) {
       window.dialog.dismissDialog();
       console.log("download error source " + error.source);
       console.log("download error target " + error.target);
       console.log("upload error code" + error.code);
   }
           );
       }, fail);
   }, fail);
}


  • localFilePath: 파일이 다운로드 될 위치로 안드로이드 경우 기본적으로 "storage/sdcard”영역 아래로 지정된다.
  • remoteFile: 첨부 파일의 Web상 위치
  • callback: 첨부 파일 다운로드 완료후 호출될 JavaScript Method
  • dummy.html: localStorage Path을 찾기위해 사용되는 임미의 파일 이름으로, localFileName으로 변환 됨.


첨부파일을 Phone에 설치된 App으로 열기위해서 PhoneGap의 Custom Plugin에 "showfile" 메서드를 만들고 callback 메서드에서 호출하게 한다.


public void showFile(String filePath) {
Log.d(this.getClass().getSimpleName(), filePath);
filePath = filePath.substring(7);
Log.d(this.getClass().getSimpleName(), filePath);
File file = new File(filePath);
if (file.exists()) {
MimeTypeMap mtm = MimeTypeMap.getSingleton();
String fileExtension = filePath.substring(filePath.lastIndexOf(".") + 1, filePath.length()).toLowerCase();
String mimeType = mtm.getMimeTypeFromExtension(fileExtension);

if (mimeType != null) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), mimeType);
try {
MainActivity.thisActivity.startActivity(intent);
} catch (ActivityNotFoundException ane) { → 지원하지 않는 파일 형식일경우.
     …
}
} else { → mimeType을 가져오지 못할 경우.
}
} else { → 현재 위치에 파일이 없는 경우.
}
}


블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...