Search Results

Search Results for '분류 전체보기' : 38 POSTS

  1. 2011.05.11 [카드 가계부 어플] 카드플래너 지원기능 37
  2. 2011.05.11 [카드 가계부 어플] 카드플래너 사용 도움말 118
  3. 2011.05.02 [카드 가계부 어플] 카드플래너 피드백 내용 정리 15
  4. 2011.03.16 Parcelable을 사용한 오브젝트 전달 (Object serialization using Parcelable)
  5. 2011.03.10 자바스크립트 클로저(Javascript Closure)

[카드 가계부 어플] 카드플래너 지원기능

[무료] 안드로이드 카드플래너 (카드 가계부)

* 카드플래너는 복잡한 계산/기능은 빼고 카드 사용시 꼭
  필요하다고 생각하는 기능 위주로 넣었습니다

[기본기능]
- 문자메세지 수신 후 데이터 자동 입력
- 위젯기능 (카드별 설정가능)
- 결제내용 정리하여 리스팅
- 카드취소구분(카드취소시 이전결제 내용 자동취소)
- 할부기능지원(할부금액 월별 분할노출)
- 카드별, 분류별(카테고리) 구분 가능
- 카드구분(신용/체크/현금)

[편의기능]
- 예전 결제 데이터를 확인해 자동분류(카테고리) 저장
- 카드별 요구실적 설정
- 수기입력시 예전 사용내역 간편설정
- 결제시 알림바에 노출, 수정
- 결제내용 음성메모
- 터치이벤트(드래그)를 통한 리스팅 이동
- 카드추가/분류(카테고리) 사용자 추가

[정보기능]
- 그래프를 통한 통계기능 제공
- 월 예산설정 (월 사용가능한 금액)
- 월 결제정보 정리(일 예상, 일 평균예상, 초과금액 등)
- 기본 카드대금결제 기간설정 (카드대금 시작일 기준)
- 각 카드별 대금결제 기간설정

[기타기능]
- 결제내용 수기입력, 사용자 수정, 메모가능
- 결제구문 사용자 등록(등록되지 않은 카드포맷 수기추가)
- 결제포맷 DB 실시간 업데이트
- 데이터 백업/복구
- 어플 보호기능(비밀번호 설정)


[+ 추가예정기능]
- CSV 내보내기
RSS :
Response

[카드 가계부 어플] 카드플래너 사용 도움말

[무료] 안드로이드 카드플래너 (카드 가계부) 소개

0. 사용도움말

1. 지원기능

2. 메인화면 도움말

3. 결제리스트 도움말


안드로이드 개발을 이제 막 시작했을때..

'뭘만들지?'라는 막연한 생각을 많이 했습니다

그러던 중 항상 카드값을 계산하기 위해 나의

씨크릿폰을 들고 카드결제 문자를 검색하고

암산으로 숫자를 더해보던

제 자신이 문뜩!! 떠올랐던 것이였습니다..

문자로 오는 결제내용을 분석해서 자동으로

계산이 되면 참 좋겠다고 생각은 했지만..

그게 되나 =.,=? 라고 홀로 읊조리며.. 어영부영

1년 지나고.. 이제 뭔가 만들어보자!! 라는

생각에 미뤄뒀던 개발을 시작해서

이제 어느정도 틀이 잡힌 것 같네요..

이미 동일한 기능을 가진 어플들이 있지만..

역시.. 제가 원하는 기능에 딱 맞지는

않았기 때문에..

제 입맛대로 만들어 보았습니다..

저는 UI의 편리성을 중요시 하기 때문에!!

제 나름대로 편하게 만든다고

만들었는데.. 어떨지는 잘 모르겠네요..

편리하게 사용하셨으면 좋겠네요~



ps. 한달정도 잠을 제대로 못잔 것 같네요
혹 맘에들지 않더라도 비난은 자제좀 굽슨..

RSS :
Response

[카드 가계부 어플] 카드플래너 피드백 내용 정리

- 좋은 어플 감사요^^ 초기 메뉴 화면과 아이콘만 심플하게 다듬어주면 최고겠네요 ㅎ

- 다 좋은데 입출금내역통지서비스 문자까지 합계로 처리되네요. 이 부분 수정 부탁드릴께요^^

- 수고많으시네요 투명위젯부탁드려도될까요^^

- 무이자 할부일경우에는 상관애없지만 할부일경우에는 실제로는 이자가 더붙어서 청구가됩니다
그래서 이자까지 계산해서 표시해주셨으면 하는데요 http://itcomputer.net/help/cc.asp
보시면 대충 틀을 보실수있습니다
단 수수료 %는 카드마다 할부개월마다 다은걸로 알고있는데요 그부분은
사용자가 직접 %를 입력할수있으면좋겠습니다

- 카드결제문자가 mms로 오는경우도있던데요 그 건 어플에서 인식을못하더라구요 혹시 인식가능 하게 만들어주시면안될까요?

- 자동으로 같은날 출금되는 리스트를
매달 입력하지않아도 자동 등록할 수 있는 기능을 추가해
주셨으면 졸겠습니다^^

- 총수입항목을넣어주시면 더계산하기가쉬울거같습니다

- 문자수신 시 자동입력이 이미 가능합니다라고 나옵니다.
하지만 새로운 결제 문자 메시지가 오면 결제리스트에는 나오지가 않습니다.
기존결제추가에만 리스트가 나옵니다.
기존결제추가에서 메뉴 키를 누려면 결제리스트 자동추가를 해야만 결제리스트로 넘어갑니다. (옵티머스 마하)

- 미라크사용하고있는데요 카드결제문자수신후자동등록이되지를않네요..
(미라크 ㅜ.ㅜ)

RSS :
Response
앱을 만들다 보면 인텐트를 통해 단순히 String, int, boolean 같은 기본 타입 뿐 아니고 커스텀 클래스나 오브젝트를 다른 컴포넌트에 전달해 줘야 할 경우가 많다. 그 경우 단순히 그냥 인텐트에 putExtra() 로는  넣어줄 수가 없다.
안드로이드에서는 그런 경우를 위해 자바의 Serialization 개념과 유사한 Parcelable이라는 클래스가 있다.

먼저 이런것이 왜 필요한가 살펴보겠다. 예를 들어 다음과 같은 클래스가 있다고 하자.

public class BookData {
  int _id;
  String title;
  String author;
  String publisher;
  int price;
}

도서관리 앱에서 ListView로 화면에 표시하기 위해 ArrayList<BookData>에 책들의 정보를 넣어 인텐트로 넘겨주려고 하면 BookData 클래스를 그대로 사용할수는 없다. 

오브젝트를 Parcelable 클래스로 만들어 주려면 android.os.Parcelable 인터페이스를 구현해야 한다. 그러므로 아래와 같이 클래스 정의를 변경한다.

public class BookData implements Parcelable {
  int _id;
  String title;
  String author;
  String publisher;
  int price;
}

그리고 android.os.Parcelable 인터페이스에 있는 2개의 메소드를 오버라이드 해 줘야만 한다. 

describeContents() - Parcel 하려는 오브젝트의 종류를 정의한다. 
writeToParcel(Parcel dest, int flags) - 실제 오브젝트 serialization/flattening을 하는 메소드. 오브젝트의 각 엘리먼트를 각각 parcel해줘야 한다.

public void writeToParcel(Parcel dest, int flags) {
  dest.writeInt(_id);
  dest.writeString(title);
  dest.writeString(author);
  dest.writeString(publisher);
  dest.writeInt(price);
}

다음으로 해야 할 일은 Parcel에서 데이터를 un-marshal/de-serialize하는 단계를 추가해줘야 한다. 그러기 위해서 Parcelable.Creator 타입의 CREATOR라는 변수를 정의해야 한다. 이 변수를 정의하지 않으면 안드로이드는 다음과 같은 익셉션을 발생한다.

Parcelable protocol requires a Parcelable.Creator object called CREATOR

아래는 위의 예제인 BookData 클래스를 위한 Parcelable.Creator<BookData>의 코드이다.

public class CustomCreator implements Parcelable.Creator<BookData> {
  public BookData createFromParcel(Parcel src) {
    return new BookData(src);
  }

  public BookData[] newArray(int size) {
    return new BookData[size];
  }
}

BookData.java에 모든 parcel된 데이터를 복구하는 생성자를 정의해 줘야만 한다.

  public BookData(Parcel src) {
    _id = src.readInt();
    title = src.readString();
    author = src.readString();
    publisher = src.readString();
    price = src.readInt();
  }

주의할것은 writeToParcel() 메소드에서 기록한 순서와 동일하게 복구해야만 한다.

전체 코드는 다음과 같다.

...
public class BookData implements Parcelable {
    private String title;
    private String author;
    private String publisher;
    private String isbn;
    private String description;
    private int price;
    private String photoUrl;
   
    public BookData() {
    }
   
    public BookData(Parcel in) {
       readFromParcel(in);
    }

    public BookData(String _title, String _author, String _pub, String _isbn, String _desc, int _price, String _photoUrl) {
         this.title = _title;
         this.author = _author;
         this.publisher = _pub;
         this.isbn = _isbn;
         this.description = _desc;
         this.price = _price;
         this.photoUrl = _photoUrl;
    }

// -------------------------------------------------------------------------
// Getters & Setters section - 각 필드에 대한 get/set 메소드들
// 여기서는 생략했음

// ....
// ....
// -------------------------------------------------------------------------
   

   public void writeToParcel(Parcel dest, int flags) {
           dest.writeString(title);
           dest.writeString(author);
           dest.writeString(publisher);
           dest.writeString(isbn);
           dest.writeString(description);
           dest.writeString(photoUrl);
           dest.writeInt(price);
   }

   private void readFromParcel(Parcel in){
           title = in.readString();
           author = in.readString();
           publisher = in.readString();
           isbn = in.readString();
           description = in.readString();
           photoUrl = in.readString();
           price = in.readInt();
   }
   
   public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public BookData createFromParcel(Parcel in) {
             return new BookData(in);
       }

       public BookData[] newArray(int size) {
            return new BookData[size];
       }
   };
}

Parcelable 오브젝트를 인텐트로 보내는 경우는 다음과 같이 하면 된다.

BookData book = new BookData();
// 각 필드에 값을 넣어줌

Intent i = new Intent(this, ShowBook.class);
i.putExtra("bookInfo", book);
startActivity(i);

인텐트를 받을 ShowBook.java에서는 다음과 같이 Parcelable 오브젝트를 복구하면 된다.

Bundle bundle = getIntent().getExtras();
BookData book = bundle.getParcelable("bookInfo");

ArrayList<BookData>인 경우는 Intent를 만들어 보내는 쪽에서는 다음과 같이 하면 된다.

ArrayList<BookData> bookList = new ArrayList<BookData>();
...
// bookList.add() 메소드를 사용해서 bookList에 BookData 엔트리를 추가
...

Intent i = new Intent(this, BookList.class);
i.putParcelableArrayListExtra("myBooks", bookList);
startActivity(i);

BookList.java (인텐트에 의해 호출되는 액티비티)에서는 다음과 같이 오브젝트를 복구하면 된다.

ArrayList<BookData> bookList;
...
Intent i = getIntent();
bookList = i.getParcelableArrayListExtra("myBooks");

출처 : 
http://arsviator.blogspot.com/2010/10/parcelable%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8-%EC%A0%84%EB%8B%AC-object.html


RSS :
Response

자바스크립트 클로저(Javascript Closure)

클로져(Closure) is what?
Scope에 제약을 받지 않는 변수들을 포함하고 있는 코드블록이다.

이러한 변수들은 코드블럭이나 글로벌 컨텍스트에서 정의되지 않고 코드 블록이 정의된 환경에서 정의된다.

"클로져"라는 명칭은 실행할 코드블록(자유 변수의 관점에서, 변수 레퍼런스와 관련하여 폐쇄적이지 않는) 과 자유변수들에 대한 바인딩을 제공하는 평가 환경(범위)의 결합에서 탄생한 것이다.

사실 저런 이야기 매우 어렵습니다.   그래서 좀더 어렵고 혼돈되게 책에 있는 내용을 인용합니다.

From javascript definitive guide 5th


This combination of code and scope is known as a closure (…). All 
Javascript functions are closures.

When a nested function is exported outside the scope in which it is defined

When a nested function is used in this way, it is often explicitly called a closure


이 코드와 
스코프의 조합은 클로져 알려져 있습니다
자바스크립트 모든 함수들은 
클로져입니다.

중첩합수가 함수 정의하는 것을 스코프 밖에서 이루어질 때 입니다.

중첩함수를 이 방식으로 사용할 때 그것은 자주 명백하게 클로져 불러지고 있습니다.


2008.10.14 추가내용

When a nested function is exported outside the scope in which it is defined

"중첩된 함수가 그 함수가 정의된 유효 범위의 바깥으로 익스포트(export)될 때다."

 (한글 번역서p.191)<낭망백수님 의견>

매우 혼동스러워 집니다.  그래서 클로져라는게 도대체 무엇인지 개념적으로 A = B이다. 라고 답을 낸 다는 것은 너무 단편적인 결론을 요구하는 것이기 때문에 클로져의 개념을 이해하는 것을 목적으로 둡니다..

좀더 빠른 이해를 돕기 위해서 그림으로 표현해봅니다.


outerFn()은 우리가 알고 있는 function입니다.   function을 수행하게 되면 var을 통해서 function 내에서만 사용되거나 설정되는 variable을 가집니다. 이는 달리 말해 function scope에서만 참조되는 변수이지만 경우에 따라 클로져(closure)에 의해서 참조가 가능해진다는 것입니다.

outerFn 내의 var closure='is Closure.'; 는 메모리에 적재를 하게 되고 이는 outerFn이 수행될때 해당 메모리를 참조하게 되고 수행이 종료되고 참조가 없어지면 자동으로 GC(가비지 컬렉션)이 일어나 메모리에서 해제되게 됩니다.

하지만 var closure = 'is Closure.'; 를 어디선가 참조를 하고 있다면 아니 그전에 다른곳에서 참조가 발생할 때 바로 클로져가 생성되면서 클로저를 통해서 해당 variable를 참조하게 됩니다.


위에서 볼때 func에는 outerFn에 의해서 반환된 function을 가지고 있습니다.  이 function은 outerFn이 가지고 있는 내부 variable를 참조하고 있습니다.  이때 outerFn이 갖은 variable을 외부에서 참조하려고 하니 쉽게 private를 public으로 참조하려고 하니 과연 되지 않아야 하지만 우리의 javascript의 유연함은 이뤄 말할 수 없을 만큼의 기능을 가지고 있습니다.

아무튼 그렇게 클로져는 이런 상태에서 private를 참조하려고 시도할 때 발상하여 해당 참조를 해야하는 function의 즉 outerFn의 코드블럭을 클로져를 통해서 참조할 수 있게 됩니다.  클로져 자체가 코드블럭이라 해도 과언이 아니겠습니다.

위의 그림에서는 클로져가 발생했고 이는 GC에 의해서 메모리 해제가 되지 않습니다.  즉 func 이 계속적으로 클로져를 통하여 var closure = 'is Closure.'; 를 계속 참조하고 있기 때문입니다.  그래서 우리는 강제적으로 클로저를 해제할 수 있는 상태를 만들어 주어야 합니다.

var func = outerFn(); 을 하고.
     func('function'); 을 통해서 원하는 결과 값을 얻었다면 var func = null; 을 통해서 클로져를 통한 참조 point를 null 시켜주게 되면 주기적으로 GC에 의해서 메모리에서 반환되게 됩니다.


결론
  Scope에 제약을 받지 않는 변수들을 포함하고 있는 코드블록이다. 
그리고 이는 Javascript에서 메모리 누수를 발생하는 요인중에 하나이다.

RSS :
Response