git 사용시 the file will have its original line endings in your working directory 에러 발생시 해결방법

윈도와 리눅스의 줄바꿈 차이 때문에 발생하는 문제

항상 윈도에서 작업하려면  아래 명령어를 써주면, 알아서 CTLF 를 git가 붙여준다.

git config --global core.autocrlf true

맥과 리눅스에서도 같이 작업하려면.. 아래 명령어를 통해 단방향으로만 붙여주게 함

git config --global core.autocrlf input

CentOS7 에서 phantomjs 가 error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory 에러 뿜을때 해결방법

일단 현재 구글링해서 찾을수있는 모든걸 다 찾아봤는데 결국 실패
phantomsjs 을 설치하고 실행하니 다음의 에러메시지가 발생
error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory
구글링결과 fontconfig 와 freetype 가 있어야 한다고 해서 아래와 같이 실행하니 둘다 설치가 되어있다고 나옴.
yum -y install fontconfig
yum -y freetype*
하다하다 안되서 최종적으로 centos7용 일본의 레포지토리를 추가해서 yum으로 phantomsjs 를 설치 (기존에는 composer 로 설치했었으나 에러 발생했음)
yum -y install epel-release
rpm -ivh http://repo.okay.com.mx/centos/7/x86_64/release/okay-release-1-1.noarch.rpm
yum -y install phantomjs
속도가 느려서 15메가 다운받는데 30분 정도 걸린것 같음.
뭐 결론은 되느냐면????

잘된다!!!! 6시간 헤메다가 성공
아 한글이 안나와서 한글폰트 추가로 설치함. ^^
yum install cjkuni-fonts-common cjkuni-ukai-fonts cjkuni-uming-fonts
yum install libXext libXrender xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi
fc-cache -f -v
wget http://cdn.naver.com/naver/NanumFont/fontfiles/NanumFont_TTF_ALL.zip
mkdir /usr/share/fonts/nanumfont
unzip NanumFont_TTF_ALL.zip -d /usr/share/fonts/nanumfont
cd /usr/share/fonts/nanumfont
rm -f NanumFont_TTF_ALL.zip
rm -f /usr/share/fonts/nanumfont/NanumBrush.ttf
rm -f /usr/share/fonts/nanumfont/NanumPen.ttf
fc-cache -r

UTF-8 파일 다운로드처리 이어받기 및 속도 제한 함수.

참조 사이트 : https://www.phpschool.com/link/tipntech/78587

<?php
/**
 *  PHP 파일 다운로드 함수.
 *  Version 1.3
 *
 *  Copyright (c) 2014 성기진 Kijin Sung
 *
 *  License: MIT License (a.k.a. X11 License)
 *  http://www.olis.or.kr/ossw/license/license/detail.do?lid=1006
 *
 *  아래와 같은 기능을 수행한다.
 *
 *  1. UTF-8 파일명이 깨지지 않도록 한다. (RFC2231/5987 표준 및 브라우저 버전별 특성 감안)
 *  2. 일부 OS에서 파일명에 사용할 수 없는 문자가 있는 경우 제거 또는 치환한다.
 *  3. 캐싱을 원할 경우 적절한 Cache-Control, Expires 등의 헤더를 넣어준다.
 *  4. IE 8 이하에서 캐싱방지 헤더 사용시 다운로드 오류가 발생하는 문제를 보완한다.
 *  5. 이어받기를 지원한다. (Range 헤더 자동 감지, Accept-Ranges 헤더 자동 생성)
 *  6. 일부 PHP 버전에서 대용량 파일 다운로드시 메모리 누수를 막는다.
 *  7. 다운로드 속도를 제한할 수 있다.
 *
 *  사용법  :  send_attachment('클라이언트에게 보여줄 파일명', '서버측 파일 경로', [캐싱할 기간], [속도 제한]);
 *
 *             아래의 예는 foo.jpg라는 파일을 사진.jpg라는 이름으로 다운로드한다.
 *             send_attachment('사진.jpg', '/srv/www/files/uploads/foo.jpg');
 *
 *             아래의 예는 bar.mp3라는 파일을 24시간 동안 캐싱하고 다운로드 속도를 300KB/s로 제한한다.
 *             send_attachment('bar.mp3', '/srv/www/files/uploads/bar.mp3', 60 * 60 * 24, 300);
 *
 *  반환값  :  전송에 성공한 경우 true, 실패한 경우 false를 반환한다.
 *
 *  주  의  :  1. 전송이 완료된 후 다른 내용을 또 출력하면 파일이 깨질 수 있다.
 *                가능하면 그냥 곧바로 exit; 해주기를 권장한다.
 *             2. PHP 5.1 미만, UTF-8 환경이 아닌 경우 정상 작동을 보장할 수 없다.
 *                특히 EUC-KR 환경에서는 틀림없이 파일명이 깨진다.
 *             3. FastCGI/FPM 환경에서 속도 제한 기능을 사용할 경우 PHP 프로세스를 오랫동안 점유할 수 있다.
 *                따라서 가능하면 웹서버 자체의 속도 제한 기능을 사용하는 것이 좋다.
 *             4. 안드로이드 일부 버전의 기본 브라우저에서 한글 파일명이 깨질 수 있다.
 */
function send_attachment($filename, $server_filename, $expires = 0, $speed_limit = 0) {
    
    // 서버측 파일명을 확인한다.
    
    if (!file_exists($server_filename) || !is_readable($server_filename)) {
        return false;
    }
    if (($filesize = filesize($server_filename)) == 0) {
        return false;
    }
    if (($fp = @fopen($server_filename, 'rb')) === false) {
        return false;
    }
    
    // 파일명에 사용할 수 없는 문자를 모두 제거하거나 안전한 문자로 치환한다.
    
    $illegal = array('\\', '/', '<', '>', '{', '}', ':', ';', '|', '"', '~', '`', '@', '#', '$', '%', '^', '&', '*', '?');
    $replace = array('', '', '(', ')', '(', ')', '_', ',', '_', '', '_', '\'', '_', '_', '_', '_', '_', '_', '', '');
    $filename = str_replace($illegal, $replace, $filename);
    $filename = preg_replace('/([\\x00-\\x1f\\x7f\\xff]+)/', '', $filename);
    
    // 유니코드가 허용하는 다양한 공백 문자들을 모두 일반 공백 문자(0x20)로 치환한다.
    
    $filename = trim(preg_replace('/[\\pZ\\pC]+/u', ' ', $filename));
    
    // 위에서 치환하다가 앞뒤에 점이 남거나 대체 문자가 중복된 경우를 정리한다.
    
    $filename = trim($filename, ' .-_');
    $filename = preg_replace('/__+/', '_', $filename);
    if ($filename === '') {
        return false;
    }
    
    // 브라우저의 User-Agent 값을 받아온다.
    
    $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
    $old_ie = (bool)preg_match('#MSIE [3-8]\.#', $ua);
    
    // 파일명에 숫자와 영문 등만 포함된 경우 브라우저와 무관하게 그냥 헤더에 넣는다.
    
    if (preg_match('/^[a-zA-Z0-9_.-]+$/', $filename)) {
        $header = 'filename="' . $filename . '"';
    }
    
    // IE 9 미만 또는 Firefox 5 미만의 경우.
    
    elseif ($old_ie || preg_match('#Firefox/(\d+)\.#', $ua, $matches) && $matches[1] < 5) {
        $header = 'filename="' . rawurlencode($filename) . '"';
    }
    
    // Chrome 11 미만의 경우.
    
    elseif (preg_match('#Chrome/(\d+)\.#', $ua, $matches) && $matches[1] < 11) {
        $header = 'filename=' . $filename;
    }
    
    // Safari 6 미만의 경우.
    
    elseif (preg_match('#Safari/(\d+)\.#', $ua, $matches) && $matches[1] < 6) {
        $header = 'filename=' . $filename;
    }
    
    // 안드로이드 브라우저의 경우. (버전에 따라 여전히 한글은 깨질 수 있다. IE보다 못한 녀석!)
    
    elseif (preg_match('#Android #', $ua, $matches)) {
        $header = 'filename="' . $filename . '"';
    }
    
    // 그 밖의 브라우저들은 RFC2231/5987 표준을 준수하는 것으로 가정한다.
    // 단, 만약에 대비하여 Firefox 구 버전 형태의 filename 정보를 한 번 더 넣어준다.
    
    else {
        $header = "filename*=UTF-8''" . rawurlencode($filename) . '; filename="' . rawurlencode($filename) . '"';
    }
    
    // 캐싱이 금지된 경우...
    
    if (!$expires) {
        
        // 익스플로러 8 이하 버전은 SSL 사용시 no-cache 및 pragma 헤더를 알아듣지 못한다.
        // 그냥 알아듣지 못할 뿐 아니라 완전 황당하게 오작동하는 경우도 있으므로
        // 캐싱 금지를 원할 경우 아래와 같은 헤더를 사용해야 한다.
        
        if ($old_ie) {
            header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0');
            header('Expires: Sat, 01 Jan 2000 00:00:00 GMT');
        }
        
        // 그 밖의 브라우저들은 말을 잘 듣는 착한 어린이!
        
        else {
            header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
            header('Expires: Sat, 01 Jan 2000 00:00:00 GMT');
        }
    }
    
    // 캐싱이 허용된 경우...
    
    else {
        header('Cache-Control: max-age=' . (int)$expires);
        header('Expires: ' . gmdate('D, d M Y H:i:s', time() + (int)$expires) . ' GMT');
    }
    
    // 이어받기를 요청한 경우 여기서 처리해 준다.
    
    if (isset($_SERVER['HTTP_RANGE']) && preg_match('/^bytes=(\d+)-/', $_SERVER['HTTP_RANGE'], $matches)) {
        $range_start = $matches[1];
        if ($range_start < 0 || $range_start > $filesize) {
            header('HTTP/1.1 416 Requested Range Not Satisfiable');
            return false;
        }
        header('HTTP/1.1 206 Partial Content');
        header('Content-Range: bytes ' . $range_start . '-' . ($filesize - 1) . '/' . $filesize);
        header('Content-Length: ' . ($filesize - $range_start));
    } else {
        $range_start = 0;
        header('Content-Length: ' . $filesize);
    }
    
    // 나머지 모든 헤더를 전송한다.
    
    header('Accept-Ranges: bytes');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; ' . $header);
    
    // 출력 버퍼를 비운다.
    // 파일 앞뒤에 불필요한 내용이 붙는 것을 막고, 메모리 사용량을 줄이는 효과가 있다.
    
    while (ob_get_level()) {
        ob_end_clean();
    }
    
    // 파일을 64KB마다 끊어서 전송하고 출력 버퍼를 비운다.
    // readfile() 함수 사용시 메모리 누수가 발생하는 경우가 가끔 있다.
    
    $block_size = 16 * 1024;
    $speed_sleep = $speed_limit > 0 ? round(($block_size / $speed_limit / 1024) * 1000000) : 0;
    
    $buffer = '';
    if ($range_start > 0) {
        fseek($fp, $range_start);
        $alignment = (ceil($range_start / $block_size) * $block_size) - $range_start;
        if ($alignment > 0) {
            $buffer = fread($fp, $alignment);
            echo $buffer; unset($buffer); flush();
        }
    }
    while (!feof($fp)) {
        $buffer = fread($fp, $block_size);
        echo $buffer; unset($buffer); flush();
        usleep($speed_sleep);
    }
    
    fclose($fp);
    
    // 전송에 성공했으면 true를 반환한다.
    
    return true;
}

재사용 php 파일을 쉽게 관리한다. composer 설치 및 사용하기

아 본좌가 정말 하나씩 배워가는 재미가 쏠쏠하다.

기존 카카오톡 로그인, 네이버 로그인 국내업체의 로그인은 curl 을 통해서 웹으로 불러오고 보여지는걸 긁어오는 방식으로 소셜 로그인을 달았는데...

구글과 페이스북 같은 글로벌 소셜 로그인을 달려니 이미 오브젝트로 쉽게 쓸수있게 만들어 놨더라..

구글은 삽질하면서 인터넷 검색해서 달았는데, 페이스북의 오브젝트를 받으려니.. 이미 github에 만들어진 파일은 있는데. vendor 이 먼지. autoload.php 는 뭔지. 아 젼나 헷갈렸다.

그 중심에 composer 가 있다는 것만 알면 된다..

composer를 yum으로 설치하려니까.. 수십만가지의 의존성 파일이 같이 설치되야 한다고 나오더라. 이거 원...



=============================================================================================================================================================================================================================================
 Package                                                                  Arch                                           Version                                                    Repository                                          Size
=============================================================================================================================================================================================================================================
Installing:
 composer                                                                 noarch                                         1.7.2-1.el7                                                epel                                               383 k
Installing for dependencies:
 php-PsrLog                                                               noarch                                         1.0.2-2.el7                                                epel                                                12 k
 php-composer-ca-bundle                                                   noarch                                         1.0.2-1.el7                                                epel                                                12 k
 php-composer-semver                                                      noarch                                         1.4.2-1.el7                                                epel                                                17 k
 php-composer-spdx-licenses                                               noarch                                         1.4.0-1.el7                                                epel                                                17 k
 php-composer-xdebug-handler                                              noarch                                         1.3.0-1.el7                                                epel                                                18 k
 php-intl                                                                 x86_64                                         7.2.10-1.el7.remi                                          remi-php72                                         215 k
 php-jsonlint                                                             noarch                                         1.6.1-1.el7                                                epel                                                17 k
 php-justinrainbow-json-schema5                                           noarch                                         5.2.7-1.el7                                                epel                                                41 k
 php-paragonie-random-compat                                              noarch                                         2.0.12-1.el7                                               epel                                                26 k
 php-password-compat                                                      noarch                                         1.0.4-1.el7                                                epel                                                10 k
 php-seld-phar-utils                                                      noarch                                         1.0.1-1.el7                                                epel                                               7.7 k
 php-symfony-browser-kit                                                  noarch                                         2.8.12-2.el7                                               epel                                                23 k
 php-symfony-class-loader                                                 noarch                                         2.8.12-2.el7                                               epel                                                26 k
 php-symfony-common                                                       noarch                                         2.8.12-2.el7                                               epel                                               124 k
 php-symfony-config                                                       noarch                                         2.8.12-2.el7                                               epel                                                51 k
 php-symfony-console                                                      noarch                                         2.8.12-2.el7                                               epel                                                88 k
 php-symfony-css-selector                                                 noarch                                         2.8.12-2.el7                                               epel                                                37 k
 php-symfony-debug                                                        noarch                                         2.8.12-2.el7                                               epel                                                36 k
 php-symfony-dependency-injection                                         noarch                                         2.8.12-2.el7                                               epel                                                83 k
 php-symfony-dom-crawler                                                  noarch                                         2.8.12-2.el7                                               epel                                                30 k
 php-symfony-event-dispatcher                                             noarch                                         2.8.12-2.el7                                               epel                                                24 k
 php-symfony-expression-language                                          noarch                                         2.8.12-2.el7                                               epel                                                27 k
 php-symfony-filesystem                                                   noarch                                         2.8.12-2.el7                                               epel                                                22 k
 php-symfony-finder                                                       noarch                                         2.8.12-2.el7                                               epel                                                38 k
 php-symfony-http-foundation                                              noarch                                         2.8.12-2.el7                                               epel                                                93 k
 php-symfony-http-kernel                                                  noarch                                         2.8.12-2.el7                                               epel                                                99 k
 php-symfony-polyfill                                                     noarch                                         1.5.0-1.el7                                                epel                                                26 k
 php-symfony-process                                                      noarch                                         2.8.12-2.el7                                               epel                                                32 k
 php-symfony-var-dumper                                                   noarch                                         2.8.12-2.el7                                               epel                                                48 k
 php-symfony-yaml                                                         noarch                                         2.8.12-2.el7                                               epel                                                28 k

Transaction Summary
=============================================================================================================================================================================================================================================
Install  1 Package (+30 Dependent packages)

Total download size: 1.7 M
Installed size: 6.3 M
Is this ok [y/d/N]:

그래서 그냥 composer만 깔았다.  이렇게.
php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=/usr/local/bin/
ln -s /usr/local/bin/composer.phar /usr/local/bin/composer

끝.. 이걸로 뭘하냐고??
내가 지금 하려는건 이거다.

https://developers.facebook.com/docs/php/howto/example_facebook_login

SQL문 간단히 배워보자.. phpmyadmin 에 의존하니까 터미널을 쓸수밖에 없을때 진짜 난감했다. sql 테이블 구조보기 나 테이블 컬럼 추가 삭제 할때.

아래의 mysql 터미널로 들어가는 방법은 일단 알고있어야 함.

mysql -uroot -p
mysql>  프롬프트에서 내리는 sql문 공식에 대해서 이야기 한다.

1. 테이블 생성 뭐 요정도 보면 나머진 알아서 응용되리라 봄.

CREATE TABLE admin_log(
  no int(11) NOT NULL,
  reg_date date NOT NULL DEFAULT current_timestamp(),
  name varchar(50) NOT NULL,
  pds_quality float NOT NULL DEFAULT 100,
  fees tinyint(4) UNSIGNED NOT NULL DEFAULT 50,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

2. 키 만들기 (프라이머리키, 그리고 유니크, 인덱스 키를 만들고)

ALTER TABLE admin_log
  ADD PRIMARY KEY (no),
  ADD UNIQUE KEY name (name),
  ADD KEY reg_date (reg_date);

3. 위 테이블에 vote_avarage 컬럼을 추가했다.

ALTER TABLE `admin_log` add (`vote_avarage` float DEFAULT 0 NOT NULL);

4. 그리고 삭제까지.

ALTER TABLE admin_log drop vote_avarage;

윈도우10 공인인증서 위치 (윈도우7 이상 똑까틈)

시작 -> 실행에서 아래 유저 폴더명을 입력 (단축키 윈도우키+R)

%AppData%

참고로 윈도우는 대소문자는 구분하지 않는다.

저기 들어갔는데 왜 Roming 폴더가 나오지? 한단계 상위로 가서 AppData 우측에 아래화살표를 누르면 저렇게 3개 폴더가 나온다. LocalLow 로 들어가소 NPKI를 넣으면 땡~

인증서 넣는 폴더 매번 까먹는다.. 뭐 모르는게 정상이고 할떄마다 또 여기글을 찾아서 보면 되겠지...