Digital Dynamics
If you can't explain it simply, you don't understand it well enough.
Amazon Lightsale 사용법
cross-env 활용
npm run build 할 때, GENERATE_SOURCEMAP 관련 에러날 때.
MacOS에서는 잘 빌드되는데, Windows 에서 다음과 같은 에러가 날 수 있다.
GENERATE_SOURCEMAP’은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.
이는 package.json에 정의된 build 스크립트의 GENERATE_SOURCEMAP 부분이 Windows와 맞지 않기 때문이다. 따로 set 명령을 써야 한다.
"scripts": {
"start": "react-scripts start",
"build": "GENERATE_SOURCEMAP=false react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"format": "prettier --write \"src/**/*.{js,ts,tsx}\""
},
간단하게 해결하려면 cross-env 를 사용하면 된다. npm install cross-env
한 다음, 위 스크립트를 다음과 같이 수정한다.
"scripts": {
"start": "react-scripts start",
"build": "cross-env GENERATE_SOURCEMAP=false react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"format": "prettier --write \"src/**/*.{js,ts,tsx}\""
},
npm start 를 0.0.0.0 으로 bind 하기
npm start는 localhost 를 바인드하기 때문에, 외부에서 접속을 하지 못한다. 이를 0.0.0.0 으로 바인드하려면 HOST=0.0.0.0
이라고 환경변수를 설정해야 한다.
이를 위해 cross-env
를 활용할 수 있다.
"scripts": {
"start": "cross-env HOST=0.0.0.0 react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"format": "prettier --write \"src/**/*.{js,ts,tsx}\""
},
Written with StackEdit.
PrimeReact + Formik
PrimeReact에서 Formik 으로 Form 개발하는 법 정리.
import React, {useEffect, useState, useContext, useRef} from 'react'; | |
import { Dialog } from 'primereact/dialog'; | |
import { Button } from 'primereact/button'; | |
import { InputText } from 'primereact/inputtext'; | |
import { useFormik } from 'formik'; | |
import { classNames } from 'primereact/utils'; | |
export function FormDemo(props) { | |
const [editMode, setEditMode] = useState(true); // 한 Dialog를 공유하기 위해, true이면 편집모드, false이면 Add New Mode | |
const [showNew, setShowNew] = useState(false); | |
const [initialData, setInitialData] = useState({ | |
sid: null, | |
name: "", | |
address: "", | |
description: "", | |
owner: "" | |
}); | |
const formik = useFormik({ | |
initialValues: initialData, | |
enableReinitialize: true, | |
validate: (data) => { | |
let errors = {}; | |
if (!data.name) { | |
errors.name = "이름을 입력하세요"; | |
} | |
if (!data.address) { | |
errors.address = "주소를 입력하세요"; | |
} | |
return errors; | |
}, | |
onSubmit: (data) => { | |
console.log("formik onSubmit"); | |
console.dir(data); | |
/* Do the real thing here */ | |
/* | |
if (editMode === true) { | |
onUpdateSite(); | |
} else { | |
onCreateSite(); | |
} | |
*/ | |
} | |
}); | |
const isFormFieldInvalid = (name) => !!(formik.touched[name] && formik.errors[name]); // !! 는 truethy, falsey 값을 true, false로 정규화함. | |
const getFormErrorMessage = (name) => { | |
return isFormFieldInvalid(name) ? <small className="p-error">{formik.errors[name]}</small> : <small className="p-error"> </small>; | |
} | |
const renderDialogFooter = () => { | |
return ( | |
<div> | |
<Button label="Cancel" icon="pi pi-times" onClick={() => setShowNew(false)} className="p-button-text" /> | |
<Button label={editMode===true ? "수정하기" : "만들기"} icon="pi pi-check" onClick={formik.handleSubmit} type="button" autoFocus /> | |
</div> | |
); | |
} | |
return ( | |
<div> | |
<Dialog header={editMode ? `사이트 수정: ID=${sid}` : "새 사이트 등록"} visible={showNew} style={{ width: '500px' }} footer={renderDialogFooter} onHide={() => setShowNew(false)}> | |
<form onSubmit={formik.handleSubmit} onReset={formik.handleReset}> | |
<div className="grid mt-4"> | |
<div className="col-12"> | |
<span className="p-float-label"> | |
<InputText id="name" value={formik.values.name} onChange={(e) => formik.setFieldValue('name', e.target.value)} | |
className={classNames('width-100', {'p-invalid': isFormFieldInvalid('name')})} size={60}/> | |
<label htmlFor="name">사이트 이름</label> | |
</span> | |
{getFormErrorMessage('name')} | |
</div> | |
<div className="col-12"> | |
<span className="p-float-label"> | |
<InputText id="owner" value={formik.values.owner} onChange={(e) => formik.setFieldValue('owner', e.target.value)} | |
className={classNames("width-100", {"p-invalid": isFormFieldInvalid('owner')})} size={60}/> | |
<label htmlFor="owner">소유자 ID</label> | |
</span> | |
{getFormErrorMessage('owner')} | |
</div> | |
<div className="col-12"> | |
<span className="p-float-label"> | |
<InputText id="address" value={formik.values.address} onChange={(e) => formik.setFieldValue('address', e.target.value)} | |
className={classNames("width-100", {'p-invalid': isFormFieldInvalid('address')})} size={60}/> | |
<label htmlFor="address">사이트 주소</label> | |
</span> | |
{getFormErrorMessage('address')} | |
</div> | |
<div className="col-12"> | |
<span className="p-float-label"> | |
<InputText id="description" value={formik.values.description} onChange={(e) => formik.setFieldValue('description', e.target.value)} | |
className={classNames("width-100", {'p-invalid': isFormFieldInvalid('description')})} size={60}/> | |
<label htmlFor="description">사이트 설명</label> | |
</span> | |
{getFormErrorMessage('description')} | |
</div> | |
</div> | |
</form> | |
</Dialog> | |
</div> | |
); | |
} |
이미지를 PDF로 만들기 & PDF 합치기 등
nmcli: Network Manager의 CLI 명령 요약
Network Manager의 CLI 명령어인 nmcli의 주요 사용예를 정리함.
1. 네트워크 인터페이스 보기
$ nmcli con show
NAME UUID TYPE DEVICE
Wired connection 1 8e2a801b-6074-30bc-9039-8f90d51ad28d ethernet eno2
tun0 d0a9ab3e-5373-44e4-8312-ee088c35cdae tun tun0
2. 고정 IP로 변경하기
$ nmcli con mod "Wired connection 1" connection.autoconnect yes
$ systemctl restart NetworkManager.service
3. Wifi 상태 확인
# wifi 상태 확인
$ nmcli radio wifi
# wifi 켜기
$ nmcli radio wifi on
# AP 리스트 보기
$ nmcli device wifi list
# AP 연결
$ nmcli device wifi connect <My_AP> password <Some_Password>
OpenVPN 세팅하기
OpenVPN은 VPN(Virtual Private Network) 솔루션 중에서 가장 많이 사용되고 있다. OpenVPN은 상업용 제품도 팔고, 클라우드 서비스도 제공하지만, 오픈소스인 Community Edition도 제공한다.
이 글은 OpenVPN Community Edition의 설치와 운용에 대한 내용이다.
인기글
-
언젠가부터 내 스마트폰에서 용량이 부족 하다면서 계속 알림이 떴다. 저가폰이라 내부저장소가 16GB 밖에 되지 않았지만, 추가로 마이크로SD 카드 16GB를 달았는데도 그렇다. 안드로이드가 앱을 설치하고 필요한 데이터를 저장하는 곳은 특별히 지정하...
-
회사 업무상, 해외에서 전자기기들을 수입(직구)을 자주 하는 편이다. 오래전 Raspberry Pi를 수입하다가 "전파인증 요건 신청" 난리를 겪게 되어, 그 경험담을 라즈베리파이3 직구 삽질기, 전파인증 요건신청? ...
-
사람들은 메이드인 차이나라 그러면 업신여기는 경향이 있지만, 요즘 웬만한 제조물품들은 중국도 꽤나 잘 만든다. 아니 샤오미나 팍스콘을 보면 꽤나 잘 만드는 정도가 아니라 아주 잘 만든다. 중국이 세계의 공장이 되면서 미국도 그렇고, 우리나라도 그렇...