19. 4. 24.

Javascript 한화면 단위 Mouse Wheel 이동

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>MouseWheel</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <style type="text/css">
        html,body{ margin:0; padding:0; width:100%; height:100%;}
        .box{ width:100%; height:100%; position:relative; color:#ffffff; font-size:24pt;}
    </style>
    <script type="text/javascript">
        // 적용할 클래스명
        var className = "box";
        // 지금의 스크롤 위치를 담을 변수
        var currentScroll = 0;
        // 에니메이션 효과를 주기위한 function 명 선언
        var tim;
        window.onload = function () {
            /* Div Class 명 */
            // box클래스 추출
            var elm = document.getElementsByClassName(className);
            // box클래스 개수만큼 실행
            for (var i = 0; i < elm.length; i++) {
                // box 에 각각 마우스 휠 감지
                // 휠감지
                elm[i].addEventListener("mousewheel", MouseWheelHandler, false);
                // firefox 용 휠처리
                elm[i].addEventListener("DOMMouseScroll", MouseWheelHandler, true);
            }
        }
        function MouseWheelHandler(e) {
            // 스크롤 취소시킴(이걸 안할경우 도중에 명령을 받아 화면이 덜덜 거릴수 있음)
            e.preventDefault();
            // 휠값처리
            var delta = 0;
            if (!event) event = window.event;
            if (event.wheelDelta) {
                delta = event.wheelDelta / 120;
                if (window.opera) delta = -delta;
            }
            else if (event.detail)
                delta = -event.detail / 3;

            // 여러개일경우 다른 selector 을 확인하기위한 상위 dom 으로 이동
            var p = e.target.parentElement;
            // 몇번째 dom 인지 저장
            var index = Array.prototype.indexOf.call(p.children, e.target);
            // 같은 위치의 돔목록 을 저장
            var elmArr = e.target.parentElement.children;
            // 지금의 스크롤 위치 저장
            currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
            // 다음위치의 좌표(기본이므로 현재의 Y 좌표 저장)
            var NextTarget = currentScroll;
            // 마우스휠 위로
            if (delta > 0) {
                // 맨처음 지점 제외
                if (index > 0) {
                    // 이전 dom 의 index 번호
                    var no = (index - 1);
                    // 좌표위치 저장
                    NextTarget = elmArr[no].offsetTop;
                }
            }
            // 마우스휠 아래로
            else if (delta < 0)
            {
                // 맨마지막 지점 제외
                if (index < elmArr.length - 1) {
                    // 다음 dom 의 index 번호
                    var no = (index + 1);
                    // 좌표위치 저장
                    NextTarget = elmArr[no].offsetTop;
                }
            }
            // 애니메이션
            // 필요없으면 바로 window.scrollTo(0, NextTarget);
            // 에니메이션 초기화
            clearInterval(tim);
            // 애니메이션 실행
            tim = setInterval(tran, 1);
            // 애니메이션 function
            function tran() {
                // 이동속도 숫자가 작아질수록 느려짐
                var speed = 5;
                // 현재 스크롤과 이동후 스크롤이 같으면 정지시킨다 
                if (currentScroll == NextTarget) {
                    clearInterval(tran);
                } else {
                    // 스크롤을 위로 올릴 경우
                    if (currentScroll - speed > NextTarget)
                    {
                        currentScroll -= speed;
                    }
                    // 스크롤을 내일 경우
                    else if (currentScroll + speed < NextTarget)
                    {
                        currentScroll += speed;
                    }
                    // 스크롤이 속도로 지정된 변수보다 작을 경우 강제적으로 맞춰준다
                    else
                    {
                        currentScroll = NextTarget;
                    }
                    // 스크롤위치 변경
                    window.scrollTo(0, currentScroll);
                }
            }

        }
    </script>
</head>
<body>
    <div class="box" style="background-color:red;">1</div>
    <div class="box" style="background-color:orange;">2</div>
    <div class="box" style="background-color:yellow;">3</div>
    <div class="box" style="background-color:green;">4</div>
    <div class="box" style="background-color:blue;">5</div>
    <div class="box" style="background-color:indigo;">6</div>
    <div class="box" style="background-color:violet;">7</div>
</body>
</html>

JQuery 한화면 단위 Mouse Wheel 이동 를 참고해서 그냥 Javascript 로...

19. 4. 8.

GCP PHP + MariaDB + Nginx + vsftpd 구성

1. 프로젝트 생성
- 프로젝트명 : server
- 프로젝트 선택 : 전체 -> server

2. VM인스턴스 생성
- 메뉴 -> VM인스턴스 -> 만들기
- 이름 : mysite
- 머신유형 : 초소형(공유 vCPU 1 개)
- 부팅 디스크 : 변경 -> OS이미지 -> CentOS 7
- http 트래픽허용 체크
- 만들기

3. VM 인스턴스 목록
- SSH 클릭(인증되며 까만창 뜸)

4. 프롬프트 창내의 명령실행
- 업데이트 및 다운로드,압축풀기 설치
sudo yum update -y
sudo yum install -y wget unzip
- FTP 용 계정생성 및 비밀번호 생성
sudo useradd myid
sudo passwd myid
- 사이트 경로 생성 및 권한 추가
sudo mkdir /home/myid/mysite
sudo chmod +x /home/myid/mysite
- PHP + 모듈 설치
sudo yum install -y epel-release
sudo rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum --enablerepo=remi update remi-release
sudo yum --enablerepo=remi-php73 install -y php php-fpm php-mysql php-gd php-common php-cli php-json php-opcache php-devel php-imagick php-mbstring php-mcrypt php-mysqlnd php-pear php-xml php-xmlrpc php-soap php-dba php-bcmath php-pdo php-ldap
- vi 편집기("insert 키" : 편집 및 수정, "Escape 키" : 보기모드, ":wq" : 저장, ":q" : 저장하지않고 닫기, ":/검색어" : 검색어 검색 )
- 편집기로 PHP 설정파일(/etc/php.ini) 설정 명령
sudo vi /etc/php.ini
- php.ini 변경내용(검색해서 해당 값만 변경)
cgi.fix_pathinfo = 0
allow_url_fopen = Off
expose_php = Off
display_errors = Off
- 편집기로 php-fpm 설정파일(/etc/php-fpm.d/www.conf) 수정
sudo vi /etc/php-fpm.d/www.conf
- www.conf 변경내용 1. apache를 myid로 교체(apache로 검색)
user = myid
group = myid
- www.conf 변경내용 2. 주석제거(nobody로 검색)
listen.owner = nobody
listen.group = nobody
- Nginx 설정파일 생성
sudo vi /etc/yum.repos.d/nginx.repo
- nginx.repo 내용 입력(신규생성)
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
- Nginx 설치
sudo yum install -y nginx
- Nginx 설정파일 수정
sudo vi /etc/nginx/nginx.conf
- Nginx 설정파일 수정내용(http{}안에 추가)
server_tokens off;
- 방화벽 설정(http,https,ftp,database(MariaDB))
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload
- Nginx 기본 설정 삭제
sudo rm /etc/nginx/conf.d/default.conf
- Nginx 기본 설정 만들기
sudo vi /etc/nginx/conf.d/default.conf
- Nginx 기본 설정 만들기 내용(아래내용을 복사, 붙여넣기)
server {
    listen       80;
    server_name  localhost;
    charset utf-8;
    root   /home/myid/mysite;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        index index.php index.html index.htm;
    }
    error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /home/myid/mysite;
    }
    location ~ \.php(?:$|/) {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
- php-fpm, nginx 재시작
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl reload nginx
- ftp 프로그램인 vsftpd 설치
sudo yum -y install vsftpd
- vsftpd 설정파일 삭제
sudo rm /etc/vsftpd/vsftpd.conf
- vsftpd 설정파일 생성
sudo vi /etc/vsftpd/vsftpd.conf
- vsftpd 설정파일 내용입력
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=yes
pasv_enable=Yes
pasv_max_port=40000
pasv_min_port=40000
- SELinux 권한에서 차단되는 경우가 있으므로 처리
sudo setenforce 0
- SELinux 권한에서 차단되는 경우가 있으므로 설정도 편집
sudo vi /etc/selinux/config
- SELinux 권한에서 차단되는 경우가 있으므로 설정도 편집(내용수정 disabled)
SELINUX=disabled
- vsftpd 설정된 서비스로 재시작
sudo systemctl enable vsftpd
sudo systemctl restart vsftpd
- ftp 불가한 아이디 목록1에서 편집(root 제거)
sudo vi /etc/vsftpd/ftpusers
- ftp 불가한 아이디 목록2에서 편집(root 제거)
sudo vi /etc/vsftpd/user_list
- ftp 접속권한 편집
sudo chown myid:myid /home/myid/mysite/
sudo chmod 555 /home/myid
sudo chmod 777 /home/myid/mysite
- ftp 아이디 myid 접근권한 편집
sudo vi /etc/passwd
- ftp 아이디 myid 접근권한 편집맨아래 추가
myid:x:1001:1002::/home/myid/mysite:
myid:x:1001:1002::/home/myid/mysite:/bin/bash
- MariaDB 설정 추가
sudo vi /etc/yum.repos.d/MariaDB.repo
- MariaDB 설정 추가(새로생성)
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
- MariaDB 설치 및 서비스 추가
sudo yum install -y MariaDB-client MariaDB-server
sudo systemctl start mariadb
sudo systemctl enable mariadb
- MariaDB root 루트 비밀번호 생성 및 설정(비밀번호,접속권한,test테이블등)
sudo mysql_secure_installation
- 그냥 순서대로함...
password
password
y
n
y
y
- MariaDB 재시작
sudo systemctl restart mariadb
- MariaDB 접속
sudo mysql -u root -p
- MariaDB 패스워드 로그인후 원격접속 가능하도록 root에 권한 부여, 비밀번호 다시 부여 후 접속 종료
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
exit
5. Google Cloud Platform 메뉴에서 VPC네트워크 방화벽설정
- Google Cloud Platform 메뉴 -> 방화벽규칙 -> 만들기
- 이름 : mysite
- 대상 : 네트워크의 모든인스턴스
- 소스 IP 범위: 0.0.0.0/0
- 프로토콜 및 포트 : tcp 체크 -> 20-21,3306,40000
- 만들기
6. PHP MariaDB 접속 테스트 - index.php 생성
sudo vi /home/myid/mysite/index.php
- index.php 내용
<?php
$conn=mysqli_connect('127.0.0.1', 'root', 'password');
if($conn) 
  echo "db연결성공";
else
  echo "db연결 실패"; 
?>
7. ssh 옆에 외부 아이피 클릭 및 확인
8. ftp는 fileziller 이용하거나 크롬 브라우저로 접속확인가능

19. 4. 4.

C#으로 MYSQL 연동

C# 에서 MySql을 연동하려면 사전 준비가 필요.

기준 : 비주얼스튜디오
1. 프로젝트 생성할 때 프레임워크를 4.5.2로 생성
2. 솔루션 탐색기의 프로젝트명에서 우클릭
3. NuGet 패키지 관리
4. MySql.Data 설치(8.0.15 버전으로 설치함)

insert,update,delete
using MySql.Data.MySqlClient;

namespace MySql
{
    class Program
    {
        static void Main(string[] args)
        {
            // Sql 연결정보(서버:127.0.0.1, 아이디:sa, 비밀번호 : password, db : member)
            string connectionString = "server = 127.0.0.1; uid = sa; pwd = password; database = member;";
            // Sql 새연결정보 생성
            MySqlConnection sqlConn = new MySqlConnection(connectionString);
            MySqlCommand sqlComm = new MySqlCommand();
            sqlComm.Connection = sqlConn;
            sqlComm.CommandText = "insert into tbl_member (id,name,addr) values ('abc','홍길동','서울');";
            //sqlComm.CommandText = "update tbl_member set addr='서울' where id='abc' and name='홍길동';";
            //sqlComm.CommandText = "delete tbl_member where id='abc' and name='홍길동' and addr='서울';";
            sqlConn.Open();
            sqlComm.ExecuteNonQuery();
            sqlConn.Close();
        }
    }
}


select
using MySql.Data.MySqlClient;
using System;

namespace MySql
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = "server = 127.0.0.1,3535; uid = sa; pwd = password; database = member;";
            // Sql 새연결정보 생성
            MySqlConnection sqlConn = new MySqlConnection(connectionString);
            MySqlCommand sqlComm = new MySqlCommand();
            sqlComm.Connection = sqlConn;
            sqlComm.CommandText = "select id,addr from tbl_member where name='홍길동' order by id asc limit 10";
            sqlConn.Open();
            using (MySqlDataReader SqlRs = sqlComm.ExecuteReader())
            {
                Console.WriteLine("ID \t \t | Address");
                while (SqlRs.Read())
                {
                    Console.WriteLine(string.Format("{0} \t \t | {1}", SqlRs[0].ToString(), SqlRs[1].ToString()));
                }
            }
            sqlConn.Close();
        }
    }
}

이미지 파일 업로드 전 미리보기

<!DOCTYPE html> 
<html lang="ko"> 
<head> 
<meta charset="utf-8"/>
<title>업로드 미리보기(추가버전)</title>
<style>
    ul,li{ margin: 0; padding: 0;}
    li{ list-style: none; width: 100%; display: inline-block; margin: 0.3em 0;}
    .preview{ display: inline-block; width: 82px; height: 82px; float: left;}
    .imgUpBtn{ display: inline-block; padding: 1.9em 2em; background-color:cornflowerblue; color: #fff; font-size: 16px;  font-weight: 700; border: 0;}
    .ImgRemoveBtn{ display: inline-block; padding: 1.9em 2em; color: #fff; background-color: #555;font-size: 16px; font-weight: 700;}
    #ImgAddBtn{ padding: 1.9em 2em; color: #fff; background-color:coral; font-weight: 700;}
</style>
<script> 
// 미리보기 목록 추가 
function fileinputAdd(){ 
    // 미리보기 리스트 추가 
    var li = "<img class=\"preview\" alt=\"\" />" 
            + "<button class=\"imgUpBtn\">이미지 업로드</button>" 
            + "<a class=\"ImgRemoveBtn\">삭제</a>"; 
    var ul = document.getElementById("image-list"); 
    ul.innerHTML += "<li>"+li+"</li>"; 
    // 인풋 파일 생성 
    var fileinput = document.createElement("INPUT"); 
    fileinput.setAttribute("type", "file"); 
    fileinput.setAttribute("class", "files"); 
    fileinput.setAttribute("name", "files[]"); 
    fileinput.setAttribute("accept", "image/jpeg, image/png"); 
    fileinput.setAttribute("style", "display:none;"); 
    document.body.appendChild(fileinput); 
    // 삭제도 있어야될것 같아서 넣어봄 
    var removeBtn = document.getElementsByClassName("ImgRemoveBtn"); 
    for(var i = 0; i < removeBtn.length; i++){ 
          removeBtn[i].setAttribute("onclick","fileinputRemove("+i+");"); 
   } 
   // 새로 생성되면서 파일 미리보기 다시 로드 
   previewInputReload(); 
   // 이미지 업로드 버튼 기능 다시 로드 
   fileimgUpBtnReload(); 
} 
// 미리보기 개별 삭제 
function fileinputRemove(index){ 
    var li = document.querySelectorAll('#image-list li')[index]; 
    var input = document.getElementsByClassName('files')[index]; 
    var removeBtn = document.getElementsByClassName("ImgRemoveBtn")[index]; 
    if(li != undefined){ 
          input.remove(); 
          li.remove(); 
          removeBtn.remove(); 
          li = document.querySelectorAll('#image-list li'); 
          for(var i = 0; i < li.length; i++){ 
                var removeBtn = document.getElementsByClassName("ImgRemoveBtn")[i]; 
                removeBtn.setAttribute("onclick","fileinputRemove("+i+");"); 
         } 
  } 
  // 삭제되면되면 파일 미리보기 다시 로드 
  previewInputReload(); 
  // 삭제후 이미지 업로드 버튼 기능 다시 로드 
  fileimgUpBtnReload(); 
} 
// 파일 업로드기능 function 연결하는 부분 
function fileimgUpBtnReload(){ 
    var uploadBtn = document.getElementsByClassName('imgUpBtn'); 
    for(var i = 0; i <uploadBtn.length; i++){ 
          uploadBtn[i].setAttribute("onclick","uploadFile("+i+");"); 
   } 
} 
// 이미지 업로드 버튼 눌를때 해당 파일인풋 대신 클릭 
function uploadFile(index){ 
    document.getElementsByClassName("files")[index].click(); 
} 
// 이미지 미리보기 관련 다시 로드 
function previewInputReload(){ 
    var input = document.getElementsByClassName('files'); 
    for(var i=0; i< input.length;i++){ 
          input[i].setAttribute("onchange","document.getElementsByClassName('preview')["+i+"].src=window.URL.createObjectURL(this.files[0])"); 
   } 
} 
// window 로드시 
window.onload = function(){ 
    // image-list 에 기본적으로 파일 업로드 하나는 넣어줌.. 
    fileinputAdd(); 
    var AddBtn = document.getElementById("ImgAddBtn"); 
    // 파일 추가 클릭 이벤트 생성 
    AddBtn.addEventListener("click", function(){ 
          fileinputAdd(); 
   },false); 
} 
</script> 
</head> 
<body> 
    <button id="ImgAddBtn">파일추가</button> 
    <ul id="image-list"></ul> 
</body> 
</html> 

<!DOCTYPE html> 
<html lang="ko"> 
<head> 
<meta charset="utf-8"/>
<title>업로드 미리보기(단딜(multiple) 버전)</title>
<style>
    #image-list > img{ width: 82px; height: 82px; margin: 1px; display: inline-block;}
    #imgUpBtn{ padding: 1.9em 2em; color: #fff; background-color:coral; font-weight: 700;}
</style>
<script>
// window 로드시 
window.onload = function(){ 
    var UpBtn = document.getElementById("imgUpBtn"); 
    // 파일 추가 클릭 이벤트 생성 
    UpBtn.addEventListener("click", function(){ 
        var fileinput = document.createElement("INPUT"); 
        fileinput.setAttribute("type", "file"); 
        fileinput.setAttribute("class", "files"); 
        fileinput.setAttribute("name", "files[]");
        fileinput.setAttribute("id", "imgUpInput");
        fileinput.setAttribute("multiple", "multiple");
        fileinput.setAttribute("accept", "image/jpeg, image/png"); 
        fileinput.setAttribute("style", "display:none;");
        // 파일 변동시 처리
        fileinput.setAttribute("onchange","previewImages(this.files);");
        document.body.appendChild(fileinput);
        // input file 를 눌러줌
        document.getElementById("imgUpInput").click();
    },false); 
} 
function previewImages(obj){
    for(var i = 0; i < obj.length; i++){
        var img = document.createElement("img");
        img.setAttribute("src", window.URL.createObjectURL(obj[i]));
        var list = document.getElementById("image-list");
        list.appendChild(img);
    }
}
</script> 
</head> 
<body>
    <button id="imgUpBtn">이미지 업로드</button>
    <div id="image-list"></div> 
</body> 
</html>