무작정 github에 파일을 올려보기.

|

제목: 무작정 github에 파일을 올려보기.

새 레포지토리를 생성

AFDD42E9-B207-49D0-9914-15B12E396269

다음

D997327A-1C1A-42CF-AA94-8CE29E1D351E

Create repository를 해주고나면 준비가 되었다는 페이지로 이동됩니다.

9898E56C-C00F-4B94-B78D-B2555C144097

그다음 다음 명령오로 git 에 푸시합니다.

eddiek@ek.local:/Users/eddiek/Documents  $ mkdir helloGithub
eddiek@ek.local:/Users/eddiek/Documents  $ cd helloGithub
eddiek@ek.local:/Users/eddiek/Documents/helloGithub  $ touch hello.swift

hello.swift라는 파일을 github 에 올리기전에 에디터로 열고 아무 내용이나 적어줍니다.

eddiek@ek.local:/Users/eddiek/Documents/helloGithub  $ git init
Initialized empty Git repository in /Users/eddiek/Documents/helloGithub/.git/
eddiek@ek.local:/Users/eddiek/Documents/helloGithub  git:(master*) $ git add .
eddiek@ek.local:/Users/eddiek/Documents/helloGithub  git:(master*) $ git commit -m "first commit hahaha"
[master (root-commit) a31eb7b] first commit hahaha
 1 file changed, 2 insertions(+)
 create mode 100644 hello.swift

로컬 저장소(현재 맥)와 서버 리모트(깃헙)를 git remote add origin라는 명령어를 사용하여 연결해줍니다.

eddiek@ek.local:/Users/eddiek/Documents/helloGithub  git:(master) $ git remote add origin https://github.com/eddiekwon/upload101.git

이제 git push -u origin master명령어로 push합니다.

eddiek@ek.local:/Users/eddiek/Documents/helloGithub  git:(master) $ git push -u origin master
Username for 'https://github.com': eddiekwon
Password for 'https://eddiekwon@github.com':
Counting objects: 3, done.
Writing objects: 100% (3/3), 244 bytes | 244.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/eddiekwon/upload101/pull/new/master
remote:
To https://github.com/eddiekwon/upload101.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
eddiek@ek.local:/Users/eddiek/Documents/helloGithub  git:(master) $

이제 github으로 가서 웹페이지를 새로고침해보면 hello.swift가 올라온 것이 보입니다.

1769BF94-03FE-479F-AAF4-26304C719186

이상입니다.

Swift GCD 설명 링크들

|

Adding an API-Backed UIPageViewController in Swift

상담히 깔끔한 사이트하게 정의된 GCD 설명 사이트

GIFTBOT님(sync vs async)

[wade님-GCD 사용하기 - 그림설명 좋음 ] (https://brunch.co.kr/@tilltue/29)

http://blog.naver.com/PostView.nhn?blogId=jdub7138&logNo=220949191761&parentCategoryNo=&categoryNo=112&viewDate=&isShowPopularPosts=true&from=search

[번역]스위프트에서 동시성에대한 모든것-Part1 : 현재편: http://blog.canapio.com/128

어떤외국사이트

Threads, Queues, and More: Async Programming in iOS

https://robots.thoughtbot.com/a-simple-approach-to-thread-safe-networking-in-ios-apps

simultaneous-asynchronous-calls-in-swift](https://medium.com/@oleary.audio/simultaneous-asynchronous-calls-in-swift-9c1f5fd3ea32)

DispatchGroup with Swift

http://rolling-rabbits.com/2016/07/21/grand-central-dispatch-in-swift-3/

https://www.raywenderlich.com/5371-grand-central-dispatch-tutorial-for-swift-4-part-2-2

Alamo와 비동기 Dispatch Queue 사용하기

[Swift] 비동기 요청 끝날 때까지 기다리기(wait until get response from server) http://penguingoon.tistory.com/82

https://devminjun.github.io/blog/2-GCD

귀여운 강좌 https://zeddios.tistory.com/516 https://zeddios.tistory.com/520 ==> utilty vs userinitiated

그룹 사용법 두가지(DispatchQueue 를 이용한 다른 그룹 사용법) http://seorenn.blogspot.com/2015/08/swift-dispatch-group.html

Global Queue 기본값은 default

Global Queue의 기본 값은 default이다. 즉 아래 두 코드는 동일하다.

DispatchQueue.global()  
DispatchQueue.global(qos: .default)

QoS

상세한 설명 레퍼런스 문서의 링크는 다음과 같다. 애플 공식 PrioritizeWorkWithQoS 링크

Queue의 기존 이름과 새로 변경된 swifty한 이름은 다음과 같다.

DISPATCH_QUEUE_PRIORITY_HIGH    >> .userInitiated
DISPATCH_QUEUE_PRIORITY_DEFAULT >> .default
DISPATCH_QUEUE_PRIORITY_LOW     >> .utility
DISPATCH_QUEUE_PRIORITY_BACKGROUND >> .background

Global Queue 와 main Queue 의 차이점에 대한 글](https://stackoverflow.com/questions/39161455/grand-central-dispatch-qos-user-interactive-vs-get-main-queue/39162201)

dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0) returns a global concurrent queue which is suitable for task that need to be done "quickly" in order to update the user interface. Tasks on this queue have a higher priority than e.g. tasks on a  QOS_CLASS_BACKGROUND queue. But this is not the main queue.

The UI update itself must be done on the main queue which you get with dispatch_get_main_queue().

아래 질문과 답의 원문 주소는 https://medium.com/the-traveled-ios-developers-guide/quality-of-service-849cd6dee1e 와 같다.

So Many Questions

To enhance your QoS journey, I’ve found it helpful to ask a series of questions. Though not all the possible grounds are exhausted, they generally cover most practices. Those questions look something like this:

  • Am I doing work that actively involves updating the UI thread, such as scrolling or loading a photo? User Interactive.
  • Am I doing work that requires user interaction? Can no meaningful progress be made until it’s completed? User initiated.
  • Am I doing work that the user isn’t aware of, like downloading some background content? Utility.
  • Am I not doing any of those? Am I cleaning up a database or doing some maintenance? Background.

추적할 게시글. 나중에 다시 봐야함.

In what sense do URLSession delegate messages “respect your QoS”? (https://stackoverflow.com/questions/51848472/in-what-sense-do-urlsession-delegate-messages-respect-your-qos)

DispatchQueue(label:xxx,qos:.yyy) vs DispatchQueue.global()

출처: https://stackoverflow.com/questions/43621952/global-vs-user-queue

let queue = DispatchQueue(label: "unique_label", qos: .userInteractive)

creates the .serial queue with high priority

let queue = DispatchQueue.global()

doesn’t actually create nothing but returns global (system) .concurrent queue with qos .default.

어떤이가 시험한 QoS에 따른 속도차이

The 5 queues (4 background, 1 main) all have different thread priorities (-[NSThread threadPriority\]) too:

                            -main- : 0.758065
      DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258
   DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000
       DISPATCH_QUEUE_PRIORITY_LOW : 0.467742
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000

(tested on an iPod 4th gen and the simulator on a MacBook Pro)

출처: https://stackoverflow.com/questions/9602042/whats-the-difference-between-the-global-queue-and-the-main-queue-in-gcd

Anaconda 설치후 가상환경설정 + Selenium실행

|

아나콘다에서 셀레니움 사용하기

1. 아나콘다 가상환경에서 쥬피터 노트북 사용하기 설정

아나콘다(Anaconda) 가상 환경에서 쥬피터 노트북(Jupyter Notebook)을 띄운 후 셀레니움(selenium)을 실행해 볼 수 있다! 그런데 현재 내 가상 환경의 파이썬 버전이 2.7인데, 쥬피터 노트북에 파이썬 3버전만 표시되는 문제점이 있길래 이 문제점을 미리 해결하는 과정을 기술해보았다. 개인 취향이지만 쥬피터 노트북 사용을 원치 않는 다면 아래 과정은 불 필요하다.

가상환경 설정

가상환경을 만든 후 이를 활성화 한 뒤, 쥬피터 노트북를 실행하는 명령어는 다음과 같다.

/Users/eddiek  $ conda create --name py27 python=2.7  
/Users/eddiek  $ source activate py27  
/Users/eddiek  $ jupyter notebook

위 처럼 하면 모든 것이 잘 되지만 쥬피터 노트북 실행후 파이썬 3는 보이는데, 정작 지금 사용하고 싶은 2.7버전이 안 보이는 문제가 있다.

jupyterErr0

해결법

ipykernel를 설치후에 아래와 같이 세팅후 jupyter notebook를 해 준다.

(py27) /Users/eddiek/selenium101  $ conda install ipykernel

(py27) /Users/eddiek/selenium101  $ python -m ipykernel install --user --name py27 --display-name "Python (py27)"
Installed kernelspec py27 in /Users/eddiek/Library/Jupyter/kernels/py27

(py27) /Users/eddiek/selenium101  $ jupyter notebook

이제 다시 쥬피터 노트북을 실행하면 두 개의 버전이 보일 것이다. jupyterErr

모든 것이 정상인지는 다음처럼 파이썬 2에서만 작동하는 print를 코딩해 확인할 수 있다. jupyterErrFixed2

2. selenium 사용하기

설치

간단히 아래와 같은 순서로 설치한다.

  1. chromeDriver 설치하기( 구글링해서 간단히 설치하면 됨)
  2. chromeDriver를 다운로드 후에 selenium101 폴더에 복사한다.
  3. 셀레니움 설치하기

콘다환경에서 셀레니움 설치하는 법은 다음과 같다.

$ conda install selenium

실행

이제 $ ipython 명령어ipython을 실행하거나 또는 $ juyiter notebook을 타이핑해 쥬피터노트북을 실행한다.

In [1]: from selenium import webdriver

그 다음 아래처럼 하면 크롬 창이 뜰 것이다.

In [3]: driver = webdriver.Chrome('/Users/eddiek/selenium101/chromedriver')

img

창을 닫지 말고 이어서 아래 명령어를 타이핑한다

In [6]: driver = webdriver.Chrome('/Users/eddiek/selenium101/chromedriver')
In [7]: driver.get('http://www.google.com')

크롬에서 원하는 페이지로 이동할 것이다 img2

이것 저것 만져보자

In [10]: driver.title
Out[10]: u'Google'

In [11]: driver.page_source

toscrape 페이지에서 작업을 해보자.

In [13]: driver.get('http://books.toscrape.com')

In [14]: from scrapy.selector import Selector

In [15]: sel = Selector(text=driver.page_source)

In [16]: sel
Out[16]: <Selector xpath=None data=u'<html xmlns="http://www.w3.org/1999/xhtm'>

In [17]: sel.xpath('//h1')
Out[17]: [<Selector xpath='//h1' data=u'<h1>All products</h1>'>]

In [18]: sel.xpath('//h3/a')
Out[18]:
[<Selector xpath='//h3/a' data=u'<a href="catalogue/a-light-in-the-attic_'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/tipping-the-velvet_99'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/soumission_998/index.'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/sharp-objects_997/ind'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/sapiens-a-brief-histo'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/the-requiem-red_995/i'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/the-dirty-little-secr'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/the-coming-woman-a-no'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/the-boys-in-the-boat-'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/the-black-maria_991/i'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/starving-hearts-trian'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/shakespeares-sonnets_'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/set-me-free_988/index'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/scott-pilgrims-precio'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/rip-it-up-and-start-a'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/our-band-could-be-you'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/olio_984/index.html" '>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/mesaerion-the-best-sc'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/libertarianism-for-be'>,
 <Selector xpath='//h3/a' data=u'<a href="catalogue/its-only-the-himalaya'>]

In [19]: sel.xpath('//h3/a/@href').extract()
Out[19]:
[u'catalogue/a-light-in-the-attic_1000/index.html',
 u'catalogue/tipping-the-velvet_999/index.html',
 u'catalogue/soumission_998/index.html',
 u'catalogue/sharp-objects_997/index.html',
 u'catalogue/sapiens-a-brief-history-of-humankind_996/index.html',
 u'catalogue/the-requiem-red_995/index.html',
 u'catalogue/the-dirty-little-secrets-of-getting-your-dream-job_994/index.html',
 u'catalogue/the-coming-woman-a-novel-based-on-the-life-of-the-infamous-feminist-victoria-woodhull_993/index.html',
 u'catalogue/the-boys-in-the-boat-nine-americans-and-their-epic-quest-for-gold-at-the-1936-berlin-olympics_992/index.html',
 u'catalogue/the-black-maria_991/index.html',
 u'catalogue/starving-hearts-triangular-trade-trilogy-1_990/index.html',
 u'catalogue/shakespeares-sonnets_989/index.html',
 u'catalogue/set-me-free_988/index.html',
 u'catalogue/scott-pilgrims-precious-little-life-scott-pilgrim-1_987/index.html',
 u'catalogue/rip-it-up-and-start-again_986/index.html',
 u'catalogue/our-band-could-be-your-life-scenes-from-the-american-indie-underground-1981-1991_985/index.html',
 u'catalogue/olio_984/index.html',
 u'catalogue/mesaerion-the-best-science-fiction-stories-1800-1849_983/index.html',
 u'catalogue/libertarianism-for-beginners_982/index.html',
 u'catalogue/its-only-the-himalayas_981/index.html']


아래는 참고 사이트와 발췌했던 코드이다.

참고사이트: https://stackoverflow.com/questions/30492623/using-both-python-2-x-and-python-3-x-in-ipython-notebook

참고2: https://ipython.readthedocs.io/en/stable/install/kernel_install.html#kernel-install 가장 도움이 된 사이트: https://stackoverflow.com/questions/37085665/in-which-conda-environment-is-jupyter-executing

## whitch environment is jupyter executing:

import sys
print(sys.executable)
## create kernel for jupyter notebook

source activate myenv
python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
source activate other-env
python -m ipykernel install --user --name other-env --display-name "Python (other-env)"
http://ipython.readthedocs.io/en/stable/install/kernel_install.html#kernel-install

Swift 코드 컨벤션

|

Swift 코드 컨벤션

Dictionary변수 선언의 두가지 방법

  1. 변수로 선언하는 방식 간단히 Dictionary형태로 변수를 선언하여 값을 하나하나 차곡차곡 넣는 방식이다.
    var params :[String:String] = [:]
    params["grant_type"] = "wowo"
    params["username"] = userName
    params["password"] = password
    
  2. 상수로 선언 상수로 한번에 선언하는 것인데, 변수보다 더 안전하다고 볼 수 있겠다(종종 버그의 원흉이 되는 변수 선언 var를 사용하지 않기 때문).
    let params = [
     "grant_type" : "wowo",
     "username": userName,
     "password": password
    ]
    

selenium, Scrapy links

|

각종 셀레니움 강좌나 링크

네이버 로그인등: https://beomi.github.io/2017/02/27/HowToMakeWebCrawler-With-Selenium/

위 사이트의 code snippet중 하나는 다음과 같다.

from selenium import webdriver
from bs4 import BeautifulSoup

# setup Driver|Chrome : 크롬드라이버를 사용하는 driver 생성
driver = webdriver.Chrome('/Users/beomi/Downloads/chromedriver')
driver.implicitly_wait(3) # 암묵적으로 웹 자원을 (최대) 3초 기다리기
# Login
driver.get('https://nid.naver.com/nidlogin.login') # 네이버 로그인 URL로 이동하기
driver.find_element_by_name('id').send_keys('naver_id') # 값 입력
driver.find_element_by_name('pw').send_keys('mypassword1234')
driver.find_element_by_xpath(
    '//*[@id="frmNIDLogin"]/fieldset/input'
    ).click() # 버튼클릭하기
driver.get('https://order.pay.naver.com/home') # Naver 페이 들어가기
html = driver.page_source # 페이지의 elements모두 가져오기
soup = BeautifulSoup(html, 'html.parser') # BeautifulSoup사용하기
notices = soup.select('div.p_inr > div.p_info > a > span')

for n in notices:
    print(n.text.strip())

구글 결과를 가져오는 사이트

https://medium.com/@peteryun/python-selenium을-활용한-크롤러-만들기-b055cefd1195 아래 wiki를 크롤링함

네이버 로그인 참고 사이트 http://yumere.tistory.com/75

이미지

소방방재청 자료 가져오기?

https://medium.com/@nsh235482/python-selenium으로-웹사이트-크롤링하기-2-웹-사이트-제어해보기-1ffc5e05179d

이미지22

유튜브 줄줄이 크롤링

http://code-ing.tistory.com/6

셀레니움 기본

https://medium.com/shakuro/adopting-ipython-jupyter-for-selenium-testing-d02309dd00b8 이미지23

네이버 뉴스 수집을 위한 도구 https://forkonlp.github.io/N2H4/

네이버 api 사용 https://ericnjennifer.github.io/python_crawling/2018/01/21/PythonCrawling_Chapt9.html

Scrapy URLs

scrapy data 저장 으로 검색하면 수 많은 강좌가 뜬다.

크롤링 후 firebase에 저장하기

https://medium.com/@wayfinders/scrapy를-활용한-crawler를-만든-후-firebase-database에-저장하기-a73f4e4ab70d

웹사이트 크롤링해서 파일 저장 하기(분양정보수집사례)

[U’s Lifelog]http://uslifelog.tistory.com/45

아래도 최신 정보가 많다

https://l0o02.github.io/2018/06/19/python-scrapy-1/

Scrapy를 이용한 뉴스 크롤링 하기

http://excelsior-cjh.tistory.com/86

newScrapping

스크래핑개념 & 셀레니움

http://nittaku.tistory.com/133?category=727207

http://nittaku.tistory.com/136 XPATH에 대한 여러가지 예제도 있다. pipeline설명도 있다. 좋은 그림

기타

pycharm 세팅법들

http://nittaku.tistory.com/category/빅데이터%20관련%20프로그래밍/웹%20크롤링%20-%20기초