반응형

리눅스에서 파일 검색을 하기 위한 명령어 find를 소개합니다.

저는 리눅스 상에서 주로 개발해서 자주 사용하는 명령어 입니다.



명령어 : find 파일 찾을 위치 지정 -name 찾을 파일 이름

    ex  : find ./ -name aaa.txt


위에 ex를 설명해드리면 ./(현재 폴더 부터, 하위 폴더 포함) aaa.txt 파일을 찾아줘!!! 입니다.




다음으로 파일 내부 문자열을 검색하는 명령어 grep 입니다.


사실 grep은 여러군데서 사용하고 있는 것이기 때문에, 파일 내부 문자열 검색만을 위해서 쓰이고 있지는 않습니다.

grep의 man을 보시면 -print lines matching a pattern 으로 나와있어요.


이번 포스팅에서는 grep을 통해서 파일 내부의 문자열을 검색해서, 

찾고자 하는 문자열과 동일한 문자열을 가진 파일을 찾아주는 것으로 


명령어 : grep -r "찾을 문자열" ./*

     ex : grep -r "aaa" ./*

        

위의 ex를 설명드리면 ./(현재 폴더 아래 모든 파일에서) aaa라는 문자열이 있는지 찾아라!! 하위 디렉토리 모두에서(-r) 입니다.

여기서 r은 recursive 의미입니다.



출처: http://ngee.tistory.com/83 [ngee]

반응형
반응형

앱을 개발할때, 누구나 자신의 앱에 사용자들이 대화하거나, 공지사항으로 앱의 새소식을 알리고, 댓글을 달면 알림이 가는등 사용자가 참여할 수 있는 커뮤니티 공간이 있었으면 좋겠다고 생각해봤을 것입니다.


하지만 만드는 데에는 그만큼의 시간과 노력을 들여야 합니다. 에를들어 서버 구축이라든지, 서버에서 처리하는 코드라든지, 클라이언트 코드를 짜야하는거라든지..


이런 과정 없이 다른 프로그래밍이나 서버구축 같은거 없이 그럴듯한 아래 사진과 같은 앱을 최소한의 과정으로 제작할 수 있는 오픈소스 커뮤니티 클라이언트 프로젝트입니다.







Favorite - 안드로이드 커뮤니티(게시판, SNS)앱 만들기(오픈소스)



1. Favorite 앱





자신이 즐겨찾기한 페이지를 간단명료하게 보여주고 소통할수 있는 종합적인 어플리케이션입니다. 


페이지(커뮤니티)를 생성해  그룹이나, 소개용 등 목적에 따라서 다양하게 이용할 수 있습니다.

- 사진이나 파일 업로드가 가능하며 최대 30MB 업로드를 지원합니다.

- 나에게 글이나, 댓글 작성시 알림을 받을 수 있습니다.



Play 스토어에서 다운로드 가능하며, 오픈소스입니다.


Play Store : http://play.google.com/store/apps/details?id=com.tarks.favorite

Github : https://github.com/tarksgit/Favorite-Android-Client




2. Favorite Example





위의 Favorite을 여러분들이 쉽게 독립적인 어플로 만들기 쉽게 만든 데모 버전이며, 이 오픈소스를 어떻게 활용해야할지에 대한 하나의 적절한 예시입니다.


목록에서 자신이 의도한 페이지(커뮤니티)로 이동하게 하는 방법이 있습니다. 마찬가지로, 이 데모도 오픈소스입니다.


https://github.com/tarksgit/Favorite-Android-Client-Example


이 데모를 사용하여 자신만의 커뮤니티 앱을 만드는 더 자세한 방법은 아래 링크에 잘 설명되어있습니다.


http://tarks.net/favoritedevelop_android/105393







도움이 되셨나요?

그럼 손가락을 눌러주세요:)



출처: http://jhrun.tistory.com/172 [JHRunning]

반응형
반응형

UNION과 UNION ALL 의 차이 및 주의 사항

ANSI SQL에서 제안하는 집합 연산 "UNION", "INTERSECT", "MINUS" 중에서
MySQL에서는 UNION 집합 연산만 제공하고 있다. 
(하지만 MySQL에서 INTERSECT나 MINUS를 다른 형태의 쿼리로 풀어서 사용할 수 있다.)


이 글에서는 UNION 에 대해서 좀 더 자세히 알아 보고자 한다.
UNION 집합 연산은 다시 아래와 같이 두가지 종류로 나누어진다.
  - UNION ALL
  - UNION DISTINCT


우리가 일반적으로 사용하는 방식인 아무런 추가 키워드 없이 UNION 만 사용하는 것은
UNION DISTINCT 를 줄여서 사용하고 있는 것이다
.

UNION ALL과 UNION DISTINCT를 레코드가 많은 결과에 대해서 적용해본 사람은 
아마도 둘의 처리 방식에 대해서 의구심을 가져본 적이 있을 것이다.

레코드 건수가 많아지면 많아질수록 그 성능 차이는 엄청난 차이를 보여줄 것이다.

우선, 아래와 같이 2개씩 동일한 레코드 데이터를 가지고 있는 tab1과 tab2라는 테이블이 있다.

mysql>SELECT fdpk, fddata FROM tab1;
+------+--------+
| fdpk | fddata |
+------+--------+
|    1 | data1  |
|    2 | data2  |
+------+--------+
2 rows in set (0.00 sec)


mysql>SELECT fdpk, fddata FROM tab2;
+------+--------+
| fdpk | fddata |
+------+--------+
|    1 | data1  |
|    2 | data2  |
+------+--------+
2 rows in set (0.01 sec)


그러면, 이 두개 테이블에 대해서 각각 UNION과 UNION ALL을 사용하는 쿼리를 실행해보자.

mysql>SELECT fdpk, fddata
    -> FROM (
    ->   SELECT fdpk, fddata FROM tab1
    ->   UNION ALL
    ->   SELECT fdpk, fddata FROM tab2
    -> ) x;
+------+--------+
| fdpk | fddata |
+------+--------+
|    1 | data1  |
|    2 | data2  |
|    1 | data1  |
|    2 | data2  |
+------+--------+
4 rows in set (0.00 sec)


mysql>SELECT fdpk, fddata
    -> FROM (
    ->   SELECT fdpk, fddata FROM tab1
    ->   UNION
    ->   SELECT fdpk, fddata FROM tab2
    -> ) x;
+------+--------+
| fdpk | fddata |
+------+--------+
|    1 | data1  |
|    2 | data2  |
+------+--------+
2 rows in set (0.00 sec)


두개의 퀴리 실행 결과 UNION은 레코드가 반으로 줄었다.
이미 다들 알고 있다시피 UNION은 UNION DISTINCT와 동일한 작업을 하기 때문에 중복되는 레코드를 제거했음을 알 수 있다.
하지만, UNION ALL의 경우에는 별도의 중복 제거 과정을 거치지 않고 그냥 결과를 내려준다.
아주 중요한 내용이지만, 사실 이 내용을 다들 별로 신경쓰지 않고 모두들 UNION을 즐겨 사용한다.


안타깝게도, MySQL의 실행계획에서는 둘의 차이를 전혀 느낄 수 없다.
+----+--------------+------------+------+..+------+..+------+------+-------+
| id | select_type  | table      | type |..| key  |..| ref  | rows | Extra |
+----+--------------+------------+------+..+------+..+------+------+-------+
|  1 | PRIMARY      | <derived2> | ALL  |..| NULL |..| NULL |    4 |       |
|  2 | DERIVED      | tab1       | ALL  |..| NULL |..| NULL |    2 |       |
|  3 | UNION        | tab2       | ALL  |..| NULL |..| NULL |    2 |       |
|NULL| UNION RESULT | <union2,3> | ALL  |..| NULL |..| NULL | NULL |       |
+----+--------------+------------+------+..+------+..+------+------+-------+


하지만 중복 제거는 그냥 얻을 수 있는 결과가 아니다.그러면, MySQL이 내부적으로 어떻게 중복을 제거하는 것일까 ?

내부적인 처리를 알아보기 전에, 레코드의 중복이라는 표현을 했는데 이 중복의 기준이 무었일까 ?
    1. 각 테이블의 Primary key ?
    2. 전체 테이블의 모든 필드 ?
    3. 각 서브 쿼리에서 SELECT된 튜플(레코드)의 모든 필드 ?


그렇다. 이미 SELECT된 결과를 가지고 UNION하기 때문에 SELECT되기 전의 테이블이나 레코드에 대한 정보는 알 수 없다.
그래서, 중복 여부의 판단은 SELECT된 튜플들에 속해있는 모든 컬럼의 값들 자체가 중복 체크의 기준이 되는 것이다.


자~, 그러면 이제 MySQL이 내부적으로 UNION ALL과 UNION을 처리하는 과정을 알아보자.
1. 최종 UNION [ALL | DISTINCT] 결과에 적합한 임시 테이블(Temporary table)을 메모리 테이블로 생성
2. UNION 또는 UNION DISTINCT 의 경우, Temporary 테이블의 모든 컬럼으로 Unique Hash 인덱스 생성3. 서브쿼리1 실행 후 결과를 Temporary 테이블에 복사
4. 서브쿼리2 실행 후 결과를 Temporary 테이블에 복사
5. 만약 3,4번 과정에서 Temporary 테이블이 특정 사이즈 이상으로 커지면 

    Temporary 테이블을 Disk Temporary 테이블로 변경 
    (이때 Unique Hash 인덱스는 Unique B-Tree 인덱스로 변경됨)
6. Temporary 테이블을 읽어서 Client에 결과 전송
7. Temporary 테이블 삭제


UNION 두 가지의 차이는 2번 과정 딱 하나이다. 중복 제거를 위해서 Temporary 테이블에 인덱스를 생성하느냐 ?. 그렇지 않느냐 ?.별로 중요하지 않은 것 같지만, 이 인덱스로 인해서 3,4번 과정의 작업이 작지 않은 성능 차이가 만들어 내게 된다.
실제 UNION을 실행하는 데이터의 건수에 따라서 다르겠지만, 1.5 ~ 4배 가량의 성능 차이로 UNION ALL이 빠르게 처리된다.
만약 처리중 데이터의 량이 작아서 5번 과정을 거치지 않는다면 메모리 Temporary 테이블에 Hash 인덱스를 사용하기 때문에 

속도 차이가 아주 미세할 것이다. 
하지만 데이터량이 커져서 5번 과정을 거치게 되면 Disk Temporary 테이블에 B-Tree 인덱스를 사용하기 때문에 큰 성능 차이를 보이게 될 것이다.
이 성능 차이는 UNION 하는 두 집합에 중복되는 레코드가 있든 없든 관계 없이 발생할 것이다.


위에서 잠깐 알아보았던, "중복의 기준"을 생각하면, UNION 하는 컬럼들의 수가 많아지고 레코드의 사이즈가 커질수록 두 작업 모두에게 불리하겠지만, UNION ALL보다는 UNION에 더 악영향이 클 것이다.

결론은,
0. UNION 이든지 UNION ALL이든지 사실 그리 좋은 SQL 작성은 아니다. 

    UNION이 필요하다는 것은 사실 두 엔터티(테이블)가 하나의 엔터티(테이블)로 통합이 되었어야 
    할 엔터티들이었는데, 알 수 없는 이유로 분리 운영되는 경우가 상당히 많다. 
    즉 모델링 차원에서 엔터티를 적절히 통합하여 UNION의 요건을 모두 제거하자.
1. 두 집합에 절대 중복된 튜플(레코드)가 발생할 수 없다는 보장이 있다면 UNION ALL을 꼭 사용하자.

    두 집합에서 모두 각각의 PK를 조회하는데, 그 두 집합의 PK가 절대 중복되지 않는 형태
2. 중복이 있다 하더라도 그리 문제되지 않는다면 UNION 보다는 UNION ALL을 사용하자.
3. 만약 UNION이나 UNION ALL을 사용해야 한다면, 최소 필요 컬럼만 SELECT 하자.

출처 : http://intomysql.blogspot.com/2011/01/union-union-all.html

반응형

+ Recent posts