알아봅시다, Polymer: Web Components & Web AnimationsChang W. Doh
GDG Korea WebTech : 시작하세요, Polymer, Oct, 11, 2014.
Let's learn about specifications before diving into Polymer:
- Web Components
- Web Animations
This slide includes resources from HTML5Rocks, Polymer and PolyTechnic.
알아봅시다, Polymer: Web Components & Web AnimationsChang W. Doh
GDG Korea WebTech : 시작하세요, Polymer, Oct, 11, 2014.
Let's learn about specifications before diving into Polymer:
- Web Components
- Web Animations
This slide includes resources from HTML5Rocks, Polymer and PolyTechnic.
OpenStack Korea 2015 상반기스터디(devops) 스크립트로 오픈스택 설치하기 20150728jieun kim
※ 본 발표자료는 DevOps팀의 codetree님이 주도적으로 작성하신 shell script를 리뷰하여 작성하였습니다.
[OpenStack Korea Community Study Group, DevOps]
2015년 상반기 두번째 스터디, DevOps Class
"쉘 스크립트를 활용한 오픈스택 Kilo 설치 - 10분만에 끝내기"
D2에서 진행한 스터디 마무리 발표, 2번째 발표에대한 자료입니다.
1. In [ ]:
In [ ]:
# kayak
http://www.kayak.com/flights/SEL-JFK/2015-05-22/2015-05-22
http://www.programmableweb.com/api/kayak
# 개발자 키 다운로드
http://www.kayak.com/labs/api/search
"deprecated"
# minidom 패키지: XML 문서를 객체 트리로 다루는 표준 방법인 DOM인턴페이스의 경량 구현물
>>>import xml.dom.minidom
>>>dom=xml.dom.minidom.parseString('<data><rec>Hello!</rec></data)')
>>>dom
<xml.dom.minidom.Document instance at 0x00980C28>
>>>r=dom.getElementsByTagName('rec') # getElementsByTagName('rec')
>>>r
[<DOM Element: rec at 0xa42350>]
>>>r[0].firstChild # firstChild, "Hello"텍스트를 가진 노드
[DOM Text node "Hello!"]
>>>r[0].firstChild.data # data, 보통 유니코드 문자열
u'Hello!'
# 비행편 검색
# 개발자 키를 사용하여 새로운 카약 세션 얻기
- getkayaksession()
import time
import urllib2
import xml.dom.minidom
kayakkey='YOUR KEY HERE'
def getkayaksession():
# 세션을 시작할 URL을 생성
url='http://www.kayak.com/k/ident/apisession?token=%s&version=1' % kayakkey
# 결과로 나온 XML을 파싱
doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read())
# <sid>xxxxxxxx</sid> 찾기
sid=doc.getElementsByTagName('sid')[0].firstChild.data
return sid
2. In [ ]:
# 비행편을 검색하는 함수
- flightsearch()
def flightsearch(sid,origin,destination,depart_date):
# 검색 Url을 생성
url='http://www.kayak.com/s/apisearch?basicmode=true&oneway=y&origin=%s' % origin
url+='&destination=%s&depart_date=%s' % (destination,depart_date)
url+='&return_date=none&depart_time=a&return_time=a'
url+='&travelers=1&cabin=e&action=doFlights&apimode=1'
url+='&_sid_=%s&version=1' % (sid)
# XML 얻기
doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read())
# 검색 ID 추출, 검색 Url이 길어서 필요한 정보를 추출하여 리턴
searchid=doc.getElementsByTagName('searchid')[0].firstChild.data
return searchid
# 더 이상 결과가 없을 때까지 요청하는 함수
- flightsearchresults()
- parseprice()
# flight url, 결과를 제공하는 카약 함수
3. In [ ]:
In [ ]:
def flightsearchresults(sid,searchid):
# 앞의 $, 콤마를 없애고 숫자를 실수로 반환
def parseprice(p):
return float(p[1:].replace(',',''))
# Polling loop(확인 루프)
while 1:
time.sleep(2)
# 확인용 url 생성
url='http://www.kayak.com/s/basic/flight?'
url+='searchid=%s&c=5&apimode=1&_sid_=%s&version=1' % (searchid,sid)
doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read())
# morepending tag를 찾고 true가 아닐때까지 기다림, 완료되기 전까지는 true를 포함하고 있음
morepending=doc.getElementsByTagName('morepending')[0].firstChild
if morepending==None or morepending.data=='false': break
# 완전한 목록을 다운로드
url='http://www.kayak.com/s/basic/flight?'
url+='searchid=%s&c=999&apimode=1&_sid_=%s&version=1' % (searchid,sid)
doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read())
# 여러 요소들을 리스트로 얻음
prices=doc.getElementsByTagName('price')
departures=doc.getElementsByTagName('depart')
arrivals=doc.getElementsByTagName('arrive')
# price, depart, arrive 태그를 얻어옴
# zip(), 리스트 내의 튜플로 합치기
return zip([p.firstChild.data.split(' ')[1] for p in departures],
[p.firstChild.data.split(' ')[1] for p in arrivals],
[parseprice(p.firstChild.data) for p in prices])
# 실제 비행편검색수행이 잘 동작하는지 확인
impork kayak
sid=kayak.getkayaksession()
sid=getkayaksession()
searchid=kayak.flightsearch(sid,'BOS','LGA','11/17/2006') # 날짜는 원하는 시점으로~
f=kayak.flightsearchresults(sid,searchid)
f[0:3]
# 사람별로 처리하기
- createschedule()
# 사람별로 루프를 돌면서, 출발지와 도착지로 비행편을 검색하기
4. In [ ]:
In [ ]:
In [ ]:
def createschedule(people,dest,dep,ret):
# 검색용 세션 id얻기
sid=getkayaksession()
flights={}
for p in people:
name,origin=p
# 출발 비행편
searchid=flightsearch(sid,origin,dest,dep)
flights[(origin,dest)]=flightsearchresults(sid,searchid)
# 도착 비행편
searchid=flightsearch(sid,dest,origin,ret)
flights[(dest,origin)]=flightsearchresults(sid,searchid)
return flights
# 실제 비행편 데이터를 사용하여 가족비행편 최적화 (책에서는 시간문제로 2명만 적용함)
reload(kayak)
f=kayak.createschedule(optimization.people[0:2],'LGA','11/17/2006','11/19/2006'
optimizationflights=f
domain=[(0,30)]*len(f)
optimization.geneticoptimize(domain,optimization.schedulecost)
770.0
703.0
...
optimization.printschedule(s)
seymour BOS 16:00-17:20 $85.0 19:00-20:28 $65.0
Franny DAL 08:00-17:25 $205.0 18:55-00:15 $133.0