2016년 5월 31일 화요일

구글 태그 매니저

구글의 태그 매니저 사용 하면서 정리한 내용 입니다.

주요 기능

실시간 디버깅이 가능한 미리보기 도구를 제공한다.
변경 사항에 대한 체계적인 버전 관리가 가능하다.
다양한 분석 제품군을 기본 지원하고, 사용자 맞춤 태그 또한 지원한다.
구글 계정 단위 협업 기능을 제공한다.

권장 사항

페이지에서 발생되는 변수들은 가능하다면 데이터 레이어(dataLayer)를 이용한다.
전역변수나 DOM의 경우 유지보수 하면서 변경 가능성이 높다.
스니펫(추적 코드)는 호환성을 높이기 위해서  <BODY> 바로 다음에 추가한다.
분석 제품 추적 ID와 같이 자주 사용하는 값들은 변수에 등록해서 사용한다.

변수 설정 예제

자바 스크립트 전역 변수 선언
globalVariable = 10;
반대로, 지역 변수는 var를 붙인다.
var localVariable = 10;

데이터 레이어 변수 생성
dataLayer.push({‘key’:’value’})

데이터 레이어 이벤트 생성
dataLayer.push({‘event’:’event_name’})

**
dataLayer는 스니펫에서 정의되어 있는 예약어이다.
스니펫 코드에서 다음 위치 이름 수정(new_dataLayer_name)으로 변경 가능하다.
… (window,document,'script’,’new_dataLayer_name,’GTM-XXXX') …

맞춤 자바스크립트 변수 선언 (함수 반환값)
function() {
var now = new Date();
return now.getTime();
}

이벤트 수집 예제

분석 제품군: 구글 어낼리틱스 사용 가정

1. [웹 사이트] 이벤트 코드 삽입
    : dataLayer.push({‘event’:’event_test’})

2. [태그 매니저] 이벤트 이름이 event_test인 조건에 트리거 생성

3. [태그 매니저] 생성한 트리거에 따라 전송될 이벤트 정보 등록
    : 이벤트 카테고리, 작업(액션), 라벨 …

4. [태그 매니저] 미리 보기 및 디버깅 도구 실행

5. [웹 사이트] 이벤트 코드 수행 후 전송 확인

6. [구글 어낼리틱스] 실시간 이벤트 확인

7. [태그 매니저] 게시 (태그 적용)

구글 애드워즈 연결

리마케팅
리마케팅 목록을 등록한다.
리마케팅 스니펫 코드가 제공된다.

전환추적
전환 여부를 확인한다.
전환 스니펫 코드가 제공된다.

**
스니펫 코드는 웹 페이지에 직접 삽입 하거나,
식별 코드 정보를 통해서 태그 매니저에서 생성 할 수 있다.

주요 용어

계정
컨테이너를 그룹으로 관리한다.

컨테이너
웹/모바일 환경에 따른 추적 태그 생성 단위이다.
컨테이너를 기반으로 트리거, 태그, 변수의 설정 값이 관리된다.

버전
변경 환경에 버전 관리 기능을 제공한다.

관리자
사용자 권한 관리 및 컨테이너 관리 기능을 제공한다.
“컨태이너 가져오기/내보내기” 기능을 통해서 설정 환경을 다른 계정으로 복제 할 수 있다.

트리거
태그 발송(Fire)을 위한 조건을 명세한 트리거들을 만든다.

태그
기본 및 생성한 트리거로부터 유발된다.
사용할 제품으로 발송할 정보를 만든다.

변수
기본 변수에 사용자 변수를 정의 추가한다.
사용할 제품의 식별자를 상수로 정의하면 편리하다.

측정 기준 조회 범위

조회
값이 설정된 단일 조회에 적용된다.

세션
단일 세션의 모든 조회가 최종 값으로 적용된다.

사용자
현재 단일 세션의 모든 조회가 최종 값으로 적용된다.
변경이 없다면 미래 세션의 조회로 적용이 지속된다.

잘 작성된 참고 자료

참고

구글 태그 매니저 개발 가이드

표지 그림


2016년 5월 27일 금요일

딥러닝 메모

딥러닝을 이해하기 위해 참조한 내용들을 정리한다.


역사 

사람의 신경망을 본 뜬 인공신경망 기술이 핫 이슈가 된다.
XOR 문제에서 좌절을 안긴다.

(미래에서 온 인류 저항군인) 민스키 교수의 두 마디에 의해 암흑기로 들어간다.
* 다계층 퍼셉트론 (MLP)를 사용하면 풀수 있다.
* 지구상에 누구도 MLP 노드를 학습시킬 좋은 방법을 찾지 못했다.

폴의 오차역전파법 논문에서 MLP의 노드 학습 방법을 찾는다.
크게 관심을 끌지 못한다.

힌튼 교수에 의해서 재발견 되고 관심이 촉발 되지만,
많은 수의 은닉 층에서 학습 능력이 떨어지는 단점과 함께 제 2의 암흑기를 겪는다.

지속적인 연구 끝에 적절한 초기 값(가중치)을 부여하는 것을 통해서 문제를 해소한다.
관심 촉발을 위해서 “딥러닝”이라는 단어를 사용한다.

다양한 과제 영역에서 성과들이 나오면서 전성기를 맞이한다.


**
신경세포 - Neuron
신경계를 구성하는 주된 세포이다.

자극전달 - impulse
일정 이상의 자극 ( 역치 : Threshold )이 주어 지면 전기 신호를 발생한다.

연접 - synapse
한 뉴런에서 다른 세포로 신호를 전달하는 연결 지점이다.

인공신경망 - artificial neural network
생물학적 신경망에서 영감을 얻은 통계학적 알고리즘이다.

딥 러닝 - deep learning
여러 비선형 변환기법의 조합을 통해 높은 수준의 추상화를 시도하는 기계학습(machine learning) 알고리즘의 집합으로 정의 되며, 큰틀에서 사람의 사고방식을 컴퓨터에게 가르치는 기계학습의 한 분야라고 이야기 할 수 있다.

기계학습 - Machine Learning
어떠한 태스크(T)에 대해 꾸준한 경험(E)을 통하여 그 T에 대한 성능(P)를 높이는 것, 이것이 기계학습이라고 할 수 있다. - by Tom M. Mitchell

오차역전파법 - back-propagation
네트워크에 기대되는 모든 가중치를 통해 손실함수의 값이 최소화가 되는 최적화 가중치를 추출하는 방법론이다.

손실함수 - loss function
사건(기술적으로 표본 공간의 한 요소)을 그 사건과 관련된 경제적 손실을 표현하는 실수로 사상하는 함수이다.

합성곱 신경망 - Convolutional Neural Network : CNN
최소한의 전처리(preprocess)를 사용하도록 설계된 다계층 퍼셉트론(multilayer perceptrons)의 한 종류이다.
영상, 음성 분야 모두에서 좋은 성능을 보여준다

퍼셉트론 - perceptron
인공 신경망의 한 종류로서 각 노드의 가중치와 입력치를 곱한 것을 모두 합한 값이 활성함수에 의해 판단되는데, 그 값이 임계치(보통 0)보다 크면 뉴런이 활성화되고 결과값으로 1을 출력한다. 뉴런이 활성화되지 않으면 결과값으로 -1을 출력한다.


참고

인공신경망 백서

인공신경망 동영상

인공신경망 아이디어 ( A -> B, C -> D )


2016년 4월 29일 금요일

맥북에서 Bootable CentOS USB 만들기

맥북에서 부팅되는 CentOS USB 드라이브 만드는 방법이다.

1. CentOS 홈페이지에서 원하는 IOS 이미지를 내려 받는다.
 - https://www.centos.org/download/

2. hdiutil을 이용해서 UDRW 형태 이미지로 변형한다.
# hdiutil convert -format UDRW -o temporary.img CentOS-xxxx.iso

**
UDRW - UDIF read/write image

3 dd를 통해서 이미지를 굽는다.
설치할 디스크 장치명 확인
# diskutier list
대상 디스크 언마운트 하기
# diskutil unmountDisk /dev/diskX
2번 과정에서 만든 이미지를 굽기
# sudo dd if=temporary.img.dmg of=/dev/diskX bs=1m

**
CentOS 6.7 기준 실제 작업한 내용
$ diskutil list
/dev/disk0 (internal, physical):
/dev/disk1 (internal, virtual):
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.6 GB    disk2
   1:                 DOS_FAT_32 UNTITLED 1              15.6 GB    disk2s1
$ time sudo dd if=target.img.dmg of=/dev/disk2 bs=1m
Password:
3715+0 records in
3715+0 records out
3895459840 bytes transferred in 5414.762327 secs (719415 bytes/sec)

real 90m23.357s
user 0m0.024s
sys 0m54.548s

90분이 소요 되었다.
더 낳은 USB를 사용 해보니 결과는 7분 정도로 가능했다.

real 6m58.033s
user 0m0.020s
sys 0m18.291s

2016년 4월 1일 금요일

이미지에 자바스크립트 코드 삽입하기

BMP 이미지에 자바스크립트 코드를 삽입하는 과정이다.

1. 테스트로 사용할 이미지를 구한다. (sample.bmp)
2. BMP 포맷의 특징을 활용해서 자바스크립트 코드를 삽입한다.
3. HTML에서 이미지와 자바스크립트의 소스로 변경된 이미지를 가져온다.

구현된 파이썬 코드를 통해서 알아보자.

# 구글 이미지 검색에서 찾은 BMP 이미지 파일을 sample.bmp로 명명하였다.
original_file = "sample.bmp"
cracked_file = "cracked.bmp"

# 삽입될 바이너리 형태의 코드로 알림 창을 띄우는 예제를 만들었다.
script_text = 'alert("{0} is cracked.")'.format(original_file).encode('ascii')

def script_into_bmp(script_text, original_file, cracked_file):
    """
    bmp 이미지에 script 코드를 삽입하기
    :param script_text: 삽입할 자바스크립트 코드
    :param original_file: 원본 bmp 이미지 파일 이름
    :param cracked_file: 생성될 bmp 이미지 파일 이름
    :return: 성공
    """

    # 1번째 과정 : 주석 영역에 문제를 일으킬수 있는 */ 문자를 제거한다.
    with open(original_file, "r+b") as f:
        buff = f.read()
        buff.replace(b'\x2A\x2F', b'\x00\x00')  # */ 공백 치환

    # 2번째 과정 : 비트맵의 헤더 2 바이트 이후에 주석 시작 코드(/*)를 삽입한다.
    with open(cracked_file, "w+b") as f:
        f.write(buff)
        f.seek(2, 0)
        f.write(b'\x2F\x2A')  # /*

    # 3번째 과정 : 파일의 끝에 주석 끝 코드(*/)와 함께,
    # 비트맵의 헤더 BM=1;과 같이 처리하기 위해서 다음 코드(=1;)를 추가한다.
    # 테스트를 위해서 알림창을 띄우는 자바스크립트 코드를 추가한다.
    with open(cracked_file, "a+b") as f:
        f.write(b'\x2A\x2F\x3D\x31\x3B')  # */=1;
        f.write(script_text)

    return True

HTML에서 이미지를 보여주는 것과 동시에 숨겨진 자바스크립트 코드를 실행한다.
<img src=“cracked.bmp”/>
<script src=“cracked.bmp”/>

실행 화면



2016년 3월 31일 목요일

구글 애널리틱스 플랫폼 활용

구글 애널리틱스 플랫폼을 탐색하는 데모와 도구들을 제공하는 페이지이다.

https://ga-dev-tools.appspot.com

다음과 같이 흥미로운 기능들을 가이드 하고 있다.

  • GA 측정기준 및 측정항목을 탐색할 수 있다.
  • 질의 도구를 통해서 통계 데이터를 조회할 수 있다. 
  • 구글 문서(스프레드시트)에서 주기적으로 갱신 가능한 리포트를 생성할 수 있다.
  • 강력한 내장 API들을 활용하여 손쉽게 사용자 솔루션을 만들 수 잇다.
  • 사이트 외부에도 삽입할 수 있는 추적코드 생성 도구를 제공한다. (1)

특히 (1)번을 통해서 다양한 행위에 대한 통계 자료를 손쉽게 모을 수 있다.
예를 들면,
이메일 공지에 대한 반응을 조사한다고 할때 다음과 같은 코드를 HTML 메일에 심어서 발송한다면, 메일 수신자에 대한 반응 확인이 가능하다. 나머지는 상상의 나래를 펼쳐보자.

-- sample code --
<img src="http://www.google-analytics.com/collect?v=1&t=event&tid=UA-XXXXX-1&cid=1&ec=email&ea=click&el=notice&ev=100”>

2016년 3월 18일 금요일

행렬 인수분해 3가지

인수분해는 노이즈 제거 및 데이터 압축 기법으로 유용하게 활용된다. 근래에는 기계학습 붐과 함께 패턴인식 분야에서도 유용하게 쓰인다.
본문은 일반적으로 사용하는 인수분해 기법(PCA, SVD, NMF)를 활용한 예제를 다룬다.

먼저 실험에 사용할 이미지 20개다.


위 이미지 중 하나는 45x40 이고, 일렬로 나열하면 1x1800 이 된다.
20개의 이미지를 합치면 다음과 같이 20x1800의 이미지로 만들수 있다.
(20개 이미지로는 육안 상의 의미 전달이 약해서 출력을 5번을 반복했다.)
성분의 수를 1개로 지정할때 변형(인수분해된 값을 복원)된 이미지다. 노이즈가 제거된다.
**
n_components (성분 수)
scikit-learn의 PCA, SVD, NMF의 필수 입력 인자이다.
PCA에서는 주요 인자의 개수이고 SVD에서는 S(시그마)의 인자 개수이고, NMF에서는 W, H의 특징의 개수이다. 값이 작을 수록 핵심 요소만 부각되고, 보관할 사이즈가 줄어든다.

성분 값 20, 1의 2가지의 복원된 이미지 값을 보자.
성분 값이 20일때,

성분 값이 1일때,
**
PCA, SVD, NMF 모두 유사한 형태를 보인다.
위에서 부터 PCA, SVD, NMF 순서대로 나열했다.

활용적인 측면에서는 개성있는 다양한 사람들의 사진에서 공통적인 요소를 부각해 사람이라는 객체의 일반적인 형태를 만들어 낼 수 있다는 점이다. 이 것은 다른 객체들에도 동일하게 적용 가능하다.


참조

사진 출처 및 영감을 받은 사이트
http://darkpgmr.tistory.com/110

주성분 분석(主成分分析, Principal component analysis; PCA)
고차원의 데이터를 저차원의 데이터로 환원시키는 기법이다. 서로 연관 가능성이 있는 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간(주성분)의 표본으로 변환하기 위해 직교 변환을 사용한다. 주성분의 차원수는 원래 표본의 차원수보다 작거나 같다.
**
각 성분(벡터 방향, 차원, 속성)의 평균 지점을 0으로 만드는 지점(점)으로 부터의 성분별로 거리를 추출하고 성분의 분산이 가장 큰 순으로 정렬한다.
n_components = min(n_samples, n_features)
n_components는 성분의 개수이다.

특이값 분해(Singular Value Decomposition, SVD)
행렬을 특정한 구조로 분해하는 방식으로, 신호 처리와 통계학 등의 분야 에서 자주 사용된다.
**
A = U(투영회전,직교형렬) x S(형태변환,대각형렬,components) x V(회전,직교형렬)
모든 m x n 행렬에 대해 적용 가능함으로 유연하게 쓰인다.

음수 미포함 행렬 분해(Non-negative matrix factorization, NMF)
음수를 포함하지 않은 행렬 V를 음수를 포함하지 않은 행렬 W와 H의 곱으로 분해하는 알고리즘이다. 행렬이 음수를 포함하지 않는 성질은 분해 결과 행렬을 찾기 쉽게 만든다. 일반적으로 행렬 분해는 정확한 해가 없기 때문에 이 알고리즘은 대략적인 해를 구하게 된다. 음수 미포함 행렬 분해는 컴퓨터 시각 처리, 문서 분류, 음파 분석, 계량분석화학, 추천 시스템 등에 쓰인다.
**
A = W * H
n_components = min(n_samples, n_features)
다른 기법에 비해서 성능이 느리다.

본문 사용 파이썬 코드 요약

사용된 라이브러리
import scipy, pandas as pd
from sklearn.decomposition import PCA, TruncatedSVD, NMF

이미지 읽고 쓰고 보이기
scipy.misc.imread(파일이름)
scipy.misc.imsave(파일이름, 행렬)
scipy.misc.toimage(행렬)

이미지 읽기
scipy.misc.imread(파일이름, mode='L').reshape(45 * 40)
#이미지의 간편한 처리를 위해서 8bit 흑백 모드로 읽기

행렬 결합하기
pd.concat(결합할 행렬의 리스트, axis=1)
# axis=1 가로(열)로 합치기, 0 세로(행)로 합치기

인수분해하기
# 모델 선언, 성분 개수 지정
model = PCA(n_components=성분개수)
# 인수 분해 (압축 저장)
repo = model.fit_transform(학습 및 변형할 행렬)
# 복원 하기
final_img = model.inverse_transform(repo)
# 복원된 이미지 보기
scipy.misc.toimage(final_img)