Unix for OS X __ Ch. 5 > Finding Files and Information

The Oddly Named grep Command

Finding

grep, locate, find, Spot-light

grep “Word” *  >> Word 포함 파일 검색
ls -l | grep “word” >> 출력 중에서 word 검색.   >> 파이프 .. pipe..

Useful grep Options

-An : Show n lines after the matching line,
-Bn : Before
-Cn : Before and After
-v, -n, -l, -c, -i

Matching context
$ grep -n -C1 Aqua sample

Matches in color
$ grep –color=always text sample
GREP_OPTIONS=”–color=always”;export GREP_OPTIONS  >> .profile setting..

Counting matches rather than showing matching lines <-c option>
$ grep -c “word” /var/log/system.log

Working with Regular Expressions [114]

wc : word count

Finding Files with locate

Building the locate Database

주 간격으로 자동 생성. cron 에서..
$ locate  >> show instruction

Using locate

정규식 불가.
$ locate alpha | grep “/man/”

Using find to Explore Your Filesystem [120]

사용하기 복잡하고 조금 다른 성격의 명령어 “” find “”
find flags pathname expression
$ find -name “*.html”
$ find . -name “*.html” -print  >> current working directory (.)   $HOME
$ find $HOME -name “*.html” -print | wc -l

Matching by File Size

Unit :: 512 byte block size..
c :: exact size… (byte)
$ find /bin -size +60 -print

Exploring find Permission Strings [122]

퍼미션으로 파일 찾기..

Using find to Identify Recently Changed Files

$ find . -cmin -60 -print -type f
+60 :: 바뀌지 않은 파일… 엄청 많겠지..
-ctime :: 시간 단위..

find’s Faithful Sidekick : xargs[125]

xargs is a program that turns a stream of filenames into iterative calls to whatever program is specified, with a subset of the filenames listed on the command line itself

파일이름의 스트림을 명령 라인 자체에 리스트된 파일 이름의 섭 세트처럼 반복해서 프로그램을 부르는 프로그램.

Futher Refinements to find

Shining a Light on Spotlight

Listing Spotlight Metadata with mdls

Finding Files with mdfind

Making Spotlight Useful

I/O Completion Ports MSDN IOCP

IOCP 는 멀티 프로세서 시스템에서 다수의 비동기 I/O 요청을 실행하기 위한  효율적인 쓰레딩 모델을 제공한다. 프로세서가 IOCP 를 생성할 때 시스템은 유일한 목적인 요청을 위한 연관된 큐 객체를 생성한다. 비동기 IO요청을 핸들하는 프로세스는 (요청이 올때마다 쓰레드를 생성하는 것보다)미리 띄워진 쓰레드 풀과 함께 IOCP 를 이용함으로써 더 빠르고 효율적으로 처리할 수 있다.

I/O completion ports provide an efficient threading model for processing multiple asynchronous I/O requests on a multiprocessor system. When a process creates an I/O completion port, the system creates an associated queue object for requests whose sole purpose is to service these requests. Processes that handle many concurrent asynchronous I/O requests can do so more quickly and efficiently by using I/O completion ports in conjunction with a pre-allocated thread pool than by creating threads at the time they receive an I/O request.

How I/O Completion Ports Work

함수 CreateIoCompletionPort 는IOCP 를 생성하고 한개 이상의 파일핸들을 그 포트에 연계시킨다. 비동기 I/O 작업이 이 핸들 중의 하나에서 완료되었을 때, IOC 패킷이 FIFO 순서로 연계된 IOCP에 큐 된다. 이 메카니즘의 파워풀한 사용은 여러 파일 핸들에 대한 싱크 포인트를 하나의 객체로 묶는 것이다.  하지만, 패킷은 FIFO 로 큐 되었어도 디큐는 다른 순서로 될 수 있다.

The CreateIoCompletionPort function creates an I/O completion port and associates one or more file handles with that port. When an asynchronous I/O operation on one of these file handles completes, an I/O completion packet is queued in first-in-first-out (FIFO) order to the associated I/O completion port. One powerful use for this mechanism is to combine the synchronization point for multiple file handles into a single object, although there are also other useful applications. Please note that while the packets are queued in FIFO order they may be dequeued in a different order.

Note

‘파일 핸들’ 은 디스크의 파일만이 아닌 중첩된 I/O 끝단을 표현하기 위한 추상적인 표현이다. 예를 들어, 네트워크단, TCP 소켓, 네임드 파이프, 메일 슬롯등이 될 수 있음. 중첩 IO를 지원하는 어느 시스템 객체든 사용될 수 있다. 관련된 IO 함수는 이 토픽의 마지막을 볼 것.

The term file handle as used here refers to a system abstraction representing an overlapped I/O endpoint, not only a file on disk. For example, it can be a network endpoint, TCP socket, named pipe, or mail slot. Any system object that supports overlapped I/O can be used. For a list of related I/O functions, see the end of this topic.

파일 핸들이 CP에 연계될 때, 전달된 패스 블럭은  패킷이 CP에서 제거될 때까지 업데이트되지 않을 것이다. 유일한 예외는 원래의 작동이 동시적인 에러를 리턴할 때 이다. 쓰레드(메인 쓰레드자신 혹은 메인 쓰레드가 생성한 것이든)는  IOCP에 큐된 C 패킷을 기다리기 위해 비동기적으로 IO가 끝나기를 기다리기보다  GetQueuedCompletionStatus function을 사용한다.
IOCP 에서 블락된 쓰레드는 LIFO 순서로 릴리스되고, 다음 C 패킷은 IOCP 의 해당쓰레드의 FIFO 큐로부터 받는다. 이것은 C 패킷이 쓰레드에게 릴리스되면 시스템은 그 포트와 연계된 마지막(최근의) 쓰레드를 릴리스하고 가장 오래된 IO C에 대한  ??

When a file handle is associated with a completion port, the status block passed in will not be updated until the packet is removed from the completion port. The only exception is if the original operation returns synchronously with an error. A thread (either one created by the main thread or the main thread itself) uses the GetQueuedCompletionStatus function to wait for a completion packet to be queued to the I/O completion port, rather than waiting directly for the asynchronous I/O to complete. Threads that block their execution on an I/O completion port are released in last-in-first-out (LIFO) order, and the next completion packet is pulled from the I/O completion port’s FIFO queue for that thread. This means that, when a completion packet is released to a thread, the system releases the last (most recent) thread associated with that port, passing it the completion information for the oldest I/O completion.

몽고 디비 MongoDB The Definitive Guide.. Ch. 4 : Querying

1. Introduction to find [p45]

> db.user.find () >> 컬렉션의 모든 값.
> db.user.find({“username: : “joe”, “age” : 27}) > And 조건절이 됨.

Specifying Which Keys to Return

두번째 인자에 받고 싶은 키를 전달.. 통신량과 일을 줄임. 아이디 키는 항상 리턴.
> db.users.find({}, {“username” : 1, “email” : 1})
키를 제외시킬 때는 0 전달. 아이디를 제외하는 것도 가능.
> db.users.find({}, {“username” : 1, “_id” : 0})

Limitations

쿼리는 상수여야 함. (코드의 일반 변수) 즉, 다큐먼트의 다른 키의 밸류값을 가질 수 없음.
이런 쿼리는 $where Queries … 에서 설명.

2. Query Criteria

보다 다양한 조건. range, or clauses, negation .

Query Conditionals [p47]

“$lt” “$lte” “$gt” “$gte”   “$ne” not equal.  (ne : 모든 타입에 적용 가능)
> start = new Date(“03/04/2007”)
> db.users.find({“registered” : {“$lt” : start}})

OR Queries

“$in” “$or” “$nin”

> db.raffle.find({“ticketNo” : {“$in” : [725, 23, 39]}})
> db.users.find({“user_id” : {“$in” : [345, “steve”]}}) >> 스키마를 변경했을 때 여러 타입 혼용 가능.

“$in” 은 단일 키에서 OR 쿼리 가능. 여러 키를 대상으로는 “$or” 필요.

$not

meta conditional  >> 제외시킬 때.

Rules for Conditionals

조건식은 ‘내부 다큐’, 업데이트 문은 ‘외부 다큐’.
조건식은 단일키에 여러번 적용가능.. 업데이트문은 한번만 가능.

3. Type-Specific Queries

여러가지 타입과 특별한 거동.

null

널은 자신과 매치. 존재하지 않는 것도 매치. 어느 키가 널인지 확인하려면 그 키가 존재하는지도 확인해야함.
> db.c.find({“z” : {“$in” : [null], “$exists” : true}})

Regular Expressions

> db.users.find({“name” : /joe/i })  >> case insensitive matching.
몽고디비 Perl Compatible Regular Expression (PCRE)  사용.
정규식은 자신과 매치.. 정규식을 넣으면 그대로 인식.

Querying Arrays

$all

하나 이상의 요소와 매칭하는 어레이 검색 시. 순서는 무관.
> db.food.find({fruit : {$all : [“apple”, “banana”]}})
한 요소만 넣으면 그냥 검색한 것과 동일.
어레이를 검색하면 순서, 요소 수 등이 완전히 일치해야 검색이 나옴.
키.인덱스 로 찾을 수도 있음.
> db.food.find({“fruit.2” : “peach”}) >> 과일의 3번째 요소가 ‘배’ 를 찾음.

$size

> db.food.find({“fruit” : {“$size” : 3}})  >> 어레이 크기가 3인 요소.
크기의 영역을 주어 검색은 불가.. 대신 “size” or “number” 등을 같이 사용하는 것은 가능
> db.food.update({“$push” : { “fruit” : “apple”}, “$inc” : {“number” : 1}})  >> 이렇게 하고
> db.food.find({“size” : {“$gt” : 3 }})  >> 이렇게 영역 검색할 수 있음.

The $slice operator

> db.blog.posts.findOne(criteria, {“comments” : {“$slice” : 10 }})
음수는 마지막에서부터.
[23, 10] >> 23개는 스킵하고 24번째부터 34번째까지 10개 리턴.
따로 지정되지 않으면 모든 키의 값들 리턴.  다른 명령어와는 좀 다른 액션.

Querying on Embedded Documents

임베디드 다큐 쿼리의 두가지 방법 : 전체 다큐 / 각각의 키/밸류값.  >> 각각 쿼리하는 게 더 맞는 것 같네..
{ “Embeded” :  {“keyA” : “SomeValue”, “keyB” : “TheValue” }}  >> 이런 경우 다른게 끼어들거나 순서가 바뀌어도 쿼리 불능.
{“Embeded.keyA” : “Some”, “Embeded.keyB” : “blabla” }  >> 이렇게 하면 스키마가 바뀌어도 쿼리 가능.

이런 “도트” 노테이션으로 하위 문서에 접근 가능… 하지만, 도큐먼트 키에 “도트” 를 쓸 수 없다는 제약.

범위를 지정할 때… $elemMatch  –> group criteria.
> db.blog.find({“comments” : {“$elemMatch” : {“author” : “joe”, “score” : {“$gte” : 5 }}}})
임베디드 다큐 쿼리조건에서 다수의 키 사용 시… 에만 필요함.

4. $where Queries

검색이 애매한 경우 $where 절 사용하여 자바스크립트 구문을 실행하면 거의 모든 쿼리 가능. (함수형 언어 특성 ? )
어떤 두 키에 대한 값이 같은 것을 검색하는 경우.
> db.foo.find({“$where” : fundtion() {
for (var current in this) {
for (var other in this) {
if (current != other && this[current] == this[other]) { return true; }  } }
return false;
}});
스트링으로 처리 가능.
> db.foo.find({“$where” : “this.x + this.y == 10”})
느리므로 꼭 필요할 때만 사용.  각 다큐먼트는 BSON 에서 자바스크리트 객체로 컨버트 된 다음 ‘웨어’ 구문을 수행한다.
인덱스 사용 불가.
복잡한 쿼리를 하는 다른 방법은 ‘맵리듀스’..

5. Cursors

커서를 이용, find 로부터 결과를 받음.
쉐에서 커서를 만드려면, 다큐를 컬렉션에 넣고, 쿼리를 하고, 결과를 로컬변수에 할당.
> var cursor = db.collection.find();
> whild (cursor.hasNext()) { obj = cursor.next();  //  do stuff   ….  }
## cursor.hasNext() ::   cursor.next() .. fetch.
커서 클래스에서 foreach.. 루프 제공.
find 를 부르면 즉시 수행하지 않고 쿼리를 통해 질문할 때 수행함.
> var cursor = db.foo.find().sort({“x” : 1}).limit(1).skip(10);  # 이때는 수행 안함.
> cursor.hasNext()  # 이때 쿼리가 서버로 보내짐.  쉘은 처음 100개 혹은 4메가를 가져와서 디비 억세스가 잦지 않도록 함.
이 결과를 다 소진한 다음 쉘은 다음 결과를 가져옴.

Limits, Skips, and Sorts [57]

Avoiding Large Skips

Advanced Query Options

Getting Consistent Results

6. Cursor Internals

fk

Unix for OS X __ Ch. 4 > File Management

Ch. 4 File Management

File and Directory Names

Letters, – _ and . (dot)..

File and Directory Wildcards [p80]

* ;
? ; one character
[] ;  chap[12], chap[1-3]
{ , } ; a{b,c,d}e :: abe, ace, ade .. Mail/{abc,def}..

cat, less : 화면에 내용 스트림.

폴더에 조건 적용 가능.. */summary … 모든 폴더의 동일 이름 파일 접근 가능..

Looking Inside Files [p82]

cat -n :: concatenate

less :: one page at a time

-M : long prompt.
Space : next page
v : start vi
Return : next  __LINE.
Ctr-L : Redisplay cur page.
nf : move forward n lines..
h : help
b : move back one page
/word : Search forward for ‘word’
?word : Search backward for ‘word’
q : quit
…….

grep [p85] :: 문자 포함 파일 찾기..

Creating and Editing Files :: Vi

http://math.jnu.ac.kr/bcshin/linux/vi.htm

Text Editors and Word Processors

에디터 3인방 : vi, Pico, Emacs  or (BBEdit, TextEdit, … gedit ?? )  [ open -e myfile.txt ]

맥, 유닉스 파일 종료… ^M ??   ==> tr ’15’ ’12’
alias m2u = “tr ’15’ ’12’ ”  이런식..
$ m2u <mac file> unix file..

The vi Text Editor [p89]

command mode : i ==> insert mode

insert mode : esc ==> command mode

$ vi .profile   # shell’s setup file…

vi Basics

H, G, w, b, 0, $ …

Searching in vi

command mode : /theWord
n : search again..

Invoking external Unix commands [p93]

yank :w ZZ (save and quit), dd (delete one line) …

A Simpler vi Alternative : Pico [p96]

GNU nano .. free version of Pico

The more complex option : Emacs

LISP 기반.

Managing Files

Creating Directories with mkdir

mkdir folderA folderB  >> 여러개 가능
mkdir “some folder with space”  >> 공백 포함.
mkdir -p myFolder/ch{01,02,03,04,tntro,toc,index}  >> ch01 ch02 … folder..

Copying Files [p100]

cp ../fold/ch1.txt  ../fold/ch2.txt  documents
cp -i ../fold/ch[1-3].txt documents
cp ../john/ch[1-3].doc  .  // to current folder
-R  >> recursive option.

Renaming and Moving Files with mv

Removing Files and Directories [p103]

rm : remove PERMANENTLY.. no Trash .
rm -i filenames  ;; interactive..
rm -P   // 0, 1, 0  으로 밀어버림.  보안.. (데이터 복구 불가능)

rmdir  (파일 포함 폴더 삭제 불가)
rm -r (recursive…)
rm -i .[^.]*

Working with Links

ln -s abc abcLinkName
하드 링크는 -s 없이 사용.   동일한 크기.. 링크 카운트 표시.. 파일이 2개면 2..

Compressing and Archiving Files (p107)

gzip [-v] files   >> verbose output
gunzip filename

tar [tape archiver]
tar [c|t|x] [flags] fileOrDirectory

Files

MongoDB & Python Niall O’Higgins Ch 3, 4

Ch 3. Common MongoDB and Python Patterns

A Uniquely Document-Oriented Pattern : Embedding

RDBMS 의 join 과 같은 역할.
임베디드 다큐도 다큐와 똑같이 작업 가능.
한 키의 다수의 임베디드 다큐는 특히 유용. 즉, 값이 어레이인 속성. ;; 문법에 맞고 매우 유용한 구조.
일-다 관계 표현하는 자연스런 방식. 또는 부모-자식 관계.
한 유저의 ‘여러’ 이메일.. 일반디비에서는 2개의 테이블. 그리고, ‘조인’
몽고에서는 키와 상응하는 이메일들의 어레이..
[.] 기호를 통해 하위 값 가져오기 가능.  즉, dbh.users.find_one( { “emails.email” : “abc@kin.com” } ) .. 이런식.

이 외에도 $pull, $push .. 제공.. atomic append, removal of  sub – documents…
어떤 이메일이 더이상 유효하지 않을 때.. 다큐를 찾아서, 고쳐서, 업데이트 .. 해야하지만,  번거롭고 레이스를 불러올 수 있음.
섭-다큐의 3가지 주 작업 : 삭제, 삽입, 수정..

dbh.users.update ( { “username” : “thename” } ,
{ “$pull” : { “emails” : { “email” : “erse@the.com” } } } , safe=True)

이 소스는 다큐를 찾아내서 어레이에서 atomic fashion 으로 제거하여 레이스 원천봉쇄.
쿼리로 $pull 을 이용 가능.  예를 들어 어떤 조건이 맞는 모든 섭-다큐를 지울 때..
즉.. dbh.users.update ( {“username” : “thename”},
{ “$pull” : { “emails” : { “primary” : { “$ne” : True }}}, safe=True)

atoms 를 갖는 어레이에 적용 가능.  임베디드 다큐 ‘만’ 갖고는 작동 안함.

푸쉬는 어레이에 요소 atomically 추가할 때 사용. 끝에 추가하는 것만 가능.  <어레이의 처음에 추가하거나 임의의 장소에 넣는 업데이트 기능은 없음>
조건문이 없어서 간단함.

new_email = {“email”:”fooemail4@exmaple4.com”, “primary”:False}
dbh.users.update({“username”:”foouser”},
{“$push”:{“emails”:new_email}}, safe=True)
==> # 기존의 섭 다큐를 업데이트..  => positional operator [ $ ] 를 통해 가능.
예 :: {“$set”:{“emails.$.primary”:False}}, safe=True)
>>*<< 업서트 에서 사용 불가, first matched element 에서만 가능.

__ Page 29 __
<1> 임베딩 관련 작업 시, 다큐, 섭-다큐의 성능을 아는 것이 중요. 쿼리에 의해 다큐먼트가 불려오면 섭 다큐 등 모두가 메모리에 로딩됨.
즉, 임베디드 데이터를 가져오는 데 추가의 자원이 필요 없다.. (인코딩 cpu 같은 거 제외하고)
최상위 다큐먼트가 가용상태면 섭-다큐는 즉시 가용함.  이것을 ‘조인’에서는 여러 테이블을 읽으므로 성능이 떨어짐.
<2> 몽고에는 크기 제한이 있지만, 버전 따라 커지고 있음. 1.8 은 16메가.  시간에 따라 커지는 데이터가 아니고서는 충분함.
댓글을 다는 경우.. 한 다큐에 있을 때.
__ To embed , or not to embed. _ _ _ _ _ ^^
임베딩의 대안 >> 다큐를 분리된 컬렉션에 저장.  어플에서 조인하는 코드 구성.
보통 >>> 다 : 다  관계는 이렇게 조인..
보통 >>> 일 : 다  관계는 임베드.

Fast Lookups : Using Indexes in MongoDB [p31]

인덱스의 역할은 관계형디비와 크게 다르지 않음.  두가지 제공 : Btree indexes & geospatial indexes.
Btree 는 MySQL 등과 유사.  관계형 시스템에서는 빨리 찾기 위해 인덱스 이용, 몽고에서는 의미상 인덱스를 컬렉션의 특정 속성에 사용.
몽고는 여러 필드로 인덱스 확장 가능. (a.k.a. compound indexes)  한개 이상의 속성에 기반하여 쿼링하는 것을 미리 알고 있을 경우에 유용.
예 > 성, 이름으로 쿼링할 때.
몽고에서 비트리 인덱스는 “방향”을 가질 수 있음.  컴파운드 인덱스에서만 유용. 성능을 위해 쿼리와 소팅의 방향이 매칭되야 함.
비트리 인덱스는 데이터에 앞서 인덱스를 업데이트해야 하므로 쓰기 퍼포먼스에 타격. 인덱스를 조심히 선택해야 함.
Superfluous indexes를 피할 것.
인덱스는 스토리지도 차지함.   메모리 역시.   전형적인 <시간 대 공간 트레이드 오프> 시나리오임..
비트리는 컬렉션에 특별한 제한을 가할 때도 사용.
비트리는 값이 어레이인 경우도 지원. 어레이의 각 아이템은 인덱스에 적당히 저장되서 다큐의 빠른 조사가 가능. 태깅 기능에 유용.
비트리는 임베디드 다큐도 지원.   예> 이메일을 섭 다큐로 지정하고 인덱스로 사용할 때.
서버 쪽 소팅 퍼포먼스에도 중요. 4메가 이상의 결과에 대해 소팅하려고 할 대 소트 키에 인덱스를 지정해야 함.  개발시에는 예상치 못한 거대한 실제 데이터에 대해 쿼리할 때 예외를 발견하는 것을 간과하기 쉽다.

파이 몽고 드라이버로 인덱스 생성.
Collection.create_index()  # method  single-key OR compound (튜플) indexes 생성.
dbh.users.create_index([(“first_name”, pymongo.ASCENDING), (“last_name”, pymongo.ASCENDING)]) # 리스트로 인덱스 생성 예.
인덱스에는 자동 이름이 붙지만 커스텀 네이밍 가능
dbh.users.create_index([(“first_name”, pymongo.ASCENDING), (“last_name”, pymongo.ASCENDING)], name = “myIndex_name”) # 커스텀 이름.

인덱스를 만들면 기본으로 디비를 ‘잠군다’. 큰 컬렉션에서 시간이 걸리므로. 백그라운드에서 생성 가능. 당연히 시간은 좀 더 걸리지만 디비가 ‘가용’ 상태.
dbh.user.create_index(“username”, background-True)

Unique constraint..  unique=True
유니크 옵션은 몽고에서는 관계디비와는 다름.  첫번째를 제외하고 중복 요소 제거.. dropDups = True

인덱스 제거는 쉽다. drop_index() method.

Collection.index_information() # Python .. 인덱스 조사.   Dictionary 리턴.  인덱스 이름 = 키, 밸류 = 또다른 딕셔너리.
이 딕셔너리는 key ..로 불리는 ‘키’ 를 포함. 인덱스 방향 포함한 원래 인덱스 specifier.   create_index에 넘겨진 것.   옵션들도 포함.

Location-based Apps with MongoDB : GeoSpatial Indexing [p33]

Points of interest (POI)

몽고는 Gustavo Niemeyer 가 개발한 geohasing 알고리즘 사용.
현재로서는 포인트-베이스 쿼링만 가능.
$near $within $box $circle $polygon (MongoDB v 1.9)
GPS 좌표만 가능 (-180 ~ 180 )
파이썬 딕셔너리는 순서가 없으므로 bson.SON 을 이용할 것.

인덱스는 하나의 위치인덱스만 포함 가능.. 다른 것과 같이 컴파운드 인덱싱 가능.

$near :: 기본으로 100개 결과 리턴. 최대값 지정 (5도 정도가 적당) 1도 = 69마일.
$nearSphere $centerSphere :: radian.

Code Defensively to Avoid KeyErrors and Other Bugs [p37]

Update-or-Insert: Upserts in MongoDB

save() : _id 없이 실행하면 새로운 다큐 삽입, _id 가 있으면 업데이트.  ;; 업서트 ..

업데이트는 두가지 경우를 각각 수행함. 문서가 있으면 업데이트 하고, 없으면 새로 만든 후에 업데이트를 실행함.

Atomic Read-Write-Modify : MongoDB’s findAndModify [p40]

업데이트 결과를 가져올 때.. 레이스 컨디션 회피 명령어.

Fast Accounting pattern

점수, 랭킹 계산의 경우.. 데이터 크고, 빠르게 계산 필요.

 

 

Ch 4. MongoDB with Web Frameworks

Pylons 1.x and MongoDB

WSGI-based web frameworks. 2005 09.  v1.0 at 2010
“one-size-fits-all”  < — > Pylon
So modular.. easy to add MongoDB

Pyramid and MongoDB

Pylons 2.0 ..
scaffold ..

Django and MongoDB

Mango..
10gen .. sample app.

2013. 2. 23.