파일시스템 계층구조 표준(https://yiunsr.tistory.com/756) 에 따라 실행중인 파일의 .sock파일(port 가 아닌 파일로 stream 을 주고 받을 때 생성되는 파일) 이나 .pid파일(Process identifier 로 프로세스가 실행중일 때 중복실행을 방지하고 위해 생성하는 파일, 계속 상주하는 프로그램의 경우 특정 경로에 자신의 pid 파일이 존재하고 있으면 이미 실행중임을 인식해서 자동으로 종료되는 방식으로 구현되오 있다.)의 경우 보통 /var/run 내 디렉토리를 만들어 파일을 생성한다. 
 전에 gunicorn 으로 flask 배포(https://yiunsr.tistory.com/888) 에서 /var/run/ 으로 sock 파일이나 pid 를 파일을 설정했던 것도 이런 이유이다. 그런데 이 경로 /var/run 안에 디렉토리를 만들면 재부팅시 이 파일 뿐만 아니라 디렉토리도 삭제된다. 이것은 아마 종료시 run 중이 아니기 때문에 시스템에서 알아서 해당 파일 전부를 삭제하는 것으로 추정된다.

 오늘 이 때문에 디렉토리가 없어 systemd 가 동작하지 않는 현상을 경험했다. 내가 다른 /var/run 과 섞이지 않게 하기 위해 따로 디렉토리를 만들었는데, 재부팅 해니 이 디렉토리까지 사라져서 systemd 로 동작하는 스크립트가 pid, sock 파일을 만들지 못해서 동작하지 않는 문제가 있었다. 

 찾아보니 systemd 설정시

[Service]
User=www-data
Group=www-data
RuntimeDirectory=uwsgi
RuntimeDirectoryMode=0777

같은 식으로 하면  /run/var/uwsgi 디렉토리가 생성되고 설정한 대로 group 과 user 가 생성되고 RuntimeDirectoryMode 대로 퍼미션도 설정되는 것을 확인 했다.

systemd 는 뭔가 공부할 것이 너무 많은 것 같다. 언젠가 정리가 필요할 것 같다. 

 오늘 postgresql 에서 where 조건에 비교문을 작성하였다.  파이썬에서 None 에 대해 비교하듯이 Null 과 비교하자 같은 결과가 나오지 않는 것을 발견했다. 
 파이썬에서 
    None != 8  이라고 하면 True  가 된다. 
javascript 에서도 유사하게 
   null != 8  과  undefined != 8   모두 true 가 된다. 

그런데 Postgresql 에서 
  select null != 8;    은 null 이 된다. where 절에서 특정 row의 column 이 null 인 상태에서 이런 비교 연산이 내부적으로 동작한다면 Python 과 JS 에서 사용하는 의도와 null 이 포함된 row 가 나오지 않게 된다. 

 이를 방지하기 위해 IS DISTINCT FROM  로 비교할 수 있다. 
select null is  distinct  from  8   처럼 사용하면  true 라는 결과를 얻을 수 있다. 
 유사하게 
Postgresql 에서는 
select null=8   에 대해서 null 이라는 결과를 리턴하는데
select null is not distinct  from  8 라고 사용하면 false 라는 결과를 얻을 수 있다. 

 회사에서 한 프로젝트가 IE11 을 버리기로 했다.(내부 admin 시스템은 사용자가 사용하는게 아니라서 크롬에 최적화 해서 사용하고 있었다. 그런데 사용자 사이트는 누가 사용할지 모르기 때문에 IE11을 지원하고 있었다.) 이제는 IE11 때문에 사용 못했던 코드를 더욱 가감하게 사용할 수 있게 되었다. (물론 다른 프로젝트는 아직 IE11을 유지하고 있다. ) 

 이렇게 해서 여러가지 일을 처리하다 기존에는 관심을 가지지 않았던 신기한 JS 함수를 알게 되었다. 
IntersectionObserver 라고 해서 특정 element 가 화면에 viewport 에 보여주는지 여부를 알려주는 함수가 존재했다. 전에 이러한 기능을 구현하려고 했으면 timeout 함수로 주기적으로 element 가 어디에 위치하는지 검사 해야 했다. 그런데 이 함수가 있으면 그 것보다는 효율적으로 적절하게 이벤트를 호출해 주는 것 같다.  이 기능을 이용해서 특정 element 가 현재 viewport 를 기준으로 위에 존재하는지, viewport 에 보이는지, viewport 아래에 위치하는지 확인 할 수 있는 기능을 사용할 수 있다. 

https://stackoverflow.com/a/58981159/6652082