Saturday, May 30, 2015

AppStore 자동갱신 구독 해지하기

얼마전에 내가 주로 쓰는 메모 프로그램인 에버노트에서 내용이 삭제되었다. 그래서 삭제된 메모 내용을 복구하는 방법을 알아 보던중 에버노트 프리미엄에서는 히스토리를 관리해주는 기능이 포함되었다는 것을 알았다.

그래서 최저가로 프리미엄을 사용하는 방법을 고려해보니 월 $5.99 USD를 지불하는 것이 가장 저렴했다. 결국 월 $5.99 USD를 결제하고 내용을 복구하였는데 문제는 이것이 월별로 자동으로 갱신되어 결제되는 구독방식이라는 것이다.

그래서 한달이 지나가기전에 해지하는 방법을 알아보다가 찾아낸 방법을 공유한다.(나는 맥 AppStore에서 구매했다.)

일단 AppStore - 스토어 - 나의 계정 관리로 들어간다.


그리고 다음과 같이 구독 정보를 확인하고, 구독을 삭제하면 된다.




Wednesday, May 27, 2015

Tuesday, May 26, 2015

Mac용 SVN 클라이언트 Versions 구매 및 사용후기

얼마전에 맥에서 작업을 편하게 하기위해서 맥용 SVN 클라이언트인 Versions를 정품 구매했다. 원래 윈도우에서는 TortoiseSVN을 사용했었는데 매번 패러랠즈로 들어가서 작업하는게 귀찮았기 때문이다.

그런데 지금은 결국은 Versions는 update 및 간단한 commit시에만 사용하고, add나 compare는 패러랠즈로 들어가서 TortoiseSVN를 사용한다. 왜냐면 Versions는 신규 파일 add가 불편하고 compare도 거의 기능이 지원이 잘 안된다.

Versions를 구매하실 분은 참고하길 바란다.

Thursday, May 21, 2015

Android 액션바 앱로고 아이콘 추가하기

액션바에 앱로그 아이콘을 추가하는 방법이다. 아이콘이라고 해서 setIcon()하기 쉬운데 다른 버튼 아이콘과 구분하기 위해서 setLogo()를 해야 한다.

android.support.v7.app.ActionBar actionBar = getSupportActionBar();
actionBar.setLogo(R.mipmap.ic_launcher);
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);


Android 액션바 동적으로 숨기기/보이기

액션바와 타이틀바를 구분하지 못하던 때에는 계속 타이틀바를 동적으로 숨기기/보이기에 대해서 연구했는데 액션바로 구현을 하면서 모든 것이 해결이 되었다.

액션바를 위해서 다음과 같이 windowActionBarOverlay를 true로 설정한다. 동적으로 나타날거기 때문에 겹쳐지게 해야 한다.
res/values/styles.xml
   <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:windowActionBarOverlay">true</item>
        <!-- Support library compatibility -->
        <item name="windowActionBarOverlay">true</item>

        <item name="android:actionBarStyle">@style/MyActionBar</item>
    </style>

    <style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    </style>

그리고 AppTheme를 Activity에 적용한다.
AndroidManifest.xml
android:theme="@style/AppTheme"

그런다음 다음과 같이 ActionBar를 얻어서 동적으로 show/hide를 하면 된다. 기존의 타이틀바와 다르게 setContentView()의 위치와 상관없이 동작한다.
        android.support.v7.app.ActionBar actionBar = getSupportActionBar();
        actionBar.hide();

Wednesday, May 20, 2015

Android ZipInputStream.getNextEntry에서 UTFDataFormatException 발생시

안드로이드에 내장된 zip라이브러리를 사용시에 UTFDataFormatException가 발생할 경우, 이것은 안드로이드 내장 zip라이브러리가 유니코드 파일명을 처리하지 못해서 발생하는 경우이다.

이럴때는 zip4j와 같은 써드파티 라이브러리를 사용해야 한다.

Android You need to use a Theme.AppCompat theme (or descendant) with this activity.

"You need to use a Theme.AppCompat theme (or descendant) with this activity."

이 에러메세지가 발생하는 것은 ActionBarActivity일때 테마를 Theme.AppCompat 테마를 사용하지 않아서이다.

1. 간단하게 해결하는 방법은 ActionBarActivity 대신에 Activity를 상속 받는 방법이다.
2. 또다른 방법은 styles.xml에서 다음과 같이 테마를 수정해 주는 방법이 있다.
    <style name="AppTheme" parent="android:Theme.Light">
        <!-- Customize your theme here. -->
    </style>

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

커스텀 타이틀바를 만드는 과정에서 많은 착오가 있었는데 스타일을 반드시 정복해 봐야겠다.


Friday, May 15, 2015

Android Studio Mac JDK 7.0 적용하기

최근에 Eclipse에서 Android Studio로 개발툴을 옮겼다. Eclipse가 최신 Android SDK에서 다운 현상이 많이 발생하여 더 이상 업무에 사용하지 못할 수준이었기 때문이다.

그리고 Android 5.0이상은 JDK 7.0을 요구하는데 맥의 기본 JDK는 버전이 6.0이다. 그래서 따로 7.0을 다운 받아서 설치하여 Android Studio에 설정을 해주어야 한다.

JDK 7.0은 설치 패스가 6.0과는 다른 곳에 있어서 찾는데 시간이 걸렸다. 다음과 같이 하면 JDK 7.0 패스를 설정할수 있다.

참고할만한 사항은 /Users/xxx/Library가 아니라 /Library아래에 있다.

[File] - [Project Structure]



Monday, May 11, 2015

Android 백키 종료 AlertDialog 만들기

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("종료");
                builder.setMessage("종료하시겠습니까?");
                DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        if(dialog != null) {
                            dialog.dismiss();
                        }

                        if(which == DialogInterface.BUTTON_POSITIVE) {// 확인
                            finish();
                        }
                        else if(which == DialogInterface.BUTTON_NEGATIVE) {// 취소
                        }
                    }
                };
                builder.setPositiveButton("확인", listener);
                builder.setNegativeButton("취소", listener);
                builder.show();
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

Android 액티비티 백키 처리

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub

        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                Toast.makeText(this, "Back키를 누르셨군요", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onKeyDown(keyCode, event);
    }

Wednesday, May 6, 2015

Android AdMob "Missing AdActivity with android:configChanges in AndroidManifest.xml" 에러

다음 문장을 AndroidManifest.xml에 추가한다.
<activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />

Android "A required meta-data tag in your app's AndroidManifest.xml..." com.google.android.gms.version 에러

Admob을 사용시에 다음과 같은 에러가 발생할 경우, 
java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist.  You must have the following declaration within the <application> element:     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

AndroidManifest.xml에서 다음과 같은 문장을 <application> 태그에 포함시켜 준다.
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

Tuesday, May 5, 2015

맥북 패러랠즈 셋팅을 맥OS 우선모드로 셋팅

패러랠즈를 깔아서 맥을 쓰다가 보니, 최근에는 윈도우에서 작업하는 시간이 줄어서 맥OS 우선 모드로 셋팅을 변경했다. 그랬더니 패러랠즈를 실행시킨 상태에서 맥에서 하는 모든 작업의 속도가 빨라졌다.

패러랠즈 셋팅(이전):
CPU: 4개
RAM: 4GB
성능: 패러랠즈 우선 모드

패러랠즈 셋팅(현재):
CPU: 2개
RAM: 2GB
성능: 맥 우선 모드

이렇게만 바꾸어 주어도 맥에는 아무런 성능 저하가 안보이고 패러랠즈 윈도우를 동시에 띄워둘 수가 있다.

Sunday, May 3, 2015

C# WPF Arc 타입을 못찾을 경우

다음과 같이 XAML 상부에 네임스페이스를 정의를 했지만 'Arc'타입을 찾지 못하는 경우가 있다.

네임스페이스 정의:
xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" x:Name="MainControl"

Arc를 찾지 못한다는 메세지:
The tag 'Arc' does not exist in XML namespace 'http://schemas.microsoft.com/expression/2010/drawing'. Line 11 Position 4.
Done building project "TextBinding.csproj" -- FAILED.

그럴 경우에는 Microsoft Blend4를 설치하고 프로젝트에 다음과 같은 레퍼런스를 추가하여야 한다:
'C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\Silverlight\v4.0\Libraries\Microsoft.Expression.Drawing.dll'

C# 파일 읽기 유니코드 문제

// 파일을 읽을때 유니코드 문제를 드디어 해결했다.
// 문제는 Encoding parameter부분이 default parameter가 Encoding.Default가 아니라는 점이다. 따라서 명시적으로 Default Encoding이라고 해주어야 함

FileStream fs = new FileStream(fn, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.Default);
string s = sr.ReadLine();

2013년 맥북프로레티나 13인치와 15인치 성능비교

http://blog.macsales.com/20862-2013-macbook-pro-with-retina-display-13-and-15-initial-ssd-speed-comparison?APC=XLR8YourMac13

2013 13″ MacBook Pro with Retina Display
  • 128GB SanDisk SSD
  • 312.9MB/s write
  • 728.6MB/s read

2013 15″ MacBook Pro with Retina Display
  • 256GB Samsung SSD
  • 676.7MB/s writes
  • 728.6MB/s read

최근에 맥북프로레티나를 사려고 해서 알아봤는데 13인치 최고급형은 SSD 256GB에 듀얼코어 i5이고, 15인치 기본형은 SSD 256GB에 쿼드코어 i7이라서 고민을 많이했다.

13인치는 239만원 15인치는 259만원 20만원 차이다. 그리고 해상도 차이가 살짝 있다.
하지만 13인치도 레티나기 때문에 개발하는데 해상도에는 무리가 없다.

근데 이 벤치마크 결과를 보니깐 무조건 15인치를 구입해야 할것 같다.
->결국 15인치 맥북프로레티나를 구입하였다.