Regular Motion

개발자가 상팔자

Category: general (page 2 of 19)

2017 목표

역시 사람이 목표가 있어야 되는 것 같아서 새해를 맞아 몇가지 목표를 세움.

  • 업무 목표
    • Spindle Android Viewer재설계 + 리펙토링: 4년간 여러가지 기능을 추가하는 과정에서 Viewer가 많이 낙후되고야 말았다. 외관은 크게 낙후되지 않았으나 내부 구조는 조금 낙후된 것 같다. 개인적으로는 신경을 쓰면서 기능을 추가했지만 시간에 장사가 없는 것 같다. 바닷가 바람에 녹슨 배처럼 정비가 필요한 시점이다.
      재사용 가능한 모듈은 살리되, 설계부터 다시하는 방향으로 Refactoring이 필요한 시점이 된 것 같다.
      시간이 2~3달 정도 소요될 것 같은데 어떻게 시간을 만드나;;  그래도 진행하면 2~3달은 꽤나 재미있게 작업 할 수 있을 것 같고, 개선되는 부분도 아마 매우 선명할 것 같다.
    • Tablet에 최적화된 eBook 포맷 기획 및 개발: 현재의 포맷이 갖는 한계는 비교적 명확한 것 같다.
      1) 일반적으로 책의 물리적인 크기가 태블릿 화면보다 크다.  2) 책의 물리적인 크기는 대부분의 사람이 편하게 볼 수 있는 크기로 만들어졌을 확률이 높다.  1)과 2)가 참일 때 책의 비율을 유지하면서, 태블릿에서 컨텐츠를 보여주려면 책이 원하는 크기보다 좀 작게 보여질 확률이 높다.  물론 Zoom in/out은 가능하지만 Default 값은 중요하지 않은가. 회사가 보유한 좋은 책들의 가치를 100% 프린트북 대비 150%를 끌어낼 수 있는 새로운 포맷을 개발해야 될 시점이 점점 다가오는 것 같다. 기기 사양은 이미 충분히 올라왔다.

 

  • 개발자로서의 목표
    • AWS 공인 솔루션 아키텍트 자격증 취득: 현재 회사의 이점을 살려, AWS 솔루션 아키텍트 공부를 하여 자격증을 취득해보자. 3~4달 정도 공부를 해야 될 것 같은데 앞으로 도움이 될 것 같은 몇 안되는 자격증으로 보이니 꼭 공부해서 상반기내 취득을 목표로. 취득하는 과정에서도 도움이 많이 될 것 같고, 자격증을 보유한 것으로도 도움이 될 것 같다.
    • Radio inn: 올해에는 다운로드 수 보다는 기능 추가에 목표를 두고 개발
      1) 로그인 / 로그아웃 / 북마크 팟캐스트 계정 동기화
      2) 친구 또는 다른 사용자가 북마크한 팟캐스트 열람
      3) 취향 기반 팟캐스트 추천 서비스
      4) 팟캐스트 별점 / 에피소드 별점
    • 블로깅 12개: AWS 자격증 준비 및 Radio inn 개선 과정에서 배운 것들을 꾸준히 포스팅. 양보다는 질. 허나 최소 12개 정도는 블로깅 할 수 있도록.
    • Git을 자유롭게: 아직도 Git이 어색할때가 있다. git을 자유롭게 사용할 수 있도록.

 

  • 개인 목표
    • 82kg까지 다이어트: 문득, 예전 사진을 보다 거울 속 나와 너무 차이가 나는 것 같아 급하게 목표에 추가하게 되었다. 7kg을 빼보자. 82kg까지 다이어트.
    • 어진이와 분기별 1회 둘이서 여행: 초등학교 들어가면 아빠보다 친구들을 더 좋아한다고 하던데, 아마 올해가 어진이와 가장 잼있게 보낼 수 있는 시기 일 것 같다. 올해는 꼭 같이 여행을 많이 다녀야겠다. 캠핑이면 가장 좋겠지만, 캠핑이 아니더라도 1) 물놀이 할 수 있는 곳 2) 박물관 / 미술관 위주로 딸과 많이 여행을 다녀야겠다.

 

2016 회고

어느덧 개발자라는 직업으로 일하고 있는지 만으로 7년,

남편으로 사는 것도 만으로 6년,

그리고 아빠라는 이름으로 살고 있는 것도 만으로 5년.

시간은 점점 더 빠르게 흘러가고,
흘러간 시간 대비 크게 나아지는게 없는 것 같아 회고를 하며 기록이라도 남겨야 될 것 같다.

  • 아빠 그리고 가장으로서의 2016
    너무나 다행히 크게 아픈 사람없이 한해를 보낼 수 있었으니 행복했던 한해다.
    특별히 기억에 남는 순간은 역시나 여권 보여주고 다녀온 2번의 여행, 괌과 세부. 두 곳 모두 휴양지라 어진이가 실 컷 물놀이를 할 수 있어서 좋았고, 아무래도 나이가 한살, 두살 먹어가니 가족끼리의 여행이 좋아지는 것 같다.
    2016년 가장 그리고 남편으로써 부족했던 부분은 기념일을 잘 챙겨주지 못했던 점.
    특히, 결혼 기념일과 아내의 생일. 내년에는 최소한 작은 선물과 이벤트는 준비하도록!
  • 개발자로서의 2016
    개발자로서 2016년에 소박한 목표 2가지가 있었던 것 같은데 그마저도 지키지 못한 것 같다.
    1) 블로깅 12회: 딱 절반인 6개의 글을 썼다;
    2) Radio inn 10만 사용자 만들기: 6만은 넘겼으나, 후반 뒷심 부족으로 10만은 실패. 1분기 기세를 이어갔으면 20만도 가능했을텐데 많이 아쉽다.
  • 회사에서의 2016
    회사에서의 생활은 딜레마의 연속인 것 같다.
    개발자와 팀장, 두개의 롤. 하고 싶은 것과 해야 하는 것.
    호불호가 뚜렷한 성격 탓에 최대한 하고 싶은 것만 하면서 살고 싶은데, 점점 해야 하는 것들이 늘어나서 고민이 되는 한해였다.
    그 와중에 저작툴을 다시 만든건 2016년에 제일 잘한 일이 아닌가 싶고, 팀장으로서의 역할은 여러모로 아쉬움이 많이 남는다.
    우선은 ‘하고 싶은 것’에 좀 더 집중!

 

[Android] 악화가 양화를 구축한다.

‘악화가 양화를 구축한다’는 말은 그레샴이 멀리 500년 후를 내다보고 지금의 Android를 빚대어 한 말인 것 같다.

대다수의 안드로이드 개발자들은 표준을 준수하는 코드를 작성하고 싶어 하지만 삼성의 높은 시장 점유율과 반복되는 버그 리포트는 표준만 준수해서는 답이 없다는 뼈아픈 가르침과 인실좆을 반복적으로 알려준다.

삼성을, 정확히는 갤럭시를 지원하기 위한 코드들은 마치 표준인양 인터넷을 떠돌아다니고 표준은 설 곳을 잃는다.

Android Support Library의 눈부신 활약으로 요즘은 상황이 많이 좋아졌지만 카메라나 미디어 코덱과 같이 하드웨어와의 연동이 필요한 부분은 현재 진행형이다.

범용적이거나 호환성이 높은 제품을 만들 때 필요한 자질은 보이지 않는 단점들을 하나 하나 덮어 줄 수 있는 인내심과 따뜻한 마음 그리고 구글링 인 것 같다.

[Android] Doubt till your Bug Tracking tool.

AndroidStudio의 Monitors로 memory monitoring 중 기이한 현상을 발견했다.

앱에서 다운로드를 시작하면 장판처럼 고요하던 메모리가 요동을 치기 시작하는 것이다.

실제로 3~5MB 정도의 메모리가 매우 빠른 속도로 할당/해제를 반복한다. 저사양 단말에서 파일 다운로드시 앱이 굉장히 느려지는 현상도 왠지 요동치는 그래프와 깊은 관련이 있을 것 같다.

다운로드 중 Monitors 툴에 나타나는 그래프는 아래와 같다.

요동치는 메모리

17초부터 다운로드가 시작됐고, 이후 요동치는 메모리를 보시라. 길에서 탕웨이를 우연히 만나면 내 심장도 저렇게 요동 치겠지.

처음에는 다운로드 중 Notification과 View를  갱신하기 때문에 메모리가 요동치는 줄 알았는데, 해당 작업을 주석처리 후 테스트 해봤지만 요동치는 메모리는 돌아오지 않았다.

범인을 잡기 위해, Allocation Tracking을 해보니 용의선상에 없던 놈이 범인이었다. 범인은 앱에서 사용하던 버그 트래킹 툴(Splunk Mint)인데,  툴에서 Network IO를 Monitoring 하는 로직이 BufferedInputStream의 read시마다 실행되도록 구현되어 있어 속도가 빠른 네트워크를 통해 대용량 파일을 다운로드 할 때 해당 로직이 매우 빈번하게 실행된다.

15초간 Allocation Tracking한 결과는 아래와 같다. 눈을 크게 뜨고 보시라.

절대 현혹되지 마라

 

다행히 Network Monitoring을 비활성화 할 수 있도록 SDK가 구현되어 있어 비활성화 후 테스트하니 메모리는 다시 고요해졌다.

이렇게…

백투장판

 

 

금일의 교훈

  1. 몸에 좋은 약도 알고 먹자.
  2. Android Studio의 Monitoring을 통해 Profiling을 가끔해보자. 버그 같지 않은 버그를 잡을 수 있다.

From Audio To Text

회사에서 종이책을 전자책으로 변환하는 중, Chapter 별로 녹음된 오디오 파일을 페이지 별로 컷팅 할 필요가 생겼다.

사실 내가 하는건 아니고, 책을 변환하시는 분들이 컷팅을 하는데 작업하는걸 옆에서 보니 약간만 도움을 드리면 일주일째 야근하는 저분도 칼퇴 할 수 있을 것 같아 방법을 찾아봤다.

기존의 작업 방식은 약 15분~1시간짜리 오디오 파일을 Seek 해가며 페이지의 마지막 문장이 끝나는 시점을 찾아 Timestamp를 기록 한 뒤, Timestamp 별로 오디오 파일을 컷팅했다. 이때 오디오를 Seek 해가며 각 페이지의 마지막 문장이 끝나는 시점을 찾는게 상당히 시간을 잡아먹는 작업이었다.

만약, 오디오 파일에서 자막 파일과 비슷하게 각 문장별 시작시간과 종료시간을 자동으로 추출 할 수 있다면, 페이지의 마지막 문장을 자막 파일에서 찾은 뒤 문장의 종료시간을 바로 찾을 수 있으니 퇴근을 못하고 파일을 컷팅하시는 분의 소중한 시간을 매우 절약 할 수 있을 것 같았다.

다행히 오디오 파일은 소음과 배경음이 없는 환경에서 원어민이 깔끔하게 녹음한 파일이라 괜찮은 Speech Recognize Engine만 있으면 자막에 준하는 파일을 자동으로 생성 할 수 있을 것 같았다.

이제 문제를 간단하게 요약 할 수 있을 것 같다.

mp3 -> smi

 

구글링을 30분 정도 해보니 괜찮은 Speech Recognizer가 3가지 정도 있는 것 같다.

  1. Google Speech  API : 2016년 06월 현재 Limited Preview라 신청 후 승인까지 시간이 소요되고, 승인이 안되서 그런건지 API Document를 찾기 어렵다.
  2. Nuance Naturally Speaking : 왠지 될 것 같은데 구매를 하지 않아 정확히는 모르겠다.
  3. CMUSphinx : 카네기멜론에서 공개한 Open Source Speech Recognition Engine. 설치와 설정이 약간 번거롭지만 무료고 명령어 기반으로 처리되기 때문에 Batch 작업 돌리기에 적합하다.

위의 3가지 옵션을 약 30분 가량 고민하다. 제일 Geek하고 Batch processing에 용이해보이는 3번으로 진행하기로 결정했다.

MP3 -> SMI 작업에는 ffmpeg과 cmu-sphinxbase, cmu-pocketsphinx이 필요하며 설치 과정은 아래와 같다.

  1. ffmpeg을 피씨 또는 서버에 추가한다. Package를 다운로드 후 bin에 추가하여 사용하시면 편합니다!
    (ffmpeg을 설치하는 이유는 CMUSphinx가 Input File로 wav파일만 받기 때문에 mp3 파일을 wav 파일로 변환해야 한다)
  2. cmu-sphinxbase를 설치한다.  (OSX 사용자 기준)
  3. cmu-pocketsphinx를 설치한다.  (OSX 사용자 기준)

* cmu-sphinxbase와 cmu-pocketsphinx의 stable 버전은 0.8인데 OSX 사용자는 HEAD revision을 설치하기를 권장합니다. 자세한 이유와 설치 방법은 https://github.com/watsonbox/homebrew-cmu-sphinx 포스팅 참고.

 

필요한 프로그램이 설치됐으면 필요한 기능들이 제대로 동작하는지 확인해보자

ffmpeg을 이용해 MP3 파일을 WAV로 변환하는 명령어 (ar: Sample Rate,  ac: Channel)

WAV 파일로 변환된 오디오에서 텍스트를 추출하는 명령어

 

위의 2가지 명령어 + 편한 Script 언어를 조합하여 오디오 파일에서 텍스트를 추출할 수 있다.

한가지 아쉬운 점은 CMUSphinx에 미국 발음 Recognizer만 기본으로 내장하고 있어 영국 발음으로 녹음된 파일의 경우 인식률이 조금 떨어진다는 점이다.

테스트 결과 미국 발음으로 녹음된 음원은 80~85%, 영국 발음은 60~65% 정도의 인식률이 나온다.

 

아래는 PHP로 작성된 MP3 -> SMI

* PHP 뉴비라 인터넷에서 몸에 좋다는 코드들 덕지 덕지 붙여서 만들었습니다;

* 고백하자면 이해를 돕기위해 자막/SMI 라는 표현을 차용했을 뿐 정확히 SMI 포맷을 생성하기 위해서는 약간의 수정이 필요합니다.

 

Older posts Newer posts

© 2017 Regular Motion

Theme by Anders NorenUp ↑