반응형

 

 

목적 : 지도 API를 이용해서 정보를 보여주고, 또 주소 url에 넘겨주기 위해 사용

 

 

먼저, 보여줄 문자열에서 앞의 몇개의 문자를 잘라 필요한 만큼만 출력하는 방법

= substr을 사용한다

 

substr 사용예시

const str = '주소 : 서울특별시 강남구 삼성동 영동대로 513';

var sl = str.length;

console.log(str.substr(5,sl-5));
// expected output: "서울특별시 강남구 삼성동 영동대로 513"

//str.substr(A,B);
//A: str 문자열 중에서 자를 위치 (배열처럼 0부터 시작)
//B: A에서부터 몇개의 문자를 자를것인지 개수 입력

 

const str = 'Mozilla';

console.log(str.substring(1, 3));
// expected output: "oz"

console.log(str.substring(2));
// expected output: "zilla"

한글은 2칸인줄 알았는데 한글 공백 특수문자 모두 다 같은듯

 

 

 

 

encodeURI 사용하는 이유

= URI를 전달 할 때 문제가 없도록 인코딩 하는 용도

 

보통, 웹을 통해서 데이터를 전송할 때 특정 문자들은 특수한 기능으로 사용한다

 

예를들어, http://a.com?name=egoing&job=programmer 에서
&job=programmer 중 '&'하나의 파라미터가 끝나고 다음 파라미터가 온다는 의미이다.


그런데 다음과 같이 job의 값에 &문자가 포함된다면 시스템은 job의 값을 제대로 인식할수 없게 된다.
http://a.com?name=egoing&job=programmer&blogger


이런 문제를 회피하기 위해서 다음과 같이 치환해준다.
http://a.com?name=egoing&job=programmer%26blogger
그럼 시스템에서는 %26&로 해석하여 원래의 의도대로 값을 해석할 수 있게 된다.
이러한 처리를 이스케이핑(escaping)라고 부른다.

 

 

 

encodeURI 사용예시

 

활용 예시

//주소 url인코딩 네이버 지도 API 응용본

const uri = 'nmap://place?lat='+lat_+'&lng='+long_+'&name='+Addr+'&appname=www.naver.com';
const encoded = encodeURI(uri);

//인코딩 값 테스트용 출력
console.log('주소 url 인코딩 : ' +encoded);

기존에 사용하는 lat_, long_, Addr 변수들을 사용하여 변수 uri에 넣은 다음

encodeURI을 사용하여 인코딩을 해주면 사용할수있다

 

 

 

 

 

참고 : 

 

문자열 자르기

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/substr

 

String.prototype.substr() - JavaScript | MDN

substr() 메서드는 문자열에서 특정 위치에서 시작하여 특정 문자 수 만큼의 문자들을 반환합니다.

developer.mozilla.org

 

 

문자열 url 인코딩

https://opentutorials.org/course/50/189

 

encodeURI - 생활코딩

요약(Summary) URI를 전달 할 때 문제가 없도록 인코딩 문법(Syntax) encodeURI(encodedURI) 인자(Parameters) 인자명 데이터형 필수/옵션 설명 encodedURI string 필수 인코딩할 문자열 반환값(Return) string, 인코딩된

opentutorials.org

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/encodeURI

 

encodeURI() - JavaScript | MDN

encodeURI() 함수는 URI의 특정한 문자를 UTF-8로 인코딩해 하나, 둘, 셋, 혹은 네 개의 연속된 이스케이프 문자로 나타냅니다.

developer.mozilla.org

 

반응형
반응형

 

 

MySQL 기본 명령어를 사용해 테이블을 만들다 마주친 int(11) int(4) 등의 형태가 요상해서

찾아본 내용을 정리해봄

 

 

 

[MySQL] 데이터베이스 테이블 생성, 조회, 데이터 추가 명령어

생활코딩에서 복습한 기념으로 기본적인 데이터베이스 명령어인 테이블 생성, 조회 등을 기록해보려함 Windows에서 MySQL을 사용하기 위해서는 여기로 들어가 다운로드 하면된다 https://dev.mysql.com/d

studyingpingu.tistory.com

 

 

사실 이러한 형태는 zerofill 이라는 타입을 추가로 정의해주지 않는다면

int(4)나 int(11)이나 같은 형태로 출력이되고

 

데이터베이스에 저장될때도

두 개의 표현 모두, 원래 int 자료형의 범위 (-2,147,483,648 to 2,147,483,647) 만큼

동일한 크기로 저장된다고 한다

 

int(4)로 저장한다고 int(11)보다 적은 사이즈가 디비에 저장되는게 아니라서

공간을 효율적으로 줄이는것도 아니라고함

 

대신에 저장된 숫자의 공백칸 만큼을 0으로 표현해주는 차이라고 한다

int(4) 이지만 한자리 숫자가 저장된다면,

4칸을 보여주기 위해 앞의 3칸을 0으로 채운 0004를 출력한다는 것

 

 

아래는 그 예제

 

 

 

추가로 달린 댓글에서 보면 이러한 제로필 방식은 사용하지 않는걸 강하게 추천하고 있다

이 댓글이 받은 좋아요 수가 높은걸 보면

그냥 개념만 알아두고 사용은 피하는게 좋을것같다

 

대충 몇개의 숫자가 보여질지 선택하는건 DB단에서 하는게 아니라

UI 단에서 해주는 부분이므로 이걸 데이터베이스에서 건드리는 순간

문제가 생길수있는 확률이 올라간다고 하니

 

개념만 이해하는 식으로 넘어가자

 

 

 

 

참고 : https://stackoverflow.com/questions/5256469/what-is-the-benefit-of-zerofill-in-mysql

 

What is the benefit of zerofill in MySQL?

I just want to know what is the benefit/usage of defining ZEROFILL for INT DataType in MySQL? `id` INT UNSIGNED ZEROFILL NOT NULL

stackoverflow.com

 

 

반응형
반응형

 

 

 

 

서버에 이미지를 업로드 할 일이 생겨서 사용해본 Node.js 미들웨어 multer.js

multer는 1개의 이미지 업로드도 가능하고, 2개 이상 업로드도 가능하다

 

 

주로 multer는 aws s3와 연계해서 사용을 하는것 같은데

나는 그냥 사용중이었던 ec2에 업로드했다

 

 

목적 : 서버에 이미지 업로드

 

 

 

npm을 이용한 설치법

npm install multer

 

 

하나의 이미지 업로드 하는법

 

 

일단 이미지 업로드를 위한 자바스크립트 파일을 새롭게 만들고

서버에서 사용해줄 것임

 

imgUpload.js

//이미지 업로드 파일
//imgUpload.js


const multer = require('multer')

var storage = multer.diskStorage({
    destination: function (req, file, cb) {
		cb(null, './uploadImg')
		//이미지 업로드시킬 폴더 위치
    },
    filename: function (req, file, cb) {		
		cb(null, file.originalname)
        //서버에 저장할 파일 명
    }
})
var upload = multer({ storage: storage })
//storage는 업로드 될 폴더 위치

module.exports = {
	upload	
};

 

 

 

서버에서 post 요청 저리하는 부분

main.js

//server.js

var express = require('express')

//이미지 업로드
var img = require('./imgUpload.js')


//파일 1개를 업로드 하는 경우
app.post('/upload', img.upload.single('file'), function (req, res, next) {  
  console.log('이미지 업로드 ㅇㅋ');  
})

 

 

클라이언트에서 post 요청으로 이미지 서버로 넘기기

index.js

//서버에 이미지 업로드 post 요청
//index.js

function imgUpload(){
	console.log('이미지 업로드 한 경우');

	let formdata = new FormData();
	var file = document.getElementById('imgUpload').files[0];
	
	formdata.append('file', file);	
	 
	fetch("/upload",{
		method : "POST",
		body: formdata
	})	
}

formdata를 이용해서 선택한 이미지 파일을 서버로 전달했다

 

 

index.html

<!--html 이미지 업로드 1개-->
<!-- index.html -->

<div class="col-md-12 col-sm-12">
	<input type="file" id="imgUpload" style = "display:none;" accept="image/png, image/jpeg"></input>
	<label id="imgLabel" for="imgUpload">장소 이미지 추가하기</label>
</div>

 

input 태그에 accept="image/png, image/jpeg" 부분을 추가해주어

png, jpeg 파일 형식만 업로드 시킬수있도록 추가해보았다

 

 

 

위의 방식은 하나의 이미지만 업로드해도 충분해서 커스터마이징을 해본 방법이고

 

아래의 2개 이상의 이미지 업로드 부분은

정리된 부분을 그대로 참고해본 방법으로

 

혹시 사용 중 문제가 생긴다면 댓글로 알려주세요

 

 

 

이미지 파일 2개 이상 업로드 하는 법

 

index.html

<!DOCTYPE html>

<head>
    <title>Profile form</title>
</head>

<body>
   
    <form method="POST" action="/profile-upload-multiple" enctype="multipart/form-data">
        <div>
            <label>Upload multiple profile picture</label>
            <input type="file" name="profile-files" required multiple  />
        </div>
        <div>
            <input type="submit" value="Upload" />
        </div>
    </form>
    
</body>

</html>

 

 

index.js

var express = require('express')
var multer  = require('multer')

var app = express()


var storage = multer.diskStorage({
    destination: function (req, file, cb) {
      cb(null, './uploads')
    },
    filename: function (req, file, cb) {
      cb(null, file.originalname)
    }
})

var upload = multer({ storage: storage })

app.use('/uploads', express.static('uploads'));

app.post('/profile-upload-multiple', upload.array('profile-files', 12), function (req, res, next) {
    // req.files is array of `profile-files` files
    // req.body will contain the text fields, if there were any
    var response = '<a href="/">Home</a><br>'
    response += "Files uploaded successfully.<br>"
    for(var i=0;i<req.files.length;i++){
        response += `<img src="${req.files[i].path}" /><br>`
    }
    
    return res.send(response)
})

 

 

 

참고 :

 

How to Upload Image Using Multer in Node.js?

Whenever you make a website like social media app or blog app , you will most probably have feature where you will allow user to upload…

medium.com

 

 

반응형
반응형

 

 

 

 

[리뷰] C#린이, 기본 참고서로 시작하세요 C# 프로그래밍 읽어봄

wpf, uwp를 c#과 xaml을 사용해서 만들어 본적은 있으나 사실 C# 기본적인 문법에 관해서는 많이 부족한 편이었다 기존에는 기능을 구현하기 위해 스택오버플로우의 글들을 많이 참고를 했으나 사실

studyingpingu.tistory.com

 

 

시작하세요 C# 프로그래밍 챕터 3장 C# 기초 정리한 내용

 

 

 

 

닷넷 변수 종류 (크게 2가지로 나뉨)

- 값 형식 (Value Type)의 변수, 참조 형식(Reference Type)의 변수

 

값/참조 형식의 차이를 이해하기 위해서는 스택(Stack)과 힙(Heap)의 이해가 필요하다

 


 

윈도우 프로그램은 기본적으로 하나의 스레드를 갖는다

그리고, 개별 스레드마다 전용으로 사용할 수 있는 저장소가 메모리에 할당되는데,

이러한 영역을 스택이라고 한다

 

반대로, 힙은 프로그램에 필요에 의해, 메모리를 요청할 때 사용할 수 있는 저장소

닷넷에서는 CLR(Common Language Runtime)이 직접 힙을 관리한다

 

 

메모리를 사용한 후에는, 더이상 사용하지않는 다는 표현이 필요한데, 할당만 받고 해제를 하지않으면

메모리에 빈자리가 없어 프로그램 실행 중 오류가 발생하게 되기 때문이다

 

 

개발자가 스택에 변수를 선언하는 것 만으로, 스택 내의 특정 메모리 영역을 사용할 수 있게

C# 컴파일러가 자동 할당과 해제를 해준다.

따라서 스택의 메모리를 할당하고 해제하는것은 직접 하지않아도 된다

 

하지만 힙에 메모리를 할당하는 것은, 개발자가 명시적으로 요청한 것이므로 해제하는 과정이 필요하다

 

이러한 해제 과정에서 네이티브 환경과 관리 환경이 구분된다

 

 

기존의 네이티브 환경에서는 C/C++ 에서는 메모리 할당과 해제를 반드시 처리해주어야 했는데

C#은 개발자는 오직 할당만 하고 해제는 관리 환경 내의 특정 구성요소가 담당해준다

 

이러한 것을 가비지 수집기 (Garbage Collector)라고 한다

 

 


 

값 형식을 가리키는 변수

값 형식 변수는, 값 자체가 스택 영역에 할당되고 변수는 그 메모리를 가리킨다

 

값 형식 : sbyte, byte, char, short, ushort, int, uint, ulong, float, double, decimal, bool

 

 

 

값 형식

 

 

참조 형식을 가리키는 변수

변수 값을 담기 위해 힙 영역을 추가로 할당한 다음, 스택에서 그 힙의 주소를 가리킨다

참조 형식 : string, class, object

 

참조 형식

 

번외)

값을 할당하지 않은 string 변수 (참조 형식 변수) 는 어떤 값을 가질까?

 

string text;

위 처럼 값을 할당하지 않은 경우, 스택 변수는 0을 담고 있다

= 가리킬 수 있는 힙 주소가 없는 경우이다

 

하지만 참조형 변수에 숫자 0을 대입할 수는 없어서 C# 은 null 예약어를 사용한다

 

아스키코드 0이 null이기 때문인듯

 

 

string text1;
string text2 = null;

따라서 위의 2가지 선언 모두 스택변수에 숫자 0을 갖고있다

 

 

추가로, 더는 사용되지 않음을 명시하기 위해 null을 할당하기도 한다

string name = "C#";
name = null;

 

 

 


 

값 형식과 참조 형식의 차이점

  1. 값을 스택에 저장하는지, 힙에 저장하는지
  2. 변수의 값을 다른 변수에 대입한 경우 메모리의 표현 방법
  3. 기본 값

 

스택 저장과 힙 저장

값 형식은 변수 타입에 해당하는 값을 스택에 저장하지만,

 

참조 형식은 그 값을 담기 위해, 별도로 힙 영역의 메모리를 할당하고,

스택의 변수 값은 다시 힙의 데이터 주소를 가리키게 한다

 

 

변수에 대입 시 메모리 처리

int n1 = 5;
int n2 = n1;

Console.WriteLine(n1); // 5
Console.WriteLine(n2); // 5

string txt1 = "C#";
string txt2 = txt1;

Console.WriteLine(txt1); //C#
Console.WriteLine(txt2); //C#

 

출력은 n1, n2가 같고 txt1, txt2가 같지만

값 형식과 참조 형식에 따라 메모리 표현 방식이 다음과 같이 다르다

 

 

 

값 형식인 n1, n2의 경우 동일한 값이 다른 스택 영역에 복사되었지만

참조 형식인 txt1, txt2는 같은 힙 영역을 다른 스택영역에서 가리킨다

 

 

 

기본 값

 

값 형식 변수는 무조건 메모리가 할당되므로 메모리 영역에 필연적으로 기본 값(default value)을 갖게된다

닷넷은 자료형에 메모리를 할당하면 값을 무조건 0으로 초기화 시키며

 

 

참조 형식의 경우 모두 null 값을 가진다

bool result; // result에는 false 값이 기본값으로 지정된다
int n;       // n에는 0이 들어있다
string txt;  // txt에는 null 값이 지정된다

 

 

 

참고 :

 

기타: 34. 도서: 시작하세요! C# 프로그래밍: 기본 문법부터 실전 예제까지

 

www.sysnet.pe.kr

 

 

 

ASCII - 위키백과, 우리 모두의 백과사전

1972 프린터 사용 설명서에 개시된 아스키 코드 차트표 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( , 아스키)는 영문 알파벳을 사용하는 대표적인 문자

ko.wikipedia.org

 

반응형
반응형

 

 

 

 

[리뷰] C#린이, 기본 참고서로 시작하세요 C# 프로그래밍 읽어봄

wpf, uwp를 c#과 xaml을 사용해서 만들어 본적은 있으나 사실 C# 기본적인 문법에 관해서는 많이 부족한 편이었다 기존에는 기능을 구현하기 위해 스택오버플로우의 글들을 많이 참고를 했으나 사실

studyingpingu.tistory.com

 

C# 기본 프로그래밍 예제를 따라해보다 찾아본 csc 파일 위치

 

사실 비쥬얼 스튜디오로 실행하는게 제일 간편하긴 한데

그래도 파이썬처럼 cmd에서 바로 실행이 가능하니, C# 간단한 예제를 실행할때 사용하기 좋은듯하다

 

(대신 경로가 조금 길어서 그냥 비쥬얼 스튜디오 켜는게 정신건강에 이로울수있다)

 

dir /s %WINDIR%\CSC.EXE

 

위의 명령어를 cmd창에 입력해주면

기존에 설치한 닷넷 프레임워크 폴더 내에 있는 csc.exe 파일의 위치를 찾아준다

 

 

이 중에서 v4.0 버전이 제일 최신 버전의 .net framework 이므로

C:\Windows\Microsoft.NET\Framework64\v4.0.30319 폴더로 이동하여 csc.exe를 돌려주면 된다

 

//csc.exe 사용법
//컴파일 할 파일이 있는 폴더에서 아래의 명령어를 입력해준다

//'최신 버전의 csc.exe 파일이 있는 위치(폴더 명)\csc' + 컴파일할 파일 명
F:\c# example c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc Program.cs

 

위의 컴파일 명령어를 수행하고 나면

기존 Program.cs 파일만 있었던 F:\c# example 폴더에 Program.exe 파일이 생성된것을 알 수 있다

 

컴파일 후 생성된 Program.exe을 실행해보면

Program.cs에서 작성한 문법대로, 출력한 문자열이 바르게 출력되는것을 확인할수있다

 

 

 

반응형
반응형

 

 

생활코딩에서 복습한 기념으로

기본적인 데이터베이스 명령어인 테이블 생성, 조회 등을 기록해보려함

 

Windows에서 MySQL을 사용하기 위해서는 여기로 들어가 다운로드 하면된다

https://dev.mysql.com/downloads/mysql/

 

MySQL :: Download MySQL Community Server

Select Operating System: Select Operating System… Microsoft Windows Debian Linux Ubuntu Linux SUSE Linux Enterprise Server Red Hat Enterprise Linux / Oracle Linux Fedora Linux - Generic Oracle Solaris macOS Source Code Select OS Version: All Windows (x86

dev.mysql.com

 

 

데이터베이스 생성, 조회, 사용 데이터베이스 지정 명령어

CREATE DATABASE 데이터베이스명;

SHOW DATABASES;

USE 데이터베이스명;

 

예제

//opentutorials 라는 데이터베이스 테이블 생성
mysql> create database opentutorials;
Query OK, 1 row affected (0.01 sec)


//데이터베이스들 모두 조회
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| bob                |
| information_schema |
| mysql              |
| opentutorials      |
| performance_schema |
| sakila             |
+--------------------+
6 rows in set (0.00 sec)

//사용할 데이터베이스 선택 - opentutorials 라는 디비 사용
mysql> use opentutorials;
Database changed

위의 명령어들을 적절히 사용해서 DB 테이블을 추가하고, 선택하여 사용할수있다

 

 

DB 테이블 추가 명령어

CREATE TABLE 테이블명 (컬럼1 자료형, 컬럼2 자료형, ... , 컬럼N 자료형, PRIMARY KEY(PK 지정할 컬럼) );

 

예제

//DB 테이블 생성
//topic이라는 테이블 생성

mysql> create table topic(
    -> id int(11) not null auto_increment,
    -> title varchar(100) not null,
    -> description text null,
    -> created datetime not null,
    -> author varchar(30) null,
    -> profile varchar(100) null,
    -> primary key(id));
    
Query OK, 0 rows affected, 1 warning (0.10 sec)

topic이라는 이름의 테이블을 생성하고 id를 primary key로 지정해준다

primary key 지정을 해주지않으면 오류가 발생하니 마지막에 잊지말고 지정해주자

 

-> id int(11) not null auto_increment

-> 컬럼 명, 자료형, 데이터 null (=비어있다) 가능 유무, 자동으로 1씩 증가

 

int(11)은 11자리까지만 보여준다고 생활코딩에서 그런것같음

 

조금 헷갈려서 int(4) 와 int() 등의 차이가 뭔가 했더니

디비에 저장되는 범위는 int 원래의 자료형의 범위로 모두 동일하며

보여지는 자릿수의 차이인가 여튼 그렇다함

(추후 자세히 찾아보기)

 

not null은 비어있는 값이면 안된다는 것, 반대로 null 이면 공백 데이터 허용

 

id의 값을 삽입할때마다 추가로 기입하지 않아도 자동으로 증가되게끔 해주는 auto_increment 속성을 추가해주었다

 

위와 동일한 방식으로 id를 제외한 다른 title, description 등의 칼럼에 데이터를 넣어줌

 

 

varchar1~255bytes까지 저장이 가능하고 text는 65,535 characters까지 저장이 가능하다고 하여

 

제목, 작성자, 프로필을 저장할 title, author, profile은 varchar 자료형을 사용하였고

내용이 길어질 수 있으니 description은 text 자료형을 사용했다

 

created에 사용한 datetime은 날짜를 표시할때 사용하면 된다

 

 

등록된 테이블 조회, 특정 테이블 상세 조회

SHOW TABLES;

DESC 테이블명;

 

예제

//DB 테이블 조회
mysql> show tables;
+-------------------------+
| Tables_in_opentutorials |
+-------------------------+
| topic                   |
+-------------------------+
1 row in set (0.01 sec)

//테이블 상세 내용 확인 - 이때 세미콜론을 붙여줘야 쿼리문이 작성완료된것으로
//세미콜론을 깜빡하고 엔터를 쳐도 다음줄에서 다시 쳐주면 된다
mysql> desc topic
    -> ;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int          | NO   | PRI | NULL    | auto_increment |
| title       | varchar(100) | NO   |     | NULL    |                |
| description | text         | YES  |     | NULL    |                |
| created     | datetime     | NO   |     | NULL    |                |
| author      | varchar(30)  | YES  |     | NULL    |                |
| profile     | varchar(100) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

데이터베이스를 조회할때와 마찬가지로

show tables; 를 사용하면 등록된 테이블들을 한번에 조회할 수 있다

 

이때, 테이블마다의 컬럼(column)이 모두 다르고, 데이터(row)가 다르므로

테이블마다의 내용을 자세하게 보고싶을때는 desc+ 테이블 명; 을 입력해주면

 

테이블마다의 상세 내용(attribute)을 확인할수있다

 

 

테이블에 데이터 추가, 테이블에 추가된 모든 데이터 조회

INSERT INTO 테이블명 (칼럼명1, 칼럼명2, ... , 칼럼명N)
VALUES(데이터1, 데이터2, ... , 데이터N);

SELECT * FROM 테이블명;

 

 

예제

// topic 테이블에 데이터 추가하기
mysql> insert into topic (title, description, created, author,profile)
    -> values ('mysql', 'mysql is ... ' , now(), 'yunny', 'developer');
Query OK, 1 row affected (0.02 sec)

//저장한 데이터 불러오기
mysql> select * from topic ;
+----+-------+---------------+---------------------+--------+-----------+
| id | title | description   | created             | author | profile   |
+----+-------+---------------+---------------------+--------+-----------+
|  1 | mysql | mysql is ...  | 2021-10-20 17:46:57 | yunny  | developer |
+----+-------+---------------+---------------------+--------+-----------+

 

몇개 더 추가해본 예제

 

mysql> select * from topic
    -> ;
+----+------------+-------------------+---------------------+--------+---------------------------+
| id | title      | description       | created             | author | profile                   |
+----+------------+-------------------+---------------------+--------+---------------------------+
|  1 | mysql      | mysql is ...      | 2021-10-20 17:46:57 | yunny  | developer                 |
|  2 | oracle     | oracle is ...     | 2021-10-20 17:48:38 | yunny  | developer                 |
|  3 | sql server | sql server is...  | 2021-10-20 17:49:57 | duru   | database administrator    |
|  4 | postgresql | postgre sql is... | 2021-10-20 17:50:38 | taeho  | dataschientist, developer |
|  5 | mongodb    | mongodb is ...    | 2021-10-20 17:51:04 | egoing | developer                 |
+----+------------+-------------------+---------------------+--------+---------------------------+
5 rows in set (0.00 sec)

select * 은 ALL의 모두를 뜻하여 topic 테이블의 모든 데이터를 가져온다는 뜻이다

 

 

 

 

참고 : 

 

https://opentutorials.org/course/3161/19537

 

MySQL 테이블의 생성 - 생활코딩

MySQL 테이블의 생성 2018-02-12 01:09:40

opentutorials.org

 

 

※틀린부분, 오타가 있다면 알려주세요

반응형
반응형

 

 

Warning | 1681 | Integer display width is deprecated and will be removed in a future release.

 

예제를 따라서 SQL문을 작성하다가 마주친 워닝 문구

 

mysql warnings

아마 범위 지정때문에 경고를 받은듯하다

 

어떤 경고인지 자세하게 보면 좋을것같아 찾아본 MySQL warning 확인하는 명령어

 

mysql> show warnings
    -> ;
+---------+------+------------------------------------------------------------------------------+
| Level   | Code | Message                                                                      |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |
+---------+------+------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

show warnings; 를 입력해주면 받은 경고에 대한 상세 메세지를 확인할수있다

 

워닝 코드는 1681이며

워닝 메세지는 Integer display width is deprecated and will be removed in a future release. 였다

 

 

 

이제 이 경고가 왜 뜨는지, 또 피할수있는 방법이 있는지 검색을 시도해봤음

 

친절한 스택오버플로우는

이러한 워닝은 데이터를 저장하거나 표출하는데 아무런 문제가 없으며

 

그렇더라도 이러한 문구를 피하고싶다면, 기존 컬럼 타입을

INT(11) 등의 형태에서 INT로 수정하라고 해결방법까지 안내해준다

 

 

 

 

참고 : 

https://dev.mysql.com/doc/refman/8.0/en/numeric-type-attributes.html

 

MySQL :: MySQL 8.0 Reference Manual :: 11.1.6 Numeric Type Attributes

11.1.6 Numeric Type Attributes MySQL supports an extension for optionally specifying the display width of integer data types in parentheses following the base keyword for the type. For example, INT(4) specifies an INT with a display width of four digits.

dev.mysql.com

 

반응형
반응형

wpf, uwp를 c#과 xaml을 사용해서 만들어 본적은 있으나

사실 C# 기본적인 문법에 관해서는 많이 부족한 편이었다

 

기존에는 기능을 구현하기 위해 스택오버플로우의 글들을 많이 참고를 했으나

사실 그것도 ctrl c ctrl v에 집중되었지 크게 개념을 이해하고 구현한건 아닌 표현들이 많았다

 

그러다보니 이성보다 본능적으로 터득한 위주로 기능 위주의 구현을 했는데

 

최근에 좀더 이론에 관련된 지식이 요구될때가 많아져

몇년전에 구입해둔 이 "시작하세요 C# 7.1 프로그래밍"을 다시 펼쳐서 읽어봤더니

 

오히려 그때 복붙했던 개념들을 역으로 이해하기 쉬웠고

기존에는 msdn에 다 정리되었던 내용이었고, 다른 기타 블로그에서도 많이 보았던 내용이었으나

 

그때 와닿지 않았던 추상적 개념을 굉장히 쉽게 이해가도록

예시나 코드를 잘 설명해준 책이라고 생각되어 후기를 기록해본다

 

 

800 페이지가 넘는 책을 다 읽어보진 않았고 특정 목차를 먼저 읽는 중이라

전체적인 감상은 아니지만 C# 문법을 익히기에 부담없이 읽을수있는 책이라고 생각한다

 

 

 

알찬 목차들

 

이 외의 목차는 https://coupa.ng/b87BOB 참고하자

 

위키북스 시작하세요 C# 9.0 프로그래밍 +미니수첩제공

COUPANG

www.coupang.com

최근 C# 10.0까지 업데이트된 상태다 보니 이미 내가 가진 7.1은 구시대 유물이 되어버렸다

책은 9.0까지 나와있으니 최신버전으로 구매해서 참고하면 되겠다

 

 

몰랐는데 가끔 C#, wpf에 관해 검색했을 때마다 마주했던

https://www.sysnet.pe.kr/ 이분의 책이었음

 

J & J - 정성태의 닷넷 이야기

2021.02.05 C# 9.0 개정판 2019.11.25 C# 8.0 개정판 2019.07.23 이메일 주소 변경 기존 천리안 계정에서 techsharer@outlook.com 주소로 변경합니다. 2019.05.08 C# 7.3 개정판 2018.08.26 게시판 내용 검색 기능 추가 "Google

www.sysnet.pe.kr

 

 

 

매번 OOP라는 단어를 듣지만, 왜 객체지향을 해야하는지에 좀더 단순히 와닿는 표현인듯

 

 

이런식으로 당장 이해하지 않아도 되는 표현들은 가볍게만 짚어주어 부담도 덜하다

 

 

초보자도 구문이해가 쉽도록 설명을 잘 풀어서 해주시니까

참고서로 이용하기에 제격인듯싶다

 

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

반응형
반응형

wpf 샘플예제를 돌려보면서 코드를 구경하려고 하다가 빌드 에러를 마주한 이야기

 

빌드 환경 : Visual studio 2019

 

 

 

위 이미지처럼 지정된 버전이 없어서 빌드가 안된다는 오류가 발생했음

 

당황하지말고 구글에 물어보니 친절한 MS가 미리 작성해둔 페이지를 찾을수있었다

원인은 3가지 정도로 요약되어있다

 

1. global.json 파일에 지정된 sdk 버전이 잘못된 경우

2. global.json 파일에 지정되어있는 sdk 버전이 빌드하려는 PC에 설치되지 않은 경우

3. global.json 파일에 지정된 sdk 버전의 경로가 잘못되어 찾지 못한 경우

 

정도라고 한다

 

 

 

이 오류를 해결하기 할수있는 4가지 방법이 나와있다

 

1. global.json에 지정된 sdk 버전을 설치

2. global.json에 수동으로 다른 sdk버전을 지정해주기

3. global.json에 오타나 다른 문제가 있는지 올바른 global.json 구조를 보고 오타나 기타 문제 파악하기

4. global.json 삭제해서 설치된 최신버전의 sdk가 동작되도록 하기

 

(나는 개인적으로 돌려본것이므로 팀단위로 개발을 진행하고 있다면 확인이 필요할듯하다)

 

 

 

 

그래서 먼저 확인해본 나의 global.json 파일

 

※참고로 global.json 파일의 경로

WPF-Samples-master 폴더에 바로 위치해있어 찾기는 어렵지않다

 

 

global.json에 지정된 sdk 버전은 3.1.301이다

 

 

cmd 창을 열어 dotnet --info를 입력해주면

내 pc에 설치된 닷넷 sdk 버전들을 확인할수있다

 

//설치된 sdk 버전 확인
dotnet --info

 

나는 이미 설치하고 버전을 확인해본 경우라 3.1.414의 sdk 버전이 설치된것을 확인할수있다

 

 

 

 

 

닷넷 sdk를 설치하기 위해

다시 친절한 구글에 .net sdk 3.1.301 을 검색해주면

알아서 다운로드 페이지를 상단에 띄워준다

 

 

 

 

sdk 설치 페이지

https://dotnet.microsoft.com/download/dotnet

 

.NET Downloads (Linux, macOS, and Windows)

Official .NET downloads for Linux, macOS, and Windows. .NET is a free, cross-platform, open-source developer platform for building many different types of applications.

dotnet.microsoft.com

 

 

 

.net 3.1 sdk 중에서 가장 최신 릴리즈 버전이 3.1.414 버전인듯함

 

 

 

설치가 완료된 이후에 빌드를 해줬더니 오류없이 잘 실행되었다

 

 

 

 

 

 

 

출처 :

 

https://github.com/microsoft/WPF-Samples

 

GitHub - microsoft/WPF-Samples: Repository for WPF related samples

Repository for WPF related samples. Contribute to microsoft/WPF-Samples development by creating an account on GitHub.

github.com

 

 

 

https://docs.microsoft.com/ko-kr/dotnet/core/install/windows?tabs=net50 

 

Windows에 .NET 설치

.NET을 설치할 수 있는 Windows 버전에 대해 알아봅니다.

docs.microsoft.com

 

반응형
반응형

※공부를 위해 영어번역이 들어갔으므로 틀린부분이 있다면 알려주세요

 

먼저 lexical scope는 제한적인 범위 (= static scope / 정적 범위 라고도 불림)이며

이는 C언어의 문법과 유사한 개념이다

 

 

요약하면

선언한 곳에서의 사용만 가능한 것들

선언된 외의 지역에서 사용 시, 문제가 생기는 것들

 

 

아래는 상세 이해를 돕는 예시들

 

 

스피드 웨건) 스코프란?

스코프 (MDN said)

현재 실행되는 컨텍스트를 말한다.

컨텍스트는  표현식이 "표현"되거나 참조 될 수 있음을 의미

(= 현재 실행되는 값 또는 표현 = 스코프 = 간단하게 현재 실행중인 범위)

 

만약 변수 또는 다른 표현식이 "해당 스코프"내에 있지 않다면 사용할 수 없다.

(= 특정 함수 내에서 선언된 변수는, 그 함수 밖에서 사용이 불가능한것과 같음)

 

스코프는 또한 계층적인 구조를 가지기 때문에

하위 스코프는 상위 스코프에 접근할 수 있지만 반대는 불가하다.

(이게 중요한듯)

 

함수 자바스크립트에서 클로저 역할을 하기 때문에

스코프를 생성하므로

함수 내에 정의된 변수는 외부 함수나 다른 함수 내에서는 접근 할 수 없다.

 

 

 

이제 다시 lexical scope에 대한 예제를 보자

void fun()
{
    int x = 5;

    void fun2()
    {
        printf("%d", x);
    }
}

모든 내부 단위 함수(임의로 표현)는 그 바깥 단 함수의 변수에 접근이 가능하지만

반대로의 접근은 불가능하다

 

위의 코드를 기준으로 보면, func2 함수는 앞서 표현한 내부 단위 함수로,

func 함수 내의 변수(int x=5;)에 접근이 가능하다

 

-> 이러한 접근이 lexical scope

 

 

또 다른 예제

var scope = "I am global";
function whatismyscope(){
   var scope = "I am just a local";
   function func() {return scope;}
   return func;
}

whatismyscope()()

결과 : I am just a local

(I am a global 이 아닌, I am just a local로 출력이 됨)

 

func 함수는, whatismyscope 함수의 범위 아래에서 정의된 것을 접근할수있기 때문

 

 

" functions are executed using the scope chain that was in effect when they were defined "

 

=함수는 정의된 범위에서 *scope chain을 이용해 실행된다

(scope chain : 위의 코드 예로, func에서 없는 scope 변수를 윗 단인 whatismyscope 내에서 찾아내는것 또는 이런 방식)

 

 

= 정의된 곳에서 사용 가능하도록 되는것,

그것이 함수

무스비

 

 

 

 

간략하게 대비되는 성질로는 dynamic scope (= 동적 스코프)가 있다

= 선언되고 나서 어디에서든 접근이 가능한 범위

 

 

 

 

출처 :

lexical scope 란?

https://stackoverflow.com/questions/1047454/what-is-lexical-scope

 

What is lexical scope?

What is a brief introduction to lexical scoping?

stackoverflow.com

 

스코프 란?

https://developer.mozilla.org/ko/docs/Glossary/Scope

 

스코프 - 용어 사전 | MDN

현재 실행되는 컨텍스트를 말한다. 여기서 컨텍스트는  값과 표현식이 "표현"되거나 참조 될 수 있음을 의미한다. 만약 변수 또는 다른 표현식이 "해당 스코프"내에 있지 않다면 사용할 수 없

developer.mozilla.org

 

반응형

+ Recent posts