윈도우에서 마우스 커서 이동시키는 작업이 필요할 것 같아서 구글링을 해보았다.[각주:1][각주:2][각주:3][각주:4]


 먼저 알아야 되는 구조체는 다음과 같다.


 typedef struct tagPOINT {

   LONG x;

   LONG y;

 } POINT, *LPPOINT;


 이것은 position의 점을 정의 내리는 것으로 2차원 평면에서의 독립 변수 x, y를 가지는 구조체이다.

 마우스 커서 위치 또한 평면 위에 존재하는 것이기 때문에, POINT라는 값을 가진다.


 원본 함수.

 BOOL WINAPI GetCursorPos(

   _Out_ LPPOINT lpPoint

 );


 _Out_LPPPOINT라는 것은 POINT를 변수로 가지는 point 구조체 매개변수이다.

 여기에 값을 LPPOINT라는 걸로 가지기 때문에, POINT로 값을 가지고 올 수 있다.


 마우스 커서의 위치를 이동을 하도록 만드는 방법이 있다.


 마우스의 위치를 자동으로 할 수 있다.


 원본 함수.

 BOOL WINAPI SetCursorPos(

   _In_ int X,

   _In_ int Y

 );


 이것들은 전부다 정의한 것으로

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
#include <stdio.h>
 
#include <conio.h>
 
#include <windows.h>
 
int main()
{
    POINT p;
    
    printf("마우스 위치를 100, 100으로 이동시킵니다.\n");
    
    SetCursorPos(100,100);
    
    do{
        GetCursorPos(&p);
        printf("마우스 위치 (x, y) : (%d, %d)\n",p.x, p.y);
        if(kbhit())
        {
            break;
        }
    }while(1);
    
    return 0;
}
cs


 이런 소스를 만들면, 100, 100으로 이동한 후에 현재 마우스 위치를 파악할 수 있게 된다.

  1. http://breadlab.net/165 (2016-06-06) [본문으로]
  2. https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms648394(v=vs.85).aspx (2016-06-06) [본문으로]
  3. https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms648390(v=vs.85).aspx (2016-06-06) [본문으로]
  4. https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms648383(v=vs.85).aspx (2016-06-06) [본문으로]
Posted by JunkMam
,

 GAS란, GNU ASsembler 라는 약자로 GNU 측에서 만든 어셈블러이다.


 OS을 만들어 보자. 라는 책들이나 인터넷 강의들을 보면, 보통 설명해주는 곳에서는 대부분 NASM을 이용하는 방법을 설명이 되어있다.


 필자는 GAS로도 가능한 것으로 기억하고 있기 때문에(NASM 만들어지기 전에도 대부분 만들어 냈으니.) 이걸 알아보기 위해서 구글링을 하니. 답을 찾아서 기록을 위해서 글을 작성한다.


 찾아낸 사이트는 외국에서 질문을 답변해준 사이트에서 적혀 있다.

 http://stackoverflow.com/questions/12650291/how-to-locate-a-variable-correctly-in-att-assembly[각주:1]


 찾아낸 사이트에는 GAS만 사용할 수 있는게 아니다.

 해당 사이트에서 설명되어있는 소스 사이트를 보면, 다음과 같이 설명이 되어 있다.


 GAS로 object 파일을 만든다.

 objcopy로 object 파일을 binaray 파일로 출력하도록 만든다.


 이렇게 사용하면, NASM을 사용하지 않아도 된다.


 GAS로만으로 만들 수 없는 이유는 다음과 같다.


 GAS는 Object 파일을 만드는 것이다. 여기서 binary 형태로 설정하는디 PE 파일로 설정하는지 ELF 형태로 하고자하는지 설정하는게 따로 있지 않다.

 그러므로 Object 파일을 Copy하는 도중에 binary 파일 형태로 변환시켜서 올리게 만드는 형태를 취한다.


 

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
.text
.global     _start
.code16
 
_start:
movw    %cs, %ax
movw    %ax, %ds
movw    %ax, %es
call    hello
jmp     .
 
.org    0x10
 
hello:
movw    $message, %ax
movw    %ax, %bp
movw    $13, %cx
movw    $0x1301, %ax
movw    $0x000c, %bx
movb    $0, %dl
int     $0x10
ret
 
message:    
.ascii  "Hello, World!"
 
.org    0x01fe
.byte   0x55
.byte   0xaa
cs



 이렇게 해서 나오는 값이 이상이 없는데, .fill이라는 방법과 .org라는 방법 2가지가 있는걸 확인 되었다.

 .fill을 사용해서 만들었었는데, fill은 유동적인 값을 사용해선 안된다. 라는 오류가 뜨면서, 제대로 작동이 안된다.

 그렇기 때문에, 유사한 명령어를 찾고 있었다. 구글링을 하다가. 드디어 .org라는 명령어를 찾게되었다.

 다음부터는 .org을 사용하는 것을 해야겠다.


boot.img

boot.o

boot.s


  1. 검색 일자 : (2016-06-04) [본문으로]
Posted by JunkMam
,

 전에 올린 Youtube 영상을 가지고오는 장치를 만들었었다.


 문제는 이 장치가 모바일에서는 엄청 크게 나오는 문제점이 있으며, 조절해봤자. 방해만 준다고 판단되었다.(이거 작성하고 있을때, 이미 적용 시켰다.)

 모바일에서는 작동을 안하도록 만들기 위해서 다음과 같은 방법을 사용할려고 한다.


 다음 사이트에서 아주 간단하게 구현 되어 있는게 있어서 작성한다.


 http://stackoverflow.com/questions/11381673/detecting-a-mobile-browser


 여기서 다음과 같은 소스를 사용한다.


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var isMobile = {
    Android: function() {
        return navigator.userAgent.match(/Android/i);
    },
    BlackBerry: function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },
    iOS: function() {
        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
    },
    Opera: function() {
        return navigator.userAgent.match(/Opera Mini/i);
    },
    Windows: function() {
        return navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};
cs



 여기서 나오는 navigator는 클라이언트의 정보가 일부 저장되어 있다.

 그래서 이 정보에 있는 userAgent를 이용해서 사용자의 디바이스의 정보를 가지고와서 비교한다.


 이렇게 하면, 디바이스에 따른 효과를 얻을 수 있게 된다.

Posted by JunkMam
,

 Virtual Box가 호스트와 게스트로 나뉘어 진다. 하지만, 여기서 호스트와 게스트로 연결해서 간단하게 처리가 가능하다.


 하지만, Linux에서의 Shell은 제대로 복사 붙이기, 파일 등을 옮겨가는게 쉬운 일은 아니게 된다.


 Linux OS 들(CentOS, Red Hat 등)은 SSH가 자동으로 깔려 있는 경우가 많다.

 즉, 원격으로 컨트롤이 가능해진다. 라는 뜻이다.


 이것으로 공격을 받을 수도 있지만, 반대로 잘만 쓰면 이득이 된다.



 먼저 VirtualBox을 연다.

 여기서 VirtualBox에서


 파일- 환경설정


 이런식으로 메뉴를 누르면 다음과 같은 창이 뜬다.(초기 단축키 : ctrl+g)




 여기서, 네트워드 - 호스트 전용 네트워크 에 들어간다.

 이렇게 하면 지금의 사진처럼 VirtualBox Host-Only Ethernet Adapter 라는게 있는데, 거기서 Host의 IP가 나오게 된다.



 호스트 IP이다. 일반적으로 그냥 설정하면, 192.168.56.1이 되기도 하며, 저걸 수정을 가할 수도 있다.

 여기서 IP을 복사해서 들고오자.

 참고로, 저것은 CMD에서 ipconfig로도 확인을 할 수 있다.

 굳이 저렇게 확인 안해도 된다는 뜻이다.



 이제, 호스트 IP와 게스트 IP을 연결하는 걸 하자.

 게스트 설정에 들어가면, 현재의 사진처럼 나오게 된다. (초기 단축키 : crtl+s)



 네트워크 탭에 들어가면, 현재의 사진처럼 나오게 된다.

 여기서 포트 포워딩을 누르면, 다음과 같은 창이 뜨게된다.



 여기서 +아이콘을 클릭해 포트 포워딩의 규칙을 만들고, 이 만들것을 가지고 호스트와 게스트를 연결한다.

 여기서 게스트 IP는 게스트를 실행 시킨 후에 나오는 eth0 IP을 적용시키면 된다.


 이렇게해서 포트 포워딩으로 호스트와 게스트를 연결 할 수 있으며, 이 연결한 결과가 SSH의 원격 컨트롤이 된다.


 이걸 이용해서 복사 붙이기가 지원되는 SSH Client을 사용하면서, 손쉽게 서버를 세팅하거나, 다룰 수 있게 된다.

 그리고 파일을 주고 받기도 쉬워진다.(scp 장치를 이용해서 말이다.)


Posted by JunkMam
,

 AMP라고 해서 Apache, MySQL(MariaDB), PHP을 사용해서 처리할 수 있다.


 PHP는 Apache가 요청을 받은 것을 PHP에게 보내서 처리를 하고 PHP는 DB랑 연결되서 처리해준다.


 즉, 모든 요청을 Apache가 처리해주는게 아니다.(그리고 이렇기 때문에 속도가 조금 느린 부분이 있는 걸로 알고 있다.)


 PHP는 다음에 들어가면, 구할 수 있다.

 사이트 : https://secure.php.net/downloads.php


 



 PHP을 설치한 후에 확인 한다면,


 ./configure --prefix=/usr/local/php \

--disable-debug \

--enable-mailparse \

--enable-calender \

--enable-sysvsem=yes \

--enable-sysvshm=yes \

--enable-ftp \

--enable-mgic-quotes \

--enable-gd-native-ttf \

--enable-url-includes \

--enable-trans-id \

--enable-inline-optimization \

--enable-bcmath \

--enable-exif \

--enable-sigchild \

--enable-mbstring \

--enable-safe-mode \

--enable-sockets \

--with-apxs2=/usr/local/apache/bin/apxs \

--with-mysql=/usr/local/mariadb5.5/ \

--with-config-file-path=/usr/local/apache/conf \

--with-mod-charset \

--with-charset=utf8 \

--with-xml \

--with-language=korean \

--with-jpeg \

--with-png \

--with-zlib \

--with-jpeg-dir=/usr \

--with-png-dir=/usr/lib \

--with-freetype-dir=/usr \

--with-libxml-dir=/usr \

--with-gd \

--with-ttf \

--with-gettext \

--with-openssl;


다음과 같은 오류가 날 수가 있다.


 perl등이 Apache에 제대로 설치할때, 안되어 있기 때문이다.

 이 경우에는 Apache을 새로 깔아 주는게 좋다.


 이렇게 한 후에 다시 돌린다.


 다음과 같은 오류가 뜨는데, 이 경우에는 freetype과 freetype-devel을 설치한다.


 초기화가 완료되었다.

 현재 방식을 하는데, 경고가 받아진다.

 경고는 후에 문제를 일으키니, 나중에 찾아서 해결 방법을 기록해야겠다.


 make && make install;


 이렇게 해서 PHP가 설치가 완료된다.


 PHP와 Apache을 연결시키기 위해서 작업하는게 따로 있다.


 먼저 PHP을 설치할때, Apache 경로를 설정했다.

 그 이유는 Apache와 PHP와 연동하기 위해서 설정한 것이다.


 PHP5를 제대로 동작 시키기 위해선, 다음 같은 모듈이 추가 되어야 된다.


 LoadModule php5_module modules/libphp5.so


 libphp5.so는 php5을 실행 시키는 명령(함수)들이 저장되어있는 동적 라이브러리이다.

 Apache가 요청을 받아들인 후에 PHP에게 보낼때, 이걸 이용해서 처리한다라고 봐도 된다.


 만약, 확장자에서 php가 들어간다면, PHP을 실행 시키기 위해서 Type을 추가시켜줘야한다.


 <ifModule></ifModule> 사이에 다음과 같은 문구를 추가한다.


 AddType application/x-httpd-php .php

 AddType application/x-httpd-php-source .phps


 여기서, php가 아닌 html에서도 php문구를 처리하기 위해선


 AddType application/x-httpd-php .php .html .htm


 이렇게 사용하면, 작동이 문제 없이 된다.


 여기서 /usr/local/apache/htdocs 라는 곳에서 index.html 이라는 파일이 있다.

 이 파일은 Apache가 처음에 설치된 후에 이상 없이 작동되는지 확인하기 위한 파일이다.

 이 파일에 다음과 같은 문구를 추가한다.


 <?php

phpinfo();

 ?>


 이렇게 해서 phpinfo라는 함수가 실행되고, php의 정보를 볼 수 있게 한다.


 



 php에서 설치가 제대로 되었는지, 설정이 어떻게 되어있는지를 확인 할 수 있기 때문에 보고 이상 없는지 확인하면 된다.


 파일 : 

apr-1.5.0.tar.gz

apr-util-1.5.3.tar.gz

httpd-2.4.6.tar.gz

pcre-8.33.tar.gz

mariadb-5.5.34.z01

mariadb-5.5.34.z02

mariadb-5.5.34.z03

mariadb-5.5.34.z04

mariadb-5.5.34.z05

mariadb-5.5.34.zip

php-5.4.22.z01

php-5.4.22.z02

php-5.4.22.zip



 SHA-256 표시줄.

 SHA256

 Name

 8505C2AA9F99E6B43D8E5C72CC6F4D8C5A8B3F67DB29C82D9707B98CBC3F3A89 apr-1.5.0.tar.gz
 259CE68F68C531F7ADECF79248F91235271F4025C1A47AE7E51BEE0E07E9902B apr-util-1.5.3.tar.gz
 8365BA360DF345B5AFA36FCA48B4036CE965141E029A6099F464DDF8A94FF0A7  httpd-2.4.6.tar.gz

 36CB3AE0078270F05972E9B8FBB7C859C05FD36DEB2152C77C8C8F4B07D5B28E

 mariadb-5.5.34.z01
 E2DC09A4664E6CEDB5C60F120814C794BB32D6C6583D2F6F9DCACC0DFEFE4FAA mariadb-5.5.34.z02
 31AF790E499982B8186865ED5D8A05E76DCC839899CA265CDA9A8A6343038D5D mariadb-5.5.34.z03
 95567B60520A85F342144A0D8168E57014E4992765FE32F1795BA14626C39A3A mariadb-5.5.34.z04
 9323B5AF8DEC149BE79D8E6764B3D11BD6B211A3956ED1BAC5516DBE3DAB4BC7 mariadb-5.5.34.z05
 C35FE01A7F5F265820E9DD6E800E014F3887E8E7757BCAF1820C909D6865C6D5 mariadb-5.5.34.zip
 C6936ADCDD8730B0C56681775C078B057541EE12BB7953BF912F041F54457B9E pcre-8.33.tar.gz
 E3CA8DBAC09F9CD985D93CA6439F8E5272A4AC8B1880A710C3C57170114FC7AA php-5.4.22.z01
 85AB309E69A00DA00D1A3B668A77F00E70FB2EE06EBD39454CEDD1F94822F5A2 php-5.4.22.z02
 3435510B9B3B8B6EDE933017114613C97B7506F5301BA2F1B4106DBAE9F403FD php-5.4.22.zip


 다운로드 한 후에 7z h 을 이용해서 확인할 수 있다.

Posted by JunkMam
,

 리눅스에서 xxd라는 프로그램이 존재한다.

 xxd란, 파일을 읽어서 hexa code로 변환해주는 프로그램이다.


 예을 들어서 xxd a.out > a_test.hex


 이런식으로 출력을 하게 되면, 다음과 같은 변화를 볼 수 있다.


 


 이걸 vi으로도 연결 할 수 있는 명령어이다.


 그래서 vi에서 다음과 같은 명령어를 사용하면 바뀌게 된다.


 :%!xxd


 그리고 되돌리기 위해선


 :%!xdd -r


 이렇게 해야지 되돌아간다.


 하지만, vim이 제대로 설치가 안된 상태에서는 다음과 같은 문제가 발생한다.

 


 이렇게


 xxd : command not found


 라는 오류가 발생하는데, 이것은 xxd가 제대로 설치가 되지 않아서 일어나는 현상이다.


 이것은 다음과 같은 사이트에서 설명이 적혀 있다.


 http://programmer-experience.blogspot.kr/2012/08/xxd-command-fedora-linux.html


 이것을 해결 하기 위해선,


 yum install vim-command 혹은

 yum install vim


 이렇게 해서 설치를 하면, 이상없이 사용이 가능하다.


 더 정확하게는 vim-command에서 존재하는 명령어인 xxd을 설치하는 것이기 때문에 vim-command을 설치해줘도 가능하다.


 이제 xxd을 통하여 Hexa Code로 변환하면서 사용하면 된다.


 단, 여기서 문제점은 xxd가 편집 프로그램이 아니다. 값을 변환해주는 프로그램이다.

 그래서 vi을 사용하다보면, 변환을 다시 해줘야 하는 문제점을 가진다. 그래서 사용하기엔 조금 불편하다.

 Hexa Code 변환 프로그램과 편집 프로그램을 같이 사용할 수 있는 프로그램을 구해서 사용하거나 만들어서 사용하는 것이 더 유용할 수 있다.

Posted by JunkMam
,

 Apache를 이상 없이 설치가 되었으면, 이제 DB을 연결하고 페이지를 만들수 있게 한다.


 DB는 종류가 많은데, MSSQL과 MySQL 등이 있다.


 여기서 MariaDB을 설치하는 것을 할려고 한다.


 DB는 무슨 역할을 하는가?


 DB는 서비스를 제공하는 자(서버)가 서비스를 받는 자(클라이언트)에게 받은 정보 및 서버가 가지고 있는 데이터들을 관리하는 장치가 DB(DataBase)이다.

 특히, MariaDB와 MySQL등 SQL류 DataBase는 관계를 지어서 해당 관계를 이용해서 데이터를 관리하는 방식을 사용한다.

 요즘 NoSQL이 유행한 것들은 이 관계를 미리 틀을 짜서 만들지 않고 유동적인 틀로 사용하는 것이다. 라고 알고 있다.


 그래서 SQL부분이 아예 사용이 안되는게 아니라, 해당 관계에서 조금 더 자유성을 부여된 형식이라고 이해하면 될 것이다.


 MariaDB를 설치하기 위해서 MariaDB 5.5을 설치할려고 한다.


 사이트 : https://downloads.mariadb.org/mariadb/


 여기에서 MariaDB을 다운 받을 수 있다.


 다운받는 경로를 알고 있다면, wget을 이용해서 MariaDB을 다운 받을 수 있다.



 MariaDB는 make만 사용하는게 아니라, 정확하게는 cmake을 사용하게 되어 있다. 그래서 cmake을 설치해줘야 한다.


 yum install cmake



 이렇게 설치가 완료한 후에 MariaDB을 압축을 푼다.

 압축을 푼 MariaDB에서 들어간 후에 target이라는 폴더를 만든다.

 target에서 초기화 작업을 끝낸 후에 target에서 make와 make install을 한다.


 target폴더에서 cmake을 사용하여 초기화 한다.


 cmake .. 

 \-DCMAKE_INSTALL_PREFIX=/usr/local/mariadb5.5

 \-DWITH_INNOBASE_STORAGE_ENGINE=1

 \-DWITH_ARCHIVE_STORAGE_ENGINE=1

 \-DWITH_BLACKHOLE_STORAGE_ENGINE=1

 \-DWITH_PERFSCHEMA_STORAGE_ENGINE=1

 \-DWITH_PARTITION_STORAGE_ENGINE=1

 \-DWITH_FEDERATEDX_STORAGE_ENGINE=1

 \-DWITH_ARIA_STORAGE_ENGINE=1

 \-DWITH_XTRADB_STORAGE_ENGINE=1

 \-DWITH_EXTRA_CHARSETS=all

 \-DWITH_READLINE=1

 \-DWITH_SSL=system

 \-DWITH_ZLIB=system

 \-DMYSQL_DATADIR=/usr/local/mariadb5.5/data

 \-DDEFAULT_CHARSET=utf8

 \-DDEFAULT_COLLATION=utf8_general_ci

 \-DENABLED_LOCAL_INFILE=1;



 다음과 같은 오류가 난다.

 이 경우에는 ncurses을 이용해서 컴파일을 하기 때문에, ncurses-devel을 설치해줘야한다.



 yum install ncurses-devel libevent libxml2 libxml2-devel bison(ncurses-devel 외 나머지는 이유를 모르겠다. 구글링해서 알게 된 것이기 때문에 무조건은 아니다.)


 make을 한 후에 make install 을 하면, 설치가 된다.


 이제, mysql을 연결해주는 사용자를 만들어야한다.


 groupadd -g 27 -o -r mysql;

 useradd -M -g mysql -o -r -d /usr/local/mariadb5.5/data -s /bin/false -c "MariaDB Server" -u 27 mysql;


 mkdir -p /usr/local/mariadb5.5/InnoDB/redoLogs;

 mkdir -p /usr/local/mariadb5.5/InnoDB/undoLogs;


 chown -R mysql /usr/local/mariadb5.5/data;

 chgrp -R mysql /usr/local/mariadb5.5;


 mkdir /usr/local/mariadb5.5/logs /usr/local/mariadb5.5/tmp;


 chown mysql.mysql /usr/local/mariadb5.5/tmp;

 chown mysql.mysql /usr/local/mariadb5.5/logs;


 이렇게해서 log을 받는것, tmp(임시 파일)을 받는 곳을 전부 다 제작해준다.


 maraiDB의 DB를 설치한다.


 /usr/local/mariadb5.5/scripts/mysql_install_db --user=mysql \

--basedir=/usr/local/mariadb5.5 \

--datadir=/usr/local/mariadb5.5/data;



 이렇게 했을때, 다음과 같은 화면이 출력하면서 db을 제작한다.


 /usr/local/mariadb5.5/support-files/mysql.server start;



 이렇게 하면, MariaDB의 서버가 작동이 된다.


 이 후에 DB에서 설정한 admin(관리자)을 제작한다.


 /usr/local/mariadb5.5/bin/mysqladmin -u root password 'passwd';



 이렇게 하면, root 사용자가 passwd을 비밀번호를 가진 상태로 사용할 수 있게 된다.


 이렇게해서

 /usr/local/mariadb5.5/bin/mysql -p

 이렇게 작동을 시키면, mysql이 작동이 되며, 사용자는 MariaDB을 사용할 수 있게 된다.





Posted by JunkMam
,

https을 사용하기 위해선 OpenSSL을 설치하는게 좋다.(SSH가 설치 되어 있다면, 자동으로 OpenSSL이 설치가 되어 있을 것이다.)


 OpenSSL을 연결하기 위해서 OpenSSL을 설치를 해줘야한다.


 OpenSSL-devel이 안 깔려 있기 때문에, 설치하는 도중에 계속 오류가 나게 되므로, 


 yum install openssl과 openssl-devel을 설치해준다.


 openssl-devel이 설치되면서 생기는 차이점은 openssl에 관련된 개발용 헤더들과 파일들이 같이 깔려 있다는 점이다.(만약, openssl이 설치가 안되어 있다면[그럴일 없지만...]  https://www.openssl.org/source/ 에 들어가서 다운 받아서 설치하는게 좋다.)


 yum install libpng* libjpeg* perl* 


 먼저 http는 demon인 httpd을 설치해줘야지 제대로 작동이 된다.


 httpd의 소스는


 https://archive.apache.org/dist/ 에서 구할 수 있다.


 나는 httpd-2.4.6버전을 설치할려고 한다.


 먼저 httpd-2.4.6을 얻는 작업을 한다.

 필자는 wget을 설치해 두었기 때문에 wget을 사용한다.

 wget이 설치가 되어 있지 않다면, 설치하거나 웹페이지에 가서 다운 받으면 된다.

 사이트 : https://archive.apache.org/dist/httpd/



 다운 받은 후에 apache와 openssl을 연동을 하기 위해서 apr 소스를 다운 받는다.

 필자는 apr-1.5.0과 apr-util-1.5.3을 사용한다.


 사이트 : https://archive.apache.org/dist/apr/


 이걸 이용해서, httpd와 apr, apr-util을 풀어준다.


 이렇게 tar zxvf을 이용해서 압축을 풀어주면, 처리가 가능해진다.


 이렇게 하면, httpd와 apr, apr-util이라는 것들이 생성이 된다.

 여기서 httpd을 컴파일 하기 위해서 apr과 apr-util을 옮겨줘야 한다.


 apr-1.5.0 -> httpd-2.4.6/srclib/apr

 apr-util-1.5.3 -> httpd-2.4.6/scrlib/apr-util


 이렇게 변형을 해줘야지 httpd을 컴파일 할때, 같이 사용하게 된다.


 먼저 make을 사용하기 위해서 설정을 사용한다.


 httpd-2.4.6에 들어간 다음에


 ./configure --prefix=/usr/local/apache \

--enable-mods-shared=all \

--enable-ssl \

--enable-so \

--enable-rewrite \

--with-include-apr \

--with-include-apr-util;


 --prefix : Linux에서 설치할 경로를 사용자가 정의하는 것이다.

 --enable-mods-shared : mod 설치하는 것을 동적 라이브러리로 설정하는 것이다.

 --enable-ssl : ssl 라이브러리를 지원하는 것이다.

 --enable-so : 동적 라이브러리로 지원하는 것이다.

 --enable-rewrite : 덮어 씌우기를 지원해주는 것이다.

 --with-include-apr : apr을 포함해서 컴파일하는 것.

 --with-include-apr-util : apr-util을 포함한 컴파일 하는것.


 이렇게해서 설정을 하게 된다.


 설정이 완료된 후에 컴파일을 한다면, 오류가 발생한다.


 


 pcre가 없어서 발생하는오류로. pcre을 설치해줘야 한다.


 yum으로 해도 되지만, 소스 설치를 사용한다.


 다음과 같은 주소에서 가면 , 얻을 수 있다.


 https://sourceforge.net/projects/pcre/files/


 pcre-8.33.tar.gz 을 받아서 사용한다.


 tar zxvf pcre-8.33.tar.gz을 사용해서 압축을 풀어낸 후에 pcre에 들어간다.


 pcre을 설치하기 위해서 컴파일을 하기위해서 초기 설정을 한다.


 ./configure



 이렇게 하면, 초기화가 완료되고 컴파일을 하기 위해서 make로 테스트 한 후에 make install을 해서 컴파일 설치를 완료시킨다.


 설치 완료한 다음에 다시 httpd에서 초기화를 설정하면, 다음과 같이 나오게 된다.



 이것은 OpenSSL-devel가 설치가 안되어 있어서 생기는 문제점이다.(초기화 할때, SSL관련된 경로 및 설정이 잘못 되었을 수도 있다.)


 OpenSSL-devel이 제대로 설치가 되었으면, 문제 없이. 초기화가 된다.


 초기화가 완료되었으면, make & make install 을 이용한다.


 그러면, Apache 설치가 완료가 된다.


 이제 Apache의 설정을 해서 확인 한다.


 여기서는 Apache의 설정을 하는게 있다.

 /usr/local/apache/conf 에서 설정이 들어가 있다.

 httpd.conf라는것에서 초기 설정을 할 수 있다.


 /usr/local/bin/apachectl을 사용하면, 아파치 서버가 작동을 한다.


 멈추게 하고 싶다면,

 /usr/local/bin/apachectl stop 을 사용하면 된다.


 일단, 해당 서버에는 XWindow가 설치가 되어 있지 않기 때문에 우리가 일반 적으로 알고 있는 It's Work 라는 문장이 있는 페이지로 이동하기가 힘들다.


 그래서 lynx(Text Internet Browser 중 하나)을 이용해서 출력하면, 다음과 같이 뜨면서 이상없이 뜨는걸 볼 수 있다.


 localhost로 들어가면, 자기 IP(127.0.0.1)에 들어가며, 제대로 동작하는지 확인을 할 수 있다.



Posted by JunkMam
,

 SCM Music Player가 들어가 있는 블로그를 보면서 특정 영상을 가지고와서 공유하는 장치를 만들면 어떨까? 라는 생각을 하게 되서 한번 테스트해서 만들어 본것이다.


 HTML 소스는 다음과 같다.

1
2
3
<div style="position:fixed; bottom:10px; z-index:10; left:10px;">
    <embed height=300 width=400 src="https://www.youtube.com/embed/?list=UUI0Ai1RoRD-b8i-qvRR0Yeg" style="z-index:10;">
</div>
cs



 이걸 HTML/CSS 형태로 다시  맞춘다면,


 HTML 소스


1
2
3
<div class="top">
    <embed src="https://www.youtube.com/embed/?list=UUI0Ai1RoRD-b8i-qvRR0Yeg" class="top video">
</div>
cs


 CSS 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.top
{
    position:fixed;
    bottom:10px;
    left:10px;
    z-index:10;
}
.top .video
{
    height:300;
    width:400 
}
 
cs


 이렇게 사용하면, 밑에 동영상이 나오게 된다.


 참고로 Youtube에서 공유 형식으로 가지고 올려면, 다음과 같은 경로를 잡아줘야한다.


 https://www.youtube.com/embed/재생하고자 하는 영상 ID


 list로 전부 다 하고자 한다면, 다음과 같이 한다.


 https://www.youtube.com/embed/?list=재생 리스트 ID


 이렇게 사용한다면, 재생 리스트로 출력하게 된다.



 장점은 IE랑 기타 브라우져에서 전부 다 적용이 가능하다.


 하지만, 문제점이 있다.


 embed는 변수로 뽑아 낼 수가 없다.(iframe 또한 동일하다.)


 쉽게 말해서 저기서 다음과 같은 형태의 변수를 만들어 낸다고 해보자.


1
2
var embl = document.getElementsByTagName("embed");
 
cs


 윗 소스의 결과 embl는 null(존재하지 않음)이라는 형태로 나오게된다.


 null(존재 하지 않음)이기 때문에 제대로 작동이 안되고, 결국은 오류가 나게 된다.


 다음은 구글링해서 얻은 정보이다.


 구글에서 제공하는 JavaScript로 컨트롤 할 수 있는 API가 존재한다.


 이걸 이용해서 일부분만 듣게 하고 사용자가 플레이를 틀어서 다시 듣게 만들 수 있다.

 쉽게 말해서 플레이어를 컨트롤 할 수 있게 된다는 것이다.


 Youtube 개발자 사이트[각주:1]에서 자세한 설명이 나온다.


 자세히 알려면, 다음을 알아야 된다.


 https://www.youtube.com/iframe_api


 여기서 iframe_api란 무엇인가?

 이것은 바로 위에 언습한, https://www.youtube.com/embed/를 iframe으로 처리해주는 장치들이 들어가 있는 주소이다.(들어가보면, javascript들이 나온다.)


 Youtube 개발자 사이트에서는 다음과 같은 예제를 제공해준다.


 

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
<!DOCTYPE html>
<html>
  <body>
    <!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
    <div id="player"></div>
 
    <script>
      // 2. This code loads the IFrame Player API code asynchronously.
      var tag = document.createElement('script');
 
      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
 
      // 3. This function creates an <iframe> (and YouTube player)
      //    after the API code downloads.
      var player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '390',
          width: '640',
          videoId: 'I1-YOOLU_qY',
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
          }
        });
      }
 
      // 4. The API will call this function when the video player is ready.
      function onPlayerReady(event) {
        event.target.playVideo();
      }
 
      // 5. The API calls this function when the player's state changes.
      //    The function indicates that when playing a video (state=1),
      //    the player should play for six seconds and then stop.
      var done = false;
      function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PLAYING && !done) {
          setTimeout(stopVideo, 6000);
          done = true;
        }
      }
      function stopVideo() {
        player.stopVideo();
      }
    </script>
  </body>
</html>
cs


 이걸 본다면, 이벤트가 포함이 되어서 6초 후에 멈추는걸 볼 수 있다.


 이걸 이용해서 컨트롤을 할 수 있다.

 단, 이 경우에는 단일 영상에서만 가능하다.

 우리는 리스트를 원한다. 라고한다면, 다음과 같은 형태를 사용하면, 리스트를 부를 수 있게 된다.


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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<!DOCTYPE html>
<html>
  <body>
    <div id="player" style="position:fixed; bottom:10px; z-index:10; left:10px;"></div>
    <script>
    
      var tag = document.createElement('script');
 
      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
      
      var player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '300',
          width: '300',
          videoId: 'kjjZtbYEhCQ',
          playerVars: { 'autoplay'1'controls'0 },
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange,
            'onError': onPlayerError,
          }
        });
      }
 
      
      function onPlayerReady(event) {
            console.log("Test");
            player.cuePlaylist({
                        list:'UUI0Ai1RoRD-b8i-qvRR0Yeg',
                        listType:'playlist',
                        index:'0',
                        suggestedQuality:'default'
                    });
      }
      
      function onPlayerError(event) {
        console.log("Error"+event);
      }
 
      var done = false;
      var play = false;
      var name = 0;
      function onPlayerStateChange(event) {
        console.log("StateChange"+event.data);
        
        switch(event.data)
        {
            case -1:
                break;
            case 0:
                name++;
                if(name==2 && play)
                {
                    play=false;
                    player.removeEventListener('onStateChange',onPlayerStateChange);
                    setTimeout(nextVideo, 1000);
                }
                break;
            case 1:
                if(!done)
                {
                    setTimeout(stopVideo, 6000);
                    done=true;
                }
                play=true;
                break;
            case 5:
                player.playVideo();
                break;
        }
      }
      
      function nextVideo(){
        player.addEventListener('onStateChange',onPlayerStateChange);
        player.nextVideo();
      }
      
      function stopVideo() {
        player.pauseVideo();
      }
      
    </script>
  </body>
</html>
cs


 이렇게 하면, 제대로 작동이 된다.

 여기서, removeEventListener와 addEventListener을 사용하는 이유는 중복을 막기 위해서 사용하였다.

 play와 name등으로 딜레이를 사용하셔 중복을 막는 것이다.


 블로그에서 youtube에 설정을 할 수 있게 되며, 

 onStateChange라는 이벤트를 이용해서 사용하는 것이다.


 Youtube로 사용한 것은 설레임 에디션을 가지고 사용하였다.


 tistory.com 등에 제대로 들어 갈려면 쿠키 작업을 해서 시간+영상 인덱스을 가지는걸로 만들어야 될 것이다.

 seek;플레이어 재생시간과 startTime;플레이어 시작시간 설정, index; 플레이 하는 위치 등이 지원되어 있기 때문에 쿠키를 사용하면 간단하게 해결될 것 같다.


 영상 리스트를 원하는 사람으로 설정할 수 있다.


 동영상 주소는 설레임 에디션 동영상이다.


 채널 주소 : https://www.youtube.com/channel/UCI0Ai1RoRD-b8i-qvRR0Yeg

  1. 검색 시간 : (2016-06-03) [본문으로]
Posted by JunkMam
,

 Linux에서 root 비밀번호를 잊어 버리면, 시스템 관리자 형태로 필요한 경우(yum 같은 경우)를 사용하기가 불편해질 수 있다.


 그래서 root의 패스워드을 입력하지 않고도 그냥 들어갈 수 있게 만들어서 root 패스워드를 변경할 수 있다.


 그리고 init을 변경해서 XWindows 등 모드를 설정 할 수 있다.


 먼저, root의 패스워드를 처리하는 방법을 기록하기로 한다.



 부팅 중에 Linux가 작동할려면 다음과 같은 시간이 걸리게 된다. 이때, 아무키를 누르면, GNU GRUB이 작동하게 된다.



 여기서 두번째(kernel)에서 e을 누르게 되면, 수정할 수 있는 Edit 상태가 된다.

 C는 Command 형태로 GRUB에 설정하는게 된다.

 Booting Loader가 고장이 나면, 여기와서 수정을 가하면 강제적으로라마 연결이 가능해진다.



 여기서 init 1을 설정한다.


 init 0 : 컴퓨터 종료.

 init 1 : 단일 사용자.

 init 2 : NFS을 제외된 다중 사용자.

 init 3 : 다중 사용자.

 init 4 : 없음.

 init 5 : X11(XWindow Library을 동작).

 init 6 : 재부팅.


 이렇게 되면, 단일 사용자 모드가 되어서 passwd가 입력 되지 않는 상태로 root에 들어갈 수 있게 된다.

 그래서 root 값을 변경하고 처리 할 수 있게 된다.


 init을 부팅시 마다 설정하기 귀찮으면, init의 정보를 변경하면 가능하다.



 init 값을 변경하는 방법.


 init 값은 /etc/inittab 이라는 파일에 저장되어 있다.


 vi /etc/inittab을 이용해서 보게 되면,


 init 설정하는 데이터 정보와 함께, 


 id:#(여기서 init에 설정되는 숫자를 입력한다.):initdefault:


 이렇게 init의 기본값을 변경할 수 있게 된다.


 기본 값을 변경해서 X11을 먼저 실행 시킬 수도 있고, Single로 단일 사용자 형태로 사용해서 비밀번호를 설정하지 않아도 된다.

 NFS 등 네트워크 형태를 취하지 않고 작업 하는 것 또한 제외 시키고 할 수도 있다.

Posted by JunkMam
,