2014년 8월 27일 수요일

Perl 사용하지 않는 png 이미지 찾기

사용하지 않는 png 이미지 찾아 result.txt 로 출력하는 perl.


#!/usr/bin/perl

# SearchToNotUsePng.pl
# seesky89 20140826
# usage :
#    Android Application 개발시 사용하지 않는 png 이미지 제거를 위해 만듬.
#    cgywin(for Windows) 또는 리눅스에서 아래 명령 입력(상위 폴더기준)
#    perl SearchToNotUsePng.pl
#    정확성을 위해 gen, bin 폴더는 삭제 필요.

use strict;
use warnings;
use File::Find;
use File::Find qw(find);
use Cwd;


my $dir = '.';

open FH, ">", "result.txt" or die "$!\n";

my $mainDir = getcwd;
print FH "Search to not use resource. you need to check.\n";
print FH $mainDir, "\n";
print FH "------------------------------------------------------------\n";

find(\&find_use_file, $dir);

close FH;

print ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n";
print "Check to result.txt\n";
print ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n";

sub find_use_file {

    my $file = $_;
    my $currentDir = getcwd;
    
    if (-d $file) {
        #print "skip dir : $file\n";
    } elsif (-f $file) {
        #print "file : $file\n";

        if (/\b.9.png\b/i) {
            print "search file : $File::Find::name\n";

            # filename.png
            my $lastindex = rindex($file, '.9');
            my $search = substr($file, 0, $lastindex);

            $currentDir = getcwd;
            chdir('../..');

            my $ret = system("find . -name -prune -o -type f \( -name '*.java' -o -name '*.xml' -o -name '*.c' \) -print0 | xargs -0 grep --color -n $search");
            if($ret != 0) {
                print FH $File::Find::name, "\n";
            }

            chdir($currentDir);

        } elsif (/\b.png\b/i) {
            print "search file : $File::Find::name\n";
            
            # filename.png
            my $lastindex = rindex($file, '.');
            my $search = substr($file, 0, $lastindex);


            $currentDir = getcwd;
            chdir('../..');

            my $ret = system("find . -name -prune -o -type f \( -name '*.java' -o -name '*.xml' -o -name '*.c' \) -print0 | xargs -0 grep --color -n $search");
            if($ret != 0) {
                print FH $File::Find::name, "\n";
            }
            
            chdir($currentDir);
        } else {
            #print "skip other file : $file\n";
        }
    }
}

Linux find 명령 활용한 파일내 string 찾기

안드로이드 envsetup.sh 파일을 참고하여 작성된 function.

아래 파일을 sh 파일로 저장후 cygwin 이나 Linux 환경에서 동작.

". filename.sh" 실행후, functionName string 으로 사용.


function jgrep()
{
find . -name .repo -prune -o -name .git -prune -o  -type f -name "*\.java" -print0 | xargs -0 grep --color -n "$@"
}

function cgrep()
{
find . -name .repo -prune -o -name .git -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@"
}

function resgrep()
{
for dir in `find . -name .repo -prune -o -name .git -prune -o -name res -type d`; do find $dir -type f -name '*\.xml' -print0 | xargs -0 grep --color -n "$@"; done;
}

function mangrep()
{
find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -type f -name 'AndroidManifest.xml' -print0 | xargs -0 grep --color -n "$@"
}

function sepgrep()
{
find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -name sepolicy -type d -print0 | xargs -0 grep --color -n -r --exclude-dir=\.git "$@"
}

function allgrep()
{
find . -name .repo -prune -o -name .git -prune -o -type f \( -name '*.java' -o -name 'AndroidManifest.xml' -o -name '*.xml' -o -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@"
}

2014년 8월 4일 월요일

Android Studio 오류 해결 Tip



1. Android Studio 설치후 실행시 아래와 같은 에러 발생시


환경설정의 JAVA_HOME 확인후 이상없을 경우는 vmoptions 변경.

Failed to create JVM: error code -4
JVM Path: C:\Program Files\Java\jdk1.7.0_45\jre
If you already have a 32-bit JDK installed, define a JAVA_HOME variable in Computer > System Properties > System Settings > Environment Variables.

C:\Program Files\Android\android-studio\bin\studio.exe.vmoptions
위 파일의 내용을 아래와 같이 변경.
-Xmx512m  -> 256m
-XX:MaxPermSize=250m  -> 128m

2. 윈도우 xp 에서 실행시 splash 이미지만 뜬후 실행되지 않을경우

(특히 android studio update 이후 발생)
vmoptions 수정

-Xms256m -> -Xmx256m
-Xms750m -> -Xmx256m

3. Design Preview 로딩중 상태에서 멈출 경우

clean - rebuild - Invalidate Cacheds/Restart 실행

4. Android ClassNotFoundException: Didn't find class "class name" on path ~ 오류

이미 설치되어 있는 aosp 를 reinstall 할때 주로 발생하였다.
build.gradle 에 "multiDexEnabled true" 로 되어 있는지 확인
없다면, false 로 명시해주자.
보통은 multiDex 관련 에러이나, 다른 원인에 의해 발생할수도 있는것 같다.


5. xml 상에서 "cannot find symbol ?attr/actionBarSize" 등의 오류 발생 (빌드는 잘됨)
  1) close project -> 새로 import projcet 해라
  2) 1 을 해서 안된다면, gradlew cleanBuildCache 해보자
  3) 2 를 해서 안된다면, buildtoolvesion 과 support library 를 최신으로 설정


2014년 7월 9일 수요일

Android Timer Class example



Timer repeat


TimerTask myTask = new TimerTask() {
    public void run() {
       // to do
    }
};

Timer timer = new Timer();
//10 second
timer.schedule(myTask, 1000, 1000*10);


Windows + gvim + ctags + cscope + taglist


- gvim 명령어
vimrc 파일 링크
https://drive.google.com/file/d/0B8GbcWIV_h-OOC1ndXBZZVRhX2s/edit?usp=sharing


> 커서 이동
 k        커서를 위로 움직임
 j         커서를 아래로 움직임
 h        커서를 왼쪽으로 움직임
 l         커서를 오른쪽으로 움직임
 -        커서를 줄의 처음으로 옮김
 e, E     다음단어의 끝으로, 문자단위 이동
 w, W    다음단어의 처음으로, 문자단위 이동
 $        줄의 마지막으로
 0        줄의 처음으로
 ^        줄의 처음으로(공백이 아닌 처음시작되는 문자)
 Shift+g 문서의 마지막으로 이동한다.
 gg, 1g  문서의 처음으로 이동한다. 1대신 다른 숫자를 입력하면 해당 숫자의 라인으로 이동한다.
 ), (      다음, 이전 문장의 처음으로
 }, {      다음, 이전문단의 처음으로
 ]], [[     다음, 이전 구절의 처음으로
> 화면 스크롤
 ^F      한 화면 을 앞으로 스크롤
 ^B      한 화면 을 뒤로 스크롤
 ^D      반 화면 을 앞으로 스크롤
 ^U      반 화면 을 뒤로 스크롤
 ^E      한줄 앞으로 스크롤
 ^Y      한줄 뒤로 스크롤
 Shift + h         화면의 맨 윗줄로
 Shift + m         화면의 중간줄로
 Shift + l          화면의 맨 아랫줄로
> 입력
 i         현재위치에서 삽입
 I         현재줄의 처음위치에서 삽입
 a        현재위치에서 한칸앞으로 이동해서 삽입
 A        현재줄의 마지막위치에서 삽입
 o        새로운 줄을 커서 아래에 연다
 O       새로운 줄을 커서 위연다
 s        현재 위치의 문자를 지우고 입력모드로 들어간다.
 S        현재위치의 라인을 지우고 입력모드로 들어간다.
> 편집
 y        한줄 복사
 yn       현재 라인에서부터 n라인만큼을 복사
 p        복사된 내용 붙이기
 dd      한줄삭제
 dw      한단어 삭제
 Shift+d, d$       현재커서 위치에서 마지막까지 삭제
 Shift+j  현재 행의 개행문자를 제거한다. 즉 아래라인을 현재라인에 덧붙인다.
> 블록
 v        단어단위로 블럭지정이 가능하다. 블럭범위는 이동명령인 'hjkl' 로 원하는 범위 만큼 지정할수 있다.
 Shift+v 라인단위 블럭지정이다. 라인전체가 선택되며, 위아래 이동명령 'hj' 으로 범위 지정이 가능하다.
 Ctrl+v  블럭단위 블럭지정이다. 4각형의 블럭지정이 가능하며 이동명령인 'hjkl' 로 원하는 범위를 지정할수 있다.
> 파일 처리
 :e [filename]     filename 으로 파일열기
 :q, :q!, :wq       종료, 강제종료, 저장후 종료
 :w, :w [filename] 현재파일명으로 저장, filename 로 저장
 :<범위>w [filename]       지정한 범위만 다른 파일로 저장
 :e [filename]     filename 을 편집하기 위해서 연다
 ZZ      지금파일을 저장하고 vim 을 종료한다.
 :f        현재 작업중인 파일의 이름과, 라인수를 출력한다


- ctags
 압축파일 다운

 환경변수 설정

1. tags 파일을 만들기
우선 소스에서 Makefile 확인하여 tags 타겟이 있는지 확인. 있다면 그걸 활용.
# make tags

없다면, 해당 프로젝트 폴더에서 아래 명령을 batch로 만들거나 직접 실행.
ex) ctags.bat
:: for windows
ctags -R .

2. vim 설정
tags 파일이 있는 경로를 설정합니다.

# vi ~/.vimrc
""""""""""""""""""""""""""""""""""""""""""""""""
" ctags 연결
""""""""""""""""""""""""""""""""""""""""""""""""
"set tags+=D:\tags
set tags+=D:\Source\tags

경로 추가시 반드시 /tags 까지 포함해야 함. 절대경로로 작성.

CTRL+ ] (go) , CTRL+T (back)

3. 명령어
 gvim –t keyword, 또는 :ta keyword
 :ta keyword keyword와 일치하는 태그 위치로 이동
 :ta /keyword keyword가 포함된 태그 검색
 :tj keyword keyword와 일치하는 태그 목록을 출력하고 선택하여 이동 (일치하는 태그가 한개일 경우 바로 이동)
 Ctrl + ] 커서가 위치한 keyword의 정의 부분으로 이동
 Ctrl + t, Ctrl + o 이전 위치로 이동
 :tn 다음 태그로 이동
 :tp 이전 태그로 이동
 :tags 이동한 태그 히스토리 목록 출력

- cscope
1.cscope 생성
cscope.bat
::#!bin/sh
::rm -rf cscope.files cscope.files
::find . \(-name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' -o -name '*.java' \) -print > cscope.files
::cscope -i cscope.files

:: for windows
rm -rf cscope.files cscope.files
dir /B /S *.c *.cpp *h *.s *.S *.java -print > cscope.files
cscope -b -q -k


리눅스에서는 cscope.sh파일을 실행권한을 부여한다음 /usr/bin 에 복사하면 편리하게 사용 할 수 있다.

2. vim 설정
""""""""""""""""""""""""""""""""""""""""""""""""
" cscope 연결
""""""""""""""""""""""""""""""""""""""""""""""""
"source $VIMRUNTIME/plugin/cscope_maps.vim
"cs add D:\cscope.out
cs add D:\Source\cscope.out


3. 명령어
:cs find [질의방법][심볼이름]
ex) :cs find s task_struct


질의종류
0 or s - > Find this C symbol
1 or g - > Find this definition
2 or d - > Find functions called by this function
3 or c - > Find functions calling this function
4 or t - > Find assignments to
6 or e - > Find this egrep pattern
7 or f - > Find this File
-TagList
1. 설치
태그리스트는 vim 플러그인으로 현재 작업 파일의 심볼을 나열하는 기능.
http://vim-taglist.sourceforge.net/
plugin 폴더에 저장.
2. 명령어
:Tlist 실행
창 전환 ctrl+ww















[gVim plugin 설정]
https://www.facebook.com/vim.kr/posts/1421915028024646:0
위 내용 참고하면 됨.
단, 아래 설정시 Windows 에 administaror 계정만 있는 경우 아래 예시처럼 변경 필요.
적당한 위치에 git 으로 받을 폴더 위치 생성.
> git clone https://github.com/gmarik/vundle.git .vim/bundle/vundle.vim
_vimrc 에도 동일한 경로로 지정.
set rtp+=C:\.vim\bundle\vundle.vim

_vimrc 참고
set rtp+=C:\.vim\bundle\vundle.vim

call vundle#begin()
"let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

"추가하고 싶은 플러그인을 아래에 나열
Plugin 'bling/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'altercation/vim-colors-solarized'

Bundle 'tpope/vim-fugitive'
Bundle 'Lokaltog/vim-easymotion'
Bundle 'rstacruz/sparkup', {'rtp': 'vim/'}
Bundle 'tpope/vim-rails.git'
Plugin 'scrooloose/nerdtree'
Plugin 'airblade/vim-gitgutter'
Plugin 'scrooloose/syntastic'
Plugin 'ctrlpvim/ctrlp.vim'
Plugin 'nanotech/jellybeans.vim'
Plugin 'kchmck/vim-coffee-script'
call vundle#end()

"plugin 설치 이후
color jellybeans
syntax enable "문법 강조
set wmnu "
set nu "라인 표시
set noswapfile "백업 파일 취소

if has("gui_running") "gvim만 적용
    set guifont=D2Coding:h12
    set background=dark
    colorscheme solarized
    set guioptions-=m "메뉴 삭제
    set guioptions-=T "툴바 삭제
    set guioptions-=r "스크롤 삭제
endif

32bit OS 2038년 문제



Android 뿐 아니라 32비트 운영체제에서 발생하는 현상.

signed int는 십진수로 -2147483648부터 2147483647까지의 정수를 저장.
다시 말해, time_t가 표현할 수 있는 시간의 범위는 1970 1 1일 자정을 기준으로
2147483648초 전과 2147483647초 후까지.
이것을 날짜로 계산해보면 1901 12 13 20:45:52 부터 2038 1 9일 화요일 03:14:07 까지임.
여기서 1초가 더해질 경우 다시 1901년이 되어 문제가 발생.

Android ADB



1. ADB 명령으로 activity 실행
adb shell 실행후, am start -a <action> -n <component name>
#am start -a android.intent.action.MAIN -n com.android.deskclock/.AlarmClock

start an Activity: am start [-D] [-W] <INTENT>
  -D: enable debugging
  -W: wait for launch to complete
start a Service: am startservice <INTENT>
send a broadcast Intent: am broadcast <INTENT>

2. ADB Process find and kill

adb shell ps | find "deskclock"
2번째 숫자정보가 pid
Adb shell kill pid

Android Jetpack viewpager2

  Android Jetpack ViewPager2 기본 개념 및 샘플 코드 오늘은 안드로이드 개발에 있어서 굉장히 유용한 컴포넌트 중 하나인 ViewPager2에 대해 이야기해볼까 합니다. ViewPager2는 사용자 인터페이스에서 여러 화면을 좌우...