iOS2019. 5. 27. 20:20

1. NSDictionary -> NSString 

NSMutableDictionary *jsonDic = [[NSMutableDictionary alloc] init];
[jsonDic setValue:[NSNumber numberWithBool:TRUE] forKey:@"result"];
[jsonDic setValue:@"test message" forKey:@"message"];
NSString *jsonDicStr = [NSString stringWithFormat:@"%@", jsonDic];


NSLog(@"jsonDicStr: %@", jsonDicStr);
jsonDicStr: {
message = "test message";
result = 1;
}


2. NSDictionary -> NSData -> NSString 

NSMutableDictionary *jsonDic = [[NSMutableDictionary alloc] init];
[jsonDic setValue:[NSNumber numberWithBool:TRUE] forKey:@"result"];
[jsonDic setValue:@"test message" forKey:@"message"];
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:jsonDic options:NSJSONWritingPrettyPrinted error:nil];
NSString* jsonDataStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

NSLog(@"jsonDataStr: %@", jsonDataStr);
jsonDataStr: {
"result" : true,
"message" : "test message"
}

Json(NSDictionary) 데이터를 바로 NSString 변환하면 Json key에 double quote 제거 된다.
그러므로 Json data를 그대로 출력하려면 NSData로 NSJSONSerialization을 통해서 변환한 후에 다시 NSString으로 변환하여야 제대로된 json  string을 출력할 수 있다.
예) json string을 http통신을 통해 파라미터로 전달 하는 경우

Posted by 위푸
자유글2017. 9. 24. 19:44
이번에 조아테크 이지포지션 갤럭시 S8+ 액정보호 필름에 체험단으로 선정되어 후기남기네요
2주전 S8+ 구매하여 구매처에서 붙여준 싸구려 우레탄 필름 으로 화면보고있었는데 새필름으로 교체하게 되었네요 ^^
감사한 마음이지만 후기는 최대한 객관적으로 써볼까 합니다.

배송받은 조아테크 이지포지션 케이스용 필름입니다 
친절하게 별도 프린트물로 내용물과 동영상에대해서 알려주시는 꼼꼼함 좋네요 


아래는 구성품입니다.
설명서1, 액정보호필름2, 알콜솜2, 부착밀대1, 스티커2 있네요
이정도 구성품이면 필름 붙이는데 필요한 물품은 다 준비해 놓았네요.


조아테크 이지포지션 액정보호 필름 붙이기 전에 찍어 놓은 사진입니다.
구매할때 붙여준 싸구려 우레탄 필름이라 눌린자국도 많고 약간 뿌옇게 화면이 보여 투과율도 상당히 안좋더라구요 ㅠ.ㅠ


기존에 쓰던 액정보호 필름을 떼고 조아테크 이지포지션 케이스용 필름으로 붙이기 시작~
붙이시기 전에 꼭 유투브에서 부착 동영상 보시고 붙이는 방법 숙지하셔서 시작하세요 부착방법이 워낙 쉽긴 하지만 영상은 꼭 한번 보시고
부착 하시는 걸 추천드립니다.
영상은 요기서 보시면 되요 -> https://www.youtube.com/watch?v=-Wf8whjc42g


영상과 설명서를 보면서 거의 부착 마무리 단계입니다.
혼자서 사진찍으면서 부착하다보니 부착과정에 대한 사진을 많이 못찍었네요 ㅠ.ㅠ
이사진은 마지막 남은 윗면 코팅지를 때기전이에요, 이지포지션 답게 쉽게 금방 마지막 단계까지 부착 할수 있습니다. 


마지막 윗면 코팅지를 벗기기위해 스티커를 붙여 놓았습니다 ^^ 
이제 저스티커를 잡고 윗면 코딩지만 벗겨네면 부착 끝~


부착완료~~
확실히 전에 처음  갤럭시S8+ 구매할 때 붙여준 필름보다 깨끗해졌습니다. 
화면도 선명하게 보이는게 화면 투과율도 상당히 좋은거 같네요 



조아테크 이지포지션 갤럭시 S8+ 장단점을 정리해봅니다.
장점
1. 쉬운 부착방법 (정말 쉽습니다. 여태까지 필름 붙이다 실패한 경험이 많아서 예전 스마트폰 사용할 때는 대부분 부착점 가서 부착했는데 조아테크 필름은 워낙 부착방법이 쉬워서 거의 실패 확률이 없다고 보셔도 될꺼 같아요 부착동영상 보시면 왜 그런지 아실것 같습니다.)
2. 투과율 (이전에 사용하던 필름에 비해 확실히 화면이 선명하게 잘보입니다. TPU 필름의 장점이라고 해야할꺼요 투과율이 확실히 이전 우레탄 필름보다 좋다고 느껴지네요) 
3. 터치감 (이것도 TPU 필름의 장점이라고 해야될까요 이전 우레탄 필름에 비해 상당히 부드러운 터치감입니다.)

단점
1. 필름의 눌림자국 (이전 우레탄 필름에 비해서는 많이 생기는것은 아니지만 자국이 조금씩 생기네요 폰 사용할 때는 잘 티가 안나나 액정 끄고 검정화면에서 보면 눌림자국이 조금 보입니다.)

추가로 주의하실게 필름 부착하시면서 밀대 로 너무 세게 여러번 밀어서 부착하면 윗 상단 스피커 부분이 늘어나서 보기가 안좋으실수 있으니 너무 세게 밀면서 부착하지만 않으시면 쉽고 폰에 딱 맞게 잘 부착 하실 수 있으실 겁니다.
Posted by 위푸
자유글2017. 2. 14. 16:46





Posted by 위푸
자유글2017. 2. 3. 01:05

 

 

 

1월1일 새해 첫날에 아디에스에서 결혼반지 계약했어요

 

종로에서 규모도 크고 상당히 멋있고 예쁜 샵으로 유명한데 저희는 모르고있다가 종로 귀금속상가 돌아다니다 종로3가역으로 돌아오는 맞은편 건물에 눈에 딱 들어오게 있는 간판을 보고 저기 좋아보이네 하면서 가게 되었네요 ㅎㅎ

 

카페에서 파는 것보다 맛있다는 그린티라떼를 맛보며

매장 진열장에서 마음에 드는 아디에스 제작 반지, 아크레도 반지를 다양하게 골라 이상형 오디션 처럼

하나나씩 제외 하며 마지막에 고른 아크레도 반지!!! 제외한 반지도 어찌나 이쁜던지 어느 반지를 골라도 좋았을꺼 같아요 ㅎㅎ

 

디자인이며 브랜드 여러가지 다양한 정보를 친절하게 알려주시며 

새해 첫날 구매하신다고 신경써 주신 김태형 매니저님!!! 너무 감사해요~

 

그리고 반지 두께 넓이 스톤 제외 스톤 크기등 제가 원하는대로 바꿀수가 있어 더더욱 좋은 반지를 선택할 수 있어요!

2월 5일날 반지 받으러 가기로 했는데 아크레도 반지 너무 기대되네요 ^^

Posted by 위푸
Android2015. 4. 3. 17:24

모든 파일에서 텍스트 찾기: ctrl + shift + f

해당부분 자동 완성(임포트, 인터페이스 자동 구현 등): alt + enter

정의 된 위치로 이동: ctrl + b

어디에서 사용되어지고 있는지 찾기: alt + f7

모두 찾기: shift + shift

실행: shift + f10

액션 찾기: ctrl + shift + a

이름바꾸기: shift + f6

파라미터 보기: ctrl + p

생성하기(생성자, 세터, 게터등..): alt + insert

자동 임포트: ctrl + alt + o

현재 에디터(클레스)에서 찾기: ctrl + f12

추가1 Android Studio(intelliJ) 의 단축키가 불편하다면 File>Setting>keymap>keymapss 에서 Eclipse등 주로 사용하는 개발툴 단축키로 변경 가능합니다.

추가2 help>Default keymap Reference 메뉴를 클릭하시면 Android Studio(intelliJ) 의 모든 단축키에 대한 설명을 PDF 파일로 다운받을 수 있습니다.

Posted by 위푸
Android2014. 7. 8. 19:52

안드로이드 NDK를 개발할 때 다른 기능 개발을 위해 따로 프로젝트를 나누거나 기존에 개발되어있는 NDK 라이브러리를 가져와서 쓰고 싶을 때가 있습니다.
이때 다른 프로젝트에서 개발된 .so 파일을 이용하여 프로젝트를 개발하려는 경우 빌드설정 방법에 대하여 공유합니다.

1) 개발하려는 프로젝트의 jni폴더에 다른 프로젝트에 개발된 .so파일을 넣어둘 폴더를 생성하고 생성한 폴더에 .so파일을 복사합니다. 그리고 라이브러리를 사용하기 위한 .h(해더파일)을 복사합니다.
2) .so파일을 복사한 폴더에 Android.mk파일을 만든후 아래와 같이 Android.mk에 입력합니다.

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libexttest
LOCAL_SRC_FILES := libexttest.so
include $(PREBUILT_SHARED_LIBRARY)

3)실제 NDK소스를 빌드할 폴더의 Android.mk 파일에 사용할 라이브러리를 명시해 줘야됩니다. 아래와 같이 입력합니다.
LOCAL_C_INCLUDES :=  $(call my-dir)/libexttest
LOCAL_LDLIBS := -L$(call host-path, $(PROJECT_PATH)/libexttest) \
               -lexttest

실제로 NDK 빌드가 정상적으로 된다면 성공한 것입니다. 여기서 중요한 것은 2)번의 include $(PREBUILT_SHARED_LIBRARY)입니다.

Posted by 위푸
Android2014. 4. 6. 13:18

ListView 2개를 ScrollView로 감싸서 ListView2개가 ScrollView 높이를 초과하게 되면 스크롤 되어 보여지게 UI를 구성했습니다.

문제는 ListView 2개의 heigh를 wrap_content나 match_parent를 주고 ScrollView로 감싸게 되면 ScrollView에서는 ListView의 height를 제대로 인식하지 못해서 ScorllView안의 ListView들이 제대로된 height 만큼 표시되지 않고 잘려서 표시되게 됩니다.

그렇다고 ListView에 heigh를 고정 크기로 지정해주게 되면 정작 ListView의 아이템 개수에 맞게 ListViewt를 표시 할수 없는 문제가 생깁니다.

그래서 ListView를 제대로 표시할 수 있는 방법을 찾아보니 ListView의 초기화 및 Item(data)을 갱신한후 ListView의 height를 계산하여 ListView에 LayoutParams을 설정하는 방법이 있더군요 이방법을 적용해보니 ListView가 제대로 표시되고 스크롤도 가능하게 됩니다.

소스코드를 공유 하자면

protected void onCreate(Bundle savedInstanceState) {
        ListView listview1 = (ListView) view.findViewById(R.id.list1);
        ArrayAdapter<Data> adapter = new ArrayAdapter<Data>(this, R.layout.simple_list_item, listData1);
        listview1.setAdapter(adapter);

        ListView listview2 = (ListView) view.findViewById(R.id.list2);
        adapter = new ArrayAdapter<Data>(this, R.layout.simple_list_item, listData2);
        listview2.setAdapter(adapter);

        setListViewHeightBasedOnChildren(listview1);
        setListViewHeightBasedOnChildren(listview2);
}

public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter(); 
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
}

리스트 뷰가 갱신될때 setListViewHeightBasedOnChildren() 호출을 하게 되면 ListView를 ScrollView로 감싸게 UI를 구성하더라도 ListView 정상적으로 표시되고 스크롤이 되게 됩니다.

 

Posted by 위푸
Android2013. 6. 13. 20:34

Drawable에 Image(bitmap)를 가져와서 지정해주고 colorFilter를 지정해 주면 bitmap에 ColorFilter가 적용된 Drawable을 이용하여 view에 배경을 지정해 줄 수 있습니다.

보통의 경우

BitmapDrawable bd = new BitmapDrawable(bitmap);
view.setBackgroundDrawable(bd );


위와 같이 적용하면 되는데
아래와 같이 stateDrawable을 사용하여 배경을 지정해 주게 되면 ColorFilter가 적용되지 않은 원본 bitmap 배경이 지정되는 문제가 생깁니다.

BitmapDrawable bd = new BitmapDrawable(bitmap);
StateListDrawable stateDrawable = new StateListDrawable();
stateDrawable.addState(new int[]{-android.R.attr.state_pressed}, bd);
view.setBackgroundDrawable(stateDrawable); 

그러하여 위와 같은 문제를 해결하기 위해서

Bitmap orgBitmap = getResources().getDrawable(id);
paint = new Paint();
Bitmap copyBitmap = Bitmap.createBitmap(orgBitmap.getWidth(), orgBitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(copyBitmap);
canvas.drawBitmap(orgBitmap, 0, 0, paint);
BitmapDrawable bd = new BitmapDrawable(copyBitmap);
StateListDrawable stateDrawable = new StateListDrawable();
stateDrawable.addState(new int[]{-android.R.attr.state_pressed}, bd);
view.setBackgroundDrawable(stateDrawable);

위와 같이 ColorFilter를 적용하여 새로 만든 Bitmap에 그리고 StateListDrawable에 새로 만든 bitmap을 지정한 Drawable을 적용하게 되면 StateListDrawable을 사용하게 되도 ColorFilter가 적용된 배경이 보여지게 됩니다.

 

 

Posted by 위푸
Android2013. 5. 31. 18:30

NetworkOnMaintThreadeEception 이 발생하는 원인이 여러가지 있겠지만 그 중 한가지로 안드로이드 3.0(honeycomb) 부터 기본적으로 수행되는  StrictMode때문에 발생할 수 있습니다. App이 실행되는 os가 honeycomb이하의 경우는 정상정으로 실행되나 honeycomb이상의 os부터는 NetworkOnMaintThreadeEception 이 발생 하면서 App이 정상 동작을 하지 않는 이유입니다.

Android에서  Strict Mode 도입하게 된 이유나 사용법에 대해서는 아래 블로그 참조 

http://dev.kthcorp.com/2012/01/31/android-strict-mode-howto/


NetworkOnMaintThreadeEception을 처리하기 가장 좋은 방법은 mainThread에서 하는 네트워크 관련 작업등 mainThread에서 오래 실행되는 작업을 새로운 Thread를 통하여 실행되게 수정하는 것이 가장 좋은 방법입니다.  

아래 블로그 참조

http://ironheel.tistory.com/48

http://ralf79.tistory.com/85


이외에 Thread 분리 작업이 너무 많아져서 임시로 NetworkOnMaintThreadeEception을 처리하고 싶은 경우는 아래의 코드를 Activity의 onCreate()에 넣어주시면 NetworkOnMaintThreadeEception가 발생되지 않습니다. 

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

중요한 점은 임시로 처리 하는 방법이기 때문에 오래 실행되는 작업은 mainThread와 따로 Thread를 분리하는 방법으로 Exception을 처리하는걸 권장합니다.

Posted by 위푸
스크랩2011. 10. 10. 13:32

<청명한 가을 걷기 좋은 길 `베스트 10'>

연합뉴스 | 안홍석 | 입력 2011.10.10 11:38

(서울=연합뉴스) 안홍석 기자 = 10월 청명한 가을 하늘 아래 선선한 바람과 따사로운 햇볕을 맞으며 연인이나 가족과 함께 서울의 아름다운 길에서 추억의 한 페이지를 채워보면 어떨까.

서울시는 가을을 맞아 도보여행 전문가 윤문기씨의 추천으로 숲길ㆍ하천길ㆍ공원길ㆍ역사문화길의 4가지 테마로 `가을철 걷기 좋은 서울길 베스트 10'을 선정했다고 10일 밝혔다.

아름다운 숲길을 즐길 수 있는 곳으로는 `북한산 방학 능선길' `불암산 숲길' 등 6개 코스가 선정됐다.

도봉구의 `북한산 방학 능선길'은 지하철 도봉역에서 시작해 무수골 숲길, 원통사를 거쳐 방학성당에 이르는 7.6㎞ 코스다.

아무런 근심이 없다는 뜻의 `무수골' 숲길을 거닐며 북한산의 아름다운 풍광과 기세를 마음에 한가득 담을 수 있다.

특히 우이암 아래 자리잡은 신라시대 고찰인 원통사에서 내려다 볼 수 있는 탁 트인 주변 경치가 일품이라는 평이다.

`불암산 숲길'은 상계역에서 출발해 불암산 입구, 학도암, 화랑대를 잇는 8.8㎞ 코스다.

겉보기에 산세가 험해 보이지만 실제 걸어 보면 학도암에 위치한 마애관음상의 온화한 미소처럼 부드럽고 쉽다. 불암산의 기암괴석을 감상하는 즐거움이 있다.

시원한 물소리와 함께하는 하천길로는 `성동 송정둑길'이 선정됐다. 어린이대공원을 거치는 이 길은 아이들과 함께 가을 소풍을 떠나기에 최적인 코스다.

송정동 둑길에 들어서면 자전거도로 포장이 돼 있어 유모차를 끌기에도 좋다.

자연 뿐 아니라 조상의 숨결과 삶까지 느낄 수 있는 역사문화길로는 `홍릉 수목원길'이 선정됐다.

홍릉수목원은 우리나라 최초의 수목원으로 44만㎡ 면적에 수많은 기화요초가 거대한 정원을 꾸리고 있다. 이곳을 가로지르는 2㎞ 산책로는 `도심 속 오아시스'로 부르기에 손색이 없다는 평가다.

홍릉수목원은 토요일과 일요일에만 개방한다.

`가을철 걷기 좋은 서울길 10선'을 포함해 생태문화길 전체의 자세한 코스는 서울시 생태정보시스템 홈페이지(econinfo.seoul.go.kr)에서 확인할 수 있다.
Posted by 위푸