TigerCow.Door

안녕하세요. 문범우입니다.

오늘은 MongoDB를 Windows OS에 설치해보도록 하겠습니다.

MongoDB는 NoSQL 데이터베이스로 분류됩니다.

MongoDB는 SQL보다 더 간결하지만 SQL과 유사한 쿼리를 사용하는 이점 때문에 사용 유저가 많은 편입니다.

아무 조건 없이 저장해도 동작이 되고 프로그래밍 언어에서 쓰던 데이터의 형태 그대로 저장이 가능하다고 합니다.

또한 테이블 스키마가 없어서 테이블 수정 인덱스 추가 변경이 백그라운드에서 처리 가능한 것이 장점이라 볼 수 있습니다.


단점으로는, memory가 가득 차서 HDD로 내려가 데이터를 처리하면 속도가 급감하며

데이터 삭제나 업데이트를 했을 때 단편화 문제를 발생시켜 데이터 처리에 필요 이상의 memory를 사용할 수 있다고 하네요.


뭐 이론적인 내용은 그렇습니다!

그럼 바로 설치를 시작해보도록 할게요!




1. MongoDB 설치하기


먼저 아래 링크를 통해 MongoDB 설치파일을 다운 받도록 합니다.

https://www.mongodb.com/download-center?jmp=homepage#community



자신에게 맞는 OS를 선택해서 다운로드를 진행합니다!

저는 현재 Windows 10이기 때문에 위의 사진에서 다운로드를 진행하였습니다.


다운받은 파일을 실행시켜 MongoDB 설치를 진행합니다.

설치하면서 그냥 next만 눌러주시면 되고 중간쯤에서 Setup Type에서 저는 Complete를 선택하였습니다.



이렇게 설치가 완료되었습니다!


2. MongoDB 테스트(Test)

2-1. MongoDB server 실행하기 (mongod.exe)


설치한 MongoDB를 테스트해보기 위해 아래와 주소의 폴더로 들어 갑니다.


C:\Program Files\MongoDB\Server\3.4\bin



그럼 위의 사진에서 확인할 수 있듯이, mongo.exe 파일과 mongod.exe 파일이 존재하는 것을 확인할 수 있습니다.


mongod.exe 파일은 MongoDB server의 실행 파일입니다.

mongo.exe 파일은 MongoDB 자체를 조작할 수 있는 MongoDB Shell 프로그램 입니다.


따라서,

먼저 MongoDB Shell을 시작하기에 앞서 MongoDB server를 실행시켜 줘야합니다.

따라서 아래와 같이 현재 폴더에서 명령프롬프트(cmd)창을 켜주시거나

명령프롬프트(cmd) 창을 켜서 현재 폴더의 위치로 들어옵니다.



MongoDB 의 server를 실행시켜주기 전에!

한가지 진행해야 할 일이 남았습니다.

MongoDB는 기본적으로 참조하는 db 폴더가 있는데 그것을 생성해줘야 합니다.

cmd 창에 아래와 같은 명령어를 입력해줌으로써 MongoDB가 기본적으로 참조하는 C:\data\db 경로를 만들어 줍니다.


mkdir C:\data\db



그리고 cmd창에 아래와 같은 명령어를 입력함으로써 MongoDB server를 실행시킵니다.


mongod.exe



(Windows 방화벽 관련 창이 뜨면 허용을 눌러주도록 합니다!)



이렇게 해서 MongoDB server를 정상적으로 실행시켰습니다.


2-2. MongoDB Shell 실행하기 (mongo.exe)


MongoDB server가 실행되고 있도록 하고, cmd 창을 하나 더 열어서 2-1. 에서 들어 갔던 경로로 다시 들어가도록

아래 명령어를 입력합니다.


cd C:\Program Files\MongoDB\Server\3.4\bin



그리고 mongo.exe 를 입력하여 MongoDB Shell을 실행합니다.



위의 그림과 같이 '>' 표시가 떠야합니다.

제대로 설치되었는지 확인하기 위해서는 show dbs를 입력합니다.



위와 같이 뜬다면 정상적으로 설치 된 것 입니다.



이렇게해서 MongoDB 설치를 성공적으로 진행하였습니다 :)

다음번 부터는 MongoDB 를 이용해서 뭐든해봅시다.

기본적인 명령어부터 알아가며 공부해볼게요~

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

최근 특정 일로 인해 Tornado 공부를 시작하게 되었습니다.

Tornado는 python언어를 이용한 web server 입니다.

python 언어를 이용한 web server로는 가장 이용자가 많은(특히 한국에서) web server라고 하네요!


Tornado를 공부하는데 있어서는 공식문서를 주로 다루도록 하고

구글링 또한 함께.. 열심히 하면서 노력해보겠습니다.


먼저 그 시작은 간단하게 Tornado를 설치하고

화면에 "Hello world"를 띄어보도록 할게요!


Tornado 공식문서는 아래 링크를 참고해주세요!

http://www.tornadoweb.org/en/stable/



1. Tornado 설치하기

기본적으로 python은 모두 설치 되어있음을 가정하고 진행합니다.

저의 python 설치 환경은 아래와 같습니다.


Windows 10 +



Tornado 를 설치해보도록 하겠습니다!

매우 간단합니다.

아래와 같은 명령어를 입력해줍니다.


pip install tornado


그럼 아래와 같이 실행이 되면 정상입니다.




이렇게 Tornado 설치는 끝 입니다!

(매우간단...!!!)


2. Tornado 테스트


바로 예제를 통해 테스트를 진행해볼게요.


자신이 원하는 폴더에 python파일을 생성하고 아래와 같이 작성합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# from : http://www.tornadoweb.org/en/stable/#hello-world
# myapp.py
import tornado.ioloop
import tornado.web
 
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
 
def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])
 
if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
cs



그리고 터미널에 다음 명령어를 입력!


python test.py


아래와 같이 실행됩니다.


그리고 인터넷을 통해 localhost:8888 에 접속하여 확인합니다.



결과가 잘 나옵니다!



이렇게해서 Tornado 설치와 간단한 테스트 마무리하도록 하겠습니다.


블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

안녕하세요.

이번에는 python을 이용한 CSP algorithm 중 하나인 Einstein's puzzle(아인슈타인 퍼즐) 해결 코드를 작성해 보겠습니다.



먼저 아인슈타인 퍼즐에 대해 소개해 드릴게요.

아인슈타인의 퍼즐은 아래와 같은 문제입니다.


* 문제의 배경

1. 색깔이 서로 다른 5채의 집이 일렬로 지어져 있다.

2. 각 집에는 서로 다른 국적의 사람이 살고 있다.

3. 다섯 사람은 서로 다른 음료를 마시고, 서로 다른 담배를 피며, 서로 다른 동물을 기른다.


* 15개의 정보

1. 영국인은 빨간 집에서 산다.

2. 스웨덴인은 개를 기른다.

3. 덴마크인은 차를 마신다.

4. 초록집은 하얀집의 왼쪽 집이다.

5. 초록집에 사는 사람은 커피를 마신다.

6. 펠몰 담배를 피는 사람은 새를 기른다.

7. 노란집에 사는 사람은 던힐 담배를 피운다.

8. 한 가운데 집에 사는 사람은 우유를 마신다.

9. 노르웨이 인은 첫번째 집에 산다.

10. 블렌드 담배를 피우는 사람은 고양이를 기르는 사람 옆 집에 산다.

11. 말을 기르른 사람은 던힐 담배를 피우는 사람 옆 집에 산다.

12. 블루매스터 담배를 피는 사람은 맥주를 마신다.

13. 독일인은 프린스 담배를 피운다.

14. 노르웨이인은 파란 집 옆 집에 산다.

15. 블렌드 담배를 피우는 사람은 생수를 마시는 사람과 이웃이다.


위의 문제 배경과 15개의 정보가 있을때, '물고기를 기르는 사람의 국적은 무엇인가'?

(문제 출처: https://web.stanford.edu/~laurik/fsmbook/examples/Einstein%27sPuzzle.html)



이론적인 문제 풀이 방식은 아래와 같은 순서로 풀이가 가능합니다.

먼저 15개의 정보 중에서 확실히 알 수 있는 사실들을 이용한다. 15개의 정보 중에서 8, 9, 14번의 정보는 순서대로 하여 확실히 특정 사실을 알 수 있는 정보이다. 세가지 정보를 이용하면 위의 표와 같이 알 수 있다.


두번째로는 특정 조건들을 결합하여 이용한다. 먼저 4번 정보와 5번 정보를 이용하였다. 4번 정보를 통해 초록집은 하얀 집의 왼쪽 집임을 만족시켜야 한다. 4번 정보를 다르게 해석하면, 초록집의 오른쪽 집은 하얀 집이다. , 1, 2, 5번은 초록집이 될 수 없다. 그리고 5번 정보를 이용하면 초록 집은 3번이 될 수 없다. 따라서 남은 것은 4번뿐이므로 초록집은 4번이다. 또한 4번 집사람은 커피를 마시고 5번집은 하얀집이다. 다음 1번 정보를 확인하면, 2,4,5번 집은 이미 색이 있으므로 빨간집이 아니며 1번집은 노르웨이사람이 살고 있으므로 1번도 아니다. 3번 집이 빨간집이며 영국사람이 산다. 이어서 남은 1번은 자연스럽게 노란색 집이되며 7번 정보를 통해 1번집 사람은 던힐담배를 피운다. 또한 11번 정보를 통해 2번 집 사람은 말을 기른다.



이제 주어진 조건들을 응용하여 추리한다. 3번 정보와 12번 정보를 해석한다. 현재 남은 음료는 생수, , 맥주이다. 3번 정보에서 덴마크인이 차를 마신다고 하였으므로 노르웨이인은 생수 또는 맥주를 마실 것이다. 12번 정보에서 블루매스터 담배를 피우는 사람은 맥주를 마신다고 하였는데, 노르웨이인은 던힐 담배를 피우므로 맥주를 마시지 않는다. 즉 노르웨이인은 생수를 마신다. 또한 15번 정보를 통해서 2번 집 사람은 블렌드 담배를 피운다.

다시 12번 정보를 확인한다. 2번 집 사람은 차 또는 맥주를 마실 텐데 12번 정보에서 블루매스터 담배를 피는 사람이 맥주를 마신다고 하였다. 2번 집 사람은 블렌드 담배를 피우므로 맥주를 마시지 않고 차를 마신다. 그리고 남은 맥주는 당연히 5번 집 사람이 마시고, 5번 집 사람은 블루매스터 담배를 핀다. 이어서 3번 정보를 통해 차를 마시는 2번 집 사람은 덴마크인이다. 




마지막으로 남은 조건들로 추리를 완성한다. 먼저 13번 정보를 확인한다. 독일인은 4번 또는 5번집에 살텐데 5번 집 사람은 블루매스터 담배를 핀다. 따라서 13번 정보를 통해 독일인은 4번집에 살며 프린스 담배를 피운다. 이어서 5번집 사람은 스웨덴인이며, 3번집 사람은 펠몰담배를 핀다.

다음 6번 정보를 통해 펠몰담배를 피는 3번집 사람은 새를 기른다. 또한 2번 정보를 통해 5번 집에 사는 스웨덴인은 개를 기른다.

마지막으로 10번 정보를 통해서 3번 집사람은 이미 새를 키우는 것을 알았으므로 1번집 사람이 고양이를 기른다. 최종적으로 남은 4번집 사람은 물고기를 기른다.




이렇게 해서 아인슈타인의 퍼즐을 해결할 수 있습니다.

이러한 문제를 CSP(Constraint Satisfaction Problems: 제약조건 만족문제)라고 합니다.


아인슈타인 퍼즐을 해결하기 위해 2가지 정도의 알고리즘을 생각해볼 수 있습니다.

첫번째로는, 모든 경우의 수(5^25 or (5!)^5 둘 다 매우 큰 수 입니다...)를 고려하여 그 중 하나를 꺼내 정보와 비교하는 방법.

해당 방법은, 모든 경우의 수를 (5!)^5 으로 고려했을때 경우의 수가 약 240억개 입니다.

우리들의 컴퓨터로는 해결하기가 매우 힘들 수 있죠..


그래서 생각한 것이 두번째 알고리즘 입니다.

두번째 알고리즘은 각각을 카테고리 또는 조건으로 나누어 해결하는 방법입니다.

즉, A라는 조건을 다수의 배열 중 만족하는 배열을 찾아내는 것이 아니라 다수의 배열을 선언하기 전에 A라는 조건을 먼저 대입하고

이를 만족하는 배열 a가 있다면 a를 다음 조건, B에 대입하여 확인해나갑니다.

이렇게 해결을 진행하면 결국 DFS 방법으로 해결방법을 찾아나간다는 것을 아실 수 있습니다.


python으로 코드를 작성하기 위해 검색하던 중, python에서 제공하는 강력한 함수를 찾았습니다.

바로, python-constraint 함수 입니다.

함수에 대한 추가적인 사항은 아래 링크를 참고하시면 좋을 것 같습니다.

https://labix.org/python-constraint

https://pypi.python.org/pypi/python-constraint


python-constraint 함수를 통해, 직접 변수를 설정하고 제약조건을 추가하여 문제를 해결할 수 있습니다.

생각보다 code가 매우 간단해질 수 있어서 꼭 한번 다시 공부해보고 싶은 함수입니다.

추가적인 질문 이나 궁금사항은 댓글로 달아주시거나 이메일 주세요!


전체적인 python code와 실행결과는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# Houses
# 1 2 3 4 5
 
from constraint import *
problem = Problem()
 
nationality = ["영국""스웨덴""독일""노르웨이""덴마크"]
pet = ["개""고양이""새""말""물고기"]
cigarette = ["던힐""블렌드"
"펠몰""프린스""블루매스터"]
colour = ["빨강""초록""노랑""파랑""하양"]
beverage = ["커피""우유""맥주""생수""차"]
 
criteria = nationality + pet + cigarette + colour + beverage
problem.addVariables(criteria,[1,2,3,4,5])
 
problem.addConstraint(AllDifferentConstraint(), nationality)
problem.addConstraint(AllDifferentConstraint(), pet)
problem.addConstraint(AllDifferentConstraint(), cigarette)
problem.addConstraint(AllDifferentConstraint(), colour)
problem.addConstraint(AllDifferentConstraint(), beverage)
 
problem.addConstraint(lambda e, r: e == r, ["영국","빨강"])#1
problem.addConstraint(lambda s, d: s == d, ("스웨덴","개"))#2
problem.addConstraint(lambda c, g: c == g, ("커피","초록"))#5
problem.addConstraint(lambda u, t: u == t, ("덴마크","차"))#3
problem.addConstraint(lambda g, i: g-== 1, ("하양","초록"))#4
problem.addConstraint(lambda o, s: o == s, ("펠몰","새"))#6
problem.addConstraint(lambda k, y: k == y, ("던힐","노랑"))#7
problem.addConstraint(InSetConstraint([3]), ["우유"])#8
problem.addConstraint(InSetConstraint([1]), ["노르웨이"])#9
problem.addConstraint(lambda c, f: abs(c-f) == 1, ("블렌드","고양이"))#10
problem.addConstraint(lambda k, h: abs(k-h) == 1, ("던힐","말"))#11
problem.addConstraint(lambda l, o: l == o, ["블루매스터","맥주"])#12
problem.addConstraint(lambda j, p: j == p, ["독일","프린스"])#13
problem.addConstraint(lambda k, h: abs(k-h) == 1, ("노르웨이","파랑"))#14
 
solution = problem.getSolutions()[0]
 
for i in range(1,6):
  for x in solution:
    if solution[x] == i:
      print (str(i), x)
cs



블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc