[ssh] config 파일에 IP와 Hostname을 함께 지정

~/.ssh/config 파일 안에 hostname을 지정한다면, 그 뒤에 IP 주소를 함께 지정하면 hostname이나 IP 둘 중 어느 하나로 접속해도 같은 설정이 적용된다. 항목을 여러개 만들 필요 없다. 공백으로 구분하면 다 같이 적용된다. 예를 들면 다음과 같다.

Host nas.dasomoli.org 112.145.250.152 192.168.0.204
    HostName nas.dasomoli.org
    User dasomoli
    Port 2048
    IdentityFile ~/.ssh/id_rsa_dasomoli_nas

[AWS] ALB 설정 백업

AWS CLI를 이용해서 ALB 관련 설정을 백업하고 삭제하자.

Config

aws elbv2 describe-load-balancers [--region <Region>] --load-balancer-arns <ALB ARN>

Listener

aws elbv2 describe-listeners [--region <Region>] --load-balancer-arn <ALB ARN>

Listener Rules

위의 Listner를 얻은 정보에서 각 Lisner 별로 각각 실행한다.

aws elbv2 describe-rules [--region <Region>] --listener-arn <Listener ARN>

나중에 필요하면 위의 정보로 다시 ALB를 추가한다.

[Ubuntu] hostname 변경

hostname 또는 cat /etc/hostname 을 입력하면 기존 호스트네임을 볼 수 있다. 새로 셋팅하고 싶다면 다음과 같이 한다.

sudo hostnamectl set-hostname my-new-hostname

그리고 빼먹기 쉬운 게 /etc/hosts 이다.

sudo vi /etc/hosts
127.0.0.1    localhost
127.0.1.1    my-old-hostname  # 기존 호스트네임

이전 호스트 네임 부분을 새 호스트 네임으로 바꿔준다.

127.0.0.1    localhost
127.0.1.1    my-new-hostname

이제 reboot 해주자.

sudo reboot

[ethers.js] Transaction Data로 호출 당시의 argument 디코딩

Transaction의 data로 호출 당시의 argument를 디코딩해서 확인해보자.

Transaction 내용은 다음과 같이 얻는다.

const tx = ethers.provider.getTransaction("0x4e1b7e05a1a19a37a619dcd79be64669653e960db97eadc451b3999acedd7a4b")

얻은 tx.data 가 트랜잭션이 실행될 때의 data이다. 이 데이터를 ABI로부터 디코딩한다.

const abi = [
  "function dasomFunction(uint32 id, uint32 size, address[] users, uint256[] amounts)"
];
const iface = new ethers.utils.Interface(abi);
const decoded = iface.decodeFunctionData("dasomFunction", tx.data);

console.log("Decoded Data:", decoded);

getContractAt 과 같이 Contract를 얻어서 다음과 같이 디코딩할 수도 있다.

const dasomContract = await ethers.getContractAt("DasomContract", "0x21a34c702BfE8d06544e557FCc06965A86365933");
const decoded = dasomContract.interface.decodeFunctionData("dasomFunction", tx.data);

랜덤 암호를 생성하는 여러가지 방법

1. OpenSSL을 이용한 랜덤 암호 생성

openssl rand -base64 16
  • 16바이트 길이의 랜덤 데이터를 Base64로 인코딩하여 출력함.
  • 특수 문자 없이 알파벳과 숫자로 구성됨.

2. pwgen 패키지 사용 (설치 필요)

brew install pwgen  # 먼저 설치
pwgen -s 16 1
  • -s 옵션은 강력한 암호를 생성함.
  • 16은 길이, 1은 개수.

3. LC_ALL=C tr을 이용한 무작위 문자열 생성

LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^&*()-_+=' < /dev/urandom | head -c 16
  • /dev/urandom에서 무작위 데이터를 가져와 원하는 문자만 필터링함.
  • head -c 16으로 16글자만 출력.

4. uuidgen을 활용한 암호 생성

uuidgen | tr -d '-' | head -c 16
  • uuidgen으로 UUID 생성 후 하이픈을 제거하고 앞에서 16자만 출력함.

[Database] auto_increment 포함 Table 초기화

MySQL 예시

MySQL에서 데이터를 삭제하고 AUTO_INCREMENT 값을 초기화하려면 아래와 같이 실행합니다:

-- 테이블의 모든 데이터를 삭제
TRUNCATE TABLE table_name;

설명:

  • TRUNCATE TABLE은 테이블의 모든 데이터를 삭제하고, 자동 증가 값을 초기화합니다.
  • 데이터만 삭제하고 싶다면 DELETE FROM table_name;을 사용할 수 있지만, 이 경우 AUTO_INCREMENT 값은 초기화되지 않습니다.

PostgreSQL 예시

PostgreSQL에서는 데이터를 삭제하고, 시퀀스를 초기화해야 합니다:

-- 테이블의 모든 데이터를 삭제
TRUNCATE TABLE table_name RESTART IDENTITY;

설명:

  • TRUNCATE TABLE … RESTART IDENTITY를 사용하면 테이블 데이터를 삭제하고 자동 증가 시퀀스 값도 초기화됩니다.

MongoDB 예시

MongoDB에서는 자동 증가 ID를 기본적으로 지원하지 않지만, 데이터를 삭제하려면 아래 명령을 사용할 수 있습니다:

// 모든 문서 삭제
db.collection_name.deleteMany({});

참고:

  • MongoDB에서 ID는 ObjectId로 자동 생성되며, 별도의 AUTO_INCREMENT 값은 없습니다.
  • 직접 구현한 자동 증가 필드가 있다면 해당 값을 수동으로 초기화해야 합니다.

[hardhat] 기본 계정

https://hardhat.org/hardhat-network/docs/reference#initial-state 에서 찾을 수 있다. 다음 address 들이다

  • 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
  • 0x70997970C51812dc3A010C7d01b50e0d17dc79C8
  • 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
  • 0x90F79bf6EB2c4f870365E785982E1f101E93b906
  • 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65
  • 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc
  • 0x976EA74026E726554dB657fA54763abd0C3a0aa9
  • 0x14dC79964da2C08b23698B3D3cc7Ca32193d9955
  • 0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f
  • 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
  • 0xBcd4042DE499D14e55001CcbB24a551F3b954096
  • 0x71bE63f3384f5fb98995898A86B02Fb2426c5788
  • 0xFABB0ac9d68B0B445fB7357272Ff202C5651694a
  • 0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec
  • 0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097
  • 0xcd3B766CCDd6AE721141F452C550Ca635964ce71
  • 0x2546BcD3c84621e976D8185a91A922aE77ECEc30
  • 0xbDA5747bFD65F08deb54cb465eB87D40e51B197E
  • 0xdD2FD4581271e230360230F9337D5c0430Bf44C0
  • 0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199

사용하지 않도록 한다.

[MacOS] 파인더에서 숨김 파일 보기

파인더에서 다음 단축키를 누른다.
Command (⌘) + Shift (⇧) + . (마침표)

영구적으로 적용하고 싶다면 다음을 실행한다.

defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder

다시 되돌리고 싶다면 다음을 실행한다.

defaults write com.apple.finder AppleShowAllFiles -bool false
killall Finder

[Ethereum] 우분투에 node 설치

execution layer client로 geth를, consensus layer client로 Prysm을 사용한다.

geth 설치

sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt update
sudo apt install -y geth

확인

geth version

부팅 시 자동 실행

sudo vi /etc/systemd/system/geth.service

[Unit]
Description=Ethereum Geth Node
After=network.target

[Service]
Type=simple
User=dasomoli
ExecStart=/usr/bin/geth --mainnet --syncmode "snap" --datadir "/home/dasomoli/geth/data" --http --http.api web3,eth,txpool --http.addr 0.0.0.0
Restart=always
RestartSec=5
LimitNOFILE=8192

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start geth
sudo systemctl enable geth
sudo systemctl status geth

위에서는 “snap” 방식을 사용했다. sync mode로 “full”도 가능.

도메인을 연결한다면 설정에 다음 설정을 포함해야 한다.

	--http.corsdomain "*" \
	--http.vhosts "*"

IPC로 geth console 연결

geth attach ipc:/home/dasomoli/geth/data/geth.ipc

로그 확인

journalctl -u geth -f

Prysm 설치

mkdir prysm
cd prysm/
sudo apt update
sudo apt install -y wget
wget <https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh>
chmod +x prysm.sh

부팅 시 자동 실행

sudo vi /etc/systemd/system/prysm-beacon.service

[Unit]
Description=Prysm Beacon Chain Client
After=network.target

[Service]
Type=simple
User=dasomoli
ExecStart=/home/dasomoli/prysm/prysm.sh beacon-chain \
    --execution-endpoint=http://localhost:8551 \
    --datadir=/home/dasomoli/prysm/data \
    --jwt-secret=/home/dasomoli/geth/data/geth/jwtsecret \
    --accept-terms-of-use \
    --mainnet \
    --checkpoint-sync-url=https://beaconstate.info --genesis-beacon-api-url=https://beaconstate.info
Restart=always
RestartSec=5
LimitNOFILE=8192

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start prysm-beacon
sudo systemctl enable prysm-beacon
sudo systemctl status prysm-beacon

로그 확인

journalctl -u prysm-beacon -f

[Ubuntu] 자동 업데이트 설정

Unattended Upgrade 설치

sudo apt update
sudo apt install unattended-upgrades

자동 업데이트 활성화

sudo dpkg-reconfigure --priority=low unattended-upgrades

설정 파일 편집: sudo vi /etc/apt/apt.conf.d/50unattended-upgrades

Unattended-Upgrade::Allowed-Origins {
    "Ubuntu stable";
    "Ubuntu ${distro_codename}-security";
    "Ubuntu ${distro_codename}-updates";
};

업데이트 주기 설정: sudo vi /etc/apt/apt.conf.d/20auto-upgrades

다음은 패키지 목록 업데이트 간격(1 = 매일), 자동 업데이트 실행 간격 (1 = 매일)

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

로그는 다음에서 확인 가능

less /var/log/unattended-upgrades/unattended-upgrades.log

자동 재부팅 설정: sudo vi /etc/apt/apt.conf.d/50unattended-upgrades

다음은 새벽 2시에 자동 리부팅.

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";