마사키군의 다락방

끄적끄적할게 있을때 끄적거려 보관해두는 다락방

Python으로 월별 페이스북 글 작성 개수 가져오기

심심해서 한번 끄적거려봄.

페이스북에 작성한 글 개수를 월별로 한번 뽑아내보고 싶어서 대충 간단한 함수를 하나 짜 봤다.

마침 Facepy라는 라이브러리가 Facebook의 Graph API의 URL만 넘겨주면 리턴값을 Dict로 넘겨주길래 간단하게 만들 수 있었다.

사실 Facebook SDK for Python이라는 라이브러리를 먼저 살펴봤는데, Python 3.4에서 설치가 안되서 때려치운건 함정

여하튼 Facepy를 사용하는 함수이기 때문에 먼저 Facepy를 설치해야 한다.

Facepy를 설치했다면, 적당히 폴더를 하나 만들고 아래 내용을 파일로 만들어 저장한다. 참고로 이 함수는 파이썬 3.4로 작성했으며, 상단에 인코딩을 UTF-8로 지정했기 때문에 반드시 UTF-8로 저장해야 한다.

심심풀이?로 Pastebin에도 써놨는데, 그쪽으로 볼 사람은 이쪽 참고.

여하튼 적당히 저장했으면, 파이썬을 실행한 후 위 모듈을 읽어들인다. 모듈을 읽어들이는 방법은, 해당 파일이 있는 디렉토리에서 파이썬을 실행시킨 후 파일의 확장자인 .py를 제외한 이름으로 import 한다.

  • 예: 파일 이름이 fb_stats.py인 경우
    • 파이썬 실행 후 import fb_stats

여기까지 진행했으면, Facebook에 접근할 수 있도록 Access Token을 발급받아야 한다. 본래는 앱 개발자로 등록해서 정식으로 Access Token을 발급받아야 할 것 같지만, 이건 어차피 일회용 프로그램? 이니까, 그냥 임시로 받아서 쓴다.

일단 Graph API Explorer에 접속한다.

Graph API Explorer

Graph API Explorer에 접속하면 상단에 Acess Token이라는 입력칸이 있고, 우측 끝 혹은 그 아래쪽에 Get Token이라는 버튼이 있다. Get Token > Get Access Token을 클릭한다.

권한 선택권한 선택 화면이 나오면 user_posts 권한을 선택하고, 하단의 Get Access Token을 클릭한다.

권한 수락

그러면 선택한 권한을 수락하느냐는 창이 뜨는데, 여기서 확인 버튼을 클릭한다.

그러면 Graph API Explorer 화면으로 돌아오게 되는데, 아까의 상단의 Acess Token 입력칸에 Token이 입력되었을 것이다. 이것을 전체 복사한다.

Access Token

복사했으면 다시 파이썬으로 되돌아가서, 아래와 같이 함수를 실행한다. 여기서 fb_stats는 맨 처음에 import에서 입력하는 모듈의 이름이자, 파일명이기도 하다. <access_token>에는 위에서 복사한 Access Token을 붙여넣는다.

그러면 뭐가 죽 올라간(…) 다음에, 해당 폴더 내에 지정된 파일명으로 매월 작성한 포스팅 수가 저장된다. 파일 형태는 한줄에 탭으로 구분된 두개의 필드가 들어있으며, 첫번째 필드는 작성년월, 두번쨰 필드는 포스팅 갯수이다.

ps1. 이거 처음 만들때부터 logging을 붙였는데, 100줄도 채 안되는 함수 하나 가지고 logging은 괜히 붙였나 싶기도 하고…

ps2. 참고로 이 함수의 실행 결과로 나오는 포스팅 개수는 정확하지 않을 수도 있다. Graph API의 /post가 정말로 내가 작성한 글만 리턴해주는지, 아니면 내 타임라인에 다른 사람이 작성한 글과, 내가 태깅된 글까지도 모두 포함하는지는 확인해보지 않았기 때문이다.

, , ,

숨겨진 SSID(Hidden SSID)로의 접속이 잘 안될때

우리집은 와이파이 설정이 <SSID 비공개>로 되어있다.

우리집은 SSID를 비공개로 해두고 사용한다

우리집은 SSID를 비공개로 해두고 사용한다

이건 딱히 별다른 의미가 있는건 아니고, 처음에는 SSID 설정하면서 괜히 암호 걸기도 귀찮고 해서 그냥 <비공개로 해 두면 딱히 외부에서 접속하는 일은 없겠지>라는 심산(?)으로 설정했던거다(지금은 암호도 걸어두고 SSID도 비공개-_-).

어제는 SKB의 삽질이라도 있었는지 갑자기 인터넷이 안돼서, 공유기를 꺼두고 생활하다가, 인터넷이 살아나기가 무섭게 공유기를 다시 켰는데 라즈베리 파이가 SSID에 접속하지 못하는걸 발견했다. 사실 이런 일은 은근히 핸드폰에 자주 있었는데, 그때야 데이터 통신 쓰면 되지 하면서 신경도 안썼는데, 와이파이 빼고는 인터넷 접속 방안이 아예 없는 라즈베리 파이에서는 정말 난감한 문제였다. 이거 해결하느라고 진짜 속이 타들어갔는데-_- 이런저런 검색과 삽질 끝에 해결한 내용을 기록해 두고자 한다.

방법은 간단한데, /etc/wpa_supplicant/wpa_supplicant.conf 파일의 network 섹션에 scan_ssid 설정을 1로 변경하면 된다.

여기서 scan_ssid는 SSID를 찾아내는 방식을 설정하는건데, FreeBSD Man Pages의 wpa_supplicant.conf 항목을 찾아보면 다음과 같이 명시되어 있다. 사실 FreeBSD의 문서라서 리눅스 기반의 라즈베리 파이에 안맞는거 아닌가 했는데, 해보니 잘 작동하는거 같아서 다행이다.

SSID scan technique; 0 (default) or 1. Technique 0 scans for the SSID using a broadcast Probe Request frame while 1 uses a directed Probe Request frame. Access points that cloak themselves by not broadcasting their SSID require technique 1, but beware that this scheme can cause scanning to take longer to complete.

나도 영어를 모르기 때문에 정확한 번역은 못하고-_- 대충 훑어보면 의미는 이렇다.

scan_ssid 항목은 SSID를 찾아내는 방법을 지정하며, 0과 1의 값을 갖고 기본값은 0이다. 0이 지정된 경우, 공유기 등에서 브로드캐스트되는 SSID를 캐치해서 접속하게 되고, 1이 지정된 경우에는 지정된 SSID를 직접 찾아내서 접속하게 된다. 단, 1이 지정된 경우 SSID를 직접 찾아내기 때문에 접속 완료에 약간 시간이 지체될 수 있다.

접속 시간이 조금 지체될 수 있다고는 하지만, 딱히 초고속 접속 완료(…)를 요하는 것도 아니고, 내 경우엔 어차피 그냥 켜놓고 서비스만 돌리는게 목적이기 때문에 1로 설정해도 별다른 무리는 없다 싶었다.

ps. 가끔 맥북이 Hidden SSID에 접속하지 못하는 경우가 있다. 그래서 맥북에도 혹시…? 하는 마음으로 wpa_supplicant.conf 파일을 찾아봤는데, 맥북은 /etc/wpa_supplicant 디렉토리 자체가 없다. 왜지-_-?

, ,

라즈베리 파이에 samba 설치해서 내부 공용 저장소로 쓰기

라즈베리 파이를 구입하면 누구나 한번쯤은 해보는 듯한 느낌이 드는(…) 외장 하드를 연결해서 samba로 내부 공용 저장소로 사용하기. 사실 설정 자체는 저번주 즈음에 다 했던거 같은데, 일단 이걸 정리해놔야 내가 다음에 하려는걸 했다가 실수로 날려먹어도 다시 설정할 수 있겠지(…) 싶어서 정리해둔다.

samba라는 것은 윈도우 운영체제에서 자원 공유시에 사용하는 프로토콜인 Server Message Block을 윈도우 운영체제 이외에서도 사용할 수 있도록 만들어진 프로그램이다. 자세한건 위키백과의 삼바 (소프트웨어) 항목이라도 참고하도록 하자 (…)

언제나 그렇듯이 명령어들에는 sudo를 따로 넣지 않았으니, 실행해보고는 권한 오류가 발생한다면 알아서(…) 첫머리에 sudo를 넣자.

준비 작업

가장 먼저 당연히 samba를 설치해야 하겠지만, 그 외에 NTFS-3G를 설치해야 한다. 리눅스에도 기본적으로 NTFS 파일 시스템을 사용할 수 있는 모듈이 있고, 그 모듈이 읽기만 지원하고 쓰기는 지원하지 않는다…는 이야기를 들었지만 딱히 사용해보지 않아서 잘 모르겠다. NTFS-3G는 NTFS 파일 시스템에 대해 읽기/쓰기를 동시에 지원하는 모듈이지만, 속도 부분에서 성능 이슈가 있다. 이건 아래쪽에서 짧게 다시 언급.

설마 그럴리는 없겠지만, 만약 외장하드로 FAT32 등 FAT 계통을 사용한다면 이 글 아래쪽의 뽀나스(…)를 참고하자.

아래 명령어로 NTFS-3G와 samba를 설치한다.

이후에는 사용자를 생성한다. 이 사용자는 외부에서 samba로 공유된 공유 폴더에 접근할 때 사용하는 사용자가 될 것이다. 여기서는 사용자 이름을 storage로 지정하려고 한다.

-m 옵션은 사용자 생성 후 홈 디렉토리를 생성해준다.

-G 옵션은 생성된 사용자를 특정 그룹에 소속되도록 하는데, 여기서는 users 그룹에 넣었다.

이렇게 생성된 사용자는 아직 패스워드가 없는 상태이므로 아래 명령어를 입력해서 패스워드를 생성해준다.

저장소 연결 및 공유할 폴더 생성

여기까지 진행되었으면 준비는 끝났으니 외장 하드를 라즈베리 파이 USB에 연결하… …면 될 것 같은데, 실제로는 라즈베리 파이의 USB 포트의 전력랑이 모자라서 인식이 안될수가 있다. 이럴때는 라즈베리파이 모델 B+ 에서 외장형 하드디스크(외장하드) 사용하기라는 글을 참고해서 전력량의 제한을 없애거나, 속편하게 외장 전원을 사용하는 USB 허브를 사용하자. 나는 그냥 남는 실은 소문을 듣고 라즈베리파이 살때 같이 샀던 USB 허브를 썼다.

여하튼 연결이 되었다면 장치 이름도 확인할 겸, 제대로 연결되었는지 확인해보자.

fdisk -l 명령어로 파티션 목록을 조회

fdisk -l 명령어로 파티션 목록을 조회

fdisk -l 명령어를 쓴다고 해서 파티션을 초기화한다거나 하는건 아니니 안심하자 정작 내가 MS-DOS때 생각이 나서 쫄았다는게 함정 .

위 결과 화면은 두개의 섹션으로 이루어져 있는데, /dev/mmcblk0p?는 라즈비안이 들어있는 SD 카드를 가리킨다. 당연히 이건 건드리지 않을거고, /dev/sda1이 연결된 USB 외장 하드이다. 즉, 장치 이름이 /dev/sda1이다.

장치 이름이 확인되었으면, 이 장치를 마운트할 마운트 포지션을 만들어야 한다. 마운트 포지션이라고 하니 괜히 단어가 거창하지만, 간단하게 말해서 외장 하드가 연결될 디렉토리 정도로 생각하면 되겠다. 여기서는 /media 디렉토리 아래에 USBHDD001 디렉토리를 만들어서, 이 디렉토리에 마운트를 시키려고 한다.

마운트 포지션을 만들었다면 이제 마운트를 하기 전… …에, 처음에 만든 사용자의 UID를 먼저 확인하자.

cat /etc/passwd

cat /etc/passwd

이건 현재 시스템에 생성되어 있는 유저 목록인데, 가장 마지막줄에  처음에 만든 storage 사용자가 있는게 보인다. :을 기준으로 세번째 항목, 즉 1001이 사용자 storage의 UID이다. 각 필드들의 의미가 궁금하다면 리눅스 /etc/passwd 와 /etc/shadow 필드 설명이라는 글을 참고하자.

UID까지 확인했다면, 외장 하드를 이번에 만든 디렉토리에 마운트하자.

뭔가 옵션이 좀 길고, 다른 사이트에서 보는것과 옵션이 다르기도 한데(…) 옵션은 아래와 같다.

  • -t ntfs-3g
    • 장치의 파일 시스템을 가리킨다. 사실 라즈비안이나 우분투는 NTFS-3G를 설치하면 자동으로 NTFS가 NTFS-3G의 심볼릭 링크가 되기 때문에, 이렇게 하지 말고 -t auto 로 지정해도 상관은 없다.
  • -o uid=1001,umask=000,noatime
    • -o 뒤에 붙는 것들은 마운트시의 옵션들이다. 즉, uid=1001이랑 umask=000, noatime 모두 부가적인 옵션들이다.
    • uid=1001
      • 장치를 특정 사용자의 소유로 마운트한다. 여기서는 위에서 확인한 storage 유저의 UID를 입력했으므로, storage의 소유로 마운트되게 된다. 사실 이 옵션은 없어도 상관없기는 한데, 자세한건 아래에서 다시 언급한다.
    • umask=000
      • 새로 생성될 파일과 디렉토리의 퍼미션 값을 mask 형태로 지정한다. 즉, 000으로 지정한 경우 (777-000)=777, 새로 생성될 파일과 디렉토리의 퍼미션을 777으로 지정한다.
    • noatime
      • 이 옵션은 성능이랑 관계가 있는데, 자세한건 mount 옵션비교 atime, noatime, relatime라는 글을 참고하자. 간단하게만 설명하자면, 파일 액세스시에는 액세스 타임을 기록하지 않고, 디스크에 쓰기 오퍼레이션이 발생했을 때만 시각을 기록한다.

설명이 길었는데, 위와 같이 마운트했다면 외장 하드를 쓸 수 있도록 마운트 된 상태일 것이다. 이대로 외장하드 전체를 공유해도 되겠지만, 나는 외장 하드의 각 디렉토리 별로 따로 목적을 부여해서 사용할 생각이 있기 때문에 공용 디렉토리를 하나 만들기로 했다. 이 부분은 각자 알아서-_- 하면 될거다.

samba 설정

여기까지 진행됬다면, 외장하드도 연결됬고, 공유할 공용 디렉토리도 만들었으니 바로 samba 설정을 하면 되겠다.

먼저, samba의 환경설정 파일인 smb.conf 파일을 삭제 후 다시 신규 생성하자. 기본 환경 파일에는 있는 내용이 많아서 헷갈리기도 하고, 현 시점에서 필요없는 내용(프린터 공유 등)도 있고 해서 굳이 원래 내용을 수정하는 것 보다는 지우고 새로 만드는 편이 깨끗하다고 생각했다.

아래 명령어는 smb.conf 파일을 삭제하지는 않고 파일이름만 바꾸고, 해당 파일을 새로 생성한다.

그러면 새로 생성된 smb.conf 파일을 편집기로 수정하자.

가장 먼저 파일 맨 위에 아래 내용을 작성한다.

여기까지는 samba의 전체 환경이 된다.

아, 그리고 나는 map to guest 옵션의 의미를 아무리 봐도 모르겠는데-_- 아시는 분이 알려주시면 수정해두도록 하겠다 ;;; 그러나 이런 불친절하고 내용도 없는 블로그에 와서 굳이 댓글까지 다는 사람은 없는데…

그리고 그 아래줄부터는 개별 공유 폴더를 설정한다. 위 내용을 그대로 따라왔다면 아래와 똑같이 작성하면 될 것이지만, 조금씩 다르게 진행했다면 개인에 맞춰서 수정하면 될거다.

역시 여기까지 진행되었다면 파일을 저장 후 닫고, 설정 파일이 올바르게 작성되었는지 확인하기 위해 아래 명령어를 입력해보자.

위 명령어 입력했을때, smb.conf 파일에 별다른 오류가 없다면 아래와 비슷하게 출력될 것이다(내 경우에는 위 설정이랑도 약간 다른 부분이 있기 때문에, 결과화면이 약간 다를수도 있겠다).

testparm

testparm

만약 smb.conf 파일에 오류가 있다면 환경설정의 어느 부분에 오류가 있는지를 알려준다. 만약 smb.conf 파일에 오류가 있다면 samba가 구동되지 않을수도 있기 때문에, smb.conf 파일을 수정했다면 한번씩은 termparm을 돌려보자.

여하튼 여기까지 진행했으면 이번엔 samba 유저의 패스워드를 변경해줘야 한다. 여기까지 죽 진행했다면 “뭥미?!” 할 수도 있겠지만-_- 시스템에 만든 유저와 samba 유저는 별개로 지정해야 한다. 이유는 알 수 없지만… 여하튼… 여하튼 아래 명령어로 samba 유저의 패스워드를 변경한다. 내 경우에는 맨 처음에 생성해준 시스템 패스워드와 동일하게 만들었다.

당연히 storage는 맨 처음에 만든 사용자 이름이다. -a 옵션은 정확히는 기억이 안나는데, 아마 강제로 패스워드를 변경하게 하는 옵션이었던거 같다. 예를 들어서 위 명령어에 -a 옵션을 빼고 입력하고서 패스워드 입력시 그냥 엔터를 치면 오류가 나는데, -a 옵션을 주면 깔끔하게 패스워드를 없애준다(?!).

사실 이 문제에 대해서는 passwd 파일과 smbpasswd 파일을 동기화시켜주는 스크립트를 짜라느니, smb.conf 파일에 설정을 해 두면 굳이 smbpasswd를 쓰지 않아도 된다느니 하는 이야기들이 있었지만, 해보지는 않아서 잘 모르겠다.

여하튼 여기까지 진행했다면 이제 samba를 재시작해보자.

여기까지 진행됬다면, 동일 네트워크 상에서 접속 및 데이터 액세스가 원할하게 진행되는지 확인해보면 되겠다.

탐색기를 실행해서 samba로 공유한 폴더를 확인해보기

탐색기를 실행해서 samba로 공유한 폴더를 확인해보기

정상적으로 설정됬다면 윈도우 탐색기에 smb.conf 파일에 설정한 server string 이름으로 컴퓨터가 나타난다. 아니면 Win+R을 눌러서 실행창에 “\\{라즈베리파이 IP}”를 입력해서 접속할 수도 있다. 맥에서는 바탕화면에서 Cmk+K 또는 파인더를 띄운 뒤 이동 > 서버에 연결을 선택해서. “smb://{라즈베리파이 IP}”를 입력한 뒤 연결 버튼을 클릭하자.

해당 컴퓨터로 접속해서 공유 폴더로 접근하려 하면 계정을 묻는데, 처음에 만들어준 사용자 이름과 나중에 지정해준 samba 패스워드를 입력해주면 되겠다. 그리고 해당 폴더에 파일 복사나 폴더 만들기 등이 제대로 되는지 확인해보면 되겠다.

영구적 마운트 설정하기

여기까지 진행했다면 별 문제없이 내부 네트웍에서 공용 저장소로 사용할 수 있지만, 라즈베리 파이를 재시작하면 다시 mount 명령어를 입력해서 새로 마운트시켜줘야 한다는 불편함이 있다. 이럴때는 영구적 마운트를 설정해두면, 라즈베리 파이를 재시작해도 자동으로 해당 장치를 마운트해주므로 편리하다.

영구적 마운트를 설정하기 위해서는 /etc/fstab 파일을 수정해야 한다. 언제나 그렇듯이 수정하기 위해서는 관리자 권한이 필요하다.

위 파일을 열어서 맨 아래줄에 아래와 같은 줄을 삽입한다.

각 항목은 탭으로 구별한다. 즉, 각 항목 사이에서 탭 키를 눌러서 공간을 벌려준다.

탭 기준으로 각 항목은 아래의 의미이다.

  • /dev/sda1
    • 마운트하려는 장치의 장치 명
  • /media/USBHDD001
    • 장치가 마운트될 마운트 포지션
  • ntfs-3g
    • 해당 장치의 파일 시스템. 마운트 명령에서 -t 옵션을 지정해줬던걸 그대로 쓰면 된다.
  • default,uid=1001,umask=000,noatime
    • 마운트 옵션. -o 옵션에서 지정해줬던걸 그대로 쓰면 된다. default는 사실 지정 안해줘도 되는데, 가장 기본적인 권한 옵션이다.
  • 0
    • 덤프 옵션으로, 0으로 지정하면 덤프 불가능하게 설정한다.
  • 0
    • 무결성 검사 옵션으로, 마찬가지로 0으로 지정하면 무결성 검사를 하지 않는다.

여기까지 설정하고 라즈베리 파이를 재시작해보면, 여전히 /media/USBHDD001 디렉토리에 외장 하드가 마운트되어 있는 것을 확인할 수 있다.

samba 데몬 자체는 시스템이 시작될 때마다 자동으로 구동되므로, 딱히 설정할 것은 없다.

뽀나스 (…)

외장하드가 FAT32인 경우

설마 요즘 시대에 그럴리는 없겠지만(…) 외장하드가 NTFS가 아니라 FAT32 등 FAT 계열일 경우, 아래와 같은 문제가 발생한다.

  • 공유된 폴더에 권한이 올바르게 부여되지 않아 접속이 불가하거나, 접속이 되더라도 데이터를 저장할 수 없다.
  • 권한을 올바르게 부여한다 하더라도, 한글 등 2바이트 문자가 들어간 파일이나 폴더를 생성할 수 없다.

첫번째 문제의 경우, FAT 계통은 파일 시스템 차원에서 유저의 권한을 지원하지 않기 때문에 발생하는 것 같다. 이 사태를 해결하기 위해서는 아예 마운트할때, samba 유저를 소유자로 지정해서 마운트하는게 가장 속편하다. 위에서 마운트할때 -o uid=1001로 소유자를 지정해준 이유가 이것으로, 이 문제 때문에 이것저것 실험하다 보니 아예 습관이 되어서 본문에도 지정해줬다 (…)

두번째 문제의 경우, 비슷하게 FAT 계통은 캐릭터셋을 지정해주지 않으면 데이터가 ANSI로 처리되기 때문인 것 같다. 이건 마운트하면서 iocharset으로 유니코드를 지정해주면 해결된다.

위 해결책을 모두 적용한 마운트 명령어는 아래와 같다.

그러니 우리는 FAT32를 멀리하고 걍 NTFS를 쓰는것이 낫습니다.

NTFS-3G의 성능 이슈

사실 NTFS-3G에는 성능적인 이슈가 있다. 작은 파일을 액세스할때는 크게 문제가 되지 않지만, 용량이 큰 파일을 액세스할때는 속도가 많이 느려진다는 것이다. 참고 페이지는 아래와 같다. 사실, 둘 다 같은 내용의 페이지다.

간단히 정리하면, NTFS-3G는 FUSE라는 파일 시스템 인터페이스를 이용하는데, FUSE는 일반 커널 드라이버가 아닌 사용자 영역 드라이버로 동작하기 때문에 일반 커널 드라이보다 속도가 느리다는 이야기. 2011년도에 작성된 글이라 지금도 해당되는 이야기인지는 잘 모르겠다. 하지만 NTFS-3G가 FUSE를 쓴다는 이야기는 지금도 해당되는 이야기인 것 같다.

일단 관련 글들을 찾아보면, 당시 글들의 경우 NTFS-3G를 계속 사용하다가 결국 ext4 등 리눅스 파일시스템으로 넘어가고 말았다는 글들이 좀 있었다.

웹 환경에서 samba 설정하기

웹 환경에서 samba를 설정해줄 수 있는 swat이라는게 있다. 아래 명령어로 swat을 설치할 수 있다.

그런데 swat의 경우, 접속자에게 root 권한을 부여해줘야 하는데 이 부분에서 잘 안되서 포기했다. 사실은 간단하게 root의 패스워드를 지정해주고 해당 패스워드로 접속하면 되지 않나 싶기도 했지만, 딱히 root의 패스워드를 지정해줄 생각이 없었기 때문에 그냥 포기했다.

접속자 확인 방법

라즈베리 파이에 설정해 둔 공유 폴더에 접속한 사용자를 조회해보기 위해서는 smbstatus 명령어를 사용하면 된다.

출처 및 참고 웹사이트

, , ,

Previous Posts Next posts