2017년 5월 22일 월요일

공유기 추가 설정

IPTV 공유기를 다른방에서 사용시 와이파이 속도가 느린 감이 있어 공유기를 추가 설치
공유기 추가 방법에는 여러가지가 있을수 있겠다.

1. sub 공유기를 WDS 모드로 설정하여 사용
2. sub 공유기를 AP/스위치(허브) 형태로 연결하여 사용 (그림 1)
3. sub 공유기를 main 공유기에 연결하여 사용(?) (그림 2)
4. sub 공유기의 wifi 를 main 공유기와 동일한 이름으로 설정하기(무선 멀티브리지 기능 이용)


그림 1


그림 2

나의 경우에는 집안의 네트워크를 하나로 연결하기 위해 2번 방법으로 연결하였다.
여기서 사용된 공유기 환경은 main 공유기는 SK broadband 공유기이며, sub 공유기는 iptime 공유기이다.

SKB 공유기 초기값
웹설정 주소 : 192.168.35.1
사용자 계정 : admin
사용자암호 : XXXXXX_admin
(영문 대문자 사용, 공유기 뒷면 MAC주소 참고)

IPTIME 공유기 초기값
웹설정 주소 : 192.168.0.1

세팅
작업은 sub 공유기에서만 하면 된다.

(1) 공유기의 내부IP 주소 변경
공유기에 접속하여 [관리도구] - [고급설정] - [네트워크관리] - 
[내부네트워크 설정]을 클릭하고,
내부IP주소의 끝자리를 임의적으로 변경후 저장.
공유기 재부팅.

초기값 : 192.168.0.1 -> 변경 예 : 192.168.0.10

(2) 공유기의 DHCP 기능 중지
재부팅후, [내부네트워크 설정] 하단의 [DHCP 서버 설정]을 [중지]로 체크.
재부팅.

랜선 연결은 그림 2 처럼 연결.

참고.
1. DHCP 사용안함 선택시, sub 공유기에 접속하려면 초기화 해야한다.
(변경된 ip 로 접속안됨)
2. iptime 설정은 해당 홈페이지 참고
http://iptime.com/iptime/?page_id=67&uid=7433&mod=document

2017년 5월 10일 수요일

Annotation

Custom Annotation

선언
@Retention(용도)
@Target(범위)
public @interface XXX {
    ...
}

용도
RetentionPolicy.java (java.lang.annotation)
/**
 * @since 1.5
 */
public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     * 컴파일러가 사용하고 클래스 파일 안에 포함되지 않음 (단순 주석용, 컴파일러용)
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     * 컴파일시 클래스 파일 안에 포함되나 VM에서 무시함
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     * 컴파일시 포함되고 VM에서 인식함
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}

범위
ElementType.java (java.lang.annotation)
/**
 * @since 1.5
 */
public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     * @hide 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     * @hide 1.8
     */
    TYPE_USE
}

2017년 4월 27일 목요일

Android N - AlarmManager 사용시 PendingIntent 에 Parcelable 로 전달시 수신부에서 null 이 되는 현상

AlarmManager 사용시 PendingIntent 에 Parcelable 로 전달시 수신부에서 null 이 되는 현상

Android N 이후부터 발생(정확히 7.0 인지 7.1 인지는 모르겠다)

// send
intent.putExtra(EXTRA_DATA, xxx);
// xxx  Parcelable 구현 객체
 
// receive
final XXX xxx = bundle.getParcelable(EXTRA_DATA);
// 여기서 null 발생.

관련하여 검색을 해보면 아래 issue tracker 에도 등록이 되어 있다.

google 에서는 “Won't Fix (Intended behavior)” 로 처리.

app 에서 수정 필요.

// send
Bundle bundle = new Bundle();
bundle.putParcelable(EXTRA_DATA, xxx);
intent.putExtra(EXTRA_DATA, bundle);
 
// receive
Bundle bundle = intent.getBundleExtra(EXTRA_DATA);if (bundle != null) {
    final XXX xxx = bundle.getParcelable(EXTA_DATA);
}


참고로, 문자열이나 정수형 등은 정상적으로 전달이 된다.
only Parcelable 객체만 해당되는 것 같다.

2017년 4월 26일 수요일

Android Studio Plugin

plugin 설치는 File -> Settings -> Plugins

1. BitBucket

Android Studio + BitBucket +Git 이용한 소스 관리 참고

2. Android API Level

간단히 api level 보여주는 plugin
Browser repositories -> "api level" 로 검색하여 설치

3. IdeaVim

vim emulating plugin
Browser repositories -> "ideavim" 으로 검색하여 설치


2017년 4월 21일 금요일

Android 개발 관련

Android 개발 관련 정리 및 Tip 모음.

1. signing key 확인

signing key 파일과 apk 가 같은 key 인지 확인할때 아래 명령어 사용

1.1 signing key fingerprint 확인
keytool -list -keystore xxx.jks

1.2 apk fingerprint 확인
keytool -list -printcert -jarfile xxx.apk

위 2가지의 fingerprint 같으면 동일한 key 로 서명이 된것임.

2. Log

Log 출력시, line, method name 포함하여 보여준다.
아래와 같은 식으로, level 별로 각각 만들면 됨.
LOGV_TAG 는 기존 로그와의 호환을 위해 사용.

Log.java

public class Log {
    public final static String TAG = "InputCommonTagName";

    public static final boolean LOGV = true;
    static final boolean LOGV_TAG = true;


    static int mLine=0;
    static String mName="";
    static String mPkg="";
    
    public static void v(String logMe) {
        if(LOGV) {
            StackTraceElement[] stack = (new Throwable()).getStackTrace();
            mLine = stack[1].getLineNumber();
            mName = stack[1].getMethodName();
            mPkg = stack[1].getFileName();
            android.util.Log.v(TAG, ""+mPkg+", "+mLine+" line, "+mName+"(), "+logMe);
        }
    }

    public static void v(String tag, String logMe) {
        if(LOGV_TAG) android.util.Log.v(tag, logMe);
    }
}


3. Live Templates 연동 (Android Studio)

File -> Settings -> Editor -> Live Templates -> AndroidLog

Add -> 적당한 이름 추가.






3-1. method 에 parameter 같이 출력하기.

3-1-1. android.util.Log 사용시

Template text :

Log.d("TAG_NAME", "$CLASS_NAME$ : $METHOD_NAME$()" : $content$);

$content$ 에 대한 Edit variables 작성 (그림 참고)

groovyScript("def params = _3.collect {it + ' = [\" + ' + it + ' + \"]'}.join(', '); return '\"' + _1 + ' : ' + _2 + '()' + (params.empty ? '' : ' : ' + params) + '\"'", className(), methodName(), methodParameters())


3-1-2. 2번의 Log 사용시

Log.d($content$);

groovyScript("def params = _1.collect {it + '=\"+'+it}.join('+ \"'); return '\"' + (params.empty ? '' : params)", methodParameters())

or

groovyScript("def params = _1.collect {it + ' = [\" + ' + it + ' + \"]'}.join(', '); return '\"' + (params.empty ? '' : params) + '\"'", methodParameters())


3-2. return value 같이 출력하기

3-2-1. android.util.Log 사용시

Template text :

Log.d("TAG_NAME", "$CLASS_NAME$ : $METHOD_NAME$() returned: " + $result$);

$content$ 에 대한 Edit variables 작성 (그림 참고)

variableOfType(methodReturnType())


3-2-2. 2번의 Log 사용시

Log.d("returned : $result$=" +  $result$);

$result$ 에 대한 Edit variables 작성
variableOfType(methodReturnType())


2017년 4월 13일 목요일

Blogger 관련 Tip

1. 소스 코드 넣기

1-1. highlightjs 를 사용한다. (아래 링크 참고)

https://highlightjs.org/download/



1-2. cdnjs 사용
테마 -> HTML 편집 -> <head> 마지막에 붙여넣는다.
css style 은 취향게 맞게 변경 가능.

<link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.10.0/styles/default.min.css" rel="stylesheet"></link>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.10.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>

1-3. 소스 코드를 html 모드로 편집
class 설정은 생략 가능. 알아서 처리됨. (ex: <code class="language-java">)

<pre><code>
// to do
</code></pre>

1-4. html 태그의 경우는 escape 시켜줘야한다.
관련 web site 는 많으니 검색해서 사용하면 된다.(html escape)

http://www.igorware.com/tools/xml-escape
http://www.blogcrowds.com/resources/parse_html.php


ps 1. 테마 변경시마다 1-2번 작업을 다시 해주어야 한다.
ps 2. 테마중 "동적 뷰" 의 경우는 동작하지 않으니 다른 방식으로 적용해야 한다.(구글링...)


2. 메뉴 넣기(상단 or 사이드)

2-1. 레이아웃 -> 전체열(가젯추가) -> 페이지 선택
2-2. 외부 링크 추가 -> 입력
  웹주소 형식은 "http://블로그주소/search/label/라벨이름(태그이름)?max-results=숫자"
  숫자는 해당 탭 선택시 보여질 페이지수. 1 권장.
  예로, 페이지 제목 : "Android",
  웹주소 : "http://seesky89.blogspot.kr/search/label/Android?max-results=1" 설정하면,
  상단에 Android 탭이 생겨 사이드바의 태그와 동일한 기능을 한다.

3. 파일 첨부 하기

구글 드라이브 이용하여 링크 걸어야 한다.



2016년 5월 24일 화요일

Android Gradle

asserts 폴더에서 필요한 파일만 포함하여 apk 만들기

productFlavors 와 sourceSets 을 조합
 
productFlavors {
    ABC {
    }

    DEF {
    }
}
 
sourceSets {
    ABC {
        assets.srcDirs = ['src/main/assetsABC']
    }

    DEF {
        assets.srcDirs = ['src/main/assetsDEF']
    }
}
 
 
 

2015년 12월 14일 월요일

2015년 7월 23일 목요일

Eclipse Project -> Android Studio Migration

이클립스로 개발했던 프로젝트를 Android Studio 로 migration 하면서 알게된 Tip 정리.
module 의 build.gradle 에 추가.

1. dependency 설정

dependencies {
    compile files('libsFolderName/name.jar')
    //compile fileTree(dir: 'libs', include: ['*.jar'])
}




2. android.jar 보다 먼저 참조시키기

Xbootclasspath 설정

-Xbootclasspath/p:"Module Name"/"jar path"

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs.add('-Xbootclasspath/p:app/libs/xxx.jar')
    }
}
cf> Xbootclasspath 에 대한 상세 설명은 아래 링크 참조
-Xbootclasspath/p:path
디렉토리, JAR 어카이브(archive), 및 ZIP 어카이브(archive)의 패스를 세미콜론으로 단락지어 지정.
패스는 디폴트의 bootstrap 클래스 패스전에 추가됨.
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html
http://java.ihoney.pe.kr/27

3. 외부 class 파일이나 so 추가시 jar 로 변환(?) 후 참조하기

(참조 : stackoverflow.com)
task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
    destinationDir file("libs") // jar 로 압축된 파일이 저장될 폴더 위치
    baseName 'name'  // jar 로 압축할 파일 이름 (위 dependencies 에서 사용될 name.jar)
    extension 'jar'  // 확장자 이름
    from fileTree(dir: 'ExtClass', include: '**/*.class')  //가져올 원본 class or so 파일
    //into 'lib/'  // jar로 압축하면서 만들 추가 폴더 이름. android class 파일들은 지정안하는게 나음.
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}






4. 빌드시 제외시키고자 할 경우

android {
    ... ...
    sourceSets {
        main {
            java {
                exclude '**/name.java' 
            }
        }
    }
}



5. 빌드후 apk 이름 변경시키기

defaultConfig {
    project.ext.set("archivesBaseName", "name");
}

6. 서명키

프로젝트 최상위 경로에 gradle.properties 파일 생성하여 아래 항목 작성
keystore=jks path
keystore_pass=xxx
key_alias=xxx
key_pass=xxx

build.gradle 에서 사용
signingConfigs {
    releaseWithProps {
        storeFile file(keystore)
        storePassword keystore_pass
        keyAlias key_alias
        keyPassword key_pass
    }
}






7. migration 후 빌드까지 정상적으로 되었으나 실행시 INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 에러 발생할 경우

package 명에 대문자가 있을 경우 소문자로 변경후 clean 빌드하면 정상 동작한다.
Android Studio 에서 package rename 하는 방법은,
프로젝트 탭의 설정 아이콘 선택 -> "Compact Empty Middle Packages" uncheck -> 변경하고자 하는 폴더에서 마우스 우클릭 -> Refactor -> Rename 실행.




8. file encoding

한글 오류 발생할 경우,
해당 파일 -> 메뉴 -> File -> file encoding 선택 -> x-window-949 선택 -> reload
-> 다시 메뉴 반복 file enconding 선택 -> utf-8 선택 -> convert



9. framework debugging

해당 소스 파일을 SDK\soruces\해당버전에 위치시킴





2015년 5월 28일 목요일

Windows 7 64비트 설치 오류시

Windows 7 64비트 설치시 재부팅후 오류 팝업 뜰 경우

usb3.0 포트에 무선마우스 동글 장착 상태로 설치시 오류 발생함.
동글 제거후 설치하니 잘됨.
참고로, windows 8 64비트는 동글 장착해도 잘 되었음.

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

안드로이드(Android) 16 소개

    안드로이드 16이 드디어 출시되었어요!  🎉 이번 포스팅에서는 안드로이드 16의 다양한 기능과 장점에 대해 자세히 알아보도록 할게요.  1. 안드로이드 16 소개 안드로이드 16은 구글의 모바일 운영 체제인 안드로이드의 최신 버전으로, 많은 ...