[카테고리:] IT

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

  • [Linux] 리눅스 MySQL 시작, 정지, 재시작, 상태확인

    [Linux] 리눅스 MySQL 시작, 정지, 재시작, 상태확인

    리눅스 MySQL 시작, 정지, 재시작, 상태확인

    작업우분투 명령어CentOS6 명령어CentOS7 명령어
    시작# service mysql start# service mysqld start# systemctl start mysqld
    정지# service mysql stop# service mysqld stop# systemctl stop mysqld
    재시작# service mysql restart# service mysqld restart# systemctl restart mysqld
    상태확인# service mysql status# service mysqld status# systemctl status mysqld

    References

    리눅스 MySQL 시작, 정지, 재시작, 상태확인

  • [CentOS] CentOS7 깃 설치 및 로컬 세팅

    [CentOS] CentOS7 깃 설치 및 로컬 세팅

    초기 설치 환경

    서버

    • Centos7
    • Nginx
    • MySQL5.7
    • PHP7.1

    로컬

    • Homestead

    Git 설치

    원격 저장소 만들고 ssh 접속하여 root권한으로 변경

    # su root
    

    yum을 이용해서 git 설치

    # yum install git-core
    

    yum을 이용해서 git 설치

    # yum install git-core
    

    설치된 영카트 디렉토리로 이동

    # cd /data/web_htdocs/
    

    깃 초기화

    # git init
    

    파일 상태를 확인해 깃이 잘 설치되어 있는지 확인

    # git status
    

    전역 사용자 등록(원격 저장소에 있는 아이디와 메일이 일치하도록 설정)

    # git config --global user.name "사용자 이름"
    # git config --global user.email "사용자 메일"
    

    원격 저장소 url을 복사하여 git에 연동

    # git remote add origin `원격 저장소 url`
    

    로컬 소스트리 클론

    원격 저장소 url 복사

    # git remote add origin `원격 저장소 url`
    

    설치할 디렉토리 경로 맞춘 뒤 클론

    # git remote add origin `원격 저장소 url`
    

    로컬 세팅

    Homestead.ymal 파일 열고 site 부분에

    map: 로컬 도메인 주소
    to: vagrant 경로 추가
    
    $ vagrant reload --provision
    $ sudo service nginx restart
    // (nginx 백업 필수 설정 다시 해줄것!)
    

    host 파일에 로컬주소 추가(관리자권한으로 실행)
    C:\windows\system32\drivers\etc

    실서버 디비 백업

    $ mysqldump -p db명 > 저장할 파일이름.sql
    

    해당 파일 찾아서 local DB인 Homestead에 넣어주기
    symlink(): Protocol error 에러 뜰경우

    Git Bash 를 관리자 권한으로 실행 후

    $ php artisan storage:link
    

    또는 관리자 권한으로 실행 후

    $ vagrant up
    

    한 다음 새로고침 해볼것

    배포 해보기

    로컬에서 소스 수정 후 commit, push 하고 쉘 접속하여 수정 부분 받기

    $ cd /data/web_htdocs/
    $ git pull
    

    error cannot open .git/fetch_head permission denied 에러 날경우 .git 파일의 권한이 root 여서 오류남, 일반 계정으로 변경 해야함, 루트 계정으로 접속

    $ su root
    Password: 패스워드 입력
    chown -R webapp:webapp /data/web_htdocs/.git
    ls -al 해당 파일 변경해준 권한인지 확인
    exit
    

    다시 git pull, 그래도 안된다면

    $ git pull origin master
    

    또는

    $ git branch --set-upstream-to=origin/master master
    $ git pull
    
  • [UI] 핀터레스트 레이아웃 구현하기

    [UI] 핀터레스트 레이아웃 구현하기

    핀터레스트 레이아웃 사용시 자바스크립트만으로 구현이 가능하다. Masonry 플러그인을 활용하면 좀더 다양한 인터렉션을 활용할 수 있지만 성능 및 블록 틀어짐 이슈 때문에 자바스크립트만 활용하였다.

    장점

    • 현재 화면에 나열된 요소들의 부모를 기준으로 posirion: absolute; top: y; left: x; 속성을 활용, 각 위치에 맞게 배치하여 제이쿼리 플러그인 필요 없이 자바스크립트만으로 구현하여 가볍다.
    • IE9까지 대응 가능 가능 하며, IE10까지만 대응한다면 top: y; left: x; 대신 transform: translate(x, y) 속성을 활용하면 성능이 좀 더 좋아진다.

    단점

    • 오직 레이아웃만 구현하여 Masonry 플러그인같은 인터렉션 효과는 없다.

    코드

    html

    <div class="cntBox">
        <div class="item">
            <div class="inner">
                <img src="img/img01.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
                    industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type
                    and scrambled it to make a type specimen book. It has survived not only five centuries, but also the
                    leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s
                    with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop
                    publishing software like Aldus PageMaker including versions of Lorem Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img02.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img03.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. It has survived not only
                    five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
                    was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
                    and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem
                    Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img04.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. It has survived not only
                    five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
                    was popularised in the 1960s with the release of of Lorem Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img03.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. It has survived not only
                    five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
                    was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
                    and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem
                    Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img04.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img01.jpg" />
                <p>Lorem Ipsum is simply dummy text of the of Lorem Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img02.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img01.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
                    industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type
                    and scrambled it to make a type specimen book. It has survived not only five centuries, but also the
                    leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s
                    with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop
                    publishing software like Aldus PageMaker including versions of Lorem Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img02.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img03.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. It has survived not only
                    five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
                    was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
                    and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem
                    Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img04.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. It has survived not only
                    five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
                    was popularised in the 1960s with the release of of Lorem Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img03.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. It has survived not only
                    five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
                    was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
                    and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem
                    Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img04.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img01.jpg" />
                <p>Lorem Ipsum is simply dummy text of the of Lorem Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img02.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img01.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
                    industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type
                    and scrambled it to make a type specimen book. It has survived not only five centuries, but also the
                    leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s
                    with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop
                    publishing software like Aldus PageMaker including versions of Lorem Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img02.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img03.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. It has survived not only
                    five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
                    was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
                    and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem
                    Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img04.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. It has survived not only
                    five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
                    was popularised in the 1960s with the release of of Lorem Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img03.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. It has survived not only
                    five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It
                    was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,
                    and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem
                    Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img04.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img01.jpg" />
                <p>Lorem Ipsum is simply dummy text of the of Lorem Ipsum</p>
            </div>
        </div>
        <div class="item">
            <div class="inner">
                <img src="img/img02.jpg" />
                <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry</p>
            </div>
        </div>
    </div>
    

    css

    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }
    
    .cntBox {
        position: relative;
        margin: 0 auto;
        width: 100%;
        max-width: 1200px;
    }
    
    .item {
        display: inline-block;
        position: absolute;
        width: 20%;
        padding: 5px;
    }
    
    .item img {
        width: 100%;
    }
    
    .item .inner {
        border: 3px solid #ccc;
        border-radius: 5px;
    }
    
    .item .inner p {
        padding: 10px;
    }
    

    javascript

    // 리사이즈 이벤트 한번만 실행
    // var timer = null;
    
    window.addEventListener('resize', function () {
    
        // 리사이즈 이벤트 한번만 실행
        // clearTimeout(timer);
        // timer = setTimeout(boxLayout, 150);
        boxLayout();
    
    }, false);
    
    window.addEventListener("load", function () {
        boxLayout();
    });
    
    function boxLayout() {
        var images = document.querySelectorAll(".item");
        var imgStack = [0, 0, 0, 0, 0];
        var boxW = document.querySelectorAll(".cntBox")[0].offsetWidth;
        var colWidth = boxW / imgStack.length;
        for (var i = 0; i < images.length; i++) {
            var minIndex = imgStack.indexOf(Math.min.apply(0, imgStack));
            var x = colWidth * minIndex;
            var y = imgStack[minIndex];
            imgStack[minIndex] += (images[i].offsetHeight);
    
            // images[i].style.transform = 'translateX(' + x + 'px) translateY(' + y + 'px)';
            images[i].style.left = x + 'px';
            images[i].style.top = y + 'px';
    
            if (i === images.length - 1) {
                document.querySelector(".cntBox").style.height = Math.max.apply(0, imgStack) + 'px';
            }
        }
    }
    

    References

    핀터레스트(Masonry) 스타일 레이아웃을 만드는 세 가지 방법

  • [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 명령어 정리

  • [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

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

  • [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 가이드라인
    한국웹접근성성인인증평가원

  • [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 파일 만들기

  • [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
    
  • [JavaScript] 디바이스 구분 스크립트

    [JavaScript] 디바이스 구분 스크립트

    어떤 디바이스로 접속했는지 확인 가능한 코드

    var filter = "win16|win32|win64|macintel|mac|"; // PC일 경우 가능한 값
    if (navigator.platform) {
        if (filter.indexOf(navigator.platform.toLowerCase()) < 0) {
            alert("모바일에서 접속하셨습니다");
        } else {
            alert("PC에서 접속하셨습니다");
        }
    }
    
  • [Vue] Cli 3.x를 이용한 Github페이지 만들기

    [Vue] Cli 3.x를 이용한 Github페이지 만들기

    정의 Vue Cli 2.x 버전을 이용하여 프로젝트를 생성하면 웹펙 설정파일이 자동으로 생성되지만 3.x 버전부터는 직접 만들어줘야 한다. 때문에 2.x 버전하고 방법이 약간 다르다.

    설치할 디렉토리로 가서 프로젝트를 생성해 준다.

    $ vue create 'ProjectName'
    

    프로젝트 폴더로 이동하여 원격 저장소에 연결시켜 준 뒤 푸쉬해준다.

    cd 'ProjectName'
    git remote add origin 'url'
    git push origin master
    

    코드를 빌드하면 dist 디렉토리에 출력되어도록 되어있기 때문에 vue.config.js 파일을 만들어서 설정을 변경해둔다. 우선 최상단 디렉토리에 vue.config.js파일을 생성해 준 뒤 아래 코드를 입력해준다. 원격 저장소의 프로젝트명과 동일하게 publicPath를 수정해준다.

    // vue.config.js 
    module.exports = {
        publicPath: '/ProjectName/',
        outputDir: 'docs'
    }
    

    빌드를 하면 /docs 디렉토리가 생성된다. 후에 최상단 디렉토리의 .gitignore 파일에 /dist 를 주석처리 해준다. 이제 깃에 푸쉬해준다.

    git add ./
    git commit -m "commit message"
    git push origin
    

    이제 깃허브로 들어가서 저장소 설정으로 간 뒤 GitHub Pages 항목에서 master branch /docs folder 를 셀렉해준다. 이제 https://[유저이름].github.io/[저장소이름] 으로 들어가면 뷰 페이지를 확인할 수 있다. (반영에 시간이 조금 걸린다. 당분간은 404가 표시되어있다.)

    References

    vue-cli で作ったサイトを GitHub Pages にデプロイする
    Deploy vue-cli 3 project to github pages