'알아둘일'에 해당하는 글 219건

지난번 네이버 스팸은 어떻게 사용자의 계정정보를 탈취하는지 설명했었다. https://blog.1day1.org/714

 

여전히 네이버 스팸은 교묘하구나.

네이버 메일을 보다가 눈에 띄는 메시지가 보인다.캡쳐는 PC 에서 했는데, 모바일에서는 보낸사람에 "금융위원회" 까지만 보인다. 그렇다 보니 아차하면 클릭하게 된다.클릭하면 이렇게 나온다.

blog.1day1.org

정부기관 메일로 오면 자칫하다가는 함정에 걸리게 된다. 무심코 암호 입력하면 바로 털리게 된다.

지난번 스팸이후 1달정도 지났는데, 또 메일이 왔다.

핸드폰에서 확인하면 더 눈치채기가 어려울 수 있다.

"확인하러 가기" 버튼은 가급적 누르지 않는것이 좋다.
보통 무작위로 이런 메일을 뿌리는데(없는 계정도 보내게 된다) ,
"확인하러 가기" 클릭하면 오! 이 계정은 사용하는 계정이구나! 라고 알려주는 것이 된다.

 

# 어떻게 조심할 수 있나?

메일 서비스의 보낸이의 주소를 확인하는 것이 좋다.

주소를 보면, 행정안전부는 확실히 아닌것 같다.
더욱 교묘한 스패머는 물론 저 주소도 그럴듯한 주소로 보냈을 텐데, 이 스패머는 초짜인듯 싶다.

암튼, 이 방법으로 체크할 수 있다.

 

테스트를 위해 "확인하러가기" 버튼을 클릭해봤다.

예전에는 네이버 로그인 하는 창이 떴었는데, 뭔가 다른 메지시가 나온다.

왠지 호스팅하는 곳에서 블락을 한 것 같기도 하다.(신고가 들어가서 그럴 수도 )
운이 좋으면 위와 같이 호스팅업체에서 거를 수도 있겠지만, 조심하지 않으면 아래처럼
무의식 중에 암호넣고 로그인해서 계정이 탈취가 될 수 있으니 항상 주의해야 한다.

네이버 메일로 오고 네이버 계정 탈취를 위한 이슈이니, 네이버 측에서 필터링 조치를 할 수도 있을 듯 한데
네이버쪽에서 얼마나 신경을 쓰고 있을지는 모르겠다.(어차피 메일은 돈도 안되니 무심할지도...)

그러고보니, 몇년전 조금더 교묘했던 스팸메일도 있었다. https://blog.1day1.org/639

 

네이버 피싱메일 조심하세요.

오늘 이런 메일이 왔다. 공식적인 네이버 메일인 줄 알았다. 그래서, 메일 내용대로 스팸을 보냈다면, 메일 계정(암호)이 털렸나 생각했다. 암호 바꿔야지 생각하던차 자세히 보니 이상했다. 일

blog.1day1.org

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

nestJS 공부를 하면서, 디비는 postgres 를 사용하고 있다. https://blog.1day1.org/720

 

coolify - Github App 을 사용해서, git push 하면 자동 배포하자

지난글에 nestJS 앱을 dockerfile 을 사용해서 배포하는 방법을 정리했다. https://blog.1day1.org/719 coolify 를 사용해서 nestJS + postgres 앱을 배포해보자coolify 를 써보다 보니 재밌다.처음이라 좀 헤맨 부분

blog.1day1.org

 

한동안은 postgres 를 사용할 듯 하다.

관련 필요한 명령등을 정리해본다.

일단 설치부터.

# https://www.postgresql.org/download/macosx/

 

PostgreSQL: macOS packages

macOS packages You can get macOS PostgreSQL packages from several sources. Interactive installer by EDB Download the installer certified by EDB for all supported PostgreSQL versions. Note! This installer is hosted by EDB and not on the PostgreSQL community

www.postgresql.org

해당 부분에서 다운로드 해서 설치 - 설치는 무난하니 패스.
(혹시 기존 brew install postgresql 이 있었는데, 혼동될까봐 brew 패키지는 삭제했다.)

 

# .bash_profile / .zshrc 명령 path 등록.

# postgresql 16
export PATH="/Library/PostgreSQL/16/bin:$PATH"

 

# 맥OS 터미널에서 관리하는 주요 명령들

디비 서버 상태 보기

# sudo -u postgres pg_ctl -D /Library/PostgreSQL/16/data/ status

pg_ctl: server is running (PID: 83175)
/Library/PostgreSQL/16/bin/postgres "-D" "/Library/PostgreSQL/16/data"

디비 서버 중지 / 실행

$ sudo -u postgres pg_ctl -D /Library/PostgreSQL/16/data/ stop

waiting for server to shut down.... done
server stopped

$ sudo -u postgres pg_ctl -D /Library/PostgreSQL/16/data/ start

waiting for server to start....
2024-09-08 23:43:17.987 KST [83267] LOG:  redirecting log output to logging collector process
2024-09-08 23:43:17.987 KST [83267] HINT:  Future log output will appear in directory "log".
 done
server started

 

반응형

그외 주요 명령들

데이터 입력 / 테이블 관리 등등.

... 계속 정리...

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지난글에 nestJS 앱을 dockerfile 을 사용해서 배포하는 방법을 정리했다. https://blog.1day1.org/719

 

coolify 를 사용해서 nestJS + postgres 앱을 배포해보자

coolify 를 써보다 보니 재밌다.처음이라 좀 헤맨 부분이 있지만 ... 익숙해지면 정말 편해질 것 같다세팅하려는 대략적인 흐름도는 아래와 같다 # Docker - nestJS 부분projects 메뉴에서 새프로젝트를

blog.1day1.org

그런데, dockerfile 내에서 git clone 으로 소스를 가져와서 하는 방법이다보니, github webhook 를 처리하기 어려운 부분이 있다.

그래서 coolify 에서 github app 을 세팅해서 사용하는 방법을 사용하기로 한다.

# coolify 프로젝트 ( + New Resource )

with GitHub App 으로 선택한다.

처음에는 +Add GitHub App 으로 앱등록을 해준다.(해당 방법은 아래에 따로 설명)

등록된 앱을 선택하고, Load Repository 를 하고, Build Pack 을 Dockerfile 으로 선택하고 다음으로 넘어간다.

기존에 봤던 설정화면 - 본인에 맞는 입력사항을 입력하고 Save

이전 글의 Dockerfile 이 차이가 있는데,
그 부분은 아래 깃허브 앱 등록 부분을 정리 후에 마지막에 설명한다.

 

반응형

# GitHub App 등록

Create a new Application 에서 +Add GitHub App 를 클릭하거나,
Coolify 좌측메뉴의 Sources 메뉴를 들어간다.(+Add)

적당한 이름을 입력하고, Continue ..

Webhook Endpoint 부분에 github 쪽에서 접근가능한 URL 을 선택하고, Regiser Now

깃허브로 이동한다. ( 앱을 생성하는 절차 )

다시 coolify 로 이동해서, Install Repositories on GitHub  를 클릭한다.(세부 정보 입력으로 이동)

그러면 다시 깃허브로 이동해서 세부적인 설정을 하게 된다.

본인 깃허브 계정의 전체 저장소 또는 프로젝트를 선택할 수 있다. (Install 으로 Github App 을 생성한다.)

다시 coolify 로 이동하면, 설정된 앱을 확인할 수 있다.(아래에서 따로 추가 설정할 것은 없고, 완료 화면)

해당 App 등록이 완료되면,  초기에 Create a new Application 부분에 해당 앱이 나오게 된다(선택하여 다음 진행)

 

# Dockerfile 설정.(깃허브 프로젝트 소스내에 포함)

예전 글(https://blog.1day1.org/719)에는 Dockerfile 내에 git clone 으로 소스 다운로드하는 형태였는데,
Github App 연동 방식은 저장소를 연결해서 소스에 접근할 수 있어, 다운로드 단계를 제거 한다.

# 빌드 스테이지
FROM node:22 AS builder

# 작업 디렉토리 설정
WORKDIR /usr/src/app

# pnpm 설치
RUN npm install -g pnpm

# 모든 소스 파일 복사
COPY . .

# 의존성 설치
RUN pnpm install

# 앱 빌드
RUN pnpm run build


# 프로덕션 스테이지
FROM node:22-slim

# 작업 디렉토리 설정
WORKDIR /app

# pnpm 설치
RUN npm install -g pnpm

# 빌드 스테이지에서 필요한 파일들만 복사
COPY --from=builder /usr/src/app/package*.json ./
COPY --from=builder /usr/src/app/pnpm-lock.yaml ./
COPY --from=builder /usr/src/app/dist ./dist

# 프로덕션 의존성만 설치
RUN pnpm install --prod


# 프로덕션 모드로 실행
CMD ["pnpm", "run", "start:prod"]

# 포트 설정 (NestJS 기본 포트는 3000)
EXPOSE 3000

도커의 이미지 빌드시 두단계를 거치도록 분리했다. (multi-stage 빌드 라고 하는 듯 하다.)

빌드 단계 + 프로덕션 단계.  코드가 복잡하지는 않아 쭈욱 한번 보면 파악이 될 것이다.

 

깃허브 webhook 설정해서 git push 하면 자동으로 배포하게 되도록 설정한다.
일단 여기까지... webhoook 설정은 다음에...

Github App 방식으로 하니, 따로 webhook 설정 안해도 되네. 패스... 끝.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

coolify 를 써보다 보니 재밌다.

처음이라 좀 헤맨 부분이 있지만 ... 익숙해지면 정말 편해질 것 같다

세팅하려는 대략적인 흐름도는 아래와 같다

 

# Docker - nestJS 부분

projects 메뉴에서 새프로젝트를 만들어 준다.

적당한 이름을 입력하고, continue ( New Resource )

여러 방법이 있지만, Dockerfile 방법으로 하도록 한다.

중간 부분의 git clone 본인의 프로젝트소스를 가져오도록 한다.

# 베이스 이미지로 Node.js 사용
FROM node:22

# 작업 디렉토리 설정
WORKDIR /usr/src/app

# git clone
RUN apt-get update && apt-get install -y git

RUN git clone https://github.com/your-account/nestjs-practice-netflix .

# pnpm 설치
RUN npm install -g pnpm

# 의존성 설치
RUN pnpm install

# 앱 빌드
RUN pnpm run build

# 프로덕션 모드로 실행
CMD ["pnpm", "run", "start:prod"]

# 포트 설정 (NestJS 기본 포트는 3000)
EXPOSE 3000

프로젝트에 접속할 주소를 적절하게 적어준다.

저장(Save) 한 후 deploy 하면 도커이미지를 만들어주고, 앱이 실행된다.

반응형

# 디비 postgres 부분

내가 테스트 한 프로젝트는 postgres 를 사용하기에 DB도 세팅해준다.

프로젝트에서 ( New Resource ) 로

PostgreSQL 을 선택해준다.

PostgreSQL 16 을 선택해줬다.

세팅에 암호를 정해준다.

중간 부분의 Postgres URL (internal) 으로 접속할 것이니, 해당 값을 nestjs 에서 사용할 것이다.
DB 를 Start 해준다.

 

그리고, 다시 nestJS 설정으로 와서.

위 처럼 설정값을 적어준다.
(DB_HOST 부분의 값이 - Postgres URL (internal) 에 있던 주소)

프로젝트에 따라 저 환경변수 값이 다를 수 있으니, 본인의 프로젝트에 맞게 수정해준다.

프로젝트를 Deploy 한다. 이미 프로젝트를 Deploy 했다면, Restart 해주면 입력한 설정값이 적용된다.

이제 프로젝트가 동작하는지 확인해본다. (정상적으로 응답된다)

 

아마도 다음 단계는 프로젝트 수정하고 git push 하면
자동으로 coolify 에서 자동 빌드 + 재배포 하는 프로세스를 만들어 봐야 겠다.

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지난글에 설치를 해봤다. https://blog.1day1.org/717

 

coolify + n8n 으로 자동화해보자 - 설치편 (feat. vultr)

최근 재미있는 것을 봐서 시도해보려고 한다.coolify 는 vercel / netlify 비슷한 서비스를 만들어주는 오픈소스라고 보면 된다. - 서비스로도 사용할 수 있지만, 셀프 호스팅으로 설치해보려 한다. -

blog.1day1.org

설치는 비교적 큰 이슈 없이 완료했다.

이제 본격적인 n8n 사용을 해보려고 하는데.

처음부터 장벽을 만났다. 흔한 예제인 youtube transcript 를 해보려는데.

에러를 만나 버렸다.

[YoutubeTranscript] 🚨 Transcript is disabled on this video ....

 

당장 에러 붙들고 있을 여유는 없어, 다음 기회에 다시 봐야 겠다.

대신 Coolify 를 사용한 자동 배포 쪽을 더 파봐야 겠다.
(현재 nestJS 공부중인데, 관련 배포를 사용해보려 한다 - docker 배포)

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

최근 재미있는 것을 봐서 시도해보려고 한다.

coolify 는 vercel / netlify 비슷한 서비스를 만들어주는 오픈소스라고 보면 된다.
 - 서비스로도 사용할 수 있지만, 셀프 호스팅으로 설치해보려 한다.
 - https://coolify.io/self-hosted

n8n 은 자동화(노코드 툴?)에서 자주 언급되는 make / zapier 같은 서비스를 만들어 주는 오픈소스
 - 역시 이것도 셀프 호스팅으로 https://docs.n8n.io/hosting/

일단 목표는 n8n 으로 블로그 자동포스팅에 적용해보고자 한다.
이 블로그에 글을 올릴지, 별도의 다른 블로그로 할지는 모르겠다.

설치 자체는 가이드 따라서 하면 그리 어렵지는 않아 보이지만,
어느 정도 사양이면 제대로 사용할 수 있을지 실제로 돌려봐야 겠다.(coolify 는 최소 2G / 2 CPUs 정도면 된다고 하지만...)

vultr 에 설치해서 돌려봐야 겠다.
뜬금 광고 시간.(아래 링크로 최초 가입하시면 300$의 크레딧 -30일내사용- 을 받아서 사용해 볼 수 있습니다.)

30일동안 사용해보고 괜찮으면 연장해서 사용하면 좋을 듯 하다.

 

coolify + n8n 의 설치까지는 별 무리는 없어 보이지만, n8n 실제 사용은 또 다른 영역(노코드툴)이니 좀 헤맬지도 모르겠다.

#이제 본격적인 설치시간

월 비용은 대략 22달러 정도 될 듯 하다.

OS를 뭘로 할까? 기본 ubuntu 를 할까, Docker(on ubuntu) 로 할까 등등 살펴 보다보니, 어!

기본 설치되어 있는 이미지가 있네요.(유명해서 그런지. 이미 있군.)

살짝 고민, 설치부터 해볼까. 그냥 설치된 거 쓸까...
고민좀 해보고 다시 찾아오겠습니다.


[추가]

다시 돌아왔다, 그냥 설치된 버전으로 해보기로 했다.

vultr 관련 선택하고 Deploy 한 후 기다리면, 접속할 수 있다.

1. 기본 {서버IP}:8000 로 접속하면 된다.
2. 처음 접속하면 관리계정 등록을 하면 된다.
3. 그러면 coolify 관리화면으로 접속된다.

그냥 아이피로 접속해서 해도 되지만, 뭔가 세련되지 않은 듯 하다.

도메인을 연결해본다.

본인이 가지고 있는 도메인을 연결하면 된다.

SSL 인증서는 어디서 세팅하나 했는데, 자동으로 세팅해주는 듯 하다. (letsencrypt 를 사용한다)

Save 하고 설정한 도메인으로 재접속해서 사용하면 된다.

.

.

이제 n8n 을 설치해보자.

Projects 의 메뉴에서 +Add 로 적당한 이름을 적어준다.(다음 다음 넘어가면 된다)

production 클릭

+Add New Resource 클릭

이제 본격적인 패키지 선택

git 소스를 가져올 수도 있고 / Dockerfile 등 도커이미지를 사용할 수도 있고 / 데이터베이스를 설치할 수도 있다.

아래 부분에 Services 에서 검색한다. N8N 을 선택한다.( 그외 여러가지 유명한 서비스들이 있다)
최근 관심중인 supabase 도 보인다(이것도 해볼 예정)

n8n 을 선택한 후 다음 처럼 세팅한다.(도메인 세팅만 하면 된다)

적당한 서비스 이름 너히고, 도메인 넣고, Deploy 해준다 (좀 시간이 걸린 후 )
deploy 가 완료되면 다음처럼 바뀐다.

메뉴의 Links 에 설정한 도메인을 클릭해서 들어간다.

짠! (여기도 처음 접속시 관리계정 설정 하고 들어가면 된다)


[참고]

처음 에 다음 세팅을 How big is your company? 를 20 이하로 하면, 아래 설정창이 계속 나온다.
(뭔가 버그인 듯 하다. 아래처럼 20-99 로 해줬다)

 

이제 본격적인 n8n - 노코드 자동화를 설정해봐야 겠다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

certbot 을 주기적으로 renew 한 후 , 인증서가 갱신되면 post_hook 으로
새로운 SSL 인증서 .pem 을 Spring Project 의 .pfx 로 변환하고, 스프링 프로젝트를 재실행 해주는 코드가 필요하다.

지난글의 https://blog.1day1.org/712 에서 언급한 pem => pfx 변환 코드를 좀더 개선했다.

 

스프링 프로젝트에 letsencrypt 인증서를 사용해보자 ( feat. pfx / PCKS12)

지난글에 이어 https://blog.1day1.org/711 스프링 프로젝트에 .pem 인증서를 사용해보자. letsencrypt 를 좀더 활용해보자. (feat. post_hook)letsencrypt 를 잘 사용하고 있는데, 주로 개발용으로 사용했다.간단한

blog.1day1.org

개선한 코드는 letsencrypt의 pem 인증서의 날짜와 변환한 pfx 날짜를 비교해서 변환할지 체크하는 코드를 추가했다.

# cat lets-pem2pfx.sh 
#!/bin/bash

if [ "$2" == "" ]; then
	echo "Usage) $0 {domain} {out-dir/out-file.pfx} {convert-now}";
	exit;
fi

out_dir=$PWD
domain=$1
out_file=$2
convert=$3

password=124345

######
lets_dir=/etc/letsencrypt/live

if [ "$convert" == "convert-now" ]; then
	echo 
else
	certbot certificates --cert-name $domain
fi
ls -al $lets_dir

cd $lets_dir/$domain

# file mtime check.
echo 
echo -n "Origin: "
echo `date +%s%N --reference cert.pem`
echo " "`date  --reference cert.pem`
echo 
echo -n "Target: "
echo `date +%s%N --reference $out_dir/$out_file`
echo " "`date  --reference $out_dir/$out_file`
echo 
if [ "cert.pem" -nt "$out_dir/$out_file" ]; then
	printf '%s\n' "cert.pem is newer than $out_dir/$out_file : need to update new"
else
	printf '%s\n' "cert.pem is older than $out_dir/$out_file"
	echo "No action";
	echo
	exit 122 # fail code ( 0~256 )
fi


if [ "$convert" == "convert-now" ]; then
	openssl pkcs12 -export \
	 -out $out_dir/$out_file \
	 -inkey privkey.pem -in cert.pem -certfile chain.pem \
	 -passin pass:$password -passout pass:$password
	echo "Convert Done";
	ls -al $out_dir/$out_file;
fi

exit 200;
# end file

위 코드를 기반으로 renew 시에 post_hook 에서 처리할 스크립트는 다음과 같다.

# cat renewal-ssl-restart.sh 
#!/bin/bash

readlink=$(readlink -f $0)
dirpath=$(dirname $readlink)


echo 
echo `date`
echo $dirpath;
cd $dirpath;

# convert pem 2 pfx - renewal pem
bash lets-pem2pfx.sh your-domain.com ssl/your-domain.com.pfx convert-now
retCode=$?

if [ "$retCode" == "200" ]; then
	echo "convert-done - do action"

	# restart - tomcat
	echo "Shutdown..."
	shutdown.sh
	sleep 5

	echo "Start up..."
	startup.sh
fi

letsencrypt 의 인증서가 갱신이 되면 post_hook 으로 해당 코드를 실행하여,
pem => pfx 변환 / 스프링프로젝트 재실행 해준다. 위 프로젝트 재실행 코드는 본인에 맞게 수정하여 쓴다.

해당 코드를 콘솔에서 실행까지 테스트 한 후에 /etc/letsencrypt/renewal/yourdomain.conf 의 post_hook 에 넣어준다.

# Options used in the renewal process
[renewalparams]
authenticator = nginx
installer = nginx
account = af93d65834vadv37436bddsfh092ad2a
manual_public_ip_logging_ok = None
#pre_hook = systemctl stop nginx
post_hook = systemctl restart nginx ; bash /root/bin/renewal-ssl-restart.sh >> /var/log/nginx/renewal_ssl_restart-$(date +\%Y-\%m-\%d).log
server = https://acme-v02.api.letsencrypt.org/directory

다음 명령으로 테스트 해본다.

certbot renew --cert-name your-domain.com --dry-run

테스트 명령 후에 혹시 이런 에러가 보일 수 있다.

renewal-ssl-restart.sh >> /var/log/nginx/renewal_ssl_restart-$(date +\%Y-\%m-\%d).log
Error output from post-hook command systemctl:
Another instance of Certbot is already running.

해당 bash 코드에 certbot 확인하는 코드가 있었는데, 해당 코드를 post_hook 에서 실행되지 않게 고쳐줬다.(아래 부분이 고친 코드)

if [ "$convert" == "convert-now" ]; then
	echo 
else
	certbot certificates --cert-name $domain
fi

위 코드는 인증서 확인용 코드인데, 없어도 무방하니 해당 부분 지워도 된다.

테스트 까지 완료했다면, 이제 기다리면 된다.

 

내가 쓰고 있는 인증서는 30일정도 후에 업데이트 될 듯 하다(잘 되길...)

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

처음 DB를 접한것은 학생이던 시절(?) 오라클이었던가
어떤 서버에 접속해서 알수 없는 명령을 내려서 테이블 만들고
테이블에 데이터 입력하고, 삭제하고 .. (CRUD)

그 후 본격적(현업?)으로 써보기 시작한 것은 MySQL 이었던것 같다.
스타트업에 있었던 터라 본의(?) 아니게 그랬던것인지, 오픈소스라는 매력, 오라클에 대한 반감 등 여러요소가 있었던 것 같다.

그러다가 MySQL 이 오라클로 넘어가는 사건이 발생한다.
그 후로는 MariaDB 를 사용하게 되었다.
그 사이 서비스에 사용하는 MySQL 을 PgSQL 에 호환되도록 코드를 리팩토링해서 어! 잘 작동하네 정도로 postgre 를 써본 경험정도

그래서 postgres 에 대한 역사는 드문드문 아는정도
(역사 요약은 여기서 https://news.hada.io/topic?id=10344 )

 

Postgres는 언제부터 멋있어졌을까 | GeekNews

VC 펀딩도, DevRel 팀도 없이 25년간 천천히 진화함Ingres(UC 버클리, 1970~1985) —> Postgres95 —> PostgreSQLPostgres = "Post Ingres"첫 언어는 SQL도 아닌 QUEL 이었음. SQL 지원은 Postgres95가 출시된 1995년에 추가됨1996

news.hada.io

읽다보면, 드문드문 아! 그랬었지 라는 기억이 난다.

...

언제부터인가 MongoDB 를 필두로 NoSQL 이 유행하던 때 도 있었다.

사실 요즘은 어떤게 핫한지 잘 모른다. 이미 핫했지만, 이제서야 알게 된 것일지도 모르겠다.
아! 요즘 언어로는 힙한 postgres 인가!

DB 관련에는 어떤것들이 있나! https://news.hada.io/topic?id=16365 에서 살펴볼수 있다.

 

그냥 Postgres 쓰세요 | GeekNews

대부분의 웹 애플리케이션은 지속적인 데이터 저장이 필요하므로, 새로운 애플리케이션을 만들 때 기본적으로 Postgres를 선택하는 것이 좋음왜 sqlite가 아닌가?sqlite는 좋은 DB지만, 데이터가 하나

news.hada.io

사실 한가지에 익숙하다보면, 모든 것을 그 하나로 처리하고 싶은 욕구가 본능인듯 싶다.
나도 MySQL 을 NoSQL 처럼 사용하려 json 타입으로 만들어 사용하기도 한다.

왜! 지금 postgres 에 관심을 갖는지는 사실 supabase 라는 서비스에 있다. https://supabase.com/
요즘 구글 Firebase 대항마(?)로 뜨고 있는 서비스이다.(나온지 얼마되지 않은 듯 한데...)

 

Supabase | The Open Source Firebase Alternative

Build production-grade applications with a Postgres database, Authentication, instant APIs, Realtime, Functions, Storage and Vector embeddings. Start for free.

supabase.com

이 supabase 가 postgres 기반이라고 한다.
서비스지만, 오픈소스 기반이라 종속되지 않고, 서비스를 이용하다가, 본인서버로 마이그레이션 할수도 있는 듯 하다
물론 그정도로 서비스가 커져야 겠지만.

앱을 만들면서 supabase 를 쓰게 될 듯 하다.
돌아돌아 다시 만나게 된 postgres

이번에는 오래 쓰게 될지, 또 다시 찍먹하고 MySQL 으로 돌아갈지, 같이 쓸지는 모르겠다.

기억에 남기기 위해 포스팅 해본다.

postgres 로 할 수 있는 것들 - https://news.hada.io/topic?id=13231

 

PostgreSQL로 충분하다 | GeekNews

PostgreSQL을 각 분야에 사용하는 방법에 대한 링크를 정리한 페이지백그라운드잡, 메시지 큐, GIS, Audit Log, 접근 제어, 권한 관리, 검색, 시계열, 그래프 데이터, 외부 데이터, HTTP, API, 이벤트/복제/CD

news.hada.io

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지난글에 이어 https://blog.1day1.org/711 스프링 프로젝트에 .pem 인증서를 사용해보자.

 

letsencrypt 를 좀더 활용해보자. (feat. post_hook)

letsencrypt 를 잘 사용하고 있는데, 주로 개발용으로 사용했다.간단한 사용법은 https://blog.1day1.org/657 에서 확인. letsencrypt 초간단 설치 in ubuntu , nginx (feat. certbot)https 를 사용하는 것은 옵션이 아니

blog.1day1.org

서버에 일반 랜딩페이지용은 nginx 로 사용하고, api 용 서버는 스프링 프로젝트로 구축되어 있다.

스프링프로젝트는 아래 형태로 세팅되어 있다. ( application-prd.properties )

server.contextPath=/myproject
server.address=0.0.0.0
server.port=8443
server.ssl.key-store=/myproject/ssl/myproject.com.pfx
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=1234567

해당 프로젝트는 내가 구축한 것은 아니고, 수년전 구축된 것을 인수받아 관리하고 있다.
그래서 해당 방식이 최신 방식은 아닐 수 있다. (잘은 모르지만, jks / pkcs12 방식이 주로 쓰이는 듯 하다)
요즘은 application.yaml 파일이 주로 쓰이나?

아무튼 이제 해야할 부분은 letsencrypt 인증서를 스프링에서 쓸수 있는 방식으로 변환하고자 한다.

# cat lets-pem2pfx.sh 
#!/bin/bash

if [ "$2" == "" ]; then
	echo "Usage) $0 {domain} {out-file.pfx}";
	exit;
fi

out_dir=$PWD
domain=$1
out_file=$2
password=123456

cd /etc/letsencrypt/live/$domain

openssl pkcs12 -export \
 -out $out_dir/$out_file \
 -inkey privkey.pem -in cert.pem -certfile chain.pem \
 -passin pass:$password -passout pass:$password

위와 같은 스크립트로 변환해줬다.
처음에는 암호없이 했는데, 스프링프로젝트가 안되서, 다시 암호를 넣고 했다.(원래 정책상 안되는지, 빠뜨린게 있는지는 ??)

다음 단계는 3개월(90일)마다 갱신을 해줘야 하니, 자동화가 필요하겠지.

1) certbot renew
2) convert pem to pfx
3) restart spring project

위 단계로 자동으로 갱신 / 재시작 하는 코드를 만들어야 겠다.(다음에 계속... )

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

letsencrypt 를 잘 사용하고 있는데, 주로 개발용으로 사용했다.

간단한 사용법은 https://blog.1day1.org/657 에서 확인.

 

letsencrypt 초간단 설치 in ubuntu , nginx (feat. certbot)

https 를 사용하는 것은 옵션이 아니라 이젠 필수요소인듯 하다. 명령은 2줄이면 될려나? apt install certbot python3-certbot-nginx certbot --nginx -d {도메인} -d {여러개일때 도메인 추가} 나중에 도메인을 추가

blog.1day1.org

좀더 프로덕션에 사용해 볼까 하는 생각에 좀더 자동화를 해보려고 알아보고 있다.

# cat /etc/letsencrypt/renewal/yoursite.com.conf 
# renew_before_expiry = 30 days
version = 1.11.0
archive_dir = /etc/letsencrypt/archive/yoursite.com
cert = /etc/letsencrypt/live/yoursite.com/cert.pem
privkey = /etc/letsencrypt/live/yoursite.com/privkey.pem
chain = /etc/letsencrypt/live/yoursite.com/chain.pem
fullchain = /etc/letsencrypt/live/yoursite.com/fullchain.pem

# Options used in the renewal process
[renewalparams]
authenticator = nginx
installer = nginx
account = ef9ksjdkfjskd3sdf5sdf3s23gf12g452t4g232ad2a
manual_public_ip_logging_ok = None
pre_hook = systemctl stop nginx
post_hook = systemctl start nginx
server = https://acme-v02.api.letsencrypt.org/directory

3개월(90일) 후에 재인증(?)을 해줘야 한다.
위 설정에서 pre_hook / post_hook 부분에서
systemctl start nginx 로 하면 nginx 가 정상으로 실행되지 않는 현상이 있다.

실행 체크는 certbot renew --dry-run 으로 해보면 된다.(아래와 비슷한 에러)

2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:443 failed (98: Address already in use)
2024/08/04 01:40:02 [notice] 22375#22375: try again to bind() after 500ms
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:443 failed (98: Address already in use)
2024/08/04 01:40:02 [notice] 22375#22375: try again to bind() after 500ms
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:443 failed (98: Address already in use)

보통 저런 에러는 nginx 가 실행중이라 start 를 해서 이미 80/443 포트를 사용중이라는 에러
(원인의 예상은 renew 체크시 web 접속이 필요해서 nginx 가 실행중이어야 하는 듯 싶다.)
letsencrypt 인증서버에서 .well-known 서버접속해서 확인하는 듯 하다.

13.214.188.135 - - [04/Aug/2024:01:44:32 +0900] "GET /.well-known/acme-challenge/G_jAk7TzDtYa5B9RRH2-tBY5jvvOkxqsz8ZLEgnV5_8 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
18.226.4.132 - - [04/Aug/2024:01:44:32 +0900] "GET /.well-known/acme-challenge/G_jAk7TzDtYa5B9RRH2-tBY5jvvOkxqsz8ZLEgnV5_8 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
16.16.94.36 - - [04/Aug/2024:01:44:33 +0900] "GET /.well-known/acme-challenge/G_jAk7TzDtYa5B9RRH2-tBY5jvvOkxqsz8ZLEgnV5_8 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
16.16.94.36 - - [04/Aug/2024:01:44:33 +0900] "GET /.well-known/acme-challenge/II0XkQ6LIjFkl_jGey5q98RyZd231HG5Xs6amebSOjM HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
18.226.4.132 - - [04/Aug/2024:01:44:42 +0900] "GET /.well-known/acme-challenge/II0XkQ6LIjFkl_jGey5q98RyZd231HG5Xs6amebSOjM HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
54.191.171.212 - - [04/Aug/2024:01:44:42 +0900] "GET /.well-known/acme-challenge/II0XkQ6LIjFkl_jGey5q98RyZd231HG5Xs6amebSOjM HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"

에러가 발생해서 다음처럼 수정하였다. (nginx 중지 안해도 되니 pre_hook 은 주석처리 )

#pre_hook = systemctl stop nginx
post_hook = systemctl restart nginx

일단 dry-run 으로 해보니 정상적이었다.(실제 90일 후에 어떨지 살펴봐야겠지)

 

다음 활용은 letsencrypt 인증서 (.pem) 를 spring boot  의 ( .pfx ) 파일로 변환해서 사용해봐야겠다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

현재 개발중인 플러터 앱의 기능에 이상현상(안드로이드쪽)이 있어서, 비교할 겸 리액트 네이티브로도 비슷하게 구성하고자 한다.
(아마도 메인은 플러터 , RN 은 보조 혹은 학습 단계가 될 듯 하다.)

리액트 네이티브 세팅 후에 차이점(혹은 추가점) 을 정리한다.

기본 리액트 네이티브 설치 등은 SKIP

리액트 네이티브 - 프로젝트 내에서 실행.

# npx @react-native-community/cli doctor

Common
 ✓ Node.js - Required to execute JavaScript code
 ✓ npm - Required to install NPM dependencies
 ✓ Watchman - Used for watching changes in the filesystem when in development mode
 ● Metro - Metro Bundler is not running

Android
 ✓ Adb - Required to verify if the android device is attached correctly
 ✓ JDK - Required to compile Java code
 ✓ Android Studio - Required for building and installing your app on Android
 ✓ ANDROID_HOME - Environment variable that points to your Android SDK installation
 ✓ Gradlew - Build tool required for Android builds
 ✓ Android SDK - Required for building and installing your app on Android

iOS
 ✓ Xcode - Required for building and installing your app on iOS
 ✓ Ruby - Required for installing iOS dependencies
 ✓ CocoaPods - Required for installing iOS dependencies
 ● ios-deploy - Required for installing your app on a physical device with the CLI
 ✓ .xcode.env - File to customize Xcode environment

Errors:   0
Warnings: 2

Usage
 › Press f to try to fix issues.
 › Press e to try to fix errors.
 › Press w to try to fix warnings.
 › Press Enter to exit.

처음에는 watchman / adb / ANDROID_HOME 등이 에러 표시가 났다.

watchman 등은 새로 설치.
ANDROID_HOME 은 /Library/Android/sdk 의 패스를 넣어주면 된다.(bash / zsh 등)

metro 도 해결책을 찾아보자.
이건 npx react-native start 로 하면 해결 되는 듯 하다.

ios-deploy 쪽은 당장 iOS 쪽은 만들지 않을 듯 해서 당분간 패스

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

개발은 오래(?)했지만, 앱은 실질적으로 1년도 안된 듯 하다.

그렇다 보니, 앱 출시도 여러가지 시행착오를 겪고 있다.

이번에 지인분 앱을 만들어 주면서, 내 개인(테스트)앱도 만들어 보고 있다.

그런데, 개발자계정 만든지 얼마 안되서 이런 장벽도 있다. (프로덕션 출시를 위해서는 비공개 테스트를 해야 한다.)
지인분 계정은 오래전에 만들어서 그런지, 이번에 신규앱 출시할 때 위와 같은 단계는 없다.

관련 안내를 보니 작년에 관련 정책이 생겼나 보다. (개발자 계정이라도 미리 만들어 둘걸...)

기존 계정은 바로 프로덕션 신청(심사요청)을 할 수 있었는데, 신규계정은 비공개테스트 단계를 거쳐야 하나보다.
(아마도 개발자 검증? 을 위한 조치겠지 - 한번 검증을 거치면 다음에는 안해도 되겠지? 매번 앱 출시 마다 해야하지는 않겠지...)

 

그나저나 테스트 앱 - 버전 올리면서 올리고 있는데.

몇몇 플러터 패키지를 등록하고 올리다 보니 - 보기에는 무시무시한 - 경고 메시지가 보인다.
해당 패키지가 권한 추가 또는 최소OS버전 등으로 인해 설치 가능 기기가 줄어든 듯 싶다.
뭐! 어쩔 수 없는 것이겠지.(그래도 뭔가 씁슬하다-손해보는 듯한?)

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터 앱 - 안드로이드 쪽 자동배포를 해봤는데, 이번에는 iOS 쪽도 해본다.

testFlight 로 업로드 하는 코드.

# IPA 파일 생성
flutter build ipa --release --export-options-plist=ios/exportOptions.plist

# TestFlight에 업로드 
xcrun altool --upload-app --type ios \
 --file build/ios/ipa/*.ipa \
 --username "{your-apple-develper-id}" \
 --password "{your-app-password}" \
 --primary-bundle-id "{your-app-bundle-id}"

코드 자체는 심플하다. 관련 인증 부분이 좀 어려울 수 있다.

일단 앱 암호는 https://appleid.apple.com/account/manage 애플 계정쪽에서 설정한다.

그외 다른 인증 방식으로 몇가지 시도해봤는데, 유일하게 위 방법만 동작하였다.
( --apiKey --apiIssuer 방법 , --upload-package 방법 , xcrun notarytool 방법 => 모두 실패 )
위 다른 방식들이 좀더 안전(?)한 방법인 듯 해서 시도해봤었는데, 실패.

 

다음 부분에서도 좀 헤맸다.

# cat ios/exportOptions.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>destination</key>
    <string>export</string>
    <key>method</key>
    <string>app-store</string>
    <key>teamID</key>
    <string>{your-developer-team-ID}</string>
    <key>teamName</key>
    <string>{your-developer-team-Name}</string>
    <key>provisioningProfiles</key>
    <dict>
        <key>{your-app-bundle-id}</key>
        <string>{your-project-provisioning-profile}</string>
    </dict>
    <key>signingCertificate</key>
    <string>Apple Distribution</string>
    <key>signingStyle</key>
    <string>manual</string>
    <key>stripSwiftSymbols</key>
    <true/>
    <key>uploadBitcode</key>
    <false/>
    <key>uploadSymbols</key>
    <true/>
</dict>
</plist>

위 입력사항 중 2개 teamName / bundle id 는 금방 찾았고 , 그외 2가지 항목을 찾아야 한다.

teamID / provisioning profile 은 어디?

open ios/Runner.xcworkspace 
# 플러터 프로젝트를 Xcode 를 열어본다.

Runner 쪽을 보면 Signing 부분에 있다. ( 지금 살펴보니, 모든 항목이 다 여기에 있다. )

내 경우는 계정소유자가 아니라 (앱 관리자? )권한으로 참여하는 것이라 Signing Certificate 쪽 설정하는데 고생을 좀 했다.

위 설정까지 문제없이 했다면, 맨 위 코드로 빌드 => 배포 가 정상적으로 될 것이다.

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터 앱을 만들었고, 이제 플레이 콘솔에서 수동으로 해보니 별다른 문제없이 배포되었다.
내부테스트 까지 해봤고, 조금 정리후에는 실제 플레이 스토어에 출시 할 수 있을 듯 하다.

그전에 수동 업로드 과정을 자동화 하고자 한다.

관련 API 를 제공하는 듯 하다.

Google Play Android Developer API  가 세팅되어 있어야 한다.
관련 부분은 필요하면 따로 정리.

CI/CD 로 주로 fastlane 과 연동하는 방법을 많이 쓰는 것 같다.

난 좀 단순화(?) 시켜서 반자동 으로 처리하고자 한다.
업로드 부분은 python 코드로 다음과 같다.

위와 같은 코드를 사용했다.

본인 프로젝트에 맞는 config.json 의 내용을 수정하고, python 환경에서 실행하면 된다.

flutter build appbundle 으로 aab 파일을 생성한 후에 업로드

프로젝트 폴더에서 실행

python3 play-release.py 'feature: auto relase code'

 

python 환경이 구성되어 있지 않다면.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install python

pip3 install google-auth google-auth-httplib2 google-api-python-client

python  venv 를 구성하는 방법도 좋은 팁이다.(이 부분도 추후 필요시 정리)

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터로 앱을 만들고 있다.

광고연동을 하고 있는데, 애드몹은 무난하게 넘어갔다.

다음에는 앱로빈(Applovin) 을 연동중에 있는데, 안드로이드 쪽도 좀 힘든 부분이 있었지만, 해결은 하였다.

그런데, iOS 쪽을 연동하는 중에 이상한 부분이 있어서 기록을 남긴다.

[현상]

플러터 코드를 동일하게 하고, 앱로빈쪽의 Ad Unit 을 iOS 용으로 만들고 구동해보니
다른 광고는 정상인데, native 만 나오지 않는다.( banner , mrec , Interstitial 등은 잘 나온다)

[조치1]

AppLovinMAX.setVerboseLogging(true);

AppLovinMAX.initialize 초기화 시에 옵션 추가

해당 설정을 추가하면 자세한 로그를 볼 수 있다. 그런데, android 에서는 잘 나오는데, ios 쪽에서는 나오지 않는다.

[조치2]

AppLovinMAX.showMediationDebugger();

다른 디버거 옵션을 넣어본다. 광고 동작등을 체크해볼 수 있다.
여기서는 native 광고도 잘 나온다. 뭔가 설정의 문제일 듯 하다. 범위가 좁혀졌다.

혹시나 해서.

위치 ios/Runner.xcodeproj/project.pbxproj

....
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
    "$(inherited)",
    "@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.userAppName;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
....

해당 bundle id 를 ad unit 과 맞춰준다.

PRODUCT_BUNDLE_IDENTIFIER = com.example.userAppName;

AppLovin 의 광고 유닛 - 동일하게 맞춰준다.

테스트 용이라 임의로 입력했었다.(안드로이드에서 정상동작해서 신경쓰지 않았었다.)

디버거에도 해당 View Ad Units 부분에 나온다(기존에는 나오지 않았다. 0 )

 

저렇게 bundle id 를 동일하게 맞춰주니 정상동작 한다.

[해결]

android 는 모두 상관없고, iOS 는 native 만 체크하는 듯 하다.

정식 앱이면, 자연스럽게 bundle id 가 맞게 입력했을텐데, 테스트용으로 임의로 넣다보니 그런 현상이 발생했다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

윈도우의 데이터를 우분투에서 가져와서 처리하는 시스템이 있다.

윈도우 공유를 우분투에서 smb 마운트 하여 사용중이다.(ubuntu 22.04 )

그런데, 며칠(수일~수십일)이 지난 후 우분투가 다운 되는 현상이 발생하였다.

커널 메시지에 다음과 같은 부분이 있다.

kernel: [242843.663373] general protection fault, probably for non-canonical address 0xdead000000000108: 0000 [#1] PREEMPT SMP NOPTI
kernel: [242843.663381] CPU: 4 PID: 1689344 Comm: kworker/4:1 Tainted: G           OE      6.5.0-35-generic #35~22.04.1-Ubuntu
kernel: [242843.663385] Hardware name: ASUS System Product Name/PRIME B760M-A, BIOS 1002 04/03/2023
kernel: [242843.663387] Workqueue: cifsiod smb2_cached_lease_break [cifs]
kernel: [242843.663452] RIP: 0010:smb2_close_cached_fid+0x2a/0xd0 [cifs]


 kernel: [254783.343885] CPU: 2 PID: 1619082 Comm: kworker/2:2 Tainted: G      D    OEL     6.5.0-26-generic #26~22.04.1-Ubuntu
 kernel: [254783.343888] Hardware name: ASUS System Product Name/PRIME B760M-A, BIOS 1002 04/03/2023
 kernel: [254783.343890] Workqueue: cifsiod smb2_reconnect_server [cifs]
 kernel: [254783.343948] RIP: 0010:native_queued_spin_lock_slowpath+0x273/0x300
주요 메시지

Workqueue: cifsiod smb2_cached_lease_break [cifs]
smb2_close_cached_fid

cifsiod smb2_reconnect_server [cifs]

native_queued_spin_lock_slowpath

혹시 부품이상인가 싶어 여러가지 시도를 해봐도 동일(비슷)한 다운 현상이 발생하였다.

사실 그동안 위 메시지를 그냥 넘겼었다.
비슷한 구성의 다른 시스템에서는 나타나지 않은 현상이라, smb 쪽 이슈일까 싶은 생각조차 들지 않았던 것 같다.

이제야 눈에 띄었지만, 실제로 원인인지는 몇가지 설정을 해보면서 찾아봐야 겠다.

smb 의 캐시관련 이슈를 기준으로 찾아봐야 겠다.
캐시가 full 이 되어 중지되는 그런 것일까? 네트웍 접속 지연등의 문제일까?

1차 시도 : 일단 마운트시의 기본값이 cache=strict 인데, cacha=none 으로 해보고 상황을 지켜볼 참이다.

/etc/fstab 예시

//windows/share  /data/  cifs uid=user,gid=user,username=guest,password=,iocharset=utf8,cache=none  0  2

위가 안된다면 2차시도는

echo "0" > /proc/fs/cifs/LookupCacheEnable

3차 시도는 smb 버전 변경 ( 3.0 / 2.0 / 1.0 다른 버전 시도)

현재
vers=3.1.1

시도
vers=1.0

...

잘 해결 되길...

=======

[추가]

1차 시도를 해봤다. 그런데, 전송속도가 캐시가 없으니 너무 떨어진다. (거의 1/5 수준으로)
거의 사용이 어려운 수준.

그러면 2차 시도도 마찬가지로 쓰기 어려울 듯 . 바로 3차 시도로 넘어가야 할 듯 하다.

[추가2]

3차 시도 는 이런 에러?(경고)가.( 상위버전 3.0 / 2.0 부터 시도해볼까?)

CIFS: VFS: Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers
반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터로 개발중인데, 안드로이드 스튜디오 jellyfish 로 업그레이드 하면서 몇몇 문제를 해결하고 사용중이다.
뭔가 자잘한 오류 메시지들이 보인다.

이번에는 SDK 매니저 에서 에뮬레이터를 추가하면서 발생한 듯 싶다.

INFO    | Storing crashdata in: /tmp/android-{user-name}/emu-crash-34.2.14.db, detection is enabled for process: 56249

다음 명령 flutter emulators  으로 동일한 메시지를 확인 할 수 있다.

추가했던 에뮬중에 이상이 생긴 듯 하다.

새버전과 호환성 문제일까?

종료하려는데 이런 메시지가?

좀더 살펴보다가, 재부팅 신공(?)을 시도해봐야 겠다.

---

[추가 - 재부팅 신공?]

실패

---

[추가 - 재설치]

아래 주요 디렉토리를 삭제 후에 재설치

  위치 사용자 디렉토리 cd ~/
  
  rm -r .android/
  rm -r Library/Android/
  rm -r Library/Caches/Google/AndroidStudio*
  rm -r Library/Caches/AndroidStudio3.6/
  rm -r Library/Preferences/AndroidStudio3.6/
  rm Library/Preferences/com.android.Emulator.plist 
  rm Library/Preferences/com.google.android.studio.plist

실패

다음에는 하위 버전으로 다시 시도해봐야 겠다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터 를 안드로이드 로 개발중인데 - 새버전이 나와서 업그레이드 하였다.

에러가 생길 것은 예상은 했다. 빌드해보니.

Launching lib/main.dart on sdk gphone64 arm64 in debug mode...
Running Gradle task 'assembleDebug'...

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDebug'.
> A problem occurred starting process 'command '/..../flutter/bin/flutter''

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s
Error: Gradle task assembleDebug failed with exit code 1
Error executing devicectl: ProcessException: Process exited abnormally with exit code 3:

User cancelled
  Command: /usr/bin/arch -arm64e xcrun devicectl list devices --timeout 5 --json-output /var/folders/d7/4qd968hd0kzc21y8jggx2qcr0000gn/T/flutter_tools.w7hJCy/core_devices.D5JYTk/core_device_list.json
Error executing devicectl: ProcessException: Process exited abnormally with exit code 3:

User cancelled
  Command: /usr/bin/arch -arm64e xcrun devicectl list devices --timeout 5 --json-output /var/folders/d7/4qd968hd0kzc21y8jggx2qcr0000gn/T/flutter_tools.w7hJCy/core_devices.AHDMpc/core_device_list.json

다음과 같은 에러가 발생하였다.

flutter doctor 해봐도 특별한 이상은 안 보였다.

 


iOS 쪽을 시도 해봤다.

# xcodebuild -downloadPlatform iOS

Downloading iOS 17.5 Simulator (21F79): 83.1% (6.09 GB of 7.34 GB)2024-05-27 00:10:48.511 xcodebuild[38139:36929395]  DVTDownloadable: Download Failed. Downloadable: https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg. Error Domain=NSPOSIXErrorDomain Code=28 "No space left on device" UserInfo={NSErrorFailingURLStringKey=https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg, NSErrorFailingURLKey=https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDownloadTask <D677E7D4-290F-4ABB-AE5D-98AAF40F70BC>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDownloadTask <D677E7D4-290F-4ABB-AE5D-98AAF40F70BC>.<1>}
Downloading iOS 17.5 Simulator (21F79): Error: Error Domain=NSPOSIXErrorDomain Code=28 "No space left on device" UserInfo={NSErrorFailingURLStringKey=https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg, NSErrorFailingURLKey=https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDownloadTask <D677E7D4-290F-4ABB-AE5D-98AAF40F70BC>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDownloadTask <D677E7D4-290F-4ABB-AE5D-98AAF40F70BC>.<1>}

여기도 에러.

하드 공간이 없다.  오랜만에 봤더니, 6기가 정도 밖에 안 남았네. ㅜㅜ

용량이 부족하다. 조금 정리하고 다시 시도..

Registering simulator runtime with CoreSimulator failed.
Domain: DVTDownloadableErrorDomain
Code: 29
User Info: {
    DVTErrorCreationDateKey = "2024-05-26 15:36:28 +0000";
}
--
Registering simulator runtime with CoreSimulator failed.
Domain: DVTDownloadableErrorDomain
Code: 29
--
Cannot copy the image because the disk is almost full
Domain: com.apple.CoreSimulator.simdiskimaged.SimDiskImageError
Code: 14
--


System Information

macOS Version 14.4.1 (Build 23E224)
Xcode 15.4 (22622) (Build 15F31d)
Timestamp: 2024-05-27T00:36:28+09:00

더 줄여야 겠다.

하드 좀 정리하고, 다시 해보니 정상 다운로드 되었다.
그리고, 안드로이드 스튜디오에서 다시 빌드 해보니 정상 동작 했다.

이제 안드로이드 쪽 빌드를 해결해보자.(즉, iOS 쪽은 정상)

android / gradle 빌드 쪽 이슈로 좁혀졌다.


[다시 시도]

flutter upgrade --force 로 플러터 SDK 를 업그레이드 해봤다.

* What went wrong:
Execution failed for task ':gradle:compileGroovy'.
> Failed to run Gradle Worker Daemon
   > A problem occurred starting process 'Gradle Worker Daemon 1'

에러가 나지만, 메시지가 달라졌다.

android/ 에서 gradle 을 콘솔에서 명령을 내려봤다.

# ./gradlew app:installDebug

FAILURE: Build failed with an exception.

* Where:
Build file '.../android/app/build.gradle' line: 2


What went wrong:
An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.
      Your current JDK is located in /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home/jre
      You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 24s
4 actionable tasks: 2 executed, 2 up-to-date

다른 프로젝트에서 1.8 오래된 버전이 필요해서 바꿨었는데, 그것이 영향을 준것 같다.
근데, 안드로이드 스튜디오 젤리피시 버전업 하기까지는 이상이 없었는데..??

android/gradle.properties
파일에 JAVA_HOME 패스를 넣었다.(.bash_profile 등에 넣어도 된다.)

org.gradle.java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-16.jdk/Contents/Home/

 

다시 빌드...

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':connectivity_plus:compileDebugJavaWithJavac'.
> error: invalid source release: 17

 

이거 점점 미궁으로 가는거 아닌가? ㅜㅜ

java 버전 17 으로 맞춰준다.

# brew install openjdk@17

sudo ln -s  /opt/homebrew/Cellar/openjdk\@17/17.0.11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk

gradle.properties 나 IDE 세팅등에 버전을 맞춘다.

org.gradle.java.home=/Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home/

 

일단 여기까지 해보니, 정상 빌드 된다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

ubuntu 16.04  터미널에서 로그파일등에서 주요 키워드를 볼때 색상을 표시하고자 한다.

watch --color -n 10 \
 'bash your-program-run.sh |  \
GREP_COLOR="01;33" grep --color=always -i -e "Warnning.*" -e "^" | \
GREP_COLOR="01;35" grep --color=always -i -e "Fail.*" -e "^" | \
GREP_COLOR="01;31" grep --color=always -i -e "Alert.*" -e "^"  \
 '

프로그램 실행 명령이 출력으로 나올 때 grep 으로 색상을 표시한다. ( --color=always )
GREP_COLOR 로 키워드 별로 색상을 다르게 줄 수 있다.
(색상코드는 여기 참조 : https://chrisyeh96.github.io/2020/03/28/terminal-colors.html )

또한 -e ".*Keyword.*" 처럼 하면 해당 키워드가 나온 모든 줄이 되고, -e "Keyword" 를 하면 해당 키워드만 색상표시된다.

그런데, 문제는 watch 를 조합하면 색상 표시가 안된다.(우분투 16.04)

동일 명령을 ubuntu 22.04 에서는 정상으로 나온다.

터미널에서 색상코드(ansi code) 표시를 제대로 처리 못하는 것 같다.

ㄴ정상인 경우 코드
비정상 처리된 코드

우분투 16.04 의 watch 버전은 3.3.10 버전 ( 22.04 는 3.3.17 버전이다)

 

# 해결 방안

방법1. 정상동작 하는 터미널에서 원격으로 접속 명령을 내린다.

watch --color -n 10 'ssh {your-username}@{your-server} {원래 명령}'

위 처럼 해서 watch 가 색상코드를 정상적으로 처리하도록 한다.

 

방법2. watch 버전을 해결된 버전으로 소스 컴파일 한다.

위 방법이 뭔가 찜찜하다면, 소스를 직접 컴파일한다.

소스 : https://gitlab.com/procps-ng/procps/-/releases/v3.3.13

해당 릴리즈의 Changelog 를 보니

watch: Support ANSI 39,49 reset sequences              issue #73

가 해당 버그인 듯 싶다.

암튼 소스를 받고 컴파일 한다.

wget https://gitlab.com/procps-ng/procps/-/archive/v3.3.13/procps-v3.3.13.tar.gz

tar xvzf procps-v3.3.13.tar.gz
cd procps-v3.3.13/

sudo apt install autoconf libtool autopoint libtool-bin ncurses-dev

./autogen.sh
./configure
make

설치는 make install 으로 하면 /usr/local/bin 으로 설치가 될 것이다.

그런데, 이 경우 watch 만 필요하니 $HOME/bin 디렉토리에 복사해서 사용했다.

정상적으로 색상이 나오는 것을 확인했다.

 

방법3. 상위버전 deb 패키지에서 watch 파일을 추출한다.

위 방법2 로 소스컴파일 하니, 문제는 한글이 watch 를 거치면서 사라져 버린다. ㅜㅜ

상위 deb 패키지에서 추출하기로 한다.(현버전 16.04 => 18.04 의 패키지)

상위버전 패키지 - https://launchpad.net/ubuntu/+source/procps/2:3.3.12-3ubuntu1.2/+build/17397008

procps_3.3.12-3ubuntu1.2_amd64.deb (219.4 KiB)

하단의 deb 파일을 다운로드

패키지를 설치하면 다른 이상이 있을 수 있으니, watch 실행파일만 추출한다.
(참조 : https://www.cyberciti.biz/faq/how-to-extract-a-deb-file-without-opening-it-on-debian-or-ubuntu-linux/ )

ar x procps_3.3.12-3ubuntu1.2_amd64.deb

tar xvJf data.tar.xz

cp usr/bin/watch $HOME/bin

이제 한글도 제대로 나온다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

오래된 서비스가 돌아가는 머신이 있다.

ubuntu 10.04 버전이니 14년이 넘어가는 머신 - 리얼서버 => 가상서버 로 몇번 옮겨지기도 했다.

새버전으로 바꾸기에는 레거시 코드가 있어서 그냥 돌리고 있다.

리얼 => 가상 서버로 옮겨지면서, 가상머신 내부는 최소의 용량으로 두고, 데이터는 외부로 두고 nfs 로 마운트해서 사용하고 있다.

재부팅할 때 - 아래 부분에서 딜레이가 발생한다.

원인을 찾아보다가, 보아하니 nfs 마운트한 위치를 bind 로 재마운트 한 부분에서 딜레이가 발생하는 것 같다.

# apache logs
/data8/apache2                /var/log/apache2   bind    bind,rw,defaults  0  2

/data8 이 nfs 로 마운트 된 위치 , 그것을 mount bind 로 했다.

재부팅 reboot / 종료 halt 시에 딜레이가 발생한다. ( 이 부분이 ubuntu 상위 버전에서는 일어나지 않는 듯 하다)
10.04 버전에서 이상현상.(다른 모든 버전을 체크하지는 못 함 - 비슷한 환경을 구성한 14.04 은 정상 )

종료프로세스인 /etc/rc6.d 부분이

umount 코드들이 실행되지만, mount bind 는 제대로 언마운트를 못하는 듯 하다.

그래서

S22umount-work-nfs -> ../init.d/umount-work-nfs*

위 파일을 만들어 줬다.

# cat /etc/init.d/umount-work-nfs 
#! /bin/sh
### BEGIN INIT INFO
# Provides:          unmount work nfs
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:      6
# Short-Description: Umount nfs work dir before reboot.
# Description:
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
	# Message should end with a newline since kFreeBSD may
	# print more stuff (see #323749)
	log_action_msg "Will umount all nfs work dir - before restart"
	umount /var/log/apache2 
}

case "$1" in
  start)
	# No-op
	;;
  restart|reload|force-reload)
	echo "Error: argument '$1' not supported" >&2
	exit 3
	;;
  stop)
	do_stop
	;;
  *)
	echo "Usage: $0 start|stop" >&2
	exit 3
	;;
esac

do_stop 부분에 bind mount 한 위치를 umount 해준다.

10.04 버전을 아직도 쓰실 분이 얼마나 있겠냐마는 ㅜㅜ

난 여러버전을 쓰고 있구나. 10.04 / 14.04 / 18.04 .. 최근 22.04 도 ,  곧 나올 24.04 도 쓰겠군.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지금까지의 삽질(?)은 콘솔 환경에서 개발을 편하게 할 수 있게 세팅하기 위함이다.
Language Server Protocol (LSP) 가 최종 목적이 될 듯 하다.

mac os 와 byobu 를 사용하니, 몇몇 단축키가 충돌되거나 한다.
CTRL + 화살표(Left / Right) 등

1. 일단 터미널에서 단어간의 이동이 안된다. 다른 조합으로 바꾼다. (터미널 쪽에서 설정이 필요 - alacritty)

위치 .config/alacritty/alacritty.toml

bindings = [
  { key = "Right", mods = "Alt", chars = "\u001BF" },
  { key = "Left",  mods = "Alt", chars = "\u001BB" },
  { key = "F",  mods = "Control|Shift", action = "ToggleFullscreen" }, # full screen
 ]

CTRL 을 Alt (mac Opt 키) 조합으로 바꾼다.
Ctrl + Shift + F 로 전체화면 변경도 추가했다.

 

2. byobu 에서 Alt + Left/Right 는 윈도우 간의 전환인데, 위 터미널 설정이 우선하는 것 같다.

대신 동일 기능으로 CMD + Left / Right 로 전환 가능하다.

byobu ( tmux ) 의 단축키를 F1~F12 등을 사용하기도 하는데.

난 CTRL+a 의 조합을 사용하기 좋아한다.(Mac 에서는 Fxx 키를 입력하기 불편하다. fn 키를 같이 입력해야함)
tmux 는 ctrl+b 를 사용하나보다. byobu 쪽은 ctrl+a 를 사용한다.

CTRL+a 는 prefix 또는 Leader 키라고 한다.

CTRL+a 입력 후 조합단어. 대소문자 구분 ( 동일 키 )

+ c : 새윈도우 열기 ( F2 동일 )
+ n : 다음 윈도우 ( CMD + Right )
+ p : 이전 윈도우 ( CMD + Left )
+ ctrl-a : 바로 이전 윈도우

+ , : 윈도우 이름 변경 ( F8 )

+ d : detach  ( F6 )

+ % : 창 수직 분리 pane 
+ | : 창 수평 분리

pane 간 이동 ( Shift + Up/Down/Left/Right )

pane 간 사이즈조절 ( Shift + Opt + Up/Down/Left/Right )

 

3. byobu 에서 pane 을 나눈 후 마우스 스크롤을 pane 단위로 하도록 설정

# cat .config/byobu/.tmux.conf
set -g mouse on

위 항목 추가.

위 설정을 하니, pane 단위 스크롤이 되기는 한데, 복사하기 위해 마우스 드래그가 이상해 진다.
그냥 Alt + F12 로 위 옵션을 on / off 할 수 있으니, 이 방법이 나을 듯 하다.

CTRL+a + : (: 콜론, not ; 세미콜론)
으로 명령 모드로 들어간 후
set -g mouse on
set -g mouse off

직접 명령을 실행해도 된다.

 

4. 방향키 ( Arrow Key ) 를 다른 조합으로 바꾼다.

키보드의 방향키를 쓰기 불편해서 다른 키조합으로 바꾸고 싶다.(키캡을 교체하면 좀 나을려나?)
- 기존 텐키리스 쓰다가, 텐키 로 바꿨는데, 방향키가 적응이 안되네(유독 방향키가 구분이 안되는 키보드이긴 하지만)

alacritty + zsh + byobu(tmux) 조합에서 방향키를 다른 키로 바꾼다. ( alt + h j k l 으로 변경 )
alacritty 는 시도해봤는데, 안되거나 어렵다. 키코드값 chars 를 알아내기가 어렵다. 포기...

그래서 zshrc 에서 세팅하기로 한다. ( alt 가 ^] 라고 하는데, 맥이라 그런지 안되고 아래처럼 해야 된다.)

# cat .zshrc

bindkey "˙" backward-char
bindkey  "∆" down-line-or-history
bindkey  "˚" up-line-or-history
bindkey  "¬" forward-char

이렇게 바꾸니 좀 나아졌다. (키보드를 바꾸는게 상책이려나?)

- 그냥 다시 텐키리스 키보드로 바꿈.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

mac os 의 기본 shell 은 bash 로 되어 있는 것 같다.
chsh -s /bin/zsh 로 바꾸라는 안내도 나오지만, 그냥 쓰기로 했다.

다만, neovim 을 쓰기 위해 alacritty 를 쓰면서 zsh 를 써보기로 했다. (https://blog.1day1.org/693)
alacritty 가 따로 탭기능은 없어서, byobu 를 쓰기로 했다.

brew install byobu 로 설치

실행하니 기본쉘인 bash 로 실행이 된다. byobu 쓸때도 zsh 를 쓰고자 한다.

# cat .config/byobu/.tmux.conf
set -g default-shell /bin/zsh
set -g default-command /bin/zsh

위 파일명이 비어 있는데, 위 두줄을 넣어준다.

정상으로 zsh 가 기본으로 실행된다.

간만에 byobu 를 쓰려니 단축키가 잘 생각이 안난다.
자주 쓰던 키를 정리해둬야 겠다.

Shift-F1 을 누르면 단축키가 나온다. ( 아래와 같은데, 난 좀 다르게 사용한다. 그 부분을 따로 정리.)

  F1                             * Used by X11 *
    Shift-F1                     Display this help
  F2                             Create a new window
    Shift-F2                     Create a horizontal split
    Ctrl-F2                      Create a vertical split
    Ctrl-Shift-F2                Create a new session
  F3/F4                          Move focus among windows
    Alt-Left/Right               Move focus among windows
    Alt-Up/Down                  Move focus among sessions
    Shift-Left/Right/Up/Down     Move focus among splits
    Shift-F3/F4                  Move focus among splits
    Ctrl-F3/F4                   Move a split
    Ctrl-Shift-F3/F4             Move a window
    Shift-Alt-Left/Right/Up/Down Resize a split
  F5                             Reload profile, refresh status
    Alt-F5                       Toggle UTF-8 support, refresh status
    Shift-F5                     Toggle through status lines
    Ctrl-F5                      Reconnect ssh/gpg/dbus sockets
    Ctrl-Shift-F5                Change status bar's color randomly
  F6                             Detach session and then logout
    Shift-F6                     Detach session and do not logout
    Alt-F6                       Detach all clients but yourself
    Ctrl-F6                      Kill split in focus
  F7                             Enter scrollback history
    Alt-PageUp/PageDown          Enter and move through scrollback
    Shift-F7                     Save history to $BYOBU_RUN_DIR/printscreen
  F8                             Rename the current window
    Ctrl-F8                      Rename the current session
    Shift-F8                     Toggle through split arrangements
    Alt-Shift-F8                 Restore a split-pane layout
    Ctrl-Shift-F8                Save the current split-pane layout
  F9                             Launch byobu-config window
    Ctrl-F9                      Enter command and run in all windows
    Shift-F9                     Enter command and run in all splits
    Alt-F9                       Toggle sending keyboard input to all splits
  F10                            * Used by X11 *
  F11                            * Used by X11 *
    Alt-F11                      Expand split to a full window
    Shift-F11                    Zoom into a split, zoom out of a split
    Ctrl-F11                     Join window into a vertical split
  F12                            Escape sequence
    Shift-F12                    Toggle on/off Byobu's keybindings
    Alt-F12                      Toggle on/off Byobu's mouse support
    Ctrl-Shift-F12               Mondrian squares
반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

neovim 을 세팅하고 사용해보려고 한다.
지난번 초기 세팅후 맥OS 기본 터미널에서 색상이 이상해져서 다른 터미널을 찾고 있다.(https://blog.1day1.org/690)
혹시나 해서 다른 theme (gruvbox) 를 시도해봐도 정상으로 나오지는 않았다.(조금 나아졌지만 ...)

가능한 맥OS 기본세팅으로 가려고 했지만 어려울 듯 하다.
그래서 다른 터미널을 찾기를 시도.

여러가지가 있지만, 그중에 alacritty 가 눈에 들어왔다.

설치는 여기를 참조 : https://github.com/alacritty/alacritty

설치 / 실행하면 너무나 심플해서 당황스러울 것이다.(기본 설정 하는 메뉴도 없다)

기본 설정 하기 : ~/.config/alacritty/alacritty.toml 파일에 설정을 해준다.
설정 항목은 https://alacritty.org/config-alacritty.html 을 참조한다.

예전에는 설정파일이 yml 방식이었는데, 최근 toml 방식으로 바뀐것 같다.
설정 예시 검색시 toml 방식을 사용하면 된다.

내가 조정한 몇가지 설정을 정리하면 다음과 같다.


[window]

dimensions = { columns = 500, lines = 100 }  # Default: columns = 0, lines = 0

opacity = 0.8  # Default: 1.0

#startup_mode = "Maximized"  # Default: "Windowed"


[font]

# Font size in points
size = 12  # Default: 11.25

위 정도만 해도 봐 줄만 한 것 같다.

추가로 alacritty 를 써보면서 기본 쉘도 zsh 로 해보고 있다.(oh my zsh 던가?)
아직은 내 취향에 맞는 설정이 확정되지 않아. 추후 필요시 정리.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

neovim 을 세팅해보고 있다.
설정 참고는 https://github.com/cpow/neovim-for-newbs/blob/main/init.lua

세팅해보는데, 맥OS 기본 터미널에서는 이렇게 나온다.

컬러 세팅(colorscheme) 이 안 먹는 것 같다.

VScode 의 내장 터미널? 에서는 잘 되는 것 같다.

 

검색해보면, 맥OS 기본 터미널에서는 안되고 다른 터미널을 써라가 답인 듯 한데.
일단 좀더 찾아보고 안되면 다른 터미널로...

 

[추가]

위처럼 처음부터 환경을 만드는 방법도 있고.

어느정도 세팅된 것을 설치해서 사용할 수도 있다.
예로는 LazyVim / LunarVim / AstroNvim / NVChad  등이 있다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

우분투 <=> 윈도우 의 경우는 심볼릭링크가 크게 상관없을 듯 하다.

그런데, 우분투 <=> 우분투 의 경우 samba 마운트 시에 symlink 유지여부가 SMB 버전마다 차이가 있는 듯 하다.

결론부터 이야기 하면 vers=1.0 으로 해야 유지가 되는 듯 하다.

//ubox-serv/data  /data/   cifs uid=ccex,gid=ccex,username=guest,password=,iocharset=utf8,vers=1.0  0  2
#//ubox-serv/data  /data/   cifs uid=ccex,gid=ccex,username=guest,password=,iocharset=utf8,noserverino 0  2

fstab 에 설정에서 위처럼 vers=1.0 으로 하는 경우만 symlink 유지됨.

SMB버전은 올리고, noserverinfo 등의 옵션은 안되는 듯 하다.

 

다른 해결 방법이 있을지는 추후 필요하면 정리.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

세부적인 부분은 링크로 대신

1. ssh 키 생성 : https://docs.github.com/ko/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

 

새 SSH 키 생성 및 ssh-agent에 추가 - GitHub Docs

SSH(Secure Shell Protocol)를 사용하여 GitHub.com의 리포지토리에서 데이터에 액세스하고 쓸 수 있습니다. SSH를 통해 연결할 때 로컬 머신에서 프라이빗 키 파일을 사용하여 인증합니다. 자세한 내용은 "

docs.github.com

2. 깃허브에 키 등록 : https://github.com/settings/keys

키등록까지 한 후에 ssh 계정 설정으로 여러계정의 깃허브에 연결할 수 있다.
(예시> 개인계정 / 회사계정 등)

위 계정의 ssh 키는 달라야 한다. 동일하면, 등록이 안된다.
(키 파일명도 다르게 해준다. 기본 : id_ed25519 , 추가 : id_ed25519_idname 등 )

3. 키 가 등록되는 위치는 .ssh 를 기준으로 .ssh/config 파일에 다음항목을 추가한다.

Host github.com-idname
	hostname github.com
	User git
	IdentityFile ~/.ssh/idname-id_ed25519

위 처럼 github.com 주소를 분리해준다.
즉, github.com 로 접속하면 기본값이 .ssh/id_ed25519 가 적용되고, github.com-idname 으로 접속하면 .ssh/idname-id_ed25519 가 적용되는 식이다.

ssh git@github.com-idname 를 해보면 다음과 같이 나와야 한다.

PTY allocation request failed on channel 0
Hi idname! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

이후에는 저장소를 지정한 Host 주소로 연결해서 사용하면 된다.

git remote add origin git@github.com-idname:idname/your-repositry-name.git

커밋 후 git push -u origin main 로 저장소에 업로드 하면 된다.

저장소 별로 author 정보를 등록해준다.( 전체 적용시는 --global 을 추가 - git config --global OOO )

git config user.name "user name"
git config user.email "your-mail@your-mail.com"

 

혹시 author 가 다르게 등록이 되었으면, 전체 변경이라 주의!!

git rebase -r --root --exec "git commit --amend --no-edit --reset-author"
git push --force-with-lease
반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터를 공부하고 있는데, 가상머신 (안드로이드 / 아이폰) 을 통해 충분히 테스트 할 수 있다.

그러나 실제 폰에서 하면 "좀더 실감(?) 난다" 는 느낌이고, 실제적으로 가상머신은 메모리를 많이 먹는다.(최소 수기가의 메모리가 필요)
그래서 메모리가 적은 기기를 사용해 개발하는 경우 실제폰을 연동하는게 좋다.

예전 기억으로는 USB 케이블 연결하고 해서 좀 복잡한 느낌이었는데, 무선디버깅이 생겨서 좀더 편해진 듯 하다.
전체적인 설명은 구글링해서 하면 된다.

진행하면서 이상한 부분이 있어서 그 부분을 정리한다.

1) 무선 디버깅 - 장치를 찾지 못한다.

  위 처럼 정상적으로 장치가 등록이 되어야 하는데, 와이파이 아이콘을 클릭 후 장치를 찾으려면 안되는 경우가 있다.

장치를 못 찾는다.

핸드폰에서 개발자옵션을 키고 , 무선디버깅 항목으로 들어간다.

순서는 무선디버깅 on => 기기 페어링 => 기기 연결  순서로 한다.

안드로이드 스튜디오에서 터미널을 열어서 다음 과 같은 명령을 내린다. (페어링 포트 와 연결 포트가 다른 것에 주의)

# adb pair 192.168.99.25:40425
Enter paring code: 305619
Successfully paired ...

페어링되면 기기가 위처럼 보인다.

# adb connect 192.168.99.25:43169

connect 까지 하면 - android studio 에서 실행파일을 전송 할 수 있다.

2) 전송하면 설치가 안된다.

USB 로 설치 가 허용되어야 한다.

무선디버깅하면 USB 항목은 없어도 되는 줄 알았는데, 위 "USB 로 설치" 항목은 필요하다.

 

장치 찾기가 되면 편하겠지만, 수동? 연결이라도 되니 나쁘지는 않다.
(기기 특성으로 못 찾는 것인지는 추후 필요하면 정리)

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

칼리 리눅스를 설치하려고 한다. 주로 맥북에서 가장 많이 쓸 듯 하다.

m2 / m3 맥북에는 가상머신 세팅이 intel 맥보다는 까다롭다(2020년도에 출시했지만, 아직 완벽하지는 않다)
그중에 utm 이 가장 나은 듯 싶다.

설치는 구글링해서 검색해보고 하면 되는데, 좀 다른(?) 부분을 정리하고자 한다.

1) kali 설치시 utm 의 serial 장치를 추가한다.

  serial 추가 안하고 그냥 해보면, 부팅 후 검정화면이 되서 설치가 진행이 안된다.
  (serial 장치를 추가해서 원격 접속하는 것처럼 설치가 진행된다. - 설치완료후 serial 은 제거 - 안하면 화면이 두개가 된다.)

2) 설치 완료 후 - 한영전환 이 안된다. (fcitx 패키지를 설치후)

 기본 전환 단축키는 (Ctrl-space) 로 한다 (다른 조합으로 바꿀 수 있다.) 그런데, 한영전환이 안되는 현상이 있다.

로케일을 한글로 변경해준다.( dpkg-reconfigure locales 명령 후 ko_KR.UTF-8 으로 추가 / 설정)

입력기 설정을 보면 "Hangul" 부분이 없었다. 그래서 "+" 를 눌러 해당 부분을 추가해준다.
추가한 후에는 단축키로 변경이 된다.

주로 Virtualbox 를 사용해왔는데, UTM 은 아직은 뭔가 매끄럽지 못한 듯한 느낌이다.
아직 버쳘박스는 공식지원하지 않아, 당분간은 UTM 으로 사용할 듯 하다.

칼리 리눅스 사용해보면서 추가할 부분 보완하겠다.

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

vultr 서버를 사용중이다. 새로운 미션이 있어 관련 사항을 정리한다.

새로운 미션은 서버 접속량(사용량)이 늘어날때 - 서버를 추가 생성하여 부하를 분산하고자 한다.

일단 간단한 구성으로 메인+서브 형태로 구성한다.
해당 메인서버는 톰캣+nginx+MySQL 서버가 동작하는 서버이다.
과부하시 서브로 톰캣 서버를 세팅해서 부하를 분산하고자 하는 미션이다.

1) vultr API 를 활성화 시킨다.

Account > API 메뉴에서 API key 를 활성화 시킨다.

2) vultr-cli 콘솔 관리툴을 설치한다.(MacOS 기준)

brew install vultr/vultr-cli/vultr-cli

3) API key 등록

vi $HOME/.vultr-cli.yaml

내용
api-key: {YOUR-API-KEY}

4) 새로운 인스턴스(서버) 생성하기

vultr-cli instance create --region="icn" --plan="vc2-1c-1gb" --os=167

최소 3가지 항목을 입력하여 생성한다.

1) 서버 생성 지역
vultr-cli regions list

...
icn	Seoul		KR		Asia
...

2) 서버 OS
vultr-cli os list

...
167	CentOS 7 x64				x64	centos
...
1743	Ubuntu 22.04 LTS x64			x64	ubuntu
...

3) 서버 사양
vultr-cli plans list |grep icn
ID				VCPU COUNT	RAM	DISK	DISK COUNT	BANDWIDTH GB	PRICE PER MONTH		TYPE	GPU VRAM	GPU TYPE
vc2-1c-1gb			1		1024	25	1		1024		5			vc2	0
...

여기까지가 기본 사용법이다.

추가로 VPC 연동 / 최초 설치 스크립트 설정 등 관련부분은 정리하도록 하겠다.

 

 

테스트 서버가 필요한 경우 약 100$ 가량의 혜택을 받을 수 있는 광고 링크입니다.

이미지 클릭하여 가입

위 링크를 통해 가입하면, 이런식으로 약 2주간 100$ 가량의 Credit 을 쓸 수 있습니다.

결제(Credit Card / Paypal 등) 설정을 꼭 해야하는지는 불확실 하지만, 2주후에 테스트 서버 삭제하고, 해지하면 될 듯 합니다.
(아마도 악용?해서 가입했다 해지했다 하는 경우가 있을 수 있으니, 카드 인증 등이 필요할 듯 함)
물론 서비스가 좋아서 그대로 계속 써도 되겠죠.

vultr 서비스 사용해보시려면 클릭. ( https://blog.1day1.org/655 )
(무료 100$ 사용 가능)

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

시놀로지의 디스크를 삼바 마운트하여 우분투에서 사용하고 있다.

그런데, 다음과 같은 에러가 발생한다.(우분투쪽)

[15523.215931] CIFS VFS: No writable handles for inode
[16798.711632] CIFS VFS: No writable handles for inode
[17040.031477] CIFS VFS: No writable handles for inode
[18304.662429] CIFS VFS: No writable handles for inode
[18658.056606] CIFS VFS: No writable handles for inode
[19876.687363] CIFS VFS: No writable handles for inode
[20117.599812] CIFS VFS: No writable handles for inode
[20476.214572] CIFS VFS: sends on sock 000000003fca1e56 stuck for 15 seconds
[20476.214575] CIFS VFS: Error -11 sending data on socket to server
[20502.797871] CIFS VFS: cifs_invalidate_mapping: could not invalidate inode 0000000029bfb3c4
[20712.507564] CIFS VFS: sends on sock 000000003fca1e56 stuck for 15 seconds
[20712.507567] CIFS VFS: Error -11 sending data on socket to server
[24255.554486] CIFS VFS: sends on sock 00000000199ed322 stuck for 15 seconds
[24255.554489] CIFS VFS: Error -11 sending data on socket to server
[27933.514989] CIFS VFS: sends on sock 00000000100ef432 stuck for 15 seconds
[27933.514992] CIFS VFS: Error -11 sending data on socket to server
[31459.413179] CIFS VFS: sends on sock 00000000143282f3 stuck for 15 seconds
[31459.413183] CIFS VFS: Error -11 sending data on socket to server
[31474.773249] CIFS VFS: sends on sock 00000000143282f3 stuck for 15 seconds
[31474.773255] CIFS VFS: Error -11 sending data on socket to server

어떤 이유인지 명확하지는 않다.

주로 백업데이터를 나스로 백업하는 용도로 사용한다.

위 에러중 윗 부분은 일시적인 듯 하고, 아래부분이 계속 주기적으로(백업 주기) 발생하고 있다.
원래부터 발생한 것은 아닌듯 하고, 어느 시점부터 발생한 듯 싶다.(또는 늦게 발견)

원인을 찾아 해매던중 혹시나 해서 fstab 의 mount 옵션을 바꿔봤다.

//nas/backup  /data/nas-backup   cifs username=guest,password=passwd,iocharset=utf8,vers=2.0,noauto  0  2

기존 samba ver 1.0 으로 연결하던 것을 ver 2.0 으로 바꿔줬다.( vers=2.0 부분 )

위처럼 바꿔보니, 기존 백업주기에 에러메시지가 나오지는 않게 되었다.

이게 해결책인지는 모르겠다.(한동안 살펴보고, 또 발생하는지도 체크해봐야 겠다.)
참고 : 동일하게 ver 1.0 으로 공유된 윈도우10 머신쪽은 위와 같은 에러가 발생하지는 않았다.

 

[추가] 1일정도 지났는데, 해당 현상은 사라졌다. 추후 다시 체크

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,