Github 에서 내용에서 민감한 정보 삭제하기

github에 소스코드를 올리면서 중요한 코드를 삭제하지 않고 올렸다는걸 나중에서야 알게되었다. github에서 코드를 지워야하는 상황.

구글에 검색해보니 몇가지 답이 나왔다. 명령어를 입력해서 처리하는 방법과 bfg라는 툴을 이용하는 방법 두가지가 있는데 일단 bfg는 좀 귀찮았고(많은 설명들에서 bfg가 무엇인지 안나와있는데 github에서 bfg를 검색해보면 된다.) 명령어를 입력해서 처리해보기로 결정.

여튼 검색된 문서의 이런저런 방법대로 해봐도 잘 안되서 마지막은 github에서 공식적으로 안내된 문서대로 해보았더니 바로 적용되었다. (https://help.github.com/articles/removing-sensitive-data-from-a-repository)

일단 삭제할 내용이 포함된 파일을 백업한 다음, 입력할 명령어는 다음과 같다.

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 삭제될파일의_전체경로' --prune-empty --tag-name-filter cat -- --all

이것을 입력하고 일단 무언가 텍스트들이 잠시 지나가길 기다린 다음, 마지막으로 push를 하면 된다. 삭제될 파일의 경로는 정확하게 경로 모두와 파일명 전부를 적어줘야한다.

git push origin --force --all

그리고 나면 해당 파일이 삭제되어 있다. 백업했던 파일을 수정한 다음 원래 위치로 다시 복구하고, add, commit, push를 차례대로 해준다.

그러면 복구 완료.

lightsail 로 서버 이전 후기

계속 사용해오던 cloudv의 가상서버에서 aws의 새로운 서비스인 lightsail로 이전했다.

굳이 웹호스팅을 쓰지 않고 가상서버로 구성해서 사용하는 것은 git 저장소도 한몫했는데 일단 혼자서 사용하다보니 뭐하러 이런걸 해야하나…라는 회의감과 그럴거면 차라리 github에서 사람들과 같이 코드를 만들고 올리고 하는게 더 낫겠다는 생각이 들었기 때문이었다. 그래서 차라리 웹데이터들은 더 저렴한 lightsail로 이전하고 git 데이터들은 github.com 으로 이전하기로 했다.

lightsail은 사용해보니 그냥 흔히 알고있는 가상서버다. 우리나라에서는 이미 많이 서비스하고 있는.

그런데 가격이 생각보다 싸다. 내 경우에는 월 5달러의 제일 저렴한 리눅스 서버로 골랐다. 메모리 512MB에 20GB의 디스크다. 디스크야 어차피 git 데이터가 github로 넘어간 이상 많이 필요치 않았지만, 너무 적은 메모리와 알 수 없는 cpu 성능 때문에 고민을 했다. 고민 끝에 최대한 메모리를 적게 쓰도록 아파치를 쓰지 않고 nginx로 쓰기로 했다.

그리고 어차피 방문객이 많지도 않고 방문객이 많으면 인스턴스를 늘리면 끝이니까.

bitnami의 여러 스택이 있었는데 사용하기 편하게 wordpress 스택을 선택하려 했지만 이 경우에는 멀티사이트를 만들기에 불편할 것 같아서 그냥 nginx 스택을 선택하고 직접 설정해서 아내의 홈페이지와 내 블로그 두개를 설치했다. nginx 설정 파일이 익숙치 않아서 약간 헤매었지만 금방 적응했다. bitnami류의 패키지 시스템이 마음에 들지 않았지만 직접 써보니 생각보다 괜찮았다. 멀티앱/멀티사이트간 여러 설정 파일들이 서로 꼬이지 않게 잘 정리되어 있었다. (물론 그런 이유로 인해 뭔가 하나 고치려면 한참 경로를 타고 들어가야 한다는건 불편하다.)

여튼 그렇게 설치하고 아파치에서 nginx로 변경했는데 와우… 속도가 생각보다 괜찮았다. 내가 아파치로 혼자 가상서버를 쓰는 것보다 훨씬 빨랐다.

접속방법에서 약간의 불편함은 있지만 어차피 접속할 일도 별로 없고… 게다가 1TB의 트래픽은 트래픽 걱정할 필요는 아예 없을만큼 정말 여유로웠다.

며칠간 여러 데이터들을 이전해본 후기

  1. 생각보다 속도가 빠름.
    도쿄 리전이고 가상서버에다가 메모리도 겨우 512MB라서 느릴 것으로 예상했지만 기존 서버보다 훨씬 빠른 느낌. 아파치와 엔진엑스의 차이인지도…
  2. 시간대 재설정 필요함.
    설치하게 되면 서버 시간을 한국에 맞춰야한다. ( https://gist.github.com/dongbum/1673616e33fb331ff8e876ee62216988 으로 저장해둔다.)
  3. 설정파일 트리구조를 잘 파악해둘 것.
    엔진엑스에 익숙치 않거니와 구조가 좀 복잡하긴하다.
  4. DNS 응답 속도가 아주 빨라짐.
    BIND나 PowerDNS로 네임서버를 직접 구성해서 썼었는데 그렇게 쓰는것보다 lightsail에서 제공하는 DNS의 응답속도가 훨씬 속도가 빨랐다. 거의 100배 정도.
  5. lightsail의 DNS는 Route 53과 약간 다름.
    lightsail에서도 300만 쿼리까지는 무료로 DNS를 제공해주는데 사용하기는 너무 편하게 되어있지만 기능적인 면에서는 Route 53 보다는 떨어진다.
  6. 512MB의 메모리로도 충분함.
    가장 저렴한 512MB 메모리의 인스턴스로도 블로그와 몇가지 개인서비스를 운영하는데에는 차고 넘치는 느낌이다.
  7. 사용상 몇가지 불편함이 있음.
    bitnami 패키지의 특성인지 보안을 위해 암호 같은게 어렵게 설정되어 있어서 약간 불편함. 암호를 일일히 바꾸고 쓰기보다는 그냥 쓰기로 결정했다.

공구통 물품 선택

지난 제주도 라이딩에서 공구통을 통째로 잃어버렸다.

호텔 지하 계산에 자전거를 묶어둔 후 다음날 잃어버린 것. 자전거에 공구통을 꽂아놓고 왔는데 누가 훔쳐간 것인지 내가 잃어버린 것인지는 나도 모르겠다. 사실 기억이 잘 안난다.

지난번 공구통을 사용하며 느낀 점과, 펑크를 수리해보며 느낀 것을 종합해보면,

  • 토픽 헥서스는 다양한 기능을 할 수 있는 도구이지만 너무 무거웠다.
  • 실제로 쓰는 물건은 튜브와 타이어레버였다.
  • 헥서스에 있는 육각렌치는 렉서스 모양 때문에 좁은 곳에는 들어가질 않아서 쓸일이 잘 없었다. 예를 들면, 물통케이지를 장착하려고 했는데 물통케이지 사이로 넣기에는 부피가 너무 커서 힘들었다. 휴대하고 다니기에는 무게만 무겁고 정작 쓰기에는 불편한 계륵 같은 아이템.
  • 그러니까 차라리 긴 육각렌치 한두개가 낫겠다.
  • 하지만 난 카본 자전거니까 토크렌치로 조여야할 일이 많을꺼다. 정식 토크렌치보다는 토크키 한개 정도면 적당할듯하다.
  • 물티슈보다는 차라리 일회용 장갑을 가지고 다니는게 낫다. 물티슈는 손에 묻은 기름때가 잘 지워지지 않는다.

그래서 다시 구입해야할 물품들을 정리해본다.

공구통 – 토픽, 비엠웍스 등 많은 브랜드가 있음. 사실 거기서 거기인듯하다. 지금 보기에는 비엠웍스 제품이 제일 좋아보인다.

육각렌치 – 파크툴 제품으로 구입 예정. 많은거 필요 없고 길면 될것 같다. 2/3/4/5 정도만 있어도 될듯.

타이어레버 – 어느 제품이나 상관 없을듯하다. 하지만 3개짜리 세트 구입 필요. 파크툴 제품이 제일 괜찮아 보인다.

체인링크 플라이어 – 공구통에 넣고 다닐 물건은 아니지만 집에서 사용할 예정인 도구. 슈퍼비 TB-3323 체인링크 플라이어 구입 예정. 체인링크 분리 외에도 결합시에도 사용 가능하다.

장갑 – 기존에 사두었던 실리콘 재질 장갑을 써도 되고 코스트코에서 파는 장갑을 사다 써도 좋을 것 같다. 물티슈 빼고 장갑이나 하나 넣어야지.

오픈소스 라이센스 검색사이트

라이센스를 검색해보다가 발견한 사이트.

아마 프로그래머들이라면 특정 오픈소스 라이브러리를 가져다가 쓸 일이 많을텐데 이놈의 오픈소스들은 규격화된 라이센스조차도 수십가지인지라 도무지 이게 뭔내용인지 기억할래야 할수가 없다.

Boost 라이브러리를 쓰다가 Boost 라이센스라는게 있길래 이 라이센스는 도대체 내용이 뭐인지 찾다가 발견했다.

부스트 라이센스는 다음과 같았다,

https://olis.or.kr/license/Detailselect.do?lId=1070

각종 오픈소스 라이브러리를 사용할 때마다 한번씩 참고해봐야겠다.

CentOS 7에 plexpy 설치

plex 서버를 잘 사용 중인데 plexpy라는게 있다고 한다. 대강 보니 모니터툴 같은데 일단 리눅스에서 plexpy 를 설치해본다. 인터넷에 있는 몇몇 문서들은 도커를 이용한 설치를 예시로 하고 있는데 내 서버들은 아직 도커를 쓰지 않으므로 그냥 설치하는 것으로.

리눅스는 CentOS 7. plexpy 홈페이지에 들어가 InstallGuide 문서를 읽어본다.

https://github.com/JonnyWong16/plexpy/wiki/Installation

GIT을 이용하여 소스 코드를 다운 받는다.

git clone https://github.com/JonnyWong16/plexpy.git

[root@localhost source]# git clone https://github.com/JonnyWong16/plexpy.git
 Cloning into 'plexpy'...
 remote: Counting objects: 15652, done.
 remote: Total 15652 (delta 0), reused 0 (delta 0), pack-reused 15652
 Receiving objects: 100% (15652/15652), 77.18 MiB | 2.67 MiB/s, done.
 Resolving deltas: 100% (8905/8905), done.
 [root@localhost source]#

설치문서에는 /opt 에 설치하는 것을 예로 들고 있지만 이 경로를 난 좋아하지 않으므로 /usr/local/plexpy 에 설치할 예정.

다운 받은 내용을 /usr/local/plexpy 로 이동한다.

[root@localhost source]# mv plexpy /usr/local/
 [root@localhost source]# cd /usr/local/plexpy
 [root@localhost plexpy]#

plexpy.py를 실행하면 StandAlone 으로 실행하는 것 같지만 난 데몬서비스가 더 좋으므로 관련 문서를 읽어본다.

https://github.com/JonnyWong16/plexpy/wiki/Install-as-a-daemon

리눅스인 경우 다음의 문서를 읽어보라고 한다.

https://github.com/JonnyWong16/plexpy/blob/master/init-scripts/init.systemd

보여지는 스크립트 파일 내용을 vi 를 이용해 plexpy.service 파일로 입력한다.

파일 안에 있는 /opt 로 시작하는 경로들을 나에게 맞도록 /usr/local q로 시작하도록 수정한 다음 저장한다. 실행 유저과 그룹도 plexpy 로 변경.

.service 파일은 보통 /lib/systemd/system 에 저장한다고 하니 그곳으로 옮겨주고 스크립트를 재로딩한 다음, 제대로 읽혀지는지 테스트해본다.

[root@localhost plexpy]# mv plexpy.service /lib/systemd/system
 [root@localhost plexpy]# systemctl daemon-reload
 [root@localhost plexpy]# systemctl status plexpy.service
 ● plexpy.service - PlexPy - Stats for Plex Media Server usage
 Loaded: loaded (/usr/lib/systemd/system/plexpy.service; disabled; vendor preset: disabled)
 Active: inactive (dead)
 [root@localhost plexpy]#

서비스를 시작한다.

[root@localhost plexpy]# systemctl start plexpy.service
 Job for plexpy.service failed because the control process exited with error code. See "systemctl status plexpy.service" and "journalctl -xe" for details.
 [root@localhost plexpy]#

 

에러가 난다. 에러메시지대로 status 명령을 입력해본다.

[root@localhost plexpy]# systemctl status plexpy.service
 ● plexpy.service - PlexPy - Stats for Plex Media Server usage
 Loaded: loaded (/usr/lib/systemd/system/plexpy.service; disabled; vendor preset: disabled)
 Active: failed (Result: exit-code) since 화 2017-09-12 14:24:11 KST; 1min 10s ago
 Process: 23144 ExecStart=/usr/local/plexpy/PlexPy.py --quiet --daemon --nolaunch --config /usr/local/plexpy/config.ini --datadir /usr/local/plexpy (code=exited, status=217/USER)

9월 12 14:24:11 localhost.localdomain systemd[1]: Starting PlexPy - Stats for Plex Media Server usage...
 9월 12 14:24:11 localhost.localdomain systemd[1]: plexpy.service: control process exited, code=exited status=217
 9월 12 14:24:11 localhost.localdomain systemd[1]: Failed to start PlexPy - Stats for Plex Media Server usage.
 9월 12 14:24:11 localhost.localdomain systemd[1]: Unit plexpy.service entered failed state.
 9월 12 14:24:11 localhost.localdomain systemd[1]: plexpy.service failed.
 [root@localhost plexpy]#

 

설치 문서를 읽어보니 환경설정에 대한 내용을 하나도 실행 안한 것이었다.

유저를 추가하고 권한을 준다.

[root@localhost plexpy]# adduser --system --no-create-home plexpy
 [root@localhost plexpy]# chown plexpy:plexpy -R /usr/local/plexpy
 [root@localhost plexpy]#

 

이제 다시 시작해보면 에러가 나지 않는다.

[root@localhost plexpy]# systemctl start plexpy.service
 [root@localhost plexpy]#

 

서비스를 자동실행으로 등록한다.

[root@localhost plexpy]# systemctl enable plexpy.service
 Created symlink from /etc/systemd/system/multi-user.target.wants/plexpy.service to /usr/lib/systemd/system/plexpy.service.
 [root@localhost plexpy]#

 

웹브라우저로 서버의 8181 포트를 열어보면 다음과 같은 화면이 나온다. 이제부터는 웹에서 설정!

그런데 막상 설치해서 보니까 이게 뭐… 딱히 모니터링이라 하기도 애매하고… 어디다 써야할지는 잘 모르겠다. 아파치에 같이 물릴려고 했는데 귀찮아서 그냥 쓰는 것으로.

가민 820

얼마전 8월초쯤 가민 820을 구입했다.

그리고 820을 장착하고 테스트하러 나간 그날… 어이없게 낙차 사고가 났다.

왼쪽 어깨가 분쇄골절 되고 팔꿈치 뼈가 아작 나는 사고로 두번의 수술을 해야했다. 아무래도 가민은 나에게 맞지 않는 것 같아서 어제 판매했다. 도싸에서 매너 좋으신 분께 판매 완료.

가민을 장착해보니 그동안 습관이 들어있지 않아서 그런지 가민을 보려고 고개를 숙일 때마다 너무 위험하다고 느껴졌다. 순간 앞을 못 보니까.

앞으로는 헬스로 근육강화를 좀더하고 사이클 아카데미 같은 곳이라도 좀 다니며 교육 받은 후 다시 타야할듯하다.

KMC 목표달성라이딩 진행 상황

엘파마에서 진행했던 KMC 목표달성라이딩 이벤트에 응모했었다.

3월 1일부터 9월 30일까지 신청한 거리만큼을 달리는 이벤트. 난 1000km를 신청했었다.

스트라바는 기간을 지정해서 거리를 계산해서 볼 수가 없기에 가민커넥트에 3월 1일부터 1년간 1000km 목표를 설정해두었다.

대략 4개월이 지난 이 시점에 기록은…

3월 1일부터 811.2km를 탔다. 대략 190km를 더 달려야 미션에 도달하는 상황. 집에서 반미니까지 한 7번은 왕복해야할듯하다.

아마 잘타는 분들은 벌써 다 완료했을 것 같긴한데, 어찌됐던 경품과 상관 없이 목표했던 1000km는 한번 달성해보려고 한다.

 

#KMC #KMC목표달성라이딩 #KMC체인 #라이딩 #자전거 #자전거체인

blueseventy core shorts 구입

수영장에서 연습용 + 웻슈트 구입 전 테스트&적응용으로 네오프렌 부력수영복을 하나 장만했다.

wiggle에서 blueseventy core shorts 를 구입했다. 국내에서도 판매하긴 하는데 아무래도 위글이 약간 저렴해서 일단 구입했다. dhb aeron 빕숏과 함께 구매했고 3주 가까이 기다려서 온 물건!

포장은 그냥 비닐백 하나에 담겨왔다. ㅎㅎ

열어보니 그야말로 잠수복 재질.

5mm 네오프렌으로 되어있다. 보통 이런 재질이 손톱에 긁히거나 하면 잘 찢어진다고 하여 조심조심 한번 입어보았다. 사이즈를 하나 작은 사이즈로 사서 그런지 입는데 매우 힘들었다. 찢어질까봐 조심조심…

두께는 대략 이정도. 상당히 두껍다.

수영장 가서 입어본 결과는… 상당히 만족.

일단, 재질은 웻슈트와 같지만 일반 수영복 형태여서 실내수영장에서 입기에 전혀 부담이 없다. 부력은 들었던대로 상당하다. 자유형을 해보니 팔만 좀 빨리 저으면 다리는 거의 안 차고도 떠있을 수 있다. 다리를 안 쓰고 앞으로 나아가는데 연습하기에는 최적인듯.

다리를 안 쓰고 팔힘만으로 1500m를 연습해봤는데 연습할 때는 몰랐지만 이전과는 달리 별로 힘든 느낌이 없었다. 웻슈트를 대비한 연습용으로는 아주 만족.

더불어 약간의 보온 기능도 있는듯하다.

사이즈를 작게 사서 뒤에서 보면 엉덩이가 보일까봐 신경이 좀 쓰였는데 실제 수영하는 동안에는 거의 신경 안 써도 될듯하다. 오히려 수영복 안으로 물이 들어오면 수영복의 타이트함으로 인해서 물이 자연스럽게 다리 아래쪽으로 빠져나가는 느낌을 받았다. 사이즈가 작은게 장점이 많은듯.

2017 데상트 듀애슬론

인천 아시아드주경기장에서 열렸던 2017 데상트 듀애슬론에 아내와 같이 참가했다.
30K로 출전했고 결과는 완주. 하지만 기록은 생각만큼 좋지 않다.

사이클링 실력은 그럭저럭. 러닝 실력은 아주 형편 없다. 내년에는 좀더 러닝을 연습해서 55.5K로 도전해보고 싶다.

처음 러닝은 너무 힘들었다. 컨디션도 안 좋고 머리도 아프고… 어떻게 어거지로 끝내고 사이클로 바꾸고 나왔는데 이건 쉬웠다. 사이클 타자마자 전력질주. 많은 사람들을 추월해서 지나갔다. (하지만 결과를 보니 사이클도 그렇게 잘한건 아니었다.) 마지막 러닝은 정말 어거지… 힘들어서 걷다뛰다를 계속 반복. 어찌됐던 완주는 했다.

데상트 듀애슬론에 문제점이 몇가지 있었는데…

첫번째는 반환점 안내가 부실했던 점. 아내도 사이클을 두바퀴 해야하는데 한바퀴만 하고 그냥 들어오는 바람에 중도포기가 되어버렸다. 아내말고도 다른 사람들도 이런 케이스가 많은 것으로 알고 있다. 사이클 반환점에서 깃발을 흔들면서 30킬로 하시는 분들은 한바퀴 더 돌아야한다고 계속 소리치긴 했다. 난 이미 코스 숙지를 하고 있었고 가민으로 거리를 보며 달리고 있었던데다가 그 안내를 들었기 때문에 문제 없이 한번 더 돌았지만 그렇지 않은 사람은 대부분 지나쳐버린 것 같다.

깃발을 흔드는 것도 좋지만 커다란 안내판으로 여기서 한바퀴 더 돌아야 한다고 안내했으면 어땠을까. 다음 대회에는 이런 일이 발생하지 않도록 데상트에서 좀 생각해주기를.

또하나 문제점은 식수 공급이 전혀 되질 않았다. 난 달리기 하면 물통 가지고 나가는게 당연하다고 생각했는데 물통 들고 뛰는 사람은 나 밖에 못봤다. 다들 물통을 안 가지고 다니더라. 보통 대회에서는 중간 보급처에서 물을 준다고 하는데 이건 뭐… 뙤약볕에 물 없이 달리는 사람들이 안 쓰러웠다. 난 오히려 물이 남아돌아서 머리에 물을 뿌리며 달렸다. 바람이 불어오니 아주 시원했다. 마라토너들이 왜 머리에 물을 뿌리는지 바로 이해가 갔다.

내가 달리는데 어떤 분이 물 한모금만 얻어마실 수 있겠냐고 해서 혼쾌히 드렸다. 55를 뛰는 분이던데 무사히 뛰셨기를.

또하나는, 너무 일찍 모이라고 하는 점. 6시까지 오라했는데 실제 대회 시작은 9시가 넘어서였다. 잠도 제대로 자질 못해서 처음 러닝부터 컨디션이 매우 안 좋았다. 이렇게 빨리 오라고 할 필요가 있나 싶다.