파이썬을 사용하다보면 추가적으로 필요한 라이브러리(혹은 패키지)를 사용해야 할 때가 있다.
Windows를 기준으로 cmd나 사용중인 IDE의 terminal 창을 이용해 명령어로 간단하게 동작시킬 수 있다.
#2. 명령어
python -m pip install {lib_name}
여기에서 {lib_name} 대신 본인이 설치하길 원하는 라이브러리명을 넣으면 된다.
python -m pip install {lib_name}
python --version
bash ~]$ ps -ef | grep crond # crond 확인
bash ~]$ /etc/rc.d/init.d/crond start # crond 시작
bash ~]$ /etc/rc.d/init.d/crond stop # crond 중지
bash ~]$ crontab -l # 예정된 작업리스트 확인
bash ~]$ crontab -e # 작업리스트 수정(추가/수정/삭제)
--string값의 순서에 상관없이 비교하기
SELECT A_COL
,B_COL
,CASE WHEN TRANSLATE(A_COL, B_COL,' ') = TRANSLATE(B_COL, A_COL,' ')
THEN 'TRUE'
ELSE 'FALSE' END AS EQUAL
FROM TMP_TABLE
;
--테이블 및 컬럼명 검색
SELECT A1.OWNER /*OWNER*/
,A1.TABLE_NAME AS TAB_ID /*테이블영문명*/
,A2.COMMENTS AS TAB_NM /*테이블한글명*/
,A3.COLUMN_ID AS COL_SEQ /*컬럼순서*/
,A1.COLUMN_NAME AS COL_ID /*컬럼영문명*/
,A1.COMMENTS AS COL_NM /*컬럼한글명*/
,A3.NULLABLE AS NULL_YN /*NULL여부*/
,A3.DATA_TYPE||'('||A3.DATA_LENGTH||')' AS DATA_TYPE /*데이터타입*/
FROM SYS.ALL_COL_COMMENTS A1
INNER JOIN SYS.ALL_TAB_COMMENTS A2
ON A1.OWNER = A2.OWNER
AND A1.TABLE_NAME = A2.TABLE_NAME
INNER JOIN SYS.ALL_TAB_COLS A3
ON A1.OWNER = A3.OWNER
AND A1.TABLE_NAME = A3.TABLE_NAME
AND A1.COLUMN_NAME = A3.COLUMN_NAME
WHERE A1.TABLE_NAME = 'MY_TABLE_NAME'
ORDER BY A1.OWNER
,A1.TABLE_NAME
,A3.COLUMN_ID
;
# console 프린트 길이
options(max.print=1000000)
# 소수자릿수 표현
options(scipen = 4)
# string을 factor로 자동 변경하지 않음
options(stringsAsFactors = FALSE)
# 내부 mirror사이트 path
options(repos="http://192.168.0.1/cran")
install.package("readr")
library(readr)
read.csv.any <- function(text, sep = "", ...) {
encoding <- as.character(guess_encoding(text)[1,1])
setting <- as.character(tools::file_ext(text))
if(sep != "" | !(setting %in% c("csv", "txt")) ) setting <- "custom"
separate <- list(csv = ",", txt = "\n", custom = sep)
result <- read.table(text, sep = separate[[setting]], fileEncoding = encoding, ...)
return(result)
}
my_csv_file <- read.csv.any("file/path/csv_file.csv", header = TRUE)
-> 
SELECT * FROM TMP
PIVOT (
SUM(CNT) FOR MON IN (
'M01' AS MON01
,'M02' AS MON02
,'M03' AS MON03
)
)
ORDER BY ID
;
-> 
SELECT * FROM TMP
UNPIVOT (
CNT FOR MON IN (
MON01 AS 'M01'
,MON02 AS 'M02'
,MON03 AS 'M03'
)
)
ORDER BY ID, MON
;
wget ftp://cran.r-project.org/pub/R/src/contrib/*.tar.gz
ftp ftp://cran.r-project.org/pub/R/src/contrib/
tar -xzvf /다운로드된경로 -C /압축풀경로
pk.list <- c("RJDBC", "data.table", "dplyr", "tidyr", "Amelia" , "lubridate", "xlsx",
"sparklyr", "rsparkling", "h2o", "visNetwork", "igraph", "ggplot2")
pk.installed <- installed.packages()[, "Package"]
setdiff(pk.list, pk.installed)
character(0) # 모든 필수 라이브러리 설치 완료
download.path <- "압축푼경로"
pk.list <- list.files(download.path)
pk.list <- setdiff(pk.list, installed.packages()[, "Package"])
for(i in pk.list){
pk.path <- file.path(download.path, i)
install.packages(pk.path, repos = NULL, type="source")
}
#########################################
# WORD COUNTER - v1.0
# - martinpark
# - ruserive@gmail.com
#########################################
# load library and user function ------------------------------------------
# install.packages(c("KoNLP","plyr","dplyr","qdap","plotly"))
library(KoNLP)
library(plyr)
library(dplyr)
library(qdap)
library(plotly)
# word count part ---------------------------------------------------------
# 기사 내용 추출해서 단어 카운트하기 (전체 기사)
txt <- result$article
txt <- gsub(keyWord," ",gsub("“|”|\"|`|'|\\(|\\)|<|>|\\[|\\]|·|…|△|▷| \\(중략\\)..."," ",txt))
txt <- unlist(sapply(txt, extractNoun, USE.NAMES = F))
txt <- base::Filter(function(x){nchar(x)>1},txt)
word_count <- freq_terms(txt,top=10)
# 완성 데이터 확인
print(word_count)
# time trend --------------------------------------------------------------
# 기사 내용 추출해서 시간별로 단어의 사용량 추이 확인하기
df <- result[,c("article","time")]
df$article <- gsub(keyWord," ",gsub("“|”|\"|`|'|\\(|\\)|<|>|\\[|\\]|·|…|△|▷| \\(중략\\)..."," ",df$article))
# 날짜별
txt2 <- sapply(df$article, extractNoun, USE.NAMES = F)
txt2 <- lapply(txt2, function(x) x[nchar(x)>1])
names(txt2) <- df$time
txt2_result <- data.frame(date = rep(names(txt2), lapply(txt2, length))
,word = unlist(txt2)
,row.names = NULL
,stringsAsFactors = FALSE)
# 빈도 높은 단어(혹은 관심 단어) 하나 선택하기
word_filter <- "금메달"
## word plot(1) - 0불포함(쇼트트랙 관련 기사에 금메달이라는 단어가 없던 날은 아예 그래프에서 제외)
tmpPlot <- txt2_result[txt2_result$word == word_filter,]$date
# 결과 그래프(1) 확인
plot(table(tmpPlot),"l")
## word plot(2) - 0포함(쇼트트랙 관련 기사에 금메달이라는 단어가 없던 날도 그래프에 포함)
tmpPlot2 <- left_join(data.frame(tmpPlot=unique(txt2_result$date),stringsAsFactors=FALSE)
,as.data.frame(table(tmpPlot),stringsAsFactors=FALSE))
tmpPlot2$Freq[is.na(tmpPlot2$Freq)] <- 0
tmpPlot2 <- tmpPlot2[order(tmpPlot2$tmp),]
tmpPlot2$Date <- gsub("-","/",substr(tmpPlot2$tmpPlot,6,10))
# 결과 그래프(2) 확인
plot_ly(tmpPlot2, x = ~Date, y = ~Freq, type = 'scatter', mode = 'lines')
#########################################
# GOOGLE NEWS CRAWLER - v1.0
# - martinpark
# - ruserive@gmail.com
#########################################
# load library and user function ------------------------------------------
# install.packages(c("httr","xml2","stringr","lubridate"))
library(httr)
library(xml2)
library(stringr)
library(lubridate)
unescape_html <- function(str){
xml2::xml_text(xml2::read_html(paste0("<x>", str, "</x>")))
}
# control keyword and number of posts -------------------------------------
# 검색어
keyWord <- "쇼트트랙"
# 검색 뉴스 수 (너무 많을 경우, 블락당할 수 있음)
numOfPost <- 300
# google news crawler main part -------------------------------------------
# 키워드 변환
keyWordUTF8 <- URLencode(iconv(keyWord,to='utf8'))
# 크롤링 페이지 분할
startPosts <- seq(1,numOfPost,100)
startPosts[1] <- startPosts[1] - 1
if (numOfPost%%100==0) {
endPosts <- rep(100,numOfPost/100)
} else {
endPosts <- c(rep(100,floor(numOfPost/100)),numOfPost%%100)
}
# 결과셋 생성
result <- data.frame(stringsAsFactors=FALSE)
for (i in seq(length(startPosts))) {
# 뉴스 가져오기
url <- paste0("https://www.google.co.kr/search?hl=ko&q=",keyWordUTF8,"&tbm=nws&start=",startPosts[i],"&num=",endPosts[i])
doc <- content(GET(url), "text")
# doc <- readLines(url,warn=FALSE)
doc_table <- str_split(doc,"<table><tr>")
for(p in seq(endPosts[i])+1) {
# 뉴스 정제
doc_tab <- str_split(doc_table[[1]][p],"</div>")
doc_tab2 <- str_split(doc_tab[[1]][1],"</a></h3>")
# 뉴스 제목
title <- unescape_html(doc_tab2[[1]][1])
# 뉴스 기사
article <- unescape_html(gsub(" ..."," (중략)...",doc_tab[[1]][2]))
# 뉴스 제공업체
supplier <- str_split(unescape_html(doc_tab2[[1]][2])," - ")[[1]][1]
# 뉴스 URL
news_url <- URLdecode(str_sub(doc_tab2[[1]][1]
,str_locate(doc_tab2[[1]][1],"\"/url")[2]+4
,str_locate(doc_tab2[[1]][1],"&")[1]-1))
# 뉴스 게시 시간
tmp_time <- str_split(unescape_html(doc_tab2[[1]][2])," - ")[[1]][2]
if(length(grep(" 전",tmp_time))==0){
post_time <- as_date(tmp_time)
} else {
post_time <- lubridate::ymd_hms(Sys.time())
num <- as.integer(gsub("[^0-9]","",tmp_time))
unit <- gsub("([0-9]*)| 전","",tmp_time)
if(unit=="일"){
lubridate::day(post_time) <- lubridate::day(post_time) - num
} else if(unit=="시간"){
lubridate::hour(post_time) <- lubridate::hour(post_time) - num
} else if(unit=="분"){
lubridate::minute(post_time) <- lubridate::minute(post_time) - num
} else if(unit=="초"){
lubridate::second(post_time) <- lubridate::second(post_time) - num
}
post_time <- as_date(post_time)
}
# 데이터프레임화
res <- data.frame(keyword=keyWord
,title=title
,article=article
,supplier=supplier
,url=news_url
,time=post_time
,stringsAsFactors=FALSE)
result <- rbind(result, res)
}
print(paste0("Done..! (",nrow(result),"/",numOfPost,")"))
# 빠르게 자주 사용하면 블락당함..
Sys.sleep(3)
}
# 완성 데이터 확인
# View(result)
# csv 추출
write.csv(result, file.path("C:\\Users\\Martin\\Desktop\\google_news.csv"),row.names=FALSE,fileEncoding="CP949")
# wi-fi 모듈 업데이트
curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.bin > /usr/lib/firmware/brcm/brcmfmac43430-sdio.bin
curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.txt > /usr/lib/firmware/brcm/brcmfmac43430-sdio.txt
# 재부팅
shutdown -r now
# wi-fi 모듈이 사용 가능하면 wlan0 항목이 표시됨.
nmcli d
# 주변 wi-fi 탐색
nmcli d wifi
# wi-fi 연결
nmcli d wifi connect password
# 연결 확인
nmcli d
# 접속한 wi-fi 세부정보 확인
nmcli d show wlan0
# root password 변경
passwd
# hostname 변경
vi /etc/hostname
# hostname 적용
hostname -F /etc/hostname
# 디스크 용량 확인
hf -h
# 디스크 용량 확장
/usr/local/bin/rootfs-expand
# 작업이 완료될때까지 잠시 대기 후, 디스크 용량 재확인
hf -h
