안경잡이개발자

728x90
반응형

  깃(Git)을 이용하면 하나의 프로젝트를 여러 사람들과 함께 효과적으로 관리하여 협업할 수 있습니다. 실제로 오픈소스를 효과적으로 관리하기 위한 목적으로 깃이 만들어 졌으므로 깃은 실제 프로젝트에 적용하기에 매우 적합합니다.


  여러분이 하나의 프로젝트를 여러 사람과 함께 작업한다고 해봅시다. '동시에' 프로젝트를 작업해야 한다는 점에서 매우 큰 난항을 겪을 수 있습니다. 소스코드를 여러 명이 동시에 보면서, 소스코드를 수정해야 하는데 이러한 작업은 깃(GIt)과 같은 협업 관리 도구가 없으면 쉽지 않습니다.


  깃(Git)은 여러 명이 병렬적으로 개발을 할 수 있게 해준다는 점에서 프로젝트 개발 속도를 매우 빠르게 해줍니다. 실제로 리눅스를 포함해서 다양한 오픈소스 프로젝트들은 수천 명이 넘는 개발자가 포함되어 있는데, 이들의 작업 내역을 어떻게 효과적으로 관리할 수 있는지를 깃(Git)을 제대로 배웠을 때 바르게 이해할 수 있습니다.


  무엇보다 깃(Git)을 사용할 때 얻을 수 있는, 개발자의 현실적인 장점포트폴리오 관리에도 용이하다는 겁니다. 깃 허브(Git Hub)에 자신이 작업한 프로젝트를 나열하여 얼마나 주기적으로 프로젝트를 관리하고 있는지 모두 드러나기 때문입니다.


※ 깃을 사용하지 않는 경우 ※


  깃을 사용하지 않으면 소스코드를 USB에 담아서 다른 사람의 컴퓨터로 옮기는 방식 등으로 프로젝트를 공유해야 합니다. 그러면, A라는 사람이 수정한 내역이 B라는 사람에게 즉각적으로 전달이 안 되기 때문에 A와 B가 동시에 프로젝트를 작업하기는 어렵습니다. 실제로 저는 깃을 사용하는 방법을 모르는 2년 전에 해커톤에 나간 적이 있었는데요. 카카오톡으로 프로젝트를 주고 받으면서 개발한 기억이 납니다. (그럼에도 불구하고 당시 최우수상 수상)


  혹은 깃 대신에 서브버전(Subversion)을 사용할 수 있습니다. 줄여서 SVN이라고도 부르는 이것은 Git이 활발하게 이용되기 이전에 많이 사용되었던 협업 관리 도구입니다. SVN은 기본적으로 중앙 서버가 존재한다는 점에서 Git과는 차이점이 존재합니다. 서브버전 자체도 오픈소스라는 특징이 있으며, 저는 Git 세대라서 서브버전을 사용해 본 적은 없습니다.


※ 깃을 사용하는 경우 ※


  앞서 다루어 본 SVN은 각 컴퓨터가 중앙 서버처럼 사용하는 컴퓨터로부터 파일을 다운로드 받아 이용하는 방식입니다. 깃(Git)은 중앙 서버의 개념이 없으며 중앙 서버처럼 사용하는 컴퓨터가 있다고 하더라도, 그 서버가 망가졌을 때 다른 컴퓨터로부터 소스코드를 복구할 수 있다는 특징이 있습니다.


※ 깃의 장점 ※


- 분산적인 개발: 깃(Git)을 사용하는 전체 개발 내역을 각 개발자의 로컬 컴퓨터로 복사할 수 있습니다. 나중에 서로 수정된 내역을 합치기(Merge)할 수도 있으며 이 때 Git의 고유한 프로토콜을 이용하게 됩니다.


- 효율적인 개발: 깃(Git)은 일반적인 다른 버전 관리 시스템보다 성능이 뛰어나며, 변경 이력이 많더라도 변경된 내용만 처리한다는 점에서 메모리적인 효율성 또한 뛰어납니다.


- 비선형적인 개발: 깃(Git)은 브랜치(Branch)라는 개념이 사용됩니다. 다시 말해서 프로젝트의 가지치기가 가능합니다. 이는 트리 구조, 다시 말해서 비선형적인 구조라고 볼 수 있습니다.


- 변경 이력 보장: 작업된 모든 내역(Commit 내역)들은 모두 별도의 영역에서 관리되어 안전하게 프로젝트를 운영할 수 있습니다.


※ 깃을 쓰지 않았을 때 다루기 어려운 문제들 ※


  우리가 유명한 안드로이드 어플리케이션을 개발하고 있는 개발자라고 가정합시다.


  현재 사용자들이 이용하고 있는 배포 버전이 있는 상태에서, 우리는 새로운 기능을 개발하고 있습니다. 이 때 갑자기 배포 버전에 오류가 있다는 사실이 드러나서, 빠르게 배포 버전을 수정해야 하는 상황이 왔다고 해봅시다. 이 때 우리는 어떻게 효과적으로 프로젝트 수정을 처리할 수 있을까요?


  이러한 내용은 깃에 대해서 자세히 공부하면서 익힐 수 있게 됩니다.

728x90
반응형

728x90
반응형

  이번 시간에는 Git을 설치한 뒤에 기본적인 사용법에 대해서 알아보도록 하겠습니다. 정말 필요한 내용만 빠르게 다루어 보도록 하겠습니다. 일단 Git을 사용하기 위해서는 Git 저장소를 하나 만들어야 하는데요. 일반적으로 Git Hub에서 무료 저장소를 만들어서, 여기에다가 각종 소스코드를 올리곤 합니다. 소스 코드를 오픈 소스로 누구에게나 공개(Public) 설정을 한다면 Git Hub를 무료로 사용할 수 있습니다.


  ▶ 깃 허브(Git Hub): https://github.com/


  위 깃 허브 웹 사이트에 가입한 이후에 로그인을 해줍니다.


※ 깃 저장소 만들기 ※


  저장소는 말 그대로 소스코드가 저장되는 공간을 의미합니다. 쉽게 말해 하나의 '프로젝트(Project)'를 의미합니다.



  New Repository 버튼을 눌러서 새로운 저장소를 만들 수 있어요.



  일단 깃의 사용법을 연습하는 목적이므로 간단히 아무 이름이나 넣어서 저장소를 만들어 보도록 하겠습니다.



  결과적으로 Git Hub에 하나의 오픈 소스 프로젝트가 생성이 되었습니다. 그리고 이 저장소에 접근할 수 있는 공인 URL 주소가 생성됩니다. 이제 언제 어디에서나 이 프로젝트를 다운로드 받을 수 있게 된 거예요. 물론 지금 프로젝트는 텅텅 비어있지만요.


  그렇다면 이렇게 만들어진 저장소에 접근하여 프로젝트를 업로드하거나, 다운로드 하는 방법은 무엇일까요? 바로 Git 소프트웨어를 설치하는 겁니다. 말 그대로 Git이라는 것을 사용하도록 해주는 프로그램입니다.


  ▶ 깃 다운로드: https://git-scm.com/downloads


  깃을 다운로드 받아서 적절히 설치해줍니다.


  


  설치 이후에는 명령 프롬프트(CMD)에서 git이라고 입력을 해보면, 설치가 완료되어 각종 세부적인 명령어를 사용 여부를 확인할 수 있습니다.


  


  설치된 깃의 버전을 확인할 때는 git --version이라고 입력하시면 됩니다.


  


  이제 자신의 깃 허브 가입 내용과 동일하도록 이름 및 이메일을 입력하여 환경 설정을 진행합니다.


  ▶ git config --global user.name 유저명

  ▶ git config --global user.email 이메일



  이후에 테스트를 위해 간단히 특정한 경로에 폴더를 생성해주도록 합니다.



  명령 프롬프트에서 해당 경로로 이동하여 자신이 만든 원격지 저장소에서 다운로드할 수 있도록 합니다. 깃에서는 다운로드의 개념과 동일한 단어로 클론(Clone)이라는 단어를 사용합니다. 엄밀히 말하면 클론 이후에는 자신의 컴퓨터도 고유한 저장소가 되는 겁니다.


  ▶ git clone {클론 하고자 할 깃 URL}



  그러면 다음과 같이 저장소로부터 클론이 완료됩니다.



  실제로 클론된 폴더에 들어가 보면 다양한 환경 설정 정보가 담겨 있는 .git 폴더를 확인할 수 있습니다.



  기본적으로 윈도우에서는 이러한 환경 설정 폴더를 '숨김' 처리 해놓으므로, 만약 보이지 않으시는 분들은 '보기' 에서 '옵션'에 들어가 숨김 해제를 해주셔야 합니다.



  다음과 같이 확장명 숨기기를 체크 해제 해주시면 됩니다.



  이제 한 번 우리의 깃 프로젝트에 하나의 문서를 추가해봅시다. 소스 코드 등을 추가했다고 가정하는 거예요.



  이제 수정된 내역을 git add 명령어로 추가하고, 저장소에 반영하기 위해서 git commit 명령어를 사용합니다. 이후에 원격지 저장소인 Git Hub 저장소에 반영하기 위해서 git push 명령어를 사용하면 됩니다.


  ▶ git add {파일 이름}: 수정된 파일을 수정 내역에 추가합니다.

  ▶ git commit -m {커밋 메시지}: 수정된 내역을 저장소에 반영합니다. 반영이 되면 스냅샷(Snapshot)이 찍히게 되어 저장됩니다.

  ▶ git push: 원격지 저장소에도 수정 내역을 반영합니다.



  이제 다시 깃 허브로 이동해보시면 다음과 같이 파일이 추가된 것을 확인할 수 있습니다.




728x90
반응형

728x90
반응형

  오픈 소스(Open Source)란 '공개된 소스코드'를 의미합니다. 특정한 소프트웨어를 개발한 개발자의 권리를 지키면서 누구나 소스코드를 확인할 수 있도록 합니다. 소스코드가 공개된다는 것은 어떤 의미일까요? 맞습니다. 공짜(Free)입니다.


  오픈 소스는 대학교 시절 온갖 컴퓨터 과제의 도우미와도 같은 존재였습니다. 정말 없는 오픈 소스가 없거든요. 가장 대표적인 오픈 소스로는 제가 강의에서 굉장히 자주 다루었던 부트스트랩(Bootstrap)이 있습니다.



  (부트스트랩: 가장 유명한 웹 디자인 프레임워크 중 하나) 부트스트랩은 세계적으로 가장 큰 오픈 소스 저장소인 Git Hub에서 확인할 수 있습니다.



  오픈 소스 활동은 특정한 프로젝트를 오픈 소스로 만들어서 관리하는 행위, 컨트리뷰션(Contribution)하는 행위 등을 지칭합니다.


  컨트리뷰션은 말 그대로 기여한다는 의미이며 기능 추가, 보안 취약점 수정 등 뿐만 아니라 오타 수정, 번역, 의견 제시 등도 컨트리뷰션이라고 할 수 있습니다. 그렇기 때문에 사실상 누구나 컨트리뷰션을 할 수 있습니다.


  어떠한 이익도 없을 것 같은 오픈 소스 활동. 다시 말해 컨트리뷰션은 왜 할까요? 다양한 이유가 있지만, ① 오픈 소스 활동 자체는 공개된 기록으로 남기 때문에 구직 활동을 할 때 이력서에 활동 이력을 담을 수 있습니다. 그리고 ② 내가 작업한 새로운 기능을 다른 개발자들도 사용해보고, 이를 평가하여 개선시킬 수 있습니다.


  커미터(Committer)는 실제로 누군가 컨트리뷰션을 하면, 해당 내용을 리뷰하고 실제 프로젝트에 반영할지를 결정하는 사람입니다. 다시 말해 특정한 프로젝트를 오픈 소스로 만들어서 관리하는 사람들을 의미합니다.


  그렇다면 왜 프로젝트를 오픈 소스로 공개하여 누구나 볼 수 있도록 하는 걸까요?


  ① 사회 공헌

  ② 소프트웨어의 품질 향상

  ③ 어쩔 수 없이


  맞습니다. 어쩔 수 없이 오픈 소스로 공개하는 경우도 있습니다. 이는 오픈소스 라이센스 때문인 경우가 많은데요. 오픈 소스 라이센스는 대체 무엇일까요? 실제로 오픈 소스를 활용하여 개발할 때는 저작권 및 라이센스를 명시해야 합니다.


※ 오픈소스 라이센스 ※


  대표적인 오픈소스 라이센스 몇 가지만 알아봅시다.


 ▶ MIT License: 무료, 배포 가능, 소스코드 수정 가능, 2차 저작물 공개 의무 없음

 ▶ Apache License: 무료, 배포 가능, 소스코드 수정 가능, 2차 저작물 공개 의무 없음

 ▶ GPL: 무료, 배포 가능, 소스코드 수정 가능, 2차 저작물 공개 의무 있음

 ▶ Beerware: 만나면 그냥 술이나 사주자

728x90
반응형

728x90
반응형
npm install -g ngrok


  위 명령어를 이용해서 Ngrok을 바로 다운로드 할 수 있습니다.


ngrok http 5000




  이후에 위와 같이 5000번 포트를 외부에서 접속 가능한 URL로 연결할 수 있습니다.



  이제 외부에서 접속할 수 있게 되었습니다.






728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request from bs4 import BeautifulSoup import matplotlib.pyplot as plt def main(): url = "http://news.jtbc.joins.com/section/index.aspx?scode=70" sourcecode = urllib.request.urlopen(url).read() soup = BeautifulSoup(sourcecode, "html.parser") times = [] for i in range(0, 20): times.append(soup.find_all("span", class_="date")[i].get_text().strip()) edited = [] for i in range(0, len(times)): edited.append(times[i][8:10]) count1 = 0 count2 = 0 count3 = 0 count4 = 0 for i in range(0, len(edited)): if edited[i] == "05": # 05일 기사 개수 구하기 count1 = count1 + 1 elif edited[i] == "06": # 06일 기사 개수 구하기 count2 = count2 + 1 elif edited[i] == "07": # 07일 기사 개수 구하기 count3 = count3 + 1 elif edited[i] == "08": # 08일 기사 개수 구하기 count4 = count4 + 1 days = [count1, count2, count3, count4] activities = ['05', '06', '07', '08'] colors = ['red', 'blue', 'green', 'yellow'] plt.pie(days, labels=activities, colors=colors, startangle=90, autopct='%.2f%%') plt.show() if __name__ == "__main__": main()


728x90
반응형

728x90
반응형

※ 정규식의 활용 ※


  정규식을 사용하는 기본적인 방법은 다음과 같습니다.


import re

data = "제 번호는 010-1234-5678입니다. 전화 주세요. 017-1234-4567으로 전화해도 돼요. 그쪽 번호는 010-9999-1111 맞나요?"

compile_text = re.compile(r'010-\d\d\d\d-\d\d\d\d')
match_text = compile_text.findall(data)
print(match_text)

student_email = ["gildong@gmail.com", "hello@hello", "myname@name.com", "abcd@.com", "abcd@abc.co.kr"]

compile_text = re.compile('^[a-zA-Z0-9+_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
for i in student_email:
    print(i, ": ", compile_text.match(i) != None)


  또한 파싱 이후에 나온 내용 중에서 '숫자' 데이터만 리스트에 담고 싶다면 다음과 같이 할 수 있습니다.


import urllib.request
from bs4 import BeautifulSoup
import re


def main():
    url = "http://ndb796.tistory.com/109"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")
    texts = soup.find("div", class_="tt_article_useless_p_margin").find_all("p")

    result = []

    for i in texts:
        compile_text = re.compile("\d+")
        list = compile_text.findall(i.get_text())
        if len(list) > 0:
            result.extend(list)

    print(result)


if __name__ == "__main__":
    main()


※ 엑셀 활용 ※


  파이썬(Python)은 openpyxl 라이브러리를 활용해서 크롤링한 데이터를 엑셀 형태로 내보낼 수 있습니다.


import urllib.request
from bs4 import BeautifulSoup
from openpyxl import Workbook


def main():
    url = "http://www.newsis.com/realnews/"
    sourcecode = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(sourcecode, "html.parser")

    articles = []

    for i in soup.find_all("strong", class_="title"):
        articles.append(i.get_text())

    wb = Workbook()
    sheet1 = wb.active
    file_name = 'output.xlsx'

    for i in range(0, len(articles)):
        sheet1.cell(row=i + 1, column=1).value = i + 1
        sheet1.cell(row=i + 1, column=2).value = articles[i]

    wb.save(filename=file_name)

if __name__ == "__main__":
    main()


728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup


def main():
    url = "https://news.nate.com/recent?mid=n0100"
    sourcecode = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(sourcecode, "html.parser")

    divs = soup.find_all("div", class_="mduSubjectList")
    for div in divs :
        link = div.find("a")["href"]
        print("http:" + link)


if __name__ == "__main__":
    main()



728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup


def main():

    sourcecode = urllib.request.urlopen("https://news.sbs.co.kr/news/newsflash.do?plink=GNB&cooper=SBSNEWS").read()
    soup = BeautifulSoup(sourcecode, "html.parser")

    list_href = []
    list_content = []

    for href in soup.find_all("div", class_="mfn_inner"):
        list_href.append("https://news.sbs.co.kr" + href.find("a")["href"])

    for i in range(0, len(list_href)):
        url = list_href[i]
        sourcecode = urllib.request.urlopen(url).read()
        soup = BeautifulSoup(sourcecode, "html.parser")
        list_content.append(soup.find("div", class_="text_area").get_text())

    print(list_href)
    print(list_content)


if __name__ == "__main__":
    main()






728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup


def main():

    for i in range(0, 10):

        url = "http://sports.donga.com/Enter?p=" + str((i * 20) + 1) + "&c=02"
        soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")

        spans = soup.find_all("span", class_="tit")
        for j in range(0, 20):
            print((i * 20) + j + 1, "번째 글:", spans[j + 3].get_text())

if __name__ == "__main__":
    main()


  또한 혹은 특정한 뉴스 기사 목록 페이지에서, 각 뉴스 기사 상세 페이지의 링크를 얻고 싶다면 다음과 같이 할 수 있습니다.


import urllib.request
from bs4 import BeautifulSoup


def main():

    url = "http://sports.donga.com/Enter?p=1&c=02"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")

    spans = soup.find_all("span", class_="tit")
    for i in range(0, 20):
        print(spans[i + 3].find("a")["href"])

if __name__ == "__main__":
    main()


728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup


def main():

    url = "https://pann.nate.com/talk/344403021"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")

    comments = []

    for i in soup.find_all("dd", class_="usertxt"):
        comments.append(i.get_text().strip("\n\t "))

    print(comments)


if __name__ == "__main__":
    main()


728x90
반응형