[카테고리:] IT

다양한 IT 기술에 대한 내용을 공유합니다.

  • [Nginx] Nginx 기본 세팅

    [Nginx] Nginx 기본 세팅

    Nginx 설치

    # rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    # rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
    # yum install nginx.x86_64
    # systemctl start nginx
    # systemctl enable nginx
    

    PHP 설치

    # yum install yum-plugin-replace
    # yum install mod_php71w php71w-common
    # yum install php71w-gd
    # yum install php71w-fpm
    # yum install php71w-opcache
    # yum install php71w-cli
    # yum install php71w-mysqlnd
    # yum install php71w-xml
    # yum install php71w-mbstring
    
    # sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/g' /etc/php.ini
    
    # yum install -y make automake gcc gcc-c++ kernel-devel openssl-devel php php-devel php-pear bzip2-devel libvpx-devel yum-utils bison re2c libmcrypt-devel libpqxx-devel libxslt-devel pcre-devel libcurl-devel libgsasl-devel openldap-devel libmemcached-devel libjpeg-devel libpng-devel readline-devel
    
    # systemctl start php-fpm
    # systemctl enable php-fpm
    

    nginx.conf 파일찾기

    # sudo find / -name nginx.conf
    

    nginx.conf 수정하기

    # vi /etc/nginx/nginx.conf
    

    nginx 다시 로드 하기

    # sudo service nginx reload
    
  • [UI] Vanilla JS로 짱깸뽀(가위 바위 보) 게임 만들기

    [UI] Vanilla JS로 짱깸뽀(가위 바위 보) 게임 만들기

    바닐라 자바스크립트로 만든 추억의 짱깸뽀 게임이다.
    왜 이딴거나 만들고 있었는지..

    게임 설명

    • 시작 버튼을 눌러 게임 시작
    • 게임을 한판 할 때 마다 하단의 코인이 하나씩 소모됨
    • 룰렛 주변으로 게임 결과가 표시 됨
    • 승리할 경우 랜덤으로 코인이 지급
    • 짱깸뽀 사운드를 추가해야 하는데 구하기가 쉽지 않음

    게임 하기

    여기를 클릭하면 게임 화면이 나온다.

    코드

    여기를 클릭하면 코드를 확인할 수 있다.

  • [Jekyll] 깃허브 블로그(Jekyll) SEO 세팅

    [Jekyll] 깃허브 블로그(Jekyll) SEO 세팅

    검색 엔진 최적화(Search Engine Optimization)

    검색엔진이 이해하기 쉽도록 홈페이지 구조를 설정하여 포털 사이트 상위에 노출시키는 작업이다. jekyll으로 제작된 깃허브 블로그에 SEO 작업을 진행하겠다.

    Sitemap

    • 웹 크롤링 로봇이 이용할 수 있는 웹사이트의 접근 가능한 페이지의 목록
    • 사이트맵을 등록하면 구글에서 주기적으로 크롤링을 한 뒤 관련 검색어로 검색 시 해당 사이트가 노출이 된다.
    • sitemap.xml 파일을 사용하면 사이트 구조를 구글, 네이버, 다음 등 검색엔진에 손 쉽게 제출할 수 있다.
    • 검색엔진에 크롤링해야하는 URL을 알려줌으로써 색인을 생성하는 방법과 색인을 생성하는 방법을 제어한다.

    Sitemap.xml 생성하기

    sitemap.xml 파일을 만들고 root 경로 넣어준다.

    • 해당 파일을 커밋, 푸쉬 한다.
      블로그 주소/sitemap.xml 에 들어가서 제대로 사이트맵이 등록되었는지 확인해 보자
    • 홈페이지의 모든글의 정보를 담고있는 사이트맵이 출력되는 것을 알 수 있다. 추후에 블로그 포스팅을 푸쉬 하면 jekyll이 빌드하면서 사이트맵도 자동으로 갱신된다.
    • 사이트 맵에서 특정글의 정보를 변경하고 싶으면 아래와 같이 특정 글의 설정 값을 변경해 주면 된다. changefreq를 너무 짧게 하면 빈번한 접속으로 안좋은 영향을 미칠수 있다고 한다. 설정이 없을때 default 값은 사이트맵에 정의되어 있다.
    layout: post
    title: "제목"
    date: 0000-00-00 12:00:00 
    lastmod : 0000-00-00 12:00:00
    sitemap :
      changefreq : daily
      priority : 1.0
    ---
    
    • 참고로 /sitemap.xml을 실행했을 때 제대로 안나오는 경우가 있는데, 주소 링크에 특수문자가 들어간 경우이다. 깃허브 블로그의 경우 포스팅 파일명으로 링크가 생성되므로 포스팅 파일명은 특수문자 및 한글 사용을 안하도록 한다.

    RSS

    • RSS(Rich Site Summary)란 뉴스나 블로그 사이트에서 주로 사용하는 콘텐츠 표현 방식이며, 웹 사이트 관리자는 RSS 형식으로 웹 사이트 내용을 보여 준다.
    • RSS피드는 정기적으로 업데이트 되는 웹 콘텐츠를 전달해 주는 형태이며, 글의 전체 혹은 요약된 정보와 작성자 등의 정보가 포함되어 있다. 즉 블로그의 글을 작성하면 RSS피드에도 전달이 되고, 구글, 네이버, 다음 등을 통해 글을 검색하면, 검색 엔진은 블로그의 RSS피드로부터 글을 받게 되어 해당 블로그로 들어오게 된다.

    RSS feed.xml 생성하기

    • 사이트맵과 동일하게 feed.xml 파일을 만들고 root 경로에 넣어준다.
    • 해당 파일을 커밋, 푸쉬 하고 블로그 주소/feed.xml 에 제대로 등록되었는지 확인해 보자.

    robots.txt

    robots.txt는 로봇 배제 표준을 따르는 일반 텍스트 파일이다. 쉽게 표현하면 검색 엔진이 해당 사이트의 콘텐츠를 가져가도 허락하는 부분과 가져가면 안된다 라는 설정을 하는 부분이라고 보면 된다. 위와 동일하게 root 경로에 위치한다.

    robots.txt 생성

    • robots.txt 파일을 만들고 아래와 같이 입력한다.
    User-agent: *
    Allow: /
    
    Sitemap: https://recordboy.github.io/sitemap.xml
    
    • User-agent는 허용할 검색엔진 명을 넣게 된다. 따로 설정하지 않으면(*) 모든 검색엔진을 허용하게 된다. Sitemap은 본인 블로그 사이트맵 주소를 넣어 주면 된다.

    블로그 등록

    본인 블로그를 등록 해야 구글 및 네이버에서 검색이 가능하다.

    Google Search Console

    • Google Search Console에 접속한다. SEARCH CONSOLE 버튼을 클릭한다.
    • 속성 유형 선택화면이 나오면 URL 접두어 방식을 선택 후 해당 블로그 주소를 등록한다.
    • 메타 태그를 이용한 사이트 소유권을 확인한 뒤 사이트맵을 등록해주면 된다. (여기에 설명이 참 잘 되어있다.) 구글 애널리틱스에 같은 계정으로 가입이 되어있으면 자동으로 소유 확인이 된다.
    • 네이버 웹마스터 도구에 접속한다.
    • 로그인하고 블로그 주소를 등록해 사이트를 추가해 준다.
    • 웹마스터 도구에서 제공하는 html 파일을 다운받아 본인 블로그에 업로드하거나 메타태그를 이용하는 방법으로 사이트 소유권을 확인한다.
    • 왼쪽 요청 메뉴로 들어가 사이트맵을 제출해준다.
    • 깃허브에서 공식적으로 지원하는 jekyll블로그는 RSS2.0이 아닌, ATOM이라는 방식으로 feed.xml을 생산해준다. 그리고 ATOM방식으로 제작된 피드는 네이버 웹마스터도구에 등록이 안된다.

    References

    github blog를 google에서 검색되도록 설정하기
    구글(Google) 검색에 내 사이트 등록하기
    홈페이지 검색 잘 되도록 만들기
    RSS피드란?
    robots.txt 파일 만들기

  • [SASS] SASS 설치 및 기본 사용

    [SASS] SASS 설치 및 기본 사용

    CSS전처리기(CSS pre-processor)라 불리는 SASS(Syntactically Awesome StyleSheet)는 CSS의 단점을 보완한 CSS의 확장형이다. 전처리기란 자신만의 특별한 구문을 가지고 CSS를 생성하도록 하는 프로그램이다.

    CSS 전처리기 종류

    SASS와 SCSS의 차이

    SCSS는 SASS의 3버전으로 업그레이드 하면서 갖춰진 새로운 문법 체계이다.

    SASS

    {}(중괄호)와 ;(세미콜론) 사용 안하기 때문에 코드가 깔끔하고 간결함

    .list
      float: left
      width: 100px
      li
        color: red
        background: url("./image.jpg")
        &:last-child
          margin-right: -10px
    

    SCSS

    인라인 코드(한 줄 작성)를 작성할 수 있고, CSS와 유사한 문법을 가지기 때문에 코드 통합이 훨씬 쉬움

    .list {
      float: left;
      width: 100px;
      li {
        color: red;
        background: url("./image.jpg");
        &:last-child {
          margin-right: -10px;
        }
      }
    }
    

    SCSS를 추천

    • 공식 문법: 공식 레퍼런스는 SCSS 문법을 기준으로 모든 문법을 설명하고 예시를 보여줌
    • 더 넓은 사용자: 다수의 라이브러리, 프레임워크가 SCSS 문법을 활용하는 등 새로운 문법이 더욱 널리 쓰임
    • CSS 호환성: 친근한 CSS 문법은 SASS와 CSS 사이의 심리적 틈을 줄여주고, 기능적으로도 확장성을 높임
    • 여러 줄 쓰기 지원: SASS 문법은 들여쓰기와 줄 바꿈이 문법의 중요한 요소이기 때문에, 반대로 여러 줄 쓰기를 지원하지 않음

    SASS를 더 편리하게 수정한 버전이 SCSS이기 때문에 파일 확장자명은 .scss를 사용한다.

    컴파일 방법

    SASS는 웹에서 직접 동작할 수 없다. 최종에는 표준 CSS로 동작해야 하며, 전처리기로 작성 후 CSS로 컴파일해야 한다. 다양한 방법으로 컴파일이 가능하여 여기서는 node-sass를 사용할 것이다. node-sass는 Node.js를 컴파일러인 LibSass에 바인딩한 라이브러리다.

    NPM을 사용하여 전역에 설치해준다.

    $ npm install -g node-sass
    

    컴파일이 제대로 되는지 테스트를 해보겠다. 작업할 디렉토리로 가서 아래처럼 구문을 적은뒤 test.scss로 저장한다.

    $red: #ff0000;
    div{
        color: $red;
    }
    

    터미널로 들어가 해당 디렉토리로 이동한 뒤 아래를 참고하여 명령어를 입력한다.

    sass 작성한scss파일명.scss 변환될css파일명.css
    

    위 예제 파일을 컴파일 할려면 아래처럼 입력하면 된다.

    sass test.scss test.css
    

    명령어를 실행하면 해당 디렉토리에 test.css 및 test.css.map 파일이 정상적으로 생성된 것을 확인할 수 있다. .scss 파일은 컴파일이 진행된 파일이고, .map 파일은 scss와 css가 어떻게 연결되어 있는지에 대한 정보 파일이다.

    div {
      color: #ff0000;
    }
    
    /*# sourceMappingURL=test.css.map */
    

    하지만 매번 이렇게 컴파일을 할수 없기에 내가 작성하고 있던 파일을 변경(저장)되면 자동으로 컴파일 하도록 설정할 수 있다.

    1. 작성된 scss파일만 변환


      $ sass --watch 작성된.scss

    2. 디렉토리의 모든 scss 파일을 변환


      $ sass --watch .:.

    위와 같이 해당 명령어를 입력하면 test.scss 변경 시 자동으로 test.css도 변경된다. 해당 명령어를 취소하고자 할 때는 ctrl + c 를 입력하면 취소가 된다.

    References

    Sass(SCSS) 완전 정복!
    Sass 기초와 활용
    [사스(Sass)] 2. Sass 사용법
    CSS 전처리기
    Sass는 SCSS로 쓰세요
    [사스(Sass)] Sass 기본 사용법 (컴파일 및 명령어)

  • [HTML] 웹 접근성 정의 및 대비 방법

    [HTML] 웹 접근성 정의 및 대비 방법

    2019년 11월 22일 정보접근성 기술 컨퍼런스를 다녀온뒤 세미나 내용을 정리 및 웹 접근성에 대해 작성한 글이다.

    웹 접근성이란?

    웹 접근성(Web Accessibility) 이란 장애인, 고령자 등이 웹 사이트에서 제공하는 정보에 비장애인과 동등하게 접근하고 이해할 수 있도록 보장하는 것이다. 법으로는 2017년 7월 26일부터 장애인차별금지법으로 시행되었다.

    장애인 차별금지 및 권리구제 등에 관한 법률 제 2조(장애와 장애인)

    1. 이 법에서 금지하는 차별행위의 사유가 되는 장애라 함은 신처적, 정신적 손상 또는 기능상실이 장기간에 걸쳐 개인의 일상 또는 사회생활에 상당한 제약을 초래하는 상태를 말한다.
    2. 장애인이라 함은 제1항에 따른 장애가 있는 사람을 말한다.

    웹 접근성은 정보와 사용자의 디지털정보격차를 줄인다는 개념으로도 볼 수 있다.

    디지털정보격차(Digital Divide)란?

    • 정보통신기술에서의 접근, 역량, 활용에 있어서의 불평등
    • 사회자원에서의 접근, 역량, 활용에 있어서의 불평등

    또한 접근성에서의 ‘장애’는 개인의 건강상태가 아니라 인간 상호작용이 일치하지 않는 상황으로 볼 수 있고, 접근성은 아래와 같은 의미로도 해석할 수 있다.

    • 각자 다른 능력을 가진 사람들이 모든 것을 경험할 수 있도록 가능성을 만들어 주는것
    • 그리고 이를 달성하기 위해 전문가들이 노력하는 것

    정보통신 환경의 장애유형과 보완대책

    장애유형특징보완대책
    시각장애(전맹)모니터를 볼 수 없음스크린리더
    시각장애(저시력)모니터 사용이 일부 가능함화면확대/고대비
    시각장애(색맹)색을 구별할 수 없음색상에만 의존하지 않기/고대비
    청각장애사운드, 오디오 등을 창취할 수 없음수화, 시각정보 제공
    지체장애(상지장애)손을 사용할 수 없음마우스 대체 방법, 키보드만 사용
    지체장애(기타)움직임이 어려움충분한 시간 제공
    언어장애복잡한 용어, 어려운 용어의 이해 불가능쉬운 용어 사용

    웹 접근성 국제표준 검사항목(KWCAG)

    웹 접근성 한국표준이며 가이드는 한국형 웹 콘텐츠 접근성 지침 2.1 에서 확인해 볼 수 있다. 항목은 24가지 이며 국제표준(WCAG)은 더욱 엄격하여 항목으로는 78가지가 있다.

    인식의 용이성 – 사람은 콘텐츠를 보거나 들을 수 있다.

    1. 적정한 대체 텍스트
    텍스트 아닌 콘텐츠는 대체 가능한 텍스트와 함께 제공되어야 한다.
    2. 자막, 수화 등의 제공
    영상이나 음성 콘텐츠에는 동등한 내용의 자막, 원고 또는 수화가 제공되어야 한다.
    3. 색에 무관한 콘텐츠 인식
    화면에 표시되는 모든 정보는 색에 관계없이 인식될 수 있어야 한다.
    4. 명확한 지시사항 제공
    특정한 감각(시각, 청각 등)에 의존하여 지시사항을 제공할 경우 해당 감각에 장애가 있다면 인식할 수 없으므로, 다른 감각을 통해서도 인식할 수 있도록 지시사항을 제공해야 한다. (3, 4번 항목의 예: 콘텐츠 구분 접근성)
    5. 텍스트 콘텐츠 명도 대비
    화면에 표시되는 모든 사용자 인터페이스 컴포넌트와 텍스트는 전경색과 배경색이 구분될 수 있도록 제공되어야 한다.(예: 명도 대비 접근성)
    6. 자동 재생 금지
    자동으로 재생되는 배경음을 사용하지 않아야 한다. 구글은 사용자가 원치 않은 미디어가 자동 재생되면서 데이터와 전력을 소모하고, 웹 탐색 중 소음을 유발한다는 이유로 2018년 1월부터 크롬 브라우저는 웹 사이트에서 자동으로 재생되는 영상을 기본 설정에서 차단한 사례가 있다.
    7. 콘텐츠 간의 구분
    이웃한 콘텐츠는 구별될 수 있어야 한다.

    운용의 용이성 – 사람이 타이핑이나 음성으로 컴퓨터를 사용할 수 있다.

    1. 키보드 사용 보장
    모든 기능은 키보드만으로도 사용할 수 있어야 한다.
    2. 초점 이동
    키보드의 Tab키(다음으로 이동)와 Shift + Tab(이전으로 이동)키로 확인해볼 수 있다.
    초점 이동 순서가 순환적이며, 반복적이어야 한다.
    페이지에 포함된 모든 링크, 버튼, 입력창에 초점이 가야한다.
    사용자가 사용할 수 없는 비활성 요소(버튼, 입력창 등)에는 초점이 가지 않아야 한다.
    3. 조작 가능
    손떨림이 심하여 미세한 조작이 어려운 경우와 같이 운동 장애가 있는 경우에도 사용자 입력 및 컨트롤은 조작이 가능하도록 제공되어야 한다. 4. 응답시간 조절
    웹 콘텐츠 제작 시 시간제한이 있는 콘텐츠는 가급적 포함하지 않는 것이 바람직하며, 보안 등의 사유로 시간제한이 반드시 필요할 경우에는 이를 회피할 수 있는 수단을 제공해야 한다.(일시 정지 등)
    5. 정지기능 제공
    자동으로 변경되는 콘텐츠는 움직임을 제어할 수 있어야 한다.
    6. 깜빡임과 번쩍임 사용 제한
    초당 3~50회 주기로 깜빡이거나 번쩍이는 콘텐츠를 제공하지 않아야 한다.
    7. 반복영역 건너뛰기
    콘텐츠의 반복되는 영역은 건너뛸 수 있어야 한다.(스킵 네비게이션)
    8. 제목 제공
    페이지, 프레임, 콘텐츠 블록에는 적절한 제목(헤딩 태그)을 제공해야 한다.
    9. 적절한 링크 텍스트
    링크 텍스트는 용도나 목적을 이해할 수 있도록 제공해야 한다.(새창 열림 및 더보기)

    이해의 용이성 – 사람이 명확하고 단순한 언어로 사용할 수 있다.

    1. 기본언어 표시
    주로 사용하는 언어를 명시해야 한다. 웹 페이지에 주로 사용하는 언어를 <html> 요소에 lang 속성을 지정하여 명시
    2. 사용자 요구에 따른 실행
    사용자가 의도하지 않은 기능(새 창, 초점 변화 등)은 실행되지 않아야 한다.
    3. 콘텐츠 선형구조
    콘텐츠는 논리적인 순서로 제공해야 한다. 콘텐츠 및 마크업이 논리적인 순서로 구성해야 한다.
    4. 표의 구성
    표는 이해하기 쉽게 구성 및 captionscope을 꼭 명시해 준다. 복잡한 표의 경우 id, header 를 사용한다.
    5. 레이블 제공
    입력 서식에는 대응하는 레이블을 제공해야 한다.
    6. 오류정정
    입력 오류를 정정할 방법을 제공해야 한다.

    견고성 – 사람들이 다른 보조 기술을 사용할 수 있다.

    1. 마크업 오류 방지
    마크업 언어의 요소는 열고 닫음, 중첩 관계 및 속성 선언에 오류가 없어야 한다.
    2. 웹어플리케이션 접근성 준수
    콘텐츠에 포함된 웹 애플리케이션은 접근성이 있어야 한다.

    대비해야 할 대표 기술 8가지

    1. 시멘틱 마크업

    W3C는 텍스트를 시각적으로 표현하는 태그보다 프로그램적으로 의미를 전달할 수 있는 시멘틱 마크업 사용을 권장한다. 웹 사이트는 결론적으로 ‘웹으로 된 문서’이기 때문이다.

    예시

    1. 보통 아이콘을 <i> 태그를 사용하지만 이 태그는 이태릭체를 의미하는 태그이다. 아이콘으로 쓰지 말도록 하자. 의미가 없는 태그는 가상선택자(:after, :before)를 이용하며, 의미가 있는 태그는 <span> 태그 등에 대체 텍스트를 활용해 준다.
    2. <b> 태그는 강조보단 두껍게를 의미하는 태그이다. <i> 태그와 마찬가지로 사용을 지양하며, 강조의 의미인 <strong><em> 태그를 사용하도록 하자.
    3. 쇼핑몰 사이트의 10,000원 이런 형태의 가격표를 많이 보았을 것이다. 이 경우 <del> 태그를 사용하면 스크린리더기가 10,000원 뒤에 ‘삭제’ 라고 읽어준다. 이런식으로 의미론적인 태그를 사용하여 마크업을 작성하도록 하자.

    2. 텍스트를 포함하는 이미지

    W3C는 특별한 경우를 제외하고는 텍스트를 이미지 형태로 제공하지 않도록 권장한다. 텍스트 이미지는 사용자의 요구사항에 따라 시각적으로 사용자 정의될 수 있어야 한다. 예를 하나 들면 번역을 해야 되는 경우가 있다. 꼭 이미지로 사용해야 하는 경우에는 대체 텍스트를 꼭 사용해주도록 한다.(alt 속성 등)

    3. 텍스트 명도대비

    W3C는 기본적으로 텍스트와 배경과의 명도대비는 최소한 4.5 : 1 을 제공하도록 권장한다. 대신 비활성 상태의 인터페이스 요소나 텍스트, 순수한 장식, 로고 또는 상표명에 포함된 텍스트의 경우, 그림의 일부인 텍스트의 경우 어떠한 명도대비 요구사항도 없다. 명도 대비 검사는 Contrast Finder에서 테스트해볼 수 있다.

    4. 비 텍스트 명도대비

    W3C는 UI요소 및 그래픽 콘텐츠에 한에서 명도대비를 3:1을 제공하도록 권장하고 있다. 예를들어 그래프의 경우 명도가 비슷한 색 끼리 맞닿은 경우 닿는면 사이를 흰색 라인으로 처리를 해준다. 색애 무관한 콘텐츠 인식에서 예시를 확인할 수 있다.

    5. WAI-ARIA

    정적인 HTML과 단순한 JavaScript 환경이 아닌 동적인 JavaScript 및 Ajax와 같은 기술을 사용한 환경에서 스크린리더 및 보조기기등이 접근성 및 상호 운용성을 향상시키기 위하여 탄생되었으며, 역할(Role), 속성(Property), 상태(State) 정보를 추가하여 이를 개선 할 수 있도록 제공하고 있다. W3C가 권장을 하고 있지만, 느리다는 단점이 있다.

    6. 반응형 웹

    콘텐츠는 정보 또는 기능 손실 없이, 2차원 스크롤 없이 제공해야 한다. 2차원 스크롤을 이용해 본 사람은 알겠지만 콘텐츠 이용이 상당히 불편하다. 2차원 스크롤은 아래을 의미한다.

    • 가로 320px 넓이에서 가로 스크롤이 없이 수직으로 스크롤
    • 세로 256px 높이에서 세로 스크롤이 없이 수평으로 스크롤

    7. 동영상 실시간 자막

    동영상 제공 시 W3C는 특별한 경우를 제외하고 동기화된 자막을 제공하도록 권장한다. 단, 미디어가 텍스트에 대한 대체수단이 분명히 명시된 경우는 예외이다. 되도록이면 대화, 해설, 효과음 등의 자막 스타일을 다르게 하여 나타내는 것도 하나의 방법이다. 동영상 자막의 경우 게임 분야가 상당히 잘 되어있다. 청각 장애와 난청을 위한 게임 만들기에서 좋은 예시를 볼 수 있다.

    8. 자동완성기능

    입력칸의 목적성을 규정하여 각각의 입력 필드가 가지는 의미는 계획하에 결정되어야 한다. 다른 말로 하면, 사용자들로부터 어떤 값들이 입력되길 기대하는지, 혹은 입력된 정보의 의미가 무엇인지를 나타내는 코드가 필요하다. 이를 정확하게 하면 사용자의 브라우저가 이전에 사용자가 입력한 데이터들을 활용하여 미리 해당 입력 필드를 자동적으로 채우는 것을 가능하게 해준다.

    결론

    기술이 필요한 궁극적인 이유는 사람이다. 정보 접근성 준수 기술은 사용자를 이해하고 배려하는 것에서 시작된다. 웹 접근성을 꼭 준수하도록 하자

    References

    네이버 접근성 가이드
    다음 접근성 가이드
    웹 접근성이란?
    웹 접근성의 이해
    장애인차별금지 및 권리구제 등에 관한 법률
    한국형 웹 콘텐츠 접근성 지침 2.1
    [인식의 용이성] 1.3.1. 색에 무관한 콘텐츠 인식
    [웹표준]WCAG 2.1 가이드라인
    한국웹접근성성인인증평가원

  • [SASS] SASS 중첩(Nesting), 변수(Variables), 가져오기(Import)

    [SASS] SASS 중첩(Nesting), 변수(Variables), 가져오기(Import)

    중첩(Nesting)

    SASS는 중첩기능을 사용할 수 있다. 상위 선택자의 반복을 피할수 있어 좀 더 편리하게 복잡한 구조를 작성할 수 있다.

    SCSS

    .wrap {
        width: 100%;
        .list {
            padding: 20px;
            li {
                color: red;
            }
        }
    }
    

    Compiled to

    .wrap {
      width: 100%;
    }
    .wrap .list {
      padding: 20px;
    }
    .wrap .list li {
      color: red;
    }
    

    상위 선책자 참조

    중첩 안에서 &키워드는 상위(부모) 선택자를 참조한다.

    SCSS

    .wrap {
        width: 100%;
        &.active {
            color: red;
        }
    }
    

    Compiled to

    .wrap {
      width: 100%;
    }
    .wrap.active {
      color: red;
    }
    

    & 키워드는 상위 선택자를 참조했기 때문에 아래와 같이 응용이 가능하다.

    SCSS

    .wrap {
        width: 100%;
        &-small { font-size: 12px; }
        &-medium { font-size: 14px; }
        &-large { font-size: 16px; }
    }
    

    Compiled to

    .wrap {
      width: 100%;
    }
    .wrap-small {
      font-size: 12px;
    }
    .wrap-medium {
      font-size: 14px;
    }
    .wrap-large {
      font-size: 16px;
    }
    

    중첩 벗어나기

    중첩에서 벗어나고 싶을 때 @at-root키워드를 사용한다. 중첩 안에서 생성하되 중첩 밖에서 사용해야 하는 경우에 유용하다.

    SCSS

    .list {
        width: 100px;
        li {
            width: 50px;
            @at-root .box {
                width: 10px;
            }
        }
    }
    

    Compiled to

    .list {
      width: 100px;
    }
    .list li {
      width: 50px;
    }
    .box {
      width: 10px;
    }
    

    중첩된 속성

    font-, margin- 등과 같이 동일한 네임 스페이스를 가지는 속성들은 아래와 같이 사용할 수 있다.

    SCSS

    .wrap {
        font: {
            weight: bold;
            size: 12px;
            family: sans-serif;
        };
        margin: {
            top: 10px;
            left: 20px;
        };
        padding: {
            bottom: 20px;
            right: 10px;
        }
    }
    

    Compiled to

    .wrap {
      font-weight: bold;
      font-size: 12px;
      font-family: sans-serif;
      margin-top: 10px;
      margin-left: 20px;
      padding-bottom: 20px;
      padding-right: 10px;
    }
    

    변수(Variables)

    반복적으로 사용되는 값을 변수로 지정할 수 있다. 변수 이름 앞에는 항상 $를 붙인다.

    $변수이름: 속성값;
    

    SCSS

    $color-code: #000;
    $url: "/common/images/";
    $w: 200px;
    
    .wrap {
        color: $color-code;
        background-image: $url;
        width: $w;
    }
    

    Compiled to

    .wrap {
      color: #000;
      background-image: "/common/images/";
      width: 200px;
    }
    

    변수의 유효범위

    변수는 사용 가능한 유효범위가 있다. 선언된 블록({}) 내에서만 유효범위를 가진다.

    SCSS

    .wrap {
        $w: 100px;
        .box {
            width: $w;
        }
    }
    
    // Error
    .box2 {
        width: $w;
    }
    

    변수 $w.wrap의 블록 안에서 설정되었기 때문에, 블록 밖의 .box2에서 사용할 수 없다.

    변수 재 할당

    아래처럼 변수에 변수를 할당할 수 있다.

    SCSS

    $red: #FF0000;
    $color-code: $red;
    
    .box {
        color: $color-code;
    }
    

    Compiled to

    .box {
      color: #FF0000;
    }
    

    전역 설정

    !global 플래그를 사용하면 변수의 유효범위를 전역(Global)로 설정할 수 있다. 대신 기존에 사용하던 같은 이름의 변수가 있을 경우 값이 덮어져 사용된다.

    SCSS

    .box {
        $w: 100px !global;
        width: $w;
    }
    .box2 {
        width: $w;
        $w: 200px !global;
    }
    .box3 {
        width: $w;
    }
    

    Compiled to

    .box {
      width: 100px;
    }
    
    .box2 {
      width: 100px;
    }
    
    .box3 {
      width: 200px;
    }
    

    초기값 설정

    !default 플래그는 할당되지 않은 변수의 초깃값을 설정한다. 즉, 할당되어있는 변수가 있다면 변수가 기존 할당 값을 사용한다.

    SCSS

    $w: 100px;
    
    .box {
        $w: 200px !default;
        width: $w;
    }
    

    Compiled to

    .box {
      width: 100px;
    }
    

    변수와 값을 설정하겠지만, 혹시 기존 변수가 있을 경우 현재 설정하는 값은 사용하지 않겠다는 의미로 쓸 수 있다.

    문자 보간

    #{}를 이용하여 코드의 어디든지 변수 값을 넣을 수 있다.

    SCSS

    $family: unquote("Droid+Sans");
    @import url("http://fonts.googleapis.com/css?family=#{$family}");
    

    Compiled to

    @import url("http://fonts.googleapis.com/css?family=Droid+Sans");
    

    가져오기(Import)

    CSS에는 현재 파일에 다른 CSS를 불러오는 @import라는 속성이 있다. 이 속성을 사용하면 의도에 따라 코드를 잘게 쪼개어 효율적으로 유지 보수할 수 있지만, @import로 선언되어 있는 CSS마다 http 요청을 발생하므로 웹페이지 성능 저하의 원인이 된다 하여 사용을 지양하고 있다. SASS에서도 다른 파일을 불러올 수 있는 @import가 있다. CSS의 @import와 다른 점은 여러개의 SASS파일은 @import해도 최종적으로 하나의 CSS로 컴파일해주기 때문에 성능에 영향을 주지 않고 코드를 여러 파일로 나누어 관리할 수 있다. 물론 @import된 파일에서 정의된 내용은 부모 SASS 파일에서도 사용할 수 있다.

    // 작성 방법 : @import "파일명.scss" 또는 @import "파일명";
    @import "reset";
    @import "reset.scss";
    

    참고로 .scss파일을 @import할 경우, .scss 확장자를 써주지 않아도 된다.

    Partials

    만약 .scss파일 앞에 언더바(_)로 시작하면 CSS파일로 따로 컴파일 되지 않는다. html에서 해당 CSS파일을 불러올일이 없고, @import만 필요한 경우에는 이 기능을 사용하면 된다.

    References

    Sass(SCSS) 완전 정복!
    Sass 기초와 활용
    [사스(Sass)] 2. Sass 사용법
    CSS 전처리기
    Sass는 SCSS로 쓰세요
    [사스(Sass)] Sass 기본 사용법 (컴파일 및 명령어)

  • [HTML] 입력 서식 관련 접근성

    [HTML] 입력 서식 관련 접근성

    2019년 11월 22일 정보접근성 기술 컨퍼런스를 다녀온뒤 세미나 내용을 정리 및 입력 서식 관련 접근성 대비에 관련한 내용이다.

    입력 서식 관련 접근성

    1. 레이블이 시각적으로 노출된 경우

    <label>for<input>id를 동일하게 맞추어 준다. <label>을 클릭하면 해당 폼으로 커서가 이동한다.

    HTML

    <label for="usr_id">아이디</label>
    <input type="text" id="usr_id" />
    

    결과

    2. 레이블이 시각적으로 노출되지 않은 경우

    <input>태그만 있는 경우는 title속성을 꼭 명시하여 스크린 리더기가 인식할 수 있도록 한다.

    HTML

    <input type="text" id="usr_id" title="아이디" />
    

    스크린 리더기 소리: “아이디 편집 창”

    3. 읽기 전용 편집 창인 경우

    title속성을 넣어주지 않으면 해당 편집 창의 제목을 건너 띄고 결과값만 읽는다. 꼭 title속성을 써주도록 한다.

    HTML

    <input type="text" readonly="readonly" value="25" />
    

    스크린 리더기 소리: “25 읽기전용 편집 창”

    <input type="text" readonly="readonly" value="25" title="나이" />
    

    스크린 리더기 소리: “나이 25 읽기전용 편집 창”

    4. placeholder가 있는 경우

    placeholder는 보조 수단으로 레이블 대체가 불가능하다. 이 역시 title속성을 꼭 넣어주도록 한다.

    HTML

    <input type="text" placeholder="user@naver.com" />
    

    스크린 리더기 소리: “user@naver.com 편집 창”

    <input type="text" placeholder="user@naver.com" title="이메일" />
    

    스크린 리더기 소리: “이메일 편집 창”

    5. 다수의 입력 서식이 존재하는 경우

    title속성에 입력 내용 및 자리수까지 상세히 명시한다.

    HTML

    <input type="text" placeholder="년(4자)" title="태어난 년도 4자리" />
    <input type="text" placeholder="월" title="태어난 월" />
    <input type="text" placeholder="일" title="태어난 일" />
    

    6. id, for가 명시되어 있지 않고 암묵적 레이블로 제공하는 경우

    최신 버전의 스크린 리더기는 암묵적 레이블을 읽어 주긴 하지만 역시 많은 스크린 리더기 사용에 문제가 발생하고 있어 꼭 명시적으로 레이블을 사용하기를 권장하고 있다.

    HTML

    <label>
        아이디
        <input type="text">
    </label>
    

    스크린 리더기 소리: “아이디 편집 창”

    7. 커스터마이징이 되어 있는 경우

    커스터마이징이 되어있는 입력서식의 경우 키보드를 이용한 조작이 필수며, 마크업 형태는 기본서식과 동일하도록 권장하고 있다.(예: 라디오 버튼의 경우 키보드 좌, 우 버튼으로 조작 가능)
    복잡한 입력서식의 경우 아리아로 구현이 가능하지만 느리다는 단점이 있다.

    접근성 교육 및 솔루션

    부스트코스 웹 접근성 강의

    웹 접근성 이해라는 사이트에서 웹 접근성 강의를 보다 쉽게 배울 수 있다.

    References

    웹 접근성 이해
    레진 웹 접근성 가이드라인

  • [SASS] SASS 연산(Operations)

    [SASS] SASS 연산(Operations)

    SASS는 기본적인 연산 기능을 지원한다. 레이아웃 작업시 상황에 맞게 크기를 계산하거나 정해진 값을 나눠서 작성할 경우 유용하다. 아래는 SASS에서 사용 가능한 연산자 종류이다.

    산술 연산자

    종류설명주의사항
    +더하기
    빼기
    *곱하기하나 이상의 값이 반드시 숫자(Number)
    /나누기오른쪽 값이 반드시 숫자(Number)
    %나머지

    비교 연산자

    종류설명
    ==동등
    !=부등
    <대소 / 보다 작은
    >대소 / 보다 큰
    <=대소 및 동등 / 보다 작거나 같은
    >=대소 및 동등 / 보다 크거나 같은

    논리 연산자

    종류설명
    and그리고
    or또는
    not부정(반대)

    숫자

    일반적으로 절대값을 나타내는 px단위로 연산을 하지만, 상대적 단위(%, em, vw 등)의 연산의 경우 calc()로 연산 해야 한다.

    width: 50% - 20px;  // 단위 모순 에러(Incompatible units error)
    width: calc(50% - 20px);  // 연산 가능
    

    나누기 연산의 주의사항 CSS는 속성 값의 숫자를 분리하는 방법으로 /를 허용하기 때문에 /가 나누기 연산으로 사용되지 않을 수 있다. 아래 예제를 보면 나누기 연산자만 연산 되지 않고 그대로 컴파일된다.

    SCSS

    div {
        width: 20px + 20px;  // 더하기
        height: 40px - 10px;  // 빼기
        font-size: 10px * 2;  // 곱하기
        margin: 30px / 2;  // 나누기
    }
    

    Compiled to

    div {
      width: 40px;
      height: 30px;
      font-size: 20px;
      margin: 30px/2; // Error
    }
    

    따라서 /를 나누기 연산 기능으로 사용하려면 다음과 같은 조건을 충족해야 한다.

    • 값 또는 그 일부가 변수에 저장되거나 함수에 의해 반환되는 경우
    • 값이 ()로 묶여있는 경우
    • 값이 다른 산술 표현식의 일부로 사용되는 경우

    SCSS

    div {
        $x: 100px;
        width: $x / 2; // 변수에 저장된 값을 나누기
        height: (100px / 2); // 괄호로 묶여있는 경우
        font-size: 10px + 12px / 3; // 더하기 연산자와 같이 사용
    }
    

    Compiled to

    div {
      width: 50px;
      height: 50px;
      font-size: 14px;
    }
    

    문자

    문자 연산에는 +가 사용된다. 문자 연산의 결과는 첫번째 피연산자를 기준으로 한다. 첫번째 피연산자에 따옴표가 붙어있다면 연산 결과를 따옴표로 묶는다. 반대로 첫번째 피연산자에 따옴표가 붙어있지 않으면 연산 결과도 따옴표를 처리하지 않는다.

    SCSS

    div::after {
        content: "hello" + world;
    }
    div::after {
        content: hello + "world";
    }
    

    Compiled to

    div::after {
      content: "helloworld";
    }
    
    div::after {
      content: helloworld;
    }
    

    색상

    색상도 연산이 가능하다.

    논리

    SASS의 @if조건문에서 사용되는 논리 연삭에는 그리고, 또는, 부정이 있다. 자바스크립트의 &&, ||, !와 같은 기능이라 보면 된다.

    SCSS

    $width: 90px;
    div {
      @if not ($width > 100px) {
        height: 300px;
      }
    }
    

    Compiled to

    div {
      height: 300px;
    }
    

    References

    Sass(SCSS) 완전 정복!
    Sass 기초와 활용
    [사스(Sass)] 2. Sass 사용법
    CSS 전처리기
    Sass는 SCSS로 쓰세요
    [사스(Sass)] Sass 기본 사용법 (컴파일 및 명령어)

  • [VIM] VIM 명령어

    [VIM] VIM 명령어

    VIM 명령어 정리

    vi 실행

    명령어동작
    # vi filefile을 연다.
    # vi file1 file2file1 과 file2 를 차례로 연다.
    # view filefile을 읽기 모드로 연다.
    # vi -R filefile을 읽기 모드로 연다.
    # vi + filefile을 열때 커서가 file 본문의 마지막 행에 위치한다.
    # vi +n filefile을 열어 n행에 위치한다.
    # vi -r file손상된 파일 회복

    입력모드 전환

    명령어동작
    # i커서 있는데서 입력모드 전환
    # I커서 왼쪽, 행의 처음에 몬자 삽입
    # a커서 있는 줄 끝에서 입력모드 전환
    # A커서 오른쪽, 행의 끝에 문자 삽입
    # o커서 있는 줄 아래에 빈 줄 삽입
    # O커서 있는 줄 위에 빈 줄을 삽입
    # R덮어쓰기 모드로 전환

    커서 이동

    명령어동작
    # ^, 0줄의 처음으로 이동
    # $줄의 끝으로 이동
    # H화면 맨 위로 이동
    # M화면의 중간으로 이동
    # L화면 맨 아래로 이동
    # w다음 단어 끝으로 커서 이동
    # e다음 단어 앞으로 커서 이동
    # b이전 단어로 이동
    # shift + ↑한 페이지 앞으로 이동
    # shift + ↓한 페이지 뒤로 이동
    # 3l, 3G현재 커서 위치한 행에서 3번째 행으로 이동
    # ctrl + i한 화면 위로 이동
    # ctrl + b한 화면 아래로 이동
    # ctrl + d반 화면 위로 이동
    # ctrl + u반 화면 아래로 이동
    # ctrl + e한 줄씩 위로 이동
    # ctrl + y한 줄씩 아래로 이동

    삭제

    명령어동작
    # x한 문자 삭제
    # 5x커서가 있는 위치부터 5개의 문자를 삭제
    # d + ↑커서있는 줄, 윗줄 2줄 삭제
    # d + ↓커서잇는 줄, 아래줄 2줄 삭제
    # dw한 단어 삭제
    # dd한 줄 삭제
    # 5dd커서가 있는 라인부터 5개의 라인 삭제
    # db커서의 위치에서 거꾸로 한 단어 삭제
    # D한줄 내에서 커서있는 뒤 모두 삭제
    # u바로 전에 수행한 명령을 취소
    # :5,10 d5~10번째 행 삭제

    복사와 붙여넣기

    명령어동작
    # yy현재 줄을 버퍼로 복사
    # p버퍼에 있는 내용을 커서 뒤에 삽입
    # P버퍼에 있는 내용을 커서 앞에 삽입
    # 3y현재 줄에서부터 아래로 3줄 복사
    # :5, 10y5~10줄을 버퍼로 복사
    # :30pu30행에 버퍼 내용을 삽입
    # d현재 커서가 위치해 있는 단어 복사
    # 3yy현재 행을 기준으로 3번째 행까지 n행 복사

    문자열 찾기

    명령어동작
    # /namename 문자열 찾기
    # n다음 name으로 이동
    # Nn과 같으며 역방향으로 이동

    문자열 대체

    명령어동작
    # :s/str/rep현재 행의 str을 rep로 대체
    # :l,.s/str/rep/1부터 현재 행의 str을 rep로 대체
    # :%s/str/rep/g파일 전체 str을 rep로 전부 대체
    # :.$/aaa/bbb커서의 위치로부터 파일의 끝까지 있는 모든 aaa를 bbb로 대체

    파일 저장 및 불러오기

    명령어동작
    # :w지정된 파일에 저장
    # :wq, :x, ZZ지정된 파일에 저장하고 vi를 종료
    # :w php.iniphp.ini 파일에 저장
    # :q저장하지 않고 종료
    # :q!저장하지 않고 강제 종료
    # :wq php.iniphp.ini에 저장하고 vi를 종료
    # :r php.iniphp.ini의 내용을 현재 커서가 있는데로 불러온다.
    # :e php.ini현재의 화면을 지우고 새로운 파일 php.ini를 불러온다.
    # :5,10 w php.ini5~10 줄까지의 내용을 php.ini에 저장

    기타

    명령어동작
    # :set nu행 번호 보여주기
    # :set nonu행 번호 보여주기 취소
    # .바로 전에 실행한 명령어 재 실행
    # ctrl + l불필요한 화면 정리후 다시 표시

    References

    Linux 문서편집기 vi, vim 명령어 정리

  • [JavaScript] ES5(ECMAScript 5)

    [JavaScript] ES5(ECMAScript 5)

    ECMAScript(ES)의 정의

    ECMAScript(ES)는 Ecma 인터내셔널의 ECMA-262 기술 규격에 정의된 표준화된 스크립트 프로그래밍 언어이다. 자바스크립트를 표준화하기 위해 만들어졌고 지금도 자바스크립트가 제일 잘 알려져 있지만, 액션스크립트와 J스크립트 등 다른 구현체도 포함하고 있다. ECMA스크립트는 웹의 클라이언트 사이드 스크립트로 많이 사용되며 Node.js를 사용한 서버 응용 프로그램 및 서비스에도 점차 많이 쓰이고 있다.

    ES5(ECMAScript 5)

    자바스크립트는 계속해서 발전하며 기술이 추가되었고, 새로운 표준이 발표될 때 마다 ECMAScript 1, 2, 3, 4, 5, 6 … 뒤에 숫자를 붙여서 명명하였다. 우리가 기존에 쓰고 있는 JavaScript는 2009년에 발표된 ECMAScript 5(ES5)라고 생각하면 된다. ES5는 IE9에서 use strict를 지원하지 않는 것 빼고는 대부분의 브라우저 버전에서 ES5 문법을 지원한다.

    ES5에서 추가된 메서드 및 키워드

    References

    [Javascript] ES5 (ECMAScript 5)
    자바스크립트 Array forEach
    ECMA스크립트