Thursday, October 22, 2015

iOS 개발자 인증서 내보내기

iOS 개발자 인증서를 여러 맥북에서 공유하기 위해서 내보내기를 해보았다.

1. 먼저 key파일을 내보내야 하므로 '키체인 접근'을 실행시키자.
여기서 내보낼 키를 Development, Distribution 두개를 선택하고 '2개 항목 보내기'를 선택하여 .pem 파일로 저장한다.

2. 두번째는 개발자 프로필을 내보내야 하므로 Xcode를 실행시켜서 Preference에서 Accounts를 선택하여 내보낼 Apple ID를 선택하고 하단에 있는 설정모양 아이콘을 눌러서 Export Developer Accounts를 선택하여 내보내자.


이 두가지 파일을 다른 맥북에 옮겨서 두개를 더블 클릭하면 동일하게 다른 맥북에서도 iOS 개발을 할수 있다.



iOS -ObjC 옵션에서 SDL 2.0 라이브러리가 duplicate가 날때

iOS 프로젝트에서 SDL 2.0 라이브러리를 사용할때가 있다. 그런데 여기서 SDL_main을 사용하지 않고 라이브러리로만 사용할때 -ObjC를 사용하게 되면 duplicate symbol for architecture x86_64라는 에러메세지가 뜬다.

-ObjC는 duplicate를 허용하지 않는 옵션이기 때문에 메인 프로젝트에 UIApplication을 띄우는 main함수가 있고 그리고 SDL 라이브러리 안에도 있기 때문이다.

따라서 다음과 같이 SDL_uikitappdelegate.m에서 main을 주석처리하면 해결된다.

iOS 라이브러리 추가시에는 항상 'Add Files to (ProjectName)'을 사용하자

소스단위로 되어 있는 iOS 라이브러리를 프로젝트에 폴더단위로 드래그앤 드롭을 하게 되면 안에 있는 .a 라이브러리 파일들이 Build Settings에 Linked Frameworks and Libraries에 자동으로 추가가 되지 않는다.

따라서 항상 소스단위의 iOS 라이브러리를 프로젝트에 추가할때는 프로젝트의 폴더에서 오른쪽 버튼을 누른후 'Add Files to (ProjectName)'을 사용해야 한다.

HTML 모바일웹 사이즈

일반웹으로 모바일웹으로 바꾸려면 다음과 같이 head에 viewport를 설정해 주어야 한다. 이것은 기본적으로 화면 사이즈에 맞게 표시해주고, 화면 확대를 방지하는 코드이다.

<head>
<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, width=device-width">
</head>

Ruby 다중라인 주석달기

Ruby는 파이썬과 비슷해서 #는 한라인 주석달기이다.
그런데 다중라인 주석달기는 =begin ~ =end인데 특이한점이 무조건 그 라인에서 첫번째 글자부터 시작해야 된다.
=앞에 스페이스나 탭이 들어가면 안된다.

Android Studio 쓰다보니 좋은 점들

장점
1. 소스 디컴파일러가 내장되어 있어서 소스가 없는것도 소스를 쉽게 볼수 있고, 안드로이드 소스도 바로 연결이 된다.
2. gradle 빌드 시스템으로 라이브러리의 최신버전을 repository에서 받아온다.
3. 탭간 이동이 비쥬얼 스튜디오와 동일하게 ctrl + tab이다. 이게 가장 편하다.
4. dracular 테마가 있어서 좋다.
5. 프로젝트 관리가 이클립스의 workspace가 아니라서 git에 넣었을 경우에 비쥬얼 스튜디오 처럼 프로젝트를 로딩하면 모든 셋팅이 같이 로딩된다.
6. UI 에디터도 쓸만하게 프리뷰를 할수 있다.

Sunday, October 18, 2015

Android Fullscreen PopupWindow 예제

팝업 윈도우를 타이틀바(액션바)를 포함하여 풀스크린으로 띄우고 싶을 때는 다음과 같은 코드를 이용한다.
new를 할때와 showAtLocation할때 동일한 view가 들어가는 것에 유의하자.

    final View view = getLayoutInflater().inflate(R.layout.rotate_popup, null);
    private PopupWindow rotatePopup;
        rotatePopup = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        rotatePopup.setFocusable(true);
        rotatePopup.showAtLocation(view, Gravity.CENTER, 0, 0);

Tuesday, October 13, 2015

Ruby On Rails에서 로그 출력 하는 방법

콘솔용 Ruby에서는 print와 puts를 사용하면 화면에 문자열을 찍을 수 있는데 Ruby On Rails는 웹 프레임워크라서 print/puts를 사용하면 문자열이 HTML로 출력이 된다.

그래서 다음과 같이 출력하면 로그 파일에 안전하게 로그가 출력이 된다.

Rails.logger.debug "(문자열)"

문자열은 log/development.log, production.log에 출력이 된다.

debug대신에 info, warn등을 사용할수 있는데 이것은 다음과 같은 환경설정을 따른다.
config/environments/development.rb, production.rb에서 다음과 같이 지정한다.

config.log_level = :debug

Git 윈도우10에서 SourceTree가 다운될때

윈도우10에서는 Git클라이언트인 SourceTree 최신버전이 다운된다.
그래서 아래 링크에 있는 SourceTree 1.5.2를 받아서 설치하면 해결된다.
하지만 SourceTree 1.5.2는 파일을 add/commit할때 폴더별로 정렬이 안되어서 불편하다.
아직은 윈도우8.1이 가장 편리한 윈도우인것 같다.(최신 지원 기능 및 적은 업데이트)

다운로드

Saturday, October 10, 2015

Ruby cannot load such file -- 2.2/pg_ext (LoadError) 에러 해결 방법

윈도우에 Ruby on Rails를 설치하여 빌드하여 실행 하려고 하는데(rails s) 다음과 같은 에러가 발생했다.

C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/pg-0.17.1-x64-mingw32/lib/pg.rb:10:in `require': cannot load such file -- 2.2/pg_ext (LoadError)
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/pg-0.17.1-x64-mingw32/lib/pg.rb:10:in `rescue in <top (required)>'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/pg-0.17.1-x64-mingw32/lib/pg.rb:3:in `<top (required)>'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/runtime.rb:76:in `require'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/runtime.rb:76:in `block (2 levels) in require'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/runtime.rb:72:in `each'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/runtime.rb:72:in `block in require'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/runtime.rb:61:in `each'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/bundler-1.10.6/lib/bundler/runtime.rb:61:in `require'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/bundler-1.10.6/lib/bundler.rb:134:in `require'
        from C:/git/amanda-api/config/application.rb:7:in `<top (required)>'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/railties-4.1.13/lib/rails/commands/commands_tasks.rb:79:in `require'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/railties-4.1.13/lib/rails/commands/commands_tasks.rb:79:in `block in server'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/railties-4.1.13/lib/rails/commands/commands_tasks.rb:76:in `tap'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/railties-4.1.13/lib/rails/commands/commands_tasks.rb:76:in `server'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/railties-4.1.13/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/railties-4.1.13/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'

이를 해결하는 방법은 다음과 같다.
gem instasll pg --pre
gem list pg

확인결과 최신버전은 0.18.3이다.
그럼 Gemfile, Gemfile.lock에서 pg의 버전을 0.18.3으로 변경하면 해결 된다.

Monday, October 5, 2015

Android keyboard show/hide event

    public static void hideKeyBoard(View v) {
        InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }

    public static void showKeyBoard(View v) {
        InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
    }

    private ViewTreeObserver.OnGlobalLayoutListener keyboardLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int heightDiff = rootLayout.getRootView().getHeight() - rootLayout.getHeight();
            int contentViewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();

            LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(BaseFragmentActivity.this);

            if(heightDiff <= contentViewTop){
                onHideKeyboard();

                Intent intent = new Intent("KeyboardWillHide");
                broadcastManager.sendBroadcast(intent);
            } else {
                int keyboardHeight = heightDiff - contentViewTop;
                onShowKeyboard(keyboardHeight);

                Intent intent = new Intent("KeyboardWillShow");
                intent.putExtra("KeyboardHeight", keyboardHeight);
                broadcastManager.sendBroadcast(intent);
            }
        }
    };
    private boolean keyboardListenersAttached = false;
    private ViewGroup rootLayout;

    protected void onShowKeyboard(int keyboardHeight) {}
    protected void onHideKeyboard() {}

    protected void attachKeyboardListeners(View contentView) {
        if (keyboardListenersAttached) {
            return;
        }

        rootLayout = (ViewGroup)contentView;
        rootLayout.getViewTreeObserver().addOnGlobalLayoutListener(keyboardLayoutListener);
        keyboardListenersAttached = true;
    }

RubyMine 7 스타트업 회사에서 싸게 구매하는 법(Startup discount)

https://www.jetbrains.com/shop/eform/startup

최근에 Ruby On Rails로 된 서버를 개발하다가 개발툴인 RubyMine을 구매하려고 하다가 보니 다음과 같은 공식 사이트에서 스타트업을 위한 할인 캠페인을 발견했다.

다음과 같이 3년이하, 10인이하 사업장에서 할인을 받을수 있다. 할인 폼에 정보를 입력하면 2-3일정도의 심사 과정을 거친후에 메일로 그 결과가 발송된다.

This discount is available to any company that meets all the following requirements:
  • Is privately held,
  • Has been in business for no more than 3 years,
  • Has no more than 10 employees,
  • Is engaged in development of a software-based product or service, and
  • Is an established business with a website and/or existing public references on the Internet.
If your company meets these criteria, apply for your discount now.
After your application is approved, your startup discount will be available for one or more purchases for 12 months