Android Studio 로 library 를 빌드 하다보면 META INF 파일에 쓸대 없는 내용들이 들어가서 문제가 생기는

경우가 있다.

Gradle script 에서 해당 내용을 exclude 해서 제거가 가능 함

Android task 내부에 아래와 같이 제거할 내용을 전부 작성 하면된다.
	packagingOptions {
    	exclude("META-INF/maven/com.squareup.okhttp/okhttp/pom.properties")
    }


'Android' 카테고리의 다른 글

Android HTTPS SHA128 인증서 오류  (0) 2017.02.08
Sharedpreferences 에 관하여  (0) 2015.04.04
Android QR code scan 부분  (0) 2014.09.21
Android QR code  (0) 2014.08.12
Android AsyncTask 함정 카드  (1) 2014.08.03

정확한 기간은 모르지만 HTTPS 에서 사용하는 SHA128 알고리즘 인증서를 더이상 갱신이 불가능한 이슈가 있는데,
WebView 에서 Https URL을 Load 하다보면 어떤 기기는 정상 동작 하지만 어떤 기기는 SSL exception이 나오는 경우가 있다.

단말과 상관없이 Google System webview 문제라고 생각 되어 관련 히스토리를 뒤적 뒤적 해보니 요런 재미난 이슈가 있었던거 같다.

WebView 53, 54 버전 일부에서 Symantec 인증서 관련된 페이지가 load 되지 않는 이슈 (https://www.chromium.org/developers/androidwebview/webview-ct-bug)

건내 받은 정보에 의하면 아래와 같은 버전에서 문제가 발생 한다고 한다.
  • 54.0.2840.85       November   2, 2016     문제 발생

  • 54.0.2840.68       October      20, 2016    문제 발생

  • 54.0.2840.61       October      13, 2016    문제 발생

  • 53.0.2785.124     September 17, 2016    문제 발생

  • 53.0.2785.121     September 16, 2016    문제 발생

  • 53.0.2785.113     September 14, 2016    문제 발생

  • 53.0.2785.97       September   8, 2016    문제 발생

그리고 추가로 Google system webview 가 없거나 사용 하지 않음 상태로 되어 있음에도 비슷한 문제가 나온다면,
Google Chrome 을 확인할 필요가 있다.


'Android' 카테고리의 다른 글

Gradle jar package exclude  (0) 2017.02.08
Sharedpreferences 에 관하여  (0) 2015.04.04
Android QR code scan 부분  (0) 2014.09.21
Android QR code  (0) 2014.08.12
Android AsyncTask 함정 카드  (1) 2014.08.03

Sharedpreferences  에 데이터를 쓸때는 쓸려는 원본 데이터가 byte type 인지 꼭 확인 해야함.

저장 형태가 xml 포멧이라 byte type 은 base64 encoding 해서 작성 해야 함,

특히 new String 으로 해서 데이터를 쓰는 경우가 종종 있는데 상당히 무식한 방법임.


특이점.

API Level 11 부터는 메모리에도 동시에 쓰고 있어서 put 이후 get을 하면 입력했던 값 그대로 나옴, 하지만 그 아래 버전들은 null을 벹어 줌.

'Android' 카테고리의 다른 글

Gradle jar package exclude  (0) 2017.02.08
Android HTTPS SHA128 인증서 오류  (0) 2017.02.08
Android QR code scan 부분  (0) 2014.09.21
Android QR code  (0) 2014.08.12
Android AsyncTask 함정 카드  (1) 2014.08.03
이직을 완료하고 나서 여유가 생겨 요즘 블로그에 다녀가신 분들 통계를 보니, 이직에 대한 키워드가 많아서 글을 좀 남겨 보려고 합니다.

시대가 시대인 만큼 다들 힘들고 어려우니 좀더 좋은 대우와 환경을 위한 노동자의 이직은 당연하다는 분위기인건 맞는 것 같다.
나역시 이전 회사보다 현재 회사의 환경과 대우가 너무나 다르니... 안정적인 직장을 찾기 위한 부단한 노력으로 이직을 할 수 있었던것 같다.

 내 주업무가 모바일 분야이다 보니 다른 주변은 어떤지 알수 없지만, 여하튼 힘든시기인건 맞는듯...
주변에서 흔히 말하길 3년 또는 5년 경력을 가지고 있으면 이직하기 쉽다고 하던데, 이말은 사실인 것 같다.
회사에서 경력자를 뽑을 때는 일할 줄 아는 사람을 뽑으려고 하지 가르쳐주려고 뽑진 않을 것이란 말씀.
이런 관점에서 볼때 자기 개발도 소홀히 해서는 안될 것 같다.

가령 Android 전문 파트라고 해도 C/C++ 과 Java를 다룰 줄 알고 기본적인 설계, 그리고 요세 네트워크가 대세니까(아니 이게 대세가 아니였던적은 없었던듯...) 여하튼 네트워크하면 프로토콜과 소켓통신 그리고 멀티 쓰레드 정도??
이정도 지식과 스킬과 노하우를 보유한다면 기본은 되지 않을까??... 순전히 혼자만의 생각 일 수도 있고.
거기다 영어 회화 또는 토익성적에 학점...까지 해야 될라나?
개발 관련 일을 하면서 저걸 챙길려면 얼마나 노력해야할까? 아니면 천재거나...
숨고르기 하면서 차분히 챙기면 못 할 것도 없을지도...

개인적으로 아주 작은 중소 기업 부터 현재 대기업까지 이직을 하면서 고려해야 할 노하우를 꼽자면...

1. 가족같은 분위기 회사입니다. - 절대 비추다. 그냥 나와서 노예같이 일해주세요 라는 뜻임
2. 외국계 회사입니다. - 한국에 있는 외국계 중에 진짜 유명한 곳 예를 들어 구글, 인텔... 이런 회사면 모를까 그냥 한국 회사임.
3. 돈 많이 줄께요. - 돈 많이 준다는 건 부려먹을 일이 많다는 뜻?
4. 솔루션 업체 입니다. - 글세 특정 회사 처럼 유명한 솔루션이 있으면 모를까 이제 막 시작하는 회사는 정말 비추.
5. 인력 파견 회사. - 연봉은 기대하지 말았으면...
6. 복지가 좋아요. - 글세 그 복지가 오래 갈지는 모르겠음.
7. 소규모 인원. - 할일이 더럽게 많음.
8. 인원대비 매출액이 1억인가? 10억인가 되야 안정적인 회사라고 하던소리가... (뻘소리일려나?)

오해 할까봐. 경력이 오래된것도 아니고 자주 회사를 옮긴것도 아님, 단지 주변에서 쉽게 정보를 접 할 수 있었을 뿐입니다.

이직시 면접은 그냥 자신있게 솔직하게 하는 편이 좋은듯 개인 편차가 있긴한데 나같은 경우는 거짓말 자체를 못하는 편이라 모르면 모른다고 이야기 하는 편이고, 그냥 이런점이 좀 정상참작 정도 되는듯 한데...
 
이직시 면접은 자신있게 거침없이 어차피 뭐... 인생 한방이지 음음... 

'My Stroy' 카테고리의 다른 글

개발자에게 이직이란...  (0) 2014.08.03
피에르 가니에르.  (0) 2014.06.04
합정역 근처 겐츈한 파스타 집?  (0) 2012.10.21
인도 길거리 상인  (0) 2012.06.07
인도 레스토랑 3편  (0) 2012.05.23
 QR code 생성 하기.
 2014/08/12 - [Android Study] - Android QR code

 이번에는 Scanner code 에 대해서 설명 해보도록 하겠음.
Camera preview 를 이용한 기법이므로 camera preview 정도는 가볍게 해결 해주셔야함.

 일단은 Camera preview callback 함수 부터.
     private Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() {
        // Frame 제한 시간
        private static final long FRAME_RATE_TIME = 200; // 200:5, 124:8, 100:10
        // Frame 체크용 시간 변수
        private long mCheckTime = 0;

        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
            boolean checkImage = false;
            // Frame 제한 시간을 넘는 경우에만 decode 작업을 수행
            if (mCheckTime == 0) {
                mCheckTime = System.currentTimeMillis();
                checkImage = true;
            } else {
                long current = System.currentTimeMillis();
                if (current - mCheckTime > FRAME_RATE_TIME) {
                    mCheckTime = current;
                    checkImage = true;
                }
            }

            if (checkImage == true) {
                mThread.insert(data, camera.getParameters().getPreviewSize());
            }
        }
    };


 코드 자체는 별 내용이 없고 Thread에 YUV 데이터를 전달 하는게 전부 인데, 시간 interval을 준 까닭은 Preview size가 너무 클 경우 YUV data 가 무지막지하게 커지는 경향이 있음.
 이럴 경우 decode에 과부하가 걸려서 Camera preview가 제대로 동작 안하고 버벅이는 현상이 발생함.

그다음 Thread 부분은.
    private class QRDecorderThread extends Thread {
        // Queue의 최대 값
        private static final int QUEUE_MAX = 3;
        // YUV data blocking queue
        private BlockingQueue<byte[]> mQueue;
        // UI 쪽에 data를 전달 할 Handler
        private Handler mHandler;
        // Preview size 변수
        private Camera.Size mSize;

        public QRDecorderThread(Handler handler) {
            mHandler = handler;
            mQueue = new ArrayBlockingQueue<byte[]>(QUEUE_MAX);
        }

        @Override
        public void run() {
            while (true) {
                try {
                    byte[] data = mQueue.take();

                    PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
                            data, mSize.width, mSize.height, 0, 0, mSize.width,
                            mSize.height, false);

                    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(
                            source));

                    QRCodeReader reader = new QRCodeReader();

                    try {
                        Result result = reader.decode(bitmap);
                        String resultData = result.getText();
                        // 결과물이 있을 경우 preview 정지 및 UI 쪽에 data 전달
                        if (resultData != null) {
                            mCamera.stopPreview();
                            mHandler.sendMessage(mHandler.obtainMessage(0,
                                    resultData));
                        }
                    } catch (Exception e) {
                    }
                } catch (InterruptedException e) {
                    break;
                }
            }
        }

        public void insert(byte[] data, Camera.Size size) {
            try {
                mSize = size;
                mQueue.put(data);
            } catch (InterruptedException e) {
            }
        }
    }

사실은 저기 Thread 내부에서 새로 생성하는 class 들도 어떻게 잘 조절하면 new를 안하고 재활용 할 수 있을 듯한데...
음 거기까진 잘 모르겠음.
그리고 하나더 Camera parameter를 setting 할때 분명 preview에 대한 FrameRate를 설정 할 수 있는 걸로 알고 있는데 이것 또한
시도 해보지 않음...
여하튼 이런식으로 하면 동작하긴 함. 

'Android' 카테고리의 다른 글

Android HTTPS SHA128 인증서 오류  (0) 2017.02.08
Sharedpreferences 에 관하여  (0) 2015.04.04
Android QR code  (0) 2014.08.12
Android AsyncTask 함정 카드  (1) 2014.08.03
Android Custom Widget 만들기 7편  (0) 2012.04.12
 이번 주제는 QR 코드.
요즘은 기본적으로 QR code를 인식하는 다양한 방법 혹은 어플들이 있으니까, 나도 해봐야지.

우리에게 필요한 준비물은 Android SDK, Eclipse, QR code library 정도.

그리 잘 만든 코드는 아니지만 일단 스타드~

우선 QR code library 수집을 위해서 위대하신 우리 Google 느님에게 검색, 검색~
그리고 zxing 이란 녀석을 사용하기로 결정!!
URL : https://github.com/zxing

근데 이거 까보니 너무 많음 바코드도 있고... 기타 등등.. 그래서 귀찮으므로 QR 코드만 따로 빼서 새로 만듬
그리고 생각해보니 code 위주로 작성하는데 복사를 못하게 하면 난감해서 복사방지 풀음...


QR 코드 생성해서 ImageView에 보이도록 하는 부분.

    private class CreateQRCodeAsyncTask extends AsyncTask<String, Void, Bitmap> {
        // QR code 색상
        private static final int WHITE = 0xFFFFFFFF;
        private static final int BLACK = 0xFF000000;

        // QR code bitmap 크기 비율
        private static final float REDUCE_RATIO = 0.8f;

        // 타겟 image view
        private ImageView mTagetView;

        // 화면 크기
        private Point mDisplaySize;

        public CreateQRCodeAsyncTask (Imageview taget, Point displaySize) {
            mTagetView = taget;
            mDisplaySize = displaySize;
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            // zxing library class (QR code writer)
            QRCodeWriter qrCodeWriter = new QRCodeWriter();

            try {
                // 화면 비율 대비 QR 코드 이미지 크기 조정
                int temp = mDisplaySize.x;

                if (temp > mDisplaySize.y) {
                    temp = mDisplaySize.y;
                }

                int dWidth = (int) ((float) temp * REDUCE_RATIO);
                int dHeight = (int) ((float) temp * REDUCE_RATIO);

                // QR code로 인코딩해서 비트맵 array 정보를 얻어옴 zxing 자체 class임
                BitMatrix result = qrCodeWriter.encode(params[0],
                        BarcodeFormat.QR_CODE, dWidth, dHeight);
                int width = result.getWidth();
                int height = result.getHeight();

                // Bitmap pixel array
                int[] pixels = new int[width * height];

                // BitMatrix 정보를 바탕으로 bitmap 픽셀 array 에 color 입력
                // All are 0, or black, by default
                for (int y = 0; y < height; y++) {
                    int offset = y * width;
                    for (int x = 0; x < width; x++) {
                        pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
                    }
                }

                // pixel array 크기의 bitmap 생성
                Bitmap bitmap = Bitmap.createBitmap(width, height,
                        Bitmap.Config.ARGB_8888);

                // bitmap에 pixel 정보 입력
                bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

                return bitmap;
            } catch (Exception e) {
                return null;
            }
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            if (result != null && mTagetView != null) {
                // image view 에 QR code 업데이트
                mTagetView.setImageBitmap(result );
                mTagetView.invalidate();
            }
        }
    }   

다음편에 스캔하는 code 설명을 이어가 겠음...





'Android' 카테고리의 다른 글

Sharedpreferences 에 관하여  (0) 2015.04.04
Android QR code scan 부분  (0) 2014.09.21
Android AsyncTask 함정 카드  (1) 2014.08.03
Android Custom Widget 만들기 7편  (0) 2012.04.12
Android Custom Widget 만들기 6편  (0) 2012.04.12
 우리가 Android 상에서 Thread 작업을 쉽게 할 수 있도록 class 되어 있는 아주 유용한 녀석이 있음.
AsyncTask 란 녀석인데 상속받아서 class를 작성하면 손쉽게 뼈대들을 만들어주고 내가 크게 관리할 필요 없이,
UI thread 쪽으로 메세지를 날려주는 아주 좋은 녀석이다.

그리고 class를 실행 시키는 방법이 2가지가 있는데 excute(...) 하고  executeOnExecutor(Executor, ...)  이다.
허니콤 이상 버전 부터는 excute로 동작하는 모든 AsyscTask 는 single thread로 동작한다.
즉 AsyncTask라고 여러개 선언하고 동작 시켜봤자 하나 끝나야 다른게 수행되는 그런 구조다.

반면 executeOnExecutor 는 원래 우리가 예상하고 기대했던 방식대로 동작한다.

여기까진 뭐 그냥 그렇거니 했는데 한 4달전에 개발 했던 application 에서 독특한 문제를 발견 했다.
AsyncTask 원본 class에 가면 이녀석을 생성 할 수 있는 max 값이 정해져 있다.

나는 6개를 생성했었는데 7번째 부터는 동작 자체를 안하는 버그가 있는 것이었다.
그래서 뒤져보니 저게 떡~ 하니 리미트가... 후...
그래서 나는 추천한다 정말 다양한 멀티 쓰레드가 필요하면 그냥 Thread class를 쓰고 UI 동작은 Handler로 처리하라고,
어차피 내부적으로 AsyncTask도 동일하게 동작한다.
Thread 동작을 수행하고 내부적으로 Handler 객체에 post 하는 방식을 취하고 있는 거니까....
 

'Android' 카테고리의 다른 글

Android QR code scan 부분  (0) 2014.09.21
Android QR code  (0) 2014.08.12
Android Custom Widget 만들기 7편  (0) 2012.04.12
Android Custom Widget 만들기 6편  (0) 2012.04.12
Android Custom Widget 만들기 5편  (0) 2012.04.12
 개발자에게 이직이란 피할 수 없는 숙명인건가...
나름 열심히 공부하고 자기 개발 해가면서 코딩을 했건만,
주변 상황들이 내가 프로그래밍에만 몰두하게 놔두질 않는 듯. 에휴...

나는 사람을 처음 대하는데 익숙하지 않은 편이라. 소위 낮가림이 있다고 해야하나?
자신있게 대답은 할 수있지만 그게 내 머리에서 나온 말인지, 내 입에서 나온 말인지 분간을 못할 때가 많고.
나보다 엄청 잘난 개발자들이 많은 것도 사실이고 난 그들 보다 더 뛰어난지 재능이 있는지 역량이 되는지 알수가 없지.
내가 그런걸 생각했다면 5년전 이맘때 그렇게 Android만 열심히 파지 않았을지도...

Android에 대한 오랜 경력이 내 발목을 잡고 있는건 아닌지.
과연 내가 어떤 개발자 인걸까.

이 블로그를 처음 개설할때 그 뿌듯함, 기쁨, 희열, 각오 이런 것들이 지금 내게 가장 필요한 건 아닐까.

Android study 다시 써볼까..

 

'My Stroy' 카테고리의 다른 글

개발자이직에 대해서.  (1) 2014.10.05
피에르 가니에르.  (0) 2014.06.04
합정역 근처 겐츈한 파스타 집?  (0) 2012.10.21
인도 길거리 상인  (0) 2012.06.07
인도 레스토랑 3편  (0) 2012.05.23
재작년에 열심히 글을 쓰다가 잠수 다시 이렇게 글을 쓰기 시작한건 시간적 여유가 생겨서가 절대 아님.
일이 밀리거나 바쁘거나 귀찮거나 등등 다양한 이유가...


올라가는 엘베? 였던가. 입구였던가? 무튼 폰카라 화질 양해 바람. 나한테 DSLR이 있는것도 아니고 뭐.
그냥 설래는 맘에 룰루~ 랄라~




 기억이 맞다면 점심때 간듯한데 대체 뭘 시킨건지 기억이 분명히 2종류였던거 같은데.
오래되서 기억이 가물가물 에피타이저? 였던가? 분명히 인도 향신료맛이었는데....




버터!! 이게 버터... 그냥 그렇다구요 뭐...

 


 
이거슨 버터 발라 먹는 빵!! 브레드... 눼눼 이거 맛있습니다요.




 이거 무슨 고기였던거 같은데. ㅠㅠ 기억이 나질 않아.(고기 아닌가?)



 
이거 갈비양념맛... 양파 많이 있고 스푸라고 기억하고 있음. 



 
이거 젤리...? 아놔 기억이 왜케 저질이지?





 이거슨 바로!! 고기... 아 한심하다. 불과 1년 반전인데 (좀 오래됬나?)




 이거슨! 사슴고기인가? 그것 약간 노린내가 나는 그런 고기. 솔직히 노린내라기 보다는 그냥 특유의 향이긴한데 첨 먹는 사람은 노린내 같은 느낌이...(기억이 맞나??)




이건 뭐지? 이런걸 먹었었나??

 

'My Stroy' 카테고리의 다른 글

개발자이직에 대해서.  (1) 2014.10.05
개발자에게 이직이란...  (0) 2014.08.03
합정역 근처 겐츈한 파스타 집?  (0) 2012.10.21
인도 길거리 상인  (0) 2012.06.07
인도 레스토랑 3편  (0) 2012.05.23
후~
글 안쓴지 엄청 오래 되었네용.

좀 됬는데 좋은 날이여서 합정역 근처에서 맛난 파스타와 피자를 먹었음~
가게 이름은 스테파노xx 이러면 다들 알테니 ㅋㅋ


개인적으로 크림류 파스타를 잘 못먹는데... (하지만 빠네는 잘먹는 다능...)
이건 정말 맛났다는... 뽀인트는 계란 노른자!! ㅋㅋ
꾸덕 꾸덕 한게 내 취향임 (여친님아~ 우리 함더 가자!)


토마토 소스가 겁내 맛나던 피자...
벗뜨~ 식으니 너무 시큼함 ㅠㅠ
딴걸 좀 도... 도전!! 해봐야 할듯.


테이블이 작은 관계로 이렇게 접시를 막 겹쳐 놔야 겨우 가능함.
후후 피클!! 이것이 디플용 피클이란 말씀(에헴~)
서빙 보시는 분이 너무 느긋해서 나까지 느긋했던 기억이...

가게 위치나 매장등 느낌은 잘 모르겠고...(별 5점 만점에 4점?)
음식은 맛은 있었음. 흐흐흐 

'My Stroy' 카테고리의 다른 글

개발자에게 이직이란...  (0) 2014.08.03
피에르 가니에르.  (0) 2014.06.04
인도 길거리 상인  (0) 2012.06.07
인도 레스토랑 3편  (0) 2012.05.23
인도 레스토랑 2편  (0) 2012.05.16

+ Recent posts