2014년 9월 25일 목요일

boost build, cross compile for arm

boost library
http://www.boost.org/

[build for linux] 

boost library를 사용할 필요가 있어 빌드함.
linux 상에서의 기본 빌드는 간단하다.

http://www.boost.org/doc/libs/1_51_0/more/getting_started/unix-variants.html#easy-build-and-install

$ ./bootstrap.sh
$ ./b2
$ sudo ./b2 install

이렇게 하면 아래 path에 설치 됨.

headers :  /usr/local/include/boost
libraries : /usr/local/lib

만약 빌드 중 gits/predefs.h 가 없다는 에러가 나오면 gcc-multilib를 설치
http://stackoverflow.com/questions/12591629/gcc-cannot-find-bits-predefs-h-on-i686
sudo apt-get install gcc-multilib

feature.h를 못찾겠다고 하면 아래 include 정보 추가
./b2 include=/usr/include

[cross compile for ARM architecture]

arm linux 용으로 빌드를 할 필요가 있어
cross compile을 하려면 다음과 같이 설정하고 빌드 하면 됨.

bjam cross compilation 설정

boost 폴더/tools/build/v2/user-config.jam  에 다음 정보만 입력
using gcc : arm : arm-none-linux-gnueabi-g++ ;
위 처럼 tool set name : version : invocation command 아니면 option을 입력
arm 용 cross compile 시에는 version 대신 arm을 기입했는데 상관 없는듯.

그리고 세번째 항목에는 컴파일러 빌드 명령과 option을 입력하는게 맞는데
option을 어떻게 설정하는지는 잘 몰라서 여기서 설정하지 않고 b2 실행 시 command line에서 입력 함.

참고로 아래 링크의 QnA에서 compile option을 compileflags 로 기입하는 것을 볼 수 있지만 실제 해봤을 때 boost 빌드에서 먹히지가 않았음.. http://stackoverflow.com/questions/15686972/how-to-change-check-the-compiler-used-by-b2-when-compiling-boost

using gcc : macports :
         full/Path/g++-mp4.8 :
  <compileflags>--sysroot=full/path/to/sysroot
  ;

빌드하면 boost documentation에서 보듯이 toolset과 target을 지정해서 빌드하면 됨.
# On windows box
b2 toolset=gcc-arm target-os=linux
# On Linux box
b2 toolset=gcc-mingw target-os=windows
되지만 아래 설정이 되어 있는지 먼저 확인을 해봐야 한다.

1. user-config.jam에서 설정된 invocation command 경로가 $PATH에 추가 되어 있는지
    추가 되어 있지 않았다면 추가하거나 아니며 user-config.jam에서 full path와 함께 command를 입력해라.
2. cross compile 시 필요한 include 파일이나 library들이 존재하는지
    cross compile tool chain에서 제공하는 include 파일들과 library들이 어디에 있는지 경로를 확인해 두고 관련 에러 시 path를 명시해야 한다.
3. 빌드 에러 시 정확한 메세지 확인을 위해서는 -d+2 (debug message level), -q(error 발생 시 빌드 중지) 옵션을 사용

그래서 나는 일단 다음과 같이 빌드 하였음.

./b2 toolset=gcc-arm target-os=linux  include=/home/ccc/arm-tool-chain/usr/include/ -d+2 -q 

빌드 후 library들은 boost 폴더 내 stage/lib 폴더에 복사된다.

참고로 세부 빌드 옵션 설명은 다음 링크에서 설명하고 있음.
예를 들어 include path 추가는 include, library 형태(.a, .so)는 link, flag 추가는 cxxflags, cflags, linkflags 를 사용..

근데 shared library로 빌드하려니.. gcc 설정이 문제인지 빌드가 안된다.. 포기..

Table 4.2. 
FeatureAllowed valuesNotes
variantdebug,release
linkshared,staticDetermines if Boost.Build creates shared or static libraries
threadingsingle,multiCause the produced binaries to be thread-safe. This requires proper support in the source code itself.
address-model32,64Explicitly request either 32-bit or 64-bit code generation. This typically requires that your compiler is appropriately configured. Please refer to the section called “C++ Compilers” and your compiler documentation in case of problems.
toolset(Depends on configuration)The C++ compiler to use. See the section called “C++ Compilers” for a detailed list.
include(Arbitrary string)Additional include paths for C and C++ compilers.
define(Arbitrary string)Additional macro definitions for C and C++ compilers. The string should be either SYMBOL or SYMBOL=VALUE
cxxflags(Arbitrary string)Custom options to pass to the C++ compiler.
cflags(Arbitrary string)Custom options to pass to the C compiler.
linkflags(Arbitrary string)Custom options to pass to the C++ linker.
runtime-linkshared,staticDetermines if shared or static version of C and C++ runtimes should be used.
If you have more than one version of a given C++ toolset (e.g. configured in user-config.jam, or autodetected, as happens with msvc), you can request the specific version by passing toolset-version as the value of the toolset feature, for example toolset=msvc-8.0.
If a feature has a fixed set of values it can be specified more than once on the command line. In which case, everything will be built several times -- once for each specified value of a feature. For example, if you use
b2 link=static link=shared threading=single threading=multi
Then a total of 4 builds will be performed. For convenience, instead of specifying all requested values of a feature in separate command line elements, you can separate the values with commas, for example:
b2 link=static,shared threading=single,multi
The comma has this special meaning only if the feature has a fixed set of values, so
b2 include=static,shared
is not treated specially.

2014년 9월 18일 목요일

mobile web payment 정리

mobile app이 아닌 mobile web app에서 native를 사용하지 않고 결제를 위한 방법 및 솔루션 확인
근데 실제 사용해보지 않고 문서만 봐서 좀 애매한 부분이 있음..

[mobile payment 동향]

https://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCIQFjAA&url=http%3A%2F%2Fuangelstory.tistory.com%2Fattachment%2Fcfile2.uf%402352B73953FAE87505522E.pdf&ei=v1AZVIzEHdaD8gWWyIDgAw&usg=AFQjCNFJsdL4AU3Ez3L4y75ELTvyzi-fHA&sig2=60Sn9o_iXjpjHQvQy2fHRA&bvm=bv.75558745,d.dGc

공인증서 의무사용 폐지 및 온라인 결제 정책 변화
모바일 간편결제 솔루션들이 발표되고 해외 업체들도 한국 시장 진출 준비 중


[in-app 결제와 애플 App store, 구글 Play store의 결제 수수료]

App store, Play store에서 인앱 결제 플랫폼 사용료로 30%를 먹음.
store가 packaged app을 위한 거라 브라우저 상의 mobile web을 위한 결제 방법은 없는 것 같음.

http://catchrod.tistory.com/1027
http://m.mt.co.kr/new/view.html?no=2012081416465097658


[간편 결제 종류]

모바일 신용 카드 - USIM을 NFC 리더기 에 접촉 하여 사용
휴대폰 결제 - 전화번호와 개인 정보로 결제
모바일 교통카드 - NFC카드나 NFC 스마트폰을 NFC 리더기에 접촉하여 사용
모바일 뱅킹 - 스마트폰 기반 은행 앱 (공인인증서 필요)
전자지갑 - 스마트폰 앱에 카드정보를 입력해 두고 카드정보로 결제
모바일 간편결제 - 스마트폰 앱을 이용한 결제 (전자지갑은 등록한 신용카드를 사용하는 거고 이건 앱 내에서 돈을 처리하는 것 같은데..)


[mobile web 결제 solutions]

[PayPal]

https://developer.paypal.com/docs/classic/use-cases/uc_mobile-website-checkout/

가장 유명한 PG(Payment Gateway)이지만 국내에서는 거의 사용되지 않고 한글 및 원화를 지원하지 않는 다는 점이 단점 일듯.
모바일 상에서 PayPal 연동을 위해서는 아래와 같이
Mobile Express Checkout, Mobile PayPal Payments Standard 두가지 종류가 존재하는 것으로 보임.
링크를 따라 PayPal로 이동하여 결제를 하고 다시 웹사이트로 돌아오는 것으로 보임.
두 방식의 차이를 모르겠으나 전자가 mobile을 위해서 좀 더 optimize 되어 있는 것으로 보인다.

Express Checkout on Mobile Devices
: https://developer.paypal.com/docs/classic/express-checkout/integration-guide/ECOnMobileDevices/




PayPal Payments Standard Overview
https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/wp_standard_overview/

sandbox상에서의 PayPal 연동 테스트 관련 포스팅
http://serpiko.tistory.com/462

REST API reference 도 존재함.
: https://developer.paypal.com/webapps/developer/docs/api/

인증, 결제 관련 API 제공.


[Amazon Payment]

https://payments.amazon.com/home

Paypal과 유사하게 아마존 계정 및 등록 카드를 통해 결제하는 것으로 보이고
REST like한 API들을 제공하고 함께 PHP, Java, C# library를 제공하고 있음.
특이한건 결과로 오는 정보들이 모드 XML format이다.

사용 시나리오
http://docs.developer.amazonservices.com/en_US/apa_guide/APAGuide_BuyerExperience.html


API reference
: http://docs.developer.amazonservices.com/en_US/off_amazon_payments/index.html?ld=NSGoogle_NEW



[페이게이트 휴대폰 소액결제]

http://www.paygate.net/service/smartphone.php

페이게이트 스마트폰 결제는 보안인증을 모바일 ISP 및 Visa 3D(안심클릭)으로 하니
별도 보안인증을 위한 별도 App이나 Active X가 필요함.

http://www.paygate.net/service/mobile.php
휴대폰 소액 결제는 웹브라우저로 가능함. 다만 서버 side 작업 필요할 듯.



하지만 이건 어떤 방식이지?

알라딘, 액티브X 없는 '진짜 간편결제' 오픈
http://www.bloter.net/archives/206572
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20140917185528

페이게이트 금액인증 솔루션을 사용하여 알라딘에서 ActiveX 없이 도서구매 가능함.


그외...


[INIpay INILite]

http://www.inicis.com/blog/archives/120

신용카드, 휴대폰, 가상계좌, 문화상품권 모두 되나보다.
서버 side에서 결제 모듈을 사용해서 처리하는 것으로 보인다.

INIpay-INILite는 복잡한 TX설치가 필요없는 소규모 쇼핑몰 사업자에 적합한 전자 결제 서비스 입니다
정보가 없어 잘 모르겠음.
http://m.mkexdev.net/36 에 정리가 되어 있음. 30만원 이상 결제 불가


[휴대폰결제]

휴대폰 결제는 모두 server side에서 처리가 되나?

[Paygate 휴대폰 결제]
http://www.paygate.net/service/mobile.php


[다날 휴대폰 결제]
https://www.danalpay.com/service/service_pg_teledit.aspx

서비스 관계도 이미지
역시나 자료가 없음.


[App 설치 결제]

-PayPal app
https://www.paypal.com/us/webapps/mpp/mobile-apps

- Smart Xpay
http://www.uplus.co.kr/biz/ebiz/elpa/RetrieveBzEbEfEmSmart.hpi

- BC카드 ISP 앱
https://www.bccard.com/app/card/ContentsLinkActn.do?pgm_id=ind0463

- INIpay Mobile
http://www.inicis.com/blog/archives/124


[Apple Pay]
http://www.kotrasv.org/board/bbs/board.php?bo_table=i_news&wr_id=501

mobile web 결제와는 상관없지만
주요 카드 업체와 유통업체들과 함께 서비스를 제공 하여
발표만되고 활성화되지 못했던 NFC 기술을 수면으로 끌여 올림.


[mobile 결제 정리]

http://m.mkexdev.net/36

2014년 9월 17일 수요일

windows 7에서 python twisted 설치 및 echo server 실행

인사이트에서 나온 '트위스티드'를 우연찮게 빌리게 되어 봄.
http://www.insightbook.co.kr/books/programming-insight/twisted-network-programming-essentials-2
파이선이 뭔지도 제대로 모르는 상태이고 그냥 샘플만 끌적이는 것임.

[ installation for Windows 7 ]

윈도우에 트위스티드를 설치하기 위해서는 python 2.7.x 버전이 설치 되어 있어야 한다.

Windows


책에서는 python이 설치된 상태에서 위의 것이 모두 설치 되면 된다고 하는데...
Zope.Interface가 python 2.7이 없다면서 설치가 안된다.

“Python version 2.7 required, which was not found in the registry”

위 message는 "Win 7 64bit 에서 초기 파이썬 설치 시
Install just for me를 체크하지 않고 Install for all users를 선택한 사용자에게 생기는 문제"
라고
http://modular.tistory.com/34  에서 찾게 되어 python을 다시 설치 했음. :(

그 외 방법은 registery를 추가하는 방법이 있는 것 같다.
http://stackoverflow.com/questions/3652625/installing-setuptools-on-64-bit-windows

... 그냥 리눅스를 쓰는게 편할 듯...

twisted가 설치 완료되면 python shell에서 아래와 같이 확인 가능

>>> import twisted
>>> twisted.__version__
'14.0.0'



[ echo server/client example ]

제일 간단한 echo protocol 기반 서버. 하지만 echo protocol은 비록 몇줄 일지라도 RFC 문서도 존재함. 
근데 재미 있는 것은 명령 프롬프트에서 실행하면 잘 되는데 IDLE에서 실행하면 client 쪽에서 계속 connection fail이 발생한다..


[ echo server ]

from twisted.internet import protocol, reactor

class Echo(protocol.Protocol):
    def dataReceived(self, data):
        print "data received"
        self.transport.write(data)

class EchoFactory(protocol.Factory):
    def buildProtocol(self, addr):
        return Echo()

reactor.listenTCP(8888, EchoFactory())
reactor.run()


Reactor를 만들어 TCP 880 port에서 listen하고 connection이 생성 될 때 마다 EchoFactory()를 생성하여 처리하도록 하고 있음 (Reactor 개념은 ......  참조)

Reference를 찾아보니 (python은 처음이라 API reference도 좀 생소하다..)


reactor에서는 networking, threading, event dispatching등의 기능을 해야 하고 
실제 여러 platform, OS에서 동작 하여야 하므로 추상화된 API 로 동일 기능을 제공할 수 밖에 없을 것임. 예를 들어 boost.asio도 기본적인 API로 동일 functionality를 보장하고 os 특화된 기능 (overlapped i/o 같은)을 별도의 class로 떼서 제공을 하니..

reactor interfaces
IReactorCore, IReactorTime, IReactorProcess, IReactorTCP, IReactorSSL, IReactorUDP, IReactorMulticast, IReactorUNIX, IReactorUNIXDatagram, IReactorFDSet, IReactorThreads, IReactorPluggableResolver

echo 서버는 TCP 기반이므로 reactor의 TCP interface method를 구현.


MethodlistenTCPConnects a given protocol factory to the given numeric TCP/IP port.
MethodconnectTCPConnect a TCP client.
reactor의 개념 상 TCP 통신을 위해서 제공하는 API는 connection 관련 단 두개..
connection 이후 server, client 간 read/write 는 위 API의 argument로 제공되는 protocol factory 에서 처리가 된다.

def listenTCP(port, factory, backlog=50, interface=''): (source)
Connects a given protocol factory to the given numeric TCP/IP port.
Parametersporta port number on which to listen
factorytwisted.internet.protocol.ServerFactoryinstance
backlogsize of the listen queue
interfaceThe local IPv4 or IPv6 address to which to bind; defaults to '', ie all IPv4 addresses. To bind to all IPv4 and IPv6 addresses, you must call this method twice.

Server factory class는 아래 링크에서 찾아 볼 수 있고
관련된 protocol들도 명시 되어 있다.



Inherited from Factory:
Class MethodforProtocolCreate a factory for the given protocol.
MethodlogPrefixDescribe this factory for log messages.
MethoddoStartMake sure startFactory is called.
MethoddoStopMake sure stopFactory is called.
MethodstartFactoryThis will be called before I begin listening on a Port or Connector.
MethodstopFactoryThis will be called before I stop listening on all Ports/Connectors.
MethodbuildProtocolCreate an instance of a subclass of Protocol.
echo 서버의 동작(단순 read한 data를 write하여 client로 전달)은 단순하므로 buildProtocol method만 사용하여 echo client 처리를 위한 protocol instance를 생성함.


MethodlogPrefixReturn a prefix matching the class name, to identify log messages related to this protocol instance.
MethoddataReceivedCalled whenever data is received.
MethodconnectionLostCalled when the connection is shut down.
Inherited from BaseProtocol:
MethodmakeConnectionMake a connection to a transport and a server.
MethodconnectionMadeCalled when a connection is made.

참고... 예제라 base protocol을 상속하여 구현하지만 twisted내에도 echo protocol을 제공하고 있음


echo server/client의 동작을 위해
reactor->facory에서 생성된 protocol.dataReceived()에서 data를 받아
transport.write(data)를 해주어 client에 전달하면 끝..



[ echo client ]

from twisted.internet import reactor, protocol

class EchoClient(protocol.Protocol):
    def connectionMade(self):
        self.transport.write("Hello, world!")

    def dataReceived(self, data):
        print "Server said:", data
        self.transport.loseConnection()

class EchoFactory(protocol.ClientFactory):
    def buildProtocol(self, addr):
        return EchoClient()

    def clientConnectionFailed(self, connector, reason):
        print "Connection failed.", reason.getErrorMessage()
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "Connection lost."
        reactor.stop()

reactor.connectTCP("localhost", 8888, EchoFactory())
reactor.run()


reactor.connectTCP를 통해 tcp://localhost:8080 로 connect를 하는 것이고 
reactor에서는 해당 connection을 EchoFactory instance를 만들어 처리하도록 한다.

protocol을 처리하고자 buildProtocol()에서는 EchoClient를 생성하여 echo 동작을 수행하되 connection 오류 상황인 connect가 되지 않는 경우(server가 실행되지 않거나 해당 주소로 접근 불가 시)는 clientConnectionFailed()에서 처리하고
수립되었던 connection이 끊어지는 경우(server에서 connection을 close하거나 physical connection이 끊기 거나)에는 clientConnectionLost()에서 처리하도록 되어 있다.

client 이므로 connection이 성공하면
바로 server로 data를 보내고자  transport.wrtie()를 호출 하여 "hello world!" 전송하고
보내진 "hello world!"메세지는 server에서 다시 client로 보내질 테니
EchoClient.dataReceived()에서 다시 돌려받은 "hello world!" 메세지를  출력하고 끝남.

2014년 9월 14일 일요일

[links] DevOps, NoOps

DevOps라는 단어가 많이 눈에 띄길래 찾아봄.
2010년 경에 많이 사용된것 같고 2012년에 DevOps vs NoOps 의 논쟁이 있었던 것으로 보이고 워낙 관련 글들이 많아서 내용은 정리하지 않고 링크만 정리함.

그냥 보면서 처음 들었던 생각은
"나는 mobile side 개발을 하고 릴리즈와는 거리가 있는지라 상관없는 얘기네?"이었지만
곰곰히 생각해보면 개발만 하고 생까는 개발 조직과 결과물을 받아서 운영하는 팀간의 협업 문제점을 해결하고자 나온 문화니 소프트웨어 개발을 하는 입장이라면 누구나 해당되는 얘기이다. 좀 더 나아가 애자일 방법론의 철학과도 일부 연관이 있으니 함께 보고 생각해 두는 것이 좋을 것 같다.

하지만 개념이 제대로 정립되지 않아 운영의 모든 일들이 몰아지거나 프로젝트 자체가 더이상 개발 task가 사라지고 그냥 운영 task만 남을 경우는 어떻게 될지 좀 궁금함.


DevOps와 NoOps에 대하여, 하호진님
http://www.mimul.com/pebble/default/2012/05/01/1335849442107.html

개념부터 논란에 까지 잘 정리한 글이라 한번 읽어보면 깔끔하게 이해된다.
그리고 아래 조대협님의 글은 좀 더 풀어서 상세히 설명한 글이다.

개발과 운영의 조화 - Devops, 조대협님
http://bcho.tistory.com/815
http://bcho.tistory.com/817

DevOps 적용을 위한 10가지 실행방안 정리 (방안만 정리되어 있음)
https://www.software.kr/mbs/swkr/jsp/board/view.jsp?spage=1&boardId=183&boardSeq=3050787&mcategoryId=&id=swkr_040500000000

DevOps cluture
https://www.ibm.com/developerworks/community/blogs/c914709e-8097-4537-92ef-8982fc416138/entry/the_devops_culture?lang=en


What is DevOps
: http://radar.oreilly.com/2012/06/what-is-devops.html
: (번역, 질은 그닥) http://www.hanbit.co.kr/network/view.html?bi_id=1831
제목을 보면 DevOps에 대한 얘기같지만 실제로는 역사를 되돌아보며 NoOps에 반론을 제기하는 글이고 아래 마지막 문구가 다 대답해주는 것 같다.

And what about NoOps? Ultimately, it’s a bad name, but the name doesn’t really matter. A group practicing “NoOps” successfully hasn’t banished operations. It’s just moved operations elsewhere and called it something else.

DevOps팀으로써 1년, Seongsiks 님
: http://devopser.me/belongs-to-devops%20-team/
국내에서 초창기 DevOps 팀으로 1년을 보내신 감회를 적어 놓은 포스팅...