SFC 는 뷰의 컴포넌트를 따로 분리하는 기법입니다.
확장자는 *.Vue 이고, script, template, style 태그로 구성되어 있습니다. script, style 태그는 흔히 알고 있겠지만, template 태그는 대체로 잘 사용되지 않는 태그 입니다.이 태그는 querySelector 로 속이 검색되지 않으며 브라우저에 바로 표시가 되지 않습니다. 주로 html 태그 조각을 담아두는 데 사용이 됩니다. template 태그 대신 div나 일반 태그에 담고 감춰두면 되지 않을까 라고 생각되시는 분들도 있으시겠지만, tr, td 같은 태그들은 template가 아니면, 넣어두고 꺼낼 수가 없습니다.

구조는 아래와 같습니다.

<script>
export default {
  data() {
    return {
      greeting: 'Hello World!'
    }
  }
}
</script>

<template>
  <p class="greeting">{{ greeting }}</p>
</template>

<style>
.greeting {
  color: red;
  font-weight: bold;
}
</style>

 

이 모듈화 된 컴포넌트를 꺼내어 쓰려면, 아래와 같이 사용하면됩니다.

import MyComponent from './MyComponent.vue'

export default {
  components: {
    MyComponent
  }
}

 

 

 

'Vue.js' 카테고리의 다른 글

Vue.js install  (0) 2023.01.02
Posted by 창업닉군
,

Vue.js install

Vue.js 2023. 1. 2. 04:39

공식문서: https://vuejs.org/guide/quick-start.html

 

Vue.js의 인스톨은 CDN을 사용하는 경우 상당히 간단합니다. 한 줄만 추가하면됩니다.

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

 

그리고 가장 간단한 Hello Vue 예제 입니다. '.mount()' 메소드에 쿼리셀렉터로 적용대상을 지정함을 눈여겨 봐두면 될것 같습니다. 기본 형태는 data 메소드를 통해 message값을 던저 주는 예제 입니다.

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

<div id="app">{{ message }}</div>

<script>
  const { createApp } = Vue

  createApp({
    data() {
      return {
        message: 'Hello Vue!'
      }
    }
  }).mount('#app')
</script>

 

그리고 아래는 ES Module Build 를 위한 예제 입니다.

<div id="app">{{ message }}</div>

<script type="module">
  import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'

  createApp({
    data() {
      return {
        message: 'Hello Vue!'
      }
    }
  }).mount('#app')
</script>

 

 

'Vue.js' 카테고리의 다른 글

Single-File Components vue.js  (0) 2023.01.02
Posted by 창업닉군
,

PHP 8.2 업데이트

PHP 2023. 1. 2. 02:07

최근 php 8.2가 업데이트 되어 글을 남깁니다. 

 

Readonly Classes

클래스를 선언할 때 readonly 키워드를 앞에 붙여 선언할 수 있게 되었습니다. readonly로 클래스를 선언하면, type을 꼭 지정해 프로퍼티를 선언해야 하며, static property를 선언할 수 없습니다.

<?php

// 8.2 버전부터는 AllowDynamicProperties 가 Deprecated 경고가 뜬다고 합니다.
#[AllowDynamicProperties]
readonly class Foo {
}

// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo
?>


<?php
readonly class Foo
{
    public $bar;
}

// Fatal error: Readonly property Foo::$bar must have type
?>


<?php
readonly class Foo
{
    public static int $bar;
}

// Fatal error: Readonly class Foo cannot declare static properties
?>

 

DNF

DNF 유형을 사용하면 교집합과 합집합을 결합할 수 있습니다.

 

stand-alone type : null, false and true

null, false, true를 int 같은 타입으로 선언해 사용할 수 있습니다. 클래스의 멤버 변수로 지정할 수 있습니다.

 

New "Random" extension

Random 기능이 확장되었습니다.

 

Constants in traits

trait 에 상수 선언이 가능해졌습니다.

 

Deprecate dynamic properties

dynamic properties가 지원이 중단 되었습니다.

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

아래와 같이 중첩된 값이 있다면, 각각의 단계별로 객체가 존재하나 여부를 확인하고 값을 꺼내는 코드를 작성해야 합니다. 옵셔널 체이닝 없이 꺼낸다면, 코드가 길어지고, 무엇보다 직관적이지 못합니다.

<script type="module">

    const some = {
        deeply:{
            nested:{
                value:99
            }
        },
        dialog:{
            say:"hello"
        }
    };

    const x = some && some.deeply && some.deeply.nested && some.deeply.nested.value;
    const y = some && some.dialog && some.dialog.say && some.dialog.say;
    console.log(x, y);

</script>

 

하지만 옵셔널 체이닝을 사용하면, 아래와 같이 코드가 간결해 지며, 중간에 null 이나 undefine을 만나면 undefine을 반환하고 코드를 수행하지 않습니다.

<script type="module">

    const some = {
        deeply:{
            nested:{
                value:99
            }
        },
        dialog:{
            say:"hello"
        }
    };

    const x = some?.deeply?.nested?.value;
    const y = some?.dialog?.say;
    console.log(x, y);

</script>

 

 

 

'JavaScript' 카테고리의 다른 글

javascript, 디스트럭처링(destructuring)  (0) 2023.01.01
javascript, for-in, for-of  (0) 2023.01.01
javascript, var, let, const  (0) 2023.01.01
html css 7가지 단위  (0) 2020.08.21
Ajax 크로스 도메인  (0) 2017.10.29
Posted by 창업닉군
,

디스트럭처링은 객체나 배열에서 값을 쉽게 가지고 오는 방법입니다. 디스트럭처링이 없을 때는 객체나 배열에서 값을 가지고 올 때 다소 코드가 길었지만, 아래 예들 처럼 디스트럭처링을 사용한다면, 코드가 상당히 간결해 질 것 입니다.

 

객체

기존에는 아래와 같이 사용해 값들을 가지고 왔습니다.

<script>

    const hotel = {
        door:3,
        light:6
    };

    const door = hotel.door;
    const light = hotel.light;

    console.log(door, light);

</script>

 

하지만 아래와 같이 디스트럭처링을 하면 길이가 상당히 짧아 집니다. 아래 처럼 변수를 또 나눌 일은 없지만, 함수에서 결과로 객체를 받을 경우에 사용한다면 상당히 효과적입니다.

<script type="module">

    const hotel = {
        door:3,
        light:6
    };

    const {door, light} = hotel;
    console.log(door, light);

</script>

 

 

배열

기존의 방법

<script type="module">

    const soldier = ['jake', 'jun', 'jane', 'Paul'];

    const soldier_0 = soldier[0];
    const soldier_2 = soldier[2];
    console.log(soldier_0, soldier_2);

</script>

 

디스트럭쳐

<script type="module">

    const soldier = ['jake', 'jun', 'jane', 'Paul'];
    const [soldier_0, , soldier_2,] = soldier;
    console.log(soldier_0, soldier_2);

</script>

 

중첩된 디스트럭쳐

객체 속에 배열이 있는 경우 아래와 같은 방법으로 가지고 올 수 있습니다.

<script type="module">

    const jade = {
        mountain:["한라산","백두산"],
        river:["한강","낙동강"]
    };
    const {mountain:[choice_m],river:[,river_nak]} = jade;
    console.log(choice_m, river_nak);

</script>

 

 

 

디스트럭처와 스프래드는 궁합이 좋으므로, 같이 사용하면 매우 간결한 코딩이 가능합니다.

'JavaScript' 카테고리의 다른 글

javascript, optional, chaining  (0) 2023.01.01
javascript, for-in, for-of  (0) 2023.01.01
javascript, var, let, const  (0) 2023.01.01
html css 7가지 단위  (0) 2020.08.21
Ajax 크로스 도메인  (0) 2017.10.29
Posted by 창업닉군
,

for-of : 배열의 값을 반복해 줍니다.

for-in : 객체의 키값으로 반복을 해 줍니다.

아래 소스로 차이를 느껴보세요.

<script>

    const one = [6,8,2,4,0];
    for( let o of one ){
        console.log('o', o);
    }

    const two = {'과일':'사과','나라':'미쿡','언어':'바디랭귀지'};
    for( let key in two ){
        console.log( key, two[key] );
    }

</script>

 

'JavaScript' 카테고리의 다른 글

javascript, optional, chaining  (0) 2023.01.01
javascript, 디스트럭처링(destructuring)  (0) 2023.01.01
javascript, var, let, const  (0) 2023.01.01
html css 7가지 단위  (0) 2020.08.21
Ajax 크로스 도메인  (0) 2017.10.29
Posted by 창업닉군
,

javascript는 다른 언어와 다르게 선언하는 방법이 var 하나만 있었습니다. c++, c# 처럼 형식을 정의하지 않았고 변수로 바로 사용하기에 하나만 밖에 필요가 없었습니다. 하지만 javascript는 눈부시게 발전해 복잡하고, 기능이 다양해 지며 아주 많은 문제를 만들어 냈습니다. 특히 promise 전까지 함수 중첩 지옥에서는 전역변수인 var는 정말 오류를 만들기 쉬웠습니다. 이를 극복하기 위해 ES2015에서는 let과 const가 도입됩니다.

 

var, let

var는 선언된 바깥 스코프에서도 사용이 가능합니다. 같은 function 속이 scope 입니다. let 을 실행하면 외부에서 사용이 불가능합니다. try-catch 문 같이 try 부분에 사용된 변수중 catch로 전달될 값이 있다면, var 그 외에 일반적인 경우 let을 사용하면 좋을 듯 합니다. 아래의 코드를 실행해 보세요.

<script>

    for(var i=0;i<10;i++){

    }
    console.log("i", i);

    for(let u=0;u<9;u++){

    }
    console.log("u", u);

</script>

 

const

const는 상수를 정의할 때 사용합니다. javascript같은 경우 언어가 유연해, override 되기 쉬온데, cosnt를 사용하면 그럴 우려는 없습니다. 하지만, const 내부의 값들은 변경이 가능합니다. 아래의 코드를 실행해 차이를 느껴보세요.

<script>

    let spr = {in:1};
    console.log('spr', spr);

    spr.in += 4;
    console.log('spr', spr);

    spr = {in:2};
    console.log('spr', spr);



    const ho = {out:1};
    console.log('ho', ho);

    ho.out+= 6;
    console.log('ho', ho);

    ho = {out:3};
    console.log('ho', ho);

</script>

 

 

 

 

 

 

'JavaScript' 카테고리의 다른 글

javascript, optional, chaining  (0) 2023.01.01
javascript, 디스트럭처링(destructuring)  (0) 2023.01.01
javascript, for-in, for-of  (0) 2023.01.01
html css 7가지 단위  (0) 2020.08.21
Ajax 크로스 도메인  (0) 2017.10.29
Posted by 창업닉군
,

WebSockets 설치

파이썬을 구현하기 위해서는 먼저, python과 pip로 websockets 를 설치하셔야합니다.

웹소켓 설치
$ pip install websockets

설치확인
$ pip list

 

웹소켓 서버 코딩

너무 간단해서 사실 놀랐습니다. websockets.serve 함수에 인자로 각각 '실행메소드', 'ip 혹은 주소', 'port'를 넣어주고, 응답을 대기하는 동안 종료되지 않도록. asyncio.get_event_loop().run_until_complete, asyncio.get_event_loop().run_forever를 이용해 실행해 주시면되겠습니다.

서버는 복잡하지 않도록 응답을 그대로 돌려 주는 에코 서버로 만들었습니다. 소스는 아래와 같습니다.

import asyncio;
import websockets;

port = 10000

async def accept(self, path):
    while True:
        data = await self.recv()
        print("receive:" + data)
        send_str = 'echo : ' + data
        await self.send(send_str)
        print('send => ' + send_str)

print("웹소켓 시작 포트넘버:" + str(port))
start_server = websockets.serve(accept, "localhost", port)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
print("End Service!")

 

 

클라이언트 코딩

간단히 html과 javascript를 통해 예제를 만들어 봤습니다. 대체로, websocket.onopen, websocket.onclose 등의 함수를 사용하지만 저는 괄호가 중첩되는 것이 싫어 이벤트 형식으로 만들었습니다.

<title>WebSocket 테스트</title>
<style>
    .spacer {margin-bottom: 1rem;}
</style>

<div class="spacer">
    <span>상태 : </span><span id="status">접속안됨</span>
</div>
<div id="recived" class="spacer" style="height: 15rem; border: #aaa 1px solid; padding: 0.5rem; max-width: 30rem;"></div>
<div class="spacer">
    <input id="message" />
    <button id="send">보내기</button>
    <button id="close">종료</button>
</div>

<script>

    const url = 'ws://localhost:10000';
    const ws = new WebSocket(url);

    const E_Receive = document.querySelector('#recived');
    const E_Message = document.querySelector('#message');
    const E_Status = document.querySelector('#status');
    const E_Btn_Send = document.querySelector('#send');
    const E_Btn_Close = document.querySelector('#close');

    // 웹소켓 이벤트 처리.
    ws.addEventListener("open", e=>{
        E_Status.innerHTML = "접속";
    });
    ws.addEventListener("message", e=>{
        console.log("e",e);
        E_Receive.innerHTML += `<div>수신 : ${e.data}</div>`;
    })

    // ui 이벤트 처리.
    E_Btn_Send.addEventListener('click',e=>{
        if(!E_Message.value) return alert("메세지를 입력하지 않았습니다.");
        E_Receive.innerHTML += `<div>발신 : ${E_Message.value}</div>`;
        ws.send(E_Message.value);
        E_Message.value = "";
    })

    E_Btn_Close.addEventListener('click',e=>{
        ws.close();
        E_Status.innerHTML = "종료";
    });

</script>

 

 

그럼 즐거운 코딩 되시길 바랍니다.

 

 

 

 

 

'파이썬' 카테고리의 다른 글

window 장고설치  (0) 2023.01.02
Posted by 창업닉군
,

포즈는 사진이나 영상에서 사람이 어떤 포즈를 취하고 있나를 확인해 주는 api 입니다.

참고문서
공식문서 : https://developers.kakao.com/docs/latest/ko/pose/dev-guide    

 

개발용으로 사용할 이미지 이므로, https://www.pexels.com/ko-kr/ 에서 무료 이미지를 하나 다운로드 받았습니다.

 

1. curl을 이용해 이미지 분석 요청.

이미지를 요청하는 curl은 아래와 같습니다.

curl -v -X POST "https://cv-api.kakaobrain.com/pose" \
  -H "Content-Type: multipart/form-data" \
  -H "Authorization: KakaoAK ${REST_API_KEY}" \
  -F "file=@example_pose.jpg"

 

이것을 php로 고치면 아래와 같이 됩니다.

function req_mutipart_post( $KakaoAK, $file_path ){

    $headers = array();
    $headers[] = "Authorization: KakaoAK {$KakaoAK}";
    $headers[] = "Content-Type: multipart/form-data";
    $url = "https://cv-api.kakaobrain.com/pose";

    $file_path = new CURLFile($file_path,'image/jpeg');
    $postvars = array("file"=>$file_path);

    $is_post = true;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, $is_post);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
    curl_setopt($ch, CURLINFO_HEADER_OUT, true);
    $response = curl_exec ($ch);
    $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close ($ch);

    return $response;

}

 

2. 데이터 가공.

php gd를 이용해 이미지를 가공해 봤습니다. 카카오 포즈 기능 생각보다 사용하기 편리한 것 같습니다.

 

3 전체 소스 입니다.

<?php

    // 업로드 모듈
    function req_mutipart_post( $KakaoAK, $file_path ){ // 이미지 업로드용 메소드.

        $headers = array();
        $headers[] = "Authorization: KakaoAK {$KakaoAK}";
        $headers[] = "Content-Type: multipart/form-data";
        $url = "https://cv-api.kakaobrain.com/pose";

        $file_path = new CURLFile($file_path,'image/jpeg');
        $postvars = array("file"=>$file_path);

        $is_post = true;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, $is_post);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
        curl_setopt($ch, CURLINFO_HEADER_OUT, true);
        $response = curl_exec ($ch);
        $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        curl_close ($ch);

        return $response;

    }

    $source_image_file = "pexels-cottonbro-studio-10675908.jpg";

    // 이미지에 대한 정보를 가지고 옵니다.
    $res = req_mutipart_post( '6907940c4e12eb2a6805a74f6bd95d83', $source_image_file );
    $resObj = json_decode($res,true);

    // 사진 속 사람 출력.
    $human = count($resObj);
    echo "사진속 사람 {$human}명" . PHP_EOL;

    // 사진속 모양에 따라 이미지를 가공해 줍니다.
    $gd = imagecreatefromjpeg($source_image_file);
    foreach($resObj as $d){

        // 라인 그리기.
        $im = @imagecreatetruecolor(4, 4);
        $line_color = imagecolorallocate($im, 255, 0, 0);

        imagerectangle(
            $gd,
            $d['bbox'][0], $d['bbox'][1], $d['bbox'][2] + $d['bbox'][0], $d['bbox'][3] + $d['bbox'][1],
            $line_color
        );

        // 점찍기
        $point_weight = @imagecreatetruecolor(8, 8);
        $point_color = imagecolorallocate($point_weight, 0, 255, 0);

        for( $i=0; $i < count($d['keypoints']) ;$i+=3 ){
            $idx_x = round($d['keypoints'][$i + 0]);
            $idx_y = round($d['keypoints'][$i + 1]);
            // print_r([$idx_x, $idx_y]);
            // imagesetpixel($gd, $idx_x, $idx_y, $point_color);
            imagefilledarc(
                $gd, $idx_x, $idx_y, 4,
                4, 0, 360, $point_color,
                IMG_ARC_PIE
            );
        }

    }

    // 가공된 이미지 출력하기.
    imagejpeg($gd, 'result_' . time() . ".jpg");

 

 

전체 소스 파일 입니다.

php - upload.zip
0.91MB

 

 

 

 

 

 

 

Posted by 창업닉군
,

카테고리 조회를 실행하려면 먼저 11번가 판매자 가입 후 api 키 발급이 필요합니다. 선행하지 않았다면, 아래 링크를 참조해 먼저 완료해 주세요.

 

11번가 OPEN API CENTER - 서비스등록

참고 11번가 판매자 센터 참고 : https://happytownn.tistory.com/176 11번가 OPEN API CENTER : https://openapi.11st.co.kr/ 11번가 open api를 이용하려면, 먼저 판매자로 가입을 해야 합니다. 그리고, 서비스를 등록하고 o

nicgoon.tistory.com

 

상품검색 조회 관련 문서는 아래 링크에서 확인이 가능합니다.
https://openapi.11st.co.kr/openapi/OpenApiServiceIntroduce.tmall#info1

상품검색 > 상품검색

11번가에서 상품을 조회 했을 때의 결과를 자신의 사이트에서 활용할 수 있는 API 입니다. 실제 사용성은 낮지만 테스트용으로 해보기 좋습니다. 간단히 url을 브라우저에 붙여넣어도 결과를 확인할 수 있습니다.


http://openapi.11st.co.kr/openapi/OpenApiService.tmall?key=[key]&apiCode=ProductSearch&keyword=[keyword]     


GET PARAM에 넣어야할 값은 아래와 같습니다.
key = 서비스가입 후 받은 OPEN API KEY를 넣어주세요.
apiCode = api명령인데, 현재는 상품 검색을 할 것이므로, 'ProductSearch'를 그대로 두세요.
keyword = 검색할 명령어를 입력해 주세요.

keyword '양말'로 입력하고 브라우저 주소창에 넣으면 xml 응답값을 받을 수 있습니다. 11번가에 등록되는 상품들은 매일매일 다르므로 호출할때마다 다른 응답을 받이실거에요.

 

브라우저에서 사용하면 편하지만, 우리는 서버환경에서 받아 대체로 가공해서 사용해야하므로, 서버 언어로 실행이 필요합니다. node.js를 사용해 서버환경에서 구현해 보겠습니다.

var http = require('http');


function get_search(rest_api_key, keyword, callback){

    var options = {
        hostname: 'openapi.11st.co.kr',
        path: `/openapi/OpenApiService.tmall?apiCode=ProductSearch&key=${rest_api_key}&keyword=${encodeURI(keyword)}`
      };
     
    function handleResponse(response) {
      var serverData = '';
      response.on('data', function (chunk) {
        serverData += chunk;
      });
      response.on('end', function () {
        // console.log("received server data:");
        // console.log(serverData);
        callback(serverData);
      });
    }
     
    http.request(options, function(response){
      handleResponse(response);
    }).end();

}
get_search([rest api key 입력], "양말", res=>{
    console.log("응답 =>", res);
});

별다른 어려움 없이 사용하시리라 믿습니다. 제가 한 번 해 보니 잘 동작합니다.

 

 

 

 

 

 

 

'쇼핑몰연동 > 11번가' 카테고리의 다른 글

11번가 OPEN API 상품검색 php  (0) 2022.12.31
11번가 OPEN API CENTER - 서비스등록  (0) 2022.12.31
Posted by 창업닉군
,