git 저장소의 도메인이 다른 경우 이사하고 싶은 경우가 있다.


기존에 사용하던 기존 환경(브랜치, pull, refs)과 동일하게 하고 싶다면, 


기존 저장소의 url을 사용해 git clone --mirror url 로 로컬로 다운받은 후, 


새로운 저장소에 push하면 된다.





git clone 방식은 3방식으로 우선 확인하면 명확하게 이해를 얻을 수 있다.


git clone url git_general


git clone --bare url git_bare


git clone --mirror url git_mirror






diff를 통해서 확인해보면 명확하게 이해할 수 있다. deep하게 모든 내용을 다운받는 것은 mirror 밖에 없다.



나머지에 대한 자세한 내용은 아래 링크를 참조한다.


http://pinocc.tistory.com/138

Posted by 김용환 '김용환'



파이썬 3 예제이다.


파이썬 2의 subprocess의 결과는 이전에는 string이었지만 python2.6? 또는 python 3부터는 bytes로 리턴한다.

TypeError: startswith first arg must be bytes or a tuple of bytes, not str 이런 에러가 난다면 이슈이다.



이해가 되는 예시이다. 



>>> print(subprocess.Popen("echo hellow", shell=True, stdout=subprocess.PIPE))

b'hellow\n'


>>> print(subprocess.Popen("echo hellow", shell=True, stdout=subprocess.PIPE))

<subprocess.Popen object at 0x10cfb2908>


>>> print(subprocess.Popen("echo hellow", shell=True, stdout=subprocess.PIPE).communicate())

(b'hellow\n', None)


>>> print(subprocess.Popen("echo hellow", shell=True, stdout=subprocess.PIPE, universal_newlines=True).communicate()[0])

hellow



>>> print(subprocess.Popen("echo hellow", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())

hellow





마찬가지로..subprocess 모듈의 check_out도 바이트이기에..


status = subprocess.check_output(cmd.split()).rstrip() 코드는




print(subprocess.check_output(cmd.split()).decode('utf-8').rstrip()) 로 변경하면 string으로 리턴한다.







<참고 예시>


import subprocess

import paramiko

cmd = "vagrant ssh-config vagrant2"

p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, universal_newlines=True)

config = paramiko.SSHConfig()

config.parse(p.stdout)

config.lookup("vagrant2")



Posted by 김용환 '김용환'


몇 년 전에 카카오에서 함께 일한 charsyam(강대명 님 영어 이름)은 참 파이썬을 잘 했다. 물론 스칼라, 자바 모두 잘했다.


그런데. 루비로 만들어진 스크래퍼를 잘 다뤘다. 스크랩 관련 코드를 살펴보고 charsyam과 얘기하고 ㅎㅎ


og라는 것도 첨 알게 되고. 백엔드만 하다 보니 잘 모르는 것도 많았다.


특이한 timeout 현상에 대해서 charsyam과 얘기할 때 참 희열을 느꼈다. 




open api가 없으면 스크래핑해서 먼가를 구축하고 서비스 메싱 사용해서 원하는 것을 만들어내거나.


실제 스크래핑에 대한 법적 이해, 실제 구현에 대한 Scrapy 라이브러리를 살펴보니. 잼난다. 




파이썬 개발을 종종 하고 있지만, 스크래핑은 첨이라 즐거운 공부가 된 것 같다. 






이 책은 예시 싸이트를 두어서 테스트하기 좋다. 현행화가 되지 않은 부분은 코드를 수정해서 잘 동작되도록 했다. 


스크래핑에 대한 좋은 책이라 생각된다.





http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791161752525&orderClick=LAH&Kc=#N






★ 옮긴이의 말 ★

내가 카카오스토리 개발팀에 일할 때 스크래퍼 툴에 이상한 매력을 느꼈다. 스크래퍼 툴을 사용해 웹을 스크래핑할 때 특정 태그 정보와 사진을 추출해서 사용자들이 스크랩 정보를 글을 작성하기 전에 미리 알 수 있게 하는 매력, 왠지 마력처럼 느껴지기도 했다.


도대체 내부는 어떻게 동작하는 걸까? 옆에서 같이 스크래퍼 툴의 코드를 고쳐보기도 하고 이슈가 생기면 동료들과 같이 보기도 했다. 그렇기 때문에 이 책을 번역하게 돼 매우 기뻤다.
우리가 자주 사용하는 SNS(카카오톡, 페이스북, 카카오스토리, 라인)를 살펴보면, 링크를 보낼 때 링크만 보내지 않는다. 적당한 정보와 사진이 같이 대화창 또는 피드에 노출된다.
사실 스크래핑 기술을 알면 쉽게 구현할 수 있지만 스크래핑 기술을 배우고 싶어도 서버 관리자가 스크래핑 기술을 쓰지 못하도록 제한을 거는 경우가 많다. 그래서 이 책은 정말 특별하다. 저자가 운영 중인 예시 웹 사이트를 기반으로 웹 스크래핑 기술을 배울 수 있기 때문에 마음껏 예시를 테스트할 수 있다.

이 책은 크롤링과 스크래핑이 무엇인지 설명하고 법적 이슈를 다루며 시작한다. 웹 사이트에서 데이터를 스크래핑할 수 있는 최고의 가이드를 제공한다. 저자가 운영하는 예시 웹 사이트를 기반으로 스크래핑 테스트를 진행할 수 있다. 정적 웹 페이지에서 데이터를 추출하는 방법, 레디스와 파일을 캐싱으로 사용하는 방법, 동적 스크래핑 및 정교한 크롤러를 개발하는 방법을 다룬다. 그리고 PyQt와 Selenium을 사용하는 방법, 캡차(CAPTCHA)로 보호되는 복잡한 웹 사이트에 폼을 제출하는 방법, 병렬 라이브러리를 사용하는 방법, Scrapy 라이브러리로 클래스 기반 스크래퍼를 생성하는 방법을 다룬다.
이 책은 독자가 파이썬에 대한 기본 지식이 있다고 가정하기 때문에 파이썬 언어에 대한 설명은 없다. 하지만 Golang, 자바, 스칼라 등과 같은 언어에 대한 지식이 있다면 도전해 볼 수 있을 것이다.
원서의 버전은 파이썬 3.4 기준이었지만 번역서에서는 최신 버전인 파이썬 3.7과 바뀐 예시 사이트 URL을 기반으로 예시 소스를 일부 변경했다.

이 책에서 스크래핑에 대한 지식을 많이 얻기를 바란다. 



* 원서 링크





https://www.packtpub.com/big-data-and-business-intelligence/python-web-scraping-second-edition




Python Web Scraping - Second Edition

Katharine Jarmul, Richard Lawson

7 customer reviews








Python Web Scraping: Hands-on data scraping and crawling using PyQT, Selnium, HTML and Python, 2nd EditionPaperback – May 30, 2017




Posted by 김용환 '김용환'



13번째 번역책을 내어놓게 되었다. 나에게는 2018년 초 A형 독감을 안겨주었지만, 


아프기도 하고 포기하기도 싶었지만..


인내를 배우고, 또 인내를 배우며.


번역서 기준 1000페이지가 넘는 책을 내어놓게 되었다.




나에게 스칼라, 특히 스파크를 통해 해볼 수 있는 것이 무엇인지 잘 알려준 책이다. 


이미 회사에서 스칼라/스파크 개발을 통해 뼈를 깎는 고통이 무엇인지 알기에.. 이 책을 통해 조금이나마 나와 같은 분들이 그 시간을 빨리 지나가도록 도움을 주면 좋을 것 같다.




Aggregation, 많은 머신러닝 / 통계 책을 보면서 갈급했던 내용들(어떤식으로 엔지니어링(API화)한 것이 무엇인지)이 참 좋았다. 



머신 러닝에 대한 내용들이 조금 어렵긴 하지만 좋은 가이드를 주는 좋은 책이라 생각된다. 파이팅!!


엔지니어, 프로그래머도 스파크를 통해 머신 러닝/추천 시스템을 쉽게 개발할 수 있으리라 믿는다. 





http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791161752402&orderClick=LET&Kc=#N





★ 옮긴이의 말 ★ 

하둡 맵리듀스(Hadoop MapReduce) 프로그래밍은 최근 몇 년 동안 잘 사용되고 있습니다. 또한 데이터가 저장된 하둡 분산 파일 시스템을 기반으로 하는 분석, 추천 프로그래밍은 하둡 내부에서만 가능했기에 개발자들이 하둡 인터페이스를 사용해 개발해야 했습니다. 그러나 일반 개발자가 이해하기 어려운 개념과 인터페이스가 있어 하둡과 하둡 맵리듀스를 잘 이해하는 개발자가 전문적으로 개발하곤 했습니다. 일반 개발자들이 쉽게 분석할 수 있도록 아파치 하이브(Hive) 등 다양한 하둡 관련 프레임워크가 사용되기 시작했습니다. 그러나 여전히 유연하지 않을 뿐 더러 하둡 맵리듀스 개발은 변화되지 않았고, 테스트 코드 개발 역시 쉽지 않았습니다. 하둡 프로그래밍의 약점은 대용량 데이터에 대한 실시간 처리입니다. 따라서 하둡 대신 실시간 데이터를 처리하는 메시징 큐(예, 카프카)를 사용하고 있습니다. 그러다 보니 스트리밍 처리를 처리하기 위해 아파치 스톰(Apache Storm), 스파크 스트리밍(Spark Streaming), 아파치 플링크(Apache Flink) 등 많은 오픈 소스가 쓰이고 있습니다. 
저는 현업 개발자이지만 다양한 NoSQL, 대용량, 비즈니스에 관심이 많습니다. 저는 스칼라/스파크를 사용해 애플리케이션을 개발했고, 메소스/마라톤 및 쿠버네티스에서 애플리케이션에서도 애플리케이션을 개발했습니다. 따라서 하둡 맵리듀스 프로그래밍은 스파크로 대체될 것이라는 굳은 믿음이 있습니다. 누구나 스칼라를 제대로 알 수 있다면 하둡 맵리듀스 프로그래밍을 스칼라 기반의 스파크 프로그래밍으로 대체 및 보완할 수 있을 것이라 확신합니다. 
저뿐 아니라 많은 개발자가 하둡 맵리듀스 프로그래밍, 기존 파이프라인 프로그래밍 및 머신 러닝 프로그래밍을 점차 스파크 프로그래밍으로 대체되고 보완하고 있습니다. 스트리밍 처리, 대용량 분석 처리, 추천 시스템 개발, 인메모리 병렬처리, 머신 러닝까지 여러 분야의 애플리케이션을 스파크 하나만 알면 어느 정도 진행할 수 있습니다. 따라서 람다 아키텍처를 스파크로 쉽게 처리할 수 있습니다. 스파크는 CNN과 같은 딥러닝을 지원하지 않지만 텐서플로(Tensorflow)와 쉽게 연동할 수 있습니다. 그리고 스파크는 자바, 스칼라, 파이썬, R 언어를 지원하기 때문에 언어에 대한 부담이 가장 덜합니다. 
특히 스칼라의 함수형 언어의 특징과 데이터프레임을 추상화한 스칼라 기반의 스파크를 활용함으로써 빅데이터를 논리적인 프로그래밍으로 쉽게 처리할 수 있습니다. 많은 개발자가 스스로 공부하며 빅데이터, 머신 러닝의 영역으로 진입하고 있는데 그에 함께 가고 싶습니다. 
이 책은 전반적으로 설명이 많고 그림이 풍부합니다. 특히, 집계 부분은 중요한 내용을 잘 설명하고 있습니다. 저는 이전부터 통계와 머신 러닝을 공부하고 있었는데 실제 스파크 애플리케이션에서 어떻게 연동되는지는 이 책을 통해 잘 이해하게 됐습니다. 머신 러닝을 처음 도전하시는 분에게는 이 책이 좀 어렵다고 느낄 수 있겠지만 많은 도움이 될 것입니다. 빅데이터 분석과 머신 러닝에 대한 많은 내용을 포함한 ‘전과' 같은 이 책이 여러분들에게도 현업에서 큰 도움이 되면 좋겠습니다. 
이 책은 원서와 달리 최신 2.3.2 버전으로 작성됐습니다. 기존의 원서에서 제공하는 코드의 오타와 호환성을 수정해 옮긴이의 github 저장소(https://github.com/knight76/Scala-and-Spark-for-Big-Data-Analytics)를 제공하고 있으니, 참고하시기 바랍니다.




원서  : Scala and Spark for Big Data Analytics: Explore the concepts of functional programming, data streaming, and machine learning

https://www.amazon.com/Scala-Spark-Big-Data-Analytics/dp/1785280848








Posted by 김용환 '김용환'




금융권 클라우드 이용 확대 방안 (pdf)


https://www.fsc.go.kr/downManager?bbsid=BBS0030&no=127829




요약:


Posted by 김용환 '김용환'




네이버에서 송창현 이사님이랑 함께 일해서 참 좋았다. 


JVM 성능 / 튜닝 관련해서 함께 얘기하고 대화하며 먼가를 더 깊이 파보고(토론)


더 깊이 알고 했던 젊은 날의 나에게 좋은 형 같은 분이었다.



그리고 성장에 관심이 많으신 분이셨다.


이제 네이버를 그만두지만 또 다른 도전을 하시리라 생각된다.





좋은 리더십을 보여주신 분으로 기억한다. 새로운 출발에 파이팅!!








http://www.bloter.net/archives/166736



‘스스로 원하는’ 개발자가 되는 게 중요

송창현 연구센터장은 이 때 얻은 경험을 바탕으로 현재 네이버 개발자들을 가르친다. 2008년 네이버에 입사해 기술혁신센터를 비롯해 다양한 개발 조직을 이끌면서, 개발자들이 최대한 자유롭고 즐겁게 개발하면서 동시에 열정적인 개발자가 될 수 있는 환경을 조성하려고 노력했다. 실제로 그가 수장이 돼 운영하는 네이버랩스실 한 쪽 벽면에는 다음과 같은 글이 적혀 있다.

1. 팀이 없는 것처럼 협업하라. 같이 일을 하게 되면 자리를 옮겨서 같이 해라.
2. 지시하지 말고 토론하라.
3. 자신이 무엇을 하고 있고, 무엇을 잘 하는지, 무엇을 하고 싶어하는지 알려라.
4. 핵심기능·기술에만 먼저 집중하여 작게 시작하여 완성하고, 자신을 성장시키며 제품도 같이 성장시켜라
5. 자신보다 더 똑똑한 사람을 뽑아라. 단 팀플레이어만.
6. 자신과 생각이 다른 사람들과 가까이 하라. 불편함을 우정으로 풀어라.
7. 빠른 성장과 진행을 위해 팀을 작게 만들어라.
8. 잘못되어 가는 것이 보이면 빨리 뒤집어라. 고칠것이 있으면 자신이 고쳐라.
9. 자신이 만들고 있는 것이 어떤 유저의 어떤 문제를 해결하는지 자신에게 물어라
10. 항상 유저를 찾고 그들과 소통하라
11. 지식 공유를 하지 않는다는 것은 자신이 성장하고 있지 않다는 이야기다.
12. 결코 어른이 되지 마라. 기술에 대한 열정과 마음은 그대로 남아 있어라.


Posted by 김용환 '김용환'

tmux 사용 방법

Tool 2018.12.19 19:23


<자주 사용하는 tmux 사용 방법>



1. 세션 열기


$ tmux new -s [이름]

예) tmux new -s screen1



$ tmux new -s foo -d

(데몬으로 뜸)



$ tmux
(그냥 tmux 세션으로 들어감)





2. 세션 목록 보기


[~]  tmux ls

foo: 1 windows (created Wed Dec 19 20:39:30 2018) [80x24]

screen1: 1 windows (created Wed Dec 19 20:31:49 2018) [154x71] (attached)






3.  세션 들어가기 (attach)


$ tmux a -t [name] 

예) tmux a -t foo




4.  세션 나가기  (detach)

ctrl + b을 누르고 d를 누른다.


(ctrl + b) + d






5. 세션 종료하기


$ tmux kill-session -t [name]

예) tmux kill-session -t screen1




6.  세션에서 윈도우 (탭) 실행하기


(ctrl + b) + c


(개인적으로 이것보다는 pane이 편함)





7. 세션에서 panel 작업하기


horizontal split : (ctrl + b) + "

vertical split : (ctrl + b) + %

pane 이동하기 : (ctrl + b) + 방향키

pane 닫기 : (ctrl +d)




Posted by 김용환 '김용환'



https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions


ThirdPartyResource 가 1.8부터 custom resource definition으로 대체되었다.


관련 예시이다.


 


$ vi crd.yaml

apiVersion: apiextensions.k8s.io/v1beta1

kind: CustomResourceDefinition

metadata:

  name: crontabs.training.lfs458.com

    # This name must match names below.

    # <plural>.<group> syntax

spec:

  scope: Cluster #Could also be Namespaced

  group: training.lfs458.com

  version: v1

  names:

    kind: CronTab #Typically CamelCased for resource manifest

    plural: crontabs #Shown in URL

    singular: crontab #Short name for CLI alias

    shortNames:

    - ct #CLI short name




$ kubectl create -f crd.yaml



$  kubectl get crd

NAME                           AGE

crontabs.training.lfs458.com   4m



$ kubectl describe crd crontab

Name:         crontabs.training.lfs458.com

Namespace:

Labels:       <none>

Annotations:  <none>

API Version:  apiextensions.k8s.io/v1beta1

Kind:         CustomResourceDefinition

Metadata:

  Creation Timestamp:  2018-12-18T05:49:45Z

  Generation:          1

  Resource Version:    3992526

  Self Link:           /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/crontabs.training.lfs458.com

  UID:                 b92d0073-0288-11e9-9a46-fa163e964181

Spec:

  Group:  training.lfs458.com

  Names:

    Kind:       CronTab

    List Kind:  CronTabList

    Plural:     crontabs

    Short Names:

      ct

    Singular:  crontab

  Scope:       Cluster

  Version:     v1

Status:

  Accepted Names:

    Kind:       CronTab

    List Kind:  CronTabList

    Plural:     crontabs

    Short Names:

      ct

    Singular:  crontab

  Conditions:

    Last Transition Time:  2018-12-18T10:49:45Z

    Message:               no conflicts found

    Reason:                NoConflicts

    Status:                True

    Type:                  NamesAccepted

    Last Transition Time:  2018-12-18T10:49:45Z

    Message:               the initial names have been accepted

    Reason:                InitialNamesAccepted

    Status:                True

    Type:                  Established

Events:                    <none>


$ vi  new-crontab.yaml

apiVersion: "training.lfs458.com/v1"

  # This is from the group and version of new CRD

kind: CronTab

  # The kind from the new CRD

metadata:

  name: new-cron-object

spec:

  cronSpec: "*/5 * * * *"

  image: some-cron-image

    #Does not exist



$ kubectl create -f new-crontab.yaml



$ kubectl get CronTab

NAME              AGE

new-cron-object   4m


$ kubectl get ct

NAME              AGE

new-cron-object   4m


$ kubectl describe ct


Name:         new-cron-object

Namespace:

Labels:       <none>

Annotations:  <none>

API Version:  training.lfs458.com/v1

Kind:         CronTab

Metadata:

  Cluster Name:

  Creation Timestamp:  2018-12-18T10:52:21Z

  Resource Version:    3992891

  Self Link:           /apis/training.lfs458.com/v1/new-cron-object

  UID:                 16295359-0289-11e9-9a46-fa163e964181

Spec:

  Cron Spec:  */5 * * * *

  Image:      some-cron-image

Events:       <none>



$ kubectl delete -f crd.yaml

$ kubectl get CronTab
No resources found.

$ kubectl get ct

No resources found.


Posted by 김용환 '김용환'



<로그 파일 위치>



kubernetes의 마스터(master) 노드에서 로그 위치는 다음과 같다.


1. API : /var/log/kube-apiserver.log

2. 스케줄 : /var/log/kube-scheduler.log

3. 복제 관리 : /var/log/kube-controller-manager.log

4. 컨테이너 로그 : /var/log/containers/

5. pod : /var/log/pods/



워커(worker) 노드의 로그는 다음과 같다.


1. 노드에서 실행 중인 컨테이너 : /var/log/kubelet.log

2. 서비스 로드 밸런싱 : /var/log/kube-proxy.log





<pod bash 연결>

$ kubectl exec <POD-NAME> -c <CONTAINER-NAME> -- <COMMAND>
$ kubectl run -it --rm --restart=Never busybox --image=busybox /bin/bash





<pod 로그 보기>


$ kubectl get po --all-namespaces

...

kube-apiserver-k8s-master1

...

$ kubectl -n kube-system logs kube-apiserver-k8s-master1

..



이외 디버깅 방법


https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/


https://kubernetes.io/docs/tasks/debug-application-cluster/determine-reason-pod-failure/


Posted by 김용환 '김용환'




Label

- 개체의 메타 데이터를 설정 : Kubernetes 클러스터에서 개체를 그룹화/목록/작업 용

- Pod과 ReplicaSet 등의 Kubernetes 개체에 부여하는 키-값 쌍.



Annotation

- Label과 마찬가지로 키-값, 개체의 메타 데이터를 저장 : 자동화 툴 또는 클라이언트 라이브러리에서 사용하는 메타 데이터를 저장하는 키-값 스토어.객체에 대한 임의의 정보를 저장

- 식별 정보는 아니다. 따라서 히스토리, 스케줄 정책, 부가 정보 등등을 저장한다

Posted by 김용환 '김용환'