원하는 노래들을 앨범에 저장


스마트폰을 켜고 벅스 앱을 실행


내 앨범 들어가서 컴퓨터에서 고른 노래들을 내 핸드폰에 저장


※ 로그인할때 아주 조금 데이터가 든다.


로그인 후 이용 가능

페이스북에 접속 - 내 프로필로 이동~

F12 를 눌러서 내가 사용할 프로필을 클릭!

src = "http 쏼라쏼라"

href = "http 쏼라쏼라"


복사 해서


내 블로거 테마에서 넣을 곳에

src="http 쏼라쏼라" 

href="http 쏼라쏼라"


붙여 넣어주면 끝~!

Tomcat의 로그를 보다보니 날짜별로 로그 파일을 나누어 쌓고 있음과 동시에 catalina.out이라는 파일에도 중복하여 로그를 쌓는것을 알수 있다.

이 파일은 끝없이 커지는데 관리상 좋지 못한것은 자명한 일이다. 이 문제를 해결하기 위해 catalina.sh 파일을 수정한다.

start 부분을 찾아 다음과 같이 수정하자.

elif [ "$1" = "start" ] ; then
    shift
#  touch "$CATALINA_BASE"/logs/catalina.out
 
if [ "$1" = "-security" ] ; then
    echo
"Using Security Manager"
    shift
   
"$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
     
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
     
-Djava.security.manager \
     
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
     
-Dcatalina.base="$CATALINA_BASE" \
     
-Dcatalina.home="$CATALINA_HOME" \
     
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org
.apache.catalina.startup.Bootstrap "$@" start \
     
>> /dev/null 2>&1 &
#      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

     
if [ ! -z "$CATALINA_PID" ]; then
        echo $
! > $CATALINA_PID
     
fi
 
else
   
"$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
     
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
     
-Dcatalina.base="$CATALINA_BASE" \
     
-Dcatalina.home="$CATALINA_HOME" \
     
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
      org
.apache.catalina.startup.Bootstrap "$@" start \
     
>> /dev/null 2>&1 &
#      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

     
if [ ! -z "$CATALINA_PID" ]; then
        echo $
! > $CATALINA_PID
     
fi
 
fi


catalina out 만들고 없애는 방법


* 추가 - 더 편한 방법
언제 부터인가 위의 설정이 >> "$CATALINA_OUT" 2>&1 &와 같이 바뀌었습니다.
/etc/profile에 다음을 추가하셔도 한방에 해결됩니다.

export CATALINA_OUT="/dev/null"


출처 -  http://theeye.pe.kr/entry/Tomcat-%EB%AC%B4%EB%B6%84%EB%B3%84%ED%95%98%EA%B2%8C-catalinaout-%ED%81%AC%EA%B8%B0-%EC%BB%A4%EC%A7%80%EB%8A%94%EA%B2%83-%EB%A7%89%EA%B8%B0 






Tomcat Catalina.out 로그로테이션


톰캣서버의 로그파일은 그대로 두면 사이즈가 엄청나게 커져 있음은 물론이고,

한 파일에 지금까지의 로그가 모두 기록되어 있기 때문에 필요한 정보 검색에도 불편함이 있다.
그래서 로그파일을 년/월/주/일 등의 간격으로 로테이션 시킬 필요가 있다.

지금 일하고 있는 회사에서도 상당히 많은 리눅스 서버에서 톰캐서버를 가동시키고 있는데
일주일에 한번 메인터넌스 작업중 톰캣을 정지시키고 수동으로 백업하는 작업을 해오고 있었다.

로그로테이션에 대해 알아보니 여러가지 방법이 있었는데 그 중에 추가 설치 없이 제일 편하게 사용할 수 있는 방법이
아파치 서버를 설치하면 기본 설치되는 "rotatelogs" 이다.

설정방법은 간단하다.

%CATALINA_HOME%bin/catalina.sh 수정 

1. touch "$CATALINA_BASE"/logs/catalina.out 를 삭제 또는 커멘트 처리

2. "$CATALINA_BASE"/logs/catalina.out2>&1 & 를 다음과 같이 수정
 | /usr/local/apache/bin/rotatelogs "$CATALINA_BASE"/logs/catalina.out.%Y-%m-%d 86400 540 &

단, 수정할 부분이 두 줄이므로 주의할 것(두 줄다 수정)
86400은 일단위로 로테이션(초단위 설정)
540은 표준시와 한국시간과의 시간차

위의 설정을 완료한 뒤, 톰캣서버를 재기동하면 catalina.out.yyyy-mm-dd 형식의 파일이 생성되어 있음을 알 수 있다.

이상으로 로테이션 설정은 완료.

이전 파일을 삭제하거나 압축해서 보관하는 쉘을 Cron에 등록해서 정기적으로 관리하면 더 좋겠다.



출처 -  http://siho.tistory.com/52 






Apache Tomcat의 로그파일인 catalina.out은 기본적으로 순환되지 않고 한개의 파일로 계속해서 로그가 쌓이게 됩니다.

이게 나중에 가면 크기가 매우 커져서 문제가 발생할 소지가 있는데요..
이 파일을 순환시키기 위한 방법을 소개합니다.


이와같은 기능을 찾아보면 일반적으로 cronolog같은 툴을 사용하거나 log4j를 이용하도록 한 다른 글들을 찾아볼수 있는데 이는 상당히 번거롭고 추가적인 툴이 필요한 방법이기 때문에 리눅스의 기본 로그 순환 도구를 이용하여 사용하는 방법을 설명한다.


/etc/logrotate.d 디렉토리 안에 아래의 파일을 생성한다.

$ cd /etc/logrotate.d
$ cat > tomcat

/var/local/tomcat/logs/catalina.out {
 copytruncate
 daily
 rotate 30
 compress
 missingok
 notifempty
 delaycompress
}


여기서 중요한 부분은 copytruncate 부분입니다.

저옵션을 쓰지 않으면 기존의 맨처음 로그가 생성된 파일에 계속해서 로그가 쌓이게 됩니다.
이러한 원인은 톰캣의 로그가 System.err 객체나 System.out을 사용하기 때문에 시스템의 raw디바이스로 출력이 되어 파이프를 타지 않기 때문입니다.

따라서 원래 로그를 다른이름으로 저장하고 새로운 catalina.out을 생성한다해도 실제 로그 스트림은 다른이름으로 지정된 원래 로그쪽으로 계속해서 쌓이게 됩니다.

이걸 방지하기 위해 현재 로그내용을 복사하여 백업본으로 저장한후 원본 로그의 내용을 비우는 방식으로 저장해야 합니다.

그래서 옵션을 copytruncate를 사용해야 합니다.


이렇게 하면 톰캣의 catalina.out로그가 매일 하나씩 쌓이게 됩니다.


출처 - http://koov.net/blog/?/tag/rotate






Catalina로그를 한 파일에 누적되는 것을 피하기 위해서 보통은 cronolog,  log4j를 활용을 많이 하는데 기존 리눅스 시스템의 소프트웨어를 활용하는 방안을 하나 소개해 드립니다.

1. /etc/logrotate.d 디렉토리 안에 아래의 파일을 생성

$ cd /etc/logrotate.d
$ cat tomcat

${CATALINA_HOME}/logs/catalina.out {
 copytruncate
 daily
 rotate 30
 compress
 missingok
 notifempty
dateext
}
$logrotate -f /etc/logrotate.d/tomcat # 로그파일 순환 테스트
  • copytruncate : 기존 파일을 백업해서 다른 파일로 이동하고 기존 파일은 지워버리는 옵션
  • daily : 로그파일을 날짜별로 변환
  • compress : 지나간 로그파일들을 gzip으로 압축
  • dateext : 순환된 로그파일의 날짜확장자
  • missingok : 로그파일이 없더라도 오류를 발생시키지 않음
  • rotate 30 : 로그 파일은 30개만큼 저장된 다음 제거되거나 메일로 보내짐
  • notifempty : 파일의 내용이 없으면 새로운 로그 파일을 생성 안함


2. 그외 일자별로 저장 방법


출처 - http://www.mimul.com/pebble/default/2009/12/27/1261911840000.html


 





원문 : http://dev-world.springnote.com/pages/6460973?print=1



/etc/logrotate.d 을 이용한 catalina.out 나누기

 

Apache Tomcat의 로그파일인 catalina.out은 기본적으로 한개의 파일에 로그가 쌓이게 됩니다.

2009-11-13_130656.png



Tomcat을 재시작 하지 않는 이상 계속적으로 쌓이는 듯합니다. 벌써 용량이 후덜덜하네요.
이 파일을 다시는 볼일이 없다면 상관이 없지만...
열어 보려고 한다면... 시간 꽤 걸리듯합니다.
catalina.out의 만행을 그냥 두고 못 본척하신다면... 나중에 눈물 흘릴 수도 있습니다. :")

저도 모니터링 중에 문제가 생겨서 확인하려고 catalina.out 파일을 열어봤더니...
시간이 좀 걸리더군요...

그래서 catalina.out을 나누는 방법을 검색해봤습니다.

로그 파일을 rotate하는 방법에는 보통 4가지가 있습니다.

1. log4j
2. cronolog
3. logrotate
4. shell script


이번 포스트에서는 logrotate에 대하여 알아보겠습니다. 가장 사용하기 쉽고 제가 원하는 동작을 하더군요. :")

구분위치 및 실행 방법설명
데몬(위치)/usr/sbin/logrotate데몬의 위치 및 데몬프로그램
데몬 설정파일/etc/logrotate.conf설정파일
설정디렉토리/etc/logrotate.dlogrotate에 적용할 각종로그파일들 보관하는 디렉토리
상황파일/var/lib/logrotate.statuslogrotate한 작업내역을 보관한 파일
cron(일단위)/etc/cron.daily/logrotatelogrotate는 주기적으로 실행이되어야하므로 cron에 의해 일단위로 실행이 됨


Apache Tomcat 로그 순환 설정 : http://koov.net/blog/?/tag/rotate
위 블로그 가시면 간단히 catalina.out 로그 파일을 자동으로 나누게 설정하는

방법이 있습니다.

$ cd /etc/logrotate.d
$ cat > tomcat

/var/local/tomcat/logs/catalina.out {
copytruncate
daily
rotate 30
missingok
notifempty
}

$ logrotate -f /etc/logrotate.d/tomcat


실행 후 화면,

2009-11-13_133538.png



위 이미지와 같이 catalina.out.1 이라는 파일이 생성되는군요. 흠... 그럼 1, 2, 3 이런식으로 쌓일텐데 관리자의 입장에서는 좀 불편할 수도.... Buuuuuuuuuuut!!!!!

dateext 라는 옵션이 있군요!!!

$ cd /etc/logrotate.d
$ cat > tomcat

/var/local/tomcat/logs/catalina.out {
copytruncate
daily
rotate 30
missingok
notifempty
dateext
}

$ logrotate -f /etc/logrotate.d/tomcat
2009-11-13_135242.png






알아두셔야 할 점은 copytruncate 옵션은 반드시 써야 한다고 합니다.

copytruncate 옵션을 쓰지 않으면 기존의 맨처음 로그가 생성된 파일에 계속해서 로그가 쌓이게 됩니다. 이러한 원인은 톰캣의 로그가 System.err 객체나 System.out을 사용하기 때문에 시스템의 raw디바이스로 출력이 되어 파이프를 타지 않기 때문입니다.
따라서 원래 로그를 다른이름으로 저장하고 새로운 catalina.out을 생성한다해도 실제 로그 스트림은 다른이름으로 지정된 원래 로그쪽으로 계속해서 쌓이게 됩니다.
이걸 방지하기 위해 현재 로그내용을 복사하여 백업본으로 저장한후 원본 로그의 내용을 비우는 방식으로 저장해야 합니다.
그래서 옵션을 copytruncate를 사용해야 합니다.

copytruncate
Truncate the original log file in place after creating a copy, instead of moving the old log file and optionally creating a new one, It can be used when some program can not be told to close its logfile and thus might continue writing (appending) to the previous log file forever. Note that there is a very small time slice between copying the file and truncating it, so some logging data might be lost. When this option is used, the create option will have no effect, as the old log file stays in place.




logrotate의 설정 옵션에 대하여 조금 더 알아보면은,

dailyLog files are rotated every day.
weeklyLog files are rotated if the current weekday is less than the weekday of the last rotation or if more than a week has passed since the last rotation. This is normally the same as rotating logs on the first day of the week, but if logrotate is not being run every night a log rotation will happen at the first valid opportunity.
monthlyLog files are rotated the first time logrotate is run in a month (this is normally on the first day of the month).
notifemptyDo not rotate the log if it is empty (this overrides the ifempty option).
nocompressOld versions of log files are not compressed.
delaycompressPostpone compression of the previous log file to the next rotation cycle. This only has effect when used in combination with compress. It can be used when some program cannot be told to close its logfile and thus might continue writing to the previous log file for some time.
compressOld versions of log files are compressed with gzip by default.
mail addressWhen a log is rotated out of existence, it is mailed to address. If no mail should be generated by a particular log, the nomail directive may be used.
missingokIf the log file is missing, go on to the next one without issuing an error message.


보다 더 많은 옵션과 설명을 보시려면, http://linuxcommand.org/man_pages/logrotate8.html를 참고하세요.

superuser 사이트입니다. 옵션에 대해서 한글로 자세히 설명되어 있습니다.
http://www.superuser.co.kr/linux/logrotate/page04.htm



출처 : http://linuxism.tistory.com/298

안드로이드 카톡 프로필 여러장을 하나로 보이게 하는 방법에 대해

http://www.masterqna.com/android/61069/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%B9%B4%ED%86%A1-%ED%94%84%EB%A1%9C%ED%95%84-%EC%97%AC%EB%9F%AC%EC%9E%A5%EC%9D%84-%ED%95%98%EB%82%98%EB%A1%9C-%EB%B3%B4%EC%9D%B4%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4


https://hashcode.co.kr/questions/1341/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%82%AC%EC%A7%84-%EC%97%AC%EB%9F%AC%EC%9E%A5%EC%9D%84-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%B7%B0%EC%97%90-%EB%84%A3%EC%96%B4-rounding-%EC%B2%98%EB%A6%AC-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B6%81%EA%B8%88%ED%95%A9%EB%8B%88%EB%8B%A4



이미지 round 처리 방법


public static Bitmap getRoundedBitmap(Bitmap bitmap) {
    final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(output);
 
    final int color = Color.GRAY;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);
 
    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawOval(rectF, paint);
 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);
 
    bitmap.recycle();
 
    return output;
  }


출저 : http://www.kmshack.kr/2013/07/%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-bitmap-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%9D%BC%EC%9A%B4%EB%94%A9-%EC%B2%98%EB%A6%AC%EB%B0%A9%EB%B2%95/



이미지 그리기에 관련된 블로거

http://baramziny.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-path%EB%A1%9C-%EA%B7%B8%EB%A6%AC%EA%B8%B0

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >


    <item

        android:left="-2dp"

        android:right="-2dp">

        <shape android:shape="rectangle" >

            <stroke

                android:width="0.5dp"

                android:color="@color/silver" />


            <solid android:color="#00000000" />

        </shape>

    </item>


</layer-list>


--------------------------


--------------------------



위 두줄 실선 위 아래 선 주기

쉘 프로그래밍 문법들

쉘의 기능
- 명령어 해석기 기능
  사용자와 커널 사이에서 명령을 해석하여 전달
  사용자가 입력한 명령이나 파일에서 읽어들인 명령을 해석하고 적절한 프로그램을 실행

- 프로그래밍 기능
  쉘은 자체 내에 프로그래밍 기능이 있어 프로그램 작성가능
  쉘의 프로그래밍 기능을 이용하면 여러 명령을 사용해 반복적으로 수행하는 작업을 하나의 프로그램으로 제작 가능
  쉘 프로그램을 쉘 스크립트라고 부름

- 사용자 환경설정 기능
  초기화 파일 기능을 이용해 사용자 환경을 설정
  명령을 찾아오는 경로 설정, 새로운 파일의 기본 권한 설정, 다양한 환경변수 설정 등 사용자별로 사용 환경의 특성을 초기화 파일에 설정 가능
  로그인 할 때 이초기화 파일이 실행되어 사용자의 초기환경이 설정됨

쉘 스크립트 시작하기
1. 파일생성
- 파일을 만들기전 해당 디렉터리로 이동
- vi 에디터로 쉘 스크립트 파일 생성
- 일반적으로 쉘 프로그램의 파일 확장자는 .bash 또는 .sh를 사용함
- 이미 존재하는 다른 스크립트의 파일이름과 겹치지 않도록 함

2. 명령어작성
- vi 에디터가 실행되면 명령어 작성
- #!/bin/bash   -> #! 은 쉘에게 이 프로그램을 실행하기 위해서 #! 다음에 오는 아규먼트를 실행프로그램으로 사용한다는 것을 알려주기 위해서 사용된다
- # 는 주석처리로 사용

3. 실행권한 부여
- 쉘 스크립트를 실행하기 전에 실행 권한을 줘야한다.
- 파일이 생성되면 읽기/쓰기 권한은 있지만 실행권한은 없다

4. 쉘 스크립트를 실행
- ./filename.sh



조건문
if
쉘스크립트의 if 문을 사용하는 방식은 다음과 같다
if [ 조건 ];
then
   조건만족시 실행하고자 하는 문장
else
   조건 불만족시 실행하고자 하는 문장
fi
if문 다음의 조건을 검사하여 조건이 참이면 then 이하의 문장을 실행하고, 그렇지 않으면 else 다음의 문장을 실행한다.

elif
elif를 사용하면 여러 조건을 검사할 수 있다.
첫번째 if 명령이 참이 아닐 경우에 elif를 사용하여 변수를 테스트 한다.

if [ 조건1 ]; then
   조건 만족시 실행하고자 하는 문장
elif [ 조건2 ]; then
   조건2 만족시 실행 문장
else
   조건 불만족시 실행하고자 하는 문장
fi

case
case는 여러 패턴을 검사하고, 이에 적절한 구문을 실행시킬 수 있다. 사용자의 입력을 처리하는데 적절하다.

case variable in
  pattern [ | parrern] ....) 문장;;
  pattern [ | parrern] ....) 문장;;
  ...
esac



반복문
for
for 구문은 지정한 범위 안에서 루프를 돌리는데 사용된다. 범위에 사용되는 값은 어떠한 문자열의 집합이라도 가능하다.

for [변수] in [값]
do
         [수행문]
done

value 값은 보통 문자열. variable에는 values의 값이 차례대로 할당되면서 statement의 문장을 수행하게 된다.

for문은 2가지 방법이 있다
1. arg 변수에 1,2,3 데이터를 넣고 이 갯수만큼 돈다
    for arg in 1 2 3
    do
    echo $arg
    done
2. 기존 다른 언어 방식과 유사하다
    for((i-0;i<10;i++))

while
while 조건문
do
   문장
done

for문을 사용해 어떤 명령을 30회 수행한다면 1 2 3 .....27 28 29 30 을 일일이 적어줘야한다


builtins
break
제어문이나 조건문의 루프를 빠져 나갈 때 사용한다

continue
제어문이나 조건문의 처음으로 돌아가서 다시 수행한다

exit n
 현재 쉘을 종료한다. 종료시 n 값을 리턴한다

return
쉘 함수에서 값을 반환 할 때 쓰인다. 0은 성공을 1~125까지는 쉘 에러코드를 나타낸다

shift
쉘의 인자를 한자리씩 왼쪽으로(n -> 1로) 이동 시킨다
shift는 $1 인자를 없애고 각 인자번호를 1씩 줄인다. 즉 $2는 $1, $3은 $2와 같은 식으로 된다. 

조건문 결합 관련 연산자
조건문 A -a 조건문 B : 조건문 A와 조건문 B가 모두 참인지 체크, -a는 AND와 동일
조건문 A -o 조건문 B : 조건문 A와 조건문 B중 참이 하나라도 있는지 체크, -o는 OR과 동일


변수
- 데이터 타입이 없다
- 대소문자 구분
- 값을 대입시에는 변수명 = 값
- 변수를 사용할 때는 $변수면 또는 ${변수명}

ex)
- i=10;        #변수에 값 할당
- z="test";    #변수에 값 할당
- echo $i;    #i 변수를 화면에 출력

매개변수
$0~$9 : 옵션의 각 위치에 따른 매개 변수 값($0는 스크립트 이름)
$@ : 매개변수의 모든 값이며 공백문자로 분리
$? : 마지막 명령의 반환 값
$! : 마지막 백그라운드 명령의 프로세스 ID
$_ : 내장명령어 SET에 의해 할당된 현재 쉘 옵션
$* : 매개변수 모든 값(개별적 인용 없으며 IFS에 의하여 분리)
$$ : 현재 쉘의 프로세스 식별번호



문자열비교
[ string ] : string이 빈 문자열이 아니라면 참
[ string1 = string2 ] : 두 문자열이 같다면 참
[ string1 != string2 ] : 두 문자열이 다르면 참
[ -n string ] : 문자열이 null(빈 문자열) 이 아니라면 참
[ -z string ] : 문자열이 null(빈 문자열) 이라면 참

산술비교
[ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참 ( EQual )
[ expr1 -ne expr2 ] : 두 표현식 갑이 같지 않다면 참 ( Not Equal )
[ expr1 -gt expr2 ] : expr1 > expr2 이면 참 ( Greater Then )
[ expr1 -ge expr2 ] : expr1 >= expr2 이면 참 ( Greater Equal )
[ expr1 -lt expr2 ] : expr1 < expr2 이면 참 ( Less Then )
[ expr1 -le expr2 ] : expr1 <= expr2 이면 참 ( Less Equal )
[ ! expr ] : expr 이 참이면 거짓, 거짓이면 참
[ expr1 -a expr2 ] : expr1 AND expr2 의 결과 ( 둘다 참이면 참 )
[ expr1 -o expr2 ] : expr1 OR expr2 의 결과 ( 둘중 하나만 참이면 참 )

파일조건

[ -b FILE ] : FILE 이 블럭 디바이스 이면 참
[ -c FILE ] : FILE 이 문자 디바이스 이면 참.
[ -d FILE ] : FILE 이 디렉토리이면 참
[ -e FILE ] : FILE 이 존재하면 참
[ -f FILE ] : FILE 이 존재하고 정규파일이면 참
[ -g FILE ] : FILE 이 set-group-id 파일이면 참
[ -h FILE ] : FILE 이 심볼릭 링크이면 참
[ -L FILE ] : FILE 이 심볼릭 링크이면 참
[ -k FILE ] : FILE 이 Sticky bit 가 셋팅되어 있으면 참
[ -p FILE ] : True if file is a named pipe.
[ -r FILE ] : 현재 사용자가 읽을 수 있는 파일이면 참
[ -s FILE ] : 파일이 비어있지 않으면 참
[ -S FILE ] : 소켓 디바이스이면 참
[ -t FD ] : FD 가 열려진 터미널이면 참
[ -u FILE ] : FILE 이 set-user-id 파일이면 참
[ -w FILE ] : 현재 사용자가 쓸 수 있는 파일(writable file) 이면 참
[ -x FILE ] : 현재사용자가 실행할 수 있는 파일(Executable file) 이면 참
[ -O FILE ] : FILE 의 소유자가 현재 사용자이면 참
[ -G FILE ] : FILE 의 그룹이 현재 사용자의 그룹과 같으면 참
[ FILE1 -nt FILE2 ] : FILE1이 FILE2 보다 새로운 파일이면 ( 최근파일이면 ) 참
[ FILE1 -ot FILE2 ] : FILE1이 FILE2 보다 오래된 파일이면 참
[ FILE1 -ef FILE2 ] : FILE1 이 FILE2의 하드링크 파일이면 참

정수 비교 
-eq 같다면 참($a -eq $b) 
-ne 다르다면 참($a -ne $b) 
-gt 더 크다면 참($a -gt $b) 
-ge 더 크거나 같다면 참($a -ge $b) 
-lt 더 작다면 참($a -lt $b) 
-le 더 작거나 같다면 참($a -le $b) 
 

문자열 비교
= 같다면 참($a = $b) 
!= 다르다면 참($a != $b)

출저  : http://lkrox.blogspot.kr/2013/01/blog-post_14.html


안드로이드 운영체계는 "SQLite" 데이터베이스를 기본으로 지원합니다.


SQLite의 사전적 의미는


"SQLite는 MyAQL이나 PostgreSQL과 같은 데이터베이스 관리 시스템이지만


서버가 아니라 응응프로그램에 넣어 사용하는 비교적 가벼운 데이터베이스이다.


일반적인 RDBMS에 비해 대규모 작업에는 적합하지 않지만, 중소 규모라면 속도에 손색이 없다. 


또 API는 단순히 라이브러리를 호출하는 것만 있으며, 데이터를 저장하는 데 하나의 파일만을 사용하는 것이 특징이다." - Wikipedia


자세한 내용은 SQL 문법 참고 사이트를 방문해 보시기 바랍니다..




데이터베이스의 간단한 구성 : 테이블, 레코드, 필드

데이터베이스를 구성하는 요소는 참으로 다양하지만, 자주 쓰이는 것들은 기본적인 것들 몇 가지들입니다. 

1. 테이블


  테이블은 데이터들이 저장되어 있는 공간입니다. 테이블은 특정 주제에 관련된 데이터들을 담고 있으므로, 하나의 데이터베이스 내에는 여러 개의 테이블이 존재할 수 있습니다. 

2. 필드



필드는 각 항목의 "분류" 정도로 보면 되겠습니다. 전화번호부의 이름, 전화번호, 이메일주소 등이 필드에 해당됩니다.

3. 레코드



레코드는 하나의 항목과 관련된 필드의 값의 집합입니다. 예를 들면 위의 그림에서는 _id가 2, name은 google, phone은 12345 인 데이터의 집합이 하나의 레코드입니다. 이것 뿐 아니라 나머지 하이라이트된 4개 항목도 모두 레코드이지요. 전화번호부를 예로 들자면, 한 사람이 가지고 있는 데이터들(이름, 전화번호, 이메일주소)을 레코드라 할 수 있습니다.


안드로이드에서 데이터베이스 다루기 : 데이터베이스 어댑터

  데이터베이스를 생성하고, 열고, 데이터베이스에 데이터를 넣고, 쿼리를 통해서 데이터베이스에서 정보를 받아오는 작업은 SQLiteDatabase(android.database.sqlite.SQLiteDatabase) 와 SQLiteOpenHelper(android.database.sqlite.SQLiteOpenHelper) 내의 메소드를 통해 처리됩니다. 

  SQLiteDatabase 클래스에서는 데이터베이스를 다루는 작업(추가, 삭제, 수정, 쿼리)를 담당하고, SQLiteOpenHelper 클래스에스는 데이터베이스의 생성, 열기, 업그레이드를 담당합니다. 이러한 클래스 내의 메소드를 통해 직접 데이터베이스를 생성하고, 수정하고, 쿼리를 수행할 수도 있지만 이렇게 할 경우 코드상에 데이터베이스 구조들도 다 드러나게 되고, 실제로 코드를 볼 때에도 이 코드가 무엇을 하는 코드인지 바로 보기 불편합니다. 그래서, 일반적으로는 내가 사용할 데이터베이스에 맞게끔 데이터베이스 어댑터를 만들고 어댑터를 통해 데이터베이스를 관리합니다.


데이터베이스에서 원하는 자료를 받아오기 : 쿼리(query; 질의)

  데이터베이스를 생성하고 자료를 추가하는 것 못지않게 중요한 것이 바로 자신이 원하는 데이터베이스를 가져오는 것입니다. 이는 쿼리(Query; 질의)를 통해 이루어집니다. 질의 결과는 Cursor객체 형태로 반환됩니다.

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, 
String groupBy, String having, String orderBy, String limit) 

  • table  질의를 수행할 테이블 이름입니다.
  • columns  자료를 받아올 필드들입니다. null을 입력하면 모든 필드를 반환합니다.
  • selection  SQL의 "where" 구문에 해당되는 조건을 입력합니다. 조건이 많을 경우, ?로 대체합니다.
  • selectionArgs  selection을 ?로 지정하였을 경우, 그 조건들을 입력합니다.
  • groupBy  SQL의 "group by"구문에 해당합니다.
  • having  groupBy를 지정했을 경우, 그 조건을 넣어줍니다.
  • orderBy  결과값 정렬 방식을 지정합니다. null을 입력하면 기본 정렬을 수행합니다.
  • limit  결과값의 개수를 제한합니다.


(API : android.database.sqlite.SQLiteDatabase)
위에서 소개된 형태 외에도 다른 형태로 2가지 메소드가 있으니 참조하시면 됩니다.

예제)

1
2
3
4
            // 모든 레코드를 반환하는 쿼리를 실행합니다.
Cursor all = myDB.query("data", null, null, null, null, null, null, null);
            // 이름이 google인 레코드를 반환하는 쿼리를 실행합니다.
Cursor sel = myDB.query("data", "name = google", null, null, null, null, null, null);



데이터베이스 값을 가지는 객체, Cursors와 ContentValues

  데이터베이스 내에서 값을 추가하고, 삭제하고, 수정하는 작업돠는 별도로, 데이터베이스에 저장된 값을 코드 내로 가져와야 하거나, 코드 내에서 받은 값들을 데이터베이스에 추가시키는 과정이 있습니다. 우선, 데이터베이스의 데이터를 코드 내로 가져오는 것부터 보도록 하겠습니다.

데이터베이스 -> 코드 데이터 가져오기 : Cursor

  데이터베이스에서 자료를 가져올 때는 그 자료가 특정한 값 하나 (예:이름)이 될 수도 있고, 레코드가 될 수도 있고, 혹은 전체 데이터가 될 수도 있습니다. 이런 자료들을 받아오기 위해서 Cursor 인터페이스를 사용합니다. 
  커서는 쿼리(질의) 결과로 나온 레코드들을 가리키는, 말 그대로 마우스 "커서" 처럼 특정 레코드를 가리키는 역할을 합니다. 결과 레코드가 여러 개일 경우, 커서를 이리저리 움직이면서 여러 레코드들의 데이터들을 받아올 수 있습니다.


데이터베이스에서 커서는 특정 레코드를 가리키는 역할을 합니다.



Cursor 인터페이스의 주요 메소드는 다음과 같습니다.

  • moveToFirst  커서가 쿼리(질의) 결과 레코드들 중에서 가장 처음에 위치한 레코드를 가리키도록 합니다.
  • moveToNext  다음 레코드로 커서를 이동합니다.
  • moveToPrevious  이전 레코드로 커서를 이동합니다.
  • getCount  질의 결과값(레코드)의 갯수를 반환합니다.
  • getColumnIndexOrThrow  특정 필드의 인덱스값을 반환하며, 필드가 존재하지 않을경우 예외를 발생시킵니다.
  • getColumnName  특정 인덱스값에 해당하는 필드 이름을 반환합니다.
  • getColumnNames  필드 이름들을 String 배열 형태로 반환합니다.
  • moveToPosition  커서를 특정 레코드로 이동시킵니다.
  • getPosition  커서가 현재 가리키고 있는 위치를 반환합니다.


커서에서 데이터를 받아올 때에는,  get<데이터타입>(필드 인덱스메소드를 사용합니다.
위의 그림과 같은 질의 결과에서 이름을 받아오고 싶다면, 우선 이름 필드(name)의 인덱스를 알야아 합니다. 필드 인덱스는 일반적인 인덱스들과 마찬가지로 0부터 시작하므로 _id의 필드 인덱스는 0, name은 1, phone은 2가 되겠습니다. 참고로, 위 데이터베이스의 각 필드별 데이터 타입은 _id는 long, name은 String, phone은 long입니다.

필드 인덱스는 알았고, 받아올 데이터 타입이 String이므로 현재 레코드에서 이름을 받아오기 위해서는 getString(int ColumnIndex)메소드를 사용하면 됩니다. 즉, getString(1)이 되겠죠. 만약, 이름이 아니라 전화번호를 받아오고 싶다면 getLong(2)을 사용하면 되겠죠?

1
2
3
4
// 레코드로부터 이름을 받아옵니다.
String name = result.getString(1);
// 레코드로부터 전화번호를 받아옵니다.
long phone = result.getLong(2);



다른 데이터타입을 불러오는 메소드는 여기를 참조하세요.


코드 -> 데이터베이스에 자료 입력하기 : ContentValues

(android.content.ContentValues)
위의 Cursor와는 반대로, 자료를 데이터베이스에 입력하기 위해서 ContentValues 객체를 데이터베이스의 레코드와 동일하게 사용합니다. ContentValues 객체에 데이터베이스 테이블에 맞게 자료를 입력한 후, SQLiteDatabase 클래스의 insert()메소드를 사용하여 데이터베이스에 새로운 레코드를 추가합니다.

Cursor 형태로 된 쿼리 결과에서 데이터를 가져오는 것과 비슷하게, put(_필드 이름_, _입력할 값_)을 이용합니다.

1
2
3
4
5
6
// 필요한 데이터를 입력합니다.
ContentValues newValues = new ContentValues();
newValues.put("name", "구글");
newValues.put("phone", "1234567");
// 레코드를 추가합니다.
myDB.insert("data", null, newValues);


데이터베이스에 레코드를 추가하는 메소드인 insert()메소드에 대해 자세한 정보는 여기를 참고하세요. 


출저 : http://androidhuman.com/210

프리픽

http://www.freepik.com/

한국인 질문 사이트

asq.co.kr



안드로이드 사이드

www.androidside.com/


안드로이드 펍

androidpub.com


stackoverflow

stackoverflow.com


구글 웹마스터 도구는 구글 검색엔진에 등록된 사이트를 관리할 때 사용되는 프로그램입니다. 구글 웹마스터 도구를 이용하면 크롤링 오류와 같은 것들을 해결할 수 있으며, 수정된 페이지를 구글 검색엔진에 즉시 제출할 수 있기 때문에 특히 블로거들에게 매우 유용합니다. 우리나라에서는 티스토리 블로그를 운영하는 대부분의 블로거들이 구글 웹마스터 도구를 이용하여 본인의 블로그를 구글 검색에 최적화시키고 있습니다. 이 글에서는 티스토리 블로그에서 구글 웹마스터 도구를 이용하는 방법에 관하여 설명하겠습니다.



구글 웹마스터 도구란?


대부분의 티스토리 블로그는 구글 검색 엔진에 등록되어 있습니다. 네이버에 등록하는 것이 매우 어려운 관계로 두 번째로 많이 사용되고 있는 구글에 블로그를 등록하는 것이지요. 우리나라에서 구글 검색을 이용하는 사람이 적다 생각할 수 있겠지만, 사실은 생각보다 많은 사람들이 구글 검색을 이용하고 있습니다. 따라서 구글 검색 결과의 상위권에 본인의 블로그가 출력된다면 꾸준한 높은 수준의 방문자 유입을 기대할 수 있습니다.

블로거들이 네이버보다 구글을 더 많이 이용하는 이유는 위 문제뿐만이 아닙니다. 구글 검색은 어느정도 개방되어 있어, 블로거가 직접 본인의 블로그를 관리할 수 있기 때문에, 많은 블로거들이 구글을 이용하고 있는 것입니다. 예를 들어, 네이버에서는 절대로 불가능한 수정된 페이지의 갱신, 사이트맵의 제출, 크롤링 오류 분석 등 구글에서는 블로거 본인이 직접 검색 엔진에 등록된 본인의 블로그를 매우 다양한 방법으로 관리할 수 있습니다. 이러한 이유 때문에 블로거는 네이버보다 구글을 선호할 수 밖에 없습니다.
※ 최근 새롭게 생긴 네이버 웹마스터 도구를 이용하면 네이버에서도 어느정도 수정된 글을 보정하는 작업이 가능합니다. 하지만 구글만큼 세세한 기능까지 지원하지는 않습니다. 베타버전이므로 좀 더 지켜본 후 네이버 웹마스터 도구에 대해서도 나중에 글을 작성하도록 하겠습니다.

구글 웹마스터 도구를 이용하면 구글 검색 엔진에 본인의 블로그를 매우 쉽게 등록시킬 수 있습니다. 구글 웹마스터 도구에 가입만 하면, 구글 검색 엔진에 본인의 블로그가 자동으로 등록되기 때문입니다. 네이버 검색 엔진에 블로그를 등록할 때 얼마나 큰 노력이 필요한지와 비교한다면 정말로 구글이 얼마나 편리한 서비스를 제공하고 있는가를 알 수 있습니다. 네이버에서 블로그를 등록하기 위해서는 고객센터에 문의를 하고 거절 답변이 돌아온다면 또 다시 신청을 해야 하는데, 이러한 과정이 반복된다면 블로거는 지치기 마련입니다.


구글 웹마스터 도구에서 할 수 있는 것들


구글 웹마스터 도구에서는 매우 많은 것들을 할 수 있습니다.

구글 웹마스터 도구에는 구글 검색 엔진이 더 쉽게 페이지를 파악할 수 있도록, 사이트 관리자가 구조화된 데이터 HTML을 쉽게 사용할 수 있도록 안내해주는 기능이 있으며, 검색어에 관한 통계, 연결된 페이지에 관한 통계 등을 확인할 수 있는 기능, 현재 구글 검색 엔진에 등록된 사이트의 페이지 갯수가 어느 정도인지 확인할 수 있는 기능, 마지막으로 구글 크롤러에 수정된 페이지를 등록하여 구글 검색 결과에 수정된 페이지를 반영시킬 수 있게 해주는 기능 등이 있습니다.

이렇게 구글 웹마스터 도구를 이용하면 구글 검색 결과에 항상 최신의 정보가 출력되게 할 수 있고, 구글 검색 엔진 크롤러가 사이트에 좀 더 쉽게 접근할 수 있도록 할 수 있습니다.


구글 웹마스터 도구 가입 방법


구글 웹마스터 도구
http://www.google.com/webmasters


위 링크를 통하여 구글 웹마스터 도구를 이용할 수 있습니다. 다른 구글 웹프로그램과 마찬가지로 구글 웹마스터 도구를 이용하기 위해서는 구글의 회원이어야 합니다.

만약 구글 회원이 아니라면 이 글을 읽기 전 먼저 구글에 회원가입을 해야 합니다. 구글에 로그인한 후 구글 웹마스터 도구 사이트에 처음 접속하면 다음과 같은 화면이 나타납니다. 여기에서 하단의 웹마스터 도구에 로그인 버튼을 누르면 됩니다.

구글 웹마스터에 처음 접속하면 나타나는 화면

구글 웹마스터에 처음 접속하면 나타나는 화면



위 화면에서 웹마스터 도구에 로그인 버튼을 클릭한 후 구글 웹마스터 도구에 접속하면 본인이 등록한 사이트의 목록을 확인할 수 있습니다. 처음 접속한 경우에는 사이트를 등록해주어야 합니다. 우측 상단의 사이트 추가 버튼을 누릅니다.

사이트 URL을 입력하는 양식이 나타나면 이곳에 본인의 블로그 URL을 적습니다. http:// 를 제외한 부분만 적으면 됩니다. 반드시 전용 도메인 또는 서브 도메인으로 구성된 것이어야 합니다. 또한 블로거가 직접 HTML을 수정할 수 있어야 합니다. 따라서 네이버블로그, 다음블로그와 같은 블로그 서비스를 이용하는 블로거는 구글 웹마스터 도구를 이용할 수 없습니다.

블로그 주소를 입력하고 계속 버튼을 누르면 다음과 같은 화면이 나타납니다. 등록하고자 하는 사이트가 본인의 사이트임을 증명해야 구글 웹마스터 도구를 이용할 수 있습니다. 이러한 절차가 필요한 이유는 이러한 절차가 없는 경우 관리자가 아닌 타인이 마구잡이로 아무 사이트나 등록할 수 있기 때문입니다.

본인이 관리하는 사이트임을 증명해야 구글 웹마스터 도구를 이용할 수 있습니다

본인이 관리하는 사이트임을 증명해야 구글 웹마스터 도구를 이용할 수 있습니다



그런데 위 방법으로는 티스토리 블로거가 인증을 진행할 수가 없습니다. 왜냐하면 티스토리 블로거는 이미지 파일만 업로드할 수 있지, html 파일을 업로드할 수는 없기 때문입니다. 따라서 티스토리 블로거는 다음 방법을 사용하여 인증을 진행해야 합니다.

상단의 탭에서 대체 방법 탭을 클릭하면 여러가지 다른 인증 방법이 나타나는데 여기에서 HTML 태그를 이용한 인증 방법을 사용해야 합니다. HTML 태그 인증 방법은 매우 간단하게 블로그 스킨 헤더에 <META> 태그 하나만 추가하면 됩니다.

티스토리 블로그에서는 HTML 태그를 통한 인증 방법을 사용해야 합니다

티스토리 블로그에서는 HTML 태그를 통한 인증 방법을 사용해야 합니다



위 화면에서 볼 수 있는 메타태그를 복사한 후 현재 본인이 사용하고 있는 블로그 스킨 헤더에 붙여넣기 합니다. 메타태그는 각 사용자마다 다르므로 본인의 메타태그를 잘 확인하는 것이 중요합니다. 블로그 스킨에 메타태그를 넣은 후 사이트 승인 절차를 계속하면 웹마스터 도구에 사이트가 추가됩니다.

만약 사이트 승인 단계에서 오류가 발생하는 경우 메타태그를 제대로 넣지 않은 것입니다. 제대로 하였는데 계속하여 문제가 발생하는 경우 댓글로 말씀해주시면 해당 문제에 관하여 자세히 알려드리도록 하겠습니다.


구글 웹마스터 도구를 이용하는 방법


이 글에서는 구글 웹마스터 도구에서 할 수 있는 가장 대표적인 작업인 사이트맵 등록 작업과 수정된 페이지 등록 작업에 대하여 알아보도록 하겠습니다. 먼저 구글 웹마스터 도구에 사이트를 추가한 후 사이트 관리자 페이지에 접속하면 다음과 같은 화면이 나타납니다. 아직 사이트가 등록된지 오래되지 않았기 때문에 아무런 정보도 확인할 수 없습니다.

구글 웹마스터 도구에 사이트를 등록하면 구글 검색 엔진 크롤러가 해당 사이트를 분석하기 시작하며, 며칠이 지나면 검색 결과에서 본인의 블로그가 나타나는 것을 확인할 수 있습니다. 그리고 구글 웹마스터 도구에서 각종 데이터를 확인할 수도 있습니다.

사이트 등록 후 구글 웹마스터 도구에 접속한 첫 화면

사이트 등록 후 구글 웹마스터 도구에 접속한 첫 화면



구글 웹마스터 도구에 사이트맵을 등록하는 방법


사이트맵은 구글 크롤러가 해당 사이트를 분석할 때 도움이 될 수 있는 RSS 또는 ATOM을 말합니다. 우리나라에서는 그냥 블로그 RSS 등록이라는 명칭으로 사용됩니다. 네이버에서도 이와 동일한 서비스를 제공하고 있지만, 구글만큼 쉽거나 공정한 서비스가 아니기 때문에 많은 블로거가 사용하지는 않습니다. 구글 웹마스터 도구의 사이트맵은 구글의 승인 없이 블로그 관리자가 블로그 RSS를 임의대로 추가하거나 삭제할 수 있습니다.

구글 웹마스터 도구에 사이트맵을 등록하기 위해서는 다음과 같이 하면 됩니다. 좌측 메뉴에서 크롤링 - Sitemaps 를 클릭한 후 나타나는 화면에서 우측 상단의 SITEMAP 추가/테스트 버튼을 누르면 됩니다. 이곳에 본인의 블로그에서 사용하고 있는 RSS 주소를 입력한 후 Sitemap 제출 버튼을 누릅니다. 만약 티스토리 블로거라면 본인의 블로그 도메인에 rss 만 추가하면 됩니다.

구글 웹마스터 도구에 사이트맵을 추가하는 방법

구글 웹마스터 도구에 사이트맵을 추가하는 방법



구글 웹마스터 도구에 사이트맵을 추가하면 몇 시간 이내에 등록된 RSS의 내용이 구글 검색 엔진에 반영됩니다.

RSS를 등록하면 글의 목록을 직접 크롤러에 전달할 수 있기 때문에, 크롤러는 더 빠르게 블로그를 분석할 수 있으며, 이에 따라 검색 결과에 블로그가 반영되는 시간이 짧아집니다. 만약 크롤러가 직접 블로그 모든 부분을 분석한다면, 검색 결과에 블로그가 반영되기까지 오랜 시간이 걸릴 것입니다.


블로그의 수정된 글을 검색 결과에 반영시키는 방법


블로그를 운영하다보면 글을 수정해야 하는 경우가 종종 발생합니다. 그런데 글을 수정할 때의 가장 큰 걱정은 검색 엔진에 제대로 반영이 될 수 있을까? 입니다. 네이버 검색이라면 잘 모르겠지만, 구글 검색이라면 수정된 페이지를 검색 결과에 반영시키는 것이 그렇게 어렵지 않기 때문에 큰 걱정은 하지 않아도 됩니다.

구글 웹마스터 도구를 이용하면 수정된 페이지를 구글 크롤러에 전달하여, 크롤러가 다시 해당 페이지를 분석할 수 있도록 할 수 있습니다. 그 방법은 매우 간단하고, 구글의 승인을 받지 않아도 되는 것이기 때문에, 블로거에게 매우 유용한 기능입니다. 좌측 메뉴에서크롤링 - Fetch As Google 메뉴를 클릭합니다. 이 메뉴를 이용하여 구글 크롤러에 수정된 페이지 정보를 전달할 수 있습니다.

수정된 페이지의 URL을 입력한 후 우측 상단의 가져오기 버튼을 누르면 됩니다. 수정된 페이지의 URL을 입력할 때에는 본인의 블로그 도메인과 슬러쉬(/) 다음의 내용부터 입력해야 합니다. 만약 http://www.erzsamatory.net/100 의 내용이 변경되었을 경우에는 100만 입력하고 가져오기 버튼을 누르면 됩니다.

수정된 페이지가 있다면 구글 웹마스터 도구를 이용하여 검색결과에 쉽게 반영시킬 수 있습니다

수정된 페이지가 있다면 구글 웹마스터 도구를 이용하여 검색결과에 쉽게 반영시킬 수 있습니다



가져오기 버튼을 누르면 제출된 페이지 목록에 새로운 아이템이 생성됩니다. 처음에는 보류중 메시지가 나타나지만 몇 초만 기다리면색인에 제출 버튼이 나타납니다. 이 버튼을 누르면 구글 크롤러에 수정된 페이지의 정보를 전달할 수 있습니다. 제출 방식은 이 URL만 크롤링을 선택합니다. 이 옵션은 해당 페이지 한 개만 수정되었을 때 선택하는 옵션입니다.

만약 해당 페이지뿐만 아니라 블로그의 전체적인 내용이 변경되었을 경우에는 두 번째 옵션인 이 URL 및 직접 연결되는 링크 크롤링을 선택하면 됩니다.


출저 : http://www.erzsamatory.net/114

+ Recent posts