2023년 7월 19일 수요일

mariadb ER_CANT_AGGREGATE_2COLLATIONS 에러발생

테이블 charset 이 utf8mb4 일때 클라이언트 charset 을 따로 설정하지 않으면 이모지 사용할때 아래와 같은 오류가 난다.

code: 'ER_CANT_AGGREGATE_2COLLATIONS',

0|api.dlwl |   errno: 1267,

0|api.dlwl |   sqlMessage: "Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb3_general_ci,COERCIBLE) for operation '='",

0|api.dlwl |   sqlState: 'HY000',

0|api.dlwl |   index: 0,



나의 경우는 nodejs mysql 모듈에서 난 오류인데, 아래와 같이 수정하면 됨. 서버와 클라이언트 간에 charset 맞추는거 까먹지말자..
const config = {
  ...
charset:'utf8mb4',
};

connection = mysql.createConnection(config);

2023년 6월 26일 월요일

우분투 스케쥴러

1. /etc/crontab/
2. /etc/cron.*/*
3. systemctl list-timers

1,2번은 익숙한데 3번이 잘 생각이 안나서 기록함.

2023년 6월 21일 수요일

ssl 인증서 생성

- 인증서 생성

# CA 개인키 생성
$ openssl genrsa -out starkey-rootCA.key 2048
$
# CA CSR ( Certificate Signing Request ) 생성 -- 인증신청서
$ openssl req -new -key starkey-rootCA.key -out starkey-rootCA.csr

# CA CRT 생성 -- 인증서
$ openssl x509 -req -in starkey-rootCA.csr -signkey starkey-rootCA.key -out starkey-rootCA.crt

중간 인증서 개인키 생성
$ openssl genrsa -out starkey-ia.key 2048

중간 인증서 CSR ( Certificate Signing Request ) 생성 -- 인증신청서
$ openssl req -new -key starkey-ia.key -out starkey-ia.csr

중간 인증서 CRT 생성 -- 인증서
$ openssl x509 -req -in starkey-ia.csr -CA starkey-rootCA.crt -CAkey starkey-rootCA.key -CAcreateserial -out starkey-ia.crt

$ openssl x509 -sha256 -req -days 365 -in mongodb-test-server1.csr -CA mongodb-test-ia.crt -CAkey mongodb-test-ia.key -CAcreateserial -out mongodb-test-server1.crt -extfile openssl-test-server.cnf -extensions v3_req

- 추가사항

# 개인키로 공개키 만들기
$ openssl rsa -in test.key -out test.pub -pubout

# format 변환 -----BEGIN PRIVATE KEY----- (PKCS#8) -> -----BEGIN RSA PRIVATE KEY----- (PEM)
$ cp -rpf test.key test.pem # 파일복사
$ ssh-keygen -p -m PEM -f test.pem # format 변환

# 비공개 공개키 한번에 만들기
$ ssh-keygen

puppeteer 로 크롤링 시 발생하는 문제점

node pm2 로 크롤링을 계속 하니 /tmp/snap-private-tmp/snap.chromium/tmp 폴더 안에 puppeteer_dev_chrome_profile-* 파일들이 지워지지 않고 계속 살아 있어서 디스크 용량이 꽉 차버렸다.

일단 du -sh * | sort -rh | head -n 10 로 용량 많은것들 찾아서 지워줬다.

그리고 /var/log/journal 폴더 안에 용량도 많길래 최대 사이즈 설정

$ sudo nano /etc/systemd/journald.conf
SystemMaxUse=1000M

최적의 방법은 모르겠지만 puppeteer.launch 옵션에 userDataDir 옵션을 줘서 해당 폴더에 유저데이터 저장하게 하고 puppeteer.launch 하기전 userDataDir 폴더를 fs.rmSync 로 삭제하는 방법으로 우선적으로 수정.

나중에 시간되면 더 좋은 방법을 찾아봐야할듯.

puppeteer.launch 해서 받은 변수 browser 로 close() 하고 바로 또 launch 하는게 문제였음..

browser.close(); -> await browser.close(); 로 해결.

close() 함수가 정상적으로 실행이 안된다면, 아래 오류가 발생
Failed to create /home/ubuntu/node/project/pricedown/crawling/user-data-dir/SingletonLock: File exists (17)

크롤링 파일 실행할때 user-data-dir 폴더 삭제하는 방법으로 해결.

2016년 5월 18일 수요일

forever 로그 파일 관리


오래된(오래된은 알아서 조절하라) 벡업 파일은 삭제한다.

$ find ./*.log -mtime +7 -exec rm -f {} \;

Log 파일은 초기화 시킨다.

$ cat /dev/null > forever.log


2016년 5월 9일 월요일

ubuntu rsync aws 사용방법


sudo rsync -avL --progress -e "ssh -i /path/to/auth.pem" --log-file=/var/log/rsyncd.log ~/wwwhome/ ubuntu@ip:/home/ubuntu/wwwhome


2016년 4월 8일 금요일

bxslider ios웹뷰에서 스크롤과 동시에 슬라이드할때 멈춤(freezes) 현상 해결!

bxslider 는 슬라이드 애니메이션 동작할때 css translate3d 와 jquery animate를 사용한다.

ios webview 에서는 translate3d 를 지원하므로 css 로 애니메이션이 동작을 하는데, 애니메이션이 끝나면 transitionend 이벤트가 실행이 되고 slider.working = false; 가 되면서 애니메이션이 끝난다.

그런데 스크롤을 함과 동시에 이미지를 넘기면 transitionend 가 실행이 안되고 slider.working 은 계속 ture상태로 남게되면서 bxslider는 더이상 동작하지 않는다.

이 문제를 해결하기 위해서 transitionend 가 발생하지 않으면 slider.working = false; 를 실행시키기 위해 소스를 수정해보았다.

jquery.bxslider.js 를 열어서

var setPositionProperty = function(value, type, duration, params){

이 부분을 찾은다음

// set the property value
el.css(slider.animProp, propValue);

css 속성을 세팅하는 부분 아래에다가

// ios에서 스크롤하면서 작동하면 transitionend 이벤트가 안먹혀서 추가함 by starkey
var dummy = setTimeout(function(){
    slider.working = false;
}, duration+1);
// -->

를 추가하고,

정상적으로 transitionend 가 발생했을대 clearTimeout 을 해준다.

el.bind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function(){
   clearTimeout(dummy); // transitionend 가 동작하면 clearTimeout 해줌
   // unbind the callback
   el.unbind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd');
   updateAfterSlideTransition();
});