조회수가 많아요 🫢
-
키크론 키보드 fn + f1~12 키 기본 설정
개요감사하게도 지인분께 키크론 k8 pro 키보드를 선물 받아 사용하던 중 키크론 키보드는 f1키를 입력하면 자동으로 fn + f1키가 입력 되고 fn + f1키를 입력해야 f1키가 입력되는 것을 알게 되었다.개발자로써 f1 ~ 12까지의 키를 쓸 일이 많아 그때마다 fn키까지 같이 눌러줘야하는게 굉장히 불편했는데 맥 자체의 설정으로도 키를 돌릴 수 없는 것을 알게 되었고 열심히 찾아보아도 기능키를 기본 맥 키보드처럼 쓸 수 있는 방법은 찾지 못했다... 하InteliJ에서 파일 리팩토링 단축키가 shift + f6인데 리팩토링을 하기위해 shift + f6 + fn 이렇게 세 키를 누를 때마다 참을 수 없는 분노가 올라와서 결국 키크론 키보드 런처에 접속해 직접 부딪혀서 설정하게 되었다.설정 방법유선으..
-
tailwind - important
tailwind class에 !important 적용 시키는 법 클래스 명 앞에 느낌표를 붙이면 된다. 클래스 명 앞에 느낌표를 붙이면 된다.
-
Linux - ls -al 명령어 각 항목별 설명
개요linux를 사용하다 보면 자주 사용하게 되는 ls -al 명령어에서 각 항목이 무슨 의미인지 생각이 안 날 때가 있어 글로 정리 하려한다.각 항목별 설명항목예시설명권한-rw-r--r--파일 유형 및 접근 권한- 첫 글자는 파일 유형(-: 파일, d: 디렉토리 등), 다음 9글자는 소유자, 그룹, 기타 사용자의 권한링크 수1해당 파일이나 디렉토리에 연결된 하드 링크의 수소유자user파일이나 디렉토리의 소유자 이름그룹staff파일이나 디렉토리가 속한 그룹 이름크기1024파일의 크기(바이트 단위) 디렉토리의 경우 메타데이터 크기수정 날짜 및 시간Oct 5 12:34마지막으로 파일이나 디렉토리가 수정된 날짜와 시간파일명example.txt파일이나 디렉토리의 이름예시권한 | 링크 수 | 소유자 | 그룹 | ..
-
Ubuntu - java 21 설치
명령어# apt 리스트 업데이트sudo apt update# java 21 버전 다운로드sudo apt install openjdk-21-jdk-headless# 설치 가능한 java 버전 확인# sudo apt list openjdk*
-
Github - 디스코드 깃허브 알림 action(Discord Github Notification) 설명서
프로젝트 개요프로젝트 이름: 🛎️ Discord Github NotificationGithub repository urlGithub marketplace url프로젝트 설명이 프로젝트는 GitHub Action을 통해 GitHub에서 발생하는 다양한 이벤트(예: Pull Request 생성, 이슈 생성 등)를 Discord 채널 알림으로 전송하는 프로세스를 단순화해주는 서비스입니다.이 Action을 사용하면 중요한 개발 이벤트를 놓치지 않고 바로 Discord에서 확인할 수 있습니다!이 Action은 커스텀 알림 메시지를 지원하며, 한국어 🇰🇷와 영어 🇬🇧 중 원하는 언어로 알림을 받을 수 있습니다.👤 개발자: 김채민(Aleph Kim)🔧 주요 기능📝 PR 알림Pull Request 생성,..
-
PostgreSQL - docker PostgreSQL 16 설치
개요Docker가 설치된 환경에서 docker image를 사용하여 PostgreSQL을 설치하는 과정.이미지를 변경하여 다른 버전의 pg(postgresql 약어)도 설치가 가능합니다.과정1. 이미지 다운로드docker pull postgres:16docker images # 다운로드 완료 확인2. 컨테이너 실행# docker run --name 컨테이너명 -e 환경변수키=환경변수값 -d -p 포트바인딩 이미지명docker run --name postgres -e POSTGRES_PASSWORD=내비밀번호 -d -p 5432:5432 postgres:16docker ps # 실행중인 컨테이너 확인3. 컨테이너 접속docker exec -it postgres bash4. db 접속# psql -h 호스트..
-
🏧 우리가 사용중인 임베디드 시스템 5가지 예시
임베디드란 정의 - 기계장치를 사용하기 위해 기계 내부에 탑재된 컴퓨터를 뜻한다. - 범용 컴퓨터(일반 pc)의 반대 개념 - 특정 목적을 가지고 만들어진 프로그래밍 가능한 컴퓨터 예시 - 세탁기나 냉장고 등 가전제품에 들어가는 단일목적 컴퓨터 특징 - 프로그램 최적화 - 임베디드 시스템의 하드웨어는 성능이 열악하기 때문에 코드를 최대한 압축시켜 최고의 효율을 내야한다. - 복잡한 알고리즘 - 마이크로프로세서에 의해 수행되는 명령이 고도의 정교함을 요할때가 있다. - GUI, 실시간 처리 지원, 멀티레이트, 하드웨어 지식 등등 1. 가전제품 냉장고, 세탁기, 전자레인지 등2. 자동화 시스템 산업 기계 제어, 온도 모니터링, 3D 프린팅 등3. 의료기기 혈압 모니터, 심장 박동 모니터, 맥박 조정기, 스캐..
-
Spring - 랜덤 인증번호 생성기
개요프로젝트를 진행하던 중 흔히들 사용하는 랜덤 인증번호 생성 프로세스가 필요해 작성해보았다.생성되는 인증번호는 영어 소문자와 숫자의 조합이다. (인증번호에 대소문자 구분하는 것 만큼 짜증나는 것이 없기에...)코드import java.security.SecureRandom;/** * 랜덤 인증번호 생성 클래스 */public class RandomAuthCode { // 인증 코드에 사용될 문자들 private static final String CHARACTERS = "abcdefghijklmnopqrstuvwxyz0123456789"; // 인증 코드의 길이 (6자리) private static final int CODE_LENGTH = 6; // 보안 강화를 위한 Sec..
-
js - 시간 차이 계산(시:분:초)
코드/** * 시간차이를 시분초 단위로 계산해주는 함수 * @param {String} time * @returns {String} 시간차이 */function 시간차이(time) { // 현재 시간 기준으로 차이 계산 var now_time = new Date(); var deadline = new Date(time); // 시간 차이를 초 단위로 변수에 저장 var diff_time = (deadline - now_time) / 1000; var diff_hour = Math.floor(diff_time / (60 * 60)).zf(2); var diff_minute = Math.floor((diff_time % diff_hour) / 60).zf(2); ..
-
HTML - a태그 href 뒤로가기, 앞으로가기, 새로고침
코드뒤로가기새로고침앞으로 가기
최근에 올렸어요💡
-
PHP - Docker Prometheus Grafana 모니터링
개요php로 서비스를 운영하며 속도가 너무 느려 원인을 찾아보려 했으나 코드상에서 병목이 발생할만한 부분을 찾지 못했다.서버 성능의 문제가 아닌가 싶었지만 원인을 분명히 하고 싶어 모니터링 시스템을 추가하게 되었고 많은 모니터링 시스템 중 Prometheus Grafana 조합을 선택하게 되었다.왜 Prometheus + Grafana인가?기준Prometheus + GrafanaZabbixNagiosInfluxDB + ChronografDatadog데이터 수집Pull 기반, PHP-FPM exporter로 PHP 메트릭 수집 가능, 다양한 exporter 지원Push 기반, 에이전트 설치 필요, PHP 스크립트로 커스텀 메트릭 지원스크립트 기반 체크, PHP 메트릭은 플러그인으로 제한적Push 기반, T..
-
Ubuntu - 서버간 파일 전송(scp 명령어)
개요여러 서버를 운영하다보면 가끔 필요해지는 서버간 파일 전송 방법에 대해 정리해보았다.scp보다는 rsync를 사용하는게 안정적이라고는 들었으나 일단은 scp로도 충분한 것 같아 rsync는 추후에 사용하게 되면 그때 정리할 예정이다.1. 서버 A에 SSH 접속ssh 서버A유저@서버A의IP# ex. ssh userA@123.123.123.1232. SSH 키쌍 생성 (서버 A에서)ssh-keygen -t rsa -b 40963. 생성된 키쌍 파일 확인ls -al4. pub key 내용 확인 및 복사cat ~/.ssh/id_rsa.pub5. 서버 B에 SSH 접속ssh 서버B유저@서버B의IP# ex. ssh userB@456.456.456.4566. 서버 A의 pub key를 서버 B의 authorize..
-
Nginx - Nginx Proxy Manager 502 bad gateway 에러 해결
개요GCP 인스턴스에서 OCI 인스턴스로 서버를 이전하던 중 기존 GCP에서는 문제없이 작동하던 Docker 기반 네트워크 구조가 OCI에서는 제대로 동작하지 않았고, 그로 인해 Nginx Proxy Manager(이하 npm) 컨테이너가 다른 서비스 컨테이너와 통신을 할 수 없어 도메인을 연결할 수 없게 되었다.이를 해결하기 위해 꽤나 많은 시간을 허비하게 되었고, 이는 그 과정을 압축한 글이다.문제 상황OCI로 서버를 옮긴 뒤 Docker 설정을 기존과 동일하게 구성했지만, npm이 다른 컨테이너와 통신하지 못했다.1. GCP에서는 npm이 `172.17.0.1:[service port]`로 통신하면 정상 작동했지만 OCI에서 같은 방식으로 설정할 경우 502 bad gateway 에러 발생2. `n..
-
MAC 주소란?
MAC 주소란?MAC 주소(Media Access Control Address)는 네트워크에 연결된 기기의 네트워크 인터페이스(예: Wi-Fi 칩, 이더넷 포트)에 부여된 고유한 식별자이다.데이터 링크 계층(Layer 2)에서 로컬 네트워크(LAN) 내에서 기기를 식별하고, 데이터를 정확히 전달하는 데 사용된다.애플의 mac과는 전혀 상관 없다. 애플에서는 혼동되지 않도록 mac 주소를 프로토콜 주소(Ex. 와이파이 주소) 같은 식으로 표기한다.MAC 주소의 특징형식: 48비트(6바이트) 16진수. 예: AA:BB:CC:DD:EE:FF앞 24비트: OUI(제조사 고유 ID) — 예: 삼성, 애플 등뒤 24비트: 제조사가 임의로 지정하는 고유 번호고유성:총 가능한 조합: 2^48 ≈ 281조 개 → 전 세..
-
Nginx - Nginx Proxy Manager Stream 설정
개요최근 GCP 프리티어 VM이 너무 느린 것 같아 Oracle Cloud Infrastructure(OCI)의 프리티어로 서버를 옮기게 되었다. OCI는 상상 이상으로 쾌적하게 잘 작동했지만, 인스턴스 간 네트워크 구성에서 예상치 못한 문제가 발생했다.OCI에서는 프리티어 기준으로 VM 인스턴스를 2개까지 생성 가능하지만, Public IP는 1개만 예약 가능하다.그리하여 아래와 같이 구성했다.main-instance: 실제 서비스 운영 (Nginx, 백엔드 API 등), Public IP 보유db-instance: MySQL DB만 운영, 사설 IP만 존재하지만 위 구조로 진행 중 DB 툴(MySQL Workbench, DBeaver 등)에서 MySQL에 접속하려고 할 때 문제가 발생했다.원인처음엔 ..
-
Docker - Dockerfile에서 crontab 설정하기
개요Docker 컨테이너 안에서 cron을 실행해야 하는 작업이 있어서 Dockerfile에 cron 설정을 추가했는데, 컨테이너는 잘 올라갔지만 cron이 실행되지 않는 문제가 발생했다.crontab -l로 확인해보면 제대로 등록까지 되어 있었는데도 아무 반응이 없었고, 구글로 검색했더니 명확한 해결방법을 찾지 못해 수많은 삽질을 통해 찾게된 해결방법을 정리해본다(몹시 간단).Dockerfile에 crontab 설정하기처음에 사용한 Dockerfile은 대략 아래와 같았다# 베이스 이미지FROM ubuntu:20.04# 패키지 설치RUN apt-get update && apt-get install -y cron# cron 파일 복사COPY cronfile /etc/cron.d/cronfile# cron..
-
기타 - compinit:480: compdump: function definition file not found 에러 해결(feat. m4 에어 마이그레이션)
개요드디어 맥북을 업그레이드 했다. 오랜 기간 동고동락한 m1 에어를 보내주고 m4 에어를 질러버렸다.기분좋게 마이그레이션까지 마치고 VScode에서 터미널을 열었는데 갑자기 아래와 같은 에러가 출력되기 시작했다.compinit:480: compdump: function definition file not found.zshrc:188: add-zsh-hook: function definition file not foundcompinit 관련 에러zsh에서 compinit은 자동 완성 기능을 초기화할 때 사용하는 함수인데, 뭔가 꼬였는지 함수 파일 자체를 못 찾는다고 에러가 발생했다.그래서 .zshrc에 다음 스크립트를 추가해보았다autoload -Uz compinitcompinitautoload -U b..
-
PHP - Apache server status 설정 + 프록시 IP 처리
개요Grafana로 PHP 서버 상태를 모니터링하려고 하다가 Apache 환경에서의 설정과 보안 문제를 겪게 되어, 그 과정을 정리해보았다.특히 server-status를 외부에서 접근 가능하게 열었을 때 생기는 보안 이슈와, Nginx 프록시 환경에서의 IP 처리 문제를 어떻게 해결했는지를 중심으로 다룬다.Apache server-status 활성화Apache에서는 mod_status 모듈을 활성화한 뒤 /server-status 엔드포인트를 열어 서버 상태 정보를 확인할 수 있다.Grafana로 apache 서버를 모니터링 할때는 해당 데이터를 수집하기 위해 보통 Prometheus용 Apache Exporter와 연결하여 시각화한다.처음에는 다음과 같은 설정으로 server-status를 활성화했었..
-
DB를 털리다.
피곤한 월요일, 여느 때와 같이 일을 하다 잠깐 쉬는 시간에 내 사이트는 잘 돌아가고 있나 들어가보았는데?메인페이지에서 500 에러가 발생하고 있었다.경험상 잘 돌아가던 사이트의 메인페이지에서 에러가 발생하는 경우는 보통 db 연결에 장애가 생겨 그런 경우가 대부분이었어서 '뭐지 db가 꺼졌나?', 'cloudflare 연결한게 원인인가? 아닌데.. db는 ip로 연결해서 별 관련 없는데..' 하는 생각을 하며 서버에 접속을 해보았다.흐으음... db는 안 내려갔고... 이상이 없는데? redis가 내려갔나? redis도 정상적인데....원인을 찾지 못하고 애꿎은 서버 로그만 뒤적이고 있었다.그런데???All your data is backed up. You must pay 0.0100 BTC to bc..
-
Nginx - Nginx Proxy Manager + Cloudflare ssl 적용
개요가난한 개발자는 무료 서버를 사용할 수 밖에 없고 8,000km나 떨어진 서버를 사용하는 사이트에 접속하면 속도는 끔찍한 경우가 대부분이다.특히나 메인페이지에 접속할때마다 자체 이미지 호스팅 서버에서 수많은 이미지를 불러오고, db 서버에서 복잡한 조회 쿼리를 실행하는 내 사이트의 속도는 최악 중의 최악에 치달았다.이를 해결하기 위해 방법을 찾아보다 CDN 서비스라는 것을 알게 되었고, 그 중에 전세계 1등 CDN 서비스 회사인 Cloudflare를 사용하게 되었다.DNS 설정을 하고, 처음보는 서비스가 신기해 이것저것 설정을 해본 후 속도가 얼마나 빨라졌나 기대를 하며 내 사이트에 접속을 하는데! 이게 뭐람? 정상적이던 내 사이트가 갑자기 접속이 안 되기 시작했다.ERR_SSL_PROTOCOL_ER..
-
Go - 이미지 리사이즈 기능(/h2non/bimg)
개요Go로 이미지 호스팅 서버를 개발하던 중, 이미지 리사이즈 기능을 구현하는 과정에서 고민했던 점들을 정리해보았다.go 주요 이미지 리사이즈 라이브러리 비교라이브러리장점단점bimg- libvips 기반으로 매우 빠른 처리 속도 - 메모리 사용량이 적음 - 다양한 이미지 포맷 지원- C 바인딩으로 인한 설치 복잡도 증가 - libvips 의존성 필요 - Windows 환경에서 설정이 까다로움imaging- 순수 Go로 작성되어 설치가 간단 - 크로스 플랫폼 지원이 용이 - API가 직관적이고 사용하기 쉬움- 처리 속도가 상대적으로 느림 - 메모리 사용량이 많음 - 일부 고급 이미지 처리 기능 부재nfnt/resize- 가볍고 단순한 구현 - 순수 Go로 작성되어 의존성이 ..
-
PHP - 클로저(Closure, 익명 함수)
개요개발을 하다보면 변수를 넣어야하는 문자열을 또 변수로 사용하게 될때가 있는데 매번 문자열을 불러와서 변수를 .으로 붙여주거나 복잡하게 넣어주게 돼서 간단한 방법이 없나 찾아보다 클로저 함수라는 것을 사용하게 되었다.사용 예시// 문자열에 변수 추가$exam_url = fn($id) => "https://example.com/user/$id";echo $exam_url(123); // "https://example.com/user/123"// 문자열에 변수 여러 개 추가$profile = fn($name, $age) => "이름: $name, 나이: $age";echo $profile("aleph", 26); // "이름: aleph, 나이: 26"// 문자열에 삼항연산자로 변수 추가$status = ..
-
PHP - html 태그 추출기
개요웹개발을 할때 svg 아이콘이 필요하면 유튜브에서 사용하는 svg 태그를 가져다 사용하고 있는데 유튜브에 존재하는 모든 svg를 미리 분류해두고 싶어 php를 사용해 유튜브 페이지의 전체 html에서 svg 태그만 추출하기 위해 php로 태그 추출기를 만들어보았다.코드(.*?)/is";preg_match_all($pattern, $html, $matches);// 결과 처리$output = implode("\n", $matches[0]);// 파일로 저장file_put_contents('output.html', $output);echo "태그 추출이 완료되었습니다.";사용 예시input.html 위 html을 php 파일과 같은 경로에 input.html로 저장하..
-
HTML, CSS - 별점 선택(Star Rating)
See the Pen Star Rating by 김채민 (@aleph-kim) on CodePen.
-
PHP - Docker-Compose 환경 PHP 프로젝트 빌드 시 Composer 설치
개요php, docker compose로 프로젝트를 진행하면서 composer를 설치하려는데 뭐 컨테이너를 따로 만들고 어쩌구 볼륨을 설정하고 어쩌구 이상하리만치 복잡하길래 간단한 방법을 만들어보았다.파일docker-compose.yml기본 compose 파일로 composer를 쓰나 안 쓰나 차이는 없다.version: '3.8'services: web: build: . ports: - "8080:80" volumes: - .:/var/www/htmlDockerfileDockerfile에서 직접 composer를 설치하고, 라이브러리도 설치한다.# PHP 7.4와 Apache 이미지 사용FROM php:7.4-apache# Composer 설치에 필요한 패키지 설치 ..
-
Go - 파일 호스팅 서버 프로젝트 기술 설명서
🌟 프로젝트 기술 설명서 🌟이 프로젝트는 파일 호스팅를 위한 RESTful API 서버입니다. Go 언어로 작성되었으며, Docker를 이용해 배포할 수 있도록 구성되었습니다. 🚀 서버는 사용자가 인증된 상태에서 파일을 업로드하고 관리할 수 있도록 기능을 제공합니다.관련 링크 📑아래는 프로젝트와 관련된 다양한 링크 정보입니다.서버 url: https://img.aleph.kr/api 명세서 url: https://github.com/Aleph-Kim/img-host-server/wiki깃허브: https://github.com/Aleph-Kim/img-host-server 🧑💻 주요 기능 🧑💻파일 업로드: 인증된 사용자만 파일을 업로드할 수 있습니다. 파일은 사용자별로 구분된 폴더에 저..
-
Docker - sudo 없이 docker 명령어 사용하기
개요현재 인스턴스 서버에서 docker 명령어를 실행할 때마다 sudo를 붙여야 하는 불편함이 있어 이를 해결하기 위해 방법을 찾아보았다.1. 현재 사용자 Docker 그룹에 추가하기# 현재 사용자를 docker 그룹에 추가하는 명령어sudo usermod -aG docker $USER2. 세션 재시작 또는 로그아웃 후 다시 로그인그룹 변경 사항이 적용되기 위해 로그아웃 후 다시 로그인하거나 터미널을 재시작3. 권한 확인# 현재 사용자의 그룹 리스트 출력groups출력 결과에 docker 그룹이 포함되어 있다면 성공적으로 추가된 것이다.
-
Docker - Debian 서버에 docker, docker compose 설치하기
Docker 설치# 필수 패키지 설치sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl software-properties-common# Docker GPG key 추가curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# Docker 저장소 추가echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https..
-
Go - error strings should not end with punctuation or newlines (ST1005)
개요Go로 새로운 프로젝트를 진행하던 중 vscode에서 errors.New("에러가 발생했습니다.") 부분에 노란색 밑줄이 생겼다.그냥 냅둬도 서버 굴리는 데에 아무런 영향 없이 잘 돌아가지만 저 노란색 밑줄을 용납할 수 없어 조금 찾아보았다.원인오류 메시지의 문자열 첫 번째 글자가 대문자인 경우오류 메시지의 문자열 끝에 마침표, 느낌표, 물음표 등의 구두점이나 개행 문자가 포함될 경우해결방법원인에 따라 첫 번째 글자를 소문자로 바꾸거나 끝에 특수문자가 들어가지 않도록 수정하면 된다.하지만하지만 한국인의 에러 메시지가 마침표로 끝나는 것은 일어날 수 있는 일이 아닌가? 나는 에러가 발생했습니다 라며 마침표 없이 끝나는 에러 메시지를 보고 싶지 않다.고로 노란색 밑줄이 뜨지 않도록 vscode의 설정을 ..
-
Git - 특정 파일의 변경 사항 추적 제어 (올라간 파일 업데이트 안 하는 방법)
명령어설명예시git update-index --skip-worktree [파일명]지정한 파일에 대해 skip-worktree 플래그를 설정합니다. 로컬 변경 사항을 Git이 무시하도록 합니다.git update-index --skip-worktree config.txtgit update-index --no-skip-worktree [파일명]설정된 skip-worktree 플래그를 해제하여, 해당 파일의 변경 사항을 다시 추적하도록 합니다.git update-index --no-skip-worktree config.txtgit ls-files -v현재 추적 중인 파일들의 상태를 보여줍니다. `H`는 일반 상태, `S`는 skip-worktree가 설정된 파일입니다.git ls-files -v
- 방문자수
전체 방문자
오늘 방문자
어제 방문자