레이블이 programming인 게시물을 표시합니다. 모든 게시물 표시
레이블이 programming인 게시물을 표시합니다. 모든 게시물 표시

2024년 5월 17일 금요일

glot.io 브라우저 기반 간단한 무료 온라인 코딩 도구

glot.io

https://glot.io/new/c


C언어 외에도 다양한 언어를 지원한다. 간만에 가보니 종류가 더 늘은 것 같다. 요새 핫한 Dart, Rust, Typescript 등도 있음.




편집기와 실행 화면. 그자리에서 컴파일된다. 입력 데이터도 별도로 지정가능


저장 기능(공유를 위한 public, 혼자 보기 위한 private 둘 다 지원)도 있고, 간단한 테스트나 공부하는 용도로 좋음





2024년 5월 3일 금요일

C언어의 memcpy() src와 dst 순서가 헷갈린다면

메모리를 복사하는 memcpy()함수의 인자 순서는
memcpy(dst, src, size) 인데

아직도 종종 생각없이 쓰다가 혹시 실수했나 싶어서 레퍼런스를 찾아본다.
다행히도 여태 실수로 순서를 뒤집은 적은 없음.



혼동된다면 우변에서 좌변으로 값을 보내는 변수대입 시 기본문법으로 기억해야겠다.

2024년 3월 3일 일요일

행정안전부 추천문서 소프트웨어 개발보안 가이드

행정안전부와 KISA에서 2021년에 발간한 유익한 문서


행안부 홈페이지 링크:

https://www.mois.go.kr/frt/bbs/type001/commonSelectBoardArticle.do;jsessionid=TjAX2IwVk6hpONx8dKSZ4VTj.node10?bbsId=BBSMSTR_000000000015&nttId=88956#none



이 영상을 보다가 소개가 나와서 알게 되었다.

대충 훑어보니 진짜로 유익한 내용이 많이 들어있음.

기본만 지켜도 어이없이 털리는 일은 없을 것이다.


당장 밥벌이 판도가 바뀐다는 것은 아님.

C/C++ 그동안 오래 쓰기도 했고 보안 관련 이슈들 때문에 당장은 아니더라도 언젠가는 넘어갈 때를 맞이해야 할듯

매뉴얼대로만 만들어도 문제는 안생기겠지만 휴먼 에러 및 나태함 등으로 인해 생길 수 있는 문제들은 원천부터 막아버리자는 건가


다음 주자는 RUST가 유력하다고 한다.

실제로 주변에 RUST를 사용해서 제품을 만드는 사람도 있기도 하고

2024년 1월 15일 월요일

C++에서의 namespace

namespace는 직역하면 이름공간이 될 텐데 어느 강의에서 단순히 이름공간이라고 부르면 와닿지 않으니, 의역해서 "소속"이라고 부르는 건 어떻냐는 얘기가 나왔다.

용도를 생각해보면 그냥 "네임스페이스"라고 그대로 부르거나

이름공간이라고 할 거면 소속이라고 부르는 것도 개발자들 간 소통에도 좋을 것 같긴 하다.

용어사전에도 없던 소속 이라는 말은 갑자기 어디서 나오고 무슨 의미냐고 따지면 그건 할 말 없음.

2023년 11월 13일 월요일

SASM: 어셈블리 공부용 심플 통합개발환경(IDE)

SASM (SimpleASM) - Simple open source crossplatform IDE for NASM, MASM, GAS, FASM assembly languages.

우리 중 이걸 사슴이라고 읽는 사람이 있으려나?

아무튼 어셈 공부 시 IDE 상에서 간편하게 돌려볼 수 있다.

써보니 빠르고 편하고 괜찮음. 추천


SASM 홈페이지 화면

다운로드 페이지 링크: https://dman95.github.io/SASM/english.html

GitHub: https://github.com/Dman95/SASM


SASM 실습중 발생 오류 - error: impossible combination of address sizes

PRINT_STRING이 있는 라인에서 이런 에러가 났다.

error: impossible combination of address sizes



%include "io64.inc"

section .text
global CMAIN
CMAIN:
    ;write your code here
    PRINT_STRING msg
    
    xor rax, rax
    ret
    
section .data
    msg db 'Hello World', 0x00


빌드옵션을 확인해보니 x86 mode로 되어있었다.

내 CPU가 64비트라 x64 모드로 해야 했었던 것 같음.

아래 화면처럼 바꿔주니 성공



2023년 10월 20일 금요일

구글 Colab에서 구글드라이브 내부 경로 접근하기

1. 드라이브 임포트 및 마운트

from google.colab import drive
drive.mount('/content/gdrive')


2. 내가 만든 폴더로 경로 이동하기

보통 '내 드라이브'가 구글 드라이브의 최상위 경로일 것이다.
그 아래 'data'라는 폴더를 생성했다고 가정할 경우

내 드라이브 > data


cd /content/gdrive/My Drive/data

코드창에서 위와 같이 입력하고 실행한다.
프롬프트는 아니지만 프롬프트에서 입력한 것처럼 작동함.

2023년 10월 19일 목요일

QX82: 80년대 스타일 레트로 게임개발용 경량 자바스크립트 엔진

 https://btco.github.io/qx82/


QX82라는 경량형 자바스크립트 게임개발 엔진이 나왔다.
80년대 컴퓨터에서 플레이하던 복고풍 그래픽을 구현할 때 유용해 보임.

소개는 다음과 같음:

QX82 is a tiny Javascript engine that lets you create games and experiences inspired by the look and feel of a retro 80s computer. It's not an emulator or a fantasy console: it's just a Javascript library.

It's open source. You can download it from the GitHub repo.


소개 페이지에 데모가 있는데 브라우저에서도 바로 실행되고 해보면 신기하다.
오픈소스이며 MIT 라이선스 적용

파이토치 공부중 next() 함수 에러

데이터셋에서 미니배치를 불러올 때 예제코드대로 했더니 .next()함수에서 에러가 발생

dataiter1 = iter(train_loader1)
images1, labels1 = dataiter1.next()
print(images1.size())   # 배치 사이즈 확인


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-53a15405132b> in <cell line: 2>()
      1 dataiter1 = iter(train_loader1)
----> 2 images1, labels1 = dataiter1.next()
      3 print(images1.size())   # 배치 사이즈 확인

AttributeError: '_SingleProcessDataLoaderIter' object has no attribute 'next'


최신 버전에서는 객체의 next() 함수로 쓰는 게 아니라 그냥 next() 안에 인자로 넣어줘야 했음


dataiter1.next() 를 아래 코드처럼 next(dataiter1) 로 수정했더니 해결

dataiter1 = iter(train_loader1)
images1, labels1 = next(dataiter1)
print(images1.size())   # 배치 사이즈 확인

2023년 9월 22일 금요일

1d convolution 설명 잘 된 블로그(PyTorch 기반)

https://sanghyu.tistory.com/24

꼭 PyTorch를 쓰지 않더라도 설명이 친절하게 잘 되어 있어서 참고용으로 좋음.

2023년 6월 2일 금요일

Nuxt.js - Vue와 호환되면서 SSR을 지원하는 웹개발 프레임워크






Nuxt.js는 Vue.js 기반의 오픈소스 웹 프레임워크로 다음과 같은 장점을 가지고 있다.

1. 서버 사이드 렌더링 (SSR): Nuxt.js는 기본적으로 서버 사이드 렌더링을 지원한다. 이는 서버에서 웹 페이지를 사전에 렌더링하여 초기 로딩 속도를 향상시키고, 검색 엔진 최적화(SEO)를 개선할 수 있다. SSR을 통해 빠른 초기 렌더링을 제공하면서도 Vue.js의 장점을 그대로 활용할 수 있다.

2. 유연한 라우팅: Nuxt.js는 Vue Router를 기반으로 한 강력한 라우팅 시스템을 제공한다. 파일 시스템 기반의 라우트 매핑 방식을 사용하여 개발자가 간편하게 페이지와 라우트를 구성할 수 있다. 이를 통해 복잡한 애플리케이션의 라우팅 관리를 단순화할 수 있다.

3. 자동 코드 분할 (Automatic Code Splitting): Nuxt.js는 페이지 간에 필요한 컴포넌트와 모듈들을 자동으로 코드 분할하여 번들 파일 크기를 최적화한다. 이를 통해 초기 로딩 속도를 향상시키고 필요한 컴포넌트만 로드하여 불필요한 자원 낭비를 줄일 수 있다.

4. 정적 사이트 생성 (Static Site Generation): Nuxt.js는 정적 사이트 생성 기능을 지원하여 빌드 시간에 웹 페이지를 사전 렌더링하여 정적 파일로 생성할 수 있다. 이를 통해 서버에 대한 의존성을 제거하고 CDN과 같은 정적 호스팅을 통해 빠르고 안정적인 배포가 가능하다.

5. 확장성과 생태계: Nuxt.js는 Vue.js의 생태계와 호환되며, 다양한 플러그인과 모듈을 활용할 수 있다. Vue.js 생태계의 커뮤니티, 플러그인, 모듈, 컴포넌트 등을 활용하여 개발 생산성을 향상시킬 수 있다. 또한, Nuxt.js 자체의 확장성도 뛰어나고, 기능을 커스터마이징하고 확장할 수 있는 API를 제공한다.

이러한 장점들로 인해 Nuxt.js는 SSR, 코드 분할, 정적 사이트 생성 등을 필요로 하는 웹 애플리케이션 또는 웹 사이트의 개발에 적합한 선택지가 될 수 있다.

하지만 내가 Nuxt.js로 고른 이유는 단순하게 지난번 프로젝트에서 Vue.js를 써봤기 때문.


p.s. Showcase에 가보니까 요새 ChatGPT로 핫한 OpenAI 소개페이지도 있음

2018년 9월 4일 화요일

[-lstdc++] gcc 로 c++ 코드 컴파일 시 오류 해결

gcc로 cpp 코드를 컴파일 시
코드는 멀쩡한 데 "Undedined symbols for architecture x86_64" 같은 오류메시지가 나온다면

-lstdc++ 옵션을 통해 해결한다.


$ gcc -o out src.cpp -lstdc++


아니면 g++ 컴파일러를 사용한다.


그렇다면 -lstdc++ 옵션의 정체는 뭘까?
이 옵션은 C++ 코드를 컴파일 시 필요한 C++ 표준 라이브러리를 링크하는 데 사용된다. STL 및 여타 C++ 라이브러리 함수들을 사용하려면 lstdc++ 옵션을 추가해야 한다.
일반적으로 CPP 프로그램을 컴파일할 때 자동으로 추가되지만 위와 같은 상황에서는 수동으로 컴파일 명령 옵션으로 넣어주면 된다.

2018년 2월 21일 수요일

Java에서 Interface 개념 잡기(쉬운 설명)

아직 자바 언어에 익숙치 않아서 인터페이스 개념이 잘 잡히지 않는다.
오픈소스 라이브러리를 사용하거나 다른 사람의 코드를 참조 할 때 인터페이스가 많이 나오기 때문에 개념은 알아두는것이 좋다.

아래 소개되는 페이지들에 쉽고도 친절한 설명이 있으니 참조할 것.

자바 인터페이스 링크 1:
https://wikidocs.net/217
(동물원에 비유하여 왜 필요한지 알기 쉽게 설명하였다.)

자바 인터페이스 링크 2:
http://blog.eairship.kr/122

클래스의 종속성을 줄이면서 결국은 중복되는 코드를 최소화하는 효과가 있다.
=> 생산성 향상

2017년 11월 8일 수요일

[DSP] 공대생을 위한 FFT 하루에 배우기 튜토리얼

The DFT “à Pied”: Mastering The Fourier Transform in One Day


 공대생들에게 도움될 만한 DSP블로그 페이지이다. 디지털 신호처리에 필요한 FFT의 기본과 예제 코드를 배울 수 있다. 아쉽게도 영문으로 되어있지만 어려운 영어가 아니라서 조금만 수고하면 여러분의 것으로 만들 수 있을 것이다. 친절한 설명이 장점이다. 나도 영어를 매우 못하지만 이 튜토리얼이 도움이 되었다.

예제 코드는 C언어로 되어있다.
 
URL: http://blogs.zynaptiq.com/bernsee/dft-a-pied/

2017년 9월 3일 일요일

GCC에서 static / shared 라이브러리 만들기

GNU GCC (Linux) 에서
Static library(.a 확장자 파일) 또는 shared 라이브러리(.so 확장자 파일) 컴파일 및 빌드하는 법

아래 URL 링크를 참조한다.
http://www.adp-gmbh.ch/cpp/gcc/create_lib.html


2016년 7월 1일 금요일

Android Studio - New Project - Minimum SDK

Android Studio에서 프로젝트 생성 시

Minimum SDK Version을 4.0.x 대로 하고 싶은데 4.0과 4.0.3 중 어떤 걸로 선택할지 모르겠을 때는 4.0.3 (API 15)으로 하면 된다.

2016년 5월 26일 목요일

IBM의 Swift Sandbox (Beta)

IBM에서 새로 만든 PaaS (P = Platform) Bluemix 에서 Swift 언어의 샌드박스 환경을 제공 중.

디자인도 미려하다.

https://swiftlang.ng.bluemix.net/?cm_mmc=developerWorks-_-dWdevcenter-_-swift-_-lp#/repl

설치도 필요없고 브라우저만 있으면 가능. xcode가 없는 환경에서 돌려보기에 좋다.
화면 왼쪽에서 코드를 작성하고 실행 버튼을 누르면
오른쪽의 결과 화면에 실행결과가 바로 반영된다.

스위프트 문법 공부는 여기서 하면 될 듯.


2016년 5월 1일 일요일

Google Developers Summit (4/28)




처음 가본 구글에서 개최하는 세미나.
많은 개발자들이 참석해서 좌석이 가득 찼다.

올해 출시 예정인 Android N 버전이 벌써 준비중이고 기존 버전대비 달라지는 부분이 공개되었다.
가장 기억에 남는 부분은 멀티 윈도우 서포트였다. 직접 구현하려면 머리 좀 아플 것 같다.

트랙은 App 개발 트랙과 Web 개발 트랙으로 나뉘어져서 엔지니어들은 자신의 분야에 맞는 강연을 들을 수 있었다.

나갈 때 티셔츠도 사은품으로 주더라.

2015년 12월 13일 일요일

[무료로 공부하기] 코드카데미 (Codecademy)



책을 사거나 유료 강의를 수강하지 않고 인터넷으로 프로그래밍 공부를 할 수 있다.
준비물은 PC와 웹브라우저만 있으면 된다.

제공 강좌 : HTML, CSS, JavaScript, PHP, Python, Ruby 등
(주로 웹 프로그래밍)

컴파일러 설치 없이 웹상에서 코드를 입력하고 결과도 돌려볼 수 있는 것이 장점


한국어 서비스도 제공함


2014년 4월 10일 목요일

WIN32 API기반으로 간단히 구현해 본 StopWatch

API를 이용하여 간단하게 교육용 소스로 스톱워치를 만들어 보았다.

타이머를 하나 생성해서 돌려주면

타이머 이벤트가 발생할 때 마다 undercomma (1/100초)가 하나씩 증가하고

이넘들이 100개 모이면 1초 , 1초가 60개 모이면 다시 1분이 증가하는 순서이다.

소스는 간단함..

문제점이 있다면 실제 시간하고 맞지 않는다는것이다.
(실제시간 1초보다 타이머상의 1초가 증가하는데 더 오래걸린다)



//============================================================================================
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("StopWatch");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
   ,LPSTR lpszCmdParam,int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst=hInstance;
 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpszClass;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);
 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,CW_USEDEFAULT,300,220,
  NULL,(HMENU)NULL,hInstance,NULL);
 ShowWindow(hWnd,nCmdShow);
 while (GetMessage(&Message,NULL,0,0)) {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
   HDC hdc;
   PAINTSTRUCT ps;
   HFONT font, oldfont;
   static int min, sec, undercomma; // 분, 초, 0.01초
   switch (iMessage) {
     case WM_CREATE:
      hWndMain=hWnd;
      CreateWindow(TEXT("button"),TEXT("START"),WS_CHILD|WS_VISIBLE|
       BS_PUSHBUTTON,20,150,80,30,hWnd,(HMENU)0,g_hInst,NULL);
      CreateWindow(TEXT("button"),TEXT("STOP"),WS_CHILD|WS_VISIBLE|
       BS_PUSHBUTTON,105,150,80,30,hWnd,(HMENU)1,g_hInst,NULL);
      CreateWindow(TEXT("button"),TEXT("EXIT"),WS_CHILD|WS_VISIBLE|
       BS_PUSHBUTTON,190,150,80,30,hWnd,(HMENU)2,g_hInst,NULL);
    return 0;
 
   case WM_TIMER:
      undercomma+=5;
      if(undercomma >= 100) { sec++; undercomma=0; }
      if(sec >= 60) { min++; sec=0; }
      InvalidateRect(hWnd, NULL, TRUE);
    return 0;
   case WM_PAINT:
      char szTxt[16];
      hdc=BeginPaint(hWnd, &ps);
      font=CreateFont(60,0,0,0,0,0,0,0,HANGEUL_CHARSET,0,0,0,0,"돋움");
      oldfont=(HFONT)SelectObject(hdc,font);
      sprintf(szTxt, "%02d:%02d.%02d",min, sec, undercomma);
      TextOut(hdc, 20, 40, szTxt, strlen(szTxt));
      SelectObject(hdc,oldfont);
      DeleteObject(font);
      EndPaint(hWnd, &ps);
    return 0;
   case WM_COMMAND:
    switch(LOWORD(wParam)) {
    case 0:  // START button clicked
       min = 0;
       sec = 0;
     undercomma = 0;
       SetTimer(hWnd, 3355, 50, NULL);
       break;
    case 1:  // STOP button clicked
       KillTimer(hWnd, 3355);
       break;
    case 2:  // EXIT button clicked
       PostQuitMessage(0);
       break;
    }
    return 0;
   case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
   }
   return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}