Markdown(마크다운)을 웹페이지로 만들어주는 Markserv

Jekyll을 사용해서 글을 작성하는데, Generating 하는 시간이 너무 오래 걸려서 글 작성에 집중 하기 어려웠다. 그래서 레이아웃이나 플러그인에 의해 Generating 하는 것 없이 순수하게 Markdown 변환만 하고 싶었다.

요구조건:

  • Markdown 파일을 웹 서비스에서 html 파일 제공
  • 디렉토리 탐색 용이. 여러 파일 추가하고, 찾기 쉬워야 함.
  • Live reload
  • npm으로 설치 가능

npm에서 markserv라는 적당한 모듈 찾았다.

사용방법은 간단하다.

이렇게 하면 자동으로 브라우저가 열린다. 그리고 수정할 때 Live reload가 된다.

이제 Jekyll은 사이트에 배포할 때만 빌드하면 될 것 같다.

브라우저는 내가 직접 띄우고, 포트도 8484번으로 사용할 것이라서 최종 커맨드를 다음과 같이 했다.

Postgresql 기본 사용 방법과 자주사용하는 쿼리 모음

Postgresql을 사용하면서 자주 사용하거나 알면 좋을만한 내용을 정리했다.

CLI 도구 psql

내 PC에서 연결 가능한 서버는 pgAdmin을 쓰겠지만, 그렇지 않다면 서버에서 psql을 사용해야한다.

접속은 다음과 같은 식으로 할 수 있다.

데이터베이스 조회

스키마 조회

테이블 조회

기타

모르는 영어 단어, Idiom 정리

영어로 된 글을 보다가 모르고, 헤깔리는 단어나 idiom을 기록했다.

단어

Ramp-Up

명사.

jMeter를 사용하다가 본 Phrase다.

Meririam-Webster에서는 Buildup, Increase라고 정의되어 있다. 네이버 어학사전에서는 “상승”으로 수집한 내용도 있다.

creation

역시 jMeter에서 본 Phrase다.

이게 자연스러울 것 같다.

기타

  • ultimate : 최후의, 최고의
  • labour : (육체적인) 노동
  • intuit : (격식) 직감[직관]하다
  • Subsequently : 그 뒤에, 나중에
  • Gamification : 게임과 연관된 개념을 활용하는 것
  • tease : 집적거리다. 놀리다.
  • exploit : 이용하다, 활용하다
  • gracefully : 기품있게, 우아하게, 정중하게, 적절하게
  • pants-on-head : 강렬하게, 격하게, 열정적으로, 열심히, 몹시
  • cohort : 지지자
  • abundantly : 아주 분명하게
  • marooned : 남겨진, 고립된
  • integral : 필수적인
  • forge : 구축하다
  • veritable : 진정한
  • on the fly : 즉시
  • ongoing : 계속 진행중인(명사 앞에 씀)
  • extraneous : (특정 상황이나 주제와) 관련 없는
  • shower thought : cool
  • overkill : 과잉

약어

  • IMO : in my opinion
  • PFA : Please find attached ~ 첨부된(동봉된) ~을 확인해 주십시오.

Idiom

작성 예정

JMETER를 사용하면서 알게 된 내용과 옵션의 의미 정리

JMeter를 사용해서 사이트를 테스트하면서 작성한 내용이다.

Redirect Limit 변경하기

Jmeter는 기본적으로 1회에 리다이렉트가 다섯 번 이상 발생하면, 다음과 같은 에러를 출력하면서 종료가 된다.

이것은 설정파일을 변경해서 해결할 수 있다. 5회에서 100회로 바꿨다.

jmeter가 실행파일과 같은 디렉토리에서 httpclient.parameters:

HTTP 쿠키 사용하기

스레드의 한 주기에 Redirect가 여러번 발생할 수 있는 테스트를 진행해야 했다. 여러 요청을 해야하는 상황인데, 서버에서 쿠키를 생성해도 각 요청마다 새로운 세션으로 인식해서 테스트에 문제가 있었다. 즉, 이런 상태였다.

  • Thread1-1
    • Req 1 (Session 1)
    • (302) Req 2 (Session 2)
    • (302) Req 3 (Session 3)
    • (302) Req 4 (Session 4)
  • Thread2-1
    • Req 1 (Session 5)
    • (302) Req 2 (Session 6)

내가 원하는 것은:

  • Thread1-1
    • Req 1 (Session 1)
    • Req 2 (Session 1)
    • Req 3 (Session 1)
    • Req 4 (Session 1)
  • Thread2-1
    • Req 1 (Session 2)
    • Req 2 (Session 2)

다음과 같은 구조로 테스트 플랜을 구성해서 해결했다.

  • Thread Group
    • HTTP Request
      • HTTP Cookie Manager (Clear cookies each iteration?옵션 체크)

주요 설정의 의미

Thread Group

설정 의미
Number of Threads (users) 동시 요청하는 스레드 수
Ramp-Up Period (in seconds) 상승 시간 (초 단위로). 한 주기가 어느 정도 간격을 두고 실행될지를 정하는 옵션.
Loop Count 얼마나 반복할지
Delay Thread creation until needed 필요할 때까지 지연 스레드
Scheduler 시작 시간, 종료시간, 기간과 시작시 지연을 설정할 수 있다.

HTTP Request

설정 의미
Redirect Automatically Redirect가 http 프로토콜스택에 의해 처리됨.
Follow Redirects Redirect가 JMeter에 의해 처리됨.

서브라임텍스트 특정 확장자에 Syntax 지정하기(PlantUML)

다이어그램을 그리기 위해 PlantUML을 사용하고 있다. PlantUML 파일을 수정할 때, 실시간으로 그려진 다이어그램을 볼 수 있다는 장점 때문에 평소에 Atom 에디터를 사용했었다. Atom을 사용하는 이유는 이것밖에 없었다. 그래서 가능하면 이 작업도 서브라임텍스트로 할 수 있었으면 좋겠다고 생각했다.

Atom을 사용하기 전에 서브라임에서 PlantUML 문법 지원을 위해 플러그인을 하나 사용한 적이 있다. 문법 하이라이트는 잘 지원하지만 내부적으로 plantuml java 프로세스가 실행하고, 저장할 때마다 새로운 이미지 파일을 계속 생성하는 방식이었다. 이런 점 때문에, Atom 에디터로 넘어가게 됐었다.

“Node.js 서버가 PlantUML 파일을 이미지 파일로 제공하는 건 어떨까?”란 생각을 했고, 그렇다면 에디터에서 파일을 수정하고, 브라우저로 확인하면 되므로, 파일이 생성되지 않아도 됐다.

그런데 기본 확장자가 wsd로 되어 있다. Atom에서는 puml을 사용해서 서브라임에서 이 파일들을 열면 Plain text로 나타난다. 확장자를 바꾸면 되지만, wsd보다는 puml이 plantuml이라는 것을 더 잘 표현하는 것 같아서 puml을 그대로 사용하고 싶었다.

방법은 플러그인의 설정파일만 변경하면 된다. 경로는 다음과 같다. 다른 플러그인도 비슷한 형태일 것으로 보인다.

puml이라고 되어 있는 부분을 추가하면 된다.

diagram.tmLanguage.xml:

그리고 에디터를 더 빠르게 사용하기 위해서 서브라임텍스트에서 기본적이고, 필수적인 기능(Lint, Syntax highlight)을 제외하고 플러그인 사용하는 부분을 최대한 안 쓰려 노력하고 있다.

Ruby에서 Bundler 사용하기

Bundler

Bundler는 정확히 필요한 gem과 그 gem의 버전을 설치하고, 추적하는 것으로 일관성 있는 Ruby 프로젝트를 제공하는 도구다. 그 기본적인 사용법에 대해 알아보겠다.

설치방법 :

이제 Gemfile을 프로젝트 루트 디렉토리에 만들어야한다.

다음 Bundler 커맨드를 사용할 수 있다.

gem 커맨드

다양한 gem을 여기서 찾을 수 있다.

서브라임텍스트에서 자바스크립트 파일 ES6 Syntax Highlight 설정하기

프로젝트를 진행할 때 자바스크립트를 사용하는데, 오래된 프로젝트는 ES3, ES5를 사용하고, webpack을 사용한 이후에는 ES6만 사용한다. 프로젝트에 따라 문법을 다르게 써야할 필요가 있는데, 서브라임에서는 기본적으로 한 확장자에 하나의 언어만 지원한다. 물론 변경할 수도 있지만 파일마다 변경해야해서 귀찮다. 그래서 찾은 플러그인이 sublime-project-specific-syntax이다.

이 플러그인을 사용하면, 프로젝트마다 syntax를 설정할 수 있다.

방법은 플러그인 설치 후 프로젝트에서 다음과 같이 설정하면 된다.

Project – Edit Project

Gitlab 관리와 관련된 노트. 관리자 비밀번호 바꾸는 방법.

gitlab을 관리하다가 발생했던 문제를 해결했던 방법에 대해 다룬다.

기본

gitlab 관리자 비밀번호 변경하는 방법

다음 ruby 코드를 입력한다.

로그인(sign-in) 못하는 경우

관리자 페이지에서 실수로 signin_enabled를 false로 만들었을 때, 복원하는 방법은 다음과 같다.

IE11에서 쿠키가 만들어지지 않는 문제

Nginx Lua Module을 개발하면서 크롬에서는 쿠키가 저장이 되는데, IE11에서는 쿠키가 저장되지 않는 문제가 발생했다.

몇 가지 점검해야할 부분이 있었다.

첫째, 서버 시간과 브라우저 시간이 일치하는지 확인해야한다. 쿠키 삭제를 클라이언트 시스템 시간 기준으로 하니까 서버와 클라이언트와 시간차이가 있는지 확인하는 것이 먼저다.

둘째, expires 필드의 날짜 포맷이 맞는지 확인한다.

정확한 포맷 :

비슷해 보였었는데, 약간 다른 부분을 확인했다.

그래서 포맷을 정확하게 바꿨다.

셋째, 도메인을 지정하지 않는 것이다. IE11에서는 도메인을 지정하지 말아야 한다.

넷째, max_age를 사용하지말고, expires를 사용하는 것이 좋다. Old IE에서 지원하지 않는다.

쿠키는 시간이 다른 문제를 교정하는데 문제가 있어서 결국, 쿠키의 expires로 만료시간을 지정하지 않고, nginx의 공유 메모리에 만료시간을 지정하는 방식을 썼다.

PHP로 개발하면서 작성한 노트

PHP로 개발하면서 작성한 노트다.

기본

Type

error_log

message_type:

  • 0 : PHP 시스템 로거
  • 1 : 이메일
  • 3 : 파일
  • 4 : SAPI 로깅 핸들러에 직접 로깅

Array

Foreach

Cookie

환경변수 $_SERVER

자주 사용하는 함수

array_unique

배열에서 중복된 값을 제거

extract

배열의 키와 같은 이름의 변수로 만들어주는 함수.

preg_quote

정규식 문자를 escape한다.

파일

시간

microtime float 형으로 변경하기

포맷에 맞게 datetime 출력

디자인 패턴

싱글톤 패턴

설정이나 Logger, DB를 다루는 클래스를 만들 때 자주 사용한다.

사용 방법:

PDO

PDO 메뉴얼

Monolog (로그 라이브러리)

로그를 남기기 위해 기본적으로 Monolog를 다음과 같이 사용할 수 있다.

이번에는 Monolog로 전역에서 사용할 수 있는 Logger를 만들겠다. 메뉴얼에 따르면 Registry라는 싱글톤을 사용해서 어디에서든 호출할 수 있다.

지금까지 StreamHandler로 예제를 만들었는데, 다음과 같은 핸들러를 사용할 수 있다.

Formatter를 설정하지 않으면 기본적인 포맷으로 로그가 기록된다. 이것을 원하는 형식으로 지정하려면 Handler에 Formatter를 설정해야한다.

PHP 에러로그 확인하기

아파치는 다음과 같은 형태로 로그 파일이 생성된다.

쉘에서 실행할 때는 ini 파일에서 로그 파일의 위치를 알아낼 수 있다.

CLI

파라미터 받는 방법

$argv 메뉴얼 페이지

php.ini 설정

exec 함수에 사용할 커맨드 제한하기

특정 디렉토리에 있는 커맨드만 실행할 수 있게 제한할 수 있다.

특정 함수 호출 제한

보안에 위협이 될만한 함수를 제한할 수 있다.

기타 이슈

phar로 빌드할 때 에러 발생

phar 파일을 만들 때, 파일을 압축하는 부분에서 다음 에러가 발생했다.

open file descriptor의 수를 확인하고, 너무 작으면 올려준다.

위 커맨드는 일시적으로 적용하는 것이라서 설정을 유지하려면 다음과 같이 설정파일을 이용하거나 profile 파일에 추가해야한다.