맥 High Sierra OS 버전의 크롬 브라우저의 쿠키를 확인하려면 sqlite를 확인하면 된다.


table을 확인할 수 있고


schema를 사용하면 스키마 정보를 볼 수 있다.


$ cd /Users/sameul/Library/Application Support/Google/Chrome/Default

$ sqlite3 Cookies

SQLite version 3.19.3 2017-06-27 16:48:08

Enter ".help" for usage hints.


sqlite> .tables

cookies  meta


sqlite> .schema

CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);

CREATE TABLE cookies (creation_utc INTEGER NOT NULL,host_key TEXT NOT NULL,name TEXT NOT NULL,value TEXT NOT NULL,path TEXT NOT NULL,expires_utc INTEGER NOT NULL,is_secure INTEGER NOT NULL,is_httponly INTEGER NOT NULL,last_access_utc INTEGER NOT NULL, has_expires INTEGER NOT NULL DEFAULT 1, is_persistent INTEGER NOT NULL DEFAULT 1,priority INTEGER NOT NULL DEFAULT 1,encrypted_value BLOB DEFAULT '',firstpartyonly INTEGER NOT NULL DEFAULT 0,UNIQUE (host_key, name, path));




sqlite3에 읽을 데이터 파일 이름을 주지 않아도 .open 커맨드를 사용해 파일을 읽을 수 있다.


$ sqlite3

SQLite version 3.19.3 2017-06-27 16:48:08

Enter ".help" for usage hints.

Connected to a transient in-memory database.

Use ".open FILENAME" to reopen on a persistent database.

sqlite> .open Cookies



cookies 테이블 정보를 인덴트를 주어 보고 싶다면 다음 커맨드를 사용한다.


sqlite> .schema --indent cookies

CREATE TABLE cookies(

  creation_utc INTEGER NOT NULL,

  host_key TEXT NOT NULL,

  name TEXT NOT NULL,

  value TEXT NOT NULL,

  path TEXT NOT NULL,

  expires_utc INTEGER NOT NULL,

  is_secure INTEGER NOT NULL,

  is_httponly INTEGER NOT NULL,

  last_access_utc INTEGER NOT NULL,

  has_expires INTEGER NOT NULL DEFAULT 1,

  is_persistent INTEGER NOT NULL DEFAULT 1,

  priority INTEGER NOT NULL DEFAULT 1,

  encrypted_value BLOB DEFAULT '',

  firstpartyonly INTEGER NOT NULL DEFAULT 0,

  UNIQUE(host_key, name, path)

);



encrypted_value를 보려면 파이썬을 활용할 수 있다.

Posted by '김용환'
,




파이썬에서 모듈 프로그래밍(디렉토리 , ___init__.py)를 진행할 때,


ModuleNotFoundError를 부딪힐 일이 있다.



$ python util/scrapers.py

Traceback (most recent call last):

  File "util/scrapers.py", line 3, in <module>

    from util.all_scrapers import re_scraper, bs_scraper, \

ModuleNotFoundError: No module named 'util'



이 이유는 파이썬 패스를 못찾다 보니 모듈을 찾지 못한 것이다. 

PYTHONPATH를 bash 설정 파일(예, bash_profile)에 지정하면 된다.



$ cat ~/bash_profile

PYTHONPATH=$PYTHONPATH:/~/dev/python/scraping/code

export PYTHONPATH


Posted by '김용환'
,


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 '김용환'
,