2016년 9월 13일 화요일

우분투 초기 설정

서랍에 잠자던 노트북의 다양한 활용을 위해서 우분투를 설치했다.
공인 인증을 위해서 가상박스로 윈도우를 설치하고, 업무를 위해서 크롬 브라우저와 hwp 뷰어를 설치했다.

처음 우분투를 설치하면서 필요했던 내용 들을 요약한다.

1. 한글 자판 사용하기

Ubuntu 16.04에서 키보드 입력기는 기본적으로 fcitx로 설정되어 있다.
따라서 키보드 자판에서 입력 소스에 Hangul(Fcitx)를 선택한다.

자판 전환 기본은 super + space 조합이다. ( super는 윈도우 키였다. )

2. 데미안 패키지 관리

리눅스를 사용한다는 것은 패키지를 잘 관리하는 것이다.
사용 예제로 hwpviewer를 설치하는 과정이다.

가. apt 이용하는 방법

hwp 단어와 관련된 패키지를 찾는다.
apt-cache search hwp

찾은 패키지를 설치 한다.
apt install hancomoffice-hwpviewer

**
필요시에 apt 레포지토리를 등록해서 사용한다.

나. 패키지 파일을 다운받아 설치하는 방법

dpkg를 통해 설치 한다.
dpkg —install hwpviewer_9.20.0.347_amd64.deb

의존성 문제가 있을 경우,
apt -f install
을 통해서 관련 의존성 패키지를 설치한다.

3. 참고

* 데미안 패키지 관리는 레드햇과 비교해 보면 다음과 비슷하다.
rpm -> dpkg
yum -> apt

* Fcitx 란?
X 윈도우 시스템에 입력 방식 확장을 지원하는 프레임워크이다.

2016년 9월 9일 금요일

주요 SNS 공유 버튼 정리

주요 SNS 공유 버튼 가이드 모음이다.
개발 페이지에 대한 링크와 간략한 특징을 서술한다.

카카오 스토리 

접근을 위한 앱을 만들고, 앱 키를 발급 받아 사용한다.
url, text 정보를 지정 할 수 있다.

image 정보는 url 페이지의 open graph protocol을 기반으로 가져온다.

주의: url 페이지에 구성된 og 정의를 사용한다.

트위터 

페이지 정보를 기본으로 가지고 온다.

주의: image 정보는 노출 할 수 없다.

페이스북 

접근을 위한 앱을 만들고, 앱 키를 발급 받아 사용한다.
기본 공유 버튼을 제공하고 있으나,
원하는 아이콘을 사용하기 위해서는 공유 대화 상자를 활용한다.
공유 대화 상자 사용을 위해서는 앱의 설정에 도메인을 추가한다.

주의: url 페이지에 og 프로토콜을 사용한다.

다른 유효한 방법:
<a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=http://your_domain”>
ShareButton</a>

핀터레스트 

이미지 선별, url, description을 지정 할 수 있다.


주의: 바로 저장하는 Pin과 선별해서 저장하는 Bookmark 기능이 있다.

2016년 8월 31일 수요일

인구 통계 자료를 볼 수 있는 곳

세계 인구 조사
: 미국 인구 조사국에서 제공하는 세계 인구 통계 자료이다.

고령화 세계 보고서
: 고령화 사회로 가고 있는 지구촌에 대한 2015년 보고서이다.

세계 인구 통계 요약
: 세계 인구 통계를 매우 깔끔하게 보여 준다.

**
www.census.gov
미국 인구조사국 (United States Census Bureau)


주변국 자료에서 눈에 띄는 부분들을 요약해 본다.

중국 vs 인도
중국과 인도의 인구는 비슷하지만, 증가세는 인도가 가파르다.
평균 연령은 중국(37), 인도(27)이고 도시 인구 비율은 중국(58%), 인도(32%)이다.
중년에 들어선 중국을 젊은 인도가 빠르게 뒷따르고 있다.

일본
평균 연령 47세, 도시 인구 비율 94% 이다.
세계 최고의 고령화된 국가이며, 도시 인구 비율이 높다.
다음 고령화된 국가는 그리스, 이태리, 그리스, 포르투칼 순이다.

한국
평균 연령 41세, 도시 인구 비율 82% 이다.
태국, 마카오, 홍콩, 싱카포르 다음으로 저출산 국가이다.
이들의 공통점은 인구 밀도와 도시 인구 비율이 높다.

러시아
60대 이상 인구를 보면 여성 비율이 매우 높다.
전쟁으로 인해서 남자들이 많이 죽었다는 설이 있다.

2016년 8월 6일 토요일

플라스크(flask) 정적 페이지 및 로그 핸들 연결

플라스크에서 정적인 페이지를 연결하는 것과 로그 핸들을 추가하는 방법을 요약한다.

1. 정적인 페이지
정적인 파일들로 구성된 웹 페이지로 연결하는 방법이다.
경로 정보를 정적인 영역(static)으로 던진다.

2. 로그 핸들 연결
파이썬 로깅의 다양한 핸들 정의 후 플라스크 로거에 연결한다.
파일에 로그를 남길때 유용하다.

샘플 코드 분석를 통해서 알아본다.
import logging

from flask import Flask



app = Flask(__name__)



@app.route('/')

def static_pages(path):

    app.logger.error(path)

    return app.send_static_file(path)



if __name__ == '__main__':

    handler = logging.FileHandler('app.log', mode='a')

    handler.setLevel(logging.INFO)

    app.logger.addHandler(handler)

    app.run(debug=True)
**
<path:path>
앞에 path는 슬래쉬(/)를 포함하는 값을 의미한다.
생략 시에 기본 값인 string은 /를 포함하지 않는다.
send_static_file
접근 경로를 정적 페이지 영역으로 던진다.
logging.FileHandler
파일에 접근을 위한 핸들이다.
handler.setLevel
지정한 레벨보다 상위 레벨만 기록한다.
DEBUG < INFO < WARN < ERROR < CRITICAL
app.logger.addHandler
플라스크 로거에 핸들을 추가한다.

2016년 7월 27일 수요일

구글 애널리틱스 스팸 막기

자체 로봇 제거에도 불구하고, 다수의 스팸 패킷이 들어온다.
이를 막기 위한 좋은 방법을 소개한다.

스팸 막는 방법 두 가지 (필터 활용)

1. 포함하는 방법
다수의 스팸 사이트들이 호스트 이름과 화면 해상도가 (not set)으로 표기된다.
필터 시점에 호스트 이름의 경우 무효값으로 인지하고, 화면 해상도는 (not set)으로 인지한다.
So, 명확한 호스트 이름을 포함하는 패킷과 화면 해상도가 (not set)인 패킷을 제외하는 조건으로 필터한다.
**
무효값은 필터를 무시한다.

2. 제외하는 방법
스팸으로 판단되는 캠페인 소스에 대해서 정규식 패턴을 찾아서 제외한다.
한줄에 들어가는 정규식 패턴의 글자수가 256자로 제한이 있다.

결론

두 가지 방법을 혼용 할때, 각각의 이점을 최대한 살릴 수 있다.
1번 방식으로 다수의 스팸을 걸러내고, 나머지는 2번 방식으로 조금 명확한 기준의 정규식을 사용한다.

2016년 7월 22일 금요일

Firebase 앱분석 설치 가이드

구글에서 2014년 인수한 백엔드 서비스인 Firebase의 앱분석 설치 과정을 다룬다.

크게 보면 아래 두 가지 내용이다.
가. iOS 기반에서 firebase analytics 를 사용하는 방법
나. 구글 태그 매니저 연동 방법

먼저 iOS 기반에서 firebase analytics를 사용하는 방법이다.


맥에서 CocoaPods를 설치한다.
아마도 에러가 발생한다.
ERROR:  Error installing cocoapods:
activesupport requires Ruby version >= 2.2.2.

구글 커뮤니티는 다음 차선책을 제시한다.
sudo gem install activesupport -v 4.2.6
sudo gem install cocoapods

**
gem: 세련된 루비 패키지 관리자
CocoaPods: Cocoa 라이브러리 패키지 관리자

xcode 도구에서 개발 프로젝트를 생성한다.
프로젝트 생성 폴더에서 Firebase 라이브러리를 가져온다.
pod init :-> Podfile이 생성된다.
vi Podfile :-> pod ‘Firebase’를 추가한다.
pod install

Firebase에서 서비스 프로젝트를 생성한다.
GoogleService-Info.plist 파일을 내려받아 개발 프로젝트에 추가한다.
GoogleService-Info.plist 내용에 IS_ANALYTICS_ENABLE을 True로 변경한다.

프로젝트에 코딩 작업을 한다.
AppDelegate.swift에 가이드 코드를 추가한다.
import Firebase

func application(application: UIApplication, didFinishLaunchingWithOptions  …) -> Bool {
        // Override point for customization after application launch.
        FIRApp.configure()
        return true
    }

ViewController.swift에 이벤트 로그 코드를 삽입한다. 
import FirebaseAnalytics

FIRAnalytics.logEventWithName(“<eventName>”, parameters: [
“<keyName>”: “<keyValue>”,
… ])

Analytics 디버깅 옵션을 추가한다.
Product > Scheme > Edit Scheme… > Arguments (tab) > Arguments Passed On Launch
에 -FIRAnalyticsDebugEnabled 값을 추가한다.

<<실제 디버그 내용
2016-07-22 17:26:47.742 myFirebaseA[10445:] <FIRAnalytics/DEBUG> Logging event: origin, name, params: app+gtm, test_event, {
   "_o" = "app+gtm";
   eventAction = "test event action";
   eventCategory = "test event category";
}
2016-07-22 17:26:47.796 myFirebaseA[10445:] <FIRAnalytics/DEBUG> Event logged. Event name, event params: test_event, {
   "_o" = "app+gtm";
   eventAction = "test event action";
   eventCategory = "test event category";
}

디버그 로그로 태그 전송 여부를 추측 할 수 있다.
확실히 하기 위해서, 실시간 확인이 가능한 구글 태그 매니저를 활용한다.

다음은 구글 태그 매니저 연동 방법이다.


태그 매니저에서 iOS용 firebase 컨테이너를 생성한다.
게시 버전의 json 파일을 내려 받고, container/<code>.json 형태로 개발 프로젝트에 참조를 건다.

개발 프로젝트에 태그 매니저 라이브러리를 추가한다.
pod 'GoogleTagManager', '~> 5.0' 를 Podfile에 추가하고,
pod install 한다.

<<실제 디버그 내용
2016-07-22 17:26:47.735 myFirebaseA[10445:649284] GoogleTagManager info: Processing logged event: test_event with parameters: {
    eventAction = "test event action";
    eventCategory = "test event category";
}
2016-07-22 17:26:47.740 myFirebaseA[10445:649284] GoogleTagManager info: Sending universal analytics hit: {
    "&ea" = "test event action";
    "&ec" = "test event category";
    "&el" = "test_event";
    "&ni" = 0;
    "&t" = event;
    "&tid" = "UA-012345678-1";
}