https://www.everdevel.com/PHP/post-get.php

 

everdevel

웹 입문 사이트 에버디벨 - HTML, CSS, JavaScript, jQuery, MySQL ,PHP를 다룹니다.

www.everdevel.com

 

https://ppost.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-PHP-%EC%97%B0%EB%8F%99-%EC%98%88%EC%A0%9C-%EC%84%A4%EB%AA%85

'리눅스 > 데이터베이스' 카테고리의 다른 글

mysql과 통신을 위한 php 서버  (0) 2019.07.11
Ubuntu에서 mysql 명령어 사용  (0) 2019.07.11

*php 서버 위치 :

$cd /var/www/htrml

*파일 권한설정 755

$ sudo chmod 755 -R ./*

try.php

localhost : 로컬호스트, 일반적으로 로컬호스트 고정
root : mysql의 user
mysql : 패스워드
testdb : root 계정에 존재하는 databasae 이름

<?php  

$link=mysqli_connect("localhost", "root", "mysql", "testdb");  
if (!$link)
{  
    echo "MySQL 접속 에러 : ";
    echo mysqli_connect_error();
    exit();  
}  

mysqli_set_charset($link,"utf8"); 


$sql="select * from solar";

$result=mysqli_query($link,$sql);
$data = array();   
if($result){  

    while($row=mysqli_fetch_array($result)){
        array_push($data, 
            array('id'=>$row[0]
        ));
    }

    header('Content-Type: application/json; charset=utf8');
$json = json_encode(array("webnautes"=>$data), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
echo $json;

}  
else{  
    echo "SQL문 처리중 에러 발생 : "; 
    echo mysqli_error($link);
} 



mysqli_close($link);  

?>

insert.php

dbcon.php의 연결을 이어받아서 insert 명령어를 수행한다.

<?php 

    error_reporting(E_ALL); 
    ini_set('display_errors',1); 

    include('dbcon.php');


    if( ($_SERVER['REQUEST_METHOD'] == 'POST') && isset($_POST['submit']))
    {

        $name=$_POST['name'];
        $country=$_POST['country'];

        if(empty($name)){
            $errMSG = "이름을 입력하세요.";
        }
        else if(empty($country)){
            $errMSG = "나라를 입력하세요.";
        }

        if(!isset($errMSG))
        {
            try{
                $stmt = $con->prepare('INSERT INTO person(name, country) VALUES(:name, :country)');
                $stmt->bindParam(':name', $name);
                $stmt->bindParam(':country', $country);

                if($stmt->execute())
                {
                    $successMSG = "새로운 사용자를 추가했습니다.";
                }
                else
                {
                    $errMSG = "사용자 추가 에러";
                }

            } catch(PDOException $e) {
                die("Database error: " . $e->getMessage()); 
            }
        }

    }
?>

<html>
   <body>
        <?php 
        if (isset($errMSG)) echo $errMSG;
        if (isset($successMSG)) echo $successMSG;
        ?>

        <form action="<?php $_PHP_SELF ?>" method="POST">
            Name: <input type = "text" name = "name" />
            Country: <input type = "text" name = "country" />
            <input type = "submit" name = "submit" />
        </form>

   </body>
</html>

<?php 
    }
?>

dbcon.php

<?php
    $host = 'localhost';
    $username = 'root'; # MySQL 계정 아이디
    $password = 'mysql'; # MySQL 계정 패스워드
    $dbname = 'testdb';  # DATABASE 이름


    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');

    try {

        $con = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8",$username, $password);
    } catch(PDOException $e) {

        die("Failed to connect to the database: " . $e->getMessage()); 
    }


    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $con->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { 
        function undo_magic_quotes_gpc(&$array) { 
            foreach($array as &$value) { 
                if(is_array($value)) { 
                    undo_magic_quotes_gpc($value); 
                } 
                else { 
                    $value = stripslashes($value); 
                } 
            } 
        } 

        undo_magic_quotes_gpc($_POST); 
        undo_magic_quotes_gpc($_GET); 
        undo_magic_quotes_gpc($_COOKIE); 
    } 

    header('Content-Type: text/html; charset=utf-8'); 
    #session_start();
?>

참고
[1] https://webnautes.tistory.com/828
[2] https://yoo-hyeok.tistory.com/17?category=708422

'리눅스 > 데이터베이스' 카테고리의 다른 글

PHP 서버 설정  (0) 2019.07.11
Ubuntu에서 mysql 명령어 사용  (0) 2019.07.11

mysql 설치

$ sudo apt-get install mysql;

myhsql 실행

mysql에 등록한 user 이름과 password를 기입한다.

    $ mysql -u user - p
    Enter password :

database 보기

기존에 만들어진 데이터베이스 목록을 보여준다.
만약 기존에 만든 db가 없으면 새로 db를 만들어 준다.

mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| information\_schema |  
| testdb              |
+---------------------+

해당 database 확인

만들어진 db를 선택한다.

mysql> use testdb;
Database changed;

db의 table 보기

db에서 만들어진 table 목록을 확인한다.
table이 없으면 만들어야 한다.

mysql> show tables;  

+--------------------+  
| Tables_in_testdb   |  
+--------------------+
| person             |
+--------------------+

table의 내용 보기

testdb에 person이란 table이 있으면 이 person 테이블을 선택한다.

mysql> select \* from person;  
+---------------------+  
| id | name | country |  
+---------------------+
|  1 | test | kr      |  
|  2 | test | uk      |  
+---------------------+

'리눅스 > 데이터베이스' 카테고리의 다른 글

PHP 서버 설정  (0) 2019.07.11
mysql과 통신을 위한 php 서버  (0) 2019.07.11

1. .bashrc 편집하기

$ cd ~/
$ vi .bashrc

2. 파일 리스트 출력 예약어 등록

alias ll='ls -lsa'

3. 상위 디렉터리 이동 예약어 등록

alias u='cd ..'

4. scp 예약어 등록

alias scptest='scp test.txt root@192.168.1.1:/opt:'

5. .bashrc 저장

ESC키 입력  
:wq + Enter  

'리눅스 > 기타' 카테고리의 다른 글

리눅스 7z 압축풀기  (0) 2019.07.08
ARM 기반 소프트웨어 효율성 증대  (0) 2016.03.09
MCU 선정, Cortex 시리즈, 보드 선정  (0) 2016.03.09
bash shell  (0) 2016.01.25

1. 패키지 설치

$ sudo apt-get install p7zip-full

2. 압축 해제하기

  • 명령어 7z, 옵션 x

    $ 7z x 파일이름.7z
  • 예제

    $ 7z x text.7z

'리눅스 > 기타' 카테고리의 다른 글

.bashrc에서 예약어 등록하기  (0) 2019.07.08
ARM 기반 소프트웨어 효율성 증대  (0) 2016.03.09
MCU 선정, Cortex 시리즈, 보드 선정  (0) 2016.03.09
bash shell  (0) 2016.01.25

Kernel에서 ARM 빌드하기


참조

http://www.codingrun.com/2015/08/ububru-arm-linux-gcc.html?m=0

http://blog.secmem.org/560

https://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/ch03.toolchain.html


1. Kernel source download

스터디를 2.6버전으로 하기 때문에 2.6버전을 다운받았다.

https://www.kernel.org/



2. toolchain 다운로드

$ wget https://www.dropbox.com/s/6s3f57wd4zie8ah/arm-eabi-4.4.3.zip


3. kernel make

kernel/arch/arm/configs 에서 원하는 config 이름을 본 뒤

make s3c24100_defconfig

make menuconfig

make zImage (arm에서 이미지 만드는 명령어)


4. kernel/Makefile 확인

약 184번째 줄 : ARCH와 CROSS_COMPILE 이 잘 설정되어야 한다.

ARCH = arm이 되겠고

CROSS_COMPILE = arm-eabi- 가 되겠다 


위의 내용을 ~/.bashrc에서 설정해준다.

vi ~/.bashrc


export ARCH=arm

export SUBARCH=arm

export CROSS_COMPILE=$HOME/Desktop/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

export PATH=$PATH:$HOME/Desktop/toolchain/arm-eabi-4.4.3/bin


source ~/.bashrc

위처럼 설정해주는것보다 Makefile에서 해주는게 좋지만 일단 Study기 때문에 이렇게 설정해서 진행

임베디드 리눅스 개발자는 하드웨어를 다루기 위해 디바이스 드라이버를 꼭 알아야 한다. 앞으로의 실습을 위해 기본개념부터 간단하게 소개한다.



목차

001. 운영체제로서의 리눅스

002. 리눅스 커널

003. 리눅스 드라이버



001. 운영체제로서의 리눅스

 운영체제의 이해를 위해서는 운영체제 구성하는 프로그램 소스와 설명 문서가 필요하다. Window같은 경우는 이러한 정보가 공개되어 있지 않지만 Linux의 경우 커널소스, 디바이스 드라이버 소스 등이 오픈소스로 제공되며 수많은 문서가 존재한다. 리눅스는 개발자들에 의해 수없이 수정되고 있으며 그 결과 우수한 성능을 보이며 메일 서버, 웹 서버 시스템, 임베디드 시스템 등 다양하게 쓰인다.



002. 리눅스 커널

 1) 리눅스 역사

 리누즈 토발즈가 만든 운영체제. 커널 + GNU프로젝트가 합세하면서 리눅스가 개발됨. 가장 사용화 됫던 버전은 2.6x 3.1x 등이있으며 현재 4.x 버전까지 나왔다. 컴파일러 : gcc


  2) 리눅스 커널의 기능

    - 프로세서 관리 

      병렬 프로세서 또는 시스템 프로세스를 효율적으로 할당하고 수행하도록 관리한다.


    - 프로세스 관리

 최소한 하나 이상의 프로세스가 동작, 태스크라고도 하며 일을 수행하는 기본 단위. 스케쥴러를 이용하여 여러 프로세스를 parallel하게 관리한다.


    - 메모리 관리

 프로세스 또는 실행 이미지가 동작하도록 가상 주소 공간을 제공하며 여러 보조 기억 장치 등이 존재한다.


    - 파일 시스템 관리

리눅스는 파일 시스템을 근간으로 설계 되었다. 리눅스 커널에 동작하는 모든 자원을 파일처럼 볼 수 있도록 통일된 인터페이스를 제공


- 디바이스 제어

하드웨어를 제어하기 위해서는 커널에서 디바이스 드라이버가 구현되어야 하며 디바이스 드라이버를 통해 주변 장치를 제어 할 수 있다.


- 네트워크 관리

리눅스 커널은 우수한 네트워크 관리 시스템을 가지고 있음 네트워크 디바이스 드라이버를 통해 효과적으로 네트워크 처리를 하고 있다. 암호화와 보안 특성이 견고하다.


  3) 리눅스 커널의 특징

프로세서와 시스템 메모리에 상주하면서 여러 자원을 관리하며 다중 프로세스를 구현한다. 배포된 소스를 사용자가 직접 수정할 수 있으며, 현존하는 운영체제중에서 가장 많은 프로세서와 플랫폼을 지원하며, 임베디드 시스템에서부터 엔터 프라이즈 환경까지 커버한다.


    - 모놀리식 커널

UNIX방식의 모놀리식 커널이며 OS를 구성하는 일반적 기능과 커널을 동일한 메모리 공간에 적재한 기법을 말한다. 마이크로 커널의 경우 Contrext switching이나 Process 간 통신이 이루어질 때 Cluck의 실행 비용 문제가 생기지만 모놀리식 커널은 동일 메모리에 있기 떄문에 이러한 요소를 줄일 수 있는 장점이 있다.


- 비선점형(커널 2.4) 선점형(커널 2.6)

비선점형 : 한 Process가 진행 될 때 CPU자원을 점유하게 되고, 이 프로세스가 종료되거나 인터럽트에 의한 종료가 되기 전까지 계속 점유되는 것을 말한다.

선점형 : CPU에서 이미 점유된 process가 있다 하더라도 이것을 중지하고 다른 process를 우선 처리 할 수 있다.


- 가상 메모리 시스템(VM)

http://akaseon.tistory.com/55

물리적 메모리 장치의 한계를 극복 할 수 있는 메모리 관리 기법으로써 MMU가 가상주소와 물리주소를 관리해 주는 역할을 한다. ARM의 경우 Cortex-A는 MMU가 존재하지만 비교적 가볍고 빠른처리를 지원하는 임베디드 특화된 Cortex-M같은 경우 MMU가 존재하지 않는 경우도 있다.


- No MMU 지원

자원이 제한적이거나 소량의 처리만 하는 임베디드 시스템의 경우 MMU디바이스가 없는 경우도 있다. Linux는 MMU가 없는 시스템도 지원한다.


- 가상 파일 시스템(VFS)

리눅스 커널의 가장 큰 특징 중 하나이며 다른 OS의 파일 시스템을 처리 할 수 있으며 사용자는 OS에 상관 없이 서로 다른 파일 시스템을 이용 할 수 있다. 대표적으로 ext2 부터 저널링 파일 시스템인 jfs를 수용 할 수 있으며 윈도우에서 동작하는 NTFS파일 시스템과 DOS용 파일 시스템도 처리 할 수 있다.


- 모듈을 이용한 커널 확장

커널 모듈이란 필요에 따라 커널에 로드하거나 언로드 할 수 있는 특정한 기능을 말한다. 리부팅 작업이 필요 없이 로드 언로드가 가능하며 자원 낭비 또한 줄일 수 있다. $lsmod를 통해 동작 모듈을 확인 가능하다.


- 커널 스레드

http://timewizhan.tistory.com/entry/%EC%BB%A4%EB%84%90-%EC%8A%A4%EB%A0%88%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-1

커널에만 존재하는 스레드. $ps -ef를 통해 확인 가능하며 [??]이 되어 있는 것이 커널 스레드이다. 보통 프로세스를 for할 때 context switching에 따른 cpu자원 소모가 일어나게 되는데 커널에서만 동작하기 때문에 이러한 자원 사용을 줄일 수 있다.


- 멀티스레드 지원

프로세스를 생성하는 비용이 많이 들기 때문에 프로세스 관리 기법에서 경량화 된 멀티 스레드를 지원한다. MMU를 지원하지 않는 CPU에서는 메모리의 제한적 사항 때문에 process for보다 멀티 스레드 사용을 권장한다.


- 강력한 네트워크 지원

BSD 네트워크 처리 방식이기 떄문에 안정성이 높다. 또한 다양한 네트워크 디바이스 드랑리버를 지원한다


- GPL 라이선스 (General PUblic License)

GPL 코드를 사용한 SW는 반드시 공개해야 된다.




  4) 커널 소스의 구조



 Documentation  

 커널에 관련된 여러 문서들이 있다. 커널 소스를 분석할 때 먼저 참고하는 편이 좋다.

 arch            

 아키텍쳐 의존적인 코드들이 있다. 보통 boot, kernel, lib, mm 으로 구현되어 있다. 

 crypto           

 암호 처리 공동 함수

 drivers        

 각종 디바이스를 제어하기 위한 드라이버

 block, cdrom, char, net, pci, pnp, sbus, scsi, sound 등

 fs

 버추얼 파일 시스템 인터페이스

 coda, ext2, hpfs, msdos, nfs, ntfs, utfs 등

 include

 커널에 관계된 헤더 파일, asm-*은 아키텍쳐 관련, linux는 커널 관련 

 init             

 리눅스 커널 부팅할 때 호출되는 각종 초기화 처리 

 ipc            

 전통적 프로세스간 통신, 세마포어, 공유메모리, 메시지 큐

 kernel            

 커널의 핵심 코드. 시스템콜, 스케쥴러, 시그널 핸들링 등 

 lib

 kernel의 다른 부분에 의해 필요로 하는 라이브러리 코드. 예로 inflate.c는 부팅시  kernel 압출을 해제하고 메모리에 로드한다.

 mm

 버추얼 메모리 관리, 페이징, 커널 메모리

 net

 네트워크를 지원하며 많은 프로토콜이 있다.

 802.11, IPX, appletalk, ethernet, ipv6, bluetooth ...

 scripts

 커널이미지를 만들어주는 스크립트나 실행 파일이 있다.

 security

 보안 처리

 sound

 사운드 관련

 usr

 initramfs 시스템 구축 예제

 참고

 http://plucky.tistory.com/26   http://mintnlatte.tistory.c/162


    - Doccumentation

    디바이스 드라이버 작성자에게 필수 참고내용이 있는 디렉토리이다. 디바이스 드라이버 구현 방법 및 주의사항에 대한 내용들이 있다. 커널 컴파일과 관련된 문법 구조를 이해하고 싶으면 kbuild를 살펴 볼 것



    - arch

아키텍쳐(플랫폼)의 독립적인 소스코드가 존재한다.

alpha, arm, avr, blackfin, cris, frv, h8300, ia64, m32r, m68k, m68knommu, microblaze, mips, mn10300, parisc, powerpc, s390, sh, sparc, um, x86(i386), x86_64(i386의 64bit) 등이 있다. 


arch/kernel : Context switching, Thread Management

arch/lib : kernel이 사용하는 library의 구현 (하드웨어 dependent이기 때문에 일반 library보다 빠르다)

arch/mm : memory management 중에서 page fault 같은 hardware dependent한 부분을 구현

arch /boot : 부트스프랩트코드, 메모리 / 디바이스 설정



    - include

디바이스 드라이버를 작성하는 경우에 커널 소스를 추적해야 하는 경우도 있지만 헤더 파일을 찾는 경우가 더 많다. include/asm에는 아키텍쳐와 관련된 파일을, include/linux에는 리눅스 커널에서 아키텍처에 영향을 받지 않는 헤더 파일을 모아 놓는다 include/linux를 잘 살펴볼 것



  5) 커널 소스 탐색

grep 명령어 조합 (http://forum.falinux.com/zbxe/index.php?document_srl=562106&mid=lecture_tip)

Linux : Vi plugin 이용 (cscope, ctags, NerdTree)

Windows : Source insight를 이용

cscope 이용  (http://iamroot.org/wiki/doku.php?id=%EC%8A%A4%ED%84%B0%EB%94%94:cscope_%EC%82%AC%EC%9A%A9%EB%B2%95)
































ARM의 구조에 따른 효율적인 코딩

출처 : mds 아카데미 - ARM 프로세서 ARM11


Toolchain Option

컴파일러의 Optimization level을 설정 할 수 있다.

옵션

    -O0 : optimaization을 하지 않는다. 불필요한 코드 존재. Debugging에 적합

    -O1 : O0와 O2의 중간단계

    -O2 : full optimization, Code density가 좋음

    -g : O레벨과 상관없이 O0으로 컴파일 한다.

최적하를 할 경우 기본적인 코드 최적화 및 core에서 최대 성능을 내도록 명령어 순서 재배치가 이루어 진다.



소프트웨어 최적화

    - ARM 프로세서의 특징을 알아야 한다.

    - 성능 향상을 위해서는 프로그래머의 주의를 요구한다.

    - ARM에는 Division을 할 수 있는 하드웨어가 없다.

    - Unaligned acess를 지원하지 않는다.

    - ARM 명령은 조건부 실행이 가능하다.

    - 스택의 사용이 많으면 시스템 성능 감소한다.

    - ATPCS에 argumet가 전달된다.


Diviation(나눗셈) Modulo(나머지) 연산

    - ARM에는 Division을 위한 하드웨어가 없다.

    - Diviation 연산 : 최대한 power of 2로 나누어 질 수 있도록 한다. Inline barrel shifter가 사용되어 성능 감소가 없다.

    - Modulo 연산

Count = count ++ % 10     -    >    if(count++>=10) count=0;


add r1, r0, #`

mov r0, #10             -O1 or -O2    add  r0, r0, #1

bl __rt_udiv                 -     >     cmp  r0, #10             

mov r0,r1                                movcs r0, #0



Loop의 종료

    - Loop 명령 : for(), while(), do{}while() 등

    - 0으로 decrement를 하면 최적화가 가능하다.


for(loop=1; loop<=total; loop++)              ->      for(loop=total; loop!=0; loop--)


add r1, r1, #1

cmp r1, r0                               ->       subs  r1, r1, #1

ble  __loop                                             bne  __loop




Inline 함수에 의한 성능 향상

     - Subroutine 함수과 같이 사용이 편리

     - static _-inline void func (int a1, int a2)

     - 사용되지 않는 코드는 포함되지 않는다.


스택 사용 시 주의 사항


Argument 전달


변수 사용


Global과 static 변수의 메모리 배치








'리눅스 > 기타' 카테고리의 다른 글

.bashrc에서 예약어 등록하기  (0) 2019.07.08
리눅스 7z 압축풀기  (0) 2019.07.08
MCU 선정, Cortex 시리즈, 보드 선정  (0) 2016.03.09
bash shell  (0) 2016.01.25

+ Recent posts