2013년 5월 26일 일요일

[사무실꾸미기] 탁상 선풍기 추천 - 한국모리타 모리타 MKF-18KA

 사무실 에어컨은 빵빵한데 내자리로 바람이 잘 오지 않아 선풍기를 구매 하기로 했습니다. 예전에 박스형 선풍기를 썼었는데 오래되서 먼지도 많이 끼고 소리도 거슬려 새것을 고르던 중... 외근 나가있는 형이 자기것 쓰라길래 이 녀석을 사용해 보기로 했는데... 

1. 바람세기
 쩜니다... 틀기 전까지만 해도 살짝 더워서 짜증나는 정도 였는데 틀고 나니 춥습니다. 물론 기본 적으로 사무실에 에어컨이 가동 되고 있어 에어컨 바람이 잘만 오면 시원한 상황입니다만 ㅎㅎ 또한 바람의 유효 사거리(?)가 좀 깁니다. 사거리상에 바람에 민감한 분이 있다면 그분께 향하지 않도록 주의 해야 하겠습니다. 

2. 소음
 데스크탑 쿨러 소리 같은 느낌이고 강으로 하니 좀 시끄럽네요. 약으로 틀어도 풍량은 뛰어나니 민감한 분이 아니라면 괜찮을듯 하네요. 

3. 필요공간
 일반 선풍기와는 달리 반구형으로 둥글게 생겼습니다. 따라서 차지 하는 공간도 넓은데요. 실질적으로 그렇지 만도 않은게... 일반 선풍기는 뒤에 공간이 넉넉치 않으면 바람 세기가 약해집니다. 하지만 이녀석은 바로 뒤에 가방을 두어도 바람세기가 전혀 줄지를 않네요. 아마 원형으로 생겨서 모든 방향에서 바람을 땡겨(?)오기 때문으로 보여 집니다.

 이러한 연유로 강력 추천 합니다. 다만 책상이 좁거나, 본인이나 주위 사람이 소음에 민감 하다면 비추 입니다.

가격 비교 링크
http://shopping.naver.com/detail/detail.nhn?cat_id=40009663&nv_mid=5517909966&frm=NVSCMOD&query=MKF-18KA

 홈페이지에 있는 제품 사양
 

 사무실 책생에 올려 놓은 모습
 

 바람 세기 조절 레버가 있는 뒷모습
 

[iPhone] 아이폰 iOS 개발 책 추천


아이폰 개발 책 추천
프로그래밍 오브젝티브-C 2.0
스티븐 코찬 저/박세현 역
iOS 6 프로그래밍
닐 스미스 저/황반석 역
시작하세요! Cocos2d-x 프로그래밍
이재환 저
시작하세요! iOS 6 프로그래밍
데이브 마크,잭 너팅,제프 라마시,프레드릭 올슨 공저/유윤선 역
[예약판매] The Core iOS 6 Developer's Cookbook 한국어판
에리카 세든 저/동준상,송용근 공역
예스24 | 애드온2

각 디바이스의 해상도 및 DPI 정보

각 디바이스의 해상도및 DIP정보가 잘 정리되어 있는 페이지 입니다.

아이폰 시리즈는 5까지 있고 겔럭시는 3까지만 업데이트 되어 있네요.
계속 업데이트 되니 북마크 해두었다가 참고하시면 될듯 합니다.

http://screensiz.es/

2012년 7월 10일 화요일

[안드로이드] API15>16젤리빈 변경 클래스 - ContentResolver

public final ContentProviderClient acquireUnstableContentProviderClient (Uri uri)

Since: API Level 16
acquireContentProviderClient(Uri)와 흡사하나, 대상 컨텐트 프로바이더의 안정성을 신뢰하지 않는 경우 사용한다. 이는 대상 컨텐트 프로바이더의 프로세스가 사라질 경우, 컨텐트 프로바이더에 의존된 프로세스들의 플랫폼 클린업 메카니즘을 해제 한다. 일반적으론, 한번 프로바이더를 얻으면 필요한 만큼 제약없이 사용 할 수 있으며, 프로세스가 백그라운드 상태여도 사라지지도 않는다고 가정 할 수 있다. 이 메소드를 사용 하면, 프로바이더와의 통신중 어떠한 오류가 발생 하더라도 나중에 재연결 할 수 있게, 반드시 close에 주의를 기울여야 한다. 특히, DeadObjectException을 잡아 컨텐트 프로바이더가 죽어버렸다는 걸 알 수 있는데, 이는 현재 ContentProviderClient 오브젝트가 유효하지 않으며, 이를 해제 해야 한다는 것을 나타낸다. 만일 프로바이더를 재시작해 새로운 작업을 수행하려 한다면, 새로 얻으면 된다.

public final ContentProviderClient acquireUnstableContentProviderClient (String name)

Since: API Level 16
acquireContentProviderClient(String)와 흡사 하나,  대상 컨텐트 프로바이더의 안정성을 신뢰하지 않는 경우 사용한다. 이는 대상 컨텐트 프로바이더의 프로세스가 사라질 경우, 컨텐트 프로바이더에 의존된 프로세스들의 플랫폼 클린업 메카니즘을 해제 한다. 일반적으론, 한번 프로바이더를 얻으면 필요한 만큼 제약없이 사용 할 수 있으며, 프로세스가 백그라운드 상태여도 사라지지도 않는다고 가정 할 수 있다. 이 메소드를 사용 하면, 프로바이더와의 통신중 어떠한 오류가 발생 하더라도 나중에 재연결 할 수 있게, 반드시 close에 주의를 기울여야 한다. 특히, DeadObjectException을 잡아 컨텐트 프로바이더가 죽어버렸다는 걸 알 수 있는데, 이는 현재 ContentProviderClient 오브젝트가 유효하지 않으며, 이를 해제 해야 한다는 것을 나타낸다. 만일 프로바이더를 재시작해 새로운 작업을 수행하려 한다면, 새로 얻으면 된다.

public final Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal)

Since: API Level 16
주어진 URI로 쿼리를 수행해, 결과 집합의 Cursor를 리턴 한다.
최적의 성능을 위해, 호출자는 다음과 같은 가이드 라인을 따라야 한다:
  • 사용되지 않을 데이터를 저장소에서 읽는 것을 막기 위해 명시적인 프로젝션을 사용하라. 
  • selection 파라메터에 명시적인 값 대신에 'phone=?'와 같은  물음표 파라메터 마커를 사용하여, 해당 값만 다르게 하여 캐 동일한 쿼리로 인식 될 수 있도록 하라.
Parameters
uri컨텐트를 명시하기 위해 content:// 스키마를 사용하는 URI.
projection리턴받을 column의 리스트. NULL을 넣으면 모든 column을 리턴 하므로 비효율적임.
selection어떤 row를 리턴 할지 SQL WHERE 구문(WHERE 자체는 제외)형식으로 선언한 필터. NULL을 넣으면 모든 주어진 URI의 모든 row를 리턴함.
selectionArgs만일 selection에 ?를 사용 했다면, 순서대로 selectionArgs의 값들로 치환된다. 값들은 Strings으로 묶이게 된다.
sortOrder각 row를 어떻게 나열할지 SQL ORDER BY 구문(ORDER BY 자체는 제외) 형식으로 지정. NULL을 넣으면 기본값인 "unordered"가 사용된다.
cancellationSignal처리 중에 해당 작업을 취소시키기 위한 시그널로 없으면 null지정. 작업이 취소되면 쿼리가 수행된 후 OperationCanceledException 이 던져 진다.
Returns
  • 첫 항목의 바로 전을 가리키는 Cursor 오브젝트, 또는 null
See Also

[안드로이드] 젤리빈 추가 클래스 - CancellationSignal

원문
http://developer.android.com/reference/android/os/CancellationSignal.html
public final class
CancellationSignal
extends Object
java.lang.Object

android.os.CancellationSignal

Class Overview


진행중인 작업을 취소 할 수 있는 기능을 제공 합니다.

Summary


Nesterd Classes
interfaceCancellationSignal.OnCancelListener취소 후 호출될 리스너.
Public Constructors
CancellationSignal ()
 취소 시그널을 생성하며, 처음엔 취소되지 않은 상태 입니다.
Public Methods
voidcancel ()
작업을 취소하고 취소 리스너에 알립니다.
booleanisCanceled ()
작업이 취소되었다면 true를 반환합니다.
voidsetOnCancelListener ( CancellationSignal.OnCancelListener listener)
취소되면 호출될 취소 리스너를 지정합니다.
voidthrowIfCanceled ()
작업이 취소되면 OperationCanceledException을 던집니다..

[펼치기]
Inherited Methods
 From class java.lang.Object

Public Constructors



public CancellationSignal ()

Since: API Level 16 
취소 시그널을 생성하며, 처음엔 취소되지 않은 상태 입니다.

Public Methods



public void cancel ()

Since: API Level 16 
작업을 취소하고 취소 리스너에 알립니다. 만일 작업이 아직 시작되지 않았다면, 가능한한 바로 취소됩니다.

public boolean isCanceled ()

Since: API Level 16 
작업이 취소되었다면 true를 반환합니다.
Returns
  • 작업이 취소되었다면 True.

public void setOnCancelListener CancellationSignal.OnCancelListener linstener)

Since: API Level 16 
취소시 호출될 취소 리스너를 설정합니다. 이 메소드는 오래 걸리는 작업을 수행하는 동안, 취소 요청을 처리할 목적으로 데이터베이스나 컨텐트 프로바이더와 같은 취소 시그널의 수신자에 의해 사용될 것입니다. 이 메소드는 응용 프로그램 자체에서 사용되도록 의도된 메소드가 아닙니다. 만일 cancel()이 이미 호출 되었다면, 지정된 리스너도 즉시 호출됩니다. 이 메소드는 리스너가 제거된 뒤에는 호출되지 않음을 보장 합니다.
매개 변수
listener취소 리스너, NULL값을 지정하면 현재 지정된 리스너를 제거함.

public void throwIfCanceled ()

Since: API Level 16 
작업이 취소되면 OperationCanceledException을 던짐.
Throws
OperationCanceledException작업이 취소됨.

2012년 7월 8일 일요일

[안드로이드] 멀티스크린과 안드로이드 마켓


안드로이드 마켓에 릴리즈시 하나의 어플리케이션에 두개의 APK파일을 등록할 수 있는 MultipleScreens 기능이 있다.

AndroidManifest.xml 의 스크린사이즈가 다르거나 SDK Version이 다른 두개의 APK파일을 업로드 하여 Publish하면 되는거.. 하지만 해상도의 구분이 애매하였다.

열심히 구글링을 해보면...아래값들을 컨트롤하면 된다.
smallScreens = true (normalScreens 보다 작은 사이즈 지원)
normalScreens = true (normalScreens 사이즈 지원)
largeScreens = true (normalScreens 보다 큰 사이즈 지원)
xlargeScreens = true (largeScreens 보다 큰 사이즈 지원)


requiresSmallestWidthDp = 600 (Android 3.2 API Level 13이후부터 지원하는 attribute. 
600에 largeScreens = true, xlargeScreens = true를 설정하면 타블렛만 지원되는 어플이 된다.)


<supports-screens android:resizeable=["true"| "false"]
                  android:smallScreens = ["true" | "false"]
                  android:normalScreens = ["true" | "false"]
                  android:largeScreens = ["true" | "false"]
                  android:xlargeScreens = ["true" | "false"]
                  android:anyDensity=["true" | "false"]
                  android:requiresSmallestWidthDp="integer"
                  android:compatibleWidthLimitDp="integer"
                  android:largestWidthLimitDp="integer"/>

즉.....2.3에선 requiresSmallestWidthDp를 사용할 수 없고, 갤노트와 갤S2는 아래와 같이 구분하여 적용 시키면 마켓 필터링이 가능하다.


*. 갤럭시 S2
<supports-screens
     android:smallScreens="false"
     android:normalScreens="true"
     android:largeScreens="false"
     android:xlargeScreens="false"
     android:anyDensity="true"
/>


 *. 갤럭시 노트
<supports-screens
     android:smallScreens="false"
     android:normalScreens="false"
     android:largeScreens="true"
     android:xlargeScreens="false"
     android:anyDensity="true"
/>

추가로 엄청 중요한 사항이 생겼다. 위와 같이 했을 경우 마켓 릴리즈시 버전코드가 갤럭시 S2가 더 낮아야 한다. 즉!! 갤럭시 S2의 버전코드가 100이라면 갤럭시 노트의 버전코드는 101이 되어야 정상적인 릴리즈가 가능하다. 만약 갤럭시 노트의 버전 코드가 더 낮다면 빨간색 에러줄을 마주치게 된다. 아...이것때문에 엄청 암울했는데...ㅠㅠ 
혹 여기서 10.1인치를 필터링 시키려면 안드로이드마켓 등록시 지원등록단말에서 수동 삭제하면...ㅋㅋㅋㅋ된다.
내가 삽질한건??? 내가 원한건 다른 사이즈들은 다빼고 딱 normalScreens만 지원하고 싶었을 뿐인데...
이게 normalScreens = true로 하고, 다른 스크린을 false로 설정해도 normalScreens~xlargeScreens까지 지원된다는거다...
그래서 찾아보다가 아래와 compatible-screens를 찾게되었다. 역기서 screenSize="normal"로 설정하면 마켓상에서 딱!!! normalScreens만 지원된다...
허나...compatible-screens를 적용시키면 지원단말에서 국산단말은 제외되고, 해외향 단말만 지원된다.
젠장...된장...진장...아래처럼 모든 Density에 모든 screenSize를 설정해도 국내향단말은 지원단말에서 제외되어있다...ㅠㅠㅠㅠ
이걸 하나씩 확인해보다...왜 갤노트는 제외되지...왜 갤S2는 제외되지...
그러다 모든걸 적용시켜도 안된다는걸 알고 포기함.

    <compatible-screens>
        <screen android:screenDensity="xhdpi" android:screenSize="small"/>
        <screen android:screenDensity="ldpi" android:screenSize="small"/>
        <screen android:screenDensity="mdpi" android:screenSize="small"/>
        <screen android:screenDensity="hdpi" android:screenSize="small"/>
        <screen android:screenDensity="xhdpi" android:screenSize="normal"/>
        <screen android:screenDensity="ldpi" android:screenSize="normal"/>
        <screen android:screenDensity="mdpi" android:screenSize="normal"/>
        <screen android:screenDensity="hdpi" android:screenSize="normal"/>
        <screen android:screenDensity="xhdpi" android:screenSize="xlarge"/>
        <screen android:screenDensity="ldpi" android:screenSize="xlarge"/>
        <screen android:screenDensity="mdpi" android:screenSize="xlarge"/>
        <screen android:screenDensity="hdpi" android:screenSize="xlarge"/>
        <screen android:screenDensity="xhdpi" android:screenSize="large"/>
        <screen android:screenDensity="ldpi" android:screenSize="large"/>
        <screen android:screenDensity="mdpi" android:screenSize="large"/>
        <screen android:screenDensity="hdpi" android:screenSize="large"/>    
     </compatible-screens> 

1. 마지막으로 dpi구하는 공식
  context.getResources().getDisplayMetrics().density; 
2. dpi를 픽셀로 변환하는 공식
public static int convertDipToPx(Context context, int dip){
  final float scale = context.getResources().getDisplayMetrics().density;
  return (int) (dip * scale + 0.5f);
}


참조 : http://sptraulyo.tistory.com/447