commit 정리하기에 정말 좋은 git rebase 참조 링크,



* 개념

http://dogfeet.github.io/articles/2012/git-merge-rebase.html



* rebase 활용 사례

https://wckhg89.github.io/archivers/rebase







Posted by '김용환'
,


zip은 표준을 지키기 때문에 분할 압축 기능을 지원하지 않는다.

그러나 7zip은 압축도 좋고 분할 압축이 가능하다.



mac OS에서 brew를 통해 7zip을 다운받는다.



$ brew update


$ brew install p7zip



zip -9 (압축률 최고) 보다 7zip이 더 압축률이 좋다. 



압축 / 해지 방법


$ 7z a rating.zip rating.csv


$ 7z x rating.zip



500메가 텍스트 파일을 압축할 때,

zip으로 압축하면 130메가 짜리 압축 파일을..

7zip으로 압축하면 80메가 짜리 찹축 파일을 생성한다.




압축 파일을 용량 단위로 분할 압축할 수 있다. 단점은 하나의 파일로 압축하는 것보다 용량이 더 커질 수 있다는 단점이 있다. 




예)


$ 7z a ratings.zip ratings.csv -v50m


-rw-r--r--    1 samuel.kim  staff   52428800 10 18 19:43 ratings.zip.001

-rw-r--r--    1 samuel.kim  staff   52428800 10 18 19:43 ratings.zip.002

-rw-r--r--    1 samuel.kim  staff    2845551 10 18 19:43 ratings.zip.003




Posted by '김용환'
,

stanford의 corenlp를 사용하다 다음과 같은 에러가 발생하면 


Exception in thread “main” java.lang.RuntimeException: edu.stanford.nlp.io.RuntimeIOException: Error while loading a tagger model (probably missing model file)


java.io.IOException: Unable to open "edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger" 

as class path, filename or URL at edu.stanford.nlp.io.IOUtils.getInputStreamFromURLOrClasspathOrFileSystem(IOUtils.java:485) at 

edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:765) ... 11 more




classifier "models"을 따로 임포트해야 한다.


libraryDependencies += "edu.stanford.nlp" % "stanford-corenlp" % "3.9.1"

libraryDependencies += "edu.stanford.nlp" % "stanford-corenlp" % "3.9.1" classifier "models"




버전 정보는 아래를 확인한다.

https://mvnrepository.com/artifact/edu.stanford.nlp/stanford-corenlp

Posted by '김용환'
,

쿠버네티스 + 스파크 예시


https://weidongzhou.wordpress.com/2018/04/29/running-spark-on-kubernetes/



https://medium.com/@timfpark/cloud-native-big-data-jobs-with-spark-2-3-and-kubernetes-938b04d0da57




Posted by '김용환'
,



쿠버네티스의 service discovery 컴포넌트로 istio와 linkered가 있는데.. 


https://linkerd.io/ 는 version 1(https://github.com/linkerd/linkerd)은 스칼라로 개발되었는데..


version2(https://github.com/linkerd/linkerd2)부터는 go언어로 개발되었다.




go로 간 이유는 성능적인 요소와 쿠버네티스 생태계에 가까워지기 위함이라고 한다.




참고




https://www.sdxcentral.com/articles/news/linkerd-2-0-update-moves-closer-to-kubernetes/2018/09/

Posted by '김용환'
,


scala> val rdd_one = sc.parallelize(Seq(1,2,3))

rdd_one: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24


scala> rdd_one.getNumPartitions

res0: Int = 12


scala>


scala> sc.defaultParallelism

res1: Int = 12






기본 파티션 개수는 cpu 개수를 기반으로 만들어지거나 (장비별로 다른 값이 나옴, defaultParallelism으로 확인할 수 있다.) 스파크 설정 매개 변수 spark.default.parallelism 또는 클러스터의 코어 개수 중 하나이다


그외에 큰 자원을 읽을 때 기본 파티션 개수가 변경될 수 있다.


 

파티션 개수는 RDD 트랜스포메이션을 실행할 태스크 수에 직접적인 영향을 주기 때문에 파티션 개수가 중요하다. 


파티션 개수가 너무 적으면 많은 데이터에서 아주 일부의 CPU/코어만 사용하기 때문에 성능이 저하되고 클러스터를 제대로 활용하지 못하게 된다. 


반면에 파티션 개수가 너무 많으면 실제로 필요한 것보다 많은 자원을 사용하기 때문에 멀티 테넌트 환경에서는 자원 부족 현상이 발생할 수 있다.

Posted by '김용환'
,


파이썬에서 selenium과 phantomjs를 연동한 간단 예시이다.


>>> from selenium import webdriver

>>> driver = webdriver.Firefox() 



이전 커맨드를 실행하면 빈 브라우저 창이 열린다. 에러가 발생하면 geckodriver(https://github.com/mozilla/geckodriver/releases)를 설치하고 geckodriver를 사용할 수 있도록  PATH 변수에 추가해야 한다.



geckodriver 파일을 압축을 푼 후 바이너르를 PATH에 추가한 후, executable(예, chmod 755)로 변경한다.





 

 

 >>> driver.get('https://www.google.com')

 

driver를 사용해 엘리먼트를 파싱하거나, 파이어폭스가 커맨드를 따라 변경되는 것을 볼 수 있다. 


 

 


phantomjs와 같은 헤드리스 브라우져와 연동할 수 있다.

 

http://phantomjs.org/download.html




>>> from selenium import webdriver

>>> driver = webdriver.PhantomJS()  



패스에 넣거나 다음처럼 phantomjs 경로를 사용할 수 있다.



>>> driver = webdriver.PhantomJS('utils/phantomsjs')  

>>> driver.get('http://python.org')

>>> driver.save_screenshot('python_website.png')

True



이렇게 파일을 확인할 수 있다.


스크린 샷 파일이 긴 윈도우이다. maximize_window를 사용하거나 set_window_size로 윈도우 크기를 설정해 윈도우 크기를 변경할 수 있다.



https://selenium-python.readthedocs.io/api.html

Posted by '김용환'
,


(상당히 유명한 내용이긴 한데. 암시를 처음보는 분들이 헤매는 내용이라 정리한다)


scala에서 double 타입의 값을 int 변수에 저장하려 하면 반드시 타입 에러가 난다.



scala>  val x:Int = 18.0

<console>:11: error: type mismatch;

 found   : Double(18.0)

 required: Int

        val x:Int = 18.0

                    ^



그래서 이를 위해서는 double을 int로 변경하는 함수가 필요하다.



scala> def doubleToInt(d:Double) = d.toInt

doubleToInt: (d: Double)Int


scala> val x:Int = doubleToInt(18.0)

x: Int = 18



값을 사용하는 시점에 컴파일러가 타입을 확인해서 암시를 적용한다.



scala> implicit def doubleToInt(d: Double) = d.toInt

doubleToInt: (d: Double)Int


scala> val x:Int = 18.0

x: Int = 18





Posted by '김용환'
,

import 실패를 방지하는 파이썬의 try ... import .. except: 문이다.

다른 언어에서는 못 본 것 같다.



try:

   from PySide.QtGui import *

   from PySide.QtCore import *

   from PySide.QtWebKit import *

except ImportError:

   from PyQt4.QtGui import *

   from PyQt4.QtCore import *

   from PyQt4.QtWebKit import * 

Posted by '김용환'
,

MacOS에서 sudo 커맨드를 실행하면 다음과 같은 에러가 발생했다.


$ sudo -s

sudo: /etc/sudoers is owned by uid 502, should be 0

sudo: no valid sudoers sources found, quitting

sudo: unable to initialize policy plugin



$ su - root

Password:

su: Sorry




root 계정을 활성화하고 패스워드를 변경한다.


https://support.apple.com/ko-kr/HT204012





$ su - root


$ chown 0 /etc/sudoers




$ sudo

usage: sudo -h | -K | -k | -V

usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]

usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]

usage: sudo [-AbEHknPS] [-C num] [-g group] [-h host] [-p prompt] [-u user] [VAR=value] [-i|-s]

            [<command>]

usage: sudo -e [-AknS] [-C num] [-g group] [-h host] [-p prompt] [-u user] file ...





잘 동작한다. 




Posted by '김용환'
,