반응형

제목 그대로다.

네이버 블로그도 인스타, 트위터처럼 좋아요 버튼이 있다.

바로 공감하기 이다.

말 그대로 나와 이웃된 블로거들의 포스팅에 공감을 눌러주는 매크로 프로그램이다.

아래 영상은 데모영상이다.

https://youtu.be/1_RBb1bjl48?si=VR2HDsotghQVmPEj 

 

728x90
반응형
반응형

저는 티스토리 뿐만 아니라 네이버 블로그도 운영했고 요새 정신이 없어서 포스팅을 그만 둔 상태였습니다. 

오랜만에 네이버 블로그를 들어 갔는데 아래와 같이 네이버측에 경고를 받았습니다.

하나가 아니라 여러 글에 대해서 경고를 받음...

네이버 블로그 서로 이웃을 추가해주는 프로그램을 버전 별로 정리해서 포스팅했는데 그걸 전부 비공개 처리가 된 것.

작년에 만든 프로그램이지만, 만들어 놓은게 아까워서 티스토리에 올리기로 했습니다.

 

 

네이버 블로그 서로이웃 추가 프로그램 ver1.2

로컬을 찾아보니 초기 버전을 찾을 수 있었음.

QT를 이용해 오밀조밀하게 한 레이아웃에서 전부 처리할 수 있게 만들었었음.

저 때는 사용안하는 네이버 계정으로 테스트했던 것을 알 수 있음.

 

 

네이버 블로그 서로이웃 추가 프로그램 ver2.0


2.0 버전이 최종 버전인 것 같음.

코드를 살짝 분석해보니, 1.2 버전과 다른 것은 총 네 가지임.

1. 코드 간략화

목적은 잘 모르겠으나, 프로젝트의 기능들을 객체화 하여 코드를 간략화 시킴. 아무래도 새로운 기능들을 추가하고 유지보수를 위해 그런 것으로 보임.

2. GUI 변경

테스트를 위해 블로거들에게 한 번 사용해보라고 했을 때, 어려워 함. 설명하기 귀찮아서 GUI를 좀 더 순차적으로 만들고 간략화 한 것으로 보임.

 

3. 쓰레드 추가

1.2 버전을 돌려보니 네이버 매크로가 기동중 일 때는 GUI가 멈추는 현상이 발생하여 쓰레드를 추가해 GUI가 멈추는 것을 방지함.

4. 랜덤 딜레이 추가

매크로를 돌리다 보면 반복적인 동작과 동일한 시간을 네이버가 이를 매크로로 감지하기 때문에 랜덤으로 딜레이를 추가한 것으로 추측함.

 

데모 영상

https://www.youtube.com/watch?v=9MyQLyCm4Qo 

 

728x90
반응형
반응형

Build의 순서는 아래와 같다.

소스코드 -> 전처리 -> 컴파일 -> 링크 -> 실행

C언어를 처음 공부할 때, #define을 사용하지 않으면 전처리 과정을 거치지 않는다고 생각한 적이 있다.

#으로 시작하는 문장은 전부 전처리기 지시자임에도 #include는 전처리기라고 생각하지 않았다. 항상 C언어를 실습할 때, 의무적으로 #inlcude <stdio.h>를 작성한 폐해이다.

전처리란 무엇인가?

컴파일 전에 처리해야 하는 일이고 전처리를 수행하는 장치를 전처리기라고 한다.

전처리기는 헤더 파일을 불러오거나, 소스 파일 내부의 특정 문자열을 상수 또는 문자로 치환하거나, 조건에 따라서 코드의 일부를 컴파일하거나 컴파일하지 못하게 하는 선택 기능을 제공한다.

궁금증이 하나 발생한다.

#define은 왜 사용하는가? 단순히 변수나 함수를 선언 및 호출하면 되지 않는가? 일반 변수 및 함수와 매크로(#define)의 차이는 무엇인가?

이를 이해하기 위해선 컴파일 단계를 이해할 필요가 있다.

컴파일이란 무엇인가? 기계어로 번역하는 번역기이다. 왜 기계어로 번역하는가? 소스 코드는 사람이 이해하기 쉬운 문장이며, 기계는 이해할 수 없다. 그러므로 기계가 이해할 수 있는 문장으로 번역해줘야 한다.

C언어가 생기기 이 전, 개발자들은 기계(컴퓨터, CPU)를 직접 제어하기 위해 기계어(어셈블리어)를 직접 작성하였다. 하지만 CPU는 다양했고, CPU의 종류에 따라 어셈블리어 작성하는 방법도 각기 달랐다고 하며, 간단한 프로그램에도 코드가 굉장히 길어졌다. 

이 문제점을 해결하기 위해, 기계어를 직접 사람이 작성하지 않아도 되는 번역기를 개발했는데 그것이 컴파일러이다. 개발자들은 더 이상 기계의 종류를 상관하지 않아도 된다.


C언어는 소스코드 중복을 줄이고 코드의 재사용성을 높이기 위해서 함수를 제공한다. 하지만, 함수는 호출될 때 *스택 프레임이 일어나기 때문에 속도가 느려지는 단점이 있다. 따라서 코딩할때는 매크로를 함수와 같은 기능으로 작성하지만 실제 기계어로 번역될 때는 직접 코딩한 것처럼 처리(치환, 전처리 단계에서 매크로가 소스코드로 변환)된다.

함수 호출 시, 스택이라는 메모리 공간에 매개 변수, 반환 포인터 값, 지역 변수 순서로 저장되는 값을 스택 프레임이라고 한다.

즉, 저장 공간인 스택을 메모리 낭비를 줄이고 실행 속도를 높이기 위해 매크로를 사용한다. 하지만 매크로는 소스코드로 바로 변환되므로 실행 파일 크기가 커지며, 재귀호출을 할 수 없다는 단점을 가지므로 적절하게 사용하는 것이 중요하다. 

요즘엔 컴퓨터의 메모리가 굉장히 넉넉하기 때문에 메모리 걱정을 하지 않을 때가 많지만, 메모리 공간이 넉넉치 않은 임베디드 시스템과 같은 환경에서는 매크로를 많이 사용한다.


아래 매크로 함수와 일반 함수 예시를 보겠다.

#include <stdio.h>

#define MUL(x, y) x*y

int mul(x, y)
{
	return x*y;
}
int main()
{
	int a, b;
    
    scanf("%d %d", &a, &b);
    printf("%d", MUL(a+1, b+1));
    printf("%d", mul(a+1, b+1));
}

// result
// a=3, b=4 입력
// 8
// 20

왜 결과값이 8, 20으로 다른 값이 나올까?  매크로는 전처리 단계에서 소스 코드로 변경된다고 했다. 

MUL(a+1, b+1)을 소스 코드로 치환되면 a+1*b+1 이다.

그러므로 3+1*4+1로 계산되어 8이라는 결과가 출력된다. mul과 같은 결과를 내기 위해선, 

#define MUL(x, y) ((x) * (y)) 로 변경하면 된다. 소스코드로 치환하게 되면, ((a+1)*(b+1))이다.

728x90
반응형
반응형

안녕하세요. 

 

오늘은 웹크롤링에 대해 글을 쓰도록 하겠습니다.

 

제가 웹크롤링을 공부해야지! 해서 공부한게 아니라 일을 돕고자 자동화를 찾아보다

 

Beautifulsoup과 Selenium을 알게 되었습니다.

 

제가 일을 돕기 위해 만드는 프로그램은 전화번호를 자동적으로 따오는 프로그램입니다.

 

굳이 웹크롤링을 공부할 때 자바 스크립트 같은 언어는 몰라도 됩니다.

 

Beautifulsoup는 홈페이지에 대한 내용을 불러오는 라이브러리이고,

 

Selenium은 자동화를 구현하는 라이브러리입니다.

 

이 두 가지 라이브러리만 안다면 구현하는데 웬만한 자동화프로그램은 만들 수 있다고 생각합니다.

 

제가 만든 매크로 프로그램도 웹기반 지식을 모르는 상태에서 3일을 거쳐 만들었습니다. 

 

동영상으로 보여드리고 싶지만, 프로그램 자체에 손님들의 전화번호등이 있어, 제가 모자이크를 다 처리한 상태에서 동영상을 올릴 생각입니다. 

 

 

저는 웹크롤링을 하기 위해 기본이 아닌, 제가 프로그램을 구현하면서 막혔던 부분을 작성하도록 하겠습니다. 

 

iframe : 웹페이지 안의 또다른 웹페이지

 

프로그램을 구현할 때 가장 어려웠던 문제 중 하나가 iframe 문제였습니다.

 

처음에 

[selenium]

driver.find_element_by_xpath() : 절대 경로

 

driver.find_element_by_id() : id값

 

driver.find_element_by_name() : 이름

 

driver.find_element_by_tag_name() : 태그 이름

 

어지간하지 않고서야 이 4가지 함수로 구현할 수 있습니다.

 

iframe은 4가지 방법으로 불가능합니다. 사용할 시

 

stale element reference: element is not attached to the page document selenium.common.exceptions.NoSuchElementException: 

Message: no such element: Unable to locate element

 

이런 무시무시한 에러를 보시게 될겁니다. 

 

iframe은 웹페이지 안에 또 다른 자식 웹페이지이기 때문에 다른 접근 방법을 사용해야 합니다.

 

우선 우리들은 자바스크립트를 열어보기 전에 iframe을 확인할 수 있습니다.

 

 

 

첫 번 째:

iframes = driver.find_elements_by_tag_name('iframe')

for i in iframes:

     print(i)

 

print를 찍어서 자신이 찾고자 하는 iframe 어디 있는지 확인합니다.

만약 자신이 원하는 값이 iframe[0]에 있다고 가정합시다.

iframe[0]으로 프레임으로 위치를 옮깁니다.

 

 

두 번 째:

[selenium]

driver.switch_to.frame(iframes[0])

 

이제 위치가 iframes[0]로 옮겨 졌다면, 

 

 

세 번 째:

[selenium]

html = driver.page_source

 

iframes[0]의 현주소를 받아옵니다.

 

 

네 번 째:

[beautifulsoup]

soup = BeautifulSoup(html, 'html.parser')

 

html을 파싱합니다.

 

 

다 섯 번 째:

[beautifulsoup]

soup.find()

soup.find_all()

 

이제 자신이 수행하고자 하는 함수를 구현합니다.

 

 

여 섯 번 째:

[selenium]

driver.switch_to.default_content()

 

다시 원래 프레임으로 돌아갑니다.

 

이런식으로 한다면 iframe을 처리할 수 있습니다.

 

다음 additem박스를 접근하는 select에 대해 글쓰도록 하겠습니다.

 

728x90
반응형

+ Recent posts