윈도우에서 python tensorflow 설치하다가 오류날때

아나콘다로 텐서플로우를 설치하는데, 의존성 라이브러리 설치하느라고 이것저것 다운받더니,,, 오류가 나서 멈춤. (설치가 오래 걸리길래 서핑좀 한것 뿐인데.ㅠ)

import tensorflow as tf 하니 오류가 주루룩…

pip install tensorflow  하면, 이미 패키지 다 설치했다고 함.

그래서 강제 재설치 진행

pip install –upgrade –force-reinstall tensorflow

제대로 다 설치됨..

import tensorflow as tf

두둥… 다 설치됨.

Facebook Comments

SphinxSearch (스핑크스) 설치 및 쿼리 테스트 + PHP 에서 사용-2

이전 포스트  http://blog.bongwork.com/archives/88  에서 sphinxsearch 설치와 설정을 하였습니다. 이제 PHP 에서 이를 이용하여 검색결과를 처리하는 방법을 알아보겠습니다. 이전 포스팅에서도 얘기드렸지만, 스핑크스는 mysql 프로토콜을 그대로 따라서 만들었기 때문에 php에서 mysql 쓰듯이 사용하면 됩니다. mysqli 로도 가능하고, PDO로 접속해도 됩니다. (이 글에서는 그냥 mysql 함수를 사용할것입니다.)

테이블은 g5_write_test 테이블입니다. 약 30만개의 영화정보 데이타를 미리 입력해두었습니다.(국내 데이타를 구하기 어려워서 영문으로 된 5천개짜리 데이타를 반복하여 입력했습니다.)

먼저 PHP(그누보드5) 에서 제목과 본문을 기준으로 검색합니다. 테스트 코드입니다.

 

두번째 sphinxsearch 를 이용한 검색 테스트입니다.

 

테스트 결과입니다. 개발용 서버임으로 외부에서 요청이 없는 상태라서, 임의로 request를 발생시킨 상태에서  페이지를 호출하였습니다. 페이지요청 때문에 검색결과수는 조금 다를수 있습니다.

 

접속자가 맣고, 검색작업이 많은 사이트에서는 더 큰 차이가 발생합니다. 

결론

sphinxsearch(스핑크스)를 사용하면, 사이트 내부검색으로 인하여 사이트가 느려지는 문제는 해결할수 있습니다. 물론 스핑크스를 도입했을때, 단점이 없는것은 아닙니다. 병합색인을 위한 추가 설정이 필요하고, 이에 따른 코드 수정도 필요합니다. 병합을 위하여 일정시간(대략 3-5분) 에 한번씩 병합색인을 위한 indexer 를 실행하여야 하고, 마지막 병합색인이 처리된 시간사이에 등록된 글이나 수정된 글은 검색이 안되는 문제가 있습니다. 사이트 성격에 따라 다르겠지만, 검색 결과는 몇분정도의 시간차는 발생해도 운영에 지장이 없습니다. 이런 문제보다 스핑크스를 씀으로써 얻는 이득이 크기 때문에 서비스에 이를 도입한다면 만족할거라 생각합니다. 

 

 

 

 

 

 

Facebook Comments

SphinxSearch (스핑크스) 설치 및 쿼리 테스트 + PHP 에서 사용-1

1 개요

보통 MySQL Database 를 이용하여 커뮤니티 사이트를 운영하다 보면, 사용자가 늘어거나, 컨텐츠가 늘어나는 시점에  검색이라는 계륵을 만나게 됩니다. 검색의 특성상 like 를 사용하게 되는데, 이게 빈도가 늘어나고, 범위가 늘어날수록 리소스를 많이 사용하게 됩니다. 보통 이정도 되면, 사이트 검색을 막어버리거나 사용자별 제한을 하게 됩니다. 검색을 없앨수도 없고, 그렇다고 적극 사용하게 할수도 없고, 계륵입니다.

2. 검색엔진

검색을 막을수는 없고, 꼭 넣어야 한다면, 1차적으로 해볼수 있는게 구글 내부검색입니다. 사용법도 간단하고, 성능도 좋습니다. 그러나 커스트마이징이 안됩니다. 구글검색결과 처럼 나옵니다. 

자체 검색이 가능하고, MySQL과 연동하여 사용할수 있는 검색엔진은 여러가지가 있으나, 이중 가장 편한 방법은 MySQL 의 full text search 입니다. 이것만 사용해도 검색 때문에 사이트 속도가 느려지는 문제는 해결할수 있습니다. 그러나, 검색엔진으로 사용하기에 기능이 부족합니다. 그 다음방법으로 성능이 좀더 뛰어나지만, 설치를 별도로 해야 하고, 설정을 좀 해야 하는 SphinxSearch 가 있습니다. 

3. SphinxSearch

SphinxSearch(스핑크스) 는 오픈소스로 된 풀텍스트 검색엔진입니다. 검색엔진이 기본적으로 갖춰야 하는 다양한 기능들이 있습니다. 기능에 대한 자세한 부분들은 공식 사이트나 구글링을 통해 확인을 해보시고, 이 글에서는 설치와 간단한 사용법을 포스팅합니다. 

MySQL에서 스핑크스를 쓸때 가장 큰 장점이 되는 부분은, MySQL 쿼리문 그대로 사용이 가능하다는 점입니다. connection 도 MySQL의 패킷 구조를 따라합니다. PHP 소스에서 MySQL과 동일하게 접속하고, MySQL 쿼리처럼 질의하면 됩니다. 그외 특징으로는 C++ 로 작성되어 있어서 검색속도가 빠르고, 분산처리가능, 동적 색인과 증분색인이 가능하다는 점입니다.

4. 환경구성

설치와 테스트는 CentOS 6 환경에서 이루어졌습니다. CentOS7 이나 Ubuntu 에서 설치 방식이 조금 다를수 있으나 설정파일은 동일합니다. 설치가 어렵지 않기 때문에, 설정만 유의 해서 보면 됩니다.

테스트를 위해 그누보드5를 사용했으며, 게시판 검색을 위해 게시판 데이타를 50만건가량 입력했습니다. 50만건 정도 되는 데이타를 구하기가 어려워,  https://www.kaggle.com/tmdb/tmdb-movie-metadata  cvs 데이타를 내려받아 php 코드로 여러번 반복 등록처리하였습니다. 해외 빅데이타 처리를 위한 샘플 데이타가 많은데, 그건 또 너무 커서 사용이 어려웠습니다.(GB 단위) 국내에서 샘플로 쓸 데이타는 찾질 못했네요.

5. 설치 및 설정

CentOS6의 경우 yum 레파지토리가 없어서, rpm 다운로드후 설치합니다. 

설치후 실행할려면  libmysqlclient.so.x 을 찾는 경우가 있는데,  이 경우 yum 으로 mysql client 를 설치후 vi /etc/ld.so.conf.d/mysql.conf 에 라이브리 경로를 입력하고, ldconfg 를 한번 실행주면 됩니다.

설치가 완료되었습니다. sphinx는 중요한 파일이 3가지가 있습니다. 

  1. indexer 
    • 색인을 수행하는 명령어입니다.
  2. searchd
    • 검색과 검색결과를 전송해주는 데몬입니다.
  3. sphinx.conf
    • 스핑크스 설정파일입니다. /etc/sphinx/sphinx.conf 에 위치합니다.

위의 설치 상태에서 실행해도 오류가 발생합니다. 이제 sphinx.conf 를 설정해야합니다.

설정할수 있는 부분들이 많은데, 실제 동작하는 설정파일을 보는게 좋습니다. 동작하도록 만들어둔뒤에 추가적인 설정을 하나씩 고쳐서 실행해보면서 기능을 익히도록 합니다. 아래 설정은 그누보드5에서 test 라는 게시판을 색인합니다. 실제 서비스에서는 여러테이블을 색인해야 하고, 병합색인과 관련된 설정과, 게시판 수정/삭제시 기존 색인문서를 삭제하는 기능도 추가되어야 합니다.

위 설정에서 mysql 접속정보를 제대로 넣어야 합니다. 127.0.0.1 로 접속할수 있는 계정이 설정되어야 하고, localhost 로 접속할때는 sql_sock  주석을 해제하고, mysql.sock 파일 경로를 넣으셔야 합니다. 제대로 설정하고, indexer를 실행해봅니다. 

indexer 가 제대로 동작하면, searchd 를 실행합니다. searchd 까지 정상 실행되면, 이제부터 검색을 할수가 있게 됩니다.

indexer 실행시 옵션이 있는데, -all 로 하면 전체 색인, –merge는 병합색인(이 경우 sphinx.conf 에 병합색인 관련 설정이 들어가야 합니다.) –rotate 는 searchd 데몬에 영향을 주지 않고, 색인을 하라는 옵션입니다.(searchd 가 실행중일때 indexer 를 그냥 실행하면 오류가 발생합니다.)

indexer board –rotate 는 board는 index 설정을 실행하라는 뜻입니다. (sphinx.conf 에 보시면 index board 는 설정 섹션이 있습니다.)

정상적으로 searchd가 실행되었으면,  mysql 로 접속하여, 테스트 해봅니다. 위에서 설명한대로 sphinx는 mysql 클라인트를 그대로 사용할수 있습니다. 기본 실행포트인 9306 포트로 접속하시면 됩니다. 아이디와 비번은 입력할필요 없습니다. mysql 마찬가지로 limit 로 출력 결과수를 조정할수 있습니다. 기본값은 20.

 

 

 

 

Facebook Comments

PHP용 redis query cache (쿼리 캐시) class

시간이 오래걸리는 쿼리의 결과 데이타를 캐시 처리하도록 만들어진 클래스입니다.

 

Facebook Comments

redis + phpredis 설치 및 php 에서 redis 사용방법

 

1. redis(레디스)가 뭔가요? 많이 들어는 봤는데…..

레디스(REmote DIctionary Server) 는 메모리기반 key-value store(저장소) 입니다. 

redis 는 주로 두가지 용도로 많이 습니다.

1. 데이타(또는 페이지) 캐시

2. 세션 저장소 

세션 저장소로 사용할 경우 대용량 분산처리가 가능하며, 서브도메인 세션공유를 쉽게 처리할수 있습니다.

2. redis 설치 및 시작

   2.1 centos6.x 에서 redis 설치 (centos7 도 동일)

 

  2.2 ubuntu 에서 설치

 

 

3. phpredis 설치

PHP 에서 redis 를 사용하기 위해서는 phpredis 라는 php 모듈이 필요합니다. 모듈을 컴파일해서 설치해야합니다. 어렵지 않음으로 순서만 잘 이해하면 됩니다.

먼저 php설치정보를 확인해야 합니다. php -i  나 웹페이지에서 phpinfo() 를 확인합니다.

화면에서 php.ini 의 설치위치를 잘봐둡니다. 제 서버는 /usr/local/php/etc/php.ini 에 위치하고 있네요.

phpredis 를 다운받아 컴파일 해야 합니다. 컴파일 순서는 아래와 같습니다.

  1. phpredis 최신 버전을 다운받습니다. git 을 통해 받거나, wget 으로 받으시면 됩니다.
  2. 다운받은 파일을 압축을 해제한다음, 디렉토리로 이동합니다.
  3. phpize 를 실행해줍니다. phpize 를 찾이못한다면, 풀경로로 실행합니다.
  4. configure 를 실행합니다. 이때 php 가 설치된 php-config 정보를 넣어줍니다.
  5. make, make install 을 실행해줍니다.

 

위에서 make install 후 출력되는 경로를 잘 확인해두어야 합니다. 나중에  php.ini 에 추가할 예정

 /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

php.ini 파일을 수정해 주어야 합니다. php.ini 파일 위치는 아까 phpinfo()에서 확인하였습니다. php.ini 파일을 열어서 마지막에 아래 라인을 추가해줍니다. 저장후 php-fpm 을 재시작하고 다시 phpinfo()를 보시면 php에 redis 모듈이 표시되는걸 확인할수 있습니다. 세션 정보도 redis 로 변경합니다.

[redis]
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/redis.so
session.save_handler = redis
session.save_path = “tcp://127.0.0.1:6379”

 

4. 마지막으로 php로 redis 테스트

 

해당 소스를 저장후 웹페이지서 테스트를 하면, 처음 value가 없다가 새로고침 할때마다 1씩 증가합니다. 3초간 기다렸다가 다시 새로고침하면, 초기화 되는걸 볼수 있습니다.

phpredis 의 자세한 사용법은 https://github.com/phpredis/phpredis  를 참고하세요.
 
 

5. 끝으로..

그누보드5 (영카트) 에서 사용할때 주의점

그누보드5의 common.php 에는 session 설정과 관련된 코드가 들어 있습니다. redis 를 session 저장소로 사용하는 경우 session.save_path 를 수정하면 안됩니다.  /common.php 파일 190번 라인에 있는 아래 코드를 주석 처리 합니다.

//session_save_path(G5_SESSION_PATH);

 

 

참고자료

 

 

Facebook Comments

MySQL 쿼리 모니터링 팁

웹사이트가 느려지거나, 랙이 발생하게 되면 보통 DB를 모니터링합니다. 뭐 대부분 db 에서 문제가 발생하기 마련입니다.

slow 로그를 우선 모니터링 하게 되는데, 쿼리가 실행되는 페이지나 상황이 특정되는 경우는 쿼리를 튜닝하고, 해당 페이지의 서비스 코드(예를 들어 .php 파일)의 쿼리부분을 수정하면 쉽게 장애조치가 가능합니다.

그러나 웹페이지에서 쿼리에 변수 몇개를 바인드하여  사용하기 때문에, 쿼리로는 페이지나 상황을  특정하기 여러운 경우가 있습니다. 이런 경우에 사용할수 있는 간단한 팁입니다.

MySQL은 쿼리에 주석을 추가할수 있는데, 주석에 페이지 정보나 라인을 추가합니다. (이해를 하기 쉽게 하기 위해 그누보드5를 기준으로 설명하겠습니다.)

최근 게시물이나 게시물 수를  표시하기 위해 아래와 같은 쿼리가 들어간 페이지가 있습니다.

$sql = “select count(*) from g5_board_new where …..   “;

$sql = “select * from g5_board new where …. limit 5… “;

해당 쿼리가 들어간 php 파일은 찾았는데 파일수가 20개 라면,어떤 php 가 호출될때가 문제인지를 찾아야 합니다.

이때 다음과 같이 쿼리문에 주석을 추가합니다.

$sql = “select /*  “.$_SERVER[‘SCRIPT_NAME’].” */ from g5_board_new where … “;

$sql = “select /* “.$_SERVER[‘SCRIPT_NAME’].” */ * from g5_board new where …. limit 5… “;

(주석 위치는 가능한 공간이면 아무곳에 넣어도 상관없습니다.)

이제 이렇게 소스를 수정한뒤에 슬로우 쿼리를 보면, 문제가 되는 페이지를 찾을수 있습니다. 쿼리 튜닝이 어려운 페이지인 경우에는 캐시 처리를 하면 끝.

 

 

Facebook Comments

웹페이지 트래픽을 줄이는 5가지 방법

트래픽 = 돈  입니다.(특히 한국은 트래픽 비용이 외국보다 비쌉니다.)
트래픽만 줄여도 비용이 많이 save 됩니다.
cdn 을 클라우드플레어 쓴다면 트래픽 걱정이 많이 줄어들지만, 속도저하를 감수해야죠.
(클라우드 플레어의 플랜에 따른 colo 문제 때문에 커뮤니티에선 그럭저걸 쓸수 있지만, 쇼핑몰같은 비지니스 사이트에선 사용 불가)

비싼 idc 비용을 절감하기 위해 트래픽을 낮추는 방법입니다.

  1. lazy loading

    • 모든 상품 이미지는 lazy loading을 적용합니다. 썸네일포함
  2. 동적 썸네일 적용

    • 거의 모든 쇼핑몰 솔루션과 웹페이지들이 고정사이즈 썸네일 생성 방식을 사용합니다. 이미지가 업로드될때 썸네일을 사이즈별로 미리 생성하는 방식인데, 사이즈가 fix 된 상태임으로 다른 크기의 썸네일을 생성할때, 미리 생성된 크기중 비슷한걸 가져다가 쓰게 됩니다. 사이즈가 다른 이미지를 표시하는 경우 화질이 저하되어(블러효과) 표시되는 문제도 발생합니다.
    • 영카트를 예를 들어 설명드리면, 솔루션 특성상 s, m, l 이미지 3개만유지하는데,  썸네일은 페이지별로 상황에 따라 요청하는 크기가 다릅니다. 45×45 같은 작은 이미지를 150×130 으로 요청할 필요가 없는거죠.(별차이 없어보이지만, 작은 차이가 모이면 커집니다.)
  3. 퀵뷰(미리보기) 적용

    • 상품 상세 페이지나 갤러리 상세페이지에는  큰 원본 이미지가 있기 마련입니다. 가장 많은 트래픽을 만들어 냅니다.  가급적 사용자가 꼭 보고 싶은 상품이나, 사진만을 조회하도록 해야 합니다.
    • 사용자는 사실 상세페이지를 이동할때 발생하는 페이지 새로고침이 별로 좋아하지 않습니다.
    • 퀵뷰(미리보기)를 제공함으로써 상세 페이지 요청이 줄어들게 되고, 퀵뷰에는 2번의 동적썸네일을 표시하여 2중으로 트래픽을 절감할수 있습니다.
  4. 정적 데이타 캐싱

    • php나 java에서  thumbnail 같이 요청마다 이미지 트래픽을 만드는 동적페이지는 사용하지 않습니다. 워터마크를 넣는 작업때문에 이렇게 하시는 경우가 있는데, 지양하도록 합니다.
    • 이미지를 포함하여, 모든 정적 데이타는 캐싱이 되어야  합니다. nginx나 apache 설정에서 정적 데이타 처리가  빠져있다면 꼭 넣어줍니다.
  5. 캐싱 주기를 늘리자

    • 보통 업로드되는 이미지나 상품 상세사진들은 한번 올리면 변경되지 않습니다. 갤러리의 상세 이미지는 캐싱주기를 1일 이상 유지해도 됩니다.
    • 단 수정이 일어날수 있음으로 퍼지 기능을 추가하면 좋습니다. 보통 파일을 삭제함으로써 퍼지를 달성할수 있으나, cdn 을 사용하는 경우는 cdn의 퍼지 기능을 호출해줘야 하는 번거로움이 있습니다. 수정이 자주일어나는 경우라면 캐싱주기를 좀더 줄여줍니다.

위의 5가지를 적용하면, 트래픽이 많은  쇼핑몰 사이트의 경우 30~ 50% 이상 트래픽을 절감할수 있습니다.

Facebook Comments

더 나은 MySQL 성능을 위한 7가지 방법

원문보기

1. EXPLAIN 의 사용법을 배워라. 
– 슬로우 쿼리나, 사이트가 느려질때 processlist에 잔뜩 떠 있는 쿼리,  processlist 에 1초 이상 실행되는걸로 자주 보이는 쿼리가 있다면,
– explain 으로 쿼리의 index 와 실행형태를 보셔야 합니다.  적어도 쿼리가 index를 제대로 사용했는지는 볼수 있어야 합니다.

2. 제대로된 index를 생성하라 
– 1번에서 주로 문제가 되는건 index를 잘못 생성했거나, 너무 많이 생성한 경우입니다.
– index 는 많아도 문제가 됩니다. index가 많은 경우에 오히려 느려지는 경우도 있습니다.(대표적으로 merged intersection)

3.  디폴트값을 쓰지마라. 
– 이건 mysql 튜닝과 관련된 부분입니다. mysql 서버를 처음 설치하게 되면 my.cnf 가 디폴트값으로 들어갑니다.
디폴트값은 장비의 성능을 고려하여 책정된게 아닙니다. 특히 메모리와 버퍼 메모리에 관련된값은 시스템의 메모리를 고려하여 적정값으로 설정하여야 합니다. 적정값을 찾는데는 mysqltunner 가 도움이 될수 있습니다.

4. 가능한 메모리에 db를 유지하라 
– mysql은 데이타를 가능한 memory 에 로딩하여 처리합니다. innodb는 innodb_buffer_pool 에 설정된 크기만큼 메모리를 할당하여 로딩을 해둡니다. 이 값이 작으면, 디스크에서 메모리로 로딩하는 경우가 많아짐으로 성능이 저하되게 됩니다.
가급적 데이타베이스용량만큼은 설정되는게 좋습니다.(자주 안쓰는 테이블의 경우는 계산에서 빼도 됩니다.)
– db의 용량보다 메모리가 부족하다면 증설하는것도 고려해볼만합니다.
– 참고로 innodb_buffer_pool 외에도 버퍼를 많이 사용함으로 innodb_buffer_pool 은 현재 가용 메모리의 50~60%로 잡는게 좋습니다.)

5. SSD 를 사용하라 
– 당연한 애기지만, mysql은 disk read/write 가 많습니다. 4에서 메모리가 충분하더라도 로그를 기록하거나 bin 파일에 대한 write/purge 를 수행하게 됨으로 디스크속도가 느린경우 해당 잡이 실행될때 전체적인 성능저하가 일어납니다. 요즘은 mysql엔 대부분 ssd를 사용합니다.
–  mysql 은 장비 투자 순서는  memory > disk(ssd가 아니라면) > cpu(멀티코어보다는 cpu 클럭이 우선) 입니다.

6.  Scale out 
– 5번에서 하드웨어 성능을 더 이상 높힐수 없는 경우에, mysql을 스케일아웃 할수 있습니다.
– 여러가지 복잡한 방법들이 많지만, 가장 쉽게 스케일할수 있는 방법은 master /slave 방식입니다.
– 실행시간이 오래걸리는 배치잡이나 통계관련 쿼리, 관리자 페이지 select 쿼리들은 slave에서 요청하고
master 에서는 사용자 페이지 쿼리를 수행하게 합니다. 이렇게만 해도 피크시간대 db가 느려지는 문제를 많이 해결할수 있습니다.
– 게다가 슬레이브는 2대 3대로 늘릴수 있습니다.

7. 모니터링을 해라 
– mysql 모니터링 툴은 mysql 엔터프라즈 모니터링(유료), monyog(유료) 기타 다른 버전들 모두 유료입니다. pecona 툴은 무료인가 보네요.
– 국내 업체 whatap.io 에서 mysql 모니터링을 한달 5천(1만원인가) 사용할수 있습니다만, 어짜피 유료입니다.
– 유료툴이 아니더라도  mysql slow log만 잘 관찰하고 튜닝하더라도 많은 문제를 조기에 해결할수 있습니다.

Facebook Comments

SQL_INJECTION(SQL 인젝션)은 어떻게 막아야 하나요?

SQL_INJECTION(SQL 인젝션)은 어떻게 막아야 하나요?

1. pdo의 bind parameter,  pdo의 quota 함수,  mysql_real_eacape_string 함수 등을 이용 
– pdo  bind 를 쓰는게 가장 바람직합니다. 그냥 bind는 의미 없구요. order by 구문은 bind가 안되는 부분임으로
코드에서 order by value 를 꼭 확인해야 합니다. url 에 온 파라메타 그대로 order by에 쓰면 안돼요!!

2. url 파라메타에 select, update, union, and, or 구문 사용금지(그외 웹용 특수문자 입력금지) 
– 게시판은 이게 좀 곤란하죠… 게시판의 제목과, 본문, 코멘트는 그누보드 필터 함수를 꼭 쓰셔야 해요.(그누보드 함수 좋아요)

3. 웹서버에 웹방화벽 모듈 설치 mod_security or webknight, naxsi, dot depeder 등등.. 
– sql injection 공격이 한번 들어온곳은 계속 들어옴으로, 웹방화벽에서 추가를 해야 해요.. 개인적으로 nginx 모듈인 naxsi 를 추천합니다. 이건 다시한번 정리해서 올릴 예정입니다.

4. 웹방화벽 기능이 있는 cdn 서비스 이용 (클라우드 플레어 등) 
– 클라우드 플레어의 프로 플랜 이상이면 사용이 가능합니다. 정상적인걸 막는 경우도 있음으로 룰셋을 잘 관리해야 합니다.
(그런데 클라우드플레어 국내에선 너무 느려서…. 공격들어올때 잠깐 켰다가 끄는 방법을 추천)

5.웹소스로 된 방화벽 솔루션이나 코드 추가

– kisa 캐슬.. 성능은 예전에 안 좋았는데, 요즘은 어떤지 모르겠음.). github 에도 좀 있을듯.
– 경험삼아 한번씩 설치해보세요. 접속자가 많지 않은곳은 성능 이슈가 없어서 괜찮습니다.

 

지금 사이트와 개발자 상황에 맞춰서 5가지중에 가능한걸 적용하시면 됩니다.(2개 이상 적용하면 더 좋습니다.)

아래 예제는 php에서 sql injection 을 체크하기 위한 코드입니다. 간단해보이지만 효과적입니다.

 

 

Facebook Comments

블로그 설치 완료

블로그 개설했습니다.

개발 코드에 대한 공유와 개발 일상에 대한 글을 써볼까 합니다.

예전에 티스토리에 글을 쓰다가 바빠서 몇달 후에 방문했더니.. 제 블로그가 사라졌더라구요.

백업도 안된다는 말에 당황스러웠던 기억이 있네요.

가급적 1일 글쓰기를 실천할려고 합니다. 그럼

Facebook Comments