[컴] php timezone 과 MySQL session timezone

php 의 timezone 이 DB의 timezone 에 적용이 안되는 문제 /



php timezone 과 MySQL session timezone


MySQL의 3가지 timezone

MySQL 에서 timezone 은 3가지가 있다.
  1. my.cnf 의 default-time-zone='+00:00'
  2. global timezone : SELECT @@global.time_zone;
  3. session timezone : SELECT @@session.time_zone; / SET time_zone='+09:00'

timezone 이 SYSTEM 인 경우 session timezone 확인법

만약 MySql DB의 timezone 이 아래처럼 SYSTEM 으로 보이는 경우 session 의 timezone 을 확인하려면 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)를 이용하면 된다.[ref. 3]

mysql> SELECT @@global.time_zone, @@session.time_zone;

+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

현재 session 의 timezone 을 확인하는 법

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)

DB의 session timezone 으로 인한 문제

Lumen/Laravel 에서 Eloquent를 사용하는데, MySQL timestamp column 에 UTC time 을 insert 했는데, 현재의 timezone 값이 그대로 들어갔다. 예를 들어 현재 서울시간으로 09시인 경우에 column 에는 UTC 09시가 입력되었다.
  • 현재 시간: 3월 23일 09:00+09:00
  • DB column의 입력된 시간 : 3월 23일 09:00+00:00

결론부터 이야기하면, 이것은 문제가 아니라, session timezone 에 대한 이해가 부족해서 였다. 내가 열어놓고 있는 client 의 session 의 time_zone 이 '+09:00' 로 되어 있어서 그렇게 보이는 것일 뿐, 이 time_zone 을 +00:00 으로 변경한 후에는 정상적으로 보였다.

ref.4에서 명확한 답을 알려준다.

laravel/lumen 에서 db session 의 timezone 설정

laravel/lumen 에서는 database.php (db config) 에서 timezone 을 설정해 주면, php 가 db 와 session 을 맺을 때 set time_zone = '...' 을 하게 된다.

아래처럼 env(DB_TIMEZONE, ...) 로 되어 있어서 .env 에서 설정을 해줘도 된다.
  • <cocktail_lumen>\src\config\database.php

'mysql' => [
  ...
  'timezone'  => env('DB_TIMEZONE', '+00:00'),
  ...


ref. 5에서는 lumen/laravel 이 아닌상황에서 사용법을 알려준다. 참고하자.

mysql client 의 db session

주의할 점은 phpMyAdmin 같은 mysql client 를 사용할 때는 php 가 사용하는 session 과 다르기 때문에 session timezone 이 다르게 설정될 수 밖에 없다. 그러니 주의하자.

이런 실수를 피하기 위해서는 자신의 db client 의 session timezone 을 php 와 동일하게 맞춰놓는 것이 좋다.
SELECT @@session.time_zone; -- SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
set time_zone = '+00:00' -- UTC인 경우;

또는 반대로 Aisa/Seoul로 값을 입력하고 싶은 경우에는 set time_zone = '+09:00';  를 해놓고, 입력을 해놓은 후에 다시 set time_zone = '+00:00' 로 변경하면 편리하게 입력을 할 수 도 있다.


References

  1. timezone - How do I set the time zone of MySQL? - Stack Overflow
  2. time - Should MySQL have its timezone set to UTC? - Stack Overflow
  3. timezone - How do I get the current time zone of MySQL? - Stack Overflow
  4. Laravel saving timestamps as UTC but MySQL server is also adding an extra offset.
  5. How To Synchronize Your Timezones in PHP and MySQL




[컴][js] 특정 .css 가 import 되었는지 확인하는 방법

특정 클래스의 존재 여부 아는 방법 /

특정 class 가 존재하는지 확인하는 방법


대체로 document.styleSheets 에서 CSSRulesList 를 얻고, 그것의 selectorText 를 확인하는 방법을 사용한다. 

.css 가 import 되었는지 확인시에 사용

요즘은 대체로 webpack 등을 사용해서 js 안에 삽입할 수 있지만, 외부 css 를 사용해야 하는 경우도 생긴다. 이 경우에 특정 class 가 import 되었는지를 확인하고 waring 을 보여주는 것으로 css 를 import 하는 것을 인지할 수 있다.





[컴][js] 일정 scroll 이상일때 menu 를 고정시키는 방법

top sticky / 배너 고정 / 탑메뉴 고정 / 스크롤할때 상단 메뉴 고정 / 앵커 / 메뉴가 걸리도록


일정 scroll 이상일때 menu 를 고정시키는 방법

상단 menu 위로 banner 등을 넣어놓고, 아래로 scroll 을 하면 배너는 사라지고, 메뉴가 고정되는 메뉴를 만드는 법.

여기서 동작을 확인할 수 있다.

  • https://codepen.io/senff/pen/ayGvD : 이 방법은 2개를 만들고, scroll 위치에 따라 하나는 보여주고, 하나는 감추고 하는 방법이다. 이방법은 '사파리 safari' 나 삼성인터넷 에서 계속 깜빡거리는 문제가 있다.
  • How to keep a part of a page fixed on top when scroling: 이방법이 간단하고 가장 알맞다. 여기서는 다만 jquery 로 되어 있어서 이것을 typescript 로 수정했다.

class StickyTopWithBanner{
    header:any;
    topBannerHeight: number;
    constructor(){
        this.header = document.querySelector('.js-top-header');
    }
  
    run(){
        let header = this.header;

        const el: HTMLElement = document.querySelector('.js-loanCompanySignBox');
        const rect = el.getBoundingClientRect();
        el.style.display = 'block';
        
        this.topBannerHeight = rect.height;
        
        window.addEventListener('scroll', this.onScroll.bind(this));

        return;
    }
  
    onScroll (e: any) {

        if (window.pageYOffset > this.topBannerHeight) {
            this.header.classList.add('fix-top');
        }else{
            this.header.classList.remove('fix-top');
        }
    }
    
}


[컴] 버그와 개발

테스트와 개발 / TDD / 완벽한 개발

버그

몇달전 reddit 에 올라온 링크가 있다. 이글을 통해 소프트웨어 개발과 버그에 대한 고민을 좀 해보자.

이 NASA 의 글에서 Test 는 정말 엄청나다. 새로운 기능을 하나 구현하는데 그들은 2년이 걸렸다. 그들은 수많은 테스트를 시행했지만 결국 그들의 프로그램이 완전무결하다는 것을 보증할 수 없었다고 한다.
  1. Developing software for the space shuttle : programming, 2017년 12월31일
  2. Computers in the Space Shuttle Avionics System, Computers in Spaceflight: The NASA Experience
우리가 계속 사용하는 software들도 계속 버그가 나타난다.
  1. 윈도우10 레드스톤3 벌써부터 버그 발생? | 케이벤치
  2. 인텔 CPU 커널 버그 총정리 : 대규모 보안 결함으로 성능 악영향 가능 - ITWorld Korea
  3. 씨넷코리아 | 맥OS의 어이없는 버그 “루트 권한 프리패스?”



개인적 결론

개발자가 버그를 너무 무시하는 것은 좋지 않다. 그것은 정말 안좋은 프로그램을 만들 수도 있기 때문이다.

하지만 빠른 개발을 위해서라면, 핵심에 집중하는 것이 낫다. 중요한(critical) 버그가 아니라면 그저 넘어가는 것이 낫다.

이것의 핵심은 어떤 기능이 가져다줄 가치가 버그로 인해 잃어버리게 될 가치보다 충분히 크다면 개발에 집중해야 한다고 본다.

그래서 결론은 reddit의 comment 에도 있지만, 우리가 버그를 잡는데에 공을 드리기 보다는 빠르게 prototype 을 만들고, 그것의 실패을 통해 bug를 잡는 방법(예를 들면, open beta test 등)을 확장하는 것이 더 나은 방법이라고 여겨진다.

물론 안타깝게도 개발자는 소프트웨어의 책임자가 아니라서, 매니저가(또는 사장)이 이런 방법에 동의할 수 있어야 할 듯 하다.









[컴] NERF 프로젝트

UEFI 부팅과정


구글 엔지니어 로널드 미니치(Ronald Minnich)의 발표








사용자가 인식하지 못하는 3가지 OS

  1. ME
    1. 사용자는 모르지만 인텔CPU는 그 동작을 인식할 수 있는 CPU 자원 제어(Ring -2)
    2. 시스템을 켜고 끄거나 인텔CPU 모르게 전원이 차단된 컴퓨터의 디스크 이미지를 재구성(Ring -3) 할 수 있다.
    3. 오픈소스 운영체제(OS) 미닉스(MINX) 3 버전의 변종이지만, 그 소스코드는 비공개다.
    4. 인텔 CPU의 액티브매니지먼트테크놀로지(AMT) 기능도 ME를 기반으로 구동된다.
  2. UEFI(통합확장펌웨어인터페이스)
    1. 메인 CPU에서 구동
    2. 복잡한 커널을 지녔으며 수백만줄의 코드로 구성
    3. 부팅이 완료된 뒤 UEFI 애플리케이션이 구동
    4. 보안모델이 불명확
    5. 다양한 시스템 기능에 접근할 수 있는 컴포넌트를 포함
  3. SMM
    1. 바이오스(BIOS) 영역에서 실행되는 시스템관리모드(SMM)
    2. ME 가 Ring -3 이라면 SMM과 UEFI는 Ring -2
    3. 오래된 16비트 마이크로프로세서(인텔 8086)용 코드의 통로
    4. 인텔의 칩셋은 한 번 SMM을 설치하면 이후 동작 단계에서 D램의 상위 8MB 크기 영역을 숨겨버린다. 그래서 사용자나 관리자는 그 코드를 control 할 수 없다.
    5. SMM은 제조사가 사용자 시스템 통제를 지속하는 역할을 한다.

사용자가 볼 수 있는 부분

  1. 일반 애플리케이션(Ring 3)
  2. 사용자 OS(Ring 0)
  3. OS를 가상화하는 SW(Ring -1)

NERF 프로젝트(Non-Extensible Reduce Firmware)

  • UEFI 펌웨어 기능을 "작은 리눅스 커널"과 "초기 램 파일 시스템(initial RAM file system, initramfs)"으로 대체하는 작업, code의 custom portion 들이 GO(언어 고) 로 만들어져있다.
  • 인텔CPU ME 펌웨어의 세부 구성요소를 파헤쳐서 가능한 많은 기능을 분석한 다음 그 전반적인 동작을 리눅스OS의 영역으로 되가져오기로 했다
  • 분석 결과 인텔CPU ME 펌웨어 자체를 전혀 쓰지 않는 것은 불가능
  • ME의 구성요소 대부분은 제거할 수 있는 것으로 파악
  • NERF 의 목표
    1. 해로운 동작을 할 수 있는 능력을 덜어낼 것.
    2. 동작을 더 가시화할 것
    3. 없애기 힘든 ME 펌웨어 자체를 제외한, 웹서버 및 IP스택 등 모든 런타임 구성요소를 제거
    4. UEFI의 IP스택과 다른 드라이버도 제거
    5. ME와 UEFI의 자체 덮어쓰기(self-reflash) 기능을 없앨 것
    6. 펌웨어의 플래시 업데이트를 리눅스에서 관리할 것

 UEFI 구성요소

UEFI boot 과정

References

  1. 인텔CPU 보안구멍, 구글이 메운다 - 지디넷코리아




[컴] 폰이 Oreo treble 을 지원하는지 여부 확인 방법

안드로이드 트레블 프로젝트 확인방법 / 오레오 지원 여부 확인 / 갤럭시 트레블 지원 여부 확인 / 오레오 트레블 지원 여부 확인하는 앱

내 폰이 Oreo treble 을 지원하는지 여부 확인 방법


Termux 를 설치하고, 실행하면 console 창(prompt)이 하나 뜬다. 여기서 아래 command 를 입력해 보면 알 수 있다.
getprop ro.treble.enabled

References


  1. How to Check for Project Treble Support on your Android Oreo Device