• composer.json
"require":{
  "google/apiclient" : "^2.0"
}
  • routes/web.php
Route::get('googleLoginPage',['as'=>'googleLoginPage', 'uses'=> 'GoogleController@googleLoginPage'])
Route::get('callbackGoogle',['as'=>'callbackGoogle', 'uses'=> 'GoogleController@callbackGoogle'])
  • GoogleController
use Google/Client as Google_Client;

# 구글 로그인 페이지
public function googleLoginPage(){
  $this->getGoogleOauthClient("login");
}

# 구글 유저 정보 가져오기
public function callbackGoogle(){
  $client = $this->getGoogleOauthClient("auth");
  $plus = new \Google_Service_Oauth2($client);
  
  $userData = $plus->userinfo->get();
  
  # 유저 정보
  $social_id    = $userData->id; 
  $social_email = $userData->email;
  $social_name  = $userData->name;  
  
}

private function getGoogleOauthClient($type){
  $client_id = $this->client_id;
  $client_secret = $this->client_secret;
  $authCode = $_GET['code'];
  $redirectURI = '도메인/callbacokGoogle';
  
  $client = new Google_Client();
  $client->setScopse(
    array(
      \Google_service_Oauth2::USERINFO_PRIFILE,
      \Google_service_Oauth2::USERINFO_EMAIL
    )
  );
  
  $client->setClientId($client_id);
  $client->setRedirectUri($redirectURI);
  $client->setAccessType('offline');
  $client->setPrompt('select_account consent');
  
  if(!empty($authCode) && $type == 'auth'){
    # 로그인 페이지가 아닌, 인증 받은 후 유저 정보를 가져올때 $client_secret 필요
    $client->setClientSecret($client_secret);
  }
  
  if($client->isAccessTokenExpired()){
    if($client->getRefreshToken()){
      $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    }else{
       if(!empty($authCode) && $type == 'auth'){
          $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
          $client->setAccessToken($accessToken);
          if(array_ket_exists('error', $accessToken)){
            throw new Exception(join(',',$accessToken));
          }
       }elseif($type =='login'){
         # 구글 로그인 페이지로 리다이렉트
         header("location".$client->createAuthUrl());
       }
    }
  }  
  if($type != "login"){
    return $client;
  }  
}

Screen 이란?

Linux에서 독립적으로 동작하는 가상 터미널을 띄어주는

-> 백그라운드로 동작하는 가상 터미널

 

Screen 사용하는 옵션 명령어

 

[세션이름] : [아이디].name

 

Screen - S [세션이름] : screen 세션 이름 지정 시작

Screen -R [세션이름] :  세션이 있을경우, 이전 세션을 불러와서 실행 없을 경우,

해당이름을 세션 만들어서 실행

Screen -ls (screen -list) : 현재 존재하는 스크린 리스트 출력

Screen -x [세션이름] : 실행 중인 스크린에 다시 진입

-> -R 옵션은 해당 스크린에 여러명이 들어가도 무슨 명령을치는지 모르지만. -X 옵션은 여려명이 들어가도 화면처럼 음직여 상대방이 무슨 명령을 치는지 있다.

 

세션에서 빠져 나올때 세션작업유지 : ctrl + a,d (detach)

 

Screen 끝내기

Screen -ls  : [아이디] 확인

Screen -S [아이디] -X quit

 

 

'Server' 카테고리의 다른 글

WSL php 서버 셋팅하기 (nginx + php-fpm + mysql)  (0) 2022.01.21

오늘도 조용하기만 한 탐정사무소에 편지 한 통이 도착했다. 

플레이 타임 : 80분

추천 : 5/5

공포도 : 3/5 ( 극쫄기준 )

활동성 : 2/5

 

경성 할 겸 버스티드의 탐정 B도 연방으로 예약을 했다.

극쫄2명이서 가서.. 일부 공포 구간이 있다고는 하지만 서로 으쌰 으쌰 하며 할 수 있지! 이랬는데

진짜... 공포 구간에 정말 가기 싫을 정도로 너무 무서웠다..ㅠㅠ

스토리 진행을 위해 어쩔 수 없이 진행하긴 했지만...

이후에 범인 추리하는 부분도 있다 보니 더 몰입하여 진행할 수 있었다.

 

 

1. node.js 설치 
    - url : https://nodejs.org/ko/
    - 제일 최신본으로 설치

2. Visual Studio Code 
    1) 설치 url : https://code.visualstudio.com/
    2) 파일 -> 폴더열기 새 프로젝트 파일 가져오기
    3) 아래 터미널을 열고, npx create-react-app 프로젝트명 입력 -> 생성이 된다.

※ 만일 'create-react-app'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 라고 나올경우, Visual Studio Code의 기본적인 터미널이 PowerShell이니, cmd로 변경해야된다.

PowerShell -> cmd로 변경 방법
1) Ctrl + Shift + P 단축키로 명령 팔레트를 열고,
2) 'select default shell' 검색 'Terminal:Select Default Shell' 명령을 선택
3) 'Commnad Prompt'를 선택하고 아래 터미널 종료후 다시 터미널을 키면 cmd로 변경이 된다.

프로젝트 생성 후 실행 방법
해당 프로젝트 폴더를 불러온 후, npm start 터미널 입력하면 됩니다.

오늘은 WSL을 이용한 php 서버 설정을 할 것이다.

WSL(Windows Subsystem for Linux)이란?

윈도우에서 리눅스 환경처럼 Powershell을 Bash 처럼 사용하고 Linux 명령어를 사용할 수 있으며, 커널로 이용을 할 수 있다.

 

WSL 설치

요구사항 버전

- Window 10 버전 2004 이상 또는 Window 11

- Linux 하위 시스템 활성화

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

- 가상머신 플랫폼 기능을 활성화

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

- 설치

wsl --instal

 

WSL을 설치를 하면 ubuntu가 설치가 된다.

이후 ubuntu에서 nginx, php-fpm, mysql 를 설치를 한다.

nginx 설치

sudo apt-get install nginx
확인 nginx -v
실행 : sudo service nginx start
상태확인 : sudo service nginx status
중지 : sudo service nginx stop

php 설치 (버전을 따로 지정을 안하면 7.4로 설치가 된다.)

sudo apt-get install php php-fpm php-mbstring php-xml php-mysql
확인 : php -v
실행 : sudo service php7.4-fpm start
상태확인 : sudo service php7.4-fpm status
중지 : sudo service php7.4-fpm stop

Mysql 설치

sudo apt install mysql-server
확인 : mysql --version
실행 : - /etc/init.d/mysql start
        - sudo service mysql start
상태확인 : sudo service mysql status
중지 : sudo service mysql stop

Mysql 설정 하기

접속
mysql -u root -p

사용자 만들기
create user '사용자명'@'localhost' identified by '비밀번호';

user 생성 확인
select user, host from mysql.user

데이터 베이스 생성
create database DB명;

생성 확인
show databases;

생성한 database에 사용자 권한주기
grant all privileges on DB명.* to 사용자@localhost;

전체적인 서비스 상태 확인

service --status-all

nginx 연결 - unix domain socket

sudo vim /etc/nginx/sites-available/default
주석제거
location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        }

'Server' 카테고리의 다른 글

Screen 사용명령어  (0) 2022.03.29

D.P에서 나왔던 몬티홀 법칙 

첫 번째 선택을 안 바꾸고 당첨될 확률과

꽝을 본 후 선택 바꿨을 때 당첨될 확률을 봤는데..

숫자를 점점 늘리니깐 바꿨을 때가 더 높게 나오더라고요 ㅋㅋ

<?php

function montyhall($user){
   $nochange_count = 0;
   $change_count = 0;
   $door = [1,2,3];
   
	

   for($i=0; $i < $user; $i++){
      $car = rand(1,3);
      $user_choice = rand(1,3);
	// 유저가 선택을 바꾸지 않았을때 당첨 count
      if($car == $user_choice){
         $nochange_count +=1;
    }
   
      $monty_door, $second_choice;

	// 사회자가 꽝의 문을 골라줌
      foreach($door as  $val){
         if($val != $car && $val != $user_choice){
            $monty_door = $val;
         }
      }
      $monty_open = $monty_door;
	
	// 사회자가 열어준 문도 아닌, 유저가 처음에 선택한 문도 아님 -> 선택을 바꿨을 경우
      foreach($door as $val2){
         if($val2 != $monty_open && $val2 != $user_choice){
            $second_choice = $val2;
         }
      }
	
	// 유저가 선택을 바꿨을때 당첨 count
      if($car == $second_choice){
         $change_count += 1;
      }

   }
   
   echo $change_count."<br>";
   echo $nochange_count."<br>";

   echo "바꿨을때 : " .$change_count/$user."<br>";
   echo "변경 안했을때 : " .$nochange_count/$user."<br>";
}


montyhall(100);

?>

 

 

구글 설문지를 사용하던중에, 구글 로그인 없이는 사용이 불가한 것을 알게되었다.

 

그러다 구글 로그인 없이 구글 드라이브 업로드를 찾아보다가 좋은 것을 발견했다!


https://www.labnol.org/internet/file-upload-google-forms/29170/


해당 사이트가서 영상을 보고, 그대로 따라하면 정말로 쉽게 설문지와 같은 폼을 만들 수 있고, 구글 업로드도 가능하다.


단, 구글 드라이브 용 파일 업로드 양식을 장기간 사용하려면 라이센스가 필요하다.

기본버전은 무료이다.

add_action(액션훅)과 add_filter(필터훅)의 차이점은 "실행 시점"과 "용도"에 있다.


add_action 은 워드프레스 내부의 이벤트가 발생할때 실행

ex) 글을 등록하거나 댓긍르 달때 이를 후킹하여 임의의 함수를 호출할 수 있다.


add_filter 은 DB에 저장하거나 화면에 출력하기 전에 콘텐츠 내용을 변경할 때 사용

ex) 포스트나 페이지 내용을 가져와서 화면 출력 전에 콘텐츠를 변경할 수 있다,


=====================================================


add_action : 워드프레스 이벤트 발생 시


[액션훅(add_action) 예제]


1
2
3
4
5
6
<?php
function new_email_comment() {
    wp_mail('test@naver.com''test''<p>TEST massage </p>');
}
add_action('comment_post','new_email_comment');
?>


댓글이 달리면 new_email_comment() 함수를 호출하여 메일을 발송한다.

자주 사용하는 액션훅은 다음과 같다.


* publish_post : 새로운 포스트가 발행될 때

* create_category : 새로운 카테고리가 생성될 때

* switch_theme : 테마를 변경할 때


====================================================


add_filter : 매체에 저장하거나 화면 출력하기 전 콘텐츠 변경


[필터훅(add_filter) 예제]


1
2
3
4
5
6
7
8
<?php
function replace_content($content) {
    $content = str_ireplace('ABC''CBA' , $content);
    return $content
}
add_filter('the_content''replace_content');
?>



콘텐츠가 화면에 출력되기 전, 더 정확히 the_post() 함수를 처리하는 중에 호출되어 문자열을 변경한다.

DB는 변경하지 않으며 화면 출력만 바뀐다.


자주 사용되는 필터훅은 다음과 같다


* the_content : 포스트나 페이지의 콘텐츠가 출력될 때

* the_title : 포스트나 페이지의 제목이 출력될 때

* comment_text : 댓글이 출력될 때

* wp_title : 페이지 제목이 출력될 때



더 자세한 정보는 codex 사이트를 참조한다!

test.html

1
2
3
4
    <form id="uploadForm" method="post" enctype="multipart/form-data" action="excel_upload.php">
        <input name="uploadFile" id="uploadFile" type="file" />
        <input type="submit" name="action" value="Upload" />
    </form>
cs
 
excel_upload.php

 
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
88
?php
include $_SERVER["DOCUMENT_ROOT"]."/func/PHPExcel/PHPExcel.php";
 
//-- 읽을 범위 필터 설정
$rangeArr = range('A','L');
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
    public function readCell($column$row$worksheetName = '') {
        global $rangeArr;
        // Read rows 1 to 7 and columns A to E only
        if (in_array($column,$rangeArr)) {
            return true;
        }
        return false;
    }
}
$filterSubset = new MyReadFilter();
 
$filename = 'test.xlsx';
$upfile_path = './' . $filename;
$path = pathinfo($filename);
$UpFileExt = strtolower($path['extension']);
$inputFileType = '';
 
//파일 타입 설정 (확자자에 따른 구분)
if($UpFileExt == "xls") {
    $inputFileType = 'Excel5';    
}elseif( $UpFileExt == 'xlsx' ){
    $inputFileType = 'Excel2007';
}
 
 
if( file_exists ($upfile_path&& $inputFileType ) {
 
 
    //엑셀리더 초기화
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
 
    //데이터만 읽기(서식을 모두 무시해서 속도 증가 시킴)
    $objReader->setReadDataOnly(false);    
 
    //범위 지정(위에 작성한 범위필터 적용)
    $objReader->setReadFilter($filterSubset);
 
    //업로드된 엑셀 파일 읽기
    $objPHPExcel = $objReader->load($upfile_path);
 
    //첫번째 시트로 고정
    $objPHPExcel->setActiveSheetIndex(0);
 
    //고정된 시트 로드
    $objWorksheet = $objPHPExcel->getActiveSheet();
 
    //시트의 지정된 범위 데이터를 모두 읽어 배열로 저장
    $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
    $total_rows = count($sheetData);
 
//echo "<pre>";print_r($sheetData);echo "</pre>\n";
 
    $kk = 0;
    echo '<table border="1" cellpadding="0" cellspacing="0" width="100%">';
    foreach($sheetData as $rows) {
        if$kk ==0 ){
            echo '<tr>';
            foreach( $rangeArr as $key=>$val ){
                echo '<td>'.$rows[$val].'</td>';            }
            echo '</tr>';
        }else{
            echo '<tr>';
            foreach( $rangeArr as $key=>$val ){
                echo '<td>'.$rows[$val].'</td>';
            }
            echo '</tr>';
        }
 
        $kk++;
    }//end foreach
    echo '</table>';
 
}else{
    echo 'Error!!';
}
 
?>
 
 
 
cs




1. Append란?


.append(content, [content])


=> 어떤 요소에 마지막 자식 요소를 새로 추가한다.

content 추가될 HTML 문자열, DOM요소, 또는 jQuery 객체.


html


1
2
3
4
5
6
7
8
9
10
11
12
<button id="add_cert">addrow</button>
<table >
    <tr>
        <th>name</th>
        <th>price</th>
        <th></th>
    </tr>
    <tbody id="asdf">
        <tr><td>example</td><td>123,456</td></tr>
    </tbody>
    
</table>


script


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script>
var cnt2 = 0;
$("#add_cert").click(function(){
    var cnt = $(".Rowtr").length;
    if(cnt<=30){
        var addrow = '<tr class="Rowtr" id="Rowtr_'+cnt2+'"><td><input type="text" id="name_"'+cnt2+' value="'+cnt2+'"/></td>
    <td><input type="text" id="price_"'+cnt2+'/></td><td><a onclick="removeRow('+cnt2+')">-</a></td></tr>';
 
        $("#asdf").append(addrow);
        cnt++;
        cnt2++;
    }
});
function removeRow(cnt){
    $("#Rowtr_"+cnt).remove();
}
</script>


행은 30이 최대, 추가 삭제 가능



'Javascript > JQuery' 카테고리의 다른 글

[JQuery] JQuery를 이용한 CSS 사용  (0) 2017.07.27

+ Recent posts