05 Jun 2017
|
Python
Python Calendar
파이썬 오브젝트 소스 코드 보기
-
inspect
모듈 임포트
import inspect
-
살펴볼 오브젝트 임포트
from calendar import HTMLCalendar
-
소스코드를 보기좋은 형태로 출력
print(inspect.getsource(HTMLCalendar))
스탠다드 라이브러리 메소드 오버라이딩
HTMLCalendar는 베이스 클래스인 Calendar를 상속받아 HTML 달력을 만들어주는 역할을 하는 클래스이다.
0(월요일:디폴트)에서 6(일요일)까지 달력의 시작을 정의하는 하나의 firstweekday인자를 전달받는다.
print(calendar.HTMLCalendar(6).formatmonth(2017,6))
과 같이 입력하면 아래의 달력이 출력된다.
June 2017 |
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
| | | | 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 | |
오브젝트 소스코드를 살펴보고 HTML Calendar의 첫번째 row에 좌/우 이동 화살표(<,>)를 출력해보자.
파이썬 라이브러리 코드
def formatmonthname(self, theyear, themonth, withyear=True):
"""
Return a month name as a table row.
"""
if withyear:
s = '%s %s' % (month_name[themonth], theyear)
else:
s = '%s' % month_name[themonth]
return '<tr><th colspan="7" class="month">%s</th></tr>' % s
주석을 보면 달 이름을 테이블 행 형태로 돌려주는 메소드이고, 리턴값은 HTML의 형태인 것을 알 수 있다.
해당 메소드를 바로 오버라이딩 하면 month_name[themonth]
구문에서 오류가 뜨는데,
month_name은 calendar 모듈의 Data 속성이므로 from calendar import month_name
를 해야한다.
오버라이딩한 메소드
from calendar import HTMLCalendar, month_name
class ArrowCalendar(HTMLCalendar):
def __init__(self, firstweekday):
HTMLCalendar.__init__(self, firstweekday)
def formatmonthname(self, year, month, withyear=True):
if withyear:
s = '%s %s' % (month_name[month], year)
else:
s = '%s' % month_name[month]
return '<tr><th colspan="1" class="month_arrow"> < </th>' \
'<th colspan="5" class="month">%s</th>' \
'<th colspan="1" class="month_arrow"> > </th></tr>' % s
7칸짜리 테이블로 달 이름을 넘겨주는 것을 5칸으로 줄이고 양쪽에 한칸씩 좌/우 화살표를 넣었다.
이후 css 클래스를 적용해서 화살표를 정렬하면 완성
.month_arrow {
text-align: center;
}
완성된 달력
< | June 2017 | > |
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
| | | | 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 | |
04 Jun 2017
|
Machine Learning
AI
Tensorflow
설치
- 파이썬3 가상환경 생성
$ virtualenv --system-site-packages -p python3 타겟폴더 이름 # Python3 기준
- 가상환경 실행
$ source ~/tensorflow/bin/activate
- 텐서플로 설치
$ pip3 install --upgrade tensorflow
# CPU 버전, GPU 버전은 tensorflow-gpu로 설치
- 데모파일 작성 (
demo.py
)
import tensorflow as tf
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0) # also tf.float32 implicitly
print(node1, node2)
실행 결과
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
위와 같이 출력되면 환경설정은 완료
공식 설치문서
주요개념
Tensor
3 # a rank 0 tensor; this is a scalar with shape []
[1. ,2., 3.] # a rank 1 tensor; this is a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]
Tensorflow의 기본 자료구조.
동적인 크기를 갖는 원시값의 다차원 데이터 배열이며 Tensor의 rank는 차원을 의미한다.
Computational Graph
노드 그래프로 배열된 일련의 텐서플로우 오퍼레이션 모음.
Tensorflow의 코어는 Computational Graph를 생성하고, 실행하는 각각의 부분으로 나뉜다.
그리하여 데모파일의 실행 결과가 각각의 노드값이 아닌 두개의 텐서가 출력된 것.
Computational Graph 실행
- Session을 생성하고
- Session.run()을 실행
sess = tf.Session()
print(sess.run([node1, node2]))
실행결과
2017-06-04 22:24:47.634630: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
[3.0, 4.0]
워닝이 뜨기는 했지만 결과값은 제대로 출력되었다.
구글링해보니 로컬에서 소스코드를 빌드하지 않았을 경우 뜨는 오류라 한다.
해결방법 : 링크
기타 더 읽어볼거리
텐서플로우 문서 한글 번역본
텐서플로우 시작하기
텐서보드 사용법
최종목표
텐서플로우를 이용한 Android app 작성
03 Jun 2017
|
Github
Blog
Jekyll
Tag
지난 포스팅
Jekyll 커스텀 플러그인 개발 및 적용, Github 페이지에 적용하기
발단
다시 하루가 지나고 Github page에 접속하자, 어제 만든 플러그인이 동작하지 않았다.
total_blogging_date
태그가 동작하지 않아 하루가 지났음에도 총 일수가 더해지지 않은 것.
한참 루비코드만 들여다보다 생각해보니, Jekyll 자체가 정적인 페이지를 생성하는데 페이지를 빌드하지 않았는데도 갱신되는게 말이 안되는 상황.
계속해서 소스를 수정하면서 빌드하다보니, 제대로 동작하는 것으로 오해하게 된 것이었다.
해결 방안
총 블로깅 일수를 태그로 받았을때, 현재 날짜와 총 날짜를 계산할 때 사용된 마지막 날짜의 비교가 불가능하다.
태그에서 받은 총 블로깅 날짜만을 가지고 빌드하지 않은채로 며칠이 지났는지 알 방법이 없고,
혹여 있다해도 그냥 템플릿에서 가장 오래된 포스팅 날짜와 현재 날짜의 차이를 비교하는 것이 편하다.
// Calculate total_blogging_date_dynamically
$(document).ready(function() {
var date_str = "{{ site.posts.last.date }}"; // 2017-05-31 00:00:00 +0900
var total_date = Math.floor((Date.now() - Date.parse(date_str.split(' ')[0])) / 86400000)+1; // calc datediff
$("#dynamic_day").text(total_date);
});
결국 위와 같이 템플릿에서 받아온 날짜를 가지고, 매크로 형태로 JQuery에 적용시킴으로 해결.
며칠 후 갑자기 날짜가 맞지않아 생각해보니, 그냥 내림을 해서 계산하면 안된다…
결국 시간단위를 제외한 Date값을 연산하는 아래와 같은 방법으로 로직 수정하여 해결.
$(document).ready(function() {
var date_str = "2017-05-31 00:00:00 +0900"; // 2017-05-31 00:00:00 +0900
var today = new Date()
today.setHours(0,0,0,0)
var firstday = new Date(date_str.split(' ')[0])
firstday.setHours(0,0,0,0)
var total_date = ((today-firstday) / 86400000)+1; // calc datediff
$("#dynamic_day").text(total_date);
});
마찬가지로 며칠째 포스팅을 이어가고 있는지도 마지막 빌드 이후 며칠이 지났는지 알수 없기에,
$(document).ready(function(){
var latest_post_date_str = "{{ site.posts.first.date }}";
var day_passed = Math.floor((Date.now() - Date.parse(latest_post_date_str.split(' ')[0])) / 86400000);
// if latest posting date passed a day then reset to 0
if (day_passed > 1) {
$("#current_date_streak").text("0");
}
});
위와 같이 템플릿에서 받아온 값을 마지막 포스팅의 날짜와 현재 날짜가 하루이상 지났을때,
current_date_streak
태그 값을 0으로 덮어씌우도록 수정했다.
추가 문제점
sitemap이 정적페이지로 빌드하다보니, site.url
값이 로컬이 반영된 값인 localhost가 들어가 버린다…
결국 사이트맵 내의 site.url
값을 github pages 주소로 하드코딩.
마무리
Github Plugin 코드 및 README를 업데이트 했다. 링크
01 Jun 2017
|
Tag
Mac
Mac Finder에서 Tag를 이용해 파일 분류하기
Jekyll을 이용해 포스팅을 하려니 포스팅 폴더 접근이 귀찮았다.
보통 이런 경우 Finder의 즐겨찾기에 작업 폴더를 추가하여 사용하는데, _posts
폴더의 언더바가 마음에 거슬려 태그를 이용해 정리하기로 했다.
Tag 이용방법
- Finder를 연다.
⌘
(커맨드)+,
(콤마)를 눌러 Finder 환경 설정으로 들어간다.
태그
탭에서 Tag 이름 및 색상을 수정한다
- 위쪽 목록 영역은 사이드바, 아래쪽 즐겨찾기 태그 부분은 Finder에서 파일을 우클릭 했을때 나타나는 즐겨찾기 메뉴
- Tag를 이용하여 분류한 파일
Mac 키보드의 특수문자(⌘⎋⌥⌃등) 입력하기
포스팅을 하다보니 맥 키보드에 존재하는 특수문자를 입력해야 하는 경우가 생긴다.
한번 설정하면 계속 남아있긴 하지만 설정법 등은 매번 잊어버리고 인터넷에서 다시 찾게되는 경향이 있어 정리했다.
특수문자 추가 방법
⌘
(커맨드)+⌃
(컨트롤)+⌴
(스페이스)를 눌러 특수문자 입력창을 띄운다.
- 왼쪽 위의
목록 사용자화
를 선택한다.
- 목록에서
기술 기호
를 선택하면 특수문자 입력창에 추가된다.