[jQuery] jQuery Mobile을 이용한 반응형 테이블 제작[jQuery] jQuery Mobile을 이용한 반응형 테이블 제작

Posted at 2019. 6. 18. 14:47 | Posted in JavaScript & jQuery/jQuery
반응형


※ 참고


해당 예제는 jQuery Mobile의 HTML TABLE을 반응형으로 바꿔 모바일 화면에 맞게 출력할 수 도 있게 해주는 예제이다.

그렇기에 해당 예제는 jQuery.mobile.css 파일이 반드시 필요하기에. 사전에 제작중인 사이트에서 사용할 경우 CSS의 충돌은 염두해 두어야 할것이다.






■ 모바일 화면 크기에 맞는 테이블 레이아웃 변경





실제 사이트를 제작하고 운영하는 단계에서


요즘 반드시 고려하게 되는것이,


디바이스 화면에 맞추어 화면을 변화시키는 것이고,


그중 가장 귀찮게 하는것이 바로 HTML TABLE일 것이다.


컴퓨터와 모바일 디바이스에서의 보여주어야 하는 정보를 어떻게 처리해야 할지 상당히 귀찮고.


피곤한데, 이 고민을 jQuery Mobile을 사용하면 어느정도 덜어 낼 수 있다.




# HTML 소스 코드

 table_reaction.html

<html>

<head>

<title>:: 빅데이터 분석결과 ::</title>

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

<link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.css"/>

<link rel="stylesheet" href="./custom_table.css"/>

<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.1.min.js"></script>

<script type="text/javascript" src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>

<script type="text/javascript">

</script>

</head>

<body>

<div data-role="content">

<h2>걸그룹 개인 브랜드 2019년 6월 빅데이터 분석결과</h2>

<table data-role="table" class="ui-responsive">

<thead>

<tr>

<th>순위</th><th>그룹명</th><th>이름</th><th>참여지수</th>

<th>미디어지수</th><th>소통지수</th><th>커뮤니티지수</th><th>총합</th>

</tr>

</thead>

<tbody>

<tr>

<td>2</td><td>레드벨벳</td><td>아이린</td><td>186,886</td>

<td>700,986</td><td>655,633</td><td>295,489</td><td>1,838,995</td>

</tr>

<tr>

<td>3</td><td>블랙핑크</td><td>지수</td><td>296,098</td>

<td>336,852</td><td>699,946</td><td>488,412</td><td>1,821,308</td>

</tr>

<tr>

<td>8</td><td>트와이스</td><td>나연</td><td>184,853</td>

<td>289,526</td><td>530,781</td><td>222,033</td><td>1,248,732</td>

</tr>

<tr>

<td>29</td><td>러블리즈</td><td>정예인</td><td>95,033</td>

<td>400,325</td><td>99,946</td><td>318,187</td><td>913,491</td>

</tr>

<tr>

<td>32</td><td>EXID</td><td>하니</td><td>290,677</td>

<td>169,911</td><td>303,396</td><td>135,080</td><td>899,063</td>

</tr>

<tr>

<td>36</td><td>트와이스</td><td>사나</td><td>179,119</td>

<td>182,508</td><td>255,687</td><td>242,732</td><td>860,046</td>

</tr>

<tr>

<td>41</td><td>레드벨벳</td><td>웬디</td><td>115,885</td>

<td>151,444</td><td>317,304</td><td>218,490</td><td>803,124</td>

</tr>

<tr>

<td>52</td><td>오마이걸</td><td>유아</td><td>283,587</td>

<td>184,294</td><td>137,143</td><td>141,610</td><td>746,634</td>

</tr>

<tr>

<td>53</td><td>모모랜드</td><td>연우</td><td>462,914</td>

<td>180,397</td><td>274,933</td><td>125,720</td><td>717,525</td>

</tr>

<tr>

<td>90</td><td>트와이스</td><td>미나</td><td>107,567</td>

<td>101,775</td><td>108,571</td><td>165,970</td><td>483,883</td>

</tr>

<tr>

<td>96</td><td>우주소녀</td><td>성소</td><td>252,931</td>

<td>57,348</td><td>93,477</td><td>50,066</td><td>453,722</td>

</tr>

<tr>

<td>98</td><td>다이아</td><td>정채연</td><td>211,648</td>

<td>108,572</td><td>81,186</td><td>46,940</td><td>448,345</td>

</tr>

</tbody>

</table>

</div>

</body>

</html>




TABLE에 data-role="table" 속성을 추가하면


thead의 제목 필드값이 tbody의 td 값들 앞에 붙여지게 되지만.


그것은 jQuery.mobile.css 에서 노출을 막아주고 있기에


화면 사이즈의 변화에 따라서만 노출되게 된다.




# CSS 디자인

 custom_table.css

/* 화면 사이즈 조절 */

@media screen and (min-width:36em) {

/* 화면의 사이즈가 560px 이상일 경우 table의 텍스트를 가운데 정렬 한다.*/

.ui-responsive th, .ui-responsive td {

text-align:center;

}

}


/* 테이블 디자인 */

table {

width:100%;

text-align:center;

border-collapse:collapse;

}


th {

background:linear-gradient(#333333 0%, #444444 100%);

color:#FFFFFF;

font-weight:bold;

height:60px;

font-size:20px;

}

td {

height:40px;

}


/* 홀수행 백그루안드 색상 */

tr:nth-child(even) td {

background:#EEEEEE;

}


/* 짝수행 백그루안드 색상 */

tr:nth-child(odd) td {

background:#FDFDFD;

}




코드의 준비가 끝났다면


브라우저를 통해 해당 HTML 코드를 불러와 보자.




# 출력결과01 - 풀 사이즈






처음 풀 사이즈로 본 화면은 평소 컴퓨터를 할때 자주 접하게 되는


HTML TABLE과 다른 부분을 찾아볼 수 없다.


그럼 이제 해당 화면이의 가로 넓이 사이즈를 줄여 나가 보자.






# 출력결과 - 모바일 사이즈





그럼 위와같이 모바일 화면에 맞게 새로 정의된 TABLE의 내용을 확인 할 수 있다.








반응형
//

[Node.js] Serial Port를 이용한 Arduino 이벤트 실행[Node.js] Serial Port를 이용한 Arduino 이벤트 실행

Posted at 2019. 6. 13. 18:54 | Posted in Node.js
반응형




참고 : https://kocoafab.cc/tutorial/view/501

참고 : https://kocoafab.cc/tutorial/view/504






■ 직렬 포트(Serial Port)란?




직렬포트란 한번에 한 비트씩 수신하는 방식의 포트를 말한다.

질렬 포트는 PC에서 직렬 방식으로 주변 장치와 연결할때 사용하는 포트이다.

마우스나 키보드, 모뎀등이 시리얼 포트로 연결해서 사용한다.

직렬 포트는 구조가 단순하여 사용하기 편리한 장점이 있다.

단점으로는 한 선로에 1비트씩 보내기 때문에 전송속도가 낮고 1개의 포트로 주변 기기 1개만 연결된다는 단점이 있다.









■ Node.js 에서 아두이노 연결하기



먼저 테스트에 앞서 아두이노 장비를 준비하고 컴퓨터에 연결하자.




컴퓨터 장치관리자에 들어가면 위와같이 아두이노 장비가 추가된 것을 확인 할 수 있다.






# 모듈설치

 npm install serialport




# 소스코드

 serialport_check.js

const serialPort = require("serialport");


serialPort.list(function(err, ports) {

ports.forEach(function(port) {


console.log("###################################################");

console.log("comName : ", port.comName);

console.log("---------------------------------------------------");

console.log("pnpId : ", port.pnpId);

console.log("---------------------------------------------------");

console.log("manufacturer : ", port.manufacturer);

console.log("###################################################");

});

});




# 출력결과

C:\> node serialport_check.js



그럼 위와같은 화면이 나온다면 윈도우즈에서 node.js 의 설치가 마무리 되었다.










■ 아두이노에 입력값 전달하여, 자동 키보드 입력 하기




# 아두이노 소스코드

 physical_key_input.ino

#include <Keyboard.h>


void setup() {

  Serial.begin(9600);

}


void loop() {

   

if(Serial.available() > 0) {

   

Keyboard.begin();

/* 받을 문자열의 길이를 100으로 지정한다 */

char temp[100];

/* 문자열을 잘라 넣는다. */

byte leng = Serial.readBytes(temp, 20);

 

digitalWrite(13, HIGH);      /* 받은 문자값을 출력할 동안 불을 켜둔다. */

delay(1000);                   /* 값이 입력되기 전까지 딜레이를 10초 준다. */


/* 자른 문자열의 갯수만큼 반복문을돌려 키보드로 입력 신호를 전달한다. */

for(int num = 0; num < leng; num++) {

Keyboard.print(temp[num]);

delay(200);

}

           

digitalWrite(13, LOW);      /* 문자값이 출력도리 동안 켜둔 불을 끈다 */

Keyboard.end();

Serial.end();

}

}




# 노드.js 소스코드

 serialport_arduino.js

const SerialPort = require("serialport");

const sp = new SerialPort("COM9", { baudRate:9600, autoOpen:false });


function timeDelay(timeout) {

return new Promise((resolve) => {

setTimeout(resolve, timeout);

});

}


sp.open(function() {

timeDelay(5000);

sp.on("error", function(error) {

console.log("Error : ", error.message);

});


sp.write("Hello SAAK", function(error) {

if(error) {

return console.log("Error on write : ", error.message);

} else {

console.log("메세지가 정상적으로 입력되었습니다.");

}

});

});




# 출력결과











반응형
//

[JavaScript] 스크립트로 QR코드 스캔하고 데이터 읽기[JavaScript] 스크립트로 QR코드 스캔하고 데이터 읽기

Posted at 2019. 6. 13. 14:28 | Posted in JavaScript & jQuery/JavaScript
반응형




※ jsQR의 실제 웹 서비스 사용은 HTTPS접근이 가능한 브라우저를 통해 카메라를 조작할 수 있는 환경에서만 사용이 가능합니다.

   해당 포스팅은 로컬 서버에서 테스트하여 진행 하였으며, 실서버는 보안인증된 HTTPS 접근 가능한 환경에서만 사용이 가능합니다.




GitHub : https://github.com/cozmo/jsQR





■ 웹브라우저용 QR CODE 스캐너 제작 - jsQR 사용





인터넷에 많이 돌아다니는 자료들로 손쉽게 QR코드를 제작할 수 있지만.


보통 이렇게 생산한 QR코드를 읽어어오는 리더기를 제작하는것과 관련된 것은


잘 정리된 포스트를 발견하기 힘들었다.



그렇게 여러가지 방법을 찾다가.


jsQR이란 모듈을을 발견하였고,


이번에 jsQR을 이용하여


제작한 QR코드를 스캔하려하는 예제를 정리해 본다.








#01. jsQR 다운받기



먼저 https://github.com/cozmo/jsQR 페이지에 접속하여 jsQR-master.zip 파일을 을 다운받도록 하자.






다운받은 jsQR-master.zip 파일의 압축을 해제하면


안에 docs 라는 디렉토리가 존재할 것이다.






docs 디렉토리 내에는


index.html 파일과 jsQR.js 파일이 존재하는데


실질적으로 여기서 사용하게 될 파일은 이 jsQR.js 하나이다.








#02. 소스 코드 작성



그냥 index.html을 바로 사용해도 되지만.


아래 코드는 필자가 현재 사용하려고 하는 프로젝트의 성격에 맞게 index.html변경한 코드이다.



<html>

<head>

<meta charset="utf-8">

<title>:: jsQR 테스트 ::</title>

// 다운받은 jsQR.js 를 사용한다.

<script type="text/javascript" src="./jsQR.js"></script>

<style type="text/css">

main {

width:100%;

height:100%;

text-align:center;

}

main > div {

float:left;

width:1%;

height:98%;

}

main > div:first-child {

width:49%;

}

main > div:last-child {

background-color:#D3D3D3;

width:49%;

}


div#output {

background-color:#BDBEBD;

padding-left:10px;

padding-right:10px;

padding-top:10px;

padding-bottom:10px;

}

div#frame {

border:2px solid #005666;

background-color:#FFFFFF;

margin-left:10px;

margin-right:10px;

padding-left:8px;

padding-right:8px;

padding-top:8px;

padding-bottom:8px;

}

div#outputLayer {

text-align:left;

}

canvas {

width:100%;

}

</style>

</head>

<body>

<main>

<div id="test">

<h1>QR 코드 리더</h1>

<div id="output">

<div id="outputMessage">

QR코드를 카메라에 노출시켜 주세요

</div>

    <div id="outputLayer" hidden>

    <span id="outputData"></span>

    </div>

</div>

</div>

<div>&nbsp;</div>

<div>

<h1>스캔</h1>

<div id="frame">

<div id="loadingMessage">

🎥 비디오 스트림에 액세스 할 수 없습니다<br/>웹캠이 활성화되어 있는지 확인하십시오

</div>

<canvas id="canvas"></canvas>

</div>

</div>

</main>

</body>

</html>

<script type="text/javascript">

document.addEventListener("DOMContentLoaded", function() {

var video = document.createElement("video");

var canvasElementdocument.getElementById("canvas");

var canvas = canvasElement.getContext("2d");

var loadingMessagedocument.getElementById("loadingMessage");

var outputContainerdocument.getElementById("output");

var outputMessagedocument.getElementById("outputMessage");

var outputDatadocument.getElementById("outputData");

function drawLine(begin, end, color) {

canvas.beginPath();

canvas.moveTo(begin.x, begin.y);

canvas.lineTo(end.x, end.y);

canvas.lineWidth = 4;

canvas.strokeStyle = color;

canvas.stroke();

                }

    

        // 카메라 사용시

navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } }).then(function(stream) {

              video.srcObject = stream;

              video.setAttribute("playsinline", true);      // iOS 사용시 전체 화면을 사용하지 않음을 전달

          video.play();

              requestAnimationFrame(tick);

});


function tick() {

loadingMessage.innerText = "⌛ 스캔 기능을 활성화 중입니다."

if(video.readyState === video.HAVE_ENOUGH_DATA) {

              loadingMessage.hidden = true;

              canvasElement.hidden = false;

              outputContainer.hidden = false;

       

              // 읽어들이는 비디오 화면의 크기

              canvasElement.heightvideo.videoHeight;

                canvasElement.widthvideo.videoWidth;

       

              canvas.drawImage(video, 0, 0, canvasElement.widthcanvasElement.height);

              var imageDatacanvas.getImageData(0, 0, canvasElement.widthcanvasElement.height);


              var code = jsQR(imageData.dataimageData.widthimageData.height, {


                                    inversionAttempts : "dontInvert",

              });

       

                              // QR코드 인식에 성공한 경우

                              if(code) {

            

                                     // 인식한 QR코드의 영역을 감싸는 사용자에게 보여지는 테두리 생성

                                    drawLine(code.location.topLeftCorner, code.location.topRightCorner, "#FF0000");

                                    drawLine(code.location.topRightCorner, code.location.bottomRightCorner, "#FF0000");

                                    drawLine(code.location.bottomRightCorner, code.location.bottomLeftCorner, "#FF0000");

                                    drawLine(code.location.bottomLeftCorner, code.location.topLeftCorner, "#FF0000");


                                    outputMessage.hidden = true;

                                    outputData.parentElement.hidden = false;

         

                                    // QR코드 메시지 출력

                                    outputData.innerHTMLcode.data;

         

                                    // return을 써서 함수를 빠져나가면 QR코드 프로그램이 종료된다.

                                    // return;

                              }

       

                              // QR코드 인식에 실패한 경우 

                              else {


                                    outputMessage.hidden = false;

                                    outputData.parentElement.hidden = true;

                              }

                      }

     

            requestAnimationFrame(tick);

}

});

</script>










#03. QR코드 인식 테스트




먼저 작성한 코드를 브라우저를 통해 실행시켜보자.


해당 기능을 사용할려면 반드시 카메라를 사용할 수 있는 디바이스에서 테스트 해야 한다.






그럼 위와같이 화면이 나타날텐데


먼 브라우저카메라 사용을 허용해 주면


사용이 가능해 질 것이다.






필자가 사용하는 FireFox 브라우저에서는


상단에 카메라를 사용중이라는 버튼이 나타나고,


캔버스(canvas) 영역에 카메라에 비치는 화면이 출력된다.


그럼 인식시킬 QR코드를 화면에 비춰보자.






미리 준비한 QR코드를 화면에 비추어 보았다.


위와 같이 QR코드에 저장된 내용을 읽어들이는 것을 확인 할 수 있다.









반응형
//

[Node.js] Google Spread Sheet 수정 및 삭제하기[Node.js] Google Spread Sheet 수정 및 삭제하기

Posted at 2019. 6. 11. 19:27 | Posted in Node.js/Google Spread Sheet
반응형





※ 해당 포스팅 google-spreadsheet 2.0.7 버전을 기준으로 작성되었습니다.

    google-spreadsheet 3 버전 이후버전부터는 실행에 앞서 에러가 발생합니다.

    추후 수정 예정이오니 해당 포스팅을 참고하시는 분은 이점을 꼭 기억해 주시기 바랍니다.

    ( google-spreadsheet 2.0.7 버전의 경우 2020-05-15일 기준으로 사용에 문제는 없습니다. )





■ 구글 스프레드 시트의 데이터 수정하기




그동안의 데이터에서 내용을 읽어오거나, 입력하는것을 해보았다면


이제 마무리 단계로 수정을 진행해 보려고 한다.


아래와 같이 스프레드 시트를 만들고 그 데이터를 변경해 보자.




# 스프레드 시트





위 스프레드 시트에서는 D2, D4의 영역에 DASONI 라고 적힌 부분이 있다.


이 부분을 한글 DASONI로 변경하려 한다.



# 소스 코드

 

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {

doc.getCells(

  1

, {

  "max-row" : 6 // Cell의 최대 열(row)의 갯수( 필수 )

, "max-col" : 5      // Cell의 최대 행(column)의 갯수( 필수 )

, "return-empty" : true

}

, function(err, cells) {

                        // 해당 셀(Cell)을 지정한뒤, 변경사항을 수정하고 저장한다.

                        // 셀(Cell)을 수정하면 바로 저장을 해주어야 한다.


cells[8].value = "다소니";          // 해당 셀(Cell)의 값을 변경한다.

cells[8].save();                        // 해당 셀(Cell)의 변경사항을 저장한다.

cells[18].value = "다소니";         // 해당 셀(Cell)의 값을 변경한다.

cells[18].save();                       // 해당 셀(Cell)의 변경사항을 저장한다.

}

);

});




수정할 clees[8], clees[18]은 전체 셀(Cell)에서 몇번째 셀인지를 나타낸다.


꼭 값을 넣고 save( )를 해주어야 한다.



# 출력 결과




위와같이 영문명 DASONI에서 한글명 다소니로 변경된 것을 확인 할 수 있다.







■ 데이터 한번에 수정하기




이번에는 수정할 영역을 찾아서 검색하는 것을 만들려고 한다.




# 스프레드 시트





# 소스 코드

 

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {


doc.getCells(

  1

, {

  "max-row" : 8

, "max-col" : 4

, "return-empty" : true


}

, function(err, cells) {

let black = new Array("김재경", "고우리", "오승아", "조현영");

for(var num = 0; cells.length > num; num++) {

if(black.indexOf(cells[num].value) >= 0) {

var unit = num + 3;      // 해당 셀에서 3칸 옆의 셀을 선택

cells[unit].value = "★";

cells[unit].save();

}

}

}

);

});




# 출력 결과









■ 구글 스프레드 시트의 데이터 삭제하기





# 스프레드 시




# 소스 코

 

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {


doc.getCells(

  1

, {

  "min-row" : 2     // min-row를 2로 지정하여 필터 키값부분은 제외한 셀값을 가져온다.

, "max-row" : 11

, "max-col" : 1

, "return-empty" : true


}

, function(err, cells) {

let computer = new Array("APPLE", "LG", "HUAWEI", "HEWLETT PACKARD");

for(var num = 0; cells.length > num; num++) {

if(computer.indexOf(cells[num].value) >= 0) {

// console.log(cells[num].value);

cells[num].del();

}

}

}

);

});





# 출력 결과










※ 참고 - getRow( )를 이용하여 수정 및 삭제를 하려 한경우




필자는 아래 코드처럼 getCell이 아닌 getRow를 이용한 방법이 되지 않을까 싶어 테스트 해보았지만


결과는 에러만 날뿐이었다.


아무래도 getRow를 이용한 방법은 되지 않는것 같으니 참고 바란다.



 

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {

doc.getRows(

  1

, {

  "offset" : 1

, "limit" : 7

}

, function(err, rows) {

// console.log(rows);

let black = new Array("김재경", "고우리", "오승아", "조현영");

for(var num = 0; rows.length > num; num++) {

if(black.indexOf(rows[num].이름) >= 0) {

console.log(rows[num].이름);

rows[num].블랙 = "★";

rows[num].블랙.save();

}

}

}

);

});










반응형
//