파이썬(Python)으로 더 지니어스 게임 만들기 (2)

더 지니어스:블랙가넷 데스 매치


안녕하세요~ BestEng 입니다 ㅎㅎ


지난 포스팅부터 파이썬(Python)으로 더 지니어스:블랙가넷 데스 매치 중 양면포커를 만들어 보기로 했는데요~ 우선 게임 룰을 살펴 보면서 코딩을 시작해 봅시다ㅎㅎ


# 양면포커 게임 룰

  1. 카드의 앞면, 뒷면이 각기 다른 숫자로 이루어진 90장의 양면숫자카드로 진행된다.
  2. 2명의 플레이어는 각각 칩을 30개를 가지고 게임을 시작한다.
  3. 딜러는 90장의 카드를 섞은 뒤 1장씩 앞면이 보이도록 각 플레이어의 앞에 놓는다.
  4. 두 플레이어의 카드 앞면은 공개된 상태이며 카드 뒷면은 본인만 확인할 수 있다.
  5. 카드가 지금되면 각 플레이어들은 기본 베팅으로 칩 1개씩을 내고 선 플레이어부터 베팅을 시작한다.
  6. 선 플레이어부터 자신의 앞면, 뒷면 중 어떤 면에 베팅을 할 것인지 결정한 뒤 베팅한다. 베팅이 시작되면 선택한 베팅 면을 바꿀 없다.
  7. 상대가 베팅한 칩과 같은 개수의 칩을 베팅할 경우, 베팅이 그 즉시 종료되며 두 플레이어가 베팅한 면의 숫자를 공개, 더 높은 숫자의 플레이어가 승리한다.
  8. 앞서 베팅한 칩보다 더 많은 칩을 베팅했을 경우, 카드를 공개하지 않은 채 베팅을 이어간다.
  9. 베팅을 하지 않고 포기할 경우 무조건 상대방이 승리한다.
  10. 두 플레이어의 숫자가 같은 경우 무승부가 되어, 베팅된 칩은 다음 게임에서 이긴 플레이어가 모두 가져간다.
  11. 자신의 앞면과 뒷면의 숫자 모두가 상대방이 선택한 면의 숫자를 이길 수 있다고 생각한다면 ‘양면베팅’을 선택할 수 있다.
  12. 양면베팅을 할 경우 자신의 카드 앞, 뒷면의 숫자가 상대방이 선택한 면의 숫자보다 모두 높아야 승리한다.
  13. 만약 한 면이라도 상대방이 선택한 면의 숫자와 같거나 적을 경우 상대방이 승리한다.
  14. 또한 양면베팅을 건 플레이어는 상대방이 베팅한 칩과 같은 수의 칩을 앞면, 뒷면 두 곳에 각각 베팅해야 한다. 즉, 2배로 베팅해야 한다.
  15. 양면베팅으로 승리했을 경우 상대방의 칩 10개를 추가로 뺏어온다.
  16. 한 플레이어가 칩을 모두 잃으면 해당 플레이어의 패배로 게임이 종료된다.


# 첫 번째 룰 코딩

그럼 이제 본격적으로 코딩을 시작해 봅시다. 우선 첫 번째 룰입니다.


1. 카드의 앞면, 뒷면이 각기 다른 숫자로 이루어진 90장의 양면숫자카드로 진행된다.


우선 양면숫자카드를 만들어야 겠네요. 파이썬은 객체 지향 언어이므로 우선 Deck 클래스를 만들어 봅시다~


class Deck:


Deck을 호출할 때, 90장의 앞,뒷면이 다른 카드를 만들어야 겠네요~ 다음과 같이 __init__ 함수 안에서 for문을 이용해 봅시다.


class Deck:
    def __init__(self):
        self.cards = []
        for m in xrange(1, 11):
            for n in xrange(1, 11):
                if m != n:
                    self.cards.append((m, n))


자 이제 카드들이 만들어 졌네요~ 그럼 이제 골고루 섞어야 겠죠? random 라이브러리의 shuffle 함수를 이용해 봅시다.


from random import shuffle

class Deck:
    def __init__(self):
        self.cards = []
        for m in xrange(1, 11):
            for n in xrange(1, 11):
                if m != n:
                    self.cards.append((m, n))
        random.shuffle(self.cards)


자 깔끔하게 우리의 카드들이 만들어졌습니다~ㅎㅎ 그럼 이제 다음 룰로 넘어가 봅시다.


# 두 번째 룰 코딩


2. 2명의 플레이어는 각각 칩을 30개를 가지고 게임을 시작한다.


이젠 플레이어 클래스를 만들어야 겠네요~! 다음과 같이 호출되는 순간 칩(여기선 points를 사용하겠습니다) 30개를 가지는 플레이어 클래스를 만들어 봅시다.


class Player:
    def __init__(self):
        self.points = 30


그럼 이제 다음과 같이 플레이어와 덱을 설정할 수 있겠네요~


# main
player1 = Player()
player2 = Player()
deck = Deck()


다음 세 번째 룰로 넘어가 봅시다~


# 세 번째 룰 코딩


3. 딜러는 90장의 카드를 섞은 뒤 1장씩 앞면이 보이도록 각 플레이어의 앞에 놓는다.


딜러를 우리가 만든 Deck 클래스라고 생각하고 섞는 것은 위에서 shuffle 함수를 이용해서 이미 했네요~


자, 그럼 이제 1장씩 앞면이 보이도록 각 플레이어에게 주어야죠. 이것은 Game 클래스를 만들어서 게임 내에서 진행되도록 하고 싶네요. 다음과 같이 먼저 Game 클래스를 만들어 봅시다.


class Game:
    def __init__(self):
        pass

    def set(self):
        pass


여기서 set 메쏘드 안에 바로 카드를 뽑아서 각 플레이어에게 나눠주는 일을 하고 싶습니다~ set 메쏘드는 매 턴마다 호출되겠죠.


우선 Player 클래스로 가서 card를 추가해 보죠. card 변수는 앞, 뒤 카드의 숫자를 리스트에 저장합니다. 우선 처음엔 둘 다 0으로 세팅을 해 둡시다.


class Player:
    def __init__(self):
        self.points = 30
        self.card = [0, 0]


자, 다음으로는 Deck 클래스에서 card_pop 메쏘드를 추가해야 겠죠. 리스트의 내장 함수(메쏘드?)인 pop(index)은 리스트에서 index 위치의 요소를 반환(return)하고 리스트에서 해당 요소를 지웁니다.


class Deck:
    def __init__(self):
        self.cards = []
        for m in xrange(1, 11):
            for n in xrange(1, 11):
                if m != n:
                    self.cards.append((m, n))
        random.shuffle(self.cards)

    def card_pop(self):
        return self.cards.pop(0)


Deck 클래스는 이만하면 완성된 것 같군요. 이제 플레이어에게 카드를 주고 싶으면 다음과 같이 하면 됩니다! 그럼 매 턴이 시작될 때, set 메쏘드를 호출하면 각 플레이어들은 deck에서 카드를 하나씩 뽑아 가지게 되겠네요.


class Game:
    def __init__(self):
        pass

    def set(self):
        player1.card = deck.card_pop()
        player2.card = deck.card_pop()


# 네 번째 룰 코딩


4. 두 플레이어의 카드 앞면은 공개된 상태이며 카드 뒷면은 본인만 확인할 수 있다.


세 번째 룰에서 카드를 나누어 주었는데요, 나누어 줄 때, 앞면은 보이지만 뒷면은 안 보이게 놓는 것 같군요! 그래도 카드를 가진 플레이어는 그 카드의 뒷면을 볼 수 있어야 겠죠. Player클래스에 show_back_card 메쏘드를 추가해 봅시다.


from random import shuffle
import ctypes

class Player:
    def __init__(self):
        self.points = 30
        self.card = [0, 0]

    def show_back_card(self):
        ctypes.windll.user32.MessageBoxA(0, "Your back card is "+str(self.card[1]), "Back Card" , 0)


추가로 ctype이라는 라이브러리를 사용하는데요~ 우리는 카드의 뒷면을 윈도우 메세지 창을 이용하여 보여주려고 합니다~ 바로 ctypes.windll.user32.MessageBoxA(0, "Your back card is "+str(self.card[1]), "Back Card" , 0) 이 부분 이죠. 실행하면 다음과 같이 뜹니다.


python ctype MessageBoxA

cytpe 메세지창


이제 카드 뒷면을 보고 싶다면 다음과 같이 호출하면 되겠네요~


player1.show_back_card()


자, 이제 다음 다섯 번째 룰부터는 본격적으로 베팅이 시작되기 때문에 복잡한 코딩이 시작됩니다. 이번 포스팅에서는 여기까지하고 다음 포스팅에 이어서 코딩을 해 보도록 하겠습니다.


# 현재까지의 코딩


from random import shuffle
import ctypes

# Classes
class Player:
    def __init__(self):
        self.points = 30
        self.card = [0, 0]

    def show_back_card(self):
        ctypes.windll.user32.MessageBoxA(0, "Your back card is "+str(self.card[1]), "Back Card" , 0)

class Deck:
    def __init__(self):
        self.cards = []
        for m in xrange(1, 11):
            for n in xrange(1, 11):
                if m != n:
                    self.cards.append((m, n))
        random.shuffle(self.cards)

    def card_pop(self):
        return self.cards.pop(0)

class Game:
    def __init__(self):
        pass

    def set(self):
        player1.card = deck.card_pop()
        player2.card = deck.card_pop()

# Main
player1 = Player()
player2 = Player()
deck = Deck()

파이썬(Python)으로 더 지니어스 게임 만들기 (1)

안녕하세요~! BestEng입니다 ㅎㅎ STEMentor를 준비라느라 한동안 제 블로그에 글을 못 썼네요 ㅠ

2주 전부터 제가 파이썬(Python)을 배우고 있는데요~ 그간 배운 내용을 정리 해 볼겸 간단한 프로젝트를 하나 구상해 봤어요~!

# 더 지니어스: 블랙가넷

다들 더 지니어스: 블랙가넷 아시나요~~? 저는 더 지니어스 시즌 1, 2는 못 보고 시즌 3:블랙가넷이 되서야 보고 있습니다 ㅎㅎ

더 지니어스:블랙가넷

더 지니어스:블랙가넷

# 데스 매치

더 지니어스에는 다양한 게임들이 나오는데요~ 프로그램을 보다가 문득 여기 게임들을 파이썬으로 만들어 보면 재밌겠다~ 싶어서 배운지 얼마 되지는 않았지만 도전해 보게 되었습니다ㅎㅎ 이 중에 메인 게임은 너무 복잡하고 참가 인원이 많아서 데스 매치 위주로 한 번 해 볼 생각인데요~ 데스 매치는 메인 게임 후에 최종 탈락자를 선정하는 게임으로 두 명의 플레이어가 게임을 하게 됩니다~!

더 지니어스:블랙가넷 데스 매치

더 지니어스:블랙가넷 데스 매치

# 양면 포커

메인 게임은 여럿이 하는 재미가 있는 반면 데스 매치는 둘이서 하는 긴장감 넘치는 게임을 볼 수 있죠ㅎㅎ 첫 번째 도전해 볼 게임은 바로 양면 포커입니다!

양면 포커 게임은 4화의 데스 매치로 김정훈씨의 멋진 활약을 볼 수 있었죠~ 이 게임을 파이썬으로 한 번 만들어 볼 생각인데요~ 제 전공이 컴퓨터가 아니라 객체 지향적 언어는 처음 접해 봐서 문법이 조금 어색할 수 있지만 같이 한 번 재밌게 만들어 보도록 하죠 ㅎㅎ

# 게임 룰

우선 양면 포커의 룰을 알아 보도록 합시다. 룰은 공식 홈페이지의 룰 설명글을 참조하도록 하겠습니다ㅎㅎ

양면 포커 룰 양면 포커 룰 양면 포커 룰 양면 포커 룰

양면 포커 룰

조금 복잡하죠? ㅎㅎ 기본적으로 카드 하나는 공개 다른 카드는 비공개로 둔다는 점에서 포커 게임과 비슷한 것 같네요ㅎㅎ 더 지니어스:블랙가넷 4화에서 김정훈씨는 카드 카운팅을 통해 멋진 승부를 보여주었습니다. 이런 게임을 만들어서 친구와 함께 즐겨 보는 것도 괜찮겠죠?ㅎㅎ

그럼 바로 다음 포스팅부터 시작해 보도록 하겠습니다~!

StackEdit 사용하기



안녕하세요~ BestEng 입니다. 오늘은 마크다운(Markdown) 문법으로 작성된 글을 html 형식으로 바꿔주는 마크다운 에디터 StackEdit 사용법을 소개해 드리도록 하겠습니다.

# StackEdit 사용하기

StackEdit은 Google Drive App으로 기본적으로 Google Drive와의 호환성이 뛰어 납니다. 하지만 굳이 Google Drive와 연동하지 않더라도 실행 가능하며 심지어 offline 환경에서도 동작을 하는 장점이 있습니다.


제가 블로그에 글을 쓸 때의 Work flow는 (참고 - 티스토리에 마크다운(Markdown)으로 블로깅하기) StackEdit을 마크다운 변환기로만 이용하기 때문에 Google Drive와의 연동이 필요없다~ 하시는 분은 그냥 웹상에서 이용하시면 됩니다. (저는 이미 연동이 되어 있어서 정확히 구글 계정이 필요 없는지는 확실하지 않네요)


우선 다음의 StackEdit 홈페이지에 접속합니다.

StackEdit 홈페이지 링크 - https://stackedit.io/


그러면 다음과 같이 StackEdit 메인 화면이 보입니다.


StackEdit Main
StackEdit 메인 화면


메인 화면에서 상단의 Start writing now!를 클릭합니다. 그럼 다음과 같이 StackEdit 에디터 페이지가 나옵니다.


StackEdit Editor
StackEdit 에디터 화면


이제 새 문서를 만들어야 겠죠. 에디터 화면 좌측 상단의 폴더 모양 아이콘을 클릭합니다.


StackEdit Make New Doc
StackEdit 새 문서 만들기


그럼 다음과 같이 빈 페이지가 나타납니다.


StackEdit New Doc
StackEdit 빈 페이지


우선 새 문서의 제목을 입력합니다. 저는 Test로 만들었는데요, 이렇게 제목을 입력하면 자동으로 .md 파일로 만들어 진답니다. 물론 이 파일을 직접 이용할 일은 제 작업에서는 없습니다. ㅎㅎ


왼쪽에 보이는게 Editor Panel로 실제 마크다운 문법으로 작성하는 곳이고, 오른쪽이 Viewer Panel로 이렇게 작성된 문서가 html로 변환이 되면 실제 웹 상에서 어떻게 보여지는지 보여주는 패널입니다.


간단한 내용을 마크다운 문법을 이용해 Editor Panel에 입력해보죠.


StackEdit Test Doc
StackEdit 테스트 문서


왼쪽 뷰어 패널에 잘 나타나죠? 그럼 이제 마지막으로 이를 html로 변환하는 과정이 남았습니다.
뷰어 패널 오른쪽 아래의 아이콘을 클릭합니다. 그러면 아래와 같이 메뉴가 나타납니다.


StackEdit Convert to html
StackEdit HTML 변환


여기서 <> 모양의 아이콘이 바로 html로 변환해 주는 단추입니다. 클릭해 봅시다.


StackEdit Converted HTML code
StackEdit 변환된 HTML 코드


네, html로 변환된 코드가 보이시나요~? Ctrl+C로 복사하면 이제 클립보드에 여러분의 마크다운 문법으로 작성한 글의 html 코드가 복사 됩니다.


마크다운 문법은 기본적으로 html를 지원하므로 바로 확인해 볼 겸 왼쪽의 에디터 패널에 붙여 넣어 보죠.


StackEdit HTML Code Check
StackEdit HTML 코드 확인


네, 오른쪽 뷰어 패널에 변화가 없는걸 보니, html 코드로 잘 변환이 된 것을 알 수 있네요. 이와 같이 StackEdit을 통해 변환된 html 코드를 이제는 여러분의 블로그 글 작성란(HTML)에 붙여 넣으시면 된답니다.

# 마치며

오늘은 StackEdit을 이용하여 마크다운 문법으로 작성된 글을 html로 변환하는 과정을 차근차근 살펴 보았습니다. 실제로 웹 상에 html 변환과 편집 등 다양한 기능을 제공하는 마크다운 툴은 여러가지가 있지만 저는 오로지 html 변환 기능만 사용하기 때문에 StackEdit을 쓰고 있습니다.

실제로 StackEdit도 에디터 페널에서 편집을 하면 그 결과를 바로 뷰어 패널을 통해서 확인할 수 있지만 한글 호환성이 좋지가 않아 저는 글을 쓸 때에는 그냥 Sublime Text 3를 쓰고 있습니다. 여러분은 여러분 취향에 맞게 다양한 툴들의 장단점을 알아보시고 사용하시면 되겠죠~?ㅎㅎ 그럼 오늘은 이만 줄이도록 하겠습니다~

티스토리에 MathJax로 포스팅하기



안녕하세요! 지난 포스팅(티스토리에 마크다운(Markdown)으로 블로깅하기)에 이어 이번에는 티스토리 블로그에 어떻게 MathJax를 이용하는지 알아보겠습니다.


# MathJax란?

MathJax란 오픈 소스 기반으로 웹 상에서 수식을 표현해 주는 툴이라고 할 수 있습니다.

일반적으로 MS Word한글 같은 워드 프로세서에는 기본적으로 수식 툴이 내장되어 있는데요,
이를 웹 상으로 옮기려면 수식을 이미지화 하여 삽입하는 방법 밖에는 없답니다. (적어도 제가 찾아보기에는요ㅜㅜ)
이는 많은 수식을 적기에 매우 불편할 뿐만아니라 특히, 문장 안의 수식같은 경우에는 정렬이 제대로 되지 않아 보기에 이쁘지도 않습니다.

그래서 나온 대안책이 바로 웹 상에서 HTML 형식으로 수식을 적으면 이를 서비스 제공자가 렌더링 해주는 방식입니다.
그 대표적인 사례가 바로 MathJax죠.


# Why MathJax?

웹 상에서 수식을 표현하는 데 다양한 방법들을 찾을 수가 있었는데요,
그 중에서 가장 대중적이고 편리한 툴이 바로 MathJax입니다.

티스토리 블로그에서의 사용에 초점을 두어 MathJax의 장점들에 대해 알아보도록 하겠습니다.


# MathJax의 장점

  1. 티스토리 블로그에서 사용이 편리하다

    실제로 티스토리 블로그에서 MathJax를 사용하려면 관리 > 꾸미기 > HTLM/CSS 편집 > HTML/CSS 에서 skin.html</head> 위에 다음 코드를 붙여 넣기만 하면 된답니다.

    <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>
  2. 문법이 간단하다

    MathJax는 기본적으로 LaTeX와 동일한 문법을 사용합니다.
    기본적인 문법 설명은 Wiki Books - LaTeX/Mathematics에 잘 설명이 되어 있네요~
    영문으로 되어 있어도 수식들이니까 알아보는데 큰 문제는 없을 것 같네요.

  3. 예쁘다

    직접 써보시면 아시겠지만 확실히 이미지로 수식들을 붙여 넣는 것보다 수식이 더 깔끔하고 보기에 좋습니다.
    직접 한 번 비교해 보시죠.

    Note: 수식 비교

    먼저 제가 이 블로깅에 대해 아무것도 모를 때 작성한 포스트(Reynolds Transport Theorem과 검사 체적(Control Volume)) 중 일부를 보여 드리겠습니다.


    ▲ 수식을 이미지로 붙여 넣은 경우

    보시다시피 문장 내에서 수식 이미지가 잘 정렬되지 않아 깔끔하지 않습니다.

    그러면 이번엔 똑같은 글을 MathJax를 이용하여 작성해 보겠습니다.

    우선, RTT의 기본 식에 대해 알아 보겠습니다.

    ddt(Ω(t)f(x,t)dV)=Ω(t)f(x,t)tdV+Ω(t)(vbn)f(x,t)dA

    여기서 f(x,t)는 계 내의 물리량, vb=vb(x,t)는 위치 x에서의 경계면의 속도이며 n=n(x,t)는 위치 x에서의 곡면 Ω(t)의 법선 벡터입니다.

    ▲ 수식을 MathJax로 작성한 경우

    훨씬 깔끔한게 느껴지시나요?
    처음엔 LaTeX 문법이 조금 어려우실 수도 있지만 익숙해 진다면

    참고로 위의 내용은 다음과 같은 마크다운 문법(+LaTeX 문법)으로 작성되었습니다.

    >> 우선, RTT의 기본 식에 대해 알아 보겠습니다.
    >> $$ \frac{d}{dt}\left(\int_{\Omega(t)}{\mathbf{f}(\mathbf{x},t)dV}\right)=\int_{\Omega(t)}{\frac{\partial \mathbf{f}(\mathbf{x},t)}{\partial t}dV+\int_{\partial \Omega(t)}{(\mathbf{v^b} \cdot \mathbf{n})\mathbf{f}(\mathbf{x},t)dA}}$$
    >> 여기서 $f(x,t)$는 계 내의 물리량, $v^b = v^b (x,t)$는 위치 $x$에서의 경계면의 속도이며 $n=n(x,t)$는 위치 $x$에서의 곡면 $\partial \Omega (t)$의 법선 벡터입니다.

여태까지 MathJax 툴의 장점들을 알아 보았습니다.
위의 장점들 때문에 저는 공학 블로그 포스팅을 할 때에 마크다운(Markdown)MathJax 툴을 사용한답니다.


# 티스토리 블로그에서 MathJax 사용법

우선 MathJax 툴을 티스토리 블로그에서 사용할 수 있도록 해야 겠죠.
위에서 소개한대로 관리 > 꾸미기 > HTLM/CSS 편집 > HTML/CSS 에서 skin.html</head> 위에 다음 코드를 붙여 넣습니다.

<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>



그러면 이제 마크다운 문법으로 글을 작성하실 때, 다음과 같은 규칙으로 MathJax 툴을 호출할 수 있답니다.

  • 문단 사이에 수식 삽입

    문단 사이에서 $$$$ 사이에 LaTeX 수식 표현을 넣습니다.

    예시 글

    윗 문단
    $$y=ax+b$$
    아랫 문단
    

    결과

    윗 문단

    y=ax+b

    아랫 문단

  • 문장 안에 수식 삽입

    문장 안에서 $$ 사이에 LaTeX 수식 표현을 넣습니다.

    예시 글

    앞 문장 $y=ax+b$ 뒷 문장
    

    결과

    앞 문장 y=ax+b 뒷 문장

이런식으로 글 속에서 LaTeX 문법을 섞어 작성하신 후에 StackEdit 등의 마크다운 변환기를 통해 HTML로 변환한 코드를 티스토리 블로그 글 작성란(HTML)에 붙여 넣기만 하면 예쁜 수식이 보이게 된답니다~!
어때요, 참 쉽죠?ㅎㅎ


# 글을 마치며

오늘은 MathJax 툴을 어떻게 티스토리 블로그에 적용시키고 수식을 작성하는지에 대해 알아보았습니다.
STEM 활동의 일환으로 시작한 블로깅이지만 생각보다 재미있는 기능들이 많네요.

이것으로 기본적인 공학 블로그 포스팅하는 법을 마치고 이제 STEM의 공식 공과대학 학부생 멘토링 블로그 STEMentor에서 다양한 공대 전공 과목들로 만나뵙도록 하겠습니다~!


티스토리에 마크다운(Markdown)으로 블로깅하기


안녕하세요! 지난번에 티스토리에 공학 블로그 글의 작성법에 대해서 포스팅했었는데요~
바로 마크다운(Markdown)MathJax를 이용하여 글을 편리하게 작성할 수 있다고 말씀드렸죠.

이번엔 제가 쓰는 마크다운 툴로 어떻게 티스토리에 블로깅하는지 소개해 드리려고 해요.


# 마크다운(Markdown)이란?

마크다운이란 웹 상에서 글을 편하게 작성하기 위해 만들어진 문법으로 매우 간단한게 장점입니다.
기본적인 문법은 마크다운 공식 웹사이트에서 확인할 수 있습니다.
한국어 번역은 이 포스트에 잘 되어 있네요.

예시로 위의 글은 마크다운 문법으로 어떻게 작성되었는지 보시죠.

<br/>
안녕하세요! 이번엔 제가 쓰는 **마크다운 툴**로 어떻게 **티스토리**에 블로깅하는지 소개해 드리려고 해요.<br/><br/>
_____
### # 마크다운(Markdown)이란?

**마크다운**이란 웹 상에서 글을 편하게 작성하기 위해 만들어진 문법으로 매우 간단한게 장점입니다.
기본적인 문법은 [마크다운 공식 웹사이트](http://daringfireball.net/projects/markdown/syntax/ "마크다운 공식 웹사이트")에서 확인할 수 있습니다.
한국어 번역은 [이 포스트](http://scriptogr.am/myevan/post/markdown-syntax-guide-for-scriptogram/ "마크다운 번역 포스트")에 잘 되어 있네요.<br/><br/>

예시로 위의 글은 마크다운 문법으로 어떻게 작성되었는지 보시죠.<br/><br/>



어때요? 그렇게 복잡하지는 않죠?

이런식으로 메모장이나 제가 지금 쓰는 서브라임 텍스트 3(Sublime Text 3)등의 문서 편집 프로그램으로 마크다운 문법으로 주욱 적어 내려가면 일단 글의 내용은 완성입니다.



▲ 이번 포스팅을 작성하는데 사용한 Sublime Text 3 화면



# 마크다운 툴 StackEdit

위에서 마크다운 문법으로 문서를 하나 만들었는데요, 이를 티스토리 블로그에 쓰기 위해서는 마크다운 문서(.md)를 HTML로 변환해 주는 마크다운 툴이 필요합니다.
웹 상에 무료 혹은 유료로 많은 마크다운 툴이 있고 친절하신 한 분이 이들의 장단점을 잘 정리해 주셨습니다. - 관련 링크

저는 이 중에서 웹 상에서(혹은 오프라인에서도) 간단히 이용할 수 있고 구글 드라이브와 연동이 잘 되는 StackEdit을 사용합니다.

StackEdit의 장점

  1. HTML 변환이 매우 간편하다 (클릭 한 번)
  2. 설치가 간편하다 (구글 드라이브 앱)
  3. 기본적으로 MathJax를 지원한다
  4. 깔끔한 Viewer를 제공한다
  5. 구글 드라이브와 연동이 되어 공동작업에 용이하다

저는 이 장점들 중에서 특히 1번2번, 3번이 매우 유용하게 느껴져 StackEdit을 사용한답니다.
(HarooPad를 한 번 사용해 보았는데, 설치도 조금 걸리고 HTML 변환도 귀찮게 느껴지더라구요…)
또한 StackEdit은 무엇보다 공학 블로그의 필수인 수식입력을 MathJax를 이용해 간편하게 할 수 있다는 것!

다양하게 찾아 보고 실제로 티스토리 블로그에 적용해 본 결과 StackEdit이 저에겐 가장 편한 툴이라고 생각됩니다.




▲ 이번 포스팅을 작성하는데 사용한 StackEdit 화면



# Work Flow

블로깅을 할 때, 자신만의 Work flow를 가지고 있다면 작업에 일관성이 생기고 효율이 증가하기 때문에 하나쯤 생각해 두시는 것을 추천해 드리는데요,
제가 블로깅을 할 때의 Work flow는 다음과 같습니다.



▲ Work flow chart 



# 마무리하며

제가 티스토리에 마크다운을 활용하여 어떻게 블로깅 하는지 살펴 보았습니다.
이것은 단지 제가 편해서 쓰는 방법이지 꼭 이게 정답이라고 할 수는 없습니다.

요즘은 웹 상에서 필요한 정보를 다양하게 얻을 수 있으니 여러분만의 방법을 찾는 것도 좋은 방법이라고 생각합니다.

그럼 다음번엔 MathJax를 어떻게 티스토리 블로깅에 이용하는지 살펴보도록 하겠습니다~!

마크다운(Markdown) 문법과 MathJax로 공학 블로그 포스팅하기



STEM 프로젝트의 일환으로 공과대학 전공 과목 관련 포스팅을 하기 위하여 이런 저런 블로깅 툴을 살펴 보았습니다.


저는 HTML/CSS나 블로깅에 관한 지식이 전무하였기에 거의 맨땅에 헤딩하기 였죠.
그래도 요즘엔 하도 IT 시대이다 보니 우리나라 사용자도 많아져 한글로 된 설명이나 포스트들이 많아 오래 걸리지 않고 나름대로 정리할 수 있었습니다.


# 공학 블로그?

이번에 이런 저런 것들을 검색해보다 알게 됐는데 사진, 취미, IT 등의 블로그들은 많은데 공학 전문 블로그는 많이 없는 이유를 알 것 같았습니다.
물론 다양한 이유들이 있겠지만 그 중 중요하다고 생각되는 이유 중 하나가 바로 수식을 적기에 만만치가 않다는 것이었습니다.


# 웹 페이지에 수식 입력이 힘들다…

공과대학 학부생들이라면 보고서를 제출하기 위해 다들 Word 프로세서한글을 이용하여 수식 작성은 많이 해보셨을 것이라고 생각됩니다.
위 프로그램들로 작성된 문서를 그대로 제출하거나 출력해서 제출하고, 보관시에는 pdf로 보관을 하기도 하는데 그리 어렵지 않습니다.


하지만! 이를 웹 페이지에서 작성하는 것은 문제가 또 다른데요, 가장 크게 문제되는 것이 수식을 예쁘게 렌더링 해 주는 플러그인이 잘 공급되어 있지 않다는 것입니다.
아마 공학 블로그가 대중들에게 인기가 없기 때문이지 않을까 싶네요…


# 수식을 이미지로?

내 글에 수식이 필요하다~ 하면 흔히들 수식이미지로 변환하여 블로그에 넣고는 합니다.
하지만 이 경우 수식이 많아질 경우에 조금 귀찮아진다는 문제점이 있죠.


더 큰 문제는 문장 안에 수식을 넣고자 할 때, 이쁘지가 않다는 겁니다.
바로 이 문제 때문에 제가 이미지로 수식을 삽입하는 것을 포기했죠..


# LaTex to HTML?

그래도 수학이나 공학을 전문으로 포스팅하려는 분들의 노력으로 조금 어렵지만 다양한 길들이 생겨나고 있습니다.
바로 LaTex 구문HTML로 작성하면 이를 서비스 공급 업체를 통해 렌더링 해 주는 방식입니다.


예를 들어, 제가 문장 안에 $\int_{\Omega(t)}{f(x,t)dV}$를 입력하면 Ω(t)f(x,t)dV 이렇게 렌더링을 해 주는 것이죠.


비록 렌더링 시간이 조금 걸리지만 제가 생각했을 때, 가장 편리하고 포스팅이 쉬운 방법이 아닐까 생각되네요.



다음 포스팅 때, 티스토리 블로그에서 어떻게 이를 쓸 수 있는지에 대해 설명해 드리도록 하겠습니다~!

Reynolds Transport Theorem과 검사 체적(Control Volume)

# RTT ??

RTT는 대학교 2학년 과정의 유체역학을 공부하면 가장 먼저 보게 되는 정리로 다음과 같이 간단하게 표현할 수 있습니다.

 

시간에 따라 형태가 변하는 계(System) 내의 물리량에 관한 정리

 

연속체의 역학을 다룰 때 매우 유용한 정리로 유체역학, 고체역학 등의 해석에 주로 이용되죠.

 

# RTT와 검사 체적 해석

유체역학에서는 RTT를 주로 검사 체적(Control Volume)을 다룰 때 사용하게 되는데요~

실제 RTT의 개념과 검사 체적 해석 시 사용하는 개념이 조금 다릅니다.

지금부터 그 차이점에 대해 자세하게 알아 보겠습니다.



RTT의 일반적인 표현식


우선, RTT의 기본 식에 대해 알아 보겠습니다.

 


여기서 는 계 내의 물리량는 위치 x에서의 경계면의 속도이며 는 위치 x에서의 곡면 의 법선 벡터입니다.

 

 

위 식의 유도는 시중의 아무 유체역학 책을 보셔도 무리 없이 이해가 가실 겁니다.

 

# 열린 계

주의하셔야 할 점은 위 식에서 는 시간 t일 때, 우리가 보고자 하는 계를 의미한다는 것입니다.

여기서의 계는 열린 계(Open System)로써 에너지와 물질이 드나들 수 있는 계입니다.

 

다시 말해서, RTT는 계 내의 어떤 물질을 가지고 얘기하는 것이 아니라는 말이죠.

 

위의 정리는 계가 연속적으로 움직이고, 그 계 내의 물리량이 연속적이기만 한다면 항상 성립하는 식입니다.

연속적이라는 단서는 미분이 필요하기 때문에 붙은 것입니다.

 

그렇다면 이를 어떻게 검사 체적 해석에 사용할까요?

 


닫힌 계에서의 RTT

 

# 닫힌계

위에서 는 열린 계로 에너지와 물질이 자유로이 드나들 수 있다고 했습니다.

그렇다면 만약 이를 닫힌 계(Closed System), 즉 에너지는 드나들 수 있지만 물질은 그렇지 못한 계로 한정 지으면 어떻게 될까요?

 

유체나 고체의 한 덩어리(Parcel)만을 계로 잡을 때가 이 경우에 해당합니다.

 

위와 같은 경우는 경계면의 속도가 결국 그 지점에서 물질의 속도가 됩니다.

, 다음 식이 성립하죠.

 


이를 이용하여 RTT를 다시 써보면 다음과 같이 됩니다.

 


 


RTT와 검사 체적 해석


위에서 언급했듯이 닫힌 계에서의 RTT는 유체나 고체 한 덩어리를 하나의 계로 보았을 때 적용되는 정리입니다.

                                                                                                              

그러나 우리가 흔히 사용하는 검사 체적은 열린 계로써 지면에 고정되어 있습니다. (물론 가속되는 계의 경우를 다루기도 하지만 그것은 나중 문제로 남겨두죠)


# 검사 체적 해석

그렇기 때문에 위의 식이 특정 시간 t에 대해 성립하는 식임을 이용하여 간단한 트릭을 이용합니다.

바로 시간 t0일 때의 유체나 고체 덩어리를 검사 체적으로 정하는 것이죠.

식으로 표현하면 다음과 같습니다.



물론 t0초가 아닌 다른 시간대에서는 위의 식이 성립하지 않겠죠. (ex.)

유체나 고체 덩어리가 우리가 보고자 하는 검사 체적이 아닌 다른 영역을 차지하고 있을 테니까요.

 

그렇다면 시간 t0일 때, RTT식은 다음과 같이 바뀌게 됩니다.


 

이제 익숙한 식이 나왔죠?

이 식이 바로 검사 체적에서 RTT를 이용한 식입니다.

 


왜 바로 RTT를 적용하지 않는가?


그렇다면 왜 바로 맨 위의 RTT 정의에서 열린 계인 검사 체적을 바로 도입하지 않고 유체나 고체 덩어리를 닫힌 계로 보는 과정을 도입했느냐 하면,

이미 눈치채셨을 수도 있지만 바로 유체나 고체를 직접 다룸으로써 질량과 운동량 보존 법칙을 적용하기 위해서랍니다.

 

RTT는 다분히 수학적인 식으로 실제 물리 현상을 다루는 정리라고 섣불리 결정지을 수 없습니다.

그러나 위의 과정을 거치면서 역학적 문제로 다뤄질 수 있게 되는 거죠.

 

조금 감이 잡히셨나요?

 

혹시 궁금한 점 있으시면 댓글 남겨주시기 바랍니다^^

 

 


'Engineering > Lectures' 카테고리의 다른 글

Reynolds Transport Theorem과 검사 체적(Control Volume)  (0) 2014.10.07

Honor Society란?

Honor Society란 무엇일까?

위키피디아의 정의에 따르면, 미국에서 Honor Society는 동료 혹은 또래 사이에서 뛰어나다고 인정받는 사람들의 모임입니다.[각주:1]

우수한 사람들이 모인 만큼 그들 사이의 커넥션도 중요하게 여기지만 사회 다방면의 문제에 대해 포럼을 열기도 하고, 사회에 기여하기 위하여 다양한 노력들도 한답니다.

국내에도 몇몇의 대학교 내에 Honor Society가 만들어지고 있는데요, 그 중 몇 군데만 간략이 소개해 드리도록 하겠습니다.

 

 Honor Society

공우, STEM (academic)

서울대학교 공과대학교의 Honor Society로 국내 대학 내에서는 최초로 만들어진 Honor Society입니다.

글립, GLEAP (academic)

서울대학교 자연과학대학의 Honor Society로 2012년도에 만들어졌습니다.

알파, ALPHA (academic)

포항공과대학교의 Honor Society 입니다.

 

해외 Honor Society

Sigma Gamma Tau, (academic)

Honor Society in Aerospace Engineering

Phi Tau Sigma, (academic)

 International Mechanical Engineering Honor Society

 

  1. http://en.wikipedia.org/wiki/Honor_society [본문으로]

'STEM' 카테고리의 다른 글

Honor Society란?  (0) 2014.10.01