1. 준비물 : 

마이크로 미니 모터 N20 5V 60RPM- 1.88달러 - 모터  속도 빠른거 사세요..... 

https://ko.aliexpress.com/item/4000498187956.html?spm=a2g0o.order_list.0.0.21ef140fq9YR2Z&gatewayAdapt=glo2kor 

커플링 - 알리신규회원 0.5달러

https://ko.aliexpress.com/item/32926229262.html?spm=a2g0o.new_account_index.0.0.68dc1f98LBMbCj&gatewayAdapt=glo2kor 

배터리 모듈 TP4056 - 0.31달러

https://ko.aliexpress.com/item/32467578996.html?spm=a2g0n.order_detail.0.0.68b45ccddQXwTN&gatewayAdapt=glo2kor 

드라이버 비트 - 알리 신규회원  0.41달러

https://ko.aliexpress.com/item/1005003291509506.html?spm=a2g0o.order_list.0.0.21ef140fBGqlnU&gatewayAdapt=glo2kor 

배터리  - 고장난 노트북 배터리 분해

마우스 버튼 스위치 - 불필요 마우스 분해

케이스 - 올리브영 발포비타민 통.. 3500원

 

비타민도 먹고 통도 구하고..

 

 

 

대충 구성 

 

 

2. 스위치 연결 - 스위치 폭이 짧은 쪽이 서로 마주보게 해야한다.

                  아래 사진은 실패

 

3. 모터 연결 - 미리 수축튜브 사용했으나 배터리선 연결을 위해 다시 뜯었다.

 

 연결 수정 - 스위치 방향 바꾸고 배터리 선 배선

 

 4. 배터리 충전 모듈 연결 

 - 테스트

 

 

 

 

 5. 배터리 연결 

 6. 케이스 다듬기

 케이스가 얇은 플라스틱이라 칼로 재단이 가능하다.

 측면에는 스위치 , 후면에는 충전모듈 , 전면에는 모터, 가운데는 배터리가 들어간다.

 

뒷판 구멍

 

모듈 글루건 작업
측면 스위치 부착

뚜껑에는 모터 부착

  7. 커플링 장착

 

 8. 완성 

 뭔가 덕지덕지 붙어있다.

 

 

 충전 중  / 충전 완료

 

참고 : https://www.youtube.com/watch?v=69iyqLWfhG0 

 

 

VisualStudio 사용시  느려짐

Intellisense 버벅거림

 

* 방법

삭제 - NVIDIA Nsight Visual Studio Edition 

 

출처 :

https://kangaroo-dev.tistory.com/5
https://developercommunity.visualstudio.com/t/nvidia-nsight-makes-intellisense-and-autocomplete/1234334

 

MFC SDI / MDI 프로젝트에서  Copy & Paste 가 동작이 안될때

 

리소스뷰에서 Accelerator에서 관련 키값 삭제 

 

리소스 뷰 클릭

 

Accelerator 클릭
관련 키값 삭제

 

출처 : https://blog.daum.net/baramjin/11016239

 조회
select (replace(컬럼명,'변경전데이터','변경후데이터')) 컬럼명 from 테이블명
ex)
 select (replace(strImageFilePath,'\\192.168.0.114\','')) strImageFilePath from tbl_Result

변경
 Update 테이블명 Set 컬럼명 = (replace(컬럼명,'변경전데이터','변경후데이터'))
 Select * From 테이블명
ex)
 Update tbl_Result Set strImageFilePath = (replace(strImageFilePath,'\\192.168.0.114\',''))
 Select * From tbl_Result
 

 

'공부 > SQL' 카테고리의 다른 글

[MSSQL기능] 상위 N개 행 편집  (0) 2023.03.30
[MSSQL설정] DB복원시 MDF기본 위치 설정  (0) 2022.05.06
[MSSQL] 중복 데이터 삭제  (0) 2021.08.26
[MSSQL] 특정 문자 변경 쿼리  (0) 2021.08.13
[Oracle] 테이블 컬럼 변경  (0) 2021.07.19
#include <experimental/filesystem>


string strDrawDirname = "FileDir";  //실행파일 위치에 있는 폴더이름  // 탐색할 폴더명
for (auto& p : experimental::filesystem::directory_iterator(strDrawDirname))  //경로 내 모든 파일 루프
{
string strFile = strDrawDirname + "\\" + p.path().filename().string();
CString strPath;
strPath.Format(_T("%S"), strFile.c_str());  //탐색한 폴더 내 파일 명

}

 

 System.Windows.Forms.Timer timer  대신  System.Timers.Timer 사용

 

사용방법

1.  System.Windows.Forms.Timer timer

 System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
 timer.Tick += new EventHandler(RunTimerFunc);
 timer.Interval = 1000;

2.  System.Timers.Timer 

System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(RunTimerFunc);    
timer.Interval = 3000;

 

출처 :
https://noel-embedded.tistory.com/952

https://m.blog.naver.com/zic6188610/221029988476

'공부 > C#' 카테고리의 다른 글

[C#] HEIC to JPG 변환 코드 Magick.NET-Q16  (0) 2022.05.15

std::map는 삽입 삭제시 정렬이 일어나 느림

std::unordered_map 은 정렬이 일어나지 않음

 

사용법은 map와 같음

 

헤더파일에 추가

#include <unordered_map>

 

선언

std::unordered_map<unsigned long, Mat> m_mapBuffer;

 

 

'공부 > MFC' 카테고리의 다른 글

[MFC] png Image Load From Resource  (0) 2022.11.29
[MFC] CImage CBitmap HBITMAP 변환  (0) 2022.11.29
[MFC] 전체화면 사용  (0) 2022.11.24
[MFC] 다이얼로그 DLL 만들기  (0) 2022.11.16
[MFC] SDI 전체 화면  (1) 2022.09.23

Thread 내부에서 사용된 CString 이었다.

Thread 사용 중 TerminateThread 와 같이 강제 종료 될때,

CString 에서 사용하는 메모리 영역이 제대로 해제 되지 않아 발생할 수 있다. 

 

결론은 thread가 종료 되기 전 CString 객체에서 Empty() 를 호출하여 문자열을 비워주면 나를 괴롭혔던 memory leak이 사라지는 것을 확인할 수 있다.

 

Thread 사용 중 원인을 알 수 없는 memory leak 발생 시 CString을 확인해보자.

 

출처 : https://cherrycloud.tistory.com/41

Assert  

debug_heap.cpp  

Line: 980 

Expression: __arct_first_block == header

 

 

조치:  프로젝트 - 속성 - c/c++ - 코드생성 - 런타임 라이브러리 에서   MT -> MD 로 변경

        프로젝트 - 속성 - 일반 - MFC사용 - 공유 DLL에서 MFC 사용 선택

 

 

 

 

 

 

 

 

//중복된데이터 검색

//컬럼명 : nClientID, nModelID, nAlgType

//테이블 : MuraExceptCondition

 

select nClientID, nModelID, nAlgType, COUNT(*) AS CNT
from tbl_MuraExceptCondition
GROUP BY nClientID, nModelID, nAlgType
HAVING COUNT(*) > 1

 

//삭제

--SELECT COUNT(*)
--from tbl_MuraExceptCondition

 

DELETE tbl_MuraExceptCondition
WHERE nIndex NOT IN (
SELECT MAX(nIndex)
from tbl_MuraExceptCondition
GROUP BY nClientID, nModelID, nAlgType
)

 

//퍼온것

실제 작업시에는 대부분 unique index를 걸거나, primary key 를 걸어 놓아 그런 일이 벌어지지 않지만, 벌크로 데이터를 작업하거나 할 경우, 중복된 데이터를 보거나, 제거하고 싶을 때가 있습니다.

단순히 중복 카운트를 조회 하고 싶을 경우엔, 다음과 같이 grouping 하고 count를 세면 됩니다만,

 

테이블 명 : tbl_some_table

컬럼 명: some_id, some_nm, some_description

-- 중복 카운트
SELECT some_id, COUNT(*)
FROM tbl_some_table
GROUP BY some_id
HAVING COUNT(*) > 1;

-- 여러 컬럼의 중복 카운트
SELECT some_id, some_nm, some_description, COUNT(*)
FROM tbl_some_table
GROUP BY some_id, some_nm, some_description
HAVING COUNT(*) > 1;

 

 

 

중복된 데이터 중, 첫번째(또는 마지막) 하나만 빼고 나머지를 조회한다거나, 삭제하고 싶을 때가 있습니다. 그러한 경우 다음과 같은 inline view 로 처리할 수 있습니다. (WITH 를 사용해도 되나, 하위 버전의 SQL 일 경우에는 WITH 구문이 먹지 않죠. 응? 하위 버전은 ROW_NUMBER 가 안 먹겠네요. 아이고 배야. - 하위 버전도 inline view 를 여럿 쓰면 되긴 합니다만.)

-- 중복 데이터를 알고 싶다.
SELECT *
 FROM (
            SELECT some_id
                     , dup_idx = ROW_NUMBER() OVER (
                                   PARTITION BY some_id ORDER BY some_id )
            FROM tbl_some_table (NOLOCK)
           ) tb_dup
WHERE tb_dup.dup_idx > 1;

-- 중복 데이터 기준으로 중복된 데이터를 다 조회하고 싶다.
SELECT t.*
FROM (
           SELECT some_id , dup_idx = ROW_NUMBER() OVER (
                                                 PARTITION BY some_id ORDER BY some_id )
            FROM tbl_some_table (NOLOCK)
           ) tb_dup INNER JOIN tbl_some_table t (NOLOCK)
                                 ON t.some_id = tb_dup.some_id
WHERE tb_dup.dup_idx > 1;

-- 중복 데이터를 지우고 싶다!!!
DELETE tb_dup
FROM (
           SELECT some_id ,
                       dup_idx = ROW_NUMBER() OVER (
                                     PARTITION BY some_id ORDER BY some_id )
            FROM tbl_some_table
                 ) tb_dup
WHERE tb_dup.dup_idx > 1;

-- 여러 컬럼일 경우? 중복 데이터를 지우고 싶다!!!
DELETE tb_dup
  FROM (
               SELECT some_id, some_nm, some_description ,
                         dup_idx = ROW_NUMBER() OVER (
                                       PARTITION BY some_id, some_nm, some_description
                                       ORDER BY some_id, some_nm, some_description )
                 FROM tbl_some_table
              ) tb_dup
WHERE tb_dup.dup_idx > 1;

 

이것 또한 그냥 메모입니다. 하하.

 

출처 : https://withsoju.tistory.com/686

//조회시 변경하여 조회
select (replace(컬럼명,'변경전데이터','변경후데이터')) 컬럼명 from 테이블명
//예시
select (replace(strImageFilePath,'\\192.168.0.100\','')) strImageFilePath from tbl_Result

 //실제데이터 변경
 Update 테이블명 Set 컬럼명 = (replace(컬럼명 ,'변경전데이터','변경후데이터'))
//예시
 Update tbl_Result Set strImageFilePath = (replace(strImageFilePath,'\\192.168.0.100\',''))

* VisualStudio2015 기준

확인하고자 하는 DataTable변수에서 돋보기 모양 클릭 후 DataTable Visualizer 클릭시 시각화도우미 팝업

 

 

 

//WriteProfileString(_T(""), _T("레지스트리에서저장될이름"), 변수);


void SaveData()
{
CWinApp *pApp = AfxGetApp();
pApp->WriteProfileString(_T(""), _T("m_strSrcPath"), m_strSrcPath);
pApp->WriteProfileInt(_T(""), _T("m_nFPS"), m_nFPS);
}

void LoadData()
{
CWinApp *pApp = AfxGetApp();
m_strSrcPath = pApp->GetProfileString(_T(""), _T("m_strSrcPath"), _T(""));
m_nFPS = pApp->GetProfileIntA(_T(""), _T("m_nFPS"), 70);
}

'공부 > MFC_자주쓸거' 카테고리의 다른 글

[MFC]메인프레임 포인터 얻기  (0) 2022.05.06
[MFC] 폴더내 파일 탐색  (0) 2022.02.14
[MFC] 작업표시줄 숨기기  (0) 2021.07.07
[MFC]리스트박스 데이터 추가  (0) 2021.07.05
[MFC] 중복실행 방지  (0) 2021.05.27
//타입 , 크기 변경
ALTER TABLE TBL_RESULT MODIFY  NLOTID NUMBER(20,0);
ALTER TABLE TBL_RESULT MODIFY STRDATE VARCHAR2(50);

ALTER TABLE 테이블 MODIFY  컬럼 타입(크기);

//이름 변경
ALTER TABLE TBL_RESULT RENAME COLUMN STRDATE TO STRDATEDST

ALTER TABLE 테이블 RENAME COLUMN 컬럼명 TO 변경할컬럼명

 

출처: https://jwklife.tistory.com/5

ALTER TABLE tbl_Result_Data1 ALTER COLUMN nLotID bigint

ALTER TABLE 테이블 ALTER COLUMN 컬럼 타입

 

오류 내용

 

변경 내용을 저장할 수 없습니다. 변경 내용을 적용하려면 다음 테이블을 삭제하고 다시 만들어야 합니다.
다시 만들 수 없는 테이블을 변경했거나 [테이블을 다시 만들어야 하는 변경 내용 저장 사용 안 함] 옵션을 설정했습니다.

 

방법

 

도구 - 옵션 - 디자이너 - 테이블을 다시 만들어야 하는 변경 내용 저장 사용 안 함 - 체크해제

 

'공부 > SQL' 카테고리의 다른 글

[MSSQL] 특정 문자 변경 쿼리  (0) 2021.08.13
[Oracle] 테이블 컬럼 변경  (0) 2021.07.19
[Oracle] 세션강제종료  (0) 2021.07.15
[Oracle] 일정 시간 경과 후 연결 끊김  (0) 2021.07.14
[MSSQL] NVL 사용법  (0) 2021.07.07

갤럭시 XANOVA MAGNETAR 기계식 키보드 (영문)(청축)

wemak*** 에서 구매

구매금액 44900원

 

사용평

1. 소리 촥촥촥촥 남

2. 가격 굳

 

결론: 가격이 너무 저렴해서 여러개 쟁여두고 싶었다.

 

 

 

 

소리

 

 

불빛

 

갤럭시 XANOVA MAGNETAR RGB 기계식 키보드 체리갈축

구매금액 : 89000원

사용평

1. 소리 조용함

2. 키감 좋음

3. 불빛 간지남

4. 손목받침대 첨엔 불편하나 쓰다보면 적응되서 꼭 필요해짐

5. 볼륨 조절 버튼과 텐키가 너무 가까워 불편함

6. 키보드 3개월쯤 사용중에 윈도우키가 먹통되어 as보냄

 

결론 : 할인된 가격이 89000이고 만족은 하지만 가격이 약간 비싸다는 느낌이 있음... 

 

제품사진

 

 

소리

 

연결된 세션 조회 

SELECT 
   SID
  ,SERIAL#
  ,USERNAME
  ,PROGRAM 
FROM 
  V$SESSION 

결과

 

세션 종료 쿼리

연결된 SimpleOracle프로그램 강제 세션종료 -> SID : 8 , SERIAL# ; 915

--ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
ALTER SYSTEM KILL SESSION '8,915' IMMEDIATE;

 

 

출처: https://rypro.tistory.com/157

 * 오라클 DB 입력이 일정시간동안 없을 때 연결이 끊기는 현상


확인해야 할 것
1)
select PROFILE
     , RESOURCE_NAME
     , RESOURCE_TYPE
     , LIMIT
from dba_profiles
where profile = 'DEFAULT'
order by 1,2;

결과에서 IDLE_TIME 이 15일 경우 15분 동안 입력 없을 시 끊김

 


2)
select VALUE from v$parameter where name = 'resource_limit'

결과에서 TRUE일 경우 일정시간동안 입력 없을 시 연결 끊김


* 변경 방법
1) IDLE_TIME 을 UNLIMITED로 수정
alter profile default limit idle_time UNLIMITED;


--IDLE_TIME 을 1분으로 수정 쿼리
--alter profile default limit idle_time 1;

2)resource_limit 수정
alter system set resource_limit = FALSE;

VS 2019 설치 후 우클릭시 한자 보이는 현상 제거

 

레지스트리 편집기 실행 - 찾기 

'용' 입력 후 한자  用  (쓸 용)

 

검색 결과

내용 수정 후 결과

 

 

//수정 - 내용추가

위처럼 변경해도 어느 순간 원래대로 되돌아옴

크게 사용하지 않는 경우 삭제

 

[레지스트리 편집기 열기]

윈도우 + r  - regedit  

해당부분 제거

HKEY_CLASSES_ROOT\Directory\Background\shell\AnyCode
HKEY_CLASSES_ROOT\Directory\shell\AnyCode

 

출처 : https://developercommunity.visualstudio.com/t/disable-context-menu-for-open-in-visual-studio/26397

NVL 의 용도 : NULL 체크 후 치환 

select NVL(COLUMN1, 'Empty') 일 경우 COLUMN1이 NULL이면 'Empty'로 치환해서 출력

                                                                     NULL이 아니면 원래 값 출력

WHERE절에 사용될 경우   COLUMN1이 NULL이면 치환된 값이 반환되어  우변의 값과 비교하여 참,거짓 판별

                                                    NULL이 아닐 경우 원래 값과 우변의 값을 비교하여 참 거짓 판별

 

쿼리 예시

테이블명: ZTESTNVL
컬럼명: COLUMN1 , COLUMN2
현재 데이터



select * from ZTESTNVL;




select NVL(COLUMN1, 'Empty') from ZTESTNVL;



select COLUMN2 from ZTESTNVL WHERE NVL(COLUMN1,'EMPTY') = 'EMPTY';




select COLUMN2 from ZTESTNVL WHERE NVL(COLUMN1,'EMPTY') = 'EXIST';



 

 

void CMainFrame::ShowWindowTaskbar(BOOL bShow)
{
APPBARDATA stAppBarData;
ZeroMemory(&stAppBarData, sizeof(stAppBarData));
stAppBarData.cbSize = sizeof(stAppBarData);
stAppBarData.hWnd = (HWND)FindWindow(_T("Shell_TrayWnd"), NULL);
if (bShow)
{
stAppBarData.lParam |= ABS_ALWAYSONTOP;
}
else
{
stAppBarData.lParam |= ABS_AUTOHIDE;
}
SHAppBarMessage(ABM_SETSTATE, &stAppBarData);
}

출처: https://m.blog.naver.com/itrainl4/90092899174

리스트박스를 화면 표출 로그로 사용할시 사용

리스트박스 컨트롤 설정 sort : false 로 설정

 

CString strLog;
OutputListbox(m_listOutput, strLog);


void CExampleDlg::OutputListbox(CListBox& box, CString str)
{
SYSTEMTIME cur_time;
GetLocalTime(&cur_time);
CString strTime;
strTime.Format(_T("[%02d:%02d:%02d.%03d] "),
cur_time.wHour,
cur_time.wMinute,
cur_time.wSecond,
cur_time.wMilliseconds
);

UpdateData(TRUE);
box.AddString(_T(" >  ") + strTime + str);
box.SetCurSel(box.GetCount() - 1);  // Log 최신으로 커서이동

UpdateData(FALSE);
}

실행 제한 시간을 초과했습니다. 작업이 완료되기 전에 실행 제한 시간이 지났거나 서버가 응답하지 않습니다.

 

 

해당 라인 추가

CommandTimeout  를 0으로 주거나 타임아웃 시간을 충분하게 설정

comm.CommandTimeout = 0; 

 

에러내용

변경 내용을 저장할 수 없습니다. 변경 내용을 적용하려면 다음 테이블을 삭제하고 다시 만들어야 합니다.
다시 만들 수 없는 테이블을 변경했거나 [테이블을 다시 만들어야 하는 변경 내용 저장 사용 안 함] 옵션을 설정했습니다.

 

도구 - 옵션 - 디자이너 - 테이블 및 데이터베이스 디자이너 - 테이블을 다시 만들어야 하는 변경 내용 저장 안 함(S)

- 체크해제

 

 

 

 

참고 : https://docs.microsoft.com/ko-kr/troubleshoot/sql/ssms/error-when-you-save-table

MFC 프로그램 중복 실행 방지

 

C프로젝트명App가 있는 cpp 파일에서 해당 코드 작성


/************************ 중복 실행 체크 ************************/
// 컴파일러에게이어플리케이션의모든인스턴스들사이에서공유될수있는
// Shared 섹션을구성하고초기화된변수를삽입하도록한다.
#pragma data_seg("Shared")
volatile LONG g_lApplicationInstances = 0;
#pragma data_seg()
// 링커에게Shared 섹션을읽고, 쓰고, 공유가능한섹션으로설정할것을알려준다.
#pragma comment(linker, "/Section:Shared,RWS")
/************************ end  중복 실행 체크 ************************/

//...

BOOL C프로젝트명App::InitInstance()
{
/************************  중복 실행 체크 ************************/
if (g_lApplicationInstances > 0)
{
// g_lApplicationInstances 가0 이상이 면프로그램이이미실행중이다.
//AfxMessageBox(_T("This Program is already running."));
return FALSE;
}
else
{
// g_lApplicationInstances에1을더하여 프로그램의인스턴스가추가된것을설정한다.
InterlockedExchangeAdd(&g_lApplicationInstances, 1);
}

//기존내용

//


}

다이얼로그 엔터키 막기 _키보드메세지_PreTranslateMessage

 

BOOL CPreTranslateMessageDlg::PreTranslateMessage(MSG* pMsg) {     
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.    
 if (pMsg->message == WM_KEYDOWN)
{       
  
//키 눌렀을때       
  if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
{           
  // esc, 엔터키이면 리턴         
   return TRUE;       
  }  
}  
   return CDialogEx::PreTranslateMessage(pMsg);
}

클래스뷰 - 속성 - 재정의 - PreTranslateMessage  추가

 

or

 

컨트롤 + 쉬프트 + x   - 가상함수 - PreTranslateMessage  추가

- 내용

사전 공유키(Pre-shared key)는 8에서 63자리의 문자! 한국 정부의 방침에 따라서, 비밀번호는 반드시 영문, 특수문자, 숫자를 각 1 개 이상씩 포함하여 총 8 자 이상으로 하여야 합니다.

 

- 방법

 1. Asus 로그인하여 비밀번호 변경창페이지를 띄움

 2. F12를 누른후 Console 탭 이동

 

 3. 아래와 같이 입력

validator.psk_KR = validator.psk 

입력 후 엔터
validator.string_KR = validator.string 

입력 후 엔터

 

 4. 비밀번호 변경

 

 

출처 - rette.iruis.net/2018/04/asua-%EA%B3%B5%EC%9C%A0%EA%B8%B0-%EC%95%94%ED%98%B8%EA%B7%9C%EC%B9%99-%EC%98%81%EB%AC%B8-%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90-%EC%88%AB%EC%9E%90-%EC%82%AC%EC%9A%A9-%EC%9A%B0%ED%9A%8C%ED%95%98%EA%B8%B0/

 

ListBox
        listBox1.SelectedIndex = listBox1.Items.Count - 1; 


ListView
         listView1.Items[listView1.Items.Count -1].EnsureVisible(); 


TextBox
         tbMessage.SelectionStart = tbMessage.Text.Length;
         tbMessage.ScrollToCaret();

출처: https://rescue911.tistory.com/entry/ListBox-ListView-TextBox에서-항상-포커스를-제일-아래로-자동-옮기기

'공부 > C#_자주쓸거' 카테고리의 다른 글

[C#][Winform] 쓰레드 내부에서 컨트롤 수정  (0) 2021.05.11

+ Recent posts