github page는 무엇인가?

https://pages.github.com/ 는 깃허브에서 다이렉트로 호스팅해주는 서비스이다. 무료이다. 단 깃허브 계정 하나에 한 페이지만 만들 수 있다. 개발자들은 주로 포트폴리오나 cv, 또는 개인 블로그로 사용하고있다. 내 블로그인 sanghun.xyz도 깃허브 리포지터리를 이용한 페이지이다. 도메인은 aws에서 구매해 연결했다.

참조

나는 codecademy의 deploy-a-website를 따라해서 만들었다. 쉽고 친절한 수업이라 따라만 해도 쉽게 웹사이트를 배포할 수 있다. 물론 배포까지만! 그 다음은 개인의 웹개발 역량에 달려있다. 나는 괜찮아보이는 공개 theme를 가져다 썼다. 아래의 방법은 codecademy의 수업을 요약한 것이다.

How to

repository 생성

  • repository를 생성할땐 naming convention을 따라야 한다.
  • username.github.io 형태로 만들어야 한다. 아니면 github에서 안해줌. 아마 한 계정당 하나의 페이지만 호스팅해주기 위해서 이런 정책을 만든게 아닌가 싶다.

지킬 설치

Jekyll is a simple, blog-aware, static site generator for personal, project, or organization sites. static한 사이트를 만들기에 좋은 도구인것 같다. 사실 지킬 이전에도 이것저것 사용해봤으나 지킬이 제일 마음에 든다. 네이버 블로그나 티스토리는 뭔가 부족하고 워드프레스는 기능은 많은것 같은데 너무 무거운것 같았다. 무엇보다 github에서 jekyll을 권장하고 있다. 왜 그럴까 했더니 jekyll의 개발자가 github의 코파운더였던것!

mac OS 기준

#brew 설치
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

#ruby 설치
brew install ruby

#jekyll 설치
gem install jekyll
gem install jekyll bundler

#jekyll 설치 확인
jekyll -v

웹사이트 생성

# 새로운 웹사이트 생성
jekyll new personal-website

# 생성한 폴더로 이동
cd personal-website

# 실행
jekyll serve

# localhost:4000에서 실행되는걸 확인할 수 있다.

jekyll폴더와 repository 연결

# jekyll 폴더에서
git init
git remote add origin https://github.com/username/username.github.io.git

후기

참 좋은것 같다. 무엇보다도 무료이며 개발할 일이 없는 내 입장에선 블로그를 하면서나마 git을 사용하게된다는게 큰 장점이다. jekyll덕분에 웹개발도 그리고 루비도 공부하고 싶어진다. 일단은 jekyll의 구조를 학습해서 내 입맛대로 사이트를 꾸며보고 싶다.

It’s important to understand Jekyll’s default directory structure and contents of your site:

_config.yml - This is a configuration file that contains many values that need to be edited only once. These values are used across your site, for example, your site's title, your e-mail, and more. Note that this is a .yml file, which you can learn more about here.
_includes/ - This directory contains all the partials (code templates that keep you from repeating your code over and over) that your site uses to load common components, like the header and the footer.
_posts/ - This directory is where blog posts are stored. New blog posts can be added and will be rendered with the site's styling, as long as the file name follows Jekyll's standard naming convention.
_layouts/ - This directory contains templates that are used to style certain types of posts within the site. For example, new blog posts will use the HTML layout defined in post.html.
You can learn more about the Jekyll directory structure here.
macOS Sierra에서 virtualenv에 Opencv3 설치

python3 설치

  • 간단하게 brew로 설치하자
brew install python3

opencv3 설치

  • 3은 아직 베타라고 한다. 안전한 버전을 원하면 opencv2를 설치하자.
  • 나는 그냥 3설치 했다.
brew tap homebrew/science
brew install opencv3 --with-python3 --with-ffmpeg --with-tbb --with-contrib

2016.12.04 임시 설치법

  • 현재 mac OS Sierra에서 Opencv 설치에 문제가 있다.
  • –HEAD를 추가해 아래 방법대로 하면 된다. (16.12.4 기준)
  • https://github.com/Homebrew/homebrew-science/issues/4104#issuecomment-249362870
brew install opencv3 --HEAD --with-python3 --with-ffmpeg --with-tbb --with-contrib

lookup 만들어주기

  • Ln -s {opencv의 site-packages} {사용하는 python환경의 site-packages} 형태로 lookup을 만들어 준다.
  • virtualenv python 환경도 이 방식으로 opencv사용이 가능해진다
Ln -s /usr/local/Cellar/opencv3/HEAD-c48d7f8_4/lib/python3.5/site-packages/cv2.cpython-35m-darwin.so
 /Users/elon/.pyenv/versions/py3/lib/python3.5/site-packages
  • opencv 설치 후 아래와 같은 메세지가 떴는데 일단 작동은 잘 된다.
This formula is keg-only, which means it was not symlinked into /usr/local.

opencv3 and opencv install many of the same files.

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/opencv3/lib
    CPPFLAGS: -I/usr/local/opt/opencv3/include
    PKG_CONFIG_PATH: /usr/local/opt/opencv3/lib/pkgconfig

참조

언플래트닝, 생각의 형태

언플래트닝, 생각의 질서를 읽고

화려한 수식어가 붙는 책이다. 하버드 대학에서 출판한 최초의 만화 형태의 철학 논문, 고정된 시각에 대한 철저한 전복, 만화-철학을 사유하다. 그래서 큰 기대를 하고 읽었으나 기대만큼 내 사고의 확장이 일어나진 않았다. 하긴, 책 한권 읽는다고 사람이 바뀌는건 말이 안되잖아.

크게 두가지 관점에서 흥미로웠다.

  1. 만화라는 형태에 대한 가치 부여
  2. 관점을 확장하라.

만화

사실 만화라는 형태는 우리 사회에서 환영받는 포맷은 아니다. 나만 하더라도 초등학생, 중학생 시절 만화책을 보고 있으면 부모님에게 공부 안하냐는 소리를 들었어야 했고 학교에 만화책을 들고가는것도 잘못처럼 여겨졌었다. 선생님들은 만화책을 압수하기도 했다. 이 책은 그런 만화라는 형태를 재조명하며 가치를 부여하고있다. 의미를 전달하는데 있어 텍스트 만큼이나 효율적인 수단이라 말하고 있으며 텍스트와 만화(시각적 요소)의 결합을 통해 새로운 의미를 생산할 수 있다고 말한다. 단순히 말로 끝나는게 아니라 이 책 자체가 그 사실을 증명하고 있다. 글과 그림으로 이루어진 160쪽 정도 되는 내용은 그 의미를 친절하고 쉽게 전달한다.(그렇지만 철학적인 내용 자체의 딱딱함은 어쩔수 없는것 같다.) 그리고 그림도 하나하나 훑어보면 많은 고심을 하며 그렸다는게 느껴진다.

관점 확장

처음부터 끝까지 관점 확장에 대해 얘기한다. 새로운 관점으로 관찰하라, 다양한 면을 관찰하라 등등 항상 들어오던 말이다. 이 내용 자체는 새로울것이 없다. 사실 나는 어떻게 관점을 확장하는지에 대한 구체적인 내용이 나와있길 기대하며 책을 읽었다. 하지만 그런건 나와있지 않다. 책에서 예시로 든 플랫랜드는 흥미있고 좋았다.

아이러니하게도 이 책을 통해 얻은 가장 긍정적인 점은 주제와 관련이 없고 ‘만화에 대한 확신’이다. 만화는 나쁜게 아니다. 만약 만화를 비하하는 사람이 있다면 이 책을 소개해주고 싶다. 이 책의 주제인 언플래트닝에 대해선 글쎼.. 특별히 새로울것 없는, 항상 있어왔던 얘기인것 같다. 관점을 바꿔라! 다르게 생각하라! 늘 하는 말이잖아?

새롭고 신선한 시도였고 부담없이 읽을수 있는 분량이다.

python에서 postgres DB 연결해서 쿼리 조회하기

  • 2번 방법을 추천한다. 이유는 아래에서.

1. psycopg2

#-*-coding:utf-8
import psycopg2
import pandas as pd

def execute(query):
    pc.execute(query)
    return pc.fetchall()


#아래 정보를 입력
user = ''
password = ''
host_product = ''
dbname = ''
port=''

product_connection_string = "dbname={dbname} user={user} host={host} password={password} port={port}"\
                            .format(dbname=dbname,
                                    user=user,
                                    host=host_product,
                                    password=password,
                                    port=port)    
try:
    product = psycopg2.connect(product_connection_string)
except:
    print("I am unable to connect to the database")

pc = product.cursor()


#쿼리 입력
query = """
select id from users limit 1
"""

#일반적인 쿼리 조회 방법
result = execute(query)

#pandas를 통한 조회 방법
pd.read_sql("select id from users limit 1", product)

psycopg2를 이용한 db연결은 기존에 내가 사용하던 방법이다. 실행하고자 하는 쿼리를 스트링형태로 그대로 넘겨주면 되서 편하다. 다만 쿼리 실행 결과가 python list 형태로 반환되는데 이를 다루기가 까다롭다. 그리고 결과만 나오는것도 아쉽다.

예를 들어 select id from users라고 했으면 column name인 ‘id’에 대한 정보까지 따라왔으면 한다. 이를 pandas를 통해 해결할 수 있다. pd.read_sql("select id from users limit 1", product)를 실행해보면 column name을 포함하면서도 깔끔하게 쿼리결과를 조회할 수 있다.

2. sqlalchemy

import sqlalchemy
import pandas as pd

def connect(user, password, db, host='여기에 입력', port=여기에 입력):
    '''Returns a connection and a metadata object'''
    # We connect with the help of the PostgreSQL URL
    # postgresql://federer:grandestslam@localhost:5432/tennis
    url = 'postgresql://{}:{}@{}:{}/{}'
    url = url.format(user, password, host, port, db)

    # The return value of create_engine() is our connection object
    con = sqlalchemy.create_engine(url, client_encoding='utf8')

    # We then bind the connection to MetaData()
    #meta = sqlalchemy.MetaData(bind=con, reflect=True)

    return engine#, meta

#연결
engine = connect('user 입력', 'password 입력', 'db name 입력')

#쿼리 조회
pd.read_sql("select * from users limit 1", engine)
  • sqlalchemy를 이용해 쿼리를 조회하려면 meta를 이용해 select클래스를 사용해야하던데 복잡하다. 나는 sql구문 그대로 조회하기를 원한다.
  • 그래서 pandas의 read_sql을 이용해 조회하는걸 선호한다.
  • pandas를 통하므로 추후 데이터 핸들링에도 용이함.
  • meta는 사용할 일이 없어 그냥 주석처리했음.

2번 방식을 추천하는 이유는

  • pandas의 read_sql의 경우 psycopg2로 연결하나 sqlalchemy로 연결하나 상관없음.
  • 다만 read_sql_table의 경우 sqlalchemy연결일때만 동작함.
  • 아래 코드에서 db부분을 psycopg2_connection와 sqlalchemy_connection로 바꿔가며 실행해 보자.
psycopg2_connection = psycopg2.connect(product_connection_string)
sqlalchemy_connection = connect('user 입력', 'password 입력', 'db name 입력')

#db = psycopg2_connection
#db = sqlalchemy_connection

pd.read_sql_query("select id from users limit 1", db)
pd.read_sql("select id from users limit 1", db)
pd.read_sql_table("users", db)

참조

  • http://www.rmunn.com/sqlalchemy-tutorial/tutorial.html
  • https://suhas.org/sqlalchemy-tutorial

➜  sanghkaang.github.io git:(master) jekyll serve
WARN: Unresolved specs during Gem::Specification.reset:
      jekyll-watch (~> 1.1)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
/Library/Ruby/Gems/2.0.0/gems/bundler-1.13.6/lib/bundler/runtime.rb:40:in `block in setup': You have already activated addressable 2.5.0, but your Gemfile requires addressable 2.4.0. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
	from /Library/Ruby/Gems/2.0.0/gems/bundler-1.13.6/lib/bundler/runtime.rb:25:in `map'
	from /Library/Ruby/Gems/2.0.0/gems/bundler-1.13.6/lib/bundler/runtime.rb:25:in `setup'
	from /Library/Ruby/Gems/2.0.0/gems/bundler-1.13.6/lib/bundler.rb:99:in `setup'
	from /Library/Ruby/Gems/2.0.0/gems/jekyll-3.3.1/lib/jekyll/plugin_manager.rb:36:in `require_from_bundler'
	from /Library/Ruby/Gems/2.0.0/gems/jekyll-3.3.1/exe/jekyll:9:in `<top (required)>'
	from /usr/local/bin/jekyll:23:in `load'
	from /usr/local/bin/jekyll:23:in `<main>'

이런 에러가 났다. config파일을 바꿔보고 루비와 jekyll을 지웠다 다시 깔아보고 했지만 모두 실패함. 방법은 간단했다.

  1. Gemfile.lock 삭제
  2. bundle install

오오…역시 스택오버플로우 짱. 루비도 한번 제대로 공부해보고 싶다. 항상 오류가 날때마다 검색후 오류를 해결하긴 하지만 왜 오류가 났는지, 왜 오류가 해결되었는지에 대한 배움이 전혀 없다.

  • 참고: http://stackoverflow.com/questions/7060749/deactivate-a-gem-you-have-already-activated-rake-0-9-3-beta-1-but-my-gemfile