PyQt는 C++ UI 크로스 플랫폼 프레임워크인 Qt 프레임워크를 파이썬으로 작업할 수 있게 도와주는 라이브러리입니다. 해당 라이브러리에서는 GUI/XML/SQL 작업을 진행할 수 있습니다.


설치 방법


Windows

pip3 install PyQt5


OSX

brew install pyqt


참조 : https://help.ubuntu.com/community/CronHowto


Crontab은 특정 시간에 설정해놓은 커맨드를 실행하는 서비스입니다.


특정 시간에 실행할 커맨드를 등록하는 Crontab 파일을 수정할 수 있게 해주는 명령어입니다. 첫 실행 시, 파일 에디터를 선택합니다. 저장하고 마치면 자동으로 Crontab에 install해줍니다.

crontab -e


특정 시간에 root권한으로 실행할 커맨드를 등록하는 Crontab 파일을 수정할 수 있게 해주는 명령어입니다. 위와는 다른 파일이 열립니다. 마찬가지로 저장하고 마치면 자동으로 Crontab에 install해줍니다.

sudo crontab -e


위에서 등록한 Crontab파일을 제거하는 명령어입니다.

crontab -r

sudo crontab -r


크론탭 파일을 열면 아래와 같은 문서가 보입니다.

# Edit this file to introduce tasks to be run by cron.

# Each task to run has to be defined through a single line

# indicating with different fields when the task will be run

# and what command to run for the task

# To define the time you can provide concrete values for

# minute (m), hour (h), day of month (dom), month (mon),

# and day of week (dow) or use '*' in these fields (for 'any').# 

# Notice that tasks will be started based on the cron's system

# daemon's notion of time and timezones.

# Output of the crontab jobs (including errors) is sent through

# email to the user the crontab file belongs to (unless redirected).

# For example, you can run a backup of all your user accounts

# at 5 a.m every week with:

# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

# For more information see the manual pages of crontab(5) and cron(8)

# m h  dom mon dow   command

해당 문서에 아래와 같은 명령어를 추가해줍니다.

분 시 일 월 요일 /usr/bin/somedirectory/somecommand

분 : 0~59

시 : 0~23 (0 : 자정)

일 : 1~31

월 : 1~12

요일 : 0~6(0 : 일요일)


아래는 예시입니다.

1월 1일 월요일 4시 1분에 /usr/bin/somedirectory/somecommand를 실행하는 Crontab line입니다.

01 04 1 1 1 /usr/bin/somedirectory/somecommand

매일 4시 1분에 /usr/bin/somedirectory/somecommand를 실행하는 Crontab line입니다.

01 04 * * * /usr/bin/somedirectory/somecommand

요일은 상관없이 1월, 6월 1일부터 15일까지 4시, 5시 1분, 31분 마다 /usr/bin/somedirectory/somecommand를 실행하는 Crontab line입니다.

01,31 04,05 1-15 1,6 * /usr/bin/somedirectory/somecommand

매 10분마다(0분, 10분, 20분, 30분, 40분, 50분) /usr/bin/somedirectory/somecommand를 실행하는 Crontab line입니다.

*/10 * * * * /usr/bin/somedirectory/somecommand


아래는 시간 위치에 사용할 수 있는 특수한 문자열입니다.

string

meaning

@reboot

컴퓨터가 실행될 때 실행합니다.

@yearly

매년 1월 1일 0시 0분에 실행합니다.(0 0 1 1 *)

@annually

@yearly와 같습니다.

@monthly

매달 1일 0시 0분에 실행합니다. (0 0 1 * *)

@weekly

매주 일요일 0시 0분에 실행합니다. (0 0 * * 0)

@daily

매일 0시 0분에 실행합니다. (0 0 * * *)

@midnight

@daily와 같습니다.

@hourly

Run once an hour, "0 * * * *".


아래와 같이 사용할 수 있습니다.

@reboot /path/to/execuable1


crontab 로그 확인(logging)

cat /var/log/syslog 를 통해 crontab의 실행 여부를 확인할 수 있습니다.

postfix를 설치(sudo apt-get install postfix)하시면 cat /var/mail/username를 통해 crontab이 남긴 log를 확인하실 수 있습니다.

아니면 아래를 통해 사용자 정의한 위치에 로그를 남기실 수 있습니다.

01 14 * * * /path/to/myscript >> /home/log/myscript.log 2>&1

14시 1분에 /path/to/myscript를 실행한 후, 로그를 /home/log/myscript.log에 저장합니다.
여기서 2>&1은 stderr를 stdout으로 변경한다는 뜻입니다.


참고 : http://www.techjawab.com/2014/08/how-to-install-transmission-on.html



Transmission 설치

sudo apt-get update sudo apt-get install transmission-daemon



디렉토리 생성

mkdir /your/torrent/directory/inprogress mkdir /your/torrent/directory/complete

 원하는 디렉토리에 inprogress(다운로드 중) 폴더와 complete(다운로드 완료) 폴더를 생성합니다.



권한

sudo usermod -a -G pi debian-transmission

 Transmission은 debian-transmission이라는 유저로써 실행됩니다. 보안 문제 때문에 유저를 변경하는 것은 권장하지 않는다네요. 그렇기 때문에 다운로드 디렉토리에 접근을 위하여 이 유저의 설정을 변경하는 명령어를 입력합니다. 위 명령으로 debian-transmission에 pi그룹을 더해주게됩니다.



Transmission 설정 변경

sudo vim /etc/transmission-daemon/settings.json

 Transmission의 설정 파일은 /etc/transmission-daemon/settings.json 입니다.

여기서 download-dir, incomplete-dir, rpc-username, rpc-password를 수정해주시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
{
    "alt-speed-down"50,
    "alt-speed-enabled"false,
    "alt-speed-time-begin"540,
    "alt-speed-time-day"127,
    "alt-speed-time-enabled"false,
    "alt-speed-time-end"1020,
    "alt-speed-up"50,
    "bind-address-ipv4""0.0.0.0",
    "bind-address-ipv6""::",
    "blocklist-enabled"false,
    "blocklist-url""http://www.example.com/blocklist",
    "cache-size-mb"4,
    "dht-enabled"true,
    "download-dir""/your/torrent/directory/complete",
    "download-limit"100,
    "download-limit-enabled"0,
    "download-queue-enabled"true,
    "download-queue-size"5,
    "encryption"1,
    "idle-seeding-limit"30,
    "idle-seeding-limit-enabled"false,
    "incomplete-dir""/your/torrent/directory/inprogress",
    "incomplete-dir-enabled"false,
    "lpd-enabled"false,
    "max-peers-global"200,
    "message-level"1,
    "peer-congestion-algorithm""",
    "peer-id-ttl-hours"6,
    "peer-limit-global"200,
    "peer-limit-per-torrent"50,
    "peer-port"51413,
    "peer-port-random-high"65535,
    "peer-port-random-low"49152,
    "peer-port-random-on-start"false,
    "peer-socket-tos""default",
    "pex-enabled"true,
    "port-forwarding-enabled"false,
    "preallocation"1,
    "prefetch-enabled"1,
    "queue-stalled-enabled"true,
    "queue-stalled-minutes"30,
    "ratio-limit"2,
    "ratio-limit-enabled"false,
    "rename-partial-files"true,
    "rpc-authentication-required"true,
    "rpc-bind-address""0.0.0.0",
    "rpc-enabled"true,
    "rpc-password""password",
    "rpc-port"9091,
    "rpc-url""/transmission/",
    "rpc-username""username",
    "rpc-whitelist""127.0.0.1",
    "rpc-whitelist-enabled"true,
    "scrape-paused-torrents-enabled"true,
    "script-torrent-done-enabled"false,
    "script-torrent-done-filename""",
    "seed-queue-enabled"false,
    "seed-queue-size"10,
    "speed-limit-down"100,
    "speed-limit-down-enabled"false,
    "speed-limit-up"100,
    "speed-limit-up-enabled"false,
    "start-added-torrents"true,
    "trash-original-torrent-files"false,
    "umask"18,
    "upload-limit"100,
    "upload-limit-enabled"0,
    "upload-slots-per-torrent"14,
    "utp-enabled"true
}
cs



Reload Transmission

sudo service transmission-daemon reload


접속

http://your_raspberry_pi_IP:9091

 위에서 설정한 아이디와 패스워드로 접속하시면 아래의 창을 보실 수 있을꺼에요.

403:Forbidden 에러


 다시 /etc/transmission-daemon/settings.json를 열어서 "rpc-whitelist-enabled"를 false로 변경해주시거나 "rpc-whitelist"에 접속하는 ip를 추가해주시면 됩니다.

안드로이드폰에 apk파일을 adb로 인스톨할 때,


protocol fault couldn't read status에러가 발생하면 


cmd를 켜서 adb kill-server 명령어를 실행해주시면 됩니다.


adb는 [android sdk폴더/platform-tools]폴더 에 있습니다.

Apache2 설치

위 명령어를 입력하시면 apache2를 설치하게 됩니다.


그리고 라즈베리 파이에서는 127.0.0.1, Lan 통신망 내에서는 라즈베리파이의 ip주소(192.168.x.x)를 웹브라우저로 접속하시면 아래의 창이 뜨게 됩니다.


페이지 디렉토리 설정

/var/www/html/

 페이지의 기본 경로는 /var/www/html입니다. 페이지를 수정하고 싶으시면 이 경로에 index.html을 수정하던 파일을 추가하던 하시면 됩니다.

 하지만 경로를 변경하고 싶다면!

/etc/apache2/apache2.conf/etc/apache2/sites-available/000-default.conf를 변경해주시면 됩니다.


Apache2.conf 변경

 해당 파일에서 쭈욱 내려가다보면

1
2
3
4
5
6
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
 
cs
이 코드가 나오는데 이것을

1
2
3
4
5
6
<Directory /your/webpage/directory/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
 
cs

이렇게 변경해주시면 됩니다. html 상위 폴더여야합니다.


000-default.conf 변경

해당 파일을 열면

1
2
        DocumentRoot /var/www/html
 
cs

가 나옵니다. 이것을

1
2
        DocumentRoot /your/webpage/directory/html
 
cs

로 변경해주시면 됩니다. html폴더까지 적어주셔야합니다.


발생가능한 문제

Forbidden

You don't have permission to access / on this server.

라는 문제가 발생하실 수 있습니다.


권한관련된 에러이고, 저같은 경우는 아래의 방법으로 해결했습니다.

sudo chown -R www-data:www-data /your/webpage/directory 
sudo chmod -R 775 /your/webpage/directory 


외장하드 장치 정보 얻기

현재 하드디스크들의 파일시스템 정보를 얻어옵니다.

sudo blkid

Seagate Expansion Drive가 보입니다. 그럼 /dev/sda1가 외장하드 파일입니다.

여기서 추가적인 설명을 덧붙이면,

/dev 폴더는 장치파일들(device files)을 모아놓은 곳이고, sda1은 두번째 하드디스크라는 소리입니다.(첫번째 하드디스크는 sda, 위의 /dev/mmcblk0p들은 sda의 파티션) 기본적으로 저 파일은 Directory가 아니라서 접근이 불가능합니다. 그리고 이것을 접근할 수 있도록 하는 것이 mount 명령어입니다.

이제 다음 명령어를 입력해봅시다.

sudo fdisk -l

 fdisk 명령어는 파티션을 관리하는 명령어입니다. 다른 정보들은 지금 저희에게는 별로 중요하지 않으니 패스하고 마지막줄의 /dev/sda1를 확인해주세요. 현재 /dev/sda1의 정보를 확인할 수 있습니다.


외장하드 마운트

/dev/sda1을 ~sda1로 마운트하겠습니다.

sudo mount /dev/sda1 ~/FTP/sda1


다음으로 마운트한 폴더에 접근 권한을 부여합니다.

sudo chmod 775 ~/sda1

~/폴더에 sda1폴더가 생성된 것을 확인할 수 있을 것입니다.


이제 마운트 정보를 기억하고 재부팅 시, 자동 마운트할 수 있도록 설정해봅시다.

sudo vim /etc/fstab

/etc/fstab은 하드디스크의 마운트 정보를 담고 있는 설정파일입니다.

마지막줄에 아래의 정보를 입력해봅시다.

/dev/sda1 /home/pi/FTP/sda1 ntfs defaults 0 0

위와같이 입력을 완료하시면 :wq로 저장 후 종료를 하시면 재부팅시에도 계속 마운트돼있는 것을 확인하실 수 있을 것입니다.


아래의 명령어로 마운트를 해제하실 수 있습니다.

sudo umount ~/FTP/sda1



저는 라즈베리파이 Documentation에 있는 자료를 참고하여 구축했기 때문에 PURE-FTPD를 기반으로 설명해드리겠습니다.

https://www.raspberrypi.org/documentation/remote-access/ftp.md


PURE_FTPD 설치

다음 문장을 터미널에 입력해 apt-get을 설치합니다.

sudo apt-get install pure-ftpd


기본 설정

기본적으로 리눅스에서 ftp를 위한 그룹을 만들고 ftp에서 사용할 유저를 추가해주어야합니다.

groupadd ftpgroup
useradd ftpuser -g ftpgroup -s /sbin/nologin -d /dev/null

groupadd [groupname]

[groupname]라는 사용자 그룹을 추가하는 리눅스 명령어입니다.

useradd [username]

[username]라는 사용자를 추가하는 리눅스 명령어입니다.

-g [groupname] [groupname]그룹에 유저를 추가합니다.

-s [authorization] [authorization]권한을 유저에게 부여합니다.

/sbin/nologin

쉘 권한이 없어서 SSH접속을 하지 못하도록 하는 명령

-d [home_directory] [home_directory]위치에 사용자 계정의 홈 디렉토리를 생성합니다.

/dev/null

홈디렉토리를 생성하지 않습니다.


FTP 홈 디렉토리, 가상유저와 유저 그룹

FTP용 디렉토리를 추가합니다.

sudo mkdir /home/pi/FTP

ftpuser에게 FTP용 디렉토리 접근 권한을 부여합니다.

sudo chown -R ftpuser:ftpgroup /home/pi/FTP

ftp에 upload라는 가상 유저를 만들어 ftpgroup에 있는 ftpuser를 매핑합니다.

pure-pw useradd 명령이 실행되고 나면 곧바로 password를 입력할 수 있게됩니다.

sudo pure-pw useradd upload -u ftpuser -g ftpgroup -d /home/pi/FTP -m

pure-pw useradd [username]

[username]이라는 ftp 가상 유저를 추가합니다.

-u [system_username]

시스템에 있는 유저이름을 넣어줍니다.(해당 유저의 권한과 같은 설정을 매핑하는데 사용됩니다.)

-g [system_usergroup]

시스템에 있는 유저그룹을 넣어줍니다.(해당 유저의 권한과 같은 설정을 매핑하는데 사용됩니다.)

-d [directory]

해당 유저의 ftp 루트 디렉토리

-m

??? 아시는분 있으면 댓글 좀ㅠㅠ


이제 다음으로는 user database를 생성해줍니다.(신규유저 추가 및 비밀번호 변경등의 행동을 하면 db갱신을 위해 반드시 호출해줘야합니다.)

sudo pure-pw mkdb

이제 생성된 db를 인증을 위해 /etc/pure-ftpd/auth/폴더에 소프트 링크해줍니다.

ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/60puredb


pure-ftpd를 재시작합니다.

sudo service pure-ftpd restart


세팅 끝


https://download.pureftpd.org/pub/pure-ftpd/doc/README.Virtual-Users

다른 명령어는 위의 페이지를 참조해주세요.

유동아이피

 - DHCP로부터 할당받은 IP.
해당 mac adress를 기억하여 일정시간(iptime에서는 IP 대여 시간이라고 부름) 이상 네트워크에 접속하지 않으면 다른 주소로 재할당 받게 됨


고정아이피

자신이 설정한 주소로 할당받는 IP
(설정을 취소하지 않는 한 변하지 않음)

굳이 외부에서 접속할일이 없는 경우에는 관리의 편리함을 위해 유동아이피를 사용하겠지만 그 반대의 경우에는 IP가 바뀔때마다 설정을 바꾸는 것은 매우 비효율적이니 고정아이피를 사용해야합니다.


일단 vim을 설치합니다.

(vi에 경우 원격접속시 버그가...)


그 다음에는 /etc/network/interfaces를 수정해야합니다.



Before


After


위에서 아래로 수정을 하셔야합니다.

저는 192.168.0.240으로 할당받았습니다.


간단하게 몇가지만 설명해드리겠습니다.

iface eth0 inet manual이 있습니다.

주목해주실 부분은 iface eth0 inet manual(혹은 dhcp)입니다.

inet manual은 ip를 정의하지 않고 네트워크 인터페이스를 생성하는 설정입니다. 보통 vlan이나 link aggression 같은 곳에서 사용된다고 합니다.

dhcp는 DHCP로부터 IP를 할당받게 하는 설정입니다.


고정아이피를 사용할 것이니 이부분을 inet static으로 변경합니다.

static ip 즉, 고정 아이피를 정의하겠다는 소리입니다.


이하, 추가적인 설정입니다.

address (고정아이피 주소)
netmask (서브넷 마스크)
network (네트워크 아이디)
broadcast (브로드캐스트 마스크)
gateway (게이트웨이 주소)


설정이 끝났으면 저장한 후 네트워크를 재시작합니다.

그리고 재부팅을 합니다.


ifconfig를 이용해 설정한 아이피로 변경 됐는지 확인해주세요.

드디어 라즈베리파이2 모델B를 구매했습니다!


웬만한 NAS 서버보다 성능이 좋은 라즈베리파이2 모델B입니다.

생각보다 훨씬 작더라구요.



Micro SD card는 Samsung EVO UHS 등급1 32G을 사용하였습니다.

(sd card performance 비교. http://elinux.org/RPi_SD_cards#SD_card_performance)


설치도 아주 간략하게 바뀌었습니다.

기존에는 홈페이지에서 raspbian 다운 받고, image writer 설치해서 sd card에다 image write 하고 꼽아서 사용했었는데 이제는 noobs 하나면 설치가 끝납니다.


https://www.raspberrypi.org/downloads/noobs/

위 사이트에서 noobs 다운받고 압축 풀어서 안의 내용물을 sd card에다가 옮기면 끝!

(noobs는 라즈비안을 간편하게 설치해주는 소프트웨어입니다.)


이제 1A 이상인 Micro 5pin 충전기를 꼽아주면 부팅이 됩니다. 부팅버튼이 따로 없습니다.


그렇게 실행을 시켜주면

(id : pi, pw : raspberry, 나중에 passwd 명령으로 바꾸시면됩니다.)


 

라즈베리파이가 설치됐네요

현재 cocos2d-x 3.4버전(ndk r10c)를 사용중인데

ios에서는 to_string사용이 가능하나

android빌드시 error: 'to_string' was not declared in this scope 에러를 뱉습니다.

ndk r10c에서는 to_string함수가 존재하지 않는듯 합니다.


다행히 cocos2d라이브러리 안에 아래의 주석코드가 있네요.

말대로 stringstream을 사용합시다.

    // std::to_string is not supported on android, using std::stringstream instead.


string to_string(int value)
{
    stringstream strStream;
    strStream<<value;
    return strStream.str();
}


위와 같이 사용을 해주시면 됩니다.

+ Recent posts