반응형
반응형

코인거래소의 API를 연동할 일이 생겨서, 작업을 해서 최종적으로 github에 올리게 되었는데, 이전 직장에서 사용하던 git 사용 습관상 master branch는 건드리지 않고, master branch를 새롭게 clone떠서 다른 branch로 만든 후 push, 그 후 master branch의 내용을 다른 branch와 rebase 하는 작업을 하다보니..


rebase 특성 상, commit 을 일렬로 쭉 나열하기 때문에, 테스트간 API Key를 넣어서 로컬에서 commit했던 이력도 전부 다 github에 올라가게 되버리는 참사가 일어나게 되었다. 


이게 SVN만 사용하다보니, 로컬 commit이 같이 push가 될거라고는 생각을 못했는데, 치명적인 실수였던 것 같다.


당장 Key가 노출되었기 때문에, 거래소 API Key는 바로 삭제처리하고, 조금 더 완벽하게 하기 위해 github에 이미 올라간 API Key가 노출된 commit(HEAD 기준 바로 전 커밋)도 같이 없애 보기로 하였다.


아래와 같이 작업을 계획했고, 그 결과 자연스럽게 내가 노출한 Commit을 Commit을 안한거처럼 보이게 할 수 있었다.


1. remote repo 현재 버전을 로컬에 clone

$ git clone <Remote REPO URL>

2. 로컬에서 git rebase 명령어를 통해 HEAD와 바로 전 Commit을 합침

$ git rebase -i HEAD~2   # HEAD 포함 2개까지의 Commit을 하나의 Commit으로 만들겠다.
# 위 명령어를 치면 editor가 열리며 아래와 같이 해당되는 Commit들이 목록에 보여짐
# 아래부터는 전부 Editor 메시지
pick 111111 HEAD 바로 이전 Commit
pick 222222 HEAD Commit

# HEAD 바로 이전 Commit과 HEAD를 합치기로 했으므로, HEAD 부분의 커밋에 해당하는 라인의 가장 앞에 있는 pick을 squash로 바꿔주고, 저장 후 빠져나온다.
pick 111111 HEAD 바로 이전 Commit
squash 222222 HEAD Commit

# 이제 다시 editor가 뜨며, 새로운 commit 메시지를 입력하라고 나온다. 2개의 Commit을 자연스럽게 합치고, 메시지를 뭘로 할지 결정해서 입력해주고, 저장 후 빠져나온다.
# 주의사항이 있다면, 주석을 제외한 모든 텍스트가 Commit 메시지가 된다.
# This is the 1st commit message:
HEAD 바로 이전 Commit

# This is the commit message #2:
HEAD Commit

3. remote repo에 push (github 정책 상 커밋 이력을 수정하게 되면 다른 사용자가 pull을 받은 경우 conflict이 날 수 있기 때문에, 기본적으로 허용을 안한다고함.. 이런 경우 --force 옵션을 사용하여 강제로 덮어버릴 수 있다.)

$ git push origin master --force



반응형
,
반응형

Dapp이나 블록체인 기술이 요즘 핫하기 때문에, geth 라는 Go언어로 만들어진 이더리움 네트워크에서 사용할 수 있는 기능들을 제공하는 콘솔? 데몬? 프로그램? (애매함..)을 세팅해보았다.


Windows에서 잘될거란 기대는 처음부터 안했고, Background 지원 등 복잡한 부분이 많기 때문에, 처음부터 Linux환경에서 docker container를 통해 띄워보는 것으로 결정하였다.


Dockerfile을 아래와 같이 작성해주었다.

ENTRYPOINT 부분이 조금 긴데.. 옵션값들을 입맛에 맞게 수정해주면 된다. 여기서는 개발용으로 띄울 것이고 (--dev), rpc 프로토콜을 이용할 것이며(--rpc), rpcapi를 통해 이용할 기능 몇가지(--rpcapi=...)를 명시해주었고, rpcapi는 localhost 뿐만이 아닌, 외부에서도 접근이 가능하게 해주었다. (--rpcaddr=0.0.0.0)

ip를 외부로 열었지만 혹시나 모를 crossdomain이슈를 방지하기 위한 옵션과(--rpccorsdomain=*), Data경로도 변경해주었다. (--datadir) 

FROM golang:1.7

# for faster download of container, run all commands at once to create only one docker filesystem layer
RUN \
  go get github.com/ethereum/go-ethereum/cmd/geth && \
  rm -rf /go/pkg /go/src && \
  mkdir /blockchain

VOLUME /blockchain

EXPOSE 30303
EXPOSE 8545

ENTRYPOINT ["/go/bin/geth", "--dev", "--rpc", "--rpcapi=db,eth,net,web3,personal", "--rpcaddr=0.0.0.0", "--rpccorsdomain=*", "--datadir=/blockchain"]


docker-compose.yml는 아래와 같이 작성해주었다.

8545포트는 rpc api를 이용하기 위해 host 머신과 연결해주었다.

version: '2'
services:
  geth:
    build: .
    ports:
      - 8545:8545


docker를 사용해본 사람은 알겠지만, Dockerfile과 docker-compose.yml은 같은 경로에 위치해야 위 파일들이 제 역할을 하게 된다.


그리고, docker-compose up -d 를 통해 geth를 띄워준다.

$ docker-compose up -d


여기까지 rpc 통신 허용은 완료되었고, 이제 ipc 콘솔에 직접 붙어서 테스트를 해야 하는데, docker에 올렸기 때문에 당연하겠지만, 컨테이너 내부의 shell로 진입하여 작업을 해야 한다.

$ docker-compose exec geth sh
# cd /blockchain
# geth attach ipc:./geth.ipc


여기까지 진행하면, ipc 콘솔에서 이더리움 네트워크에서 제공하는 여러가지 기능들을 이용해볼 수 있게 된다.

반응형
,
반응형

Docker image나 pull을 private registry에서 이용하는 경우, private registry에서 https 프로토콜을 지원하지 않거나 사설인증서를 사용하는 경우 아래와 같은 에러가 발생할 수 있다.

root@u-01:~# docker pull abc.iptime.org:5000/helloWorld
Using default tag: latest
Error response from daemon: Get https://abc.iptime.org:5000/v1/_ping: http: server gave HTTP response to HTTPS client


기본적으로 registry와의 통신은 https 프로토콜을 이용하기 때문인데, 이를 무시하고 http프로토콜을 사용하게 하려면, /etc/default/docker 파일에서 DOCKER_OPTS 항목을 아래와 같이 수정하면 된다.

# /etc/default/docker
...
DOCKER_OPTS="--insecure-registry abc.iptime.org:5000"
...


수정 후 docker 서비스를 재시작해준다.

service docker restart


반응형
,
반응형
adb shell am start -n {패키지명}/{메인 액티비티명}


사용하던 매크로에서 기능 패치가 안되서 찾아봤는데 이 쪽도 재미있어보인다.

반응형
,
반응형

윈도우 환경에서 Batch를 짜서 작업 스케줄러에 등록하면, 기본적으로 명령프롬프트 윈도우가 하나 뜨기 때문에, 실제 사용하고 있는 컴퓨터에서 돌아가고 있다면 거슬릴 것이고, 서버라고 하더라도 보기가 안좋다.


이런 경우에는 VB Script를 이용해서 Batch 스크립트를 실행하면 깔끔하다.


아래와 같이 작성하고, 파일명.vbs 로 저장해서 실행하면 됨.

Set WinScriptHost = CreateObject( "WScript.shell" )
WinScriptHost.Run Chr(34) & "C:\실행할배치파일.bat" & Chr(34), 0
Set WinScriptHost = Nothing



반응형
,
반응형

사내에서 플랫폼 로그 발송 시 nxlog를 사용하게 되었는데, 매번 클릭질로 설치하기가 귀찮아서, Batch Script + Powershell을 이용하여 자동화해보았다.


nxlog 자체적으로 /quite, /passive 등의 옵션을 제공하고 있어서, 사용자가 다음버튼을 연타하지 않아도 default설정으로 잘 설치가 된다.


자동으로 설치가 된다고해도 nxlog 설정 파일에 파싱할 로그 경로정도는 수정을 해줘야하지만, 사실 서버 여러대에 설치가 되는 경우  같은 설정을 사용하기 때문에, 설정 파일 하나만 가져다가, default nxlog 설정 파일을 덮어버리는 식으로 구현하였다.

@ECHO off

powershell.exe -Command "msiexec /i nxlog-ce-x.x.xxxx.msi /passive"
powershell.exe -Command "Copy-Item -Force nxlog_test.conf -Destination 'C:\Program Files (x86)\nxlog\conf\nxlog.conf'"

sc start nxlog


반응형
,
반응형

AWS에서 EC2를 이용하는 경우, 기본적으로 SSH접근은 private pem file을 이용하여 접근을 하는데, Ansible에서는 pem file을 어떻게 등록할까를 알아보다가 적당한 옵션을 찾게 되어 포스팅한다.

[ec2:vars]
ansible_ssh_private_key_file=/etc/ansible/aws-test.pem
ansible_user=ubuntu

[ec2]
41.123.123.123
51.213.123.123


이제 password 기반 및 pem key 기반에서도 ansible을 이용할 수 있게 되었다!

반응형
,
반응형

Ansible은 기본적으로 ssh를 기반으로 하고 있고, 별다른 옵션을 지정해주지 않으면 root 계정을 활용해서 통신을 한다.


하지만, 보통 root 계정으로 직접 접근하는 경우는 드물고, 공용 계정을 하나 만들어 sudo 로 전환해서 사용을 하는데, 이런 경우 Ansible에 inventory를 등록 시 아래와 같이 ansible_user라는 옵션을 주어야 한다.

[nodes]
192.168.0.1 ansible_user=hakurei
192.168.0.2 ansible_user=hakurei
192.168.0.3 ansible_user=hakurei


근데 만약 host가 100대가 넘어가는 경우, 매 라인마다 저걸 넣어줄 수는 없으므로, 아래와 같이 :vars라는 옵션을 이용하여 공통화가 가능하다.

[nodes:vars]
ansible_user=hakurei

[nodes]
192.168.0.1
192.168.0.2
192.168.0.3


반응형
,
반응형

사내에 Zabbix를 구축해서 사용하고 있지만, 이게 active 방식인지 passive방식인지 파악을 안하고 있었고, 설정 파일 및 템플릿을 최초에 구성한 사람이 이미 존재하지 않기에(...) 방화벽을 양방향으로 열어서 사용을 하고 있었다.


최근에 방화벽 정책을 누군가 정리하면서, agent가 server에 데이터를 전송하는 방식인지, server가 agent에 데이터를 달라고하는 방식인지 확인해보게 되었다.


당연하겠지만, 공식홈의 document에 가장 정확하게 설명되어 있다.

(https://www.zabbix.com/documentation/2.2/manual/appendix/items/activepassive) 


  • Active 방식
    • 사전조건으로 agent 설정 파일에서 serverActive의 ip를 지정해주어야 그 ip를 참조해서 데이터를 전송할 수 있다.
    • Agent -> Server로 데이터를 전송하는 방식 (TCP 10051 포트를 이용)
    • Item 구성 시 Zabbix Agent (active)를 선택하면 Active 방식으로 사용 가능

  • Passive 방식 (Default)
    • 별다른 설정 없이 기본 동작 방식임.
    • Server -> Agent로 데이터를 수집하는 방식 (TCP 10050 포트를 이용)
    • Item 구성 시 Zabbix Agent 를 선택하여 구성


Item 구성에 대한 참고 스크린샷 (Type)



정리해보자면, Zabbix에 구성된 Item을 우선적으로 확인하고, Agent의 설정 파일을 점검해보아야, 해당 서버가 Active방식인지 Passive방식인지 알 수 있으며, ACL 등 방화벽 정책 처리를 할 때도 어떤 방식으로 동작하느냐에 따라 달라질 수 있다.

반응형
,
반응형

Plane에다가 스크립트를 추가하여, 하위로 여러개의 객체를 추가하는 스크립트를 구현하여 사용중이었고, 해당 객체들을 Button으로 제어하려다보니, Canvas를 별도로 하나 두게 되었다.


추가한 Canvas에서 스크립트를 추가하여, 각 Button을 제어하는 리스너를 등록해서 사용하던 중 문제가 하나 생겼다.


Plane 스크립트에서 추가한 객체들을 FindGameObjectsWithTag 함수를 이용해 배열형태로 들고와서, Canvas 스크립트의 Start() 구문에서 사용하려고 하니, 배열 개수가 계속 0이 찍히는 이슈였다.


아무래도 Plane 스크립트의 Start 함수에서 객체를 로딩하는 데 걸리는 시간이, Canvas 스크립트의 Start 함수를 실행하는 시간보다 오래걸리는 것으로 보였다.


해결 방법이 없나 찾아보던 중, Awake라는 함수를 Unity 매뉴얼에서 찾게 되었다. (https://docs.unity3d.com/Manual/ExecutionOrder.html)


첫번째 Scene에서는 Start대신 Awake 함수를 사용하라는 거였고, 이건 Scene이 아닌 단순히 Object 지만, Start 함수를 Awake로 바꾸어 주었더니, 해결이 됨.


Awake 함수를 사용하는 스크립트에서 최대한 많은 리소스를 로드한 후, 그 이후 스크립트에서 가져다 쓰는 방식으로해야 할 것 같다.

반응형

'개발 > Unity' 카테고리의 다른 글

[Unity5] Random unique index from array  (0) 2017.10.24
[Unity 5] Resources.LoadAll를 이용한 Sprite 가져오기  (0) 2017.10.23
[Unity 5] Resources Path  (0) 2017.10.23
,
반응형